/ Hex Artifact Content
Login

Artifact 535879738a9f9e351624ebe827bdfb6ef16475ae:


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 0a 20 20 20 20 20 20 20 20 20  Schema.         
4c10: 7c 7c 20 28 49 73 56 69 72 74 75 61 6c 28 70 54  || (IsVirtual(pT
4c20: 61 62 6c 65 29 20 26 26 20 70 49 6e 64 65 78 2d  able) && pIndex-
4c30: 3e 69 64 78 54 79 70 65 21 3d 53 51 4c 49 54 45  >idxType!=SQLITE
4c40: 5f 49 44 58 54 59 50 45 5f 41 50 50 44 45 46 29  _IDXTYPE_APPDEF)
4c50: 20 29 3b 0a 20 20 20 20 69 66 28 20 28 64 62 3d   );.    if( (db=
4c60: 3d 30 20 7c 7c 20 64 62 2d 3e 70 6e 42 79 74 65  =0 || db->pnByte
4c70: 73 46 72 65 65 64 3d 3d 30 29 20 26 26 20 21 49  sFreed==0) && !I
4c80: 73 56 69 72 74 75 61 6c 28 70 54 61 62 6c 65 29  sVirtual(pTable)
4c90: 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a   ){.      char *
4ca0: 7a 4e 61 6d 65 20 3d 20 70 49 6e 64 65 78 2d 3e  zName = pIndex->
4cb0: 7a 4e 61 6d 65 3b 20 0a 20 20 20 20 20 20 54 45  zName; .      TE
4cc0: 53 54 4f 4e 4c 59 20 28 20 49 6e 64 65 78 20 2a  STONLY ( Index *
4cd0: 70 4f 6c 64 20 3d 20 29 20 73 71 6c 69 74 65 33  pOld = ) sqlite3
4ce0: 48 61 73 68 49 6e 73 65 72 74 28 0a 20 20 20 20  HashInsert(.    
4cf0: 20 20 20 20 20 26 70 49 6e 64 65 78 2d 3e 70 53       &pIndex->pS
4d00: 63 68 65 6d 61 2d 3e 69 64 78 48 61 73 68 2c 20  chema->idxHash, 
4d10: 7a 4e 61 6d 65 2c 20 30 0a 20 20 20 20 20 20 29  zName, 0.      )
4d20: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
4d30: 64 62 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33  db==0 || sqlite3
4d40: 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28  SchemaMutexHeld(
4d50: 64 62 2c 20 30 2c 20 70 49 6e 64 65 78 2d 3e 70  db, 0, pIndex->p
4d60: 53 63 68 65 6d 61 29 20 29 3b 0a 20 20 20 20 20  Schema) );.     
4d70: 20 61 73 73 65 72 74 28 20 70 4f 6c 64 3d 3d 70   assert( pOld==p
4d80: 49 6e 64 65 78 20 7c 7c 20 70 4f 6c 64 3d 3d 30  Index || pOld==0
4d90: 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 72   );.    }.    fr
4da0: 65 65 49 6e 64 65 78 28 64 62 2c 20 70 49 6e 64  eeIndex(db, pInd
4db0: 65 78 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44  ex);.  }..  /* D
4dc0: 65 6c 65 74 65 20 61 6e 79 20 66 6f 72 65 69 67  elete any foreig
4dd0: 6e 20 6b 65 79 73 20 61 74 74 61 63 68 65 64 20  n keys attached 
4de0: 74 6f 20 74 68 69 73 20 74 61 62 6c 65 2e 20 2a  to this table. *
4df0: 2f 0a 20 20 73 71 6c 69 74 65 33 46 6b 44 65 6c  /.  sqlite3FkDel
4e00: 65 74 65 28 64 62 2c 20 70 54 61 62 6c 65 29 3b  ete(db, pTable);
4e10: 0a 0a 20 20 2f 2a 20 44 65 6c 65 74 65 20 74 68  ..  /* Delete th
4e20: 65 20 54 61 62 6c 65 20 73 74 72 75 63 74 75 72  e Table structur
4e30: 65 20 69 74 73 65 6c 66 2e 0a 20 20 2a 2f 0a 20  e itself..  */. 
4e40: 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65 43 6f   sqlite3DeleteCo
4e50: 6c 75 6d 6e 4e 61 6d 65 73 28 64 62 2c 20 70 54  lumnNames(db, pT
4e60: 61 62 6c 65 29 3b 0a 20 20 73 71 6c 69 74 65 33  able);.  sqlite3
4e70: 44 62 46 72 65 65 28 64 62 2c 20 70 54 61 62 6c  DbFree(db, pTabl
4e80: 65 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 73 71 6c  e->zName);.  sql
4e90: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
4ea0: 54 61 62 6c 65 2d 3e 7a 43 6f 6c 41 66 66 29 3b  Table->zColAff);
4eb0: 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  .  sqlite3Select
4ec0: 44 65 6c 65 74 65 28 64 62 2c 20 70 54 61 62 6c  Delete(db, pTabl
4ed0: 65 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20 73  e->pSelect);.  s
4ee0: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65  qlite3ExprListDe
4ef0: 6c 65 74 65 28 64 62 2c 20 70 54 61 62 6c 65 2d  lete(db, pTable-
4f00: 3e 70 43 68 65 63 6b 29 3b 0a 23 69 66 6e 64 65  >pCheck);.#ifnde
4f10: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
4f20: 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 73 71 6c  RTUALTABLE.  sql
4f30: 69 74 65 33 56 74 61 62 43 6c 65 61 72 28 64 62  ite3VtabClear(db
4f40: 2c 20 70 54 61 62 6c 65 29 3b 0a 23 65 6e 64 69  , pTable);.#endi
4f50: 66 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  f.  sqlite3DbFre
4f60: 65 28 64 62 2c 20 70 54 61 62 6c 65 29 3b 0a 0a  e(db, pTable);..
4f70: 20 20 2f 2a 20 56 65 72 69 66 79 20 74 68 61 74    /* Verify that
4f80: 20 6e 6f 20 6c 6f 6f 6b 61 73 69 64 65 20 6d 65   no lookaside me
4f90: 6d 6f 72 79 20 77 61 73 20 75 73 65 64 20 62 79  mory was used by
4fa0: 20 73 63 68 65 6d 61 20 74 61 62 6c 65 73 20 2a   schema tables *
4fb0: 2f 0a 20 20 61 73 73 65 72 74 28 20 6e 4c 6f 6f  /.  assert( nLoo
4fc0: 6b 61 73 69 64 65 3d 3d 30 20 7c 7c 20 6e 4c 6f  kaside==0 || nLo
4fd0: 6f 6b 61 73 69 64 65 3d 3d 64 62 2d 3e 6c 6f 6f  okaside==db->loo
4fe0: 6b 61 73 69 64 65 2e 6e 4f 75 74 20 29 3b 0a 7d  kaside.nOut );.}
4ff0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 44 65 6c  .void sqlite3Del
5000: 65 74 65 54 61 62 6c 65 28 73 71 6c 69 74 65 33  eteTable(sqlite3
5010: 20 2a 64 62 2c 20 54 61 62 6c 65 20 2a 70 54 61   *db, Table *pTa
5020: 62 6c 65 29 7b 0a 20 20 2f 2a 20 44 6f 20 6e 6f  ble){.  /* Do no
5030: 74 20 64 65 6c 65 74 65 20 74 68 65 20 74 61 62  t delete the tab
5040: 6c 65 20 75 6e 74 69 6c 20 74 68 65 20 72 65 66  le until the ref
5050: 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 72 65 61  erence count rea
5060: 63 68 65 73 20 7a 65 72 6f 2e 20 2a 2f 0a 20 20  ches zero. */.  
5070: 69 66 28 20 21 70 54 61 62 6c 65 20 29 20 72 65  if( !pTable ) re
5080: 74 75 72 6e 3b 0a 20 20 69 66 28 20 28 28 21 64  turn;.  if( ((!d
5090: 62 20 7c 7c 20 64 62 2d 3e 70 6e 42 79 74 65 73  b || db->pnBytes
50a0: 46 72 65 65 64 3d 3d 30 29 20 26 26 20 28 2d 2d  Freed==0) && (--
50b0: 70 54 61 62 6c 65 2d 3e 6e 52 65 66 29 3e 30 29  pTable->nRef)>0)
50c0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 64 65 6c   ) return;.  del
50d0: 65 74 65 54 61 62 6c 65 28 64 62 2c 20 70 54 61  eteTable(db, pTa
50e0: 62 6c 65 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  ble);.}.../*.** 
50f0: 55 6e 6c 69 6e 6b 20 74 68 65 20 67 69 76 65 6e  Unlink the given
5100: 20 74 61 62 6c 65 20 66 72 6f 6d 20 74 68 65 20   table from the 
5110: 68 61 73 68 20 74 61 62 6c 65 73 20 61 6e 64 20  hash tables and 
5120: 74 68 65 20 64 65 6c 65 74 65 20 74 68 65 0a 2a  the delete the.*
5130: 2a 20 74 61 62 6c 65 20 73 74 72 75 63 74 75 72  * table structur
5140: 65 20 77 69 74 68 20 61 6c 6c 20 69 74 73 20 69  e with all its i
5150: 6e 64 69 63 65 73 20 61 6e 64 20 66 6f 72 65 69  ndices and forei
5160: 67 6e 20 6b 65 79 73 2e 0a 2a 2f 0a 76 6f 69 64  gn keys..*/.void
5170: 20 73 71 6c 69 74 65 33 55 6e 6c 69 6e 6b 41 6e   sqlite3UnlinkAn
5180: 64 44 65 6c 65 74 65 54 61 62 6c 65 28 73 71 6c  dDeleteTable(sql
5190: 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 69 44  ite3 *db, int iD
51a0: 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  b, const char *z
51b0: 54 61 62 4e 61 6d 65 29 7b 0a 20 20 54 61 62 6c  TabName){.  Tabl
51c0: 65 20 2a 70 3b 0a 20 20 44 62 20 2a 70 44 62 3b  e *p;.  Db *pDb;
51d0: 0a 0a 20 20 61 73 73 65 72 74 28 20 64 62 21 3d  ..  assert( db!=
51e0: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69  0 );.  assert( i
51f0: 44 62 3e 3d 30 20 26 26 20 69 44 62 3c 64 62 2d  Db>=0 && iDb<db-
5200: 3e 6e 44 62 20 29 3b 0a 20 20 61 73 73 65 72 74  >nDb );.  assert
5210: 28 20 7a 54 61 62 4e 61 6d 65 20 29 3b 0a 20 20  ( zTabName );.  
5220: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 53  assert( sqlite3S
5230: 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64  chemaMutexHeld(d
5240: 62 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a 20 20  b, iDb, 0) );.  
5250: 74 65 73 74 63 61 73 65 28 20 7a 54 61 62 4e 61  testcase( zTabNa
5260: 6d 65 5b 30 5d 3d 3d 30 20 29 3b 20 20 2f 2a 20  me[0]==0 );  /* 
5270: 5a 65 72 6f 2d 6c 65 6e 67 74 68 20 74 61 62 6c  Zero-length tabl
5280: 65 20 6e 61 6d 65 73 20 61 72 65 20 61 6c 6c 6f  e names are allo
5290: 77 65 64 20 2a 2f 0a 20 20 70 44 62 20 3d 20 26  wed */.  pDb = &
52a0: 64 62 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a 20 20  db->aDb[iDb];.  
52b0: 70 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68 49  p = sqlite3HashI
52c0: 6e 73 65 72 74 28 26 70 44 62 2d 3e 70 53 63 68  nsert(&pDb->pSch
52d0: 65 6d 61 2d 3e 74 62 6c 48 61 73 68 2c 20 7a 54  ema->tblHash, zT
52e0: 61 62 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 73 71  abName, 0);.  sq
52f0: 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62 6c 65  lite3DeleteTable
5300: 28 64 62 2c 20 70 29 3b 0a 20 20 64 62 2d 3e 66  (db, p);.  db->f
5310: 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 49  lags |= SQLITE_I
5320: 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a 7d 0a  nternChanges;.}.
5330: 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20 74  ./*.** Given a t
5340: 6f 6b 65 6e 2c 20 72 65 74 75 72 6e 20 61 20 73  oken, return a s
5350: 74 72 69 6e 67 20 74 68 61 74 20 63 6f 6e 73 69  tring that consi
5360: 73 74 73 20 6f 66 20 74 68 65 20 74 65 78 74 20  sts of the text 
5370: 6f 66 20 74 68 61 74 0a 2a 2a 20 74 6f 6b 65 6e  of that.** token
5380: 2e 20 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64  .  Space to hold
5390: 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 73 74   the returned st
53a0: 72 69 6e 67 0a 2a 2a 20 69 73 20 6f 62 74 61 69  ring.** is obtai
53b0: 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 4d  ned from sqliteM
53c0: 61 6c 6c 6f 63 28 29 20 61 6e 64 20 6d 75 73 74  alloc() and must
53d0: 20 62 65 20 66 72 65 65 64 20 62 79 20 74 68 65   be freed by the
53e0: 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 66 75 6e 63   calling.** func
53f0: 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 41 6e 79 20  tion..**.** Any 
5400: 71 75 6f 74 61 74 69 6f 6e 20 6d 61 72 6b 73 20  quotation marks 
5410: 28 65 78 3a 20 20 22 6e 61 6d 65 22 2c 20 27 6e  (ex:  "name", 'n
5420: 61 6d 65 27 2c 20 5b 6e 61 6d 65 5d 2c 20 6f 72  ame', [name], or
5430: 20 60 6e 61 6d 65 60 29 20 74 68 61 74 0a 2a 2a   `name`) that.**
5440: 20 73 75 72 72 6f 75 6e 64 20 74 68 65 20 62 6f   surround the bo
5450: 64 79 20 6f 66 20 74 68 65 20 74 6f 6b 65 6e 20  dy of the token 
5460: 61 72 65 20 72 65 6d 6f 76 65 64 2e 0a 2a 2a 0a  are removed..**.
5470: 2a 2a 20 54 6f 6b 65 6e 73 20 61 72 65 20 6f 66  ** Tokens are of
5480: 74 65 6e 20 6a 75 73 74 20 70 6f 69 6e 74 65 72  ten just pointer
5490: 73 20 69 6e 74 6f 20 74 68 65 20 6f 72 69 67 69  s into the origi
54a0: 6e 61 6c 20 53 51 4c 20 74 65 78 74 20 61 6e 64  nal SQL text and
54b0: 20 73 6f 0a 2a 2a 20 61 72 65 20 6e 6f 74 20 5c   so.** are not \
54c0: 30 30 30 20 74 65 72 6d 69 6e 61 74 65 64 20 61  000 terminated a
54d0: 6e 64 20 61 72 65 20 6e 6f 74 20 70 65 72 73 69  nd are not persi
54e0: 73 74 65 6e 74 2e 20 20 54 68 65 20 72 65 74 75  stent.  The retu
54f0: 72 6e 65 64 20 73 74 72 69 6e 67 0a 2a 2a 20 69  rned string.** i
5500: 73 20 5c 30 30 30 20 74 65 72 6d 69 6e 61 74 65  s \000 terminate
5510: 64 20 61 6e 64 20 69 73 20 70 65 72 73 69 73 74  d and is persist
5520: 65 6e 74 2e 0a 2a 2f 0a 63 68 61 72 20 2a 73 71  ent..*/.char *sq
5530: 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b  lite3NameFromTok
5540: 65 6e 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  en(sqlite3 *db, 
5550: 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 29 7b 0a 20  Token *pName){. 
5560: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20   char *zName;.  
5570: 69 66 28 20 70 4e 61 6d 65 20 29 7b 0a 20 20 20  if( pName ){.   
5580: 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33   zName = sqlite3
5590: 44 62 53 74 72 4e 44 75 70 28 64 62 2c 20 28 63  DbStrNDup(db, (c
55a0: 68 61 72 2a 29 70 4e 61 6d 65 2d 3e 7a 2c 20 70  har*)pName->z, p
55b0: 4e 61 6d 65 2d 3e 6e 29 3b 0a 20 20 20 20 73 71  Name->n);.    sq
55c0: 6c 69 74 65 33 44 65 71 75 6f 74 65 28 7a 4e 61  lite3Dequote(zNa
55d0: 6d 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  me);.  }else{.  
55e0: 20 20 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 7d    zName = 0;.  }
55f0: 0a 20 20 72 65 74 75 72 6e 20 7a 4e 61 6d 65 3b  .  return zName;
5600: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 74  .}../*.** Open t
5610: 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  he sqlite_master
5620: 20 74 61 62 6c 65 20 73 74 6f 72 65 64 20 69 6e   table stored in
5630: 20 64 61 74 61 62 61 73 65 20 6e 75 6d 62 65 72   database number
5640: 20 69 44 62 20 66 6f 72 0a 2a 2a 20 77 72 69 74   iDb for.** writ
5650: 69 6e 67 2e 20 54 68 65 20 74 61 62 6c 65 20 69  ing. The table i
5660: 73 20 6f 70 65 6e 65 64 20 75 73 69 6e 67 20 63  s opened using c
5670: 75 72 73 6f 72 20 30 2e 0a 2a 2f 0a 76 6f 69 64  ursor 0..*/.void
5680: 20 73 71 6c 69 74 65 33 4f 70 65 6e 4d 61 73 74   sqlite3OpenMast
5690: 65 72 54 61 62 6c 65 28 50 61 72 73 65 20 2a 70  erTable(Parse *p
56a0: 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20 20 56 64  , int iDb){.  Vd
56b0: 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47  be *v = sqlite3G
56c0: 65 74 56 64 62 65 28 70 29 3b 0a 20 20 73 71 6c  etVdbe(p);.  sql
56d0: 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28 70 2c  ite3TableLock(p,
56e0: 20 69 44 62 2c 20 4d 41 53 54 45 52 5f 52 4f 4f   iDb, MASTER_ROO
56f0: 54 2c 20 31 2c 20 53 43 48 45 4d 41 5f 54 41 42  T, 1, SCHEMA_TAB
5700: 4c 45 28 69 44 62 29 29 3b 0a 20 20 73 71 6c 69  LE(iDb));.  sqli
5710: 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74  te3VdbeAddOp4Int
5720: 28 76 2c 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65  (v, OP_OpenWrite
5730: 2c 20 30 2c 20 4d 41 53 54 45 52 5f 52 4f 4f 54  , 0, MASTER_ROOT
5740: 2c 20 69 44 62 2c 20 35 29 3b 0a 20 20 69 66 28  , iDb, 5);.  if(
5750: 20 70 2d 3e 6e 54 61 62 3d 3d 30 20 29 7b 0a 20   p->nTab==0 ){. 
5760: 20 20 20 70 2d 3e 6e 54 61 62 20 3d 20 31 3b 0a     p->nTab = 1;.
5770: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72    }.}../*.** Par
5780: 61 6d 65 74 65 72 20 7a 4e 61 6d 65 20 70 6f 69  ameter zName poi
5790: 6e 74 73 20 74 6f 20 61 20 6e 75 6c 2d 74 65 72  nts to a nul-ter
57a0: 6d 69 6e 61 74 65 64 20 62 75 66 66 65 72 20 63  minated buffer c
57b0: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 6e 61  ontaining the na
57c0: 6d 65 0a 2a 2a 20 6f 66 20 61 20 64 61 74 61 62  me.** of a datab
57d0: 61 73 65 20 28 22 6d 61 69 6e 22 2c 20 22 74 65  ase ("main", "te
57e0: 6d 70 22 20 6f 72 20 74 68 65 20 6e 61 6d 65 20  mp" or the name 
57f0: 6f 66 20 61 6e 20 61 74 74 61 63 68 65 64 20 64  of an attached d
5800: 62 29 2e 20 54 68 69 73 0a 2a 2a 20 66 75 6e 63  b). This.** func
5810: 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 74 68 65  tion returns the
5820: 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20 6e 61   index of the na
5830: 6d 65 64 20 64 61 74 61 62 61 73 65 20 69 6e 20  med database in 
5840: 64 62 2d 3e 61 44 62 5b 5d 2c 20 6f 72 0a 2a 2a  db->aDb[], or.**
5850: 20 2d 31 20 69 66 20 74 68 65 20 6e 61 6d 65 64   -1 if the named
5860: 20 64 62 20 63 61 6e 6e 6f 74 20 62 65 20 66 6f   db cannot be fo
5870: 75 6e 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  und..*/.int sqli
5880: 74 65 33 46 69 6e 64 44 62 4e 61 6d 65 28 73 71  te3FindDbName(sq
5890: 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74  lite3 *db, const
58a0: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20   char *zName){. 
58b0: 20 69 6e 74 20 69 20 3d 20 2d 31 3b 20 20 20 20   int i = -1;    
58c0: 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
58d0: 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 69 66 28   number */.  if(
58e0: 20 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 44 62   zName ){.    Db
58f0: 20 2a 70 44 62 3b 0a 20 20 20 20 66 6f 72 28 69   *pDb;.    for(i
5900: 3d 28 64 62 2d 3e 6e 44 62 2d 31 29 2c 20 70 44  =(db->nDb-1), pD
5910: 62 3d 26 64 62 2d 3e 61 44 62 5b 69 5d 3b 20 69  b=&db->aDb[i]; i
5920: 3e 3d 30 3b 20 69 2d 2d 2c 20 70 44 62 2d 2d 29  >=0; i--, pDb--)
5930: 7b 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d 73  {.      if( 0==s
5940: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 44  qlite3StrICmp(pD
5950: 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29  b->zName, zName)
5960: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a   ) break;.    }.
5970: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a    }.  return i;.
5980: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 74 6f 6b  }../*.** The tok
5990: 65 6e 20 2a 70 4e 61 6d 65 20 63 6f 6e 74 61 69  en *pName contai
59a0: 6e 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61  ns the name of a
59b0: 20 64 61 74 61 62 61 73 65 20 28 65 69 74 68 65   database (eithe
59c0: 72 20 22 6d 61 69 6e 22 20 6f 72 0a 2a 2a 20 22  r "main" or.** "
59d0: 74 65 6d 70 22 20 6f 72 20 74 68 65 20 6e 61 6d  temp" or the nam
59e0: 65 20 6f 66 20 61 6e 20 61 74 74 61 63 68 65 64  e of an attached
59f0: 20 64 62 29 2e 20 54 68 69 73 20 72 6f 75 74 69   db). This routi
5a00: 6e 65 20 72 65 74 75 72 6e 73 20 74 68 65 0a 2a  ne returns the.*
5a10: 2a 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20 6e  * index of the n
5a20: 61 6d 65 64 20 64 61 74 61 62 61 73 65 20 69 6e  amed database in
5a30: 20 64 62 2d 3e 61 44 62 5b 5d 2c 20 6f 72 20 2d   db->aDb[], or -
5a40: 31 20 69 66 20 74 68 65 20 6e 61 6d 65 64 20 64  1 if the named d
5a50: 62 20 0a 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 65  b .** does not e
5a60: 78 69 73 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  xist..*/.int sql
5a70: 69 74 65 33 46 69 6e 64 44 62 28 73 71 6c 69 74  ite3FindDb(sqlit
5a80: 65 33 20 2a 64 62 2c 20 54 6f 6b 65 6e 20 2a 70  e3 *db, Token *p
5a90: 4e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 69 3b 20  Name){.  int i; 
5aa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5ab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
5ac0: 20 44 61 74 61 62 61 73 65 20 6e 75 6d 62 65 72   Database number
5ad0: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d   */.  char *zNam
5ae0: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
5af0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61             /* Na
5b00: 6d 65 20 77 65 20 61 72 65 20 73 65 61 72 63 68  me we are search
5b10: 69 6e 67 20 66 6f 72 20 2a 2f 0a 20 20 7a 4e 61  ing for */.  zNa
5b20: 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65  me = sqlite3Name
5b30: 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 4e  FromToken(db, pN
5b40: 61 6d 65 29 3b 0a 20 20 69 20 3d 20 73 71 6c 69  ame);.  i = sqli
5b50: 74 65 33 46 69 6e 64 44 62 4e 61 6d 65 28 64 62  te3FindDbName(db
5b60: 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69  , zName);.  sqli
5b70: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4e  te3DbFree(db, zN
5b80: 61 6d 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 69  ame);.  return i
5b90: 3b 0a 7d 0a 0a 2f 2a 20 54 68 65 20 74 61 62 6c  ;.}../* The tabl
5ba0: 65 20 6f 72 20 76 69 65 77 20 6f 72 20 74 72 69  e or view or tri
5bb0: 67 67 65 72 20 6e 61 6d 65 20 69 73 20 70 61 73  gger name is pas
5bc0: 73 65 64 20 74 6f 20 74 68 69 73 20 72 6f 75 74  sed to this rout
5bd0: 69 6e 65 20 76 69 61 20 74 6f 6b 65 6e 73 0a 2a  ine via tokens.*
5be0: 2a 20 70 4e 61 6d 65 31 20 61 6e 64 20 70 4e 61  * pName1 and pNa
5bf0: 6d 65 32 2e 20 49 66 20 74 68 65 20 74 61 62 6c  me2. If the tabl
5c00: 65 20 6e 61 6d 65 20 77 61 73 20 66 75 6c 6c 79  e name was fully
5c10: 20 71 75 61 6c 69 66 69 65 64 2c 20 66 6f 72 20   qualified, for 
5c20: 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 43  example:.**.** C
5c30: 52 45 41 54 45 20 54 41 42 4c 45 20 78 78 78 2e  REATE TABLE xxx.
5c40: 79 79 79 20 28 2e 2e 2e 29 3b 0a 2a 2a 20 0a 2a  yyy (...);.** .*
5c50: 2a 20 54 68 65 6e 20 70 4e 61 6d 65 31 20 69 73  * Then pName1 is
5c60: 20 73 65 74 20 74 6f 20 22 78 78 78 22 20 61 6e   set to "xxx" an
5c70: 64 20 70 4e 61 6d 65 32 20 22 79 79 79 22 2e 20  d pName2 "yyy". 
5c80: 4f 6e 20 74 68 65 20 6f 74 68 65 72 20 68 61 6e  On the other han
5c90: 64 20 69 66 0a 2a 2a 20 74 68 65 20 74 61 62 6c  d if.** the tabl
5ca0: 65 20 6e 61 6d 65 20 69 73 20 6e 6f 74 20 66 75  e name is not fu
5cb0: 6c 6c 79 20 71 75 61 6c 69 66 69 65 64 2c 20 69  lly qualified, i
5cc0: 2e 65 2e 3a 0a 2a 2a 0a 2a 2a 20 43 52 45 41 54  .e.:.**.** CREAT
5cd0: 45 20 54 41 42 4c 45 20 79 79 79 28 2e 2e 2e 29  E TABLE yyy(...)
5ce0: 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 70 4e 61  ;.**.** Then pNa
5cf0: 6d 65 31 20 69 73 20 73 65 74 20 74 6f 20 22 79  me1 is set to "y
5d00: 79 79 22 20 61 6e 64 20 70 4e 61 6d 65 32 20 69  yy" and pName2 i
5d10: 73 20 22 22 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  s ""..**.** This
5d20: 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20 74 68   routine sets th
5d30: 65 20 2a 70 70 55 6e 71 75 61 6c 20 70 6f 69 6e  e *ppUnqual poin
5d40: 74 65 72 20 74 6f 20 70 6f 69 6e 74 20 61 74 20  ter to point at 
5d50: 74 68 65 20 74 6f 6b 65 6e 20 28 70 4e 61 6d 65  the token (pName
5d60: 31 20 6f 72 0a 2a 2a 20 70 4e 61 6d 65 32 29 20  1 or.** pName2) 
5d70: 74 68 61 74 20 73 74 6f 72 65 73 20 74 68 65 20  that stores the 
5d80: 75 6e 71 75 61 6c 69 66 69 65 64 20 74 61 62 6c  unqualified tabl
5d90: 65 20 6e 61 6d 65 2e 20 20 54 68 65 20 69 6e 64  e name.  The ind
5da0: 65 78 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74  ex of the.** dat
5db0: 61 62 61 73 65 20 22 78 78 78 22 20 69 73 20 72  abase "xxx" is r
5dc0: 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20  eturned..*/.int 
5dd0: 73 71 6c 69 74 65 33 54 77 6f 50 61 72 74 4e 61  sqlite3TwoPartNa
5de0: 6d 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  me(.  Parse *pPa
5df0: 72 73 65 2c 20 20 20 20 20 20 2f 2a 20 50 61 72  rse,      /* Par
5e00: 73 69 6e 67 20 61 6e 64 20 63 6f 64 65 20 67 65  sing and code ge
5e10: 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74  nerating context
5e20: 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61   */.  Token *pNa
5e30: 6d 65 31 2c 20 20 20 20 20 20 2f 2a 20 54 68 65  me1,      /* The
5e40: 20 22 78 78 78 22 20 69 6e 20 74 68 65 20 6e 61   "xxx" in the na
5e50: 6d 65 20 22 78 78 78 2e 79 79 79 22 20 6f 72 20  me "xxx.yyy" or 
5e60: 22 78 78 78 22 20 2a 2f 0a 20 20 54 6f 6b 65 6e  "xxx" */.  Token
5e70: 20 2a 70 4e 61 6d 65 32 2c 20 20 20 20 20 20 2f   *pName2,      /
5e80: 2a 20 54 68 65 20 22 79 79 79 22 20 69 6e 20 74  * The "yyy" in t
5e90: 68 65 20 6e 61 6d 65 20 22 78 78 78 2e 79 79 79  he name "xxx.yyy
5ea0: 22 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 2a 70  " */.  Token **p
5eb0: 55 6e 71 75 61 6c 20 20 20 20 20 2f 2a 20 57 72  Unqual     /* Wr
5ec0: 69 74 65 20 74 68 65 20 75 6e 71 75 61 6c 69 66  ite the unqualif
5ed0: 69 65 64 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20  ied object name 
5ee0: 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  here */.){.  int
5ef0: 20 69 44 62 3b 20 20 20 20 20 20 20 20 20 20 20   iDb;           
5f00: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
5f10: 62 61 73 65 20 68 6f 6c 64 69 6e 67 20 74 68 65  base holding the
5f20: 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 73 71 6c   object */.  sql
5f30: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
5f40: 65 2d 3e 64 62 3b 0a 0a 20 20 61 73 73 65 72 74  e->db;..  assert
5f50: 28 20 70 4e 61 6d 65 32 21 3d 30 20 29 3b 0a 20  ( pName2!=0 );. 
5f60: 20 69 66 28 20 70 4e 61 6d 65 32 2d 3e 6e 3e 30   if( pName2->n>0
5f70: 20 29 7b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e   ){.    if( db->
5f80: 69 6e 69 74 2e 62 75 73 79 20 29 20 7b 0a 20 20  init.busy ) {.  
5f90: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
5fa0: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 63 6f 72  Msg(pParse, "cor
5fb0: 72 75 70 74 20 64 61 74 61 62 61 73 65 22 29 3b  rupt database");
5fc0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 2d 31  .      return -1
5fd0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2a 70 55 6e  ;.    }.    *pUn
5fe0: 71 75 61 6c 20 3d 20 70 4e 61 6d 65 32 3b 0a 20  qual = pName2;. 
5ff0: 20 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33     iDb = sqlite3
6000: 46 69 6e 64 44 62 28 64 62 2c 20 70 4e 61 6d 65  FindDb(db, pName
6010: 31 29 3b 0a 20 20 20 20 69 66 28 20 69 44 62 3c  1);.    if( iDb<
6020: 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
6030: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
6040: 65 2c 20 22 75 6e 6b 6e 6f 77 6e 20 64 61 74 61  e, "unknown data
6050: 62 61 73 65 20 25 54 22 2c 20 70 4e 61 6d 65 31  base %T", pName1
6060: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
6070: 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  -1;.    }.  }els
6080: 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 64  e{.    assert( d
6090: 62 2d 3e 69 6e 69 74 2e 69 44 62 3d 3d 30 20 7c  b->init.iDb==0 |
60a0: 7c 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20  | db->init.busy 
60b0: 29 3b 0a 20 20 20 20 69 44 62 20 3d 20 64 62 2d  );.    iDb = db-
60c0: 3e 69 6e 69 74 2e 69 44 62 3b 0a 20 20 20 20 2a  >init.iDb;.    *
60d0: 70 55 6e 71 75 61 6c 20 3d 20 70 4e 61 6d 65 31  pUnqual = pName1
60e0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 69  ;.  }.  return i
60f0: 44 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  Db;.}../*.** Thi
6100: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65  s routine is use
6110: 64 20 74 6f 20 63 68 65 63 6b 20 69 66 20 74 68  d to check if th
6120: 65 20 55 54 46 2d 38 20 73 74 72 69 6e 67 20 7a  e UTF-8 string z
6130: 4e 61 6d 65 20 69 73 20 61 20 6c 65 67 61 6c 0a  Name is a legal.
6140: 2a 2a 20 75 6e 71 75 61 6c 69 66 69 65 64 20 6e  ** unqualified n
6150: 61 6d 65 20 66 6f 72 20 61 20 6e 65 77 20 73 63  ame for a new sc
6160: 68 65 6d 61 20 6f 62 6a 65 63 74 20 28 74 61 62  hema object (tab
6170: 6c 65 2c 20 69 6e 64 65 78 2c 20 76 69 65 77 20  le, index, view 
6180: 6f 72 0a 2a 2a 20 74 72 69 67 67 65 72 29 2e 20  or.** trigger). 
6190: 41 6c 6c 20 6e 61 6d 65 73 20 61 72 65 20 6c 65  All names are le
61a0: 67 61 6c 20 65 78 63 65 70 74 20 74 68 6f 73 65  gal except those
61b0: 20 74 68 61 74 20 62 65 67 69 6e 20 77 69 74 68   that begin with
61c0: 20 74 68 65 20 73 74 72 69 6e 67 0a 2a 2a 20 22   the string.** "
61d0: 73 71 6c 69 74 65 5f 22 20 28 69 6e 20 75 70 70  sqlite_" (in upp
61e0: 65 72 2c 20 6c 6f 77 65 72 20 6f 72 20 6d 69 78  er, lower or mix
61f0: 65 64 20 63 61 73 65 29 2e 20 54 68 69 73 20 70  ed case). This p
6200: 6f 72 74 69 6f 6e 20 6f 66 20 74 68 65 20 6e 61  ortion of the na
6210: 6d 65 73 70 61 63 65 0a 2a 2a 20 69 73 20 72 65  mespace.** is re
6220: 73 65 72 76 65 64 20 66 6f 72 20 69 6e 74 65 72  served for inter
6230: 6e 61 6c 20 75 73 65 2e 0a 2a 2f 0a 69 6e 74 20  nal use..*/.int 
6240: 73 71 6c 69 74 65 33 43 68 65 63 6b 4f 62 6a 65  sqlite3CheckObje
6250: 63 74 4e 61 6d 65 28 50 61 72 73 65 20 2a 70 50  ctName(Parse *pP
6260: 61 72 73 65 2c 20 63 6f 6e 73 74 20 63 68 61 72  arse, const char
6270: 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69 66 28 20   *zName){.  if( 
6280: 21 70 50 61 72 73 65 2d 3e 64 62 2d 3e 69 6e 69  !pParse->db->ini
6290: 74 2e 62 75 73 79 20 26 26 20 70 50 61 72 73 65  t.busy && pParse
62a0: 2d 3e 6e 65 73 74 65 64 3d 3d 30 20 0a 20 20 20  ->nested==0 .   
62b0: 20 20 20 20 20 20 20 26 26 20 28 70 50 61 72 73         && (pPars
62c0: 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  e->db->flags & S
62d0: 51 4c 49 54 45 5f 57 72 69 74 65 53 63 68 65 6d  QLITE_WriteSchem
62e0: 61 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20  a)==0.          
62f0: 26 26 20 30 3d 3d 73 71 6c 69 74 65 33 53 74 72  && 0==sqlite3Str
6300: 4e 49 43 6d 70 28 7a 4e 61 6d 65 2c 20 22 73 71  NICmp(zName, "sq
6310: 6c 69 74 65 5f 22 2c 20 37 29 20 29 7b 0a 20 20  lite_", 7) ){.  
6320: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
6330: 67 28 70 50 61 72 73 65 2c 20 22 6f 62 6a 65 63  g(pParse, "objec
6340: 74 20 6e 61 6d 65 20 72 65 73 65 72 76 65 64 20  t name reserved 
6350: 66 6f 72 20 69 6e 74 65 72 6e 61 6c 20 75 73 65  for internal use
6360: 3a 20 25 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20  : %s", zName);. 
6370: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
6380: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65  _ERROR;.  }.  re
6390: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
63a0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
63b0: 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20  the PRIMARY KEY 
63c0: 69 6e 64 65 78 20 6f 66 20 61 20 74 61 62 6c 65  index of a table
63d0: 0a 2a 2f 0a 49 6e 64 65 78 20 2a 73 71 6c 69 74  .*/.Index *sqlit
63e0: 65 33 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65  e3PrimaryKeyInde
63f0: 78 28 54 61 62 6c 65 20 2a 70 54 61 62 29 7b 0a  x(Table *pTab){.
6400: 20 20 49 6e 64 65 78 20 2a 70 3b 0a 20 20 66 6f    Index *p;.  fo
6410: 72 28 70 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78  r(p=pTab->pIndex
6420: 3b 20 70 20 26 26 20 21 49 73 50 72 69 6d 61 72  ; p && !IsPrimar
6430: 79 4b 65 79 49 6e 64 65 78 28 70 29 3b 20 70 3d  yKeyIndex(p); p=
6440: 70 2d 3e 70 4e 65 78 74 29 7b 7d 0a 20 20 72 65  p->pNext){}.  re
6450: 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn p;.}../*.**
6460: 20 52 65 74 75 72 6e 20 74 68 65 20 63 6f 6c 75   Return the colu
6470: 6d 6e 20 6f 66 20 69 6e 64 65 78 20 70 49 64 78  mn of index pIdx
6480: 20 74 68 61 74 20 63 6f 72 72 65 73 70 6f 6e 64   that correspond
6490: 73 20 74 6f 20 74 61 62 6c 65 0a 2a 2a 20 63 6f  s to table.** co
64a0: 6c 75 6d 6e 20 69 43 6f 6c 2e 20 20 52 65 74 75  lumn iCol.  Retu
64b0: 72 6e 20 2d 31 20 69 66 20 6e 6f 74 20 66 6f 75  rn -1 if not fou
64c0: 6e 64 2e 0a 2a 2f 0a 69 31 36 20 73 71 6c 69 74  nd..*/.i16 sqlit
64d0: 65 33 43 6f 6c 75 6d 6e 4f 66 49 6e 64 65 78 28  e3ColumnOfIndex(
64e0: 49 6e 64 65 78 20 2a 70 49 64 78 2c 20 69 31 36  Index *pIdx, i16
64f0: 20 69 43 6f 6c 29 7b 0a 20 20 69 6e 74 20 69 3b   iCol){.  int i;
6500: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49  .  for(i=0; i<pI
6510: 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b  dx->nColumn; i++
6520: 29 7b 0a 20 20 20 20 69 66 28 20 69 43 6f 6c 3d  ){.    if( iCol=
6530: 3d 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b  =pIdx->aiColumn[
6540: 69 5d 20 29 20 72 65 74 75 72 6e 20 69 3b 0a 20  i] ) return i;. 
6550: 20 7d 0a 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a   }.  return -1;.
6560: 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65 67 69 6e 20 63  }../*.** Begin c
6570: 6f 6e 73 74 72 75 63 74 69 6e 67 20 61 20 6e 65  onstructing a ne
6580: 77 20 74 61 62 6c 65 20 72 65 70 72 65 73 65 6e  w table represen
6590: 74 61 74 69 6f 6e 20 69 6e 20 6d 65 6d 6f 72 79  tation in memory
65a0: 2e 20 20 54 68 69 73 20 69 73 0a 2a 2a 20 74 68  .  This is.** th
65b0: 65 20 66 69 72 73 74 20 6f 66 20 73 65 76 65 72  e first of sever
65c0: 61 6c 20 61 63 74 69 6f 6e 20 72 6f 75 74 69 6e  al action routin
65d0: 65 73 20 74 68 61 74 20 67 65 74 20 63 61 6c 6c  es that get call
65e0: 65 64 20 69 6e 20 72 65 73 70 6f 6e 73 65 0a 2a  ed in response.*
65f0: 2a 20 74 6f 20 61 20 43 52 45 41 54 45 20 54 41  * to a CREATE TA
6600: 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 20 20  BLE statement.  
6610: 49 6e 20 70 61 72 74 69 63 75 6c 61 72 2c 20 74  In particular, t
6620: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
6630: 61 6c 6c 65 64 0a 2a 2a 20 61 66 74 65 72 20 73  alled.** after s
6640: 65 65 69 6e 67 20 74 6f 6b 65 6e 73 20 22 43 52  eeing tokens "CR
6650: 45 41 54 45 22 20 61 6e 64 20 22 54 41 42 4c 45  EATE" and "TABLE
6660: 22 20 61 6e 64 20 74 68 65 20 74 61 62 6c 65 20  " and the table 
6670: 6e 61 6d 65 2e 20 54 68 65 20 69 73 54 65 6d 70  name. The isTemp
6680: 0a 2a 2a 20 66 6c 61 67 20 69 73 20 74 72 75 65  .** flag is true
6690: 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 73 68   if the table sh
66a0: 6f 75 6c 64 20 62 65 20 73 74 6f 72 65 64 20 69  ould be stored i
66b0: 6e 20 74 68 65 20 61 75 78 69 6c 69 61 72 79 20  n the auxiliary 
66c0: 64 61 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65  database.** file
66d0: 20 69 6e 73 74 65 61 64 20 6f 66 20 69 6e 20 74   instead of in t
66e0: 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65  he main database
66f0: 20 66 69 6c 65 2e 20 20 54 68 69 73 20 69 73 20   file.  This is 
6700: 6e 6f 72 6d 61 6c 6c 79 20 74 68 65 20 63 61 73  normally the cas
6710: 65 0a 2a 2a 20 77 68 65 6e 20 74 68 65 20 22 54  e.** when the "T
6720: 45 4d 50 22 20 6f 72 20 22 54 45 4d 50 4f 52 41  EMP" or "TEMPORA
6730: 52 59 22 20 6b 65 79 77 6f 72 64 20 6f 63 63 75  RY" keyword occu
6740: 72 73 20 69 6e 20 62 65 74 77 65 65 6e 0a 2a 2a  rs in between.**
6750: 20 43 52 45 41 54 45 20 61 6e 64 20 54 41 42 4c   CREATE and TABL
6760: 45 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65 77  E..**.** The new
6770: 20 74 61 62 6c 65 20 72 65 63 6f 72 64 20 69 73   table record is
6780: 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 61 6e 64   initialized and
6790: 20 70 75 74 20 69 6e 20 70 50 61 72 73 65 2d 3e   put in pParse->
67a0: 70 4e 65 77 54 61 62 6c 65 2e 0a 2a 2a 20 41 73  pNewTable..** As
67b0: 20 6d 6f 72 65 20 6f 66 20 74 68 65 20 43 52 45   more of the CRE
67c0: 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d  ATE TABLE statem
67d0: 65 6e 74 20 69 73 20 70 61 72 73 65 64 2c 20 61  ent is parsed, a
67e0: 64 64 69 74 69 6f 6e 61 6c 20 61 63 74 69 6f 6e  dditional action
67f0: 0a 2a 2a 20 72 6f 75 74 69 6e 65 73 20 77 69 6c  .** routines wil
6800: 6c 20 62 65 20 63 61 6c 6c 65 64 20 74 6f 20 61  l be called to a
6810: 64 64 20 6d 6f 72 65 20 69 6e 66 6f 72 6d 61 74  dd more informat
6820: 69 6f 6e 20 74 6f 20 74 68 69 73 20 72 65 63 6f  ion to this reco
6830: 72 64 2e 0a 2a 2a 20 41 74 20 74 68 65 20 65 6e  rd..** At the en
6840: 64 20 6f 66 20 74 68 65 20 43 52 45 41 54 45 20  d of the CREATE 
6850: 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2c  TABLE statement,
6860: 20 74 68 65 20 73 71 6c 69 74 65 33 45 6e 64 54   the sqlite3EndT
6870: 61 62 6c 65 28 29 20 72 6f 75 74 69 6e 65 0a 2a  able() routine.*
6880: 2a 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 63  * is called to c
6890: 6f 6d 70 6c 65 74 65 20 74 68 65 20 63 6f 6e 73  omplete the cons
68a0: 74 72 75 63 74 69 6f 6e 20 6f 66 20 74 68 65 20  truction of the 
68b0: 6e 65 77 20 74 61 62 6c 65 20 72 65 63 6f 72 64  new table record
68c0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
68d0: 33 53 74 61 72 74 54 61 62 6c 65 28 0a 20 20 50  3StartTable(.  P
68e0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
68f0: 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e 74 65 78  /* Parser contex
6900: 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e  t */.  Token *pN
6910: 61 6d 65 31 2c 20 20 20 2f 2a 20 46 69 72 73 74  ame1,   /* First
6920: 20 70 61 72 74 20 6f 66 20 74 68 65 20 6e 61 6d   part of the nam
6930: 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 6f  e of the table o
6940: 72 20 76 69 65 77 20 2a 2f 0a 20 20 54 6f 6b 65  r view */.  Toke
6950: 6e 20 2a 70 4e 61 6d 65 32 2c 20 20 20 2f 2a 20  n *pName2,   /* 
6960: 53 65 63 6f 6e 64 20 70 61 72 74 20 6f 66 20 74  Second part of t
6970: 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74  he name of the t
6980: 61 62 6c 65 20 6f 72 20 76 69 65 77 20 2a 2f 0a  able or view */.
6990: 20 20 69 6e 74 20 69 73 54 65 6d 70 2c 20 20 20    int isTemp,   
69a0: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68     /* True if th
69b0: 69 73 20 69 73 20 61 20 54 45 4d 50 20 74 61 62  is is a TEMP tab
69c0: 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73 56 69  le */.  int isVi
69d0: 65 77 2c 20 20 20 20 20 20 2f 2a 20 54 72 75 65  ew,      /* True
69e0: 20 69 66 20 74 68 69 73 20 69 73 20 61 20 56 49   if this is a VI
69f0: 45 57 20 2a 2f 0a 20 20 69 6e 74 20 69 73 56 69  EW */.  int isVi
6a00: 72 74 75 61 6c 2c 20 20 20 2f 2a 20 54 72 75 65  rtual,   /* True
6a10: 20 69 66 20 74 68 69 73 20 69 73 20 61 20 56 49   if this is a VI
6a20: 52 54 55 41 4c 20 74 61 62 6c 65 20 2a 2f 0a 20  RTUAL table */. 
6a30: 20 69 6e 74 20 6e 6f 45 72 72 20 20 20 20 20 20   int noErr      
6a40: 20 20 2f 2a 20 44 6f 20 6e 6f 74 68 69 6e 67 20    /* Do nothing 
6a50: 69 66 20 74 61 62 6c 65 20 61 6c 72 65 61 64 79  if table already
6a60: 20 65 78 69 73 74 73 20 2a 2f 0a 29 7b 0a 20 20   exists */.){.  
6a70: 54 61 62 6c 65 20 2a 70 54 61 62 6c 65 3b 0a 20  Table *pTable;. 
6a80: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 30   char *zName = 0
6a90: 3b 20 2f 2a 20 54 68 65 20 6e 61 6d 65 20 6f 66  ; /* The name of
6aa0: 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20 2a   the new table *
6ab0: 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  /.  sqlite3 *db 
6ac0: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
6ad0: 56 64 62 65 20 2a 76 3b 0a 20 20 69 6e 74 20 69  Vdbe *v;.  int i
6ae0: 44 62 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 44  Db;         /* D
6af0: 61 74 61 62 61 73 65 20 6e 75 6d 62 65 72 20 74  atabase number t
6b00: 6f 20 63 72 65 61 74 65 20 74 68 65 20 74 61 62  o create the tab
6b10: 6c 65 20 69 6e 20 2a 2f 0a 20 20 54 6f 6b 65 6e  le in */.  Token
6b20: 20 2a 70 4e 61 6d 65 3b 20 20 20 20 2f 2a 20 55   *pName;    /* U
6b30: 6e 71 75 61 6c 69 66 69 65 64 20 6e 61 6d 65 20  nqualified name 
6b40: 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20  of the table to 
6b50: 63 72 65 61 74 65 20 2a 2f 0a 0a 20 20 69 66 28  create */..  if(
6b60: 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 26   db->init.busy &
6b70: 26 20 64 62 2d 3e 69 6e 69 74 2e 6e 65 77 54 6e  & db->init.newTn
6b80: 75 6d 3d 3d 31 20 29 7b 0a 20 20 20 20 2f 2a 20  um==1 ){.    /* 
6b90: 53 70 65 63 69 61 6c 20 63 61 73 65 3a 20 20 50  Special case:  P
6ba0: 61 72 73 69 6e 67 20 74 68 65 20 73 71 6c 69 74  arsing the sqlit
6bb0: 65 5f 6d 61 73 74 65 72 20 6f 72 20 73 71 6c 69  e_master or sqli
6bc0: 74 65 5f 74 65 6d 70 5f 6d 61 73 74 65 72 20 73  te_temp_master s
6bd0: 63 68 65 6d 61 20 2a 2f 0a 20 20 20 20 69 44 62  chema */.    iDb
6be0: 20 3d 20 64 62 2d 3e 69 6e 69 74 2e 69 44 62 3b   = db->init.iDb;
6bf0: 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c  .    zName = sql
6c00: 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c  ite3DbStrDup(db,
6c10: 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 44   SCHEMA_TABLE(iD
6c20: 62 29 29 3b 0a 20 20 20 20 70 4e 61 6d 65 20 3d  b));.    pName =
6c30: 20 70 4e 61 6d 65 31 3b 0a 20 20 7d 65 6c 73 65   pName1;.  }else
6c40: 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6d  {.    /* The com
6c50: 6d 6f 6e 20 63 61 73 65 20 2a 2f 0a 20 20 20 20  mon case */.    
6c60: 69 44 62 20 3d 20 73 71 6c 69 74 65 33 54 77 6f  iDb = sqlite3Two
6c70: 50 61 72 74 4e 61 6d 65 28 70 50 61 72 73 65 2c  PartName(pParse,
6c80: 20 70 4e 61 6d 65 31 2c 20 70 4e 61 6d 65 32 2c   pName1, pName2,
6c90: 20 26 70 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66   &pName);.    if
6ca0: 28 20 69 44 62 3c 30 20 29 20 72 65 74 75 72 6e  ( iDb<0 ) return
6cb0: 3b 0a 20 20 20 20 69 66 28 20 21 4f 4d 49 54 5f  ;.    if( !OMIT_
6cc0: 54 45 4d 50 44 42 20 26 26 20 69 73 54 65 6d 70  TEMPDB && isTemp
6cd0: 20 26 26 20 70 4e 61 6d 65 32 2d 3e 6e 3e 30 20   && pName2->n>0 
6ce0: 26 26 20 69 44 62 21 3d 31 20 29 7b 0a 20 20 20  && iDb!=1 ){.   
6cf0: 20 20 20 2f 2a 20 49 66 20 63 72 65 61 74 69 6e     /* If creatin
6d00: 67 20 61 20 74 65 6d 70 20 74 61 62 6c 65 2c 20  g a temp table, 
6d10: 74 68 65 20 6e 61 6d 65 20 6d 61 79 20 6e 6f 74  the name may not
6d20: 20 62 65 20 71 75 61 6c 69 66 69 65 64 2e 20 55   be qualified. U
6d30: 6e 6c 65 73 73 20 0a 20 20 20 20 20 20 2a 2a 20  nless .      ** 
6d40: 74 68 65 20 64 61 74 61 62 61 73 65 20 6e 61 6d  the database nam
6d50: 65 20 69 73 20 22 74 65 6d 70 22 20 61 6e 79 77  e is "temp" anyw
6d60: 61 79 2e 20 20 2a 2f 0a 20 20 20 20 20 20 73 71  ay.  */.      sq
6d70: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
6d80: 61 72 73 65 2c 20 22 74 65 6d 70 6f 72 61 72 79  arse, "temporary
6d90: 20 74 61 62 6c 65 20 6e 61 6d 65 20 6d 75 73 74   table name must
6da0: 20 62 65 20 75 6e 71 75 61 6c 69 66 69 65 64 22   be unqualified"
6db0: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b  );.      return;
6dc0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21  .    }.    if( !
6dd0: 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26 26 20 69  OMIT_TEMPDB && i
6de0: 73 54 65 6d 70 20 29 20 69 44 62 20 3d 20 31 3b  sTemp ) iDb = 1;
6df0: 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c  .    zName = sql
6e00: 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65  ite3NameFromToke
6e10: 6e 28 64 62 2c 20 70 4e 61 6d 65 29 3b 0a 20 20  n(db, pName);.  
6e20: 7d 0a 20 20 70 50 61 72 73 65 2d 3e 73 4e 61 6d  }.  pParse->sNam
6e30: 65 54 6f 6b 65 6e 20 3d 20 2a 70 4e 61 6d 65 3b  eToken = *pName;
6e40: 0a 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20  .  if( zName==0 
6e50: 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
6e60: 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74  SQLITE_OK!=sqlit
6e70: 65 33 43 68 65 63 6b 4f 62 6a 65 63 74 4e 61 6d  e3CheckObjectNam
6e80: 65 28 70 50 61 72 73 65 2c 20 7a 4e 61 6d 65 29  e(pParse, zName)
6e90: 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 62 65 67   ){.    goto beg
6ea0: 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b 0a  in_table_error;.
6eb0: 20 20 7d 0a 20 20 69 66 28 20 64 62 2d 3e 69 6e    }.  if( db->in
6ec0: 69 74 2e 69 44 62 3d 3d 31 20 29 20 69 73 54 65  it.iDb==1 ) isTe
6ed0: 6d 70 20 3d 20 31 3b 0a 23 69 66 6e 64 65 66 20  mp = 1;.#ifndef 
6ee0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48  SQLITE_OMIT_AUTH
6ef0: 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 61 73 73 65  ORIZATION.  asse
6f00: 72 74 28 20 69 73 54 65 6d 70 3d 3d 30 20 7c 7c  rt( isTemp==0 ||
6f10: 20 69 73 54 65 6d 70 3d 3d 31 20 29 3b 0a 20 20   isTemp==1 );.  
6f20: 61 73 73 65 72 74 28 20 69 73 56 69 65 77 3d 3d  assert( isView==
6f30: 30 20 7c 7c 20 69 73 56 69 65 77 3d 3d 31 20 29  0 || isView==1 )
6f40: 3b 0a 20 20 7b 0a 20 20 20 20 73 74 61 74 69 63  ;.  {.    static
6f50: 20 63 6f 6e 73 74 20 75 38 20 61 43 6f 64 65 5b   const u8 aCode[
6f60: 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20 53 51 4c  ] = {.       SQL
6f70: 49 54 45 5f 43 52 45 41 54 45 5f 54 41 42 4c 45  ITE_CREATE_TABLE
6f80: 2c 0a 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f  ,.       SQLITE_
6f90: 43 52 45 41 54 45 5f 54 45 4d 50 5f 54 41 42 4c  CREATE_TEMP_TABL
6fa0: 45 2c 0a 20 20 20 20 20 20 20 53 51 4c 49 54 45  E,.       SQLITE
6fb0: 5f 43 52 45 41 54 45 5f 56 49 45 57 2c 0a 20 20  _CREATE_VIEW,.  
6fc0: 20 20 20 20 20 53 51 4c 49 54 45 5f 43 52 45 41       SQLITE_CREA
6fd0: 54 45 5f 54 45 4d 50 5f 56 49 45 57 0a 20 20 20  TE_TEMP_VIEW.   
6fe0: 20 7d 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 44   };.    char *zD
6ff0: 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d  b = db->aDb[iDb]
7000: 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 69 66 28 20  .zName;.    if( 
7010: 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b  sqlite3AuthCheck
7020: 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f  (pParse, SQLITE_
7030: 49 4e 53 45 52 54 2c 20 53 43 48 45 4d 41 5f 54  INSERT, SCHEMA_T
7040: 41 42 4c 45 28 69 73 54 65 6d 70 29 2c 20 30 2c  ABLE(isTemp), 0,
7050: 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20 67   zDb) ){.      g
7060: 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f  oto begin_table_
7070: 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 20  error;.    }.   
7080: 20 69 66 28 20 21 69 73 56 69 72 74 75 61 6c 20   if( !isVirtual 
7090: 26 26 20 73 71 6c 69 74 65 33 41 75 74 68 43 68  && sqlite3AuthCh
70a0: 65 63 6b 28 70 50 61 72 73 65 2c 20 28 69 6e 74  eck(pParse, (int
70b0: 29 61 43 6f 64 65 5b 69 73 54 65 6d 70 2b 32 2a  )aCode[isTemp+2*
70c0: 69 73 56 69 65 77 5d 2c 0a 20 20 20 20 20 20 20  isView],.       
70d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
70e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
70f0: 7a 4e 61 6d 65 2c 20 30 2c 20 7a 44 62 29 20 29  zName, 0, zDb) )
7100: 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 62 65 67  {.      goto beg
7110: 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b 0a  in_table_error;.
7120: 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
7130: 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65  ..  /* Make sure
7140: 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20 6e   the new table n
7150: 61 6d 65 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6c  ame does not col
7160: 6c 69 64 65 20 77 69 74 68 20 61 6e 20 65 78 69  lide with an exi
7170: 73 74 69 6e 67 0a 20 20 2a 2a 20 69 6e 64 65 78  sting.  ** index
7180: 20 6f 72 20 74 61 62 6c 65 20 6e 61 6d 65 20 69   or table name i
7190: 6e 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62  n the same datab
71a0: 61 73 65 2e 20 20 49 73 73 75 65 20 61 6e 20 65  ase.  Issue an e
71b0: 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 66 0a  rror message if.
71c0: 20 20 2a 2a 20 69 74 20 64 6f 65 73 2e 20 54 68    ** it does. Th
71d0: 65 20 65 78 63 65 70 74 69 6f 6e 20 69 73 20 69  e exception is i
71e0: 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  f the statement 
71f0: 62 65 69 6e 67 20 70 61 72 73 65 64 20 77 61 73  being parsed was
7200: 20 70 61 73 73 65 64 0a 20 20 2a 2a 20 74 6f 20   passed.  ** to 
7210: 61 6e 20 73 71 6c 69 74 65 33 5f 64 65 63 6c 61  an sqlite3_decla
7220: 72 65 5f 76 74 61 62 28 29 20 63 61 6c 6c 2e 20  re_vtab() call. 
7230: 49 6e 20 74 68 61 74 20 63 61 73 65 20 6f 6e 6c  In that case onl
7240: 79 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d  y the column nam
7250: 65 73 0a 20 20 2a 2a 20 61 6e 64 20 74 79 70 65  es.  ** and type
7260: 73 20 77 69 6c 6c 20 62 65 20 75 73 65 64 2c 20  s will be used, 
7270: 73 6f 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6e  so there is no n
7280: 65 65 64 20 74 6f 20 74 65 73 74 20 66 6f 72 20  eed to test for 
7290: 6e 61 6d 65 73 70 61 63 65 0a 20 20 2a 2a 20 63  namespace.  ** c
72a0: 6f 6c 6c 69 73 69 6f 6e 73 2e 0a 20 20 2a 2f 0a  ollisions..  */.
72b0: 20 20 69 66 28 20 21 49 4e 5f 44 45 43 4c 41 52    if( !IN_DECLAR
72c0: 45 5f 56 54 41 42 20 29 7b 0a 20 20 20 20 63 68  E_VTAB ){.    ch
72d0: 61 72 20 2a 7a 44 62 20 3d 20 64 62 2d 3e 61 44  ar *zDb = db->aD
72e0: 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20  b[iDb].zName;.  
72f0: 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21    if( SQLITE_OK!
7300: 3d 73 71 6c 69 74 65 33 52 65 61 64 53 63 68 65  =sqlite3ReadSche
7310: 6d 61 28 70 50 61 72 73 65 29 20 29 7b 0a 20 20  ma(pParse) ){.  
7320: 20 20 20 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74      goto begin_t
7330: 61 62 6c 65 5f 65 72 72 6f 72 3b 0a 20 20 20 20  able_error;.    
7340: 7d 0a 20 20 20 20 70 54 61 62 6c 65 20 3d 20 73  }.    pTable = s
7350: 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28  qlite3FindTable(
7360: 64 62 2c 20 7a 4e 61 6d 65 2c 20 7a 44 62 29 3b  db, zName, zDb);
7370: 0a 20 20 20 20 69 66 28 20 70 54 61 62 6c 65 20  .    if( pTable 
7380: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 21 6e 6f  ){.      if( !no
7390: 45 72 72 20 29 7b 0a 20 20 20 20 20 20 20 20 73  Err ){.        s
73a0: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
73b0: 50 61 72 73 65 2c 20 22 74 61 62 6c 65 20 25 54  Parse, "table %T
73c0: 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 22   already exists"
73d0: 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  , pName);.      
73e0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61  }else{.        a
73f0: 73 73 65 72 74 28 20 21 64 62 2d 3e 69 6e 69 74  ssert( !db->init
7400: 2e 62 75 73 79 20 7c 7c 20 43 4f 52 52 55 50 54  .busy || CORRUPT
7410: 5f 44 42 20 29 3b 0a 20 20 20 20 20 20 20 20 73  _DB );.        s
7420: 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66 79  qlite3CodeVerify
7430: 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20 69  Schema(pParse, i
7440: 44 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  Db);.      }.   
7450: 20 20 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61     goto begin_ta
7460: 62 6c 65 5f 65 72 72 6f 72 3b 0a 20 20 20 20 7d  ble_error;.    }
7470: 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
7480: 46 69 6e 64 49 6e 64 65 78 28 64 62 2c 20 7a 4e  FindIndex(db, zN
7490: 61 6d 65 2c 20 7a 44 62 29 21 3d 30 20 29 7b 0a  ame, zDb)!=0 ){.
74a0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
74b0: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74  orMsg(pParse, "t
74c0: 68 65 72 65 20 69 73 20 61 6c 72 65 61 64 79 20  here is already 
74d0: 61 6e 20 69 6e 64 65 78 20 6e 61 6d 65 64 20 25  an index named %
74e0: 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  s", zName);.    
74f0: 20 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62    goto begin_tab
7500: 6c 65 5f 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a  le_error;.    }.
7510: 20 20 7d 0a 0a 20 20 70 54 61 62 6c 65 20 3d 20    }..  pTable = 
7520: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a  sqlite3DbMallocZ
7530: 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 54  ero(db, sizeof(T
7540: 61 62 6c 65 29 29 3b 0a 20 20 69 66 28 20 70 54  able));.  if( pT
7550: 61 62 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20 61  able==0 ){.    a
7560: 73 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f  ssert( db->mallo
7570: 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 70  cFailed );.    p
7580: 50 61 72 73 65 2d 3e 72 63 20 3d 20 53 51 4c 49  Parse->rc = SQLI
7590: 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20  TE_NOMEM_BKPT;. 
75a0: 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b     pParse->nErr+
75b0: 2b 3b 0a 20 20 20 20 67 6f 74 6f 20 62 65 67 69  +;.    goto begi
75c0: 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b 0a 20  n_table_error;. 
75d0: 20 7d 0a 20 20 70 54 61 62 6c 65 2d 3e 7a 4e 61   }.  pTable->zNa
75e0: 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20 70 54  me = zName;.  pT
75f0: 61 62 6c 65 2d 3e 69 50 4b 65 79 20 3d 20 2d 31  able->iPKey = -1
7600: 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 70 53 63 68  ;.  pTable->pSch
7610: 65 6d 61 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44  ema = db->aDb[iD
7620: 62 5d 2e 70 53 63 68 65 6d 61 3b 0a 20 20 70 54  b].pSchema;.  pT
7630: 61 62 6c 65 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a  able->nRef = 1;.
7640: 20 20 70 54 61 62 6c 65 2d 3e 6e 52 6f 77 4c 6f    pTable->nRowLo
7650: 67 45 73 74 20 3d 20 32 30 30 3b 20 61 73 73 65  gEst = 200; asse
7660: 72 74 28 20 32 30 30 3d 3d 73 71 6c 69 74 65 33  rt( 200==sqlite3
7670: 4c 6f 67 45 73 74 28 31 30 34 38 35 37 36 29 20  LogEst(1048576) 
7680: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
7690: 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3d 3d  rse->pNewTable==
76a0: 30 20 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e 70  0 );.  pParse->p
76b0: 4e 65 77 54 61 62 6c 65 20 3d 20 70 54 61 62 6c  NewTable = pTabl
76c0: 65 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73  e;..  /* If this
76d0: 20 69 73 20 74 68 65 20 6d 61 67 69 63 20 73 71   is the magic sq
76e0: 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 20 74 61  lite_sequence ta
76f0: 62 6c 65 20 75 73 65 64 20 62 79 20 61 75 74 6f  ble used by auto
7700: 69 6e 63 72 65 6d 65 6e 74 2c 0a 20 20 2a 2a 20  increment,.  ** 
7710: 74 68 65 6e 20 72 65 63 6f 72 64 20 61 20 70 6f  then record a po
7720: 69 6e 74 65 72 20 74 6f 20 74 68 69 73 20 74 61  inter to this ta
7730: 62 6c 65 20 69 6e 20 74 68 65 20 6d 61 69 6e 20  ble in the main 
7740: 64 61 74 61 62 61 73 65 20 73 74 72 75 63 74 75  database structu
7750: 72 65 0a 20 20 2a 2a 20 73 6f 20 74 68 61 74 20  re.  ** so that 
7760: 49 4e 53 45 52 54 20 63 61 6e 20 66 69 6e 64 20  INSERT can find 
7770: 74 68 65 20 74 61 62 6c 65 20 65 61 73 69 6c 79  the table easily
7780: 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53  ..  */.#ifndef S
7790: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49  QLITE_OMIT_AUTOI
77a0: 4e 43 52 45 4d 45 4e 54 0a 20 20 69 66 28 20 21  NCREMENT.  if( !
77b0: 70 50 61 72 73 65 2d 3e 6e 65 73 74 65 64 20 26  pParse->nested &
77c0: 26 20 73 74 72 63 6d 70 28 7a 4e 61 6d 65 2c 20  & strcmp(zName, 
77d0: 22 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65  "sqlite_sequence
77e0: 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73  ")==0 ){.    ass
77f0: 65 72 74 28 20 73 71 6c 69 74 65 33 53 63 68 65  ert( sqlite3Sche
7800: 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20  maMutexHeld(db, 
7810: 69 44 62 2c 20 30 29 20 29 3b 0a 20 20 20 20 70  iDb, 0) );.    p
7820: 54 61 62 6c 65 2d 3e 70 53 63 68 65 6d 61 2d 3e  Table->pSchema->
7830: 70 53 65 71 54 61 62 20 3d 20 70 54 61 62 6c 65  pSeqTab = pTable
7840: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
7850: 2f 2a 20 42 65 67 69 6e 20 67 65 6e 65 72 61 74  /* Begin generat
7860: 69 6e 67 20 74 68 65 20 63 6f 64 65 20 74 68 61  ing the code tha
7870: 74 20 77 69 6c 6c 20 69 6e 73 65 72 74 20 74 68  t will insert th
7880: 65 20 74 61 62 6c 65 20 72 65 63 6f 72 64 20 69  e table record i
7890: 6e 74 6f 0a 20 20 2a 2a 20 74 68 65 20 53 51 4c  nto.  ** the SQL
78a0: 49 54 45 5f 4d 41 53 54 45 52 20 74 61 62 6c 65  ITE_MASTER table
78b0: 2e 20 20 4e 6f 74 65 20 69 6e 20 70 61 72 74 69  .  Note in parti
78c0: 63 75 6c 61 72 20 74 68 61 74 20 77 65 20 6d 75  cular that we mu
78d0: 73 74 20 67 6f 20 61 68 65 61 64 0a 20 20 2a 2a  st go ahead.  **
78e0: 20 61 6e 64 20 61 6c 6c 6f 63 61 74 65 20 74 68   and allocate th
78f0: 65 20 72 65 63 6f 72 64 20 6e 75 6d 62 65 72 20  e record number 
7900: 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20 65 6e  for the table en
7910: 74 72 79 20 6e 6f 77 2e 20 20 42 65 66 6f 72 65  try now.  Before
7920: 20 61 6e 79 0a 20 20 2a 2a 20 50 52 49 4d 41 52   any.  ** PRIMAR
7930: 59 20 4b 45 59 20 6f 72 20 55 4e 49 51 55 45 20  Y KEY or UNIQUE 
7940: 6b 65 79 77 6f 72 64 73 20 61 72 65 20 70 61 72  keywords are par
7950: 73 65 64 2e 20 20 54 68 6f 73 65 20 6b 65 79 77  sed.  Those keyw
7960: 6f 72 64 73 20 77 69 6c 6c 20 63 61 75 73 65 0a  ords will cause.
7970: 20 20 2a 2a 20 69 6e 64 69 63 65 73 20 74 6f 20    ** indices to 
7980: 62 65 20 63 72 65 61 74 65 64 20 61 6e 64 20 74  be created and t
7990: 68 65 20 74 61 62 6c 65 20 72 65 63 6f 72 64 20  he table record 
79a0: 6d 75 73 74 20 63 6f 6d 65 20 62 65 66 6f 72 65  must come before
79b0: 20 74 68 65 20 0a 20 20 2a 2a 20 69 6e 64 69 63   the .  ** indic
79c0: 65 73 2e 20 20 48 65 6e 63 65 2c 20 74 68 65 20  es.  Hence, the 
79d0: 72 65 63 6f 72 64 20 6e 75 6d 62 65 72 20 66 6f  record number fo
79e0: 72 20 74 68 65 20 74 61 62 6c 65 20 6d 75 73 74  r the table must
79f0: 20 62 65 20 61 6c 6c 6f 63 61 74 65 64 0a 20 20   be allocated.  
7a00: 2a 2a 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 69  ** now..  */.  i
7a10: 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73  f( !db->init.bus
7a20: 79 20 26 26 20 28 76 20 3d 20 73 71 6c 69 74 65  y && (v = sqlite
7a30: 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
7a40: 29 21 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20  )!=0 ){.    int 
7a50: 61 64 64 72 31 3b 0a 20 20 20 20 69 6e 74 20 66  addr1;.    int f
7a60: 69 6c 65 46 6f 72 6d 61 74 3b 0a 20 20 20 20 69  ileFormat;.    i
7a70: 6e 74 20 72 65 67 31 2c 20 72 65 67 32 2c 20 72  nt reg1, reg2, r
7a80: 65 67 33 3b 0a 20 20 20 20 2f 2a 20 6e 75 6c 6c  eg3;.    /* null
7a90: 52 6f 77 5b 5d 20 69 73 20 61 6e 20 4f 50 5f 52  Row[] is an OP_R
7aa0: 65 63 6f 72 64 20 65 6e 63 6f 64 69 6e 67 20 6f  ecord encoding o
7ab0: 66 20 61 20 72 6f 77 20 63 6f 6e 74 61 69 6e 69  f a row containi
7ac0: 6e 67 20 35 20 4e 55 4c 4c 73 20 2a 2f 0a 20 20  ng 5 NULLs */.  
7ad0: 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63    static const c
7ae0: 68 61 72 20 6e 75 6c 6c 52 6f 77 5b 5d 20 3d 20  har nullRow[] = 
7af0: 7b 20 36 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  { 6, 0, 0, 0, 0,
7b00: 20 30 20 7d 3b 0a 20 20 20 20 73 71 6c 69 74 65   0 };.    sqlite
7b10: 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61  3BeginWriteOpera
7b20: 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 31 2c 20  tion(pParse, 1, 
7b30: 69 44 62 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53  iDb);..#ifndef S
7b40: 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
7b50: 41 4c 54 41 42 4c 45 0a 20 20 20 20 69 66 28 20  ALTABLE.    if( 
7b60: 69 73 56 69 72 74 75 61 6c 20 29 7b 0a 20 20 20  isVirtual ){.   
7b70: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
7b80: 64 4f 70 30 28 76 2c 20 4f 50 5f 56 42 65 67 69  dOp0(v, OP_VBegi
7b90: 6e 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  n);.    }.#endif
7ba0: 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20  ..    /* If the 
7bb0: 66 69 6c 65 20 66 6f 72 6d 61 74 20 61 6e 64 20  file format and 
7bc0: 65 6e 63 6f 64 69 6e 67 20 69 6e 20 74 68 65 20  encoding in the 
7bd0: 64 61 74 61 62 61 73 65 20 68 61 76 65 20 6e 6f  database have no
7be0: 74 20 62 65 65 6e 20 73 65 74 2c 20 0a 20 20 20  t been set, .   
7bf0: 20 2a 2a 20 73 65 74 20 74 68 65 6d 20 6e 6f 77   ** set them now
7c00: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 65 67  ..    */.    reg
7c10: 31 20 3d 20 70 50 61 72 73 65 2d 3e 72 65 67 52  1 = pParse->regR
7c20: 6f 77 69 64 20 3d 20 2b 2b 70 50 61 72 73 65 2d  owid = ++pParse-
7c30: 3e 6e 4d 65 6d 3b 0a 20 20 20 20 72 65 67 32 20  >nMem;.    reg2 
7c40: 3d 20 70 50 61 72 73 65 2d 3e 72 65 67 52 6f 6f  = pParse->regRoo
7c50: 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  t = ++pParse->nM
7c60: 65 6d 3b 0a 20 20 20 20 72 65 67 33 20 3d 20 2b  em;.    reg3 = +
7c70: 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
7c80: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
7c90: 64 4f 70 33 28 76 2c 20 4f 50 5f 52 65 61 64 43  dOp3(v, OP_ReadC
7ca0: 6f 6f 6b 69 65 2c 20 69 44 62 2c 20 72 65 67 33  ookie, iDb, reg3
7cb0: 2c 20 42 54 52 45 45 5f 46 49 4c 45 5f 46 4f 52  , BTREE_FILE_FOR
7cc0: 4d 41 54 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  MAT);.    sqlite
7cd0: 33 56 64 62 65 55 73 65 73 42 74 72 65 65 28 76  3VdbeUsesBtree(v
7ce0: 2c 20 69 44 62 29 3b 0a 20 20 20 20 61 64 64 72  , iDb);.    addr
7cf0: 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  1 = sqlite3VdbeA
7d00: 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 2c 20  ddOp1(v, OP_If, 
7d10: 72 65 67 33 29 3b 20 56 64 62 65 43 6f 76 65 72  reg3); VdbeCover
7d20: 61 67 65 28 76 29 3b 0a 20 20 20 20 66 69 6c 65  age(v);.    file
7d30: 46 6f 72 6d 61 74 20 3d 20 28 64 62 2d 3e 66 6c  Format = (db->fl
7d40: 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4c 65 67  ags & SQLITE_Leg
7d50: 61 63 79 46 69 6c 65 46 6d 74 29 21 3d 30 20 3f  acyFileFmt)!=0 ?
7d60: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
7d70: 20 20 20 31 20 3a 20 53 51 4c 49 54 45 5f 4d 41     1 : SQLITE_MA
7d80: 58 5f 46 49 4c 45 5f 46 4f 52 4d 41 54 3b 0a 20  X_FILE_FORMAT;. 
7d90: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
7da0: 64 4f 70 33 28 76 2c 20 4f 50 5f 53 65 74 43 6f  dOp3(v, OP_SetCo
7db0: 6f 6b 69 65 2c 20 69 44 62 2c 20 42 54 52 45 45  okie, iDb, BTREE
7dc0: 5f 46 49 4c 45 5f 46 4f 52 4d 41 54 2c 20 66 69  _FILE_FORMAT, fi
7dd0: 6c 65 46 6f 72 6d 61 74 29 3b 0a 20 20 20 20 73  leFormat);.    s
7de0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
7df0: 28 76 2c 20 4f 50 5f 53 65 74 43 6f 6f 6b 69 65  (v, OP_SetCookie
7e00: 2c 20 69 44 62 2c 20 42 54 52 45 45 5f 54 45 58  , iDb, BTREE_TEX
7e10: 54 5f 45 4e 43 4f 44 49 4e 47 2c 20 45 4e 43 28  T_ENCODING, ENC(
7e20: 64 62 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  db));.    sqlite
7e30: 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
7e40: 20 61 64 64 72 31 29 3b 0a 0a 20 20 20 20 2f 2a   addr1);..    /*
7e50: 20 54 68 69 73 20 6a 75 73 74 20 63 72 65 61 74   This just creat
7e60: 65 73 20 61 20 70 6c 61 63 65 2d 68 6f 6c 64 65  es a place-holde
7e70: 72 20 72 65 63 6f 72 64 20 69 6e 20 74 68 65 20  r record in the 
7e80: 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61  sqlite_master ta
7e90: 62 6c 65 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20  ble..    ** The 
7ea0: 72 65 63 6f 72 64 20 63 72 65 61 74 65 64 20 64  record created d
7eb0: 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20  oes not contain 
7ec0: 61 6e 79 74 68 69 6e 67 20 79 65 74 2e 20 20 49  anything yet.  I
7ed0: 74 20 77 69 6c 6c 20 62 65 20 72 65 70 6c 61 63  t will be replac
7ee0: 65 64 0a 20 20 20 20 2a 2a 20 62 79 20 74 68 65  ed.    ** by the
7ef0: 20 72 65 61 6c 20 65 6e 74 72 79 20 69 6e 20 63   real entry in c
7f00: 6f 64 65 20 67 65 6e 65 72 61 74 65 64 20 61 74  ode generated at
7f10: 20 73 71 6c 69 74 65 33 45 6e 64 54 61 62 6c 65   sqlite3EndTable
7f20: 28 29 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ()..    **.    *
7f30: 2a 20 54 68 65 20 72 6f 77 69 64 20 66 6f 72 20  * The rowid for 
7f40: 74 68 65 20 6e 65 77 20 65 6e 74 72 79 20 69 73  the new entry is
7f50: 20 6c 65 66 74 20 69 6e 20 72 65 67 69 73 74 65   left in registe
7f60: 72 20 70 50 61 72 73 65 2d 3e 72 65 67 52 6f 77  r pParse->regRow
7f70: 69 64 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 72  id..    ** The r
7f80: 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20  oot page number 
7f90: 6f 66 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65  of the new table
7fa0: 20 69 73 20 6c 65 66 74 20 69 6e 20 72 65 67 20   is left in reg 
7fb0: 70 50 61 72 73 65 2d 3e 72 65 67 52 6f 6f 74 2e  pParse->regRoot.
7fc0: 0a 20 20 20 20 2a 2a 20 54 68 65 20 72 6f 77 69  .    ** The rowi
7fd0: 64 20 61 6e 64 20 72 6f 6f 74 20 70 61 67 65 20  d and root page 
7fe0: 6e 75 6d 62 65 72 20 76 61 6c 75 65 73 20 61 72  number values ar
7ff0: 65 20 6e 65 65 64 65 64 20 62 79 20 74 68 65 20  e needed by the 
8000: 63 6f 64 65 20 74 68 61 74 0a 20 20 20 20 2a 2a  code that.    **
8010: 20 73 71 6c 69 74 65 33 45 6e 64 54 61 62 6c 65   sqlite3EndTable
8020: 20 77 69 6c 6c 20 67 65 6e 65 72 61 74 65 2e 0a   will generate..
8030: 20 20 20 20 2a 2f 0a 23 69 66 20 21 64 65 66 69      */.#if !defi
8040: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
8050: 56 49 45 57 29 20 7c 7c 20 21 64 65 66 69 6e 65  VIEW) || !define
8060: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  d(SQLITE_OMIT_VI
8070: 52 54 55 41 4c 54 41 42 4c 45 29 0a 20 20 20 20  RTUALTABLE).    
8080: 69 66 28 20 69 73 56 69 65 77 20 7c 7c 20 69 73  if( isView || is
8090: 56 69 72 74 75 61 6c 20 29 7b 0a 20 20 20 20 20  Virtual ){.     
80a0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
80b0: 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
80c0: 2c 20 30 2c 20 72 65 67 32 29 3b 0a 20 20 20 20  , 0, reg2);.    
80d0: 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20  }else.#endif.   
80e0: 20 7b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d   {.      pParse-
80f0: 3e 61 64 64 72 43 72 54 61 62 20 3d 20 73 71 6c  >addrCrTab = 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 43 72 65 61 74 65 54 61 62 6c 65  , OP_CreateTable
8120: 2c 20 69 44 62 2c 20 72 65 67 32 29 3b 0a 20 20  , iDb, reg2);.  
8130: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 4f    }.    sqlite3O
8140: 70 65 6e 4d 61 73 74 65 72 54 61 62 6c 65 28 70  penMasterTable(p
8150: 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 20  Parse, iDb);.   
8160: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
8170: 70 32 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77 69  p2(v, OP_NewRowi
8180: 64 2c 20 30 2c 20 72 65 67 31 29 3b 0a 20 20 20  d, 0, reg1);.   
8190: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
81a0: 70 34 28 76 2c 20 4f 50 5f 42 6c 6f 62 2c 20 36  p4(v, OP_Blob, 6
81b0: 2c 20 72 65 67 33 2c 20 30 2c 20 6e 75 6c 6c 52  , reg3, 0, nullR
81c0: 6f 77 2c 20 50 34 5f 53 54 41 54 49 43 29 3b 0a  ow, P4_STATIC);.
81d0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
81e0: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65  ddOp3(v, OP_Inse
81f0: 72 74 2c 20 30 2c 20 72 65 67 33 2c 20 72 65 67  rt, 0, reg3, reg
8200: 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  1);.    sqlite3V
8210: 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f  dbeChangeP5(v, O
8220: 50 46 4c 41 47 5f 41 50 50 45 4e 44 29 3b 0a 20  PFLAG_APPEND);. 
8230: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
8240: 64 4f 70 30 28 76 2c 20 4f 50 5f 43 6c 6f 73 65  dOp0(v, OP_Close
8250: 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 72  );.  }..  /* Nor
8260: 6d 61 6c 20 28 6e 6f 6e 2d 65 72 72 6f 72 29 20  mal (non-error) 
8270: 72 65 74 75 72 6e 2e 20 2a 2f 0a 20 20 72 65 74  return. */.  ret
8280: 75 72 6e 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 6e  urn;..  /* If an
8290: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 77   error occurs, w
82a0: 65 20 6a 75 6d 70 20 68 65 72 65 20 2a 2f 0a 62  e jump here */.b
82b0: 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72  egin_table_error
82c0: 3a 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  :.  sqlite3DbFre
82d0: 65 28 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20  e(db, zName);.  
82e0: 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20 53 65  return;.}../* Se
82f0: 74 20 70 72 6f 70 65 72 74 69 65 73 20 6f 66 20  t properties of 
8300: 61 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 20 62  a table column b
8310: 61 73 65 64 20 6f 6e 20 74 68 65 20 28 6d 61 67  ased on the (mag
8320: 69 63 61 6c 29 0a 2a 2a 20 6e 61 6d 65 20 6f 66  ical).** name of
8330: 20 74 68 65 20 63 6f 6c 75 6d 6e 2e 0a 2a 2f 0a   the column..*/.
8340: 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  #if SQLITE_ENABL
8350: 45 5f 48 49 44 44 45 4e 5f 43 4f 4c 55 4d 4e 53  E_HIDDEN_COLUMNS
8360: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 6f 6c  .void sqlite3Col
8370: 75 6d 6e 50 72 6f 70 65 72 74 69 65 73 46 72 6f  umnPropertiesFro
8380: 6d 4e 61 6d 65 28 54 61 62 6c 65 20 2a 70 54 61  mName(Table *pTa
8390: 62 2c 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 29  b, Column *pCol)
83a0: 7b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f  {.  if( sqlite3_
83b0: 73 74 72 6e 69 63 6d 70 28 70 43 6f 6c 2d 3e 7a  strnicmp(pCol->z
83c0: 4e 61 6d 65 2c 20 22 5f 5f 68 69 64 64 65 6e 5f  Name, "__hidden_
83d0: 5f 22 2c 20 31 30 29 3d 3d 30 20 29 7b 0a 20 20  _", 10)==0 ){.  
83e0: 20 20 70 43 6f 6c 2d 3e 63 6f 6c 46 6c 61 67 73    pCol->colFlags
83f0: 20 7c 3d 20 43 4f 4c 46 4c 41 47 5f 48 49 44 44   |= COLFLAG_HIDD
8400: 45 4e 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  EN;.  }else if( 
8410: 70 54 61 62 20 26 26 20 70 43 6f 6c 21 3d 70 54  pTab && pCol!=pT
8420: 61 62 2d 3e 61 43 6f 6c 20 26 26 20 28 70 43 6f  ab->aCol && (pCo
8430: 6c 5b 2d 31 5d 2e 63 6f 6c 46 6c 61 67 73 20 26  l[-1].colFlags &
8440: 20 43 4f 4c 46 4c 41 47 5f 48 49 44 44 45 4e 29   COLFLAG_HIDDEN)
8450: 20 29 7b 0a 20 20 20 20 70 54 61 62 2d 3e 74 61   ){.    pTab->ta
8460: 62 46 6c 61 67 73 20 7c 3d 20 54 46 5f 4f 4f 4f  bFlags |= TF_OOO
8470: 48 69 64 64 65 6e 3b 0a 20 20 7d 0a 7d 0a 23 65  Hidden;.  }.}.#e
8480: 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 41 64 64  ndif.../*.** Add
8490: 20 61 20 6e 65 77 20 63 6f 6c 75 6d 6e 20 74 6f   a new column to
84a0: 20 74 68 65 20 74 61 62 6c 65 20 63 75 72 72 65   the table curre
84b0: 6e 74 6c 79 20 62 65 69 6e 67 20 63 6f 6e 73 74  ntly being const
84c0: 72 75 63 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  ructed..**.** Th
84d0: 65 20 70 61 72 73 65 72 20 63 61 6c 6c 73 20 74  e parser calls t
84e0: 68 69 73 20 72 6f 75 74 69 6e 65 20 6f 6e 63 65  his routine once
84f0: 20 66 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e   for each column
8500: 20 64 65 63 6c 61 72 61 74 69 6f 6e 0a 2a 2a 20   declaration.** 
8510: 69 6e 20 61 20 43 52 45 41 54 45 20 54 41 42 4c  in a CREATE TABL
8520: 45 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 73 71  E statement.  sq
8530: 6c 69 74 65 33 53 74 61 72 74 54 61 62 6c 65 28  lite3StartTable(
8540: 29 20 67 65 74 73 20 63 61 6c 6c 65 64 0a 2a 2a  ) gets called.**
8550: 20 66 69 72 73 74 20 74 6f 20 67 65 74 20 74 68   first to get th
8560: 69 6e 67 73 20 67 6f 69 6e 67 2e 20 20 54 68 65  ings going.  The
8570: 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  n this routine i
8580: 73 20 63 61 6c 6c 65 64 20 66 6f 72 20 65 61 63  s called for eac
8590: 68 0a 2a 2a 20 63 6f 6c 75 6d 6e 2e 0a 2a 2f 0a  h.** column..*/.
85a0: 76 6f 69 64 20 73 71 6c 69 74 65 33 41 64 64 43  void sqlite3AddC
85b0: 6f 6c 75 6d 6e 28 50 61 72 73 65 20 2a 70 50 61  olumn(Parse *pPa
85c0: 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d  rse, Token *pNam
85d0: 65 2c 20 54 6f 6b 65 6e 20 2a 70 54 79 70 65 29  e, Token *pType)
85e0: 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20  {.  Table *p;.  
85f0: 69 6e 74 20 69 3b 0a 20 20 63 68 61 72 20 2a 7a  int i;.  char *z
8600: 3b 0a 20 20 63 68 61 72 20 2a 7a 54 79 70 65 3b  ;.  char *zType;
8610: 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b  .  Column *pCol;
8620: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
8630: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69   pParse->db;.  i
8640: 66 28 20 28 70 20 3d 20 70 50 61 72 73 65 2d 3e  f( (p = pParse->
8650: 70 4e 65 77 54 61 62 6c 65 29 3d 3d 30 20 29 20  pNewTable)==0 ) 
8660: 72 65 74 75 72 6e 3b 0a 23 69 66 20 53 51 4c 49  return;.#if SQLI
8670: 54 45 5f 4d 41 58 5f 43 4f 4c 55 4d 4e 0a 20 20  TE_MAX_COLUMN.  
8680: 69 66 28 20 70 2d 3e 6e 43 6f 6c 2b 31 3e 64 62  if( p->nCol+1>db
8690: 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f  ->aLimit[SQLITE_
86a0: 4c 49 4d 49 54 5f 43 4f 4c 55 4d 4e 5d 20 29 7b  LIMIT_COLUMN] ){
86b0: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
86c0: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 6f  rMsg(pParse, "to
86d0: 6f 20 6d 61 6e 79 20 63 6f 6c 75 6d 6e 73 20 6f  o many columns o
86e0: 6e 20 25 73 22 2c 20 70 2d 3e 7a 4e 61 6d 65 29  n %s", p->zName)
86f0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
8700: 7d 0a 23 65 6e 64 69 66 0a 20 20 7a 20 3d 20 73  }.#endif.  z = s
8710: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61  qlite3DbMallocRa
8720: 77 28 64 62 2c 20 70 4e 61 6d 65 2d 3e 6e 20 2b  w(db, pName->n +
8730: 20 70 54 79 70 65 2d 3e 6e 20 2b 20 32 29 3b 0a   pType->n + 2);.
8740: 20 20 69 66 28 20 7a 3d 3d 30 20 29 20 72 65 74    if( z==0 ) ret
8750: 75 72 6e 3b 0a 20 20 6d 65 6d 63 70 79 28 7a 2c  urn;.  memcpy(z,
8760: 20 70 4e 61 6d 65 2d 3e 7a 2c 20 70 4e 61 6d 65   pName->z, pName
8770: 2d 3e 6e 29 3b 0a 20 20 7a 5b 70 4e 61 6d 65 2d  ->n);.  z[pName-
8780: 3e 6e 5d 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74  >n] = 0;.  sqlit
8790: 65 33 44 65 71 75 6f 74 65 28 7a 29 3b 0a 20 20  e3Dequote(z);.  
87a0: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43  for(i=0; i<p->nC
87b0: 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  ol; i++){.    if
87c0: 28 20 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d  ( sqlite3_stricm
87d0: 70 28 7a 2c 20 70 2d 3e 61 43 6f 6c 5b 69 5d 2e  p(z, p->aCol[i].
87e0: 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20  zName)==0 ){.   
87f0: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
8800: 73 67 28 70 50 61 72 73 65 2c 20 22 64 75 70 6c  sg(pParse, "dupl
8810: 69 63 61 74 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d  icate column nam
8820: 65 3a 20 25 73 22 2c 20 7a 29 3b 0a 20 20 20 20  e: %s", z);.    
8830: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
8840: 64 62 2c 20 7a 29 3b 0a 20 20 20 20 20 20 72 65  db, z);.      re
8850: 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  turn;.    }.  }.
8860: 20 20 69 66 28 20 28 70 2d 3e 6e 43 6f 6c 20 26    if( (p->nCol &
8870: 20 30 78 37 29 3d 3d 30 20 29 7b 0a 20 20 20 20   0x7)==0 ){.    
8880: 43 6f 6c 75 6d 6e 20 2a 61 4e 65 77 3b 0a 20 20  Column *aNew;.  
8890: 20 20 61 4e 65 77 20 3d 20 73 71 6c 69 74 65 33    aNew = sqlite3
88a0: 44 62 52 65 61 6c 6c 6f 63 28 64 62 2c 70 2d 3e  DbRealloc(db,p->
88b0: 61 43 6f 6c 2c 28 70 2d 3e 6e 43 6f 6c 2b 38 29  aCol,(p->nCol+8)
88c0: 2a 73 69 7a 65 6f 66 28 70 2d 3e 61 43 6f 6c 5b  *sizeof(p->aCol[
88d0: 30 5d 29 29 3b 0a 20 20 20 20 69 66 28 20 61 4e  0]));.    if( aN
88e0: 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  ew==0 ){.      s
88f0: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
8900: 20 7a 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72   z);.      retur
8910: 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e  n;.    }.    p->
8920: 61 43 6f 6c 20 3d 20 61 4e 65 77 3b 0a 20 20 7d  aCol = aNew;.  }
8930: 0a 20 20 70 43 6f 6c 20 3d 20 26 70 2d 3e 61 43  .  pCol = &p->aC
8940: 6f 6c 5b 70 2d 3e 6e 43 6f 6c 5d 3b 0a 20 20 6d  ol[p->nCol];.  m
8950: 65 6d 73 65 74 28 70 43 6f 6c 2c 20 30 2c 20 73  emset(pCol, 0, s
8960: 69 7a 65 6f 66 28 70 2d 3e 61 43 6f 6c 5b 30 5d  izeof(p->aCol[0]
8970: 29 29 3b 0a 20 20 70 43 6f 6c 2d 3e 7a 4e 61 6d  ));.  pCol->zNam
8980: 65 20 3d 20 7a 3b 0a 20 20 73 71 6c 69 74 65 33  e = z;.  sqlite3
8990: 43 6f 6c 75 6d 6e 50 72 6f 70 65 72 74 69 65 73  ColumnProperties
89a0: 46 72 6f 6d 4e 61 6d 65 28 70 2c 20 70 43 6f 6c  FromName(p, pCol
89b0: 29 3b 0a 20 0a 20 20 69 66 28 20 70 54 79 70 65  );. .  if( pType
89c0: 2d 3e 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a  ->n==0 ){.    /*
89d0: 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20   If there is no 
89e0: 74 79 70 65 20 73 70 65 63 69 66 69 65 64 2c 20  type specified, 
89f0: 63 6f 6c 75 6d 6e 73 20 68 61 76 65 20 74 68 65  columns have the
8a00: 20 64 65 66 61 75 6c 74 20 61 66 66 69 6e 69 74   default affinit
8a10: 79 0a 20 20 20 20 2a 2a 20 27 42 4c 4f 42 27 2e  y.    ** 'BLOB'.
8a20: 20 2a 2f 0a 20 20 20 20 70 43 6f 6c 2d 3e 61 66   */.    pCol->af
8a30: 66 69 6e 69 74 79 20 3d 20 53 51 4c 49 54 45 5f  finity = SQLITE_
8a40: 41 46 46 5f 42 4c 4f 42 3b 0a 20 20 20 20 70 43  AFF_BLOB;.    pC
8a50: 6f 6c 2d 3e 73 7a 45 73 74 20 3d 20 31 3b 0a 20  ol->szEst = 1;. 
8a60: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 54 79 70   }else{.    zTyp
8a70: 65 20 3d 20 7a 20 2b 20 73 71 6c 69 74 65 33 53  e = z + sqlite3S
8a80: 74 72 6c 65 6e 33 30 28 7a 29 20 2b 20 31 3b 0a  trlen30(z) + 1;.
8a90: 20 20 20 20 6d 65 6d 63 70 79 28 7a 54 79 70 65      memcpy(zType
8aa0: 2c 20 70 54 79 70 65 2d 3e 7a 2c 20 70 54 79 70  , pType->z, pTyp
8ab0: 65 2d 3e 6e 29 3b 0a 20 20 20 20 7a 54 79 70 65  e->n);.    zType
8ac0: 5b 70 54 79 70 65 2d 3e 6e 5d 20 3d 20 30 3b 0a  [pType->n] = 0;.
8ad0: 20 20 20 20 73 71 6c 69 74 65 33 44 65 71 75 6f      sqlite3Dequo
8ae0: 74 65 28 7a 54 79 70 65 29 3b 0a 20 20 20 20 70  te(zType);.    p
8af0: 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20  Col->affinity = 
8b00: 73 71 6c 69 74 65 33 41 66 66 69 6e 69 74 79 54  sqlite3AffinityT
8b10: 79 70 65 28 7a 54 79 70 65 2c 20 26 70 43 6f 6c  ype(zType, &pCol
8b20: 2d 3e 73 7a 45 73 74 29 3b 0a 20 20 20 20 70 43  ->szEst);.    pC
8b30: 6f 6c 2d 3e 63 6f 6c 46 6c 61 67 73 20 7c 3d 20  ol->colFlags |= 
8b40: 43 4f 4c 46 4c 41 47 5f 48 41 53 54 59 50 45 3b  COLFLAG_HASTYPE;
8b50: 0a 20 20 7d 0a 20 20 70 2d 3e 6e 43 6f 6c 2b 2b  .  }.  p->nCol++
8b60: 3b 0a 20 20 70 50 61 72 73 65 2d 3e 63 6f 6e 73  ;.  pParse->cons
8b70: 74 72 61 69 6e 74 4e 61 6d 65 2e 6e 20 3d 20 30  traintName.n = 0
8b80: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
8b90: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
8ba0: 64 20 62 79 20 74 68 65 20 70 61 72 73 65 72 20  d by the parser 
8bb0: 77 68 69 6c 65 20 69 6e 20 74 68 65 20 6d 69 64  while in the mid
8bc0: 64 6c 65 20 6f 66 0a 2a 2a 20 70 61 72 73 69 6e  dle of.** parsin
8bd0: 67 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45  g a CREATE TABLE
8be0: 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 41 20 22   statement.  A "
8bf0: 4e 4f 54 20 4e 55 4c 4c 22 20 63 6f 6e 73 74 72  NOT NULL" constr
8c00: 61 69 6e 74 20 68 61 73 0a 2a 2a 20 62 65 65 6e  aint has.** been
8c10: 20 73 65 65 6e 20 6f 6e 20 61 20 63 6f 6c 75 6d   seen on a colum
8c20: 6e 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  n.  This routine
8c30: 20 73 65 74 73 20 74 68 65 20 6e 6f 74 4e 75 6c   sets the notNul
8c40: 6c 20 66 6c 61 67 20 6f 6e 0a 2a 2a 20 74 68 65  l flag on.** the
8c50: 20 63 6f 6c 75 6d 6e 20 63 75 72 72 65 6e 74 6c   column currentl
8c60: 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63  y under construc
8c70: 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  tion..*/.void sq
8c80: 6c 69 74 65 33 41 64 64 4e 6f 74 4e 75 6c 6c 28  lite3AddNotNull(
8c90: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69  Parse *pParse, i
8ca0: 6e 74 20 6f 6e 45 72 72 6f 72 29 7b 0a 20 20 54  nt onError){.  T
8cb0: 61 62 6c 65 20 2a 70 3b 0a 20 20 70 20 3d 20 70  able *p;.  p = p
8cc0: 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
8cd0: 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20  ;.  if( p==0 || 
8ce0: 4e 45 56 45 52 28 70 2d 3e 6e 43 6f 6c 3c 31 29  NEVER(p->nCol<1)
8cf0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 2d 3e   ) return;.  p->
8d00: 61 43 6f 6c 5b 70 2d 3e 6e 43 6f 6c 2d 31 5d 2e  aCol[p->nCol-1].
8d10: 6e 6f 74 4e 75 6c 6c 20 3d 20 28 75 38 29 6f 6e  notNull = (u8)on
8d20: 45 72 72 6f 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Error;.}../*.** 
8d30: 53 63 61 6e 20 74 68 65 20 63 6f 6c 75 6d 6e 20  Scan the column 
8d40: 74 79 70 65 20 6e 61 6d 65 20 7a 54 79 70 65 20  type name zType 
8d50: 28 6c 65 6e 67 74 68 20 6e 54 79 70 65 29 20 61  (length nType) a
8d60: 6e 64 20 72 65 74 75 72 6e 20 74 68 65 0a 2a 2a  nd return the.**
8d70: 20 61 73 73 6f 63 69 61 74 65 64 20 61 66 66 69   associated affi
8d80: 6e 69 74 79 20 74 79 70 65 2e 0a 2a 2a 0a 2a 2a  nity type..**.**
8d90: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f   This routine do
8da0: 65 73 20 61 20 63 61 73 65 2d 69 6e 64 65 70 65  es a case-indepe
8db0: 6e 64 65 6e 74 20 73 65 61 72 63 68 20 6f 66 20  ndent search of 
8dc0: 7a 54 79 70 65 20 66 6f 72 20 74 68 65 20 0a 2a  zType for the .*
8dd0: 2a 20 73 75 62 73 74 72 69 6e 67 73 20 69 6e 20  * substrings in 
8de0: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 61  the following ta
8df0: 62 6c 65 2e 20 49 66 20 6f 6e 65 20 6f 66 20 74  ble. If one of t
8e00: 68 65 20 73 75 62 73 74 72 69 6e 67 73 20 69 73  he substrings is
8e10: 0a 2a 2a 20 66 6f 75 6e 64 2c 20 74 68 65 20 63  .** found, the c
8e20: 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 61 66 66  orresponding aff
8e30: 69 6e 69 74 79 20 69 73 20 72 65 74 75 72 6e 65  inity is returne
8e40: 64 2e 20 49 66 20 7a 54 79 70 65 20 63 6f 6e 74  d. If zType cont
8e50: 61 69 6e 73 0a 2a 2a 20 6d 6f 72 65 20 74 68 61  ains.** more tha
8e60: 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 73 75 62  n one of the sub
8e70: 73 74 72 69 6e 67 73 2c 20 65 6e 74 72 69 65 73  strings, entries
8e80: 20 74 6f 77 61 72 64 20 74 68 65 20 74 6f 70 20   toward the top 
8e90: 6f 66 20 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65  of .** the table
8ea0: 20 74 61 6b 65 20 70 72 69 6f 72 69 74 79 2e 20   take priority. 
8eb0: 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69 66 20  For example, if 
8ec0: 7a 54 79 70 65 20 69 73 20 27 42 4c 4f 42 49 4e  zType is 'BLOBIN
8ed0: 54 27 2c 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 41  T', .** SQLITE_A
8ee0: 46 46 5f 49 4e 54 45 47 45 52 20 69 73 20 72 65  FF_INTEGER is re
8ef0: 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 53 75  turned..**.** Su
8f00: 62 73 74 72 69 6e 67 20 20 20 20 20 7c 20 41 66  bstring     | Af
8f10: 66 69 6e 69 74 79 0a 2a 2a 20 2d 2d 2d 2d 2d 2d  finity.** ------
8f20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8f30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 27 49  ----------.** 'I
8f40: 4e 54 27 20 20 20 20 20 20 20 20 20 7c 20 53 51  NT'         | SQ
8f50: 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52  LITE_AFF_INTEGER
8f60: 0a 2a 2a 20 27 43 48 41 52 27 20 20 20 20 20 20  .** 'CHAR'      
8f70: 20 20 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f 54    | SQLITE_AFF_T
8f80: 45 58 54 0a 2a 2a 20 27 43 4c 4f 42 27 20 20 20  EXT.** 'CLOB'   
8f90: 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 41 46       | SQLITE_AF
8fa0: 46 5f 54 45 58 54 0a 2a 2a 20 27 54 45 58 54 27  F_TEXT.** 'TEXT'
8fb0: 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45          | SQLITE
8fc0: 5f 41 46 46 5f 54 45 58 54 0a 2a 2a 20 27 42 4c  _AFF_TEXT.** 'BL
8fd0: 4f 42 27 20 20 20 20 20 20 20 20 7c 20 53 51 4c  OB'        | SQL
8fe0: 49 54 45 5f 41 46 46 5f 42 4c 4f 42 0a 2a 2a 20  ITE_AFF_BLOB.** 
8ff0: 27 52 45 41 4c 27 20 20 20 20 20 20 20 20 7c 20  'REAL'        | 
9000: 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 0a  SQLITE_AFF_REAL.
9010: 2a 2a 20 27 46 4c 4f 41 27 20 20 20 20 20 20 20  ** 'FLOA'       
9020: 20 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f 52 45   | SQLITE_AFF_RE
9030: 41 4c 0a 2a 2a 20 27 44 4f 55 42 27 20 20 20 20  AL.** 'DOUB'    
9040: 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 41 46 46      | SQLITE_AFF
9050: 5f 52 45 41 4c 0a 2a 2a 0a 2a 2a 20 49 66 20 6e  _REAL.**.** If n
9060: 6f 6e 65 20 6f 66 20 74 68 65 20 73 75 62 73 74  one of the subst
9070: 72 69 6e 67 73 20 69 6e 20 74 68 65 20 61 62 6f  rings in the abo
9080: 76 65 20 74 61 62 6c 65 20 61 72 65 20 66 6f 75  ve table are fou
9090: 6e 64 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 41 46  nd,.** SQLITE_AF
90a0: 46 5f 4e 55 4d 45 52 49 43 20 69 73 20 72 65 74  F_NUMERIC is ret
90b0: 75 72 6e 65 64 2e 0a 2a 2f 0a 63 68 61 72 20 73  urned..*/.char s
90c0: 71 6c 69 74 65 33 41 66 66 69 6e 69 74 79 54 79  qlite3AffinityTy
90d0: 70 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  pe(const char *z
90e0: 49 6e 2c 20 75 38 20 2a 70 73 7a 45 73 74 29 7b  In, u8 *pszEst){
90f0: 0a 20 20 75 33 32 20 68 20 3d 20 30 3b 0a 20 20  .  u32 h = 0;.  
9100: 63 68 61 72 20 61 66 66 20 3d 20 53 51 4c 49 54  char aff = SQLIT
9110: 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 3b 0a 20  E_AFF_NUMERIC;. 
9120: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 68   const char *zCh
9130: 61 72 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72  ar = 0;..  asser
9140: 74 28 20 7a 49 6e 21 3d 30 20 29 3b 0a 20 20 77  t( zIn!=0 );.  w
9150: 68 69 6c 65 28 20 7a 49 6e 5b 30 5d 20 29 7b 0a  hile( zIn[0] ){.
9160: 20 20 20 20 68 20 3d 20 28 68 3c 3c 38 29 20 2b      h = (h<<8) +
9170: 20 73 71 6c 69 74 65 33 55 70 70 65 72 54 6f 4c   sqlite3UpperToL
9180: 6f 77 65 72 5b 28 2a 7a 49 6e 29 26 30 78 66 66  ower[(*zIn)&0xff
9190: 5d 3b 0a 20 20 20 20 7a 49 6e 2b 2b 3b 0a 20 20  ];.    zIn++;.  
91a0: 20 20 69 66 28 20 68 3d 3d 28 28 27 63 27 3c 3c    if( h==(('c'<<
91b0: 32 34 29 2b 28 27 68 27 3c 3c 31 36 29 2b 28 27  24)+('h'<<16)+('
91c0: 61 27 3c 3c 38 29 2b 27 72 27 29 20 29 7b 20 20  a'<<8)+'r') ){  
91d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 48             /* CH
91e0: 41 52 20 2a 2f 0a 20 20 20 20 20 20 61 66 66 20  AR */.      aff 
91f0: 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58  = SQLITE_AFF_TEX
9200: 54 3b 0a 20 20 20 20 20 20 7a 43 68 61 72 20 3d  T;.      zChar =
9210: 20 7a 49 6e 3b 0a 20 20 20 20 7d 65 6c 73 65 20   zIn;.    }else 
9220: 69 66 28 20 68 3d 3d 28 28 27 63 27 3c 3c 32 34  if( h==(('c'<<24
9230: 29 2b 28 27 6c 27 3c 3c 31 36 29 2b 28 27 6f 27  )+('l'<<16)+('o'
9240: 3c 3c 38 29 2b 27 62 27 29 20 29 7b 20 20 20 20  <<8)+'b') ){    
9250: 20 20 20 2f 2a 20 43 4c 4f 42 20 2a 2f 0a 20 20     /* CLOB */.  
9260: 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49 54 45      aff = SQLITE
9270: 5f 41 46 46 5f 54 45 58 54 3b 0a 20 20 20 20 7d  _AFF_TEXT;.    }
9280: 65 6c 73 65 20 69 66 28 20 68 3d 3d 28 28 27 74  else if( h==(('t
9290: 27 3c 3c 32 34 29 2b 28 27 65 27 3c 3c 31 36 29  '<<24)+('e'<<16)
92a0: 2b 28 27 78 27 3c 3c 38 29 2b 27 74 27 29 20 29  +('x'<<8)+'t') )
92b0: 7b 20 20 20 20 20 20 20 2f 2a 20 54 45 58 54 20  {       /* TEXT 
92c0: 2a 2f 0a 20 20 20 20 20 20 61 66 66 20 3d 20 53  */.      aff = S
92d0: 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 3b 0a  QLITE_AFF_TEXT;.
92e0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 68 3d      }else if( h=
92f0: 3d 28 28 27 62 27 3c 3c 32 34 29 2b 28 27 6c 27  =(('b'<<24)+('l'
9300: 3c 3c 31 36 29 2b 28 27 6f 27 3c 3c 38 29 2b 27  <<16)+('o'<<8)+'
9310: 62 27 29 20 20 20 20 20 20 20 20 20 20 2f 2a 20  b')          /* 
9320: 42 4c 4f 42 20 2a 2f 0a 20 20 20 20 20 20 20 20  BLOB */.        
9330: 26 26 20 28 61 66 66 3d 3d 53 51 4c 49 54 45 5f  && (aff==SQLITE_
9340: 41 46 46 5f 4e 55 4d 45 52 49 43 20 7c 7c 20 61  AFF_NUMERIC || a
9350: 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 52  ff==SQLITE_AFF_R
9360: 45 41 4c 29 20 29 7b 0a 20 20 20 20 20 20 61 66  EAL) ){.      af
9370: 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 42  f = SQLITE_AFF_B
9380: 4c 4f 42 3b 0a 20 20 20 20 20 20 69 66 28 20 7a  LOB;.      if( z
9390: 49 6e 5b 30 5d 3d 3d 27 28 27 20 29 20 7a 43 68  In[0]=='(' ) zCh
93a0: 61 72 20 3d 20 7a 49 6e 3b 0a 23 69 66 6e 64 65  ar = zIn;.#ifnde
93b0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c  f SQLITE_OMIT_FL
93c0: 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 20 20 20  OATING_POINT.   
93d0: 20 7d 65 6c 73 65 20 69 66 28 20 68 3d 3d 28 28   }else if( h==((
93e0: 27 72 27 3c 3c 32 34 29 2b 28 27 65 27 3c 3c 31  'r'<<24)+('e'<<1
93f0: 36 29 2b 28 27 61 27 3c 3c 38 29 2b 27 6c 27 29  6)+('a'<<8)+'l')
9400: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 45 41            /* REA
9410: 4c 20 2a 2f 0a 20 20 20 20 20 20 20 20 26 26 20  L */.        && 
9420: 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f  aff==SQLITE_AFF_
9430: 4e 55 4d 45 52 49 43 20 29 7b 0a 20 20 20 20 20  NUMERIC ){.     
9440: 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46   aff = SQLITE_AF
9450: 46 5f 52 45 41 4c 3b 0a 20 20 20 20 7d 65 6c 73  F_REAL;.    }els
9460: 65 20 69 66 28 20 68 3d 3d 28 28 27 66 27 3c 3c  e if( h==(('f'<<
9470: 32 34 29 2b 28 27 6c 27 3c 3c 31 36 29 2b 28 27  24)+('l'<<16)+('
9480: 6f 27 3c 3c 38 29 2b 27 61 27 29 20 20 20 20 20  o'<<8)+'a')     
9490: 20 20 20 20 20 2f 2a 20 46 4c 4f 41 20 2a 2f 0a       /* FLOA */.
94a0: 20 20 20 20 20 20 20 20 26 26 20 61 66 66 3d 3d          && aff==
94b0: 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52  SQLITE_AFF_NUMER
94c0: 49 43 20 29 7b 0a 20 20 20 20 20 20 61 66 66 20  IC ){.      aff 
94d0: 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41  = SQLITE_AFF_REA
94e0: 4c 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  L;.    }else if(
94f0: 20 68 3d 3d 28 28 27 64 27 3c 3c 32 34 29 2b 28   h==(('d'<<24)+(
9500: 27 6f 27 3c 3c 31 36 29 2b 28 27 75 27 3c 3c 38  'o'<<16)+('u'<<8
9510: 29 2b 27 62 27 29 20 20 20 20 20 20 20 20 20 20  )+'b')          
9520: 2f 2a 20 44 4f 55 42 20 2a 2f 0a 20 20 20 20 20  /* DOUB */.     
9530: 20 20 20 26 26 20 61 66 66 3d 3d 53 51 4c 49 54     && aff==SQLIT
9540: 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20 29 7b  E_AFF_NUMERIC ){
9550: 0a 20 20 20 20 20 20 61 66 66 20 3d 20 53 51 4c  .      aff = SQL
9560: 49 54 45 5f 41 46 46 5f 52 45 41 4c 3b 0a 23 65  ITE_AFF_REAL;.#e
9570: 6e 64 69 66 0a 20 20 20 20 7d 65 6c 73 65 20 69  ndif.    }else i
9580: 66 28 20 28 68 26 30 78 30 30 46 46 46 46 46 46  f( (h&0x00FFFFFF
9590: 29 3d 3d 28 28 27 69 27 3c 3c 31 36 29 2b 28 27  )==(('i'<<16)+('
95a0: 6e 27 3c 3c 38 29 2b 27 74 27 29 20 29 7b 20 20  n'<<8)+'t') ){  
95b0: 20 20 2f 2a 20 49 4e 54 20 2a 2f 0a 20 20 20 20    /* INT */.    
95c0: 20 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41    aff = SQLITE_A
95d0: 46 46 5f 49 4e 54 45 47 45 52 3b 0a 20 20 20 20  FF_INTEGER;.    
95e0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
95f0: 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 70 73 7a 45   }..  /* If pszE
9600: 73 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20  st is not NULL, 
9610: 73 74 6f 72 65 20 61 6e 20 65 73 74 69 6d 61 74  store an estimat
9620: 65 20 6f 66 20 74 68 65 20 66 69 65 6c 64 20 73  e of the field s
9630: 69 7a 65 2e 20 20 54 68 65 0a 20 20 2a 2a 20 65  ize.  The.  ** e
9640: 73 74 69 6d 61 74 65 20 69 73 20 73 63 61 6c 65  stimate is scale
9650: 64 20 73 6f 20 74 68 61 74 20 74 68 65 20 73 69  d so that the si
9660: 7a 65 20 6f 66 20 61 6e 20 69 6e 74 65 67 65 72  ze of an integer
9670: 20 69 73 20 31 2e 20 20 2a 2f 0a 20 20 69 66 28   is 1.  */.  if(
9680: 20 70 73 7a 45 73 74 20 29 7b 0a 20 20 20 20 2a   pszEst ){.    *
9690: 70 73 7a 45 73 74 20 3d 20 31 3b 20 20 20 2f 2a  pszEst = 1;   /*
96a0: 20 64 65 66 61 75 6c 74 20 73 69 7a 65 20 69 73   default size is
96b0: 20 61 70 70 72 6f 78 20 34 20 62 79 74 65 73 20   approx 4 bytes 
96c0: 2a 2f 0a 20 20 20 20 69 66 28 20 61 66 66 3c 53  */.    if( aff<S
96d0: 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49  QLITE_AFF_NUMERI
96e0: 43 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 7a  C ){.      if( z
96f0: 43 68 61 72 20 29 7b 0a 20 20 20 20 20 20 20 20  Char ){.        
9700: 77 68 69 6c 65 28 20 7a 43 68 61 72 5b 30 5d 20  while( zChar[0] 
9710: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
9720: 20 73 71 6c 69 74 65 33 49 73 64 69 67 69 74 28   sqlite3Isdigit(
9730: 7a 43 68 61 72 5b 30 5d 29 20 29 7b 0a 20 20 20  zChar[0]) ){.   
9740: 20 20 20 20 20 20 20 20 20 69 6e 74 20 76 20 3d           int v =
9750: 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   0;.            
9760: 73 71 6c 69 74 65 33 47 65 74 49 6e 74 33 32 28  sqlite3GetInt32(
9770: 7a 43 68 61 72 2c 20 26 76 29 3b 0a 20 20 20 20  zChar, &v);.    
9780: 20 20 20 20 20 20 20 20 76 20 3d 20 76 2f 34 20          v = v/4 
9790: 2b 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20  + 1;.           
97a0: 20 69 66 28 20 76 3e 32 35 35 20 29 20 76 20 3d   if( v>255 ) v =
97b0: 20 32 35 35 3b 0a 20 20 20 20 20 20 20 20 20 20   255;.          
97c0: 20 20 2a 70 73 7a 45 73 74 20 3d 20 76 3b 20 2f    *pszEst = v; /
97d0: 2a 20 42 4c 4f 42 28 6b 29 2c 20 56 41 52 43 48  * BLOB(k), VARCH
97e0: 41 52 28 6b 29 2c 20 43 48 41 52 28 6b 29 20 2d  AR(k), CHAR(k) -
97f0: 3e 20 72 3d 28 6b 2f 34 2b 31 29 20 2a 2f 0a 20  > r=(k/4+1) */. 
9800: 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
9810: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
9820: 20 20 20 20 20 20 20 20 7a 43 68 61 72 2b 2b 3b          zChar++;
9830: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
9840: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
9850: 2a 70 73 7a 45 73 74 20 3d 20 35 3b 20 20 20 2f  *pszEst = 5;   /
9860: 2a 20 42 4c 4f 42 2c 20 54 45 58 54 2c 20 43 4c  * BLOB, TEXT, CL
9870: 4f 42 20 2d 3e 20 72 3d 35 20 20 28 61 70 70 72  OB -> r=5  (appr
9880: 6f 78 20 32 30 20 62 79 74 65 73 29 2a 2f 0a 20  ox 20 bytes)*/. 
9890: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
98a0: 0a 20 20 72 65 74 75 72 6e 20 61 66 66 3b 0a 7d  .  return aff;.}
98b0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 65 78 70 72  ../*.** The expr
98c0: 65 73 73 69 6f 6e 20 69 73 20 74 68 65 20 64 65  ession is the de
98d0: 66 61 75 6c 74 20 76 61 6c 75 65 20 66 6f 72 20  fault value for 
98e0: 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c  the most recentl
98f0: 79 20 61 64 64 65 64 20 63 6f 6c 75 6d 6e 0a 2a  y added column.*
9900: 2a 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 63  * of the table c
9910: 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63  urrently under c
9920: 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 0a  onstruction..**.
9930: 2a 2a 20 44 65 66 61 75 6c 74 20 76 61 6c 75 65  ** Default value
9940: 20 65 78 70 72 65 73 73 69 6f 6e 73 20 6d 75 73   expressions mus
9950: 74 20 62 65 20 63 6f 6e 73 74 61 6e 74 2e 20 20  t be constant.  
9960: 52 61 69 73 65 20 61 6e 20 65 78 63 65 70 74 69  Raise an excepti
9970: 6f 6e 20 69 66 20 74 68 69 73 0a 2a 2a 20 69 73  on if this.** is
9980: 20 6e 6f 74 20 74 68 65 20 63 61 73 65 2e 0a 2a   not the case..*
9990: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
99a0: 65 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74  e is called by t
99b0: 68 65 20 70 61 72 73 65 72 20 77 68 69 6c 65 20  he parser while 
99c0: 69 6e 20 74 68 65 20 6d 69 64 64 6c 65 20 6f 66  in the middle of
99d0: 0a 2a 2a 20 70 61 72 73 69 6e 67 20 61 20 43 52  .** parsing a CR
99e0: 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65  EATE TABLE state
99f0: 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ment..*/.void sq
9a00: 6c 69 74 65 33 41 64 64 44 65 66 61 75 6c 74 56  lite3AddDefaultV
9a10: 61 6c 75 65 28 50 61 72 73 65 20 2a 70 50 61 72  alue(Parse *pPar
9a20: 73 65 2c 20 45 78 70 72 53 70 61 6e 20 2a 70 53  se, ExprSpan *pS
9a30: 70 61 6e 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70  pan){.  Table *p
9a40: 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c  ;.  Column *pCol
9a50: 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
9a60: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
9a70: 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  p = pParse->pNew
9a80: 54 61 62 6c 65 3b 0a 20 20 69 66 28 20 70 21 3d  Table;.  if( p!=
9a90: 30 20 29 7b 0a 20 20 20 20 70 43 6f 6c 20 3d 20  0 ){.    pCol = 
9aa0: 26 28 70 2d 3e 61 43 6f 6c 5b 70 2d 3e 6e 43 6f  &(p->aCol[p->nCo
9ab0: 6c 2d 31 5d 29 3b 0a 20 20 20 20 69 66 28 20 21  l-1]);.    if( !
9ac0: 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e  sqlite3ExprIsCon
9ad0: 73 74 61 6e 74 4f 72 46 75 6e 63 74 69 6f 6e 28  stantOrFunction(
9ae0: 70 53 70 61 6e 2d 3e 70 45 78 70 72 2c 20 64 62  pSpan->pExpr, db
9af0: 2d 3e 69 6e 69 74 2e 62 75 73 79 29 20 29 7b 0a  ->init.busy) ){.
9b00: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
9b10: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 64  orMsg(pParse, "d
9b20: 65 66 61 75 6c 74 20 76 61 6c 75 65 20 6f 66 20  efault value of 
9b30: 63 6f 6c 75 6d 6e 20 5b 25 73 5d 20 69 73 20 6e  column [%s] is n
9b40: 6f 74 20 63 6f 6e 73 74 61 6e 74 22 2c 0a 20 20  ot constant",.  
9b50: 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 7a 4e          pCol->zN
9b60: 61 6d 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ame);.    }else{
9b70: 0a 20 20 20 20 20 20 2f 2a 20 41 20 63 6f 70 79  .      /* A copy
9b80: 20 6f 66 20 70 45 78 70 72 20 69 73 20 75 73 65   of pExpr is use
9b90: 64 20 69 6e 73 74 65 61 64 20 6f 66 20 74 68 65  d instead of the
9ba0: 20 6f 72 69 67 69 6e 61 6c 2c 20 61 73 20 70 45   original, as pE
9bb0: 78 70 72 20 63 6f 6e 74 61 69 6e 73 0a 20 20 20  xpr contains.   
9bc0: 20 20 20 2a 2a 20 74 6f 6b 65 6e 73 20 74 68 61     ** tokens tha
9bd0: 74 20 70 6f 69 6e 74 20 74 6f 20 76 6f 6c 61 74  t point to volat
9be0: 69 6c 65 20 6d 65 6d 6f 72 79 2e 20 54 68 65 20  ile memory. The 
9bf0: 27 73 70 61 6e 27 20 6f 66 20 74 68 65 20 65 78  'span' of the ex
9c00: 70 72 65 73 73 69 6f 6e 0a 20 20 20 20 20 20 2a  pression.      *
9c10: 2a 20 69 73 20 72 65 71 75 69 72 65 64 20 62 79  * is required by
9c20: 20 70 72 61 67 6d 61 20 74 61 62 6c 65 5f 69 6e   pragma table_in
9c30: 66 6f 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  fo..      */.   
9c40: 20 20 20 45 78 70 72 20 78 3b 0a 20 20 20 20 20     Expr x;.     
9c50: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
9c60: 74 65 28 64 62 2c 20 70 43 6f 6c 2d 3e 70 44 66  te(db, pCol->pDf
9c70: 6c 74 29 3b 0a 20 20 20 20 20 20 6d 65 6d 73 65  lt);.      memse
9c80: 74 28 26 78 2c 20 30 2c 20 73 69 7a 65 6f 66 28  t(&x, 0, sizeof(
9c90: 78 29 29 3b 0a 20 20 20 20 20 20 78 2e 6f 70 20  x));.      x.op 
9ca0: 3d 20 54 4b 5f 53 50 41 4e 3b 0a 20 20 20 20 20  = TK_SPAN;.     
9cb0: 20 78 2e 75 2e 7a 54 6f 6b 65 6e 20 3d 20 73 71   x.u.zToken = sq
9cc0: 6c 69 74 65 33 44 62 53 74 72 4e 44 75 70 28 64  lite3DbStrNDup(d
9cd0: 62 2c 20 28 63 68 61 72 2a 29 70 53 70 61 6e 2d  b, (char*)pSpan-
9ce0: 3e 7a 53 74 61 72 74 2c 0a 20 20 20 20 20 20 20  >zStart,.       
9cf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9d00: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 69 6e               (in
9d10: 74 29 28 70 53 70 61 6e 2d 3e 7a 45 6e 64 20 2d  t)(pSpan->zEnd -
9d20: 20 70 53 70 61 6e 2d 3e 7a 53 74 61 72 74 29 29   pSpan->zStart))
9d30: 3b 0a 20 20 20 20 20 20 78 2e 70 4c 65 66 74 20  ;.      x.pLeft 
9d40: 3d 20 70 53 70 61 6e 2d 3e 70 45 78 70 72 3b 0a  = pSpan->pExpr;.
9d50: 20 20 20 20 20 20 78 2e 66 6c 61 67 73 20 3d 20        x.flags = 
9d60: 45 50 5f 53 6b 69 70 3b 0a 20 20 20 20 20 20 70  EP_Skip;.      p
9d70: 43 6f 6c 2d 3e 70 44 66 6c 74 20 3d 20 73 71 6c  Col->pDflt = sql
9d80: 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20  ite3ExprDup(db, 
9d90: 26 78 2c 20 45 58 50 52 44 55 50 5f 52 45 44 55  &x, EXPRDUP_REDU
9da0: 43 45 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  CE);.      sqlit
9db0: 65 33 44 62 46 72 65 65 28 64 62 2c 20 78 2e 75  e3DbFree(db, x.u
9dc0: 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 7d 0a  .zToken);.    }.
9dd0: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 78 70    }.  sqlite3Exp
9de0: 72 44 65 6c 65 74 65 28 64 62 2c 20 70 53 70 61  rDelete(db, pSpa
9df0: 6e 2d 3e 70 45 78 70 72 29 3b 0a 7d 0a 0a 2f 2a  n->pExpr);.}../*
9e00: 0a 2a 2a 20 42 61 63 6b 77 61 72 64 73 20 43 6f  .** Backwards Co
9e10: 6d 70 61 74 69 62 69 6c 69 74 79 20 48 61 63 6b  mpatibility Hack
9e20: 3a 0a 2a 2a 20 0a 2a 2a 20 48 69 73 74 6f 72 69  :.** .** Histori
9e30: 63 61 6c 20 76 65 72 73 69 6f 6e 73 20 6f 66 20  cal versions of 
9e40: 53 51 4c 69 74 65 20 61 63 63 65 70 74 65 64 20  SQLite accepted 
9e50: 73 74 72 69 6e 67 73 20 61 73 20 63 6f 6c 75 6d  strings as colum
9e60: 6e 20 6e 61 6d 65 73 20 69 6e 0a 2a 2a 20 69 6e  n names in.** in
9e70: 64 65 78 65 73 20 61 6e 64 20 50 52 49 4d 41 52  dexes and PRIMAR
9e80: 59 20 4b 45 59 20 63 6f 6e 73 74 72 61 69 6e 74  Y KEY constraint
9e90: 73 20 61 6e 64 20 69 6e 20 55 4e 49 51 55 45 20  s and in UNIQUE 
9ea0: 63 6f 6e 73 74 72 61 69 6e 74 73 2e 20 20 45 78  constraints.  Ex
9eb0: 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  ample:.**.**    
9ec0: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 78 79   CREATE TABLE xy
9ed0: 7a 28 61 2c 62 2c 63 2c 64 2c 65 2c 50 52 49 4d  z(a,b,c,d,e,PRIM
9ee0: 41 52 59 20 4b 45 59 28 27 61 27 29 2c 55 4e 49  ARY KEY('a'),UNI
9ef0: 51 55 45 28 27 62 27 2c 27 63 27 20 43 4f 4c 4c  QUE('b','c' COLL
9f00: 41 54 45 20 74 72 69 6d 29 0a 2a 2a 20 20 20 20  ATE trim).**    
9f10: 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 61 62   CREATE INDEX ab
9f20: 63 20 4f 4e 20 78 79 7a 28 27 63 27 2c 27 64 27  c ON xyz('c','d'
9f30: 20 44 45 53 43 2c 27 65 27 20 43 4f 4c 4c 41 54   DESC,'e' COLLAT
9f40: 45 20 6e 6f 63 61 73 65 20 44 45 53 43 29 3b 0a  E nocase DESC);.
9f50: 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 67 6f  **.** This is go
9f60: 6f 66 79 2e 20 20 42 75 74 20 74 6f 20 70 72 65  ofy.  But to pre
9f70: 73 65 72 76 65 20 62 61 63 6b 77 61 72 64 73 20  serve backwards 
9f80: 63 6f 6d 70 61 74 69 62 69 6c 69 74 79 20 77 65  compatibility we
9f90: 20 63 6f 6e 74 69 6e 75 65 20 74 6f 0a 2a 2a 20   continue to.** 
9fa0: 61 63 63 65 70 74 20 69 74 2e 20 20 54 68 69 73  accept it.  This
9fb0: 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 74 68   routine does th
9fc0: 65 20 6e 65 63 65 73 73 61 72 79 20 63 6f 6e 76  e necessary conv
9fd0: 65 72 73 69 6f 6e 2e 20 20 49 74 20 63 6f 6e 76  ersion.  It conv
9fe0: 65 72 74 73 0a 2a 2a 20 74 68 65 20 65 78 70 72  erts.** the expr
9ff0: 65 73 73 69 6f 6e 20 67 69 76 65 6e 20 69 6e 20  ession given in 
a000: 69 74 73 20 61 72 67 75 6d 65 6e 74 20 66 72 6f  its argument fro
a010: 6d 20 61 20 54 4b 5f 53 54 52 49 4e 47 20 69 6e  m a TK_STRING in
a020: 74 6f 20 61 20 54 4b 5f 49 44 0a 2a 2a 20 69 66  to a TK_ID.** if
a030: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
a040: 69 73 20 6a 75 73 74 20 61 20 54 4b 5f 53 54 52  is just a TK_STR
a050: 49 4e 47 20 77 69 74 68 20 61 6e 20 6f 70 74 69  ING with an opti
a060: 6f 6e 61 6c 20 43 4f 4c 4c 41 54 45 20 63 6c 61  onal COLLATE cla
a070: 75 73 65 2e 0a 2a 2a 20 49 66 20 74 68 65 20 65  use..** If the e
a080: 70 78 72 65 73 73 69 6f 6e 20 69 73 20 61 6e 79  pxression is any
a090: 74 68 69 6e 67 20 6f 74 68 65 72 20 74 68 61 6e  thing other than
a0a0: 20 54 4b 5f 53 54 52 49 4e 47 2c 20 74 68 65 20   TK_STRING, the 
a0b0: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 0a 2a 2a  expression is.**
a0c0: 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 73   unchanged..*/.s
a0d0: 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74  tatic void sqlit
a0e0: 65 33 53 74 72 69 6e 67 54 6f 49 64 28 45 78 70  e3StringToId(Exp
a0f0: 72 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e  r *p){.  if( p->
a100: 6f 70 3d 3d 54 4b 5f 53 54 52 49 4e 47 20 29 7b  op==TK_STRING ){
a110: 0a 20 20 20 20 70 2d 3e 6f 70 20 3d 20 54 4b 5f  .    p->op = TK_
a120: 49 44 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  ID;.  }else if( 
a130: 70 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c 41 54  p->op==TK_COLLAT
a140: 45 20 26 26 20 70 2d 3e 70 4c 65 66 74 2d 3e 6f  E && p->pLeft->o
a150: 70 3d 3d 54 4b 5f 53 54 52 49 4e 47 20 29 7b 0a  p==TK_STRING ){.
a160: 20 20 20 20 70 2d 3e 70 4c 65 66 74 2d 3e 6f 70      p->pLeft->op
a170: 20 3d 20 54 4b 5f 49 44 3b 0a 20 20 7d 0a 7d 0a   = TK_ID;.  }.}.
a180: 0a 2f 2a 0a 2a 2a 20 44 65 73 69 67 6e 61 74 65  ./*.** Designate
a190: 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59   the PRIMARY KEY
a1a0: 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 2e 20   for the table. 
a1b0: 20 70 4c 69 73 74 20 69 73 20 61 20 6c 69 73 74   pList is a list
a1c0: 20 6f 66 20 6e 61 6d 65 73 20 0a 2a 2a 20 6f 66   of names .** of
a1d0: 20 63 6f 6c 75 6d 6e 73 20 74 68 61 74 20 66 6f   columns that fo
a1e0: 72 6d 20 74 68 65 20 70 72 69 6d 61 72 79 20 6b  rm the primary k
a1f0: 65 79 2e 20 20 49 66 20 70 4c 69 73 74 20 69 73  ey.  If pList is
a200: 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68 65 0a   NULL, then the.
a210: 2a 2a 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79  ** most recently
a220: 20 61 64 64 65 64 20 63 6f 6c 75 6d 6e 20 6f 66   added column of
a230: 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 74 68   the table is th
a240: 65 20 70 72 69 6d 61 72 79 20 6b 65 79 2e 0a 2a  e primary key..*
a250: 2a 0a 2a 2a 20 41 20 74 61 62 6c 65 20 63 61 6e  *.** A table can
a260: 20 68 61 76 65 20 61 74 20 6d 6f 73 74 20 6f 6e   have at most on
a270: 65 20 70 72 69 6d 61 72 79 20 6b 65 79 2e 20 20  e primary key.  
a280: 49 66 20 74 68 65 20 74 61 62 6c 65 20 61 6c 72  If the table alr
a290: 65 61 64 79 20 68 61 73 0a 2a 2a 20 61 20 70 72  eady has.** a pr
a2a0: 69 6d 61 72 79 20 6b 65 79 20 28 61 6e 64 20 74  imary key (and t
a2b0: 68 69 73 20 69 73 20 74 68 65 20 73 65 63 6f 6e  his is the secon
a2c0: 64 20 70 72 69 6d 61 72 79 20 6b 65 79 29 20 74  d primary key) t
a2d0: 68 65 6e 20 63 72 65 61 74 65 20 61 6e 0a 2a 2a  hen create an.**
a2e0: 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49 66   error..**.** If
a2f0: 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59   the PRIMARY KEY
a300: 20 69 73 20 6f 6e 20 61 20 73 69 6e 67 6c 65 20   is on a single 
a310: 63 6f 6c 75 6d 6e 20 77 68 6f 73 65 20 64 61 74  column whose dat
a320: 61 74 79 70 65 20 69 73 20 49 4e 54 45 47 45 52  atype is INTEGER
a330: 2c 0a 2a 2a 20 74 68 65 6e 20 77 65 20 77 69 6c  ,.** then we wil
a340: 6c 20 74 72 79 20 74 6f 20 75 73 65 20 74 68 61  l try to use tha
a350: 74 20 63 6f 6c 75 6d 6e 20 61 73 20 74 68 65 20  t column as the 
a360: 72 6f 77 69 64 2e 20 20 53 65 74 20 74 68 65 20  rowid.  Set the 
a370: 54 61 62 6c 65 2e 69 50 4b 65 79 0a 2a 2a 20 66  Table.iPKey.** f
a380: 69 65 6c 64 20 6f 66 20 74 68 65 20 74 61 62 6c  ield of the tabl
a390: 65 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63  e under construc
a3a0: 74 69 6f 6e 20 74 6f 20 62 65 20 74 68 65 20 69  tion to be the i
a3b0: 6e 64 65 78 20 6f 66 20 74 68 65 0a 2a 2a 20 49  ndex of the.** I
a3c0: 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b  NTEGER PRIMARY K
a3d0: 45 59 20 63 6f 6c 75 6d 6e 2e 20 20 54 61 62 6c  EY column.  Tabl
a3e0: 65 2e 69 50 4b 65 79 20 69 73 20 73 65 74 20 74  e.iPKey is set t
a3f0: 6f 20 2d 31 20 69 66 20 74 68 65 72 65 20 69 73  o -1 if there is
a400: 0a 2a 2a 20 6e 6f 20 49 4e 54 45 47 45 52 20 50  .** no INTEGER P
a410: 52 49 4d 41 52 59 20 4b 45 59 2e 0a 2a 2a 0a 2a  RIMARY KEY..**.*
a420: 2a 20 49 66 20 74 68 65 20 6b 65 79 20 69 73 20  * If the key is 
a430: 6e 6f 74 20 61 6e 20 49 4e 54 45 47 45 52 20 50  not an INTEGER P
a440: 52 49 4d 41 52 59 20 4b 45 59 2c 20 74 68 65 6e  RIMARY KEY, then
a450: 20 63 72 65 61 74 65 20 61 20 75 6e 69 71 75 65   create a unique
a460: 0a 2a 2a 20 69 6e 64 65 78 20 66 6f 72 20 74 68  .** index for th
a470: 65 20 6b 65 79 2e 20 20 4e 6f 20 69 6e 64 65 78  e key.  No index
a480: 20 69 73 20 63 72 65 61 74 65 64 20 66 6f 72 20   is created for 
a490: 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20  INTEGER PRIMARY 
a4a0: 4b 45 59 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  KEYs..*/.void sq
a4b0: 6c 69 74 65 33 41 64 64 50 72 69 6d 61 72 79 4b  lite3AddPrimaryK
a4c0: 65 79 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ey(.  Parse *pPa
a4d0: 72 73 65 2c 20 20 20 20 2f 2a 20 50 61 72 73 69  rse,    /* Parsi
a4e0: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
a4f0: 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c  ExprList *pList,
a500: 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 66 69 65    /* List of fie
a510: 6c 64 20 6e 61 6d 65 73 20 74 6f 20 62 65 20 69  ld names to be i
a520: 6e 64 65 78 65 64 20 2a 2f 0a 20 20 69 6e 74 20  ndexed */.  int 
a530: 6f 6e 45 72 72 6f 72 2c 20 20 20 20 20 20 2f 2a  onError,      /*
a540: 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69 74 68   What to do with
a550: 20 61 20 75 6e 69 71 75 65 6e 65 73 73 20 63 6f   a uniqueness co
a560: 6e 66 6c 69 63 74 20 2a 2f 0a 20 20 69 6e 74 20  nflict */.  int 
a570: 61 75 74 6f 49 6e 63 2c 20 20 20 20 20 20 2f 2a  autoInc,      /*
a580: 20 54 72 75 65 20 69 66 20 74 68 65 20 41 55 54   True if the AUT
a590: 4f 49 4e 43 52 45 4d 45 4e 54 20 6b 65 79 77 6f  OINCREMENT keywo
a5a0: 72 64 20 69 73 20 70 72 65 73 65 6e 74 20 2a 2f  rd is present */
a5b0: 0a 20 20 69 6e 74 20 73 6f 72 74 4f 72 64 65 72  .  int sortOrder
a5c0: 20 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 53       /* SQLITE_S
a5d0: 4f 5f 41 53 43 20 6f 72 20 53 51 4c 49 54 45 5f  O_ASC or SQLITE_
a5e0: 53 4f 5f 44 45 53 43 20 2a 2f 0a 29 7b 0a 20 20  SO_DESC */.){.  
a5f0: 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 50  Table *pTab = pP
a600: 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b  arse->pNewTable;
a610: 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 20  .  Column *pCol 
a620: 3d 20 30 3b 0a 20 20 69 6e 74 20 69 43 6f 6c 20  = 0;.  int iCol 
a630: 3d 20 2d 31 2c 20 69 3b 0a 20 20 69 6e 74 20 6e  = -1, i;.  int n
a640: 54 65 72 6d 3b 0a 20 20 69 66 28 20 70 54 61 62  Term;.  if( pTab
a650: 3d 3d 30 20 29 20 67 6f 74 6f 20 70 72 69 6d 61  ==0 ) goto prima
a660: 72 79 5f 6b 65 79 5f 65 78 69 74 3b 0a 20 20 69  ry_key_exit;.  i
a670: 66 28 20 70 54 61 62 2d 3e 74 61 62 46 6c 61 67  f( pTab->tabFlag
a680: 73 20 26 20 54 46 5f 48 61 73 50 72 69 6d 61 72  s & TF_HasPrimar
a690: 79 4b 65 79 20 29 7b 0a 20 20 20 20 73 71 6c 69  yKey ){.    sqli
a6a0: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
a6b0: 73 65 2c 20 0a 20 20 20 20 20 20 22 74 61 62 6c  se, .      "tabl
a6c0: 65 20 5c 22 25 73 5c 22 20 68 61 73 20 6d 6f 72  e \"%s\" has mor
a6d0: 65 20 74 68 61 6e 20 6f 6e 65 20 70 72 69 6d 61  e than one prima
a6e0: 72 79 20 6b 65 79 22 2c 20 70 54 61 62 2d 3e 7a  ry key", pTab->z
a6f0: 4e 61 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20  Name);.    goto 
a700: 70 72 69 6d 61 72 79 5f 6b 65 79 5f 65 78 69 74  primary_key_exit
a710: 3b 0a 20 20 7d 0a 20 20 70 54 61 62 2d 3e 74 61  ;.  }.  pTab->ta
a720: 62 46 6c 61 67 73 20 7c 3d 20 54 46 5f 48 61 73  bFlags |= TF_Has
a730: 50 72 69 6d 61 72 79 4b 65 79 3b 0a 20 20 69 66  PrimaryKey;.  if
a740: 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20  ( pList==0 ){.  
a750: 20 20 69 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 6e    iCol = pTab->n
a760: 43 6f 6c 20 2d 20 31 3b 0a 20 20 20 20 70 43 6f  Col - 1;.    pCo
a770: 6c 20 3d 20 26 70 54 61 62 2d 3e 61 43 6f 6c 5b  l = &pTab->aCol[
a780: 69 43 6f 6c 5d 3b 0a 20 20 20 20 70 43 6f 6c 2d  iCol];.    pCol-
a790: 3e 63 6f 6c 46 6c 61 67 73 20 7c 3d 20 43 4f 4c  >colFlags |= COL
a7a0: 46 4c 41 47 5f 50 52 49 4d 4b 45 59 3b 0a 20 20  FLAG_PRIMKEY;.  
a7b0: 20 20 6e 54 65 72 6d 20 3d 20 31 3b 0a 20 20 7d    nTerm = 1;.  }
a7c0: 65 6c 73 65 7b 0a 20 20 20 20 6e 54 65 72 6d 20  else{.    nTerm 
a7d0: 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a  = pList->nExpr;.
a7e0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
a7f0: 54 65 72 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Term; i++){.    
a800: 20 20 45 78 70 72 20 2a 70 43 45 78 70 72 20 3d    Expr *pCExpr =
a810: 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70   sqlite3ExprSkip
a820: 43 6f 6c 6c 61 74 65 28 70 4c 69 73 74 2d 3e 61  Collate(pList->a
a830: 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20  [i].pExpr);.    
a840: 20 20 61 73 73 65 72 74 28 20 70 43 45 78 70 72    assert( pCExpr
a850: 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  !=0 );.      sql
a860: 69 74 65 33 53 74 72 69 6e 67 54 6f 49 64 28 70  ite3StringToId(p
a870: 43 45 78 70 72 29 3b 0a 20 20 20 20 20 20 69 66  CExpr);.      if
a880: 28 20 70 43 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  ( pCExpr->op==TK
a890: 5f 49 44 20 29 7b 0a 20 20 20 20 20 20 20 20 63  _ID ){.        c
a8a0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 4e 61 6d  onst char *zCNam
a8b0: 65 20 3d 20 70 43 45 78 70 72 2d 3e 75 2e 7a 54  e = pCExpr->u.zT
a8c0: 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 20 20 66 6f  oken;.        fo
a8d0: 72 28 69 43 6f 6c 3d 30 3b 20 69 43 6f 6c 3c 70  r(iCol=0; iCol<p
a8e0: 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 43 6f 6c 2b  Tab->nCol; iCol+
a8f0: 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66  +){.          if
a900: 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ( sqlite3StrICmp
a910: 28 7a 43 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 61  (zCName, pTab->a
a920: 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 29  Col[iCol].zName)
a930: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
a940: 20 20 20 70 43 6f 6c 20 3d 20 26 70 54 61 62 2d     pCol = &pTab-
a950: 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 3b 0a 20 20 20  >aCol[iCol];.   
a960: 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 63           pCol->c
a970: 6f 6c 46 6c 61 67 73 20 7c 3d 20 43 4f 4c 46 4c  olFlags |= COLFL
a980: 41 47 5f 50 52 49 4d 4b 45 59 3b 0a 20 20 20 20  AG_PRIMKEY;.    
a990: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
a9a0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
a9b0: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
a9c0: 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 6e 54 65   }.  }.  if( nTe
a9d0: 72 6d 3d 3d 31 0a 20 20 20 26 26 20 70 43 6f 6c  rm==1.   && pCol
a9e0: 0a 20 20 20 26 26 20 73 71 6c 69 74 65 33 53 74  .   && sqlite3St
a9f0: 72 49 43 6d 70 28 73 71 6c 69 74 65 33 43 6f 6c  rICmp(sqlite3Col
aa00: 75 6d 6e 54 79 70 65 28 70 43 6f 6c 2c 22 22 29  umnType(pCol,"")
aa10: 2c 20 22 49 4e 54 45 47 45 52 22 29 3d 3d 30 0a  , "INTEGER")==0.
aa20: 20 20 20 26 26 20 73 6f 72 74 4f 72 64 65 72 21     && sortOrder!
aa30: 3d 53 51 4c 49 54 45 5f 53 4f 5f 44 45 53 43 0a  =SQLITE_SO_DESC.
aa40: 20 20 29 7b 0a 20 20 20 20 70 54 61 62 2d 3e 69    ){.    pTab->i
aa50: 50 4b 65 79 20 3d 20 69 43 6f 6c 3b 0a 20 20 20  PKey = iCol;.   
aa60: 20 70 54 61 62 2d 3e 6b 65 79 43 6f 6e 66 20 3d   pTab->keyConf =
aa70: 20 28 75 38 29 6f 6e 45 72 72 6f 72 3b 0a 20 20   (u8)onError;.  
aa80: 20 20 61 73 73 65 72 74 28 20 61 75 74 6f 49 6e    assert( autoIn
aa90: 63 3d 3d 30 20 7c 7c 20 61 75 74 6f 49 6e 63 3d  c==0 || autoInc=
aaa0: 3d 31 20 29 3b 0a 20 20 20 20 70 54 61 62 2d 3e  =1 );.    pTab->
aab0: 74 61 62 46 6c 61 67 73 20 7c 3d 20 61 75 74 6f  tabFlags |= auto
aac0: 49 6e 63 2a 54 46 5f 41 75 74 6f 69 6e 63 72 65  Inc*TF_Autoincre
aad0: 6d 65 6e 74 3b 0a 20 20 20 20 69 66 28 20 70 4c  ment;.    if( pL
aae0: 69 73 74 20 29 20 70 50 61 72 73 65 2d 3e 69 50  ist ) pParse->iP
aaf0: 6b 53 6f 72 74 4f 72 64 65 72 20 3d 20 70 4c 69  kSortOrder = pLi
ab00: 73 74 2d 3e 61 5b 30 5d 2e 73 6f 72 74 4f 72 64  st->a[0].sortOrd
ab10: 65 72 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  er;.  }else if( 
ab20: 61 75 74 6f 49 6e 63 20 29 7b 0a 23 69 66 6e 64  autoInc ){.#ifnd
ab30: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
ab40: 55 54 4f 49 4e 43 52 45 4d 45 4e 54 0a 20 20 20  UTOINCREMENT.   
ab50: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
ab60: 28 70 50 61 72 73 65 2c 20 22 41 55 54 4f 49 4e  (pParse, "AUTOIN
ab70: 43 52 45 4d 45 4e 54 20 69 73 20 6f 6e 6c 79 20  CREMENT is only 
ab80: 61 6c 6c 6f 77 65 64 20 6f 6e 20 61 6e 20 22 0a  allowed on an ".
ab90: 20 20 20 20 20 20 20 22 49 4e 54 45 47 45 52 20         "INTEGER 
aba0: 50 52 49 4d 41 52 59 20 4b 45 59 22 29 3b 0a 23  PRIMARY KEY");.#
abb0: 65 6e 64 69 66 0a 20 20 7d 65 6c 73 65 7b 0a 20  endif.  }else{. 
abc0: 20 20 20 73 71 6c 69 74 65 33 43 72 65 61 74 65     sqlite3Create
abd0: 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 30 2c  Index(pParse, 0,
abe0: 20 30 2c 20 30 2c 20 70 4c 69 73 74 2c 20 6f 6e   0, 0, pList, on
abf0: 45 72 72 6f 72 2c 20 30 2c 0a 20 20 20 20 20 20  Error, 0,.      
ac00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ac10: 20 20 20 20 20 30 2c 20 73 6f 72 74 4f 72 64 65       0, sortOrde
ac20: 72 2c 20 30 2c 20 53 51 4c 49 54 45 5f 49 44 58  r, 0, SQLITE_IDX
ac30: 54 59 50 45 5f 50 52 49 4d 41 52 59 4b 45 59 29  TYPE_PRIMARYKEY)
ac40: 3b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 30 3b  ;.    pList = 0;
ac50: 0a 20 20 7d 0a 0a 70 72 69 6d 61 72 79 5f 6b 65  .  }..primary_ke
ac60: 79 5f 65 78 69 74 3a 0a 20 20 73 71 6c 69 74 65  y_exit:.  sqlite
ac70: 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
ac80: 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 4c 69 73  pParse->db, pLis
ac90: 74 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a  t);.  return;.}.
aca0: 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77  ./*.** Add a new
acb0: 20 43 48 45 43 4b 20 63 6f 6e 73 74 72 61 69 6e   CHECK constrain
acc0: 74 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 63  t to the table c
acd0: 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63  urrently under c
ace0: 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a  onstruction..*/.
acf0: 76 6f 69 64 20 73 71 6c 69 74 65 33 41 64 64 43  void sqlite3AddC
ad00: 68 65 63 6b 43 6f 6e 73 74 72 61 69 6e 74 28 0a  heckConstraint(.
ad10: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
ad20: 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
ad30: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72  ontext */.  Expr
ad40: 20 2a 70 43 68 65 63 6b 45 78 70 72 20 20 2f 2a   *pCheckExpr  /*
ad50: 20 54 68 65 20 63 68 65 63 6b 20 65 78 70 72 65   The check expre
ad60: 73 73 69 6f 6e 20 2a 2f 0a 29 7b 0a 23 69 66 6e  ssion */.){.#ifn
ad70: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
ad80: 43 48 45 43 4b 0a 20 20 54 61 62 6c 65 20 2a 70  CHECK.  Table *p
ad90: 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e  Tab = pParse->pN
ada0: 65 77 54 61 62 6c 65 3b 0a 20 20 73 71 6c 69 74  ewTable;.  sqlit
adb0: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
adc0: 3e 64 62 3b 0a 20 20 69 66 28 20 70 54 61 62 20  >db;.  if( pTab 
add0: 26 26 20 21 49 4e 5f 44 45 43 4c 41 52 45 5f 56  && !IN_DECLARE_V
ade0: 54 41 42 0a 20 20 20 26 26 20 21 73 71 6c 69 74  TAB.   && !sqlit
adf0: 65 33 42 74 72 65 65 49 73 52 65 61 64 6f 6e 6c  e3BtreeIsReadonl
ae00: 79 28 64 62 2d 3e 61 44 62 5b 64 62 2d 3e 69 6e  y(db->aDb[db->in
ae10: 69 74 2e 69 44 62 5d 2e 70 42 74 29 0a 20 20 29  it.iDb].pBt).  )
ae20: 7b 0a 20 20 20 20 70 54 61 62 2d 3e 70 43 68 65  {.    pTab->pChe
ae30: 63 6b 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ck = sqlite3Expr
ae40: 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61 72 73  ListAppend(pPars
ae50: 65 2c 20 70 54 61 62 2d 3e 70 43 68 65 63 6b 2c  e, pTab->pCheck,
ae60: 20 70 43 68 65 63 6b 45 78 70 72 29 3b 0a 20 20   pCheckExpr);.  
ae70: 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 63 6f    if( pParse->co
ae80: 6e 73 74 72 61 69 6e 74 4e 61 6d 65 2e 6e 20 29  nstraintName.n )
ae90: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
aea0: 78 70 72 4c 69 73 74 53 65 74 4e 61 6d 65 28 70  xprListSetName(p
aeb0: 50 61 72 73 65 2c 20 70 54 61 62 2d 3e 70 43 68  Parse, pTab->pCh
aec0: 65 63 6b 2c 20 26 70 50 61 72 73 65 2d 3e 63 6f  eck, &pParse->co
aed0: 6e 73 74 72 61 69 6e 74 4e 61 6d 65 2c 20 31 29  nstraintName, 1)
aee0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a  ;.    }.  }else.
aef0: 23 65 6e 64 69 66 0a 20 20 7b 0a 20 20 20 20 73  #endif.  {.    s
af00: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
af10: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 43 68  (pParse->db, pCh
af20: 65 63 6b 45 78 70 72 29 3b 0a 20 20 7d 0a 7d 0a  eckExpr);.  }.}.
af30: 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 63  ./*.** Set the c
af40: 6f 6c 6c 61 74 69 6f 6e 20 66 75 6e 63 74 69 6f  ollation functio
af50: 6e 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65  n of the most re
af60: 63 65 6e 74 6c 79 20 70 61 72 73 65 64 20 74 61  cently parsed ta
af70: 62 6c 65 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 74 6f  ble column.** to
af80: 20 74 68 65 20 43 6f 6c 6c 53 65 71 20 67 69 76   the CollSeq giv
af90: 65 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  en..*/.void sqli
afa0: 74 65 33 41 64 64 43 6f 6c 6c 61 74 65 54 79 70  te3AddCollateTyp
afb0: 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
afc0: 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 29 7b   Token *pToken){
afd0: 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 69  .  Table *p;.  i
afe0: 6e 74 20 69 3b 0a 20 20 63 68 61 72 20 2a 7a 43  nt i;.  char *zC
aff0: 6f 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  oll;            
b000: 20 20 2f 2a 20 44 65 71 75 6f 74 65 64 20 6e 61    /* Dequoted na
b010: 6d 65 20 6f 66 20 63 6f 6c 6c 61 74 69 6f 6e 20  me of collation 
b020: 73 65 71 75 65 6e 63 65 20 2a 2f 0a 20 20 73 71  sequence */.  sq
b030: 6c 69 74 65 33 20 2a 64 62 3b 0a 0a 20 20 69 66  lite3 *db;..  if
b040: 28 20 28 70 20 3d 20 70 50 61 72 73 65 2d 3e 70  ( (p = pParse->p
b050: 4e 65 77 54 61 62 6c 65 29 3d 3d 30 20 29 20 72  NewTable)==0 ) r
b060: 65 74 75 72 6e 3b 0a 20 20 69 20 3d 20 70 2d 3e  eturn;.  i = p->
b070: 6e 43 6f 6c 2d 31 3b 0a 20 20 64 62 20 3d 20 70  nCol-1;.  db = p
b080: 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 7a 43 6f  Parse->db;.  zCo
b090: 6c 6c 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65  ll = sqlite3Name
b0a0: 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 54  FromToken(db, pT
b0b0: 6f 6b 65 6e 29 3b 0a 20 20 69 66 28 20 21 7a 43  oken);.  if( !zC
b0c0: 6f 6c 6c 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20  oll ) return;.. 
b0d0: 20 69 66 28 20 73 71 6c 69 74 65 33 4c 6f 63 61   if( sqlite3Loca
b0e0: 74 65 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  teCollSeq(pParse
b0f0: 2c 20 7a 43 6f 6c 6c 29 20 29 7b 0a 20 20 20 20  , zColl) ){.    
b100: 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 20  Index *pIdx;.   
b110: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
b120: 62 2c 20 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 43  b, p->aCol[i].zC
b130: 6f 6c 6c 29 3b 0a 20 20 20 20 70 2d 3e 61 43 6f  oll);.    p->aCo
b140: 6c 5b 69 5d 2e 7a 43 6f 6c 6c 20 3d 20 7a 43 6f  l[i].zColl = zCo
b150: 6c 6c 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66  ll;.  .    /* If
b160: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69 73 20 64   the column is d
b170: 65 63 6c 61 72 65 64 20 61 73 20 22 3c 6e 61 6d  eclared as "<nam
b180: 65 3e 20 50 52 49 4d 41 52 59 20 4b 45 59 20 43  e> PRIMARY KEY C
b190: 4f 4c 4c 41 54 45 20 3c 74 79 70 65 3e 22 2c 0a  OLLATE <type>",.
b1a0: 20 20 20 20 2a 2a 20 74 68 65 6e 20 61 6e 20 69      ** then an i
b1b0: 6e 64 65 78 20 6d 61 79 20 68 61 76 65 20 62 65  ndex may have be
b1c0: 65 6e 20 63 72 65 61 74 65 64 20 6f 6e 20 74 68  en created on th
b1d0: 69 73 20 63 6f 6c 75 6d 6e 20 62 65 66 6f 72 65  is column before
b1e0: 20 74 68 65 0a 20 20 20 20 2a 2a 20 63 6f 6c 6c   the.    ** coll
b1f0: 61 74 69 6f 6e 20 74 79 70 65 20 77 61 73 20 61  ation type was a
b200: 64 64 65 64 2e 20 43 6f 72 72 65 63 74 20 74 68  dded. Correct th
b210: 69 73 20 69 66 20 69 74 20 69 73 20 74 68 65 20  is if it is the 
b220: 63 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  case..    */.   
b230: 20 66 6f 72 28 70 49 64 78 3d 70 2d 3e 70 49 6e   for(pIdx=p->pIn
b240: 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d  dex; pIdx; pIdx=
b250: 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  pIdx->pNext){.  
b260: 20 20 20 20 61 73 73 65 72 74 28 20 70 49 64 78      assert( pIdx
b270: 2d 3e 6e 4b 65 79 43 6f 6c 3d 3d 31 20 29 3b 0a  ->nKeyCol==1 );.
b280: 20 20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e        if( pIdx->
b290: 61 69 43 6f 6c 75 6d 6e 5b 30 5d 3d 3d 69 20 29  aiColumn[0]==i )
b2a0: 7b 0a 20 20 20 20 20 20 20 20 70 49 64 78 2d 3e  {.        pIdx->
b2b0: 61 7a 43 6f 6c 6c 5b 30 5d 20 3d 20 70 2d 3e 61  azColl[0] = p->a
b2c0: 43 6f 6c 5b 69 5d 2e 7a 43 6f 6c 6c 3b 0a 20 20  Col[i].zColl;.  
b2d0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65      }.    }.  }e
b2e0: 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  lse{.    sqlite3
b2f0: 44 62 46 72 65 65 28 64 62 2c 20 7a 43 6f 6c 6c  DbFree(db, zColl
b300: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
b310: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  This function re
b320: 74 75 72 6e 73 20 74 68 65 20 63 6f 6c 6c 61 74  turns the collat
b330: 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 66 6f 72  ion sequence for
b340: 20 64 61 74 61 62 61 73 65 20 6e 61 74 69 76 65   database native
b350: 20 74 65 78 74 0a 2a 2a 20 65 6e 63 6f 64 69 6e   text.** encodin
b360: 67 20 69 64 65 6e 74 69 66 69 65 64 20 62 79 20  g identified by 
b370: 74 68 65 20 73 74 72 69 6e 67 20 7a 4e 61 6d 65  the string zName
b380: 2c 20 6c 65 6e 67 74 68 20 6e 4e 61 6d 65 2e 0a  , length nName..
b390: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 72 65 71  **.** If the req
b3a0: 75 65 73 74 65 64 20 63 6f 6c 6c 61 74 69 6f 6e  uested collation
b3b0: 20 73 65 71 75 65 6e 63 65 20 69 73 20 6e 6f 74   sequence is not
b3c0: 20 61 76 61 69 6c 61 62 6c 65 2c 20 6f 72 20 6e   available, or n
b3d0: 6f 74 20 61 76 61 69 6c 61 62 6c 65 0a 2a 2a 20  ot available.** 
b3e0: 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
b3f0: 6e 61 74 69 76 65 20 65 6e 63 6f 64 69 6e 67 2c  native encoding,
b400: 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 66   the collation f
b410: 61 63 74 6f 72 79 20 69 73 20 69 6e 76 6f 6b 65  actory is invoke
b420: 64 20 74 6f 0a 2a 2a 20 72 65 71 75 65 73 74 20  d to.** request 
b430: 69 74 2e 20 49 66 20 74 68 65 20 63 6f 6c 6c 61  it. If the colla
b440: 74 69 6f 6e 20 66 61 63 74 6f 72 79 20 64 6f 65  tion factory doe
b450: 73 20 6e 6f 74 20 73 75 70 70 6c 79 20 73 75 63  s not supply suc
b460: 68 20 61 20 73 65 71 75 65 6e 63 65 2c 0a 2a 2a  h a sequence,.**
b470: 20 61 6e 64 20 74 68 65 20 73 65 71 75 65 6e 63   and the sequenc
b480: 65 20 69 73 20 61 76 61 69 6c 61 62 6c 65 20 69  e is available i
b490: 6e 20 61 6e 6f 74 68 65 72 20 74 65 78 74 20 65  n another text e
b4a0: 6e 63 6f 64 69 6e 67 2c 20 74 68 65 6e 20 74 68  ncoding, then th
b4b0: 61 74 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65  at is.** returne
b4c0: 64 20 69 6e 73 74 65 61 64 2e 0a 2a 2a 0a 2a 2a  d instead..**.**
b4d0: 20 49 66 20 6e 6f 20 76 65 72 73 69 6f 6e 73 20   If no versions 
b4e0: 6f 66 20 74 68 65 20 72 65 71 75 65 73 74 65 64  of the requested
b4f0: 20 63 6f 6c 6c 61 74 69 6f 6e 73 20 73 65 71 75   collations sequ
b500: 65 6e 63 65 20 61 72 65 20 61 76 61 69 6c 61 62  ence are availab
b510: 6c 65 2c 20 6f 72 0a 2a 2a 20 61 6e 6f 74 68 65  le, or.** anothe
b520: 72 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  r error occurs, 
b530: 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64  NULL is returned
b540: 20 61 6e 64 20 61 6e 20 65 72 72 6f 72 20 6d 65   and an error me
b550: 73 73 61 67 65 20 77 72 69 74 74 65 6e 20 69 6e  ssage written in
b560: 74 6f 0a 2a 2a 20 70 50 61 72 73 65 2e 0a 2a 2a  to.** pParse..**
b570: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
b580: 20 69 73 20 61 20 77 72 61 70 70 65 72 20 61 72   is a wrapper ar
b590: 6f 75 6e 64 20 73 71 6c 69 74 65 33 46 69 6e 64  ound sqlite3Find
b5a0: 43 6f 6c 6c 53 65 71 28 29 2e 20 20 54 68 69 73  CollSeq().  This
b5b0: 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 6e 76 6f   routine.** invo
b5c0: 6b 65 73 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f  kes the collatio
b5d0: 6e 20 66 61 63 74 6f 72 79 20 69 66 20 74 68 65  n factory if the
b5e0: 20 6e 61 6d 65 64 20 63 6f 6c 6c 61 74 69 6f 6e   named collation
b5f0: 20 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64   cannot be found
b600: 0a 2a 2a 20 61 6e 64 20 67 65 6e 65 72 61 74 65  .** and generate
b610: 73 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61  s an error messa
b620: 67 65 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c  ge..**.** See al
b630: 73 6f 3a 20 73 71 6c 69 74 65 33 46 69 6e 64 43  so: sqlite3FindC
b640: 6f 6c 6c 53 65 71 28 29 2c 20 73 71 6c 69 74 65  ollSeq(), sqlite
b650: 33 47 65 74 43 6f 6c 6c 53 65 71 28 29 0a 2a 2f  3GetCollSeq().*/
b660: 0a 43 6f 6c 6c 53 65 71 20 2a 73 71 6c 69 74 65  .CollSeq *sqlite
b670: 33 4c 6f 63 61 74 65 43 6f 6c 6c 53 65 71 28 50  3LocateCollSeq(P
b680: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 63 6f  arse *pParse, co
b690: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29  nst char *zName)
b6a0: 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  {.  sqlite3 *db 
b6b0: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
b6c0: 75 38 20 65 6e 63 20 3d 20 45 4e 43 28 64 62 29  u8 enc = ENC(db)
b6d0: 3b 0a 20 20 75 38 20 69 6e 69 74 62 75 73 79 20  ;.  u8 initbusy 
b6e0: 3d 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3b  = db->init.busy;
b6f0: 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c  .  CollSeq *pCol
b700: 6c 3b 0a 0a 20 20 70 43 6f 6c 6c 20 3d 20 73 71  l;..  pColl = sq
b710: 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71  lite3FindCollSeq
b720: 28 64 62 2c 20 65 6e 63 2c 20 7a 4e 61 6d 65 2c  (db, enc, zName,
b730: 20 69 6e 69 74 62 75 73 79 29 3b 0a 20 20 69 66   initbusy);.  if
b740: 28 20 21 69 6e 69 74 62 75 73 79 20 26 26 20 28  ( !initbusy && (
b750: 21 70 43 6f 6c 6c 20 7c 7c 20 21 70 43 6f 6c 6c  !pColl || !pColl
b760: 2d 3e 78 43 6d 70 29 20 29 7b 0a 20 20 20 20 70  ->xCmp) ){.    p
b770: 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 47 65  Coll = sqlite3Ge
b780: 74 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  tCollSeq(pParse,
b790: 20 65 6e 63 2c 20 70 43 6f 6c 6c 2c 20 7a 4e 61   enc, pColl, zNa
b7a0: 6d 65 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  me);.  }..  retu
b7b0: 72 6e 20 70 43 6f 6c 6c 3b 0a 7d 0a 0a 0a 2f 2a  rn pColl;.}.../*
b7c0: 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
b7d0: 65 20 74 68 61 74 20 77 69 6c 6c 20 69 6e 63 72  e that will incr
b7e0: 65 6d 65 6e 74 20 74 68 65 20 73 63 68 65 6d 61  ement the schema
b7f0: 20 63 6f 6f 6b 69 65 2e 0a 2a 2a 0a 2a 2a 20 54   cookie..**.** T
b800: 68 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65  he schema cookie
b810: 20 69 73 20 75 73 65 64 20 74 6f 20 64 65 74 65   is used to dete
b820: 72 6d 69 6e 65 20 77 68 65 6e 20 74 68 65 20 73  rmine when the s
b830: 63 68 65 6d 61 20 66 6f 72 20 74 68 65 0a 2a 2a  chema for the.**
b840: 20 64 61 74 61 62 61 73 65 20 63 68 61 6e 67 65   database change
b850: 73 2e 20 20 41 66 74 65 72 20 65 61 63 68 20 73  s.  After each s
b860: 63 68 65 6d 61 20 63 68 61 6e 67 65 2c 20 74 68  chema change, th
b870: 65 20 63 6f 6f 6b 69 65 20 76 61 6c 75 65 0a 2a  e cookie value.*
b880: 2a 20 63 68 61 6e 67 65 73 2e 20 20 57 68 65 6e  * changes.  When
b890: 20 61 20 70 72 6f 63 65 73 73 20 66 69 72 73 74   a process first
b8a0: 20 72 65 61 64 73 20 74 68 65 20 73 63 68 65 6d   reads the schem
b8b0: 61 20 69 74 20 72 65 63 6f 72 64 73 20 74 68 65  a it records the
b8c0: 0a 2a 2a 20 63 6f 6f 6b 69 65 2e 20 20 54 68 65  .** cookie.  The
b8d0: 72 65 61 66 74 65 72 2c 20 77 68 65 6e 65 76 65  reafter, wheneve
b8e0: 72 20 69 74 20 67 6f 65 73 20 74 6f 20 61 63 63  r it goes to acc
b8f0: 65 73 73 20 74 68 65 20 64 61 74 61 62 61 73 65  ess the database
b900: 2c 0a 2a 2a 20 69 74 20 63 68 65 63 6b 73 20 74  ,.** it checks t
b910: 68 65 20 63 6f 6f 6b 69 65 20 74 6f 20 6d 61 6b  he cookie to mak
b920: 65 20 73 75 72 65 20 74 68 65 20 73 63 68 65 6d  e sure the schem
b930: 61 20 68 61 73 20 6e 6f 74 20 63 68 61 6e 67 65  a has not change
b940: 64 0a 2a 2a 20 73 69 6e 63 65 20 69 74 20 77 61  d.** since it wa
b950: 73 20 6c 61 73 74 20 72 65 61 64 2e 0a 2a 2a 0a  s last read..**.
b960: 2a 2a 20 54 68 69 73 20 70 6c 61 6e 20 69 73 20  ** This plan is 
b970: 6e 6f 74 20 63 6f 6d 70 6c 65 74 65 6c 79 20 62  not completely b
b980: 75 6c 6c 65 74 2d 70 72 6f 6f 66 2e 20 20 49 74  ullet-proof.  It
b990: 20 69 73 20 70 6f 73 73 69 62 6c 65 20 66 6f 72   is possible for
b9a0: 0a 2a 2a 20 74 68 65 20 73 63 68 65 6d 61 20 74  .** the schema t
b9b0: 6f 20 63 68 61 6e 67 65 20 6d 75 6c 74 69 70 6c  o change multipl
b9c0: 65 20 74 69 6d 65 73 20 61 6e 64 20 66 6f 72 20  e times and for 
b9d0: 74 68 65 20 63 6f 6f 6b 69 65 20 74 6f 20 62 65  the cookie to be
b9e0: 0a 2a 2a 20 73 65 74 20 62 61 63 6b 20 74 6f 20  .** set back to 
b9f0: 70 72 69 6f 72 20 76 61 6c 75 65 2e 20 20 42 75  prior value.  Bu
ba00: 74 20 73 63 68 65 6d 61 20 63 68 61 6e 67 65 73  t schema changes
ba10: 20 61 72 65 20 69 6e 66 72 65 71 75 65 6e 74 0a   are infrequent.
ba20: 2a 2a 20 61 6e 64 20 74 68 65 20 70 72 6f 62 61  ** and the proba
ba30: 62 69 6c 69 74 79 20 6f 66 20 68 69 74 74 69 6e  bility of hittin
ba40: 67 20 74 68 65 20 73 61 6d 65 20 63 6f 6f 6b 69  g the same cooki
ba50: 65 20 76 61 6c 75 65 20 69 73 20 6f 6e 6c 79 0a  e value is only.
ba60: 2a 2a 20 31 20 63 68 61 6e 63 65 20 69 6e 20 32  ** 1 chance in 2
ba70: 5e 33 32 2e 20 20 53 6f 20 77 65 27 72 65 20 73  ^32.  So we're s
ba80: 61 66 65 20 65 6e 6f 75 67 68 2e 0a 2a 2f 0a 76  afe enough..*/.v
ba90: 6f 69 64 20 73 71 6c 69 74 65 33 43 68 61 6e 67  oid sqlite3Chang
baa0: 65 43 6f 6f 6b 69 65 28 50 61 72 73 65 20 2a 70  eCookie(Parse *p
bab0: 50 61 72 73 65 2c 20 69 6e 74 20 69 44 62 29 7b  Parse, int iDb){
bac0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
bad0: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 56   pParse->db;.  V
bae0: 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
baf0: 3e 70 56 64 62 65 3b 0a 20 20 61 73 73 65 72 74  >pVdbe;.  assert
bb00: 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d  ( sqlite3SchemaM
bb10: 75 74 65 78 48 65 6c 64 28 64 62 2c 20 69 44 62  utexHeld(db, iDb
bb20: 2c 20 30 29 20 29 3b 0a 20 20 73 71 6c 69 74 65  , 0) );.  sqlite
bb30: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
bb40: 50 5f 53 65 74 43 6f 6f 6b 69 65 2c 20 69 44 62  P_SetCookie, iDb
bb50: 2c 20 42 54 52 45 45 5f 53 43 48 45 4d 41 5f 56  , BTREE_SCHEMA_V
bb60: 45 52 53 49 4f 4e 2c 20 0a 20 20 20 20 20 20 20  ERSION, .       
bb70: 20 20 20 20 20 20 20 20 20 20 20 20 20 64 62 2d               db-
bb80: 3e 61 44 62 5b 69 44 62 5d 2e 70 53 63 68 65 6d  >aDb[iDb].pSchem
bb90: 61 2d 3e 73 63 68 65 6d 61 5f 63 6f 6f 6b 69 65  a->schema_cookie
bba0: 2b 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 65  +1);.}../*.** Me
bbb0: 61 73 75 72 65 20 74 68 65 20 6e 75 6d 62 65 72  asure the number
bbc0: 20 6f 66 20 63 68 61 72 61 63 74 65 72 73 20 6e   of characters n
bbd0: 65 65 64 65 64 20 74 6f 20 6f 75 74 70 75 74 20  eeded to output 
bbe0: 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20 69 64 65  the given.** ide
bbf0: 6e 74 69 66 69 65 72 2e 20 20 54 68 65 20 6e 75  ntifier.  The nu
bc00: 6d 62 65 72 20 72 65 74 75 72 6e 65 64 20 69 6e  mber returned in
bc10: 63 6c 75 64 65 73 20 61 6e 79 20 71 75 6f 74 65  cludes any quote
bc20: 73 20 75 73 65 64 0a 2a 2a 20 62 75 74 20 64 6f  s used.** but do
bc30: 65 73 20 6e 6f 74 20 69 6e 63 6c 75 64 65 20 74  es not include t
bc40: 68 65 20 6e 75 6c 6c 20 74 65 72 6d 69 6e 61 74  he null terminat
bc50: 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 65 73  or..**.** The es
bc60: 74 69 6d 61 74 65 20 69 73 20 63 6f 6e 73 65 72  timate is conser
bc70: 76 61 74 69 76 65 2e 20 20 49 74 20 6d 69 67 68  vative.  It migh
bc80: 74 20 62 65 20 6c 61 72 67 65 72 20 74 68 61 74  t be larger that
bc90: 20 77 68 61 74 20 69 73 0a 2a 2a 20 72 65 61 6c   what is.** real
bca0: 6c 79 20 6e 65 65 64 65 64 2e 0a 2a 2f 0a 73 74  ly needed..*/.st
bcb0: 61 74 69 63 20 69 6e 74 20 69 64 65 6e 74 4c 65  atic int identLe
bcc0: 6e 67 74 68 28 63 6f 6e 73 74 20 63 68 61 72 20  ngth(const char 
bcd0: 2a 7a 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20  *z){.  int n;.  
bce0: 66 6f 72 28 6e 3d 30 3b 20 2a 7a 3b 20 6e 2b 2b  for(n=0; *z; n++
bcf0: 2c 20 7a 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  , z++){.    if( 
bd00: 2a 7a 3d 3d 27 22 27 20 29 7b 20 6e 2b 2b 3b 20  *z=='"' ){ n++; 
bd10: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e  }.  }.  return n
bd20: 20 2b 20 32 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54   + 2;.}../*.** T
bd30: 68 65 20 66 69 72 73 74 20 70 61 72 61 6d 65 74  he first paramet
bd40: 65 72 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20  er is a pointer 
bd50: 74 6f 20 61 6e 20 6f 75 74 70 75 74 20 62 75 66  to an output buf
bd60: 66 65 72 2e 20 54 68 65 20 73 65 63 6f 6e 64 20  fer. The second 
bd70: 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 69 73  .** parameter is
bd80: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e   a pointer to an
bd90: 20 69 6e 74 65 67 65 72 20 74 68 61 74 20 63 6f   integer that co
bda0: 6e 74 61 69 6e 73 20 74 68 65 20 6f 66 66 73 65  ntains the offse
bdb0: 74 20 61 74 0a 2a 2a 20 77 68 69 63 68 20 74 6f  t at.** which to
bdc0: 20 77 72 69 74 65 20 69 6e 74 6f 20 74 68 65 20   write into the 
bdd0: 6f 75 74 70 75 74 20 62 75 66 66 65 72 2e 20 54  output buffer. T
bde0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 6f 70  his function cop
bdf0: 69 65 73 20 74 68 65 0a 2a 2a 20 6e 75 6c 2d 74  ies the.** nul-t
be00: 65 72 6d 69 6e 61 74 65 64 20 73 74 72 69 6e 67  erminated string
be10: 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 74   pointed to by t
be20: 68 65 20 74 68 69 72 64 20 70 61 72 61 6d 65 74  he third paramet
be30: 65 72 2c 20 7a 53 69 67 6e 65 64 49 64 65 6e 74  er, zSignedIdent
be40: 2c 0a 2a 2a 20 74 6f 20 74 68 65 20 73 70 65 63  ,.** to the spec
be50: 69 66 69 65 64 20 6f 66 66 73 65 74 20 69 6e 20  ified offset in 
be60: 74 68 65 20 62 75 66 66 65 72 20 61 6e 64 20 75  the buffer and u
be70: 70 64 61 74 65 73 20 2a 70 49 64 78 20 74 6f 20  pdates *pIdx to 
be80: 72 65 66 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20  refer.** to the 
be90: 66 69 72 73 74 20 62 79 74 65 20 61 66 74 65 72  first byte after
bea0: 20 74 68 65 20 6c 61 73 74 20 62 79 74 65 20 77   the last byte w
beb0: 72 69 74 74 65 6e 20 62 65 66 6f 72 65 20 72 65  ritten before re
bec0: 74 75 72 6e 69 6e 67 2e 0a 2a 2a 20 0a 2a 2a 20  turning..** .** 
bed0: 49 66 20 74 68 65 20 73 74 72 69 6e 67 20 7a 53  If the string zS
bee0: 69 67 6e 65 64 49 64 65 6e 74 20 63 6f 6e 73 69  ignedIdent consi
bef0: 73 74 73 20 65 6e 74 69 72 65 6c 79 20 6f 66 20  sts entirely of 
bf00: 61 6c 70 68 61 2d 6e 75 6d 65 72 69 63 0a 2a 2a  alpha-numeric.**
bf10: 20 63 68 61 72 61 63 74 65 72 73 2c 20 64 6f 65   characters, doe
bf20: 73 20 6e 6f 74 20 62 65 67 69 6e 20 77 69 74 68  s not begin with
bf30: 20 61 20 64 69 67 69 74 20 61 6e 64 20 69 73 20   a digit and is 
bf40: 6e 6f 74 20 61 6e 20 53 51 4c 20 6b 65 79 77 6f  not an SQL keywo
bf50: 72 64 2c 0a 2a 2a 20 74 68 65 6e 20 69 74 20 69  rd,.** then it i
bf60: 73 20 63 6f 70 69 65 64 20 74 6f 20 74 68 65 20  s copied to the 
bf70: 6f 75 74 70 75 74 20 62 75 66 66 65 72 20 65 78  output buffer ex
bf80: 61 63 74 6c 79 20 61 73 20 69 74 20 69 73 2e 20  actly as it is. 
bf90: 4f 74 68 65 72 77 69 73 65 2c 0a 2a 2a 20 69 74  Otherwise,.** it
bfa0: 20 69 73 20 71 75 6f 74 65 64 20 75 73 69 6e 67   is quoted using
bfb0: 20 64 6f 75 62 6c 65 2d 71 75 6f 74 65 73 2e 0a   double-quotes..
bfc0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 69  */.static void i
bfd0: 64 65 6e 74 50 75 74 28 63 68 61 72 20 2a 7a 2c  dentPut(char *z,
bfe0: 20 69 6e 74 20 2a 70 49 64 78 2c 20 63 68 61 72   int *pIdx, char
bff0: 20 2a 7a 53 69 67 6e 65 64 49 64 65 6e 74 29 7b   *zSignedIdent){
c000: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
c010: 20 2a 7a 49 64 65 6e 74 20 3d 20 28 75 6e 73 69   *zIdent = (unsi
c020: 67 6e 65 64 20 63 68 61 72 2a 29 7a 53 69 67 6e  gned char*)zSign
c030: 65 64 49 64 65 6e 74 3b 0a 20 20 69 6e 74 20 69  edIdent;.  int i
c040: 2c 20 6a 2c 20 6e 65 65 64 51 75 6f 74 65 3b 0a  , j, needQuote;.
c050: 20 20 69 20 3d 20 2a 70 49 64 78 3b 0a 0a 20 20    i = *pIdx;..  
c060: 66 6f 72 28 6a 3d 30 3b 20 7a 49 64 65 6e 74 5b  for(j=0; zIdent[
c070: 6a 5d 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 69 66  j]; j++){.    if
c080: 28 20 21 73 71 6c 69 74 65 33 49 73 61 6c 6e 75  ( !sqlite3Isalnu
c090: 6d 28 7a 49 64 65 6e 74 5b 6a 5d 29 20 26 26 20  m(zIdent[j]) && 
c0a0: 7a 49 64 65 6e 74 5b 6a 5d 21 3d 27 5f 27 20 29  zIdent[j]!='_' )
c0b0: 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 6e 65   break;.  }.  ne
c0c0: 65 64 51 75 6f 74 65 20 3d 20 73 71 6c 69 74 65  edQuote = sqlite
c0d0: 33 49 73 64 69 67 69 74 28 7a 49 64 65 6e 74 5b  3Isdigit(zIdent[
c0e0: 30 5d 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  0]).            
c0f0: 7c 7c 20 73 71 6c 69 74 65 33 4b 65 79 77 6f 72  || sqlite3Keywor
c100: 64 43 6f 64 65 28 7a 49 64 65 6e 74 2c 20 6a 29  dCode(zIdent, j)
c110: 21 3d 54 4b 5f 49 44 0a 20 20 20 20 20 20 20 20  !=TK_ID.        
c120: 20 20 20 20 7c 7c 20 7a 49 64 65 6e 74 5b 6a 5d      || zIdent[j]
c130: 21 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 20  !=0.            
c140: 7c 7c 20 6a 3d 3d 30 3b 0a 0a 20 20 69 66 28 20  || j==0;..  if( 
c150: 6e 65 65 64 51 75 6f 74 65 20 29 20 7a 5b 69 2b  needQuote ) z[i+
c160: 2b 5d 20 3d 20 27 22 27 3b 0a 20 20 66 6f 72 28  +] = '"';.  for(
c170: 6a 3d 30 3b 20 7a 49 64 65 6e 74 5b 6a 5d 3b 20  j=0; zIdent[j]; 
c180: 6a 2b 2b 29 7b 0a 20 20 20 20 7a 5b 69 2b 2b 5d  j++){.    z[i++]
c190: 20 3d 20 7a 49 64 65 6e 74 5b 6a 5d 3b 0a 20 20   = zIdent[j];.  
c1a0: 20 20 69 66 28 20 7a 49 64 65 6e 74 5b 6a 5d 3d    if( zIdent[j]=
c1b0: 3d 27 22 27 20 29 20 7a 5b 69 2b 2b 5d 20 3d 20  ='"' ) z[i++] = 
c1c0: 27 22 27 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e  '"';.  }.  if( n
c1d0: 65 65 64 51 75 6f 74 65 20 29 20 7a 5b 69 2b 2b  eedQuote ) z[i++
c1e0: 5d 20 3d 20 27 22 27 3b 0a 20 20 7a 5b 69 5d 20  ] = '"';.  z[i] 
c1f0: 3d 20 30 3b 0a 20 20 2a 70 49 64 78 20 3d 20 69  = 0;.  *pIdx = i
c200: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  ;.}../*.** Gener
c210: 61 74 65 20 61 20 43 52 45 41 54 45 20 54 41 42  ate a CREATE TAB
c220: 4c 45 20 73 74 61 74 65 6d 65 6e 74 20 61 70 70  LE statement app
c230: 72 6f 70 72 69 61 74 65 20 66 6f 72 20 74 68 65  ropriate for the
c240: 20 67 69 76 65 6e 0a 2a 2a 20 74 61 62 6c 65 2e   given.** table.
c250: 20 20 4d 65 6d 6f 72 79 20 74 6f 20 68 6f 6c 64    Memory to hold
c260: 20 74 68 65 20 74 65 78 74 20 6f 66 20 74 68 65   the text of the
c270: 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 6f 62   statement is ob
c280: 74 61 69 6e 65 64 0a 2a 2a 20 66 72 6f 6d 20 73  tained.** from s
c290: 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 20 61 6e  qliteMalloc() an
c2a0: 64 20 6d 75 73 74 20 62 65 20 66 72 65 65 64 20  d must be freed 
c2b0: 62 79 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 66  by the calling f
c2c0: 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  unction..*/.stat
c2d0: 69 63 20 63 68 61 72 20 2a 63 72 65 61 74 65 54  ic char *createT
c2e0: 61 62 6c 65 53 74 6d 74 28 73 71 6c 69 74 65 33  ableStmt(sqlite3
c2f0: 20 2a 64 62 2c 20 54 61 62 6c 65 20 2a 70 29 7b   *db, Table *p){
c300: 0a 20 20 69 6e 74 20 69 2c 20 6b 2c 20 6e 3b 0a  .  int i, k, n;.
c310: 20 20 63 68 61 72 20 2a 7a 53 74 6d 74 3b 0a 20    char *zStmt;. 
c320: 20 63 68 61 72 20 2a 7a 53 65 70 2c 20 2a 7a 53   char *zSep, *zS
c330: 65 70 32 2c 20 2a 7a 45 6e 64 3b 0a 20 20 43 6f  ep2, *zEnd;.  Co
c340: 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 6e 20  lumn *pCol;.  n 
c350: 3d 20 30 3b 0a 20 20 66 6f 72 28 70 43 6f 6c 20  = 0;.  for(pCol 
c360: 3d 20 70 2d 3e 61 43 6f 6c 2c 20 69 3d 30 3b 20  = p->aCol, i=0; 
c370: 69 3c 70 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c 20  i<p->nCol; i++, 
c380: 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 6e 20 2b  pCol++){.    n +
c390: 3d 20 69 64 65 6e 74 4c 65 6e 67 74 68 28 70 43  = identLength(pC
c3a0: 6f 6c 2d 3e 7a 4e 61 6d 65 29 20 2b 20 35 3b 0a  ol->zName) + 5;.
c3b0: 20 20 7d 0a 20 20 6e 20 2b 3d 20 69 64 65 6e 74    }.  n += ident
c3c0: 4c 65 6e 67 74 68 28 70 2d 3e 7a 4e 61 6d 65 29  Length(p->zName)
c3d0: 3b 0a 20 20 69 66 28 20 6e 3c 35 30 20 29 7b 20  ;.  if( n<50 ){ 
c3e0: 0a 20 20 20 20 7a 53 65 70 20 3d 20 22 22 3b 0a  .    zSep = "";.
c3f0: 20 20 20 20 7a 53 65 70 32 20 3d 20 22 2c 22 3b      zSep2 = ",";
c400: 0a 20 20 20 20 7a 45 6e 64 20 3d 20 22 29 22 3b  .    zEnd = ")";
c410: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 53  .  }else{.    zS
c420: 65 70 20 3d 20 22 5c 6e 20 20 22 3b 0a 20 20 20  ep = "\n  ";.   
c430: 20 7a 53 65 70 32 20 3d 20 22 2c 5c 6e 20 20 22   zSep2 = ",\n  "
c440: 3b 0a 20 20 20 20 7a 45 6e 64 20 3d 20 22 5c 6e  ;.    zEnd = "\n
c450: 29 22 3b 0a 20 20 7d 0a 20 20 6e 20 2b 3d 20 33  )";.  }.  n += 3
c460: 35 20 2b 20 36 2a 70 2d 3e 6e 43 6f 6c 3b 0a 20  5 + 6*p->nCol;. 
c470: 20 7a 53 74 6d 74 20 3d 20 73 71 6c 69 74 65 33   zStmt = sqlite3
c480: 44 62 4d 61 6c 6c 6f 63 52 61 77 28 30 2c 20 6e  DbMallocRaw(0, n
c490: 29 3b 0a 20 20 69 66 28 20 7a 53 74 6d 74 3d 3d  );.  if( zStmt==
c4a0: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
c4b0: 4f 6f 6d 46 61 75 6c 74 28 64 62 29 3b 0a 20 20  OomFault(db);.  
c4c0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
c4d0: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
c4e0: 74 66 28 6e 2c 20 7a 53 74 6d 74 2c 20 22 43 52  tf(n, zStmt, "CR
c4f0: 45 41 54 45 20 54 41 42 4c 45 20 22 29 3b 0a 20  EATE TABLE ");. 
c500: 20 6b 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c   k = sqlite3Strl
c510: 65 6e 33 30 28 7a 53 74 6d 74 29 3b 0a 20 20 69  en30(zStmt);.  i
c520: 64 65 6e 74 50 75 74 28 7a 53 74 6d 74 2c 20 26  dentPut(zStmt, &
c530: 6b 2c 20 70 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  k, p->zName);.  
c540: 7a 53 74 6d 74 5b 6b 2b 2b 5d 20 3d 20 27 28 27  zStmt[k++] = '('
c550: 3b 0a 20 20 66 6f 72 28 70 43 6f 6c 3d 70 2d 3e  ;.  for(pCol=p->
c560: 61 43 6f 6c 2c 20 69 3d 30 3b 20 69 3c 70 2d 3e  aCol, i=0; i<p->
c570: 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b  nCol; i++, pCol+
c580: 2b 29 7b 0a 20 20 20 20 73 74 61 74 69 63 20 63  +){.    static c
c590: 6f 6e 73 74 20 63 68 61 72 20 2a 20 63 6f 6e 73  onst char * cons
c5a0: 74 20 61 7a 54 79 70 65 5b 5d 20 3d 20 7b 0a 20  t azType[] = {. 
c5b0: 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 49 54 45         /* SQLITE
c5c0: 5f 41 46 46 5f 42 4c 4f 42 20 20 20 20 2a 2f 20  _AFF_BLOB    */ 
c5d0: 22 22 2c 0a 20 20 20 20 20 20 20 20 2f 2a 20 53  "",.        /* S
c5e0: 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 20 20  QLITE_AFF_TEXT  
c5f0: 20 20 2a 2f 20 22 20 54 45 58 54 22 2c 0a 20 20    */ " TEXT",.  
c600: 20 20 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f        /* SQLITE_
c610: 41 46 46 5f 4e 55 4d 45 52 49 43 20 2a 2f 20 22  AFF_NUMERIC */ "
c620: 20 4e 55 4d 22 2c 0a 20 20 20 20 20 20 20 20 2f   NUM",.        /
c630: 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54  * SQLITE_AFF_INT
c640: 45 47 45 52 20 2a 2f 20 22 20 49 4e 54 22 2c 0a  EGER */ " INT",.
c650: 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 49 54          /* SQLIT
c660: 45 5f 41 46 46 5f 52 45 41 4c 20 20 20 20 2a 2f  E_AFF_REAL    */
c670: 20 22 20 52 45 41 4c 22 0a 20 20 20 20 7d 3b 0a   " REAL".    };.
c680: 20 20 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20      int len;.   
c690: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 79   const char *zTy
c6a0: 70 65 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65 33  pe;..    sqlite3
c6b0: 5f 73 6e 70 72 69 6e 74 66 28 6e 2d 6b 2c 20 26  _snprintf(n-k, &
c6c0: 7a 53 74 6d 74 5b 6b 5d 2c 20 7a 53 65 70 29 3b  zStmt[k], zSep);
c6d0: 0a 20 20 20 20 6b 20 2b 3d 20 73 71 6c 69 74 65  .    k += sqlite
c6e0: 33 53 74 72 6c 65 6e 33 30 28 26 7a 53 74 6d 74  3Strlen30(&zStmt
c6f0: 5b 6b 5d 29 3b 0a 20 20 20 20 7a 53 65 70 20 3d  [k]);.    zSep =
c700: 20 7a 53 65 70 32 3b 0a 20 20 20 20 69 64 65 6e   zSep2;.    iden
c710: 74 50 75 74 28 7a 53 74 6d 74 2c 20 26 6b 2c 20  tPut(zStmt, &k, 
c720: 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pCol->zName);.  
c730: 20 20 61 73 73 65 72 74 28 20 70 43 6f 6c 2d 3e    assert( pCol->
c740: 61 66 66 69 6e 69 74 79 2d 53 51 4c 49 54 45 5f  affinity-SQLITE_
c750: 41 46 46 5f 42 4c 4f 42 20 3e 3d 20 30 20 29 3b  AFF_BLOB >= 0 );
c760: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43 6f  .    assert( pCo
c770: 6c 2d 3e 61 66 66 69 6e 69 74 79 2d 53 51 4c 49  l->affinity-SQLI
c780: 54 45 5f 41 46 46 5f 42 4c 4f 42 20 3c 20 41 72  TE_AFF_BLOB < Ar
c790: 72 61 79 53 69 7a 65 28 61 7a 54 79 70 65 29 20  raySize(azType) 
c7a0: 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
c7b0: 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 3d   pCol->affinity=
c7c0: 3d 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42  =SQLITE_AFF_BLOB
c7d0: 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
c7e0: 28 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79  ( pCol->affinity
c7f0: 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58  ==SQLITE_AFF_TEX
c800: 54 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  T );.    testcas
c810: 65 28 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74  e( pCol->affinit
c820: 79 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55  y==SQLITE_AFF_NU
c830: 4d 45 52 49 43 20 29 3b 0a 20 20 20 20 74 65 73  MERIC );.    tes
c840: 74 63 61 73 65 28 20 70 43 6f 6c 2d 3e 61 66 66  tcase( pCol->aff
c850: 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41 46  inity==SQLITE_AF
c860: 46 5f 49 4e 54 45 47 45 52 20 29 3b 0a 20 20 20  F_INTEGER );.   
c870: 20 74 65 73 74 63 61 73 65 28 20 70 43 6f 6c 2d   testcase( pCol-
c880: 3e 61 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54  >affinity==SQLIT
c890: 45 5f 41 46 46 5f 52 45 41 4c 20 29 3b 0a 20 20  E_AFF_REAL );.  
c8a0: 20 20 0a 20 20 20 20 7a 54 79 70 65 20 3d 20 61    .    zType = a
c8b0: 7a 54 79 70 65 5b 70 43 6f 6c 2d 3e 61 66 66 69  zType[pCol->affi
c8c0: 6e 69 74 79 20 2d 20 53 51 4c 49 54 45 5f 41 46  nity - SQLITE_AF
c8d0: 46 5f 42 4c 4f 42 5d 3b 0a 20 20 20 20 6c 65 6e  F_BLOB];.    len
c8e0: 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
c8f0: 33 30 28 7a 54 79 70 65 29 3b 0a 20 20 20 20 61  30(zType);.    a
c900: 73 73 65 72 74 28 20 70 43 6f 6c 2d 3e 61 66 66  ssert( pCol->aff
c910: 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41 46  inity==SQLITE_AF
c920: 46 5f 42 4c 4f 42 20 0a 20 20 20 20 20 20 20 20  F_BLOB .        
c930: 20 20 20 20 7c 7c 20 70 43 6f 6c 2d 3e 61 66 66      || pCol->aff
c940: 69 6e 69 74 79 3d 3d 73 71 6c 69 74 65 33 41 66  inity==sqlite3Af
c950: 66 69 6e 69 74 79 54 79 70 65 28 7a 54 79 70 65  finityType(zType
c960: 2c 20 30 29 20 29 3b 0a 20 20 20 20 6d 65 6d 63  , 0) );.    memc
c970: 70 79 28 26 7a 53 74 6d 74 5b 6b 5d 2c 20 7a 54  py(&zStmt[k], zT
c980: 79 70 65 2c 20 6c 65 6e 29 3b 0a 20 20 20 20 6b  ype, len);.    k
c990: 20 2b 3d 20 6c 65 6e 3b 0a 20 20 20 20 61 73 73   += len;.    ass
c9a0: 65 72 74 28 20 6b 3c 3d 6e 20 29 3b 0a 20 20 7d  ert( k<=n );.  }
c9b0: 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69  .  sqlite3_snpri
c9c0: 6e 74 66 28 6e 2d 6b 2c 20 26 7a 53 74 6d 74 5b  ntf(n-k, &zStmt[
c9d0: 6b 5d 2c 20 22 25 73 22 2c 20 7a 45 6e 64 29 3b  k], "%s", zEnd);
c9e0: 0a 20 20 72 65 74 75 72 6e 20 7a 53 74 6d 74 3b  .  return zStmt;
c9f0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 69 7a 65  .}../*.** Resize
ca00: 20 61 6e 20 49 6e 64 65 78 20 6f 62 6a 65 63 74   an Index object
ca10: 20 74 6f 20 68 6f 6c 64 20 4e 20 63 6f 6c 75 6d   to hold N colum
ca20: 6e 73 20 74 6f 74 61 6c 2e 20 20 52 65 74 75 72  ns total.  Retur
ca30: 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f  n SQLITE_OK.** o
ca40: 6e 20 73 75 63 63 65 73 73 20 61 6e 64 20 53 51  n success and SQ
ca50: 4c 49 54 45 5f 4e 4f 4d 45 4d 20 6f 6e 20 61 6e  LITE_NOMEM on an
ca60: 20 4f 4f 4d 20 65 72 72 6f 72 2e 0a 2a 2f 0a 73   OOM error..*/.s
ca70: 74 61 74 69 63 20 69 6e 74 20 72 65 73 69 7a 65  tatic int resize
ca80: 49 6e 64 65 78 4f 62 6a 65 63 74 28 73 71 6c 69  IndexObject(sqli
ca90: 74 65 33 20 2a 64 62 2c 20 49 6e 64 65 78 20 2a  te3 *db, Index *
caa0: 70 49 64 78 2c 20 69 6e 74 20 4e 29 7b 0a 20 20  pIdx, int N){.  
cab0: 63 68 61 72 20 2a 7a 45 78 74 72 61 3b 0a 20 20  char *zExtra;.  
cac0: 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20 69 66 28  int nByte;.  if(
cad0: 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3e 3d   pIdx->nColumn>=
cae0: 4e 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  N ) return SQLIT
caf0: 45 5f 4f 4b 3b 0a 20 20 61 73 73 65 72 74 28 20  E_OK;.  assert( 
cb00: 70 49 64 78 2d 3e 69 73 52 65 73 69 7a 65 64 3d  pIdx->isResized=
cb10: 3d 30 20 29 3b 0a 20 20 6e 42 79 74 65 20 3d 20  =0 );.  nByte = 
cb20: 28 73 69 7a 65 6f 66 28 63 68 61 72 2a 29 20 2b  (sizeof(char*) +
cb30: 20 73 69 7a 65 6f 66 28 69 31 36 29 20 2b 20 31   sizeof(i16) + 1
cb40: 29 2a 4e 3b 0a 20 20 7a 45 78 74 72 61 20 3d 20  )*N;.  zExtra = 
cb50: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a  sqlite3DbMallocZ
cb60: 65 72 6f 28 64 62 2c 20 6e 42 79 74 65 29 3b 0a  ero(db, nByte);.
cb70: 20 20 69 66 28 20 7a 45 78 74 72 61 3d 3d 30 20    if( zExtra==0 
cb80: 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
cb90: 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 6d 65  NOMEM_BKPT;.  me
cba0: 6d 63 70 79 28 7a 45 78 74 72 61 2c 20 70 49 64  mcpy(zExtra, pId
cbb0: 78 2d 3e 61 7a 43 6f 6c 6c 2c 20 73 69 7a 65 6f  x->azColl, sizeo
cbc0: 66 28 63 68 61 72 2a 29 2a 70 49 64 78 2d 3e 6e  f(char*)*pIdx->n
cbd0: 43 6f 6c 75 6d 6e 29 3b 0a 20 20 70 49 64 78 2d  Column);.  pIdx-
cbe0: 3e 61 7a 43 6f 6c 6c 20 3d 20 28 63 6f 6e 73 74  >azColl = (const
cbf0: 20 63 68 61 72 2a 2a 29 7a 45 78 74 72 61 3b 0a   char**)zExtra;.
cc00: 20 20 7a 45 78 74 72 61 20 2b 3d 20 73 69 7a 65    zExtra += size
cc10: 6f 66 28 63 68 61 72 2a 29 2a 4e 3b 0a 20 20 6d  of(char*)*N;.  m
cc20: 65 6d 63 70 79 28 7a 45 78 74 72 61 2c 20 70 49  emcpy(zExtra, pI
cc30: 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 2c 20 73 69  dx->aiColumn, si
cc40: 7a 65 6f 66 28 69 31 36 29 2a 70 49 64 78 2d 3e  zeof(i16)*pIdx->
cc50: 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 70 49 64 78  nColumn);.  pIdx
cc60: 2d 3e 61 69 43 6f 6c 75 6d 6e 20 3d 20 28 69 31  ->aiColumn = (i1
cc70: 36 2a 29 7a 45 78 74 72 61 3b 0a 20 20 7a 45 78  6*)zExtra;.  zEx
cc80: 74 72 61 20 2b 3d 20 73 69 7a 65 6f 66 28 69 31  tra += sizeof(i1
cc90: 36 29 2a 4e 3b 0a 20 20 6d 65 6d 63 70 79 28 7a  6)*N;.  memcpy(z
cca0: 45 78 74 72 61 2c 20 70 49 64 78 2d 3e 61 53 6f  Extra, pIdx->aSo
ccb0: 72 74 4f 72 64 65 72 2c 20 70 49 64 78 2d 3e 6e  rtOrder, pIdx->n
ccc0: 43 6f 6c 75 6d 6e 29 3b 0a 20 20 70 49 64 78 2d  Column);.  pIdx-
ccd0: 3e 61 53 6f 72 74 4f 72 64 65 72 20 3d 20 28 75  >aSortOrder = (u
cce0: 38 2a 29 7a 45 78 74 72 61 3b 0a 20 20 70 49 64  8*)zExtra;.  pId
ccf0: 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 3d 20 4e 3b 0a  x->nColumn = N;.
cd00: 20 20 70 49 64 78 2d 3e 69 73 52 65 73 69 7a 65    pIdx->isResize
cd10: 64 20 3d 20 31 3b 0a 20 20 72 65 74 75 72 6e 20  d = 1;.  return 
cd20: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
cd30: 0a 2a 2a 20 45 73 74 69 6d 61 74 65 20 74 68 65  .** Estimate the
cd40: 20 74 6f 74 61 6c 20 72 6f 77 20 77 69 64 74 68   total row width
cd50: 20 66 6f 72 20 61 20 74 61 62 6c 65 2e 0a 2a 2f   for a table..*/
cd60: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 73 74  .static void est
cd70: 69 6d 61 74 65 54 61 62 6c 65 57 69 64 74 68 28  imateTableWidth(
cd80: 54 61 62 6c 65 20 2a 70 54 61 62 29 7b 0a 20 20  Table *pTab){.  
cd90: 75 6e 73 69 67 6e 65 64 20 77 54 61 62 6c 65 20  unsigned wTable 
cda0: 3d 20 30 3b 0a 20 20 63 6f 6e 73 74 20 43 6f 6c  = 0;.  const Col
cdb0: 75 6d 6e 20 2a 70 54 61 62 43 6f 6c 3b 0a 20 20  umn *pTabCol;.  
cdc0: 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 70  int i;.  for(i=p
cdd0: 54 61 62 2d 3e 6e 43 6f 6c 2c 20 70 54 61 62 43  Tab->nCol, pTabC
cde0: 6f 6c 3d 70 54 61 62 2d 3e 61 43 6f 6c 3b 20 69  ol=pTab->aCol; i
cdf0: 3e 30 3b 20 69 2d 2d 2c 20 70 54 61 62 43 6f 6c  >0; i--, pTabCol
ce00: 2b 2b 29 7b 0a 20 20 20 20 77 54 61 62 6c 65 20  ++){.    wTable 
ce10: 2b 3d 20 70 54 61 62 43 6f 6c 2d 3e 73 7a 45 73  += pTabCol->szEs
ce20: 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 54 61  t;.  }.  if( pTa
ce30: 62 2d 3e 69 50 4b 65 79 3c 30 20 29 20 77 54 61  b->iPKey<0 ) wTa
ce40: 62 6c 65 2b 2b 3b 0a 20 20 70 54 61 62 2d 3e 73  ble++;.  pTab->s
ce50: 7a 54 61 62 52 6f 77 20 3d 20 73 71 6c 69 74 65  zTabRow = sqlite
ce60: 33 4c 6f 67 45 73 74 28 77 54 61 62 6c 65 2a 34  3LogEst(wTable*4
ce70: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 73 74 69  );.}../*.** Esti
ce80: 6d 61 74 65 20 74 68 65 20 61 76 65 72 61 67 65  mate the average
ce90: 20 73 69 7a 65 20 6f 66 20 61 20 72 6f 77 20 66   size of a row f
cea0: 6f 72 20 61 6e 20 69 6e 64 65 78 2e 0a 2a 2f 0a  or an index..*/.
ceb0: 73 74 61 74 69 63 20 76 6f 69 64 20 65 73 74 69  static void esti
cec0: 6d 61 74 65 49 6e 64 65 78 57 69 64 74 68 28 49  mateIndexWidth(I
ced0: 6e 64 65 78 20 2a 70 49 64 78 29 7b 0a 20 20 75  ndex *pIdx){.  u
cee0: 6e 73 69 67 6e 65 64 20 77 49 6e 64 65 78 20 3d  nsigned wIndex =
cef0: 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63   0;.  int i;.  c
cf00: 6f 6e 73 74 20 43 6f 6c 75 6d 6e 20 2a 61 43 6f  onst Column *aCo
cf10: 6c 20 3d 20 70 49 64 78 2d 3e 70 54 61 62 6c 65  l = pIdx->pTable
cf20: 2d 3e 61 43 6f 6c 3b 0a 20 20 66 6f 72 28 69 3d  ->aCol;.  for(i=
cf30: 30 3b 20 69 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75  0; i<pIdx->nColu
cf40: 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 31  mn; i++){.    i1
cf50: 36 20 78 20 3d 20 70 49 64 78 2d 3e 61 69 43 6f  6 x = pIdx->aiCo
cf60: 6c 75 6d 6e 5b 69 5d 3b 0a 20 20 20 20 61 73 73  lumn[i];.    ass
cf70: 65 72 74 28 20 78 3c 70 49 64 78 2d 3e 70 54 61  ert( x<pIdx->pTa
cf80: 62 6c 65 2d 3e 6e 43 6f 6c 20 29 3b 0a 20 20 20  ble->nCol );.   
cf90: 20 77 49 6e 64 65 78 20 2b 3d 20 78 3c 30 20 3f   wIndex += x<0 ?
cfa0: 20 31 20 3a 20 61 43 6f 6c 5b 70 49 64 78 2d 3e   1 : aCol[pIdx->
cfb0: 61 69 43 6f 6c 75 6d 6e 5b 69 5d 5d 2e 73 7a 45  aiColumn[i]].szE
cfc0: 73 74 3b 0a 20 20 7d 0a 20 20 70 49 64 78 2d 3e  st;.  }.  pIdx->
cfd0: 73 7a 49 64 78 52 6f 77 20 3d 20 73 71 6c 69 74  szIdxRow = sqlit
cfe0: 65 33 4c 6f 67 45 73 74 28 77 49 6e 64 65 78 2a  e3LogEst(wIndex*
cff0: 34 29 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e  4);.}../* Return
d000: 20 74 72 75 65 20 69 66 20 76 61 6c 75 65 20 78   true if value x
d010: 20 69 73 20 66 6f 75 6e 64 20 61 6e 79 20 6f 66   is found any of
d020: 20 74 68 65 20 66 69 72 73 74 20 6e 43 6f 6c 20   the first nCol 
d030: 65 6e 74 72 69 65 73 20 6f 66 20 61 69 43 6f 6c  entries of aiCol
d040: 5b 5d 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  [].*/.static int
d050: 20 68 61 73 43 6f 6c 75 6d 6e 28 63 6f 6e 73 74   hasColumn(const
d060: 20 69 31 36 20 2a 61 69 43 6f 6c 2c 20 69 6e 74   i16 *aiCol, int
d070: 20 6e 43 6f 6c 2c 20 69 6e 74 20 78 29 7b 0a 20   nCol, int x){. 
d080: 20 77 68 69 6c 65 28 20 6e 43 6f 6c 2d 2d 20 3e   while( nCol-- >
d090: 20 30 20 29 20 69 66 28 20 78 3d 3d 2a 28 61 69   0 ) if( x==*(ai
d0a0: 43 6f 6c 2b 2b 29 20 29 20 72 65 74 75 72 6e 20  Col++) ) return 
d0b0: 31 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d  1;.  return 0;.}
d0c0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
d0d0: 74 69 6e 65 20 72 75 6e 73 20 61 74 20 74 68 65  tine runs at the
d0e0: 20 65 6e 64 20 6f 66 20 70 61 72 73 69 6e 67 20   end of parsing 
d0f0: 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73  a CREATE TABLE s
d100: 74 61 74 65 6d 65 6e 74 20 74 68 61 74 0a 2a 2a  tatement that.**
d110: 20 68 61 73 20 61 20 57 49 54 48 4f 55 54 20 52   has a WITHOUT R
d120: 4f 57 49 44 20 63 6c 61 75 73 65 2e 20 20 54 68  OWID clause.  Th
d130: 65 20 6a 6f 62 20 6f 66 20 74 68 69 73 20 72 6f  e job of this ro
d140: 75 74 69 6e 65 20 69 73 20 74 6f 20 63 6f 6e 76  utine is to conv
d150: 65 72 74 20 62 6f 74 68 0a 2a 2a 20 69 6e 74 65  ert both.** inte
d160: 72 6e 61 6c 20 73 63 68 65 6d 61 20 64 61 74 61  rnal schema data
d170: 20 73 74 72 75 63 74 75 72 65 73 20 61 6e 64 20   structures and 
d180: 74 68 65 20 67 65 6e 65 72 61 74 65 64 20 56 44  the generated VD
d190: 42 45 20 63 6f 64 65 20 73 6f 20 74 68 61 74 20  BE code so that 
d1a0: 74 68 65 79 0a 2a 2a 20 61 72 65 20 61 70 70 72  they.** are appr
d1b0: 6f 70 72 69 61 74 65 20 66 6f 72 20 61 20 57 49  opriate for a WI
d1c0: 54 48 4f 55 54 20 52 4f 57 49 44 20 74 61 62 6c  THOUT ROWID tabl
d1d0: 65 20 69 6e 73 74 65 61 64 20 6f 66 20 61 20 72  e instead of a r
d1e0: 6f 77 69 64 20 74 61 62 6c 65 2e 0a 2a 2a 20 43  owid table..** C
d1f0: 68 61 6e 67 65 73 20 69 6e 63 6c 75 64 65 3a 0a  hanges include:.
d200: 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20 20 53  **.**     (1)  S
d210: 65 74 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 6f  et all columns o
d220: 66 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45  f the PRIMARY KE
d230: 59 20 73 63 68 65 6d 61 20 6f 62 6a 65 63 74 20  Y schema object 
d240: 74 6f 20 62 65 20 4e 4f 54 20 4e 55 4c 4c 2e 0a  to be NOT NULL..
d250: 2a 2a 20 20 20 20 20 28 32 29 20 20 43 6f 6e 76  **     (2)  Conv
d260: 65 72 74 20 74 68 65 20 4f 50 5f 43 72 65 61 74  ert the OP_Creat
d270: 65 54 61 62 6c 65 20 69 6e 74 6f 20 61 6e 20 4f  eTable into an O
d280: 50 5f 43 72 65 61 74 65 49 6e 64 65 78 2e 20 20  P_CreateIndex.  
d290: 54 68 65 72 65 20 69 73 0a 2a 2a 20 20 20 20 20  There is.**     
d2a0: 20 20 20 20 20 6e 6f 20 72 6f 77 69 64 20 62 74       no rowid bt
d2b0: 72 65 65 20 66 6f 72 20 61 20 57 49 54 48 4f 55  ree for a WITHOU
d2c0: 54 20 52 4f 57 49 44 2e 20 20 49 6e 73 74 65 61  T ROWID.  Instea
d2d0: 64 2c 20 74 68 65 20 63 61 6e 6f 6e 69 63 61 6c  d, the canonical
d2e0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 64 61 74  .**          dat
d2f0: 61 20 73 74 6f 72 61 67 65 20 69 73 20 61 20 63  a storage is a c
d300: 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 20 62 74  overing index bt
d310: 72 65 65 2e 0a 2a 2a 20 20 20 20 20 28 33 29 20  ree..**     (3) 
d320: 20 42 79 70 61 73 73 20 74 68 65 20 63 72 65 61   Bypass the crea
d330: 74 69 6f 6e 20 6f 66 20 74 68 65 20 73 71 6c 69  tion of the sqli
d340: 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20  te_master table 
d350: 65 6e 74 72 79 0a 2a 2a 20 20 20 20 20 20 20 20  entry.**        
d360: 20 20 66 6f 72 20 74 68 65 20 50 52 49 4d 41 52    for the PRIMAR
d370: 59 20 4b 45 59 20 61 73 20 74 68 65 20 70 72 69  Y KEY as the pri
d380: 6d 61 72 79 20 6b 65 79 20 69 6e 64 65 78 20 69  mary key index i
d390: 73 20 6e 6f 77 0a 2a 2a 20 20 20 20 20 20 20 20  s now.**        
d3a0: 20 20 69 64 65 6e 74 69 66 69 65 64 20 62 79 20    identified by 
d3b0: 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  the sqlite_maste
d3c0: 72 20 74 61 62 6c 65 20 65 6e 74 72 79 20 6f 66  r table entry of
d3d0: 20 74 68 65 20 74 61 62 6c 65 20 69 74 73 65 6c   the table itsel
d3e0: 66 2e 0a 2a 2a 20 20 20 20 20 28 34 29 20 20 53  f..**     (4)  S
d3f0: 65 74 20 74 68 65 20 49 6e 64 65 78 2e 74 6e 75  et the Index.tnu
d400: 6d 20 6f 66 20 74 68 65 20 50 52 49 4d 41 52 59  m of the PRIMARY
d410: 20 4b 45 59 20 49 6e 64 65 78 20 6f 62 6a 65 63   KEY Index objec
d420: 74 20 69 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20  t in the.**     
d430: 20 20 20 20 20 73 63 68 65 6d 61 20 74 6f 20 74       schema to t
d440: 68 65 20 72 6f 6f 74 70 61 67 65 20 66 72 6f 6d  he rootpage from
d450: 20 74 68 65 20 6d 61 69 6e 20 74 61 62 6c 65 2e   the main table.
d460: 0a 2a 2a 20 20 20 20 20 28 35 29 20 20 41 64 64  .**     (5)  Add
d470: 20 61 6c 6c 20 74 61 62 6c 65 20 63 6f 6c 75 6d   all table colum
d480: 6e 73 20 74 6f 20 74 68 65 20 50 52 49 4d 41 52  ns to the PRIMAR
d490: 59 20 4b 45 59 20 49 6e 64 65 78 20 6f 62 6a 65  Y KEY Index obje
d4a0: 63 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 73  ct.**          s
d4b0: 6f 20 74 68 61 74 20 74 68 65 20 50 52 49 4d 41  o that the PRIMA
d4c0: 52 59 20 4b 45 59 20 69 73 20 61 20 63 6f 76 65  RY KEY is a cove
d4d0: 72 69 6e 67 20 69 6e 64 65 78 2e 20 20 54 68 65  ring index.  The
d4e0: 20 73 75 72 70 6c 75 73 0a 2a 2a 20 20 20 20 20   surplus.**     
d4f0: 20 20 20 20 20 63 6f 6c 75 6d 6e 73 20 61 72 65       columns are
d500: 20 70 61 72 74 20 6f 66 20 4b 65 79 49 6e 66 6f   part of KeyInfo
d510: 2e 6e 58 46 69 65 6c 64 20 61 6e 64 20 61 72 65  .nXField and are
d520: 20 6e 6f 74 20 75 73 65 64 20 66 6f 72 0a 2a 2a   not used for.**
d530: 20 20 20 20 20 20 20 20 20 20 73 6f 72 74 69 6e            sortin
d540: 67 20 6f 72 20 6c 6f 6f 6b 75 70 20 6f 72 20 75  g or lookup or u
d550: 6e 69 71 75 65 6e 65 73 73 20 63 68 65 63 6b 73  niqueness checks
d560: 2e 0a 2a 2a 20 20 20 20 20 28 36 29 20 20 52 65  ..**     (6)  Re
d570: 70 6c 61 63 65 20 74 68 65 20 72 6f 77 69 64 20  place the rowid 
d580: 74 61 69 6c 20 6f 6e 20 61 6c 6c 20 61 75 74 6f  tail on all auto
d590: 6d 61 74 69 63 61 6c 6c 79 20 67 65 6e 65 72 61  matically genera
d5a0: 74 65 64 20 55 4e 49 51 55 45 0a 2a 2a 20 20 20  ted UNIQUE.**   
d5b0: 20 20 20 20 20 20 20 69 6e 64 69 63 65 73 20 77         indices w
d5c0: 69 74 68 20 74 68 65 20 50 52 49 4d 41 52 59 20  ith the PRIMARY 
d5d0: 4b 45 59 20 63 6f 6c 75 6d 6e 73 2e 0a 2a 2a 0a  KEY columns..**.
d5e0: 2a 2a 20 46 6f 72 20 76 69 72 74 75 61 6c 20 74  ** For virtual t
d5f0: 61 62 6c 65 73 2c 20 6f 6e 6c 79 20 28 31 29 20  ables, only (1) 
d600: 69 73 20 70 65 72 66 6f 72 6d 65 64 2e 0a 2a 2f  is performed..*/
d610: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f 6e  .static void con
d620: 76 65 72 74 54 6f 57 69 74 68 6f 75 74 52 6f 77  vertToWithoutRow
d630: 69 64 54 61 62 6c 65 28 50 61 72 73 65 20 2a 70  idTable(Parse *p
d640: 50 61 72 73 65 2c 20 54 61 62 6c 65 20 2a 70 54  Parse, Table *pT
d650: 61 62 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 49  ab){.  Index *pI
d660: 64 78 3b 0a 20 20 49 6e 64 65 78 20 2a 70 50 6b  dx;.  Index *pPk
d670: 3b 0a 20 20 69 6e 74 20 6e 50 6b 3b 0a 20 20 69  ;.  int nPk;.  i
d680: 6e 74 20 69 2c 20 6a 3b 0a 20 20 73 71 6c 69 74  nt i, j;.  sqlit
d690: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
d6a0: 3e 64 62 3b 0a 20 20 56 64 62 65 20 2a 76 20 3d  >db;.  Vdbe *v =
d6b0: 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
d6c0: 0a 20 20 2f 2a 20 4d 61 72 6b 20 65 76 65 72 79  .  /* Mark every
d6d0: 20 50 52 49 4d 41 52 59 20 4b 45 59 20 63 6f 6c   PRIMARY KEY col
d6e0: 75 6d 6e 20 61 73 20 4e 4f 54 20 4e 55 4c 4c 20  umn as NOT NULL 
d6f0: 28 65 78 63 65 70 74 20 66 6f 72 20 69 6d 70 6f  (except for impo
d700: 73 74 65 72 20 74 61 62 6c 65 73 29 0a 20 20 2a  ster tables).  *
d710: 2f 0a 20 20 69 66 28 20 21 64 62 2d 3e 69 6e 69  /.  if( !db->ini
d720: 74 2e 69 6d 70 6f 73 74 65 72 54 61 62 6c 65 20  t.imposterTable 
d730: 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  ){.    for(i=0; 
d740: 69 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 2b  i<pTab->nCol; i+
d750: 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 70  +){.      if( (p
d760: 54 61 62 2d 3e 61 43 6f 6c 5b 69 5d 2e 63 6f 6c  Tab->aCol[i].col
d770: 46 6c 61 67 73 20 26 20 43 4f 4c 46 4c 41 47 5f  Flags & COLFLAG_
d780: 50 52 49 4d 4b 45 59 29 21 3d 30 20 29 7b 0a 20  PRIMKEY)!=0 ){. 
d790: 20 20 20 20 20 20 20 70 54 61 62 2d 3e 61 43 6f         pTab->aCo
d7a0: 6c 5b 69 5d 2e 6e 6f 74 4e 75 6c 6c 20 3d 20 4f  l[i].notNull = O
d7b0: 45 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20 20 7d  E_Abort;.      }
d7c0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
d7d0: 20 54 68 65 20 72 65 6d 61 69 6e 69 6e 67 20 74   The remaining t
d7e0: 72 61 6e 73 66 6f 72 6d 61 74 69 6f 6e 73 20 6f  ransformations o
d7f0: 6e 6c 79 20 61 70 70 6c 79 20 74 6f 20 62 2d 74  nly apply to b-t
d800: 72 65 65 20 74 61 62 6c 65 73 2c 20 6e 6f 74 20  ree tables, not 
d810: 74 6f 0a 20 20 2a 2a 20 76 69 72 74 75 61 6c 20  to.  ** virtual 
d820: 74 61 62 6c 65 73 20 2a 2f 0a 20 20 69 66 28 20  tables */.  if( 
d830: 49 4e 5f 44 45 43 4c 41 52 45 5f 56 54 41 42 20  IN_DECLARE_VTAB 
d840: 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20  ) return;..  /* 
d850: 43 6f 6e 76 65 72 74 20 74 68 65 20 4f 50 5f 43  Convert the OP_C
d860: 72 65 61 74 65 54 61 62 6c 65 20 6f 70 63 6f 64  reateTable opcod
d870: 65 20 74 68 61 74 20 77 6f 75 6c 64 20 6e 6f 72  e that would nor
d880: 6d 61 6c 6c 79 20 63 72 65 61 74 65 20 74 68 65  mally create the
d890: 0a 20 20 2a 2a 20 72 6f 6f 74 2d 70 61 67 65 20  .  ** root-page 
d8a0: 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20 69 6e  for the table in
d8b0: 74 6f 20 61 6e 20 4f 50 5f 43 72 65 61 74 65 49  to an OP_CreateI
d8c0: 6e 64 65 78 20 6f 70 63 6f 64 65 2e 20 20 54 68  ndex opcode.  Th
d8d0: 65 20 69 6e 64 65 78 0a 20 20 2a 2a 20 63 72 65  e index.  ** cre
d8e0: 61 74 65 64 20 77 69 6c 6c 20 62 65 63 6f 6d 65  ated will become
d8f0: 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59   the PRIMARY KEY
d900: 20 69 6e 64 65 78 2e 0a 20 20 2a 2f 0a 20 20 69   index..  */.  i
d910: 66 28 20 70 50 61 72 73 65 2d 3e 61 64 64 72 43  f( pParse->addrC
d920: 72 54 61 62 20 29 7b 0a 20 20 20 20 61 73 73 65  rTab ){.    asse
d930: 72 74 28 20 76 20 29 3b 0a 20 20 20 20 73 71 6c  rt( v );.    sql
d940: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 4f 70  ite3VdbeChangeOp
d950: 63 6f 64 65 28 76 2c 20 70 50 61 72 73 65 2d 3e  code(v, pParse->
d960: 61 64 64 72 43 72 54 61 62 2c 20 4f 50 5f 43 72  addrCrTab, OP_Cr
d970: 65 61 74 65 49 6e 64 65 78 29 3b 0a 20 20 7d 0a  eateIndex);.  }.
d980: 0a 20 20 2f 2a 20 4c 6f 63 61 74 65 20 74 68 65  .  /* Locate the
d990: 20 50 52 49 4d 41 52 59 20 4b 45 59 20 69 6e 64   PRIMARY KEY ind
d9a0: 65 78 2e 20 20 4f 72 2c 20 69 66 20 74 68 69 73  ex.  Or, if this
d9b0: 20 74 61 62 6c 65 20 77 61 73 20 6f 72 69 67 69   table was origi
d9c0: 6e 61 6c 6c 79 0a 20 20 2a 2a 20 61 6e 20 49 4e  nally.  ** an IN
d9d0: 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45  TEGER PRIMARY KE
d9e0: 59 20 74 61 62 6c 65 2c 20 63 72 65 61 74 65 20  Y table, create 
d9f0: 61 20 6e 65 77 20 50 52 49 4d 41 52 59 20 4b 45  a new PRIMARY KE
da00: 59 20 69 6e 64 65 78 2e 20 0a 20 20 2a 2f 0a 20  Y index. .  */. 
da10: 20 69 66 28 20 70 54 61 62 2d 3e 69 50 4b 65 79   if( pTab->iPKey
da20: 3e 3d 30 20 29 7b 0a 20 20 20 20 45 78 70 72 4c  >=0 ){.    ExprL
da30: 69 73 74 20 2a 70 4c 69 73 74 3b 0a 20 20 20 20  ist *pList;.    
da40: 54 6f 6b 65 6e 20 69 70 6b 54 6f 6b 65 6e 3b 0a  Token ipkToken;.
da50: 20 20 20 20 73 71 6c 69 74 65 33 54 6f 6b 65 6e      sqlite3Token
da60: 49 6e 69 74 28 26 69 70 6b 54 6f 6b 65 6e 2c 20  Init(&ipkToken, 
da70: 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 54 61 62 2d  pTab->aCol[pTab-
da80: 3e 69 50 4b 65 79 5d 2e 7a 4e 61 6d 65 29 3b 0a  >iPKey].zName);.
da90: 20 20 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69      pList = sqli
daa0: 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e  te3ExprListAppen
dab0: 64 28 70 50 61 72 73 65 2c 20 30 2c 20 0a 20 20  d(pParse, 0, .  
dac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dad0: 73 71 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f 63  sqlite3ExprAlloc
dae0: 28 64 62 2c 20 54 4b 5f 49 44 2c 20 26 69 70 6b  (db, TK_ID, &ipk
daf0: 54 6f 6b 65 6e 2c 20 30 29 29 3b 0a 20 20 20 20  Token, 0));.    
db00: 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72  if( pList==0 ) r
db10: 65 74 75 72 6e 3b 0a 20 20 20 20 70 4c 69 73 74  eturn;.    pList
db20: 2d 3e 61 5b 30 5d 2e 73 6f 72 74 4f 72 64 65 72  ->a[0].sortOrder
db30: 20 3d 20 70 50 61 72 73 65 2d 3e 69 50 6b 53 6f   = pParse->iPkSo
db40: 72 74 4f 72 64 65 72 3b 0a 20 20 20 20 61 73 73  rtOrder;.    ass
db50: 65 72 74 28 20 70 50 61 72 73 65 2d 3e 70 4e 65  ert( pParse->pNe
db60: 77 54 61 62 6c 65 3d 3d 70 54 61 62 20 29 3b 0a  wTable==pTab );.
db70: 20 20 20 20 73 71 6c 69 74 65 33 43 72 65 61 74      sqlite3Creat
db80: 65 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 30  eIndex(pParse, 0
db90: 2c 20 30 2c 20 30 2c 20 70 4c 69 73 74 2c 20 70  , 0, 0, pList, p
dba0: 54 61 62 2d 3e 6b 65 79 43 6f 6e 66 2c 20 30 2c  Tab->keyConf, 0,
dbb0: 20 30 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20 20   0, 0, 0,.      
dbc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dbd0: 20 53 51 4c 49 54 45 5f 49 44 58 54 59 50 45 5f   SQLITE_IDXTYPE_
dbe0: 50 52 49 4d 41 52 59 4b 45 59 29 3b 0a 20 20 20  PRIMARYKEY);.   
dbf0: 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
dc00: 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a  ailed ) return;.
dc10: 20 20 20 20 70 50 6b 20 3d 20 73 71 6c 69 74 65      pPk = sqlite
dc20: 33 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65 78  3PrimaryKeyIndex
dc30: 28 70 54 61 62 29 3b 0a 20 20 20 20 70 54 61 62  (pTab);.    pTab
dc40: 2d 3e 69 50 4b 65 79 20 3d 20 2d 31 3b 0a 20 20  ->iPKey = -1;.  
dc50: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 6b 20 3d  }else{.    pPk =
dc60: 20 73 71 6c 69 74 65 33 50 72 69 6d 61 72 79 4b   sqlite3PrimaryK
dc70: 65 79 49 6e 64 65 78 28 70 54 61 62 29 3b 0a 0a  eyIndex(pTab);..
dc80: 20 20 20 20 2f 2a 20 42 79 70 61 73 73 20 74 68      /* Bypass th
dc90: 65 20 63 72 65 61 74 69 6f 6e 20 6f 66 20 74 68  e creation of th
dca0: 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 62 74  e PRIMARY KEY bt
dcb0: 72 65 65 20 61 6e 64 20 74 68 65 20 73 71 6c 69  ree and the sqli
dcc0: 74 65 5f 6d 61 73 74 65 72 0a 20 20 20 20 2a 2a  te_master.    **
dcd0: 20 74 61 62 6c 65 20 65 6e 74 72 79 2e 20 54 68   table entry. Th
dce0: 69 73 20 69 73 20 6f 6e 6c 79 20 72 65 71 75 69  is is only requi
dcf0: 72 65 64 20 69 66 20 63 75 72 72 65 6e 74 6c 79  red if currently
dd00: 20 67 65 6e 65 72 61 74 69 6e 67 20 56 44 42 45   generating VDBE
dd10: 0a 20 20 20 20 2a 2a 20 63 6f 64 65 20 66 6f 72  .    ** code for
dd20: 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20   a CREATE TABLE 
dd30: 28 6e 6f 74 20 77 68 65 6e 20 70 61 72 73 69 6e  (not when parsin
dd40: 67 20 6f 6e 65 20 61 73 20 70 61 72 74 20 6f 66  g one as part of
dd50: 20 72 65 61 64 69 6e 67 0a 20 20 20 20 2a 2a 20   reading.    ** 
dd60: 61 20 64 61 74 61 62 61 73 65 20 73 63 68 65 6d  a database schem
dd70: 61 29 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  a).  */.    if( 
dd80: 76 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  v ){.      asser
dd90: 74 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  t( db->init.busy
dda0: 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  ==0 );.      sql
ddb0: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 4f 70  ite3VdbeChangeOp
ddc0: 63 6f 64 65 28 76 2c 20 70 50 6b 2d 3e 74 6e 75  code(v, pPk->tnu
ddd0: 6d 2c 20 4f 50 5f 47 6f 74 6f 29 3b 0a 20 20 20  m, OP_Goto);.   
dde0: 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a   }..    /*.    *
ddf0: 2a 20 52 65 6d 6f 76 65 20 61 6c 6c 20 72 65 64  * Remove all red
de00: 75 6e 64 61 6e 74 20 63 6f 6c 75 6d 6e 73 20 66  undant columns f
de10: 72 6f 6d 20 74 68 65 20 50 52 49 4d 41 52 59 20  rom the PRIMARY 
de20: 4b 45 59 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c  KEY.  For exampl
de30: 65 2c 20 63 68 61 6e 67 65 0a 20 20 20 20 2a 2a  e, change.    **
de40: 20 22 50 52 49 4d 41 52 59 20 4b 45 59 28 61 2c   "PRIMARY KEY(a,
de50: 62 2c 61 2c 62 2c 63 2c 62 2c 63 2c 64 29 22 20  b,a,b,c,b,c,d)" 
de60: 69 6e 74 6f 20 6a 75 73 74 20 22 50 52 49 4d 41  into just "PRIMA
de70: 52 59 20 4b 45 59 28 61 2c 62 2c 63 2c 64 29 22  RY KEY(a,b,c,d)"
de80: 2e 20 20 4c 61 74 65 72 0a 20 20 20 20 2a 2a 20  .  Later.    ** 
de90: 63 6f 64 65 20 61 73 73 75 6d 65 73 20 74 68 65  code assumes the
dea0: 20 50 52 49 4d 41 52 59 20 4b 45 59 20 63 6f 6e   PRIMARY KEY con
deb0: 74 61 69 6e 73 20 6e 6f 20 72 65 70 65 61 74 65  tains no repeate
dec0: 64 20 63 6f 6c 75 6d 6e 73 2e 0a 20 20 20 20 2a  d columns..    *
ded0: 2f 0a 20 20 20 20 66 6f 72 28 69 3d 6a 3d 31 3b  /.    for(i=j=1;
dee0: 20 69 3c 70 50 6b 2d 3e 6e 4b 65 79 43 6f 6c 3b   i<pPk->nKeyCol;
def0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   i++){.      if(
df00: 20 68 61 73 43 6f 6c 75 6d 6e 28 70 50 6b 2d 3e   hasColumn(pPk->
df10: 61 69 43 6f 6c 75 6d 6e 2c 20 6a 2c 20 70 50 6b  aiColumn, j, pPk
df20: 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 29 20 29  ->aiColumn[i]) )
df30: 7b 0a 20 20 20 20 20 20 20 20 70 50 6b 2d 3e 6e  {.        pPk->n
df40: 43 6f 6c 75 6d 6e 2d 2d 3b 0a 20 20 20 20 20 20  Column--;.      
df50: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70  }else{.        p
df60: 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 2b 2b  Pk->aiColumn[j++
df70: 5d 20 3d 20 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d  ] = pPk->aiColum
df80: 6e 5b 69 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  n[i];.      }.  
df90: 20 20 7d 0a 20 20 20 20 70 50 6b 2d 3e 6e 4b 65    }.    pPk->nKe
dfa0: 79 43 6f 6c 20 3d 20 6a 3b 0a 20 20 7d 0a 20 20  yCol = j;.  }.  
dfb0: 61 73 73 65 72 74 28 20 70 50 6b 21 3d 30 20 29  assert( pPk!=0 )
dfc0: 3b 0a 20 20 70 50 6b 2d 3e 69 73 43 6f 76 65 72  ;.  pPk->isCover
dfd0: 69 6e 67 20 3d 20 31 3b 0a 20 20 69 66 28 20 21  ing = 1;.  if( !
dfe0: 64 62 2d 3e 69 6e 69 74 2e 69 6d 70 6f 73 74 65  db->init.imposte
dff0: 72 54 61 62 6c 65 20 29 20 70 50 6b 2d 3e 75 6e  rTable ) pPk->un
e000: 69 71 4e 6f 74 4e 75 6c 6c 20 3d 20 31 3b 0a 20  iqNotNull = 1;. 
e010: 20 6e 50 6b 20 3d 20 70 50 6b 2d 3e 6e 4b 65 79   nPk = pPk->nKey
e020: 43 6f 6c 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 72  Col;..  /* The r
e030: 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 68 65 20  oot page of the 
e040: 50 52 49 4d 41 52 59 20 4b 45 59 20 69 73 20 74  PRIMARY KEY is t
e050: 68 65 20 74 61 62 6c 65 20 72 6f 6f 74 20 70 61  he table root pa
e060: 67 65 20 2a 2f 0a 20 20 70 50 6b 2d 3e 74 6e 75  ge */.  pPk->tnu
e070: 6d 20 3d 20 70 54 61 62 2d 3e 74 6e 75 6d 3b 0a  m = pTab->tnum;.
e080: 0a 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65  .  /* Update the
e090: 20 69 6e 2d 6d 65 6d 6f 72 79 20 72 65 70 72 65   in-memory repre
e0a0: 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 61 6c 6c  sentation of all
e0b0: 20 55 4e 49 51 55 45 20 69 6e 64 69 63 65 73 20   UNIQUE indices 
e0c0: 62 79 20 63 6f 6e 76 65 72 74 69 6e 67 0a 20 20  by converting.  
e0d0: 2a 2a 20 74 68 65 20 66 69 6e 61 6c 20 72 6f 77  ** the final row
e0e0: 69 64 20 63 6f 6c 75 6d 6e 20 69 6e 74 6f 20 6f  id column into o
e0f0: 6e 65 20 6f 72 20 6d 6f 72 65 20 63 6f 6c 75 6d  ne or more colum
e100: 6e 73 20 6f 66 20 74 68 65 20 50 52 49 4d 41 52  ns of the PRIMAR
e110: 59 20 4b 45 59 2e 0a 20 20 2a 2f 0a 20 20 66 6f  Y KEY..  */.  fo
e120: 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e  r(pIdx=pTab->pIn
e130: 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d  dex; pIdx; pIdx=
e140: 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  pIdx->pNext){.  
e150: 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 69 66 28    int n;.    if(
e160: 20 49 73 50 72 69 6d 61 72 79 4b 65 79 49 6e 64   IsPrimaryKeyInd
e170: 65 78 28 70 49 64 78 29 20 29 20 63 6f 6e 74 69  ex(pIdx) ) conti
e180: 6e 75 65 3b 0a 20 20 20 20 66 6f 72 28 69 3d 6e  nue;.    for(i=n
e190: 3d 30 3b 20 69 3c 6e 50 6b 3b 20 69 2b 2b 29 7b  =0; i<nPk; i++){
e1a0: 0a 20 20 20 20 20 20 69 66 28 20 21 68 61 73 43  .      if( !hasC
e1b0: 6f 6c 75 6d 6e 28 70 49 64 78 2d 3e 61 69 43 6f  olumn(pIdx->aiCo
e1c0: 6c 75 6d 6e 2c 20 70 49 64 78 2d 3e 6e 4b 65 79  lumn, pIdx->nKey
e1d0: 43 6f 6c 2c 20 70 50 6b 2d 3e 61 69 43 6f 6c 75  Col, pPk->aiColu
e1e0: 6d 6e 5b 69 5d 29 20 29 20 6e 2b 2b 3b 0a 20 20  mn[i]) ) n++;.  
e1f0: 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 3d 3d 30    }.    if( n==0
e200: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69   ){.      /* Thi
e210: 73 20 69 6e 64 65 78 20 69 73 20 61 20 73 75 70  s index is a sup
e220: 65 72 73 65 74 20 6f 66 20 74 68 65 20 70 72 69  erset of the pri
e230: 6d 61 72 79 20 6b 65 79 20 2a 2f 0a 20 20 20 20  mary key */.    
e240: 20 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 20    pIdx->nColumn 
e250: 3d 20 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3b  = pIdx->nKeyCol;
e260: 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b  .      continue;
e270: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
e280: 65 73 69 7a 65 49 6e 64 65 78 4f 62 6a 65 63 74  esizeIndexObject
e290: 28 64 62 2c 20 70 49 64 78 2c 20 70 49 64 78 2d  (db, pIdx, pIdx-
e2a0: 3e 6e 4b 65 79 43 6f 6c 2b 6e 29 20 29 20 72 65  >nKeyCol+n) ) re
e2b0: 74 75 72 6e 3b 0a 20 20 20 20 66 6f 72 28 69 3d  turn;.    for(i=
e2c0: 30 2c 20 6a 3d 70 49 64 78 2d 3e 6e 4b 65 79 43  0, j=pIdx->nKeyC
e2d0: 6f 6c 3b 20 69 3c 6e 50 6b 3b 20 69 2b 2b 29 7b  ol; i<nPk; i++){
e2e0: 0a 20 20 20 20 20 20 69 66 28 20 21 68 61 73 43  .      if( !hasC
e2f0: 6f 6c 75 6d 6e 28 70 49 64 78 2d 3e 61 69 43 6f  olumn(pIdx->aiCo
e300: 6c 75 6d 6e 2c 20 70 49 64 78 2d 3e 6e 4b 65 79  lumn, pIdx->nKey
e310: 43 6f 6c 2c 20 70 50 6b 2d 3e 61 69 43 6f 6c 75  Col, pPk->aiColu
e320: 6d 6e 5b 69 5d 29 20 29 7b 0a 20 20 20 20 20 20  mn[i]) ){.      
e330: 20 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e    pIdx->aiColumn
e340: 5b 6a 5d 20 3d 20 70 50 6b 2d 3e 61 69 43 6f 6c  [j] = pPk->aiCol
e350: 75 6d 6e 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20  umn[i];.        
e360: 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6a 5d 20  pIdx->azColl[j] 
e370: 3d 20 70 50 6b 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d  = pPk->azColl[i]
e380: 3b 0a 20 20 20 20 20 20 20 20 6a 2b 2b 3b 0a 20  ;.        j++;. 
e390: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
e3a0: 20 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e 6e   assert( pIdx->n
e3b0: 43 6f 6c 75 6d 6e 3e 3d 70 49 64 78 2d 3e 6e 4b  Column>=pIdx->nK
e3c0: 65 79 43 6f 6c 2b 6e 20 29 3b 0a 20 20 20 20 61  eyCol+n );.    a
e3d0: 73 73 65 72 74 28 20 70 49 64 78 2d 3e 6e 43 6f  ssert( pIdx->nCo
e3e0: 6c 75 6d 6e 3e 3d 6a 20 29 3b 0a 20 20 7d 0a 0a  lumn>=j );.  }..
e3f0: 20 20 2f 2a 20 41 64 64 20 61 6c 6c 20 74 61 62    /* Add all tab
e400: 6c 65 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 74 68  le columns to th
e410: 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 69 6e  e PRIMARY KEY in
e420: 64 65 78 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6e  dex.  */.  if( n
e430: 50 6b 3c 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 7b  Pk<pTab->nCol ){
e440: 0a 20 20 20 20 69 66 28 20 72 65 73 69 7a 65 49  .    if( resizeI
e450: 6e 64 65 78 4f 62 6a 65 63 74 28 64 62 2c 20 70  ndexObject(db, p
e460: 50 6b 2c 20 70 54 61 62 2d 3e 6e 43 6f 6c 29 20  Pk, pTab->nCol) 
e470: 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 66 6f  ) return;.    fo
e480: 72 28 69 3d 30 2c 20 6a 3d 6e 50 6b 3b 20 69 3c  r(i=0, j=nPk; i<
e490: 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29  pTab->nCol; i++)
e4a0: 7b 0a 20 20 20 20 20 20 69 66 28 20 21 68 61 73  {.      if( !has
e4b0: 43 6f 6c 75 6d 6e 28 70 50 6b 2d 3e 61 69 43 6f  Column(pPk->aiCo
e4c0: 6c 75 6d 6e 2c 20 6a 2c 20 69 29 20 29 7b 0a 20  lumn, j, i) ){. 
e4d0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6a         assert( j
e4e0: 3c 70 50 6b 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 3b  <pPk->nColumn );
e4f0: 0a 20 20 20 20 20 20 20 20 70 50 6b 2d 3e 61 69  .        pPk->ai
e500: 43 6f 6c 75 6d 6e 5b 6a 5d 20 3d 20 69 3b 0a 20  Column[j] = i;. 
e510: 20 20 20 20 20 20 20 70 50 6b 2d 3e 61 7a 43 6f         pPk->azCo
e520: 6c 6c 5b 6a 5d 20 3d 20 73 71 6c 69 74 65 33 53  ll[j] = sqlite3S
e530: 74 72 42 49 4e 41 52 59 3b 0a 20 20 20 20 20 20  trBINARY;.      
e540: 20 20 6a 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20    j++;.      }. 
e550: 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
e560: 20 70 50 6b 2d 3e 6e 43 6f 6c 75 6d 6e 3d 3d 6a   pPk->nColumn==j
e570: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
e580: 70 54 61 62 2d 3e 6e 43 6f 6c 3d 3d 6a 20 29 3b  pTab->nCol==j );
e590: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50  .  }else{.    pP
e5a0: 6b 2d 3e 6e 43 6f 6c 75 6d 6e 20 3d 20 70 54 61  k->nColumn = pTa
e5b0: 62 2d 3e 6e 43 6f 6c 3b 0a 20 20 7d 0a 7d 0a 0a  b->nCol;.  }.}..
e5c0: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
e5d0: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20  ne is called to 
e5e0: 72 65 70 6f 72 74 20 74 68 65 20 66 69 6e 61 6c  report the final
e5f0: 20 22 29 22 20 74 68 61 74 20 74 65 72 6d 69 6e   ")" that termin
e600: 61 74 65 73 0a 2a 2a 20 61 20 43 52 45 41 54 45  ates.** a CREATE
e610: 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74   TABLE statement
e620: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 61 62 6c  ..**.** The tabl
e630: 65 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74  e structure that
e640: 20 6f 74 68 65 72 20 61 63 74 69 6f 6e 20 72 6f   other action ro
e650: 75 74 69 6e 65 73 20 68 61 76 65 20 62 65 65 6e  utines have been
e660: 20 62 75 69 6c 64 69 6e 67 0a 2a 2a 20 69 73 20   building.** is 
e670: 61 64 64 65 64 20 74 6f 20 74 68 65 20 69 6e 74  added to the int
e680: 65 72 6e 61 6c 20 68 61 73 68 20 74 61 62 6c 65  ernal hash table
e690: 73 2c 20 61 73 73 75 6d 69 6e 67 20 6e 6f 20 65  s, assuming no e
e6a0: 72 72 6f 72 73 20 68 61 76 65 0a 2a 2a 20 6f 63  rrors have.** oc
e6b0: 63 75 72 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 6e  curred..**.** An
e6c0: 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20 74   entry for the t
e6d0: 61 62 6c 65 20 69 73 20 6d 61 64 65 20 69 6e 20  able is made in 
e6e0: 74 68 65 20 6d 61 73 74 65 72 20 74 61 62 6c 65  the master table
e6f0: 20 6f 6e 20 64 69 73 6b 2c 20 75 6e 6c 65 73 73   on disk, unless
e700: 0a 2a 2a 20 74 68 69 73 20 69 73 20 61 20 74 65  .** this is a te
e710: 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 6f 72  mporary table or
e720: 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d   db->init.busy==
e730: 31 2e 20 20 57 68 65 6e 20 64 62 2d 3e 69 6e 69  1.  When db->ini
e740: 74 2e 62 75 73 79 3d 3d 31 0a 2a 2a 20 69 74 20  t.busy==1.** it 
e750: 6d 65 61 6e 73 20 77 65 20 61 72 65 20 72 65 61  means we are rea
e760: 64 69 6e 67 20 74 68 65 20 73 71 6c 69 74 65 5f  ding the sqlite_
e770: 6d 61 73 74 65 72 20 74 61 62 6c 65 20 62 65 63  master table bec
e780: 61 75 73 65 20 77 65 20 6a 75 73 74 0a 2a 2a 20  ause we just.** 
e790: 63 6f 6e 6e 65 63 74 65 64 20 74 6f 20 74 68 65  connected to the
e7a0: 20 64 61 74 61 62 61 73 65 20 6f 72 20 62 65 63   database or bec
e7b0: 61 75 73 65 20 74 68 65 20 73 71 6c 69 74 65 5f  ause the sqlite_
e7c0: 6d 61 73 74 65 72 20 74 61 62 6c 65 20 68 61 73  master table has
e7d0: 0a 2a 2a 20 72 65 63 65 6e 74 6c 79 20 63 68 61  .** recently cha
e7e0: 6e 67 65 64 2c 20 73 6f 20 74 68 65 20 65 6e 74  nged, so the ent
e7f0: 72 79 20 66 6f 72 20 74 68 69 73 20 74 61 62 6c  ry for this tabl
e800: 65 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73  e already exists
e810: 20 69 6e 0a 2a 2a 20 74 68 65 20 73 71 6c 69 74   in.** the sqlit
e820: 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 2e 20  e_master table. 
e830: 20 57 65 20 64 6f 20 6e 6f 74 20 77 61 6e 74 20   We do not want 
e840: 74 6f 20 63 72 65 61 74 65 20 69 74 20 61 67 61  to create it aga
e850: 69 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  in..**.** If the
e860: 20 70 53 65 6c 65 63 74 20 61 72 67 75 6d 65 6e   pSelect argumen
e870: 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 69  t is not NULL, i
e880: 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 69  t means that thi
e890: 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 77 61 73  s routine.** was
e8a0: 20 63 61 6c 6c 65 64 20 74 6f 20 63 72 65 61 74   called to creat
e8b0: 65 20 61 20 74 61 62 6c 65 20 67 65 6e 65 72 61  e a table genera
e8c0: 74 65 64 20 66 72 6f 6d 20 61 20 0a 2a 2a 20 22  ted from a .** "
e8d0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 2e 2e 2e  CREATE TABLE ...
e8e0: 20 41 53 20 53 45 4c 45 43 54 20 2e 2e 2e 22 20   AS SELECT ..." 
e8f0: 73 74 61 74 65 6d 65 6e 74 2e 20 20 54 68 65 20  statement.  The 
e900: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 6f 66 0a  column names of.
e910: 2a 2a 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65  ** the new table
e920: 20 77 69 6c 6c 20 6d 61 74 63 68 20 74 68 65 20   will match the 
e930: 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68  result set of th
e940: 65 20 53 45 4c 45 43 54 2e 0a 2a 2f 0a 76 6f 69  e SELECT..*/.voi
e950: 64 20 73 71 6c 69 74 65 33 45 6e 64 54 61 62 6c  d sqlite3EndTabl
e960: 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  e(.  Parse *pPar
e970: 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  se,          /* 
e980: 50 61 72 73 65 20 63 6f 6e 74 65 78 74 20 2a 2f  Parse context */
e990: 0a 20 20 54 6f 6b 65 6e 20 2a 70 43 6f 6e 73 2c  .  Token *pCons,
e9a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
e9b0: 65 20 27 2c 27 20 74 6f 6b 65 6e 20 61 66 74 65  e ',' token afte
e9c0: 72 20 74 68 65 20 6c 61 73 74 20 63 6f 6c 75 6d  r the last colum
e9d0: 6e 20 64 65 66 6e 2e 20 2a 2f 0a 20 20 54 6f 6b  n defn. */.  Tok
e9e0: 65 6e 20 2a 70 45 6e 64 2c 20 20 20 20 20 20 20  en *pEnd,       
e9f0: 20 20 20 20 20 2f 2a 20 54 68 65 20 27 29 27 20       /* The ')' 
ea00: 62 65 66 6f 72 65 20 6f 70 74 69 6f 6e 73 20 69  before options i
ea10: 6e 20 74 68 65 20 43 52 45 41 54 45 20 54 41 42  n the CREATE TAB
ea20: 4c 45 20 2a 2f 0a 20 20 75 38 20 74 61 62 4f 70  LE */.  u8 tabOp
ea30: 74 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ts,             
ea40: 2f 2a 20 45 78 74 72 61 20 74 61 62 6c 65 20 6f  /* Extra table o
ea50: 70 74 69 6f 6e 73 2e 20 55 73 75 61 6c 6c 79 20  ptions. Usually 
ea60: 30 2e 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  0. */.  Select *
ea70: 70 53 65 6c 65 63 74 20 20 20 20 20 20 20 20 20  pSelect         
ea80: 2f 2a 20 53 65 6c 65 63 74 20 66 72 6f 6d 20 61  /* Select from a
ea90: 20 22 43 52 45 41 54 45 20 2e 2e 2e 20 41 53 20   "CREATE ... AS 
eaa0: 53 45 4c 45 43 54 22 20 2a 2f 0a 29 7b 0a 20 20  SELECT" */.){.  
eab0: 54 61 62 6c 65 20 2a 70 3b 20 20 20 20 20 20 20  Table *p;       
eac0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
ead0: 20 6e 65 77 20 74 61 62 6c 65 20 2a 2f 0a 20 20   new table */.  
eae0: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
eaf0: 61 72 73 65 2d 3e 64 62 3b 20 2f 2a 20 54 68 65  arse->db; /* The
eb00: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
eb10: 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 44  tion */.  int iD
eb20: 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
eb30: 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
eb40: 69 6e 20 77 68 69 63 68 20 74 68 65 20 74 61 62  in which the tab
eb50: 6c 65 20 6c 69 76 65 73 20 2a 2f 0a 20 20 49 6e  le lives */.  In
eb60: 64 65 78 20 2a 70 49 64 78 3b 20 20 20 20 20 20  dex *pIdx;      
eb70: 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 69 6d          /* An im
eb80: 70 6c 69 65 64 20 69 6e 64 65 78 20 6f 66 20 74  plied index of t
eb90: 68 65 20 74 61 62 6c 65 20 2a 2f 0a 0a 20 20 69  he table */..  i
eba0: 66 28 20 70 45 6e 64 3d 3d 30 20 26 26 20 70 53  f( pEnd==0 && pS
ebb0: 65 6c 65 63 74 3d 3d 30 20 29 7b 0a 20 20 20 20  elect==0 ){.    
ebc0: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 61 73  return;.  }.  as
ebd0: 73 65 72 74 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f  sert( !db->mallo
ebe0: 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 70 20 3d  cFailed );.  p =
ebf0: 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
ec00: 6c 65 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29  le;.  if( p==0 )
ec10: 20 72 65 74 75 72 6e 3b 0a 0a 20 20 61 73 73 65   return;..  asse
ec20: 72 74 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75  rt( !db->init.bu
ec30: 73 79 20 7c 7c 20 21 70 53 65 6c 65 63 74 20 29  sy || !pSelect )
ec40: 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 64  ;..  /* If the d
ec50: 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 69 73 20  b->init.busy is 
ec60: 31 20 69 74 20 6d 65 61 6e 73 20 77 65 20 61 72  1 it means we ar
ec70: 65 20 72 65 61 64 69 6e 67 20 74 68 65 20 53 51  e reading the SQ
ec80: 4c 20 6f 66 66 20 74 68 65 0a 20 20 2a 2a 20 22  L off the.  ** "
ec90: 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 22 20 6f  sqlite_master" o
eca0: 72 20 22 73 71 6c 69 74 65 5f 74 65 6d 70 5f 6d  r "sqlite_temp_m
ecb0: 61 73 74 65 72 22 20 74 61 62 6c 65 20 6f 6e 20  aster" table on 
ecc0: 74 68 65 20 64 69 73 6b 2e 0a 20 20 2a 2a 20 53  the disk..  ** S
ecd0: 6f 20 64 6f 20 6e 6f 74 20 77 72 69 74 65 20 74  o do not write t
ece0: 6f 20 74 68 65 20 64 69 73 6b 20 61 67 61 69 6e  o the disk again
ecf0: 2e 20 20 45 78 74 72 61 63 74 20 74 68 65 20 72  .  Extract the r
ed00: 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62 65 72 0a  oot page number.
ed10: 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 74 61 62    ** for the tab
ed20: 6c 65 20 66 72 6f 6d 20 74 68 65 20 64 62 2d 3e  le from the db->
ed30: 69 6e 69 74 2e 6e 65 77 54 6e 75 6d 20 66 69 65  init.newTnum fie
ed40: 6c 64 2e 20 20 28 54 68 65 20 70 61 67 65 20 6e  ld.  (The page n
ed50: 75 6d 62 65 72 0a 20 20 2a 2a 20 73 68 6f 75 6c  umber.  ** shoul
ed60: 64 20 68 61 76 65 20 62 65 65 6e 20 70 75 74 20  d have been put 
ed70: 74 68 65 72 65 20 62 79 20 74 68 65 20 73 71 6c  there by the sql
ed80: 69 74 65 4f 70 65 6e 43 62 20 72 6f 75 74 69 6e  iteOpenCb routin
ed90: 65 2e 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66  e.).  **.  ** If
eda0: 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6e   the root page n
edb0: 75 6d 62 65 72 20 69 73 20 31 2c 20 74 68 61 74  umber is 1, that
edc0: 20 6d 65 61 6e 73 20 74 68 69 73 20 69 73 20 74   means this is t
edd0: 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  he sqlite_master
ede0: 0a 20 20 2a 2a 20 74 61 62 6c 65 20 69 74 73 65  .  ** table itse
edf0: 6c 66 2e 20 20 53 6f 20 6d 61 72 6b 20 69 74 20  lf.  So mark it 
ee00: 72 65 61 64 2d 6f 6e 6c 79 2e 0a 20 20 2a 2f 0a  read-only..  */.
ee10: 20 20 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62    if( db->init.b
ee20: 75 73 79 20 29 7b 0a 20 20 20 20 70 2d 3e 74 6e  usy ){.    p->tn
ee30: 75 6d 20 3d 20 64 62 2d 3e 69 6e 69 74 2e 6e 65  um = db->init.ne
ee40: 77 54 6e 75 6d 3b 0a 20 20 20 20 69 66 28 20 70  wTnum;.    if( p
ee50: 2d 3e 74 6e 75 6d 3d 3d 31 20 29 20 70 2d 3e 74  ->tnum==1 ) p->t
ee60: 61 62 46 6c 61 67 73 20 7c 3d 20 54 46 5f 52 65  abFlags |= TF_Re
ee70: 61 64 6f 6e 6c 79 3b 0a 20 20 7d 0a 0a 20 20 2f  adonly;.  }..  /
ee80: 2a 20 53 70 65 63 69 61 6c 20 70 72 6f 63 65 73  * Special proces
ee90: 73 69 6e 67 20 66 6f 72 20 57 49 54 48 4f 55 54  sing for WITHOUT
eea0: 20 52 4f 57 49 44 20 54 61 62 6c 65 73 20 2a 2f   ROWID Tables */
eeb0: 0a 20 20 69 66 28 20 74 61 62 4f 70 74 73 20 26  .  if( tabOpts &
eec0: 20 54 46 5f 57 69 74 68 6f 75 74 52 6f 77 69 64   TF_WithoutRowid
eed0: 20 29 7b 0a 20 20 20 20 69 66 28 20 28 70 2d 3e   ){.    if( (p->
eee0: 74 61 62 46 6c 61 67 73 20 26 20 54 46 5f 41 75  tabFlags & TF_Au
eef0: 74 6f 69 6e 63 72 65 6d 65 6e 74 29 20 29 7b 0a  toincrement) ){.
ef00: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
ef10: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 0a 20 20  orMsg(pParse,.  
ef20: 20 20 20 20 20 20 20 20 22 41 55 54 4f 49 4e 43          "AUTOINC
ef30: 52 45 4d 45 4e 54 20 6e 6f 74 20 61 6c 6c 6f 77  REMENT not allow
ef40: 65 64 20 6f 6e 20 57 49 54 48 4f 55 54 20 52 4f  ed on WITHOUT RO
ef50: 57 49 44 20 74 61 62 6c 65 73 22 29 3b 0a 20 20  WID tables");.  
ef60: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
ef70: 7d 0a 20 20 20 20 69 66 28 20 28 70 2d 3e 74 61  }.    if( (p->ta
ef80: 62 46 6c 61 67 73 20 26 20 54 46 5f 48 61 73 50  bFlags & TF_HasP
ef90: 72 69 6d 61 72 79 4b 65 79 29 3d 3d 30 20 29 7b  rimaryKey)==0 ){
efa0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
efb0: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
efc0: 50 52 49 4d 41 52 59 20 4b 45 59 20 6d 69 73 73  PRIMARY KEY miss
efd0: 69 6e 67 20 6f 6e 20 74 61 62 6c 65 20 25 73 22  ing on table %s"
efe0: 2c 20 70 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  , p->zName);.   
eff0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 2d   }else{.      p-
f000: 3e 74 61 62 46 6c 61 67 73 20 7c 3d 20 54 46 5f  >tabFlags |= TF_
f010: 57 69 74 68 6f 75 74 52 6f 77 69 64 20 7c 20 54  WithoutRowid | T
f020: 46 5f 4e 6f 56 69 73 69 62 6c 65 52 6f 77 69 64  F_NoVisibleRowid
f030: 3b 0a 20 20 20 20 20 20 63 6f 6e 76 65 72 74 54  ;.      convertT
f040: 6f 57 69 74 68 6f 75 74 52 6f 77 69 64 54 61 62  oWithoutRowidTab
f050: 6c 65 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20  le(pParse, p);. 
f060: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 44 62 20     }.  }..  iDb 
f070: 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54  = sqlite3SchemaT
f080: 6f 49 6e 64 65 78 28 64 62 2c 20 70 2d 3e 70 53  oIndex(db, p->pS
f090: 63 68 65 6d 61 29 3b 0a 0a 23 69 66 6e 64 65 66  chema);..#ifndef
f0a0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 48 45   SQLITE_OMIT_CHE
f0b0: 43 4b 0a 20 20 2f 2a 20 52 65 73 6f 6c 76 65 20  CK.  /* Resolve 
f0c0: 6e 61 6d 65 73 20 69 6e 20 61 6c 6c 20 43 48 45  names in all CHE
f0d0: 43 4b 20 63 6f 6e 73 74 72 61 69 6e 74 20 65 78  CK constraint ex
f0e0: 70 72 65 73 73 69 6f 6e 73 2e 0a 20 20 2a 2f 0a  pressions..  */.
f0f0: 20 20 69 66 28 20 70 2d 3e 70 43 68 65 63 6b 20    if( p->pCheck 
f100: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65  ){.    sqlite3Re
f110: 73 6f 6c 76 65 53 65 6c 66 52 65 66 65 72 65 6e  solveSelfReferen
f120: 63 65 28 70 50 61 72 73 65 2c 20 70 2c 20 4e 43  ce(pParse, p, NC
f130: 5f 49 73 43 68 65 63 6b 2c 20 30 2c 20 70 2d 3e  _IsCheck, 0, p->
f140: 70 43 68 65 63 6b 29 3b 0a 20 20 7d 0a 23 65 6e  pCheck);.  }.#en
f150: 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28  dif /* !defined(
f160: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 48 45 43  SQLITE_OMIT_CHEC
f170: 4b 29 20 2a 2f 0a 0a 20 20 2f 2a 20 45 73 74 69  K) */..  /* Esti
f180: 6d 61 74 65 20 74 68 65 20 61 76 65 72 61 67 65  mate the average
f190: 20 72 6f 77 20 73 69 7a 65 20 66 6f 72 20 74 68   row size for th
f1a0: 65 20 74 61 62 6c 65 20 61 6e 64 20 66 6f 72 20  e table and for 
f1b0: 61 6c 6c 20 69 6d 70 6c 69 65 64 20 69 6e 64 69  all implied indi
f1c0: 63 65 73 20 2a 2f 0a 20 20 65 73 74 69 6d 61 74  ces */.  estimat
f1d0: 65 54 61 62 6c 65 57 69 64 74 68 28 70 29 3b 0a  eTableWidth(p);.
f1e0: 20 20 66 6f 72 28 70 49 64 78 3d 70 2d 3e 70 49    for(pIdx=p->pI
f1f0: 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78  ndex; pIdx; pIdx
f200: 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20  =pIdx->pNext){. 
f210: 20 20 20 65 73 74 69 6d 61 74 65 49 6e 64 65 78     estimateIndex
f220: 57 69 64 74 68 28 70 49 64 78 29 3b 0a 20 20 7d  Width(pIdx);.  }
f230: 0a 0a 20 20 2f 2a 20 49 66 20 6e 6f 74 20 69 6e  ..  /* If not in
f240: 69 74 69 61 6c 69 7a 69 6e 67 2c 20 74 68 65 6e  itializing, then
f250: 20 63 72 65 61 74 65 20 61 20 72 65 63 6f 72 64   create a record
f260: 20 66 6f 72 20 74 68 65 20 6e 65 77 20 74 61 62   for the new tab
f270: 6c 65 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 53  le.  ** in the S
f280: 51 4c 49 54 45 5f 4d 41 53 54 45 52 20 74 61 62  QLITE_MASTER tab
f290: 6c 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  le of the databa
f2a0: 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66  se..  **.  ** If
f2b0: 20 74 68 69 73 20 69 73 20 61 20 54 45 4d 50 4f   this is a TEMPO
f2c0: 52 41 52 59 20 74 61 62 6c 65 2c 20 77 72 69 74  RARY table, writ
f2d0: 65 20 74 68 65 20 65 6e 74 72 79 20 69 6e 74 6f  e the entry into
f2e0: 20 74 68 65 20 61 75 78 69 6c 69 61 72 79 0a 20   the auxiliary. 
f2f0: 20 2a 2a 20 66 69 6c 65 20 69 6e 73 74 65 61 64   ** file instead
f300: 20 6f 66 20 69 6e 74 6f 20 74 68 65 20 6d 61 69   of into the mai
f310: 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  n database file.
f320: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 64 62 2d  .  */.  if( !db-
f330: 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20 20  >init.busy ){.  
f340: 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 56 64 62    int n;.    Vdb
f350: 65 20 2a 76 3b 0a 20 20 20 20 63 68 61 72 20 2a  e *v;.    char *
f360: 7a 54 79 70 65 3b 20 20 20 20 2f 2a 20 22 76 69  zType;    /* "vi
f370: 65 77 22 20 6f 72 20 22 74 61 62 6c 65 22 20 2a  ew" or "table" *
f380: 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 54 79 70  /.    char *zTyp
f390: 65 32 3b 20 20 20 2f 2a 20 22 56 49 45 57 22 20  e2;   /* "VIEW" 
f3a0: 6f 72 20 22 54 41 42 4c 45 22 20 2a 2f 0a 20 20  or "TABLE" */.  
f3b0: 20 20 63 68 61 72 20 2a 7a 53 74 6d 74 3b 20 20    char *zStmt;  
f3c0: 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 74 68 65    /* Text of the
f3d0: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 6f 72   CREATE TABLE or
f3e0: 20 43 52 45 41 54 45 20 56 49 45 57 20 73 74 61   CREATE VIEW sta
f3f0: 74 65 6d 65 6e 74 20 2a 2f 0a 0a 20 20 20 20 76  tement */..    v
f400: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
f410: 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 69  e(pParse);.    i
f420: 66 28 20 4e 45 56 45 52 28 76 3d 3d 30 29 20 29  f( NEVER(v==0) )
f430: 20 72 65 74 75 72 6e 3b 0a 0a 20 20 20 20 73 71   return;..    sq
f440: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
f450: 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 30 29 3b  v, OP_Close, 0);
f460: 0a 0a 20 20 20 20 2f 2a 20 0a 20 20 20 20 2a 2a  ..    /* .    **
f470: 20 49 6e 69 74 69 61 6c 69 7a 65 20 7a 54 79 70   Initialize zTyp
f480: 65 20 66 6f 72 20 74 68 65 20 6e 65 77 20 76 69  e for the new vi
f490: 65 77 20 6f 72 20 74 61 62 6c 65 2e 0a 20 20 20  ew or table..   
f4a0: 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 70   */.    if( p->p
f4b0: 53 65 6c 65 63 74 3d 3d 30 20 29 7b 0a 20 20 20  Select==0 ){.   
f4c0: 20 20 20 2f 2a 20 41 20 72 65 67 75 6c 61 72 20     /* A regular 
f4d0: 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 7a  table */.      z
f4e0: 54 79 70 65 20 3d 20 22 74 61 62 6c 65 22 3b 0a  Type = "table";.
f4f0: 20 20 20 20 20 20 7a 54 79 70 65 32 20 3d 20 22        zType2 = "
f500: 54 41 42 4c 45 22 3b 0a 23 69 66 6e 64 65 66 20  TABLE";.#ifndef 
f510: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57  SQLITE_OMIT_VIEW
f520: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
f530: 20 20 2f 2a 20 41 20 76 69 65 77 20 2a 2f 0a 20    /* A view */. 
f540: 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22 76 69       zType = "vi
f550: 65 77 22 3b 0a 20 20 20 20 20 20 7a 54 79 70 65  ew";.      zType
f560: 32 20 3d 20 22 56 49 45 57 22 3b 0a 23 65 6e 64  2 = "VIEW";.#end
f570: 69 66 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  if.    }..    /*
f580: 20 49 66 20 74 68 69 73 20 69 73 20 61 20 43 52   If this is a CR
f590: 45 41 54 45 20 54 41 42 4c 45 20 78 78 20 41 53  EATE TABLE xx AS
f5a0: 20 53 45 4c 45 43 54 20 2e 2e 2e 2c 20 65 78 65   SELECT ..., exe
f5b0: 63 75 74 65 20 74 68 65 20 53 45 4c 45 43 54 0a  cute the SELECT.
f5c0: 20 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74      ** statement
f5d0: 20 74 6f 20 70 6f 70 75 6c 61 74 65 20 74 68 65   to populate the
f5e0: 20 6e 65 77 20 74 61 62 6c 65 2e 20 54 68 65 20   new table. The 
f5f0: 72 6f 6f 74 2d 70 61 67 65 20 6e 75 6d 62 65 72  root-page number
f600: 20 66 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a 20   for the.    ** 
f610: 6e 65 77 20 74 61 62 6c 65 20 69 73 20 69 6e 20  new table is in 
f620: 72 65 67 69 73 74 65 72 20 70 50 61 72 73 65 2d  register pParse-
f630: 3e 72 65 67 52 6f 6f 74 2e 0a 20 20 20 20 2a 2a  >regRoot..    **
f640: 0a 20 20 20 20 2a 2a 20 4f 6e 63 65 20 74 68 65  .    ** Once the
f650: 20 53 45 4c 45 43 54 20 68 61 73 20 62 65 65 6e   SELECT has been
f660: 20 63 6f 64 65 64 20 62 79 20 73 71 6c 69 74 65   coded by sqlite
f670: 33 53 65 6c 65 63 74 28 29 2c 20 69 74 20 69 73  3Select(), it is
f680: 20 69 6e 20 61 0a 20 20 20 20 2a 2a 20 73 75 69   in a.    ** sui
f690: 74 61 62 6c 65 20 73 74 61 74 65 20 74 6f 20 71  table state to q
f6a0: 75 65 72 79 20 66 6f 72 20 74 68 65 20 63 6f 6c  uery for the col
f6b0: 75 6d 6e 20 6e 61 6d 65 73 20 61 6e 64 20 74 79  umn names and ty
f6c0: 70 65 73 20 74 6f 20 62 65 20 75 73 65 64 0a 20  pes to be used. 
f6d0: 20 20 20 2a 2a 20 62 79 20 74 68 65 20 6e 65 77     ** by the new
f6e0: 20 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20   table..    **. 
f6f0: 20 20 20 2a 2a 20 41 20 73 68 61 72 65 64 2d 63     ** A shared-c
f700: 61 63 68 65 20 77 72 69 74 65 2d 6c 6f 63 6b 20  ache write-lock 
f710: 69 73 20 6e 6f 74 20 72 65 71 75 69 72 65 64 20  is not required 
f720: 74 6f 20 77 72 69 74 65 20 74 6f 20 74 68 65 20  to write to the 
f730: 6e 65 77 20 74 61 62 6c 65 2c 0a 20 20 20 20 2a  new table,.    *
f740: 2a 20 61 73 20 61 20 73 63 68 65 6d 61 2d 6c 6f  * as a schema-lo
f750: 63 6b 20 6d 75 73 74 20 68 61 76 65 20 61 6c 72  ck must have alr
f760: 65 61 64 79 20 62 65 65 6e 20 6f 62 74 61 69 6e  eady been obtain
f770: 65 64 20 74 6f 20 63 72 65 61 74 65 20 69 74 2e  ed to create it.
f780: 20 53 69 6e 63 65 0a 20 20 20 20 2a 2a 20 61 20   Since.    ** a 
f790: 73 63 68 65 6d 61 2d 6c 6f 63 6b 20 65 78 63 6c  schema-lock excl
f7a0: 75 64 65 73 20 61 6c 6c 20 6f 74 68 65 72 20 64  udes all other d
f7b0: 61 74 61 62 61 73 65 20 75 73 65 72 73 2c 20 74  atabase users, t
f7c0: 68 65 20 77 72 69 74 65 2d 6c 6f 63 6b 20 77 6f  he write-lock wo
f7d0: 75 6c 64 0a 20 20 20 20 2a 2a 20 62 65 20 72 65  uld.    ** be re
f7e0: 64 75 6e 64 61 6e 74 2e 0a 20 20 20 20 2a 2f 0a  dundant..    */.
f7f0: 20 20 20 20 69 66 28 20 70 53 65 6c 65 63 74 20      if( pSelect 
f800: 29 7b 0a 20 20 20 20 20 20 53 65 6c 65 63 74 44  ){.      SelectD
f810: 65 73 74 20 64 65 73 74 3b 20 20 20 20 2f 2a 20  est dest;    /* 
f820: 57 68 65 72 65 20 74 68 65 20 53 45 4c 45 43 54  Where the SELECT
f830: 20 73 68 6f 75 6c 64 20 73 74 6f 72 65 20 72 65   should store re
f840: 73 75 6c 74 73 20 2a 2f 0a 20 20 20 20 20 20 69  sults */.      i
f850: 6e 74 20 72 65 67 59 69 65 6c 64 3b 20 20 20 20  nt regYield;    
f860: 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 68     /* Register h
f870: 6f 6c 64 69 6e 67 20 63 6f 2d 72 6f 75 74 69 6e  olding co-routin
f880: 65 20 65 6e 74 72 79 2d 70 6f 69 6e 74 20 2a 2f  e entry-point */
f890: 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 54  .      int addrT
f8a0: 6f 70 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 6f  op;        /* To
f8b0: 70 20 6f 66 20 74 68 65 20 63 6f 2d 72 6f 75 74  p of the co-rout
f8c0: 69 6e 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  ine */.      int
f8d0: 20 72 65 67 52 65 63 3b 20 20 20 20 20 20 20 20   regRec;        
f8e0: 20 2f 2a 20 41 20 72 65 63 6f 72 64 20 74 6f 20   /* A record to 
f8f0: 62 65 20 69 6e 73 65 72 74 20 69 6e 74 6f 20 74  be insert into t
f900: 68 65 20 6e 65 77 20 74 61 62 6c 65 20 2a 2f 0a  he new table */.
f910: 20 20 20 20 20 20 69 6e 74 20 72 65 67 52 6f 77        int regRow
f920: 69 64 3b 20 20 20 20 20 20 20 2f 2a 20 52 6f 77  id;       /* Row
f930: 69 64 20 6f 66 20 74 68 65 20 6e 65 78 74 20 72  id of the next r
f940: 6f 77 20 74 6f 20 69 6e 73 65 72 74 20 2a 2f 0a  ow to insert */.
f950: 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 49 6e        int addrIn
f960: 73 4c 6f 6f 70 3b 20 20 20 20 2f 2a 20 54 6f 70  sLoop;    /* Top
f970: 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 66 6f 72   of the loop for
f980: 20 69 6e 73 65 72 74 69 6e 67 20 72 6f 77 73 20   inserting rows 
f990: 2a 2f 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a  */.      Table *
f9a0: 70 53 65 6c 54 61 62 3b 20 20 20 20 20 2f 2a 20  pSelTab;     /* 
f9b0: 41 20 74 61 62 6c 65 20 74 68 61 74 20 64 65 73  A table that des
f9c0: 63 72 69 62 65 73 20 74 68 65 20 53 45 4c 45 43  cribes the SELEC
f9d0: 54 20 72 65 73 75 6c 74 73 20 2a 2f 0a 0a 20 20  T results */..  
f9e0: 20 20 20 20 72 65 67 59 69 65 6c 64 20 3d 20 2b      regYield = +
f9f0: 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
fa00: 20 20 20 20 20 72 65 67 52 65 63 20 3d 20 2b 2b       regRec = ++
fa10: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
fa20: 20 20 20 20 72 65 67 52 6f 77 69 64 20 3d 20 2b      regRowid = +
fa30: 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
fa40: 20 20 20 20 20 61 73 73 65 72 74 28 70 50 61 72       assert(pPar
fa50: 73 65 2d 3e 6e 54 61 62 3d 3d 31 29 3b 0a 20 20  se->nTab==1);.  
fa60: 20 20 20 20 73 71 6c 69 74 65 33 4d 61 79 41 62      sqlite3MayAb
fa70: 6f 72 74 28 70 50 61 72 73 65 29 3b 0a 20 20 20  ort(pParse);.   
fa80: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
fa90: 64 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 57  dOp3(v, OP_OpenW
faa0: 72 69 74 65 2c 20 31 2c 20 70 50 61 72 73 65 2d  rite, 1, pParse-
fab0: 3e 72 65 67 52 6f 6f 74 2c 20 69 44 62 29 3b 0a  >regRoot, iDb);.
fac0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
fad0: 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46  eChangeP5(v, OPF
fae0: 4c 41 47 5f 50 32 49 53 52 45 47 29 3b 0a 20 20  LAG_P2ISREG);.  
faf0: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 54 61 62      pParse->nTab
fb00: 20 3d 20 32 3b 0a 20 20 20 20 20 20 61 64 64 72   = 2;.      addr
fb10: 54 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62  Top = sqlite3Vdb
fb20: 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 20  eCurrentAddr(v) 
fb30: 2b 20 31 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  + 1;.      sqlit
fb40: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
fb50: 4f 50 5f 49 6e 69 74 43 6f 72 6f 75 74 69 6e 65  OP_InitCoroutine
fb60: 2c 20 72 65 67 59 69 65 6c 64 2c 20 30 2c 20 61  , regYield, 0, a
fb70: 64 64 72 54 6f 70 29 3b 0a 20 20 20 20 20 20 73  ddrTop);.      s
fb80: 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73 74  qlite3SelectDest
fb90: 49 6e 69 74 28 26 64 65 73 74 2c 20 53 52 54 5f  Init(&dest, SRT_
fba0: 43 6f 72 6f 75 74 69 6e 65 2c 20 72 65 67 59 69  Coroutine, regYi
fbb0: 65 6c 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  eld);.      sqli
fbc0: 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65  te3Select(pParse
fbd0: 2c 20 70 53 65 6c 65 63 74 2c 20 26 64 65 73 74  , pSelect, &dest
fbe0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
fbf0: 56 64 62 65 45 6e 64 43 6f 72 6f 75 74 69 6e 65  VdbeEndCoroutine
fc00: 28 76 2c 20 72 65 67 59 69 65 6c 64 29 3b 0a 20  (v, regYield);. 
fc10: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
fc20: 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
fc30: 54 6f 70 20 2d 20 31 29 3b 0a 20 20 20 20 20 20  Top - 1);.      
fc40: 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  if( pParse->nErr
fc50: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20   ) return;.     
fc60: 20 70 53 65 6c 54 61 62 20 3d 20 73 71 6c 69 74   pSelTab = sqlit
fc70: 65 33 52 65 73 75 6c 74 53 65 74 4f 66 53 65 6c  e3ResultSetOfSel
fc80: 65 63 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c  ect(pParse, pSel
fc90: 65 63 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ect);.      if( 
fca0: 70 53 65 6c 54 61 62 3d 3d 30 20 29 20 72 65 74  pSelTab==0 ) ret
fcb0: 75 72 6e 3b 0a 20 20 20 20 20 20 61 73 73 65 72  urn;.      asser
fcc0: 74 28 20 70 2d 3e 61 43 6f 6c 3d 3d 30 20 29 3b  t( p->aCol==0 );
fcd0: 0a 20 20 20 20 20 20 70 2d 3e 6e 43 6f 6c 20 3d  .      p->nCol =
fce0: 20 70 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c 3b 0a   pSelTab->nCol;.
fcf0: 20 20 20 20 20 20 70 2d 3e 61 43 6f 6c 20 3d 20        p->aCol = 
fd00: 70 53 65 6c 54 61 62 2d 3e 61 43 6f 6c 3b 0a 20  pSelTab->aCol;. 
fd10: 20 20 20 20 20 70 53 65 6c 54 61 62 2d 3e 6e 43       pSelTab->nC
fd20: 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 53  ol = 0;.      pS
fd30: 65 6c 54 61 62 2d 3e 61 43 6f 6c 20 3d 20 30 3b  elTab->aCol = 0;
fd40: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65  .      sqlite3De
fd50: 6c 65 74 65 54 61 62 6c 65 28 64 62 2c 20 70 53  leteTable(db, pS
fd60: 65 6c 54 61 62 29 3b 0a 20 20 20 20 20 20 61 64  elTab);.      ad
fd70: 64 72 49 6e 73 4c 6f 6f 70 20 3d 20 73 71 6c 69  drInsLoop = sqli
fd80: 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
fd90: 20 4f 50 5f 59 69 65 6c 64 2c 20 64 65 73 74 2e   OP_Yield, dest.
fda0: 69 53 44 50 61 72 6d 29 3b 0a 20 20 20 20 20 20  iSDParm);.      
fdb0: 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
fdc0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
fdd0: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d  beAddOp3(v, OP_M
fde0: 61 6b 65 52 65 63 6f 72 64 2c 20 64 65 73 74 2e  akeRecord, dest.
fdf0: 69 53 64 73 74 2c 20 64 65 73 74 2e 6e 53 64 73  iSdst, dest.nSds
fe00: 74 2c 20 72 65 67 52 65 63 29 3b 0a 20 20 20 20  t, regRec);.    
fe10: 20 20 73 71 6c 69 74 65 33 54 61 62 6c 65 41 66    sqlite3TableAf
fe20: 66 69 6e 69 74 79 28 76 2c 20 70 2c 20 30 29 3b  finity(v, p, 0);
fe30: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
fe40: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
fe50: 65 77 52 6f 77 69 64 2c 20 31 2c 20 72 65 67 52  ewRowid, 1, regR
fe60: 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 73 71 6c  owid);.      sql
fe70: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
fe80: 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20 31 2c 20  , OP_Insert, 1, 
fe90: 72 65 67 52 65 63 2c 20 72 65 67 52 6f 77 69 64  regRec, regRowid
fea0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
feb0: 56 64 62 65 47 6f 74 6f 28 76 2c 20 61 64 64 72  VdbeGoto(v, addr
fec0: 49 6e 73 4c 6f 6f 70 29 3b 0a 20 20 20 20 20 20  InsLoop);.      
fed0: 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
fee0: 65 72 65 28 76 2c 20 61 64 64 72 49 6e 73 4c 6f  ere(v, addrInsLo
fef0: 6f 70 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  op);.      sqlit
ff00: 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
ff10: 4f 50 5f 43 6c 6f 73 65 2c 20 31 29 3b 0a 20 20  OP_Close, 1);.  
ff20: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d 70    }..    /* Comp
ff30: 75 74 65 20 74 68 65 20 63 6f 6d 70 6c 65 74 65  ute the complete
ff40: 20 74 65 78 74 20 6f 66 20 74 68 65 20 43 52 45   text of the CRE
ff50: 41 54 45 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  ATE statement */
ff60: 0a 20 20 20 20 69 66 28 20 70 53 65 6c 65 63 74  .    if( pSelect
ff70: 20 29 7b 0a 20 20 20 20 20 20 7a 53 74 6d 74 20   ){.      zStmt 
ff80: 3d 20 63 72 65 61 74 65 54 61 62 6c 65 53 74 6d  = createTableStm
ff90: 74 28 64 62 2c 20 70 29 3b 0a 20 20 20 20 7d 65  t(db, p);.    }e
ffa0: 6c 73 65 7b 0a 20 20 20 20 20 20 54 6f 6b 65 6e  lse{.      Token
ffb0: 20 2a 70 45 6e 64 32 20 3d 20 74 61 62 4f 70 74   *pEnd2 = tabOpt
ffc0: 73 20 3f 20 26 70 50 61 72 73 65 2d 3e 73 4c 61  s ? &pParse->sLa
ffd0: 73 74 54 6f 6b 65 6e 20 3a 20 70 45 6e 64 3b 0a  stToken : pEnd;.
ffe0: 20 20 20 20 20 20 6e 20 3d 20 28 69 6e 74 29 28        n = (int)(
fff0: 70 45 6e 64 32 2d 3e 7a 20 2d 20 70 50 61 72 73  pEnd2->z - pPars
10000 65 2d 3e 73 4e 61 6d 65 54 6f 6b 65 6e 2e 7a 29  e->sNameToken.z)
10010 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45 6e 64  ;.      if( pEnd
10020 32 2d 3e 7a 5b 30 5d 21 3d 27 3b 27 20 29 20 6e  2->z[0]!=';' ) n
10030 20 2b 3d 20 70 45 6e 64 32 2d 3e 6e 3b 0a 20 20   += pEnd2->n;.  
10040 20 20 20 20 7a 53 74 6d 74 20 3d 20 73 71 6c 69      zStmt = sqli
10050 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 0a  te3MPrintf(db, .
10060 20 20 20 20 20 20 20 20 20 20 22 43 52 45 41 54            "CREAT
10070 45 20 25 73 20 25 2e 2a 73 22 2c 20 7a 54 79 70  E %s %.*s", zTyp
10080 65 32 2c 20 6e 2c 20 70 50 61 72 73 65 2d 3e 73  e2, n, pParse->s
10090 4e 61 6d 65 54 6f 6b 65 6e 2e 7a 0a 20 20 20 20  NameToken.z.    
100a0 20 20 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20    );.    }..    
100b0 2f 2a 20 41 20 73 6c 6f 74 20 66 6f 72 20 74 68  /* A slot for th
100c0 65 20 72 65 63 6f 72 64 20 68 61 73 20 61 6c 72  e record has alr
100d0 65 61 64 79 20 62 65 65 6e 20 61 6c 6c 6f 63 61  eady been alloca
100e0 74 65 64 20 69 6e 20 74 68 65 20 0a 20 20 20 20  ted in the .    
100f0 2a 2a 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52  ** SQLITE_MASTER
10100 20 74 61 62 6c 65 2e 20 20 57 65 20 6a 75 73 74   table.  We just
10110 20 6e 65 65 64 20 74 6f 20 75 70 64 61 74 65 20   need to update 
10120 74 68 61 74 20 73 6c 6f 74 20 77 69 74 68 20 61  that slot with a
10130 6c 6c 0a 20 20 20 20 2a 2a 20 74 68 65 20 69 6e  ll.    ** the in
10140 66 6f 72 6d 61 74 69 6f 6e 20 77 65 27 76 65 20  formation we've 
10150 63 6f 6c 6c 65 63 74 65 64 2e 0a 20 20 20 20 2a  collected..    *
10160 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 4e 65 73  /.    sqlite3Nes
10170 74 65 64 50 61 72 73 65 28 70 50 61 72 73 65 2c  tedParse(pParse,
10180 0a 20 20 20 20 20 20 22 55 50 44 41 54 45 20 25  .      "UPDATE %
10190 51 2e 25 73 20 22 0a 20 20 20 20 20 20 20 20 20  Q.%s ".         
101a0 22 53 45 54 20 74 79 70 65 3d 27 25 73 27 2c 20  "SET type='%s', 
101b0 6e 61 6d 65 3d 25 51 2c 20 74 62 6c 5f 6e 61 6d  name=%Q, tbl_nam
101c0 65 3d 25 51 2c 20 72 6f 6f 74 70 61 67 65 3d 23  e=%Q, rootpage=#
101d0 25 64 2c 20 73 71 6c 3d 25 51 20 22 0a 20 20 20  %d, sql=%Q ".   
101e0 20 20 20 20 22 57 48 45 52 45 20 72 6f 77 69 64      "WHERE rowid
101f0 3d 23 25 64 22 2c 0a 20 20 20 20 20 20 64 62 2d  =#%d",.      db-
10200 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 2c  >aDb[iDb].zName,
10210 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 44   SCHEMA_TABLE(iD
10220 62 29 2c 0a 20 20 20 20 20 20 7a 54 79 70 65 2c  b),.      zType,
10230 0a 20 20 20 20 20 20 70 2d 3e 7a 4e 61 6d 65 2c  .      p->zName,
10240 0a 20 20 20 20 20 20 70 2d 3e 7a 4e 61 6d 65 2c  .      p->zName,
10250 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 72  .      pParse->r
10260 65 67 52 6f 6f 74 2c 0a 20 20 20 20 20 20 7a 53  egRoot,.      zS
10270 74 6d 74 2c 0a 20 20 20 20 20 20 70 50 61 72 73  tmt,.      pPars
10280 65 2d 3e 72 65 67 52 6f 77 69 64 0a 20 20 20 20  e->regRowid.    
10290 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  );.    sqlite3Db
102a0 46 72 65 65 28 64 62 2c 20 7a 53 74 6d 74 29 3b  Free(db, zStmt);
102b0 0a 20 20 20 20 73 71 6c 69 74 65 33 43 68 61 6e  .    sqlite3Chan
102c0 67 65 43 6f 6f 6b 69 65 28 70 50 61 72 73 65 2c  geCookie(pParse,
102d0 20 69 44 62 29 3b 0a 0a 23 69 66 6e 64 65 66 20   iDb);..#ifndef 
102e0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
102f0 49 4e 43 52 45 4d 45 4e 54 0a 20 20 20 20 2f 2a  INCREMENT.    /*
10300 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   Check to see if
10310 20 77 65 20 6e 65 65 64 20 74 6f 20 63 72 65 61   we need to crea
10320 74 65 20 61 6e 20 73 71 6c 69 74 65 5f 73 65 71  te an sqlite_seq
10330 75 65 6e 63 65 20 74 61 62 6c 65 20 66 6f 72 0a  uence table for.
10340 20 20 20 20 2a 2a 20 6b 65 65 70 69 6e 67 20 74      ** keeping t
10350 72 61 63 6b 20 6f 66 20 61 75 74 6f 69 6e 63 72  rack of autoincr
10360 65 6d 65 6e 74 20 6b 65 79 73 2e 0a 20 20 20 20  ement keys..    
10370 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 74 61  */.    if( p->ta
10380 62 46 6c 61 67 73 20 26 20 54 46 5f 41 75 74 6f  bFlags & TF_Auto
10390 69 6e 63 72 65 6d 65 6e 74 20 29 7b 0a 20 20 20  increment ){.   
103a0 20 20 20 44 62 20 2a 70 44 62 20 3d 20 26 64 62     Db *pDb = &db
103b0 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a 20 20 20 20  ->aDb[iDb];.    
103c0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
103d0 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64  3SchemaMutexHeld
103e0 28 64 62 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a  (db, iDb, 0) );.
103f0 20 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e 70        if( pDb->p
10400 53 63 68 65 6d 61 2d 3e 70 53 65 71 54 61 62 3d  Schema->pSeqTab=
10410 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  =0 ){.        sq
10420 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72 73 65  lite3NestedParse
10430 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20  (pParse,.       
10440 20 20 20 22 43 52 45 41 54 45 20 54 41 42 4c 45     "CREATE TABLE
10450 20 25 51 2e 73 71 6c 69 74 65 5f 73 65 71 75 65   %Q.sqlite_seque
10460 6e 63 65 28 6e 61 6d 65 2c 73 65 71 29 22 2c 0a  nce(name,seq)",.
10470 20 20 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a            pDb->z
10480 4e 61 6d 65 0a 20 20 20 20 20 20 20 20 29 3b 0a  Name.        );.
10490 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65        }.    }.#e
104a0 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 52 65 70  ndif..    /* Rep
104b0 61 72 73 65 20 65 76 65 72 79 74 68 69 6e 67 20  arse everything 
104c0 74 6f 20 75 70 64 61 74 65 20 6f 75 72 20 69 6e  to update our in
104d0 74 65 72 6e 61 6c 20 64 61 74 61 20 73 74 72 75  ternal data stru
104e0 63 74 75 72 65 73 20 2a 2f 0a 20 20 20 20 73 71  ctures */.    sq
104f0 6c 69 74 65 33 56 64 62 65 41 64 64 50 61 72 73  lite3VdbeAddPars
10500 65 53 63 68 65 6d 61 4f 70 28 76 2c 20 69 44 62  eSchemaOp(v, iDb
10510 2c 0a 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  ,.           sql
10520 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20  ite3MPrintf(db, 
10530 22 74 62 6c 5f 6e 61 6d 65 3d 27 25 71 27 20 41  "tbl_name='%q' A
10540 4e 44 20 74 79 70 65 21 3d 27 74 72 69 67 67 65  ND type!='trigge
10550 72 27 22 2c 20 70 2d 3e 7a 4e 61 6d 65 29 29 3b  r'", p->zName));
10560 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20 41 64 64 20  .  }...  /* Add 
10570 74 68 65 20 74 61 62 6c 65 20 74 6f 20 74 68 65  the table to the
10580 20 69 6e 2d 6d 65 6d 6f 72 79 20 72 65 70 72 65   in-memory repre
10590 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65  sentation of the
105a0 20 64 61 74 61 62 61 73 65 2e 0a 20 20 2a 2f 0a   database..  */.
105b0 20 20 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62    if( db->init.b
105c0 75 73 79 20 29 7b 0a 20 20 20 20 54 61 62 6c 65  usy ){.    Table
105d0 20 2a 70 4f 6c 64 3b 0a 20 20 20 20 53 63 68 65   *pOld;.    Sche
105e0 6d 61 20 2a 70 53 63 68 65 6d 61 20 3d 20 70 2d  ma *pSchema = p-
105f0 3e 70 53 63 68 65 6d 61 3b 0a 20 20 20 20 61 73  >pSchema;.    as
10600 73 65 72 74 28 20 73 71 6c 69 74 65 33 53 63 68  sert( sqlite3Sch
10610 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c  emaMutexHeld(db,
10620 20 69 44 62 2c 20 30 29 20 29 3b 0a 20 20 20 20   iDb, 0) );.    
10630 70 4f 6c 64 20 3d 20 73 71 6c 69 74 65 33 48 61  pOld = sqlite3Ha
10640 73 68 49 6e 73 65 72 74 28 26 70 53 63 68 65 6d  shInsert(&pSchem
10650 61 2d 3e 74 62 6c 48 61 73 68 2c 20 70 2d 3e 7a  a->tblHash, p->z
10660 4e 61 6d 65 2c 20 70 29 3b 0a 20 20 20 20 69 66  Name, p);.    if
10670 28 20 70 4f 6c 64 20 29 7b 0a 20 20 20 20 20 20  ( pOld ){.      
10680 61 73 73 65 72 74 28 20 70 3d 3d 70 4f 6c 64 20  assert( p==pOld 
10690 29 3b 20 20 2f 2a 20 4d 61 6c 6c 6f 63 20 6d 75  );  /* Malloc mu
106a0 73 74 20 68 61 76 65 20 66 61 69 6c 65 64 20 69  st have failed i
106b0 6e 73 69 64 65 20 48 61 73 68 49 6e 73 65 72 74  nside HashInsert
106c0 28 29 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69  () */.      sqli
106d0 74 65 33 4f 6f 6d 46 61 75 6c 74 28 64 62 29 3b  te3OomFault(db);
106e0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  .      return;. 
106f0 20 20 20 7d 0a 20 20 20 20 70 50 61 72 73 65 2d     }.    pParse-
10700 3e 70 4e 65 77 54 61 62 6c 65 20 3d 20 30 3b 0a  >pNewTable = 0;.
10710 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d      db->flags |=
10720 20 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68   SQLITE_InternCh
10730 61 6e 67 65 73 3b 0a 0a 23 69 66 6e 64 65 66 20  anges;..#ifndef 
10740 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 4c 54 45  SQLITE_OMIT_ALTE
10750 52 54 41 42 4c 45 0a 20 20 20 20 69 66 28 20 21  RTABLE.    if( !
10760 70 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20  p->pSelect ){.  
10770 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
10780 7a 4e 61 6d 65 20 3d 20 28 63 6f 6e 73 74 20 63  zName = (const c
10790 68 61 72 20 2a 29 70 50 61 72 73 65 2d 3e 73 4e  har *)pParse->sN
107a0 61 6d 65 54 6f 6b 65 6e 2e 7a 3b 0a 20 20 20 20  ameToken.z;.    
107b0 20 20 69 6e 74 20 6e 4e 61 6d 65 3b 0a 20 20 20    int nName;.   
107c0 20 20 20 61 73 73 65 72 74 28 20 21 70 53 65 6c     assert( !pSel
107d0 65 63 74 20 26 26 20 70 43 6f 6e 73 20 26 26 20  ect && pCons && 
107e0 70 45 6e 64 20 29 3b 0a 20 20 20 20 20 20 69 66  pEnd );.      if
107f0 28 20 70 43 6f 6e 73 2d 3e 7a 3d 3d 30 20 29 7b  ( pCons->z==0 ){
10800 0a 20 20 20 20 20 20 20 20 70 43 6f 6e 73 20 3d  .        pCons =
10810 20 70 45 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20   pEnd;.      }. 
10820 20 20 20 20 20 6e 4e 61 6d 65 20 3d 20 28 69 6e       nName = (in
10830 74 29 28 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  t)((const char *
10840 29 70 43 6f 6e 73 2d 3e 7a 20 2d 20 7a 4e 61 6d  )pCons->z - zNam
10850 65 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61 64 64  e);.      p->add
10860 43 6f 6c 4f 66 66 73 65 74 20 3d 20 31 33 20 2b  ColOffset = 13 +
10870 20 73 71 6c 69 74 65 33 55 74 66 38 43 68 61 72   sqlite3Utf8Char
10880 4c 65 6e 28 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65  Len(zName, nName
10890 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  );.    }.#endif.
108a0 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53    }.}..#ifndef S
108b0 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a  QLITE_OMIT_VIEW.
108c0 2f 2a 0a 2a 2a 20 54 68 65 20 70 61 72 73 65 72  /*.** The parser
108d0 20 63 61 6c 6c 73 20 74 68 69 73 20 72 6f 75 74   calls this rout
108e0 69 6e 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  ine in order to 
108f0 63 72 65 61 74 65 20 61 20 6e 65 77 20 56 49 45  create a new VIE
10900 57 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  W.*/.void sqlite
10910 33 43 72 65 61 74 65 56 69 65 77 28 0a 20 20 50  3CreateView(.  P
10920 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
10930 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67    /* The parsing
10940 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 6f   context */.  To
10950 6b 65 6e 20 2a 70 42 65 67 69 6e 2c 20 20 20 20  ken *pBegin,    
10960 20 2f 2a 20 54 68 65 20 43 52 45 41 54 45 20 74   /* The CREATE t
10970 6f 6b 65 6e 20 74 68 61 74 20 62 65 67 69 6e 73  oken that begins
10980 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 2a   the statement *
10990 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65  /.  Token *pName
109a0 31 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 74 6f  1,     /* The to
109b0 6b 65 6e 20 74 68 61 74 20 68 6f 6c 64 73 20 74  ken that holds t
109c0 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 76  he name of the v
109d0 69 65 77 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  iew */.  Token *
109e0 70 4e 61 6d 65 32 2c 20 20 20 20 20 2f 2a 20 54  pName2,     /* T
109f0 68 65 20 74 6f 6b 65 6e 20 74 68 61 74 20 68 6f  he token that ho
10a00 6c 64 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  lds the name of 
10a10 74 68 65 20 76 69 65 77 20 2a 2f 0a 20 20 45 78  the view */.  Ex
10a20 70 72 4c 69 73 74 20 2a 70 43 4e 61 6d 65 73 2c  prList *pCNames,
10a30 20 2f 2a 20 4f 70 74 69 6f 6e 61 6c 20 6c 69 73   /* Optional lis
10a40 74 20 6f 66 20 76 69 65 77 20 63 6f 6c 75 6d 6e  t of view column
10a50 20 6e 61 6d 65 73 20 2a 2f 0a 20 20 53 65 6c 65   names */.  Sele
10a60 63 74 20 2a 70 53 65 6c 65 63 74 2c 20 20 20 2f  ct *pSelect,   /
10a70 2a 20 41 20 53 45 4c 45 43 54 20 73 74 61 74 65  * A SELECT state
10a80 6d 65 6e 74 20 74 68 61 74 20 77 69 6c 6c 20 62  ment that will b
10a90 65 63 6f 6d 65 20 74 68 65 20 6e 65 77 20 76 69  ecome the new vi
10aa0 65 77 20 2a 2f 0a 20 20 69 6e 74 20 69 73 54 65  ew */.  int isTe
10ab0 6d 70 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 52  mp,        /* TR
10ac0 55 45 20 66 6f 72 20 61 20 54 45 4d 50 4f 52 41  UE for a TEMPORA
10ad0 52 59 20 76 69 65 77 20 2a 2f 0a 20 20 69 6e 74  RY view */.  int
10ae0 20 6e 6f 45 72 72 20 20 20 20 20 20 20 20 20 20   noErr          
10af0 2f 2a 20 53 75 70 70 72 65 73 73 20 65 72 72 6f  /* Suppress erro
10b00 72 20 6d 65 73 73 61 67 65 73 20 69 66 20 56 49  r messages if VI
10b10 45 57 20 61 6c 72 65 61 64 79 20 65 78 69 73 74  EW already exist
10b20 73 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20  s */.){.  Table 
10b30 2a 70 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 63  *p;.  int n;.  c
10b40 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20  onst char *z;.  
10b50 54 6f 6b 65 6e 20 73 45 6e 64 3b 0a 20 20 44 62  Token sEnd;.  Db
10b60 46 69 78 65 72 20 73 46 69 78 3b 0a 20 20 54 6f  Fixer sFix;.  To
10b70 6b 65 6e 20 2a 70 4e 61 6d 65 20 3d 20 30 3b 0a  ken *pName = 0;.
10b80 20 20 69 6e 74 20 69 44 62 3b 0a 20 20 73 71 6c    int iDb;.  sql
10b90 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
10ba0 65 2d 3e 64 62 3b 0a 0a 20 20 69 66 28 20 70 50  e->db;..  if( pP
10bb0 61 72 73 65 2d 3e 6e 56 61 72 3e 30 20 29 7b 0a  arse->nVar>0 ){.
10bc0 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
10bd0 4d 73 67 28 70 50 61 72 73 65 2c 20 22 70 61 72  Msg(pParse, "par
10be0 61 6d 65 74 65 72 73 20 61 72 65 20 6e 6f 74 20  ameters are not 
10bf0 61 6c 6c 6f 77 65 64 20 69 6e 20 76 69 65 77 73  allowed in views
10c00 22 29 3b 0a 20 20 20 20 67 6f 74 6f 20 63 72 65  ");.    goto cre
10c10 61 74 65 5f 76 69 65 77 5f 66 61 69 6c 3b 0a 20  ate_view_fail;. 
10c20 20 7d 0a 20 20 73 71 6c 69 74 65 33 53 74 61 72   }.  sqlite3Star
10c30 74 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70  tTable(pParse, p
10c40 4e 61 6d 65 31 2c 20 70 4e 61 6d 65 32 2c 20 69  Name1, pName2, i
10c50 73 54 65 6d 70 2c 20 31 2c 20 30 2c 20 6e 6f 45  sTemp, 1, 0, noE
10c60 72 72 29 3b 0a 20 20 70 20 3d 20 70 50 61 72 73  rr);.  p = pPars
10c70 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20  e->pNewTable;.  
10c80 69 66 28 20 70 3d 3d 30 20 7c 7c 20 70 50 61 72  if( p==0 || pPar
10c90 73 65 2d 3e 6e 45 72 72 20 29 20 67 6f 74 6f 20  se->nErr ) goto 
10ca0 63 72 65 61 74 65 5f 76 69 65 77 5f 66 61 69 6c  create_view_fail
10cb0 3b 0a 20 20 73 71 6c 69 74 65 33 54 77 6f 50 61  ;.  sqlite3TwoPa
10cc0 72 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 70  rtName(pParse, p
10cd0 4e 61 6d 65 31 2c 20 70 4e 61 6d 65 32 2c 20 26  Name1, pName2, &
10ce0 70 4e 61 6d 65 29 3b 0a 20 20 69 44 62 20 3d 20  pName);.  iDb = 
10cf0 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49  sqlite3SchemaToI
10d00 6e 64 65 78 28 64 62 2c 20 70 2d 3e 70 53 63 68  ndex(db, p->pSch
10d10 65 6d 61 29 3b 0a 20 20 73 71 6c 69 74 65 33 46  ema);.  sqlite3F
10d20 69 78 49 6e 69 74 28 26 73 46 69 78 2c 20 70 50  ixInit(&sFix, pP
10d30 61 72 73 65 2c 20 69 44 62 2c 20 22 76 69 65 77  arse, iDb, "view
10d40 22 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28  ", pName);.  if(
10d50 20 73 71 6c 69 74 65 33 46 69 78 53 65 6c 65 63   sqlite3FixSelec
10d60 74 28 26 73 46 69 78 2c 20 70 53 65 6c 65 63 74  t(&sFix, pSelect
10d70 29 20 29 20 67 6f 74 6f 20 63 72 65 61 74 65 5f  ) ) goto create_
10d80 76 69 65 77 5f 66 61 69 6c 3b 0a 0a 20 20 2f 2a  view_fail;..  /*
10d90 20 4d 61 6b 65 20 61 20 63 6f 70 79 20 6f 66 20   Make a copy of 
10da0 74 68 65 20 65 6e 74 69 72 65 20 53 45 4c 45 43  the entire SELEC
10db0 54 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74  T statement that
10dc0 20 64 65 66 69 6e 65 73 20 74 68 65 20 76 69 65   defines the vie
10dd0 77 2e 0a 20 20 2a 2a 20 54 68 69 73 20 77 69 6c  w..  ** This wil
10de0 6c 20 66 6f 72 63 65 20 61 6c 6c 20 74 68 65 20  l force all the 
10df0 45 78 70 72 2e 74 6f 6b 65 6e 2e 7a 20 76 61 6c  Expr.token.z val
10e00 75 65 73 20 74 6f 20 62 65 20 64 79 6e 61 6d 69  ues to be dynami
10e10 63 61 6c 6c 79 0a 20 20 2a 2a 20 61 6c 6c 6f 63  cally.  ** alloc
10e20 61 74 65 64 20 72 61 74 68 65 72 20 74 68 61 6e  ated rather than
10e30 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 69 6e   point to the in
10e40 70 75 74 20 73 74 72 69 6e 67 20 2d 20 77 68 69  put string - whi
10e50 63 68 20 6d 65 61 6e 73 20 74 68 61 74 0a 20 20  ch means that.  
10e60 2a 2a 20 74 68 65 79 20 77 69 6c 6c 20 70 65 72  ** they will per
10e70 73 69 73 74 20 61 66 74 65 72 20 74 68 65 20 63  sist after the c
10e80 75 72 72 65 6e 74 20 73 71 6c 69 74 65 33 5f 65  urrent sqlite3_e
10e90 78 65 63 28 29 20 63 61 6c 6c 20 72 65 74 75 72  xec() call retur
10ea0 6e 73 2e 0a 20 20 2a 2f 0a 20 20 70 2d 3e 70 53  ns..  */.  p->pS
10eb0 65 6c 65 63 74 20 3d 20 73 71 6c 69 74 65 33 53  elect = sqlite3S
10ec0 65 6c 65 63 74 44 75 70 28 64 62 2c 20 70 53 65  electDup(db, pSe
10ed0 6c 65 63 74 2c 20 45 58 50 52 44 55 50 5f 52 45  lect, EXPRDUP_RE
10ee0 44 55 43 45 29 3b 0a 20 20 70 2d 3e 70 43 68 65  DUCE);.  p->pChe
10ef0 63 6b 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ck = sqlite3Expr
10f00 4c 69 73 74 44 75 70 28 64 62 2c 20 70 43 4e 61  ListDup(db, pCNa
10f10 6d 65 73 2c 20 45 58 50 52 44 55 50 5f 52 45 44  mes, EXPRDUP_RED
10f20 55 43 45 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e  UCE);.  if( db->
10f30 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 67  mallocFailed ) g
10f40 6f 74 6f 20 63 72 65 61 74 65 5f 76 69 65 77 5f  oto create_view_
10f50 66 61 69 6c 3b 0a 0a 20 20 2f 2a 20 4c 6f 63 61  fail;..  /* Loca
10f60 74 65 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  te the end of th
10f70 65 20 43 52 45 41 54 45 20 56 49 45 57 20 73 74  e CREATE VIEW st
10f80 61 74 65 6d 65 6e 74 2e 20 20 4d 61 6b 65 20 73  atement.  Make s
10f90 45 6e 64 20 70 6f 69 6e 74 20 74 6f 0a 20 20 2a  End point to.  *
10fa0 2a 20 74 68 65 20 65 6e 64 2e 0a 20 20 2a 2f 0a  * the end..  */.
10fb0 20 20 73 45 6e 64 20 3d 20 70 50 61 72 73 65 2d    sEnd = pParse-
10fc0 3e 73 4c 61 73 74 54 6f 6b 65 6e 3b 0a 20 20 61  >sLastToken;.  a
10fd0 73 73 65 72 74 28 20 73 45 6e 64 2e 7a 5b 30 5d  ssert( sEnd.z[0]
10fe0 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 73 45 6e  !=0 );.  if( sEn
10ff0 64 2e 7a 5b 30 5d 21 3d 27 3b 27 20 29 7b 0a 20  d.z[0]!=';' ){. 
11000 20 20 20 73 45 6e 64 2e 7a 20 2b 3d 20 73 45 6e     sEnd.z += sEn
11010 64 2e 6e 3b 0a 20 20 7d 0a 20 20 73 45 6e 64 2e  d.n;.  }.  sEnd.
11020 6e 20 3d 20 30 3b 0a 20 20 6e 20 3d 20 28 69 6e  n = 0;.  n = (in
11030 74 29 28 73 45 6e 64 2e 7a 20 2d 20 70 42 65 67  t)(sEnd.z - pBeg
11040 69 6e 2d 3e 7a 29 3b 0a 20 20 61 73 73 65 72 74  in->z);.  assert
11050 28 20 6e 3e 30 20 29 3b 0a 20 20 7a 20 3d 20 70  ( n>0 );.  z = p
11060 42 65 67 69 6e 2d 3e 7a 3b 0a 20 20 77 68 69 6c  Begin->z;.  whil
11070 65 28 20 73 71 6c 69 74 65 33 49 73 73 70 61 63  e( sqlite3Isspac
11080 65 28 7a 5b 6e 2d 31 5d 29 20 29 7b 20 6e 2d 2d  e(z[n-1]) ){ n--
11090 3b 20 7d 0a 20 20 73 45 6e 64 2e 7a 20 3d 20 26  ; }.  sEnd.z = &
110a0 7a 5b 6e 2d 31 5d 3b 0a 20 20 73 45 6e 64 2e 6e  z[n-1];.  sEnd.n
110b0 20 3d 20 31 3b 0a 0a 20 20 2f 2a 20 55 73 65 20   = 1;..  /* Use 
110c0 73 71 6c 69 74 65 33 45 6e 64 54 61 62 6c 65 28  sqlite3EndTable(
110d0 29 20 74 6f 20 61 64 64 20 74 68 65 20 76 69 65  ) to add the vie
110e0 77 20 74 6f 20 74 68 65 20 53 51 4c 49 54 45 5f  w to the SQLITE_
110f0 4d 41 53 54 45 52 20 74 61 62 6c 65 20 2a 2f 0a  MASTER table */.
11100 20 20 73 71 6c 69 74 65 33 45 6e 64 54 61 62 6c    sqlite3EndTabl
11110 65 28 70 50 61 72 73 65 2c 20 30 2c 20 26 73 45  e(pParse, 0, &sE
11120 6e 64 2c 20 30 2c 20 30 29 3b 0a 0a 63 72 65 61  nd, 0, 0);..crea
11130 74 65 5f 76 69 65 77 5f 66 61 69 6c 3a 0a 20 20  te_view_fail:.  
11140 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c  sqlite3SelectDel
11150 65 74 65 28 64 62 2c 20 70 53 65 6c 65 63 74 29  ete(db, pSelect)
11160 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c  ;.  sqlite3ExprL
11170 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 43  istDelete(db, pC
11180 4e 61 6d 65 73 29 3b 0a 20 20 72 65 74 75 72 6e  Names);.  return
11190 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
111a0 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 20 2a  LITE_OMIT_VIEW *
111b0 2f 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  /..#if !defined(
111c0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57  SQLITE_OMIT_VIEW
111d0 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51  ) || !defined(SQ
111e0 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
111f0 4c 54 41 42 4c 45 29 0a 2f 2a 0a 2a 2a 20 54 68  LTABLE)./*.** Th
11200 65 20 54 61 62 6c 65 20 73 74 72 75 63 74 75 72  e Table structur
11210 65 20 70 54 61 62 6c 65 20 69 73 20 72 65 61 6c  e pTable is real
11220 6c 79 20 61 20 56 49 45 57 2e 20 20 46 69 6c 6c  ly a VIEW.  Fill
11230 20 69 6e 20 74 68 65 20 6e 61 6d 65 73 20 6f 66   in the names of
11240 0a 2a 2a 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20  .** the columns 
11250 6f 66 20 74 68 65 20 76 69 65 77 20 69 6e 20 74  of the view in t
11260 68 65 20 70 54 61 62 6c 65 20 73 74 72 75 63 74  he pTable struct
11270 75 72 65 2e 20 20 52 65 74 75 72 6e 20 74 68 65  ure.  Return the
11280 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66 20 65 72   number.** of er
11290 72 6f 72 73 2e 20 20 49 66 20 61 6e 20 65 72 72  rors.  If an err
112a0 6f 72 20 69 73 20 73 65 65 6e 20 6c 65 61 76 65  or is seen leave
112b0 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67   an error messag
112c0 65 20 69 6e 20 70 50 61 72 73 65 2d 3e 7a 45 72  e in pParse->zEr
112d0 72 4d 73 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  rMsg..*/.int sql
112e0 69 74 65 33 56 69 65 77 47 65 74 43 6f 6c 75 6d  ite3ViewGetColum
112f0 6e 4e 61 6d 65 73 28 50 61 72 73 65 20 2a 70 50  nNames(Parse *pP
11300 61 72 73 65 2c 20 54 61 62 6c 65 20 2a 70 54 61  arse, Table *pTa
11310 62 6c 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70  ble){.  Table *p
11320 53 65 6c 54 61 62 3b 20 20 20 2f 2a 20 41 20 66  SelTab;   /* A f
11330 61 6b 65 20 74 61 62 6c 65 20 66 72 6f 6d 20 77  ake table from w
11340 68 69 63 68 20 77 65 20 67 65 74 20 74 68 65 20  hich we get the 
11350 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 20 20  result set */.  
11360 53 65 6c 65 63 74 20 2a 70 53 65 6c 3b 20 20 20  Select *pSel;   
11370 20 20 2f 2a 20 43 6f 70 79 20 6f 66 20 74 68 65    /* Copy of the
11380 20 53 45 4c 45 43 54 20 74 68 61 74 20 69 6d 70   SELECT that imp
11390 6c 65 6d 65 6e 74 73 20 74 68 65 20 76 69 65 77  lements the view
113a0 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 72 72 20 3d   */.  int nErr =
113b0 20 30 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65   0;     /* Numbe
113c0 72 20 6f 66 20 65 72 72 6f 72 73 20 65 6e 63 6f  r of errors enco
113d0 75 6e 74 65 72 65 64 20 2a 2f 0a 20 20 69 6e 74  untered */.  int
113e0 20 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f   n;            /
113f0 2a 20 54 65 6d 70 6f 72 61 72 69 6c 79 20 68 6f  * Temporarily ho
11400 6c 64 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  lds the number o
11410 66 20 63 75 72 73 6f 72 73 20 61 73 73 69 67 6e  f cursors assign
11420 65 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  ed */.  sqlite3 
11430 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
11440 3b 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63  ;  /* Database c
11450 6f 6e 6e 65 63 74 69 6f 6e 20 66 6f 72 20 6d 61  onnection for ma
11460 6c 6c 6f 63 20 65 72 72 6f 72 73 20 2a 2f 0a 20  lloc errors */. 
11470 20 73 71 6c 69 74 65 33 5f 78 61 75 74 68 20 78   sqlite3_xauth x
11480 41 75 74 68 3b 20 20 20 20 20 20 20 2f 2a 20 53  Auth;       /* S
11490 61 76 65 64 20 78 41 75 74 68 20 70 6f 69 6e 74  aved xAuth point
114a0 65 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  er */..  assert(
114b0 20 70 54 61 62 6c 65 20 29 3b 0a 0a 23 69 66 6e   pTable );..#ifn
114c0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
114d0 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 69  VIRTUALTABLE.  i
114e0 66 28 20 73 71 6c 69 74 65 33 56 74 61 62 43 61  f( sqlite3VtabCa
114f0 6c 6c 43 6f 6e 6e 65 63 74 28 70 50 61 72 73 65  llConnect(pParse
11500 2c 20 70 54 61 62 6c 65 29 20 29 7b 0a 20 20 20  , pTable) ){.   
11510 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
11520 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20  RROR;.  }.  if( 
11530 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 6c 65  IsVirtual(pTable
11540 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 23 65  ) ) return 0;.#e
11550 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51  ndif..#ifndef SQ
11560 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 20  LITE_OMIT_VIEW. 
11570 20 2f 2a 20 41 20 70 6f 73 69 74 69 76 65 20 6e   /* A positive n
11580 43 6f 6c 20 6d 65 61 6e 73 20 74 68 65 20 63 6f  Col means the co
11590 6c 75 6d 6e 73 20 6e 61 6d 65 73 20 66 6f 72 20  lumns names for 
115a0 74 68 69 73 20 76 69 65 77 20 61 72 65 0a 20 20  this view are.  
115b0 2a 2a 20 61 6c 72 65 61 64 79 20 6b 6e 6f 77 6e  ** already known
115c0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 54 61  ..  */.  if( pTa
115d0 62 6c 65 2d 3e 6e 43 6f 6c 3e 30 20 29 20 72 65  ble->nCol>0 ) re
115e0 74 75 72 6e 20 30 3b 0a 0a 20 20 2f 2a 20 41 20  turn 0;..  /* A 
115f0 6e 65 67 61 74 69 76 65 20 6e 43 6f 6c 20 69 73  negative nCol is
11600 20 61 20 73 70 65 63 69 61 6c 20 6d 61 72 6b 65   a special marke
11610 72 20 6d 65 61 6e 69 6e 67 20 74 68 61 74 20 77  r meaning that w
11620 65 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79 0a  e are currently.
11630 20 20 2a 2a 20 74 72 79 69 6e 67 20 74 6f 20 63    ** trying to c
11640 6f 6d 70 75 74 65 20 74 68 65 20 63 6f 6c 75 6d  ompute the colum
11650 6e 20 6e 61 6d 65 73 2e 20 20 49 66 20 77 65 20  n names.  If we 
11660 65 6e 74 65 72 20 74 68 69 73 20 72 6f 75 74 69  enter this routi
11670 6e 65 20 77 69 74 68 0a 20 20 2a 2a 20 61 20 6e  ne with.  ** a n
11680 65 67 61 74 69 76 65 20 6e 43 6f 6c 2c 20 69 74  egative nCol, it
11690 20 6d 65 61 6e 73 20 74 77 6f 20 6f 72 20 6d 6f   means two or mo
116a0 72 65 20 76 69 65 77 73 20 66 6f 72 6d 20 61 20  re views form a 
116b0 6c 6f 6f 70 2c 20 6c 69 6b 65 20 74 68 69 73 3a  loop, like this:
116c0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 43  .  **.  **     C
116d0 52 45 41 54 45 20 56 49 45 57 20 6f 6e 65 20 41  REATE VIEW one A
116e0 53 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20  S SELECT * FROM 
116f0 74 77 6f 3b 0a 20 20 2a 2a 20 20 20 20 20 43 52  two;.  **     CR
11700 45 41 54 45 20 56 49 45 57 20 74 77 6f 20 41 53  EATE VIEW two AS
11710 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 6f   SELECT * FROM o
11720 6e 65 3b 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 63  ne;.  **.  ** Ac
11730 74 75 61 6c 6c 79 2c 20 74 68 65 20 65 72 72 6f  tually, the erro
11740 72 20 61 62 6f 76 65 20 69 73 20 6e 6f 77 20 63  r above is now c
11750 61 75 67 68 74 20 70 72 69 6f 72 20 74 6f 20 72  aught prior to r
11760 65 61 63 68 69 6e 67 20 74 68 69 73 20 70 6f 69  eaching this poi
11770 6e 74 2e 0a 20 20 2a 2a 20 42 75 74 20 74 68 65  nt..  ** But the
11780 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 65 73 74 20   following test 
11790 69 73 20 73 74 69 6c 6c 20 69 6d 70 6f 72 74 61  is still importa
117a0 6e 74 20 61 73 20 69 74 20 64 6f 65 73 20 63 6f  nt as it does co
117b0 6d 65 20 75 70 0a 20 20 2a 2a 20 69 6e 20 74 68  me up.  ** in th
117c0 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 20 20 2a  e following:.  *
117d0 2a 20 0a 20 20 2a 2a 20 20 20 20 20 43 52 45 41  * .  **     CREA
117e0 54 45 20 54 41 42 4c 45 20 6d 61 69 6e 2e 65 78  TE TABLE main.ex
117f0 31 28 61 29 3b 0a 20 20 2a 2a 20 20 20 20 20 43  1(a);.  **     C
11800 52 45 41 54 45 20 54 45 4d 50 20 56 49 45 57 20  REATE TEMP VIEW 
11810 65 78 31 20 41 53 20 53 45 4c 45 43 54 20 61 20  ex1 AS SELECT a 
11820 46 52 4f 4d 20 65 78 31 3b 0a 20 20 2a 2a 20 20  FROM ex1;.  **  
11830 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d     SELECT * FROM
11840 20 74 65 6d 70 2e 65 78 31 3b 0a 20 20 2a 2f 0a   temp.ex1;.  */.
11850 20 20 69 66 28 20 70 54 61 62 6c 65 2d 3e 6e 43    if( pTable->nC
11860 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  ol<0 ){.    sqli
11870 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
11880 73 65 2c 20 22 76 69 65 77 20 25 73 20 69 73 20  se, "view %s is 
11890 63 69 72 63 75 6c 61 72 6c 79 20 64 65 66 69 6e  circularly defin
118a0 65 64 22 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e 61  ed", pTable->zNa
118b0 6d 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  me);.    return 
118c0 31 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  1;.  }.  assert(
118d0 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3e 3d 30   pTable->nCol>=0
118e0 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20   );..  /* If we 
118f0 67 65 74 20 74 68 69 73 20 66 61 72 2c 20 69 74  get this far, it
11900 20 6d 65 61 6e 73 20 77 65 20 6e 65 65 64 20 74   means we need t
11910 6f 20 63 6f 6d 70 75 74 65 20 74 68 65 20 74 61  o compute the ta
11920 62 6c 65 20 6e 61 6d 65 73 2e 0a 20 20 2a 2a 20  ble names..  ** 
11930 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 63 61  Note that the ca
11940 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 52 65 73  ll to sqlite3Res
11950 75 6c 74 53 65 74 4f 66 53 65 6c 65 63 74 28 29  ultSetOfSelect()
11960 20 77 69 6c 6c 20 65 78 70 61 6e 64 20 61 6e 79   will expand any
11970 0a 20 20 2a 2a 20 22 2a 22 20 65 6c 65 6d 65 6e  .  ** "*" elemen
11980 74 73 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74  ts in the result
11990 73 20 73 65 74 20 6f 66 20 74 68 65 20 76 69 65  s set of the vie
119a0 77 20 61 6e 64 20 77 69 6c 6c 20 61 73 73 69 67  w and will assig
119b0 6e 20 63 75 72 73 6f 72 73 0a 20 20 2a 2a 20 74  n cursors.  ** t
119c0 6f 20 74 68 65 20 65 6c 65 6d 65 6e 74 73 20 6f  o the elements o
119d0 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  f the FROM claus
119e0 65 2e 20 20 42 75 74 20 77 65 20 64 6f 20 6e 6f  e.  But we do no
119f0 74 20 77 61 6e 74 20 74 68 65 73 65 20 63 68 61  t want these cha
11a00 6e 67 65 73 0a 20 20 2a 2a 20 74 6f 20 62 65 20  nges.  ** to be 
11a10 70 65 72 6d 61 6e 65 6e 74 2e 20 20 53 6f 20 74  permanent.  So t
11a20 68 65 20 63 6f 6d 70 75 74 61 74 69 6f 6e 20 69  he computation i
11a30 73 20 64 6f 6e 65 20 6f 6e 20 61 20 63 6f 70 79  s done on a copy
11a40 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 0a 20   of the SELECT. 
11a50 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 74 68   ** statement th
11a60 61 74 20 64 65 66 69 6e 65 73 20 74 68 65 20 76  at defines the v
11a70 69 65 77 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  iew..  */.  asse
11a80 72 74 28 20 70 54 61 62 6c 65 2d 3e 70 53 65 6c  rt( pTable->pSel
11a90 65 63 74 20 29 3b 0a 20 20 70 53 65 6c 20 3d 20  ect );.  pSel = 
11aa0 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70  sqlite3SelectDup
11ab0 28 64 62 2c 20 70 54 61 62 6c 65 2d 3e 70 53 65  (db, pTable->pSe
11ac0 6c 65 63 74 2c 20 30 29 3b 0a 20 20 69 66 28 20  lect, 0);.  if( 
11ad0 70 53 65 6c 20 29 7b 0a 20 20 20 20 6e 20 3d 20  pSel ){.    n = 
11ae0 70 50 61 72 73 65 2d 3e 6e 54 61 62 3b 0a 20 20  pParse->nTab;.  
11af0 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74    sqlite3SrcList
11b00 41 73 73 69 67 6e 43 75 72 73 6f 72 73 28 70 50  AssignCursors(pP
11b10 61 72 73 65 2c 20 70 53 65 6c 2d 3e 70 53 72 63  arse, pSel->pSrc
11b20 29 3b 0a 20 20 20 20 70 54 61 62 6c 65 2d 3e 6e  );.    pTable->n
11b30 43 6f 6c 20 3d 20 2d 31 3b 0a 20 20 20 20 64 62  Col = -1;.    db
11b40 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 44 69 73  ->lookaside.bDis
11b50 61 62 6c 65 2b 2b 3b 0a 23 69 66 6e 64 65 66 20  able++;.#ifndef 
11b60 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48  SQLITE_OMIT_AUTH
11b70 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 20 20 78 41  ORIZATION.    xA
11b80 75 74 68 20 3d 20 64 62 2d 3e 78 41 75 74 68 3b  uth = db->xAuth;
11b90 0a 20 20 20 20 64 62 2d 3e 78 41 75 74 68 20 3d  .    db->xAuth =
11ba0 20 30 3b 0a 20 20 20 20 70 53 65 6c 54 61 62 20   0;.    pSelTab 
11bb0 3d 20 73 71 6c 69 74 65 33 52 65 73 75 6c 74 53  = sqlite3ResultS
11bc0 65 74 4f 66 53 65 6c 65 63 74 28 70 50 61 72 73  etOfSelect(pPars
11bd0 65 2c 20 70 53 65 6c 29 3b 0a 20 20 20 20 64 62  e, pSel);.    db
11be0 2d 3e 78 41 75 74 68 20 3d 20 78 41 75 74 68 3b  ->xAuth = xAuth;
11bf0 0a 23 65 6c 73 65 0a 20 20 20 20 70 53 65 6c 54  .#else.    pSelT
11c00 61 62 20 3d 20 73 71 6c 69 74 65 33 52 65 73 75  ab = sqlite3Resu
11c10 6c 74 53 65 74 4f 66 53 65 6c 65 63 74 28 70 50  ltSetOfSelect(pP
11c20 61 72 73 65 2c 20 70 53 65 6c 29 3b 0a 23 65 6e  arse, pSel);.#en
11c30 64 69 66 0a 20 20 20 20 70 50 61 72 73 65 2d 3e  dif.    pParse->
11c40 6e 54 61 62 20 3d 20 6e 3b 0a 20 20 20 20 69 66  nTab = n;.    if
11c50 28 20 70 54 61 62 6c 65 2d 3e 70 43 68 65 63 6b  ( pTable->pCheck
11c60 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 43 52 45   ){.      /* CRE
11c70 41 54 45 20 56 49 45 57 20 6e 61 6d 65 28 61 72  ATE VIEW name(ar
11c80 67 6c 69 73 74 29 20 41 53 20 2e 2e 2e 0a 20 20  glist) AS ....  
11c90 20 20 20 20 2a 2a 20 54 68 65 20 6e 61 6d 65 73      ** The names
11ca0 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20   of the columns 
11cb0 69 6e 20 74 68 65 20 74 61 62 6c 65 20 61 72 65  in the table are
11cc0 20 74 61 6b 65 6e 20 66 72 6f 6d 0a 20 20 20 20   taken from.    
11cd0 20 20 2a 2a 20 61 72 67 6c 69 73 74 20 77 68 69    ** arglist whi
11ce0 63 68 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20  ch is stored in 
11cf0 70 54 61 62 6c 65 2d 3e 70 43 68 65 63 6b 2e 20  pTable->pCheck. 
11d00 20 54 68 65 20 70 43 68 65 63 6b 20 66 69 65 6c   The pCheck fiel
11d10 64 0a 20 20 20 20 20 20 2a 2a 20 6e 6f 72 6d 61  d.      ** norma
11d20 6c 6c 79 20 68 6f 6c 64 73 20 43 48 45 43 4b 20  lly holds CHECK 
11d30 63 6f 6e 73 74 72 61 69 6e 74 73 20 6f 6e 20 61  constraints on a
11d40 6e 20 6f 72 64 69 6e 61 72 79 20 74 61 62 6c 65  n ordinary table
11d50 2c 20 62 75 74 20 66 6f 72 0a 20 20 20 20 20 20  , but for.      
11d60 2a 2a 20 61 20 56 49 45 57 20 69 74 20 68 6f 6c  ** a VIEW it hol
11d70 64 73 20 74 68 65 20 6c 69 73 74 20 6f 66 20 63  ds the list of c
11d80 6f 6c 75 6d 6e 20 6e 61 6d 65 73 2e 0a 20 20 20  olumn names..   
11d90 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69     */.      sqli
11da0 74 65 33 43 6f 6c 75 6d 6e 73 46 72 6f 6d 45 78  te3ColumnsFromEx
11db0 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70  prList(pParse, p
11dc0 54 61 62 6c 65 2d 3e 70 43 68 65 63 6b 2c 20 0a  Table->pCheck, .
11dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11df0 20 26 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 2c 20   &pTable->nCol, 
11e00 26 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 29 3b 0a  &pTable->aCol);.
11e10 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61        if( db->ma
11e20 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d 30 20 0a 20  llocFailed==0 . 
11e30 20 20 20 20 20 20 26 26 20 70 50 61 72 73 65 2d        && pParse-
11e40 3e 6e 45 72 72 3d 3d 30 0a 20 20 20 20 20 20 20  >nErr==0.       
11e50 26 26 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3d  && pTable->nCol=
11e60 3d 70 53 65 6c 2d 3e 70 45 4c 69 73 74 2d 3e 6e  =pSel->pEList->n
11e70 45 78 70 72 0a 20 20 20 20 20 20 29 7b 0a 20 20  Expr.      ){.  
11e80 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c        sqlite3Sel
11e90 65 63 74 41 64 64 43 6f 6c 75 6d 6e 54 79 70 65  ectAddColumnType
11ea0 41 6e 64 43 6f 6c 6c 61 74 69 6f 6e 28 70 50 61  AndCollation(pPa
11eb0 72 73 65 2c 20 70 54 61 62 6c 65 2c 20 70 53 65  rse, pTable, pSe
11ec0 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  l);.      }.    
11ed0 7d 65 6c 73 65 20 69 66 28 20 70 53 65 6c 54 61  }else if( pSelTa
11ee0 62 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 43 52  b ){.      /* CR
11ef0 45 41 54 45 20 56 49 45 57 20 6e 61 6d 65 20 41  EATE VIEW name A
11f00 53 2e 2e 2e 20 20 77 69 74 68 6f 75 74 20 61 6e  S...  without an
11f10 20 61 72 67 75 6d 65 6e 74 20 6c 69 73 74 2e 20   argument list. 
11f20 20 43 6f 6e 73 74 72 75 63 74 0a 20 20 20 20 20   Construct.     
11f30 20 2a 2a 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e   ** the column n
11f40 61 6d 65 73 20 66 72 6f 6d 20 74 68 65 20 53 45  ames from the SE
11f50 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 74  LECT statement t
11f60 68 61 74 20 64 65 66 69 6e 65 73 20 74 68 65 20  hat defines the 
11f70 76 69 65 77 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  view..      */. 
11f80 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54 61       assert( pTa
11f90 62 6c 65 2d 3e 61 43 6f 6c 3d 3d 30 20 29 3b 0a  ble->aCol==0 );.
11fa0 20 20 20 20 20 20 70 54 61 62 6c 65 2d 3e 6e 43        pTable->nC
11fb0 6f 6c 20 3d 20 70 53 65 6c 54 61 62 2d 3e 6e 43  ol = pSelTab->nC
11fc0 6f 6c 3b 0a 20 20 20 20 20 20 70 54 61 62 6c 65  ol;.      pTable
11fd0 2d 3e 61 43 6f 6c 20 3d 20 70 53 65 6c 54 61 62  ->aCol = pSelTab
11fe0 2d 3e 61 43 6f 6c 3b 0a 20 20 20 20 20 20 70 53  ->aCol;.      pS
11ff0 65 6c 54 61 62 2d 3e 6e 43 6f 6c 20 3d 20 30 3b  elTab->nCol = 0;
12000 0a 20 20 20 20 20 20 70 53 65 6c 54 61 62 2d 3e  .      pSelTab->
12010 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20  aCol = 0;.      
12020 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 53  assert( sqlite3S
12030 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64  chemaMutexHeld(d
12040 62 2c 20 30 2c 20 70 54 61 62 6c 65 2d 3e 70 53  b, 0, pTable->pS
12050 63 68 65 6d 61 29 20 29 3b 0a 20 20 20 20 7d 65  chema) );.    }e
12060 6c 73 65 7b 0a 20 20 20 20 20 20 70 54 61 62 6c  lse{.      pTabl
12070 65 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20  e->nCol = 0;.   
12080 20 20 20 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 7d     nErr++;.    }
12090 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 6c 65  .    sqlite3Dele
120a0 74 65 54 61 62 6c 65 28 64 62 2c 20 70 53 65 6c  teTable(db, pSel
120b0 54 61 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Tab);.    sqlite
120c0 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62  3SelectDelete(db
120d0 2c 20 70 53 65 6c 29 3b 0a 20 20 20 20 64 62 2d  , pSel);.    db-
120e0 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 44 69 73 61  >lookaside.bDisa
120f0 62 6c 65 2d 2d 3b 0a 20 20 7d 20 65 6c 73 65 20  ble--;.  } else 
12100 7b 0a 20 20 20 20 6e 45 72 72 2b 2b 3b 0a 20 20  {.    nErr++;.  
12110 7d 0a 20 20 70 54 61 62 6c 65 2d 3e 70 53 63 68  }.  pTable->pSch
12120 65 6d 61 2d 3e 73 63 68 65 6d 61 46 6c 61 67 73  ema->schemaFlags
12130 20 7c 3d 20 44 42 5f 55 6e 72 65 73 65 74 56 69   |= DB_UnresetVi
12140 65 77 73 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53  ews;.#endif /* S
12150 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 20  QLITE_OMIT_VIEW 
12160 2a 2f 0a 20 20 72 65 74 75 72 6e 20 6e 45 72 72  */.  return nErr
12170 3b 20 20 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  ;  .}.#endif /* 
12180 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
12190 4f 4d 49 54 5f 56 49 45 57 29 20 7c 7c 20 21 64  OMIT_VIEW) || !d
121a0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
121b0 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29  IT_VIRTUALTABLE)
121c0 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c   */..#ifndef SQL
121d0 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 2f 2a  ITE_OMIT_VIEW./*
121e0 0a 2a 2a 20 43 6c 65 61 72 20 74 68 65 20 63 6f  .** Clear the co
121f0 6c 75 6d 6e 20 6e 61 6d 65 73 20 66 72 6f 6d 20  lumn names from 
12200 65 76 65 72 79 20 56 49 45 57 20 69 6e 20 64 61  every VIEW in da
12210 74 61 62 61 73 65 20 69 64 78 2e 0a 2a 2f 0a 73  tabase idx..*/.s
12220 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74  tatic void sqlit
12230 65 56 69 65 77 52 65 73 65 74 41 6c 6c 28 73 71  eViewResetAll(sq
12240 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 69  lite3 *db, int i
12250 64 78 29 7b 0a 20 20 48 61 73 68 45 6c 65 6d 20  dx){.  HashElem 
12260 2a 69 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  *i;.  assert( sq
12270 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78  lite3SchemaMutex
12280 48 65 6c 64 28 64 62 2c 20 69 64 78 2c 20 30 29  Held(db, idx, 0)
12290 20 29 3b 0a 20 20 69 66 28 20 21 44 62 48 61 73   );.  if( !DbHas
122a0 50 72 6f 70 65 72 74 79 28 64 62 2c 20 69 64 78  Property(db, idx
122b0 2c 20 44 42 5f 55 6e 72 65 73 65 74 56 69 65 77  , DB_UnresetView
122c0 73 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66  s) ) return;.  f
122d0 6f 72 28 69 3d 73 71 6c 69 74 65 48 61 73 68 46  or(i=sqliteHashF
122e0 69 72 73 74 28 26 64 62 2d 3e 61 44 62 5b 69 64  irst(&db->aDb[id
122f0 78 5d 2e 70 53 63 68 65 6d 61 2d 3e 74 62 6c 48  x].pSchema->tblH
12300 61 73 68 29 3b 20 69 3b 69 3d 73 71 6c 69 74 65  ash); i;i=sqlite
12310 48 61 73 68 4e 65 78 74 28 69 29 29 7b 0a 20 20  HashNext(i)){.  
12320 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20    Table *pTab = 
12330 73 71 6c 69 74 65 48 61 73 68 44 61 74 61 28 69  sqliteHashData(i
12340 29 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62 2d  );.    if( pTab-
12350 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20  >pSelect ){.    
12360 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65 43    sqlite3DeleteC
12370 6f 6c 75 6d 6e 4e 61 6d 65 73 28 64 62 2c 20 70  olumnNames(db, p
12380 54 61 62 29 3b 0a 20 20 20 20 20 20 70 54 61 62  Tab);.      pTab
12390 2d 3e 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20  ->aCol = 0;.    
123a0 20 20 70 54 61 62 2d 3e 6e 43 6f 6c 20 3d 20 30    pTab->nCol = 0
123b0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 44 62  ;.    }.  }.  Db
123c0 43 6c 65 61 72 50 72 6f 70 65 72 74 79 28 64 62  ClearProperty(db
123d0 2c 20 69 64 78 2c 20 44 42 5f 55 6e 72 65 73 65  , idx, DB_Unrese
123e0 74 56 69 65 77 73 29 3b 0a 7d 0a 23 65 6c 73 65  tViews);.}.#else
123f0 0a 23 20 64 65 66 69 6e 65 20 73 71 6c 69 74 65  .# define sqlite
12400 56 69 65 77 52 65 73 65 74 41 6c 6c 28 41 2c 42  ViewResetAll(A,B
12410 29 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  ).#endif /* SQLI
12420 54 45 5f 4f 4d 49 54 5f 56 49 45 57 20 2a 2f 0a  TE_OMIT_VIEW */.
12430 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
12440 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 62  tion is called b
12450 79 20 74 68 65 20 56 44 42 45 20 74 6f 20 61 64  y the VDBE to ad
12460 6a 75 73 74 20 74 68 65 20 69 6e 74 65 72 6e 61  just the interna
12470 6c 20 73 63 68 65 6d 61 0a 2a 2a 20 75 73 65 64  l schema.** used
12480 20 62 79 20 53 51 4c 69 74 65 20 77 68 65 6e 20   by SQLite when 
12490 74 68 65 20 62 74 72 65 65 20 6c 61 79 65 72 20  the btree layer 
124a0 6d 6f 76 65 73 20 61 20 74 61 62 6c 65 20 72 6f  moves a table ro
124b0 6f 74 20 70 61 67 65 2e 20 54 68 65 0a 2a 2a 20  ot page. The.** 
124c0 72 6f 6f 74 2d 70 61 67 65 20 6f 66 20 61 20 74  root-page of a t
124d0 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 69 6e  able or index in
124e0 20 64 61 74 61 62 61 73 65 20 69 44 62 20 68 61   database iDb ha
124f0 73 20 63 68 61 6e 67 65 64 20 66 72 6f 6d 20 69  s changed from i
12500 46 72 6f 6d 0a 2a 2a 20 74 6f 20 69 54 6f 2e 0a  From.** to iTo..
12510 2a 2a 0a 2a 2a 20 54 69 63 6b 65 74 20 23 31 37  **.** Ticket #17
12520 32 38 3a 20 20 54 68 65 20 73 79 6d 62 6f 6c 20  28:  The symbol 
12530 74 61 62 6c 65 20 6d 69 67 68 74 20 73 74 69 6c  table might stil
12540 6c 20 63 6f 6e 74 61 69 6e 20 69 6e 66 6f 72 6d  l contain inform
12550 61 74 69 6f 6e 0a 2a 2a 20 6f 6e 20 74 61 62 6c  ation.** on tabl
12560 65 73 20 61 6e 64 2f 6f 72 20 69 6e 64 69 63 65  es and/or indice
12570 73 20 74 68 61 74 20 61 72 65 20 74 68 65 20 70  s that are the p
12580 72 6f 63 65 73 73 20 6f 66 20 62 65 69 6e 67 20  rocess of being 
12590 64 65 6c 65 74 65 64 2e 0a 2a 2a 20 49 66 20 79  deleted..** If y
125a0 6f 75 20 61 72 65 20 75 6e 6c 75 63 6b 79 2c 20  ou are unlucky, 
125b0 6f 6e 65 20 6f 66 20 74 68 6f 73 65 20 64 65 6c  one of those del
125c0 65 74 65 64 20 69 6e 64 69 63 65 73 20 6f 72 20  eted indices or 
125d0 74 61 62 6c 65 73 20 6d 69 67 68 74 0a 2a 2a 20  tables might.** 
125e0 68 61 76 65 20 74 68 65 20 73 61 6d 65 20 72 6f  have the same ro
125f0 6f 74 70 61 67 65 20 6e 75 6d 62 65 72 20 61 73  otpage number as
12600 20 74 68 65 20 72 65 61 6c 20 74 61 62 6c 65 20   the real table 
12610 6f 72 20 69 6e 64 65 78 20 74 68 61 74 20 69 73  or index that is
12620 0a 2a 2a 20 62 65 69 6e 67 20 6d 6f 76 65 64 2e  .** being moved.
12630 20 20 53 6f 20 77 65 20 63 61 6e 6e 6f 74 20 73    So we cannot s
12640 74 6f 70 20 73 65 61 72 63 68 69 6e 67 20 61 66  top searching af
12650 74 65 72 20 74 68 65 20 66 69 72 73 74 20 6d 61  ter the first ma
12660 74 63 68 20 0a 2a 2a 20 62 65 63 61 75 73 65 20  tch .** because 
12670 74 68 65 20 66 69 72 73 74 20 6d 61 74 63 68 20  the first match 
12680 6d 69 67 68 74 20 62 65 20 66 6f 72 20 6f 6e 65  might be for one
12690 20 6f 66 20 74 68 65 20 64 65 6c 65 74 65 64 20   of the deleted 
126a0 69 6e 64 69 63 65 73 0a 2a 2a 20 6f 72 20 74 61  indices.** or ta
126b0 62 6c 65 73 20 61 6e 64 20 6e 6f 74 20 74 68 65  bles and not the
126c0 20 74 61 62 6c 65 2f 69 6e 64 65 78 20 74 68 61   table/index tha
126d0 74 20 69 73 20 61 63 74 75 61 6c 6c 79 20 62 65  t is actually be
126e0 69 6e 67 20 6d 6f 76 65 64 2e 0a 2a 2a 20 57 65  ing moved..** We
126f0 20 6d 75 73 74 20 63 6f 6e 74 69 6e 75 65 20 6c   must continue l
12700 6f 6f 70 69 6e 67 20 75 6e 74 69 6c 20 61 6c 6c  ooping until all
12710 20 74 61 62 6c 65 73 20 61 6e 64 20 69 6e 64 69   tables and indi
12720 63 65 73 20 77 69 74 68 0a 2a 2a 20 72 6f 6f 74  ces with.** root
12730 70 61 67 65 3d 3d 69 46 72 6f 6d 20 68 61 76 65  page==iFrom have
12740 20 62 65 65 6e 20 63 6f 6e 76 65 72 74 65 64 20   been converted 
12750 74 6f 20 68 61 76 65 20 61 20 72 6f 6f 74 70 61  to have a rootpa
12760 67 65 20 6f 66 20 69 54 6f 0a 2a 2a 20 69 6e 20  ge of iTo.** in 
12770 6f 72 64 65 72 20 74 6f 20 62 65 20 63 65 72 74  order to be cert
12780 61 69 6e 20 74 68 61 74 20 77 65 20 67 6f 74 20  ain that we got 
12790 74 68 65 20 72 69 67 68 74 20 6f 6e 65 2e 0a 2a  the right one..*
127a0 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
127b0 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
127c0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52 6f 6f  .void sqlite3Roo
127d0 74 50 61 67 65 4d 6f 76 65 64 28 73 71 6c 69 74  tPageMoved(sqlit
127e0 65 33 20 2a 64 62 2c 20 69 6e 74 20 69 44 62 2c  e3 *db, int iDb,
127f0 20 69 6e 74 20 69 46 72 6f 6d 2c 20 69 6e 74 20   int iFrom, int 
12800 69 54 6f 29 7b 0a 20 20 48 61 73 68 45 6c 65 6d  iTo){.  HashElem
12810 20 2a 70 45 6c 65 6d 3b 0a 20 20 48 61 73 68 20   *pElem;.  Hash 
12820 2a 70 48 61 73 68 3b 0a 20 20 44 62 20 2a 70 44  *pHash;.  Db *pD
12830 62 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  b;..  assert( sq
12840 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78  lite3SchemaMutex
12850 48 65 6c 64 28 64 62 2c 20 69 44 62 2c 20 30 29  Held(db, iDb, 0)
12860 20 29 3b 0a 20 20 70 44 62 20 3d 20 26 64 62 2d   );.  pDb = &db-
12870 3e 61 44 62 5b 69 44 62 5d 3b 0a 20 20 70 48 61  >aDb[iDb];.  pHa
12880 73 68 20 3d 20 26 70 44 62 2d 3e 70 53 63 68 65  sh = &pDb->pSche
12890 6d 61 2d 3e 74 62 6c 48 61 73 68 3b 0a 20 20 66  ma->tblHash;.  f
128a0 6f 72 28 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48  or(pElem=sqliteH
128b0 61 73 68 46 69 72 73 74 28 70 48 61 73 68 29 3b  ashFirst(pHash);
128c0 20 70 45 6c 65 6d 3b 20 70 45 6c 65 6d 3d 73 71   pElem; pElem=sq
128d0 6c 69 74 65 48 61 73 68 4e 65 78 74 28 70 45 6c  liteHashNext(pEl
128e0 65 6d 29 29 7b 0a 20 20 20 20 54 61 62 6c 65 20  em)){.    Table 
128f0 2a 70 54 61 62 20 3d 20 73 71 6c 69 74 65 48 61  *pTab = sqliteHa
12900 73 68 44 61 74 61 28 70 45 6c 65 6d 29 3b 0a 20  shData(pElem);. 
12910 20 20 20 69 66 28 20 70 54 61 62 2d 3e 74 6e 75     if( pTab->tnu
12920 6d 3d 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20  m==iFrom ){.    
12930 20 20 70 54 61 62 2d 3e 74 6e 75 6d 20 3d 20 69    pTab->tnum = i
12940 54 6f 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  To;.    }.  }.  
12950 70 48 61 73 68 20 3d 20 26 70 44 62 2d 3e 70 53  pHash = &pDb->pS
12960 63 68 65 6d 61 2d 3e 69 64 78 48 61 73 68 3b 0a  chema->idxHash;.
12970 20 20 66 6f 72 28 70 45 6c 65 6d 3d 73 71 6c 69    for(pElem=sqli
12980 74 65 48 61 73 68 46 69 72 73 74 28 70 48 61 73  teHashFirst(pHas
12990 68 29 3b 20 70 45 6c 65 6d 3b 20 70 45 6c 65 6d  h); pElem; pElem
129a0 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28  =sqliteHashNext(
129b0 70 45 6c 65 6d 29 29 7b 0a 20 20 20 20 49 6e 64  pElem)){.    Ind
129c0 65 78 20 2a 70 49 64 78 20 3d 20 73 71 6c 69 74  ex *pIdx = sqlit
129d0 65 48 61 73 68 44 61 74 61 28 70 45 6c 65 6d 29  eHashData(pElem)
129e0 3b 0a 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e  ;.    if( pIdx->
129f0 74 6e 75 6d 3d 3d 69 46 72 6f 6d 20 29 7b 0a 20  tnum==iFrom ){. 
12a00 20 20 20 20 20 70 49 64 78 2d 3e 74 6e 75 6d 20       pIdx->tnum 
12a10 3d 20 69 54 6f 3b 0a 20 20 20 20 7d 0a 20 20 7d  = iTo;.    }.  }
12a20 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
12a30 20 57 72 69 74 65 20 63 6f 64 65 20 74 6f 20 65   Write code to e
12a40 72 61 73 65 20 74 68 65 20 74 61 62 6c 65 20 77  rase the table w
12a50 69 74 68 20 72 6f 6f 74 2d 70 61 67 65 20 69 54  ith root-page iT
12a60 61 62 6c 65 20 66 72 6f 6d 20 64 61 74 61 62 61  able from databa
12a70 73 65 20 69 44 62 2e 0a 2a 2a 20 41 6c 73 6f 20  se iDb..** Also 
12a80 77 72 69 74 65 20 63 6f 64 65 20 74 6f 20 6d 6f  write code to mo
12a90 64 69 66 79 20 74 68 65 20 73 71 6c 69 74 65 5f  dify the sqlite_
12aa0 6d 61 73 74 65 72 20 74 61 62 6c 65 20 61 6e 64  master table and
12ab0 20 69 6e 74 65 72 6e 61 6c 20 73 63 68 65 6d 61   internal schema
12ac0 0a 2a 2a 20 69 66 20 61 20 72 6f 6f 74 2d 70 61  .** if a root-pa
12ad0 67 65 20 6f 66 20 61 6e 6f 74 68 65 72 20 74 61  ge of another ta
12ae0 62 6c 65 20 69 73 20 6d 6f 76 65 64 20 62 79 20  ble is moved by 
12af0 74 68 65 20 62 74 72 65 65 2d 6c 61 79 65 72 20  the btree-layer 
12b00 77 68 69 6c 73 74 0a 2a 2a 20 65 72 61 73 69 6e  whilst.** erasin
12b10 67 20 69 54 61 62 6c 65 20 28 74 68 69 73 20 63  g iTable (this c
12b20 61 6e 20 68 61 70 70 65 6e 20 77 69 74 68 20 61  an happen with a
12b30 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61  n auto-vacuum da
12b40 74 61 62 61 73 65 29 2e 0a 2a 2f 20 0a 73 74 61  tabase)..*/ .sta
12b50 74 69 63 20 76 6f 69 64 20 64 65 73 74 72 6f 79  tic void destroy
12b60 52 6f 6f 74 50 61 67 65 28 50 61 72 73 65 20 2a  RootPage(Parse *
12b70 70 50 61 72 73 65 2c 20 69 6e 74 20 69 54 61 62  pParse, int iTab
12b80 6c 65 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20 20  le, int iDb){.  
12b90 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65  Vdbe *v = sqlite
12ba0 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
12bb0 3b 0a 20 20 69 6e 74 20 72 31 20 3d 20 73 71 6c  ;.  int r1 = sql
12bc0 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
12bd0 50 61 72 73 65 29 3b 0a 20 20 61 73 73 65 72 74  Parse);.  assert
12be0 28 20 69 54 61 62 6c 65 3e 31 20 29 3b 0a 20 20  ( iTable>1 );.  
12bf0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
12c00 33 28 76 2c 20 4f 50 5f 44 65 73 74 72 6f 79 2c  3(v, OP_Destroy,
12c10 20 69 54 61 62 6c 65 2c 20 72 31 2c 20 69 44 62   iTable, r1, iDb
12c20 29 3b 0a 20 20 73 71 6c 69 74 65 33 4d 61 79 41  );.  sqlite3MayA
12c30 62 6f 72 74 28 70 50 61 72 73 65 29 3b 0a 23 69  bort(pParse);.#i
12c40 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
12c50 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 2f  T_AUTOVACUUM.  /
12c60 2a 20 4f 50 5f 44 65 73 74 72 6f 79 20 73 74 6f  * OP_Destroy sto
12c70 72 65 73 20 61 6e 20 69 6e 20 69 6e 74 65 67 65  res an in intege
12c80 72 20 72 31 2e 20 49 66 20 74 68 69 73 20 69 6e  r r1. If this in
12c90 74 65 67 65 72 0a 20 20 2a 2a 20 69 73 20 6e 6f  teger.  ** is no
12ca0 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 69 74 20  n-zero, then it 
12cb0 69 73 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65  is the root page
12cc0 20 6e 75 6d 62 65 72 20 6f 66 20 61 20 74 61 62   number of a tab
12cd0 6c 65 20 6d 6f 76 65 64 20 74 6f 0a 20 20 2a 2a  le moved to.  **
12ce0 20 6c 6f 63 61 74 69 6f 6e 20 69 54 61 62 6c 65   location iTable
12cf0 2e 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  . The following 
12d00 63 6f 64 65 20 6d 6f 64 69 66 69 65 73 20 74 68  code modifies th
12d10 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  e sqlite_master 
12d20 74 61 62 6c 65 20 74 6f 0a 20 20 2a 2a 20 72 65  table to.  ** re
12d30 66 6c 65 63 74 20 74 68 69 73 2e 0a 20 20 2a 2a  flect this..  **
12d40 0a 20 20 2a 2a 20 54 68 65 20 22 23 4e 4e 4e 22  .  ** The "#NNN"
12d50 20 69 6e 20 74 68 65 20 53 51 4c 20 69 73 20 61   in the SQL is a
12d60 20 73 70 65 63 69 61 6c 20 63 6f 6e 73 74 61 6e   special constan
12d70 74 20 74 68 61 74 20 6d 65 61 6e 73 20 77 68 61  t that means wha
12d80 74 65 76 65 72 20 76 61 6c 75 65 0a 20 20 2a 2a  tever value.  **
12d90 20 69 73 20 69 6e 20 72 65 67 69 73 74 65 72 20   is in register 
12da0 4e 4e 4e 2e 20 20 53 65 65 20 67 72 61 6d 6d 61  NNN.  See gramma
12db0 72 20 72 75 6c 65 73 20 61 73 73 6f 63 69 61 74  r rules associat
12dc0 65 64 20 77 69 74 68 20 74 68 65 20 54 4b 5f 52  ed with the TK_R
12dd0 45 47 49 53 54 45 52 0a 20 20 2a 2a 20 74 6f 6b  EGISTER.  ** tok
12de0 65 6e 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61  en for additiona
12df0 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 20  l information.. 
12e00 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 4e 65 73   */.  sqlite3Nes
12e10 74 65 64 50 61 72 73 65 28 70 50 61 72 73 65 2c  tedParse(pParse,
12e20 20 0a 20 20 20 20 20 22 55 50 44 41 54 45 20 25   .     "UPDATE %
12e30 51 2e 25 73 20 53 45 54 20 72 6f 6f 74 70 61 67  Q.%s SET rootpag
12e40 65 3d 25 64 20 57 48 45 52 45 20 23 25 64 20 41  e=%d WHERE #%d A
12e50 4e 44 20 72 6f 6f 74 70 61 67 65 3d 23 25 64 22  ND rootpage=#%d"
12e60 2c 0a 20 20 20 20 20 70 50 61 72 73 65 2d 3e 64  ,.     pParse->d
12e70 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d  b->aDb[iDb].zNam
12e80 65 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28  e, SCHEMA_TABLE(
12e90 69 44 62 29 2c 20 69 54 61 62 6c 65 2c 20 72 31  iDb), iTable, r1
12ea0 2c 20 72 31 29 3b 0a 23 65 6e 64 69 66 0a 20 20  , r1);.#endif.  
12eb0 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
12ec0 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 31  mpReg(pParse, r1
12ed0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74  );.}../*.** Writ
12ee0 65 20 56 44 42 45 20 63 6f 64 65 20 74 6f 20 65  e VDBE code to e
12ef0 72 61 73 65 20 74 61 62 6c 65 20 70 54 61 62 20  rase table pTab 
12f00 61 6e 64 20 61 6c 6c 20 61 73 73 6f 63 69 61 74  and all associat
12f10 65 64 20 69 6e 64 69 63 65 73 20 6f 6e 20 64 69  ed indices on di
12f20 73 6b 2e 0a 2a 2a 20 43 6f 64 65 20 74 6f 20 75  sk..** Code to u
12f30 70 64 61 74 65 20 74 68 65 20 73 71 6c 69 74 65  pdate the sqlite
12f40 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 73 20 61  _master tables a
12f50 6e 64 20 69 6e 74 65 72 6e 61 6c 20 73 63 68 65  nd internal sche
12f60 6d 61 20 64 65 66 69 6e 69 74 69 6f 6e 73 0a 2a  ma definitions.*
12f70 2a 20 69 6e 20 63 61 73 65 20 61 20 72 6f 6f 74  * in case a root
12f80 2d 70 61 67 65 20 62 65 6c 6f 6e 67 69 6e 67 20  -page belonging 
12f90 74 6f 20 61 6e 6f 74 68 65 72 20 74 61 62 6c 65  to another table
12fa0 20 69 73 20 6d 6f 76 65 64 20 62 79 20 74 68 65   is moved by the
12fb0 20 62 74 72 65 65 20 6c 61 79 65 72 0a 2a 2a 20   btree layer.** 
12fc0 69 73 20 61 6c 73 6f 20 61 64 64 65 64 20 28 74  is also added (t
12fd0 68 69 73 20 63 61 6e 20 68 61 70 70 65 6e 20 77  his can happen w
12fe0 69 74 68 20 61 6e 20 61 75 74 6f 2d 76 61 63 75  ith an auto-vacu
12ff0 75 6d 20 64 61 74 61 62 61 73 65 29 2e 0a 2a 2f  um database)..*/
13000 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64 65 73  .static void des
13010 74 72 6f 79 54 61 62 6c 65 28 50 61 72 73 65 20  troyTable(Parse 
13020 2a 70 50 61 72 73 65 2c 20 54 61 62 6c 65 20 2a  *pParse, Table *
13030 70 54 61 62 29 7b 0a 23 69 66 64 65 66 20 53 51  pTab){.#ifdef SQ
13040 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
13050 43 55 55 4d 0a 20 20 49 6e 64 65 78 20 2a 70 49  CUUM.  Index *pI
13060 64 78 3b 0a 20 20 69 6e 74 20 69 44 62 20 3d 20  dx;.  int iDb = 
13070 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49  sqlite3SchemaToI
13080 6e 64 65 78 28 70 50 61 72 73 65 2d 3e 64 62 2c  ndex(pParse->db,
13090 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b   pTab->pSchema);
130a0 0a 20 20 64 65 73 74 72 6f 79 52 6f 6f 74 50 61  .  destroyRootPa
130b0 67 65 28 70 50 61 72 73 65 2c 20 70 54 61 62 2d  ge(pParse, pTab-
130c0 3e 74 6e 75 6d 2c 20 69 44 62 29 3b 0a 20 20 66  >tnum, iDb);.  f
130d0 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49  or(pIdx=pTab->pI
130e0 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78  ndex; pIdx; pIdx
130f0 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20  =pIdx->pNext){. 
13100 20 20 20 64 65 73 74 72 6f 79 52 6f 6f 74 50 61     destroyRootPa
13110 67 65 28 70 50 61 72 73 65 2c 20 70 49 64 78 2d  ge(pParse, pIdx-
13120 3e 74 6e 75 6d 2c 20 69 44 62 29 3b 0a 20 20 7d  >tnum, iDb);.  }
13130 0a 23 65 6c 73 65 0a 20 20 2f 2a 20 49 66 20 74  .#else.  /* If t
13140 68 65 20 64 61 74 61 62 61 73 65 20 6d 61 79 20  he database may 
13150 62 65 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 63  be auto-vacuum c
13160 61 70 61 62 6c 65 20 28 69 66 20 53 51 4c 49 54  apable (if SQLIT
13170 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
13180 4d 0a 20 20 2a 2a 20 69 73 20 6e 6f 74 20 64 65  M.  ** is not de
13190 66 69 6e 65 64 29 2c 20 74 68 65 6e 20 69 74 20  fined), then it 
131a0 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f 20  is important to 
131b0 63 61 6c 6c 20 4f 50 5f 44 65 73 74 72 6f 79 20  call OP_Destroy 
131c0 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 74 61 62 6c  on the.  ** tabl
131d0 65 20 61 6e 64 20 69 6e 64 65 78 20 72 6f 6f 74  e and index root
131e0 2d 70 61 67 65 73 20 69 6e 20 6f 72 64 65 72 2c  -pages in order,
131f0 20 73 74 61 72 74 69 6e 67 20 77 69 74 68 20 74   starting with t
13200 68 65 20 6e 75 6d 65 72 69 63 61 6c 6c 79 20 0a  he numerically .
13210 20 20 2a 2a 20 6c 61 72 67 65 73 74 20 72 6f 6f    ** largest roo
13220 74 2d 70 61 67 65 20 6e 75 6d 62 65 72 2e 20 54  t-page number. T
13230 68 69 73 20 67 75 61 72 61 6e 74 65 65 73 20 74  his guarantees t
13240 68 61 74 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20  hat none of the 
13250 72 6f 6f 74 2d 70 61 67 65 73 0a 20 20 2a 2a 20  root-pages.  ** 
13260 74 6f 20 62 65 20 64 65 73 74 72 6f 79 65 64 20  to be destroyed 
13270 69 73 20 72 65 6c 6f 63 61 74 65 64 20 62 79 20  is relocated by 
13280 61 6e 20 65 61 72 6c 69 65 72 20 4f 50 5f 44 65  an earlier OP_De
13290 73 74 72 6f 79 2e 20 69 2e 65 2e 20 69 66 20 74  stroy. i.e. if t
132a0 68 65 0a 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e  he.  ** followin
132b0 67 20 77 65 72 65 20 63 6f 64 65 64 3a 0a 20 20  g were coded:.  
132c0 2a 2a 0a 20 20 2a 2a 20 4f 50 5f 44 65 73 74 72  **.  ** OP_Destr
132d0 6f 79 20 34 20 30 0a 20 20 2a 2a 20 2e 2e 2e 0a  oy 4 0.  ** ....
132e0 20 20 2a 2a 20 4f 50 5f 44 65 73 74 72 6f 79 20    ** OP_Destroy 
132f0 35 20 30 0a 20 20 2a 2a 0a 20 20 2a 2a 20 61 6e  5 0.  **.  ** an
13300 64 20 72 6f 6f 74 20 70 61 67 65 20 35 20 68 61  d root page 5 ha
13310 70 70 65 6e 65 64 20 74 6f 20 62 65 20 74 68 65  ppened to be the
13320 20 6c 61 72 67 65 73 74 20 72 6f 6f 74 2d 70 61   largest root-pa
13330 67 65 20 6e 75 6d 62 65 72 20 69 6e 20 74 68 65  ge number in the
13340 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 2c 20  .  ** database, 
13350 74 68 65 6e 20 72 6f 6f 74 20 70 61 67 65 20 35  then root page 5
13360 20 77 6f 75 6c 64 20 62 65 20 6d 6f 76 65 64 20   would be moved 
13370 74 6f 20 70 61 67 65 20 34 20 62 79 20 74 68 65  to page 4 by the
13380 20 0a 20 20 2a 2a 20 22 4f 50 5f 44 65 73 74 72   .  ** "OP_Destr
13390 6f 79 20 34 20 30 22 20 6f 70 63 6f 64 65 2e 20  oy 4 0" opcode. 
133a0 54 68 65 20 73 75 62 73 65 71 75 65 6e 74 20 22  The subsequent "
133b0 4f 50 5f 44 65 73 74 72 6f 79 20 35 20 30 22 20  OP_Destroy 5 0" 
133c0 77 6f 75 6c 64 20 68 69 74 0a 20 20 2a 2a 20 61  would hit.  ** a
133d0 20 66 72 65 65 2d 6c 69 73 74 20 70 61 67 65 2e   free-list page.
133e0 0a 20 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62  .  */.  int iTab
133f0 20 3d 20 70 54 61 62 2d 3e 74 6e 75 6d 3b 0a 20   = pTab->tnum;. 
13400 20 69 6e 74 20 69 44 65 73 74 72 6f 79 65 64 20   int iDestroyed 
13410 3d 20 30 3b 0a 0a 20 20 77 68 69 6c 65 28 20 31  = 0;..  while( 1
13420 20 29 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70   ){.    Index *p
13430 49 64 78 3b 0a 20 20 20 20 69 6e 74 20 69 4c 61  Idx;.    int iLa
13440 72 67 65 73 74 20 3d 20 30 3b 0a 0a 20 20 20 20  rgest = 0;..    
13450 69 66 28 20 69 44 65 73 74 72 6f 79 65 64 3d 3d  if( iDestroyed==
13460 30 20 7c 7c 20 69 54 61 62 3c 69 44 65 73 74 72  0 || iTab<iDestr
13470 6f 79 65 64 20 29 7b 0a 20 20 20 20 20 20 69 4c  oyed ){.      iL
13480 61 72 67 65 73 74 20 3d 20 69 54 61 62 3b 0a 20  argest = iTab;. 
13490 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 70 49 64     }.    for(pId
134a0 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20  x=pTab->pIndex; 
134b0 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d  pIdx; pIdx=pIdx-
134c0 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69  >pNext){.      i
134d0 6e 74 20 69 49 64 78 20 3d 20 70 49 64 78 2d 3e  nt iIdx = pIdx->
134e0 74 6e 75 6d 3b 0a 20 20 20 20 20 20 61 73 73 65  tnum;.      asse
134f0 72 74 28 20 70 49 64 78 2d 3e 70 53 63 68 65 6d  rt( pIdx->pSchem
13500 61 3d 3d 70 54 61 62 2d 3e 70 53 63 68 65 6d 61  a==pTab->pSchema
13510 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28 69   );.      if( (i
13520 44 65 73 74 72 6f 79 65 64 3d 3d 30 20 7c 7c 20  Destroyed==0 || 
13530 28 69 49 64 78 3c 69 44 65 73 74 72 6f 79 65 64  (iIdx<iDestroyed
13540 29 29 20 26 26 20 69 49 64 78 3e 69 4c 61 72 67  )) && iIdx>iLarg
13550 65 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 69  est ){.        i
13560 4c 61 72 67 65 73 74 20 3d 20 69 49 64 78 3b 0a  Largest = iIdx;.
13570 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
13580 20 20 69 66 28 20 69 4c 61 72 67 65 73 74 3d 3d    if( iLargest==
13590 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  0 ){.      retur
135a0 6e 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  n;.    }else{.  
135b0 20 20 20 20 69 6e 74 20 69 44 62 20 3d 20 73 71      int iDb = sq
135c0 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64  lite3SchemaToInd
135d0 65 78 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  ex(pParse->db, p
135e0 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20  Tab->pSchema);. 
135f0 20 20 20 20 20 61 73 73 65 72 74 28 20 69 44 62       assert( iDb
13600 3e 3d 30 20 26 26 20 69 44 62 3c 70 50 61 72 73  >=0 && iDb<pPars
13610 65 2d 3e 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20  e->db->nDb );.  
13620 20 20 20 20 64 65 73 74 72 6f 79 52 6f 6f 74 50      destroyRootP
13630 61 67 65 28 70 50 61 72 73 65 2c 20 69 4c 61 72  age(pParse, iLar
13640 67 65 73 74 2c 20 69 44 62 29 3b 0a 20 20 20 20  gest, iDb);.    
13650 20 20 69 44 65 73 74 72 6f 79 65 64 20 3d 20 69    iDestroyed = i
13660 4c 61 72 67 65 73 74 3b 0a 20 20 20 20 7d 0a 20  Largest;.    }. 
13670 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a   }.#endif.}../*.
13680 2a 2a 20 52 65 6d 6f 76 65 20 65 6e 74 72 69 65  ** Remove entrie
13690 73 20 66 72 6f 6d 20 74 68 65 20 73 71 6c 69 74  s from the sqlit
136a0 65 5f 73 74 61 74 4e 20 74 61 62 6c 65 73 20 28  e_statN tables (
136b0 66 6f 72 20 4e 20 69 6e 20 28 31 2c 32 2c 33 29  for N in (1,2,3)
136c0 29 0a 2a 2a 20 61 66 74 65 72 20 61 20 44 52 4f  ).** after a DRO
136d0 50 20 49 4e 44 45 58 20 6f 72 20 44 52 4f 50 20  P INDEX or DROP 
136e0 54 41 42 4c 45 20 63 6f 6d 6d 61 6e 64 2e 0a 2a  TABLE command..*
136f0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 71  /.static void sq
13700 6c 69 74 65 33 43 6c 65 61 72 53 74 61 74 54 61  lite3ClearStatTa
13710 62 6c 65 73 28 0a 20 20 50 61 72 73 65 20 2a 70  bles(.  Parse *p
13720 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 2f  Parse,         /
13730 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20 63 6f  * The parsing co
13740 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20 69  ntext */.  int i
13750 44 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  Db,             
13760 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73    /* The databas
13770 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 63 6f  e number */.  co
13780 6e 73 74 20 63 68 61 72 20 2a 7a 54 79 70 65 2c  nst char *zType,
13790 20 20 20 20 20 2f 2a 20 22 69 64 78 22 20 6f 72       /* "idx" or
137a0 20 22 74 62 6c 22 20 2a 2f 0a 20 20 63 6f 6e 73   "tbl" */.  cons
137b0 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 20 20  t char *zName   
137c0 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 69 6e     /* Name of in
137d0 64 65 78 20 6f 72 20 74 61 62 6c 65 20 2a 2f 0a  dex or table */.
137e0 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 6f  ){.  int i;.  co
137f0 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 4e 61 6d  nst char *zDbNam
13800 65 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e  e = pParse->db->
13810 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a  aDb[iDb].zName;.
13820 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 3d 34 3b    for(i=1; i<=4;
13830 20 69 2b 2b 29 7b 0a 20 20 20 20 63 68 61 72 20   i++){.    char 
13840 7a 54 61 62 5b 32 34 5d 3b 0a 20 20 20 20 73 71  zTab[24];.    sq
13850 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73  lite3_snprintf(s
13860 69 7a 65 6f 66 28 7a 54 61 62 29 2c 7a 54 61 62  izeof(zTab),zTab
13870 2c 22 73 71 6c 69 74 65 5f 73 74 61 74 25 64 22  ,"sqlite_stat%d"
13880 2c 69 29 3b 0a 20 20 20 20 69 66 28 20 73 71 6c  ,i);.    if( sql
13890 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28 70 50  ite3FindTable(pP
138a0 61 72 73 65 2d 3e 64 62 2c 20 7a 54 61 62 2c 20  arse->db, zTab, 
138b0 7a 44 62 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20  zDbName) ){.    
138c0 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50    sqlite3NestedP
138d0 61 72 73 65 28 70 50 61 72 73 65 2c 0a 20 20 20  arse(pParse,.   
138e0 20 20 20 20 20 22 44 45 4c 45 54 45 20 46 52 4f       "DELETE FRO
138f0 4d 20 25 51 2e 25 73 20 57 48 45 52 45 20 25 73  M %Q.%s WHERE %s
13900 3d 25 51 22 2c 0a 20 20 20 20 20 20 20 20 7a 44  =%Q",.        zD
13910 62 4e 61 6d 65 2c 20 7a 54 61 62 2c 20 7a 54 79  bName, zTab, zTy
13920 70 65 2c 20 7a 4e 61 6d 65 0a 20 20 20 20 20 20  pe, zName.      
13930 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  );.    }.  }.}..
13940 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
13950 6f 64 65 20 74 6f 20 64 72 6f 70 20 61 20 74 61  ode to drop a ta
13960 62 6c 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ble..*/.void sql
13970 69 74 65 33 43 6f 64 65 44 72 6f 70 54 61 62 6c  ite3CodeDropTabl
13980 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
13990 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 69 6e   Table *pTab, in
139a0 74 20 69 44 62 2c 20 69 6e 74 20 69 73 56 69 65  t iDb, int isVie
139b0 77 29 7b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20  w){.  Vdbe *v;. 
139c0 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
139d0 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 54 72 69  Parse->db;.  Tri
139e0 67 67 65 72 20 2a 70 54 72 69 67 67 65 72 3b 0a  gger *pTrigger;.
139f0 20 20 44 62 20 2a 70 44 62 20 3d 20 26 64 62 2d    Db *pDb = &db-
13a00 3e 61 44 62 5b 69 44 62 5d 3b 0a 0a 20 20 76 20  >aDb[iDb];..  v 
13a10 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
13a20 28 70 50 61 72 73 65 29 3b 0a 20 20 61 73 73 65  (pParse);.  asse
13a30 72 74 28 20 76 21 3d 30 20 29 3b 0a 20 20 73 71  rt( v!=0 );.  sq
13a40 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f  lite3BeginWriteO
13a50 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c  peration(pParse,
13a60 20 31 2c 20 69 44 62 29 3b 0a 0a 23 69 66 6e 64   1, iDb);..#ifnd
13a70 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
13a80 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 69 66  IRTUALTABLE.  if
13a90 28 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62  ( IsVirtual(pTab
13aa0 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) ){.    sqlite3
13ab0 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50  VdbeAddOp0(v, OP
13ac0 5f 56 42 65 67 69 6e 29 3b 0a 20 20 7d 0a 23 65  _VBegin);.  }.#e
13ad0 6e 64 69 66 0a 0a 20 20 2f 2a 20 44 72 6f 70 20  ndif..  /* Drop 
13ae0 61 6c 6c 20 74 72 69 67 67 65 72 73 20 61 73 73  all triggers ass
13af0 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
13b00 20 74 61 62 6c 65 20 62 65 69 6e 67 20 64 72 6f   table being dro
13b10 70 70 65 64 2e 20 43 6f 64 65 0a 20 20 2a 2a 20  pped. Code.  ** 
13b20 69 73 20 67 65 6e 65 72 61 74 65 64 20 74 6f 20  is generated to 
13b30 72 65 6d 6f 76 65 20 65 6e 74 72 69 65 73 20 66  remove entries f
13b40 72 6f 6d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  rom sqlite_maste
13b50 72 20 61 6e 64 2f 6f 72 0a 20 20 2a 2a 20 73 71  r and/or.  ** sq
13b60 6c 69 74 65 5f 74 65 6d 70 5f 6d 61 73 74 65 72  lite_temp_master
13b70 20 69 66 20 72 65 71 75 69 72 65 64 2e 0a 20 20   if required..  
13b80 2a 2f 0a 20 20 70 54 72 69 67 67 65 72 20 3d 20  */.  pTrigger = 
13b90 73 71 6c 69 74 65 33 54 72 69 67 67 65 72 4c 69  sqlite3TriggerLi
13ba0 73 74 28 70 50 61 72 73 65 2c 20 70 54 61 62 29  st(pParse, pTab)
13bb0 3b 0a 20 20 77 68 69 6c 65 28 20 70 54 72 69 67  ;.  while( pTrig
13bc0 67 65 72 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ger ){.    asser
13bd0 74 28 20 70 54 72 69 67 67 65 72 2d 3e 70 53 63  t( pTrigger->pSc
13be0 68 65 6d 61 3d 3d 70 54 61 62 2d 3e 70 53 63 68  hema==pTab->pSch
13bf0 65 6d 61 20 7c 7c 20 0a 20 20 20 20 20 20 20 20  ema || .        
13c00 70 54 72 69 67 67 65 72 2d 3e 70 53 63 68 65 6d  pTrigger->pSchem
13c10 61 3d 3d 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 53  a==db->aDb[1].pS
13c20 63 68 65 6d 61 20 29 3b 0a 20 20 20 20 73 71 6c  chema );.    sql
13c30 69 74 65 33 44 72 6f 70 54 72 69 67 67 65 72 50  ite3DropTriggerP
13c40 74 72 28 70 50 61 72 73 65 2c 20 70 54 72 69 67  tr(pParse, pTrig
13c50 67 65 72 29 3b 0a 20 20 20 20 70 54 72 69 67 67  ger);.    pTrigg
13c60 65 72 20 3d 20 70 54 72 69 67 67 65 72 2d 3e 70  er = pTrigger->p
13c70 4e 65 78 74 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64  Next;.  }..#ifnd
13c80 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
13c90 55 54 4f 49 4e 43 52 45 4d 45 4e 54 0a 20 20 2f  UTOINCREMENT.  /
13ca0 2a 20 52 65 6d 6f 76 65 20 61 6e 79 20 65 6e 74  * Remove any ent
13cb0 72 69 65 73 20 6f 66 20 74 68 65 20 73 71 6c 69  ries of the sqli
13cc0 74 65 5f 73 65 71 75 65 6e 63 65 20 74 61 62 6c  te_sequence tabl
13cd0 65 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  e associated wit
13ce0 68 0a 20 20 2a 2a 20 74 68 65 20 74 61 62 6c 65  h.  ** the table
13cf0 20 62 65 69 6e 67 20 64 72 6f 70 70 65 64 2e 20   being dropped. 
13d00 54 68 69 73 20 69 73 20 64 6f 6e 65 20 62 65 66  This is done bef
13d10 6f 72 65 20 74 68 65 20 74 61 62 6c 65 20 69 73  ore the table is
13d20 20 64 72 6f 70 70 65 64 0a 20 20 2a 2a 20 61 74   dropped.  ** at
13d30 20 74 68 65 20 62 74 72 65 65 20 6c 65 76 65 6c   the btree level
13d40 2c 20 69 6e 20 63 61 73 65 20 74 68 65 20 73 71  , in case the sq
13d50 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 20 74 61  lite_sequence ta
13d60 62 6c 65 20 6e 65 65 64 73 20 74 6f 0a 20 20 2a  ble needs to.  *
13d70 2a 20 6d 6f 76 65 20 61 73 20 61 20 72 65 73 75  * move as a resu
13d80 6c 74 20 6f 66 20 74 68 65 20 64 72 6f 70 20 28  lt of the drop (
13d90 63 61 6e 20 68 61 70 70 65 6e 20 69 6e 20 61 75  can happen in au
13da0 74 6f 2d 76 61 63 75 75 6d 20 6d 6f 64 65 29 2e  to-vacuum mode).
13db0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 54 61 62  .  */.  if( pTab
13dc0 2d 3e 74 61 62 46 6c 61 67 73 20 26 20 54 46 5f  ->tabFlags & TF_
13dd0 41 75 74 6f 69 6e 63 72 65 6d 65 6e 74 20 29 7b  Autoincrement ){
13de0 0a 20 20 20 20 73 71 6c 69 74 65 33 4e 65 73 74  .    sqlite3Nest
13df0 65 64 50 61 72 73 65 28 70 50 61 72 73 65 2c 0a  edParse(pParse,.
13e00 20 20 20 20 20 20 22 44 45 4c 45 54 45 20 46 52        "DELETE FR
13e10 4f 4d 20 25 51 2e 73 71 6c 69 74 65 5f 73 65 71  OM %Q.sqlite_seq
13e20 75 65 6e 63 65 20 57 48 45 52 45 20 6e 61 6d 65  uence WHERE name
13e30 3d 25 51 22 2c 0a 20 20 20 20 20 20 70 44 62 2d  =%Q",.      pDb-
13e40 3e 7a 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 7a 4e  >zName, pTab->zN
13e50 61 6d 65 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 23  ame.    );.  }.#
13e60 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 44 72 6f 70  endif..  /* Drop
13e70 20 61 6c 6c 20 53 51 4c 49 54 45 5f 4d 41 53 54   all SQLITE_MAST
13e80 45 52 20 74 61 62 6c 65 20 61 6e 64 20 69 6e 64  ER table and ind
13e90 65 78 20 65 6e 74 72 69 65 73 20 74 68 61 74 20  ex entries that 
13ea0 72 65 66 65 72 20 74 6f 20 74 68 65 0a 20 20 2a  refer to the.  *
13eb0 2a 20 74 61 62 6c 65 2e 20 54 68 65 20 70 72 6f  * table. The pro
13ec0 67 72 61 6d 20 6e 61 6d 65 20 6c 6f 6f 70 73 20  gram name loops 
13ed0 74 68 72 6f 75 67 68 20 74 68 65 20 6d 61 73 74  through the mast
13ee0 65 72 20 74 61 62 6c 65 20 61 6e 64 20 64 65 6c  er table and del
13ef0 65 74 65 73 0a 20 20 2a 2a 20 65 76 65 72 79 20  etes.  ** every 
13f00 72 6f 77 20 74 68 61 74 20 72 65 66 65 72 73 20  row that refers 
13f10 74 6f 20 61 20 74 61 62 6c 65 20 6f 66 20 74 68  to a table of th
13f20 65 20 73 61 6d 65 20 6e 61 6d 65 20 61 73 20 74  e same name as t
13f30 68 65 20 6f 6e 65 20 62 65 69 6e 67 0a 20 20 2a  he one being.  *
13f40 2a 20 64 72 6f 70 70 65 64 2e 20 54 72 69 67 67  * dropped. Trigg
13f50 65 72 73 20 61 72 65 20 68 61 6e 64 6c 65 64 20  ers are handled 
13f60 73 65 70 61 72 61 74 65 6c 79 20 62 65 63 61 75  separately becau
13f70 73 65 20 61 20 74 72 69 67 67 65 72 20 63 61 6e  se a trigger can
13f80 20 62 65 0a 20 20 2a 2a 20 63 72 65 61 74 65 64   be.  ** created
13f90 20 69 6e 20 74 68 65 20 74 65 6d 70 20 64 61 74   in the temp dat
13fa0 61 62 61 73 65 20 74 68 61 74 20 72 65 66 65 72  abase that refer
13fb0 73 20 74 6f 20 61 20 74 61 62 6c 65 20 69 6e 20  s to a table in 
13fc0 61 6e 6f 74 68 65 72 0a 20 20 2a 2a 20 64 61 74  another.  ** dat
13fd0 61 62 61 73 65 2e 0a 20 20 2a 2f 0a 20 20 73 71  abase..  */.  sq
13fe0 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72 73 65  lite3NestedParse
13ff0 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20  (pParse, .      
14000 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 25 51 2e  "DELETE FROM %Q.
14010 25 73 20 57 48 45 52 45 20 74 62 6c 5f 6e 61 6d  %s WHERE tbl_nam
14020 65 3d 25 51 20 61 6e 64 20 74 79 70 65 21 3d 27  e=%Q and type!='
14030 74 72 69 67 67 65 72 27 22 2c 0a 20 20 20 20 20  trigger'",.     
14040 20 70 44 62 2d 3e 7a 4e 61 6d 65 2c 20 53 43 48   pDb->zName, SCH
14050 45 4d 41 5f 54 41 42 4c 45 28 69 44 62 29 2c 20  EMA_TABLE(iDb), 
14060 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pTab->zName);.  
14070 69 66 28 20 21 69 73 56 69 65 77 20 26 26 20 21  if( !isView && !
14080 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20  IsVirtual(pTab) 
14090 29 7b 0a 20 20 20 20 64 65 73 74 72 6f 79 54 61  ){.    destroyTa
140a0 62 6c 65 28 70 50 61 72 73 65 2c 20 70 54 61 62  ble(pParse, pTab
140b0 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 6d  );.  }..  /* Rem
140c0 6f 76 65 20 74 68 65 20 74 61 62 6c 65 20 65 6e  ove the table en
140d0 74 72 79 20 66 72 6f 6d 20 53 51 4c 69 74 65 27  try from SQLite'
140e0 73 20 69 6e 74 65 72 6e 61 6c 20 73 63 68 65 6d  s internal schem
140f0 61 20 61 6e 64 20 6d 6f 64 69 66 79 0a 20 20 2a  a and modify.  *
14100 2a 20 74 68 65 20 73 63 68 65 6d 61 20 63 6f 6f  * the schema coo
14110 6b 69 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  kie..  */.  if( 
14120 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20  IsVirtual(pTab) 
14130 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
14140 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 56  beAddOp4(v, OP_V
14150 44 65 73 74 72 6f 79 2c 20 69 44 62 2c 20 30 2c  Destroy, iDb, 0,
14160 20 30 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c   0, pTab->zName,
14170 20 30 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74   0);.  }.  sqlit
14180 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
14190 4f 50 5f 44 72 6f 70 54 61 62 6c 65 2c 20 69 44  OP_DropTable, iD
141a0 62 2c 20 30 2c 20 30 2c 20 70 54 61 62 2d 3e 7a  b, 0, 0, pTab->z
141b0 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 73 71 6c 69  Name, 0);.  sqli
141c0 74 65 33 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28  te3ChangeCookie(
141d0 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20  pParse, iDb);.  
141e0 73 71 6c 69 74 65 56 69 65 77 52 65 73 65 74 41  sqliteViewResetA
141f0 6c 6c 28 64 62 2c 20 69 44 62 29 3b 0a 7d 0a 0a  ll(db, iDb);.}..
14200 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
14210 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20  ne is called to 
14220 64 6f 20 74 68 65 20 77 6f 72 6b 20 6f 66 20 61  do the work of a
14230 20 44 52 4f 50 20 54 41 42 4c 45 20 73 74 61 74   DROP TABLE stat
14240 65 6d 65 6e 74 2e 0a 2a 2a 20 70 4e 61 6d 65 20  ement..** pName 
14250 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  is the name of t
14260 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20 64  he table to be d
14270 72 6f 70 70 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20  ropped..*/.void 
14280 73 71 6c 69 74 65 33 44 72 6f 70 54 61 62 6c 65  sqlite3DropTable
14290 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
142a0 53 72 63 4c 69 73 74 20 2a 70 4e 61 6d 65 2c 20  SrcList *pName, 
142b0 69 6e 74 20 69 73 56 69 65 77 2c 20 69 6e 74 20  int isView, int 
142c0 6e 6f 45 72 72 29 7b 0a 20 20 54 61 62 6c 65 20  noErr){.  Table 
142d0 2a 70 54 61 62 3b 0a 20 20 56 64 62 65 20 2a 76  *pTab;.  Vdbe *v
142e0 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
142f0 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
14300 69 6e 74 20 69 44 62 3b 0a 0a 20 20 69 66 28 20  int iDb;..  if( 
14310 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
14320 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69   ){.    goto exi
14330 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20  t_drop_table;.  
14340 7d 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72  }.  assert( pPar
14350 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 29 3b 0a 20  se->nErr==0 );. 
14360 20 61 73 73 65 72 74 28 20 70 4e 61 6d 65 2d 3e   assert( pName->
14370 6e 53 72 63 3d 3d 31 20 29 3b 0a 20 20 69 66 28  nSrc==1 );.  if(
14380 20 73 71 6c 69 74 65 33 52 65 61 64 53 63 68 65   sqlite3ReadSche
14390 6d 61 28 70 50 61 72 73 65 29 20 29 20 67 6f 74  ma(pParse) ) got
143a0 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c  o exit_drop_tabl
143b0 65 3b 0a 20 20 69 66 28 20 6e 6f 45 72 72 20 29  e;.  if( noErr )
143c0 20 64 62 2d 3e 73 75 70 70 72 65 73 73 45 72 72   db->suppressErr
143d0 2b 2b 3b 0a 20 20 70 54 61 62 20 3d 20 73 71 6c  ++;.  pTab = sql
143e0 69 74 65 33 4c 6f 63 61 74 65 54 61 62 6c 65 49  ite3LocateTableI
143f0 74 65 6d 28 70 50 61 72 73 65 2c 20 69 73 56 69  tem(pParse, isVi
14400 65 77 2c 20 26 70 4e 61 6d 65 2d 3e 61 5b 30 5d  ew, &pName->a[0]
14410 29 3b 0a 20 20 69 66 28 20 6e 6f 45 72 72 20 29  );.  if( noErr )
14420 20 64 62 2d 3e 73 75 70 70 72 65 73 73 45 72 72   db->suppressErr
14430 2d 2d 3b 0a 0a 20 20 69 66 28 20 70 54 61 62 3d  --;..  if( pTab=
14440 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 6f  =0 ){.    if( no
14450 45 72 72 20 29 20 73 71 6c 69 74 65 33 43 6f 64  Err ) sqlite3Cod
14460 65 56 65 72 69 66 79 4e 61 6d 65 64 53 63 68 65  eVerifyNamedSche
14470 6d 61 28 70 50 61 72 73 65 2c 20 70 4e 61 6d 65  ma(pParse, pName
14480 2d 3e 61 5b 30 5d 2e 7a 44 61 74 61 62 61 73 65  ->a[0].zDatabase
14490 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74  );.    goto exit
144a0 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 7d  _drop_table;.  }
144b0 0a 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33  .  iDb = sqlite3
144c0 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62  SchemaToIndex(db
144d0 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29  , pTab->pSchema)
144e0 3b 0a 20 20 61 73 73 65 72 74 28 20 69 44 62 3e  ;.  assert( iDb>
144f0 3d 30 20 26 26 20 69 44 62 3c 64 62 2d 3e 6e 44  =0 && iDb<db->nD
14500 62 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 54  b );..  /* If pT
14510 61 62 20 69 73 20 61 20 76 69 72 74 75 61 6c 20  ab is a virtual 
14520 74 61 62 6c 65 2c 20 63 61 6c 6c 20 56 69 65 77  table, call View
14530 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 29  GetColumnNames()
14540 20 74 6f 20 65 6e 73 75 72 65 0a 20 20 2a 2a 20   to ensure.  ** 
14550 69 74 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65  it is initialize
14560 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 49 73  d..  */.  if( Is
14570 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 26 26  Virtual(pTab) &&
14580 20 73 71 6c 69 74 65 33 56 69 65 77 47 65 74 43   sqlite3ViewGetC
14590 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73  olumnNames(pPars
145a0 65 2c 20 70 54 61 62 29 20 29 7b 0a 20 20 20 20  e, pTab) ){.    
145b0 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74  goto exit_drop_t
145c0 61 62 6c 65 3b 0a 20 20 7d 0a 23 69 66 6e 64 65  able;.  }.#ifnde
145d0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
145e0 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 7b 0a  THORIZATION.  {.
145f0 20 20 20 20 69 6e 74 20 63 6f 64 65 3b 0a 20 20      int code;.  
14600 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54    const char *zT
14610 61 62 20 3d 20 53 43 48 45 4d 41 5f 54 41 42 4c  ab = SCHEMA_TABL
14620 45 28 69 44 62 29 3b 0a 20 20 20 20 63 6f 6e 73  E(iDb);.    cons
14630 74 20 63 68 61 72 20 2a 7a 44 62 20 3d 20 64 62  t char *zDb = db
14640 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65  ->aDb[iDb].zName
14650 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  ;.    const char
14660 20 2a 7a 41 72 67 32 20 3d 20 30 3b 0a 20 20 20   *zArg2 = 0;.   
14670 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68   if( sqlite3Auth
14680 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51  Check(pParse, SQ
14690 4c 49 54 45 5f 44 45 4c 45 54 45 2c 20 7a 54 61  LITE_DELETE, zTa
146a0 62 2c 20 30 2c 20 7a 44 62 29 29 7b 0a 20 20 20  b, 0, zDb)){.   
146b0 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f     goto exit_dro
146c0 70 5f 74 61 62 6c 65 3b 0a 20 20 20 20 7d 0a 20  p_table;.    }. 
146d0 20 20 20 69 66 28 20 69 73 56 69 65 77 20 29 7b     if( isView ){
146e0 0a 20 20 20 20 20 20 69 66 28 20 21 4f 4d 49 54  .      if( !OMIT
146f0 5f 54 45 4d 50 44 42 20 26 26 20 69 44 62 3d 3d  _TEMPDB && iDb==
14700 31 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 64  1 ){.        cod
14710 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f  e = SQLITE_DROP_
14720 54 45 4d 50 5f 56 49 45 57 3b 0a 20 20 20 20 20  TEMP_VIEW;.     
14730 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
14740 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52  code = SQLITE_DR
14750 4f 50 5f 56 49 45 57 3b 0a 20 20 20 20 20 20 7d  OP_VIEW;.      }
14760 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
14770 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
14780 45 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  E.    }else if( 
14790 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20  IsVirtual(pTab) 
147a0 29 7b 0a 20 20 20 20 20 20 63 6f 64 65 20 3d 20  ){.      code = 
147b0 53 51 4c 49 54 45 5f 44 52 4f 50 5f 56 54 41 42  SQLITE_DROP_VTAB
147c0 4c 45 3b 0a 20 20 20 20 20 20 7a 41 72 67 32 20  LE;.      zArg2 
147d0 3d 20 73 71 6c 69 74 65 33 47 65 74 56 54 61 62  = sqlite3GetVTab
147e0 6c 65 28 64 62 2c 20 70 54 61 62 29 2d 3e 70 4d  le(db, pTab)->pM
147f0 6f 64 2d 3e 7a 4e 61 6d 65 3b 0a 23 65 6e 64 69  od->zName;.#endi
14800 66 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  f.    }else{.   
14810 20 20 20 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d     if( !OMIT_TEM
14820 50 44 42 20 26 26 20 69 44 62 3d 3d 31 20 29 7b  PDB && iDb==1 ){
14830 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20 3d 20  .        code = 
14840 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50  SQLITE_DROP_TEMP
14850 5f 54 41 42 4c 45 3b 0a 20 20 20 20 20 20 7d 65  _TABLE;.      }e
14860 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 63 6f 64  lse{.        cod
14870 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f  e = SQLITE_DROP_
14880 54 41 42 4c 45 3b 0a 20 20 20 20 20 20 7d 0a 20  TABLE;.      }. 
14890 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 71 6c     }.    if( sql
148a0 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50  ite3AuthCheck(pP
148b0 61 72 73 65 2c 20 63 6f 64 65 2c 20 70 54 61 62  arse, code, pTab
148c0 2d 3e 7a 4e 61 6d 65 2c 20 7a 41 72 67 32 2c 20  ->zName, zArg2, 
148d0 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f  zDb) ){.      go
148e0 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62  to exit_drop_tab
148f0 6c 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  le;.    }.    if
14900 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65  ( sqlite3AuthChe
14910 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54  ck(pParse, SQLIT
14920 45 5f 44 45 4c 45 54 45 2c 20 70 54 61 62 2d 3e  E_DELETE, pTab->
14930 7a 4e 61 6d 65 2c 20 30 2c 20 7a 44 62 29 20 29  zName, 0, zDb) )
14940 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69  {.      goto exi
14950 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20  t_drop_table;.  
14960 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20    }.  }.#endif. 
14970 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 4e   if( sqlite3StrN
14980 49 43 6d 70 28 70 54 61 62 2d 3e 7a 4e 61 6d 65  ICmp(pTab->zName
14990 2c 20 22 73 71 6c 69 74 65 5f 22 2c 20 37 29 3d  , "sqlite_", 7)=
149a0 3d 30 20 0a 20 20 20 20 26 26 20 73 71 6c 69 74  =0 .    && sqlit
149b0 65 33 53 74 72 4e 49 43 6d 70 28 70 54 61 62 2d  e3StrNICmp(pTab-
149c0 3e 7a 4e 61 6d 65 2c 20 22 73 71 6c 69 74 65 5f  >zName, "sqlite_
149d0 73 74 61 74 22 2c 20 31 31 29 21 3d 30 20 29 7b  stat", 11)!=0 ){
149e0 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
149f0 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 61  rMsg(pParse, "ta
14a00 62 6c 65 20 25 73 20 6d 61 79 20 6e 6f 74 20 62  ble %s may not b
14a10 65 20 64 72 6f 70 70 65 64 22 2c 20 70 54 61 62  e dropped", pTab
14a20 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 67 6f  ->zName);.    go
14a30 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62  to exit_drop_tab
14a40 6c 65 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66  le;.  }..#ifndef
14a50 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45   SQLITE_OMIT_VIE
14a60 57 0a 20 20 2f 2a 20 45 6e 73 75 72 65 20 44 52  W.  /* Ensure DR
14a70 4f 50 20 54 41 42 4c 45 20 69 73 20 6e 6f 74 20  OP TABLE is not 
14a80 75 73 65 64 20 6f 6e 20 61 20 76 69 65 77 2c 20  used on a view, 
14a90 61 6e 64 20 44 52 4f 50 20 56 49 45 57 20 69 73  and DROP VIEW is
14aa0 20 6e 6f 74 20 75 73 65 64 0a 20 20 2a 2a 20 6f   not used.  ** o
14ab0 6e 20 61 20 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a  n a table..  */.
14ac0 20 20 69 66 28 20 69 73 56 69 65 77 20 26 26 20    if( isView && 
14ad0 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 3d 3d 30  pTab->pSelect==0
14ae0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
14af0 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
14b00 22 75 73 65 20 44 52 4f 50 20 54 41 42 4c 45 20  "use DROP TABLE 
14b10 74 6f 20 64 65 6c 65 74 65 20 74 61 62 6c 65 20  to delete table 
14b20 25 73 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  %s", pTab->zName
14b30 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74  );.    goto exit
14b40 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 7d  _drop_table;.  }
14b50 0a 20 20 69 66 28 20 21 69 73 56 69 65 77 20 26  .  if( !isView &
14b60 26 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20  & pTab->pSelect 
14b70 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
14b80 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
14b90 75 73 65 20 44 52 4f 50 20 56 49 45 57 20 74 6f  use DROP VIEW to
14ba0 20 64 65 6c 65 74 65 20 76 69 65 77 20 25 73 22   delete view %s"
14bb0 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a  , pTab->zName);.
14bc0 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72      goto exit_dr
14bd0 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 23 65  op_table;.  }.#e
14be0 6e 64 69 66 0a 0a 20 20 2f 2a 20 47 65 6e 65 72  ndif..  /* Gener
14bf0 61 74 65 20 63 6f 64 65 20 74 6f 20 72 65 6d 6f  ate code to remo
14c00 76 65 20 74 68 65 20 74 61 62 6c 65 20 66 72 6f  ve the table fro
14c10 6d 20 74 68 65 20 6d 61 73 74 65 72 20 74 61 62  m the master tab
14c20 6c 65 0a 20 20 2a 2a 20 6f 6e 20 64 69 73 6b 2e  le.  ** on disk.
14c30 0a 20 20 2a 2f 0a 20 20 76 20 3d 20 73 71 6c 69  .  */.  v = sqli
14c40 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
14c50 65 29 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a 20  e);.  if( v ){. 
14c60 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57     sqlite3BeginW
14c70 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50  riteOperation(pP
14c80 61 72 73 65 2c 20 31 2c 20 69 44 62 29 3b 0a 20  arse, 1, iDb);. 
14c90 20 20 20 73 71 6c 69 74 65 33 43 6c 65 61 72 53     sqlite3ClearS
14ca0 74 61 74 54 61 62 6c 65 73 28 70 50 61 72 73 65  tatTables(pParse
14cb0 2c 20 69 44 62 2c 20 22 74 62 6c 22 2c 20 70 54  , iDb, "tbl", pT
14cc0 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ab->zName);.    
14cd0 73 71 6c 69 74 65 33 46 6b 44 72 6f 70 54 61 62  sqlite3FkDropTab
14ce0 6c 65 28 70 50 61 72 73 65 2c 20 70 4e 61 6d 65  le(pParse, pName
14cf0 2c 20 70 54 61 62 29 3b 0a 20 20 20 20 73 71 6c  , pTab);.    sql
14d00 69 74 65 33 43 6f 64 65 44 72 6f 70 54 61 62 6c  ite3CodeDropTabl
14d10 65 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20  e(pParse, pTab, 
14d20 69 44 62 2c 20 69 73 56 69 65 77 29 3b 0a 20 20  iDb, isView);.  
14d30 7d 0a 0a 65 78 69 74 5f 64 72 6f 70 5f 74 61 62  }..exit_drop_tab
14d40 6c 65 3a 0a 20 20 73 71 6c 69 74 65 33 53 72 63  le:.  sqlite3Src
14d50 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70  ListDelete(db, p
14d60 4e 61 6d 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Name);.}../*.** 
14d70 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
14d80 63 61 6c 6c 65 64 20 74 6f 20 63 72 65 61 74 65  called to create
14d90 20 61 20 6e 65 77 20 66 6f 72 65 69 67 6e 20 6b   a new foreign k
14da0 65 79 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 0a  ey on the table.
14db0 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64  ** currently und
14dc0 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e  er construction.
14dd0 20 20 70 46 72 6f 6d 43 6f 6c 20 64 65 74 65 72    pFromCol deter
14de0 6d 69 6e 65 73 20 77 68 69 63 68 20 63 6f 6c 75  mines which colu
14df0 6d 6e 73 0a 2a 2a 20 69 6e 20 74 68 65 20 63 75  mns.** in the cu
14e00 72 72 65 6e 74 20 74 61 62 6c 65 20 70 6f 69 6e  rrent table poin
14e10 74 20 74 6f 20 74 68 65 20 66 6f 72 65 69 67 6e  t to the foreign
14e20 20 6b 65 79 2e 20 20 49 66 20 70 46 72 6f 6d 43   key.  If pFromC
14e30 6f 6c 3d 3d 30 20 74 68 65 6e 0a 2a 2a 20 63 6f  ol==0 then.** co
14e40 6e 6e 65 63 74 20 74 68 65 20 6b 65 79 20 74 6f  nnect the key to
14e50 20 74 68 65 20 6c 61 73 74 20 63 6f 6c 75 6d 6e   the last column
14e60 20 69 6e 73 65 72 74 65 64 2e 20 20 70 54 6f 20   inserted.  pTo 
14e70 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 0a 2a  is the name of.*
14e80 2a 20 74 68 65 20 74 61 62 6c 65 20 72 65 66 65  * the table refe
14e90 72 72 65 64 20 74 6f 20 28 61 2e 6b 2e 61 20 74  rred to (a.k.a t
14ea0 68 65 20 22 70 61 72 65 6e 74 22 20 74 61 62 6c  he "parent" tabl
14eb0 65 29 2e 20 20 70 54 6f 43 6f 6c 20 69 73 20 61  e).  pToCol is a
14ec0 20 6c 69 73 74 0a 2a 2a 20 6f 66 20 74 61 62 6c   list.** of tabl
14ed0 65 73 20 69 6e 20 74 68 65 20 70 61 72 65 6e 74  es in the parent
14ee0 20 70 54 6f 20 74 61 62 6c 65 2e 20 20 66 6c 61   pTo table.  fla
14ef0 67 73 20 63 6f 6e 74 61 69 6e 73 20 61 6c 6c 0a  gs contains all.
14f00 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61  ** information a
14f10 62 6f 75 74 20 74 68 65 20 63 6f 6e 66 6c 69 63  bout the conflic
14f20 74 20 72 65 73 6f 6c 75 74 69 6f 6e 20 61 6c 67  t resolution alg
14f30 6f 72 69 74 68 6d 73 20 73 70 65 63 69 66 69 65  orithms specifie
14f40 64 0a 2a 2a 20 69 6e 20 74 68 65 20 4f 4e 20 44  d.** in the ON D
14f50 45 4c 45 54 45 2c 20 4f 4e 20 55 50 44 41 54 45  ELETE, ON UPDATE
14f60 20 61 6e 64 20 4f 4e 20 49 4e 53 45 52 54 20 63   and ON INSERT c
14f70 6c 61 75 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 41 6e  lauses..**.** An
14f80 20 46 4b 65 79 20 73 74 72 75 63 74 75 72 65 20   FKey structure 
14f90 69 73 20 63 72 65 61 74 65 64 20 61 6e 64 20 61  is created and a
14fa0 64 64 65 64 20 74 6f 20 74 68 65 20 74 61 62 6c  dded to the tabl
14fb0 65 20 63 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 75  e currently.** u
14fc0 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f  nder constructio
14fd0 6e 20 69 6e 20 74 68 65 20 70 50 61 72 73 65 2d  n in the pParse-
14fe0 3e 70 4e 65 77 54 61 62 6c 65 20 66 69 65 6c 64  >pNewTable field
14ff0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 72 65  ..**.** The fore
15000 69 67 6e 20 6b 65 79 20 69 73 20 73 65 74 20 66  ign key is set f
15010 6f 72 20 49 4d 4d 45 44 49 41 54 45 20 70 72 6f  or IMMEDIATE pro
15020 63 65 73 73 69 6e 67 2e 20 20 41 20 73 75 62 73  cessing.  A subs
15030 65 71 75 65 6e 74 20 63 61 6c 6c 0a 2a 2a 20 74  equent call.** t
15040 6f 20 73 71 6c 69 74 65 33 44 65 66 65 72 46 6f  o sqlite3DeferFo
15050 72 65 69 67 6e 4b 65 79 28 29 20 6d 69 67 68 74  reignKey() might
15060 20 63 68 61 6e 67 65 20 74 68 69 73 20 74 6f 20   change this to 
15070 44 45 46 45 52 52 45 44 2e 0a 2a 2f 0a 76 6f 69  DEFERRED..*/.voi
15080 64 20 73 71 6c 69 74 65 33 43 72 65 61 74 65 46  d sqlite3CreateF
15090 6f 72 65 69 67 6e 4b 65 79 28 0a 20 20 50 61 72  oreignKey(.  Par
150a0 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
150b0 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
150c0 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69  text */.  ExprLi
150d0 73 74 20 2a 70 46 72 6f 6d 43 6f 6c 2c 20 20 2f  st *pFromCol,  /
150e0 2a 20 43 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 69  * Columns in thi
150f0 73 20 74 61 62 6c 65 20 74 68 61 74 20 70 6f 69  s table that poi
15100 6e 74 20 74 6f 20 6f 74 68 65 72 20 74 61 62 6c  nt to other tabl
15110 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 54  e */.  Token *pT
15120 6f 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  o,          /* N
15130 61 6d 65 20 6f 66 20 74 68 65 20 6f 74 68 65 72  ame of the other
15140 20 74 61 62 6c 65 20 2a 2f 0a 20 20 45 78 70 72   table */.  Expr
15150 4c 69 73 74 20 2a 70 54 6f 43 6f 6c 2c 20 20 20  List *pToCol,   
15160 20 2f 2a 20 43 6f 6c 75 6d 6e 73 20 69 6e 20 74   /* Columns in t
15170 68 65 20 6f 74 68 65 72 20 74 61 62 6c 65 20 2a  he other table *
15180 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 20 20  /.  int flags   
15190 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 66           /* Conf
151a0 6c 69 63 74 20 72 65 73 6f 6c 75 74 69 6f 6e 20  lict resolution 
151b0 61 6c 67 6f 72 69 74 68 6d 73 2e 20 2a 2f 0a 29  algorithms. */.)
151c0 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  {.  sqlite3 *db 
151d0 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 23 69  = pParse->db;.#i
151e0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
151f0 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 0a 20 20  T_FOREIGN_KEY.  
15200 46 4b 65 79 20 2a 70 46 4b 65 79 20 3d 20 30 3b  FKey *pFKey = 0;
15210 0a 20 20 46 4b 65 79 20 2a 70 4e 65 78 74 54 6f  .  FKey *pNextTo
15220 3b 0a 20 20 54 61 62 6c 65 20 2a 70 20 3d 20 70  ;.  Table *p = p
15230 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
15240 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20  ;.  int nByte;. 
15250 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e 43   int i;.  int nC
15260 6f 6c 3b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 0a  ol;.  char *z;..
15270 20 20 61 73 73 65 72 74 28 20 70 54 6f 21 3d 30    assert( pTo!=0
15280 20 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c   );.  if( p==0 |
15290 7c 20 49 4e 5f 44 45 43 4c 41 52 45 5f 56 54 41  | IN_DECLARE_VTA
152a0 42 20 29 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b  B ) goto fk_end;
152b0 0a 20 20 69 66 28 20 70 46 72 6f 6d 43 6f 6c 3d  .  if( pFromCol=
152c0 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 43  =0 ){.    int iC
152d0 6f 6c 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a  ol = p->nCol-1;.
152e0 20 20 20 20 69 66 28 20 4e 45 56 45 52 28 69 43      if( NEVER(iC
152f0 6f 6c 3c 30 29 20 29 20 67 6f 74 6f 20 66 6b 5f  ol<0) ) goto fk_
15300 65 6e 64 3b 0a 20 20 20 20 69 66 28 20 70 54 6f  end;.    if( pTo
15310 43 6f 6c 20 26 26 20 70 54 6f 43 6f 6c 2d 3e 6e  Col && pToCol->n
15320 45 78 70 72 21 3d 31 20 29 7b 0a 20 20 20 20 20  Expr!=1 ){.     
15330 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
15340 28 70 50 61 72 73 65 2c 20 22 66 6f 72 65 69 67  (pParse, "foreig
15350 6e 20 6b 65 79 20 6f 6e 20 25 73 22 0a 20 20 20  n key on %s".   
15360 20 20 20 20 20 20 22 20 73 68 6f 75 6c 64 20 72        " should r
15370 65 66 65 72 65 6e 63 65 20 6f 6e 6c 79 20 6f 6e  eference only on
15380 65 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 61 62 6c  e column of tabl
15390 65 20 25 54 22 2c 0a 20 20 20 20 20 20 20 20 20  e %T",.         
153a0 70 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e  p->aCol[iCol].zN
153b0 61 6d 65 2c 20 70 54 6f 29 3b 0a 20 20 20 20 20  ame, pTo);.     
153c0 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20   goto fk_end;.  
153d0 20 20 7d 0a 20 20 20 20 6e 43 6f 6c 20 3d 20 31    }.    nCol = 1
153e0 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 54  ;.  }else if( pT
153f0 6f 43 6f 6c 20 26 26 20 70 54 6f 43 6f 6c 2d 3e  oCol && pToCol->
15400 6e 45 78 70 72 21 3d 70 46 72 6f 6d 43 6f 6c 2d  nExpr!=pFromCol-
15410 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 73 71  >nExpr ){.    sq
15420 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
15430 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20 22 6e  arse,.        "n
15440 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73  umber of columns
15450 20 69 6e 20 66 6f 72 65 69 67 6e 20 6b 65 79 20   in foreign key 
15460 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 20 74  does not match t
15470 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 22 0a 20  he number of ". 
15480 20 20 20 20 20 20 20 22 63 6f 6c 75 6d 6e 73 20         "columns 
15490 69 6e 20 74 68 65 20 72 65 66 65 72 65 6e 63 65  in the reference
154a0 64 20 74 61 62 6c 65 22 29 3b 0a 20 20 20 20 67  d table");.    g
154b0 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 7d 65  oto fk_end;.  }e
154c0 6c 73 65 7b 0a 20 20 20 20 6e 43 6f 6c 20 3d 20  lse{.    nCol = 
154d0 70 46 72 6f 6d 43 6f 6c 2d 3e 6e 45 78 70 72 3b  pFromCol->nExpr;
154e0 0a 20 20 7d 0a 20 20 6e 42 79 74 65 20 3d 20 73  .  }.  nByte = s
154f0 69 7a 65 6f 66 28 2a 70 46 4b 65 79 29 20 2b 20  izeof(*pFKey) + 
15500 28 6e 43 6f 6c 2d 31 29 2a 73 69 7a 65 6f 66 28  (nCol-1)*sizeof(
15510 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b 30 5d 29 20  pFKey->aCol[0]) 
15520 2b 20 70 54 6f 2d 3e 6e 20 2b 20 31 3b 0a 20 20  + pTo->n + 1;.  
15530 69 66 28 20 70 54 6f 43 6f 6c 20 29 7b 0a 20 20  if( pToCol ){.  
15540 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 6f    for(i=0; i<pTo
15550 43 6f 6c 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  Col->nExpr; i++)
15560 7b 0a 20 20 20 20 20 20 6e 42 79 74 65 20 2b 3d  {.      nByte +=
15570 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
15580 28 70 54 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e  (pToCol->a[i].zN
15590 61 6d 65 29 20 2b 20 31 3b 0a 20 20 20 20 7d 0a  ame) + 1;.    }.
155a0 20 20 7d 0a 20 20 70 46 4b 65 79 20 3d 20 73 71    }.  pFKey = sq
155b0 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72  lite3DbMallocZer
155c0 6f 28 64 62 2c 20 6e 42 79 74 65 20 29 3b 0a 20  o(db, nByte );. 
155d0 20 69 66 28 20 70 46 4b 65 79 3d 3d 30 20 29 7b   if( pFKey==0 ){
155e0 0a 20 20 20 20 67 6f 74 6f 20 66 6b 5f 65 6e 64  .    goto fk_end
155f0 3b 0a 20 20 7d 0a 20 20 70 46 4b 65 79 2d 3e 70  ;.  }.  pFKey->p
15600 46 72 6f 6d 20 3d 20 70 3b 0a 20 20 70 46 4b 65  From = p;.  pFKe
15610 79 2d 3e 70 4e 65 78 74 46 72 6f 6d 20 3d 20 70  y->pNextFrom = p
15620 2d 3e 70 46 4b 65 79 3b 0a 20 20 7a 20 3d 20 28  ->pFKey;.  z = (
15630 63 68 61 72 2a 29 26 70 46 4b 65 79 2d 3e 61 43  char*)&pFKey->aC
15640 6f 6c 5b 6e 43 6f 6c 5d 3b 0a 20 20 70 46 4b 65  ol[nCol];.  pFKe
15650 79 2d 3e 7a 54 6f 20 3d 20 7a 3b 0a 20 20 6d 65  y->zTo = z;.  me
15660 6d 63 70 79 28 7a 2c 20 70 54 6f 2d 3e 7a 2c 20  mcpy(z, pTo->z, 
15670 70 54 6f 2d 3e 6e 29 3b 0a 20 20 7a 5b 70 54 6f  pTo->n);.  z[pTo
15680 2d 3e 6e 5d 20 3d 20 30 3b 0a 20 20 73 71 6c 69  ->n] = 0;.  sqli
15690 74 65 33 44 65 71 75 6f 74 65 28 7a 29 3b 0a 20  te3Dequote(z);. 
156a0 20 7a 20 2b 3d 20 70 54 6f 2d 3e 6e 2b 31 3b 0a   z += pTo->n+1;.
156b0 20 20 70 46 4b 65 79 2d 3e 6e 43 6f 6c 20 3d 20    pFKey->nCol = 
156c0 6e 43 6f 6c 3b 0a 20 20 69 66 28 20 70 46 72 6f  nCol;.  if( pFro
156d0 6d 43 6f 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 70  mCol==0 ){.    p
156e0 46 4b 65 79 2d 3e 61 43 6f 6c 5b 30 5d 2e 69 46  FKey->aCol[0].iF
156f0 72 6f 6d 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b  rom = p->nCol-1;
15700 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 6f  .  }else{.    fo
15710 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69  r(i=0; i<nCol; i
15720 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6a  ++){.      int j
15730 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b  ;.      for(j=0;
15740 20 6a 3c 70 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29   j<p->nCol; j++)
15750 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71  {.        if( sq
15760 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 2d 3e  lite3StrICmp(p->
15770 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 2c 20 70  aCol[j].zName, p
15780 46 72 6f 6d 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e  FromCol->a[i].zN
15790 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ame)==0 ){.     
157a0 20 20 20 20 20 70 46 4b 65 79 2d 3e 61 43 6f 6c       pFKey->aCol
157b0 5b 69 5d 2e 69 46 72 6f 6d 20 3d 20 6a 3b 0a 20  [i].iFrom = j;. 
157c0 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
157d0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
157e0 7d 0a 20 20 20 20 20 20 69 66 28 20 6a 3e 3d 70  }.      if( j>=p
157f0 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20  ->nCol ){.      
15800 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
15810 67 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20  g(pParse, .     
15820 20 20 20 20 20 22 75 6e 6b 6e 6f 77 6e 20 63 6f       "unknown co
15830 6c 75 6d 6e 20 5c 22 25 73 5c 22 20 69 6e 20 66  lumn \"%s\" in f
15840 6f 72 65 69 67 6e 20 6b 65 79 20 64 65 66 69 6e  oreign key defin
15850 69 74 69 6f 6e 22 2c 20 0a 20 20 20 20 20 20 20  ition", .       
15860 20 20 20 70 46 72 6f 6d 43 6f 6c 2d 3e 61 5b 69     pFromCol->a[i
15870 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ].zName);.      
15880 20 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20    goto fk_end;. 
15890 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
158a0 0a 20 20 69 66 28 20 70 54 6f 43 6f 6c 20 29 7b  .  if( pToCol ){
158b0 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
158c0 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nCol; i++){.    
158d0 20 20 69 6e 74 20 6e 20 3d 20 73 71 6c 69 74 65    int n = sqlite
158e0 33 53 74 72 6c 65 6e 33 30 28 70 54 6f 43 6f 6c  3Strlen30(pToCol
158f0 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20  ->a[i].zName);. 
15900 20 20 20 20 20 70 46 4b 65 79 2d 3e 61 43 6f 6c       pFKey->aCol
15910 5b 69 5d 2e 7a 43 6f 6c 20 3d 20 7a 3b 0a 20 20  [i].zCol = z;.  
15920 20 20 20 20 6d 65 6d 63 70 79 28 7a 2c 20 70 54      memcpy(z, pT
15930 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  oCol->a[i].zName
15940 2c 20 6e 29 3b 0a 20 20 20 20 20 20 7a 5b 6e 5d  , n);.      z[n]
15950 20 3d 20 30 3b 0a 20 20 20 20 20 20 7a 20 2b 3d   = 0;.      z +=
15960 20 6e 2b 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   n+1;.    }.  }.
15970 20 20 70 46 4b 65 79 2d 3e 69 73 44 65 66 65 72    pFKey->isDefer
15980 72 65 64 20 3d 20 30 3b 0a 20 20 70 46 4b 65 79  red = 0;.  pFKey
15990 2d 3e 61 41 63 74 69 6f 6e 5b 30 5d 20 3d 20 28  ->aAction[0] = (
159a0 75 38 29 28 66 6c 61 67 73 20 26 20 30 78 66 66  u8)(flags & 0xff
159b0 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  );            /*
159c0 20 4f 4e 20 44 45 4c 45 54 45 20 61 63 74 69 6f   ON DELETE actio
159d0 6e 20 2a 2f 0a 20 20 70 46 4b 65 79 2d 3e 61 41  n */.  pFKey->aA
159e0 63 74 69 6f 6e 5b 31 5d 20 3d 20 28 75 38 29 28  ction[1] = (u8)(
159f0 28 66 6c 61 67 73 20 3e 3e 20 38 20 29 20 26 20  (flags >> 8 ) & 
15a00 30 78 66 66 29 3b 20 20 20 20 2f 2a 20 4f 4e 20  0xff);    /* ON 
15a10 55 50 44 41 54 45 20 61 63 74 69 6f 6e 20 2a 2f  UPDATE action */
15a20 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
15a30 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65  te3SchemaMutexHe
15a40 6c 64 28 64 62 2c 20 30 2c 20 70 2d 3e 70 53 63  ld(db, 0, p->pSc
15a50 68 65 6d 61 29 20 29 3b 0a 20 20 70 4e 65 78 74  hema) );.  pNext
15a60 54 6f 20 3d 20 28 46 4b 65 79 20 2a 29 73 71 6c  To = (FKey *)sql
15a70 69 74 65 33 48 61 73 68 49 6e 73 65 72 74 28 26  ite3HashInsert(&
15a80 70 2d 3e 70 53 63 68 65 6d 61 2d 3e 66 6b 65 79  p->pSchema->fkey
15a90 48 61 73 68 2c 20 0a 20 20 20 20 20 20 70 46 4b  Hash, .      pFK
15aa0 65 79 2d 3e 7a 54 6f 2c 20 28 76 6f 69 64 20 2a  ey->zTo, (void *
15ab0 29 70 46 4b 65 79 0a 20 20 29 3b 0a 20 20 69 66  )pFKey.  );.  if
15ac0 28 20 70 4e 65 78 74 54 6f 3d 3d 70 46 4b 65 79  ( pNextTo==pFKey
15ad0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f   ){.    sqlite3O
15ae0 6f 6d 46 61 75 6c 74 28 64 62 29 3b 0a 20 20 20  omFault(db);.   
15af0 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20   goto fk_end;.  
15b00 7d 0a 20 20 69 66 28 20 70 4e 65 78 74 54 6f 20  }.  if( pNextTo 
15b10 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
15b20 4e 65 78 74 54 6f 2d 3e 70 50 72 65 76 54 6f 3d  NextTo->pPrevTo=
15b30 3d 30 20 29 3b 0a 20 20 20 20 70 46 4b 65 79 2d  =0 );.    pFKey-
15b40 3e 70 4e 65 78 74 54 6f 20 3d 20 70 4e 65 78 74  >pNextTo = pNext
15b50 54 6f 3b 0a 20 20 20 20 70 4e 65 78 74 54 6f 2d  To;.    pNextTo-
15b60 3e 70 50 72 65 76 54 6f 20 3d 20 70 46 4b 65 79  >pPrevTo = pFKey
15b70 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 69 6e 6b  ;.  }..  /* Link
15b80 20 74 68 65 20 66 6f 72 65 69 67 6e 20 6b 65 79   the foreign key
15b90 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 61 73   to the table as
15ba0 20 74 68 65 20 6c 61 73 74 20 73 74 65 70 2e 0a   the last step..
15bb0 20 20 2a 2f 0a 20 20 70 2d 3e 70 46 4b 65 79 20    */.  p->pFKey 
15bc0 3d 20 70 46 4b 65 79 3b 0a 20 20 70 46 4b 65 79  = pFKey;.  pFKey
15bd0 20 3d 20 30 3b 0a 0a 66 6b 5f 65 6e 64 3a 0a 20   = 0;..fk_end:. 
15be0 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
15bf0 62 2c 20 70 46 4b 65 79 29 3b 0a 23 65 6e 64 69  b, pFKey);.#endi
15c00 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51  f /* !defined(SQ
15c10 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47  LITE_OMIT_FOREIG
15c20 4e 5f 4b 45 59 29 20 2a 2f 0a 20 20 73 71 6c 69  N_KEY) */.  sqli
15c30 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
15c40 65 28 64 62 2c 20 70 46 72 6f 6d 43 6f 6c 29 3b  e(db, pFromCol);
15c50 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69  .  sqlite3ExprLi
15c60 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 54 6f  stDelete(db, pTo
15c70 43 6f 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  Col);.}../*.** T
15c80 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
15c90 61 6c 6c 65 64 20 77 68 65 6e 20 61 6e 20 49 4e  alled when an IN
15ca0 49 54 49 41 4c 4c 59 20 49 4d 4d 45 44 49 41 54  ITIALLY IMMEDIAT
15cb0 45 20 6f 72 20 49 4e 49 54 49 41 4c 4c 59 20 44  E or INITIALLY D
15cc0 45 46 45 52 52 45 44 0a 2a 2a 20 63 6c 61 75 73  EFERRED.** claus
15cd0 65 20 69 73 20 73 65 65 6e 20 61 73 20 70 61 72  e is seen as par
15ce0 74 20 6f 66 20 61 20 66 6f 72 65 69 67 6e 20 6b  t of a foreign k
15cf0 65 79 20 64 65 66 69 6e 69 74 69 6f 6e 2e 20 20  ey definition.  
15d00 54 68 65 20 69 73 44 65 66 65 72 72 65 64 0a 2a  The isDeferred.*
15d10 2a 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 31  * parameter is 1
15d20 20 66 6f 72 20 49 4e 49 54 49 41 4c 4c 59 20 44   for INITIALLY D
15d30 45 46 45 52 52 45 44 20 61 6e 64 20 30 20 66 6f  EFERRED and 0 fo
15d40 72 20 49 4e 49 54 49 41 4c 4c 59 20 49 4d 4d 45  r INITIALLY IMME
15d50 44 49 41 54 45 2e 0a 2a 2a 20 54 68 65 20 62 65  DIATE..** The be
15d60 68 61 76 69 6f 72 20 6f 66 20 74 68 65 20 6d 6f  havior of the mo
15d70 73 74 20 72 65 63 65 6e 74 6c 79 20 63 72 65 61  st recently crea
15d80 74 65 64 20 66 6f 72 65 69 67 6e 20 6b 65 79 20  ted foreign key 
15d90 69 73 20 61 64 6a 75 73 74 65 64 0a 2a 2a 20 61  is adjusted.** a
15da0 63 63 6f 72 64 69 6e 67 6c 79 2e 0a 2a 2f 0a 76  ccordingly..*/.v
15db0 6f 69 64 20 73 71 6c 69 74 65 33 44 65 66 65 72  oid sqlite3Defer
15dc0 46 6f 72 65 69 67 6e 4b 65 79 28 50 61 72 73 65  ForeignKey(Parse
15dd0 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69 73   *pParse, int is
15de0 44 65 66 65 72 72 65 64 29 7b 0a 23 69 66 6e 64  Deferred){.#ifnd
15df0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46  ef SQLITE_OMIT_F
15e00 4f 52 45 49 47 4e 5f 4b 45 59 0a 20 20 54 61 62  OREIGN_KEY.  Tab
15e10 6c 65 20 2a 70 54 61 62 3b 0a 20 20 46 4b 65 79  le *pTab;.  FKey
15e20 20 2a 70 46 4b 65 79 3b 0a 20 20 69 66 28 20 28   *pFKey;.  if( (
15e30 70 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 70  pTab = pParse->p
15e40 4e 65 77 54 61 62 6c 65 29 3d 3d 30 20 7c 7c 20  NewTable)==0 || 
15e50 28 70 46 4b 65 79 20 3d 20 70 54 61 62 2d 3e 70  (pFKey = pTab->p
15e60 46 4b 65 79 29 3d 3d 30 20 29 20 72 65 74 75 72  FKey)==0 ) retur
15e70 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73 44  n;.  assert( isD
15e80 65 66 65 72 72 65 64 3d 3d 30 20 7c 7c 20 69 73  eferred==0 || is
15e90 44 65 66 65 72 72 65 64 3d 3d 31 20 29 3b 20 2f  Deferred==1 ); /
15ea0 2a 20 45 56 3a 20 52 2d 33 30 33 32 33 2d 32 31  * EV: R-30323-21
15eb0 39 31 37 20 2a 2f 0a 20 20 70 46 4b 65 79 2d 3e  917 */.  pFKey->
15ec0 69 73 44 65 66 65 72 72 65 64 20 3d 20 28 75 38  isDeferred = (u8
15ed0 29 69 73 44 65 66 65 72 72 65 64 3b 0a 23 65 6e  )isDeferred;.#en
15ee0 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e  dif.}../*.** Gen
15ef0 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20  erate code that 
15f00 77 69 6c 6c 20 65 72 61 73 65 20 61 6e 64 20 72  will erase and r
15f10 65 66 69 6c 6c 20 69 6e 64 65 78 20 2a 70 49 64  efill index *pId
15f20 78 2e 20 20 54 68 69 73 20 69 73 0a 2a 2a 20 75  x.  This is.** u
15f30 73 65 64 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a  sed to initializ
15f40 65 20 61 20 6e 65 77 6c 79 20 63 72 65 61 74 65  e a newly create
15f50 64 20 69 6e 64 65 78 20 6f 72 20 74 6f 20 72 65  d index or to re
15f60 63 6f 6d 70 75 74 65 20 74 68 65 0a 2a 2a 20 63  compute the.** c
15f70 6f 6e 74 65 6e 74 20 6f 66 20 61 6e 20 69 6e 64  ontent of an ind
15f80 65 78 20 69 6e 20 72 65 73 70 6f 6e 73 65 20 74  ex in response t
15f90 6f 20 61 20 52 45 49 4e 44 45 58 20 63 6f 6d 6d  o a REINDEX comm
15fa0 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 69 66 20 6d 65  and..**.** if me
15fb0 6d 52 6f 6f 74 50 61 67 65 20 69 73 20 6e 6f 74  mRootPage is not
15fc0 20 6e 65 67 61 74 69 76 65 2c 20 69 74 20 6d 65   negative, it me
15fd0 61 6e 73 20 74 68 61 74 20 74 68 65 20 69 6e 64  ans that the ind
15fe0 65 78 20 69 73 20 6e 65 77 6c 79 0a 2a 2a 20 63  ex is newly.** c
15ff0 72 65 61 74 65 64 2e 20 20 54 68 65 20 72 65 67  reated.  The reg
16000 69 73 74 65 72 20 73 70 65 63 69 66 69 65 64 20  ister specified 
16010 62 79 20 6d 65 6d 52 6f 6f 74 50 61 67 65 20 63  by memRootPage c
16020 6f 6e 74 61 69 6e 73 20 74 68 65 0a 2a 2a 20 72  ontains the.** r
16030 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20  oot page number 
16040 6f 66 20 74 68 65 20 69 6e 64 65 78 2e 20 20 49  of the index.  I
16050 66 20 6d 65 6d 52 6f 6f 74 50 61 67 65 20 69 73  f memRootPage is
16060 20 6e 65 67 61 74 69 76 65 2c 20 74 68 65 6e 0a   negative, then.
16070 2a 2a 20 74 68 65 20 69 6e 64 65 78 20 61 6c 72  ** the index alr
16080 65 61 64 79 20 65 78 69 73 74 73 20 61 6e 64 20  eady exists and 
16090 6d 75 73 74 20 62 65 20 63 6c 65 61 72 65 64 20  must be cleared 
160a0 62 65 66 6f 72 65 20 62 65 69 6e 67 20 72 65 66  before being ref
160b0 69 6c 6c 65 64 20 61 6e 64 0a 2a 2a 20 74 68 65  illed and.** the
160c0 20 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62 65   root page numbe
160d0 72 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 69  r of the index i
160e0 73 20 74 61 6b 65 6e 20 66 72 6f 6d 20 70 49 6e  s taken from pIn
160f0 64 65 78 2d 3e 74 6e 75 6d 2e 0a 2a 2f 0a 73 74  dex->tnum..*/.st
16100 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65  atic void sqlite
16110 33 52 65 66 69 6c 6c 49 6e 64 65 78 28 50 61 72  3RefillIndex(Par
16120 73 65 20 2a 70 50 61 72 73 65 2c 20 49 6e 64 65  se *pParse, Inde
16130 78 20 2a 70 49 6e 64 65 78 2c 20 69 6e 74 20 6d  x *pIndex, int m
16140 65 6d 52 6f 6f 74 50 61 67 65 29 7b 0a 20 20 54  emRootPage){.  T
16150 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 49 6e  able *pTab = pIn
16160 64 65 78 2d 3e 70 54 61 62 6c 65 3b 20 20 2f 2a  dex->pTable;  /*
16170 20 54 68 65 20 74 61 62 6c 65 20 74 68 61 74 20   The table that 
16180 69 73 20 69 6e 64 65 78 65 64 20 2a 2f 0a 20 20  is indexed */.  
16190 69 6e 74 20 69 54 61 62 20 3d 20 70 50 61 72 73  int iTab = pPars
161a0 65 2d 3e 6e 54 61 62 2b 2b 3b 20 20 20 20 20 2f  e->nTab++;     /
161b0 2a 20 42 74 72 65 65 20 63 75 72 73 6f 72 20 75  * Btree cursor u
161c0 73 65 64 20 66 6f 72 20 70 54 61 62 20 2a 2f 0a  sed for pTab */.
161d0 20 20 69 6e 74 20 69 49 64 78 20 3d 20 70 50 61    int iIdx = pPa
161e0 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 20 20 20 20  rse->nTab++;    
161f0 20 2f 2a 20 42 74 72 65 65 20 63 75 72 73 6f 72   /* Btree cursor
16200 20 75 73 65 64 20 66 6f 72 20 70 49 6e 64 65 78   used for pIndex
16210 20 2a 2f 0a 20 20 69 6e 74 20 69 53 6f 72 74 65   */.  int iSorte
16220 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r;              
16230 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6f       /* Cursor o
16240 70 65 6e 65 64 20 62 79 20 4f 70 65 6e 53 6f 72  pened by OpenSor
16250 74 65 72 20 28 69 66 20 69 6e 20 75 73 65 29 20  ter (if in use) 
16260 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 31 3b 20  */.  int addr1; 
16270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16280 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
16290 66 20 74 6f 70 20 6f 66 20 6c 6f 6f 70 20 2a 2f  f top of loop */
162a0 0a 20 20 69 6e 74 20 61 64 64 72 32 3b 20 20 20  .  int addr2;   
162b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
162c0 20 20 2f 2a 20 41 64 64 72 65 73 73 20 74 6f 20    /* Address to 
162d0 6a 75 6d 70 20 74 6f 20 66 6f 72 20 6e 65 78 74  jump to for next
162e0 20 69 74 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20   iteration */.  
162f0 69 6e 74 20 74 6e 75 6d 3b 20 20 20 20 20 20 20  int tnum;       
16300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
16310 2a 20 52 6f 6f 74 20 70 61 67 65 20 6f 66 20 69  * Root page of i
16320 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 69 50  ndex */.  int iP
16330 61 72 74 49 64 78 4c 61 62 65 6c 3b 20 20 20 20  artIdxLabel;    
16340 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70           /* Jump
16350 20 74 6f 20 74 68 69 73 20 6c 61 62 65 6c 20 74   to this label t
16360 6f 20 73 6b 69 70 20 61 20 72 6f 77 20 2a 2f 0a  o skip a row */.
16370 20 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20 20    Vdbe *v;      
16380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16390 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
163a0 65 20 69 6e 74 6f 20 74 68 69 73 20 76 69 72 74  e into this virt
163b0 75 61 6c 20 6d 61 63 68 69 6e 65 20 2a 2f 0a 20  ual machine */. 
163c0 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 3b 20   KeyInfo *pKey; 
163d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
163e0 2f 2a 20 4b 65 79 49 6e 66 6f 20 66 6f 72 20 69  /* KeyInfo for i
163f0 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 72 65  ndex */.  int re
16400 67 52 65 63 6f 72 64 3b 20 20 20 20 20 20 20 20  gRecord;        
16410 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69           /* Regi
16420 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 61 73 73  ster holding ass
16430 65 6d 62 6c 65 64 20 69 6e 64 65 78 20 72 65 63  embled index rec
16440 6f 72 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ord */.  sqlite3
16450 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
16460 62 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64  b;      /* The d
16470 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
16480 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62 20  on */.  int iDb 
16490 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54  = sqlite3SchemaT
164a0 6f 49 6e 64 65 78 28 64 62 2c 20 70 49 6e 64 65  oIndex(db, pInde
164b0 78 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 0a 23 69  x->pSchema);..#i
164c0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
164d0 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a  T_AUTHORIZATION.
164e0 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74    if( sqlite3Aut
164f0 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53  hCheck(pParse, S
16500 51 4c 49 54 45 5f 52 45 49 4e 44 45 58 2c 20 70  QLITE_REINDEX, p
16510 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 30 2c  Index->zName, 0,
16520 0a 20 20 20 20 20 20 64 62 2d 3e 61 44 62 5b 69  .      db->aDb[i
16530 44 62 5d 2e 7a 4e 61 6d 65 20 29 20 29 7b 0a 20  Db].zName ) ){. 
16540 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 23     return;.  }.#
16550 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 52 65 71 75  endif..  /* Requ
16560 69 72 65 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b  ire a write-lock
16570 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 20 74 6f   on the table to
16580 20 70 65 72 66 6f 72 6d 20 74 68 69 73 20 6f 70   perform this op
16590 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 73 71 6c  eration */.  sql
165a0 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28 70 50  ite3TableLock(pP
165b0 61 72 73 65 2c 20 69 44 62 2c 20 70 54 61 62 2d  arse, iDb, pTab-
165c0 3e 74 6e 75 6d 2c 20 31 2c 20 70 54 61 62 2d 3e  >tnum, 1, pTab->
165d0 7a 4e 61 6d 65 29 3b 0a 0a 20 20 76 20 3d 20 73  zName);..  v = s
165e0 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
165f0 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76 3d 3d  arse);.  if( v==
16600 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66  0 ) return;.  if
16610 28 20 6d 65 6d 52 6f 6f 74 50 61 67 65 3e 3d 30  ( memRootPage>=0
16620 20 29 7b 0a 20 20 20 20 74 6e 75 6d 20 3d 20 6d   ){.    tnum = m
16630 65 6d 52 6f 6f 74 50 61 67 65 3b 0a 20 20 7d 65  emRootPage;.  }e
16640 6c 73 65 7b 0a 20 20 20 20 74 6e 75 6d 20 3d 20  lse{.    tnum = 
16650 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 3b 0a 20 20  pIndex->tnum;.  
16660 7d 0a 20 20 70 4b 65 79 20 3d 20 73 71 6c 69 74  }.  pKey = sqlit
16670 65 33 4b 65 79 49 6e 66 6f 4f 66 49 6e 64 65 78  e3KeyInfoOfIndex
16680 28 70 50 61 72 73 65 2c 20 70 49 6e 64 65 78 29  (pParse, pIndex)
16690 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4b 65 79  ;.  assert( pKey
166a0 21 3d 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f  !=0 || db->mallo
166b0 63 46 61 69 6c 65 64 20 7c 7c 20 70 50 61 72 73  cFailed || pPars
166c0 65 2d 3e 6e 45 72 72 20 29 3b 0a 0a 20 20 2f 2a  e->nErr );..  /*
166d0 20 4f 70 65 6e 20 74 68 65 20 73 6f 72 74 65 72   Open the sorter
166e0 20 63 75 72 73 6f 72 20 69 66 20 77 65 20 61 72   cursor if we ar
166f0 65 20 74 6f 20 75 73 65 20 6f 6e 65 2e 20 2a 2f  e to use one. */
16700 0a 20 20 69 53 6f 72 74 65 72 20 3d 20 70 50 61  .  iSorter = pPa
16710 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 73  rse->nTab++;.  s
16720 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
16730 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 4f 70 65  (v, OP_SorterOpe
16740 6e 2c 20 69 53 6f 72 74 65 72 2c 20 30 2c 20 70  n, iSorter, 0, p
16750 49 6e 64 65 78 2d 3e 6e 4b 65 79 43 6f 6c 2c 20  Index->nKeyCol, 
16760 28 63 68 61 72 2a 29 0a 20 20 20 20 20 20 20 20  (char*).        
16770 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
16780 74 65 33 4b 65 79 49 6e 66 6f 52 65 66 28 70 4b  te3KeyInfoRef(pK
16790 65 79 29 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29  ey), P4_KEYINFO)
167a0 3b 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65  ;..  /* Open the
167b0 20 74 61 62 6c 65 2e 20 4c 6f 6f 70 20 74 68 72   table. Loop thr
167c0 6f 75 67 68 20 61 6c 6c 20 72 6f 77 73 20 6f 66  ough all rows of
167d0 20 74 68 65 20 74 61 62 6c 65 2c 20 69 6e 73 65   the table, inse
167e0 72 74 69 6e 67 20 69 6e 64 65 78 0a 20 20 2a 2a  rting index.  **
167f0 20 72 65 63 6f 72 64 73 20 69 6e 74 6f 20 74 68   records into th
16800 65 20 73 6f 72 74 65 72 2e 20 2a 2f 0a 20 20 73  e sorter. */.  s
16810 71 6c 69 74 65 33 4f 70 65 6e 54 61 62 6c 65 28  qlite3OpenTable(
16820 70 50 61 72 73 65 2c 20 69 54 61 62 2c 20 69 44  pParse, iTab, iD
16830 62 2c 20 70 54 61 62 2c 20 4f 50 5f 4f 70 65 6e  b, pTab, OP_Open
16840 52 65 61 64 29 3b 0a 20 20 61 64 64 72 31 20 3d  Read);.  addr1 =
16850 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
16860 70 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c  p2(v, OP_Rewind,
16870 20 69 54 61 62 2c 20 30 29 3b 20 56 64 62 65 43   iTab, 0); VdbeC
16880 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 72 65  overage(v);.  re
16890 67 52 65 63 6f 72 64 20 3d 20 73 71 6c 69 74 65  gRecord = sqlite
168a0 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
168b0 73 65 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33 47  se);..  sqlite3G
168c0 65 6e 65 72 61 74 65 49 6e 64 65 78 4b 65 79 28  enerateIndexKey(
168d0 70 50 61 72 73 65 2c 70 49 6e 64 65 78 2c 69 54  pParse,pIndex,iT
168e0 61 62 2c 72 65 67 52 65 63 6f 72 64 2c 30 2c 26  ab,regRecord,0,&
168f0 69 50 61 72 74 49 64 78 4c 61 62 65 6c 2c 30 2c  iPartIdxLabel,0,
16900 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  0);.  sqlite3Vdb
16910 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f  eAddOp2(v, OP_So
16920 72 74 65 72 49 6e 73 65 72 74 2c 20 69 53 6f 72  rterInsert, iSor
16930 74 65 72 2c 20 72 65 67 52 65 63 6f 72 64 29 3b  ter, regRecord);
16940 0a 20 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76  .  sqlite3Resolv
16950 65 50 61 72 74 49 64 78 4c 61 62 65 6c 28 70 50  ePartIdxLabel(pP
16960 61 72 73 65 2c 20 69 50 61 72 74 49 64 78 4c 61  arse, iPartIdxLa
16970 62 65 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  bel);.  sqlite3V
16980 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
16990 4e 65 78 74 2c 20 69 54 61 62 2c 20 61 64 64 72  Next, iTab, addr
169a0 31 2b 31 29 3b 20 56 64 62 65 43 6f 76 65 72 61  1+1); VdbeCovera
169b0 67 65 28 76 29 3b 0a 20 20 73 71 6c 69 74 65 33  ge(v);.  sqlite3
169c0 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
169d0 61 64 64 72 31 29 3b 0a 20 20 69 66 28 20 6d 65  addr1);.  if( me
169e0 6d 52 6f 6f 74 50 61 67 65 3c 30 20 29 20 73 71  mRootPage<0 ) sq
169f0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
16a00 76 2c 20 4f 50 5f 43 6c 65 61 72 2c 20 74 6e 75  v, OP_Clear, tnu
16a10 6d 2c 20 69 44 62 29 3b 0a 20 20 73 71 6c 69 74  m, iDb);.  sqlit
16a20 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
16a30 4f 50 5f 4f 70 65 6e 57 72 69 74 65 2c 20 69 49  OP_OpenWrite, iI
16a40 64 78 2c 20 74 6e 75 6d 2c 20 69 44 62 2c 20 0a  dx, tnum, iDb, .
16a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16a60 20 20 20 20 28 63 68 61 72 20 2a 29 70 4b 65 79      (char *)pKey
16a70 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20  , P4_KEYINFO);. 
16a80 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
16a90 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 42  geP5(v, OPFLAG_B
16aa0 55 4c 4b 43 53 52 7c 28 28 6d 65 6d 52 6f 6f 74  ULKCSR|((memRoot
16ab0 50 61 67 65 3e 3d 30 29 3f 4f 50 46 4c 41 47 5f  Page>=0)?OPFLAG_
16ac0 50 32 49 53 52 45 47 3a 30 29 29 3b 0a 0a 20 20  P2ISREG:0));..  
16ad0 61 64 64 72 31 20 3d 20 73 71 6c 69 74 65 33 56  addr1 = sqlite3V
16ae0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
16af0 53 6f 72 74 65 72 53 6f 72 74 2c 20 69 53 6f 72  SorterSort, iSor
16b00 74 65 72 2c 20 30 29 3b 20 56 64 62 65 43 6f 76  ter, 0); VdbeCov
16b10 65 72 61 67 65 28 76 29 3b 0a 20 20 69 66 28 20  erage(v);.  if( 
16b20 49 73 55 6e 69 71 75 65 49 6e 64 65 78 28 70 49  IsUniqueIndex(pI
16b30 6e 64 65 78 29 20 29 7b 0a 20 20 20 20 69 6e 74  ndex) ){.    int
16b40 20 6a 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62   j2 = sqlite3Vdb
16b50 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 20  eCurrentAddr(v) 
16b60 2b 20 33 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  + 3;.    sqlite3
16b70 56 64 62 65 47 6f 74 6f 28 76 2c 20 6a 32 29 3b  VdbeGoto(v, j2);
16b80 0a 20 20 20 20 61 64 64 72 32 20 3d 20 73 71 6c  .    addr2 = sql
16b90 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
16ba0 64 64 72 28 76 29 3b 0a 20 20 20 20 73 71 6c 69  ddr(v);.    sqli
16bb0 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74  te3VdbeAddOp4Int
16bc0 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 43 6f 6d  (v, OP_SorterCom
16bd0 70 61 72 65 2c 20 69 53 6f 72 74 65 72 2c 20 6a  pare, iSorter, j
16be0 32 2c 20 72 65 67 52 65 63 6f 72 64 2c 0a 20 20  2, regRecord,.  
16bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16c00 20 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 6e         pIndex->n
16c10 4b 65 79 43 6f 6c 29 3b 20 56 64 62 65 43 6f 76  KeyCol); VdbeCov
16c20 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 73 71  erage(v);.    sq
16c30 6c 69 74 65 33 55 6e 69 71 75 65 43 6f 6e 73 74  lite3UniqueConst
16c40 72 61 69 6e 74 28 70 50 61 72 73 65 2c 20 4f 45  raint(pParse, OE
16c50 5f 41 62 6f 72 74 2c 20 70 49 6e 64 65 78 29 3b  _Abort, pIndex);
16c60 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 64  .  }else{.    ad
16c70 64 72 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62  dr2 = sqlite3Vdb
16c80 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b  eCurrentAddr(v);
16c90 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64  .  }.  sqlite3Vd
16ca0 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53  beAddOp3(v, OP_S
16cb0 6f 72 74 65 72 44 61 74 61 2c 20 69 53 6f 72 74  orterData, iSort
16cc0 65 72 2c 20 72 65 67 52 65 63 6f 72 64 2c 20 69  er, regRecord, i
16cd0 49 64 78 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  Idx);.  sqlite3V
16ce0 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
16cf0 4c 61 73 74 2c 20 69 49 64 78 2c 20 30 2c 20 2d  Last, iIdx, 0, -
16d00 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  1);.  sqlite3Vdb
16d10 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 64  eAddOp3(v, OP_Id
16d20 78 49 6e 73 65 72 74 2c 20 69 49 64 78 2c 20 72  xInsert, iIdx, r
16d30 65 67 52 65 63 6f 72 64 2c 20 30 29 3b 0a 20 20  egRecord, 0);.  
16d40 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
16d50 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 55 53  eP5(v, OPFLAG_US
16d60 45 53 45 45 4b 52 45 53 55 4c 54 29 3b 0a 20 20  ESEEKRESULT);.  
16d70 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
16d80 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65  mpReg(pParse, re
16d90 67 52 65 63 6f 72 64 29 3b 0a 20 20 73 71 6c 69  gRecord);.  sqli
16da0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
16db0 20 4f 50 5f 53 6f 72 74 65 72 4e 65 78 74 2c 20   OP_SorterNext, 
16dc0 69 53 6f 72 74 65 72 2c 20 61 64 64 72 32 29 3b  iSorter, addr2);
16dd0 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
16de0 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a  ;.  sqlite3VdbeJ
16df0 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 31  umpHere(v, addr1
16e00 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33 56 64 62  );..  sqlite3Vdb
16e10 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 43 6c  eAddOp1(v, OP_Cl
16e20 6f 73 65 2c 20 69 54 61 62 29 3b 0a 20 20 73 71  ose, iTab);.  sq
16e30 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
16e40 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 69 49 64  v, OP_Close, iId
16e50 78 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  x);.  sqlite3Vdb
16e60 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 43 6c  eAddOp1(v, OP_Cl
16e70 6f 73 65 2c 20 69 53 6f 72 74 65 72 29 3b 0a 7d  ose, iSorter);.}
16e80 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65  ../*.** Allocate
16e90 20 68 65 61 70 20 73 70 61 63 65 20 74 6f 20 68   heap space to h
16ea0 6f 6c 64 20 61 6e 20 49 6e 64 65 78 20 6f 62 6a  old an Index obj
16eb0 65 63 74 20 77 69 74 68 20 6e 43 6f 6c 20 63 6f  ect with nCol co
16ec0 6c 75 6d 6e 73 2e 0a 2a 2a 0a 2a 2a 20 49 6e 63  lumns..**.** Inc
16ed0 72 65 61 73 65 20 74 68 65 20 61 6c 6c 6f 63 61  rease the alloca
16ee0 74 69 6f 6e 20 73 69 7a 65 20 74 6f 20 70 72 6f  tion size to pro
16ef0 76 69 64 65 20 61 6e 20 65 78 74 72 61 20 6e 45  vide an extra nE
16f00 78 74 72 61 20 62 79 74 65 73 0a 2a 2a 20 6f 66  xtra bytes.** of
16f10 20 38 2d 62 79 74 65 20 61 6c 69 67 6e 65 64 20   8-byte aligned 
16f20 73 70 61 63 65 20 61 66 74 65 72 20 74 68 65 20  space after the 
16f30 49 6e 64 65 78 20 6f 62 6a 65 63 74 20 61 6e 64  Index object and
16f40 20 72 65 74 75 72 6e 20 61 0a 2a 2a 20 70 6f 69   return a.** poi
16f50 6e 74 65 72 20 74 6f 20 74 68 69 73 20 65 78 74  nter to this ext
16f60 72 61 20 73 70 61 63 65 20 69 6e 20 2a 70 70 45  ra space in *ppE
16f70 78 74 72 61 2e 0a 2a 2f 0a 49 6e 64 65 78 20 2a  xtra..*/.Index *
16f80 73 71 6c 69 74 65 33 41 6c 6c 6f 63 61 74 65 49  sqlite3AllocateI
16f90 6e 64 65 78 4f 62 6a 65 63 74 28 0a 20 20 73 71  ndexObject(.  sq
16fa0 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20  lite3 *db,      
16fb0 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63     /* Database c
16fc0 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69  onnection */.  i
16fd0 31 36 20 6e 43 6f 6c 2c 20 20 20 20 20 20 20 20  16 nCol,        
16fe0 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d      /* Total num
16ff0 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69  ber of columns i
17000 6e 20 74 68 65 20 69 6e 64 65 78 20 2a 2f 0a 20  n the index */. 
17010 20 69 6e 74 20 6e 45 78 74 72 61 2c 20 20 20 20   int nExtra,    
17020 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
17030 6f 66 20 62 79 74 65 73 20 6f 66 20 65 78 74 72  of bytes of extr
17040 61 20 73 70 61 63 65 20 74 6f 20 61 6c 6c 6f 63  a space to alloc
17050 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 70 70 45   */.  char **ppE
17060 78 74 72 61 20 20 20 20 20 20 20 2f 2a 20 50 6f  xtra       /* Po
17070 69 6e 74 65 72 20 74 6f 20 74 68 65 20 22 65 78  inter to the "ex
17080 74 72 61 22 20 73 70 61 63 65 20 2a 2f 0a 29 7b  tra" space */.){
17090 0a 20 20 49 6e 64 65 78 20 2a 70 3b 20 20 20 20  .  Index *p;    
170a0 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 6f 63          /* Alloc
170b0 61 74 65 64 20 69 6e 64 65 78 20 6f 62 6a 65 63  ated index objec
170c0 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65  t */.  int nByte
170d0 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42  ;           /* B
170e0 79 74 65 73 20 6f 66 20 73 70 61 63 65 20 66 6f  ytes of space fo
170f0 72 20 49 6e 64 65 78 20 6f 62 6a 65 63 74 20 2b  r Index object +
17100 20 61 72 72 61 79 73 20 2a 2f 0a 0a 20 20 6e 42   arrays */..  nB
17110 79 74 65 20 3d 20 52 4f 55 4e 44 38 28 73 69 7a  yte = ROUND8(siz
17120 65 6f 66 28 49 6e 64 65 78 29 29 20 2b 20 20 20  eof(Index)) +   
17130 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
17140 64 65 78 20 73 74 72 75 63 74 75 72 65 20 20 2a  dex structure  *
17150 2f 0a 20 20 20 20 20 20 20 20 20 20 52 4f 55 4e  /.          ROUN
17160 44 38 28 73 69 7a 65 6f 66 28 63 68 61 72 2a 29  D8(sizeof(char*)
17170 2a 6e 43 6f 6c 29 20 2b 20 20 20 20 20 20 20 20  *nCol) +        
17180 20 2f 2a 20 49 6e 64 65 78 2e 61 7a 43 6f 6c 6c   /* Index.azColl
17190 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
171a0 20 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28    ROUND8(sizeof(
171b0 4c 6f 67 45 73 74 29 2a 28 6e 43 6f 6c 2b 31 29  LogEst)*(nCol+1)
171c0 20 2b 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 2e   +     /* Index.
171d0 61 69 52 6f 77 4c 6f 67 45 73 74 20 20 20 2a 2f  aiRowLogEst   */
171e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
171f0 20 20 73 69 7a 65 6f 66 28 69 31 36 29 2a 6e 43    sizeof(i16)*nC
17200 6f 6c 20 2b 20 20 20 20 20 20 20 20 20 20 20 20  ol +            
17210 2f 2a 20 49 6e 64 65 78 2e 61 69 43 6f 6c 75 6d  /* Index.aiColum
17220 6e 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  n   */.         
17230 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28 75          sizeof(u
17240 38 29 2a 6e 43 6f 6c 29 3b 20 20 20 20 20 20 20  8)*nCol);       
17250 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 2e 61        /* Index.a
17260 53 6f 72 74 4f 72 64 65 72 20 2a 2f 0a 20 20 70  SortOrder */.  p
17270 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
17280 6f 63 5a 65 72 6f 28 64 62 2c 20 6e 42 79 74 65  ocZero(db, nByte
17290 20 2b 20 6e 45 78 74 72 61 29 3b 0a 20 20 69 66   + nExtra);.  if
172a0 28 20 70 20 29 7b 0a 20 20 20 20 63 68 61 72 20  ( p ){.    char 
172b0 2a 70 45 78 74 72 61 20 3d 20 28 28 63 68 61 72  *pExtra = ((char
172c0 2a 29 70 29 2b 52 4f 55 4e 44 38 28 73 69 7a 65  *)p)+ROUND8(size
172d0 6f 66 28 49 6e 64 65 78 29 29 3b 0a 20 20 20 20  of(Index));.    
172e0 70 2d 3e 61 7a 43 6f 6c 6c 20 3d 20 28 63 6f 6e  p->azColl = (con
172f0 73 74 20 63 68 61 72 2a 2a 29 70 45 78 74 72 61  st char**)pExtra
17300 3b 20 70 45 78 74 72 61 20 2b 3d 20 52 4f 55 4e  ; pExtra += ROUN
17310 44 38 28 73 69 7a 65 6f 66 28 63 68 61 72 2a 29  D8(sizeof(char*)
17320 2a 6e 43 6f 6c 29 3b 0a 20 20 20 20 70 2d 3e 61  *nCol);.    p->a
17330 69 52 6f 77 4c 6f 67 45 73 74 20 3d 20 28 4c 6f  iRowLogEst = (Lo
17340 67 45 73 74 2a 29 70 45 78 74 72 61 3b 20 70 45  gEst*)pExtra; pE
17350 78 74 72 61 20 2b 3d 20 73 69 7a 65 6f 66 28 4c  xtra += sizeof(L
17360 6f 67 45 73 74 29 2a 28 6e 43 6f 6c 2b 31 29 3b  ogEst)*(nCol+1);
17370 0a 20 20 20 20 70 2d 3e 61 69 43 6f 6c 75 6d 6e  .    p->aiColumn
17380 20 3d 20 28 69 31 36 2a 29 70 45 78 74 72 61 3b   = (i16*)pExtra;
17390 20 20 20 20 20 20 20 70 45 78 74 72 61 20 2b 3d         pExtra +=
173a0 20 73 69 7a 65 6f 66 28 69 31 36 29 2a 6e 43 6f   sizeof(i16)*nCo
173b0 6c 3b 0a 20 20 20 20 70 2d 3e 61 53 6f 72 74 4f  l;.    p->aSortO
173c0 72 64 65 72 20 3d 20 28 75 38 2a 29 70 45 78 74  rder = (u8*)pExt
173d0 72 61 3b 0a 20 20 20 20 70 2d 3e 6e 43 6f 6c 75  ra;.    p->nColu
173e0 6d 6e 20 3d 20 6e 43 6f 6c 3b 0a 20 20 20 20 70  mn = nCol;.    p
173f0 2d 3e 6e 4b 65 79 43 6f 6c 20 3d 20 6e 43 6f 6c  ->nKeyCol = nCol
17400 20 2d 20 31 3b 0a 20 20 20 20 2a 70 70 45 78 74   - 1;.    *ppExt
17410 72 61 20 3d 20 28 28 63 68 61 72 2a 29 70 29 20  ra = ((char*)p) 
17420 2b 20 6e 42 79 74 65 3b 0a 20 20 7d 0a 20 20 72  + nByte;.  }.  r
17430 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn p;.}../*.*
17440 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 69  * Create a new i
17450 6e 64 65 78 20 66 6f 72 20 61 6e 20 53 51 4c 20  ndex for an SQL 
17460 74 61 62 6c 65 2e 20 20 70 4e 61 6d 65 31 2e 70  table.  pName1.p
17470 4e 61 6d 65 32 20 69 73 20 74 68 65 20 6e 61 6d  Name2 is the nam
17480 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 0a  e of the index .
17490 2a 2a 20 61 6e 64 20 70 54 62 6c 4c 69 73 74 20  ** and pTblList 
174a0 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  is the name of t
174b0 68 65 20 74 61 62 6c 65 20 74 68 61 74 20 69 73  he table that is
174c0 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64 2e 20   to be indexed. 
174d0 20 42 6f 74 68 20 77 69 6c 6c 20 0a 2a 2a 20 62   Both will .** b
174e0 65 20 4e 55 4c 4c 20 66 6f 72 20 61 20 70 72 69  e NULL for a pri
174f0 6d 61 72 79 20 6b 65 79 20 6f 72 20 61 6e 20 69  mary key or an i
17500 6e 64 65 78 20 74 68 61 74 20 69 73 20 63 72 65  ndex that is cre
17510 61 74 65 64 20 74 6f 20 73 61 74 69 73 66 79 20  ated to satisfy 
17520 61 0a 2a 2a 20 55 4e 49 51 55 45 20 63 6f 6e 73  a.** UNIQUE cons
17530 74 72 61 69 6e 74 2e 20 20 49 66 20 70 54 61 62  traint.  If pTab
17540 6c 65 20 61 6e 64 20 70 49 6e 64 65 78 20 61 72  le and pIndex ar
17550 65 20 4e 55 4c 4c 2c 20 75 73 65 20 70 50 61 72  e NULL, use pPar
17560 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 0a 2a 2a  se->pNewTable.**
17570 20 61 73 20 74 68 65 20 74 61 62 6c 65 20 74 6f   as the table to
17580 20 62 65 20 69 6e 64 65 78 65 64 2e 20 20 70 50   be indexed.  pP
17590 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20  arse->pNewTable 
175a0 69 73 20 61 20 74 61 62 6c 65 20 74 68 61 74 20  is a table that 
175b0 69 73 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20  is.** currently 
175c0 62 65 69 6e 67 20 63 6f 6e 73 74 72 75 63 74 65  being constructe
175d0 64 20 62 79 20 61 20 43 52 45 41 54 45 20 54 41  d by a CREATE TA
175e0 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a  BLE statement..*
175f0 2a 0a 2a 2a 20 70 4c 69 73 74 20 69 73 20 61 20  *.** pList is a 
17600 6c 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  list of columns 
17610 74 6f 20 62 65 20 69 6e 64 65 78 65 64 2e 20 20  to be indexed.  
17620 70 4c 69 73 74 20 77 69 6c 6c 20 62 65 20 4e 55  pList will be NU
17630 4c 4c 20 69 66 20 74 68 69 73 0a 2a 2a 20 69 73  LL if this.** is
17640 20 61 20 70 72 69 6d 61 72 79 20 6b 65 79 20 6f   a primary key o
17650 72 20 75 6e 69 71 75 65 2d 63 6f 6e 73 74 72 61  r unique-constra
17660 69 6e 74 20 6f 6e 20 74 68 65 20 6d 6f 73 74 20  int on the most 
17670 72 65 63 65 6e 74 20 63 6f 6c 75 6d 6e 20 61 64  recent column ad
17680 64 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20 74 61  ded.** to the ta
17690 62 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 75 6e  ble currently un
176a0 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e  der construction
176b0 2e 20 20 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  .  .*/.void sqli
176c0 74 65 33 43 72 65 61 74 65 49 6e 64 65 78 28 0a  te3CreateIndex(.
176d0 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
176e0 20 20 20 20 20 2f 2a 20 41 6c 6c 20 69 6e 66 6f       /* All info
176f0 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68  rmation about th
17700 69 73 20 70 61 72 73 65 20 2a 2f 0a 20 20 54 6f  is parse */.  To
17710 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c 20 20 20 20  ken *pName1,    
17720 20 2f 2a 20 46 69 72 73 74 20 70 61 72 74 20 6f   /* First part o
17730 66 20 69 6e 64 65 78 20 6e 61 6d 65 2e 20 4d 61  f index name. Ma
17740 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 54  y be NULL */.  T
17750 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32 2c 20 20 20  oken *pName2,   
17760 20 20 2f 2a 20 53 65 63 6f 6e 64 20 70 61 72 74    /* Second part
17770 20 6f 66 20 69 6e 64 65 78 20 6e 61 6d 65 2e 20   of index name. 
17780 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20  May be NULL */. 
17790 20 53 72 63 4c 69 73 74 20 2a 70 54 62 6c 4e 61   SrcList *pTblNa
177a0 6d 65 2c 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20  me, /* Table to 
177b0 69 6e 64 65 78 2e 20 55 73 65 20 70 50 61 72 73  index. Use pPars
177c0 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 69 66 20  e->pNewTable if 
177d0 30 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  0 */.  ExprList 
177e0 2a 70 4c 69 73 74 2c 20 20 20 2f 2a 20 41 20 6c  *pList,   /* A l
177f0 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74  ist of columns t
17800 6f 20 62 65 20 69 6e 64 65 78 65 64 20 2a 2f 0a  o be indexed */.
17810 20 20 69 6e 74 20 6f 6e 45 72 72 6f 72 2c 20 20    int onError,  
17820 20 20 20 20 20 2f 2a 20 4f 45 5f 41 62 6f 72 74       /* OE_Abort
17830 2c 20 4f 45 5f 49 67 6e 6f 72 65 2c 20 4f 45 5f  , OE_Ignore, OE_
17840 52 65 70 6c 61 63 65 2c 20 6f 72 20 4f 45 5f 4e  Replace, or OE_N
17850 6f 6e 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  one */.  Token *
17860 70 53 74 61 72 74 2c 20 20 20 20 20 2f 2a 20 54  pStart,     /* T
17870 68 65 20 43 52 45 41 54 45 20 74 6f 6b 65 6e 20  he CREATE token 
17880 74 68 61 74 20 62 65 67 69 6e 73 20 74 68 69 73  that begins this
17890 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20   statement */.  
178a0 45 78 70 72 20 2a 70 50 49 57 68 65 72 65 2c 20  Expr *pPIWhere, 
178b0 20 20 20 2f 2a 20 57 48 45 52 45 20 63 6c 61 75     /* WHERE clau
178c0 73 65 20 66 6f 72 20 70 61 72 74 69 61 6c 20 69  se for partial i
178d0 6e 64 69 63 65 73 20 2a 2f 0a 20 20 69 6e 74 20  ndices */.  int 
178e0 73 6f 72 74 4f 72 64 65 72 2c 20 20 20 20 20 2f  sortOrder,     /
178f0 2a 20 53 6f 72 74 20 6f 72 64 65 72 20 6f 66 20  * Sort order of 
17900 70 72 69 6d 61 72 79 20 6b 65 79 20 77 68 65 6e  primary key when
17910 20 70 4c 69 73 74 3d 3d 4e 55 4c 4c 20 2a 2f 0a   pList==NULL */.
17920 20 20 69 6e 74 20 69 66 4e 6f 74 45 78 69 73 74    int ifNotExist
17930 2c 20 20 20 20 2f 2a 20 4f 6d 69 74 20 65 72 72  ,    /* Omit err
17940 6f 72 20 69 66 20 69 6e 64 65 78 20 61 6c 72 65  or if index alre
17950 61 64 79 20 65 78 69 73 74 73 20 2a 2f 0a 20 20  ady exists */.  
17960 75 38 20 69 64 78 54 79 70 65 20 20 20 20 20 20  u8 idxType      
17970 20 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20     /* The index 
17980 74 79 70 65 20 2a 2f 0a 29 7b 0a 20 20 54 61 62  type */.){.  Tab
17990 6c 65 20 2a 70 54 61 62 20 3d 20 30 3b 20 20 20  le *pTab = 0;   
179a0 20 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20 62 65    /* Table to be
179b0 20 69 6e 64 65 78 65 64 20 2a 2f 0a 20 20 49 6e   indexed */.  In
179c0 64 65 78 20 2a 70 49 6e 64 65 78 20 3d 20 30 3b  dex *pIndex = 0;
179d0 20 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20     /* The index 
179e0 74 6f 20 62 65 20 63 72 65 61 74 65 64 20 2a 2f  to be created */
179f0 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d  .  char *zName =
17a00 20 30 3b 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20   0;     /* Name 
17a10 6f 66 20 74 68 65 20 69 6e 64 65 78 20 2a 2f 0a  of the index */.
17a20 20 20 69 6e 74 20 6e 4e 61 6d 65 3b 20 20 20 20    int nName;    
17a30 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
17a40 20 6f 66 20 63 68 61 72 61 63 74 65 72 73 20 69   of characters i
17a50 6e 20 7a 4e 61 6d 65 20 2a 2f 0a 20 20 69 6e 74  n zName */.  int
17a60 20 69 2c 20 6a 3b 0a 20 20 44 62 46 69 78 65 72   i, j;.  DbFixer
17a70 20 73 46 69 78 3b 20 20 20 20 20 20 20 20 2f 2a   sFix;        /*
17a80 20 46 6f 72 20 61 73 73 69 67 6e 69 6e 67 20 64   For assigning d
17a90 61 74 61 62 61 73 65 20 6e 61 6d 65 73 20 74 6f  atabase names to
17aa0 20 70 54 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74   pTable */.  int
17ab0 20 73 6f 72 74 4f 72 64 65 72 4d 61 73 6b 3b 20   sortOrderMask; 
17ac0 20 20 2f 2a 20 31 20 74 6f 20 68 6f 6e 6f 72 20    /* 1 to honor 
17ad0 44 45 53 43 20 69 6e 20 69 6e 64 65 78 2e 20 20  DESC in index.  
17ae0 30 20 74 6f 20 69 67 6e 6f 72 65 2e 20 2a 2f 0a  0 to ignore. */.
17af0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
17b00 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 44 62  pParse->db;.  Db
17b10 20 2a 70 44 62 3b 20 20 20 20 20 20 20 20 20 20   *pDb;          
17b20 20 20 20 2f 2a 20 54 68 65 20 73 70 65 63 69 66     /* The specif
17b30 69 63 20 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e  ic table contain
17b40 69 6e 67 20 74 68 65 20 69 6e 64 65 78 65 64 20  ing the indexed 
17b50 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 69 6e  database */.  in
17b60 74 20 69 44 62 3b 20 20 20 20 20 20 20 20 20 20  t iDb;          
17b70 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74     /* Index of t
17b80 68 65 20 64 61 74 61 62 61 73 65 20 74 68 61 74  he database that
17b90 20 69 73 20 62 65 69 6e 67 20 77 72 69 74 74 65   is being writte
17ba0 6e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e  n */.  Token *pN
17bb0 61 6d 65 20 3d 20 30 3b 20 20 20 20 2f 2a 20 55  ame = 0;    /* U
17bc0 6e 71 75 61 6c 69 66 69 65 64 20 6e 61 6d 65 20  nqualified name 
17bd0 6f 66 20 74 68 65 20 69 6e 64 65 78 20 74 6f 20  of the index to 
17be0 63 72 65 61 74 65 20 2a 2f 0a 20 20 73 74 72 75  create */.  stru
17bf0 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
17c00 20 2a 70 4c 69 73 74 49 74 65 6d 3b 20 2f 2a 20   *pListItem; /* 
17c10 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72  For looping over
17c20 20 70 4c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20   pList */.  int 
17c30 6e 45 78 74 72 61 20 3d 20 30 3b 20 20 20 20 20  nExtra = 0;     
17c40 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
17c50 53 70 61 63 65 20 61 6c 6c 6f 63 61 74 65 64 20  Space allocated 
17c60 66 6f 72 20 7a 45 78 74 72 61 5b 5d 20 2a 2f 0a  for zExtra[] */.
17c70 20 20 69 6e 74 20 6e 45 78 74 72 61 43 6f 6c 3b    int nExtraCol;
17c80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17c90 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
17ca0 65 78 74 72 61 20 63 6f 6c 75 6d 6e 73 20 6e 65  extra columns ne
17cb0 65 64 65 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a  eded */.  char *
17cc0 7a 45 78 74 72 61 20 3d 20 30 3b 20 20 20 20 20  zExtra = 0;     
17cd0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78             /* Ex
17ce0 74 72 61 20 73 70 61 63 65 20 61 66 74 65 72 20  tra space after 
17cf0 74 68 65 20 49 6e 64 65 78 20 6f 62 6a 65 63 74  the Index object
17d00 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 50 6b   */.  Index *pPk
17d10 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 50 52   = 0;      /* PR
17d20 49 4d 41 52 59 20 4b 45 59 20 69 6e 64 65 78 20  IMARY KEY index 
17d30 66 6f 72 20 57 49 54 48 4f 55 54 20 52 4f 57 49  for WITHOUT ROWI
17d40 44 20 74 61 62 6c 65 73 20 2a 2f 0a 0a 20 20 69  D tables */..  i
17d50 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
17d60 6c 65 64 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e  led || pParse->n
17d70 45 72 72 3e 30 20 29 7b 0a 20 20 20 20 67 6f 74  Err>0 ){.    got
17d80 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
17d90 64 65 78 3b 0a 20 20 7d 0a 20 20 69 66 28 20 49  dex;.  }.  if( I
17da0 4e 5f 44 45 43 4c 41 52 45 5f 56 54 41 42 20 26  N_DECLARE_VTAB &
17db0 26 20 69 64 78 54 79 70 65 21 3d 53 51 4c 49 54  & idxType!=SQLIT
17dc0 45 5f 49 44 58 54 59 50 45 5f 50 52 49 4d 41 52  E_IDXTYPE_PRIMAR
17dd0 59 4b 45 59 20 29 7b 0a 20 20 20 20 67 6f 74 6f  YKEY ){.    goto
17de0 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
17df0 65 78 3b 0a 20 20 7d 0a 20 20 69 66 28 20 53 51  ex;.  }.  if( SQ
17e00 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33  LITE_OK!=sqlite3
17e10 52 65 61 64 53 63 68 65 6d 61 28 70 50 61 72 73  ReadSchema(pPars
17e20 65 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65  e) ){.    goto e
17e30 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
17e40 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a  ;.  }..  /*.  **
17e50 20 46 69 6e 64 20 74 68 65 20 74 61 62 6c 65 20   Find the table 
17e60 74 68 61 74 20 69 73 20 74 6f 20 62 65 20 69 6e  that is to be in
17e70 64 65 78 65 64 2e 20 20 52 65 74 75 72 6e 20 65  dexed.  Return e
17e80 61 72 6c 79 20 69 66 20 6e 6f 74 20 66 6f 75 6e  arly if not foun
17e90 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 54  d..  */.  if( pT
17ea0 62 6c 4e 61 6d 65 21 3d 30 20 29 7b 0a 0a 20 20  blName!=0 ){..  
17eb0 20 20 2f 2a 20 55 73 65 20 74 68 65 20 74 77 6f    /* Use the two
17ec0 2d 70 61 72 74 20 69 6e 64 65 78 20 6e 61 6d 65  -part index name
17ed0 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68   to determine th
17ee0 65 20 64 61 74 61 62 61 73 65 20 0a 20 20 20 20  e database .    
17ef0 2a 2a 20 74 6f 20 73 65 61 72 63 68 20 66 6f 72  ** to search for
17f00 20 74 68 65 20 74 61 62 6c 65 2e 20 27 46 69 78   the table. 'Fix
17f10 27 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65  ' the table name
17f20 20 74 6f 20 74 68 69 73 20 64 62 0a 20 20 20 20   to this db.    
17f30 2a 2a 20 62 65 66 6f 72 65 20 6c 6f 6f 6b 69 6e  ** before lookin
17f40 67 20 75 70 20 74 68 65 20 74 61 62 6c 65 2e 0a  g up the table..
17f50 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72      */.    asser
17f60 74 28 20 70 4e 61 6d 65 31 20 26 26 20 70 4e 61  t( pName1 && pNa
17f70 6d 65 32 20 29 3b 0a 20 20 20 20 69 44 62 20 3d  me2 );.    iDb =
17f80 20 73 71 6c 69 74 65 33 54 77 6f 50 61 72 74 4e   sqlite3TwoPartN
17f90 61 6d 65 28 70 50 61 72 73 65 2c 20 70 4e 61 6d  ame(pParse, pNam
17fa0 65 31 2c 20 70 4e 61 6d 65 32 2c 20 26 70 4e 61  e1, pName2, &pNa
17fb0 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 69 44 62  me);.    if( iDb
17fc0 3c 30 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63  <0 ) goto exit_c
17fd0 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20  reate_index;.   
17fe0 20 61 73 73 65 72 74 28 20 70 4e 61 6d 65 20 26   assert( pName &
17ff0 26 20 70 4e 61 6d 65 2d 3e 7a 20 29 3b 0a 0a 23  & pName->z );..#
18000 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
18010 49 54 5f 54 45 4d 50 44 42 0a 20 20 20 20 2f 2a  IT_TEMPDB.    /*
18020 20 49 66 20 74 68 65 20 69 6e 64 65 78 20 6e 61   If the index na
18030 6d 65 20 77 61 73 20 75 6e 71 75 61 6c 69 66 69  me was unqualifi
18040 65 64 2c 20 63 68 65 63 6b 20 69 66 20 74 68 65  ed, check if the
18050 20 74 61 62 6c 65 0a 20 20 20 20 2a 2a 20 69 73   table.    ** is
18060 20 61 20 74 65 6d 70 20 74 61 62 6c 65 2e 20 49   a temp table. I
18070 66 20 73 6f 2c 20 73 65 74 20 74 68 65 20 64 61  f so, set the da
18080 74 61 62 61 73 65 20 74 6f 20 31 2e 20 44 6f 20  tabase to 1. Do 
18090 6e 6f 74 20 64 6f 20 74 68 69 73 0a 20 20 20 20  not do this.    
180a0 2a 2a 20 69 66 20 69 6e 69 74 69 61 6c 69 73 69  ** if initialisi
180b0 6e 67 20 61 20 64 61 74 61 62 61 73 65 20 73 63  ng a database sc
180c0 68 65 6d 61 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  hema..    */.   
180d0 20 69 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62   if( !db->init.b
180e0 75 73 79 20 29 7b 0a 20 20 20 20 20 20 70 54 61  usy ){.      pTa
180f0 62 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69  b = sqlite3SrcLi
18100 73 74 4c 6f 6f 6b 75 70 28 70 50 61 72 73 65 2c  stLookup(pParse,
18110 20 70 54 62 6c 4e 61 6d 65 29 3b 0a 20 20 20 20   pTblName);.    
18120 20 20 69 66 28 20 70 4e 61 6d 65 32 2d 3e 6e 3d    if( pName2->n=
18130 3d 30 20 26 26 20 70 54 61 62 20 26 26 20 70 54  =0 && pTab && pT
18140 61 62 2d 3e 70 53 63 68 65 6d 61 3d 3d 64 62 2d  ab->pSchema==db-
18150 3e 61 44 62 5b 31 5d 2e 70 53 63 68 65 6d 61 20  >aDb[1].pSchema 
18160 29 7b 0a 20 20 20 20 20 20 20 20 69 44 62 20 3d  ){.        iDb =
18170 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
18180 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 73 71  }.#endif..    sq
18190 6c 69 74 65 33 46 69 78 49 6e 69 74 28 26 73 46  lite3FixInit(&sF
181a0 69 78 2c 20 70 50 61 72 73 65 2c 20 69 44 62 2c  ix, pParse, iDb,
181b0 20 22 69 6e 64 65 78 22 2c 20 70 4e 61 6d 65 29   "index", pName)
181c0 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
181d0 33 46 69 78 53 72 63 4c 69 73 74 28 26 73 46 69  3FixSrcList(&sFi
181e0 78 2c 20 70 54 62 6c 4e 61 6d 65 29 20 29 7b 0a  x, pTblName) ){.
181f0 20 20 20 20 20 20 2f 2a 20 42 65 63 61 75 73 65        /* Because
18200 20 74 68 65 20 70 61 72 73 65 72 20 63 6f 6e 73   the parser cons
18210 74 72 75 63 74 73 20 70 54 62 6c 4e 61 6d 65 20  tructs pTblName 
18220 66 72 6f 6d 20 61 20 73 69 6e 67 6c 65 20 69 64  from a single id
18230 65 6e 74 69 66 69 65 72 2c 0a 20 20 20 20 20 20  entifier,.      
18240 2a 2a 20 73 71 6c 69 74 65 33 46 69 78 53 72 63  ** sqlite3FixSrc
18250 4c 69 73 74 20 63 61 6e 20 6e 65 76 65 72 20 66  List can never f
18260 61 69 6c 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73  ail. */.      as
18270 73 65 72 74 28 30 29 3b 0a 20 20 20 20 7d 0a 20  sert(0);.    }. 
18280 20 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65     pTab = sqlite
18290 33 4c 6f 63 61 74 65 54 61 62 6c 65 49 74 65 6d  3LocateTableItem
182a0 28 70 50 61 72 73 65 2c 20 30 2c 20 26 70 54 62  (pParse, 0, &pTb
182b0 6c 4e 61 6d 65 2d 3e 61 5b 30 5d 29 3b 0a 20 20  lName->a[0]);.  
182c0 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6d 61    assert( db->ma
182d0 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d 30 20 7c 7c  llocFailed==0 ||
182e0 20 70 54 61 62 3d 3d 30 20 29 3b 0a 20 20 20 20   pTab==0 );.    
182f0 69 66 28 20 70 54 61 62 3d 3d 30 20 29 20 67 6f  if( pTab==0 ) go
18300 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
18310 6e 64 65 78 3b 0a 20 20 20 20 69 66 28 20 69 44  ndex;.    if( iD
18320 62 3d 3d 31 20 26 26 20 64 62 2d 3e 61 44 62 5b  b==1 && db->aDb[
18330 69 44 62 5d 2e 70 53 63 68 65 6d 61 21 3d 70 54  iDb].pSchema!=pT
18340 61 62 2d 3e 70 53 63 68 65 6d 61 20 29 7b 0a 20  ab->pSchema ){. 
18350 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
18360 72 4d 73 67 28 70 50 61 72 73 65 2c 20 0a 20 20  rMsg(pParse, .  
18370 20 20 20 20 20 20 20 20 20 22 63 61 6e 6e 6f 74           "cannot
18380 20 63 72 65 61 74 65 20 61 20 54 45 4d 50 20 69   create a TEMP i
18390 6e 64 65 78 20 6f 6e 20 6e 6f 6e 2d 54 45 4d 50  ndex on non-TEMP
183a0 20 74 61 62 6c 65 20 5c 22 25 73 5c 22 22 2c 0a   table \"%s\"",.
183b0 20 20 20 20 20 20 20 20 20 20 20 70 54 61 62 2d             pTab-
183c0 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 67  >zName);.      g
183d0 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
183e0 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20  index;.    }.   
183f0 20 69 66 28 20 21 48 61 73 52 6f 77 69 64 28 70   if( !HasRowid(p
18400 54 61 62 29 20 29 20 70 50 6b 20 3d 20 73 71 6c  Tab) ) pPk = sql
18410 69 74 65 33 50 72 69 6d 61 72 79 4b 65 79 49 6e  ite3PrimaryKeyIn
18420 64 65 78 28 70 54 61 62 29 3b 0a 20 20 7d 65 6c  dex(pTab);.  }el
18430 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  se{.    assert( 
18440 70 4e 61 6d 65 3d 3d 30 20 29 3b 0a 20 20 20 20  pName==0 );.    
18450 61 73 73 65 72 74 28 20 70 53 74 61 72 74 3d 3d  assert( pStart==
18460 30 20 29 3b 0a 20 20 20 20 70 54 61 62 20 3d 20  0 );.    pTab = 
18470 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
18480 65 3b 0a 20 20 20 20 69 66 28 20 21 70 54 61 62  e;.    if( !pTab
18490 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65   ) goto exit_cre
184a0 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 69  ate_index;.    i
184b0 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65  Db = sqlite3Sche
184c0 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 54  maToIndex(db, pT
184d0 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20  ab->pSchema);.  
184e0 7d 0a 20 20 70 44 62 20 3d 20 26 64 62 2d 3e 61  }.  pDb = &db->a
184f0 44 62 5b 69 44 62 5d 3b 0a 0a 20 20 61 73 73 65  Db[iDb];..  asse
18500 72 74 28 20 70 54 61 62 21 3d 30 20 29 3b 0a 20  rt( pTab!=0 );. 
18510 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d   assert( pParse-
18520 3e 6e 45 72 72 3d 3d 30 20 29 3b 0a 20 20 69 66  >nErr==0 );.  if
18530 28 20 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d  ( sqlite3StrNICm
18540 70 28 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 22  p(pTab->zName, "
18550 73 71 6c 69 74 65 5f 22 2c 20 37 29 3d 3d 30 20  sqlite_", 7)==0 
18560 0a 20 20 20 20 20 20 20 26 26 20 64 62 2d 3e 69  .       && db->i
18570 6e 69 74 2e 62 75 73 79 3d 3d 30 0a 23 69 66 20  nit.busy==0.#if 
18580 53 51 4c 49 54 45 5f 55 53 45 52 5f 41 55 54 48  SQLITE_USER_AUTH
18590 45 4e 54 49 43 41 54 49 4f 4e 0a 20 20 20 20 20  ENTICATION.     
185a0 20 20 26 26 20 73 71 6c 69 74 65 33 55 73 65 72    && sqlite3User
185b0 41 75 74 68 54 61 62 6c 65 28 70 54 61 62 2d 3e  AuthTable(pTab->
185c0 7a 4e 61 6d 65 29 3d 3d 30 0a 23 65 6e 64 69 66  zName)==0.#endif
185d0 0a 20 20 20 20 20 20 20 26 26 20 73 71 6c 69 74  .       && sqlit
185e0 65 33 53 74 72 4e 49 43 6d 70 28 26 70 54 61 62  e3StrNICmp(&pTab
185f0 2d 3e 7a 4e 61 6d 65 5b 37 5d 2c 22 61 6c 74 65  ->zName[7],"alte
18600 72 74 61 62 5f 22 2c 39 29 21 3d 30 20 29 7b 0a  rtab_",9)!=0 ){.
18610 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
18620 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 61 62  Msg(pParse, "tab
18630 6c 65 20 25 73 20 6d 61 79 20 6e 6f 74 20 62 65  le %s may not be
18640 20 69 6e 64 65 78 65 64 22 2c 20 70 54 61 62 2d   indexed", pTab-
18650 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 67 6f 74  >zName);.    got
18660 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
18670 64 65 78 3b 0a 20 20 7d 0a 23 69 66 6e 64 65 66  dex;.  }.#ifndef
18680 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45   SQLITE_OMIT_VIE
18690 57 0a 20 20 69 66 28 20 70 54 61 62 2d 3e 70 53  W.  if( pTab->pS
186a0 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 73 71 6c  elect ){.    sql
186b0 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
186c0 72 73 65 2c 20 22 76 69 65 77 73 20 6d 61 79 20  rse, "views may 
186d0 6e 6f 74 20 62 65 20 69 6e 64 65 78 65 64 22 29  not be indexed")
186e0 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f  ;.    goto exit_
186f0 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
18700 7d 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 66  }.#endif.#ifndef
18710 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
18720 54 55 41 4c 54 41 42 4c 45 0a 20 20 69 66 28 20  TUALTABLE.  if( 
18730 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20  IsVirtual(pTab) 
18740 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
18750 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
18760 76 69 72 74 75 61 6c 20 74 61 62 6c 65 73 20 6d  virtual tables m
18770 61 79 20 6e 6f 74 20 62 65 20 69 6e 64 65 78 65  ay not be indexe
18780 64 22 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78  d");.    goto ex
18790 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
187a0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  .  }.#endif..  /
187b0 2a 0a 20 20 2a 2a 20 46 69 6e 64 20 74 68 65 20  *.  ** Find the 
187c0 6e 61 6d 65 20 6f 66 20 74 68 65 20 69 6e 64 65  name of the inde
187d0 78 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 74 68  x.  Make sure th
187e0 65 72 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61  ere is not alrea
187f0 64 79 20 61 6e 6f 74 68 65 72 0a 20 20 2a 2a 20  dy another.  ** 
18800 69 6e 64 65 78 20 6f 72 20 74 61 62 6c 65 20 77  index or table w
18810 69 74 68 20 74 68 65 20 73 61 6d 65 20 6e 61 6d  ith the same nam
18820 65 2e 20 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45  e.  .  **.  ** E
18830 78 63 65 70 74 69 6f 6e 3a 20 20 49 66 20 77 65  xception:  If we
18840 20 61 72 65 20 72 65 61 64 69 6e 67 20 74 68 65   are reading the
18850 20 6e 61 6d 65 73 20 6f 66 20 70 65 72 6d 61 6e   names of perman
18860 65 6e 74 20 69 6e 64 69 63 65 73 20 66 72 6f 6d  ent indices from
18870 20 74 68 65 0a 20 20 2a 2a 20 73 71 6c 69 74 65   the.  ** sqlite
18880 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20 28 62  _master table (b
18890 65 63 61 75 73 65 20 73 6f 6d 65 20 6f 74 68 65  ecause some othe
188a0 72 20 70 72 6f 63 65 73 73 20 63 68 61 6e 67 65  r process change
188b0 64 20 74 68 65 20 73 63 68 65 6d 61 29 20 61 6e  d the schema) an
188c0 64 0a 20 20 2a 2a 20 6f 6e 65 20 6f 66 20 74 68  d.  ** one of th
188d0 65 20 69 6e 64 65 78 20 6e 61 6d 65 73 20 63 6f  e index names co
188e0 6c 6c 69 64 65 73 20 77 69 74 68 20 74 68 65 20  llides with the 
188f0 6e 61 6d 65 20 6f 66 20 61 20 74 65 6d 70 6f 72  name of a tempor
18900 61 72 79 20 74 61 62 6c 65 20 6f 72 0a 20 20 2a  ary table or.  *
18910 2a 20 69 6e 64 65 78 2c 20 74 68 65 6e 20 77 65  * index, then we
18920 20 77 69 6c 6c 20 63 6f 6e 74 69 6e 75 65 20 74   will continue t
18930 6f 20 70 72 6f 63 65 73 73 20 74 68 69 73 20 69  o process this i
18940 6e 64 65 78 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ndex..  **.  ** 
18950 49 66 20 70 4e 61 6d 65 3d 3d 30 20 69 74 20 6d  If pName==0 it m
18960 65 61 6e 73 20 74 68 61 74 20 77 65 20 61 72 65  eans that we are
18970 0a 20 20 2a 2a 20 64 65 61 6c 69 6e 67 20 77 69  .  ** dealing wi
18980 74 68 20 61 20 70 72 69 6d 61 72 79 20 6b 65 79  th a primary key
18990 20 6f 72 20 55 4e 49 51 55 45 20 63 6f 6e 73 74   or UNIQUE const
189a0 72 61 69 6e 74 2e 20 20 57 65 20 68 61 76 65 20  raint.  We have 
189b0 74 6f 20 69 6e 76 65 6e 74 20 6f 75 72 0a 20 20  to invent our.  
189c0 2a 2a 20 6f 77 6e 20 6e 61 6d 65 2e 0a 20 20 2a  ** own name..  *
189d0 2f 0a 20 20 69 66 28 20 70 4e 61 6d 65 20 29 7b  /.  if( pName ){
189e0 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c  .    zName = sql
189f0 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65  ite3NameFromToke
18a00 6e 28 64 62 2c 20 70 4e 61 6d 65 29 3b 0a 20 20  n(db, pName);.  
18a10 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29    if( zName==0 )
18a20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
18a30 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 61 73 73  e_index;.    ass
18a40 65 72 74 28 20 70 4e 61 6d 65 2d 3e 7a 21 3d 30  ert( pName->z!=0
18a50 20 29 3b 0a 20 20 20 20 69 66 28 20 53 51 4c 49   );.    if( SQLI
18a60 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 43 68  TE_OK!=sqlite3Ch
18a70 65 63 6b 4f 62 6a 65 63 74 4e 61 6d 65 28 70 50  eckObjectName(pP
18a80 61 72 73 65 2c 20 7a 4e 61 6d 65 29 20 29 7b 0a  arse, zName) ){.
18a90 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f        goto exit_
18aa0 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
18ab0 20 20 7d 0a 20 20 20 20 69 66 28 20 21 64 62 2d    }.    if( !db-
18ac0 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20 20  >init.busy ){.  
18ad0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 46      if( sqlite3F
18ae0 69 6e 64 54 61 62 6c 65 28 64 62 2c 20 7a 4e 61  indTable(db, zNa
18af0 6d 65 2c 20 30 29 21 3d 30 20 29 7b 0a 20 20 20  me, 0)!=0 ){.   
18b00 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
18b10 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 68  rMsg(pParse, "th
18b20 65 72 65 20 69 73 20 61 6c 72 65 61 64 79 20 61  ere is already a
18b30 20 74 61 62 6c 65 20 6e 61 6d 65 64 20 25 73 22   table named %s"
18b40 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  , zName);.      
18b50 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61    goto exit_crea
18b60 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 20 20  te_index;.      
18b70 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
18b80 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 64 65 78  sqlite3FindIndex
18b90 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 70 44 62 2d  (db, zName, pDb-
18ba0 3e 7a 4e 61 6d 65 29 21 3d 30 20 29 7b 0a 20 20  >zName)!=0 ){.  
18bb0 20 20 20 20 69 66 28 20 21 69 66 4e 6f 74 45 78      if( !ifNotEx
18bc0 69 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ist ){.        s
18bd0 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
18be0 50 61 72 73 65 2c 20 22 69 6e 64 65 78 20 25 73  Parse, "index %s
18bf0 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 22   already exists"
18c00 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  , zName);.      
18c10 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61  }else{.        a
18c20 73 73 65 72 74 28 20 21 64 62 2d 3e 69 6e 69 74  ssert( !db->init
18c30 2e 62 75 73 79 20 29 3b 0a 20 20 20 20 20 20 20  .busy );.       
18c40 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69   sqlite3CodeVeri
18c50 66 79 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c  fySchema(pParse,
18c60 20 69 44 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20   iDb);.      }. 
18c70 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63       goto exit_c
18c80 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20  reate_index;.   
18c90 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
18ca0 69 6e 74 20 6e 3b 0a 20 20 20 20 49 6e 64 65 78  int n;.    Index
18cb0 20 2a 70 4c 6f 6f 70 3b 0a 20 20 20 20 66 6f 72   *pLoop;.    for
18cc0 28 70 4c 6f 6f 70 3d 70 54 61 62 2d 3e 70 49 6e  (pLoop=pTab->pIn
18cd0 64 65 78 2c 20 6e 3d 31 3b 20 70 4c 6f 6f 70 3b  dex, n=1; pLoop;
18ce0 20 70 4c 6f 6f 70 3d 70 4c 6f 6f 70 2d 3e 70 4e   pLoop=pLoop->pN
18cf0 65 78 74 2c 20 6e 2b 2b 29 7b 7d 0a 20 20 20 20  ext, n++){}.    
18d00 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d  zName = sqlite3M
18d10 50 72 69 6e 74 66 28 64 62 2c 20 22 73 71 6c 69  Printf(db, "sqli
18d20 74 65 5f 61 75 74 6f 69 6e 64 65 78 5f 25 73 5f  te_autoindex_%s_
18d30 25 64 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  %d", pTab->zName
18d40 2c 20 6e 29 3b 0a 20 20 20 20 69 66 28 20 7a 4e  , n);.    if( zN
18d50 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ame==0 ){.      
18d60 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
18d70 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20  _index;.    }.  
18d80 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f  }..  /* Check fo
18d90 72 20 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20  r authorization 
18da0 74 6f 20 63 72 65 61 74 65 20 61 6e 20 69 6e 64  to create an ind
18db0 65 78 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66  ex..  */.#ifndef
18dc0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
18dd0 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 7b 0a 20  HORIZATION.  {. 
18de0 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
18df0 44 62 20 3d 20 70 44 62 2d 3e 7a 4e 61 6d 65 3b  Db = pDb->zName;
18e00 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
18e10 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65  AuthCheck(pParse
18e20 2c 20 53 51 4c 49 54 45 5f 49 4e 53 45 52 54 2c  , SQLITE_INSERT,
18e30 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 44   SCHEMA_TABLE(iD
18e40 62 29 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20  b), 0, zDb) ){. 
18e50 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63       goto exit_c
18e60 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20  reate_index;.   
18e70 20 7d 0a 20 20 20 20 69 20 3d 20 53 51 4c 49 54   }.    i = SQLIT
18e80 45 5f 43 52 45 41 54 45 5f 49 4e 44 45 58 3b 0a  E_CREATE_INDEX;.
18e90 20 20 20 20 69 66 28 20 21 4f 4d 49 54 5f 54 45      if( !OMIT_TE
18ea0 4d 50 44 42 20 26 26 20 69 44 62 3d 3d 31 20 29  MPDB && iDb==1 )
18eb0 20 69 20 3d 20 53 51 4c 49 54 45 5f 43 52 45 41   i = SQLITE_CREA
18ec0 54 45 5f 54 45 4d 50 5f 49 4e 44 45 58 3b 0a 20  TE_TEMP_INDEX;. 
18ed0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75     if( sqlite3Au
18ee0 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  thCheck(pParse, 
18ef0 69 2c 20 7a 4e 61 6d 65 2c 20 70 54 61 62 2d 3e  i, zName, pTab->
18f00 7a 4e 61 6d 65 2c 20 7a 44 62 29 20 29 7b 0a 20  zName, zDb) ){. 
18f10 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63       goto exit_c
18f20 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20  reate_index;.   
18f30 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20   }.  }.#endif.. 
18f40 20 2f 2a 20 49 66 20 70 4c 69 73 74 3d 3d 30 2c   /* If pList==0,
18f50 20 69 74 20 6d 65 61 6e 73 20 74 68 69 73 20 72   it means this r
18f60 6f 75 74 69 6e 65 20 77 61 73 20 63 61 6c 6c 65  outine was calle
18f70 64 20 74 6f 20 6d 61 6b 65 20 61 20 70 72 69 6d  d to make a prim
18f80 61 72 79 0a 20 20 2a 2a 20 6b 65 79 20 6f 75 74  ary.  ** key out
18f90 20 6f 66 20 74 68 65 20 6c 61 73 74 20 63 6f 6c   of the last col
18fa0 75 6d 6e 20 61 64 64 65 64 20 74 6f 20 74 68 65  umn added to the
18fb0 20 74 61 62 6c 65 20 75 6e 64 65 72 20 63 6f 6e   table under con
18fc0 73 74 72 75 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20  struction..  ** 
18fd0 53 6f 20 63 72 65 61 74 65 20 61 20 66 61 6b 65  So create a fake
18fe0 20 6c 69 73 74 20 74 6f 20 73 69 6d 75 6c 61 74   list to simulat
18ff0 65 20 74 68 69 73 2e 0a 20 20 2a 2f 0a 20 20 69  e this..  */.  i
19000 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20  f( pList==0 ){. 
19010 20 20 20 54 6f 6b 65 6e 20 70 72 65 76 43 6f 6c     Token prevCol
19020 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 54 6f 6b  ;.    sqlite3Tok
19030 65 6e 49 6e 69 74 28 26 70 72 65 76 43 6f 6c 2c  enInit(&prevCol,
19040 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 54 61 62   pTab->aCol[pTab
19050 2d 3e 6e 43 6f 6c 2d 31 5d 2e 7a 4e 61 6d 65 29  ->nCol-1].zName)
19060 3b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 73 71  ;.    pList = sq
19070 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70  lite3ExprListApp
19080 65 6e 64 28 70 50 61 72 73 65 2c 20 30 2c 0a 20  end(pParse, 0,. 
19090 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
190a0 69 74 65 33 45 78 70 72 41 6c 6c 6f 63 28 64 62  ite3ExprAlloc(db
190b0 2c 20 54 4b 5f 49 44 2c 20 26 70 72 65 76 43 6f  , TK_ID, &prevCo
190c0 6c 2c 20 30 29 29 3b 0a 20 20 20 20 69 66 28 20  l, 0));.    if( 
190d0 70 4c 69 73 74 3d 3d 30 20 29 20 67 6f 74 6f 20  pList==0 ) goto 
190e0 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
190f0 78 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  x;.    assert( p
19100 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 31 20 29  List->nExpr==1 )
19110 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  ;.    sqlite3Exp
19120 72 4c 69 73 74 53 65 74 53 6f 72 74 4f 72 64 65  rListSetSortOrde
19130 72 28 70 4c 69 73 74 2c 20 73 6f 72 74 4f 72 64  r(pList, sortOrd
19140 65 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  er);.  }else{.  
19150 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
19160 74 43 68 65 63 6b 4c 65 6e 67 74 68 28 70 50 61  tCheckLength(pPa
19170 72 73 65 2c 20 70 4c 69 73 74 2c 20 22 69 6e 64  rse, pList, "ind
19180 65 78 22 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  ex");.  }..  /* 
19190 46 69 67 75 72 65 20 6f 75 74 20 68 6f 77 20 6d  Figure out how m
191a0 61 6e 79 20 62 79 74 65 73 20 6f 66 20 73 70 61  any bytes of spa
191b0 63 65 20 61 72 65 20 72 65 71 75 69 72 65 64 20  ce are required 
191c0 74 6f 20 73 74 6f 72 65 20 65 78 70 6c 69 63 69  to store explici
191d0 74 6c 79 0a 20 20 2a 2a 20 73 70 65 63 69 66 69  tly.  ** specifi
191e0 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  ed collation seq
191f0 75 65 6e 63 65 20 6e 61 6d 65 73 2e 0a 20 20 2a  uence names..  *
19200 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  /.  for(i=0; i<p
19210 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  List->nExpr; i++
19220 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45 78  ){.    Expr *pEx
19230 70 72 20 3d 20 70 4c 69 73 74 2d 3e 61 5b 69 5d  pr = pList->a[i]
19240 2e 70 45 78 70 72 3b 0a 20 20 20 20 61 73 73 65  .pExpr;.    asse
19250 72 74 28 20 70 45 78 70 72 21 3d 30 20 29 3b 0a  rt( pExpr!=0 );.
19260 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f      if( pExpr->o
19270 70 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45 20 29 7b  p==TK_COLLATE ){
19280 0a 20 20 20 20 20 20 6e 45 78 74 72 61 20 2b 3d  .      nExtra +=
19290 20 28 31 20 2b 20 73 71 6c 69 74 65 33 53 74 72   (1 + sqlite3Str
192a0 6c 65 6e 33 30 28 70 45 78 70 72 2d 3e 75 2e 7a  len30(pExpr->u.z
192b0 54 6f 6b 65 6e 29 29 3b 0a 20 20 20 20 7d 0a 20  Token));.    }. 
192c0 20 7d 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 41   }..  /* .  ** A
192d0 6c 6c 6f 63 61 74 65 20 74 68 65 20 69 6e 64 65  llocate the inde
192e0 78 20 73 74 72 75 63 74 75 72 65 2e 20 0a 20 20  x structure. .  
192f0 2a 2f 0a 20 20 6e 4e 61 6d 65 20 3d 20 73 71 6c  */.  nName = sql
19300 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4e 61  ite3Strlen30(zNa
19310 6d 65 29 3b 0a 20 20 6e 45 78 74 72 61 43 6f 6c  me);.  nExtraCol
19320 20 3d 20 70 50 6b 20 3f 20 70 50 6b 2d 3e 6e 4b   = pPk ? pPk->nK
19330 65 79 43 6f 6c 20 3a 20 31 3b 0a 20 20 70 49 6e  eyCol : 1;.  pIn
19340 64 65 78 20 3d 20 73 71 6c 69 74 65 33 41 6c 6c  dex = sqlite3All
19350 6f 63 61 74 65 49 6e 64 65 78 4f 62 6a 65 63 74  ocateIndexObject
19360 28 64 62 2c 20 70 4c 69 73 74 2d 3e 6e 45 78 70  (db, pList->nExp
19370 72 20 2b 20 6e 45 78 74 72 61 43 6f 6c 2c 0a 20  r + nExtraCol,. 
19380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
193a0 20 20 20 20 20 6e 4e 61 6d 65 20 2b 20 6e 45 78       nName + nEx
193b0 74 72 61 20 2b 20 31 2c 20 26 7a 45 78 74 72 61  tra + 1, &zExtra
193c0 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  );.  if( db->mal
193d0 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
193e0 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
193f0 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 61  e_index;.  }.  a
19400 73 73 65 72 74 28 20 45 49 47 48 54 5f 42 59 54  ssert( EIGHT_BYT
19410 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 70 49 6e 64  E_ALIGNMENT(pInd
19420 65 78 2d 3e 61 69 52 6f 77 4c 6f 67 45 73 74 29  ex->aiRowLogEst)
19430 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 45 49   );.  assert( EI
19440 47 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45  GHT_BYTE_ALIGNME
19450 4e 54 28 70 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c  NT(pIndex->azCol
19460 6c 29 20 29 3b 0a 20 20 70 49 6e 64 65 78 2d 3e  l) );.  pIndex->
19470 7a 4e 61 6d 65 20 3d 20 7a 45 78 74 72 61 3b 0a  zName = zExtra;.
19480 20 20 7a 45 78 74 72 61 20 2b 3d 20 6e 4e 61 6d    zExtra += nNam
19490 65 20 2b 20 31 3b 0a 20 20 6d 65 6d 63 70 79 28  e + 1;.  memcpy(
194a0 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 7a  pIndex->zName, z
194b0 4e 61 6d 65 2c 20 6e 4e 61 6d 65 2b 31 29 3b 0a  Name, nName+1);.
194c0 20 20 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65    pIndex->pTable
194d0 20 3d 20 70 54 61 62 3b 0a 20 20 70 49 6e 64 65   = pTab;.  pInde
194e0 78 2d 3e 6f 6e 45 72 72 6f 72 20 3d 20 28 75 38  x->onError = (u8
194f0 29 6f 6e 45 72 72 6f 72 3b 0a 20 20 70 49 6e 64  )onError;.  pInd
19500 65 78 2d 3e 75 6e 69 71 4e 6f 74 4e 75 6c 6c 20  ex->uniqNotNull 
19510 3d 20 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f  = onError!=OE_No
19520 6e 65 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 69 64  ne;.  pIndex->id
19530 78 54 79 70 65 20 3d 20 69 64 78 54 79 70 65 3b  xType = idxType;
19540 0a 20 20 70 49 6e 64 65 78 2d 3e 70 53 63 68 65  .  pIndex->pSche
19550 6d 61 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62  ma = db->aDb[iDb
19560 5d 2e 70 53 63 68 65 6d 61 3b 0a 20 20 70 49 6e  ].pSchema;.  pIn
19570 64 65 78 2d 3e 6e 4b 65 79 43 6f 6c 20 3d 20 70  dex->nKeyCol = p
19580 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 69  List->nExpr;.  i
19590 66 28 20 70 50 49 57 68 65 72 65 20 29 7b 0a 20  f( pPIWhere ){. 
195a0 20 20 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76     sqlite3Resolv
195b0 65 53 65 6c 66 52 65 66 65 72 65 6e 63 65 28 70  eSelfReference(p
195c0 50 61 72 73 65 2c 20 70 54 61 62 2c 20 4e 43 5f  Parse, pTab, NC_
195d0 50 61 72 74 49 64 78 2c 20 70 50 49 57 68 65 72  PartIdx, pPIWher
195e0 65 2c 20 30 29 3b 0a 20 20 20 20 70 49 6e 64 65  e, 0);.    pInde
195f0 78 2d 3e 70 50 61 72 74 49 64 78 57 68 65 72 65  x->pPartIdxWhere
19600 20 3d 20 70 50 49 57 68 65 72 65 3b 0a 20 20 20   = pPIWhere;.   
19610 20 70 50 49 57 68 65 72 65 20 3d 20 30 3b 0a 20   pPIWhere = 0;. 
19620 20 7d 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c   }.  assert( sql
19630 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48  ite3SchemaMutexH
19640 65 6c 64 28 64 62 2c 20 69 44 62 2c 20 30 29 20  eld(db, iDb, 0) 
19650 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74  );..  /* Check t
19660 6f 20 73 65 65 20 69 66 20 77 65 20 73 68 6f 75  o see if we shou
19670 6c 64 20 68 6f 6e 6f 72 20 44 45 53 43 20 72 65  ld honor DESC re
19680 71 75 65 73 74 73 20 6f 6e 20 69 6e 64 65 78 20  quests on index 
19690 63 6f 6c 75 6d 6e 73 0a 20 20 2a 2f 0a 20 20 69  columns.  */.  i
196a0 66 28 20 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d  f( pDb->pSchema-
196b0 3e 66 69 6c 65 5f 66 6f 72 6d 61 74 3e 3d 34 20  >file_format>=4 
196c0 29 7b 0a 20 20 20 20 73 6f 72 74 4f 72 64 65 72  ){.    sortOrder
196d0 4d 61 73 6b 20 3d 20 2d 31 3b 20 20 20 2f 2a 20  Mask = -1;   /* 
196e0 48 6f 6e 6f 72 20 44 45 53 43 20 2a 2f 0a 20 20  Honor DESC */.  
196f0 7d 65 6c 73 65 7b 0a 20 20 20 20 73 6f 72 74 4f  }else{.    sortO
19700 72 64 65 72 4d 61 73 6b 20 3d 20 30 3b 20 20 20  rderMask = 0;   
19710 20 2f 2a 20 49 67 6e 6f 72 65 20 44 45 53 43 20   /* Ignore DESC 
19720 2a 2f 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6e 61  */.  }..  /* Ana
19730 6c 79 7a 65 20 74 68 65 20 6c 69 73 74 20 6f 66  lyze the list of
19740 20 65 78 70 72 65 73 73 69 6f 6e 73 20 74 68 61   expressions tha
19750 74 20 66 6f 72 6d 20 74 68 65 20 74 65 72 6d 73  t form the terms
19760 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 61 6e   of the index an
19770 64 0a 20 20 2a 2a 20 72 65 70 6f 72 74 20 61 6e  d.  ** report an
19780 79 20 65 72 72 6f 72 73 2e 20 20 49 6e 20 74 68  y errors.  In th
19790 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68  e common case wh
197a0 65 72 65 20 74 68 65 20 65 78 70 72 65 73 73 69  ere the expressi
197b0 6f 6e 20 69 73 20 65 78 61 63 74 6c 79 0a 20 20  on is exactly.  
197c0 2a 2a 20 61 20 74 61 62 6c 65 20 63 6f 6c 75 6d  ** a table colum
197d0 6e 2c 20 73 74 6f 72 65 20 74 68 61 74 20 63 6f  n, store that co
197e0 6c 75 6d 6e 20 69 6e 20 61 69 43 6f 6c 75 6d 6e  lumn in aiColumn
197f0 5b 5d 2e 20 20 46 6f 72 20 67 65 6e 65 72 61 6c  [].  For general
19800 20 65 78 70 72 65 73 73 69 6f 6e 73 2c 0a 20 20   expressions,.  
19810 2a 2a 20 70 6f 70 75 6c 61 74 65 20 70 49 6e 64  ** populate pInd
19820 65 78 2d 3e 61 43 6f 6c 45 78 70 72 20 61 6e 64  ex->aColExpr and
19830 20 73 74 6f 72 65 20 58 4e 5f 45 58 50 52 20 28   store XN_EXPR (
19840 2d 32 29 20 69 6e 20 61 69 43 6f 6c 75 6d 6e 5b  -2) in aiColumn[
19850 5d 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 4f 44  ]..  **.  ** TOD
19860 4f 3a 20 49 73 73 75 65 20 61 20 77 61 72 6e 69  O: Issue a warni
19870 6e 67 20 69 66 20 74 77 6f 20 6f 72 20 6d 6f 72  ng if two or mor
19880 65 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65  e columns of the
19890 20 69 6e 64 65 78 20 61 72 65 20 69 64 65 6e 74   index are ident
198a0 69 63 61 6c 2e 0a 20 20 2a 2a 20 54 4f 44 4f 3a  ical..  ** TODO:
198b0 20 49 73 73 75 65 20 61 20 77 61 72 6e 69 6e 67   Issue a warning
198c0 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 70 72   if the table pr
198d0 69 6d 61 72 79 20 6b 65 79 20 69 73 20 75 73 65  imary key is use
198e0 64 20 61 73 20 70 61 72 74 20 6f 66 20 74 68 65  d as part of the
198f0 0a 20 20 2a 2a 20 69 6e 64 65 78 20 6b 65 79 2e  .  ** index key.
19900 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 2c  .  */.  for(i=0,
19910 20 70 4c 69 73 74 49 74 65 6d 3d 70 4c 69 73 74   pListItem=pList
19920 2d 3e 61 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45  ->a; i<pList->nE
19930 78 70 72 3b 20 69 2b 2b 2c 20 70 4c 69 73 74 49  xpr; i++, pListI
19940 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72  tem++){.    Expr
19950 20 2a 70 43 45 78 70 72 3b 20 20 20 20 20 20 20   *pCExpr;       
19960 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
19970 65 20 69 2d 74 68 20 69 6e 64 65 78 20 65 78 70  e i-th index exp
19980 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 69  ression */.    i
19990 6e 74 20 72 65 71 75 65 73 74 65 64 53 6f 72 74  nt requestedSort
199a0 4f 72 64 65 72 3b 20 20 20 20 20 20 20 20 2f 2a  Order;        /*
199b0 20 41 53 43 20 6f 72 20 44 45 53 43 20 6f 6e 20   ASC or DESC on 
199c0 74 68 65 20 69 2d 74 68 20 65 78 70 72 65 73 73  the i-th express
199d0 69 6f 6e 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74  ion */.    const
199e0 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 3b 20 20 20   char *zColl;   
199f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c            /* Col
19a00 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20  lation sequence 
19a10 6e 61 6d 65 20 2a 2f 0a 0a 20 20 20 20 73 71 6c  name */..    sql
19a20 69 74 65 33 53 74 72 69 6e 67 54 6f 49 64 28 70  ite3StringToId(p
19a30 4c 69 73 74 49 74 65 6d 2d 3e 70 45 78 70 72 29  ListItem->pExpr)
19a40 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 73  ;.    sqlite3Res
19a50 6f 6c 76 65 53 65 6c 66 52 65 66 65 72 65 6e 63  olveSelfReferenc
19a60 65 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20  e(pParse, pTab, 
19a70 4e 43 5f 49 64 78 45 78 70 72 2c 20 70 4c 69 73  NC_IdxExpr, pLis
19a80 74 49 74 65 6d 2d 3e 70 45 78 70 72 2c 20 30 29  tItem->pExpr, 0)
19a90 3b 0a 20 20 20 20 69 66 28 20 70 50 61 72 73 65  ;.    if( pParse
19aa0 2d 3e 6e 45 72 72 20 29 20 67 6f 74 6f 20 65 78  ->nErr ) goto ex
19ab0 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
19ac0 0a 20 20 20 20 70 43 45 78 70 72 20 3d 20 73 71  .    pCExpr = sq
19ad0 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c  lite3ExprSkipCol
19ae0 6c 61 74 65 28 70 4c 69 73 74 49 74 65 6d 2d 3e  late(pListItem->
19af0 70 45 78 70 72 29 3b 0a 20 20 20 20 69 66 28 20  pExpr);.    if( 
19b00 70 43 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43  pCExpr->op!=TK_C
19b10 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 20 20 69  OLUMN ){.      i
19b20 66 28 20 70 54 61 62 3d 3d 70 50 61 72 73 65 2d  f( pTab==pParse-
19b30 3e 70 4e 65 77 54 61 62 6c 65 20 29 7b 0a 20 20  >pNewTable ){.  
19b40 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
19b50 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 65  orMsg(pParse, "e
19b60 78 70 72 65 73 73 69 6f 6e 73 20 70 72 6f 68 69  xpressions prohi
19b70 62 69 74 65 64 20 69 6e 20 50 52 49 4d 41 52 59  bited in PRIMARY
19b80 20 4b 45 59 20 61 6e 64 20 22 0a 20 20 20 20 20   KEY and ".     
19b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19ba0 20 20 20 20 20 20 20 20 20 20 20 22 55 4e 49 51             "UNIQ
19bb0 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 73 22 29  UE constraints")
19bc0 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65  ;.        goto e
19bd0 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
19be0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
19bf0 69 66 28 20 70 49 6e 64 65 78 2d 3e 61 43 6f 6c  if( pIndex->aCol
19c00 45 78 70 72 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Expr==0 ){.     
19c10 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 43 6f     ExprList *pCo
19c20 70 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  py = sqlite3Expr
19c30 4c 69 73 74 44 75 70 28 64 62 2c 20 70 4c 69 73  ListDup(db, pLis
19c40 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70  t, 0);.        p
19c50 49 6e 64 65 78 2d 3e 61 43 6f 6c 45 78 70 72 20  Index->aColExpr 
19c60 3d 20 70 43 6f 70 79 3b 0a 20 20 20 20 20 20 20  = pCopy;.       
19c70 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63   if( !db->malloc
19c80 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20  Failed ){.      
19c90 20 20 20 20 61 73 73 65 72 74 28 20 70 43 6f 70      assert( pCop
19ca0 79 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  y!=0 );.        
19cb0 20 20 70 4c 69 73 74 49 74 65 6d 20 3d 20 26 70    pListItem = &p
19cc0 43 6f 70 79 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20  Copy->a[i];.    
19cd0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
19ce0 20 20 20 20 6a 20 3d 20 58 4e 5f 45 58 50 52 3b      j = XN_EXPR;
19cf0 0a 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 61  .      pIndex->a
19d00 69 43 6f 6c 75 6d 6e 5b 69 5d 20 3d 20 58 4e 5f  iColumn[i] = XN_
19d10 45 58 50 52 3b 0a 20 20 20 20 20 20 70 49 6e 64  EXPR;.      pInd
19d20 65 78 2d 3e 75 6e 69 71 4e 6f 74 4e 75 6c 6c 20  ex->uniqNotNull 
19d30 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = 0;.    }else{.
19d40 20 20 20 20 20 20 6a 20 3d 20 70 43 45 78 70 72        j = pCExpr
19d50 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20  ->iColumn;.     
19d60 20 61 73 73 65 72 74 28 20 6a 3c 3d 30 78 37 66   assert( j<=0x7f
19d70 66 66 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ff );.      if( 
19d80 6a 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 6a  j<0 ){.        j
19d90 20 3d 20 70 54 61 62 2d 3e 69 50 4b 65 79 3b 0a   = pTab->iPKey;.
19da0 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
19db0 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 6e 6f  pTab->aCol[j].no
19dc0 74 4e 75 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20 20  tNull==0 ){.    
19dd0 20 20 20 20 70 49 6e 64 65 78 2d 3e 75 6e 69 71      pIndex->uniq
19de0 4e 6f 74 4e 75 6c 6c 20 3d 20 30 3b 0a 20 20 20  NotNull = 0;.   
19df0 20 20 20 7d 0a 20 20 20 20 20 20 70 49 6e 64 65     }.      pInde
19e00 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 20 3d  x->aiColumn[i] =
19e10 20 28 69 31 36 29 6a 3b 0a 20 20 20 20 7d 0a 20   (i16)j;.    }. 
19e20 20 20 20 7a 43 6f 6c 6c 20 3d 20 30 3b 0a 20 20     zColl = 0;.  
19e30 20 20 69 66 28 20 70 4c 69 73 74 49 74 65 6d 2d    if( pListItem-
19e40 3e 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43  >pExpr->op==TK_C
19e50 4f 4c 4c 41 54 45 20 29 7b 0a 20 20 20 20 20 20  OLLATE ){.      
19e60 69 6e 74 20 6e 43 6f 6c 6c 3b 0a 20 20 20 20 20  int nColl;.     
19e70 20 7a 43 6f 6c 6c 20 3d 20 70 4c 69 73 74 49 74   zColl = pListIt
19e80 65 6d 2d 3e 70 45 78 70 72 2d 3e 75 2e 7a 54 6f  em->pExpr->u.zTo
19e90 6b 65 6e 3b 0a 20 20 20 20 20 20 6e 43 6f 6c 6c  ken;.      nColl
19ea0 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
19eb0 33 30 28 7a 43 6f 6c 6c 29 20 2b 20 31 3b 0a 20  30(zColl) + 1;. 
19ec0 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 45 78       assert( nEx
19ed0 74 72 61 3e 3d 6e 43 6f 6c 6c 20 29 3b 0a 20 20  tra>=nColl );.  
19ee0 20 20 20 20 6d 65 6d 63 70 79 28 7a 45 78 74 72      memcpy(zExtr
19ef0 61 2c 20 7a 43 6f 6c 6c 2c 20 6e 43 6f 6c 6c 29  a, zColl, nColl)
19f00 3b 0a 20 20 20 20 20 20 7a 43 6f 6c 6c 20 3d 20  ;.      zColl = 
19f10 7a 45 78 74 72 61 3b 0a 20 20 20 20 20 20 7a 45  zExtra;.      zE
19f20 78 74 72 61 20 2b 3d 20 6e 43 6f 6c 6c 3b 0a 20  xtra += nColl;. 
19f30 20 20 20 20 20 6e 45 78 74 72 61 20 2d 3d 20 6e       nExtra -= n
19f40 43 6f 6c 6c 3b 0a 20 20 20 20 7d 65 6c 73 65 20  Coll;.    }else 
19f50 69 66 28 20 6a 3e 3d 30 20 29 7b 0a 20 20 20 20  if( j>=0 ){.    
19f60 20 20 7a 43 6f 6c 6c 20 3d 20 70 54 61 62 2d 3e    zColl = pTab->
19f70 61 43 6f 6c 5b 6a 5d 2e 7a 43 6f 6c 6c 3b 0a 20  aCol[j].zColl;. 
19f80 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21 7a 43     }.    if( !zC
19f90 6f 6c 6c 20 29 20 7a 43 6f 6c 6c 20 3d 20 73 71  oll ) zColl = sq
19fa0 6c 69 74 65 33 53 74 72 42 49 4e 41 52 59 3b 0a  lite3StrBINARY;.
19fb0 20 20 20 20 69 66 28 20 21 64 62 2d 3e 69 6e 69      if( !db->ini
19fc0 74 2e 62 75 73 79 20 26 26 20 21 73 71 6c 69 74  t.busy && !sqlit
19fd0 65 33 4c 6f 63 61 74 65 43 6f 6c 6c 53 65 71 28  e3LocateCollSeq(
19fe0 70 50 61 72 73 65 2c 20 7a 43 6f 6c 6c 29 20 29  pParse, zColl) )
19ff0 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69  {.      goto exi
1a000 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
1a010 20 20 20 20 7d 0a 20 20 20 20 70 49 6e 64 65 78      }.    pIndex
1a020 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 20 3d 20 7a 43  ->azColl[i] = zC
1a030 6f 6c 6c 3b 0a 20 20 20 20 72 65 71 75 65 73 74  oll;.    request
1a040 65 64 53 6f 72 74 4f 72 64 65 72 20 3d 20 70 4c  edSortOrder = pL
1a050 69 73 74 49 74 65 6d 2d 3e 73 6f 72 74 4f 72 64  istItem->sortOrd
1a060 65 72 20 26 20 73 6f 72 74 4f 72 64 65 72 4d 61  er & sortOrderMa
1a070 73 6b 3b 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e  sk;.    pIndex->
1a080 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20 3d 20  aSortOrder[i] = 
1a090 28 75 38 29 72 65 71 75 65 73 74 65 64 53 6f 72  (u8)requestedSor
1a0a0 74 4f 72 64 65 72 3b 0a 20 20 7d 0a 0a 20 20 2f  tOrder;.  }..  /
1a0b0 2a 20 41 70 70 65 6e 64 20 74 68 65 20 74 61 62  * Append the tab
1a0c0 6c 65 20 6b 65 79 20 74 6f 20 74 68 65 20 65 6e  le key to the en
1a0d0 64 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e 20  d of the index. 
1a0e0 20 46 6f 72 20 57 49 54 48 4f 55 54 20 52 4f 57   For WITHOUT ROW
1a0f0 49 44 0a 20 20 2a 2a 20 74 61 62 6c 65 73 20 28  ID.  ** tables (
1a100 77 68 65 6e 20 70 50 6b 21 3d 30 29 20 74 68 69  when pPk!=0) thi
1a110 73 20 77 69 6c 6c 20 62 65 20 74 68 65 20 64 65  s will be the de
1a120 63 6c 61 72 65 64 20 50 52 49 4d 41 52 59 20 4b  clared PRIMARY K
1a130 45 59 2e 20 20 46 6f 72 0a 20 20 2a 2a 20 6e 6f  EY.  For.  ** no
1a140 72 6d 61 6c 20 74 61 62 6c 65 73 20 28 77 68 65  rmal tables (whe
1a150 6e 20 70 50 6b 3d 3d 30 29 20 74 68 69 73 20 77  n pPk==0) this w
1a160 69 6c 6c 20 62 65 20 74 68 65 20 72 6f 77 69 64  ill be the rowid
1a170 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 6b  ..  */.  if( pPk
1a180 20 29 7b 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b   ){.    for(j=0;
1a190 20 6a 3c 70 50 6b 2d 3e 6e 4b 65 79 43 6f 6c 3b   j<pPk->nKeyCol;
1a1a0 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74   j++){.      int
1a1b0 20 78 20 3d 20 70 50 6b 2d 3e 61 69 43 6f 6c 75   x = pPk->aiColu
1a1c0 6d 6e 5b 6a 5d 3b 0a 20 20 20 20 20 20 61 73 73  mn[j];.      ass
1a1d0 65 72 74 28 20 78 3e 3d 30 20 29 3b 0a 20 20 20  ert( x>=0 );.   
1a1e0 20 20 20 69 66 28 20 68 61 73 43 6f 6c 75 6d 6e     if( hasColumn
1a1f0 28 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d  (pIndex->aiColum
1a200 6e 2c 20 70 49 6e 64 65 78 2d 3e 6e 4b 65 79 43  n, pIndex->nKeyC
1a210 6f 6c 2c 20 78 29 20 29 7b 0a 20 20 20 20 20 20  ol, x) ){.      
1a220 20 20 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d    pIndex->nColum
1a230 6e 2d 2d 3b 20 0a 20 20 20 20 20 20 7d 65 6c 73  n--; .      }els
1a240 65 7b 0a 20 20 20 20 20 20 20 20 70 49 6e 64 65  e{.        pInde
1a250 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 20 3d  x->aiColumn[i] =
1a260 20 78 3b 0a 20 20 20 20 20 20 20 20 70 49 6e 64   x;.        pInd
1a270 65 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 20 3d 20  ex->azColl[i] = 
1a280 70 50 6b 2d 3e 61 7a 43 6f 6c 6c 5b 6a 5d 3b 0a  pPk->azColl[j];.
1a290 20 20 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e          pIndex->
1a2a0 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20 3d 20  aSortOrder[i] = 
1a2b0 70 50 6b 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b  pPk->aSortOrder[
1a2c0 6a 5d 3b 0a 20 20 20 20 20 20 20 20 69 2b 2b 3b  j];.        i++;
1a2d0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1a2e0 20 20 20 61 73 73 65 72 74 28 20 69 3d 3d 70 49     assert( i==pI
1a2f0 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 3b  ndex->nColumn );
1a300 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49  .  }else{.    pI
1a310 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69  ndex->aiColumn[i
1a320 5d 20 3d 20 58 4e 5f 52 4f 57 49 44 3b 0a 20 20  ] = XN_ROWID;.  
1a330 20 20 70 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c    pIndex->azColl
1a340 5b 69 5d 20 3d 20 73 71 6c 69 74 65 33 53 74 72  [i] = sqlite3Str
1a350 42 49 4e 41 52 59 3b 0a 20 20 7d 0a 20 20 73 71  BINARY;.  }.  sq
1a360 6c 69 74 65 33 44 65 66 61 75 6c 74 52 6f 77 45  lite3DefaultRowE
1a370 73 74 28 70 49 6e 64 65 78 29 3b 0a 20 20 69 66  st(pIndex);.  if
1a380 28 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  ( pParse->pNewTa
1a390 62 6c 65 3d 3d 30 20 29 20 65 73 74 69 6d 61 74  ble==0 ) estimat
1a3a0 65 49 6e 64 65 78 57 69 64 74 68 28 70 49 6e 64  eIndexWidth(pInd
1a3b0 65 78 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  ex);..  /* If th
1a3c0 69 73 20 69 6e 64 65 78 20 63 6f 6e 74 61 69 6e  is index contain
1a3d0 73 20 65 76 65 72 79 20 63 6f 6c 75 6d 6e 20 6f  s every column o
1a3e0 66 20 69 74 73 20 74 61 62 6c 65 2c 20 74 68 65  f its table, the
1a3f0 6e 20 6d 61 72 6b 0a 20 20 2a 2a 20 69 74 20 61  n mark.  ** it a
1a400 73 20 61 20 63 6f 76 65 72 69 6e 67 20 69 6e 64  s a covering ind
1a410 65 78 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  ex */.  assert( 
1a420 48 61 73 52 6f 77 69 64 28 70 54 61 62 29 20 0a  HasRowid(pTab) .
1a430 20 20 20 20 20 20 7c 7c 20 70 54 61 62 2d 3e 69        || pTab->i
1a440 50 4b 65 79 3c 30 20 7c 7c 20 73 71 6c 69 74 65  PKey<0 || sqlite
1a450 33 43 6f 6c 75 6d 6e 4f 66 49 6e 64 65 78 28 70  3ColumnOfIndex(p
1a460 49 6e 64 65 78 2c 20 70 54 61 62 2d 3e 69 50 4b  Index, pTab->iPK
1a470 65 79 29 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20  ey)>=0 );.  if( 
1a480 70 54 62 6c 4e 61 6d 65 21 3d 30 20 26 26 20 70  pTblName!=0 && p
1a490 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 3e 3d  Index->nColumn>=
1a4a0 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20  pTab->nCol ){.  
1a4b0 20 20 70 49 6e 64 65 78 2d 3e 69 73 43 6f 76 65    pIndex->isCove
1a4c0 72 69 6e 67 20 3d 20 31 3b 0a 20 20 20 20 66 6f  ring = 1;.    fo
1a4d0 72 28 6a 3d 30 3b 20 6a 3c 70 54 61 62 2d 3e 6e  r(j=0; j<pTab->n
1a4e0 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  Col; j++){.     
1a4f0 20 69 66 28 20 6a 3d 3d 70 54 61 62 2d 3e 69 50   if( j==pTab->iP
1a500 4b 65 79 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  Key ) continue;.
1a510 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
1a520 33 43 6f 6c 75 6d 6e 4f 66 49 6e 64 65 78 28 70  3ColumnOfIndex(p
1a530 49 6e 64 65 78 2c 6a 29 3e 3d 30 20 29 20 63 6f  Index,j)>=0 ) co
1a540 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 70 49  ntinue;.      pI
1a550 6e 64 65 78 2d 3e 69 73 43 6f 76 65 72 69 6e 67  ndex->isCovering
1a560 20 3d 20 30 3b 0a 20 20 20 20 20 20 62 72 65 61   = 0;.      brea
1a570 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  k;.    }.  }..  
1a580 69 66 28 20 70 54 61 62 3d 3d 70 50 61 72 73 65  if( pTab==pParse
1a590 2d 3e 70 4e 65 77 54 61 62 6c 65 20 29 7b 0a 20  ->pNewTable ){. 
1a5a0 20 20 20 2f 2a 20 54 68 69 73 20 72 6f 75 74 69     /* This routi
1a5b0 6e 65 20 68 61 73 20 62 65 65 6e 20 63 61 6c 6c  ne has been call
1a5c0 65 64 20 74 6f 20 63 72 65 61 74 65 20 61 6e 20  ed to create an 
1a5d0 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20  automatic index 
1a5e0 61 73 20 61 0a 20 20 20 20 2a 2a 20 72 65 73 75  as a.    ** resu
1a5f0 6c 74 20 6f 66 20 61 20 50 52 49 4d 41 52 59 20  lt of a PRIMARY 
1a600 4b 45 59 20 6f 72 20 55 4e 49 51 55 45 20 63 6c  KEY or UNIQUE cl
1a610 61 75 73 65 20 6f 6e 20 61 20 63 6f 6c 75 6d 6e  ause on a column
1a620 20 64 65 66 69 6e 69 74 69 6f 6e 2c 20 6f 72 0a   definition, or.
1a630 20 20 20 20 2a 2a 20 61 20 50 52 49 4d 41 52 59      ** a PRIMARY
1a640 20 4b 45 59 20 6f 72 20 55 4e 49 51 55 45 20 63   KEY or UNIQUE c
1a650 6c 61 75 73 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  lause following 
1a660 74 68 65 20 63 6f 6c 75 6d 6e 20 64 65 66 69 6e  the column defin
1a670 69 74 69 6f 6e 73 2e 0a 20 20 20 20 2a 2a 20 69  itions..    ** i
1a680 2e 65 2e 20 6f 6e 65 20 6f 66 3a 0a 20 20 20 20  .e. one of:.    
1a690 2a 2a 0a 20 20 20 20 2a 2a 20 43 52 45 41 54 45  **.    ** CREATE
1a6a0 20 54 41 42 4c 45 20 74 28 78 20 50 52 49 4d 41   TABLE t(x PRIMA
1a6b0 52 59 20 4b 45 59 2c 20 79 29 3b 0a 20 20 20 20  RY KEY, y);.    
1a6c0 2a 2a 20 43 52 45 41 54 45 20 54 41 42 4c 45 20  ** CREATE TABLE 
1a6d0 74 28 78 2c 20 79 2c 20 55 4e 49 51 55 45 28 78  t(x, y, UNIQUE(x
1a6e0 2c 20 79 29 29 3b 0a 20 20 20 20 2a 2a 0a 20 20  , y));.    **.  
1a6f0 20 20 2a 2a 20 45 69 74 68 65 72 20 77 61 79 2c    ** Either way,
1a700 20 63 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   check to see if
1a710 20 74 68 65 20 74 61 62 6c 65 20 61 6c 72 65 61   the table alrea
1a720 64 79 20 68 61 73 20 73 75 63 68 20 61 6e 20 69  dy has such an i
1a730 6e 64 65 78 2e 20 49 66 0a 20 20 20 20 2a 2a 20  ndex. If.    ** 
1a740 73 6f 2c 20 64 6f 6e 27 74 20 62 6f 74 68 65 72  so, don't bother
1a750 20 63 72 65 61 74 69 6e 67 20 74 68 69 73 20 6f   creating this o
1a760 6e 65 2e 20 54 68 69 73 20 6f 6e 6c 79 20 61 70  ne. This only ap
1a770 70 6c 69 65 73 20 74 6f 0a 20 20 20 20 2a 2a 20  plies to.    ** 
1a780 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63 72  automatically cr
1a790 65 61 74 65 64 20 69 6e 64 69 63 65 73 2e 20 55  eated indices. U
1a7a0 73 65 72 73 20 63 61 6e 20 64 6f 20 61 73 20 74  sers can do as t
1a7b0 68 65 79 20 77 69 73 68 20 77 69 74 68 0a 20 20  hey wish with.  
1a7c0 20 20 2a 2a 20 65 78 70 6c 69 63 69 74 20 69 6e    ** explicit in
1a7d0 64 69 63 65 73 2e 0a 20 20 20 20 2a 2a 0a 20 20  dices..    **.  
1a7e0 20 20 2a 2a 20 54 77 6f 20 55 4e 49 51 55 45 20    ** Two UNIQUE 
1a7f0 6f 72 20 50 52 49 4d 41 52 59 20 4b 45 59 20 63  or PRIMARY KEY c
1a800 6f 6e 73 74 72 61 69 6e 74 73 20 61 72 65 20 63  onstraints are c
1a810 6f 6e 73 69 64 65 72 65 64 20 65 71 75 69 76 61  onsidered equiva
1a820 6c 65 6e 74 0a 20 20 20 20 2a 2a 20 28 61 6e 64  lent.    ** (and
1a830 20 74 68 75 73 20 73 75 70 70 72 65 73 73 69 6e   thus suppressin
1a840 67 20 74 68 65 20 73 65 63 6f 6e 64 20 6f 6e 65  g the second one
1a850 29 20 65 76 65 6e 20 69 66 20 74 68 65 79 20 68  ) even if they h
1a860 61 76 65 20 64 69 66 66 65 72 65 6e 74 0a 20 20  ave different.  
1a870 20 20 2a 2a 20 73 6f 72 74 20 6f 72 64 65 72 73    ** sort orders
1a880 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
1a890 49 66 20 74 68 65 72 65 20 61 72 65 20 64 69 66  If there are dif
1a8a0 66 65 72 65 6e 74 20 63 6f 6c 6c 61 74 69 6e 67  ferent collating
1a8b0 20 73 65 71 75 65 6e 63 65 73 20 6f 72 20 69 66   sequences or if
1a8c0 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 6f 66 0a   the columns of.
1a8d0 20 20 20 20 2a 2a 20 74 68 65 20 63 6f 6e 73 74      ** the const
1a8e0 72 61 69 6e 74 20 6f 63 63 75 72 20 69 6e 20 64  raint occur in d
1a8f0 69 66 66 65 72 65 6e 74 20 6f 72 64 65 72 73 2c  ifferent orders,
1a900 20 74 68 65 6e 20 74 68 65 20 63 6f 6e 73 74 72   then the constr
1a910 61 69 6e 74 73 20 61 72 65 0a 20 20 20 20 2a 2a  aints are.    **
1a920 20 63 6f 6e 73 69 64 65 72 65 64 20 64 69 73 74   considered dist
1a930 69 6e 63 74 20 61 6e 64 20 62 6f 74 68 20 72 65  inct and both re
1a940 73 75 6c 74 20 69 6e 20 73 65 70 61 72 61 74 65  sult in separate
1a950 20 69 6e 64 69 63 65 73 2e 0a 20 20 20 20 2a 2f   indices..    */
1a960 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78  .    Index *pIdx
1a970 3b 0a 20 20 20 20 66 6f 72 28 70 49 64 78 3d 70  ;.    for(pIdx=p
1a980 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64  Tab->pIndex; pId
1a990 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e  x; pIdx=pIdx->pN
1a9a0 65 78 74 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  ext){.      int 
1a9b0 6b 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  k;.      assert(
1a9c0 20 49 73 55 6e 69 71 75 65 49 6e 64 65 78 28 70   IsUniqueIndex(p
1a9d0 49 64 78 29 20 29 3b 0a 20 20 20 20 20 20 61 73  Idx) );.      as
1a9e0 73 65 72 74 28 20 70 49 64 78 2d 3e 69 64 78 54  sert( pIdx->idxT
1a9f0 79 70 65 21 3d 53 51 4c 49 54 45 5f 49 44 58 54  ype!=SQLITE_IDXT
1aa00 59 50 45 5f 41 50 50 44 45 46 20 29 3b 0a 20 20  YPE_APPDEF );.  
1aa10 20 20 20 20 61 73 73 65 72 74 28 20 49 73 55 6e      assert( IsUn
1aa20 69 71 75 65 49 6e 64 65 78 28 70 49 6e 64 65 78  iqueIndex(pIndex
1aa30 29 20 29 3b 0a 0a 20 20 20 20 20 20 69 66 28 20  ) );..      if( 
1aa40 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 21 3d 70  pIdx->nKeyCol!=p
1aa50 49 6e 64 65 78 2d 3e 6e 4b 65 79 43 6f 6c 20 29  Index->nKeyCol )
1aa60 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
1aa70 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70 49 64 78   for(k=0; k<pIdx
1aa80 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 6b 2b 2b 29 7b  ->nKeyCol; k++){
1aa90 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63  .        const c
1aaa0 68 61 72 20 2a 7a 31 3b 0a 20 20 20 20 20 20 20  har *z1;.       
1aab0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 32 3b   const char *z2;
1aac0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
1aad0 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b   pIdx->aiColumn[
1aae0 6b 5d 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  k]>=0 );.       
1aaf0 20 69 66 28 20 70 49 64 78 2d 3e 61 69 43 6f 6c   if( pIdx->aiCol
1ab00 75 6d 6e 5b 6b 5d 21 3d 70 49 6e 64 65 78 2d 3e  umn[k]!=pIndex->
1ab10 61 69 43 6f 6c 75 6d 6e 5b 6b 5d 20 29 20 62 72  aiColumn[k] ) br
1ab20 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7a 31 20  eak;.        z1 
1ab30 3d 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6b  = pIdx->azColl[k
1ab40 5d 3b 0a 20 20 20 20 20 20 20 20 7a 32 20 3d 20  ];.        z2 = 
1ab50 70 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c 5b 6b  pIndex->azColl[k
1ab60 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73  ];.        if( s
1ab70 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 31  qlite3StrICmp(z1
1ab80 2c 20 7a 32 29 20 29 20 62 72 65 61 6b 3b 0a 20  , z2) ) break;. 
1ab90 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
1aba0 20 6b 3d 3d 70 49 64 78 2d 3e 6e 4b 65 79 43 6f   k==pIdx->nKeyCo
1abb0 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  l ){.        if(
1abc0 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d   pIdx->onError!=
1abd0 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 20  pIndex->onError 
1abe0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
1abf0 54 68 69 73 20 63 6f 6e 73 74 72 61 69 6e 74 20  This constraint 
1ac00 63 72 65 61 74 65 73 20 74 68 65 20 73 61 6d 65  creates the same
1ac10 20 69 6e 64 65 78 20 61 73 20 61 20 70 72 65 76   index as a prev
1ac20 69 6f 75 73 0a 20 20 20 20 20 20 20 20 20 20 2a  ious.          *
1ac30 2a 20 63 6f 6e 73 74 72 61 69 6e 74 20 73 70 65  * constraint spe
1ac40 63 69 66 69 65 64 20 73 6f 6d 65 77 68 65 72 65  cified somewhere
1ac50 20 69 6e 20 74 68 65 20 43 52 45 41 54 45 20 54   in the CREATE T
1ac60 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a  ABLE statement..
1ac70 20 20 20 20 20 20 20 20 20 20 2a 2a 20 48 6f 77            ** How
1ac80 65 76 65 72 20 74 68 65 20 4f 4e 20 43 4f 4e 46  ever the ON CONF
1ac90 4c 49 43 54 20 63 6c 61 75 73 65 73 20 61 72 65  LICT clauses are
1aca0 20 64 69 66 66 65 72 65 6e 74 2e 20 49 66 20 62   different. If b
1acb0 6f 74 68 20 74 68 69 73 20 0a 20 20 20 20 20 20  oth this .      
1acc0 20 20 20 20 2a 2a 20 63 6f 6e 73 74 72 61 69 6e      ** constrain
1acd0 74 20 61 6e 64 20 74 68 65 20 70 72 65 76 69 6f  t and the previo
1ace0 75 73 20 65 71 75 69 76 61 6c 65 6e 74 20 63 6f  us equivalent co
1acf0 6e 73 74 72 61 69 6e 74 20 68 61 76 65 20 65 78  nstraint have ex
1ad00 70 6c 69 63 69 74 0a 20 20 20 20 20 20 20 20 20  plicit.         
1ad10 20 2a 2a 20 4f 4e 20 43 4f 4e 46 4c 49 43 54 20   ** ON CONFLICT 
1ad20 63 6c 61 75 73 65 73 20 74 68 69 73 20 69 73 20  clauses this is 
1ad30 61 6e 20 65 72 72 6f 72 2e 20 4f 74 68 65 72 77  an error. Otherw
1ad40 69 73 65 2c 20 75 73 65 20 74 68 65 0a 20 20 20  ise, use the.   
1ad50 20 20 20 20 20 20 20 2a 2a 20 65 78 70 6c 69 63         ** explic
1ad60 69 74 6c 79 20 73 70 65 63 69 66 69 65 64 20 62  itly specified b
1ad70 65 68 61 76 69 6f 72 20 66 6f 72 20 74 68 65 20  ehavior for the 
1ad80 69 6e 64 65 78 2e 0a 20 20 20 20 20 20 20 20 20  index..         
1ad90 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66   */.          if
1ada0 28 20 21 28 70 49 64 78 2d 3e 6f 6e 45 72 72 6f  ( !(pIdx->onErro
1adb0 72 3d 3d 4f 45 5f 44 65 66 61 75 6c 74 20 7c 7c  r==OE_Default ||
1adc0 20 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72   pIndex->onError
1add0 3d 3d 4f 45 5f 44 65 66 61 75 6c 74 29 20 29 7b  ==OE_Default) ){
1ade0 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
1adf0 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
1ae00 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20  rse, .          
1ae10 20 20 20 20 20 20 22 63 6f 6e 66 6c 69 63 74 69        "conflicti
1ae20 6e 67 20 4f 4e 20 43 4f 4e 46 4c 49 43 54 20 63  ng ON CONFLICT c
1ae30 6c 61 75 73 65 73 20 73 70 65 63 69 66 69 65 64  lauses specified
1ae40 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20  ", 0);.         
1ae50 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28   }.          if(
1ae60 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d   pIdx->onError==
1ae70 4f 45 5f 44 65 66 61 75 6c 74 20 29 7b 0a 20 20  OE_Default ){.  
1ae80 20 20 20 20 20 20 20 20 20 20 70 49 64 78 2d 3e            pIdx->
1ae90 6f 6e 45 72 72 6f 72 20 3d 20 70 49 6e 64 65 78  onError = pIndex
1aea0 2d 3e 6f 6e 45 72 72 6f 72 3b 0a 20 20 20 20 20  ->onError;.     
1aeb0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
1aec0 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 64 78  .        if( idx
1aed0 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 49 44 58  Type==SQLITE_IDX
1aee0 54 59 50 45 5f 50 52 49 4d 41 52 59 4b 45 59 20  TYPE_PRIMARYKEY 
1aef0 29 20 70 49 64 78 2d 3e 69 64 78 54 79 70 65 20  ) pIdx->idxType 
1af00 3d 20 69 64 78 54 79 70 65 3b 0a 20 20 20 20 20  = idxType;.     
1af10 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65     goto exit_cre
1af20 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 20  ate_index;.     
1af30 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
1af40 2f 2a 20 4c 69 6e 6b 20 74 68 65 20 6e 65 77 20  /* Link the new 
1af50 49 6e 64 65 78 20 73 74 72 75 63 74 75 72 65 20  Index structure 
1af60 74 6f 20 69 74 73 20 74 61 62 6c 65 20 61 6e 64  to its table and
1af70 20 74 6f 20 74 68 65 20 6f 74 68 65 72 0a 20 20   to the other.  
1af80 2a 2a 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74  ** in-memory dat
1af90 61 62 61 73 65 20 73 74 72 75 63 74 75 72 65 73  abase structures
1afa0 2e 20 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  . .  */.  assert
1afb0 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d  ( pParse->nErr==
1afc0 30 20 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 69  0 );.  if( db->i
1afd0 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20 20 20 20  nit.busy ){.    
1afe0 49 6e 64 65 78 20 2a 70 3b 0a 20 20 20 20 61 73  Index *p;.    as
1aff0 73 65 72 74 28 20 21 49 4e 5f 44 45 43 4c 41 52  sert( !IN_DECLAR
1b000 45 5f 56 54 41 42 20 29 3b 0a 20 20 20 20 61 73  E_VTAB );.    as
1b010 73 65 72 74 28 20 73 71 6c 69 74 65 33 53 63 68  sert( sqlite3Sch
1b020 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c  emaMutexHeld(db,
1b030 20 30 2c 20 70 49 6e 64 65 78 2d 3e 70 53 63 68   0, pIndex->pSch
1b040 65 6d 61 29 20 29 3b 0a 20 20 20 20 70 20 3d 20  ema) );.    p = 
1b050 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72  sqlite3HashInser
1b060 74 28 26 70 49 6e 64 65 78 2d 3e 70 53 63 68 65  t(&pIndex->pSche
1b070 6d 61 2d 3e 69 64 78 48 61 73 68 2c 20 0a 20 20  ma->idxHash, .  
1b080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b090 20 20 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e          pIndex->
1b0a0 7a 4e 61 6d 65 2c 20 70 49 6e 64 65 78 29 3b 0a  zName, pIndex);.
1b0b0 20 20 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20      if( p ){.   
1b0c0 20 20 20 61 73 73 65 72 74 28 20 70 3d 3d 70 49     assert( p==pI
1b0d0 6e 64 65 78 20 29 3b 20 20 2f 2a 20 4d 61 6c 6c  ndex );  /* Mall
1b0e0 6f 63 20 6d 75 73 74 20 68 61 76 65 20 66 61 69  oc must have fai
1b0f0 6c 65 64 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c  led */.      sql
1b100 69 74 65 33 4f 6f 6d 46 61 75 6c 74 28 64 62 29  ite3OomFault(db)
1b110 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69  ;.      goto exi
1b120 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
1b130 20 20 20 20 7d 0a 20 20 20 20 64 62 2d 3e 66 6c      }.    db->fl
1b140 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 49 6e  ags |= SQLITE_In
1b150 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a 20 20 20  ternChanges;.   
1b160 20 69 66 28 20 70 54 62 6c 4e 61 6d 65 21 3d 30   if( pTblName!=0
1b170 20 29 7b 0a 20 20 20 20 20 20 70 49 6e 64 65 78   ){.      pIndex
1b180 2d 3e 74 6e 75 6d 20 3d 20 64 62 2d 3e 69 6e 69  ->tnum = db->ini
1b190 74 2e 6e 65 77 54 6e 75 6d 3b 0a 20 20 20 20 7d  t.newTnum;.    }
1b1a0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
1b1b0 69 73 20 69 73 20 74 68 65 20 69 6e 69 74 69 61  is is the initia
1b1c0 6c 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 73  l CREATE INDEX s
1b1d0 74 61 74 65 6d 65 6e 74 20 28 6f 72 20 43 52 45  tatement (or CRE
1b1e0 41 54 45 20 54 41 42 4c 45 20 69 66 20 74 68 65  ATE TABLE if the
1b1f0 0a 20 20 2a 2a 20 69 6e 64 65 78 20 69 73 20 61  .  ** index is a
1b200 6e 20 69 6d 70 6c 69 65 64 20 69 6e 64 65 78 20  n implied index 
1b210 66 6f 72 20 61 20 55 4e 49 51 55 45 20 6f 72 20  for a UNIQUE or 
1b220 50 52 49 4d 41 52 59 20 4b 45 59 20 63 6f 6e 73  PRIMARY KEY cons
1b230 74 72 61 69 6e 74 29 20 74 68 65 6e 0a 20 20 2a  traint) then.  *
1b240 2a 20 65 6d 69 74 20 63 6f 64 65 20 74 6f 20 61  * emit code to a
1b250 6c 6c 6f 63 61 74 65 20 74 68 65 20 69 6e 64 65  llocate the inde
1b260 78 20 72 6f 6f 74 70 61 67 65 20 6f 6e 20 64 69  x rootpage on di
1b270 73 6b 20 61 6e 64 20 6d 61 6b 65 20 61 6e 20 65  sk and make an e
1b280 6e 74 72 79 20 66 6f 72 0a 20 20 2a 2a 20 74 68  ntry for.  ** th
1b290 65 20 69 6e 64 65 78 20 69 6e 20 74 68 65 20 73  e index in the s
1b2a0 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62  qlite_master tab
1b2b0 6c 65 20 61 6e 64 20 70 6f 70 75 6c 61 74 65 20  le and populate 
1b2c0 74 68 65 20 69 6e 64 65 78 20 77 69 74 68 0a 20  the index with. 
1b2d0 20 2a 2a 20 63 6f 6e 74 65 6e 74 2e 20 20 42 75   ** content.  Bu
1b2e0 74 2c 20 64 6f 20 6e 6f 74 20 64 6f 20 74 68 69  t, do not do thi
1b2f0 73 20 69 66 20 77 65 20 61 72 65 20 73 69 6d 70  s if we are simp
1b300 6c 79 20 72 65 61 64 69 6e 67 20 74 68 65 20 73  ly reading the s
1b310 71 6c 69 74 65 5f 6d 61 73 74 65 72 0a 20 20 2a  qlite_master.  *
1b320 2a 20 74 61 62 6c 65 20 74 6f 20 70 61 72 73 65  * table to parse
1b330 20 74 68 65 20 73 63 68 65 6d 61 2c 20 6f 72 20   the schema, or 
1b340 69 66 20 74 68 69 73 20 69 6e 64 65 78 20 69 73  if this index is
1b350 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59   the PRIMARY KEY
1b360 20 69 6e 64 65 78 0a 20 20 2a 2a 20 6f 66 20 61   index.  ** of a
1b370 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 20 74   WITHOUT ROWID t
1b380 61 62 6c 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  able..  **.  ** 
1b390 49 66 20 70 54 62 6c 4e 61 6d 65 3d 3d 30 20 69  If pTblName==0 i
1b3a0 74 20 6d 65 61 6e 73 20 74 68 69 73 20 69 6e 64  t means this ind
1b3b0 65 78 20 69 73 20 67 65 6e 65 72 61 74 65 64 20  ex is generated 
1b3c0 61 73 20 61 6e 20 69 6d 70 6c 69 65 64 20 50 52  as an implied PR
1b3d0 49 4d 41 52 59 20 4b 45 59 0a 20 20 2a 2a 20 6f  IMARY KEY.  ** o
1b3e0 72 20 55 4e 49 51 55 45 20 69 6e 64 65 78 20 69  r UNIQUE index i
1b3f0 6e 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45  n a CREATE TABLE
1b400 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 53 69 6e   statement.  Sin
1b410 63 65 20 74 68 65 20 74 61 62 6c 65 0a 20 20 2a  ce the table.  *
1b420 2a 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20  * has just been 
1b430 63 72 65 61 74 65 64 2c 20 69 74 20 63 6f 6e 74  created, it cont
1b440 61 69 6e 73 20 6e 6f 20 64 61 74 61 20 61 6e 64  ains no data and
1b450 20 74 68 65 20 69 6e 64 65 78 20 69 6e 69 74 69   the index initi
1b460 61 6c 69 7a 61 74 69 6f 6e 0a 20 20 2a 2a 20 73  alization.  ** s
1b470 74 65 70 20 63 61 6e 20 62 65 20 73 6b 69 70 70  tep can be skipp
1b480 65 64 2e 0a 20 20 2a 2f 0a 20 20 65 6c 73 65 20  ed..  */.  else 
1b490 69 66 28 20 48 61 73 52 6f 77 69 64 28 70 54 61  if( HasRowid(pTa
1b4a0 62 29 20 7c 7c 20 70 54 62 6c 4e 61 6d 65 21 3d  b) || pTblName!=
1b4b0 30 20 29 7b 0a 20 20 20 20 56 64 62 65 20 2a 76  0 ){.    Vdbe *v
1b4c0 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 53 74 6d  ;.    char *zStm
1b4d0 74 3b 0a 20 20 20 20 69 6e 74 20 69 4d 65 6d 20  t;.    int iMem 
1b4e0 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
1b4f0 3b 0a 0a 20 20 20 20 76 20 3d 20 73 71 6c 69 74  ;..    v = sqlit
1b500 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
1b510 29 3b 0a 20 20 20 20 69 66 28 20 76 3d 3d 30 20  );.    if( v==0 
1b520 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61  ) goto exit_crea
1b530 74 65 5f 69 6e 64 65 78 3b 0a 0a 20 20 20 20 73  te_index;..    s
1b540 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74 65  qlite3BeginWrite
1b550 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65  Operation(pParse
1b560 2c 20 31 2c 20 69 44 62 29 3b 0a 0a 20 20 20 20  , 1, iDb);..    
1b570 2f 2a 20 43 72 65 61 74 65 20 74 68 65 20 72 6f  /* Create the ro
1b580 6f 74 70 61 67 65 20 66 6f 72 20 74 68 65 20 69  otpage for the i
1b590 6e 64 65 78 20 75 73 69 6e 67 20 43 72 65 61 74  ndex using Creat
1b5a0 65 49 6e 64 65 78 2e 20 42 75 74 20 62 65 66 6f  eIndex. But befo
1b5b0 72 65 0a 20 20 20 20 2a 2a 20 64 6f 69 6e 67 20  re.    ** doing 
1b5c0 73 6f 2c 20 63 6f 64 65 20 61 20 4e 6f 6f 70 20  so, code a Noop 
1b5d0 69 6e 73 74 72 75 63 74 69 6f 6e 20 61 6e 64 20  instruction and 
1b5e0 73 74 6f 72 65 20 69 74 73 20 61 64 64 72 65 73  store its addres
1b5f0 73 20 69 6e 20 0a 20 20 20 20 2a 2a 20 49 6e 64  s in .    ** Ind
1b600 65 78 2e 74 6e 75 6d 2e 20 54 68 69 73 20 69 73  ex.tnum. This is
1b610 20 72 65 71 75 69 72 65 64 20 69 6e 20 63 61 73   required in cas
1b620 65 20 74 68 69 73 20 69 6e 64 65 78 20 69 73 20  e this index is 
1b630 61 63 74 75 61 6c 6c 79 20 61 20 0a 20 20 20 20  actually a .    
1b640 2a 2a 20 50 52 49 4d 41 52 59 20 4b 45 59 20 61  ** PRIMARY KEY a
1b650 6e 64 20 74 68 65 20 74 61 62 6c 65 20 69 73 20  nd the table is 
1b660 61 63 74 75 61 6c 6c 79 20 61 20 57 49 54 48 4f  actually a WITHO
1b670 55 54 20 52 4f 57 49 44 20 74 61 62 6c 65 2e 20  UT ROWID table. 
1b680 49 6e 20 0a 20 20 20 20 2a 2a 20 74 68 61 74 20  In .    ** that 
1b690 63 61 73 65 20 74 68 65 20 63 6f 6e 76 65 72 74  case the convert
1b6a0 54 6f 57 69 74 68 6f 75 74 52 6f 77 69 64 54 61  ToWithoutRowidTa
1b6b0 62 6c 65 28 29 20 72 6f 75 74 69 6e 65 20 77 69  ble() routine wi
1b6c0 6c 6c 20 72 65 70 6c 61 63 65 0a 20 20 20 20 2a  ll replace.    *
1b6d0 2a 20 74 68 65 20 4e 6f 6f 70 20 77 69 74 68 20  * the Noop with 
1b6e0 61 20 47 6f 74 6f 20 74 6f 20 6a 75 6d 70 20 6f  a Goto to jump o
1b6f0 76 65 72 20 74 68 65 20 56 44 42 45 20 63 6f 64  ver the VDBE cod
1b700 65 20 67 65 6e 65 72 61 74 65 64 20 62 65 6c 6f  e generated belo
1b710 77 2e 20 2a 2f 0a 20 20 20 20 70 49 6e 64 65 78  w. */.    pIndex
1b720 2d 3e 74 6e 75 6d 20 3d 20 73 71 6c 69 74 65 33  ->tnum = sqlite3
1b730 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50  VdbeAddOp0(v, OP
1b740 5f 4e 6f 6f 70 29 3b 0a 20 20 20 20 73 71 6c 69  _Noop);.    sqli
1b750 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1b760 20 4f 50 5f 43 72 65 61 74 65 49 6e 64 65 78 2c   OP_CreateIndex,
1b770 20 69 44 62 2c 20 69 4d 65 6d 29 3b 0a 0a 20 20   iDb, iMem);..  
1b780 20 20 2f 2a 20 47 61 74 68 65 72 20 74 68 65 20    /* Gather the 
1b790 63 6f 6d 70 6c 65 74 65 20 74 65 78 74 20 6f 66  complete text of
1b7a0 20 74 68 65 20 43 52 45 41 54 45 20 49 4e 44 45   the CREATE INDE
1b7b0 58 20 73 74 61 74 65 6d 65 6e 74 20 69 6e 74 6f  X statement into
1b7c0 0a 20 20 20 20 2a 2a 20 74 68 65 20 7a 53 74 6d  .    ** the zStm
1b7d0 74 20 76 61 72 69 61 62 6c 65 0a 20 20 20 20 2a  t variable.    *
1b7e0 2f 0a 20 20 20 20 69 66 28 20 70 53 74 61 72 74  /.    if( pStart
1b7f0 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 20   ){.      int n 
1b800 3d 20 28 69 6e 74 29 28 70 50 61 72 73 65 2d 3e  = (int)(pParse->
1b810 73 4c 61 73 74 54 6f 6b 65 6e 2e 7a 20 2d 20 70  sLastToken.z - p
1b820 4e 61 6d 65 2d 3e 7a 29 20 2b 20 70 50 61 72 73  Name->z) + pPars
1b830 65 2d 3e 73 4c 61 73 74 54 6f 6b 65 6e 2e 6e 3b  e->sLastToken.n;
1b840 0a 20 20 20 20 20 20 69 66 28 20 70 4e 61 6d 65  .      if( pName
1b850 2d 3e 7a 5b 6e 2d 31 5d 3d 3d 27 3b 27 20 29 20  ->z[n-1]==';' ) 
1b860 6e 2d 2d 3b 0a 20 20 20 20 20 20 2f 2a 20 41 20  n--;.      /* A 
1b870 6e 61 6d 65 64 20 69 6e 64 65 78 20 77 69 74 68  named index with
1b880 20 61 6e 20 65 78 70 6c 69 63 69 74 20 43 52 45   an explicit CRE
1b890 41 54 45 20 49 4e 44 45 58 20 73 74 61 74 65 6d  ATE INDEX statem
1b8a0 65 6e 74 20 2a 2f 0a 20 20 20 20 20 20 7a 53 74  ent */.      zSt
1b8b0 6d 74 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69  mt = sqlite3MPri
1b8c0 6e 74 66 28 64 62 2c 20 22 43 52 45 41 54 45 25  ntf(db, "CREATE%
1b8d0 73 20 49 4e 44 45 58 20 25 2e 2a 73 22 2c 0a 20  s INDEX %.*s",. 
1b8e0 20 20 20 20 20 20 20 6f 6e 45 72 72 6f 72 3d 3d         onError==
1b8f0 4f 45 5f 4e 6f 6e 65 20 3f 20 22 22 20 3a 20 22  OE_None ? "" : "
1b900 20 55 4e 49 51 55 45 22 2c 20 6e 2c 20 70 4e 61   UNIQUE", n, pNa
1b910 6d 65 2d 3e 7a 29 3b 0a 20 20 20 20 7d 65 6c 73  me->z);.    }els
1b920 65 7b 0a 20 20 20 20 20 20 2f 2a 20 41 6e 20 61  e{.      /* An a
1b930 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 63  utomatic index c
1b940 72 65 61 74 65 64 20 62 79 20 61 20 50 52 49 4d  reated by a PRIM
1b950 41 52 59 20 4b 45 59 20 6f 72 20 55 4e 49 51 55  ARY KEY or UNIQU
1b960 45 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a  E constraint */.
1b970 20 20 20 20 20 20 2f 2a 20 7a 53 74 6d 74 20 3d        /* zStmt =
1b980 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
1b990 22 22 29 3b 20 2a 2f 0a 20 20 20 20 20 20 7a 53  ""); */.      zS
1b9a0 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a  tmt = 0;.    }..
1b9b0 20 20 20 20 2f 2a 20 41 64 64 20 61 6e 20 65 6e      /* Add an en
1b9c0 74 72 79 20 69 6e 20 73 71 6c 69 74 65 5f 6d 61  try in sqlite_ma
1b9d0 73 74 65 72 20 66 6f 72 20 74 68 69 73 20 69 6e  ster for this in
1b9e0 64 65 78 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73  dex.    */.    s
1b9f0 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72 73  qlite3NestedPars
1ba00 65 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20  e(pParse, .     
1ba10 20 20 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20     "INSERT INTO 
1ba20 25 51 2e 25 73 20 56 41 4c 55 45 53 28 27 69 6e  %Q.%s VALUES('in
1ba30 64 65 78 27 2c 25 51 2c 25 51 2c 23 25 64 2c 25  dex',%Q,%Q,#%d,%
1ba40 51 29 3b 22 2c 0a 20 20 20 20 20 20 20 20 64 62  Q);",.        db
1ba50 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65  ->aDb[iDb].zName
1ba60 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69  , SCHEMA_TABLE(i
1ba70 44 62 29 2c 0a 20 20 20 20 20 20 20 20 70 49 6e  Db),.        pIn
1ba80 64 65 78 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20  dex->zName,.    
1ba90 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c      pTab->zName,
1baa0 0a 20 20 20 20 20 20 20 20 69 4d 65 6d 2c 0a 20  .        iMem,. 
1bab0 20 20 20 20 20 20 20 7a 53 74 6d 74 0a 20 20 20         zStmt.   
1bac0 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44   );.    sqlite3D
1bad0 62 46 72 65 65 28 64 62 2c 20 7a 53 74 6d 74 29  bFree(db, zStmt)
1bae0 3b 0a 0a 20 20 20 20 2f 2a 20 46 69 6c 6c 20 74  ;..    /* Fill t
1baf0 68 65 20 69 6e 64 65 78 20 77 69 74 68 20 64 61  he index with da
1bb00 74 61 20 61 6e 64 20 72 65 70 61 72 73 65 20 74  ta and reparse t
1bb10 68 65 20 73 63 68 65 6d 61 2e 20 43 6f 64 65 20  he schema. Code 
1bb20 61 6e 20 4f 50 5f 45 78 70 69 72 65 0a 20 20 20  an OP_Expire.   
1bb30 20 2a 2a 20 74 6f 20 69 6e 76 61 6c 69 64 61 74   ** to invalidat
1bb40 65 20 61 6c 6c 20 70 72 65 2d 63 6f 6d 70 69 6c  e all pre-compil
1bb50 65 64 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 20  ed statements.. 
1bb60 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 54     */.    if( pT
1bb70 62 6c 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20  blName ){.      
1bb80 73 71 6c 69 74 65 33 52 65 66 69 6c 6c 49 6e 64  sqlite3RefillInd
1bb90 65 78 28 70 50 61 72 73 65 2c 20 70 49 6e 64 65  ex(pParse, pInde
1bba0 78 2c 20 69 4d 65 6d 29 3b 0a 20 20 20 20 20 20  x, iMem);.      
1bbb0 73 71 6c 69 74 65 33 43 68 61 6e 67 65 43 6f 6f  sqlite3ChangeCoo
1bbc0 6b 69 65 28 70 50 61 72 73 65 2c 20 69 44 62 29  kie(pParse, iDb)
1bbd0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
1bbe0 64 62 65 41 64 64 50 61 72 73 65 53 63 68 65 6d  dbeAddParseSchem
1bbf0 61 4f 70 28 76 2c 20 69 44 62 2c 0a 20 20 20 20  aOp(v, iDb,.    
1bc00 20 20 20 20 20 73 71 6c 69 74 65 33 4d 50 72 69       sqlite3MPri
1bc10 6e 74 66 28 64 62 2c 20 22 6e 61 6d 65 3d 27 25  ntf(db, "name='%
1bc20 71 27 20 41 4e 44 20 74 79 70 65 3d 27 69 6e 64  q' AND type='ind
1bc30 65 78 27 22 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e  ex'", pIndex->zN
1bc40 61 6d 65 29 29 3b 0a 20 20 20 20 20 20 73 71 6c  ame));.      sql
1bc50 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 28 76  ite3VdbeAddOp0(v
1bc60 2c 20 4f 50 5f 45 78 70 69 72 65 29 3b 0a 20 20  , OP_Expire);.  
1bc70 20 20 7d 0a 0a 20 20 20 20 73 71 6c 69 74 65 33    }..    sqlite3
1bc80 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
1bc90 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 29 3b 0a 20  pIndex->tnum);. 
1bca0 20 7d 0a 0a 20 20 2f 2a 20 57 68 65 6e 20 61 64   }..  /* When ad
1bcb0 64 69 6e 67 20 61 6e 20 69 6e 64 65 78 20 74 6f  ding an index to
1bcc0 20 74 68 65 20 6c 69 73 74 20 6f 66 20 69 6e 64   the list of ind
1bcd0 69 63 65 73 20 66 6f 72 20 61 20 74 61 62 6c 65  ices for a table
1bce0 2c 20 6d 61 6b 65 0a 20 20 2a 2a 20 73 75 72 65  , make.  ** sure
1bcf0 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 6c 61 62   all indices lab
1bd00 65 6c 65 64 20 4f 45 5f 52 65 70 6c 61 63 65 20  eled OE_Replace 
1bd10 63 6f 6d 65 20 61 66 74 65 72 20 61 6c 6c 20 74  come after all t
1bd20 68 6f 73 65 20 6c 61 62 65 6c 65 64 0a 20 20 2a  hose labeled.  *
1bd30 2a 20 4f 45 5f 49 67 6e 6f 72 65 2e 20 20 54 68  * OE_Ignore.  Th
1bd40 69 73 20 69 73 20 6e 65 63 65 73 73 61 72 79 20  is is necessary 
1bd50 66 6f 72 20 74 68 65 20 63 6f 72 72 65 63 74 20  for the correct 
1bd60 63 6f 6e 73 74 72 61 69 6e 74 20 63 68 65 63 6b  constraint check
1bd70 0a 20 20 2a 2a 20 70 72 6f 63 65 73 73 69 6e 67  .  ** processing
1bd80 20 28 69 6e 20 73 71 6c 69 74 65 33 47 65 6e 65   (in sqlite3Gene
1bd90 72 61 74 65 43 6f 6e 73 74 72 61 69 6e 74 43 68  rateConstraintCh
1bda0 65 63 6b 73 28 29 29 20 61 73 20 70 61 72 74 20  ecks()) as part 
1bdb0 6f 66 0a 20 20 2a 2a 20 55 50 44 41 54 45 20 61  of.  ** UPDATE a
1bdc0 6e 64 20 49 4e 53 45 52 54 20 73 74 61 74 65 6d  nd INSERT statem
1bdd0 65 6e 74 73 2e 20 20 0a 20 20 2a 2f 0a 20 20 69  ents.  .  */.  i
1bde0 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  f( db->init.busy
1bdf0 20 7c 7c 20 70 54 62 6c 4e 61 6d 65 3d 3d 30 20   || pTblName==0 
1be00 29 7b 0a 20 20 20 20 69 66 28 20 6f 6e 45 72 72  ){.    if( onErr
1be10 6f 72 21 3d 4f 45 5f 52 65 70 6c 61 63 65 20 7c  or!=OE_Replace |
1be20 7c 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 3d 3d  | pTab->pIndex==
1be30 30 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70 54  0.         || pT
1be40 61 62 2d 3e 70 49 6e 64 65 78 2d 3e 6f 6e 45 72  ab->pIndex->onEr
1be50 72 6f 72 3d 3d 4f 45 5f 52 65 70 6c 61 63 65 29  ror==OE_Replace)
1be60 7b 0a 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e  {.      pIndex->
1be70 70 4e 65 78 74 20 3d 20 70 54 61 62 2d 3e 70 49  pNext = pTab->pI
1be80 6e 64 65 78 3b 0a 20 20 20 20 20 20 70 54 61 62  ndex;.      pTab
1be90 2d 3e 70 49 6e 64 65 78 20 3d 20 70 49 6e 64 65  ->pIndex = pInde
1bea0 78 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  x;.    }else{.  
1beb0 20 20 20 20 49 6e 64 65 78 20 2a 70 4f 74 68 65      Index *pOthe
1bec0 72 20 3d 20 70 54 61 62 2d 3e 70 49 6e 64 65 78  r = pTab->pIndex
1bed0 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 70  ;.      while( p
1bee0 4f 74 68 65 72 2d 3e 70 4e 65 78 74 20 26 26 20  Other->pNext && 
1bef0 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74 2d 3e 6f  pOther->pNext->o
1bf00 6e 45 72 72 6f 72 21 3d 4f 45 5f 52 65 70 6c 61  nError!=OE_Repla
1bf10 63 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4f  ce ){.        pO
1bf20 74 68 65 72 20 3d 20 70 4f 74 68 65 72 2d 3e 70  ther = pOther->p
1bf30 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Next;.      }.  
1bf40 20 20 20 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78      pIndex->pNex
1bf50 74 20 3d 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78  t = pOther->pNex
1bf60 74 3b 0a 20 20 20 20 20 20 70 4f 74 68 65 72 2d  t;.      pOther-
1bf70 3e 70 4e 65 78 74 20 3d 20 70 49 6e 64 65 78 3b  >pNext = pIndex;
1bf80 0a 20 20 20 20 7d 0a 20 20 20 20 70 49 6e 64 65  .    }.    pInde
1bf90 78 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  x = 0;.  }..  /*
1bfa0 20 43 6c 65 61 6e 20 75 70 20 62 65 66 6f 72 65   Clean up before
1bfb0 20 65 78 69 74 69 6e 67 20 2a 2f 0a 65 78 69 74   exiting */.exit
1bfc0 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3a 0a 20  _create_index:. 
1bfd0 20 69 66 28 20 70 49 6e 64 65 78 20 29 20 66 72   if( pIndex ) fr
1bfe0 65 65 49 6e 64 65 78 28 64 62 2c 20 70 49 6e 64  eeIndex(db, pInd
1bff0 65 78 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78  ex);.  sqlite3Ex
1c000 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 50 49  prDelete(db, pPI
1c010 57 68 65 72 65 29 3b 0a 20 20 73 71 6c 69 74 65  Where);.  sqlite
1c020 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
1c030 64 62 2c 20 70 4c 69 73 74 29 3b 0a 20 20 73 71  db, pList);.  sq
1c040 6c 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65  lite3SrcListDele
1c050 74 65 28 64 62 2c 20 70 54 62 6c 4e 61 6d 65 29  te(db, pTblName)
1c060 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  ;.  sqlite3DbFre
1c070 65 28 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 7d 0a  e(db, zName);.}.
1c080 0a 2f 2a 0a 2a 2a 20 46 69 6c 6c 20 74 68 65 20  ./*.** Fill the 
1c090 49 6e 64 65 78 2e 61 69 52 6f 77 45 73 74 5b 5d  Index.aiRowEst[]
1c0a0 20 61 72 72 61 79 20 77 69 74 68 20 64 65 66 61   array with defa
1c0b0 75 6c 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ult information 
1c0c0 2d 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a  - information.**
1c0d0 20 74 6f 20 62 65 20 75 73 65 64 20 77 68 65 6e   to be used when
1c0e0 20 77 65 20 68 61 76 65 20 6e 6f 74 20 72 75 6e   we have not run
1c0f0 20 74 68 65 20 41 4e 41 4c 59 5a 45 20 63 6f 6d   the ANALYZE com
1c100 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 61 69 52 6f  mand..**.** aiRo
1c110 77 45 73 74 5b 30 5d 20 69 73 20 73 75 70 70 6f  wEst[0] is suppo
1c120 73 65 64 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74  sed to contain t
1c130 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6c 65  he number of ele
1c140 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 69 6e 64  ments in the ind
1c150 65 78 2e 0a 2a 2a 20 53 69 6e 63 65 20 77 65 20  ex..** Since we 
1c160 64 6f 20 6e 6f 74 20 6b 6e 6f 77 2c 20 67 75 65  do not know, gue
1c170 73 73 20 31 20 6d 69 6c 6c 69 6f 6e 2e 20 20 61  ss 1 million.  a
1c180 69 52 6f 77 45 73 74 5b 31 5d 20 69 73 20 61 6e  iRowEst[1] is an
1c190 20 65 73 74 69 6d 61 74 65 20 6f 66 20 74 68 65   estimate of the
1c1a0 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f  .** number of ro
1c1b0 77 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20  ws in the table 
1c1c0 74 68 61 74 20 6d 61 74 63 68 20 61 6e 79 20 70  that match any p
1c1d0 61 72 74 69 63 75 6c 61 72 20 76 61 6c 75 65 20  articular value 
1c1e0 6f 66 20 74 68 65 0a 2a 2a 20 66 69 72 73 74 20  of the.** first 
1c1f0 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 69 6e  column of the in
1c200 64 65 78 2e 20 20 61 69 52 6f 77 45 73 74 5b 32  dex.  aiRowEst[2
1c210 5d 20 69 73 20 61 6e 20 65 73 74 69 6d 61 74 65  ] is an estimate
1c220 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 0a 2a   of the number.*
1c230 2a 20 6f 66 20 72 6f 77 73 20 74 68 61 74 20 6d  * of rows that m
1c240 61 74 63 68 20 61 6e 79 20 70 61 72 74 69 63 75  atch any particu
1c250 6c 61 72 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20  lar combination 
1c260 6f 66 20 74 68 65 20 66 69 72 73 74 20 32 20 63  of the first 2 c
1c270 6f 6c 75 6d 6e 73 0a 2a 2a 20 6f 66 20 74 68 65  olumns.** of the
1c280 20 69 6e 64 65 78 2e 20 20 41 6e 64 20 73 6f 20   index.  And so 
1c290 66 6f 72 74 68 2e 20 20 49 74 20 6d 75 73 74 20  forth.  It must 
1c2a0 61 6c 77 61 79 73 20 62 65 20 74 68 65 20 63 61  always be the ca
1c2b0 73 65 20 74 68 61 74 0a 2a 0a 2a 2a 20 20 20 20  se that.*.**    
1c2c0 20 20 20 20 20 20 20 61 69 52 6f 77 45 73 74 5b         aiRowEst[
1c2d0 4e 5d 3c 3d 61 69 52 6f 77 45 73 74 5b 4e 2d 31  N]<=aiRowEst[N-1
1c2e0 5d 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 61  ].**           a
1c2f0 69 52 6f 77 45 73 74 5b 4e 5d 3e 3d 31 0a 2a 2a  iRowEst[N]>=1.**
1c300 0a 2a 2a 20 41 70 61 72 74 20 66 72 6f 6d 20 74  .** Apart from t
1c310 68 61 74 2c 20 77 65 20 68 61 76 65 20 6c 69 74  hat, we have lit
1c320 74 6c 65 20 74 6f 20 67 6f 20 6f 6e 20 62 65 73  tle to go on bes
1c330 69 64 65 73 20 69 6e 74 75 69 74 69 6f 6e 20 61  ides intuition a
1c340 73 20 74 6f 0a 2a 2a 20 68 6f 77 20 61 69 52 6f  s to.** how aiRo
1c350 77 45 73 74 5b 5d 20 73 68 6f 75 6c 64 20 62 65  wEst[] should be
1c360 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 20 20 54   initialized.  T
1c370 68 65 20 6e 75 6d 62 65 72 73 20 67 65 6e 65 72  he numbers gener
1c380 61 74 65 64 20 68 65 72 65 0a 2a 2a 20 61 72 65  ated here.** are
1c390 20 62 61 73 65 64 20 6f 6e 20 74 79 70 69 63 61   based on typica
1c3a0 6c 20 76 61 6c 75 65 73 20 66 6f 75 6e 64 20 69  l values found i
1c3b0 6e 20 61 63 74 75 61 6c 20 69 6e 64 69 63 65 73  n actual indices
1c3c0 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
1c3d0 33 44 65 66 61 75 6c 74 52 6f 77 45 73 74 28 49  3DefaultRowEst(I
1c3e0 6e 64 65 78 20 2a 70 49 64 78 29 7b 0a 20 20 2f  ndex *pIdx){.  /
1c3f0 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
1c400 20 31 30 2c 20 20 39 2c 20 20 38 2c 20 20 37 2c   10,  9,  8,  7,
1c410 20 20 36 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20    6 */.  LogEst 
1c420 61 56 61 6c 5b 5d 20 3d 20 7b 20 33 33 2c 20 33  aVal[] = { 33, 3
1c430 32 2c 20 33 30 2c 20 32 38 2c 20 32 36 20 7d 3b  2, 30, 28, 26 };
1c440 0a 20 20 4c 6f 67 45 73 74 20 2a 61 20 3d 20 70  .  LogEst *a = p
1c450 49 64 78 2d 3e 61 69 52 6f 77 4c 6f 67 45 73 74  Idx->aiRowLogEst
1c460 3b 0a 20 20 69 6e 74 20 6e 43 6f 70 79 20 3d 20  ;.  int nCopy = 
1c470 4d 49 4e 28 41 72 72 61 79 53 69 7a 65 28 61 56  MIN(ArraySize(aV
1c480 61 6c 29 2c 20 70 49 64 78 2d 3e 6e 4b 65 79 43  al), pIdx->nKeyC
1c490 6f 6c 29 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20  ol);.  int i;.. 
1c4a0 20 2f 2a 20 53 65 74 20 74 68 65 20 66 69 72 73   /* Set the firs
1c4b0 74 20 65 6e 74 72 79 20 28 6e 75 6d 62 65 72 20  t entry (number 
1c4c0 6f 66 20 72 6f 77 73 20 69 6e 20 74 68 65 20 69  of rows in the i
1c4d0 6e 64 65 78 29 20 74 6f 20 74 68 65 20 65 73 74  ndex) to the est
1c4e0 69 6d 61 74 65 64 20 0a 20 20 2a 2a 20 6e 75 6d  imated .  ** num
1c4f0 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74  ber of rows in t
1c500 68 65 20 74 61 62 6c 65 2c 20 6f 72 20 68 61 6c  he table, or hal
1c510 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  f the number of 
1c520 72 6f 77 73 20 69 6e 20 74 68 65 20 74 61 62 6c  rows in the tabl
1c530 65 0a 20 20 2a 2a 20 66 6f 72 20 61 20 70 61 72  e.  ** for a par
1c540 74 69 61 6c 20 69 6e 64 65 78 2e 20 20 20 42 75  tial index.   Bu
1c550 74 20 64 6f 20 6e 6f 74 20 6c 65 74 20 74 68 65  t do not let the
1c560 20 65 73 74 69 6d 61 74 65 20 64 72 6f 70 20 62   estimate drop b
1c570 65 6c 6f 77 20 31 30 2e 20 2a 2f 0a 20 20 61 5b  elow 10. */.  a[
1c580 30 5d 20 3d 20 70 49 64 78 2d 3e 70 54 61 62 6c  0] = pIdx->pTabl
1c590 65 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74 3b 0a 20  e->nRowLogEst;. 
1c5a0 20 69 66 28 20 70 49 64 78 2d 3e 70 50 61 72 74   if( pIdx->pPart
1c5b0 49 64 78 57 68 65 72 65 21 3d 30 20 29 20 61 5b  IdxWhere!=0 ) a[
1c5c0 30 5d 20 2d 3d 20 31 30 3b 20 20 61 73 73 65 72  0] -= 10;  asser
1c5d0 74 28 20 31 30 3d 3d 73 71 6c 69 74 65 33 4c 6f  t( 10==sqlite3Lo
1c5e0 67 45 73 74 28 32 29 20 29 3b 0a 20 20 69 66 28  gEst(2) );.  if(
1c5f0 20 61 5b 30 5d 3c 33 33 20 29 20 61 5b 30 5d 20   a[0]<33 ) a[0] 
1c600 3d 20 33 33 3b 20 20 20 20 20 20 20 20 20 20 20  = 33;           
1c610 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 33         assert( 3
1c620 33 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74  3==sqlite3LogEst
1c630 28 31 30 29 20 29 3b 0a 0a 20 20 2f 2a 20 45 73  (10) );..  /* Es
1c640 74 69 6d 61 74 65 20 74 68 61 74 20 61 5b 31 5d  timate that a[1]
1c650 20 69 73 20 31 30 2c 20 61 5b 32 5d 20 69 73 20   is 10, a[2] is 
1c660 39 2c 20 61 5b 33 5d 20 69 73 20 38 2c 20 61 5b  9, a[3] is 8, a[
1c670 34 5d 20 69 73 20 37 2c 20 61 5b 35 5d 20 69 73  4] is 7, a[5] is
1c680 0a 20 20 2a 2a 20 36 20 61 6e 64 20 65 61 63 68  .  ** 6 and each
1c690 20 73 75 62 73 65 71 75 65 6e 74 20 76 61 6c 75   subsequent valu
1c6a0 65 20 28 69 66 20 61 6e 79 29 20 69 73 20 35 2e  e (if any) is 5.
1c6b0 20 20 2a 2f 0a 20 20 6d 65 6d 63 70 79 28 26 61    */.  memcpy(&a
1c6c0 5b 31 5d 2c 20 61 56 61 6c 2c 20 6e 43 6f 70 79  [1], aVal, nCopy
1c6d0 2a 73 69 7a 65 6f 66 28 4c 6f 67 45 73 74 29 29  *sizeof(LogEst))
1c6e0 3b 0a 20 20 66 6f 72 28 69 3d 6e 43 6f 70 79 2b  ;.  for(i=nCopy+
1c6f0 31 3b 20 69 3c 3d 70 49 64 78 2d 3e 6e 4b 65 79  1; i<=pIdx->nKey
1c700 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 61  Col; i++){.    a
1c710 5b 69 5d 20 3d 20 32 33 3b 20 20 20 20 20 20 20  [i] = 23;       
1c720 20 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73               ass
1c730 65 72 74 28 20 32 33 3d 3d 73 71 6c 69 74 65 33  ert( 23==sqlite3
1c740 4c 6f 67 45 73 74 28 35 29 20 29 3b 0a 20 20 7d  LogEst(5) );.  }
1c750 0a 0a 20 20 61 73 73 65 72 74 28 20 30 3d 3d 73  ..  assert( 0==s
1c760 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 31 29 20  qlite3LogEst(1) 
1c770 29 3b 0a 20 20 69 66 28 20 49 73 55 6e 69 71 75  );.  if( IsUniqu
1c780 65 49 6e 64 65 78 28 70 49 64 78 29 20 29 20 61  eIndex(pIdx) ) a
1c790 5b 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 5d 20  [pIdx->nKeyCol] 
1c7a0 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  = 0;.}../*.** Th
1c7b0 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20  is routine will 
1c7c0 64 72 6f 70 20 61 6e 20 65 78 69 73 74 69 6e 67  drop an existing
1c7d0 20 6e 61 6d 65 64 20 69 6e 64 65 78 2e 20 20 54   named index.  T
1c7e0 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69  his routine.** i
1c7f0 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 44 52  mplements the DR
1c800 4f 50 20 49 4e 44 45 58 20 73 74 61 74 65 6d 65  OP INDEX stateme
1c810 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  nt..*/.void sqli
1c820 74 65 33 44 72 6f 70 49 6e 64 65 78 28 50 61 72  te3DropIndex(Par
1c830 73 65 20 2a 70 50 61 72 73 65 2c 20 53 72 63 4c  se *pParse, SrcL
1c840 69 73 74 20 2a 70 4e 61 6d 65 2c 20 69 6e 74 20  ist *pName, int 
1c850 69 66 45 78 69 73 74 73 29 7b 0a 20 20 49 6e 64  ifExists){.  Ind
1c860 65 78 20 2a 70 49 6e 64 65 78 3b 0a 20 20 56 64  ex *pIndex;.  Vd
1c870 62 65 20 2a 76 3b 0a 20 20 73 71 6c 69 74 65 33  be *v;.  sqlite3
1c880 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
1c890 62 3b 0a 20 20 69 6e 74 20 69 44 62 3b 0a 0a 20  b;.  int iDb;.. 
1c8a0 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d   assert( pParse-
1c8b0 3e 6e 45 72 72 3d 3d 30 20 29 3b 20 20 20 2f 2a  >nErr==0 );   /*
1c8c0 20 4e 65 76 65 72 20 63 61 6c 6c 65 64 20 77 69   Never called wi
1c8d0 74 68 20 70 72 69 6f 72 20 65 72 72 6f 72 73 20  th prior errors 
1c8e0 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  */.  if( db->mal
1c8f0 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
1c900 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f   goto exit_drop_
1c910 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 61 73 73  index;.  }.  ass
1c920 65 72 74 28 20 70 4e 61 6d 65 2d 3e 6e 53 72 63  ert( pName->nSrc
1c930 3d 3d 31 20 29 3b 0a 20 20 69 66 28 20 53 51 4c  ==1 );.  if( SQL
1c940 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52  ITE_OK!=sqlite3R
1c950 65 61 64 53 63 68 65 6d 61 28 70 50 61 72 73 65  eadSchema(pParse
1c960 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78  ) ){.    goto ex
1c970 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20  it_drop_index;. 
1c980 20 7d 0a 20 20 70 49 6e 64 65 78 20 3d 20 73 71   }.  pIndex = sq
1c990 6c 69 74 65 33 46 69 6e 64 49 6e 64 65 78 28 64  lite3FindIndex(d
1c9a0 62 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a  b, pName->a[0].z
1c9b0 4e 61 6d 65 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30  Name, pName->a[0
1c9c0 5d 2e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20  ].zDatabase);.  
1c9d0 69 66 28 20 70 49 6e 64 65 78 3d 3d 30 20 29 7b  if( pIndex==0 ){
1c9e0 0a 20 20 20 20 69 66 28 20 21 69 66 45 78 69 73  .    if( !ifExis
1c9f0 74 73 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ts ){.      sqli
1ca00 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
1ca10 73 65 2c 20 22 6e 6f 20 73 75 63 68 20 69 6e 64  se, "no such ind
1ca20 65 78 3a 20 25 53 22 2c 20 70 4e 61 6d 65 2c 20  ex: %S", pName, 
1ca30 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  0);.    }else{. 
1ca40 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65       sqlite3Code
1ca50 56 65 72 69 66 79 4e 61 6d 65 64 53 63 68 65 6d  VerifyNamedSchem
1ca60 61 28 70 50 61 72 73 65 2c 20 70 4e 61 6d 65 2d  a(pParse, pName-
1ca70 3e 61 5b 30 5d 2e 7a 44 61 74 61 62 61 73 65 29  >a[0].zDatabase)
1ca80 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 72  ;.    }.    pPar
1ca90 73 65 2d 3e 63 68 65 63 6b 53 63 68 65 6d 61 20  se->checkSchema 
1caa0 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78  = 1;.    goto ex
1cab0 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20  it_drop_index;. 
1cac0 20 7d 0a 20 20 69 66 28 20 70 49 6e 64 65 78 2d   }.  if( pIndex-
1cad0 3e 69 64 78 54 79 70 65 21 3d 53 51 4c 49 54 45  >idxType!=SQLITE
1cae0 5f 49 44 58 54 59 50 45 5f 41 50 50 44 45 46 20  _IDXTYPE_APPDEF 
1caf0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
1cb00 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
1cb10 69 6e 64 65 78 20 61 73 73 6f 63 69 61 74 65 64  index associated
1cb20 20 77 69 74 68 20 55 4e 49 51 55 45 20 22 0a 20   with UNIQUE ". 
1cb30 20 20 20 20 20 22 6f 72 20 50 52 49 4d 41 52 59       "or PRIMARY
1cb40 20 4b 45 59 20 63 6f 6e 73 74 72 61 69 6e 74 20   KEY constraint 
1cb50 63 61 6e 6e 6f 74 20 62 65 20 64 72 6f 70 70 65  cannot be droppe
1cb60 64 22 2c 20 30 29 3b 0a 20 20 20 20 67 6f 74 6f  d", 0);.    goto
1cb70 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78   exit_drop_index
1cb80 3b 0a 20 20 7d 0a 20 20 69 44 62 20 3d 20 73 71  ;.  }.  iDb = sq
1cb90 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64  lite3SchemaToInd
1cba0 65 78 28 64 62 2c 20 70 49 6e 64 65 78 2d 3e 70  ex(db, pIndex->p
1cbb0 53 63 68 65 6d 61 29 3b 0a 23 69 66 6e 64 65 66  Schema);.#ifndef
1cbc0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
1cbd0 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 7b 0a 20  HORIZATION.  {. 
1cbe0 20 20 20 69 6e 74 20 63 6f 64 65 20 3d 20 53 51     int code = SQ
1cbf0 4c 49 54 45 5f 44 52 4f 50 5f 49 4e 44 45 58 3b  LITE_DROP_INDEX;
1cc00 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62  .    Table *pTab
1cc10 20 3d 20 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c   = pIndex->pTabl
1cc20 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  e;.    const cha
1cc30 72 20 2a 7a 44 62 20 3d 20 64 62 2d 3e 61 44 62  r *zDb = db->aDb
1cc40 5b 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20  [iDb].zName;.   
1cc50 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61   const char *zTa
1cc60 62 20 3d 20 53 43 48 45 4d 41 5f 54 41 42 4c 45  b = SCHEMA_TABLE
1cc70 28 69 44 62 29 3b 0a 20 20 20 20 69 66 28 20 73  (iDb);.    if( s
1cc80 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28  qlite3AuthCheck(
1cc90 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 44  pParse, SQLITE_D
1cca0 45 4c 45 54 45 2c 20 7a 54 61 62 2c 20 30 2c 20  ELETE, zTab, 0, 
1ccb0 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f  zDb) ){.      go
1ccc0 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64  to exit_drop_ind
1ccd0 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ex;.    }.    if
1cce0 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26  ( !OMIT_TEMPDB &
1ccf0 26 20 69 44 62 20 29 20 63 6f 64 65 20 3d 20 53  & iDb ) code = S
1cd00 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f  QLITE_DROP_TEMP_
1cd10 49 4e 44 45 58 3b 0a 20 20 20 20 69 66 28 20 73  INDEX;.    if( s
1cd20 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28  qlite3AuthCheck(
1cd30 70 50 61 72 73 65 2c 20 63 6f 64 65 2c 20 70 49  pParse, code, pI
1cd40 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 70 54 61  ndex->zName, pTa
1cd50 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 44 62 29 20 29  b->zName, zDb) )
1cd60 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69  {.      goto exi
1cd70 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20  t_drop_index;.  
1cd80 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a    }.  }.#endif..
1cd90 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f    /* Generate co
1cda0 64 65 20 74 6f 20 72 65 6d 6f 76 65 20 74 68 65  de to remove the
1cdb0 20 69 6e 64 65 78 20 61 6e 64 20 66 72 6f 6d 20   index and from 
1cdc0 74 68 65 20 6d 61 73 74 65 72 20 74 61 62 6c 65  the master table
1cdd0 20 2a 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74 65   */.  v = sqlite
1cde0 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
1cdf0 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20  ;.  if( v ){.   
1ce00 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69   sqlite3BeginWri
1ce10 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72  teOperation(pPar
1ce20 73 65 2c 20 31 2c 20 69 44 62 29 3b 0a 20 20 20  se, 1, iDb);.   
1ce30 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61   sqlite3NestedPa
1ce40 72 73 65 28 70 50 61 72 73 65 2c 0a 20 20 20 20  rse(pParse,.    
1ce50 20 20 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20     "DELETE FROM 
1ce60 25 51 2e 25 73 20 57 48 45 52 45 20 6e 61 6d 65  %Q.%s WHERE name
1ce70 3d 25 51 20 41 4e 44 20 74 79 70 65 3d 27 69 6e  =%Q AND type='in
1ce80 64 65 78 27 22 2c 0a 20 20 20 20 20 20 20 64 62  dex'",.       db
1ce90 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65  ->aDb[iDb].zName
1cea0 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69  , SCHEMA_TABLE(i
1ceb0 44 62 29 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61  Db), pIndex->zNa
1cec0 6d 65 0a 20 20 20 20 29 3b 0a 20 20 20 20 73 71  me.    );.    sq
1ced0 6c 69 74 65 33 43 6c 65 61 72 53 74 61 74 54 61  lite3ClearStatTa
1cee0 62 6c 65 73 28 70 50 61 72 73 65 2c 20 69 44 62  bles(pParse, iDb
1cef0 2c 20 22 69 64 78 22 2c 20 70 49 6e 64 65 78 2d  , "idx", pIndex-
1cf00 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c  >zName);.    sql
1cf10 69 74 65 33 43 68 61 6e 67 65 43 6f 6f 6b 69 65  ite3ChangeCookie
1cf20 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20  (pParse, iDb);. 
1cf30 20 20 20 64 65 73 74 72 6f 79 52 6f 6f 74 50 61     destroyRootPa
1cf40 67 65 28 70 50 61 72 73 65 2c 20 70 49 6e 64 65  ge(pParse, pInde
1cf50 78 2d 3e 74 6e 75 6d 2c 20 69 44 62 29 3b 0a 20  x->tnum, iDb);. 
1cf60 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1cf70 64 4f 70 34 28 76 2c 20 4f 50 5f 44 72 6f 70 49  dOp4(v, OP_DropI
1cf80 6e 64 65 78 2c 20 69 44 62 2c 20 30 2c 20 30 2c  ndex, iDb, 0, 0,
1cf90 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20   pIndex->zName, 
1cfa0 30 29 3b 0a 20 20 7d 0a 0a 65 78 69 74 5f 64 72  0);.  }..exit_dr
1cfb0 6f 70 5f 69 6e 64 65 78 3a 0a 20 20 73 71 6c 69  op_index:.  sqli
1cfc0 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65  te3SrcListDelete
1cfd0 28 64 62 2c 20 70 4e 61 6d 65 29 3b 0a 7d 0a 0a  (db, pName);.}..
1cfe0 2f 2a 0a 2a 2a 20 70 41 72 72 61 79 20 69 73 20  /*.** pArray is 
1cff0 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20  a pointer to an 
1d000 61 72 72 61 79 20 6f 66 20 6f 62 6a 65 63 74 73  array of objects
1d010 2e 20 45 61 63 68 20 6f 62 6a 65 63 74 20 69 6e  . Each object in
1d020 20 74 68 65 0a 2a 2a 20 61 72 72 61 79 20 69 73   the.** array is
1d030 20 73 7a 45 6e 74 72 79 20 62 79 74 65 73 20 69   szEntry bytes i
1d040 6e 20 73 69 7a 65 2e 20 54 68 69 73 20 72 6f 75  n size. This rou
1d050 74 69 6e 65 20 75 73 65 73 20 73 71 6c 69 74 65  tine uses sqlite
1d060 33 44 62 52 65 61 6c 6c 6f 63 28 29 0a 2a 2a 20  3DbRealloc().** 
1d070 74 6f 20 65 78 74 65 6e 64 20 74 68 65 20 61 72  to extend the ar
1d080 72 61 79 20 73 6f 20 74 68 61 74 20 74 68 65 72  ray so that ther
1d090 65 20 69 73 20 73 70 61 63 65 20 66 6f 72 20 61  e is space for a
1d0a0 20 6e 65 77 20 6f 62 6a 65 63 74 20 61 74 20 74   new object at t
1d0b0 68 65 20 65 6e 64 2e 0a 2a 2a 0a 2a 2a 20 57 68  he end..**.** Wh
1d0c0 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
1d0d0 20 69 73 20 63 61 6c 6c 65 64 2c 20 2a 70 6e 45   is called, *pnE
1d0e0 6e 74 72 79 20 63 6f 6e 74 61 69 6e 73 20 74 68  ntry contains th
1d0f0 65 20 63 75 72 72 65 6e 74 20 73 69 7a 65 20 6f  e current size o
1d100 66 0a 2a 2a 20 74 68 65 20 61 72 72 61 79 20 28  f.** the array (
1d110 69 6e 20 65 6e 74 72 69 65 73 20 2d 20 73 6f 20  in entries - so 
1d120 74 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 69  the allocation i
1d130 73 20 28 28 2a 70 6e 45 6e 74 72 79 29 20 2a 20  s ((*pnEntry) * 
1d140 73 7a 45 6e 74 72 79 29 20 62 79 74 65 73 0a 2a  szEntry) bytes.*
1d150 2a 20 69 6e 20 74 6f 74 61 6c 29 2e 0a 2a 2a 0a  * in total)..**.
1d160 2a 2a 20 49 66 20 74 68 65 20 72 65 61 6c 6c 6f  ** If the reallo
1d170 63 28 29 20 69 73 20 73 75 63 63 65 73 73 66 75  c() is successfu
1d180 6c 20 28 69 2e 65 2e 20 69 66 20 6e 6f 20 4f 4f  l (i.e. if no OO
1d190 4d 20 63 6f 6e 64 69 74 69 6f 6e 20 6f 63 63 75  M condition occu
1d1a0 72 73 29 2c 20 74 68 65 0a 2a 2a 20 73 70 61 63  rs), the.** spac
1d1b0 65 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20  e allocated for 
1d1c0 74 68 65 20 6e 65 77 20 6f 62 6a 65 63 74 20 69  the new object i
1d1d0 73 20 7a 65 72 6f 65 64 2c 20 2a 70 6e 45 6e 74  s zeroed, *pnEnt
1d1e0 72 79 20 75 70 64 61 74 65 64 20 74 6f 0a 2a 2a  ry updated to.**
1d1f0 20 72 65 66 6c 65 63 74 20 74 68 65 20 6e 65 77   reflect the new
1d200 20 73 69 7a 65 20 6f 66 20 74 68 65 20 61 72 72   size of the arr
1d210 61 79 20 61 6e 64 20 61 20 70 6f 69 6e 74 65 72  ay and a pointer
1d220 20 74 6f 20 74 68 65 20 6e 65 77 20 61 6c 6c 6f   to the new allo
1d230 63 61 74 69 6f 6e 0a 2a 2a 20 72 65 74 75 72 6e  cation.** return
1d240 65 64 2e 20 2a 70 49 64 78 20 69 73 20 73 65 74  ed. *pIdx is set
1d250 20 74 6f 20 74 68 65 20 69 6e 64 65 78 20 6f 66   to the index of
1d260 20 74 68 65 20 6e 65 77 20 61 72 72 61 79 20 65   the new array e
1d270 6e 74 72 79 20 69 6e 20 74 68 69 73 20 63 61 73  ntry in this cas
1d280 65 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69  e..**.** Otherwi
1d290 73 65 2c 20 69 66 20 74 68 65 20 72 65 61 6c 6c  se, if the reall
1d2a0 6f 63 28 29 20 66 61 69 6c 73 2c 20 2a 70 49 64  oc() fails, *pId
1d2b0 78 20 69 73 20 73 65 74 20 74 6f 20 2d 31 2c 20  x is set to -1, 
1d2c0 2a 70 6e 45 6e 74 72 79 20 72 65 6d 61 69 6e 73  *pnEntry remains
1d2d0 0a 2a 2a 20 75 6e 63 68 61 6e 67 65 64 20 61 6e  .** unchanged an
1d2e0 64 20 61 20 63 6f 70 79 20 6f 66 20 70 41 72 72  d a copy of pArr
1d2f0 61 79 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  ay returned..*/.
1d300 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 41 72 72  void *sqlite3Arr
1d310 61 79 41 6c 6c 6f 63 61 74 65 28 0a 20 20 73 71  ayAllocate(.  sq
1d320 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20  lite3 *db,      
1d330 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f  /* Connection to
1d340 20 6e 6f 74 69 66 79 20 6f 66 20 6d 61 6c 6c 6f   notify of mallo
1d350 63 20 66 61 69 6c 75 72 65 73 20 2a 2f 0a 20 20  c failures */.  
1d360 76 6f 69 64 20 2a 70 41 72 72 61 79 2c 20 20 20  void *pArray,   
1d370 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 6f 62    /* Array of ob
1d380 6a 65 63 74 73 2e 20 20 4d 69 67 68 74 20 62 65  jects.  Might be
1d390 20 72 65 61 6c 6c 6f 63 61 74 65 64 20 2a 2f 0a   reallocated */.
1d3a0 20 20 69 6e 74 20 73 7a 45 6e 74 72 79 2c 20 20    int szEntry,  
1d3b0 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 65      /* Size of e
1d3c0 61 63 68 20 6f 62 6a 65 63 74 20 69 6e 20 74 68  ach object in th
1d3d0 65 20 61 72 72 61 79 20 2a 2f 0a 20 20 69 6e 74  e array */.  int
1d3e0 20 2a 70 6e 45 6e 74 72 79 2c 20 20 20 20 20 2f   *pnEntry,     /
1d3f0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6f 62 6a 65  * Number of obje
1d400 63 74 73 20 63 75 72 72 65 6e 74 6c 79 20 69 6e  cts currently in
1d410 20 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70   use */.  int *p
1d420 49 64 78 20 20 20 20 20 20 20 20 20 2f 2a 20 57  Idx         /* W
1d430 72 69 74 65 20 74 68 65 20 69 6e 64 65 78 20 6f  rite the index o
1d440 66 20 61 20 6e 65 77 20 73 6c 6f 74 20 68 65 72  f a new slot her
1d450 65 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20 2a  e */.){.  char *
1d460 7a 3b 0a 20 20 69 6e 74 20 6e 20 3d 20 2a 70 6e  z;.  int n = *pn
1d470 45 6e 74 72 79 3b 0a 20 20 69 66 28 20 28 6e 20  Entry;.  if( (n 
1d480 26 20 28 6e 2d 31 29 29 3d 3d 30 20 29 7b 0a 20  & (n-1))==0 ){. 
1d490 20 20 20 69 6e 74 20 73 7a 20 3d 20 28 6e 3d 3d     int sz = (n==
1d4a0 30 29 20 3f 20 31 20 3a 20 32 2a 6e 3b 0a 20 20  0) ? 1 : 2*n;.  
1d4b0 20 20 76 6f 69 64 20 2a 70 4e 65 77 20 3d 20 73    void *pNew = s
1d4c0 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 28  qlite3DbRealloc(
1d4d0 64 62 2c 20 70 41 72 72 61 79 2c 20 73 7a 2a 73  db, pArray, sz*s
1d4e0 7a 45 6e 74 72 79 29 3b 0a 20 20 20 20 69 66 28  zEntry);.    if(
1d4f0 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20   pNew==0 ){.    
1d500 20 20 2a 70 49 64 78 20 3d 20 2d 31 3b 0a 20 20    *pIdx = -1;.  
1d510 20 20 20 20 72 65 74 75 72 6e 20 70 41 72 72 61      return pArra
1d520 79 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 41 72  y;.    }.    pAr
1d530 72 61 79 20 3d 20 70 4e 65 77 3b 0a 20 20 7d 0a  ray = pNew;.  }.
1d540 20 20 7a 20 3d 20 28 63 68 61 72 2a 29 70 41 72    z = (char*)pAr
1d550 72 61 79 3b 0a 20 20 6d 65 6d 73 65 74 28 26 7a  ray;.  memset(&z
1d560 5b 6e 20 2a 20 73 7a 45 6e 74 72 79 5d 2c 20 30  [n * szEntry], 0
1d570 2c 20 73 7a 45 6e 74 72 79 29 3b 0a 20 20 2a 70  , szEntry);.  *p
1d580 49 64 78 20 3d 20 6e 3b 0a 20 20 2b 2b 2a 70 6e  Idx = n;.  ++*pn
1d590 45 6e 74 72 79 3b 0a 20 20 72 65 74 75 72 6e 20  Entry;.  return 
1d5a0 70 41 72 72 61 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pArray;.}../*.**
1d5b0 20 41 70 70 65 6e 64 20 61 20 6e 65 77 20 65 6c   Append a new el
1d5c0 65 6d 65 6e 74 20 74 6f 20 74 68 65 20 67 69 76  ement to the giv
1d5d0 65 6e 20 49 64 4c 69 73 74 2e 20 20 43 72 65 61  en IdList.  Crea
1d5e0 74 65 20 61 20 6e 65 77 20 49 64 4c 69 73 74 20  te a new IdList 
1d5f0 69 66 0a 2a 2a 20 6e 65 65 64 20 62 65 2e 0a 2a  if.** need be..*
1d600 2a 0a 2a 2a 20 41 20 6e 65 77 20 49 64 4c 69 73  *.** A new IdLis
1d610 74 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20 6f  t is returned, o
1d620 72 20 4e 55 4c 4c 20 69 66 20 6d 61 6c 6c 6f 63  r NULL if malloc
1d630 28 29 20 66 61 69 6c 73 2e 0a 2a 2f 0a 49 64 4c  () fails..*/.IdL
1d640 69 73 74 20 2a 73 71 6c 69 74 65 33 49 64 4c 69  ist *sqlite3IdLi
1d650 73 74 41 70 70 65 6e 64 28 73 71 6c 69 74 65 33  stAppend(sqlite3
1d660 20 2a 64 62 2c 20 49 64 4c 69 73 74 20 2a 70 4c   *db, IdList *pL
1d670 69 73 74 2c 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b  ist, Token *pTok
1d680 65 6e 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  en){.  int i;.  
1d690 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a  if( pList==0 ){.
1d6a0 20 20 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69      pList = sqli
1d6b0 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28  te3DbMallocZero(
1d6c0 64 62 2c 20 73 69 7a 65 6f 66 28 49 64 4c 69 73  db, sizeof(IdLis
1d6d0 74 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c  t) );.    if( pL
1d6e0 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ist==0 ) return 
1d6f0 30 3b 0a 20 20 7d 0a 20 20 70 4c 69 73 74 2d 3e  0;.  }.  pList->
1d700 61 20 3d 20 73 71 6c 69 74 65 33 41 72 72 61 79  a = sqlite3Array
1d710 41 6c 6c 6f 63 61 74 65 28 0a 20 20 20 20 20 20  Allocate(.      
1d720 64 62 2c 0a 20 20 20 20 20 20 70 4c 69 73 74 2d  db,.      pList-
1d730 3e 61 2c 0a 20 20 20 20 20 20 73 69 7a 65 6f 66  >a,.      sizeof
1d740 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 29 2c 0a 20  (pList->a[0]),. 
1d750 20 20 20 20 20 26 70 4c 69 73 74 2d 3e 6e 49 64       &pList->nId
1d760 2c 0a 20 20 20 20 20 20 26 69 0a 20 20 29 3b 0a  ,.      &i.  );.
1d770 20 20 69 66 28 20 69 3c 30 20 29 7b 0a 20 20 20    if( i<0 ){.   
1d780 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44 65   sqlite3IdListDe
1d790 6c 65 74 65 28 64 62 2c 20 70 4c 69 73 74 29 3b  lete(db, pList);
1d7a0 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
1d7b0 20 7d 0a 20 20 70 4c 69 73 74 2d 3e 61 5b 69 5d   }.  pList->a[i]
1d7c0 2e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33  .zName = sqlite3
1d7d0 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62  NameFromToken(db
1d7e0 2c 20 70 54 6f 6b 65 6e 29 3b 0a 20 20 72 65 74  , pToken);.  ret
1d7f0 75 72 6e 20 70 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a  urn pList;.}../*
1d800 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6e 20 49 64  .** Delete an Id
1d810 4c 69 73 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  List..*/.void sq
1d820 6c 69 74 65 33 49 64 4c 69 73 74 44 65 6c 65 74  lite3IdListDelet
1d830 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 49  e(sqlite3 *db, I
1d840 64 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20  dList *pList){. 
1d850 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 4c   int i;.  if( pL
1d860 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ist==0 ) return;
1d870 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c  .  for(i=0; i<pL
1d880 69 73 74 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a  ist->nId; i++){.
1d890 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
1d8a0 65 28 64 62 2c 20 70 4c 69 73 74 2d 3e 61 5b 69  e(db, pList->a[i
1d8b0 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20  ].zName);.  }.  
1d8c0 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
1d8d0 2c 20 70 4c 69 73 74 2d 3e 61 29 3b 0a 20 20 73  , pList->a);.  s
1d8e0 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
1d8f0 20 70 4c 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a   pList);.}../*.*
1d900 2a 20 52 65 74 75 72 6e 20 74 68 65 20 69 6e 64  * Return the ind
1d910 65 78 20 69 6e 20 70 4c 69 73 74 20 6f 66 20 74  ex in pList of t
1d920 68 65 20 69 64 65 6e 74 69 66 69 65 72 20 6e 61  he identifier na
1d930 6d 65 64 20 7a 49 64 2e 20 20 52 65 74 75 72 6e  med zId.  Return
1d940 20 2d 31 0a 2a 2a 20 69 66 20 6e 6f 74 20 66 6f   -1.** if not fo
1d950 75 6e 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  und..*/.int sqli
1d960 74 65 33 49 64 4c 69 73 74 49 6e 64 65 78 28 49  te3IdListIndex(I
1d970 64 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 63 6f  dList *pList, co
1d980 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29  nst char *zName)
1d990 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28  {.  int i;.  if(
1d9a0 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75   pList==0 ) retu
1d9b0 72 6e 20 2d 31 3b 0a 20 20 66 6f 72 28 69 3d 30  rn -1;.  for(i=0
1d9c0 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 49 64 3b 20  ; i<pList->nId; 
1d9d0 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73 71  i++){.    if( sq
1d9e0 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 4c 69  lite3StrICmp(pLi
1d9f0 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20  st->a[i].zName, 
1da00 7a 4e 61 6d 65 29 3d 3d 30 20 29 20 72 65 74 75  zName)==0 ) retu
1da10 72 6e 20 69 3b 0a 20 20 7d 0a 20 20 72 65 74 75  rn i;.  }.  retu
1da20 72 6e 20 2d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn -1;.}../*.** 
1da30 45 78 70 61 6e 64 20 74 68 65 20 73 70 61 63 65  Expand the space
1da40 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 74   allocated for t
1da50 68 65 20 67 69 76 65 6e 20 53 72 63 4c 69 73 74  he given SrcList
1da60 20 6f 62 6a 65 63 74 20 62 79 0a 2a 2a 20 63 72   object by.** cr
1da70 65 61 74 69 6e 67 20 6e 45 78 74 72 61 20 6e 65  eating nExtra ne
1da80 77 20 73 6c 6f 74 73 20 62 65 67 69 6e 6e 69 6e  w slots beginnin
1da90 67 20 61 74 20 69 53 74 61 72 74 2e 20 20 69 53  g at iStart.  iS
1daa0 74 61 72 74 20 69 73 20 7a 65 72 6f 20 62 61 73  tart is zero bas
1dab0 65 64 2e 0a 2a 2a 20 4e 65 77 20 73 6c 6f 74 73  ed..** New slots
1dac0 20 61 72 65 20 7a 65 72 6f 65 64 2e 0a 2a 2a 0a   are zeroed..**.
1dad0 2a 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20  ** For example, 
1dae0 73 75 70 70 6f 73 65 20 61 20 53 72 63 4c 69 73  suppose a SrcLis
1daf0 74 20 69 6e 69 74 69 61 6c 6c 79 20 63 6f 6e 74  t initially cont
1db00 61 69 6e 73 20 74 77 6f 20 65 6e 74 72 69 65 73  ains two entries
1db10 3a 20 41 2c 42 2e 0a 2a 2a 20 54 6f 20 61 70 70  : A,B..** To app
1db20 65 6e 64 20 33 20 6e 65 77 20 65 6e 74 72 69 65  end 3 new entrie
1db30 73 20 6f 6e 74 6f 20 74 68 65 20 65 6e 64 2c 20  s onto the end, 
1db40 64 6f 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20  do this:.**.**  
1db50 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74    sqlite3SrcList
1db60 45 6e 6c 61 72 67 65 28 64 62 2c 20 70 53 72 63  Enlarge(db, pSrc
1db70 6c 69 73 74 2c 20 33 2c 20 32 29 3b 0a 2a 2a 0a  list, 3, 2);.**.
1db80 2a 2a 20 41 66 74 65 72 20 74 68 65 20 63 61 6c  ** After the cal
1db90 6c 20 61 62 6f 76 65 20 69 74 20 77 6f 75 6c 64  l above it would
1dba0 20 63 6f 6e 74 61 69 6e 3a 20 20 41 2c 20 42 2c   contain:  A, B,
1dbb0 20 6e 69 6c 2c 20 6e 69 6c 2c 20 6e 69 6c 2e 0a   nil, nil, nil..
1dbc0 2a 2a 20 49 66 20 74 68 65 20 69 53 74 61 72 74  ** If the iStart
1dbd0 20 61 72 67 75 6d 65 6e 74 20 68 61 64 20 62 65   argument had be
1dbe0 65 6e 20 31 20 69 6e 73 74 65 61 64 20 6f 66 20  en 1 instead of 
1dbf0 32 2c 20 74 68 65 6e 20 74 68 65 20 72 65 73 75  2, then the resu
1dc00 6c 74 0a 2a 2a 20 77 6f 75 6c 64 20 68 61 76 65  lt.** would have
1dc10 20 62 65 65 6e 3a 20 20 41 2c 20 6e 69 6c 2c 20   been:  A, nil, 
1dc20 6e 69 6c 2c 20 6e 69 6c 2c 20 42 2e 20 20 54 6f  nil, nil, B.  To
1dc30 20 70 72 65 70 65 6e 64 20 74 68 65 20 6e 65 77   prepend the new
1dc40 20 73 6c 6f 74 73 2c 0a 2a 2a 20 74 68 65 20 69   slots,.** the i
1dc50 53 74 61 72 74 20 76 61 6c 75 65 20 77 6f 75 6c  Start value woul
1dc60 64 20 62 65 20 30 2e 20 20 54 68 65 20 72 65 73  d be 0.  The res
1dc70 75 6c 74 20 74 68 65 6e 20 77 6f 75 6c 64 0a 2a  ult then would.*
1dc80 2a 20 62 65 3a 20 6e 69 6c 2c 20 6e 69 6c 2c 20  * be: nil, nil, 
1dc90 6e 69 6c 2c 20 41 2c 20 42 2e 0a 2a 2a 0a 2a 2a  nil, A, B..**.**
1dca0 20 49 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c   If a memory all
1dcb0 6f 63 61 74 69 6f 6e 20 66 61 69 6c 73 20 74 68  ocation fails th
1dcc0 65 20 53 72 63 4c 69 73 74 20 69 73 20 75 6e 63  e SrcList is unc
1dcd0 68 61 6e 67 65 64 2e 20 20 54 68 65 0a 2a 2a 20  hanged.  The.** 
1dce0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
1dcf0 20 66 6c 61 67 20 77 69 6c 6c 20 62 65 20 73 65   flag will be se
1dd00 74 20 74 6f 20 74 72 75 65 2e 0a 2a 2f 0a 53 72  t to true..*/.Sr
1dd10 63 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 53 72  cList *sqlite3Sr
1dd20 63 4c 69 73 74 45 6e 6c 61 72 67 65 28 0a 20 20  cListEnlarge(.  
1dd30 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20  sqlite3 *db,    
1dd40 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63     /* Database c
1dd50 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 6e 6f 74  onnection to not
1dd60 69 66 79 20 6f 66 20 4f 4f 4d 20 65 72 72 6f 72  ify of OOM error
1dd70 73 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a  s */.  SrcList *
1dd80 70 53 72 63 2c 20 20 20 20 20 2f 2a 20 54 68 65  pSrc,     /* The
1dd90 20 53 72 63 4c 69 73 74 20 74 6f 20 62 65 20 65   SrcList to be e
1dda0 6e 6c 61 72 67 65 64 20 2a 2f 0a 20 20 69 6e 74  nlarged */.  int
1ddb0 20 6e 45 78 74 72 61 2c 20 20 20 20 20 20 20 20   nExtra,        
1ddc0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6e 65 77  /* Number of new
1ddd0 20 73 6c 6f 74 73 20 74 6f 20 61 64 64 20 74 6f   slots to add to
1dde0 20 70 53 72 63 2d 3e 61 5b 5d 20 2a 2f 0a 20 20   pSrc->a[] */.  
1ddf0 69 6e 74 20 69 53 74 61 72 74 20 20 20 20 20 20  int iStart      
1de00 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20 70     /* Index in p
1de10 53 72 63 2d 3e 61 5b 5d 20 6f 66 20 66 69 72 73  Src->a[] of firs
1de20 74 20 6e 65 77 20 73 6c 6f 74 20 2a 2f 0a 29 7b  t new slot */.){
1de30 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 2f 2a 20  .  int i;..  /* 
1de40 53 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20  Sanity checking 
1de50 6f 6e 20 63 61 6c 6c 69 6e 67 20 70 61 72 61 6d  on calling param
1de60 65 74 65 72 73 20 2a 2f 0a 20 20 61 73 73 65 72  eters */.  asser
1de70 74 28 20 69 53 74 61 72 74 3e 3d 30 20 29 3b 0a  t( iStart>=0 );.
1de80 20 20 61 73 73 65 72 74 28 20 6e 45 78 74 72 61    assert( nExtra
1de90 3e 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28  >=1 );.  assert(
1dea0 20 70 53 72 63 21 3d 30 20 29 3b 0a 20 20 61 73   pSrc!=0 );.  as
1deb0 73 65 72 74 28 20 69 53 74 61 72 74 3c 3d 70 53  sert( iStart<=pS
1dec0 72 63 2d 3e 6e 53 72 63 20 29 3b 0a 0a 20 20 2f  rc->nSrc );..  /
1ded0 2a 20 41 6c 6c 6f 63 61 74 65 20 61 64 64 69 74  * Allocate addit
1dee0 69 6f 6e 61 6c 20 73 70 61 63 65 20 69 66 20 6e  ional space if n
1def0 65 65 64 65 64 20 2a 2f 0a 20 20 69 66 28 20 28  eeded */.  if( (
1df00 75 33 32 29 70 53 72 63 2d 3e 6e 53 72 63 2b 6e  u32)pSrc->nSrc+n
1df10 45 78 74 72 61 3e 70 53 72 63 2d 3e 6e 41 6c 6c  Extra>pSrc->nAll
1df20 6f 63 20 29 7b 0a 20 20 20 20 53 72 63 4c 69 73  oc ){.    SrcLis
1df30 74 20 2a 70 4e 65 77 3b 0a 20 20 20 20 69 6e 74  t *pNew;.    int
1df40 20 6e 41 6c 6c 6f 63 20 3d 20 70 53 72 63 2d 3e   nAlloc = pSrc->
1df50 6e 53 72 63 2b 6e 45 78 74 72 61 3b 0a 20 20 20  nSrc+nExtra;.   
1df60 20 69 6e 74 20 6e 47 6f 74 3b 0a 20 20 20 20 70   int nGot;.    p
1df70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62 52  New = sqlite3DbR
1df80 65 61 6c 6c 6f 63 28 64 62 2c 20 70 53 72 63 2c  ealloc(db, pSrc,
1df90 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1dfa0 73 69 7a 65 6f 66 28 2a 70 53 72 63 29 20 2b 20  sizeof(*pSrc) + 
1dfb0 28 6e 41 6c 6c 6f 63 2d 31 29 2a 73 69 7a 65 6f  (nAlloc-1)*sizeo
1dfc0 66 28 70 53 72 63 2d 3e 61 5b 30 5d 29 20 29 3b  f(pSrc->a[0]) );
1dfd0 0a 20 20 20 20 69 66 28 20 70 4e 65 77 3d 3d 30  .    if( pNew==0
1dfe0 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
1dff0 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
1e000 65 64 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ed );.      retu
1e010 72 6e 20 70 53 72 63 3b 0a 20 20 20 20 7d 0a 20  rn pSrc;.    }. 
1e020 20 20 20 70 53 72 63 20 3d 20 70 4e 65 77 3b 0a     pSrc = pNew;.
1e030 20 20 20 20 6e 47 6f 74 20 3d 20 28 73 71 6c 69      nGot = (sqli
1e040 74 65 33 44 62 4d 61 6c 6c 6f 63 53 69 7a 65 28  te3DbMallocSize(
1e050 64 62 2c 20 70 4e 65 77 29 20 2d 20 73 69 7a 65  db, pNew) - size
1e060 6f 66 28 2a 70 53 72 63 29 29 2f 73 69 7a 65 6f  of(*pSrc))/sizeo
1e070 66 28 70 53 72 63 2d 3e 61 5b 30 5d 29 2b 31 3b  f(pSrc->a[0])+1;
1e080 0a 20 20 20 20 70 53 72 63 2d 3e 6e 41 6c 6c 6f  .    pSrc->nAllo
1e090 63 20 3d 20 6e 47 6f 74 3b 0a 20 20 7d 0a 0a 20  c = nGot;.  }.. 
1e0a0 20 2f 2a 20 4d 6f 76 65 20 65 78 69 73 74 69 6e   /* Move existin
1e0b0 67 20 73 6c 6f 74 73 20 74 68 61 74 20 63 6f 6d  g slots that com
1e0c0 65 20 61 66 74 65 72 20 74 68 65 20 6e 65 77 6c  e after the newl
1e0d0 79 20 69 6e 73 65 72 74 65 64 20 73 6c 6f 74 73  y inserted slots
1e0e0 0a 20 20 2a 2a 20 6f 75 74 20 6f 66 20 74 68 65  .  ** out of the
1e0f0 20 77 61 79 20 2a 2f 0a 20 20 66 6f 72 28 69 3d   way */.  for(i=
1e100 70 53 72 63 2d 3e 6e 53 72 63 2d 31 3b 20 69 3e  pSrc->nSrc-1; i>
1e110 3d 69 53 74 61 72 74 3b 20 69 2d 2d 29 7b 0a 20  =iStart; i--){. 
1e120 20 20 20 70 53 72 63 2d 3e 61 5b 69 2b 6e 45 78     pSrc->a[i+nEx
1e130 74 72 61 5d 20 3d 20 70 53 72 63 2d 3e 61 5b 69  tra] = pSrc->a[i
1e140 5d 3b 0a 20 20 7d 0a 20 20 70 53 72 63 2d 3e 6e  ];.  }.  pSrc->n
1e150 53 72 63 20 2b 3d 20 6e 45 78 74 72 61 3b 0a 0a  Src += nExtra;..
1e160 20 20 2f 2a 20 5a 65 72 6f 20 74 68 65 20 6e 65    /* Zero the ne
1e170 77 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 73 6c  wly allocated sl
1e180 6f 74 73 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28  ots */.  memset(
1e190 26 70 53 72 63 2d 3e 61 5b 69 53 74 61 72 74 5d  &pSrc->a[iStart]
1e1a0 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 53 72 63  , 0, sizeof(pSrc
1e1b0 2d 3e 61 5b 30 5d 29 2a 6e 45 78 74 72 61 29 3b  ->a[0])*nExtra);
1e1c0 0a 20 20 66 6f 72 28 69 3d 69 53 74 61 72 74 3b  .  for(i=iStart;
1e1d0 20 69 3c 69 53 74 61 72 74 2b 6e 45 78 74 72 61   i<iStart+nExtra
1e1e0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70 53 72 63  ; i++){.    pSrc
1e1f0 2d 3e 61 5b 69 5d 2e 69 43 75 72 73 6f 72 20 3d  ->a[i].iCursor =
1e200 20 2d 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52   -1;.  }..  /* R
1e210 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
1e220 74 6f 20 74 68 65 20 65 6e 6c 61 72 67 65 64 20  to the enlarged 
1e230 53 72 63 4c 69 73 74 20 2a 2f 0a 20 20 72 65 74  SrcList */.  ret
1e240 75 72 6e 20 70 53 72 63 3b 0a 7d 0a 0a 0a 2f 2a  urn pSrc;.}.../*
1e250 0a 2a 2a 20 41 70 70 65 6e 64 20 61 20 6e 65 77  .** Append a new
1e260 20 74 61 62 6c 65 20 6e 61 6d 65 20 74 6f 20 74   table name to t
1e270 68 65 20 67 69 76 65 6e 20 53 72 63 4c 69 73 74  he given SrcList
1e280 2e 20 20 43 72 65 61 74 65 20 61 20 6e 65 77 20  .  Create a new 
1e290 53 72 63 4c 69 73 74 20 69 66 0a 2a 2a 20 6e 65  SrcList if.** ne
1e2a0 65 64 20 62 65 2e 20 20 41 20 6e 65 77 20 65 6e  ed be.  A new en
1e2b0 74 72 79 20 69 73 20 63 72 65 61 74 65 64 20 69  try is created i
1e2c0 6e 20 74 68 65 20 53 72 63 4c 69 73 74 20 65 76  n the SrcList ev
1e2d0 65 6e 20 69 66 20 70 54 61 62 6c 65 20 69 73 20  en if pTable is 
1e2e0 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 41 20 53 72  NULL..**.** A Sr
1e2f0 63 4c 69 73 74 20 69 73 20 72 65 74 75 72 6e 65  cList is returne
1e300 64 2c 20 6f 72 20 4e 55 4c 4c 20 69 66 20 74 68  d, or NULL if th
1e310 65 72 65 20 69 73 20 61 6e 20 4f 4f 4d 20 65 72  ere is an OOM er
1e320 72 6f 72 2e 20 20 54 68 65 20 72 65 74 75 72 6e  ror.  The return
1e330 65 64 0a 2a 2a 20 53 72 63 4c 69 73 74 20 6d 69  ed.** SrcList mi
1e340 67 68 74 20 62 65 20 74 68 65 20 73 61 6d 65 20  ght be the same 
1e350 61 73 20 74 68 65 20 53 72 63 4c 69 73 74 20 74  as the SrcList t
1e360 68 61 74 20 77 61 73 20 69 6e 70 75 74 20 6f 72  hat was input or
1e370 20 69 74 20 6d 69 67 68 74 20 62 65 0a 2a 2a 20   it might be.** 
1e380 61 20 6e 65 77 20 6f 6e 65 2e 20 20 49 66 20 61  a new one.  If a
1e390 6e 20 4f 4f 4d 20 65 72 72 6f 72 20 64 6f 65 73  n OOM error does
1e3a0 20 6f 63 63 75 72 73 2c 20 74 68 65 6e 20 74 68   occurs, then th
1e3b0 65 20 70 72 69 6f 72 20 76 61 6c 75 65 20 6f 66  e prior value of
1e3c0 20 70 4c 69 73 74 0a 2a 2a 20 74 68 61 74 20 69   pList.** that i
1e3d0 73 20 69 6e 70 75 74 20 74 6f 20 74 68 69 73 20  s input to this 
1e3e0 72 6f 75 74 69 6e 65 20 69 73 20 61 75 74 6f 6d  routine is autom
1e3f0 61 74 69 63 61 6c 6c 79 20 66 72 65 65 64 2e 0a  atically freed..
1e400 2a 2a 0a 2a 2a 20 49 66 20 70 44 61 74 61 62 61  **.** If pDataba
1e410 73 65 20 69 73 20 6e 6f 74 20 6e 75 6c 6c 2c 20  se is not null, 
1e420 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68  it means that th
1e430 65 20 74 61 62 6c 65 20 68 61 73 20 61 6e 20 6f  e table has an o
1e440 70 74 69 6f 6e 61 6c 0a 2a 2a 20 64 61 74 61 62  ptional.** datab
1e450 61 73 65 20 6e 61 6d 65 20 70 72 65 66 69 78 2e  ase name prefix.
1e460 20 20 4c 69 6b 65 20 74 68 69 73 3a 20 20 22 64    Like this:  "d
1e470 61 74 61 62 61 73 65 2e 74 61 62 6c 65 22 2e 20  atabase.table". 
1e480 20 54 68 65 20 70 44 61 74 61 62 61 73 65 0a 2a   The pDatabase.*
1e490 2a 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20  * points to the 
1e4a0 74 61 62 6c 65 20 6e 61 6d 65 20 61 6e 64 20 74  table name and t
1e4b0 68 65 20 70 54 61 62 6c 65 20 70 6f 69 6e 74 73  he pTable points
1e4c0 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
1e4d0 20 6e 61 6d 65 2e 0a 2a 2a 20 54 68 65 20 53 72   name..** The Sr
1e4e0 63 4c 69 73 74 2e 61 5b 5d 2e 7a 4e 61 6d 65 20  cList.a[].zName 
1e4f0 66 69 65 6c 64 20 69 73 20 66 69 6c 6c 65 64 20  field is filled 
1e500 77 69 74 68 20 74 68 65 20 74 61 62 6c 65 20 6e  with the table n
1e510 61 6d 65 20 77 68 69 63 68 20 6d 69 67 68 74 0a  ame which might.
1e520 2a 2a 20 63 6f 6d 65 20 66 72 6f 6d 20 70 54 61  ** come from pTa
1e530 62 6c 65 20 28 69 66 20 70 44 61 74 61 62 61 73  ble (if pDatabas
1e540 65 20 69 73 20 4e 55 4c 4c 29 20 6f 72 20 66 72  e is NULL) or fr
1e550 6f 6d 20 70 44 61 74 61 62 61 73 65 2e 20 20 0a  om pDatabase.  .
1e560 2a 2a 20 53 72 63 4c 69 73 74 2e 61 5b 5d 2e 7a  ** SrcList.a[].z
1e570 44 61 74 61 62 61 73 65 20 69 73 20 66 69 6c 6c  Database is fill
1e580 65 64 20 77 69 74 68 20 74 68 65 20 64 61 74 61  ed with the data
1e590 62 61 73 65 20 6e 61 6d 65 20 66 72 6f 6d 20 70  base name from p
1e5a0 54 61 62 6c 65 2c 0a 2a 2a 20 6f 72 20 77 69 74  Table,.** or wit
1e5b0 68 20 4e 55 4c 4c 20 69 66 20 6e 6f 20 64 61 74  h NULL if no dat
1e5c0 61 62 61 73 65 20 69 73 20 73 70 65 63 69 66 69  abase is specifi
1e5d0 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 6f 74 68  ed..**.** In oth
1e5e0 65 72 20 77 6f 72 64 73 2c 20 69 66 20 63 61 6c  er words, if cal
1e5f0 6c 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a  l like this:.**.
1e600 2a 2a 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  **         sqlit
1e610 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64 28  e3SrcListAppend(
1e620 44 2c 41 2c 42 2c 30 29 3b 0a 2a 2a 0a 2a 2a 20  D,A,B,0);.**.** 
1e630 54 68 65 6e 20 42 20 69 73 20 61 20 74 61 62 6c  Then B is a tabl
1e640 65 20 6e 61 6d 65 20 61 6e 64 20 74 68 65 20 64  e name and the d
1e650 61 74 61 62 61 73 65 20 6e 61 6d 65 20 69 73 20  atabase name is 
1e660 75 6e 73 70 65 63 69 66 69 65 64 2e 20 20 49 66  unspecified.  If
1e670 20 63 61 6c 6c 65 64 0a 2a 2a 20 6c 69 6b 65 20   called.** like 
1e680 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  this:.**.**     
1e690 20 20 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69      sqlite3SrcLi
1e6a0 73 74 41 70 70 65 6e 64 28 44 2c 41 2c 42 2c 43  stAppend(D,A,B,C
1e6b0 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 43 20  );.**.** Then C 
1e6c0 69 73 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d  is the table nam
1e6d0 65 20 61 6e 64 20 42 20 69 73 20 74 68 65 20 64  e and B is the d
1e6e0 61 74 61 62 61 73 65 20 6e 61 6d 65 2e 20 20 49  atabase name.  I
1e6f0 66 20 43 20 69 73 20 64 65 66 69 6e 65 64 0a 2a  f C is defined.*
1e700 2a 20 74 68 65 6e 20 73 6f 20 69 73 20 42 2e 20  * then so is B. 
1e710 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c   In other words,
1e720 20 77 65 20 6e 65 76 65 72 20 68 61 76 65 20 61   we never have a
1e730 20 63 61 73 65 20 77 68 65 72 65 3a 0a 2a 2a 0a   case where:.**.
1e740 2a 2a 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  **         sqlit
1e750 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64 28  e3SrcListAppend(
1e760 44 2c 41 2c 30 2c 43 29 3b 0a 2a 2a 0a 2a 2a 20  D,A,0,C);.**.** 
1e770 42 6f 74 68 20 70 54 61 62 6c 65 20 61 6e 64 20  Both pTable and 
1e780 70 44 61 74 61 62 61 73 65 20 61 72 65 20 61 73  pDatabase are as
1e790 73 75 6d 65 64 20 74 6f 20 62 65 20 71 75 6f 74  sumed to be quot
1e7a0 65 64 2e 20 20 54 68 65 79 20 61 72 65 20 64 65  ed.  They are de
1e7b0 71 75 6f 74 65 64 0a 2a 2a 20 62 65 66 6f 72 65  quoted.** before
1e7c0 20 62 65 69 6e 67 20 61 64 64 65 64 20 74 6f 20   being added to 
1e7d0 74 68 65 20 53 72 63 4c 69 73 74 2e 0a 2a 2f 0a  the SrcList..*/.
1e7e0 53 72 63 4c 69 73 74 20 2a 73 71 6c 69 74 65 33  SrcList *sqlite3
1e7f0 53 72 63 4c 69 73 74 41 70 70 65 6e 64 28 0a 20  SrcListAppend(. 
1e800 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20   sqlite3 *db,   
1e810 20 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69       /* Connecti
1e820 6f 6e 20 74 6f 20 6e 6f 74 69 66 79 20 6f 66 20  on to notify of 
1e830 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65 73 20  malloc failures 
1e840 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 4c  */.  SrcList *pL
1e850 69 73 74 2c 20 20 20 20 20 2f 2a 20 41 70 70 65  ist,     /* Appe
1e860 6e 64 20 74 6f 20 74 68 69 73 20 53 72 63 4c 69  nd to this SrcLi
1e870 73 74 2e 20 4e 55 4c 4c 20 63 72 65 61 74 65 73  st. NULL creates
1e880 20 61 20 6e 65 77 20 53 72 63 4c 69 73 74 20 2a   a new SrcList *
1e890 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 54 61 62 6c  /.  Token *pTabl
1e8a0 65 2c 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65  e,      /* Table
1e8b0 20 74 6f 20 61 70 70 65 6e 64 20 2a 2f 0a 20 20   to append */.  
1e8c0 54 6f 6b 65 6e 20 2a 70 44 61 74 61 62 61 73 65  Token *pDatabase
1e8d0 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
1e8e0 6f 66 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a  of the table */.
1e8f0 29 7b 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  ){.  struct SrcL
1e900 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b  ist_item *pItem;
1e910 0a 20 20 61 73 73 65 72 74 28 20 70 44 61 74 61  .  assert( pData
1e920 62 61 73 65 3d 3d 30 20 7c 7c 20 70 54 61 62 6c  base==0 || pTabl
1e930 65 21 3d 30 20 29 3b 20 20 2f 2a 20 43 61 6e 6e  e!=0 );  /* Cann
1e940 6f 74 20 68 61 76 65 20 43 20 77 69 74 68 6f 75  ot have C withou
1e950 74 20 42 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  t B */.  assert(
1e960 20 64 62 21 3d 30 20 29 3b 0a 20 20 69 66 28 20   db!=0 );.  if( 
1e970 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20  pList==0 ){.    
1e980 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 44  pList = sqlite3D
1e990 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c  bMallocRawNN(db,
1e9a0 20 73 69 7a 65 6f 66 28 53 72 63 4c 69 73 74 29   sizeof(SrcList)
1e9b0 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73   );.    if( pLis
1e9c0 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  t==0 ) return 0;
1e9d0 0a 20 20 20 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c  .    pList->nAll
1e9e0 6f 63 20 3d 20 31 3b 0a 20 20 20 20 70 4c 69 73  oc = 1;.    pLis
1e9f0 74 2d 3e 6e 53 72 63 20 3d 20 30 3b 0a 20 20 7d  t->nSrc = 0;.  }
1ea00 0a 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74  .  pList = sqlit
1ea10 65 33 53 72 63 4c 69 73 74 45 6e 6c 61 72 67 65  e3SrcListEnlarge
1ea20 28 64 62 2c 20 70 4c 69 73 74 2c 20 31 2c 20 70  (db, pList, 1, p
1ea30 4c 69 73 74 2d 3e 6e 53 72 63 29 3b 0a 20 20 69  List->nSrc);.  i
1ea40 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
1ea50 6c 65 64 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  led ){.    sqlit
1ea60 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28  e3SrcListDelete(
1ea70 64 62 2c 20 70 4c 69 73 74 29 3b 0a 20 20 20 20  db, pList);.    
1ea80 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
1ea90 70 49 74 65 6d 20 3d 20 26 70 4c 69 73 74 2d 3e  pItem = &pList->
1eaa0 61 5b 70 4c 69 73 74 2d 3e 6e 53 72 63 2d 31 5d  a[pList->nSrc-1]
1eab0 3b 0a 20 20 69 66 28 20 70 44 61 74 61 62 61 73  ;.  if( pDatabas
1eac0 65 20 26 26 20 70 44 61 74 61 62 61 73 65 2d 3e  e && pDatabase->
1ead0 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 70 44 61 74  z==0 ){.    pDat
1eae0 61 62 61 73 65 20 3d 20 30 3b 0a 20 20 7d 0a 20  abase = 0;.  }. 
1eaf0 20 69 66 28 20 70 44 61 74 61 62 61 73 65 20 29   if( pDatabase )
1eb00 7b 0a 20 20 20 20 54 6f 6b 65 6e 20 2a 70 54 65  {.    Token *pTe
1eb10 6d 70 20 3d 20 70 44 61 74 61 62 61 73 65 3b 0a  mp = pDatabase;.
1eb20 20 20 20 20 70 44 61 74 61 62 61 73 65 20 3d 20      pDatabase = 
1eb30 70 54 61 62 6c 65 3b 0a 20 20 20 20 70 54 61 62  pTable;.    pTab
1eb40 6c 65 20 3d 20 70 54 65 6d 70 3b 0a 20 20 7d 0a  le = pTemp;.  }.
1eb50 20 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d    pItem->zName =
1eb60 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d   sqlite3NameFrom
1eb70 54 6f 6b 65 6e 28 64 62 2c 20 70 54 61 62 6c 65  Token(db, pTable
1eb80 29 3b 0a 20 20 70 49 74 65 6d 2d 3e 7a 44 61 74  );.  pItem->zDat
1eb90 61 62 61 73 65 20 3d 20 73 71 6c 69 74 65 33 4e  abase = sqlite3N
1eba0 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c  ameFromToken(db,
1ebb0 20 70 44 61 74 61 62 61 73 65 29 3b 0a 20 20 72   pDatabase);.  r
1ebc0 65 74 75 72 6e 20 70 4c 69 73 74 3b 0a 7d 0a 0a  eturn pList;.}..
1ebd0 2f 2a 0a 2a 2a 20 41 73 73 69 67 6e 20 56 64 62  /*.** Assign Vdb
1ebe0 65 43 75 72 73 6f 72 20 69 6e 64 65 78 20 6e 75  eCursor index nu
1ebf0 6d 62 65 72 73 20 74 6f 20 61 6c 6c 20 74 61 62  mbers to all tab
1ec00 6c 65 73 20 69 6e 20 61 20 53 72 63 4c 69 73 74  les in a SrcList
1ec10 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
1ec20 53 72 63 4c 69 73 74 41 73 73 69 67 6e 43 75 72  SrcListAssignCur
1ec30 73 6f 72 73 28 50 61 72 73 65 20 2a 70 50 61 72  sors(Parse *pPar
1ec40 73 65 2c 20 53 72 63 4c 69 73 74 20 2a 70 4c 69  se, SrcList *pLi
1ec50 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  st){.  int i;.  
1ec60 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
1ec70 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 61 73  tem *pItem;.  as
1ec80 73 65 72 74 28 70 4c 69 73 74 20 7c 7c 20 70 50  sert(pList || pP
1ec90 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  arse->db->malloc
1eca0 46 61 69 6c 65 64 20 29 3b 0a 20 20 69 66 28 20  Failed );.  if( 
1ecb0 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 66 6f 72  pList ){.    for
1ecc0 28 69 3d 30 2c 20 70 49 74 65 6d 3d 70 4c 69 73  (i=0, pItem=pLis
1ecd0 74 2d 3e 61 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e  t->a; i<pList->n
1ece0 53 72 63 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b  Src; i++, pItem+
1ecf0 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 49  +){.      if( pI
1ed00 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3e 3d 30 20  tem->iCursor>=0 
1ed10 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 70  ) break;.      p
1ed20 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 20 3d 20  Item->iCursor = 
1ed30 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a  pParse->nTab++;.
1ed40 20 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d        if( pItem-
1ed50 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20  >pSelect ){.    
1ed60 20 20 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69      sqlite3SrcLi
1ed70 73 74 41 73 73 69 67 6e 43 75 72 73 6f 72 73 28  stAssignCursors(
1ed80 70 50 61 72 73 65 2c 20 70 49 74 65 6d 2d 3e 70  pParse, pItem->p
1ed90 53 65 6c 65 63 74 2d 3e 70 53 72 63 29 3b 0a 20  Select->pSrc);. 
1eda0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
1edb0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65  .}../*.** Delete
1edc0 20 61 6e 20 65 6e 74 69 72 65 20 53 72 63 4c 69   an entire SrcLi
1edd0 73 74 20 69 6e 63 6c 75 64 69 6e 67 20 61 6c 6c  st including all
1ede0 20 69 74 73 20 73 75 62 73 74 72 75 63 74 75 72   its substructur
1edf0 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  e..*/.void sqlit
1ee00 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28  e3SrcListDelete(
1ee10 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 53 72 63  sqlite3 *db, Src
1ee20 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20  List *pList){.  
1ee30 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20  int i;.  struct 
1ee40 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  SrcList_item *pI
1ee50 74 65 6d 3b 0a 20 20 69 66 28 20 70 4c 69 73 74  tem;.  if( pList
1ee60 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
1ee70 66 6f 72 28 70 49 74 65 6d 3d 70 4c 69 73 74 2d  for(pItem=pList-
1ee80 3e 61 2c 20 69 3d 30 3b 20 69 3c 70 4c 69 73 74  >a, i=0; i<pList
1ee90 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 49 74  ->nSrc; i++, pIt
1eea0 65 6d 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74  em++){.    sqlit
1eeb0 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 49 74  e3DbFree(db, pIt
1eec0 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 29 3b 0a  em->zDatabase);.
1eed0 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
1eee0 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 7a 4e 61  e(db, pItem->zNa
1eef0 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  me);.    sqlite3
1ef00 44 62 46 72 65 65 28 64 62 2c 20 70 49 74 65 6d  DbFree(db, pItem
1ef10 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20 20 20 20 69  ->zAlias);.    i
1ef20 66 28 20 70 49 74 65 6d 2d 3e 66 67 2e 69 73 49  f( pItem->fg.isI
1ef30 6e 64 65 78 65 64 42 79 20 29 20 73 71 6c 69 74  ndexedBy ) sqlit
1ef40 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 49 74  e3DbFree(db, pIt
1ef50 65 6d 2d 3e 75 31 2e 7a 49 6e 64 65 78 65 64 42  em->u1.zIndexedB
1ef60 79 29 3b 0a 20 20 20 20 69 66 28 20 70 49 74 65  y);.    if( pIte
1ef70 6d 2d 3e 66 67 2e 69 73 54 61 62 46 75 6e 63 20  m->fg.isTabFunc 
1ef80 29 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  ) sqlite3ExprLis
1ef90 74 44 65 6c 65 74 65 28 64 62 2c 20 70 49 74 65  tDelete(db, pIte
1efa0 6d 2d 3e 75 31 2e 70 46 75 6e 63 41 72 67 29 3b  m->u1.pFuncArg);
1efb0 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 6c 65  .    sqlite3Dele
1efc0 74 65 54 61 62 6c 65 28 64 62 2c 20 70 49 74 65  teTable(db, pIte
1efd0 6d 2d 3e 70 54 61 62 29 3b 0a 20 20 20 20 73 71  m->pTab);.    sq
1efe0 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74  lite3SelectDelet
1eff0 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 70 53 65  e(db, pItem->pSe
1f000 6c 65 63 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  lect);.    sqlit
1f010 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c  e3ExprDelete(db,
1f020 20 70 49 74 65 6d 2d 3e 70 4f 6e 29 3b 0a 20 20   pItem->pOn);.  
1f030 20 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44    sqlite3IdListD
1f040 65 6c 65 74 65 28 64 62 2c 20 70 49 74 65 6d 2d  elete(db, pItem-
1f050 3e 70 55 73 69 6e 67 29 3b 0a 20 20 7d 0a 20 20  >pUsing);.  }.  
1f060 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
1f070 2c 20 70 4c 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a  , pList);.}../*.
1f080 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
1f090 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65  is called by the
1f0a0 20 70 61 72 73 65 72 20 74 6f 20 61 64 64 20 61   parser to add a
1f0b0 20 6e 65 77 20 74 65 72 6d 20 74 6f 20 74 68 65   new term to the
1f0c0 0a 2a 2a 20 65 6e 64 20 6f 66 20 61 20 67 72 6f  .** end of a gro
1f0d0 77 69 6e 67 20 46 52 4f 4d 20 63 6c 61 75 73 65  wing FROM clause
1f0e0 2e 20 20 54 68 65 20 22 70 22 20 70 61 72 61 6d  .  The "p" param
1f0f0 65 74 65 72 20 69 73 20 74 68 65 20 70 61 72 74  eter is the part
1f100 20 6f 66 0a 2a 2a 20 74 68 65 20 46 52 4f 4d 20   of.** the FROM 
1f110 63 6c 61 75 73 65 20 74 68 61 74 20 68 61 73 20  clause that has 
1f120 61 6c 72 65 61 64 79 20 62 65 65 6e 20 63 6f 6e  already been con
1f130 73 74 72 75 63 74 65 64 2e 20 20 22 70 22 20 69  structed.  "p" i
1f140 73 20 4e 55 4c 4c 0a 2a 2a 20 69 66 20 74 68 69  s NULL.** if thi
1f150 73 20 69 73 20 74 68 65 20 66 69 72 73 74 20 74  s is the first t
1f160 65 72 6d 20 6f 66 20 74 68 65 20 46 52 4f 4d 20  erm of the FROM 
1f170 63 6c 61 75 73 65 2e 20 20 70 54 61 62 6c 65 20  clause.  pTable 
1f180 61 6e 64 20 70 44 61 74 61 62 61 73 65 0a 2a 2a  and pDatabase.**
1f190 20 61 72 65 20 74 68 65 20 6e 61 6d 65 20 6f 66   are the name of
1f1a0 20 74 68 65 20 74 61 62 6c 65 20 61 6e 64 20 64   the table and d
1f1b0 61 74 61 62 61 73 65 20 6e 61 6d 65 64 20 69 6e  atabase named in
1f1c0 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
1f1d0 20 74 65 72 6d 2e 0a 2a 2a 20 70 44 61 74 61 62   term..** pDatab
1f1e0 61 73 65 20 69 73 20 4e 55 4c 4c 20 69 66 20 74  ase is NULL if t
1f1f0 68 65 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65  he database name
1f200 20 71 75 61 6c 69 66 69 65 72 20 69 73 20 6d 69   qualifier is mi
1f210 73 73 69 6e 67 20 2d 20 74 68 65 0a 2a 2a 20 75  ssing - the.** u
1f220 73 75 61 6c 20 63 61 73 65 2e 20 20 49 66 20 74  sual case.  If t
1f230 68 65 20 74 65 72 6d 20 68 61 73 20 61 6e 20 61  he term has an a
1f240 6c 69 61 73 2c 20 74 68 65 6e 20 70 41 6c 69 61  lias, then pAlia
1f250 73 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 0a  s points to the.
1f260 2a 2a 20 61 6c 69 61 73 20 74 6f 6b 65 6e 2e 20  ** alias token. 
1f270 20 49 66 20 74 68 65 20 74 65 72 6d 20 69 73 20   If the term is 
1f280 61 20 73 75 62 71 75 65 72 79 2c 20 74 68 65 6e  a subquery, then
1f290 20 70 53 75 62 71 75 65 72 79 20 69 73 20 74 68   pSubquery is th
1f2a0 65 0a 2a 2a 20 53 45 4c 45 43 54 20 73 74 61 74  e.** SELECT stat
1f2b0 65 6d 65 6e 74 20 74 68 61 74 20 74 68 65 20 73  ement that the s
1f2c0 75 62 71 75 65 72 79 20 65 6e 63 6f 64 65 73 2e  ubquery encodes.
1f2d0 20 20 54 68 65 20 70 54 61 62 6c 65 20 61 6e 64    The pTable and
1f2e0 0a 2a 2a 20 70 44 61 74 61 62 61 73 65 20 70 61  .** pDatabase pa
1f2f0 72 61 6d 65 74 65 72 73 20 61 72 65 20 4e 55 4c  rameters are NUL
1f300 4c 20 66 6f 72 20 73 75 62 71 75 65 72 69 65 73  L for subqueries
1f310 2e 20 20 54 68 65 20 70 4f 6e 20 61 6e 64 20 70  .  The pOn and p
1f320 55 73 69 6e 67 0a 2a 2a 20 70 61 72 61 6d 65 74  Using.** paramet
1f330 65 72 73 20 61 72 65 20 74 68 65 20 63 6f 6e 74  ers are the cont
1f340 65 6e 74 20 6f 66 20 74 68 65 20 4f 4e 20 61 6e  ent of the ON an
1f350 64 20 55 53 49 4e 47 20 63 6c 61 75 73 65 73 2e  d USING clauses.
1f360 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  .**.** Return a 
1f370 6e 65 77 20 53 72 63 4c 69 73 74 20 77 68 69 63  new SrcList whic
1f380 68 20 65 6e 63 6f 64 65 73 20 69 73 20 74 68 65  h encodes is the
1f390 20 46 52 4f 4d 20 77 69 74 68 20 74 68 65 20 6e   FROM with the n
1f3a0 65 77 0a 2a 2a 20 74 65 72 6d 20 61 64 64 65 64  ew.** term added
1f3b0 2e 0a 2a 2f 0a 53 72 63 4c 69 73 74 20 2a 73 71  ..*/.SrcList *sq
1f3c0 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70 70 65  lite3SrcListAppe
1f3d0 6e 64 46 72 6f 6d 54 65 72 6d 28 0a 20 20 50 61  ndFromTerm(.  Pa
1f3e0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
1f3f0 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
1f400 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72   context */.  Sr
1f410 63 4c 69 73 74 20 2a 70 2c 20 20 20 20 20 20 20  cList *p,       
1f420 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6c 65 66        /* The lef
1f430 74 20 70 61 72 74 20 6f 66 20 74 68 65 20 46 52  t part of the FR
1f440 4f 4d 20 63 6c 61 75 73 65 20 61 6c 72 65 61 64  OM clause alread
1f450 79 20 73 65 65 6e 20 2a 2f 0a 20 20 54 6f 6b 65  y seen */.  Toke
1f460 6e 20 2a 70 54 61 62 6c 65 2c 20 20 20 20 20 20  n *pTable,      
1f470 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
1f480 68 65 20 74 61 62 6c 65 20 74 6f 20 61 64 64 20  he table to add 
1f490 74 6f 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  to the FROM clau
1f4a0 73 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  se */.  Token *p
1f4b0 44 61 74 61 62 61 73 65 2c 20 20 20 20 20 20 20  Database,       
1f4c0 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64  /* Name of the d
1f4d0 61 74 61 62 61 73 65 20 63 6f 6e 74 61 69 6e 69  atabase containi
1f4e0 6e 67 20 70 54 61 62 6c 65 20 2a 2f 0a 20 20 54  ng pTable */.  T
1f4f0 6f 6b 65 6e 20 2a 70 41 6c 69 61 73 2c 20 20 20  oken *pAlias,   
1f500 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 69         /* The ri
1f510 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20 6f 66  ght-hand side of
1f520 20 74 68 65 20 41 53 20 73 75 62 65 78 70 72 65   the AS subexpre
1f530 73 73 69 6f 6e 20 2a 2f 0a 20 20 53 65 6c 65 63  ssion */.  Selec
1f540 74 20 2a 70 53 75 62 71 75 65 72 79 2c 20 20 20  t *pSubquery,   
1f550 20 20 20 2f 2a 20 41 20 73 75 62 71 75 65 72 79     /* A subquery
1f560 20 75 73 65 64 20 69 6e 20 70 6c 61 63 65 20 6f   used in place o
1f570 66 20 61 20 74 61 62 6c 65 20 6e 61 6d 65 20 2a  f a table name *
1f580 2f 0a 20 20 45 78 70 72 20 2a 70 4f 6e 2c 20 20  /.  Expr *pOn,  
1f590 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1f5a0 68 65 20 4f 4e 20 63 6c 61 75 73 65 20 6f 66 20  he ON clause of 
1f5b0 61 20 6a 6f 69 6e 20 2a 2f 0a 20 20 49 64 4c 69  a join */.  IdLi
1f5c0 73 74 20 2a 70 55 73 69 6e 67 20 20 20 20 20 20  st *pUsing      
1f5d0 20 20 20 20 2f 2a 20 54 68 65 20 55 53 49 4e 47      /* The USING
1f5e0 20 63 6c 61 75 73 65 20 6f 66 20 61 20 6a 6f 69   clause of a joi
1f5f0 6e 20 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74  n */.){.  struct
1f600 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
1f610 49 74 65 6d 3b 0a 20 20 73 71 6c 69 74 65 33 20  Item;.  sqlite3 
1f620 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
1f630 3b 0a 20 20 69 66 28 20 21 70 20 26 26 20 28 70  ;.  if( !p && (p
1f640 4f 6e 20 7c 7c 20 70 55 73 69 6e 67 29 20 29 7b  On || pUsing) ){
1f650 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
1f660 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 61 20  rMsg(pParse, "a 
1f670 4a 4f 49 4e 20 63 6c 61 75 73 65 20 69 73 20 72  JOIN clause is r
1f680 65 71 75 69 72 65 64 20 62 65 66 6f 72 65 20 25  equired before %
1f690 73 22 2c 20 0a 20 20 20 20 20 20 28 70 4f 6e 20  s", .      (pOn 
1f6a0 3f 20 22 4f 4e 22 20 3a 20 22 55 53 49 4e 47 22  ? "ON" : "USING"
1f6b0 29 0a 20 20 20 20 29 3b 0a 20 20 20 20 67 6f 74  ).    );.    got
1f6c0 6f 20 61 70 70 65 6e 64 5f 66 72 6f 6d 5f 65 72  o append_from_er
1f6d0 72 6f 72 3b 0a 20 20 7d 0a 20 20 70 20 3d 20 73  ror;.  }.  p = s
1f6e0 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70 70  qlite3SrcListApp
1f6f0 65 6e 64 28 64 62 2c 20 70 2c 20 70 54 61 62 6c  end(db, p, pTabl
1f700 65 2c 20 70 44 61 74 61 62 61 73 65 29 3b 0a 20  e, pDatabase);. 
1f710 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20 4e 45 56   if( p==0 || NEV
1f720 45 52 28 70 2d 3e 6e 53 72 63 3d 3d 30 29 20 29  ER(p->nSrc==0) )
1f730 7b 0a 20 20 20 20 67 6f 74 6f 20 61 70 70 65 6e  {.    goto appen
1f740 64 5f 66 72 6f 6d 5f 65 72 72 6f 72 3b 0a 20 20  d_from_error;.  
1f750 7d 0a 20 20 70 49 74 65 6d 20 3d 20 26 70 2d 3e  }.  pItem = &p->
1f760 61 5b 70 2d 3e 6e 53 72 63 2d 31 5d 3b 0a 20 20  a[p->nSrc-1];.  
1f770 61 73 73 65 72 74 28 20 70 41 6c 69 61 73 21 3d  assert( pAlias!=
1f780 30 20 29 3b 0a 20 20 69 66 28 20 70 41 6c 69 61  0 );.  if( pAlia
1f790 73 2d 3e 6e 20 29 7b 0a 20 20 20 20 70 49 74 65  s->n ){.    pIte
1f7a0 6d 2d 3e 7a 41 6c 69 61 73 20 3d 20 73 71 6c 69  m->zAlias = sqli
1f7b0 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e  te3NameFromToken
1f7c0 28 64 62 2c 20 70 41 6c 69 61 73 29 3b 0a 20 20  (db, pAlias);.  
1f7d0 7d 0a 20 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65  }.  pItem->pSele
1f7e0 63 74 20 3d 20 70 53 75 62 71 75 65 72 79 3b 0a  ct = pSubquery;.
1f7f0 20 20 70 49 74 65 6d 2d 3e 70 4f 6e 20 3d 20 70    pItem->pOn = p
1f800 4f 6e 3b 0a 20 20 70 49 74 65 6d 2d 3e 70 55 73  On;.  pItem->pUs
1f810 69 6e 67 20 3d 20 70 55 73 69 6e 67 3b 0a 20 20  ing = pUsing;.  
1f820 72 65 74 75 72 6e 20 70 3b 0a 0a 20 61 70 70 65  return p;.. appe
1f830 6e 64 5f 66 72 6f 6d 5f 65 72 72 6f 72 3a 0a 20  nd_from_error:. 
1f840 20 61 73 73 65 72 74 28 20 70 3d 3d 30 20 29 3b   assert( p==0 );
1f850 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65  .  sqlite3ExprDe
1f860 6c 65 74 65 28 64 62 2c 20 70 4f 6e 29 3b 0a 20  lete(db, pOn);. 
1f870 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44 65   sqlite3IdListDe
1f880 6c 65 74 65 28 64 62 2c 20 70 55 73 69 6e 67 29  lete(db, pUsing)
1f890 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63  ;.  sqlite3Selec
1f8a0 74 44 65 6c 65 74 65 28 64 62 2c 20 70 53 75 62  tDelete(db, pSub
1f8b0 71 75 65 72 79 29 3b 0a 20 20 72 65 74 75 72 6e  query);.  return
1f8c0 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64   0;.}../*.** Add
1f8d0 20 61 6e 20 49 4e 44 45 58 45 44 20 42 59 20 6f   an INDEXED BY o
1f8e0 72 20 4e 4f 54 20 49 4e 44 45 58 45 44 20 63 6c  r NOT INDEXED cl
1f8f0 61 75 73 65 20 74 6f 20 74 68 65 20 6d 6f 73 74  ause to the most
1f900 20 72 65 63 65 6e 74 6c 79 20 61 64 64 65 64 20   recently added 
1f910 0a 2a 2a 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74  .** element of t
1f920 68 65 20 73 6f 75 72 63 65 2d 6c 69 73 74 20 70  he source-list p
1f930 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63  assed as the sec
1f940 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f  ond argument..*/
1f950 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53 72 63  .void sqlite3Src
1f960 4c 69 73 74 49 6e 64 65 78 65 64 42 79 28 50 61  ListIndexedBy(Pa
1f970 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 72 63  rse *pParse, Src
1f980 4c 69 73 74 20 2a 70 2c 20 54 6f 6b 65 6e 20 2a  List *p, Token *
1f990 70 49 6e 64 65 78 65 64 42 79 29 7b 0a 20 20 61  pIndexedBy){.  a
1f9a0 73 73 65 72 74 28 20 70 49 6e 64 65 78 65 64 42  ssert( pIndexedB
1f9b0 79 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 20  y!=0 );.  if( p 
1f9c0 26 26 20 41 4c 57 41 59 53 28 70 2d 3e 6e 53 72  && ALWAYS(p->nSr
1f9d0 63 3e 30 29 20 29 7b 0a 20 20 20 20 73 74 72 75  c>0) ){.    stru
1f9e0 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
1f9f0 2a 70 49 74 65 6d 20 3d 20 26 70 2d 3e 61 5b 70  *pItem = &p->a[p
1fa00 2d 3e 6e 53 72 63 2d 31 5d 3b 0a 20 20 20 20 61  ->nSrc-1];.    a
1fa10 73 73 65 72 74 28 20 70 49 74 65 6d 2d 3e 66 67  ssert( pItem->fg
1fa20 2e 6e 6f 74 49 6e 64 65 78 65 64 3d 3d 30 20 29  .notIndexed==0 )
1fa30 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49  ;.    assert( pI
1fa40 74 65 6d 2d 3e 66 67 2e 69 73 49 6e 64 65 78 65  tem->fg.isIndexe
1fa50 64 42 79 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73  dBy==0 );.    as
1fa60 73 65 72 74 28 20 70 49 74 65 6d 2d 3e 66 67 2e  sert( pItem->fg.
1fa70 69 73 54 61 62 46 75 6e 63 3d 3d 30 20 29 3b 0a  isTabFunc==0 );.
1fa80 20 20 20 20 69 66 28 20 70 49 6e 64 65 78 65 64      if( pIndexed
1fa90 42 79 2d 3e 6e 3d 3d 31 20 26 26 20 21 70 49 6e  By->n==1 && !pIn
1faa0 64 65 78 65 64 42 79 2d 3e 7a 20 29 7b 0a 20 20  dexedBy->z ){.  
1fab0 20 20 20 20 2f 2a 20 41 20 22 4e 4f 54 20 49 4e      /* A "NOT IN
1fac0 44 45 58 45 44 22 20 63 6c 61 75 73 65 20 77 61  DEXED" clause wa
1fad0 73 20 73 75 70 70 6c 69 65 64 2e 20 53 65 65 20  s supplied. See 
1fae0 70 61 72 73 65 2e 79 20 0a 20 20 20 20 20 20 2a  parse.y .      *
1faf0 2a 20 63 6f 6e 73 74 72 75 63 74 20 22 69 6e 64  * construct "ind
1fb00 65 78 65 64 5f 6f 70 74 22 20 66 6f 72 20 64 65  exed_opt" for de
1fb10 74 61 69 6c 73 2e 20 2a 2f 0a 20 20 20 20 20 20  tails. */.      
1fb20 70 49 74 65 6d 2d 3e 66 67 2e 6e 6f 74 49 6e 64  pItem->fg.notInd
1fb30 65 78 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d 65  exed = 1;.    }e
1fb40 6c 73 65 7b 0a 20 20 20 20 20 20 70 49 74 65 6d  lse{.      pItem
1fb50 2d 3e 75 31 2e 7a 49 6e 64 65 78 65 64 42 79 20  ->u1.zIndexedBy 
1fb60 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f  = sqlite3NameFro
1fb70 6d 54 6f 6b 65 6e 28 70 50 61 72 73 65 2d 3e 64  mToken(pParse->d
1fb80 62 2c 20 70 49 6e 64 65 78 65 64 42 79 29 3b 0a  b, pIndexedBy);.
1fb90 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 66 67 2e        pItem->fg.
1fba0 69 73 49 6e 64 65 78 65 64 42 79 20 3d 20 28 70  isIndexedBy = (p
1fbb0 49 74 65 6d 2d 3e 75 31 2e 7a 49 6e 64 65 78 65  Item->u1.zIndexe
1fbc0 64 42 79 21 3d 30 29 3b 0a 20 20 20 20 7d 0a 20  dBy!=0);.    }. 
1fbd0 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20   }.}../*.** Add 
1fbe0 74 68 65 20 6c 69 73 74 20 6f 66 20 66 75 6e 63  the list of func
1fbf0 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74 73 20 74  tion arguments t
1fc00 6f 20 74 68 65 20 53 72 63 4c 69 73 74 20 65 6e  o the SrcList en
1fc10 74 72 79 20 66 6f 72 20 61 0a 2a 2a 20 74 61 62  try for a.** tab
1fc20 6c 65 2d 76 61 6c 75 65 64 2d 66 75 6e 63 74 69  le-valued-functi
1fc30 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  on..*/.void sqli
1fc40 74 65 33 53 72 63 4c 69 73 74 46 75 6e 63 41 72  te3SrcListFuncAr
1fc50 67 73 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  gs(Parse *pParse
1fc60 2c 20 53 72 63 4c 69 73 74 20 2a 70 2c 20 45 78  , SrcList *p, Ex
1fc70 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a  prList *pList){.
1fc80 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 73    if( p ){.    s
1fc90 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
1fca0 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70 2d 3e  em *pItem = &p->
1fcb0 61 5b 70 2d 3e 6e 53 72 63 2d 31 5d 3b 0a 20 20  a[p->nSrc-1];.  
1fcc0 20 20 61 73 73 65 72 74 28 20 70 49 74 65 6d 2d    assert( pItem-
1fcd0 3e 66 67 2e 6e 6f 74 49 6e 64 65 78 65 64 3d 3d  >fg.notIndexed==
1fce0 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
1fcf0 20 70 49 74 65 6d 2d 3e 66 67 2e 69 73 49 6e 64   pItem->fg.isInd
1fd00 65 78 65 64 42 79 3d 3d 30 20 29 3b 0a 20 20 20  exedBy==0 );.   
1fd10 20 61 73 73 65 72 74 28 20 70 49 74 65 6d 2d 3e   assert( pItem->
1fd20 66 67 2e 69 73 54 61 62 46 75 6e 63 3d 3d 30 20  fg.isTabFunc==0 
1fd30 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 75 31  );.    pItem->u1
1fd40 2e 70 46 75 6e 63 41 72 67 20 3d 20 70 4c 69 73  .pFuncArg = pLis
1fd50 74 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 66 67  t;.    pItem->fg
1fd60 2e 69 73 54 61 62 46 75 6e 63 20 3d 20 31 3b 0a  .isTabFunc = 1;.
1fd70 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c    }else{.    sql
1fd80 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65  ite3ExprListDele
1fd90 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  te(pParse->db, p
1fda0 4c 69 73 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  List);.  }.}../*
1fdb0 0a 2a 2a 20 57 68 65 6e 20 62 75 69 6c 64 69 6e  .** When buildin
1fdc0 67 20 75 70 20 61 20 46 52 4f 4d 20 63 6c 61 75  g up a FROM clau
1fdd0 73 65 20 69 6e 20 74 68 65 20 70 61 72 73 65 72  se in the parser
1fde0 2c 20 74 68 65 20 6a 6f 69 6e 20 6f 70 65 72 61  , the join opera
1fdf0 74 6f 72 0a 2a 2a 20 69 73 20 69 6e 69 74 69 61  tor.** is initia
1fe00 6c 6c 79 20 61 74 74 61 63 68 65 64 20 74 6f 20  lly attached to 
1fe10 74 68 65 20 6c 65 66 74 20 6f 70 65 72 61 6e 64  the left operand
1fe20 2e 20 20 42 75 74 20 74 68 65 20 63 6f 64 65 20  .  But the code 
1fe30 67 65 6e 65 72 61 74 6f 72 0a 2a 2a 20 65 78 70  generator.** exp
1fe40 65 63 74 73 20 74 68 65 20 6a 6f 69 6e 20 6f 70  ects the join op
1fe50 65 72 61 74 6f 72 20 74 6f 20 62 65 20 6f 6e 20  erator to be on 
1fe60 74 68 65 20 72 69 67 68 74 20 6f 70 65 72 61 6e  the right operan
1fe70 64 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  d.  This routine
1fe80 0a 2a 2a 20 53 68 69 66 74 73 20 61 6c 6c 20 6a  .** Shifts all j
1fe90 6f 69 6e 20 6f 70 65 72 61 74 6f 72 73 20 66 72  oin operators fr
1fea0 6f 6d 20 6c 65 66 74 20 74 6f 20 72 69 67 68 74  om left to right
1feb0 20 66 6f 72 20 61 6e 20 65 6e 74 69 72 65 20 46   for an entire F
1fec0 52 4f 4d 0a 2a 2a 20 63 6c 61 75 73 65 2e 0a 2a  ROM.** clause..*
1fed0 2a 0a 2a 2a 20 45 78 61 6d 70 6c 65 3a 20 53 75  *.** Example: Su
1fee0 70 70 6f 73 65 20 74 68 65 20 6a 6f 69 6e 20 69  ppose the join i
1fef0 73 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a  s like this:.**.
1ff00 2a 2a 20 20 20 20 20 20 20 20 20 20 20 41 20 6e  **           A n
1ff10 61 74 75 72 61 6c 20 63 72 6f 73 73 20 6a 6f 69  atural cross joi
1ff20 6e 20 42 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 70  n B.**.** The op
1ff30 65 72 61 74 6f 72 20 69 73 20 22 6e 61 74 75 72  erator is "natur
1ff40 61 6c 20 63 72 6f 73 73 20 6a 6f 69 6e 22 2e 20  al cross join". 
1ff50 20 54 68 65 20 41 20 61 6e 64 20 42 20 6f 70 65   The A and B ope
1ff60 72 61 6e 64 73 20 61 72 65 20 73 74 6f 72 65 64  rands are stored
1ff70 0a 2a 2a 20 69 6e 20 70 2d 3e 61 5b 30 5d 20 61  .** in p->a[0] a
1ff80 6e 64 20 70 2d 3e 61 5b 31 5d 2c 20 72 65 73 70  nd p->a[1], resp
1ff90 65 63 74 69 76 65 6c 79 2e 20 20 54 68 65 20 70  ectively.  The p
1ffa0 61 72 73 65 72 20 69 6e 69 74 69 61 6c 6c 79 20  arser initially 
1ffb0 73 74 6f 72 65 73 20 74 68 65 0a 2a 2a 20 6f 70  stores the.** op
1ffc0 65 72 61 74 6f 72 20 77 69 74 68 20 41 2e 20 20  erator with A.  
1ffd0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 68 69  This routine shi
1ffe0 66 74 73 20 74 68 61 74 20 6f 70 65 72 61 74 6f  fts that operato
1fff0 72 20 6f 76 65 72 20 74 6f 20 42 2e 0a 2a 2f 0a  r over to B..*/.
20000 76 6f 69 64 20 73 71 6c 69 74 65 33 53 72 63 4c  void sqlite3SrcL
20010 69 73 74 53 68 69 66 74 4a 6f 69 6e 54 79 70 65  istShiftJoinType
20020 28 53 72 63 4c 69 73 74 20 2a 70 29 7b 0a 20 20  (SrcList *p){.  
20030 69 66 28 20 70 20 29 7b 0a 20 20 20 20 69 6e 74  if( p ){.    int
20040 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 70 2d   i;.    for(i=p-
20050 3e 6e 53 72 63 2d 31 3b 20 69 3e 30 3b 20 69 2d  >nSrc-1; i>0; i-
20060 2d 29 7b 0a 20 20 20 20 20 20 70 2d 3e 61 5b 69  -){.      p->a[i
20070 5d 2e 66 67 2e 6a 6f 69 6e 74 79 70 65 20 3d 20  ].fg.jointype = 
20080 70 2d 3e 61 5b 69 2d 31 5d 2e 66 67 2e 6a 6f 69  p->a[i-1].fg.joi
20090 6e 74 79 70 65 3b 0a 20 20 20 20 7d 0a 20 20 20  ntype;.    }.   
200a0 20 70 2d 3e 61 5b 30 5d 2e 66 67 2e 6a 6f 69 6e   p->a[0].fg.join
200b0 74 79 70 65 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a  type = 0;.  }.}.
200c0 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
200d0 56 44 42 45 20 63 6f 64 65 20 66 6f 72 20 61 20  VDBE code for a 
200e0 42 45 47 49 4e 20 73 74 61 74 65 6d 65 6e 74 2e  BEGIN statement.
200f0 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
20100 42 65 67 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  BeginTransaction
20110 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
20120 69 6e 74 20 74 79 70 65 29 7b 0a 20 20 73 71 6c  int type){.  sql
20130 69 74 65 33 20 2a 64 62 3b 0a 20 20 56 64 62 65  ite3 *db;.  Vdbe
20140 20 2a 76 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20   *v;.  int i;.. 
20150 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65 21   assert( pParse!
20160 3d 30 20 29 3b 0a 20 20 64 62 20 3d 20 70 50 61  =0 );.  db = pPa
20170 72 73 65 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72  rse->db;.  asser
20180 74 28 20 64 62 21 3d 30 20 29 3b 0a 20 20 69 66  t( db!=0 );.  if
20190 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65  ( sqlite3AuthChe
201a0 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54  ck(pParse, SQLIT
201b0 45 5f 54 52 41 4e 53 41 43 54 49 4f 4e 2c 20 22  E_TRANSACTION, "
201c0 42 45 47 49 4e 22 2c 20 30 2c 20 30 29 20 29 7b  BEGIN", 0, 0) ){
201d0 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
201e0 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65  .  v = sqlite3Ge
201f0 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
20200 20 69 66 28 20 21 76 20 29 20 72 65 74 75 72 6e   if( !v ) return
20210 3b 0a 20 20 69 66 28 20 74 79 70 65 21 3d 54 4b  ;.  if( type!=TK
20220 5f 44 45 46 45 52 52 45 44 20 29 7b 0a 20 20 20  _DEFERRED ){.   
20230 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e   for(i=0; i<db->
20240 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  nDb; i++){.     
20250 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
20260 70 32 28 76 2c 20 4f 50 5f 54 72 61 6e 73 61 63  p2(v, OP_Transac
20270 74 69 6f 6e 2c 20 69 2c 20 28 74 79 70 65 3d 3d  tion, i, (type==
20280 54 4b 5f 45 58 43 4c 55 53 49 56 45 29 2b 31 29  TK_EXCLUSIVE)+1)
20290 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
202a0 64 62 65 55 73 65 73 42 74 72 65 65 28 76 2c 20  dbeUsesBtree(v, 
202b0 69 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  i);.    }.  }.  
202c0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
202d0 30 28 76 2c 20 4f 50 5f 41 75 74 6f 43 6f 6d 6d  0(v, OP_AutoComm
202e0 69 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  it);.}../*.** Ge
202f0 6e 65 72 61 74 65 20 56 44 42 45 20 63 6f 64 65  nerate VDBE code
20300 20 66 6f 72 20 61 20 43 4f 4d 4d 49 54 20 73 74   for a COMMIT st
20310 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64  atement..*/.void
20320 20 73 71 6c 69 74 65 33 43 6f 6d 6d 69 74 54 72   sqlite3CommitTr
20330 61 6e 73 61 63 74 69 6f 6e 28 50 61 72 73 65 20  ansaction(Parse 
20340 2a 70 50 61 72 73 65 29 7b 0a 20 20 56 64 62 65  *pParse){.  Vdbe
20350 20 2a 76 3b 0a 0a 20 20 61 73 73 65 72 74 28 20   *v;..  assert( 
20360 70 50 61 72 73 65 21 3d 30 20 29 3b 0a 20 20 61  pParse!=0 );.  a
20370 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 64  ssert( pParse->d
20380 62 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 73 71  b!=0 );.  if( sq
20390 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70  lite3AuthCheck(p
203a0 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 54 52  Parse, SQLITE_TR
203b0 41 4e 53 41 43 54 49 4f 4e 2c 20 22 43 4f 4d 4d  ANSACTION, "COMM
203c0 49 54 22 2c 20 30 2c 20 30 29 20 29 7b 0a 20 20  IT", 0, 0) ){.  
203d0 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
203e0 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
203f0 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66  be(pParse);.  if
20400 28 20 76 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ( v ){.    sqlit
20410 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
20420 4f 50 5f 41 75 74 6f 43 6f 6d 6d 69 74 2c 20 31  OP_AutoCommit, 1
20430 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
20440 47 65 6e 65 72 61 74 65 20 56 44 42 45 20 63 6f  Generate VDBE co
20450 64 65 20 66 6f 72 20 61 20 52 4f 4c 4c 42 41 43  de for a ROLLBAC
20460 4b 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a  K statement..*/.
20470 76 6f 69 64 20 73 71 6c 69 74 65 33 52 6f 6c 6c  void sqlite3Roll
20480 62 61 63 6b 54 72 61 6e 73 61 63 74 69 6f 6e 28  backTransaction(
20490 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a  Parse *pParse){.
204a0 20 20 56 64 62 65 20 2a 76 3b 0a 0a 20 20 61 73    Vdbe *v;..  as
204b0 73 65 72 74 28 20 70 50 61 72 73 65 21 3d 30 20  sert( pParse!=0 
204c0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
204d0 72 73 65 2d 3e 64 62 21 3d 30 20 29 3b 0a 20 20  rse->db!=0 );.  
204e0 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43  if( sqlite3AuthC
204f0 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c  heck(pParse, SQL
20500 49 54 45 5f 54 52 41 4e 53 41 43 54 49 4f 4e 2c  ITE_TRANSACTION,
20510 20 22 52 4f 4c 4c 42 41 43 4b 22 2c 20 30 2c 20   "ROLLBACK", 0, 
20520 30 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  0) ){.    return
20530 3b 0a 20 20 7d 0a 20 20 76 20 3d 20 73 71 6c 69  ;.  }.  v = sqli
20540 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
20550 65 29 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a 20  e);.  if( v ){. 
20560 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
20570 64 4f 70 32 28 76 2c 20 4f 50 5f 41 75 74 6f 43  dOp2(v, OP_AutoC
20580 6f 6d 6d 69 74 2c 20 31 2c 20 31 29 3b 0a 20 20  ommit, 1, 1);.  
20590 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  }.}../*.** This 
205a0 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
205b0 65 64 20 62 79 20 74 68 65 20 70 61 72 73 65 72  ed by the parser
205c0 20 77 68 65 6e 20 69 74 20 70 61 72 73 65 73 20   when it parses 
205d0 61 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 63 72 65  a command to cre
205e0 61 74 65 2c 0a 2a 2a 20 72 65 6c 65 61 73 65 20  ate,.** release 
205f0 6f 72 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 20 53  or rollback an S
20600 51 4c 20 73 61 76 65 70 6f 69 6e 74 2e 20 0a 2a  QL savepoint. .*
20610 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53 61  /.void sqlite3Sa
20620 76 65 70 6f 69 6e 74 28 50 61 72 73 65 20 2a 70  vepoint(Parse *p
20630 50 61 72 73 65 2c 20 69 6e 74 20 6f 70 2c 20 54  Parse, int op, T
20640 6f 6b 65 6e 20 2a 70 4e 61 6d 65 29 7b 0a 20 20  oken *pName){.  
20650 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 73 71  char *zName = sq
20660 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b  lite3NameFromTok
20670 65 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  en(pParse->db, p
20680 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a 4e 61  Name);.  if( zNa
20690 6d 65 20 29 7b 0a 20 20 20 20 56 64 62 65 20 2a  me ){.    Vdbe *
206a0 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
206b0 62 65 28 70 50 61 72 73 65 29 3b 0a 23 69 66 6e  be(pParse);.#ifn
206c0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
206d0 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20  AUTHORIZATION.  
206e0 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63    static const c
206f0 68 61 72 20 2a 20 63 6f 6e 73 74 20 61 7a 5b 5d  har * const az[]
20700 20 3d 20 7b 20 22 42 45 47 49 4e 22 2c 20 22 52   = { "BEGIN", "R
20710 45 4c 45 41 53 45 22 2c 20 22 52 4f 4c 4c 42 41  ELEASE", "ROLLBA
20720 43 4b 22 20 7d 3b 0a 20 20 20 20 61 73 73 65 72  CK" };.    asser
20730 74 28 20 21 53 41 56 45 50 4f 49 4e 54 5f 42 45  t( !SAVEPOINT_BE
20740 47 49 4e 20 26 26 20 53 41 56 45 50 4f 49 4e 54  GIN && SAVEPOINT
20750 5f 52 45 4c 45 41 53 45 3d 3d 31 20 26 26 20 53  _RELEASE==1 && S
20760 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43  AVEPOINT_ROLLBAC
20770 4b 3d 3d 32 20 29 3b 0a 23 65 6e 64 69 66 0a 20  K==2 );.#endif. 
20780 20 20 20 69 66 28 20 21 76 20 7c 7c 20 73 71 6c     if( !v || sql
20790 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50  ite3AuthCheck(pP
207a0 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 53 41 56  arse, SQLITE_SAV
207b0 45 50 4f 49 4e 54 2c 20 61 7a 5b 6f 70 5d 2c 20  EPOINT, az[op], 
207c0 7a 4e 61 6d 65 2c 20 30 29 20 29 7b 0a 20 20 20  zName, 0) ){.   
207d0 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
207e0 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 7a 4e 61  (pParse->db, zNa
207f0 6d 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  me);.      retur
20800 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  n;.    }.    sql
20810 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
20820 2c 20 4f 50 5f 53 61 76 65 70 6f 69 6e 74 2c 20  , OP_Savepoint, 
20830 6f 70 2c 20 30 2c 20 30 2c 20 7a 4e 61 6d 65 2c  op, 0, 0, zName,
20840 20 50 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20   P4_DYNAMIC);.  
20850 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20  }.}../*.** Make 
20860 73 75 72 65 20 74 68 65 20 54 45 4d 50 20 64 61  sure the TEMP da
20870 74 61 62 61 73 65 20 69 73 20 6f 70 65 6e 20 61  tabase is open a
20880 6e 64 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72  nd available for
20890 20 75 73 65 2e 20 20 52 65 74 75 72 6e 0a 2a 2a   use.  Return.**
208a0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65   the number of e
208b0 72 72 6f 72 73 2e 20 20 4c 65 61 76 65 20 61 6e  rrors.  Leave an
208c0 79 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73  y error messages
208d0 20 69 6e 20 74 68 65 20 70 50 61 72 73 65 20 73   in the pParse s
208e0 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 69 6e 74  tructure..*/.int
208f0 20 73 71 6c 69 74 65 33 4f 70 65 6e 54 65 6d 70   sqlite3OpenTemp
20900 44 61 74 61 62 61 73 65 28 50 61 72 73 65 20 2a  Database(Parse *
20910 70 50 61 72 73 65 29 7b 0a 20 20 73 71 6c 69 74  pParse){.  sqlit
20920 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
20930 3e 64 62 3b 0a 20 20 69 66 28 20 64 62 2d 3e 61  >db;.  if( db->a
20940 44 62 5b 31 5d 2e 70 42 74 3d 3d 30 20 26 26 20  Db[1].pBt==0 && 
20950 21 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e  !pParse->explain
20960 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a   ){.    int rc;.
20970 20 20 20 20 42 74 72 65 65 20 2a 70 42 74 3b 0a      Btree *pBt;.
20980 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74      static const
20990 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 0a 20 20   int flags = .  
209a0 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f          SQLITE_O
209b0 50 45 4e 5f 52 45 41 44 57 52 49 54 45 20 7c 0a  PEN_READWRITE |.
209c0 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
209d0 5f 4f 50 45 4e 5f 43 52 45 41 54 45 20 7c 0a 20  _OPEN_CREATE |. 
209e0 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
209f0 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 20 7c  OPEN_EXCLUSIVE |
20a00 0a 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54  .          SQLIT
20a10 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43  E_OPEN_DELETEONC
20a20 4c 4f 53 45 20 7c 0a 20 20 20 20 20 20 20 20 20  LOSE |.         
20a30 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d   SQLITE_OPEN_TEM
20a40 50 5f 44 42 3b 0a 0a 20 20 20 20 72 63 20 3d 20  P_DB;..    rc = 
20a50 73 71 6c 69 74 65 33 42 74 72 65 65 4f 70 65 6e  sqlite3BtreeOpen
20a60 28 64 62 2d 3e 70 56 66 73 2c 20 30 2c 20 64 62  (db->pVfs, 0, db
20a70 2c 20 26 70 42 74 2c 20 30 2c 20 66 6c 61 67 73  , &pBt, 0, flags
20a80 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
20a90 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
20aa0 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
20ab0 67 28 70 50 61 72 73 65 2c 20 22 75 6e 61 62 6c  g(pParse, "unabl
20ac0 65 20 74 6f 20 6f 70 65 6e 20 61 20 74 65 6d 70  e to open a temp
20ad0 6f 72 61 72 79 20 64 61 74 61 62 61 73 65 20 22  orary database "
20ae0 0a 20 20 20 20 20 20 20 20 22 66 69 6c 65 20 66  .        "file f
20af0 6f 72 20 73 74 6f 72 69 6e 67 20 74 65 6d 70 6f  or storing tempo
20b00 72 61 72 79 20 74 61 62 6c 65 73 22 29 3b 0a 20  rary tables");. 
20b10 20 20 20 20 20 70 50 61 72 73 65 2d 3e 72 63 20       pParse->rc 
20b20 3d 20 72 63 3b 0a 20 20 20 20 20 20 72 65 74 75  = rc;.      retu
20b30 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 1;.    }.    
20b40 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 42 74 20 3d  db->aDb[1].pBt =
20b50 20 70 42 74 3b 0a 20 20 20 20 61 73 73 65 72 74   pBt;.    assert
20b60 28 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 53 63  ( db->aDb[1].pSc
20b70 68 65 6d 61 20 29 3b 0a 20 20 20 20 69 66 28 20  hema );.    if( 
20b80 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3d 3d 73 71  SQLITE_NOMEM==sq
20b90 6c 69 74 65 33 42 74 72 65 65 53 65 74 50 61 67  lite3BtreeSetPag
20ba0 65 53 69 7a 65 28 70 42 74 2c 20 64 62 2d 3e 6e  eSize(pBt, db->n
20bb0 65 78 74 50 61 67 65 73 69 7a 65 2c 20 2d 31 2c  extPagesize, -1,
20bc0 20 30 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c   0) ){.      sql
20bd0 69 74 65 33 4f 6f 6d 46 61 75 6c 74 28 64 62 29  ite3OomFault(db)
20be0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31  ;.      return 1
20bf0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
20c00 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
20c10 20 52 65 63 6f 72 64 20 74 68 65 20 66 61 63 74   Record the fact
20c20 20 74 68 61 74 20 74 68 65 20 73 63 68 65 6d 61   that the schema
20c30 20 63 6f 6f 6b 69 65 20 77 69 6c 6c 20 6e 65 65   cookie will nee
20c40 64 20 74 6f 20 62 65 20 76 65 72 69 66 69 65 64  d to be verified
20c50 0a 2a 2a 20 66 6f 72 20 64 61 74 61 62 61 73 65  .** for database
20c60 20 69 44 62 2e 20 20 54 68 65 20 63 6f 64 65 20   iDb.  The code 
20c70 74 6f 20 61 63 74 75 61 6c 6c 79 20 76 65 72 69  to actually veri
20c80 66 79 20 74 68 65 20 73 63 68 65 6d 61 20 63 6f  fy the schema co
20c90 6f 6b 69 65 0a 2a 2a 20 77 69 6c 6c 20 6f 63 63  okie.** will occ
20ca0 75 72 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66  ur at the end of
20cb0 20 74 68 65 20 74 6f 70 2d 6c 65 76 65 6c 20 56   the top-level V
20cc0 44 42 45 20 61 6e 64 20 77 69 6c 6c 20 62 65 20  DBE and will be 
20cd0 67 65 6e 65 72 61 74 65 64 0a 2a 2a 20 6c 61 74  generated.** lat
20ce0 65 72 2c 20 62 79 20 73 71 6c 69 74 65 33 46 69  er, by sqlite3Fi
20cf0 6e 69 73 68 43 6f 64 69 6e 67 28 29 2e 0a 2a 2f  nishCoding()..*/
20d00 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 6f 64  .void sqlite3Cod
20d10 65 56 65 72 69 66 79 53 63 68 65 6d 61 28 50 61  eVerifySchema(Pa
20d20 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74  rse *pParse, int
20d30 20 69 44 62 29 7b 0a 20 20 50 61 72 73 65 20 2a   iDb){.  Parse *
20d40 70 54 6f 70 6c 65 76 65 6c 20 3d 20 73 71 6c 69  pToplevel = sqli
20d50 74 65 33 50 61 72 73 65 54 6f 70 6c 65 76 65 6c  te3ParseToplevel
20d60 28 70 50 61 72 73 65 29 3b 0a 20 20 73 71 6c 69  (pParse);.  sqli
20d70 74 65 33 20 2a 64 62 20 3d 20 70 54 6f 70 6c 65  te3 *db = pTople
20d80 76 65 6c 2d 3e 64 62 3b 0a 0a 20 20 61 73 73 65  vel->db;..  asse
20d90 72 74 28 20 69 44 62 3e 3d 30 20 26 26 20 69 44  rt( iDb>=0 && iD
20da0 62 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 61  b<db->nDb );.  a
20db0 73 73 65 72 74 28 20 64 62 2d 3e 61 44 62 5b 69  ssert( db->aDb[i
20dc0 44 62 5d 2e 70 42 74 21 3d 30 20 7c 7c 20 69 44  Db].pBt!=0 || iD
20dd0 62 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74  b==1 );.  assert
20de0 28 20 69 44 62 3c 53 51 4c 49 54 45 5f 4d 41 58  ( iDb<SQLITE_MAX
20df0 5f 41 54 54 41 43 48 45 44 2b 32 20 29 3b 0a 20  _ATTACHED+2 );. 
20e00 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
20e10 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28  SchemaMutexHeld(
20e20 64 62 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a 20  db, iDb, 0) );. 
20e30 20 69 66 28 20 44 62 4d 61 73 6b 54 65 73 74 28   if( DbMaskTest(
20e40 70 54 6f 70 6c 65 76 65 6c 2d 3e 63 6f 6f 6b 69  pToplevel->cooki
20e50 65 4d 61 73 6b 2c 20 69 44 62 29 3d 3d 30 20 29  eMask, iDb)==0 )
20e60 7b 0a 20 20 20 20 44 62 4d 61 73 6b 53 65 74 28  {.    DbMaskSet(
20e70 70 54 6f 70 6c 65 76 65 6c 2d 3e 63 6f 6f 6b 69  pToplevel->cooki
20e80 65 4d 61 73 6b 2c 20 69 44 62 29 3b 0a 20 20 20  eMask, iDb);.   
20e90 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 63 6f 6f 6b   pToplevel->cook
20ea0 69 65 56 61 6c 75 65 5b 69 44 62 5d 20 3d 20 64  ieValue[iDb] = d
20eb0 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53 63 68  b->aDb[iDb].pSch
20ec0 65 6d 61 2d 3e 73 63 68 65 6d 61 5f 63 6f 6f 6b  ema->schema_cook
20ed0 69 65 3b 0a 20 20 20 20 69 66 28 20 21 4f 4d 49  ie;.    if( !OMI
20ee0 54 5f 54 45 4d 50 44 42 20 26 26 20 69 44 62 3d  T_TEMPDB && iDb=
20ef0 3d 31 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =1 ){.      sqli
20f00 74 65 33 4f 70 65 6e 54 65 6d 70 44 61 74 61 62  te3OpenTempDatab
20f10 61 73 65 28 70 54 6f 70 6c 65 76 65 6c 29 3b 0a  ase(pToplevel);.
20f20 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
20f30 2a 2a 20 49 66 20 61 72 67 75 6d 65 6e 74 20 7a  ** If argument z
20f40 44 62 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e  Db is NULL, then
20f50 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 43 6f 64   call sqlite3Cod
20f60 65 56 65 72 69 66 79 53 63 68 65 6d 61 28 29 20  eVerifySchema() 
20f70 66 6f 72 20 65 61 63 68 20 0a 2a 2a 20 61 74 74  for each .** att
20f80 61 63 68 65 64 20 64 61 74 61 62 61 73 65 2e 20  ached database. 
20f90 4f 74 68 65 72 77 69 73 65 2c 20 69 6e 76 6f 6b  Otherwise, invok
20fa0 65 20 69 74 20 66 6f 72 20 74 68 65 20 64 61 74  e it for the dat
20fb0 61 62 61 73 65 20 6e 61 6d 65 64 20 7a 44 62 20  abase named zDb 
20fc0 6f 6e 6c 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  only..*/.void sq
20fd0 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66 79 4e  lite3CodeVerifyN
20fe0 61 6d 65 64 53 63 68 65 6d 61 28 50 61 72 73 65  amedSchema(Parse
20ff0 20 2a 70 50 61 72 73 65 2c 20 63 6f 6e 73 74 20   *pParse, const 
21000 63 68 61 72 20 2a 7a 44 62 29 7b 0a 20 20 73 71  char *zDb){.  sq
21010 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
21020 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 69 3b  se->db;.  int i;
21030 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62  .  for(i=0; i<db
21040 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nDb; i++){.   
21050 20 44 62 20 2a 70 44 62 20 3d 20 26 64 62 2d 3e   Db *pDb = &db->
21060 61 44 62 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20  aDb[i];.    if( 
21070 70 44 62 2d 3e 70 42 74 20 26 26 20 28 21 7a 44  pDb->pBt && (!zD
21080 62 20 7c 7c 20 30 3d 3d 73 71 6c 69 74 65 33 53  b || 0==sqlite3S
21090 74 72 49 43 6d 70 28 7a 44 62 2c 20 70 44 62 2d  trICmp(zDb, pDb-
210a0 3e 7a 4e 61 6d 65 29 29 20 29 7b 0a 20 20 20 20  >zName)) ){.    
210b0 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72    sqlite3CodeVer
210c0 69 66 79 53 63 68 65 6d 61 28 70 50 61 72 73 65  ifySchema(pParse
210d0 2c 20 69 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  , i);.    }.  }.
210e0 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
210f0 65 20 56 44 42 45 20 63 6f 64 65 20 74 68 61 74  e VDBE code that
21100 20 70 72 65 70 61 72 65 73 20 66 6f 72 20 64 6f   prepares for do
21110 69 6e 67 20 61 6e 20 6f 70 65 72 61 74 69 6f 6e  ing an operation
21120 20 74 68 61 74 0a 2a 2a 20 6d 69 67 68 74 20 63   that.** might c
21130 68 61 6e 67 65 20 74 68 65 20 64 61 74 61 62 61  hange the databa
21140 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  se..**.** This r
21150 6f 75 74 69 6e 65 20 73 74 61 72 74 73 20 61 20  outine starts a 
21160 6e 65 77 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  new transaction 
21170 69 66 20 77 65 20 61 72 65 20 6e 6f 74 20 61 6c  if we are not al
21180 72 65 61 64 79 20 77 69 74 68 69 6e 0a 2a 2a 20  ready within.** 
21190 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20  a transaction.  
211a0 49 66 20 77 65 20 61 72 65 20 61 6c 72 65 61 64  If we are alread
211b0 79 20 77 69 74 68 69 6e 20 61 20 74 72 61 6e 73  y within a trans
211c0 61 63 74 69 6f 6e 2c 20 74 68 65 6e 20 61 20 63  action, then a c
211d0 68 65 63 6b 70 6f 69 6e 74 0a 2a 2a 20 69 73 20  heckpoint.** is 
211e0 73 65 74 20 69 66 20 74 68 65 20 73 65 74 53 74  set if the setSt
211f0 61 74 65 6d 65 6e 74 20 70 61 72 61 6d 65 74 65  atement paramete
21200 72 20 69 73 20 74 72 75 65 2e 20 20 41 20 63 68  r is true.  A ch
21210 65 63 6b 70 6f 69 6e 74 20 73 68 6f 75 6c 64 0a  eckpoint should.
21220 2a 2a 20 62 65 20 73 65 74 20 66 6f 72 20 6f 70  ** be set for op
21230 65 72 61 74 69 6f 6e 73 20 74 68 61 74 20 6d 69  erations that mi
21240 67 68 74 20 66 61 69 6c 20 28 64 75 65 20 74 6f  ght fail (due to
21250 20 61 20 63 6f 6e 73 74 72 61 69 6e 74 29 20 70   a constraint) p
21260 61 72 74 20 6f 66 0a 2a 2a 20 74 68 65 20 77 61  art of.** the wa
21270 79 20 74 68 72 6f 75 67 68 20 61 6e 64 20 77 68  y through and wh
21280 69 63 68 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f  ich will need to
21290 20 75 6e 64 6f 20 73 6f 6d 65 20 77 72 69 74 65   undo some write
212a0 73 20 77 69 74 68 6f 75 74 20 68 61 76 69 6e 67  s without having
212b0 20 74 6f 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20   to.** rollback 
212c0 74 68 65 20 77 68 6f 6c 65 20 74 72 61 6e 73 61  the whole transa
212d0 63 74 69 6f 6e 2e 20 20 46 6f 72 20 6f 70 65 72  ction.  For oper
212e0 61 74 69 6f 6e 73 20 77 68 65 72 65 20 61 6c 6c  ations where all
212f0 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a 2a 2a 20   constraints.** 
21300 63 61 6e 20 62 65 20 63 68 65 63 6b 65 64 20 62  can be checked b
21310 65 66 6f 72 65 20 61 6e 79 20 63 68 61 6e 67 65  efore any change
21320 73 20 61 72 65 20 6d 61 64 65 20 74 6f 20 74 68  s are made to th
21330 65 20 64 61 74 61 62 61 73 65 2c 20 69 74 20 69  e database, it i
21340 73 20 6e 65 76 65 72 0a 2a 2a 20 6e 65 63 65 73  s never.** neces
21350 73 61 72 79 20 74 6f 20 75 6e 64 6f 20 61 20 77  sary to undo a w
21360 72 69 74 65 20 61 6e 64 20 74 68 65 20 63 68 65  rite and the che
21370 63 6b 70 6f 69 6e 74 20 73 68 6f 75 6c 64 20 6e  ckpoint should n
21380 6f 74 20 62 65 20 73 65 74 2e 0a 2a 2f 0a 76 6f  ot be set..*/.vo
21390 69 64 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57  id sqlite3BeginW
213a0 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 50 61  riteOperation(Pa
213b0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74  rse *pParse, int
213c0 20 73 65 74 53 74 61 74 65 6d 65 6e 74 2c 20 69   setStatement, i
213d0 6e 74 20 69 44 62 29 7b 0a 20 20 50 61 72 73 65  nt iDb){.  Parse
213e0 20 2a 70 54 6f 70 6c 65 76 65 6c 20 3d 20 73 71   *pToplevel = sq
213f0 6c 69 74 65 33 50 61 72 73 65 54 6f 70 6c 65 76  lite3ParseToplev
21400 65 6c 28 70 50 61 72 73 65 29 3b 0a 20 20 73 71  el(pParse);.  sq
21410 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66 79 53  lite3CodeVerifyS
21420 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20 69 44  chema(pParse, iD
21430 62 29 3b 0a 20 20 44 62 4d 61 73 6b 53 65 74 28  b);.  DbMaskSet(
21440 70 54 6f 70 6c 65 76 65 6c 2d 3e 77 72 69 74 65  pToplevel->write
21450 4d 61 73 6b 2c 20 69 44 62 29 3b 0a 20 20 70 54  Mask, iDb);.  pT
21460 6f 70 6c 65 76 65 6c 2d 3e 69 73 4d 75 6c 74 69  oplevel->isMulti
21470 57 72 69 74 65 20 7c 3d 20 73 65 74 53 74 61 74  Write |= setStat
21480 65 6d 65 6e 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ement;.}../*.** 
21490 49 6e 64 69 63 61 74 65 20 74 68 61 74 20 74 68  Indicate that th
214a0 65 20 73 74 61 74 65 6d 65 6e 74 20 63 75 72 72  e statement curr
214b0 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73  ently under cons
214c0 74 72 75 63 74 69 6f 6e 20 6d 69 67 68 74 20 77  truction might w
214d0 72 69 74 65 0a 2a 2a 20 6d 6f 72 65 20 74 68 61  rite.** more tha
214e0 6e 20 6f 6e 65 20 65 6e 74 72 79 20 28 65 78 61  n one entry (exa
214f0 6d 70 6c 65 3a 20 64 65 6c 65 74 69 6e 67 20 6f  mple: deleting o
21500 6e 65 20 72 6f 77 20 74 68 65 6e 20 69 6e 73 65  ne row then inse
21510 72 74 69 6e 67 20 61 6e 6f 74 68 65 72 2c 0a 2a  rting another,.*
21520 2a 20 69 6e 73 65 72 74 69 6e 67 20 6d 75 6c 74  * inserting mult
21530 69 70 6c 65 20 72 6f 77 73 20 69 6e 20 61 20 74  iple rows in a t
21540 61 62 6c 65 2c 20 6f 72 20 69 6e 73 65 72 74 69  able, or inserti
21550 6e 67 20 61 20 72 6f 77 20 61 6e 64 20 69 6e 64  ng a row and ind
21560 65 78 20 65 6e 74 72 69 65 73 2e 29 0a 2a 2a 20  ex entries.).** 
21570 49 66 20 61 6e 20 61 62 6f 72 74 20 6f 63 63 75  If an abort occu
21580 72 73 20 61 66 74 65 72 20 73 6f 6d 65 20 6f 66  rs after some of
21590 20 74 68 65 73 65 20 77 72 69 74 65 73 20 68 61   these writes ha
215a0 76 65 20 63 6f 6d 70 6c 65 74 65 64 2c 20 74 68  ve completed, th
215b0 65 6e 20 69 74 20 77 69 6c 6c 0a 2a 2a 20 62 65  en it will.** be
215c0 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 75 6e   necessary to un
215d0 64 6f 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 64  do the completed
215e0 20 77 72 69 74 65 73 2e 0a 2a 2f 0a 76 6f 69 64   writes..*/.void
215f0 20 73 71 6c 69 74 65 33 4d 75 6c 74 69 57 72 69   sqlite3MultiWri
21600 74 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  te(Parse *pParse
21610 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 54 6f 70  ){.  Parse *pTop
21620 6c 65 76 65 6c 20 3d 20 73 71 6c 69 74 65 33 50  level = sqlite3P
21630 61 72 73 65 54 6f 70 6c 65 76 65 6c 28 70 50 61  arseToplevel(pPa
21640 72 73 65 29 3b 0a 20 20 70 54 6f 70 6c 65 76 65  rse);.  pTopleve
21650 6c 2d 3e 69 73 4d 75 6c 74 69 57 72 69 74 65 20  l->isMultiWrite 
21660 3d 20 31 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 54  = 1;.}../* .** T
21670 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74 6f  he code generato
21680 72 20 63 61 6c 6c 73 20 74 68 69 73 20 72 6f 75  r calls this rou
21690 74 69 6e 65 20 69 66 20 69 73 20 64 69 73 63 6f  tine if is disco
216a0 76 65 72 73 20 74 68 61 74 20 69 74 20 69 73 0a  vers that it is.
216b0 2a 2a 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 61  ** possible to a
216c0 62 6f 72 74 20 61 20 73 74 61 74 65 6d 65 6e 74  bort a statement
216d0 20 70 72 69 6f 72 20 74 6f 20 63 6f 6d 70 6c 65   prior to comple
216e0 74 69 6f 6e 2e 20 20 49 6e 20 6f 72 64 65 72 20  tion.  In order 
216f0 74 6f 20 0a 2a 2a 20 70 65 72 66 6f 72 6d 20 74  to .** perform t
21700 68 69 73 20 61 62 6f 72 74 20 77 69 74 68 6f 75  his abort withou
21710 74 20 63 6f 72 72 75 70 74 69 6e 67 20 74 68 65  t corrupting the
21720 20 64 61 74 61 62 61 73 65 2c 20 77 65 20 6e 65   database, we ne
21730 65 64 20 74 6f 20 6d 61 6b 65 0a 2a 2a 20 73 75  ed to make.** su
21740 72 65 20 74 68 61 74 20 74 68 65 20 73 74 61 74  re that the stat
21750 65 6d 65 6e 74 20 69 73 20 70 72 6f 74 65 63 74  ement is protect
21760 65 64 20 62 79 20 61 20 73 74 61 74 65 6d 65 6e  ed by a statemen
21770 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a  t transaction..*
21780 2a 0a 2a 2a 20 54 65 63 68 6e 69 63 61 6c 6c 79  *.** Technically
21790 2c 20 77 65 20 6f 6e 6c 79 20 6e 65 65 64 20 74  , we only need t
217a0 6f 20 73 65 74 20 74 68 65 20 6d 61 79 41 62 6f  o set the mayAbo
217b0 72 74 20 66 6c 61 67 20 69 66 20 74 68 65 0a 2a  rt flag if the.*
217c0 2a 20 69 73 4d 75 6c 74 69 57 72 69 74 65 20 66  * isMultiWrite f
217d0 6c 61 67 20 77 61 73 20 70 72 65 76 69 6f 75 73  lag was previous
217e0 6c 79 20 73 65 74 2e 20 20 54 68 65 72 65 20 69  ly set.  There i
217f0 73 20 61 20 74 69 6d 65 20 64 65 70 65 6e 64 65  s a time depende
21800 6e 63 79 0a 2a 2a 20 73 75 63 68 20 74 68 61 74  ncy.** such that
21810 20 74 68 65 20 61 62 6f 72 74 20 6d 75 73 74 20   the abort must 
21820 6f 63 63 75 72 20 61 66 74 65 72 20 74 68 65 20  occur after the 
21830 6d 75 6c 74 69 77 72 69 74 65 2e 20 20 54 68 69  multiwrite.  Thi
21840 73 20 6d 61 6b 65 73 0a 2a 2a 20 73 6f 6d 65 20  s makes.** some 
21850 73 74 61 74 65 6d 65 6e 74 73 20 69 6e 76 6f 6c  statements invol
21860 76 69 6e 67 20 74 68 65 20 52 45 50 4c 41 43 45  ving the REPLACE
21870 20 63 6f 6e 66 6c 69 63 74 20 72 65 73 6f 6c 75   conflict resolu
21880 74 69 6f 6e 20 61 6c 67 6f 72 69 74 68 6d 0a 2a  tion algorithm.*
21890 2a 20 67 6f 20 61 20 6c 69 74 74 6c 65 20 66 61  * go a little fa
218a0 73 74 65 72 2e 20 20 42 75 74 20 74 61 6b 69 6e  ster.  But takin
218b0 67 20 61 64 76 61 6e 74 61 67 65 20 6f 66 20 74  g advantage of t
218c0 68 69 73 20 74 69 6d 65 20 64 65 70 65 6e 64 65  his time depende
218d0 6e 63 79 0a 2a 2a 20 6d 61 6b 65 73 20 69 74 20  ncy.** makes it 
218e0 6d 6f 72 65 20 64 69 66 66 69 63 75 6c 74 20 74  more difficult t
218f0 6f 20 70 72 6f 76 65 20 74 68 61 74 20 74 68 65  o prove that the
21900 20 63 6f 64 65 20 69 73 20 63 6f 72 72 65 63 74   code is correct
21910 20 28 69 6e 20 0a 2a 2a 20 70 61 72 74 69 63 75   (in .** particu
21920 6c 61 72 2c 20 69 74 20 70 72 65 76 65 6e 74 73  lar, it prevents
21930 20 75 73 20 66 72 6f 6d 20 77 72 69 74 69 6e 67   us from writing
21940 20 61 6e 20 65 66 66 65 63 74 69 76 65 0a 2a 2a   an effective.**
21950 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
21960 6f 66 20 73 71 6c 69 74 65 33 41 73 73 65 72 74  of sqlite3Assert
21970 4d 61 79 41 62 6f 72 74 28 29 29 20 61 6e 64 20  MayAbort()) and 
21980 73 6f 20 77 65 20 68 61 76 65 20 63 68 6f 73 65  so we have chose
21990 6e 0a 2a 2a 20 74 6f 20 74 61 6b 65 20 74 68 65  n.** to take the
219a0 20 73 61 66 65 20 72 6f 75 74 65 20 61 6e 64 20   safe route and 
219b0 73 6b 69 70 20 74 68 65 20 6f 70 74 69 6d 69 7a  skip the optimiz
219c0 61 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ation..*/.void s
219d0 71 6c 69 74 65 33 4d 61 79 41 62 6f 72 74 28 50  qlite3MayAbort(P
219e0 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20  arse *pParse){. 
219f0 20 50 61 72 73 65 20 2a 70 54 6f 70 6c 65 76 65   Parse *pTopleve
21a00 6c 20 3d 20 73 71 6c 69 74 65 33 50 61 72 73 65  l = sqlite3Parse
21a10 54 6f 70 6c 65 76 65 6c 28 70 50 61 72 73 65 29  Toplevel(pParse)
21a20 3b 0a 20 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 6d  ;.  pToplevel->m
21a30 61 79 41 62 6f 72 74 20 3d 20 31 3b 0a 7d 0a 0a  ayAbort = 1;.}..
21a40 2f 2a 0a 2a 2a 20 43 6f 64 65 20 61 6e 20 4f 50  /*.** Code an OP
21a50 5f 48 61 6c 74 20 74 68 61 74 20 63 61 75 73 65  _Halt that cause
21a60 73 20 74 68 65 20 76 64 62 65 20 74 6f 20 72 65  s the vdbe to re
21a70 74 75 72 6e 20 61 6e 20 53 51 4c 49 54 45 5f 43  turn an SQLITE_C
21a80 4f 4e 53 54 52 41 49 4e 54 0a 2a 2a 20 65 72 72  ONSTRAINT.** err
21a90 6f 72 2e 20 54 68 65 20 6f 6e 45 72 72 6f 72 20  or. The onError 
21aa0 70 61 72 61 6d 65 74 65 72 20 64 65 74 65 72 6d  parameter determ
21ab0 69 6e 65 73 20 77 68 69 63 68 20 28 69 66 20 61  ines which (if a
21ac0 6e 79 29 20 6f 66 20 74 68 65 20 73 74 61 74 65  ny) of the state
21ad0 6d 65 6e 74 0a 2a 2a 20 61 6e 64 2f 6f 72 20 63  ment.** and/or c
21ae0 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69  urrent transacti
21af0 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63  on is rolled bac
21b00 6b 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  k..*/.void sqlit
21b10 65 33 48 61 6c 74 43 6f 6e 73 74 72 61 69 6e 74  e3HaltConstraint
21b20 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
21b30 65 2c 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67  e,    /* Parsing
21b40 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e   context */.  in
21b50 74 20 65 72 72 43 6f 64 65 2c 20 20 20 20 20 20  t errCode,      
21b60 2f 2a 20 65 78 74 65 6e 64 65 64 20 65 72 72 6f  /* extended erro
21b70 72 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20  r code */.  int 
21b80 6f 6e 45 72 72 6f 72 2c 20 20 20 20 20 20 2f 2a  onError,      /*
21b90 20 43 6f 6e 73 74 72 61 69 6e 74 20 74 79 70 65   Constraint type
21ba0 20 2a 2f 0a 20 20 63 68 61 72 20 2a 70 34 2c 20   */.  char *p4, 
21bb0 20 20 20 20 20 20 20 20 2f 2a 20 45 72 72 6f 72          /* Error
21bc0 20 6d 65 73 73 61 67 65 20 2a 2f 0a 20 20 69 38   message */.  i8
21bd0 20 70 34 74 79 70 65 2c 20 20 20 20 20 20 20 20   p4type,        
21be0 2f 2a 20 50 34 5f 53 54 41 54 49 43 20 6f 72 20  /* P4_STATIC or 
21bf0 50 34 5f 54 52 41 4e 53 49 45 4e 54 20 2a 2f 0a  P4_TRANSIENT */.
21c00 20 20 75 38 20 70 35 45 72 72 6d 73 67 20 20 20    u8 p5Errmsg   
21c10 20 20 20 20 2f 2a 20 50 35 5f 45 72 72 4d 73 67      /* P5_ErrMsg
21c20 20 74 79 70 65 20 2a 2f 0a 29 7b 0a 20 20 56 64   type */.){.  Vd
21c30 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47  be *v = sqlite3G
21c40 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
21c50 20 20 61 73 73 65 72 74 28 20 28 65 72 72 43 6f    assert( (errCo
21c60 64 65 26 30 78 66 66 29 3d 3d 53 51 4c 49 54 45  de&0xff)==SQLITE
21c70 5f 43 4f 4e 53 54 52 41 49 4e 54 20 29 3b 0a 20  _CONSTRAINT );. 
21c80 20 69 66 28 20 6f 6e 45 72 72 6f 72 3d 3d 4f 45   if( onError==OE
21c90 5f 41 62 6f 72 74 20 29 7b 0a 20 20 20 20 73 71  _Abort ){.    sq
21ca0 6c 69 74 65 33 4d 61 79 41 62 6f 72 74 28 70 50  lite3MayAbort(pP
21cb0 61 72 73 65 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  arse);.  }.  sql
21cc0 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
21cd0 2c 20 4f 50 5f 48 61 6c 74 2c 20 65 72 72 43 6f  , OP_Halt, errCo
21ce0 64 65 2c 20 6f 6e 45 72 72 6f 72 2c 20 30 2c 20  de, onError, 0, 
21cf0 70 34 2c 20 70 34 74 79 70 65 29 3b 0a 20 20 73  p4, p4type);.  s
21d00 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
21d10 50 35 28 76 2c 20 70 35 45 72 72 6d 73 67 29 3b  P5(v, p5Errmsg);
21d20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20 61  .}../*.** Code a
21d30 6e 20 4f 50 5f 48 61 6c 74 20 64 75 65 20 74 6f  n OP_Halt due to
21d40 20 55 4e 49 51 55 45 20 6f 72 20 50 52 49 4d 41   UNIQUE or PRIMA
21d50 52 59 20 4b 45 59 20 63 6f 6e 73 74 72 61 69 6e  RY KEY constrain
21d60 74 20 76 69 6f 6c 61 74 69 6f 6e 2e 0a 2a 2f 0a  t violation..*/.
21d70 76 6f 69 64 20 73 71 6c 69 74 65 33 55 6e 69 71  void sqlite3Uniq
21d80 75 65 43 6f 6e 73 74 72 61 69 6e 74 28 0a 20 20  ueConstraint(.  
21d90 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
21da0 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
21db0 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20 6f 6e  text */.  int on
21dc0 45 72 72 6f 72 2c 20 20 20 20 20 20 2f 2a 20 43  Error,      /* C
21dd0 6f 6e 73 74 72 61 69 6e 74 20 74 79 70 65 20 2a  onstraint type *
21de0 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 20  /.  Index *pIdx 
21df0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 64        /* The ind
21e00 65 78 20 74 68 61 74 20 74 72 69 67 67 65 72 73  ex that triggers
21e10 20 74 68 65 20 63 6f 6e 73 74 72 61 69 6e 74 20   the constraint 
21e20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a 45  */.){.  char *zE
21e30 72 72 3b 0a 20 20 69 6e 74 20 6a 3b 0a 20 20 53  rr;.  int j;.  S
21e40 74 72 41 63 63 75 6d 20 65 72 72 4d 73 67 3b 0a  trAccum errMsg;.
21e50 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20    Table *pTab = 
21e60 70 49 64 78 2d 3e 70 54 61 62 6c 65 3b 0a 0a 20  pIdx->pTable;.. 
21e70 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d   sqlite3StrAccum
21e80 49 6e 69 74 28 26 65 72 72 4d 73 67 2c 20 70 50  Init(&errMsg, pP
21e90 61 72 73 65 2d 3e 64 62 2c 20 30 2c 20 30 2c 20  arse->db, 0, 0, 
21ea0 32 30 30 29 3b 0a 20 20 69 66 28 20 70 49 64 78  200);.  if( pIdx
21eb0 2d 3e 61 43 6f 6c 45 78 70 72 20 29 7b 0a 20 20  ->aColExpr ){.  
21ec0 20 20 73 71 6c 69 74 65 33 58 50 72 69 6e 74 66    sqlite3XPrintf
21ed0 28 26 65 72 72 4d 73 67 2c 20 22 69 6e 64 65 78  (&errMsg, "index
21ee0 20 27 25 71 27 22 2c 20 70 49 64 78 2d 3e 7a 4e   '%q'", pIdx->zN
21ef0 61 6d 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ame);.  }else{. 
21f00 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 49     for(j=0; j<pI
21f10 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 6a 2b 2b  dx->nKeyCol; j++
21f20 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a  ){.      char *z
21f30 43 6f 6c 3b 0a 20 20 20 20 20 20 61 73 73 65 72  Col;.      asser
21f40 74 28 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d  t( pIdx->aiColum
21f50 6e 5b 6a 5d 3e 3d 30 20 29 3b 0a 20 20 20 20 20  n[j]>=0 );.     
21f60 20 7a 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 61 43   zCol = pTab->aC
21f70 6f 6c 5b 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d  ol[pIdx->aiColum
21f80 6e 5b 6a 5d 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20  n[j]].zName;.   
21f90 20 20 20 69 66 28 20 6a 20 29 20 73 71 6c 69 74     if( j ) sqlit
21fa0 65 33 53 74 72 41 63 63 75 6d 41 70 70 65 6e 64  e3StrAccumAppend
21fb0 28 26 65 72 72 4d 73 67 2c 20 22 2c 20 22 2c 20  (&errMsg, ", ", 
21fc0 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  2);.      sqlite
21fd0 33 58 50 72 69 6e 74 66 28 26 65 72 72 4d 73 67  3XPrintf(&errMsg
21fe0 2c 20 22 25 73 2e 25 73 22 2c 20 70 54 61 62 2d  , "%s.%s", pTab-
21ff0 3e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 29 3b 0a 20  >zName, zCol);. 
22000 20 20 20 7d 0a 20 20 7d 0a 20 20 7a 45 72 72 20     }.  }.  zErr 
22010 3d 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75  = sqlite3StrAccu
22020 6d 46 69 6e 69 73 68 28 26 65 72 72 4d 73 67 29  mFinish(&errMsg)
22030 3b 0a 20 20 73 71 6c 69 74 65 33 48 61 6c 74 43  ;.  sqlite3HaltC
22040 6f 6e 73 74 72 61 69 6e 74 28 70 50 61 72 73 65  onstraint(pParse
22050 2c 20 0a 20 20 20 20 49 73 50 72 69 6d 61 72 79  , .    IsPrimary
22060 4b 65 79 49 6e 64 65 78 28 70 49 64 78 29 20 3f  KeyIndex(pIdx) ?
22070 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49   SQLITE_CONSTRAI
22080 4e 54 5f 50 52 49 4d 41 52 59 4b 45 59 20 0a 20  NT_PRIMARYKEY . 
22090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
220a0 20 20 20 20 20 20 20 20 20 20 20 3a 20 53 51 4c             : SQL
220b0 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 55  ITE_CONSTRAINT_U
220c0 4e 49 51 55 45 2c 0a 20 20 20 20 6f 6e 45 72 72  NIQUE,.    onErr
220d0 6f 72 2c 20 7a 45 72 72 2c 20 50 34 5f 44 59 4e  or, zErr, P4_DYN
220e0 41 4d 49 43 2c 20 50 35 5f 43 6f 6e 73 74 72 61  AMIC, P5_Constra
220f0 69 6e 74 55 6e 69 71 75 65 29 3b 0a 7d 0a 0a 0a  intUnique);.}...
22100 2f 2a 0a 2a 2a 20 43 6f 64 65 20 61 6e 20 4f 50  /*.** Code an OP
22110 5f 48 61 6c 74 20 64 75 65 20 74 6f 20 6e 6f 6e  _Halt due to non
22120 2d 75 6e 69 71 75 65 20 72 6f 77 69 64 2e 0a 2a  -unique rowid..*
22130 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52 6f  /.void sqlite3Ro
22140 77 69 64 43 6f 6e 73 74 72 61 69 6e 74 28 0a 20  widConstraint(. 
22150 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
22160 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
22170 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20 6f  ntext */.  int o
22180 6e 45 72 72 6f 72 2c 20 20 20 20 20 20 2f 2a 20  nError,      /* 
22190 43 6f 6e 66 6c 69 63 74 20 72 65 73 6f 6c 75 74  Conflict resolut
221a0 69 6f 6e 20 61 6c 67 6f 72 69 74 68 6d 20 2a 2f  ion algorithm */
221b0 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 20  .  Table *pTab  
221c0 20 20 20 20 20 2f 2a 20 54 68 65 20 74 61 62 6c       /* The tabl
221d0 65 20 77 69 74 68 20 74 68 65 20 6e 6f 6e 2d 75  e with the non-u
221e0 6e 69 71 75 65 20 72 6f 77 69 64 20 2a 2f 20 0a  nique rowid */ .
221f0 29 7b 0a 20 20 63 68 61 72 20 2a 7a 4d 73 67 3b  ){.  char *zMsg;
22200 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 66 28  .  int rc;.  if(
22210 20 70 54 61 62 2d 3e 69 50 4b 65 79 3e 3d 30 20   pTab->iPKey>=0 
22220 29 7b 0a 20 20 20 20 7a 4d 73 67 20 3d 20 73 71  ){.    zMsg = sq
22230 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 70 50 61  lite3MPrintf(pPa
22240 72 73 65 2d 3e 64 62 2c 20 22 25 73 2e 25 73 22  rse->db, "%s.%s"
22250 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 0a 20  , pTab->zName,. 
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 20 20 70 54 61 62 2d 3e 61           pTab->a
22280 43 6f 6c 5b 70 54 61 62 2d 3e 69 50 4b 65 79 5d  Col[pTab->iPKey]
22290 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72 63 20  .zName);.    rc 
222a0 3d 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41  = SQLITE_CONSTRA
222b0 49 4e 54 5f 50 52 49 4d 41 52 59 4b 45 59 3b 0a  INT_PRIMARYKEY;.
222c0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 4d 73    }else{.    zMs
222d0 67 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e  g = sqlite3MPrin
222e0 74 66 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 22  tf(pParse->db, "
222f0 25 73 2e 72 6f 77 69 64 22 2c 20 70 54 61 62 2d  %s.rowid", pTab-
22300 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72 63 20  >zName);.    rc 
22310 3d 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41  = SQLITE_CONSTRA
22320 49 4e 54 5f 52 4f 57 49 44 3b 0a 20 20 7d 0a 20  INT_ROWID;.  }. 
22330 20 73 71 6c 69 74 65 33 48 61 6c 74 43 6f 6e 73   sqlite3HaltCons
22340 74 72 61 69 6e 74 28 70 50 61 72 73 65 2c 20 72  traint(pParse, r
22350 63 2c 20 6f 6e 45 72 72 6f 72 2c 20 7a 4d 73 67  c, onError, zMsg
22360 2c 20 50 34 5f 44 59 4e 41 4d 49 43 2c 0a 20 20  , P4_DYNAMIC,.  
22370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22380 20 20 20 20 20 20 50 35 5f 43 6f 6e 73 74 72 61        P5_Constra
22390 69 6e 74 55 6e 69 71 75 65 29 3b 0a 7d 0a 0a 2f  intUnique);.}../
223a0 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73 65  *.** Check to se
223b0 65 20 69 66 20 70 49 6e 64 65 78 20 75 73 65 73  e if pIndex uses
223c0 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73   the collating s
223d0 65 71 75 65 6e 63 65 20 70 43 6f 6c 6c 2e 20 20  equence pColl.  
223e0 52 65 74 75 72 6e 0a 2a 2a 20 74 72 75 65 20 69  Return.** true i
223f0 66 20 69 74 20 64 6f 65 73 20 61 6e 64 20 66 61  f it does and fa
22400 6c 73 65 20 69 66 20 69 74 20 64 6f 65 73 20 6e  lse if it does n
22410 6f 74 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53  ot..*/.#ifndef S
22420 51 4c 49 54 45 5f 4f 4d 49 54 5f 52 45 49 4e 44  QLITE_OMIT_REIND
22430 45 58 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f  EX.static int co
22440 6c 6c 61 74 69 6f 6e 4d 61 74 63 68 28 63 6f 6e  llationMatch(con
22450 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 2c 20  st char *zColl, 
22460 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 29 7b 0a  Index *pIndex){.
22470 20 20 69 6e 74 20 69 3b 0a 20 20 61 73 73 65 72    int i;.  asser
22480 74 28 20 7a 43 6f 6c 6c 21 3d 30 20 29 3b 0a 20  t( zColl!=0 );. 
22490 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 6e 64   for(i=0; i<pInd
224a0 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b  ex->nColumn; i++
224b0 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  ){.    const cha
224c0 72 20 2a 7a 20 3d 20 70 49 6e 64 65 78 2d 3e 61  r *z = pIndex->a
224d0 7a 43 6f 6c 6c 5b 69 5d 3b 0a 20 20 20 20 61 73  zColl[i];.    as
224e0 73 65 72 74 28 20 7a 21 3d 30 20 7c 7c 20 70 49  sert( z!=0 || pI
224f0 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69  ndex->aiColumn[i
22500 5d 3c 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70  ]<0 );.    if( p
22510 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b  Index->aiColumn[
22520 69 5d 3e 3d 30 20 26 26 20 30 3d 3d 73 71 6c 69  i]>=0 && 0==sqli
22530 74 65 33 53 74 72 49 43 6d 70 28 7a 2c 20 7a 43  te3StrICmp(z, zC
22540 6f 6c 6c 29 20 29 7b 0a 20 20 20 20 20 20 72 65  oll) ){.      re
22550 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20  turn 1;.    }.  
22560 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
22570 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65  #endif../*.** Re
22580 63 6f 6d 70 75 74 65 20 61 6c 6c 20 69 6e 64 69  compute all indi
22590 63 65 73 20 6f 66 20 70 54 61 62 20 74 68 61 74  ces of pTab that
225a0 20 75 73 65 20 74 68 65 20 63 6f 6c 6c 61 74 69   use the collati
225b0 6e 67 20 73 65 71 75 65 6e 63 65 20 70 43 6f 6c  ng sequence pCol
225c0 6c 2e 0a 2a 2a 20 49 66 20 70 43 6f 6c 6c 3d 3d  l..** If pColl==
225d0 30 20 74 68 65 6e 20 72 65 63 6f 6d 70 75 74 65  0 then recompute
225e0 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 6f 66 20   all indices of 
225f0 70 54 61 62 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  pTab..*/.#ifndef
22600 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 52 45 49   SQLITE_OMIT_REI
22610 4e 44 45 58 0a 73 74 61 74 69 63 20 76 6f 69 64  NDEX.static void
22620 20 72 65 69 6e 64 65 78 54 61 62 6c 65 28 50 61   reindexTable(Pa
22630 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 61 62  rse *pParse, Tab
22640 6c 65 20 2a 70 54 61 62 2c 20 63 68 61 72 20 63  le *pTab, char c
22650 6f 6e 73 74 20 2a 7a 43 6f 6c 6c 29 7b 0a 20 20  onst *zColl){.  
22660 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b 20 20  Index *pIndex;  
22670 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
22680 6e 20 69 6e 64 65 78 20 61 73 73 6f 63 69 61 74  n index associat
22690 65 64 20 77 69 74 68 20 70 54 61 62 20 2a 2f 0a  ed with pTab */.
226a0 0a 20 20 66 6f 72 28 70 49 6e 64 65 78 3d 70 54  .  for(pIndex=pT
226b0 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 6e 64  ab->pIndex; pInd
226c0 65 78 3b 20 70 49 6e 64 65 78 3d 70 49 6e 64 65  ex; pIndex=pInde
226d0 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69  x->pNext){.    i
226e0 66 28 20 7a 43 6f 6c 6c 3d 3d 30 20 7c 7c 20 63  f( zColl==0 || c
226f0 6f 6c 6c 61 74 69 6f 6e 4d 61 74 63 68 28 7a 43  ollationMatch(zC
22700 6f 6c 6c 2c 20 70 49 6e 64 65 78 29 20 29 7b 0a  oll, pIndex) ){.
22710 20 20 20 20 20 20 69 6e 74 20 69 44 62 20 3d 20        int iDb = 
22720 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49  sqlite3SchemaToI
22730 6e 64 65 78 28 70 50 61 72 73 65 2d 3e 64 62 2c  ndex(pParse->db,
22740 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b   pTab->pSchema);
22750 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 65  .      sqlite3Be
22760 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f  ginWriteOperatio
22770 6e 28 70 50 61 72 73 65 2c 20 30 2c 20 69 44 62  n(pParse, 0, iDb
22780 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
22790 52 65 66 69 6c 6c 49 6e 64 65 78 28 70 50 61 72  RefillIndex(pPar
227a0 73 65 2c 20 70 49 6e 64 65 78 2c 20 2d 31 29 3b  se, pIndex, -1);
227b0 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e  .    }.  }.}.#en
227c0 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6f 6d  dif../*.** Recom
227d0 70 75 74 65 20 61 6c 6c 20 69 6e 64 69 63 65 73  pute all indices
227e0 20 6f 66 20 61 6c 6c 20 74 61 62 6c 65 73 20 69   of all tables i
227f0 6e 20 61 6c 6c 20 64 61 74 61 62 61 73 65 73 20  n all databases 
22800 77 68 65 72 65 20 74 68 65 0a 2a 2a 20 69 6e 64  where the.** ind
22810 69 63 65 73 20 75 73 65 20 74 68 65 20 63 6f 6c  ices use the col
22820 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20  lating sequence 
22830 70 43 6f 6c 6c 2e 20 20 49 66 20 70 43 6f 6c 6c  pColl.  If pColl
22840 3d 3d 30 20 74 68 65 6e 20 72 65 63 6f 6d 70 75  ==0 then recompu
22850 74 65 0a 2a 2a 20 61 6c 6c 20 69 6e 64 69 63 65  te.** all indice
22860 73 20 65 76 65 72 79 77 68 65 72 65 2e 0a 2a 2f  s everywhere..*/
22870 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
22880 4f 4d 49 54 5f 52 45 49 4e 44 45 58 0a 73 74 61  OMIT_REINDEX.sta
22890 74 69 63 20 76 6f 69 64 20 72 65 69 6e 64 65 78  tic void reindex
228a0 44 61 74 61 62 61 73 65 73 28 50 61 72 73 65 20  Databases(Parse 
228b0 2a 70 50 61 72 73 65 2c 20 63 68 61 72 20 63 6f  *pParse, char co
228c0 6e 73 74 20 2a 7a 43 6f 6c 6c 29 7b 0a 20 20 44  nst *zColl){.  D
228d0 62 20 2a 70 44 62 3b 20 20 20 20 20 20 20 20 20  b *pDb;         
228e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20             /* A 
228f0 73 69 6e 67 6c 65 20 64 61 74 61 62 61 73 65 20  single database 
22900 2a 2f 0a 20 20 69 6e 74 20 69 44 62 3b 20 20 20  */.  int iDb;   
22910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22920 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65   /* The database
22930 20 69 6e 64 65 78 20 6e 75 6d 62 65 72 20 2a 2f   index number */
22940 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
22950 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 20 2f   pParse->db;   /
22960 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 63  * The database c
22970 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 48  onnection */.  H
22980 61 73 68 45 6c 65 6d 20 2a 6b 3b 20 20 20 20 20  ashElem *k;     
22990 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f             /* Fo
229a0 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 74  r looping over t
229b0 61 62 6c 65 73 20 69 6e 20 70 44 62 20 2a 2f 0a  ables in pDb */.
229c0 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 20 20    Table *pTab;  
229d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
229e0 20 41 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20   A table in the 
229f0 64 61 74 61 62 61 73 65 20 2a 2f 0a 0a 20 20 61  database */..  a
22a00 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74  ssert( sqlite3Bt
22a10 72 65 65 48 6f 6c 64 73 41 6c 6c 4d 75 74 65 78  reeHoldsAllMutex
22a20 65 73 28 64 62 29 20 29 3b 20 20 2f 2a 20 4e 65  es(db) );  /* Ne
22a30 65 64 65 64 20 66 6f 72 20 73 63 68 65 6d 61 20  eded for schema 
22a40 61 63 63 65 73 73 20 2a 2f 0a 20 20 66 6f 72 28  access */.  for(
22a50 69 44 62 3d 30 2c 20 70 44 62 3d 64 62 2d 3e 61  iDb=0, pDb=db->a
22a60 44 62 3b 20 69 44 62 3c 64 62 2d 3e 6e 44 62 3b  Db; iDb<db->nDb;
22a70 20 69 44 62 2b 2b 2c 20 70 44 62 2b 2b 29 7b 0a   iDb++, pDb++){.
22a80 20 20 20 20 61 73 73 65 72 74 28 20 70 44 62 21      assert( pDb!
22a90 3d 30 20 29 3b 0a 20 20 20 20 66 6f 72 28 6b 3d  =0 );.    for(k=
22aa0 73 71 6c 69 74 65 48 61 73 68 46 69 72 73 74 28  sqliteHashFirst(
22ab0 26 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 74  &pDb->pSchema->t
22ac0 62 6c 48 61 73 68 29 3b 20 20 6b 3b 20 6b 3d 73  blHash);  k; k=s
22ad0 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28 6b 29  qliteHashNext(k)
22ae0 29 7b 0a 20 20 20 20 20 20 70 54 61 62 20 3d 20  ){.      pTab = 
22af0 28 54 61 62 6c 65 2a 29 73 71 6c 69 74 65 48 61  (Table*)sqliteHa
22b00 73 68 44 61 74 61 28 6b 29 3b 0a 20 20 20 20 20  shData(k);.     
22b10 20 72 65 69 6e 64 65 78 54 61 62 6c 65 28 70 50   reindexTable(pP
22b20 61 72 73 65 2c 20 70 54 61 62 2c 20 7a 43 6f 6c  arse, pTab, zCol
22b30 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  l);.    }.  }.}.
22b40 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 47 65  #endif../*.** Ge
22b50 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20  nerate code for 
22b60 74 68 65 20 52 45 49 4e 44 45 58 20 63 6f 6d 6d  the REINDEX comm
22b70 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  and..**.**      
22b80 20 20 52 45 49 4e 44 45 58 20 20 20 20 20 20 20    REINDEX       
22b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22ba0 20 20 20 20 20 2d 2d 20 31 0a 2a 2a 20 20 20 20       -- 1.**    
22bb0 20 20 20 20 52 45 49 4e 44 45 58 20 20 3c 63 6f      REINDEX  <co
22bc0 6c 6c 61 74 69 6f 6e 3e 20 20 20 20 20 20 20 20  llation>        
22bd0 20 20 20 20 20 20 20 2d 2d 20 32 0a 2a 2a 20 20         -- 2.**  
22be0 20 20 20 20 20 20 52 45 49 4e 44 45 58 20 20 3f        REINDEX  ?
22bf0 3c 64 61 74 61 62 61 73 65 3e 2e 3f 3c 74 61 62  <database>.?<tab
22c00 6c 65 6e 61 6d 65 3e 20 20 2d 2d 20 33 0a 2a 2a  lename>  -- 3.**
22c10 20 20 20 20 20 20 20 20 52 45 49 4e 44 45 58 20          REINDEX 
22c20 20 3f 3c 64 61 74 61 62 61 73 65 3e 2e 3f 3c 69   ?<database>.?<i
22c30 6e 64 65 78 6e 61 6d 65 3e 20 20 2d 2d 20 34 0a  ndexname>  -- 4.
22c40 2a 2a 0a 2a 2a 20 46 6f 72 6d 20 31 20 63 61 75  **.** Form 1 cau
22c50 73 65 73 20 61 6c 6c 20 69 6e 64 69 63 65 73 20  ses all indices 
22c60 69 6e 20 61 6c 6c 20 61 74 74 61 63 68 65 64 20  in all attached 
22c70 64 61 74 61 62 61 73 65 73 20 74 6f 20 62 65 20  databases to be 
22c80 72 65 62 75 69 6c 74 2e 0a 2a 2a 20 46 6f 72 6d  rebuilt..** Form
22c90 20 32 20 72 65 62 75 69 6c 64 73 20 61 6c 6c 20   2 rebuilds all 
22ca0 69 6e 64 69 63 65 73 20 69 6e 20 61 6c 6c 20 64  indices in all d
22cb0 61 74 61 62 61 73 65 73 20 74 68 61 74 20 75 73  atabases that us
22cc0 65 20 74 68 65 20 6e 61 6d 65 64 0a 2a 2a 20 63  e the named.** c
22cd0 6f 6c 6c 61 74 69 6e 67 20 66 75 6e 63 74 69 6f  ollating functio
22ce0 6e 2e 20 20 46 6f 72 6d 73 20 33 20 61 6e 64 20  n.  Forms 3 and 
22cf0 34 20 72 65 62 75 69 6c 64 20 74 68 65 20 6e 61  4 rebuild the na
22d00 6d 65 64 20 69 6e 64 65 78 20 6f 72 20 61 6c 6c  med index or all
22d10 0a 2a 2a 20 69 6e 64 69 63 65 73 20 61 73 73 6f  .** indices asso
22d20 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20  ciated with the 
22d30 6e 61 6d 65 64 20 74 61 62 6c 65 2e 0a 2a 2f 0a  named table..*/.
22d40 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
22d50 4d 49 54 5f 52 45 49 4e 44 45 58 0a 76 6f 69 64  MIT_REINDEX.void
22d60 20 73 71 6c 69 74 65 33 52 65 69 6e 64 65 78 28   sqlite3Reindex(
22d70 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54  Parse *pParse, T
22d80 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c 20 54 6f  oken *pName1, To
22d90 6b 65 6e 20 2a 70 4e 61 6d 65 32 29 7b 0a 20 20  ken *pName2){.  
22da0 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 20  CollSeq *pColl; 
22db0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
22dc0 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
22dd0 65 20 74 6f 20 62 65 20 72 65 69 6e 64 65 78 65  e to be reindexe
22de0 64 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20  d, or NULL */.  
22df0 63 68 61 72 20 2a 7a 3b 20 20 20 20 20 20 20 20  char *z;        
22e00 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
22e10 61 6d 65 20 6f 66 20 61 20 74 61 62 6c 65 20 6f  ame of a table o
22e20 72 20 69 6e 64 65 78 20 2a 2f 0a 20 20 63 6f 6e  r index */.  con
22e30 73 74 20 63 68 61 72 20 2a 7a 44 62 3b 20 20 20  st char *zDb;   
22e40 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
22e50 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
22e60 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61   */.  Table *pTa
22e70 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
22e80 20 20 2f 2a 20 41 20 74 61 62 6c 65 20 69 6e 20    /* A table in 
22e90 74 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  the database */.
22ea0 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b    Index *pIndex;
22eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
22ec0 20 41 6e 20 69 6e 64 65 78 20 61 73 73 6f 63 69   An index associ
22ed0 61 74 65 64 20 77 69 74 68 20 70 54 61 62 20 2a  ated with pTab *
22ee0 2f 0a 20 20 69 6e 74 20 69 44 62 3b 20 20 20 20  /.  int iDb;    
22ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22f00 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20  /* The database 
22f10 69 6e 64 65 78 20 6e 75 6d 62 65 72 20 2a 2f 0a  index number */.
22f20 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
22f30 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 20 2f 2a  pParse->db;   /*
22f40 20 54 68 65 20 64 61 74 61 62 61 73 65 20 63 6f   The database co
22f50 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 6f  nnection */.  To
22f60 6b 65 6e 20 2a 70 4f 62 6a 4e 61 6d 65 3b 20 20  ken *pObjName;  
22f70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
22f80 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 6f  e of the table o
22f90 72 20 69 6e 64 65 78 20 74 6f 20 62 65 20 72 65  r index to be re
22fa0 69 6e 64 65 78 65 64 20 2a 2f 0a 0a 20 20 2f 2a  indexed */..  /*
22fb0 20 52 65 61 64 20 74 68 65 20 64 61 74 61 62 61   Read the databa
22fc0 73 65 20 73 63 68 65 6d 61 2e 20 49 66 20 61 6e  se schema. If an
22fd0 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 6c   error occurs, l
22fe0 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65  eave an error me
22ff0 73 73 61 67 65 0a 20 20 2a 2a 20 61 6e 64 20 63  ssage.  ** and c
23000 6f 64 65 20 69 6e 20 70 50 61 72 73 65 20 61 6e  ode in pParse an
23010 64 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 20 2a  d return NULL. *
23020 2f 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f  /.  if( SQLITE_O
23030 4b 21 3d 73 71 6c 69 74 65 33 52 65 61 64 53 63  K!=sqlite3ReadSc
23040 68 65 6d 61 28 70 50 61 72 73 65 29 20 29 7b 0a  hema(pParse) ){.
23050 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
23060 0a 20 20 69 66 28 20 70 4e 61 6d 65 31 3d 3d 30  .  if( pName1==0
23070 20 29 7b 0a 20 20 20 20 72 65 69 6e 64 65 78 44   ){.    reindexD
23080 61 74 61 62 61 73 65 73 28 70 50 61 72 73 65 2c  atabases(pParse,
23090 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b   0);.    return;
230a0 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 4e 45 56  .  }else if( NEV
230b0 45 52 28 70 4e 61 6d 65 32 3d 3d 30 29 20 7c 7c  ER(pName2==0) ||
230c0 20 70 4e 61 6d 65 32 2d 3e 7a 3d 3d 30 20 29 7b   pName2->z==0 ){
230d0 0a 20 20 20 20 63 68 61 72 20 2a 7a 43 6f 6c 6c  .    char *zColl
230e0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4e  ;.    assert( pN
230f0 61 6d 65 31 2d 3e 7a 20 29 3b 0a 20 20 20 20 7a  ame1->z );.    z
23100 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 4e 61  Coll = sqlite3Na
23110 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 50 61 72  meFromToken(pPar
23120 73 65 2d 3e 64 62 2c 20 70 4e 61 6d 65 31 29 3b  se->db, pName1);
23130 0a 20 20 20 20 69 66 28 20 21 7a 43 6f 6c 6c 20  .    if( !zColl 
23140 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 70 43  ) return;.    pC
23150 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 46 69 6e  oll = sqlite3Fin
23160 64 43 6f 6c 6c 53 65 71 28 64 62 2c 20 45 4e 43  dCollSeq(db, ENC
23170 28 64 62 29 2c 20 7a 43 6f 6c 6c 2c 20 30 29 3b  (db), zColl, 0);
23180 0a 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 20 29  .    if( pColl )
23190 7b 0a 20 20 20 20 20 20 72 65 69 6e 64 65 78 44  {.      reindexD
231a0 61 74 61 62 61 73 65 73 28 70 50 61 72 73 65 2c  atabases(pParse,
231b0 20 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20 20 20 73   zColl);.      s
231c0 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
231d0 20 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20 20 20 72   zColl);.      r
231e0 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20  eturn;.    }.   
231f0 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
23200 62 2c 20 7a 43 6f 6c 6c 29 3b 0a 20 20 7d 0a 20  b, zColl);.  }. 
23210 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 54 77   iDb = sqlite3Tw
23220 6f 50 61 72 74 4e 61 6d 65 28 70 50 61 72 73 65  oPartName(pParse
23230 2c 20 70 4e 61 6d 65 31 2c 20 70 4e 61 6d 65 32  , pName1, pName2
23240 2c 20 26 70 4f 62 6a 4e 61 6d 65 29 3b 0a 20 20  , &pObjName);.  
23250 69 66 28 20 69 44 62 3c 30 20 29 20 72 65 74 75  if( iDb<0 ) retu
23260 72 6e 3b 0a 20 20 7a 20 3d 20 73 71 6c 69 74 65  rn;.  z = sqlite
23270 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64  3NameFromToken(d
23280 62 2c 20 70 4f 62 6a 4e 61 6d 65 29 3b 0a 20 20  b, pObjName);.  
23290 69 66 28 20 7a 3d 3d 30 20 29 20 72 65 74 75 72  if( z==0 ) retur
232a0 6e 3b 0a 20 20 7a 44 62 20 3d 20 64 62 2d 3e 61  n;.  zDb = db->a
232b0 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20  Db[iDb].zName;. 
232c0 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33 46   pTab = sqlite3F
232d0 69 6e 64 54 61 62 6c 65 28 64 62 2c 20 7a 2c 20  indTable(db, z, 
232e0 7a 44 62 29 3b 0a 20 20 69 66 28 20 70 54 61 62  zDb);.  if( pTab
232f0 20 29 7b 0a 20 20 20 20 72 65 69 6e 64 65 78 54   ){.    reindexT
23300 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70 54 61  able(pParse, pTa
23310 62 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  b, 0);.    sqlit
23320 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 29 3b  e3DbFree(db, z);
23330 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
23340 0a 20 20 70 49 6e 64 65 78 20 3d 20 73 71 6c 69  .  pIndex = sqli
23350 74 65 33 46 69 6e 64 49 6e 64 65 78 28 64 62 2c  te3FindIndex(db,
23360 20 7a 2c 20 7a 44 62 29 3b 0a 20 20 73 71 6c 69   z, zDb);.  sqli
23370 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 29  te3DbFree(db, z)
23380 3b 0a 20 20 69 66 28 20 70 49 6e 64 65 78 20 29  ;.  if( pIndex )
23390 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65 67  {.    sqlite3Beg
233a0 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e  inWriteOperation
233b0 28 70 50 61 72 73 65 2c 20 30 2c 20 69 44 62 29  (pParse, 0, iDb)
233c0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 66  ;.    sqlite3Ref
233d0 69 6c 6c 49 6e 64 65 78 28 70 50 61 72 73 65 2c  illIndex(pParse,
233e0 20 70 49 6e 64 65 78 2c 20 2d 31 29 3b 0a 20 20   pIndex, -1);.  
233f0 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
23400 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
23410 70 50 61 72 73 65 2c 20 22 75 6e 61 62 6c 65 20  pParse, "unable 
23420 74 6f 20 69 64 65 6e 74 69 66 79 20 74 68 65 20  to identify the 
23430 6f 62 6a 65 63 74 20 74 6f 20 62 65 20 72 65 69  object to be rei
23440 6e 64 65 78 65 64 22 29 3b 0a 7d 0a 23 65 6e 64  ndexed");.}.#end
23450 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  if../*.** Return
23460 20 61 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63   a KeyInfo struc
23470 74 75 72 65 20 74 68 61 74 20 69 73 20 61 70 70  ture that is app
23480 72 6f 70 72 69 61 74 65 20 66 6f 72 20 74 68 65  ropriate for the
23490 20 67 69 76 65 6e 20 49 6e 64 65 78 2e 0a 2a 2a   given Index..**
234a0 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 73  .** The caller s
234b0 68 6f 75 6c 64 20 69 6e 76 6f 6b 65 20 73 71 6c  hould invoke sql
234c0 69 74 65 33 4b 65 79 49 6e 66 6f 55 6e 72 65 66  ite3KeyInfoUnref
234d0 28 29 20 6f 6e 20 74 68 65 20 72 65 74 75 72 6e  () on the return
234e0 65 64 20 6f 62 6a 65 63 74 0a 2a 2a 20 77 68 65  ed object.** whe
234f0 6e 20 69 74 20 68 61 73 20 66 69 6e 69 73 68 65  n it has finishe
23500 64 20 75 73 69 6e 67 20 69 74 2e 0a 2a 2f 0a 4b  d using it..*/.K
23510 65 79 49 6e 66 6f 20 2a 73 71 6c 69 74 65 33 4b  eyInfo *sqlite3K
23520 65 79 49 6e 66 6f 4f 66 49 6e 64 65 78 28 50 61  eyInfoOfIndex(Pa
23530 72 73 65 20 2a 70 50 61 72 73 65 2c 20 49 6e 64  rse *pParse, Ind
23540 65 78 20 2a 70 49 64 78 29 7b 0a 20 20 69 6e 74  ex *pIdx){.  int
23550 20 69 3b 0a 20 20 69 6e 74 20 6e 43 6f 6c 20 3d   i;.  int nCol =
23560 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 0a   pIdx->nColumn;.
23570 20 20 69 6e 74 20 6e 4b 65 79 20 3d 20 70 49 64    int nKey = pId
23580 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 0a 20 20 4b 65  x->nKeyCol;.  Ke
23590 79 49 6e 66 6f 20 2a 70 4b 65 79 3b 0a 20 20 69  yInfo *pKey;.  i
235a0 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20  f( pParse->nErr 
235b0 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66  ) return 0;.  if
235c0 28 20 70 49 64 78 2d 3e 75 6e 69 71 4e 6f 74 4e  ( pIdx->uniqNotN
235d0 75 6c 6c 20 29 7b 0a 20 20 20 20 70 4b 65 79 20  ull ){.    pKey 
235e0 3d 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f  = sqlite3KeyInfo
235f0 41 6c 6c 6f 63 28 70 50 61 72 73 65 2d 3e 64 62  Alloc(pParse->db
23600 2c 20 6e 4b 65 79 2c 20 6e 43 6f 6c 2d 6e 4b 65  , nKey, nCol-nKe
23610 79 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  y);.  }else{.   
23620 20 70 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 4b   pKey = sqlite3K
23630 65 79 49 6e 66 6f 41 6c 6c 6f 63 28 70 50 61 72  eyInfoAlloc(pPar
23640 73 65 2d 3e 64 62 2c 20 6e 43 6f 6c 2c 20 30 29  se->db, nCol, 0)
23650 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 4b 65 79  ;.  }.  if( pKey
23660 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
23670 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 49 73  sqlite3KeyInfoIs
23680 57 72 69 74 65 61 62 6c 65 28 70 4b 65 79 29 20  Writeable(pKey) 
23690 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  );.    for(i=0; 
236a0 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  i<nCol; i++){.  
236b0 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
236c0 7a 43 6f 6c 6c 20 3d 20 70 49 64 78 2d 3e 61 7a  zColl = pIdx->az
236d0 43 6f 6c 6c 5b 69 5d 3b 0a 20 20 20 20 20 20 70  Coll[i];.      p
236e0 4b 65 79 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d 20  Key->aColl[i] = 
236f0 7a 43 6f 6c 6c 3d 3d 73 71 6c 69 74 65 33 53 74  zColl==sqlite3St
23700 72 42 49 4e 41 52 59 20 3f 20 30 20 3a 0a 20 20  rBINARY ? 0 :.  
23710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23720 20 20 20 20 20 20 73 71 6c 69 74 65 33 4c 6f 63        sqlite3Loc
23730 61 74 65 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  ateCollSeq(pPars
23740 65 2c 20 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20 20  e, zColl);.     
23750 20 70 4b 65 79 2d 3e 61 53 6f 72 74 4f 72 64 65   pKey->aSortOrde
23760 72 5b 69 5d 20 3d 20 70 49 64 78 2d 3e 61 53 6f  r[i] = pIdx->aSo
23770 72 74 4f 72 64 65 72 5b 69 5d 3b 0a 20 20 20 20  rtOrder[i];.    
23780 7d 0a 20 20 20 20 69 66 28 20 70 50 61 72 73 65  }.    if( pParse
23790 2d 3e 6e 45 72 72 20 29 7b 0a 20 20 20 20 20 20  ->nErr ){.      
237a0 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 55 6e  sqlite3KeyInfoUn
237b0 72 65 66 28 70 4b 65 79 29 3b 0a 20 20 20 20 20  ref(pKey);.     
237c0 20 70 4b 65 79 20 3d 20 30 3b 0a 20 20 20 20 7d   pKey = 0;.    }
237d0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4b  .  }.  return pK
237e0 65 79 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53  ey;.}..#ifndef S
237f0 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45 0a 2f  QLITE_OMIT_CTE./
23800 2a 20 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  * .** This routi
23810 6e 65 20 69 73 20 69 6e 76 6f 6b 65 64 20 6f 6e  ne is invoked on
23820 63 65 20 70 65 72 20 43 54 45 20 62 79 20 74 68  ce per CTE by th
23830 65 20 70 61 72 73 65 72 20 77 68 69 6c 65 20 70  e parser while p
23840 61 72 73 69 6e 67 20 61 20 0a 2a 2a 20 57 49 54  arsing a .** WIT
23850 48 20 63 6c 61 75 73 65 2e 20 0a 2a 2f 0a 57 69  H clause. .*/.Wi
23860 74 68 20 2a 73 71 6c 69 74 65 33 57 69 74 68 41  th *sqlite3WithA
23870 64 64 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  dd(.  Parse *pPa
23880 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  rse,          /*
23890 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
238a0 20 2a 2f 0a 20 20 57 69 74 68 20 2a 70 57 69 74   */.  With *pWit
238b0 68 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  h,            /*
238c0 20 45 78 69 73 74 69 6e 67 20 57 49 54 48 20 63   Existing WITH c
238d0 6c 61 75 73 65 2c 20 6f 72 20 4e 55 4c 4c 20 2a  lause, or NULL *
238e0 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65  /.  Token *pName
238f0 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  ,           /* N
23900 61 6d 65 20 6f 66 20 74 68 65 20 63 6f 6d 6d 6f  ame of the commo
23910 6e 2d 74 61 62 6c 65 20 2a 2f 0a 20 20 45 78 70  n-table */.  Exp
23920 72 4c 69 73 74 20 2a 70 41 72 67 6c 69 73 74 2c  rList *pArglist,
23930 20 20 20 20 20 2f 2a 20 4f 70 74 69 6f 6e 61 6c       /* Optional
23940 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 6c 69 73   column name lis
23950 74 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20  t for the table 
23960 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 51 75  */.  Select *pQu
23970 65 72 79 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ery          /* 
23980 51 75 65 72 79 20 75 73 65 64 20 74 6f 20 69 6e  Query used to in
23990 69 74 69 61 6c 69 7a 65 20 74 68 65 20 74 61 62  itialize the tab
239a0 6c 65 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74  le */.){.  sqlit
239b0 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
239c0 3e 64 62 3b 0a 20 20 57 69 74 68 20 2a 70 4e 65  >db;.  With *pNe
239d0 77 3b 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65  w;.  char *zName
239e0 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68  ;..  /* Check th
239f0 61 74 20 74 68 65 20 43 54 45 20 6e 61 6d 65 20  at the CTE name 
23a00 69 73 20 75 6e 69 71 75 65 20 77 69 74 68 69 6e  is unique within
23a10 20 74 68 69 73 20 57 49 54 48 20 63 6c 61 75 73   this WITH claus
23a20 65 2e 20 49 66 0a 20 20 2a 2a 20 6e 6f 74 2c 20  e. If.  ** not, 
23a30 73 74 6f 72 65 20 61 6e 20 65 72 72 6f 72 20 69  store an error i
23a40 6e 20 74 68 65 20 50 61 72 73 65 20 73 74 72 75  n the Parse stru
23a50 63 74 75 72 65 2e 20 2a 2f 0a 20 20 7a 4e 61 6d  cture. */.  zNam
23a60 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46  e = sqlite3NameF
23a70 72 6f 6d 54 6f 6b 65 6e 28 70 50 61 72 73 65 2d  romToken(pParse-
23a80 3e 64 62 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 69  >db, pName);.  i
23a90 66 28 20 7a 4e 61 6d 65 20 26 26 20 70 57 69 74  f( zName && pWit
23aa0 68 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  h ){.    int i;.
23ab0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
23ac0 57 69 74 68 2d 3e 6e 43 74 65 3b 20 69 2b 2b 29  With->nCte; i++)
23ad0 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  {.      if( sqli
23ae0 74 65 33 53 74 72 49 43 6d 70 28 7a 4e 61 6d 65  te3StrICmp(zName
23af0 2c 20 70 57 69 74 68 2d 3e 61 5b 69 5d 2e 7a 4e  , pWith->a[i].zN
23b00 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ame)==0 ){.     
23b10 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
23b20 73 67 28 70 50 61 72 73 65 2c 20 22 64 75 70 6c  sg(pParse, "dupl
23b30 69 63 61 74 65 20 57 49 54 48 20 74 61 62 6c 65  icate WITH table
23b40 20 6e 61 6d 65 3a 20 25 73 22 2c 20 7a 4e 61 6d   name: %s", zNam
23b50 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e);.      }.    
23b60 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 57 69  }.  }..  if( pWi
23b70 74 68 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 42  th ){.    int nB
23b80 79 74 65 20 3d 20 73 69 7a 65 6f 66 28 2a 70 57  yte = sizeof(*pW
23b90 69 74 68 29 20 2b 20 28 73 69 7a 65 6f 66 28 70  ith) + (sizeof(p
23ba0 57 69 74 68 2d 3e 61 5b 31 5d 29 20 2a 20 70 57  With->a[1]) * pW
23bb0 69 74 68 2d 3e 6e 43 74 65 29 3b 0a 20 20 20 20  ith->nCte);.    
23bc0 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62  pNew = sqlite3Db
23bd0 52 65 61 6c 6c 6f 63 28 64 62 2c 20 70 57 69 74  Realloc(db, pWit
23be0 68 2c 20 6e 42 79 74 65 29 3b 0a 20 20 7d 65 6c  h, nByte);.  }el
23bf0 73 65 7b 0a 20 20 20 20 70 4e 65 77 20 3d 20 73  se{.    pNew = s
23c00 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
23c10 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70  ro(db, sizeof(*p
23c20 57 69 74 68 29 29 3b 0a 20 20 7d 0a 20 20 61 73  With));.  }.  as
23c30 73 65 72 74 28 20 28 70 4e 65 77 21 3d 30 20 26  sert( (pNew!=0 &
23c40 26 20 7a 4e 61 6d 65 21 3d 30 29 20 7c 7c 20 64  & zName!=0) || d
23c50 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
23c60 29 3b 0a 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61  );..  if( db->ma
23c70 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
23c80 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
23c90 74 44 65 6c 65 74 65 28 64 62 2c 20 70 41 72 67  tDelete(db, pArg
23ca0 6c 69 73 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  list);.    sqlit
23cb0 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64  e3SelectDelete(d
23cc0 62 2c 20 70 51 75 65 72 79 29 3b 0a 20 20 20 20  b, pQuery);.    
23cd0 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
23ce0 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70 4e  , zName);.    pN
23cf0 65 77 20 3d 20 70 57 69 74 68 3b 0a 20 20 7d 65  ew = pWith;.  }e
23d00 6c 73 65 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 61  lse{.    pNew->a
23d10 5b 70 4e 65 77 2d 3e 6e 43 74 65 5d 2e 70 53 65  [pNew->nCte].pSe
23d20 6c 65 63 74 20 3d 20 70 51 75 65 72 79 3b 0a 20  lect = pQuery;. 
23d30 20 20 20 70 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d     pNew->a[pNew-
23d40 3e 6e 43 74 65 5d 2e 70 43 6f 6c 73 20 3d 20 70  >nCte].pCols = p
23d50 41 72 67 6c 69 73 74 3b 0a 20 20 20 20 70 4e 65  Arglist;.    pNe
23d60 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e 43 74 65 5d  w->a[pNew->nCte]
23d70 2e 7a 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a  .zName = zName;.
23d80 20 20 20 20 70 4e 65 77 2d 3e 61 5b 70 4e 65 77      pNew->a[pNew
23d90 2d 3e 6e 43 74 65 5d 2e 7a 43 74 65 45 72 72 20  ->nCte].zCteErr 
23da0 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e  = 0;.    pNew->n
23db0 43 74 65 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 72 65  Cte++;.  }..  re
23dc0 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a  turn pNew;.}../*
23dd0 0a 2a 2a 20 46 72 65 65 20 74 68 65 20 63 6f 6e  .** Free the con
23de0 74 65 6e 74 73 20 6f 66 20 74 68 65 20 57 69 74  tents of the Wit
23df0 68 20 6f 62 6a 65 63 74 20 70 61 73 73 65 64 20  h object passed 
23e00 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  as the second ar
23e10 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20  gument..*/.void 
23e20 73 71 6c 69 74 65 33 57 69 74 68 44 65 6c 65 74  sqlite3WithDelet
23e30 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 57  e(sqlite3 *db, W
23e40 69 74 68 20 2a 70 57 69 74 68 29 7b 0a 20 20 69  ith *pWith){.  i
23e50 66 28 20 70 57 69 74 68 20 29 7b 0a 20 20 20 20  f( pWith ){.    
23e60 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69  int i;.    for(i
23e70 3d 30 3b 20 69 3c 70 57 69 74 68 2d 3e 6e 43 74  =0; i<pWith->nCt
23e80 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73  e; i++){.      s
23e90 74 72 75 63 74 20 43 74 65 20 2a 70 43 74 65 20  truct Cte *pCte 
23ea0 3d 20 26 70 57 69 74 68 2d 3e 61 5b 69 5d 3b 0a  = &pWith->a[i];.
23eb0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
23ec0 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20  rListDelete(db, 
23ed0 70 43 74 65 2d 3e 70 43 6f 6c 73 29 3b 0a 20 20  pCte->pCols);.  
23ee0 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63      sqlite3Selec
23ef0 74 44 65 6c 65 74 65 28 64 62 2c 20 70 43 74 65  tDelete(db, pCte
23f00 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20  ->pSelect);.    
23f10 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
23f20 64 62 2c 20 70 43 74 65 2d 3e 7a 4e 61 6d 65 29  db, pCte->zName)
23f30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
23f40 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 57  te3DbFree(db, pW
23f50 69 74 68 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64  ith);.  }.}.#end
23f60 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53  if /* !defined(S
23f70 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45 29 20  QLITE_OMIT_CTE) 
23f80 2a 2f 0a                                         */.