/ Hex Artifact Content
Login

Artifact 6854e717e3257957b1bd87aadd6371d63937a023:


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 54 79  ee(db, pCol->zTy
4690: 70 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  pe);.      sqlit
46a0: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 43 6f  e3DbFree(db, pCo
46b0: 6c 2d 3e 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20 7d  l->zColl);.    }
46c0: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
46d0: 65 65 28 64 62 2c 20 70 54 61 62 6c 65 2d 3e 61  ee(db, pTable->a
46e0: 43 6f 6c 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  Col);.  }.}../*.
46f0: 2a 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 6d 65  ** Remove the me
4700: 6d 6f 72 79 20 64 61 74 61 20 73 74 72 75 63 74  mory data struct
4710: 75 72 65 73 20 61 73 73 6f 63 69 61 74 65 64 20  ures associated 
4720: 77 69 74 68 20 74 68 65 20 67 69 76 65 6e 0a 2a  with the given.*
4730: 2a 20 54 61 62 6c 65 2e 20 20 4e 6f 20 63 68 61  * Table.  No cha
4740: 6e 67 65 73 20 61 72 65 20 6d 61 64 65 20 74 6f  nges are made to
4750: 20 64 69 73 6b 20 62 79 20 74 68 69 73 20 72 6f   disk by this ro
4760: 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  utine..**.** Thi
4770: 73 20 72 6f 75 74 69 6e 65 20 6a 75 73 74 20 64  s routine just d
4780: 65 6c 65 74 65 73 20 74 68 65 20 64 61 74 61 20  eletes the data 
4790: 73 74 72 75 63 74 75 72 65 2e 20 20 49 74 20 64  structure.  It d
47a0: 6f 65 73 20 6e 6f 74 20 75 6e 6c 69 6e 6b 0a 2a  oes not unlink.*
47b0: 2a 20 74 68 65 20 74 61 62 6c 65 20 64 61 74 61  * the table data
47c0: 20 73 74 72 75 63 74 75 72 65 20 66 72 6f 6d 20   structure from 
47d0: 74 68 65 20 68 61 73 68 20 74 61 62 6c 65 2e 20  the hash table. 
47e0: 20 42 75 74 20 69 74 20 64 6f 65 73 20 64 65 73   But it does des
47f0: 74 72 6f 79 0a 2a 2a 20 6d 65 6d 6f 72 79 20 73  troy.** memory s
4800: 74 72 75 63 74 75 72 65 73 20 6f 66 20 74 68 65  tructures of the
4810: 20 69 6e 64 69 63 65 73 20 61 6e 64 20 66 6f 72   indices and for
4820: 65 69 67 6e 20 6b 65 79 73 20 61 73 73 6f 63 69  eign keys associ
4830: 61 74 65 64 20 77 69 74 68 20 0a 2a 2a 20 74 68  ated with .** th
4840: 65 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54  e table..**.** T
4850: 68 65 20 64 62 20 70 61 72 61 6d 65 74 65 72 20  he db parameter 
4860: 69 73 20 6f 70 74 69 6f 6e 61 6c 2e 20 20 49 74  is optional.  It
4870: 20 69 73 20 6e 65 65 64 65 64 20 69 66 20 74 68   is needed if th
4880: 65 20 54 61 62 6c 65 20 6f 62 6a 65 63 74 20 0a  e Table object .
4890: 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 6c 6f 6f 6b  ** contains look
48a0: 61 73 69 64 65 20 6d 65 6d 6f 72 79 2e 20 20 28  aside memory.  (
48b0: 54 61 62 6c 65 20 6f 62 6a 65 63 74 73 20 69 6e  Table objects in
48c0: 20 74 68 65 20 73 63 68 65 6d 61 20 64 6f 20 6e   the schema do n
48d0: 6f 74 20 75 73 65 0a 2a 2a 20 6c 6f 6f 6b 61 73  ot use.** lookas
48e0: 69 64 65 20 6d 65 6d 6f 72 79 2c 20 62 75 74 20  ide memory, but 
48f0: 73 6f 6d 65 20 65 70 68 65 6d 65 72 61 6c 20 54  some ephemeral T
4900: 61 62 6c 65 20 6f 62 6a 65 63 74 73 20 64 6f 2e  able objects do.
4910: 29 20 20 4f 72 20 74 68 65 0a 2a 2a 20 64 62 20  )  Or the.** db 
4920: 70 61 72 61 6d 65 74 65 72 20 63 61 6e 20 62 65  parameter can be
4930: 20 75 73 65 64 20 77 69 74 68 20 64 62 2d 3e 70   used with db->p
4940: 6e 42 79 74 65 73 46 72 65 65 64 20 74 6f 20 6d  nBytesFreed to m
4950: 65 61 73 75 72 65 20 74 68 65 20 6d 65 6d 6f 72  easure the memor
4960: 79 0a 2a 2a 20 75 73 65 64 20 62 79 20 74 68 65  y.** used by the
4970: 20 54 61 62 6c 65 20 6f 62 6a 65 63 74 2e 0a 2a   Table object..*
4980: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 44 65  /.void sqlite3De
4990: 6c 65 74 65 54 61 62 6c 65 28 73 71 6c 69 74 65  leteTable(sqlite
49a0: 33 20 2a 64 62 2c 20 54 61 62 6c 65 20 2a 70 54  3 *db, Table *pT
49b0: 61 62 6c 65 29 7b 0a 20 20 49 6e 64 65 78 20 2a  able){.  Index *
49c0: 70 49 6e 64 65 78 2c 20 2a 70 4e 65 78 74 3b 0a  pIndex, *pNext;.
49d0: 20 20 54 45 53 54 4f 4e 4c 59 28 20 69 6e 74 20    TESTONLY( int 
49e0: 6e 4c 6f 6f 6b 61 73 69 64 65 3b 20 29 20 2f 2a  nLookaside; ) /*
49f0: 20 55 73 65 64 20 74 6f 20 76 65 72 69 66 79 20   Used to verify 
4a00: 6c 6f 6f 6b 61 73 69 64 65 20 6e 6f 74 20 75 73  lookaside not us
4a10: 65 64 20 66 6f 72 20 73 63 68 65 6d 61 20 2a 2f  ed for schema */
4a20: 0a 0a 20 20 61 73 73 65 72 74 28 20 21 70 54 61  ..  assert( !pTa
4a30: 62 6c 65 20 7c 7c 20 70 54 61 62 6c 65 2d 3e 6e  ble || pTable->n
4a40: 52 65 66 3e 30 20 29 3b 0a 0a 20 20 2f 2a 20 44  Ref>0 );..  /* D
4a50: 6f 20 6e 6f 74 20 64 65 6c 65 74 65 20 74 68 65  o not delete the
4a60: 20 74 61 62 6c 65 20 75 6e 74 69 6c 20 74 68 65   table until the
4a70: 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74   reference count
4a80: 20 72 65 61 63 68 65 73 20 7a 65 72 6f 2e 20 2a   reaches zero. *
4a90: 2f 0a 20 20 69 66 28 20 21 70 54 61 62 6c 65 20  /.  if( !pTable 
4aa0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
4ab0: 28 28 21 64 62 20 7c 7c 20 64 62 2d 3e 70 6e 42  ((!db || db->pnB
4ac0: 79 74 65 73 46 72 65 65 64 3d 3d 30 29 20 26 26  ytesFreed==0) &&
4ad0: 20 28 2d 2d 70 54 61 62 6c 65 2d 3e 6e 52 65 66   (--pTable->nRef
4ae0: 29 3e 30 29 20 29 20 72 65 74 75 72 6e 3b 0a 0a  )>0) ) return;..
4af0: 20 20 2f 2a 20 52 65 63 6f 72 64 20 74 68 65 20    /* Record the 
4b00: 6e 75 6d 62 65 72 20 6f 66 20 6f 75 74 73 74 61  number of outsta
4b10: 6e 64 69 6e 67 20 6c 6f 6f 6b 61 73 69 64 65 20  nding lookaside 
4b20: 61 6c 6c 6f 63 61 74 69 6f 6e 73 20 69 6e 20 73  allocations in s
4b30: 63 68 65 6d 61 20 54 61 62 6c 65 73 0a 20 20 2a  chema Tables.  *
4b40: 2a 20 70 72 69 6f 72 20 74 6f 20 64 6f 69 6e 67  * prior to doing
4b50: 20 61 6e 79 20 66 72 65 65 28 29 20 6f 70 65 72   any free() oper
4b60: 61 74 69 6f 6e 73 2e 20 20 53 69 6e 63 65 20 73  ations.  Since s
4b70: 63 68 65 6d 61 20 54 61 62 6c 65 73 20 64 6f 20  chema Tables do 
4b80: 6e 6f 74 20 75 73 65 0a 20 20 2a 2a 20 6c 6f 6f  not use.  ** loo
4b90: 6b 61 73 69 64 65 2c 20 74 68 69 73 20 6e 75 6d  kaside, this num
4ba0: 62 65 72 20 73 68 6f 75 6c 64 20 6e 6f 74 20 63  ber should not c
4bb0: 68 61 6e 67 65 2e 20 2a 2f 0a 20 20 54 45 53 54  hange. */.  TEST
4bc0: 4f 4e 4c 59 28 20 6e 4c 6f 6f 6b 61 73 69 64 65  ONLY( nLookaside
4bd0: 20 3d 20 28 64 62 20 26 26 20 28 70 54 61 62 6c   = (db && (pTabl
4be0: 65 2d 3e 74 61 62 46 6c 61 67 73 20 26 20 54 46  e->tabFlags & TF
4bf0: 5f 45 70 68 65 6d 65 72 61 6c 29 3d 3d 30 29 20  _Ephemeral)==0) 
4c00: 3f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ?.              
4c10: 20 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e 6c             db->l
4c20: 6f 6f 6b 61 73 69 64 65 2e 6e 4f 75 74 20 3a 20  ookaside.nOut : 
4c30: 30 20 29 3b 0a 0a 20 20 2f 2a 20 44 65 6c 65 74  0 );..  /* Delet
4c40: 65 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 61 73  e all indices as
4c50: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
4c60: 69 73 20 74 61 62 6c 65 2e 20 2a 2f 0a 20 20 66  is table. */.  f
4c70: 6f 72 28 70 49 6e 64 65 78 20 3d 20 70 54 61 62  or(pIndex = pTab
4c80: 6c 65 2d 3e 70 49 6e 64 65 78 3b 20 70 49 6e 64  le->pIndex; pInd
4c90: 65 78 3b 20 70 49 6e 64 65 78 3d 70 4e 65 78 74  ex; pIndex=pNext
4ca0: 29 7b 0a 20 20 20 20 70 4e 65 78 74 20 3d 20 70  ){.    pNext = p
4cb0: 49 6e 64 65 78 2d 3e 70 4e 65 78 74 3b 0a 20 20  Index->pNext;.  
4cc0: 20 20 61 73 73 65 72 74 28 20 70 49 6e 64 65 78    assert( pIndex
4cd0: 2d 3e 70 53 63 68 65 6d 61 3d 3d 70 54 61 62 6c  ->pSchema==pTabl
4ce0: 65 2d 3e 70 53 63 68 65 6d 61 20 29 3b 0a 20 20  e->pSchema );.  
4cf0: 20 20 69 66 28 20 21 64 62 20 7c 7c 20 64 62 2d    if( !db || db-
4d00: 3e 70 6e 42 79 74 65 73 46 72 65 65 64 3d 3d 30  >pnBytesFreed==0
4d10: 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a   ){.      char *
4d20: 7a 4e 61 6d 65 20 3d 20 70 49 6e 64 65 78 2d 3e  zName = pIndex->
4d30: 7a 4e 61 6d 65 3b 20 0a 20 20 20 20 20 20 54 45  zName; .      TE
4d40: 53 54 4f 4e 4c 59 20 28 20 49 6e 64 65 78 20 2a  STONLY ( Index *
4d50: 70 4f 6c 64 20 3d 20 29 20 73 71 6c 69 74 65 33  pOld = ) sqlite3
4d60: 48 61 73 68 49 6e 73 65 72 74 28 0a 20 20 20 20  HashInsert(.    
4d70: 20 20 20 20 20 26 70 49 6e 64 65 78 2d 3e 70 53       &pIndex->pS
4d80: 63 68 65 6d 61 2d 3e 69 64 78 48 61 73 68 2c 20  chema->idxHash, 
4d90: 7a 4e 61 6d 65 2c 20 30 0a 20 20 20 20 20 20 29  zName, 0.      )
4da0: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
4db0: 64 62 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33  db==0 || sqlite3
4dc0: 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28  SchemaMutexHeld(
4dd0: 64 62 2c 20 30 2c 20 70 49 6e 64 65 78 2d 3e 70  db, 0, pIndex->p
4de0: 53 63 68 65 6d 61 29 20 29 3b 0a 20 20 20 20 20  Schema) );.     
4df0: 20 61 73 73 65 72 74 28 20 70 4f 6c 64 3d 3d 70   assert( pOld==p
4e00: 49 6e 64 65 78 20 7c 7c 20 70 4f 6c 64 3d 3d 30  Index || pOld==0
4e10: 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 72   );.    }.    fr
4e20: 65 65 49 6e 64 65 78 28 64 62 2c 20 70 49 6e 64  eeIndex(db, pInd
4e30: 65 78 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44  ex);.  }..  /* D
4e40: 65 6c 65 74 65 20 61 6e 79 20 66 6f 72 65 69 67  elete any foreig
4e50: 6e 20 6b 65 79 73 20 61 74 74 61 63 68 65 64 20  n keys attached 
4e60: 74 6f 20 74 68 69 73 20 74 61 62 6c 65 2e 20 2a  to this table. *
4e70: 2f 0a 20 20 73 71 6c 69 74 65 33 46 6b 44 65 6c  /.  sqlite3FkDel
4e80: 65 74 65 28 64 62 2c 20 70 54 61 62 6c 65 29 3b  ete(db, pTable);
4e90: 0a 0a 20 20 2f 2a 20 44 65 6c 65 74 65 20 74 68  ..  /* Delete th
4ea0: 65 20 54 61 62 6c 65 20 73 74 72 75 63 74 75 72  e Table structur
4eb0: 65 20 69 74 73 65 6c 66 2e 0a 20 20 2a 2f 0a 20  e itself..  */. 
4ec0: 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65 43 6f   sqlite3DeleteCo
4ed0: 6c 75 6d 6e 4e 61 6d 65 73 28 64 62 2c 20 70 54  lumnNames(db, pT
4ee0: 61 62 6c 65 29 3b 0a 20 20 73 71 6c 69 74 65 33  able);.  sqlite3
4ef0: 44 62 46 72 65 65 28 64 62 2c 20 70 54 61 62 6c  DbFree(db, pTabl
4f00: 65 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 73 71 6c  e->zName);.  sql
4f10: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
4f20: 54 61 62 6c 65 2d 3e 7a 43 6f 6c 41 66 66 29 3b  Table->zColAff);
4f30: 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  .  sqlite3Select
4f40: 44 65 6c 65 74 65 28 64 62 2c 20 70 54 61 62 6c  Delete(db, pTabl
4f50: 65 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20 73  e->pSelect);.  s
4f60: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65  qlite3ExprListDe
4f70: 6c 65 74 65 28 64 62 2c 20 70 54 61 62 6c 65 2d  lete(db, pTable-
4f80: 3e 70 43 68 65 63 6b 29 3b 0a 23 69 66 6e 64 65  >pCheck);.#ifnde
4f90: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
4fa0: 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 73 71 6c  RTUALTABLE.  sql
4fb0: 69 74 65 33 56 74 61 62 43 6c 65 61 72 28 64 62  ite3VtabClear(db
4fc0: 2c 20 70 54 61 62 6c 65 29 3b 0a 23 65 6e 64 69  , pTable);.#endi
4fd0: 66 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  f.  sqlite3DbFre
4fe0: 65 28 64 62 2c 20 70 54 61 62 6c 65 29 3b 0a 0a  e(db, pTable);..
4ff0: 20 20 2f 2a 20 56 65 72 69 66 79 20 74 68 61 74    /* Verify that
5000: 20 6e 6f 20 6c 6f 6f 6b 61 73 69 64 65 20 6d 65   no lookaside me
5010: 6d 6f 72 79 20 77 61 73 20 75 73 65 64 20 62 79  mory was used by
5020: 20 73 63 68 65 6d 61 20 74 61 62 6c 65 73 20 2a   schema tables *
5030: 2f 0a 20 20 61 73 73 65 72 74 28 20 6e 4c 6f 6f  /.  assert( nLoo
5040: 6b 61 73 69 64 65 3d 3d 30 20 7c 7c 20 6e 4c 6f  kaside==0 || nLo
5050: 6f 6b 61 73 69 64 65 3d 3d 64 62 2d 3e 6c 6f 6f  okaside==db->loo
5060: 6b 61 73 69 64 65 2e 6e 4f 75 74 20 29 3b 0a 7d  kaside.nOut );.}
5070: 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 69 6e 6b 20 74  ../*.** Unlink t
5080: 68 65 20 67 69 76 65 6e 20 74 61 62 6c 65 20 66  he given table f
5090: 72 6f 6d 20 74 68 65 20 68 61 73 68 20 74 61 62  rom the hash tab
50a0: 6c 65 73 20 61 6e 64 20 74 68 65 20 64 65 6c 65  les and the dele
50b0: 74 65 20 74 68 65 0a 2a 2a 20 74 61 62 6c 65 20  te the.** table 
50c0: 73 74 72 75 63 74 75 72 65 20 77 69 74 68 20 61  structure with a
50d0: 6c 6c 20 69 74 73 20 69 6e 64 69 63 65 73 20 61  ll its indices a
50e0: 6e 64 20 66 6f 72 65 69 67 6e 20 6b 65 79 73 2e  nd foreign keys.
50f0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
5100: 55 6e 6c 69 6e 6b 41 6e 64 44 65 6c 65 74 65 54  UnlinkAndDeleteT
5110: 61 62 6c 65 28 73 71 6c 69 74 65 33 20 2a 64 62  able(sqlite3 *db
5120: 2c 20 69 6e 74 20 69 44 62 2c 20 63 6f 6e 73 74  , int iDb, const
5130: 20 63 68 61 72 20 2a 7a 54 61 62 4e 61 6d 65 29   char *zTabName)
5140: 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20  {.  Table *p;.  
5150: 44 62 20 2a 70 44 62 3b 0a 0a 20 20 61 73 73 65  Db *pDb;..  asse
5160: 72 74 28 20 64 62 21 3d 30 20 29 3b 0a 20 20 61  rt( db!=0 );.  a
5170: 73 73 65 72 74 28 20 69 44 62 3e 3d 30 20 26 26  ssert( iDb>=0 &&
5180: 20 69 44 62 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a   iDb<db->nDb );.
5190: 20 20 61 73 73 65 72 74 28 20 7a 54 61 62 4e 61    assert( zTabNa
51a0: 6d 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  me );.  assert( 
51b0: 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74  sqlite3SchemaMut
51c0: 65 78 48 65 6c 64 28 64 62 2c 20 69 44 62 2c 20  exHeld(db, iDb, 
51d0: 30 29 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  0) );.  testcase
51e0: 28 20 7a 54 61 62 4e 61 6d 65 5b 30 5d 3d 3d 30  ( zTabName[0]==0
51f0: 20 29 3b 20 20 2f 2a 20 5a 65 72 6f 2d 6c 65 6e   );  /* Zero-len
5200: 67 74 68 20 74 61 62 6c 65 20 6e 61 6d 65 73 20  gth table names 
5210: 61 72 65 20 61 6c 6c 6f 77 65 64 20 2a 2f 0a 20  are allowed */. 
5220: 20 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b   pDb = &db->aDb[
5230: 69 44 62 5d 3b 0a 20 20 70 20 3d 20 73 71 6c 69  iDb];.  p = sqli
5240: 74 65 33 48 61 73 68 49 6e 73 65 72 74 28 26 70  te3HashInsert(&p
5250: 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 74 62 6c  Db->pSchema->tbl
5260: 48 61 73 68 2c 20 7a 54 61 62 4e 61 6d 65 2c 20  Hash, zTabName, 
5270: 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 65 6c  0);.  sqlite3Del
5280: 65 74 65 54 61 62 6c 65 28 64 62 2c 20 70 29 3b  eteTable(db, p);
5290: 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20  .  db->flags |= 
52a0: 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61  SQLITE_InternCha
52b0: 6e 67 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  nges;.}../*.** G
52c0: 69 76 65 6e 20 61 20 74 6f 6b 65 6e 2c 20 72 65  iven a token, re
52d0: 74 75 72 6e 20 61 20 73 74 72 69 6e 67 20 74 68  turn a string th
52e0: 61 74 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 74  at consists of t
52f0: 68 65 20 74 65 78 74 20 6f 66 20 74 68 61 74 0a  he text of that.
5300: 2a 2a 20 74 6f 6b 65 6e 2e 20 20 53 70 61 63 65  ** token.  Space
5310: 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 72 65 74   to hold the ret
5320: 75 72 6e 65 64 20 73 74 72 69 6e 67 0a 2a 2a 20  urned string.** 
5330: 69 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  is obtained from
5340: 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 20   sqliteMalloc() 
5350: 61 6e 64 20 6d 75 73 74 20 62 65 20 66 72 65 65  and must be free
5360: 64 20 62 79 20 74 68 65 20 63 61 6c 6c 69 6e 67  d by the calling
5370: 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a  .** function..**
5380: 0a 2a 2a 20 41 6e 79 20 71 75 6f 74 61 74 69 6f  .** Any quotatio
5390: 6e 20 6d 61 72 6b 73 20 28 65 78 3a 20 20 22 6e  n marks (ex:  "n
53a0: 61 6d 65 22 2c 20 27 6e 61 6d 65 27 2c 20 5b 6e  ame", 'name', [n
53b0: 61 6d 65 5d 2c 20 6f 72 20 60 6e 61 6d 65 60 29  ame], or `name`)
53c0: 20 74 68 61 74 0a 2a 2a 20 73 75 72 72 6f 75 6e   that.** surroun
53d0: 64 20 74 68 65 20 62 6f 64 79 20 6f 66 20 74 68  d the body of th
53e0: 65 20 74 6f 6b 65 6e 20 61 72 65 20 72 65 6d 6f  e token are remo
53f0: 76 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 6f 6b 65 6e  ved..**.** Token
5400: 73 20 61 72 65 20 6f 66 74 65 6e 20 6a 75 73 74  s are often just
5410: 20 70 6f 69 6e 74 65 72 73 20 69 6e 74 6f 20 74   pointers into t
5420: 68 65 20 6f 72 69 67 69 6e 61 6c 20 53 51 4c 20  he original SQL 
5430: 74 65 78 74 20 61 6e 64 20 73 6f 0a 2a 2a 20 61  text and so.** a
5440: 72 65 20 6e 6f 74 20 5c 30 30 30 20 74 65 72 6d  re not \000 term
5450: 69 6e 61 74 65 64 20 61 6e 64 20 61 72 65 20 6e  inated and are n
5460: 6f 74 20 70 65 72 73 69 73 74 65 6e 74 2e 20 20  ot persistent.  
5470: 54 68 65 20 72 65 74 75 72 6e 65 64 20 73 74 72  The returned str
5480: 69 6e 67 0a 2a 2a 20 69 73 20 5c 30 30 30 20 74  ing.** is \000 t
5490: 65 72 6d 69 6e 61 74 65 64 20 61 6e 64 20 69 73  erminated and is
54a0: 20 70 65 72 73 69 73 74 65 6e 74 2e 0a 2a 2f 0a   persistent..*/.
54b0: 63 68 61 72 20 2a 73 71 6c 69 74 65 33 4e 61 6d  char *sqlite3Nam
54c0: 65 46 72 6f 6d 54 6f 6b 65 6e 28 73 71 6c 69 74  eFromToken(sqlit
54d0: 65 33 20 2a 64 62 2c 20 54 6f 6b 65 6e 20 2a 70  e3 *db, Token *p
54e0: 4e 61 6d 65 29 7b 0a 20 20 63 68 61 72 20 2a 7a  Name){.  char *z
54f0: 4e 61 6d 65 3b 0a 20 20 69 66 28 20 70 4e 61 6d  Name;.  if( pNam
5500: 65 20 29 7b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d  e ){.    zName =
5510: 20 73 71 6c 69 74 65 33 44 62 53 74 72 4e 44 75   sqlite3DbStrNDu
5520: 70 28 64 62 2c 20 28 63 68 61 72 2a 29 70 4e 61  p(db, (char*)pNa
5530: 6d 65 2d 3e 7a 2c 20 70 4e 61 6d 65 2d 3e 6e 29  me->z, pName->n)
5540: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 71  ;.    sqlite3Deq
5550: 75 6f 74 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 7d  uote(zName);.  }
5560: 65 6c 73 65 7b 0a 20 20 20 20 7a 4e 61 6d 65 20  else{.    zName 
5570: 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 0;.  }.  retur
5580: 6e 20 7a 4e 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  n zName;.}../*.*
5590: 2a 20 4f 70 65 6e 20 74 68 65 20 73 71 6c 69 74  * Open the sqlit
55a0: 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20 73  e_master table s
55b0: 74 6f 72 65 64 20 69 6e 20 64 61 74 61 62 61 73  tored in databas
55c0: 65 20 6e 75 6d 62 65 72 20 69 44 62 20 66 6f 72  e number iDb for
55d0: 0a 2a 2a 20 77 72 69 74 69 6e 67 2e 20 54 68 65  .** writing. The
55e0: 20 74 61 62 6c 65 20 69 73 20 6f 70 65 6e 65 64   table is opened
55f0: 20 75 73 69 6e 67 20 63 75 72 73 6f 72 20 30 2e   using cursor 0.
5600: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
5610: 4f 70 65 6e 4d 61 73 74 65 72 54 61 62 6c 65 28  OpenMasterTable(
5620: 50 61 72 73 65 20 2a 70 2c 20 69 6e 74 20 69 44  Parse *p, int iD
5630: 62 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  b){.  Vdbe *v = 
5640: 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
5650: 29 3b 0a 20 20 73 71 6c 69 74 65 33 54 61 62 6c  );.  sqlite3Tabl
5660: 65 4c 6f 63 6b 28 70 2c 20 69 44 62 2c 20 4d 41  eLock(p, iDb, MA
5670: 53 54 45 52 5f 52 4f 4f 54 2c 20 31 2c 20 53 43  STER_ROOT, 1, SC
5680: 48 45 4d 41 5f 54 41 42 4c 45 28 69 44 62 29 29  HEMA_TABLE(iDb))
5690: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
56a0: 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 4f  ddOp4Int(v, OP_O
56b0: 70 65 6e 57 72 69 74 65 2c 20 30 2c 20 4d 41 53  penWrite, 0, MAS
56c0: 54 45 52 5f 52 4f 4f 54 2c 20 69 44 62 2c 20 35  TER_ROOT, iDb, 5
56d0: 29 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 54 61 62  );.  if( p->nTab
56e0: 3d 3d 30 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 54  ==0 ){.    p->nT
56f0: 61 62 20 3d 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f  ab = 1;.  }.}../
5700: 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 7a  *.** Parameter z
5710: 4e 61 6d 65 20 70 6f 69 6e 74 73 20 74 6f 20 61  Name points to a
5720: 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20   nul-terminated 
5730: 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e  buffer containin
5740: 67 20 74 68 65 20 6e 61 6d 65 0a 2a 2a 20 6f 66  g the name.** of
5750: 20 61 20 64 61 74 61 62 61 73 65 20 28 22 6d 61   a database ("ma
5760: 69 6e 22 2c 20 22 74 65 6d 70 22 20 6f 72 20 74  in", "temp" or t
5770: 68 65 20 6e 61 6d 65 20 6f 66 20 61 6e 20 61 74  he name of an at
5780: 74 61 63 68 65 64 20 64 62 29 2e 20 54 68 69 73  tached db). This
5790: 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  .** function ret
57a0: 75 72 6e 73 20 74 68 65 20 69 6e 64 65 78 20 6f  urns the index o
57b0: 66 20 74 68 65 20 6e 61 6d 65 64 20 64 61 74 61  f the named data
57c0: 62 61 73 65 20 69 6e 20 64 62 2d 3e 61 44 62 5b  base in db->aDb[
57d0: 5d 2c 20 6f 72 0a 2a 2a 20 2d 31 20 69 66 20 74  ], or.** -1 if t
57e0: 68 65 20 6e 61 6d 65 64 20 64 62 20 63 61 6e 6e  he named db cann
57f0: 6f 74 20 62 65 20 66 6f 75 6e 64 2e 0a 2a 2f 0a  ot be found..*/.
5800: 69 6e 74 20 73 71 6c 69 74 65 33 46 69 6e 64 44  int sqlite3FindD
5810: 62 4e 61 6d 65 28 73 71 6c 69 74 65 33 20 2a 64  bName(sqlite3 *d
5820: 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  b, const char *z
5830: 4e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 69 20 3d  Name){.  int i =
5840: 20 2d 31 3b 20 20 20 20 20 20 20 20 20 2f 2a 20   -1;         /* 
5850: 44 61 74 61 62 61 73 65 20 6e 75 6d 62 65 72 20  Database number 
5860: 2a 2f 0a 20 20 69 66 28 20 7a 4e 61 6d 65 20 29  */.  if( zName )
5870: 7b 0a 20 20 20 20 44 62 20 2a 70 44 62 3b 0a 20  {.    Db *pDb;. 
5880: 20 20 20 66 6f 72 28 69 3d 28 64 62 2d 3e 6e 44     for(i=(db->nD
5890: 62 2d 31 29 2c 20 70 44 62 3d 26 64 62 2d 3e 61  b-1), pDb=&db->a
58a0: 44 62 5b 69 5d 3b 20 69 3e 3d 30 3b 20 69 2d 2d  Db[i]; i>=0; i--
58b0: 2c 20 70 44 62 2d 2d 29 7b 0a 20 20 20 20 20 20  , pDb--){.      
58c0: 69 66 28 20 30 3d 3d 73 71 6c 69 74 65 33 53 74  if( 0==sqlite3St
58d0: 72 49 43 6d 70 28 70 44 62 2d 3e 7a 4e 61 6d 65  rICmp(pDb->zName
58e0: 2c 20 7a 4e 61 6d 65 29 20 29 20 62 72 65 61 6b  , zName) ) break
58f0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
5900: 74 75 72 6e 20 69 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn i;.}../*.**
5910: 20 54 68 65 20 74 6f 6b 65 6e 20 2a 70 4e 61 6d   The token *pNam
5920: 65 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 6e  e contains the n
5930: 61 6d 65 20 6f 66 20 61 20 64 61 74 61 62 61 73  ame of a databas
5940: 65 20 28 65 69 74 68 65 72 20 22 6d 61 69 6e 22  e (either "main"
5950: 20 6f 72 0a 2a 2a 20 22 74 65 6d 70 22 20 6f 72   or.** "temp" or
5960: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 6e 20   the name of an 
5970: 61 74 74 61 63 68 65 64 20 64 62 29 2e 20 54 68  attached db). Th
5980: 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72  is routine retur
5990: 6e 73 20 74 68 65 0a 2a 2a 20 69 6e 64 65 78 20  ns the.** index 
59a0: 6f 66 20 74 68 65 20 6e 61 6d 65 64 20 64 61 74  of the named dat
59b0: 61 62 61 73 65 20 69 6e 20 64 62 2d 3e 61 44 62  abase in db->aDb
59c0: 5b 5d 2c 20 6f 72 20 2d 31 20 69 66 20 74 68 65  [], or -1 if the
59d0: 20 6e 61 6d 65 64 20 64 62 20 0a 2a 2a 20 64 6f   named db .** do
59e0: 65 73 20 6e 6f 74 20 65 78 69 73 74 2e 0a 2a 2f  es not exist..*/
59f0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 69 6e 64  .int sqlite3Find
5a00: 44 62 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  Db(sqlite3 *db, 
5a10: 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 29 7b 0a 20  Token *pName){. 
5a20: 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
5a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5a40: 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
5a50: 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 63 68  e number */.  ch
5a60: 61 72 20 2a 7a 4e 61 6d 65 3b 20 20 20 20 20 20  ar *zName;      
5a70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5a80: 20 20 20 2f 2a 20 4e 61 6d 65 20 77 65 20 61 72     /* Name we ar
5a90: 65 20 73 65 61 72 63 68 69 6e 67 20 66 6f 72 20  e searching for 
5aa0: 2a 2f 0a 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c  */.  zName = sql
5ab0: 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65  ite3NameFromToke
5ac0: 6e 28 64 62 2c 20 70 4e 61 6d 65 29 3b 0a 20 20  n(db, pName);.  
5ad0: 69 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 44  i = sqlite3FindD
5ae0: 62 4e 61 6d 65 28 64 62 2c 20 7a 4e 61 6d 65 29  bName(db, zName)
5af0: 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  ;.  sqlite3DbFre
5b00: 65 28 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20  e(db, zName);.  
5b10: 72 65 74 75 72 6e 20 69 3b 0a 7d 0a 0a 2f 2a 20  return i;.}../* 
5b20: 54 68 65 20 74 61 62 6c 65 20 6f 72 20 76 69 65  The table or vie
5b30: 77 20 6f 72 20 74 72 69 67 67 65 72 20 6e 61 6d  w or trigger nam
5b40: 65 20 69 73 20 70 61 73 73 65 64 20 74 6f 20 74  e is passed to t
5b50: 68 69 73 20 72 6f 75 74 69 6e 65 20 76 69 61 20  his routine via 
5b60: 74 6f 6b 65 6e 73 0a 2a 2a 20 70 4e 61 6d 65 31  tokens.** pName1
5b70: 20 61 6e 64 20 70 4e 61 6d 65 32 2e 20 49 66 20   and pName2. If 
5b80: 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 77  the table name w
5b90: 61 73 20 66 75 6c 6c 79 20 71 75 61 6c 69 66 69  as fully qualifi
5ba0: 65 64 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 3a  ed, for example:
5bb0: 0a 2a 2a 0a 2a 2a 20 43 52 45 41 54 45 20 54 41  .**.** CREATE TA
5bc0: 42 4c 45 20 78 78 78 2e 79 79 79 20 28 2e 2e 2e  BLE xxx.yyy (...
5bd0: 29 3b 0a 2a 2a 20 0a 2a 2a 20 54 68 65 6e 20 70  );.** .** Then p
5be0: 4e 61 6d 65 31 20 69 73 20 73 65 74 20 74 6f 20  Name1 is set to 
5bf0: 22 78 78 78 22 20 61 6e 64 20 70 4e 61 6d 65 32  "xxx" and pName2
5c00: 20 22 79 79 79 22 2e 20 4f 6e 20 74 68 65 20 6f   "yyy". On the o
5c10: 74 68 65 72 20 68 61 6e 64 20 69 66 0a 2a 2a 20  ther hand if.** 
5c20: 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 69  the table name i
5c30: 73 20 6e 6f 74 20 66 75 6c 6c 79 20 71 75 61 6c  s not fully qual
5c40: 69 66 69 65 64 2c 20 69 2e 65 2e 3a 0a 2a 2a 0a  ified, i.e.:.**.
5c50: 2a 2a 20 43 52 45 41 54 45 20 54 41 42 4c 45 20  ** CREATE TABLE 
5c60: 79 79 79 28 2e 2e 2e 29 3b 0a 2a 2a 0a 2a 2a 20  yyy(...);.**.** 
5c70: 54 68 65 6e 20 70 4e 61 6d 65 31 20 69 73 20 73  Then pName1 is s
5c80: 65 74 20 74 6f 20 22 79 79 79 22 20 61 6e 64 20  et to "yyy" and 
5c90: 70 4e 61 6d 65 32 20 69 73 20 22 22 2e 0a 2a 2a  pName2 is ""..**
5ca0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
5cb0: 20 73 65 74 73 20 74 68 65 20 2a 70 70 55 6e 71   sets the *ppUnq
5cc0: 75 61 6c 20 70 6f 69 6e 74 65 72 20 74 6f 20 70  ual pointer to p
5cd0: 6f 69 6e 74 20 61 74 20 74 68 65 20 74 6f 6b 65  oint at the toke
5ce0: 6e 20 28 70 4e 61 6d 65 31 20 6f 72 0a 2a 2a 20  n (pName1 or.** 
5cf0: 70 4e 61 6d 65 32 29 20 74 68 61 74 20 73 74 6f  pName2) that sto
5d00: 72 65 73 20 74 68 65 20 75 6e 71 75 61 6c 69 66  res the unqualif
5d10: 69 65 64 20 74 61 62 6c 65 20 6e 61 6d 65 2e 20  ied table name. 
5d20: 20 54 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68   The index of th
5d30: 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 22 78  e.** database "x
5d40: 78 78 22 20 69 73 20 72 65 74 75 72 6e 65 64 2e  xx" is returned.
5d50: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 54  .*/.int sqlite3T
5d60: 77 6f 50 61 72 74 4e 61 6d 65 28 0a 20 20 50 61  woPartName(.  Pa
5d70: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
5d80: 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 61 6e 64    /* Parsing and
5d90: 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67   code generating
5da0: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 6f   context */.  To
5db0: 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c 20 20 20 20  ken *pName1,    
5dc0: 20 20 2f 2a 20 54 68 65 20 22 78 78 78 22 20 69    /* The "xxx" i
5dd0: 6e 20 74 68 65 20 6e 61 6d 65 20 22 78 78 78 2e  n the name "xxx.
5de0: 79 79 79 22 20 6f 72 20 22 78 78 78 22 20 2a 2f  yyy" or "xxx" */
5df0: 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32  .  Token *pName2
5e00: 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 22 79  ,      /* The "y
5e10: 79 79 22 20 69 6e 20 74 68 65 20 6e 61 6d 65 20  yy" in the name 
5e20: 22 78 78 78 2e 79 79 79 22 20 2a 2f 0a 20 20 54  "xxx.yyy" */.  T
5e30: 6f 6b 65 6e 20 2a 2a 70 55 6e 71 75 61 6c 20 20  oken **pUnqual  
5e40: 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20     /* Write the 
5e50: 75 6e 71 75 61 6c 69 66 69 65 64 20 6f 62 6a 65  unqualified obje
5e60: 63 74 20 6e 61 6d 65 20 68 65 72 65 20 2a 2f 0a  ct name here */.
5e70: 29 7b 0a 20 20 69 6e 74 20 69 44 62 3b 20 20 20  ){.  int iDb;   
5e80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5e90: 20 2f 2a 20 44 61 74 61 62 61 73 65 20 68 6f 6c   /* Database hol
5ea0: 64 69 6e 67 20 74 68 65 20 6f 62 6a 65 63 74 20  ding the object 
5eb0: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
5ec0: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a   = pParse->db;..
5ed0: 20 20 61 73 73 65 72 74 28 20 70 4e 61 6d 65 32    assert( pName2
5ee0: 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 4e 61  !=0 );.  if( pNa
5ef0: 6d 65 32 2d 3e 6e 3e 30 20 29 7b 0a 20 20 20 20  me2->n>0 ){.    
5f00: 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73  if( db->init.bus
5f10: 79 20 29 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  y ) {.      sqli
5f20: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
5f30: 73 65 2c 20 22 63 6f 72 72 75 70 74 20 64 61 74  se, "corrupt dat
5f40: 61 62 61 73 65 22 29 3b 0a 20 20 20 20 20 20 72  abase");.      r
5f50: 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a  eturn -1;.    }.
5f60: 20 20 20 20 2a 70 55 6e 71 75 61 6c 20 3d 20 70      *pUnqual = p
5f70: 4e 61 6d 65 32 3b 0a 20 20 20 20 69 44 62 20 3d  Name2;.    iDb =
5f80: 20 73 71 6c 69 74 65 33 46 69 6e 64 44 62 28 64   sqlite3FindDb(d
5f90: 62 2c 20 70 4e 61 6d 65 31 29 3b 0a 20 20 20 20  b, pName1);.    
5fa0: 69 66 28 20 69 44 62 3c 30 20 29 7b 0a 20 20 20  if( iDb<0 ){.   
5fb0: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
5fc0: 73 67 28 70 50 61 72 73 65 2c 20 22 75 6e 6b 6e  sg(pParse, "unkn
5fd0: 6f 77 6e 20 64 61 74 61 62 61 73 65 20 25 54 22  own database %T"
5fe0: 2c 20 70 4e 61 6d 65 31 29 3b 0a 20 20 20 20 20  , pName1);.     
5ff0: 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20   return -1;.    
6000: 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  }.  }else{.    a
6010: 73 73 65 72 74 28 20 64 62 2d 3e 69 6e 69 74 2e  ssert( db->init.
6020: 69 44 62 3d 3d 30 20 7c 7c 20 64 62 2d 3e 69 6e  iDb==0 || db->in
6030: 69 74 2e 62 75 73 79 20 29 3b 0a 20 20 20 20 69  it.busy );.    i
6040: 44 62 20 3d 20 64 62 2d 3e 69 6e 69 74 2e 69 44  Db = db->init.iD
6050: 62 3b 0a 20 20 20 20 2a 70 55 6e 71 75 61 6c 20  b;.    *pUnqual 
6060: 3d 20 70 4e 61 6d 65 31 3b 0a 20 20 7d 0a 20 20  = pName1;.  }.  
6070: 72 65 74 75 72 6e 20 69 44 62 3b 0a 7d 0a 0a 2f  return iDb;.}../
6080: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
6090: 65 20 69 73 20 75 73 65 64 20 74 6f 20 63 68 65  e is used to che
60a0: 63 6b 20 69 66 20 74 68 65 20 55 54 46 2d 38 20  ck if the UTF-8 
60b0: 73 74 72 69 6e 67 20 7a 4e 61 6d 65 20 69 73 20  string zName is 
60c0: 61 20 6c 65 67 61 6c 0a 2a 2a 20 75 6e 71 75 61  a legal.** unqua
60d0: 6c 69 66 69 65 64 20 6e 61 6d 65 20 66 6f 72 20  lified name for 
60e0: 61 20 6e 65 77 20 73 63 68 65 6d 61 20 6f 62 6a  a new schema obj
60f0: 65 63 74 20 28 74 61 62 6c 65 2c 20 69 6e 64 65  ect (table, inde
6100: 78 2c 20 76 69 65 77 20 6f 72 0a 2a 2a 20 74 72  x, view or.** tr
6110: 69 67 67 65 72 29 2e 20 41 6c 6c 20 6e 61 6d 65  igger). All name
6120: 73 20 61 72 65 20 6c 65 67 61 6c 20 65 78 63 65  s are legal exce
6130: 70 74 20 74 68 6f 73 65 20 74 68 61 74 20 62 65  pt those that be
6140: 67 69 6e 20 77 69 74 68 20 74 68 65 20 73 74 72  gin with the str
6150: 69 6e 67 0a 2a 2a 20 22 73 71 6c 69 74 65 5f 22  ing.** "sqlite_"
6160: 20 28 69 6e 20 75 70 70 65 72 2c 20 6c 6f 77 65   (in upper, lowe
6170: 72 20 6f 72 20 6d 69 78 65 64 20 63 61 73 65 29  r or mixed case)
6180: 2e 20 54 68 69 73 20 70 6f 72 74 69 6f 6e 20 6f  . This portion o
6190: 66 20 74 68 65 20 6e 61 6d 65 73 70 61 63 65 0a  f the namespace.
61a0: 2a 2a 20 69 73 20 72 65 73 65 72 76 65 64 20 66  ** is reserved f
61b0: 6f 72 20 69 6e 74 65 72 6e 61 6c 20 75 73 65 2e  or internal use.
61c0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 43  .*/.int sqlite3C
61d0: 68 65 63 6b 4f 62 6a 65 63 74 4e 61 6d 65 28 50  heckObjectName(P
61e0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 63 6f  arse *pParse, co
61f0: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29  nst char *zName)
6200: 7b 0a 20 20 69 66 28 20 21 70 50 61 72 73 65 2d  {.  if( !pParse-
6210: 3e 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 26  >db->init.busy &
6220: 26 20 70 50 61 72 73 65 2d 3e 6e 65 73 74 65 64  & pParse->nested
6230: 3d 3d 30 20 0a 20 20 20 20 20 20 20 20 20 20 26  ==0 .          &
6240: 26 20 28 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66  & (pParse->db->f
6250: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 57 72  lags & SQLITE_Wr
6260: 69 74 65 53 63 68 65 6d 61 29 3d 3d 30 0a 20 20  iteSchema)==0.  
6270: 20 20 20 20 20 20 20 20 26 26 20 30 3d 3d 73 71          && 0==sq
6280: 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28 7a 4e  lite3StrNICmp(zN
6290: 61 6d 65 2c 20 22 73 71 6c 69 74 65 5f 22 2c 20  ame, "sqlite_", 
62a0: 37 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  7) ){.    sqlite
62b0: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
62c0: 2c 20 22 6f 62 6a 65 63 74 20 6e 61 6d 65 20 72  , "object name r
62d0: 65 73 65 72 76 65 64 20 66 6f 72 20 69 6e 74 65  eserved for inte
62e0: 72 6e 61 6c 20 75 73 65 3a 20 25 73 22 2c 20 7a  rnal use: %s", z
62f0: 4e 61 6d 65 29 3b 0a 20 20 20 20 72 65 74 75 72  Name);.    retur
6300: 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
6310: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
6320: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
6330: 20 52 65 74 75 72 6e 20 74 68 65 20 50 52 49 4d   Return the PRIM
6340: 41 52 59 20 4b 45 59 20 69 6e 64 65 78 20 6f 66  ARY KEY index of
6350: 20 61 20 74 61 62 6c 65 0a 2a 2f 0a 49 6e 64 65   a table.*/.Inde
6360: 78 20 2a 73 71 6c 69 74 65 33 50 72 69 6d 61 72  x *sqlite3Primar
6370: 79 4b 65 79 49 6e 64 65 78 28 54 61 62 6c 65 20  yKeyIndex(Table 
6380: 2a 70 54 61 62 29 7b 0a 20 20 49 6e 64 65 78 20  *pTab){.  Index 
6390: 2a 70 3b 0a 20 20 66 6f 72 28 70 3d 70 54 61 62  *p;.  for(p=pTab
63a0: 2d 3e 70 49 6e 64 65 78 3b 20 70 20 26 26 20 21  ->pIndex; p && !
63b0: 49 73 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65  IsPrimaryKeyInde
63c0: 78 28 70 29 3b 20 70 3d 70 2d 3e 70 4e 65 78 74  x(p); p=p->pNext
63d0: 29 7b 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a  ){}.  return p;.
63e0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
63f0: 74 68 65 20 63 6f 6c 75 6d 6e 20 6f 66 20 69 6e  the column of in
6400: 64 65 78 20 70 49 64 78 20 74 68 61 74 20 63 6f  dex pIdx that co
6410: 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 74 61 62  rresponds to tab
6420: 6c 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 69 43 6f  le.** column iCo
6430: 6c 2e 20 20 52 65 74 75 72 6e 20 2d 31 20 69 66  l.  Return -1 if
6440: 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 69   not found..*/.i
6450: 31 36 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e  16 sqlite3Column
6460: 4f 66 49 6e 64 65 78 28 49 6e 64 65 78 20 2a 70  OfIndex(Index *p
6470: 49 64 78 2c 20 69 31 36 20 69 43 6f 6c 29 7b 0a  Idx, i16 iCol){.
6480: 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69    int i;.  for(i
6490: 3d 30 3b 20 69 3c 70 49 64 78 2d 3e 6e 43 6f 6c  =0; i<pIdx->nCol
64a0: 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  umn; i++){.    i
64b0: 66 28 20 69 43 6f 6c 3d 3d 70 49 64 78 2d 3e 61  f( iCol==pIdx->a
64c0: 69 43 6f 6c 75 6d 6e 5b 69 5d 20 29 20 72 65 74  iColumn[i] ) ret
64d0: 75 72 6e 20 69 3b 0a 20 20 7d 0a 20 20 72 65 74  urn i;.  }.  ret
64e0: 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn -1;.}../*.**
64f0: 20 42 65 67 69 6e 20 63 6f 6e 73 74 72 75 63 74   Begin construct
6500: 69 6e 67 20 61 20 6e 65 77 20 74 61 62 6c 65 20  ing a new table 
6510: 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 69  representation i
6520: 6e 20 6d 65 6d 6f 72 79 2e 20 20 54 68 69 73 20  n memory.  This 
6530: 69 73 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20  is.** the first 
6540: 6f 66 20 73 65 76 65 72 61 6c 20 61 63 74 69 6f  of several actio
6550: 6e 20 72 6f 75 74 69 6e 65 73 20 74 68 61 74 20  n routines that 
6560: 67 65 74 20 63 61 6c 6c 65 64 20 69 6e 20 72 65  get called in re
6570: 73 70 6f 6e 73 65 0a 2a 2a 20 74 6f 20 61 20 43  sponse.** to a C
6580: 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74  REATE TABLE stat
6590: 65 6d 65 6e 74 2e 20 20 49 6e 20 70 61 72 74 69  ement.  In parti
65a0: 63 75 6c 61 72 2c 20 74 68 69 73 20 72 6f 75 74  cular, this rout
65b0: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 0a 2a 2a  ine is called.**
65c0: 20 61 66 74 65 72 20 73 65 65 69 6e 67 20 74 6f   after seeing to
65d0: 6b 65 6e 73 20 22 43 52 45 41 54 45 22 20 61 6e  kens "CREATE" an
65e0: 64 20 22 54 41 42 4c 45 22 20 61 6e 64 20 74 68  d "TABLE" and th
65f0: 65 20 74 61 62 6c 65 20 6e 61 6d 65 2e 20 54 68  e table name. Th
6600: 65 20 69 73 54 65 6d 70 0a 2a 2a 20 66 6c 61 67  e isTemp.** flag
6610: 20 69 73 20 74 72 75 65 20 69 66 20 74 68 65 20   is true if the 
6620: 74 61 62 6c 65 20 73 68 6f 75 6c 64 20 62 65 20  table should be 
6630: 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 61 75  stored in the au
6640: 78 69 6c 69 61 72 79 20 64 61 74 61 62 61 73 65  xiliary database
6650: 0a 2a 2a 20 66 69 6c 65 20 69 6e 73 74 65 61 64  .** file instead
6660: 20 6f 66 20 69 6e 20 74 68 65 20 6d 61 69 6e 20   of in the main 
6670: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20  database file.  
6680: 54 68 69 73 20 69 73 20 6e 6f 72 6d 61 6c 6c 79  This is normally
6690: 20 74 68 65 20 63 61 73 65 0a 2a 2a 20 77 68 65   the case.** whe
66a0: 6e 20 74 68 65 20 22 54 45 4d 50 22 20 6f 72 20  n the "TEMP" or 
66b0: 22 54 45 4d 50 4f 52 41 52 59 22 20 6b 65 79 77  "TEMPORARY" keyw
66c0: 6f 72 64 20 6f 63 63 75 72 73 20 69 6e 20 62 65  ord occurs in be
66d0: 74 77 65 65 6e 0a 2a 2a 20 43 52 45 41 54 45 20  tween.** CREATE 
66e0: 61 6e 64 20 54 41 42 4c 45 2e 0a 2a 2a 0a 2a 2a  and TABLE..**.**
66f0: 20 54 68 65 20 6e 65 77 20 74 61 62 6c 65 20 72   The new table r
6700: 65 63 6f 72 64 20 69 73 20 69 6e 69 74 69 61 6c  ecord is initial
6710: 69 7a 65 64 20 61 6e 64 20 70 75 74 20 69 6e 20  ized and put in 
6720: 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
6730: 65 2e 0a 2a 2a 20 41 73 20 6d 6f 72 65 20 6f 66  e..** As more of
6740: 20 74 68 65 20 43 52 45 41 54 45 20 54 41 42 4c   the CREATE TABL
6750: 45 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 70  E statement is p
6760: 61 72 73 65 64 2c 20 61 64 64 69 74 69 6f 6e 61  arsed, additiona
6770: 6c 20 61 63 74 69 6f 6e 0a 2a 2a 20 72 6f 75 74  l action.** rout
6780: 69 6e 65 73 20 77 69 6c 6c 20 62 65 20 63 61 6c  ines will be cal
6790: 6c 65 64 20 74 6f 20 61 64 64 20 6d 6f 72 65 20  led to add more 
67a0: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20 74  information to t
67b0: 68 69 73 20 72 65 63 6f 72 64 2e 0a 2a 2a 20 41  his record..** A
67c0: 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
67d0: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74   CREATE TABLE st
67e0: 61 74 65 6d 65 6e 74 2c 20 74 68 65 20 73 71 6c  atement, the sql
67f0: 69 74 65 33 45 6e 64 54 61 62 6c 65 28 29 20 72  ite3EndTable() r
6800: 6f 75 74 69 6e 65 0a 2a 2a 20 69 73 20 63 61 6c  outine.** is cal
6810: 6c 65 64 20 74 6f 20 63 6f 6d 70 6c 65 74 65 20  led to complete 
6820: 74 68 65 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e  the construction
6830: 20 6f 66 20 74 68 65 20 6e 65 77 20 74 61 62 6c   of the new tabl
6840: 65 20 72 65 63 6f 72 64 2e 0a 2a 2f 0a 76 6f 69  e record..*/.voi
6850: 64 20 73 71 6c 69 74 65 33 53 74 61 72 74 54 61  d sqlite3StartTa
6860: 62 6c 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ble(.  Parse *pP
6870: 61 72 73 65 2c 20 20 20 2f 2a 20 50 61 72 73 65  arse,   /* Parse
6880: 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54  r context */.  T
6890: 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c 20 20 20  oken *pName1,   
68a0: 2f 2a 20 46 69 72 73 74 20 70 61 72 74 20 6f 66  /* First part of
68b0: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
68c0: 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77 20 2a   table or view *
68d0: 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65  /.  Token *pName
68e0: 32 2c 20 20 20 2f 2a 20 53 65 63 6f 6e 64 20 70  2,   /* Second p
68f0: 61 72 74 20 6f 66 20 74 68 65 20 6e 61 6d 65 20  art of the name 
6900: 6f 66 20 74 68 65 20 74 61 62 6c 65 20 6f 72 20  of the table or 
6910: 76 69 65 77 20 2a 2f 0a 20 20 69 6e 74 20 69 73  view */.  int is
6920: 54 65 6d 70 2c 20 20 20 20 20 20 2f 2a 20 54 72  Temp,      /* Tr
6930: 75 65 20 69 66 20 74 68 69 73 20 69 73 20 61 20  ue if this is a 
6940: 54 45 4d 50 20 74 61 62 6c 65 20 2a 2f 0a 20 20  TEMP table */.  
6950: 69 6e 74 20 69 73 56 69 65 77 2c 20 20 20 20 20  int isView,     
6960: 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69 73   /* True if this
6970: 20 69 73 20 61 20 56 49 45 57 20 2a 2f 0a 20 20   is a VIEW */.  
6980: 69 6e 74 20 69 73 56 69 72 74 75 61 6c 2c 20 20  int isVirtual,  
6990: 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69 73   /* True if this
69a0: 20 69 73 20 61 20 56 49 52 54 55 41 4c 20 74 61   is a VIRTUAL ta
69b0: 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 45  ble */.  int noE
69c0: 72 72 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20  rr        /* Do 
69d0: 6e 6f 74 68 69 6e 67 20 69 66 20 74 61 62 6c 65  nothing if table
69e0: 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 20   already exists 
69f0: 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70  */.){.  Table *p
6a00: 54 61 62 6c 65 3b 0a 20 20 63 68 61 72 20 2a 7a  Table;.  char *z
6a10: 4e 61 6d 65 20 3d 20 30 3b 20 2f 2a 20 54 68 65  Name = 0; /* The
6a20: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 6e 65 77   name of the new
6a30: 20 74 61 62 6c 65 20 2a 2f 0a 20 20 73 71 6c 69   table */.  sqli
6a40: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
6a50: 2d 3e 64 62 3b 0a 20 20 56 64 62 65 20 2a 76 3b  ->db;.  Vdbe *v;
6a60: 0a 20 20 69 6e 74 20 69 44 62 3b 20 20 20 20 20  .  int iDb;     
6a70: 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
6a80: 6e 75 6d 62 65 72 20 74 6f 20 63 72 65 61 74 65  number to create
6a90: 20 74 68 65 20 74 61 62 6c 65 20 69 6e 20 2a 2f   the table in */
6aa0: 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 3b  .  Token *pName;
6ab0: 20 20 20 20 2f 2a 20 55 6e 71 75 61 6c 69 66 69      /* Unqualifi
6ac0: 65 64 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74  ed name of the t
6ad0: 61 62 6c 65 20 74 6f 20 63 72 65 61 74 65 20 2a  able to create *
6ae0: 2f 0a 0a 20 20 69 66 28 20 64 62 2d 3e 69 6e 69  /..  if( db->ini
6af0: 74 2e 62 75 73 79 20 26 26 20 64 62 2d 3e 69 6e  t.busy && db->in
6b00: 69 74 2e 6e 65 77 54 6e 75 6d 3d 3d 31 20 29 7b  it.newTnum==1 ){
6b10: 0a 20 20 20 20 2f 2a 20 53 70 65 63 69 61 6c 20  .    /* Special 
6b20: 63 61 73 65 3a 20 20 50 61 72 73 69 6e 67 20 74  case:  Parsing t
6b30: 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  he sqlite_master
6b40: 20 6f 72 20 73 71 6c 69 74 65 5f 74 65 6d 70 5f   or sqlite_temp_
6b50: 6d 61 73 74 65 72 20 73 63 68 65 6d 61 20 2a 2f  master schema */
6b60: 0a 20 20 20 20 69 44 62 20 3d 20 64 62 2d 3e 69  .    iDb = db->i
6b70: 6e 69 74 2e 69 44 62 3b 0a 20 20 20 20 7a 4e 61  nit.iDb;.    zNa
6b80: 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  me = sqlite3DbSt
6b90: 72 44 75 70 28 64 62 2c 20 53 43 48 45 4d 41 5f  rDup(db, SCHEMA_
6ba0: 54 41 42 4c 45 28 69 44 62 29 29 3b 0a 20 20 20  TABLE(iDb));.   
6bb0: 20 70 4e 61 6d 65 20 3d 20 70 4e 61 6d 65 31 3b   pName = pName1;
6bc0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
6bd0: 20 54 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65   The common case
6be0: 20 2a 2f 0a 20 20 20 20 69 44 62 20 3d 20 73 71   */.    iDb = sq
6bf0: 6c 69 74 65 33 54 77 6f 50 61 72 74 4e 61 6d 65  lite3TwoPartName
6c00: 28 70 50 61 72 73 65 2c 20 70 4e 61 6d 65 31 2c  (pParse, pName1,
6c10: 20 70 4e 61 6d 65 32 2c 20 26 70 4e 61 6d 65 29   pName2, &pName)
6c20: 3b 0a 20 20 20 20 69 66 28 20 69 44 62 3c 30 20  ;.    if( iDb<0 
6c30: 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 69 66  ) return;.    if
6c40: 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26  ( !OMIT_TEMPDB &
6c50: 26 20 69 73 54 65 6d 70 20 26 26 20 70 4e 61 6d  & isTemp && pNam
6c60: 65 32 2d 3e 6e 3e 30 20 26 26 20 69 44 62 21 3d  e2->n>0 && iDb!=
6c70: 31 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66  1 ){.      /* If
6c80: 20 63 72 65 61 74 69 6e 67 20 61 20 74 65 6d 70   creating a temp
6c90: 20 74 61 62 6c 65 2c 20 74 68 65 20 6e 61 6d 65   table, the name
6ca0: 20 6d 61 79 20 6e 6f 74 20 62 65 20 71 75 61 6c   may not be qual
6cb0: 69 66 69 65 64 2e 20 55 6e 6c 65 73 73 20 0a 20  ified. Unless . 
6cc0: 20 20 20 20 20 2a 2a 20 74 68 65 20 64 61 74 61       ** the data
6cd0: 62 61 73 65 20 6e 61 6d 65 20 69 73 20 22 74 65  base name is "te
6ce0: 6d 70 22 20 61 6e 79 77 61 79 2e 20 20 2a 2f 0a  mp" anyway.  */.
6cf0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
6d00: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74  orMsg(pParse, "t
6d10: 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 6e  emporary table n
6d20: 61 6d 65 20 6d 75 73 74 20 62 65 20 75 6e 71 75  ame must be unqu
6d30: 61 6c 69 66 69 65 64 22 29 3b 0a 20 20 20 20 20  alified");.     
6d40: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20   return;.    }. 
6d50: 20 20 20 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d     if( !OMIT_TEM
6d60: 50 44 42 20 26 26 20 69 73 54 65 6d 70 20 29 20  PDB && isTemp ) 
6d70: 69 44 62 20 3d 20 31 3b 0a 20 20 20 20 7a 4e 61  iDb = 1;.    zNa
6d80: 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65  me = sqlite3Name
6d90: 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 4e  FromToken(db, pN
6da0: 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 70 50 61 72  ame);.  }.  pPar
6db0: 73 65 2d 3e 73 4e 61 6d 65 54 6f 6b 65 6e 20 3d  se->sNameToken =
6dc0: 20 2a 70 4e 61 6d 65 3b 0a 20 20 69 66 28 20 7a   *pName;.  if( z
6dd0: 4e 61 6d 65 3d 3d 30 20 29 20 72 65 74 75 72 6e  Name==0 ) return
6de0: 3b 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f  ;.  if( SQLITE_O
6df0: 4b 21 3d 73 71 6c 69 74 65 33 43 68 65 63 6b 4f  K!=sqlite3CheckO
6e00: 62 6a 65 63 74 4e 61 6d 65 28 70 50 61 72 73 65  bjectName(pParse
6e10: 2c 20 7a 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20  , zName) ){.    
6e20: 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65  goto begin_table
6e30: 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 69 66  _error;.  }.  if
6e40: 28 20 64 62 2d 3e 69 6e 69 74 2e 69 44 62 3d 3d  ( db->init.iDb==
6e50: 31 20 29 20 69 73 54 65 6d 70 20 3d 20 31 3b 0a  1 ) isTemp = 1;.
6e60: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
6e70: 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f  MIT_AUTHORIZATIO
6e80: 4e 0a 20 20 61 73 73 65 72 74 28 20 69 73 54 65  N.  assert( isTe
6e90: 6d 70 3d 3d 30 20 7c 7c 20 69 73 54 65 6d 70 3d  mp==0 || isTemp=
6ea0: 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =1 );.  assert( 
6eb0: 69 73 56 69 65 77 3d 3d 30 20 7c 7c 20 69 73 56  isView==0 || isV
6ec0: 69 65 77 3d 3d 31 20 29 3b 0a 20 20 7b 0a 20 20  iew==1 );.  {.  
6ed0: 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75    static const u
6ee0: 38 20 61 43 6f 64 65 5b 5d 20 3d 20 7b 0a 20 20  8 aCode[] = {.  
6ef0: 20 20 20 20 20 53 51 4c 49 54 45 5f 43 52 45 41       SQLITE_CREA
6f00: 54 45 5f 54 41 42 4c 45 2c 0a 20 20 20 20 20 20  TE_TABLE,.      
6f10: 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54   SQLITE_CREATE_T
6f20: 45 4d 50 5f 54 41 42 4c 45 2c 0a 20 20 20 20 20  EMP_TABLE,.     
6f30: 20 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f    SQLITE_CREATE_
6f40: 56 49 45 57 2c 0a 20 20 20 20 20 20 20 53 51 4c  VIEW,.       SQL
6f50: 49 54 45 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f  ITE_CREATE_TEMP_
6f60: 56 49 45 57 0a 20 20 20 20 7d 3b 0a 20 20 20 20  VIEW.    };.    
6f70: 63 68 61 72 20 2a 7a 44 62 20 3d 20 64 62 2d 3e  char *zDb = db->
6f80: 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a  aDb[iDb].zName;.
6f90: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 41      if( sqlite3A
6fa0: 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c  uthCheck(pParse,
6fb0: 20 53 51 4c 49 54 45 5f 49 4e 53 45 52 54 2c 20   SQLITE_INSERT, 
6fc0: 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 73 54  SCHEMA_TABLE(isT
6fd0: 65 6d 70 29 2c 20 30 2c 20 7a 44 62 29 20 29 7b  emp), 0, zDb) ){
6fe0: 0a 20 20 20 20 20 20 67 6f 74 6f 20 62 65 67 69  .      goto begi
6ff0: 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b 0a 20  n_table_error;. 
7000: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21 69 73     }.    if( !is
7010: 56 69 72 74 75 61 6c 20 26 26 20 73 71 6c 69 74  Virtual && sqlit
7020: 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72  e3AuthCheck(pPar
7030: 73 65 2c 20 28 69 6e 74 29 61 43 6f 64 65 5b 69  se, (int)aCode[i
7040: 73 54 65 6d 70 2b 32 2a 69 73 56 69 65 77 5d 2c  sTemp+2*isView],
7050: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
7060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7070: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 2c 20 30          zName, 0
7080: 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20  , zDb) ){.      
7090: 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65  goto begin_table
70a0: 5f 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20  _error;.    }.  
70b0: 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 4d  }.#endif..  /* M
70c0: 61 6b 65 20 73 75 72 65 20 74 68 65 20 6e 65 77  ake sure the new
70d0: 20 74 61 62 6c 65 20 6e 61 6d 65 20 64 6f 65 73   table name does
70e0: 20 6e 6f 74 20 63 6f 6c 6c 69 64 65 20 77 69 74   not collide wit
70f0: 68 20 61 6e 20 65 78 69 73 74 69 6e 67 0a 20 20  h an existing.  
7100: 2a 2a 20 69 6e 64 65 78 20 6f 72 20 74 61 62 6c  ** index or tabl
7110: 65 20 6e 61 6d 65 20 69 6e 20 74 68 65 20 73 61  e name in the sa
7120: 6d 65 20 64 61 74 61 62 61 73 65 2e 20 20 49 73  me database.  Is
7130: 73 75 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73  sue an error mes
7140: 73 61 67 65 20 69 66 0a 20 20 2a 2a 20 69 74 20  sage if.  ** it 
7150: 64 6f 65 73 2e 20 54 68 65 20 65 78 63 65 70 74  does. The except
7160: 69 6f 6e 20 69 73 20 69 66 20 74 68 65 20 73 74  ion is if the st
7170: 61 74 65 6d 65 6e 74 20 62 65 69 6e 67 20 70 61  atement being pa
7180: 72 73 65 64 20 77 61 73 20 70 61 73 73 65 64 0a  rsed was passed.
7190: 20 20 2a 2a 20 74 6f 20 61 6e 20 73 71 6c 69 74    ** to an sqlit
71a0: 65 33 5f 64 65 63 6c 61 72 65 5f 76 74 61 62 28  e3_declare_vtab(
71b0: 29 20 63 61 6c 6c 2e 20 49 6e 20 74 68 61 74 20  ) call. In that 
71c0: 63 61 73 65 20 6f 6e 6c 79 20 74 68 65 20 63 6f  case only the co
71d0: 6c 75 6d 6e 20 6e 61 6d 65 73 0a 20 20 2a 2a 20  lumn names.  ** 
71e0: 61 6e 64 20 74 79 70 65 73 20 77 69 6c 6c 20 62  and types will b
71f0: 65 20 75 73 65 64 2c 20 73 6f 20 74 68 65 72 65  e used, so there
7200: 20 69 73 20 6e 6f 20 6e 65 65 64 20 74 6f 20 74   is no need to t
7210: 65 73 74 20 66 6f 72 20 6e 61 6d 65 73 70 61 63  est for namespac
7220: 65 0a 20 20 2a 2a 20 63 6f 6c 6c 69 73 69 6f 6e  e.  ** collision
7230: 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 49  s..  */.  if( !I
7240: 4e 5f 44 45 43 4c 41 52 45 5f 56 54 41 42 20 29  N_DECLARE_VTAB )
7250: 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 44 62 20  {.    char *zDb 
7260: 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a  = db->aDb[iDb].z
7270: 4e 61 6d 65 3b 0a 20 20 20 20 69 66 28 20 53 51  Name;.    if( SQ
7280: 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33  LITE_OK!=sqlite3
7290: 52 65 61 64 53 63 68 65 6d 61 28 70 50 61 72 73  ReadSchema(pPars
72a0: 65 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  e) ){.      goto
72b0: 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72   begin_table_err
72c0: 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 54  or;.    }.    pT
72d0: 61 62 6c 65 20 3d 20 73 71 6c 69 74 65 33 46 69  able = sqlite3Fi
72e0: 6e 64 54 61 62 6c 65 28 64 62 2c 20 7a 4e 61 6d  ndTable(db, zNam
72f0: 65 2c 20 7a 44 62 29 3b 0a 20 20 20 20 69 66 28  e, zDb);.    if(
7300: 20 70 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 20   pTable ){.     
7310: 20 69 66 28 20 21 6e 6f 45 72 72 20 29 7b 0a 20   if( !noErr ){. 
7320: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
7330: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
7340: 74 61 62 6c 65 20 25 54 20 61 6c 72 65 61 64 79  table %T already
7350: 20 65 78 69 73 74 73 22 2c 20 70 4e 61 6d 65 29   exists", pName)
7360: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
7370: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21         assert( !
7380: 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 7c 7c  db->init.busy ||
7390: 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 20   CORRUPT_DB );. 
73a0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f         sqlite3Co
73b0: 64 65 56 65 72 69 66 79 53 63 68 65 6d 61 28 70  deVerifySchema(p
73c0: 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 20  Parse, iDb);.   
73d0: 20 20 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20     }.      goto 
73e0: 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f  begin_table_erro
73f0: 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  r;.    }.    if(
7400: 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 64 65   sqlite3FindInde
7410: 78 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 7a 44 62  x(db, zName, zDb
7420: 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  )!=0 ){.      sq
7430: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
7440: 61 72 73 65 2c 20 22 74 68 65 72 65 20 69 73 20  arse, "there is 
7450: 61 6c 72 65 61 64 79 20 61 6e 20 69 6e 64 65 78  already an index
7460: 20 6e 61 6d 65 64 20 25 73 22 2c 20 7a 4e 61 6d   named %s", zNam
7470: 65 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 62  e);.      goto b
7480: 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72  egin_table_error
7490: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70  ;.    }.  }..  p
74a0: 54 61 62 6c 65 20 3d 20 73 71 6c 69 74 65 33 44  Table = sqlite3D
74b0: 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20  bMallocZero(db, 
74c0: 73 69 7a 65 6f 66 28 54 61 62 6c 65 29 29 3b 0a  sizeof(Table));.
74d0: 20 20 69 66 28 20 70 54 61 62 6c 65 3d 3d 30 20    if( pTable==0 
74e0: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 64  ){.    assert( d
74f0: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
7500: 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 72  );.    pParse->r
7510: 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
7520: 5f 42 4b 50 54 3b 0a 20 20 20 20 70 50 61 72 73  _BKPT;.    pPars
7530: 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 67  e->nErr++;.    g
7540: 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f  oto begin_table_
7550: 65 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 70 54 61  error;.  }.  pTa
7560: 62 6c 65 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 4e 61  ble->zName = zNa
7570: 6d 65 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 69 50  me;.  pTable->iP
7580: 4b 65 79 20 3d 20 2d 31 3b 0a 20 20 70 54 61 62  Key = -1;.  pTab
7590: 6c 65 2d 3e 70 53 63 68 65 6d 61 20 3d 20 64 62  le->pSchema = db
75a0: 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53 63 68 65  ->aDb[iDb].pSche
75b0: 6d 61 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 6e 52  ma;.  pTable->nR
75c0: 65 66 20 3d 20 31 3b 0a 20 20 70 54 61 62 6c 65  ef = 1;.  pTable
75d0: 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74 20 3d 20 32  ->nRowLogEst = 2
75e0: 30 30 3b 20 61 73 73 65 72 74 28 20 32 30 30 3d  00; assert( 200=
75f0: 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 31  =sqlite3LogEst(1
7600: 30 34 38 35 37 36 29 20 29 3b 0a 20 20 61 73 73  048576) );.  ass
7610: 65 72 74 28 20 70 50 61 72 73 65 2d 3e 70 4e 65  ert( pParse->pNe
7620: 77 54 61 62 6c 65 3d 3d 30 20 29 3b 0a 20 20 70  wTable==0 );.  p
7630: 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
7640: 20 3d 20 70 54 61 62 6c 65 3b 0a 0a 20 20 2f 2a   = pTable;..  /*
7650: 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20   If this is the 
7660: 6d 61 67 69 63 20 73 71 6c 69 74 65 5f 73 65 71  magic sqlite_seq
7670: 75 65 6e 63 65 20 74 61 62 6c 65 20 75 73 65 64  uence table used
7680: 20 62 79 20 61 75 74 6f 69 6e 63 72 65 6d 65 6e   by autoincremen
7690: 74 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 72 65 63  t,.  ** then rec
76a0: 6f 72 64 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  ord a pointer to
76b0: 20 74 68 69 73 20 74 61 62 6c 65 20 69 6e 20 74   this table in t
76c0: 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65  he main database
76d0: 20 73 74 72 75 63 74 75 72 65 0a 20 20 2a 2a 20   structure.  ** 
76e0: 73 6f 20 74 68 61 74 20 49 4e 53 45 52 54 20 63  so that INSERT c
76f0: 61 6e 20 66 69 6e 64 20 74 68 65 20 74 61 62 6c  an find the tabl
7700: 65 20 65 61 73 69 6c 79 2e 0a 20 20 2a 2f 0a 23  e easily..  */.#
7710: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
7720: 49 54 5f 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54  IT_AUTOINCREMENT
7730: 0a 20 20 69 66 28 20 21 70 50 61 72 73 65 2d 3e  .  if( !pParse->
7740: 6e 65 73 74 65 64 20 26 26 20 73 74 72 63 6d 70  nested && strcmp
7750: 28 7a 4e 61 6d 65 2c 20 22 73 71 6c 69 74 65 5f  (zName, "sqlite_
7760: 73 65 71 75 65 6e 63 65 22 29 3d 3d 30 20 29 7b  sequence")==0 ){
7770: 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c  .    assert( sql
7780: 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48  ite3SchemaMutexH
7790: 65 6c 64 28 64 62 2c 20 69 44 62 2c 20 30 29 20  eld(db, iDb, 0) 
77a0: 29 3b 0a 20 20 20 20 70 54 61 62 6c 65 2d 3e 70  );.    pTable->p
77b0: 53 63 68 65 6d 61 2d 3e 70 53 65 71 54 61 62 20  Schema->pSeqTab 
77c0: 3d 20 70 54 61 62 6c 65 3b 0a 20 20 7d 0a 23 65  = pTable;.  }.#e
77d0: 6e 64 69 66 0a 0a 20 20 2f 2a 20 42 65 67 69 6e  ndif..  /* Begin
77e0: 20 67 65 6e 65 72 61 74 69 6e 67 20 74 68 65 20   generating the 
77f0: 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 69  code that will i
7800: 6e 73 65 72 74 20 74 68 65 20 74 61 62 6c 65 20  nsert the table 
7810: 72 65 63 6f 72 64 20 69 6e 74 6f 0a 20 20 2a 2a  record into.  **
7820: 20 74 68 65 20 53 51 4c 49 54 45 5f 4d 41 53 54   the SQLITE_MAST
7830: 45 52 20 74 61 62 6c 65 2e 20 20 4e 6f 74 65 20  ER table.  Note 
7840: 69 6e 20 70 61 72 74 69 63 75 6c 61 72 20 74 68  in particular th
7850: 61 74 20 77 65 20 6d 75 73 74 20 67 6f 20 61 68  at we must go ah
7860: 65 61 64 0a 20 20 2a 2a 20 61 6e 64 20 61 6c 6c  ead.  ** and all
7870: 6f 63 61 74 65 20 74 68 65 20 72 65 63 6f 72 64  ocate the record
7880: 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20   number for the 
7890: 74 61 62 6c 65 20 65 6e 74 72 79 20 6e 6f 77 2e  table entry now.
78a0: 20 20 42 65 66 6f 72 65 20 61 6e 79 0a 20 20 2a    Before any.  *
78b0: 2a 20 50 52 49 4d 41 52 59 20 4b 45 59 20 6f 72  * PRIMARY KEY or
78c0: 20 55 4e 49 51 55 45 20 6b 65 79 77 6f 72 64 73   UNIQUE keywords
78d0: 20 61 72 65 20 70 61 72 73 65 64 2e 20 20 54 68   are parsed.  Th
78e0: 6f 73 65 20 6b 65 79 77 6f 72 64 73 20 77 69 6c  ose keywords wil
78f0: 6c 20 63 61 75 73 65 0a 20 20 2a 2a 20 69 6e 64  l cause.  ** ind
7900: 69 63 65 73 20 74 6f 20 62 65 20 63 72 65 61 74  ices to be creat
7910: 65 64 20 61 6e 64 20 74 68 65 20 74 61 62 6c 65  ed and the table
7920: 20 72 65 63 6f 72 64 20 6d 75 73 74 20 63 6f 6d   record must com
7930: 65 20 62 65 66 6f 72 65 20 74 68 65 20 0a 20 20  e before the .  
7940: 2a 2a 20 69 6e 64 69 63 65 73 2e 20 20 48 65 6e  ** indices.  Hen
7950: 63 65 2c 20 74 68 65 20 72 65 63 6f 72 64 20 6e  ce, the record n
7960: 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20 74 61  umber for the ta
7970: 62 6c 65 20 6d 75 73 74 20 62 65 20 61 6c 6c 6f  ble must be allo
7980: 63 61 74 65 64 0a 20 20 2a 2a 20 6e 6f 77 2e 0a  cated.  ** now..
7990: 20 20 2a 2f 0a 20 20 69 66 28 20 21 64 62 2d 3e    */.  if( !db->
79a0: 69 6e 69 74 2e 62 75 73 79 20 26 26 20 28 76 20  init.busy && (v 
79b0: 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
79c0: 28 70 50 61 72 73 65 29 29 21 3d 30 20 29 7b 0a  (pParse))!=0 ){.
79d0: 20 20 20 20 69 6e 74 20 61 64 64 72 31 3b 0a 20      int addr1;. 
79e0: 20 20 20 69 6e 74 20 66 69 6c 65 46 6f 72 6d 61     int fileForma
79f0: 74 3b 0a 20 20 20 20 69 6e 74 20 72 65 67 31 2c  t;.    int reg1,
7a00: 20 72 65 67 32 2c 20 72 65 67 33 3b 0a 20 20 20   reg2, reg3;.   
7a10: 20 2f 2a 20 6e 75 6c 6c 52 6f 77 5b 5d 20 69 73   /* nullRow[] is
7a20: 20 61 6e 20 4f 50 5f 52 65 63 6f 72 64 20 65 6e   an OP_Record en
7a30: 63 6f 64 69 6e 67 20 6f 66 20 61 20 72 6f 77 20  coding of a row 
7a40: 63 6f 6e 74 61 69 6e 69 6e 67 20 35 20 4e 55 4c  containing 5 NUL
7a50: 4c 73 20 2a 2f 0a 20 20 20 20 73 74 61 74 69 63  Ls */.    static
7a60: 20 63 6f 6e 73 74 20 63 68 61 72 20 6e 75 6c 6c   const char null
7a70: 52 6f 77 5b 5d 20 3d 20 7b 20 36 2c 20 30 2c 20  Row[] = { 6, 0, 
7a80: 30 2c 20 30 2c 20 30 2c 20 30 20 7d 3b 0a 20 20  0, 0, 0, 0 };.  
7a90: 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72    sqlite3BeginWr
7aa0: 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61  iteOperation(pPa
7ab0: 72 73 65 2c 20 31 2c 20 69 44 62 29 3b 0a 0a 23  rse, 1, iDb);..#
7ac0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
7ad0: 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
7ae0: 20 20 20 20 69 66 28 20 69 73 56 69 72 74 75 61      if( isVirtua
7af0: 6c 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  l ){.      sqlit
7b00: 65 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20  e3VdbeAddOp0(v, 
7b10: 4f 50 5f 56 42 65 67 69 6e 29 3b 0a 20 20 20 20  OP_VBegin);.    
7b20: 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a  }.#endif..    /*
7b30: 20 49 66 20 74 68 65 20 66 69 6c 65 20 66 6f 72   If the file for
7b40: 6d 61 74 20 61 6e 64 20 65 6e 63 6f 64 69 6e 67  mat and encoding
7b50: 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
7b60: 20 68 61 76 65 20 6e 6f 74 20 62 65 65 6e 20 73   have not been s
7b70: 65 74 2c 20 0a 20 20 20 20 2a 2a 20 73 65 74 20  et, .    ** set 
7b80: 74 68 65 6d 20 6e 6f 77 2e 0a 20 20 20 20 2a 2f  them now..    */
7b90: 0a 20 20 20 20 72 65 67 31 20 3d 20 70 50 61 72  .    reg1 = pPar
7ba0: 73 65 2d 3e 72 65 67 52 6f 77 69 64 20 3d 20 2b  se->regRowid = +
7bb0: 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
7bc0: 20 20 20 72 65 67 32 20 3d 20 70 50 61 72 73 65     reg2 = pParse
7bd0: 2d 3e 72 65 67 52 6f 6f 74 20 3d 20 2b 2b 70 50  ->regRoot = ++pP
7be0: 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
7bf0: 72 65 67 33 20 3d 20 2b 2b 70 50 61 72 73 65 2d  reg3 = ++pParse-
7c00: 3e 6e 4d 65 6d 3b 0a 20 20 20 20 73 71 6c 69 74  >nMem;.    sqlit
7c10: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
7c20: 4f 50 5f 52 65 61 64 43 6f 6f 6b 69 65 2c 20 69  OP_ReadCookie, i
7c30: 44 62 2c 20 72 65 67 33 2c 20 42 54 52 45 45 5f  Db, reg3, BTREE_
7c40: 46 49 4c 45 5f 46 4f 52 4d 41 54 29 3b 0a 20 20  FILE_FORMAT);.  
7c50: 20 20 73 71 6c 69 74 65 33 56 64 62 65 55 73 65    sqlite3VdbeUse
7c60: 73 42 74 72 65 65 28 76 2c 20 69 44 62 29 3b 0a  sBtree(v, iDb);.
7c70: 20 20 20 20 61 64 64 72 31 20 3d 20 73 71 6c 69      addr1 = sqli
7c80: 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
7c90: 20 4f 50 5f 49 66 2c 20 72 65 67 33 29 3b 20 56   OP_If, reg3); V
7ca0: 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
7cb0: 20 20 20 20 66 69 6c 65 46 6f 72 6d 61 74 20 3d      fileFormat =
7cc0: 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51   (db->flags & SQ
7cd0: 4c 49 54 45 5f 4c 65 67 61 63 79 46 69 6c 65 46  LITE_LegacyFileF
7ce0: 6d 74 29 21 3d 30 20 3f 0a 20 20 20 20 20 20 20  mt)!=0 ?.       
7cf0: 20 20 20 20 20 20 20 20 20 20 20 31 20 3a 20 53             1 : S
7d00: 51 4c 49 54 45 5f 4d 41 58 5f 46 49 4c 45 5f 46  QLITE_MAX_FILE_F
7d10: 4f 52 4d 41 54 3b 0a 20 20 20 20 73 71 6c 69 74  ORMAT;.    sqlit
7d20: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
7d30: 4f 50 5f 53 65 74 43 6f 6f 6b 69 65 2c 20 69 44  OP_SetCookie, iD
7d40: 62 2c 20 42 54 52 45 45 5f 46 49 4c 45 5f 46 4f  b, BTREE_FILE_FO
7d50: 52 4d 41 54 2c 20 66 69 6c 65 46 6f 72 6d 61 74  RMAT, fileFormat
7d60: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
7d70: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53  beAddOp3(v, OP_S
7d80: 65 74 43 6f 6f 6b 69 65 2c 20 69 44 62 2c 20 42  etCookie, iDb, B
7d90: 54 52 45 45 5f 54 45 58 54 5f 45 4e 43 4f 44 49  TREE_TEXT_ENCODI
7da0: 4e 47 2c 20 45 4e 43 28 64 62 29 29 3b 0a 20 20  NG, ENC(db));.  
7db0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
7dc0: 70 48 65 72 65 28 76 2c 20 61 64 64 72 31 29 3b  pHere(v, addr1);
7dd0: 0a 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 6a 75  ..    /* This ju
7de0: 73 74 20 63 72 65 61 74 65 73 20 61 20 70 6c 61  st creates a pla
7df0: 63 65 2d 68 6f 6c 64 65 72 20 72 65 63 6f 72 64  ce-holder record
7e00: 20 69 6e 20 74 68 65 20 73 71 6c 69 74 65 5f 6d   in the sqlite_m
7e10: 61 73 74 65 72 20 74 61 62 6c 65 2e 0a 20 20 20  aster table..   
7e20: 20 2a 2a 20 54 68 65 20 72 65 63 6f 72 64 20 63   ** The record c
7e30: 72 65 61 74 65 64 20 64 6f 65 73 20 6e 6f 74 20  reated does not 
7e40: 63 6f 6e 74 61 69 6e 20 61 6e 79 74 68 69 6e 67  contain anything
7e50: 20 79 65 74 2e 20 20 49 74 20 77 69 6c 6c 20 62   yet.  It will b
7e60: 65 20 72 65 70 6c 61 63 65 64 0a 20 20 20 20 2a  e replaced.    *
7e70: 2a 20 62 79 20 74 68 65 20 72 65 61 6c 20 65 6e  * by the real en
7e80: 74 72 79 20 69 6e 20 63 6f 64 65 20 67 65 6e 65  try in code gene
7e90: 72 61 74 65 64 20 61 74 20 73 71 6c 69 74 65 33  rated at sqlite3
7ea0: 45 6e 64 54 61 62 6c 65 28 29 2e 0a 20 20 20 20  EndTable()..    
7eb0: 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 72 6f  **.    ** The ro
7ec0: 77 69 64 20 66 6f 72 20 74 68 65 20 6e 65 77 20  wid for the new 
7ed0: 65 6e 74 72 79 20 69 73 20 6c 65 66 74 20 69 6e  entry is left in
7ee0: 20 72 65 67 69 73 74 65 72 20 70 50 61 72 73 65   register pParse
7ef0: 2d 3e 72 65 67 52 6f 77 69 64 2e 0a 20 20 20 20  ->regRowid..    
7f00: 2a 2a 20 54 68 65 20 72 6f 6f 74 20 70 61 67 65  ** The root page
7f10: 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 6e   number of the n
7f20: 65 77 20 74 61 62 6c 65 20 69 73 20 6c 65 66 74  ew table is left
7f30: 20 69 6e 20 72 65 67 20 70 50 61 72 73 65 2d 3e   in reg pParse->
7f40: 72 65 67 52 6f 6f 74 2e 0a 20 20 20 20 2a 2a 20  regRoot..    ** 
7f50: 54 68 65 20 72 6f 77 69 64 20 61 6e 64 20 72 6f  The rowid and ro
7f60: 6f 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20 76  ot page number v
7f70: 61 6c 75 65 73 20 61 72 65 20 6e 65 65 64 65 64  alues are needed
7f80: 20 62 79 20 74 68 65 20 63 6f 64 65 20 74 68 61   by the code tha
7f90: 74 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33  t.    ** sqlite3
7fa0: 45 6e 64 54 61 62 6c 65 20 77 69 6c 6c 20 67 65  EndTable will ge
7fb0: 6e 65 72 61 74 65 2e 0a 20 20 20 20 2a 2f 0a 23  nerate..    */.#
7fc0: 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
7fd0: 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 7c 7c  TE_OMIT_VIEW) ||
7fe0: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
7ff0: 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
8000: 4c 45 29 0a 20 20 20 20 69 66 28 20 69 73 56 69  LE).    if( isVi
8010: 65 77 20 7c 7c 20 69 73 56 69 72 74 75 61 6c 20  ew || isVirtual 
8020: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
8030: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
8040: 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 72 65 67  _Integer, 0, reg
8050: 32 29 3b 0a 20 20 20 20 7d 65 6c 73 65 0a 23 65  2);.    }else.#e
8060: 6e 64 69 66 0a 20 20 20 20 7b 0a 20 20 20 20 20  ndif.    {.     
8070: 20 70 50 61 72 73 65 2d 3e 61 64 64 72 43 72 54   pParse->addrCrT
8080: 61 62 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  ab = sqlite3Vdbe
8090: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 72 65  AddOp2(v, OP_Cre
80a0: 61 74 65 54 61 62 6c 65 2c 20 69 44 62 2c 20 72  ateTable, iDb, r
80b0: 65 67 32 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  eg2);.    }.    
80c0: 73 71 6c 69 74 65 33 4f 70 65 6e 4d 61 73 74 65  sqlite3OpenMaste
80d0: 72 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 69  rTable(pParse, i
80e0: 44 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Db);.    sqlite3
80f0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
8100: 5f 4e 65 77 52 6f 77 69 64 2c 20 30 2c 20 72 65  _NewRowid, 0, re
8110: 67 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  g1);.    sqlite3
8120: 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
8130: 5f 42 6c 6f 62 2c 20 36 2c 20 72 65 67 33 2c 20  _Blob, 6, reg3, 
8140: 30 2c 20 6e 75 6c 6c 52 6f 77 2c 20 50 34 5f 53  0, nullRow, P4_S
8150: 54 41 54 49 43 29 3b 0a 20 20 20 20 73 71 6c 69  TATIC);.    sqli
8160: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
8170: 20 4f 50 5f 49 6e 73 65 72 74 2c 20 30 2c 20 72   OP_Insert, 0, r
8180: 65 67 33 2c 20 72 65 67 31 29 3b 0a 20 20 20 20  eg3, reg1);.    
8190: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
81a0: 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 41 50  eP5(v, OPFLAG_AP
81b0: 50 45 4e 44 29 3b 0a 20 20 20 20 73 71 6c 69 74  PEND);.    sqlit
81c0: 65 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20  e3VdbeAddOp0(v, 
81d0: 4f 50 5f 43 6c 6f 73 65 29 3b 0a 20 20 7d 0a 0a  OP_Close);.  }..
81e0: 20 20 2f 2a 20 4e 6f 72 6d 61 6c 20 28 6e 6f 6e    /* Normal (non
81f0: 2d 65 72 72 6f 72 29 20 72 65 74 75 72 6e 2e 20  -error) return. 
8200: 2a 2f 0a 20 20 72 65 74 75 72 6e 3b 0a 0a 20 20  */.  return;..  
8210: 2f 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  /* If an error o
8220: 63 63 75 72 73 2c 20 77 65 20 6a 75 6d 70 20 68  ccurs, we jump h
8230: 65 72 65 20 2a 2f 0a 62 65 67 69 6e 5f 74 61 62  ere */.begin_tab
8240: 6c 65 5f 65 72 72 6f 72 3a 0a 20 20 73 71 6c 69  le_error:.  sqli
8250: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4e  te3DbFree(db, zN
8260: 61 6d 65 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a  ame);.  return;.
8270: 7d 0a 0a 2f 2a 20 53 65 74 20 70 72 6f 70 65 72  }../* Set proper
8280: 74 69 65 73 20 6f 66 20 61 20 74 61 62 6c 65 20  ties of a table 
8290: 63 6f 6c 75 6d 6e 20 62 61 73 65 64 20 6f 6e 20  column based on 
82a0: 74 68 65 20 28 6d 61 67 69 63 61 6c 29 0a 2a 2a  the (magical).**
82b0: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 63 6f 6c   name of the col
82c0: 75 6d 6e 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49  umn..*/.#if SQLI
82d0: 54 45 5f 45 4e 41 42 4c 45 5f 48 49 44 44 45 4e  TE_ENABLE_HIDDEN
82e0: 5f 43 4f 4c 55 4d 4e 53 0a 76 6f 69 64 20 73 71  _COLUMNS.void sq
82f0: 6c 69 74 65 33 43 6f 6c 75 6d 6e 50 72 6f 70 65  lite3ColumnPrope
8300: 72 74 69 65 73 46 72 6f 6d 4e 61 6d 65 28 54 61  rtiesFromName(Ta
8310: 62 6c 65 20 2a 70 54 61 62 2c 20 43 6f 6c 75 6d  ble *pTab, Colum
8320: 6e 20 2a 70 43 6f 6c 29 7b 0a 20 20 69 66 28 20  n *pCol){.  if( 
8330: 73 71 6c 69 74 65 33 5f 73 74 72 6e 69 63 6d 70  sqlite3_strnicmp
8340: 28 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 2c 20 22 5f  (pCol->zName, "_
8350: 5f 68 69 64 64 65 6e 5f 5f 22 2c 20 31 30 29 3d  _hidden__", 10)=
8360: 3d 30 20 29 7b 0a 20 20 20 20 70 43 6f 6c 2d 3e  =0 ){.    pCol->
8370: 63 6f 6c 46 6c 61 67 73 20 7c 3d 20 43 4f 4c 46  colFlags |= COLF
8380: 4c 41 47 5f 48 49 44 44 45 4e 3b 0a 20 20 7d 65  LAG_HIDDEN;.  }e
8390: 6c 73 65 20 69 66 28 20 70 54 61 62 20 26 26 20  lse if( pTab && 
83a0: 70 43 6f 6c 21 3d 70 54 61 62 2d 3e 61 43 6f 6c  pCol!=pTab->aCol
83b0: 20 26 26 20 28 70 43 6f 6c 5b 2d 31 5d 2e 63 6f   && (pCol[-1].co
83c0: 6c 46 6c 61 67 73 20 26 20 43 4f 4c 46 4c 41 47  lFlags & COLFLAG
83d0: 5f 48 49 44 44 45 4e 29 20 29 7b 0a 20 20 20 20  _HIDDEN) ){.    
83e0: 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 7c  pTab->tabFlags |
83f0: 3d 20 54 46 5f 4f 4f 4f 48 69 64 64 65 6e 3b 0a  = TF_OOOHidden;.
8400: 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f    }.}.#endif.../
8410: 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77 20 63  *.** Add a new c
8420: 6f 6c 75 6d 6e 20 74 6f 20 74 68 65 20 74 61 62  olumn to the tab
8430: 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 62 65 69  le currently bei
8440: 6e 67 20 63 6f 6e 73 74 72 75 63 74 65 64 2e 0a  ng constructed..
8450: 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 72 73 65 72  **.** The parser
8460: 20 63 61 6c 6c 73 20 74 68 69 73 20 72 6f 75 74   calls this rout
8470: 69 6e 65 20 6f 6e 63 65 20 66 6f 72 20 65 61 63  ine once for eac
8480: 68 20 63 6f 6c 75 6d 6e 20 64 65 63 6c 61 72 61  h column declara
8490: 74 69 6f 6e 0a 2a 2a 20 69 6e 20 61 20 43 52 45  tion.** in a CRE
84a0: 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d  ATE TABLE statem
84b0: 65 6e 74 2e 20 20 73 71 6c 69 74 65 33 53 74 61  ent.  sqlite3Sta
84c0: 72 74 54 61 62 6c 65 28 29 20 67 65 74 73 20 63  rtTable() gets c
84d0: 61 6c 6c 65 64 0a 2a 2a 20 66 69 72 73 74 20 74  alled.** first t
84e0: 6f 20 67 65 74 20 74 68 69 6e 67 73 20 67 6f 69  o get things goi
84f0: 6e 67 2e 20 20 54 68 65 6e 20 74 68 69 73 20 72  ng.  Then this r
8500: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
8510: 20 66 6f 72 20 65 61 63 68 0a 2a 2a 20 63 6f 6c   for each.** col
8520: 75 6d 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  umn..*/.void sql
8530: 69 74 65 33 41 64 64 43 6f 6c 75 6d 6e 28 50 61  ite3AddColumn(Pa
8540: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b  rse *pParse, Tok
8550: 65 6e 20 2a 70 4e 61 6d 65 29 7b 0a 20 20 54 61  en *pName){.  Ta
8560: 62 6c 65 20 2a 70 3b 0a 20 20 69 6e 74 20 69 3b  ble *p;.  int i;
8570: 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 43 6f  .  char *z;.  Co
8580: 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 73 71  lumn *pCol;.  sq
8590: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
85a0: 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20 28 70  se->db;.  if( (p
85b0: 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54   = pParse->pNewT
85c0: 61 62 6c 65 29 3d 3d 30 20 29 20 72 65 74 75 72  able)==0 ) retur
85d0: 6e 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41  n;.#if SQLITE_MA
85e0: 58 5f 43 4f 4c 55 4d 4e 0a 20 20 69 66 28 20 70  X_COLUMN.  if( p
85f0: 2d 3e 6e 43 6f 6c 2b 31 3e 64 62 2d 3e 61 4c 69  ->nCol+1>db->aLi
8600: 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54  mit[SQLITE_LIMIT
8610: 5f 43 4f 4c 55 4d 4e 5d 20 29 7b 0a 20 20 20 20  _COLUMN] ){.    
8620: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
8630: 70 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e  pParse, "too man
8640: 79 20 63 6f 6c 75 6d 6e 73 20 6f 6e 20 25 73 22  y columns on %s"
8650: 2c 20 70 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  , p->zName);.   
8660: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 23 65 6e   return;.  }.#en
8670: 64 69 66 0a 20 20 7a 20 3d 20 73 71 6c 69 74 65  dif.  z = sqlite
8680: 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64  3NameFromToken(d
8690: 62 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28  b, pName);.  if(
86a0: 20 7a 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a   z==0 ) return;.
86b0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
86c0: 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nCol; i++){.    
86d0: 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74 72 69  if( sqlite3_stri
86e0: 63 6d 70 28 7a 2c 20 70 2d 3e 61 43 6f 6c 5b 69  cmp(z, p->aCol[i
86f0: 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20  ].zName)==0 ){. 
8700: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
8710: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 64 75  rMsg(pParse, "du
8720: 70 6c 69 63 61 74 65 20 63 6f 6c 75 6d 6e 20 6e  plicate column n
8730: 61 6d 65 3a 20 25 73 22 2c 20 7a 29 3b 0a 20 20  ame: %s", z);.  
8740: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
8750: 65 28 64 62 2c 20 7a 29 3b 0a 20 20 20 20 20 20  e(db, z);.      
8760: 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20  return;.    }.  
8770: 7d 0a 20 20 69 66 28 20 28 70 2d 3e 6e 43 6f 6c  }.  if( (p->nCol
8780: 20 26 20 30 78 37 29 3d 3d 30 20 29 7b 0a 20 20   & 0x7)==0 ){.  
8790: 20 20 43 6f 6c 75 6d 6e 20 2a 61 4e 65 77 3b 0a    Column *aNew;.
87a0: 20 20 20 20 61 4e 65 77 20 3d 20 73 71 6c 69 74      aNew = sqlit
87b0: 65 33 44 62 52 65 61 6c 6c 6f 63 28 64 62 2c 70  e3DbRealloc(db,p
87c0: 2d 3e 61 43 6f 6c 2c 28 70 2d 3e 6e 43 6f 6c 2b  ->aCol,(p->nCol+
87d0: 38 29 2a 73 69 7a 65 6f 66 28 70 2d 3e 61 43 6f  8)*sizeof(p->aCo
87e0: 6c 5b 30 5d 29 29 3b 0a 20 20 20 20 69 66 28 20  l[0]));.    if( 
87f0: 61 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20  aNew==0 ){.     
8800: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
8810: 62 2c 20 7a 29 3b 0a 20 20 20 20 20 20 72 65 74  b, z);.      ret
8820: 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  urn;.    }.    p
8830: 2d 3e 61 43 6f 6c 20 3d 20 61 4e 65 77 3b 0a 20  ->aCol = aNew;. 
8840: 20 7d 0a 20 20 70 43 6f 6c 20 3d 20 26 70 2d 3e   }.  pCol = &p->
8850: 61 43 6f 6c 5b 70 2d 3e 6e 43 6f 6c 5d 3b 0a 20  aCol[p->nCol];. 
8860: 20 6d 65 6d 73 65 74 28 70 43 6f 6c 2c 20 30 2c   memset(pCol, 0,
8870: 20 73 69 7a 65 6f 66 28 70 2d 3e 61 43 6f 6c 5b   sizeof(p->aCol[
8880: 30 5d 29 29 3b 0a 20 20 70 43 6f 6c 2d 3e 7a 4e  0]));.  pCol->zN
8890: 61 6d 65 20 3d 20 7a 3b 0a 20 20 73 71 6c 69 74  ame = z;.  sqlit
88a0: 65 33 43 6f 6c 75 6d 6e 50 72 6f 70 65 72 74 69  e3ColumnProperti
88b0: 65 73 46 72 6f 6d 4e 61 6d 65 28 70 2c 20 70 43  esFromName(p, pC
88c0: 6f 6c 29 3b 0a 20 0a 20 20 2f 2a 20 49 66 20 74  ol);. .  /* If t
88d0: 68 65 72 65 20 69 73 20 6e 6f 20 74 79 70 65 20  here is no type 
88e0: 73 70 65 63 69 66 69 65 64 2c 20 63 6f 6c 75 6d  specified, colum
88f0: 6e 73 20 68 61 76 65 20 74 68 65 20 64 65 66 61  ns have the defa
8900: 75 6c 74 20 61 66 66 69 6e 69 74 79 0a 20 20 2a  ult affinity.  *
8910: 2a 20 27 42 4c 4f 42 27 2e 20 49 66 20 74 68 65  * 'BLOB'. If the
8920: 72 65 20 69 73 20 61 20 74 79 70 65 20 73 70 65  re is a type spe
8930: 63 69 66 69 65 64 2c 20 74 68 65 6e 20 73 71 6c  cified, then sql
8940: 69 74 65 33 41 64 64 43 6f 6c 75 6d 6e 54 79 70  ite3AddColumnTyp
8950: 65 28 29 20 77 69 6c 6c 0a 20 20 2a 2a 20 62 65  e() will.  ** be
8960: 20 63 61 6c 6c 65 64 20 6e 65 78 74 20 74 6f 20   called next to 
8970: 73 65 74 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69  set pCol->affini
8980: 74 79 20 63 6f 72 72 65 63 74 6c 79 2e 0a 20 20  ty correctly..  
8990: 2a 2f 0a 20 20 70 43 6f 6c 2d 3e 61 66 66 69 6e  */.  pCol->affin
89a0: 69 74 79 20 3d 20 53 51 4c 49 54 45 5f 41 46 46  ity = SQLITE_AFF
89b0: 5f 42 4c 4f 42 3b 0a 20 20 70 43 6f 6c 2d 3e 73  _BLOB;.  pCol->s
89c0: 7a 45 73 74 20 3d 20 31 3b 0a 20 20 70 2d 3e 6e  zEst = 1;.  p->n
89d0: 43 6f 6c 2b 2b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Col++;.}../*.** 
89e0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
89f0: 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20 70 61  called by the pa
8a00: 72 73 65 72 20 77 68 69 6c 65 20 69 6e 20 74 68  rser while in th
8a10: 65 20 6d 69 64 64 6c 65 20 6f 66 0a 2a 2a 20 70  e middle of.** p
8a20: 61 72 73 69 6e 67 20 61 20 43 52 45 41 54 45 20  arsing a CREATE 
8a30: 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e  TABLE statement.
8a40: 20 20 41 20 22 4e 4f 54 20 4e 55 4c 4c 22 20 63    A "NOT NULL" c
8a50: 6f 6e 73 74 72 61 69 6e 74 20 68 61 73 0a 2a 2a  onstraint has.**
8a60: 20 62 65 65 6e 20 73 65 65 6e 20 6f 6e 20 61 20   been seen on a 
8a70: 63 6f 6c 75 6d 6e 2e 20 20 54 68 69 73 20 72 6f  column.  This ro
8a80: 75 74 69 6e 65 20 73 65 74 73 20 74 68 65 20 6e  utine sets the n
8a90: 6f 74 4e 75 6c 6c 20 66 6c 61 67 20 6f 6e 0a 2a  otNull flag on.*
8aa0: 2a 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 75 72  * the column cur
8ab0: 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e  rently under con
8ac0: 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f  struction..*/.vo
8ad0: 69 64 20 73 71 6c 69 74 65 33 41 64 64 4e 6f 74  id sqlite3AddNot
8ae0: 4e 75 6c 6c 28 50 61 72 73 65 20 2a 70 50 61 72  Null(Parse *pPar
8af0: 73 65 2c 20 69 6e 74 20 6f 6e 45 72 72 6f 72 29  se, int onError)
8b00: 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20  {.  Table *p;.  
8b10: 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  p = pParse->pNew
8b20: 54 61 62 6c 65 3b 0a 20 20 69 66 28 20 70 3d 3d  Table;.  if( p==
8b30: 30 20 7c 7c 20 4e 45 56 45 52 28 70 2d 3e 6e 43  0 || NEVER(p->nC
8b40: 6f 6c 3c 31 29 20 29 20 72 65 74 75 72 6e 3b 0a  ol<1) ) return;.
8b50: 20 20 70 2d 3e 61 43 6f 6c 5b 70 2d 3e 6e 43 6f    p->aCol[p->nCo
8b60: 6c 2d 31 5d 2e 6e 6f 74 4e 75 6c 6c 20 3d 20 28  l-1].notNull = (
8b70: 75 38 29 6f 6e 45 72 72 6f 72 3b 0a 7d 0a 0a 2f  u8)onError;.}../
8b80: 2a 0a 2a 2a 20 53 63 61 6e 20 74 68 65 20 63 6f  *.** Scan the co
8b90: 6c 75 6d 6e 20 74 79 70 65 20 6e 61 6d 65 20 7a  lumn type name z
8ba0: 54 79 70 65 20 28 6c 65 6e 67 74 68 20 6e 54 79  Type (length nTy
8bb0: 70 65 29 20 61 6e 64 20 72 65 74 75 72 6e 20 74  pe) and return t
8bc0: 68 65 0a 2a 2a 20 61 73 73 6f 63 69 61 74 65 64  he.** associated
8bd0: 20 61 66 66 69 6e 69 74 79 20 74 79 70 65 2e 0a   affinity type..
8be0: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
8bf0: 6e 65 20 64 6f 65 73 20 61 20 63 61 73 65 2d 69  ne does a case-i
8c00: 6e 64 65 70 65 6e 64 65 6e 74 20 73 65 61 72 63  ndependent searc
8c10: 68 20 6f 66 20 7a 54 79 70 65 20 66 6f 72 20 74  h of zType for t
8c20: 68 65 20 0a 2a 2a 20 73 75 62 73 74 72 69 6e 67  he .** substring
8c30: 73 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69  s in the followi
8c40: 6e 67 20 74 61 62 6c 65 2e 20 49 66 20 6f 6e 65  ng table. If one
8c50: 20 6f 66 20 74 68 65 20 73 75 62 73 74 72 69 6e   of the substrin
8c60: 67 73 20 69 73 0a 2a 2a 20 66 6f 75 6e 64 2c 20  gs is.** found, 
8c70: 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  the correspondin
8c80: 67 20 61 66 66 69 6e 69 74 79 20 69 73 20 72 65  g affinity is re
8c90: 74 75 72 6e 65 64 2e 20 49 66 20 7a 54 79 70 65  turned. If zType
8ca0: 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 6d 6f 72   contains.** mor
8cb0: 65 20 74 68 61 6e 20 6f 6e 65 20 6f 66 20 74 68  e than one of th
8cc0: 65 20 73 75 62 73 74 72 69 6e 67 73 2c 20 65 6e  e substrings, en
8cd0: 74 72 69 65 73 20 74 6f 77 61 72 64 20 74 68 65  tries toward the
8ce0: 20 74 6f 70 20 6f 66 20 0a 2a 2a 20 74 68 65 20   top of .** the 
8cf0: 74 61 62 6c 65 20 74 61 6b 65 20 70 72 69 6f 72  table take prior
8d00: 69 74 79 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65  ity. For example
8d10: 2c 20 69 66 20 7a 54 79 70 65 20 69 73 20 27 42  , if zType is 'B
8d20: 4c 4f 42 49 4e 54 27 2c 20 0a 2a 2a 20 53 51 4c  LOBINT', .** SQL
8d30: 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 20  ITE_AFF_INTEGER 
8d40: 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a  is returned..**.
8d50: 2a 2a 20 53 75 62 73 74 72 69 6e 67 20 20 20 20  ** Substring    
8d60: 20 7c 20 41 66 66 69 6e 69 74 79 0a 2a 2a 20 2d   | Affinity.** -
8d70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8d80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
8d90: 2a 2a 20 27 49 4e 54 27 20 20 20 20 20 20 20 20  ** 'INT'        
8da0: 20 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e   | SQLITE_AFF_IN
8db0: 54 45 47 45 52 0a 2a 2a 20 27 43 48 41 52 27 20  TEGER.** 'CHAR' 
8dc0: 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f         | SQLITE_
8dd0: 41 46 46 5f 54 45 58 54 0a 2a 2a 20 27 43 4c 4f  AFF_TEXT.** 'CLO
8de0: 42 27 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49  B'        | SQLI
8df0: 54 45 5f 41 46 46 5f 54 45 58 54 0a 2a 2a 20 27  TE_AFF_TEXT.** '
8e00: 54 45 58 54 27 20 20 20 20 20 20 20 20 7c 20 53  TEXT'        | S
8e10: 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 0a 2a  QLITE_AFF_TEXT.*
8e20: 2a 20 27 42 4c 4f 42 27 20 20 20 20 20 20 20 20  * 'BLOB'        
8e30: 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f  | SQLITE_AFF_BLO
8e40: 42 0a 2a 2a 20 27 52 45 41 4c 27 20 20 20 20 20  B.** 'REAL'     
8e50: 20 20 20 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f     | SQLITE_AFF_
8e60: 52 45 41 4c 0a 2a 2a 20 27 46 4c 4f 41 27 20 20  REAL.** 'FLOA'  
8e70: 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 41        | SQLITE_A
8e80: 46 46 5f 52 45 41 4c 0a 2a 2a 20 27 44 4f 55 42  FF_REAL.** 'DOUB
8e90: 27 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54  '        | SQLIT
8ea0: 45 5f 41 46 46 5f 52 45 41 4c 0a 2a 2a 0a 2a 2a  E_AFF_REAL.**.**
8eb0: 20 49 66 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20   If none of the 
8ec0: 73 75 62 73 74 72 69 6e 67 73 20 69 6e 20 74 68  substrings in th
8ed0: 65 20 61 62 6f 76 65 20 74 61 62 6c 65 20 61 72  e above table ar
8ee0: 65 20 66 6f 75 6e 64 2c 0a 2a 2a 20 53 51 4c 49  e found,.** SQLI
8ef0: 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20 69  TE_AFF_NUMERIC i
8f00: 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 63  s returned..*/.c
8f10: 68 61 72 20 73 71 6c 69 74 65 33 41 66 66 69 6e  har sqlite3Affin
8f20: 69 74 79 54 79 70 65 28 63 6f 6e 73 74 20 63 68  ityType(const ch
8f30: 61 72 20 2a 7a 49 6e 2c 20 75 38 20 2a 70 73 7a  ar *zIn, u8 *psz
8f40: 45 73 74 29 7b 0a 20 20 75 33 32 20 68 20 3d 20  Est){.  u32 h = 
8f50: 30 3b 0a 20 20 63 68 61 72 20 61 66 66 20 3d 20  0;.  char aff = 
8f60: 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52  SQLITE_AFF_NUMER
8f70: 49 43 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  IC;.  const char
8f80: 20 2a 7a 43 68 61 72 20 3d 20 30 3b 0a 0a 20 20   *zChar = 0;..  
8f90: 69 66 28 20 7a 49 6e 3d 3d 30 20 29 20 72 65 74  if( zIn==0 ) ret
8fa0: 75 72 6e 20 61 66 66 3b 0a 20 20 77 68 69 6c 65  urn aff;.  while
8fb0: 28 20 7a 49 6e 5b 30 5d 20 29 7b 0a 20 20 20 20  ( zIn[0] ){.    
8fc0: 68 20 3d 20 28 68 3c 3c 38 29 20 2b 20 73 71 6c  h = (h<<8) + sql
8fd0: 69 74 65 33 55 70 70 65 72 54 6f 4c 6f 77 65 72  ite3UpperToLower
8fe0: 5b 28 2a 7a 49 6e 29 26 30 78 66 66 5d 3b 0a 20  [(*zIn)&0xff];. 
8ff0: 20 20 20 7a 49 6e 2b 2b 3b 0a 20 20 20 20 69 66     zIn++;.    if
9000: 28 20 68 3d 3d 28 28 27 63 27 3c 3c 32 34 29 2b  ( h==(('c'<<24)+
9010: 28 27 68 27 3c 3c 31 36 29 2b 28 27 61 27 3c 3c  ('h'<<16)+('a'<<
9020: 38 29 2b 27 72 27 29 20 29 7b 20 20 20 20 20 20  8)+'r') ){      
9030: 20 20 20 20 20 20 20 2f 2a 20 43 48 41 52 20 2a         /* CHAR *
9040: 2f 0a 20 20 20 20 20 20 61 66 66 20 3d 20 53 51  /.      aff = SQ
9050: 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 3b 0a 20  LITE_AFF_TEXT;. 
9060: 20 20 20 20 20 7a 43 68 61 72 20 3d 20 7a 49 6e       zChar = zIn
9070: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
9080: 68 3d 3d 28 28 27 63 27 3c 3c 32 34 29 2b 28 27  h==(('c'<<24)+('
9090: 6c 27 3c 3c 31 36 29 2b 28 27 6f 27 3c 3c 38 29  l'<<16)+('o'<<8)
90a0: 2b 27 62 27 29 20 29 7b 20 20 20 20 20 20 20 2f  +'b') ){       /
90b0: 2a 20 43 4c 4f 42 20 2a 2f 0a 20 20 20 20 20 20  * CLOB */.      
90c0: 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46  aff = SQLITE_AFF
90d0: 5f 54 45 58 54 3b 0a 20 20 20 20 7d 65 6c 73 65  _TEXT;.    }else
90e0: 20 69 66 28 20 68 3d 3d 28 28 27 74 27 3c 3c 32   if( h==(('t'<<2
90f0: 34 29 2b 28 27 65 27 3c 3c 31 36 29 2b 28 27 78  4)+('e'<<16)+('x
9100: 27 3c 3c 38 29 2b 27 74 27 29 20 29 7b 20 20 20  '<<8)+'t') ){   
9110: 20 20 20 20 2f 2a 20 54 45 58 54 20 2a 2f 0a 20      /* TEXT */. 
9120: 20 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49 54       aff = SQLIT
9130: 45 5f 41 46 46 5f 54 45 58 54 3b 0a 20 20 20 20  E_AFF_TEXT;.    
9140: 7d 65 6c 73 65 20 69 66 28 20 68 3d 3d 28 28 27  }else if( h==(('
9150: 62 27 3c 3c 32 34 29 2b 28 27 6c 27 3c 3c 31 36  b'<<24)+('l'<<16
9160: 29 2b 28 27 6f 27 3c 3c 38 29 2b 27 62 27 29 20  )+('o'<<8)+'b') 
9170: 20 20 20 20 20 20 20 20 20 2f 2a 20 42 4c 4f 42           /* BLOB
9180: 20 2a 2f 0a 20 20 20 20 20 20 20 20 26 26 20 28   */.        && (
9190: 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f  aff==SQLITE_AFF_
91a0: 4e 55 4d 45 52 49 43 20 7c 7c 20 61 66 66 3d 3d  NUMERIC || aff==
91b0: 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 29  SQLITE_AFF_REAL)
91c0: 20 29 7b 0a 20 20 20 20 20 20 61 66 66 20 3d 20   ){.      aff = 
91d0: 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 3b  SQLITE_AFF_BLOB;
91e0: 0a 20 20 20 20 20 20 69 66 28 20 7a 49 6e 5b 30  .      if( zIn[0
91f0: 5d 3d 3d 27 28 27 20 29 20 7a 43 68 61 72 20 3d  ]=='(' ) zChar =
9200: 20 7a 49 6e 3b 0a 23 69 66 6e 64 65 66 20 53 51   zIn;.#ifndef SQ
9210: 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49  LITE_OMIT_FLOATI
9220: 4e 47 5f 50 4f 49 4e 54 0a 20 20 20 20 7d 65 6c  NG_POINT.    }el
9230: 73 65 20 69 66 28 20 68 3d 3d 28 28 27 72 27 3c  se if( h==(('r'<
9240: 3c 32 34 29 2b 28 27 65 27 3c 3c 31 36 29 2b 28  <24)+('e'<<16)+(
9250: 27 61 27 3c 3c 38 29 2b 27 6c 27 29 20 20 20 20  'a'<<8)+'l')    
9260: 20 20 20 20 20 20 2f 2a 20 52 45 41 4c 20 2a 2f        /* REAL */
9270: 0a 20 20 20 20 20 20 20 20 26 26 20 61 66 66 3d  .        && aff=
9280: 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45  =SQLITE_AFF_NUME
9290: 52 49 43 20 29 7b 0a 20 20 20 20 20 20 61 66 66  RIC ){.      aff
92a0: 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 52 45   = SQLITE_AFF_RE
92b0: 41 4c 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  AL;.    }else if
92c0: 28 20 68 3d 3d 28 28 27 66 27 3c 3c 32 34 29 2b  ( h==(('f'<<24)+
92d0: 28 27 6c 27 3c 3c 31 36 29 2b 28 27 6f 27 3c 3c  ('l'<<16)+('o'<<
92e0: 38 29 2b 27 61 27 29 20 20 20 20 20 20 20 20 20  8)+'a')         
92f0: 20 2f 2a 20 46 4c 4f 41 20 2a 2f 0a 20 20 20 20   /* FLOA */.    
9300: 20 20 20 20 26 26 20 61 66 66 3d 3d 53 51 4c 49      && aff==SQLI
9310: 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20 29  TE_AFF_NUMERIC )
9320: 7b 0a 20 20 20 20 20 20 61 66 66 20 3d 20 53 51  {.      aff = SQ
9330: 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 3b 0a 20  LITE_AFF_REAL;. 
9340: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 68 3d 3d     }else if( h==
9350: 28 28 27 64 27 3c 3c 32 34 29 2b 28 27 6f 27 3c  (('d'<<24)+('o'<
9360: 3c 31 36 29 2b 28 27 75 27 3c 3c 38 29 2b 27 62  <16)+('u'<<8)+'b
9370: 27 29 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44  ')          /* D
9380: 4f 55 42 20 2a 2f 0a 20 20 20 20 20 20 20 20 26  OUB */.        &
9390: 26 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46  & aff==SQLITE_AF
93a0: 46 5f 4e 55 4d 45 52 49 43 20 29 7b 0a 20 20 20  F_NUMERIC ){.   
93b0: 20 20 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f     aff = SQLITE_
93c0: 41 46 46 5f 52 45 41 4c 3b 0a 23 65 6e 64 69 66  AFF_REAL;.#endif
93d0: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28  .    }else if( (
93e0: 68 26 30 78 30 30 46 46 46 46 46 46 29 3d 3d 28  h&0x00FFFFFF)==(
93f0: 28 27 69 27 3c 3c 31 36 29 2b 28 27 6e 27 3c 3c  ('i'<<16)+('n'<<
9400: 38 29 2b 27 74 27 29 20 29 7b 20 20 20 20 2f 2a  8)+'t') ){    /*
9410: 20 49 4e 54 20 2a 2f 0a 20 20 20 20 20 20 61 66   INT */.      af
9420: 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 49  f = SQLITE_AFF_I
9430: 4e 54 45 47 45 52 3b 0a 20 20 20 20 20 20 62 72  NTEGER;.      br
9440: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  eak;.    }.  }..
9450: 20 20 2f 2a 20 49 66 20 70 73 7a 45 73 74 20 69    /* If pszEst i
9460: 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 73 74 6f 72  s not NULL, stor
9470: 65 20 61 6e 20 65 73 74 69 6d 61 74 65 20 6f 66  e an estimate of
9480: 20 74 68 65 20 66 69 65 6c 64 20 73 69 7a 65 2e   the field size.
9490: 20 20 54 68 65 0a 20 20 2a 2a 20 65 73 74 69 6d    The.  ** estim
94a0: 61 74 65 20 69 73 20 73 63 61 6c 65 64 20 73 6f  ate is scaled so
94b0: 20 74 68 61 74 20 74 68 65 20 73 69 7a 65 20 6f   that the size o
94c0: 66 20 61 6e 20 69 6e 74 65 67 65 72 20 69 73 20  f an integer is 
94d0: 31 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70 73 7a  1.  */.  if( psz
94e0: 45 73 74 20 29 7b 0a 20 20 20 20 2a 70 73 7a 45  Est ){.    *pszE
94f0: 73 74 20 3d 20 31 3b 20 20 20 2f 2a 20 64 65 66  st = 1;   /* def
9500: 61 75 6c 74 20 73 69 7a 65 20 69 73 20 61 70 70  ault size is app
9510: 72 6f 78 20 34 20 62 79 74 65 73 20 2a 2f 0a 20  rox 4 bytes */. 
9520: 20 20 20 69 66 28 20 61 66 66 3c 53 51 4c 49 54     if( aff<SQLIT
9530: 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20 29 7b  E_AFF_NUMERIC ){
9540: 0a 20 20 20 20 20 20 69 66 28 20 7a 43 68 61 72  .      if( zChar
9550: 20 29 7b 0a 20 20 20 20 20 20 20 20 77 68 69 6c   ){.        whil
9560: 65 28 20 7a 43 68 61 72 5b 30 5d 20 29 7b 0a 20  e( zChar[0] ){. 
9570: 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c           if( sql
9580: 69 74 65 33 49 73 64 69 67 69 74 28 7a 43 68 61  ite3Isdigit(zCha
9590: 72 5b 30 5d 29 20 29 7b 0a 20 20 20 20 20 20 20  r[0]) ){.       
95a0: 20 20 20 20 20 69 6e 74 20 76 20 3d 20 30 3b 0a       int v = 0;.
95b0: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
95c0: 74 65 33 47 65 74 49 6e 74 33 32 28 7a 43 68 61  te3GetInt32(zCha
95d0: 72 2c 20 26 76 29 3b 0a 20 20 20 20 20 20 20 20  r, &v);.        
95e0: 20 20 20 20 76 20 3d 20 76 2f 34 20 2b 20 31 3b      v = v/4 + 1;
95f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
9600: 20 76 3e 32 35 35 20 29 20 76 20 3d 20 32 35 35   v>255 ) v = 255
9610: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 70  ;.            *p
9620: 73 7a 45 73 74 20 3d 20 76 3b 20 2f 2a 20 42 4c  szEst = v; /* BL
9630: 4f 42 28 6b 29 2c 20 56 41 52 43 48 41 52 28 6b  OB(k), VARCHAR(k
9640: 29 2c 20 43 48 41 52 28 6b 29 20 2d 3e 20 72 3d  ), CHAR(k) -> r=
9650: 28 6b 2f 34 2b 31 29 20 2a 2f 0a 20 20 20 20 20  (k/4+1) */.     
9660: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
9670: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
9680: 20 20 20 20 7a 43 68 61 72 2b 2b 3b 0a 20 20 20      zChar++;.   
9690: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
96a0: 73 65 7b 0a 20 20 20 20 20 20 20 20 2a 70 73 7a  se{.        *psz
96b0: 45 73 74 20 3d 20 35 3b 20 20 20 2f 2a 20 42 4c  Est = 5;   /* BL
96c0: 4f 42 2c 20 54 45 58 54 2c 20 43 4c 4f 42 20 2d  OB, TEXT, CLOB -
96d0: 3e 20 72 3d 35 20 20 28 61 70 70 72 6f 78 20 32  > r=5  (approx 2
96e0: 30 20 62 79 74 65 73 29 2a 2f 0a 20 20 20 20 20  0 bytes)*/.     
96f0: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72   }.    }.  }.  r
9700: 65 74 75 72 6e 20 61 66 66 3b 0a 7d 0a 0a 2f 2a  eturn aff;.}../*
9710: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
9720: 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68   is called by th
9730: 65 20 70 61 72 73 65 72 20 77 68 69 6c 65 20 69  e parser while i
9740: 6e 20 74 68 65 20 6d 69 64 64 6c 65 20 6f 66 0a  n the middle of.
9750: 2a 2a 20 70 61 72 73 69 6e 67 20 61 20 43 52 45  ** parsing a CRE
9760: 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d  ATE TABLE statem
9770: 65 6e 74 2e 20 20 54 68 65 20 70 46 69 72 73 74  ent.  The pFirst
9780: 20 74 6f 6b 65 6e 20 69 73 20 74 68 65 20 66 69   token is the fi
9790: 72 73 74 0a 2a 2a 20 74 6f 6b 65 6e 20 69 6e 20  rst.** token in 
97a0: 74 68 65 20 73 65 71 75 65 6e 63 65 20 6f 66 20  the sequence of 
97b0: 74 6f 6b 65 6e 73 20 74 68 61 74 20 64 65 73 63  tokens that desc
97c0: 72 69 62 65 20 74 68 65 20 74 79 70 65 20 6f 66  ribe the type of
97d0: 20 74 68 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 63   the.** column c
97e0: 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63  urrently under c
97f0: 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 20 70  onstruction.   p
9800: 4c 61 73 74 20 69 73 20 74 68 65 20 6c 61 73 74  Last is the last
9810: 20 74 6f 6b 65 6e 0a 2a 2a 20 69 6e 20 74 68 65   token.** in the
9820: 20 73 65 71 75 65 6e 63 65 2e 20 20 55 73 65 20   sequence.  Use 
9830: 74 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  this information
9840: 20 74 6f 20 63 6f 6e 73 74 72 75 63 74 20 61 20   to construct a 
9850: 73 74 72 69 6e 67 0a 2a 2a 20 74 68 61 74 20 63  string.** that c
9860: 6f 6e 74 61 69 6e 73 20 74 68 65 20 74 79 70 65  ontains the type
9870: 6e 61 6d 65 20 6f 66 20 74 68 65 20 63 6f 6c 75  name of the colu
9880: 6d 6e 20 61 6e 64 20 73 74 6f 72 65 20 74 68 61  mn and store tha
9890: 74 20 73 74 72 69 6e 67 0a 2a 2a 20 69 6e 20 7a  t string.** in z
98a0: 54 79 70 65 2e 0a 2a 2f 20 0a 76 6f 69 64 20 73  Type..*/ .void s
98b0: 71 6c 69 74 65 33 41 64 64 43 6f 6c 75 6d 6e 54  qlite3AddColumnT
98c0: 79 70 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  ype(Parse *pPars
98d0: 65 2c 20 54 6f 6b 65 6e 20 2a 70 54 79 70 65 29  e, Token *pType)
98e0: 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20  {.  Table *p;.  
98f0: 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 0a 20  Column *pCol;.. 
9900: 20 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65   p = pParse->pNe
9910: 77 54 61 62 6c 65 3b 0a 20 20 69 66 28 20 70 3d  wTable;.  if( p=
9920: 3d 30 20 7c 7c 20 4e 45 56 45 52 28 70 2d 3e 6e  =0 || NEVER(p->n
9930: 43 6f 6c 3c 31 29 20 29 20 72 65 74 75 72 6e 3b  Col<1) ) return;
9940: 0a 20 20 70 43 6f 6c 20 3d 20 26 70 2d 3e 61 43  .  pCol = &p->aC
9950: 6f 6c 5b 70 2d 3e 6e 43 6f 6c 2d 31 5d 3b 0a 20  ol[p->nCol-1];. 
9960: 20 61 73 73 65 72 74 28 20 70 43 6f 6c 2d 3e 7a   assert( pCol->z
9970: 54 79 70 65 3d 3d 30 20 7c 7c 20 43 4f 52 52 55  Type==0 || CORRU
9980: 50 54 5f 44 42 20 29 3b 0a 20 20 73 71 6c 69 74  PT_DB );.  sqlit
9990: 65 33 44 62 46 72 65 65 28 70 50 61 72 73 65 2d  e3DbFree(pParse-
99a0: 3e 64 62 2c 20 70 43 6f 6c 2d 3e 7a 54 79 70 65  >db, pCol->zType
99b0: 29 3b 0a 20 20 70 43 6f 6c 2d 3e 7a 54 79 70 65  );.  pCol->zType
99c0: 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72   = sqlite3NameFr
99d0: 6f 6d 54 6f 6b 65 6e 28 70 50 61 72 73 65 2d 3e  omToken(pParse->
99e0: 64 62 2c 20 70 54 79 70 65 29 3b 0a 20 20 70 43  db, pType);.  pC
99f0: 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20 73  ol->affinity = s
9a00: 71 6c 69 74 65 33 41 66 66 69 6e 69 74 79 54 79  qlite3AffinityTy
9a10: 70 65 28 70 43 6f 6c 2d 3e 7a 54 79 70 65 2c 20  pe(pCol->zType, 
9a20: 26 70 43 6f 6c 2d 3e 73 7a 45 73 74 29 3b 0a 7d  &pCol->szEst);.}
9a30: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 65 78 70 72  ../*.** The expr
9a40: 65 73 73 69 6f 6e 20 69 73 20 74 68 65 20 64 65  ession is the de
9a50: 66 61 75 6c 74 20 76 61 6c 75 65 20 66 6f 72 20  fault value for 
9a60: 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c  the most recentl
9a70: 79 20 61 64 64 65 64 20 63 6f 6c 75 6d 6e 0a 2a  y added column.*
9a80: 2a 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 63  * of the table c
9a90: 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63  urrently under c
9aa0: 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 0a  onstruction..**.
9ab0: 2a 2a 20 44 65 66 61 75 6c 74 20 76 61 6c 75 65  ** Default value
9ac0: 20 65 78 70 72 65 73 73 69 6f 6e 73 20 6d 75 73   expressions mus
9ad0: 74 20 62 65 20 63 6f 6e 73 74 61 6e 74 2e 20 20  t be constant.  
9ae0: 52 61 69 73 65 20 61 6e 20 65 78 63 65 70 74 69  Raise an excepti
9af0: 6f 6e 20 69 66 20 74 68 69 73 0a 2a 2a 20 69 73  on if this.** is
9b00: 20 6e 6f 74 20 74 68 65 20 63 61 73 65 2e 0a 2a   not the case..*
9b10: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
9b20: 65 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74  e is called by t
9b30: 68 65 20 70 61 72 73 65 72 20 77 68 69 6c 65 20  he parser while 
9b40: 69 6e 20 74 68 65 20 6d 69 64 64 6c 65 20 6f 66  in the middle of
9b50: 0a 2a 2a 20 70 61 72 73 69 6e 67 20 61 20 43 52  .** parsing a CR
9b60: 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65  EATE TABLE state
9b70: 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ment..*/.void sq
9b80: 6c 69 74 65 33 41 64 64 44 65 66 61 75 6c 74 56  lite3AddDefaultV
9b90: 61 6c 75 65 28 50 61 72 73 65 20 2a 70 50 61 72  alue(Parse *pPar
9ba0: 73 65 2c 20 45 78 70 72 53 70 61 6e 20 2a 70 53  se, ExprSpan *pS
9bb0: 70 61 6e 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70  pan){.  Table *p
9bc0: 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c  ;.  Column *pCol
9bd0: 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
9be0: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
9bf0: 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  p = pParse->pNew
9c00: 54 61 62 6c 65 3b 0a 20 20 69 66 28 20 70 21 3d  Table;.  if( p!=
9c10: 30 20 29 7b 0a 20 20 20 20 70 43 6f 6c 20 3d 20  0 ){.    pCol = 
9c20: 26 28 70 2d 3e 61 43 6f 6c 5b 70 2d 3e 6e 43 6f  &(p->aCol[p->nCo
9c30: 6c 2d 31 5d 29 3b 0a 20 20 20 20 69 66 28 20 21  l-1]);.    if( !
9c40: 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e  sqlite3ExprIsCon
9c50: 73 74 61 6e 74 4f 72 46 75 6e 63 74 69 6f 6e 28  stantOrFunction(
9c60: 70 53 70 61 6e 2d 3e 70 45 78 70 72 2c 20 64 62  pSpan->pExpr, db
9c70: 2d 3e 69 6e 69 74 2e 62 75 73 79 29 20 29 7b 0a  ->init.busy) ){.
9c80: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
9c90: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 64  orMsg(pParse, "d
9ca0: 65 66 61 75 6c 74 20 76 61 6c 75 65 20 6f 66 20  efault value of 
9cb0: 63 6f 6c 75 6d 6e 20 5b 25 73 5d 20 69 73 20 6e  column [%s] is n
9cc0: 6f 74 20 63 6f 6e 73 74 61 6e 74 22 2c 0a 20 20  ot constant",.  
9cd0: 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 7a 4e          pCol->zN
9ce0: 61 6d 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ame);.    }else{
9cf0: 0a 20 20 20 20 20 20 2f 2a 20 41 20 63 6f 70 79  .      /* A copy
9d00: 20 6f 66 20 70 45 78 70 72 20 69 73 20 75 73 65   of pExpr is use
9d10: 64 20 69 6e 73 74 65 61 64 20 6f 66 20 74 68 65  d instead of the
9d20: 20 6f 72 69 67 69 6e 61 6c 2c 20 61 73 20 70 45   original, as pE
9d30: 78 70 72 20 63 6f 6e 74 61 69 6e 73 0a 20 20 20  xpr contains.   
9d40: 20 20 20 2a 2a 20 74 6f 6b 65 6e 73 20 74 68 61     ** tokens tha
9d50: 74 20 70 6f 69 6e 74 20 74 6f 20 76 6f 6c 61 74  t point to volat
9d60: 69 6c 65 20 6d 65 6d 6f 72 79 2e 20 54 68 65 20  ile memory. The 
9d70: 27 73 70 61 6e 27 20 6f 66 20 74 68 65 20 65 78  'span' of the ex
9d80: 70 72 65 73 73 69 6f 6e 0a 20 20 20 20 20 20 2a  pression.      *
9d90: 2a 20 69 73 20 72 65 71 75 69 72 65 64 20 62 79  * is required by
9da0: 20 70 72 61 67 6d 61 20 74 61 62 6c 65 5f 69 6e   pragma table_in
9db0: 66 6f 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  fo..      */.   
9dc0: 20 20 20 45 78 70 72 20 78 3b 0a 20 20 20 20 20     Expr x;.     
9dd0: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
9de0: 74 65 28 64 62 2c 20 70 43 6f 6c 2d 3e 70 44 66  te(db, pCol->pDf
9df0: 6c 74 29 3b 0a 20 20 20 20 20 20 6d 65 6d 73 65  lt);.      memse
9e00: 74 28 26 78 2c 20 30 2c 20 73 69 7a 65 6f 66 28  t(&x, 0, sizeof(
9e10: 78 29 29 3b 0a 20 20 20 20 20 20 78 2e 6f 70 20  x));.      x.op 
9e20: 3d 20 54 4b 5f 53 50 41 4e 3b 0a 20 20 20 20 20  = TK_SPAN;.     
9e30: 20 78 2e 75 2e 7a 54 6f 6b 65 6e 20 3d 20 73 71   x.u.zToken = sq
9e40: 6c 69 74 65 33 44 62 53 74 72 4e 44 75 70 28 64  lite3DbStrNDup(d
9e50: 62 2c 20 28 63 68 61 72 2a 29 70 53 70 61 6e 2d  b, (char*)pSpan-
9e60: 3e 7a 53 74 61 72 74 2c 0a 20 20 20 20 20 20 20  >zStart,.       
9e70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9e80: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 69 6e               (in
9e90: 74 29 28 70 53 70 61 6e 2d 3e 7a 45 6e 64 20 2d  t)(pSpan->zEnd -
9ea0: 20 70 53 70 61 6e 2d 3e 7a 53 74 61 72 74 29 29   pSpan->zStart))
9eb0: 3b 0a 20 20 20 20 20 20 78 2e 70 4c 65 66 74 20  ;.      x.pLeft 
9ec0: 3d 20 70 53 70 61 6e 2d 3e 70 45 78 70 72 3b 0a  = pSpan->pExpr;.
9ed0: 20 20 20 20 20 20 78 2e 66 6c 61 67 73 20 3d 20        x.flags = 
9ee0: 45 50 5f 53 6b 69 70 3b 0a 20 20 20 20 20 20 70  EP_Skip;.      p
9ef0: 43 6f 6c 2d 3e 70 44 66 6c 74 20 3d 20 73 71 6c  Col->pDflt = sql
9f00: 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20  ite3ExprDup(db, 
9f10: 26 78 2c 20 45 58 50 52 44 55 50 5f 52 45 44 55  &x, EXPRDUP_REDU
9f20: 43 45 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  CE);.      sqlit
9f30: 65 33 44 62 46 72 65 65 28 64 62 2c 20 78 2e 75  e3DbFree(db, x.u
9f40: 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 7d 0a  .zToken);.    }.
9f50: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 78 70    }.  sqlite3Exp
9f60: 72 44 65 6c 65 74 65 28 64 62 2c 20 70 53 70 61  rDelete(db, pSpa
9f70: 6e 2d 3e 70 45 78 70 72 29 3b 0a 7d 0a 0a 2f 2a  n->pExpr);.}../*
9f80: 0a 2a 2a 20 42 61 63 6b 77 61 72 64 73 20 43 6f  .** Backwards Co
9f90: 6d 70 61 74 69 62 69 6c 69 74 79 20 48 61 63 6b  mpatibility Hack
9fa0: 3a 0a 2a 2a 20 0a 2a 2a 20 48 69 73 74 6f 72 69  :.** .** Histori
9fb0: 63 61 6c 20 76 65 72 73 69 6f 6e 73 20 6f 66 20  cal versions of 
9fc0: 53 51 4c 69 74 65 20 61 63 63 65 70 74 65 64 20  SQLite accepted 
9fd0: 73 74 72 69 6e 67 73 20 61 73 20 63 6f 6c 75 6d  strings as colum
9fe0: 6e 20 6e 61 6d 65 73 20 69 6e 0a 2a 2a 20 69 6e  n names in.** in
9ff0: 64 65 78 65 73 20 61 6e 64 20 50 52 49 4d 41 52  dexes and PRIMAR
a000: 59 20 4b 45 59 20 63 6f 6e 73 74 72 61 69 6e 74  Y KEY constraint
a010: 73 20 61 6e 64 20 69 6e 20 55 4e 49 51 55 45 20  s and in UNIQUE 
a020: 63 6f 6e 73 74 72 61 69 6e 74 73 2e 20 20 45 78  constraints.  Ex
a030: 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  ample:.**.**    
a040: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 78 79   CREATE TABLE xy
a050: 7a 28 61 2c 62 2c 63 2c 64 2c 65 2c 50 52 49 4d  z(a,b,c,d,e,PRIM
a060: 41 52 59 20 4b 45 59 28 27 61 27 29 2c 55 4e 49  ARY KEY('a'),UNI
a070: 51 55 45 28 27 62 27 2c 27 63 27 20 43 4f 4c 4c  QUE('b','c' COLL
a080: 41 54 45 20 74 72 69 6d 29 0a 2a 2a 20 20 20 20  ATE trim).**    
a090: 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 61 62   CREATE INDEX ab
a0a0: 63 20 4f 4e 20 78 79 7a 28 27 63 27 2c 27 64 27  c ON xyz('c','d'
a0b0: 20 44 45 53 43 2c 27 65 27 20 43 4f 4c 4c 41 54   DESC,'e' COLLAT
a0c0: 45 20 6e 6f 63 61 73 65 20 44 45 53 43 29 3b 0a  E nocase DESC);.
a0d0: 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 67 6f  **.** This is go
a0e0: 6f 66 79 2e 20 20 42 75 74 20 74 6f 20 70 72 65  ofy.  But to pre
a0f0: 73 65 72 76 65 20 62 61 63 6b 77 61 72 64 73 20  serve backwards 
a100: 63 6f 6d 70 61 74 69 62 69 6c 69 74 79 20 77 65  compatibility we
a110: 20 63 6f 6e 74 69 6e 75 65 20 74 6f 0a 2a 2a 20   continue to.** 
a120: 61 63 63 65 70 74 20 69 74 2e 20 20 54 68 69 73  accept it.  This
a130: 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 74 68   routine does th
a140: 65 20 6e 65 63 65 73 73 61 72 79 20 63 6f 6e 76  e necessary conv
a150: 65 72 73 69 6f 6e 2e 20 20 49 74 20 63 6f 6e 76  ersion.  It conv
a160: 65 72 74 73 0a 2a 2a 20 74 68 65 20 65 78 70 72  erts.** the expr
a170: 65 73 73 69 6f 6e 20 67 69 76 65 6e 20 69 6e 20  ession given in 
a180: 69 74 73 20 61 72 67 75 6d 65 6e 74 20 66 72 6f  its argument fro
a190: 6d 20 61 20 54 4b 5f 53 54 52 49 4e 47 20 69 6e  m a TK_STRING in
a1a0: 74 6f 20 61 20 54 4b 5f 49 44 0a 2a 2a 20 69 66  to a TK_ID.** if
a1b0: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
a1c0: 69 73 20 6a 75 73 74 20 61 20 54 4b 5f 53 54 52  is just a TK_STR
a1d0: 49 4e 47 20 77 69 74 68 20 61 6e 20 6f 70 74 69  ING with an opti
a1e0: 6f 6e 61 6c 20 43 4f 4c 4c 41 54 45 20 63 6c 61  onal COLLATE cla
a1f0: 75 73 65 2e 0a 2a 2a 20 49 66 20 74 68 65 20 65  use..** If the e
a200: 70 78 72 65 73 73 69 6f 6e 20 69 73 20 61 6e 79  pxression is any
a210: 74 68 69 6e 67 20 6f 74 68 65 72 20 74 68 61 6e  thing other than
a220: 20 54 4b 5f 53 54 52 49 4e 47 2c 20 74 68 65 20   TK_STRING, the 
a230: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 0a 2a 2a  expression is.**
a240: 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 73   unchanged..*/.s
a250: 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74  tatic void sqlit
a260: 65 33 53 74 72 69 6e 67 54 6f 49 64 28 45 78 70  e3StringToId(Exp
a270: 72 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e  r *p){.  if( p->
a280: 6f 70 3d 3d 54 4b 5f 53 54 52 49 4e 47 20 29 7b  op==TK_STRING ){
a290: 0a 20 20 20 20 70 2d 3e 6f 70 20 3d 20 54 4b 5f  .    p->op = TK_
a2a0: 49 44 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  ID;.  }else if( 
a2b0: 70 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c 41 54  p->op==TK_COLLAT
a2c0: 45 20 26 26 20 70 2d 3e 70 4c 65 66 74 2d 3e 6f  E && p->pLeft->o
a2d0: 70 3d 3d 54 4b 5f 53 54 52 49 4e 47 20 29 7b 0a  p==TK_STRING ){.
a2e0: 20 20 20 20 70 2d 3e 70 4c 65 66 74 2d 3e 6f 70      p->pLeft->op
a2f0: 20 3d 20 54 4b 5f 49 44 3b 0a 20 20 7d 0a 7d 0a   = TK_ID;.  }.}.
a300: 0a 2f 2a 0a 2a 2a 20 44 65 73 69 67 6e 61 74 65  ./*.** Designate
a310: 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59   the PRIMARY KEY
a320: 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 2e 20   for the table. 
a330: 20 70 4c 69 73 74 20 69 73 20 61 20 6c 69 73 74   pList is a list
a340: 20 6f 66 20 6e 61 6d 65 73 20 0a 2a 2a 20 6f 66   of names .** of
a350: 20 63 6f 6c 75 6d 6e 73 20 74 68 61 74 20 66 6f   columns that fo
a360: 72 6d 20 74 68 65 20 70 72 69 6d 61 72 79 20 6b  rm the primary k
a370: 65 79 2e 20 20 49 66 20 70 4c 69 73 74 20 69 73  ey.  If pList is
a380: 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68 65 0a   NULL, then the.
a390: 2a 2a 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79  ** most recently
a3a0: 20 61 64 64 65 64 20 63 6f 6c 75 6d 6e 20 6f 66   added column of
a3b0: 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 74 68   the table is th
a3c0: 65 20 70 72 69 6d 61 72 79 20 6b 65 79 2e 0a 2a  e primary key..*
a3d0: 2a 0a 2a 2a 20 41 20 74 61 62 6c 65 20 63 61 6e  *.** A table can
a3e0: 20 68 61 76 65 20 61 74 20 6d 6f 73 74 20 6f 6e   have at most on
a3f0: 65 20 70 72 69 6d 61 72 79 20 6b 65 79 2e 20 20  e primary key.  
a400: 49 66 20 74 68 65 20 74 61 62 6c 65 20 61 6c 72  If the table alr
a410: 65 61 64 79 20 68 61 73 0a 2a 2a 20 61 20 70 72  eady has.** a pr
a420: 69 6d 61 72 79 20 6b 65 79 20 28 61 6e 64 20 74  imary key (and t
a430: 68 69 73 20 69 73 20 74 68 65 20 73 65 63 6f 6e  his is the secon
a440: 64 20 70 72 69 6d 61 72 79 20 6b 65 79 29 20 74  d primary key) t
a450: 68 65 6e 20 63 72 65 61 74 65 20 61 6e 0a 2a 2a  hen create an.**
a460: 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49 66   error..**.** If
a470: 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59   the PRIMARY KEY
a480: 20 69 73 20 6f 6e 20 61 20 73 69 6e 67 6c 65 20   is on a single 
a490: 63 6f 6c 75 6d 6e 20 77 68 6f 73 65 20 64 61 74  column whose dat
a4a0: 61 74 79 70 65 20 69 73 20 49 4e 54 45 47 45 52  atype is INTEGER
a4b0: 2c 0a 2a 2a 20 74 68 65 6e 20 77 65 20 77 69 6c  ,.** then we wil
a4c0: 6c 20 74 72 79 20 74 6f 20 75 73 65 20 74 68 61  l try to use tha
a4d0: 74 20 63 6f 6c 75 6d 6e 20 61 73 20 74 68 65 20  t column as the 
a4e0: 72 6f 77 69 64 2e 20 20 53 65 74 20 74 68 65 20  rowid.  Set the 
a4f0: 54 61 62 6c 65 2e 69 50 4b 65 79 0a 2a 2a 20 66  Table.iPKey.** f
a500: 69 65 6c 64 20 6f 66 20 74 68 65 20 74 61 62 6c  ield of the tabl
a510: 65 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63  e under construc
a520: 74 69 6f 6e 20 74 6f 20 62 65 20 74 68 65 20 69  tion to be the i
a530: 6e 64 65 78 20 6f 66 20 74 68 65 0a 2a 2a 20 49  ndex of the.** I
a540: 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b  NTEGER PRIMARY K
a550: 45 59 20 63 6f 6c 75 6d 6e 2e 20 20 54 61 62 6c  EY column.  Tabl
a560: 65 2e 69 50 4b 65 79 20 69 73 20 73 65 74 20 74  e.iPKey is set t
a570: 6f 20 2d 31 20 69 66 20 74 68 65 72 65 20 69 73  o -1 if there is
a580: 0a 2a 2a 20 6e 6f 20 49 4e 54 45 47 45 52 20 50  .** no INTEGER P
a590: 52 49 4d 41 52 59 20 4b 45 59 2e 0a 2a 2a 0a 2a  RIMARY KEY..**.*
a5a0: 2a 20 49 66 20 74 68 65 20 6b 65 79 20 69 73 20  * If the key is 
a5b0: 6e 6f 74 20 61 6e 20 49 4e 54 45 47 45 52 20 50  not an INTEGER P
a5c0: 52 49 4d 41 52 59 20 4b 45 59 2c 20 74 68 65 6e  RIMARY KEY, then
a5d0: 20 63 72 65 61 74 65 20 61 20 75 6e 69 71 75 65   create a unique
a5e0: 0a 2a 2a 20 69 6e 64 65 78 20 66 6f 72 20 74 68  .** index for th
a5f0: 65 20 6b 65 79 2e 20 20 4e 6f 20 69 6e 64 65 78  e key.  No index
a600: 20 69 73 20 63 72 65 61 74 65 64 20 66 6f 72 20   is created for 
a610: 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20  INTEGER PRIMARY 
a620: 4b 45 59 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  KEYs..*/.void sq
a630: 6c 69 74 65 33 41 64 64 50 72 69 6d 61 72 79 4b  lite3AddPrimaryK
a640: 65 79 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ey(.  Parse *pPa
a650: 72 73 65 2c 20 20 20 20 2f 2a 20 50 61 72 73 69  rse,    /* Parsi
a660: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
a670: 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c  ExprList *pList,
a680: 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 66 69 65    /* List of fie
a690: 6c 64 20 6e 61 6d 65 73 20 74 6f 20 62 65 20 69  ld names to be i
a6a0: 6e 64 65 78 65 64 20 2a 2f 0a 20 20 69 6e 74 20  ndexed */.  int 
a6b0: 6f 6e 45 72 72 6f 72 2c 20 20 20 20 20 20 2f 2a  onError,      /*
a6c0: 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69 74 68   What to do with
a6d0: 20 61 20 75 6e 69 71 75 65 6e 65 73 73 20 63 6f   a uniqueness co
a6e0: 6e 66 6c 69 63 74 20 2a 2f 0a 20 20 69 6e 74 20  nflict */.  int 
a6f0: 61 75 74 6f 49 6e 63 2c 20 20 20 20 20 20 2f 2a  autoInc,      /*
a700: 20 54 72 75 65 20 69 66 20 74 68 65 20 41 55 54   True if the AUT
a710: 4f 49 4e 43 52 45 4d 45 4e 54 20 6b 65 79 77 6f  OINCREMENT keywo
a720: 72 64 20 69 73 20 70 72 65 73 65 6e 74 20 2a 2f  rd is present */
a730: 0a 20 20 69 6e 74 20 73 6f 72 74 4f 72 64 65 72  .  int sortOrder
a740: 20 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 53       /* SQLITE_S
a750: 4f 5f 41 53 43 20 6f 72 20 53 51 4c 49 54 45 5f  O_ASC or SQLITE_
a760: 53 4f 5f 44 45 53 43 20 2a 2f 0a 29 7b 0a 20 20  SO_DESC */.){.  
a770: 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 50  Table *pTab = pP
a780: 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b  arse->pNewTable;
a790: 0a 20 20 63 68 61 72 20 2a 7a 54 79 70 65 20 3d  .  char *zType =
a7a0: 20 30 3b 0a 20 20 69 6e 74 20 69 43 6f 6c 20 3d   0;.  int iCol =
a7b0: 20 2d 31 2c 20 69 3b 0a 20 20 69 6e 74 20 6e 54   -1, i;.  int nT
a7c0: 65 72 6d 3b 0a 20 20 69 66 28 20 70 54 61 62 3d  erm;.  if( pTab=
a7d0: 3d 30 20 7c 7c 20 49 4e 5f 44 45 43 4c 41 52 45  =0 || IN_DECLARE
a7e0: 5f 56 54 41 42 20 29 20 67 6f 74 6f 20 70 72 69  _VTAB ) goto pri
a7f0: 6d 61 72 79 5f 6b 65 79 5f 65 78 69 74 3b 0a 20  mary_key_exit;. 
a800: 20 69 66 28 20 70 54 61 62 2d 3e 74 61 62 46 6c   if( pTab->tabFl
a810: 61 67 73 20 26 20 54 46 5f 48 61 73 50 72 69 6d  ags & TF_HasPrim
a820: 61 72 79 4b 65 79 20 29 7b 0a 20 20 20 20 73 71  aryKey ){.    sq
a830: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
a840: 61 72 73 65 2c 20 0a 20 20 20 20 20 20 22 74 61  arse, .      "ta
a850: 62 6c 65 20 5c 22 25 73 5c 22 20 68 61 73 20 6d  ble \"%s\" has m
a860: 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 70 72 69  ore than one pri
a870: 6d 61 72 79 20 6b 65 79 22 2c 20 70 54 61 62 2d  mary key", pTab-
a880: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 67 6f 74  >zName);.    got
a890: 6f 20 70 72 69 6d 61 72 79 5f 6b 65 79 5f 65 78  o primary_key_ex
a8a0: 69 74 3b 0a 20 20 7d 0a 20 20 70 54 61 62 2d 3e  it;.  }.  pTab->
a8b0: 74 61 62 46 6c 61 67 73 20 7c 3d 20 54 46 5f 48  tabFlags |= TF_H
a8c0: 61 73 50 72 69 6d 61 72 79 4b 65 79 3b 0a 20 20  asPrimaryKey;.  
a8d0: 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a  if( pList==0 ){.
a8e0: 20 20 20 20 69 43 6f 6c 20 3d 20 70 54 61 62 2d      iCol = pTab-
a8f0: 3e 6e 43 6f 6c 20 2d 20 31 3b 0a 20 20 20 20 70  >nCol - 1;.    p
a900: 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e  Tab->aCol[iCol].
a910: 63 6f 6c 46 6c 61 67 73 20 7c 3d 20 43 4f 4c 46  colFlags |= COLF
a920: 4c 41 47 5f 50 52 49 4d 4b 45 59 3b 0a 20 20 20  LAG_PRIMKEY;.   
a930: 20 7a 54 79 70 65 20 3d 20 70 54 61 62 2d 3e 61   zType = pTab->a
a940: 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 54 79 70 65 3b  Col[iCol].zType;
a950: 0a 20 20 20 20 6e 54 65 72 6d 20 3d 20 31 3b 0a  .    nTerm = 1;.
a960: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 54 65    }else{.    nTe
a970: 72 6d 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70  rm = pList->nExp
a980: 72 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  r;.    for(i=0; 
a990: 69 3c 6e 54 65 72 6d 3b 20 69 2b 2b 29 7b 0a 20  i<nTerm; i++){. 
a9a0: 20 20 20 20 20 45 78 70 72 20 2a 70 43 45 78 70       Expr *pCExp
a9b0: 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53  r = sqlite3ExprS
a9c0: 6b 69 70 43 6f 6c 6c 61 74 65 28 70 4c 69 73 74  kipCollate(pList
a9d0: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20  ->a[i].pExpr);. 
a9e0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43 45       assert( pCE
a9f0: 78 70 72 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  xpr!=0 );.      
aa00: 73 71 6c 69 74 65 33 53 74 72 69 6e 67 54 6f 49  sqlite3StringToI
aa10: 64 28 70 43 45 78 70 72 29 3b 0a 20 20 20 20 20  d(pCExpr);.     
aa20: 20 69 66 28 20 70 43 45 78 70 72 2d 3e 6f 70 3d   if( pCExpr->op=
aa30: 3d 54 4b 5f 49 44 20 29 7b 0a 20 20 20 20 20 20  =TK_ID ){.      
aa40: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43    const char *zC
aa50: 4e 61 6d 65 20 3d 20 70 43 45 78 70 72 2d 3e 75  Name = pCExpr->u
aa60: 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 20  .zToken;.       
aa70: 20 66 6f 72 28 69 43 6f 6c 3d 30 3b 20 69 43 6f   for(iCol=0; iCo
aa80: 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 43  l<pTab->nCol; iC
aa90: 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20  ol++){.         
aaa0: 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49   if( sqlite3StrI
aab0: 43 6d 70 28 7a 43 4e 61 6d 65 2c 20 70 54 61 62  Cmp(zCName, pTab
aac0: 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61  ->aCol[iCol].zNa
aad0: 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  me)==0 ){.      
aae0: 20 20 20 20 20 20 70 54 61 62 2d 3e 61 43 6f 6c        pTab->aCol
aaf0: 5b 69 43 6f 6c 5d 2e 63 6f 6c 46 6c 61 67 73 20  [iCol].colFlags 
ab00: 7c 3d 20 43 4f 4c 46 4c 41 47 5f 50 52 49 4d 4b  |= COLFLAG_PRIMK
ab10: 45 59 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  EY;.            
ab20: 7a 54 79 70 65 20 3d 20 70 54 61 62 2d 3e 61 43  zType = pTab->aC
ab30: 6f 6c 5b 69 43 6f 6c 5d 2e 7a 54 79 70 65 3b 0a  ol[iCol].zType;.
ab40: 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
ab50: 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  k;.          }. 
ab60: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
ab70: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
ab80: 20 6e 54 65 72 6d 3d 3d 31 0a 20 20 20 26 26 20   nTerm==1.   && 
ab90: 7a 54 79 70 65 20 26 26 20 73 71 6c 69 74 65 33  zType && sqlite3
aba0: 53 74 72 49 43 6d 70 28 7a 54 79 70 65 2c 20 22  StrICmp(zType, "
abb0: 49 4e 54 45 47 45 52 22 29 3d 3d 30 0a 20 20 20  INTEGER")==0.   
abc0: 26 26 20 73 6f 72 74 4f 72 64 65 72 21 3d 53 51  && sortOrder!=SQ
abd0: 4c 49 54 45 5f 53 4f 5f 44 45 53 43 0a 20 20 29  LITE_SO_DESC.  )
abe0: 7b 0a 20 20 20 20 70 54 61 62 2d 3e 69 50 4b 65  {.    pTab->iPKe
abf0: 79 20 3d 20 69 43 6f 6c 3b 0a 20 20 20 20 70 54  y = iCol;.    pT
ac00: 61 62 2d 3e 6b 65 79 43 6f 6e 66 20 3d 20 28 75  ab->keyConf = (u
ac10: 38 29 6f 6e 45 72 72 6f 72 3b 0a 20 20 20 20 61  8)onError;.    a
ac20: 73 73 65 72 74 28 20 61 75 74 6f 49 6e 63 3d 3d  ssert( autoInc==
ac30: 30 20 7c 7c 20 61 75 74 6f 49 6e 63 3d 3d 31 20  0 || autoInc==1 
ac40: 29 3b 0a 20 20 20 20 70 54 61 62 2d 3e 74 61 62  );.    pTab->tab
ac50: 46 6c 61 67 73 20 7c 3d 20 61 75 74 6f 49 6e 63  Flags |= autoInc
ac60: 2a 54 46 5f 41 75 74 6f 69 6e 63 72 65 6d 65 6e  *TF_Autoincremen
ac70: 74 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74  t;.    if( pList
ac80: 20 29 20 70 50 61 72 73 65 2d 3e 69 50 6b 53 6f   ) pParse->iPkSo
ac90: 72 74 4f 72 64 65 72 20 3d 20 70 4c 69 73 74 2d  rtOrder = pList-
aca0: 3e 61 5b 30 5d 2e 73 6f 72 74 4f 72 64 65 72 3b  >a[0].sortOrder;
acb0: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 61 75 74  .  }else if( aut
acc0: 6f 49 6e 63 20 29 7b 0a 23 69 66 6e 64 65 66 20  oInc ){.#ifndef 
acd0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
ace0: 49 4e 43 52 45 4d 45 4e 54 0a 20 20 20 20 73 71  INCREMENT.    sq
acf0: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
ad00: 61 72 73 65 2c 20 22 41 55 54 4f 49 4e 43 52 45  arse, "AUTOINCRE
ad10: 4d 45 4e 54 20 69 73 20 6f 6e 6c 79 20 61 6c 6c  MENT is only all
ad20: 6f 77 65 64 20 6f 6e 20 61 6e 20 22 0a 20 20 20  owed on an ".   
ad30: 20 20 20 20 22 49 4e 54 45 47 45 52 20 50 52 49      "INTEGER PRI
ad40: 4d 41 52 59 20 4b 45 59 22 29 3b 0a 23 65 6e 64  MARY KEY");.#end
ad50: 69 66 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  if.  }else{.    
ad60: 49 6e 64 65 78 20 2a 70 3b 0a 20 20 20 20 70 20  Index *p;.    p 
ad70: 3d 20 73 71 6c 69 74 65 33 43 72 65 61 74 65 49  = sqlite3CreateI
ad80: 6e 64 65 78 28 70 50 61 72 73 65 2c 20 30 2c 20  ndex(pParse, 0, 
ad90: 30 2c 20 30 2c 20 70 4c 69 73 74 2c 20 6f 6e 45  0, 0, pList, onE
ada0: 72 72 6f 72 2c 20 30 2c 0a 20 20 20 20 20 20 20  rror, 0,.       
adb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
adc0: 20 20 20 20 30 2c 20 73 6f 72 74 4f 72 64 65 72      0, sortOrder
add0: 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70 20  , 0);.    if( p 
ade0: 29 7b 0a 20 20 20 20 20 20 70 2d 3e 69 64 78 54  ){.      p->idxT
adf0: 79 70 65 20 3d 20 53 51 4c 49 54 45 5f 49 44 58  ype = SQLITE_IDX
ae00: 54 59 50 45 5f 50 52 49 4d 41 52 59 4b 45 59 3b  TYPE_PRIMARYKEY;
ae10: 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c 69 73 74  .    }.    pList
ae20: 20 3d 20 30 3b 0a 20 20 7d 0a 0a 70 72 69 6d 61   = 0;.  }..prima
ae30: 72 79 5f 6b 65 79 5f 65 78 69 74 3a 0a 20 20 73  ry_key_exit:.  s
ae40: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65  qlite3ExprListDe
ae50: 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c  lete(pParse->db,
ae60: 20 70 4c 69 73 74 29 3b 0a 20 20 72 65 74 75 72   pList);.  retur
ae70: 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20  n;.}../*.** Add 
ae80: 61 20 6e 65 77 20 43 48 45 43 4b 20 63 6f 6e 73  a new CHECK cons
ae90: 74 72 61 69 6e 74 20 74 6f 20 74 68 65 20 74 61  traint to the ta
aea0: 62 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 75 6e  ble currently un
aeb0: 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e  der construction
aec0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
aed0: 33 41 64 64 43 68 65 63 6b 43 6f 6e 73 74 72 61  3AddCheckConstra
aee0: 69 6e 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50  int(.  Parse *pP
aef0: 61 72 73 65 2c 20 20 20 20 2f 2a 20 50 61 72 73  arse,    /* Pars
af00: 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
af10: 20 45 78 70 72 20 2a 70 43 68 65 63 6b 45 78 70   Expr *pCheckExp
af20: 72 20 20 2f 2a 20 54 68 65 20 63 68 65 63 6b 20  r  /* The check 
af30: 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 29 7b  expression */.){
af40: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
af50: 4f 4d 49 54 5f 43 48 45 43 4b 0a 20 20 54 61 62  OMIT_CHECK.  Tab
af60: 6c 65 20 2a 70 54 61 62 20 3d 20 70 50 61 72 73  le *pTab = pPars
af70: 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20  e->pNewTable;.  
af80: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
af90: 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20  arse->db;.  if( 
afa0: 70 54 61 62 20 26 26 20 21 49 4e 5f 44 45 43 4c  pTab && !IN_DECL
afb0: 41 52 45 5f 56 54 41 42 0a 20 20 20 26 26 20 21  ARE_VTAB.   && !
afc0: 73 71 6c 69 74 65 33 42 74 72 65 65 49 73 52 65  sqlite3BtreeIsRe
afd0: 61 64 6f 6e 6c 79 28 64 62 2d 3e 61 44 62 5b 64  adonly(db->aDb[d
afe0: 62 2d 3e 69 6e 69 74 2e 69 44 62 5d 2e 70 42 74  b->init.iDb].pBt
aff0: 29 0a 20 20 29 7b 0a 20 20 20 20 70 54 61 62 2d  ).  ){.    pTab-
b000: 3e 70 43 68 65 63 6b 20 3d 20 73 71 6c 69 74 65  >pCheck = sqlite
b010: 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28  3ExprListAppend(
b020: 70 50 61 72 73 65 2c 20 70 54 61 62 2d 3e 70 43  pParse, pTab->pC
b030: 68 65 63 6b 2c 20 70 43 68 65 63 6b 45 78 70 72  heck, pCheckExpr
b040: 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 72 73  );.    if( pPars
b050: 65 2d 3e 63 6f 6e 73 74 72 61 69 6e 74 4e 61 6d  e->constraintNam
b060: 65 2e 6e 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  e.n ){.      sql
b070: 69 74 65 33 45 78 70 72 4c 69 73 74 53 65 74 4e  ite3ExprListSetN
b080: 61 6d 65 28 70 50 61 72 73 65 2c 20 70 54 61 62  ame(pParse, pTab
b090: 2d 3e 70 43 68 65 63 6b 2c 20 26 70 50 61 72 73  ->pCheck, &pPars
b0a0: 65 2d 3e 63 6f 6e 73 74 72 61 69 6e 74 4e 61 6d  e->constraintNam
b0b0: 65 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  e, 1);.    }.  }
b0c0: 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 7b 0a  else.#endif.  {.
b0d0: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
b0e0: 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62  elete(pParse->db
b0f0: 2c 20 70 43 68 65 63 6b 45 78 70 72 29 3b 0a 20  , pCheckExpr);. 
b100: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20   }.}../*.** Set 
b110: 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 75  the collation fu
b120: 6e 63 74 69 6f 6e 20 6f 66 20 74 68 65 20 6d 6f  nction of the mo
b130: 73 74 20 72 65 63 65 6e 74 6c 79 20 70 61 72 73  st recently pars
b140: 65 64 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 0a  ed table column.
b150: 2a 2a 20 74 6f 20 74 68 65 20 43 6f 6c 6c 53 65  ** to the CollSe
b160: 71 20 67 69 76 65 6e 2e 0a 2a 2f 0a 76 6f 69 64  q given..*/.void
b170: 20 73 71 6c 69 74 65 33 41 64 64 43 6f 6c 6c 61   sqlite3AddColla
b180: 74 65 54 79 70 65 28 50 61 72 73 65 20 2a 70 50  teType(Parse *pP
b190: 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 54 6f  arse, Token *pTo
b1a0: 6b 65 6e 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70  ken){.  Table *p
b1b0: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 68 61  ;.  int i;.  cha
b1c0: 72 20 2a 7a 43 6f 6c 6c 3b 20 20 20 20 20 20 20  r *zColl;       
b1d0: 20 20 20 20 20 20 20 2f 2a 20 44 65 71 75 6f 74         /* Dequot
b1e0: 65 64 20 6e 61 6d 65 20 6f 66 20 63 6f 6c 6c 61  ed name of colla
b1f0: 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 2a 2f  tion sequence */
b200: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
b210: 0a 20 20 69 66 28 20 28 70 20 3d 20 70 50 61 72  .  if( (p = pPar
b220: 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3d 3d  se->pNewTable)==
b230: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 20  0 ) return;.  i 
b240: 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 64  = p->nCol-1;.  d
b250: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
b260: 20 20 7a 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65    zColl = sqlite
b270: 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64  3NameFromToken(d
b280: 62 2c 20 70 54 6f 6b 65 6e 29 3b 0a 20 20 69 66  b, pToken);.  if
b290: 28 20 21 7a 43 6f 6c 6c 20 29 20 72 65 74 75 72  ( !zColl ) retur
b2a0: 6e 3b 0a 0a 20 20 69 66 28 20 73 71 6c 69 74 65  n;..  if( sqlite
b2b0: 33 4c 6f 63 61 74 65 43 6f 6c 6c 53 65 71 28 70  3LocateCollSeq(p
b2c0: 50 61 72 73 65 2c 20 7a 43 6f 6c 6c 29 20 29 7b  Parse, zColl) ){
b2d0: 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78  .    Index *pIdx
b2e0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  ;.    sqlite3DbF
b2f0: 72 65 65 28 64 62 2c 20 70 2d 3e 61 43 6f 6c 5b  ree(db, p->aCol[
b300: 69 5d 2e 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20 70  i].zColl);.    p
b310: 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 43 6f 6c 6c 20  ->aCol[i].zColl 
b320: 3d 20 7a 43 6f 6c 6c 3b 0a 20 20 0a 20 20 20 20  = zColl;.  .    
b330: 2f 2a 20 49 66 20 74 68 65 20 63 6f 6c 75 6d 6e  /* If the column
b340: 20 69 73 20 64 65 63 6c 61 72 65 64 20 61 73 20   is declared as 
b350: 22 3c 6e 61 6d 65 3e 20 50 52 49 4d 41 52 59 20  "<name> PRIMARY 
b360: 4b 45 59 20 43 4f 4c 4c 41 54 45 20 3c 74 79 70  KEY COLLATE <typ
b370: 65 3e 22 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e  e>",.    ** then
b380: 20 61 6e 20 69 6e 64 65 78 20 6d 61 79 20 68 61   an index may ha
b390: 76 65 20 62 65 65 6e 20 63 72 65 61 74 65 64 20  ve been created 
b3a0: 6f 6e 20 74 68 69 73 20 63 6f 6c 75 6d 6e 20 62  on this column b
b3b0: 65 66 6f 72 65 20 74 68 65 0a 20 20 20 20 2a 2a  efore the.    **
b3c0: 20 63 6f 6c 6c 61 74 69 6f 6e 20 74 79 70 65 20   collation type 
b3d0: 77 61 73 20 61 64 64 65 64 2e 20 43 6f 72 72 65  was added. Corre
b3e0: 63 74 20 74 68 69 73 20 69 66 20 69 74 20 69 73  ct this if it is
b3f0: 20 74 68 65 20 63 61 73 65 2e 0a 20 20 20 20 2a   the case..    *
b400: 2f 0a 20 20 20 20 66 6f 72 28 70 49 64 78 3d 70  /.    for(pIdx=p
b410: 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20  ->pIndex; pIdx; 
b420: 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74  pIdx=pIdx->pNext
b430: 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
b440: 20 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3d 3d   pIdx->nKeyCol==
b450: 31 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  1 );.      if( p
b460: 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 30 5d  Idx->aiColumn[0]
b470: 3d 3d 69 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ==i ){.        p
b480: 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 30 5d 20 3d  Idx->azColl[0] =
b490: 20 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 43 6f 6c   p->aCol[i].zCol
b4a0: 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  l;.      }.    }
b4b0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71  .  }else{.    sq
b4c0: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
b4d0: 7a 43 6f 6c 6c 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  zColl);.  }.}../
b4e0: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
b4f0: 6f 6e 20 72 65 74 75 72 6e 73 20 74 68 65 20 63  on returns the c
b500: 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
b510: 65 20 66 6f 72 20 64 61 74 61 62 61 73 65 20 6e  e for database n
b520: 61 74 69 76 65 20 74 65 78 74 0a 2a 2a 20 65 6e  ative text.** en
b530: 63 6f 64 69 6e 67 20 69 64 65 6e 74 69 66 69 65  coding identifie
b540: 64 20 62 79 20 74 68 65 20 73 74 72 69 6e 67 20  d by the string 
b550: 7a 4e 61 6d 65 2c 20 6c 65 6e 67 74 68 20 6e 4e  zName, length nN
b560: 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ame..**.** If th
b570: 65 20 72 65 71 75 65 73 74 65 64 20 63 6f 6c 6c  e requested coll
b580: 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 69  ation sequence i
b590: 73 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 2c  s not available,
b5a0: 20 6f 72 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c   or not availabl
b5b0: 65 0a 2a 2a 20 69 6e 20 74 68 65 20 64 61 74 61  e.** in the data
b5c0: 62 61 73 65 20 6e 61 74 69 76 65 20 65 6e 63 6f  base native enco
b5d0: 64 69 6e 67 2c 20 74 68 65 20 63 6f 6c 6c 61 74  ding, the collat
b5e0: 69 6f 6e 20 66 61 63 74 6f 72 79 20 69 73 20 69  ion factory is i
b5f0: 6e 76 6f 6b 65 64 20 74 6f 0a 2a 2a 20 72 65 71  nvoked to.** req
b600: 75 65 73 74 20 69 74 2e 20 49 66 20 74 68 65 20  uest it. If the 
b610: 63 6f 6c 6c 61 74 69 6f 6e 20 66 61 63 74 6f 72  collation factor
b620: 79 20 64 6f 65 73 20 6e 6f 74 20 73 75 70 70 6c  y does not suppl
b630: 79 20 73 75 63 68 20 61 20 73 65 71 75 65 6e 63  y such a sequenc
b640: 65 2c 0a 2a 2a 20 61 6e 64 20 74 68 65 20 73 65  e,.** and the se
b650: 71 75 65 6e 63 65 20 69 73 20 61 76 61 69 6c 61  quence is availa
b660: 62 6c 65 20 69 6e 20 61 6e 6f 74 68 65 72 20 74  ble in another t
b670: 65 78 74 20 65 6e 63 6f 64 69 6e 67 2c 20 74 68  ext encoding, th
b680: 65 6e 20 74 68 61 74 20 69 73 0a 2a 2a 20 72 65  en that is.** re
b690: 74 75 72 6e 65 64 20 69 6e 73 74 65 61 64 2e 0a  turned instead..
b6a0: 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 20 76 65 72 73  **.** If no vers
b6b0: 69 6f 6e 73 20 6f 66 20 74 68 65 20 72 65 71 75  ions of the requ
b6c0: 65 73 74 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 73  ested collations
b6d0: 20 73 65 71 75 65 6e 63 65 20 61 72 65 20 61 76   sequence are av
b6e0: 61 69 6c 61 62 6c 65 2c 20 6f 72 0a 2a 2a 20 61  ailable, or.** a
b6f0: 6e 6f 74 68 65 72 20 65 72 72 6f 72 20 6f 63 63  nother error occ
b700: 75 72 73 2c 20 4e 55 4c 4c 20 69 73 20 72 65 74  urs, NULL is ret
b710: 75 72 6e 65 64 20 61 6e 64 20 61 6e 20 65 72 72  urned and an err
b720: 6f 72 20 6d 65 73 73 61 67 65 20 77 72 69 74 74  or message writt
b730: 65 6e 20 69 6e 74 6f 0a 2a 2a 20 70 50 61 72 73  en into.** pPars
b740: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  e..**.** This ro
b750: 75 74 69 6e 65 20 69 73 20 61 20 77 72 61 70 70  utine is a wrapp
b760: 65 72 20 61 72 6f 75 6e 64 20 73 71 6c 69 74 65  er around sqlite
b770: 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28 29 2e 20  3FindCollSeq(). 
b780: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a   This routine.**
b790: 20 69 6e 76 6f 6b 65 73 20 74 68 65 20 63 6f 6c   invokes the col
b7a0: 6c 61 74 69 6f 6e 20 66 61 63 74 6f 72 79 20 69  lation factory i
b7b0: 66 20 74 68 65 20 6e 61 6d 65 64 20 63 6f 6c 6c  f the named coll
b7c0: 61 74 69 6f 6e 20 63 61 6e 6e 6f 74 20 62 65 20  ation cannot be 
b7d0: 66 6f 75 6e 64 0a 2a 2a 20 61 6e 64 20 67 65 6e  found.** and gen
b7e0: 65 72 61 74 65 73 20 61 6e 20 65 72 72 6f 72 20  erates an error 
b7f0: 6d 65 73 73 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 53  message..**.** S
b800: 65 65 20 61 6c 73 6f 3a 20 73 71 6c 69 74 65 33  ee also: sqlite3
b810: 46 69 6e 64 43 6f 6c 6c 53 65 71 28 29 2c 20 73  FindCollSeq(), s
b820: 71 6c 69 74 65 33 47 65 74 43 6f 6c 6c 53 65 71  qlite3GetCollSeq
b830: 28 29 0a 2a 2f 0a 43 6f 6c 6c 53 65 71 20 2a 73  ().*/.CollSeq *s
b840: 71 6c 69 74 65 33 4c 6f 63 61 74 65 43 6f 6c 6c  qlite3LocateColl
b850: 53 65 71 28 50 61 72 73 65 20 2a 70 50 61 72 73  Seq(Parse *pPars
b860: 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  e, const char *z
b870: 4e 61 6d 65 29 7b 0a 20 20 73 71 6c 69 74 65 33  Name){.  sqlite3
b880: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
b890: 62 3b 0a 20 20 75 38 20 65 6e 63 20 3d 20 45 4e  b;.  u8 enc = EN
b8a0: 43 28 64 62 29 3b 0a 20 20 75 38 20 69 6e 69 74  C(db);.  u8 init
b8b0: 62 75 73 79 20 3d 20 64 62 2d 3e 69 6e 69 74 2e  busy = db->init.
b8c0: 62 75 73 79 3b 0a 20 20 43 6f 6c 6c 53 65 71 20  busy;.  CollSeq 
b8d0: 2a 70 43 6f 6c 6c 3b 0a 0a 20 20 70 43 6f 6c 6c  *pColl;..  pColl
b8e0: 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f   = sqlite3FindCo
b8f0: 6c 6c 53 65 71 28 64 62 2c 20 65 6e 63 2c 20 7a  llSeq(db, enc, z
b900: 4e 61 6d 65 2c 20 69 6e 69 74 62 75 73 79 29 3b  Name, initbusy);
b910: 0a 20 20 69 66 28 20 21 69 6e 69 74 62 75 73 79  .  if( !initbusy
b920: 20 26 26 20 28 21 70 43 6f 6c 6c 20 7c 7c 20 21   && (!pColl || !
b930: 70 43 6f 6c 6c 2d 3e 78 43 6d 70 29 20 29 7b 0a  pColl->xCmp) ){.
b940: 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69      pColl = sqli
b950: 74 65 33 47 65 74 43 6f 6c 6c 53 65 71 28 70 50  te3GetCollSeq(pP
b960: 61 72 73 65 2c 20 65 6e 63 2c 20 70 43 6f 6c 6c  arse, enc, pColl
b970: 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a 0a 20  , zName);.  }.. 
b980: 20 72 65 74 75 72 6e 20 70 43 6f 6c 6c 3b 0a 7d   return pColl;.}
b990: 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  .../*.** Generat
b9a0: 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c  e code that will
b9b0: 20 69 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 73   increment the s
b9c0: 63 68 65 6d 61 20 63 6f 6f 6b 69 65 2e 0a 2a 2a  chema cookie..**
b9d0: 0a 2a 2a 20 54 68 65 20 73 63 68 65 6d 61 20 63  .** The schema c
b9e0: 6f 6f 6b 69 65 20 69 73 20 75 73 65 64 20 74 6f  ookie is used to
b9f0: 20 64 65 74 65 72 6d 69 6e 65 20 77 68 65 6e 20   determine when 
ba00: 74 68 65 20 73 63 68 65 6d 61 20 66 6f 72 20 74  the schema for t
ba10: 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 63  he.** database c
ba20: 68 61 6e 67 65 73 2e 20 20 41 66 74 65 72 20 65  hanges.  After e
ba30: 61 63 68 20 73 63 68 65 6d 61 20 63 68 61 6e 67  ach schema chang
ba40: 65 2c 20 74 68 65 20 63 6f 6f 6b 69 65 20 76 61  e, the cookie va
ba50: 6c 75 65 0a 2a 2a 20 63 68 61 6e 67 65 73 2e 20  lue.** changes. 
ba60: 20 57 68 65 6e 20 61 20 70 72 6f 63 65 73 73 20   When a process 
ba70: 66 69 72 73 74 20 72 65 61 64 73 20 74 68 65 20  first reads the 
ba80: 73 63 68 65 6d 61 20 69 74 20 72 65 63 6f 72 64  schema it record
ba90: 73 20 74 68 65 0a 2a 2a 20 63 6f 6f 6b 69 65 2e  s the.** cookie.
baa0: 20 20 54 68 65 72 65 61 66 74 65 72 2c 20 77 68    Thereafter, wh
bab0: 65 6e 65 76 65 72 20 69 74 20 67 6f 65 73 20 74  enever it goes t
bac0: 6f 20 61 63 63 65 73 73 20 74 68 65 20 64 61 74  o access the dat
bad0: 61 62 61 73 65 2c 0a 2a 2a 20 69 74 20 63 68 65  abase,.** it che
bae0: 63 6b 73 20 74 68 65 20 63 6f 6f 6b 69 65 20 74  cks the cookie t
baf0: 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20  o make sure the 
bb00: 73 63 68 65 6d 61 20 68 61 73 20 6e 6f 74 20 63  schema has not c
bb10: 68 61 6e 67 65 64 0a 2a 2a 20 73 69 6e 63 65 20  hanged.** since 
bb20: 69 74 20 77 61 73 20 6c 61 73 74 20 72 65 61 64  it was last read
bb30: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 70 6c 61  ..**.** This pla
bb40: 6e 20 69 73 20 6e 6f 74 20 63 6f 6d 70 6c 65 74  n is not complet
bb50: 65 6c 79 20 62 75 6c 6c 65 74 2d 70 72 6f 6f 66  ely bullet-proof
bb60: 2e 20 20 49 74 20 69 73 20 70 6f 73 73 69 62 6c  .  It is possibl
bb70: 65 20 66 6f 72 0a 2a 2a 20 74 68 65 20 73 63 68  e for.** the sch
bb80: 65 6d 61 20 74 6f 20 63 68 61 6e 67 65 20 6d 75  ema to change mu
bb90: 6c 74 69 70 6c 65 20 74 69 6d 65 73 20 61 6e 64  ltiple times and
bba0: 20 66 6f 72 20 74 68 65 20 63 6f 6f 6b 69 65 20   for the cookie 
bbb0: 74 6f 20 62 65 0a 2a 2a 20 73 65 74 20 62 61 63  to be.** set bac
bbc0: 6b 20 74 6f 20 70 72 69 6f 72 20 76 61 6c 75 65  k to prior value
bbd0: 2e 20 20 42 75 74 20 73 63 68 65 6d 61 20 63 68  .  But schema ch
bbe0: 61 6e 67 65 73 20 61 72 65 20 69 6e 66 72 65 71  anges are infreq
bbf0: 75 65 6e 74 0a 2a 2a 20 61 6e 64 20 74 68 65 20  uent.** and the 
bc00: 70 72 6f 62 61 62 69 6c 69 74 79 20 6f 66 20 68  probability of h
bc10: 69 74 74 69 6e 67 20 74 68 65 20 73 61 6d 65 20  itting the same 
bc20: 63 6f 6f 6b 69 65 20 76 61 6c 75 65 20 69 73 20  cookie value is 
bc30: 6f 6e 6c 79 0a 2a 2a 20 31 20 63 68 61 6e 63 65  only.** 1 chance
bc40: 20 69 6e 20 32 5e 33 32 2e 20 20 53 6f 20 77 65   in 2^32.  So we
bc50: 27 72 65 20 73 61 66 65 20 65 6e 6f 75 67 68 2e  're safe enough.
bc60: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
bc70: 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28 50 61 72  ChangeCookie(Par
bc80: 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20  se *pParse, int 
bc90: 69 44 62 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  iDb){.  sqlite3 
bca0: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
bcb0: 3b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  ;.  Vdbe *v = pP
bcc0: 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 61  arse->pVdbe;.  a
bcd0: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 53 63  ssert( sqlite3Sc
bce0: 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62  hemaMutexHeld(db
bcf0: 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a 20 20 73  , iDb, 0) );.  s
bd00: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
bd10: 28 76 2c 20 4f 50 5f 53 65 74 43 6f 6f 6b 69 65  (v, OP_SetCookie
bd20: 2c 20 69 44 62 2c 20 42 54 52 45 45 5f 53 43 48  , iDb, BTREE_SCH
bd30: 45 4d 41 5f 56 45 52 53 49 4f 4e 2c 20 0a 20 20  EMA_VERSION, .  
bd40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bd50: 20 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70    db->aDb[iDb].p
bd60: 53 63 68 65 6d 61 2d 3e 73 63 68 65 6d 61 5f 63  Schema->schema_c
bd70: 6f 6f 6b 69 65 2b 31 29 3b 0a 7d 0a 0a 2f 2a 0a  ookie+1);.}../*.
bd80: 2a 2a 20 4d 65 61 73 75 72 65 20 74 68 65 20 6e  ** Measure the n
bd90: 75 6d 62 65 72 20 6f 66 20 63 68 61 72 61 63 74  umber of charact
bda0: 65 72 73 20 6e 65 65 64 65 64 20 74 6f 20 6f 75  ers needed to ou
bdb0: 74 70 75 74 20 74 68 65 20 67 69 76 65 6e 0a 2a  tput the given.*
bdc0: 2a 20 69 64 65 6e 74 69 66 69 65 72 2e 20 20 54  * identifier.  T
bdd0: 68 65 20 6e 75 6d 62 65 72 20 72 65 74 75 72 6e  he number return
bde0: 65 64 20 69 6e 63 6c 75 64 65 73 20 61 6e 79 20  ed includes any 
bdf0: 71 75 6f 74 65 73 20 75 73 65 64 0a 2a 2a 20 62  quotes used.** b
be00: 75 74 20 64 6f 65 73 20 6e 6f 74 20 69 6e 63 6c  ut does not incl
be10: 75 64 65 20 74 68 65 20 6e 75 6c 6c 20 74 65 72  ude the null ter
be20: 6d 69 6e 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54  minator..**.** T
be30: 68 65 20 65 73 74 69 6d 61 74 65 20 69 73 20 63  he estimate is c
be40: 6f 6e 73 65 72 76 61 74 69 76 65 2e 20 20 49 74  onservative.  It
be50: 20 6d 69 67 68 74 20 62 65 20 6c 61 72 67 65 72   might be larger
be60: 20 74 68 61 74 20 77 68 61 74 20 69 73 0a 2a 2a   that what is.**
be70: 20 72 65 61 6c 6c 79 20 6e 65 65 64 65 64 2e 0a   really needed..
be80: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 64  */.static int id
be90: 65 6e 74 4c 65 6e 67 74 68 28 63 6f 6e 73 74 20  entLength(const 
bea0: 63 68 61 72 20 2a 7a 29 7b 0a 20 20 69 6e 74 20  char *z){.  int 
beb0: 6e 3b 0a 20 20 66 6f 72 28 6e 3d 30 3b 20 2a 7a  n;.  for(n=0; *z
bec0: 3b 20 6e 2b 2b 2c 20 7a 2b 2b 29 7b 0a 20 20 20  ; n++, z++){.   
bed0: 20 69 66 28 20 2a 7a 3d 3d 27 22 27 20 29 7b 20   if( *z=='"' ){ 
bee0: 6e 2b 2b 3b 20 7d 0a 20 20 7d 0a 20 20 72 65 74  n++; }.  }.  ret
bef0: 75 72 6e 20 6e 20 2b 20 32 3b 0a 7d 0a 0a 2f 2a  urn n + 2;.}../*
bf00: 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 70 61  .** The first pa
bf10: 72 61 6d 65 74 65 72 20 69 73 20 61 20 70 6f 69  rameter is a poi
bf20: 6e 74 65 72 20 74 6f 20 61 6e 20 6f 75 74 70 75  nter to an outpu
bf30: 74 20 62 75 66 66 65 72 2e 20 54 68 65 20 73 65  t buffer. The se
bf40: 63 6f 6e 64 20 0a 2a 2a 20 70 61 72 61 6d 65 74  cond .** paramet
bf50: 65 72 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20  er is a pointer 
bf60: 74 6f 20 61 6e 20 69 6e 74 65 67 65 72 20 74 68  to an integer th
bf70: 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  at contains the 
bf80: 6f 66 66 73 65 74 20 61 74 0a 2a 2a 20 77 68 69  offset at.** whi
bf90: 63 68 20 74 6f 20 77 72 69 74 65 20 69 6e 74 6f  ch to write into
bfa0: 20 74 68 65 20 6f 75 74 70 75 74 20 62 75 66 66   the output buff
bfb0: 65 72 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  er. This functio
bfc0: 6e 20 63 6f 70 69 65 73 20 74 68 65 0a 2a 2a 20  n copies the.** 
bfd0: 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20 73  nul-terminated s
bfe0: 74 72 69 6e 67 20 70 6f 69 6e 74 65 64 20 74 6f  tring pointed to
bff0: 20 62 79 20 74 68 65 20 74 68 69 72 64 20 70 61   by the third pa
c000: 72 61 6d 65 74 65 72 2c 20 7a 53 69 67 6e 65 64  rameter, zSigned
c010: 49 64 65 6e 74 2c 0a 2a 2a 20 74 6f 20 74 68 65  Ident,.** to the
c020: 20 73 70 65 63 69 66 69 65 64 20 6f 66 66 73 65   specified offse
c030: 74 20 69 6e 20 74 68 65 20 62 75 66 66 65 72 20  t in the buffer 
c040: 61 6e 64 20 75 70 64 61 74 65 73 20 2a 70 49 64  and updates *pId
c050: 78 20 74 6f 20 72 65 66 65 72 0a 2a 2a 20 74 6f  x to refer.** to
c060: 20 74 68 65 20 66 69 72 73 74 20 62 79 74 65 20   the first byte 
c070: 61 66 74 65 72 20 74 68 65 20 6c 61 73 74 20 62  after the last b
c080: 79 74 65 20 77 72 69 74 74 65 6e 20 62 65 66 6f  yte written befo
c090: 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a  re returning..**
c0a0: 20 0a 2a 2a 20 49 66 20 74 68 65 20 73 74 72 69   .** If the stri
c0b0: 6e 67 20 7a 53 69 67 6e 65 64 49 64 65 6e 74 20  ng zSignedIdent 
c0c0: 63 6f 6e 73 69 73 74 73 20 65 6e 74 69 72 65 6c  consists entirel
c0d0: 79 20 6f 66 20 61 6c 70 68 61 2d 6e 75 6d 65 72  y of alpha-numer
c0e0: 69 63 0a 2a 2a 20 63 68 61 72 61 63 74 65 72 73  ic.** characters
c0f0: 2c 20 64 6f 65 73 20 6e 6f 74 20 62 65 67 69 6e  , does not begin
c100: 20 77 69 74 68 20 61 20 64 69 67 69 74 20 61 6e   with a digit an
c110: 64 20 69 73 20 6e 6f 74 20 61 6e 20 53 51 4c 20  d is not an SQL 
c120: 6b 65 79 77 6f 72 64 2c 0a 2a 2a 20 74 68 65 6e  keyword,.** then
c130: 20 69 74 20 69 73 20 63 6f 70 69 65 64 20 74 6f   it is copied to
c140: 20 74 68 65 20 6f 75 74 70 75 74 20 62 75 66 66   the output buff
c150: 65 72 20 65 78 61 63 74 6c 79 20 61 73 20 69 74  er exactly as it
c160: 20 69 73 2e 20 4f 74 68 65 72 77 69 73 65 2c 0a   is. Otherwise,.
c170: 2a 2a 20 69 74 20 69 73 20 71 75 6f 74 65 64 20  ** it is quoted 
c180: 75 73 69 6e 67 20 64 6f 75 62 6c 65 2d 71 75 6f  using double-quo
c190: 74 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  tes..*/.static v
c1a0: 6f 69 64 20 69 64 65 6e 74 50 75 74 28 63 68 61  oid identPut(cha
c1b0: 72 20 2a 7a 2c 20 69 6e 74 20 2a 70 49 64 78 2c  r *z, int *pIdx,
c1c0: 20 63 68 61 72 20 2a 7a 53 69 67 6e 65 64 49 64   char *zSignedId
c1d0: 65 6e 74 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64  ent){.  unsigned
c1e0: 20 63 68 61 72 20 2a 7a 49 64 65 6e 74 20 3d 20   char *zIdent = 
c1f0: 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29  (unsigned char*)
c200: 7a 53 69 67 6e 65 64 49 64 65 6e 74 3b 0a 20 20  zSignedIdent;.  
c210: 69 6e 74 20 69 2c 20 6a 2c 20 6e 65 65 64 51 75  int i, j, needQu
c220: 6f 74 65 3b 0a 20 20 69 20 3d 20 2a 70 49 64 78  ote;.  i = *pIdx
c230: 3b 0a 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 7a 49  ;..  for(j=0; zI
c240: 64 65 6e 74 5b 6a 5d 3b 20 6a 2b 2b 29 7b 0a 20  dent[j]; j++){. 
c250: 20 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 49     if( !sqlite3I
c260: 73 61 6c 6e 75 6d 28 7a 49 64 65 6e 74 5b 6a 5d  salnum(zIdent[j]
c270: 29 20 26 26 20 7a 49 64 65 6e 74 5b 6a 5d 21 3d  ) && zIdent[j]!=
c280: 27 5f 27 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d  '_' ) break;.  }
c290: 0a 20 20 6e 65 65 64 51 75 6f 74 65 20 3d 20 73  .  needQuote = s
c2a0: 71 6c 69 74 65 33 49 73 64 69 67 69 74 28 7a 49  qlite3Isdigit(zI
c2b0: 64 65 6e 74 5b 30 5d 29 0a 20 20 20 20 20 20 20  dent[0]).       
c2c0: 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 4b       || sqlite3K
c2d0: 65 79 77 6f 72 64 43 6f 64 65 28 7a 49 64 65 6e  eywordCode(zIden
c2e0: 74 2c 20 6a 29 21 3d 54 4b 5f 49 44 0a 20 20 20  t, j)!=TK_ID.   
c2f0: 20 20 20 20 20 20 20 20 20 7c 7c 20 7a 49 64 65           || zIde
c300: 6e 74 5b 6a 5d 21 3d 30 0a 20 20 20 20 20 20 20  nt[j]!=0.       
c310: 20 20 20 20 20 7c 7c 20 6a 3d 3d 30 3b 0a 0a 20       || j==0;.. 
c320: 20 69 66 28 20 6e 65 65 64 51 75 6f 74 65 20 29   if( needQuote )
c330: 20 7a 5b 69 2b 2b 5d 20 3d 20 27 22 27 3b 0a 20   z[i++] = '"';. 
c340: 20 66 6f 72 28 6a 3d 30 3b 20 7a 49 64 65 6e 74   for(j=0; zIdent
c350: 5b 6a 5d 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 7a  [j]; j++){.    z
c360: 5b 69 2b 2b 5d 20 3d 20 7a 49 64 65 6e 74 5b 6a  [i++] = zIdent[j
c370: 5d 3b 0a 20 20 20 20 69 66 28 20 7a 49 64 65 6e  ];.    if( zIden
c380: 74 5b 6a 5d 3d 3d 27 22 27 20 29 20 7a 5b 69 2b  t[j]=='"' ) z[i+
c390: 2b 5d 20 3d 20 27 22 27 3b 0a 20 20 7d 0a 20 20  +] = '"';.  }.  
c3a0: 69 66 28 20 6e 65 65 64 51 75 6f 74 65 20 29 20  if( needQuote ) 
c3b0: 7a 5b 69 2b 2b 5d 20 3d 20 27 22 27 3b 0a 20 20  z[i++] = '"';.  
c3c0: 7a 5b 69 5d 20 3d 20 30 3b 0a 20 20 2a 70 49 64  z[i] = 0;.  *pId
c3d0: 78 20 3d 20 69 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  x = i;.}../*.** 
c3e0: 47 65 6e 65 72 61 74 65 20 61 20 43 52 45 41 54  Generate a CREAT
c3f0: 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e  E TABLE statemen
c400: 74 20 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f  t appropriate fo
c410: 72 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20 74  r the given.** t
c420: 61 62 6c 65 2e 20 20 4d 65 6d 6f 72 79 20 74 6f  able.  Memory to
c430: 20 68 6f 6c 64 20 74 68 65 20 74 65 78 74 20 6f   hold the text o
c440: 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  f the statement 
c450: 69 73 20 6f 62 74 61 69 6e 65 64 0a 2a 2a 20 66  is obtained.** f
c460: 72 6f 6d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  rom sqliteMalloc
c470: 28 29 20 61 6e 64 20 6d 75 73 74 20 62 65 20 66  () and must be f
c480: 72 65 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c  reed by the call
c490: 69 6e 67 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f  ing function..*/
c4a0: 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 63 72  .static char *cr
c4b0: 65 61 74 65 54 61 62 6c 65 53 74 6d 74 28 73 71  eateTableStmt(sq
c4c0: 6c 69 74 65 33 20 2a 64 62 2c 20 54 61 62 6c 65  lite3 *db, Table
c4d0: 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6b   *p){.  int i, k
c4e0: 2c 20 6e 3b 0a 20 20 63 68 61 72 20 2a 7a 53 74  , n;.  char *zSt
c4f0: 6d 74 3b 0a 20 20 63 68 61 72 20 2a 7a 53 65 70  mt;.  char *zSep
c500: 2c 20 2a 7a 53 65 70 32 2c 20 2a 7a 45 6e 64 3b  , *zSep2, *zEnd;
c510: 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b  .  Column *pCol;
c520: 0a 20 20 6e 20 3d 20 30 3b 0a 20 20 66 6f 72 28  .  n = 0;.  for(
c530: 70 43 6f 6c 20 3d 20 70 2d 3e 61 43 6f 6c 2c 20  pCol = p->aCol, 
c540: 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 3b 20  i=0; i<p->nCol; 
c550: 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20  i++, pCol++){.  
c560: 20 20 6e 20 2b 3d 20 69 64 65 6e 74 4c 65 6e 67    n += identLeng
c570: 74 68 28 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 20  th(pCol->zName) 
c580: 2b 20 35 3b 0a 20 20 7d 0a 20 20 6e 20 2b 3d 20  + 5;.  }.  n += 
c590: 69 64 65 6e 74 4c 65 6e 67 74 68 28 70 2d 3e 7a  identLength(p->z
c5a0: 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 6e 3c 35  Name);.  if( n<5
c5b0: 30 20 29 7b 20 0a 20 20 20 20 7a 53 65 70 20 3d  0 ){ .    zSep =
c5c0: 20 22 22 3b 0a 20 20 20 20 7a 53 65 70 32 20 3d   "";.    zSep2 =
c5d0: 20 22 2c 22 3b 0a 20 20 20 20 7a 45 6e 64 20 3d   ",";.    zEnd =
c5e0: 20 22 29 22 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   ")";.  }else{. 
c5f0: 20 20 20 7a 53 65 70 20 3d 20 22 5c 6e 20 20 22     zSep = "\n  "
c600: 3b 0a 20 20 20 20 7a 53 65 70 32 20 3d 20 22 2c  ;.    zSep2 = ",
c610: 5c 6e 20 20 22 3b 0a 20 20 20 20 7a 45 6e 64 20  \n  ";.    zEnd 
c620: 3d 20 22 5c 6e 29 22 3b 0a 20 20 7d 0a 20 20 6e  = "\n)";.  }.  n
c630: 20 2b 3d 20 33 35 20 2b 20 36 2a 70 2d 3e 6e 43   += 35 + 6*p->nC
c640: 6f 6c 3b 0a 20 20 7a 53 74 6d 74 20 3d 20 73 71  ol;.  zStmt = sq
c650: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77  lite3DbMallocRaw
c660: 28 30 2c 20 6e 29 3b 0a 20 20 69 66 28 20 7a 53  (0, n);.  if( zS
c670: 74 6d 74 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  tmt==0 ){.    sq
c680: 6c 69 74 65 33 4f 6f 6d 46 61 75 6c 74 28 64 62  lite3OomFault(db
c690: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  );.    return 0;
c6a0: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 73  .  }.  sqlite3_s
c6b0: 6e 70 72 69 6e 74 66 28 6e 2c 20 7a 53 74 6d 74  nprintf(n, zStmt
c6c0: 2c 20 22 43 52 45 41 54 45 20 54 41 42 4c 45 20  , "CREATE TABLE 
c6d0: 22 29 3b 0a 20 20 6b 20 3d 20 73 71 6c 69 74 65  ");.  k = sqlite
c6e0: 33 53 74 72 6c 65 6e 33 30 28 7a 53 74 6d 74 29  3Strlen30(zStmt)
c6f0: 3b 0a 20 20 69 64 65 6e 74 50 75 74 28 7a 53 74  ;.  identPut(zSt
c700: 6d 74 2c 20 26 6b 2c 20 70 2d 3e 7a 4e 61 6d 65  mt, &k, p->zName
c710: 29 3b 0a 20 20 7a 53 74 6d 74 5b 6b 2b 2b 5d 20  );.  zStmt[k++] 
c720: 3d 20 27 28 27 3b 0a 20 20 66 6f 72 28 70 43 6f  = '(';.  for(pCo
c730: 6c 3d 70 2d 3e 61 43 6f 6c 2c 20 69 3d 30 3b 20  l=p->aCol, i=0; 
c740: 69 3c 70 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c 20  i<p->nCol; i++, 
c750: 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 73 74 61  pCol++){.    sta
c760: 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  tic const char *
c770: 20 63 6f 6e 73 74 20 61 7a 54 79 70 65 5b 5d 20   const azType[] 
c780: 3d 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 53  = {.        /* S
c790: 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 20 20  QLITE_AFF_BLOB  
c7a0: 20 20 2a 2f 20 22 22 2c 0a 20 20 20 20 20 20 20    */ "",.       
c7b0: 20 2f 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f 54   /* SQLITE_AFF_T
c7c0: 45 58 54 20 20 20 20 2a 2f 20 22 20 54 45 58 54  EXT    */ " TEXT
c7d0: 22 2c 0a 20 20 20 20 20 20 20 20 2f 2a 20 53 51  ",.        /* SQ
c7e0: 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43  LITE_AFF_NUMERIC
c7f0: 20 2a 2f 20 22 20 4e 55 4d 22 2c 0a 20 20 20 20   */ " NUM",.    
c800: 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 41 46      /* SQLITE_AF
c810: 46 5f 49 4e 54 45 47 45 52 20 2a 2f 20 22 20 49  F_INTEGER */ " I
c820: 4e 54 22 2c 0a 20 20 20 20 20 20 20 20 2f 2a 20  NT",.        /* 
c830: 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 20  SQLITE_AFF_REAL 
c840: 20 20 20 2a 2f 20 22 20 52 45 41 4c 22 0a 20 20     */ " REAL".  
c850: 20 20 7d 3b 0a 20 20 20 20 69 6e 74 20 6c 65 6e    };.    int len
c860: 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  ;.    const char
c870: 20 2a 7a 54 79 70 65 3b 0a 0a 20 20 20 20 73 71   *zType;..    sq
c880: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e  lite3_snprintf(n
c890: 2d 6b 2c 20 26 7a 53 74 6d 74 5b 6b 5d 2c 20 7a  -k, &zStmt[k], z
c8a0: 53 65 70 29 3b 0a 20 20 20 20 6b 20 2b 3d 20 73  Sep);.    k += s
c8b0: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 26  qlite3Strlen30(&
c8c0: 7a 53 74 6d 74 5b 6b 5d 29 3b 0a 20 20 20 20 7a  zStmt[k]);.    z
c8d0: 53 65 70 20 3d 20 7a 53 65 70 32 3b 0a 20 20 20  Sep = zSep2;.   
c8e0: 20 69 64 65 6e 74 50 75 74 28 7a 53 74 6d 74 2c   identPut(zStmt,
c8f0: 20 26 6b 2c 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65   &k, pCol->zName
c900: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
c910: 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 2d 53 51  Col->affinity-SQ
c920: 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 20 3e 3d  LITE_AFF_BLOB >=
c930: 20 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74   0 );.    assert
c940: 28 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79  ( pCol->affinity
c950: 2d 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42  -SQLITE_AFF_BLOB
c960: 20 3c 20 41 72 72 61 79 53 69 7a 65 28 61 7a 54   < ArraySize(azT
c970: 79 70 65 29 20 29 3b 0a 20 20 20 20 74 65 73 74  ype) );.    test
c980: 63 61 73 65 28 20 70 43 6f 6c 2d 3e 61 66 66 69  case( pCol->affi
c990: 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41 46 46  nity==SQLITE_AFF
c9a0: 5f 42 4c 4f 42 20 29 3b 0a 20 20 20 20 74 65 73  _BLOB );.    tes
c9b0: 74 63 61 73 65 28 20 70 43 6f 6c 2d 3e 61 66 66  tcase( pCol->aff
c9c0: 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41 46  inity==SQLITE_AF
c9d0: 46 5f 54 45 58 54 20 29 3b 0a 20 20 20 20 74 65  F_TEXT );.    te
c9e0: 73 74 63 61 73 65 28 20 70 43 6f 6c 2d 3e 61 66  stcase( pCol->af
c9f0: 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41  finity==SQLITE_A
ca00: 46 46 5f 4e 55 4d 45 52 49 43 20 29 3b 0a 20 20  FF_NUMERIC );.  
ca10: 20 20 74 65 73 74 63 61 73 65 28 20 70 43 6f 6c    testcase( pCol
ca20: 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49  ->affinity==SQLI
ca30: 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 20 29  TE_AFF_INTEGER )
ca40: 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
ca50: 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 3d 3d  pCol->affinity==
ca60: 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 20  SQLITE_AFF_REAL 
ca70: 29 3b 0a 20 20 20 20 0a 20 20 20 20 7a 54 79 70  );.    .    zTyp
ca80: 65 20 3d 20 61 7a 54 79 70 65 5b 70 43 6f 6c 2d  e = azType[pCol-
ca90: 3e 61 66 66 69 6e 69 74 79 20 2d 20 53 51 4c 49  >affinity - SQLI
caa0: 54 45 5f 41 46 46 5f 42 4c 4f 42 5d 3b 0a 20 20  TE_AFF_BLOB];.  
cab0: 20 20 6c 65 6e 20 3d 20 73 71 6c 69 74 65 33 53    len = sqlite3S
cac0: 74 72 6c 65 6e 33 30 28 7a 54 79 70 65 29 3b 0a  trlen30(zType);.
cad0: 20 20 20 20 61 73 73 65 72 74 28 20 70 43 6f 6c      assert( pCol
cae0: 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49  ->affinity==SQLI
caf0: 54 45 5f 41 46 46 5f 42 4c 4f 42 20 0a 20 20 20  TE_AFF_BLOB .   
cb00: 20 20 20 20 20 20 20 20 20 7c 7c 20 70 43 6f 6c           || pCol
cb10: 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 73 71 6c 69  ->affinity==sqli
cb20: 74 65 33 41 66 66 69 6e 69 74 79 54 79 70 65 28  te3AffinityType(
cb30: 7a 54 79 70 65 2c 20 30 29 20 29 3b 0a 20 20 20  zType, 0) );.   
cb40: 20 6d 65 6d 63 70 79 28 26 7a 53 74 6d 74 5b 6b   memcpy(&zStmt[k
cb50: 5d 2c 20 7a 54 79 70 65 2c 20 6c 65 6e 29 3b 0a  ], zType, len);.
cb60: 20 20 20 20 6b 20 2b 3d 20 6c 65 6e 3b 0a 20 20      k += len;.  
cb70: 20 20 61 73 73 65 72 74 28 20 6b 3c 3d 6e 20 29    assert( k<=n )
cb80: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  ;.  }.  sqlite3_
cb90: 73 6e 70 72 69 6e 74 66 28 6e 2d 6b 2c 20 26 7a  snprintf(n-k, &z
cba0: 53 74 6d 74 5b 6b 5d 2c 20 22 25 73 22 2c 20 7a  Stmt[k], "%s", z
cbb0: 45 6e 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a  End);.  return z
cbc0: 53 74 6d 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  Stmt;.}../*.** R
cbd0: 65 73 69 7a 65 20 61 6e 20 49 6e 64 65 78 20 6f  esize an Index o
cbe0: 62 6a 65 63 74 20 74 6f 20 68 6f 6c 64 20 4e 20  bject to hold N 
cbf0: 63 6f 6c 75 6d 6e 73 20 74 6f 74 61 6c 2e 20 20  columns total.  
cc00: 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
cc10: 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73 20 61  .** on success a
cc20: 6e 64 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  nd SQLITE_NOMEM 
cc30: 6f 6e 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 2e  on an OOM error.
cc40: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72  .*/.static int r
cc50: 65 73 69 7a 65 49 6e 64 65 78 4f 62 6a 65 63 74  esizeIndexObject
cc60: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 49 6e  (sqlite3 *db, In
cc70: 64 65 78 20 2a 70 49 64 78 2c 20 69 6e 74 20 4e  dex *pIdx, int N
cc80: 29 7b 0a 20 20 63 68 61 72 20 2a 7a 45 78 74 72  ){.  char *zExtr
cc90: 61 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a  a;.  int nByte;.
cca0: 20 20 69 66 28 20 70 49 64 78 2d 3e 6e 43 6f 6c    if( pIdx->nCol
ccb0: 75 6d 6e 3e 3d 4e 20 29 20 72 65 74 75 72 6e 20  umn>=N ) return 
ccc0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73  SQLITE_OK;.  ass
ccd0: 65 72 74 28 20 70 49 64 78 2d 3e 69 73 52 65 73  ert( pIdx->isRes
cce0: 69 7a 65 64 3d 3d 30 20 29 3b 0a 20 20 6e 42 79  ized==0 );.  nBy
ccf0: 74 65 20 3d 20 28 73 69 7a 65 6f 66 28 63 68 61  te = (sizeof(cha
cd00: 72 2a 29 20 2b 20 73 69 7a 65 6f 66 28 69 31 36  r*) + sizeof(i16
cd10: 29 20 2b 20 31 29 2a 4e 3b 0a 20 20 7a 45 78 74  ) + 1)*N;.  zExt
cd20: 72 61 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  ra = sqlite3DbMa
cd30: 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 6e 42 79  llocZero(db, nBy
cd40: 74 65 29 3b 0a 20 20 69 66 28 20 7a 45 78 74 72  te);.  if( zExtr
cd50: 61 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51  a==0 ) return SQ
cd60: 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  LITE_NOMEM_BKPT;
cd70: 0a 20 20 6d 65 6d 63 70 79 28 7a 45 78 74 72 61  .  memcpy(zExtra
cd80: 2c 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 2c 20  , pIdx->azColl, 
cd90: 73 69 7a 65 6f 66 28 63 68 61 72 2a 29 2a 70 49  sizeof(char*)*pI
cda0: 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20  dx->nColumn);.  
cdb0: 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 20 3d 20 28  pIdx->azColl = (
cdc0: 63 6f 6e 73 74 20 63 68 61 72 2a 2a 29 7a 45 78  const char**)zEx
cdd0: 74 72 61 3b 0a 20 20 7a 45 78 74 72 61 20 2b 3d  tra;.  zExtra +=
cde0: 20 73 69 7a 65 6f 66 28 63 68 61 72 2a 29 2a 4e   sizeof(char*)*N
cdf0: 3b 0a 20 20 6d 65 6d 63 70 79 28 7a 45 78 74 72  ;.  memcpy(zExtr
ce00: 61 2c 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d  a, pIdx->aiColum
ce10: 6e 2c 20 73 69 7a 65 6f 66 28 69 31 36 29 2a 70  n, sizeof(i16)*p
ce20: 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 29 3b 0a 20  Idx->nColumn);. 
ce30: 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 20   pIdx->aiColumn 
ce40: 3d 20 28 69 31 36 2a 29 7a 45 78 74 72 61 3b 0a  = (i16*)zExtra;.
ce50: 20 20 7a 45 78 74 72 61 20 2b 3d 20 73 69 7a 65    zExtra += size
ce60: 6f 66 28 69 31 36 29 2a 4e 3b 0a 20 20 6d 65 6d  of(i16)*N;.  mem
ce70: 63 70 79 28 7a 45 78 74 72 61 2c 20 70 49 64 78  cpy(zExtra, pIdx
ce80: 2d 3e 61 53 6f 72 74 4f 72 64 65 72 2c 20 70 49  ->aSortOrder, pI
ce90: 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20  dx->nColumn);.  
cea0: 70 49 64 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72  pIdx->aSortOrder
ceb0: 20 3d 20 28 75 38 2a 29 7a 45 78 74 72 61 3b 0a   = (u8*)zExtra;.
cec0: 20 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 20    pIdx->nColumn 
ced0: 3d 20 4e 3b 0a 20 20 70 49 64 78 2d 3e 69 73 52  = N;.  pIdx->isR
cee0: 65 73 69 7a 65 64 20 3d 20 31 3b 0a 20 20 72 65  esized = 1;.  re
cef0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
cf00: 7d 0a 0a 2f 2a 0a 2a 2a 20 45 73 74 69 6d 61 74  }../*.** Estimat
cf10: 65 20 74 68 65 20 74 6f 74 61 6c 20 72 6f 77 20  e the total row 
cf20: 77 69 64 74 68 20 66 6f 72 20 61 20 74 61 62 6c  width for a tabl
cf30: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
cf40: 64 20 65 73 74 69 6d 61 74 65 54 61 62 6c 65 57  d estimateTableW
cf50: 69 64 74 68 28 54 61 62 6c 65 20 2a 70 54 61 62  idth(Table *pTab
cf60: 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 77 54  ){.  unsigned wT
cf70: 61 62 6c 65 20 3d 20 30 3b 0a 20 20 63 6f 6e 73  able = 0;.  cons
cf80: 74 20 43 6f 6c 75 6d 6e 20 2a 70 54 61 62 43 6f  t Column *pTabCo
cf90: 6c 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f  l;.  int i;.  fo
cfa0: 72 28 69 3d 70 54 61 62 2d 3e 6e 43 6f 6c 2c 20  r(i=pTab->nCol, 
cfb0: 70 54 61 62 43 6f 6c 3d 70 54 61 62 2d 3e 61 43  pTabCol=pTab->aC
cfc0: 6f 6c 3b 20 69 3e 30 3b 20 69 2d 2d 2c 20 70 54  ol; i>0; i--, pT
cfd0: 61 62 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 77 54  abCol++){.    wT
cfe0: 61 62 6c 65 20 2b 3d 20 70 54 61 62 43 6f 6c 2d  able += pTabCol-
cff0: 3e 73 7a 45 73 74 3b 0a 20 20 7d 0a 20 20 69 66  >szEst;.  }.  if
d000: 28 20 70 54 61 62 2d 3e 69 50 4b 65 79 3c 30 20  ( pTab->iPKey<0 
d010: 29 20 77 54 61 62 6c 65 2b 2b 3b 0a 20 20 70 54  ) wTable++;.  pT
d020: 61 62 2d 3e 73 7a 54 61 62 52 6f 77 20 3d 20 73  ab->szTabRow = s
d030: 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 77 54 61  qlite3LogEst(wTa
d040: 62 6c 65 2a 34 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ble*4);.}../*.**
d050: 20 45 73 74 69 6d 61 74 65 20 74 68 65 20 61 76   Estimate the av
d060: 65 72 61 67 65 20 73 69 7a 65 20 6f 66 20 61 20  erage size of a 
d070: 72 6f 77 20 66 6f 72 20 61 6e 20 69 6e 64 65 78  row for an index
d080: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
d090: 20 65 73 74 69 6d 61 74 65 49 6e 64 65 78 57 69   estimateIndexWi
d0a0: 64 74 68 28 49 6e 64 65 78 20 2a 70 49 64 78 29  dth(Index *pIdx)
d0b0: 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 77 49 6e  {.  unsigned wIn
d0c0: 64 65 78 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69  dex = 0;.  int i
d0d0: 3b 0a 20 20 63 6f 6e 73 74 20 43 6f 6c 75 6d 6e  ;.  const Column
d0e0: 20 2a 61 43 6f 6c 20 3d 20 70 49 64 78 2d 3e 70   *aCol = pIdx->p
d0f0: 54 61 62 6c 65 2d 3e 61 43 6f 6c 3b 0a 20 20 66  Table->aCol;.  f
d100: 6f 72 28 69 3d 30 3b 20 69 3c 70 49 64 78 2d 3e  or(i=0; i<pIdx->
d110: 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20  nColumn; i++){. 
d120: 20 20 20 69 31 36 20 78 20 3d 20 70 49 64 78 2d     i16 x = pIdx-
d130: 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 3b 0a 20 20  >aiColumn[i];.  
d140: 20 20 61 73 73 65 72 74 28 20 78 3c 70 49 64 78    assert( x<pIdx
d150: 2d 3e 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 29  ->pTable->nCol )
d160: 3b 0a 20 20 20 20 77 49 6e 64 65 78 20 2b 3d 20  ;.    wIndex += 
d170: 78 3c 30 20 3f 20 31 20 3a 20 61 43 6f 6c 5b 70  x<0 ? 1 : aCol[p
d180: 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d  Idx->aiColumn[i]
d190: 5d 2e 73 7a 45 73 74 3b 0a 20 20 7d 0a 20 20 70  ].szEst;.  }.  p
d1a0: 49 64 78 2d 3e 73 7a 49 64 78 52 6f 77 20 3d 20  Idx->szIdxRow = 
d1b0: 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 77 49  sqlite3LogEst(wI
d1c0: 6e 64 65 78 2a 34 29 3b 0a 7d 0a 0a 2f 2a 20 52  ndex*4);.}../* R
d1d0: 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 76 61  eturn true if va
d1e0: 6c 75 65 20 78 20 69 73 20 66 6f 75 6e 64 20 61  lue x is found a
d1f0: 6e 79 20 6f 66 20 74 68 65 20 66 69 72 73 74 20  ny of the first 
d200: 6e 43 6f 6c 20 65 6e 74 72 69 65 73 20 6f 66 20  nCol entries of 
d210: 61 69 43 6f 6c 5b 5d 0a 2a 2f 0a 73 74 61 74 69  aiCol[].*/.stati
d220: 63 20 69 6e 74 20 68 61 73 43 6f 6c 75 6d 6e 28  c int hasColumn(
d230: 63 6f 6e 73 74 20 69 31 36 20 2a 61 69 43 6f 6c  const i16 *aiCol
d240: 2c 20 69 6e 74 20 6e 43 6f 6c 2c 20 69 6e 74 20  , int nCol, int 
d250: 78 29 7b 0a 20 20 77 68 69 6c 65 28 20 6e 43 6f  x){.  while( nCo
d260: 6c 2d 2d 20 3e 20 30 20 29 20 69 66 28 20 78 3d  l-- > 0 ) if( x=
d270: 3d 2a 28 61 69 43 6f 6c 2b 2b 29 20 29 20 72 65  =*(aiCol++) ) re
d280: 74 75 72 6e 20 31 3b 0a 20 20 72 65 74 75 72 6e  turn 1;.  return
d290: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69   0;.}../*.** Thi
d2a0: 73 20 72 6f 75 74 69 6e 65 20 72 75 6e 73 20 61  s routine runs a
d2b0: 74 20 74 68 65 20 65 6e 64 20 6f 66 20 70 61 72  t the end of par
d2c0: 73 69 6e 67 20 61 20 43 52 45 41 54 45 20 54 41  sing a CREATE TA
d2d0: 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 20 74 68  BLE statement th
d2e0: 61 74 0a 2a 2a 20 68 61 73 20 61 20 57 49 54 48  at.** has a WITH
d2f0: 4f 55 54 20 52 4f 57 49 44 20 63 6c 61 75 73 65  OUT ROWID clause
d300: 2e 20 20 54 68 65 20 6a 6f 62 20 6f 66 20 74 68  .  The job of th
d310: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 74 6f  is routine is to
d320: 20 63 6f 6e 76 65 72 74 20 62 6f 74 68 0a 2a 2a   convert both.**
d330: 20 69 6e 74 65 72 6e 61 6c 20 73 63 68 65 6d 61   internal schema
d340: 20 64 61 74 61 20 73 74 72 75 63 74 75 72 65 73   data structures
d350: 20 61 6e 64 20 74 68 65 20 67 65 6e 65 72 61 74   and the generat
d360: 65 64 20 56 44 42 45 20 63 6f 64 65 20 73 6f 20  ed VDBE code so 
d370: 74 68 61 74 20 74 68 65 79 0a 2a 2a 20 61 72 65  that they.** are
d380: 20 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72   appropriate for
d390: 20 61 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44   a WITHOUT ROWID
d3a0: 20 74 61 62 6c 65 20 69 6e 73 74 65 61 64 20 6f   table instead o
d3b0: 66 20 61 20 72 6f 77 69 64 20 74 61 62 6c 65 2e  f a rowid table.
d3c0: 0a 2a 2a 20 43 68 61 6e 67 65 73 20 69 6e 63 6c  .** Changes incl
d3d0: 75 64 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28  ude:.**.**     (
d3e0: 31 29 20 20 43 6f 6e 76 65 72 74 20 74 68 65 20  1)  Convert the 
d3f0: 4f 50 5f 43 72 65 61 74 65 54 61 62 6c 65 20 69  OP_CreateTable i
d400: 6e 74 6f 20 61 6e 20 4f 50 5f 43 72 65 61 74 65  nto an OP_Create
d410: 49 6e 64 65 78 2e 20 20 54 68 65 72 65 20 69 73  Index.  There is
d420: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 6e 6f 20  .**          no 
d430: 72 6f 77 69 64 20 62 74 72 65 65 20 66 6f 72 20  rowid btree for 
d440: 61 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 2e  a WITHOUT ROWID.
d450: 20 20 49 6e 73 74 65 61 64 2c 20 74 68 65 20 63    Instead, the c
d460: 61 6e 6f 6e 69 63 61 6c 0a 2a 2a 20 20 20 20 20  anonical.**     
d470: 20 20 20 20 20 64 61 74 61 20 73 74 6f 72 61 67       data storag
d480: 65 20 69 73 20 61 20 63 6f 76 65 72 69 6e 67 20  e is a covering 
d490: 69 6e 64 65 78 20 62 74 72 65 65 2e 0a 2a 2a 20  index btree..** 
d4a0: 20 20 20 20 28 32 29 20 20 42 79 70 61 73 73 20      (2)  Bypass 
d4b0: 74 68 65 20 63 72 65 61 74 69 6f 6e 20 6f 66 20  the creation of 
d4c0: 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  the sqlite_maste
d4d0: 72 20 74 61 62 6c 65 20 65 6e 74 72 79 0a 2a 2a  r table entry.**
d4e0: 20 20 20 20 20 20 20 20 20 20 66 6f 72 20 74 68            for th
d4f0: 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 61 73  e PRIMARY KEY as
d500: 20 74 68 65 20 70 72 69 6d 61 72 79 20 6b 65 79   the primary key
d510: 20 69 6e 64 65 78 20 69 73 20 6e 6f 77 0a 2a 2a   index is now.**
d520: 20 20 20 20 20 20 20 20 20 20 69 64 65 6e 74 69            identi
d530: 66 69 65 64 20 62 79 20 74 68 65 20 73 71 6c 69  fied by the sqli
d540: 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20  te_master table 
d550: 65 6e 74 72 79 20 6f 66 20 74 68 65 20 74 61 62  entry of the tab
d560: 6c 65 20 69 74 73 65 6c 66 2e 0a 2a 2a 20 20 20  le itself..**   
d570: 20 20 28 33 29 20 20 53 65 74 20 74 68 65 20 49    (3)  Set the I
d580: 6e 64 65 78 2e 74 6e 75 6d 20 6f 66 20 74 68 65  ndex.tnum of the
d590: 20 50 52 49 4d 41 52 59 20 4b 45 59 20 49 6e 64   PRIMARY KEY Ind
d5a0: 65 78 20 6f 62 6a 65 63 74 20 69 6e 20 74 68 65  ex object in the
d5b0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 73 63 68  .**          sch
d5c0: 65 6d 61 20 74 6f 20 74 68 65 20 72 6f 6f 74 70  ema to the rootp
d5d0: 61 67 65 20 66 72 6f 6d 20 74 68 65 20 6d 61 69  age from the mai
d5e0: 6e 20 74 61 62 6c 65 2e 0a 2a 2a 20 20 20 20 20  n table..**     
d5f0: 28 34 29 20 20 53 65 74 20 61 6c 6c 20 63 6f 6c  (4)  Set all col
d600: 75 6d 6e 73 20 6f 66 20 74 68 65 20 50 52 49 4d  umns of the PRIM
d610: 41 52 59 20 4b 45 59 20 73 63 68 65 6d 61 20 6f  ARY KEY schema o
d620: 62 6a 65 63 74 20 74 6f 20 62 65 20 4e 4f 54 20  bject to be NOT 
d630: 4e 55 4c 4c 2e 0a 2a 2a 20 20 20 20 20 28 35 29  NULL..**     (5)
d640: 20 20 41 64 64 20 61 6c 6c 20 74 61 62 6c 65 20    Add all table 
d650: 63 6f 6c 75 6d 6e 73 20 74 6f 20 74 68 65 20 50  columns to the P
d660: 52 49 4d 41 52 59 20 4b 45 59 20 49 6e 64 65 78  RIMARY KEY Index
d670: 20 6f 62 6a 65 63 74 0a 2a 2a 20 20 20 20 20 20   object.**      
d680: 20 20 20 20 73 6f 20 74 68 61 74 20 74 68 65 20      so that the 
d690: 50 52 49 4d 41 52 59 20 4b 45 59 20 69 73 20 61  PRIMARY KEY is a
d6a0: 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 2e   covering index.
d6b0: 20 20 54 68 65 20 73 75 72 70 6c 75 73 0a 2a 2a    The surplus.**
d6c0: 20 20 20 20 20 20 20 20 20 20 63 6f 6c 75 6d 6e            column
d6d0: 73 20 61 72 65 20 70 61 72 74 20 6f 66 20 4b 65  s are part of Ke
d6e0: 79 49 6e 66 6f 2e 6e 58 46 69 65 6c 64 20 61 6e  yInfo.nXField an
d6f0: 64 20 61 72 65 20 6e 6f 74 20 75 73 65 64 20 66  d are not used f
d700: 6f 72 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 73  or.**          s
d710: 6f 72 74 69 6e 67 20 6f 72 20 6c 6f 6f 6b 75 70  orting or lookup
d720: 20 6f 72 20 75 6e 69 71 75 65 6e 65 73 73 20 63   or uniqueness c
d730: 68 65 63 6b 73 2e 0a 2a 2a 20 20 20 20 20 28 36  hecks..**     (6
d740: 29 20 20 52 65 70 6c 61 63 65 20 74 68 65 20 72  )  Replace the r
d750: 6f 77 69 64 20 74 61 69 6c 20 6f 6e 20 61 6c 6c  owid tail on all
d760: 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 67   automatically g
d770: 65 6e 65 72 61 74 65 64 20 55 4e 49 51 55 45 0a  enerated UNIQUE.
d780: 2a 2a 20 20 20 20 20 20 20 20 20 20 69 6e 64 69  **          indi
d790: 63 65 73 20 77 69 74 68 20 74 68 65 20 50 52 49  ces with the PRI
d7a0: 4d 41 52 59 20 4b 45 59 20 63 6f 6c 75 6d 6e 73  MARY KEY columns
d7b0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
d7c0: 20 63 6f 6e 76 65 72 74 54 6f 57 69 74 68 6f 75   convertToWithou
d7d0: 74 52 6f 77 69 64 54 61 62 6c 65 28 50 61 72 73  tRowidTable(Pars
d7e0: 65 20 2a 70 50 61 72 73 65 2c 20 54 61 62 6c 65  e *pParse, Table
d7f0: 20 2a 70 54 61 62 29 7b 0a 20 20 49 6e 64 65 78   *pTab){.  Index
d800: 20 2a 70 49 64 78 3b 0a 20 20 49 6e 64 65 78 20   *pIdx;.  Index 
d810: 2a 70 50 6b 3b 0a 20 20 69 6e 74 20 6e 50 6b 3b  *pPk;.  int nPk;
d820: 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 73  .  int i, j;.  s
d830: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
d840: 72 73 65 2d 3e 64 62 3b 0a 20 20 56 64 62 65 20  rse->db;.  Vdbe 
d850: 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
d860: 62 65 3b 0a 0a 20 20 2f 2a 20 43 6f 6e 76 65 72  be;..  /* Conver
d870: 74 20 74 68 65 20 4f 50 5f 43 72 65 61 74 65 54  t the OP_CreateT
d880: 61 62 6c 65 20 6f 70 63 6f 64 65 20 74 68 61 74  able opcode that
d890: 20 77 6f 75 6c 64 20 6e 6f 72 6d 61 6c 6c 79 20   would normally 
d8a0: 63 72 65 61 74 65 20 74 68 65 0a 20 20 2a 2a 20  create the.  ** 
d8b0: 72 6f 6f 74 2d 70 61 67 65 20 66 6f 72 20 74 68  root-page for th
d8c0: 65 20 74 61 62 6c 65 20 69 6e 74 6f 20 61 6e 20  e table into an 
d8d0: 4f 50 5f 43 72 65 61 74 65 49 6e 64 65 78 20 6f  OP_CreateIndex o
d8e0: 70 63 6f 64 65 2e 20 20 54 68 65 20 69 6e 64 65  pcode.  The inde
d8f0: 78 0a 20 20 2a 2a 20 63 72 65 61 74 65 64 20 77  x.  ** created w
d900: 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65 20 50  ill become the P
d910: 52 49 4d 41 52 59 20 4b 45 59 20 69 6e 64 65 78  RIMARY KEY index
d920: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61  ..  */.  if( pPa
d930: 72 73 65 2d 3e 61 64 64 72 43 72 54 61 62 20 29  rse->addrCrTab )
d940: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 76 20  {.    assert( v 
d950: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
d960: 62 65 43 68 61 6e 67 65 4f 70 63 6f 64 65 28 76  beChangeOpcode(v
d970: 2c 20 70 50 61 72 73 65 2d 3e 61 64 64 72 43 72  , pParse->addrCr
d980: 54 61 62 2c 20 4f 50 5f 43 72 65 61 74 65 49 6e  Tab, OP_CreateIn
d990: 64 65 78 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  dex);.  }..  /* 
d9a0: 4c 6f 63 61 74 65 20 74 68 65 20 50 52 49 4d 41  Locate the PRIMA
d9b0: 52 59 20 4b 45 59 20 69 6e 64 65 78 2e 20 20 4f  RY KEY index.  O
d9c0: 72 2c 20 69 66 20 74 68 69 73 20 74 61 62 6c 65  r, if this table
d9d0: 20 77 61 73 20 6f 72 69 67 69 6e 61 6c 6c 79 0a   was originally.
d9e0: 20 20 2a 2a 20 61 6e 20 49 4e 54 45 47 45 52 20    ** an INTEGER 
d9f0: 50 52 49 4d 41 52 59 20 4b 45 59 20 74 61 62 6c  PRIMARY KEY tabl
da00: 65 2c 20 63 72 65 61 74 65 20 61 20 6e 65 77 20  e, create a new 
da10: 50 52 49 4d 41 52 59 20 4b 45 59 20 69 6e 64 65  PRIMARY KEY inde
da20: 78 2e 20 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  x. .  */.  if( p
da30: 54 61 62 2d 3e 69 50 4b 65 79 3e 3d 30 20 29 7b  Tab->iPKey>=0 ){
da40: 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70  .    ExprList *p
da50: 4c 69 73 74 3b 0a 20 20 20 20 54 6f 6b 65 6e 20  List;.    Token 
da60: 69 70 6b 54 6f 6b 65 6e 3b 0a 20 20 20 20 73 71  ipkToken;.    sq
da70: 6c 69 74 65 33 54 6f 6b 65 6e 49 6e 69 74 28 26  lite3TokenInit(&
da80: 69 70 6b 54 6f 6b 65 6e 2c 20 70 54 61 62 2d 3e  ipkToken, pTab->
da90: 61 43 6f 6c 5b 70 54 61 62 2d 3e 69 50 4b 65 79  aCol[pTab->iPKey
daa0: 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70 4c  ].zName);.    pL
dab0: 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ist = sqlite3Exp
dac0: 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61 72  rListAppend(pPar
dad0: 73 65 2c 20 30 2c 20 0a 20 20 20 20 20 20 20 20  se, 0, .        
dae0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
daf0: 33 45 78 70 72 41 6c 6c 6f 63 28 64 62 2c 20 54  3ExprAlloc(db, T
db00: 4b 5f 49 44 2c 20 26 69 70 6b 54 6f 6b 65 6e 2c  K_ID, &ipkToken,
db10: 20 30 29 29 3b 0a 20 20 20 20 69 66 28 20 70 4c   0));.    if( pL
db20: 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ist==0 ) return;
db30: 0a 20 20 20 20 70 4c 69 73 74 2d 3e 61 5b 30 5d  .    pList->a[0]
db40: 2e 73 6f 72 74 4f 72 64 65 72 20 3d 20 70 50 61  .sortOrder = pPa
db50: 72 73 65 2d 3e 69 50 6b 53 6f 72 74 4f 72 64 65  rse->iPkSortOrde
db60: 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  r;.    assert( p
db70: 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
db80: 3d 3d 70 54 61 62 20 29 3b 0a 20 20 20 20 70 50  ==pTab );.    pP
db90: 6b 20 3d 20 73 71 6c 69 74 65 33 43 72 65 61 74  k = sqlite3Creat
dba0: 65 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 30  eIndex(pParse, 0
dbb0: 2c 20 30 2c 20 30 2c 20 70 4c 69 73 74 2c 20 70  , 0, 0, pList, p
dbc0: 54 61 62 2d 3e 6b 65 79 43 6f 6e 66 2c 20 30 2c  Tab->keyConf, 0,
dbd0: 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 69   0, 0, 0);.    i
dbe0: 66 28 20 70 50 6b 3d 3d 30 20 29 20 72 65 74 75  f( pPk==0 ) retu
dbf0: 72 6e 3b 0a 20 20 20 20 70 50 6b 2d 3e 69 64 78  rn;.    pPk->idx
dc00: 54 79 70 65 20 3d 20 53 51 4c 49 54 45 5f 49 44  Type = SQLITE_ID
dc10: 58 54 59 50 45 5f 50 52 49 4d 41 52 59 4b 45 59  XTYPE_PRIMARYKEY
dc20: 3b 0a 20 20 20 20 70 54 61 62 2d 3e 69 50 4b 65  ;.    pTab->iPKe
dc30: 79 20 3d 20 2d 31 3b 0a 20 20 7d 65 6c 73 65 7b  y = -1;.  }else{
dc40: 0a 20 20 20 20 70 50 6b 20 3d 20 73 71 6c 69 74  .    pPk = sqlit
dc50: 65 33 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65  e3PrimaryKeyInde
dc60: 78 28 70 54 61 62 29 3b 0a 0a 20 20 20 20 2f 2a  x(pTab);..    /*
dc70: 20 42 79 70 61 73 73 20 74 68 65 20 63 72 65 61   Bypass the crea
dc80: 74 69 6f 6e 20 6f 66 20 74 68 65 20 50 52 49 4d  tion of the PRIM
dc90: 41 52 59 20 4b 45 59 20 62 74 72 65 65 20 61 6e  ARY KEY btree an
dca0: 64 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73  d the sqlite_mas
dcb0: 74 65 72 0a 20 20 20 20 2a 2a 20 74 61 62 6c 65  ter.    ** table
dcc0: 20 65 6e 74 72 79 2e 20 54 68 69 73 20 69 73 20   entry. This is 
dcd0: 6f 6e 6c 79 20 72 65 71 75 69 72 65 64 20 69 66  only required if
dce0: 20 63 75 72 72 65 6e 74 6c 79 20 67 65 6e 65 72   currently gener
dcf0: 61 74 69 6e 67 20 56 44 42 45 0a 20 20 20 20 2a  ating VDBE.    *
dd00: 2a 20 63 6f 64 65 20 66 6f 72 20 61 20 43 52 45  * code for a CRE
dd10: 41 54 45 20 54 41 42 4c 45 20 28 6e 6f 74 20 77  ATE TABLE (not w
dd20: 68 65 6e 20 70 61 72 73 69 6e 67 20 6f 6e 65 20  hen parsing one 
dd30: 61 73 20 70 61 72 74 20 6f 66 20 72 65 61 64 69  as part of readi
dd40: 6e 67 0a 20 20 20 20 2a 2a 20 61 20 64 61 74 61  ng.    ** a data
dd50: 62 61 73 65 20 73 63 68 65 6d 61 29 2e 20 20 2a  base schema).  *
dd60: 2f 0a 20 20 20 20 69 66 28 20 76 20 29 7b 0a 20  /.    if( v ){. 
dd70: 20 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d       assert( db-
dd80: 3e 69 6e 69 74 2e 62 75 73 79 3d 3d 30 20 29 3b  >init.busy==0 );
dd90: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
dda0: 62 65 43 68 61 6e 67 65 4f 70 63 6f 64 65 28 76  beChangeOpcode(v
ddb0: 2c 20 70 50 6b 2d 3e 74 6e 75 6d 2c 20 4f 50 5f  , pPk->tnum, OP_
ddc0: 47 6f 74 6f 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  Goto);.    }..  
ddd0: 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 52 65 6d 6f    /*.    ** Remo
dde0: 76 65 20 61 6c 6c 20 72 65 64 75 6e 64 61 6e 74  ve all redundant
ddf0: 20 63 6f 6c 75 6d 6e 73 20 66 72 6f 6d 20 74 68   columns from th
de00: 65 20 50 52 49 4d 41 52 59 20 4b 45 59 2e 20 20  e PRIMARY KEY.  
de10: 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 63 68 61  For example, cha
de20: 6e 67 65 0a 20 20 20 20 2a 2a 20 22 50 52 49 4d  nge.    ** "PRIM
de30: 41 52 59 20 4b 45 59 28 61 2c 62 2c 61 2c 62 2c  ARY KEY(a,b,a,b,
de40: 63 2c 62 2c 63 2c 64 29 22 20 69 6e 74 6f 20 6a  c,b,c,d)" into j
de50: 75 73 74 20 22 50 52 49 4d 41 52 59 20 4b 45 59  ust "PRIMARY KEY
de60: 28 61 2c 62 2c 63 2c 64 29 22 2e 20 20 4c 61 74  (a,b,c,d)".  Lat
de70: 65 72 0a 20 20 20 20 2a 2a 20 63 6f 64 65 20 61  er.    ** code a
de80: 73 73 75 6d 65 73 20 74 68 65 20 50 52 49 4d 41  ssumes the PRIMA
de90: 52 59 20 4b 45 59 20 63 6f 6e 74 61 69 6e 73 20  RY KEY contains 
dea0: 6e 6f 20 72 65 70 65 61 74 65 64 20 63 6f 6c 75  no repeated colu
deb0: 6d 6e 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  mns..    */.    
dec0: 66 6f 72 28 69 3d 6a 3d 31 3b 20 69 3c 70 50 6b  for(i=j=1; i<pPk
ded0: 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 69 2b 2b 29 7b  ->nKeyCol; i++){
dee0: 0a 20 20 20 20 20 20 69 66 28 20 68 61 73 43 6f  .      if( hasCo
def0: 6c 75 6d 6e 28 70 50 6b 2d 3e 61 69 43 6f 6c 75  lumn(pPk->aiColu
df00: 6d 6e 2c 20 6a 2c 20 70 50 6b 2d 3e 61 69 43 6f  mn, j, pPk->aiCo
df10: 6c 75 6d 6e 5b 69 5d 29 20 29 7b 0a 20 20 20 20  lumn[i]) ){.    
df20: 20 20 20 20 70 50 6b 2d 3e 6e 43 6f 6c 75 6d 6e      pPk->nColumn
df30: 2d 2d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  --;.      }else{
df40: 0a 20 20 20 20 20 20 20 20 70 50 6b 2d 3e 61 69  .        pPk->ai
df50: 43 6f 6c 75 6d 6e 5b 6a 2b 2b 5d 20 3d 20 70 50  Column[j++] = pP
df60: 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 3b 0a  k->aiColumn[i];.
df70: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
df80: 20 20 70 50 6b 2d 3e 6e 4b 65 79 43 6f 6c 20 3d    pPk->nKeyCol =
df90: 20 6a 3b 0a 20 20 7d 0a 20 20 70 50 6b 2d 3e 69   j;.  }.  pPk->i
dfa0: 73 43 6f 76 65 72 69 6e 67 20 3d 20 31 3b 0a 20  sCovering = 1;. 
dfb0: 20 61 73 73 65 72 74 28 20 70 50 6b 21 3d 30 20   assert( pPk!=0 
dfc0: 29 3b 0a 20 20 6e 50 6b 20 3d 20 70 50 6b 2d 3e  );.  nPk = pPk->
dfd0: 6e 4b 65 79 43 6f 6c 3b 0a 0a 20 20 2f 2a 20 4d  nKeyCol;..  /* M
dfe0: 61 6b 65 20 73 75 72 65 20 65 76 65 72 79 20 63  ake sure every c
dff0: 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 50 52 49  olumn of the PRI
e000: 4d 41 52 59 20 4b 45 59 20 69 73 20 4e 4f 54 20  MARY KEY is NOT 
e010: 4e 55 4c 4c 2e 20 20 28 45 78 63 65 70 74 2c 0a  NULL.  (Except,.
e020: 20 20 2a 2a 20 64 6f 20 6e 6f 74 20 65 6e 66 6f    ** do not enfo
e030: 72 63 65 20 74 68 69 73 20 66 6f 72 20 69 6d 70  rce this for imp
e040: 6f 73 74 65 72 20 74 61 62 6c 65 73 2e 29 20 2a  oster tables.) *
e050: 2f 0a 20 20 69 66 28 20 21 64 62 2d 3e 69 6e 69  /.  if( !db->ini
e060: 74 2e 69 6d 70 6f 73 74 65 72 54 61 62 6c 65 20  t.imposterTable 
e070: 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  ){.    for(i=0; 
e080: 69 3c 6e 50 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20  i<nPk; i++){.   
e090: 20 20 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 50     pTab->aCol[pP
e0a0: 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 5d 2e  k->aiColumn[i]].
e0b0: 6e 6f 74 4e 75 6c 6c 20 3d 20 4f 45 5f 41 62 6f  notNull = OE_Abo
e0c0: 72 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50  rt;.    }.    pP
e0d0: 6b 2d 3e 75 6e 69 71 4e 6f 74 4e 75 6c 6c 20 3d  k->uniqNotNull =
e0e0: 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68   1;.  }..  /* Th
e0f0: 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 74  e root page of t
e100: 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 69  he PRIMARY KEY i
e110: 73 20 74 68 65 20 74 61 62 6c 65 20 72 6f 6f 74  s the table root
e120: 20 70 61 67 65 20 2a 2f 0a 20 20 70 50 6b 2d 3e   page */.  pPk->
e130: 74 6e 75 6d 20 3d 20 70 54 61 62 2d 3e 74 6e 75  tnum = pTab->tnu
e140: 6d 3b 0a 0a 20 20 2f 2a 20 55 70 64 61 74 65 20  m;..  /* Update 
e150: 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 72 65  the in-memory re
e160: 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20  presentation of 
e170: 61 6c 6c 20 55 4e 49 51 55 45 20 69 6e 64 69 63  all UNIQUE indic
e180: 65 73 20 62 79 20 63 6f 6e 76 65 72 74 69 6e 67  es by converting
e190: 0a 20 20 2a 2a 20 74 68 65 20 66 69 6e 61 6c 20  .  ** the final 
e1a0: 72 6f 77 69 64 20 63 6f 6c 75 6d 6e 20 69 6e 74  rowid column int
e1b0: 6f 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 63 6f  o one or more co
e1c0: 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 50 52 49  lumns of the PRI
e1d0: 4d 41 52 59 20 4b 45 59 2e 0a 20 20 2a 2f 0a 20  MARY KEY..  */. 
e1e0: 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e   for(pIdx=pTab->
e1f0: 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49  pIndex; pIdx; pI
e200: 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b  dx=pIdx->pNext){
e210: 0a 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20  .    int n;.    
e220: 69 66 28 20 49 73 50 72 69 6d 61 72 79 4b 65 79  if( IsPrimaryKey
e230: 49 6e 64 65 78 28 70 49 64 78 29 20 29 20 63 6f  Index(pIdx) ) co
e240: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 66 6f 72 28  ntinue;.    for(
e250: 69 3d 6e 3d 30 3b 20 69 3c 6e 50 6b 3b 20 69 2b  i=n=0; i<nPk; i+
e260: 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 21 68  +){.      if( !h
e270: 61 73 43 6f 6c 75 6d 6e 28 70 49 64 78 2d 3e 61  asColumn(pIdx->a
e280: 69 43 6f 6c 75 6d 6e 2c 20 70 49 64 78 2d 3e 6e  iColumn, pIdx->n
e290: 4b 65 79 43 6f 6c 2c 20 70 50 6b 2d 3e 61 69 43  KeyCol, pPk->aiC
e2a0: 6f 6c 75 6d 6e 5b 69 5d 29 20 29 20 6e 2b 2b 3b  olumn[i]) ) n++;
e2b0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e  .    }.    if( n
e2c0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ==0 ){.      /* 
e2d0: 54 68 69 73 20 69 6e 64 65 78 20 69 73 20 61 20  This index is a 
e2e0: 73 75 70 65 72 73 65 74 20 6f 66 20 74 68 65 20  superset of the 
e2f0: 70 72 69 6d 61 72 79 20 6b 65 79 20 2a 2f 0a 20  primary key */. 
e300: 20 20 20 20 20 70 49 64 78 2d 3e 6e 43 6f 6c 75       pIdx->nColu
e310: 6d 6e 20 3d 20 70 49 64 78 2d 3e 6e 4b 65 79 43  mn = pIdx->nKeyC
e320: 6f 6c 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e  ol;.      contin
e330: 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ue;.    }.    if
e340: 28 20 72 65 73 69 7a 65 49 6e 64 65 78 4f 62 6a  ( resizeIndexObj
e350: 65 63 74 28 64 62 2c 20 70 49 64 78 2c 20 70 49  ect(db, pIdx, pI
e360: 64 78 2d 3e 6e 4b 65 79 43 6f 6c 2b 6e 29 20 29  dx->nKeyCol+n) )
e370: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 66 6f 72   return;.    for
e380: 28 69 3d 30 2c 20 6a 3d 70 49 64 78 2d 3e 6e 4b  (i=0, j=pIdx->nK
e390: 65 79 43 6f 6c 3b 20 69 3c 6e 50 6b 3b 20 69 2b  eyCol; i<nPk; i+
e3a0: 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 21 68  +){.      if( !h
e3b0: 61 73 43 6f 6c 75 6d 6e 28 70 49 64 78 2d 3e 61  asColumn(pIdx->a
e3c0: 69 43 6f 6c 75 6d 6e 2c 20 70 49 64 78 2d 3e 6e  iColumn, pIdx->n
e3d0: 4b 65 79 43 6f 6c 2c 20 70 50 6b 2d 3e 61 69 43  KeyCol, pPk->aiC
e3e0: 6f 6c 75 6d 6e 5b 69 5d 29 20 29 7b 0a 20 20 20  olumn[i]) ){.   
e3f0: 20 20 20 20 20 70 49 64 78 2d 3e 61 69 43 6f 6c       pIdx->aiCol
e400: 75 6d 6e 5b 6a 5d 20 3d 20 70 50 6b 2d 3e 61 69  umn[j] = pPk->ai
e410: 43 6f 6c 75 6d 6e 5b 69 5d 3b 0a 20 20 20 20 20  Column[i];.     
e420: 20 20 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b     pIdx->azColl[
e430: 6a 5d 20 3d 20 70 50 6b 2d 3e 61 7a 43 6f 6c 6c  j] = pPk->azColl
e440: 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 6a 2b 2b  [i];.        j++
e450: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
e460: 20 20 20 20 61 73 73 65 72 74 28 20 70 49 64 78      assert( pIdx
e470: 2d 3e 6e 43 6f 6c 75 6d 6e 3e 3d 70 49 64 78 2d  ->nColumn>=pIdx-
e480: 3e 6e 4b 65 79 43 6f 6c 2b 6e 20 29 3b 0a 20 20  >nKeyCol+n );.  
e490: 20 20 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e    assert( pIdx->
e4a0: 6e 43 6f 6c 75 6d 6e 3e 3d 6a 20 29 3b 0a 20 20  nColumn>=j );.  
e4b0: 7d 0a 0a 20 20 2f 2a 20 41 64 64 20 61 6c 6c 20  }..  /* Add all 
e4c0: 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 73 20 74 6f  table columns to
e4d0: 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59   the PRIMARY KEY
e4e0: 20 69 6e 64 65 78 0a 20 20 2a 2f 0a 20 20 69 66   index.  */.  if
e4f0: 28 20 6e 50 6b 3c 70 54 61 62 2d 3e 6e 43 6f 6c  ( nPk<pTab->nCol
e500: 20 29 7b 0a 20 20 20 20 69 66 28 20 72 65 73 69   ){.    if( resi
e510: 7a 65 49 6e 64 65 78 4f 62 6a 65 63 74 28 64 62  zeIndexObject(db
e520: 2c 20 70 50 6b 2c 20 70 54 61 62 2d 3e 6e 43 6f  , pPk, pTab->nCo
e530: 6c 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20  l) ) return;.   
e540: 20 66 6f 72 28 69 3d 30 2c 20 6a 3d 6e 50 6b 3b   for(i=0, j=nPk;
e550: 20 69 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69   i<pTab->nCol; i
e560: 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 21  ++){.      if( !
e570: 68 61 73 43 6f 6c 75 6d 6e 28 70 50 6b 2d 3e 61  hasColumn(pPk->a
e580: 69 43 6f 6c 75 6d 6e 2c 20 6a 2c 20 69 29 20 29  iColumn, j, i) )
e590: 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
e5a0: 28 20 6a 3c 70 50 6b 2d 3e 6e 43 6f 6c 75 6d 6e  ( j<pPk->nColumn
e5b0: 20 29 3b 0a 20 20 20 20 20 20 20 20 70 50 6b 2d   );.        pPk-
e5c0: 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 20 3d 20 69  >aiColumn[j] = i
e5d0: 3b 0a 20 20 20 20 20 20 20 20 70 50 6b 2d 3e 61  ;.        pPk->a
e5e0: 7a 43 6f 6c 6c 5b 6a 5d 20 3d 20 73 71 6c 69 74  zColl[j] = sqlit
e5f0: 65 33 53 74 72 42 49 4e 41 52 59 3b 0a 20 20 20  e3StrBINARY;.   
e600: 20 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 20 20       j++;.      
e610: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  }.    }.    asse
e620: 72 74 28 20 70 50 6b 2d 3e 6e 43 6f 6c 75 6d 6e  rt( pPk->nColumn
e630: 3d 3d 6a 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==j );.    asser
e640: 74 28 20 70 54 61 62 2d 3e 6e 43 6f 6c 3d 3d 6a  t( pTab->nCol==j
e650: 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   );.  }else{.   
e660: 20 70 50 6b 2d 3e 6e 43 6f 6c 75 6d 6e 20 3d 20   pPk->nColumn = 
e670: 70 54 61 62 2d 3e 6e 43 6f 6c 3b 0a 20 20 7d 0a  pTab->nCol;.  }.
e680: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
e690: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
e6a0: 74 6f 20 72 65 70 6f 72 74 20 74 68 65 20 66 69  to report the fi
e6b0: 6e 61 6c 20 22 29 22 20 74 68 61 74 20 74 65 72  nal ")" that ter
e6c0: 6d 69 6e 61 74 65 73 0a 2a 2a 20 61 20 43 52 45  minates.** a CRE
e6d0: 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d  ATE TABLE statem
e6e0: 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74  ent..**.** The t
e6f0: 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 74  able structure t
e700: 68 61 74 20 6f 74 68 65 72 20 61 63 74 69 6f 6e  hat other action
e710: 20 72 6f 75 74 69 6e 65 73 20 68 61 76 65 20 62   routines have b
e720: 65 65 6e 20 62 75 69 6c 64 69 6e 67 0a 2a 2a 20  een building.** 
e730: 69 73 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  is added to the 
e740: 69 6e 74 65 72 6e 61 6c 20 68 61 73 68 20 74 61  internal hash ta
e750: 62 6c 65 73 2c 20 61 73 73 75 6d 69 6e 67 20 6e  bles, assuming n
e760: 6f 20 65 72 72 6f 72 73 20 68 61 76 65 0a 2a 2a  o errors have.**
e770: 20 6f 63 63 75 72 72 65 64 2e 0a 2a 2a 0a 2a 2a   occurred..**.**
e780: 20 41 6e 20 65 6e 74 72 79 20 66 6f 72 20 74 68   An entry for th
e790: 65 20 74 61 62 6c 65 20 69 73 20 6d 61 64 65 20  e table is made 
e7a0: 69 6e 20 74 68 65 20 6d 61 73 74 65 72 20 74 61  in the master ta
e7b0: 62 6c 65 20 6f 6e 20 64 69 73 6b 2c 20 75 6e 6c  ble on disk, unl
e7c0: 65 73 73 0a 2a 2a 20 74 68 69 73 20 69 73 20 61  ess.** this is a
e7d0: 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
e7e0: 20 6f 72 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73   or db->init.bus
e7f0: 79 3d 3d 31 2e 20 20 57 68 65 6e 20 64 62 2d 3e  y==1.  When db->
e800: 69 6e 69 74 2e 62 75 73 79 3d 3d 31 0a 2a 2a 20  init.busy==1.** 
e810: 69 74 20 6d 65 61 6e 73 20 77 65 20 61 72 65 20  it means we are 
e820: 72 65 61 64 69 6e 67 20 74 68 65 20 73 71 6c 69  reading the sqli
e830: 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20  te_master table 
e840: 62 65 63 61 75 73 65 20 77 65 20 6a 75 73 74 0a  because we just.
e850: 2a 2a 20 63 6f 6e 6e 65 63 74 65 64 20 74 6f 20  ** connected to 
e860: 74 68 65 20 64 61 74 61 62 61 73 65 20 6f 72 20  the database or 
e870: 62 65 63 61 75 73 65 20 74 68 65 20 73 71 6c 69  because the sqli
e880: 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20  te_master table 
e890: 68 61 73 0a 2a 2a 20 72 65 63 65 6e 74 6c 79 20  has.** recently 
e8a0: 63 68 61 6e 67 65 64 2c 20 73 6f 20 74 68 65 20  changed, so the 
e8b0: 65 6e 74 72 79 20 66 6f 72 20 74 68 69 73 20 74  entry for this t
e8c0: 61 62 6c 65 20 61 6c 72 65 61 64 79 20 65 78 69  able already exi
e8d0: 73 74 73 20 69 6e 0a 2a 2a 20 74 68 65 20 73 71  sts in.** the sq
e8e0: 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c  lite_master tabl
e8f0: 65 2e 20 20 57 65 20 64 6f 20 6e 6f 74 20 77 61  e.  We do not wa
e900: 6e 74 20 74 6f 20 63 72 65 61 74 65 20 69 74 20  nt to create it 
e910: 61 67 61 69 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  again..**.** If 
e920: 74 68 65 20 70 53 65 6c 65 63 74 20 61 72 67 75  the pSelect argu
e930: 6d 65 6e 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c  ment is not NULL
e940: 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20  , it means that 
e950: 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  this routine.** 
e960: 77 61 73 20 63 61 6c 6c 65 64 20 74 6f 20 63 72  was called to cr
e970: 65 61 74 65 20 61 20 74 61 62 6c 65 20 67 65 6e  eate a table gen
e980: 65 72 61 74 65 64 20 66 72 6f 6d 20 61 20 0a 2a  erated from a .*
e990: 2a 20 22 43 52 45 41 54 45 20 54 41 42 4c 45 20  * "CREATE TABLE 
e9a0: 2e 2e 2e 20 41 53 20 53 45 4c 45 43 54 20 2e 2e  ... AS SELECT ..
e9b0: 2e 22 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 54  ." statement.  T
e9c0: 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20  he column names 
e9d0: 6f 66 0a 2a 2a 20 74 68 65 20 6e 65 77 20 74 61  of.** the new ta
e9e0: 62 6c 65 20 77 69 6c 6c 20 6d 61 74 63 68 20 74  ble will match t
e9f0: 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66  he result set of
ea00: 20 74 68 65 20 53 45 4c 45 43 54 2e 0a 2a 2f 0a   the SELECT..*/.
ea10: 76 6f 69 64 20 73 71 6c 69 74 65 33 45 6e 64 54  void sqlite3EndT
ea20: 61 62 6c 65 28 0a 20 20 50 61 72 73 65 20 2a 70  able(.  Parse *p
ea30: 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20  Parse,          
ea40: 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74 65 78 74  /* Parse context
ea50: 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 43 6f   */.  Token *pCo
ea60: 6e 73 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ns,           /*
ea70: 20 54 68 65 20 27 2c 27 20 74 6f 6b 65 6e 20 61   The ',' token a
ea80: 66 74 65 72 20 74 68 65 20 6c 61 73 74 20 63 6f  fter the last co
ea90: 6c 75 6d 6e 20 64 65 66 6e 2e 20 2a 2f 0a 20 20  lumn defn. */.  
eaa0: 54 6f 6b 65 6e 20 2a 70 45 6e 64 2c 20 20 20 20  Token *pEnd,    
eab0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 27          /* The '
eac0: 29 27 20 62 65 66 6f 72 65 20 6f 70 74 69 6f 6e  )' before option
ead0: 73 20 69 6e 20 74 68 65 20 43 52 45 41 54 45 20  s in the CREATE 
eae0: 54 41 42 4c 45 20 2a 2f 0a 20 20 75 38 20 74 61  TABLE */.  u8 ta
eaf0: 62 4f 70 74 73 2c 20 20 20 20 20 20 20 20 20 20  bOpts,          
eb00: 20 20 20 2f 2a 20 45 78 74 72 61 20 74 61 62 6c     /* Extra tabl
eb10: 65 20 6f 70 74 69 6f 6e 73 2e 20 55 73 75 61 6c  e options. Usual
eb20: 6c 79 20 30 2e 20 2a 2f 0a 20 20 53 65 6c 65 63  ly 0. */.  Selec
eb30: 74 20 2a 70 53 65 6c 65 63 74 20 20 20 20 20 20  t *pSelect      
eb40: 20 20 20 2f 2a 20 53 65 6c 65 63 74 20 66 72 6f     /* Select fro
eb50: 6d 20 61 20 22 43 52 45 41 54 45 20 2e 2e 2e 20  m a "CREATE ... 
eb60: 41 53 20 53 45 4c 45 43 54 22 20 2a 2f 0a 29 7b  AS SELECT" */.){
eb70: 0a 20 20 54 61 62 6c 65 20 2a 70 3b 20 20 20 20  .  Table *p;    
eb80: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
eb90: 54 68 65 20 6e 65 77 20 74 61 62 6c 65 20 2a 2f  The new table */
eba0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
ebb0: 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 2f 2a 20   pParse->db; /* 
ebc0: 54 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e  The database con
ebd0: 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74  nection */.  int
ebe0: 20 69 44 62 3b 20 20 20 20 20 20 20 20 20 20 20   iDb;           
ebf0: 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
ec00: 73 65 20 69 6e 20 77 68 69 63 68 20 74 68 65 20  se in which the 
ec10: 74 61 62 6c 65 20 6c 69 76 65 73 20 2a 2f 0a 20  table lives */. 
ec20: 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 20 20 20   Index *pIdx;   
ec30: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e             /* An
ec40: 20 69 6d 70 6c 69 65 64 20 69 6e 64 65 78 20 6f   implied index o
ec50: 66 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 0a  f the table */..
ec60: 20 20 69 66 28 20 70 45 6e 64 3d 3d 30 20 26 26    if( pEnd==0 &&
ec70: 20 70 53 65 6c 65 63 74 3d 3d 30 20 29 7b 0a 20   pSelect==0 ){. 
ec80: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
ec90: 20 61 73 73 65 72 74 28 20 21 64 62 2d 3e 6d 61   assert( !db->ma
eca0: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20  llocFailed );.  
ecb0: 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  p = pParse->pNew
ecc0: 54 61 62 6c 65 3b 0a 20 20 69 66 28 20 70 3d 3d  Table;.  if( p==
ecd0: 30 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 61  0 ) return;..  a
ece0: 73 73 65 72 74 28 20 21 64 62 2d 3e 69 6e 69 74  ssert( !db->init
ecf0: 2e 62 75 73 79 20 7c 7c 20 21 70 53 65 6c 65 63  .busy || !pSelec
ed00: 74 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  t );..  /* If th
ed10: 65 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20  e db->init.busy 
ed20: 69 73 20 31 20 69 74 20 6d 65 61 6e 73 20 77 65  is 1 it means we
ed30: 20 61 72 65 20 72 65 61 64 69 6e 67 20 74 68 65   are reading the
ed40: 20 53 51 4c 20 6f 66 66 20 74 68 65 0a 20 20 2a   SQL off the.  *
ed50: 2a 20 22 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  * "sqlite_master
ed60: 22 20 6f 72 20 22 73 71 6c 69 74 65 5f 74 65 6d  " or "sqlite_tem
ed70: 70 5f 6d 61 73 74 65 72 22 20 74 61 62 6c 65 20  p_master" table 
ed80: 6f 6e 20 74 68 65 20 64 69 73 6b 2e 0a 20 20 2a  on the disk..  *
ed90: 2a 20 53 6f 20 64 6f 20 6e 6f 74 20 77 72 69 74  * So do not writ
eda0: 65 20 74 6f 20 74 68 65 20 64 69 73 6b 20 61 67  e to the disk ag
edb0: 61 69 6e 2e 20 20 45 78 74 72 61 63 74 20 74 68  ain.  Extract th
edc0: 65 20 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62  e root page numb
edd0: 65 72 0a 20 20 2a 2a 20 66 6f 72 20 74 68 65 20  er.  ** for the 
ede0: 74 61 62 6c 65 20 66 72 6f 6d 20 74 68 65 20 64  table from the d
edf0: 62 2d 3e 69 6e 69 74 2e 6e 65 77 54 6e 75 6d 20  b->init.newTnum 
ee00: 66 69 65 6c 64 2e 20 20 28 54 68 65 20 70 61 67  field.  (The pag
ee10: 65 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 73 68  e number.  ** sh
ee20: 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e 20 70  ould have been p
ee30: 75 74 20 74 68 65 72 65 20 62 79 20 74 68 65 20  ut there by the 
ee40: 73 71 6c 69 74 65 4f 70 65 6e 43 62 20 72 6f 75  sqliteOpenCb rou
ee50: 74 69 6e 65 2e 29 0a 20 20 2a 2a 0a 20 20 2a 2a  tine.).  **.  **
ee60: 20 49 66 20 74 68 65 20 72 6f 6f 74 20 70 61 67   If the root pag
ee70: 65 20 6e 75 6d 62 65 72 20 69 73 20 31 2c 20 74  e number is 1, t
ee80: 68 61 74 20 6d 65 61 6e 73 20 74 68 69 73 20 69  hat means this i
ee90: 73 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73  s the sqlite_mas
eea0: 74 65 72 0a 20 20 2a 2a 20 74 61 62 6c 65 20 69  ter.  ** table i
eeb0: 74 73 65 6c 66 2e 20 20 53 6f 20 6d 61 72 6b 20  tself.  So mark 
eec0: 69 74 20 72 65 61 64 2d 6f 6e 6c 79 2e 0a 20 20  it read-only..  
eed0: 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 69 6e 69  */.  if( db->ini
eee0: 74 2e 62 75 73 79 20 29 7b 0a 20 20 20 20 70 2d  t.busy ){.    p-
eef0: 3e 74 6e 75 6d 20 3d 20 64 62 2d 3e 69 6e 69 74  >tnum = db->init
ef00: 2e 6e 65 77 54 6e 75 6d 3b 0a 20 20 20 20 69 66  .newTnum;.    if
ef10: 28 20 70 2d 3e 74 6e 75 6d 3d 3d 31 20 29 20 70  ( p->tnum==1 ) p
ef20: 2d 3e 74 61 62 46 6c 61 67 73 20 7c 3d 20 54 46  ->tabFlags |= TF
ef30: 5f 52 65 61 64 6f 6e 6c 79 3b 0a 20 20 7d 0a 0a  _Readonly;.  }..
ef40: 20 20 2f 2a 20 53 70 65 63 69 61 6c 20 70 72 6f    /* Special pro
ef50: 63 65 73 73 69 6e 67 20 66 6f 72 20 57 49 54 48  cessing for WITH
ef60: 4f 55 54 20 52 4f 57 49 44 20 54 61 62 6c 65 73  OUT ROWID Tables
ef70: 20 2a 2f 0a 20 20 69 66 28 20 74 61 62 4f 70 74   */.  if( tabOpt
ef80: 73 20 26 20 54 46 5f 57 69 74 68 6f 75 74 52 6f  s & TF_WithoutRo
ef90: 77 69 64 20 29 7b 0a 20 20 20 20 69 66 28 20 28  wid ){.    if( (
efa0: 70 2d 3e 74 61 62 46 6c 61 67 73 20 26 20 54 46  p->tabFlags & TF
efb0: 5f 41 75 74 6f 69 6e 63 72 65 6d 65 6e 74 29 20  _Autoincrement) 
efc0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
efd0: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
efe0: 0a 20 20 20 20 20 20 20 20 20 20 22 41 55 54 4f  .          "AUTO
eff0: 49 4e 43 52 45 4d 45 4e 54 20 6e 6f 74 20 61 6c  INCREMENT not al
f000: 6c 6f 77 65 64 20 6f 6e 20 57 49 54 48 4f 55 54  lowed on WITHOUT
f010: 20 52 4f 57 49 44 20 74 61 62 6c 65 73 22 29 3b   ROWID tables");
f020: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  .      return;. 
f030: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28 70 2d     }.    if( (p-
f040: 3e 74 61 62 46 6c 61 67 73 20 26 20 54 46 5f 48  >tabFlags & TF_H
f050: 61 73 50 72 69 6d 61 72 79 4b 65 79 29 3d 3d 30  asPrimaryKey)==0
f060: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
f070: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
f080: 2c 20 22 50 52 49 4d 41 52 59 20 4b 45 59 20 6d  , "PRIMARY KEY m
f090: 69 73 73 69 6e 67 20 6f 6e 20 74 61 62 6c 65 20  issing on table 
f0a0: 25 73 22 2c 20 70 2d 3e 7a 4e 61 6d 65 29 3b 0a  %s", p->zName);.
f0b0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
f0c0: 20 70 2d 3e 74 61 62 46 6c 61 67 73 20 7c 3d 20   p->tabFlags |= 
f0d0: 54 46 5f 57 69 74 68 6f 75 74 52 6f 77 69 64 20  TF_WithoutRowid 
f0e0: 7c 20 54 46 5f 4e 6f 56 69 73 69 62 6c 65 52 6f  | TF_NoVisibleRo
f0f0: 77 69 64 3b 0a 20 20 20 20 20 20 63 6f 6e 76 65  wid;.      conve
f100: 72 74 54 6f 57 69 74 68 6f 75 74 52 6f 77 69 64  rtToWithoutRowid
f110: 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70 29  Table(pParse, p)
f120: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69  ;.    }.  }..  i
f130: 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65  Db = sqlite3Sche
f140: 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 2d  maToIndex(db, p-
f150: 3e 70 53 63 68 65 6d 61 29 3b 0a 0a 23 69 66 6e  >pSchema);..#ifn
f160: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
f170: 43 48 45 43 4b 0a 20 20 2f 2a 20 52 65 73 6f 6c  CHECK.  /* Resol
f180: 76 65 20 6e 61 6d 65 73 20 69 6e 20 61 6c 6c 20  ve names in all 
f190: 43 48 45 43 4b 20 63 6f 6e 73 74 72 61 69 6e 74  CHECK constraint
f1a0: 20 65 78 70 72 65 73 73 69 6f 6e 73 2e 0a 20 20   expressions..  
f1b0: 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 43 68 65  */.  if( p->pChe
f1c0: 63 6b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ck ){.    sqlite
f1d0: 33 52 65 73 6f 6c 76 65 53 65 6c 66 52 65 66 65  3ResolveSelfRefe
f1e0: 72 65 6e 63 65 28 70 50 61 72 73 65 2c 20 70 2c  rence(pParse, p,
f1f0: 20 4e 43 5f 49 73 43 68 65 63 6b 2c 20 30 2c 20   NC_IsCheck, 0, 
f200: 70 2d 3e 70 43 68 65 63 6b 29 3b 0a 20 20 7d 0a  p->pCheck);.  }.
f210: 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e  #endif /* !defin
f220: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  ed(SQLITE_OMIT_C
f230: 48 45 43 4b 29 20 2a 2f 0a 0a 20 20 2f 2a 20 45  HECK) */..  /* E
f240: 73 74 69 6d 61 74 65 20 74 68 65 20 61 76 65 72  stimate the aver
f250: 61 67 65 20 72 6f 77 20 73 69 7a 65 20 66 6f 72  age row size for
f260: 20 74 68 65 20 74 61 62 6c 65 20 61 6e 64 20 66   the table and f
f270: 6f 72 20 61 6c 6c 20 69 6d 70 6c 69 65 64 20 69  or all implied i
f280: 6e 64 69 63 65 73 20 2a 2f 0a 20 20 65 73 74 69  ndices */.  esti
f290: 6d 61 74 65 54 61 62 6c 65 57 69 64 74 68 28 70  mateTableWidth(p
f2a0: 29 3b 0a 20 20 66 6f 72 28 70 49 64 78 3d 70 2d  );.  for(pIdx=p-
f2b0: 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70  >pIndex; pIdx; p
f2c0: 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29  Idx=pIdx->pNext)
f2d0: 7b 0a 20 20 20 20 65 73 74 69 6d 61 74 65 49 6e  {.    estimateIn
f2e0: 64 65 78 57 69 64 74 68 28 70 49 64 78 29 3b 0a  dexWidth(pIdx);.
f2f0: 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 6e 6f 74    }..  /* If not
f300: 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 2c 20 74   initializing, t
f310: 68 65 6e 20 63 72 65 61 74 65 20 61 20 72 65 63  hen create a rec
f320: 6f 72 64 20 66 6f 72 20 74 68 65 20 6e 65 77 20  ord for the new 
f330: 74 61 62 6c 65 0a 20 20 2a 2a 20 69 6e 20 74 68  table.  ** in th
f340: 65 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52 20  e SQLITE_MASTER 
f350: 74 61 62 6c 65 20 6f 66 20 74 68 65 20 64 61 74  table of the dat
f360: 61 62 61 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  abase..  **.  **
f370: 20 49 66 20 74 68 69 73 20 69 73 20 61 20 54 45   If this is a TE
f380: 4d 50 4f 52 41 52 59 20 74 61 62 6c 65 2c 20 77  MPORARY table, w
f390: 72 69 74 65 20 74 68 65 20 65 6e 74 72 79 20 69  rite the entry i
f3a0: 6e 74 6f 20 74 68 65 20 61 75 78 69 6c 69 61 72  nto the auxiliar
f3b0: 79 0a 20 20 2a 2a 20 66 69 6c 65 20 69 6e 73 74  y.  ** file inst
f3c0: 65 61 64 20 6f 66 20 69 6e 74 6f 20 74 68 65 20  ead of into the 
f3d0: 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 66 69  main database fi
f3e0: 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21  le..  */.  if( !
f3f0: 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b  db->init.busy ){
f400: 0a 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20  .    int n;.    
f410: 56 64 62 65 20 2a 76 3b 0a 20 20 20 20 63 68 61  Vdbe *v;.    cha
f420: 72 20 2a 7a 54 79 70 65 3b 20 20 20 20 2f 2a 20  r *zType;    /* 
f430: 22 76 69 65 77 22 20 6f 72 20 22 74 61 62 6c 65  "view" or "table
f440: 22 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a  " */.    char *z
f450: 54 79 70 65 32 3b 20 20 20 2f 2a 20 22 56 49 45  Type2;   /* "VIE
f460: 57 22 20 6f 72 20 22 54 41 42 4c 45 22 20 2a 2f  W" or "TABLE" */
f470: 0a 20 20 20 20 63 68 61 72 20 2a 7a 53 74 6d 74  .    char *zStmt
f480: 3b 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20  ;    /* Text of 
f490: 74 68 65 20 43 52 45 41 54 45 20 54 41 42 4c 45  the CREATE TABLE
f4a0: 20 6f 72 20 43 52 45 41 54 45 20 56 49 45 57 20   or CREATE VIEW 
f4b0: 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 0a 20 20  statement */..  
f4c0: 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74    v = sqlite3Get
f4d0: 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
f4e0: 20 20 69 66 28 20 4e 45 56 45 52 28 76 3d 3d 30    if( NEVER(v==0
f4f0: 29 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 20  ) ) return;..   
f500: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
f510: 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20  p1(v, OP_Close, 
f520: 30 29 3b 0a 0a 20 20 20 20 2f 2a 20 0a 20 20 20  0);..    /* .   
f530: 20 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 7a   ** Initialize z
f540: 54 79 70 65 20 66 6f 72 20 74 68 65 20 6e 65 77  Type for the new
f550: 20 76 69 65 77 20 6f 72 20 74 61 62 6c 65 2e 0a   view or table..
f560: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
f570: 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20 29 7b 0a  ->pSelect==0 ){.
f580: 20 20 20 20 20 20 2f 2a 20 41 20 72 65 67 75 6c        /* A regul
f590: 61 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20  ar table */.    
f5a0: 20 20 7a 54 79 70 65 20 3d 20 22 74 61 62 6c 65    zType = "table
f5b0: 22 3b 0a 20 20 20 20 20 20 7a 54 79 70 65 32 20  ";.      zType2 
f5c0: 3d 20 22 54 41 42 4c 45 22 3b 0a 23 69 66 6e 64  = "TABLE";.#ifnd
f5d0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
f5e0: 49 45 57 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  IEW.    }else{. 
f5f0: 20 20 20 20 20 2f 2a 20 41 20 76 69 65 77 20 2a       /* A view *
f600: 2f 0a 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20  /.      zType = 
f610: 22 76 69 65 77 22 3b 0a 20 20 20 20 20 20 7a 54  "view";.      zT
f620: 79 70 65 32 20 3d 20 22 56 49 45 57 22 3b 0a 23  ype2 = "VIEW";.#
f630: 65 6e 64 69 66 0a 20 20 20 20 7d 0a 0a 20 20 20  endif.    }..   
f640: 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61   /* If this is a
f650: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 78 78   CREATE TABLE xx
f660: 20 41 53 20 53 45 4c 45 43 54 20 2e 2e 2e 2c 20   AS SELECT ..., 
f670: 65 78 65 63 75 74 65 20 74 68 65 20 53 45 4c 45  execute the SELE
f680: 43 54 0a 20 20 20 20 2a 2a 20 73 74 61 74 65 6d  CT.    ** statem
f690: 65 6e 74 20 74 6f 20 70 6f 70 75 6c 61 74 65 20  ent to populate 
f6a0: 74 68 65 20 6e 65 77 20 74 61 62 6c 65 2e 20 54  the new table. T
f6b0: 68 65 20 72 6f 6f 74 2d 70 61 67 65 20 6e 75 6d  he root-page num
f6c0: 62 65 72 20 66 6f 72 20 74 68 65 0a 20 20 20 20  ber for the.    
f6d0: 2a 2a 20 6e 65 77 20 74 61 62 6c 65 20 69 73 20  ** new table is 
f6e0: 69 6e 20 72 65 67 69 73 74 65 72 20 70 50 61 72  in register pPar
f6f0: 73 65 2d 3e 72 65 67 52 6f 6f 74 2e 0a 20 20 20  se->regRoot..   
f700: 20 2a 2a 0a 20 20 20 20 2a 2a 20 4f 6e 63 65 20   **.    ** Once 
f710: 74 68 65 20 53 45 4c 45 43 54 20 68 61 73 20 62  the SELECT has b
f720: 65 65 6e 20 63 6f 64 65 64 20 62 79 20 73 71 6c  een coded by sql
f730: 69 74 65 33 53 65 6c 65 63 74 28 29 2c 20 69 74  ite3Select(), it
f740: 20 69 73 20 69 6e 20 61 0a 20 20 20 20 2a 2a 20   is in a.    ** 
f750: 73 75 69 74 61 62 6c 65 20 73 74 61 74 65 20 74  suitable state t
f760: 6f 20 71 75 65 72 79 20 66 6f 72 20 74 68 65 20  o query for the 
f770: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 61 6e 64  column names and
f780: 20 74 79 70 65 73 20 74 6f 20 62 65 20 75 73 65   types to be use
f790: 64 0a 20 20 20 20 2a 2a 20 62 79 20 74 68 65 20  d.    ** by the 
f7a0: 6e 65 77 20 74 61 62 6c 65 2e 0a 20 20 20 20 2a  new table..    *
f7b0: 2a 0a 20 20 20 20 2a 2a 20 41 20 73 68 61 72 65  *.    ** A share
f7c0: 64 2d 63 61 63 68 65 20 77 72 69 74 65 2d 6c 6f  d-cache write-lo
f7d0: 63 6b 20 69 73 20 6e 6f 74 20 72 65 71 75 69 72  ck is not requir
f7e0: 65 64 20 74 6f 20 77 72 69 74 65 20 74 6f 20 74  ed to write to t
f7f0: 68 65 20 6e 65 77 20 74 61 62 6c 65 2c 0a 20 20  he new table,.  
f800: 20 20 2a 2a 20 61 73 20 61 20 73 63 68 65 6d 61    ** as a schema
f810: 2d 6c 6f 63 6b 20 6d 75 73 74 20 68 61 76 65 20  -lock must have 
f820: 61 6c 72 65 61 64 79 20 62 65 65 6e 20 6f 62 74  already been obt
f830: 61 69 6e 65 64 20 74 6f 20 63 72 65 61 74 65 20  ained to create 
f840: 69 74 2e 20 53 69 6e 63 65 0a 20 20 20 20 2a 2a  it. Since.    **
f850: 20 61 20 73 63 68 65 6d 61 2d 6c 6f 63 6b 20 65   a schema-lock e
f860: 78 63 6c 75 64 65 73 20 61 6c 6c 20 6f 74 68 65  xcludes all othe
f870: 72 20 64 61 74 61 62 61 73 65 20 75 73 65 72 73  r database users
f880: 2c 20 74 68 65 20 77 72 69 74 65 2d 6c 6f 63 6b  , the write-lock
f890: 20 77 6f 75 6c 64 0a 20 20 20 20 2a 2a 20 62 65   would.    ** be
f8a0: 20 72 65 64 75 6e 64 61 6e 74 2e 0a 20 20 20 20   redundant..    
f8b0: 2a 2f 0a 20 20 20 20 69 66 28 20 70 53 65 6c 65  */.    if( pSele
f8c0: 63 74 20 29 7b 0a 20 20 20 20 20 20 53 65 6c 65  ct ){.      Sele
f8d0: 63 74 44 65 73 74 20 64 65 73 74 3b 20 20 20 20  ctDest dest;    
f8e0: 2f 2a 20 57 68 65 72 65 20 74 68 65 20 53 45 4c  /* Where the SEL
f8f0: 45 43 54 20 73 68 6f 75 6c 64 20 73 74 6f 72 65  ECT should store
f900: 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20 20 20   results */.    
f910: 20 20 69 6e 74 20 72 65 67 59 69 65 6c 64 3b 20    int regYield; 
f920: 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65        /* Registe
f930: 72 20 68 6f 6c 64 69 6e 67 20 63 6f 2d 72 6f 75  r holding co-rou
f940: 74 69 6e 65 20 65 6e 74 72 79 2d 70 6f 69 6e 74  tine entry-point
f950: 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64   */.      int ad
f960: 64 72 54 6f 70 3b 20 20 20 20 20 20 20 20 2f 2a  drTop;        /*
f970: 20 54 6f 70 20 6f 66 20 74 68 65 20 63 6f 2d 72   Top of the co-r
f980: 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 20 20 20 20  outine */.      
f990: 69 6e 74 20 72 65 67 52 65 63 3b 20 20 20 20 20  int regRec;     
f9a0: 20 20 20 20 2f 2a 20 41 20 72 65 63 6f 72 64 20      /* A record 
f9b0: 74 6f 20 62 65 20 69 6e 73 65 72 74 20 69 6e 74  to be insert int
f9c0: 6f 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20  o the new table 
f9d0: 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 72 65 67  */.      int reg
f9e0: 52 6f 77 69 64 3b 20 20 20 20 20 20 20 2f 2a 20  Rowid;       /* 
f9f0: 52 6f 77 69 64 20 6f 66 20 74 68 65 20 6e 65 78  Rowid of the nex
fa00: 74 20 72 6f 77 20 74 6f 20 69 6e 73 65 72 74 20  t row to insert 
fa10: 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64  */.      int add
fa20: 72 49 6e 73 4c 6f 6f 70 3b 20 20 20 20 2f 2a 20  rInsLoop;    /* 
fa30: 54 6f 70 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20  Top of the loop 
fa40: 66 6f 72 20 69 6e 73 65 72 74 69 6e 67 20 72 6f  for inserting ro
fa50: 77 73 20 2a 2f 0a 20 20 20 20 20 20 54 61 62 6c  ws */.      Tabl
fa60: 65 20 2a 70 53 65 6c 54 61 62 3b 20 20 20 20 20  e *pSelTab;     
fa70: 2f 2a 20 41 20 74 61 62 6c 65 20 74 68 61 74 20  /* A table that 
fa80: 64 65 73 63 72 69 62 65 73 20 74 68 65 20 53 45  describes the SE
fa90: 4c 45 43 54 20 72 65 73 75 6c 74 73 20 2a 2f 0a  LECT results */.
faa0: 0a 20 20 20 20 20 20 72 65 67 59 69 65 6c 64 20  .      regYield 
fab0: 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
fac0: 3b 0a 20 20 20 20 20 20 72 65 67 52 65 63 20 3d  ;.      regRec =
fad0: 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
fae0: 0a 20 20 20 20 20 20 72 65 67 52 6f 77 69 64 20  .      regRowid 
faf0: 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
fb00: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 70  ;.      assert(p
fb10: 50 61 72 73 65 2d 3e 6e 54 61 62 3d 3d 31 29 3b  Parse->nTab==1);
fb20: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4d 61  .      sqlite3Ma
fb30: 79 41 62 6f 72 74 28 70 50 61 72 73 65 29 3b 0a  yAbort(pParse);.
fb40: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
fb50: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4f 70  eAddOp3(v, OP_Op
fb60: 65 6e 57 72 69 74 65 2c 20 31 2c 20 70 50 61 72  enWrite, 1, pPar
fb70: 73 65 2d 3e 72 65 67 52 6f 6f 74 2c 20 69 44 62  se->regRoot, iDb
fb80: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
fb90: 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
fba0: 4f 50 46 4c 41 47 5f 50 32 49 53 52 45 47 29 3b  OPFLAG_P2ISREG);
fbb0: 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  .      pParse->n
fbc0: 54 61 62 20 3d 20 32 3b 0a 20 20 20 20 20 20 61  Tab = 2;.      a
fbd0: 64 64 72 54 6f 70 20 3d 20 73 71 6c 69 74 65 33  ddrTop = sqlite3
fbe0: 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
fbf0: 76 29 20 2b 20 31 3b 0a 20 20 20 20 20 20 73 71  v) + 1;.      sq
fc00: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
fc10: 76 2c 20 4f 50 5f 49 6e 69 74 43 6f 72 6f 75 74  v, OP_InitCorout
fc20: 69 6e 65 2c 20 72 65 67 59 69 65 6c 64 2c 20 30  ine, regYield, 0
fc30: 2c 20 61 64 64 72 54 6f 70 29 3b 0a 20 20 20 20  , addrTop);.    
fc40: 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44    sqlite3SelectD
fc50: 65 73 74 49 6e 69 74 28 26 64 65 73 74 2c 20 53  estInit(&dest, S
fc60: 52 54 5f 43 6f 72 6f 75 74 69 6e 65 2c 20 72 65  RT_Coroutine, re
fc70: 67 59 69 65 6c 64 29 3b 0a 20 20 20 20 20 20 73  gYield);.      s
fc80: 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61  qlite3Select(pPa
fc90: 72 73 65 2c 20 70 53 65 6c 65 63 74 2c 20 26 64  rse, pSelect, &d
fca0: 65 73 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  est);.      sqli
fcb0: 74 65 33 56 64 62 65 45 6e 64 43 6f 72 6f 75 74  te3VdbeEndCorout
fcc0: 69 6e 65 28 76 2c 20 72 65 67 59 69 65 6c 64 29  ine(v, regYield)
fcd0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
fce0: 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61  dbeJumpHere(v, a
fcf0: 64 64 72 54 6f 70 20 2d 20 31 29 3b 0a 20 20 20  ddrTop - 1);.   
fd00: 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e     if( pParse->n
fd10: 45 72 72 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  Err ) return;.  
fd20: 20 20 20 20 70 53 65 6c 54 61 62 20 3d 20 73 71      pSelTab = sq
fd30: 6c 69 74 65 33 52 65 73 75 6c 74 53 65 74 4f 66  lite3ResultSetOf
fd40: 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  Select(pParse, p
fd50: 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 69  Select);.      i
fd60: 66 28 20 70 53 65 6c 54 61 62 3d 3d 30 20 29 20  f( pSelTab==0 ) 
fd70: 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 61 73  return;.      as
fd80: 73 65 72 74 28 20 70 2d 3e 61 43 6f 6c 3d 3d 30  sert( p->aCol==0
fd90: 20 29 3b 0a 20 20 20 20 20 20 70 2d 3e 6e 43 6f   );.      p->nCo
fda0: 6c 20 3d 20 70 53 65 6c 54 61 62 2d 3e 6e 43 6f  l = pSelTab->nCo
fdb0: 6c 3b 0a 20 20 20 20 20 20 70 2d 3e 61 43 6f 6c  l;.      p->aCol
fdc0: 20 3d 20 70 53 65 6c 54 61 62 2d 3e 61 43 6f 6c   = pSelTab->aCol
fdd0: 3b 0a 20 20 20 20 20 20 70 53 65 6c 54 61 62 2d  ;.      pSelTab-
fde0: 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20  >nCol = 0;.     
fdf0: 20 70 53 65 6c 54 61 62 2d 3e 61 43 6f 6c 20 3d   pSelTab->aCol =
fe00: 20 30 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   0;.      sqlite
fe10: 33 44 65 6c 65 74 65 54 61 62 6c 65 28 64 62 2c  3DeleteTable(db,
fe20: 20 70 53 65 6c 54 61 62 29 3b 0a 20 20 20 20 20   pSelTab);.     
fe30: 20 61 64 64 72 49 6e 73 4c 6f 6f 70 20 3d 20 73   addrInsLoop = s
fe40: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
fe50: 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 64 65  (v, OP_Yield, de
fe60: 73 74 2e 69 53 44 50 61 72 6d 29 3b 0a 20 20 20  st.iSDParm);.   
fe70: 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28     VdbeCoverage(
fe80: 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  v);.      sqlite
fe90: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
fea0: 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 64 65  P_MakeRecord, de
feb0: 73 74 2e 69 53 64 73 74 2c 20 64 65 73 74 2e 6e  st.iSdst, dest.n
fec0: 53 64 73 74 2c 20 72 65 67 52 65 63 29 3b 0a 20  Sdst, regRec);. 
fed0: 20 20 20 20 20 73 71 6c 69 74 65 33 54 61 62 6c       sqlite3Tabl
fee0: 65 41 66 66 69 6e 69 74 79 28 76 2c 20 70 2c 20  eAffinity(v, p, 
fef0: 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
ff00: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
ff10: 50 5f 4e 65 77 52 6f 77 69 64 2c 20 31 2c 20 72  P_NewRowid, 1, r
ff20: 65 67 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20  egRowid);.      
ff30: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
ff40: 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20  3(v, OP_Insert, 
ff50: 31 2c 20 72 65 67 52 65 63 2c 20 72 65 67 52 6f  1, regRec, regRo
ff60: 77 69 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  wid);.      sqli
ff70: 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 61  te3VdbeGoto(v, a
ff80: 64 64 72 49 6e 73 4c 6f 6f 70 29 3b 0a 20 20 20  ddrInsLoop);.   
ff90: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
ffa0: 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 49 6e  mpHere(v, addrIn
ffb0: 73 4c 6f 6f 70 29 3b 0a 20 20 20 20 20 20 73 71  sLoop);.      sq
ffc0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
ffd0: 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 31 29 3b  v, OP_Close, 1);
ffe0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43  .    }..    /* C
fff0: 6f 6d 70 75 74 65 20 74 68 65 20 63 6f 6d 70 6c  ompute the compl
10000 65 74 65 20 74 65 78 74 20 6f 66 20 74 68 65 20  ete text of the 
10010 43 52 45 41 54 45 20 73 74 61 74 65 6d 65 6e 74  CREATE statement
10020 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 53 65 6c   */.    if( pSel
10030 65 63 74 20 29 7b 0a 20 20 20 20 20 20 7a 53 74  ect ){.      zSt
10040 6d 74 20 3d 20 63 72 65 61 74 65 54 61 62 6c 65  mt = createTable
10050 53 74 6d 74 28 64 62 2c 20 70 29 3b 0a 20 20 20  Stmt(db, p);.   
10060 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 54 6f   }else{.      To
10070 6b 65 6e 20 2a 70 45 6e 64 32 20 3d 20 74 61 62  ken *pEnd2 = tab
10080 4f 70 74 73 20 3f 20 26 70 50 61 72 73 65 2d 3e  Opts ? &pParse->
10090 73 4c 61 73 74 54 6f 6b 65 6e 20 3a 20 70 45 6e  sLastToken : pEn
100a0 64 3b 0a 20 20 20 20 20 20 6e 20 3d 20 28 69 6e  d;.      n = (in
100b0 74 29 28 70 45 6e 64 32 2d 3e 7a 20 2d 20 70 50  t)(pEnd2->z - pP
100c0 61 72 73 65 2d 3e 73 4e 61 6d 65 54 6f 6b 65 6e  arse->sNameToken
100d0 2e 7a 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  .z);.      if( p
100e0 45 6e 64 32 2d 3e 7a 5b 30 5d 21 3d 27 3b 27 20  End2->z[0]!=';' 
100f0 29 20 6e 20 2b 3d 20 70 45 6e 64 32 2d 3e 6e 3b  ) n += pEnd2->n;
10100 0a 20 20 20 20 20 20 7a 53 74 6d 74 20 3d 20 73  .      zStmt = s
10110 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62  qlite3MPrintf(db
10120 2c 20 0a 20 20 20 20 20 20 20 20 20 20 22 43 52  , .          "CR
10130 45 41 54 45 20 25 73 20 25 2e 2a 73 22 2c 20 7a  EATE %s %.*s", z
10140 54 79 70 65 32 2c 20 6e 2c 20 70 50 61 72 73 65  Type2, n, pParse
10150 2d 3e 73 4e 61 6d 65 54 6f 6b 65 6e 2e 7a 0a 20  ->sNameToken.z. 
10160 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 0a 20       );.    }.. 
10170 20 20 20 2f 2a 20 41 20 73 6c 6f 74 20 66 6f 72     /* A slot for
10180 20 74 68 65 20 72 65 63 6f 72 64 20 68 61 73 20   the record has 
10190 61 6c 72 65 61 64 79 20 62 65 65 6e 20 61 6c 6c  already been all
101a0 6f 63 61 74 65 64 20 69 6e 20 74 68 65 20 0a 20  ocated in the . 
101b0 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 4d 41 53     ** SQLITE_MAS
101c0 54 45 52 20 74 61 62 6c 65 2e 20 20 57 65 20 6a  TER table.  We j
101d0 75 73 74 20 6e 65 65 64 20 74 6f 20 75 70 64 61  ust need to upda
101e0 74 65 20 74 68 61 74 20 73 6c 6f 74 20 77 69 74  te that slot wit
101f0 68 20 61 6c 6c 0a 20 20 20 20 2a 2a 20 74 68 65  h all.    ** the
10200 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 77 65 27   information we'
10210 76 65 20 63 6f 6c 6c 65 63 74 65 64 2e 0a 20 20  ve collected..  
10220 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33    */.    sqlite3
10230 4e 65 73 74 65 64 50 61 72 73 65 28 70 50 61 72  NestedParse(pPar
10240 73 65 2c 0a 20 20 20 20 20 20 22 55 50 44 41 54  se,.      "UPDAT
10250 45 20 25 51 2e 25 73 20 22 0a 20 20 20 20 20 20  E %Q.%s ".      
10260 20 20 20 22 53 45 54 20 74 79 70 65 3d 27 25 73     "SET type='%s
10270 27 2c 20 6e 61 6d 65 3d 25 51 2c 20 74 62 6c 5f  ', name=%Q, tbl_
10280 6e 61 6d 65 3d 25 51 2c 20 72 6f 6f 74 70 61 67  name=%Q, rootpag
10290 65 3d 23 25 64 2c 20 73 71 6c 3d 25 51 20 22 0a  e=#%d, sql=%Q ".
102a0 20 20 20 20 20 20 20 22 57 48 45 52 45 20 72 6f         "WHERE ro
102b0 77 69 64 3d 23 25 64 22 2c 0a 20 20 20 20 20 20  wid=#%d",.      
102c0 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61  db->aDb[iDb].zNa
102d0 6d 65 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c 45  me, SCHEMA_TABLE
102e0 28 69 44 62 29 2c 0a 20 20 20 20 20 20 7a 54 79  (iDb),.      zTy
102f0 70 65 2c 0a 20 20 20 20 20 20 70 2d 3e 7a 4e 61  pe,.      p->zNa
10300 6d 65 2c 0a 20 20 20 20 20 20 70 2d 3e 7a 4e 61  me,.      p->zNa
10310 6d 65 2c 0a 20 20 20 20 20 20 70 50 61 72 73 65  me,.      pParse
10320 2d 3e 72 65 67 52 6f 6f 74 2c 0a 20 20 20 20 20  ->regRoot,.     
10330 20 7a 53 74 6d 74 2c 0a 20 20 20 20 20 20 70 50   zStmt,.      pP
10340 61 72 73 65 2d 3e 72 65 67 52 6f 77 69 64 0a 20  arse->regRowid. 
10350 20 20 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65     );.    sqlite
10360 33 44 62 46 72 65 65 28 64 62 2c 20 7a 53 74 6d  3DbFree(db, zStm
10370 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 43  t);.    sqlite3C
10380 68 61 6e 67 65 43 6f 6f 6b 69 65 28 70 50 61 72  hangeCookie(pPar
10390 73 65 2c 20 69 44 62 29 3b 0a 0a 23 69 66 6e 64  se, iDb);..#ifnd
103a0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
103b0 55 54 4f 49 4e 43 52 45 4d 45 4e 54 0a 20 20 20  UTOINCREMENT.   
103c0 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65   /* Check to see
103d0 20 69 66 20 77 65 20 6e 65 65 64 20 74 6f 20 63   if we need to c
103e0 72 65 61 74 65 20 61 6e 20 73 71 6c 69 74 65 5f  reate an sqlite_
103f0 73 65 71 75 65 6e 63 65 20 74 61 62 6c 65 20 66  sequence table f
10400 6f 72 0a 20 20 20 20 2a 2a 20 6b 65 65 70 69 6e  or.    ** keepin
10410 67 20 74 72 61 63 6b 20 6f 66 20 61 75 74 6f 69  g track of autoi
10420 6e 63 72 65 6d 65 6e 74 20 6b 65 79 73 2e 0a 20  ncrement keys.. 
10430 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d     */.    if( p-
10440 3e 74 61 62 46 6c 61 67 73 20 26 20 54 46 5f 41  >tabFlags & TF_A
10450 75 74 6f 69 6e 63 72 65 6d 65 6e 74 20 29 7b 0a  utoincrement ){.
10460 20 20 20 20 20 20 44 62 20 2a 70 44 62 20 3d 20        Db *pDb = 
10470 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a 20  &db->aDb[iDb];. 
10480 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c       assert( sql
10490 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48  ite3SchemaMutexH
104a0 65 6c 64 28 64 62 2c 20 69 44 62 2c 20 30 29 20  eld(db, iDb, 0) 
104b0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 44 62  );.      if( pDb
104c0 2d 3e 70 53 63 68 65 6d 61 2d 3e 70 53 65 71 54  ->pSchema->pSeqT
104d0 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ab==0 ){.       
104e0 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61   sqlite3NestedPa
104f0 72 73 65 28 70 50 61 72 73 65 2c 0a 20 20 20 20  rse(pParse,.    
10500 20 20 20 20 20 20 22 43 52 45 41 54 45 20 54 41        "CREATE TA
10510 42 4c 45 20 25 51 2e 73 71 6c 69 74 65 5f 73 65  BLE %Q.sqlite_se
10520 71 75 65 6e 63 65 28 6e 61 6d 65 2c 73 65 71 29  quence(name,seq)
10530 22 2c 0a 20 20 20 20 20 20 20 20 20 20 70 44 62  ",.          pDb
10540 2d 3e 7a 4e 61 6d 65 0a 20 20 20 20 20 20 20 20  ->zName.        
10550 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
10560 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20  .#endif..    /* 
10570 52 65 70 61 72 73 65 20 65 76 65 72 79 74 68 69  Reparse everythi
10580 6e 67 20 74 6f 20 75 70 64 61 74 65 20 6f 75 72  ng to update our
10590 20 69 6e 74 65 72 6e 61 6c 20 64 61 74 61 20 73   internal data s
105a0 74 72 75 63 74 75 72 65 73 20 2a 2f 0a 20 20 20  tructures */.   
105b0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 50   sqlite3VdbeAddP
105c0 61 72 73 65 53 63 68 65 6d 61 4f 70 28 76 2c 20  arseSchemaOp(v, 
105d0 69 44 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20  iDb,.           
105e0 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64  sqlite3MPrintf(d
105f0 62 2c 20 22 74 62 6c 5f 6e 61 6d 65 3d 27 25 71  b, "tbl_name='%q
10600 27 20 41 4e 44 20 74 79 70 65 21 3d 27 74 72 69  ' AND type!='tri
10610 67 67 65 72 27 22 2c 20 70 2d 3e 7a 4e 61 6d 65  gger'", p->zName
10620 29 29 3b 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20 41  ));.  }...  /* A
10630 64 64 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20  dd the table to 
10640 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 72 65  the in-memory re
10650 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20  presentation of 
10660 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 20 20  the database..  
10670 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 69 6e 69  */.  if( db->ini
10680 74 2e 62 75 73 79 20 29 7b 0a 20 20 20 20 54 61  t.busy ){.    Ta
10690 62 6c 65 20 2a 70 4f 6c 64 3b 0a 20 20 20 20 53  ble *pOld;.    S
106a0 63 68 65 6d 61 20 2a 70 53 63 68 65 6d 61 20 3d  chema *pSchema =
106b0 20 70 2d 3e 70 53 63 68 65 6d 61 3b 0a 20 20 20   p->pSchema;.   
106c0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
106d0 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28  SchemaMutexHeld(
106e0 64 62 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a 20  db, iDb, 0) );. 
106f0 20 20 20 70 4f 6c 64 20 3d 20 73 71 6c 69 74 65     pOld = sqlite
10700 33 48 61 73 68 49 6e 73 65 72 74 28 26 70 53 63  3HashInsert(&pSc
10710 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68 2c 20 70  hema->tblHash, p
10720 2d 3e 7a 4e 61 6d 65 2c 20 70 29 3b 0a 20 20 20  ->zName, p);.   
10730 20 69 66 28 20 70 4f 6c 64 20 29 7b 0a 20 20 20   if( pOld ){.   
10740 20 20 20 61 73 73 65 72 74 28 20 70 3d 3d 70 4f     assert( p==pO
10750 6c 64 20 29 3b 20 20 2f 2a 20 4d 61 6c 6c 6f 63  ld );  /* Malloc
10760 20 6d 75 73 74 20 68 61 76 65 20 66 61 69 6c 65   must have faile
10770 64 20 69 6e 73 69 64 65 20 48 61 73 68 49 6e 73  d inside HashIns
10780 65 72 74 28 29 20 2a 2f 0a 20 20 20 20 20 20 73  ert() */.      s
10790 71 6c 69 74 65 33 4f 6f 6d 46 61 75 6c 74 28 64  qlite3OomFault(d
107a0 62 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  b);.      return
107b0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 72  ;.    }.    pPar
107c0 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 3d 20  se->pNewTable = 
107d0 30 3b 0a 20 20 20 20 64 62 2d 3e 66 6c 61 67 73  0;.    db->flags
107e0 20 7c 3d 20 53 51 4c 49 54 45 5f 49 6e 74 65 72   |= SQLITE_Inter
107f0 6e 43 68 61 6e 67 65 73 3b 0a 0a 23 69 66 6e 64  nChanges;..#ifnd
10800 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
10810 4c 54 45 52 54 41 42 4c 45 0a 20 20 20 20 69 66  LTERTABLE.    if
10820 28 20 21 70 2d 3e 70 53 65 6c 65 63 74 20 29 7b  ( !p->pSelect ){
10830 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61  .      const cha
10840 72 20 2a 7a 4e 61 6d 65 20 3d 20 28 63 6f 6e 73  r *zName = (cons
10850 74 20 63 68 61 72 20 2a 29 70 50 61 72 73 65 2d  t char *)pParse-
10860 3e 73 4e 61 6d 65 54 6f 6b 65 6e 2e 7a 3b 0a 20  >sNameToken.z;. 
10870 20 20 20 20 20 69 6e 74 20 6e 4e 61 6d 65 3b 0a       int nName;.
10880 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70        assert( !p
10890 53 65 6c 65 63 74 20 26 26 20 70 43 6f 6e 73 20  Select && pCons 
108a0 26 26 20 70 45 6e 64 20 29 3b 0a 20 20 20 20 20  && pEnd );.     
108b0 20 69 66 28 20 70 43 6f 6e 73 2d 3e 7a 3d 3d 30   if( pCons->z==0
108c0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 6f 6e   ){.        pCon
108d0 73 20 3d 20 70 45 6e 64 3b 0a 20 20 20 20 20 20  s = pEnd;.      
108e0 7d 0a 20 20 20 20 20 20 6e 4e 61 6d 65 20 3d 20  }.      nName = 
108f0 28 69 6e 74 29 28 28 63 6f 6e 73 74 20 63 68 61  (int)((const cha
10900 72 20 2a 29 70 43 6f 6e 73 2d 3e 7a 20 2d 20 7a  r *)pCons->z - z
10910 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 70 2d 3e  Name);.      p->
10920 61 64 64 43 6f 6c 4f 66 66 73 65 74 20 3d 20 31  addColOffset = 1
10930 33 20 2b 20 73 71 6c 69 74 65 33 55 74 66 38 43  3 + sqlite3Utf8C
10940 68 61 72 4c 65 6e 28 7a 4e 61 6d 65 2c 20 6e 4e  harLen(zName, nN
10950 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  ame);.    }.#end
10960 69 66 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65  if.  }.}..#ifnde
10970 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
10980 45 57 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 61 72  EW./*.** The par
10990 73 65 72 20 63 61 6c 6c 73 20 74 68 69 73 20 72  ser calls this r
109a0 6f 75 74 69 6e 65 20 69 6e 20 6f 72 64 65 72 20  outine in order 
109b0 74 6f 20 63 72 65 61 74 65 20 61 20 6e 65 77 20  to create a new 
109c0 56 49 45 57 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  VIEW.*/.void sql
109d0 69 74 65 33 43 72 65 61 74 65 56 69 65 77 28 0a  ite3CreateView(.
109e0 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
109f0 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73       /* The pars
10a00 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
10a10 20 54 6f 6b 65 6e 20 2a 70 42 65 67 69 6e 2c 20   Token *pBegin, 
10a20 20 20 20 20 2f 2a 20 54 68 65 20 43 52 45 41 54      /* The CREAT
10a30 45 20 74 6f 6b 65 6e 20 74 68 61 74 20 62 65 67  E token that beg
10a40 69 6e 73 20 74 68 65 20 73 74 61 74 65 6d 65 6e  ins the statemen
10a50 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e  t */.  Token *pN
10a60 61 6d 65 31 2c 20 20 20 20 20 2f 2a 20 54 68 65  ame1,     /* The
10a70 20 74 6f 6b 65 6e 20 74 68 61 74 20 68 6f 6c 64   token that hold
10a80 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  s the name of th
10a90 65 20 76 69 65 77 20 2a 2f 0a 20 20 54 6f 6b 65  e view */.  Toke
10aa0 6e 20 2a 70 4e 61 6d 65 32 2c 20 20 20 20 20 2f  n *pName2,     /
10ab0 2a 20 54 68 65 20 74 6f 6b 65 6e 20 74 68 61 74  * The token that
10ac0 20 68 6f 6c 64 73 20 74 68 65 20 6e 61 6d 65 20   holds the name 
10ad0 6f 66 20 74 68 65 20 76 69 65 77 20 2a 2f 0a 20  of the view */. 
10ae0 20 45 78 70 72 4c 69 73 74 20 2a 70 43 4e 61 6d   ExprList *pCNam
10af0 65 73 2c 20 2f 2a 20 4f 70 74 69 6f 6e 61 6c 20  es, /* Optional 
10b00 6c 69 73 74 20 6f 66 20 76 69 65 77 20 63 6f 6c  list of view col
10b10 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a 20 20 53  umn names */.  S
10b20 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 2c 20  elect *pSelect, 
10b30 20 20 2f 2a 20 41 20 53 45 4c 45 43 54 20 73 74    /* A SELECT st
10b40 61 74 65 6d 65 6e 74 20 74 68 61 74 20 77 69 6c  atement that wil
10b50 6c 20 62 65 63 6f 6d 65 20 74 68 65 20 6e 65 77  l become the new
10b60 20 76 69 65 77 20 2a 2f 0a 20 20 69 6e 74 20 69   view */.  int i
10b70 73 54 65 6d 70 2c 20 20 20 20 20 20 20 20 2f 2a  sTemp,        /*
10b80 20 54 52 55 45 20 66 6f 72 20 61 20 54 45 4d 50   TRUE for a TEMP
10b90 4f 52 41 52 59 20 76 69 65 77 20 2a 2f 0a 20 20  ORARY view */.  
10ba0 69 6e 74 20 6e 6f 45 72 72 20 20 20 20 20 20 20  int noErr       
10bb0 20 20 20 2f 2a 20 53 75 70 70 72 65 73 73 20 65     /* Suppress e
10bc0 72 72 6f 72 20 6d 65 73 73 61 67 65 73 20 69 66  rror messages if
10bd0 20 56 49 45 57 20 61 6c 72 65 61 64 79 20 65 78   VIEW already ex
10be0 69 73 74 73 20 2a 2f 0a 29 7b 0a 20 20 54 61 62  ists */.){.  Tab
10bf0 6c 65 20 2a 70 3b 0a 20 20 69 6e 74 20 6e 3b 0a  le *p;.  int n;.
10c00 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b    const char *z;
10c10 0a 20 20 54 6f 6b 65 6e 20 73 45 6e 64 3b 0a 20  .  Token sEnd;. 
10c20 20 44 62 46 69 78 65 72 20 73 46 69 78 3b 0a 20   DbFixer sFix;. 
10c30 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 20 3d 20   Token *pName = 
10c40 30 3b 0a 20 20 69 6e 74 20 69 44 62 3b 0a 20 20  0;.  int iDb;.  
10c50 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
10c60 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 69 66 28  arse->db;..  if(
10c70 20 70 50 61 72 73 65 2d 3e 6e 56 61 72 3e 30 20   pParse->nVar>0 
10c80 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
10c90 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
10ca0 70 61 72 61 6d 65 74 65 72 73 20 61 72 65 20 6e  parameters are n
10cb0 6f 74 20 61 6c 6c 6f 77 65 64 20 69 6e 20 76 69  ot allowed in vi
10cc0 65 77 73 22 29 3b 0a 20 20 20 20 67 6f 74 6f 20  ews");.    goto 
10cd0 63 72 65 61 74 65 5f 76 69 65 77 5f 66 61 69 6c  create_view_fail
10ce0 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 53  ;.  }.  sqlite3S
10cf0 74 61 72 74 54 61 62 6c 65 28 70 50 61 72 73 65  tartTable(pParse
10d00 2c 20 70 4e 61 6d 65 31 2c 20 70 4e 61 6d 65 32  , pName1, pName2
10d10 2c 20 69 73 54 65 6d 70 2c 20 31 2c 20 30 2c 20  , isTemp, 1, 0, 
10d20 6e 6f 45 72 72 29 3b 0a 20 20 70 20 3d 20 70 50  noErr);.  p = pP
10d30 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b  arse->pNewTable;
10d40 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20 70  .  if( p==0 || p
10d50 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 20 67 6f  Parse->nErr ) go
10d60 74 6f 20 63 72 65 61 74 65 5f 76 69 65 77 5f 66  to create_view_f
10d70 61 69 6c 3b 0a 20 20 73 71 6c 69 74 65 33 54 77  ail;.  sqlite3Tw
10d80 6f 50 61 72 74 4e 61 6d 65 28 70 50 61 72 73 65  oPartName(pParse
10d90 2c 20 70 4e 61 6d 65 31 2c 20 70 4e 61 6d 65 32  , pName1, pName2
10da0 2c 20 26 70 4e 61 6d 65 29 3b 0a 20 20 69 44 62  , &pName);.  iDb
10db0 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61   = sqlite3Schema
10dc0 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 2d 3e 70  ToIndex(db, p->p
10dd0 53 63 68 65 6d 61 29 3b 0a 20 20 73 71 6c 69 74  Schema);.  sqlit
10de0 65 33 46 69 78 49 6e 69 74 28 26 73 46 69 78 2c  e3FixInit(&sFix,
10df0 20 70 50 61 72 73 65 2c 20 69 44 62 2c 20 22 76   pParse, iDb, "v
10e00 69 65 77 22 2c 20 70 4e 61 6d 65 29 3b 0a 20 20  iew", pName);.  
10e10 69 66 28 20 73 71 6c 69 74 65 33 46 69 78 53 65  if( sqlite3FixSe
10e20 6c 65 63 74 28 26 73 46 69 78 2c 20 70 53 65 6c  lect(&sFix, pSel
10e30 65 63 74 29 20 29 20 67 6f 74 6f 20 63 72 65 61  ect) ) goto crea
10e40 74 65 5f 76 69 65 77 5f 66 61 69 6c 3b 0a 0a 20  te_view_fail;.. 
10e50 20 2f 2a 20 4d 61 6b 65 20 61 20 63 6f 70 79 20   /* Make a copy 
10e60 6f 66 20 74 68 65 20 65 6e 74 69 72 65 20 53 45  of the entire SE
10e70 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 74  LECT statement t
10e80 68 61 74 20 64 65 66 69 6e 65 73 20 74 68 65 20  hat defines the 
10e90 76 69 65 77 2e 0a 20 20 2a 2a 20 54 68 69 73 20  view..  ** This 
10ea0 77 69 6c 6c 20 66 6f 72 63 65 20 61 6c 6c 20 74  will force all t
10eb0 68 65 20 45 78 70 72 2e 74 6f 6b 65 6e 2e 7a 20  he Expr.token.z 
10ec0 76 61 6c 75 65 73 20 74 6f 20 62 65 20 64 79 6e  values to be dyn
10ed0 61 6d 69 63 61 6c 6c 79 0a 20 20 2a 2a 20 61 6c  amically.  ** al
10ee0 6c 6f 63 61 74 65 64 20 72 61 74 68 65 72 20 74  located rather t
10ef0 68 61 6e 20 70 6f 69 6e 74 20 74 6f 20 74 68 65  han point to the
10f00 20 69 6e 70 75 74 20 73 74 72 69 6e 67 20 2d 20   input string - 
10f10 77 68 69 63 68 20 6d 65 61 6e 73 20 74 68 61 74  which means that
10f20 0a 20 20 2a 2a 20 74 68 65 79 20 77 69 6c 6c 20  .  ** they will 
10f30 70 65 72 73 69 73 74 20 61 66 74 65 72 20 74 68  persist after th
10f40 65 20 63 75 72 72 65 6e 74 20 73 71 6c 69 74 65  e current sqlite
10f50 33 5f 65 78 65 63 28 29 20 63 61 6c 6c 20 72 65  3_exec() call re
10f60 74 75 72 6e 73 2e 0a 20 20 2a 2f 0a 20 20 70 2d  turns..  */.  p-
10f70 3e 70 53 65 6c 65 63 74 20 3d 20 73 71 6c 69 74  >pSelect = sqlit
10f80 65 33 53 65 6c 65 63 74 44 75 70 28 64 62 2c 20  e3SelectDup(db, 
10f90 70 53 65 6c 65 63 74 2c 20 45 58 50 52 44 55 50  pSelect, EXPRDUP
10fa0 5f 52 45 44 55 43 45 29 3b 0a 20 20 70 2d 3e 70  _REDUCE);.  p->p
10fb0 43 68 65 63 6b 20 3d 20 73 71 6c 69 74 65 33 45  Check = sqlite3E
10fc0 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70  xprListDup(db, p
10fd0 43 4e 61 6d 65 73 2c 20 45 58 50 52 44 55 50 5f  CNames, EXPRDUP_
10fe0 52 45 44 55 43 45 29 3b 0a 20 20 69 66 28 20 64  REDUCE);.  if( d
10ff0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
11000 29 20 67 6f 74 6f 20 63 72 65 61 74 65 5f 76 69  ) goto create_vi
11010 65 77 5f 66 61 69 6c 3b 0a 0a 20 20 2f 2a 20 4c  ew_fail;..  /* L
11020 6f 63 61 74 65 20 74 68 65 20 65 6e 64 20 6f 66  ocate the end of
11030 20 74 68 65 20 43 52 45 41 54 45 20 56 49 45 57   the CREATE VIEW
11040 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 4d 61 6b   statement.  Mak
11050 65 20 73 45 6e 64 20 70 6f 69 6e 74 20 74 6f 0a  e sEnd point to.
11060 20 20 2a 2a 20 74 68 65 20 65 6e 64 2e 0a 20 20    ** the end..  
11070 2a 2f 0a 20 20 73 45 6e 64 20 3d 20 70 50 61 72  */.  sEnd = pPar
11080 73 65 2d 3e 73 4c 61 73 74 54 6f 6b 65 6e 3b 0a  se->sLastToken;.
11090 20 20 61 73 73 65 72 74 28 20 73 45 6e 64 2e 7a    assert( sEnd.z
110a0 5b 30 5d 21 3d 30 20 29 3b 0a 20 20 69 66 28 20  [0]!=0 );.  if( 
110b0 73 45 6e 64 2e 7a 5b 30 5d 21 3d 27 3b 27 20 29  sEnd.z[0]!=';' )
110c0 7b 0a 20 20 20 20 73 45 6e 64 2e 7a 20 2b 3d 20  {.    sEnd.z += 
110d0 73 45 6e 64 2e 6e 3b 0a 20 20 7d 0a 20 20 73 45  sEnd.n;.  }.  sE
110e0 6e 64 2e 6e 20 3d 20 30 3b 0a 20 20 6e 20 3d 20  nd.n = 0;.  n = 
110f0 28 69 6e 74 29 28 73 45 6e 64 2e 7a 20 2d 20 70  (int)(sEnd.z - p
11100 42 65 67 69 6e 2d 3e 7a 29 3b 0a 20 20 61 73 73  Begin->z);.  ass
11110 65 72 74 28 20 6e 3e 30 20 29 3b 0a 20 20 7a 20  ert( n>0 );.  z 
11120 3d 20 70 42 65 67 69 6e 2d 3e 7a 3b 0a 20 20 77  = pBegin->z;.  w
11130 68 69 6c 65 28 20 73 71 6c 69 74 65 33 49 73 73  hile( sqlite3Iss
11140 70 61 63 65 28 7a 5b 6e 2d 31 5d 29 20 29 7b 20  pace(z[n-1]) ){ 
11150 6e 2d 2d 3b 20 7d 0a 20 20 73 45 6e 64 2e 7a 20  n--; }.  sEnd.z 
11160 3d 20 26 7a 5b 6e 2d 31 5d 3b 0a 20 20 73 45 6e  = &z[n-1];.  sEn
11170 64 2e 6e 20 3d 20 31 3b 0a 0a 20 20 2f 2a 20 55  d.n = 1;..  /* U
11180 73 65 20 73 71 6c 69 74 65 33 45 6e 64 54 61 62  se sqlite3EndTab
11190 6c 65 28 29 20 74 6f 20 61 64 64 20 74 68 65 20  le() to add the 
111a0 76 69 65 77 20 74 6f 20 74 68 65 20 53 51 4c 49  view to the SQLI
111b0 54 45 5f 4d 41 53 54 45 52 20 74 61 62 6c 65 20  TE_MASTER table 
111c0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 45 6e 64 54  */.  sqlite3EndT
111d0 61 62 6c 65 28 70 50 61 72 73 65 2c 20 30 2c 20  able(pParse, 0, 
111e0 26 73 45 6e 64 2c 20 30 2c 20 30 29 3b 0a 0a 63  &sEnd, 0, 0);..c
111f0 72 65 61 74 65 5f 76 69 65 77 5f 66 61 69 6c 3a  reate_view_fail:
11200 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  .  sqlite3Select
11210 44 65 6c 65 74 65 28 64 62 2c 20 70 53 65 6c 65  Delete(db, pSele
11220 63 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78  ct);.  sqlite3Ex
11230 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c  prListDelete(db,
11240 20 70 43 4e 61 6d 65 73 29 3b 0a 20 20 72 65 74   pCNames);.  ret
11250 75 72 6e 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  urn;.}.#endif /*
11260 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45   SQLITE_OMIT_VIE
11270 57 20 2a 2f 0a 0a 23 69 66 20 21 64 65 66 69 6e  W */..#if !defin
11280 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ed(SQLITE_OMIT_V
11290 49 45 57 29 20 7c 7c 20 21 64 65 66 69 6e 65 64  IEW) || !defined
112a0 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52  (SQLITE_OMIT_VIR
112b0 54 55 41 4c 54 41 42 4c 45 29 0a 2f 2a 0a 2a 2a  TUALTABLE)./*.**
112c0 20 54 68 65 20 54 61 62 6c 65 20 73 74 72 75 63   The Table struc
112d0 74 75 72 65 20 70 54 61 62 6c 65 20 69 73 20 72  ture pTable is r
112e0 65 61 6c 6c 79 20 61 20 56 49 45 57 2e 20 20 46  eally a VIEW.  F
112f0 69 6c 6c 20 69 6e 20 74 68 65 20 6e 61 6d 65 73  ill in the names
11300 20 6f 66 0a 2a 2a 20 74 68 65 20 63 6f 6c 75 6d   of.** the colum
11310 6e 73 20 6f 66 20 74 68 65 20 76 69 65 77 20 69  ns of the view i
11320 6e 20 74 68 65 20 70 54 61 62 6c 65 20 73 74 72  n the pTable str
11330 75 63 74 75 72 65 2e 20 20 52 65 74 75 72 6e 20  ucture.  Return 
11340 74 68 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66  the number.** of
11350 20 65 72 72 6f 72 73 2e 20 20 49 66 20 61 6e 20   errors.  If an 
11360 65 72 72 6f 72 20 69 73 20 73 65 65 6e 20 6c 65  error is seen le
11370 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73  ave an error mes
11380 73 61 67 65 20 69 6e 20 70 50 61 72 73 65 2d 3e  sage in pParse->
11390 7a 45 72 72 4d 73 67 2e 0a 2a 2f 0a 69 6e 74 20  zErrMsg..*/.int 
113a0 73 71 6c 69 74 65 33 56 69 65 77 47 65 74 43 6f  sqlite3ViewGetCo
113b0 6c 75 6d 6e 4e 61 6d 65 73 28 50 61 72 73 65 20  lumnNames(Parse 
113c0 2a 70 50 61 72 73 65 2c 20 54 61 62 6c 65 20 2a  *pParse, Table *
113d0 70 54 61 62 6c 65 29 7b 0a 20 20 54 61 62 6c 65  pTable){.  Table
113e0 20 2a 70 53 65 6c 54 61 62 3b 20 20 20 2f 2a 20   *pSelTab;   /* 
113f0 41 20 66 61 6b 65 20 74 61 62 6c 65 20 66 72 6f  A fake table fro
11400 6d 20 77 68 69 63 68 20 77 65 20 67 65 74 20 74  m which we get t
11410 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f  he result set */
11420 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 3b  .  Select *pSel;
11430 20 20 20 20 20 2f 2a 20 43 6f 70 79 20 6f 66 20       /* Copy of 
11440 74 68 65 20 53 45 4c 45 43 54 20 74 68 61 74 20  the SELECT that 
11450 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 76  implements the v
11460 69 65 77 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 72  iew */.  int nEr
11470 72 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 4e 75  r = 0;     /* Nu
11480 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73 20 65  mber of errors e
11490 6e 63 6f 75 6e 74 65 72 65 64 20 2a 2f 0a 20 20  ncountered */.  
114a0 69 6e 74 20 6e 3b 20 20 20 20 20 20 20 20 20 20  int n;          
114b0 20 20 2f 2a 20 54 65 6d 70 6f 72 61 72 69 6c 79    /* Temporarily
114c0 20 68 6f 6c 64 73 20 74 68 65 20 6e 75 6d 62 65   holds the numbe
114d0 72 20 6f 66 20 63 75 72 73 6f 72 73 20 61 73 73  r of cursors ass
114e0 69 67 6e 65 64 20 2a 2f 0a 20 20 73 71 6c 69 74  igned */.  sqlit
114f0 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
11500 3e 64 62 3b 20 20 2f 2a 20 44 61 74 61 62 61 73  >db;  /* Databas
11510 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 66 6f 72  e connection for
11520 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 73 20 2a   malloc errors *
11530 2f 0a 20 20 73 71 6c 69 74 65 33 5f 78 61 75 74  /.  sqlite3_xaut
11540 68 20 78 41 75 74 68 3b 20 20 20 20 20 20 20 2f  h xAuth;       /
11550 2a 20 53 61 76 65 64 20 78 41 75 74 68 20 70 6f  * Saved xAuth po
11560 69 6e 74 65 72 20 2a 2f 0a 0a 20 20 61 73 73 65  inter */..  asse
11570 72 74 28 20 70 54 61 62 6c 65 20 29 3b 0a 0a 23  rt( pTable );..#
11580 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
11590 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
115a0 20 20 69 66 28 20 73 71 6c 69 74 65 33 56 74 61    if( sqlite3Vta
115b0 62 43 61 6c 6c 43 6f 6e 6e 65 63 74 28 70 50 61  bCallConnect(pPa
115c0 72 73 65 2c 20 70 54 61 62 6c 65 29 20 29 7b 0a  rse, pTable) ){.
115d0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
115e0 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69  E_ERROR;.  }.  i
115f0 66 28 20 49 73 56 69 72 74 75 61 6c 28 70 54 61  f( IsVirtual(pTa
11600 62 6c 65 29 20 29 20 72 65 74 75 72 6e 20 30 3b  ble) ) return 0;
11610 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66  .#endif..#ifndef
11620 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45   SQLITE_OMIT_VIE
11630 57 0a 20 20 2f 2a 20 41 20 70 6f 73 69 74 69 76  W.  /* A positiv
11640 65 20 6e 43 6f 6c 20 6d 65 61 6e 73 20 74 68 65  e nCol means the
11650 20 63 6f 6c 75 6d 6e 73 20 6e 61 6d 65 73 20 66   columns names f
11660 6f 72 20 74 68 69 73 20 76 69 65 77 20 61 72 65  or this view are
11670 0a 20 20 2a 2a 20 61 6c 72 65 61 64 79 20 6b 6e  .  ** already kn
11680 6f 77 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  own..  */.  if( 
11690 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3e 30 20 29  pTable->nCol>0 )
116a0 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20 2f 2a   return 0;..  /*
116b0 20 41 20 6e 65 67 61 74 69 76 65 20 6e 43 6f 6c   A negative nCol
116c0 20 69 73 20 61 20 73 70 65 63 69 61 6c 20 6d 61   is a special ma
116d0 72 6b 65 72 20 6d 65 61 6e 69 6e 67 20 74 68 61  rker meaning tha
116e0 74 20 77 65 20 61 72 65 20 63 75 72 72 65 6e 74  t we are current
116f0 6c 79 0a 20 20 2a 2a 20 74 72 79 69 6e 67 20 74  ly.  ** trying t
11700 6f 20 63 6f 6d 70 75 74 65 20 74 68 65 20 63 6f  o compute the co
11710 6c 75 6d 6e 20 6e 61 6d 65 73 2e 20 20 49 66 20  lumn names.  If 
11720 77 65 20 65 6e 74 65 72 20 74 68 69 73 20 72 6f  we enter this ro
11730 75 74 69 6e 65 20 77 69 74 68 0a 20 20 2a 2a 20  utine with.  ** 
11740 61 20 6e 65 67 61 74 69 76 65 20 6e 43 6f 6c 2c  a negative nCol,
11750 20 69 74 20 6d 65 61 6e 73 20 74 77 6f 20 6f 72   it means two or
11760 20 6d 6f 72 65 20 76 69 65 77 73 20 66 6f 72 6d   more views form
11770 20 61 20 6c 6f 6f 70 2c 20 6c 69 6b 65 20 74 68   a loop, like th
11780 69 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  is:.  **.  **   
11790 20 20 43 52 45 41 54 45 20 56 49 45 57 20 6f 6e    CREATE VIEW on
117a0 65 20 41 53 20 53 45 4c 45 43 54 20 2a 20 46 52  e AS SELECT * FR
117b0 4f 4d 20 74 77 6f 3b 0a 20 20 2a 2a 20 20 20 20  OM two;.  **    
117c0 20 43 52 45 41 54 45 20 56 49 45 57 20 74 77 6f   CREATE VIEW two
117d0 20 41 53 20 53 45 4c 45 43 54 20 2a 20 46 52 4f   AS SELECT * FRO
117e0 4d 20 6f 6e 65 3b 0a 20 20 2a 2a 0a 20 20 2a 2a  M one;.  **.  **
117f0 20 41 63 74 75 61 6c 6c 79 2c 20 74 68 65 20 65   Actually, the e
11800 72 72 6f 72 20 61 62 6f 76 65 20 69 73 20 6e 6f  rror above is no
11810 77 20 63 61 75 67 68 74 20 70 72 69 6f 72 20 74  w caught prior t
11820 6f 20 72 65 61 63 68 69 6e 67 20 74 68 69 73 20  o reaching this 
11830 70 6f 69 6e 74 2e 0a 20 20 2a 2a 20 42 75 74 20  point..  ** But 
11840 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 65  the following te
11850 73 74 20 69 73 20 73 74 69 6c 6c 20 69 6d 70 6f  st is still impo
11860 72 74 61 6e 74 20 61 73 20 69 74 20 64 6f 65 73  rtant as it does
11870 20 63 6f 6d 65 20 75 70 0a 20 20 2a 2a 20 69 6e   come up.  ** in
11880 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a   the following:.
11890 20 20 2a 2a 20 0a 20 20 2a 2a 20 20 20 20 20 43    ** .  **     C
118a0 52 45 41 54 45 20 54 41 42 4c 45 20 6d 61 69 6e  REATE TABLE main
118b0 2e 65 78 31 28 61 29 3b 0a 20 20 2a 2a 20 20 20  .ex1(a);.  **   
118c0 20 20 43 52 45 41 54 45 20 54 45 4d 50 20 56 49    CREATE TEMP VI
118d0 45 57 20 65 78 31 20 41 53 20 53 45 4c 45 43 54  EW ex1 AS SELECT
118e0 20 61 20 46 52 4f 4d 20 65 78 31 3b 0a 20 20 2a   a FROM ex1;.  *
118f0 2a 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46  *     SELECT * F
11900 52 4f 4d 20 74 65 6d 70 2e 65 78 31 3b 0a 20 20  ROM temp.ex1;.  
11910 2a 2f 0a 20 20 69 66 28 20 70 54 61 62 6c 65 2d  */.  if( pTable-
11920 3e 6e 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 73  >nCol<0 ){.    s
11930 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
11940 50 61 72 73 65 2c 20 22 76 69 65 77 20 25 73 20  Parse, "view %s 
11950 69 73 20 63 69 72 63 75 6c 61 72 6c 79 20 64 65  is circularly de
11960 66 69 6e 65 64 22 2c 20 70 54 61 62 6c 65 2d 3e  fined", pTable->
11970 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72 65 74 75  zName);.    retu
11980 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 61 73 73 65  rn 1;.  }.  asse
11990 72 74 28 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c  rt( pTable->nCol
119a0 3e 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  >=0 );..  /* If 
119b0 77 65 20 67 65 74 20 74 68 69 73 20 66 61 72 2c  we get this far,
119c0 20 69 74 20 6d 65 61 6e 73 20 77 65 20 6e 65 65   it means we nee
119d0 64 20 74 6f 20 63 6f 6d 70 75 74 65 20 74 68 65  d to compute the
119e0 20 74 61 62 6c 65 20 6e 61 6d 65 73 2e 0a 20 20   table names..  
119f0 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65  ** Note that the
11a00 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
11a10 52 65 73 75 6c 74 53 65 74 4f 66 53 65 6c 65 63  ResultSetOfSelec
11a20 74 28 29 20 77 69 6c 6c 20 65 78 70 61 6e 64 20  t() will expand 
11a30 61 6e 79 0a 20 20 2a 2a 20 22 2a 22 20 65 6c 65  any.  ** "*" ele
11a40 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 72 65 73  ments in the res
11a50 75 6c 74 73 20 73 65 74 20 6f 66 20 74 68 65 20  ults set of the 
11a60 76 69 65 77 20 61 6e 64 20 77 69 6c 6c 20 61 73  view and will as
11a70 73 69 67 6e 20 63 75 72 73 6f 72 73 0a 20 20 2a  sign cursors.  *
11a80 2a 20 74 6f 20 74 68 65 20 65 6c 65 6d 65 6e 74  * to the element
11a90 73 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c  s of the FROM cl
11aa0 61 75 73 65 2e 20 20 42 75 74 20 77 65 20 64 6f  ause.  But we do
11ab0 20 6e 6f 74 20 77 61 6e 74 20 74 68 65 73 65 20   not want these 
11ac0 63 68 61 6e 67 65 73 0a 20 20 2a 2a 20 74 6f 20  changes.  ** to 
11ad0 62 65 20 70 65 72 6d 61 6e 65 6e 74 2e 20 20 53  be permanent.  S
11ae0 6f 20 74 68 65 20 63 6f 6d 70 75 74 61 74 69 6f  o the computatio
11af0 6e 20 69 73 20 64 6f 6e 65 20 6f 6e 20 61 20 63  n is done on a c
11b00 6f 70 79 20 6f 66 20 74 68 65 20 53 45 4c 45 43  opy of the SELEC
11b10 54 0a 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74  T.  ** statement
11b20 20 74 68 61 74 20 64 65 66 69 6e 65 73 20 74 68   that defines th
11b30 65 20 76 69 65 77 2e 0a 20 20 2a 2f 0a 20 20 61  e view..  */.  a
11b40 73 73 65 72 74 28 20 70 54 61 62 6c 65 2d 3e 70  ssert( pTable->p
11b50 53 65 6c 65 63 74 20 29 3b 0a 20 20 69 66 28 20  Select );.  if( 
11b60 70 54 61 62 6c 65 2d 3e 70 43 68 65 63 6b 20 29  pTable->pCheck )
11b70 7b 0a 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73  {.    db->lookas
11b80 69 64 65 2e 62 44 69 73 61 62 6c 65 2b 2b 3b 0a  ide.bDisable++;.
11b90 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d      sqlite3Colum
11ba0 6e 73 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70  nsFromExprList(p
11bb0 50 61 72 73 65 2c 20 70 54 61 62 6c 65 2d 3e 70  Parse, pTable->p
11bc0 43 68 65 63 6b 2c 20 0a 20 20 20 20 20 20 20 20  Check, .        
11bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11be0 20 20 20 20 20 20 20 26 70 54 61 62 6c 65 2d 3e         &pTable->
11bf0 6e 43 6f 6c 2c 20 26 70 54 61 62 6c 65 2d 3e 61  nCol, &pTable->a
11c00 43 6f 6c 29 3b 0a 20 20 20 20 64 62 2d 3e 6c 6f  Col);.    db->lo
11c10 6f 6b 61 73 69 64 65 2e 62 44 69 73 61 62 6c 65  okaside.bDisable
11c20 2d 2d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  --;.  }else{.   
11c30 20 70 53 65 6c 20 3d 20 73 71 6c 69 74 65 33 53   pSel = sqlite3S
11c40 65 6c 65 63 74 44 75 70 28 64 62 2c 20 70 54 61  electDup(db, pTa
11c50 62 6c 65 2d 3e 70 53 65 6c 65 63 74 2c 20 30 29  ble->pSelect, 0)
11c60 3b 0a 20 20 20 20 69 66 28 20 70 53 65 6c 20 29  ;.    if( pSel )
11c70 7b 0a 20 20 20 20 20 20 6e 20 3d 20 70 50 61 72  {.      n = pPar
11c80 73 65 2d 3e 6e 54 61 62 3b 0a 20 20 20 20 20 20  se->nTab;.      
11c90 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 73  sqlite3SrcListAs
11ca0 73 69 67 6e 43 75 72 73 6f 72 73 28 70 50 61 72  signCursors(pPar
11cb0 73 65 2c 20 70 53 65 6c 2d 3e 70 53 72 63 29 3b  se, pSel->pSrc);
11cc0 0a 20 20 20 20 20 20 70 54 61 62 6c 65 2d 3e 6e  .      pTable->n
11cd0 43 6f 6c 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20  Col = -1;.      
11ce0 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 44  db->lookaside.bD
11cf0 69 73 61 62 6c 65 2b 2b 3b 0a 23 69 66 6e 64 65  isable++;.#ifnde
11d00 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
11d10 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 20 20  THORIZATION.    
11d20 20 20 78 41 75 74 68 20 3d 20 64 62 2d 3e 78 41    xAuth = db->xA
11d30 75 74 68 3b 0a 20 20 20 20 20 20 64 62 2d 3e 78  uth;.      db->x
11d40 41 75 74 68 20 3d 20 30 3b 0a 20 20 20 20 20 20  Auth = 0;.      
11d50 70 53 65 6c 54 61 62 20 3d 20 73 71 6c 69 74 65  pSelTab = sqlite
11d60 33 52 65 73 75 6c 74 53 65 74 4f 66 53 65 6c 65  3ResultSetOfSele
11d70 63 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c 29  ct(pParse, pSel)
11d80 3b 0a 20 20 20 20 20 20 64 62 2d 3e 78 41 75 74  ;.      db->xAut
11d90 68 20 3d 20 78 41 75 74 68 3b 0a 23 65 6c 73 65  h = xAuth;.#else
11da0 0a 20 20 20 20 20 20 70 53 65 6c 54 61 62 20 3d  .      pSelTab =
11db0 20 73 71 6c 69 74 65 33 52 65 73 75 6c 74 53 65   sqlite3ResultSe
11dc0 74 4f 66 53 65 6c 65 63 74 28 70 50 61 72 73 65  tOfSelect(pParse
11dd0 2c 20 70 53 65 6c 29 3b 0a 23 65 6e 64 69 66 0a  , pSel);.#endif.
11de0 20 20 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73        db->lookas
11df0 69 64 65 2e 62 44 69 73 61 62 6c 65 2d 2d 3b 0a  ide.bDisable--;.
11e00 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 54        pParse->nT
11e10 61 62 20 3d 20 6e 3b 0a 20 20 20 20 20 20 69 66  ab = n;.      if
11e20 28 20 70 53 65 6c 54 61 62 20 29 7b 0a 20 20 20  ( pSelTab ){.   
11e30 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54 61       assert( pTa
11e40 62 6c 65 2d 3e 61 43 6f 6c 3d 3d 30 20 29 3b 0a  ble->aCol==0 );.
11e50 20 20 20 20 20 20 20 20 70 54 61 62 6c 65 2d 3e          pTable->
11e60 6e 43 6f 6c 20 3d 20 70 53 65 6c 54 61 62 2d 3e  nCol = pSelTab->
11e70 6e 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 70 54  nCol;.        pT
11e80 61 62 6c 65 2d 3e 61 43 6f 6c 20 3d 20 70 53 65  able->aCol = pSe
11e90 6c 54 61 62 2d 3e 61 43 6f 6c 3b 0a 20 20 20 20  lTab->aCol;.    
11ea0 20 20 20 20 70 53 65 6c 54 61 62 2d 3e 6e 43 6f      pSelTab->nCo
11eb0 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70  l = 0;.        p
11ec0 53 65 6c 54 61 62 2d 3e 61 43 6f 6c 20 3d 20 30  SelTab->aCol = 0
11ed0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
11ee0 33 44 65 6c 65 74 65 54 61 62 6c 65 28 64 62 2c  3DeleteTable(db,
11ef0 20 70 53 65 6c 54 61 62 29 3b 0a 20 20 20 20 20   pSelTab);.     
11f00 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
11f10 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c  e3SchemaMutexHel
11f20 64 28 64 62 2c 20 30 2c 20 70 54 61 62 6c 65 2d  d(db, 0, pTable-
11f30 3e 70 53 63 68 65 6d 61 29 20 29 3b 0a 20 20 20  >pSchema) );.   
11f40 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
11f50 20 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d    pTable->nCol =
11f60 20 30 3b 0a 20 20 20 20 20 20 20 20 6e 45 72 72   0;.        nErr
11f70 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ++;.      }.    
11f80 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44    sqlite3SelectD
11f90 65 6c 65 74 65 28 64 62 2c 20 70 53 65 6c 29 3b  elete(db, pSel);
11fa0 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20  .    } else {.  
11fb0 20 20 20 20 6e 45 72 72 2b 2b 3b 0a 20 20 20 20      nErr++;.    
11fc0 7d 0a 20 20 7d 0a 20 20 70 54 61 62 6c 65 2d 3e  }.  }.  pTable->
11fd0 70 53 63 68 65 6d 61 2d 3e 73 63 68 65 6d 61 46  pSchema->schemaF
11fe0 6c 61 67 73 20 7c 3d 20 44 42 5f 55 6e 72 65 73  lags |= DB_Unres
11ff0 65 74 56 69 65 77 73 3b 0a 23 65 6e 64 69 66 20  etViews;.#endif 
12000 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  /* SQLITE_OMIT_V
12010 49 45 57 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20  IEW */.  return 
12020 6e 45 72 72 3b 20 20 0a 7d 0a 23 65 6e 64 69 66  nErr;  .}.#endif
12030 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c   /* !defined(SQL
12040 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 7c  ITE_OMIT_VIEW) |
12050 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  | !defined(SQLIT
12060 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
12070 42 4c 45 29 20 2a 2f 0a 0a 23 69 66 6e 64 65 66  BLE) */..#ifndef
12080 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45   SQLITE_OMIT_VIE
12090 57 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 74 68  W./*.** Clear th
120a0 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 66  e column names f
120b0 72 6f 6d 20 65 76 65 72 79 20 56 49 45 57 20 69  rom every VIEW i
120c0 6e 20 64 61 74 61 62 61 73 65 20 69 64 78 2e 0a  n database idx..
120d0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
120e0 71 6c 69 74 65 56 69 65 77 52 65 73 65 74 41 6c  qliteViewResetAl
120f0 6c 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69  l(sqlite3 *db, i
12100 6e 74 20 69 64 78 29 7b 0a 20 20 48 61 73 68 45  nt idx){.  HashE
12110 6c 65 6d 20 2a 69 3b 0a 20 20 61 73 73 65 72 74  lem *i;.  assert
12120 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d  ( sqlite3SchemaM
12130 75 74 65 78 48 65 6c 64 28 64 62 2c 20 69 64 78  utexHeld(db, idx
12140 2c 20 30 29 20 29 3b 0a 20 20 69 66 28 20 21 44  , 0) );.  if( !D
12150 62 48 61 73 50 72 6f 70 65 72 74 79 28 64 62 2c  bHasProperty(db,
12160 20 69 64 78 2c 20 44 42 5f 55 6e 72 65 73 65 74   idx, DB_Unreset
12170 56 69 65 77 73 29 20 29 20 72 65 74 75 72 6e 3b  Views) ) return;
12180 0a 20 20 66 6f 72 28 69 3d 73 71 6c 69 74 65 48  .  for(i=sqliteH
12190 61 73 68 46 69 72 73 74 28 26 64 62 2d 3e 61 44  ashFirst(&db->aD
121a0 62 5b 69 64 78 5d 2e 70 53 63 68 65 6d 61 2d 3e  b[idx].pSchema->
121b0 74 62 6c 48 61 73 68 29 3b 20 69 3b 69 3d 73 71  tblHash); i;i=sq
121c0 6c 69 74 65 48 61 73 68 4e 65 78 74 28 69 29 29  liteHashNext(i))
121d0 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61  {.    Table *pTa
121e0 62 20 3d 20 73 71 6c 69 74 65 48 61 73 68 44 61  b = sqliteHashDa
121f0 74 61 28 69 29 3b 0a 20 20 20 20 69 66 28 20 70  ta(i);.    if( p
12200 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a  Tab->pSelect ){.
12210 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 6c        sqlite3Del
12220 65 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 64  eteColumnNames(d
12230 62 2c 20 70 54 61 62 29 3b 0a 20 20 20 20 20 20  b, pTab);.      
12240 70 54 61 62 2d 3e 61 43 6f 6c 20 3d 20 30 3b 0a  pTab->aCol = 0;.
12250 20 20 20 20 20 20 70 54 61 62 2d 3e 6e 43 6f 6c        pTab->nCol
12260 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 0;.    }.  }.
12270 20 20 44 62 43 6c 65 61 72 50 72 6f 70 65 72 74    DbClearPropert
12280 79 28 64 62 2c 20 69 64 78 2c 20 44 42 5f 55 6e  y(db, idx, DB_Un
12290 72 65 73 65 74 56 69 65 77 73 29 3b 0a 7d 0a 23  resetViews);.}.#
122a0 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 73 71  else.# define sq
122b0 6c 69 74 65 56 69 65 77 52 65 73 65 74 41 6c 6c  liteViewResetAll
122c0 28 41 2c 42 29 0a 23 65 6e 64 69 66 20 2f 2a 20  (A,B).#endif /* 
122d0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57  SQLITE_OMIT_VIEW
122e0 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20   */../*.** This 
122f0 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
12300 65 64 20 62 79 20 74 68 65 20 56 44 42 45 20 74  ed by the VDBE t
12310 6f 20 61 64 6a 75 73 74 20 74 68 65 20 69 6e 74  o adjust the int
12320 65 72 6e 61 6c 20 73 63 68 65 6d 61 0a 2a 2a 20  ernal schema.** 
12330 75 73 65 64 20 62 79 20 53 51 4c 69 74 65 20 77  used by SQLite w
12340 68 65 6e 20 74 68 65 20 62 74 72 65 65 20 6c 61  hen the btree la
12350 79 65 72 20 6d 6f 76 65 73 20 61 20 74 61 62 6c  yer moves a tabl
12360 65 20 72 6f 6f 74 20 70 61 67 65 2e 20 54 68 65  e root page. The
12370 0a 2a 2a 20 72 6f 6f 74 2d 70 61 67 65 20 6f 66  .** root-page of
12380 20 61 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65   a table or inde
12390 78 20 69 6e 20 64 61 74 61 62 61 73 65 20 69 44  x in database iD
123a0 62 20 68 61 73 20 63 68 61 6e 67 65 64 20 66 72  b has changed fr
123b0 6f 6d 20 69 46 72 6f 6d 0a 2a 2a 20 74 6f 20 69  om iFrom.** to i
123c0 54 6f 2e 0a 2a 2a 0a 2a 2a 20 54 69 63 6b 65 74  To..**.** Ticket
123d0 20 23 31 37 32 38 3a 20 20 54 68 65 20 73 79 6d   #1728:  The sym
123e0 62 6f 6c 20 74 61 62 6c 65 20 6d 69 67 68 74 20  bol table might 
123f0 73 74 69 6c 6c 20 63 6f 6e 74 61 69 6e 20 69 6e  still contain in
12400 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20 6f 6e 20  formation.** on 
12410 74 61 62 6c 65 73 20 61 6e 64 2f 6f 72 20 69 6e  tables and/or in
12420 64 69 63 65 73 20 74 68 61 74 20 61 72 65 20 74  dices that are t
12430 68 65 20 70 72 6f 63 65 73 73 20 6f 66 20 62 65  he process of be
12440 69 6e 67 20 64 65 6c 65 74 65 64 2e 0a 2a 2a 20  ing deleted..** 
12450 49 66 20 79 6f 75 20 61 72 65 20 75 6e 6c 75 63  If you are unluc
12460 6b 79 2c 20 6f 6e 65 20 6f 66 20 74 68 6f 73 65  ky, one of those
12470 20 64 65 6c 65 74 65 64 20 69 6e 64 69 63 65 73   deleted indices
12480 20 6f 72 20 74 61 62 6c 65 73 20 6d 69 67 68 74   or tables might
12490 0a 2a 2a 20 68 61 76 65 20 74 68 65 20 73 61 6d  .** have the sam
124a0 65 20 72 6f 6f 74 70 61 67 65 20 6e 75 6d 62 65  e rootpage numbe
124b0 72 20 61 73 20 74 68 65 20 72 65 61 6c 20 74 61  r as the real ta
124c0 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 74 68 61  ble or index tha
124d0 74 20 69 73 0a 2a 2a 20 62 65 69 6e 67 20 6d 6f  t is.** being mo
124e0 76 65 64 2e 20 20 53 6f 20 77 65 20 63 61 6e 6e  ved.  So we cann
124f0 6f 74 20 73 74 6f 70 20 73 65 61 72 63 68 69 6e  ot stop searchin
12500 67 20 61 66 74 65 72 20 74 68 65 20 66 69 72 73  g after the firs
12510 74 20 6d 61 74 63 68 20 0a 2a 2a 20 62 65 63 61  t match .** beca
12520 75 73 65 20 74 68 65 20 66 69 72 73 74 20 6d 61  use the first ma
12530 74 63 68 20 6d 69 67 68 74 20 62 65 20 66 6f 72  tch might be for
12540 20 6f 6e 65 20 6f 66 20 74 68 65 20 64 65 6c 65   one of the dele
12550 74 65 64 20 69 6e 64 69 63 65 73 0a 2a 2a 20 6f  ted indices.** o
12560 72 20 74 61 62 6c 65 73 20 61 6e 64 20 6e 6f 74  r tables and not
12570 20 74 68 65 20 74 61 62 6c 65 2f 69 6e 64 65 78   the table/index
12580 20 74 68 61 74 20 69 73 20 61 63 74 75 61 6c 6c   that is actuall
12590 79 20 62 65 69 6e 67 20 6d 6f 76 65 64 2e 0a 2a  y being moved..*
125a0 2a 20 57 65 20 6d 75 73 74 20 63 6f 6e 74 69 6e  * We must contin
125b0 75 65 20 6c 6f 6f 70 69 6e 67 20 75 6e 74 69 6c  ue looping until
125c0 20 61 6c 6c 20 74 61 62 6c 65 73 20 61 6e 64 20   all tables and 
125d0 69 6e 64 69 63 65 73 20 77 69 74 68 0a 2a 2a 20  indices with.** 
125e0 72 6f 6f 74 70 61 67 65 3d 3d 69 46 72 6f 6d 20  rootpage==iFrom 
125f0 68 61 76 65 20 62 65 65 6e 20 63 6f 6e 76 65 72  have been conver
12600 74 65 64 20 74 6f 20 68 61 76 65 20 61 20 72 6f  ted to have a ro
12610 6f 74 70 61 67 65 20 6f 66 20 69 54 6f 0a 2a 2a  otpage of iTo.**
12620 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 62 65 20   in order to be 
12630 63 65 72 74 61 69 6e 20 74 68 61 74 20 77 65 20  certain that we 
12640 67 6f 74 20 74 68 65 20 72 69 67 68 74 20 6f 6e  got the right on
12650 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  e..*/.#ifndef SQ
12660 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
12670 43 55 55 4d 0a 76 6f 69 64 20 73 71 6c 69 74 65  CUUM.void sqlite
12680 33 52 6f 6f 74 50 61 67 65 4d 6f 76 65 64 28 73  3RootPageMoved(s
12690 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20  qlite3 *db, int 
126a0 69 44 62 2c 20 69 6e 74 20 69 46 72 6f 6d 2c 20  iDb, int iFrom, 
126b0 69 6e 74 20 69 54 6f 29 7b 0a 20 20 48 61 73 68  int iTo){.  Hash
126c0 45 6c 65 6d 20 2a 70 45 6c 65 6d 3b 0a 20 20 48  Elem *pElem;.  H
126d0 61 73 68 20 2a 70 48 61 73 68 3b 0a 20 20 44 62  ash *pHash;.  Db
126e0 20 2a 70 44 62 3b 0a 0a 20 20 61 73 73 65 72 74   *pDb;..  assert
126f0 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d  ( sqlite3SchemaM
12700 75 74 65 78 48 65 6c 64 28 64 62 2c 20 69 44 62  utexHeld(db, iDb
12710 2c 20 30 29 20 29 3b 0a 20 20 70 44 62 20 3d 20  , 0) );.  pDb = 
12720 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a 20  &db->aDb[iDb];. 
12730 20 70 48 61 73 68 20 3d 20 26 70 44 62 2d 3e 70   pHash = &pDb->p
12740 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68 3b  Schema->tblHash;
12750 0a 20 20 66 6f 72 28 70 45 6c 65 6d 3d 73 71 6c  .  for(pElem=sql
12760 69 74 65 48 61 73 68 46 69 72 73 74 28 70 48 61  iteHashFirst(pHa
12770 73 68 29 3b 20 70 45 6c 65 6d 3b 20 70 45 6c 65  sh); pElem; pEle
12780 6d 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74  m=sqliteHashNext
12790 28 70 45 6c 65 6d 29 29 7b 0a 20 20 20 20 54 61  (pElem)){.    Ta
127a0 62 6c 65 20 2a 70 54 61 62 20 3d 20 73 71 6c 69  ble *pTab = sqli
127b0 74 65 48 61 73 68 44 61 74 61 28 70 45 6c 65 6d  teHashData(pElem
127c0 29 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62 2d  );.    if( pTab-
127d0 3e 74 6e 75 6d 3d 3d 69 46 72 6f 6d 20 29 7b 0a  >tnum==iFrom ){.
127e0 20 20 20 20 20 20 70 54 61 62 2d 3e 74 6e 75 6d        pTab->tnum
127f0 20 3d 20 69 54 6f 3b 0a 20 20 20 20 7d 0a 20 20   = iTo;.    }.  
12800 7d 0a 20 20 70 48 61 73 68 20 3d 20 26 70 44 62  }.  pHash = &pDb
12810 2d 3e 70 53 63 68 65 6d 61 2d 3e 69 64 78 48 61  ->pSchema->idxHa
12820 73 68 3b 0a 20 20 66 6f 72 28 70 45 6c 65 6d 3d  sh;.  for(pElem=
12830 73 71 6c 69 74 65 48 61 73 68 46 69 72 73 74 28  sqliteHashFirst(
12840 70 48 61 73 68 29 3b 20 70 45 6c 65 6d 3b 20 70  pHash); pElem; p
12850 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73 68 4e  Elem=sqliteHashN
12860 65 78 74 28 70 45 6c 65 6d 29 29 7b 0a 20 20 20  ext(pElem)){.   
12870 20 49 6e 64 65 78 20 2a 70 49 64 78 20 3d 20 73   Index *pIdx = s
12880 71 6c 69 74 65 48 61 73 68 44 61 74 61 28 70 45  qliteHashData(pE
12890 6c 65 6d 29 3b 0a 20 20 20 20 69 66 28 20 70 49  lem);.    if( pI
128a0 64 78 2d 3e 74 6e 75 6d 3d 3d 69 46 72 6f 6d 20  dx->tnum==iFrom 
128b0 29 7b 0a 20 20 20 20 20 20 70 49 64 78 2d 3e 74  ){.      pIdx->t
128c0 6e 75 6d 20 3d 20 69 54 6f 3b 0a 20 20 20 20 7d  num = iTo;.    }
128d0 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  .  }.}.#endif../
128e0 2a 0a 2a 2a 20 57 72 69 74 65 20 63 6f 64 65 20  *.** Write code 
128f0 74 6f 20 65 72 61 73 65 20 74 68 65 20 74 61 62  to erase the tab
12900 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67  le with root-pag
12910 65 20 69 54 61 62 6c 65 20 66 72 6f 6d 20 64 61  e iTable from da
12920 74 61 62 61 73 65 20 69 44 62 2e 0a 2a 2a 20 41  tabase iDb..** A
12930 6c 73 6f 20 77 72 69 74 65 20 63 6f 64 65 20 74  lso write code t
12940 6f 20 6d 6f 64 69 66 79 20 74 68 65 20 73 71 6c  o modify the sql
12950 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65  ite_master table
12960 20 61 6e 64 20 69 6e 74 65 72 6e 61 6c 20 73 63   and internal sc
12970 68 65 6d 61 0a 2a 2a 20 69 66 20 61 20 72 6f 6f  hema.** if a roo
12980 74 2d 70 61 67 65 20 6f 66 20 61 6e 6f 74 68 65  t-page of anothe
12990 72 20 74 61 62 6c 65 20 69 73 20 6d 6f 76 65 64  r table is moved
129a0 20 62 79 20 74 68 65 20 62 74 72 65 65 2d 6c 61   by the btree-la
129b0 79 65 72 20 77 68 69 6c 73 74 0a 2a 2a 20 65 72  yer whilst.** er
129c0 61 73 69 6e 67 20 69 54 61 62 6c 65 20 28 74 68  asing iTable (th
129d0 69 73 20 63 61 6e 20 68 61 70 70 65 6e 20 77 69  is can happen wi
129e0 74 68 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75  th an auto-vacuu
129f0 6d 20 64 61 74 61 62 61 73 65 29 2e 0a 2a 2f 20  m database)..*/ 
12a00 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64 65 73  .static void des
12a10 74 72 6f 79 52 6f 6f 74 50 61 67 65 28 50 61 72  troyRootPage(Par
12a20 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20  se *pParse, int 
12a30 69 54 61 62 6c 65 2c 20 69 6e 74 20 69 44 62 29  iTable, int iDb)
12a40 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71  {.  Vdbe *v = sq
12a50 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
12a60 72 73 65 29 3b 0a 20 20 69 6e 74 20 72 31 20 3d  rse);.  int r1 =
12a70 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
12a80 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 61 73  eg(pParse);.  as
12a90 73 65 72 74 28 20 69 54 61 62 6c 65 3e 31 20 29  sert( iTable>1 )
12aa0 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
12ab0 64 64 4f 70 33 28 76 2c 20 4f 50 5f 44 65 73 74  ddOp3(v, OP_Dest
12ac0 72 6f 79 2c 20 69 54 61 62 6c 65 2c 20 72 31 2c  roy, iTable, r1,
12ad0 20 69 44 62 29 3b 0a 20 20 73 71 6c 69 74 65 33   iDb);.  sqlite3
12ae0 4d 61 79 41 62 6f 72 74 28 70 50 61 72 73 65 29  MayAbort(pParse)
12af0 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
12b00 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
12b10 0a 20 20 2f 2a 20 4f 50 5f 44 65 73 74 72 6f 79  .  /* OP_Destroy
12b20 20 73 74 6f 72 65 73 20 61 6e 20 69 6e 20 69 6e   stores an in in
12b30 74 65 67 65 72 20 72 31 2e 20 49 66 20 74 68 69  teger r1. If thi
12b40 73 20 69 6e 74 65 67 65 72 0a 20 20 2a 2a 20 69  s integer.  ** i
12b50 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e  s non-zero, then
12b60 20 69 74 20 69 73 20 74 68 65 20 72 6f 6f 74 20   it is the root 
12b70 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 61  page number of a
12b80 20 74 61 62 6c 65 20 6d 6f 76 65 64 20 74 6f 0a   table moved to.
12b90 20 20 2a 2a 20 6c 6f 63 61 74 69 6f 6e 20 69 54    ** location iT
12ba0 61 62 6c 65 2e 20 54 68 65 20 66 6f 6c 6c 6f 77  able. The follow
12bb0 69 6e 67 20 63 6f 64 65 20 6d 6f 64 69 66 69 65  ing code modifie
12bc0 73 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73  s the sqlite_mas
12bd0 74 65 72 20 74 61 62 6c 65 20 74 6f 0a 20 20 2a  ter table to.  *
12be0 2a 20 72 65 66 6c 65 63 74 20 74 68 69 73 2e 0a  * reflect this..
12bf0 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 22 23    **.  ** The "#
12c00 4e 4e 4e 22 20 69 6e 20 74 68 65 20 53 51 4c 20  NNN" in the SQL 
12c10 69 73 20 61 20 73 70 65 63 69 61 6c 20 63 6f 6e  is a special con
12c20 73 74 61 6e 74 20 74 68 61 74 20 6d 65 61 6e 73  stant that means
12c30 20 77 68 61 74 65 76 65 72 20 76 61 6c 75 65 0a   whatever value.
12c40 20 20 2a 2a 20 69 73 20 69 6e 20 72 65 67 69 73    ** is in regis
12c50 74 65 72 20 4e 4e 4e 2e 20 20 53 65 65 20 67 72  ter NNN.  See gr
12c60 61 6d 6d 61 72 20 72 75 6c 65 73 20 61 73 73 6f  ammar rules asso
12c70 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20  ciated with the 
12c80 54 4b 5f 52 45 47 49 53 54 45 52 0a 20 20 2a 2a  TK_REGISTER.  **
12c90 20 74 6f 6b 65 6e 20 66 6f 72 20 61 64 64 69 74   token for addit
12ca0 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f  ional informatio
12cb0 6e 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  n..  */.  sqlite
12cc0 33 4e 65 73 74 65 64 50 61 72 73 65 28 70 50 61  3NestedParse(pPa
12cd0 72 73 65 2c 20 0a 20 20 20 20 20 22 55 50 44 41  rse, .     "UPDA
12ce0 54 45 20 25 51 2e 25 73 20 53 45 54 20 72 6f 6f  TE %Q.%s SET roo
12cf0 74 70 61 67 65 3d 25 64 20 57 48 45 52 45 20 23  tpage=%d WHERE #
12d00 25 64 20 41 4e 44 20 72 6f 6f 74 70 61 67 65 3d  %d AND rootpage=
12d10 23 25 64 22 2c 0a 20 20 20 20 20 70 50 61 72 73  #%d",.     pPars
12d20 65 2d 3e 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e  e->db->aDb[iDb].
12d30 7a 4e 61 6d 65 2c 20 53 43 48 45 4d 41 5f 54 41  zName, SCHEMA_TA
12d40 42 4c 45 28 69 44 62 29 2c 20 69 54 61 62 6c 65  BLE(iDb), iTable
12d50 2c 20 72 31 2c 20 72 31 29 3b 0a 23 65 6e 64 69  , r1, r1);.#endi
12d60 66 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61  f.  sqlite3Relea
12d70 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
12d80 2c 20 72 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  , r1);.}../*.** 
12d90 57 72 69 74 65 20 56 44 42 45 20 63 6f 64 65 20  Write VDBE code 
12da0 74 6f 20 65 72 61 73 65 20 74 61 62 6c 65 20 70  to erase table p
12db0 54 61 62 20 61 6e 64 20 61 6c 6c 20 61 73 73 6f  Tab and all asso
12dc0 63 69 61 74 65 64 20 69 6e 64 69 63 65 73 20 6f  ciated indices o
12dd0 6e 20 64 69 73 6b 2e 0a 2a 2a 20 43 6f 64 65 20  n disk..** Code 
12de0 74 6f 20 75 70 64 61 74 65 20 74 68 65 20 73 71  to update the sq
12df0 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c  lite_master tabl
12e00 65 73 20 61 6e 64 20 69 6e 74 65 72 6e 61 6c 20  es and internal 
12e10 73 63 68 65 6d 61 20 64 65 66 69 6e 69 74 69 6f  schema definitio
12e20 6e 73 0a 2a 2a 20 69 6e 20 63 61 73 65 20 61 20  ns.** in case a 
12e30 72 6f 6f 74 2d 70 61 67 65 20 62 65 6c 6f 6e 67  root-page belong
12e40 69 6e 67 20 74 6f 20 61 6e 6f 74 68 65 72 20 74  ing to another t
12e50 61 62 6c 65 20 69 73 20 6d 6f 76 65 64 20 62 79  able is moved by
12e60 20 74 68 65 20 62 74 72 65 65 20 6c 61 79 65 72   the btree layer
12e70 0a 2a 2a 20 69 73 20 61 6c 73 6f 20 61 64 64 65  .** is also adde
12e80 64 20 28 74 68 69 73 20 63 61 6e 20 68 61 70 70  d (this can happ
12e90 65 6e 20 77 69 74 68 20 61 6e 20 61 75 74 6f 2d  en with an auto-
12ea0 76 61 63 75 75 6d 20 64 61 74 61 62 61 73 65 29  vacuum database)
12eb0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
12ec0 20 64 65 73 74 72 6f 79 54 61 62 6c 65 28 50 61   destroyTable(Pa
12ed0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 61 62  rse *pParse, Tab
12ee0 6c 65 20 2a 70 54 61 62 29 7b 0a 23 69 66 64 65  le *pTab){.#ifde
12ef0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
12f00 54 4f 56 41 43 55 55 4d 0a 20 20 49 6e 64 65 78  TOVACUUM.  Index
12f10 20 2a 70 49 64 78 3b 0a 20 20 69 6e 74 20 69 44   *pIdx;.  int iD
12f20 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d  b = sqlite3Schem
12f30 61 54 6f 49 6e 64 65 78 28 70 50 61 72 73 65 2d  aToIndex(pParse-
12f40 3e 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65  >db, pTab->pSche
12f50 6d 61 29 3b 0a 20 20 64 65 73 74 72 6f 79 52 6f  ma);.  destroyRo
12f60 6f 74 50 61 67 65 28 70 50 61 72 73 65 2c 20 70  otPage(pParse, p
12f70 54 61 62 2d 3e 74 6e 75 6d 2c 20 69 44 62 29 3b  Tab->tnum, iDb);
12f80 0a 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62  .  for(pIdx=pTab
12f90 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20  ->pIndex; pIdx; 
12fa0 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74  pIdx=pIdx->pNext
12fb0 29 7b 0a 20 20 20 20 64 65 73 74 72 6f 79 52 6f  ){.    destroyRo
12fc0 6f 74 50 61 67 65 28 70 50 61 72 73 65 2c 20 70  otPage(pParse, p
12fd0 49 64 78 2d 3e 74 6e 75 6d 2c 20 69 44 62 29 3b  Idx->tnum, iDb);
12fe0 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20 2f 2a 20  .  }.#else.  /* 
12ff0 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  If the database 
13000 6d 61 79 20 62 65 20 61 75 74 6f 2d 76 61 63 75  may be auto-vacu
13010 75 6d 20 63 61 70 61 62 6c 65 20 28 69 66 20 53  um capable (if S
13020 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
13030 41 43 55 55 4d 0a 20 20 2a 2a 20 69 73 20 6e 6f  ACUUM.  ** is no
13040 74 20 64 65 66 69 6e 65 64 29 2c 20 74 68 65 6e  t defined), then
13050 20 69 74 20 69 73 20 69 6d 70 6f 72 74 61 6e 74   it is important
13060 20 74 6f 20 63 61 6c 6c 20 4f 50 5f 44 65 73 74   to call OP_Dest
13070 72 6f 79 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20  roy on the.  ** 
13080 74 61 62 6c 65 20 61 6e 64 20 69 6e 64 65 78 20  table and index 
13090 72 6f 6f 74 2d 70 61 67 65 73 20 69 6e 20 6f 72  root-pages in or
130a0 64 65 72 2c 20 73 74 61 72 74 69 6e 67 20 77 69  der, starting wi
130b0 74 68 20 74 68 65 20 6e 75 6d 65 72 69 63 61 6c  th the numerical
130c0 6c 79 20 0a 20 20 2a 2a 20 6c 61 72 67 65 73 74  ly .  ** largest
130d0 20 72 6f 6f 74 2d 70 61 67 65 20 6e 75 6d 62 65   root-page numbe
130e0 72 2e 20 54 68 69 73 20 67 75 61 72 61 6e 74 65  r. This guarante
130f0 65 73 20 74 68 61 74 20 6e 6f 6e 65 20 6f 66 20  es that none of 
13100 74 68 65 20 72 6f 6f 74 2d 70 61 67 65 73 0a 20  the root-pages. 
13110 20 2a 2a 20 74 6f 20 62 65 20 64 65 73 74 72 6f   ** to be destro
13120 79 65 64 20 69 73 20 72 65 6c 6f 63 61 74 65 64  yed is relocated
13130 20 62 79 20 61 6e 20 65 61 72 6c 69 65 72 20 4f   by an earlier O
13140 50 5f 44 65 73 74 72 6f 79 2e 20 69 2e 65 2e 20  P_Destroy. i.e. 
13150 69 66 20 74 68 65 0a 20 20 2a 2a 20 66 6f 6c 6c  if the.  ** foll
13160 6f 77 69 6e 67 20 77 65 72 65 20 63 6f 64 65 64  owing were coded
13170 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4f 50 5f 44  :.  **.  ** OP_D
13180 65 73 74 72 6f 79 20 34 20 30 0a 20 20 2a 2a 20  estroy 4 0.  ** 
13190 2e 2e 2e 0a 20 20 2a 2a 20 4f 50 5f 44 65 73 74  ....  ** OP_Dest
131a0 72 6f 79 20 35 20 30 0a 20 20 2a 2a 0a 20 20 2a  roy 5 0.  **.  *
131b0 2a 20 61 6e 64 20 72 6f 6f 74 20 70 61 67 65 20  * and root page 
131c0 35 20 68 61 70 70 65 6e 65 64 20 74 6f 20 62 65  5 happened to be
131d0 20 74 68 65 20 6c 61 72 67 65 73 74 20 72 6f 6f   the largest roo
131e0 74 2d 70 61 67 65 20 6e 75 6d 62 65 72 20 69 6e  t-page number in
131f0 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61   the.  ** databa
13200 73 65 2c 20 74 68 65 6e 20 72 6f 6f 74 20 70 61  se, then root pa
13210 67 65 20 35 20 77 6f 75 6c 64 20 62 65 20 6d 6f  ge 5 would be mo
13220 76 65 64 20 74 6f 20 70 61 67 65 20 34 20 62 79  ved to page 4 by
13230 20 74 68 65 20 0a 20 20 2a 2a 20 22 4f 50 5f 44   the .  ** "OP_D
13240 65 73 74 72 6f 79 20 34 20 30 22 20 6f 70 63 6f  estroy 4 0" opco
13250 64 65 2e 20 54 68 65 20 73 75 62 73 65 71 75 65  de. The subseque
13260 6e 74 20 22 4f 50 5f 44 65 73 74 72 6f 79 20 35  nt "OP_Destroy 5
13270 20 30 22 20 77 6f 75 6c 64 20 68 69 74 0a 20 20   0" would hit.  
13280 2a 2a 20 61 20 66 72 65 65 2d 6c 69 73 74 20 70  ** a free-list p
13290 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 6e 74 20  age..  */.  int 
132a0 69 54 61 62 20 3d 20 70 54 61 62 2d 3e 74 6e 75  iTab = pTab->tnu
132b0 6d 3b 0a 20 20 69 6e 74 20 69 44 65 73 74 72 6f  m;.  int iDestro
132c0 79 65 64 20 3d 20 30 3b 0a 0a 20 20 77 68 69 6c  yed = 0;..  whil
132d0 65 28 20 31 20 29 7b 0a 20 20 20 20 49 6e 64 65  e( 1 ){.    Inde
132e0 78 20 2a 70 49 64 78 3b 0a 20 20 20 20 69 6e 74  x *pIdx;.    int
132f0 20 69 4c 61 72 67 65 73 74 20 3d 20 30 3b 0a 0a   iLargest = 0;..
13300 20 20 20 20 69 66 28 20 69 44 65 73 74 72 6f 79      if( iDestroy
13310 65 64 3d 3d 30 20 7c 7c 20 69 54 61 62 3c 69 44  ed==0 || iTab<iD
13320 65 73 74 72 6f 79 65 64 20 29 7b 0a 20 20 20 20  estroyed ){.    
13330 20 20 69 4c 61 72 67 65 73 74 20 3d 20 69 54 61    iLargest = iTa
13340 62 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72  b;.    }.    for
13350 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64  (pIdx=pTab->pInd
13360 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70  ex; pIdx; pIdx=p
13370 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  Idx->pNext){.   
13380 20 20 20 69 6e 74 20 69 49 64 78 20 3d 20 70 49     int iIdx = pI
13390 64 78 2d 3e 74 6e 75 6d 3b 0a 20 20 20 20 20 20  dx->tnum;.      
133a0 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e 70 53  assert( pIdx->pS
133b0 63 68 65 6d 61 3d 3d 70 54 61 62 2d 3e 70 53 63  chema==pTab->pSc
133c0 68 65 6d 61 20 29 3b 0a 20 20 20 20 20 20 69 66  hema );.      if
133d0 28 20 28 69 44 65 73 74 72 6f 79 65 64 3d 3d 30  ( (iDestroyed==0
133e0 20 7c 7c 20 28 69 49 64 78 3c 69 44 65 73 74 72   || (iIdx<iDestr
133f0 6f 79 65 64 29 29 20 26 26 20 69 49 64 78 3e 69  oyed)) && iIdx>i
13400 4c 61 72 67 65 73 74 20 29 7b 0a 20 20 20 20 20  Largest ){.     
13410 20 20 20 69 4c 61 72 67 65 73 74 20 3d 20 69 49     iLargest = iI
13420 64 78 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  dx;.      }.    
13430 7d 0a 20 20 20 20 69 66 28 20 69 4c 61 72 67 65  }.    if( iLarge
13440 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  st==0 ){.      r
13450 65 74 75 72 6e 3b 0a 20 20 20 20 7d 65 6c 73 65  eturn;.    }else
13460 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 44 62 20  {.      int iDb 
13470 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54  = sqlite3SchemaT
13480 6f 49 6e 64 65 78 28 70 50 61 72 73 65 2d 3e 64  oIndex(pParse->d
13490 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61  b, pTab->pSchema
134a0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
134b0 20 69 44 62 3e 3d 30 20 26 26 20 69 44 62 3c 70   iDb>=0 && iDb<p
134c0 50 61 72 73 65 2d 3e 64 62 2d 3e 6e 44 62 20 29  Parse->db->nDb )
134d0 3b 0a 20 20 20 20 20 20 64 65 73 74 72 6f 79 52  ;.      destroyR
134e0 6f 6f 74 50 61 67 65 28 70 50 61 72 73 65 2c 20  ootPage(pParse, 
134f0 69 4c 61 72 67 65 73 74 2c 20 69 44 62 29 3b 0a  iLargest, iDb);.
13500 20 20 20 20 20 20 69 44 65 73 74 72 6f 79 65 64        iDestroyed
13510 20 3d 20 69 4c 61 72 67 65 73 74 3b 0a 20 20 20   = iLargest;.   
13520 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a   }.  }.#endif.}.
13530 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 65 6e  ./*.** Remove en
13540 74 72 69 65 73 20 66 72 6f 6d 20 74 68 65 20 73  tries from the s
13550 71 6c 69 74 65 5f 73 74 61 74 4e 20 74 61 62 6c  qlite_statN tabl
13560 65 73 20 28 66 6f 72 20 4e 20 69 6e 20 28 31 2c  es (for N in (1,
13570 32 2c 33 29 29 0a 2a 2a 20 61 66 74 65 72 20 61  2,3)).** after a
13580 20 44 52 4f 50 20 49 4e 44 45 58 20 6f 72 20 44   DROP INDEX or D
13590 52 4f 50 20 54 41 42 4c 45 20 63 6f 6d 6d 61 6e  ROP TABLE comman
135a0 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  d..*/.static voi
135b0 64 20 73 71 6c 69 74 65 33 43 6c 65 61 72 53 74  d sqlite3ClearSt
135c0 61 74 54 61 62 6c 65 73 28 0a 20 20 50 61 72 73  atTables(.  Pars
135d0 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
135e0 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e     /* The parsin
135f0 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69  g context */.  i
13600 6e 74 20 69 44 62 2c 20 20 20 20 20 20 20 20 20  nt iDb,         
13610 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74        /* The dat
13620 61 62 61 73 65 20 6e 75 6d 62 65 72 20 2a 2f 0a  abase number */.
13630 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54    const char *zT
13640 79 70 65 2c 20 20 20 20 20 2f 2a 20 22 69 64 78  ype,     /* "idx
13650 22 20 6f 72 20 22 74 62 6c 22 20 2a 2f 0a 20 20  " or "tbl" */.  
13660 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
13670 65 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f  e      /* Name o
13680 66 20 69 6e 64 65 78 20 6f 72 20 74 61 62 6c 65  f index or table
13690 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a   */.){.  int i;.
136a0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44    const char *zD
136b0 62 4e 61 6d 65 20 3d 20 70 50 61 72 73 65 2d 3e  bName = pParse->
136c0 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61  db->aDb[iDb].zNa
136d0 6d 65 3b 0a 20 20 66 6f 72 28 69 3d 31 3b 20 69  me;.  for(i=1; i
136e0 3c 3d 34 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63  <=4; i++){.    c
136f0 68 61 72 20 7a 54 61 62 5b 32 34 5d 3b 0a 20 20  har zTab[24];.  
13700 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
13710 74 66 28 73 69 7a 65 6f 66 28 7a 54 61 62 29 2c  tf(sizeof(zTab),
13720 7a 54 61 62 2c 22 73 71 6c 69 74 65 5f 73 74 61  zTab,"sqlite_sta
13730 74 25 64 22 2c 69 29 3b 0a 20 20 20 20 69 66 28  t%d",i);.    if(
13740 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c   sqlite3FindTabl
13750 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 7a 54  e(pParse->db, zT
13760 61 62 2c 20 7a 44 62 4e 61 6d 65 29 20 29 7b 0a  ab, zDbName) ){.
13770 20 20 20 20 20 20 73 71 6c 69 74 65 33 4e 65 73        sqlite3Nes
13780 74 65 64 50 61 72 73 65 28 70 50 61 72 73 65 2c  tedParse(pParse,
13790 0a 20 20 20 20 20 20 20 20 22 44 45 4c 45 54 45  .        "DELETE
137a0 20 46 52 4f 4d 20 25 51 2e 25 73 20 57 48 45 52   FROM %Q.%s WHER
137b0 45 20 25 73 3d 25 51 22 2c 0a 20 20 20 20 20 20  E %s=%Q",.      
137c0 20 20 7a 44 62 4e 61 6d 65 2c 20 7a 54 61 62 2c    zDbName, zTab,
137d0 20 7a 54 79 70 65 2c 20 7a 4e 61 6d 65 0a 20 20   zType, zName.  
137e0 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d      );.    }.  }
137f0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
13800 74 65 20 63 6f 64 65 20 74 6f 20 64 72 6f 70 20  te code to drop 
13810 61 20 74 61 62 6c 65 2e 0a 2a 2f 0a 76 6f 69 64  a table..*/.void
13820 20 73 71 6c 69 74 65 33 43 6f 64 65 44 72 6f 70   sqlite3CodeDrop
13830 54 61 62 6c 65 28 50 61 72 73 65 20 2a 70 50 61  Table(Parse *pPa
13840 72 73 65 2c 20 54 61 62 6c 65 20 2a 70 54 61 62  rse, Table *pTab
13850 2c 20 69 6e 74 20 69 44 62 2c 20 69 6e 74 20 69  , int iDb, int i
13860 73 56 69 65 77 29 7b 0a 20 20 56 64 62 65 20 2a  sView){.  Vdbe *
13870 76 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  v;.  sqlite3 *db
13880 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
13890 20 54 72 69 67 67 65 72 20 2a 70 54 72 69 67 67   Trigger *pTrigg
138a0 65 72 3b 0a 20 20 44 62 20 2a 70 44 62 20 3d 20  er;.  Db *pDb = 
138b0 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a 0a  &db->aDb[iDb];..
138c0 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74    v = sqlite3Get
138d0 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
138e0 61 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b 0a  assert( v!=0 );.
138f0 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72    sqlite3BeginWr
13900 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61  iteOperation(pPa
13910 72 73 65 2c 20 31 2c 20 69 44 62 29 3b 0a 0a 23  rse, 1, iDb);..#
13920 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
13930 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
13940 20 20 69 66 28 20 49 73 56 69 72 74 75 61 6c 28    if( IsVirtual(
13950 70 54 61 62 29 20 29 7b 0a 20 20 20 20 73 71 6c  pTab) ){.    sql
13960 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 28 76  ite3VdbeAddOp0(v
13970 2c 20 4f 50 5f 56 42 65 67 69 6e 29 3b 0a 20 20  , OP_VBegin);.  
13980 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 44  }.#endif..  /* D
13990 72 6f 70 20 61 6c 6c 20 74 72 69 67 67 65 72 73  rop all triggers
139a0 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
139b0 20 74 68 65 20 74 61 62 6c 65 20 62 65 69 6e 67   the table being
139c0 20 64 72 6f 70 70 65 64 2e 20 43 6f 64 65 0a 20   dropped. Code. 
139d0 20 2a 2a 20 69 73 20 67 65 6e 65 72 61 74 65 64   ** is generated
139e0 20 74 6f 20 72 65 6d 6f 76 65 20 65 6e 74 72 69   to remove entri
139f0 65 73 20 66 72 6f 6d 20 73 71 6c 69 74 65 5f 6d  es from sqlite_m
13a00 61 73 74 65 72 20 61 6e 64 2f 6f 72 0a 20 20 2a  aster and/or.  *
13a10 2a 20 73 71 6c 69 74 65 5f 74 65 6d 70 5f 6d 61  * sqlite_temp_ma
13a20 73 74 65 72 20 69 66 20 72 65 71 75 69 72 65 64  ster if required
13a30 2e 0a 20 20 2a 2f 0a 20 20 70 54 72 69 67 67 65  ..  */.  pTrigge
13a40 72 20 3d 20 73 71 6c 69 74 65 33 54 72 69 67 67  r = sqlite3Trigg
13a50 65 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70  erList(pParse, p
13a60 54 61 62 29 3b 0a 20 20 77 68 69 6c 65 28 20 70  Tab);.  while( p
13a70 54 72 69 67 67 65 72 20 29 7b 0a 20 20 20 20 61  Trigger ){.    a
13a80 73 73 65 72 74 28 20 70 54 72 69 67 67 65 72 2d  ssert( pTrigger-
13a90 3e 70 53 63 68 65 6d 61 3d 3d 70 54 61 62 2d 3e  >pSchema==pTab->
13aa0 70 53 63 68 65 6d 61 20 7c 7c 20 0a 20 20 20 20  pSchema || .    
13ab0 20 20 20 20 70 54 72 69 67 67 65 72 2d 3e 70 53      pTrigger->pS
13ac0 63 68 65 6d 61 3d 3d 64 62 2d 3e 61 44 62 5b 31  chema==db->aDb[1
13ad0 5d 2e 70 53 63 68 65 6d 61 20 29 3b 0a 20 20 20  ].pSchema );.   
13ae0 20 73 71 6c 69 74 65 33 44 72 6f 70 54 72 69 67   sqlite3DropTrig
13af0 67 65 72 50 74 72 28 70 50 61 72 73 65 2c 20 70  gerPtr(pParse, p
13b00 54 72 69 67 67 65 72 29 3b 0a 20 20 20 20 70 54  Trigger);.    pT
13b10 72 69 67 67 65 72 20 3d 20 70 54 72 69 67 67 65  rigger = pTrigge
13b20 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 0a 23  r->pNext;.  }..#
13b30 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
13b40 49 54 5f 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54  IT_AUTOINCREMENT
13b50 0a 20 20 2f 2a 20 52 65 6d 6f 76 65 20 61 6e 79  .  /* Remove any
13b60 20 65 6e 74 72 69 65 73 20 6f 66 20 74 68 65 20   entries of the 
13b70 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 20  sqlite_sequence 
13b80 74 61 62 6c 65 20 61 73 73 6f 63 69 61 74 65 64  table associated
13b90 20 77 69 74 68 0a 20 20 2a 2a 20 74 68 65 20 74   with.  ** the t
13ba0 61 62 6c 65 20 62 65 69 6e 67 20 64 72 6f 70 70  able being dropp
13bb0 65 64 2e 20 54 68 69 73 20 69 73 20 64 6f 6e 65  ed. This is done
13bc0 20 62 65 66 6f 72 65 20 74 68 65 20 74 61 62 6c   before the tabl
13bd0 65 20 69 73 20 64 72 6f 70 70 65 64 0a 20 20 2a  e is dropped.  *
13be0 2a 20 61 74 20 74 68 65 20 62 74 72 65 65 20 6c  * at the btree l
13bf0 65 76 65 6c 2c 20 69 6e 20 63 61 73 65 20 74 68  evel, in case th
13c00 65 20 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63  e sqlite_sequenc
13c10 65 20 74 61 62 6c 65 20 6e 65 65 64 73 20 74 6f  e table needs to
13c20 0a 20 20 2a 2a 20 6d 6f 76 65 20 61 73 20 61 20  .  ** move as a 
13c30 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20 64 72  result of the dr
13c40 6f 70 20 28 63 61 6e 20 68 61 70 70 65 6e 20 69  op (can happen i
13c50 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 6d 6f  n auto-vacuum mo
13c60 64 65 29 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  de)..  */.  if( 
13c70 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 26  pTab->tabFlags &
13c80 20 54 46 5f 41 75 74 6f 69 6e 63 72 65 6d 65 6e   TF_Autoincremen
13c90 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  t ){.    sqlite3
13ca0 4e 65 73 74 65 64 50 61 72 73 65 28 70 50 61 72  NestedParse(pPar
13cb0 73 65 2c 0a 20 20 20 20 20 20 22 44 45 4c 45 54  se,.      "DELET
13cc0 45 20 46 52 4f 4d 20 25 51 2e 73 71 6c 69 74 65  E FROM %Q.sqlite
13cd0 5f 73 65 71 75 65 6e 63 65 20 57 48 45 52 45 20  _sequence WHERE 
13ce0 6e 61 6d 65 3d 25 51 22 2c 0a 20 20 20 20 20 20  name=%Q",.      
13cf0 70 44 62 2d 3e 7a 4e 61 6d 65 2c 20 70 54 61 62  pDb->zName, pTab
13d00 2d 3e 7a 4e 61 6d 65 0a 20 20 20 20 29 3b 0a 20  ->zName.    );. 
13d10 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
13d20 44 72 6f 70 20 61 6c 6c 20 53 51 4c 49 54 45 5f  Drop all SQLITE_
13d30 4d 41 53 54 45 52 20 74 61 62 6c 65 20 61 6e 64  MASTER table and
13d40 20 69 6e 64 65 78 20 65 6e 74 72 69 65 73 20 74   index entries t
13d50 68 61 74 20 72 65 66 65 72 20 74 6f 20 74 68 65  hat refer to the
13d60 0a 20 20 2a 2a 20 74 61 62 6c 65 2e 20 54 68 65  .  ** table. The
13d70 20 70 72 6f 67 72 61 6d 20 6e 61 6d 65 20 6c 6f   program name lo
13d80 6f 70 73 20 74 68 72 6f 75 67 68 20 74 68 65 20  ops through the 
13d90 6d 61 73 74 65 72 20 74 61 62 6c 65 20 61 6e 64  master table and
13da0 20 64 65 6c 65 74 65 73 0a 20 20 2a 2a 20 65 76   deletes.  ** ev
13db0 65 72 79 20 72 6f 77 20 74 68 61 74 20 72 65 66  ery row that ref
13dc0 65 72 73 20 74 6f 20 61 20 74 61 62 6c 65 20 6f  ers to a table o
13dd0 66 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 20  f the same name 
13de0 61 73 20 74 68 65 20 6f 6e 65 20 62 65 69 6e 67  as the one being
13df0 0a 20 20 2a 2a 20 64 72 6f 70 70 65 64 2e 20 54  .  ** dropped. T
13e00 72 69 67 67 65 72 73 20 61 72 65 20 68 61 6e 64  riggers are hand
13e10 6c 65 64 20 73 65 70 61 72 61 74 65 6c 79 20 62  led separately b
13e20 65 63 61 75 73 65 20 61 20 74 72 69 67 67 65 72  ecause a trigger
13e30 20 63 61 6e 20 62 65 0a 20 20 2a 2a 20 63 72 65   can be.  ** cre
13e40 61 74 65 64 20 69 6e 20 74 68 65 20 74 65 6d 70  ated in the temp
13e50 20 64 61 74 61 62 61 73 65 20 74 68 61 74 20 72   database that r
13e60 65 66 65 72 73 20 74 6f 20 61 20 74 61 62 6c 65  efers to a table
13e70 20 69 6e 20 61 6e 6f 74 68 65 72 0a 20 20 2a 2a   in another.  **
13e80 20 64 61 74 61 62 61 73 65 2e 0a 20 20 2a 2f 0a   database..  */.
13e90 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50    sqlite3NestedP
13ea0 61 72 73 65 28 70 50 61 72 73 65 2c 20 0a 20 20  arse(pParse, .  
13eb0 20 20 20 20 22 44 45 4c 45 54 45 20 46 52 4f 4d      "DELETE FROM
13ec0 20 25 51 2e 25 73 20 57 48 45 52 45 20 74 62 6c   %Q.%s WHERE tbl
13ed0 5f 6e 61 6d 65 3d 25 51 20 61 6e 64 20 74 79 70  _name=%Q and typ
13ee0 65 21 3d 27 74 72 69 67 67 65 72 27 22 2c 0a 20  e!='trigger'",. 
13ef0 20 20 20 20 20 70 44 62 2d 3e 7a 4e 61 6d 65 2c       pDb->zName,
13f00 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 44   SCHEMA_TABLE(iD
13f10 62 29 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29  b), pTab->zName)
13f20 3b 0a 20 20 69 66 28 20 21 69 73 56 69 65 77 20  ;.  if( !isView 
13f30 26 26 20 21 49 73 56 69 72 74 75 61 6c 28 70 54  && !IsVirtual(pT
13f40 61 62 29 20 29 7b 0a 20 20 20 20 64 65 73 74 72  ab) ){.    destr
13f50 6f 79 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20  oyTable(pParse, 
13f60 70 54 61 62 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  pTab);.  }..  /*
13f70 20 52 65 6d 6f 76 65 20 74 68 65 20 74 61 62 6c   Remove the tabl
13f80 65 20 65 6e 74 72 79 20 66 72 6f 6d 20 53 51 4c  e entry from SQL
13f90 69 74 65 27 73 20 69 6e 74 65 72 6e 61 6c 20 73  ite's internal s
13fa0 63 68 65 6d 61 20 61 6e 64 20 6d 6f 64 69 66 79  chema and modify
13fb0 0a 20 20 2a 2a 20 74 68 65 20 73 63 68 65 6d 61  .  ** the schema
13fc0 20 63 6f 6f 6b 69 65 2e 0a 20 20 2a 2f 0a 20 20   cookie..  */.  
13fd0 69 66 28 20 49 73 56 69 72 74 75 61 6c 28 70 54  if( IsVirtual(pT
13fe0 61 62 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ab) ){.    sqlit
13ff0 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
14000 4f 50 5f 56 44 65 73 74 72 6f 79 2c 20 69 44 62  OP_VDestroy, iDb
14010 2c 20 30 2c 20 30 2c 20 70 54 61 62 2d 3e 7a 4e  , 0, 0, pTab->zN
14020 61 6d 65 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 73  ame, 0);.  }.  s
14030 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
14040 28 76 2c 20 4f 50 5f 44 72 6f 70 54 61 62 6c 65  (v, OP_DropTable
14050 2c 20 69 44 62 2c 20 30 2c 20 30 2c 20 70 54 61  , iDb, 0, 0, pTa
14060 62 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20  b->zName, 0);.  
14070 73 71 6c 69 74 65 33 43 68 61 6e 67 65 43 6f 6f  sqlite3ChangeCoo
14080 6b 69 65 28 70 50 61 72 73 65 2c 20 69 44 62 29  kie(pParse, iDb)
14090 3b 0a 20 20 73 71 6c 69 74 65 56 69 65 77 52 65  ;.  sqliteViewRe
140a0 73 65 74 41 6c 6c 28 64 62 2c 20 69 44 62 29 3b  setAll(db, iDb);
140b0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
140c0 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
140d0 20 74 6f 20 64 6f 20 74 68 65 20 77 6f 72 6b 20   to do the work 
140e0 6f 66 20 61 20 44 52 4f 50 20 54 41 42 4c 45 20  of a DROP TABLE 
140f0 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 70 4e  statement..** pN
14100 61 6d 65 20 69 73 20 74 68 65 20 6e 61 6d 65 20  ame is the name 
14110 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20  of the table to 
14120 62 65 20 64 72 6f 70 70 65 64 2e 0a 2a 2f 0a 76  be dropped..*/.v
14130 6f 69 64 20 73 71 6c 69 74 65 33 44 72 6f 70 54  oid sqlite3DropT
14140 61 62 6c 65 28 50 61 72 73 65 20 2a 70 50 61 72  able(Parse *pPar
14150 73 65 2c 20 53 72 63 4c 69 73 74 20 2a 70 4e 61  se, SrcList *pNa
14160 6d 65 2c 20 69 6e 74 20 69 73 56 69 65 77 2c 20  me, int isView, 
14170 69 6e 74 20 6e 6f 45 72 72 29 7b 0a 20 20 54 61  int noErr){.  Ta
14180 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 56 64 62  ble *pTab;.  Vdb
14190 65 20 2a 76 3b 0a 20 20 73 71 6c 69 74 65 33 20  e *v;.  sqlite3 
141a0 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
141b0 3b 0a 20 20 69 6e 74 20 69 44 62 3b 0a 0a 20 20  ;.  int iDb;..  
141c0 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
141d0 69 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f  iled ){.    goto
141e0 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65   exit_drop_table
141f0 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
14200 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 20  pParse->nErr==0 
14210 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4e 61  );.  assert( pNa
14220 6d 65 2d 3e 6e 53 72 63 3d 3d 31 20 29 3b 0a 20  me->nSrc==1 );. 
14230 20 69 66 28 20 73 71 6c 69 74 65 33 52 65 61 64   if( sqlite3Read
14240 53 63 68 65 6d 61 28 70 50 61 72 73 65 29 20 29  Schema(pParse) )
14250 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f   goto exit_drop_
14260 74 61 62 6c 65 3b 0a 20 20 69 66 28 20 6e 6f 45  table;.  if( noE
14270 72 72 20 29 20 64 62 2d 3e 73 75 70 70 72 65 73  rr ) db->suppres
14280 73 45 72 72 2b 2b 3b 0a 20 20 70 54 61 62 20 3d  sErr++;.  pTab =
14290 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61   sqlite3LocateTa
142a0 62 6c 65 49 74 65 6d 28 70 50 61 72 73 65 2c 20  bleItem(pParse, 
142b0 69 73 56 69 65 77 2c 20 26 70 4e 61 6d 65 2d 3e  isView, &pName->
142c0 61 5b 30 5d 29 3b 0a 20 20 69 66 28 20 6e 6f 45  a[0]);.  if( noE
142d0 72 72 20 29 20 64 62 2d 3e 73 75 70 70 72 65 73  rr ) db->suppres
142e0 73 45 72 72 2d 2d 3b 0a 0a 20 20 69 66 28 20 70  sErr--;..  if( p
142f0 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66  Tab==0 ){.    if
14300 28 20 6e 6f 45 72 72 20 29 20 73 71 6c 69 74 65  ( noErr ) sqlite
14310 33 43 6f 64 65 56 65 72 69 66 79 4e 61 6d 65 64  3CodeVerifyNamed
14320 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20 70  Schema(pParse, p
14330 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 44 61 74 61  Name->a[0].zData
14340 62 61 73 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20  base);.    goto 
14350 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b  exit_drop_table;
14360 0a 20 20 7d 0a 20 20 69 44 62 20 3d 20 73 71 6c  .  }.  iDb = sql
14370 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65  ite3SchemaToInde
14380 78 28 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68  x(db, pTab->pSch
14390 65 6d 61 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ema);.  assert( 
143a0 69 44 62 3e 3d 30 20 26 26 20 69 44 62 3c 64 62  iDb>=0 && iDb<db
143b0 2d 3e 6e 44 62 20 29 3b 0a 0a 20 20 2f 2a 20 49  ->nDb );..  /* I
143c0 66 20 70 54 61 62 20 69 73 20 61 20 76 69 72 74  f pTab is a virt
143d0 75 61 6c 20 74 61 62 6c 65 2c 20 63 61 6c 6c 20  ual table, call 
143e0 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d  ViewGetColumnNam
143f0 65 73 28 29 20 74 6f 20 65 6e 73 75 72 65 0a 20  es() to ensure. 
14400 20 2a 2a 20 69 74 20 69 73 20 69 6e 69 74 69 61   ** it is initia
14410 6c 69 7a 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66  lized..  */.  if
14420 28 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62  ( IsVirtual(pTab
14430 29 20 26 26 20 73 71 6c 69 74 65 33 56 69 65 77  ) && sqlite3View
14440 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70  GetColumnNames(p
14450 50 61 72 73 65 2c 20 70 54 61 62 29 20 29 7b 0a  Parse, pTab) ){.
14460 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72      goto exit_dr
14470 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 23 69  op_table;.  }.#i
14480 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
14490 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a  T_AUTHORIZATION.
144a0 20 20 7b 0a 20 20 20 20 69 6e 74 20 63 6f 64 65    {.    int code
144b0 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  ;.    const char
144c0 20 2a 7a 54 61 62 20 3d 20 53 43 48 45 4d 41 5f   *zTab = SCHEMA_
144d0 54 41 42 4c 45 28 69 44 62 29 3b 0a 20 20 20 20  TABLE(iDb);.    
144e0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 20  const char *zDb 
144f0 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a  = db->aDb[iDb].z
14500 4e 61 6d 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20  Name;.    const 
14510 63 68 61 72 20 2a 7a 41 72 67 32 20 3d 20 30 3b  char *zArg2 = 0;
14520 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
14530 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65  AuthCheck(pParse
14540 2c 20 53 51 4c 49 54 45 5f 44 45 4c 45 54 45 2c  , SQLITE_DELETE,
14550 20 7a 54 61 62 2c 20 30 2c 20 7a 44 62 29 29 7b   zTab, 0, zDb)){
14560 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74  .      goto exit
14570 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 20  _drop_table;.   
14580 20 7d 0a 20 20 20 20 69 66 28 20 69 73 56 69 65   }.    if( isVie
14590 77 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 21  w ){.      if( !
145a0 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26 26 20 69  OMIT_TEMPDB && i
145b0 44 62 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 20  Db==1 ){.       
145c0 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44   code = SQLITE_D
145d0 52 4f 50 5f 54 45 4d 50 5f 56 49 45 57 3b 0a 20  ROP_TEMP_VIEW;. 
145e0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
145f0 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54      code = SQLIT
14600 45 5f 44 52 4f 50 5f 56 49 45 57 3b 0a 20 20 20  E_DROP_VIEW;.   
14610 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c     }.#ifndef SQL
14620 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
14630 54 41 42 4c 45 0a 20 20 20 20 7d 65 6c 73 65 20  TABLE.    }else 
14640 69 66 28 20 49 73 56 69 72 74 75 61 6c 28 70 54  if( IsVirtual(pT
14650 61 62 29 20 29 7b 0a 20 20 20 20 20 20 63 6f 64  ab) ){.      cod
14660 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f  e = SQLITE_DROP_
14670 56 54 41 42 4c 45 3b 0a 20 20 20 20 20 20 7a 41  VTABLE;.      zA
14680 72 67 32 20 3d 20 73 71 6c 69 74 65 33 47 65 74  rg2 = sqlite3Get
14690 56 54 61 62 6c 65 28 64 62 2c 20 70 54 61 62 29  VTable(db, pTab)
146a0 2d 3e 70 4d 6f 64 2d 3e 7a 4e 61 6d 65 3b 0a 23  ->pMod->zName;.#
146b0 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c 73 65 7b  endif.    }else{
146c0 0a 20 20 20 20 20 20 69 66 28 20 21 4f 4d 49 54  .      if( !OMIT
146d0 5f 54 45 4d 50 44 42 20 26 26 20 69 44 62 3d 3d  _TEMPDB && iDb==
146e0 31 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 64  1 ){.        cod
146f0 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f  e = SQLITE_DROP_
14700 54 45 4d 50 5f 54 41 42 4c 45 3b 0a 20 20 20 20  TEMP_TABLE;.    
14710 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
14720 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44   code = SQLITE_D
14730 52 4f 50 5f 54 41 42 4c 45 3b 0a 20 20 20 20 20  ROP_TABLE;.     
14740 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
14750 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63   sqlite3AuthChec
14760 6b 28 70 50 61 72 73 65 2c 20 63 6f 64 65 2c 20  k(pParse, code, 
14770 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 41 72  pTab->zName, zAr
14780 67 32 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20  g2, zDb) ){.    
14790 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70    goto exit_drop
147a0 5f 74 61 62 6c 65 3b 0a 20 20 20 20 7d 0a 20 20  _table;.    }.  
147b0 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74    if( sqlite3Aut
147c0 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53  hCheck(pParse, S
147d0 51 4c 49 54 45 5f 44 45 4c 45 54 45 2c 20 70 54  QLITE_DELETE, pT
147e0 61 62 2d 3e 7a 4e 61 6d 65 2c 20 30 2c 20 7a 44  ab->zName, 0, zD
147f0 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  b) ){.      goto
14800 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65   exit_drop_table
14810 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  ;.    }.  }.#end
14820 69 66 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  if.  if( sqlite3
14830 53 74 72 4e 49 43 6d 70 28 70 54 61 62 2d 3e 7a  StrNICmp(pTab->z
14840 4e 61 6d 65 2c 20 22 73 71 6c 69 74 65 5f 22 2c  Name, "sqlite_",
14850 20 37 29 3d 3d 30 20 0a 20 20 20 20 26 26 20 73   7)==0 .    && s
14860 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28 70  qlite3StrNICmp(p
14870 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 22 73 71 6c  Tab->zName, "sql
14880 69 74 65 5f 73 74 61 74 22 2c 20 31 31 29 21 3d  ite_stat", 11)!=
14890 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
148a0 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
148b0 20 22 74 61 62 6c 65 20 25 73 20 6d 61 79 20 6e   "table %s may n
148c0 6f 74 20 62 65 20 64 72 6f 70 70 65 64 22 2c 20  ot be dropped", 
148d0 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pTab->zName);.  
148e0 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70    goto exit_drop
148f0 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 0a 23 69 66  _table;.  }..#if
14900 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
14910 5f 56 49 45 57 0a 20 20 2f 2a 20 45 6e 73 75 72  _VIEW.  /* Ensur
14920 65 20 44 52 4f 50 20 54 41 42 4c 45 20 69 73 20  e DROP TABLE is 
14930 6e 6f 74 20 75 73 65 64 20 6f 6e 20 61 20 76 69  not used on a vi
14940 65 77 2c 20 61 6e 64 20 44 52 4f 50 20 56 49 45  ew, and DROP VIE
14950 57 20 69 73 20 6e 6f 74 20 75 73 65 64 0a 20 20  W is not used.  
14960 2a 2a 20 6f 6e 20 61 20 74 61 62 6c 65 2e 0a 20  ** on a table.. 
14970 20 2a 2f 0a 20 20 69 66 28 20 69 73 56 69 65 77   */.  if( isView
14980 20 26 26 20 70 54 61 62 2d 3e 70 53 65 6c 65 63   && pTab->pSelec
14990 74 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  t==0 ){.    sqli
149a0 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
149b0 73 65 2c 20 22 75 73 65 20 44 52 4f 50 20 54 41  se, "use DROP TA
149c0 42 4c 45 20 74 6f 20 64 65 6c 65 74 65 20 74 61  BLE to delete ta
149d0 62 6c 65 20 25 73 22 2c 20 70 54 61 62 2d 3e 7a  ble %s", pTab->z
149e0 4e 61 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20  Name);.    goto 
149f0 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b  exit_drop_table;
14a00 0a 20 20 7d 0a 20 20 69 66 28 20 21 69 73 56 69  .  }.  if( !isVi
14a10 65 77 20 26 26 20 70 54 61 62 2d 3e 70 53 65 6c  ew && pTab->pSel
14a20 65 63 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ect ){.    sqlit
14a30 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
14a40 65 2c 20 22 75 73 65 20 44 52 4f 50 20 56 49 45  e, "use DROP VIE
14a50 57 20 74 6f 20 64 65 6c 65 74 65 20 76 69 65 77  W to delete view
14a60 20 25 73 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d   %s", pTab->zNam
14a70 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69  e);.    goto exi
14a80 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20  t_drop_table;.  
14a90 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 47  }.#endif..  /* G
14aa0 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20  enerate code to 
14ab0 72 65 6d 6f 76 65 20 74 68 65 20 74 61 62 6c 65  remove the table
14ac0 20 66 72 6f 6d 20 74 68 65 20 6d 61 73 74 65 72   from the master
14ad0 20 74 61 62 6c 65 0a 20 20 2a 2a 20 6f 6e 20 64   table.  ** on d
14ae0 69 73 6b 2e 0a 20 20 2a 2f 0a 20 20 76 20 3d 20  isk..  */.  v = 
14af0 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
14b00 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76 20  Parse);.  if( v 
14b10 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65  ){.    sqlite3Be
14b20 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f  ginWriteOperatio
14b30 6e 28 70 50 61 72 73 65 2c 20 31 2c 20 69 44 62  n(pParse, 1, iDb
14b40 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6c  );.    sqlite3Cl
14b50 65 61 72 53 74 61 74 54 61 62 6c 65 73 28 70 50  earStatTables(pP
14b60 61 72 73 65 2c 20 69 44 62 2c 20 22 74 62 6c 22  arse, iDb, "tbl"
14b70 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a  , pTab->zName);.
14b80 20 20 20 20 73 71 6c 69 74 65 33 46 6b 44 72 6f      sqlite3FkDro
14b90 70 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70  pTable(pParse, p
14ba0 4e 61 6d 65 2c 20 70 54 61 62 29 3b 0a 20 20 20  Name, pTab);.   
14bb0 20 73 71 6c 69 74 65 33 43 6f 64 65 44 72 6f 70   sqlite3CodeDrop
14bc0 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70 54  Table(pParse, pT
14bd0 61 62 2c 20 69 44 62 2c 20 69 73 56 69 65 77 29  ab, iDb, isView)
14be0 3b 0a 20 20 7d 0a 0a 65 78 69 74 5f 64 72 6f 70  ;.  }..exit_drop
14bf0 5f 74 61 62 6c 65 3a 0a 20 20 73 71 6c 69 74 65  _table:.  sqlite
14c00 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28 64  3SrcListDelete(d
14c10 62 2c 20 70 4e 61 6d 65 29 3b 0a 7d 0a 0a 2f 2a  b, pName);.}../*
14c20 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
14c30 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 63 72   is called to cr
14c40 65 61 74 65 20 61 20 6e 65 77 20 66 6f 72 65 69  eate a new forei
14c50 67 6e 20 6b 65 79 20 6f 6e 20 74 68 65 20 74 61  gn key on the ta
14c60 62 6c 65 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79  ble.** currently
14c70 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74   under construct
14c80 69 6f 6e 2e 20 20 70 46 72 6f 6d 43 6f 6c 20 64  ion.  pFromCol d
14c90 65 74 65 72 6d 69 6e 65 73 20 77 68 69 63 68 20  etermines which 
14ca0 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 69 6e 20 74 68  columns.** in th
14cb0 65 20 63 75 72 72 65 6e 74 20 74 61 62 6c 65 20  e current table 
14cc0 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 66 6f 72  point to the for
14cd0 65 69 67 6e 20 6b 65 79 2e 20 20 49 66 20 70 46  eign key.  If pF
14ce0 72 6f 6d 43 6f 6c 3d 3d 30 20 74 68 65 6e 0a 2a  romCol==0 then.*
14cf0 2a 20 63 6f 6e 6e 65 63 74 20 74 68 65 20 6b 65  * connect the ke
14d00 79 20 74 6f 20 74 68 65 20 6c 61 73 74 20 63 6f  y to the last co
14d10 6c 75 6d 6e 20 69 6e 73 65 72 74 65 64 2e 20 20  lumn inserted.  
14d20 70 54 6f 20 69 73 20 74 68 65 20 6e 61 6d 65 20  pTo is the name 
14d30 6f 66 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20  of.** the table 
14d40 72 65 66 65 72 72 65 64 20 74 6f 20 28 61 2e 6b  referred to (a.k
14d50 2e 61 20 74 68 65 20 22 70 61 72 65 6e 74 22 20  .a the "parent" 
14d60 74 61 62 6c 65 29 2e 20 20 70 54 6f 43 6f 6c 20  table).  pToCol 
14d70 69 73 20 61 20 6c 69 73 74 0a 2a 2a 20 6f 66 20  is a list.** of 
14d80 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20 70 61  tables in the pa
14d90 72 65 6e 74 20 70 54 6f 20 74 61 62 6c 65 2e 20  rent pTo table. 
14da0 20 66 6c 61 67 73 20 63 6f 6e 74 61 69 6e 73 20   flags contains 
14db0 61 6c 6c 0a 2a 2a 20 69 6e 66 6f 72 6d 61 74 69  all.** informati
14dc0 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 63 6f 6e  on about the con
14dd0 66 6c 69 63 74 20 72 65 73 6f 6c 75 74 69 6f 6e  flict resolution
14de0 20 61 6c 67 6f 72 69 74 68 6d 73 20 73 70 65 63   algorithms spec
14df0 69 66 69 65 64 0a 2a 2a 20 69 6e 20 74 68 65 20  ified.** in the 
14e00 4f 4e 20 44 45 4c 45 54 45 2c 20 4f 4e 20 55 50  ON DELETE, ON UP
14e10 44 41 54 45 20 61 6e 64 20 4f 4e 20 49 4e 53 45  DATE and ON INSE
14e20 52 54 20 63 6c 61 75 73 65 73 2e 0a 2a 2a 0a 2a  RT clauses..**.*
14e30 2a 20 41 6e 20 46 4b 65 79 20 73 74 72 75 63 74  * An FKey struct
14e40 75 72 65 20 69 73 20 63 72 65 61 74 65 64 20 61  ure is created a
14e50 6e 64 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  nd added to the 
14e60 74 61 62 6c 65 20 63 75 72 72 65 6e 74 6c 79 0a  table currently.
14e70 2a 2a 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75  ** under constru
14e80 63 74 69 6f 6e 20 69 6e 20 74 68 65 20 70 50 61  ction in the pPa
14e90 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 66  rse->pNewTable f
14ea0 69 65 6c 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ield..**.** The 
14eb0 66 6f 72 65 69 67 6e 20 6b 65 79 20 69 73 20 73  foreign key is s
14ec0 65 74 20 66 6f 72 20 49 4d 4d 45 44 49 41 54 45  et for IMMEDIATE
14ed0 20 70 72 6f 63 65 73 73 69 6e 67 2e 20 20 41 20   processing.  A 
14ee0 73 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 0a  subsequent call.
14ef0 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33 44 65 66  ** to sqlite3Def
14f00 65 72 46 6f 72 65 69 67 6e 4b 65 79 28 29 20 6d  erForeignKey() m
14f10 69 67 68 74 20 63 68 61 6e 67 65 20 74 68 69 73  ight change this
14f20 20 74 6f 20 44 45 46 45 52 52 45 44 2e 0a 2a 2f   to DEFERRED..*/
14f30 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 72 65  .void sqlite3Cre
14f40 61 74 65 46 6f 72 65 69 67 6e 4b 65 79 28 0a 20  ateForeignKey(. 
14f50 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
14f60 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
14f70 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78   context */.  Ex
14f80 70 72 4c 69 73 74 20 2a 70 46 72 6f 6d 43 6f 6c  prList *pFromCol
14f90 2c 20 20 2f 2a 20 43 6f 6c 75 6d 6e 73 20 69 6e  ,  /* Columns in
14fa0 20 74 68 69 73 20 74 61 62 6c 65 20 74 68 61 74   this table that
14fb0 20 70 6f 69 6e 74 20 74 6f 20 6f 74 68 65 72 20   point to other 
14fc0 74 61 62 6c 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e  table */.  Token
14fd0 20 2a 70 54 6f 2c 20 20 20 20 20 20 20 20 20 20   *pTo,          
14fe0 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 6f  /* Name of the o
14ff0 74 68 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20  ther table */.  
15000 45 78 70 72 4c 69 73 74 20 2a 70 54 6f 43 6f 6c  ExprList *pToCol
15010 2c 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 73 20  ,    /* Columns 
15020 69 6e 20 74 68 65 20 6f 74 68 65 72 20 74 61 62  in the other tab
15030 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67  le */.  int flag
15040 73 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  s            /* 
15050 43 6f 6e 66 6c 69 63 74 20 72 65 73 6f 6c 75 74  Conflict resolut
15060 69 6f 6e 20 61 6c 67 6f 72 69 74 68 6d 73 2e 20  ion algorithms. 
15070 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  */.){.  sqlite3 
15080 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
15090 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
150a0 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45  _OMIT_FOREIGN_KE
150b0 59 0a 20 20 46 4b 65 79 20 2a 70 46 4b 65 79 20  Y.  FKey *pFKey 
150c0 3d 20 30 3b 0a 20 20 46 4b 65 79 20 2a 70 4e 65  = 0;.  FKey *pNe
150d0 78 74 54 6f 3b 0a 20 20 54 61 62 6c 65 20 2a 70  xtTo;.  Table *p
150e0 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54   = pParse->pNewT
150f0 61 62 6c 65 3b 0a 20 20 69 6e 74 20 6e 42 79 74  able;.  int nByt
15100 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e  e;.  int i;.  in
15110 74 20 6e 43 6f 6c 3b 0a 20 20 63 68 61 72 20 2a  t nCol;.  char *
15120 7a 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 54  z;..  assert( pT
15130 6f 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 3d  o!=0 );.  if( p=
15140 3d 30 20 7c 7c 20 49 4e 5f 44 45 43 4c 41 52 45  =0 || IN_DECLARE
15150 5f 56 54 41 42 20 29 20 67 6f 74 6f 20 66 6b 5f  _VTAB ) goto fk_
15160 65 6e 64 3b 0a 20 20 69 66 28 20 70 46 72 6f 6d  end;.  if( pFrom
15170 43 6f 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e  Col==0 ){.    in
15180 74 20 69 43 6f 6c 20 3d 20 70 2d 3e 6e 43 6f 6c  t iCol = p->nCol
15190 2d 31 3b 0a 20 20 20 20 69 66 28 20 4e 45 56 45  -1;.    if( NEVE
151a0 52 28 69 43 6f 6c 3c 30 29 20 29 20 67 6f 74 6f  R(iCol<0) ) goto
151b0 20 66 6b 5f 65 6e 64 3b 0a 20 20 20 20 69 66 28   fk_end;.    if(
151c0 20 70 54 6f 43 6f 6c 20 26 26 20 70 54 6f 43 6f   pToCol && pToCo
151d0 6c 2d 3e 6e 45 78 70 72 21 3d 31 20 29 7b 0a 20  l->nExpr!=1 ){. 
151e0 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
151f0 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 66 6f  rMsg(pParse, "fo
15200 72 65 69 67 6e 20 6b 65 79 20 6f 6e 20 25 73 22  reign key on %s"
15210 0a 20 20 20 20 20 20 20 20 20 22 20 73 68 6f 75  .         " shou
15220 6c 64 20 72 65 66 65 72 65 6e 63 65 20 6f 6e 6c  ld reference onl
15230 79 20 6f 6e 65 20 63 6f 6c 75 6d 6e 20 6f 66 20  y one column of 
15240 74 61 62 6c 65 20 25 54 22 2c 0a 20 20 20 20 20  table %T",.     
15250 20 20 20 20 70 2d 3e 61 43 6f 6c 5b 69 43 6f 6c      p->aCol[iCol
15260 5d 2e 7a 4e 61 6d 65 2c 20 70 54 6f 29 3b 0a 20  ].zName, pTo);. 
15270 20 20 20 20 20 67 6f 74 6f 20 66 6b 5f 65 6e 64       goto fk_end
15280 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 43 6f 6c  ;.    }.    nCol
15290 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 20 69 66   = 1;.  }else if
152a0 28 20 70 54 6f 43 6f 6c 20 26 26 20 70 54 6f 43  ( pToCol && pToC
152b0 6f 6c 2d 3e 6e 45 78 70 72 21 3d 70 46 72 6f 6d  ol->nExpr!=pFrom
152c0 43 6f 6c 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20  Col->nExpr ){.  
152d0 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
152e0 67 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20  g(pParse,.      
152f0 20 20 22 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c    "number of col
15300 75 6d 6e 73 20 69 6e 20 66 6f 72 65 69 67 6e 20  umns in foreign 
15310 6b 65 79 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74  key does not mat
15320 63 68 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ch the number of
15330 20 22 0a 20 20 20 20 20 20 20 20 22 63 6f 6c 75   ".        "colu
15340 6d 6e 73 20 69 6e 20 74 68 65 20 72 65 66 65 72  mns in the refer
15350 65 6e 63 65 64 20 74 61 62 6c 65 22 29 3b 0a 20  enced table");. 
15360 20 20 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a     goto fk_end;.
15370 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 43 6f    }else{.    nCo
15380 6c 20 3d 20 70 46 72 6f 6d 43 6f 6c 2d 3e 6e 45  l = pFromCol->nE
15390 78 70 72 3b 0a 20 20 7d 0a 20 20 6e 42 79 74 65  xpr;.  }.  nByte
153a0 20 3d 20 73 69 7a 65 6f 66 28 2a 70 46 4b 65 79   = sizeof(*pFKey
153b0 29 20 2b 20 28 6e 43 6f 6c 2d 31 29 2a 73 69 7a  ) + (nCol-1)*siz
153c0 65 6f 66 28 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b  eof(pFKey->aCol[
153d0 30 5d 29 20 2b 20 70 54 6f 2d 3e 6e 20 2b 20 31  0]) + pTo->n + 1
153e0 3b 0a 20 20 69 66 28 20 70 54 6f 43 6f 6c 20 29  ;.  if( pToCol )
153f0 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  {.    for(i=0; i
15400 3c 70 54 6f 43 6f 6c 2d 3e 6e 45 78 70 72 3b 20  <pToCol->nExpr; 
15410 69 2b 2b 29 7b 0a 20 20 20 20 20 20 6e 42 79 74  i++){.      nByt
15420 65 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  e += sqlite3Strl
15430 65 6e 33 30 28 70 54 6f 43 6f 6c 2d 3e 61 5b 69  en30(pToCol->a[i
15440 5d 2e 7a 4e 61 6d 65 29 20 2b 20 31 3b 0a 20 20  ].zName) + 1;.  
15450 20 20 7d 0a 20 20 7d 0a 20 20 70 46 4b 65 79 20    }.  }.  pFKey 
15460 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
15470 63 5a 65 72 6f 28 64 62 2c 20 6e 42 79 74 65 20  cZero(db, nByte 
15480 29 3b 0a 20 20 69 66 28 20 70 46 4b 65 79 3d 3d  );.  if( pFKey==
15490 30 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 66 6b  0 ){.    goto fk
154a0 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 70 46 4b 65  _end;.  }.  pFKe
154b0 79 2d 3e 70 46 72 6f 6d 20 3d 20 70 3b 0a 20 20  y->pFrom = p;.  
154c0 70 46 4b 65 79 2d 3e 70 4e 65 78 74 46 72 6f 6d  pFKey->pNextFrom
154d0 20 3d 20 70 2d 3e 70 46 4b 65 79 3b 0a 20 20 7a   = p->pFKey;.  z
154e0 20 3d 20 28 63 68 61 72 2a 29 26 70 46 4b 65 79   = (char*)&pFKey
154f0 2d 3e 61 43 6f 6c 5b 6e 43 6f 6c 5d 3b 0a 20 20  ->aCol[nCol];.  
15500 70 46 4b 65 79 2d 3e 7a 54 6f 20 3d 20 7a 3b 0a  pFKey->zTo = z;.
15510 20 20 6d 65 6d 63 70 79 28 7a 2c 20 70 54 6f 2d    memcpy(z, pTo-
15520 3e 7a 2c 20 70 54 6f 2d 3e 6e 29 3b 0a 20 20 7a  >z, pTo->n);.  z
15530 5b 70 54 6f 2d 3e 6e 5d 20 3d 20 30 3b 0a 20 20  [pTo->n] = 0;.  
15540 73 71 6c 69 74 65 33 44 65 71 75 6f 74 65 28 7a  sqlite3Dequote(z
15550 29 3b 0a 20 20 7a 20 2b 3d 20 70 54 6f 2d 3e 6e  );.  z += pTo->n
15560 2b 31 3b 0a 20 20 70 46 4b 65 79 2d 3e 6e 43 6f  +1;.  pFKey->nCo
15570 6c 20 3d 20 6e 43 6f 6c 3b 0a 20 20 69 66 28 20  l = nCol;.  if( 
15580 70 46 72 6f 6d 43 6f 6c 3d 3d 30 20 29 7b 0a 20  pFromCol==0 ){. 
15590 20 20 20 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b 30     pFKey->aCol[0
155a0 5d 2e 69 46 72 6f 6d 20 3d 20 70 2d 3e 6e 43 6f  ].iFrom = p->nCo
155b0 6c 2d 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  l-1;.  }else{.  
155c0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f    for(i=0; i<nCo
155d0 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  l; i++){.      i
155e0 6e 74 20 6a 3b 0a 20 20 20 20 20 20 66 6f 72 28  nt j;.      for(
155f0 6a 3d 30 3b 20 6a 3c 70 2d 3e 6e 43 6f 6c 3b 20  j=0; j<p->nCol; 
15600 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66  j++){.        if
15610 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ( sqlite3StrICmp
15620 28 70 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d  (p->aCol[j].zNam
15630 65 2c 20 70 46 72 6f 6d 43 6f 6c 2d 3e 61 5b 69  e, pFromCol->a[i
15640 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20  ].zName)==0 ){. 
15650 20 20 20 20 20 20 20 20 20 70 46 4b 65 79 2d 3e           pFKey->
15660 61 43 6f 6c 5b 69 5d 2e 69 46 72 6f 6d 20 3d 20  aCol[i].iFrom = 
15670 6a 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  j;.          bre
15680 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
15690 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
156a0 6a 3e 3d 70 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20  j>=p->nCol ){.  
156b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
156c0 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 0a 20  orMsg(pParse, . 
156d0 20 20 20 20 20 20 20 20 20 22 75 6e 6b 6e 6f 77           "unknow
156e0 6e 20 63 6f 6c 75 6d 6e 20 5c 22 25 73 5c 22 20  n column \"%s\" 
156f0 69 6e 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 64  in foreign key d
15700 65 66 69 6e 69 74 69 6f 6e 22 2c 20 0a 20 20 20  efinition", .   
15710 20 20 20 20 20 20 20 70 46 72 6f 6d 43 6f 6c 2d         pFromCol-
15720 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20  >a[i].zName);.  
15730 20 20 20 20 20 20 67 6f 74 6f 20 66 6b 5f 65 6e        goto fk_en
15740 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  d;.      }.    }
15750 0a 20 20 7d 0a 20 20 69 66 28 20 70 54 6f 43 6f  .  }.  if( pToCo
15760 6c 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30  l ){.    for(i=0
15770 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a  ; i<nCol; i++){.
15780 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 73 71        int n = sq
15790 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70 54  lite3Strlen30(pT
157a0 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  oCol->a[i].zName
157b0 29 3b 0a 20 20 20 20 20 20 70 46 4b 65 79 2d 3e  );.      pFKey->
157c0 61 43 6f 6c 5b 69 5d 2e 7a 43 6f 6c 20 3d 20 7a  aCol[i].zCol = z
157d0 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a  ;.      memcpy(z
157e0 2c 20 70 54 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a  , pToCol->a[i].z
157f0 4e 61 6d 65 2c 20 6e 29 3b 0a 20 20 20 20 20 20  Name, n);.      
15800 7a 5b 6e 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20  z[n] = 0;.      
15810 7a 20 2b 3d 20 6e 2b 31 3b 0a 20 20 20 20 7d 0a  z += n+1;.    }.
15820 20 20 7d 0a 20 20 70 46 4b 65 79 2d 3e 69 73 44    }.  pFKey->isD
15830 65 66 65 72 72 65 64 20 3d 20 30 3b 0a 20 20 70  eferred = 0;.  p
15840 46 4b 65 79 2d 3e 61 41 63 74 69 6f 6e 5b 30 5d  FKey->aAction[0]
15850 20 3d 20 28 75 38 29 28 66 6c 61 67 73 20 26 20   = (u8)(flags & 
15860 30 78 66 66 29 3b 20 20 20 20 20 20 20 20 20 20  0xff);          
15870 20 20 2f 2a 20 4f 4e 20 44 45 4c 45 54 45 20 61    /* ON DELETE a
15880 63 74 69 6f 6e 20 2a 2f 0a 20 20 70 46 4b 65 79  ction */.  pFKey
15890 2d 3e 61 41 63 74 69 6f 6e 5b 31 5d 20 3d 20 28  ->aAction[1] = (
158a0 75 38 29 28 28 66 6c 61 67 73 20 3e 3e 20 38 20  u8)((flags >> 8 
158b0 29 20 26 20 30 78 66 66 29 3b 20 20 20 20 2f 2a  ) & 0xff);    /*
158c0 20 4f 4e 20 55 50 44 41 54 45 20 61 63 74 69 6f   ON UPDATE actio
158d0 6e 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  n */..  assert( 
158e0 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74  sqlite3SchemaMut
158f0 65 78 48 65 6c 64 28 64 62 2c 20 30 2c 20 70 2d  exHeld(db, 0, p-
15900 3e 70 53 63 68 65 6d 61 29 20 29 3b 0a 20 20 70  >pSchema) );.  p
15910 4e 65 78 74 54 6f 20 3d 20 28 46 4b 65 79 20 2a  NextTo = (FKey *
15920 29 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65  )sqlite3HashInse
15930 72 74 28 26 70 2d 3e 70 53 63 68 65 6d 61 2d 3e  rt(&p->pSchema->
15940 66 6b 65 79 48 61 73 68 2c 20 0a 20 20 20 20 20  fkeyHash, .     
15950 20 70 46 4b 65 79 2d 3e 7a 54 6f 2c 20 28 76 6f   pFKey->zTo, (vo
15960 69 64 20 2a 29 70 46 4b 65 79 0a 20 20 29 3b 0a  id *)pFKey.  );.
15970 20 20 69 66 28 20 70 4e 65 78 74 54 6f 3d 3d 70    if( pNextTo==p
15980 46 4b 65 79 20 29 7b 0a 20 20 20 20 73 71 6c 69  FKey ){.    sqli
15990 74 65 33 4f 6f 6d 46 61 75 6c 74 28 64 62 29 3b  te3OomFault(db);
159a0 0a 20 20 20 20 67 6f 74 6f 20 66 6b 5f 65 6e 64  .    goto fk_end
159b0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 4e 65 78  ;.  }.  if( pNex
159c0 74 54 6f 20 29 7b 0a 20 20 20 20 61 73 73 65 72  tTo ){.    asser
159d0 74 28 20 70 4e 65 78 74 54 6f 2d 3e 70 50 72 65  t( pNextTo->pPre
159e0 76 54 6f 3d 3d 30 20 29 3b 0a 20 20 20 20 70 46  vTo==0 );.    pF
159f0 4b 65 79 2d 3e 70 4e 65 78 74 54 6f 20 3d 20 70  Key->pNextTo = p
15a00 4e 65 78 74 54 6f 3b 0a 20 20 20 20 70 4e 65 78  NextTo;.    pNex
15a10 74 54 6f 2d 3e 70 50 72 65 76 54 6f 20 3d 20 70  tTo->pPrevTo = p
15a20 46 4b 65 79 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  FKey;.  }..  /* 
15a30 4c 69 6e 6b 20 74 68 65 20 66 6f 72 65 69 67 6e  Link the foreign
15a40 20 6b 65 79 20 74 6f 20 74 68 65 20 74 61 62 6c   key to the tabl
15a50 65 20 61 73 20 74 68 65 20 6c 61 73 74 20 73 74  e as the last st
15a60 65 70 2e 0a 20 20 2a 2f 0a 20 20 70 2d 3e 70 46  ep..  */.  p->pF
15a70 4b 65 79 20 3d 20 70 46 4b 65 79 3b 0a 20 20 70  Key = pFKey;.  p
15a80 46 4b 65 79 20 3d 20 30 3b 0a 0a 66 6b 5f 65 6e  FKey = 0;..fk_en
15a90 64 3a 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  d:.  sqlite3DbFr
15aa0 65 65 28 64 62 2c 20 70 46 4b 65 79 29 3b 0a 23  ee(db, pFKey);.#
15ab0 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65  endif /* !define
15ac0 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f  d(SQLITE_OMIT_FO
15ad0 52 45 49 47 4e 5f 4b 45 59 29 20 2a 2f 0a 20 20  REIGN_KEY) */.  
15ae0 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
15af0 65 6c 65 74 65 28 64 62 2c 20 70 46 72 6f 6d 43  elete(db, pFromC
15b00 6f 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78  ol);.  sqlite3Ex
15b10 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c  prListDelete(db,
15b20 20 70 54 6f 43 6f 6c 29 3b 0a 7d 0a 0a 2f 2a 0a   pToCol);.}../*.
15b30 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
15b40 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61  is called when a
15b50 6e 20 49 4e 49 54 49 41 4c 4c 59 20 49 4d 4d 45  n INITIALLY IMME
15b60 44 49 41 54 45 20 6f 72 20 49 4e 49 54 49 41 4c  DIATE or INITIAL
15b70 4c 59 20 44 45 46 45 52 52 45 44 0a 2a 2a 20 63  LY DEFERRED.** c
15b80 6c 61 75 73 65 20 69 73 20 73 65 65 6e 20 61 73  lause is seen as
15b90 20 70 61 72 74 20 6f 66 20 61 20 66 6f 72 65 69   part of a forei
15ba0 67 6e 20 6b 65 79 20 64 65 66 69 6e 69 74 69 6f  gn key definitio
15bb0 6e 2e 20 20 54 68 65 20 69 73 44 65 66 65 72 72  n.  The isDeferr
15bc0 65 64 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 20  ed.** parameter 
15bd0 69 73 20 31 20 66 6f 72 20 49 4e 49 54 49 41 4c  is 1 for INITIAL
15be0 4c 59 20 44 45 46 45 52 52 45 44 20 61 6e 64 20  LY DEFERRED and 
15bf0 30 20 66 6f 72 20 49 4e 49 54 49 41 4c 4c 59 20  0 for INITIALLY 
15c00 49 4d 4d 45 44 49 41 54 45 2e 0a 2a 2a 20 54 68  IMMEDIATE..** Th
15c10 65 20 62 65 68 61 76 69 6f 72 20 6f 66 20 74 68  e behavior of th
15c20 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20  e most recently 
15c30 63 72 65 61 74 65 64 20 66 6f 72 65 69 67 6e 20  created foreign 
15c40 6b 65 79 20 69 73 20 61 64 6a 75 73 74 65 64 0a  key is adjusted.
15c50 2a 2a 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e 0a  ** accordingly..
15c60 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 44  */.void sqlite3D
15c70 65 66 65 72 46 6f 72 65 69 67 6e 4b 65 79 28 50  eferForeignKey(P
15c80 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e  arse *pParse, in
15c90 74 20 69 73 44 65 66 65 72 72 65 64 29 7b 0a 23  t isDeferred){.#
15ca0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
15cb0 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 0a 20  IT_FOREIGN_KEY. 
15cc0 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20   Table *pTab;.  
15cd0 46 4b 65 79 20 2a 70 46 4b 65 79 3b 0a 20 20 69  FKey *pFKey;.  i
15ce0 66 28 20 28 70 54 61 62 20 3d 20 70 50 61 72 73  f( (pTab = pPars
15cf0 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3d 3d 30  e->pNewTable)==0
15d00 20 7c 7c 20 28 70 46 4b 65 79 20 3d 20 70 54 61   || (pFKey = pTa
15d10 62 2d 3e 70 46 4b 65 79 29 3d 3d 30 20 29 20 72  b->pFKey)==0 ) r
15d20 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28  eturn;.  assert(
15d30 20 69 73 44 65 66 65 72 72 65 64 3d 3d 30 20 7c   isDeferred==0 |
15d40 7c 20 69 73 44 65 66 65 72 72 65 64 3d 3d 31 20  | isDeferred==1 
15d50 29 3b 20 2f 2a 20 45 56 3a 20 52 2d 33 30 33 32  ); /* EV: R-3032
15d60 33 2d 32 31 39 31 37 20 2a 2f 0a 20 20 70 46 4b  3-21917 */.  pFK
15d70 65 79 2d 3e 69 73 44 65 66 65 72 72 65 64 20 3d  ey->isDeferred =
15d80 20 28 75 38 29 69 73 44 65 66 65 72 72 65 64 3b   (u8)isDeferred;
15d90 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a  .#endif.}../*.**
15da0 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
15db0 68 61 74 20 77 69 6c 6c 20 65 72 61 73 65 20 61  hat will erase a
15dc0 6e 64 20 72 65 66 69 6c 6c 20 69 6e 64 65 78 20  nd refill index 
15dd0 2a 70 49 64 78 2e 20 20 54 68 69 73 20 69 73 0a  *pIdx.  This is.
15de0 2a 2a 20 75 73 65 64 20 74 6f 20 69 6e 69 74 69  ** used to initi
15df0 61 6c 69 7a 65 20 61 20 6e 65 77 6c 79 20 63 72  alize a newly cr
15e00 65 61 74 65 64 20 69 6e 64 65 78 20 6f 72 20 74  eated index or t
15e10 6f 20 72 65 63 6f 6d 70 75 74 65 20 74 68 65 0a  o recompute the.
15e20 2a 2a 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 6e  ** content of an
15e30 20 69 6e 64 65 78 20 69 6e 20 72 65 73 70 6f 6e   index in respon
15e40 73 65 20 74 6f 20 61 20 52 45 49 4e 44 45 58 20  se to a REINDEX 
15e50 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 69  command..**.** i
15e60 66 20 6d 65 6d 52 6f 6f 74 50 61 67 65 20 69 73  f memRootPage is
15e70 20 6e 6f 74 20 6e 65 67 61 74 69 76 65 2c 20 69   not negative, i
15e80 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65  t means that the
15e90 20 69 6e 64 65 78 20 69 73 20 6e 65 77 6c 79 0a   index is newly.
15ea0 2a 2a 20 63 72 65 61 74 65 64 2e 20 20 54 68 65  ** created.  The
15eb0 20 72 65 67 69 73 74 65 72 20 73 70 65 63 69 66   register specif
15ec0 69 65 64 20 62 79 20 6d 65 6d 52 6f 6f 74 50 61  ied by memRootPa
15ed0 67 65 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 0a  ge contains the.
15ee0 2a 2a 20 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d  ** root page num
15ef0 62 65 72 20 6f 66 20 74 68 65 20 69 6e 64 65 78  ber of the index
15f00 2e 20 20 49 66 20 6d 65 6d 52 6f 6f 74 50 61 67  .  If memRootPag
15f10 65 20 69 73 20 6e 65 67 61 74 69 76 65 2c 20 74  e is negative, t
15f20 68 65 6e 0a 2a 2a 20 74 68 65 20 69 6e 64 65 78  hen.** the index
15f30 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 20   already exists 
15f40 61 6e 64 20 6d 75 73 74 20 62 65 20 63 6c 65 61  and must be clea
15f50 72 65 64 20 62 65 66 6f 72 65 20 62 65 69 6e 67  red before being
15f60 20 72 65 66 69 6c 6c 65 64 20 61 6e 64 0a 2a 2a   refilled and.**
15f70 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6e   the root page n
15f80 75 6d 62 65 72 20 6f 66 20 74 68 65 20 69 6e 64  umber of the ind
15f90 65 78 20 69 73 20 74 61 6b 65 6e 20 66 72 6f 6d  ex is taken from
15fa0 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 2e 0a 2a   pIndex->tnum..*
15fb0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 71  /.static void sq
15fc0 6c 69 74 65 33 52 65 66 69 6c 6c 49 6e 64 65 78  lite3RefillIndex
15fd0 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
15fe0 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 2c 20 69  Index *pIndex, i
15ff0 6e 74 20 6d 65 6d 52 6f 6f 74 50 61 67 65 29 7b  nt memRootPage){
16000 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d  .  Table *pTab =
16010 20 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 3b   pIndex->pTable;
16020 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 74    /* The table t
16030 68 61 74 20 69 73 20 69 6e 64 65 78 65 64 20 2a  hat is indexed *
16040 2f 0a 20 20 69 6e 74 20 69 54 61 62 20 3d 20 70  /.  int iTab = p
16050 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 20 20  Parse->nTab++;  
16060 20 20 20 2f 2a 20 42 74 72 65 65 20 63 75 72 73     /* Btree curs
16070 6f 72 20 75 73 65 64 20 66 6f 72 20 70 54 61 62  or used for pTab
16080 20 2a 2f 0a 20 20 69 6e 74 20 69 49 64 78 20 3d   */.  int iIdx =
16090 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b   pParse->nTab++;
160a0 20 20 20 20 20 2f 2a 20 42 74 72 65 65 20 63 75       /* Btree cu
160b0 72 73 6f 72 20 75 73 65 64 20 66 6f 72 20 70 49  rsor used for pI
160c0 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 69 53  ndex */.  int iS
160d0 6f 72 74 65 72 3b 20 20 20 20 20 20 20 20 20 20  orter;          
160e0 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73           /* Curs
160f0 6f 72 20 6f 70 65 6e 65 64 20 62 79 20 4f 70 65  or opened by Ope
16100 6e 53 6f 72 74 65 72 20 28 69 66 20 69 6e 20 75  nSorter (if in u
16110 73 65 29 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  se) */.  int add
16120 72 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  r1;             
16130 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65          /* Addre
16140 73 73 20 6f 66 20 74 6f 70 20 6f 66 20 6c 6f 6f  ss of top of loo
16150 70 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 32  p */.  int addr2
16160 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
16170 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
16180 20 74 6f 20 6a 75 6d 70 20 74 6f 20 66 6f 72 20   to jump to for 
16190 6e 65 78 74 20 69 74 65 72 61 74 69 6f 6e 20 2a  next iteration *
161a0 2f 0a 20 20 69 6e 74 20 74 6e 75 6d 3b 20 20 20  /.  int tnum;   
161b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
161c0 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20     /* Root page 
161d0 6f 66 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e  of index */.  in
161e0 74 20 69 50 61 72 74 49 64 78 4c 61 62 65 6c 3b  t iPartIdxLabel;
161f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
16200 4a 75 6d 70 20 74 6f 20 74 68 69 73 20 6c 61 62  Jump to this lab
16210 65 6c 20 74 6f 20 73 6b 69 70 20 61 20 72 6f 77  el to skip a row
16220 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20 20   */.  Vdbe *v;  
16230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16240 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65       /* Generate
16250 20 63 6f 64 65 20 69 6e 74 6f 20 74 68 69 73 20   code into this 
16260 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20  virtual machine 
16270 2a 2f 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b  */.  KeyInfo *pK
16280 65 79 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ey;             
16290 20 20 20 20 2f 2a 20 4b 65 79 49 6e 66 6f 20 66      /* KeyInfo f
162a0 6f 72 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e  or index */.  in
162b0 74 20 72 65 67 52 65 63 6f 72 64 3b 20 20 20 20  t regRecord;    
162c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
162d0 52 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67  Register holding
162e0 20 61 73 73 65 6d 62 6c 65 64 20 69 6e 64 65 78   assembled index
162f0 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 73 71 6c   record */.  sql
16300 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
16310 65 2d 3e 64 62 3b 20 20 20 20 20 20 2f 2a 20 54  e->db;      /* T
16320 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  he database conn
16330 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20  ection */.  int 
16340 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68  iDb = sqlite3Sch
16350 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70  emaToIndex(db, p
16360 49 6e 64 65 78 2d 3e 70 53 63 68 65 6d 61 29 3b  Index->pSchema);
16370 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
16380 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54  _OMIT_AUTHORIZAT
16390 49 4f 4e 0a 20 20 69 66 28 20 73 71 6c 69 74 65  ION.  if( sqlite
163a0 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73  3AuthCheck(pPars
163b0 65 2c 20 53 51 4c 49 54 45 5f 52 45 49 4e 44 45  e, SQLITE_REINDE
163c0 58 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65  X, pIndex->zName
163d0 2c 20 30 2c 0a 20 20 20 20 20 20 64 62 2d 3e 61  , 0,.      db->a
163e0 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 20 29 20  Db[iDb].zName ) 
163f0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  ){.    return;. 
16400 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
16410 52 65 71 75 69 72 65 20 61 20 77 72 69 74 65 2d  Require a write-
16420 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 74 61 62 6c  lock on the tabl
16430 65 20 74 6f 20 70 65 72 66 6f 72 6d 20 74 68 69  e to perform thi
16440 73 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 20  s operation */. 
16450 20 73 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63   sqlite3TableLoc
16460 6b 28 70 50 61 72 73 65 2c 20 69 44 62 2c 20 70  k(pParse, iDb, p
16470 54 61 62 2d 3e 74 6e 75 6d 2c 20 31 2c 20 70 54  Tab->tnum, 1, pT
16480 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 0a 20 20 76  ab->zName);..  v
16490 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
164a0 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28  e(pParse);.  if(
164b0 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a   v==0 ) return;.
164c0 20 20 69 66 28 20 6d 65 6d 52 6f 6f 74 50 61 67    if( memRootPag
164d0 65 3e 3d 30 20 29 7b 0a 20 20 20 20 74 6e 75 6d  e>=0 ){.    tnum
164e0 20 3d 20 6d 65 6d 52 6f 6f 74 50 61 67 65 3b 0a   = memRootPage;.
164f0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 74 6e 75    }else{.    tnu
16500 6d 20 3d 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d  m = pIndex->tnum
16510 3b 0a 20 20 7d 0a 20 20 70 4b 65 79 20 3d 20 73  ;.  }.  pKey = s
16520 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 4f 66 49  qlite3KeyInfoOfI
16530 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70 49 6e  ndex(pParse, pIn
16540 64 65 78 29 3b 0a 0a 20 20 2f 2a 20 4f 70 65 6e  dex);..  /* Open
16550 20 74 68 65 20 73 6f 72 74 65 72 20 63 75 72 73   the sorter curs
16560 6f 72 20 69 66 20 77 65 20 61 72 65 20 74 6f 20  or if we are to 
16570 75 73 65 20 6f 6e 65 2e 20 2a 2f 0a 20 20 69 53  use one. */.  iS
16580 6f 72 74 65 72 20 3d 20 70 50 61 72 73 65 2d 3e  orter = pParse->
16590 6e 54 61 62 2b 2b 3b 0a 20 20 73 71 6c 69 74 65  nTab++;.  sqlite
165a0 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
165b0 50 5f 53 6f 72 74 65 72 4f 70 65 6e 2c 20 69 53  P_SorterOpen, iS
165c0 6f 72 74 65 72 2c 20 30 2c 20 70 49 6e 64 65 78  orter, 0, pIndex
165d0 2d 3e 6e 4b 65 79 43 6f 6c 2c 20 28 63 68 61 72  ->nKeyCol, (char
165e0 2a 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  *).             
165f0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4b 65         sqlite3Ke
16600 79 49 6e 66 6f 52 65 66 28 70 4b 65 79 29 2c 20  yInfoRef(pKey), 
16610 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 0a 20 20  P4_KEYINFO);..  
16620 2f 2a 20 4f 70 65 6e 20 74 68 65 20 74 61 62 6c  /* Open the tabl
16630 65 2e 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20  e. Loop through 
16640 61 6c 6c 20 72 6f 77 73 20 6f 66 20 74 68 65 20  all rows of the 
16650 74 61 62 6c 65 2c 20 69 6e 73 65 72 74 69 6e 67  table, inserting
16660 20 69 6e 64 65 78 0a 20 20 2a 2a 20 72 65 63 6f   index.  ** reco
16670 72 64 73 20 69 6e 74 6f 20 74 68 65 20 73 6f 72  rds into the sor
16680 74 65 72 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ter. */.  sqlite
16690 33 4f 70 65 6e 54 61 62 6c 65 28 70 50 61 72 73  3OpenTable(pPars
166a0 65 2c 20 69 54 61 62 2c 20 69 44 62 2c 20 70 54  e, iTab, iDb, pT
166b0 61 62 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64 29  ab, OP_OpenRead)
166c0 3b 0a 20 20 61 64 64 72 31 20 3d 20 73 71 6c 69  ;.  addr1 = sqli
166d0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
166e0 20 4f 50 5f 52 65 77 69 6e 64 2c 20 69 54 61 62   OP_Rewind, iTab
166f0 2c 20 30 29 3b 20 56 64 62 65 43 6f 76 65 72 61  , 0); VdbeCovera
16700 67 65 28 76 29 3b 0a 20 20 72 65 67 52 65 63 6f  ge(v);.  regReco
16710 72 64 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  rd = sqlite3GetT
16720 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a  empReg(pParse);.
16730 0a 20 20 73 71 6c 69 74 65 33 47 65 6e 65 72 61  .  sqlite3Genera
16740 74 65 49 6e 64 65 78 4b 65 79 28 70 50 61 72 73  teIndexKey(pPars
16750 65 2c 70 49 6e 64 65 78 2c 69 54 61 62 2c 72 65  e,pIndex,iTab,re
16760 67 52 65 63 6f 72 64 2c 30 2c 26 69 50 61 72 74  gRecord,0,&iPart
16770 49 64 78 4c 61 62 65 6c 2c 30 2c 30 29 3b 0a 20  IdxLabel,0,0);. 
16780 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
16790 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 49  p2(v, OP_SorterI
167a0 6e 73 65 72 74 2c 20 69 53 6f 72 74 65 72 2c 20  nsert, iSorter, 
167b0 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 73 71  regRecord);.  sq
167c0 6c 69 74 65 33 52 65 73 6f 6c 76 65 50 61 72 74  lite3ResolvePart
167d0 49 64 78 4c 61 62 65 6c 28 70 50 61 72 73 65 2c  IdxLabel(pParse,
167e0 20 69 50 61 72 74 49 64 78 4c 61 62 65 6c 29 3b   iPartIdxLabel);
167f0 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
16800 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c  dOp2(v, OP_Next,
16810 20 69 54 61 62 2c 20 61 64 64 72 31 2b 31 29 3b   iTab, addr1+1);
16820 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
16830 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a  ;.  sqlite3VdbeJ
16840 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 31  umpHere(v, addr1
16850 29 3b 0a 20 20 69 66 28 20 6d 65 6d 52 6f 6f 74  );.  if( memRoot
16860 50 61 67 65 3c 30 20 29 20 73 71 6c 69 74 65 33  Page<0 ) sqlite3
16870 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
16880 5f 43 6c 65 61 72 2c 20 74 6e 75 6d 2c 20 69 44  _Clear, tnum, iD
16890 62 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  b);.  sqlite3Vdb
168a0 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70  eAddOp4(v, OP_Op
168b0 65 6e 57 72 69 74 65 2c 20 69 49 64 78 2c 20 74  enWrite, iIdx, t
168c0 6e 75 6d 2c 20 69 44 62 2c 20 0a 20 20 20 20 20  num, iDb, .     
168d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
168e0 63 68 61 72 20 2a 29 70 4b 65 79 2c 20 50 34 5f  char *)pKey, P4_
168f0 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 73 71 6c 69  KEYINFO);.  sqli
16900 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
16910 76 2c 20 4f 50 46 4c 41 47 5f 42 55 4c 4b 43 53  v, OPFLAG_BULKCS
16920 52 7c 28 28 6d 65 6d 52 6f 6f 74 50 61 67 65 3e  R|((memRootPage>
16930 3d 30 29 3f 4f 50 46 4c 41 47 5f 50 32 49 53 52  =0)?OPFLAG_P2ISR
16940 45 47 3a 30 29 29 3b 0a 0a 20 20 61 64 64 72 31  EG:0));..  addr1
16950 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
16960 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65  dOp2(v, OP_Sorte
16970 72 53 6f 72 74 2c 20 69 53 6f 72 74 65 72 2c 20  rSort, iSorter, 
16980 30 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  0); VdbeCoverage
16990 28 76 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  (v);.  assert( p
169a0 4b 65 79 21 3d 30 20 7c 7c 20 64 62 2d 3e 6d 61  Key!=0 || db->ma
169b0 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20 70 50  llocFailed || pP
169c0 61 72 73 65 2d 3e 6e 45 72 72 20 29 3b 0a 20 20  arse->nErr );.  
169d0 69 66 28 20 49 73 55 6e 69 71 75 65 49 6e 64 65  if( IsUniqueInde
169e0 78 28 70 49 6e 64 65 78 29 20 26 26 20 70 4b 65  x(pIndex) && pKe
169f0 79 21 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20  y!=0 ){.    int 
16a00 6a 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  j2 = sqlite3Vdbe
16a10 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 20 2b  CurrentAddr(v) +
16a20 20 33 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   3;.    sqlite3V
16a30 64 62 65 47 6f 74 6f 28 76 2c 20 6a 32 29 3b 0a  dbeGoto(v, j2);.
16a40 20 20 20 20 61 64 64 72 32 20 3d 20 73 71 6c 69      addr2 = sqli
16a50 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
16a60 64 72 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74  dr(v);.    sqlit
16a70 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28  e3VdbeAddOp4Int(
16a80 76 2c 20 4f 50 5f 53 6f 72 74 65 72 43 6f 6d 70  v, OP_SorterComp
16a90 61 72 65 2c 20 69 53 6f 72 74 65 72 2c 20 6a 32  are, iSorter, j2
16aa0 2c 20 72 65 67 52 65 63 6f 72 64 2c 0a 20 20 20  , regRecord,.   
16ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16ac0 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 6e 4b        pIndex->nK
16ad0 65 79 43 6f 6c 29 3b 20 56 64 62 65 43 6f 76 65  eyCol); VdbeCove
16ae0 72 61 67 65 28 76 29 3b 0a 20 20 20 20 73 71 6c  rage(v);.    sql
16af0 69 74 65 33 55 6e 69 71 75 65 43 6f 6e 73 74 72  ite3UniqueConstr
16b00 61 69 6e 74 28 70 50 61 72 73 65 2c 20 4f 45 5f  aint(pParse, OE_
16b10 41 62 6f 72 74 2c 20 70 49 6e 64 65 78 29 3b 0a  Abort, pIndex);.
16b20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 64 64    }else{.    add
16b30 72 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  r2 = sqlite3Vdbe
16b40 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a  CurrentAddr(v);.
16b50 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62    }.  sqlite3Vdb
16b60 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53 6f  eAddOp3(v, OP_So
16b70 72 74 65 72 44 61 74 61 2c 20 69 53 6f 72 74 65  rterData, iSorte
16b80 72 2c 20 72 65 67 52 65 63 6f 72 64 2c 20 69 49  r, regRecord, iI
16b90 64 78 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  dx);.  sqlite3Vd
16ba0 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4c  beAddOp3(v, OP_L
16bb0 61 73 74 2c 20 69 49 64 78 2c 20 30 2c 20 2d 31  ast, iIdx, 0, -1
16bc0 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
16bd0 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 64 78  AddOp3(v, OP_Idx
16be0 49 6e 73 65 72 74 2c 20 69 49 64 78 2c 20 72 65  Insert, iIdx, re
16bf0 67 52 65 63 6f 72 64 2c 20 30 29 3b 0a 20 20 73  gRecord, 0);.  s
16c00 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
16c10 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 55 53 45  P5(v, OPFLAG_USE
16c20 53 45 45 4b 52 45 53 55 4c 54 29 3b 0a 20 20 73  SEEKRESULT);.  s
16c30 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
16c40 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67  pReg(pParse, reg
16c50 52 65 63 6f 72 64 29 3b 0a 20 20 73 71 6c 69 74  Record);.  sqlit
16c60 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
16c70 4f 50 5f 53 6f 72 74 65 72 4e 65 78 74 2c 20 69  OP_SorterNext, i
16c80 53 6f 72 74 65 72 2c 20 61 64 64 72 32 29 3b 20  Sorter, addr2); 
16c90 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
16ca0 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75  .  sqlite3VdbeJu
16cb0 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 31 29  mpHere(v, addr1)
16cc0 3b 0a 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  ;..  sqlite3Vdbe
16cd0 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f  AddOp1(v, OP_Clo
16ce0 73 65 2c 20 69 54 61 62 29 3b 0a 20 20 73 71 6c  se, iTab);.  sql
16cf0 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
16d00 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 69 49 64 78  , OP_Close, iIdx
16d10 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
16d20 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f  AddOp1(v, OP_Clo
16d30 73 65 2c 20 69 53 6f 72 74 65 72 29 3b 0a 7d 0a  se, iSorter);.}.
16d40 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20  ./*.** Allocate 
16d50 68 65 61 70 20 73 70 61 63 65 20 74 6f 20 68 6f  heap space to ho
16d60 6c 64 20 61 6e 20 49 6e 64 65 78 20 6f 62 6a 65  ld an Index obje
16d70 63 74 20 77 69 74 68 20 6e 43 6f 6c 20 63 6f 6c  ct with nCol col
16d80 75 6d 6e 73 2e 0a 2a 2a 0a 2a 2a 20 49 6e 63 72  umns..**.** Incr
16d90 65 61 73 65 20 74 68 65 20 61 6c 6c 6f 63 61 74  ease the allocat
16da0 69 6f 6e 20 73 69 7a 65 20 74 6f 20 70 72 6f 76  ion size to prov
16db0 69 64 65 20 61 6e 20 65 78 74 72 61 20 6e 45 78  ide an extra nEx
16dc0 74 72 61 20 62 79 74 65 73 0a 2a 2a 20 6f 66 20  tra bytes.** of 
16dd0 38 2d 62 79 74 65 20 61 6c 69 67 6e 65 64 20 73  8-byte aligned s
16de0 70 61 63 65 20 61 66 74 65 72 20 74 68 65 20 49  pace after the I
16df0 6e 64 65 78 20 6f 62 6a 65 63 74 20 61 6e 64 20  ndex object and 
16e00 72 65 74 75 72 6e 20 61 0a 2a 2a 20 70 6f 69 6e  return a.** poin
16e10 74 65 72 20 74 6f 20 74 68 69 73 20 65 78 74 72  ter to this extr
16e20 61 20 73 70 61 63 65 20 69 6e 20 2a 70 70 45 78  a space in *ppEx
16e30 74 72 61 2e 0a 2a 2f 0a 49 6e 64 65 78 20 2a 73  tra..*/.Index *s
16e40 71 6c 69 74 65 33 41 6c 6c 6f 63 61 74 65 49 6e  qlite3AllocateIn
16e50 64 65 78 4f 62 6a 65 63 74 28 0a 20 20 73 71 6c  dexObject(.  sql
16e60 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20  ite3 *db,       
16e70 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f    /* Database co
16e80 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 31  nnection */.  i1
16e90 36 20 6e 43 6f 6c 2c 20 20 20 20 20 20 20 20 20  6 nCol,         
16ea0 20 20 20 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d 62     /* Total numb
16eb0 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e  er of columns in
16ec0 20 74 68 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20   the index */.  
16ed0 69 6e 74 20 6e 45 78 74 72 61 2c 20 20 20 20 20  int nExtra,     
16ee0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
16ef0 66 20 62 79 74 65 73 20 6f 66 20 65 78 74 72 61  f bytes of extra
16f00 20 73 70 61 63 65 20 74 6f 20 61 6c 6c 6f 63 20   space to alloc 
16f10 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 70 70 45 78  */.  char **ppEx
16f20 74 72 61 20 20 20 20 20 20 20 2f 2a 20 50 6f 69  tra       /* Poi
16f30 6e 74 65 72 20 74 6f 20 74 68 65 20 22 65 78 74  nter to the "ext
16f40 72 61 22 20 73 70 61 63 65 20 2a 2f 0a 29 7b 0a  ra" space */.){.
16f50 20 20 49 6e 64 65 78 20 2a 70 3b 20 20 20 20 20    Index *p;     
16f60 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61         /* Alloca
16f70 74 65 64 20 69 6e 64 65 78 20 6f 62 6a 65 63 74  ted index object
16f80 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b   */.  int nByte;
16f90 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79             /* By
16fa0 74 65 73 20 6f 66 20 73 70 61 63 65 20 66 6f 72  tes of space for
16fb0 20 49 6e 64 65 78 20 6f 62 6a 65 63 74 20 2b 20   Index object + 
16fc0 61 72 72 61 79 73 20 2a 2f 0a 0a 20 20 6e 42 79  arrays */..  nBy
16fd0 74 65 20 3d 20 52 4f 55 4e 44 38 28 73 69 7a 65  te = ROUND8(size
16fe0 6f 66 28 49 6e 64 65 78 29 29 20 2b 20 20 20 20  of(Index)) +    
16ff0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
17000 65 78 20 73 74 72 75 63 74 75 72 65 20 20 2a 2f  ex structure  */
17010 0a 20 20 20 20 20 20 20 20 20 20 52 4f 55 4e 44  .          ROUND
17020 38 28 73 69 7a 65 6f 66 28 63 68 61 72 2a 29 2a  8(sizeof(char*)*
17030 6e 43 6f 6c 29 20 2b 20 20 20 20 20 20 20 20 20  nCol) +         
17040 2f 2a 20 49 6e 64 65 78 2e 61 7a 43 6f 6c 6c 20  /* Index.azColl 
17050 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20      */.         
17060 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 4c   ROUND8(sizeof(L
17070 6f 67 45 73 74 29 2a 28 6e 43 6f 6c 2b 31 29 20  ogEst)*(nCol+1) 
17080 2b 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 2e 61  +     /* Index.a
17090 69 52 6f 77 4c 6f 67 45 73 74 20 20 20 2a 2f 0a  iRowLogEst   */.
170a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
170b0 20 73 69 7a 65 6f 66 28 69 31 36 29 2a 6e 43 6f   sizeof(i16)*nCo
170c0 6c 20 2b 20 20 20 20 20 20 20 20 20 20 20 20 2f  l +            /
170d0 2a 20 49 6e 64 65 78 2e 61 69 43 6f 6c 75 6d 6e  * Index.aiColumn
170e0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20     */.          
170f0 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28 75 38         sizeof(u8
17100 29 2a 6e 43 6f 6c 29 3b 20 20 20 20 20 20 20 20  )*nCol);        
17110 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 2e 61 53       /* Index.aS
17120 6f 72 74 4f 72 64 65 72 20 2a 2f 0a 20 20 70 20  ortOrder */.  p 
17130 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
17140 63 5a 65 72 6f 28 64 62 2c 20 6e 42 79 74 65 20  cZero(db, nByte 
17150 2b 20 6e 45 78 74 72 61 29 3b 0a 20 20 69 66 28  + nExtra);.  if(
17160 20 70 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a   p ){.    char *
17170 70 45 78 74 72 61 20 3d 20 28 28 63 68 61 72 2a  pExtra = ((char*
17180 29 70 29 2b 52 4f 55 4e 44 38 28 73 69 7a 65 6f  )p)+ROUND8(sizeo
17190 66 28 49 6e 64 65 78 29 29 3b 0a 20 20 20 20 70  f(Index));.    p
171a0 2d 3e 61 7a 43 6f 6c 6c 20 3d 20 28 63 6f 6e 73  ->azColl = (cons
171b0 74 20 63 68 61 72 2a 2a 29 70 45 78 74 72 61 3b  t char**)pExtra;
171c0 20 70 45 78 74 72 61 20 2b 3d 20 52 4f 55 4e 44   pExtra += ROUND
171d0 38 28 73 69 7a 65 6f 66 28 63 68 61 72 2a 29 2a  8(sizeof(char*)*
171e0 6e 43 6f 6c 29 3b 0a 20 20 20 20 70 2d 3e 61 69  nCol);.    p->ai
171f0 52 6f 77 4c 6f 67 45 73 74 20 3d 20 28 4c 6f 67  RowLogEst = (Log
17200 45 73 74 2a 29 70 45 78 74 72 61 3b 20 70 45 78  Est*)pExtra; pEx
17210 74 72 61 20 2b 3d 20 73 69 7a 65 6f 66 28 4c 6f  tra += sizeof(Lo
17220 67 45 73 74 29 2a 28 6e 43 6f 6c 2b 31 29 3b 0a  gEst)*(nCol+1);.
17230 20 20 20 20 70 2d 3e 61 69 43 6f 6c 75 6d 6e 20      p->aiColumn 
17240 3d 20 28 69 31 36 2a 29 70 45 78 74 72 61 3b 20  = (i16*)pExtra; 
17250 20 20 20 20 20 20 70 45 78 74 72 61 20 2b 3d 20        pExtra += 
17260 73 69 7a 65 6f 66 28 69 31 36 29 2a 6e 43 6f 6c  sizeof(i16)*nCol
17270 3b 0a 20 20 20 20 70 2d 3e 61 53 6f 72 74 4f 72  ;.    p->aSortOr
17280 64 65 72 20 3d 20 28 75 38 2a 29 70 45 78 74 72  der = (u8*)pExtr
17290 61 3b 0a 20 20 20 20 70 2d 3e 6e 43 6f 6c 75 6d  a;.    p->nColum
172a0 6e 20 3d 20 6e 43 6f 6c 3b 0a 20 20 20 20 70 2d  n = nCol;.    p-
172b0 3e 6e 4b 65 79 43 6f 6c 20 3d 20 6e 43 6f 6c 20  >nKeyCol = nCol 
172c0 2d 20 31 3b 0a 20 20 20 20 2a 70 70 45 78 74 72  - 1;.    *ppExtr
172d0 61 20 3d 20 28 28 63 68 61 72 2a 29 70 29 20 2b  a = ((char*)p) +
172e0 20 6e 42 79 74 65 3b 0a 20 20 7d 0a 20 20 72 65   nByte;.  }.  re
172f0 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn p;.}../*.**
17300 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 69 6e   Create a new in
17310 64 65 78 20 66 6f 72 20 61 6e 20 53 51 4c 20 74  dex for an SQL t
17320 61 62 6c 65 2e 20 20 70 4e 61 6d 65 31 2e 70 4e  able.  pName1.pN
17330 61 6d 65 32 20 69 73 20 74 68 65 20 6e 61 6d 65  ame2 is the name
17340 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 0a 2a   of the index .*
17350 2a 20 61 6e 64 20 70 54 62 6c 4c 69 73 74 20 69  * and pTblList i
17360 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  s the name of th
17370 65 20 74 61 62 6c 65 20 74 68 61 74 20 69 73 20  e table that is 
17380 74 6f 20 62 65 20 69 6e 64 65 78 65 64 2e 20 20  to be indexed.  
17390 42 6f 74 68 20 77 69 6c 6c 20 0a 2a 2a 20 62 65  Both will .** be
173a0 20 4e 55 4c 4c 20 66 6f 72 20 61 20 70 72 69 6d   NULL for a prim
173b0 61 72 79 20 6b 65 79 20 6f 72 20 61 6e 20 69 6e  ary key or an in
173c0 64 65 78 20 74 68 61 74 20 69 73 20 63 72 65 61  dex that is crea
173d0 74 65 64 20 74 6f 20 73 61 74 69 73 66 79 20 61  ted to satisfy a
173e0 0a 2a 2a 20 55 4e 49 51 55 45 20 63 6f 6e 73 74  .** UNIQUE const
173f0 72 61 69 6e 74 2e 20 20 49 66 20 70 54 61 62 6c  raint.  If pTabl
17400 65 20 61 6e 64 20 70 49 6e 64 65 78 20 61 72 65  e and pIndex are
17410 20 4e 55 4c 4c 2c 20 75 73 65 20 70 50 61 72 73   NULL, use pPars
17420 65 2d 3e 70 4e 65 77 54 61 62 6c 65 0a 2a 2a 20  e->pNewTable.** 
17430 61 73 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20  as the table to 
17440 62 65 20 69 6e 64 65 78 65 64 2e 20 20 70 50 61  be indexed.  pPa
17450 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 69  rse->pNewTable i
17460 73 20 61 20 74 61 62 6c 65 20 74 68 61 74 20 69  s a table that i
17470 73 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 62  s.** currently b
17480 65 69 6e 67 20 63 6f 6e 73 74 72 75 63 74 65 64  eing constructed
17490 20 62 79 20 61 20 43 52 45 41 54 45 20 54 41 42   by a CREATE TAB
174a0 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a  LE statement..**
174b0 0a 2a 2a 20 70 4c 69 73 74 20 69 73 20 61 20 6c  .** pList is a l
174c0 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74  ist of columns t
174d0 6f 20 62 65 20 69 6e 64 65 78 65 64 2e 20 20 70  o be indexed.  p
174e0 4c 69 73 74 20 77 69 6c 6c 20 62 65 20 4e 55 4c  List will be NUL
174f0 4c 20 69 66 20 74 68 69 73 0a 2a 2a 20 69 73 20  L if this.** is 
17500 61 20 70 72 69 6d 61 72 79 20 6b 65 79 20 6f 72  a primary key or
17510 20 75 6e 69 71 75 65 2d 63 6f 6e 73 74 72 61 69   unique-constrai
17520 6e 74 20 6f 6e 20 74 68 65 20 6d 6f 73 74 20 72  nt on the most r
17530 65 63 65 6e 74 20 63 6f 6c 75 6d 6e 20 61 64 64  ecent column add
17540 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20 74 61 62  ed.** to the tab
17550 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64  le currently und
17560 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e  er construction.
17570 20 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20    .**.** If the 
17580 69 6e 64 65 78 20 69 73 20 63 72 65 61 74 65 64  index is created
17590 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2c 20 72   successfully, r
175a0 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
175b0 74 6f 20 74 68 65 20 6e 65 77 20 49 6e 64 65 78  to the new Index
175c0 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 2e 20 54  .** structure. T
175d0 68 69 73 20 69 73 20 75 73 65 64 20 62 79 20 73  his is used by s
175e0 71 6c 69 74 65 33 41 64 64 50 72 69 6d 61 72 79  qlite3AddPrimary
175f0 4b 65 79 28 29 20 74 6f 20 6d 61 72 6b 20 74 68  Key() to mark th
17600 65 20 69 6e 64 65 78 0a 2a 2a 20 61 73 20 74 68  e index.** as th
17610 65 20 74 61 62 6c 65 73 20 70 72 69 6d 61 72 79  e tables primary
17620 20 6b 65 79 20 28 49 6e 64 65 78 2e 69 64 78 54   key (Index.idxT
17630 79 70 65 3d 3d 53 51 4c 49 54 45 5f 49 44 58 54  ype==SQLITE_IDXT
17640 59 50 45 5f 50 52 49 4d 41 52 59 4b 45 59 29 0a  YPE_PRIMARYKEY).
17650 2a 2f 0a 49 6e 64 65 78 20 2a 73 71 6c 69 74 65  */.Index *sqlite
17660 33 43 72 65 61 74 65 49 6e 64 65 78 28 0a 20 20  3CreateIndex(.  
17670 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
17680 20 20 20 2f 2a 20 41 6c 6c 20 69 6e 66 6f 72 6d     /* All inform
17690 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 69 73  ation about this
176a0 20 70 61 72 73 65 20 2a 2f 0a 20 20 54 6f 6b 65   parse */.  Toke
176b0 6e 20 2a 70 4e 61 6d 65 31 2c 20 20 20 20 20 2f  n *pName1,     /
176c0 2a 20 46 69 72 73 74 20 70 61 72 74 20 6f 66 20  * First part of 
176d0 69 6e 64 65 78 20 6e 61 6d 65 2e 20 4d 61 79 20  index name. May 
176e0 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 54 6f 6b  be NULL */.  Tok
176f0 65 6e 20 2a 70 4e 61 6d 65 32 2c 20 20 20 20 20  en *pName2,     
17700 2f 2a 20 53 65 63 6f 6e 64 20 70 61 72 74 20 6f  /* Second part o
17710 66 20 69 6e 64 65 78 20 6e 61 6d 65 2e 20 4d 61  f index name. Ma
17720 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 53  y be NULL */.  S
17730 72 63 4c 69 73 74 20 2a 70 54 62 6c 4e 61 6d 65  rcList *pTblName
17740 2c 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20 69 6e  , /* Table to in
17750 64 65 78 2e 20 55 73 65 20 70 50 61 72 73 65 2d  dex. Use pParse-
17760 3e 70 4e 65 77 54 61 62 6c 65 20 69 66 20 30 20  >pNewTable if 0 
17770 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
17780 4c 69 73 74 2c 20 20 20 2f 2a 20 41 20 6c 69 73  List,   /* A lis
17790 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 6f 20  t of columns to 
177a0 62 65 20 69 6e 64 65 78 65 64 20 2a 2f 0a 20 20  be indexed */.  
177b0 69 6e 74 20 6f 6e 45 72 72 6f 72 2c 20 20 20 20  int onError,    
177c0 20 20 20 2f 2a 20 4f 45 5f 41 62 6f 72 74 2c 20     /* OE_Abort, 
177d0 4f 45 5f 49 67 6e 6f 72 65 2c 20 4f 45 5f 52 65  OE_Ignore, OE_Re
177e0 70 6c 61 63 65 2c 20 6f 72 20 4f 45 5f 4e 6f 6e  place, or OE_Non
177f0 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 53  e */.  Token *pS
17800 74 61 72 74 2c 20 20 20 20 20 2f 2a 20 54 68 65  tart,     /* The
17810 20 43 52 45 41 54 45 20 74 6f 6b 65 6e 20 74 68   CREATE token th
17820 61 74 20 62 65 67 69 6e 73 20 74 68 69 73 20 73  at begins this s
17830 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 45 78  tatement */.  Ex
17840 70 72 20 2a 70 50 49 57 68 65 72 65 2c 20 20 20  pr *pPIWhere,   
17850 20 2f 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65   /* WHERE clause
17860 20 66 6f 72 20 70 61 72 74 69 61 6c 20 69 6e 64   for partial ind
17870 69 63 65 73 20 2a 2f 0a 20 20 69 6e 74 20 73 6f  ices */.  int so
17880 72 74 4f 72 64 65 72 2c 20 20 20 20 20 2f 2a 20  rtOrder,     /* 
17890 53 6f 72 74 20 6f 72 64 65 72 20 6f 66 20 70 72  Sort order of pr
178a0 69 6d 61 72 79 20 6b 65 79 20 77 68 65 6e 20 70  imary key when p
178b0 4c 69 73 74 3d 3d 4e 55 4c 4c 20 2a 2f 0a 20 20  List==NULL */.  
178c0 69 6e 74 20 69 66 4e 6f 74 45 78 69 73 74 20 20  int ifNotExist  
178d0 20 20 20 2f 2a 20 4f 6d 69 74 20 65 72 72 6f 72     /* Omit error
178e0 20 69 66 20 69 6e 64 65 78 20 61 6c 72 65 61 64   if index alread
178f0 79 20 65 78 69 73 74 73 20 2a 2f 0a 29 7b 0a 20  y exists */.){. 
17900 20 49 6e 64 65 78 20 2a 70 52 65 74 20 3d 20 30   Index *pRet = 0
17910 3b 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72  ;     /* Pointer
17920 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20   to return */.  
17930 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 30 3b  Table *pTab = 0;
17940 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 74 6f       /* Table to
17950 20 62 65 20 69 6e 64 65 78 65 64 20 2a 2f 0a 20   be indexed */. 
17960 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 20 3d   Index *pIndex =
17970 20 30 3b 20 20 20 2f 2a 20 54 68 65 20 69 6e 64   0;   /* The ind
17980 65 78 20 74 6f 20 62 65 20 63 72 65 61 74 65 64  ex to be created
17990 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d   */.  char *zNam
179a0 65 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 4e 61  e = 0;     /* Na
179b0 6d 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20  me of the index 
179c0 2a 2f 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 3b 20  */.  int nName; 
179d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
179e0 62 65 72 20 6f 66 20 63 68 61 72 61 63 74 65 72  ber of character
179f0 73 20 69 6e 20 7a 4e 61 6d 65 20 2a 2f 0a 20 20  s in zName */.  
17a00 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 44 62 46 69  int i, j;.  DbFi
17a10 78 65 72 20 73 46 69 78 3b 20 20 20 20 20 20 20  xer sFix;       
17a20 20 2f 2a 20 46 6f 72 20 61 73 73 69 67 6e 69 6e   /* For assignin
17a30 67 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 73  g database names
17a40 20 74 6f 20 70 54 61 62 6c 65 20 2a 2f 0a 20 20   to pTable */.  
17a50 69 6e 74 20 73 6f 72 74 4f 72 64 65 72 4d 61 73  int sortOrderMas
17a60 6b 3b 20 20 20 2f 2a 20 31 20 74 6f 20 68 6f 6e  k;   /* 1 to hon
17a70 6f 72 20 44 45 53 43 20 69 6e 20 69 6e 64 65 78  or DESC in index
17a80 2e 20 20 30 20 74 6f 20 69 67 6e 6f 72 65 2e 20  .  0 to ignore. 
17a90 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
17aa0 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
17ab0 20 44 62 20 2a 70 44 62 3b 20 20 20 20 20 20 20   Db *pDb;       
17ac0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73 70 65        /* The spe
17ad0 63 69 66 69 63 20 74 61 62 6c 65 20 63 6f 6e 74  cific table cont
17ae0 61 69 6e 69 6e 67 20 74 68 65 20 69 6e 64 65 78  aining the index
17af0 65 64 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  ed database */. 
17b00 20 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20 20   int iDb;       
17b10 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f        /* Index o
17b20 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74  f the database t
17b30 68 61 74 20 69 73 20 62 65 69 6e 67 20 77 72 69  hat is being wri
17b40 74 74 65 6e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  tten */.  Token 
17b50 2a 70 4e 61 6d 65 20 3d 20 30 3b 20 20 20 20 2f  *pName = 0;    /
17b60 2a 20 55 6e 71 75 61 6c 69 66 69 65 64 20 6e 61  * Unqualified na
17b70 6d 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20  me of the index 
17b80 74 6f 20 63 72 65 61 74 65 20 2a 2f 0a 20 20 73  to create */.  s
17b90 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
17ba0 74 65 6d 20 2a 70 4c 69 73 74 49 74 65 6d 3b 20  tem *pListItem; 
17bb0 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f  /* For looping o
17bc0 76 65 72 20 70 4c 69 73 74 20 2a 2f 0a 20 20 69  ver pList */.  i
17bd0 6e 74 20 6e 45 78 74 72 61 20 3d 20 30 3b 20 20  nt nExtra = 0;  
17be0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17bf0 2f 2a 20 53 70 61 63 65 20 61 6c 6c 6f 63 61 74  /* Space allocat
17c00 65 64 20 66 6f 72 20 7a 45 78 74 72 61 5b 5d 20  ed for zExtra[] 
17c10 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 43  */.  int nExtraC
17c20 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ol;             
17c30 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
17c40 6f 66 20 65 78 74 72 61 20 63 6f 6c 75 6d 6e 73  of extra columns
17c50 20 6e 65 65 64 65 64 20 2a 2f 0a 20 20 63 68 61   needed */.  cha
17c60 72 20 2a 7a 45 78 74 72 61 20 3d 20 30 3b 20 20  r *zExtra = 0;  
17c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
17c80 20 45 78 74 72 61 20 73 70 61 63 65 20 61 66 74   Extra space aft
17c90 65 72 20 74 68 65 20 49 6e 64 65 78 20 6f 62 6a  er the Index obj
17ca0 65 63 74 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a  ect */.  Index *
17cb0 70 50 6b 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a  pPk = 0;      /*
17cc0 20 50 52 49 4d 41 52 59 20 4b 45 59 20 69 6e 64   PRIMARY KEY ind
17cd0 65 78 20 66 6f 72 20 57 49 54 48 4f 55 54 20 52  ex for WITHOUT R
17ce0 4f 57 49 44 20 74 61 62 6c 65 73 20 2a 2f 0a 0a  OWID tables */..
17cf0 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
17d00 46 61 69 6c 65 64 20 7c 7c 20 49 4e 5f 44 45 43  Failed || IN_DEC
17d10 4c 41 52 45 5f 56 54 41 42 20 7c 7c 20 70 50 61  LARE_VTAB || pPa
17d20 72 73 65 2d 3e 6e 45 72 72 3e 30 20 29 7b 0a 20  rse->nErr>0 ){. 
17d30 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65     goto exit_cre
17d40 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20  ate_index;.  }. 
17d50 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d   if( SQLITE_OK!=
17d60 73 71 6c 69 74 65 33 52 65 61 64 53 63 68 65 6d  sqlite3ReadSchem
17d70 61 28 70 50 61 72 73 65 29 20 29 7b 0a 20 20 20  a(pParse) ){.   
17d80 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
17d90 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 0a 20 20  e_index;.  }..  
17da0 2f 2a 0a 20 20 2a 2a 20 46 69 6e 64 20 74 68 65  /*.  ** Find the
17db0 20 74 61 62 6c 65 20 74 68 61 74 20 69 73 20 74   table that is t
17dc0 6f 20 62 65 20 69 6e 64 65 78 65 64 2e 20 20 52  o be indexed.  R
17dd0 65 74 75 72 6e 20 65 61 72 6c 79 20 69 66 20 6e  eturn early if n
17de0 6f 74 20 66 6f 75 6e 64 2e 0a 20 20 2a 2f 0a 20  ot found..  */. 
17df0 20 69 66 28 20 70 54 62 6c 4e 61 6d 65 21 3d 30   if( pTblName!=0
17e00 20 29 7b 0a 0a 20 20 20 20 2f 2a 20 55 73 65 20   ){..    /* Use 
17e10 74 68 65 20 74 77 6f 2d 70 61 72 74 20 69 6e 64  the two-part ind
17e20 65 78 20 6e 61 6d 65 20 74 6f 20 64 65 74 65 72  ex name to deter
17e30 6d 69 6e 65 20 74 68 65 20 64 61 74 61 62 61 73  mine the databas
17e40 65 20 0a 20 20 20 20 2a 2a 20 74 6f 20 73 65 61  e .    ** to sea
17e50 72 63 68 20 66 6f 72 20 74 68 65 20 74 61 62 6c  rch for the tabl
17e60 65 2e 20 27 46 69 78 27 20 74 68 65 20 74 61 62  e. 'Fix' the tab
17e70 6c 65 20 6e 61 6d 65 20 74 6f 20 74 68 69 73 20  le name to this 
17e80 64 62 0a 20 20 20 20 2a 2a 20 62 65 66 6f 72 65  db.    ** before
17e90 20 6c 6f 6f 6b 69 6e 67 20 75 70 20 74 68 65 20   looking up the 
17ea0 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20  table..    */.  
17eb0 20 20 61 73 73 65 72 74 28 20 70 4e 61 6d 65 31    assert( pName1
17ec0 20 26 26 20 70 4e 61 6d 65 32 20 29 3b 0a 20 20   && pName2 );.  
17ed0 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 54    iDb = sqlite3T
17ee0 77 6f 50 61 72 74 4e 61 6d 65 28 70 50 61 72 73  woPartName(pPars
17ef0 65 2c 20 70 4e 61 6d 65 31 2c 20 70 4e 61 6d 65  e, pName1, pName
17f00 32 2c 20 26 70 4e 61 6d 65 29 3b 0a 20 20 20 20  2, &pName);.    
17f10 69 66 28 20 69 44 62 3c 30 20 29 20 67 6f 74 6f  if( iDb<0 ) goto
17f20 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
17f30 65 78 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ex;.    assert( 
17f40 70 4e 61 6d 65 20 26 26 20 70 4e 61 6d 65 2d 3e  pName && pName->
17f50 7a 20 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51  z );..#ifndef SQ
17f60 4c 49 54 45 5f 4f 4d 49 54 5f 54 45 4d 50 44 42  LITE_OMIT_TEMPDB
17f70 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 69  .    /* If the i
17f80 6e 64 65 78 20 6e 61 6d 65 20 77 61 73 20 75 6e  ndex name was un
17f90 71 75 61 6c 69 66 69 65 64 2c 20 63 68 65 63 6b  qualified, check
17fa0 20 69 66 20 74 68 65 20 74 61 62 6c 65 0a 20 20   if the table.  
17fb0 20 20 2a 2a 20 69 73 20 61 20 74 65 6d 70 20 74    ** is a temp t
17fc0 61 62 6c 65 2e 20 49 66 20 73 6f 2c 20 73 65 74  able. If so, set
17fd0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74 6f   the database to
17fe0 20 31 2e 20 44 6f 20 6e 6f 74 20 64 6f 20 74 68   1. Do not do th
17ff0 69 73 0a 20 20 20 20 2a 2a 20 69 66 20 69 6e 69  is.    ** if ini
18000 74 69 61 6c 69 73 69 6e 67 20 61 20 64 61 74 61  tialising a data
18010 62 61 73 65 20 73 63 68 65 6d 61 2e 0a 20 20 20  base schema..   
18020 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 64 62 2d   */.    if( !db-
18030 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20 20  >init.busy ){.  
18040 20 20 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74      pTab = sqlit
18050 65 33 53 72 63 4c 69 73 74 4c 6f 6f 6b 75 70 28  e3SrcListLookup(
18060 70 50 61 72 73 65 2c 20 70 54 62 6c 4e 61 6d 65  pParse, pTblName
18070 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4e 61  );.      if( pNa
18080 6d 65 32 2d 3e 6e 3d 3d 30 20 26 26 20 70 54 61  me2->n==0 && pTa
18090 62 20 26 26 20 70 54 61 62 2d 3e 70 53 63 68 65  b && pTab->pSche
180a0 6d 61 3d 3d 64 62 2d 3e 61 44 62 5b 31 5d 2e 70  ma==db->aDb[1].p
180b0 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 20 20  Schema ){.      
180c0 20 20 69 44 62 20 3d 20 31 3b 0a 20 20 20 20 20    iDb = 1;.     
180d0 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a   }.    }.#endif.
180e0 0a 20 20 20 20 73 71 6c 69 74 65 33 46 69 78 49  .    sqlite3FixI
180f0 6e 69 74 28 26 73 46 69 78 2c 20 70 50 61 72 73  nit(&sFix, pPars
18100 65 2c 20 69 44 62 2c 20 22 69 6e 64 65 78 22 2c  e, iDb, "index",
18110 20 70 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28   pName);.    if(
18120 20 73 71 6c 69 74 65 33 46 69 78 53 72 63 4c 69   sqlite3FixSrcLi
18130 73 74 28 26 73 46 69 78 2c 20 70 54 62 6c 4e 61  st(&sFix, pTblNa
18140 6d 65 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  me) ){.      /* 
18150 42 65 63 61 75 73 65 20 74 68 65 20 70 61 72 73  Because the pars
18160 65 72 20 63 6f 6e 73 74 72 75 63 74 73 20 70 54  er constructs pT
18170 62 6c 4e 61 6d 65 20 66 72 6f 6d 20 61 20 73 69  blName from a si
18180 6e 67 6c 65 20 69 64 65 6e 74 69 66 69 65 72 2c  ngle identifier,
18190 0a 20 20 20 20 20 20 2a 2a 20 73 71 6c 69 74 65  .      ** sqlite
181a0 33 46 69 78 53 72 63 4c 69 73 74 20 63 61 6e 20  3FixSrcList can 
181b0 6e 65 76 65 72 20 66 61 69 6c 2e 20 2a 2f 0a 20  never fail. */. 
181c0 20 20 20 20 20 61 73 73 65 72 74 28 30 29 3b 0a       assert(0);.
181d0 20 20 20 20 7d 0a 20 20 20 20 70 54 61 62 20 3d      }.    pTab =
181e0 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61   sqlite3LocateTa
181f0 62 6c 65 49 74 65 6d 28 70 50 61 72 73 65 2c 20  bleItem(pParse, 
18200 30 2c 20 26 70 54 62 6c 4e 61 6d 65 2d 3e 61 5b  0, &pTblName->a[
18210 30 5d 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0]);.    assert(
18220 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
18230 64 3d 3d 30 20 7c 7c 20 70 54 61 62 3d 3d 30 20  d==0 || pTab==0 
18240 29 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62 3d  );.    if( pTab=
18250 3d 30 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63  =0 ) goto exit_c
18260 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20  reate_index;.   
18270 20 69 66 28 20 69 44 62 3d 3d 31 20 26 26 20 64   if( iDb==1 && d
18280 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53 63 68  b->aDb[iDb].pSch
18290 65 6d 61 21 3d 70 54 61 62 2d 3e 70 53 63 68 65  ema!=pTab->pSche
182a0 6d 61 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ma ){.      sqli
182b0 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
182c0 73 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  se, .           
182d0 22 63 61 6e 6e 6f 74 20 63 72 65 61 74 65 20 61  "cannot create a
182e0 20 54 45 4d 50 20 69 6e 64 65 78 20 6f 6e 20 6e   TEMP index on n
182f0 6f 6e 2d 54 45 4d 50 20 74 61 62 6c 65 20 5c 22  on-TEMP table \"
18300 25 73 5c 22 22 2c 0a 20 20 20 20 20 20 20 20 20  %s\"",.         
18310 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a    pTab->zName);.
18320 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f        goto exit_
18330 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
18340 20 20 7d 0a 20 20 20 20 69 66 28 20 21 48 61 73    }.    if( !Has
18350 52 6f 77 69 64 28 70 54 61 62 29 20 29 20 70 50  Rowid(pTab) ) pP
18360 6b 20 3d 20 73 71 6c 69 74 65 33 50 72 69 6d 61  k = sqlite3Prima
18370 72 79 4b 65 79 49 6e 64 65 78 28 70 54 61 62 29  ryKeyIndex(pTab)
18380 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  ;.  }else{.    a
18390 73 73 65 72 74 28 20 70 4e 61 6d 65 3d 3d 30 20  ssert( pName==0 
183a0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
183b0 53 74 61 72 74 3d 3d 30 20 29 3b 0a 20 20 20 20  Start==0 );.    
183c0 70 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 70  pTab = pParse->p
183d0 4e 65 77 54 61 62 6c 65 3b 0a 20 20 20 20 69 66  NewTable;.    if
183e0 28 20 21 70 54 61 62 20 29 20 67 6f 74 6f 20 65  ( !pTab ) goto e
183f0 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
18400 3b 0a 20 20 20 20 69 44 62 20 3d 20 73 71 6c 69  ;.    iDb = sqli
18410 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78  te3SchemaToIndex
18420 28 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65  (db, pTab->pSche
18430 6d 61 29 3b 0a 20 20 7d 0a 20 20 70 44 62 20 3d  ma);.  }.  pDb =
18440 20 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a   &db->aDb[iDb];.
18450 0a 20 20 61 73 73 65 72 74 28 20 70 54 61 62 21  .  assert( pTab!
18460 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
18470 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 20  pParse->nErr==0 
18480 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  );.  if( sqlite3
18490 53 74 72 4e 49 43 6d 70 28 70 54 61 62 2d 3e 7a  StrNICmp(pTab->z
184a0 4e 61 6d 65 2c 20 22 73 71 6c 69 74 65 5f 22 2c  Name, "sqlite_",
184b0 20 37 29 3d 3d 30 20 0a 20 20 20 20 20 20 20 26   7)==0 .       &
184c0 26 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d  & db->init.busy=
184d0 3d 30 0a 23 69 66 20 53 51 4c 49 54 45 5f 55 53  =0.#if SQLITE_US
184e0 45 52 5f 41 55 54 48 45 4e 54 49 43 41 54 49 4f  ER_AUTHENTICATIO
184f0 4e 0a 20 20 20 20 20 20 20 26 26 20 73 71 6c 69  N.       && sqli
18500 74 65 33 55 73 65 72 41 75 74 68 54 61 62 6c 65  te3UserAuthTable
18510 28 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3d 3d 30  (pTab->zName)==0
18520 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 26  .#endif.       &
18530 26 20 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d  & sqlite3StrNICm
18540 70 28 26 70 54 61 62 2d 3e 7a 4e 61 6d 65 5b 37  p(&pTab->zName[7
18550 5d 2c 22 61 6c 74 65 72 74 61 62 5f 22 2c 39 29  ],"altertab_",9)
18560 21 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  !=0 ){.    sqlit
18570 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
18580 65 2c 20 22 74 61 62 6c 65 20 25 73 20 6d 61 79  e, "table %s may
18590 20 6e 6f 74 20 62 65 20 69 6e 64 65 78 65 64 22   not be indexed"
185a0 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a  , pTab->zName);.
185b0 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72      goto exit_cr
185c0 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a  eate_index;.  }.
185d0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
185e0 4d 49 54 5f 56 49 45 57 0a 20 20 69 66 28 20 70  MIT_VIEW.  if( p
185f0 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a  Tab->pSelect ){.
18600 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
18610 4d 73 67 28 70 50 61 72 73 65 2c 20 22 76 69 65  Msg(pParse, "vie
18620 77 73 20 6d 61 79 20 6e 6f 74 20 62 65 20 69 6e  ws may not be in
18630 64 65 78 65 64 22 29 3b 0a 20 20 20 20 67 6f 74  dexed");.    got
18640 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
18650 64 65 78 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  dex;.  }.#endif.
18660 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
18670 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
18680 0a 20 20 69 66 28 20 49 73 56 69 72 74 75 61 6c  .  if( IsVirtual
18690 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20 73 71  (pTab) ){.    sq
186a0 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
186b0 61 72 73 65 2c 20 22 76 69 72 74 75 61 6c 20 74  arse, "virtual t
186c0 61 62 6c 65 73 20 6d 61 79 20 6e 6f 74 20 62 65  ables may not be
186d0 20 69 6e 64 65 78 65 64 22 29 3b 0a 20 20 20 20   indexed");.    
186e0 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
186f0 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 23 65 6e 64  _index;.  }.#end
18700 69 66 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46 69  if..  /*.  ** Fi
18710 6e 64 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  nd the name of t
18720 68 65 20 69 6e 64 65 78 2e 20 20 4d 61 6b 65 20  he index.  Make 
18730 73 75 72 65 20 74 68 65 72 65 20 69 73 20 6e 6f  sure there is no
18740 74 20 61 6c 72 65 61 64 79 20 61 6e 6f 74 68 65  t already anothe
18750 72 0a 20 20 2a 2a 20 69 6e 64 65 78 20 6f 72 20  r.  ** index or 
18760 74 61 62 6c 65 20 77 69 74 68 20 74 68 65 20 73  table with the s
18770 61 6d 65 20 6e 61 6d 65 2e 20 20 0a 20 20 2a 2a  ame name.  .  **
18780 0a 20 20 2a 2a 20 45 78 63 65 70 74 69 6f 6e 3a  .  ** Exception:
18790 20 20 49 66 20 77 65 20 61 72 65 20 72 65 61 64    If we are read
187a0 69 6e 67 20 74 68 65 20 6e 61 6d 65 73 20 6f 66  ing the names of
187b0 20 70 65 72 6d 61 6e 65 6e 74 20 69 6e 64 69 63   permanent indic
187c0 65 73 20 66 72 6f 6d 20 74 68 65 0a 20 20 2a 2a  es from the.  **
187d0 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74   sqlite_master t
187e0 61 62 6c 65 20 28 62 65 63 61 75 73 65 20 73 6f  able (because so
187f0 6d 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  me other process
18800 20 63 68 61 6e 67 65 64 20 74 68 65 20 73 63 68   changed the sch
18810 65 6d 61 29 20 61 6e 64 0a 20 20 2a 2a 20 6f 6e  ema) and.  ** on
18820 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 6e  e of the index n
18830 61 6d 65 73 20 63 6f 6c 6c 69 64 65 73 20 77 69  ames collides wi
18840 74 68 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61  th the name of a
18850 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
18860 20 6f 72 0a 20 20 2a 2a 20 69 6e 64 65 78 2c 20   or.  ** index, 
18870 74 68 65 6e 20 77 65 20 77 69 6c 6c 20 63 6f 6e  then we will con
18880 74 69 6e 75 65 20 74 6f 20 70 72 6f 63 65 73 73  tinue to process
18890 20 74 68 69 73 20 69 6e 64 65 78 2e 0a 20 20 2a   this index..  *
188a0 2a 0a 20 20 2a 2a 20 49 66 20 70 4e 61 6d 65 3d  *.  ** If pName=
188b0 3d 30 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74  =0 it means that
188c0 20 77 65 20 61 72 65 0a 20 20 2a 2a 20 64 65 61   we are.  ** dea
188d0 6c 69 6e 67 20 77 69 74 68 20 61 20 70 72 69 6d  ling with a prim
188e0 61 72 79 20 6b 65 79 20 6f 72 20 55 4e 49 51 55  ary key or UNIQU
188f0 45 20 63 6f 6e 73 74 72 61 69 6e 74 2e 20 20 57  E constraint.  W
18900 65 20 68 61 76 65 20 74 6f 20 69 6e 76 65 6e 74  e have to invent
18910 20 6f 75 72 0a 20 20 2a 2a 20 6f 77 6e 20 6e 61   our.  ** own na
18920 6d 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  me..  */.  if( p
18930 4e 61 6d 65 20 29 7b 0a 20 20 20 20 7a 4e 61 6d  Name ){.    zNam
18940 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46  e = sqlite3NameF
18950 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 4e 61  romToken(db, pNa
18960 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 7a 4e 61  me);.    if( zNa
18970 6d 65 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78 69  me==0 ) goto exi
18980 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
18990 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 61 6d      assert( pNam
189a0 65 2d 3e 7a 21 3d 30 20 29 3b 0a 20 20 20 20 69  e->z!=0 );.    i
189b0 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71  f( SQLITE_OK!=sq
189c0 6c 69 74 65 33 43 68 65 63 6b 4f 62 6a 65 63 74  lite3CheckObject
189d0 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 7a 4e 61  Name(pParse, zNa
189e0 6d 65 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  me) ){.      got
189f0 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
18a00 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  dex;.    }.    i
18a10 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73  f( !db->init.bus
18a20 79 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73  y ){.      if( s
18a30 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28  qlite3FindTable(
18a40 64 62 2c 20 7a 4e 61 6d 65 2c 20 30 29 21 3d 30  db, zName, 0)!=0
18a50 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
18a60 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
18a70 73 65 2c 20 22 74 68 65 72 65 20 69 73 20 61 6c  se, "there is al
18a80 72 65 61 64 79 20 61 20 74 61 62 6c 65 20 6e 61  ready a table na
18a90 6d 65 64 20 25 73 22 2c 20 7a 4e 61 6d 65 29 3b  med %s", zName);
18aa0 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 78  .        goto ex
18ab0 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
18ac0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
18ad0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 46 69     if( sqlite3Fi
18ae0 6e 64 49 6e 64 65 78 28 64 62 2c 20 7a 4e 61 6d  ndIndex(db, zNam
18af0 65 2c 20 70 44 62 2d 3e 7a 4e 61 6d 65 29 21 3d  e, pDb->zName)!=
18b00 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 21  0 ){.      if( !
18b10 69 66 4e 6f 74 45 78 69 73 74 20 29 7b 0a 20 20  ifNotExist ){.  
18b20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
18b30 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 69  orMsg(pParse, "i
18b40 6e 64 65 78 20 25 73 20 61 6c 72 65 61 64 79 20  ndex %s already 
18b50 65 78 69 73 74 73 22 2c 20 7a 4e 61 6d 65 29 3b  exists", zName);
18b60 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
18b70 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 64        assert( !d
18b80 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 3b 0a  b->init.busy );.
18b90 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 43          sqlite3C
18ba0 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d 61 28  odeVerifySchema(
18bb0 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20  pParse, iDb);.  
18bc0 20 20 20 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f      }.      goto
18bd0 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
18be0 65 78 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  ex;.    }.  }els
18bf0 65 7b 0a 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20  e{.    int n;.  
18c00 20 20 49 6e 64 65 78 20 2a 70 4c 6f 6f 70 3b 0a    Index *pLoop;.
18c10 20 20 20 20 66 6f 72 28 70 4c 6f 6f 70 3d 70 54      for(pLoop=pT
18c20 61 62 2d 3e 70 49 6e 64 65 78 2c 20 6e 3d 31 3b  ab->pIndex, n=1;
18c30 20 70 4c 6f 6f 70 3b 20 70 4c 6f 6f 70 3d 70 4c   pLoop; pLoop=pL
18c40 6f 6f 70 2d 3e 70 4e 65 78 74 2c 20 6e 2b 2b 29  oop->pNext, n++)
18c50 7b 7d 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73  {}.    zName = s
18c60 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62  qlite3MPrintf(db
18c70 2c 20 22 73 71 6c 69 74 65 5f 61 75 74 6f 69 6e  , "sqlite_autoin
18c80 64 65 78 5f 25 73 5f 25 64 22 2c 20 70 54 61 62  dex_%s_%d", pTab
18c90 2d 3e 7a 4e 61 6d 65 2c 20 6e 29 3b 0a 20 20 20  ->zName, n);.   
18ca0 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 7b   if( zName==0 ){
18cb0 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74  .      goto exit
18cc0 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
18cd0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43     }.  }..  /* C
18ce0 68 65 63 6b 20 66 6f 72 20 61 75 74 68 6f 72 69  heck for authori
18cf0 7a 61 74 69 6f 6e 20 74 6f 20 63 72 65 61 74 65  zation to create
18d00 20 61 6e 20 69 6e 64 65 78 2e 0a 20 20 2a 2f 0a   an index..  */.
18d10 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
18d20 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f  MIT_AUTHORIZATIO
18d30 4e 0a 20 20 7b 0a 20 20 20 20 63 6f 6e 73 74 20  N.  {.    const 
18d40 63 68 61 72 20 2a 7a 44 62 20 3d 20 70 44 62 2d  char *zDb = pDb-
18d50 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 69 66 28 20  >zName;.    if( 
18d60 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b  sqlite3AuthCheck
18d70 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f  (pParse, SQLITE_
18d80 49 4e 53 45 52 54 2c 20 53 43 48 45 4d 41 5f 54  INSERT, SCHEMA_T
18d90 41 42 4c 45 28 69 44 62 29 2c 20 30 2c 20 7a 44  ABLE(iDb), 0, zD
18da0 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  b) ){.      goto
18db0 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
18dc0 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 20  ex;.    }.    i 
18dd0 3d 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f  = SQLITE_CREATE_
18de0 49 4e 44 45 58 3b 0a 20 20 20 20 69 66 28 20 21  INDEX;.    if( !
18df0 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26 26 20 69  OMIT_TEMPDB && i
18e00 44 62 3d 3d 31 20 29 20 69 20 3d 20 53 51 4c 49  Db==1 ) i = SQLI
18e10 54 45 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f 49  TE_CREATE_TEMP_I
18e20 4e 44 45 58 3b 0a 20 20 20 20 69 66 28 20 73 71  NDEX;.    if( sq
18e30 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70  lite3AuthCheck(p
18e40 50 61 72 73 65 2c 20 69 2c 20 7a 4e 61 6d 65 2c  Parse, i, zName,
18e50 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 44   pTab->zName, zD
18e60 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  b) ){.      goto
18e70 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
18e80 65 78 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65  ex;.    }.  }.#e
18e90 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20 70 4c  ndif..  /* If pL
18ea0 69 73 74 3d 3d 30 2c 20 69 74 20 6d 65 61 6e 73  ist==0, it means
18eb0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 61   this routine wa
18ec0 73 20 63 61 6c 6c 65 64 20 74 6f 20 6d 61 6b 65  s called to make
18ed0 20 61 20 70 72 69 6d 61 72 79 0a 20 20 2a 2a 20   a primary.  ** 
18ee0 6b 65 79 20 6f 75 74 20 6f 66 20 74 68 65 20 6c  key out of the l
18ef0 61 73 74 20 63 6f 6c 75 6d 6e 20 61 64 64 65 64  ast column added
18f00 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 75 6e   to the table un
18f10 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e  der construction
18f20 2e 0a 20 20 2a 2a 20 53 6f 20 63 72 65 61 74 65  ..  ** So create
18f30 20 61 20 66 61 6b 65 20 6c 69 73 74 20 74 6f 20   a fake list to 
18f40 73 69 6d 75 6c 61 74 65 20 74 68 69 73 2e 0a 20  simulate this.. 
18f50 20 2a 2f 0a 20 20 69 66 28 20 70 4c 69 73 74 3d   */.  if( pList=
18f60 3d 30 20 29 7b 0a 20 20 20 20 54 6f 6b 65 6e 20  =0 ){.    Token 
18f70 70 72 65 76 43 6f 6c 3b 0a 20 20 20 20 73 71 6c  prevCol;.    sql
18f80 69 74 65 33 54 6f 6b 65 6e 49 6e 69 74 28 26 70  ite3TokenInit(&p
18f90 72 65 76 43 6f 6c 2c 20 70 54 61 62 2d 3e 61 43  revCol, pTab->aC
18fa0 6f 6c 5b 70 54 61 62 2d 3e 6e 43 6f 6c 2d 31 5d  ol[pTab->nCol-1]
18fb0 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70 4c 69  .zName);.    pLi
18fc0 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  st = sqlite3Expr
18fd0 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61 72 73  ListAppend(pPars
18fe0 65 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20  e, 0,.          
18ff0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 41      sqlite3ExprA
19000 6c 6c 6f 63 28 64 62 2c 20 54 4b 5f 49 44 2c 20  lloc(db, TK_ID, 
19010 26 70 72 65 76 43 6f 6c 2c 20 30 29 29 3b 0a 20  &prevCol, 0));. 
19020 20 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20     if( pList==0 
19030 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61  ) goto exit_crea
19040 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 61 73  te_index;.    as
19050 73 65 72 74 28 20 70 4c 69 73 74 2d 3e 6e 45 78  sert( pList->nEx
19060 70 72 3d 3d 31 20 29 3b 0a 20 20 20 20 73 71 6c  pr==1 );.    sql
19070 69 74 65 33 45 78 70 72 4c 69 73 74 53 65 74 53  ite3ExprListSetS
19080 6f 72 74 4f 72 64 65 72 28 70 4c 69 73 74 2c 20  ortOrder(pList, 
19090 73 6f 72 74 4f 72 64 65 72 29 3b 0a 20 20 7d 65  sortOrder);.  }e
190a0 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  lse{.    sqlite3
190b0 45 78 70 72 4c 69 73 74 43 68 65 63 6b 4c 65 6e  ExprListCheckLen
190c0 67 74 68 28 70 50 61 72 73 65 2c 20 70 4c 69 73  gth(pParse, pLis
190d0 74 2c 20 22 69 6e 64 65 78 22 29 3b 0a 20 20 7d  t, "index");.  }
190e0 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75  ..  /* Figure ou
190f0 74 20 68 6f 77 20 6d 61 6e 79 20 62 79 74 65 73  t how many bytes
19100 20 6f 66 20 73 70 61 63 65 20 61 72 65 20 72 65   of space are re
19110 71 75 69 72 65 64 20 74 6f 20 73 74 6f 72 65 20  quired to store 
19120 65 78 70 6c 69 63 69 74 6c 79 0a 20 20 2a 2a 20  explicitly.  ** 
19130 73 70 65 63 69 66 69 65 64 20 63 6f 6c 6c 61 74  specified collat
19140 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 6e 61 6d  ion sequence nam
19150 65 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69  es..  */.  for(i
19160 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78  =0; i<pList->nEx
19170 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78  pr; i++){.    Ex
19180 70 72 20 2a 70 45 78 70 72 20 3d 20 70 4c 69 73  pr *pExpr = pLis
19190 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20  t->a[i].pExpr;. 
191a0 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72     assert( pExpr
191b0 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70  !=0 );.    if( p
191c0 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c  Expr->op==TK_COL
191d0 4c 41 54 45 20 29 7b 0a 20 20 20 20 20 20 6e 45  LATE ){.      nE
191e0 78 74 72 61 20 2b 3d 20 28 31 20 2b 20 73 71 6c  xtra += (1 + sql
191f0 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70 45 78  ite3Strlen30(pEx
19200 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 29 3b 0a  pr->u.zToken));.
19210 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
19220 0a 20 20 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 74  .  ** Allocate t
19230 68 65 20 69 6e 64 65 78 20 73 74 72 75 63 74 75  he index structu
19240 72 65 2e 20 0a 20 20 2a 2f 0a 20 20 6e 4e 61 6d  re. .  */.  nNam
19250 65 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  e = sqlite3Strle
19260 6e 33 30 28 7a 4e 61 6d 65 29 3b 0a 20 20 6e 45  n30(zName);.  nE
19270 78 74 72 61 43 6f 6c 20 3d 20 70 50 6b 20 3f 20  xtraCol = pPk ? 
19280 70 50 6b 2d 3e 6e 4b 65 79 43 6f 6c 20 3a 20 31  pPk->nKeyCol : 1
19290 3b 0a 20 20 70 49 6e 64 65 78 20 3d 20 73 71 6c  ;.  pIndex = sql
192a0 69 74 65 33 41 6c 6c 6f 63 61 74 65 49 6e 64 65  ite3AllocateInde
192b0 78 4f 62 6a 65 63 74 28 64 62 2c 20 70 4c 69 73  xObject(db, pLis
192c0 74 2d 3e 6e 45 78 70 72 20 2b 20 6e 45 78 74 72  t->nExpr + nExtr
192d0 61 43 6f 6c 2c 0a 20 20 20 20 20 20 20 20 20 20  aCol,.          
192e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
192f0 20 20 20 20 20 20 20 20 20 20 20 20 6e 4e 61 6d              nNam
19300 65 20 2b 20 6e 45 78 74 72 61 20 2b 20 31 2c 20  e + nExtra + 1, 
19310 26 7a 45 78 74 72 61 29 3b 0a 20 20 69 66 28 20  &zExtra);.  if( 
19320 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
19330 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69   ){.    goto exi
19340 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
19350 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 45 49    }.  assert( EI
19360 47 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45  GHT_BYTE_ALIGNME
19370 4e 54 28 70 49 6e 64 65 78 2d 3e 61 69 52 6f 77  NT(pIndex->aiRow
19380 4c 6f 67 45 73 74 29 20 29 3b 0a 20 20 61 73 73  LogEst) );.  ass
19390 65 72 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f  ert( EIGHT_BYTE_
193a0 41 4c 49 47 4e 4d 45 4e 54 28 70 49 6e 64 65 78  ALIGNMENT(pIndex
193b0 2d 3e 61 7a 43 6f 6c 6c 29 20 29 3b 0a 20 20 70  ->azColl) );.  p
193c0 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 20 3d 20 7a  Index->zName = z
193d0 45 78 74 72 61 3b 0a 20 20 7a 45 78 74 72 61 20  Extra;.  zExtra 
193e0 2b 3d 20 6e 4e 61 6d 65 20 2b 20 31 3b 0a 20 20  += nName + 1;.  
193f0 6d 65 6d 63 70 79 28 70 49 6e 64 65 78 2d 3e 7a  memcpy(pIndex->z
19400 4e 61 6d 65 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61  Name, zName, nNa
19410 6d 65 2b 31 29 3b 0a 20 20 70 49 6e 64 65 78 2d  me+1);.  pIndex-
19420 3e 70 54 61 62 6c 65 20 3d 20 70 54 61 62 3b 0a  >pTable = pTab;.
19430 20 20 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f    pIndex->onErro
19440 72 20 3d 20 28 75 38 29 6f 6e 45 72 72 6f 72 3b  r = (u8)onError;
19450 0a 20 20 70 49 6e 64 65 78 2d 3e 75 6e 69 71 4e  .  pIndex->uniqN
19460 6f 74 4e 75 6c 6c 20 3d 20 6f 6e 45 72 72 6f 72  otNull = onError
19470 21 3d 4f 45 5f 4e 6f 6e 65 3b 0a 20 20 70 49 6e  !=OE_None;.  pIn
19480 64 65 78 2d 3e 69 64 78 54 79 70 65 20 3d 20 70  dex->idxType = p
19490 4e 61 6d 65 20 3f 20 53 51 4c 49 54 45 5f 49 44  Name ? SQLITE_ID
194a0 58 54 59 50 45 5f 41 50 50 44 45 46 20 3a 20 53  XTYPE_APPDEF : S
194b0 51 4c 49 54 45 5f 49 44 58 54 59 50 45 5f 55 4e  QLITE_IDXTYPE_UN
194c0 49 51 55 45 3b 0a 20 20 70 49 6e 64 65 78 2d 3e  IQUE;.  pIndex->
194d0 70 53 63 68 65 6d 61 20 3d 20 64 62 2d 3e 61 44  pSchema = db->aD
194e0 62 5b 69 44 62 5d 2e 70 53 63 68 65 6d 61 3b 0a  b[iDb].pSchema;.
194f0 20 20 70 49 6e 64 65 78 2d 3e 6e 4b 65 79 43 6f    pIndex->nKeyCo
19500 6c 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72  l = pList->nExpr
19510 3b 0a 20 20 69 66 28 20 70 50 49 57 68 65 72 65  ;.  if( pPIWhere
19520 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 52   ){.    sqlite3R
19530 65 73 6f 6c 76 65 53 65 6c 66 52 65 66 65 72 65  esolveSelfRefere
19540 6e 63 65 28 70 50 61 72 73 65 2c 20 70 54 61 62  nce(pParse, pTab
19550 2c 20 4e 43 5f 50 61 72 74 49 64 78 2c 20 70 50  , NC_PartIdx, pP
19560 49 57 68 65 72 65 2c 20 30 29 3b 0a 20 20 20 20  IWhere, 0);.    
19570 70 49 6e 64 65 78 2d 3e 70 50 61 72 74 49 64 78  pIndex->pPartIdx
19580 57 68 65 72 65 20 3d 20 70 50 49 57 68 65 72 65  Where = pPIWhere
19590 3b 0a 20 20 20 20 70 50 49 57 68 65 72 65 20 3d  ;.    pPIWhere =
195a0 20 30 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74   0;.  }.  assert
195b0 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d  ( sqlite3SchemaM
195c0 75 74 65 78 48 65 6c 64 28 64 62 2c 20 69 44 62  utexHeld(db, iDb
195d0 2c 20 30 29 20 29 3b 0a 0a 20 20 2f 2a 20 43 68  , 0) );..  /* Ch
195e0 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 77 65  eck to see if we
195f0 20 73 68 6f 75 6c 64 20 68 6f 6e 6f 72 20 44 45   should honor DE
19600 53 43 20 72 65 71 75 65 73 74 73 20 6f 6e 20 69  SC requests on i
19610 6e 64 65 78 20 63 6f 6c 75 6d 6e 73 0a 20 20 2a  ndex columns.  *
19620 2f 0a 20 20 69 66 28 20 70 44 62 2d 3e 70 53 63  /.  if( pDb->pSc
19630 68 65 6d 61 2d 3e 66 69 6c 65 5f 66 6f 72 6d 61  hema->file_forma
19640 74 3e 3d 34 20 29 7b 0a 20 20 20 20 73 6f 72 74  t>=4 ){.    sort
19650 4f 72 64 65 72 4d 61 73 6b 20 3d 20 2d 31 3b 20  OrderMask = -1; 
19660 20 20 2f 2a 20 48 6f 6e 6f 72 20 44 45 53 43 20    /* Honor DESC 
19670 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  */.  }else{.    
19680 73 6f 72 74 4f 72 64 65 72 4d 61 73 6b 20 3d 20  sortOrderMask = 
19690 30 3b 20 20 20 20 2f 2a 20 49 67 6e 6f 72 65 20  0;    /* Ignore 
196a0 44 45 53 43 20 2a 2f 0a 20 20 7d 0a 0a 20 20 2f  DESC */.  }..  /
196b0 2a 20 41 6e 61 6c 79 7a 65 20 74 68 65 20 6c 69  * Analyze the li
196c0 73 74 20 6f 66 20 65 78 70 72 65 73 73 69 6f 6e  st of expression
196d0 73 20 74 68 61 74 20 66 6f 72 6d 20 74 68 65 20  s that form the 
196e0 74 65 72 6d 73 20 6f 66 20 74 68 65 20 69 6e 64  terms of the ind
196f0 65 78 20 61 6e 64 0a 20 20 2a 2a 20 72 65 70 6f  ex and.  ** repo
19700 72 74 20 61 6e 79 20 65 72 72 6f 72 73 2e 20 20  rt any errors.  
19710 49 6e 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61  In the common ca
19720 73 65 20 77 68 65 72 65 20 74 68 65 20 65 78 70  se where the exp
19730 72 65 73 73 69 6f 6e 20 69 73 20 65 78 61 63 74  ression is exact
19740 6c 79 0a 20 20 2a 2a 20 61 20 74 61 62 6c 65 20  ly.  ** a table 
19750 63 6f 6c 75 6d 6e 2c 20 73 74 6f 72 65 20 74 68  column, store th
19760 61 74 20 63 6f 6c 75 6d 6e 20 69 6e 20 61 69 43  at column in aiC
19770 6f 6c 75 6d 6e 5b 5d 2e 20 20 46 6f 72 20 67 65  olumn[].  For ge
19780 6e 65 72 61 6c 20 65 78 70 72 65 73 73 69 6f 6e  neral expression
19790 73 2c 0a 20 20 2a 2a 20 70 6f 70 75 6c 61 74 65  s,.  ** populate
197a0 20 70 49 6e 64 65 78 2d 3e 61 43 6f 6c 45 78 70   pIndex->aColExp
197b0 72 20 61 6e 64 20 73 74 6f 72 65 20 58 4e 5f 45  r and store XN_E
197c0 58 50 52 20 28 2d 32 29 20 69 6e 20 61 69 43 6f  XPR (-2) in aiCo
197d0 6c 75 6d 6e 5b 5d 2e 0a 20 20 2a 2a 0a 20 20 2a  lumn[]..  **.  *
197e0 2a 20 54 4f 44 4f 3a 20 49 73 73 75 65 20 61 20  * TODO: Issue a 
197f0 77 61 72 6e 69 6e 67 20 69 66 20 74 77 6f 20 6f  warning if two o
19800 72 20 6d 6f 72 65 20 63 6f 6c 75 6d 6e 73 20 6f  r more columns o
19810 66 20 74 68 65 20 69 6e 64 65 78 20 61 72 65 20  f the index are 
19820 69 64 65 6e 74 69 63 61 6c 2e 0a 20 20 2a 2a 20  identical..  ** 
19830 54 4f 44 4f 3a 20 49 73 73 75 65 20 61 20 77 61  TODO: Issue a wa
19840 72 6e 69 6e 67 20 69 66 20 74 68 65 20 74 61 62  rning if the tab
19850 6c 65 20 70 72 69 6d 61 72 79 20 6b 65 79 20 69  le primary key i
19860 73 20 75 73 65 64 20 61 73 20 70 61 72 74 20 6f  s used as part o
19870 66 20 74 68 65 0a 20 20 2a 2a 20 69 6e 64 65 78  f the.  ** index
19880 20 6b 65 79 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72   key..  */.  for
19890 28 69 3d 30 2c 20 70 4c 69 73 74 49 74 65 6d 3d  (i=0, pListItem=
198a0 70 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 4c 69 73  pList->a; i<pLis
198b0 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 2c 20 70  t->nExpr; i++, p
198c0 4c 69 73 74 49 74 65 6d 2b 2b 29 7b 0a 20 20 20  ListItem++){.   
198d0 20 45 78 70 72 20 2a 70 43 45 78 70 72 3b 20 20   Expr *pCExpr;  
198e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
198f0 2f 2a 20 54 68 65 20 69 2d 74 68 20 69 6e 64 65  /* The i-th inde
19900 78 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a  x expression */.
19910 20 20 20 20 69 6e 74 20 72 65 71 75 65 73 74 65      int requeste
19920 64 53 6f 72 74 4f 72 64 65 72 3b 20 20 20 20 20  dSortOrder;     
19930 20 20 20 2f 2a 20 41 53 43 20 6f 72 20 44 45 53     /* ASC or DES
19940 43 20 6f 6e 20 74 68 65 20 69 2d 74 68 20 65 78  C on the i-th ex
19950 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 20 20  pression */.    
19960 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c  const char *zCol
19970 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  l;             /
19980 2a 20 43 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  * Collation sequ
19990 65 6e 63 65 20 6e 61 6d 65 20 2a 2f 0a 0a 20 20  ence name */..  
199a0 20 20 73 71 6c 69 74 65 33 53 74 72 69 6e 67 54    sqlite3StringT
199b0 6f 49 64 28 70 4c 69 73 74 49 74 65 6d 2d 3e 70  oId(pListItem->p
199c0 45 78 70 72 29 3b 0a 20 20 20 20 73 71 6c 69 74  Expr);.    sqlit
199d0 65 33 52 65 73 6f 6c 76 65 53 65 6c 66 52 65 66  e3ResolveSelfRef
199e0 65 72 65 6e 63 65 28 70 50 61 72 73 65 2c 20 70  erence(pParse, p
199f0 54 61 62 2c 20 4e 43 5f 49 64 78 45 78 70 72 2c  Tab, NC_IdxExpr,
19a00 20 70 4c 69 73 74 49 74 65 6d 2d 3e 70 45 78 70   pListItem->pExp
19a10 72 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70  r, 0);.    if( p
19a20 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 20 67 6f  Parse->nErr ) go
19a30 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
19a40 6e 64 65 78 3b 0a 20 20 20 20 70 43 45 78 70 72  ndex;.    pCExpr
19a50 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b   = sqlite3ExprSk
19a60 69 70 43 6f 6c 6c 61 74 65 28 70 4c 69 73 74 49  ipCollate(pListI
19a70 74 65 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20  tem->pExpr);.   
19a80 20 69 66 28 20 70 43 45 78 70 72 2d 3e 6f 70 21   if( pCExpr->op!
19a90 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20  =TK_COLUMN ){.  
19aa0 20 20 20 20 69 66 28 20 70 54 61 62 3d 3d 70 50      if( pTab==pP
19ab0 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20  arse->pNewTable 
19ac0 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
19ad0 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
19ae0 65 2c 20 22 65 78 70 72 65 73 73 69 6f 6e 73 20  e, "expressions 
19af0 70 72 6f 68 69 62 69 74 65 64 20 69 6e 20 50 52  prohibited in PR
19b00 49 4d 41 52 59 20 4b 45 59 20 61 6e 64 20 22 0a  IMARY KEY and ".
19b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19b20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19b30 22 55 4e 49 51 55 45 20 63 6f 6e 73 74 72 61 69  "UNIQUE constrai
19b40 6e 74 73 22 29 3b 0a 20 20 20 20 20 20 20 20 67  nts");.        g
19b50 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
19b60 69 6e 64 65 78 3b 0a 20 20 20 20 20 20 7d 0a 20  index;.      }. 
19b70 20 20 20 20 20 69 66 28 20 70 49 6e 64 65 78 2d       if( pIndex-
19b80 3e 61 43 6f 6c 45 78 70 72 3d 3d 30 20 29 7b 0a  >aColExpr==0 ){.
19b90 20 20 20 20 20 20 20 20 45 78 70 72 4c 69 73 74          ExprList
19ba0 20 2a 70 43 6f 70 79 20 3d 20 73 71 6c 69 74 65   *pCopy = sqlite
19bb0 33 45 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c  3ExprListDup(db,
19bc0 20 70 4c 69 73 74 2c 20 30 29 3b 0a 20 20 20 20   pList, 0);.    
19bd0 20 20 20 20 70 49 6e 64 65 78 2d 3e 61 43 6f 6c      pIndex->aCol
19be0 45 78 70 72 20 3d 20 70 43 6f 70 79 3b 0a 20 20  Expr = pCopy;.  
19bf0 20 20 20 20 20 20 69 66 28 20 21 64 62 2d 3e 6d        if( !db->m
19c00 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
19c10 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
19c20 20 70 43 6f 70 79 21 3d 30 20 29 3b 0a 20 20 20   pCopy!=0 );.   
19c30 20 20 20 20 20 20 20 70 4c 69 73 74 49 74 65 6d         pListItem
19c40 20 3d 20 26 70 43 6f 70 79 2d 3e 61 5b 69 5d 3b   = &pCopy->a[i];
19c50 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
19c60 20 7d 0a 20 20 20 20 20 20 6a 20 3d 20 58 4e 5f   }.      j = XN_
19c70 45 58 50 52 3b 0a 20 20 20 20 20 20 70 49 6e 64  EXPR;.      pInd
19c80 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 20  ex->aiColumn[i] 
19c90 3d 20 58 4e 5f 45 58 50 52 3b 0a 20 20 20 20 20  = XN_EXPR;.     
19ca0 20 70 49 6e 64 65 78 2d 3e 75 6e 69 71 4e 6f 74   pIndex->uniqNot
19cb0 4e 75 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 7d 65  Null = 0;.    }e
19cc0 6c 73 65 7b 0a 20 20 20 20 20 20 6a 20 3d 20 70  lse{.      j = p
19cd0 43 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a  CExpr->iColumn;.
19ce0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6a 3c        assert( j<
19cf0 3d 30 78 37 66 66 66 20 29 3b 0a 20 20 20 20 20  =0x7fff );.     
19d00 20 69 66 28 20 6a 3c 30 20 29 7b 0a 20 20 20 20   if( j<0 ){.    
19d10 20 20 20 20 6a 20 3d 20 70 54 61 62 2d 3e 69 50      j = pTab->iP
19d20 4b 65 79 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  Key;.      }else
19d30 20 69 66 28 20 70 54 61 62 2d 3e 61 43 6f 6c 5b   if( pTab->aCol[
19d40 6a 5d 2e 6e 6f 74 4e 75 6c 6c 3d 3d 30 20 29 7b  j].notNull==0 ){
19d50 0a 20 20 20 20 20 20 20 20 70 49 6e 64 65 78 2d  .        pIndex-
19d60 3e 75 6e 69 71 4e 6f 74 4e 75 6c 6c 20 3d 20 30  >uniqNotNull = 0
19d70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
19d80 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e  pIndex->aiColumn
19d90 5b 69 5d 20 3d 20 28 69 31 36 29 6a 3b 0a 20 20  [i] = (i16)j;.  
19da0 20 20 7d 0a 20 20 20 20 7a 43 6f 6c 6c 20 3d 20    }.    zColl = 
19db0 30 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74  0;.    if( pList
19dc0 49 74 65 6d 2d 3e 70 45 78 70 72 2d 3e 6f 70 3d  Item->pExpr->op=
19dd0 3d 54 4b 5f 43 4f 4c 4c 41 54 45 20 29 7b 0a 20  =TK_COLLATE ){. 
19de0 20 20 20 20 20 69 6e 74 20 6e 43 6f 6c 6c 3b 0a       int nColl;.
19df0 20 20 20 20 20 20 7a 43 6f 6c 6c 20 3d 20 70 4c        zColl = pL
19e00 69 73 74 49 74 65 6d 2d 3e 70 45 78 70 72 2d 3e  istItem->pExpr->
19e10 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20 20 20  u.zToken;.      
19e20 6e 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 53  nColl = sqlite3S
19e30 74 72 6c 65 6e 33 30 28 7a 43 6f 6c 6c 29 20 2b  trlen30(zColl) +
19e40 20 31 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   1;.      assert
19e50 28 20 6e 45 78 74 72 61 3e 3d 6e 43 6f 6c 6c 20  ( nExtra>=nColl 
19e60 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  );.      memcpy(
19e70 7a 45 78 74 72 61 2c 20 7a 43 6f 6c 6c 2c 20 6e  zExtra, zColl, n
19e80 43 6f 6c 6c 29 3b 0a 20 20 20 20 20 20 7a 43 6f  Coll);.      zCo
19e90 6c 6c 20 3d 20 7a 45 78 74 72 61 3b 0a 20 20 20  ll = zExtra;.   
19ea0 20 20 20 7a 45 78 74 72 61 20 2b 3d 20 6e 43 6f     zExtra += nCo
19eb0 6c 6c 3b 0a 20 20 20 20 20 20 6e 45 78 74 72 61  ll;.      nExtra
19ec0 20 2d 3d 20 6e 43 6f 6c 6c 3b 0a 20 20 20 20 7d   -= nColl;.    }
19ed0 65 6c 73 65 20 69 66 28 20 6a 3e 3d 30 20 29 7b  else if( j>=0 ){
19ee0 0a 20 20 20 20 20 20 7a 43 6f 6c 6c 20 3d 20 70  .      zColl = p
19ef0 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 43 6f  Tab->aCol[j].zCo
19f00 6c 6c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ll;.    }.    if
19f10 28 20 21 7a 43 6f 6c 6c 20 29 20 7a 43 6f 6c 6c  ( !zColl ) zColl
19f20 20 3d 20 73 71 6c 69 74 65 33 53 74 72 42 49 4e   = sqlite3StrBIN
19f30 41 52 59 3b 0a 20 20 20 20 69 66 28 20 21 64 62  ARY;.    if( !db
19f40 2d 3e 69 6e 69 74 2e 62 75 73 79 20 26 26 20 21  ->init.busy && !
19f50 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 43 6f 6c  sqlite3LocateCol
19f60 6c 53 65 71 28 70 50 61 72 73 65 2c 20 7a 43 6f  lSeq(pParse, zCo
19f70 6c 6c 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  ll) ){.      got
19f80 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
19f90 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  dex;.    }.    p
19fa0 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d  Index->azColl[i]
19fb0 20 3d 20 7a 43 6f 6c 6c 3b 0a 20 20 20 20 72 65   = zColl;.    re
19fc0 71 75 65 73 74 65 64 53 6f 72 74 4f 72 64 65 72  questedSortOrder
19fd0 20 3d 20 70 4c 69 73 74 49 74 65 6d 2d 3e 73 6f   = pListItem->so
19fe0 72 74 4f 72 64 65 72 20 26 20 73 6f 72 74 4f 72  rtOrder & sortOr
19ff0 64 65 72 4d 61 73 6b 3b 0a 20 20 20 20 70 49 6e  derMask;.    pIn
1a000 64 65 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b  dex->aSortOrder[
1a010 69 5d 20 3d 20 28 75 38 29 72 65 71 75 65 73 74  i] = (u8)request
1a020 65 64 53 6f 72 74 4f 72 64 65 72 3b 0a 20 20 7d  edSortOrder;.  }
1a030 0a 0a 20 20 2f 2a 20 41 70 70 65 6e 64 20 74 68  ..  /* Append th
1a040 65 20 74 61 62 6c 65 20 6b 65 79 20 74 6f 20 74  e table key to t
1a050 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 69 6e  he end of the in
1a060 64 65 78 2e 20 20 46 6f 72 20 57 49 54 48 4f 55  dex.  For WITHOU
1a070 54 20 52 4f 57 49 44 0a 20 20 2a 2a 20 74 61 62  T ROWID.  ** tab
1a080 6c 65 73 20 28 77 68 65 6e 20 70 50 6b 21 3d 30  les (when pPk!=0
1a090 29 20 74 68 69 73 20 77 69 6c 6c 20 62 65 20 74  ) this will be t
1a0a0 68 65 20 64 65 63 6c 61 72 65 64 20 50 52 49 4d  he declared PRIM
1a0b0 41 52 59 20 4b 45 59 2e 20 20 46 6f 72 0a 20 20  ARY KEY.  For.  
1a0c0 2a 2a 20 6e 6f 72 6d 61 6c 20 74 61 62 6c 65 73  ** normal tables
1a0d0 20 28 77 68 65 6e 20 70 50 6b 3d 3d 30 29 20 74   (when pPk==0) t
1a0e0 68 69 73 20 77 69 6c 6c 20 62 65 20 74 68 65 20  his will be the 
1a0f0 72 6f 77 69 64 2e 0a 20 20 2a 2f 0a 20 20 69 66  rowid..  */.  if
1a100 28 20 70 50 6b 20 29 7b 0a 20 20 20 20 66 6f 72  ( pPk ){.    for
1a110 28 6a 3d 30 3b 20 6a 3c 70 50 6b 2d 3e 6e 4b 65  (j=0; j<pPk->nKe
1a120 79 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  yCol; j++){.    
1a130 20 20 69 6e 74 20 78 20 3d 20 70 50 6b 2d 3e 61    int x = pPk->a
1a140 69 43 6f 6c 75 6d 6e 5b 6a 5d 3b 0a 20 20 20 20  iColumn[j];.    
1a150 20 20 61 73 73 65 72 74 28 20 78 3e 3d 30 20 29    assert( x>=0 )
1a160 3b 0a 20 20 20 20 20 20 69 66 28 20 68 61 73 43  ;.      if( hasC
1a170 6f 6c 75 6d 6e 28 70 49 6e 64 65 78 2d 3e 61 69  olumn(pIndex->ai
1a180 43 6f 6c 75 6d 6e 2c 20 70 49 6e 64 65 78 2d 3e  Column, pIndex->
1a190 6e 4b 65 79 43 6f 6c 2c 20 78 29 20 29 7b 0a 20  nKeyCol, x) ){. 
1a1a0 20 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 6e         pIndex->n
1a1b0 43 6f 6c 75 6d 6e 2d 2d 3b 20 0a 20 20 20 20 20  Column--; .     
1a1c0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1a1d0 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e  pIndex->aiColumn
1a1e0 5b 69 5d 20 3d 20 78 3b 0a 20 20 20 20 20 20 20  [i] = x;.       
1a1f0 20 70 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c 5b   pIndex->azColl[
1a200 69 5d 20 3d 20 70 50 6b 2d 3e 61 7a 43 6f 6c 6c  i] = pPk->azColl
1a210 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20 70 49 6e  [j];.        pIn
1a220 64 65 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b  dex->aSortOrder[
1a230 69 5d 20 3d 20 70 50 6b 2d 3e 61 53 6f 72 74 4f  i] = pPk->aSortO
1a240 72 64 65 72 5b 6a 5d 3b 0a 20 20 20 20 20 20 20  rder[j];.       
1a250 20 69 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20   i++;.      }.  
1a260 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
1a270 69 3d 3d 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75  i==pIndex->nColu
1a280 6d 6e 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  mn );.  }else{. 
1a290 20 20 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c     pIndex->aiCol
1a2a0 75 6d 6e 5b 69 5d 20 3d 20 58 4e 5f 52 4f 57 49  umn[i] = XN_ROWI
1a2b0 44 3b 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e 61  D;.    pIndex->a
1a2c0 7a 43 6f 6c 6c 5b 69 5d 20 3d 20 73 71 6c 69 74  zColl[i] = sqlit
1a2d0 65 33 53 74 72 42 49 4e 41 52 59 3b 0a 20 20 7d  e3StrBINARY;.  }
1a2e0 0a 20 20 73 71 6c 69 74 65 33 44 65 66 61 75 6c  .  sqlite3Defaul
1a2f0 74 52 6f 77 45 73 74 28 70 49 6e 64 65 78 29 3b  tRowEst(pIndex);
1a300 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 70  .  if( pParse->p
1a310 4e 65 77 54 61 62 6c 65 3d 3d 30 20 29 20 65 73  NewTable==0 ) es
1a320 74 69 6d 61 74 65 49 6e 64 65 78 57 69 64 74 68  timateIndexWidth
1a330 28 70 49 6e 64 65 78 29 3b 0a 0a 20 20 2f 2a 20  (pIndex);..  /* 
1a340 49 66 20 74 68 69 73 20 69 6e 64 65 78 20 63 6f  If this index co
1a350 6e 74 61 69 6e 73 20 65 76 65 72 79 20 63 6f 6c  ntains every col
1a360 75 6d 6e 20 6f 66 20 69 74 73 20 74 61 62 6c 65  umn of its table
1a370 2c 20 74 68 65 6e 20 6d 61 72 6b 0a 20 20 2a 2a  , then mark.  **
1a380 20 69 74 20 61 73 20 61 20 63 6f 76 65 72 69 6e   it as a coverin
1a390 67 20 69 6e 64 65 78 20 2a 2f 0a 20 20 61 73 73  g index */.  ass
1a3a0 65 72 74 28 20 48 61 73 52 6f 77 69 64 28 70 54  ert( HasRowid(pT
1a3b0 61 62 29 20 0a 20 20 20 20 20 20 7c 7c 20 70 54  ab) .      || pT
1a3c0 61 62 2d 3e 69 50 4b 65 79 3c 30 20 7c 7c 20 73  ab->iPKey<0 || s
1a3d0 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 4f 66 49 6e  qlite3ColumnOfIn
1a3e0 64 65 78 28 70 49 6e 64 65 78 2c 20 70 54 61 62  dex(pIndex, pTab
1a3f0 2d 3e 69 50 4b 65 79 29 3e 3d 30 20 29 3b 0a 20  ->iPKey)>=0 );. 
1a400 20 69 66 28 20 70 54 62 6c 4e 61 6d 65 21 3d 30   if( pTblName!=0
1a410 20 26 26 20 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c   && pIndex->nCol
1a420 75 6d 6e 3e 3d 70 54 61 62 2d 3e 6e 43 6f 6c 20  umn>=pTab->nCol 
1a430 29 7b 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e 69  ){.    pIndex->i
1a440 73 43 6f 76 65 72 69 6e 67 20 3d 20 31 3b 0a 20  sCovering = 1;. 
1a450 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 54     for(j=0; j<pT
1a460 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a  ab->nCol; j++){.
1a470 20 20 20 20 20 20 69 66 28 20 6a 3d 3d 70 54 61        if( j==pTa
1a480 62 2d 3e 69 50 4b 65 79 20 29 20 63 6f 6e 74 69  b->iPKey ) conti
1a490 6e 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20 73  nue;.      if( s
1a4a0 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 4f 66 49 6e  qlite3ColumnOfIn
1a4b0 64 65 78 28 70 49 6e 64 65 78 2c 6a 29 3e 3d 30  dex(pIndex,j)>=0
1a4c0 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
1a4d0 20 20 20 70 49 6e 64 65 78 2d 3e 69 73 43 6f 76     pIndex->isCov
1a4e0 65 72 69 6e 67 20 3d 20 30 3b 0a 20 20 20 20 20  ering = 0;.     
1a4f0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
1a500 7d 0a 0a 20 20 69 66 28 20 70 54 61 62 3d 3d 70  }..  if( pTab==p
1a510 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
1a520 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20   ){.    /* This 
1a530 72 6f 75 74 69 6e 65 20 68 61 73 20 62 65 65 6e  routine has been
1a540 20 63 61 6c 6c 65 64 20 74 6f 20 63 72 65 61 74   called to creat
1a550 65 20 61 6e 20 61 75 74 6f 6d 61 74 69 63 20 69  e an automatic i
1a560 6e 64 65 78 20 61 73 20 61 0a 20 20 20 20 2a 2a  ndex as a.    **
1a570 20 72 65 73 75 6c 74 20 6f 66 20 61 20 50 52 49   result of a PRI
1a580 4d 41 52 59 20 4b 45 59 20 6f 72 20 55 4e 49 51  MARY KEY or UNIQ
1a590 55 45 20 63 6c 61 75 73 65 20 6f 6e 20 61 20 63  UE clause on a c
1a5a0 6f 6c 75 6d 6e 20 64 65 66 69 6e 69 74 69 6f 6e  olumn definition
1a5b0 2c 20 6f 72 0a 20 20 20 20 2a 2a 20 61 20 50 52  , or.    ** a PR
1a5c0 49 4d 41 52 59 20 4b 45 59 20 6f 72 20 55 4e 49  IMARY KEY or UNI
1a5d0 51 55 45 20 63 6c 61 75 73 65 20 66 6f 6c 6c 6f  QUE clause follo
1a5e0 77 69 6e 67 20 74 68 65 20 63 6f 6c 75 6d 6e 20  wing the column 
1a5f0 64 65 66 69 6e 69 74 69 6f 6e 73 2e 0a 20 20 20  definitions..   
1a600 20 2a 2a 20 69 2e 65 2e 20 6f 6e 65 20 6f 66 3a   ** i.e. one of:
1a610 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 43  .    **.    ** C
1a620 52 45 41 54 45 20 54 41 42 4c 45 20 74 28 78 20  REATE TABLE t(x 
1a630 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 79 29 3b  PRIMARY KEY, y);
1a640 0a 20 20 20 20 2a 2a 20 43 52 45 41 54 45 20 54  .    ** CREATE T
1a650 41 42 4c 45 20 74 28 78 2c 20 79 2c 20 55 4e 49  ABLE t(x, y, UNI
1a660 51 55 45 28 78 2c 20 79 29 29 3b 0a 20 20 20 20  QUE(x, y));.    
1a670 2a 2a 0a 20 20 20 20 2a 2a 20 45 69 74 68 65 72  **.    ** Either
1a680 20 77 61 79 2c 20 63 68 65 63 6b 20 74 6f 20 73   way, check to s
1a690 65 65 20 69 66 20 74 68 65 20 74 61 62 6c 65 20  ee if the table 
1a6a0 61 6c 72 65 61 64 79 20 68 61 73 20 73 75 63 68  already has such
1a6b0 20 61 6e 20 69 6e 64 65 78 2e 20 49 66 0a 20 20   an index. If.  
1a6c0 20 20 2a 2a 20 73 6f 2c 20 64 6f 6e 27 74 20 62    ** so, don't b
1a6d0 6f 74 68 65 72 20 63 72 65 61 74 69 6e 67 20 74  other creating t
1a6e0 68 69 73 20 6f 6e 65 2e 20 54 68 69 73 20 6f 6e  his one. This on
1a6f0 6c 79 20 61 70 70 6c 69 65 73 20 74 6f 0a 20 20  ly applies to.  
1a700 20 20 2a 2a 20 61 75 74 6f 6d 61 74 69 63 61 6c    ** automatical
1a710 6c 79 20 63 72 65 61 74 65 64 20 69 6e 64 69 63  ly created indic
1a720 65 73 2e 20 55 73 65 72 73 20 63 61 6e 20 64 6f  es. Users can do
1a730 20 61 73 20 74 68 65 79 20 77 69 73 68 20 77 69   as they wish wi
1a740 74 68 0a 20 20 20 20 2a 2a 20 65 78 70 6c 69 63  th.    ** explic
1a750 69 74 20 69 6e 64 69 63 65 73 2e 0a 20 20 20 20  it indices..    
1a760 2a 2a 0a 20 20 20 20 2a 2a 20 54 77 6f 20 55 4e  **.    ** Two UN
1a770 49 51 55 45 20 6f 72 20 50 52 49 4d 41 52 59 20  IQUE or PRIMARY 
1a780 4b 45 59 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  KEY constraints 
1a790 61 72 65 20 63 6f 6e 73 69 64 65 72 65 64 20 65  are considered e
1a7a0 71 75 69 76 61 6c 65 6e 74 0a 20 20 20 20 2a 2a  quivalent.    **
1a7b0 20 28 61 6e 64 20 74 68 75 73 20 73 75 70 70 72   (and thus suppr
1a7c0 65 73 73 69 6e 67 20 74 68 65 20 73 65 63 6f 6e  essing the secon
1a7d0 64 20 6f 6e 65 29 20 65 76 65 6e 20 69 66 20 74  d one) even if t
1a7e0 68 65 79 20 68 61 76 65 20 64 69 66 66 65 72 65  hey have differe
1a7f0 6e 74 0a 20 20 20 20 2a 2a 20 73 6f 72 74 20 6f  nt.    ** sort o
1a800 72 64 65 72 73 2e 0a 20 20 20 20 2a 2a 0a 20 20  rders..    **.  
1a810 20 20 2a 2a 20 49 66 20 74 68 65 72 65 20 61 72    ** If there ar
1a820 65 20 64 69 66 66 65 72 65 6e 74 20 63 6f 6c 6c  e different coll
1a830 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 73 20  ating sequences 
1a840 6f 72 20 69 66 20 74 68 65 20 63 6f 6c 75 6d 6e  or if the column
1a850 73 20 6f 66 0a 20 20 20 20 2a 2a 20 74 68 65 20  s of.    ** the 
1a860 63 6f 6e 73 74 72 61 69 6e 74 20 6f 63 63 75 72  constraint occur
1a870 20 69 6e 20 64 69 66 66 65 72 65 6e 74 20 6f 72   in different or
1a880 64 65 72 73 2c 20 74 68 65 6e 20 74 68 65 20 63  ders, then the c
1a890 6f 6e 73 74 72 61 69 6e 74 73 20 61 72 65 0a 20  onstraints are. 
1a8a0 20 20 20 2a 2a 20 63 6f 6e 73 69 64 65 72 65 64     ** considered
1a8b0 20 64 69 73 74 69 6e 63 74 20 61 6e 64 20 62 6f   distinct and bo
1a8c0 74 68 20 72 65 73 75 6c 74 20 69 6e 20 73 65 70  th result in sep
1a8d0 61 72 61 74 65 20 69 6e 64 69 63 65 73 2e 0a 20  arate indices.. 
1a8e0 20 20 20 2a 2f 0a 20 20 20 20 49 6e 64 65 78 20     */.    Index 
1a8f0 2a 70 49 64 78 3b 0a 20 20 20 20 66 6f 72 28 70  *pIdx;.    for(p
1a900 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78  Idx=pTab->pIndex
1a910 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64  ; pIdx; pIdx=pId
1a920 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20  x->pNext){.     
1a930 20 69 6e 74 20 6b 3b 0a 20 20 20 20 20 20 61 73   int k;.      as
1a940 73 65 72 74 28 20 49 73 55 6e 69 71 75 65 49 6e  sert( IsUniqueIn
1a950 64 65 78 28 70 49 64 78 29 20 29 3b 0a 20 20 20  dex(pIdx) );.   
1a960 20 20 20 61 73 73 65 72 74 28 20 70 49 64 78 2d     assert( pIdx-
1a970 3e 69 64 78 54 79 70 65 21 3d 53 51 4c 49 54 45  >idxType!=SQLITE
1a980 5f 49 44 58 54 59 50 45 5f 41 50 50 44 45 46 20  _IDXTYPE_APPDEF 
1a990 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
1a9a0 20 49 73 55 6e 69 71 75 65 49 6e 64 65 78 28 70   IsUniqueIndex(p
1a9b0 49 6e 64 65 78 29 20 29 3b 0a 0a 20 20 20 20 20  Index) );..     
1a9c0 20 69 66 28 20 70 49 64 78 2d 3e 6e 4b 65 79 43   if( pIdx->nKeyC
1a9d0 6f 6c 21 3d 70 49 6e 64 65 78 2d 3e 6e 4b 65 79  ol!=pIndex->nKey
1a9e0 43 6f 6c 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  Col ) continue;.
1a9f0 20 20 20 20 20 20 66 6f 72 28 6b 3d 30 3b 20 6b        for(k=0; k
1aa00 3c 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 20  <pIdx->nKeyCol; 
1aa10 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 63 6f  k++){.        co
1aa20 6e 73 74 20 63 68 61 72 20 2a 7a 31 3b 0a 20 20  nst char *z1;.  
1aa30 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
1aa40 20 2a 7a 32 3b 0a 20 20 20 20 20 20 20 20 61 73   *z2;.        as
1aa50 73 65 72 74 28 20 70 49 64 78 2d 3e 61 69 43 6f  sert( pIdx->aiCo
1aa60 6c 75 6d 6e 5b 6b 5d 3e 3d 30 20 29 3b 0a 20 20  lumn[k]>=0 );.  
1aa70 20 20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e        if( pIdx->
1aa80 61 69 43 6f 6c 75 6d 6e 5b 6b 5d 21 3d 70 49 6e  aiColumn[k]!=pIn
1aa90 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6b 5d  dex->aiColumn[k]
1aaa0 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
1aab0 20 20 7a 31 20 3d 20 70 49 64 78 2d 3e 61 7a 43    z1 = pIdx->azC
1aac0 6f 6c 6c 5b 6b 5d 3b 0a 20 20 20 20 20 20 20 20  oll[k];.        
1aad0 7a 32 20 3d 20 70 49 6e 64 65 78 2d 3e 61 7a 43  z2 = pIndex->azC
1aae0 6f 6c 6c 5b 6b 5d 3b 0a 20 20 20 20 20 20 20 20  oll[k];.        
1aaf0 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43  if( sqlite3StrIC
1ab00 6d 70 28 7a 31 2c 20 7a 32 29 20 29 20 62 72 65  mp(z1, z2) ) bre
1ab10 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
1ab20 20 20 69 66 28 20 6b 3d 3d 70 49 64 78 2d 3e 6e    if( k==pIdx->n
1ab30 4b 65 79 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20  KeyCol ){.      
1ab40 20 20 69 66 28 20 70 49 64 78 2d 3e 6f 6e 45 72    if( pIdx->onEr
1ab50 72 6f 72 21 3d 70 49 6e 64 65 78 2d 3e 6f 6e 45  ror!=pIndex->onE
1ab60 72 72 6f 72 20 29 7b 0a 20 20 20 20 20 20 20 20  rror ){.        
1ab70 20 20 2f 2a 20 54 68 69 73 20 63 6f 6e 73 74 72    /* This constr
1ab80 61 69 6e 74 20 63 72 65 61 74 65 73 20 74 68 65  aint creates the
1ab90 20 73 61 6d 65 20 69 6e 64 65 78 20 61 73 20 61   same index as a
1aba0 20 70 72 65 76 69 6f 75 73 0a 20 20 20 20 20 20   previous.      
1abb0 20 20 20 20 2a 2a 20 63 6f 6e 73 74 72 61 69 6e      ** constrain
1abc0 74 20 73 70 65 63 69 66 69 65 64 20 73 6f 6d 65  t specified some
1abd0 77 68 65 72 65 20 69 6e 20 74 68 65 20 43 52 45  where in the CRE
1abe0 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d  ATE TABLE statem
1abf0 65 6e 74 2e 0a 20 20 20 20 20 20 20 20 20 20 2a  ent..          *
1ac00 2a 20 48 6f 77 65 76 65 72 20 74 68 65 20 4f 4e  * However the ON
1ac10 20 43 4f 4e 46 4c 49 43 54 20 63 6c 61 75 73 65   CONFLICT clause
1ac20 73 20 61 72 65 20 64 69 66 66 65 72 65 6e 74 2e  s are different.
1ac30 20 49 66 20 62 6f 74 68 20 74 68 69 73 20 0a 20   If both this . 
1ac40 20 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e 73           ** cons
1ac50 74 72 61 69 6e 74 20 61 6e 64 20 74 68 65 20 70  traint and the p
1ac60 72 65 76 69 6f 75 73 20 65 71 75 69 76 61 6c 65  revious equivale
1ac70 6e 74 20 63 6f 6e 73 74 72 61 69 6e 74 20 68 61  nt constraint ha
1ac80 76 65 20 65 78 70 6c 69 63 69 74 0a 20 20 20 20  ve explicit.    
1ac90 20 20 20 20 20 20 2a 2a 20 4f 4e 20 43 4f 4e 46        ** ON CONF
1aca0 4c 49 43 54 20 63 6c 61 75 73 65 73 20 74 68 69  LICT clauses thi
1acb0 73 20 69 73 20 61 6e 20 65 72 72 6f 72 2e 20 4f  s is an error. O
1acc0 74 68 65 72 77 69 73 65 2c 20 75 73 65 20 74 68  therwise, use th
1acd0 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 65  e.          ** e
1ace0 78 70 6c 69 63 69 74 6c 79 20 73 70 65 63 69 66  xplicitly specif
1acf0 69 65 64 20 62 65 68 61 76 69 6f 72 20 66 6f 72  ied behavior for
1ad00 20 74 68 65 20 69 6e 64 65 78 2e 0a 20 20 20 20   the index..    
1ad10 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
1ad20 20 20 20 69 66 28 20 21 28 70 49 64 78 2d 3e 6f     if( !(pIdx->o
1ad30 6e 45 72 72 6f 72 3d 3d 4f 45 5f 44 65 66 61 75  nError==OE_Defau
1ad40 6c 74 20 7c 7c 20 70 49 6e 64 65 78 2d 3e 6f 6e  lt || pIndex->on
1ad50 45 72 72 6f 72 3d 3d 4f 45 5f 44 65 66 61 75 6c  Error==OE_Defaul
1ad60 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  t) ){.          
1ad70 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
1ad80 67 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20  g(pParse, .     
1ad90 20 20 20 20 20 20 20 20 20 20 20 22 63 6f 6e 66             "conf
1ada0 6c 69 63 74 69 6e 67 20 4f 4e 20 43 4f 4e 46 4c  licting ON CONFL
1adb0 49 43 54 20 63 6c 61 75 73 65 73 20 73 70 65 63  ICT clauses spec
1adc0 69 66 69 65 64 22 2c 20 30 29 3b 0a 20 20 20 20  ified", 0);.    
1add0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1ade0 20 20 69 66 28 20 70 49 64 78 2d 3e 6f 6e 45 72    if( pIdx->onEr
1adf0 72 6f 72 3d 3d 4f 45 5f 44 65 66 61 75 6c 74 20  ror==OE_Default 
1ae00 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ){.            p
1ae10 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 20 3d 20 70  Idx->onError = p
1ae20 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 3b 0a  Index->onError;.
1ae30 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
1ae40 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 52      }.        pR
1ae50 65 74 20 3d 20 70 49 64 78 3b 0a 20 20 20 20 20  et = pIdx;.     
1ae60 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65     goto exit_cre
1ae70 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 20  ate_index;.     
1ae80 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
1ae90 2f 2a 20 4c 69 6e 6b 20 74 68 65 20 6e 65 77 20  /* Link the new 
1aea0 49 6e 64 65 78 20 73 74 72 75 63 74 75 72 65 20  Index structure 
1aeb0 74 6f 20 69 74 73 20 74 61 62 6c 65 20 61 6e 64  to its table and
1aec0 20 74 6f 20 74 68 65 20 6f 74 68 65 72 0a 20 20   to the other.  
1aed0 2a 2a 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74  ** in-memory dat
1aee0 61 62 61 73 65 20 73 74 72 75 63 74 75 72 65 73  abase structures
1aef0 2e 20 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  . .  */.  assert
1af00 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d  ( pParse->nErr==
1af10 30 20 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 69  0 );.  if( db->i
1af20 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20 20 20 20  nit.busy ){.    
1af30 49 6e 64 65 78 20 2a 70 3b 0a 20 20 20 20 61 73  Index *p;.    as
1af40 73 65 72 74 28 20 73 71 6c 69 74 65 33 53 63 68  sert( sqlite3Sch
1af50 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c  emaMutexHeld(db,
1af60 20 30 2c 20 70 49 6e 64 65 78 2d 3e 70 53 63 68   0, pIndex->pSch
1af70 65 6d 61 29 20 29 3b 0a 20 20 20 20 70 20 3d 20  ema) );.    p = 
1af80 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72  sqlite3HashInser
1af90 74 28 26 70 49 6e 64 65 78 2d 3e 70 53 63 68 65  t(&pIndex->pSche
1afa0 6d 61 2d 3e 69 64 78 48 61 73 68 2c 20 0a 20 20  ma->idxHash, .  
1afb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1afc0 20 20 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e          pIndex->
1afd0 7a 4e 61 6d 65 2c 20 70 49 6e 64 65 78 29 3b 0a  zName, pIndex);.
1afe0 20 20 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20      if( p ){.   
1aff0 20 20 20 61 73 73 65 72 74 28 20 70 3d 3d 70 49     assert( p==pI
1b000 6e 64 65 78 20 29 3b 20 20 2f 2a 20 4d 61 6c 6c  ndex );  /* Mall
1b010 6f 63 20 6d 75 73 74 20 68 61 76 65 20 66 61 69  oc must have fai
1b020 6c 65 64 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c  led */.      sql
1b030 69 74 65 33 4f 6f 6d 46 61 75 6c 74 28 64 62 29  ite3OomFault(db)
1b040 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69  ;.      goto exi
1b050 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
1b060 20 20 20 20 7d 0a 20 20 20 20 64 62 2d 3e 66 6c      }.    db->fl
1b070 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 49 6e  ags |= SQLITE_In
1b080 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a 20 20 20  ternChanges;.   
1b090 20 69 66 28 20 70 54 62 6c 4e 61 6d 65 21 3d 30   if( pTblName!=0
1b0a0 20 29 7b 0a 20 20 20 20 20 20 70 49 6e 64 65 78   ){.      pIndex
1b0b0 2d 3e 74 6e 75 6d 20 3d 20 64 62 2d 3e 69 6e 69  ->tnum = db->ini
1b0c0 74 2e 6e 65 77 54 6e 75 6d 3b 0a 20 20 20 20 7d  t.newTnum;.    }
1b0d0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
1b0e0 69 73 20 69 73 20 74 68 65 20 69 6e 69 74 69 61  is is the initia
1b0f0 6c 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 73  l CREATE INDEX s
1b100 74 61 74 65 6d 65 6e 74 20 28 6f 72 20 43 52 45  tatement (or CRE
1b110 41 54 45 20 54 41 42 4c 45 20 69 66 20 74 68 65  ATE TABLE if the
1b120 0a 20 20 2a 2a 20 69 6e 64 65 78 20 69 73 20 61  .  ** index is a
1b130 6e 20 69 6d 70 6c 69 65 64 20 69 6e 64 65 78 20  n implied index 
1b140 66 6f 72 20 61 20 55 4e 49 51 55 45 20 6f 72 20  for a UNIQUE or 
1b150 50 52 49 4d 41 52 59 20 4b 45 59 20 63 6f 6e 73  PRIMARY KEY cons
1b160 74 72 61 69 6e 74 29 20 74 68 65 6e 0a 20 20 2a  traint) then.  *
1b170 2a 20 65 6d 69 74 20 63 6f 64 65 20 74 6f 20 61  * emit code to a
1b180 6c 6c 6f 63 61 74 65 20 74 68 65 20 69 6e 64 65  llocate the inde
1b190 78 20 72 6f 6f 74 70 61 67 65 20 6f 6e 20 64 69  x rootpage on di
1b1a0 73 6b 20 61 6e 64 20 6d 61 6b 65 20 61 6e 20 65  sk and make an e
1b1b0 6e 74 72 79 20 66 6f 72 0a 20 20 2a 2a 20 74 68  ntry for.  ** th
1b1c0 65 20 69 6e 64 65 78 20 69 6e 20 74 68 65 20 73  e index in the s
1b1d0 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62  qlite_master tab
1b1e0 6c 65 20 61 6e 64 20 70 6f 70 75 6c 61 74 65 20  le and populate 
1b1f0 74 68 65 20 69 6e 64 65 78 20 77 69 74 68 0a 20  the index with. 
1b200 20 2a 2a 20 63 6f 6e 74 65 6e 74 2e 20 20 42 75   ** content.  Bu
1b210 74 2c 20 64 6f 20 6e 6f 74 20 64 6f 20 74 68 69  t, do not do thi
1b220 73 20 69 66 20 77 65 20 61 72 65 20 73 69 6d 70  s if we are simp
1b230 6c 79 20 72 65 61 64 69 6e 67 20 74 68 65 20 73  ly reading the s
1b240 71 6c 69 74 65 5f 6d 61 73 74 65 72 0a 20 20 2a  qlite_master.  *
1b250 2a 20 74 61 62 6c 65 20 74 6f 20 70 61 72 73 65  * table to parse
1b260 20 74 68 65 20 73 63 68 65 6d 61 2c 20 6f 72 20   the schema, or 
1b270 69 66 20 74 68 69 73 20 69 6e 64 65 78 20 69 73  if this index is
1b280 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59   the PRIMARY KEY
1b290 20 69 6e 64 65 78 0a 20 20 2a 2a 20 6f 66 20 61   index.  ** of a
1b2a0 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 20 74   WITHOUT ROWID t
1b2b0 61 62 6c 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  able..  **.  ** 
1b2c0 49 66 20 70 54 62 6c 4e 61 6d 65 3d 3d 30 20 69  If pTblName==0 i
1b2d0 74 20 6d 65 61 6e 73 20 74 68 69 73 20 69 6e 64  t means this ind
1b2e0 65 78 20 69 73 20 67 65 6e 65 72 61 74 65 64 20  ex is generated 
1b2f0 61 73 20 61 6e 20 69 6d 70 6c 69 65 64 20 50 52  as an implied PR
1b300 49 4d 41 52 59 20 4b 45 59 0a 20 20 2a 2a 20 6f  IMARY KEY.  ** o
1b310 72 20 55 4e 49 51 55 45 20 69 6e 64 65 78 20 69  r UNIQUE index i
1b320 6e 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45  n a CREATE TABLE
1b330 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 53 69 6e   statement.  Sin
1b340 63 65 20 74 68 65 20 74 61 62 6c 65 0a 20 20 2a  ce the table.  *
1b350 2a 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20  * has just been 
1b360 63 72 65 61 74 65 64 2c 20 69 74 20 63 6f 6e 74  created, it cont
1b370 61 69 6e 73 20 6e 6f 20 64 61 74 61 20 61 6e 64  ains no data and
1b380 20 74 68 65 20 69 6e 64 65 78 20 69 6e 69 74 69   the index initi
1b390 61 6c 69 7a 61 74 69 6f 6e 0a 20 20 2a 2a 20 73  alization.  ** s
1b3a0 74 65 70 20 63 61 6e 20 62 65 20 73 6b 69 70 70  tep can be skipp
1b3b0 65 64 2e 0a 20 20 2a 2f 0a 20 20 65 6c 73 65 20  ed..  */.  else 
1b3c0 69 66 28 20 48 61 73 52 6f 77 69 64 28 70 54 61  if( HasRowid(pTa
1b3d0 62 29 20 7c 7c 20 70 54 62 6c 4e 61 6d 65 21 3d  b) || pTblName!=
1b3e0 30 20 29 7b 0a 20 20 20 20 56 64 62 65 20 2a 76  0 ){.    Vdbe *v
1b3f0 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 53 74 6d  ;.    char *zStm
1b400 74 3b 0a 20 20 20 20 69 6e 74 20 69 4d 65 6d 20  t;.    int iMem 
1b410 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
1b420 3b 0a 0a 20 20 20 20 76 20 3d 20 73 71 6c 69 74  ;..    v = sqlit
1b430 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
1b440 29 3b 0a 20 20 20 20 69 66 28 20 76 3d 3d 30 20  );.    if( v==0 
1b450 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61  ) goto exit_crea
1b460 74 65 5f 69 6e 64 65 78 3b 0a 0a 20 20 20 20 73  te_index;..    s
1b470 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74 65  qlite3BeginWrite
1b480 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65  Operation(pParse
1b490 2c 20 31 2c 20 69 44 62 29 3b 0a 0a 20 20 20 20  , 1, iDb);..    
1b4a0 2f 2a 20 43 72 65 61 74 65 20 74 68 65 20 72 6f  /* Create the ro
1b4b0 6f 74 70 61 67 65 20 66 6f 72 20 74 68 65 20 69  otpage for the i
1b4c0 6e 64 65 78 20 75 73 69 6e 67 20 43 72 65 61 74  ndex using Creat
1b4d0 65 49 6e 64 65 78 2e 20 42 75 74 20 62 65 66 6f  eIndex. But befo
1b4e0 72 65 0a 20 20 20 20 2a 2a 20 64 6f 69 6e 67 20  re.    ** doing 
1b4f0 73 6f 2c 20 63 6f 64 65 20 61 20 4e 6f 6f 70 20  so, code a Noop 
1b500 69 6e 73 74 72 75 63 74 69 6f 6e 20 61 6e 64 20  instruction and 
1b510 73 74 6f 72 65 20 69 74 73 20 61 64 64 72 65 73  store its addres
1b520 73 20 69 6e 20 0a 20 20 20 20 2a 2a 20 49 6e 64  s in .    ** Ind
1b530 65 78 2e 74 6e 75 6d 2e 20 54 68 69 73 20 69 73  ex.tnum. This is
1b540 20 72 65 71 75 69 72 65 64 20 69 6e 20 63 61 73   required in cas
1b550 65 20 74 68 69 73 20 69 6e 64 65 78 20 69 73 20  e this index is 
1b560 61 63 74 75 61 6c 6c 79 20 61 20 0a 20 20 20 20  actually a .    
1b570 2a 2a 20 50 52 49 4d 41 52 59 20 4b 45 59 20 61  ** PRIMARY KEY a
1b580 6e 64 20 74 68 65 20 74 61 62 6c 65 20 69 73 20  nd the table is 
1b590 61 63 74 75 61 6c 6c 79 20 61 20 57 49 54 48 4f  actually a WITHO
1b5a0 55 54 20 52 4f 57 49 44 20 74 61 62 6c 65 2e 20  UT ROWID table. 
1b5b0 49 6e 20 0a 20 20 20 20 2a 2a 20 74 68 61 74 20  In .    ** that 
1b5c0 63 61 73 65 20 74 68 65 20 63 6f 6e 76 65 72 74  case the convert
1b5d0 54 6f 57 69 74 68 6f 75 74 52 6f 77 69 64 54 61  ToWithoutRowidTa
1b5e0 62 6c 65 28 29 20 72 6f 75 74 69 6e 65 20 77 69  ble() routine wi
1b5f0 6c 6c 20 72 65 70 6c 61 63 65 0a 20 20 20 20 2a  ll replace.    *
1b600 2a 20 74 68 65 20 4e 6f 6f 70 20 77 69 74 68 20  * the Noop with 
1b610 61 20 47 6f 74 6f 20 74 6f 20 6a 75 6d 70 20 6f  a Goto to jump o
1b620 76 65 72 20 74 68 65 20 56 44 42 45 20 63 6f 64  ver the VDBE cod
1b630 65 20 67 65 6e 65 72 61 74 65 64 20 62 65 6c 6f  e generated belo
1b640 77 2e 20 2a 2f 0a 20 20 20 20 70 49 6e 64 65 78  w. */.    pIndex
1b650 2d 3e 74 6e 75 6d 20 3d 20 73 71 6c 69 74 65 33  ->tnum = sqlite3
1b660 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50  VdbeAddOp0(v, OP
1b670 5f 4e 6f 6f 70 29 3b 0a 20 20 20 20 73 71 6c 69  _Noop);.    sqli
1b680 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1b690 20 4f 50 5f 43 72 65 61 74 65 49 6e 64 65 78 2c   OP_CreateIndex,
1b6a0 20 69 44 62 2c 20 69 4d 65 6d 29 3b 0a 0a 20 20   iDb, iMem);..  
1b6b0 20 20 2f 2a 20 47 61 74 68 65 72 20 74 68 65 20    /* Gather the 
1b6c0 63 6f 6d 70 6c 65 74 65 20 74 65 78 74 20 6f 66  complete text of
1b6d0 20 74 68 65 20 43 52 45 41 54 45 20 49 4e 44 45   the CREATE INDE
1b6e0 58 20 73 74 61 74 65 6d 65 6e 74 20 69 6e 74 6f  X statement into
1b6f0 0a 20 20 20 20 2a 2a 20 74 68 65 20 7a 53 74 6d  .    ** the zStm
1b700 74 20 76 61 72 69 61 62 6c 65 0a 20 20 20 20 2a  t variable.    *
1b710 2f 0a 20 20 20 20 69 66 28 20 70 53 74 61 72 74  /.    if( pStart
1b720 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 20   ){.      int n 
1b730 3d 20 28 69 6e 74 29 28 70 50 61 72 73 65 2d 3e  = (int)(pParse->
1b740 73 4c 61 73 74 54 6f 6b 65 6e 2e 7a 20 2d 20 70  sLastToken.z - p
1b750 4e 61 6d 65 2d 3e 7a 29 20 2b 20 70 50 61 72 73  Name->z) + pPars
1b760 65 2d 3e 73 4c 61 73 74 54 6f 6b 65 6e 2e 6e 3b  e->sLastToken.n;
1b770 0a 20 20 20 20 20 20 69 66 28 20 70 4e 61 6d 65  .      if( pName
1b780 2d 3e 7a 5b 6e 2d 31 5d 3d 3d 27 3b 27 20 29 20  ->z[n-1]==';' ) 
1b790 6e 2d 2d 3b 0a 20 20 20 20 20 20 2f 2a 20 41 20  n--;.      /* A 
1b7a0 6e 61 6d 65 64 20 69 6e 64 65 78 20 77 69 74 68  named index with
1b7b0 20 61 6e 20 65 78 70 6c 69 63 69 74 20 43 52 45   an explicit CRE
1b7c0 41 54 45 20 49 4e 44 45 58 20 73 74 61 74 65 6d  ATE INDEX statem
1b7d0 65 6e 74 20 2a 2f 0a 20 20 20 20 20 20 7a 53 74  ent */.      zSt
1b7e0 6d 74 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69  mt = sqlite3MPri
1b7f0 6e 74 66 28 64 62 2c 20 22 43 52 45 41 54 45 25  ntf(db, "CREATE%
1b800 73 20 49 4e 44 45 58 20 25 2e 2a 73 22 2c 0a 20  s INDEX %.*s",. 
1b810 20 20 20 20 20 20 20 6f 6e 45 72 72 6f 72 3d 3d         onError==
1b820 4f 45 5f 4e 6f 6e 65 20 3f 20 22 22 20 3a 20 22  OE_None ? "" : "
1b830 20 55 4e 49 51 55 45 22 2c 20 6e 2c 20 70 4e 61   UNIQUE", n, pNa
1b840 6d 65 2d 3e 7a 29 3b 0a 20 20 20 20 7d 65 6c 73  me->z);.    }els
1b850 65 7b 0a 20 20 20 20 20 20 2f 2a 20 41 6e 20 61  e{.      /* An a
1b860 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 63  utomatic index c
1b870 72 65 61 74 65 64 20 62 79 20 61 20 50 52 49 4d  reated by a PRIM
1b880 41 52 59 20 4b 45 59 20 6f 72 20 55 4e 49 51 55  ARY KEY or UNIQU
1b890 45 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a  E constraint */.
1b8a0 20 20 20 20 20 20 2f 2a 20 7a 53 74 6d 74 20 3d        /* zStmt =
1b8b0 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
1b8c0 22 22 29 3b 20 2a 2f 0a 20 20 20 20 20 20 7a 53  ""); */.      zS
1b8d0 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a  tmt = 0;.    }..
1b8e0 20 20 20 20 2f 2a 20 41 64 64 20 61 6e 20 65 6e      /* Add an en
1b8f0 74 72 79 20 69 6e 20 73 71 6c 69 74 65 5f 6d 61  try in sqlite_ma
1b900 73 74 65 72 20 66 6f 72 20 74 68 69 73 20 69 6e  ster for this in
1b910 64 65 78 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73  dex.    */.    s
1b920 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72 73  qlite3NestedPars
1b930 65 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20  e(pParse, .     
1b940 20 20 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20     "INSERT INTO 
1b950 25 51 2e 25 73 20 56 41 4c 55 45 53 28 27 69 6e  %Q.%s VALUES('in
1b960 64 65 78 27 2c 25 51 2c 25 51 2c 23 25 64 2c 25  dex',%Q,%Q,#%d,%
1b970 51 29 3b 22 2c 0a 20 20 20 20 20 20 20 20 64 62  Q);",.        db
1b980 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65  ->aDb[iDb].zName
1b990 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69  , SCHEMA_TABLE(i
1b9a0 44 62 29 2c 0a 20 20 20 20 20 20 20 20 70 49 6e  Db),.        pIn
1b9b0 64 65 78 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20  dex->zName,.    
1b9c0 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c      pTab->zName,
1b9d0 0a 20 20 20 20 20 20 20 20 69 4d 65 6d 2c 0a 20  .        iMem,. 
1b9e0 20 20 20 20 20 20 20 7a 53 74 6d 74 0a 20 20 20         zStmt.   
1b9f0 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44   );.    sqlite3D
1ba00 62 46 72 65 65 28 64 62 2c 20 7a 53 74 6d 74 29  bFree(db, zStmt)
1ba10 3b 0a 0a 20 20 20 20 2f 2a 20 46 69 6c 6c 20 74  ;..    /* Fill t
1ba20 68 65 20 69 6e 64 65 78 20 77 69 74 68 20 64 61  he index with da
1ba30 74 61 20 61 6e 64 20 72 65 70 61 72 73 65 20 74  ta and reparse t
1ba40 68 65 20 73 63 68 65 6d 61 2e 20 43 6f 64 65 20  he schema. Code 
1ba50 61 6e 20 4f 50 5f 45 78 70 69 72 65 0a 20 20 20  an OP_Expire.   
1ba60 20 2a 2a 20 74 6f 20 69 6e 76 61 6c 69 64 61 74   ** to invalidat
1ba70 65 20 61 6c 6c 20 70 72 65 2d 63 6f 6d 70 69 6c  e all pre-compil
1ba80 65 64 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 20  ed statements.. 
1ba90 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 54     */.    if( pT
1baa0 62 6c 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20  blName ){.      
1bab0 73 71 6c 69 74 65 33 52 65 66 69 6c 6c 49 6e 64  sqlite3RefillInd
1bac0 65 78 28 70 50 61 72 73 65 2c 20 70 49 6e 64 65  ex(pParse, pInde
1bad0 78 2c 20 69 4d 65 6d 29 3b 0a 20 20 20 20 20 20  x, iMem);.      
1bae0 73 71 6c 69 74 65 33 43 68 61 6e 67 65 43 6f 6f  sqlite3ChangeCoo
1baf0 6b 69 65 28 70 50 61 72 73 65 2c 20 69 44 62 29  kie(pParse, iDb)
1bb00 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
1bb10 64 62 65 41 64 64 50 61 72 73 65 53 63 68 65 6d  dbeAddParseSchem
1bb20 61 4f 70 28 76 2c 20 69 44 62 2c 0a 20 20 20 20  aOp(v, iDb,.    
1bb30 20 20 20 20 20 73 71 6c 69 74 65 33 4d 50 72 69       sqlite3MPri
1bb40 6e 74 66 28 64 62 2c 20 22 6e 61 6d 65 3d 27 25  ntf(db, "name='%
1bb50 71 27 20 41 4e 44 20 74 79 70 65 3d 27 69 6e 64  q' AND type='ind
1bb60 65 78 27 22 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e  ex'", pIndex->zN
1bb70 61 6d 65 29 29 3b 0a 20 20 20 20 20 20 73 71 6c  ame));.      sql
1bb80 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
1bb90 2c 20 4f 50 5f 45 78 70 69 72 65 2c 20 30 29 3b  , OP_Expire, 0);
1bba0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73 71 6c 69  .    }..    sqli
1bbb0 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
1bbc0 76 2c 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 29  v, pIndex->tnum)
1bbd0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 68 65 6e  ;.  }..  /* When
1bbe0 20 61 64 64 69 6e 67 20 61 6e 20 69 6e 64 65 78   adding an index
1bbf0 20 74 6f 20 74 68 65 20 6c 69 73 74 20 6f 66 20   to the list of 
1bc00 69 6e 64 69 63 65 73 20 66 6f 72 20 61 20 74 61  indices for a ta
1bc10 62 6c 65 2c 20 6d 61 6b 65 0a 20 20 2a 2a 20 73  ble, make.  ** s
1bc20 75 72 65 20 61 6c 6c 20 69 6e 64 69 63 65 73 20  ure all indices 
1bc30 6c 61 62 65 6c 65 64 20 4f 45 5f 52 65 70 6c 61  labeled OE_Repla
1bc40 63 65 20 63 6f 6d 65 20 61 66 74 65 72 20 61 6c  ce come after al
1bc50 6c 20 74 68 6f 73 65 20 6c 61 62 65 6c 65 64 0a  l those labeled.
1bc60 20 20 2a 2a 20 4f 45 5f 49 67 6e 6f 72 65 2e 20    ** OE_Ignore. 
1bc70 20 54 68 69 73 20 69 73 20 6e 65 63 65 73 73 61   This is necessa
1bc80 72 79 20 66 6f 72 20 74 68 65 20 63 6f 72 72 65  ry for the corre
1bc90 63 74 20 63 6f 6e 73 74 72 61 69 6e 74 20 63 68  ct constraint ch
1bca0 65 63 6b 0a 20 20 2a 2a 20 70 72 6f 63 65 73 73  eck.  ** process
1bcb0 69 6e 67 20 28 69 6e 20 73 71 6c 69 74 65 33 47  ing (in sqlite3G
1bcc0 65 6e 65 72 61 74 65 43 6f 6e 73 74 72 61 69 6e  enerateConstrain
1bcd0 74 43 68 65 63 6b 73 28 29 29 20 61 73 20 70 61  tChecks()) as pa
1bce0 72 74 20 6f 66 0a 20 20 2a 2a 20 55 50 44 41 54  rt of.  ** UPDAT
1bcf0 45 20 61 6e 64 20 49 4e 53 45 52 54 20 73 74 61  E and INSERT sta
1bd00 74 65 6d 65 6e 74 73 2e 20 20 0a 20 20 2a 2f 0a  tements.  .  */.
1bd10 20 20 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62    if( db->init.b
1bd20 75 73 79 20 7c 7c 20 70 54 62 6c 4e 61 6d 65 3d  usy || pTblName=
1bd30 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 6f 6e  =0 ){.    if( on
1bd40 45 72 72 6f 72 21 3d 4f 45 5f 52 65 70 6c 61 63  Error!=OE_Replac
1bd50 65 20 7c 7c 20 70 54 61 62 2d 3e 70 49 6e 64 65  e || pTab->pInde
1bd60 78 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 7c 7c  x==0.         ||
1bd70 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 2d 3e 6f   pTab->pIndex->o
1bd80 6e 45 72 72 6f 72 3d 3d 4f 45 5f 52 65 70 6c 61  nError==OE_Repla
1bd90 63 65 29 7b 0a 20 20 20 20 20 20 70 49 6e 64 65  ce){.      pInde
1bda0 78 2d 3e 70 4e 65 78 74 20 3d 20 70 54 61 62 2d  x->pNext = pTab-
1bdb0 3e 70 49 6e 64 65 78 3b 0a 20 20 20 20 20 20 70  >pIndex;.      p
1bdc0 54 61 62 2d 3e 70 49 6e 64 65 78 20 3d 20 70 49  Tab->pIndex = pI
1bdd0 6e 64 65 78 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ndex;.    }else{
1bde0 0a 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70 4f  .      Index *pO
1bdf0 74 68 65 72 20 3d 20 70 54 61 62 2d 3e 70 49 6e  ther = pTab->pIn
1be00 64 65 78 3b 0a 20 20 20 20 20 20 77 68 69 6c 65  dex;.      while
1be10 28 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74 20  ( pOther->pNext 
1be20 26 26 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74  && pOther->pNext
1be30 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 52 65  ->onError!=OE_Re
1be40 70 6c 61 63 65 20 29 7b 0a 20 20 20 20 20 20 20  place ){.       
1be50 20 70 4f 74 68 65 72 20 3d 20 70 4f 74 68 65 72   pOther = pOther
1be60 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d  ->pNext;.      }
1be70 0a 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 70  .      pIndex->p
1be80 4e 65 78 74 20 3d 20 70 4f 74 68 65 72 2d 3e 70  Next = pOther->p
1be90 4e 65 78 74 3b 0a 20 20 20 20 20 20 70 4f 74 68  Next;.      pOth
1bea0 65 72 2d 3e 70 4e 65 78 74 20 3d 20 70 49 6e 64  er->pNext = pInd
1beb0 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 52  ex;.    }.    pR
1bec0 65 74 20 3d 20 70 49 6e 64 65 78 3b 0a 20 20 20  et = pIndex;.   
1bed0 20 70 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20 7d   pIndex = 0;.  }
1bee0 0a 0a 20 20 2f 2a 20 43 6c 65 61 6e 20 75 70 20  ..  /* Clean up 
1bef0 62 65 66 6f 72 65 20 65 78 69 74 69 6e 67 20 2a  before exiting *
1bf00 2f 0a 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  /.exit_create_in
1bf10 64 65 78 3a 0a 20 20 69 66 28 20 70 49 6e 64 65  dex:.  if( pInde
1bf20 78 20 29 20 66 72 65 65 49 6e 64 65 78 28 64 62  x ) freeIndex(db
1bf30 2c 20 70 49 6e 64 65 78 29 3b 0a 20 20 73 71 6c  , pIndex);.  sql
1bf40 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64  ite3ExprDelete(d
1bf50 62 2c 20 70 50 49 57 68 65 72 65 29 3b 0a 20 20  b, pPIWhere);.  
1bf60 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
1bf70 65 6c 65 74 65 28 64 62 2c 20 70 4c 69 73 74 29  elete(db, pList)
1bf80 3b 0a 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69  ;.  sqlite3SrcLi
1bf90 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 54 62  stDelete(db, pTb
1bfa0 6c 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65  lName);.  sqlite
1bfb0 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4e 61 6d  3DbFree(db, zNam
1bfc0 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 52 65  e);.  return pRe
1bfd0 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6c 6c  t;.}../*.** Fill
1bfe0 20 74 68 65 20 49 6e 64 65 78 2e 61 69 52 6f 77   the Index.aiRow
1bff0 45 73 74 5b 5d 20 61 72 72 61 79 20 77 69 74 68  Est[] array with
1c000 20 64 65 66 61 75 6c 74 20 69 6e 66 6f 72 6d 61   default informa
1c010 74 69 6f 6e 20 2d 20 69 6e 66 6f 72 6d 61 74 69  tion - informati
1c020 6f 6e 0a 2a 2a 20 74 6f 20 62 65 20 75 73 65 64  on.** to be used
1c030 20 77 68 65 6e 20 77 65 20 68 61 76 65 20 6e 6f   when we have no
1c040 74 20 72 75 6e 20 74 68 65 20 41 4e 41 4c 59 5a  t run the ANALYZ
1c050 45 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a  E command..**.**
1c060 20 61 69 52 6f 77 45 73 74 5b 30 5d 20 69 73 20   aiRowEst[0] is 
1c070 73 75 70 70 6f 73 65 64 20 74 6f 20 63 6f 6e 74  supposed to cont
1c080 61 69 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ain the number o
1c090 66 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 74 68  f elements in th
1c0a0 65 20 69 6e 64 65 78 2e 0a 2a 2a 20 53 69 6e 63  e index..** Sinc
1c0b0 65 20 77 65 20 64 6f 20 6e 6f 74 20 6b 6e 6f 77  e we do not know
1c0c0 2c 20 67 75 65 73 73 20 31 20 6d 69 6c 6c 69 6f  , guess 1 millio
1c0d0 6e 2e 20 20 61 69 52 6f 77 45 73 74 5b 31 5d 20  n.  aiRowEst[1] 
1c0e0 69 73 20 61 6e 20 65 73 74 69 6d 61 74 65 20 6f  is an estimate o
1c0f0 66 20 74 68 65 0a 2a 2a 20 6e 75 6d 62 65 72 20  f the.** number 
1c100 6f 66 20 72 6f 77 73 20 69 6e 20 74 68 65 20 74  of rows in the t
1c110 61 62 6c 65 20 74 68 61 74 20 6d 61 74 63 68 20  able that match 
1c120 61 6e 79 20 70 61 72 74 69 63 75 6c 61 72 20 76  any particular v
1c130 61 6c 75 65 20 6f 66 20 74 68 65 0a 2a 2a 20 66  alue of the.** f
1c140 69 72 73 74 20 63 6f 6c 75 6d 6e 20 6f 66 20 74  irst column of t
1c150 68 65 20 69 6e 64 65 78 2e 20 20 61 69 52 6f 77  he index.  aiRow
1c160 45 73 74 5b 32 5d 20 69 73 20 61 6e 20 65 73 74  Est[2] is an est
1c170 69 6d 61 74 65 20 6f 66 20 74 68 65 20 6e 75 6d  imate of the num
1c180 62 65 72 0a 2a 2a 20 6f 66 20 72 6f 77 73 20 74  ber.** of rows t
1c190 68 61 74 20 6d 61 74 63 68 20 61 6e 79 20 70 61  hat match any pa
1c1a0 72 74 69 63 75 6c 61 72 20 63 6f 6d 62 69 6e 61  rticular combina
1c1b0 74 69 6f 6e 20 6f 66 20 74 68 65 20 66 69 72 73  tion of the firs
1c1c0 74 20 32 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 6f  t 2 columns.** o
1c1d0 66 20 74 68 65 20 69 6e 64 65 78 2e 20 20 41 6e  f the index.  An
1c1e0 64 20 73 6f 20 66 6f 72 74 68 2e 20 20 49 74 20  d so forth.  It 
1c1f0 6d 75 73 74 20 61 6c 77 61 79 73 20 62 65 20 74  must always be t
1c200 68 65 20 63 61 73 65 20 74 68 61 74 0a 2a 0a 2a  he case that.*.*
1c210 2a 20 20 20 20 20 20 20 20 20 20 20 61 69 52 6f  *           aiRo
1c220 77 45 73 74 5b 4e 5d 3c 3d 61 69 52 6f 77 45 73  wEst[N]<=aiRowEs
1c230 74 5b 4e 2d 31 5d 0a 2a 2a 20 20 20 20 20 20 20  t[N-1].**       
1c240 20 20 20 20 61 69 52 6f 77 45 73 74 5b 4e 5d 3e      aiRowEst[N]>
1c250 3d 31 0a 2a 2a 0a 2a 2a 20 41 70 61 72 74 20 66  =1.**.** Apart f
1c260 72 6f 6d 20 74 68 61 74 2c 20 77 65 20 68 61 76  rom that, we hav
1c270 65 20 6c 69 74 74 6c 65 20 74 6f 20 67 6f 20 6f  e little to go o
1c280 6e 20 62 65 73 69 64 65 73 20 69 6e 74 75 69 74  n besides intuit
1c290 69 6f 6e 20 61 73 20 74 6f 0a 2a 2a 20 68 6f 77  ion as to.** how
1c2a0 20 61 69 52 6f 77 45 73 74 5b 5d 20 73 68 6f 75   aiRowEst[] shou
1c2b0 6c 64 20 62 65 20 69 6e 69 74 69 61 6c 69 7a 65  ld be initialize
1c2c0 64 2e 20 20 54 68 65 20 6e 75 6d 62 65 72 73 20  d.  The numbers 
1c2d0 67 65 6e 65 72 61 74 65 64 20 68 65 72 65 0a 2a  generated here.*
1c2e0 2a 20 61 72 65 20 62 61 73 65 64 20 6f 6e 20 74  * are based on t
1c2f0 79 70 69 63 61 6c 20 76 61 6c 75 65 73 20 66 6f  ypical values fo
1c300 75 6e 64 20 69 6e 20 61 63 74 75 61 6c 20 69 6e  und in actual in
1c310 64 69 63 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73  dices..*/.void s
1c320 71 6c 69 74 65 33 44 65 66 61 75 6c 74 52 6f 77  qlite3DefaultRow
1c330 45 73 74 28 49 6e 64 65 78 20 2a 70 49 64 78 29  Est(Index *pIdx)
1c340 7b 0a 20 20 2f 2a 20 20 20 20 20 20 20 20 20 20  {.  /*          
1c350 20 20 20 20 20 20 31 30 2c 20 20 39 2c 20 20 38        10,  9,  8
1c360 2c 20 20 37 2c 20 20 36 20 2a 2f 0a 20 20 4c 6f  ,  7,  6 */.  Lo
1c370 67 45 73 74 20 61 56 61 6c 5b 5d 20 3d 20 7b 20  gEst aVal[] = { 
1c380 33 33 2c 20 33 32 2c 20 33 30 2c 20 32 38 2c 20  33, 32, 30, 28, 
1c390 32 36 20 7d 3b 0a 20 20 4c 6f 67 45 73 74 20 2a  26 };.  LogEst *
1c3a0 61 20 3d 20 70 49 64 78 2d 3e 61 69 52 6f 77 4c  a = pIdx->aiRowL
1c3b0 6f 67 45 73 74 3b 0a 20 20 69 6e 74 20 6e 43 6f  ogEst;.  int nCo
1c3c0 70 79 20 3d 20 4d 49 4e 28 41 72 72 61 79 53 69  py = MIN(ArraySi
1c3d0 7a 65 28 61 56 61 6c 29 2c 20 70 49 64 78 2d 3e  ze(aVal), pIdx->
1c3e0 6e 4b 65 79 43 6f 6c 29 3b 0a 20 20 69 6e 74 20  nKeyCol);.  int 
1c3f0 69 3b 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65  i;..  /* Set the
1c400 20 66 69 72 73 74 20 65 6e 74 72 79 20 28 6e 75   first entry (nu
1c410 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20  mber of rows in 
1c420 74 68 65 20 69 6e 64 65 78 29 20 74 6f 20 74 68  the index) to th
1c430 65 20 65 73 74 69 6d 61 74 65 64 20 0a 20 20 2a  e estimated .  *
1c440 2a 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  * number of rows
1c450 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 20 4f   in the table. O
1c460 72 20 31 30 2c 20 69 66 20 74 68 65 20 65 73 74  r 10, if the est
1c470 69 6d 61 74 65 64 20 6e 75 6d 62 65 72 20 6f 66  imated number of
1c480 20 72 6f 77 73 20 0a 20 20 2a 2a 20 69 6e 20 74   rows .  ** in t
1c490 68 65 20 74 61 62 6c 65 20 69 73 20 6c 65 73 73  he table is less
1c4a0 20 74 68 61 6e 20 74 68 61 74 2e 20 20 2a 2f 0a   than that.  */.
1c4b0 20 20 61 5b 30 5d 20 3d 20 70 49 64 78 2d 3e 70    a[0] = pIdx->p
1c4c0 54 61 62 6c 65 2d 3e 6e 52 6f 77 4c 6f 67 45 73  Table->nRowLogEs
1c4d0 74 3b 0a 20 20 69 66 28 20 61 5b 30 5d 3c 33 33  t;.  if( a[0]<33
1c4e0 20 29 20 61 5b 30 5d 20 3d 20 33 33 3b 20 20 20   ) a[0] = 33;   
1c4f0 20 20 20 20 20 61 73 73 65 72 74 28 20 33 33 3d       assert( 33=
1c500 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 31  =sqlite3LogEst(1
1c510 30 29 20 29 3b 0a 0a 20 20 2f 2a 20 45 73 74 69  0) );..  /* Esti
1c520 6d 61 74 65 20 74 68 61 74 20 61 5b 31 5d 20 69  mate that a[1] i
1c530 73 20 31 30 2c 20 61 5b 32 5d 20 69 73 20 39 2c  s 10, a[2] is 9,
1c540 20 61 5b 33 5d 20 69 73 20 38 2c 20 61 5b 34 5d   a[3] is 8, a[4]
1c550 20 69 73 20 37 2c 20 61 5b 35 5d 20 69 73 0a 20   is 7, a[5] is. 
1c560 20 2a 2a 20 36 20 61 6e 64 20 65 61 63 68 20 73   ** 6 and each s
1c570 75 62 73 65 71 75 65 6e 74 20 76 61 6c 75 65 20  ubsequent value 
1c580 28 69 66 20 61 6e 79 29 20 69 73 20 35 2e 20 20  (if any) is 5.  
1c590 2a 2f 0a 20 20 6d 65 6d 63 70 79 28 26 61 5b 31  */.  memcpy(&a[1
1c5a0 5d 2c 20 61 56 61 6c 2c 20 6e 43 6f 70 79 2a 73  ], aVal, nCopy*s
1c5b0 69 7a 65 6f 66 28 4c 6f 67 45 73 74 29 29 3b 0a  izeof(LogEst));.
1c5c0 20 20 66 6f 72 28 69 3d 6e 43 6f 70 79 2b 31 3b    for(i=nCopy+1;
1c5d0 20 69 3c 3d 70 49 64 78 2d 3e 6e 4b 65 79 43 6f   i<=pIdx->nKeyCo
1c5e0 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 61 5b 69  l; i++){.    a[i
1c5f0 5d 20 3d 20 32 33 3b 20 20 20 20 20 20 20 20 20  ] = 23;         
1c600 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72             asser
1c610 74 28 20 32 33 3d 3d 73 71 6c 69 74 65 33 4c 6f  t( 23==sqlite3Lo
1c620 67 45 73 74 28 35 29 20 29 3b 0a 20 20 7d 0a 0a  gEst(5) );.  }..
1c630 20 20 61 73 73 65 72 74 28 20 30 3d 3d 73 71 6c    assert( 0==sql
1c640 69 74 65 33 4c 6f 67 45 73 74 28 31 29 20 29 3b  ite3LogEst(1) );
1c650 0a 20 20 69 66 28 20 49 73 55 6e 69 71 75 65 49  .  if( IsUniqueI
1c660 6e 64 65 78 28 70 49 64 78 29 20 29 20 61 5b 70  ndex(pIdx) ) a[p
1c670 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 5d 20 3d 20  Idx->nKeyCol] = 
1c680 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  0;.}../*.** This
1c690 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 64 72   routine will dr
1c6a0 6f 70 20 61 6e 20 65 78 69 73 74 69 6e 67 20 6e  op an existing n
1c6b0 61 6d 65 64 20 69 6e 64 65 78 2e 20 20 54 68 69  amed index.  Thi
1c6c0 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 6d 70  s routine.** imp
1c6d0 6c 65 6d 65 6e 74 73 20 74 68 65 20 44 52 4f 50  lements the DROP
1c6e0 20 49 4e 44 45 58 20 73 74 61 74 65 6d 65 6e 74   INDEX statement
1c6f0 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
1c700 33 44 72 6f 70 49 6e 64 65 78 28 50 61 72 73 65  3DropIndex(Parse
1c710 20 2a 70 50 61 72 73 65 2c 20 53 72 63 4c 69 73   *pParse, SrcLis
1c720 74 20 2a 70 4e 61 6d 65 2c 20 69 6e 74 20 69 66  t *pName, int if
1c730 45 78 69 73 74 73 29 7b 0a 20 20 49 6e 64 65 78  Exists){.  Index
1c740 20 2a 70 49 6e 64 65 78 3b 0a 20 20 56 64 62 65   *pIndex;.  Vdbe
1c750 20 2a 76 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a   *v;.  sqlite3 *
1c760 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
1c770 0a 20 20 69 6e 74 20 69 44 62 3b 0a 0a 20 20 61  .  int iDb;..  a
1c780 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 6e  ssert( pParse->n
1c790 45 72 72 3d 3d 30 20 29 3b 20 20 20 2f 2a 20 4e  Err==0 );   /* N
1c7a0 65 76 65 72 20 63 61 6c 6c 65 64 20 77 69 74 68  ever called with
1c7b0 20 70 72 69 6f 72 20 65 72 72 6f 72 73 20 2a 2f   prior errors */
1c7c0 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f  .  if( db->mallo
1c7d0 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 67  cFailed ){.    g
1c7e0 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e  oto exit_drop_in
1c7f0 64 65 78 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  dex;.  }.  asser
1c800 74 28 20 70 4e 61 6d 65 2d 3e 6e 53 72 63 3d 3d  t( pName->nSrc==
1c810 31 20 29 3b 0a 20 20 69 66 28 20 53 51 4c 49 54  1 );.  if( SQLIT
1c820 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65 61  E_OK!=sqlite3Rea
1c830 64 53 63 68 65 6d 61 28 70 50 61 72 73 65 29 20  dSchema(pParse) 
1c840 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74  ){.    goto exit
1c850 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 7d  _drop_index;.  }
1c860 0a 20 20 70 49 6e 64 65 78 20 3d 20 73 71 6c 69  .  pIndex = sqli
1c870 74 65 33 46 69 6e 64 49 6e 64 65 78 28 64 62 2c  te3FindIndex(db,
1c880 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 4e 61   pName->a[0].zNa
1c890 6d 65 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e  me, pName->a[0].
1c8a0 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20 69 66  zDatabase);.  if
1c8b0 28 20 70 49 6e 64 65 78 3d 3d 30 20 29 7b 0a 20  ( pIndex==0 ){. 
1c8c0 20 20 20 69 66 28 20 21 69 66 45 78 69 73 74 73     if( !ifExists
1c8d0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
1c8e0 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
1c8f0 2c 20 22 6e 6f 20 73 75 63 68 20 69 6e 64 65 78  , "no such index
1c900 3a 20 25 53 22 2c 20 70 4e 61 6d 65 2c 20 30 29  : %S", pName, 0)
1c910 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1c920 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65     sqlite3CodeVe
1c930 72 69 66 79 4e 61 6d 65 64 53 63 68 65 6d 61 28  rifyNamedSchema(
1c940 70 50 61 72 73 65 2c 20 70 4e 61 6d 65 2d 3e 61  pParse, pName->a
1c950 5b 30 5d 2e 7a 44 61 74 61 62 61 73 65 29 3b 0a  [0].zDatabase);.
1c960 20 20 20 20 7d 0a 20 20 20 20 70 50 61 72 73 65      }.    pParse
1c970 2d 3e 63 68 65 63 6b 53 63 68 65 6d 61 20 3d 20  ->checkSchema = 
1c980 31 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74  1;.    goto exit
1c990 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 7d  _drop_index;.  }
1c9a0 0a 20 20 69 66 28 20 70 49 6e 64 65 78 2d 3e 69  .  if( pIndex->i
1c9b0 64 78 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 49  dxType!=SQLITE_I
1c9c0 44 58 54 59 50 45 5f 41 50 50 44 45 46 20 29 7b  DXTYPE_APPDEF ){
1c9d0 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
1c9e0 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 69 6e  rMsg(pParse, "in
1c9f0 64 65 78 20 61 73 73 6f 63 69 61 74 65 64 20 77  dex associated w
1ca00 69 74 68 20 55 4e 49 51 55 45 20 22 0a 20 20 20  ith UNIQUE ".   
1ca10 20 20 20 22 6f 72 20 50 52 49 4d 41 52 59 20 4b     "or PRIMARY K
1ca20 45 59 20 63 6f 6e 73 74 72 61 69 6e 74 20 63 61  EY constraint ca
1ca30 6e 6e 6f 74 20 62 65 20 64 72 6f 70 70 65 64 22  nnot be dropped"
1ca40 2c 20 30 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65  , 0);.    goto e
1ca50 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a  xit_drop_index;.
1ca60 20 20 7d 0a 20 20 69 44 62 20 3d 20 73 71 6c 69    }.  iDb = sqli
1ca70 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78  te3SchemaToIndex
1ca80 28 64 62 2c 20 70 49 6e 64 65 78 2d 3e 70 53 63  (db, pIndex->pSc
1ca90 68 65 6d 61 29 3b 0a 23 69 66 6e 64 65 66 20 53  hema);.#ifndef S
1caa0 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f  QLITE_OMIT_AUTHO
1cab0 52 49 5a 41 54 49 4f 4e 0a 20 20 7b 0a 20 20 20  RIZATION.  {.   
1cac0 20 69 6e 74 20 63 6f 64 65 20 3d 20 53 51 4c 49   int code = SQLI
1cad0 54 45 5f 44 52 4f 50 5f 49 4e 44 45 58 3b 0a 20  TE_DROP_INDEX;. 
1cae0 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d     Table *pTab =
1caf0 20 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 3b   pIndex->pTable;
1cb00 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
1cb10 2a 7a 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69  *zDb = db->aDb[i
1cb20 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 63  Db].zName;.    c
1cb30 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62 20  onst char *zTab 
1cb40 3d 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69  = SCHEMA_TABLE(i
1cb50 44 62 29 3b 0a 20 20 20 20 69 66 28 20 73 71 6c  Db);.    if( sql
1cb60 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50  ite3AuthCheck(pP
1cb70 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 44 45 4c  arse, SQLITE_DEL
1cb80 45 54 45 2c 20 7a 54 61 62 2c 20 30 2c 20 7a 44  ETE, zTab, 0, zD
1cb90 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  b) ){.      goto
1cba0 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78   exit_drop_index
1cbb0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
1cbc0 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26 26 20  !OMIT_TEMPDB && 
1cbd0 69 44 62 20 29 20 63 6f 64 65 20 3d 20 53 51 4c  iDb ) code = SQL
1cbe0 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 49 4e  ITE_DROP_TEMP_IN
1cbf0 44 45 58 3b 0a 20 20 20 20 69 66 28 20 73 71 6c  DEX;.    if( sql
1cc00 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50  ite3AuthCheck(pP
1cc10 61 72 73 65 2c 20 63 6f 64 65 2c 20 70 49 6e 64  arse, code, pInd
1cc20 65 78 2d 3e 7a 4e 61 6d 65 2c 20 70 54 61 62 2d  ex->zName, pTab-
1cc30 3e 7a 4e 61 6d 65 2c 20 7a 44 62 29 20 29 7b 0a  >zName, zDb) ){.
1cc40 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f        goto exit_
1cc50 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 20 20  drop_index;.    
1cc60 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  }.  }.#endif..  
1cc70 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
1cc80 20 74 6f 20 72 65 6d 6f 76 65 20 74 68 65 20 69   to remove the i
1cc90 6e 64 65 78 20 61 6e 64 20 66 72 6f 6d 20 74 68  ndex and from th
1cca0 65 20 6d 61 73 74 65 72 20 74 61 62 6c 65 20 2a  e master table *
1ccb0 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47  /.  v = sqlite3G
1ccc0 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
1ccd0 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20 73    if( v ){.    s
1cce0 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74 65  qlite3BeginWrite
1ccf0 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65  Operation(pParse
1cd00 2c 20 31 2c 20 69 44 62 29 3b 0a 20 20 20 20 73  , 1, iDb);.    s
1cd10 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72 73  qlite3NestedPars
1cd20 65 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20  e(pParse,.      
1cd30 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 25 51   "DELETE FROM %Q
1cd40 2e 25 73 20 57 48 45 52 45 20 6e 61 6d 65 3d 25  .%s WHERE name=%
1cd50 51 20 41 4e 44 20 74 79 70 65 3d 27 69 6e 64 65  Q AND type='inde
1cd60 78 27 22 2c 0a 20 20 20 20 20 20 20 64 62 2d 3e  x'",.       db->
1cd70 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 2c 20  aDb[iDb].zName, 
1cd80 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 44 62  SCHEMA_TABLE(iDb
1cd90 29 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65  ), pIndex->zName
1cda0 0a 20 20 20 20 29 3b 0a 20 20 20 20 73 71 6c 69  .    );.    sqli
1cdb0 74 65 33 43 6c 65 61 72 53 74 61 74 54 61 62 6c  te3ClearStatTabl
1cdc0 65 73 28 70 50 61 72 73 65 2c 20 69 44 62 2c 20  es(pParse, iDb, 
1cdd0 22 69 64 78 22 2c 20 70 49 6e 64 65 78 2d 3e 7a  "idx", pIndex->z
1cde0 4e 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69 74  Name);.    sqlit
1cdf0 65 33 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28 70  e3ChangeCookie(p
1ce00 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 20  Parse, iDb);.   
1ce10 20 64 65 73 74 72 6f 79 52 6f 6f 74 50 61 67 65   destroyRootPage
1ce20 28 70 50 61 72 73 65 2c 20 70 49 6e 64 65 78 2d  (pParse, pIndex-
1ce30 3e 74 6e 75 6d 2c 20 69 44 62 29 3b 0a 20 20 20  >tnum, iDb);.   
1ce40 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1ce50 70 34 28 76 2c 20 4f 50 5f 44 72 6f 70 49 6e 64  p4(v, OP_DropInd
1ce60 65 78 2c 20 69 44 62 2c 20 30 2c 20 30 2c 20 70  ex, iDb, 0, 0, p
1ce70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 30 29  Index->zName, 0)
1ce80 3b 0a 20 20 7d 0a 0a 65 78 69 74 5f 64 72 6f 70  ;.  }..exit_drop
1ce90 5f 69 6e 64 65 78 3a 0a 20 20 73 71 6c 69 74 65  _index:.  sqlite
1cea0 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28 64  3SrcListDelete(d
1ceb0 62 2c 20 70 4e 61 6d 65 29 3b 0a 7d 0a 0a 2f 2a  b, pName);.}../*
1cec0 0a 2a 2a 20 70 41 72 72 61 79 20 69 73 20 61 20  .** pArray is a 
1ced0 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 61 72  pointer to an ar
1cee0 72 61 79 20 6f 66 20 6f 62 6a 65 63 74 73 2e 20  ray of objects. 
1cef0 45 61 63 68 20 6f 62 6a 65 63 74 20 69 6e 20 74  Each object in t
1cf00 68 65 0a 2a 2a 20 61 72 72 61 79 20 69 73 20 73  he.** array is s
1cf10 7a 45 6e 74 72 79 20 62 79 74 65 73 20 69 6e 20  zEntry bytes in 
1cf20 73 69 7a 65 2e 20 54 68 69 73 20 72 6f 75 74 69  size. This routi
1cf30 6e 65 20 75 73 65 73 20 73 71 6c 69 74 65 33 44  ne uses sqlite3D
1cf40 62 52 65 61 6c 6c 6f 63 28 29 0a 2a 2a 20 74 6f  bRealloc().** to
1cf50 20 65 78 74 65 6e 64 20 74 68 65 20 61 72 72 61   extend the arra
1cf60 79 20 73 6f 20 74 68 61 74 20 74 68 65 72 65 20  y so that there 
1cf70 69 73 20 73 70 61 63 65 20 66 6f 72 20 61 20 6e  is space for a n
1cf80 65 77 20 6f 62 6a 65 63 74 20 61 74 20 74 68 65  ew object at the
1cf90 20 65 6e 64 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e   end..**.** When
1cfa0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
1cfb0 73 20 63 61 6c 6c 65 64 2c 20 2a 70 6e 45 6e 74  s called, *pnEnt
1cfc0 72 79 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  ry contains the 
1cfd0 63 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 0a  current size of.
1cfe0 2a 2a 20 74 68 65 20 61 72 72 61 79 20 28 69 6e  ** the array (in
1cff0 20 65 6e 74 72 69 65 73 20 2d 20 73 6f 20 74 68   entries - so th
1d000 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 69 73 20  e allocation is 
1d010 28 28 2a 70 6e 45 6e 74 72 79 29 20 2a 20 73 7a  ((*pnEntry) * sz
1d020 45 6e 74 72 79 29 20 62 79 74 65 73 0a 2a 2a 20  Entry) bytes.** 
1d030 69 6e 20 74 6f 74 61 6c 29 2e 0a 2a 2a 0a 2a 2a  in total)..**.**
1d040 20 49 66 20 74 68 65 20 72 65 61 6c 6c 6f 63 28   If the realloc(
1d050 29 20 69 73 20 73 75 63 63 65 73 73 66 75 6c 20  ) is successful 
1d060 28 69 2e 65 2e 20 69 66 20 6e 6f 20 4f 4f 4d 20  (i.e. if no OOM 
1d070 63 6f 6e 64 69 74 69 6f 6e 20 6f 63 63 75 72 73  condition occurs
1d080 29 2c 20 74 68 65 0a 2a 2a 20 73 70 61 63 65 20  ), the.** space 
1d090 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 74 68  allocated for th
1d0a0 65 20 6e 65 77 20 6f 62 6a 65 63 74 20 69 73 20  e new object is 
1d0b0 7a 65 72 6f 65 64 2c 20 2a 70 6e 45 6e 74 72 79  zeroed, *pnEntry
1d0c0 20 75 70 64 61 74 65 64 20 74 6f 0a 2a 2a 20 72   updated to.** r
1d0d0 65 66 6c 65 63 74 20 74 68 65 20 6e 65 77 20 73  eflect the new s
1d0e0 69 7a 65 20 6f 66 20 74 68 65 20 61 72 72 61 79  ize of the array
1d0f0 20 61 6e 64 20 61 20 70 6f 69 6e 74 65 72 20 74   and a pointer t
1d100 6f 20 74 68 65 20 6e 65 77 20 61 6c 6c 6f 63 61  o the new alloca
1d110 74 69 6f 6e 0a 2a 2a 20 72 65 74 75 72 6e 65 64  tion.** returned
1d120 2e 20 2a 70 49 64 78 20 69 73 20 73 65 74 20 74  . *pIdx is set t
1d130 6f 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74  o the index of t
1d140 68 65 20 6e 65 77 20 61 72 72 61 79 20 65 6e 74  he new array ent
1d150 72 79 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e  ry in this case.
1d160 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65  .**.** Otherwise
1d170 2c 20 69 66 20 74 68 65 20 72 65 61 6c 6c 6f 63  , if the realloc
1d180 28 29 20 66 61 69 6c 73 2c 20 2a 70 49 64 78 20  () fails, *pIdx 
1d190 69 73 20 73 65 74 20 74 6f 20 2d 31 2c 20 2a 70  is set to -1, *p
1d1a0 6e 45 6e 74 72 79 20 72 65 6d 61 69 6e 73 0a 2a  nEntry remains.*
1d1b0 2a 20 75 6e 63 68 61 6e 67 65 64 20 61 6e 64 20  * unchanged and 
1d1c0 61 20 63 6f 70 79 20 6f 66 20 70 41 72 72 61 79  a copy of pArray
1d1d0 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 76 6f   returned..*/.vo
1d1e0 69 64 20 2a 73 71 6c 69 74 65 33 41 72 72 61 79  id *sqlite3Array
1d1f0 41 6c 6c 6f 63 61 74 65 28 0a 20 20 73 71 6c 69  Allocate(.  sqli
1d200 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 2f 2a  te3 *db,      /*
1d210 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 6e   Connection to n
1d220 6f 74 69 66 79 20 6f 66 20 6d 61 6c 6c 6f 63 20  otify of malloc 
1d230 66 61 69 6c 75 72 65 73 20 2a 2f 0a 20 20 76 6f  failures */.  vo
1d240 69 64 20 2a 70 41 72 72 61 79 2c 20 20 20 20 20  id *pArray,     
1d250 2f 2a 20 41 72 72 61 79 20 6f 66 20 6f 62 6a 65  /* Array of obje
1d260 63 74 73 2e 20 20 4d 69 67 68 74 20 62 65 20 72  cts.  Might be r
1d270 65 61 6c 6c 6f 63 61 74 65 64 20 2a 2f 0a 20 20  eallocated */.  
1d280 69 6e 74 20 73 7a 45 6e 74 72 79 2c 20 20 20 20  int szEntry,    
1d290 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 65 61 63    /* Size of eac
1d2a0 68 20 6f 62 6a 65 63 74 20 69 6e 20 74 68 65 20  h object in the 
1d2b0 61 72 72 61 79 20 2a 2f 0a 20 20 69 6e 74 20 2a  array */.  int *
1d2c0 70 6e 45 6e 74 72 79 2c 20 20 20 20 20 2f 2a 20  pnEntry,     /* 
1d2d0 4e 75 6d 62 65 72 20 6f 66 20 6f 62 6a 65 63 74  Number of object
1d2e0 73 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 75  s currently in u
1d2f0 73 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 49 64  se */.  int *pId
1d300 78 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69  x         /* Wri
1d310 74 65 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20  te the index of 
1d320 61 20 6e 65 77 20 73 6c 6f 74 20 68 65 72 65 20  a new slot here 
1d330 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a 3b  */.){.  char *z;
1d340 0a 20 20 69 6e 74 20 6e 20 3d 20 2a 70 6e 45 6e  .  int n = *pnEn
1d350 74 72 79 3b 0a 20 20 69 66 28 20 28 6e 20 26 20  try;.  if( (n & 
1d360 28 6e 2d 31 29 29 3d 3d 30 20 29 7b 0a 20 20 20  (n-1))==0 ){.   
1d370 20 69 6e 74 20 73 7a 20 3d 20 28 6e 3d 3d 30 29   int sz = (n==0)
1d380 20 3f 20 31 20 3a 20 32 2a 6e 3b 0a 20 20 20 20   ? 1 : 2*n;.    
1d390 76 6f 69 64 20 2a 70 4e 65 77 20 3d 20 73 71 6c  void *pNew = sql
1d3a0 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 28 64 62  ite3DbRealloc(db
1d3b0 2c 20 70 41 72 72 61 79 2c 20 73 7a 2a 73 7a 45  , pArray, sz*szE
1d3c0 6e 74 72 79 29 3b 0a 20 20 20 20 69 66 28 20 70  ntry);.    if( p
1d3d0 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  New==0 ){.      
1d3e0 2a 70 49 64 78 20 3d 20 2d 31 3b 0a 20 20 20 20  *pIdx = -1;.    
1d3f0 20 20 72 65 74 75 72 6e 20 70 41 72 72 61 79 3b    return pArray;
1d400 0a 20 20 20 20 7d 0a 20 20 20 20 70 41 72 72 61  .    }.    pArra
1d410 79 20 3d 20 70 4e 65 77 3b 0a 20 20 7d 0a 20 20  y = pNew;.  }.  
1d420 7a 20 3d 20 28 63 68 61 72 2a 29 70 41 72 72 61  z = (char*)pArra
1d430 79 3b 0a 20 20 6d 65 6d 73 65 74 28 26 7a 5b 6e  y;.  memset(&z[n
1d440 20 2a 20 73 7a 45 6e 74 72 79 5d 2c 20 30 2c 20   * szEntry], 0, 
1d450 73 7a 45 6e 74 72 79 29 3b 0a 20 20 2a 70 49 64  szEntry);.  *pId
1d460 78 20 3d 20 6e 3b 0a 20 20 2b 2b 2a 70 6e 45 6e  x = n;.  ++*pnEn
1d470 74 72 79 3b 0a 20 20 72 65 74 75 72 6e 20 70 41  try;.  return pA
1d480 72 72 61 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  rray;.}../*.** A
1d490 70 70 65 6e 64 20 61 20 6e 65 77 20 65 6c 65 6d  ppend a new elem
1d4a0 65 6e 74 20 74 6f 20 74 68 65 20 67 69 76 65 6e  ent to the given
1d4b0 20 49 64 4c 69 73 74 2e 20 20 43 72 65 61 74 65   IdList.  Create
1d4c0 20 61 20 6e 65 77 20 49 64 4c 69 73 74 20 69 66   a new IdList if
1d4d0 0a 2a 2a 20 6e 65 65 64 20 62 65 2e 0a 2a 2a 0a  .** need be..**.
1d4e0 2a 2a 20 41 20 6e 65 77 20 49 64 4c 69 73 74 20  ** A new IdList 
1d4f0 69 73 20 72 65 74 75 72 6e 65 64 2c 20 6f 72 20  is returned, or 
1d500 4e 55 4c 4c 20 69 66 20 6d 61 6c 6c 6f 63 28 29  NULL if malloc()
1d510 20 66 61 69 6c 73 2e 0a 2a 2f 0a 49 64 4c 69 73   fails..*/.IdLis
1d520 74 20 2a 73 71 6c 69 74 65 33 49 64 4c 69 73 74  t *sqlite3IdList
1d530 41 70 70 65 6e 64 28 73 71 6c 69 74 65 33 20 2a  Append(sqlite3 *
1d540 64 62 2c 20 49 64 4c 69 73 74 20 2a 70 4c 69 73  db, IdList *pLis
1d550 74 2c 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e  t, Token *pToken
1d560 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66  ){.  int i;.  if
1d570 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20  ( pList==0 ){.  
1d580 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65    pList = sqlite
1d590 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62  3DbMallocZero(db
1d5a0 2c 20 73 69 7a 65 6f 66 28 49 64 4c 69 73 74 29  , sizeof(IdList)
1d5b0 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73   );.    if( pLis
1d5c0 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  t==0 ) return 0;
1d5d0 0a 20 20 7d 0a 20 20 70 4c 69 73 74 2d 3e 61 20  .  }.  pList->a 
1d5e0 3d 20 73 71 6c 69 74 65 33 41 72 72 61 79 41 6c  = sqlite3ArrayAl
1d5f0 6c 6f 63 61 74 65 28 0a 20 20 20 20 20 20 64 62  locate(.      db
1d600 2c 0a 20 20 20 20 20 20 70 4c 69 73 74 2d 3e 61  ,.      pList->a
1d610 2c 0a 20 20 20 20 20 20 73 69 7a 65 6f 66 28 70  ,.      sizeof(p
1d620 4c 69 73 74 2d 3e 61 5b 30 5d 29 2c 0a 20 20 20  List->a[0]),.   
1d630 20 20 20 26 70 4c 69 73 74 2d 3e 6e 49 64 2c 0a     &pList->nId,.
1d640 20 20 20 20 20 20 26 69 0a 20 20 29 3b 0a 20 20        &i.  );.  
1d650 69 66 28 20 69 3c 30 20 29 7b 0a 20 20 20 20 73  if( i<0 ){.    s
1d660 71 6c 69 74 65 33 49 64 4c 69 73 74 44 65 6c 65  qlite3IdListDele
1d670 74 65 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a 20  te(db, pList);. 
1d680 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
1d690 0a 20 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a  .  pList->a[i].z
1d6a0 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61  Name = sqlite3Na
1d6b0 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20  meFromToken(db, 
1d6c0 70 54 6f 6b 65 6e 29 3b 0a 20 20 72 65 74 75 72  pToken);.  retur
1d6d0 6e 20 70 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  n pList;.}../*.*
1d6e0 2a 20 44 65 6c 65 74 65 20 61 6e 20 49 64 4c 69  * Delete an IdLi
1d6f0 73 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  st..*/.void sqli
1d700 74 65 33 49 64 4c 69 73 74 44 65 6c 65 74 65 28  te3IdListDelete(
1d710 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 49 64 4c  sqlite3 *db, IdL
1d720 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69  ist *pList){.  i
1d730 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 4c 69 73  nt i;.  if( pLis
1d740 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  t==0 ) return;. 
1d750 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73   for(i=0; i<pLis
1d760 74 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20 20  t->nId; i++){.  
1d770 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
1d780 64 62 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  db, pList->a[i].
1d790 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 73 71  zName);.  }.  sq
1d7a0 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
1d7b0 70 4c 69 73 74 2d 3e 61 29 3b 0a 20 20 73 71 6c  pList->a);.  sql
1d7c0 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
1d7d0 4c 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  List);.}../*.** 
1d7e0 52 65 74 75 72 6e 20 74 68 65 20 69 6e 64 65 78  Return the index
1d7f0 20 69 6e 20 70 4c 69 73 74 20 6f 66 20 74 68 65   in pList of the
1d800 20 69 64 65 6e 74 69 66 69 65 72 20 6e 61 6d 65   identifier name
1d810 64 20 7a 49 64 2e 20 20 52 65 74 75 72 6e 20 2d  d zId.  Return -
1d820 31 0a 2a 2a 20 69 66 20 6e 6f 74 20 66 6f 75 6e  1.** if not foun
1d830 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
1d840 33 49 64 4c 69 73 74 49 6e 64 65 78 28 49 64 4c  3IdListIndex(IdL
1d850 69 73 74 20 2a 70 4c 69 73 74 2c 20 63 6f 6e 73  ist *pList, cons
1d860 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a  t char *zName){.
1d870 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70    int i;.  if( p
1d880 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e  List==0 ) return
1d890 20 2d 31 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20   -1;.  for(i=0; 
1d8a0 69 3c 70 4c 69 73 74 2d 3e 6e 49 64 3b 20 69 2b  i<pList->nId; i+
1d8b0 2b 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69  +){.    if( sqli
1d8c0 74 65 33 53 74 72 49 43 6d 70 28 70 4c 69 73 74  te3StrICmp(pList
1d8d0 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 7a 4e  ->a[i].zName, zN
1d8e0 61 6d 65 29 3d 3d 30 20 29 20 72 65 74 75 72 6e  ame)==0 ) return
1d8f0 20 69 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   i;.  }.  return
1d900 20 2d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78   -1;.}../*.** Ex
1d910 70 61 6e 64 20 74 68 65 20 73 70 61 63 65 20 61  pand the space a
1d920 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 74 68 65  llocated for the
1d930 20 67 69 76 65 6e 20 53 72 63 4c 69 73 74 20 6f   given SrcList o
1d940 62 6a 65 63 74 20 62 79 0a 2a 2a 20 63 72 65 61  bject by.** crea
1d950 74 69 6e 67 20 6e 45 78 74 72 61 20 6e 65 77 20  ting nExtra new 
1d960 73 6c 6f 74 73 20 62 65 67 69 6e 6e 69 6e 67 20  slots beginning 
1d970 61 74 20 69 53 74 61 72 74 2e 20 20 69 53 74 61  at iStart.  iSta
1d980 72 74 20 69 73 20 7a 65 72 6f 20 62 61 73 65 64  rt is zero based
1d990 2e 0a 2a 2a 20 4e 65 77 20 73 6c 6f 74 73 20 61  ..** New slots a
1d9a0 72 65 20 7a 65 72 6f 65 64 2e 0a 2a 2a 0a 2a 2a  re zeroed..**.**
1d9b0 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 73 75   For example, su
1d9c0 70 70 6f 73 65 20 61 20 53 72 63 4c 69 73 74 20  ppose a SrcList 
1d9d0 69 6e 69 74 69 61 6c 6c 79 20 63 6f 6e 74 61 69  initially contai
1d9e0 6e 73 20 74 77 6f 20 65 6e 74 72 69 65 73 3a 20  ns two entries: 
1d9f0 41 2c 42 2e 0a 2a 2a 20 54 6f 20 61 70 70 65 6e  A,B..** To appen
1da00 64 20 33 20 6e 65 77 20 65 6e 74 72 69 65 73 20  d 3 new entries 
1da10 6f 6e 74 6f 20 74 68 65 20 65 6e 64 2c 20 64 6f  onto the end, do
1da20 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20   this:.**.**    
1da30 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 45 6e  sqlite3SrcListEn
1da40 6c 61 72 67 65 28 64 62 2c 20 70 53 72 63 6c 69  large(db, pSrcli
1da50 73 74 2c 20 33 2c 20 32 29 3b 0a 2a 2a 0a 2a 2a  st, 3, 2);.**.**
1da60 20 41 66 74 65 72 20 74 68 65 20 63 61 6c 6c 20   After the call 
1da70 61 62 6f 76 65 20 69 74 20 77 6f 75 6c 64 20 63  above it would c
1da80 6f 6e 74 61 69 6e 3a 20 20 41 2c 20 42 2c 20 6e  ontain:  A, B, n
1da90 69 6c 2c 20 6e 69 6c 2c 20 6e 69 6c 2e 0a 2a 2a  il, nil, nil..**
1daa0 20 49 66 20 74 68 65 20 69 53 74 61 72 74 20 61   If the iStart a
1dab0 72 67 75 6d 65 6e 74 20 68 61 64 20 62 65 65 6e  rgument had been
1dac0 20 31 20 69 6e 73 74 65 61 64 20 6f 66 20 32 2c   1 instead of 2,
1dad0 20 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74   then the result
1dae0 0a 2a 2a 20 77 6f 75 6c 64 20 68 61 76 65 20 62  .** would have b
1daf0 65 65 6e 3a 20 20 41 2c 20 6e 69 6c 2c 20 6e 69  een:  A, nil, ni
1db00 6c 2c 20 6e 69 6c 2c 20 42 2e 20 20 54 6f 20 70  l, nil, B.  To p
1db10 72 65 70 65 6e 64 20 74 68 65 20 6e 65 77 20 73  repend the new s
1db20 6c 6f 74 73 2c 0a 2a 2a 20 74 68 65 20 69 53 74  lots,.** the iSt
1db30 61 72 74 20 76 61 6c 75 65 20 77 6f 75 6c 64 20  art value would 
1db40 62 65 20 30 2e 20 20 54 68 65 20 72 65 73 75 6c  be 0.  The resul
1db50 74 20 74 68 65 6e 20 77 6f 75 6c 64 0a 2a 2a 20  t then would.** 
1db60 62 65 3a 20 6e 69 6c 2c 20 6e 69 6c 2c 20 6e 69  be: nil, nil, ni
1db70 6c 2c 20 41 2c 20 42 2e 0a 2a 2a 0a 2a 2a 20 49  l, A, B..**.** I
1db80 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63  f a memory alloc
1db90 61 74 69 6f 6e 20 66 61 69 6c 73 20 74 68 65 20  ation fails the 
1dba0 53 72 63 4c 69 73 74 20 69 73 20 75 6e 63 68 61  SrcList is uncha
1dbb0 6e 67 65 64 2e 20 20 54 68 65 0a 2a 2a 20 64 62  nged.  The.** db
1dbc0 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 66  ->mallocFailed f
1dbd0 6c 61 67 20 77 69 6c 6c 20 62 65 20 73 65 74 20  lag will be set 
1dbe0 74 6f 20 74 72 75 65 2e 0a 2a 2f 0a 53 72 63 4c  to true..*/.SrcL
1dbf0 69 73 74 20 2a 73 71 6c 69 74 65 33 53 72 63 4c  ist *sqlite3SrcL
1dc00 69 73 74 45 6e 6c 61 72 67 65 28 0a 20 20 73 71  istEnlarge(.  sq
1dc10 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20  lite3 *db,      
1dc20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e   /* Database con
1dc30 6e 65 63 74 69 6f 6e 20 74 6f 20 6e 6f 74 69 66  nection to notif
1dc40 79 20 6f 66 20 4f 4f 4d 20 65 72 72 6f 72 73 20  y of OOM errors 
1dc50 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53  */.  SrcList *pS
1dc60 72 63 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 53  rc,     /* The S
1dc70 72 63 4c 69 73 74 20 74 6f 20 62 65 20 65 6e 6c  rcList to be enl
1dc80 61 72 67 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e  arged */.  int n
1dc90 45 78 74 72 61 2c 20 20 20 20 20 20 20 20 2f 2a  Extra,        /*
1dca0 20 4e 75 6d 62 65 72 20 6f 66 20 6e 65 77 20 73   Number of new s
1dcb0 6c 6f 74 73 20 74 6f 20 61 64 64 20 74 6f 20 70  lots to add to p
1dcc0 53 72 63 2d 3e 61 5b 5d 20 2a 2f 0a 20 20 69 6e  Src->a[] */.  in
1dcd0 74 20 69 53 74 61 72 74 20 20 20 20 20 20 20 20  t iStart        
1dce0 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20 70 53 72   /* Index in pSr
1dcf0 63 2d 3e 61 5b 5d 20 6f 66 20 66 69 72 73 74 20  c->a[] of first 
1dd00 6e 65 77 20 73 6c 6f 74 20 2a 2f 0a 29 7b 0a 20  new slot */.){. 
1dd10 20 69 6e 74 20 69 3b 0a 0a 20 20 2f 2a 20 53 61   int i;..  /* Sa
1dd20 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20 6f 6e  nity checking on
1dd30 20 63 61 6c 6c 69 6e 67 20 70 61 72 61 6d 65 74   calling paramet
1dd40 65 72 73 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ers */.  assert(
1dd50 20 69 53 74 61 72 74 3e 3d 30 20 29 3b 0a 20 20   iStart>=0 );.  
1dd60 61 73 73 65 72 74 28 20 6e 45 78 74 72 61 3e 3d  assert( nExtra>=
1dd70 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  1 );.  assert( p
1dd80 53 72 63 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  Src!=0 );.  asse
1dd90 72 74 28 20 69 53 74 61 72 74 3c 3d 70 53 72 63  rt( iStart<=pSrc
1dda0 2d 3e 6e 53 72 63 20 29 3b 0a 0a 20 20 2f 2a 20  ->nSrc );..  /* 
1ddb0 41 6c 6c 6f 63 61 74 65 20 61 64 64 69 74 69 6f  Allocate additio
1ddc0 6e 61 6c 20 73 70 61 63 65 20 69 66 20 6e 65 65  nal space if nee
1ddd0 64 65 64 20 2a 2f 0a 20 20 69 66 28 20 28 75 33  ded */.  if( (u3
1dde0 32 29 70 53 72 63 2d 3e 6e 53 72 63 2b 6e 45 78  2)pSrc->nSrc+nEx
1ddf0 74 72 61 3e 70 53 72 63 2d 3e 6e 41 6c 6c 6f 63  tra>pSrc->nAlloc
1de00 20 29 7b 0a 20 20 20 20 53 72 63 4c 69 73 74 20   ){.    SrcList 
1de10 2a 70 4e 65 77 3b 0a 20 20 20 20 69 6e 74 20 6e  *pNew;.    int n
1de20 41 6c 6c 6f 63 20 3d 20 70 53 72 63 2d 3e 6e 53  Alloc = pSrc->nS
1de30 72 63 2b 6e 45 78 74 72 61 3b 0a 20 20 20 20 69  rc+nExtra;.    i
1de40 6e 74 20 6e 47 6f 74 3b 0a 20 20 20 20 70 4e 65  nt nGot;.    pNe
1de50 77 20 3d 20 73 71 6c 69 74 65 33 44 62 52 65 61  w = sqlite3DbRea
1de60 6c 6c 6f 63 28 64 62 2c 20 70 53 72 63 2c 0a 20  lloc(db, pSrc,. 
1de70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 69                si
1de80 7a 65 6f 66 28 2a 70 53 72 63 29 20 2b 20 28 6e  zeof(*pSrc) + (n
1de90 41 6c 6c 6f 63 2d 31 29 2a 73 69 7a 65 6f 66 28  Alloc-1)*sizeof(
1dea0 70 53 72 63 2d 3e 61 5b 30 5d 29 20 29 3b 0a 20  pSrc->a[0]) );. 
1deb0 20 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29     if( pNew==0 )
1dec0 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
1ded0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
1dee0 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   );.      return
1def0 20 70 53 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20   pSrc;.    }.   
1df00 20 70 53 72 63 20 3d 20 70 4e 65 77 3b 0a 20 20   pSrc = pNew;.  
1df10 20 20 6e 47 6f 74 20 3d 20 28 73 71 6c 69 74 65    nGot = (sqlite
1df20 33 44 62 4d 61 6c 6c 6f 63 53 69 7a 65 28 64 62  3DbMallocSize(db
1df30 2c 20 70 4e 65 77 29 20 2d 20 73 69 7a 65 6f 66  , pNew) - sizeof
1df40 28 2a 70 53 72 63 29 29 2f 73 69 7a 65 6f 66 28  (*pSrc))/sizeof(
1df50 70 53 72 63 2d 3e 61 5b 30 5d 29 2b 31 3b 0a 20  pSrc->a[0])+1;. 
1df60 20 20 20 70 53 72 63 2d 3e 6e 41 6c 6c 6f 63 20     pSrc->nAlloc 
1df70 3d 20 6e 47 6f 74 3b 0a 20 20 7d 0a 0a 20 20 2f  = nGot;.  }..  /
1df80 2a 20 4d 6f 76 65 20 65 78 69 73 74 69 6e 67 20  * Move existing 
1df90 73 6c 6f 74 73 20 74 68 61 74 20 63 6f 6d 65 20  slots that come 
1dfa0 61 66 74 65 72 20 74 68 65 20 6e 65 77 6c 79 20  after the newly 
1dfb0 69 6e 73 65 72 74 65 64 20 73 6c 6f 74 73 0a 20  inserted slots. 
1dfc0 20 2a 2a 20 6f 75 74 20 6f 66 20 74 68 65 20 77   ** out of the w
1dfd0 61 79 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 70 53  ay */.  for(i=pS
1dfe0 72 63 2d 3e 6e 53 72 63 2d 31 3b 20 69 3e 3d 69  rc->nSrc-1; i>=i
1dff0 53 74 61 72 74 3b 20 69 2d 2d 29 7b 0a 20 20 20  Start; i--){.   
1e000 20 70 53 72 63 2d 3e 61 5b 69 2b 6e 45 78 74 72   pSrc->a[i+nExtr
1e010 61 5d 20 3d 20 70 53 72 63 2d 3e 61 5b 69 5d 3b  a] = pSrc->a[i];
1e020 0a 20 20 7d 0a 20 20 70 53 72 63 2d 3e 6e 53 72  .  }.  pSrc->nSr
1e030 63 20 2b 3d 20 6e 45 78 74 72 61 3b 0a 0a 20 20  c += nExtra;..  
1e040 2f 2a 20 5a 65 72 6f 20 74 68 65 20 6e 65 77 6c  /* Zero the newl
1e050 79 20 61 6c 6c 6f 63 61 74 65 64 20 73 6c 6f 74  y allocated slot
1e060 73 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 26 70  s */.  memset(&p
1e070 53 72 63 2d 3e 61 5b 69 53 74 61 72 74 5d 2c 20  Src->a[iStart], 
1e080 30 2c 20 73 69 7a 65 6f 66 28 70 53 72 63 2d 3e  0, sizeof(pSrc->
1e090 61 5b 30 5d 29 2a 6e 45 78 74 72 61 29 3b 0a 20  a[0])*nExtra);. 
1e0a0 20 66 6f 72 28 69 3d 69 53 74 61 72 74 3b 20 69   for(i=iStart; i
1e0b0 3c 69 53 74 61 72 74 2b 6e 45 78 74 72 61 3b 20  <iStart+nExtra; 
1e0c0 69 2b 2b 29 7b 0a 20 20 20 20 70 53 72 63 2d 3e  i++){.    pSrc->
1e0d0 61 5b 69 5d 2e 69 43 75 72 73 6f 72 20 3d 20 2d  a[i].iCursor = -
1e0e0 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 74  1;.  }..  /* Ret
1e0f0 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
1e100 20 74 68 65 20 65 6e 6c 61 72 67 65 64 20 53 72   the enlarged Sr
1e110 63 4c 69 73 74 20 2a 2f 0a 20 20 72 65 74 75 72  cList */.  retur
1e120 6e 20 70 53 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  n pSrc;.}.../*.*
1e130 2a 20 41 70 70 65 6e 64 20 61 20 6e 65 77 20 74  * Append a new t
1e140 61 62 6c 65 20 6e 61 6d 65 20 74 6f 20 74 68 65  able name to the
1e150 20 67 69 76 65 6e 20 53 72 63 4c 69 73 74 2e 20   given SrcList. 
1e160 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 53 72   Create a new Sr
1e170 63 4c 69 73 74 20 69 66 0a 2a 2a 20 6e 65 65 64  cList if.** need
1e180 20 62 65 2e 20 20 41 20 6e 65 77 20 65 6e 74 72   be.  A new entr
1e190 79 20 69 73 20 63 72 65 61 74 65 64 20 69 6e 20  y is created in 
1e1a0 74 68 65 20 53 72 63 4c 69 73 74 20 65 76 65 6e  the SrcList even
1e1b0 20 69 66 20 70 54 61 62 6c 65 20 69 73 20 4e 55   if pTable is NU
1e1c0 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 41 20 53 72 63 4c  LL..**.** A SrcL
1e1d0 69 73 74 20 69 73 20 72 65 74 75 72 6e 65 64 2c  ist is returned,
1e1e0 20 6f 72 20 4e 55 4c 4c 20 69 66 20 74 68 65 72   or NULL if ther
1e1f0 65 20 69 73 20 61 6e 20 4f 4f 4d 20 65 72 72 6f  e is an OOM erro
1e200 72 2e 20 20 54 68 65 20 72 65 74 75 72 6e 65 64  r.  The returned
1e210 0a 2a 2a 20 53 72 63 4c 69 73 74 20 6d 69 67 68  .** SrcList migh
1e220 74 20 62 65 20 74 68 65 20 73 61 6d 65 20 61 73  t be the same as
1e230 20 74 68 65 20 53 72 63 4c 69 73 74 20 74 68 61   the SrcList tha
1e240 74 20 77 61 73 20 69 6e 70 75 74 20 6f 72 20 69  t was input or i
1e250 74 20 6d 69 67 68 74 20 62 65 0a 2a 2a 20 61 20  t might be.** a 
1e260 6e 65 77 20 6f 6e 65 2e 20 20 49 66 20 61 6e 20  new one.  If an 
1e270 4f 4f 4d 20 65 72 72 6f 72 20 64 6f 65 73 20 6f  OOM error does o
1e280 63 63 75 72 73 2c 20 74 68 65 6e 20 74 68 65 20  ccurs, then the 
1e290 70 72 69 6f 72 20 76 61 6c 75 65 20 6f 66 20 70  prior value of p
1e2a0 4c 69 73 74 0a 2a 2a 20 74 68 61 74 20 69 73 20  List.** that is 
1e2b0 69 6e 70 75 74 20 74 6f 20 74 68 69 73 20 72 6f  input to this ro
1e2c0 75 74 69 6e 65 20 69 73 20 61 75 74 6f 6d 61 74  utine is automat
1e2d0 69 63 61 6c 6c 79 20 66 72 65 65 64 2e 0a 2a 2a  ically freed..**
1e2e0 0a 2a 2a 20 49 66 20 70 44 61 74 61 62 61 73 65  .** If pDatabase
1e2f0 20 69 73 20 6e 6f 74 20 6e 75 6c 6c 2c 20 69 74   is not null, it
1e300 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20   means that the 
1e310 74 61 62 6c 65 20 68 61 73 20 61 6e 20 6f 70 74  table has an opt
1e320 69 6f 6e 61 6c 0a 2a 2a 20 64 61 74 61 62 61 73  ional.** databas
1e330 65 20 6e 61 6d 65 20 70 72 65 66 69 78 2e 20 20  e name prefix.  
1e340 4c 69 6b 65 20 74 68 69 73 3a 20 20 22 64 61 74  Like this:  "dat
1e350 61 62 61 73 65 2e 74 61 62 6c 65 22 2e 20 20 54  abase.table".  T
1e360 68 65 20 70 44 61 74 61 62 61 73 65 0a 2a 2a 20  he pDatabase.** 
1e370 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 74 61  points to the ta
1e380 62 6c 65 20 6e 61 6d 65 20 61 6e 64 20 74 68 65  ble name and the
1e390 20 70 54 61 62 6c 65 20 70 6f 69 6e 74 73 20 74   pTable points t
1e3a0 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6e  o the database n
1e3b0 61 6d 65 2e 0a 2a 2a 20 54 68 65 20 53 72 63 4c  ame..** The SrcL
1e3c0 69 73 74 2e 61 5b 5d 2e 7a 4e 61 6d 65 20 66 69  ist.a[].zName fi
1e3d0 65 6c 64 20 69 73 20 66 69 6c 6c 65 64 20 77 69  eld is filled wi
1e3e0 74 68 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d  th the table nam
1e3f0 65 20 77 68 69 63 68 20 6d 69 67 68 74 0a 2a 2a  e which might.**
1e400 20 63 6f 6d 65 20 66 72 6f 6d 20 70 54 61 62 6c   come from pTabl
1e410 65 20 28 69 66 20 70 44 61 74 61 62 61 73 65 20  e (if pDatabase 
1e420 69 73 20 4e 55 4c 4c 29 20 6f 72 20 66 72 6f 6d  is NULL) or from
1e430 20 70 44 61 74 61 62 61 73 65 2e 20 20 0a 2a 2a   pDatabase.  .**
1e440 20 53 72 63 4c 69 73 74 2e 61 5b 5d 2e 7a 44 61   SrcList.a[].zDa
1e450 74 61 62 61 73 65 20 69 73 20 66 69 6c 6c 65 64  tabase is filled
1e460 20 77 69 74 68 20 74 68 65 20 64 61 74 61 62 61   with the databa
1e470 73 65 20 6e 61 6d 65 20 66 72 6f 6d 20 70 54 61  se name from pTa
1e480 62 6c 65 2c 0a 2a 2a 20 6f 72 20 77 69 74 68 20  ble,.** or with 
1e490 4e 55 4c 4c 20 69 66 20 6e 6f 20 64 61 74 61 62  NULL if no datab
1e4a0 61 73 65 20 69 73 20 73 70 65 63 69 66 69 65 64  ase is specified
1e4b0 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 6f 74 68 65 72  ..**.** In other
1e4c0 20 77 6f 72 64 73 2c 20 69 66 20 63 61 6c 6c 20   words, if call 
1e4d0 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a  like this:.**.**
1e4e0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
1e4f0 53 72 63 4c 69 73 74 41 70 70 65 6e 64 28 44 2c  SrcListAppend(D,
1e500 41 2c 42 2c 30 29 3b 0a 2a 2a 0a 2a 2a 20 54 68  A,B,0);.**.** Th
1e510 65 6e 20 42 20 69 73 20 61 20 74 61 62 6c 65 20  en B is a table 
1e520 6e 61 6d 65 20 61 6e 64 20 74 68 65 20 64 61 74  name and the dat
1e530 61 62 61 73 65 20 6e 61 6d 65 20 69 73 20 75 6e  abase name is un
1e540 73 70 65 63 69 66 69 65 64 2e 20 20 49 66 20 63  specified.  If c
1e550 61 6c 6c 65 64 0a 2a 2a 20 6c 69 6b 65 20 74 68  alled.** like th
1e560 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  is:.**.**       
1e570 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74    sqlite3SrcList
1e580 41 70 70 65 6e 64 28 44 2c 41 2c 42 2c 43 29 3b  Append(D,A,B,C);
1e590 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 43 20 69 73  .**.** Then C is
1e5a0 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20   the table name 
1e5b0 61 6e 64 20 42 20 69 73 20 74 68 65 20 64 61 74  and B is the dat
1e5c0 61 62 61 73 65 20 6e 61 6d 65 2e 20 20 49 66 20  abase name.  If 
1e5d0 43 20 69 73 20 64 65 66 69 6e 65 64 0a 2a 2a 20  C is defined.** 
1e5e0 74 68 65 6e 20 73 6f 20 69 73 20 42 2e 20 20 49  then so is B.  I
1e5f0 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 77  n other words, w
1e600 65 20 6e 65 76 65 72 20 68 61 76 65 20 61 20 63  e never have a c
1e610 61 73 65 20 77 68 65 72 65 3a 0a 2a 2a 0a 2a 2a  ase where:.**.**
1e620 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
1e630 53 72 63 4c 69 73 74 41 70 70 65 6e 64 28 44 2c  SrcListAppend(D,
1e640 41 2c 30 2c 43 29 3b 0a 2a 2a 0a 2a 2a 20 42 6f  A,0,C);.**.** Bo
1e650 74 68 20 70 54 61 62 6c 65 20 61 6e 64 20 70 44  th pTable and pD
1e660 61 74 61 62 61 73 65 20 61 72 65 20 61 73 73 75  atabase are assu
1e670 6d 65 64 20 74 6f 20 62 65 20 71 75 6f 74 65 64  med to be quoted
1e680 2e 20 20 54 68 65 79 20 61 72 65 20 64 65 71 75  .  They are dequ
1e690 6f 74 65 64 0a 2a 2a 20 62 65 66 6f 72 65 20 62  oted.** before b
1e6a0 65 69 6e 67 20 61 64 64 65 64 20 74 6f 20 74 68  eing added to th
1e6b0 65 20 53 72 63 4c 69 73 74 2e 0a 2a 2f 0a 53 72  e SrcList..*/.Sr
1e6c0 63 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 53 72  cList *sqlite3Sr
1e6d0 63 4c 69 73 74 41 70 70 65 6e 64 28 0a 20 20 73  cListAppend(.  s
1e6e0 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20  qlite3 *db,     
1e6f0 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e     /* Connection
1e700 20 74 6f 20 6e 6f 74 69 66 79 20 6f 66 20 6d 61   to notify of ma
1e710 6c 6c 6f 63 20 66 61 69 6c 75 72 65 73 20 2a 2f  lloc failures */
1e720 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 4c 69 73  .  SrcList *pLis
1e730 74 2c 20 20 20 20 20 2f 2a 20 41 70 70 65 6e 64  t,     /* Append
1e740 20 74 6f 20 74 68 69 73 20 53 72 63 4c 69 73 74   to this SrcList
1e750 2e 20 4e 55 4c 4c 20 63 72 65 61 74 65 73 20 61  . NULL creates a
1e760 20 6e 65 77 20 53 72 63 4c 69 73 74 20 2a 2f 0a   new SrcList */.
1e770 20 20 54 6f 6b 65 6e 20 2a 70 54 61 62 6c 65 2c    Token *pTable,
1e780 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 74        /* Table t
1e790 6f 20 61 70 70 65 6e 64 20 2a 2f 0a 20 20 54 6f  o append */.  To
1e7a0 6b 65 6e 20 2a 70 44 61 74 61 62 61 73 65 20 20  ken *pDatabase  
1e7b0 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 6f 66    /* Database of
1e7c0 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 29 7b   the table */.){
1e7d0 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73  .  struct SrcLis
1e7e0 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20  t_item *pItem;. 
1e7f0 20 61 73 73 65 72 74 28 20 70 44 61 74 61 62 61   assert( pDataba
1e800 73 65 3d 3d 30 20 7c 7c 20 70 54 61 62 6c 65 21  se==0 || pTable!
1e810 3d 30 20 29 3b 20 20 2f 2a 20 43 61 6e 6e 6f 74  =0 );  /* Cannot
1e820 20 68 61 76 65 20 43 20 77 69 74 68 6f 75 74 20   have C without 
1e830 42 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 64  B */.  assert( d
1e840 62 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 4c  b!=0 );.  if( pL
1e850 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4c  ist==0 ){.    pL
1e860 69 73 74 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  ist = sqlite3DbM
1e870 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20 73  allocRawNN(db, s
1e880 69 7a 65 6f 66 28 53 72 63 4c 69 73 74 29 20 29  izeof(SrcList) )
1e890 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 3d  ;.    if( pList=
1e8a0 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
1e8b0 20 20 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63     pList->nAlloc
1e8c0 20 3d 20 31 3b 0a 20 20 20 20 70 4c 69 73 74 2d   = 1;.    pList-
1e8d0 3e 6e 53 72 63 20 3d 20 30 3b 0a 20 20 7d 0a 20  >nSrc = 0;.  }. 
1e8e0 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33   pList = sqlite3
1e8f0 53 72 63 4c 69 73 74 45 6e 6c 61 72 67 65 28 64  SrcListEnlarge(d
1e900 62 2c 20 70 4c 69 73 74 2c 20 31 2c 20 70 4c 69  b, pList, 1, pLi
1e910 73 74 2d 3e 6e 53 72 63 29 3b 0a 20 20 69 66 28  st->nSrc);.  if(
1e920 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
1e930 64 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  d ){.    sqlite3
1e940 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28 64 62  SrcListDelete(db
1e950 2c 20 70 4c 69 73 74 29 3b 0a 20 20 20 20 72 65  , pList);.    re
1e960 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 49  turn 0;.  }.  pI
1e970 74 65 6d 20 3d 20 26 70 4c 69 73 74 2d 3e 61 5b  tem = &pList->a[
1e980 70 4c 69 73 74 2d 3e 6e 53 72 63 2d 31 5d 3b 0a  pList->nSrc-1];.
1e990 20 20 69 66 28 20 70 44 61 74 61 62 61 73 65 20    if( pDatabase 
1e9a0 26 26 20 70 44 61 74 61 62 61 73 65 2d 3e 7a 3d  && pDatabase->z=
1e9b0 3d 30 20 29 7b 0a 20 20 20 20 70 44 61 74 61 62  =0 ){.    pDatab
1e9c0 61 73 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69  ase = 0;.  }.  i
1e9d0 66 28 20 70 44 61 74 61 62 61 73 65 20 29 7b 0a  f( pDatabase ){.
1e9e0 20 20 20 20 54 6f 6b 65 6e 20 2a 70 54 65 6d 70      Token *pTemp
1e9f0 20 3d 20 70 44 61 74 61 62 61 73 65 3b 0a 20 20   = pDatabase;.  
1ea00 20 20 70 44 61 74 61 62 61 73 65 20 3d 20 70 54    pDatabase = pT
1ea10 61 62 6c 65 3b 0a 20 20 20 20 70 54 61 62 6c 65  able;.    pTable
1ea20 20 3d 20 70 54 65 6d 70 3b 0a 20 20 7d 0a 20 20   = pTemp;.  }.  
1ea30 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73  pItem->zName = s
1ea40 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f  qlite3NameFromTo
1ea50 6b 65 6e 28 64 62 2c 20 70 54 61 62 6c 65 29 3b  ken(db, pTable);
1ea60 0a 20 20 70 49 74 65 6d 2d 3e 7a 44 61 74 61 62  .  pItem->zDatab
1ea70 61 73 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d  ase = sqlite3Nam
1ea80 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70  eFromToken(db, p
1ea90 44 61 74 61 62 61 73 65 29 3b 0a 20 20 72 65 74  Database);.  ret
1eaa0 75 72 6e 20 70 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a  urn pList;.}../*
1eab0 0a 2a 2a 20 41 73 73 69 67 6e 20 56 64 62 65 43  .** Assign VdbeC
1eac0 75 72 73 6f 72 20 69 6e 64 65 78 20 6e 75 6d 62  ursor index numb
1ead0 65 72 73 20 74 6f 20 61 6c 6c 20 74 61 62 6c 65  ers to all table
1eae0 73 20 69 6e 20 61 20 53 72 63 4c 69 73 74 0a 2a  s in a SrcList.*
1eaf0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53 72  /.void sqlite3Sr
1eb00 63 4c 69 73 74 41 73 73 69 67 6e 43 75 72 73 6f  cListAssignCurso
1eb10 72 73 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  rs(Parse *pParse
1eb20 2c 20 53 72 63 4c 69 73 74 20 2a 70 4c 69 73 74  , SrcList *pList
1eb30 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74  ){.  int i;.  st
1eb40 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
1eb50 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 61 73 73 65  m *pItem;.  asse
1eb60 72 74 28 70 4c 69 73 74 20 7c 7c 20 70 50 61 72  rt(pList || pPar
1eb70 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  se->db->mallocFa
1eb80 69 6c 65 64 20 29 3b 0a 20 20 69 66 28 20 70 4c  iled );.  if( pL
1eb90 69 73 74 20 29 7b 0a 20 20 20 20 66 6f 72 28 69  ist ){.    for(i
1eba0 3d 30 2c 20 70 49 74 65 6d 3d 70 4c 69 73 74 2d  =0, pItem=pList-
1ebb0 3e 61 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 53 72  >a; i<pList->nSr
1ebc0 63 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29  c; i++, pItem++)
1ebd0 7b 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65  {.      if( pIte
1ebe0 6d 2d 3e 69 43 75 72 73 6f 72 3e 3d 30 20 29 20  m->iCursor>=0 ) 
1ebf0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 70 49 74  break;.      pIt
1ec00 65 6d 2d 3e 69 43 75 72 73 6f 72 20 3d 20 70 50  em->iCursor = pP
1ec10 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20  arse->nTab++;.  
1ec20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 70      if( pItem->p
1ec30 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20  Select ){.      
1ec40 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74    sqlite3SrcList
1ec50 41 73 73 69 67 6e 43 75 72 73 6f 72 73 28 70 50  AssignCursors(pP
1ec60 61 72 73 65 2c 20 70 49 74 65 6d 2d 3e 70 53 65  arse, pItem->pSe
1ec70 6c 65 63 74 2d 3e 70 53 72 63 29 3b 0a 20 20 20  lect->pSrc);.   
1ec80 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d     }.    }.  }.}
1ec90 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61  ../*.** Delete a
1eca0 6e 20 65 6e 74 69 72 65 20 53 72 63 4c 69 73 74  n entire SrcList
1ecb0 20 69 6e 63 6c 75 64 69 6e 67 20 61 6c 6c 20 69   including all i
1ecc0 74 73 20 73 75 62 73 74 72 75 63 74 75 72 65 2e  ts substructure.
1ecd0 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
1ece0 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28 73 71  SrcListDelete(sq
1ecf0 6c 69 74 65 33 20 2a 64 62 2c 20 53 72 63 4c 69  lite3 *db, SrcLi
1ed00 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e  st *pList){.  in
1ed10 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 53 72  t i;.  struct Sr
1ed20 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  cList_item *pIte
1ed30 6d 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d  m;.  if( pList==
1ed40 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f  0 ) return;.  fo
1ed50 72 28 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61  r(pItem=pList->a
1ed60 2c 20 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e  , i=0; i<pList->
1ed70 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 49 74 65 6d  nSrc; i++, pItem
1ed80 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ++){.    sqlite3
1ed90 44 62 46 72 65 65 28 64 62 2c 20 70 49 74 65 6d  DbFree(db, pItem
1eda0 2d 3e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20  ->zDatabase);.  
1edb0 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
1edc0 64 62 2c 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65  db, pItem->zName
1edd0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  );.    sqlite3Db
1ede0 46 72 65 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e  Free(db, pItem->
1edf0 7a 41 6c 69 61 73 29 3b 0a 20 20 20 20 69 66 28  zAlias);.    if(
1ee00 20 70 49 74 65 6d 2d 3e 66 67 2e 69 73 49 6e 64   pItem->fg.isInd
1ee10 65 78 65 64 42 79 20 29 20 73 71 6c 69 74 65 33  exedBy ) sqlite3
1ee20 44 62 46 72 65 65 28 64 62 2c 20 70 49 74 65 6d  DbFree(db, pItem
1ee30 2d 3e 75 31 2e 7a 49 6e 64 65 78 65 64 42 79 29  ->u1.zIndexedBy)
1ee40 3b 0a 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d  ;.    if( pItem-
1ee50 3e 66 67 2e 69 73 54 61 62 46 75 6e 63 20 29 20  >fg.isTabFunc ) 
1ee60 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
1ee70 65 6c 65 74 65 28 64 62 2c 20 70 49 74 65 6d 2d  elete(db, pItem-
1ee80 3e 75 31 2e 70 46 75 6e 63 41 72 67 29 3b 0a 20  >u1.pFuncArg);. 
1ee90 20 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65     sqlite3Delete
1eea0 54 61 62 6c 65 28 64 62 2c 20 70 49 74 65 6d 2d  Table(db, pItem-
1eeb0 3e 70 54 61 62 29 3b 0a 20 20 20 20 73 71 6c 69  >pTab);.    sqli
1eec0 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28  te3SelectDelete(
1eed0 64 62 2c 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65  db, pItem->pSele
1eee0 63 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ct);.    sqlite3
1eef0 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70  ExprDelete(db, p
1ef00 49 74 65 6d 2d 3e 70 4f 6e 29 3b 0a 20 20 20 20  Item->pOn);.    
1ef10 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44 65 6c  sqlite3IdListDel
1ef20 65 74 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 70  ete(db, pItem->p
1ef30 55 73 69 6e 67 29 3b 0a 20 20 7d 0a 20 20 73 71  Using);.  }.  sq
1ef40 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
1ef50 70 4c 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pList);.}../*.**
1ef60 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
1ef70 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20 70   called by the p
1ef80 61 72 73 65 72 20 74 6f 20 61 64 64 20 61 20 6e  arser to add a n
1ef90 65 77 20 74 65 72 6d 20 74 6f 20 74 68 65 0a 2a  ew term to the.*
1efa0 2a 20 65 6e 64 20 6f 66 20 61 20 67 72 6f 77 69  * end of a growi
1efb0 6e 67 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20  ng FROM clause. 
1efc0 20 54 68 65 20 22 70 22 20 70 61 72 61 6d 65 74   The "p" paramet
1efd0 65 72 20 69 73 20 74 68 65 20 70 61 72 74 20 6f  er is the part o
1efe0 66 0a 2a 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c  f.** the FROM cl
1eff0 61 75 73 65 20 74 68 61 74 20 68 61 73 20 61 6c  ause that has al
1f000 72 65 61 64 79 20 62 65 65 6e 20 63 6f 6e 73 74  ready been const
1f010 72 75 63 74 65 64 2e 20 20 22 70 22 20 69 73 20  ructed.  "p" is 
1f020 4e 55 4c 4c 0a 2a 2a 20 69 66 20 74 68 69 73 20  NULL.** if this 
1f030 69 73 20 74 68 65 20 66 69 72 73 74 20 74 65 72  is the first ter
1f040 6d 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c  m of the FROM cl
1f050 61 75 73 65 2e 20 20 70 54 61 62 6c 65 20 61 6e  ause.  pTable an
1f060 64 20 70 44 61 74 61 62 61 73 65 0a 2a 2a 20 61  d pDatabase.** a
1f070 72 65 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  re the name of t
1f080 68 65 20 74 61 62 6c 65 20 61 6e 64 20 64 61 74  he table and dat
1f090 61 62 61 73 65 20 6e 61 6d 65 64 20 69 6e 20 74  abase named in t
1f0a0 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74  he FROM clause t
1f0b0 65 72 6d 2e 0a 2a 2a 20 70 44 61 74 61 62 61 73  erm..** pDatabas
1f0c0 65 20 69 73 20 4e 55 4c 4c 20 69 66 20 74 68 65  e is NULL if the
1f0d0 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 20 71   database name q
1f0e0 75 61 6c 69 66 69 65 72 20 69 73 20 6d 69 73 73  ualifier is miss
1f0f0 69 6e 67 20 2d 20 74 68 65 0a 2a 2a 20 75 73 75  ing - the.** usu
1f100 61 6c 20 63 61 73 65 2e 20 20 49 66 20 74 68 65  al case.  If the
1f110 20 74 65 72 6d 20 68 61 73 20 61 6e 20 61 6c 69   term has an ali
1f120 61 73 2c 20 74 68 65 6e 20 70 41 6c 69 61 73 20  as, then pAlias 
1f130 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 0a 2a 2a  points to the.**
1f140 20 61 6c 69 61 73 20 74 6f 6b 65 6e 2e 20 20 49   alias token.  I
1f150 66 20 74 68 65 20 74 65 72 6d 20 69 73 20 61 20  f the term is a 
1f160 73 75 62 71 75 65 72 79 2c 20 74 68 65 6e 20 70  subquery, then p
1f170 53 75 62 71 75 65 72 79 20 69 73 20 74 68 65 0a  Subquery is the.
1f180 2a 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  ** SELECT statem
1f190 65 6e 74 20 74 68 61 74 20 74 68 65 20 73 75 62  ent that the sub
1f1a0 71 75 65 72 79 20 65 6e 63 6f 64 65 73 2e 20 20  query encodes.  
1f1b0 54 68 65 20 70 54 61 62 6c 65 20 61 6e 64 0a 2a  The pTable and.*
1f1c0 2a 20 70 44 61 74 61 62 61 73 65 20 70 61 72 61  * pDatabase para
1f1d0 6d 65 74 65 72 73 20 61 72 65 20 4e 55 4c 4c 20  meters are NULL 
1f1e0 66 6f 72 20 73 75 62 71 75 65 72 69 65 73 2e 20  for subqueries. 
1f1f0 20 54 68 65 20 70 4f 6e 20 61 6e 64 20 70 55 73   The pOn and pUs
1f200 69 6e 67 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72  ing.** parameter
1f210 73 20 61 72 65 20 74 68 65 20 63 6f 6e 74 65 6e  s are the conten
1f220 74 20 6f 66 20 74 68 65 20 4f 4e 20 61 6e 64 20  t of the ON and 
1f230 55 53 49 4e 47 20 63 6c 61 75 73 65 73 2e 0a 2a  USING clauses..*
1f240 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 6e 65  *.** Return a ne
1f250 77 20 53 72 63 4c 69 73 74 20 77 68 69 63 68 20  w SrcList which 
1f260 65 6e 63 6f 64 65 73 20 69 73 20 74 68 65 20 46  encodes is the F
1f270 52 4f 4d 20 77 69 74 68 20 74 68 65 20 6e 65 77  ROM with the new
1f280 0a 2a 2a 20 74 65 72 6d 20 61 64 64 65 64 2e 0a  .** term added..
1f290 2a 2f 0a 53 72 63 4c 69 73 74 20 2a 73 71 6c 69  */.SrcList *sqli
1f2a0 74 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64  te3SrcListAppend
1f2b0 46 72 6f 6d 54 65 72 6d 28 0a 20 20 50 61 72 73  FromTerm(.  Pars
1f2c0 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
1f2d0 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
1f2e0 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72 63 4c  ontext */.  SrcL
1f2f0 69 73 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20  ist *p,         
1f300 20 20 20 20 2f 2a 20 54 68 65 20 6c 65 66 74 20      /* The left 
1f310 70 61 72 74 20 6f 66 20 74 68 65 20 46 52 4f 4d  part of the FROM
1f320 20 63 6c 61 75 73 65 20 61 6c 72 65 61 64 79 20   clause already 
1f330 73 65 65 6e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  seen */.  Token 
1f340 2a 70 54 61 62 6c 65 2c 20 20 20 20 20 20 20 20  *pTable,        
1f350 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
1f360 20 74 61 62 6c 65 20 74 6f 20 61 64 64 20 74 6f   table to add to
1f370 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
1f380 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 44 61   */.  Token *pDa
1f390 74 61 62 61 73 65 2c 20 20 20 20 20 20 20 2f 2a  tabase,       /*
1f3a0 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74   Name of the dat
1f3b0 61 62 61 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67  abase containing
1f3c0 20 70 54 61 62 6c 65 20 2a 2f 0a 20 20 54 6f 6b   pTable */.  Tok
1f3d0 65 6e 20 2a 70 41 6c 69 61 73 2c 20 20 20 20 20  en *pAlias,     
1f3e0 20 20 20 20 20 2f 2a 20 54 68 65 20 72 69 67 68       /* The righ
1f3f0 74 2d 68 61 6e 64 20 73 69 64 65 20 6f 66 20 74  t-hand side of t
1f400 68 65 20 41 53 20 73 75 62 65 78 70 72 65 73 73  he AS subexpress
1f410 69 6f 6e 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ion */.  Select 
1f420 2a 70 53 75 62 71 75 65 72 79 2c 20 20 20 20 20  *pSubquery,     
1f430 20 2f 2a 20 41 20 73 75 62 71 75 65 72 79 20 75   /* A subquery u
1f440 73 65 64 20 69 6e 20 70 6c 61 63 65 20 6f 66 20  sed in place of 
1f450 61 20 74 61 62 6c 65 20 6e 61 6d 65 20 2a 2f 0a  a table name */.
1f460 20 20 45 78 70 72 20 2a 70 4f 6e 2c 20 20 20 20    Expr *pOn,    
1f470 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1f480 20 4f 4e 20 63 6c 61 75 73 65 20 6f 66 20 61 20   ON clause of a 
1f490 6a 6f 69 6e 20 2a 2f 0a 20 20 49 64 4c 69 73 74  join */.  IdList
1f4a0 20 2a 70 55 73 69 6e 67 20 20 20 20 20 20 20 20   *pUsing        
1f4b0 20 20 2f 2a 20 54 68 65 20 55 53 49 4e 47 20 63    /* The USING c
1f4c0 6c 61 75 73 65 20 6f 66 20 61 20 6a 6f 69 6e 20  lause of a join 
1f4d0 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 53  */.){.  struct S
1f4e0 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  rcList_item *pIt
1f4f0 65 6d 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  em;.  sqlite3 *d
1f500 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
1f510 20 20 69 66 28 20 21 70 20 26 26 20 28 70 4f 6e    if( !p && (pOn
1f520 20 7c 7c 20 70 55 73 69 6e 67 29 20 29 7b 0a 20   || pUsing) ){. 
1f530 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
1f540 73 67 28 70 50 61 72 73 65 2c 20 22 61 20 4a 4f  sg(pParse, "a JO
1f550 49 4e 20 63 6c 61 75 73 65 20 69 73 20 72 65 71  IN clause is req
1f560 75 69 72 65 64 20 62 65 66 6f 72 65 20 25 73 22  uired before %s"
1f570 2c 20 0a 20 20 20 20 20 20 28 70 4f 6e 20 3f 20  , .      (pOn ? 
1f580 22 4f 4e 22 20 3a 20 22 55 53 49 4e 47 22 29 0a  "ON" : "USING").
1f590 20 20 20 20 29 3b 0a 20 20 20 20 67 6f 74 6f 20      );.    goto 
1f5a0 61 70 70 65 6e 64 5f 66 72 6f 6d 5f 65 72 72 6f  append_from_erro
1f5b0 72 3b 0a 20 20 7d 0a 20 20 70 20 3d 20 73 71 6c  r;.  }.  p = sql
1f5c0 69 74 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e  ite3SrcListAppen
1f5d0 64 28 64 62 2c 20 70 2c 20 70 54 61 62 6c 65 2c  d(db, p, pTable,
1f5e0 20 70 44 61 74 61 62 61 73 65 29 3b 0a 20 20 69   pDatabase);.  i
1f5f0 66 28 20 70 3d 3d 30 20 7c 7c 20 4e 45 56 45 52  f( p==0 || NEVER
1f600 28 70 2d 3e 6e 53 72 63 3d 3d 30 29 20 29 7b 0a  (p->nSrc==0) ){.
1f610 20 20 20 20 67 6f 74 6f 20 61 70 70 65 6e 64 5f      goto append_
1f620 66 72 6f 6d 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a  from_error;.  }.
1f630 20 20 70 49 74 65 6d 20 3d 20 26 70 2d 3e 61 5b    pItem = &p->a[
1f640 70 2d 3e 6e 53 72 63 2d 31 5d 3b 0a 20 20 61 73  p->nSrc-1];.  as
1f650 73 65 72 74 28 20 70 41 6c 69 61 73 21 3d 30 20  sert( pAlias!=0 
1f660 29 3b 0a 20 20 69 66 28 20 70 41 6c 69 61 73 2d  );.  if( pAlias-
1f670 3e 6e 20 29 7b 0a 20 20 20 20 70 49 74 65 6d 2d  >n ){.    pItem-
1f680 3e 7a 41 6c 69 61 73 20 3d 20 73 71 6c 69 74 65  >zAlias = sqlite
1f690 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64  3NameFromToken(d
1f6a0 62 2c 20 70 41 6c 69 61 73 29 3b 0a 20 20 7d 0a  b, pAlias);.  }.
1f6b0 20 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74    pItem->pSelect
1f6c0 20 3d 20 70 53 75 62 71 75 65 72 79 3b 0a 20 20   = pSubquery;.  
1f6d0 70 49 74 65 6d 2d 3e 70 4f 6e 20 3d 20 70 4f 6e  pItem->pOn = pOn
1f6e0 3b 0a 20 20 70 49 74 65 6d 2d 3e 70 55 73 69 6e  ;.  pItem->pUsin
1f6f0 67 20 3d 20 70 55 73 69 6e 67 3b 0a 20 20 72 65  g = pUsing;.  re
1f700 74 75 72 6e 20 70 3b 0a 0a 20 61 70 70 65 6e 64  turn p;.. append
1f710 5f 66 72 6f 6d 5f 65 72 72 6f 72 3a 0a 20 20 61  _from_error:.  a
1f720 73 73 65 72 74 28 20 70 3d 3d 30 20 29 3b 0a 20  ssert( p==0 );. 
1f730 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
1f740 74 65 28 64 62 2c 20 70 4f 6e 29 3b 0a 20 20 73  te(db, pOn);.  s
1f750 71 6c 69 74 65 33 49 64 4c 69 73 74 44 65 6c 65  qlite3IdListDele
1f760 74 65 28 64 62 2c 20 70 55 73 69 6e 67 29 3b 0a  te(db, pUsing);.
1f770 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44    sqlite3SelectD
1f780 65 6c 65 74 65 28 64 62 2c 20 70 53 75 62 71 75  elete(db, pSubqu
1f790 65 72 79 29 3b 0a 20 20 72 65 74 75 72 6e 20 30  ery);.  return 0
1f7a0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61  ;.}../*.** Add a
1f7b0 6e 20 49 4e 44 45 58 45 44 20 42 59 20 6f 72 20  n INDEXED BY or 
1f7c0 4e 4f 54 20 49 4e 44 45 58 45 44 20 63 6c 61 75  NOT INDEXED clau
1f7d0 73 65 20 74 6f 20 74 68 65 20 6d 6f 73 74 20 72  se to the most r
1f7e0 65 63 65 6e 74 6c 79 20 61 64 64 65 64 20 0a 2a  ecently added .*
1f7f0 2a 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65  * element of the
1f800 20 73 6f 75 72 63 65 2d 6c 69 73 74 20 70 61 73   source-list pas
1f810 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e  sed as the secon
1f820 64 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 76  d argument..*/.v
1f830 6f 69 64 20 73 71 6c 69 74 65 33 53 72 63 4c 69  oid sqlite3SrcLi
1f840 73 74 49 6e 64 65 78 65 64 42 79 28 50 61 72 73  stIndexedBy(Pars
1f850 65 20 2a 70 50 61 72 73 65 2c 20 53 72 63 4c 69  e *pParse, SrcLi
1f860 73 74 20 2a 70 2c 20 54 6f 6b 65 6e 20 2a 70 49  st *p, Token *pI
1f870 6e 64 65 78 65 64 42 79 29 7b 0a 20 20 61 73 73  ndexedBy){.  ass
1f880 65 72 74 28 20 70 49 6e 64 65 78 65 64 42 79 21  ert( pIndexedBy!
1f890 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 20 26 26  =0 );.  if( p &&
1f8a0 20 41 4c 57 41 59 53 28 70 2d 3e 6e 53 72 63 3e   ALWAYS(p->nSrc>
1f8b0 30 29 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74  0) ){.    struct
1f8c0 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
1f8d0 49 74 65 6d 20 3d 20 26 70 2d 3e 61 5b 70 2d 3e  Item = &p->a[p->
1f8e0 6e 53 72 63 2d 31 5d 3b 0a 20 20 20 20 61 73 73  nSrc-1];.    ass
1f8f0 65 72 74 28 20 70 49 74 65 6d 2d 3e 66 67 2e 6e  ert( pItem->fg.n
1f900 6f 74 49 6e 64 65 78 65 64 3d 3d 30 20 29 3b 0a  otIndexed==0 );.
1f910 20 20 20 20 61 73 73 65 72 74 28 20 70 49 74 65      assert( pIte
1f920 6d 2d 3e 66 67 2e 69 73 49 6e 64 65 78 65 64 42  m->fg.isIndexedB
1f930 79 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  y==0 );.    asse
1f940 72 74 28 20 70 49 74 65 6d 2d 3e 66 67 2e 69 73  rt( pItem->fg.is
1f950 54 61 62 46 75 6e 63 3d 3d 30 20 29 3b 0a 20 20  TabFunc==0 );.  
1f960 20 20 69 66 28 20 70 49 6e 64 65 78 65 64 42 79    if( pIndexedBy
1f970 2d 3e 6e 3d 3d 31 20 26 26 20 21 70 49 6e 64 65  ->n==1 && !pInde
1f980 78 65 64 42 79 2d 3e 7a 20 29 7b 0a 20 20 20 20  xedBy->z ){.    
1f990 20 20 2f 2a 20 41 20 22 4e 4f 54 20 49 4e 44 45    /* A "NOT INDE
1f9a0 58 45 44 22 20 63 6c 61 75 73 65 20 77 61 73 20  XED" clause was 
1f9b0 73 75 70 70 6c 69 65 64 2e 20 53 65 65 20 70 61  supplied. See pa
1f9c0 72 73 65 2e 79 20 0a 20 20 20 20 20 20 2a 2a 20  rse.y .      ** 
1f9d0 63 6f 6e 73 74 72 75 63 74 20 22 69 6e 64 65 78  construct "index
1f9e0 65 64 5f 6f 70 74 22 20 66 6f 72 20 64 65 74 61  ed_opt" for deta
1f9f0 69 6c 73 2e 20 2a 2f 0a 20 20 20 20 20 20 70 49  ils. */.      pI
1fa00 74 65 6d 2d 3e 66 67 2e 6e 6f 74 49 6e 64 65 78  tem->fg.notIndex
1fa10 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73  ed = 1;.    }els
1fa20 65 7b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e  e{.      pItem->
1fa30 75 31 2e 7a 49 6e 64 65 78 65 64 42 79 20 3d 20  u1.zIndexedBy = 
1fa40 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54  sqlite3NameFromT
1fa50 6f 6b 65 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c  oken(pParse->db,
1fa60 20 70 49 6e 64 65 78 65 64 42 79 29 3b 0a 20 20   pIndexedBy);.  
1fa70 20 20 20 20 70 49 74 65 6d 2d 3e 66 67 2e 69 73      pItem->fg.is
1fa80 49 6e 64 65 78 65 64 42 79 20 3d 20 28 70 49 74  IndexedBy = (pIt
1fa90 65 6d 2d 3e 75 31 2e 7a 49 6e 64 65 78 65 64 42  em->u1.zIndexedB
1faa0 79 21 3d 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  y!=0);.    }.  }
1fab0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 74 68  .}../*.** Add th
1fac0 65 20 6c 69 73 74 20 6f 66 20 66 75 6e 63 74 69  e list of functi
1fad0 6f 6e 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 20  on arguments to 
1fae0 74 68 65 20 53 72 63 4c 69 73 74 20 65 6e 74 72  the SrcList entr
1faf0 79 20 66 6f 72 20 61 0a 2a 2a 20 74 61 62 6c 65  y for a.** table
1fb00 2d 76 61 6c 75 65 64 2d 66 75 6e 63 74 69 6f 6e  -valued-function
1fb10 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
1fb20 33 53 72 63 4c 69 73 74 46 75 6e 63 41 72 67 73  3SrcListFuncArgs
1fb30 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
1fb40 53 72 63 4c 69 73 74 20 2a 70 2c 20 45 78 70 72  SrcList *p, Expr
1fb50 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20  List *pList){.  
1fb60 69 66 28 20 70 20 29 7b 0a 20 20 20 20 73 74 72  if( p ){.    str
1fb70 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
1fb80 20 2a 70 49 74 65 6d 20 3d 20 26 70 2d 3e 61 5b   *pItem = &p->a[
1fb90 70 2d 3e 6e 53 72 63 2d 31 5d 3b 0a 20 20 20 20  p->nSrc-1];.    
1fba0 61 73 73 65 72 74 28 20 70 49 74 65 6d 2d 3e 66  assert( pItem->f
1fbb0 67 2e 6e 6f 74 49 6e 64 65 78 65 64 3d 3d 30 20  g.notIndexed==0 
1fbc0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
1fbd0 49 74 65 6d 2d 3e 66 67 2e 69 73 49 6e 64 65 78  Item->fg.isIndex
1fbe0 65 64 42 79 3d 3d 30 20 29 3b 0a 20 20 20 20 61  edBy==0 );.    a
1fbf0 73 73 65 72 74 28 20 70 49 74 65 6d 2d 3e 66 67  ssert( pItem->fg
1fc00 2e 69 73 54 61 62 46 75 6e 63 3d 3d 30 20 29 3b  .isTabFunc==0 );
1fc10 0a 20 20 20 20 70 49 74 65 6d 2d 3e 75 31 2e 70  .    pItem->u1.p
1fc20 46 75 6e 63 41 72 67 20 3d 20 70 4c 69 73 74 3b  FuncArg = pList;
1fc30 0a 20 20 20 20 70 49 74 65 6d 2d 3e 66 67 2e 69  .    pItem->fg.i
1fc40 73 54 61 62 46 75 6e 63 20 3d 20 31 3b 0a 20 20  sTabFunc = 1;.  
1fc50 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74  }else{.    sqlit
1fc60 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65  e3ExprListDelete
1fc70 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 4c 69  (pParse->db, pLi
1fc80 73 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  st);.  }.}../*.*
1fc90 2a 20 57 68 65 6e 20 62 75 69 6c 64 69 6e 67 20  * When building 
1fca0 75 70 20 61 20 46 52 4f 4d 20 63 6c 61 75 73 65  up a FROM clause
1fcb0 20 69 6e 20 74 68 65 20 70 61 72 73 65 72 2c 20   in the parser, 
1fcc0 74 68 65 20 6a 6f 69 6e 20 6f 70 65 72 61 74 6f  the join operato
1fcd0 72 0a 2a 2a 20 69 73 20 69 6e 69 74 69 61 6c 6c  r.** is initiall
1fce0 79 20 61 74 74 61 63 68 65 64 20 74 6f 20 74 68  y attached to th
1fcf0 65 20 6c 65 66 74 20 6f 70 65 72 61 6e 64 2e 20  e left operand. 
1fd00 20 42 75 74 20 74 68 65 20 63 6f 64 65 20 67 65   But the code ge
1fd10 6e 65 72 61 74 6f 72 0a 2a 2a 20 65 78 70 65 63  nerator.** expec
1fd20 74 73 20 74 68 65 20 6a 6f 69 6e 20 6f 70 65 72  ts the join oper
1fd30 61 74 6f 72 20 74 6f 20 62 65 20 6f 6e 20 74 68  ator to be on th
1fd40 65 20 72 69 67 68 74 20 6f 70 65 72 61 6e 64 2e  e right operand.
1fd50 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a    This routine.*
1fd60 2a 20 53 68 69 66 74 73 20 61 6c 6c 20 6a 6f 69  * Shifts all joi
1fd70 6e 20 6f 70 65 72 61 74 6f 72 73 20 66 72 6f 6d  n operators from
1fd80 20 6c 65 66 74 20 74 6f 20 72 69 67 68 74 20 66   left to right f
1fd90 6f 72 20 61 6e 20 65 6e 74 69 72 65 20 46 52 4f  or an entire FRO
1fda0 4d 0a 2a 2a 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a  M.** clause..**.
1fdb0 2a 2a 20 45 78 61 6d 70 6c 65 3a 20 53 75 70 70  ** Example: Supp
1fdc0 6f 73 65 20 74 68 65 20 6a 6f 69 6e 20 69 73 20  ose the join is 
1fdd0 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a  like this:.**.**
1fde0 20 20 20 20 20 20 20 20 20 20 20 41 20 6e 61 74             A nat
1fdf0 75 72 61 6c 20 63 72 6f 73 73 20 6a 6f 69 6e 20  ural cross join 
1fe00 42 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 70 65 72  B.**.** The oper
1fe10 61 74 6f 72 20 69 73 20 22 6e 61 74 75 72 61 6c  ator is "natural
1fe20 20 63 72 6f 73 73 20 6a 6f 69 6e 22 2e 20 20 54   cross join".  T
1fe30 68 65 20 41 20 61 6e 64 20 42 20 6f 70 65 72 61  he A and B opera
1fe40 6e 64 73 20 61 72 65 20 73 74 6f 72 65 64 0a 2a  nds are stored.*
1fe50 2a 20 69 6e 20 70 2d 3e 61 5b 30 5d 20 61 6e 64  * in p->a[0] and
1fe60 20 70 2d 3e 61 5b 31 5d 2c 20 72 65 73 70 65 63   p->a[1], respec
1fe70 74 69 76 65 6c 79 2e 20 20 54 68 65 20 70 61 72  tively.  The par
1fe80 73 65 72 20 69 6e 69 74 69 61 6c 6c 79 20 73 74  ser initially st
1fe90 6f 72 65 73 20 74 68 65 0a 2a 2a 20 6f 70 65 72  ores the.** oper
1fea0 61 74 6f 72 20 77 69 74 68 20 41 2e 20 20 54 68  ator with A.  Th
1feb0 69 73 20 72 6f 75 74 69 6e 65 20 73 68 69 66 74  is routine shift
1fec0 73 20 74 68 61 74 20 6f 70 65 72 61 74 6f 72 20  s that operator 
1fed0 6f 76 65 72 20 74 6f 20 42 2e 0a 2a 2f 0a 76 6f  over to B..*/.vo
1fee0 69 64 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73  id sqlite3SrcLis
1fef0 74 53 68 69 66 74 4a 6f 69 6e 54 79 70 65 28 53  tShiftJoinType(S
1ff00 72 63 4c 69 73 74 20 2a 70 29 7b 0a 20 20 69 66  rcList *p){.  if
1ff10 28 20 70 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  ( p ){.    int i
1ff20 3b 0a 20 20 20 20 66 6f 72 28 69 3d 70 2d 3e 6e  ;.    for(i=p->n
1ff30 53 72 63 2d 31 3b 20 69 3e 30 3b 20 69 2d 2d 29  Src-1; i>0; i--)
1ff40 7b 0a 20 20 20 20 20 20 70 2d 3e 61 5b 69 5d 2e  {.      p->a[i].
1ff50 66 67 2e 6a 6f 69 6e 74 79 70 65 20 3d 20 70 2d  fg.jointype = p-
1ff60 3e 61 5b 69 2d 31 5d 2e 66 67 2e 6a 6f 69 6e 74  >a[i-1].fg.joint
1ff70 79 70 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  ype;.    }.    p
1ff80 2d 3e 61 5b 30 5d 2e 66 67 2e 6a 6f 69 6e 74 79  ->a[0].fg.jointy
1ff90 70 65 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f  pe = 0;.  }.}../
1ffa0 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 56 44  *.** Generate VD
1ffb0 42 45 20 63 6f 64 65 20 66 6f 72 20 61 20 42 45  BE code for a BE
1ffc0 47 49 4e 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a  GIN statement..*
1ffd0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42 65  /.void sqlite3Be
1ffe0 67 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 28 50  ginTransaction(P
1fff0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e  arse *pParse, in
20000 74 20 74 79 70 65 29 7b 0a 20 20 73 71 6c 69 74  t type){.  sqlit
20010 65 33 20 2a 64 62 3b 0a 20 20 56 64 62 65 20 2a  e3 *db;.  Vdbe *
20020 76 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 61  v;.  int i;..  a
20030 73 73 65 72 74 28 20 70 50 61 72 73 65 21 3d 30  ssert( pParse!=0
20040 20 29 3b 0a 20 20 64 62 20 3d 20 70 50 61 72 73   );.  db = pPars
20050 65 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72 74 28  e->db;.  assert(
20060 20 64 62 21 3d 30 20 29 3b 0a 20 20 69 66 28 20   db!=0 );.  if( 
20070 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b  sqlite3AuthCheck
20080 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f  (pParse, SQLITE_
20090 54 52 41 4e 53 41 43 54 49 4f 4e 2c 20 22 42 45  TRANSACTION, "BE
200a0 47 49 4e 22 2c 20 30 2c 20 30 29 20 29 7b 0a 20  GIN", 0, 0) ){. 
200b0 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
200c0 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56   v = sqlite3GetV
200d0 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69  dbe(pParse);.  i
200e0 66 28 20 21 76 20 29 20 72 65 74 75 72 6e 3b 0a  f( !v ) return;.
200f0 20 20 69 66 28 20 74 79 70 65 21 3d 54 4b 5f 44    if( type!=TK_D
20100 45 46 45 52 52 45 44 20 29 7b 0a 20 20 20 20 66  EFERRED ){.    f
20110 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44  or(i=0; i<db->nD
20120 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73  b; i++){.      s
20130 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
20140 28 76 2c 20 4f 50 5f 54 72 61 6e 73 61 63 74 69  (v, OP_Transacti
20150 6f 6e 2c 20 69 2c 20 28 74 79 70 65 3d 3d 54 4b  on, i, (type==TK
20160 5f 45 58 43 4c 55 53 49 56 45 29 2b 31 29 3b 0a  _EXCLUSIVE)+1);.
20170 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
20180 65 55 73 65 73 42 74 72 65 65 28 76 2c 20 69 29  eUsesBtree(v, i)
20190 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71  ;.    }.  }.  sq
201a0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 28  lite3VdbeAddOp0(
201b0 76 2c 20 4f 50 5f 41 75 74 6f 43 6f 6d 6d 69 74  v, OP_AutoCommit
201c0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  );.}../*.** Gene
201d0 72 61 74 65 20 56 44 42 45 20 63 6f 64 65 20 66  rate VDBE code f
201e0 6f 72 20 61 20 43 4f 4d 4d 49 54 20 73 74 61 74  or a COMMIT stat
201f0 65 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ement..*/.void s
20200 71 6c 69 74 65 33 43 6f 6d 6d 69 74 54 72 61 6e  qlite3CommitTran
20210 73 61 63 74 69 6f 6e 28 50 61 72 73 65 20 2a 70  saction(Parse *p
20220 50 61 72 73 65 29 7b 0a 20 20 56 64 62 65 20 2a  Parse){.  Vdbe *
20230 76 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  v;..  assert( pP
20240 61 72 73 65 21 3d 30 20 29 3b 0a 20 20 61 73 73  arse!=0 );.  ass
20250 65 72 74 28 20 70 50 61 72 73 65 2d 3e 64 62 21  ert( pParse->db!
20260 3d 30 20 29 3b 0a 20 20 69 66 28 20 73 71 6c 69  =0 );.  if( sqli
20270 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61  te3AuthCheck(pPa
20280 72 73 65 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e  rse, SQLITE_TRAN
20290 53 41 43 54 49 4f 4e 2c 20 22 43 4f 4d 4d 49 54  SACTION, "COMMIT
202a0 22 2c 20 30 2c 20 30 29 20 29 7b 0a 20 20 20 20  ", 0, 0) ){.    
202b0 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 76 20  return;.  }.  v 
202c0 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
202d0 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20  (pParse);.  if( 
202e0 76 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  v ){.    sqlite3
202f0 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
20300 5f 41 75 74 6f 43 6f 6d 6d 69 74 2c 20 31 29 3b  _AutoCommit, 1);
20310 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  .  }.}../*.** Ge
20320 6e 65 72 61 74 65 20 56 44 42 45 20 63 6f 64 65  nerate VDBE code
20330 20 66 6f 72 20 61 20 52 4f 4c 4c 42 41 43 4b 20   for a ROLLBACK 
20340 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f  statement..*/.vo
20350 69 64 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61  id sqlite3Rollba
20360 63 6b 54 72 61 6e 73 61 63 74 69 6f 6e 28 50 61  ckTransaction(Pa
20370 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20  rse *pParse){.  
20380 56 64 62 65 20 2a 76 3b 0a 0a 20 20 61 73 73 65  Vdbe *v;..  asse
20390 72 74 28 20 70 50 61 72 73 65 21 3d 30 20 29 3b  rt( pParse!=0 );
203a0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73  .  assert( pPars
203b0 65 2d 3e 64 62 21 3d 30 20 29 3b 0a 20 20 69 66  e->db!=0 );.  if
203c0 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65  ( sqlite3AuthChe
203d0 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54  ck(pParse, SQLIT
203e0 45 5f 54 52 41 4e 53 41 43 54 49 4f 4e 2c 20 22  E_TRANSACTION, "
203f0 52 4f 4c 4c 42 41 43 4b 22 2c 20 30 2c 20 30 29  ROLLBACK", 0, 0)
20400 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a   ){.    return;.
20410 20 20 7d 0a 20 20 76 20 3d 20 73 71 6c 69 74 65    }.  v = sqlite
20420 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
20430 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20  ;.  if( v ){.   
20440 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
20450 70 32 28 76 2c 20 4f 50 5f 41 75 74 6f 43 6f 6d  p2(v, OP_AutoCom
20460 6d 69 74 2c 20 31 2c 20 31 29 3b 0a 20 20 7d 0a  mit, 1, 1);.  }.
20470 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
20480 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
20490 20 62 79 20 74 68 65 20 70 61 72 73 65 72 20 77   by the parser w
204a0 68 65 6e 20 69 74 20 70 61 72 73 65 73 20 61 20  hen it parses a 
204b0 63 6f 6d 6d 61 6e 64 20 74 6f 20 63 72 65 61 74  command to creat
204c0 65 2c 0a 2a 2a 20 72 65 6c 65 61 73 65 20 6f 72  e,.** release or
204d0 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 20 53 51 4c   rollback an SQL
204e0 20 73 61 76 65 70 6f 69 6e 74 2e 20 0a 2a 2f 0a   savepoint. .*/.
204f0 76 6f 69 64 20 73 71 6c 69 74 65 33 53 61 76 65  void sqlite3Save
20500 70 6f 69 6e 74 28 50 61 72 73 65 20 2a 70 50 61  point(Parse *pPa
20510 72 73 65 2c 20 69 6e 74 20 6f 70 2c 20 54 6f 6b  rse, int op, Tok
20520 65 6e 20 2a 70 4e 61 6d 65 29 7b 0a 20 20 63 68  en *pName){.  ch
20530 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 73 71 6c 69  ar *zName = sqli
20540 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e  te3NameFromToken
20550 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 4e 61  (pParse->db, pNa
20560 6d 65 29 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65  me);.  if( zName
20570 20 29 7b 0a 20 20 20 20 56 64 62 65 20 2a 76 20   ){.    Vdbe *v 
20580 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
20590 28 70 50 61 72 73 65 29 3b 0a 23 69 66 6e 64 65  (pParse);.#ifnde
205a0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
205b0 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 20 20  THORIZATION.    
205c0 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
205d0 72 20 2a 20 63 6f 6e 73 74 20 61 7a 5b 5d 20 3d  r * const az[] =
205e0 20 7b 20 22 42 45 47 49 4e 22 2c 20 22 52 45 4c   { "BEGIN", "REL
205f0 45 41 53 45 22 2c 20 22 52 4f 4c 4c 42 41 43 4b  EASE", "ROLLBACK
20600 22 20 7d 3b 0a 20 20 20 20 61 73 73 65 72 74 28  " };.    assert(
20610 20 21 53 41 56 45 50 4f 49 4e 54 5f 42 45 47 49   !SAVEPOINT_BEGI
20620 4e 20 26 26 20 53 41 56 45 50 4f 49 4e 54 5f 52  N && SAVEPOINT_R
20630 45 4c 45 41 53 45 3d 3d 31 20 26 26 20 53 41 56  ELEASE==1 && SAV
20640 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 3d  EPOINT_ROLLBACK=
20650 3d 32 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  =2 );.#endif.   
20660 20 69 66 28 20 21 76 20 7c 7c 20 73 71 6c 69 74   if( !v || sqlit
20670 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72  e3AuthCheck(pPar
20680 73 65 2c 20 53 51 4c 49 54 45 5f 53 41 56 45 50  se, SQLITE_SAVEP
20690 4f 49 4e 54 2c 20 61 7a 5b 6f 70 5d 2c 20 7a 4e  OINT, az[op], zN
206a0 61 6d 65 2c 20 30 29 20 29 7b 0a 20 20 20 20 20  ame, 0) ){.     
206b0 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 70   sqlite3DbFree(p
206c0 50 61 72 73 65 2d 3e 64 62 2c 20 7a 4e 61 6d 65  Parse->db, zName
206d0 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b  );.      return;
206e0 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
206f0 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
20700 4f 50 5f 53 61 76 65 70 6f 69 6e 74 2c 20 6f 70  OP_Savepoint, op
20710 2c 20 30 2c 20 30 2c 20 7a 4e 61 6d 65 2c 20 50  , 0, 0, zName, P
20720 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 7d 0a  4_DYNAMIC);.  }.
20730 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75  }../*.** Make su
20740 72 65 20 74 68 65 20 54 45 4d 50 20 64 61 74 61  re the TEMP data
20750 62 61 73 65 20 69 73 20 6f 70 65 6e 20 61 6e 64  base is open and
20760 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 75   available for u
20770 73 65 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20 74  se.  Return.** t
20780 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72  he number of err
20790 6f 72 73 2e 20 20 4c 65 61 76 65 20 61 6e 79 20  ors.  Leave any 
207a0 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73 20 69  error messages i
207b0 6e 20 74 68 65 20 70 50 61 72 73 65 20 73 74 72  n the pParse str
207c0 75 63 74 75 72 65 2e 0a 2a 2f 0a 69 6e 74 20 73  ucture..*/.int s
207d0 71 6c 69 74 65 33 4f 70 65 6e 54 65 6d 70 44 61  qlite3OpenTempDa
207e0 74 61 62 61 73 65 28 50 61 72 73 65 20 2a 70 50  tabase(Parse *pP
207f0 61 72 73 65 29 7b 0a 20 20 73 71 6c 69 74 65 33  arse){.  sqlite3
20800 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
20810 62 3b 0a 20 20 69 66 28 20 64 62 2d 3e 61 44 62  b;.  if( db->aDb
20820 5b 31 5d 2e 70 42 74 3d 3d 30 20 26 26 20 21 70  [1].pBt==0 && !p
20830 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 20 29  Parse->explain )
20840 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20  {.    int rc;.  
20850 20 20 42 74 72 65 65 20 2a 70 42 74 3b 0a 20 20    Btree *pBt;.  
20860 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 69    static const i
20870 6e 74 20 66 6c 61 67 73 20 3d 20 0a 20 20 20 20  nt flags = .    
20880 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45        SQLITE_OPE
20890 4e 5f 52 45 41 44 57 52 49 54 45 20 7c 0a 20 20  N_READWRITE |.  
208a0 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f          SQLITE_O
208b0 50 45 4e 5f 43 52 45 41 54 45 20 7c 0a 20 20 20  PEN_CREATE |.   
208c0 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50         SQLITE_OP
208d0 45 4e 5f 45 58 43 4c 55 53 49 56 45 20 7c 0a 20  EN_EXCLUSIVE |. 
208e0 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
208f0 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f  OPEN_DELETEONCLO
20900 53 45 20 7c 0a 20 20 20 20 20 20 20 20 20 20 53  SE |.          S
20910 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f  QLITE_OPEN_TEMP_
20920 44 42 3b 0a 0a 20 20 20 20 72 63 20 3d 20 73 71  DB;..    rc = sq
20930 6c 69 74 65 33 42 74 72 65 65 4f 70 65 6e 28 64  lite3BtreeOpen(d
20940 62 2d 3e 70 56 66 73 2c 20 30 2c 20 64 62 2c 20  b->pVfs, 0, db, 
20950 26 70 42 74 2c 20 30 2c 20 66 6c 61 67 73 29 3b  &pBt, 0, flags);
20960 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
20970 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
20980 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
20990 70 50 61 72 73 65 2c 20 22 75 6e 61 62 6c 65 20  pParse, "unable 
209a0 74 6f 20 6f 70 65 6e 20 61 20 74 65 6d 70 6f 72  to open a tempor
209b0 61 72 79 20 64 61 74 61 62 61 73 65 20 22 0a 20  ary database ". 
209c0 20 20 20 20 20 20 20 22 66 69 6c 65 20 66 6f 72         "file for
209d0 20 73 74 6f 72 69 6e 67 20 74 65 6d 70 6f 72 61   storing tempora
209e0 72 79 20 74 61 62 6c 65 73 22 29 3b 0a 20 20 20  ry tables");.   
209f0 20 20 20 70 50 61 72 73 65 2d 3e 72 63 20 3d 20     pParse->rc = 
20a00 72 63 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  rc;.      return
20a10 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 62   1;.    }.    db
20a20 2d 3e 61 44 62 5b 31 5d 2e 70 42 74 20 3d 20 70  ->aDb[1].pBt = p
20a30 42 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  Bt;.    assert( 
20a40 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 53 63 68 65  db->aDb[1].pSche
20a50 6d 61 20 29 3b 0a 20 20 20 20 69 66 28 20 53 51  ma );.    if( SQ
20a60 4c 49 54 45 5f 4e 4f 4d 45 4d 3d 3d 73 71 6c 69  LITE_NOMEM==sqli
20a70 74 65 33 42 74 72 65 65 53 65 74 50 61 67 65 53  te3BtreeSetPageS
20a80 69 7a 65 28 70 42 74 2c 20 64 62 2d 3e 6e 65 78  ize(pBt, db->nex
20a90 74 50 61 67 65 73 69 7a 65 2c 20 2d 31 2c 20 30  tPagesize, -1, 0
20aa0 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ) ){.      sqlit
20ab0 65 33 4f 6f 6d 46 61 75 6c 74 28 64 62 29 3b 0a  e3OomFault(db);.
20ac0 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
20ad0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
20ae0 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  rn 0;.}../*.** R
20af0 65 63 6f 72 64 20 74 68 65 20 66 61 63 74 20 74  ecord the fact t
20b00 68 61 74 20 74 68 65 20 73 63 68 65 6d 61 20 63  hat the schema c
20b10 6f 6f 6b 69 65 20 77 69 6c 6c 20 6e 65 65 64 20  ookie will need 
20b20 74 6f 20 62 65 20 76 65 72 69 66 69 65 64 0a 2a  to be verified.*
20b30 2a 20 66 6f 72 20 64 61 74 61 62 61 73 65 20 69  * for database i
20b40 44 62 2e 20 20 54 68 65 20 63 6f 64 65 20 74 6f  Db.  The code to
20b50 20 61 63 74 75 61 6c 6c 79 20 76 65 72 69 66 79   actually verify
20b60 20 74 68 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b   the schema cook
20b70 69 65 0a 2a 2a 20 77 69 6c 6c 20 6f 63 63 75 72  ie.** will occur
20b80 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74   at the end of t
20b90 68 65 20 74 6f 70 2d 6c 65 76 65 6c 20 56 44 42  he top-level VDB
20ba0 45 20 61 6e 64 20 77 69 6c 6c 20 62 65 20 67 65  E and will be ge
20bb0 6e 65 72 61 74 65 64 0a 2a 2a 20 6c 61 74 65 72  nerated.** later
20bc0 2c 20 62 79 20 73 71 6c 69 74 65 33 46 69 6e 69  , by sqlite3Fini
20bd0 73 68 43 6f 64 69 6e 67 28 29 2e 0a 2a 2f 0a 76  shCoding()..*/.v
20be0 6f 69 64 20 73 71 6c 69 74 65 33 43 6f 64 65 56  oid sqlite3CodeV
20bf0 65 72 69 66 79 53 63 68 65 6d 61 28 50 61 72 73  erifySchema(Pars
20c00 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69  e *pParse, int i
20c10 44 62 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 54  Db){.  Parse *pT
20c20 6f 70 6c 65 76 65 6c 20 3d 20 73 71 6c 69 74 65  oplevel = sqlite
20c30 33 50 61 72 73 65 54 6f 70 6c 65 76 65 6c 28 70  3ParseToplevel(p
20c40 50 61 72 73 65 29 3b 0a 20 20 73 71 6c 69 74 65  Parse);.  sqlite
20c50 33 20 2a 64 62 20 3d 20 70 54 6f 70 6c 65 76 65  3 *db = pTopleve
20c60 6c 2d 3e 64 62 3b 0a 0a 20 20 61 73 73 65 72 74  l->db;..  assert
20c70 28 20 69 44 62 3e 3d 30 20 26 26 20 69 44 62 3c  ( iDb>=0 && iDb<
20c80 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 61 73 73  db->nDb );.  ass
20c90 65 72 74 28 20 64 62 2d 3e 61 44 62 5b 69 44 62  ert( db->aDb[iDb
20ca0 5d 2e 70 42 74 21 3d 30 20 7c 7c 20 69 44 62 3d  ].pBt!=0 || iDb=
20cb0 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =1 );.  assert( 
20cc0 69 44 62 3c 53 51 4c 49 54 45 5f 4d 41 58 5f 41  iDb<SQLITE_MAX_A
20cd0 54 54 41 43 48 45 44 2b 32 20 29 3b 0a 20 20 61  TTACHED+2 );.  a
20ce0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 53 63  ssert( sqlite3Sc
20cf0 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62  hemaMutexHeld(db
20d00 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a 20 20 69  , iDb, 0) );.  i
20d10 66 28 20 44 62 4d 61 73 6b 54 65 73 74 28 70 54  f( DbMaskTest(pT
20d20 6f 70 6c 65 76 65 6c 2d 3e 63 6f 6f 6b 69 65 4d  oplevel->cookieM
20d30 61 73 6b 2c 20 69 44 62 29 3d 3d 30 20 29 7b 0a  ask, iDb)==0 ){.
20d40 20 20 20 20 44 62 4d 61 73 6b 53 65 74 28 70 54      DbMaskSet(pT
20d50 6f 70 6c 65 76 65 6c 2d 3e 63 6f 6f 6b 69 65 4d  oplevel->cookieM
20d60 61 73 6b 2c 20 69 44 62 29 3b 0a 20 20 20 20 70  ask, iDb);.    p
20d70 54 6f 70 6c 65 76 65 6c 2d 3e 63 6f 6f 6b 69 65  Toplevel->cookie
20d80 56 61 6c 75 65 5b 69 44 62 5d 20 3d 20 64 62 2d  Value[iDb] = db-
20d90 3e 61 44 62 5b 69 44 62 5d 2e 70 53 63 68 65 6d  >aDb[iDb].pSchem
20da0 61 2d 3e 73 63 68 65 6d 61 5f 63 6f 6f 6b 69 65  a->schema_cookie
20db0 3b 0a 20 20 20 20 69 66 28 20 21 4f 4d 49 54 5f  ;.    if( !OMIT_
20dc0 54 45 4d 50 44 42 20 26 26 20 69 44 62 3d 3d 31  TEMPDB && iDb==1
20dd0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
20de0 33 4f 70 65 6e 54 65 6d 70 44 61 74 61 62 61 73  3OpenTempDatabas
20df0 65 28 70 54 6f 70 6c 65 76 65 6c 29 3b 0a 20 20  e(pToplevel);.  
20e00 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
20e10 20 49 66 20 61 72 67 75 6d 65 6e 74 20 7a 44 62   If argument zDb
20e20 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 63   is NULL, then c
20e30 61 6c 6c 20 73 71 6c 69 74 65 33 43 6f 64 65 56  all sqlite3CodeV
20e40 65 72 69 66 79 53 63 68 65 6d 61 28 29 20 66 6f  erifySchema() fo
20e50 72 20 65 61 63 68 20 0a 2a 2a 20 61 74 74 61 63  r each .** attac
20e60 68 65 64 20 64 61 74 61 62 61 73 65 2e 20 4f 74  hed database. Ot
20e70 68 65 72 77 69 73 65 2c 20 69 6e 76 6f 6b 65 20  herwise, invoke 
20e80 69 74 20 66 6f 72 20 74 68 65 20 64 61 74 61 62  it for the datab
20e90 61 73 65 20 6e 61 6d 65 64 20 7a 44 62 20 6f 6e  ase named zDb on
20ea0 6c 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ly..*/.void sqli
20eb0 74 65 33 43 6f 64 65 56 65 72 69 66 79 4e 61 6d  te3CodeVerifyNam
20ec0 65 64 53 63 68 65 6d 61 28 50 61 72 73 65 20 2a  edSchema(Parse *
20ed0 70 50 61 72 73 65 2c 20 63 6f 6e 73 74 20 63 68  pParse, const ch
20ee0 61 72 20 2a 7a 44 62 29 7b 0a 20 20 73 71 6c 69  ar *zDb){.  sqli
20ef0 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
20f00 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  ->db;.  int i;. 
20f10 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e   for(i=0; i<db->
20f20 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 44  nDb; i++){.    D
20f30 62 20 2a 70 44 62 20 3d 20 26 64 62 2d 3e 61 44  b *pDb = &db->aD
20f40 62 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 70 44  b[i];.    if( pD
20f50 62 2d 3e 70 42 74 20 26 26 20 28 21 7a 44 62 20  b->pBt && (!zDb 
20f60 7c 7c 20 30 3d 3d 73 71 6c 69 74 65 33 53 74 72  || 0==sqlite3Str
20f70 49 43 6d 70 28 7a 44 62 2c 20 70 44 62 2d 3e 7a  ICmp(zDb, pDb->z
20f80 4e 61 6d 65 29 29 20 29 7b 0a 20 20 20 20 20 20  Name)) ){.      
20f90 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66  sqlite3CodeVerif
20fa0 79 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20  ySchema(pParse, 
20fb0 69 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  i);.    }.  }.}.
20fc0 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
20fd0 56 44 42 45 20 63 6f 64 65 20 74 68 61 74 20 70  VDBE code that p
20fe0 72 65 70 61 72 65 73 20 66 6f 72 20 64 6f 69 6e  repares for doin
20ff0 67 20 61 6e 20 6f 70 65 72 61 74 69 6f 6e 20 74  g an operation t
21000 68 61 74 0a 2a 2a 20 6d 69 67 68 74 20 63 68 61  hat.** might cha
21010 6e 67 65 20 74 68 65 20 64 61 74 61 62 61 73 65  nge the database
21020 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
21030 74 69 6e 65 20 73 74 61 72 74 73 20 61 20 6e 65  tine starts a ne
21040 77 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 66  w transaction if
21050 20 77 65 20 61 72 65 20 6e 6f 74 20 61 6c 72 65   we are not alre
21060 61 64 79 20 77 69 74 68 69 6e 0a 2a 2a 20 61 20  ady within.** a 
21070 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 49 66  transaction.  If
21080 20 77 65 20 61 72 65 20 61 6c 72 65 61 64 79 20   we are already 
21090 77 69 74 68 69 6e 20 61 20 74 72 61 6e 73 61 63  within a transac
210a0 74 69 6f 6e 2c 20 74 68 65 6e 20 61 20 63 68 65  tion, then a che
210b0 63 6b 70 6f 69 6e 74 0a 2a 2a 20 69 73 20 73 65  ckpoint.** is se
210c0 74 20 69 66 20 74 68 65 20 73 65 74 53 74 61 74  t if the setStat
210d0 65 6d 65 6e 74 20 70 61 72 61 6d 65 74 65 72 20  ement parameter 
210e0 69 73 20 74 72 75 65 2e 20 20 41 20 63 68 65 63  is true.  A chec
210f0 6b 70 6f 69 6e 74 20 73 68 6f 75 6c 64 0a 2a 2a  kpoint should.**
21100 20 62 65 20 73 65 74 20 66 6f 72 20 6f 70 65 72   be set for oper
21110 61 74 69 6f 6e 73 20 74 68 61 74 20 6d 69 67 68  ations that migh
21120 74 20 66 61 69 6c 20 28 64 75 65 20 74 6f 20 61  t fail (due to a
21130 20 63 6f 6e 73 74 72 61 69 6e 74 29 20 70 61 72   constraint) par
21140 74 20 6f 66 0a 2a 2a 20 74 68 65 20 77 61 79 20  t of.** the way 
21150 74 68 72 6f 75 67 68 20 61 6e 64 20 77 68 69 63  through and whic
21160 68 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20 75  h will need to u
21170 6e 64 6f 20 73 6f 6d 65 20 77 72 69 74 65 73 20  ndo some writes 
21180 77 69 74 68 6f 75 74 20 68 61 76 69 6e 67 20 74  without having t
21190 6f 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 74 68  o.** rollback th
211a0 65 20 77 68 6f 6c 65 20 74 72 61 6e 73 61 63 74  e whole transact
211b0 69 6f 6e 2e 20 20 46 6f 72 20 6f 70 65 72 61 74  ion.  For operat
211c0 69 6f 6e 73 20 77 68 65 72 65 20 61 6c 6c 20 63  ions where all c
211d0 6f 6e 73 74 72 61 69 6e 74 73 0a 2a 2a 20 63 61  onstraints.** ca
211e0 6e 20 62 65 20 63 68 65 63 6b 65 64 20 62 65 66  n be checked bef
211f0 6f 72 65 20 61 6e 79 20 63 68 61 6e 67 65 73 20  ore any changes 
21200 61 72 65 20 6d 61 64 65 20 74 6f 20 74 68 65 20  are made to the 
21210 64 61 74 61 62 61 73 65 2c 20 69 74 20 69 73 20  database, it is 
21220 6e 65 76 65 72 0a 2a 2a 20 6e 65 63 65 73 73 61  never.** necessa
21230 72 79 20 74 6f 20 75 6e 64 6f 20 61 20 77 72 69  ry to undo a wri
21240 74 65 20 61 6e 64 20 74 68 65 20 63 68 65 63 6b  te and the check
21250 70 6f 69 6e 74 20 73 68 6f 75 6c 64 20 6e 6f 74  point should not
21260 20 62 65 20 73 65 74 2e 0a 2a 2f 0a 76 6f 69 64   be set..*/.void
21270 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69   sqlite3BeginWri
21280 74 65 4f 70 65 72 61 74 69 6f 6e 28 50 61 72 73  teOperation(Pars
21290 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 73  e *pParse, int s
212a0 65 74 53 74 61 74 65 6d 65 6e 74 2c 20 69 6e 74  etStatement, int
212b0 20 69 44 62 29 7b 0a 20 20 50 61 72 73 65 20 2a   iDb){.  Parse *
212c0 70 54 6f 70 6c 65 76 65 6c 20 3d 20 73 71 6c 69  pToplevel = sqli
212d0 74 65 33 50 61 72 73 65 54 6f 70 6c 65 76 65 6c  te3ParseToplevel
212e0 28 70 50 61 72 73 65 29 3b 0a 20 20 73 71 6c 69  (pParse);.  sqli
212f0 74 65 33 43 6f 64 65 56 65 72 69 66 79 53 63 68  te3CodeVerifySch
21300 65 6d 61 28 70 50 61 72 73 65 2c 20 69 44 62 29  ema(pParse, iDb)
21310 3b 0a 20 20 44 62 4d 61 73 6b 53 65 74 28 70 54  ;.  DbMaskSet(pT
21320 6f 70 6c 65 76 65 6c 2d 3e 77 72 69 74 65 4d 61  oplevel->writeMa
21330 73 6b 2c 20 69 44 62 29 3b 0a 20 20 70 54 6f 70  sk, iDb);.  pTop
21340 6c 65 76 65 6c 2d 3e 69 73 4d 75 6c 74 69 57 72  level->isMultiWr
21350 69 74 65 20 7c 3d 20 73 65 74 53 74 61 74 65 6d  ite |= setStatem
21360 65 6e 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e  ent;.}../*.** In
21370 64 69 63 61 74 65 20 74 68 61 74 20 74 68 65 20  dicate that the 
21380 73 74 61 74 65 6d 65 6e 74 20 63 75 72 72 65 6e  statement curren
21390 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72  tly under constr
213a0 75 63 74 69 6f 6e 20 6d 69 67 68 74 20 77 72 69  uction might wri
213b0 74 65 0a 2a 2a 20 6d 6f 72 65 20 74 68 61 6e 20  te.** more than 
213c0 6f 6e 65 20 65 6e 74 72 79 20 28 65 78 61 6d 70  one entry (examp
213d0 6c 65 3a 20 64 65 6c 65 74 69 6e 67 20 6f 6e 65  le: deleting one
213e0 20 72 6f 77 20 74 68 65 6e 20 69 6e 73 65 72 74   row then insert
213f0 69 6e 67 20 61 6e 6f 74 68 65 72 2c 0a 2a 2a 20  ing another,.** 
21400 69 6e 73 65 72 74 69 6e 67 20 6d 75 6c 74 69 70  inserting multip
21410 6c 65 20 72 6f 77 73 20 69 6e 20 61 20 74 61 62  le rows in a tab
21420 6c 65 2c 20 6f 72 20 69 6e 73 65 72 74 69 6e 67  le, or inserting
21430 20 61 20 72 6f 77 20 61 6e 64 20 69 6e 64 65 78   a row and index
21440 20 65 6e 74 72 69 65 73 2e 29 0a 2a 2a 20 49 66   entries.).** If
21450 20 61 6e 20 61 62 6f 72 74 20 6f 63 63 75 72 73   an abort occurs
21460 20 61 66 74 65 72 20 73 6f 6d 65 20 6f 66 20 74   after some of t
21470 68 65 73 65 20 77 72 69 74 65 73 20 68 61 76 65  hese writes have
21480 20 63 6f 6d 70 6c 65 74 65 64 2c 20 74 68 65 6e   completed, then
21490 20 69 74 20 77 69 6c 6c 0a 2a 2a 20 62 65 20 6e   it will.** be n
214a0 65 63 65 73 73 61 72 79 20 74 6f 20 75 6e 64 6f  ecessary to undo
214b0 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 64 20 77   the completed w
214c0 72 69 74 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73  rites..*/.void s
214d0 71 6c 69 74 65 33 4d 75 6c 74 69 57 72 69 74 65  qlite3MultiWrite
214e0 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b  (Parse *pParse){
214f0 0a 20 20 50 61 72 73 65 20 2a 70 54 6f 70 6c 65  .  Parse *pTople
21500 76 65 6c 20 3d 20 73 71 6c 69 74 65 33 50 61 72  vel = sqlite3Par
21510 73 65 54 6f 70 6c 65 76 65 6c 28 70 50 61 72 73  seToplevel(pPars
21520 65 29 3b 0a 20 20 70 54 6f 70 6c 65 76 65 6c 2d  e);.  pToplevel-
21530 3e 69 73 4d 75 6c 74 69 57 72 69 74 65 20 3d 20  >isMultiWrite = 
21540 31 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 54 68 65  1;.}../* .** The
21550 20 63 6f 64 65 20 67 65 6e 65 72 61 74 6f 72 20   code generator 
21560 63 61 6c 6c 73 20 74 68 69 73 20 72 6f 75 74 69  calls this routi
21570 6e 65 20 69 66 20 69 73 20 64 69 73 63 6f 76 65  ne if is discove
21580 72 73 20 74 68 61 74 20 69 74 20 69 73 0a 2a 2a  rs that it is.**
21590 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 61 62 6f   possible to abo
215a0 72 74 20 61 20 73 74 61 74 65 6d 65 6e 74 20 70  rt a statement p
215b0 72 69 6f 72 20 74 6f 20 63 6f 6d 70 6c 65 74 69  rior to completi
215c0 6f 6e 2e 20 20 49 6e 20 6f 72 64 65 72 20 74 6f  on.  In order to
215d0 20 0a 2a 2a 20 70 65 72 66 6f 72 6d 20 74 68 69   .** perform thi
215e0 73 20 61 62 6f 72 74 20 77 69 74 68 6f 75 74 20  s abort without 
215f0 63 6f 72 72 75 70 74 69 6e 67 20 74 68 65 20 64  corrupting the d
21600 61 74 61 62 61 73 65 2c 20 77 65 20 6e 65 65 64  atabase, we need
21610 20 74 6f 20 6d 61 6b 65 0a 2a 2a 20 73 75 72 65   to make.** sure
21620 20 74 68 61 74 20 74 68 65 20 73 74 61 74 65 6d   that the statem
21630 65 6e 74 20 69 73 20 70 72 6f 74 65 63 74 65 64  ent is protected
21640 20 62 79 20 61 20 73 74 61 74 65 6d 65 6e 74 20   by a statement 
21650 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a  transaction..**.
21660 2a 2a 20 54 65 63 68 6e 69 63 61 6c 6c 79 2c 20  ** Technically, 
21670 77 65 20 6f 6e 6c 79 20 6e 65 65 64 20 74 6f 20  we only need to 
21680 73 65 74 20 74 68 65 20 6d 61 79 41 62 6f 72 74  set the mayAbort
21690 20 66 6c 61 67 20 69 66 20 74 68 65 0a 2a 2a 20   flag if the.** 
216a0 69 73 4d 75 6c 74 69 57 72 69 74 65 20 66 6c 61  isMultiWrite fla
216b0 67 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79  g was previously
216c0 20 73 65 74 2e 20 20 54 68 65 72 65 20 69 73 20   set.  There is 
216d0 61 20 74 69 6d 65 20 64 65 70 65 6e 64 65 6e 63  a time dependenc
216e0 79 0a 2a 2a 20 73 75 63 68 20 74 68 61 74 20 74  y.** such that t
216f0 68 65 20 61 62 6f 72 74 20 6d 75 73 74 20 6f 63  he abort must oc
21700 63 75 72 20 61 66 74 65 72 20 74 68 65 20 6d 75  cur after the mu
21710 6c 74 69 77 72 69 74 65 2e 20 20 54 68 69 73 20  ltiwrite.  This 
21720 6d 61 6b 65 73 0a 2a 2a 20 73 6f 6d 65 20 73 74  makes.** some st
21730 61 74 65 6d 65 6e 74 73 20 69 6e 76 6f 6c 76 69  atements involvi
21740 6e 67 20 74 68 65 20 52 45 50 4c 41 43 45 20 63  ng the REPLACE c
21750 6f 6e 66 6c 69 63 74 20 72 65 73 6f 6c 75 74 69  onflict resoluti
21760 6f 6e 20 61 6c 67 6f 72 69 74 68 6d 0a 2a 2a 20  on algorithm.** 
21770 67 6f 20 61 20 6c 69 74 74 6c 65 20 66 61 73 74  go a little fast
21780 65 72 2e 20 20 42 75 74 20 74 61 6b 69 6e 67 20  er.  But taking 
21790 61 64 76 61 6e 74 61 67 65 20 6f 66 20 74 68 69  advantage of thi
217a0 73 20 74 69 6d 65 20 64 65 70 65 6e 64 65 6e 63  s time dependenc
217b0 79 0a 2a 2a 20 6d 61 6b 65 73 20 69 74 20 6d 6f  y.** makes it mo
217c0 72 65 20 64 69 66 66 69 63 75 6c 74 20 74 6f 20  re difficult to 
217d0 70 72 6f 76 65 20 74 68 61 74 20 74 68 65 20 63  prove that the c
217e0 6f 64 65 20 69 73 20 63 6f 72 72 65 63 74 20 28  ode is correct (
217f0 69 6e 20 0a 2a 2a 20 70 61 72 74 69 63 75 6c 61  in .** particula
21800 72 2c 20 69 74 20 70 72 65 76 65 6e 74 73 20 75  r, it prevents u
21810 73 20 66 72 6f 6d 20 77 72 69 74 69 6e 67 20 61  s from writing a
21820 6e 20 65 66 66 65 63 74 69 76 65 0a 2a 2a 20 69  n effective.** i
21830 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66  mplementation of
21840 20 73 71 6c 69 74 65 33 41 73 73 65 72 74 4d 61   sqlite3AssertMa
21850 79 41 62 6f 72 74 28 29 29 20 61 6e 64 20 73 6f  yAbort()) and so
21860 20 77 65 20 68 61 76 65 20 63 68 6f 73 65 6e 0a   we have chosen.
21870 2a 2a 20 74 6f 20 74 61 6b 65 20 74 68 65 20 73  ** to take the s
21880 61 66 65 20 72 6f 75 74 65 20 61 6e 64 20 73 6b  afe route and sk
21890 69 70 20 74 68 65 20 6f 70 74 69 6d 69 7a 61 74  ip the optimizat
218a0 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ion..*/.void sql
218b0 69 74 65 33 4d 61 79 41 62 6f 72 74 28 50 61 72  ite3MayAbort(Par
218c0 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 50  se *pParse){.  P
218d0 61 72 73 65 20 2a 70 54 6f 70 6c 65 76 65 6c 20  arse *pToplevel 
218e0 3d 20 73 71 6c 69 74 65 33 50 61 72 73 65 54 6f  = sqlite3ParseTo
218f0 70 6c 65 76 65 6c 28 70 50 61 72 73 65 29 3b 0a  plevel(pParse);.
21900 20 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 6d 61 79    pToplevel->may
21910 41 62 6f 72 74 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a  Abort = 1;.}../*
21920 0a 2a 2a 20 43 6f 64 65 20 61 6e 20 4f 50 5f 48  .** Code an OP_H
21930 61 6c 74 20 74 68 61 74 20 63 61 75 73 65 73 20  alt that causes 
21940 74 68 65 20 76 64 62 65 20 74 6f 20 72 65 74 75  the vdbe to retu
21950 72 6e 20 61 6e 20 53 51 4c 49 54 45 5f 43 4f 4e  rn an SQLITE_CON
21960 53 54 52 41 49 4e 54 0a 2a 2a 20 65 72 72 6f 72  STRAINT.** error
21970 2e 20 54 68 65 20 6f 6e 45 72 72 6f 72 20 70 61  . The onError pa
21980 72 61 6d 65 74 65 72 20 64 65 74 65 72 6d 69 6e  rameter determin
21990 65 73 20 77 68 69 63 68 20 28 69 66 20 61 6e 79  es which (if any
219a0 29 20 6f 66 20 74 68 65 20 73 74 61 74 65 6d 65  ) of the stateme
219b0 6e 74 0a 2a 2a 20 61 6e 64 2f 6f 72 20 63 75 72  nt.** and/or cur
219c0 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  rent transaction
219d0 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e   is rolled back.
219e0 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
219f0 48 61 6c 74 43 6f 6e 73 74 72 61 69 6e 74 28 0a  HaltConstraint(.
21a00 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
21a10 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
21a20 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20  ontext */.  int 
21a30 65 72 72 43 6f 64 65 2c 20 20 20 20 20 20 2f 2a  errCode,      /*
21a40 20 65 78 74 65 6e 64 65 64 20 65 72 72 6f 72 20   extended error 
21a50 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6f 6e  code */.  int on
21a60 45 72 72 6f 72 2c 20 20 20 20 20 20 2f 2a 20 43  Error,      /* C
21a70 6f 6e 73 74 72 61 69 6e 74 20 74 79 70 65 20 2a  onstraint type *
21a80 2f 0a 20 20 63 68 61 72 20 2a 70 34 2c 20 20 20  /.  char *p4,   
21a90 20 20 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 6d        /* Error m
21aa0 65 73 73 61 67 65 20 2a 2f 0a 20 20 69 38 20 70  essage */.  i8 p
21ab0 34 74 79 70 65 2c 20 20 20 20 20 20 20 20 2f 2a  4type,        /*
21ac0 20 50 34 5f 53 54 41 54 49 43 20 6f 72 20 50 34   P4_STATIC or P4
21ad0 5f 54 52 41 4e 53 49 45 4e 54 20 2a 2f 0a 20 20  _TRANSIENT */.  
21ae0 75 38 20 70 35 45 72 72 6d 73 67 20 20 20 20 20  u8 p5Errmsg     
21af0 20 20 2f 2a 20 50 35 5f 45 72 72 4d 73 67 20 74    /* P5_ErrMsg t
21b00 79 70 65 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65  ype */.){.  Vdbe
21b10 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74   *v = sqlite3Get
21b20 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
21b30 61 73 73 65 72 74 28 20 28 65 72 72 43 6f 64 65  assert( (errCode
21b40 26 30 78 66 66 29 3d 3d 53 51 4c 49 54 45 5f 43  &0xff)==SQLITE_C
21b50 4f 4e 53 54 52 41 49 4e 54 20 29 3b 0a 20 20 69  ONSTRAINT );.  i
21b60 66 28 20 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 41  f( onError==OE_A
21b70 62 6f 72 74 20 29 7b 0a 20 20 20 20 73 71 6c 69  bort ){.    sqli
21b80 74 65 33 4d 61 79 41 62 6f 72 74 28 70 50 61 72  te3MayAbort(pPar
21b90 73 65 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  se);.  }.  sqlit
21ba0 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
21bb0 4f 50 5f 48 61 6c 74 2c 20 65 72 72 43 6f 64 65  OP_Halt, errCode
21bc0 2c 20 6f 6e 45 72 72 6f 72 2c 20 30 2c 20 70 34  , onError, 0, p4
21bd0 2c 20 70 34 74 79 70 65 29 3b 0a 20 20 73 71 6c  , p4type);.  sql
21be0 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
21bf0 28 76 2c 20 70 35 45 72 72 6d 73 67 29 3b 0a 7d  (v, p5Errmsg);.}
21c00 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20 61 6e 20  ../*.** Code an 
21c10 4f 50 5f 48 61 6c 74 20 64 75 65 20 74 6f 20 55  OP_Halt due to U
21c20 4e 49 51 55 45 20 6f 72 20 50 52 49 4d 41 52 59  NIQUE or PRIMARY
21c30 20 4b 45 59 20 63 6f 6e 73 74 72 61 69 6e 74 20   KEY constraint 
21c40 76 69 6f 6c 61 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f  violation..*/.vo
21c50 69 64 20 73 71 6c 69 74 65 33 55 6e 69 71 75 65  id sqlite3Unique
21c60 43 6f 6e 73 74 72 61 69 6e 74 28 0a 20 20 50 61  Constraint(.  Pa
21c70 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
21c80 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
21c90 78 74 20 2a 2f 0a 20 20 69 6e 74 20 6f 6e 45 72  xt */.  int onEr
21ca0 72 6f 72 2c 20 20 20 20 20 20 2f 2a 20 43 6f 6e  ror,      /* Con
21cb0 73 74 72 61 69 6e 74 20 74 79 70 65 20 2a 2f 0a  straint type */.
21cc0 20 20 49 6e 64 65 78 20 2a 70 49 64 78 20 20 20    Index *pIdx   
21cd0 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78      /* The index
21ce0 20 74 68 61 74 20 74 72 69 67 67 65 72 73 20 74   that triggers t
21cf0 68 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a 2f  he constraint */
21d00 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a 45 72 72  .){.  char *zErr
21d10 3b 0a 20 20 69 6e 74 20 6a 3b 0a 20 20 53 74 72  ;.  int j;.  Str
21d20 41 63 63 75 6d 20 65 72 72 4d 73 67 3b 0a 20 20  Accum errMsg;.  
21d30 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 49  Table *pTab = pI
21d40 64 78 2d 3e 70 54 61 62 6c 65 3b 0a 0a 20 20 73  dx->pTable;..  s
21d50 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d 49 6e  qlite3StrAccumIn
21d60 69 74 28 26 65 72 72 4d 73 67 2c 20 70 50 61 72  it(&errMsg, pPar
21d70 73 65 2d 3e 64 62 2c 20 30 2c 20 30 2c 20 32 30  se->db, 0, 0, 20
21d80 30 29 3b 0a 20 20 69 66 28 20 70 49 64 78 2d 3e  0);.  if( pIdx->
21d90 61 43 6f 6c 45 78 70 72 20 29 7b 0a 20 20 20 20  aColExpr ){.    
21da0 73 71 6c 69 74 65 33 58 50 72 69 6e 74 66 28 26  sqlite3XPrintf(&
21db0 65 72 72 4d 73 67 2c 20 22 69 6e 64 65 78 20 27  errMsg, "index '
21dc0 25 71 27 22 2c 20 70 49 64 78 2d 3e 7a 4e 61 6d  %q'", pIdx->zNam
21dd0 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  e);.  }else{.   
21de0 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 49 64 78   for(j=0; j<pIdx
21df0 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 6a 2b 2b 29 7b  ->nKeyCol; j++){
21e00 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 43 6f  .      char *zCo
21e10 6c 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  l;.      assert(
21e20 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b   pIdx->aiColumn[
21e30 6a 5d 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20 7a  j]>=0 );.      z
21e40 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c  Col = pTab->aCol
21e50 5b 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b  [pIdx->aiColumn[
21e60 6a 5d 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20  j]].zName;.     
21e70 20 69 66 28 20 6a 20 29 20 73 71 6c 69 74 65 33   if( j ) sqlite3
21e80 53 74 72 41 63 63 75 6d 41 70 70 65 6e 64 28 26  StrAccumAppend(&
21e90 65 72 72 4d 73 67 2c 20 22 2c 20 22 2c 20 32 29  errMsg, ", ", 2)
21ea0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 58  ;.      sqlite3X
21eb0 50 72 69 6e 74 66 28 26 65 72 72 4d 73 67 2c 20  Printf(&errMsg, 
21ec0 22 25 73 2e 25 73 22 2c 20 70 54 61 62 2d 3e 7a  "%s.%s", pTab->z
21ed0 4e 61 6d 65 2c 20 7a 43 6f 6c 29 3b 0a 20 20 20  Name, zCol);.   
21ee0 20 7d 0a 20 20 7d 0a 20 20 7a 45 72 72 20 3d 20   }.  }.  zErr = 
21ef0 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d 46  sqlite3StrAccumF
21f00 69 6e 69 73 68 28 26 65 72 72 4d 73 67 29 3b 0a  inish(&errMsg);.
21f10 20 20 73 71 6c 69 74 65 33 48 61 6c 74 43 6f 6e    sqlite3HaltCon
21f20 73 74 72 61 69 6e 74 28 70 50 61 72 73 65 2c 20  straint(pParse, 
21f30 0a 20 20 20 20 49 73 50 72 69 6d 61 72 79 4b 65  .    IsPrimaryKe
21f40 79 49 6e 64 65 78 28 70 49 64 78 29 20 3f 20 53  yIndex(pIdx) ? S
21f50 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
21f60 5f 50 52 49 4d 41 52 59 4b 45 59 20 0a 20 20 20  _PRIMARYKEY .   
21f70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21f80 20 20 20 20 20 20 20 20 20 3a 20 53 51 4c 49 54           : SQLIT
21f90 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 55 4e 49  E_CONSTRAINT_UNI
21fa0 51 55 45 2c 0a 20 20 20 20 6f 6e 45 72 72 6f 72  QUE,.    onError
21fb0 2c 20 7a 45 72 72 2c 20 50 34 5f 44 59 4e 41 4d  , zErr, P4_DYNAM
21fc0 49 43 2c 20 50 35 5f 43 6f 6e 73 74 72 61 69 6e  IC, P5_Constrain
21fd0 74 55 6e 69 71 75 65 29 3b 0a 7d 0a 0a 0a 2f 2a  tUnique);.}.../*
21fe0 0a 2a 2a 20 43 6f 64 65 20 61 6e 20 4f 50 5f 48  .** Code an OP_H
21ff0 61 6c 74 20 64 75 65 20 74 6f 20 6e 6f 6e 2d 75  alt due to non-u
22000 6e 69 71 75 65 20 72 6f 77 69 64 2e 0a 2a 2f 0a  nique rowid..*/.
22010 76 6f 69 64 20 73 71 6c 69 74 65 33 52 6f 77 69  void sqlite3Rowi
22020 64 43 6f 6e 73 74 72 61 69 6e 74 28 0a 20 20 50  dConstraint(.  P
22030 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
22040 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
22050 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20 6f 6e 45  ext */.  int onE
22060 72 72 6f 72 2c 20 20 20 20 20 20 2f 2a 20 43 6f  rror,      /* Co
22070 6e 66 6c 69 63 74 20 72 65 73 6f 6c 75 74 69 6f  nflict resolutio
22080 6e 20 61 6c 67 6f 72 69 74 68 6d 20 2a 2f 0a 20  n algorithm */. 
22090 20 54 61 62 6c 65 20 2a 70 54 61 62 20 20 20 20   Table *pTab    
220a0 20 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20     /* The table 
220b0 77 69 74 68 20 74 68 65 20 6e 6f 6e 2d 75 6e 69  with the non-uni
220c0 71 75 65 20 72 6f 77 69 64 20 2a 2f 20 0a 29 7b  que rowid */ .){
220d0 0a 20 20 63 68 61 72 20 2a 7a 4d 73 67 3b 0a 20  .  char *zMsg;. 
220e0 20 69 6e 74 20 72 63 3b 0a 20 20 69 66 28 20 70   int rc;.  if( p
220f0 54 61 62 2d 3e 69 50 4b 65 79 3e 3d 30 20 29 7b  Tab->iPKey>=0 ){
22100 0a 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69  .    zMsg = sqli
22110 74 65 33 4d 50 72 69 6e 74 66 28 70 50 61 72 73  te3MPrintf(pPars
22120 65 2d 3e 64 62 2c 20 22 25 73 2e 25 73 22 2c 20  e->db, "%s.%s", 
22130 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20  pTab->zName,.   
22140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22150 20 20 20 20 20 20 20 70 54 61 62 2d 3e 61 43 6f         pTab->aCo
22160 6c 5b 70 54 61 62 2d 3e 69 50 4b 65 79 5d 2e 7a  l[pTab->iPKey].z
22170 4e 61 6d 65 29 3b 0a 20 20 20 20 72 63 20 3d 20  Name);.    rc = 
22180 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
22190 54 5f 50 52 49 4d 41 52 59 4b 45 59 3b 0a 20 20  T_PRIMARYKEY;.  
221a0 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 4d 73 67 20  }else{.    zMsg 
221b0 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66  = sqlite3MPrintf
221c0 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 22 25 73  (pParse->db, "%s
221d0 2e 72 6f 77 69 64 22 2c 20 70 54 61 62 2d 3e 7a  .rowid", pTab->z
221e0 4e 61 6d 65 29 3b 0a 20 20 20 20 72 63 20 3d 20  Name);.    rc = 
221f0 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
22200 54 5f 52 4f 57 49 44 3b 0a 20 20 7d 0a 20 20 73  T_ROWID;.  }.  s
22210 71 6c 69 74 65 33 48 61 6c 74 43 6f 6e 73 74 72  qlite3HaltConstr
22220 61 69 6e 74 28 70 50 61 72 73 65 2c 20 72 63 2c  aint(pParse, rc,
22230 20 6f 6e 45 72 72 6f 72 2c 20 7a 4d 73 67 2c 20   onError, zMsg, 
22240 50 34 5f 44 59 4e 41 4d 49 43 2c 0a 20 20 20 20  P4_DYNAMIC,.    
22250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22260 20 20 20 20 50 35 5f 43 6f 6e 73 74 72 61 69 6e      P5_Constrain
22270 74 55 6e 69 71 75 65 29 3b 0a 7d 0a 0a 2f 2a 0a  tUnique);.}../*.
22280 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20  ** Check to see 
22290 69 66 20 70 49 6e 64 65 78 20 75 73 65 73 20 74  if pIndex uses t
222a0 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71  he collating seq
222b0 75 65 6e 63 65 20 70 43 6f 6c 6c 2e 20 20 52 65  uence pColl.  Re
222c0 74 75 72 6e 0a 2a 2a 20 74 72 75 65 20 69 66 20  turn.** true if 
222d0 69 74 20 64 6f 65 73 20 61 6e 64 20 66 61 6c 73  it does and fals
222e0 65 20 69 66 20 69 74 20 64 6f 65 73 20 6e 6f 74  e if it does not
222f0 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
22300 49 54 45 5f 4f 4d 49 54 5f 52 45 49 4e 44 45 58  ITE_OMIT_REINDEX
22310 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f 6c 6c  .static int coll
22320 61 74 69 6f 6e 4d 61 74 63 68 28 63 6f 6e 73 74  ationMatch(const
22330 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 2c 20 49 6e   char *zColl, In
22340 64 65 78 20 2a 70 49 6e 64 65 78 29 7b 0a 20 20  dex *pIndex){.  
22350 69 6e 74 20 69 3b 0a 20 20 61 73 73 65 72 74 28  int i;.  assert(
22360 20 7a 43 6f 6c 6c 21 3d 30 20 29 3b 0a 20 20 66   zColl!=0 );.  f
22370 6f 72 28 69 3d 30 3b 20 69 3c 70 49 6e 64 65 78  or(i=0; i<pIndex
22380 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b  ->nColumn; i++){
22390 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
223a0 2a 7a 20 3d 20 70 49 6e 64 65 78 2d 3e 61 7a 43  *z = pIndex->azC
223b0 6f 6c 6c 5b 69 5d 3b 0a 20 20 20 20 61 73 73 65  oll[i];.    asse
223c0 72 74 28 20 7a 21 3d 30 20 7c 7c 20 70 49 6e 64  rt( z!=0 || pInd
223d0 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 3c  ex->aiColumn[i]<
223e0 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70 49 6e  0 );.    if( pIn
223f0 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d  dex->aiColumn[i]
22400 3e 3d 30 20 26 26 20 30 3d 3d 73 71 6c 69 74 65  >=0 && 0==sqlite
22410 33 53 74 72 49 43 6d 70 28 7a 2c 20 7a 43 6f 6c  3StrICmp(z, zCol
22420 6c 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  l) ){.      retu
22430 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rn 1;.    }.  }.
22440 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65    return 0;.}.#e
22450 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6f  ndif../*.** Reco
22460 6d 70 75 74 65 20 61 6c 6c 20 69 6e 64 69 63 65  mpute all indice
22470 73 20 6f 66 20 70 54 61 62 20 74 68 61 74 20 75  s of pTab that u
22480 73 65 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67  se the collating
22490 20 73 65 71 75 65 6e 63 65 20 70 43 6f 6c 6c 2e   sequence pColl.
224a0 0a 2a 2a 20 49 66 20 70 43 6f 6c 6c 3d 3d 30 20  .** If pColl==0 
224b0 74 68 65 6e 20 72 65 63 6f 6d 70 75 74 65 20 61  then recompute a
224c0 6c 6c 20 69 6e 64 69 63 65 73 20 6f 66 20 70 54  ll indices of pT
224d0 61 62 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53  ab..*/.#ifndef S
224e0 51 4c 49 54 45 5f 4f 4d 49 54 5f 52 45 49 4e 44  QLITE_OMIT_REIND
224f0 45 58 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72  EX.static void r
22500 65 69 6e 64 65 78 54 61 62 6c 65 28 50 61 72 73  eindexTable(Pars
22510 65 20 2a 70 50 61 72 73 65 2c 20 54 61 62 6c 65  e *pParse, Table
22520 20 2a 70 54 61 62 2c 20 63 68 61 72 20 63 6f 6e   *pTab, char con
22530 73 74 20 2a 7a 43 6f 6c 6c 29 7b 0a 20 20 49 6e  st *zColl){.  In
22540 64 65 78 20 2a 70 49 6e 64 65 78 3b 20 20 20 20  dex *pIndex;    
22550 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20            /* An 
22560 69 6e 64 65 78 20 61 73 73 6f 63 69 61 74 65 64  index associated
22570 20 77 69 74 68 20 70 54 61 62 20 2a 2f 0a 0a 20   with pTab */.. 
22580 20 66 6f 72 28 70 49 6e 64 65 78 3d 70 54 61 62   for(pIndex=pTab
22590 2d 3e 70 49 6e 64 65 78 3b 20 70 49 6e 64 65 78  ->pIndex; pIndex
225a0 3b 20 70 49 6e 64 65 78 3d 70 49 6e 64 65 78 2d  ; pIndex=pIndex-
225b0 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28  >pNext){.    if(
225c0 20 7a 43 6f 6c 6c 3d 3d 30 20 7c 7c 20 63 6f 6c   zColl==0 || col
225d0 6c 61 74 69 6f 6e 4d 61 74 63 68 28 7a 43 6f 6c  lationMatch(zCol
225e0 6c 2c 20 70 49 6e 64 65 78 29 20 29 7b 0a 20 20  l, pIndex) ){.  
225f0 20 20 20 20 69 6e 74 20 69 44 62 20 3d 20 73 71      int iDb = sq
22600 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64  lite3SchemaToInd
22610 65 78 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  ex(pParse->db, p
22620 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20  Tab->pSchema);. 
22630 20 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69       sqlite3Begi
22640 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28  nWriteOperation(
22650 70 50 61 72 73 65 2c 20 30 2c 20 69 44 62 29 3b  pParse, 0, iDb);
22660 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65  .      sqlite3Re
22670 66 69 6c 6c 49 6e 64 65 78 28 70 50 61 72 73 65  fillIndex(pParse
22680 2c 20 70 49 6e 64 65 78 2c 20 2d 31 29 3b 0a 20  , pIndex, -1);. 
22690 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69     }.  }.}.#endi
226a0 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6f 6d 70 75  f../*.** Recompu
226b0 74 65 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 6f  te all indices o
226c0 66 20 61 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20  f all tables in 
226d0 61 6c 6c 20 64 61 74 61 62 61 73 65 73 20 77 68  all databases wh
226e0 65 72 65 20 74 68 65 0a 2a 2a 20 69 6e 64 69 63  ere the.** indic
226f0 65 73 20 75 73 65 20 74 68 65 20 63 6f 6c 6c 61  es use the colla
22700 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 70 43  ting sequence pC
22710 6f 6c 6c 2e 20 20 49 66 20 70 43 6f 6c 6c 3d 3d  oll.  If pColl==
22720 30 20 74 68 65 6e 20 72 65 63 6f 6d 70 75 74 65  0 then recompute
22730 0a 2a 2a 20 61 6c 6c 20 69 6e 64 69 63 65 73 20  .** all indices 
22740 65 76 65 72 79 77 68 65 72 65 2e 0a 2a 2f 0a 23  everywhere..*/.#
22750 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
22760 49 54 5f 52 45 49 4e 44 45 58 0a 73 74 61 74 69  IT_REINDEX.stati
22770 63 20 76 6f 69 64 20 72 65 69 6e 64 65 78 44 61  c void reindexDa
22780 74 61 62 61 73 65 73 28 50 61 72 73 65 20 2a 70  tabases(Parse *p
22790 50 61 72 73 65 2c 20 63 68 61 72 20 63 6f 6e 73  Parse, char cons
227a0 74 20 2a 7a 43 6f 6c 6c 29 7b 0a 20 20 44 62 20  t *zColl){.  Db 
227b0 2a 70 44 62 3b 20 20 20 20 20 20 20 20 20 20 20  *pDb;           
227c0 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 73 69           /* A si
227d0 6e 67 6c 65 20 64 61 74 61 62 61 73 65 20 2a 2f  ngle database */
227e0 0a 20 20 69 6e 74 20 69 44 62 3b 20 20 20 20 20  .  int iDb;     
227f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
22800 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 69  * The database i
22810 6e 64 65 78 20 6e 75 6d 62 65 72 20 2a 2f 0a 20  ndex number */. 
22820 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
22830 50 61 72 73 65 2d 3e 64 62 3b 20 20 20 2f 2a 20  Parse->db;   /* 
22840 54 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e  The database con
22850 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 48 61 73  nection */.  Has
22860 68 45 6c 65 6d 20 2a 6b 3b 20 20 20 20 20 20 20  hElem *k;       
22870 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20           /* For 
22880 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 74 61 62  looping over tab
22890 6c 65 73 20 69 6e 20 70 44 62 20 2a 2f 0a 20 20  les in pDb */.  
228a0 54 61 62 6c 65 20 2a 70 54 61 62 3b 20 20 20 20  Table *pTab;    
228b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
228c0 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20 64 61   table in the da
228d0 74 61 62 61 73 65 20 2a 2f 0a 0a 20 20 61 73 73  tabase */..  ass
228e0 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65  ert( sqlite3Btre
228f0 65 48 6f 6c 64 73 41 6c 6c 4d 75 74 65 78 65 73  eHoldsAllMutexes
22900 28 64 62 29 20 29 3b 20 20 2f 2a 20 4e 65 65 64  (db) );  /* Need
22910 65 64 20 66 6f 72 20 73 63 68 65 6d 61 20 61 63  ed for schema ac
22920 63 65 73 73 20 2a 2f 0a 20 20 66 6f 72 28 69 44  cess */.  for(iD
22930 62 3d 30 2c 20 70 44 62 3d 64 62 2d 3e 61 44 62  b=0, pDb=db->aDb
22940 3b 20 69 44 62 3c 64 62 2d 3e 6e 44 62 3b 20 69  ; iDb<db->nDb; i
22950 44 62 2b 2b 2c 20 70 44 62 2b 2b 29 7b 0a 20 20  Db++, pDb++){.  
22960 20 20 61 73 73 65 72 74 28 20 70 44 62 21 3d 30    assert( pDb!=0
22970 20 29 3b 0a 20 20 20 20 66 6f 72 28 6b 3d 73 71   );.    for(k=sq
22980 6c 69 74 65 48 61 73 68 46 69 72 73 74 28 26 70  liteHashFirst(&p
22990 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 74 62 6c  Db->pSchema->tbl
229a0 48 61 73 68 29 3b 20 20 6b 3b 20 6b 3d 73 71 6c  Hash);  k; k=sql
229b0 69 74 65 48 61 73 68 4e 65 78 74 28 6b 29 29 7b  iteHashNext(k)){
229c0 0a 20 20 20 20 20 20 70 54 61 62 20 3d 20 28 54  .      pTab = (T
229d0 61 62 6c 65 2a 29 73 71 6c 69 74 65 48 61 73 68  able*)sqliteHash
229e0 44 61 74 61 28 6b 29 3b 0a 20 20 20 20 20 20 72  Data(k);.      r
229f0 65 69 6e 64 65 78 54 61 62 6c 65 28 70 50 61 72  eindexTable(pPar
22a00 73 65 2c 20 70 54 61 62 2c 20 7a 43 6f 6c 6c 29  se, pTab, zColl)
22a10 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65  ;.    }.  }.}.#e
22a20 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  ndif../*.** Gene
22a30 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 74 68  rate code for th
22a40 65 20 52 45 49 4e 44 45 58 20 63 6f 6d 6d 61 6e  e REINDEX comman
22a50 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20  d..**.**        
22a60 52 45 49 4e 44 45 58 20 20 20 20 20 20 20 20 20  REINDEX         
22a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22a80 20 20 20 2d 2d 20 31 0a 2a 2a 20 20 20 20 20 20     -- 1.**      
22a90 20 20 52 45 49 4e 44 45 58 20 20 3c 63 6f 6c 6c    REINDEX  <coll
22aa0 61 74 69 6f 6e 3e 20 20 20 20 20 20 20 20 20 20  ation>          
22ab0 20 20 20 20 20 2d 2d 20 32 0a 2a 2a 20 20 20 20       -- 2.**    
22ac0 20 20 20 20 52 45 49 4e 44 45 58 20 20 3f 3c 64      REINDEX  ?<d
22ad0 61 74 61 62 61 73 65 3e 2e 3f 3c 74 61 62 6c 65  atabase>.?<table
22ae0 6e 61 6d 65 3e 20 20 2d 2d 20 33 0a 2a 2a 20 20  name>  -- 3.**  
22af0 20 20 20 20 20 20 52 45 49 4e 44 45 58 20 20 3f        REINDEX  ?
22b00 3c 64 61 74 61 62 61 73 65 3e 2e 3f 3c 69 6e 64  <database>.?<ind
22b10 65 78 6e 61 6d 65 3e 20 20 2d 2d 20 34 0a 2a 2a  exname>  -- 4.**
22b20 0a 2a 2a 20 46 6f 72 6d 20 31 20 63 61 75 73 65  .** Form 1 cause
22b30 73 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 69 6e  s all indices in
22b40 20 61 6c 6c 20 61 74 74 61 63 68 65 64 20 64 61   all attached da
22b50 74 61 62 61 73 65 73 20 74 6f 20 62 65 20 72 65  tabases to be re
22b60 62 75 69 6c 74 2e 0a 2a 2a 20 46 6f 72 6d 20 32  built..** Form 2
22b70 20 72 65 62 75 69 6c 64 73 20 61 6c 6c 20 69 6e   rebuilds all in
22b80 64 69 63 65 73 20 69 6e 20 61 6c 6c 20 64 61 74  dices in all dat
22b90 61 62 61 73 65 73 20 74 68 61 74 20 75 73 65 20  abases that use 
22ba0 74 68 65 20 6e 61 6d 65 64 0a 2a 2a 20 63 6f 6c  the named.** col
22bb0 6c 61 74 69 6e 67 20 66 75 6e 63 74 69 6f 6e 2e  lating function.
22bc0 20 20 46 6f 72 6d 73 20 33 20 61 6e 64 20 34 20    Forms 3 and 4 
22bd0 72 65 62 75 69 6c 64 20 74 68 65 20 6e 61 6d 65  rebuild the name
22be0 64 20 69 6e 64 65 78 20 6f 72 20 61 6c 6c 0a 2a  d index or all.*
22bf0 2a 20 69 6e 64 69 63 65 73 20 61 73 73 6f 63 69  * indices associ
22c00 61 74 65 64 20 77 69 74 68 20 74 68 65 20 6e 61  ated with the na
22c10 6d 65 64 20 74 61 62 6c 65 2e 0a 2a 2f 0a 23 69  med table..*/.#i
22c20 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
22c30 54 5f 52 45 49 4e 44 45 58 0a 76 6f 69 64 20 73  T_REINDEX.void s
22c40 71 6c 69 74 65 33 52 65 69 6e 64 65 78 28 50 61  qlite3Reindex(Pa
22c50 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b  rse *pParse, Tok
22c60 65 6e 20 2a 70 4e 61 6d 65 31 2c 20 54 6f 6b 65  en *pName1, Toke
22c70 6e 20 2a 70 4e 61 6d 65 32 29 7b 0a 20 20 43 6f  n *pName2){.  Co
22c80 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 20 20 20  llSeq *pColl;   
22c90 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c            /* Col
22ca0 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20  lating sequence 
22cb0 74 6f 20 62 65 20 72 65 69 6e 64 65 78 65 64 2c  to be reindexed,
22cc0 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 63 68   or NULL */.  ch
22cd0 61 72 20 2a 7a 3b 20 20 20 20 20 20 20 20 20 20  ar *z;          
22ce0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
22cf0 65 20 6f 66 20 61 20 74 61 62 6c 65 20 6f 72 20  e of a table or 
22d00 69 6e 64 65 78 20 2a 2f 0a 20 20 63 6f 6e 73 74  index */.  const
22d10 20 63 68 61 72 20 2a 7a 44 62 3b 20 20 20 20 20   char *zDb;     
22d20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
22d30 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 2a  f the database *
22d40 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b  /.  Table *pTab;
22d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22d60 2f 2a 20 41 20 74 61 62 6c 65 20 69 6e 20 74 68  /* A table in th
22d70 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20  e database */.  
22d80 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b 20 20  Index *pIndex;  
22d90 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
22da0 6e 20 69 6e 64 65 78 20 61 73 73 6f 63 69 61 74  n index associat
22db0 65 64 20 77 69 74 68 20 70 54 61 62 20 2a 2f 0a  ed with pTab */.
22dc0 20 20 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20    int iDb;      
22dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
22de0 20 54 68 65 20 64 61 74 61 62 61 73 65 20 69 6e   The database in
22df0 64 65 78 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20  dex number */.  
22e00 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
22e10 61 72 73 65 2d 3e 64 62 3b 20 20 20 2f 2a 20 54  arse->db;   /* T
22e20 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  he database conn
22e30 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 6f 6b 65  ection */.  Toke
22e40 6e 20 2a 70 4f 62 6a 4e 61 6d 65 3b 20 20 20 20  n *pObjName;    
22e50 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
22e60 6f 66 20 74 68 65 20 74 61 62 6c 65 20 6f 72 20  of the table or 
22e70 69 6e 64 65 78 20 74 6f 20 62 65 20 72 65 69 6e  index to be rein
22e80 64 65 78 65 64 20 2a 2f 0a 0a 20 20 2f 2a 20 52  dexed */..  /* R
22e90 65 61 64 20 74 68 65 20 64 61 74 61 62 61 73 65  ead the database
22ea0 20 73 63 68 65 6d 61 2e 20 49 66 20 61 6e 20 65   schema. If an e
22eb0 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 6c 65 61  rror occurs, lea
22ec0 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73  ve an error mess
22ed0 61 67 65 0a 20 20 2a 2a 20 61 6e 64 20 63 6f 64  age.  ** and cod
22ee0 65 20 69 6e 20 70 50 61 72 73 65 20 61 6e 64 20  e in pParse and 
22ef0 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 20 2a 2f 0a  return NULL. */.
22f00 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21    if( SQLITE_OK!
22f10 3d 73 71 6c 69 74 65 33 52 65 61 64 53 63 68 65  =sqlite3ReadSche
22f20 6d 61 28 70 50 61 72 73 65 29 20 29 7b 0a 20 20  ma(pParse) ){.  
22f30 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20    return;.  }.. 
22f40 20 69 66 28 20 70 4e 61 6d 65 31 3d 3d 30 20 29   if( pName1==0 )
22f50 7b 0a 20 20 20 20 72 65 69 6e 64 65 78 44 61 74  {.    reindexDat
22f60 61 62 61 73 65 73 28 70 50 61 72 73 65 2c 20 30  abases(pParse, 0
22f70 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  );.    return;. 
22f80 20 7d 65 6c 73 65 20 69 66 28 20 4e 45 56 45 52   }else if( NEVER
22f90 28 70 4e 61 6d 65 32 3d 3d 30 29 20 7c 7c 20 70  (pName2==0) || p
22fa0 4e 61 6d 65 32 2d 3e 7a 3d 3d 30 20 29 7b 0a 20  Name2->z==0 ){. 
22fb0 20 20 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 3b 0a     char *zColl;.
22fc0 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 61 6d      assert( pNam
22fd0 65 31 2d 3e 7a 20 29 3b 0a 20 20 20 20 7a 43 6f  e1->z );.    zCo
22fe0 6c 6c 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65  ll = sqlite3Name
22ff0 46 72 6f 6d 54 6f 6b 65 6e 28 70 50 61 72 73 65  FromToken(pParse
23000 2d 3e 64 62 2c 20 70 4e 61 6d 65 31 29 3b 0a 20  ->db, pName1);. 
23010 20 20 20 69 66 28 20 21 7a 43 6f 6c 6c 20 29 20     if( !zColl ) 
23020 72 65 74 75 72 6e 3b 0a 20 20 20 20 70 43 6f 6c  return;.    pCol
23030 6c 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 43  l = sqlite3FindC
23040 6f 6c 6c 53 65 71 28 64 62 2c 20 45 4e 43 28 64  ollSeq(db, ENC(d
23050 62 29 2c 20 7a 43 6f 6c 6c 2c 20 30 29 3b 0a 20  b), zColl, 0);. 
23060 20 20 20 69 66 28 20 70 43 6f 6c 6c 20 29 7b 0a     if( pColl ){.
23070 20 20 20 20 20 20 72 65 69 6e 64 65 78 44 61 74        reindexDat
23080 61 62 61 73 65 73 28 70 50 61 72 73 65 2c 20 7a  abases(pParse, z
23090 43 6f 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c  Coll);.      sql
230a0 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a  ite3DbFree(db, z
230b0 43 6f 6c 6c 29 3b 0a 20 20 20 20 20 20 72 65 74  Coll);.      ret
230c0 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  urn;.    }.    s
230d0 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
230e0 20 7a 43 6f 6c 6c 29 3b 0a 20 20 7d 0a 20 20 69   zColl);.  }.  i
230f0 44 62 20 3d 20 73 71 6c 69 74 65 33 54 77 6f 50  Db = sqlite3TwoP
23100 61 72 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20  artName(pParse, 
23110 70 4e 61 6d 65 31 2c 20 70 4e 61 6d 65 32 2c 20  pName1, pName2, 
23120 26 70 4f 62 6a 4e 61 6d 65 29 3b 0a 20 20 69 66  &pObjName);.  if
23130 28 20 69 44 62 3c 30 20 29 20 72 65 74 75 72 6e  ( iDb<0 ) return
23140 3b 0a 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 4e  ;.  z = sqlite3N
23150 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c  ameFromToken(db,
23160 20 70 4f 62 6a 4e 61 6d 65 29 3b 0a 20 20 69 66   pObjName);.  if
23170 28 20 7a 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ( z==0 ) return;
23180 0a 20 20 7a 44 62 20 3d 20 64 62 2d 3e 61 44 62  .  zDb = db->aDb
23190 5b 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 70  [iDb].zName;.  p
231a0 54 61 62 20 3d 20 73 71 6c 69 74 65 33 46 69 6e  Tab = sqlite3Fin
231b0 64 54 61 62 6c 65 28 64 62 2c 20 7a 2c 20 7a 44  dTable(db, z, zD
231c0 62 29 3b 0a 20 20 69 66 28 20 70 54 61 62 20 29  b);.  if( pTab )
231d0 7b 0a 20 20 20 20 72 65 69 6e 64 65 78 54 61 62  {.    reindexTab
231e0 6c 65 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c  le(pParse, pTab,
231f0 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
23200 44 62 46 72 65 65 28 64 62 2c 20 7a 29 3b 0a 20  DbFree(db, z);. 
23210 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
23220 20 70 49 6e 64 65 78 20 3d 20 73 71 6c 69 74 65   pIndex = sqlite
23230 33 46 69 6e 64 49 6e 64 65 78 28 64 62 2c 20 7a  3FindIndex(db, z
23240 2c 20 7a 44 62 29 3b 0a 20 20 73 71 6c 69 74 65  , zDb);.  sqlite
23250 33 44 62 46 72 65 65 28 64 62 2c 20 7a 29 3b 0a  3DbFree(db, z);.
23260 20 20 69 66 28 20 70 49 6e 64 65 78 20 29 7b 0a    if( pIndex ){.
23270 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e      sqlite3Begin
23280 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70  WriteOperation(p
23290 50 61 72 73 65 2c 20 30 2c 20 69 44 62 29 3b 0a  Parse, 0, iDb);.
232a0 20 20 20 20 73 71 6c 69 74 65 33 52 65 66 69 6c      sqlite3Refil
232b0 6c 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70  lIndex(pParse, p
232c0 49 6e 64 65 78 2c 20 2d 31 29 3b 0a 20 20 20 20  Index, -1);.    
232d0 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 73 71  return;.  }.  sq
232e0 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
232f0 61 72 73 65 2c 20 22 75 6e 61 62 6c 65 20 74 6f  arse, "unable to
23300 20 69 64 65 6e 74 69 66 79 20 74 68 65 20 6f 62   identify the ob
23310 6a 65 63 74 20 74 6f 20 62 65 20 72 65 69 6e 64  ject to be reind
23320 65 78 65 64 22 29 3b 0a 7d 0a 23 65 6e 64 69 66  exed");.}.#endif
23330 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ../*.** Return a
23340 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75   KeyInfo structu
23350 72 65 20 74 68 61 74 20 69 73 20 61 70 70 72 6f  re that is appro
23360 70 72 69 61 74 65 20 66 6f 72 20 74 68 65 20 67  priate for the g
23370 69 76 65 6e 20 49 6e 64 65 78 2e 0a 2a 2a 0a 2a  iven Index..**.*
23380 2a 20 54 68 65 20 4b 65 79 49 6e 66 6f 20 73 74  * The KeyInfo st
23390 72 75 63 74 75 72 65 20 66 6f 72 20 61 6e 20 69  ructure for an i
233a0 6e 64 65 78 20 69 73 20 63 61 63 68 65 64 20 69  ndex is cached i
233b0 6e 20 74 68 65 20 49 6e 64 65 78 20 6f 62 6a 65  n the Index obje
233c0 63 74 2e 0a 2a 2a 20 53 6f 20 74 68 65 72 65 20  ct..** So there 
233d0 6d 69 67 68 74 20 62 65 20 6d 75 6c 74 69 70 6c  might be multipl
233e0 65 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  e references to 
233f0 74 68 65 20 72 65 74 75 72 6e 65 64 20 70 6f 69  the returned poi
23400 6e 74 65 72 2e 20 20 54 68 65 0a 2a 2a 20 63 61  nter.  The.** ca
23410 6c 6c 65 72 20 73 68 6f 75 6c 64 20 6e 6f 74 20  ller should not 
23420 74 72 79 20 74 6f 20 6d 6f 64 69 66 79 20 74 68  try to modify th
23430 65 20 4b 65 79 49 6e 66 6f 20 6f 62 6a 65 63 74  e KeyInfo object
23440 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c  ..**.** The call
23450 65 72 20 73 68 6f 75 6c 64 20 69 6e 76 6f 6b 65  er should invoke
23460 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 55   sqlite3KeyInfoU
23470 6e 72 65 66 28 29 20 6f 6e 20 74 68 65 20 72 65  nref() on the re
23480 74 75 72 6e 65 64 20 6f 62 6a 65 63 74 0a 2a 2a  turned object.**
23490 20 77 68 65 6e 20 69 74 20 68 61 73 20 66 69 6e   when it has fin
234a0 69 73 68 65 64 20 75 73 69 6e 67 20 69 74 2e 0a  ished using it..
234b0 2a 2f 0a 4b 65 79 49 6e 66 6f 20 2a 73 71 6c 69  */.KeyInfo *sqli
234c0 74 65 33 4b 65 79 49 6e 66 6f 4f 66 49 6e 64 65  te3KeyInfoOfInde
234d0 78 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  x(Parse *pParse,
234e0 20 49 6e 64 65 78 20 2a 70 49 64 78 29 7b 0a 20   Index *pIdx){. 
234f0 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e 43   int i;.  int nC
23500 6f 6c 20 3d 20 70 49 64 78 2d 3e 6e 43 6f 6c 75  ol = pIdx->nColu
23510 6d 6e 3b 0a 20 20 69 6e 74 20 6e 4b 65 79 20 3d  mn;.  int nKey =
23520 20 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 0a   pIdx->nKeyCol;.
23530 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 3b    KeyInfo *pKey;
23540 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e  .  if( pParse->n
23550 45 72 72 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  Err ) return 0;.
23560 20 20 69 66 28 20 70 49 64 78 2d 3e 75 6e 69 71    if( pIdx->uniq
23570 4e 6f 74 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 70  NotNull ){.    p
23580 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 4b 65 79  Key = sqlite3Key
23590 49 6e 66 6f 41 6c 6c 6f 63 28 70 50 61 72 73 65  InfoAlloc(pParse
235a0 2d 3e 64 62 2c 20 6e 4b 65 79 2c 20 6e 43 6f 6c  ->db, nKey, nCol
235b0 2d 6e 4b 65 79 29 3b 0a 20 20 7d 65 6c 73 65 7b  -nKey);.  }else{
235c0 0a 20 20 20 20 70 4b 65 79 20 3d 20 73 71 6c 69  .    pKey = sqli
235d0 74 65 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28  te3KeyInfoAlloc(
235e0 70 50 61 72 73 65 2d 3e 64 62 2c 20 6e 43 6f 6c  pParse->db, nCol
235f0 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  , 0);.  }.  if( 
23600 70 4b 65 79 20 29 7b 0a 20 20 20 20 61 73 73 65  pKey ){.    asse
23610 72 74 28 20 73 71 6c 69 74 65 33 4b 65 79 49 6e  rt( sqlite3KeyIn
23620 66 6f 49 73 57 72 69 74 65 61 62 6c 65 28 70 4b  foIsWriteable(pK
23630 65 79 29 20 29 3b 0a 20 20 20 20 66 6f 72 28 69  ey) );.    for(i
23640 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29  =0; i<nCol; i++)
23650 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68  {.      const ch
23660 61 72 20 2a 7a 43 6f 6c 6c 20 3d 20 70 49 64 78  ar *zColl = pIdx
23670 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 3b 0a 20 20 20  ->azColl[i];.   
23680 20 20 20 70 4b 65 79 2d 3e 61 43 6f 6c 6c 5b 69     pKey->aColl[i
23690 5d 20 3d 20 7a 43 6f 6c 6c 3d 3d 73 71 6c 69 74  ] = zColl==sqlit
236a0 65 33 53 74 72 42 49 4e 41 52 59 20 3f 20 30 20  e3StrBINARY ? 0 
236b0 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  :.              
236c0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
236d0 33 4c 6f 63 61 74 65 43 6f 6c 6c 53 65 71 28 70  3LocateCollSeq(p
236e0 50 61 72 73 65 2c 20 7a 43 6f 6c 6c 29 3b 0a 20  Parse, zColl);. 
236f0 20 20 20 20 20 70 4b 65 79 2d 3e 61 53 6f 72 74       pKey->aSort
23700 4f 72 64 65 72 5b 69 5d 20 3d 20 70 49 64 78 2d  Order[i] = pIdx-
23710 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 3b 0a  >aSortOrder[i];.
23720 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50      }.    if( pP
23730 61 72 73 65 2d 3e 6e 45 72 72 20 29 7b 0a 20 20  arse->nErr ){.  
23740 20 20 20 20 73 71 6c 69 74 65 33 4b 65 79 49 6e      sqlite3KeyIn
23750 66 6f 55 6e 72 65 66 28 70 4b 65 79 29 3b 0a 20  foUnref(pKey);. 
23760 20 20 20 20 20 70 4b 65 79 20 3d 20 30 3b 0a 20       pKey = 0;. 
23770 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
23780 6e 20 70 4b 65 79 3b 0a 7d 0a 0a 23 69 66 6e 64  n pKey;.}..#ifnd
23790 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  ef SQLITE_OMIT_C
237a0 54 45 0a 2f 2a 20 0a 2a 2a 20 54 68 69 73 20 72  TE./* .** This r
237b0 6f 75 74 69 6e 65 20 69 73 20 69 6e 76 6f 6b 65  outine is invoke
237c0 64 20 6f 6e 63 65 20 70 65 72 20 43 54 45 20 62  d once per CTE b
237d0 79 20 74 68 65 20 70 61 72 73 65 72 20 77 68 69  y the parser whi
237e0 6c 65 20 70 61 72 73 69 6e 67 20 61 20 0a 2a 2a  le parsing a .**
237f0 20 57 49 54 48 20 63 6c 61 75 73 65 2e 20 0a 2a   WITH clause. .*
23800 2f 0a 57 69 74 68 20 2a 73 71 6c 69 74 65 33 57  /.With *sqlite3W
23810 69 74 68 41 64 64 28 0a 20 20 50 61 72 73 65 20  ithAdd(.  Parse 
23820 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
23830 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
23840 74 65 78 74 20 2a 2f 0a 20 20 57 69 74 68 20 2a  text */.  With *
23850 70 57 69 74 68 2c 20 20 20 20 20 20 20 20 20 20  pWith,          
23860 20 20 2f 2a 20 45 78 69 73 74 69 6e 67 20 57 49    /* Existing WI
23870 54 48 20 63 6c 61 75 73 65 2c 20 6f 72 20 4e 55  TH clause, or NU
23880 4c 4c 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  LL */.  Token *p
23890 4e 61 6d 65 2c 20 20 20 20 20 20 20 20 20 20 20  Name,           
238a0 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 63  /* Name of the c
238b0 6f 6d 6d 6f 6e 2d 74 61 62 6c 65 20 2a 2f 0a 20  ommon-table */. 
238c0 20 45 78 70 72 4c 69 73 74 20 2a 70 41 72 67 6c   ExprList *pArgl
238d0 69 73 74 2c 20 20 20 20 20 2f 2a 20 4f 70 74 69  ist,     /* Opti
238e0 6f 6e 61 6c 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  onal column name
238f0 20 6c 69 73 74 20 66 6f 72 20 74 68 65 20 74 61   list for the ta
23900 62 6c 65 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ble */.  Select 
23910 2a 70 51 75 65 72 79 20 20 20 20 20 20 20 20 20  *pQuery         
23920 20 2f 2a 20 51 75 65 72 79 20 75 73 65 64 20 74   /* Query used t
23930 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  o initialize the
23940 20 74 61 62 6c 65 20 2a 2f 0a 29 7b 0a 20 20 73   table */.){.  s
23950 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
23960 72 73 65 2d 3e 64 62 3b 0a 20 20 57 69 74 68 20  rse->db;.  With 
23970 2a 70 4e 65 77 3b 0a 20 20 63 68 61 72 20 2a 7a  *pNew;.  char *z
23980 4e 61 6d 65 3b 0a 0a 20 20 2f 2a 20 43 68 65 63  Name;..  /* Chec
23990 6b 20 74 68 61 74 20 74 68 65 20 43 54 45 20 6e  k that the CTE n
239a0 61 6d 65 20 69 73 20 75 6e 69 71 75 65 20 77 69  ame is unique wi
239b0 74 68 69 6e 20 74 68 69 73 20 57 49 54 48 20 63  thin this WITH c
239c0 6c 61 75 73 65 2e 20 49 66 0a 20 20 2a 2a 20 6e  lause. If.  ** n
239d0 6f 74 2c 20 73 74 6f 72 65 20 61 6e 20 65 72 72  ot, store an err
239e0 6f 72 20 69 6e 20 74 68 65 20 50 61 72 73 65 20  or in the Parse 
239f0 73 74 72 75 63 74 75 72 65 2e 20 2a 2f 0a 20 20  structure. */.  
23a00 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e  zName = sqlite3N
23a10 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 50 61  ameFromToken(pPa
23a20 72 73 65 2d 3e 64 62 2c 20 70 4e 61 6d 65 29 3b  rse->db, pName);
23a30 0a 20 20 69 66 28 20 7a 4e 61 6d 65 20 26 26 20  .  if( zName && 
23a40 70 57 69 74 68 20 29 7b 0a 20 20 20 20 69 6e 74  pWith ){.    int
23a50 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   i;.    for(i=0;
23a60 20 69 3c 70 57 69 74 68 2d 3e 6e 43 74 65 3b 20   i<pWith->nCte; 
23a70 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  i++){.      if( 
23a80 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a  sqlite3StrICmp(z
23a90 4e 61 6d 65 2c 20 70 57 69 74 68 2d 3e 61 5b 69  Name, pWith->a[i
23aa0 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20  ].zName)==0 ){. 
23ab0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
23ac0 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
23ad0 64 75 70 6c 69 63 61 74 65 20 57 49 54 48 20 74  duplicate WITH t
23ae0 61 62 6c 65 20 6e 61 6d 65 3a 20 25 73 22 2c 20  able name: %s", 
23af0 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a  zName);.      }.
23b00 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28      }.  }..  if(
23b10 20 70 57 69 74 68 20 29 7b 0a 20 20 20 20 69 6e   pWith ){.    in
23b20 74 20 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f 66  t nByte = sizeof
23b30 28 2a 70 57 69 74 68 29 20 2b 20 28 73 69 7a 65  (*pWith) + (size
23b40 6f 66 28 70 57 69 74 68 2d 3e 61 5b 31 5d 29 20  of(pWith->a[1]) 
23b50 2a 20 70 57 69 74 68 2d 3e 6e 43 74 65 29 3b 0a  * pWith->nCte);.
23b60 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74      pNew = sqlit
23b70 65 33 44 62 52 65 61 6c 6c 6f 63 28 64 62 2c 20  e3DbRealloc(db, 
23b80 70 57 69 74 68 2c 20 6e 42 79 74 65 29 3b 0a 20  pWith, nByte);. 
23b90 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 4e 65 77   }else{.    pNew
23ba0 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
23bb0 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f  ocZero(db, sizeo
23bc0 66 28 2a 70 57 69 74 68 29 29 3b 0a 20 20 7d 0a  f(*pWith));.  }.
23bd0 20 20 61 73 73 65 72 74 28 20 28 70 4e 65 77 21    assert( (pNew!
23be0 3d 30 20 26 26 20 7a 4e 61 6d 65 21 3d 30 29 20  =0 && zName!=0) 
23bf0 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  || db->mallocFai
23c00 6c 65 64 20 29 3b 0a 0a 20 20 69 66 28 20 64 62  led );..  if( db
23c10 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
23c20 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  {.    sqlite3Exp
23c30 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20  rListDelete(db, 
23c40 70 41 72 67 6c 69 73 74 29 3b 0a 20 20 20 20 73  pArglist);.    s
23c50 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65  qlite3SelectDele
23c60 74 65 28 64 62 2c 20 70 51 75 65 72 79 29 3b 0a  te(db, pQuery);.
23c70 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
23c80 65 28 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20  e(db, zName);.  
23c90 20 20 70 4e 65 77 20 3d 20 70 57 69 74 68 3b 0a    pNew = pWith;.
23ca0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 4e 65    }else{.    pNe
23cb0 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e 43 74 65 5d  w->a[pNew->nCte]
23cc0 2e 70 53 65 6c 65 63 74 20 3d 20 70 51 75 65 72  .pSelect = pQuer
23cd0 79 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 61 5b 70  y;.    pNew->a[p
23ce0 4e 65 77 2d 3e 6e 43 74 65 5d 2e 70 43 6f 6c 73  New->nCte].pCols
23cf0 20 3d 20 70 41 72 67 6c 69 73 74 3b 0a 20 20 20   = pArglist;.   
23d00 20 70 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e   pNew->a[pNew->n
23d10 43 74 65 5d 2e 7a 4e 61 6d 65 20 3d 20 7a 4e 61  Cte].zName = zNa
23d20 6d 65 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 61 5b  me;.    pNew->a[
23d30 70 4e 65 77 2d 3e 6e 43 74 65 5d 2e 7a 43 74 65  pNew->nCte].zCte
23d40 45 72 72 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65  Err = 0;.    pNe
23d50 77 2d 3e 6e 43 74 65 2b 2b 3b 0a 20 20 7d 0a 0a  w->nCte++;.  }..
23d60 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d    return pNew;.}
23d70 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 74 68 65  ../*.** Free the
23d80 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
23d90 20 57 69 74 68 20 6f 62 6a 65 63 74 20 70 61 73   With object pas
23da0 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e  sed as the secon
23db0 64 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 76  d argument..*/.v
23dc0 6f 69 64 20 73 71 6c 69 74 65 33 57 69 74 68 44  oid sqlite3WithD
23dd0 65 6c 65 74 65 28 73 71 6c 69 74 65 33 20 2a 64  elete(sqlite3 *d
23de0 62 2c 20 57 69 74 68 20 2a 70 57 69 74 68 29 7b  b, With *pWith){
23df0 0a 20 20 69 66 28 20 70 57 69 74 68 20 29 7b 0a  .  if( pWith ){.
23e00 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66      int i;.    f
23e10 6f 72 28 69 3d 30 3b 20 69 3c 70 57 69 74 68 2d  or(i=0; i<pWith-
23e20 3e 6e 43 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nCte; i++){.   
23e30 20 20 20 73 74 72 75 63 74 20 43 74 65 20 2a 70     struct Cte *p
23e40 43 74 65 20 3d 20 26 70 57 69 74 68 2d 3e 61 5b  Cte = &pWith->a[
23e50 69 5d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  i];.      sqlite
23e60 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
23e70 64 62 2c 20 70 43 74 65 2d 3e 70 43 6f 6c 73 29  db, pCte->pCols)
23e80 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53  ;.      sqlite3S
23e90 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20  electDelete(db, 
23ea0 70 43 74 65 2d 3e 70 53 65 6c 65 63 74 29 3b 0a  pCte->pSelect);.
23eb0 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
23ec0 72 65 65 28 64 62 2c 20 70 43 74 65 2d 3e 7a 4e  ree(db, pCte->zN
23ed0 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ame);.    }.    
23ee0 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
23ef0 2c 20 70 57 69 74 68 29 3b 0a 20 20 7d 0a 7d 0a  , pWith);.  }.}.
23f00 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e  #endif /* !defin
23f10 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  ed(SQLITE_OMIT_C
23f20 54 45 29 20 2a 2f 0a                             TE) */.