/ Hex Artifact Content
Login

Artifact 785fa789319d93c6ae20efbd01d4da9ce8f8a793:


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 73 74 61 74   object..*/.stat
4960: 69 63 20 76 6f 69 64 20 53 51 4c 49 54 45 5f 4e  ic void SQLITE_N
4970: 4f 49 4e 4c 49 4e 45 20 64 65 6c 65 74 65 54 61  OINLINE deleteTa
4980: 62 6c 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  ble(sqlite3 *db,
4990: 20 54 61 62 6c 65 20 2a 70 54 61 62 6c 65 29 7b   Table *pTable){
49a0: 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78  .  Index *pIndex
49b0: 2c 20 2a 70 4e 65 78 74 3b 0a 20 20 54 45 53 54  , *pNext;.  TEST
49c0: 4f 4e 4c 59 28 20 69 6e 74 20 6e 4c 6f 6f 6b 61  ONLY( int nLooka
49d0: 73 69 64 65 3b 20 29 20 2f 2a 20 55 73 65 64 20  side; ) /* Used 
49e0: 74 6f 20 76 65 72 69 66 79 20 6c 6f 6f 6b 61 73  to verify lookas
49f0: 69 64 65 20 6e 6f 74 20 75 73 65 64 20 66 6f 72  ide not used for
4a00: 20 73 63 68 65 6d 61 20 2a 2f 0a 0a 20 20 2f 2a   schema */..  /*
4a10: 20 52 65 63 6f 72 64 20 74 68 65 20 6e 75 6d 62   Record the numb
4a20: 65 72 20 6f 66 20 6f 75 74 73 74 61 6e 64 69 6e  er of outstandin
4a30: 67 20 6c 6f 6f 6b 61 73 69 64 65 20 61 6c 6c 6f  g lookaside allo
4a40: 63 61 74 69 6f 6e 73 20 69 6e 20 73 63 68 65 6d  cations in schem
4a50: 61 20 54 61 62 6c 65 73 0a 20 20 2a 2a 20 70 72  a Tables.  ** pr
4a60: 69 6f 72 20 74 6f 20 64 6f 69 6e 67 20 61 6e 79  ior to doing any
4a70: 20 66 72 65 65 28 29 20 6f 70 65 72 61 74 69 6f   free() operatio
4a80: 6e 73 2e 20 20 53 69 6e 63 65 20 73 63 68 65 6d  ns.  Since schem
4a90: 61 20 54 61 62 6c 65 73 20 64 6f 20 6e 6f 74 20  a Tables do not 
4aa0: 75 73 65 0a 20 20 2a 2a 20 6c 6f 6f 6b 61 73 69  use.  ** lookasi
4ab0: 64 65 2c 20 74 68 69 73 20 6e 75 6d 62 65 72 20  de, this number 
4ac0: 73 68 6f 75 6c 64 20 6e 6f 74 20 63 68 61 6e 67  should not chang
4ad0: 65 2e 20 2a 2f 0a 20 20 54 45 53 54 4f 4e 4c 59  e. */.  TESTONLY
4ae0: 28 20 6e 4c 6f 6f 6b 61 73 69 64 65 20 3d 20 28  ( nLookaside = (
4af0: 64 62 20 26 26 20 28 70 54 61 62 6c 65 2d 3e 74  db && (pTable->t
4b00: 61 62 46 6c 61 67 73 20 26 20 54 46 5f 45 70 68  abFlags & TF_Eph
4b10: 65 6d 65 72 61 6c 29 3d 3d 30 29 20 3f 0a 20 20  emeral)==0) ?.  
4b20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4b30: 20 20 20 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61         db->looka
4b40: 73 69 64 65 2e 6e 4f 75 74 20 3a 20 30 20 29 3b  side.nOut : 0 );
4b50: 0a 0a 20 20 2f 2a 20 44 65 6c 65 74 65 20 61 6c  ..  /* Delete al
4b60: 6c 20 69 6e 64 69 63 65 73 20 61 73 73 6f 63 69  l indices associ
4b70: 61 74 65 64 20 77 69 74 68 20 74 68 69 73 20 74  ated with this t
4b80: 61 62 6c 65 2e 20 2a 2f 0a 20 20 66 6f 72 28 70  able. */.  for(p
4b90: 49 6e 64 65 78 20 3d 20 70 54 61 62 6c 65 2d 3e  Index = pTable->
4ba0: 70 49 6e 64 65 78 3b 20 70 49 6e 64 65 78 3b 20  pIndex; pIndex; 
4bb0: 70 49 6e 64 65 78 3d 70 4e 65 78 74 29 7b 0a 20  pIndex=pNext){. 
4bc0: 20 20 20 70 4e 65 78 74 20 3d 20 70 49 6e 64 65     pNext = pInde
4bd0: 78 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 61 73  x->pNext;.    as
4be0: 73 65 72 74 28 20 70 49 6e 64 65 78 2d 3e 70 53  sert( pIndex->pS
4bf0: 63 68 65 6d 61 3d 3d 70 54 61 62 6c 65 2d 3e 70  chema==pTable->p
4c00: 53 63 68 65 6d 61 20 29 3b 0a 20 20 20 20 69 66  Schema );.    if
4c10: 28 20 21 64 62 20 7c 7c 20 64 62 2d 3e 70 6e 42  ( !db || db->pnB
4c20: 79 74 65 73 46 72 65 65 64 3d 3d 30 20 29 7b 0a  ytesFreed==0 ){.
4c30: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d        char *zNam
4c40: 65 20 3d 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d  e = pIndex->zNam
4c50: 65 3b 20 0a 20 20 20 20 20 20 54 45 53 54 4f 4e  e; .      TESTON
4c60: 4c 59 20 28 20 49 6e 64 65 78 20 2a 70 4f 6c 64  LY ( Index *pOld
4c70: 20 3d 20 29 20 73 71 6c 69 74 65 33 48 61 73 68   = ) sqlite3Hash
4c80: 49 6e 73 65 72 74 28 0a 20 20 20 20 20 20 20 20  Insert(.        
4c90: 20 26 70 49 6e 64 65 78 2d 3e 70 53 63 68 65 6d   &pIndex->pSchem
4ca0: 61 2d 3e 69 64 78 48 61 73 68 2c 20 7a 4e 61 6d  a->idxHash, zNam
4cb0: 65 2c 20 30 0a 20 20 20 20 20 20 29 3b 0a 20 20  e, 0.      );.  
4cc0: 20 20 20 20 61 73 73 65 72 74 28 20 64 62 3d 3d      assert( db==
4cd0: 30 20 7c 7c 20 73 71 6c 69 74 65 33 53 63 68 65  0 || sqlite3Sche
4ce0: 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20  maMutexHeld(db, 
4cf0: 30 2c 20 70 49 6e 64 65 78 2d 3e 70 53 63 68 65  0, pIndex->pSche
4d00: 6d 61 29 20 29 3b 0a 20 20 20 20 20 20 61 73 73  ma) );.      ass
4d10: 65 72 74 28 20 70 4f 6c 64 3d 3d 70 49 6e 64 65  ert( pOld==pInde
4d20: 78 20 7c 7c 20 70 4f 6c 64 3d 3d 30 20 29 3b 0a  x || pOld==0 );.
4d30: 20 20 20 20 7d 0a 20 20 20 20 66 72 65 65 49 6e      }.    freeIn
4d40: 64 65 78 28 64 62 2c 20 70 49 6e 64 65 78 29 3b  dex(db, pIndex);
4d50: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 65 6c 65 74  .  }..  /* Delet
4d60: 65 20 61 6e 79 20 66 6f 72 65 69 67 6e 20 6b 65  e any foreign ke
4d70: 79 73 20 61 74 74 61 63 68 65 64 20 74 6f 20 74  ys attached to t
4d80: 68 69 73 20 74 61 62 6c 65 2e 20 2a 2f 0a 20 20  his table. */.  
4d90: 73 71 6c 69 74 65 33 46 6b 44 65 6c 65 74 65 28  sqlite3FkDelete(
4da0: 64 62 2c 20 70 54 61 62 6c 65 29 3b 0a 0a 20 20  db, pTable);..  
4db0: 2f 2a 20 44 65 6c 65 74 65 20 74 68 65 20 54 61  /* Delete the Ta
4dc0: 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 69 74  ble structure it
4dd0: 73 65 6c 66 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c  self..  */.  sql
4de0: 69 74 65 33 44 65 6c 65 74 65 43 6f 6c 75 6d 6e  ite3DeleteColumn
4df0: 4e 61 6d 65 73 28 64 62 2c 20 70 54 61 62 6c 65  Names(db, pTable
4e00: 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  );.  sqlite3DbFr
4e10: 65 65 28 64 62 2c 20 70 54 61 62 6c 65 2d 3e 7a  ee(db, pTable->z
4e20: 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65 33  Name);.  sqlite3
4e30: 44 62 46 72 65 65 28 64 62 2c 20 70 54 61 62 6c  DbFree(db, pTabl
4e40: 65 2d 3e 7a 43 6f 6c 41 66 66 29 3b 0a 20 20 73  e->zColAff);.  s
4e50: 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65  qlite3SelectDele
4e60: 74 65 28 64 62 2c 20 70 54 61 62 6c 65 2d 3e 70  te(db, pTable->p
4e70: 53 65 6c 65 63 74 29 3b 0a 20 20 73 71 6c 69 74  Select);.  sqlit
4e80: 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65  e3ExprListDelete
4e90: 28 64 62 2c 20 70 54 61 62 6c 65 2d 3e 70 43 68  (db, pTable->pCh
4ea0: 65 63 6b 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  eck);.#ifndef SQ
4eb0: 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
4ec0: 4c 54 41 42 4c 45 0a 20 20 73 71 6c 69 74 65 33  LTABLE.  sqlite3
4ed0: 56 74 61 62 43 6c 65 61 72 28 64 62 2c 20 70 54  VtabClear(db, pT
4ee0: 61 62 6c 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20  able);.#endif.  
4ef0: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
4f00: 2c 20 70 54 61 62 6c 65 29 3b 0a 0a 20 20 2f 2a  , pTable);..  /*
4f10: 20 56 65 72 69 66 79 20 74 68 61 74 20 6e 6f 20   Verify that no 
4f20: 6c 6f 6f 6b 61 73 69 64 65 20 6d 65 6d 6f 72 79  lookaside memory
4f30: 20 77 61 73 20 75 73 65 64 20 62 79 20 73 63 68   was used by sch
4f40: 65 6d 61 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20  ema tables */.  
4f50: 61 73 73 65 72 74 28 20 6e 4c 6f 6f 6b 61 73 69  assert( nLookasi
4f60: 64 65 3d 3d 30 20 7c 7c 20 6e 4c 6f 6f 6b 61 73  de==0 || nLookas
4f70: 69 64 65 3d 3d 64 62 2d 3e 6c 6f 6f 6b 61 73 69  ide==db->lookasi
4f80: 64 65 2e 6e 4f 75 74 20 29 3b 0a 7d 0a 76 6f 69  de.nOut );.}.voi
4f90: 64 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54  d sqlite3DeleteT
4fa0: 61 62 6c 65 28 73 71 6c 69 74 65 33 20 2a 64 62  able(sqlite3 *db
4fb0: 2c 20 54 61 62 6c 65 20 2a 70 54 61 62 6c 65 29  , Table *pTable)
4fc0: 7b 0a 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 64 65  {.  /* Do not de
4fd0: 6c 65 74 65 20 74 68 65 20 74 61 62 6c 65 20 75  lete the table u
4fe0: 6e 74 69 6c 20 74 68 65 20 72 65 66 65 72 65 6e  ntil the referen
4ff0: 63 65 20 63 6f 75 6e 74 20 72 65 61 63 68 65 73  ce count reaches
5000: 20 7a 65 72 6f 2e 20 2a 2f 0a 20 20 69 66 28 20   zero. */.  if( 
5010: 21 70 54 61 62 6c 65 20 29 20 72 65 74 75 72 6e  !pTable ) return
5020: 3b 0a 20 20 69 66 28 20 28 28 21 64 62 20 7c 7c  ;.  if( ((!db ||
5030: 20 64 62 2d 3e 70 6e 42 79 74 65 73 46 72 65 65   db->pnBytesFree
5040: 64 3d 3d 30 29 20 26 26 20 28 2d 2d 70 54 61 62  d==0) && (--pTab
5050: 6c 65 2d 3e 6e 52 65 66 29 3e 30 29 20 29 20 72  le->nRef)>0) ) r
5060: 65 74 75 72 6e 3b 0a 20 20 64 65 6c 65 74 65 54  eturn;.  deleteT
5070: 61 62 6c 65 28 64 62 2c 20 70 54 61 62 6c 65 29  able(db, pTable)
5080: 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 69  ;.}.../*.** Unli
5090: 6e 6b 20 74 68 65 20 67 69 76 65 6e 20 74 61 62  nk the given tab
50a0: 6c 65 20 66 72 6f 6d 20 74 68 65 20 68 61 73 68  le from the hash
50b0: 20 74 61 62 6c 65 73 20 61 6e 64 20 74 68 65 20   tables and the 
50c0: 64 65 6c 65 74 65 20 74 68 65 0a 2a 2a 20 74 61  delete the.** ta
50d0: 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 77 69  ble structure wi
50e0: 74 68 20 61 6c 6c 20 69 74 73 20 69 6e 64 69 63  th all its indic
50f0: 65 73 20 61 6e 64 20 66 6f 72 65 69 67 6e 20 6b  es and foreign k
5100: 65 79 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  eys..*/.void sql
5110: 69 74 65 33 55 6e 6c 69 6e 6b 41 6e 64 44 65 6c  ite3UnlinkAndDel
5120: 65 74 65 54 61 62 6c 65 28 73 71 6c 69 74 65 33  eteTable(sqlite3
5130: 20 2a 64 62 2c 20 69 6e 74 20 69 44 62 2c 20 63   *db, int iDb, c
5140: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62 4e  onst char *zTabN
5150: 61 6d 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70  ame){.  Table *p
5160: 3b 0a 20 20 44 62 20 2a 70 44 62 3b 0a 0a 20 20  ;.  Db *pDb;..  
5170: 61 73 73 65 72 74 28 20 64 62 21 3d 30 20 29 3b  assert( db!=0 );
5180: 0a 20 20 61 73 73 65 72 74 28 20 69 44 62 3e 3d  .  assert( iDb>=
5190: 30 20 26 26 20 69 44 62 3c 64 62 2d 3e 6e 44 62  0 && iDb<db->nDb
51a0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 7a 54   );.  assert( zT
51b0: 61 62 4e 61 6d 65 20 29 3b 0a 20 20 61 73 73 65  abName );.  asse
51c0: 72 74 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d  rt( sqlite3Schem
51d0: 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20 69  aMutexHeld(db, i
51e0: 44 62 2c 20 30 29 20 29 3b 0a 20 20 74 65 73 74  Db, 0) );.  test
51f0: 63 61 73 65 28 20 7a 54 61 62 4e 61 6d 65 5b 30  case( zTabName[0
5200: 5d 3d 3d 30 20 29 3b 20 20 2f 2a 20 5a 65 72 6f  ]==0 );  /* Zero
5210: 2d 6c 65 6e 67 74 68 20 74 61 62 6c 65 20 6e 61  -length table na
5220: 6d 65 73 20 61 72 65 20 61 6c 6c 6f 77 65 64 20  mes are allowed 
5230: 2a 2f 0a 20 20 70 44 62 20 3d 20 26 64 62 2d 3e  */.  pDb = &db->
5240: 61 44 62 5b 69 44 62 5d 3b 0a 20 20 70 20 3d 20  aDb[iDb];.  p = 
5250: 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72  sqlite3HashInser
5260: 74 28 26 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d  t(&pDb->pSchema-
5270: 3e 74 62 6c 48 61 73 68 2c 20 7a 54 61 62 4e 61  >tblHash, zTabNa
5280: 6d 65 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65  me, 0);.  sqlite
5290: 33 44 65 6c 65 74 65 54 61 62 6c 65 28 64 62 2c  3DeleteTable(db,
52a0: 20 70 29 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73   p);.  db->flags
52b0: 20 7c 3d 20 53 51 4c 49 54 45 5f 49 6e 74 65 72   |= SQLITE_Inter
52c0: 6e 43 68 61 6e 67 65 73 3b 0a 7d 0a 0a 2f 2a 0a  nChanges;.}../*.
52d0: 2a 2a 20 47 69 76 65 6e 20 61 20 74 6f 6b 65 6e  ** Given a token
52e0: 2c 20 72 65 74 75 72 6e 20 61 20 73 74 72 69 6e  , return a strin
52f0: 67 20 74 68 61 74 20 63 6f 6e 73 69 73 74 73 20  g that consists 
5300: 6f 66 20 74 68 65 20 74 65 78 74 20 6f 66 20 74  of the text of t
5310: 68 61 74 0a 2a 2a 20 74 6f 6b 65 6e 2e 20 20 53  hat.** token.  S
5320: 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65  pace to hold the
5330: 20 72 65 74 75 72 6e 65 64 20 73 74 72 69 6e 67   returned string
5340: 0a 2a 2a 20 69 73 20 6f 62 74 61 69 6e 65 64 20  .** is obtained 
5350: 66 72 6f 6d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f  from sqliteMallo
5360: 63 28 29 20 61 6e 64 20 6d 75 73 74 20 62 65 20  c() and must be 
5370: 66 72 65 65 64 20 62 79 20 74 68 65 20 63 61 6c  freed by the cal
5380: 6c 69 6e 67 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  ling.** function
5390: 2e 0a 2a 2a 0a 2a 2a 20 41 6e 79 20 71 75 6f 74  ..**.** Any quot
53a0: 61 74 69 6f 6e 20 6d 61 72 6b 73 20 28 65 78 3a  ation marks (ex:
53b0: 20 20 22 6e 61 6d 65 22 2c 20 27 6e 61 6d 65 27    "name", 'name'
53c0: 2c 20 5b 6e 61 6d 65 5d 2c 20 6f 72 20 60 6e 61  , [name], or `na
53d0: 6d 65 60 29 20 74 68 61 74 0a 2a 2a 20 73 75 72  me`) that.** sur
53e0: 72 6f 75 6e 64 20 74 68 65 20 62 6f 64 79 20 6f  round the body o
53f0: 66 20 74 68 65 20 74 6f 6b 65 6e 20 61 72 65 20  f the token are 
5400: 72 65 6d 6f 76 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  removed..**.** T
5410: 6f 6b 65 6e 73 20 61 72 65 20 6f 66 74 65 6e 20  okens are often 
5420: 6a 75 73 74 20 70 6f 69 6e 74 65 72 73 20 69 6e  just pointers in
5430: 74 6f 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  to the original 
5440: 53 51 4c 20 74 65 78 74 20 61 6e 64 20 73 6f 0a  SQL text and so.
5450: 2a 2a 20 61 72 65 20 6e 6f 74 20 5c 30 30 30 20  ** are not \000 
5460: 74 65 72 6d 69 6e 61 74 65 64 20 61 6e 64 20 61  terminated and a
5470: 72 65 20 6e 6f 74 20 70 65 72 73 69 73 74 65 6e  re not persisten
5480: 74 2e 20 20 54 68 65 20 72 65 74 75 72 6e 65 64  t.  The returned
5490: 20 73 74 72 69 6e 67 0a 2a 2a 20 69 73 20 5c 30   string.** is \0
54a0: 30 30 20 74 65 72 6d 69 6e 61 74 65 64 20 61 6e  00 terminated an
54b0: 64 20 69 73 20 70 65 72 73 69 73 74 65 6e 74 2e  d is persistent.
54c0: 0a 2a 2f 0a 63 68 61 72 20 2a 73 71 6c 69 74 65  .*/.char *sqlite
54d0: 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 73  3NameFromToken(s
54e0: 71 6c 69 74 65 33 20 2a 64 62 2c 20 54 6f 6b 65  qlite3 *db, Toke
54f0: 6e 20 2a 70 4e 61 6d 65 29 7b 0a 20 20 63 68 61  n *pName){.  cha
5500: 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 69 66 28 20  r *zName;.  if( 
5510: 70 4e 61 6d 65 20 29 7b 0a 20 20 20 20 7a 4e 61  pName ){.    zNa
5520: 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  me = sqlite3DbSt
5530: 72 4e 44 75 70 28 64 62 2c 20 28 63 68 61 72 2a  rNDup(db, (char*
5540: 29 70 4e 61 6d 65 2d 3e 7a 2c 20 70 4e 61 6d 65  )pName->z, pName
5550: 2d 3e 6e 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ->n);.    sqlite
5560: 33 44 65 71 75 6f 74 65 28 7a 4e 61 6d 65 29 3b  3Dequote(zName);
5570: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 4e  .  }else{.    zN
5580: 61 6d 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72  ame = 0;.  }.  r
5590: 65 74 75 72 6e 20 7a 4e 61 6d 65 3b 0a 7d 0a 0a  eturn zName;.}..
55a0: 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 74 68 65 20 73  /*.** Open the s
55b0: 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62  qlite_master tab
55c0: 6c 65 20 73 74 6f 72 65 64 20 69 6e 20 64 61 74  le stored in dat
55d0: 61 62 61 73 65 20 6e 75 6d 62 65 72 20 69 44 62  abase number iDb
55e0: 20 66 6f 72 0a 2a 2a 20 77 72 69 74 69 6e 67 2e   for.** writing.
55f0: 20 54 68 65 20 74 61 62 6c 65 20 69 73 20 6f 70   The table is op
5600: 65 6e 65 64 20 75 73 69 6e 67 20 63 75 72 73 6f  ened using curso
5610: 72 20 30 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  r 0..*/.void sql
5620: 69 74 65 33 4f 70 65 6e 4d 61 73 74 65 72 54 61  ite3OpenMasterTa
5630: 62 6c 65 28 50 61 72 73 65 20 2a 70 2c 20 69 6e  ble(Parse *p, in
5640: 74 20 69 44 62 29 7b 0a 20 20 56 64 62 65 20 2a  t iDb){.  Vdbe *
5650: 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
5660: 62 65 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33  be(p);.  sqlite3
5670: 54 61 62 6c 65 4c 6f 63 6b 28 70 2c 20 69 44 62  TableLock(p, iDb
5680: 2c 20 4d 41 53 54 45 52 5f 52 4f 4f 54 2c 20 31  , MASTER_ROOT, 1
5690: 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69  , SCHEMA_TABLE(i
56a0: 44 62 29 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  Db));.  sqlite3V
56b0: 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20  dbeAddOp4Int(v, 
56c0: 4f 50 5f 4f 70 65 6e 57 72 69 74 65 2c 20 30 2c  OP_OpenWrite, 0,
56d0: 20 4d 41 53 54 45 52 5f 52 4f 4f 54 2c 20 69 44   MASTER_ROOT, iD
56e0: 62 2c 20 35 29 3b 0a 20 20 69 66 28 20 70 2d 3e  b, 5);.  if( p->
56f0: 6e 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 70  nTab==0 ){.    p
5700: 2d 3e 6e 54 61 62 20 3d 20 31 3b 0a 20 20 7d 0a  ->nTab = 1;.  }.
5710: 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 61 6d 65 74  }../*.** Paramet
5720: 65 72 20 7a 4e 61 6d 65 20 70 6f 69 6e 74 73 20  er zName points 
5730: 74 6f 20 61 20 6e 75 6c 2d 74 65 72 6d 69 6e 61  to a nul-termina
5740: 74 65 64 20 62 75 66 66 65 72 20 63 6f 6e 74 61  ted buffer conta
5750: 69 6e 69 6e 67 20 74 68 65 20 6e 61 6d 65 0a 2a  ining the name.*
5760: 2a 20 6f 66 20 61 20 64 61 74 61 62 61 73 65 20  * of a database 
5770: 28 22 6d 61 69 6e 22 2c 20 22 74 65 6d 70 22 20  ("main", "temp" 
5780: 6f 72 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61  or the name of a
5790: 6e 20 61 74 74 61 63 68 65 64 20 64 62 29 2e 20  n attached db). 
57a0: 54 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  This.** function
57b0: 20 72 65 74 75 72 6e 73 20 74 68 65 20 69 6e 64   returns the ind
57c0: 65 78 20 6f 66 20 74 68 65 20 6e 61 6d 65 64 20  ex of the named 
57d0: 64 61 74 61 62 61 73 65 20 69 6e 20 64 62 2d 3e  database in db->
57e0: 61 44 62 5b 5d 2c 20 6f 72 0a 2a 2a 20 2d 31 20  aDb[], or.** -1 
57f0: 69 66 20 74 68 65 20 6e 61 6d 65 64 20 64 62 20  if the named db 
5800: 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64 2e  cannot be found.
5810: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46  .*/.int sqlite3F
5820: 69 6e 64 44 62 4e 61 6d 65 28 73 71 6c 69 74 65  indDbName(sqlite
5830: 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68 61  3 *db, const cha
5840: 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69 6e 74  r *zName){.  int
5850: 20 69 20 3d 20 2d 31 3b 20 20 20 20 20 20 20 20   i = -1;        
5860: 20 2f 2a 20 44 61 74 61 62 61 73 65 20 6e 75 6d   /* Database num
5870: 62 65 72 20 2a 2f 0a 20 20 69 66 28 20 7a 4e 61  ber */.  if( zNa
5880: 6d 65 20 29 7b 0a 20 20 20 20 44 62 20 2a 70 44  me ){.    Db *pD
5890: 62 3b 0a 20 20 20 20 66 6f 72 28 69 3d 28 64 62  b;.    for(i=(db
58a0: 2d 3e 6e 44 62 2d 31 29 2c 20 70 44 62 3d 26 64  ->nDb-1), pDb=&d
58b0: 62 2d 3e 61 44 62 5b 69 5d 3b 20 69 3e 3d 30 3b  b->aDb[i]; i>=0;
58c0: 20 69 2d 2d 2c 20 70 44 62 2d 2d 29 7b 0a 20 20   i--, pDb--){.  
58d0: 20 20 20 20 69 66 28 20 30 3d 3d 73 71 6c 69 74      if( 0==sqlit
58e0: 65 33 53 74 72 49 43 6d 70 28 70 44 62 2d 3e 7a  e3StrICmp(pDb->z
58f0: 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29 20 29 20 62  Name, zName) ) b
5900: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
5910: 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d 0a 0a 2f    return i;.}../
5920: 2a 0a 2a 2a 20 54 68 65 20 74 6f 6b 65 6e 20 2a  *.** The token *
5930: 70 4e 61 6d 65 20 63 6f 6e 74 61 69 6e 73 20 74  pName contains t
5940: 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 64 61 74  he name of a dat
5950: 61 62 61 73 65 20 28 65 69 74 68 65 72 20 22 6d  abase (either "m
5960: 61 69 6e 22 20 6f 72 0a 2a 2a 20 22 74 65 6d 70  ain" or.** "temp
5970: 22 20 6f 72 20 74 68 65 20 6e 61 6d 65 20 6f 66  " or the name of
5980: 20 61 6e 20 61 74 74 61 63 68 65 64 20 64 62 29   an attached db)
5990: 2e 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72  . This routine r
59a0: 65 74 75 72 6e 73 20 74 68 65 0a 2a 2a 20 69 6e  eturns the.** in
59b0: 64 65 78 20 6f 66 20 74 68 65 20 6e 61 6d 65 64  dex of the named
59c0: 20 64 61 74 61 62 61 73 65 20 69 6e 20 64 62 2d   database in db-
59d0: 3e 61 44 62 5b 5d 2c 20 6f 72 20 2d 31 20 69 66  >aDb[], or -1 if
59e0: 20 74 68 65 20 6e 61 6d 65 64 20 64 62 20 0a 2a   the named db .*
59f0: 2a 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74  * does not exist
5a00: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
5a10: 46 69 6e 64 44 62 28 73 71 6c 69 74 65 33 20 2a  FindDb(sqlite3 *
5a20: 64 62 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65  db, Token *pName
5a30: 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20  ){.  int i;     
5a40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5a50: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74            /* Dat
5a60: 61 62 61 73 65 20 6e 75 6d 62 65 72 20 2a 2f 0a  abase number */.
5a70: 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 20 20    char *zName;  
5a80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5a90: 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 77         /* Name w
5aa0: 65 20 61 72 65 20 73 65 61 72 63 68 69 6e 67 20  e are searching 
5ab0: 66 6f 72 20 2a 2f 0a 20 20 7a 4e 61 6d 65 20 3d  for */.  zName =
5ac0: 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d   sqlite3NameFrom
5ad0: 54 6f 6b 65 6e 28 64 62 2c 20 70 4e 61 6d 65 29  Token(db, pName)
5ae0: 3b 0a 20 20 69 20 3d 20 73 71 6c 69 74 65 33 46  ;.  i = sqlite3F
5af0: 69 6e 64 44 62 4e 61 6d 65 28 64 62 2c 20 7a 4e  indDbName(db, zN
5b00: 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  ame);.  sqlite3D
5b10: 62 46 72 65 65 28 64 62 2c 20 7a 4e 61 6d 65 29  bFree(db, zName)
5b20: 3b 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d 0a  ;.  return i;.}.
5b30: 0a 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 6f 72  ./* The table or
5b40: 20 76 69 65 77 20 6f 72 20 74 72 69 67 67 65 72   view or trigger
5b50: 20 6e 61 6d 65 20 69 73 20 70 61 73 73 65 64 20   name is passed 
5b60: 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  to this routine 
5b70: 76 69 61 20 74 6f 6b 65 6e 73 0a 2a 2a 20 70 4e  via tokens.** pN
5b80: 61 6d 65 31 20 61 6e 64 20 70 4e 61 6d 65 32 2e  ame1 and pName2.
5b90: 20 49 66 20 74 68 65 20 74 61 62 6c 65 20 6e 61   If the table na
5ba0: 6d 65 20 77 61 73 20 66 75 6c 6c 79 20 71 75 61  me was fully qua
5bb0: 6c 69 66 69 65 64 2c 20 66 6f 72 20 65 78 61 6d  lified, for exam
5bc0: 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 43 52 45 41 54  ple:.**.** CREAT
5bd0: 45 20 54 41 42 4c 45 20 78 78 78 2e 79 79 79 20  E TABLE xxx.yyy 
5be0: 28 2e 2e 2e 29 3b 0a 2a 2a 20 0a 2a 2a 20 54 68  (...);.** .** Th
5bf0: 65 6e 20 70 4e 61 6d 65 31 20 69 73 20 73 65 74  en pName1 is set
5c00: 20 74 6f 20 22 78 78 78 22 20 61 6e 64 20 70 4e   to "xxx" and pN
5c10: 61 6d 65 32 20 22 79 79 79 22 2e 20 4f 6e 20 74  ame2 "yyy". On t
5c20: 68 65 20 6f 74 68 65 72 20 68 61 6e 64 20 69 66  he other hand if
5c30: 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 6e 61  .** the table na
5c40: 6d 65 20 69 73 20 6e 6f 74 20 66 75 6c 6c 79 20  me is not fully 
5c50: 71 75 61 6c 69 66 69 65 64 2c 20 69 2e 65 2e 3a  qualified, i.e.:
5c60: 0a 2a 2a 0a 2a 2a 20 43 52 45 41 54 45 20 54 41  .**.** CREATE TA
5c70: 42 4c 45 20 79 79 79 28 2e 2e 2e 29 3b 0a 2a 2a  BLE yyy(...);.**
5c80: 0a 2a 2a 20 54 68 65 6e 20 70 4e 61 6d 65 31 20  .** Then pName1 
5c90: 69 73 20 73 65 74 20 74 6f 20 22 79 79 79 22 20  is set to "yyy" 
5ca0: 61 6e 64 20 70 4e 61 6d 65 32 20 69 73 20 22 22  and pName2 is ""
5cb0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
5cc0: 74 69 6e 65 20 73 65 74 73 20 74 68 65 20 2a 70  tine sets the *p
5cd0: 70 55 6e 71 75 61 6c 20 70 6f 69 6e 74 65 72 20  pUnqual pointer 
5ce0: 74 6f 20 70 6f 69 6e 74 20 61 74 20 74 68 65 20  to point at the 
5cf0: 74 6f 6b 65 6e 20 28 70 4e 61 6d 65 31 20 6f 72  token (pName1 or
5d00: 0a 2a 2a 20 70 4e 61 6d 65 32 29 20 74 68 61 74  .** pName2) that
5d10: 20 73 74 6f 72 65 73 20 74 68 65 20 75 6e 71 75   stores the unqu
5d20: 61 6c 69 66 69 65 64 20 74 61 62 6c 65 20 6e 61  alified table na
5d30: 6d 65 2e 20 20 54 68 65 20 69 6e 64 65 78 20 6f  me.  The index o
5d40: 66 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73  f the.** databas
5d50: 65 20 22 78 78 78 22 20 69 73 20 72 65 74 75 72  e "xxx" is retur
5d60: 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ned..*/.int sqli
5d70: 74 65 33 54 77 6f 50 61 72 74 4e 61 6d 65 28 0a  te3TwoPartName(.
5d80: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
5d90: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
5da0: 20 61 6e 64 20 63 6f 64 65 20 67 65 6e 65 72 61   and code genera
5db0: 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  ting context */.
5dc0: 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c    Token *pName1,
5dd0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 22 78 78        /* The "xx
5de0: 78 22 20 69 6e 20 74 68 65 20 6e 61 6d 65 20 22  x" in the name "
5df0: 78 78 78 2e 79 79 79 22 20 6f 72 20 22 78 78 78  xxx.yyy" or "xxx
5e00: 22 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e  " */.  Token *pN
5e10: 61 6d 65 32 2c 20 20 20 20 20 20 2f 2a 20 54 68  ame2,      /* Th
5e20: 65 20 22 79 79 79 22 20 69 6e 20 74 68 65 20 6e  e "yyy" in the n
5e30: 61 6d 65 20 22 78 78 78 2e 79 79 79 22 20 2a 2f  ame "xxx.yyy" */
5e40: 0a 20 20 54 6f 6b 65 6e 20 2a 2a 70 55 6e 71 75  .  Token **pUnqu
5e50: 61 6c 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20  al     /* Write 
5e60: 74 68 65 20 75 6e 71 75 61 6c 69 66 69 65 64 20  the unqualified 
5e70: 6f 62 6a 65 63 74 20 6e 61 6d 65 20 68 65 72 65  object name here
5e80: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 44 62   */.){.  int iDb
5e90: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
5ea0: 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
5eb0: 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 6f 62 6a   holding the obj
5ec0: 65 63 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ect */.  sqlite3
5ed0: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
5ee0: 62 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4e  b;..  assert( pN
5ef0: 61 6d 65 32 21 3d 30 20 29 3b 0a 20 20 69 66 28  ame2!=0 );.  if(
5f00: 20 70 4e 61 6d 65 32 2d 3e 6e 3e 30 20 29 7b 0a   pName2->n>0 ){.
5f10: 20 20 20 20 69 66 28 20 64 62 2d 3e 69 6e 69 74      if( db->init
5f20: 2e 62 75 73 79 20 29 20 7b 0a 20 20 20 20 20 20  .busy ) {.      
5f30: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
5f40: 70 50 61 72 73 65 2c 20 22 63 6f 72 72 75 70 74  pParse, "corrupt
5f50: 20 64 61 74 61 62 61 73 65 22 29 3b 0a 20 20 20   database");.   
5f60: 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20     return -1;.  
5f70: 20 20 7d 0a 20 20 20 20 2a 70 55 6e 71 75 61 6c    }.    *pUnqual
5f80: 20 3d 20 70 4e 61 6d 65 32 3b 0a 20 20 20 20 69   = pName2;.    i
5f90: 44 62 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64  Db = sqlite3Find
5fa0: 44 62 28 64 62 2c 20 70 4e 61 6d 65 31 29 3b 0a  Db(db, pName1);.
5fb0: 20 20 20 20 69 66 28 20 69 44 62 3c 30 20 29 7b      if( iDb<0 ){
5fc0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
5fd0: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
5fe0: 75 6e 6b 6e 6f 77 6e 20 64 61 74 61 62 61 73 65  unknown database
5ff0: 20 25 54 22 2c 20 70 4e 61 6d 65 31 29 3b 0a 20   %T", pName1);. 
6000: 20 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a       return -1;.
6010: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
6020: 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 69     assert( db->i
6030: 6e 69 74 2e 69 44 62 3d 3d 30 20 7c 7c 20 64 62  nit.iDb==0 || db
6040: 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 3b 0a 20  ->init.busy );. 
6050: 20 20 20 69 44 62 20 3d 20 64 62 2d 3e 69 6e 69     iDb = db->ini
6060: 74 2e 69 44 62 3b 0a 20 20 20 20 2a 70 55 6e 71  t.iDb;.    *pUnq
6070: 75 61 6c 20 3d 20 70 4e 61 6d 65 31 3b 0a 20 20  ual = pName1;.  
6080: 7d 0a 20 20 72 65 74 75 72 6e 20 69 44 62 3b 0a  }.  return iDb;.
6090: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
60a0: 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 74 6f  utine is used to
60b0: 20 63 68 65 63 6b 20 69 66 20 74 68 65 20 55 54   check if the UT
60c0: 46 2d 38 20 73 74 72 69 6e 67 20 7a 4e 61 6d 65  F-8 string zName
60d0: 20 69 73 20 61 20 6c 65 67 61 6c 0a 2a 2a 20 75   is a legal.** u
60e0: 6e 71 75 61 6c 69 66 69 65 64 20 6e 61 6d 65 20  nqualified name 
60f0: 66 6f 72 20 61 20 6e 65 77 20 73 63 68 65 6d 61  for a new schema
6100: 20 6f 62 6a 65 63 74 20 28 74 61 62 6c 65 2c 20   object (table, 
6110: 69 6e 64 65 78 2c 20 76 69 65 77 20 6f 72 0a 2a  index, view or.*
6120: 2a 20 74 72 69 67 67 65 72 29 2e 20 41 6c 6c 20  * trigger). All 
6130: 6e 61 6d 65 73 20 61 72 65 20 6c 65 67 61 6c 20  names are legal 
6140: 65 78 63 65 70 74 20 74 68 6f 73 65 20 74 68 61  except those tha
6150: 74 20 62 65 67 69 6e 20 77 69 74 68 20 74 68 65  t begin with the
6160: 20 73 74 72 69 6e 67 0a 2a 2a 20 22 73 71 6c 69   string.** "sqli
6170: 74 65 5f 22 20 28 69 6e 20 75 70 70 65 72 2c 20  te_" (in upper, 
6180: 6c 6f 77 65 72 20 6f 72 20 6d 69 78 65 64 20 63  lower or mixed c
6190: 61 73 65 29 2e 20 54 68 69 73 20 70 6f 72 74 69  ase). This porti
61a0: 6f 6e 20 6f 66 20 74 68 65 20 6e 61 6d 65 73 70  on of the namesp
61b0: 61 63 65 0a 2a 2a 20 69 73 20 72 65 73 65 72 76  ace.** is reserv
61c0: 65 64 20 66 6f 72 20 69 6e 74 65 72 6e 61 6c 20  ed for internal 
61d0: 75 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  use..*/.int sqli
61e0: 74 65 33 43 68 65 63 6b 4f 62 6a 65 63 74 4e 61  te3CheckObjectNa
61f0: 6d 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  me(Parse *pParse
6200: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e  , const char *zN
6210: 61 6d 65 29 7b 0a 20 20 69 66 28 20 21 70 50 61  ame){.  if( !pPa
6220: 72 73 65 2d 3e 64 62 2d 3e 69 6e 69 74 2e 62 75  rse->db->init.bu
6230: 73 79 20 26 26 20 70 50 61 72 73 65 2d 3e 6e 65  sy && pParse->ne
6240: 73 74 65 64 3d 3d 30 20 0a 20 20 20 20 20 20 20  sted==0 .       
6250: 20 20 20 26 26 20 28 70 50 61 72 73 65 2d 3e 64     && (pParse->d
6260: 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54  b->flags & SQLIT
6270: 45 5f 57 72 69 74 65 53 63 68 65 6d 61 29 3d 3d  E_WriteSchema)==
6280: 30 0a 20 20 20 20 20 20 20 20 20 20 26 26 20 30  0.          && 0
6290: 3d 3d 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d  ==sqlite3StrNICm
62a0: 70 28 7a 4e 61 6d 65 2c 20 22 73 71 6c 69 74 65  p(zName, "sqlite
62b0: 5f 22 2c 20 37 29 20 29 7b 0a 20 20 20 20 73 71  _", 7) ){.    sq
62c0: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
62d0: 61 72 73 65 2c 20 22 6f 62 6a 65 63 74 20 6e 61  arse, "object na
62e0: 6d 65 20 72 65 73 65 72 76 65 64 20 66 6f 72 20  me reserved for 
62f0: 69 6e 74 65 72 6e 61 6c 20 75 73 65 3a 20 25 73  internal use: %s
6300: 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72  ", zName);.    r
6310: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
6320: 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  OR;.  }.  return
6330: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
6340: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
6350: 50 52 49 4d 41 52 59 20 4b 45 59 20 69 6e 64 65  PRIMARY KEY inde
6360: 78 20 6f 66 20 61 20 74 61 62 6c 65 0a 2a 2f 0a  x of a table.*/.
6370: 49 6e 64 65 78 20 2a 73 71 6c 69 74 65 33 50 72  Index *sqlite3Pr
6380: 69 6d 61 72 79 4b 65 79 49 6e 64 65 78 28 54 61  imaryKeyIndex(Ta
6390: 62 6c 65 20 2a 70 54 61 62 29 7b 0a 20 20 49 6e  ble *pTab){.  In
63a0: 64 65 78 20 2a 70 3b 0a 20 20 66 6f 72 28 70 3d  dex *p;.  for(p=
63b0: 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 20  pTab->pIndex; p 
63c0: 26 26 20 21 49 73 50 72 69 6d 61 72 79 4b 65 79  && !IsPrimaryKey
63d0: 49 6e 64 65 78 28 70 29 3b 20 70 3d 70 2d 3e 70  Index(p); p=p->p
63e0: 4e 65 78 74 29 7b 7d 0a 20 20 72 65 74 75 72 6e  Next){}.  return
63f0: 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74   p;.}../*.** Ret
6400: 75 72 6e 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6f  urn the column o
6410: 66 20 69 6e 64 65 78 20 70 49 64 78 20 74 68 61  f index pIdx tha
6420: 74 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f  t corresponds to
6430: 20 74 61 62 6c 65 0a 2a 2a 20 63 6f 6c 75 6d 6e   table.** column
6440: 20 69 43 6f 6c 2e 20 20 52 65 74 75 72 6e 20 2d   iCol.  Return -
6450: 31 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a  1 if not found..
6460: 2a 2f 0a 69 31 36 20 73 71 6c 69 74 65 33 43 6f  */.i16 sqlite3Co
6470: 6c 75 6d 6e 4f 66 49 6e 64 65 78 28 49 6e 64 65  lumnOfIndex(Inde
6480: 78 20 2a 70 49 64 78 2c 20 69 31 36 20 69 43 6f  x *pIdx, i16 iCo
6490: 6c 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66  l){.  int i;.  f
64a0: 6f 72 28 69 3d 30 3b 20 69 3c 70 49 64 78 2d 3e  or(i=0; i<pIdx->
64b0: 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20  nColumn; i++){. 
64c0: 20 20 20 69 66 28 20 69 43 6f 6c 3d 3d 70 49 64     if( iCol==pId
64d0: 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 20 29  x->aiColumn[i] )
64e0: 20 72 65 74 75 72 6e 20 69 3b 0a 20 20 7d 0a 20   return i;.  }. 
64f0: 20 72 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 2f   return -1;.}../
6500: 2a 0a 2a 2a 20 42 65 67 69 6e 20 63 6f 6e 73 74  *.** Begin const
6510: 72 75 63 74 69 6e 67 20 61 20 6e 65 77 20 74 61  ructing a new ta
6520: 62 6c 65 20 72 65 70 72 65 73 65 6e 74 61 74 69  ble representati
6530: 6f 6e 20 69 6e 20 6d 65 6d 6f 72 79 2e 20 20 54  on in memory.  T
6540: 68 69 73 20 69 73 0a 2a 2a 20 74 68 65 20 66 69  his is.** the fi
6550: 72 73 74 20 6f 66 20 73 65 76 65 72 61 6c 20 61  rst of several a
6560: 63 74 69 6f 6e 20 72 6f 75 74 69 6e 65 73 20 74  ction routines t
6570: 68 61 74 20 67 65 74 20 63 61 6c 6c 65 64 20 69  hat get called i
6580: 6e 20 72 65 73 70 6f 6e 73 65 0a 2a 2a 20 74 6f  n response.** to
6590: 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20   a CREATE TABLE 
65a0: 73 74 61 74 65 6d 65 6e 74 2e 20 20 49 6e 20 70  statement.  In p
65b0: 61 72 74 69 63 75 6c 61 72 2c 20 74 68 69 73 20  articular, this 
65c0: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
65d0: 64 0a 2a 2a 20 61 66 74 65 72 20 73 65 65 69 6e  d.** after seein
65e0: 67 20 74 6f 6b 65 6e 73 20 22 43 52 45 41 54 45  g tokens "CREATE
65f0: 22 20 61 6e 64 20 22 54 41 42 4c 45 22 20 61 6e  " and "TABLE" an
6600: 64 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65  d the table name
6610: 2e 20 54 68 65 20 69 73 54 65 6d 70 0a 2a 2a 20  . The isTemp.** 
6620: 66 6c 61 67 20 69 73 20 74 72 75 65 20 69 66 20  flag is true if 
6630: 74 68 65 20 74 61 62 6c 65 20 73 68 6f 75 6c 64  the table should
6640: 20 62 65 20 73 74 6f 72 65 64 20 69 6e 20 74 68   be stored in th
6650: 65 20 61 75 78 69 6c 69 61 72 79 20 64 61 74 61  e auxiliary data
6660: 62 61 73 65 0a 2a 2a 20 66 69 6c 65 20 69 6e 73  base.** file ins
6670: 74 65 61 64 20 6f 66 20 69 6e 20 74 68 65 20 6d  tead of in the m
6680: 61 69 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c  ain database fil
6690: 65 2e 20 20 54 68 69 73 20 69 73 20 6e 6f 72 6d  e.  This is norm
66a0: 61 6c 6c 79 20 74 68 65 20 63 61 73 65 0a 2a 2a  ally the case.**
66b0: 20 77 68 65 6e 20 74 68 65 20 22 54 45 4d 50 22   when the "TEMP"
66c0: 20 6f 72 20 22 54 45 4d 50 4f 52 41 52 59 22 20   or "TEMPORARY" 
66d0: 6b 65 79 77 6f 72 64 20 6f 63 63 75 72 73 20 69  keyword occurs i
66e0: 6e 20 62 65 74 77 65 65 6e 0a 2a 2a 20 43 52 45  n between.** CRE
66f0: 41 54 45 20 61 6e 64 20 54 41 42 4c 45 2e 0a 2a  ATE and TABLE..*
6700: 2a 0a 2a 2a 20 54 68 65 20 6e 65 77 20 74 61 62  *.** The new tab
6710: 6c 65 20 72 65 63 6f 72 64 20 69 73 20 69 6e 69  le record is ini
6720: 74 69 61 6c 69 7a 65 64 20 61 6e 64 20 70 75 74  tialized and put
6730: 20 69 6e 20 70 50 61 72 73 65 2d 3e 70 4e 65 77   in pParse->pNew
6740: 54 61 62 6c 65 2e 0a 2a 2a 20 41 73 20 6d 6f 72  Table..** As mor
6750: 65 20 6f 66 20 74 68 65 20 43 52 45 41 54 45 20  e of the CREATE 
6760: 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 20  TABLE statement 
6770: 69 73 20 70 61 72 73 65 64 2c 20 61 64 64 69 74  is parsed, addit
6780: 69 6f 6e 61 6c 20 61 63 74 69 6f 6e 0a 2a 2a 20  ional action.** 
6790: 72 6f 75 74 69 6e 65 73 20 77 69 6c 6c 20 62 65  routines will be
67a0: 20 63 61 6c 6c 65 64 20 74 6f 20 61 64 64 20 6d   called to add m
67b0: 6f 72 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ore information 
67c0: 74 6f 20 74 68 69 73 20 72 65 63 6f 72 64 2e 0a  to this record..
67d0: 2a 2a 20 41 74 20 74 68 65 20 65 6e 64 20 6f 66  ** At the end of
67e0: 20 74 68 65 20 43 52 45 41 54 45 20 54 41 42 4c   the CREATE TABL
67f0: 45 20 73 74 61 74 65 6d 65 6e 74 2c 20 74 68 65  E statement, the
6800: 20 73 71 6c 69 74 65 33 45 6e 64 54 61 62 6c 65   sqlite3EndTable
6810: 28 29 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 73  () routine.** is
6820: 20 63 61 6c 6c 65 64 20 74 6f 20 63 6f 6d 70 6c   called to compl
6830: 65 74 65 20 74 68 65 20 63 6f 6e 73 74 72 75 63  ete the construc
6840: 74 69 6f 6e 20 6f 66 20 74 68 65 20 6e 65 77 20  tion of the new 
6850: 74 61 62 6c 65 20 72 65 63 6f 72 64 2e 0a 2a 2f  table record..*/
6860: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53 74 61  .void sqlite3Sta
6870: 72 74 54 61 62 6c 65 28 0a 20 20 50 61 72 73 65  rtTable(.  Parse
6880: 20 2a 70 50 61 72 73 65 2c 20 20 20 2f 2a 20 50   *pParse,   /* P
6890: 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f  arser context */
68a0: 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31  .  Token *pName1
68b0: 2c 20 20 20 2f 2a 20 46 69 72 73 74 20 70 61 72  ,   /* First par
68c0: 74 20 6f 66 20 74 68 65 20 6e 61 6d 65 20 6f 66  t of the name of
68d0: 20 74 68 65 20 74 61 62 6c 65 20 6f 72 20 76 69   the table or vi
68e0: 65 77 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  ew */.  Token *p
68f0: 4e 61 6d 65 32 2c 20 20 20 2f 2a 20 53 65 63 6f  Name2,   /* Seco
6900: 6e 64 20 70 61 72 74 20 6f 66 20 74 68 65 20 6e  nd part of the n
6910: 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65  ame of the table
6920: 20 6f 72 20 76 69 65 77 20 2a 2f 0a 20 20 69 6e   or view */.  in
6930: 74 20 69 73 54 65 6d 70 2c 20 20 20 20 20 20 2f  t isTemp,      /
6940: 2a 20 54 72 75 65 20 69 66 20 74 68 69 73 20 69  * True if this i
6950: 73 20 61 20 54 45 4d 50 20 74 61 62 6c 65 20 2a  s a TEMP table *
6960: 2f 0a 20 20 69 6e 74 20 69 73 56 69 65 77 2c 20  /.  int isView, 
6970: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
6980: 74 68 69 73 20 69 73 20 61 20 56 49 45 57 20 2a  this is a VIEW *
6990: 2f 0a 20 20 69 6e 74 20 69 73 56 69 72 74 75 61  /.  int isVirtua
69a0: 6c 2c 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20  l,   /* True if 
69b0: 74 68 69 73 20 69 73 20 61 20 56 49 52 54 55 41  this is a VIRTUA
69c0: 4c 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74  L table */.  int
69d0: 20 6e 6f 45 72 72 20 20 20 20 20 20 20 20 2f 2a   noErr        /*
69e0: 20 44 6f 20 6e 6f 74 68 69 6e 67 20 69 66 20 74   Do nothing if t
69f0: 61 62 6c 65 20 61 6c 72 65 61 64 79 20 65 78 69  able already exi
6a00: 73 74 73 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c  sts */.){.  Tabl
6a10: 65 20 2a 70 54 61 62 6c 65 3b 0a 20 20 63 68 61  e *pTable;.  cha
6a20: 72 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b 20 2f 2a  r *zName = 0; /*
6a30: 20 54 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   The name of the
6a40: 20 6e 65 77 20 74 61 62 6c 65 20 2a 2f 0a 20 20   new table */.  
6a50: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
6a60: 61 72 73 65 2d 3e 64 62 3b 0a 20 20 56 64 62 65  arse->db;.  Vdbe
6a70: 20 2a 76 3b 0a 20 20 69 6e 74 20 69 44 62 3b 20   *v;.  int iDb; 
6a80: 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
6a90: 61 73 65 20 6e 75 6d 62 65 72 20 74 6f 20 63 72  ase number to cr
6aa0: 65 61 74 65 20 74 68 65 20 74 61 62 6c 65 20 69  eate the table i
6ab0: 6e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e  n */.  Token *pN
6ac0: 61 6d 65 3b 20 20 20 20 2f 2a 20 55 6e 71 75 61  ame;    /* Unqua
6ad0: 6c 69 66 69 65 64 20 6e 61 6d 65 20 6f 66 20 74  lified name of t
6ae0: 68 65 20 74 61 62 6c 65 20 74 6f 20 63 72 65 61  he table to crea
6af0: 74 65 20 2a 2f 0a 0a 20 20 69 66 28 20 64 62 2d  te */..  if( db-
6b00: 3e 69 6e 69 74 2e 62 75 73 79 20 26 26 20 64 62  >init.busy && db
6b10: 2d 3e 69 6e 69 74 2e 6e 65 77 54 6e 75 6d 3d 3d  ->init.newTnum==
6b20: 31 20 29 7b 0a 20 20 20 20 2f 2a 20 53 70 65 63  1 ){.    /* Spec
6b30: 69 61 6c 20 63 61 73 65 3a 20 20 50 61 72 73 69  ial case:  Parsi
6b40: 6e 67 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61  ng the sqlite_ma
6b50: 73 74 65 72 20 6f 72 20 73 71 6c 69 74 65 5f 74  ster or sqlite_t
6b60: 65 6d 70 5f 6d 61 73 74 65 72 20 73 63 68 65 6d  emp_master schem
6b70: 61 20 2a 2f 0a 20 20 20 20 69 44 62 20 3d 20 64  a */.    iDb = d
6b80: 62 2d 3e 69 6e 69 74 2e 69 44 62 3b 0a 20 20 20  b->init.iDb;.   
6b90: 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33   zName = sqlite3
6ba0: 44 62 53 74 72 44 75 70 28 64 62 2c 20 53 43 48  DbStrDup(db, SCH
6bb0: 45 4d 41 5f 54 41 42 4c 45 28 69 44 62 29 29 3b  EMA_TABLE(iDb));
6bc0: 0a 20 20 20 20 70 4e 61 6d 65 20 3d 20 70 4e 61  .    pName = pNa
6bd0: 6d 65 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  me1;.  }else{.  
6be0: 20 20 2f 2a 20 54 68 65 20 63 6f 6d 6d 6f 6e 20    /* The common 
6bf0: 63 61 73 65 20 2a 2f 0a 20 20 20 20 69 44 62 20  case */.    iDb 
6c00: 3d 20 73 71 6c 69 74 65 33 54 77 6f 50 61 72 74  = sqlite3TwoPart
6c10: 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 70 4e 61  Name(pParse, pNa
6c20: 6d 65 31 2c 20 70 4e 61 6d 65 32 2c 20 26 70 4e  me1, pName2, &pN
6c30: 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 69 44  ame);.    if( iD
6c40: 62 3c 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  b<0 ) return;.  
6c50: 20 20 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50    if( !OMIT_TEMP
6c60: 44 42 20 26 26 20 69 73 54 65 6d 70 20 26 26 20  DB && isTemp && 
6c70: 70 4e 61 6d 65 32 2d 3e 6e 3e 30 20 26 26 20 69  pName2->n>0 && i
6c80: 44 62 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 2f  Db!=1 ){.      /
6c90: 2a 20 49 66 20 63 72 65 61 74 69 6e 67 20 61 20  * If creating a 
6ca0: 74 65 6d 70 20 74 61 62 6c 65 2c 20 74 68 65 20  temp table, the 
6cb0: 6e 61 6d 65 20 6d 61 79 20 6e 6f 74 20 62 65 20  name may not be 
6cc0: 71 75 61 6c 69 66 69 65 64 2e 20 55 6e 6c 65 73  qualified. Unles
6cd0: 73 20 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  s .      ** the 
6ce0: 64 61 74 61 62 61 73 65 20 6e 61 6d 65 20 69 73  database name is
6cf0: 20 22 74 65 6d 70 22 20 61 6e 79 77 61 79 2e 20   "temp" anyway. 
6d00: 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
6d10: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
6d20: 2c 20 22 74 65 6d 70 6f 72 61 72 79 20 74 61 62  , "temporary tab
6d30: 6c 65 20 6e 61 6d 65 20 6d 75 73 74 20 62 65 20  le name must be 
6d40: 75 6e 71 75 61 6c 69 66 69 65 64 22 29 3b 0a 20  unqualified");. 
6d50: 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20       return;.   
6d60: 20 7d 0a 20 20 20 20 69 66 28 20 21 4f 4d 49 54   }.    if( !OMIT
6d70: 5f 54 45 4d 50 44 42 20 26 26 20 69 73 54 65 6d  _TEMPDB && isTem
6d80: 70 20 29 20 69 44 62 20 3d 20 31 3b 0a 20 20 20  p ) iDb = 1;.   
6d90: 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33   zName = sqlite3
6da0: 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62  NameFromToken(db
6db0: 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20  , pName);.  }.  
6dc0: 70 50 61 72 73 65 2d 3e 73 4e 61 6d 65 54 6f 6b  pParse->sNameTok
6dd0: 65 6e 20 3d 20 2a 70 4e 61 6d 65 3b 0a 20 20 69  en = *pName;.  i
6de0: 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 20 72 65  f( zName==0 ) re
6df0: 74 75 72 6e 3b 0a 20 20 69 66 28 20 53 51 4c 49  turn;.  if( SQLI
6e00: 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 43 68  TE_OK!=sqlite3Ch
6e10: 65 63 6b 4f 62 6a 65 63 74 4e 61 6d 65 28 70 50  eckObjectName(pP
6e20: 61 72 73 65 2c 20 7a 4e 61 6d 65 29 20 29 7b 0a  arse, zName) ){.
6e30: 20 20 20 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74      goto begin_t
6e40: 61 62 6c 65 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a  able_error;.  }.
6e50: 20 20 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 69    if( db->init.i
6e60: 44 62 3d 3d 31 20 29 20 69 73 54 65 6d 70 20 3d  Db==1 ) isTemp =
6e70: 20 31 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   1;.#ifndef SQLI
6e80: 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a  TE_OMIT_AUTHORIZ
6e90: 41 54 49 4f 4e 0a 20 20 61 73 73 65 72 74 28 20  ATION.  assert( 
6ea0: 69 73 54 65 6d 70 3d 3d 30 20 7c 7c 20 69 73 54  isTemp==0 || isT
6eb0: 65 6d 70 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65  emp==1 );.  asse
6ec0: 72 74 28 20 69 73 56 69 65 77 3d 3d 30 20 7c 7c  rt( isView==0 ||
6ed0: 20 69 73 56 69 65 77 3d 3d 31 20 29 3b 0a 20 20   isView==1 );.  
6ee0: 7b 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e  {.    static con
6ef0: 73 74 20 75 38 20 61 43 6f 64 65 5b 5d 20 3d 20  st u8 aCode[] = 
6f00: 7b 0a 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f  {.       SQLITE_
6f10: 43 52 45 41 54 45 5f 54 41 42 4c 45 2c 0a 20 20  CREATE_TABLE,.  
6f20: 20 20 20 20 20 53 51 4c 49 54 45 5f 43 52 45 41       SQLITE_CREA
6f30: 54 45 5f 54 45 4d 50 5f 54 41 42 4c 45 2c 0a 20  TE_TEMP_TABLE,. 
6f40: 20 20 20 20 20 20 53 51 4c 49 54 45 5f 43 52 45        SQLITE_CRE
6f50: 41 54 45 5f 56 49 45 57 2c 0a 20 20 20 20 20 20  ATE_VIEW,.      
6f60: 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54   SQLITE_CREATE_T
6f70: 45 4d 50 5f 56 49 45 57 0a 20 20 20 20 7d 3b 0a  EMP_VIEW.    };.
6f80: 20 20 20 20 63 68 61 72 20 2a 7a 44 62 20 3d 20      char *zDb = 
6f90: 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61  db->aDb[iDb].zNa
6fa0: 6d 65 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69  me;.    if( sqli
6fb0: 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61  te3AuthCheck(pPa
6fc0: 72 73 65 2c 20 53 51 4c 49 54 45 5f 49 4e 53 45  rse, SQLITE_INSE
6fd0: 52 54 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c 45  RT, SCHEMA_TABLE
6fe0: 28 69 73 54 65 6d 70 29 2c 20 30 2c 20 7a 44 62  (isTemp), 0, zDb
6ff0: 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  ) ){.      goto 
7000: 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f  begin_table_erro
7010: 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  r;.    }.    if(
7020: 20 21 69 73 56 69 72 74 75 61 6c 20 26 26 20 73   !isVirtual && s
7030: 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28  qlite3AuthCheck(
7040: 70 50 61 72 73 65 2c 20 28 69 6e 74 29 61 43 6f  pParse, (int)aCo
7050: 64 65 5b 69 73 54 65 6d 70 2b 32 2a 69 73 56 69  de[isTemp+2*isVi
7060: 65 77 5d 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ew],.           
7070: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7080: 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d              zNam
7090: 65 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20  e, 0, zDb) ){.  
70a0: 20 20 20 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74      goto begin_t
70b0: 61 62 6c 65 5f 65 72 72 6f 72 3b 0a 20 20 20 20  able_error;.    
70c0: 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  }.  }.#endif..  
70d0: 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  /* Make sure the
70e0: 20 6e 65 77 20 74 61 62 6c 65 20 6e 61 6d 65 20   new table name 
70f0: 64 6f 65 73 20 6e 6f 74 20 63 6f 6c 6c 69 64 65  does not collide
7100: 20 77 69 74 68 20 61 6e 20 65 78 69 73 74 69 6e   with an existin
7110: 67 0a 20 20 2a 2a 20 69 6e 64 65 78 20 6f 72 20  g.  ** index or 
7120: 74 61 62 6c 65 20 6e 61 6d 65 20 69 6e 20 74 68  table name in th
7130: 65 20 73 61 6d 65 20 64 61 74 61 62 61 73 65 2e  e same database.
7140: 20 20 49 73 73 75 65 20 61 6e 20 65 72 72 6f 72    Issue an error
7150: 20 6d 65 73 73 61 67 65 20 69 66 0a 20 20 2a 2a   message if.  **
7160: 20 69 74 20 64 6f 65 73 2e 20 54 68 65 20 65 78   it does. The ex
7170: 63 65 70 74 69 6f 6e 20 69 73 20 69 66 20 74 68  ception is if th
7180: 65 20 73 74 61 74 65 6d 65 6e 74 20 62 65 69 6e  e statement bein
7190: 67 20 70 61 72 73 65 64 20 77 61 73 20 70 61 73  g parsed was pas
71a0: 73 65 64 0a 20 20 2a 2a 20 74 6f 20 61 6e 20 73  sed.  ** to an s
71b0: 71 6c 69 74 65 33 5f 64 65 63 6c 61 72 65 5f 76  qlite3_declare_v
71c0: 74 61 62 28 29 20 63 61 6c 6c 2e 20 49 6e 20 74  tab() call. In t
71d0: 68 61 74 20 63 61 73 65 20 6f 6e 6c 79 20 74 68  hat case only th
71e0: 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 0a 20  e column names. 
71f0: 20 2a 2a 20 61 6e 64 20 74 79 70 65 73 20 77 69   ** and types wi
7200: 6c 6c 20 62 65 20 75 73 65 64 2c 20 73 6f 20 74  ll be used, so t
7210: 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 20  here is no need 
7220: 74 6f 20 74 65 73 74 20 66 6f 72 20 6e 61 6d 65  to test for name
7230: 73 70 61 63 65 0a 20 20 2a 2a 20 63 6f 6c 6c 69  space.  ** colli
7240: 73 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66  sions..  */.  if
7250: 28 20 21 49 4e 5f 44 45 43 4c 41 52 45 5f 56 54  ( !IN_DECLARE_VT
7260: 41 42 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a  AB ){.    char *
7270: 7a 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44  zDb = db->aDb[iD
7280: 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 69 66  b].zName;.    if
7290: 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c  ( SQLITE_OK!=sql
72a0: 69 74 65 33 52 65 61 64 53 63 68 65 6d 61 28 70  ite3ReadSchema(p
72b0: 50 61 72 73 65 29 20 29 7b 0a 20 20 20 20 20 20  Parse) ){.      
72c0: 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65  goto begin_table
72d0: 5f 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20  _error;.    }.  
72e0: 20 20 70 54 61 62 6c 65 20 3d 20 73 71 6c 69 74    pTable = sqlit
72f0: 65 33 46 69 6e 64 54 61 62 6c 65 28 64 62 2c 20  e3FindTable(db, 
7300: 7a 4e 61 6d 65 2c 20 7a 44 62 29 3b 0a 20 20 20  zName, zDb);.   
7310: 20 69 66 28 20 70 54 61 62 6c 65 20 29 7b 0a 20   if( pTable ){. 
7320: 20 20 20 20 20 69 66 28 20 21 6e 6f 45 72 72 20       if( !noErr 
7330: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
7340: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
7350: 65 2c 20 22 74 61 62 6c 65 20 25 54 20 61 6c 72  e, "table %T alr
7360: 65 61 64 79 20 65 78 69 73 74 73 22 2c 20 70 4e  eady exists", pN
7370: 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  ame);.      }els
7380: 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  e{.        asser
7390: 74 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73  t( !db->init.bus
73a0: 79 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20  y || CORRUPT_DB 
73b0: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
73c0: 65 33 43 6f 64 65 56 65 72 69 66 79 53 63 68 65  e3CodeVerifySche
73d0: 6d 61 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b  ma(pParse, iDb);
73e0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 67  .      }.      g
73f0: 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f  oto begin_table_
7400: 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 20  error;.    }.   
7410: 20 69 66 28 20 73 71 6c 69 74 65 33 46 69 6e 64   if( sqlite3Find
7420: 49 6e 64 65 78 28 64 62 2c 20 7a 4e 61 6d 65 2c  Index(db, zName,
7430: 20 7a 44 62 29 21 3d 30 20 29 7b 0a 20 20 20 20   zDb)!=0 ){.    
7440: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
7450: 67 28 70 50 61 72 73 65 2c 20 22 74 68 65 72 65  g(pParse, "there
7460: 20 69 73 20 61 6c 72 65 61 64 79 20 61 6e 20 69   is already an i
7470: 6e 64 65 78 20 6e 61 6d 65 64 20 25 73 22 2c 20  ndex named %s", 
7480: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 67 6f  zName);.      go
7490: 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65  to begin_table_e
74a0: 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rror;.    }.  }.
74b0: 0a 20 20 70 54 61 62 6c 65 20 3d 20 73 71 6c 69  .  pTable = sqli
74c0: 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28  te3DbMallocZero(
74d0: 64 62 2c 20 73 69 7a 65 6f 66 28 54 61 62 6c 65  db, sizeof(Table
74e0: 29 29 3b 0a 20 20 69 66 28 20 70 54 61 62 6c 65  ));.  if( pTable
74f0: 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ==0 ){.    asser
7500: 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  t( db->mallocFai
7510: 6c 65 64 20 29 3b 0a 20 20 20 20 70 50 61 72 73  led );.    pPars
7520: 65 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e  e->rc = SQLITE_N
7530: 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 70  OMEM_BKPT;.    p
7540: 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20  Parse->nErr++;. 
7550: 20 20 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61     goto begin_ta
7560: 62 6c 65 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 20  ble_error;.  }. 
7570: 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 20 3d   pTable->zName =
7580: 20 7a 4e 61 6d 65 3b 0a 20 20 70 54 61 62 6c 65   zName;.  pTable
7590: 2d 3e 69 50 4b 65 79 20 3d 20 2d 31 3b 0a 20 20  ->iPKey = -1;.  
75a0: 70 54 61 62 6c 65 2d 3e 70 53 63 68 65 6d 61 20  pTable->pSchema 
75b0: 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70  = db->aDb[iDb].p
75c0: 53 63 68 65 6d 61 3b 0a 20 20 70 54 61 62 6c 65  Schema;.  pTable
75d0: 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20 70 54  ->nRef = 1;.  pT
75e0: 61 62 6c 65 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74  able->nRowLogEst
75f0: 20 3d 20 32 30 30 3b 20 61 73 73 65 72 74 28 20   = 200; assert( 
7600: 32 30 30 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45  200==sqlite3LogE
7610: 73 74 28 31 30 34 38 35 37 36 29 20 29 3b 0a 20  st(1048576) );. 
7620: 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d   assert( pParse-
7630: 3e 70 4e 65 77 54 61 62 6c 65 3d 3d 30 20 29 3b  >pNewTable==0 );
7640: 0a 20 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54  .  pParse->pNewT
7650: 61 62 6c 65 20 3d 20 70 54 61 62 6c 65 3b 0a 0a  able = pTable;..
7660: 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20    /* If this is 
7670: 74 68 65 20 6d 61 67 69 63 20 73 71 6c 69 74 65  the magic sqlite
7680: 5f 73 65 71 75 65 6e 63 65 20 74 61 62 6c 65 20  _sequence table 
7690: 75 73 65 64 20 62 79 20 61 75 74 6f 69 6e 63 72  used by autoincr
76a0: 65 6d 65 6e 74 2c 0a 20 20 2a 2a 20 74 68 65 6e  ement,.  ** then
76b0: 20 72 65 63 6f 72 64 20 61 20 70 6f 69 6e 74 65   record a pointe
76c0: 72 20 74 6f 20 74 68 69 73 20 74 61 62 6c 65 20  r to this table 
76d0: 69 6e 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61  in the main data
76e0: 62 61 73 65 20 73 74 72 75 63 74 75 72 65 0a 20  base structure. 
76f0: 20 2a 2a 20 73 6f 20 74 68 61 74 20 49 4e 53 45   ** so that INSE
7700: 52 54 20 63 61 6e 20 66 69 6e 64 20 74 68 65 20  RT can find the 
7710: 74 61 62 6c 65 20 65 61 73 69 6c 79 2e 0a 20 20  table easily..  
7720: 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
7730: 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 43 52 45  E_OMIT_AUTOINCRE
7740: 4d 45 4e 54 0a 20 20 69 66 28 20 21 70 50 61 72  MENT.  if( !pPar
7750: 73 65 2d 3e 6e 65 73 74 65 64 20 26 26 20 73 74  se->nested && st
7760: 72 63 6d 70 28 7a 4e 61 6d 65 2c 20 22 73 71 6c  rcmp(zName, "sql
7770: 69 74 65 5f 73 65 71 75 65 6e 63 65 22 29 3d 3d  ite_sequence")==
7780: 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  0 ){.    assert(
7790: 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75   sqlite3SchemaMu
77a0: 74 65 78 48 65 6c 64 28 64 62 2c 20 69 44 62 2c  texHeld(db, iDb,
77b0: 20 30 29 20 29 3b 0a 20 20 20 20 70 54 61 62 6c   0) );.    pTabl
77c0: 65 2d 3e 70 53 63 68 65 6d 61 2d 3e 70 53 65 71  e->pSchema->pSeq
77d0: 54 61 62 20 3d 20 70 54 61 62 6c 65 3b 0a 20 20  Tab = pTable;.  
77e0: 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 42  }.#endif..  /* B
77f0: 65 67 69 6e 20 67 65 6e 65 72 61 74 69 6e 67 20  egin generating 
7800: 74 68 65 20 63 6f 64 65 20 74 68 61 74 20 77 69  the code that wi
7810: 6c 6c 20 69 6e 73 65 72 74 20 74 68 65 20 74 61  ll insert the ta
7820: 62 6c 65 20 72 65 63 6f 72 64 20 69 6e 74 6f 0a  ble record into.
7830: 20 20 2a 2a 20 74 68 65 20 53 51 4c 49 54 45 5f    ** the SQLITE_
7840: 4d 41 53 54 45 52 20 74 61 62 6c 65 2e 20 20 4e  MASTER table.  N
7850: 6f 74 65 20 69 6e 20 70 61 72 74 69 63 75 6c 61  ote in particula
7860: 72 20 74 68 61 74 20 77 65 20 6d 75 73 74 20 67  r that we must g
7870: 6f 20 61 68 65 61 64 0a 20 20 2a 2a 20 61 6e 64  o ahead.  ** and
7880: 20 61 6c 6c 6f 63 61 74 65 20 74 68 65 20 72 65   allocate the re
7890: 63 6f 72 64 20 6e 75 6d 62 65 72 20 66 6f 72 20  cord number for 
78a0: 74 68 65 20 74 61 62 6c 65 20 65 6e 74 72 79 20  the table entry 
78b0: 6e 6f 77 2e 20 20 42 65 66 6f 72 65 20 61 6e 79  now.  Before any
78c0: 0a 20 20 2a 2a 20 50 52 49 4d 41 52 59 20 4b 45  .  ** PRIMARY KE
78d0: 59 20 6f 72 20 55 4e 49 51 55 45 20 6b 65 79 77  Y or UNIQUE keyw
78e0: 6f 72 64 73 20 61 72 65 20 70 61 72 73 65 64 2e  ords are parsed.
78f0: 20 20 54 68 6f 73 65 20 6b 65 79 77 6f 72 64 73    Those keywords
7900: 20 77 69 6c 6c 20 63 61 75 73 65 0a 20 20 2a 2a   will cause.  **
7910: 20 69 6e 64 69 63 65 73 20 74 6f 20 62 65 20 63   indices to be c
7920: 72 65 61 74 65 64 20 61 6e 64 20 74 68 65 20 74  reated and the t
7930: 61 62 6c 65 20 72 65 63 6f 72 64 20 6d 75 73 74  able record must
7940: 20 63 6f 6d 65 20 62 65 66 6f 72 65 20 74 68 65   come before the
7950: 20 0a 20 20 2a 2a 20 69 6e 64 69 63 65 73 2e 20   .  ** indices. 
7960: 20 48 65 6e 63 65 2c 20 74 68 65 20 72 65 63 6f   Hence, the reco
7970: 72 64 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68  rd number for th
7980: 65 20 74 61 62 6c 65 20 6d 75 73 74 20 62 65 20  e table must be 
7990: 61 6c 6c 6f 63 61 74 65 64 0a 20 20 2a 2a 20 6e  allocated.  ** n
79a0: 6f 77 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21  ow..  */.  if( !
79b0: 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 26 26  db->init.busy &&
79c0: 20 28 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74   (v = sqlite3Get
79d0: 56 64 62 65 28 70 50 61 72 73 65 29 29 21 3d 30  Vdbe(pParse))!=0
79e0: 20 29 7b 0a 20 20 20 20 69 6e 74 20 61 64 64 72   ){.    int addr
79f0: 31 3b 0a 20 20 20 20 69 6e 74 20 66 69 6c 65 46  1;.    int fileF
7a00: 6f 72 6d 61 74 3b 0a 20 20 20 20 69 6e 74 20 72  ormat;.    int r
7a10: 65 67 31 2c 20 72 65 67 32 2c 20 72 65 67 33 3b  eg1, reg2, reg3;
7a20: 0a 20 20 20 20 2f 2a 20 6e 75 6c 6c 52 6f 77 5b  .    /* nullRow[
7a30: 5d 20 69 73 20 61 6e 20 4f 50 5f 52 65 63 6f 72  ] is an OP_Recor
7a40: 64 20 65 6e 63 6f 64 69 6e 67 20 6f 66 20 61 20  d encoding of a 
7a50: 72 6f 77 20 63 6f 6e 74 61 69 6e 69 6e 67 20 35  row containing 5
7a60: 20 4e 55 4c 4c 73 20 2a 2f 0a 20 20 20 20 73 74   NULLs */.    st
7a70: 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
7a80: 6e 75 6c 6c 52 6f 77 5b 5d 20 3d 20 7b 20 36 2c  nullRow[] = { 6,
7a90: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 20 7d   0, 0, 0, 0, 0 }
7aa0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65 67  ;.    sqlite3Beg
7ab0: 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e  inWriteOperation
7ac0: 28 70 50 61 72 73 65 2c 20 31 2c 20 69 44 62 29  (pParse, 1, iDb)
7ad0: 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ;..#ifndef SQLIT
7ae0: 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
7af0: 42 4c 45 0a 20 20 20 20 69 66 28 20 69 73 56 69  BLE.    if( isVi
7b00: 72 74 75 61 6c 20 29 7b 0a 20 20 20 20 20 20 73  rtual ){.      s
7b10: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30  qlite3VdbeAddOp0
7b20: 28 76 2c 20 4f 50 5f 56 42 65 67 69 6e 29 3b 0a  (v, OP_VBegin);.
7b30: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20      }.#endif..  
7b40: 20 20 2f 2a 20 49 66 20 74 68 65 20 66 69 6c 65    /* If the file
7b50: 20 66 6f 72 6d 61 74 20 61 6e 64 20 65 6e 63 6f   format and enco
7b60: 64 69 6e 67 20 69 6e 20 74 68 65 20 64 61 74 61  ding in the data
7b70: 62 61 73 65 20 68 61 76 65 20 6e 6f 74 20 62 65  base have not be
7b80: 65 6e 20 73 65 74 2c 20 0a 20 20 20 20 2a 2a 20  en set, .    ** 
7b90: 73 65 74 20 74 68 65 6d 20 6e 6f 77 2e 0a 20 20  set them now..  
7ba0: 20 20 2a 2f 0a 20 20 20 20 72 65 67 31 20 3d 20    */.    reg1 = 
7bb0: 70 50 61 72 73 65 2d 3e 72 65 67 52 6f 77 69 64  pParse->regRowid
7bc0: 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
7bd0: 6d 3b 0a 20 20 20 20 72 65 67 32 20 3d 20 70 50  m;.    reg2 = pP
7be0: 61 72 73 65 2d 3e 72 65 67 52 6f 6f 74 20 3d 20  arse->regRoot = 
7bf0: 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
7c00: 20 20 20 20 72 65 67 33 20 3d 20 2b 2b 70 50 61      reg3 = ++pPa
7c10: 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 73  rse->nMem;.    s
7c20: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
7c30: 28 76 2c 20 4f 50 5f 52 65 61 64 43 6f 6f 6b 69  (v, OP_ReadCooki
7c40: 65 2c 20 69 44 62 2c 20 72 65 67 33 2c 20 42 54  e, iDb, reg3, BT
7c50: 52 45 45 5f 46 49 4c 45 5f 46 4f 52 4d 41 54 29  REE_FILE_FORMAT)
7c60: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
7c70: 65 55 73 65 73 42 74 72 65 65 28 76 2c 20 69 44  eUsesBtree(v, iD
7c80: 62 29 3b 0a 20 20 20 20 61 64 64 72 31 20 3d 20  b);.    addr1 = 
7c90: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
7ca0: 31 28 76 2c 20 4f 50 5f 49 66 2c 20 72 65 67 33  1(v, OP_If, reg3
7cb0: 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
7cc0: 76 29 3b 0a 20 20 20 20 66 69 6c 65 46 6f 72 6d  v);.    fileForm
7cd0: 61 74 20 3d 20 28 64 62 2d 3e 66 6c 61 67 73 20  at = (db->flags 
7ce0: 26 20 53 51 4c 49 54 45 5f 4c 65 67 61 63 79 46  & SQLITE_LegacyF
7cf0: 69 6c 65 46 6d 74 29 21 3d 30 20 3f 0a 20 20 20  ileFmt)!=0 ?.   
7d00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 31                 1
7d10: 20 3a 20 53 51 4c 49 54 45 5f 4d 41 58 5f 46 49   : SQLITE_MAX_FI
7d20: 4c 45 5f 46 4f 52 4d 41 54 3b 0a 20 20 20 20 73  LE_FORMAT;.    s
7d30: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
7d40: 28 76 2c 20 4f 50 5f 53 65 74 43 6f 6f 6b 69 65  (v, OP_SetCookie
7d50: 2c 20 69 44 62 2c 20 42 54 52 45 45 5f 46 49 4c  , iDb, BTREE_FIL
7d60: 45 5f 46 4f 52 4d 41 54 2c 20 66 69 6c 65 46 6f  E_FORMAT, fileFo
7d70: 72 6d 61 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  rmat);.    sqlit
7d80: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
7d90: 4f 50 5f 53 65 74 43 6f 6f 6b 69 65 2c 20 69 44  OP_SetCookie, iD
7da0: 62 2c 20 42 54 52 45 45 5f 54 45 58 54 5f 45 4e  b, BTREE_TEXT_EN
7db0: 43 4f 44 49 4e 47 2c 20 45 4e 43 28 64 62 29 29  CODING, ENC(db))
7dc0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
7dd0: 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64  eJumpHere(v, add
7de0: 72 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 69  r1);..    /* Thi
7df0: 73 20 6a 75 73 74 20 63 72 65 61 74 65 73 20 61  s just creates a
7e00: 20 70 6c 61 63 65 2d 68 6f 6c 64 65 72 20 72 65   place-holder re
7e10: 63 6f 72 64 20 69 6e 20 74 68 65 20 73 71 6c 69  cord in the sqli
7e20: 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 2e  te_master table.
7e30: 0a 20 20 20 20 2a 2a 20 54 68 65 20 72 65 63 6f  .    ** The reco
7e40: 72 64 20 63 72 65 61 74 65 64 20 64 6f 65 73 20  rd created does 
7e50: 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61 6e 79 74  not contain anyt
7e60: 68 69 6e 67 20 79 65 74 2e 20 20 49 74 20 77 69  hing yet.  It wi
7e70: 6c 6c 20 62 65 20 72 65 70 6c 61 63 65 64 0a 20  ll be replaced. 
7e80: 20 20 20 2a 2a 20 62 79 20 74 68 65 20 72 65 61     ** by the rea
7e90: 6c 20 65 6e 74 72 79 20 69 6e 20 63 6f 64 65 20  l entry in code 
7ea0: 67 65 6e 65 72 61 74 65 64 20 61 74 20 73 71 6c  generated at sql
7eb0: 69 74 65 33 45 6e 64 54 61 62 6c 65 28 29 2e 0a  ite3EndTable()..
7ec0: 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68      **.    ** Th
7ed0: 65 20 72 6f 77 69 64 20 66 6f 72 20 74 68 65 20  e rowid for the 
7ee0: 6e 65 77 20 65 6e 74 72 79 20 69 73 20 6c 65 66  new entry is lef
7ef0: 74 20 69 6e 20 72 65 67 69 73 74 65 72 20 70 50  t in register pP
7f00: 61 72 73 65 2d 3e 72 65 67 52 6f 77 69 64 2e 0a  arse->regRowid..
7f10: 20 20 20 20 2a 2a 20 54 68 65 20 72 6f 6f 74 20      ** The root 
7f20: 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74  page number of t
7f30: 68 65 20 6e 65 77 20 74 61 62 6c 65 20 69 73 20  he new table is 
7f40: 6c 65 66 74 20 69 6e 20 72 65 67 20 70 50 61 72  left in reg pPar
7f50: 73 65 2d 3e 72 65 67 52 6f 6f 74 2e 0a 20 20 20  se->regRoot..   
7f60: 20 2a 2a 20 54 68 65 20 72 6f 77 69 64 20 61 6e   ** The rowid an
7f70: 64 20 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62  d root page numb
7f80: 65 72 20 76 61 6c 75 65 73 20 61 72 65 20 6e 65  er values are ne
7f90: 65 64 65 64 20 62 79 20 74 68 65 20 63 6f 64 65  eded by the code
7fa0: 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 73 71 6c   that.    ** sql
7fb0: 69 74 65 33 45 6e 64 54 61 62 6c 65 20 77 69 6c  ite3EndTable wil
7fc0: 6c 20 67 65 6e 65 72 61 74 65 2e 0a 20 20 20 20  l generate..    
7fd0: 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  */.#if !defined(
7fe0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57  SQLITE_OMIT_VIEW
7ff0: 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51  ) || !defined(SQ
8000: 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
8010: 4c 54 41 42 4c 45 29 0a 20 20 20 20 69 66 28 20  LTABLE).    if( 
8020: 69 73 56 69 65 77 20 7c 7c 20 69 73 56 69 72 74  isView || isVirt
8030: 75 61 6c 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ual ){.      sql
8040: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
8050: 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c  , OP_Integer, 0,
8060: 20 72 65 67 32 29 3b 0a 20 20 20 20 7d 65 6c 73   reg2);.    }els
8070: 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 7b 0a 20  e.#endif.    {. 
8080: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 61 64 64       pParse->add
8090: 72 43 72 54 61 62 20 3d 20 73 71 6c 69 74 65 33  rCrTab = sqlite3
80a0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
80b0: 5f 43 72 65 61 74 65 54 61 62 6c 65 2c 20 69 44  _CreateTable, iD
80c0: 62 2c 20 72 65 67 32 29 3b 0a 20 20 20 20 7d 0a  b, reg2);.    }.
80d0: 20 20 20 20 73 71 6c 69 74 65 33 4f 70 65 6e 4d      sqlite3OpenM
80e0: 61 73 74 65 72 54 61 62 6c 65 28 70 50 61 72 73  asterTable(pPars
80f0: 65 2c 20 69 44 62 29 3b 0a 20 20 20 20 73 71 6c  e, iDb);.    sql
8100: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
8110: 2c 20 4f 50 5f 4e 65 77 52 6f 77 69 64 2c 20 30  , OP_NewRowid, 0
8120: 2c 20 72 65 67 31 29 3b 0a 20 20 20 20 73 71 6c  , reg1);.    sql
8130: 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
8140: 2c 20 4f 50 5f 42 6c 6f 62 2c 20 36 2c 20 72 65  , OP_Blob, 6, re
8150: 67 33 2c 20 30 2c 20 6e 75 6c 6c 52 6f 77 2c 20  g3, 0, nullRow, 
8160: 50 34 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20  P4_STATIC);.    
8170: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
8180: 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20  3(v, OP_Insert, 
8190: 30 2c 20 72 65 67 33 2c 20 72 65 67 31 29 3b 0a  0, reg3, reg1);.
81a0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
81b0: 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41  hangeP5(v, OPFLA
81c0: 47 5f 41 50 50 45 4e 44 29 3b 0a 20 20 20 20 73  G_APPEND);.    s
81d0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30  qlite3VdbeAddOp0
81e0: 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 29 3b 0a 20  (v, OP_Close);. 
81f0: 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 72 6d 61 6c 20   }..  /* Normal 
8200: 28 6e 6f 6e 2d 65 72 72 6f 72 29 20 72 65 74 75  (non-error) retu
8210: 72 6e 2e 20 2a 2f 0a 20 20 72 65 74 75 72 6e 3b  rn. */.  return;
8220: 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 20 65 72 72  ..  /* If an err
8230: 6f 72 20 6f 63 63 75 72 73 2c 20 77 65 20 6a 75  or occurs, we ju
8240: 6d 70 20 68 65 72 65 20 2a 2f 0a 62 65 67 69 6e  mp here */.begin
8250: 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3a 0a 20 20  _table_error:.  
8260: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
8270: 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 72 65 74 75  , zName);.  retu
8280: 72 6e 3b 0a 7d 0a 0a 2f 2a 20 53 65 74 20 70 72  rn;.}../* Set pr
8290: 6f 70 65 72 74 69 65 73 20 6f 66 20 61 20 74 61  operties of a ta
82a0: 62 6c 65 20 63 6f 6c 75 6d 6e 20 62 61 73 65 64  ble column based
82b0: 20 6f 6e 20 74 68 65 20 28 6d 61 67 69 63 61 6c   on the (magical
82c0: 29 0a 2a 2a 20 6e 61 6d 65 20 6f 66 20 74 68 65  ).** name of the
82d0: 20 63 6f 6c 75 6d 6e 2e 0a 2a 2f 0a 23 69 66 20   column..*/.#if 
82e0: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 48 49  SQLITE_ENABLE_HI
82f0: 44 44 45 4e 5f 43 4f 4c 55 4d 4e 53 0a 76 6f 69  DDEN_COLUMNS.voi
8300: 64 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 50  d sqlite3ColumnP
8310: 72 6f 70 65 72 74 69 65 73 46 72 6f 6d 4e 61 6d  ropertiesFromNam
8320: 65 28 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 43  e(Table *pTab, C
8330: 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 29 7b 0a 20 20  olumn *pCol){.  
8340: 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74 72 6e  if( sqlite3_strn
8350: 69 63 6d 70 28 70 43 6f 6c 2d 3e 7a 4e 61 6d 65  icmp(pCol->zName
8360: 2c 20 22 5f 5f 68 69 64 64 65 6e 5f 5f 22 2c 20  , "__hidden__", 
8370: 31 30 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70 43  10)==0 ){.    pC
8380: 6f 6c 2d 3e 63 6f 6c 46 6c 61 67 73 20 7c 3d 20  ol->colFlags |= 
8390: 43 4f 4c 46 4c 41 47 5f 48 49 44 44 45 4e 3b 0a  COLFLAG_HIDDEN;.
83a0: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 54 61 62    }else if( pTab
83b0: 20 26 26 20 70 43 6f 6c 21 3d 70 54 61 62 2d 3e   && pCol!=pTab->
83c0: 61 43 6f 6c 20 26 26 20 28 70 43 6f 6c 5b 2d 31  aCol && (pCol[-1
83d0: 5d 2e 63 6f 6c 46 6c 61 67 73 20 26 20 43 4f 4c  ].colFlags & COL
83e0: 46 4c 41 47 5f 48 49 44 44 45 4e 29 20 29 7b 0a  FLAG_HIDDEN) ){.
83f0: 20 20 20 20 70 54 61 62 2d 3e 74 61 62 46 6c 61      pTab->tabFla
8400: 67 73 20 7c 3d 20 54 46 5f 4f 4f 4f 48 69 64 64  gs |= TF_OOOHidd
8410: 65 6e 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66  en;.  }.}.#endif
8420: 0a 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e  .../*.** Add a n
8430: 65 77 20 63 6f 6c 75 6d 6e 20 74 6f 20 74 68 65  ew column to the
8440: 20 74 61 62 6c 65 20 63 75 72 72 65 6e 74 6c 79   table currently
8450: 20 62 65 69 6e 67 20 63 6f 6e 73 74 72 75 63 74   being construct
8460: 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61  ed..**.** The pa
8470: 72 73 65 72 20 63 61 6c 6c 73 20 74 68 69 73 20  rser calls this 
8480: 72 6f 75 74 69 6e 65 20 6f 6e 63 65 20 66 6f 72  routine once for
8490: 20 65 61 63 68 20 63 6f 6c 75 6d 6e 20 64 65 63   each column dec
84a0: 6c 61 72 61 74 69 6f 6e 0a 2a 2a 20 69 6e 20 61  laration.** in a
84b0: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74   CREATE TABLE st
84c0: 61 74 65 6d 65 6e 74 2e 20 20 73 71 6c 69 74 65  atement.  sqlite
84d0: 33 53 74 61 72 74 54 61 62 6c 65 28 29 20 67 65  3StartTable() ge
84e0: 74 73 20 63 61 6c 6c 65 64 0a 2a 2a 20 66 69 72  ts called.** fir
84f0: 73 74 20 74 6f 20 67 65 74 20 74 68 69 6e 67 73  st to get things
8500: 20 67 6f 69 6e 67 2e 20 20 54 68 65 6e 20 74 68   going.  Then th
8510: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
8520: 6c 6c 65 64 20 66 6f 72 20 65 61 63 68 0a 2a 2a  lled for each.**
8530: 20 63 6f 6c 75 6d 6e 2e 0a 2a 2f 0a 76 6f 69 64   column..*/.void
8540: 20 73 71 6c 69 74 65 33 41 64 64 43 6f 6c 75 6d   sqlite3AddColum
8550: 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  n(Parse *pParse,
8560: 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 2c 20 54   Token *pName, T
8570: 6f 6b 65 6e 20 2a 70 54 79 70 65 29 7b 0a 20 20  oken *pType){.  
8580: 54 61 62 6c 65 20 2a 70 3b 0a 20 20 69 6e 74 20  Table *p;.  int 
8590: 69 3b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20  i;.  char *z;.  
85a0: 63 68 61 72 20 2a 7a 54 79 70 65 3b 0a 20 20 43  char *zType;.  C
85b0: 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 73  olumn *pCol;.  s
85c0: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
85d0: 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20 28  rse->db;.  if( (
85e0: 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  p = pParse->pNew
85f0: 54 61 62 6c 65 29 3d 3d 30 20 29 20 72 65 74 75  Table)==0 ) retu
8600: 72 6e 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d  rn;.#if SQLITE_M
8610: 41 58 5f 43 4f 4c 55 4d 4e 0a 20 20 69 66 28 20  AX_COLUMN.  if( 
8620: 70 2d 3e 6e 43 6f 6c 2b 31 3e 64 62 2d 3e 61 4c  p->nCol+1>db->aL
8630: 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49  imit[SQLITE_LIMI
8640: 54 5f 43 4f 4c 55 4d 4e 5d 20 29 7b 0a 20 20 20  T_COLUMN] ){.   
8650: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
8660: 28 70 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61  (pParse, "too ma
8670: 6e 79 20 63 6f 6c 75 6d 6e 73 20 6f 6e 20 25 73  ny columns on %s
8680: 22 2c 20 70 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  ", p->zName);.  
8690: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 23 65    return;.  }.#e
86a0: 6e 64 69 66 0a 20 20 7a 20 3d 20 73 71 6c 69 74  ndif.  z = sqlit
86b0: 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62  e3DbMallocRaw(db
86c0: 2c 20 70 4e 61 6d 65 2d 3e 6e 20 2b 20 70 54 79  , pName->n + pTy
86d0: 70 65 2d 3e 6e 20 2b 20 32 29 3b 0a 20 20 69 66  pe->n + 2);.  if
86e0: 28 20 7a 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ( z==0 ) return;
86f0: 0a 20 20 6d 65 6d 63 70 79 28 7a 2c 20 70 4e 61  .  memcpy(z, pNa
8700: 6d 65 2d 3e 7a 2c 20 70 4e 61 6d 65 2d 3e 6e 29  me->z, pName->n)
8710: 3b 0a 20 20 7a 5b 70 4e 61 6d 65 2d 3e 6e 5d 20  ;.  z[pName->n] 
8720: 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 44 65  = 0;.  sqlite3De
8730: 71 75 6f 74 65 28 7a 29 3b 0a 20 20 66 6f 72 28  quote(z);.  for(
8740: 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 3b 20  i=0; i<p->nCol; 
8750: 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73 71  i++){.    if( sq
8760: 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28 7a 2c  lite3_stricmp(z,
8770: 20 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d   p->aCol[i].zNam
8780: 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  e)==0 ){.      s
8790: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
87a0: 50 61 72 73 65 2c 20 22 64 75 70 6c 69 63 61 74  Parse, "duplicat
87b0: 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 3a 20 25  e column name: %
87c0: 73 22 2c 20 7a 29 3b 0a 20 20 20 20 20 20 73 71  s", z);.      sq
87d0: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
87e0: 7a 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  z);.      return
87f0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
8800: 28 20 28 70 2d 3e 6e 43 6f 6c 20 26 20 30 78 37  ( (p->nCol & 0x7
8810: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 43 6f 6c 75  )==0 ){.    Colu
8820: 6d 6e 20 2a 61 4e 65 77 3b 0a 20 20 20 20 61 4e  mn *aNew;.    aN
8830: 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62 52 65  ew = sqlite3DbRe
8840: 61 6c 6c 6f 63 28 64 62 2c 70 2d 3e 61 43 6f 6c  alloc(db,p->aCol
8850: 2c 28 70 2d 3e 6e 43 6f 6c 2b 38 29 2a 73 69 7a  ,(p->nCol+8)*siz
8860: 65 6f 66 28 70 2d 3e 61 43 6f 6c 5b 30 5d 29 29  eof(p->aCol[0]))
8870: 3b 0a 20 20 20 20 69 66 28 20 61 4e 65 77 3d 3d  ;.    if( aNew==
8880: 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
8890: 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 29 3b  e3DbFree(db, z);
88a0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  .      return;. 
88b0: 20 20 20 7d 0a 20 20 20 20 70 2d 3e 61 43 6f 6c     }.    p->aCol
88c0: 20 3d 20 61 4e 65 77 3b 0a 20 20 7d 0a 20 20 70   = aNew;.  }.  p
88d0: 43 6f 6c 20 3d 20 26 70 2d 3e 61 43 6f 6c 5b 70  Col = &p->aCol[p
88e0: 2d 3e 6e 43 6f 6c 5d 3b 0a 20 20 6d 65 6d 73 65  ->nCol];.  memse
88f0: 74 28 70 43 6f 6c 2c 20 30 2c 20 73 69 7a 65 6f  t(pCol, 0, sizeo
8900: 66 28 70 2d 3e 61 43 6f 6c 5b 30 5d 29 29 3b 0a  f(p->aCol[0]));.
8910: 20 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 20 3d 20    pCol->zName = 
8920: 7a 3b 0a 20 20 73 71 6c 69 74 65 33 43 6f 6c 75  z;.  sqlite3Colu
8930: 6d 6e 50 72 6f 70 65 72 74 69 65 73 46 72 6f 6d  mnPropertiesFrom
8940: 4e 61 6d 65 28 70 2c 20 70 43 6f 6c 29 3b 0a 20  Name(p, pCol);. 
8950: 0a 20 20 69 66 28 20 70 54 79 70 65 2d 3e 6e 3d  .  if( pType->n=
8960: 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20  =0 ){.    /* If 
8970: 74 68 65 72 65 20 69 73 20 6e 6f 20 74 79 70 65  there is no type
8980: 20 73 70 65 63 69 66 69 65 64 2c 20 63 6f 6c 75   specified, colu
8990: 6d 6e 73 20 68 61 76 65 20 74 68 65 20 64 65 66  mns have the def
89a0: 61 75 6c 74 20 61 66 66 69 6e 69 74 79 0a 20 20  ault affinity.  
89b0: 20 20 2a 2a 20 27 42 4c 4f 42 27 2e 20 2a 2f 0a    ** 'BLOB'. */.
89c0: 20 20 20 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69      pCol->affini
89d0: 74 79 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f  ty = SQLITE_AFF_
89e0: 42 4c 4f 42 3b 0a 20 20 20 20 70 43 6f 6c 2d 3e  BLOB;.    pCol->
89f0: 73 7a 45 73 74 20 3d 20 31 3b 0a 20 20 7d 65 6c  szEst = 1;.  }el
8a00: 73 65 7b 0a 20 20 20 20 7a 54 79 70 65 20 3d 20  se{.    zType = 
8a10: 7a 20 2b 20 73 71 6c 69 74 65 33 53 74 72 6c 65  z + sqlite3Strle
8a20: 6e 33 30 28 7a 29 20 2b 20 31 3b 0a 20 20 20 20  n30(z) + 1;.    
8a30: 6d 65 6d 63 70 79 28 7a 54 79 70 65 2c 20 70 54  memcpy(zType, pT
8a40: 79 70 65 2d 3e 7a 2c 20 70 54 79 70 65 2d 3e 6e  ype->z, pType->n
8a50: 29 3b 0a 20 20 20 20 7a 54 79 70 65 5b 70 54 79  );.    zType[pTy
8a60: 70 65 2d 3e 6e 5d 20 3d 20 30 3b 0a 20 20 20 20  pe->n] = 0;.    
8a70: 73 71 6c 69 74 65 33 44 65 71 75 6f 74 65 28 7a  sqlite3Dequote(z
8a80: 54 79 70 65 29 3b 0a 20 20 20 20 70 43 6f 6c 2d  Type);.    pCol-
8a90: 3e 61 66 66 69 6e 69 74 79 20 3d 20 73 71 6c 69  >affinity = sqli
8aa0: 74 65 33 41 66 66 69 6e 69 74 79 54 79 70 65 28  te3AffinityType(
8ab0: 7a 54 79 70 65 2c 20 26 70 43 6f 6c 2d 3e 73 7a  zType, &pCol->sz
8ac0: 45 73 74 29 3b 0a 20 20 20 20 70 43 6f 6c 2d 3e  Est);.    pCol->
8ad0: 63 6f 6c 46 6c 61 67 73 20 7c 3d 20 43 4f 4c 46  colFlags |= COLF
8ae0: 4c 41 47 5f 48 41 53 54 59 50 45 3b 0a 20 20 7d  LAG_HASTYPE;.  }
8af0: 0a 20 20 70 2d 3e 6e 43 6f 6c 2b 2b 3b 0a 20 20  .  p->nCol++;.  
8b00: 70 50 61 72 73 65 2d 3e 63 6f 6e 73 74 72 61 69  pParse->constrai
8b10: 6e 74 4e 61 6d 65 2e 6e 20 3d 20 30 3b 0a 7d 0a  ntName.n = 0;.}.
8b20: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
8b30: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 62 79  ine is called by
8b40: 20 74 68 65 20 70 61 72 73 65 72 20 77 68 69 6c   the parser whil
8b50: 65 20 69 6e 20 74 68 65 20 6d 69 64 64 6c 65 20  e in the middle 
8b60: 6f 66 0a 2a 2a 20 70 61 72 73 69 6e 67 20 61 20  of.** parsing a 
8b70: 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61  CREATE TABLE sta
8b80: 74 65 6d 65 6e 74 2e 20 20 41 20 22 4e 4f 54 20  tement.  A "NOT 
8b90: 4e 55 4c 4c 22 20 63 6f 6e 73 74 72 61 69 6e 74  NULL" constraint
8ba0: 20 68 61 73 0a 2a 2a 20 62 65 65 6e 20 73 65 65   has.** been see
8bb0: 6e 20 6f 6e 20 61 20 63 6f 6c 75 6d 6e 2e 20 20  n on a column.  
8bc0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74  This routine set
8bd0: 73 20 74 68 65 20 6e 6f 74 4e 75 6c 6c 20 66 6c  s the notNull fl
8be0: 61 67 20 6f 6e 0a 2a 2a 20 74 68 65 20 63 6f 6c  ag on.** the col
8bf0: 75 6d 6e 20 63 75 72 72 65 6e 74 6c 79 20 75 6e  umn currently un
8c00: 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e  der construction
8c10: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
8c20: 33 41 64 64 4e 6f 74 4e 75 6c 6c 28 50 61 72 73  3AddNotNull(Pars
8c30: 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 6f  e *pParse, int o
8c40: 6e 45 72 72 6f 72 29 7b 0a 20 20 54 61 62 6c 65  nError){.  Table
8c50: 20 2a 70 3b 0a 20 20 70 20 3d 20 70 50 61 72 73   *p;.  p = pPars
8c60: 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20  e->pNewTable;.  
8c70: 69 66 28 20 70 3d 3d 30 20 7c 7c 20 4e 45 56 45  if( p==0 || NEVE
8c80: 52 28 70 2d 3e 6e 43 6f 6c 3c 31 29 20 29 20 72  R(p->nCol<1) ) r
8c90: 65 74 75 72 6e 3b 0a 20 20 70 2d 3e 61 43 6f 6c  eturn;.  p->aCol
8ca0: 5b 70 2d 3e 6e 43 6f 6c 2d 31 5d 2e 6e 6f 74 4e  [p->nCol-1].notN
8cb0: 75 6c 6c 20 3d 20 28 75 38 29 6f 6e 45 72 72 6f  ull = (u8)onErro
8cc0: 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 63 61 6e  r;.}../*.** Scan
8cd0: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 74 79 70 65   the column type
8ce0: 20 6e 61 6d 65 20 7a 54 79 70 65 20 28 6c 65 6e   name zType (len
8cf0: 67 74 68 20 6e 54 79 70 65 29 20 61 6e 64 20 72  gth nType) and r
8d00: 65 74 75 72 6e 20 74 68 65 0a 2a 2a 20 61 73 73  eturn the.** ass
8d10: 6f 63 69 61 74 65 64 20 61 66 66 69 6e 69 74 79  ociated affinity
8d20: 20 74 79 70 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69   type..**.** Thi
8d30: 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 61  s routine does a
8d40: 20 63 61 73 65 2d 69 6e 64 65 70 65 6e 64 65 6e   case-independen
8d50: 74 20 73 65 61 72 63 68 20 6f 66 20 7a 54 79 70  t search of zTyp
8d60: 65 20 66 6f 72 20 74 68 65 20 0a 2a 2a 20 73 75  e for the .** su
8d70: 62 73 74 72 69 6e 67 73 20 69 6e 20 74 68 65 20  bstrings in the 
8d80: 66 6f 6c 6c 6f 77 69 6e 67 20 74 61 62 6c 65 2e  following table.
8d90: 20 49 66 20 6f 6e 65 20 6f 66 20 74 68 65 20 73   If one of the s
8da0: 75 62 73 74 72 69 6e 67 73 20 69 73 0a 2a 2a 20  ubstrings is.** 
8db0: 66 6f 75 6e 64 2c 20 74 68 65 20 63 6f 72 72 65  found, the corre
8dc0: 73 70 6f 6e 64 69 6e 67 20 61 66 66 69 6e 69 74  sponding affinit
8dd0: 79 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49  y is returned. I
8de0: 66 20 7a 54 79 70 65 20 63 6f 6e 74 61 69 6e 73  f zType contains
8df0: 0a 2a 2a 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e  .** more than on
8e00: 65 20 6f 66 20 74 68 65 20 73 75 62 73 74 72 69  e of the substri
8e10: 6e 67 73 2c 20 65 6e 74 72 69 65 73 20 74 6f 77  ngs, entries tow
8e20: 61 72 64 20 74 68 65 20 74 6f 70 20 6f 66 20 0a  ard the top of .
8e30: 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 74 61 6b  ** the table tak
8e40: 65 20 70 72 69 6f 72 69 74 79 2e 20 46 6f 72 20  e priority. For 
8e50: 65 78 61 6d 70 6c 65 2c 20 69 66 20 7a 54 79 70  example, if zTyp
8e60: 65 20 69 73 20 27 42 4c 4f 42 49 4e 54 27 2c 20  e is 'BLOBINT', 
8e70: 0a 2a 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f 49  .** SQLITE_AFF_I
8e80: 4e 54 45 47 45 52 20 69 73 20 72 65 74 75 72 6e  NTEGER is return
8e90: 65 64 2e 0a 2a 2a 0a 2a 2a 20 53 75 62 73 74 72  ed..**.** Substr
8ea0: 69 6e 67 20 20 20 20 20 7c 20 41 66 66 69 6e 69  ing     | Affini
8eb0: 74 79 0a 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ty.** ----------
8ec0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8ed0: 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 27 49 4e 54 27 20  ------.** 'INT' 
8ee0: 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45          | SQLITE
8ef0: 5f 41 46 46 5f 49 4e 54 45 47 45 52 0a 2a 2a 20  _AFF_INTEGER.** 
8f00: 27 43 48 41 52 27 20 20 20 20 20 20 20 20 7c 20  'CHAR'        | 
8f10: 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 0a  SQLITE_AFF_TEXT.
8f20: 2a 2a 20 27 43 4c 4f 42 27 20 20 20 20 20 20 20  ** 'CLOB'       
8f30: 20 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45   | SQLITE_AFF_TE
8f40: 58 54 0a 2a 2a 20 27 54 45 58 54 27 20 20 20 20  XT.** 'TEXT'    
8f50: 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 41 46 46      | SQLITE_AFF
8f60: 5f 54 45 58 54 0a 2a 2a 20 27 42 4c 4f 42 27 20  _TEXT.** 'BLOB' 
8f70: 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f         | SQLITE_
8f80: 41 46 46 5f 42 4c 4f 42 0a 2a 2a 20 27 52 45 41  AFF_BLOB.** 'REA
8f90: 4c 27 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49  L'        | SQLI
8fa0: 54 45 5f 41 46 46 5f 52 45 41 4c 0a 2a 2a 20 27  TE_AFF_REAL.** '
8fb0: 46 4c 4f 41 27 20 20 20 20 20 20 20 20 7c 20 53  FLOA'        | S
8fc0: 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 0a 2a  QLITE_AFF_REAL.*
8fd0: 2a 20 27 44 4f 55 42 27 20 20 20 20 20 20 20 20  * 'DOUB'        
8fe0: 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41  | SQLITE_AFF_REA
8ff0: 4c 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 6e 65 20  L.**.** If none 
9000: 6f 66 20 74 68 65 20 73 75 62 73 74 72 69 6e 67  of the substring
9010: 73 20 69 6e 20 74 68 65 20 61 62 6f 76 65 20 74  s in the above t
9020: 61 62 6c 65 20 61 72 65 20 66 6f 75 6e 64 2c 0a  able are found,.
9030: 2a 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55  ** SQLITE_AFF_NU
9040: 4d 45 52 49 43 20 69 73 20 72 65 74 75 72 6e 65  MERIC is returne
9050: 64 2e 0a 2a 2f 0a 63 68 61 72 20 73 71 6c 69 74  d..*/.char sqlit
9060: 65 33 41 66 66 69 6e 69 74 79 54 79 70 65 28 63  e3AffinityType(c
9070: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 6e 2c 20  onst char *zIn, 
9080: 75 38 20 2a 70 73 7a 45 73 74 29 7b 0a 20 20 75  u8 *pszEst){.  u
9090: 33 32 20 68 20 3d 20 30 3b 0a 20 20 63 68 61 72  32 h = 0;.  char
90a0: 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46   aff = SQLITE_AF
90b0: 46 5f 4e 55 4d 45 52 49 43 3b 0a 20 20 63 6f 6e  F_NUMERIC;.  con
90c0: 73 74 20 63 68 61 72 20 2a 7a 43 68 61 72 20 3d  st char *zChar =
90d0: 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 7a   0;..  assert( z
90e0: 49 6e 21 3d 30 20 29 3b 0a 20 20 77 68 69 6c 65  In!=0 );.  while
90f0: 28 20 7a 49 6e 5b 30 5d 20 29 7b 0a 20 20 20 20  ( zIn[0] ){.    
9100: 68 20 3d 20 28 68 3c 3c 38 29 20 2b 20 73 71 6c  h = (h<<8) + sql
9110: 69 74 65 33 55 70 70 65 72 54 6f 4c 6f 77 65 72  ite3UpperToLower
9120: 5b 28 2a 7a 49 6e 29 26 30 78 66 66 5d 3b 0a 20  [(*zIn)&0xff];. 
9130: 20 20 20 7a 49 6e 2b 2b 3b 0a 20 20 20 20 69 66     zIn++;.    if
9140: 28 20 68 3d 3d 28 28 27 63 27 3c 3c 32 34 29 2b  ( h==(('c'<<24)+
9150: 28 27 68 27 3c 3c 31 36 29 2b 28 27 61 27 3c 3c  ('h'<<16)+('a'<<
9160: 38 29 2b 27 72 27 29 20 29 7b 20 20 20 20 20 20  8)+'r') ){      
9170: 20 20 20 20 20 20 20 2f 2a 20 43 48 41 52 20 2a         /* CHAR *
9180: 2f 0a 20 20 20 20 20 20 61 66 66 20 3d 20 53 51  /.      aff = SQ
9190: 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 3b 0a 20  LITE_AFF_TEXT;. 
91a0: 20 20 20 20 20 7a 43 68 61 72 20 3d 20 7a 49 6e       zChar = zIn
91b0: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
91c0: 68 3d 3d 28 28 27 63 27 3c 3c 32 34 29 2b 28 27  h==(('c'<<24)+('
91d0: 6c 27 3c 3c 31 36 29 2b 28 27 6f 27 3c 3c 38 29  l'<<16)+('o'<<8)
91e0: 2b 27 62 27 29 20 29 7b 20 20 20 20 20 20 20 2f  +'b') ){       /
91f0: 2a 20 43 4c 4f 42 20 2a 2f 0a 20 20 20 20 20 20  * CLOB */.      
9200: 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46  aff = SQLITE_AFF
9210: 5f 54 45 58 54 3b 0a 20 20 20 20 7d 65 6c 73 65  _TEXT;.    }else
9220: 20 69 66 28 20 68 3d 3d 28 28 27 74 27 3c 3c 32   if( h==(('t'<<2
9230: 34 29 2b 28 27 65 27 3c 3c 31 36 29 2b 28 27 78  4)+('e'<<16)+('x
9240: 27 3c 3c 38 29 2b 27 74 27 29 20 29 7b 20 20 20  '<<8)+'t') ){   
9250: 20 20 20 20 2f 2a 20 54 45 58 54 20 2a 2f 0a 20      /* TEXT */. 
9260: 20 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49 54       aff = SQLIT
9270: 45 5f 41 46 46 5f 54 45 58 54 3b 0a 20 20 20 20  E_AFF_TEXT;.    
9280: 7d 65 6c 73 65 20 69 66 28 20 68 3d 3d 28 28 27  }else if( h==(('
9290: 62 27 3c 3c 32 34 29 2b 28 27 6c 27 3c 3c 31 36  b'<<24)+('l'<<16
92a0: 29 2b 28 27 6f 27 3c 3c 38 29 2b 27 62 27 29 20  )+('o'<<8)+'b') 
92b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 42 4c 4f 42           /* BLOB
92c0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 26 26 20 28   */.        && (
92d0: 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f  aff==SQLITE_AFF_
92e0: 4e 55 4d 45 52 49 43 20 7c 7c 20 61 66 66 3d 3d  NUMERIC || aff==
92f0: 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 29  SQLITE_AFF_REAL)
9300: 20 29 7b 0a 20 20 20 20 20 20 61 66 66 20 3d 20   ){.      aff = 
9310: 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 3b  SQLITE_AFF_BLOB;
9320: 0a 20 20 20 20 20 20 69 66 28 20 7a 49 6e 5b 30  .      if( zIn[0
9330: 5d 3d 3d 27 28 27 20 29 20 7a 43 68 61 72 20 3d  ]=='(' ) zChar =
9340: 20 7a 49 6e 3b 0a 23 69 66 6e 64 65 66 20 53 51   zIn;.#ifndef SQ
9350: 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49  LITE_OMIT_FLOATI
9360: 4e 47 5f 50 4f 49 4e 54 0a 20 20 20 20 7d 65 6c  NG_POINT.    }el
9370: 73 65 20 69 66 28 20 68 3d 3d 28 28 27 72 27 3c  se if( h==(('r'<
9380: 3c 32 34 29 2b 28 27 65 27 3c 3c 31 36 29 2b 28  <24)+('e'<<16)+(
9390: 27 61 27 3c 3c 38 29 2b 27 6c 27 29 20 20 20 20  'a'<<8)+'l')    
93a0: 20 20 20 20 20 20 2f 2a 20 52 45 41 4c 20 2a 2f        /* REAL */
93b0: 0a 20 20 20 20 20 20 20 20 26 26 20 61 66 66 3d  .        && aff=
93c0: 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45  =SQLITE_AFF_NUME
93d0: 52 49 43 20 29 7b 0a 20 20 20 20 20 20 61 66 66  RIC ){.      aff
93e0: 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 52 45   = SQLITE_AFF_RE
93f0: 41 4c 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  AL;.    }else if
9400: 28 20 68 3d 3d 28 28 27 66 27 3c 3c 32 34 29 2b  ( h==(('f'<<24)+
9410: 28 27 6c 27 3c 3c 31 36 29 2b 28 27 6f 27 3c 3c  ('l'<<16)+('o'<<
9420: 38 29 2b 27 61 27 29 20 20 20 20 20 20 20 20 20  8)+'a')         
9430: 20 2f 2a 20 46 4c 4f 41 20 2a 2f 0a 20 20 20 20   /* FLOA */.    
9440: 20 20 20 20 26 26 20 61 66 66 3d 3d 53 51 4c 49      && aff==SQLI
9450: 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20 29  TE_AFF_NUMERIC )
9460: 7b 0a 20 20 20 20 20 20 61 66 66 20 3d 20 53 51  {.      aff = SQ
9470: 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 3b 0a 20  LITE_AFF_REAL;. 
9480: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 68 3d 3d     }else if( h==
9490: 28 28 27 64 27 3c 3c 32 34 29 2b 28 27 6f 27 3c  (('d'<<24)+('o'<
94a0: 3c 31 36 29 2b 28 27 75 27 3c 3c 38 29 2b 27 62  <16)+('u'<<8)+'b
94b0: 27 29 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44  ')          /* D
94c0: 4f 55 42 20 2a 2f 0a 20 20 20 20 20 20 20 20 26  OUB */.        &
94d0: 26 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46  & aff==SQLITE_AF
94e0: 46 5f 4e 55 4d 45 52 49 43 20 29 7b 0a 20 20 20  F_NUMERIC ){.   
94f0: 20 20 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f     aff = SQLITE_
9500: 41 46 46 5f 52 45 41 4c 3b 0a 23 65 6e 64 69 66  AFF_REAL;.#endif
9510: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28  .    }else if( (
9520: 68 26 30 78 30 30 46 46 46 46 46 46 29 3d 3d 28  h&0x00FFFFFF)==(
9530: 28 27 69 27 3c 3c 31 36 29 2b 28 27 6e 27 3c 3c  ('i'<<16)+('n'<<
9540: 38 29 2b 27 74 27 29 20 29 7b 20 20 20 20 2f 2a  8)+'t') ){    /*
9550: 20 49 4e 54 20 2a 2f 0a 20 20 20 20 20 20 61 66   INT */.      af
9560: 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 49  f = SQLITE_AFF_I
9570: 4e 54 45 47 45 52 3b 0a 20 20 20 20 20 20 62 72  NTEGER;.      br
9580: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  eak;.    }.  }..
9590: 20 20 2f 2a 20 49 66 20 70 73 7a 45 73 74 20 69    /* If pszEst i
95a0: 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 73 74 6f 72  s not NULL, stor
95b0: 65 20 61 6e 20 65 73 74 69 6d 61 74 65 20 6f 66  e an estimate of
95c0: 20 74 68 65 20 66 69 65 6c 64 20 73 69 7a 65 2e   the field size.
95d0: 20 20 54 68 65 0a 20 20 2a 2a 20 65 73 74 69 6d    The.  ** estim
95e0: 61 74 65 20 69 73 20 73 63 61 6c 65 64 20 73 6f  ate is scaled so
95f0: 20 74 68 61 74 20 74 68 65 20 73 69 7a 65 20 6f   that the size o
9600: 66 20 61 6e 20 69 6e 74 65 67 65 72 20 69 73 20  f an integer is 
9610: 31 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70 73 7a  1.  */.  if( psz
9620: 45 73 74 20 29 7b 0a 20 20 20 20 2a 70 73 7a 45  Est ){.    *pszE
9630: 73 74 20 3d 20 31 3b 20 20 20 2f 2a 20 64 65 66  st = 1;   /* def
9640: 61 75 6c 74 20 73 69 7a 65 20 69 73 20 61 70 70  ault size is app
9650: 72 6f 78 20 34 20 62 79 74 65 73 20 2a 2f 0a 20  rox 4 bytes */. 
9660: 20 20 20 69 66 28 20 61 66 66 3c 53 51 4c 49 54     if( aff<SQLIT
9670: 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20 29 7b  E_AFF_NUMERIC ){
9680: 0a 20 20 20 20 20 20 69 66 28 20 7a 43 68 61 72  .      if( zChar
9690: 20 29 7b 0a 20 20 20 20 20 20 20 20 77 68 69 6c   ){.        whil
96a0: 65 28 20 7a 43 68 61 72 5b 30 5d 20 29 7b 0a 20  e( zChar[0] ){. 
96b0: 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c           if( sql
96c0: 69 74 65 33 49 73 64 69 67 69 74 28 7a 43 68 61  ite3Isdigit(zCha
96d0: 72 5b 30 5d 29 20 29 7b 0a 20 20 20 20 20 20 20  r[0]) ){.       
96e0: 20 20 20 20 20 69 6e 74 20 76 20 3d 20 30 3b 0a       int v = 0;.
96f0: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
9700: 74 65 33 47 65 74 49 6e 74 33 32 28 7a 43 68 61  te3GetInt32(zCha
9710: 72 2c 20 26 76 29 3b 0a 20 20 20 20 20 20 20 20  r, &v);.        
9720: 20 20 20 20 76 20 3d 20 76 2f 34 20 2b 20 31 3b      v = v/4 + 1;
9730: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
9740: 20 76 3e 32 35 35 20 29 20 76 20 3d 20 32 35 35   v>255 ) v = 255
9750: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 70  ;.            *p
9760: 73 7a 45 73 74 20 3d 20 76 3b 20 2f 2a 20 42 4c  szEst = v; /* BL
9770: 4f 42 28 6b 29 2c 20 56 41 52 43 48 41 52 28 6b  OB(k), VARCHAR(k
9780: 29 2c 20 43 48 41 52 28 6b 29 20 2d 3e 20 72 3d  ), CHAR(k) -> r=
9790: 28 6b 2f 34 2b 31 29 20 2a 2f 0a 20 20 20 20 20  (k/4+1) */.     
97a0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
97b0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
97c0: 20 20 20 20 7a 43 68 61 72 2b 2b 3b 0a 20 20 20      zChar++;.   
97d0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
97e0: 73 65 7b 0a 20 20 20 20 20 20 20 20 2a 70 73 7a  se{.        *psz
97f0: 45 73 74 20 3d 20 35 3b 20 20 20 2f 2a 20 42 4c  Est = 5;   /* BL
9800: 4f 42 2c 20 54 45 58 54 2c 20 43 4c 4f 42 20 2d  OB, TEXT, CLOB -
9810: 3e 20 72 3d 35 20 20 28 61 70 70 72 6f 78 20 32  > r=5  (approx 2
9820: 30 20 62 79 74 65 73 29 2a 2f 0a 20 20 20 20 20  0 bytes)*/.     
9830: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72   }.    }.  }.  r
9840: 65 74 75 72 6e 20 61 66 66 3b 0a 7d 0a 0a 2f 2a  eturn aff;.}../*
9850: 0a 2a 2a 20 54 68 65 20 65 78 70 72 65 73 73 69  .** The expressi
9860: 6f 6e 20 69 73 20 74 68 65 20 64 65 66 61 75 6c  on is the defaul
9870: 74 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20  t value for the 
9880: 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 61 64  most recently ad
9890: 64 65 64 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 6f 66  ded column.** of
98a0: 20 74 68 65 20 74 61 62 6c 65 20 63 75 72 72 65   the table curre
98b0: 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74  ntly under const
98c0: 72 75 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 44  ruction..**.** D
98d0: 65 66 61 75 6c 74 20 76 61 6c 75 65 20 65 78 70  efault value exp
98e0: 72 65 73 73 69 6f 6e 73 20 6d 75 73 74 20 62 65  ressions must be
98f0: 20 63 6f 6e 73 74 61 6e 74 2e 20 20 52 61 69 73   constant.  Rais
9900: 65 20 61 6e 20 65 78 63 65 70 74 69 6f 6e 20 69  e an exception i
9910: 66 20 74 68 69 73 0a 2a 2a 20 69 73 20 6e 6f 74  f this.** is not
9920: 20 74 68 65 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a   the case..**.**
9930: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
9940: 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20 70   called by the p
9950: 61 72 73 65 72 20 77 68 69 6c 65 20 69 6e 20 74  arser while in t
9960: 68 65 20 6d 69 64 64 6c 65 20 6f 66 0a 2a 2a 20  he middle of.** 
9970: 70 61 72 73 69 6e 67 20 61 20 43 52 45 41 54 45  parsing a CREATE
9980: 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74   TABLE statement
9990: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
99a0: 33 41 64 64 44 65 66 61 75 6c 74 56 61 6c 75 65  3AddDefaultValue
99b0: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
99c0: 45 78 70 72 53 70 61 6e 20 2a 70 53 70 61 6e 29  ExprSpan *pSpan)
99d0: 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20  {.  Table *p;.  
99e0: 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20  Column *pCol;.  
99f0: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
9a00: 61 72 73 65 2d 3e 64 62 3b 0a 20 20 70 20 3d 20  arse->db;.  p = 
9a10: 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
9a20: 65 3b 0a 20 20 69 66 28 20 70 21 3d 30 20 29 7b  e;.  if( p!=0 ){
9a30: 0a 20 20 20 20 70 43 6f 6c 20 3d 20 26 28 70 2d  .    pCol = &(p-
9a40: 3e 61 43 6f 6c 5b 70 2d 3e 6e 43 6f 6c 2d 31 5d  >aCol[p->nCol-1]
9a50: 29 3b 0a 20 20 20 20 69 66 28 20 21 73 71 6c 69  );.    if( !sqli
9a60: 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e  te3ExprIsConstan
9a70: 74 4f 72 46 75 6e 63 74 69 6f 6e 28 70 53 70 61  tOrFunction(pSpa
9a80: 6e 2d 3e 70 45 78 70 72 2c 20 64 62 2d 3e 69 6e  n->pExpr, db->in
9a90: 69 74 2e 62 75 73 79 29 20 29 7b 0a 20 20 20 20  it.busy) ){.    
9aa0: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
9ab0: 67 28 70 50 61 72 73 65 2c 20 22 64 65 66 61 75  g(pParse, "defau
9ac0: 6c 74 20 76 61 6c 75 65 20 6f 66 20 63 6f 6c 75  lt value of colu
9ad0: 6d 6e 20 5b 25 73 5d 20 69 73 20 6e 6f 74 20 63  mn [%s] is not c
9ae0: 6f 6e 73 74 61 6e 74 22 2c 0a 20 20 20 20 20 20  onstant",.      
9af0: 20 20 20 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 29      pCol->zName)
9b00: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
9b10: 20 20 20 2f 2a 20 41 20 63 6f 70 79 20 6f 66 20     /* A copy of 
9b20: 70 45 78 70 72 20 69 73 20 75 73 65 64 20 69 6e  pExpr is used in
9b30: 73 74 65 61 64 20 6f 66 20 74 68 65 20 6f 72 69  stead of the ori
9b40: 67 69 6e 61 6c 2c 20 61 73 20 70 45 78 70 72 20  ginal, as pExpr 
9b50: 63 6f 6e 74 61 69 6e 73 0a 20 20 20 20 20 20 2a  contains.      *
9b60: 2a 20 74 6f 6b 65 6e 73 20 74 68 61 74 20 70 6f  * tokens that po
9b70: 69 6e 74 20 74 6f 20 76 6f 6c 61 74 69 6c 65 20  int to volatile 
9b80: 6d 65 6d 6f 72 79 2e 20 54 68 65 20 27 73 70 61  memory. The 'spa
9b90: 6e 27 20 6f 66 20 74 68 65 20 65 78 70 72 65 73  n' of the expres
9ba0: 73 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 69 73  sion.      ** is
9bb0: 20 72 65 71 75 69 72 65 64 20 62 79 20 70 72 61   required by pra
9bc0: 67 6d 61 20 74 61 62 6c 65 5f 69 6e 66 6f 2e 0a  gma table_info..
9bd0: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 45        */.      E
9be0: 78 70 72 20 78 3b 0a 20 20 20 20 20 20 73 71 6c  xpr x;.      sql
9bf0: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64  ite3ExprDelete(d
9c00: 62 2c 20 70 43 6f 6c 2d 3e 70 44 66 6c 74 29 3b  b, pCol->pDflt);
9c10: 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26 78  .      memset(&x
9c20: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 78 29 29 3b  , 0, sizeof(x));
9c30: 0a 20 20 20 20 20 20 78 2e 6f 70 20 3d 20 54 4b  .      x.op = TK
9c40: 5f 53 50 41 4e 3b 0a 20 20 20 20 20 20 78 2e 75  _SPAN;.      x.u
9c50: 2e 7a 54 6f 6b 65 6e 20 3d 20 73 71 6c 69 74 65  .zToken = sqlite
9c60: 33 44 62 53 74 72 4e 44 75 70 28 64 62 2c 20 28  3DbStrNDup(db, (
9c70: 63 68 61 72 2a 29 70 53 70 61 6e 2d 3e 7a 53 74  char*)pSpan->zSt
9c80: 61 72 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20  art,.           
9c90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9ca0: 20 20 20 20 20 20 20 20 20 28 69 6e 74 29 28 70           (int)(p
9cb0: 53 70 61 6e 2d 3e 7a 45 6e 64 20 2d 20 70 53 70  Span->zEnd - pSp
9cc0: 61 6e 2d 3e 7a 53 74 61 72 74 29 29 3b 0a 20 20  an->zStart));.  
9cd0: 20 20 20 20 78 2e 70 4c 65 66 74 20 3d 20 70 53      x.pLeft = pS
9ce0: 70 61 6e 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20  pan->pExpr;.    
9cf0: 20 20 78 2e 66 6c 61 67 73 20 3d 20 45 50 5f 53    x.flags = EP_S
9d00: 6b 69 70 3b 0a 20 20 20 20 20 20 70 43 6f 6c 2d  kip;.      pCol-
9d10: 3e 70 44 66 6c 74 20 3d 20 73 71 6c 69 74 65 33  >pDflt = sqlite3
9d20: 45 78 70 72 44 75 70 28 64 62 2c 20 26 78 2c 20  ExprDup(db, &x, 
9d30: 45 58 50 52 44 55 50 5f 52 45 44 55 43 45 29 3b  EXPRDUP_REDUCE);
9d40: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62  .      sqlite3Db
9d50: 46 72 65 65 28 64 62 2c 20 78 2e 75 2e 7a 54 6f  Free(db, x.u.zTo
9d60: 6b 65 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ken);.    }.  }.
9d70: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
9d80: 65 74 65 28 64 62 2c 20 70 53 70 61 6e 2d 3e 70  ete(db, pSpan->p
9d90: 45 78 70 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Expr);.}../*.** 
9da0: 42 61 63 6b 77 61 72 64 73 20 43 6f 6d 70 61 74  Backwards Compat
9db0: 69 62 69 6c 69 74 79 20 48 61 63 6b 3a 0a 2a 2a  ibility Hack:.**
9dc0: 20 0a 2a 2a 20 48 69 73 74 6f 72 69 63 61 6c 20   .** Historical 
9dd0: 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69  versions of SQLi
9de0: 74 65 20 61 63 63 65 70 74 65 64 20 73 74 72 69  te accepted stri
9df0: 6e 67 73 20 61 73 20 63 6f 6c 75 6d 6e 20 6e 61  ngs as column na
9e00: 6d 65 73 20 69 6e 0a 2a 2a 20 69 6e 64 65 78 65  mes in.** indexe
9e10: 73 20 61 6e 64 20 50 52 49 4d 41 52 59 20 4b 45  s and PRIMARY KE
9e20: 59 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 61 6e  Y constraints an
9e30: 64 20 69 6e 20 55 4e 49 51 55 45 20 63 6f 6e 73  d in UNIQUE cons
9e40: 74 72 61 69 6e 74 73 2e 20 20 45 78 61 6d 70 6c  traints.  Exampl
9e50: 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 43 52 45  e:.**.**     CRE
9e60: 41 54 45 20 54 41 42 4c 45 20 78 79 7a 28 61 2c  ATE TABLE xyz(a,
9e70: 62 2c 63 2c 64 2c 65 2c 50 52 49 4d 41 52 59 20  b,c,d,e,PRIMARY 
9e80: 4b 45 59 28 27 61 27 29 2c 55 4e 49 51 55 45 28  KEY('a'),UNIQUE(
9e90: 27 62 27 2c 27 63 27 20 43 4f 4c 4c 41 54 45 20  'b','c' COLLATE 
9ea0: 74 72 69 6d 29 0a 2a 2a 20 20 20 20 20 43 52 45  trim).**     CRE
9eb0: 41 54 45 20 49 4e 44 45 58 20 61 62 63 20 4f 4e  ATE INDEX abc ON
9ec0: 20 78 79 7a 28 27 63 27 2c 27 64 27 20 44 45 53   xyz('c','d' DES
9ed0: 43 2c 27 65 27 20 43 4f 4c 4c 41 54 45 20 6e 6f  C,'e' COLLATE no
9ee0: 63 61 73 65 20 44 45 53 43 29 3b 0a 2a 2a 0a 2a  case DESC);.**.*
9ef0: 2a 20 54 68 69 73 20 69 73 20 67 6f 6f 66 79 2e  * This is goofy.
9f00: 20 20 42 75 74 20 74 6f 20 70 72 65 73 65 72 76    But to preserv
9f10: 65 20 62 61 63 6b 77 61 72 64 73 20 63 6f 6d 70  e backwards comp
9f20: 61 74 69 62 69 6c 69 74 79 20 77 65 20 63 6f 6e  atibility we con
9f30: 74 69 6e 75 65 20 74 6f 0a 2a 2a 20 61 63 63 65  tinue to.** acce
9f40: 70 74 20 69 74 2e 20 20 54 68 69 73 20 72 6f 75  pt it.  This rou
9f50: 74 69 6e 65 20 64 6f 65 73 20 74 68 65 20 6e 65  tine does the ne
9f60: 63 65 73 73 61 72 79 20 63 6f 6e 76 65 72 73 69  cessary conversi
9f70: 6f 6e 2e 20 20 49 74 20 63 6f 6e 76 65 72 74 73  on.  It converts
9f80: 0a 2a 2a 20 74 68 65 20 65 78 70 72 65 73 73 69  .** the expressi
9f90: 6f 6e 20 67 69 76 65 6e 20 69 6e 20 69 74 73 20  on given in its 
9fa0: 61 72 67 75 6d 65 6e 74 20 66 72 6f 6d 20 61 20  argument from a 
9fb0: 54 4b 5f 53 54 52 49 4e 47 20 69 6e 74 6f 20 61  TK_STRING into a
9fc0: 20 54 4b 5f 49 44 0a 2a 2a 20 69 66 20 74 68 65   TK_ID.** if the
9fd0: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 6a   expression is j
9fe0: 75 73 74 20 61 20 54 4b 5f 53 54 52 49 4e 47 20  ust a TK_STRING 
9ff0: 77 69 74 68 20 61 6e 20 6f 70 74 69 6f 6e 61 6c  with an optional
a000: 20 43 4f 4c 4c 41 54 45 20 63 6c 61 75 73 65 2e   COLLATE clause.
a010: 0a 2a 2a 20 49 66 20 74 68 65 20 65 70 78 72 65  .** If the epxre
a020: 73 73 69 6f 6e 20 69 73 20 61 6e 79 74 68 69 6e  ssion is anythin
a030: 67 20 6f 74 68 65 72 20 74 68 61 6e 20 54 4b 5f  g other than TK_
a040: 53 54 52 49 4e 47 2c 20 74 68 65 20 65 78 70 72  STRING, the expr
a050: 65 73 73 69 6f 6e 20 69 73 0a 2a 2a 20 75 6e 63  ession is.** unc
a060: 68 61 6e 67 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  hanged..*/.stati
a070: 63 20 76 6f 69 64 20 73 71 6c 69 74 65 33 53 74  c void sqlite3St
a080: 72 69 6e 67 54 6f 49 64 28 45 78 70 72 20 2a 70  ringToId(Expr *p
a090: 29 7b 0a 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d  ){.  if( p->op==
a0a0: 54 4b 5f 53 54 52 49 4e 47 20 29 7b 0a 20 20 20  TK_STRING ){.   
a0b0: 20 70 2d 3e 6f 70 20 3d 20 54 4b 5f 49 44 3b 0a   p->op = TK_ID;.
a0c0: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 6f    }else if( p->o
a0d0: 70 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45 20 26 26  p==TK_COLLATE &&
a0e0: 20 70 2d 3e 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54   p->pLeft->op==T
a0f0: 4b 5f 53 54 52 49 4e 47 20 29 7b 0a 20 20 20 20  K_STRING ){.    
a100: 70 2d 3e 70 4c 65 66 74 2d 3e 6f 70 20 3d 20 54  p->pLeft->op = T
a110: 4b 5f 49 44 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  K_ID;.  }.}../*.
a120: 2a 2a 20 44 65 73 69 67 6e 61 74 65 20 74 68 65  ** Designate the
a130: 20 50 52 49 4d 41 52 59 20 4b 45 59 20 66 6f 72   PRIMARY KEY for
a140: 20 74 68 65 20 74 61 62 6c 65 2e 20 20 70 4c 69   the table.  pLi
a150: 73 74 20 69 73 20 61 20 6c 69 73 74 20 6f 66 20  st is a list of 
a160: 6e 61 6d 65 73 20 0a 2a 2a 20 6f 66 20 63 6f 6c  names .** of col
a170: 75 6d 6e 73 20 74 68 61 74 20 66 6f 72 6d 20 74  umns that form t
a180: 68 65 20 70 72 69 6d 61 72 79 20 6b 65 79 2e 20  he primary key. 
a190: 20 49 66 20 70 4c 69 73 74 20 69 73 20 4e 55 4c   If pList is NUL
a1a0: 4c 2c 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20 6d  L, then the.** m
a1b0: 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 61 64 64  ost recently add
a1c0: 65 64 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65  ed column of the
a1d0: 20 74 61 62 6c 65 20 69 73 20 74 68 65 20 70 72   table is the pr
a1e0: 69 6d 61 72 79 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a  imary key..**.**
a1f0: 20 41 20 74 61 62 6c 65 20 63 61 6e 20 68 61 76   A table can hav
a200: 65 20 61 74 20 6d 6f 73 74 20 6f 6e 65 20 70 72  e at most one pr
a210: 69 6d 61 72 79 20 6b 65 79 2e 20 20 49 66 20 74  imary key.  If t
a220: 68 65 20 74 61 62 6c 65 20 61 6c 72 65 61 64 79  he table already
a230: 20 68 61 73 0a 2a 2a 20 61 20 70 72 69 6d 61 72   has.** a primar
a240: 79 20 6b 65 79 20 28 61 6e 64 20 74 68 69 73 20  y key (and this 
a250: 69 73 20 74 68 65 20 73 65 63 6f 6e 64 20 70 72  is the second pr
a260: 69 6d 61 72 79 20 6b 65 79 29 20 74 68 65 6e 20  imary key) then 
a270: 63 72 65 61 74 65 20 61 6e 0a 2a 2a 20 65 72 72  create an.** err
a280: 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  or..**.** If the
a290: 20 50 52 49 4d 41 52 59 20 4b 45 59 20 69 73 20   PRIMARY KEY is 
a2a0: 6f 6e 20 61 20 73 69 6e 67 6c 65 20 63 6f 6c 75  on a single colu
a2b0: 6d 6e 20 77 68 6f 73 65 20 64 61 74 61 74 79 70  mn whose datatyp
a2c0: 65 20 69 73 20 49 4e 54 45 47 45 52 2c 0a 2a 2a  e is INTEGER,.**
a2d0: 20 74 68 65 6e 20 77 65 20 77 69 6c 6c 20 74 72   then we will tr
a2e0: 79 20 74 6f 20 75 73 65 20 74 68 61 74 20 63 6f  y to use that co
a2f0: 6c 75 6d 6e 20 61 73 20 74 68 65 20 72 6f 77 69  lumn as the rowi
a300: 64 2e 20 20 53 65 74 20 74 68 65 20 54 61 62 6c  d.  Set the Tabl
a310: 65 2e 69 50 4b 65 79 0a 2a 2a 20 66 69 65 6c 64  e.iPKey.** field
a320: 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 75 6e   of the table un
a330: 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e  der construction
a340: 20 74 6f 20 62 65 20 74 68 65 20 69 6e 64 65 78   to be the index
a350: 20 6f 66 20 74 68 65 0a 2a 2a 20 49 4e 54 45 47   of the.** INTEG
a360: 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 20 63  ER PRIMARY KEY c
a370: 6f 6c 75 6d 6e 2e 20 20 54 61 62 6c 65 2e 69 50  olumn.  Table.iP
a380: 4b 65 79 20 69 73 20 73 65 74 20 74 6f 20 2d 31  Key is set to -1
a390: 20 69 66 20 74 68 65 72 65 20 69 73 0a 2a 2a 20   if there is.** 
a3a0: 6e 6f 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41  no INTEGER PRIMA
a3b0: 52 59 20 4b 45 59 2e 0a 2a 2a 0a 2a 2a 20 49 66  RY KEY..**.** If
a3c0: 20 74 68 65 20 6b 65 79 20 69 73 20 6e 6f 74 20   the key is not 
a3d0: 61 6e 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41  an INTEGER PRIMA
a3e0: 52 59 20 4b 45 59 2c 20 74 68 65 6e 20 63 72 65  RY KEY, then cre
a3f0: 61 74 65 20 61 20 75 6e 69 71 75 65 0a 2a 2a 20  ate a unique.** 
a400: 69 6e 64 65 78 20 66 6f 72 20 74 68 65 20 6b 65  index for the ke
a410: 79 2e 20 20 4e 6f 20 69 6e 64 65 78 20 69 73 20  y.  No index is 
a420: 63 72 65 61 74 65 64 20 66 6f 72 20 49 4e 54 45  created for INTE
a430: 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 73  GER PRIMARY KEYs
a440: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
a450: 33 41 64 64 50 72 69 6d 61 72 79 4b 65 79 28 0a  3AddPrimaryKey(.
a460: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
a470: 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
a480: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72  ontext */.  Expr
a490: 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 2f 2a  List *pList,  /*
a4a0: 20 4c 69 73 74 20 6f 66 20 66 69 65 6c 64 20 6e   List of field n
a4b0: 61 6d 65 73 20 74 6f 20 62 65 20 69 6e 64 65 78  ames to be index
a4c0: 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 6e 45 72  ed */.  int onEr
a4d0: 72 6f 72 2c 20 20 20 20 20 20 2f 2a 20 57 68 61  ror,      /* Wha
a4e0: 74 20 74 6f 20 64 6f 20 77 69 74 68 20 61 20 75  t to do with a u
a4f0: 6e 69 71 75 65 6e 65 73 73 20 63 6f 6e 66 6c 69  niqueness confli
a500: 63 74 20 2a 2f 0a 20 20 69 6e 74 20 61 75 74 6f  ct */.  int auto
a510: 49 6e 63 2c 20 20 20 20 20 20 2f 2a 20 54 72 75  Inc,      /* Tru
a520: 65 20 69 66 20 74 68 65 20 41 55 54 4f 49 4e 43  e if the AUTOINC
a530: 52 45 4d 45 4e 54 20 6b 65 79 77 6f 72 64 20 69  REMENT keyword i
a540: 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a 20 20 69  s present */.  i
a550: 6e 74 20 73 6f 72 74 4f 72 64 65 72 20 20 20 20  nt sortOrder    
a560: 20 2f 2a 20 53 51 4c 49 54 45 5f 53 4f 5f 41 53   /* SQLITE_SO_AS
a570: 43 20 6f 72 20 53 51 4c 49 54 45 5f 53 4f 5f 44  C or SQLITE_SO_D
a580: 45 53 43 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c  ESC */.){.  Tabl
a590: 65 20 2a 70 54 61 62 20 3d 20 70 50 61 72 73 65  e *pTab = pParse
a5a0: 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 43  ->pNewTable;.  C
a5b0: 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 20 3d 20 30 3b  olumn *pCol = 0;
a5c0: 0a 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 2d 31  .  int iCol = -1
a5d0: 2c 20 69 3b 0a 20 20 69 6e 74 20 6e 54 65 72 6d  , i;.  int nTerm
a5e0: 3b 0a 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20  ;.  if( pTab==0 
a5f0: 7c 7c 20 49 4e 5f 44 45 43 4c 41 52 45 5f 56 54  || IN_DECLARE_VT
a600: 41 42 20 29 20 67 6f 74 6f 20 70 72 69 6d 61 72  AB ) goto primar
a610: 79 5f 6b 65 79 5f 65 78 69 74 3b 0a 20 20 69 66  y_key_exit;.  if
a620: 28 20 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73  ( pTab->tabFlags
a630: 20 26 20 54 46 5f 48 61 73 50 72 69 6d 61 72 79   & TF_HasPrimary
a640: 4b 65 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  Key ){.    sqlit
a650: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
a660: 65 2c 20 0a 20 20 20 20 20 20 22 74 61 62 6c 65  e, .      "table
a670: 20 5c 22 25 73 5c 22 20 68 61 73 20 6d 6f 72 65   \"%s\" has more
a680: 20 74 68 61 6e 20 6f 6e 65 20 70 72 69 6d 61 72   than one primar
a690: 79 20 6b 65 79 22 2c 20 70 54 61 62 2d 3e 7a 4e  y key", pTab->zN
a6a0: 61 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20 70  ame);.    goto p
a6b0: 72 69 6d 61 72 79 5f 6b 65 79 5f 65 78 69 74 3b  rimary_key_exit;
a6c0: 0a 20 20 7d 0a 20 20 70 54 61 62 2d 3e 74 61 62  .  }.  pTab->tab
a6d0: 46 6c 61 67 73 20 7c 3d 20 54 46 5f 48 61 73 50  Flags |= TF_HasP
a6e0: 72 69 6d 61 72 79 4b 65 79 3b 0a 20 20 69 66 28  rimaryKey;.  if(
a6f0: 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20   pList==0 ){.   
a700: 20 69 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 6e 43   iCol = pTab->nC
a710: 6f 6c 20 2d 20 31 3b 0a 20 20 20 20 70 43 6f 6c  ol - 1;.    pCol
a720: 20 3d 20 26 70 54 61 62 2d 3e 61 43 6f 6c 5b 69   = &pTab->aCol[i
a730: 43 6f 6c 5d 3b 0a 20 20 20 20 70 43 6f 6c 2d 3e  Col];.    pCol->
a740: 63 6f 6c 46 6c 61 67 73 20 7c 3d 20 43 4f 4c 46  colFlags |= COLF
a750: 4c 41 47 5f 50 52 49 4d 4b 45 59 3b 0a 20 20 20  LAG_PRIMKEY;.   
a760: 20 6e 54 65 72 6d 20 3d 20 31 3b 0a 20 20 7d 65   nTerm = 1;.  }e
a770: 6c 73 65 7b 0a 20 20 20 20 6e 54 65 72 6d 20 3d  lse{.    nTerm =
a780: 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20   pList->nExpr;. 
a790: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 54     for(i=0; i<nT
a7a0: 65 72 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  erm; i++){.     
a7b0: 20 45 78 70 72 20 2a 70 43 45 78 70 72 20 3d 20   Expr *pCExpr = 
a7c0: 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43  sqlite3ExprSkipC
a7d0: 6f 6c 6c 61 74 65 28 70 4c 69 73 74 2d 3e 61 5b  ollate(pList->a[
a7e0: 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20  i].pExpr);.     
a7f0: 20 61 73 73 65 72 74 28 20 70 43 45 78 70 72 21   assert( pCExpr!
a800: 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  =0 );.      sqli
a810: 74 65 33 53 74 72 69 6e 67 54 6f 49 64 28 70 43  te3StringToId(pC
a820: 45 78 70 72 29 3b 0a 20 20 20 20 20 20 69 66 28  Expr);.      if(
a830: 20 70 43 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f   pCExpr->op==TK_
a840: 49 44 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f  ID ){.        co
a850: 6e 73 74 20 63 68 61 72 20 2a 7a 43 4e 61 6d 65  nst char *zCName
a860: 20 3d 20 70 43 45 78 70 72 2d 3e 75 2e 7a 54 6f   = pCExpr->u.zTo
a870: 6b 65 6e 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  ken;.        for
a880: 28 69 43 6f 6c 3d 30 3b 20 69 43 6f 6c 3c 70 54  (iCol=0; iCol<pT
a890: 61 62 2d 3e 6e 43 6f 6c 3b 20 69 43 6f 6c 2b 2b  ab->nCol; iCol++
a8a0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
a8b0: 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
a8c0: 7a 43 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 61 43  zCName, pTab->aC
a8d0: 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 29 3d  ol[iCol].zName)=
a8e0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
a8f0: 20 20 70 43 6f 6c 20 3d 20 26 70 54 61 62 2d 3e    pCol = &pTab->
a900: 61 43 6f 6c 5b 69 43 6f 6c 5d 3b 0a 20 20 20 20  aCol[iCol];.    
a910: 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 63 6f          pCol->co
a920: 6c 46 6c 61 67 73 20 7c 3d 20 43 4f 4c 46 4c 41  lFlags |= COLFLA
a930: 47 5f 50 52 49 4d 4b 45 59 3b 0a 20 20 20 20 20  G_PRIMKEY;.     
a940: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
a950: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
a960: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
a970: 7d 0a 20 20 7d 0a 20 20 69 66 28 20 6e 54 65 72  }.  }.  if( nTer
a980: 6d 3d 3d 31 0a 20 20 20 26 26 20 70 43 6f 6c 0a  m==1.   && pCol.
a990: 20 20 20 26 26 20 73 71 6c 69 74 65 33 53 74 72     && sqlite3Str
a9a0: 49 43 6d 70 28 73 71 6c 69 74 65 33 43 6f 6c 75  ICmp(sqlite3Colu
a9b0: 6d 6e 54 79 70 65 28 70 43 6f 6c 2c 22 22 29 2c  mnType(pCol,""),
a9c0: 20 22 49 4e 54 45 47 45 52 22 29 3d 3d 30 0a 20   "INTEGER")==0. 
a9d0: 20 20 26 26 20 73 6f 72 74 4f 72 64 65 72 21 3d    && sortOrder!=
a9e0: 53 51 4c 49 54 45 5f 53 4f 5f 44 45 53 43 0a 20  SQLITE_SO_DESC. 
a9f0: 20 29 7b 0a 20 20 20 20 70 54 61 62 2d 3e 69 50   ){.    pTab->iP
aa00: 4b 65 79 20 3d 20 69 43 6f 6c 3b 0a 20 20 20 20  Key = iCol;.    
aa10: 70 54 61 62 2d 3e 6b 65 79 43 6f 6e 66 20 3d 20  pTab->keyConf = 
aa20: 28 75 38 29 6f 6e 45 72 72 6f 72 3b 0a 20 20 20  (u8)onError;.   
aa30: 20 61 73 73 65 72 74 28 20 61 75 74 6f 49 6e 63   assert( autoInc
aa40: 3d 3d 30 20 7c 7c 20 61 75 74 6f 49 6e 63 3d 3d  ==0 || autoInc==
aa50: 31 20 29 3b 0a 20 20 20 20 70 54 61 62 2d 3e 74  1 );.    pTab->t
aa60: 61 62 46 6c 61 67 73 20 7c 3d 20 61 75 74 6f 49  abFlags |= autoI
aa70: 6e 63 2a 54 46 5f 41 75 74 6f 69 6e 63 72 65 6d  nc*TF_Autoincrem
aa80: 65 6e 74 3b 0a 20 20 20 20 69 66 28 20 70 4c 69  ent;.    if( pLi
aa90: 73 74 20 29 20 70 50 61 72 73 65 2d 3e 69 50 6b  st ) pParse->iPk
aaa0: 53 6f 72 74 4f 72 64 65 72 20 3d 20 70 4c 69 73  SortOrder = pLis
aab0: 74 2d 3e 61 5b 30 5d 2e 73 6f 72 74 4f 72 64 65  t->a[0].sortOrde
aac0: 72 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 61  r;.  }else if( a
aad0: 75 74 6f 49 6e 63 20 29 7b 0a 23 69 66 6e 64 65  utoInc ){.#ifnde
aae0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
aaf0: 54 4f 49 4e 43 52 45 4d 45 4e 54 0a 20 20 20 20  TOINCREMENT.    
ab00: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
ab10: 70 50 61 72 73 65 2c 20 22 41 55 54 4f 49 4e 43  pParse, "AUTOINC
ab20: 52 45 4d 45 4e 54 20 69 73 20 6f 6e 6c 79 20 61  REMENT is only a
ab30: 6c 6c 6f 77 65 64 20 6f 6e 20 61 6e 20 22 0a 20  llowed on an ". 
ab40: 20 20 20 20 20 20 22 49 4e 54 45 47 45 52 20 50        "INTEGER P
ab50: 52 49 4d 41 52 59 20 4b 45 59 22 29 3b 0a 23 65  RIMARY KEY");.#e
ab60: 6e 64 69 66 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ndif.  }else{.  
ab70: 20 20 49 6e 64 65 78 20 2a 70 3b 0a 20 20 20 20    Index *p;.    
ab80: 70 20 3d 20 73 71 6c 69 74 65 33 43 72 65 61 74  p = sqlite3Creat
ab90: 65 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 30  eIndex(pParse, 0
aba0: 2c 20 30 2c 20 30 2c 20 70 4c 69 73 74 2c 20 6f  , 0, 0, pList, o
abb0: 6e 45 72 72 6f 72 2c 20 30 2c 0a 20 20 20 20 20  nError, 0,.     
abc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
abd0: 20 20 20 20 20 20 30 2c 20 73 6f 72 74 4f 72 64        0, sortOrd
abe0: 65 72 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  er, 0);.    if( 
abf0: 70 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 69 64  p ){.      p->id
ac00: 78 54 79 70 65 20 3d 20 53 51 4c 49 54 45 5f 49  xType = SQLITE_I
ac10: 44 58 54 59 50 45 5f 50 52 49 4d 41 52 59 4b 45  DXTYPE_PRIMARYKE
ac20: 59 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c 69  Y;.    }.    pLi
ac30: 73 74 20 3d 20 30 3b 0a 20 20 7d 0a 0a 70 72 69  st = 0;.  }..pri
ac40: 6d 61 72 79 5f 6b 65 79 5f 65 78 69 74 3a 0a 20  mary_key_exit:. 
ac50: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
ac60: 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64  Delete(pParse->d
ac70: 62 2c 20 70 4c 69 73 74 29 3b 0a 20 20 72 65 74  b, pList);.  ret
ac80: 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64  urn;.}../*.** Ad
ac90: 64 20 61 20 6e 65 77 20 43 48 45 43 4b 20 63 6f  d a new CHECK co
aca0: 6e 73 74 72 61 69 6e 74 20 74 6f 20 74 68 65 20  nstraint to the 
acb0: 74 61 62 6c 65 20 63 75 72 72 65 6e 74 6c 79 20  table currently 
acc0: 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69  under constructi
acd0: 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  on..*/.void sqli
ace0: 74 65 33 41 64 64 43 68 65 63 6b 43 6f 6e 73 74  te3AddCheckConst
acf0: 72 61 69 6e 74 28 0a 20 20 50 61 72 73 65 20 2a  raint(.  Parse *
ad00: 70 50 61 72 73 65 2c 20 20 20 20 2f 2a 20 50 61  pParse,    /* Pa
ad10: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
ad20: 0a 20 20 45 78 70 72 20 2a 70 43 68 65 63 6b 45  .  Expr *pCheckE
ad30: 78 70 72 20 20 2f 2a 20 54 68 65 20 63 68 65 63  xpr  /* The chec
ad40: 6b 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a  k expression */.
ad50: 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ){.#ifndef SQLIT
ad60: 45 5f 4f 4d 49 54 5f 43 48 45 43 4b 0a 20 20 54  E_OMIT_CHECK.  T
ad70: 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 50 61  able *pTab = pPa
ad80: 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a  rse->pNewTable;.
ad90: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
ada0: 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66  pParse->db;.  if
adb0: 28 20 70 54 61 62 20 26 26 20 21 49 4e 5f 44 45  ( pTab && !IN_DE
adc0: 43 4c 41 52 45 5f 56 54 41 42 0a 20 20 20 26 26  CLARE_VTAB.   &&
add0: 20 21 73 71 6c 69 74 65 33 42 74 72 65 65 49 73   !sqlite3BtreeIs
ade0: 52 65 61 64 6f 6e 6c 79 28 64 62 2d 3e 61 44 62  Readonly(db->aDb
adf0: 5b 64 62 2d 3e 69 6e 69 74 2e 69 44 62 5d 2e 70  [db->init.iDb].p
ae00: 42 74 29 0a 20 20 29 7b 0a 20 20 20 20 70 54 61  Bt).  ){.    pTa
ae10: 62 2d 3e 70 43 68 65 63 6b 20 3d 20 73 71 6c 69  b->pCheck = sqli
ae20: 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e  te3ExprListAppen
ae30: 64 28 70 50 61 72 73 65 2c 20 70 54 61 62 2d 3e  d(pParse, pTab->
ae40: 70 43 68 65 63 6b 2c 20 70 43 68 65 63 6b 45 78  pCheck, pCheckEx
ae50: 70 72 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61  pr);.    if( pPa
ae60: 72 73 65 2d 3e 63 6f 6e 73 74 72 61 69 6e 74 4e  rse->constraintN
ae70: 61 6d 65 2e 6e 20 29 7b 0a 20 20 20 20 20 20 73  ame.n ){.      s
ae80: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 53 65  qlite3ExprListSe
ae90: 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 70 54  tName(pParse, pT
aea0: 61 62 2d 3e 70 43 68 65 63 6b 2c 20 26 70 50 61  ab->pCheck, &pPa
aeb0: 72 73 65 2d 3e 63 6f 6e 73 74 72 61 69 6e 74 4e  rse->constraintN
aec0: 61 6d 65 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20  ame, 1);.    }. 
aed0: 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20   }else.#endif.  
aee0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  {.    sqlite3Exp
aef0: 72 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e  rDelete(pParse->
af00: 64 62 2c 20 70 43 68 65 63 6b 45 78 70 72 29 3b  db, pCheckExpr);
af10: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  .  }.}../*.** Se
af20: 74 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20  t the collation 
af30: 66 75 6e 63 74 69 6f 6e 20 6f 66 20 74 68 65 20  function of the 
af40: 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 70 61  most recently pa
af50: 72 73 65 64 20 74 61 62 6c 65 20 63 6f 6c 75 6d  rsed table colum
af60: 6e 0a 2a 2a 20 74 6f 20 74 68 65 20 43 6f 6c 6c  n.** to the Coll
af70: 53 65 71 20 67 69 76 65 6e 2e 0a 2a 2f 0a 76 6f  Seq given..*/.vo
af80: 69 64 20 73 71 6c 69 74 65 33 41 64 64 43 6f 6c  id sqlite3AddCol
af90: 6c 61 74 65 54 79 70 65 28 50 61 72 73 65 20 2a  lateType(Parse *
afa0: 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70  pParse, Token *p
afb0: 54 6f 6b 65 6e 29 7b 0a 20 20 54 61 62 6c 65 20  Token){.  Table 
afc0: 2a 70 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63  *p;.  int i;.  c
afd0: 68 61 72 20 2a 7a 43 6f 6c 6c 3b 20 20 20 20 20  har *zColl;     
afe0: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65 71 75           /* Dequ
aff0: 6f 74 65 64 20 6e 61 6d 65 20 6f 66 20 63 6f 6c  oted name of col
b000: 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20  lation sequence 
b010: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
b020: 3b 0a 0a 20 20 69 66 28 20 28 70 20 3d 20 70 50  ;..  if( (p = pP
b030: 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29  arse->pNewTable)
b040: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
b050: 69 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20  i = p->nCol-1;. 
b060: 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62   db = pParse->db
b070: 3b 0a 20 20 7a 43 6f 6c 6c 20 3d 20 73 71 6c 69  ;.  zColl = sqli
b080: 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e  te3NameFromToken
b090: 28 64 62 2c 20 70 54 6f 6b 65 6e 29 3b 0a 20 20  (db, pToken);.  
b0a0: 69 66 28 20 21 7a 43 6f 6c 6c 20 29 20 72 65 74  if( !zColl ) ret
b0b0: 75 72 6e 3b 0a 0a 20 20 69 66 28 20 73 71 6c 69  urn;..  if( sqli
b0c0: 74 65 33 4c 6f 63 61 74 65 43 6f 6c 6c 53 65 71  te3LocateCollSeq
b0d0: 28 70 50 61 72 73 65 2c 20 7a 43 6f 6c 6c 29 20  (pParse, zColl) 
b0e0: 29 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49  ){.    Index *pI
b0f0: 64 78 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  dx;.    sqlite3D
b100: 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 61 43 6f  bFree(db, p->aCo
b110: 6c 5b 69 5d 2e 7a 43 6f 6c 6c 29 3b 0a 20 20 20  l[i].zColl);.   
b120: 20 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 43 6f 6c   p->aCol[i].zCol
b130: 6c 20 3d 20 7a 43 6f 6c 6c 3b 0a 20 20 0a 20 20  l = zColl;.  .  
b140: 20 20 2f 2a 20 49 66 20 74 68 65 20 63 6f 6c 75    /* If the colu
b150: 6d 6e 20 69 73 20 64 65 63 6c 61 72 65 64 20 61  mn is declared a
b160: 73 20 22 3c 6e 61 6d 65 3e 20 50 52 49 4d 41 52  s "<name> PRIMAR
b170: 59 20 4b 45 59 20 43 4f 4c 4c 41 54 45 20 3c 74  Y KEY COLLATE <t
b180: 79 70 65 3e 22 2c 0a 20 20 20 20 2a 2a 20 74 68  ype>",.    ** th
b190: 65 6e 20 61 6e 20 69 6e 64 65 78 20 6d 61 79 20  en an index may 
b1a0: 68 61 76 65 20 62 65 65 6e 20 63 72 65 61 74 65  have been create
b1b0: 64 20 6f 6e 20 74 68 69 73 20 63 6f 6c 75 6d 6e  d on this column
b1c0: 20 62 65 66 6f 72 65 20 74 68 65 0a 20 20 20 20   before the.    
b1d0: 2a 2a 20 63 6f 6c 6c 61 74 69 6f 6e 20 74 79 70  ** collation typ
b1e0: 65 20 77 61 73 20 61 64 64 65 64 2e 20 43 6f 72  e was added. Cor
b1f0: 72 65 63 74 20 74 68 69 73 20 69 66 20 69 74 20  rect this if it 
b200: 69 73 20 74 68 65 20 63 61 73 65 2e 0a 20 20 20  is the case..   
b210: 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70 49 64 78   */.    for(pIdx
b220: 3d 70 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78  =p->pIndex; pIdx
b230: 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65  ; pIdx=pIdx->pNe
b240: 78 74 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  xt){.      asser
b250: 74 28 20 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c  t( pIdx->nKeyCol
b260: 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ==1 );.      if(
b270: 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b   pIdx->aiColumn[
b280: 30 5d 3d 3d 69 20 29 7b 0a 20 20 20 20 20 20 20  0]==i ){.       
b290: 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 30 5d   pIdx->azColl[0]
b2a0: 20 3d 20 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 43   = p->aCol[i].zC
b2b0: 6f 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  oll;.      }.   
b2c0: 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
b2d0: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
b2e0: 2c 20 7a 43 6f 6c 6c 29 3b 0a 20 20 7d 0a 7d 0a  , zColl);.  }.}.
b2f0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
b300: 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 74 68 65  tion returns the
b310: 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
b320: 6e 63 65 20 66 6f 72 20 64 61 74 61 62 61 73 65  nce for database
b330: 20 6e 61 74 69 76 65 20 74 65 78 74 0a 2a 2a 20   native text.** 
b340: 65 6e 63 6f 64 69 6e 67 20 69 64 65 6e 74 69 66  encoding identif
b350: 69 65 64 20 62 79 20 74 68 65 20 73 74 72 69 6e  ied by the strin
b360: 67 20 7a 4e 61 6d 65 2c 20 6c 65 6e 67 74 68 20  g zName, length 
b370: 6e 4e 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  nName..**.** If 
b380: 74 68 65 20 72 65 71 75 65 73 74 65 64 20 63 6f  the requested co
b390: 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
b3a0: 20 69 73 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c   is not availabl
b3b0: 65 2c 20 6f 72 20 6e 6f 74 20 61 76 61 69 6c 61  e, or not availa
b3c0: 62 6c 65 0a 2a 2a 20 69 6e 20 74 68 65 20 64 61  ble.** in the da
b3d0: 74 61 62 61 73 65 20 6e 61 74 69 76 65 20 65 6e  tabase native en
b3e0: 63 6f 64 69 6e 67 2c 20 74 68 65 20 63 6f 6c 6c  coding, the coll
b3f0: 61 74 69 6f 6e 20 66 61 63 74 6f 72 79 20 69 73  ation factory is
b400: 20 69 6e 76 6f 6b 65 64 20 74 6f 0a 2a 2a 20 72   invoked to.** r
b410: 65 71 75 65 73 74 20 69 74 2e 20 49 66 20 74 68  equest it. If th
b420: 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 61 63 74  e collation fact
b430: 6f 72 79 20 64 6f 65 73 20 6e 6f 74 20 73 75 70  ory does not sup
b440: 70 6c 79 20 73 75 63 68 20 61 20 73 65 71 75 65  ply such a seque
b450: 6e 63 65 2c 0a 2a 2a 20 61 6e 64 20 74 68 65 20  nce,.** and the 
b460: 73 65 71 75 65 6e 63 65 20 69 73 20 61 76 61 69  sequence is avai
b470: 6c 61 62 6c 65 20 69 6e 20 61 6e 6f 74 68 65 72  lable in another
b480: 20 74 65 78 74 20 65 6e 63 6f 64 69 6e 67 2c 20   text encoding, 
b490: 74 68 65 6e 20 74 68 61 74 20 69 73 0a 2a 2a 20  then that is.** 
b4a0: 72 65 74 75 72 6e 65 64 20 69 6e 73 74 65 61 64  returned instead
b4b0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 20 76 65  ..**.** If no ve
b4c0: 72 73 69 6f 6e 73 20 6f 66 20 74 68 65 20 72 65  rsions of the re
b4d0: 71 75 65 73 74 65 64 20 63 6f 6c 6c 61 74 69 6f  quested collatio
b4e0: 6e 73 20 73 65 71 75 65 6e 63 65 20 61 72 65 20  ns sequence are 
b4f0: 61 76 61 69 6c 61 62 6c 65 2c 20 6f 72 0a 2a 2a  available, or.**
b500: 20 61 6e 6f 74 68 65 72 20 65 72 72 6f 72 20 6f   another error o
b510: 63 63 75 72 73 2c 20 4e 55 4c 4c 20 69 73 20 72  ccurs, NULL is r
b520: 65 74 75 72 6e 65 64 20 61 6e 64 20 61 6e 20 65  eturned and an e
b530: 72 72 6f 72 20 6d 65 73 73 61 67 65 20 77 72 69  rror message wri
b540: 74 74 65 6e 20 69 6e 74 6f 0a 2a 2a 20 70 50 61  tten into.** pPa
b550: 72 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  rse..**.** This 
b560: 72 6f 75 74 69 6e 65 20 69 73 20 61 20 77 72 61  routine is a wra
b570: 70 70 65 72 20 61 72 6f 75 6e 64 20 73 71 6c 69  pper around sqli
b580: 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28 29  te3FindCollSeq()
b590: 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a  .  This routine.
b5a0: 2a 2a 20 69 6e 76 6f 6b 65 73 20 74 68 65 20 63  ** invokes the c
b5b0: 6f 6c 6c 61 74 69 6f 6e 20 66 61 63 74 6f 72 79  ollation factory
b5c0: 20 69 66 20 74 68 65 20 6e 61 6d 65 64 20 63 6f   if the named co
b5d0: 6c 6c 61 74 69 6f 6e 20 63 61 6e 6e 6f 74 20 62  llation cannot b
b5e0: 65 20 66 6f 75 6e 64 0a 2a 2a 20 61 6e 64 20 67  e found.** and g
b5f0: 65 6e 65 72 61 74 65 73 20 61 6e 20 65 72 72 6f  enerates an erro
b600: 72 20 6d 65 73 73 61 67 65 2e 0a 2a 2a 0a 2a 2a  r message..**.**
b610: 20 53 65 65 20 61 6c 73 6f 3a 20 73 71 6c 69 74   See also: sqlit
b620: 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28 29 2c  e3FindCollSeq(),
b630: 20 73 71 6c 69 74 65 33 47 65 74 43 6f 6c 6c 53   sqlite3GetCollS
b640: 65 71 28 29 0a 2a 2f 0a 43 6f 6c 6c 53 65 71 20  eq().*/.CollSeq 
b650: 2a 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 43 6f  *sqlite3LocateCo
b660: 6c 6c 53 65 71 28 50 61 72 73 65 20 2a 70 50 61  llSeq(Parse *pPa
b670: 72 73 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  rse, const char 
b680: 2a 7a 4e 61 6d 65 29 7b 0a 20 20 73 71 6c 69 74  *zName){.  sqlit
b690: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
b6a0: 3e 64 62 3b 0a 20 20 75 38 20 65 6e 63 20 3d 20  >db;.  u8 enc = 
b6b0: 45 4e 43 28 64 62 29 3b 0a 20 20 75 38 20 69 6e  ENC(db);.  u8 in
b6c0: 69 74 62 75 73 79 20 3d 20 64 62 2d 3e 69 6e 69  itbusy = db->ini
b6d0: 74 2e 62 75 73 79 3b 0a 20 20 43 6f 6c 6c 53 65  t.busy;.  CollSe
b6e0: 71 20 2a 70 43 6f 6c 6c 3b 0a 0a 20 20 70 43 6f  q *pColl;..  pCo
b6f0: 6c 6c 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64  ll = sqlite3Find
b700: 43 6f 6c 6c 53 65 71 28 64 62 2c 20 65 6e 63 2c  CollSeq(db, enc,
b710: 20 7a 4e 61 6d 65 2c 20 69 6e 69 74 62 75 73 79   zName, initbusy
b720: 29 3b 0a 20 20 69 66 28 20 21 69 6e 69 74 62 75  );.  if( !initbu
b730: 73 79 20 26 26 20 28 21 70 43 6f 6c 6c 20 7c 7c  sy && (!pColl ||
b740: 20 21 70 43 6f 6c 6c 2d 3e 78 43 6d 70 29 20 29   !pColl->xCmp) )
b750: 7b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71  {.    pColl = sq
b760: 6c 69 74 65 33 47 65 74 43 6f 6c 6c 53 65 71 28  lite3GetCollSeq(
b770: 70 50 61 72 73 65 2c 20 65 6e 63 2c 20 70 43 6f  pParse, enc, pCo
b780: 6c 6c 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a  ll, zName);.  }.
b790: 0a 20 20 72 65 74 75 72 6e 20 70 43 6f 6c 6c 3b  .  return pColl;
b7a0: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  .}.../*.** Gener
b7b0: 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 77 69  ate code that wi
b7c0: 6c 6c 20 69 6e 63 72 65 6d 65 6e 74 20 74 68 65  ll increment the
b7d0: 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 2e 0a   schema cookie..
b7e0: 2a 2a 0a 2a 2a 20 54 68 65 20 73 63 68 65 6d 61  **.** The schema
b7f0: 20 63 6f 6f 6b 69 65 20 69 73 20 75 73 65 64 20   cookie is used 
b800: 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 77 68 65  to determine whe
b810: 6e 20 74 68 65 20 73 63 68 65 6d 61 20 66 6f 72  n the schema for
b820: 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65   the.** database
b830: 20 63 68 61 6e 67 65 73 2e 20 20 41 66 74 65 72   changes.  After
b840: 20 65 61 63 68 20 73 63 68 65 6d 61 20 63 68 61   each schema cha
b850: 6e 67 65 2c 20 74 68 65 20 63 6f 6f 6b 69 65 20  nge, the cookie 
b860: 76 61 6c 75 65 0a 2a 2a 20 63 68 61 6e 67 65 73  value.** changes
b870: 2e 20 20 57 68 65 6e 20 61 20 70 72 6f 63 65 73  .  When a proces
b880: 73 20 66 69 72 73 74 20 72 65 61 64 73 20 74 68  s first reads th
b890: 65 20 73 63 68 65 6d 61 20 69 74 20 72 65 63 6f  e schema it reco
b8a0: 72 64 73 20 74 68 65 0a 2a 2a 20 63 6f 6f 6b 69  rds the.** cooki
b8b0: 65 2e 20 20 54 68 65 72 65 61 66 74 65 72 2c 20  e.  Thereafter, 
b8c0: 77 68 65 6e 65 76 65 72 20 69 74 20 67 6f 65 73  whenever it goes
b8d0: 20 74 6f 20 61 63 63 65 73 73 20 74 68 65 20 64   to access the d
b8e0: 61 74 61 62 61 73 65 2c 0a 2a 2a 20 69 74 20 63  atabase,.** it c
b8f0: 68 65 63 6b 73 20 74 68 65 20 63 6f 6f 6b 69 65  hecks the cookie
b900: 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68   to make sure th
b910: 65 20 73 63 68 65 6d 61 20 68 61 73 20 6e 6f 74  e schema has not
b920: 20 63 68 61 6e 67 65 64 0a 2a 2a 20 73 69 6e 63   changed.** sinc
b930: 65 20 69 74 20 77 61 73 20 6c 61 73 74 20 72 65  e it was last re
b940: 61 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 70  ad..**.** This p
b950: 6c 61 6e 20 69 73 20 6e 6f 74 20 63 6f 6d 70 6c  lan is not compl
b960: 65 74 65 6c 79 20 62 75 6c 6c 65 74 2d 70 72 6f  etely bullet-pro
b970: 6f 66 2e 20 20 49 74 20 69 73 20 70 6f 73 73 69  of.  It is possi
b980: 62 6c 65 20 66 6f 72 0a 2a 2a 20 74 68 65 20 73  ble for.** the s
b990: 63 68 65 6d 61 20 74 6f 20 63 68 61 6e 67 65 20  chema to change 
b9a0: 6d 75 6c 74 69 70 6c 65 20 74 69 6d 65 73 20 61  multiple times a
b9b0: 6e 64 20 66 6f 72 20 74 68 65 20 63 6f 6f 6b 69  nd for the cooki
b9c0: 65 20 74 6f 20 62 65 0a 2a 2a 20 73 65 74 20 62  e to be.** set b
b9d0: 61 63 6b 20 74 6f 20 70 72 69 6f 72 20 76 61 6c  ack to prior val
b9e0: 75 65 2e 20 20 42 75 74 20 73 63 68 65 6d 61 20  ue.  But schema 
b9f0: 63 68 61 6e 67 65 73 20 61 72 65 20 69 6e 66 72  changes are infr
ba00: 65 71 75 65 6e 74 0a 2a 2a 20 61 6e 64 20 74 68  equent.** and th
ba10: 65 20 70 72 6f 62 61 62 69 6c 69 74 79 20 6f 66  e probability of
ba20: 20 68 69 74 74 69 6e 67 20 74 68 65 20 73 61 6d   hitting the sam
ba30: 65 20 63 6f 6f 6b 69 65 20 76 61 6c 75 65 20 69  e cookie value i
ba40: 73 20 6f 6e 6c 79 0a 2a 2a 20 31 20 63 68 61 6e  s only.** 1 chan
ba50: 63 65 20 69 6e 20 32 5e 33 32 2e 20 20 53 6f 20  ce in 2^32.  So 
ba60: 77 65 27 72 65 20 73 61 66 65 20 65 6e 6f 75 67  we're safe enoug
ba70: 68 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  h..*/.void sqlit
ba80: 65 33 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28 50  e3ChangeCookie(P
ba90: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e  arse *pParse, in
baa0: 74 20 69 44 62 29 7b 0a 20 20 73 71 6c 69 74 65  t iDb){.  sqlite
bab0: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
bac0: 64 62 3b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  db;.  Vdbe *v = 
bad0: 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
bae0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
baf0: 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28  SchemaMutexHeld(
bb00: 64 62 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a 20  db, iDb, 0) );. 
bb10: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
bb20: 70 33 28 76 2c 20 4f 50 5f 53 65 74 43 6f 6f 6b  p3(v, OP_SetCook
bb30: 69 65 2c 20 69 44 62 2c 20 42 54 52 45 45 5f 53  ie, iDb, BTREE_S
bb40: 43 48 45 4d 41 5f 56 45 52 53 49 4f 4e 2c 20 0a  CHEMA_VERSION, .
bb50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bb60: 20 20 20 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d      db->aDb[iDb]
bb70: 2e 70 53 63 68 65 6d 61 2d 3e 73 63 68 65 6d 61  .pSchema->schema
bb80: 5f 63 6f 6f 6b 69 65 2b 31 29 3b 0a 7d 0a 0a 2f  _cookie+1);.}../
bb90: 2a 0a 2a 2a 20 4d 65 61 73 75 72 65 20 74 68 65  *.** Measure the
bba0: 20 6e 75 6d 62 65 72 20 6f 66 20 63 68 61 72 61   number of chara
bbb0: 63 74 65 72 73 20 6e 65 65 64 65 64 20 74 6f 20  cters needed to 
bbc0: 6f 75 74 70 75 74 20 74 68 65 20 67 69 76 65 6e  output the given
bbd0: 0a 2a 2a 20 69 64 65 6e 74 69 66 69 65 72 2e 20  .** identifier. 
bbe0: 20 54 68 65 20 6e 75 6d 62 65 72 20 72 65 74 75   The number retu
bbf0: 72 6e 65 64 20 69 6e 63 6c 75 64 65 73 20 61 6e  rned includes an
bc00: 79 20 71 75 6f 74 65 73 20 75 73 65 64 0a 2a 2a  y quotes used.**
bc10: 20 62 75 74 20 64 6f 65 73 20 6e 6f 74 20 69 6e   but does not in
bc20: 63 6c 75 64 65 20 74 68 65 20 6e 75 6c 6c 20 74  clude the null t
bc30: 65 72 6d 69 6e 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a  erminator..**.**
bc40: 20 54 68 65 20 65 73 74 69 6d 61 74 65 20 69 73   The estimate is
bc50: 20 63 6f 6e 73 65 72 76 61 74 69 76 65 2e 20 20   conservative.  
bc60: 49 74 20 6d 69 67 68 74 20 62 65 20 6c 61 72 67  It might be larg
bc70: 65 72 20 74 68 61 74 20 77 68 61 74 20 69 73 0a  er that what is.
bc80: 2a 2a 20 72 65 61 6c 6c 79 20 6e 65 65 64 65 64  ** really needed
bc90: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
bca0: 69 64 65 6e 74 4c 65 6e 67 74 68 28 63 6f 6e 73  identLength(cons
bcb0: 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20 69 6e  t char *z){.  in
bcc0: 74 20 6e 3b 0a 20 20 66 6f 72 28 6e 3d 30 3b 20  t n;.  for(n=0; 
bcd0: 2a 7a 3b 20 6e 2b 2b 2c 20 7a 2b 2b 29 7b 0a 20  *z; n++, z++){. 
bce0: 20 20 20 69 66 28 20 2a 7a 3d 3d 27 22 27 20 29     if( *z=='"' )
bcf0: 7b 20 6e 2b 2b 3b 20 7d 0a 20 20 7d 0a 20 20 72  { n++; }.  }.  r
bd00: 65 74 75 72 6e 20 6e 20 2b 20 32 3b 0a 7d 0a 0a  eturn n + 2;.}..
bd10: 2f 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20  /*.** The first 
bd20: 70 61 72 61 6d 65 74 65 72 20 69 73 20 61 20 70  parameter is a p
bd30: 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 6f 75 74  ointer to an out
bd40: 70 75 74 20 62 75 66 66 65 72 2e 20 54 68 65 20  put buffer. The 
bd50: 73 65 63 6f 6e 64 20 0a 2a 2a 20 70 61 72 61 6d  second .** param
bd60: 65 74 65 72 20 69 73 20 61 20 70 6f 69 6e 74 65  eter is a pointe
bd70: 72 20 74 6f 20 61 6e 20 69 6e 74 65 67 65 72 20  r to an integer 
bd80: 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68  that contains th
bd90: 65 20 6f 66 66 73 65 74 20 61 74 0a 2a 2a 20 77  e offset at.** w
bda0: 68 69 63 68 20 74 6f 20 77 72 69 74 65 20 69 6e  hich to write in
bdb0: 74 6f 20 74 68 65 20 6f 75 74 70 75 74 20 62 75  to the output bu
bdc0: 66 66 65 72 2e 20 54 68 69 73 20 66 75 6e 63 74  ffer. This funct
bdd0: 69 6f 6e 20 63 6f 70 69 65 73 20 74 68 65 0a 2a  ion copies the.*
bde0: 2a 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64  * nul-terminated
bdf0: 20 73 74 72 69 6e 67 20 70 6f 69 6e 74 65 64 20   string pointed 
be00: 74 6f 20 62 79 20 74 68 65 20 74 68 69 72 64 20  to by the third 
be10: 70 61 72 61 6d 65 74 65 72 2c 20 7a 53 69 67 6e  parameter, zSign
be20: 65 64 49 64 65 6e 74 2c 0a 2a 2a 20 74 6f 20 74  edIdent,.** to t
be30: 68 65 20 73 70 65 63 69 66 69 65 64 20 6f 66 66  he specified off
be40: 73 65 74 20 69 6e 20 74 68 65 20 62 75 66 66 65  set in the buffe
be50: 72 20 61 6e 64 20 75 70 64 61 74 65 73 20 2a 70  r and updates *p
be60: 49 64 78 20 74 6f 20 72 65 66 65 72 0a 2a 2a 20  Idx to refer.** 
be70: 74 6f 20 74 68 65 20 66 69 72 73 74 20 62 79 74  to the first byt
be80: 65 20 61 66 74 65 72 20 74 68 65 20 6c 61 73 74  e after the last
be90: 20 62 79 74 65 20 77 72 69 74 74 65 6e 20 62 65   byte written be
bea0: 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a  fore returning..
beb0: 2a 2a 20 0a 2a 2a 20 49 66 20 74 68 65 20 73 74  ** .** If the st
bec0: 72 69 6e 67 20 7a 53 69 67 6e 65 64 49 64 65 6e  ring zSignedIden
bed0: 74 20 63 6f 6e 73 69 73 74 73 20 65 6e 74 69 72  t consists entir
bee0: 65 6c 79 20 6f 66 20 61 6c 70 68 61 2d 6e 75 6d  ely of alpha-num
bef0: 65 72 69 63 0a 2a 2a 20 63 68 61 72 61 63 74 65  eric.** characte
bf00: 72 73 2c 20 64 6f 65 73 20 6e 6f 74 20 62 65 67  rs, does not beg
bf10: 69 6e 20 77 69 74 68 20 61 20 64 69 67 69 74 20  in with a digit 
bf20: 61 6e 64 20 69 73 20 6e 6f 74 20 61 6e 20 53 51  and is not an SQ
bf30: 4c 20 6b 65 79 77 6f 72 64 2c 0a 2a 2a 20 74 68  L keyword,.** th
bf40: 65 6e 20 69 74 20 69 73 20 63 6f 70 69 65 64 20  en it is copied 
bf50: 74 6f 20 74 68 65 20 6f 75 74 70 75 74 20 62 75  to the output bu
bf60: 66 66 65 72 20 65 78 61 63 74 6c 79 20 61 73 20  ffer exactly as 
bf70: 69 74 20 69 73 2e 20 4f 74 68 65 72 77 69 73 65  it is. Otherwise
bf80: 2c 0a 2a 2a 20 69 74 20 69 73 20 71 75 6f 74 65  ,.** it is quote
bf90: 64 20 75 73 69 6e 67 20 64 6f 75 62 6c 65 2d 71  d using double-q
bfa0: 75 6f 74 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  uotes..*/.static
bfb0: 20 76 6f 69 64 20 69 64 65 6e 74 50 75 74 28 63   void identPut(c
bfc0: 68 61 72 20 2a 7a 2c 20 69 6e 74 20 2a 70 49 64  har *z, int *pId
bfd0: 78 2c 20 63 68 61 72 20 2a 7a 53 69 67 6e 65 64  x, char *zSigned
bfe0: 49 64 65 6e 74 29 7b 0a 20 20 75 6e 73 69 67 6e  Ident){.  unsign
bff0: 65 64 20 63 68 61 72 20 2a 7a 49 64 65 6e 74 20  ed char *zIdent 
c000: 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72  = (unsigned char
c010: 2a 29 7a 53 69 67 6e 65 64 49 64 65 6e 74 3b 0a  *)zSignedIdent;.
c020: 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6e 65 65 64    int i, j, need
c030: 51 75 6f 74 65 3b 0a 20 20 69 20 3d 20 2a 70 49  Quote;.  i = *pI
c040: 64 78 3b 0a 0a 20 20 66 6f 72 28 6a 3d 30 3b 20  dx;..  for(j=0; 
c050: 7a 49 64 65 6e 74 5b 6a 5d 3b 20 6a 2b 2b 29 7b  zIdent[j]; j++){
c060: 0a 20 20 20 20 69 66 28 20 21 73 71 6c 69 74 65  .    if( !sqlite
c070: 33 49 73 61 6c 6e 75 6d 28 7a 49 64 65 6e 74 5b  3Isalnum(zIdent[
c080: 6a 5d 29 20 26 26 20 7a 49 64 65 6e 74 5b 6a 5d  j]) && zIdent[j]
c090: 21 3d 27 5f 27 20 29 20 62 72 65 61 6b 3b 0a 20  !='_' ) break;. 
c0a0: 20 7d 0a 20 20 6e 65 65 64 51 75 6f 74 65 20 3d   }.  needQuote =
c0b0: 20 73 71 6c 69 74 65 33 49 73 64 69 67 69 74 28   sqlite3Isdigit(
c0c0: 7a 49 64 65 6e 74 5b 30 5d 29 0a 20 20 20 20 20  zIdent[0]).     
c0d0: 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65         || sqlite
c0e0: 33 4b 65 79 77 6f 72 64 43 6f 64 65 28 7a 49 64  3KeywordCode(zId
c0f0: 65 6e 74 2c 20 6a 29 21 3d 54 4b 5f 49 44 0a 20  ent, j)!=TK_ID. 
c100: 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 7a 49             || zI
c110: 64 65 6e 74 5b 6a 5d 21 3d 30 0a 20 20 20 20 20  dent[j]!=0.     
c120: 20 20 20 20 20 20 20 7c 7c 20 6a 3d 3d 30 3b 0a         || j==0;.
c130: 0a 20 20 69 66 28 20 6e 65 65 64 51 75 6f 74 65  .  if( needQuote
c140: 20 29 20 7a 5b 69 2b 2b 5d 20 3d 20 27 22 27 3b   ) z[i++] = '"';
c150: 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 7a 49 64 65  .  for(j=0; zIde
c160: 6e 74 5b 6a 5d 3b 20 6a 2b 2b 29 7b 0a 20 20 20  nt[j]; j++){.   
c170: 20 7a 5b 69 2b 2b 5d 20 3d 20 7a 49 64 65 6e 74   z[i++] = zIdent
c180: 5b 6a 5d 3b 0a 20 20 20 20 69 66 28 20 7a 49 64  [j];.    if( zId
c190: 65 6e 74 5b 6a 5d 3d 3d 27 22 27 20 29 20 7a 5b  ent[j]=='"' ) z[
c1a0: 69 2b 2b 5d 20 3d 20 27 22 27 3b 0a 20 20 7d 0a  i++] = '"';.  }.
c1b0: 20 20 69 66 28 20 6e 65 65 64 51 75 6f 74 65 20    if( needQuote 
c1c0: 29 20 7a 5b 69 2b 2b 5d 20 3d 20 27 22 27 3b 0a  ) z[i++] = '"';.
c1d0: 20 20 7a 5b 69 5d 20 3d 20 30 3b 0a 20 20 2a 70    z[i] = 0;.  *p
c1e0: 49 64 78 20 3d 20 69 3b 0a 7d 0a 0a 2f 2a 0a 2a  Idx = i;.}../*.*
c1f0: 2a 20 47 65 6e 65 72 61 74 65 20 61 20 43 52 45  * Generate a CRE
c200: 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d  ATE TABLE statem
c210: 65 6e 74 20 61 70 70 72 6f 70 72 69 61 74 65 20  ent appropriate 
c220: 66 6f 72 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a  for the given.**
c230: 20 74 61 62 6c 65 2e 20 20 4d 65 6d 6f 72 79 20   table.  Memory 
c240: 74 6f 20 68 6f 6c 64 20 74 68 65 20 74 65 78 74  to hold the text
c250: 20 6f 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e   of the statemen
c260: 74 20 69 73 20 6f 62 74 61 69 6e 65 64 0a 2a 2a  t is obtained.**
c270: 20 66 72 6f 6d 20 73 71 6c 69 74 65 4d 61 6c 6c   from sqliteMall
c280: 6f 63 28 29 20 61 6e 64 20 6d 75 73 74 20 62 65  oc() and must be
c290: 20 66 72 65 65 64 20 62 79 20 74 68 65 20 63 61   freed by the ca
c2a0: 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 2e 0a  lling function..
c2b0: 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a  */.static char *
c2c0: 63 72 65 61 74 65 54 61 62 6c 65 53 74 6d 74 28  createTableStmt(
c2d0: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 54 61 62  sqlite3 *db, Tab
c2e0: 6c 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 2c  le *p){.  int i,
c2f0: 20 6b 2c 20 6e 3b 0a 20 20 63 68 61 72 20 2a 7a   k, n;.  char *z
c300: 53 74 6d 74 3b 0a 20 20 63 68 61 72 20 2a 7a 53  Stmt;.  char *zS
c310: 65 70 2c 20 2a 7a 53 65 70 32 2c 20 2a 7a 45 6e  ep, *zSep2, *zEn
c320: 64 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f  d;.  Column *pCo
c330: 6c 3b 0a 20 20 6e 20 3d 20 30 3b 0a 20 20 66 6f  l;.  n = 0;.  fo
c340: 72 28 70 43 6f 6c 20 3d 20 70 2d 3e 61 43 6f 6c  r(pCol = p->aCol
c350: 2c 20 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6c  , i=0; i<p->nCol
c360: 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a  ; i++, pCol++){.
c370: 20 20 20 20 6e 20 2b 3d 20 69 64 65 6e 74 4c 65      n += identLe
c380: 6e 67 74 68 28 70 43 6f 6c 2d 3e 7a 4e 61 6d 65  ngth(pCol->zName
c390: 29 20 2b 20 35 3b 0a 20 20 7d 0a 20 20 6e 20 2b  ) + 5;.  }.  n +
c3a0: 3d 20 69 64 65 6e 74 4c 65 6e 67 74 68 28 70 2d  = identLength(p-
c3b0: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 6e  >zName);.  if( n
c3c0: 3c 35 30 20 29 7b 20 0a 20 20 20 20 7a 53 65 70  <50 ){ .    zSep
c3d0: 20 3d 20 22 22 3b 0a 20 20 20 20 7a 53 65 70 32   = "";.    zSep2
c3e0: 20 3d 20 22 2c 22 3b 0a 20 20 20 20 7a 45 6e 64   = ",";.    zEnd
c3f0: 20 3d 20 22 29 22 3b 0a 20 20 7d 65 6c 73 65 7b   = ")";.  }else{
c400: 0a 20 20 20 20 7a 53 65 70 20 3d 20 22 5c 6e 20  .    zSep = "\n 
c410: 20 22 3b 0a 20 20 20 20 7a 53 65 70 32 20 3d 20   ";.    zSep2 = 
c420: 22 2c 5c 6e 20 20 22 3b 0a 20 20 20 20 7a 45 6e  ",\n  ";.    zEn
c430: 64 20 3d 20 22 5c 6e 29 22 3b 0a 20 20 7d 0a 20  d = "\n)";.  }. 
c440: 20 6e 20 2b 3d 20 33 35 20 2b 20 36 2a 70 2d 3e   n += 35 + 6*p->
c450: 6e 43 6f 6c 3b 0a 20 20 7a 53 74 6d 74 20 3d 20  nCol;.  zStmt = 
c460: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52  sqlite3DbMallocR
c470: 61 77 28 30 2c 20 6e 29 3b 0a 20 20 69 66 28 20  aw(0, n);.  if( 
c480: 7a 53 74 6d 74 3d 3d 30 20 29 7b 0a 20 20 20 20  zStmt==0 ){.    
c490: 73 71 6c 69 74 65 33 4f 6f 6d 46 61 75 6c 74 28  sqlite3OomFault(
c4a0: 64 62 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  db);.    return 
c4b0: 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  0;.  }.  sqlite3
c4c0: 5f 73 6e 70 72 69 6e 74 66 28 6e 2c 20 7a 53 74  _snprintf(n, zSt
c4d0: 6d 74 2c 20 22 43 52 45 41 54 45 20 54 41 42 4c  mt, "CREATE TABL
c4e0: 45 20 22 29 3b 0a 20 20 6b 20 3d 20 73 71 6c 69  E ");.  k = sqli
c4f0: 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 53 74 6d  te3Strlen30(zStm
c500: 74 29 3b 0a 20 20 69 64 65 6e 74 50 75 74 28 7a  t);.  identPut(z
c510: 53 74 6d 74 2c 20 26 6b 2c 20 70 2d 3e 7a 4e 61  Stmt, &k, p->zNa
c520: 6d 65 29 3b 0a 20 20 7a 53 74 6d 74 5b 6b 2b 2b  me);.  zStmt[k++
c530: 5d 20 3d 20 27 28 27 3b 0a 20 20 66 6f 72 28 70  ] = '(';.  for(p
c540: 43 6f 6c 3d 70 2d 3e 61 43 6f 6c 2c 20 69 3d 30  Col=p->aCol, i=0
c550: 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b  ; i<p->nCol; i++
c560: 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 73  , pCol++){.    s
c570: 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72  tatic const char
c580: 20 2a 20 63 6f 6e 73 74 20 61 7a 54 79 70 65 5b   * const azType[
c590: 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a  ] = {.        /*
c5a0: 20 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42   SQLITE_AFF_BLOB
c5b0: 20 20 20 20 2a 2f 20 22 22 2c 0a 20 20 20 20 20      */ "",.     
c5c0: 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 41 46 46     /* SQLITE_AFF
c5d0: 5f 54 45 58 54 20 20 20 20 2a 2f 20 22 20 54 45  _TEXT    */ " TE
c5e0: 58 54 22 2c 0a 20 20 20 20 20 20 20 20 2f 2a 20  XT",.        /* 
c5f0: 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52  SQLITE_AFF_NUMER
c600: 49 43 20 2a 2f 20 22 20 4e 55 4d 22 2c 0a 20 20  IC */ " NUM",.  
c610: 20 20 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f        /* SQLITE_
c620: 41 46 46 5f 49 4e 54 45 47 45 52 20 2a 2f 20 22  AFF_INTEGER */ "
c630: 20 49 4e 54 22 2c 0a 20 20 20 20 20 20 20 20 2f   INT",.        /
c640: 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41  * SQLITE_AFF_REA
c650: 4c 20 20 20 20 2a 2f 20 22 20 52 45 41 4c 22 0a  L    */ " REAL".
c660: 20 20 20 20 7d 3b 0a 20 20 20 20 69 6e 74 20 6c      };.    int l
c670: 65 6e 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  en;.    const ch
c680: 61 72 20 2a 7a 54 79 70 65 3b 0a 0a 20 20 20 20  ar *zType;..    
c690: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
c6a0: 28 6e 2d 6b 2c 20 26 7a 53 74 6d 74 5b 6b 5d 2c  (n-k, &zStmt[k],
c6b0: 20 7a 53 65 70 29 3b 0a 20 20 20 20 6b 20 2b 3d   zSep);.    k +=
c6c0: 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
c6d0: 28 26 7a 53 74 6d 74 5b 6b 5d 29 3b 0a 20 20 20  (&zStmt[k]);.   
c6e0: 20 7a 53 65 70 20 3d 20 7a 53 65 70 32 3b 0a 20   zSep = zSep2;. 
c6f0: 20 20 20 69 64 65 6e 74 50 75 74 28 7a 53 74 6d     identPut(zStm
c700: 74 2c 20 26 6b 2c 20 70 43 6f 6c 2d 3e 7a 4e 61  t, &k, pCol->zNa
c710: 6d 65 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  me);.    assert(
c720: 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 2d   pCol->affinity-
c730: 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 20  SQLITE_AFF_BLOB 
c740: 3e 3d 20 30 20 29 3b 0a 20 20 20 20 61 73 73 65  >= 0 );.    asse
c750: 72 74 28 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69  rt( pCol->affini
c760: 74 79 2d 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c  ty-SQLITE_AFF_BL
c770: 4f 42 20 3c 20 41 72 72 61 79 53 69 7a 65 28 61  OB < ArraySize(a
c780: 7a 54 79 70 65 29 20 29 3b 0a 20 20 20 20 74 65  zType) );.    te
c790: 73 74 63 61 73 65 28 20 70 43 6f 6c 2d 3e 61 66  stcase( pCol->af
c7a0: 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41  finity==SQLITE_A
c7b0: 46 46 5f 42 4c 4f 42 20 29 3b 0a 20 20 20 20 74  FF_BLOB );.    t
c7c0: 65 73 74 63 61 73 65 28 20 70 43 6f 6c 2d 3e 61  estcase( pCol->a
c7d0: 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f  ffinity==SQLITE_
c7e0: 41 46 46 5f 54 45 58 54 20 29 3b 0a 20 20 20 20  AFF_TEXT );.    
c7f0: 74 65 73 74 63 61 73 65 28 20 70 43 6f 6c 2d 3e  testcase( pCol->
c800: 61 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45  affinity==SQLITE
c810: 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20 29 3b 0a  _AFF_NUMERIC );.
c820: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 43      testcase( pC
c830: 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 53 51  ol->affinity==SQ
c840: 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52  LITE_AFF_INTEGER
c850: 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
c860: 28 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79  ( pCol->affinity
c870: 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41  ==SQLITE_AFF_REA
c880: 4c 20 29 3b 0a 20 20 20 20 0a 20 20 20 20 7a 54  L );.    .    zT
c890: 79 70 65 20 3d 20 61 7a 54 79 70 65 5b 70 43 6f  ype = azType[pCo
c8a0: 6c 2d 3e 61 66 66 69 6e 69 74 79 20 2d 20 53 51  l->affinity - SQ
c8b0: 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 5d 3b 0a  LITE_AFF_BLOB];.
c8c0: 20 20 20 20 6c 65 6e 20 3d 20 73 71 6c 69 74 65      len = sqlite
c8d0: 33 53 74 72 6c 65 6e 33 30 28 7a 54 79 70 65 29  3Strlen30(zType)
c8e0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43  ;.    assert( pC
c8f0: 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 53 51  ol->affinity==SQ
c900: 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 20 0a 20  LITE_AFF_BLOB . 
c910: 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 43             || pC
c920: 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 73 71  ol->affinity==sq
c930: 6c 69 74 65 33 41 66 66 69 6e 69 74 79 54 79 70  lite3AffinityTyp
c940: 65 28 7a 54 79 70 65 2c 20 30 29 20 29 3b 0a 20  e(zType, 0) );. 
c950: 20 20 20 6d 65 6d 63 70 79 28 26 7a 53 74 6d 74     memcpy(&zStmt
c960: 5b 6b 5d 2c 20 7a 54 79 70 65 2c 20 6c 65 6e 29  [k], zType, len)
c970: 3b 0a 20 20 20 20 6b 20 2b 3d 20 6c 65 6e 3b 0a  ;.    k += len;.
c980: 20 20 20 20 61 73 73 65 72 74 28 20 6b 3c 3d 6e      assert( k<=n
c990: 20 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65   );.  }.  sqlite
c9a0: 33 5f 73 6e 70 72 69 6e 74 66 28 6e 2d 6b 2c 20  3_snprintf(n-k, 
c9b0: 26 7a 53 74 6d 74 5b 6b 5d 2c 20 22 25 73 22 2c  &zStmt[k], "%s",
c9c0: 20 7a 45 6e 64 29 3b 0a 20 20 72 65 74 75 72 6e   zEnd);.  return
c9d0: 20 7a 53 74 6d 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   zStmt;.}../*.**
c9e0: 20 52 65 73 69 7a 65 20 61 6e 20 49 6e 64 65 78   Resize an Index
c9f0: 20 6f 62 6a 65 63 74 20 74 6f 20 68 6f 6c 64 20   object to hold 
ca00: 4e 20 63 6f 6c 75 6d 6e 73 20 74 6f 74 61 6c 2e  N columns total.
ca10: 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    Return SQLITE_
ca20: 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73  OK.** on success
ca30: 20 61 6e 64 20 53 51 4c 49 54 45 5f 4e 4f 4d 45   and SQLITE_NOME
ca40: 4d 20 6f 6e 20 61 6e 20 4f 4f 4d 20 65 72 72 6f  M on an OOM erro
ca50: 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  r..*/.static int
ca60: 20 72 65 73 69 7a 65 49 6e 64 65 78 4f 62 6a 65   resizeIndexObje
ca70: 63 74 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  ct(sqlite3 *db, 
ca80: 49 6e 64 65 78 20 2a 70 49 64 78 2c 20 69 6e 74  Index *pIdx, int
ca90: 20 4e 29 7b 0a 20 20 63 68 61 72 20 2a 7a 45 78   N){.  char *zEx
caa0: 74 72 61 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65  tra;.  int nByte
cab0: 3b 0a 20 20 69 66 28 20 70 49 64 78 2d 3e 6e 43  ;.  if( pIdx->nC
cac0: 6f 6c 75 6d 6e 3e 3d 4e 20 29 20 72 65 74 75 72  olumn>=N ) retur
cad0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61  n SQLITE_OK;.  a
cae0: 73 73 65 72 74 28 20 70 49 64 78 2d 3e 69 73 52  ssert( pIdx->isR
caf0: 65 73 69 7a 65 64 3d 3d 30 20 29 3b 0a 20 20 6e  esized==0 );.  n
cb00: 42 79 74 65 20 3d 20 28 73 69 7a 65 6f 66 28 63  Byte = (sizeof(c
cb10: 68 61 72 2a 29 20 2b 20 73 69 7a 65 6f 66 28 69  har*) + sizeof(i
cb20: 31 36 29 20 2b 20 31 29 2a 4e 3b 0a 20 20 7a 45  16) + 1)*N;.  zE
cb30: 78 74 72 61 20 3d 20 73 71 6c 69 74 65 33 44 62  xtra = sqlite3Db
cb40: 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 6e  MallocZero(db, n
cb50: 42 79 74 65 29 3b 0a 20 20 69 66 28 20 7a 45 78  Byte);.  if( zEx
cb60: 74 72 61 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  tra==0 ) return 
cb70: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50  SQLITE_NOMEM_BKP
cb80: 54 3b 0a 20 20 6d 65 6d 63 70 79 28 7a 45 78 74  T;.  memcpy(zExt
cb90: 72 61 2c 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c  ra, pIdx->azColl
cba0: 2c 20 73 69 7a 65 6f 66 28 63 68 61 72 2a 29 2a  , sizeof(char*)*
cbb0: 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 29 3b 0a  pIdx->nColumn);.
cbc0: 20 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 20 3d    pIdx->azColl =
cbd0: 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 2a 29 7a   (const char**)z
cbe0: 45 78 74 72 61 3b 0a 20 20 7a 45 78 74 72 61 20  Extra;.  zExtra 
cbf0: 2b 3d 20 73 69 7a 65 6f 66 28 63 68 61 72 2a 29  += sizeof(char*)
cc00: 2a 4e 3b 0a 20 20 6d 65 6d 63 70 79 28 7a 45 78  *N;.  memcpy(zEx
cc10: 74 72 61 2c 20 70 49 64 78 2d 3e 61 69 43 6f 6c  tra, pIdx->aiCol
cc20: 75 6d 6e 2c 20 73 69 7a 65 6f 66 28 69 31 36 29  umn, sizeof(i16)
cc30: 2a 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 29 3b  *pIdx->nColumn);
cc40: 0a 20 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d  .  pIdx->aiColum
cc50: 6e 20 3d 20 28 69 31 36 2a 29 7a 45 78 74 72 61  n = (i16*)zExtra
cc60: 3b 0a 20 20 7a 45 78 74 72 61 20 2b 3d 20 73 69  ;.  zExtra += si
cc70: 7a 65 6f 66 28 69 31 36 29 2a 4e 3b 0a 20 20 6d  zeof(i16)*N;.  m
cc80: 65 6d 63 70 79 28 7a 45 78 74 72 61 2c 20 70 49  emcpy(zExtra, pI
cc90: 64 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 2c 20  dx->aSortOrder, 
cca0: 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 29 3b 0a  pIdx->nColumn);.
ccb0: 20 20 70 49 64 78 2d 3e 61 53 6f 72 74 4f 72 64    pIdx->aSortOrd
ccc0: 65 72 20 3d 20 28 75 38 2a 29 7a 45 78 74 72 61  er = (u8*)zExtra
ccd0: 3b 0a 20 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d  ;.  pIdx->nColum
cce0: 6e 20 3d 20 4e 3b 0a 20 20 70 49 64 78 2d 3e 69  n = N;.  pIdx->i
ccf0: 73 52 65 73 69 7a 65 64 20 3d 20 31 3b 0a 20 20  sResized = 1;.  
cd00: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
cd10: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 73 74 69 6d  ;.}../*.** Estim
cd20: 61 74 65 20 74 68 65 20 74 6f 74 61 6c 20 72 6f  ate the total ro
cd30: 77 20 77 69 64 74 68 20 66 6f 72 20 61 20 74 61  w width for a ta
cd40: 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ble..*/.static v
cd50: 6f 69 64 20 65 73 74 69 6d 61 74 65 54 61 62 6c  oid estimateTabl
cd60: 65 57 69 64 74 68 28 54 61 62 6c 65 20 2a 70 54  eWidth(Table *pT
cd70: 61 62 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20  ab){.  unsigned 
cd80: 77 54 61 62 6c 65 20 3d 20 30 3b 0a 20 20 63 6f  wTable = 0;.  co
cd90: 6e 73 74 20 43 6f 6c 75 6d 6e 20 2a 70 54 61 62  nst Column *pTab
cda0: 43 6f 6c 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  Col;.  int i;.  
cdb0: 66 6f 72 28 69 3d 70 54 61 62 2d 3e 6e 43 6f 6c  for(i=pTab->nCol
cdc0: 2c 20 70 54 61 62 43 6f 6c 3d 70 54 61 62 2d 3e  , pTabCol=pTab->
cdd0: 61 43 6f 6c 3b 20 69 3e 30 3b 20 69 2d 2d 2c 20  aCol; i>0; i--, 
cde0: 70 54 61 62 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20  pTabCol++){.    
cdf0: 77 54 61 62 6c 65 20 2b 3d 20 70 54 61 62 43 6f  wTable += pTabCo
ce00: 6c 2d 3e 73 7a 45 73 74 3b 0a 20 20 7d 0a 20 20  l->szEst;.  }.  
ce10: 69 66 28 20 70 54 61 62 2d 3e 69 50 4b 65 79 3c  if( pTab->iPKey<
ce20: 30 20 29 20 77 54 61 62 6c 65 2b 2b 3b 0a 20 20  0 ) wTable++;.  
ce30: 70 54 61 62 2d 3e 73 7a 54 61 62 52 6f 77 20 3d  pTab->szTabRow =
ce40: 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 77   sqlite3LogEst(w
ce50: 54 61 62 6c 65 2a 34 29 3b 0a 7d 0a 0a 2f 2a 0a  Table*4);.}../*.
ce60: 2a 2a 20 45 73 74 69 6d 61 74 65 20 74 68 65 20  ** Estimate the 
ce70: 61 76 65 72 61 67 65 20 73 69 7a 65 20 6f 66 20  average size of 
ce80: 61 20 72 6f 77 20 66 6f 72 20 61 6e 20 69 6e 64  a row for an ind
ce90: 65 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ex..*/.static vo
cea0: 69 64 20 65 73 74 69 6d 61 74 65 49 6e 64 65 78  id estimateIndex
ceb0: 57 69 64 74 68 28 49 6e 64 65 78 20 2a 70 49 64  Width(Index *pId
cec0: 78 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 77  x){.  unsigned w
ced0: 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20 69 6e 74  Index = 0;.  int
cee0: 20 69 3b 0a 20 20 63 6f 6e 73 74 20 43 6f 6c 75   i;.  const Colu
cef0: 6d 6e 20 2a 61 43 6f 6c 20 3d 20 70 49 64 78 2d  mn *aCol = pIdx-
cf00: 3e 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 3b 0a 20  >pTable->aCol;. 
cf10: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 64 78   for(i=0; i<pIdx
cf20: 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b  ->nColumn; i++){
cf30: 0a 20 20 20 20 69 31 36 20 78 20 3d 20 70 49 64  .    i16 x = pId
cf40: 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 3b 0a  x->aiColumn[i];.
cf50: 20 20 20 20 61 73 73 65 72 74 28 20 78 3c 70 49      assert( x<pI
cf60: 64 78 2d 3e 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c  dx->pTable->nCol
cf70: 20 29 3b 0a 20 20 20 20 77 49 6e 64 65 78 20 2b   );.    wIndex +
cf80: 3d 20 78 3c 30 20 3f 20 31 20 3a 20 61 43 6f 6c  = x<0 ? 1 : aCol
cf90: 5b 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b  [pIdx->aiColumn[
cfa0: 69 5d 5d 2e 73 7a 45 73 74 3b 0a 20 20 7d 0a 20  i]].szEst;.  }. 
cfb0: 20 70 49 64 78 2d 3e 73 7a 49 64 78 52 6f 77 20   pIdx->szIdxRow 
cfc0: 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28  = sqlite3LogEst(
cfd0: 77 49 6e 64 65 78 2a 34 29 3b 0a 7d 0a 0a 2f 2a  wIndex*4);.}../*
cfe0: 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20   Return true if 
cff0: 76 61 6c 75 65 20 78 20 69 73 20 66 6f 75 6e 64  value x is found
d000: 20 61 6e 79 20 6f 66 20 74 68 65 20 66 69 72 73   any of the firs
d010: 74 20 6e 43 6f 6c 20 65 6e 74 72 69 65 73 20 6f  t nCol entries o
d020: 66 20 61 69 43 6f 6c 5b 5d 0a 2a 2f 0a 73 74 61  f aiCol[].*/.sta
d030: 74 69 63 20 69 6e 74 20 68 61 73 43 6f 6c 75 6d  tic int hasColum
d040: 6e 28 63 6f 6e 73 74 20 69 31 36 20 2a 61 69 43  n(const i16 *aiC
d050: 6f 6c 2c 20 69 6e 74 20 6e 43 6f 6c 2c 20 69 6e  ol, int nCol, in
d060: 74 20 78 29 7b 0a 20 20 77 68 69 6c 65 28 20 6e  t x){.  while( n
d070: 43 6f 6c 2d 2d 20 3e 20 30 20 29 20 69 66 28 20  Col-- > 0 ) if( 
d080: 78 3d 3d 2a 28 61 69 43 6f 6c 2b 2b 29 20 29 20  x==*(aiCol++) ) 
d090: 72 65 74 75 72 6e 20 31 3b 0a 20 20 72 65 74 75  return 1;.  retu
d0a0: 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  rn 0;.}../*.** T
d0b0: 68 69 73 20 72 6f 75 74 69 6e 65 20 72 75 6e 73  his routine runs
d0c0: 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 70   at the end of p
d0d0: 61 72 73 69 6e 67 20 61 20 43 52 45 41 54 45 20  arsing a CREATE 
d0e0: 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 20  TABLE statement 
d0f0: 74 68 61 74 0a 2a 2a 20 68 61 73 20 61 20 57 49  that.** has a WI
d100: 54 48 4f 55 54 20 52 4f 57 49 44 20 63 6c 61 75  THOUT ROWID clau
d110: 73 65 2e 20 20 54 68 65 20 6a 6f 62 20 6f 66 20  se.  The job of 
d120: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
d130: 74 6f 20 63 6f 6e 76 65 72 74 20 62 6f 74 68 0a  to convert both.
d140: 2a 2a 20 69 6e 74 65 72 6e 61 6c 20 73 63 68 65  ** internal sche
d150: 6d 61 20 64 61 74 61 20 73 74 72 75 63 74 75 72  ma data structur
d160: 65 73 20 61 6e 64 20 74 68 65 20 67 65 6e 65 72  es and the gener
d170: 61 74 65 64 20 56 44 42 45 20 63 6f 64 65 20 73  ated VDBE code s
d180: 6f 20 74 68 61 74 20 74 68 65 79 0a 2a 2a 20 61  o that they.** a
d190: 72 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 66  re appropriate f
d1a0: 6f 72 20 61 20 57 49 54 48 4f 55 54 20 52 4f 57  or a WITHOUT ROW
d1b0: 49 44 20 74 61 62 6c 65 20 69 6e 73 74 65 61 64  ID table instead
d1c0: 20 6f 66 20 61 20 72 6f 77 69 64 20 74 61 62 6c   of a rowid tabl
d1d0: 65 2e 0a 2a 2a 20 43 68 61 6e 67 65 73 20 69 6e  e..** Changes in
d1e0: 63 6c 75 64 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  clude:.**.**    
d1f0: 20 28 31 29 20 20 43 6f 6e 76 65 72 74 20 74 68   (1)  Convert th
d200: 65 20 4f 50 5f 43 72 65 61 74 65 54 61 62 6c 65  e OP_CreateTable
d210: 20 69 6e 74 6f 20 61 6e 20 4f 50 5f 43 72 65 61   into an OP_Crea
d220: 74 65 49 6e 64 65 78 2e 20 20 54 68 65 72 65 20  teIndex.  There 
d230: 69 73 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 6e  is.**          n
d240: 6f 20 72 6f 77 69 64 20 62 74 72 65 65 20 66 6f  o rowid btree fo
d250: 72 20 61 20 57 49 54 48 4f 55 54 20 52 4f 57 49  r a WITHOUT ROWI
d260: 44 2e 20 20 49 6e 73 74 65 61 64 2c 20 74 68 65  D.  Instead, the
d270: 20 63 61 6e 6f 6e 69 63 61 6c 0a 2a 2a 20 20 20   canonical.**   
d280: 20 20 20 20 20 20 20 64 61 74 61 20 73 74 6f 72         data stor
d290: 61 67 65 20 69 73 20 61 20 63 6f 76 65 72 69 6e  age is a coverin
d2a0: 67 20 69 6e 64 65 78 20 62 74 72 65 65 2e 0a 2a  g index btree..*
d2b0: 2a 20 20 20 20 20 28 32 29 20 20 42 79 70 61 73  *     (2)  Bypas
d2c0: 73 20 74 68 65 20 63 72 65 61 74 69 6f 6e 20 6f  s the creation o
d2d0: 66 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73  f the sqlite_mas
d2e0: 74 65 72 20 74 61 62 6c 65 20 65 6e 74 72 79 0a  ter table entry.
d2f0: 2a 2a 20 20 20 20 20 20 20 20 20 20 66 6f 72 20  **          for 
d300: 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20  the PRIMARY KEY 
d310: 61 73 20 74 68 65 20 70 72 69 6d 61 72 79 20 6b  as the primary k
d320: 65 79 20 69 6e 64 65 78 20 69 73 20 6e 6f 77 0a  ey index is now.
d330: 2a 2a 20 20 20 20 20 20 20 20 20 20 69 64 65 6e  **          iden
d340: 74 69 66 69 65 64 20 62 79 20 74 68 65 20 73 71  tified by the sq
d350: 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c  lite_master tabl
d360: 65 20 65 6e 74 72 79 20 6f 66 20 74 68 65 20 74  e entry of the t
d370: 61 62 6c 65 20 69 74 73 65 6c 66 2e 0a 2a 2a 20  able itself..** 
d380: 20 20 20 20 28 33 29 20 20 53 65 74 20 74 68 65      (3)  Set the
d390: 20 49 6e 64 65 78 2e 74 6e 75 6d 20 6f 66 20 74   Index.tnum of t
d3a0: 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 49  he PRIMARY KEY I
d3b0: 6e 64 65 78 20 6f 62 6a 65 63 74 20 69 6e 20 74  ndex object in t
d3c0: 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 73  he.**          s
d3d0: 63 68 65 6d 61 20 74 6f 20 74 68 65 20 72 6f 6f  chema to the roo
d3e0: 74 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 6d  tpage from the m
d3f0: 61 69 6e 20 74 61 62 6c 65 2e 0a 2a 2a 20 20 20  ain table..**   
d400: 20 20 28 34 29 20 20 53 65 74 20 61 6c 6c 20 63    (4)  Set all c
d410: 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 50 52  olumns of the PR
d420: 49 4d 41 52 59 20 4b 45 59 20 73 63 68 65 6d 61  IMARY KEY schema
d430: 20 6f 62 6a 65 63 74 20 74 6f 20 62 65 20 4e 4f   object to be NO
d440: 54 20 4e 55 4c 4c 2e 0a 2a 2a 20 20 20 20 20 28  T NULL..**     (
d450: 35 29 20 20 41 64 64 20 61 6c 6c 20 74 61 62 6c  5)  Add all tabl
d460: 65 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 74 68 65  e columns to the
d470: 20 50 52 49 4d 41 52 59 20 4b 45 59 20 49 6e 64   PRIMARY KEY Ind
d480: 65 78 20 6f 62 6a 65 63 74 0a 2a 2a 20 20 20 20  ex object.**    
d490: 20 20 20 20 20 20 73 6f 20 74 68 61 74 20 74 68        so that th
d4a0: 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 69 73  e PRIMARY KEY is
d4b0: 20 61 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65   a covering inde
d4c0: 78 2e 20 20 54 68 65 20 73 75 72 70 6c 75 73 0a  x.  The surplus.
d4d0: 2a 2a 20 20 20 20 20 20 20 20 20 20 63 6f 6c 75  **          colu
d4e0: 6d 6e 73 20 61 72 65 20 70 61 72 74 20 6f 66 20  mns are part of 
d4f0: 4b 65 79 49 6e 66 6f 2e 6e 58 46 69 65 6c 64 20  KeyInfo.nXField 
d500: 61 6e 64 20 61 72 65 20 6e 6f 74 20 75 73 65 64  and are not used
d510: 20 66 6f 72 0a 2a 2a 20 20 20 20 20 20 20 20 20   for.**         
d520: 20 73 6f 72 74 69 6e 67 20 6f 72 20 6c 6f 6f 6b   sorting or look
d530: 75 70 20 6f 72 20 75 6e 69 71 75 65 6e 65 73 73  up or uniqueness
d540: 20 63 68 65 63 6b 73 2e 0a 2a 2a 20 20 20 20 20   checks..**     
d550: 28 36 29 20 20 52 65 70 6c 61 63 65 20 74 68 65  (6)  Replace the
d560: 20 72 6f 77 69 64 20 74 61 69 6c 20 6f 6e 20 61   rowid tail on a
d570: 6c 6c 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  ll automatically
d580: 20 67 65 6e 65 72 61 74 65 64 20 55 4e 49 51 55   generated UNIQU
d590: 45 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 69 6e  E.**          in
d5a0: 64 69 63 65 73 20 77 69 74 68 20 74 68 65 20 50  dices with the P
d5b0: 52 49 4d 41 52 59 20 4b 45 59 20 63 6f 6c 75 6d  RIMARY KEY colum
d5c0: 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ns..*/.static vo
d5d0: 69 64 20 63 6f 6e 76 65 72 74 54 6f 57 69 74 68  id convertToWith
d5e0: 6f 75 74 52 6f 77 69 64 54 61 62 6c 65 28 50 61  outRowidTable(Pa
d5f0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 61 62  rse *pParse, Tab
d600: 6c 65 20 2a 70 54 61 62 29 7b 0a 20 20 49 6e 64  le *pTab){.  Ind
d610: 65 78 20 2a 70 49 64 78 3b 0a 20 20 49 6e 64 65  ex *pIdx;.  Inde
d620: 78 20 2a 70 50 6b 3b 0a 20 20 69 6e 74 20 6e 50  x *pPk;.  int nP
d630: 6b 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20  k;.  int i, j;. 
d640: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
d650: 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 56 64 62  Parse->db;.  Vdb
d660: 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
d670: 56 64 62 65 3b 0a 0a 20 20 2f 2a 20 43 6f 6e 76  Vdbe;..  /* Conv
d680: 65 72 74 20 74 68 65 20 4f 50 5f 43 72 65 61 74  ert the OP_Creat
d690: 65 54 61 62 6c 65 20 6f 70 63 6f 64 65 20 74 68  eTable opcode th
d6a0: 61 74 20 77 6f 75 6c 64 20 6e 6f 72 6d 61 6c 6c  at would normall
d6b0: 79 20 63 72 65 61 74 65 20 74 68 65 0a 20 20 2a  y create the.  *
d6c0: 2a 20 72 6f 6f 74 2d 70 61 67 65 20 66 6f 72 20  * root-page for 
d6d0: 74 68 65 20 74 61 62 6c 65 20 69 6e 74 6f 20 61  the table into a
d6e0: 6e 20 4f 50 5f 43 72 65 61 74 65 49 6e 64 65 78  n OP_CreateIndex
d6f0: 20 6f 70 63 6f 64 65 2e 20 20 54 68 65 20 69 6e   opcode.  The in
d700: 64 65 78 0a 20 20 2a 2a 20 63 72 65 61 74 65 64  dex.  ** created
d710: 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65   will become the
d720: 20 50 52 49 4d 41 52 59 20 4b 45 59 20 69 6e 64   PRIMARY KEY ind
d730: 65 78 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ex..  */.  if( p
d740: 50 61 72 73 65 2d 3e 61 64 64 72 43 72 54 61 62  Parse->addrCrTab
d750: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
d760: 76 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  v );.    sqlite3
d770: 56 64 62 65 43 68 61 6e 67 65 4f 70 63 6f 64 65  VdbeChangeOpcode
d780: 28 76 2c 20 70 50 61 72 73 65 2d 3e 61 64 64 72  (v, pParse->addr
d790: 43 72 54 61 62 2c 20 4f 50 5f 43 72 65 61 74 65  CrTab, OP_Create
d7a0: 49 6e 64 65 78 29 3b 0a 20 20 7d 0a 0a 20 20 2f  Index);.  }..  /
d7b0: 2a 20 4c 6f 63 61 74 65 20 74 68 65 20 50 52 49  * Locate the PRI
d7c0: 4d 41 52 59 20 4b 45 59 20 69 6e 64 65 78 2e 20  MARY KEY index. 
d7d0: 20 4f 72 2c 20 69 66 20 74 68 69 73 20 74 61 62   Or, if this tab
d7e0: 6c 65 20 77 61 73 20 6f 72 69 67 69 6e 61 6c 6c  le was originall
d7f0: 79 0a 20 20 2a 2a 20 61 6e 20 49 4e 54 45 47 45  y.  ** an INTEGE
d800: 52 20 50 52 49 4d 41 52 59 20 4b 45 59 20 74 61  R PRIMARY KEY ta
d810: 62 6c 65 2c 20 63 72 65 61 74 65 20 61 20 6e 65  ble, create a ne
d820: 77 20 50 52 49 4d 41 52 59 20 4b 45 59 20 69 6e  w PRIMARY KEY in
d830: 64 65 78 2e 20 0a 20 20 2a 2f 0a 20 20 69 66 28  dex. .  */.  if(
d840: 20 70 54 61 62 2d 3e 69 50 4b 65 79 3e 3d 30 20   pTab->iPKey>=0 
d850: 29 7b 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20  ){.    ExprList 
d860: 2a 70 4c 69 73 74 3b 0a 20 20 20 20 54 6f 6b 65  *pList;.    Toke
d870: 6e 20 69 70 6b 54 6f 6b 65 6e 3b 0a 20 20 20 20  n ipkToken;.    
d880: 73 71 6c 69 74 65 33 54 6f 6b 65 6e 49 6e 69 74  sqlite3TokenInit
d890: 28 26 69 70 6b 54 6f 6b 65 6e 2c 20 70 54 61 62  (&ipkToken, pTab
d8a0: 2d 3e 61 43 6f 6c 5b 70 54 61 62 2d 3e 69 50 4b  ->aCol[pTab->iPK
d8b0: 65 79 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ey].zName);.    
d8c0: 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45  pList = sqlite3E
d8d0: 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50  xprListAppend(pP
d8e0: 61 72 73 65 2c 20 30 2c 20 0a 20 20 20 20 20 20  arse, 0, .      
d8f0: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
d900: 74 65 33 45 78 70 72 41 6c 6c 6f 63 28 64 62 2c  te3ExprAlloc(db,
d910: 20 54 4b 5f 49 44 2c 20 26 69 70 6b 54 6f 6b 65   TK_ID, &ipkToke
d920: 6e 2c 20 30 29 29 3b 0a 20 20 20 20 69 66 28 20  n, 0));.    if( 
d930: 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72  pList==0 ) retur
d940: 6e 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 61 5b  n;.    pList->a[
d950: 30 5d 2e 73 6f 72 74 4f 72 64 65 72 20 3d 20 70  0].sortOrder = p
d960: 50 61 72 73 65 2d 3e 69 50 6b 53 6f 72 74 4f 72  Parse->iPkSortOr
d970: 64 65 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28  der;.    assert(
d980: 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
d990: 6c 65 3d 3d 70 54 61 62 20 29 3b 0a 20 20 20 20  le==pTab );.    
d9a0: 70 50 6b 20 3d 20 73 71 6c 69 74 65 33 43 72 65  pPk = sqlite3Cre
d9b0: 61 74 65 49 6e 64 65 78 28 70 50 61 72 73 65 2c  ateIndex(pParse,
d9c0: 20 30 2c 20 30 2c 20 30 2c 20 70 4c 69 73 74 2c   0, 0, 0, pList,
d9d0: 20 70 54 61 62 2d 3e 6b 65 79 43 6f 6e 66 2c 20   pTab->keyConf, 
d9e0: 30 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20  0, 0, 0, 0);.   
d9f0: 20 69 66 28 20 70 50 6b 3d 3d 30 20 29 20 72 65   if( pPk==0 ) re
da00: 74 75 72 6e 3b 0a 20 20 20 20 70 50 6b 2d 3e 69  turn;.    pPk->i
da10: 64 78 54 79 70 65 20 3d 20 53 51 4c 49 54 45 5f  dxType = SQLITE_
da20: 49 44 58 54 59 50 45 5f 50 52 49 4d 41 52 59 4b  IDXTYPE_PRIMARYK
da30: 45 59 3b 0a 20 20 20 20 70 54 61 62 2d 3e 69 50  EY;.    pTab->iP
da40: 4b 65 79 20 3d 20 2d 31 3b 0a 20 20 7d 65 6c 73  Key = -1;.  }els
da50: 65 7b 0a 20 20 20 20 70 50 6b 20 3d 20 73 71 6c  e{.    pPk = sql
da60: 69 74 65 33 50 72 69 6d 61 72 79 4b 65 79 49 6e  ite3PrimaryKeyIn
da70: 64 65 78 28 70 54 61 62 29 3b 0a 0a 20 20 20 20  dex(pTab);..    
da80: 2f 2a 20 42 79 70 61 73 73 20 74 68 65 20 63 72  /* Bypass the cr
da90: 65 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 50 52  eation of the PR
daa0: 49 4d 41 52 59 20 4b 45 59 20 62 74 72 65 65 20  IMARY KEY btree 
dab0: 61 6e 64 20 74 68 65 20 73 71 6c 69 74 65 5f 6d  and the sqlite_m
dac0: 61 73 74 65 72 0a 20 20 20 20 2a 2a 20 74 61 62  aster.    ** tab
dad0: 6c 65 20 65 6e 74 72 79 2e 20 54 68 69 73 20 69  le entry. This i
dae0: 73 20 6f 6e 6c 79 20 72 65 71 75 69 72 65 64 20  s only required 
daf0: 69 66 20 63 75 72 72 65 6e 74 6c 79 20 67 65 6e  if currently gen
db00: 65 72 61 74 69 6e 67 20 56 44 42 45 0a 20 20 20  erating VDBE.   
db10: 20 2a 2a 20 63 6f 64 65 20 66 6f 72 20 61 20 43   ** code for a C
db20: 52 45 41 54 45 20 54 41 42 4c 45 20 28 6e 6f 74  REATE TABLE (not
db30: 20 77 68 65 6e 20 70 61 72 73 69 6e 67 20 6f 6e   when parsing on
db40: 65 20 61 73 20 70 61 72 74 20 6f 66 20 72 65 61  e as part of rea
db50: 64 69 6e 67 0a 20 20 20 20 2a 2a 20 61 20 64 61  ding.    ** a da
db60: 74 61 62 61 73 65 20 73 63 68 65 6d 61 29 2e 20  tabase schema). 
db70: 20 2a 2f 0a 20 20 20 20 69 66 28 20 76 20 29 7b   */.    if( v ){
db80: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 64  .      assert( d
db90: 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d 30 20  b->init.busy==0 
dba0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
dbb0: 56 64 62 65 43 68 61 6e 67 65 4f 70 63 6f 64 65  VdbeChangeOpcode
dbc0: 28 76 2c 20 70 50 6b 2d 3e 74 6e 75 6d 2c 20 4f  (v, pPk->tnum, O
dbd0: 50 5f 47 6f 74 6f 29 3b 0a 20 20 20 20 7d 0a 0a  P_Goto);.    }..
dbe0: 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 52 65      /*.    ** Re
dbf0: 6d 6f 76 65 20 61 6c 6c 20 72 65 64 75 6e 64 61  move all redunda
dc00: 6e 74 20 63 6f 6c 75 6d 6e 73 20 66 72 6f 6d 20  nt columns from 
dc10: 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59 2e  the PRIMARY KEY.
dc20: 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 63    For example, c
dc30: 68 61 6e 67 65 0a 20 20 20 20 2a 2a 20 22 50 52  hange.    ** "PR
dc40: 49 4d 41 52 59 20 4b 45 59 28 61 2c 62 2c 61 2c  IMARY KEY(a,b,a,
dc50: 62 2c 63 2c 62 2c 63 2c 64 29 22 20 69 6e 74 6f  b,c,b,c,d)" into
dc60: 20 6a 75 73 74 20 22 50 52 49 4d 41 52 59 20 4b   just "PRIMARY K
dc70: 45 59 28 61 2c 62 2c 63 2c 64 29 22 2e 20 20 4c  EY(a,b,c,d)".  L
dc80: 61 74 65 72 0a 20 20 20 20 2a 2a 20 63 6f 64 65  ater.    ** code
dc90: 20 61 73 73 75 6d 65 73 20 74 68 65 20 50 52 49   assumes the PRI
dca0: 4d 41 52 59 20 4b 45 59 20 63 6f 6e 74 61 69 6e  MARY KEY contain
dcb0: 73 20 6e 6f 20 72 65 70 65 61 74 65 64 20 63 6f  s no repeated co
dcc0: 6c 75 6d 6e 73 2e 0a 20 20 20 20 2a 2f 0a 20 20  lumns..    */.  
dcd0: 20 20 66 6f 72 28 69 3d 6a 3d 31 3b 20 69 3c 70    for(i=j=1; i<p
dce0: 50 6b 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 69 2b 2b  Pk->nKeyCol; i++
dcf0: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 68 61 73  ){.      if( has
dd00: 43 6f 6c 75 6d 6e 28 70 50 6b 2d 3e 61 69 43 6f  Column(pPk->aiCo
dd10: 6c 75 6d 6e 2c 20 6a 2c 20 70 50 6b 2d 3e 61 69  lumn, j, pPk->ai
dd20: 43 6f 6c 75 6d 6e 5b 69 5d 29 20 29 7b 0a 20 20  Column[i]) ){.  
dd30: 20 20 20 20 20 20 70 50 6b 2d 3e 6e 43 6f 6c 75        pPk->nColu
dd40: 6d 6e 2d 2d 3b 0a 20 20 20 20 20 20 7d 65 6c 73  mn--;.      }els
dd50: 65 7b 0a 20 20 20 20 20 20 20 20 70 50 6b 2d 3e  e{.        pPk->
dd60: 61 69 43 6f 6c 75 6d 6e 5b 6a 2b 2b 5d 20 3d 20  aiColumn[j++] = 
dd70: 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d  pPk->aiColumn[i]
dd80: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
dd90: 20 20 20 20 70 50 6b 2d 3e 6e 4b 65 79 43 6f 6c      pPk->nKeyCol
dda0: 20 3d 20 6a 3b 0a 20 20 7d 0a 20 20 70 50 6b 2d   = j;.  }.  pPk-
ddb0: 3e 69 73 43 6f 76 65 72 69 6e 67 20 3d 20 31 3b  >isCovering = 1;
ddc0: 0a 20 20 61 73 73 65 72 74 28 20 70 50 6b 21 3d  .  assert( pPk!=
ddd0: 30 20 29 3b 0a 20 20 6e 50 6b 20 3d 20 70 50 6b  0 );.  nPk = pPk
dde0: 2d 3e 6e 4b 65 79 43 6f 6c 3b 0a 0a 20 20 2f 2a  ->nKeyCol;..  /*
ddf0: 20 4d 61 6b 65 20 73 75 72 65 20 65 76 65 72 79   Make sure every
de00: 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 50   column of the P
de10: 52 49 4d 41 52 59 20 4b 45 59 20 69 73 20 4e 4f  RIMARY KEY is NO
de20: 54 20 4e 55 4c 4c 2e 20 20 28 45 78 63 65 70 74  T NULL.  (Except
de30: 2c 0a 20 20 2a 2a 20 64 6f 20 6e 6f 74 20 65 6e  ,.  ** do not en
de40: 66 6f 72 63 65 20 74 68 69 73 20 66 6f 72 20 69  force this for i
de50: 6d 70 6f 73 74 65 72 20 74 61 62 6c 65 73 2e 29  mposter tables.)
de60: 20 2a 2f 0a 20 20 69 66 28 20 21 64 62 2d 3e 69   */.  if( !db->i
de70: 6e 69 74 2e 69 6d 70 6f 73 74 65 72 54 61 62 6c  nit.imposterTabl
de80: 65 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30  e ){.    for(i=0
de90: 3b 20 69 3c 6e 50 6b 3b 20 69 2b 2b 29 7b 0a 20  ; i<nPk; i++){. 
dea0: 20 20 20 20 20 70 54 61 62 2d 3e 61 43 6f 6c 5b       pTab->aCol[
deb0: 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d  pPk->aiColumn[i]
dec0: 5d 2e 6e 6f 74 4e 75 6c 6c 20 3d 20 4f 45 5f 41  ].notNull = OE_A
ded0: 62 6f 72 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  bort;.    }.    
dee0: 70 50 6b 2d 3e 75 6e 69 71 4e 6f 74 4e 75 6c 6c  pPk->uniqNotNull
def0: 20 3d 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20   = 1;.  }..  /* 
df00: 54 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66  The root page of
df10: 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59   the PRIMARY KEY
df20: 20 69 73 20 74 68 65 20 74 61 62 6c 65 20 72 6f   is the table ro
df30: 6f 74 20 70 61 67 65 20 2a 2f 0a 20 20 70 50 6b  ot page */.  pPk
df40: 2d 3e 74 6e 75 6d 20 3d 20 70 54 61 62 2d 3e 74  ->tnum = pTab->t
df50: 6e 75 6d 3b 0a 0a 20 20 2f 2a 20 55 70 64 61 74  num;..  /* Updat
df60: 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20  e the in-memory 
df70: 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f  representation o
df80: 66 20 61 6c 6c 20 55 4e 49 51 55 45 20 69 6e 64  f all UNIQUE ind
df90: 69 63 65 73 20 62 79 20 63 6f 6e 76 65 72 74 69  ices by converti
dfa0: 6e 67 0a 20 20 2a 2a 20 74 68 65 20 66 69 6e 61  ng.  ** the fina
dfb0: 6c 20 72 6f 77 69 64 20 63 6f 6c 75 6d 6e 20 69  l rowid column i
dfc0: 6e 74 6f 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20  nto one or more 
dfd0: 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 50  columns of the P
dfe0: 52 49 4d 41 52 59 20 4b 45 59 2e 0a 20 20 2a 2f  RIMARY KEY..  */
dff0: 0a 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62  .  for(pIdx=pTab
e000: 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20  ->pIndex; pIdx; 
e010: 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74  pIdx=pIdx->pNext
e020: 29 7b 0a 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20  ){.    int n;.  
e030: 20 20 69 66 28 20 49 73 50 72 69 6d 61 72 79 4b    if( IsPrimaryK
e040: 65 79 49 6e 64 65 78 28 70 49 64 78 29 20 29 20  eyIndex(pIdx) ) 
e050: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 66 6f  continue;.    fo
e060: 72 28 69 3d 6e 3d 30 3b 20 69 3c 6e 50 6b 3b 20  r(i=n=0; i<nPk; 
e070: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  i++){.      if( 
e080: 21 68 61 73 43 6f 6c 75 6d 6e 28 70 49 64 78 2d  !hasColumn(pIdx-
e090: 3e 61 69 43 6f 6c 75 6d 6e 2c 20 70 49 64 78 2d  >aiColumn, pIdx-
e0a0: 3e 6e 4b 65 79 43 6f 6c 2c 20 70 50 6b 2d 3e 61  >nKeyCol, pPk->a
e0b0: 69 43 6f 6c 75 6d 6e 5b 69 5d 29 20 29 20 6e 2b  iColumn[i]) ) n+
e0c0: 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  +;.    }.    if(
e0d0: 20 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f   n==0 ){.      /
e0e0: 2a 20 54 68 69 73 20 69 6e 64 65 78 20 69 73 20  * This index is 
e0f0: 61 20 73 75 70 65 72 73 65 74 20 6f 66 20 74 68  a superset of th
e100: 65 20 70 72 69 6d 61 72 79 20 6b 65 79 20 2a 2f  e primary key */
e110: 0a 20 20 20 20 20 20 70 49 64 78 2d 3e 6e 43 6f  .      pIdx->nCo
e120: 6c 75 6d 6e 20 3d 20 70 49 64 78 2d 3e 6e 4b 65  lumn = pIdx->nKe
e130: 79 43 6f 6c 3b 0a 20 20 20 20 20 20 63 6f 6e 74  yCol;.      cont
e140: 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20  inue;.    }.    
e150: 69 66 28 20 72 65 73 69 7a 65 49 6e 64 65 78 4f  if( resizeIndexO
e160: 62 6a 65 63 74 28 64 62 2c 20 70 49 64 78 2c 20  bject(db, pIdx, 
e170: 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 2b 6e 29  pIdx->nKeyCol+n)
e180: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 66   ) return;.    f
e190: 6f 72 28 69 3d 30 2c 20 6a 3d 70 49 64 78 2d 3e  or(i=0, j=pIdx->
e1a0: 6e 4b 65 79 43 6f 6c 3b 20 69 3c 6e 50 6b 3b 20  nKeyCol; i<nPk; 
e1b0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  i++){.      if( 
e1c0: 21 68 61 73 43 6f 6c 75 6d 6e 28 70 49 64 78 2d  !hasColumn(pIdx-
e1d0: 3e 61 69 43 6f 6c 75 6d 6e 2c 20 70 49 64 78 2d  >aiColumn, pIdx-
e1e0: 3e 6e 4b 65 79 43 6f 6c 2c 20 70 50 6b 2d 3e 61  >nKeyCol, pPk->a
e1f0: 69 43 6f 6c 75 6d 6e 5b 69 5d 29 20 29 7b 0a 20  iColumn[i]) ){. 
e200: 20 20 20 20 20 20 20 70 49 64 78 2d 3e 61 69 43         pIdx->aiC
e210: 6f 6c 75 6d 6e 5b 6a 5d 20 3d 20 70 50 6b 2d 3e  olumn[j] = pPk->
e220: 61 69 43 6f 6c 75 6d 6e 5b 69 5d 3b 0a 20 20 20  aiColumn[i];.   
e230: 20 20 20 20 20 70 49 64 78 2d 3e 61 7a 43 6f 6c       pIdx->azCol
e240: 6c 5b 6a 5d 20 3d 20 70 50 6b 2d 3e 61 7a 43 6f  l[j] = pPk->azCo
e250: 6c 6c 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 6a  ll[i];.        j
e260: 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ++;.      }.    
e270: 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49  }.    assert( pI
e280: 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3e 3d 70 49 64  dx->nColumn>=pId
e290: 78 2d 3e 6e 4b 65 79 43 6f 6c 2b 6e 20 29 3b 0a  x->nKeyCol+n );.
e2a0: 20 20 20 20 61 73 73 65 72 74 28 20 70 49 64 78      assert( pIdx
e2b0: 2d 3e 6e 43 6f 6c 75 6d 6e 3e 3d 6a 20 29 3b 0a  ->nColumn>=j );.
e2c0: 20 20 7d 0a 0a 20 20 2f 2a 20 41 64 64 20 61 6c    }..  /* Add al
e2d0: 6c 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 73 20  l table columns 
e2e0: 74 6f 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b  to the PRIMARY K
e2f0: 45 59 20 69 6e 64 65 78 0a 20 20 2a 2f 0a 20 20  EY index.  */.  
e300: 69 66 28 20 6e 50 6b 3c 70 54 61 62 2d 3e 6e 43  if( nPk<pTab->nC
e310: 6f 6c 20 29 7b 0a 20 20 20 20 69 66 28 20 72 65  ol ){.    if( re
e320: 73 69 7a 65 49 6e 64 65 78 4f 62 6a 65 63 74 28  sizeIndexObject(
e330: 64 62 2c 20 70 50 6b 2c 20 70 54 61 62 2d 3e 6e  db, pPk, pTab->n
e340: 43 6f 6c 29 20 29 20 72 65 74 75 72 6e 3b 0a 20  Col) ) return;. 
e350: 20 20 20 66 6f 72 28 69 3d 30 2c 20 6a 3d 6e 50     for(i=0, j=nP
e360: 6b 3b 20 69 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b  k; i<pTab->nCol;
e370: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   i++){.      if(
e380: 20 21 68 61 73 43 6f 6c 75 6d 6e 28 70 50 6b 2d   !hasColumn(pPk-
e390: 3e 61 69 43 6f 6c 75 6d 6e 2c 20 6a 2c 20 69 29  >aiColumn, j, i)
e3a0: 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
e3b0: 72 74 28 20 6a 3c 70 50 6b 2d 3e 6e 43 6f 6c 75  rt( j<pPk->nColu
e3c0: 6d 6e 20 29 3b 0a 20 20 20 20 20 20 20 20 70 50  mn );.        pP
e3d0: 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 20 3d  k->aiColumn[j] =
e3e0: 20 69 3b 0a 20 20 20 20 20 20 20 20 70 50 6b 2d   i;.        pPk-
e3f0: 3e 61 7a 43 6f 6c 6c 5b 6a 5d 20 3d 20 73 71 6c  >azColl[j] = sql
e400: 69 74 65 33 53 74 72 42 49 4e 41 52 59 3b 0a 20  ite3StrBINARY;. 
e410: 20 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20         j++;.    
e420: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61 73    }.    }.    as
e430: 73 65 72 74 28 20 70 50 6b 2d 3e 6e 43 6f 6c 75  sert( pPk->nColu
e440: 6d 6e 3d 3d 6a 20 29 3b 0a 20 20 20 20 61 73 73  mn==j );.    ass
e450: 65 72 74 28 20 70 54 61 62 2d 3e 6e 43 6f 6c 3d  ert( pTab->nCol=
e460: 3d 6a 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  =j );.  }else{. 
e470: 20 20 20 70 50 6b 2d 3e 6e 43 6f 6c 75 6d 6e 20     pPk->nColumn 
e480: 3d 20 70 54 61 62 2d 3e 6e 43 6f 6c 3b 0a 20 20  = pTab->nCol;.  
e490: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  }.}../*.** This 
e4a0: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
e4b0: 64 20 74 6f 20 72 65 70 6f 72 74 20 74 68 65 20  d to report the 
e4c0: 66 69 6e 61 6c 20 22 29 22 20 74 68 61 74 20 74  final ")" that t
e4d0: 65 72 6d 69 6e 61 74 65 73 0a 2a 2a 20 61 20 43  erminates.** a C
e4e0: 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74  REATE TABLE stat
e4f0: 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ement..**.** The
e500: 20 74 61 62 6c 65 20 73 74 72 75 63 74 75 72 65   table structure
e510: 20 74 68 61 74 20 6f 74 68 65 72 20 61 63 74 69   that other acti
e520: 6f 6e 20 72 6f 75 74 69 6e 65 73 20 68 61 76 65  on routines have
e530: 20 62 65 65 6e 20 62 75 69 6c 64 69 6e 67 0a 2a   been building.*
e540: 2a 20 69 73 20 61 64 64 65 64 20 74 6f 20 74 68  * is added to th
e550: 65 20 69 6e 74 65 72 6e 61 6c 20 68 61 73 68 20  e internal hash 
e560: 74 61 62 6c 65 73 2c 20 61 73 73 75 6d 69 6e 67  tables, assuming
e570: 20 6e 6f 20 65 72 72 6f 72 73 20 68 61 76 65 0a   no errors have.
e580: 2a 2a 20 6f 63 63 75 72 72 65 64 2e 0a 2a 2a 0a  ** occurred..**.
e590: 2a 2a 20 41 6e 20 65 6e 74 72 79 20 66 6f 72 20  ** An entry for 
e5a0: 74 68 65 20 74 61 62 6c 65 20 69 73 20 6d 61 64  the table is mad
e5b0: 65 20 69 6e 20 74 68 65 20 6d 61 73 74 65 72 20  e in the master 
e5c0: 74 61 62 6c 65 20 6f 6e 20 64 69 73 6b 2c 20 75  table on disk, u
e5d0: 6e 6c 65 73 73 0a 2a 2a 20 74 68 69 73 20 69 73  nless.** this is
e5e0: 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62   a temporary tab
e5f0: 6c 65 20 6f 72 20 64 62 2d 3e 69 6e 69 74 2e 62  le or db->init.b
e600: 75 73 79 3d 3d 31 2e 20 20 57 68 65 6e 20 64 62  usy==1.  When db
e610: 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d 31 0a 2a  ->init.busy==1.*
e620: 2a 20 69 74 20 6d 65 61 6e 73 20 77 65 20 61 72  * it means we ar
e630: 65 20 72 65 61 64 69 6e 67 20 74 68 65 20 73 71  e reading the sq
e640: 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c  lite_master tabl
e650: 65 20 62 65 63 61 75 73 65 20 77 65 20 6a 75 73  e because we jus
e660: 74 0a 2a 2a 20 63 6f 6e 6e 65 63 74 65 64 20 74  t.** connected t
e670: 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6f  o the database o
e680: 72 20 62 65 63 61 75 73 65 20 74 68 65 20 73 71  r because the sq
e690: 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c  lite_master tabl
e6a0: 65 20 68 61 73 0a 2a 2a 20 72 65 63 65 6e 74 6c  e has.** recentl
e6b0: 79 20 63 68 61 6e 67 65 64 2c 20 73 6f 20 74 68  y changed, so th
e6c0: 65 20 65 6e 74 72 79 20 66 6f 72 20 74 68 69 73  e entry for this
e6d0: 20 74 61 62 6c 65 20 61 6c 72 65 61 64 79 20 65   table already e
e6e0: 78 69 73 74 73 20 69 6e 0a 2a 2a 20 74 68 65 20  xists in.** the 
e6f0: 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61  sqlite_master ta
e700: 62 6c 65 2e 20 20 57 65 20 64 6f 20 6e 6f 74 20  ble.  We do not 
e710: 77 61 6e 74 20 74 6f 20 63 72 65 61 74 65 20 69  want to create i
e720: 74 20 61 67 61 69 6e 2e 0a 2a 2a 0a 2a 2a 20 49  t again..**.** I
e730: 66 20 74 68 65 20 70 53 65 6c 65 63 74 20 61 72  f the pSelect ar
e740: 67 75 6d 65 6e 74 20 69 73 20 6e 6f 74 20 4e 55  gument is not NU
e750: 4c 4c 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61  LL, it means tha
e760: 74 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a  t this routine.*
e770: 2a 20 77 61 73 20 63 61 6c 6c 65 64 20 74 6f 20  * was called to 
e780: 63 72 65 61 74 65 20 61 20 74 61 62 6c 65 20 67  create a table g
e790: 65 6e 65 72 61 74 65 64 20 66 72 6f 6d 20 61 20  enerated from a 
e7a0: 0a 2a 2a 20 22 43 52 45 41 54 45 20 54 41 42 4c  .** "CREATE TABL
e7b0: 45 20 2e 2e 2e 20 41 53 20 53 45 4c 45 43 54 20  E ... AS SELECT 
e7c0: 2e 2e 2e 22 20 73 74 61 74 65 6d 65 6e 74 2e 20  ..." statement. 
e7d0: 20 54 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65   The column name
e7e0: 73 20 6f 66 0a 2a 2a 20 74 68 65 20 6e 65 77 20  s of.** the new 
e7f0: 74 61 62 6c 65 20 77 69 6c 6c 20 6d 61 74 63 68  table will match
e800: 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
e810: 6f 66 20 74 68 65 20 53 45 4c 45 43 54 2e 0a 2a  of the SELECT..*
e820: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 6e  /.void sqlite3En
e830: 64 54 61 62 6c 65 28 0a 20 20 50 61 72 73 65 20  dTable(.  Parse 
e840: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
e850: 20 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74 65    /* Parse conte
e860: 78 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  xt */.  Token *p
e870: 43 6f 6e 73 2c 20 20 20 20 20 20 20 20 20 20 20  Cons,           
e880: 2f 2a 20 54 68 65 20 27 2c 27 20 74 6f 6b 65 6e  /* The ',' token
e890: 20 61 66 74 65 72 20 74 68 65 20 6c 61 73 74 20   after the last 
e8a0: 63 6f 6c 75 6d 6e 20 64 65 66 6e 2e 20 2a 2f 0a  column defn. */.
e8b0: 20 20 54 6f 6b 65 6e 20 2a 70 45 6e 64 2c 20 20    Token *pEnd,  
e8c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
e8d0: 20 27 29 27 20 62 65 66 6f 72 65 20 6f 70 74 69   ')' before opti
e8e0: 6f 6e 73 20 69 6e 20 74 68 65 20 43 52 45 41 54  ons in the CREAT
e8f0: 45 20 54 41 42 4c 45 20 2a 2f 0a 20 20 75 38 20  E TABLE */.  u8 
e900: 74 61 62 4f 70 74 73 2c 20 20 20 20 20 20 20 20  tabOpts,        
e910: 20 20 20 20 20 2f 2a 20 45 78 74 72 61 20 74 61       /* Extra ta
e920: 62 6c 65 20 6f 70 74 69 6f 6e 73 2e 20 55 73 75  ble options. Usu
e930: 61 6c 6c 79 20 30 2e 20 2a 2f 0a 20 20 53 65 6c  ally 0. */.  Sel
e940: 65 63 74 20 2a 70 53 65 6c 65 63 74 20 20 20 20  ect *pSelect    
e950: 20 20 20 20 20 2f 2a 20 53 65 6c 65 63 74 20 66       /* Select f
e960: 72 6f 6d 20 61 20 22 43 52 45 41 54 45 20 2e 2e  rom a "CREATE ..
e970: 2e 20 41 53 20 53 45 4c 45 43 54 22 20 2a 2f 0a  . AS SELECT" */.
e980: 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 20 20  ){.  Table *p;  
e990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
e9a0: 2a 20 54 68 65 20 6e 65 77 20 74 61 62 6c 65 20  * The new table 
e9b0: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
e9c0: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 2f   = pParse->db; /
e9d0: 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 63  * The database c
e9e0: 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69  onnection */.  i
e9f0: 6e 74 20 69 44 62 3b 20 20 20 20 20 20 20 20 20  nt iDb;         
ea00: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
ea10: 62 61 73 65 20 69 6e 20 77 68 69 63 68 20 74 68  base in which th
ea20: 65 20 74 61 62 6c 65 20 6c 69 76 65 73 20 2a 2f  e table lives */
ea30: 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 20  .  Index *pIdx; 
ea40: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
ea50: 41 6e 20 69 6d 70 6c 69 65 64 20 69 6e 64 65 78  An implied index
ea60: 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 2a 2f   of the table */
ea70: 0a 0a 20 20 69 66 28 20 70 45 6e 64 3d 3d 30 20  ..  if( pEnd==0 
ea80: 26 26 20 70 53 65 6c 65 63 74 3d 3d 30 20 29 7b  && pSelect==0 ){
ea90: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
eaa0: 0a 20 20 61 73 73 65 72 74 28 20 21 64 62 2d 3e  .  assert( !db->
eab0: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
eac0: 20 20 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e    p = pParse->pN
ead0: 65 77 54 61 62 6c 65 3b 0a 20 20 69 66 28 20 70  ewTable;.  if( p
eae0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20  ==0 ) return;.. 
eaf0: 20 61 73 73 65 72 74 28 20 21 64 62 2d 3e 69 6e   assert( !db->in
eb00: 69 74 2e 62 75 73 79 20 7c 7c 20 21 70 53 65 6c  it.busy || !pSel
eb10: 65 63 74 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  ect );..  /* If 
eb20: 74 68 65 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73  the db->init.bus
eb30: 79 20 69 73 20 31 20 69 74 20 6d 65 61 6e 73 20  y is 1 it means 
eb40: 77 65 20 61 72 65 20 72 65 61 64 69 6e 67 20 74  we are reading t
eb50: 68 65 20 53 51 4c 20 6f 66 66 20 74 68 65 0a 20  he SQL off the. 
eb60: 20 2a 2a 20 22 73 71 6c 69 74 65 5f 6d 61 73 74   ** "sqlite_mast
eb70: 65 72 22 20 6f 72 20 22 73 71 6c 69 74 65 5f 74  er" or "sqlite_t
eb80: 65 6d 70 5f 6d 61 73 74 65 72 22 20 74 61 62 6c  emp_master" tabl
eb90: 65 20 6f 6e 20 74 68 65 20 64 69 73 6b 2e 0a 20  e on the disk.. 
eba0: 20 2a 2a 20 53 6f 20 64 6f 20 6e 6f 74 20 77 72   ** So do not wr
ebb0: 69 74 65 20 74 6f 20 74 68 65 20 64 69 73 6b 20  ite to the disk 
ebc0: 61 67 61 69 6e 2e 20 20 45 78 74 72 61 63 74 20  again.  Extract 
ebd0: 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6e 75  the root page nu
ebe0: 6d 62 65 72 0a 20 20 2a 2a 20 66 6f 72 20 74 68  mber.  ** for th
ebf0: 65 20 74 61 62 6c 65 20 66 72 6f 6d 20 74 68 65  e table from the
ec00: 20 64 62 2d 3e 69 6e 69 74 2e 6e 65 77 54 6e 75   db->init.newTnu
ec10: 6d 20 66 69 65 6c 64 2e 20 20 28 54 68 65 20 70  m field.  (The p
ec20: 61 67 65 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20  age number.  ** 
ec30: 73 68 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e  should have been
ec40: 20 70 75 74 20 74 68 65 72 65 20 62 79 20 74 68   put there by th
ec50: 65 20 73 71 6c 69 74 65 4f 70 65 6e 43 62 20 72  e sqliteOpenCb r
ec60: 6f 75 74 69 6e 65 2e 29 0a 20 20 2a 2a 0a 20 20  outine.).  **.  
ec70: 2a 2a 20 49 66 20 74 68 65 20 72 6f 6f 74 20 70  ** If the root p
ec80: 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20 31 2c  age number is 1,
ec90: 20 74 68 61 74 20 6d 65 61 6e 73 20 74 68 69 73   that means this
eca0: 20 69 73 20 74 68 65 20 73 71 6c 69 74 65 5f 6d   is the sqlite_m
ecb0: 61 73 74 65 72 0a 20 20 2a 2a 20 74 61 62 6c 65  aster.  ** table
ecc0: 20 69 74 73 65 6c 66 2e 20 20 53 6f 20 6d 61 72   itself.  So mar
ecd0: 6b 20 69 74 20 72 65 61 64 2d 6f 6e 6c 79 2e 0a  k it read-only..
ece0: 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 69    */.  if( db->i
ecf0: 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20 20 20 20  nit.busy ){.    
ed00: 70 2d 3e 74 6e 75 6d 20 3d 20 64 62 2d 3e 69 6e  p->tnum = db->in
ed10: 69 74 2e 6e 65 77 54 6e 75 6d 3b 0a 20 20 20 20  it.newTnum;.    
ed20: 69 66 28 20 70 2d 3e 74 6e 75 6d 3d 3d 31 20 29  if( p->tnum==1 )
ed30: 20 70 2d 3e 74 61 62 46 6c 61 67 73 20 7c 3d 20   p->tabFlags |= 
ed40: 54 46 5f 52 65 61 64 6f 6e 6c 79 3b 0a 20 20 7d  TF_Readonly;.  }
ed50: 0a 0a 20 20 2f 2a 20 53 70 65 63 69 61 6c 20 70  ..  /* Special p
ed60: 72 6f 63 65 73 73 69 6e 67 20 66 6f 72 20 57 49  rocessing for WI
ed70: 54 48 4f 55 54 20 52 4f 57 49 44 20 54 61 62 6c  THOUT ROWID Tabl
ed80: 65 73 20 2a 2f 0a 20 20 69 66 28 20 74 61 62 4f  es */.  if( tabO
ed90: 70 74 73 20 26 20 54 46 5f 57 69 74 68 6f 75 74  pts & TF_Without
eda0: 52 6f 77 69 64 20 29 7b 0a 20 20 20 20 69 66 28  Rowid ){.    if(
edb0: 20 28 70 2d 3e 74 61 62 46 6c 61 67 73 20 26 20   (p->tabFlags & 
edc0: 54 46 5f 41 75 74 6f 69 6e 63 72 65 6d 65 6e 74  TF_Autoincrement
edd0: 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ) ){.      sqlit
ede0: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
edf0: 65 2c 0a 20 20 20 20 20 20 20 20 20 20 22 41 55  e,.          "AU
ee00: 54 4f 49 4e 43 52 45 4d 45 4e 54 20 6e 6f 74 20  TOINCREMENT not 
ee10: 61 6c 6c 6f 77 65 64 20 6f 6e 20 57 49 54 48 4f  allowed on WITHO
ee20: 55 54 20 52 4f 57 49 44 20 74 61 62 6c 65 73 22  UT ROWID tables"
ee30: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b  );.      return;
ee40: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28  .    }.    if( (
ee50: 70 2d 3e 74 61 62 46 6c 61 67 73 20 26 20 54 46  p->tabFlags & TF
ee60: 5f 48 61 73 50 72 69 6d 61 72 79 4b 65 79 29 3d  _HasPrimaryKey)=
ee70: 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
ee80: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
ee90: 73 65 2c 20 22 50 52 49 4d 41 52 59 20 4b 45 59  se, "PRIMARY KEY
eea0: 20 6d 69 73 73 69 6e 67 20 6f 6e 20 74 61 62 6c   missing on tabl
eeb0: 65 20 25 73 22 2c 20 70 2d 3e 7a 4e 61 6d 65 29  e %s", p->zName)
eec0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
eed0: 20 20 20 70 2d 3e 74 61 62 46 6c 61 67 73 20 7c     p->tabFlags |
eee0: 3d 20 54 46 5f 57 69 74 68 6f 75 74 52 6f 77 69  = TF_WithoutRowi
eef0: 64 20 7c 20 54 46 5f 4e 6f 56 69 73 69 62 6c 65  d | TF_NoVisible
ef00: 52 6f 77 69 64 3b 0a 20 20 20 20 20 20 63 6f 6e  Rowid;.      con
ef10: 76 65 72 74 54 6f 57 69 74 68 6f 75 74 52 6f 77  vertToWithoutRow
ef20: 69 64 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20  idTable(pParse, 
ef30: 70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  p);.    }.  }.. 
ef40: 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63   iDb = sqlite3Sc
ef50: 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20  hemaToIndex(db, 
ef60: 70 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 0a 23 69  p->pSchema);..#i
ef70: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
ef80: 54 5f 43 48 45 43 4b 0a 20 20 2f 2a 20 52 65 73  T_CHECK.  /* Res
ef90: 6f 6c 76 65 20 6e 61 6d 65 73 20 69 6e 20 61 6c  olve names in al
efa0: 6c 20 43 48 45 43 4b 20 63 6f 6e 73 74 72 61 69  l CHECK constrai
efb0: 6e 74 20 65 78 70 72 65 73 73 69 6f 6e 73 2e 0a  nt expressions..
efc0: 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 43    */.  if( p->pC
efd0: 68 65 63 6b 20 29 7b 0a 20 20 20 20 73 71 6c 69  heck ){.    sqli
efe0: 74 65 33 52 65 73 6f 6c 76 65 53 65 6c 66 52 65  te3ResolveSelfRe
eff0: 66 65 72 65 6e 63 65 28 70 50 61 72 73 65 2c 20  ference(pParse, 
f000: 70 2c 20 4e 43 5f 49 73 43 68 65 63 6b 2c 20 30  p, NC_IsCheck, 0
f010: 2c 20 70 2d 3e 70 43 68 65 63 6b 29 3b 0a 20 20  , p->pCheck);.  
f020: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66  }.#endif /* !def
f030: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
f040: 5f 43 48 45 43 4b 29 20 2a 2f 0a 0a 20 20 2f 2a  _CHECK) */..  /*
f050: 20 45 73 74 69 6d 61 74 65 20 74 68 65 20 61 76   Estimate the av
f060: 65 72 61 67 65 20 72 6f 77 20 73 69 7a 65 20 66  erage row size f
f070: 6f 72 20 74 68 65 20 74 61 62 6c 65 20 61 6e 64  or the table and
f080: 20 66 6f 72 20 61 6c 6c 20 69 6d 70 6c 69 65 64   for all implied
f090: 20 69 6e 64 69 63 65 73 20 2a 2f 0a 20 20 65 73   indices */.  es
f0a0: 74 69 6d 61 74 65 54 61 62 6c 65 57 69 64 74 68  timateTableWidth
f0b0: 28 70 29 3b 0a 20 20 66 6f 72 28 70 49 64 78 3d  (p);.  for(pIdx=
f0c0: 70 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b  p->pIndex; pIdx;
f0d0: 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78   pIdx=pIdx->pNex
f0e0: 74 29 7b 0a 20 20 20 20 65 73 74 69 6d 61 74 65  t){.    estimate
f0f0: 49 6e 64 65 78 57 69 64 74 68 28 70 49 64 78 29  IndexWidth(pIdx)
f100: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 6e  ;.  }..  /* If n
f110: 6f 74 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 2c  ot initializing,
f120: 20 74 68 65 6e 20 63 72 65 61 74 65 20 61 20 72   then create a r
f130: 65 63 6f 72 64 20 66 6f 72 20 74 68 65 20 6e 65  ecord for the ne
f140: 77 20 74 61 62 6c 65 0a 20 20 2a 2a 20 69 6e 20  w table.  ** in 
f150: 74 68 65 20 53 51 4c 49 54 45 5f 4d 41 53 54 45  the SQLITE_MASTE
f160: 52 20 74 61 62 6c 65 20 6f 66 20 74 68 65 20 64  R table of the d
f170: 61 74 61 62 61 73 65 2e 0a 20 20 2a 2a 0a 20 20  atabase..  **.  
f180: 2a 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 20  ** If this is a 
f190: 54 45 4d 50 4f 52 41 52 59 20 74 61 62 6c 65 2c  TEMPORARY table,
f1a0: 20 77 72 69 74 65 20 74 68 65 20 65 6e 74 72 79   write the entry
f1b0: 20 69 6e 74 6f 20 74 68 65 20 61 75 78 69 6c 69   into the auxili
f1c0: 61 72 79 0a 20 20 2a 2a 20 66 69 6c 65 20 69 6e  ary.  ** file in
f1d0: 73 74 65 61 64 20 6f 66 20 69 6e 74 6f 20 74 68  stead of into th
f1e0: 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20  e main database 
f1f0: 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  file..  */.  if(
f200: 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20   !db->init.busy 
f210: 29 7b 0a 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20  ){.    int n;.  
f220: 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 20 20 63    Vdbe *v;.    c
f230: 68 61 72 20 2a 7a 54 79 70 65 3b 20 20 20 20 2f  har *zType;    /
f240: 2a 20 22 76 69 65 77 22 20 6f 72 20 22 74 61 62  * "view" or "tab
f250: 6c 65 22 20 2a 2f 0a 20 20 20 20 63 68 61 72 20  le" */.    char 
f260: 2a 7a 54 79 70 65 32 3b 20 20 20 2f 2a 20 22 56  *zType2;   /* "V
f270: 49 45 57 22 20 6f 72 20 22 54 41 42 4c 45 22 20  IEW" or "TABLE" 
f280: 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 53 74  */.    char *zSt
f290: 6d 74 3b 20 20 20 20 2f 2a 20 54 65 78 74 20 6f  mt;    /* Text o
f2a0: 66 20 74 68 65 20 43 52 45 41 54 45 20 54 41 42  f the CREATE TAB
f2b0: 4c 45 20 6f 72 20 43 52 45 41 54 45 20 56 49 45  LE or CREATE VIE
f2c0: 57 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 0a  W statement */..
f2d0: 20 20 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47      v = sqlite3G
f2e0: 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
f2f0: 20 20 20 20 69 66 28 20 4e 45 56 45 52 28 76 3d      if( NEVER(v=
f300: 3d 30 29 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20  =0) ) return;.. 
f310: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
f320: 64 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65  dOp1(v, OP_Close
f330: 2c 20 30 29 3b 0a 0a 20 20 20 20 2f 2a 20 0a 20  , 0);..    /* . 
f340: 20 20 20 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65     ** Initialize
f350: 20 7a 54 79 70 65 20 66 6f 72 20 74 68 65 20 6e   zType for the n
f360: 65 77 20 76 69 65 77 20 6f 72 20 74 61 62 6c 65  ew view or table
f370: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
f380: 20 70 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20 29   p->pSelect==0 )
f390: 7b 0a 20 20 20 20 20 20 2f 2a 20 41 20 72 65 67  {.      /* A reg
f3a0: 75 6c 61 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20  ular table */.  
f3b0: 20 20 20 20 7a 54 79 70 65 20 3d 20 22 74 61 62      zType = "tab
f3c0: 6c 65 22 3b 0a 20 20 20 20 20 20 7a 54 79 70 65  le";.      zType
f3d0: 32 20 3d 20 22 54 41 42 4c 45 22 3b 0a 23 69 66  2 = "TABLE";.#if
f3e0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
f3f0: 5f 56 49 45 57 0a 20 20 20 20 7d 65 6c 73 65 7b  _VIEW.    }else{
f400: 0a 20 20 20 20 20 20 2f 2a 20 41 20 76 69 65 77  .      /* A view
f410: 20 2a 2f 0a 20 20 20 20 20 20 7a 54 79 70 65 20   */.      zType 
f420: 3d 20 22 76 69 65 77 22 3b 0a 20 20 20 20 20 20  = "view";.      
f430: 7a 54 79 70 65 32 20 3d 20 22 56 49 45 57 22 3b  zType2 = "VIEW";
f440: 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 0a 20  .#endif.    }.. 
f450: 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73     /* If this is
f460: 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20   a CREATE TABLE 
f470: 78 78 20 41 53 20 53 45 4c 45 43 54 20 2e 2e 2e  xx AS SELECT ...
f480: 2c 20 65 78 65 63 75 74 65 20 74 68 65 20 53 45  , execute the SE
f490: 4c 45 43 54 0a 20 20 20 20 2a 2a 20 73 74 61 74  LECT.    ** stat
f4a0: 65 6d 65 6e 74 20 74 6f 20 70 6f 70 75 6c 61 74  ement to populat
f4b0: 65 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 2e  e the new table.
f4c0: 20 54 68 65 20 72 6f 6f 74 2d 70 61 67 65 20 6e   The root-page n
f4d0: 75 6d 62 65 72 20 66 6f 72 20 74 68 65 0a 20 20  umber for the.  
f4e0: 20 20 2a 2a 20 6e 65 77 20 74 61 62 6c 65 20 69    ** new table i
f4f0: 73 20 69 6e 20 72 65 67 69 73 74 65 72 20 70 50  s in register pP
f500: 61 72 73 65 2d 3e 72 65 67 52 6f 6f 74 2e 0a 20  arse->regRoot.. 
f510: 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 4f 6e 63     **.    ** Onc
f520: 65 20 74 68 65 20 53 45 4c 45 43 54 20 68 61 73  e the SELECT has
f530: 20 62 65 65 6e 20 63 6f 64 65 64 20 62 79 20 73   been coded by s
f540: 71 6c 69 74 65 33 53 65 6c 65 63 74 28 29 2c 20  qlite3Select(), 
f550: 69 74 20 69 73 20 69 6e 20 61 0a 20 20 20 20 2a  it is in a.    *
f560: 2a 20 73 75 69 74 61 62 6c 65 20 73 74 61 74 65  * suitable state
f570: 20 74 6f 20 71 75 65 72 79 20 66 6f 72 20 74 68   to query for th
f580: 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 61  e column names a
f590: 6e 64 20 74 79 70 65 73 20 74 6f 20 62 65 20 75  nd types to be u
f5a0: 73 65 64 0a 20 20 20 20 2a 2a 20 62 79 20 74 68  sed.    ** by th
f5b0: 65 20 6e 65 77 20 74 61 62 6c 65 2e 0a 20 20 20  e new table..   
f5c0: 20 2a 2a 0a 20 20 20 20 2a 2a 20 41 20 73 68 61   **.    ** A sha
f5d0: 72 65 64 2d 63 61 63 68 65 20 77 72 69 74 65 2d  red-cache write-
f5e0: 6c 6f 63 6b 20 69 73 20 6e 6f 74 20 72 65 71 75  lock is not requ
f5f0: 69 72 65 64 20 74 6f 20 77 72 69 74 65 20 74 6f  ired to write to
f600: 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 2c 0a   the new table,.
f610: 20 20 20 20 2a 2a 20 61 73 20 61 20 73 63 68 65      ** as a sche
f620: 6d 61 2d 6c 6f 63 6b 20 6d 75 73 74 20 68 61 76  ma-lock must hav
f630: 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 6f  e already been o
f640: 62 74 61 69 6e 65 64 20 74 6f 20 63 72 65 61 74  btained to creat
f650: 65 20 69 74 2e 20 53 69 6e 63 65 0a 20 20 20 20  e it. Since.    
f660: 2a 2a 20 61 20 73 63 68 65 6d 61 2d 6c 6f 63 6b  ** a schema-lock
f670: 20 65 78 63 6c 75 64 65 73 20 61 6c 6c 20 6f 74   excludes all ot
f680: 68 65 72 20 64 61 74 61 62 61 73 65 20 75 73 65  her database use
f690: 72 73 2c 20 74 68 65 20 77 72 69 74 65 2d 6c 6f  rs, the write-lo
f6a0: 63 6b 20 77 6f 75 6c 64 0a 20 20 20 20 2a 2a 20  ck would.    ** 
f6b0: 62 65 20 72 65 64 75 6e 64 61 6e 74 2e 0a 20 20  be redundant..  
f6c0: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 53 65    */.    if( pSe
f6d0: 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 53 65  lect ){.      Se
f6e0: 6c 65 63 74 44 65 73 74 20 64 65 73 74 3b 20 20  lectDest dest;  
f6f0: 20 20 2f 2a 20 57 68 65 72 65 20 74 68 65 20 53    /* Where the S
f700: 45 4c 45 43 54 20 73 68 6f 75 6c 64 20 73 74 6f  ELECT should sto
f710: 72 65 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20  re results */.  
f720: 20 20 20 20 69 6e 74 20 72 65 67 59 69 65 6c 64      int regYield
f730: 3b 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73  ;       /* Regis
f740: 74 65 72 20 68 6f 6c 64 69 6e 67 20 63 6f 2d 72  ter holding co-r
f750: 6f 75 74 69 6e 65 20 65 6e 74 72 79 2d 70 6f 69  outine entry-poi
f760: 6e 74 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  nt */.      int 
f770: 61 64 64 72 54 6f 70 3b 20 20 20 20 20 20 20 20  addrTop;        
f780: 2f 2a 20 54 6f 70 20 6f 66 20 74 68 65 20 63 6f  /* Top of the co
f790: 2d 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 20 20  -routine */.    
f7a0: 20 20 69 6e 74 20 72 65 67 52 65 63 3b 20 20 20    int regRec;   
f7b0: 20 20 20 20 20 20 2f 2a 20 41 20 72 65 63 6f 72        /* A recor
f7c0: 64 20 74 6f 20 62 65 20 69 6e 73 65 72 74 20 69  d to be insert i
f7d0: 6e 74 6f 20 74 68 65 20 6e 65 77 20 74 61 62 6c  nto the new tabl
f7e0: 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 72  e */.      int r
f7f0: 65 67 52 6f 77 69 64 3b 20 20 20 20 20 20 20 2f  egRowid;       /
f800: 2a 20 52 6f 77 69 64 20 6f 66 20 74 68 65 20 6e  * Rowid of the n
f810: 65 78 74 20 72 6f 77 20 74 6f 20 69 6e 73 65 72  ext row to inser
f820: 74 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61  t */.      int a
f830: 64 64 72 49 6e 73 4c 6f 6f 70 3b 20 20 20 20 2f  ddrInsLoop;    /
f840: 2a 20 54 6f 70 20 6f 66 20 74 68 65 20 6c 6f 6f  * Top of the loo
f850: 70 20 66 6f 72 20 69 6e 73 65 72 74 69 6e 67 20  p for inserting 
f860: 72 6f 77 73 20 2a 2f 0a 20 20 20 20 20 20 54 61  rows */.      Ta
f870: 62 6c 65 20 2a 70 53 65 6c 54 61 62 3b 20 20 20  ble *pSelTab;   
f880: 20 20 2f 2a 20 41 20 74 61 62 6c 65 20 74 68 61    /* A table tha
f890: 74 20 64 65 73 63 72 69 62 65 73 20 74 68 65 20  t describes the 
f8a0: 53 45 4c 45 43 54 20 72 65 73 75 6c 74 73 20 2a  SELECT results *
f8b0: 2f 0a 0a 20 20 20 20 20 20 72 65 67 59 69 65 6c  /..      regYiel
f8c0: 64 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  d = ++pParse->nM
f8d0: 65 6d 3b 0a 20 20 20 20 20 20 72 65 67 52 65 63  em;.      regRec
f8e0: 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
f8f0: 6d 3b 0a 20 20 20 20 20 20 72 65 67 52 6f 77 69  m;.      regRowi
f900: 64 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  d = ++pParse->nM
f910: 65 6d 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  em;.      assert
f920: 28 70 50 61 72 73 65 2d 3e 6e 54 61 62 3d 3d 31  (pParse->nTab==1
f930: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
f940: 4d 61 79 41 62 6f 72 74 28 70 50 61 72 73 65 29  MayAbort(pParse)
f950: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
f960: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
f970: 4f 70 65 6e 57 72 69 74 65 2c 20 31 2c 20 70 50  OpenWrite, 1, pP
f980: 61 72 73 65 2d 3e 72 65 67 52 6f 6f 74 2c 20 69  arse->regRoot, i
f990: 44 62 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  Db);.      sqlit
f9a0: 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76  e3VdbeChangeP5(v
f9b0: 2c 20 4f 50 46 4c 41 47 5f 50 32 49 53 52 45 47  , OPFLAG_P2ISREG
f9c0: 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d  );.      pParse-
f9d0: 3e 6e 54 61 62 20 3d 20 32 3b 0a 20 20 20 20 20  >nTab = 2;.     
f9e0: 20 61 64 64 72 54 6f 70 20 3d 20 73 71 6c 69 74   addrTop = sqlit
f9f0: 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
fa00: 72 28 76 29 20 2b 20 31 3b 0a 20 20 20 20 20 20  r(v) + 1;.      
fa10: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
fa20: 33 28 76 2c 20 4f 50 5f 49 6e 69 74 43 6f 72 6f  3(v, OP_InitCoro
fa30: 75 74 69 6e 65 2c 20 72 65 67 59 69 65 6c 64 2c  utine, regYield,
fa40: 20 30 2c 20 61 64 64 72 54 6f 70 29 3b 0a 20 20   0, addrTop);.  
fa50: 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63      sqlite3Selec
fa60: 74 44 65 73 74 49 6e 69 74 28 26 64 65 73 74 2c  tDestInit(&dest,
fa70: 20 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 2c 20   SRT_Coroutine, 
fa80: 72 65 67 59 69 65 6c 64 29 3b 0a 20 20 20 20 20  regYield);.     
fa90: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70   sqlite3Select(p
faa0: 50 61 72 73 65 2c 20 70 53 65 6c 65 63 74 2c 20  Parse, pSelect, 
fab0: 26 64 65 73 74 29 3b 0a 20 20 20 20 20 20 73 71  &dest);.      sq
fac0: 6c 69 74 65 33 56 64 62 65 45 6e 64 43 6f 72 6f  lite3VdbeEndCoro
fad0: 75 74 69 6e 65 28 76 2c 20 72 65 67 59 69 65 6c  utine(v, regYiel
fae0: 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  d);.      sqlite
faf0: 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
fb00: 20 61 64 64 72 54 6f 70 20 2d 20 31 29 3b 0a 20   addrTop - 1);. 
fb10: 20 20 20 20 20 69 66 28 20 70 50 61 72 73 65 2d       if( pParse-
fb20: 3e 6e 45 72 72 20 29 20 72 65 74 75 72 6e 3b 0a  >nErr ) return;.
fb30: 20 20 20 20 20 20 70 53 65 6c 54 61 62 20 3d 20        pSelTab = 
fb40: 73 71 6c 69 74 65 33 52 65 73 75 6c 74 53 65 74  sqlite3ResultSet
fb50: 4f 66 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  OfSelect(pParse,
fb60: 20 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 20   pSelect);.     
fb70: 20 69 66 28 20 70 53 65 6c 54 61 62 3d 3d 30 20   if( pSelTab==0 
fb80: 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20  ) return;.      
fb90: 61 73 73 65 72 74 28 20 70 2d 3e 61 43 6f 6c 3d  assert( p->aCol=
fba0: 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 2d 3e 6e  =0 );.      p->n
fbb0: 43 6f 6c 20 3d 20 70 53 65 6c 54 61 62 2d 3e 6e  Col = pSelTab->n
fbc0: 43 6f 6c 3b 0a 20 20 20 20 20 20 70 2d 3e 61 43  Col;.      p->aC
fbd0: 6f 6c 20 3d 20 70 53 65 6c 54 61 62 2d 3e 61 43  ol = pSelTab->aC
fbe0: 6f 6c 3b 0a 20 20 20 20 20 20 70 53 65 6c 54 61  ol;.      pSelTa
fbf0: 62 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20  b->nCol = 0;.   
fc00: 20 20 20 70 53 65 6c 54 61 62 2d 3e 61 43 6f 6c     pSelTab->aCol
fc10: 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 71 6c 69   = 0;.      sqli
fc20: 74 65 33 44 65 6c 65 74 65 54 61 62 6c 65 28 64  te3DeleteTable(d
fc30: 62 2c 20 70 53 65 6c 54 61 62 29 3b 0a 20 20 20  b, pSelTab);.   
fc40: 20 20 20 61 64 64 72 49 6e 73 4c 6f 6f 70 20 3d     addrInsLoop =
fc50: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
fc60: 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20  p1(v, OP_Yield, 
fc70: 64 65 73 74 2e 69 53 44 50 61 72 6d 29 3b 0a 20  dest.iSDParm);. 
fc80: 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
fc90: 65 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  e(v);.      sqli
fca0: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
fcb0: 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20   OP_MakeRecord, 
fcc0: 64 65 73 74 2e 69 53 64 73 74 2c 20 64 65 73 74  dest.iSdst, dest
fcd0: 2e 6e 53 64 73 74 2c 20 72 65 67 52 65 63 29 3b  .nSdst, regRec);
fce0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 54 61  .      sqlite3Ta
fcf0: 62 6c 65 41 66 66 69 6e 69 74 79 28 76 2c 20 70  bleAffinity(v, p
fd00: 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
fd10: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
fd20: 20 4f 50 5f 4e 65 77 52 6f 77 69 64 2c 20 31 2c   OP_NewRowid, 1,
fd30: 20 72 65 67 52 6f 77 69 64 29 3b 0a 20 20 20 20   regRowid);.    
fd40: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
fd50: 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74  Op3(v, OP_Insert
fd60: 2c 20 31 2c 20 72 65 67 52 65 63 2c 20 72 65 67  , 1, regRec, reg
fd70: 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 73 71  Rowid);.      sq
fd80: 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c  lite3VdbeGoto(v,
fd90: 20 61 64 64 72 49 6e 73 4c 6f 6f 70 29 3b 0a 20   addrInsLoop);. 
fda0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
fdb0: 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
fdc0: 49 6e 73 4c 6f 6f 70 29 3b 0a 20 20 20 20 20 20  InsLoop);.      
fdd0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
fde0: 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 31  1(v, OP_Close, 1
fdf0: 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  );.    }..    /*
fe00: 20 43 6f 6d 70 75 74 65 20 74 68 65 20 63 6f 6d   Compute the com
fe10: 70 6c 65 74 65 20 74 65 78 74 20 6f 66 20 74 68  plete text of th
fe20: 65 20 43 52 45 41 54 45 20 73 74 61 74 65 6d 65  e CREATE stateme
fe30: 6e 74 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 53  nt */.    if( pS
fe40: 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 7a  elect ){.      z
fe50: 53 74 6d 74 20 3d 20 63 72 65 61 74 65 54 61 62  Stmt = createTab
fe60: 6c 65 53 74 6d 74 28 64 62 2c 20 70 29 3b 0a 20  leStmt(db, p);. 
fe70: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
fe80: 54 6f 6b 65 6e 20 2a 70 45 6e 64 32 20 3d 20 74  Token *pEnd2 = t
fe90: 61 62 4f 70 74 73 20 3f 20 26 70 50 61 72 73 65  abOpts ? &pParse
fea0: 2d 3e 73 4c 61 73 74 54 6f 6b 65 6e 20 3a 20 70  ->sLastToken : p
feb0: 45 6e 64 3b 0a 20 20 20 20 20 20 6e 20 3d 20 28  End;.      n = (
fec0: 69 6e 74 29 28 70 45 6e 64 32 2d 3e 7a 20 2d 20  int)(pEnd2->z - 
fed0: 70 50 61 72 73 65 2d 3e 73 4e 61 6d 65 54 6f 6b  pParse->sNameTok
fee0: 65 6e 2e 7a 29 3b 0a 20 20 20 20 20 20 69 66 28  en.z);.      if(
fef0: 20 70 45 6e 64 32 2d 3e 7a 5b 30 5d 21 3d 27 3b   pEnd2->z[0]!=';
ff00: 27 20 29 20 6e 20 2b 3d 20 70 45 6e 64 32 2d 3e  ' ) n += pEnd2->
ff10: 6e 3b 0a 20 20 20 20 20 20 7a 53 74 6d 74 20 3d  n;.      zStmt =
ff20: 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
ff30: 64 62 2c 20 0a 20 20 20 20 20 20 20 20 20 20 22  db, .          "
ff40: 43 52 45 41 54 45 20 25 73 20 25 2e 2a 73 22 2c  CREATE %s %.*s",
ff50: 20 7a 54 79 70 65 32 2c 20 6e 2c 20 70 50 61 72   zType2, n, pPar
ff60: 73 65 2d 3e 73 4e 61 6d 65 54 6f 6b 65 6e 2e 7a  se->sNameToken.z
ff70: 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a  .      );.    }.
ff80: 0a 20 20 20 20 2f 2a 20 41 20 73 6c 6f 74 20 66  .    /* A slot f
ff90: 6f 72 20 74 68 65 20 72 65 63 6f 72 64 20 68 61  or the record ha
ffa0: 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 61  s already been a
ffb0: 6c 6c 6f 63 61 74 65 64 20 69 6e 20 74 68 65 20  llocated in the 
ffc0: 0a 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 4d  .    ** SQLITE_M
ffd0: 41 53 54 45 52 20 74 61 62 6c 65 2e 20 20 57 65  ASTER table.  We
ffe0: 20 6a 75 73 74 20 6e 65 65 64 20 74 6f 20 75 70   just need to up
fff0: 64 61 74 65 20 74 68 61 74 20 73 6c 6f 74 20 77  date that slot w
10000 69 74 68 20 61 6c 6c 0a 20 20 20 20 2a 2a 20 74  ith all.    ** t
10010 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 77  he information w
10020 65 27 76 65 20 63 6f 6c 6c 65 63 74 65 64 2e 0a  e've collected..
10030 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74      */.    sqlit
10040 65 33 4e 65 73 74 65 64 50 61 72 73 65 28 70 50  e3NestedParse(pP
10050 61 72 73 65 2c 0a 20 20 20 20 20 20 22 55 50 44  arse,.      "UPD
10060 41 54 45 20 25 51 2e 25 73 20 22 0a 20 20 20 20  ATE %Q.%s ".    
10070 20 20 20 20 20 22 53 45 54 20 74 79 70 65 3d 27       "SET type='
10080 25 73 27 2c 20 6e 61 6d 65 3d 25 51 2c 20 74 62  %s', name=%Q, tb
10090 6c 5f 6e 61 6d 65 3d 25 51 2c 20 72 6f 6f 74 70  l_name=%Q, rootp
100a0 61 67 65 3d 23 25 64 2c 20 73 71 6c 3d 25 51 20  age=#%d, sql=%Q 
100b0 22 0a 20 20 20 20 20 20 20 22 57 48 45 52 45 20  ".       "WHERE 
100c0 72 6f 77 69 64 3d 23 25 64 22 2c 0a 20 20 20 20  rowid=#%d",.    
100d0 20 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a    db->aDb[iDb].z
100e0 4e 61 6d 65 2c 20 53 43 48 45 4d 41 5f 54 41 42  Name, SCHEMA_TAB
100f0 4c 45 28 69 44 62 29 2c 0a 20 20 20 20 20 20 7a  LE(iDb),.      z
10100 54 79 70 65 2c 0a 20 20 20 20 20 20 70 2d 3e 7a  Type,.      p->z
10110 4e 61 6d 65 2c 0a 20 20 20 20 20 20 70 2d 3e 7a  Name,.      p->z
10120 4e 61 6d 65 2c 0a 20 20 20 20 20 20 70 50 61 72  Name,.      pPar
10130 73 65 2d 3e 72 65 67 52 6f 6f 74 2c 0a 20 20 20  se->regRoot,.   
10140 20 20 20 7a 53 74 6d 74 2c 0a 20 20 20 20 20 20     zStmt,.      
10150 70 50 61 72 73 65 2d 3e 72 65 67 52 6f 77 69 64  pParse->regRowid
10160 0a 20 20 20 20 29 3b 0a 20 20 20 20 73 71 6c 69  .    );.    sqli
10170 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 53  te3DbFree(db, zS
10180 74 6d 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  tmt);.    sqlite
10190 33 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28 70 50  3ChangeCookie(pP
101a0 61 72 73 65 2c 20 69 44 62 29 3b 0a 0a 23 69 66  arse, iDb);..#if
101b0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
101c0 5f 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 0a 20  _AUTOINCREMENT. 
101d0 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73     /* Check to s
101e0 65 65 20 69 66 20 77 65 20 6e 65 65 64 20 74 6f  ee if we need to
101f0 20 63 72 65 61 74 65 20 61 6e 20 73 71 6c 69 74   create an sqlit
10200 65 5f 73 65 71 75 65 6e 63 65 20 74 61 62 6c 65  e_sequence table
10210 20 66 6f 72 0a 20 20 20 20 2a 2a 20 6b 65 65 70   for.    ** keep
10220 69 6e 67 20 74 72 61 63 6b 20 6f 66 20 61 75 74  ing track of aut
10230 6f 69 6e 63 72 65 6d 65 6e 74 20 6b 65 79 73 2e  oincrement keys.
10240 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
10250 70 2d 3e 74 61 62 46 6c 61 67 73 20 26 20 54 46  p->tabFlags & TF
10260 5f 41 75 74 6f 69 6e 63 72 65 6d 65 6e 74 20 29  _Autoincrement )
10270 7b 0a 20 20 20 20 20 20 44 62 20 2a 70 44 62 20  {.      Db *pDb 
10280 3d 20 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d 3b  = &db->aDb[iDb];
10290 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73  .      assert( s
102a0 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65  qlite3SchemaMute
102b0 78 48 65 6c 64 28 64 62 2c 20 69 44 62 2c 20 30  xHeld(db, iDb, 0
102c0 29 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  ) );.      if( p
102d0 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 70 53 65  Db->pSchema->pSe
102e0 71 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 20  qTab==0 ){.     
102f0 20 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64     sqlite3Nested
10300 50 61 72 73 65 28 70 50 61 72 73 65 2c 0a 20 20  Parse(pParse,.  
10310 20 20 20 20 20 20 20 20 22 43 52 45 41 54 45 20          "CREATE 
10320 54 41 42 4c 45 20 25 51 2e 73 71 6c 69 74 65 5f  TABLE %Q.sqlite_
10330 73 65 71 75 65 6e 63 65 28 6e 61 6d 65 2c 73 65  sequence(name,se
10340 71 29 22 2c 0a 20 20 20 20 20 20 20 20 20 20 70  q)",.          p
10350 44 62 2d 3e 7a 4e 61 6d 65 0a 20 20 20 20 20 20  Db->zName.      
10360 20 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20    );.      }.   
10370 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f   }.#endif..    /
10380 2a 20 52 65 70 61 72 73 65 20 65 76 65 72 79 74  * Reparse everyt
10390 68 69 6e 67 20 74 6f 20 75 70 64 61 74 65 20 6f  hing to update o
103a0 75 72 20 69 6e 74 65 72 6e 61 6c 20 64 61 74 61  ur internal data
103b0 20 73 74 72 75 63 74 75 72 65 73 20 2a 2f 0a 20   structures */. 
103c0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
103d0 64 50 61 72 73 65 53 63 68 65 6d 61 4f 70 28 76  dParseSchemaOp(v
103e0 2c 20 69 44 62 2c 0a 20 20 20 20 20 20 20 20 20  , iDb,.         
103f0 20 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66    sqlite3MPrintf
10400 28 64 62 2c 20 22 74 62 6c 5f 6e 61 6d 65 3d 27  (db, "tbl_name='
10410 25 71 27 20 41 4e 44 20 74 79 70 65 21 3d 27 74  %q' AND type!='t
10420 72 69 67 67 65 72 27 22 2c 20 70 2d 3e 7a 4e 61  rigger'", p->zNa
10430 6d 65 29 29 3b 0a 20 20 7d 0a 0a 0a 20 20 2f 2a  me));.  }...  /*
10440 20 41 64 64 20 74 68 65 20 74 61 62 6c 65 20 74   Add the table t
10450 6f 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20  o the in-memory 
10460 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f  representation o
10470 66 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a  f the database..
10480 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 69    */.  if( db->i
10490 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20 20 20 20  nit.busy ){.    
104a0 54 61 62 6c 65 20 2a 70 4f 6c 64 3b 0a 20 20 20  Table *pOld;.   
104b0 20 53 63 68 65 6d 61 20 2a 70 53 63 68 65 6d 61   Schema *pSchema
104c0 20 3d 20 70 2d 3e 70 53 63 68 65 6d 61 3b 0a 20   = p->pSchema;. 
104d0 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
104e0 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c  e3SchemaMutexHel
104f0 64 28 64 62 2c 20 69 44 62 2c 20 30 29 20 29 3b  d(db, iDb, 0) );
10500 0a 20 20 20 20 70 4f 6c 64 20 3d 20 73 71 6c 69  .    pOld = sqli
10510 74 65 33 48 61 73 68 49 6e 73 65 72 74 28 26 70  te3HashInsert(&p
10520 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68 2c  Schema->tblHash,
10530 20 70 2d 3e 7a 4e 61 6d 65 2c 20 70 29 3b 0a 20   p->zName, p);. 
10540 20 20 20 69 66 28 20 70 4f 6c 64 20 29 7b 0a 20     if( pOld ){. 
10550 20 20 20 20 20 61 73 73 65 72 74 28 20 70 3d 3d       assert( p==
10560 70 4f 6c 64 20 29 3b 20 20 2f 2a 20 4d 61 6c 6c  pOld );  /* Mall
10570 6f 63 20 6d 75 73 74 20 68 61 76 65 20 66 61 69  oc must have fai
10580 6c 65 64 20 69 6e 73 69 64 65 20 48 61 73 68 49  led inside HashI
10590 6e 73 65 72 74 28 29 20 2a 2f 0a 20 20 20 20 20  nsert() */.     
105a0 20 73 71 6c 69 74 65 33 4f 6f 6d 46 61 75 6c 74   sqlite3OomFault
105b0 28 64 62 29 3b 0a 20 20 20 20 20 20 72 65 74 75  (db);.      retu
105c0 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50  rn;.    }.    pP
105d0 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20  arse->pNewTable 
105e0 3d 20 30 3b 0a 20 20 20 20 64 62 2d 3e 66 6c 61  = 0;.    db->fla
105f0 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 49 6e 74  gs |= SQLITE_Int
10600 65 72 6e 43 68 61 6e 67 65 73 3b 0a 0a 23 69 66  ernChanges;..#if
10610 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
10620 5f 41 4c 54 45 52 54 41 42 4c 45 0a 20 20 20 20  _ALTERTABLE.    
10630 69 66 28 20 21 70 2d 3e 70 53 65 6c 65 63 74 20  if( !p->pSelect 
10640 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63  ){.      const c
10650 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 28 63 6f  har *zName = (co
10660 6e 73 74 20 63 68 61 72 20 2a 29 70 50 61 72 73  nst char *)pPars
10670 65 2d 3e 73 4e 61 6d 65 54 6f 6b 65 6e 2e 7a 3b  e->sNameToken.z;
10680 0a 20 20 20 20 20 20 69 6e 74 20 6e 4e 61 6d 65  .      int nName
10690 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
106a0 21 70 53 65 6c 65 63 74 20 26 26 20 70 43 6f 6e  !pSelect && pCon
106b0 73 20 26 26 20 70 45 6e 64 20 29 3b 0a 20 20 20  s && pEnd );.   
106c0 20 20 20 69 66 28 20 70 43 6f 6e 73 2d 3e 7a 3d     if( pCons->z=
106d0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43  =0 ){.        pC
106e0 6f 6e 73 20 3d 20 70 45 6e 64 3b 0a 20 20 20 20  ons = pEnd;.    
106f0 20 20 7d 0a 20 20 20 20 20 20 6e 4e 61 6d 65 20    }.      nName 
10700 3d 20 28 69 6e 74 29 28 28 63 6f 6e 73 74 20 63  = (int)((const c
10710 68 61 72 20 2a 29 70 43 6f 6e 73 2d 3e 7a 20 2d  har *)pCons->z -
10720 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 70   zName);.      p
10730 2d 3e 61 64 64 43 6f 6c 4f 66 66 73 65 74 20 3d  ->addColOffset =
10740 20 31 33 20 2b 20 73 71 6c 69 74 65 33 55 74 66   13 + sqlite3Utf
10750 38 43 68 61 72 4c 65 6e 28 7a 4e 61 6d 65 2c 20  8CharLen(zName, 
10760 6e 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 23 65  nName);.    }.#e
10770 6e 64 69 66 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e  ndif.  }.}..#ifn
10780 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
10790 56 49 45 57 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70  VIEW./*.** The p
107a0 61 72 73 65 72 20 63 61 6c 6c 73 20 74 68 69 73  arser calls this
107b0 20 72 6f 75 74 69 6e 65 20 69 6e 20 6f 72 64 65   routine in orde
107c0 72 20 74 6f 20 63 72 65 61 74 65 20 61 20 6e 65  r to create a ne
107d0 77 20 56 49 45 57 0a 2a 2f 0a 76 6f 69 64 20 73  w VIEW.*/.void s
107e0 71 6c 69 74 65 33 43 72 65 61 74 65 56 69 65 77  qlite3CreateView
107f0 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
10800 65 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61  e,     /* The pa
10810 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
10820 0a 20 20 54 6f 6b 65 6e 20 2a 70 42 65 67 69 6e  .  Token *pBegin
10830 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 43 52 45  ,     /* The CRE
10840 41 54 45 20 74 6f 6b 65 6e 20 74 68 61 74 20 62  ATE token that b
10850 65 67 69 6e 73 20 74 68 65 20 73 74 61 74 65 6d  egins the statem
10860 65 6e 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  ent */.  Token *
10870 70 4e 61 6d 65 31 2c 20 20 20 20 20 2f 2a 20 54  pName1,     /* T
10880 68 65 20 74 6f 6b 65 6e 20 74 68 61 74 20 68 6f  he token that ho
10890 6c 64 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  lds the name of 
108a0 74 68 65 20 76 69 65 77 20 2a 2f 0a 20 20 54 6f  the view */.  To
108b0 6b 65 6e 20 2a 70 4e 61 6d 65 32 2c 20 20 20 20  ken *pName2,    
108c0 20 2f 2a 20 54 68 65 20 74 6f 6b 65 6e 20 74 68   /* The token th
108d0 61 74 20 68 6f 6c 64 73 20 74 68 65 20 6e 61 6d  at holds the nam
108e0 65 20 6f 66 20 74 68 65 20 76 69 65 77 20 2a 2f  e of the view */
108f0 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 43 4e  .  ExprList *pCN
10900 61 6d 65 73 2c 20 2f 2a 20 4f 70 74 69 6f 6e 61  ames, /* Optiona
10910 6c 20 6c 69 73 74 20 6f 66 20 76 69 65 77 20 63  l list of view c
10920 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a 20  olumn names */. 
10930 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74   Select *pSelect
10940 2c 20 20 20 2f 2a 20 41 20 53 45 4c 45 43 54 20  ,   /* A SELECT 
10950 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20 77  statement that w
10960 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65 20 6e  ill become the n
10970 65 77 20 76 69 65 77 20 2a 2f 0a 20 20 69 6e 74  ew view */.  int
10980 20 69 73 54 65 6d 70 2c 20 20 20 20 20 20 20 20   isTemp,        
10990 2f 2a 20 54 52 55 45 20 66 6f 72 20 61 20 54 45  /* TRUE for a TE
109a0 4d 50 4f 52 41 52 59 20 76 69 65 77 20 2a 2f 0a  MPORARY view */.
109b0 20 20 69 6e 74 20 6e 6f 45 72 72 20 20 20 20 20    int noErr     
109c0 20 20 20 20 20 2f 2a 20 53 75 70 70 72 65 73 73       /* Suppress
109d0 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73 20   error messages 
109e0 69 66 20 56 49 45 57 20 61 6c 72 65 61 64 79 20  if VIEW already 
109f0 65 78 69 73 74 73 20 2a 2f 0a 29 7b 0a 20 20 54  exists */.){.  T
10a00 61 62 6c 65 20 2a 70 3b 0a 20 20 69 6e 74 20 6e  able *p;.  int n
10a10 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
10a20 7a 3b 0a 20 20 54 6f 6b 65 6e 20 73 45 6e 64 3b  z;.  Token sEnd;
10a30 0a 20 20 44 62 46 69 78 65 72 20 73 46 69 78 3b  .  DbFixer sFix;
10a40 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 20  .  Token *pName 
10a50 3d 20 30 3b 0a 20 20 69 6e 74 20 69 44 62 3b 0a  = 0;.  int iDb;.
10a60 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
10a70 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 69  pParse->db;..  i
10a80 66 28 20 70 50 61 72 73 65 2d 3e 6e 56 61 72 3e  f( pParse->nVar>
10a90 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
10aa0 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
10ab0 20 22 70 61 72 61 6d 65 74 65 72 73 20 61 72 65   "parameters are
10ac0 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 20 69 6e 20   not allowed in 
10ad0 76 69 65 77 73 22 29 3b 0a 20 20 20 20 67 6f 74  views");.    got
10ae0 6f 20 63 72 65 61 74 65 5f 76 69 65 77 5f 66 61  o create_view_fa
10af0 69 6c 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  il;.  }.  sqlite
10b00 33 53 74 61 72 74 54 61 62 6c 65 28 70 50 61 72  3StartTable(pPar
10b10 73 65 2c 20 70 4e 61 6d 65 31 2c 20 70 4e 61 6d  se, pName1, pNam
10b20 65 32 2c 20 69 73 54 65 6d 70 2c 20 31 2c 20 30  e2, isTemp, 1, 0
10b30 2c 20 6e 6f 45 72 72 29 3b 0a 20 20 70 20 3d 20  , noErr);.  p = 
10b40 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
10b50 65 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c  e;.  if( p==0 ||
10b60 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 20   pParse->nErr ) 
10b70 67 6f 74 6f 20 63 72 65 61 74 65 5f 76 69 65 77  goto create_view
10b80 5f 66 61 69 6c 3b 0a 20 20 73 71 6c 69 74 65 33  _fail;.  sqlite3
10b90 54 77 6f 50 61 72 74 4e 61 6d 65 28 70 50 61 72  TwoPartName(pPar
10ba0 73 65 2c 20 70 4e 61 6d 65 31 2c 20 70 4e 61 6d  se, pName1, pNam
10bb0 65 32 2c 20 26 70 4e 61 6d 65 29 3b 0a 20 20 69  e2, &pName);.  i
10bc0 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65  Db = sqlite3Sche
10bd0 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 2d  maToIndex(db, p-
10be0 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 73 71 6c  >pSchema);.  sql
10bf0 69 74 65 33 46 69 78 49 6e 69 74 28 26 73 46 69  ite3FixInit(&sFi
10c00 78 2c 20 70 50 61 72 73 65 2c 20 69 44 62 2c 20  x, pParse, iDb, 
10c10 22 76 69 65 77 22 2c 20 70 4e 61 6d 65 29 3b 0a  "view", pName);.
10c20 20 20 69 66 28 20 73 71 6c 69 74 65 33 46 69 78    if( sqlite3Fix
10c30 53 65 6c 65 63 74 28 26 73 46 69 78 2c 20 70 53  Select(&sFix, pS
10c40 65 6c 65 63 74 29 20 29 20 67 6f 74 6f 20 63 72  elect) ) goto cr
10c50 65 61 74 65 5f 76 69 65 77 5f 66 61 69 6c 3b 0a  eate_view_fail;.
10c60 0a 20 20 2f 2a 20 4d 61 6b 65 20 61 20 63 6f 70  .  /* Make a cop
10c70 79 20 6f 66 20 74 68 65 20 65 6e 74 69 72 65 20  y of the entire 
10c80 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
10c90 20 74 68 61 74 20 64 65 66 69 6e 65 73 20 74 68   that defines th
10ca0 65 20 76 69 65 77 2e 0a 20 20 2a 2a 20 54 68 69  e view..  ** Thi
10cb0 73 20 77 69 6c 6c 20 66 6f 72 63 65 20 61 6c 6c  s will force all
10cc0 20 74 68 65 20 45 78 70 72 2e 74 6f 6b 65 6e 2e   the Expr.token.
10cd0 7a 20 76 61 6c 75 65 73 20 74 6f 20 62 65 20 64  z values to be d
10ce0 79 6e 61 6d 69 63 61 6c 6c 79 0a 20 20 2a 2a 20  ynamically.  ** 
10cf0 61 6c 6c 6f 63 61 74 65 64 20 72 61 74 68 65 72  allocated rather
10d00 20 74 68 61 6e 20 70 6f 69 6e 74 20 74 6f 20 74   than point to t
10d10 68 65 20 69 6e 70 75 74 20 73 74 72 69 6e 67 20  he input string 
10d20 2d 20 77 68 69 63 68 20 6d 65 61 6e 73 20 74 68  - which means th
10d30 61 74 0a 20 20 2a 2a 20 74 68 65 79 20 77 69 6c  at.  ** they wil
10d40 6c 20 70 65 72 73 69 73 74 20 61 66 74 65 72 20  l persist after 
10d50 74 68 65 20 63 75 72 72 65 6e 74 20 73 71 6c 69  the current sqli
10d60 74 65 33 5f 65 78 65 63 28 29 20 63 61 6c 6c 20  te3_exec() call 
10d70 72 65 74 75 72 6e 73 2e 0a 20 20 2a 2f 0a 20 20  returns..  */.  
10d80 70 2d 3e 70 53 65 6c 65 63 74 20 3d 20 73 71 6c  p->pSelect = sql
10d90 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 64 62  ite3SelectDup(db
10da0 2c 20 70 53 65 6c 65 63 74 2c 20 45 58 50 52 44  , pSelect, EXPRD
10db0 55 50 5f 52 45 44 55 43 45 29 3b 0a 20 20 70 2d  UP_REDUCE);.  p-
10dc0 3e 70 43 68 65 63 6b 20 3d 20 73 71 6c 69 74 65  >pCheck = sqlite
10dd0 33 45 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c  3ExprListDup(db,
10de0 20 70 43 4e 61 6d 65 73 2c 20 45 58 50 52 44 55   pCNames, EXPRDU
10df0 50 5f 52 45 44 55 43 45 29 3b 0a 20 20 69 66 28  P_REDUCE);.  if(
10e00 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
10e10 64 20 29 20 67 6f 74 6f 20 63 72 65 61 74 65 5f  d ) goto create_
10e20 76 69 65 77 5f 66 61 69 6c 3b 0a 0a 20 20 2f 2a  view_fail;..  /*
10e30 20 4c 6f 63 61 74 65 20 74 68 65 20 65 6e 64 20   Locate the end 
10e40 6f 66 20 74 68 65 20 43 52 45 41 54 45 20 56 49  of the CREATE VI
10e50 45 57 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 4d  EW statement.  M
10e60 61 6b 65 20 73 45 6e 64 20 70 6f 69 6e 74 20 74  ake sEnd point t
10e70 6f 0a 20 20 2a 2a 20 74 68 65 20 65 6e 64 2e 0a  o.  ** the end..
10e80 20 20 2a 2f 0a 20 20 73 45 6e 64 20 3d 20 70 50    */.  sEnd = pP
10e90 61 72 73 65 2d 3e 73 4c 61 73 74 54 6f 6b 65 6e  arse->sLastToken
10ea0 3b 0a 20 20 61 73 73 65 72 74 28 20 73 45 6e 64  ;.  assert( sEnd
10eb0 2e 7a 5b 30 5d 21 3d 30 20 29 3b 0a 20 20 69 66  .z[0]!=0 );.  if
10ec0 28 20 73 45 6e 64 2e 7a 5b 30 5d 21 3d 27 3b 27  ( sEnd.z[0]!=';'
10ed0 20 29 7b 0a 20 20 20 20 73 45 6e 64 2e 7a 20 2b   ){.    sEnd.z +
10ee0 3d 20 73 45 6e 64 2e 6e 3b 0a 20 20 7d 0a 20 20  = sEnd.n;.  }.  
10ef0 73 45 6e 64 2e 6e 20 3d 20 30 3b 0a 20 20 6e 20  sEnd.n = 0;.  n 
10f00 3d 20 28 69 6e 74 29 28 73 45 6e 64 2e 7a 20 2d  = (int)(sEnd.z -
10f10 20 70 42 65 67 69 6e 2d 3e 7a 29 3b 0a 20 20 61   pBegin->z);.  a
10f20 73 73 65 72 74 28 20 6e 3e 30 20 29 3b 0a 20 20  ssert( n>0 );.  
10f30 7a 20 3d 20 70 42 65 67 69 6e 2d 3e 7a 3b 0a 20  z = pBegin->z;. 
10f40 20 77 68 69 6c 65 28 20 73 71 6c 69 74 65 33 49   while( sqlite3I
10f50 73 73 70 61 63 65 28 7a 5b 6e 2d 31 5d 29 20 29  sspace(z[n-1]) )
10f60 7b 20 6e 2d 2d 3b 20 7d 0a 20 20 73 45 6e 64 2e  { n--; }.  sEnd.
10f70 7a 20 3d 20 26 7a 5b 6e 2d 31 5d 3b 0a 20 20 73  z = &z[n-1];.  s
10f80 45 6e 64 2e 6e 20 3d 20 31 3b 0a 0a 20 20 2f 2a  End.n = 1;..  /*
10f90 20 55 73 65 20 73 71 6c 69 74 65 33 45 6e 64 54   Use sqlite3EndT
10fa0 61 62 6c 65 28 29 20 74 6f 20 61 64 64 20 74 68  able() to add th
10fb0 65 20 76 69 65 77 20 74 6f 20 74 68 65 20 53 51  e view to the SQ
10fc0 4c 49 54 45 5f 4d 41 53 54 45 52 20 74 61 62 6c  LITE_MASTER tabl
10fd0 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 45 6e  e */.  sqlite3En
10fe0 64 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 30  dTable(pParse, 0
10ff0 2c 20 26 73 45 6e 64 2c 20 30 2c 20 30 29 3b 0a  , &sEnd, 0, 0);.
11000 0a 63 72 65 61 74 65 5f 76 69 65 77 5f 66 61 69  .create_view_fai
11010 6c 3a 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65  l:.  sqlite3Sele
11020 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70 53 65  ctDelete(db, pSe
11030 6c 65 63 74 29 3b 0a 20 20 73 71 6c 69 74 65 33  lect);.  sqlite3
11040 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64  ExprListDelete(d
11050 62 2c 20 70 43 4e 61 6d 65 73 29 3b 0a 20 20 72  b, pCNames);.  r
11060 65 74 75 72 6e 3b 0a 7d 0a 23 65 6e 64 69 66 20  eturn;.}.#endif 
11070 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  /* SQLITE_OMIT_V
11080 49 45 57 20 2a 2f 0a 0a 23 69 66 20 21 64 65 66  IEW */..#if !def
11090 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
110a0 5f 56 49 45 57 29 20 7c 7c 20 21 64 65 66 69 6e  _VIEW) || !defin
110b0 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ed(SQLITE_OMIT_V
110c0 49 52 54 55 41 4c 54 41 42 4c 45 29 0a 2f 2a 0a  IRTUALTABLE)./*.
110d0 2a 2a 20 54 68 65 20 54 61 62 6c 65 20 73 74 72  ** The Table str
110e0 75 63 74 75 72 65 20 70 54 61 62 6c 65 20 69 73  ucture pTable is
110f0 20 72 65 61 6c 6c 79 20 61 20 56 49 45 57 2e 20   really a VIEW. 
11100 20 46 69 6c 6c 20 69 6e 20 74 68 65 20 6e 61 6d   Fill in the nam
11110 65 73 20 6f 66 0a 2a 2a 20 74 68 65 20 63 6f 6c  es of.** the col
11120 75 6d 6e 73 20 6f 66 20 74 68 65 20 76 69 65 77  umns of the view
11130 20 69 6e 20 74 68 65 20 70 54 61 62 6c 65 20 73   in the pTable s
11140 74 72 75 63 74 75 72 65 2e 20 20 52 65 74 75 72  tructure.  Retur
11150 6e 20 74 68 65 20 6e 75 6d 62 65 72 0a 2a 2a 20  n the number.** 
11160 6f 66 20 65 72 72 6f 72 73 2e 20 20 49 66 20 61  of errors.  If a
11170 6e 20 65 72 72 6f 72 20 69 73 20 73 65 65 6e 20  n error is seen 
11180 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d  leave an error m
11190 65 73 73 61 67 65 20 69 6e 20 70 50 61 72 73 65  essage in pParse
111a0 2d 3e 7a 45 72 72 4d 73 67 2e 0a 2a 2f 0a 69 6e  ->zErrMsg..*/.in
111b0 74 20 73 71 6c 69 74 65 33 56 69 65 77 47 65 74  t sqlite3ViewGet
111c0 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 50 61 72 73  ColumnNames(Pars
111d0 65 20 2a 70 50 61 72 73 65 2c 20 54 61 62 6c 65  e *pParse, Table
111e0 20 2a 70 54 61 62 6c 65 29 7b 0a 20 20 54 61 62   *pTable){.  Tab
111f0 6c 65 20 2a 70 53 65 6c 54 61 62 3b 20 20 20 2f  le *pSelTab;   /
11200 2a 20 41 20 66 61 6b 65 20 74 61 62 6c 65 20 66  * A fake table f
11210 72 6f 6d 20 77 68 69 63 68 20 77 65 20 67 65 74  rom which we get
11220 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
11230 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65  */.  Select *pSe
11240 6c 3b 20 20 20 20 20 2f 2a 20 43 6f 70 79 20 6f  l;     /* Copy o
11250 66 20 74 68 65 20 53 45 4c 45 43 54 20 74 68 61  f the SELECT tha
11260 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65  t implements the
11270 20 76 69 65 77 20 2a 2f 0a 20 20 69 6e 74 20 6e   view */.  int n
11280 45 72 72 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20  Err = 0;     /* 
11290 4e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73  Number of errors
112a0 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 2a 2f 0a   encountered */.
112b0 20 20 69 6e 74 20 6e 3b 20 20 20 20 20 20 20 20    int n;        
112c0 20 20 20 20 2f 2a 20 54 65 6d 70 6f 72 61 72 69      /* Temporari
112d0 6c 79 20 68 6f 6c 64 73 20 74 68 65 20 6e 75 6d  ly holds the num
112e0 62 65 72 20 6f 66 20 63 75 72 73 6f 72 73 20 61  ber of cursors a
112f0 73 73 69 67 6e 65 64 20 2a 2f 0a 20 20 73 71 6c  ssigned */.  sql
11300 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
11310 65 2d 3e 64 62 3b 20 20 2f 2a 20 44 61 74 61 62  e->db;  /* Datab
11320 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 66  ase connection f
11330 6f 72 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 73  or malloc errors
11340 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 78 61   */.  sqlite3_xa
11350 75 74 68 20 78 41 75 74 68 3b 20 20 20 20 20 20  uth xAuth;      
11360 20 2f 2a 20 53 61 76 65 64 20 78 41 75 74 68 20   /* Saved xAuth 
11370 70 6f 69 6e 74 65 72 20 2a 2f 0a 0a 20 20 61 73  pointer */..  as
11380 73 65 72 74 28 20 70 54 61 62 6c 65 20 29 3b 0a  sert( pTable );.
11390 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
113a0 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
113b0 45 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 56  E.  if( sqlite3V
113c0 74 61 62 43 61 6c 6c 43 6f 6e 6e 65 63 74 28 70  tabCallConnect(p
113d0 50 61 72 73 65 2c 20 70 54 61 62 6c 65 29 20 29  Parse, pTable) )
113e0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
113f0 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  ITE_ERROR;.  }. 
11400 20 69 66 28 20 49 73 56 69 72 74 75 61 6c 28 70   if( IsVirtual(p
11410 54 61 62 6c 65 29 20 29 20 72 65 74 75 72 6e 20  Table) ) return 
11420 30 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64  0;.#endif..#ifnd
11430 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
11440 49 45 57 0a 20 20 2f 2a 20 41 20 70 6f 73 69 74  IEW.  /* A posit
11450 69 76 65 20 6e 43 6f 6c 20 6d 65 61 6e 73 20 74  ive nCol means t
11460 68 65 20 63 6f 6c 75 6d 6e 73 20 6e 61 6d 65 73  he columns names
11470 20 66 6f 72 20 74 68 69 73 20 76 69 65 77 20 61   for this view a
11480 72 65 0a 20 20 2a 2a 20 61 6c 72 65 61 64 79 20  re.  ** already 
11490 6b 6e 6f 77 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66  known..  */.  if
114a0 28 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3e 30  ( pTable->nCol>0
114b0 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20   ) return 0;..  
114c0 2f 2a 20 41 20 6e 65 67 61 74 69 76 65 20 6e 43  /* A negative nC
114d0 6f 6c 20 69 73 20 61 20 73 70 65 63 69 61 6c 20  ol is a special 
114e0 6d 61 72 6b 65 72 20 6d 65 61 6e 69 6e 67 20 74  marker meaning t
114f0 68 61 74 20 77 65 20 61 72 65 20 63 75 72 72 65  hat we are curre
11500 6e 74 6c 79 0a 20 20 2a 2a 20 74 72 79 69 6e 67  ntly.  ** trying
11510 20 74 6f 20 63 6f 6d 70 75 74 65 20 74 68 65 20   to compute the 
11520 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 2e 20 20 49  column names.  I
11530 66 20 77 65 20 65 6e 74 65 72 20 74 68 69 73 20  f we enter this 
11540 72 6f 75 74 69 6e 65 20 77 69 74 68 0a 20 20 2a  routine with.  *
11550 2a 20 61 20 6e 65 67 61 74 69 76 65 20 6e 43 6f  * a negative nCo
11560 6c 2c 20 69 74 20 6d 65 61 6e 73 20 74 77 6f 20  l, it means two 
11570 6f 72 20 6d 6f 72 65 20 76 69 65 77 73 20 66 6f  or more views fo
11580 72 6d 20 61 20 6c 6f 6f 70 2c 20 6c 69 6b 65 20  rm a loop, like 
11590 74 68 69 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  this:.  **.  ** 
115a0 20 20 20 20 43 52 45 41 54 45 20 56 49 45 57 20      CREATE VIEW 
115b0 6f 6e 65 20 41 53 20 53 45 4c 45 43 54 20 2a 20  one AS SELECT * 
115c0 46 52 4f 4d 20 74 77 6f 3b 0a 20 20 2a 2a 20 20  FROM two;.  **  
115d0 20 20 20 43 52 45 41 54 45 20 56 49 45 57 20 74     CREATE VIEW t
115e0 77 6f 20 41 53 20 53 45 4c 45 43 54 20 2a 20 46  wo AS SELECT * F
115f0 52 4f 4d 20 6f 6e 65 3b 0a 20 20 2a 2a 0a 20 20  ROM one;.  **.  
11600 2a 2a 20 41 63 74 75 61 6c 6c 79 2c 20 74 68 65  ** Actually, the
11610 20 65 72 72 6f 72 20 61 62 6f 76 65 20 69 73 20   error above is 
11620 6e 6f 77 20 63 61 75 67 68 74 20 70 72 69 6f 72  now caught prior
11630 20 74 6f 20 72 65 61 63 68 69 6e 67 20 74 68 69   to reaching thi
11640 73 20 70 6f 69 6e 74 2e 0a 20 20 2a 2a 20 42 75  s point..  ** Bu
11650 74 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  t the following 
11660 74 65 73 74 20 69 73 20 73 74 69 6c 6c 20 69 6d  test is still im
11670 70 6f 72 74 61 6e 74 20 61 73 20 69 74 20 64 6f  portant as it do
11680 65 73 20 63 6f 6d 65 20 75 70 0a 20 20 2a 2a 20  es come up.  ** 
11690 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  in the following
116a0 3a 0a 20 20 2a 2a 20 0a 20 20 2a 2a 20 20 20 20  :.  ** .  **    
116b0 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 6d 61   CREATE TABLE ma
116c0 69 6e 2e 65 78 31 28 61 29 3b 0a 20 20 2a 2a 20  in.ex1(a);.  ** 
116d0 20 20 20 20 43 52 45 41 54 45 20 54 45 4d 50 20      CREATE TEMP 
116e0 56 49 45 57 20 65 78 31 20 41 53 20 53 45 4c 45  VIEW ex1 AS SELE
116f0 43 54 20 61 20 46 52 4f 4d 20 65 78 31 3b 0a 20  CT a FROM ex1;. 
11700 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 2a   **     SELECT *
11710 20 46 52 4f 4d 20 74 65 6d 70 2e 65 78 31 3b 0a   FROM temp.ex1;.
11720 20 20 2a 2f 0a 20 20 69 66 28 20 70 54 61 62 6c    */.  if( pTabl
11730 65 2d 3e 6e 43 6f 6c 3c 30 20 29 7b 0a 20 20 20  e->nCol<0 ){.   
11740 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
11750 28 70 50 61 72 73 65 2c 20 22 76 69 65 77 20 25  (pParse, "view %
11760 73 20 69 73 20 63 69 72 63 75 6c 61 72 6c 79 20  s is circularly 
11770 64 65 66 69 6e 65 64 22 2c 20 70 54 61 62 6c 65  defined", pTable
11780 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72 65  ->zName);.    re
11790 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 61 73  turn 1;.  }.  as
117a0 73 65 72 74 28 20 70 54 61 62 6c 65 2d 3e 6e 43  sert( pTable->nC
117b0 6f 6c 3e 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 49  ol>=0 );..  /* I
117c0 66 20 77 65 20 67 65 74 20 74 68 69 73 20 66 61  f we get this fa
117d0 72 2c 20 69 74 20 6d 65 61 6e 73 20 77 65 20 6e  r, it means we n
117e0 65 65 64 20 74 6f 20 63 6f 6d 70 75 74 65 20 74  eed to compute t
117f0 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 73 2e 0a  he table names..
11800 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74    ** Note that t
11810 68 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74  he call to sqlit
11820 65 33 52 65 73 75 6c 74 53 65 74 4f 66 53 65 6c  e3ResultSetOfSel
11830 65 63 74 28 29 20 77 69 6c 6c 20 65 78 70 61 6e  ect() will expan
11840 64 20 61 6e 79 0a 20 20 2a 2a 20 22 2a 22 20 65  d any.  ** "*" e
11850 6c 65 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 72  lements in the r
11860 65 73 75 6c 74 73 20 73 65 74 20 6f 66 20 74 68  esults set of th
11870 65 20 76 69 65 77 20 61 6e 64 20 77 69 6c 6c 20  e view and will 
11880 61 73 73 69 67 6e 20 63 75 72 73 6f 72 73 0a 20  assign cursors. 
11890 20 2a 2a 20 74 6f 20 74 68 65 20 65 6c 65 6d 65   ** to the eleme
118a0 6e 74 73 20 6f 66 20 74 68 65 20 46 52 4f 4d 20  nts of the FROM 
118b0 63 6c 61 75 73 65 2e 20 20 42 75 74 20 77 65 20  clause.  But we 
118c0 64 6f 20 6e 6f 74 20 77 61 6e 74 20 74 68 65 73  do not want thes
118d0 65 20 63 68 61 6e 67 65 73 0a 20 20 2a 2a 20 74  e changes.  ** t
118e0 6f 20 62 65 20 70 65 72 6d 61 6e 65 6e 74 2e 20  o be permanent. 
118f0 20 53 6f 20 74 68 65 20 63 6f 6d 70 75 74 61 74   So the computat
11900 69 6f 6e 20 69 73 20 64 6f 6e 65 20 6f 6e 20 61  ion is done on a
11910 20 63 6f 70 79 20 6f 66 20 74 68 65 20 53 45 4c   copy of the SEL
11920 45 43 54 0a 20 20 2a 2a 20 73 74 61 74 65 6d 65  ECT.  ** stateme
11930 6e 74 20 74 68 61 74 20 64 65 66 69 6e 65 73 20  nt that defines 
11940 74 68 65 20 76 69 65 77 2e 0a 20 20 2a 2f 0a 20  the view..  */. 
11950 20 61 73 73 65 72 74 28 20 70 54 61 62 6c 65 2d   assert( pTable-
11960 3e 70 53 65 6c 65 63 74 20 29 3b 0a 20 20 70 53  >pSelect );.  pS
11970 65 6c 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65  el = sqlite3Sele
11980 63 74 44 75 70 28 64 62 2c 20 70 54 61 62 6c 65  ctDup(db, pTable
11990 2d 3e 70 53 65 6c 65 63 74 2c 20 30 29 3b 0a 20  ->pSelect, 0);. 
119a0 20 69 66 28 20 70 53 65 6c 20 29 7b 0a 20 20 20   if( pSel ){.   
119b0 20 6e 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61   n = pParse->nTa
119c0 62 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 72  b;.    sqlite3Sr
119d0 63 4c 69 73 74 41 73 73 69 67 6e 43 75 72 73 6f  cListAssignCurso
119e0 72 73 28 70 50 61 72 73 65 2c 20 70 53 65 6c 2d  rs(pParse, pSel-
119f0 3e 70 53 72 63 29 3b 0a 20 20 20 20 70 54 61 62  >pSrc);.    pTab
11a00 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 2d 31 3b 0a 20  le->nCol = -1;. 
11a10 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65     db->lookaside
11a20 2e 62 44 69 73 61 62 6c 65 2b 2b 3b 0a 23 69 66  .bDisable++;.#if
11a30 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
11a40 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20  _AUTHORIZATION. 
11a50 20 20 20 78 41 75 74 68 20 3d 20 64 62 2d 3e 78     xAuth = db->x
11a60 41 75 74 68 3b 0a 20 20 20 20 64 62 2d 3e 78 41  Auth;.    db->xA
11a70 75 74 68 20 3d 20 30 3b 0a 20 20 20 20 70 53 65  uth = 0;.    pSe
11a80 6c 54 61 62 20 3d 20 73 71 6c 69 74 65 33 52 65  lTab = sqlite3Re
11a90 73 75 6c 74 53 65 74 4f 66 53 65 6c 65 63 74 28  sultSetOfSelect(
11aa0 70 50 61 72 73 65 2c 20 70 53 65 6c 29 3b 0a 20  pParse, pSel);. 
11ab0 20 20 20 64 62 2d 3e 78 41 75 74 68 20 3d 20 78     db->xAuth = x
11ac0 41 75 74 68 3b 0a 23 65 6c 73 65 0a 20 20 20 20  Auth;.#else.    
11ad0 70 53 65 6c 54 61 62 20 3d 20 73 71 6c 69 74 65  pSelTab = sqlite
11ae0 33 52 65 73 75 6c 74 53 65 74 4f 66 53 65 6c 65  3ResultSetOfSele
11af0 63 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c 29  ct(pParse, pSel)
11b00 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 70 50 61  ;.#endif.    pPa
11b10 72 73 65 2d 3e 6e 54 61 62 20 3d 20 6e 3b 0a 20  rse->nTab = n;. 
11b20 20 20 20 69 66 28 20 70 54 61 62 6c 65 2d 3e 70     if( pTable->p
11b30 43 68 65 63 6b 20 29 7b 0a 20 20 20 20 20 20 2f  Check ){.      /
11b40 2a 20 43 52 45 41 54 45 20 56 49 45 57 20 6e 61  * CREATE VIEW na
11b50 6d 65 28 61 72 67 6c 69 73 74 29 20 41 53 20 2e  me(arglist) AS .
11b60 2e 2e 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 20  ...      ** The 
11b70 6e 61 6d 65 73 20 6f 66 20 74 68 65 20 63 6f 6c  names of the col
11b80 75 6d 6e 73 20 69 6e 20 74 68 65 20 74 61 62 6c  umns in the tabl
11b90 65 20 61 72 65 20 74 61 6b 65 6e 20 66 72 6f 6d  e are taken from
11ba0 0a 20 20 20 20 20 20 2a 2a 20 61 72 67 6c 69 73  .      ** arglis
11bb0 74 20 77 68 69 63 68 20 69 73 20 73 74 6f 72 65  t which is store
11bc0 64 20 69 6e 20 70 54 61 62 6c 65 2d 3e 70 43 68  d in pTable->pCh
11bd0 65 63 6b 2e 20 20 54 68 65 20 70 43 68 65 63 6b  eck.  The pCheck
11be0 20 66 69 65 6c 64 0a 20 20 20 20 20 20 2a 2a 20   field.      ** 
11bf0 6e 6f 72 6d 61 6c 6c 79 20 68 6f 6c 64 73 20 43  normally holds C
11c00 48 45 43 4b 20 63 6f 6e 73 74 72 61 69 6e 74 73  HECK constraints
11c10 20 6f 6e 20 61 6e 20 6f 72 64 69 6e 61 72 79 20   on an ordinary 
11c20 74 61 62 6c 65 2c 20 62 75 74 20 66 6f 72 0a 20  table, but for. 
11c30 20 20 20 20 20 2a 2a 20 61 20 56 49 45 57 20 69       ** a VIEW i
11c40 74 20 68 6f 6c 64 73 20 74 68 65 20 6c 69 73 74  t holds the list
11c50 20 6f 66 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73   of column names
11c60 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
11c70 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 73 46   sqlite3ColumnsF
11c80 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72  romExprList(pPar
11c90 73 65 2c 20 70 54 61 62 6c 65 2d 3e 70 43 68 65  se, pTable->pChe
11ca0 63 6b 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  ck, .           
11cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11cc0 20 20 20 20 20 20 26 70 54 61 62 6c 65 2d 3e 6e        &pTable->n
11cd0 43 6f 6c 2c 20 26 70 54 61 62 6c 65 2d 3e 61 43  Col, &pTable->aC
11ce0 6f 6c 29 3b 0a 20 20 20 20 20 20 69 66 28 20 64  ol);.      if( d
11cf0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3d  b->mallocFailed=
11d00 3d 30 20 0a 20 20 20 20 20 20 20 26 26 20 70 50  =0 .       && pP
11d10 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 0a 20 20  arse->nErr==0.  
11d20 20 20 20 20 20 26 26 20 70 54 61 62 6c 65 2d 3e       && pTable->
11d30 6e 43 6f 6c 3d 3d 70 53 65 6c 2d 3e 70 45 4c 69  nCol==pSel->pELi
11d40 73 74 2d 3e 6e 45 78 70 72 0a 20 20 20 20 20 20  st->nExpr.      
11d50 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
11d60 65 33 53 65 6c 65 63 74 41 64 64 43 6f 6c 75 6d  e3SelectAddColum
11d70 6e 54 79 70 65 41 6e 64 43 6f 6c 6c 61 74 69 6f  nTypeAndCollatio
11d80 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62 6c 65  n(pParse, pTable
11d90 2c 20 70 53 65 6c 29 3b 0a 20 20 20 20 20 20 7d  , pSel);.      }
11da0 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70  .    }else if( p
11db0 53 65 6c 54 61 62 20 29 7b 0a 20 20 20 20 20 20  SelTab ){.      
11dc0 2f 2a 20 43 52 45 41 54 45 20 56 49 45 57 20 6e  /* CREATE VIEW n
11dd0 61 6d 65 20 41 53 2e 2e 2e 20 20 77 69 74 68 6f  ame AS...  witho
11de0 75 74 20 61 6e 20 61 72 67 75 6d 65 6e 74 20 6c  ut an argument l
11df0 69 73 74 2e 20 20 43 6f 6e 73 74 72 75 63 74 0a  ist.  Construct.
11e00 20 20 20 20 20 20 2a 2a 20 74 68 65 20 63 6f 6c        ** the col
11e10 75 6d 6e 20 6e 61 6d 65 73 20 66 72 6f 6d 20 74  umn names from t
11e20 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
11e30 65 6e 74 20 74 68 61 74 20 64 65 66 69 6e 65 73  ent that defines
11e40 20 74 68 65 20 76 69 65 77 2e 0a 20 20 20 20 20   the view..     
11e50 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74   */.      assert
11e60 28 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 3d 3d  ( pTable->aCol==
11e70 30 20 29 3b 0a 20 20 20 20 20 20 70 54 61 62 6c  0 );.      pTabl
11e80 65 2d 3e 6e 43 6f 6c 20 3d 20 70 53 65 6c 54 61  e->nCol = pSelTa
11e90 62 2d 3e 6e 43 6f 6c 3b 0a 20 20 20 20 20 20 70  b->nCol;.      p
11ea0 54 61 62 6c 65 2d 3e 61 43 6f 6c 20 3d 20 70 53  Table->aCol = pS
11eb0 65 6c 54 61 62 2d 3e 61 43 6f 6c 3b 0a 20 20 20  elTab->aCol;.   
11ec0 20 20 20 70 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c     pSelTab->nCol
11ed0 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 53 65 6c   = 0;.      pSel
11ee0 54 61 62 2d 3e 61 43 6f 6c 20 3d 20 30 3b 0a 20  Tab->aCol = 0;. 
11ef0 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c       assert( sql
11f00 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48  ite3SchemaMutexH
11f10 65 6c 64 28 64 62 2c 20 30 2c 20 70 54 61 62 6c  eld(db, 0, pTabl
11f20 65 2d 3e 70 53 63 68 65 6d 61 29 20 29 3b 0a 20  e->pSchema) );. 
11f30 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
11f40 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 30  pTable->nCol = 0
11f50 3b 0a 20 20 20 20 20 20 6e 45 72 72 2b 2b 3b 0a  ;.      nErr++;.
11f60 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
11f70 33 44 65 6c 65 74 65 54 61 62 6c 65 28 64 62 2c  3DeleteTable(db,
11f80 20 70 53 65 6c 54 61 62 29 3b 0a 20 20 20 20 73   pSelTab);.    s
11f90 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65  qlite3SelectDele
11fa0 74 65 28 64 62 2c 20 70 53 65 6c 29 3b 0a 20 20  te(db, pSel);.  
11fb0 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e    db->lookaside.
11fc0 62 44 69 73 61 62 6c 65 2d 2d 3b 0a 20 20 7d 20  bDisable--;.  } 
11fd0 65 6c 73 65 20 7b 0a 20 20 20 20 6e 45 72 72 2b  else {.    nErr+
11fe0 2b 3b 0a 20 20 7d 0a 20 20 70 54 61 62 6c 65 2d  +;.  }.  pTable-
11ff0 3e 70 53 63 68 65 6d 61 2d 3e 73 63 68 65 6d 61  >pSchema->schema
12000 46 6c 61 67 73 20 7c 3d 20 44 42 5f 55 6e 72 65  Flags |= DB_Unre
12010 73 65 74 56 69 65 77 73 3b 0a 23 65 6e 64 69 66  setViews;.#endif
12020 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
12030 56 49 45 57 20 2a 2f 0a 20 20 72 65 74 75 72 6e  VIEW */.  return
12040 20 6e 45 72 72 3b 20 20 0a 7d 0a 23 65 6e 64 69   nErr;  .}.#endi
12050 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51  f /* !defined(SQ
12060 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20  LITE_OMIT_VIEW) 
12070 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  || !defined(SQLI
12080 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
12090 41 42 4c 45 29 20 2a 2f 0a 0a 23 69 66 6e 64 65  ABLE) */..#ifnde
120a0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
120b0 45 57 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 74  EW./*.** Clear t
120c0 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20  he column names 
120d0 66 72 6f 6d 20 65 76 65 72 79 20 56 49 45 57 20  from every VIEW 
120e0 69 6e 20 64 61 74 61 62 61 73 65 20 69 64 78 2e  in database idx.
120f0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
12100 73 71 6c 69 74 65 56 69 65 77 52 65 73 65 74 41  sqliteViewResetA
12110 6c 6c 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  ll(sqlite3 *db, 
12120 69 6e 74 20 69 64 78 29 7b 0a 20 20 48 61 73 68  int idx){.  Hash
12130 45 6c 65 6d 20 2a 69 3b 0a 20 20 61 73 73 65 72  Elem *i;.  asser
12140 74 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61  t( sqlite3Schema
12150 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20 69 64  MutexHeld(db, id
12160 78 2c 20 30 29 20 29 3b 0a 20 20 69 66 28 20 21  x, 0) );.  if( !
12170 44 62 48 61 73 50 72 6f 70 65 72 74 79 28 64 62  DbHasProperty(db
12180 2c 20 69 64 78 2c 20 44 42 5f 55 6e 72 65 73 65  , idx, DB_Unrese
12190 74 56 69 65 77 73 29 20 29 20 72 65 74 75 72 6e  tViews) ) return
121a0 3b 0a 20 20 66 6f 72 28 69 3d 73 71 6c 69 74 65  ;.  for(i=sqlite
121b0 48 61 73 68 46 69 72 73 74 28 26 64 62 2d 3e 61  HashFirst(&db->a
121c0 44 62 5b 69 64 78 5d 2e 70 53 63 68 65 6d 61 2d  Db[idx].pSchema-
121d0 3e 74 62 6c 48 61 73 68 29 3b 20 69 3b 69 3d 73  >tblHash); i;i=s
121e0 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28 69 29  qliteHashNext(i)
121f0 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54  ){.    Table *pT
12200 61 62 20 3d 20 73 71 6c 69 74 65 48 61 73 68 44  ab = sqliteHashD
12210 61 74 61 28 69 29 3b 0a 20 20 20 20 69 66 28 20  ata(i);.    if( 
12220 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 29 7b  pTab->pSelect ){
12230 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65  .      sqlite3De
12240 6c 65 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28  leteColumnNames(
12250 64 62 2c 20 70 54 61 62 29 3b 0a 20 20 20 20 20  db, pTab);.     
12260 20 70 54 61 62 2d 3e 61 43 6f 6c 20 3d 20 30 3b   pTab->aCol = 0;
12270 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 6e 43 6f  .      pTab->nCo
12280 6c 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  l = 0;.    }.  }
12290 0a 20 20 44 62 43 6c 65 61 72 50 72 6f 70 65 72  .  DbClearProper
122a0 74 79 28 64 62 2c 20 69 64 78 2c 20 44 42 5f 55  ty(db, idx, DB_U
122b0 6e 72 65 73 65 74 56 69 65 77 73 29 3b 0a 7d 0a  nresetViews);.}.
122c0 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 73  #else.# define s
122d0 71 6c 69 74 65 56 69 65 77 52 65 73 65 74 41 6c  qliteViewResetAl
122e0 6c 28 41 2c 42 29 0a 23 65 6e 64 69 66 20 2f 2a  l(A,B).#endif /*
122f0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45   SQLITE_OMIT_VIE
12300 57 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  W */../*.** This
12310 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
12320 6c 65 64 20 62 79 20 74 68 65 20 56 44 42 45 20  led by the VDBE 
12330 74 6f 20 61 64 6a 75 73 74 20 74 68 65 20 69 6e  to adjust the in
12340 74 65 72 6e 61 6c 20 73 63 68 65 6d 61 0a 2a 2a  ternal schema.**
12350 20 75 73 65 64 20 62 79 20 53 51 4c 69 74 65 20   used by SQLite 
12360 77 68 65 6e 20 74 68 65 20 62 74 72 65 65 20 6c  when the btree l
12370 61 79 65 72 20 6d 6f 76 65 73 20 61 20 74 61 62  ayer moves a tab
12380 6c 65 20 72 6f 6f 74 20 70 61 67 65 2e 20 54 68  le root page. Th
12390 65 0a 2a 2a 20 72 6f 6f 74 2d 70 61 67 65 20 6f  e.** root-page o
123a0 66 20 61 20 74 61 62 6c 65 20 6f 72 20 69 6e 64  f a table or ind
123b0 65 78 20 69 6e 20 64 61 74 61 62 61 73 65 20 69  ex in database i
123c0 44 62 20 68 61 73 20 63 68 61 6e 67 65 64 20 66  Db has changed f
123d0 72 6f 6d 20 69 46 72 6f 6d 0a 2a 2a 20 74 6f 20  rom iFrom.** to 
123e0 69 54 6f 2e 0a 2a 2a 0a 2a 2a 20 54 69 63 6b 65  iTo..**.** Ticke
123f0 74 20 23 31 37 32 38 3a 20 20 54 68 65 20 73 79  t #1728:  The sy
12400 6d 62 6f 6c 20 74 61 62 6c 65 20 6d 69 67 68 74  mbol table might
12410 20 73 74 69 6c 6c 20 63 6f 6e 74 61 69 6e 20 69   still contain i
12420 6e 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20 6f 6e  nformation.** on
12430 20 74 61 62 6c 65 73 20 61 6e 64 2f 6f 72 20 69   tables and/or i
12440 6e 64 69 63 65 73 20 74 68 61 74 20 61 72 65 20  ndices that are 
12450 74 68 65 20 70 72 6f 63 65 73 73 20 6f 66 20 62  the process of b
12460 65 69 6e 67 20 64 65 6c 65 74 65 64 2e 0a 2a 2a  eing deleted..**
12470 20 49 66 20 79 6f 75 20 61 72 65 20 75 6e 6c 75   If you are unlu
12480 63 6b 79 2c 20 6f 6e 65 20 6f 66 20 74 68 6f 73  cky, one of thos
12490 65 20 64 65 6c 65 74 65 64 20 69 6e 64 69 63 65  e deleted indice
124a0 73 20 6f 72 20 74 61 62 6c 65 73 20 6d 69 67 68  s or tables migh
124b0 74 0a 2a 2a 20 68 61 76 65 20 74 68 65 20 73 61  t.** have the sa
124c0 6d 65 20 72 6f 6f 74 70 61 67 65 20 6e 75 6d 62  me rootpage numb
124d0 65 72 20 61 73 20 74 68 65 20 72 65 61 6c 20 74  er as the real t
124e0 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 74 68  able or index th
124f0 61 74 20 69 73 0a 2a 2a 20 62 65 69 6e 67 20 6d  at is.** being m
12500 6f 76 65 64 2e 20 20 53 6f 20 77 65 20 63 61 6e  oved.  So we can
12510 6e 6f 74 20 73 74 6f 70 20 73 65 61 72 63 68 69  not stop searchi
12520 6e 67 20 61 66 74 65 72 20 74 68 65 20 66 69 72  ng after the fir
12530 73 74 20 6d 61 74 63 68 20 0a 2a 2a 20 62 65 63  st match .** bec
12540 61 75 73 65 20 74 68 65 20 66 69 72 73 74 20 6d  ause the first m
12550 61 74 63 68 20 6d 69 67 68 74 20 62 65 20 66 6f  atch might be fo
12560 72 20 6f 6e 65 20 6f 66 20 74 68 65 20 64 65 6c  r one of the del
12570 65 74 65 64 20 69 6e 64 69 63 65 73 0a 2a 2a 20  eted indices.** 
12580 6f 72 20 74 61 62 6c 65 73 20 61 6e 64 20 6e 6f  or tables and no
12590 74 20 74 68 65 20 74 61 62 6c 65 2f 69 6e 64 65  t the table/inde
125a0 78 20 74 68 61 74 20 69 73 20 61 63 74 75 61 6c  x that is actual
125b0 6c 79 20 62 65 69 6e 67 20 6d 6f 76 65 64 2e 0a  ly being moved..
125c0 2a 2a 20 57 65 20 6d 75 73 74 20 63 6f 6e 74 69  ** We must conti
125d0 6e 75 65 20 6c 6f 6f 70 69 6e 67 20 75 6e 74 69  nue looping unti
125e0 6c 20 61 6c 6c 20 74 61 62 6c 65 73 20 61 6e 64  l all tables and
125f0 20 69 6e 64 69 63 65 73 20 77 69 74 68 0a 2a 2a   indices with.**
12600 20 72 6f 6f 74 70 61 67 65 3d 3d 69 46 72 6f 6d   rootpage==iFrom
12610 20 68 61 76 65 20 62 65 65 6e 20 63 6f 6e 76 65   have been conve
12620 72 74 65 64 20 74 6f 20 68 61 76 65 20 61 20 72  rted to have a r
12630 6f 6f 74 70 61 67 65 20 6f 66 20 69 54 6f 0a 2a  ootpage of iTo.*
12640 2a 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 62 65  * in order to be
12650 20 63 65 72 74 61 69 6e 20 74 68 61 74 20 77 65   certain that we
12660 20 67 6f 74 20 74 68 65 20 72 69 67 68 74 20 6f   got the right o
12670 6e 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53  ne..*/.#ifndef S
12680 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
12690 41 43 55 55 4d 0a 76 6f 69 64 20 73 71 6c 69 74  ACUUM.void sqlit
126a0 65 33 52 6f 6f 74 50 61 67 65 4d 6f 76 65 64 28  e3RootPageMoved(
126b0 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74  sqlite3 *db, int
126c0 20 69 44 62 2c 20 69 6e 74 20 69 46 72 6f 6d 2c   iDb, int iFrom,
126d0 20 69 6e 74 20 69 54 6f 29 7b 0a 20 20 48 61 73   int iTo){.  Has
126e0 68 45 6c 65 6d 20 2a 70 45 6c 65 6d 3b 0a 20 20  hElem *pElem;.  
126f0 48 61 73 68 20 2a 70 48 61 73 68 3b 0a 20 20 44  Hash *pHash;.  D
12700 62 20 2a 70 44 62 3b 0a 0a 20 20 61 73 73 65 72  b *pDb;..  asser
12710 74 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61  t( sqlite3Schema
12720 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20 69 44  MutexHeld(db, iD
12730 62 2c 20 30 29 20 29 3b 0a 20 20 70 44 62 20 3d  b, 0) );.  pDb =
12740 20 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a   &db->aDb[iDb];.
12750 20 20 70 48 61 73 68 20 3d 20 26 70 44 62 2d 3e    pHash = &pDb->
12760 70 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68  pSchema->tblHash
12770 3b 0a 20 20 66 6f 72 28 70 45 6c 65 6d 3d 73 71  ;.  for(pElem=sq
12780 6c 69 74 65 48 61 73 68 46 69 72 73 74 28 70 48  liteHashFirst(pH
12790 61 73 68 29 3b 20 70 45 6c 65 6d 3b 20 70 45 6c  ash); pElem; pEl
127a0 65 6d 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78  em=sqliteHashNex
127b0 74 28 70 45 6c 65 6d 29 29 7b 0a 20 20 20 20 54  t(pElem)){.    T
127c0 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 73 71 6c  able *pTab = sql
127d0 69 74 65 48 61 73 68 44 61 74 61 28 70 45 6c 65  iteHashData(pEle
127e0 6d 29 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62  m);.    if( pTab
127f0 2d 3e 74 6e 75 6d 3d 3d 69 46 72 6f 6d 20 29 7b  ->tnum==iFrom ){
12800 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 74 6e 75  .      pTab->tnu
12810 6d 20 3d 20 69 54 6f 3b 0a 20 20 20 20 7d 0a 20  m = iTo;.    }. 
12820 20 7d 0a 20 20 70 48 61 73 68 20 3d 20 26 70 44   }.  pHash = &pD
12830 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 69 64 78 48  b->pSchema->idxH
12840 61 73 68 3b 0a 20 20 66 6f 72 28 70 45 6c 65 6d  ash;.  for(pElem
12850 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72 73 74  =sqliteHashFirst
12860 28 70 48 61 73 68 29 3b 20 70 45 6c 65 6d 3b 20  (pHash); pElem; 
12870 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73 68  pElem=sqliteHash
12880 4e 65 78 74 28 70 45 6c 65 6d 29 29 7b 0a 20 20  Next(pElem)){.  
12890 20 20 49 6e 64 65 78 20 2a 70 49 64 78 20 3d 20    Index *pIdx = 
128a0 73 71 6c 69 74 65 48 61 73 68 44 61 74 61 28 70  sqliteHashData(p
128b0 45 6c 65 6d 29 3b 0a 20 20 20 20 69 66 28 20 70  Elem);.    if( p
128c0 49 64 78 2d 3e 74 6e 75 6d 3d 3d 69 46 72 6f 6d  Idx->tnum==iFrom
128d0 20 29 7b 0a 20 20 20 20 20 20 70 49 64 78 2d 3e   ){.      pIdx->
128e0 74 6e 75 6d 20 3d 20 69 54 6f 3b 0a 20 20 20 20  tnum = iTo;.    
128f0 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a  }.  }.}.#endif..
12900 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 63 6f 64 65  /*.** Write code
12910 20 74 6f 20 65 72 61 73 65 20 74 68 65 20 74 61   to erase the ta
12920 62 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d 70 61  ble with root-pa
12930 67 65 20 69 54 61 62 6c 65 20 66 72 6f 6d 20 64  ge iTable from d
12940 61 74 61 62 61 73 65 20 69 44 62 2e 0a 2a 2a 20  atabase iDb..** 
12950 41 6c 73 6f 20 77 72 69 74 65 20 63 6f 64 65 20  Also write code 
12960 74 6f 20 6d 6f 64 69 66 79 20 74 68 65 20 73 71  to modify the sq
12970 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c  lite_master tabl
12980 65 20 61 6e 64 20 69 6e 74 65 72 6e 61 6c 20 73  e and internal s
12990 63 68 65 6d 61 0a 2a 2a 20 69 66 20 61 20 72 6f  chema.** if a ro
129a0 6f 74 2d 70 61 67 65 20 6f 66 20 61 6e 6f 74 68  ot-page of anoth
129b0 65 72 20 74 61 62 6c 65 20 69 73 20 6d 6f 76 65  er table is move
129c0 64 20 62 79 20 74 68 65 20 62 74 72 65 65 2d 6c  d by the btree-l
129d0 61 79 65 72 20 77 68 69 6c 73 74 0a 2a 2a 20 65  ayer whilst.** e
129e0 72 61 73 69 6e 67 20 69 54 61 62 6c 65 20 28 74  rasing iTable (t
129f0 68 69 73 20 63 61 6e 20 68 61 70 70 65 6e 20 77  his can happen w
12a00 69 74 68 20 61 6e 20 61 75 74 6f 2d 76 61 63 75  ith an auto-vacu
12a10 75 6d 20 64 61 74 61 62 61 73 65 29 2e 0a 2a 2f  um database)..*/
12a20 20 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64 65   .static void de
12a30 73 74 72 6f 79 52 6f 6f 74 50 61 67 65 28 50 61  stroyRootPage(Pa
12a40 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74  rse *pParse, int
12a50 20 69 54 61 62 6c 65 2c 20 69 6e 74 20 69 44 62   iTable, int iDb
12a60 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 73  ){.  Vdbe *v = s
12a70 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
12a80 61 72 73 65 29 3b 0a 20 20 69 6e 74 20 72 31 20  arse);.  int r1 
12a90 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
12aa0 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 61  Reg(pParse);.  a
12ab0 73 73 65 72 74 28 20 69 54 61 62 6c 65 3e 31 20  ssert( iTable>1 
12ac0 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
12ad0 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 44 65 73  AddOp3(v, OP_Des
12ae0 74 72 6f 79 2c 20 69 54 61 62 6c 65 2c 20 72 31  troy, iTable, r1
12af0 2c 20 69 44 62 29 3b 0a 20 20 73 71 6c 69 74 65  , iDb);.  sqlite
12b00 33 4d 61 79 41 62 6f 72 74 28 70 50 61 72 73 65  3MayAbort(pParse
12b10 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  );.#ifndef SQLIT
12b20 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
12b30 4d 0a 20 20 2f 2a 20 4f 50 5f 44 65 73 74 72 6f  M.  /* OP_Destro
12b40 79 20 73 74 6f 72 65 73 20 61 6e 20 69 6e 20 69  y stores an in i
12b50 6e 74 65 67 65 72 20 72 31 2e 20 49 66 20 74 68  nteger r1. If th
12b60 69 73 20 69 6e 74 65 67 65 72 0a 20 20 2a 2a 20  is integer.  ** 
12b70 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65  is non-zero, the
12b80 6e 20 69 74 20 69 73 20 74 68 65 20 72 6f 6f 74  n it is the root
12b90 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
12ba0 61 20 74 61 62 6c 65 20 6d 6f 76 65 64 20 74 6f  a table moved to
12bb0 0a 20 20 2a 2a 20 6c 6f 63 61 74 69 6f 6e 20 69  .  ** location i
12bc0 54 61 62 6c 65 2e 20 54 68 65 20 66 6f 6c 6c 6f  Table. The follo
12bd0 77 69 6e 67 20 63 6f 64 65 20 6d 6f 64 69 66 69  wing code modifi
12be0 65 73 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61  es the sqlite_ma
12bf0 73 74 65 72 20 74 61 62 6c 65 20 74 6f 0a 20 20  ster table to.  
12c00 2a 2a 20 72 65 66 6c 65 63 74 20 74 68 69 73 2e  ** reflect this.
12c10 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 22  .  **.  ** The "
12c20 23 4e 4e 4e 22 20 69 6e 20 74 68 65 20 53 51 4c  #NNN" in the SQL
12c30 20 69 73 20 61 20 73 70 65 63 69 61 6c 20 63 6f   is a special co
12c40 6e 73 74 61 6e 74 20 74 68 61 74 20 6d 65 61 6e  nstant that mean
12c50 73 20 77 68 61 74 65 76 65 72 20 76 61 6c 75 65  s whatever value
12c60 0a 20 20 2a 2a 20 69 73 20 69 6e 20 72 65 67 69  .  ** is in regi
12c70 73 74 65 72 20 4e 4e 4e 2e 20 20 53 65 65 20 67  ster NNN.  See g
12c80 72 61 6d 6d 61 72 20 72 75 6c 65 73 20 61 73 73  rammar rules ass
12c90 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
12ca0 20 54 4b 5f 52 45 47 49 53 54 45 52 0a 20 20 2a   TK_REGISTER.  *
12cb0 2a 20 74 6f 6b 65 6e 20 66 6f 72 20 61 64 64 69  * token for addi
12cc0 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69  tional informati
12cd0 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  on..  */.  sqlit
12ce0 65 33 4e 65 73 74 65 64 50 61 72 73 65 28 70 50  e3NestedParse(pP
12cf0 61 72 73 65 2c 20 0a 20 20 20 20 20 22 55 50 44  arse, .     "UPD
12d00 41 54 45 20 25 51 2e 25 73 20 53 45 54 20 72 6f  ATE %Q.%s SET ro
12d10 6f 74 70 61 67 65 3d 25 64 20 57 48 45 52 45 20  otpage=%d WHERE 
12d20 23 25 64 20 41 4e 44 20 72 6f 6f 74 70 61 67 65  #%d AND rootpage
12d30 3d 23 25 64 22 2c 0a 20 20 20 20 20 70 50 61 72  =#%d",.     pPar
12d40 73 65 2d 3e 64 62 2d 3e 61 44 62 5b 69 44 62 5d  se->db->aDb[iDb]
12d50 2e 7a 4e 61 6d 65 2c 20 53 43 48 45 4d 41 5f 54  .zName, SCHEMA_T
12d60 41 42 4c 45 28 69 44 62 29 2c 20 69 54 61 62 6c  ABLE(iDb), iTabl
12d70 65 2c 20 72 31 2c 20 72 31 29 3b 0a 23 65 6e 64  e, r1, r1);.#end
12d80 69 66 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65  if.  sqlite3Rele
12d90 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
12da0 65 2c 20 72 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  e, r1);.}../*.**
12db0 20 57 72 69 74 65 20 56 44 42 45 20 63 6f 64 65   Write VDBE code
12dc0 20 74 6f 20 65 72 61 73 65 20 74 61 62 6c 65 20   to erase table 
12dd0 70 54 61 62 20 61 6e 64 20 61 6c 6c 20 61 73 73  pTab and all ass
12de0 6f 63 69 61 74 65 64 20 69 6e 64 69 63 65 73 20  ociated indices 
12df0 6f 6e 20 64 69 73 6b 2e 0a 2a 2a 20 43 6f 64 65  on disk..** Code
12e00 20 74 6f 20 75 70 64 61 74 65 20 74 68 65 20 73   to update the s
12e10 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62  qlite_master tab
12e20 6c 65 73 20 61 6e 64 20 69 6e 74 65 72 6e 61 6c  les and internal
12e30 20 73 63 68 65 6d 61 20 64 65 66 69 6e 69 74 69   schema definiti
12e40 6f 6e 73 0a 2a 2a 20 69 6e 20 63 61 73 65 20 61  ons.** in case a
12e50 20 72 6f 6f 74 2d 70 61 67 65 20 62 65 6c 6f 6e   root-page belon
12e60 67 69 6e 67 20 74 6f 20 61 6e 6f 74 68 65 72 20  ging to another 
12e70 74 61 62 6c 65 20 69 73 20 6d 6f 76 65 64 20 62  table is moved b
12e80 79 20 74 68 65 20 62 74 72 65 65 20 6c 61 79 65  y the btree laye
12e90 72 0a 2a 2a 20 69 73 20 61 6c 73 6f 20 61 64 64  r.** is also add
12ea0 65 64 20 28 74 68 69 73 20 63 61 6e 20 68 61 70  ed (this can hap
12eb0 70 65 6e 20 77 69 74 68 20 61 6e 20 61 75 74 6f  pen with an auto
12ec0 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61 73 65  -vacuum database
12ed0 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  )..*/.static voi
12ee0 64 20 64 65 73 74 72 6f 79 54 61 62 6c 65 28 50  d destroyTable(P
12ef0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 61  arse *pParse, Ta
12f00 62 6c 65 20 2a 70 54 61 62 29 7b 0a 23 69 66 64  ble *pTab){.#ifd
12f10 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
12f20 55 54 4f 56 41 43 55 55 4d 0a 20 20 49 6e 64 65  UTOVACUUM.  Inde
12f30 78 20 2a 70 49 64 78 3b 0a 20 20 69 6e 74 20 69  x *pIdx;.  int i
12f40 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65  Db = sqlite3Sche
12f50 6d 61 54 6f 49 6e 64 65 78 28 70 50 61 72 73 65  maToIndex(pParse
12f60 2d 3e 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68  ->db, pTab->pSch
12f70 65 6d 61 29 3b 0a 20 20 64 65 73 74 72 6f 79 52  ema);.  destroyR
12f80 6f 6f 74 50 61 67 65 28 70 50 61 72 73 65 2c 20  ootPage(pParse, 
12f90 70 54 61 62 2d 3e 74 6e 75 6d 2c 20 69 44 62 29  pTab->tnum, iDb)
12fa0 3b 0a 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61  ;.  for(pIdx=pTa
12fb0 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b  b->pIndex; pIdx;
12fc0 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78   pIdx=pIdx->pNex
12fd0 74 29 7b 0a 20 20 20 20 64 65 73 74 72 6f 79 52  t){.    destroyR
12fe0 6f 6f 74 50 61 67 65 28 70 50 61 72 73 65 2c 20  ootPage(pParse, 
12ff0 70 49 64 78 2d 3e 74 6e 75 6d 2c 20 69 44 62 29  pIdx->tnum, iDb)
13000 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20 2f 2a  ;.  }.#else.  /*
13010 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65   If the database
13020 20 6d 61 79 20 62 65 20 61 75 74 6f 2d 76 61 63   may be auto-vac
13030 75 75 6d 20 63 61 70 61 62 6c 65 20 28 69 66 20  uum capable (if 
13040 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
13050 56 41 43 55 55 4d 0a 20 20 2a 2a 20 69 73 20 6e  VACUUM.  ** is n
13060 6f 74 20 64 65 66 69 6e 65 64 29 2c 20 74 68 65  ot defined), the
13070 6e 20 69 74 20 69 73 20 69 6d 70 6f 72 74 61 6e  n it is importan
13080 74 20 74 6f 20 63 61 6c 6c 20 4f 50 5f 44 65 73  t to call OP_Des
13090 74 72 6f 79 20 6f 6e 20 74 68 65 0a 20 20 2a 2a  troy on the.  **
130a0 20 74 61 62 6c 65 20 61 6e 64 20 69 6e 64 65 78   table and index
130b0 20 72 6f 6f 74 2d 70 61 67 65 73 20 69 6e 20 6f   root-pages in o
130c0 72 64 65 72 2c 20 73 74 61 72 74 69 6e 67 20 77  rder, starting w
130d0 69 74 68 20 74 68 65 20 6e 75 6d 65 72 69 63 61  ith the numerica
130e0 6c 6c 79 20 0a 20 20 2a 2a 20 6c 61 72 67 65 73  lly .  ** larges
130f0 74 20 72 6f 6f 74 2d 70 61 67 65 20 6e 75 6d 62  t root-page numb
13100 65 72 2e 20 54 68 69 73 20 67 75 61 72 61 6e 74  er. This guarant
13110 65 65 73 20 74 68 61 74 20 6e 6f 6e 65 20 6f 66  ees that none of
13120 20 74 68 65 20 72 6f 6f 74 2d 70 61 67 65 73 0a   the root-pages.
13130 20 20 2a 2a 20 74 6f 20 62 65 20 64 65 73 74 72    ** to be destr
13140 6f 79 65 64 20 69 73 20 72 65 6c 6f 63 61 74 65  oyed is relocate
13150 64 20 62 79 20 61 6e 20 65 61 72 6c 69 65 72 20  d by an earlier 
13160 4f 50 5f 44 65 73 74 72 6f 79 2e 20 69 2e 65 2e  OP_Destroy. i.e.
13170 20 69 66 20 74 68 65 0a 20 20 2a 2a 20 66 6f 6c   if the.  ** fol
13180 6c 6f 77 69 6e 67 20 77 65 72 65 20 63 6f 64 65  lowing were code
13190 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4f 50 5f  d:.  **.  ** OP_
131a0 44 65 73 74 72 6f 79 20 34 20 30 0a 20 20 2a 2a  Destroy 4 0.  **
131b0 20 2e 2e 2e 0a 20 20 2a 2a 20 4f 50 5f 44 65 73   ....  ** OP_Des
131c0 74 72 6f 79 20 35 20 30 0a 20 20 2a 2a 0a 20 20  troy 5 0.  **.  
131d0 2a 2a 20 61 6e 64 20 72 6f 6f 74 20 70 61 67 65  ** and root page
131e0 20 35 20 68 61 70 70 65 6e 65 64 20 74 6f 20 62   5 happened to b
131f0 65 20 74 68 65 20 6c 61 72 67 65 73 74 20 72 6f  e the largest ro
13200 6f 74 2d 70 61 67 65 20 6e 75 6d 62 65 72 20 69  ot-page number i
13210 6e 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62  n the.  ** datab
13220 61 73 65 2c 20 74 68 65 6e 20 72 6f 6f 74 20 70  ase, then root p
13230 61 67 65 20 35 20 77 6f 75 6c 64 20 62 65 20 6d  age 5 would be m
13240 6f 76 65 64 20 74 6f 20 70 61 67 65 20 34 20 62  oved to page 4 b
13250 79 20 74 68 65 20 0a 20 20 2a 2a 20 22 4f 50 5f  y the .  ** "OP_
13260 44 65 73 74 72 6f 79 20 34 20 30 22 20 6f 70 63  Destroy 4 0" opc
13270 6f 64 65 2e 20 54 68 65 20 73 75 62 73 65 71 75  ode. The subsequ
13280 65 6e 74 20 22 4f 50 5f 44 65 73 74 72 6f 79 20  ent "OP_Destroy 
13290 35 20 30 22 20 77 6f 75 6c 64 20 68 69 74 0a 20  5 0" would hit. 
132a0 20 2a 2a 20 61 20 66 72 65 65 2d 6c 69 73 74 20   ** a free-list 
132b0 70 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 6e 74  page..  */.  int
132c0 20 69 54 61 62 20 3d 20 70 54 61 62 2d 3e 74 6e   iTab = pTab->tn
132d0 75 6d 3b 0a 20 20 69 6e 74 20 69 44 65 73 74 72  um;.  int iDestr
132e0 6f 79 65 64 20 3d 20 30 3b 0a 0a 20 20 77 68 69  oyed = 0;..  whi
132f0 6c 65 28 20 31 20 29 7b 0a 20 20 20 20 49 6e 64  le( 1 ){.    Ind
13300 65 78 20 2a 70 49 64 78 3b 0a 20 20 20 20 69 6e  ex *pIdx;.    in
13310 74 20 69 4c 61 72 67 65 73 74 20 3d 20 30 3b 0a  t iLargest = 0;.
13320 0a 20 20 20 20 69 66 28 20 69 44 65 73 74 72 6f  .    if( iDestro
13330 79 65 64 3d 3d 30 20 7c 7c 20 69 54 61 62 3c 69  yed==0 || iTab<i
13340 44 65 73 74 72 6f 79 65 64 20 29 7b 0a 20 20 20  Destroyed ){.   
13350 20 20 20 69 4c 61 72 67 65 73 74 20 3d 20 69 54     iLargest = iT
13360 61 62 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f  ab;.    }.    fo
13370 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e  r(pIdx=pTab->pIn
13380 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d  dex; pIdx; pIdx=
13390 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  pIdx->pNext){.  
133a0 20 20 20 20 69 6e 74 20 69 49 64 78 20 3d 20 70      int iIdx = p
133b0 49 64 78 2d 3e 74 6e 75 6d 3b 0a 20 20 20 20 20  Idx->tnum;.     
133c0 20 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e 70   assert( pIdx->p
133d0 53 63 68 65 6d 61 3d 3d 70 54 61 62 2d 3e 70 53  Schema==pTab->pS
133e0 63 68 65 6d 61 20 29 3b 0a 20 20 20 20 20 20 69  chema );.      i
133f0 66 28 20 28 69 44 65 73 74 72 6f 79 65 64 3d 3d  f( (iDestroyed==
13400 30 20 7c 7c 20 28 69 49 64 78 3c 69 44 65 73 74  0 || (iIdx<iDest
13410 72 6f 79 65 64 29 29 20 26 26 20 69 49 64 78 3e  royed)) && iIdx>
13420 69 4c 61 72 67 65 73 74 20 29 7b 0a 20 20 20 20  iLargest ){.    
13430 20 20 20 20 69 4c 61 72 67 65 73 74 20 3d 20 69      iLargest = i
13440 49 64 78 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  Idx;.      }.   
13450 20 7d 0a 20 20 20 20 69 66 28 20 69 4c 61 72 67   }.    if( iLarg
13460 65 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  est==0 ){.      
13470 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 65 6c 73  return;.    }els
13480 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 44 62  e{.      int iDb
13490 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61   = sqlite3Schema
134a0 54 6f 49 6e 64 65 78 28 70 50 61 72 73 65 2d 3e  ToIndex(pParse->
134b0 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d  db, pTab->pSchem
134c0 61 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  a);.      assert
134d0 28 20 69 44 62 3e 3d 30 20 26 26 20 69 44 62 3c  ( iDb>=0 && iDb<
134e0 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6e 44 62 20  pParse->db->nDb 
134f0 29 3b 0a 20 20 20 20 20 20 64 65 73 74 72 6f 79  );.      destroy
13500 52 6f 6f 74 50 61 67 65 28 70 50 61 72 73 65 2c  RootPage(pParse,
13510 20 69 4c 61 72 67 65 73 74 2c 20 69 44 62 29 3b   iLargest, iDb);
13520 0a 20 20 20 20 20 20 69 44 65 73 74 72 6f 79 65  .      iDestroye
13530 64 20 3d 20 69 4c 61 72 67 65 73 74 3b 0a 20 20  d = iLargest;.  
13540 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d    }.  }.#endif.}
13550 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 65  ../*.** Remove e
13560 6e 74 72 69 65 73 20 66 72 6f 6d 20 74 68 65 20  ntries from the 
13570 73 71 6c 69 74 65 5f 73 74 61 74 4e 20 74 61 62  sqlite_statN tab
13580 6c 65 73 20 28 66 6f 72 20 4e 20 69 6e 20 28 31  les (for N in (1
13590 2c 32 2c 33 29 29 0a 2a 2a 20 61 66 74 65 72 20  ,2,3)).** after 
135a0 61 20 44 52 4f 50 20 49 4e 44 45 58 20 6f 72 20  a DROP INDEX or 
135b0 44 52 4f 50 20 54 41 42 4c 45 20 63 6f 6d 6d 61  DROP TABLE comma
135c0 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  nd..*/.static vo
135d0 69 64 20 73 71 6c 69 74 65 33 43 6c 65 61 72 53  id sqlite3ClearS
135e0 74 61 74 54 61 62 6c 65 73 28 0a 20 20 50 61 72  tatTables(.  Par
135f0 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
13600 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69      /* The parsi
13610 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
13620 69 6e 74 20 69 44 62 2c 20 20 20 20 20 20 20 20  int iDb,        
13630 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61         /* The da
13640 74 61 62 61 73 65 20 6e 75 6d 62 65 72 20 2a 2f  tabase number */
13650 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
13660 54 79 70 65 2c 20 20 20 20 20 2f 2a 20 22 69 64  Type,     /* "id
13670 78 22 20 6f 72 20 22 74 62 6c 22 20 2a 2f 0a 20  x" or "tbl" */. 
13680 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
13690 6d 65 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20  me      /* Name 
136a0 6f 66 20 69 6e 64 65 78 20 6f 72 20 74 61 62 6c  of index or tabl
136b0 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b  e */.){.  int i;
136c0 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
136d0 44 62 4e 61 6d 65 20 3d 20 70 50 61 72 73 65 2d  DbName = pParse-
136e0 3e 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e  >db->aDb[iDb].zN
136f0 61 6d 65 3b 0a 20 20 66 6f 72 28 69 3d 31 3b 20  ame;.  for(i=1; 
13700 69 3c 3d 34 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  i<=4; i++){.    
13710 63 68 61 72 20 7a 54 61 62 5b 32 34 5d 3b 0a 20  char zTab[24];. 
13720 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
13730 6e 74 66 28 73 69 7a 65 6f 66 28 7a 54 61 62 29  ntf(sizeof(zTab)
13740 2c 7a 54 61 62 2c 22 73 71 6c 69 74 65 5f 73 74  ,zTab,"sqlite_st
13750 61 74 25 64 22 2c 69 29 3b 0a 20 20 20 20 69 66  at%d",i);.    if
13760 28 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62  ( sqlite3FindTab
13770 6c 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 7a  le(pParse->db, z
13780 54 61 62 2c 20 7a 44 62 4e 61 6d 65 29 20 29 7b  Tab, zDbName) ){
13790 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4e 65  .      sqlite3Ne
137a0 73 74 65 64 50 61 72 73 65 28 70 50 61 72 73 65  stedParse(pParse
137b0 2c 0a 20 20 20 20 20 20 20 20 22 44 45 4c 45 54  ,.        "DELET
137c0 45 20 46 52 4f 4d 20 25 51 2e 25 73 20 57 48 45  E FROM %Q.%s WHE
137d0 52 45 20 25 73 3d 25 51 22 2c 0a 20 20 20 20 20  RE %s=%Q",.     
137e0 20 20 20 7a 44 62 4e 61 6d 65 2c 20 7a 54 61 62     zDbName, zTab
137f0 2c 20 7a 54 79 70 65 2c 20 7a 4e 61 6d 65 0a 20  , zType, zName. 
13800 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20       );.    }.  
13810 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  }.}../*.** Gener
13820 61 74 65 20 63 6f 64 65 20 74 6f 20 64 72 6f 70  ate code to drop
13830 20 61 20 74 61 62 6c 65 2e 0a 2a 2f 0a 76 6f 69   a table..*/.voi
13840 64 20 73 71 6c 69 74 65 33 43 6f 64 65 44 72 6f  d sqlite3CodeDro
13850 70 54 61 62 6c 65 28 50 61 72 73 65 20 2a 70 50  pTable(Parse *pP
13860 61 72 73 65 2c 20 54 61 62 6c 65 20 2a 70 54 61  arse, Table *pTa
13870 62 2c 20 69 6e 74 20 69 44 62 2c 20 69 6e 74 20  b, int iDb, int 
13880 69 73 56 69 65 77 29 7b 0a 20 20 56 64 62 65 20  isView){.  Vdbe 
13890 2a 76 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  *v;.  sqlite3 *d
138a0 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
138b0 20 20 54 72 69 67 67 65 72 20 2a 70 54 72 69 67    Trigger *pTrig
138c0 67 65 72 3b 0a 20 20 44 62 20 2a 70 44 62 20 3d  ger;.  Db *pDb =
138d0 20 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a   &db->aDb[iDb];.
138e0 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65  .  v = sqlite3Ge
138f0 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
13900 20 61 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b   assert( v!=0 );
13910 0a 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57  .  sqlite3BeginW
13920 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50  riteOperation(pP
13930 61 72 73 65 2c 20 31 2c 20 69 44 62 29 3b 0a 0a  arse, 1, iDb);..
13940 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
13950 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
13960 0a 20 20 69 66 28 20 49 73 56 69 72 74 75 61 6c  .  if( IsVirtual
13970 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20 73 71  (pTab) ){.    sq
13980 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 28  lite3VdbeAddOp0(
13990 76 2c 20 4f 50 5f 56 42 65 67 69 6e 29 3b 0a 20  v, OP_VBegin);. 
139a0 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
139b0 44 72 6f 70 20 61 6c 6c 20 74 72 69 67 67 65 72  Drop all trigger
139c0 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
139d0 68 20 74 68 65 20 74 61 62 6c 65 20 62 65 69 6e  h the table bein
139e0 67 20 64 72 6f 70 70 65 64 2e 20 43 6f 64 65 0a  g dropped. Code.
139f0 20 20 2a 2a 20 69 73 20 67 65 6e 65 72 61 74 65    ** is generate
13a00 64 20 74 6f 20 72 65 6d 6f 76 65 20 65 6e 74 72  d to remove entr
13a10 69 65 73 20 66 72 6f 6d 20 73 71 6c 69 74 65 5f  ies from sqlite_
13a20 6d 61 73 74 65 72 20 61 6e 64 2f 6f 72 0a 20 20  master and/or.  
13a30 2a 2a 20 73 71 6c 69 74 65 5f 74 65 6d 70 5f 6d  ** sqlite_temp_m
13a40 61 73 74 65 72 20 69 66 20 72 65 71 75 69 72 65  aster if require
13a50 64 2e 0a 20 20 2a 2f 0a 20 20 70 54 72 69 67 67  d..  */.  pTrigg
13a60 65 72 20 3d 20 73 71 6c 69 74 65 33 54 72 69 67  er = sqlite3Trig
13a70 67 65 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20  gerList(pParse, 
13a80 70 54 61 62 29 3b 0a 20 20 77 68 69 6c 65 28 20  pTab);.  while( 
13a90 70 54 72 69 67 67 65 72 20 29 7b 0a 20 20 20 20  pTrigger ){.    
13aa0 61 73 73 65 72 74 28 20 70 54 72 69 67 67 65 72  assert( pTrigger
13ab0 2d 3e 70 53 63 68 65 6d 61 3d 3d 70 54 61 62 2d  ->pSchema==pTab-
13ac0 3e 70 53 63 68 65 6d 61 20 7c 7c 20 0a 20 20 20  >pSchema || .   
13ad0 20 20 20 20 20 70 54 72 69 67 67 65 72 2d 3e 70       pTrigger->p
13ae0 53 63 68 65 6d 61 3d 3d 64 62 2d 3e 61 44 62 5b  Schema==db->aDb[
13af0 31 5d 2e 70 53 63 68 65 6d 61 20 29 3b 0a 20 20  1].pSchema );.  
13b00 20 20 73 71 6c 69 74 65 33 44 72 6f 70 54 72 69    sqlite3DropTri
13b10 67 67 65 72 50 74 72 28 70 50 61 72 73 65 2c 20  ggerPtr(pParse, 
13b20 70 54 72 69 67 67 65 72 29 3b 0a 20 20 20 20 70  pTrigger);.    p
13b30 54 72 69 67 67 65 72 20 3d 20 70 54 72 69 67 67  Trigger = pTrigg
13b40 65 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 0a  er->pNext;.  }..
13b50 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
13b60 4d 49 54 5f 41 55 54 4f 49 4e 43 52 45 4d 45 4e  MIT_AUTOINCREMEN
13b70 54 0a 20 20 2f 2a 20 52 65 6d 6f 76 65 20 61 6e  T.  /* Remove an
13b80 79 20 65 6e 74 72 69 65 73 20 6f 66 20 74 68 65  y entries of the
13b90 20 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65   sqlite_sequence
13ba0 20 74 61 62 6c 65 20 61 73 73 6f 63 69 61 74 65   table associate
13bb0 64 20 77 69 74 68 0a 20 20 2a 2a 20 74 68 65 20  d with.  ** the 
13bc0 74 61 62 6c 65 20 62 65 69 6e 67 20 64 72 6f 70  table being drop
13bd0 70 65 64 2e 20 54 68 69 73 20 69 73 20 64 6f 6e  ped. This is don
13be0 65 20 62 65 66 6f 72 65 20 74 68 65 20 74 61 62  e before the tab
13bf0 6c 65 20 69 73 20 64 72 6f 70 70 65 64 0a 20 20  le is dropped.  
13c00 2a 2a 20 61 74 20 74 68 65 20 62 74 72 65 65 20  ** at the btree 
13c10 6c 65 76 65 6c 2c 20 69 6e 20 63 61 73 65 20 74  level, in case t
13c20 68 65 20 73 71 6c 69 74 65 5f 73 65 71 75 65 6e  he sqlite_sequen
13c30 63 65 20 74 61 62 6c 65 20 6e 65 65 64 73 20 74  ce table needs t
13c40 6f 0a 20 20 2a 2a 20 6d 6f 76 65 20 61 73 20 61  o.  ** move as a
13c50 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20 64   result of the d
13c60 72 6f 70 20 28 63 61 6e 20 68 61 70 70 65 6e 20  rop (can happen 
13c70 69 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 6d  in auto-vacuum m
13c80 6f 64 65 29 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ode)..  */.  if(
13c90 20 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20   pTab->tabFlags 
13ca0 26 20 54 46 5f 41 75 74 6f 69 6e 63 72 65 6d 65  & TF_Autoincreme
13cb0 6e 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  nt ){.    sqlite
13cc0 33 4e 65 73 74 65 64 50 61 72 73 65 28 70 50 61  3NestedParse(pPa
13cd0 72 73 65 2c 0a 20 20 20 20 20 20 22 44 45 4c 45  rse,.      "DELE
13ce0 54 45 20 46 52 4f 4d 20 25 51 2e 73 71 6c 69 74  TE FROM %Q.sqlit
13cf0 65 5f 73 65 71 75 65 6e 63 65 20 57 48 45 52 45  e_sequence WHERE
13d00 20 6e 61 6d 65 3d 25 51 22 2c 0a 20 20 20 20 20   name=%Q",.     
13d10 20 70 44 62 2d 3e 7a 4e 61 6d 65 2c 20 70 54 61   pDb->zName, pTa
13d20 62 2d 3e 7a 4e 61 6d 65 0a 20 20 20 20 29 3b 0a  b->zName.    );.
13d30 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a    }.#endif..  /*
13d40 20 44 72 6f 70 20 61 6c 6c 20 53 51 4c 49 54 45   Drop all SQLITE
13d50 5f 4d 41 53 54 45 52 20 74 61 62 6c 65 20 61 6e  _MASTER table an
13d60 64 20 69 6e 64 65 78 20 65 6e 74 72 69 65 73 20  d index entries 
13d70 74 68 61 74 20 72 65 66 65 72 20 74 6f 20 74 68  that refer to th
13d80 65 0a 20 20 2a 2a 20 74 61 62 6c 65 2e 20 54 68  e.  ** table. Th
13d90 65 20 70 72 6f 67 72 61 6d 20 6e 61 6d 65 20 6c  e program name l
13da0 6f 6f 70 73 20 74 68 72 6f 75 67 68 20 74 68 65  oops through the
13db0 20 6d 61 73 74 65 72 20 74 61 62 6c 65 20 61 6e   master table an
13dc0 64 20 64 65 6c 65 74 65 73 0a 20 20 2a 2a 20 65  d deletes.  ** e
13dd0 76 65 72 79 20 72 6f 77 20 74 68 61 74 20 72 65  very row that re
13de0 66 65 72 73 20 74 6f 20 61 20 74 61 62 6c 65 20  fers to a table 
13df0 6f 66 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65  of the same name
13e00 20 61 73 20 74 68 65 20 6f 6e 65 20 62 65 69 6e   as the one bein
13e10 67 0a 20 20 2a 2a 20 64 72 6f 70 70 65 64 2e 20  g.  ** dropped. 
13e20 54 72 69 67 67 65 72 73 20 61 72 65 20 68 61 6e  Triggers are han
13e30 64 6c 65 64 20 73 65 70 61 72 61 74 65 6c 79 20  dled separately 
13e40 62 65 63 61 75 73 65 20 61 20 74 72 69 67 67 65  because a trigge
13e50 72 20 63 61 6e 20 62 65 0a 20 20 2a 2a 20 63 72  r can be.  ** cr
13e60 65 61 74 65 64 20 69 6e 20 74 68 65 20 74 65 6d  eated in the tem
13e70 70 20 64 61 74 61 62 61 73 65 20 74 68 61 74 20  p database that 
13e80 72 65 66 65 72 73 20 74 6f 20 61 20 74 61 62 6c  refers to a tabl
13e90 65 20 69 6e 20 61 6e 6f 74 68 65 72 0a 20 20 2a  e in another.  *
13ea0 2a 20 64 61 74 61 62 61 73 65 2e 0a 20 20 2a 2f  * database..  */
13eb0 0a 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64  .  sqlite3Nested
13ec0 50 61 72 73 65 28 70 50 61 72 73 65 2c 20 0a 20  Parse(pParse, . 
13ed0 20 20 20 20 20 22 44 45 4c 45 54 45 20 46 52 4f       "DELETE FRO
13ee0 4d 20 25 51 2e 25 73 20 57 48 45 52 45 20 74 62  M %Q.%s WHERE tb
13ef0 6c 5f 6e 61 6d 65 3d 25 51 20 61 6e 64 20 74 79  l_name=%Q and ty
13f00 70 65 21 3d 27 74 72 69 67 67 65 72 27 22 2c 0a  pe!='trigger'",.
13f10 20 20 20 20 20 20 70 44 62 2d 3e 7a 4e 61 6d 65        pDb->zName
13f20 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69  , SCHEMA_TABLE(i
13f30 44 62 29 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  Db), pTab->zName
13f40 29 3b 0a 20 20 69 66 28 20 21 69 73 56 69 65 77  );.  if( !isView
13f50 20 26 26 20 21 49 73 56 69 72 74 75 61 6c 28 70   && !IsVirtual(p
13f60 54 61 62 29 20 29 7b 0a 20 20 20 20 64 65 73 74  Tab) ){.    dest
13f70 72 6f 79 54 61 62 6c 65 28 70 50 61 72 73 65 2c  royTable(pParse,
13f80 20 70 54 61 62 29 3b 0a 20 20 7d 0a 0a 20 20 2f   pTab);.  }..  /
13f90 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 74 61 62  * Remove the tab
13fa0 6c 65 20 65 6e 74 72 79 20 66 72 6f 6d 20 53 51  le entry from SQ
13fb0 4c 69 74 65 27 73 20 69 6e 74 65 72 6e 61 6c 20  Lite's internal 
13fc0 73 63 68 65 6d 61 20 61 6e 64 20 6d 6f 64 69 66  schema and modif
13fd0 79 0a 20 20 2a 2a 20 74 68 65 20 73 63 68 65 6d  y.  ** the schem
13fe0 61 20 63 6f 6f 6b 69 65 2e 0a 20 20 2a 2f 0a 20  a cookie..  */. 
13ff0 20 69 66 28 20 49 73 56 69 72 74 75 61 6c 28 70   if( IsVirtual(p
14000 54 61 62 29 20 29 7b 0a 20 20 20 20 73 71 6c 69  Tab) ){.    sqli
14010 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
14020 20 4f 50 5f 56 44 65 73 74 72 6f 79 2c 20 69 44   OP_VDestroy, iD
14030 62 2c 20 30 2c 20 30 2c 20 70 54 61 62 2d 3e 7a  b, 0, 0, pTab->z
14040 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 7d 0a 20 20  Name, 0);.  }.  
14050 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
14060 34 28 76 2c 20 4f 50 5f 44 72 6f 70 54 61 62 6c  4(v, OP_DropTabl
14070 65 2c 20 69 44 62 2c 20 30 2c 20 30 2c 20 70 54  e, iDb, 0, 0, pT
14080 61 62 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20  ab->zName, 0);. 
14090 20 73 71 6c 69 74 65 33 43 68 61 6e 67 65 43 6f   sqlite3ChangeCo
140a0 6f 6b 69 65 28 70 50 61 72 73 65 2c 20 69 44 62  okie(pParse, iDb
140b0 29 3b 0a 20 20 73 71 6c 69 74 65 56 69 65 77 52  );.  sqliteViewR
140c0 65 73 65 74 41 6c 6c 28 64 62 2c 20 69 44 62 29  esetAll(db, iDb)
140d0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
140e0 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
140f0 64 20 74 6f 20 64 6f 20 74 68 65 20 77 6f 72 6b  d to do the work
14100 20 6f 66 20 61 20 44 52 4f 50 20 54 41 42 4c 45   of a DROP TABLE
14110 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 70   statement..** p
14120 4e 61 6d 65 20 69 73 20 74 68 65 20 6e 61 6d 65  Name is the name
14130 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74 6f   of the table to
14140 20 62 65 20 64 72 6f 70 70 65 64 2e 0a 2a 2f 0a   be dropped..*/.
14150 76 6f 69 64 20 73 71 6c 69 74 65 33 44 72 6f 70  void sqlite3Drop
14160 54 61 62 6c 65 28 50 61 72 73 65 20 2a 70 50 61  Table(Parse *pPa
14170 72 73 65 2c 20 53 72 63 4c 69 73 74 20 2a 70 4e  rse, SrcList *pN
14180 61 6d 65 2c 20 69 6e 74 20 69 73 56 69 65 77 2c  ame, int isView,
14190 20 69 6e 74 20 6e 6f 45 72 72 29 7b 0a 20 20 54   int noErr){.  T
141a0 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 56 64  able *pTab;.  Vd
141b0 62 65 20 2a 76 3b 0a 20 20 73 71 6c 69 74 65 33  be *v;.  sqlite3
141c0 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
141d0 62 3b 0a 20 20 69 6e 74 20 69 44 62 3b 0a 0a 20  b;.  int iDb;.. 
141e0 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
141f0 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f 74  ailed ){.    got
14200 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c  o exit_drop_tabl
14210 65 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  e;.  }.  assert(
14220 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30   pParse->nErr==0
14230 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4e   );.  assert( pN
14240 61 6d 65 2d 3e 6e 53 72 63 3d 3d 31 20 29 3b 0a  ame->nSrc==1 );.
14250 20 20 69 66 28 20 73 71 6c 69 74 65 33 52 65 61    if( sqlite3Rea
14260 64 53 63 68 65 6d 61 28 70 50 61 72 73 65 29 20  dSchema(pParse) 
14270 29 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70  ) goto exit_drop
14280 5f 74 61 62 6c 65 3b 0a 20 20 69 66 28 20 6e 6f  _table;.  if( no
14290 45 72 72 20 29 20 64 62 2d 3e 73 75 70 70 72 65  Err ) db->suppre
142a0 73 73 45 72 72 2b 2b 3b 0a 20 20 70 54 61 62 20  ssErr++;.  pTab 
142b0 3d 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54  = sqlite3LocateT
142c0 61 62 6c 65 49 74 65 6d 28 70 50 61 72 73 65 2c  ableItem(pParse,
142d0 20 69 73 56 69 65 77 2c 20 26 70 4e 61 6d 65 2d   isView, &pName-
142e0 3e 61 5b 30 5d 29 3b 0a 20 20 69 66 28 20 6e 6f  >a[0]);.  if( no
142f0 45 72 72 20 29 20 64 62 2d 3e 73 75 70 70 72 65  Err ) db->suppre
14300 73 73 45 72 72 2d 2d 3b 0a 0a 20 20 69 66 28 20  ssErr--;..  if( 
14310 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 69  pTab==0 ){.    i
14320 66 28 20 6e 6f 45 72 72 20 29 20 73 71 6c 69 74  f( noErr ) sqlit
14330 65 33 43 6f 64 65 56 65 72 69 66 79 4e 61 6d 65  e3CodeVerifyName
14340 64 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20  dSchema(pParse, 
14350 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 44 61 74  pName->a[0].zDat
14360 61 62 61 73 65 29 3b 0a 20 20 20 20 67 6f 74 6f  abase);.    goto
14370 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65   exit_drop_table
14380 3b 0a 20 20 7d 0a 20 20 69 44 62 20 3d 20 73 71  ;.  }.  iDb = sq
14390 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64  lite3SchemaToInd
143a0 65 78 28 64 62 2c 20 70 54 61 62 2d 3e 70 53 63  ex(db, pTab->pSc
143b0 68 65 6d 61 29 3b 0a 20 20 61 73 73 65 72 74 28  hema);.  assert(
143c0 20 69 44 62 3e 3d 30 20 26 26 20 69 44 62 3c 64   iDb>=0 && iDb<d
143d0 62 2d 3e 6e 44 62 20 29 3b 0a 0a 20 20 2f 2a 20  b->nDb );..  /* 
143e0 49 66 20 70 54 61 62 20 69 73 20 61 20 76 69 72  If pTab is a vir
143f0 74 75 61 6c 20 74 61 62 6c 65 2c 20 63 61 6c 6c  tual table, call
14400 20 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61   ViewGetColumnNa
14410 6d 65 73 28 29 20 74 6f 20 65 6e 73 75 72 65 0a  mes() to ensure.
14420 20 20 2a 2a 20 69 74 20 69 73 20 69 6e 69 74 69    ** it is initi
14430 61 6c 69 7a 65 64 2e 0a 20 20 2a 2f 0a 20 20 69  alized..  */.  i
14440 66 28 20 49 73 56 69 72 74 75 61 6c 28 70 54 61  f( IsVirtual(pTa
14450 62 29 20 26 26 20 73 71 6c 69 74 65 33 56 69 65  b) && sqlite3Vie
14460 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28  wGetColumnNames(
14470 70 50 61 72 73 65 2c 20 70 54 61 62 29 20 29 7b  pParse, pTab) ){
14480 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64  .    goto exit_d
14490 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 23  rop_table;.  }.#
144a0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
144b0 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e  IT_AUTHORIZATION
144c0 0a 20 20 7b 0a 20 20 20 20 69 6e 74 20 63 6f 64  .  {.    int cod
144d0 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  e;.    const cha
144e0 72 20 2a 7a 54 61 62 20 3d 20 53 43 48 45 4d 41  r *zTab = SCHEMA
144f0 5f 54 41 42 4c 45 28 69 44 62 29 3b 0a 20 20 20  _TABLE(iDb);.   
14500 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62   const char *zDb
14510 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e   = db->aDb[iDb].
14520 7a 4e 61 6d 65 3b 0a 20 20 20 20 63 6f 6e 73 74  zName;.    const
14530 20 63 68 61 72 20 2a 7a 41 72 67 32 20 3d 20 30   char *zArg2 = 0
14540 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
14550 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73  3AuthCheck(pPars
14560 65 2c 20 53 51 4c 49 54 45 5f 44 45 4c 45 54 45  e, SQLITE_DELETE
14570 2c 20 7a 54 61 62 2c 20 30 2c 20 7a 44 62 29 29  , zTab, 0, zDb))
14580 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69  {.      goto exi
14590 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20  t_drop_table;.  
145a0 20 20 7d 0a 20 20 20 20 69 66 28 20 69 73 56 69    }.    if( isVi
145b0 65 77 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ew ){.      if( 
145c0 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26 26 20  !OMIT_TEMPDB && 
145d0 69 44 62 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20  iDb==1 ){.      
145e0 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f    code = SQLITE_
145f0 44 52 4f 50 5f 54 45 4d 50 5f 56 49 45 57 3b 0a  DROP_TEMP_VIEW;.
14600 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
14610 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49       code = SQLI
14620 54 45 5f 44 52 4f 50 5f 56 49 45 57 3b 0a 20 20  TE_DROP_VIEW;.  
14630 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51      }.#ifndef SQ
14640 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
14650 4c 54 41 42 4c 45 0a 20 20 20 20 7d 65 6c 73 65  LTABLE.    }else
14660 20 69 66 28 20 49 73 56 69 72 74 75 61 6c 28 70   if( IsVirtual(p
14670 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20 63 6f  Tab) ){.      co
14680 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50  de = SQLITE_DROP
14690 5f 56 54 41 42 4c 45 3b 0a 20 20 20 20 20 20 7a  _VTABLE;.      z
146a0 41 72 67 32 20 3d 20 73 71 6c 69 74 65 33 47 65  Arg2 = sqlite3Ge
146b0 74 56 54 61 62 6c 65 28 64 62 2c 20 70 54 61 62  tVTable(db, pTab
146c0 29 2d 3e 70 4d 6f 64 2d 3e 7a 4e 61 6d 65 3b 0a  )->pMod->zName;.
146d0 23 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c 73 65  #endif.    }else
146e0 7b 0a 20 20 20 20 20 20 69 66 28 20 21 4f 4d 49  {.      if( !OMI
146f0 54 5f 54 45 4d 50 44 42 20 26 26 20 69 44 62 3d  T_TEMPDB && iDb=
14700 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f  =1 ){.        co
14710 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50  de = SQLITE_DROP
14720 5f 54 45 4d 50 5f 54 41 42 4c 45 3b 0a 20 20 20  _TEMP_TABLE;.   
14730 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
14740 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f    code = SQLITE_
14750 44 52 4f 50 5f 54 41 42 4c 45 3b 0a 20 20 20 20  DROP_TABLE;.    
14760 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
14770 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65  ( sqlite3AuthChe
14780 63 6b 28 70 50 61 72 73 65 2c 20 63 6f 64 65 2c  ck(pParse, code,
14790 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 41   pTab->zName, zA
147a0 72 67 32 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20  rg2, zDb) ){.   
147b0 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f     goto exit_dro
147c0 70 5f 74 61 62 6c 65 3b 0a 20 20 20 20 7d 0a 20  p_table;.    }. 
147d0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75     if( sqlite3Au
147e0 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  thCheck(pParse, 
147f0 53 51 4c 49 54 45 5f 44 45 4c 45 54 45 2c 20 70  SQLITE_DELETE, p
14800 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 30 2c 20 7a  Tab->zName, 0, z
14810 44 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  Db) ){.      got
14820 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c  o exit_drop_tabl
14830 65 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  e;.    }.  }.#en
14840 64 69 66 0a 20 20 69 66 28 20 73 71 6c 69 74 65  dif.  if( sqlite
14850 33 53 74 72 4e 49 43 6d 70 28 70 54 61 62 2d 3e  3StrNICmp(pTab->
14860 7a 4e 61 6d 65 2c 20 22 73 71 6c 69 74 65 5f 22  zName, "sqlite_"
14870 2c 20 37 29 3d 3d 30 20 0a 20 20 20 20 26 26 20  , 7)==0 .    && 
14880 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28  sqlite3StrNICmp(
14890 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 22 73 71  pTab->zName, "sq
148a0 6c 69 74 65 5f 73 74 61 74 22 2c 20 31 31 29 21  lite_stat", 11)!
148b0 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
148c0 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
148d0 2c 20 22 74 61 62 6c 65 20 25 73 20 6d 61 79 20  , "table %s may 
148e0 6e 6f 74 20 62 65 20 64 72 6f 70 70 65 64 22 2c  not be dropped",
148f0 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20   pTab->zName);. 
14900 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f     goto exit_dro
14910 70 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 0a 23 69  p_table;.  }..#i
14920 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
14930 54 5f 56 49 45 57 0a 20 20 2f 2a 20 45 6e 73 75  T_VIEW.  /* Ensu
14940 72 65 20 44 52 4f 50 20 54 41 42 4c 45 20 69 73  re DROP TABLE is
14950 20 6e 6f 74 20 75 73 65 64 20 6f 6e 20 61 20 76   not used on a v
14960 69 65 77 2c 20 61 6e 64 20 44 52 4f 50 20 56 49  iew, and DROP VI
14970 45 57 20 69 73 20 6e 6f 74 20 75 73 65 64 0a 20  EW is not used. 
14980 20 2a 2a 20 6f 6e 20 61 20 74 61 62 6c 65 2e 0a   ** on a table..
14990 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 56 69 65    */.  if( isVie
149a0 77 20 26 26 20 70 54 61 62 2d 3e 70 53 65 6c 65  w && pTab->pSele
149b0 63 74 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  ct==0 ){.    sql
149c0 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
149d0 72 73 65 2c 20 22 75 73 65 20 44 52 4f 50 20 54  rse, "use DROP T
149e0 41 42 4c 45 20 74 6f 20 64 65 6c 65 74 65 20 74  ABLE to delete t
149f0 61 62 6c 65 20 25 73 22 2c 20 70 54 61 62 2d 3e  able %s", pTab->
14a00 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f  zName);.    goto
14a10 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65   exit_drop_table
14a20 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 69 73 56  ;.  }.  if( !isV
14a30 69 65 77 20 26 26 20 70 54 61 62 2d 3e 70 53 65  iew && pTab->pSe
14a40 6c 65 63 74 20 29 7b 0a 20 20 20 20 73 71 6c 69  lect ){.    sqli
14a50 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
14a60 73 65 2c 20 22 75 73 65 20 44 52 4f 50 20 56 49  se, "use DROP VI
14a70 45 57 20 74 6f 20 64 65 6c 65 74 65 20 76 69 65  EW to delete vie
14a80 77 20 25 73 22 2c 20 70 54 61 62 2d 3e 7a 4e 61  w %s", pTab->zNa
14a90 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78  me);.    goto ex
14aa0 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20  it_drop_table;. 
14ab0 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
14ac0 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  Generate code to
14ad0 20 72 65 6d 6f 76 65 20 74 68 65 20 74 61 62 6c   remove the tabl
14ae0 65 20 66 72 6f 6d 20 74 68 65 20 6d 61 73 74 65  e from the maste
14af0 72 20 74 61 62 6c 65 0a 20 20 2a 2a 20 6f 6e 20  r table.  ** on 
14b00 64 69 73 6b 2e 0a 20 20 2a 2f 0a 20 20 76 20 3d  disk..  */.  v =
14b10 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
14b20 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76  pParse);.  if( v
14b30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42   ){.    sqlite3B
14b40 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69  eginWriteOperati
14b50 6f 6e 28 70 50 61 72 73 65 2c 20 31 2c 20 69 44  on(pParse, 1, iD
14b60 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 43  b);.    sqlite3C
14b70 6c 65 61 72 53 74 61 74 54 61 62 6c 65 73 28 70  learStatTables(p
14b80 50 61 72 73 65 2c 20 69 44 62 2c 20 22 74 62 6c  Parse, iDb, "tbl
14b90 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b  ", pTab->zName);
14ba0 0a 20 20 20 20 73 71 6c 69 74 65 33 46 6b 44 72  .    sqlite3FkDr
14bb0 6f 70 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20  opTable(pParse, 
14bc0 70 4e 61 6d 65 2c 20 70 54 61 62 29 3b 0a 20 20  pName, pTab);.  
14bd0 20 20 73 71 6c 69 74 65 33 43 6f 64 65 44 72 6f    sqlite3CodeDro
14be0 70 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70  pTable(pParse, p
14bf0 54 61 62 2c 20 69 44 62 2c 20 69 73 56 69 65 77  Tab, iDb, isView
14c00 29 3b 0a 20 20 7d 0a 0a 65 78 69 74 5f 64 72 6f  );.  }..exit_dro
14c10 70 5f 74 61 62 6c 65 3a 0a 20 20 73 71 6c 69 74  p_table:.  sqlit
14c20 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28  e3SrcListDelete(
14c30 64 62 2c 20 70 4e 61 6d 65 29 3b 0a 7d 0a 0a 2f  db, pName);.}../
14c40 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
14c50 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 63  e is called to c
14c60 72 65 61 74 65 20 61 20 6e 65 77 20 66 6f 72 65  reate a new fore
14c70 69 67 6e 20 6b 65 79 20 6f 6e 20 74 68 65 20 74  ign key on the t
14c80 61 62 6c 65 0a 2a 2a 20 63 75 72 72 65 6e 74 6c  able.** currentl
14c90 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63  y under construc
14ca0 74 69 6f 6e 2e 20 20 70 46 72 6f 6d 43 6f 6c 20  tion.  pFromCol 
14cb0 64 65 74 65 72 6d 69 6e 65 73 20 77 68 69 63 68  determines which
14cc0 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 69 6e 20 74   columns.** in t
14cd0 68 65 20 63 75 72 72 65 6e 74 20 74 61 62 6c 65  he current table
14ce0 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 66 6f   point to the fo
14cf0 72 65 69 67 6e 20 6b 65 79 2e 20 20 49 66 20 70  reign key.  If p
14d00 46 72 6f 6d 43 6f 6c 3d 3d 30 20 74 68 65 6e 0a  FromCol==0 then.
14d10 2a 2a 20 63 6f 6e 6e 65 63 74 20 74 68 65 20 6b  ** connect the k
14d20 65 79 20 74 6f 20 74 68 65 20 6c 61 73 74 20 63  ey to the last c
14d30 6f 6c 75 6d 6e 20 69 6e 73 65 72 74 65 64 2e 20  olumn inserted. 
14d40 20 70 54 6f 20 69 73 20 74 68 65 20 6e 61 6d 65   pTo is the name
14d50 20 6f 66 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65   of.** the table
14d60 20 72 65 66 65 72 72 65 64 20 74 6f 20 28 61 2e   referred to (a.
14d70 6b 2e 61 20 74 68 65 20 22 70 61 72 65 6e 74 22  k.a the "parent"
14d80 20 74 61 62 6c 65 29 2e 20 20 70 54 6f 43 6f 6c   table).  pToCol
14d90 20 69 73 20 61 20 6c 69 73 74 0a 2a 2a 20 6f 66   is a list.** of
14da0 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20 70   tables in the p
14db0 61 72 65 6e 74 20 70 54 6f 20 74 61 62 6c 65 2e  arent pTo table.
14dc0 20 20 66 6c 61 67 73 20 63 6f 6e 74 61 69 6e 73    flags contains
14dd0 20 61 6c 6c 0a 2a 2a 20 69 6e 66 6f 72 6d 61 74   all.** informat
14de0 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 63 6f  ion about the co
14df0 6e 66 6c 69 63 74 20 72 65 73 6f 6c 75 74 69 6f  nflict resolutio
14e00 6e 20 61 6c 67 6f 72 69 74 68 6d 73 20 73 70 65  n algorithms spe
14e10 63 69 66 69 65 64 0a 2a 2a 20 69 6e 20 74 68 65  cified.** in the
14e20 20 4f 4e 20 44 45 4c 45 54 45 2c 20 4f 4e 20 55   ON DELETE, ON U
14e30 50 44 41 54 45 20 61 6e 64 20 4f 4e 20 49 4e 53  PDATE and ON INS
14e40 45 52 54 20 63 6c 61 75 73 65 73 2e 0a 2a 2a 0a  ERT clauses..**.
14e50 2a 2a 20 41 6e 20 46 4b 65 79 20 73 74 72 75 63  ** An FKey struc
14e60 74 75 72 65 20 69 73 20 63 72 65 61 74 65 64 20  ture is created 
14e70 61 6e 64 20 61 64 64 65 64 20 74 6f 20 74 68 65  and added to the
14e80 20 74 61 62 6c 65 20 63 75 72 72 65 6e 74 6c 79   table currently
14e90 0a 2a 2a 20 75 6e 64 65 72 20 63 6f 6e 73 74 72  .** under constr
14ea0 75 63 74 69 6f 6e 20 69 6e 20 74 68 65 20 70 50  uction in the pP
14eb0 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20  arse->pNewTable 
14ec0 66 69 65 6c 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  field..**.** The
14ed0 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 69 73 20   foreign key is 
14ee0 73 65 74 20 66 6f 72 20 49 4d 4d 45 44 49 41 54  set for IMMEDIAT
14ef0 45 20 70 72 6f 63 65 73 73 69 6e 67 2e 20 20 41  E processing.  A
14f00 20 73 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c   subsequent call
14f10 0a 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33 44 65  .** to sqlite3De
14f20 66 65 72 46 6f 72 65 69 67 6e 4b 65 79 28 29 20  ferForeignKey() 
14f30 6d 69 67 68 74 20 63 68 61 6e 67 65 20 74 68 69  might change thi
14f40 73 20 74 6f 20 44 45 46 45 52 52 45 44 2e 0a 2a  s to DEFERRED..*
14f50 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 72  /.void sqlite3Cr
14f60 65 61 74 65 46 6f 72 65 69 67 6e 4b 65 79 28 0a  eateForeignKey(.
14f70 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
14f80 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
14f90 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45  g context */.  E
14fa0 78 70 72 4c 69 73 74 20 2a 70 46 72 6f 6d 43 6f  xprList *pFromCo
14fb0 6c 2c 20 20 2f 2a 20 43 6f 6c 75 6d 6e 73 20 69  l,  /* Columns i
14fc0 6e 20 74 68 69 73 20 74 61 62 6c 65 20 74 68 61  n this table tha
14fd0 74 20 70 6f 69 6e 74 20 74 6f 20 6f 74 68 65 72  t point to other
14fe0 20 74 61 62 6c 65 20 2a 2f 0a 20 20 54 6f 6b 65   table */.  Toke
14ff0 6e 20 2a 70 54 6f 2c 20 20 20 20 20 20 20 20 20  n *pTo,         
15000 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
15010 6f 74 68 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20  other table */. 
15020 20 45 78 70 72 4c 69 73 74 20 2a 70 54 6f 43 6f   ExprList *pToCo
15030 6c 2c 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 73  l,    /* Columns
15040 20 69 6e 20 74 68 65 20 6f 74 68 65 72 20 74 61   in the other ta
15050 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61  ble */.  int fla
15060 67 73 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  gs            /*
15070 20 43 6f 6e 66 6c 69 63 74 20 72 65 73 6f 6c 75   Conflict resolu
15080 74 69 6f 6e 20 61 6c 67 6f 72 69 74 68 6d 73 2e  tion algorithms.
15090 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33   */.){.  sqlite3
150a0 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
150b0 62 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  b;.#ifndef SQLIT
150c0 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b  E_OMIT_FOREIGN_K
150d0 45 59 0a 20 20 46 4b 65 79 20 2a 70 46 4b 65 79  EY.  FKey *pFKey
150e0 20 3d 20 30 3b 0a 20 20 46 4b 65 79 20 2a 70 4e   = 0;.  FKey *pN
150f0 65 78 74 54 6f 3b 0a 20 20 54 61 62 6c 65 20 2a  extTo;.  Table *
15100 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  p = pParse->pNew
15110 54 61 62 6c 65 3b 0a 20 20 69 6e 74 20 6e 42 79  Table;.  int nBy
15120 74 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  te;.  int i;.  i
15130 6e 74 20 6e 43 6f 6c 3b 0a 20 20 63 68 61 72 20  nt nCol;.  char 
15140 2a 7a 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  *z;..  assert( p
15150 54 6f 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  To!=0 );.  if( p
15160 3d 3d 30 20 7c 7c 20 49 4e 5f 44 45 43 4c 41 52  ==0 || IN_DECLAR
15170 45 5f 56 54 41 42 20 29 20 67 6f 74 6f 20 66 6b  E_VTAB ) goto fk
15180 5f 65 6e 64 3b 0a 20 20 69 66 28 20 70 46 72 6f  _end;.  if( pFro
15190 6d 43 6f 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 69  mCol==0 ){.    i
151a0 6e 74 20 69 43 6f 6c 20 3d 20 70 2d 3e 6e 43 6f  nt iCol = p->nCo
151b0 6c 2d 31 3b 0a 20 20 20 20 69 66 28 20 4e 45 56  l-1;.    if( NEV
151c0 45 52 28 69 43 6f 6c 3c 30 29 20 29 20 67 6f 74  ER(iCol<0) ) got
151d0 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 20 20 69 66  o fk_end;.    if
151e0 28 20 70 54 6f 43 6f 6c 20 26 26 20 70 54 6f 43  ( pToCol && pToC
151f0 6f 6c 2d 3e 6e 45 78 70 72 21 3d 31 20 29 7b 0a  ol->nExpr!=1 ){.
15200 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
15210 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 66  orMsg(pParse, "f
15220 6f 72 65 69 67 6e 20 6b 65 79 20 6f 6e 20 25 73  oreign key on %s
15230 22 0a 20 20 20 20 20 20 20 20 20 22 20 73 68 6f  ".         " sho
15240 75 6c 64 20 72 65 66 65 72 65 6e 63 65 20 6f 6e  uld reference on
15250 6c 79 20 6f 6e 65 20 63 6f 6c 75 6d 6e 20 6f 66  ly one column of
15260 20 74 61 62 6c 65 20 25 54 22 2c 0a 20 20 20 20   table %T",.    
15270 20 20 20 20 20 70 2d 3e 61 43 6f 6c 5b 69 43 6f       p->aCol[iCo
15280 6c 5d 2e 7a 4e 61 6d 65 2c 20 70 54 6f 29 3b 0a  l].zName, pTo);.
15290 20 20 20 20 20 20 67 6f 74 6f 20 66 6b 5f 65 6e        goto fk_en
152a0 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 43 6f  d;.    }.    nCo
152b0 6c 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 20 69  l = 1;.  }else i
152c0 66 28 20 70 54 6f 43 6f 6c 20 26 26 20 70 54 6f  f( pToCol && pTo
152d0 43 6f 6c 2d 3e 6e 45 78 70 72 21 3d 70 46 72 6f  Col->nExpr!=pFro
152e0 6d 43 6f 6c 2d 3e 6e 45 78 70 72 20 29 7b 0a 20  mCol->nExpr ){. 
152f0 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
15300 73 67 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20  sg(pParse,.     
15310 20 20 20 22 6e 75 6d 62 65 72 20 6f 66 20 63 6f     "number of co
15320 6c 75 6d 6e 73 20 69 6e 20 66 6f 72 65 69 67 6e  lumns in foreign
15330 20 6b 65 79 20 64 6f 65 73 20 6e 6f 74 20 6d 61   key does not ma
15340 74 63 68 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  tch the number o
15350 66 20 22 0a 20 20 20 20 20 20 20 20 22 63 6f 6c  f ".        "col
15360 75 6d 6e 73 20 69 6e 20 74 68 65 20 72 65 66 65  umns in the refe
15370 72 65 6e 63 65 64 20 74 61 62 6c 65 22 29 3b 0a  renced table");.
15380 20 20 20 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b      goto fk_end;
15390 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 43  .  }else{.    nC
153a0 6f 6c 20 3d 20 70 46 72 6f 6d 43 6f 6c 2d 3e 6e  ol = pFromCol->n
153b0 45 78 70 72 3b 0a 20 20 7d 0a 20 20 6e 42 79 74  Expr;.  }.  nByt
153c0 65 20 3d 20 73 69 7a 65 6f 66 28 2a 70 46 4b 65  e = sizeof(*pFKe
153d0 79 29 20 2b 20 28 6e 43 6f 6c 2d 31 29 2a 73 69  y) + (nCol-1)*si
153e0 7a 65 6f 66 28 70 46 4b 65 79 2d 3e 61 43 6f 6c  zeof(pFKey->aCol
153f0 5b 30 5d 29 20 2b 20 70 54 6f 2d 3e 6e 20 2b 20  [0]) + pTo->n + 
15400 31 3b 0a 20 20 69 66 28 20 70 54 6f 43 6f 6c 20  1;.  if( pToCol 
15410 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  ){.    for(i=0; 
15420 69 3c 70 54 6f 43 6f 6c 2d 3e 6e 45 78 70 72 3b  i<pToCol->nExpr;
15430 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 6e 42 79   i++){.      nBy
15440 74 65 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72  te += sqlite3Str
15450 6c 65 6e 33 30 28 70 54 6f 43 6f 6c 2d 3e 61 5b  len30(pToCol->a[
15460 69 5d 2e 7a 4e 61 6d 65 29 20 2b 20 31 3b 0a 20  i].zName) + 1;. 
15470 20 20 20 7d 0a 20 20 7d 0a 20 20 70 46 4b 65 79     }.  }.  pFKey
15480 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
15490 6f 63 5a 65 72 6f 28 64 62 2c 20 6e 42 79 74 65  ocZero(db, nByte
154a0 20 29 3b 0a 20 20 69 66 28 20 70 46 4b 65 79 3d   );.  if( pFKey=
154b0 3d 30 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 66  =0 ){.    goto f
154c0 6b 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 70 46 4b  k_end;.  }.  pFK
154d0 65 79 2d 3e 70 46 72 6f 6d 20 3d 20 70 3b 0a 20  ey->pFrom = p;. 
154e0 20 70 46 4b 65 79 2d 3e 70 4e 65 78 74 46 72 6f   pFKey->pNextFro
154f0 6d 20 3d 20 70 2d 3e 70 46 4b 65 79 3b 0a 20 20  m = p->pFKey;.  
15500 7a 20 3d 20 28 63 68 61 72 2a 29 26 70 46 4b 65  z = (char*)&pFKe
15510 79 2d 3e 61 43 6f 6c 5b 6e 43 6f 6c 5d 3b 0a 20  y->aCol[nCol];. 
15520 20 70 46 4b 65 79 2d 3e 7a 54 6f 20 3d 20 7a 3b   pFKey->zTo = z;
15530 0a 20 20 6d 65 6d 63 70 79 28 7a 2c 20 70 54 6f  .  memcpy(z, pTo
15540 2d 3e 7a 2c 20 70 54 6f 2d 3e 6e 29 3b 0a 20 20  ->z, pTo->n);.  
15550 7a 5b 70 54 6f 2d 3e 6e 5d 20 3d 20 30 3b 0a 20  z[pTo->n] = 0;. 
15560 20 73 71 6c 69 74 65 33 44 65 71 75 6f 74 65 28   sqlite3Dequote(
15570 7a 29 3b 0a 20 20 7a 20 2b 3d 20 70 54 6f 2d 3e  z);.  z += pTo->
15580 6e 2b 31 3b 0a 20 20 70 46 4b 65 79 2d 3e 6e 43  n+1;.  pFKey->nC
15590 6f 6c 20 3d 20 6e 43 6f 6c 3b 0a 20 20 69 66 28  ol = nCol;.  if(
155a0 20 70 46 72 6f 6d 43 6f 6c 3d 3d 30 20 29 7b 0a   pFromCol==0 ){.
155b0 20 20 20 20 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b      pFKey->aCol[
155c0 30 5d 2e 69 46 72 6f 6d 20 3d 20 70 2d 3e 6e 43  0].iFrom = p->nC
155d0 6f 6c 2d 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ol-1;.  }else{. 
155e0 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43     for(i=0; i<nC
155f0 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ol; i++){.      
15600 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 66 6f 72  int j;.      for
15610 28 6a 3d 30 3b 20 6a 3c 70 2d 3e 6e 43 6f 6c 3b  (j=0; j<p->nCol;
15620 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69   j++){.        i
15630 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  f( sqlite3StrICm
15640 70 28 70 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61  p(p->aCol[j].zNa
15650 6d 65 2c 20 70 46 72 6f 6d 43 6f 6c 2d 3e 61 5b  me, pFromCol->a[
15660 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a  i].zName)==0 ){.
15670 20 20 20 20 20 20 20 20 20 20 70 46 4b 65 79 2d            pFKey-
15680 3e 61 43 6f 6c 5b 69 5d 2e 69 46 72 6f 6d 20 3d  >aCol[i].iFrom =
15690 20 6a 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72   j;.          br
156a0 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
156b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
156c0 20 6a 3e 3d 70 2d 3e 6e 43 6f 6c 20 29 7b 0a 20   j>=p->nCol ){. 
156d0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
156e0 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 0a  rorMsg(pParse, .
156f0 20 20 20 20 20 20 20 20 20 20 22 75 6e 6b 6e 6f            "unkno
15700 77 6e 20 63 6f 6c 75 6d 6e 20 5c 22 25 73 5c 22  wn column \"%s\"
15710 20 69 6e 20 66 6f 72 65 69 67 6e 20 6b 65 79 20   in foreign key 
15720 64 65 66 69 6e 69 74 69 6f 6e 22 2c 20 0a 20 20  definition", .  
15730 20 20 20 20 20 20 20 20 70 46 72 6f 6d 43 6f 6c          pFromCol
15740 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20  ->a[i].zName);. 
15750 20 20 20 20 20 20 20 67 6f 74 6f 20 66 6b 5f 65         goto fk_e
15760 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  nd;.      }.    
15770 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 54 6f 43  }.  }.  if( pToC
15780 6f 6c 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d  ol ){.    for(i=
15790 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b  0; i<nCol; i++){
157a0 0a 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 73  .      int n = s
157b0 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70  qlite3Strlen30(p
157c0 54 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  ToCol->a[i].zNam
157d0 65 29 3b 0a 20 20 20 20 20 20 70 46 4b 65 79 2d  e);.      pFKey-
157e0 3e 61 43 6f 6c 5b 69 5d 2e 7a 43 6f 6c 20 3d 20  >aCol[i].zCol = 
157f0 7a 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  z;.      memcpy(
15800 7a 2c 20 70 54 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e  z, pToCol->a[i].
15810 7a 4e 61 6d 65 2c 20 6e 29 3b 0a 20 20 20 20 20  zName, n);.     
15820 20 7a 5b 6e 5d 20 3d 20 30 3b 0a 20 20 20 20 20   z[n] = 0;.     
15830 20 7a 20 2b 3d 20 6e 2b 31 3b 0a 20 20 20 20 7d   z += n+1;.    }
15840 0a 20 20 7d 0a 20 20 70 46 4b 65 79 2d 3e 69 73  .  }.  pFKey->is
15850 44 65 66 65 72 72 65 64 20 3d 20 30 3b 0a 20 20  Deferred = 0;.  
15860 70 46 4b 65 79 2d 3e 61 41 63 74 69 6f 6e 5b 30  pFKey->aAction[0
15870 5d 20 3d 20 28 75 38 29 28 66 6c 61 67 73 20 26  ] = (u8)(flags &
15880 20 30 78 66 66 29 3b 20 20 20 20 20 20 20 20 20   0xff);         
15890 20 20 20 2f 2a 20 4f 4e 20 44 45 4c 45 54 45 20     /* ON DELETE 
158a0 61 63 74 69 6f 6e 20 2a 2f 0a 20 20 70 46 4b 65  action */.  pFKe
158b0 79 2d 3e 61 41 63 74 69 6f 6e 5b 31 5d 20 3d 20  y->aAction[1] = 
158c0 28 75 38 29 28 28 66 6c 61 67 73 20 3e 3e 20 38  (u8)((flags >> 8
158d0 20 29 20 26 20 30 78 66 66 29 3b 20 20 20 20 2f   ) & 0xff);    /
158e0 2a 20 4f 4e 20 55 50 44 41 54 45 20 61 63 74 69  * ON UPDATE acti
158f0 6f 6e 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  on */..  assert(
15900 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75   sqlite3SchemaMu
15910 74 65 78 48 65 6c 64 28 64 62 2c 20 30 2c 20 70  texHeld(db, 0, p
15920 2d 3e 70 53 63 68 65 6d 61 29 20 29 3b 0a 20 20  ->pSchema) );.  
15930 70 4e 65 78 74 54 6f 20 3d 20 28 46 4b 65 79 20  pNextTo = (FKey 
15940 2a 29 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73  *)sqlite3HashIns
15950 65 72 74 28 26 70 2d 3e 70 53 63 68 65 6d 61 2d  ert(&p->pSchema-
15960 3e 66 6b 65 79 48 61 73 68 2c 20 0a 20 20 20 20  >fkeyHash, .    
15970 20 20 70 46 4b 65 79 2d 3e 7a 54 6f 2c 20 28 76    pFKey->zTo, (v
15980 6f 69 64 20 2a 29 70 46 4b 65 79 0a 20 20 29 3b  oid *)pFKey.  );
15990 0a 20 20 69 66 28 20 70 4e 65 78 74 54 6f 3d 3d  .  if( pNextTo==
159a0 70 46 4b 65 79 20 29 7b 0a 20 20 20 20 73 71 6c  pFKey ){.    sql
159b0 69 74 65 33 4f 6f 6d 46 61 75 6c 74 28 64 62 29  ite3OomFault(db)
159c0 3b 0a 20 20 20 20 67 6f 74 6f 20 66 6b 5f 65 6e  ;.    goto fk_en
159d0 64 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 4e 65  d;.  }.  if( pNe
159e0 78 74 54 6f 20 29 7b 0a 20 20 20 20 61 73 73 65  xtTo ){.    asse
159f0 72 74 28 20 70 4e 65 78 74 54 6f 2d 3e 70 50 72  rt( pNextTo->pPr
15a00 65 76 54 6f 3d 3d 30 20 29 3b 0a 20 20 20 20 70  evTo==0 );.    p
15a10 46 4b 65 79 2d 3e 70 4e 65 78 74 54 6f 20 3d 20  FKey->pNextTo = 
15a20 70 4e 65 78 74 54 6f 3b 0a 20 20 20 20 70 4e 65  pNextTo;.    pNe
15a30 78 74 54 6f 2d 3e 70 50 72 65 76 54 6f 20 3d 20  xtTo->pPrevTo = 
15a40 70 46 4b 65 79 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  pFKey;.  }..  /*
15a50 20 4c 69 6e 6b 20 74 68 65 20 66 6f 72 65 69 67   Link the foreig
15a60 6e 20 6b 65 79 20 74 6f 20 74 68 65 20 74 61 62  n key to the tab
15a70 6c 65 20 61 73 20 74 68 65 20 6c 61 73 74 20 73  le as the last s
15a80 74 65 70 2e 0a 20 20 2a 2f 0a 20 20 70 2d 3e 70  tep..  */.  p->p
15a90 46 4b 65 79 20 3d 20 70 46 4b 65 79 3b 0a 20 20  FKey = pFKey;.  
15aa0 70 46 4b 65 79 20 3d 20 30 3b 0a 0a 66 6b 5f 65  pFKey = 0;..fk_e
15ab0 6e 64 3a 0a 20 20 73 71 6c 69 74 65 33 44 62 46  nd:.  sqlite3DbF
15ac0 72 65 65 28 64 62 2c 20 70 46 4b 65 79 29 3b 0a  ree(db, pFKey);.
15ad0 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e  #endif /* !defin
15ae0 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46  ed(SQLITE_OMIT_F
15af0 4f 52 45 49 47 4e 5f 4b 45 59 29 20 2a 2f 0a 20  OREIGN_KEY) */. 
15b00 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
15b10 44 65 6c 65 74 65 28 64 62 2c 20 70 46 72 6f 6d  Delete(db, pFrom
15b20 43 6f 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33 45  Col);.  sqlite3E
15b30 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62  xprListDelete(db
15b40 2c 20 70 54 6f 43 6f 6c 29 3b 0a 7d 0a 0a 2f 2a  , pToCol);.}../*
15b50 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
15b60 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20   is called when 
15b70 61 6e 20 49 4e 49 54 49 41 4c 4c 59 20 49 4d 4d  an INITIALLY IMM
15b80 45 44 49 41 54 45 20 6f 72 20 49 4e 49 54 49 41  EDIATE or INITIA
15b90 4c 4c 59 20 44 45 46 45 52 52 45 44 0a 2a 2a 20  LLY DEFERRED.** 
15ba0 63 6c 61 75 73 65 20 69 73 20 73 65 65 6e 20 61  clause is seen a
15bb0 73 20 70 61 72 74 20 6f 66 20 61 20 66 6f 72 65  s part of a fore
15bc0 69 67 6e 20 6b 65 79 20 64 65 66 69 6e 69 74 69  ign key definiti
15bd0 6f 6e 2e 20 20 54 68 65 20 69 73 44 65 66 65 72  on.  The isDefer
15be0 72 65 64 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72  red.** parameter
15bf0 20 69 73 20 31 20 66 6f 72 20 49 4e 49 54 49 41   is 1 for INITIA
15c00 4c 4c 59 20 44 45 46 45 52 52 45 44 20 61 6e 64  LLY DEFERRED and
15c10 20 30 20 66 6f 72 20 49 4e 49 54 49 41 4c 4c 59   0 for INITIALLY
15c20 20 49 4d 4d 45 44 49 41 54 45 2e 0a 2a 2a 20 54   IMMEDIATE..** T
15c30 68 65 20 62 65 68 61 76 69 6f 72 20 6f 66 20 74  he behavior of t
15c40 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79  he most recently
15c50 20 63 72 65 61 74 65 64 20 66 6f 72 65 69 67 6e   created foreign
15c60 20 6b 65 79 20 69 73 20 61 64 6a 75 73 74 65 64   key is adjusted
15c70 0a 2a 2a 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e  .** accordingly.
15c80 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
15c90 44 65 66 65 72 46 6f 72 65 69 67 6e 4b 65 79 28  DeferForeignKey(
15ca0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69  Parse *pParse, i
15cb0 6e 74 20 69 73 44 65 66 65 72 72 65 64 29 7b 0a  nt isDeferred){.
15cc0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
15cd0 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 0a  MIT_FOREIGN_KEY.
15ce0 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20    Table *pTab;. 
15cf0 20 46 4b 65 79 20 2a 70 46 4b 65 79 3b 0a 20 20   FKey *pFKey;.  
15d00 69 66 28 20 28 70 54 61 62 20 3d 20 70 50 61 72  if( (pTab = pPar
15d10 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3d 3d  se->pNewTable)==
15d20 30 20 7c 7c 20 28 70 46 4b 65 79 20 3d 20 70 54  0 || (pFKey = pT
15d30 61 62 2d 3e 70 46 4b 65 79 29 3d 3d 30 20 29 20  ab->pFKey)==0 ) 
15d40 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74  return;.  assert
15d50 28 20 69 73 44 65 66 65 72 72 65 64 3d 3d 30 20  ( isDeferred==0 
15d60 7c 7c 20 69 73 44 65 66 65 72 72 65 64 3d 3d 31  || isDeferred==1
15d70 20 29 3b 20 2f 2a 20 45 56 3a 20 52 2d 33 30 33   ); /* EV: R-303
15d80 32 33 2d 32 31 39 31 37 20 2a 2f 0a 20 20 70 46  23-21917 */.  pF
15d90 4b 65 79 2d 3e 69 73 44 65 66 65 72 72 65 64 20  Key->isDeferred 
15da0 3d 20 28 75 38 29 69 73 44 65 66 65 72 72 65 64  = (u8)isDeferred
15db0 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a  ;.#endif.}../*.*
15dc0 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
15dd0 74 68 61 74 20 77 69 6c 6c 20 65 72 61 73 65 20  that will erase 
15de0 61 6e 64 20 72 65 66 69 6c 6c 20 69 6e 64 65 78  and refill index
15df0 20 2a 70 49 64 78 2e 20 20 54 68 69 73 20 69 73   *pIdx.  This is
15e00 0a 2a 2a 20 75 73 65 64 20 74 6f 20 69 6e 69 74  .** used to init
15e10 69 61 6c 69 7a 65 20 61 20 6e 65 77 6c 79 20 63  ialize a newly c
15e20 72 65 61 74 65 64 20 69 6e 64 65 78 20 6f 72 20  reated index or 
15e30 74 6f 20 72 65 63 6f 6d 70 75 74 65 20 74 68 65  to recompute the
15e40 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61  .** content of a
15e50 6e 20 69 6e 64 65 78 20 69 6e 20 72 65 73 70 6f  n index in respo
15e60 6e 73 65 20 74 6f 20 61 20 52 45 49 4e 44 45 58  nse to a REINDEX
15e70 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20   command..**.** 
15e80 69 66 20 6d 65 6d 52 6f 6f 74 50 61 67 65 20 69  if memRootPage i
15e90 73 20 6e 6f 74 20 6e 65 67 61 74 69 76 65 2c 20  s not negative, 
15ea0 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68  it means that th
15eb0 65 20 69 6e 64 65 78 20 69 73 20 6e 65 77 6c 79  e index is newly
15ec0 0a 2a 2a 20 63 72 65 61 74 65 64 2e 20 20 54 68  .** created.  Th
15ed0 65 20 72 65 67 69 73 74 65 72 20 73 70 65 63 69  e register speci
15ee0 66 69 65 64 20 62 79 20 6d 65 6d 52 6f 6f 74 50  fied by memRootP
15ef0 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  age contains the
15f00 0a 2a 2a 20 72 6f 6f 74 20 70 61 67 65 20 6e 75  .** root page nu
15f10 6d 62 65 72 20 6f 66 20 74 68 65 20 69 6e 64 65  mber of the inde
15f20 78 2e 20 20 49 66 20 6d 65 6d 52 6f 6f 74 50 61  x.  If memRootPa
15f30 67 65 20 69 73 20 6e 65 67 61 74 69 76 65 2c 20  ge is negative, 
15f40 74 68 65 6e 0a 2a 2a 20 74 68 65 20 69 6e 64 65  then.** the inde
15f50 78 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73  x already exists
15f60 20 61 6e 64 20 6d 75 73 74 20 62 65 20 63 6c 65   and must be cle
15f70 61 72 65 64 20 62 65 66 6f 72 65 20 62 65 69 6e  ared before bein
15f80 67 20 72 65 66 69 6c 6c 65 64 20 61 6e 64 0a 2a  g refilled and.*
15f90 2a 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20  * the root page 
15fa0 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 69 6e  number of the in
15fb0 64 65 78 20 69 73 20 74 61 6b 65 6e 20 66 72 6f  dex is taken fro
15fc0 6d 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 2e 0a  m pIndex->tnum..
15fd0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
15fe0 71 6c 69 74 65 33 52 65 66 69 6c 6c 49 6e 64 65  qlite3RefillInde
15ff0 78 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  x(Parse *pParse,
16000 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 2c 20   Index *pIndex, 
16010 69 6e 74 20 6d 65 6d 52 6f 6f 74 50 61 67 65 29  int memRootPage)
16020 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20  {.  Table *pTab 
16030 3d 20 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65  = pIndex->pTable
16040 3b 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20  ;  /* The table 
16050 74 68 61 74 20 69 73 20 69 6e 64 65 78 65 64 20  that is indexed 
16060 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 20 3d 20  */.  int iTab = 
16070 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 20  pParse->nTab++; 
16080 20 20 20 20 2f 2a 20 42 74 72 65 65 20 63 75 72      /* Btree cur
16090 73 6f 72 20 75 73 65 64 20 66 6f 72 20 70 54 61  sor used for pTa
160a0 62 20 2a 2f 0a 20 20 69 6e 74 20 69 49 64 78 20  b */.  int iIdx 
160b0 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b  = pParse->nTab++
160c0 3b 20 20 20 20 20 2f 2a 20 42 74 72 65 65 20 63  ;     /* Btree c
160d0 75 72 73 6f 72 20 75 73 65 64 20 66 6f 72 20 70  ursor used for p
160e0 49 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 69  Index */.  int i
160f0 53 6f 72 74 65 72 3b 20 20 20 20 20 20 20 20 20  Sorter;         
16100 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
16110 73 6f 72 20 6f 70 65 6e 65 64 20 62 79 20 4f 70  sor opened by Op
16120 65 6e 53 6f 72 74 65 72 20 28 69 66 20 69 6e 20  enSorter (if in 
16130 75 73 65 29 20 2a 2f 0a 20 20 69 6e 74 20 61 64  use) */.  int ad
16140 64 72 31 3b 20 20 20 20 20 20 20 20 20 20 20 20  dr1;            
16150 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72           /* Addr
16160 65 73 73 20 6f 66 20 74 6f 70 20 6f 66 20 6c 6f  ess of top of lo
16170 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72  op */.  int addr
16180 32 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  2;              
16190 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
161a0 73 20 74 6f 20 6a 75 6d 70 20 74 6f 20 66 6f 72  s to jump to for
161b0 20 6e 65 78 74 20 69 74 65 72 61 74 69 6f 6e 20   next iteration 
161c0 2a 2f 0a 20 20 69 6e 74 20 74 6e 75 6d 3b 20 20  */.  int tnum;  
161d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
161e0 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65      /* Root page
161f0 20 6f 66 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69   of index */.  i
16200 6e 74 20 69 50 61 72 74 49 64 78 4c 61 62 65 6c  nt iPartIdxLabel
16210 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
16220 20 4a 75 6d 70 20 74 6f 20 74 68 69 73 20 6c 61   Jump to this la
16230 62 65 6c 20 74 6f 20 73 6b 69 70 20 61 20 72 6f  bel to skip a ro
16240 77 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20  w */.  Vdbe *v; 
16250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16260 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74        /* Generat
16270 65 20 63 6f 64 65 20 69 6e 74 6f 20 74 68 69 73  e code into this
16280 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65   virtual machine
16290 20 2a 2f 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70   */.  KeyInfo *p
162a0 4b 65 79 3b 20 20 20 20 20 20 20 20 20 20 20 20  Key;            
162b0 20 20 20 20 20 2f 2a 20 4b 65 79 49 6e 66 6f 20       /* KeyInfo 
162c0 66 6f 72 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69  for index */.  i
162d0 6e 74 20 72 65 67 52 65 63 6f 72 64 3b 20 20 20  nt regRecord;   
162e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
162f0 20 52 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e   Register holdin
16300 67 20 61 73 73 65 6d 62 6c 65 64 20 69 6e 64 65  g assembled inde
16310 78 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 73 71  x record */.  sq
16320 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
16330 73 65 2d 3e 64 62 3b 20 20 20 20 20 20 2f 2a 20  se->db;      /* 
16340 54 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e  The database con
16350 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74  nection */.  int
16360 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63   iDb = sqlite3Sc
16370 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20  hemaToIndex(db, 
16380 70 49 6e 64 65 78 2d 3e 70 53 63 68 65 6d 61 29  pIndex->pSchema)
16390 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ;..#ifndef SQLIT
163a0 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41  E_OMIT_AUTHORIZA
163b0 54 49 4f 4e 0a 20 20 69 66 28 20 73 71 6c 69 74  TION.  if( sqlit
163c0 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72  e3AuthCheck(pPar
163d0 73 65 2c 20 53 51 4c 49 54 45 5f 52 45 49 4e 44  se, SQLITE_REIND
163e0 45 58 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d  EX, pIndex->zNam
163f0 65 2c 20 30 2c 0a 20 20 20 20 20 20 64 62 2d 3e  e, 0,.      db->
16400 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 20 29  aDb[iDb].zName )
16410 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a   ){.    return;.
16420 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a    }.#endif..  /*
16430 20 52 65 71 75 69 72 65 20 61 20 77 72 69 74 65   Require a write
16440 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 74 61 62  -lock on the tab
16450 6c 65 20 74 6f 20 70 65 72 66 6f 72 6d 20 74 68  le to perform th
16460 69 73 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a  is operation */.
16470 20 20 73 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f    sqlite3TableLo
16480 63 6b 28 70 50 61 72 73 65 2c 20 69 44 62 2c 20  ck(pParse, iDb, 
16490 70 54 61 62 2d 3e 74 6e 75 6d 2c 20 31 2c 20 70  pTab->tnum, 1, p
164a0 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 0a 20 20  Tab->zName);..  
164b0 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
164c0 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66  be(pParse);.  if
164d0 28 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ( v==0 ) return;
164e0 0a 20 20 69 66 28 20 6d 65 6d 52 6f 6f 74 50 61  .  if( memRootPa
164f0 67 65 3e 3d 30 20 29 7b 0a 20 20 20 20 74 6e 75  ge>=0 ){.    tnu
16500 6d 20 3d 20 6d 65 6d 52 6f 6f 74 50 61 67 65 3b  m = memRootPage;
16510 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 74 6e  .  }else{.    tn
16520 75 6d 20 3d 20 70 49 6e 64 65 78 2d 3e 74 6e 75  um = pIndex->tnu
16530 6d 3b 0a 20 20 7d 0a 20 20 70 4b 65 79 20 3d 20  m;.  }.  pKey = 
16540 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 4f 66  sqlite3KeyInfoOf
16550 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70 49  Index(pParse, pI
16560 6e 64 65 78 29 3b 0a 20 20 61 73 73 65 72 74 28  ndex);.  assert(
16570 20 70 4b 65 79 21 3d 30 20 7c 7c 20 64 62 2d 3e   pKey!=0 || db->
16580 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20  mallocFailed || 
16590 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 3b 0a  pParse->nErr );.
165a0 0a 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 73  .  /* Open the s
165b0 6f 72 74 65 72 20 63 75 72 73 6f 72 20 69 66 20  orter cursor if 
165c0 77 65 20 61 72 65 20 74 6f 20 75 73 65 20 6f 6e  we are to use on
165d0 65 2e 20 2a 2f 0a 20 20 69 53 6f 72 74 65 72 20  e. */.  iSorter 
165e0 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b  = pParse->nTab++
165f0 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
16600 64 64 4f 70 34 28 76 2c 20 4f 50 5f 53 6f 72 74  ddOp4(v, OP_Sort
16610 65 72 4f 70 65 6e 2c 20 69 53 6f 72 74 65 72 2c  erOpen, iSorter,
16620 20 30 2c 20 70 49 6e 64 65 78 2d 3e 6e 4b 65 79   0, pIndex->nKey
16630 43 6f 6c 2c 20 28 63 68 61 72 2a 29 0a 20 20 20  Col, (char*).   
16640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16650 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 52   sqlite3KeyInfoR
16660 65 66 28 70 4b 65 79 29 2c 20 50 34 5f 4b 45 59  ef(pKey), P4_KEY
16670 49 4e 46 4f 29 3b 0a 0a 20 20 2f 2a 20 4f 70 65  INFO);..  /* Ope
16680 6e 20 74 68 65 20 74 61 62 6c 65 2e 20 4c 6f 6f  n the table. Loo
16690 70 20 74 68 72 6f 75 67 68 20 61 6c 6c 20 72 6f  p through all ro
166a0 77 73 20 6f 66 20 74 68 65 20 74 61 62 6c 65 2c  ws of the table,
166b0 20 69 6e 73 65 72 74 69 6e 67 20 69 6e 64 65 78   inserting index
166c0 0a 20 20 2a 2a 20 72 65 63 6f 72 64 73 20 69 6e  .  ** records in
166d0 74 6f 20 74 68 65 20 73 6f 72 74 65 72 2e 20 2a  to the sorter. *
166e0 2f 0a 20 20 73 71 6c 69 74 65 33 4f 70 65 6e 54  /.  sqlite3OpenT
166f0 61 62 6c 65 28 70 50 61 72 73 65 2c 20 69 54 61  able(pParse, iTa
16700 62 2c 20 69 44 62 2c 20 70 54 61 62 2c 20 4f 50  b, iDb, pTab, OP
16710 5f 4f 70 65 6e 52 65 61 64 29 3b 0a 20 20 61 64  _OpenRead);.  ad
16720 64 72 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62  dr1 = sqlite3Vdb
16730 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65  eAddOp2(v, OP_Re
16740 77 69 6e 64 2c 20 69 54 61 62 2c 20 30 29 3b 20  wind, iTab, 0); 
16750 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
16760 0a 20 20 72 65 67 52 65 63 6f 72 64 20 3d 20 73  .  regRecord = s
16770 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
16780 28 70 50 61 72 73 65 29 3b 0a 0a 20 20 73 71 6c  (pParse);..  sql
16790 69 74 65 33 47 65 6e 65 72 61 74 65 49 6e 64 65  ite3GenerateInde
167a0 78 4b 65 79 28 70 50 61 72 73 65 2c 70 49 6e 64  xKey(pParse,pInd
167b0 65 78 2c 69 54 61 62 2c 72 65 67 52 65 63 6f 72  ex,iTab,regRecor
167c0 64 2c 30 2c 26 69 50 61 72 74 49 64 78 4c 61 62  d,0,&iPartIdxLab
167d0 65 6c 2c 30 2c 30 29 3b 0a 20 20 73 71 6c 69 74  el,0,0);.  sqlit
167e0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
167f0 4f 50 5f 53 6f 72 74 65 72 49 6e 73 65 72 74 2c  OP_SorterInsert,
16800 20 69 53 6f 72 74 65 72 2c 20 72 65 67 52 65 63   iSorter, regRec
16810 6f 72 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 52  ord);.  sqlite3R
16820 65 73 6f 6c 76 65 50 61 72 74 49 64 78 4c 61 62  esolvePartIdxLab
16830 65 6c 28 70 50 61 72 73 65 2c 20 69 50 61 72 74  el(pParse, iPart
16840 49 64 78 4c 61 62 65 6c 29 3b 0a 20 20 73 71 6c  IdxLabel);.  sql
16850 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
16860 2c 20 4f 50 5f 4e 65 78 74 2c 20 69 54 61 62 2c  , OP_Next, iTab,
16870 20 61 64 64 72 31 2b 31 29 3b 20 56 64 62 65 43   addr1+1); VdbeC
16880 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 73 71  overage(v);.  sq
16890 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
168a0 65 28 76 2c 20 61 64 64 72 31 29 3b 0a 20 20 69  e(v, addr1);.  i
168b0 66 28 20 6d 65 6d 52 6f 6f 74 50 61 67 65 3c 30  f( memRootPage<0
168c0 20 29 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   ) sqlite3VdbeAd
168d0 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6c 65 61 72  dOp2(v, OP_Clear
168e0 2c 20 74 6e 75 6d 2c 20 69 44 62 29 3b 0a 20 20  , tnum, iDb);.  
168f0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
16900 34 28 76 2c 20 4f 50 5f 4f 70 65 6e 57 72 69 74  4(v, OP_OpenWrit
16910 65 2c 20 69 49 64 78 2c 20 74 6e 75 6d 2c 20 69  e, iIdx, tnum, i
16920 44 62 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  Db, .           
16930 20 20 20 20 20 20 20 20 20 28 63 68 61 72 20 2a           (char *
16940 29 70 4b 65 79 2c 20 50 34 5f 4b 45 59 49 4e 46  )pKey, P4_KEYINF
16950 4f 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  O);.  sqlite3Vdb
16960 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46  eChangeP5(v, OPF
16970 4c 41 47 5f 42 55 4c 4b 43 53 52 7c 28 28 6d 65  LAG_BULKCSR|((me
16980 6d 52 6f 6f 74 50 61 67 65 3e 3d 30 29 3f 4f 50  mRootPage>=0)?OP
16990 46 4c 41 47 5f 50 32 49 53 52 45 47 3a 30 29 29  FLAG_P2ISREG:0))
169a0 3b 0a 0a 20 20 61 64 64 72 31 20 3d 20 73 71 6c  ;..  addr1 = sql
169b0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
169c0 2c 20 4f 50 5f 53 6f 72 74 65 72 53 6f 72 74 2c  , OP_SorterSort,
169d0 20 69 53 6f 72 74 65 72 2c 20 30 29 3b 20 56 64   iSorter, 0); Vd
169e0 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
169f0 20 69 66 28 20 49 73 55 6e 69 71 75 65 49 6e 64   if( IsUniqueInd
16a00 65 78 28 70 49 6e 64 65 78 29 20 29 7b 0a 20 20  ex(pIndex) ){.  
16a10 20 20 69 6e 74 20 6a 32 20 3d 20 73 71 6c 69 74    int j2 = sqlit
16a20 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
16a30 72 28 76 29 20 2b 20 33 3b 0a 20 20 20 20 73 71  r(v) + 3;.    sq
16a40 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c  lite3VdbeGoto(v,
16a50 20 6a 32 29 3b 0a 20 20 20 20 61 64 64 72 32 20   j2);.    addr2 
16a60 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
16a70 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20  rentAddr(v);.   
16a80 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
16a90 70 34 49 6e 74 28 76 2c 20 4f 50 5f 53 6f 72 74  p4Int(v, OP_Sort
16aa0 65 72 43 6f 6d 70 61 72 65 2c 20 69 53 6f 72 74  erCompare, iSort
16ab0 65 72 2c 20 6a 32 2c 20 72 65 67 52 65 63 6f 72  er, j2, regRecor
16ac0 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  d,.             
16ad0 20 20 20 20 20 20 20 20 20 20 20 20 70 49 6e 64              pInd
16ae0 65 78 2d 3e 6e 4b 65 79 43 6f 6c 29 3b 20 56 64  ex->nKeyCol); Vd
16af0 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
16b00 20 20 20 73 71 6c 69 74 65 33 55 6e 69 71 75 65     sqlite3Unique
16b10 43 6f 6e 73 74 72 61 69 6e 74 28 70 50 61 72 73  Constraint(pPars
16b20 65 2c 20 4f 45 5f 41 62 6f 72 74 2c 20 70 49 6e  e, OE_Abort, pIn
16b30 64 65 78 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  dex);.  }else{. 
16b40 20 20 20 61 64 64 72 32 20 3d 20 73 71 6c 69 74     addr2 = sqlit
16b50 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
16b60 72 28 76 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  r(v);.  }.  sqli
16b70 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
16b80 20 4f 50 5f 53 6f 72 74 65 72 44 61 74 61 2c 20   OP_SorterData, 
16b90 69 53 6f 72 74 65 72 2c 20 72 65 67 52 65 63 6f  iSorter, regReco
16ba0 72 64 2c 20 69 49 64 78 29 3b 0a 20 20 73 71 6c  rd, iIdx);.  sql
16bb0 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
16bc0 2c 20 4f 50 5f 4c 61 73 74 2c 20 69 49 64 78 2c  , OP_Last, iIdx,
16bd0 20 30 2c 20 2d 31 29 3b 0a 20 20 73 71 6c 69 74   0, -1);.  sqlit
16be0 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
16bf0 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 69 49  OP_IdxInsert, iI
16c00 64 78 2c 20 72 65 67 52 65 63 6f 72 64 2c 20 30  dx, regRecord, 0
16c10 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
16c20 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c  ChangeP5(v, OPFL
16c30 41 47 5f 55 53 45 53 45 45 4b 52 45 53 55 4c 54  AG_USESEEKRESULT
16c40 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65  );.  sqlite3Rele
16c50 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
16c60 65 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20  e, regRecord);. 
16c70 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
16c80 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 4e  p2(v, OP_SorterN
16c90 65 78 74 2c 20 69 53 6f 72 74 65 72 2c 20 61 64  ext, iSorter, ad
16ca0 64 72 32 29 3b 20 56 64 62 65 43 6f 76 65 72 61  dr2); VdbeCovera
16cb0 67 65 28 76 29 3b 0a 20 20 73 71 6c 69 74 65 33  ge(v);.  sqlite3
16cc0 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
16cd0 61 64 64 72 31 29 3b 0a 0a 20 20 73 71 6c 69 74  addr1);..  sqlit
16ce0 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
16cf0 4f 50 5f 43 6c 6f 73 65 2c 20 69 54 61 62 29 3b  OP_Close, iTab);
16d00 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
16d10 64 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65  dOp1(v, OP_Close
16d20 2c 20 69 49 64 78 29 3b 0a 20 20 73 71 6c 69 74  , iIdx);.  sqlit
16d30 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
16d40 4f 50 5f 43 6c 6f 73 65 2c 20 69 53 6f 72 74 65  OP_Close, iSorte
16d50 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c  r);.}../*.** All
16d60 6f 63 61 74 65 20 68 65 61 70 20 73 70 61 63 65  ocate heap space
16d70 20 74 6f 20 68 6f 6c 64 20 61 6e 20 49 6e 64 65   to hold an Inde
16d80 78 20 6f 62 6a 65 63 74 20 77 69 74 68 20 6e 43  x object with nC
16d90 6f 6c 20 63 6f 6c 75 6d 6e 73 2e 0a 2a 2a 0a 2a  ol columns..**.*
16da0 2a 20 49 6e 63 72 65 61 73 65 20 74 68 65 20 61  * Increase the a
16db0 6c 6c 6f 63 61 74 69 6f 6e 20 73 69 7a 65 20 74  llocation size t
16dc0 6f 20 70 72 6f 76 69 64 65 20 61 6e 20 65 78 74  o provide an ext
16dd0 72 61 20 6e 45 78 74 72 61 20 62 79 74 65 73 0a  ra nExtra bytes.
16de0 2a 2a 20 6f 66 20 38 2d 62 79 74 65 20 61 6c 69  ** of 8-byte ali
16df0 67 6e 65 64 20 73 70 61 63 65 20 61 66 74 65 72  gned space after
16e00 20 74 68 65 20 49 6e 64 65 78 20 6f 62 6a 65 63   the Index objec
16e10 74 20 61 6e 64 20 72 65 74 75 72 6e 20 61 0a 2a  t and return a.*
16e20 2a 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 69  * pointer to thi
16e30 73 20 65 78 74 72 61 20 73 70 61 63 65 20 69 6e  s extra space in
16e40 20 2a 70 70 45 78 74 72 61 2e 0a 2a 2f 0a 49 6e   *ppExtra..*/.In
16e50 64 65 78 20 2a 73 71 6c 69 74 65 33 41 6c 6c 6f  dex *sqlite3Allo
16e60 63 61 74 65 49 6e 64 65 78 4f 62 6a 65 63 74 28  cateIndexObject(
16e70 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  .  sqlite3 *db, 
16e80 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
16e90 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a  ase connection *
16ea0 2f 0a 20 20 69 31 36 20 6e 43 6f 6c 2c 20 20 20  /.  i16 nCol,   
16eb0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61           /* Tota
16ec0 6c 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75  l number of colu
16ed0 6d 6e 73 20 69 6e 20 74 68 65 20 69 6e 64 65 78  mns in the index
16ee0 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72 61   */.  int nExtra
16ef0 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75  ,          /* Nu
16f00 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66  mber of bytes of
16f10 20 65 78 74 72 61 20 73 70 61 63 65 20 74 6f 20   extra space to 
16f20 61 6c 6c 6f 63 20 2a 2f 0a 20 20 63 68 61 72 20  alloc */.  char 
16f30 2a 2a 70 70 45 78 74 72 61 20 20 20 20 20 20 20  **ppExtra       
16f40 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68  /* Pointer to th
16f50 65 20 22 65 78 74 72 61 22 20 73 70 61 63 65 20  e "extra" space 
16f60 2a 2f 0a 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70  */.){.  Index *p
16f70 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
16f80 41 6c 6c 6f 63 61 74 65 64 20 69 6e 64 65 78 20  Allocated index 
16f90 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20  object */.  int 
16fa0 6e 42 79 74 65 3b 20 20 20 20 20 20 20 20 20 20  nByte;          
16fb0 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 73 70 61   /* Bytes of spa
16fc0 63 65 20 66 6f 72 20 49 6e 64 65 78 20 6f 62 6a  ce for Index obj
16fd0 65 63 74 20 2b 20 61 72 72 61 79 73 20 2a 2f 0a  ect + arrays */.
16fe0 0a 20 20 6e 42 79 74 65 20 3d 20 52 4f 55 4e 44  .  nByte = ROUND
16ff0 38 28 73 69 7a 65 6f 66 28 49 6e 64 65 78 29 29  8(sizeof(Index))
17000 20 2b 20 20 20 20 20 20 20 20 20 20 20 20 20 20   +              
17010 2f 2a 20 49 6e 64 65 78 20 73 74 72 75 63 74 75  /* Index structu
17020 72 65 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  re  */.         
17030 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 63   ROUND8(sizeof(c
17040 68 61 72 2a 29 2a 6e 43 6f 6c 29 20 2b 20 20 20  har*)*nCol) +   
17050 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 2e 61        /* Index.a
17060 7a 43 6f 6c 6c 20 20 20 20 20 2a 2f 0a 20 20 20  zColl     */.   
17070 20 20 20 20 20 20 20 52 4f 55 4e 44 38 28 73 69         ROUND8(si
17080 7a 65 6f 66 28 4c 6f 67 45 73 74 29 2a 28 6e 43  zeof(LogEst)*(nC
17090 6f 6c 2b 31 29 20 2b 20 20 20 20 20 2f 2a 20 49  ol+1) +     /* I
170a0 6e 64 65 78 2e 61 69 52 6f 77 4c 6f 67 45 73 74  ndex.aiRowLogEst
170b0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20     */.          
170c0 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28 69 31         sizeof(i1
170d0 36 29 2a 6e 43 6f 6c 20 2b 20 20 20 20 20 20 20  6)*nCol +       
170e0 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 2e 61 69       /* Index.ai
170f0 43 6f 6c 75 6d 6e 20 20 20 2a 2f 0a 20 20 20 20  Column   */.    
17100 20 20 20 20 20 20 20 20 20 20 20 20 20 73 69 7a               siz
17110 65 6f 66 28 75 38 29 2a 6e 43 6f 6c 29 3b 20 20  eof(u8)*nCol);  
17120 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
17130 64 65 78 2e 61 53 6f 72 74 4f 72 64 65 72 20 2a  dex.aSortOrder *
17140 2f 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 44  /.  p = sqlite3D
17150 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20  bMallocZero(db, 
17160 6e 42 79 74 65 20 2b 20 6e 45 78 74 72 61 29 3b  nByte + nExtra);
17170 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20  .  if( p ){.    
17180 63 68 61 72 20 2a 70 45 78 74 72 61 20 3d 20 28  char *pExtra = (
17190 28 63 68 61 72 2a 29 70 29 2b 52 4f 55 4e 44 38  (char*)p)+ROUND8
171a0 28 73 69 7a 65 6f 66 28 49 6e 64 65 78 29 29 3b  (sizeof(Index));
171b0 0a 20 20 20 20 70 2d 3e 61 7a 43 6f 6c 6c 20 3d  .    p->azColl =
171c0 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 2a 29 70   (const char**)p
171d0 45 78 74 72 61 3b 20 70 45 78 74 72 61 20 2b 3d  Extra; pExtra +=
171e0 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 63   ROUND8(sizeof(c
171f0 68 61 72 2a 29 2a 6e 43 6f 6c 29 3b 0a 20 20 20  har*)*nCol);.   
17200 20 70 2d 3e 61 69 52 6f 77 4c 6f 67 45 73 74 20   p->aiRowLogEst 
17210 3d 20 28 4c 6f 67 45 73 74 2a 29 70 45 78 74 72  = (LogEst*)pExtr
17220 61 3b 20 70 45 78 74 72 61 20 2b 3d 20 73 69 7a  a; pExtra += siz
17230 65 6f 66 28 4c 6f 67 45 73 74 29 2a 28 6e 43 6f  eof(LogEst)*(nCo
17240 6c 2b 31 29 3b 0a 20 20 20 20 70 2d 3e 61 69 43  l+1);.    p->aiC
17250 6f 6c 75 6d 6e 20 3d 20 28 69 31 36 2a 29 70 45  olumn = (i16*)pE
17260 78 74 72 61 3b 20 20 20 20 20 20 20 70 45 78 74  xtra;       pExt
17270 72 61 20 2b 3d 20 73 69 7a 65 6f 66 28 69 31 36  ra += sizeof(i16
17280 29 2a 6e 43 6f 6c 3b 0a 20 20 20 20 70 2d 3e 61  )*nCol;.    p->a
17290 53 6f 72 74 4f 72 64 65 72 20 3d 20 28 75 38 2a  SortOrder = (u8*
172a0 29 70 45 78 74 72 61 3b 0a 20 20 20 20 70 2d 3e  )pExtra;.    p->
172b0 6e 43 6f 6c 75 6d 6e 20 3d 20 6e 43 6f 6c 3b 0a  nColumn = nCol;.
172c0 20 20 20 20 70 2d 3e 6e 4b 65 79 43 6f 6c 20 3d      p->nKeyCol =
172d0 20 6e 43 6f 6c 20 2d 20 31 3b 0a 20 20 20 20 2a   nCol - 1;.    *
172e0 70 70 45 78 74 72 61 20 3d 20 28 28 63 68 61 72  ppExtra = ((char
172f0 2a 29 70 29 20 2b 20 6e 42 79 74 65 3b 0a 20 20  *)p) + nByte;.  
17300 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a  }.  return p;.}.
17310 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20  ./*.** Create a 
17320 6e 65 77 20 69 6e 64 65 78 20 66 6f 72 20 61 6e  new index for an
17330 20 53 51 4c 20 74 61 62 6c 65 2e 20 20 70 4e 61   SQL table.  pNa
17340 6d 65 31 2e 70 4e 61 6d 65 32 20 69 73 20 74 68  me1.pName2 is th
17350 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 69 6e  e name of the in
17360 64 65 78 20 0a 2a 2a 20 61 6e 64 20 70 54 62 6c  dex .** and pTbl
17370 4c 69 73 74 20 69 73 20 74 68 65 20 6e 61 6d 65  List is the name
17380 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74 68   of the table th
17390 61 74 20 69 73 20 74 6f 20 62 65 20 69 6e 64 65  at is to be inde
173a0 78 65 64 2e 20 20 42 6f 74 68 20 77 69 6c 6c 20  xed.  Both will 
173b0 0a 2a 2a 20 62 65 20 4e 55 4c 4c 20 66 6f 72 20  .** be NULL for 
173c0 61 20 70 72 69 6d 61 72 79 20 6b 65 79 20 6f 72  a primary key or
173d0 20 61 6e 20 69 6e 64 65 78 20 74 68 61 74 20 69   an index that i
173e0 73 20 63 72 65 61 74 65 64 20 74 6f 20 73 61 74  s created to sat
173f0 69 73 66 79 20 61 0a 2a 2a 20 55 4e 49 51 55 45  isfy a.** UNIQUE
17400 20 63 6f 6e 73 74 72 61 69 6e 74 2e 20 20 49 66   constraint.  If
17410 20 70 54 61 62 6c 65 20 61 6e 64 20 70 49 6e 64   pTable and pInd
17420 65 78 20 61 72 65 20 4e 55 4c 4c 2c 20 75 73 65  ex are NULL, use
17430 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
17440 6c 65 0a 2a 2a 20 61 73 20 74 68 65 20 74 61 62  le.** as the tab
17450 6c 65 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64  le to be indexed
17460 2e 20 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54  .  pParse->pNewT
17470 61 62 6c 65 20 69 73 20 61 20 74 61 62 6c 65 20  able is a table 
17480 74 68 61 74 20 69 73 0a 2a 2a 20 63 75 72 72 65  that is.** curre
17490 6e 74 6c 79 20 62 65 69 6e 67 20 63 6f 6e 73 74  ntly being const
174a0 72 75 63 74 65 64 20 62 79 20 61 20 43 52 45 41  ructed by a CREA
174b0 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65  TE TABLE stateme
174c0 6e 74 2e 0a 2a 2a 0a 2a 2a 20 70 4c 69 73 74 20  nt..**.** pList 
174d0 69 73 20 61 20 6c 69 73 74 20 6f 66 20 63 6f 6c  is a list of col
174e0 75 6d 6e 73 20 74 6f 20 62 65 20 69 6e 64 65 78  umns to be index
174f0 65 64 2e 20 20 70 4c 69 73 74 20 77 69 6c 6c 20  ed.  pList will 
17500 62 65 20 4e 55 4c 4c 20 69 66 20 74 68 69 73 0a  be NULL if this.
17510 2a 2a 20 69 73 20 61 20 70 72 69 6d 61 72 79 20  ** is a primary 
17520 6b 65 79 20 6f 72 20 75 6e 69 71 75 65 2d 63 6f  key or unique-co
17530 6e 73 74 72 61 69 6e 74 20 6f 6e 20 74 68 65 20  nstraint on the 
17540 6d 6f 73 74 20 72 65 63 65 6e 74 20 63 6f 6c 75  most recent colu
17550 6d 6e 20 61 64 64 65 64 0a 2a 2a 20 74 6f 20 74  mn added.** to t
17560 68 65 20 74 61 62 6c 65 20 63 75 72 72 65 6e 74  he table current
17570 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75  ly under constru
17580 63 74 69 6f 6e 2e 20 20 0a 2a 2a 0a 2a 2a 20 49  ction.  .**.** I
17590 66 20 74 68 65 20 69 6e 64 65 78 20 69 73 20 63  f the index is c
175a0 72 65 61 74 65 64 20 73 75 63 63 65 73 73 66 75  reated successfu
175b0 6c 6c 79 2c 20 72 65 74 75 72 6e 20 61 20 70 6f  lly, return a po
175c0 69 6e 74 65 72 20 74 6f 20 74 68 65 20 6e 65 77  inter to the new
175d0 20 49 6e 64 65 78 0a 2a 2a 20 73 74 72 75 63 74   Index.** struct
175e0 75 72 65 2e 20 54 68 69 73 20 69 73 20 75 73 65  ure. This is use
175f0 64 20 62 79 20 73 71 6c 69 74 65 33 41 64 64 50  d by sqlite3AddP
17600 72 69 6d 61 72 79 4b 65 79 28 29 20 74 6f 20 6d  rimaryKey() to m
17610 61 72 6b 20 74 68 65 20 69 6e 64 65 78 0a 2a 2a  ark the index.**
17620 20 61 73 20 74 68 65 20 74 61 62 6c 65 73 20 70   as the tables p
17630 72 69 6d 61 72 79 20 6b 65 79 20 28 49 6e 64 65  rimary key (Inde
17640 78 2e 69 64 78 54 79 70 65 3d 3d 53 51 4c 49 54  x.idxType==SQLIT
17650 45 5f 49 44 58 54 59 50 45 5f 50 52 49 4d 41 52  E_IDXTYPE_PRIMAR
17660 59 4b 45 59 29 0a 2a 2f 0a 49 6e 64 65 78 20 2a  YKEY).*/.Index *
17670 73 71 6c 69 74 65 33 43 72 65 61 74 65 49 6e 64  sqlite3CreateInd
17680 65 78 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ex(.  Parse *pPa
17690 72 73 65 2c 20 20 20 20 20 2f 2a 20 41 6c 6c 20  rse,     /* All 
176a0 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75  information abou
176b0 74 20 74 68 69 73 20 70 61 72 73 65 20 2a 2f 0a  t this parse */.
176c0 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c    Token *pName1,
176d0 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 70 61       /* First pa
176e0 72 74 20 6f 66 20 69 6e 64 65 78 20 6e 61 6d 65  rt of index name
176f0 2e 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f  . May be NULL */
17700 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32  .  Token *pName2
17710 2c 20 20 20 20 20 2f 2a 20 53 65 63 6f 6e 64 20  ,     /* Second 
17720 70 61 72 74 20 6f 66 20 69 6e 64 65 78 20 6e 61  part of index na
17730 6d 65 2e 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20  me. May be NULL 
17740 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54  */.  SrcList *pT
17750 62 6c 4e 61 6d 65 2c 20 2f 2a 20 54 61 62 6c 65  blName, /* Table
17760 20 74 6f 20 69 6e 64 65 78 2e 20 55 73 65 20 70   to index. Use p
17770 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
17780 20 69 66 20 30 20 2a 2f 0a 20 20 45 78 70 72 4c   if 0 */.  ExprL
17790 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 2f 2a  ist *pList,   /*
177a0 20 41 20 6c 69 73 74 20 6f 66 20 63 6f 6c 75 6d   A list of colum
177b0 6e 73 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64  ns to be indexed
177c0 20 2a 2f 0a 20 20 69 6e 74 20 6f 6e 45 72 72 6f   */.  int onErro
177d0 72 2c 20 20 20 20 20 20 20 2f 2a 20 4f 45 5f 41  r,       /* OE_A
177e0 62 6f 72 74 2c 20 4f 45 5f 49 67 6e 6f 72 65 2c  bort, OE_Ignore,
177f0 20 4f 45 5f 52 65 70 6c 61 63 65 2c 20 6f 72 20   OE_Replace, or 
17800 4f 45 5f 4e 6f 6e 65 20 2a 2f 0a 20 20 54 6f 6b  OE_None */.  Tok
17810 65 6e 20 2a 70 53 74 61 72 74 2c 20 20 20 20 20  en *pStart,     
17820 2f 2a 20 54 68 65 20 43 52 45 41 54 45 20 74 6f  /* The CREATE to
17830 6b 65 6e 20 74 68 61 74 20 62 65 67 69 6e 73 20  ken that begins 
17840 74 68 69 73 20 73 74 61 74 65 6d 65 6e 74 20 2a  this statement *
17850 2f 0a 20 20 45 78 70 72 20 2a 70 50 49 57 68 65  /.  Expr *pPIWhe
17860 72 65 2c 20 20 20 20 2f 2a 20 57 48 45 52 45 20  re,    /* WHERE 
17870 63 6c 61 75 73 65 20 66 6f 72 20 70 61 72 74 69  clause for parti
17880 61 6c 20 69 6e 64 69 63 65 73 20 2a 2f 0a 20 20  al indices */.  
17890 69 6e 74 20 73 6f 72 74 4f 72 64 65 72 2c 20 20  int sortOrder,  
178a0 20 20 20 2f 2a 20 53 6f 72 74 20 6f 72 64 65 72     /* Sort order
178b0 20 6f 66 20 70 72 69 6d 61 72 79 20 6b 65 79 20   of primary key 
178c0 77 68 65 6e 20 70 4c 69 73 74 3d 3d 4e 55 4c 4c  when pList==NULL
178d0 20 2a 2f 0a 20 20 69 6e 74 20 69 66 4e 6f 74 45   */.  int ifNotE
178e0 78 69 73 74 20 20 20 20 20 2f 2a 20 4f 6d 69 74  xist     /* Omit
178f0 20 65 72 72 6f 72 20 69 66 20 69 6e 64 65 78 20   error if index 
17900 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 20 2a  already exists *
17910 2f 0a 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 52  /.){.  Index *pR
17920 65 74 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 50  et = 0;     /* P
17930 6f 69 6e 74 65 72 20 74 6f 20 72 65 74 75 72 6e  ointer to return
17940 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61   */.  Table *pTa
17950 62 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 54 61  b = 0;     /* Ta
17960 62 6c 65 20 74 6f 20 62 65 20 69 6e 64 65 78 65  ble to be indexe
17970 64 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49  d */.  Index *pI
17980 6e 64 65 78 20 3d 20 30 3b 20 20 20 2f 2a 20 54  ndex = 0;   /* T
17990 68 65 20 69 6e 64 65 78 20 74 6f 20 62 65 20 63  he index to be c
179a0 72 65 61 74 65 64 20 2a 2f 0a 20 20 63 68 61 72  reated */.  char
179b0 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b 20 20 20 20   *zName = 0;    
179c0 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
179d0 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 6e  index */.  int n
179e0 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20  Name;           
179f0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 68 61  /* Number of cha
17a00 72 61 63 74 65 72 73 20 69 6e 20 7a 4e 61 6d 65  racters in zName
17a10 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a   */.  int i, j;.
17a20 20 20 44 62 46 69 78 65 72 20 73 46 69 78 3b 20    DbFixer sFix; 
17a30 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 61 73         /* For as
17a40 73 69 67 6e 69 6e 67 20 64 61 74 61 62 61 73 65  signing database
17a50 20 6e 61 6d 65 73 20 74 6f 20 70 54 61 62 6c 65   names to pTable
17a60 20 2a 2f 0a 20 20 69 6e 74 20 73 6f 72 74 4f 72   */.  int sortOr
17a70 64 65 72 4d 61 73 6b 3b 20 20 20 2f 2a 20 31 20  derMask;   /* 1 
17a80 74 6f 20 68 6f 6e 6f 72 20 44 45 53 43 20 69 6e  to honor DESC in
17a90 20 69 6e 64 65 78 2e 20 20 30 20 74 6f 20 69 67   index.  0 to ig
17aa0 6e 6f 72 65 2e 20 2a 2f 0a 20 20 73 71 6c 69 74  nore. */.  sqlit
17ab0 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
17ac0 3e 64 62 3b 0a 20 20 44 62 20 2a 70 44 62 3b 20  >db;.  Db *pDb; 
17ad0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
17ae0 68 65 20 73 70 65 63 69 66 69 63 20 74 61 62 6c  he specific tabl
17af0 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  e containing the
17b00 20 69 6e 64 65 78 65 64 20 64 61 74 61 62 61 73   indexed databas
17b10 65 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62 3b 20  e */.  int iDb; 
17b20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
17b30 6e 64 65 78 20 6f 66 20 74 68 65 20 64 61 74 61  ndex of the data
17b40 62 61 73 65 20 74 68 61 74 20 69 73 20 62 65 69  base that is bei
17b50 6e 67 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20  ng written */.  
17b60 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 20 3d 20 30  Token *pName = 0
17b70 3b 20 20 20 20 2f 2a 20 55 6e 71 75 61 6c 69 66  ;    /* Unqualif
17b80 69 65 64 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  ied name of the 
17b90 69 6e 64 65 78 20 74 6f 20 63 72 65 61 74 65 20  index to create 
17ba0 2a 2f 0a 20 20 73 74 72 75 63 74 20 45 78 70 72  */.  struct Expr
17bb0 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4c 69 73 74  List_item *pList
17bc0 49 74 65 6d 3b 20 2f 2a 20 46 6f 72 20 6c 6f 6f  Item; /* For loo
17bd0 70 69 6e 67 20 6f 76 65 72 20 70 4c 69 73 74 20  ping over pList 
17be0 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 20  */.  int nExtra 
17bf0 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
17c00 20 20 20 20 20 20 2f 2a 20 53 70 61 63 65 20 61        /* Space a
17c10 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 7a 45 78  llocated for zEx
17c20 74 72 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e  tra[] */.  int n
17c30 45 78 74 72 61 43 6f 6c 3b 20 20 20 20 20 20 20  ExtraCol;       
17c40 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
17c50 75 6d 62 65 72 20 6f 66 20 65 78 74 72 61 20 63  umber of extra c
17c60 6f 6c 75 6d 6e 73 20 6e 65 65 64 65 64 20 2a 2f  olumns needed */
17c70 0a 20 20 63 68 61 72 20 2a 7a 45 78 74 72 61 20  .  char *zExtra 
17c80 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
17c90 20 20 20 20 2f 2a 20 45 78 74 72 61 20 73 70 61      /* Extra spa
17ca0 63 65 20 61 66 74 65 72 20 74 68 65 20 49 6e 64  ce after the Ind
17cb0 65 78 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 49  ex object */.  I
17cc0 6e 64 65 78 20 2a 70 50 6b 20 3d 20 30 3b 20 20  ndex *pPk = 0;  
17cd0 20 20 20 20 2f 2a 20 50 52 49 4d 41 52 59 20 4b      /* PRIMARY K
17ce0 45 59 20 69 6e 64 65 78 20 66 6f 72 20 57 49 54  EY index for WIT
17cf0 48 4f 55 54 20 52 4f 57 49 44 20 74 61 62 6c 65  HOUT ROWID table
17d00 73 20 2a 2f 0a 0a 20 20 69 66 28 20 64 62 2d 3e  s */..  if( db->
17d10 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20  mallocFailed || 
17d20 49 4e 5f 44 45 43 4c 41 52 45 5f 56 54 41 42 20  IN_DECLARE_VTAB 
17d30 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3e  || pParse->nErr>
17d40 30 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78  0 ){.    goto ex
17d50 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
17d60 0a 20 20 7d 0a 20 20 69 66 28 20 53 51 4c 49 54  .  }.  if( SQLIT
17d70 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65 61  E_OK!=sqlite3Rea
17d80 64 53 63 68 65 6d 61 28 70 50 61 72 73 65 29 20  dSchema(pParse) 
17d90 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74  ){.    goto exit
17da0 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
17db0 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46 69   }..  /*.  ** Fi
17dc0 6e 64 20 74 68 65 20 74 61 62 6c 65 20 74 68 61  nd the table tha
17dd0 74 20 69 73 20 74 6f 20 62 65 20 69 6e 64 65 78  t is to be index
17de0 65 64 2e 20 20 52 65 74 75 72 6e 20 65 61 72 6c  ed.  Return earl
17df0 79 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a  y if not found..
17e00 20 20 2a 2f 0a 20 20 69 66 28 20 70 54 62 6c 4e    */.  if( pTblN
17e10 61 6d 65 21 3d 30 20 29 7b 0a 0a 20 20 20 20 2f  ame!=0 ){..    /
17e20 2a 20 55 73 65 20 74 68 65 20 74 77 6f 2d 70 61  * Use the two-pa
17e30 72 74 20 69 6e 64 65 78 20 6e 61 6d 65 20 74 6f  rt index name to
17e40 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20 64   determine the d
17e50 61 74 61 62 61 73 65 20 0a 20 20 20 20 2a 2a 20  atabase .    ** 
17e60 74 6f 20 73 65 61 72 63 68 20 66 6f 72 20 74 68  to search for th
17e70 65 20 74 61 62 6c 65 2e 20 27 46 69 78 27 20 74  e table. 'Fix' t
17e80 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 74 6f  he table name to
17e90 20 74 68 69 73 20 64 62 0a 20 20 20 20 2a 2a 20   this db.    ** 
17ea0 62 65 66 6f 72 65 20 6c 6f 6f 6b 69 6e 67 20 75  before looking u
17eb0 70 20 74 68 65 20 74 61 62 6c 65 2e 0a 20 20 20  p the table..   
17ec0 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
17ed0 70 4e 61 6d 65 31 20 26 26 20 70 4e 61 6d 65 32  pName1 && pName2
17ee0 20 29 3b 0a 20 20 20 20 69 44 62 20 3d 20 73 71   );.    iDb = sq
17ef0 6c 69 74 65 33 54 77 6f 50 61 72 74 4e 61 6d 65  lite3TwoPartName
17f00 28 70 50 61 72 73 65 2c 20 70 4e 61 6d 65 31 2c  (pParse, pName1,
17f10 20 70 4e 61 6d 65 32 2c 20 26 70 4e 61 6d 65 29   pName2, &pName)
17f20 3b 0a 20 20 20 20 69 66 28 20 69 44 62 3c 30 20  ;.    if( iDb<0 
17f30 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61  ) goto exit_crea
17f40 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 61 73  te_index;.    as
17f50 73 65 72 74 28 20 70 4e 61 6d 65 20 26 26 20 70  sert( pName && p
17f60 4e 61 6d 65 2d 3e 7a 20 29 3b 0a 0a 23 69 66 6e  Name->z );..#ifn
17f70 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
17f80 54 45 4d 50 44 42 0a 20 20 20 20 2f 2a 20 49 66  TEMPDB.    /* If
17f90 20 74 68 65 20 69 6e 64 65 78 20 6e 61 6d 65 20   the index name 
17fa0 77 61 73 20 75 6e 71 75 61 6c 69 66 69 65 64 2c  was unqualified,
17fb0 20 63 68 65 63 6b 20 69 66 20 74 68 65 20 74 61   check if the ta
17fc0 62 6c 65 0a 20 20 20 20 2a 2a 20 69 73 20 61 20  ble.    ** is a 
17fd0 74 65 6d 70 20 74 61 62 6c 65 2e 20 49 66 20 73  temp table. If s
17fe0 6f 2c 20 73 65 74 20 74 68 65 20 64 61 74 61 62  o, set the datab
17ff0 61 73 65 20 74 6f 20 31 2e 20 44 6f 20 6e 6f 74  ase to 1. Do not
18000 20 64 6f 20 74 68 69 73 0a 20 20 20 20 2a 2a 20   do this.    ** 
18010 69 66 20 69 6e 69 74 69 61 6c 69 73 69 6e 67 20  if initialising 
18020 61 20 64 61 74 61 62 61 73 65 20 73 63 68 65 6d  a database schem
18030 61 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  a..    */.    if
18040 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  ( !db->init.busy
18050 20 29 7b 0a 20 20 20 20 20 20 70 54 61 62 20 3d   ){.      pTab =
18060 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 4c   sqlite3SrcListL
18070 6f 6f 6b 75 70 28 70 50 61 72 73 65 2c 20 70 54  ookup(pParse, pT
18080 62 6c 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 69  blName);.      i
18090 66 28 20 70 4e 61 6d 65 32 2d 3e 6e 3d 3d 30 20  f( pName2->n==0 
180a0 26 26 20 70 54 61 62 20 26 26 20 70 54 61 62 2d  && pTab && pTab-
180b0 3e 70 53 63 68 65 6d 61 3d 3d 64 62 2d 3e 61 44  >pSchema==db->aD
180c0 62 5b 31 5d 2e 70 53 63 68 65 6d 61 20 29 7b 0a  b[1].pSchema ){.
180d0 20 20 20 20 20 20 20 20 69 44 62 20 3d 20 31 3b          iDb = 1;
180e0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23  .      }.    }.#
180f0 65 6e 64 69 66 0a 0a 20 20 20 20 73 71 6c 69 74  endif..    sqlit
18100 65 33 46 69 78 49 6e 69 74 28 26 73 46 69 78 2c  e3FixInit(&sFix,
18110 20 70 50 61 72 73 65 2c 20 69 44 62 2c 20 22 69   pParse, iDb, "i
18120 6e 64 65 78 22 2c 20 70 4e 61 6d 65 29 3b 0a 20  ndex", pName);. 
18130 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 46 69     if( sqlite3Fi
18140 78 53 72 63 4c 69 73 74 28 26 73 46 69 78 2c 20  xSrcList(&sFix, 
18150 70 54 62 6c 4e 61 6d 65 29 20 29 7b 0a 20 20 20  pTblName) ){.   
18160 20 20 20 2f 2a 20 42 65 63 61 75 73 65 20 74 68     /* Because th
18170 65 20 70 61 72 73 65 72 20 63 6f 6e 73 74 72 75  e parser constru
18180 63 74 73 20 70 54 62 6c 4e 61 6d 65 20 66 72 6f  cts pTblName fro
18190 6d 20 61 20 73 69 6e 67 6c 65 20 69 64 65 6e 74  m a single ident
181a0 69 66 69 65 72 2c 0a 20 20 20 20 20 20 2a 2a 20  ifier,.      ** 
181b0 73 71 6c 69 74 65 33 46 69 78 53 72 63 4c 69 73  sqlite3FixSrcLis
181c0 74 20 63 61 6e 20 6e 65 76 65 72 20 66 61 69 6c  t can never fail
181d0 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72  . */.      asser
181e0 74 28 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  t(0);.    }.    
181f0 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33 4c 6f  pTab = sqlite3Lo
18200 63 61 74 65 54 61 62 6c 65 49 74 65 6d 28 70 50  cateTableItem(pP
18210 61 72 73 65 2c 20 30 2c 20 26 70 54 62 6c 4e 61  arse, 0, &pTblNa
18220 6d 65 2d 3e 61 5b 30 5d 29 3b 0a 20 20 20 20 61  me->a[0]);.    a
18230 73 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f  ssert( db->mallo
18240 63 46 61 69 6c 65 64 3d 3d 30 20 7c 7c 20 70 54  cFailed==0 || pT
18250 61 62 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28  ab==0 );.    if(
18260 20 70 54 61 62 3d 3d 30 20 29 20 67 6f 74 6f 20   pTab==0 ) goto 
18270 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
18280 78 3b 0a 20 20 20 20 69 66 28 20 69 44 62 3d 3d  x;.    if( iDb==
18290 31 20 26 26 20 64 62 2d 3e 61 44 62 5b 69 44 62  1 && db->aDb[iDb
182a0 5d 2e 70 53 63 68 65 6d 61 21 3d 70 54 61 62 2d  ].pSchema!=pTab-
182b0 3e 70 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20  >pSchema ){.    
182c0 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
182d0 67 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20  g(pParse, .     
182e0 20 20 20 20 20 20 22 63 61 6e 6e 6f 74 20 63 72        "cannot cr
182f0 65 61 74 65 20 61 20 54 45 4d 50 20 69 6e 64 65  eate a TEMP inde
18300 78 20 6f 6e 20 6e 6f 6e 2d 54 45 4d 50 20 74 61  x on non-TEMP ta
18310 62 6c 65 20 5c 22 25 73 5c 22 22 2c 0a 20 20 20  ble \"%s\"",.   
18320 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e 7a 4e          pTab->zN
18330 61 6d 65 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f  ame);.      goto
18340 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
18350 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ex;.    }.    if
18360 28 20 21 48 61 73 52 6f 77 69 64 28 70 54 61 62  ( !HasRowid(pTab
18370 29 20 29 20 70 50 6b 20 3d 20 73 71 6c 69 74 65  ) ) pPk = sqlite
18380 33 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65 78  3PrimaryKeyIndex
18390 28 70 54 61 62 29 3b 0a 20 20 7d 65 6c 73 65 7b  (pTab);.  }else{
183a0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 61  .    assert( pNa
183b0 6d 65 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73  me==0 );.    ass
183c0 65 72 74 28 20 70 53 74 61 72 74 3d 3d 30 20 29  ert( pStart==0 )
183d0 3b 0a 20 20 20 20 70 54 61 62 20 3d 20 70 50 61  ;.    pTab = pPa
183e0 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a  rse->pNewTable;.
183f0 20 20 20 20 69 66 28 20 21 70 54 61 62 20 29 20      if( !pTab ) 
18400 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
18410 5f 69 6e 64 65 78 3b 0a 20 20 20 20 69 44 62 20  _index;.    iDb 
18420 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54  = sqlite3SchemaT
18430 6f 49 6e 64 65 78 28 64 62 2c 20 70 54 61 62 2d  oIndex(db, pTab-
18440 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 7d 0a 20  >pSchema);.  }. 
18450 20 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b   pDb = &db->aDb[
18460 69 44 62 5d 3b 0a 0a 20 20 61 73 73 65 72 74 28  iDb];..  assert(
18470 20 70 54 61 62 21 3d 30 20 29 3b 0a 20 20 61 73   pTab!=0 );.  as
18480 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 6e 45  sert( pParse->nE
18490 72 72 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 73  rr==0 );.  if( s
184a0 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28 70  qlite3StrNICmp(p
184b0 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 22 73 71 6c  Tab->zName, "sql
184c0 69 74 65 5f 22 2c 20 37 29 3d 3d 30 20 0a 20 20  ite_", 7)==0 .  
184d0 20 20 20 20 20 26 26 20 64 62 2d 3e 69 6e 69 74       && db->init
184e0 2e 62 75 73 79 3d 3d 30 0a 23 69 66 20 53 51 4c  .busy==0.#if SQL
184f0 49 54 45 5f 55 53 45 52 5f 41 55 54 48 45 4e 54  ITE_USER_AUTHENT
18500 49 43 41 54 49 4f 4e 0a 20 20 20 20 20 20 20 26  ICATION.       &
18510 26 20 73 71 6c 69 74 65 33 55 73 65 72 41 75 74  & sqlite3UserAut
18520 68 54 61 62 6c 65 28 70 54 61 62 2d 3e 7a 4e 61  hTable(pTab->zNa
18530 6d 65 29 3d 3d 30 0a 23 65 6e 64 69 66 0a 20 20  me)==0.#endif.  
18540 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 53       && sqlite3S
18550 74 72 4e 49 43 6d 70 28 26 70 54 61 62 2d 3e 7a  trNICmp(&pTab->z
18560 4e 61 6d 65 5b 37 5d 2c 22 61 6c 74 65 72 74 61  Name[7],"alterta
18570 62 5f 22 2c 39 29 21 3d 30 20 29 7b 0a 20 20 20  b_",9)!=0 ){.   
18580 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
18590 28 70 50 61 72 73 65 2c 20 22 74 61 62 6c 65 20  (pParse, "table 
185a0 25 73 20 6d 61 79 20 6e 6f 74 20 62 65 20 69 6e  %s may not be in
185b0 64 65 78 65 64 22 2c 20 70 54 61 62 2d 3e 7a 4e  dexed", pTab->zN
185c0 61 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65  ame);.    goto e
185d0 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
185e0 3b 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51  ;.  }.#ifndef SQ
185f0 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 20  LITE_OMIT_VIEW. 
18600 20 69 66 28 20 70 54 61 62 2d 3e 70 53 65 6c 65   if( pTab->pSele
18610 63 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ct ){.    sqlite
18620 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
18630 2c 20 22 76 69 65 77 73 20 6d 61 79 20 6e 6f 74  , "views may not
18640 20 62 65 20 69 6e 64 65 78 65 64 22 29 3b 0a 20   be indexed");. 
18650 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65     goto exit_cre
18660 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 23  ate_index;.  }.#
18670 65 6e 64 69 66 0a 23 69 66 6e 64 65 66 20 53 51  endif.#ifndef SQ
18680 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
18690 4c 54 41 42 4c 45 0a 20 20 69 66 28 20 49 73 56  LTABLE.  if( IsV
186a0 69 72 74 75 61 6c 28 70 54 61 62 29 20 29 7b 0a  irtual(pTab) ){.
186b0 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
186c0 4d 73 67 28 70 50 61 72 73 65 2c 20 22 76 69 72  Msg(pParse, "vir
186d0 74 75 61 6c 20 74 61 62 6c 65 73 20 6d 61 79 20  tual tables may 
186e0 6e 6f 74 20 62 65 20 69 6e 64 65 78 65 64 22 29  not be indexed")
186f0 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f  ;.    goto exit_
18700 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
18710 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 0a 20  }.#endif..  /*. 
18720 20 2a 2a 20 46 69 6e 64 20 74 68 65 20 6e 61 6d   ** Find the nam
18730 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e 20  e of the index. 
18740 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 72 65   Make sure there
18750 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20   is not already 
18760 61 6e 6f 74 68 65 72 0a 20 20 2a 2a 20 69 6e 64  another.  ** ind
18770 65 78 20 6f 72 20 74 61 62 6c 65 20 77 69 74 68  ex or table with
18780 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 2e 20   the same name. 
18790 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 78 63 65   .  **.  ** Exce
187a0 70 74 69 6f 6e 3a 20 20 49 66 20 77 65 20 61 72  ption:  If we ar
187b0 65 20 72 65 61 64 69 6e 67 20 74 68 65 20 6e 61  e reading the na
187c0 6d 65 73 20 6f 66 20 70 65 72 6d 61 6e 65 6e 74  mes of permanent
187d0 20 69 6e 64 69 63 65 73 20 66 72 6f 6d 20 74 68   indices from th
187e0 65 0a 20 20 2a 2a 20 73 71 6c 69 74 65 5f 6d 61  e.  ** sqlite_ma
187f0 73 74 65 72 20 74 61 62 6c 65 20 28 62 65 63 61  ster table (beca
18800 75 73 65 20 73 6f 6d 65 20 6f 74 68 65 72 20 70  use some other p
18810 72 6f 63 65 73 73 20 63 68 61 6e 67 65 64 20 74  rocess changed t
18820 68 65 20 73 63 68 65 6d 61 29 20 61 6e 64 0a 20  he schema) and. 
18830 20 2a 2a 20 6f 6e 65 20 6f 66 20 74 68 65 20 69   ** one of the i
18840 6e 64 65 78 20 6e 61 6d 65 73 20 63 6f 6c 6c 69  ndex names colli
18850 64 65 73 20 77 69 74 68 20 74 68 65 20 6e 61 6d  des with the nam
18860 65 20 6f 66 20 61 20 74 65 6d 70 6f 72 61 72 79  e of a temporary
18870 20 74 61 62 6c 65 20 6f 72 0a 20 20 2a 2a 20 69   table or.  ** i
18880 6e 64 65 78 2c 20 74 68 65 6e 20 77 65 20 77 69  ndex, then we wi
18890 6c 6c 20 63 6f 6e 74 69 6e 75 65 20 74 6f 20 70  ll continue to p
188a0 72 6f 63 65 73 73 20 74 68 69 73 20 69 6e 64 65  rocess this inde
188b0 78 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20  x..  **.  ** If 
188c0 70 4e 61 6d 65 3d 3d 30 20 69 74 20 6d 65 61 6e  pName==0 it mean
188d0 73 20 74 68 61 74 20 77 65 20 61 72 65 0a 20 20  s that we are.  
188e0 2a 2a 20 64 65 61 6c 69 6e 67 20 77 69 74 68 20  ** dealing with 
188f0 61 20 70 72 69 6d 61 72 79 20 6b 65 79 20 6f 72  a primary key or
18900 20 55 4e 49 51 55 45 20 63 6f 6e 73 74 72 61 69   UNIQUE constrai
18910 6e 74 2e 20 20 57 65 20 68 61 76 65 20 74 6f 20  nt.  We have to 
18920 69 6e 76 65 6e 74 20 6f 75 72 0a 20 20 2a 2a 20  invent our.  ** 
18930 6f 77 6e 20 6e 61 6d 65 2e 0a 20 20 2a 2f 0a 20  own name..  */. 
18940 20 69 66 28 20 70 4e 61 6d 65 20 29 7b 0a 20 20   if( pName ){.  
18950 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65    zName = sqlite
18960 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64  3NameFromToken(d
18970 62 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 20 20 69  b, pName);.    i
18980 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 20 67 6f  f( zName==0 ) go
18990 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
189a0 6e 64 65 78 3b 0a 20 20 20 20 61 73 73 65 72 74  ndex;.    assert
189b0 28 20 70 4e 61 6d 65 2d 3e 7a 21 3d 30 20 29 3b  ( pName->z!=0 );
189c0 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f  .    if( SQLITE_
189d0 4f 4b 21 3d 73 71 6c 69 74 65 33 43 68 65 63 6b  OK!=sqlite3Check
189e0 4f 62 6a 65 63 74 4e 61 6d 65 28 70 50 61 72 73  ObjectName(pPars
189f0 65 2c 20 7a 4e 61 6d 65 29 20 29 7b 0a 20 20 20  e, zName) ){.   
18a00 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65     goto exit_cre
18a10 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d  ate_index;.    }
18a20 0a 20 20 20 20 69 66 28 20 21 64 62 2d 3e 69 6e  .    if( !db->in
18a30 69 74 2e 62 75 73 79 20 29 7b 0a 20 20 20 20 20  it.busy ){.     
18a40 20 69 66 28 20 73 71 6c 69 74 65 33 46 69 6e 64   if( sqlite3Find
18a50 54 61 62 6c 65 28 64 62 2c 20 7a 4e 61 6d 65 2c  Table(db, zName,
18a60 20 30 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20   0)!=0 ){.      
18a70 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
18a80 67 28 70 50 61 72 73 65 2c 20 22 74 68 65 72 65  g(pParse, "there
18a90 20 69 73 20 61 6c 72 65 61 64 79 20 61 20 74 61   is already a ta
18aa0 62 6c 65 20 6e 61 6d 65 64 20 25 73 22 2c 20 7a  ble named %s", z
18ab0 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 67  Name);.        g
18ac0 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
18ad0 69 6e 64 65 78 3b 0a 20 20 20 20 20 20 7d 0a 20  index;.      }. 
18ae0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 71 6c     }.    if( sql
18af0 69 74 65 33 46 69 6e 64 49 6e 64 65 78 28 64 62  ite3FindIndex(db
18b00 2c 20 7a 4e 61 6d 65 2c 20 70 44 62 2d 3e 7a 4e  , zName, pDb->zN
18b10 61 6d 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  ame)!=0 ){.     
18b20 20 69 66 28 20 21 69 66 4e 6f 74 45 78 69 73 74   if( !ifNotExist
18b30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
18b40 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
18b50 73 65 2c 20 22 69 6e 64 65 78 20 25 73 20 61 6c  se, "index %s al
18b60 72 65 61 64 79 20 65 78 69 73 74 73 22 2c 20 7a  ready exists", z
18b70 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c  Name);.      }el
18b80 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65  se{.        asse
18b90 72 74 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75  rt( !db->init.bu
18ba0 73 79 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71  sy );.        sq
18bb0 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66 79 53  lite3CodeVerifyS
18bc0 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20 69 44  chema(pParse, iD
18bd0 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  b);.      }.    
18be0 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61    goto exit_crea
18bf0 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a  te_index;.    }.
18c00 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74    }else{.    int
18c10 20 6e 3b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70   n;.    Index *p
18c20 4c 6f 6f 70 3b 0a 20 20 20 20 66 6f 72 28 70 4c  Loop;.    for(pL
18c30 6f 6f 70 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78  oop=pTab->pIndex
18c40 2c 20 6e 3d 31 3b 20 70 4c 6f 6f 70 3b 20 70 4c  , n=1; pLoop; pL
18c50 6f 6f 70 3d 70 4c 6f 6f 70 2d 3e 70 4e 65 78 74  oop=pLoop->pNext
18c60 2c 20 6e 2b 2b 29 7b 7d 0a 20 20 20 20 7a 4e 61  , n++){}.    zNa
18c70 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69  me = sqlite3MPri
18c80 6e 74 66 28 64 62 2c 20 22 73 71 6c 69 74 65 5f  ntf(db, "sqlite_
18c90 61 75 74 6f 69 6e 64 65 78 5f 25 73 5f 25 64 22  autoindex_%s_%d"
18ca0 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 6e  , pTab->zName, n
18cb0 29 3b 0a 20 20 20 20 69 66 28 20 7a 4e 61 6d 65  );.    if( zName
18cc0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  ==0 ){.      got
18cd0 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
18ce0 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  dex;.    }.  }..
18cf0 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 61    /* Check for a
18d00 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20 74 6f 20  uthorization to 
18d10 63 72 65 61 74 65 20 61 6e 20 69 6e 64 65 78 2e  create an index.
18d20 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  .  */.#ifndef SQ
18d30 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52  LITE_OMIT_AUTHOR
18d40 49 5a 41 54 49 4f 4e 0a 20 20 7b 0a 20 20 20 20  IZATION.  {.    
18d50 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 20  const char *zDb 
18d60 3d 20 70 44 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20  = pDb->zName;.  
18d70 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74    if( sqlite3Aut
18d80 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53  hCheck(pParse, S
18d90 51 4c 49 54 45 5f 49 4e 53 45 52 54 2c 20 53 43  QLITE_INSERT, SC
18da0 48 45 4d 41 5f 54 41 42 4c 45 28 69 44 62 29 2c  HEMA_TABLE(iDb),
18db0 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20   0, zDb) ){.    
18dc0 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61    goto exit_crea
18dd0 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a  te_index;.    }.
18de0 20 20 20 20 69 20 3d 20 53 51 4c 49 54 45 5f 43      i = SQLITE_C
18df0 52 45 41 54 45 5f 49 4e 44 45 58 3b 0a 20 20 20  REATE_INDEX;.   
18e00 20 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44   if( !OMIT_TEMPD
18e10 42 20 26 26 20 69 44 62 3d 3d 31 20 29 20 69 20  B && iDb==1 ) i 
18e20 3d 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f  = SQLITE_CREATE_
18e30 54 45 4d 50 5f 49 4e 44 45 58 3b 0a 20 20 20 20  TEMP_INDEX;.    
18e40 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43  if( sqlite3AuthC
18e50 68 65 63 6b 28 70 50 61 72 73 65 2c 20 69 2c 20  heck(pParse, i, 
18e60 7a 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 7a 4e 61  zName, pTab->zNa
18e70 6d 65 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20  me, zDb) ){.    
18e80 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61    goto exit_crea
18e90 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a  te_index;.    }.
18ea0 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a    }.#endif..  /*
18eb0 20 49 66 20 70 4c 69 73 74 3d 3d 30 2c 20 69 74   If pList==0, it
18ec0 20 6d 65 61 6e 73 20 74 68 69 73 20 72 6f 75 74   means this rout
18ed0 69 6e 65 20 77 61 73 20 63 61 6c 6c 65 64 20 74  ine was called t
18ee0 6f 20 6d 61 6b 65 20 61 20 70 72 69 6d 61 72 79  o make a primary
18ef0 0a 20 20 2a 2a 20 6b 65 79 20 6f 75 74 20 6f 66  .  ** key out of
18f00 20 74 68 65 20 6c 61 73 74 20 63 6f 6c 75 6d 6e   the last column
18f10 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 74 61   added to the ta
18f20 62 6c 65 20 75 6e 64 65 72 20 63 6f 6e 73 74 72  ble under constr
18f30 75 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 53 6f 20  uction..  ** So 
18f40 63 72 65 61 74 65 20 61 20 66 61 6b 65 20 6c 69  create a fake li
18f50 73 74 20 74 6f 20 73 69 6d 75 6c 61 74 65 20 74  st to simulate t
18f60 68 69 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  his..  */.  if( 
18f70 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20  pList==0 ){.    
18f80 54 6f 6b 65 6e 20 70 72 65 76 43 6f 6c 3b 0a 20  Token prevCol;. 
18f90 20 20 20 73 71 6c 69 74 65 33 54 6f 6b 65 6e 49     sqlite3TokenI
18fa0 6e 69 74 28 26 70 72 65 76 43 6f 6c 2c 20 70 54  nit(&prevCol, pT
18fb0 61 62 2d 3e 61 43 6f 6c 5b 70 54 61 62 2d 3e 6e  ab->aCol[pTab->n
18fc0 43 6f 6c 2d 31 5d 2e 7a 4e 61 6d 65 29 3b 0a 20  Col-1].zName);. 
18fd0 20 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74     pList = sqlit
18fe0 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64  e3ExprListAppend
18ff0 28 70 50 61 72 73 65 2c 20 30 2c 0a 20 20 20 20  (pParse, 0,.    
19000 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
19010 33 45 78 70 72 41 6c 6c 6f 63 28 64 62 2c 20 54  3ExprAlloc(db, T
19020 4b 5f 49 44 2c 20 26 70 72 65 76 43 6f 6c 2c 20  K_ID, &prevCol, 
19030 30 29 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69  0));.    if( pLi
19040 73 74 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78 69  st==0 ) goto exi
19050 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
19060 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 69 73      assert( pLis
19070 74 2d 3e 6e 45 78 70 72 3d 3d 31 20 29 3b 0a 20  t->nExpr==1 );. 
19080 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69     sqlite3ExprLi
19090 73 74 53 65 74 53 6f 72 74 4f 72 64 65 72 28 70  stSetSortOrder(p
190a0 4c 69 73 74 2c 20 73 6f 72 74 4f 72 64 65 72 29  List, sortOrder)
190b0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  ;.  }else{.    s
190c0 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 43 68  qlite3ExprListCh
190d0 65 63 6b 4c 65 6e 67 74 68 28 70 50 61 72 73 65  eckLength(pParse
190e0 2c 20 70 4c 69 73 74 2c 20 22 69 6e 64 65 78 22  , pList, "index"
190f0 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 67  );.  }..  /* Fig
19100 75 72 65 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79  ure out how many
19110 20 62 79 74 65 73 20 6f 66 20 73 70 61 63 65 20   bytes of space 
19120 61 72 65 20 72 65 71 75 69 72 65 64 20 74 6f 20  are required to 
19130 73 74 6f 72 65 20 65 78 70 6c 69 63 69 74 6c 79  store explicitly
19140 0a 20 20 2a 2a 20 73 70 65 63 69 66 69 65 64 20  .  ** specified 
19150 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
19160 63 65 20 6e 61 6d 65 73 2e 0a 20 20 2a 2f 0a 20  ce names..  */. 
19170 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73   for(i=0; i<pLis
19180 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  t->nExpr; i++){.
19190 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 20      Expr *pExpr 
191a0 3d 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45  = pList->a[i].pE
191b0 78 70 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28  xpr;.    assert(
191c0 20 70 45 78 70 72 21 3d 30 20 29 3b 0a 20 20 20   pExpr!=0 );.   
191d0 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d   if( pExpr->op==
191e0 54 4b 5f 43 4f 4c 4c 41 54 45 20 29 7b 0a 20 20  TK_COLLATE ){.  
191f0 20 20 20 20 6e 45 78 74 72 61 20 2b 3d 20 28 31      nExtra += (1
19200 20 2b 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   + sqlite3Strlen
19210 33 30 28 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b  30(pExpr->u.zTok
19220 65 6e 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  en));.    }.  }.
19230 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 41 6c 6c 6f  .  /* .  ** Allo
19240 63 61 74 65 20 74 68 65 20 69 6e 64 65 78 20 73  cate the index s
19250 74 72 75 63 74 75 72 65 2e 20 0a 20 20 2a 2f 0a  tructure. .  */.
19260 20 20 6e 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65    nName = sqlite
19270 33 53 74 72 6c 65 6e 33 30 28 7a 4e 61 6d 65 29  3Strlen30(zName)
19280 3b 0a 20 20 6e 45 78 74 72 61 43 6f 6c 20 3d 20  ;.  nExtraCol = 
19290 70 50 6b 20 3f 20 70 50 6b 2d 3e 6e 4b 65 79 43  pPk ? pPk->nKeyC
192a0 6f 6c 20 3a 20 31 3b 0a 20 20 70 49 6e 64 65 78  ol : 1;.  pIndex
192b0 20 3d 20 73 71 6c 69 74 65 33 41 6c 6c 6f 63 61   = sqlite3Alloca
192c0 74 65 49 6e 64 65 78 4f 62 6a 65 63 74 28 64 62  teIndexObject(db
192d0 2c 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 2b  , pList->nExpr +
192e0 20 6e 45 78 74 72 61 43 6f 6c 2c 0a 20 20 20 20   nExtraCol,.    
192f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19310 20 20 6e 4e 61 6d 65 20 2b 20 6e 45 78 74 72 61    nName + nExtra
19320 20 2b 20 31 2c 20 26 7a 45 78 74 72 61 29 3b 0a   + 1, &zExtra);.
19330 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
19340 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f  Failed ){.    go
19350 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
19360 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 61 73 73 65  ndex;.  }.  asse
19370 72 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41  rt( EIGHT_BYTE_A
19380 4c 49 47 4e 4d 45 4e 54 28 70 49 6e 64 65 78 2d  LIGNMENT(pIndex-
19390 3e 61 69 52 6f 77 4c 6f 67 45 73 74 29 20 29 3b  >aiRowLogEst) );
193a0 0a 20 20 61 73 73 65 72 74 28 20 45 49 47 48 54  .  assert( EIGHT
193b0 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28  _BYTE_ALIGNMENT(
193c0 70 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c 29 20  pIndex->azColl) 
193d0 29 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 7a 4e 61  );.  pIndex->zNa
193e0 6d 65 20 3d 20 7a 45 78 74 72 61 3b 0a 20 20 7a  me = zExtra;.  z
193f0 45 78 74 72 61 20 2b 3d 20 6e 4e 61 6d 65 20 2b  Extra += nName +
19400 20 31 3b 0a 20 20 6d 65 6d 63 70 79 28 70 49 6e   1;.  memcpy(pIn
19410 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d  dex->zName, zNam
19420 65 2c 20 6e 4e 61 6d 65 2b 31 29 3b 0a 20 20 70  e, nName+1);.  p
19430 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 20 3d 20  Index->pTable = 
19440 70 54 61 62 3b 0a 20 20 70 49 6e 64 65 78 2d 3e  pTab;.  pIndex->
19450 6f 6e 45 72 72 6f 72 20 3d 20 28 75 38 29 6f 6e  onError = (u8)on
19460 45 72 72 6f 72 3b 0a 20 20 70 49 6e 64 65 78 2d  Error;.  pIndex-
19470 3e 75 6e 69 71 4e 6f 74 4e 75 6c 6c 20 3d 20 6f  >uniqNotNull = o
19480 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 3b  nError!=OE_None;
19490 0a 20 20 70 49 6e 64 65 78 2d 3e 69 64 78 54 79  .  pIndex->idxTy
194a0 70 65 20 3d 20 70 4e 61 6d 65 20 3f 20 53 51 4c  pe = pName ? SQL
194b0 49 54 45 5f 49 44 58 54 59 50 45 5f 41 50 50 44  ITE_IDXTYPE_APPD
194c0 45 46 20 3a 20 53 51 4c 49 54 45 5f 49 44 58 54  EF : SQLITE_IDXT
194d0 59 50 45 5f 55 4e 49 51 55 45 3b 0a 20 20 70 49  YPE_UNIQUE;.  pI
194e0 6e 64 65 78 2d 3e 70 53 63 68 65 6d 61 20 3d 20  ndex->pSchema = 
194f0 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53 63  db->aDb[iDb].pSc
19500 68 65 6d 61 3b 0a 20 20 70 49 6e 64 65 78 2d 3e  hema;.  pIndex->
19510 6e 4b 65 79 43 6f 6c 20 3d 20 70 4c 69 73 74 2d  nKeyCol = pList-
19520 3e 6e 45 78 70 72 3b 0a 20 20 69 66 28 20 70 50  >nExpr;.  if( pP
19530 49 57 68 65 72 65 20 29 7b 0a 20 20 20 20 73 71  IWhere ){.    sq
19540 6c 69 74 65 33 52 65 73 6f 6c 76 65 53 65 6c 66  lite3ResolveSelf
19550 52 65 66 65 72 65 6e 63 65 28 70 50 61 72 73 65  Reference(pParse
19560 2c 20 70 54 61 62 2c 20 4e 43 5f 50 61 72 74 49  , pTab, NC_PartI
19570 64 78 2c 20 70 50 49 57 68 65 72 65 2c 20 30 29  dx, pPIWhere, 0)
19580 3b 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e 70 50  ;.    pIndex->pP
19590 61 72 74 49 64 78 57 68 65 72 65 20 3d 20 70 50  artIdxWhere = pP
195a0 49 57 68 65 72 65 3b 0a 20 20 20 20 70 50 49 57  IWhere;.    pPIW
195b0 68 65 72 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  here = 0;.  }.  
195c0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 53  assert( sqlite3S
195d0 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64  chemaMutexHeld(d
195e0 62 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a 0a 20  b, iDb, 0) );.. 
195f0 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65   /* Check to see
19600 20 69 66 20 77 65 20 73 68 6f 75 6c 64 20 68 6f   if we should ho
19610 6e 6f 72 20 44 45 53 43 20 72 65 71 75 65 73 74  nor DESC request
19620 73 20 6f 6e 20 69 6e 64 65 78 20 63 6f 6c 75 6d  s on index colum
19630 6e 73 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 44  ns.  */.  if( pD
19640 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 66 69 6c 65  b->pSchema->file
19650 5f 66 6f 72 6d 61 74 3e 3d 34 20 29 7b 0a 20 20  _format>=4 ){.  
19660 20 20 73 6f 72 74 4f 72 64 65 72 4d 61 73 6b 20    sortOrderMask 
19670 3d 20 2d 31 3b 20 20 20 2f 2a 20 48 6f 6e 6f 72  = -1;   /* Honor
19680 20 44 45 53 43 20 2a 2f 0a 20 20 7d 65 6c 73 65   DESC */.  }else
19690 7b 0a 20 20 20 20 73 6f 72 74 4f 72 64 65 72 4d  {.    sortOrderM
196a0 61 73 6b 20 3d 20 30 3b 20 20 20 20 2f 2a 20 49  ask = 0;    /* I
196b0 67 6e 6f 72 65 20 44 45 53 43 20 2a 2f 0a 20 20  gnore DESC */.  
196c0 7d 0a 0a 20 20 2f 2a 20 41 6e 61 6c 79 7a 65 20  }..  /* Analyze 
196d0 74 68 65 20 6c 69 73 74 20 6f 66 20 65 78 70 72  the list of expr
196e0 65 73 73 69 6f 6e 73 20 74 68 61 74 20 66 6f 72  essions that for
196f0 6d 20 74 68 65 20 74 65 72 6d 73 20 6f 66 20 74  m the terms of t
19700 68 65 20 69 6e 64 65 78 20 61 6e 64 0a 20 20 2a  he index and.  *
19710 2a 20 72 65 70 6f 72 74 20 61 6e 79 20 65 72 72  * report any err
19720 6f 72 73 2e 20 20 49 6e 20 74 68 65 20 63 6f 6d  ors.  In the com
19730 6d 6f 6e 20 63 61 73 65 20 77 68 65 72 65 20 74  mon case where t
19740 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
19750 20 65 78 61 63 74 6c 79 0a 20 20 2a 2a 20 61 20   exactly.  ** a 
19760 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 2c 20 73 74  table column, st
19770 6f 72 65 20 74 68 61 74 20 63 6f 6c 75 6d 6e 20  ore that column 
19780 69 6e 20 61 69 43 6f 6c 75 6d 6e 5b 5d 2e 20 20  in aiColumn[].  
19790 46 6f 72 20 67 65 6e 65 72 61 6c 20 65 78 70 72  For general expr
197a0 65 73 73 69 6f 6e 73 2c 0a 20 20 2a 2a 20 70 6f  essions,.  ** po
197b0 70 75 6c 61 74 65 20 70 49 6e 64 65 78 2d 3e 61  pulate pIndex->a
197c0 43 6f 6c 45 78 70 72 20 61 6e 64 20 73 74 6f 72  ColExpr and stor
197d0 65 20 58 4e 5f 45 58 50 52 20 28 2d 32 29 20 69  e XN_EXPR (-2) i
197e0 6e 20 61 69 43 6f 6c 75 6d 6e 5b 5d 2e 0a 20 20  n aiColumn[]..  
197f0 2a 2a 0a 20 20 2a 2a 20 54 4f 44 4f 3a 20 49 73  **.  ** TODO: Is
19800 73 75 65 20 61 20 77 61 72 6e 69 6e 67 20 69 66  sue a warning if
19810 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 63 6f 6c   two or more col
19820 75 6d 6e 73 20 6f 66 20 74 68 65 20 69 6e 64 65  umns of the inde
19830 78 20 61 72 65 20 69 64 65 6e 74 69 63 61 6c 2e  x are identical.
19840 0a 20 20 2a 2a 20 54 4f 44 4f 3a 20 49 73 73 75  .  ** TODO: Issu
19850 65 20 61 20 77 61 72 6e 69 6e 67 20 69 66 20 74  e a warning if t
19860 68 65 20 74 61 62 6c 65 20 70 72 69 6d 61 72 79  he table primary
19870 20 6b 65 79 20 69 73 20 75 73 65 64 20 61 73 20   key is used as 
19880 70 61 72 74 20 6f 66 20 74 68 65 0a 20 20 2a 2a  part of the.  **
19890 20 69 6e 64 65 78 20 6b 65 79 2e 0a 20 20 2a 2f   index key..  */
198a0 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 4c 69 73  .  for(i=0, pLis
198b0 74 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 3b 20  tItem=pList->a; 
198c0 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20  i<pList->nExpr; 
198d0 69 2b 2b 2c 20 70 4c 69 73 74 49 74 65 6d 2b 2b  i++, pListItem++
198e0 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 43 45  ){.    Expr *pCE
198f0 78 70 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  xpr;            
19900 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69 2d 74        /* The i-t
19910 68 20 69 6e 64 65 78 20 65 78 70 72 65 73 73 69  h index expressi
19920 6f 6e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 65  on */.    int re
19930 71 75 65 73 74 65 64 53 6f 72 74 4f 72 64 65 72  questedSortOrder
19940 3b 20 20 20 20 20 20 20 20 2f 2a 20 41 53 43 20  ;        /* ASC 
19950 6f 72 20 44 45 53 43 20 6f 6e 20 74 68 65 20 69  or DESC on the i
19960 2d 74 68 20 65 78 70 72 65 73 73 69 6f 6e 20 2a  -th expression *
19970 2f 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  /.    const char
19980 20 2a 7a 43 6f 6c 6c 3b 20 20 20 20 20 20 20 20   *zColl;        
19990 20 20 20 20 20 2f 2a 20 43 6f 6c 6c 61 74 69 6f       /* Collatio
199a0 6e 20 73 65 71 75 65 6e 63 65 20 6e 61 6d 65 20  n sequence name 
199b0 2a 2f 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 53  */..    sqlite3S
199c0 74 72 69 6e 67 54 6f 49 64 28 70 4c 69 73 74 49  tringToId(pListI
199d0 74 65 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20  tem->pExpr);.   
199e0 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 53   sqlite3ResolveS
199f0 65 6c 66 52 65 66 65 72 65 6e 63 65 28 70 50 61  elfReference(pPa
19a00 72 73 65 2c 20 70 54 61 62 2c 20 4e 43 5f 49 64  rse, pTab, NC_Id
19a10 78 45 78 70 72 2c 20 70 4c 69 73 74 49 74 65 6d  xExpr, pListItem
19a20 2d 3e 70 45 78 70 72 2c 20 30 29 3b 0a 20 20 20  ->pExpr, 0);.   
19a30 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72   if( pParse->nEr
19a40 72 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72  r ) goto exit_cr
19a50 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20  eate_index;.    
19a60 70 43 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33  pCExpr = sqlite3
19a70 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28  ExprSkipCollate(
19a80 70 4c 69 73 74 49 74 65 6d 2d 3e 70 45 78 70 72  pListItem->pExpr
19a90 29 3b 0a 20 20 20 20 69 66 28 20 70 43 45 78 70  );.    if( pCExp
19aa0 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e  r->op!=TK_COLUMN
19ab0 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 54   ){.      if( pT
19ac0 61 62 3d 3d 70 50 61 72 73 65 2d 3e 70 4e 65 77  ab==pParse->pNew
19ad0 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 20  Table ){.       
19ae0 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
19af0 28 70 50 61 72 73 65 2c 20 22 65 78 70 72 65 73  (pParse, "expres
19b00 73 69 6f 6e 73 20 70 72 6f 68 69 62 69 74 65 64  sions prohibited
19b10 20 69 6e 20 50 52 49 4d 41 52 59 20 4b 45 59 20   in PRIMARY KEY 
19b20 61 6e 64 20 22 0a 20 20 20 20 20 20 20 20 20 20  and ".          
19b30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19b40 20 20 20 20 20 20 22 55 4e 49 51 55 45 20 63 6f        "UNIQUE co
19b50 6e 73 74 72 61 69 6e 74 73 22 29 3b 0a 20 20 20  nstraints");.   
19b60 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63       goto exit_c
19b70 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20  reate_index;.   
19b80 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70     }.      if( p
19b90 49 6e 64 65 78 2d 3e 61 43 6f 6c 45 78 70 72 3d  Index->aColExpr=
19ba0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 45 78  =0 ){.        Ex
19bb0 70 72 4c 69 73 74 20 2a 70 43 6f 70 79 20 3d 20  prList *pCopy = 
19bc0 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
19bd0 75 70 28 64 62 2c 20 70 4c 69 73 74 2c 20 30 29  up(db, pList, 0)
19be0 3b 0a 20 20 20 20 20 20 20 20 70 49 6e 64 65 78  ;.        pIndex
19bf0 2d 3e 61 43 6f 6c 45 78 70 72 20 3d 20 70 43 6f  ->aColExpr = pCo
19c00 70 79 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  py;.        if( 
19c10 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  !db->mallocFaile
19c20 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61  d ){.          a
19c30 73 73 65 72 74 28 20 70 43 6f 70 79 21 3d 30 20  ssert( pCopy!=0 
19c40 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4c 69  );.          pLi
19c50 73 74 49 74 65 6d 20 3d 20 26 70 43 6f 70 79 2d  stItem = &pCopy-
19c60 3e 61 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 7d  >a[i];.        }
19c70 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6a  .      }.      j
19c80 20 3d 20 58 4e 5f 45 58 50 52 3b 0a 20 20 20 20   = XN_EXPR;.    
19c90 20 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75    pIndex->aiColu
19ca0 6d 6e 5b 69 5d 20 3d 20 58 4e 5f 45 58 50 52 3b  mn[i] = XN_EXPR;
19cb0 0a 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 75  .      pIndex->u
19cc0 6e 69 71 4e 6f 74 4e 75 6c 6c 20 3d 20 30 3b 0a  niqNotNull = 0;.
19cd0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
19ce0 20 6a 20 3d 20 70 43 45 78 70 72 2d 3e 69 43 6f   j = pCExpr->iCo
19cf0 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 61 73 73 65  lumn;.      asse
19d00 72 74 28 20 6a 3c 3d 30 78 37 66 66 66 20 29 3b  rt( j<=0x7fff );
19d10 0a 20 20 20 20 20 20 69 66 28 20 6a 3c 30 20 29  .      if( j<0 )
19d20 7b 0a 20 20 20 20 20 20 20 20 6a 20 3d 20 70 54  {.        j = pT
19d30 61 62 2d 3e 69 50 4b 65 79 3b 0a 20 20 20 20 20  ab->iPKey;.     
19d40 20 7d 65 6c 73 65 20 69 66 28 20 70 54 61 62 2d   }else if( pTab-
19d50 3e 61 43 6f 6c 5b 6a 5d 2e 6e 6f 74 4e 75 6c 6c  >aCol[j].notNull
19d60 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ==0 ){.        p
19d70 49 6e 64 65 78 2d 3e 75 6e 69 71 4e 6f 74 4e 75  Index->uniqNotNu
19d80 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  ll = 0;.      }.
19d90 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 61 69        pIndex->ai
19da0 43 6f 6c 75 6d 6e 5b 69 5d 20 3d 20 28 69 31 36  Column[i] = (i16
19db0 29 6a 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 43  )j;.    }.    zC
19dc0 6f 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 69 66 28  oll = 0;.    if(
19dd0 20 70 4c 69 73 74 49 74 65 6d 2d 3e 70 45 78 70   pListItem->pExp
19de0 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c 41 54  r->op==TK_COLLAT
19df0 45 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e  E ){.      int n
19e00 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 7a 43 6f 6c  Coll;.      zCol
19e10 6c 20 3d 20 70 4c 69 73 74 49 74 65 6d 2d 3e 70  l = pListItem->p
19e20 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a  Expr->u.zToken;.
19e30 20 20 20 20 20 20 6e 43 6f 6c 6c 20 3d 20 73 71        nColl = sq
19e40 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 43  lite3Strlen30(zC
19e50 6f 6c 6c 29 20 2b 20 31 3b 0a 20 20 20 20 20 20  oll) + 1;.      
19e60 61 73 73 65 72 74 28 20 6e 45 78 74 72 61 3e 3d  assert( nExtra>=
19e70 6e 43 6f 6c 6c 20 29 3b 0a 20 20 20 20 20 20 6d  nColl );.      m
19e80 65 6d 63 70 79 28 7a 45 78 74 72 61 2c 20 7a 43  emcpy(zExtra, zC
19e90 6f 6c 6c 2c 20 6e 43 6f 6c 6c 29 3b 0a 20 20 20  oll, nColl);.   
19ea0 20 20 20 7a 43 6f 6c 6c 20 3d 20 7a 45 78 74 72     zColl = zExtr
19eb0 61 3b 0a 20 20 20 20 20 20 7a 45 78 74 72 61 20  a;.      zExtra 
19ec0 2b 3d 20 6e 43 6f 6c 6c 3b 0a 20 20 20 20 20 20  += nColl;.      
19ed0 6e 45 78 74 72 61 20 2d 3d 20 6e 43 6f 6c 6c 3b  nExtra -= nColl;
19ee0 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6a  .    }else if( j
19ef0 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 7a 43 6f  >=0 ){.      zCo
19f00 6c 6c 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b  ll = pTab->aCol[
19f10 6a 5d 2e 7a 43 6f 6c 6c 3b 0a 20 20 20 20 7d 0a  j].zColl;.    }.
19f20 20 20 20 20 69 66 28 20 21 7a 43 6f 6c 6c 20 29      if( !zColl )
19f30 20 7a 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33   zColl = sqlite3
19f40 53 74 72 42 49 4e 41 52 59 3b 0a 20 20 20 20 69  StrBINARY;.    i
19f50 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73  f( !db->init.bus
19f60 79 20 26 26 20 21 73 71 6c 69 74 65 33 4c 6f 63  y && !sqlite3Loc
19f70 61 74 65 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  ateCollSeq(pPars
19f80 65 2c 20 7a 43 6f 6c 6c 29 20 29 7b 0a 20 20 20  e, zColl) ){.   
19f90 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65     goto exit_cre
19fa0 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d  ate_index;.    }
19fb0 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e 61 7a 43  .    pIndex->azC
19fc0 6f 6c 6c 5b 69 5d 20 3d 20 7a 43 6f 6c 6c 3b 0a  oll[i] = zColl;.
19fd0 20 20 20 20 72 65 71 75 65 73 74 65 64 53 6f 72      requestedSor
19fe0 74 4f 72 64 65 72 20 3d 20 70 4c 69 73 74 49 74  tOrder = pListIt
19ff0 65 6d 2d 3e 73 6f 72 74 4f 72 64 65 72 20 26 20  em->sortOrder & 
1a000 73 6f 72 74 4f 72 64 65 72 4d 61 73 6b 3b 0a 20  sortOrderMask;. 
1a010 20 20 20 70 49 6e 64 65 78 2d 3e 61 53 6f 72 74     pIndex->aSort
1a020 4f 72 64 65 72 5b 69 5d 20 3d 20 28 75 38 29 72  Order[i] = (u8)r
1a030 65 71 75 65 73 74 65 64 53 6f 72 74 4f 72 64 65  equestedSortOrde
1a040 72 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 70 70  r;.  }..  /* App
1a050 65 6e 64 20 74 68 65 20 74 61 62 6c 65 20 6b 65  end the table ke
1a060 79 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20  y to the end of 
1a070 74 68 65 20 69 6e 64 65 78 2e 20 20 46 6f 72 20  the index.  For 
1a080 57 49 54 48 4f 55 54 20 52 4f 57 49 44 0a 20 20  WITHOUT ROWID.  
1a090 2a 2a 20 74 61 62 6c 65 73 20 28 77 68 65 6e 20  ** tables (when 
1a0a0 70 50 6b 21 3d 30 29 20 74 68 69 73 20 77 69 6c  pPk!=0) this wil
1a0b0 6c 20 62 65 20 74 68 65 20 64 65 63 6c 61 72 65  l be the declare
1a0c0 64 20 50 52 49 4d 41 52 59 20 4b 45 59 2e 20 20  d PRIMARY KEY.  
1a0d0 46 6f 72 0a 20 20 2a 2a 20 6e 6f 72 6d 61 6c 20  For.  ** normal 
1a0e0 74 61 62 6c 65 73 20 28 77 68 65 6e 20 70 50 6b  tables (when pPk
1a0f0 3d 3d 30 29 20 74 68 69 73 20 77 69 6c 6c 20 62  ==0) this will b
1a100 65 20 74 68 65 20 72 6f 77 69 64 2e 0a 20 20 2a  e the rowid..  *
1a110 2f 0a 20 20 69 66 28 20 70 50 6b 20 29 7b 0a 20  /.  if( pPk ){. 
1a120 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 50     for(j=0; j<pP
1a130 6b 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 6a 2b 2b 29  k->nKeyCol; j++)
1a140 7b 0a 20 20 20 20 20 20 69 6e 74 20 78 20 3d 20  {.      int x = 
1a150 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d  pPk->aiColumn[j]
1a160 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1a170 78 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66  x>=0 );.      if
1a180 28 20 68 61 73 43 6f 6c 75 6d 6e 28 70 49 6e 64  ( hasColumn(pInd
1a190 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 2c 20 70 49  ex->aiColumn, pI
1a1a0 6e 64 65 78 2d 3e 6e 4b 65 79 43 6f 6c 2c 20 78  ndex->nKeyCol, x
1a1b0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 49 6e  ) ){.        pIn
1a1c0 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 2d 2d 3b 20  dex->nColumn--; 
1a1d0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
1a1e0 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 61 69        pIndex->ai
1a1f0 43 6f 6c 75 6d 6e 5b 69 5d 20 3d 20 78 3b 0a 20  Column[i] = x;. 
1a200 20 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 61         pIndex->a
1a210 7a 43 6f 6c 6c 5b 69 5d 20 3d 20 70 50 6b 2d 3e  zColl[i] = pPk->
1a220 61 7a 43 6f 6c 6c 5b 6a 5d 3b 0a 20 20 20 20 20  azColl[j];.     
1a230 20 20 20 70 49 6e 64 65 78 2d 3e 61 53 6f 72 74     pIndex->aSort
1a240 4f 72 64 65 72 5b 69 5d 20 3d 20 70 50 6b 2d 3e  Order[i] = pPk->
1a250 61 53 6f 72 74 4f 72 64 65 72 5b 6a 5d 3b 0a 20  aSortOrder[j];. 
1a260 20 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20         i++;.    
1a270 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61 73    }.    }.    as
1a280 73 65 72 74 28 20 69 3d 3d 70 49 6e 64 65 78 2d  sert( i==pIndex-
1a290 3e 6e 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20 7d 65  >nColumn );.  }e
1a2a0 6c 73 65 7b 0a 20 20 20 20 70 49 6e 64 65 78 2d  lse{.    pIndex-
1a2b0 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 20 3d 20 58  >aiColumn[i] = X
1a2c0 4e 5f 52 4f 57 49 44 3b 0a 20 20 20 20 70 49 6e  N_ROWID;.    pIn
1a2d0 64 65 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 20 3d  dex->azColl[i] =
1a2e0 20 73 71 6c 69 74 65 33 53 74 72 42 49 4e 41 52   sqlite3StrBINAR
1a2f0 59 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  Y;.  }.  sqlite3
1a300 44 65 66 61 75 6c 74 52 6f 77 45 73 74 28 70 49  DefaultRowEst(pI
1a310 6e 64 65 78 29 3b 0a 20 20 69 66 28 20 70 50 61  ndex);.  if( pPa
1a320 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3d 3d  rse->pNewTable==
1a330 30 20 29 20 65 73 74 69 6d 61 74 65 49 6e 64 65  0 ) estimateInde
1a340 78 57 69 64 74 68 28 70 49 6e 64 65 78 29 3b 0a  xWidth(pIndex);.
1a350 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 6e  .  /* If this in
1a360 64 65 78 20 63 6f 6e 74 61 69 6e 73 20 65 76 65  dex contains eve
1a370 72 79 20 63 6f 6c 75 6d 6e 20 6f 66 20 69 74 73  ry column of its
1a380 20 74 61 62 6c 65 2c 20 74 68 65 6e 20 6d 61 72   table, then mar
1a390 6b 0a 20 20 2a 2a 20 69 74 20 61 73 20 61 20 63  k.  ** it as a c
1a3a0 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 20 2a 2f  overing index */
1a3b0 0a 20 20 61 73 73 65 72 74 28 20 48 61 73 52 6f  .  assert( HasRo
1a3c0 77 69 64 28 70 54 61 62 29 20 0a 20 20 20 20 20  wid(pTab) .     
1a3d0 20 7c 7c 20 70 54 61 62 2d 3e 69 50 4b 65 79 3c   || pTab->iPKey<
1a3e0 30 20 7c 7c 20 73 71 6c 69 74 65 33 43 6f 6c 75  0 || sqlite3Colu
1a3f0 6d 6e 4f 66 49 6e 64 65 78 28 70 49 6e 64 65 78  mnOfIndex(pIndex
1a400 2c 20 70 54 61 62 2d 3e 69 50 4b 65 79 29 3e 3d  , pTab->iPKey)>=
1a410 30 20 29 3b 0a 20 20 69 66 28 20 70 54 62 6c 4e  0 );.  if( pTblN
1a420 61 6d 65 21 3d 30 20 26 26 20 70 49 6e 64 65 78  ame!=0 && pIndex
1a430 2d 3e 6e 43 6f 6c 75 6d 6e 3e 3d 70 54 61 62 2d  ->nColumn>=pTab-
1a440 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 70 49 6e  >nCol ){.    pIn
1a450 64 65 78 2d 3e 69 73 43 6f 76 65 72 69 6e 67 20  dex->isCovering 
1a460 3d 20 31 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 30  = 1;.    for(j=0
1a470 3b 20 6a 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20  ; j<pTab->nCol; 
1a480 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  j++){.      if( 
1a490 6a 3d 3d 70 54 61 62 2d 3e 69 50 4b 65 79 20 29  j==pTab->iPKey )
1a4a0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
1a4b0 20 69 66 28 20 73 71 6c 69 74 65 33 43 6f 6c 75   if( sqlite3Colu
1a4c0 6d 6e 4f 66 49 6e 64 65 78 28 70 49 6e 64 65 78  mnOfIndex(pIndex
1a4d0 2c 6a 29 3e 3d 30 20 29 20 63 6f 6e 74 69 6e 75  ,j)>=0 ) continu
1a4e0 65 3b 0a 20 20 20 20 20 20 70 49 6e 64 65 78 2d  e;.      pIndex-
1a4f0 3e 69 73 43 6f 76 65 72 69 6e 67 20 3d 20 30 3b  >isCovering = 0;
1a500 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1a510 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70    }.  }..  if( p
1a520 54 61 62 3d 3d 70 50 61 72 73 65 2d 3e 70 4e 65  Tab==pParse->pNe
1a530 77 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 2f 2a  wTable ){.    /*
1a540 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 68 61   This routine ha
1a550 73 20 62 65 65 6e 20 63 61 6c 6c 65 64 20 74 6f  s been called to
1a560 20 63 72 65 61 74 65 20 61 6e 20 61 75 74 6f 6d   create an autom
1a570 61 74 69 63 20 69 6e 64 65 78 20 61 73 20 61 0a  atic index as a.
1a580 20 20 20 20 2a 2a 20 72 65 73 75 6c 74 20 6f 66      ** result of
1a590 20 61 20 50 52 49 4d 41 52 59 20 4b 45 59 20 6f   a PRIMARY KEY o
1a5a0 72 20 55 4e 49 51 55 45 20 63 6c 61 75 73 65 20  r UNIQUE clause 
1a5b0 6f 6e 20 61 20 63 6f 6c 75 6d 6e 20 64 65 66 69  on a column defi
1a5c0 6e 69 74 69 6f 6e 2c 20 6f 72 0a 20 20 20 20 2a  nition, or.    *
1a5d0 2a 20 61 20 50 52 49 4d 41 52 59 20 4b 45 59 20  * a PRIMARY KEY 
1a5e0 6f 72 20 55 4e 49 51 55 45 20 63 6c 61 75 73 65  or UNIQUE clause
1a5f0 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 63   following the c
1a600 6f 6c 75 6d 6e 20 64 65 66 69 6e 69 74 69 6f 6e  olumn definition
1a610 73 2e 0a 20 20 20 20 2a 2a 20 69 2e 65 2e 20 6f  s..    ** i.e. o
1a620 6e 65 20 6f 66 3a 0a 20 20 20 20 2a 2a 0a 20 20  ne of:.    **.  
1a630 20 20 2a 2a 20 43 52 45 41 54 45 20 54 41 42 4c    ** CREATE TABL
1a640 45 20 74 28 78 20 50 52 49 4d 41 52 59 20 4b 45  E t(x PRIMARY KE
1a650 59 2c 20 79 29 3b 0a 20 20 20 20 2a 2a 20 43 52  Y, y);.    ** CR
1a660 45 41 54 45 20 54 41 42 4c 45 20 74 28 78 2c 20  EATE TABLE t(x, 
1a670 79 2c 20 55 4e 49 51 55 45 28 78 2c 20 79 29 29  y, UNIQUE(x, y))
1a680 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ;.    **.    ** 
1a690 45 69 74 68 65 72 20 77 61 79 2c 20 63 68 65 63  Either way, chec
1a6a0 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 20  k to see if the 
1a6b0 74 61 62 6c 65 20 61 6c 72 65 61 64 79 20 68 61  table already ha
1a6c0 73 20 73 75 63 68 20 61 6e 20 69 6e 64 65 78 2e  s such an index.
1a6d0 20 49 66 0a 20 20 20 20 2a 2a 20 73 6f 2c 20 64   If.    ** so, d
1a6e0 6f 6e 27 74 20 62 6f 74 68 65 72 20 63 72 65 61  on't bother crea
1a6f0 74 69 6e 67 20 74 68 69 73 20 6f 6e 65 2e 20 54  ting this one. T
1a700 68 69 73 20 6f 6e 6c 79 20 61 70 70 6c 69 65 73  his only applies
1a710 20 74 6f 0a 20 20 20 20 2a 2a 20 61 75 74 6f 6d   to.    ** autom
1a720 61 74 69 63 61 6c 6c 79 20 63 72 65 61 74 65 64  atically created
1a730 20 69 6e 64 69 63 65 73 2e 20 55 73 65 72 73 20   indices. Users 
1a740 63 61 6e 20 64 6f 20 61 73 20 74 68 65 79 20 77  can do as they w
1a750 69 73 68 20 77 69 74 68 0a 20 20 20 20 2a 2a 20  ish with.    ** 
1a760 65 78 70 6c 69 63 69 74 20 69 6e 64 69 63 65 73  explicit indices
1a770 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
1a780 54 77 6f 20 55 4e 49 51 55 45 20 6f 72 20 50 52  Two UNIQUE or PR
1a790 49 4d 41 52 59 20 4b 45 59 20 63 6f 6e 73 74 72  IMARY KEY constr
1a7a0 61 69 6e 74 73 20 61 72 65 20 63 6f 6e 73 69 64  aints are consid
1a7b0 65 72 65 64 20 65 71 75 69 76 61 6c 65 6e 74 0a  ered equivalent.
1a7c0 20 20 20 20 2a 2a 20 28 61 6e 64 20 74 68 75 73      ** (and thus
1a7d0 20 73 75 70 70 72 65 73 73 69 6e 67 20 74 68 65   suppressing the
1a7e0 20 73 65 63 6f 6e 64 20 6f 6e 65 29 20 65 76 65   second one) eve
1a7f0 6e 20 69 66 20 74 68 65 79 20 68 61 76 65 20 64  n if they have d
1a800 69 66 66 65 72 65 6e 74 0a 20 20 20 20 2a 2a 20  ifferent.    ** 
1a810 73 6f 72 74 20 6f 72 64 65 72 73 2e 0a 20 20 20  sort orders..   
1a820 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 74 68   **.    ** If th
1a830 65 72 65 20 61 72 65 20 64 69 66 66 65 72 65 6e  ere are differen
1a840 74 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  t collating sequ
1a850 65 6e 63 65 73 20 6f 72 20 69 66 20 74 68 65 20  ences or if the 
1a860 63 6f 6c 75 6d 6e 73 20 6f 66 0a 20 20 20 20 2a  columns of.    *
1a870 2a 20 74 68 65 20 63 6f 6e 73 74 72 61 69 6e 74  * the constraint
1a880 20 6f 63 63 75 72 20 69 6e 20 64 69 66 66 65 72   occur in differ
1a890 65 6e 74 20 6f 72 64 65 72 73 2c 20 74 68 65 6e  ent orders, then
1a8a0 20 74 68 65 20 63 6f 6e 73 74 72 61 69 6e 74 73   the constraints
1a8b0 20 61 72 65 0a 20 20 20 20 2a 2a 20 63 6f 6e 73   are.    ** cons
1a8c0 69 64 65 72 65 64 20 64 69 73 74 69 6e 63 74 20  idered distinct 
1a8d0 61 6e 64 20 62 6f 74 68 20 72 65 73 75 6c 74 20  and both result 
1a8e0 69 6e 20 73 65 70 61 72 61 74 65 20 69 6e 64 69  in separate indi
1a8f0 63 65 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ces..    */.    
1a900 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 20  Index *pIdx;.   
1a910 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e   for(pIdx=pTab->
1a920 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49  pIndex; pIdx; pI
1a930 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b  dx=pIdx->pNext){
1a940 0a 20 20 20 20 20 20 69 6e 74 20 6b 3b 0a 20 20  .      int k;.  
1a950 20 20 20 20 61 73 73 65 72 74 28 20 49 73 55 6e      assert( IsUn
1a960 69 71 75 65 49 6e 64 65 78 28 70 49 64 78 29 20  iqueIndex(pIdx) 
1a970 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
1a980 20 70 49 64 78 2d 3e 69 64 78 54 79 70 65 21 3d   pIdx->idxType!=
1a990 53 51 4c 49 54 45 5f 49 44 58 54 59 50 45 5f 41  SQLITE_IDXTYPE_A
1a9a0 50 50 44 45 46 20 29 3b 0a 20 20 20 20 20 20 61  PPDEF );.      a
1a9b0 73 73 65 72 74 28 20 49 73 55 6e 69 71 75 65 49  ssert( IsUniqueI
1a9c0 6e 64 65 78 28 70 49 6e 64 65 78 29 20 29 3b 0a  ndex(pIndex) );.
1a9d0 0a 20 20 20 20 20 20 69 66 28 20 70 49 64 78 2d  .      if( pIdx-
1a9e0 3e 6e 4b 65 79 43 6f 6c 21 3d 70 49 6e 64 65 78  >nKeyCol!=pIndex
1a9f0 2d 3e 6e 4b 65 79 43 6f 6c 20 29 20 63 6f 6e 74  ->nKeyCol ) cont
1aa00 69 6e 75 65 3b 0a 20 20 20 20 20 20 66 6f 72 28  inue;.      for(
1aa10 6b 3d 30 3b 20 6b 3c 70 49 64 78 2d 3e 6e 4b 65  k=0; k<pIdx->nKe
1aa20 79 43 6f 6c 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20  yCol; k++){.    
1aa30 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
1aa40 7a 31 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73  z1;.        cons
1aa50 74 20 63 68 61 72 20 2a 7a 32 3b 0a 20 20 20 20  t char *z2;.    
1aa60 20 20 20 20 61 73 73 65 72 74 28 20 70 49 64 78      assert( pIdx
1aa70 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6b 5d 3e 3d 30  ->aiColumn[k]>=0
1aa80 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
1aa90 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6b  pIdx->aiColumn[k
1aaa0 5d 21 3d 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c  ]!=pIndex->aiCol
1aab0 75 6d 6e 5b 6b 5d 20 29 20 62 72 65 61 6b 3b 0a  umn[k] ) break;.
1aac0 20 20 20 20 20 20 20 20 7a 31 20 3d 20 70 49 64          z1 = pId
1aad0 78 2d 3e 61 7a 43 6f 6c 6c 5b 6b 5d 3b 0a 20 20  x->azColl[k];.  
1aae0 20 20 20 20 20 20 7a 32 20 3d 20 70 49 6e 64 65        z2 = pInde
1aaf0 78 2d 3e 61 7a 43 6f 6c 6c 5b 6b 5d 3b 0a 20 20  x->azColl[k];.  
1ab00 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
1ab10 33 53 74 72 49 43 6d 70 28 7a 31 2c 20 7a 32 29  3StrICmp(z1, z2)
1ab20 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
1ab30 7d 0a 20 20 20 20 20 20 69 66 28 20 6b 3d 3d 70  }.      if( k==p
1ab40 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 20 29 7b 0a  Idx->nKeyCol ){.
1ab50 20 20 20 20 20 20 20 20 69 66 28 20 70 49 64 78          if( pIdx
1ab60 2d 3e 6f 6e 45 72 72 6f 72 21 3d 70 49 6e 64 65  ->onError!=pInde
1ab70 78 2d 3e 6f 6e 45 72 72 6f 72 20 29 7b 0a 20 20  x->onError ){.  
1ab80 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20          /* This 
1ab90 63 6f 6e 73 74 72 61 69 6e 74 20 63 72 65 61 74  constraint creat
1aba0 65 73 20 74 68 65 20 73 61 6d 65 20 69 6e 64 65  es the same inde
1abb0 78 20 61 73 20 61 20 70 72 65 76 69 6f 75 73 0a  x as a previous.
1abc0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e            ** con
1abd0 73 74 72 61 69 6e 74 20 73 70 65 63 69 66 69 65  straint specifie
1abe0 64 20 73 6f 6d 65 77 68 65 72 65 20 69 6e 20 74  d somewhere in t
1abf0 68 65 20 43 52 45 41 54 45 20 54 41 42 4c 45 20  he CREATE TABLE 
1ac00 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20 20 20 20  statement..     
1ac10 20 20 20 20 20 2a 2a 20 48 6f 77 65 76 65 72 20       ** However 
1ac20 74 68 65 20 4f 4e 20 43 4f 4e 46 4c 49 43 54 20  the ON CONFLICT 
1ac30 63 6c 61 75 73 65 73 20 61 72 65 20 64 69 66 66  clauses are diff
1ac40 65 72 65 6e 74 2e 20 49 66 20 62 6f 74 68 20 74  erent. If both t
1ac50 68 69 73 20 0a 20 20 20 20 20 20 20 20 20 20 2a  his .          *
1ac60 2a 20 63 6f 6e 73 74 72 61 69 6e 74 20 61 6e 64  * constraint and
1ac70 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 65 71   the previous eq
1ac80 75 69 76 61 6c 65 6e 74 20 63 6f 6e 73 74 72 61  uivalent constra
1ac90 69 6e 74 20 68 61 76 65 20 65 78 70 6c 69 63 69  int have explici
1aca0 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 4f  t.          ** O
1acb0 4e 20 43 4f 4e 46 4c 49 43 54 20 63 6c 61 75 73  N CONFLICT claus
1acc0 65 73 20 74 68 69 73 20 69 73 20 61 6e 20 65 72  es this is an er
1acd0 72 6f 72 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ror. Otherwise, 
1ace0 75 73 65 20 74 68 65 0a 20 20 20 20 20 20 20 20  use the.        
1acf0 20 20 2a 2a 20 65 78 70 6c 69 63 69 74 6c 79 20    ** explicitly 
1ad00 73 70 65 63 69 66 69 65 64 20 62 65 68 61 76 69  specified behavi
1ad10 6f 72 20 66 6f 72 20 74 68 65 20 69 6e 64 65 78  or for the index
1ad20 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20  ..          */. 
1ad30 20 20 20 20 20 20 20 20 20 69 66 28 20 21 28 70           if( !(p
1ad40 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45  Idx->onError==OE
1ad50 5f 44 65 66 61 75 6c 74 20 7c 7c 20 70 49 6e 64  _Default || pInd
1ad60 65 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f  ex->onError==OE_
1ad70 44 65 66 61 75 6c 74 29 20 29 7b 0a 20 20 20 20  Default) ){.    
1ad80 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
1ad90 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
1ada0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1adb0 20 22 63 6f 6e 66 6c 69 63 74 69 6e 67 20 4f 4e   "conflicting ON
1adc0 20 43 4f 4e 46 4c 49 43 54 20 63 6c 61 75 73 65   CONFLICT clause
1add0 73 20 73 70 65 63 69 66 69 65 64 22 2c 20 30 29  s specified", 0)
1ade0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
1adf0 20 20 20 20 20 20 20 20 69 66 28 20 70 49 64 78          if( pIdx
1ae00 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 44 65  ->onError==OE_De
1ae10 66 61 75 6c 74 20 29 7b 0a 20 20 20 20 20 20 20  fault ){.       
1ae20 20 20 20 20 20 70 49 64 78 2d 3e 6f 6e 45 72 72       pIdx->onErr
1ae30 6f 72 20 3d 20 70 49 6e 64 65 78 2d 3e 6f 6e 45  or = pIndex->onE
1ae40 72 72 6f 72 3b 0a 20 20 20 20 20 20 20 20 20 20  rror;.          
1ae50 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
1ae60 20 20 20 20 70 52 65 74 20 3d 20 70 49 64 78 3b      pRet = pIdx;
1ae70 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 78  .        goto ex
1ae80 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
1ae90 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1aea0 20 7d 0a 0a 20 20 2f 2a 20 4c 69 6e 6b 20 74 68   }..  /* Link th
1aeb0 65 20 6e 65 77 20 49 6e 64 65 78 20 73 74 72 75  e new Index stru
1aec0 63 74 75 72 65 20 74 6f 20 69 74 73 20 74 61 62  cture to its tab
1aed0 6c 65 20 61 6e 64 20 74 6f 20 74 68 65 20 6f 74  le and to the ot
1aee0 68 65 72 0a 20 20 2a 2a 20 69 6e 2d 6d 65 6d 6f  her.  ** in-memo
1aef0 72 79 20 64 61 74 61 62 61 73 65 20 73 74 72 75  ry database stru
1af00 63 74 75 72 65 73 2e 20 0a 20 20 2a 2f 0a 20 20  ctures. .  */.  
1af10 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e  assert( pParse->
1af20 6e 45 72 72 3d 3d 30 20 29 3b 0a 20 20 69 66 28  nErr==0 );.  if(
1af30 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29   db->init.busy )
1af40 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 3b 0a  {.    Index *p;.
1af50 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
1af60 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65  te3SchemaMutexHe
1af70 6c 64 28 64 62 2c 20 30 2c 20 70 49 6e 64 65 78  ld(db, 0, pIndex
1af80 2d 3e 70 53 63 68 65 6d 61 29 20 29 3b 0a 20 20  ->pSchema) );.  
1af90 20 20 70 20 3d 20 73 71 6c 69 74 65 33 48 61 73    p = sqlite3Has
1afa0 68 49 6e 73 65 72 74 28 26 70 49 6e 64 65 78 2d  hInsert(&pIndex-
1afb0 3e 70 53 63 68 65 6d 61 2d 3e 69 64 78 48 61 73  >pSchema->idxHas
1afc0 68 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  h, .            
1afd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 49                pI
1afe0 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 70 49 6e  ndex->zName, pIn
1aff0 64 65 78 29 3b 0a 20 20 20 20 69 66 28 20 70 20  dex);.    if( p 
1b000 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
1b010 20 70 3d 3d 70 49 6e 64 65 78 20 29 3b 20 20 2f   p==pIndex );  /
1b020 2a 20 4d 61 6c 6c 6f 63 20 6d 75 73 74 20 68 61  * Malloc must ha
1b030 76 65 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20 20  ve failed */.   
1b040 20 20 20 73 71 6c 69 74 65 33 4f 6f 6d 46 61 75     sqlite3OomFau
1b050 6c 74 28 64 62 29 3b 0a 20 20 20 20 20 20 67 6f  lt(db);.      go
1b060 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
1b070 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ndex;.    }.    
1b080 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c  db->flags |= SQL
1b090 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65  ITE_InternChange
1b0a0 73 3b 0a 20 20 20 20 69 66 28 20 70 54 62 6c 4e  s;.    if( pTblN
1b0b0 61 6d 65 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  ame!=0 ){.      
1b0c0 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 20 3d 20 64  pIndex->tnum = d
1b0d0 62 2d 3e 69 6e 69 74 2e 6e 65 77 54 6e 75 6d 3b  b->init.newTnum;
1b0e0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
1b0f0 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20   If this is the 
1b100 69 6e 69 74 69 61 6c 20 43 52 45 41 54 45 20 49  initial CREATE I
1b110 4e 44 45 58 20 73 74 61 74 65 6d 65 6e 74 20 28  NDEX statement (
1b120 6f 72 20 43 52 45 41 54 45 20 54 41 42 4c 45 20  or CREATE TABLE 
1b130 69 66 20 74 68 65 0a 20 20 2a 2a 20 69 6e 64 65  if the.  ** inde
1b140 78 20 69 73 20 61 6e 20 69 6d 70 6c 69 65 64 20  x is an implied 
1b150 69 6e 64 65 78 20 66 6f 72 20 61 20 55 4e 49 51  index for a UNIQ
1b160 55 45 20 6f 72 20 50 52 49 4d 41 52 59 20 4b 45  UE or PRIMARY KE
1b170 59 20 63 6f 6e 73 74 72 61 69 6e 74 29 20 74 68  Y constraint) th
1b180 65 6e 0a 20 20 2a 2a 20 65 6d 69 74 20 63 6f 64  en.  ** emit cod
1b190 65 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 74 68  e to allocate th
1b1a0 65 20 69 6e 64 65 78 20 72 6f 6f 74 70 61 67 65  e index rootpage
1b1b0 20 6f 6e 20 64 69 73 6b 20 61 6e 64 20 6d 61 6b   on disk and mak
1b1c0 65 20 61 6e 20 65 6e 74 72 79 20 66 6f 72 0a 20  e an entry for. 
1b1d0 20 2a 2a 20 74 68 65 20 69 6e 64 65 78 20 69 6e   ** the index in
1b1e0 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74   the sqlite_mast
1b1f0 65 72 20 74 61 62 6c 65 20 61 6e 64 20 70 6f 70  er table and pop
1b200 75 6c 61 74 65 20 74 68 65 20 69 6e 64 65 78 20  ulate the index 
1b210 77 69 74 68 0a 20 20 2a 2a 20 63 6f 6e 74 65 6e  with.  ** conten
1b220 74 2e 20 20 42 75 74 2c 20 64 6f 20 6e 6f 74 20  t.  But, do not 
1b230 64 6f 20 74 68 69 73 20 69 66 20 77 65 20 61 72  do this if we ar
1b240 65 20 73 69 6d 70 6c 79 20 72 65 61 64 69 6e 67  e simply reading
1b250 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74   the sqlite_mast
1b260 65 72 0a 20 20 2a 2a 20 74 61 62 6c 65 20 74 6f  er.  ** table to
1b270 20 70 61 72 73 65 20 74 68 65 20 73 63 68 65 6d   parse the schem
1b280 61 2c 20 6f 72 20 69 66 20 74 68 69 73 20 69 6e  a, or if this in
1b290 64 65 78 20 69 73 20 74 68 65 20 50 52 49 4d 41  dex is the PRIMA
1b2a0 52 59 20 4b 45 59 20 69 6e 64 65 78 0a 20 20 2a  RY KEY index.  *
1b2b0 2a 20 6f 66 20 61 20 57 49 54 48 4f 55 54 20 52  * of a WITHOUT R
1b2c0 4f 57 49 44 20 74 61 62 6c 65 2e 0a 20 20 2a 2a  OWID table..  **
1b2d0 0a 20 20 2a 2a 20 49 66 20 70 54 62 6c 4e 61 6d  .  ** If pTblNam
1b2e0 65 3d 3d 30 20 69 74 20 6d 65 61 6e 73 20 74 68  e==0 it means th
1b2f0 69 73 20 69 6e 64 65 78 20 69 73 20 67 65 6e 65  is index is gene
1b300 72 61 74 65 64 20 61 73 20 61 6e 20 69 6d 70 6c  rated as an impl
1b310 69 65 64 20 50 52 49 4d 41 52 59 20 4b 45 59 0a  ied PRIMARY KEY.
1b320 20 20 2a 2a 20 6f 72 20 55 4e 49 51 55 45 20 69    ** or UNIQUE i
1b330 6e 64 65 78 20 69 6e 20 61 20 43 52 45 41 54 45  ndex in a CREATE
1b340 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74   TABLE statement
1b350 2e 20 20 53 69 6e 63 65 20 74 68 65 20 74 61 62  .  Since the tab
1b360 6c 65 0a 20 20 2a 2a 20 68 61 73 20 6a 75 73 74  le.  ** has just
1b370 20 62 65 65 6e 20 63 72 65 61 74 65 64 2c 20 69   been created, i
1b380 74 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 64 61  t contains no da
1b390 74 61 20 61 6e 64 20 74 68 65 20 69 6e 64 65 78  ta and the index
1b3a0 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 0a   initialization.
1b3b0 20 20 2a 2a 20 73 74 65 70 20 63 61 6e 20 62 65    ** step can be
1b3c0 20 73 6b 69 70 70 65 64 2e 0a 20 20 2a 2f 0a 20   skipped..  */. 
1b3d0 20 65 6c 73 65 20 69 66 28 20 48 61 73 52 6f 77   else if( HasRow
1b3e0 69 64 28 70 54 61 62 29 20 7c 7c 20 70 54 62 6c  id(pTab) || pTbl
1b3f0 4e 61 6d 65 21 3d 30 20 29 7b 0a 20 20 20 20 56  Name!=0 ){.    V
1b400 64 62 65 20 2a 76 3b 0a 20 20 20 20 63 68 61 72  dbe *v;.    char
1b410 20 2a 7a 53 74 6d 74 3b 0a 20 20 20 20 69 6e 74   *zStmt;.    int
1b420 20 69 4d 65 6d 20 3d 20 2b 2b 70 50 61 72 73 65   iMem = ++pParse
1b430 2d 3e 6e 4d 65 6d 3b 0a 0a 20 20 20 20 76 20 3d  ->nMem;..    v =
1b440 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
1b450 70 50 61 72 73 65 29 3b 0a 20 20 20 20 69 66 28  pParse);.    if(
1b460 20 76 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78 69   v==0 ) goto exi
1b470 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
1b480 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69  .    sqlite3Begi
1b490 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28  nWriteOperation(
1b4a0 70 50 61 72 73 65 2c 20 31 2c 20 69 44 62 29 3b  pParse, 1, iDb);
1b4b0 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20  ..    /* Create 
1b4c0 74 68 65 20 72 6f 6f 74 70 61 67 65 20 66 6f 72  the rootpage for
1b4d0 20 74 68 65 20 69 6e 64 65 78 20 75 73 69 6e 67   the index using
1b4e0 20 43 72 65 61 74 65 49 6e 64 65 78 2e 20 42 75   CreateIndex. Bu
1b4f0 74 20 62 65 66 6f 72 65 0a 20 20 20 20 2a 2a 20  t before.    ** 
1b500 64 6f 69 6e 67 20 73 6f 2c 20 63 6f 64 65 20 61  doing so, code a
1b510 20 4e 6f 6f 70 20 69 6e 73 74 72 75 63 74 69 6f   Noop instructio
1b520 6e 20 61 6e 64 20 73 74 6f 72 65 20 69 74 73 20  n and store its 
1b530 61 64 64 72 65 73 73 20 69 6e 20 0a 20 20 20 20  address in .    
1b540 2a 2a 20 49 6e 64 65 78 2e 74 6e 75 6d 2e 20 54  ** Index.tnum. T
1b550 68 69 73 20 69 73 20 72 65 71 75 69 72 65 64 20  his is required 
1b560 69 6e 20 63 61 73 65 20 74 68 69 73 20 69 6e 64  in case this ind
1b570 65 78 20 69 73 20 61 63 74 75 61 6c 6c 79 20 61  ex is actually a
1b580 20 0a 20 20 20 20 2a 2a 20 50 52 49 4d 41 52 59   .    ** PRIMARY
1b590 20 4b 45 59 20 61 6e 64 20 74 68 65 20 74 61 62   KEY and the tab
1b5a0 6c 65 20 69 73 20 61 63 74 75 61 6c 6c 79 20 61  le is actually a
1b5b0 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 20 74   WITHOUT ROWID t
1b5c0 61 62 6c 65 2e 20 49 6e 20 0a 20 20 20 20 2a 2a  able. In .    **
1b5d0 20 74 68 61 74 20 63 61 73 65 20 74 68 65 20 63   that case the c
1b5e0 6f 6e 76 65 72 74 54 6f 57 69 74 68 6f 75 74 52  onvertToWithoutR
1b5f0 6f 77 69 64 54 61 62 6c 65 28 29 20 72 6f 75 74  owidTable() rout
1b600 69 6e 65 20 77 69 6c 6c 20 72 65 70 6c 61 63 65  ine will replace
1b610 0a 20 20 20 20 2a 2a 20 74 68 65 20 4e 6f 6f 70  .    ** the Noop
1b620 20 77 69 74 68 20 61 20 47 6f 74 6f 20 74 6f 20   with a Goto to 
1b630 6a 75 6d 70 20 6f 76 65 72 20 74 68 65 20 56 44  jump over the VD
1b640 42 45 20 63 6f 64 65 20 67 65 6e 65 72 61 74 65  BE code generate
1b650 64 20 62 65 6c 6f 77 2e 20 2a 2f 0a 20 20 20 20  d below. */.    
1b660 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 20 3d 20 73  pIndex->tnum = s
1b670 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30  qlite3VdbeAddOp0
1b680 28 76 2c 20 4f 50 5f 4e 6f 6f 70 29 3b 0a 20 20  (v, OP_Noop);.  
1b690 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1b6a0 4f 70 32 28 76 2c 20 4f 50 5f 43 72 65 61 74 65  Op2(v, OP_Create
1b6b0 49 6e 64 65 78 2c 20 69 44 62 2c 20 69 4d 65 6d  Index, iDb, iMem
1b6c0 29 3b 0a 0a 20 20 20 20 2f 2a 20 47 61 74 68 65  );..    /* Gathe
1b6d0 72 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 74  r the complete t
1b6e0 65 78 74 20 6f 66 20 74 68 65 20 43 52 45 41 54  ext of the CREAT
1b6f0 45 20 49 4e 44 45 58 20 73 74 61 74 65 6d 65 6e  E INDEX statemen
1b700 74 20 69 6e 74 6f 0a 20 20 20 20 2a 2a 20 74 68  t into.    ** th
1b710 65 20 7a 53 74 6d 74 20 76 61 72 69 61 62 6c 65  e zStmt variable
1b720 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
1b730 70 53 74 61 72 74 20 29 7b 0a 20 20 20 20 20 20  pStart ){.      
1b740 69 6e 74 20 6e 20 3d 20 28 69 6e 74 29 28 70 50  int n = (int)(pP
1b750 61 72 73 65 2d 3e 73 4c 61 73 74 54 6f 6b 65 6e  arse->sLastToken
1b760 2e 7a 20 2d 20 70 4e 61 6d 65 2d 3e 7a 29 20 2b  .z - pName->z) +
1b770 20 70 50 61 72 73 65 2d 3e 73 4c 61 73 74 54 6f   pParse->sLastTo
1b780 6b 65 6e 2e 6e 3b 0a 20 20 20 20 20 20 69 66 28  ken.n;.      if(
1b790 20 70 4e 61 6d 65 2d 3e 7a 5b 6e 2d 31 5d 3d 3d   pName->z[n-1]==
1b7a0 27 3b 27 20 29 20 6e 2d 2d 3b 0a 20 20 20 20 20  ';' ) n--;.     
1b7b0 20 2f 2a 20 41 20 6e 61 6d 65 64 20 69 6e 64 65   /* A named inde
1b7c0 78 20 77 69 74 68 20 61 6e 20 65 78 70 6c 69 63  x with an explic
1b7d0 69 74 20 43 52 45 41 54 45 20 49 4e 44 45 58 20  it CREATE INDEX 
1b7e0 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20  statement */.   
1b7f0 20 20 20 7a 53 74 6d 74 20 3d 20 73 71 6c 69 74     zStmt = sqlit
1b800 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 43  e3MPrintf(db, "C
1b810 52 45 41 54 45 25 73 20 49 4e 44 45 58 20 25 2e  REATE%s INDEX %.
1b820 2a 73 22 2c 0a 20 20 20 20 20 20 20 20 6f 6e 45  *s",.        onE
1b830 72 72 6f 72 3d 3d 4f 45 5f 4e 6f 6e 65 20 3f 20  rror==OE_None ? 
1b840 22 22 20 3a 20 22 20 55 4e 49 51 55 45 22 2c 20  "" : " UNIQUE", 
1b850 6e 2c 20 70 4e 61 6d 65 2d 3e 7a 29 3b 0a 20 20  n, pName->z);.  
1b860 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f    }else{.      /
1b870 2a 20 41 6e 20 61 75 74 6f 6d 61 74 69 63 20 69  * An automatic i
1b880 6e 64 65 78 20 63 72 65 61 74 65 64 20 62 79 20  ndex created by 
1b890 61 20 50 52 49 4d 41 52 59 20 4b 45 59 20 6f 72  a PRIMARY KEY or
1b8a0 20 55 4e 49 51 55 45 20 63 6f 6e 73 74 72 61 69   UNIQUE constrai
1b8b0 6e 74 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 7a  nt */.      /* z
1b8c0 53 74 6d 74 20 3d 20 73 71 6c 69 74 65 33 4d 50  Stmt = sqlite3MP
1b8d0 72 69 6e 74 66 28 22 22 29 3b 20 2a 2f 0a 20 20  rintf(""); */.  
1b8e0 20 20 20 20 7a 53 74 6d 74 20 3d 20 30 3b 0a 20      zStmt = 0;. 
1b8f0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 64 64     }..    /* Add
1b900 20 61 6e 20 65 6e 74 72 79 20 69 6e 20 73 71 6c   an entry in sql
1b910 69 74 65 5f 6d 61 73 74 65 72 20 66 6f 72 20 74  ite_master for t
1b920 68 69 73 20 69 6e 64 65 78 0a 20 20 20 20 2a 2f  his index.    */
1b930 0a 20 20 20 20 73 71 6c 69 74 65 33 4e 65 73 74  .    sqlite3Nest
1b940 65 64 50 61 72 73 65 28 70 50 61 72 73 65 2c 20  edParse(pParse, 
1b950 0a 20 20 20 20 20 20 20 20 22 49 4e 53 45 52 54  .        "INSERT
1b960 20 49 4e 54 4f 20 25 51 2e 25 73 20 56 41 4c 55   INTO %Q.%s VALU
1b970 45 53 28 27 69 6e 64 65 78 27 2c 25 51 2c 25 51  ES('index',%Q,%Q
1b980 2c 23 25 64 2c 25 51 29 3b 22 2c 0a 20 20 20 20  ,#%d,%Q);",.    
1b990 20 20 20 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d      db->aDb[iDb]
1b9a0 2e 7a 4e 61 6d 65 2c 20 53 43 48 45 4d 41 5f 54  .zName, SCHEMA_T
1b9b0 41 42 4c 45 28 69 44 62 29 2c 0a 20 20 20 20 20  ABLE(iDb),.     
1b9c0 20 20 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65     pIndex->zName
1b9d0 2c 0a 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e  ,.        pTab->
1b9e0 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 69  zName,.        i
1b9f0 4d 65 6d 2c 0a 20 20 20 20 20 20 20 20 7a 53 74  Mem,.        zSt
1ba00 6d 74 0a 20 20 20 20 29 3b 0a 20 20 20 20 73 71  mt.    );.    sq
1ba10 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
1ba20 7a 53 74 6d 74 29 3b 0a 0a 20 20 20 20 2f 2a 20  zStmt);..    /* 
1ba30 46 69 6c 6c 20 74 68 65 20 69 6e 64 65 78 20 77  Fill the index w
1ba40 69 74 68 20 64 61 74 61 20 61 6e 64 20 72 65 70  ith data and rep
1ba50 61 72 73 65 20 74 68 65 20 73 63 68 65 6d 61 2e  arse the schema.
1ba60 20 43 6f 64 65 20 61 6e 20 4f 50 5f 45 78 70 69   Code an OP_Expi
1ba70 72 65 0a 20 20 20 20 2a 2a 20 74 6f 20 69 6e 76  re.    ** to inv
1ba80 61 6c 69 64 61 74 65 20 61 6c 6c 20 70 72 65 2d  alidate all pre-
1ba90 63 6f 6d 70 69 6c 65 64 20 73 74 61 74 65 6d 65  compiled stateme
1baa0 6e 74 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  nts..    */.    
1bab0 69 66 28 20 70 54 62 6c 4e 61 6d 65 20 29 7b 0a  if( pTblName ){.
1bac0 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 66        sqlite3Ref
1bad0 69 6c 6c 49 6e 64 65 78 28 70 50 61 72 73 65 2c  illIndex(pParse,
1bae0 20 70 49 6e 64 65 78 2c 20 69 4d 65 6d 29 3b 0a   pIndex, iMem);.
1baf0 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 68 61        sqlite3Cha
1bb00 6e 67 65 43 6f 6f 6b 69 65 28 70 50 61 72 73 65  ngeCookie(pParse
1bb10 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20 73 71  , iDb);.      sq
1bb20 6c 69 74 65 33 56 64 62 65 41 64 64 50 61 72 73  lite3VdbeAddPars
1bb30 65 53 63 68 65 6d 61 4f 70 28 76 2c 20 69 44 62  eSchemaOp(v, iDb
1bb40 2c 0a 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  ,.         sqlit
1bb50 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 6e  e3MPrintf(db, "n
1bb60 61 6d 65 3d 27 25 71 27 20 41 4e 44 20 74 79 70  ame='%q' AND typ
1bb70 65 3d 27 69 6e 64 65 78 27 22 2c 20 70 49 6e 64  e='index'", pInd
1bb80 65 78 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20  ex->zName));.   
1bb90 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1bba0 64 4f 70 30 28 76 2c 20 4f 50 5f 45 78 70 69 72  dOp0(v, OP_Expir
1bbb0 65 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73  e);.    }..    s
1bbc0 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
1bbd0 72 65 28 76 2c 20 70 49 6e 64 65 78 2d 3e 74 6e  re(v, pIndex->tn
1bbe0 75 6d 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57  um);.  }..  /* W
1bbf0 68 65 6e 20 61 64 64 69 6e 67 20 61 6e 20 69 6e  hen adding an in
1bc00 64 65 78 20 74 6f 20 74 68 65 20 6c 69 73 74 20  dex to the list 
1bc10 6f 66 20 69 6e 64 69 63 65 73 20 66 6f 72 20 61  of indices for a
1bc20 20 74 61 62 6c 65 2c 20 6d 61 6b 65 0a 20 20 2a   table, make.  *
1bc30 2a 20 73 75 72 65 20 61 6c 6c 20 69 6e 64 69 63  * sure all indic
1bc40 65 73 20 6c 61 62 65 6c 65 64 20 4f 45 5f 52 65  es labeled OE_Re
1bc50 70 6c 61 63 65 20 63 6f 6d 65 20 61 66 74 65 72  place come after
1bc60 20 61 6c 6c 20 74 68 6f 73 65 20 6c 61 62 65 6c   all those label
1bc70 65 64 0a 20 20 2a 2a 20 4f 45 5f 49 67 6e 6f 72  ed.  ** OE_Ignor
1bc80 65 2e 20 20 54 68 69 73 20 69 73 20 6e 65 63 65  e.  This is nece
1bc90 73 73 61 72 79 20 66 6f 72 20 74 68 65 20 63 6f  ssary for the co
1bca0 72 72 65 63 74 20 63 6f 6e 73 74 72 61 69 6e 74  rrect constraint
1bcb0 20 63 68 65 63 6b 0a 20 20 2a 2a 20 70 72 6f 63   check.  ** proc
1bcc0 65 73 73 69 6e 67 20 28 69 6e 20 73 71 6c 69 74  essing (in sqlit
1bcd0 65 33 47 65 6e 65 72 61 74 65 43 6f 6e 73 74 72  e3GenerateConstr
1bce0 61 69 6e 74 43 68 65 63 6b 73 28 29 29 20 61 73  aintChecks()) as
1bcf0 20 70 61 72 74 20 6f 66 0a 20 20 2a 2a 20 55 50   part of.  ** UP
1bd00 44 41 54 45 20 61 6e 64 20 49 4e 53 45 52 54 20  DATE and INSERT 
1bd10 73 74 61 74 65 6d 65 6e 74 73 2e 20 20 0a 20 20  statements.  .  
1bd20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 69 6e 69  */.  if( db->ini
1bd30 74 2e 62 75 73 79 20 7c 7c 20 70 54 62 6c 4e 61  t.busy || pTblNa
1bd40 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28  me==0 ){.    if(
1bd50 20 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 52 65 70   onError!=OE_Rep
1bd60 6c 61 63 65 20 7c 7c 20 70 54 61 62 2d 3e 70 49  lace || pTab->pI
1bd70 6e 64 65 78 3d 3d 30 0a 20 20 20 20 20 20 20 20  ndex==0.        
1bd80 20 7c 7c 20 70 54 61 62 2d 3e 70 49 6e 64 65 78   || pTab->pIndex
1bd90 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 52 65  ->onError==OE_Re
1bda0 70 6c 61 63 65 29 7b 0a 20 20 20 20 20 20 70 49  place){.      pI
1bdb0 6e 64 65 78 2d 3e 70 4e 65 78 74 20 3d 20 70 54  ndex->pNext = pT
1bdc0 61 62 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20 20  ab->pIndex;.    
1bdd0 20 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 20 3d    pTab->pIndex =
1bde0 20 70 49 6e 64 65 78 3b 0a 20 20 20 20 7d 65 6c   pIndex;.    }el
1bdf0 73 65 7b 0a 20 20 20 20 20 20 49 6e 64 65 78 20  se{.      Index 
1be00 2a 70 4f 74 68 65 72 20 3d 20 70 54 61 62 2d 3e  *pOther = pTab->
1be10 70 49 6e 64 65 78 3b 0a 20 20 20 20 20 20 77 68  pIndex;.      wh
1be20 69 6c 65 28 20 70 4f 74 68 65 72 2d 3e 70 4e 65  ile( pOther->pNe
1be30 78 74 20 26 26 20 70 4f 74 68 65 72 2d 3e 70 4e  xt && pOther->pN
1be40 65 78 74 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45  ext->onError!=OE
1be50 5f 52 65 70 6c 61 63 65 20 29 7b 0a 20 20 20 20  _Replace ){.    
1be60 20 20 20 20 70 4f 74 68 65 72 20 3d 20 70 4f 74      pOther = pOt
1be70 68 65 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  her->pNext;.    
1be80 20 20 7d 0a 20 20 20 20 20 20 70 49 6e 64 65 78    }.      pIndex
1be90 2d 3e 70 4e 65 78 74 20 3d 20 70 4f 74 68 65 72  ->pNext = pOther
1bea0 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 70  ->pNext;.      p
1beb0 4f 74 68 65 72 2d 3e 70 4e 65 78 74 20 3d 20 70  Other->pNext = p
1bec0 49 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20  Index;.    }.   
1bed0 20 70 52 65 74 20 3d 20 70 49 6e 64 65 78 3b 0a   pRet = pIndex;.
1bee0 20 20 20 20 70 49 6e 64 65 78 20 3d 20 30 3b 0a      pIndex = 0;.
1bef0 20 20 7d 0a 0a 20 20 2f 2a 20 43 6c 65 61 6e 20    }..  /* Clean 
1bf00 75 70 20 62 65 66 6f 72 65 20 65 78 69 74 69 6e  up before exitin
1bf10 67 20 2a 2f 0a 65 78 69 74 5f 63 72 65 61 74 65  g */.exit_create
1bf20 5f 69 6e 64 65 78 3a 0a 20 20 69 66 28 20 70 49  _index:.  if( pI
1bf30 6e 64 65 78 20 29 20 66 72 65 65 49 6e 64 65 78  ndex ) freeIndex
1bf40 28 64 62 2c 20 70 49 6e 64 65 78 29 3b 0a 20 20  (db, pIndex);.  
1bf50 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
1bf60 65 28 64 62 2c 20 70 50 49 57 68 65 72 65 29 3b  e(db, pPIWhere);
1bf70 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69  .  sqlite3ExprLi
1bf80 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 4c 69  stDelete(db, pLi
1bf90 73 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 72  st);.  sqlite3Sr
1bfa0 63 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20  cListDelete(db, 
1bfb0 70 54 62 6c 4e 61 6d 65 29 3b 0a 20 20 73 71 6c  pTblName);.  sql
1bfc0 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a  ite3DbFree(db, z
1bfd0 4e 61 6d 65 29 3b 0a 20 20 72 65 74 75 72 6e 20  Name);.  return 
1bfe0 70 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  pRet;.}../*.** F
1bff0 69 6c 6c 20 74 68 65 20 49 6e 64 65 78 2e 61 69  ill the Index.ai
1c000 52 6f 77 45 73 74 5b 5d 20 61 72 72 61 79 20 77  RowEst[] array w
1c010 69 74 68 20 64 65 66 61 75 6c 74 20 69 6e 66 6f  ith default info
1c020 72 6d 61 74 69 6f 6e 20 2d 20 69 6e 66 6f 72 6d  rmation - inform
1c030 61 74 69 6f 6e 0a 2a 2a 20 74 6f 20 62 65 20 75  ation.** to be u
1c040 73 65 64 20 77 68 65 6e 20 77 65 20 68 61 76 65  sed when we have
1c050 20 6e 6f 74 20 72 75 6e 20 74 68 65 20 41 4e 41   not run the ANA
1c060 4c 59 5a 45 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a  LYZE command..**
1c070 0a 2a 2a 20 61 69 52 6f 77 45 73 74 5b 30 5d 20  .** aiRowEst[0] 
1c080 69 73 20 73 75 70 70 6f 73 65 64 20 74 6f 20 63  is supposed to c
1c090 6f 6e 74 61 69 6e 20 74 68 65 20 6e 75 6d 62 65  ontain the numbe
1c0a0 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20 69 6e  r of elements in
1c0b0 20 74 68 65 20 69 6e 64 65 78 2e 0a 2a 2a 20 53   the index..** S
1c0c0 69 6e 63 65 20 77 65 20 64 6f 20 6e 6f 74 20 6b  ince we do not k
1c0d0 6e 6f 77 2c 20 67 75 65 73 73 20 31 20 6d 69 6c  now, guess 1 mil
1c0e0 6c 69 6f 6e 2e 20 20 61 69 52 6f 77 45 73 74 5b  lion.  aiRowEst[
1c0f0 31 5d 20 69 73 20 61 6e 20 65 73 74 69 6d 61 74  1] is an estimat
1c100 65 20 6f 66 20 74 68 65 0a 2a 2a 20 6e 75 6d 62  e of the.** numb
1c110 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74 68  er of rows in th
1c120 65 20 74 61 62 6c 65 20 74 68 61 74 20 6d 61 74  e table that mat
1c130 63 68 20 61 6e 79 20 70 61 72 74 69 63 75 6c 61  ch any particula
1c140 72 20 76 61 6c 75 65 20 6f 66 20 74 68 65 0a 2a  r value of the.*
1c150 2a 20 66 69 72 73 74 20 63 6f 6c 75 6d 6e 20 6f  * first column o
1c160 66 20 74 68 65 20 69 6e 64 65 78 2e 20 20 61 69  f the index.  ai
1c170 52 6f 77 45 73 74 5b 32 5d 20 69 73 20 61 6e 20  RowEst[2] is an 
1c180 65 73 74 69 6d 61 74 65 20 6f 66 20 74 68 65 20  estimate of the 
1c190 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66 20 72 6f 77  number.** of row
1c1a0 73 20 74 68 61 74 20 6d 61 74 63 68 20 61 6e 79  s that match any
1c1b0 20 70 61 72 74 69 63 75 6c 61 72 20 63 6f 6d 62   particular comb
1c1c0 69 6e 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 66  ination of the f
1c1d0 69 72 73 74 20 32 20 63 6f 6c 75 6d 6e 73 0a 2a  irst 2 columns.*
1c1e0 2a 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e 20  * of the index. 
1c1f0 20 41 6e 64 20 73 6f 20 66 6f 72 74 68 2e 20 20   And so forth.  
1c200 49 74 20 6d 75 73 74 20 61 6c 77 61 79 73 20 62  It must always b
1c210 65 20 74 68 65 20 63 61 73 65 20 74 68 61 74 0a  e the case that.
1c220 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 61  *.**           a
1c230 69 52 6f 77 45 73 74 5b 4e 5d 3c 3d 61 69 52 6f  iRowEst[N]<=aiRo
1c240 77 45 73 74 5b 4e 2d 31 5d 0a 2a 2a 20 20 20 20  wEst[N-1].**    
1c250 20 20 20 20 20 20 20 61 69 52 6f 77 45 73 74 5b         aiRowEst[
1c260 4e 5d 3e 3d 31 0a 2a 2a 0a 2a 2a 20 41 70 61 72  N]>=1.**.** Apar
1c270 74 20 66 72 6f 6d 20 74 68 61 74 2c 20 77 65 20  t from that, we 
1c280 68 61 76 65 20 6c 69 74 74 6c 65 20 74 6f 20 67  have little to g
1c290 6f 20 6f 6e 20 62 65 73 69 64 65 73 20 69 6e 74  o on besides int
1c2a0 75 69 74 69 6f 6e 20 61 73 20 74 6f 0a 2a 2a 20  uition as to.** 
1c2b0 68 6f 77 20 61 69 52 6f 77 45 73 74 5b 5d 20 73  how aiRowEst[] s
1c2c0 68 6f 75 6c 64 20 62 65 20 69 6e 69 74 69 61 6c  hould be initial
1c2d0 69 7a 65 64 2e 20 20 54 68 65 20 6e 75 6d 62 65  ized.  The numbe
1c2e0 72 73 20 67 65 6e 65 72 61 74 65 64 20 68 65 72  rs generated her
1c2f0 65 0a 2a 2a 20 61 72 65 20 62 61 73 65 64 20 6f  e.** are based o
1c300 6e 20 74 79 70 69 63 61 6c 20 76 61 6c 75 65 73  n typical values
1c310 20 66 6f 75 6e 64 20 69 6e 20 61 63 74 75 61 6c   found in actual
1c320 20 69 6e 64 69 63 65 73 2e 0a 2a 2f 0a 76 6f 69   indices..*/.voi
1c330 64 20 73 71 6c 69 74 65 33 44 65 66 61 75 6c 74  d sqlite3Default
1c340 52 6f 77 45 73 74 28 49 6e 64 65 78 20 2a 70 49  RowEst(Index *pI
1c350 64 78 29 7b 0a 20 20 2f 2a 20 20 20 20 20 20 20  dx){.  /*       
1c360 20 20 20 20 20 20 20 20 20 31 30 2c 20 20 39 2c           10,  9,
1c370 20 20 38 2c 20 20 37 2c 20 20 36 20 2a 2f 0a 20    8,  7,  6 */. 
1c380 20 4c 6f 67 45 73 74 20 61 56 61 6c 5b 5d 20 3d   LogEst aVal[] =
1c390 20 7b 20 33 33 2c 20 33 32 2c 20 33 30 2c 20 32   { 33, 32, 30, 2
1c3a0 38 2c 20 32 36 20 7d 3b 0a 20 20 4c 6f 67 45 73  8, 26 };.  LogEs
1c3b0 74 20 2a 61 20 3d 20 70 49 64 78 2d 3e 61 69 52  t *a = pIdx->aiR
1c3c0 6f 77 4c 6f 67 45 73 74 3b 0a 20 20 69 6e 74 20  owLogEst;.  int 
1c3d0 6e 43 6f 70 79 20 3d 20 4d 49 4e 28 41 72 72 61  nCopy = MIN(Arra
1c3e0 79 53 69 7a 65 28 61 56 61 6c 29 2c 20 70 49 64  ySize(aVal), pId
1c3f0 78 2d 3e 6e 4b 65 79 43 6f 6c 29 3b 0a 20 20 69  x->nKeyCol);.  i
1c400 6e 74 20 69 3b 0a 0a 20 20 2f 2a 20 53 65 74 20  nt i;..  /* Set 
1c410 74 68 65 20 66 69 72 73 74 20 65 6e 74 72 79 20  the first entry 
1c420 28 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20  (number of rows 
1c430 69 6e 20 74 68 65 20 69 6e 64 65 78 29 20 74 6f  in the index) to
1c440 20 74 68 65 20 65 73 74 69 6d 61 74 65 64 20 0a   the estimated .
1c450 20 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 72    ** number of r
1c460 6f 77 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65  ows in the table
1c470 2e 20 4f 72 20 31 30 2c 20 69 66 20 74 68 65 20  . Or 10, if the 
1c480 65 73 74 69 6d 61 74 65 64 20 6e 75 6d 62 65 72  estimated number
1c490 20 6f 66 20 72 6f 77 73 20 0a 20 20 2a 2a 20 69   of rows .  ** i
1c4a0 6e 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 6c  n the table is l
1c4b0 65 73 73 20 74 68 61 6e 20 74 68 61 74 2e 20 20  ess than that.  
1c4c0 2a 2f 0a 20 20 61 5b 30 5d 20 3d 20 70 49 64 78  */.  a[0] = pIdx
1c4d0 2d 3e 70 54 61 62 6c 65 2d 3e 6e 52 6f 77 4c 6f  ->pTable->nRowLo
1c4e0 67 45 73 74 3b 0a 20 20 69 66 28 20 61 5b 30 5d  gEst;.  if( a[0]
1c4f0 3c 33 33 20 29 20 61 5b 30 5d 20 3d 20 33 33 3b  <33 ) a[0] = 33;
1c500 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
1c510 33 33 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73  33==sqlite3LogEs
1c520 74 28 31 30 29 20 29 3b 0a 0a 20 20 2f 2a 20 45  t(10) );..  /* E
1c530 73 74 69 6d 61 74 65 20 74 68 61 74 20 61 5b 31  stimate that a[1
1c540 5d 20 69 73 20 31 30 2c 20 61 5b 32 5d 20 69 73  ] is 10, a[2] is
1c550 20 39 2c 20 61 5b 33 5d 20 69 73 20 38 2c 20 61   9, a[3] is 8, a
1c560 5b 34 5d 20 69 73 20 37 2c 20 61 5b 35 5d 20 69  [4] is 7, a[5] i
1c570 73 0a 20 20 2a 2a 20 36 20 61 6e 64 20 65 61 63  s.  ** 6 and eac
1c580 68 20 73 75 62 73 65 71 75 65 6e 74 20 76 61 6c  h subsequent val
1c590 75 65 20 28 69 66 20 61 6e 79 29 20 69 73 20 35  ue (if any) is 5
1c5a0 2e 20 20 2a 2f 0a 20 20 6d 65 6d 63 70 79 28 26  .  */.  memcpy(&
1c5b0 61 5b 31 5d 2c 20 61 56 61 6c 2c 20 6e 43 6f 70  a[1], aVal, nCop
1c5c0 79 2a 73 69 7a 65 6f 66 28 4c 6f 67 45 73 74 29  y*sizeof(LogEst)
1c5d0 29 3b 0a 20 20 66 6f 72 28 69 3d 6e 43 6f 70 79  );.  for(i=nCopy
1c5e0 2b 31 3b 20 69 3c 3d 70 49 64 78 2d 3e 6e 4b 65  +1; i<=pIdx->nKe
1c5f0 79 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  yCol; i++){.    
1c600 61 5b 69 5d 20 3d 20 32 33 3b 20 20 20 20 20 20  a[i] = 23;      
1c610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 73                as
1c620 73 65 72 74 28 20 32 33 3d 3d 73 71 6c 69 74 65  sert( 23==sqlite
1c630 33 4c 6f 67 45 73 74 28 35 29 20 29 3b 0a 20 20  3LogEst(5) );.  
1c640 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 30 3d 3d  }..  assert( 0==
1c650 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 31 29  sqlite3LogEst(1)
1c660 20 29 3b 0a 20 20 69 66 28 20 49 73 55 6e 69 71   );.  if( IsUniq
1c670 75 65 49 6e 64 65 78 28 70 49 64 78 29 20 29 20  ueIndex(pIdx) ) 
1c680 61 5b 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 5d  a[pIdx->nKeyCol]
1c690 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54   = 0;.}../*.** T
1c6a0 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  his routine will
1c6b0 20 64 72 6f 70 20 61 6e 20 65 78 69 73 74 69 6e   drop an existin
1c6c0 67 20 6e 61 6d 65 64 20 69 6e 64 65 78 2e 20 20  g named index.  
1c6d0 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  This routine.** 
1c6e0 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 44  implements the D
1c6f0 52 4f 50 20 49 4e 44 45 58 20 73 74 61 74 65 6d  ROP INDEX statem
1c700 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ent..*/.void sql
1c710 69 74 65 33 44 72 6f 70 49 6e 64 65 78 28 50 61  ite3DropIndex(Pa
1c720 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 72 63  rse *pParse, Src
1c730 4c 69 73 74 20 2a 70 4e 61 6d 65 2c 20 69 6e 74  List *pName, int
1c740 20 69 66 45 78 69 73 74 73 29 7b 0a 20 20 49 6e   ifExists){.  In
1c750 64 65 78 20 2a 70 49 6e 64 65 78 3b 0a 20 20 56  dex *pIndex;.  V
1c760 64 62 65 20 2a 76 3b 0a 20 20 73 71 6c 69 74 65  dbe *v;.  sqlite
1c770 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
1c780 64 62 3b 0a 20 20 69 6e 74 20 69 44 62 3b 0a 0a  db;.  int iDb;..
1c790 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65    assert( pParse
1c7a0 2d 3e 6e 45 72 72 3d 3d 30 20 29 3b 20 20 20 2f  ->nErr==0 );   /
1c7b0 2a 20 4e 65 76 65 72 20 63 61 6c 6c 65 64 20 77  * Never called w
1c7c0 69 74 68 20 70 72 69 6f 72 20 65 72 72 6f 72 73  ith prior errors
1c7d0 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61   */.  if( db->ma
1c7e0 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
1c7f0 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70    goto exit_drop
1c800 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 61 73  _index;.  }.  as
1c810 73 65 72 74 28 20 70 4e 61 6d 65 2d 3e 6e 53 72  sert( pName->nSr
1c820 63 3d 3d 31 20 29 3b 0a 20 20 69 66 28 20 53 51  c==1 );.  if( SQ
1c830 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33  LITE_OK!=sqlite3
1c840 52 65 61 64 53 63 68 65 6d 61 28 70 50 61 72 73  ReadSchema(pPars
1c850 65 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65  e) ){.    goto e
1c860 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a  xit_drop_index;.
1c870 20 20 7d 0a 20 20 70 49 6e 64 65 78 20 3d 20 73    }.  pIndex = s
1c880 71 6c 69 74 65 33 46 69 6e 64 49 6e 64 65 78 28  qlite3FindIndex(
1c890 64 62 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e  db, pName->a[0].
1c8a0 7a 4e 61 6d 65 2c 20 70 4e 61 6d 65 2d 3e 61 5b  zName, pName->a[
1c8b0 30 5d 2e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20  0].zDatabase);. 
1c8c0 20 69 66 28 20 70 49 6e 64 65 78 3d 3d 30 20 29   if( pIndex==0 )
1c8d0 7b 0a 20 20 20 20 69 66 28 20 21 69 66 45 78 69  {.    if( !ifExi
1c8e0 73 74 73 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  sts ){.      sql
1c8f0 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
1c900 72 73 65 2c 20 22 6e 6f 20 73 75 63 68 20 69 6e  rse, "no such in
1c910 64 65 78 3a 20 25 53 22 2c 20 70 4e 61 6d 65 2c  dex: %S", pName,
1c920 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   0);.    }else{.
1c930 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64        sqlite3Cod
1c940 65 56 65 72 69 66 79 4e 61 6d 65 64 53 63 68 65  eVerifyNamedSche
1c950 6d 61 28 70 50 61 72 73 65 2c 20 70 4e 61 6d 65  ma(pParse, pName
1c960 2d 3e 61 5b 30 5d 2e 7a 44 61 74 61 62 61 73 65  ->a[0].zDatabase
1c970 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61  );.    }.    pPa
1c980 72 73 65 2d 3e 63 68 65 63 6b 53 63 68 65 6d 61  rse->checkSchema
1c990 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f 20 65   = 1;.    goto e
1c9a0 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a  xit_drop_index;.
1c9b0 20 20 7d 0a 20 20 69 66 28 20 70 49 6e 64 65 78    }.  if( pIndex
1c9c0 2d 3e 69 64 78 54 79 70 65 21 3d 53 51 4c 49 54  ->idxType!=SQLIT
1c9d0 45 5f 49 44 58 54 59 50 45 5f 41 50 50 44 45 46  E_IDXTYPE_APPDEF
1c9e0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
1c9f0 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
1ca00 22 69 6e 64 65 78 20 61 73 73 6f 63 69 61 74 65  "index associate
1ca10 64 20 77 69 74 68 20 55 4e 49 51 55 45 20 22 0a  d with UNIQUE ".
1ca20 20 20 20 20 20 20 22 6f 72 20 50 52 49 4d 41 52        "or PRIMAR
1ca30 59 20 4b 45 59 20 63 6f 6e 73 74 72 61 69 6e 74  Y KEY constraint
1ca40 20 63 61 6e 6e 6f 74 20 62 65 20 64 72 6f 70 70   cannot be dropp
1ca50 65 64 22 2c 20 30 29 3b 0a 20 20 20 20 67 6f 74  ed", 0);.    got
1ca60 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65  o exit_drop_inde
1ca70 78 3b 0a 20 20 7d 0a 20 20 69 44 62 20 3d 20 73  x;.  }.  iDb = s
1ca80 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e  qlite3SchemaToIn
1ca90 64 65 78 28 64 62 2c 20 70 49 6e 64 65 78 2d 3e  dex(db, pIndex->
1caa0 70 53 63 68 65 6d 61 29 3b 0a 23 69 66 6e 64 65  pSchema);.#ifnde
1cab0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
1cac0 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 7b 0a  THORIZATION.  {.
1cad0 20 20 20 20 69 6e 74 20 63 6f 64 65 20 3d 20 53      int code = S
1cae0 51 4c 49 54 45 5f 44 52 4f 50 5f 49 4e 44 45 58  QLITE_DROP_INDEX
1caf0 3b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61  ;.    Table *pTa
1cb00 62 20 3d 20 70 49 6e 64 65 78 2d 3e 70 54 61 62  b = pIndex->pTab
1cb10 6c 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  le;.    const ch
1cb20 61 72 20 2a 7a 44 62 20 3d 20 64 62 2d 3e 61 44  ar *zDb = db->aD
1cb30 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20  b[iDb].zName;.  
1cb40 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54    const char *zT
1cb50 61 62 20 3d 20 53 43 48 45 4d 41 5f 54 41 42 4c  ab = SCHEMA_TABL
1cb60 45 28 69 44 62 29 3b 0a 20 20 20 20 69 66 28 20  E(iDb);.    if( 
1cb70 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b  sqlite3AuthCheck
1cb80 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f  (pParse, SQLITE_
1cb90 44 45 4c 45 54 45 2c 20 7a 54 61 62 2c 20 30 2c  DELETE, zTab, 0,
1cba0 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20 67   zDb) ){.      g
1cbb0 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e  oto exit_drop_in
1cbc0 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  dex;.    }.    i
1cbd0 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20  f( !OMIT_TEMPDB 
1cbe0 26 26 20 69 44 62 20 29 20 63 6f 64 65 20 3d 20  && iDb ) code = 
1cbf0 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50  SQLITE_DROP_TEMP
1cc00 5f 49 4e 44 45 58 3b 0a 20 20 20 20 69 66 28 20  _INDEX;.    if( 
1cc10 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b  sqlite3AuthCheck
1cc20 28 70 50 61 72 73 65 2c 20 63 6f 64 65 2c 20 70  (pParse, code, p
1cc30 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 70 54  Index->zName, pT
1cc40 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 44 62 29 20  ab->zName, zDb) 
1cc50 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78  ){.      goto ex
1cc60 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20  it_drop_index;. 
1cc70 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
1cc80 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63  .  /* Generate c
1cc90 6f 64 65 20 74 6f 20 72 65 6d 6f 76 65 20 74 68  ode to remove th
1cca0 65 20 69 6e 64 65 78 20 61 6e 64 20 66 72 6f 6d  e index and from
1ccb0 20 74 68 65 20 6d 61 73 74 65 72 20 74 61 62 6c   the master tabl
1ccc0 65 20 2a 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74  e */.  v = sqlit
1ccd0 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
1cce0 29 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a 20 20  );.  if( v ){.  
1ccf0 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72    sqlite3BeginWr
1cd00 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61  iteOperation(pPa
1cd10 72 73 65 2c 20 31 2c 20 69 44 62 29 3b 0a 20 20  rse, 1, iDb);.  
1cd20 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50    sqlite3NestedP
1cd30 61 72 73 65 28 70 50 61 72 73 65 2c 0a 20 20 20  arse(pParse,.   
1cd40 20 20 20 20 22 44 45 4c 45 54 45 20 46 52 4f 4d      "DELETE FROM
1cd50 20 25 51 2e 25 73 20 57 48 45 52 45 20 6e 61 6d   %Q.%s WHERE nam
1cd60 65 3d 25 51 20 41 4e 44 20 74 79 70 65 3d 27 69  e=%Q AND type='i
1cd70 6e 64 65 78 27 22 2c 0a 20 20 20 20 20 20 20 64  ndex'",.       d
1cd80 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d  b->aDb[iDb].zNam
1cd90 65 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28  e, SCHEMA_TABLE(
1cda0 69 44 62 29 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e  iDb), pIndex->zN
1cdb0 61 6d 65 0a 20 20 20 20 29 3b 0a 20 20 20 20 73  ame.    );.    s
1cdc0 71 6c 69 74 65 33 43 6c 65 61 72 53 74 61 74 54  qlite3ClearStatT
1cdd0 61 62 6c 65 73 28 70 50 61 72 73 65 2c 20 69 44  ables(pParse, iD
1cde0 62 2c 20 22 69 64 78 22 2c 20 70 49 6e 64 65 78  b, "idx", pIndex
1cdf0 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 73 71  ->zName);.    sq
1ce00 6c 69 74 65 33 43 68 61 6e 67 65 43 6f 6f 6b 69  lite3ChangeCooki
1ce10 65 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a  e(pParse, iDb);.
1ce20 20 20 20 20 64 65 73 74 72 6f 79 52 6f 6f 74 50      destroyRootP
1ce30 61 67 65 28 70 50 61 72 73 65 2c 20 70 49 6e 64  age(pParse, pInd
1ce40 65 78 2d 3e 74 6e 75 6d 2c 20 69 44 62 29 3b 0a  ex->tnum, iDb);.
1ce50 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1ce60 64 64 4f 70 34 28 76 2c 20 4f 50 5f 44 72 6f 70  ddOp4(v, OP_Drop
1ce70 49 6e 64 65 78 2c 20 69 44 62 2c 20 30 2c 20 30  Index, iDb, 0, 0
1ce80 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c  , pIndex->zName,
1ce90 20 30 29 3b 0a 20 20 7d 0a 0a 65 78 69 74 5f 64   0);.  }..exit_d
1cea0 72 6f 70 5f 69 6e 64 65 78 3a 0a 20 20 73 71 6c  rop_index:.  sql
1ceb0 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74  ite3SrcListDelet
1cec0 65 28 64 62 2c 20 70 4e 61 6d 65 29 3b 0a 7d 0a  e(db, pName);.}.
1ced0 0a 2f 2a 0a 2a 2a 20 70 41 72 72 61 79 20 69 73  ./*.** pArray is
1cee0 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e   a pointer to an
1cef0 20 61 72 72 61 79 20 6f 66 20 6f 62 6a 65 63 74   array of object
1cf00 73 2e 20 45 61 63 68 20 6f 62 6a 65 63 74 20 69  s. Each object i
1cf10 6e 20 74 68 65 0a 2a 2a 20 61 72 72 61 79 20 69  n the.** array i
1cf20 73 20 73 7a 45 6e 74 72 79 20 62 79 74 65 73 20  s szEntry bytes 
1cf30 69 6e 20 73 69 7a 65 2e 20 54 68 69 73 20 72 6f  in size. This ro
1cf40 75 74 69 6e 65 20 75 73 65 73 20 73 71 6c 69 74  utine uses sqlit
1cf50 65 33 44 62 52 65 61 6c 6c 6f 63 28 29 0a 2a 2a  e3DbRealloc().**
1cf60 20 74 6f 20 65 78 74 65 6e 64 20 74 68 65 20 61   to extend the a
1cf70 72 72 61 79 20 73 6f 20 74 68 61 74 20 74 68 65  rray so that the
1cf80 72 65 20 69 73 20 73 70 61 63 65 20 66 6f 72 20  re is space for 
1cf90 61 20 6e 65 77 20 6f 62 6a 65 63 74 20 61 74 20  a new object at 
1cfa0 74 68 65 20 65 6e 64 2e 0a 2a 2a 0a 2a 2a 20 57  the end..**.** W
1cfb0 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
1cfc0 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 2a 70 6e  n is called, *pn
1cfd0 45 6e 74 72 79 20 63 6f 6e 74 61 69 6e 73 20 74  Entry contains t
1cfe0 68 65 20 63 75 72 72 65 6e 74 20 73 69 7a 65 20  he current size 
1cff0 6f 66 0a 2a 2a 20 74 68 65 20 61 72 72 61 79 20  of.** the array 
1d000 28 69 6e 20 65 6e 74 72 69 65 73 20 2d 20 73 6f  (in entries - so
1d010 20 74 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20   the allocation 
1d020 69 73 20 28 28 2a 70 6e 45 6e 74 72 79 29 20 2a  is ((*pnEntry) *
1d030 20 73 7a 45 6e 74 72 79 29 20 62 79 74 65 73 0a   szEntry) bytes.
1d040 2a 2a 20 69 6e 20 74 6f 74 61 6c 29 2e 0a 2a 2a  ** in total)..**
1d050 0a 2a 2a 20 49 66 20 74 68 65 20 72 65 61 6c 6c  .** If the reall
1d060 6f 63 28 29 20 69 73 20 73 75 63 63 65 73 73 66  oc() is successf
1d070 75 6c 20 28 69 2e 65 2e 20 69 66 20 6e 6f 20 4f  ul (i.e. if no O
1d080 4f 4d 20 63 6f 6e 64 69 74 69 6f 6e 20 6f 63 63  OM condition occ
1d090 75 72 73 29 2c 20 74 68 65 0a 2a 2a 20 73 70 61  urs), the.** spa
1d0a0 63 65 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72  ce allocated for
1d0b0 20 74 68 65 20 6e 65 77 20 6f 62 6a 65 63 74 20   the new object 
1d0c0 69 73 20 7a 65 72 6f 65 64 2c 20 2a 70 6e 45 6e  is zeroed, *pnEn
1d0d0 74 72 79 20 75 70 64 61 74 65 64 20 74 6f 0a 2a  try updated to.*
1d0e0 2a 20 72 65 66 6c 65 63 74 20 74 68 65 20 6e 65  * reflect the ne
1d0f0 77 20 73 69 7a 65 20 6f 66 20 74 68 65 20 61 72  w size of the ar
1d100 72 61 79 20 61 6e 64 20 61 20 70 6f 69 6e 74 65  ray and a pointe
1d110 72 20 74 6f 20 74 68 65 20 6e 65 77 20 61 6c 6c  r to the new all
1d120 6f 63 61 74 69 6f 6e 0a 2a 2a 20 72 65 74 75 72  ocation.** retur
1d130 6e 65 64 2e 20 2a 70 49 64 78 20 69 73 20 73 65  ned. *pIdx is se
1d140 74 20 74 6f 20 74 68 65 20 69 6e 64 65 78 20 6f  t to the index o
1d150 66 20 74 68 65 20 6e 65 77 20 61 72 72 61 79 20  f the new array 
1d160 65 6e 74 72 79 20 69 6e 20 74 68 69 73 20 63 61  entry in this ca
1d170 73 65 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77  se..**.** Otherw
1d180 69 73 65 2c 20 69 66 20 74 68 65 20 72 65 61 6c  ise, if the real
1d190 6c 6f 63 28 29 20 66 61 69 6c 73 2c 20 2a 70 49  loc() fails, *pI
1d1a0 64 78 20 69 73 20 73 65 74 20 74 6f 20 2d 31 2c  dx is set to -1,
1d1b0 20 2a 70 6e 45 6e 74 72 79 20 72 65 6d 61 69 6e   *pnEntry remain
1d1c0 73 0a 2a 2a 20 75 6e 63 68 61 6e 67 65 64 20 61  s.** unchanged a
1d1d0 6e 64 20 61 20 63 6f 70 79 20 6f 66 20 70 41 72  nd a copy of pAr
1d1e0 72 61 79 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f  ray returned..*/
1d1f0 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 41 72  .void *sqlite3Ar
1d200 72 61 79 41 6c 6c 6f 63 61 74 65 28 0a 20 20 73  rayAllocate(.  s
1d210 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20  qlite3 *db,     
1d220 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 74   /* Connection t
1d230 6f 20 6e 6f 74 69 66 79 20 6f 66 20 6d 61 6c 6c  o notify of mall
1d240 6f 63 20 66 61 69 6c 75 72 65 73 20 2a 2f 0a 20  oc failures */. 
1d250 20 76 6f 69 64 20 2a 70 41 72 72 61 79 2c 20 20   void *pArray,  
1d260 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 6f     /* Array of o
1d270 62 6a 65 63 74 73 2e 20 20 4d 69 67 68 74 20 62  bjects.  Might b
1d280 65 20 72 65 61 6c 6c 6f 63 61 74 65 64 20 2a 2f  e reallocated */
1d290 0a 20 20 69 6e 74 20 73 7a 45 6e 74 72 79 2c 20  .  int szEntry, 
1d2a0 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
1d2b0 65 61 63 68 20 6f 62 6a 65 63 74 20 69 6e 20 74  each object in t
1d2c0 68 65 20 61 72 72 61 79 20 2a 2f 0a 20 20 69 6e  he array */.  in
1d2d0 74 20 2a 70 6e 45 6e 74 72 79 2c 20 20 20 20 20  t *pnEntry,     
1d2e0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6f 62 6a  /* Number of obj
1d2f0 65 63 74 73 20 63 75 72 72 65 6e 74 6c 79 20 69  ects currently i
1d300 6e 20 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 2a  n use */.  int *
1d310 70 49 64 78 20 20 20 20 20 20 20 20 20 2f 2a 20  pIdx         /* 
1d320 57 72 69 74 65 20 74 68 65 20 69 6e 64 65 78 20  Write the index 
1d330 6f 66 20 61 20 6e 65 77 20 73 6c 6f 74 20 68 65  of a new slot he
1d340 72 65 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20  re */.){.  char 
1d350 2a 7a 3b 0a 20 20 69 6e 74 20 6e 20 3d 20 2a 70  *z;.  int n = *p
1d360 6e 45 6e 74 72 79 3b 0a 20 20 69 66 28 20 28 6e  nEntry;.  if( (n
1d370 20 26 20 28 6e 2d 31 29 29 3d 3d 30 20 29 7b 0a   & (n-1))==0 ){.
1d380 20 20 20 20 69 6e 74 20 73 7a 20 3d 20 28 6e 3d      int sz = (n=
1d390 3d 30 29 20 3f 20 31 20 3a 20 32 2a 6e 3b 0a 20  =0) ? 1 : 2*n;. 
1d3a0 20 20 20 76 6f 69 64 20 2a 70 4e 65 77 20 3d 20     void *pNew = 
1d3b0 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63  sqlite3DbRealloc
1d3c0 28 64 62 2c 20 70 41 72 72 61 79 2c 20 73 7a 2a  (db, pArray, sz*
1d3d0 73 7a 45 6e 74 72 79 29 3b 0a 20 20 20 20 69 66  szEntry);.    if
1d3e0 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20  ( pNew==0 ){.   
1d3f0 20 20 20 2a 70 49 64 78 20 3d 20 2d 31 3b 0a 20     *pIdx = -1;. 
1d400 20 20 20 20 20 72 65 74 75 72 6e 20 70 41 72 72       return pArr
1d410 61 79 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 41  ay;.    }.    pA
1d420 72 72 61 79 20 3d 20 70 4e 65 77 3b 0a 20 20 7d  rray = pNew;.  }
1d430 0a 20 20 7a 20 3d 20 28 63 68 61 72 2a 29 70 41  .  z = (char*)pA
1d440 72 72 61 79 3b 0a 20 20 6d 65 6d 73 65 74 28 26  rray;.  memset(&
1d450 7a 5b 6e 20 2a 20 73 7a 45 6e 74 72 79 5d 2c 20  z[n * szEntry], 
1d460 30 2c 20 73 7a 45 6e 74 72 79 29 3b 0a 20 20 2a  0, szEntry);.  *
1d470 70 49 64 78 20 3d 20 6e 3b 0a 20 20 2b 2b 2a 70  pIdx = n;.  ++*p
1d480 6e 45 6e 74 72 79 3b 0a 20 20 72 65 74 75 72 6e  nEntry;.  return
1d490 20 70 41 72 72 61 79 3b 0a 7d 0a 0a 2f 2a 0a 2a   pArray;.}../*.*
1d4a0 2a 20 41 70 70 65 6e 64 20 61 20 6e 65 77 20 65  * Append a new e
1d4b0 6c 65 6d 65 6e 74 20 74 6f 20 74 68 65 20 67 69  lement to the gi
1d4c0 76 65 6e 20 49 64 4c 69 73 74 2e 20 20 43 72 65  ven IdList.  Cre
1d4d0 61 74 65 20 61 20 6e 65 77 20 49 64 4c 69 73 74  ate a new IdList
1d4e0 20 69 66 0a 2a 2a 20 6e 65 65 64 20 62 65 2e 0a   if.** need be..
1d4f0 2a 2a 0a 2a 2a 20 41 20 6e 65 77 20 49 64 4c 69  **.** A new IdLi
1d500 73 74 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20  st is returned, 
1d510 6f 72 20 4e 55 4c 4c 20 69 66 20 6d 61 6c 6c 6f  or NULL if mallo
1d520 63 28 29 20 66 61 69 6c 73 2e 0a 2a 2f 0a 49 64  c() fails..*/.Id
1d530 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 49 64 4c  List *sqlite3IdL
1d540 69 73 74 41 70 70 65 6e 64 28 73 71 6c 69 74 65  istAppend(sqlite
1d550 33 20 2a 64 62 2c 20 49 64 4c 69 73 74 20 2a 70  3 *db, IdList *p
1d560 4c 69 73 74 2c 20 54 6f 6b 65 6e 20 2a 70 54 6f  List, Token *pTo
1d570 6b 65 6e 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  ken){.  int i;. 
1d580 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b   if( pList==0 ){
1d590 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 73 71 6c  .    pList = sql
1d5a0 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f  ite3DbMallocZero
1d5b0 28 64 62 2c 20 73 69 7a 65 6f 66 28 49 64 4c 69  (db, sizeof(IdLi
1d5c0 73 74 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70  st) );.    if( p
1d5d0 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e  List==0 ) return
1d5e0 20 30 3b 0a 20 20 7d 0a 20 20 70 4c 69 73 74 2d   0;.  }.  pList-
1d5f0 3e 61 20 3d 20 73 71 6c 69 74 65 33 41 72 72 61  >a = sqlite3Arra
1d600 79 41 6c 6c 6f 63 61 74 65 28 0a 20 20 20 20 20  yAllocate(.     
1d610 20 64 62 2c 0a 20 20 20 20 20 20 70 4c 69 73 74   db,.      pList
1d620 2d 3e 61 2c 0a 20 20 20 20 20 20 73 69 7a 65 6f  ->a,.      sizeo
1d630 66 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 29 2c 0a  f(pList->a[0]),.
1d640 20 20 20 20 20 20 26 70 4c 69 73 74 2d 3e 6e 49        &pList->nI
1d650 64 2c 0a 20 20 20 20 20 20 26 69 0a 20 20 29 3b  d,.      &i.  );
1d660 0a 20 20 69 66 28 20 69 3c 30 20 29 7b 0a 20 20  .  if( i<0 ){.  
1d670 20 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44    sqlite3IdListD
1d680 65 6c 65 74 65 28 64 62 2c 20 70 4c 69 73 74 29  elete(db, pList)
1d690 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  ;.    return 0;.
1d6a0 20 20 7d 0a 20 20 70 4c 69 73 74 2d 3e 61 5b 69    }.  pList->a[i
1d6b0 5d 2e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65  ].zName = sqlite
1d6c0 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64  3NameFromToken(d
1d6d0 62 2c 20 70 54 6f 6b 65 6e 29 3b 0a 20 20 72 65  b, pToken);.  re
1d6e0 74 75 72 6e 20 70 4c 69 73 74 3b 0a 7d 0a 0a 2f  turn pList;.}../
1d6f0 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6e 20 49  *.** Delete an I
1d700 64 4c 69 73 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73  dList..*/.void s
1d710 71 6c 69 74 65 33 49 64 4c 69 73 74 44 65 6c 65  qlite3IdListDele
1d720 74 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  te(sqlite3 *db, 
1d730 49 64 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a  IdList *pList){.
1d740 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70    int i;.  if( p
1d750 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e  List==0 ) return
1d760 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
1d770 4c 69 73 74 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b  List->nId; i++){
1d780 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
1d790 65 65 28 64 62 2c 20 70 4c 69 73 74 2d 3e 61 5b  ee(db, pList->a[
1d7a0 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a 20  i].zName);.  }. 
1d7b0 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
1d7c0 62 2c 20 70 4c 69 73 74 2d 3e 61 29 3b 0a 20 20  b, pList->a);.  
1d7d0 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
1d7e0 2c 20 70 4c 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a  , pList);.}../*.
1d7f0 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 69 6e  ** Return the in
1d800 64 65 78 20 69 6e 20 70 4c 69 73 74 20 6f 66 20  dex in pList of 
1d810 74 68 65 20 69 64 65 6e 74 69 66 69 65 72 20 6e  the identifier n
1d820 61 6d 65 64 20 7a 49 64 2e 20 20 52 65 74 75 72  amed zId.  Retur
1d830 6e 20 2d 31 0a 2a 2a 20 69 66 20 6e 6f 74 20 66  n -1.** if not f
1d840 6f 75 6e 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ound..*/.int sql
1d850 69 74 65 33 49 64 4c 69 73 74 49 6e 64 65 78 28  ite3IdListIndex(
1d860 49 64 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 63  IdList *pList, c
1d870 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
1d880 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66  ){.  int i;.  if
1d890 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74  ( pList==0 ) ret
1d8a0 75 72 6e 20 2d 31 3b 0a 20 20 66 6f 72 28 69 3d  urn -1;.  for(i=
1d8b0 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 49 64 3b  0; i<pList->nId;
1d8c0 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73   i++){.    if( s
1d8d0 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 4c  qlite3StrICmp(pL
1d8e0 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c  ist->a[i].zName,
1d8f0 20 7a 4e 61 6d 65 29 3d 3d 30 20 29 20 72 65 74   zName)==0 ) ret
1d900 75 72 6e 20 69 3b 0a 20 20 7d 0a 20 20 72 65 74  urn i;.  }.  ret
1d910 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn -1;.}../*.**
1d920 20 45 78 70 61 6e 64 20 74 68 65 20 73 70 61 63   Expand the spac
1d930 65 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20  e allocated for 
1d940 74 68 65 20 67 69 76 65 6e 20 53 72 63 4c 69 73  the given SrcLis
1d950 74 20 6f 62 6a 65 63 74 20 62 79 0a 2a 2a 20 63  t object by.** c
1d960 72 65 61 74 69 6e 67 20 6e 45 78 74 72 61 20 6e  reating nExtra n
1d970 65 77 20 73 6c 6f 74 73 20 62 65 67 69 6e 6e 69  ew slots beginni
1d980 6e 67 20 61 74 20 69 53 74 61 72 74 2e 20 20 69  ng at iStart.  i
1d990 53 74 61 72 74 20 69 73 20 7a 65 72 6f 20 62 61  Start is zero ba
1d9a0 73 65 64 2e 0a 2a 2a 20 4e 65 77 20 73 6c 6f 74  sed..** New slot
1d9b0 73 20 61 72 65 20 7a 65 72 6f 65 64 2e 0a 2a 2a  s are zeroed..**
1d9c0 0a 2a 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c  .** For example,
1d9d0 20 73 75 70 70 6f 73 65 20 61 20 53 72 63 4c 69   suppose a SrcLi
1d9e0 73 74 20 69 6e 69 74 69 61 6c 6c 79 20 63 6f 6e  st initially con
1d9f0 74 61 69 6e 73 20 74 77 6f 20 65 6e 74 72 69 65  tains two entrie
1da00 73 3a 20 41 2c 42 2e 0a 2a 2a 20 54 6f 20 61 70  s: A,B..** To ap
1da10 70 65 6e 64 20 33 20 6e 65 77 20 65 6e 74 72 69  pend 3 new entri
1da20 65 73 20 6f 6e 74 6f 20 74 68 65 20 65 6e 64 2c  es onto the end,
1da30 20 64 6f 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20   do this:.**.** 
1da40 20 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73     sqlite3SrcLis
1da50 74 45 6e 6c 61 72 67 65 28 64 62 2c 20 70 53 72  tEnlarge(db, pSr
1da60 63 6c 69 73 74 2c 20 33 2c 20 32 29 3b 0a 2a 2a  clist, 3, 2);.**
1da70 0a 2a 2a 20 41 66 74 65 72 20 74 68 65 20 63 61  .** After the ca
1da80 6c 6c 20 61 62 6f 76 65 20 69 74 20 77 6f 75 6c  ll above it woul
1da90 64 20 63 6f 6e 74 61 69 6e 3a 20 20 41 2c 20 42  d contain:  A, B
1daa0 2c 20 6e 69 6c 2c 20 6e 69 6c 2c 20 6e 69 6c 2e  , nil, nil, nil.
1dab0 0a 2a 2a 20 49 66 20 74 68 65 20 69 53 74 61 72  .** If the iStar
1dac0 74 20 61 72 67 75 6d 65 6e 74 20 68 61 64 20 62  t argument had b
1dad0 65 65 6e 20 31 20 69 6e 73 74 65 61 64 20 6f 66  een 1 instead of
1dae0 20 32 2c 20 74 68 65 6e 20 74 68 65 20 72 65 73   2, then the res
1daf0 75 6c 74 0a 2a 2a 20 77 6f 75 6c 64 20 68 61 76  ult.** would hav
1db00 65 20 62 65 65 6e 3a 20 20 41 2c 20 6e 69 6c 2c  e been:  A, nil,
1db10 20 6e 69 6c 2c 20 6e 69 6c 2c 20 42 2e 20 20 54   nil, nil, B.  T
1db20 6f 20 70 72 65 70 65 6e 64 20 74 68 65 20 6e 65  o prepend the ne
1db30 77 20 73 6c 6f 74 73 2c 0a 2a 2a 20 74 68 65 20  w slots,.** the 
1db40 69 53 74 61 72 74 20 76 61 6c 75 65 20 77 6f 75  iStart value wou
1db50 6c 64 20 62 65 20 30 2e 20 20 54 68 65 20 72 65  ld be 0.  The re
1db60 73 75 6c 74 20 74 68 65 6e 20 77 6f 75 6c 64 0a  sult then would.
1db70 2a 2a 20 62 65 3a 20 6e 69 6c 2c 20 6e 69 6c 2c  ** be: nil, nil,
1db80 20 6e 69 6c 2c 20 41 2c 20 42 2e 0a 2a 2a 0a 2a   nil, A, B..**.*
1db90 2a 20 49 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c  * If a memory al
1dba0 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c 73 20 74  location fails t
1dbb0 68 65 20 53 72 63 4c 69 73 74 20 69 73 20 75 6e  he SrcList is un
1dbc0 63 68 61 6e 67 65 64 2e 20 20 54 68 65 0a 2a 2a  changed.  The.**
1dbd0 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
1dbe0 64 20 66 6c 61 67 20 77 69 6c 6c 20 62 65 20 73  d flag will be s
1dbf0 65 74 20 74 6f 20 74 72 75 65 2e 0a 2a 2f 0a 53  et to true..*/.S
1dc00 72 63 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 53  rcList *sqlite3S
1dc10 72 63 4c 69 73 74 45 6e 6c 61 72 67 65 28 0a 20  rcListEnlarge(. 
1dc20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20   sqlite3 *db,   
1dc30 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
1dc40 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 6e 6f  connection to no
1dc50 74 69 66 79 20 6f 66 20 4f 4f 4d 20 65 72 72 6f  tify of OOM erro
1dc60 72 73 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20  rs */.  SrcList 
1dc70 2a 70 53 72 63 2c 20 20 20 20 20 2f 2a 20 54 68  *pSrc,     /* Th
1dc80 65 20 53 72 63 4c 69 73 74 20 74 6f 20 62 65 20  e SrcList to be 
1dc90 65 6e 6c 61 72 67 65 64 20 2a 2f 0a 20 20 69 6e  enlarged */.  in
1dca0 74 20 6e 45 78 74 72 61 2c 20 20 20 20 20 20 20  t nExtra,       
1dcb0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6e 65   /* Number of ne
1dcc0 77 20 73 6c 6f 74 73 20 74 6f 20 61 64 64 20 74  w slots to add t
1dcd0 6f 20 70 53 72 63 2d 3e 61 5b 5d 20 2a 2f 0a 20  o pSrc->a[] */. 
1dce0 20 69 6e 74 20 69 53 74 61 72 74 20 20 20 20 20   int iStart     
1dcf0 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20      /* Index in 
1dd00 70 53 72 63 2d 3e 61 5b 5d 20 6f 66 20 66 69 72  pSrc->a[] of fir
1dd10 73 74 20 6e 65 77 20 73 6c 6f 74 20 2a 2f 0a 29  st new slot */.)
1dd20 7b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 2f 2a  {.  int i;..  /*
1dd30 20 53 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67   Sanity checking
1dd40 20 6f 6e 20 63 61 6c 6c 69 6e 67 20 70 61 72 61   on calling para
1dd50 6d 65 74 65 72 73 20 2a 2f 0a 20 20 61 73 73 65  meters */.  asse
1dd60 72 74 28 20 69 53 74 61 72 74 3e 3d 30 20 29 3b  rt( iStart>=0 );
1dd70 0a 20 20 61 73 73 65 72 74 28 20 6e 45 78 74 72  .  assert( nExtr
1dd80 61 3e 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74  a>=1 );.  assert
1dd90 28 20 70 53 72 63 21 3d 30 20 29 3b 0a 20 20 61  ( pSrc!=0 );.  a
1dda0 73 73 65 72 74 28 20 69 53 74 61 72 74 3c 3d 70  ssert( iStart<=p
1ddb0 53 72 63 2d 3e 6e 53 72 63 20 29 3b 0a 0a 20 20  Src->nSrc );..  
1ddc0 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 64 64 69  /* Allocate addi
1ddd0 74 69 6f 6e 61 6c 20 73 70 61 63 65 20 69 66 20  tional space if 
1dde0 6e 65 65 64 65 64 20 2a 2f 0a 20 20 69 66 28 20  needed */.  if( 
1ddf0 28 75 33 32 29 70 53 72 63 2d 3e 6e 53 72 63 2b  (u32)pSrc->nSrc+
1de00 6e 45 78 74 72 61 3e 70 53 72 63 2d 3e 6e 41 6c  nExtra>pSrc->nAl
1de10 6c 6f 63 20 29 7b 0a 20 20 20 20 53 72 63 4c 69  loc ){.    SrcLi
1de20 73 74 20 2a 70 4e 65 77 3b 0a 20 20 20 20 69 6e  st *pNew;.    in
1de30 74 20 6e 41 6c 6c 6f 63 20 3d 20 70 53 72 63 2d  t nAlloc = pSrc-
1de40 3e 6e 53 72 63 2b 6e 45 78 74 72 61 3b 0a 20 20  >nSrc+nExtra;.  
1de50 20 20 69 6e 74 20 6e 47 6f 74 3b 0a 20 20 20 20    int nGot;.    
1de60 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62  pNew = sqlite3Db
1de70 52 65 61 6c 6c 6f 63 28 64 62 2c 20 70 53 72 63  Realloc(db, pSrc
1de80 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1de90 20 73 69 7a 65 6f 66 28 2a 70 53 72 63 29 20 2b   sizeof(*pSrc) +
1dea0 20 28 6e 41 6c 6c 6f 63 2d 31 29 2a 73 69 7a 65   (nAlloc-1)*size
1deb0 6f 66 28 70 53 72 63 2d 3e 61 5b 30 5d 29 20 29  of(pSrc->a[0]) )
1dec0 3b 0a 20 20 20 20 69 66 28 20 70 4e 65 77 3d 3d  ;.    if( pNew==
1ded0 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  0 ){.      asser
1dee0 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  t( db->mallocFai
1def0 6c 65 64 20 29 3b 0a 20 20 20 20 20 20 72 65 74  led );.      ret
1df00 75 72 6e 20 70 53 72 63 3b 0a 20 20 20 20 7d 0a  urn pSrc;.    }.
1df10 20 20 20 20 70 53 72 63 20 3d 20 70 4e 65 77 3b      pSrc = pNew;
1df20 0a 20 20 20 20 6e 47 6f 74 20 3d 20 28 73 71 6c  .    nGot = (sql
1df30 69 74 65 33 44 62 4d 61 6c 6c 6f 63 53 69 7a 65  ite3DbMallocSize
1df40 28 64 62 2c 20 70 4e 65 77 29 20 2d 20 73 69 7a  (db, pNew) - siz
1df50 65 6f 66 28 2a 70 53 72 63 29 29 2f 73 69 7a 65  eof(*pSrc))/size
1df60 6f 66 28 70 53 72 63 2d 3e 61 5b 30 5d 29 2b 31  of(pSrc->a[0])+1
1df70 3b 0a 20 20 20 20 70 53 72 63 2d 3e 6e 41 6c 6c  ;.    pSrc->nAll
1df80 6f 63 20 3d 20 6e 47 6f 74 3b 0a 20 20 7d 0a 0a  oc = nGot;.  }..
1df90 20 20 2f 2a 20 4d 6f 76 65 20 65 78 69 73 74 69    /* Move existi
1dfa0 6e 67 20 73 6c 6f 74 73 20 74 68 61 74 20 63 6f  ng slots that co
1dfb0 6d 65 20 61 66 74 65 72 20 74 68 65 20 6e 65 77  me after the new
1dfc0 6c 79 20 69 6e 73 65 72 74 65 64 20 73 6c 6f 74  ly inserted slot
1dfd0 73 0a 20 20 2a 2a 20 6f 75 74 20 6f 66 20 74 68  s.  ** out of th
1dfe0 65 20 77 61 79 20 2a 2f 0a 20 20 66 6f 72 28 69  e way */.  for(i
1dff0 3d 70 53 72 63 2d 3e 6e 53 72 63 2d 31 3b 20 69  =pSrc->nSrc-1; i
1e000 3e 3d 69 53 74 61 72 74 3b 20 69 2d 2d 29 7b 0a  >=iStart; i--){.
1e010 20 20 20 20 70 53 72 63 2d 3e 61 5b 69 2b 6e 45      pSrc->a[i+nE
1e020 78 74 72 61 5d 20 3d 20 70 53 72 63 2d 3e 61 5b  xtra] = pSrc->a[
1e030 69 5d 3b 0a 20 20 7d 0a 20 20 70 53 72 63 2d 3e  i];.  }.  pSrc->
1e040 6e 53 72 63 20 2b 3d 20 6e 45 78 74 72 61 3b 0a  nSrc += nExtra;.
1e050 0a 20 20 2f 2a 20 5a 65 72 6f 20 74 68 65 20 6e  .  /* Zero the n
1e060 65 77 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 73  ewly allocated s
1e070 6c 6f 74 73 20 2a 2f 0a 20 20 6d 65 6d 73 65 74  lots */.  memset
1e080 28 26 70 53 72 63 2d 3e 61 5b 69 53 74 61 72 74  (&pSrc->a[iStart
1e090 5d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 53 72  ], 0, sizeof(pSr
1e0a0 63 2d 3e 61 5b 30 5d 29 2a 6e 45 78 74 72 61 29  c->a[0])*nExtra)
1e0b0 3b 0a 20 20 66 6f 72 28 69 3d 69 53 74 61 72 74  ;.  for(i=iStart
1e0c0 3b 20 69 3c 69 53 74 61 72 74 2b 6e 45 78 74 72  ; i<iStart+nExtr
1e0d0 61 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70 53 72  a; i++){.    pSr
1e0e0 63 2d 3e 61 5b 69 5d 2e 69 43 75 72 73 6f 72 20  c->a[i].iCursor 
1e0f0 3d 20 2d 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  = -1;.  }..  /* 
1e100 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  Return a pointer
1e110 20 74 6f 20 74 68 65 20 65 6e 6c 61 72 67 65 64   to the enlarged
1e120 20 53 72 63 4c 69 73 74 20 2a 2f 0a 20 20 72 65   SrcList */.  re
1e130 74 75 72 6e 20 70 53 72 63 3b 0a 7d 0a 0a 0a 2f  turn pSrc;.}.../
1e140 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 61 20 6e 65  *.** Append a ne
1e150 77 20 74 61 62 6c 65 20 6e 61 6d 65 20 74 6f 20  w table name to 
1e160 74 68 65 20 67 69 76 65 6e 20 53 72 63 4c 69 73  the given SrcLis
1e170 74 2e 20 20 43 72 65 61 74 65 20 61 20 6e 65 77  t.  Create a new
1e180 20 53 72 63 4c 69 73 74 20 69 66 0a 2a 2a 20 6e   SrcList if.** n
1e190 65 65 64 20 62 65 2e 20 20 41 20 6e 65 77 20 65  eed be.  A new e
1e1a0 6e 74 72 79 20 69 73 20 63 72 65 61 74 65 64 20  ntry is created 
1e1b0 69 6e 20 74 68 65 20 53 72 63 4c 69 73 74 20 65  in the SrcList e
1e1c0 76 65 6e 20 69 66 20 70 54 61 62 6c 65 20 69 73  ven if pTable is
1e1d0 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 41 20 53   NULL..**.** A S
1e1e0 72 63 4c 69 73 74 20 69 73 20 72 65 74 75 72 6e  rcList is return
1e1f0 65 64 2c 20 6f 72 20 4e 55 4c 4c 20 69 66 20 74  ed, or NULL if t
1e200 68 65 72 65 20 69 73 20 61 6e 20 4f 4f 4d 20 65  here is an OOM e
1e210 72 72 6f 72 2e 20 20 54 68 65 20 72 65 74 75 72  rror.  The retur
1e220 6e 65 64 0a 2a 2a 20 53 72 63 4c 69 73 74 20 6d  ned.** SrcList m
1e230 69 67 68 74 20 62 65 20 74 68 65 20 73 61 6d 65  ight be the same
1e240 20 61 73 20 74 68 65 20 53 72 63 4c 69 73 74 20   as the SrcList 
1e250 74 68 61 74 20 77 61 73 20 69 6e 70 75 74 20 6f  that was input o
1e260 72 20 69 74 20 6d 69 67 68 74 20 62 65 0a 2a 2a  r it might be.**
1e270 20 61 20 6e 65 77 20 6f 6e 65 2e 20 20 49 66 20   a new one.  If 
1e280 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 20 64 6f 65  an OOM error doe
1e290 73 20 6f 63 63 75 72 73 2c 20 74 68 65 6e 20 74  s occurs, then t
1e2a0 68 65 20 70 72 69 6f 72 20 76 61 6c 75 65 20 6f  he prior value o
1e2b0 66 20 70 4c 69 73 74 0a 2a 2a 20 74 68 61 74 20  f pList.** that 
1e2c0 69 73 20 69 6e 70 75 74 20 74 6f 20 74 68 69 73  is input to this
1e2d0 20 72 6f 75 74 69 6e 65 20 69 73 20 61 75 74 6f   routine is auto
1e2e0 6d 61 74 69 63 61 6c 6c 79 20 66 72 65 65 64 2e  matically freed.
1e2f0 0a 2a 2a 0a 2a 2a 20 49 66 20 70 44 61 74 61 62  .**.** If pDatab
1e300 61 73 65 20 69 73 20 6e 6f 74 20 6e 75 6c 6c 2c  ase is not null,
1e310 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74   it means that t
1e320 68 65 20 74 61 62 6c 65 20 68 61 73 20 61 6e 20  he table has an 
1e330 6f 70 74 69 6f 6e 61 6c 0a 2a 2a 20 64 61 74 61  optional.** data
1e340 62 61 73 65 20 6e 61 6d 65 20 70 72 65 66 69 78  base name prefix
1e350 2e 20 20 4c 69 6b 65 20 74 68 69 73 3a 20 20 22  .  Like this:  "
1e360 64 61 74 61 62 61 73 65 2e 74 61 62 6c 65 22 2e  database.table".
1e370 20 20 54 68 65 20 70 44 61 74 61 62 61 73 65 0a    The pDatabase.
1e380 2a 2a 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65  ** points to the
1e390 20 74 61 62 6c 65 20 6e 61 6d 65 20 61 6e 64 20   table name and 
1e3a0 74 68 65 20 70 54 61 62 6c 65 20 70 6f 69 6e 74  the pTable point
1e3b0 73 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  s to the databas
1e3c0 65 20 6e 61 6d 65 2e 0a 2a 2a 20 54 68 65 20 53  e name..** The S
1e3d0 72 63 4c 69 73 74 2e 61 5b 5d 2e 7a 4e 61 6d 65  rcList.a[].zName
1e3e0 20 66 69 65 6c 64 20 69 73 20 66 69 6c 6c 65 64   field is filled
1e3f0 20 77 69 74 68 20 74 68 65 20 74 61 62 6c 65 20   with the table 
1e400 6e 61 6d 65 20 77 68 69 63 68 20 6d 69 67 68 74  name which might
1e410 0a 2a 2a 20 63 6f 6d 65 20 66 72 6f 6d 20 70 54  .** come from pT
1e420 61 62 6c 65 20 28 69 66 20 70 44 61 74 61 62 61  able (if pDataba
1e430 73 65 20 69 73 20 4e 55 4c 4c 29 20 6f 72 20 66  se is NULL) or f
1e440 72 6f 6d 20 70 44 61 74 61 62 61 73 65 2e 20 20  rom pDatabase.  
1e450 0a 2a 2a 20 53 72 63 4c 69 73 74 2e 61 5b 5d 2e  .** SrcList.a[].
1e460 7a 44 61 74 61 62 61 73 65 20 69 73 20 66 69 6c  zDatabase is fil
1e470 6c 65 64 20 77 69 74 68 20 74 68 65 20 64 61 74  led with the dat
1e480 61 62 61 73 65 20 6e 61 6d 65 20 66 72 6f 6d 20  abase name from 
1e490 70 54 61 62 6c 65 2c 0a 2a 2a 20 6f 72 20 77 69  pTable,.** or wi
1e4a0 74 68 20 4e 55 4c 4c 20 69 66 20 6e 6f 20 64 61  th NULL if no da
1e4b0 74 61 62 61 73 65 20 69 73 20 73 70 65 63 69 66  tabase is specif
1e4c0 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 6f 74  ied..**.** In ot
1e4d0 68 65 72 20 77 6f 72 64 73 2c 20 69 66 20 63 61  her words, if ca
1e4e0 6c 6c 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a  ll like this:.**
1e4f0 0a 2a 2a 20 20 20 20 20 20 20 20 20 73 71 6c 69  .**         sqli
1e500 74 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64  te3SrcListAppend
1e510 28 44 2c 41 2c 42 2c 30 29 3b 0a 2a 2a 0a 2a 2a  (D,A,B,0);.**.**
1e520 20 54 68 65 6e 20 42 20 69 73 20 61 20 74 61 62   Then B is a tab
1e530 6c 65 20 6e 61 6d 65 20 61 6e 64 20 74 68 65 20  le name and the 
1e540 64 61 74 61 62 61 73 65 20 6e 61 6d 65 20 69 73  database name is
1e550 20 75 6e 73 70 65 63 69 66 69 65 64 2e 20 20 49   unspecified.  I
1e560 66 20 63 61 6c 6c 65 64 0a 2a 2a 20 6c 69 6b 65  f called.** like
1e570 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20   this:.**.**    
1e580 20 20 20 20 20 73 71 6c 69 74 65 33 53 72 63 4c       sqlite3SrcL
1e590 69 73 74 41 70 70 65 6e 64 28 44 2c 41 2c 42 2c  istAppend(D,A,B,
1e5a0 43 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 43  C);.**.** Then C
1e5b0 20 69 73 20 74 68 65 20 74 61 62 6c 65 20 6e 61   is the table na
1e5c0 6d 65 20 61 6e 64 20 42 20 69 73 20 74 68 65 20  me and B is the 
1e5d0 64 61 74 61 62 61 73 65 20 6e 61 6d 65 2e 20 20  database name.  
1e5e0 49 66 20 43 20 69 73 20 64 65 66 69 6e 65 64 0a  If C is defined.
1e5f0 2a 2a 20 74 68 65 6e 20 73 6f 20 69 73 20 42 2e  ** then so is B.
1e600 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73    In other words
1e610 2c 20 77 65 20 6e 65 76 65 72 20 68 61 76 65 20  , we never have 
1e620 61 20 63 61 73 65 20 77 68 65 72 65 3a 0a 2a 2a  a case where:.**
1e630 0a 2a 2a 20 20 20 20 20 20 20 20 20 73 71 6c 69  .**         sqli
1e640 74 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64  te3SrcListAppend
1e650 28 44 2c 41 2c 30 2c 43 29 3b 0a 2a 2a 0a 2a 2a  (D,A,0,C);.**.**
1e660 20 42 6f 74 68 20 70 54 61 62 6c 65 20 61 6e 64   Both pTable and
1e670 20 70 44 61 74 61 62 61 73 65 20 61 72 65 20 61   pDatabase are a
1e680 73 73 75 6d 65 64 20 74 6f 20 62 65 20 71 75 6f  ssumed to be quo
1e690 74 65 64 2e 20 20 54 68 65 79 20 61 72 65 20 64  ted.  They are d
1e6a0 65 71 75 6f 74 65 64 0a 2a 2a 20 62 65 66 6f 72  equoted.** befor
1e6b0 65 20 62 65 69 6e 67 20 61 64 64 65 64 20 74 6f  e being added to
1e6c0 20 74 68 65 20 53 72 63 4c 69 73 74 2e 0a 2a 2f   the SrcList..*/
1e6d0 0a 53 72 63 4c 69 73 74 20 2a 73 71 6c 69 74 65  .SrcList *sqlite
1e6e0 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64 28 0a  3SrcListAppend(.
1e6f0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20    sqlite3 *db,  
1e700 20 20 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74        /* Connect
1e710 69 6f 6e 20 74 6f 20 6e 6f 74 69 66 79 20 6f 66  ion to notify of
1e720 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65 73   malloc failures
1e730 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70   */.  SrcList *p
1e740 4c 69 73 74 2c 20 20 20 20 20 2f 2a 20 41 70 70  List,     /* App
1e750 65 6e 64 20 74 6f 20 74 68 69 73 20 53 72 63 4c  end to this SrcL
1e760 69 73 74 2e 20 4e 55 4c 4c 20 63 72 65 61 74 65  ist. NULL create
1e770 73 20 61 20 6e 65 77 20 53 72 63 4c 69 73 74 20  s a new SrcList 
1e780 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 54 61 62  */.  Token *pTab
1e790 6c 65 2c 20 20 20 20 20 20 2f 2a 20 54 61 62 6c  le,      /* Tabl
1e7a0 65 20 74 6f 20 61 70 70 65 6e 64 20 2a 2f 0a 20  e to append */. 
1e7b0 20 54 6f 6b 65 6e 20 2a 70 44 61 74 61 62 61 73   Token *pDatabas
1e7c0 65 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65  e    /* Database
1e7d0 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 2a 2f   of the table */
1e7e0 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 53 72 63  .){.  struct Src
1e7f0 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
1e800 3b 0a 20 20 61 73 73 65 72 74 28 20 70 44 61 74  ;.  assert( pDat
1e810 61 62 61 73 65 3d 3d 30 20 7c 7c 20 70 54 61 62  abase==0 || pTab
1e820 6c 65 21 3d 30 20 29 3b 20 20 2f 2a 20 43 61 6e  le!=0 );  /* Can
1e830 6e 6f 74 20 68 61 76 65 20 43 20 77 69 74 68 6f  not have C witho
1e840 75 74 20 42 20 2a 2f 0a 20 20 61 73 73 65 72 74  ut B */.  assert
1e850 28 20 64 62 21 3d 30 20 29 3b 0a 20 20 69 66 28  ( db!=0 );.  if(
1e860 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20   pList==0 ){.   
1e870 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33   pList = sqlite3
1e880 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62  DbMallocRawNN(db
1e890 2c 20 73 69 7a 65 6f 66 28 53 72 63 4c 69 73 74  , sizeof(SrcList
1e8a0 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69  ) );.    if( pLi
1e8b0 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  st==0 ) return 0
1e8c0 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 6e 41 6c  ;.    pList->nAl
1e8d0 6c 6f 63 20 3d 20 31 3b 0a 20 20 20 20 70 4c 69  loc = 1;.    pLi
1e8e0 73 74 2d 3e 6e 53 72 63 20 3d 20 30 3b 0a 20 20  st->nSrc = 0;.  
1e8f0 7d 0a 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69  }.  pList = sqli
1e900 74 65 33 53 72 63 4c 69 73 74 45 6e 6c 61 72 67  te3SrcListEnlarg
1e910 65 28 64 62 2c 20 70 4c 69 73 74 2c 20 31 2c 20  e(db, pList, 1, 
1e920 70 4c 69 73 74 2d 3e 6e 53 72 63 29 3b 0a 20 20  pList->nSrc);.  
1e930 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
1e940 69 6c 65 64 20 29 7b 0a 20 20 20 20 73 71 6c 69  iled ){.    sqli
1e950 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65  te3SrcListDelete
1e960 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a 20 20 20  (db, pList);.   
1e970 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
1e980 20 70 49 74 65 6d 20 3d 20 26 70 4c 69 73 74 2d   pItem = &pList-
1e990 3e 61 5b 70 4c 69 73 74 2d 3e 6e 53 72 63 2d 31  >a[pList->nSrc-1
1e9a0 5d 3b 0a 20 20 69 66 28 20 70 44 61 74 61 62 61  ];.  if( pDataba
1e9b0 73 65 20 26 26 20 70 44 61 74 61 62 61 73 65 2d  se && pDatabase-
1e9c0 3e 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 70 44 61  >z==0 ){.    pDa
1e9d0 74 61 62 61 73 65 20 3d 20 30 3b 0a 20 20 7d 0a  tabase = 0;.  }.
1e9e0 20 20 69 66 28 20 70 44 61 74 61 62 61 73 65 20    if( pDatabase 
1e9f0 29 7b 0a 20 20 20 20 54 6f 6b 65 6e 20 2a 70 54  ){.    Token *pT
1ea00 65 6d 70 20 3d 20 70 44 61 74 61 62 61 73 65 3b  emp = pDatabase;
1ea10 0a 20 20 20 20 70 44 61 74 61 62 61 73 65 20 3d  .    pDatabase =
1ea20 20 70 54 61 62 6c 65 3b 0a 20 20 20 20 70 54 61   pTable;.    pTa
1ea30 62 6c 65 20 3d 20 70 54 65 6d 70 3b 0a 20 20 7d  ble = pTemp;.  }
1ea40 0a 20 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20  .  pItem->zName 
1ea50 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f  = sqlite3NameFro
1ea60 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 54 61 62 6c  mToken(db, pTabl
1ea70 65 29 3b 0a 20 20 70 49 74 65 6d 2d 3e 7a 44 61  e);.  pItem->zDa
1ea80 74 61 62 61 73 65 20 3d 20 73 71 6c 69 74 65 33  tabase = sqlite3
1ea90 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62  NameFromToken(db
1eaa0 2c 20 70 44 61 74 61 62 61 73 65 29 3b 0a 20 20  , pDatabase);.  
1eab0 72 65 74 75 72 6e 20 70 4c 69 73 74 3b 0a 7d 0a  return pList;.}.
1eac0 0a 2f 2a 0a 2a 2a 20 41 73 73 69 67 6e 20 56 64  ./*.** Assign Vd
1ead0 62 65 43 75 72 73 6f 72 20 69 6e 64 65 78 20 6e  beCursor index n
1eae0 75 6d 62 65 72 73 20 74 6f 20 61 6c 6c 20 74 61  umbers to all ta
1eaf0 62 6c 65 73 20 69 6e 20 61 20 53 72 63 4c 69 73  bles in a SrcLis
1eb00 74 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  t.*/.void sqlite
1eb10 33 53 72 63 4c 69 73 74 41 73 73 69 67 6e 43 75  3SrcListAssignCu
1eb20 72 73 6f 72 73 28 50 61 72 73 65 20 2a 70 50 61  rsors(Parse *pPa
1eb30 72 73 65 2c 20 53 72 63 4c 69 73 74 20 2a 70 4c  rse, SrcList *pL
1eb40 69 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  ist){.  int i;. 
1eb50 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
1eb60 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 61  item *pItem;.  a
1eb70 73 73 65 72 74 28 70 4c 69 73 74 20 7c 7c 20 70  ssert(pList || p
1eb80 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  Parse->db->mallo
1eb90 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 69 66 28  cFailed );.  if(
1eba0 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 66 6f   pList ){.    fo
1ebb0 72 28 69 3d 30 2c 20 70 49 74 65 6d 3d 70 4c 69  r(i=0, pItem=pLi
1ebc0 73 74 2d 3e 61 3b 20 69 3c 70 4c 69 73 74 2d 3e  st->a; i<pList->
1ebd0 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 49 74 65 6d  nSrc; i++, pItem
1ebe0 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  ++){.      if( p
1ebf0 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3e 3d 30  Item->iCursor>=0
1ec00 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
1ec10 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 20 3d  pItem->iCursor =
1ec20 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b   pParse->nTab++;
1ec30 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65 6d  .      if( pItem
1ec40 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20  ->pSelect ){.   
1ec50 20 20 20 20 20 73 71 6c 69 74 65 33 53 72 63 4c       sqlite3SrcL
1ec60 69 73 74 41 73 73 69 67 6e 43 75 72 73 6f 72 73  istAssignCursors
1ec70 28 70 50 61 72 73 65 2c 20 70 49 74 65 6d 2d 3e  (pParse, pItem->
1ec80 70 53 65 6c 65 63 74 2d 3e 70 53 72 63 29 3b 0a  pSelect->pSrc);.
1ec90 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1eca0 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74  }.}../*.** Delet
1ecb0 65 20 61 6e 20 65 6e 74 69 72 65 20 53 72 63 4c  e an entire SrcL
1ecc0 69 73 74 20 69 6e 63 6c 75 64 69 6e 67 20 61 6c  ist including al
1ecd0 6c 20 69 74 73 20 73 75 62 73 74 72 75 63 74 75  l its substructu
1ece0 72 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  re..*/.void sqli
1ecf0 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65  te3SrcListDelete
1ed00 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 53 72  (sqlite3 *db, Sr
1ed10 63 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20  cList *pList){. 
1ed20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74   int i;.  struct
1ed30 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
1ed40 49 74 65 6d 3b 0a 20 20 69 66 28 20 70 4c 69 73  Item;.  if( pLis
1ed50 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  t==0 ) return;. 
1ed60 20 66 6f 72 28 70 49 74 65 6d 3d 70 4c 69 73 74   for(pItem=pList
1ed70 2d 3e 61 2c 20 69 3d 30 3b 20 69 3c 70 4c 69 73  ->a, i=0; i<pLis
1ed80 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 49  t->nSrc; i++, pI
1ed90 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69  tem++){.    sqli
1eda0 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 49  te3DbFree(db, pI
1edb0 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 29 3b  tem->zDatabase);
1edc0 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
1edd0 65 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 7a 4e  ee(db, pItem->zN
1ede0 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ame);.    sqlite
1edf0 33 44 62 46 72 65 65 28 64 62 2c 20 70 49 74 65  3DbFree(db, pIte
1ee00 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20 20 20 20  m->zAlias);.    
1ee10 69 66 28 20 70 49 74 65 6d 2d 3e 66 67 2e 69 73  if( pItem->fg.is
1ee20 49 6e 64 65 78 65 64 42 79 20 29 20 73 71 6c 69  IndexedBy ) sqli
1ee30 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 49  te3DbFree(db, pI
1ee40 74 65 6d 2d 3e 75 31 2e 7a 49 6e 64 65 78 65 64  tem->u1.zIndexed
1ee50 42 79 29 3b 0a 20 20 20 20 69 66 28 20 70 49 74  By);.    if( pIt
1ee60 65 6d 2d 3e 66 67 2e 69 73 54 61 62 46 75 6e 63  em->fg.isTabFunc
1ee70 20 29 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69   ) sqlite3ExprLi
1ee80 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 49 74  stDelete(db, pIt
1ee90 65 6d 2d 3e 75 31 2e 70 46 75 6e 63 41 72 67 29  em->u1.pFuncArg)
1eea0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 6c  ;.    sqlite3Del
1eeb0 65 74 65 54 61 62 6c 65 28 64 62 2c 20 70 49 74  eteTable(db, pIt
1eec0 65 6d 2d 3e 70 54 61 62 29 3b 0a 20 20 20 20 73  em->pTab);.    s
1eed0 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65  qlite3SelectDele
1eee0 74 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 70 53  te(db, pItem->pS
1eef0 65 6c 65 63 74 29 3b 0a 20 20 20 20 73 71 6c 69  elect);.    sqli
1ef00 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62  te3ExprDelete(db
1ef10 2c 20 70 49 74 65 6d 2d 3e 70 4f 6e 29 3b 0a 20  , pItem->pOn);. 
1ef20 20 20 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74     sqlite3IdList
1ef30 44 65 6c 65 74 65 28 64 62 2c 20 70 49 74 65 6d  Delete(db, pItem
1ef40 2d 3e 70 55 73 69 6e 67 29 3b 0a 20 20 7d 0a 20  ->pUsing);.  }. 
1ef50 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
1ef60 62 2c 20 70 4c 69 73 74 29 3b 0a 7d 0a 0a 2f 2a  b, pList);.}../*
1ef70 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
1ef80 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68   is called by th
1ef90 65 20 70 61 72 73 65 72 20 74 6f 20 61 64 64 20  e parser to add 
1efa0 61 20 6e 65 77 20 74 65 72 6d 20 74 6f 20 74 68  a new term to th
1efb0 65 0a 2a 2a 20 65 6e 64 20 6f 66 20 61 20 67 72  e.** end of a gr
1efc0 6f 77 69 6e 67 20 46 52 4f 4d 20 63 6c 61 75 73  owing FROM claus
1efd0 65 2e 20 20 54 68 65 20 22 70 22 20 70 61 72 61  e.  The "p" para
1efe0 6d 65 74 65 72 20 69 73 20 74 68 65 20 70 61 72  meter is the par
1eff0 74 20 6f 66 0a 2a 2a 20 74 68 65 20 46 52 4f 4d  t of.** the FROM
1f000 20 63 6c 61 75 73 65 20 74 68 61 74 20 68 61 73   clause that has
1f010 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 63 6f   already been co
1f020 6e 73 74 72 75 63 74 65 64 2e 20 20 22 70 22 20  nstructed.  "p" 
1f030 69 73 20 4e 55 4c 4c 0a 2a 2a 20 69 66 20 74 68  is NULL.** if th
1f040 69 73 20 69 73 20 74 68 65 20 66 69 72 73 74 20  is is the first 
1f050 74 65 72 6d 20 6f 66 20 74 68 65 20 46 52 4f 4d  term of the FROM
1f060 20 63 6c 61 75 73 65 2e 20 20 70 54 61 62 6c 65   clause.  pTable
1f070 20 61 6e 64 20 70 44 61 74 61 62 61 73 65 0a 2a   and pDatabase.*
1f080 2a 20 61 72 65 20 74 68 65 20 6e 61 6d 65 20 6f  * are the name o
1f090 66 20 74 68 65 20 74 61 62 6c 65 20 61 6e 64 20  f the table and 
1f0a0 64 61 74 61 62 61 73 65 20 6e 61 6d 65 64 20 69  database named i
1f0b0 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
1f0c0 65 20 74 65 72 6d 2e 0a 2a 2a 20 70 44 61 74 61  e term..** pData
1f0d0 62 61 73 65 20 69 73 20 4e 55 4c 4c 20 69 66 20  base is NULL if 
1f0e0 74 68 65 20 64 61 74 61 62 61 73 65 20 6e 61 6d  the database nam
1f0f0 65 20 71 75 61 6c 69 66 69 65 72 20 69 73 20 6d  e qualifier is m
1f100 69 73 73 69 6e 67 20 2d 20 74 68 65 0a 2a 2a 20  issing - the.** 
1f110 75 73 75 61 6c 20 63 61 73 65 2e 20 20 49 66 20  usual case.  If 
1f120 74 68 65 20 74 65 72 6d 20 68 61 73 20 61 6e 20  the term has an 
1f130 61 6c 69 61 73 2c 20 74 68 65 6e 20 70 41 6c 69  alias, then pAli
1f140 61 73 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65  as points to the
1f150 0a 2a 2a 20 61 6c 69 61 73 20 74 6f 6b 65 6e 2e  .** alias token.
1f160 20 20 49 66 20 74 68 65 20 74 65 72 6d 20 69 73    If the term is
1f170 20 61 20 73 75 62 71 75 65 72 79 2c 20 74 68 65   a subquery, the
1f180 6e 20 70 53 75 62 71 75 65 72 79 20 69 73 20 74  n pSubquery is t
1f190 68 65 0a 2a 2a 20 53 45 4c 45 43 54 20 73 74 61  he.** SELECT sta
1f1a0 74 65 6d 65 6e 74 20 74 68 61 74 20 74 68 65 20  tement that the 
1f1b0 73 75 62 71 75 65 72 79 20 65 6e 63 6f 64 65 73  subquery encodes
1f1c0 2e 20 20 54 68 65 20 70 54 61 62 6c 65 20 61 6e  .  The pTable an
1f1d0 64 0a 2a 2a 20 70 44 61 74 61 62 61 73 65 20 70  d.** pDatabase p
1f1e0 61 72 61 6d 65 74 65 72 73 20 61 72 65 20 4e 55  arameters are NU
1f1f0 4c 4c 20 66 6f 72 20 73 75 62 71 75 65 72 69 65  LL for subquerie
1f200 73 2e 20 20 54 68 65 20 70 4f 6e 20 61 6e 64 20  s.  The pOn and 
1f210 70 55 73 69 6e 67 0a 2a 2a 20 70 61 72 61 6d 65  pUsing.** parame
1f220 74 65 72 73 20 61 72 65 20 74 68 65 20 63 6f 6e  ters are the con
1f230 74 65 6e 74 20 6f 66 20 74 68 65 20 4f 4e 20 61  tent of the ON a
1f240 6e 64 20 55 53 49 4e 47 20 63 6c 61 75 73 65 73  nd USING clauses
1f250 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ..**.** Return a
1f260 20 6e 65 77 20 53 72 63 4c 69 73 74 20 77 68 69   new SrcList whi
1f270 63 68 20 65 6e 63 6f 64 65 73 20 69 73 20 74 68  ch encodes is th
1f280 65 20 46 52 4f 4d 20 77 69 74 68 20 74 68 65 20  e FROM with the 
1f290 6e 65 77 0a 2a 2a 20 74 65 72 6d 20 61 64 64 65  new.** term adde
1f2a0 64 2e 0a 2a 2f 0a 53 72 63 4c 69 73 74 20 2a 73  d..*/.SrcList *s
1f2b0 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70 70  qlite3SrcListApp
1f2c0 65 6e 64 46 72 6f 6d 54 65 72 6d 28 0a 20 20 50  endFromTerm(.  P
1f2d0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
1f2e0 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
1f2f0 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53  g context */.  S
1f300 72 63 4c 69 73 74 20 2a 70 2c 20 20 20 20 20 20  rcList *p,      
1f310 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6c 65         /* The le
1f320 66 74 20 70 61 72 74 20 6f 66 20 74 68 65 20 46  ft part of the F
1f330 52 4f 4d 20 63 6c 61 75 73 65 20 61 6c 72 65 61  ROM clause alrea
1f340 64 79 20 73 65 65 6e 20 2a 2f 0a 20 20 54 6f 6b  dy seen */.  Tok
1f350 65 6e 20 2a 70 54 61 62 6c 65 2c 20 20 20 20 20  en *pTable,     
1f360 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
1f370 74 68 65 20 74 61 62 6c 65 20 74 6f 20 61 64 64  the table to add
1f380 20 74 6f 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   to the FROM cla
1f390 75 73 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  use */.  Token *
1f3a0 70 44 61 74 61 62 61 73 65 2c 20 20 20 20 20 20  pDatabase,      
1f3b0 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
1f3c0 64 61 74 61 62 61 73 65 20 63 6f 6e 74 61 69 6e  database contain
1f3d0 69 6e 67 20 70 54 61 62 6c 65 20 2a 2f 0a 20 20  ing pTable */.  
1f3e0 54 6f 6b 65 6e 20 2a 70 41 6c 69 61 73 2c 20 20  Token *pAlias,  
1f3f0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72          /* The r
1f400 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20 6f  ight-hand side o
1f410 66 20 74 68 65 20 41 53 20 73 75 62 65 78 70 72  f the AS subexpr
1f420 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 53 65 6c 65  ession */.  Sele
1f430 63 74 20 2a 70 53 75 62 71 75 65 72 79 2c 20 20  ct *pSubquery,  
1f440 20 20 20 20 2f 2a 20 41 20 73 75 62 71 75 65 72      /* A subquer
1f450 79 20 75 73 65 64 20 69 6e 20 70 6c 61 63 65 20  y used in place 
1f460 6f 66 20 61 20 74 61 62 6c 65 20 6e 61 6d 65 20  of a table name 
1f470 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4f 6e 2c 20  */.  Expr *pOn, 
1f480 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1f490 54 68 65 20 4f 4e 20 63 6c 61 75 73 65 20 6f 66  The ON clause of
1f4a0 20 61 20 6a 6f 69 6e 20 2a 2f 0a 20 20 49 64 4c   a join */.  IdL
1f4b0 69 73 74 20 2a 70 55 73 69 6e 67 20 20 20 20 20  ist *pUsing     
1f4c0 20 20 20 20 20 2f 2a 20 54 68 65 20 55 53 49 4e       /* The USIN
1f4d0 47 20 63 6c 61 75 73 65 20 6f 66 20 61 20 6a 6f  G clause of a jo
1f4e0 69 6e 20 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63  in */.){.  struc
1f4f0 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
1f500 70 49 74 65 6d 3b 0a 20 20 73 71 6c 69 74 65 33  pItem;.  sqlite3
1f510 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
1f520 62 3b 0a 20 20 69 66 28 20 21 70 20 26 26 20 28  b;.  if( !p && (
1f530 70 4f 6e 20 7c 7c 20 70 55 73 69 6e 67 29 20 29  pOn || pUsing) )
1f540 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
1f550 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 61  orMsg(pParse, "a
1f560 20 4a 4f 49 4e 20 63 6c 61 75 73 65 20 69 73 20   JOIN clause is 
1f570 72 65 71 75 69 72 65 64 20 62 65 66 6f 72 65 20  required before 
1f580 25 73 22 2c 20 0a 20 20 20 20 20 20 28 70 4f 6e  %s", .      (pOn
1f590 20 3f 20 22 4f 4e 22 20 3a 20 22 55 53 49 4e 47   ? "ON" : "USING
1f5a0 22 29 0a 20 20 20 20 29 3b 0a 20 20 20 20 67 6f  ").    );.    go
1f5b0 74 6f 20 61 70 70 65 6e 64 5f 66 72 6f 6d 5f 65  to append_from_e
1f5c0 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 70 20 3d 20  rror;.  }.  p = 
1f5d0 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70  sqlite3SrcListAp
1f5e0 70 65 6e 64 28 64 62 2c 20 70 2c 20 70 54 61 62  pend(db, p, pTab
1f5f0 6c 65 2c 20 70 44 61 74 61 62 61 73 65 29 3b 0a  le, pDatabase);.
1f600 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20 4e 45    if( p==0 || NE
1f610 56 45 52 28 70 2d 3e 6e 53 72 63 3d 3d 30 29 20  VER(p->nSrc==0) 
1f620 29 7b 0a 20 20 20 20 67 6f 74 6f 20 61 70 70 65  ){.    goto appe
1f630 6e 64 5f 66 72 6f 6d 5f 65 72 72 6f 72 3b 0a 20  nd_from_error;. 
1f640 20 7d 0a 20 20 70 49 74 65 6d 20 3d 20 26 70 2d   }.  pItem = &p-
1f650 3e 61 5b 70 2d 3e 6e 53 72 63 2d 31 5d 3b 0a 20  >a[p->nSrc-1];. 
1f660 20 61 73 73 65 72 74 28 20 70 41 6c 69 61 73 21   assert( pAlias!
1f670 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 41 6c 69  =0 );.  if( pAli
1f680 61 73 2d 3e 6e 20 29 7b 0a 20 20 20 20 70 49 74  as->n ){.    pIt
1f690 65 6d 2d 3e 7a 41 6c 69 61 73 20 3d 20 73 71 6c  em->zAlias = sql
1f6a0 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65  ite3NameFromToke
1f6b0 6e 28 64 62 2c 20 70 41 6c 69 61 73 29 3b 0a 20  n(db, pAlias);. 
1f6c0 20 7d 0a 20 20 70 49 74 65 6d 2d 3e 70 53 65 6c   }.  pItem->pSel
1f6d0 65 63 74 20 3d 20 70 53 75 62 71 75 65 72 79 3b  ect = pSubquery;
1f6e0 0a 20 20 70 49 74 65 6d 2d 3e 70 4f 6e 20 3d 20  .  pItem->pOn = 
1f6f0 70 4f 6e 3b 0a 20 20 70 49 74 65 6d 2d 3e 70 55  pOn;.  pItem->pU
1f700 73 69 6e 67 20 3d 20 70 55 73 69 6e 67 3b 0a 20  sing = pUsing;. 
1f710 20 72 65 74 75 72 6e 20 70 3b 0a 0a 20 61 70 70   return p;.. app
1f720 65 6e 64 5f 66 72 6f 6d 5f 65 72 72 6f 72 3a 0a  end_from_error:.
1f730 20 20 61 73 73 65 72 74 28 20 70 3d 3d 30 20 29    assert( p==0 )
1f740 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44  ;.  sqlite3ExprD
1f750 65 6c 65 74 65 28 64 62 2c 20 70 4f 6e 29 3b 0a  elete(db, pOn);.
1f760 20 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44    sqlite3IdListD
1f770 65 6c 65 74 65 28 64 62 2c 20 70 55 73 69 6e 67  elete(db, pUsing
1f780 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65  );.  sqlite3Sele
1f790 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70 53 75  ctDelete(db, pSu
1f7a0 62 71 75 65 72 79 29 3b 0a 20 20 72 65 74 75 72  bquery);.  retur
1f7b0 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64  n 0;.}../*.** Ad
1f7c0 64 20 61 6e 20 49 4e 44 45 58 45 44 20 42 59 20  d an INDEXED BY 
1f7d0 6f 72 20 4e 4f 54 20 49 4e 44 45 58 45 44 20 63  or NOT INDEXED c
1f7e0 6c 61 75 73 65 20 74 6f 20 74 68 65 20 6d 6f 73  lause to the mos
1f7f0 74 20 72 65 63 65 6e 74 6c 79 20 61 64 64 65 64  t recently added
1f800 20 0a 2a 2a 20 65 6c 65 6d 65 6e 74 20 6f 66 20   .** element of 
1f810 74 68 65 20 73 6f 75 72 63 65 2d 6c 69 73 74 20  the source-list 
1f820 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65  passed as the se
1f830 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e 0a 2a  cond argument..*
1f840 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53 72  /.void sqlite3Sr
1f850 63 4c 69 73 74 49 6e 64 65 78 65 64 42 79 28 50  cListIndexedBy(P
1f860 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 72  arse *pParse, Sr
1f870 63 4c 69 73 74 20 2a 70 2c 20 54 6f 6b 65 6e 20  cList *p, Token 
1f880 2a 70 49 6e 64 65 78 65 64 42 79 29 7b 0a 20 20  *pIndexedBy){.  
1f890 61 73 73 65 72 74 28 20 70 49 6e 64 65 78 65 64  assert( pIndexed
1f8a0 42 79 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  By!=0 );.  if( p
1f8b0 20 26 26 20 41 4c 57 41 59 53 28 70 2d 3e 6e 53   && ALWAYS(p->nS
1f8c0 72 63 3e 30 29 20 29 7b 0a 20 20 20 20 73 74 72  rc>0) ){.    str
1f8d0 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
1f8e0 20 2a 70 49 74 65 6d 20 3d 20 26 70 2d 3e 61 5b   *pItem = &p->a[
1f8f0 70 2d 3e 6e 53 72 63 2d 31 5d 3b 0a 20 20 20 20  p->nSrc-1];.    
1f900 61 73 73 65 72 74 28 20 70 49 74 65 6d 2d 3e 66  assert( pItem->f
1f910 67 2e 6e 6f 74 49 6e 64 65 78 65 64 3d 3d 30 20  g.notIndexed==0 
1f920 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
1f930 49 74 65 6d 2d 3e 66 67 2e 69 73 49 6e 64 65 78  Item->fg.isIndex
1f940 65 64 42 79 3d 3d 30 20 29 3b 0a 20 20 20 20 61  edBy==0 );.    a
1f950 73 73 65 72 74 28 20 70 49 74 65 6d 2d 3e 66 67  ssert( pItem->fg
1f960 2e 69 73 54 61 62 46 75 6e 63 3d 3d 30 20 29 3b  .isTabFunc==0 );
1f970 0a 20 20 20 20 69 66 28 20 70 49 6e 64 65 78 65  .    if( pIndexe
1f980 64 42 79 2d 3e 6e 3d 3d 31 20 26 26 20 21 70 49  dBy->n==1 && !pI
1f990 6e 64 65 78 65 64 42 79 2d 3e 7a 20 29 7b 0a 20  ndexedBy->z ){. 
1f9a0 20 20 20 20 20 2f 2a 20 41 20 22 4e 4f 54 20 49       /* A "NOT I
1f9b0 4e 44 45 58 45 44 22 20 63 6c 61 75 73 65 20 77  NDEXED" clause w
1f9c0 61 73 20 73 75 70 70 6c 69 65 64 2e 20 53 65 65  as supplied. See
1f9d0 20 70 61 72 73 65 2e 79 20 0a 20 20 20 20 20 20   parse.y .      
1f9e0 2a 2a 20 63 6f 6e 73 74 72 75 63 74 20 22 69 6e  ** construct "in
1f9f0 64 65 78 65 64 5f 6f 70 74 22 20 66 6f 72 20 64  dexed_opt" for d
1fa00 65 74 61 69 6c 73 2e 20 2a 2f 0a 20 20 20 20 20  etails. */.     
1fa10 20 70 49 74 65 6d 2d 3e 66 67 2e 6e 6f 74 49 6e   pItem->fg.notIn
1fa20 64 65 78 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d  dexed = 1;.    }
1fa30 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 49 74 65  else{.      pIte
1fa40 6d 2d 3e 75 31 2e 7a 49 6e 64 65 78 65 64 42 79  m->u1.zIndexedBy
1fa50 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72   = sqlite3NameFr
1fa60 6f 6d 54 6f 6b 65 6e 28 70 50 61 72 73 65 2d 3e  omToken(pParse->
1fa70 64 62 2c 20 70 49 6e 64 65 78 65 64 42 79 29 3b  db, pIndexedBy);
1fa80 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 66 67  .      pItem->fg
1fa90 2e 69 73 49 6e 64 65 78 65 64 42 79 20 3d 20 28  .isIndexedBy = (
1faa0 70 49 74 65 6d 2d 3e 75 31 2e 7a 49 6e 64 65 78  pItem->u1.zIndex
1fab0 65 64 42 79 21 3d 30 29 3b 0a 20 20 20 20 7d 0a  edBy!=0);.    }.
1fac0 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64    }.}../*.** Add
1fad0 20 74 68 65 20 6c 69 73 74 20 6f 66 20 66 75 6e   the list of fun
1fae0 63 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74 73 20  ction arguments 
1faf0 74 6f 20 74 68 65 20 53 72 63 4c 69 73 74 20 65  to the SrcList e
1fb00 6e 74 72 79 20 66 6f 72 20 61 0a 2a 2a 20 74 61  ntry for a.** ta
1fb10 62 6c 65 2d 76 61 6c 75 65 64 2d 66 75 6e 63 74  ble-valued-funct
1fb20 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ion..*/.void sql
1fb30 69 74 65 33 53 72 63 4c 69 73 74 46 75 6e 63 41  ite3SrcListFuncA
1fb40 72 67 73 28 50 61 72 73 65 20 2a 70 50 61 72 73  rgs(Parse *pPars
1fb50 65 2c 20 53 72 63 4c 69 73 74 20 2a 70 2c 20 45  e, SrcList *p, E
1fb60 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b  xprList *pList){
1fb70 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20  .  if( p ){.    
1fb80 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
1fb90 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70 2d  tem *pItem = &p-
1fba0 3e 61 5b 70 2d 3e 6e 53 72 63 2d 31 5d 3b 0a 20  >a[p->nSrc-1];. 
1fbb0 20 20 20 61 73 73 65 72 74 28 20 70 49 74 65 6d     assert( pItem
1fbc0 2d 3e 66 67 2e 6e 6f 74 49 6e 64 65 78 65 64 3d  ->fg.notIndexed=
1fbd0 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
1fbe0 28 20 70 49 74 65 6d 2d 3e 66 67 2e 69 73 49 6e  ( pItem->fg.isIn
1fbf0 64 65 78 65 64 42 79 3d 3d 30 20 29 3b 0a 20 20  dexedBy==0 );.  
1fc00 20 20 61 73 73 65 72 74 28 20 70 49 74 65 6d 2d    assert( pItem-
1fc10 3e 66 67 2e 69 73 54 61 62 46 75 6e 63 3d 3d 30  >fg.isTabFunc==0
1fc20 20 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 75   );.    pItem->u
1fc30 31 2e 70 46 75 6e 63 41 72 67 20 3d 20 70 4c 69  1.pFuncArg = pLi
1fc40 73 74 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 66  st;.    pItem->f
1fc50 67 2e 69 73 54 61 62 46 75 6e 63 20 3d 20 31 3b  g.isTabFunc = 1;
1fc60 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71  .  }else{.    sq
1fc70 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
1fc80 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ete(pParse->db, 
1fc90 70 4c 69 73 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  pList);.  }.}../
1fca0 2a 0a 2a 2a 20 57 68 65 6e 20 62 75 69 6c 64 69  *.** When buildi
1fcb0 6e 67 20 75 70 20 61 20 46 52 4f 4d 20 63 6c 61  ng up a FROM cla
1fcc0 75 73 65 20 69 6e 20 74 68 65 20 70 61 72 73 65  use in the parse
1fcd0 72 2c 20 74 68 65 20 6a 6f 69 6e 20 6f 70 65 72  r, the join oper
1fce0 61 74 6f 72 0a 2a 2a 20 69 73 20 69 6e 69 74 69  ator.** is initi
1fcf0 61 6c 6c 79 20 61 74 74 61 63 68 65 64 20 74 6f  ally attached to
1fd00 20 74 68 65 20 6c 65 66 74 20 6f 70 65 72 61 6e   the left operan
1fd10 64 2e 20 20 42 75 74 20 74 68 65 20 63 6f 64 65  d.  But the code
1fd20 20 67 65 6e 65 72 61 74 6f 72 0a 2a 2a 20 65 78   generator.** ex
1fd30 70 65 63 74 73 20 74 68 65 20 6a 6f 69 6e 20 6f  pects the join o
1fd40 70 65 72 61 74 6f 72 20 74 6f 20 62 65 20 6f 6e  perator to be on
1fd50 20 74 68 65 20 72 69 67 68 74 20 6f 70 65 72 61   the right opera
1fd60 6e 64 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  nd.  This routin
1fd70 65 0a 2a 2a 20 53 68 69 66 74 73 20 61 6c 6c 20  e.** Shifts all 
1fd80 6a 6f 69 6e 20 6f 70 65 72 61 74 6f 72 73 20 66  join operators f
1fd90 72 6f 6d 20 6c 65 66 74 20 74 6f 20 72 69 67 68  rom left to righ
1fda0 74 20 66 6f 72 20 61 6e 20 65 6e 74 69 72 65 20  t for an entire 
1fdb0 46 52 4f 4d 0a 2a 2a 20 63 6c 61 75 73 65 2e 0a  FROM.** clause..
1fdc0 2a 2a 0a 2a 2a 20 45 78 61 6d 70 6c 65 3a 20 53  **.** Example: S
1fdd0 75 70 70 6f 73 65 20 74 68 65 20 6a 6f 69 6e 20  uppose the join 
1fde0 69 73 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a  is like this:.**
1fdf0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 41 20  .**           A 
1fe00 6e 61 74 75 72 61 6c 20 63 72 6f 73 73 20 6a 6f  natural cross jo
1fe10 69 6e 20 42 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f  in B.**.** The o
1fe20 70 65 72 61 74 6f 72 20 69 73 20 22 6e 61 74 75  perator is "natu
1fe30 72 61 6c 20 63 72 6f 73 73 20 6a 6f 69 6e 22 2e  ral cross join".
1fe40 20 20 54 68 65 20 41 20 61 6e 64 20 42 20 6f 70    The A and B op
1fe50 65 72 61 6e 64 73 20 61 72 65 20 73 74 6f 72 65  erands are store
1fe60 64 0a 2a 2a 20 69 6e 20 70 2d 3e 61 5b 30 5d 20  d.** in p->a[0] 
1fe70 61 6e 64 20 70 2d 3e 61 5b 31 5d 2c 20 72 65 73  and p->a[1], res
1fe80 70 65 63 74 69 76 65 6c 79 2e 20 20 54 68 65 20  pectively.  The 
1fe90 70 61 72 73 65 72 20 69 6e 69 74 69 61 6c 6c 79  parser initially
1fea0 20 73 74 6f 72 65 73 20 74 68 65 0a 2a 2a 20 6f   stores the.** o
1feb0 70 65 72 61 74 6f 72 20 77 69 74 68 20 41 2e 20  perator with A. 
1fec0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 68   This routine sh
1fed0 69 66 74 73 20 74 68 61 74 20 6f 70 65 72 61 74  ifts that operat
1fee0 6f 72 20 6f 76 65 72 20 74 6f 20 42 2e 0a 2a 2f  or over to B..*/
1fef0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53 72 63  .void sqlite3Src
1ff00 4c 69 73 74 53 68 69 66 74 4a 6f 69 6e 54 79 70  ListShiftJoinTyp
1ff10 65 28 53 72 63 4c 69 73 74 20 2a 70 29 7b 0a 20  e(SrcList *p){. 
1ff20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 69 6e   if( p ){.    in
1ff30 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 70  t i;.    for(i=p
1ff40 2d 3e 6e 53 72 63 2d 31 3b 20 69 3e 30 3b 20 69  ->nSrc-1; i>0; i
1ff50 2d 2d 29 7b 0a 20 20 20 20 20 20 70 2d 3e 61 5b  --){.      p->a[
1ff60 69 5d 2e 66 67 2e 6a 6f 69 6e 74 79 70 65 20 3d  i].fg.jointype =
1ff70 20 70 2d 3e 61 5b 69 2d 31 5d 2e 66 67 2e 6a 6f   p->a[i-1].fg.jo
1ff80 69 6e 74 79 70 65 3b 0a 20 20 20 20 7d 0a 20 20  intype;.    }.  
1ff90 20 20 70 2d 3e 61 5b 30 5d 2e 66 67 2e 6a 6f 69    p->a[0].fg.joi
1ffa0 6e 74 79 70 65 20 3d 20 30 3b 0a 20 20 7d 0a 7d  ntype = 0;.  }.}
1ffb0 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
1ffc0 20 56 44 42 45 20 63 6f 64 65 20 66 6f 72 20 61   VDBE code for a
1ffd0 20 42 45 47 49 4e 20 73 74 61 74 65 6d 65 6e 74   BEGIN statement
1ffe0 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
1fff0 33 42 65 67 69 6e 54 72 61 6e 73 61 63 74 69 6f  3BeginTransactio
20000 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  n(Parse *pParse,
20010 20 69 6e 74 20 74 79 70 65 29 7b 0a 20 20 73 71   int type){.  sq
20020 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 56 64 62  lite3 *db;.  Vdb
20030 65 20 2a 76 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a  e *v;.  int i;..
20040 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65    assert( pParse
20050 21 3d 30 20 29 3b 0a 20 20 64 62 20 3d 20 70 50  !=0 );.  db = pP
20060 61 72 73 65 2d 3e 64 62 3b 0a 20 20 61 73 73 65  arse->db;.  asse
20070 72 74 28 20 64 62 21 3d 30 20 29 3b 0a 20 20 69  rt( db!=0 );.  i
20080 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68  f( sqlite3AuthCh
20090 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49  eck(pParse, SQLI
200a0 54 45 5f 54 52 41 4e 53 41 43 54 49 4f 4e 2c 20  TE_TRANSACTION, 
200b0 22 42 45 47 49 4e 22 2c 20 30 2c 20 30 29 20 29  "BEGIN", 0, 0) )
200c0 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  {.    return;.  
200d0 7d 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47  }.  v = sqlite3G
200e0 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
200f0 20 20 69 66 28 20 21 76 20 29 20 72 65 74 75 72    if( !v ) retur
20100 6e 3b 0a 20 20 69 66 28 20 74 79 70 65 21 3d 54  n;.  if( type!=T
20110 4b 5f 44 45 46 45 52 52 45 44 20 29 7b 0a 20 20  K_DEFERRED ){.  
20120 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d    for(i=0; i<db-
20130 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nDb; i++){.    
20140 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
20150 4f 70 32 28 76 2c 20 4f 50 5f 54 72 61 6e 73 61  Op2(v, OP_Transa
20160 63 74 69 6f 6e 2c 20 69 2c 20 28 74 79 70 65 3d  ction, i, (type=
20170 3d 54 4b 5f 45 58 43 4c 55 53 49 56 45 29 2b 31  =TK_EXCLUSIVE)+1
20180 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
20190 56 64 62 65 55 73 65 73 42 74 72 65 65 28 76 2c  VdbeUsesBtree(v,
201a0 20 69 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20   i);.    }.  }. 
201b0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
201c0 70 30 28 76 2c 20 4f 50 5f 41 75 74 6f 43 6f 6d  p0(v, OP_AutoCom
201d0 6d 69 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  mit);.}../*.** G
201e0 65 6e 65 72 61 74 65 20 56 44 42 45 20 63 6f 64  enerate VDBE cod
201f0 65 20 66 6f 72 20 61 20 43 4f 4d 4d 49 54 20 73  e for a COMMIT s
20200 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69  tatement..*/.voi
20210 64 20 73 71 6c 69 74 65 33 43 6f 6d 6d 69 74 54  d sqlite3CommitT
20220 72 61 6e 73 61 63 74 69 6f 6e 28 50 61 72 73 65  ransaction(Parse
20230 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 56 64 62   *pParse){.  Vdb
20240 65 20 2a 76 3b 0a 0a 20 20 61 73 73 65 72 74 28  e *v;..  assert(
20250 20 70 50 61 72 73 65 21 3d 30 20 29 3b 0a 20 20   pParse!=0 );.  
20260 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e  assert( pParse->
20270 64 62 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 73  db!=0 );.  if( s
20280 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28  qlite3AuthCheck(
20290 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 54  pParse, SQLITE_T
202a0 52 41 4e 53 41 43 54 49 4f 4e 2c 20 22 43 4f 4d  RANSACTION, "COM
202b0 4d 49 54 22 2c 20 30 2c 20 30 29 20 29 7b 0a 20  MIT", 0, 0) ){. 
202c0 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
202d0 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56   v = sqlite3GetV
202e0 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69  dbe(pParse);.  i
202f0 66 28 20 76 20 29 7b 0a 20 20 20 20 73 71 6c 69  f( v ){.    sqli
20300 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
20310 20 4f 50 5f 41 75 74 6f 43 6f 6d 6d 69 74 2c 20   OP_AutoCommit, 
20320 31 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  1);.  }.}../*.**
20330 20 47 65 6e 65 72 61 74 65 20 56 44 42 45 20 63   Generate VDBE c
20340 6f 64 65 20 66 6f 72 20 61 20 52 4f 4c 4c 42 41  ode for a ROLLBA
20350 43 4b 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f  CK statement..*/
20360 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52 6f 6c  .void sqlite3Rol
20370 6c 62 61 63 6b 54 72 61 6e 73 61 63 74 69 6f 6e  lbackTransaction
20380 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b  (Parse *pParse){
20390 0a 20 20 56 64 62 65 20 2a 76 3b 0a 0a 20 20 61  .  Vdbe *v;..  a
203a0 73 73 65 72 74 28 20 70 50 61 72 73 65 21 3d 30  ssert( pParse!=0
203b0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
203c0 61 72 73 65 2d 3e 64 62 21 3d 30 20 29 3b 0a 20  arse->db!=0 );. 
203d0 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68   if( sqlite3Auth
203e0 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51  Check(pParse, SQ
203f0 4c 49 54 45 5f 54 52 41 4e 53 41 43 54 49 4f 4e  LITE_TRANSACTION
20400 2c 20 22 52 4f 4c 4c 42 41 43 4b 22 2c 20 30 2c  , "ROLLBACK", 0,
20410 20 30 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72   0) ){.    retur
20420 6e 3b 0a 20 20 7d 0a 20 20 76 20 3d 20 73 71 6c  n;.  }.  v = sql
20430 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
20440 73 65 29 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a  se);.  if( v ){.
20450 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
20460 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41 75 74 6f  ddOp2(v, OP_Auto
20470 43 6f 6d 6d 69 74 2c 20 31 2c 20 31 29 3b 0a 20  Commit, 1, 1);. 
20480 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73   }.}../*.** This
20490 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
204a0 6c 65 64 20 62 79 20 74 68 65 20 70 61 72 73 65  led by the parse
204b0 72 20 77 68 65 6e 20 69 74 20 70 61 72 73 65 73  r when it parses
204c0 20 61 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 63 72   a command to cr
204d0 65 61 74 65 2c 0a 2a 2a 20 72 65 6c 65 61 73 65  eate,.** release
204e0 20 6f 72 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 20   or rollback an 
204f0 53 51 4c 20 73 61 76 65 70 6f 69 6e 74 2e 20 0a  SQL savepoint. .
20500 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53  */.void sqlite3S
20510 61 76 65 70 6f 69 6e 74 28 50 61 72 73 65 20 2a  avepoint(Parse *
20520 70 50 61 72 73 65 2c 20 69 6e 74 20 6f 70 2c 20  pParse, int op, 
20530 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 29 7b 0a 20  Token *pName){. 
20540 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 73   char *zName = s
20550 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f  qlite3NameFromTo
20560 6b 65 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ken(pParse->db, 
20570 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a 4e  pName);.  if( zN
20580 61 6d 65 20 29 7b 0a 20 20 20 20 56 64 62 65 20  ame ){.    Vdbe 
20590 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56  *v = sqlite3GetV
205a0 64 62 65 28 70 50 61 72 73 65 29 3b 0a 23 69 66  dbe(pParse);.#if
205b0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
205c0 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20  _AUTHORIZATION. 
205d0 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20     static const 
205e0 63 68 61 72 20 2a 20 63 6f 6e 73 74 20 61 7a 5b  char * const az[
205f0 5d 20 3d 20 7b 20 22 42 45 47 49 4e 22 2c 20 22  ] = { "BEGIN", "
20600 52 45 4c 45 41 53 45 22 2c 20 22 52 4f 4c 4c 42  RELEASE", "ROLLB
20610 41 43 4b 22 20 7d 3b 0a 20 20 20 20 61 73 73 65  ACK" };.    asse
20620 72 74 28 20 21 53 41 56 45 50 4f 49 4e 54 5f 42  rt( !SAVEPOINT_B
20630 45 47 49 4e 20 26 26 20 53 41 56 45 50 4f 49 4e  EGIN && SAVEPOIN
20640 54 5f 52 45 4c 45 41 53 45 3d 3d 31 20 26 26 20  T_RELEASE==1 && 
20650 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41  SAVEPOINT_ROLLBA
20660 43 4b 3d 3d 32 20 29 3b 0a 23 65 6e 64 69 66 0a  CK==2 );.#endif.
20670 20 20 20 20 69 66 28 20 21 76 20 7c 7c 20 73 71      if( !v || sq
20680 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70  lite3AuthCheck(p
20690 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 53 41  Parse, SQLITE_SA
206a0 56 45 50 4f 49 4e 54 2c 20 61 7a 5b 6f 70 5d 2c  VEPOINT, az[op],
206b0 20 7a 4e 61 6d 65 2c 20 30 29 20 29 7b 0a 20 20   zName, 0) ){.  
206c0 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
206d0 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 7a 4e  e(pParse->db, zN
206e0 61 6d 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ame);.      retu
206f0 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  rn;.    }.    sq
20700 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
20710 76 2c 20 4f 50 5f 53 61 76 65 70 6f 69 6e 74 2c  v, OP_Savepoint,
20720 20 6f 70 2c 20 30 2c 20 30 2c 20 7a 4e 61 6d 65   op, 0, 0, zName
20730 2c 20 50 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 20  , P4_DYNAMIC);. 
20740 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65   }.}../*.** Make
20750 20 73 75 72 65 20 74 68 65 20 54 45 4d 50 20 64   sure the TEMP d
20760 61 74 61 62 61 73 65 20 69 73 20 6f 70 65 6e 20  atabase is open 
20770 61 6e 64 20 61 76 61 69 6c 61 62 6c 65 20 66 6f  and available fo
20780 72 20 75 73 65 2e 20 20 52 65 74 75 72 6e 0a 2a  r use.  Return.*
20790 2a 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  * the number of 
207a0 65 72 72 6f 72 73 2e 20 20 4c 65 61 76 65 20 61  errors.  Leave a
207b0 6e 79 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  ny error message
207c0 73 20 69 6e 20 74 68 65 20 70 50 61 72 73 65 20  s in the pParse 
207d0 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 69 6e  structure..*/.in
207e0 74 20 73 71 6c 69 74 65 33 4f 70 65 6e 54 65 6d  t sqlite3OpenTem
207f0 70 44 61 74 61 62 61 73 65 28 50 61 72 73 65 20  pDatabase(Parse 
20800 2a 70 50 61 72 73 65 29 7b 0a 20 20 73 71 6c 69  *pParse){.  sqli
20810 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
20820 2d 3e 64 62 3b 0a 20 20 69 66 28 20 64 62 2d 3e  ->db;.  if( db->
20830 61 44 62 5b 31 5d 2e 70 42 74 3d 3d 30 20 26 26  aDb[1].pBt==0 &&
20840 20 21 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69   !pParse->explai
20850 6e 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b  n ){.    int rc;
20860 0a 20 20 20 20 42 74 72 65 65 20 2a 70 42 74 3b  .    Btree *pBt;
20870 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73  .    static cons
20880 74 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 0a 20  t int flags = . 
20890 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
208a0 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 20 7c  OPEN_READWRITE |
208b0 0a 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54  .          SQLIT
208c0 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 20 7c 0a  E_OPEN_CREATE |.
208d0 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
208e0 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 20  _OPEN_EXCLUSIVE 
208f0 7c 0a 20 20 20 20 20 20 20 20 20 20 53 51 4c 49  |.          SQLI
20900 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e  TE_OPEN_DELETEON
20910 43 4c 4f 53 45 20 7c 0a 20 20 20 20 20 20 20 20  CLOSE |.        
20920 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45    SQLITE_OPEN_TE
20930 4d 50 5f 44 42 3b 0a 0a 20 20 20 20 72 63 20 3d  MP_DB;..    rc =
20940 20 73 71 6c 69 74 65 33 42 74 72 65 65 4f 70 65   sqlite3BtreeOpe
20950 6e 28 64 62 2d 3e 70 56 66 73 2c 20 30 2c 20 64  n(db->pVfs, 0, d
20960 62 2c 20 26 70 42 74 2c 20 30 2c 20 66 6c 61 67  b, &pBt, 0, flag
20970 73 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  s);.    if( rc!=
20980 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
20990 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
209a0 73 67 28 70 50 61 72 73 65 2c 20 22 75 6e 61 62  sg(pParse, "unab
209b0 6c 65 20 74 6f 20 6f 70 65 6e 20 61 20 74 65 6d  le to open a tem
209c0 70 6f 72 61 72 79 20 64 61 74 61 62 61 73 65 20  porary database 
209d0 22 0a 20 20 20 20 20 20 20 20 22 66 69 6c 65 20  ".        "file 
209e0 66 6f 72 20 73 74 6f 72 69 6e 67 20 74 65 6d 70  for storing temp
209f0 6f 72 61 72 79 20 74 61 62 6c 65 73 22 29 3b 0a  orary tables");.
20a00 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 72 63        pParse->rc
20a10 20 3d 20 72 63 3b 0a 20 20 20 20 20 20 72 65 74   = rc;.      ret
20a20 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 1;.    }.   
20a30 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 42 74 20   db->aDb[1].pBt 
20a40 3d 20 70 42 74 3b 0a 20 20 20 20 61 73 73 65 72  = pBt;.    asser
20a50 74 28 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 53  t( db->aDb[1].pS
20a60 63 68 65 6d 61 20 29 3b 0a 20 20 20 20 69 66 28  chema );.    if(
20a70 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3d 3d 73   SQLITE_NOMEM==s
20a80 71 6c 69 74 65 33 42 74 72 65 65 53 65 74 50 61  qlite3BtreeSetPa
20a90 67 65 53 69 7a 65 28 70 42 74 2c 20 64 62 2d 3e  geSize(pBt, db->
20aa0 6e 65 78 74 50 61 67 65 73 69 7a 65 2c 20 2d 31  nextPagesize, -1
20ab0 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20 73 71  , 0) ){.      sq
20ac0 6c 69 74 65 33 4f 6f 6d 46 61 75 6c 74 28 64 62  lite3OomFault(db
20ad0 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
20ae0 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  1;.    }.  }.  r
20af0 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
20b00 2a 20 52 65 63 6f 72 64 20 74 68 65 20 66 61 63  * Record the fac
20b10 74 20 74 68 61 74 20 74 68 65 20 73 63 68 65 6d  t that the schem
20b20 61 20 63 6f 6f 6b 69 65 20 77 69 6c 6c 20 6e 65  a cookie will ne
20b30 65 64 20 74 6f 20 62 65 20 76 65 72 69 66 69 65  ed to be verifie
20b40 64 0a 2a 2a 20 66 6f 72 20 64 61 74 61 62 61 73  d.** for databas
20b50 65 20 69 44 62 2e 20 20 54 68 65 20 63 6f 64 65  e iDb.  The code
20b60 20 74 6f 20 61 63 74 75 61 6c 6c 79 20 76 65 72   to actually ver
20b70 69 66 79 20 74 68 65 20 73 63 68 65 6d 61 20 63  ify the schema c
20b80 6f 6f 6b 69 65 0a 2a 2a 20 77 69 6c 6c 20 6f 63  ookie.** will oc
20b90 63 75 72 20 61 74 20 74 68 65 20 65 6e 64 20 6f  cur at the end o
20ba0 66 20 74 68 65 20 74 6f 70 2d 6c 65 76 65 6c 20  f the top-level 
20bb0 56 44 42 45 20 61 6e 64 20 77 69 6c 6c 20 62 65  VDBE and will be
20bc0 20 67 65 6e 65 72 61 74 65 64 0a 2a 2a 20 6c 61   generated.** la
20bd0 74 65 72 2c 20 62 79 20 73 71 6c 69 74 65 33 46  ter, by sqlite3F
20be0 69 6e 69 73 68 43 6f 64 69 6e 67 28 29 2e 0a 2a  inishCoding()..*
20bf0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 6f  /.void sqlite3Co
20c00 64 65 56 65 72 69 66 79 53 63 68 65 6d 61 28 50  deVerifySchema(P
20c10 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e  arse *pParse, in
20c20 74 20 69 44 62 29 7b 0a 20 20 50 61 72 73 65 20  t iDb){.  Parse 
20c30 2a 70 54 6f 70 6c 65 76 65 6c 20 3d 20 73 71 6c  *pToplevel = sql
20c40 69 74 65 33 50 61 72 73 65 54 6f 70 6c 65 76 65  ite3ParseTopleve
20c50 6c 28 70 50 61 72 73 65 29 3b 0a 20 20 73 71 6c  l(pParse);.  sql
20c60 69 74 65 33 20 2a 64 62 20 3d 20 70 54 6f 70 6c  ite3 *db = pTopl
20c70 65 76 65 6c 2d 3e 64 62 3b 0a 0a 20 20 61 73 73  evel->db;..  ass
20c80 65 72 74 28 20 69 44 62 3e 3d 30 20 26 26 20 69  ert( iDb>=0 && i
20c90 44 62 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20  Db<db->nDb );.  
20ca0 61 73 73 65 72 74 28 20 64 62 2d 3e 61 44 62 5b  assert( db->aDb[
20cb0 69 44 62 5d 2e 70 42 74 21 3d 30 20 7c 7c 20 69  iDb].pBt!=0 || i
20cc0 44 62 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65 72  Db==1 );.  asser
20cd0 74 28 20 69 44 62 3c 53 51 4c 49 54 45 5f 4d 41  t( iDb<SQLITE_MA
20ce0 58 5f 41 54 54 41 43 48 45 44 2b 32 20 29 3b 0a  X_ATTACHED+2 );.
20cf0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
20d00 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64  3SchemaMutexHeld
20d10 28 64 62 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a  (db, iDb, 0) );.
20d20 20 20 69 66 28 20 44 62 4d 61 73 6b 54 65 73 74    if( DbMaskTest
20d30 28 70 54 6f 70 6c 65 76 65 6c 2d 3e 63 6f 6f 6b  (pToplevel->cook
20d40 69 65 4d 61 73 6b 2c 20 69 44 62 29 3d 3d 30 20  ieMask, iDb)==0 
20d50 29 7b 0a 20 20 20 20 44 62 4d 61 73 6b 53 65 74  ){.    DbMaskSet
20d60 28 70 54 6f 70 6c 65 76 65 6c 2d 3e 63 6f 6f 6b  (pToplevel->cook
20d70 69 65 4d 61 73 6b 2c 20 69 44 62 29 3b 0a 20 20  ieMask, iDb);.  
20d80 20 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 63 6f 6f    pToplevel->coo
20d90 6b 69 65 56 61 6c 75 65 5b 69 44 62 5d 20 3d 20  kieValue[iDb] = 
20da0 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53 63  db->aDb[iDb].pSc
20db0 68 65 6d 61 2d 3e 73 63 68 65 6d 61 5f 63 6f 6f  hema->schema_coo
20dc0 6b 69 65 3b 0a 20 20 20 20 69 66 28 20 21 4f 4d  kie;.    if( !OM
20dd0 49 54 5f 54 45 4d 50 44 42 20 26 26 20 69 44 62  IT_TEMPDB && iDb
20de0 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ==1 ){.      sql
20df0 69 74 65 33 4f 70 65 6e 54 65 6d 70 44 61 74 61  ite3OpenTempData
20e00 62 61 73 65 28 70 54 6f 70 6c 65 76 65 6c 29 3b  base(pToplevel);
20e10 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
20e20 0a 2a 2a 20 49 66 20 61 72 67 75 6d 65 6e 74 20  .** If argument 
20e30 7a 44 62 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65  zDb is NULL, the
20e40 6e 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 43 6f  n call sqlite3Co
20e50 64 65 56 65 72 69 66 79 53 63 68 65 6d 61 28 29  deVerifySchema()
20e60 20 66 6f 72 20 65 61 63 68 20 0a 2a 2a 20 61 74   for each .** at
20e70 74 61 63 68 65 64 20 64 61 74 61 62 61 73 65 2e  tached database.
20e80 20 4f 74 68 65 72 77 69 73 65 2c 20 69 6e 76 6f   Otherwise, invo
20e90 6b 65 20 69 74 20 66 6f 72 20 74 68 65 20 64 61  ke it for the da
20ea0 74 61 62 61 73 65 20 6e 61 6d 65 64 20 7a 44 62  tabase named zDb
20eb0 20 6f 6e 6c 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73   only..*/.void s
20ec0 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66 79  qlite3CodeVerify
20ed0 4e 61 6d 65 64 53 63 68 65 6d 61 28 50 61 72 73  NamedSchema(Pars
20ee0 65 20 2a 70 50 61 72 73 65 2c 20 63 6f 6e 73 74  e *pParse, const
20ef0 20 63 68 61 72 20 2a 7a 44 62 29 7b 0a 20 20 73   char *zDb){.  s
20f00 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
20f10 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 69  rse->db;.  int i
20f20 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64  ;.  for(i=0; i<d
20f30 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20  b->nDb; i++){.  
20f40 20 20 44 62 20 2a 70 44 62 20 3d 20 26 64 62 2d    Db *pDb = &db-
20f50 3e 61 44 62 5b 69 5d 3b 0a 20 20 20 20 69 66 28  >aDb[i];.    if(
20f60 20 70 44 62 2d 3e 70 42 74 20 26 26 20 28 21 7a   pDb->pBt && (!z
20f70 44 62 20 7c 7c 20 30 3d 3d 73 71 6c 69 74 65 33  Db || 0==sqlite3
20f80 53 74 72 49 43 6d 70 28 7a 44 62 2c 20 70 44 62  StrICmp(zDb, pDb
20f90 2d 3e 7a 4e 61 6d 65 29 29 20 29 7b 0a 20 20 20  ->zName)) ){.   
20fa0 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65     sqlite3CodeVe
20fb0 72 69 66 79 53 63 68 65 6d 61 28 70 50 61 72 73  rifySchema(pPars
20fc0 65 2c 20 69 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  e, i);.    }.  }
20fd0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
20fe0 74 65 20 56 44 42 45 20 63 6f 64 65 20 74 68 61  te VDBE code tha
20ff0 74 20 70 72 65 70 61 72 65 73 20 66 6f 72 20 64  t prepares for d
21000 6f 69 6e 67 20 61 6e 20 6f 70 65 72 61 74 69 6f  oing an operatio
21010 6e 20 74 68 61 74 0a 2a 2a 20 6d 69 67 68 74 20  n that.** might 
21020 63 68 61 6e 67 65 20 74 68 65 20 64 61 74 61 62  change the datab
21030 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ase..**.** This 
21040 72 6f 75 74 69 6e 65 20 73 74 61 72 74 73 20 61  routine starts a
21050 20 6e 65 77 20 74 72 61 6e 73 61 63 74 69 6f 6e   new transaction
21060 20 69 66 20 77 65 20 61 72 65 20 6e 6f 74 20 61   if we are not a
21070 6c 72 65 61 64 79 20 77 69 74 68 69 6e 0a 2a 2a  lready within.**
21080 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20   a transaction. 
21090 20 49 66 20 77 65 20 61 72 65 20 61 6c 72 65 61   If we are alrea
210a0 64 79 20 77 69 74 68 69 6e 20 61 20 74 72 61 6e  dy within a tran
210b0 73 61 63 74 69 6f 6e 2c 20 74 68 65 6e 20 61 20  saction, then a 
210c0 63 68 65 63 6b 70 6f 69 6e 74 0a 2a 2a 20 69 73  checkpoint.** is
210d0 20 73 65 74 20 69 66 20 74 68 65 20 73 65 74 53   set if the setS
210e0 74 61 74 65 6d 65 6e 74 20 70 61 72 61 6d 65 74  tatement paramet
210f0 65 72 20 69 73 20 74 72 75 65 2e 20 20 41 20 63  er is true.  A c
21100 68 65 63 6b 70 6f 69 6e 74 20 73 68 6f 75 6c 64  heckpoint should
21110 0a 2a 2a 20 62 65 20 73 65 74 20 66 6f 72 20 6f  .** be set for o
21120 70 65 72 61 74 69 6f 6e 73 20 74 68 61 74 20 6d  perations that m
21130 69 67 68 74 20 66 61 69 6c 20 28 64 75 65 20 74  ight fail (due t
21140 6f 20 61 20 63 6f 6e 73 74 72 61 69 6e 74 29 20  o a constraint) 
21150 70 61 72 74 20 6f 66 0a 2a 2a 20 74 68 65 20 77  part of.** the w
21160 61 79 20 74 68 72 6f 75 67 68 20 61 6e 64 20 77  ay through and w
21170 68 69 63 68 20 77 69 6c 6c 20 6e 65 65 64 20 74  hich will need t
21180 6f 20 75 6e 64 6f 20 73 6f 6d 65 20 77 72 69 74  o undo some writ
21190 65 73 20 77 69 74 68 6f 75 74 20 68 61 76 69 6e  es without havin
211a0 67 20 74 6f 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b  g to.** rollback
211b0 20 74 68 65 20 77 68 6f 6c 65 20 74 72 61 6e 73   the whole trans
211c0 61 63 74 69 6f 6e 2e 20 20 46 6f 72 20 6f 70 65  action.  For ope
211d0 72 61 74 69 6f 6e 73 20 77 68 65 72 65 20 61 6c  rations where al
211e0 6c 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a 2a 2a  l constraints.**
211f0 20 63 61 6e 20 62 65 20 63 68 65 63 6b 65 64 20   can be checked 
21200 62 65 66 6f 72 65 20 61 6e 79 20 63 68 61 6e 67  before any chang
21210 65 73 20 61 72 65 20 6d 61 64 65 20 74 6f 20 74  es are made to t
21220 68 65 20 64 61 74 61 62 61 73 65 2c 20 69 74 20  he database, it 
21230 69 73 20 6e 65 76 65 72 0a 2a 2a 20 6e 65 63 65  is never.** nece
21240 73 73 61 72 79 20 74 6f 20 75 6e 64 6f 20 61 20  ssary to undo a 
21250 77 72 69 74 65 20 61 6e 64 20 74 68 65 20 63 68  write and the ch
21260 65 63 6b 70 6f 69 6e 74 20 73 68 6f 75 6c 64 20  eckpoint should 
21270 6e 6f 74 20 62 65 20 73 65 74 2e 0a 2a 2f 0a 76  not be set..*/.v
21280 6f 69 64 20 73 71 6c 69 74 65 33 42 65 67 69 6e  oid sqlite3Begin
21290 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 50  WriteOperation(P
212a0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e  arse *pParse, in
212b0 74 20 73 65 74 53 74 61 74 65 6d 65 6e 74 2c 20  t setStatement, 
212c0 69 6e 74 20 69 44 62 29 7b 0a 20 20 50 61 72 73  int iDb){.  Pars
212d0 65 20 2a 70 54 6f 70 6c 65 76 65 6c 20 3d 20 73  e *pToplevel = s
212e0 71 6c 69 74 65 33 50 61 72 73 65 54 6f 70 6c 65  qlite3ParseTople
212f0 76 65 6c 28 70 50 61 72 73 65 29 3b 0a 20 20 73  vel(pParse);.  s
21300 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66 79  qlite3CodeVerify
21310 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20 69  Schema(pParse, i
21320 44 62 29 3b 0a 20 20 44 62 4d 61 73 6b 53 65 74  Db);.  DbMaskSet
21330 28 70 54 6f 70 6c 65 76 65 6c 2d 3e 77 72 69 74  (pToplevel->writ
21340 65 4d 61 73 6b 2c 20 69 44 62 29 3b 0a 20 20 70  eMask, iDb);.  p
21350 54 6f 70 6c 65 76 65 6c 2d 3e 69 73 4d 75 6c 74  Toplevel->isMult
21360 69 57 72 69 74 65 20 7c 3d 20 73 65 74 53 74 61  iWrite |= setSta
21370 74 65 6d 65 6e 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  tement;.}../*.**
21380 20 49 6e 64 69 63 61 74 65 20 74 68 61 74 20 74   Indicate that t
21390 68 65 20 73 74 61 74 65 6d 65 6e 74 20 63 75 72  he statement cur
213a0 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e  rently under con
213b0 73 74 72 75 63 74 69 6f 6e 20 6d 69 67 68 74 20  struction might 
213c0 77 72 69 74 65 0a 2a 2a 20 6d 6f 72 65 20 74 68  write.** more th
213d0 61 6e 20 6f 6e 65 20 65 6e 74 72 79 20 28 65 78  an one entry (ex
213e0 61 6d 70 6c 65 3a 20 64 65 6c 65 74 69 6e 67 20  ample: deleting 
213f0 6f 6e 65 20 72 6f 77 20 74 68 65 6e 20 69 6e 73  one row then ins
21400 65 72 74 69 6e 67 20 61 6e 6f 74 68 65 72 2c 0a  erting another,.
21410 2a 2a 20 69 6e 73 65 72 74 69 6e 67 20 6d 75 6c  ** inserting mul
21420 74 69 70 6c 65 20 72 6f 77 73 20 69 6e 20 61 20  tiple rows in a 
21430 74 61 62 6c 65 2c 20 6f 72 20 69 6e 73 65 72 74  table, or insert
21440 69 6e 67 20 61 20 72 6f 77 20 61 6e 64 20 69 6e  ing a row and in
21450 64 65 78 20 65 6e 74 72 69 65 73 2e 29 0a 2a 2a  dex entries.).**
21460 20 49 66 20 61 6e 20 61 62 6f 72 74 20 6f 63 63   If an abort occ
21470 75 72 73 20 61 66 74 65 72 20 73 6f 6d 65 20 6f  urs after some o
21480 66 20 74 68 65 73 65 20 77 72 69 74 65 73 20 68  f these writes h
21490 61 76 65 20 63 6f 6d 70 6c 65 74 65 64 2c 20 74  ave completed, t
214a0 68 65 6e 20 69 74 20 77 69 6c 6c 0a 2a 2a 20 62  hen it will.** b
214b0 65 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 75  e necessary to u
214c0 6e 64 6f 20 74 68 65 20 63 6f 6d 70 6c 65 74 65  ndo the complete
214d0 64 20 77 72 69 74 65 73 2e 0a 2a 2f 0a 76 6f 69  d writes..*/.voi
214e0 64 20 73 71 6c 69 74 65 33 4d 75 6c 74 69 57 72  d sqlite3MultiWr
214f0 69 74 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  ite(Parse *pPars
21500 65 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 54 6f  e){.  Parse *pTo
21510 70 6c 65 76 65 6c 20 3d 20 73 71 6c 69 74 65 33  plevel = sqlite3
21520 50 61 72 73 65 54 6f 70 6c 65 76 65 6c 28 70 50  ParseToplevel(pP
21530 61 72 73 65 29 3b 0a 20 20 70 54 6f 70 6c 65 76  arse);.  pToplev
21540 65 6c 2d 3e 69 73 4d 75 6c 74 69 57 72 69 74 65  el->isMultiWrite
21550 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20   = 1;.}../* .** 
21560 54 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74  The code generat
21570 6f 72 20 63 61 6c 6c 73 20 74 68 69 73 20 72 6f  or calls this ro
21580 75 74 69 6e 65 20 69 66 20 69 73 20 64 69 73 63  utine if is disc
21590 6f 76 65 72 73 20 74 68 61 74 20 69 74 20 69 73  overs that it is
215a0 0a 2a 2a 20 70 6f 73 73 69 62 6c 65 20 74 6f 20  .** possible to 
215b0 61 62 6f 72 74 20 61 20 73 74 61 74 65 6d 65 6e  abort a statemen
215c0 74 20 70 72 69 6f 72 20 74 6f 20 63 6f 6d 70 6c  t prior to compl
215d0 65 74 69 6f 6e 2e 20 20 49 6e 20 6f 72 64 65 72  etion.  In order
215e0 20 74 6f 20 0a 2a 2a 20 70 65 72 66 6f 72 6d 20   to .** perform 
215f0 74 68 69 73 20 61 62 6f 72 74 20 77 69 74 68 6f  this abort witho
21600 75 74 20 63 6f 72 72 75 70 74 69 6e 67 20 74 68  ut corrupting th
21610 65 20 64 61 74 61 62 61 73 65 2c 20 77 65 20 6e  e database, we n
21620 65 65 64 20 74 6f 20 6d 61 6b 65 0a 2a 2a 20 73  eed to make.** s
21630 75 72 65 20 74 68 61 74 20 74 68 65 20 73 74 61  ure that the sta
21640 74 65 6d 65 6e 74 20 69 73 20 70 72 6f 74 65 63  tement is protec
21650 74 65 64 20 62 79 20 61 20 73 74 61 74 65 6d 65  ted by a stateme
21660 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  nt transaction..
21670 2a 2a 0a 2a 2a 20 54 65 63 68 6e 69 63 61 6c 6c  **.** Technicall
21680 79 2c 20 77 65 20 6f 6e 6c 79 20 6e 65 65 64 20  y, we only need 
21690 74 6f 20 73 65 74 20 74 68 65 20 6d 61 79 41 62  to set the mayAb
216a0 6f 72 74 20 66 6c 61 67 20 69 66 20 74 68 65 0a  ort flag if the.
216b0 2a 2a 20 69 73 4d 75 6c 74 69 57 72 69 74 65 20  ** isMultiWrite 
216c0 66 6c 61 67 20 77 61 73 20 70 72 65 76 69 6f 75  flag was previou
216d0 73 6c 79 20 73 65 74 2e 20 20 54 68 65 72 65 20  sly set.  There 
216e0 69 73 20 61 20 74 69 6d 65 20 64 65 70 65 6e 64  is a time depend
216f0 65 6e 63 79 0a 2a 2a 20 73 75 63 68 20 74 68 61  ency.** such tha
21700 74 20 74 68 65 20 61 62 6f 72 74 20 6d 75 73 74  t the abort must
21710 20 6f 63 63 75 72 20 61 66 74 65 72 20 74 68 65   occur after the
21720 20 6d 75 6c 74 69 77 72 69 74 65 2e 20 20 54 68   multiwrite.  Th
21730 69 73 20 6d 61 6b 65 73 0a 2a 2a 20 73 6f 6d 65  is makes.** some
21740 20 73 74 61 74 65 6d 65 6e 74 73 20 69 6e 76 6f   statements invo
21750 6c 76 69 6e 67 20 74 68 65 20 52 45 50 4c 41 43  lving the REPLAC
21760 45 20 63 6f 6e 66 6c 69 63 74 20 72 65 73 6f 6c  E conflict resol
21770 75 74 69 6f 6e 20 61 6c 67 6f 72 69 74 68 6d 0a  ution algorithm.
21780 2a 2a 20 67 6f 20 61 20 6c 69 74 74 6c 65 20 66  ** go a little f
21790 61 73 74 65 72 2e 20 20 42 75 74 20 74 61 6b 69  aster.  But taki
217a0 6e 67 20 61 64 76 61 6e 74 61 67 65 20 6f 66 20  ng advantage of 
217b0 74 68 69 73 20 74 69 6d 65 20 64 65 70 65 6e 64  this time depend
217c0 65 6e 63 79 0a 2a 2a 20 6d 61 6b 65 73 20 69 74  ency.** makes it
217d0 20 6d 6f 72 65 20 64 69 66 66 69 63 75 6c 74 20   more difficult 
217e0 74 6f 20 70 72 6f 76 65 20 74 68 61 74 20 74 68  to prove that th
217f0 65 20 63 6f 64 65 20 69 73 20 63 6f 72 72 65 63  e code is correc
21800 74 20 28 69 6e 20 0a 2a 2a 20 70 61 72 74 69 63  t (in .** partic
21810 75 6c 61 72 2c 20 69 74 20 70 72 65 76 65 6e 74  ular, it prevent
21820 73 20 75 73 20 66 72 6f 6d 20 77 72 69 74 69 6e  s us from writin
21830 67 20 61 6e 20 65 66 66 65 63 74 69 76 65 0a 2a  g an effective.*
21840 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  * implementation
21850 20 6f 66 20 73 71 6c 69 74 65 33 41 73 73 65 72   of sqlite3Asser
21860 74 4d 61 79 41 62 6f 72 74 28 29 29 20 61 6e 64  tMayAbort()) and
21870 20 73 6f 20 77 65 20 68 61 76 65 20 63 68 6f 73   so we have chos
21880 65 6e 0a 2a 2a 20 74 6f 20 74 61 6b 65 20 74 68  en.** to take th
21890 65 20 73 61 66 65 20 72 6f 75 74 65 20 61 6e 64  e safe route and
218a0 20 73 6b 69 70 20 74 68 65 20 6f 70 74 69 6d 69   skip the optimi
218b0 7a 61 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20  zation..*/.void 
218c0 73 71 6c 69 74 65 33 4d 61 79 41 62 6f 72 74 28  sqlite3MayAbort(
218d0 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a  Parse *pParse){.
218e0 20 20 50 61 72 73 65 20 2a 70 54 6f 70 6c 65 76    Parse *pToplev
218f0 65 6c 20 3d 20 73 71 6c 69 74 65 33 50 61 72 73  el = sqlite3Pars
21900 65 54 6f 70 6c 65 76 65 6c 28 70 50 61 72 73 65  eToplevel(pParse
21910 29 3b 0a 20 20 70 54 6f 70 6c 65 76 65 6c 2d 3e  );.  pToplevel->
21920 6d 61 79 41 62 6f 72 74 20 3d 20 31 3b 0a 7d 0a  mayAbort = 1;.}.
21930 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20 61 6e 20 4f  ./*.** Code an O
21940 50 5f 48 61 6c 74 20 74 68 61 74 20 63 61 75 73  P_Halt that caus
21950 65 73 20 74 68 65 20 76 64 62 65 20 74 6f 20 72  es the vdbe to r
21960 65 74 75 72 6e 20 61 6e 20 53 51 4c 49 54 45 5f  eturn an SQLITE_
21970 43 4f 4e 53 54 52 41 49 4e 54 0a 2a 2a 20 65 72  CONSTRAINT.** er
21980 72 6f 72 2e 20 54 68 65 20 6f 6e 45 72 72 6f 72  ror. The onError
21990 20 70 61 72 61 6d 65 74 65 72 20 64 65 74 65 72   parameter deter
219a0 6d 69 6e 65 73 20 77 68 69 63 68 20 28 69 66 20  mines which (if 
219b0 61 6e 79 29 20 6f 66 20 74 68 65 20 73 74 61 74  any) of the stat
219c0 65 6d 65 6e 74 0a 2a 2a 20 61 6e 64 2f 6f 72 20  ement.** and/or 
219d0 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74  current transact
219e0 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62 61  ion is rolled ba
219f0 63 6b 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ck..*/.void sqli
21a00 74 65 33 48 61 6c 74 43 6f 6e 73 74 72 61 69 6e  te3HaltConstrain
21a10 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  t(.  Parse *pPar
21a20 73 65 2c 20 20 20 20 2f 2a 20 50 61 72 73 69 6e  se,    /* Parsin
21a30 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69  g context */.  i
21a40 6e 74 20 65 72 72 43 6f 64 65 2c 20 20 20 20 20  nt errCode,     
21a50 20 2f 2a 20 65 78 74 65 6e 64 65 64 20 65 72 72   /* extended err
21a60 6f 72 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74  or code */.  int
21a70 20 6f 6e 45 72 72 6f 72 2c 20 20 20 20 20 20 2f   onError,      /
21a80 2a 20 43 6f 6e 73 74 72 61 69 6e 74 20 74 79 70  * Constraint typ
21a90 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 70 34 2c  e */.  char *p4,
21aa0 20 20 20 20 20 20 20 20 20 2f 2a 20 45 72 72 6f           /* Erro
21ab0 72 20 6d 65 73 73 61 67 65 20 2a 2f 0a 20 20 69  r message */.  i
21ac0 38 20 70 34 74 79 70 65 2c 20 20 20 20 20 20 20  8 p4type,       
21ad0 20 2f 2a 20 50 34 5f 53 54 41 54 49 43 20 6f 72   /* P4_STATIC or
21ae0 20 50 34 5f 54 52 41 4e 53 49 45 4e 54 20 2a 2f   P4_TRANSIENT */
21af0 0a 20 20 75 38 20 70 35 45 72 72 6d 73 67 20 20  .  u8 p5Errmsg  
21b00 20 20 20 20 20 2f 2a 20 50 35 5f 45 72 72 4d 73       /* P5_ErrMs
21b10 67 20 74 79 70 65 20 2a 2f 0a 29 7b 0a 20 20 56  g type */.){.  V
21b20 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33  dbe *v = sqlite3
21b30 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
21b40 0a 20 20 61 73 73 65 72 74 28 20 28 65 72 72 43  .  assert( (errC
21b50 6f 64 65 26 30 78 66 66 29 3d 3d 53 51 4c 49 54  ode&0xff)==SQLIT
21b60 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 29 3b 0a  E_CONSTRAINT );.
21b70 20 20 69 66 28 20 6f 6e 45 72 72 6f 72 3d 3d 4f    if( onError==O
21b80 45 5f 41 62 6f 72 74 20 29 7b 0a 20 20 20 20 73  E_Abort ){.    s
21b90 71 6c 69 74 65 33 4d 61 79 41 62 6f 72 74 28 70  qlite3MayAbort(p
21ba0 50 61 72 73 65 29 3b 0a 20 20 7d 0a 20 20 73 71  Parse);.  }.  sq
21bb0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
21bc0 76 2c 20 4f 50 5f 48 61 6c 74 2c 20 65 72 72 43  v, OP_Halt, errC
21bd0 6f 64 65 2c 20 6f 6e 45 72 72 6f 72 2c 20 30 2c  ode, onError, 0,
21be0 20 70 34 2c 20 70 34 74 79 70 65 29 3b 0a 20 20   p4, p4type);.  
21bf0 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
21c00 65 50 35 28 76 2c 20 70 35 45 72 72 6d 73 67 29  eP5(v, p5Errmsg)
21c10 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20  ;.}../*.** Code 
21c20 61 6e 20 4f 50 5f 48 61 6c 74 20 64 75 65 20 74  an OP_Halt due t
21c30 6f 20 55 4e 49 51 55 45 20 6f 72 20 50 52 49 4d  o UNIQUE or PRIM
21c40 41 52 59 20 4b 45 59 20 63 6f 6e 73 74 72 61 69  ARY KEY constrai
21c50 6e 74 20 76 69 6f 6c 61 74 69 6f 6e 2e 0a 2a 2f  nt violation..*/
21c60 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 55 6e 69  .void sqlite3Uni
21c70 71 75 65 43 6f 6e 73 74 72 61 69 6e 74 28 0a 20  queConstraint(. 
21c80 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
21c90 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
21ca0 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20 6f  ntext */.  int o
21cb0 6e 45 72 72 6f 72 2c 20 20 20 20 20 20 2f 2a 20  nError,      /* 
21cc0 43 6f 6e 73 74 72 61 69 6e 74 20 74 79 70 65 20  Constraint type 
21cd0 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78  */.  Index *pIdx
21ce0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e         /* The in
21cf0 64 65 78 20 74 68 61 74 20 74 72 69 67 67 65 72  dex that trigger
21d00 73 20 74 68 65 20 63 6f 6e 73 74 72 61 69 6e 74  s the constraint
21d10 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a   */.){.  char *z
21d20 45 72 72 3b 0a 20 20 69 6e 74 20 6a 3b 0a 20 20  Err;.  int j;.  
21d30 53 74 72 41 63 63 75 6d 20 65 72 72 4d 73 67 3b  StrAccum errMsg;
21d40 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d  .  Table *pTab =
21d50 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 3b 0a 0a   pIdx->pTable;..
21d60 20 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75    sqlite3StrAccu
21d70 6d 49 6e 69 74 28 26 65 72 72 4d 73 67 2c 20 70  mInit(&errMsg, p
21d80 50 61 72 73 65 2d 3e 64 62 2c 20 30 2c 20 30 2c  Parse->db, 0, 0,
21d90 20 32 30 30 29 3b 0a 20 20 69 66 28 20 70 49 64   200);.  if( pId
21da0 78 2d 3e 61 43 6f 6c 45 78 70 72 20 29 7b 0a 20  x->aColExpr ){. 
21db0 20 20 20 73 71 6c 69 74 65 33 58 50 72 69 6e 74     sqlite3XPrint
21dc0 66 28 26 65 72 72 4d 73 67 2c 20 22 69 6e 64 65  f(&errMsg, "inde
21dd0 78 20 27 25 71 27 22 2c 20 70 49 64 78 2d 3e 7a  x '%q'", pIdx->z
21de0 4e 61 6d 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Name);.  }else{.
21df0 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70      for(j=0; j<p
21e00 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 6a 2b  Idx->nKeyCol; j+
21e10 2b 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a  +){.      char *
21e20 7a 43 6f 6c 3b 0a 20 20 20 20 20 20 61 73 73 65  zCol;.      asse
21e30 72 74 28 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75  rt( pIdx->aiColu
21e40 6d 6e 5b 6a 5d 3e 3d 30 20 29 3b 0a 20 20 20 20  mn[j]>=0 );.    
21e50 20 20 7a 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 61    zCol = pTab->a
21e60 43 6f 6c 5b 70 49 64 78 2d 3e 61 69 43 6f 6c 75  Col[pIdx->aiColu
21e70 6d 6e 5b 6a 5d 5d 2e 7a 4e 61 6d 65 3b 0a 20 20  mn[j]].zName;.  
21e80 20 20 20 20 69 66 28 20 6a 20 29 20 73 71 6c 69      if( j ) sqli
21e90 74 65 33 53 74 72 41 63 63 75 6d 41 70 70 65 6e  te3StrAccumAppen
21ea0 64 28 26 65 72 72 4d 73 67 2c 20 22 2c 20 22 2c  d(&errMsg, ", ",
21eb0 20 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   2);.      sqlit
21ec0 65 33 58 50 72 69 6e 74 66 28 26 65 72 72 4d 73  e3XPrintf(&errMs
21ed0 67 2c 20 22 25 73 2e 25 73 22 2c 20 70 54 61 62  g, "%s.%s", pTab
21ee0 2d 3e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 29 3b 0a  ->zName, zCol);.
21ef0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 7a 45 72 72      }.  }.  zErr
21f00 20 3d 20 73 71 6c 69 74 65 33 53 74 72 41 63 63   = sqlite3StrAcc
21f10 75 6d 46 69 6e 69 73 68 28 26 65 72 72 4d 73 67  umFinish(&errMsg
21f20 29 3b 0a 20 20 73 71 6c 69 74 65 33 48 61 6c 74  );.  sqlite3Halt
21f30 43 6f 6e 73 74 72 61 69 6e 74 28 70 50 61 72 73  Constraint(pPars
21f40 65 2c 20 0a 20 20 20 20 49 73 50 72 69 6d 61 72  e, .    IsPrimar
21f50 79 4b 65 79 49 6e 64 65 78 28 70 49 64 78 29 20  yKeyIndex(pIdx) 
21f60 3f 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41  ? SQLITE_CONSTRA
21f70 49 4e 54 5f 50 52 49 4d 41 52 59 4b 45 59 20 0a  INT_PRIMARYKEY .
21f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21f90 20 20 20 20 20 20 20 20 20 20 20 20 3a 20 53 51              : SQ
21fa0 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  LITE_CONSTRAINT_
21fb0 55 4e 49 51 55 45 2c 0a 20 20 20 20 6f 6e 45 72  UNIQUE,.    onEr
21fc0 72 6f 72 2c 20 7a 45 72 72 2c 20 50 34 5f 44 59  ror, zErr, P4_DY
21fd0 4e 41 4d 49 43 2c 20 50 35 5f 43 6f 6e 73 74 72  NAMIC, P5_Constr
21fe0 61 69 6e 74 55 6e 69 71 75 65 29 3b 0a 7d 0a 0a  aintUnique);.}..
21ff0 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20 61 6e 20 4f  ./*.** Code an O
22000 50 5f 48 61 6c 74 20 64 75 65 20 74 6f 20 6e 6f  P_Halt due to no
22010 6e 2d 75 6e 69 71 75 65 20 72 6f 77 69 64 2e 0a  n-unique rowid..
22020 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52  */.void sqlite3R
22030 6f 77 69 64 43 6f 6e 73 74 72 61 69 6e 74 28 0a  owidConstraint(.
22040 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
22050 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
22060 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20  ontext */.  int 
22070 6f 6e 45 72 72 6f 72 2c 20 20 20 20 20 20 2f 2a  onError,      /*
22080 20 43 6f 6e 66 6c 69 63 74 20 72 65 73 6f 6c 75   Conflict resolu
22090 74 69 6f 6e 20 61 6c 67 6f 72 69 74 68 6d 20 2a  tion algorithm *
220a0 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20  /.  Table *pTab 
220b0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 61 62        /* The tab
220c0 6c 65 20 77 69 74 68 20 74 68 65 20 6e 6f 6e 2d  le with the non-
220d0 75 6e 69 71 75 65 20 72 6f 77 69 64 20 2a 2f 20  unique rowid */ 
220e0 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a 4d 73 67  .){.  char *zMsg
220f0 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 66  ;.  int rc;.  if
22100 28 20 70 54 61 62 2d 3e 69 50 4b 65 79 3e 3d 30  ( pTab->iPKey>=0
22110 20 29 7b 0a 20 20 20 20 7a 4d 73 67 20 3d 20 73   ){.    zMsg = s
22120 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 70 50  qlite3MPrintf(pP
22130 61 72 73 65 2d 3e 64 62 2c 20 22 25 73 2e 25 73  arse->db, "%s.%s
22140 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 0a  ", pTab->zName,.
22150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22160 20 20 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e            pTab->
22170 61 43 6f 6c 5b 70 54 61 62 2d 3e 69 50 4b 65 79  aCol[pTab->iPKey
22180 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72 63  ].zName);.    rc
22190 20 3d 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52   = SQLITE_CONSTR
221a0 41 49 4e 54 5f 50 52 49 4d 41 52 59 4b 45 59 3b  AINT_PRIMARYKEY;
221b0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 4d  .  }else{.    zM
221c0 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69  sg = sqlite3MPri
221d0 6e 74 66 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ntf(pParse->db, 
221e0 22 25 73 2e 72 6f 77 69 64 22 2c 20 70 54 61 62  "%s.rowid", pTab
221f0 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72 63  ->zName);.    rc
22200 20 3d 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52   = SQLITE_CONSTR
22210 41 49 4e 54 5f 52 4f 57 49 44 3b 0a 20 20 7d 0a  AINT_ROWID;.  }.
22220 20 20 73 71 6c 69 74 65 33 48 61 6c 74 43 6f 6e    sqlite3HaltCon
22230 73 74 72 61 69 6e 74 28 70 50 61 72 73 65 2c 20  straint(pParse, 
22240 72 63 2c 20 6f 6e 45 72 72 6f 72 2c 20 7a 4d 73  rc, onError, zMs
22250 67 2c 20 50 34 5f 44 59 4e 41 4d 49 43 2c 0a 20  g, P4_DYNAMIC,. 
22260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22270 20 20 20 20 20 20 20 50 35 5f 43 6f 6e 73 74 72         P5_Constr
22280 61 69 6e 74 55 6e 69 71 75 65 29 3b 0a 7d 0a 0a  aintUnique);.}..
22290 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73  /*.** Check to s
222a0 65 65 20 69 66 20 70 49 6e 64 65 78 20 75 73 65  ee if pIndex use
222b0 73 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20  s the collating 
222c0 73 65 71 75 65 6e 63 65 20 70 43 6f 6c 6c 2e 20  sequence pColl. 
222d0 20 52 65 74 75 72 6e 0a 2a 2a 20 74 72 75 65 20   Return.** true 
222e0 69 66 20 69 74 20 64 6f 65 73 20 61 6e 64 20 66  if it does and f
222f0 61 6c 73 65 20 69 66 20 69 74 20 64 6f 65 73 20  alse if it does 
22300 6e 6f 74 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  not..*/.#ifndef 
22310 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 52 45 49 4e  SQLITE_OMIT_REIN
22320 44 45 58 0a 73 74 61 74 69 63 20 69 6e 74 20 63  DEX.static int c
22330 6f 6c 6c 61 74 69 6f 6e 4d 61 74 63 68 28 63 6f  ollationMatch(co
22340 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 2c  nst char *zColl,
22350 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 29 7b   Index *pIndex){
22360 0a 20 20 69 6e 74 20 69 3b 0a 20 20 61 73 73 65  .  int i;.  asse
22370 72 74 28 20 7a 43 6f 6c 6c 21 3d 30 20 29 3b 0a  rt( zColl!=0 );.
22380 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 6e    for(i=0; i<pIn
22390 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b  dex->nColumn; i+
223a0 2b 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  +){.    const ch
223b0 61 72 20 2a 7a 20 3d 20 70 49 6e 64 65 78 2d 3e  ar *z = pIndex->
223c0 61 7a 43 6f 6c 6c 5b 69 5d 3b 0a 20 20 20 20 61  azColl[i];.    a
223d0 73 73 65 72 74 28 20 7a 21 3d 30 20 7c 7c 20 70  ssert( z!=0 || p
223e0 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b  Index->aiColumn[
223f0 69 5d 3c 30 20 29 3b 0a 20 20 20 20 69 66 28 20  i]<0 );.    if( 
22400 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e  pIndex->aiColumn
22410 5b 69 5d 3e 3d 30 20 26 26 20 30 3d 3d 73 71 6c  [i]>=0 && 0==sql
22420 69 74 65 33 53 74 72 49 43 6d 70 28 7a 2c 20 7a  ite3StrICmp(z, z
22430 43 6f 6c 6c 29 20 29 7b 0a 20 20 20 20 20 20 72  Coll) ){.      r
22440 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20  eturn 1;.    }. 
22450 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
22460 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52  .#endif../*.** R
22470 65 63 6f 6d 70 75 74 65 20 61 6c 6c 20 69 6e 64  ecompute all ind
22480 69 63 65 73 20 6f 66 20 70 54 61 62 20 74 68 61  ices of pTab tha
22490 74 20 75 73 65 20 74 68 65 20 63 6f 6c 6c 61 74  t use the collat
224a0 69 6e 67 20 73 65 71 75 65 6e 63 65 20 70 43 6f  ing sequence pCo
224b0 6c 6c 2e 0a 2a 2a 20 49 66 20 70 43 6f 6c 6c 3d  ll..** If pColl=
224c0 3d 30 20 74 68 65 6e 20 72 65 63 6f 6d 70 75 74  =0 then recomput
224d0 65 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 6f 66  e all indices of
224e0 20 70 54 61 62 2e 0a 2a 2f 0a 23 69 66 6e 64 65   pTab..*/.#ifnde
224f0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 52 45  f SQLITE_OMIT_RE
22500 49 4e 44 45 58 0a 73 74 61 74 69 63 20 76 6f 69  INDEX.static voi
22510 64 20 72 65 69 6e 64 65 78 54 61 62 6c 65 28 50  d reindexTable(P
22520 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 61  arse *pParse, Ta
22530 62 6c 65 20 2a 70 54 61 62 2c 20 63 68 61 72 20  ble *pTab, char 
22540 63 6f 6e 73 74 20 2a 7a 43 6f 6c 6c 29 7b 0a 20  const *zColl){. 
22550 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b 20   Index *pIndex; 
22560 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
22570 41 6e 20 69 6e 64 65 78 20 61 73 73 6f 63 69 61  An index associa
22580 74 65 64 20 77 69 74 68 20 70 54 61 62 20 2a 2f  ted with pTab */
22590 0a 0a 20 20 66 6f 72 28 70 49 6e 64 65 78 3d 70  ..  for(pIndex=p
225a0 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 6e  Tab->pIndex; pIn
225b0 64 65 78 3b 20 70 49 6e 64 65 78 3d 70 49 6e 64  dex; pIndex=pInd
225c0 65 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  ex->pNext){.    
225d0 69 66 28 20 7a 43 6f 6c 6c 3d 3d 30 20 7c 7c 20  if( zColl==0 || 
225e0 63 6f 6c 6c 61 74 69 6f 6e 4d 61 74 63 68 28 7a  collationMatch(z
225f0 43 6f 6c 6c 2c 20 70 49 6e 64 65 78 29 20 29 7b  Coll, pIndex) ){
22600 0a 20 20 20 20 20 20 69 6e 74 20 69 44 62 20 3d  .      int iDb =
22610 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f   sqlite3SchemaTo
22620 49 6e 64 65 78 28 70 50 61 72 73 65 2d 3e 64 62  Index(pParse->db
22630 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29  , pTab->pSchema)
22640 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  ;.      sqlite3B
22650 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69  eginWriteOperati
22660 6f 6e 28 70 50 61 72 73 65 2c 20 30 2c 20 69 44  on(pParse, 0, iD
22670 62 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  b);.      sqlite
22680 33 52 65 66 69 6c 6c 49 6e 64 65 78 28 70 50 61  3RefillIndex(pPa
22690 72 73 65 2c 20 70 49 6e 64 65 78 2c 20 2d 31 29  rse, pIndex, -1)
226a0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65  ;.    }.  }.}.#e
226b0 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6f  ndif../*.** Reco
226c0 6d 70 75 74 65 20 61 6c 6c 20 69 6e 64 69 63 65  mpute all indice
226d0 73 20 6f 66 20 61 6c 6c 20 74 61 62 6c 65 73 20  s of all tables 
226e0 69 6e 20 61 6c 6c 20 64 61 74 61 62 61 73 65 73  in all databases
226f0 20 77 68 65 72 65 20 74 68 65 0a 2a 2a 20 69 6e   where the.** in
22700 64 69 63 65 73 20 75 73 65 20 74 68 65 20 63 6f  dices use the co
22710 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
22720 20 70 43 6f 6c 6c 2e 20 20 49 66 20 70 43 6f 6c   pColl.  If pCol
22730 6c 3d 3d 30 20 74 68 65 6e 20 72 65 63 6f 6d 70  l==0 then recomp
22740 75 74 65 0a 2a 2a 20 61 6c 6c 20 69 6e 64 69 63  ute.** all indic
22750 65 73 20 65 76 65 72 79 77 68 65 72 65 2e 0a 2a  es everywhere..*
22760 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
22770 5f 4f 4d 49 54 5f 52 45 49 4e 44 45 58 0a 73 74  _OMIT_REINDEX.st
22780 61 74 69 63 20 76 6f 69 64 20 72 65 69 6e 64 65  atic void reinde
22790 78 44 61 74 61 62 61 73 65 73 28 50 61 72 73 65  xDatabases(Parse
227a0 20 2a 70 50 61 72 73 65 2c 20 63 68 61 72 20 63   *pParse, char c
227b0 6f 6e 73 74 20 2a 7a 43 6f 6c 6c 29 7b 0a 20 20  onst *zColl){.  
227c0 44 62 20 2a 70 44 62 3b 20 20 20 20 20 20 20 20  Db *pDb;        
227d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
227e0 20 73 69 6e 67 6c 65 20 64 61 74 61 62 61 73 65   single database
227f0 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62 3b 20 20   */.  int iDb;  
22800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22810 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73    /* The databas
22820 65 20 69 6e 64 65 78 20 6e 75 6d 62 65 72 20 2a  e index number *
22830 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  /.  sqlite3 *db 
22840 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 20  = pParse->db;   
22850 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20  /* The database 
22860 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20  connection */.  
22870 48 61 73 68 45 6c 65 6d 20 2a 6b 3b 20 20 20 20  HashElem *k;    
22880 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
22890 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20  or looping over 
228a0 74 61 62 6c 65 73 20 69 6e 20 70 44 62 20 2a 2f  tables in pDb */
228b0 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 20  .  Table *pTab; 
228c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
228d0 2a 20 41 20 74 61 62 6c 65 20 69 6e 20 74 68 65  * A table in the
228e0 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 0a 20 20   database */..  
228f0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42  assert( sqlite3B
22900 74 72 65 65 48 6f 6c 64 73 41 6c 6c 4d 75 74 65  treeHoldsAllMute
22910 78 65 73 28 64 62 29 20 29 3b 20 20 2f 2a 20 4e  xes(db) );  /* N
22920 65 65 64 65 64 20 66 6f 72 20 73 63 68 65 6d 61  eeded for schema
22930 20 61 63 63 65 73 73 20 2a 2f 0a 20 20 66 6f 72   access */.  for
22940 28 69 44 62 3d 30 2c 20 70 44 62 3d 64 62 2d 3e  (iDb=0, pDb=db->
22950 61 44 62 3b 20 69 44 62 3c 64 62 2d 3e 6e 44 62  aDb; iDb<db->nDb
22960 3b 20 69 44 62 2b 2b 2c 20 70 44 62 2b 2b 29 7b  ; iDb++, pDb++){
22970 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 44 62  .    assert( pDb
22980 21 3d 30 20 29 3b 0a 20 20 20 20 66 6f 72 28 6b  !=0 );.    for(k
22990 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72 73 74  =sqliteHashFirst
229a0 28 26 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e  (&pDb->pSchema->
229b0 74 62 6c 48 61 73 68 29 3b 20 20 6b 3b 20 6b 3d  tblHash);  k; k=
229c0 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28 6b  sqliteHashNext(k
229d0 29 29 7b 0a 20 20 20 20 20 20 70 54 61 62 20 3d  )){.      pTab =
229e0 20 28 54 61 62 6c 65 2a 29 73 71 6c 69 74 65 48   (Table*)sqliteH
229f0 61 73 68 44 61 74 61 28 6b 29 3b 0a 20 20 20 20  ashData(k);.    
22a00 20 20 72 65 69 6e 64 65 78 54 61 62 6c 65 28 70    reindexTable(p
22a10 50 61 72 73 65 2c 20 70 54 61 62 2c 20 7a 43 6f  Parse, pTab, zCo
22a20 6c 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  ll);.    }.  }.}
22a30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 47  .#endif../*.** G
22a40 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72  enerate code for
22a50 20 74 68 65 20 52 45 49 4e 44 45 58 20 63 6f 6d   the REINDEX com
22a60 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20  mand..**.**     
22a70 20 20 20 52 45 49 4e 44 45 58 20 20 20 20 20 20     REINDEX      
22a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22a90 20 20 20 20 20 20 2d 2d 20 31 0a 2a 2a 20 20 20        -- 1.**   
22aa0 20 20 20 20 20 52 45 49 4e 44 45 58 20 20 3c 63       REINDEX  <c
22ab0 6f 6c 6c 61 74 69 6f 6e 3e 20 20 20 20 20 20 20  ollation>       
22ac0 20 20 20 20 20 20 20 20 2d 2d 20 32 0a 2a 2a 20          -- 2.** 
22ad0 20 20 20 20 20 20 20 52 45 49 4e 44 45 58 20 20         REINDEX  
22ae0 3f 3c 64 61 74 61 62 61 73 65 3e 2e 3f 3c 74 61  ?<database>.?<ta
22af0 62 6c 65 6e 61 6d 65 3e 20 20 2d 2d 20 33 0a 2a  blename>  -- 3.*
22b00 2a 20 20 20 20 20 20 20 20 52 45 49 4e 44 45 58  *        REINDEX
22b10 20 20 3f 3c 64 61 74 61 62 61 73 65 3e 2e 3f 3c    ?<database>.?<
22b20 69 6e 64 65 78 6e 61 6d 65 3e 20 20 2d 2d 20 34  indexname>  -- 4
22b30 0a 2a 2a 0a 2a 2a 20 46 6f 72 6d 20 31 20 63 61  .**.** Form 1 ca
22b40 75 73 65 73 20 61 6c 6c 20 69 6e 64 69 63 65 73  uses all indices
22b50 20 69 6e 20 61 6c 6c 20 61 74 74 61 63 68 65 64   in all attached
22b60 20 64 61 74 61 62 61 73 65 73 20 74 6f 20 62 65   databases to be
22b70 20 72 65 62 75 69 6c 74 2e 0a 2a 2a 20 46 6f 72   rebuilt..** For
22b80 6d 20 32 20 72 65 62 75 69 6c 64 73 20 61 6c 6c  m 2 rebuilds all
22b90 20 69 6e 64 69 63 65 73 20 69 6e 20 61 6c 6c 20   indices in all 
22ba0 64 61 74 61 62 61 73 65 73 20 74 68 61 74 20 75  databases that u
22bb0 73 65 20 74 68 65 20 6e 61 6d 65 64 0a 2a 2a 20  se the named.** 
22bc0 63 6f 6c 6c 61 74 69 6e 67 20 66 75 6e 63 74 69  collating functi
22bd0 6f 6e 2e 20 20 46 6f 72 6d 73 20 33 20 61 6e 64  on.  Forms 3 and
22be0 20 34 20 72 65 62 75 69 6c 64 20 74 68 65 20 6e   4 rebuild the n
22bf0 61 6d 65 64 20 69 6e 64 65 78 20 6f 72 20 61 6c  amed index or al
22c00 6c 0a 2a 2a 20 69 6e 64 69 63 65 73 20 61 73 73  l.** indices ass
22c10 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
22c20 20 6e 61 6d 65 64 20 74 61 62 6c 65 2e 0a 2a 2f   named table..*/
22c30 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
22c40 4f 4d 49 54 5f 52 45 49 4e 44 45 58 0a 76 6f 69  OMIT_REINDEX.voi
22c50 64 20 73 71 6c 69 74 65 33 52 65 69 6e 64 65 78  d sqlite3Reindex
22c60 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
22c70 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c 20 54  Token *pName1, T
22c80 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32 29 7b 0a 20  oken *pName2){. 
22c90 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b   CollSeq *pColl;
22ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
22cb0 43 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  Collating sequen
22cc0 63 65 20 74 6f 20 62 65 20 72 65 69 6e 64 65 78  ce to be reindex
22cd0 65 64 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20  ed, or NULL */. 
22ce0 20 63 68 61 72 20 2a 7a 3b 20 20 20 20 20 20 20   char *z;       
22cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
22d00 4e 61 6d 65 20 6f 66 20 61 20 74 61 62 6c 65 20  Name of a table 
22d10 6f 72 20 69 6e 64 65 78 20 2a 2f 0a 20 20 63 6f  or index */.  co
22d20 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 3b 20 20  nst char *zDb;  
22d30 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
22d40 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
22d50 65 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54  e */.  Table *pT
22d60 61 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ab;             
22d70 20 20 20 2f 2a 20 41 20 74 61 62 6c 65 20 69 6e     /* A table in
22d80 20 74 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f   the database */
22d90 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78  .  Index *pIndex
22da0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
22db0 2a 20 41 6e 20 69 6e 64 65 78 20 61 73 73 6f 63  * An index assoc
22dc0 69 61 74 65 64 20 77 69 74 68 20 70 54 61 62 20  iated with pTab 
22dd0 2a 2f 0a 20 20 69 6e 74 20 69 44 62 3b 20 20 20  */.  int iDb;   
22de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22df0 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65   /* The database
22e00 20 69 6e 64 65 78 20 6e 75 6d 62 65 72 20 2a 2f   index number */
22e10 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
22e20 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 20 2f   pParse->db;   /
22e30 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 63  * The database c
22e40 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 54  onnection */.  T
22e50 6f 6b 65 6e 20 2a 70 4f 62 6a 4e 61 6d 65 3b 20  oken *pObjName; 
22e60 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61             /* Na
22e70 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  me of the table 
22e80 6f 72 20 69 6e 64 65 78 20 74 6f 20 62 65 20 72  or index to be r
22e90 65 69 6e 64 65 78 65 64 20 2a 2f 0a 0a 20 20 2f  eindexed */..  /
22ea0 2a 20 52 65 61 64 20 74 68 65 20 64 61 74 61 62  * Read the datab
22eb0 61 73 65 20 73 63 68 65 6d 61 2e 20 49 66 20 61  ase schema. If a
22ec0 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
22ed0 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d  leave an error m
22ee0 65 73 73 61 67 65 0a 20 20 2a 2a 20 61 6e 64 20  essage.  ** and 
22ef0 63 6f 64 65 20 69 6e 20 70 50 61 72 73 65 20 61  code in pParse a
22f00 6e 64 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 20  nd return NULL. 
22f10 2a 2f 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f  */.  if( SQLITE_
22f20 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65 61 64 53  OK!=sqlite3ReadS
22f30 63 68 65 6d 61 28 70 50 61 72 73 65 29 20 29 7b  chema(pParse) ){
22f40 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
22f50 0a 0a 20 20 69 66 28 20 70 4e 61 6d 65 31 3d 3d  ..  if( pName1==
22f60 30 20 29 7b 0a 20 20 20 20 72 65 69 6e 64 65 78  0 ){.    reindex
22f70 44 61 74 61 62 61 73 65 73 28 70 50 61 72 73 65  Databases(pParse
22f80 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
22f90 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 4e 45  ;.  }else if( NE
22fa0 56 45 52 28 70 4e 61 6d 65 32 3d 3d 30 29 20 7c  VER(pName2==0) |
22fb0 7c 20 70 4e 61 6d 65 32 2d 3e 7a 3d 3d 30 20 29  | pName2->z==0 )
22fc0 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 43 6f 6c  {.    char *zCol
22fd0 6c 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  l;.    assert( p
22fe0 4e 61 6d 65 31 2d 3e 7a 20 29 3b 0a 20 20 20 20  Name1->z );.    
22ff0 7a 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 4e  zColl = sqlite3N
23000 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 50 61  ameFromToken(pPa
23010 72 73 65 2d 3e 64 62 2c 20 70 4e 61 6d 65 31 29  rse->db, pName1)
23020 3b 0a 20 20 20 20 69 66 28 20 21 7a 43 6f 6c 6c  ;.    if( !zColl
23030 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 70   ) return;.    p
23040 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 46 69  Coll = sqlite3Fi
23050 6e 64 43 6f 6c 6c 53 65 71 28 64 62 2c 20 45 4e  ndCollSeq(db, EN
23060 43 28 64 62 29 2c 20 7a 43 6f 6c 6c 2c 20 30 29  C(db), zColl, 0)
23070 3b 0a 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 20  ;.    if( pColl 
23080 29 7b 0a 20 20 20 20 20 20 72 65 69 6e 64 65 78  ){.      reindex
23090 44 61 74 61 62 61 73 65 73 28 70 50 61 72 73 65  Databases(pParse
230a0 2c 20 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20 20 20  , zColl);.      
230b0 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
230c0 2c 20 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20 20 20  , zColl);.      
230d0 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20  return;.    }.  
230e0 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
230f0 64 62 2c 20 7a 43 6f 6c 6c 29 3b 0a 20 20 7d 0a  db, zColl);.  }.
23100 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 54    iDb = sqlite3T
23110 77 6f 50 61 72 74 4e 61 6d 65 28 70 50 61 72 73  woPartName(pPars
23120 65 2c 20 70 4e 61 6d 65 31 2c 20 70 4e 61 6d 65  e, pName1, pName
23130 32 2c 20 26 70 4f 62 6a 4e 61 6d 65 29 3b 0a 20  2, &pObjName);. 
23140 20 69 66 28 20 69 44 62 3c 30 20 29 20 72 65 74   if( iDb<0 ) ret
23150 75 72 6e 3b 0a 20 20 7a 20 3d 20 73 71 6c 69 74  urn;.  z = sqlit
23160 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28  e3NameFromToken(
23170 64 62 2c 20 70 4f 62 6a 4e 61 6d 65 29 3b 0a 20  db, pObjName);. 
23180 20 69 66 28 20 7a 3d 3d 30 20 29 20 72 65 74 75   if( z==0 ) retu
23190 72 6e 3b 0a 20 20 7a 44 62 20 3d 20 64 62 2d 3e  rn;.  zDb = db->
231a0 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a  aDb[iDb].zName;.
231b0 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33    pTab = sqlite3
231c0 46 69 6e 64 54 61 62 6c 65 28 64 62 2c 20 7a 2c  FindTable(db, z,
231d0 20 7a 44 62 29 3b 0a 20 20 69 66 28 20 70 54 61   zDb);.  if( pTa
231e0 62 20 29 7b 0a 20 20 20 20 72 65 69 6e 64 65 78  b ){.    reindex
231f0 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70 54  Table(pParse, pT
23200 61 62 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69  ab, 0);.    sqli
23210 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 29  te3DbFree(db, z)
23220 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
23230 7d 0a 20 20 70 49 6e 64 65 78 20 3d 20 73 71 6c  }.  pIndex = sql
23240 69 74 65 33 46 69 6e 64 49 6e 64 65 78 28 64 62  ite3FindIndex(db
23250 2c 20 7a 2c 20 7a 44 62 29 3b 0a 20 20 73 71 6c  , z, zDb);.  sql
23260 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a  ite3DbFree(db, z
23270 29 3b 0a 20 20 69 66 28 20 70 49 6e 64 65 78 20  );.  if( pIndex 
23280 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65  ){.    sqlite3Be
23290 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f  ginWriteOperatio
232a0 6e 28 70 50 61 72 73 65 2c 20 30 2c 20 69 44 62  n(pParse, 0, iDb
232b0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65  );.    sqlite3Re
232c0 66 69 6c 6c 49 6e 64 65 78 28 70 50 61 72 73 65  fillIndex(pParse
232d0 2c 20 70 49 6e 64 65 78 2c 20 2d 31 29 3b 0a 20  , pIndex, -1);. 
232e0 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
232f0 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
23300 28 70 50 61 72 73 65 2c 20 22 75 6e 61 62 6c 65  (pParse, "unable
23310 20 74 6f 20 69 64 65 6e 74 69 66 79 20 74 68 65   to identify the
23320 20 6f 62 6a 65 63 74 20 74 6f 20 62 65 20 72 65   object to be re
23330 69 6e 64 65 78 65 64 22 29 3b 0a 7d 0a 23 65 6e  indexed");.}.#en
23340 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  dif../*.** Retur
23350 6e 20 61 20 4b 65 79 49 6e 66 6f 20 73 74 72 75  n a KeyInfo stru
23360 63 74 75 72 65 20 74 68 61 74 20 69 73 20 61 70  cture that is ap
23370 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20 74 68  propriate for th
23380 65 20 67 69 76 65 6e 20 49 6e 64 65 78 2e 0a 2a  e given Index..*
23390 2a 0a 2a 2a 20 54 68 65 20 4b 65 79 49 6e 66 6f  *.** The KeyInfo
233a0 20 73 74 72 75 63 74 75 72 65 20 66 6f 72 20 61   structure for a
233b0 6e 20 69 6e 64 65 78 20 69 73 20 63 61 63 68 65  n index is cache
233c0 64 20 69 6e 20 74 68 65 20 49 6e 64 65 78 20 6f  d in the Index o
233d0 62 6a 65 63 74 2e 0a 2a 2a 20 53 6f 20 74 68 65  bject..** So the
233e0 72 65 20 6d 69 67 68 74 20 62 65 20 6d 75 6c 74  re might be mult
233f0 69 70 6c 65 20 72 65 66 65 72 65 6e 63 65 73 20  iple references 
23400 74 6f 20 74 68 65 20 72 65 74 75 72 6e 65 64 20  to the returned 
23410 70 6f 69 6e 74 65 72 2e 20 20 54 68 65 0a 2a 2a  pointer.  The.**
23420 20 63 61 6c 6c 65 72 20 73 68 6f 75 6c 64 20 6e   caller should n
23430 6f 74 20 74 72 79 20 74 6f 20 6d 6f 64 69 66 79  ot try to modify
23440 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 6f 62 6a   the KeyInfo obj
23450 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63  ect..**.** The c
23460 61 6c 6c 65 72 20 73 68 6f 75 6c 64 20 69 6e 76  aller should inv
23470 6f 6b 65 20 73 71 6c 69 74 65 33 4b 65 79 49 6e  oke sqlite3KeyIn
23480 66 6f 55 6e 72 65 66 28 29 20 6f 6e 20 74 68 65  foUnref() on the
23490 20 72 65 74 75 72 6e 65 64 20 6f 62 6a 65 63 74   returned object
234a0 0a 2a 2a 20 77 68 65 6e 20 69 74 20 68 61 73 20  .** when it has 
234b0 66 69 6e 69 73 68 65 64 20 75 73 69 6e 67 20 69  finished using i
234c0 74 2e 0a 2a 2f 0a 4b 65 79 49 6e 66 6f 20 2a 73  t..*/.KeyInfo *s
234d0 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 4f 66 49  qlite3KeyInfoOfI
234e0 6e 64 65 78 28 50 61 72 73 65 20 2a 70 50 61 72  ndex(Parse *pPar
234f0 73 65 2c 20 49 6e 64 65 78 20 2a 70 49 64 78 29  se, Index *pIdx)
23500 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74  {.  int i;.  int
23510 20 6e 43 6f 6c 20 3d 20 70 49 64 78 2d 3e 6e 43   nCol = pIdx->nC
23520 6f 6c 75 6d 6e 3b 0a 20 20 69 6e 74 20 6e 4b 65  olumn;.  int nKe
23530 79 20 3d 20 70 49 64 78 2d 3e 6e 4b 65 79 43 6f  y = pIdx->nKeyCo
23540 6c 3b 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b  l;.  KeyInfo *pK
23550 65 79 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65  ey;.  if( pParse
23560 2d 3e 6e 45 72 72 20 29 20 72 65 74 75 72 6e 20  ->nErr ) return 
23570 30 3b 0a 20 20 69 66 28 20 70 49 64 78 2d 3e 75  0;.  if( pIdx->u
23580 6e 69 71 4e 6f 74 4e 75 6c 6c 20 29 7b 0a 20 20  niqNotNull ){.  
23590 20 20 70 4b 65 79 20 3d 20 73 71 6c 69 74 65 33    pKey = sqlite3
235a0 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28 70 50 61  KeyInfoAlloc(pPa
235b0 72 73 65 2d 3e 64 62 2c 20 6e 4b 65 79 2c 20 6e  rse->db, nKey, n
235c0 43 6f 6c 2d 6e 4b 65 79 29 3b 0a 20 20 7d 65 6c  Col-nKey);.  }el
235d0 73 65 7b 0a 20 20 20 20 70 4b 65 79 20 3d 20 73  se{.    pKey = s
235e0 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 41 6c 6c  qlite3KeyInfoAll
235f0 6f 63 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 6e  oc(pParse->db, n
23600 43 6f 6c 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69  Col, 0);.  }.  i
23610 66 28 20 70 4b 65 79 20 29 7b 0a 20 20 20 20 61  f( pKey ){.    a
23620 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 4b 65  ssert( sqlite3Ke
23630 79 49 6e 66 6f 49 73 57 72 69 74 65 61 62 6c 65  yInfoIsWriteable
23640 28 70 4b 65 79 29 20 29 3b 0a 20 20 20 20 66 6f  (pKey) );.    fo
23650 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69  r(i=0; i<nCol; i
23660 2b 2b 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74  ++){.      const
23670 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 20 3d 20 70   char *zColl = p
23680 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 3b 0a  Idx->azColl[i];.
23690 20 20 20 20 20 20 70 4b 65 79 2d 3e 61 43 6f 6c        pKey->aCol
236a0 6c 5b 69 5d 20 3d 20 7a 43 6f 6c 6c 3d 3d 73 71  l[i] = zColl==sq
236b0 6c 69 74 65 33 53 74 72 42 49 4e 41 52 59 20 3f  lite3StrBINARY ?
236c0 20 30 20 3a 0a 20 20 20 20 20 20 20 20 20 20 20   0 :.           
236d0 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
236e0 69 74 65 33 4c 6f 63 61 74 65 43 6f 6c 6c 53 65  ite3LocateCollSe
236f0 71 28 70 50 61 72 73 65 2c 20 7a 43 6f 6c 6c 29  q(pParse, zColl)
23700 3b 0a 20 20 20 20 20 20 70 4b 65 79 2d 3e 61 53  ;.      pKey->aS
23710 6f 72 74 4f 72 64 65 72 5b 69 5d 20 3d 20 70 49  ortOrder[i] = pI
23720 64 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69  dx->aSortOrder[i
23730 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  ];.    }.    if(
23740 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 7b   pParse->nErr ){
23750 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4b 65  .      sqlite3Ke
23760 79 49 6e 66 6f 55 6e 72 65 66 28 70 4b 65 79 29  yInfoUnref(pKey)
23770 3b 0a 20 20 20 20 20 20 70 4b 65 79 20 3d 20 30  ;.      pKey = 0
23780 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
23790 74 75 72 6e 20 70 4b 65 79 3b 0a 7d 0a 0a 23 69  turn pKey;.}..#i
237a0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
237b0 54 5f 43 54 45 0a 2f 2a 20 0a 2a 2a 20 54 68 69  T_CTE./* .** Thi
237c0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 69 6e 76  s routine is inv
237d0 6f 6b 65 64 20 6f 6e 63 65 20 70 65 72 20 43 54  oked once per CT
237e0 45 20 62 79 20 74 68 65 20 70 61 72 73 65 72 20  E by the parser 
237f0 77 68 69 6c 65 20 70 61 72 73 69 6e 67 20 61 20  while parsing a 
23800 0a 2a 2a 20 57 49 54 48 20 63 6c 61 75 73 65 2e  .** WITH clause.
23810 20 0a 2a 2f 0a 57 69 74 68 20 2a 73 71 6c 69 74   .*/.With *sqlit
23820 65 33 57 69 74 68 41 64 64 28 0a 20 20 50 61 72  e3WithAdd(.  Par
23830 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
23840 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
23850 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 69 74  context */.  Wit
23860 68 20 2a 70 57 69 74 68 2c 20 20 20 20 20 20 20  h *pWith,       
23870 20 20 20 20 20 2f 2a 20 45 78 69 73 74 69 6e 67       /* Existing
23880 20 57 49 54 48 20 63 6c 61 75 73 65 2c 20 6f 72   WITH clause, or
23890 20 4e 55 4c 4c 20 2a 2f 0a 20 20 54 6f 6b 65 6e   NULL */.  Token
238a0 20 2a 70 4e 61 6d 65 2c 20 20 20 20 20 20 20 20   *pName,        
238b0 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
238c0 65 20 63 6f 6d 6d 6f 6e 2d 74 61 62 6c 65 20 2a  e common-table *
238d0 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 41  /.  ExprList *pA
238e0 72 67 6c 69 73 74 2c 20 20 20 20 20 2f 2a 20 4f  rglist,     /* O
238f0 70 74 69 6f 6e 61 6c 20 63 6f 6c 75 6d 6e 20 6e  ptional column n
23900 61 6d 65 20 6c 69 73 74 20 66 6f 72 20 74 68 65  ame list for the
23910 20 74 61 62 6c 65 20 2a 2f 0a 20 20 53 65 6c 65   table */.  Sele
23920 63 74 20 2a 70 51 75 65 72 79 20 20 20 20 20 20  ct *pQuery      
23930 20 20 20 20 2f 2a 20 51 75 65 72 79 20 75 73 65      /* Query use
23940 64 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20  d to initialize 
23950 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 29 7b 0a  the table */.){.
23960 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
23970 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 57 69  pParse->db;.  Wi
23980 74 68 20 2a 70 4e 65 77 3b 0a 20 20 63 68 61 72  th *pNew;.  char
23990 20 2a 7a 4e 61 6d 65 3b 0a 0a 20 20 2f 2a 20 43   *zName;..  /* C
239a0 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 43 54  heck that the CT
239b0 45 20 6e 61 6d 65 20 69 73 20 75 6e 69 71 75 65  E name is unique
239c0 20 77 69 74 68 69 6e 20 74 68 69 73 20 57 49 54   within this WIT
239d0 48 20 63 6c 61 75 73 65 2e 20 49 66 0a 20 20 2a  H clause. If.  *
239e0 2a 20 6e 6f 74 2c 20 73 74 6f 72 65 20 61 6e 20  * not, store an 
239f0 65 72 72 6f 72 20 69 6e 20 74 68 65 20 50 61 72  error in the Par
23a00 73 65 20 73 74 72 75 63 74 75 72 65 2e 20 2a 2f  se structure. */
23a10 0a 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74  .  zName = sqlit
23a20 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28  e3NameFromToken(
23a30 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 4e 61 6d  pParse->db, pNam
23a40 65 29 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65 20  e);.  if( zName 
23a50 26 26 20 70 57 69 74 68 20 29 7b 0a 20 20 20 20  && pWith ){.    
23a60 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69  int i;.    for(i
23a70 3d 30 3b 20 69 3c 70 57 69 74 68 2d 3e 6e 43 74  =0; i<pWith->nCt
23a80 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  e; i++){.      i
23a90 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  f( sqlite3StrICm
23aa0 70 28 7a 4e 61 6d 65 2c 20 70 57 69 74 68 2d 3e  p(zName, pWith->
23ab0 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29  a[i].zName)==0 )
23ac0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
23ad0 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
23ae0 2c 20 22 64 75 70 6c 69 63 61 74 65 20 57 49 54  , "duplicate WIT
23af0 48 20 74 61 62 6c 65 20 6e 61 6d 65 3a 20 25 73  H table name: %s
23b00 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  ", zName);.     
23b10 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
23b20 69 66 28 20 70 57 69 74 68 20 29 7b 0a 20 20 20  if( pWith ){.   
23b30 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 73 69 7a   int nByte = siz
23b40 65 6f 66 28 2a 70 57 69 74 68 29 20 2b 20 28 73  eof(*pWith) + (s
23b50 69 7a 65 6f 66 28 70 57 69 74 68 2d 3e 61 5b 31  izeof(pWith->a[1
23b60 5d 29 20 2a 20 70 57 69 74 68 2d 3e 6e 43 74 65  ]) * pWith->nCte
23b70 29 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20 73 71  );.    pNew = sq
23b80 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 28 64  lite3DbRealloc(d
23b90 62 2c 20 70 57 69 74 68 2c 20 6e 42 79 74 65 29  b, pWith, nByte)
23ba0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
23bb0 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  New = sqlite3DbM
23bc0 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69  allocZero(db, si
23bd0 7a 65 6f 66 28 2a 70 57 69 74 68 29 29 3b 0a 20  zeof(*pWith));. 
23be0 20 7d 0a 20 20 61 73 73 65 72 74 28 20 28 70 4e   }.  assert( (pN
23bf0 65 77 21 3d 30 20 26 26 20 7a 4e 61 6d 65 21 3d  ew!=0 && zName!=
23c00 30 29 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63  0) || db->malloc
23c10 46 61 69 6c 65 64 20 29 3b 0a 0a 20 20 69 66 28  Failed );..  if(
23c20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
23c30 64 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  d ){.    sqlite3
23c40 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64  ExprListDelete(d
23c50 62 2c 20 70 41 72 67 6c 69 73 74 29 3b 0a 20 20  b, pArglist);.  
23c60 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44    sqlite3SelectD
23c70 65 6c 65 74 65 28 64 62 2c 20 70 51 75 65 72 79  elete(db, pQuery
23c80 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  );.    sqlite3Db
23c90 46 72 65 65 28 64 62 2c 20 7a 4e 61 6d 65 29 3b  Free(db, zName);
23ca0 0a 20 20 20 20 70 4e 65 77 20 3d 20 70 57 69 74  .    pNew = pWit
23cb0 68 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  h;.  }else{.    
23cc0 70 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e 43  pNew->a[pNew->nC
23cd0 74 65 5d 2e 70 53 65 6c 65 63 74 20 3d 20 70 51  te].pSelect = pQ
23ce0 75 65 72 79 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  uery;.    pNew->
23cf0 61 5b 70 4e 65 77 2d 3e 6e 43 74 65 5d 2e 70 43  a[pNew->nCte].pC
23d00 6f 6c 73 20 3d 20 70 41 72 67 6c 69 73 74 3b 0a  ols = pArglist;.
23d10 20 20 20 20 70 4e 65 77 2d 3e 61 5b 70 4e 65 77      pNew->a[pNew
23d20 2d 3e 6e 43 74 65 5d 2e 7a 4e 61 6d 65 20 3d 20  ->nCte].zName = 
23d30 7a 4e 61 6d 65 3b 0a 20 20 20 20 70 4e 65 77 2d  zName;.    pNew-
23d40 3e 61 5b 70 4e 65 77 2d 3e 6e 43 74 65 5d 2e 7a  >a[pNew->nCte].z
23d50 43 74 65 45 72 72 20 3d 20 30 3b 0a 20 20 20 20  CteErr = 0;.    
23d60 70 4e 65 77 2d 3e 6e 43 74 65 2b 2b 3b 0a 20 20  pNew->nCte++;.  
23d70 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77  }..  return pNew
23d80 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20  ;.}../*.** Free 
23d90 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
23da0 74 68 65 20 57 69 74 68 20 6f 62 6a 65 63 74 20  the With object 
23db0 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65  passed as the se
23dc0 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e 0a 2a  cond argument..*
23dd0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 57 69  /.void sqlite3Wi
23de0 74 68 44 65 6c 65 74 65 28 73 71 6c 69 74 65 33  thDelete(sqlite3
23df0 20 2a 64 62 2c 20 57 69 74 68 20 2a 70 57 69 74   *db, With *pWit
23e00 68 29 7b 0a 20 20 69 66 28 20 70 57 69 74 68 20  h){.  if( pWith 
23e10 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  ){.    int i;.  
23e20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 57 69    for(i=0; i<pWi
23e30 74 68 2d 3e 6e 43 74 65 3b 20 69 2b 2b 29 7b 0a  th->nCte; i++){.
23e40 20 20 20 20 20 20 73 74 72 75 63 74 20 43 74 65        struct Cte
23e50 20 2a 70 43 74 65 20 3d 20 26 70 57 69 74 68 2d   *pCte = &pWith-
23e60 3e 61 5b 69 5d 3b 0a 20 20 20 20 20 20 73 71 6c  >a[i];.      sql
23e70 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65  ite3ExprListDele
23e80 74 65 28 64 62 2c 20 70 43 74 65 2d 3e 70 43 6f  te(db, pCte->pCo
23e90 6c 73 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ls);.      sqlit
23ea0 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64  e3SelectDelete(d
23eb0 62 2c 20 70 43 74 65 2d 3e 70 53 65 6c 65 63 74  b, pCte->pSelect
23ec0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
23ed0 44 62 46 72 65 65 28 64 62 2c 20 70 43 74 65 2d  DbFree(db, pCte-
23ee0 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20  >zName);.    }. 
23ef0 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
23f00 28 64 62 2c 20 70 57 69 74 68 29 3b 0a 20 20 7d  (db, pWith);.  }
23f10 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65  .}.#endif /* !de
23f20 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
23f30 54 5f 43 54 45 29 20 2a 2f 0a                    T_CTE) */.