/ Hex Artifact Content
Login

Artifact c5cf206191880f88142352629d53fed174fc10bd:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43 20 63  ile contains C c
0190: 6f 64 65 20 72 6f 75 74 69 6e 65 73 20 74 68 61  ode routines tha
01a0: 74 20 61 72 65 20 63 61 6c 6c 65 64 20 62 79 20  t are called by 
01b0: 74 68 65 20 53 51 4c 69 74 65 20 70 61 72 73 65  the SQLite parse
01c0: 72 0a 2a 2a 20 77 68 65 6e 20 73 79 6e 74 61 78  r.** when syntax
01d0: 20 72 75 6c 65 73 20 61 72 65 20 72 65 64 75 63   rules are reduc
01e0: 65 64 2e 20 20 54 68 65 20 72 6f 75 74 69 6e 65  ed.  The routine
01f0: 73 20 69 6e 20 74 68 69 73 20 66 69 6c 65 20 68  s in this file h
0200: 61 6e 64 6c 65 20 74 68 65 0a 2a 2a 20 66 6f 6c  andle the.** fol
0210: 6c 6f 77 69 6e 67 20 6b 69 6e 64 73 20 6f 66 20  lowing kinds of 
0220: 53 51 4c 20 73 79 6e 74 61 78 3a 0a 2a 2a 0a 2a  SQL syntax:.**.*
0230: 2a 20 20 20 20 20 43 52 45 41 54 45 20 54 41 42  *     CREATE TAB
0240: 4c 45 0a 2a 2a 20 20 20 20 20 44 52 4f 50 20 54  LE.**     DROP T
0250: 41 42 4c 45 0a 2a 2a 20 20 20 20 20 43 52 45 41  ABLE.**     CREA
0260: 54 45 20 49 4e 44 45 58 0a 2a 2a 20 20 20 20 20  TE INDEX.**     
0270: 44 52 4f 50 20 49 4e 44 45 58 0a 2a 2a 20 20 20  DROP INDEX.**   
0280: 20 20 63 72 65 61 74 69 6e 67 20 49 44 20 6c 69    creating ID li
0290: 73 74 73 0a 2a 2a 20 20 20 20 20 42 45 47 49 4e  sts.**     BEGIN
02a0: 20 54 52 41 4e 53 41 43 54 49 4f 4e 0a 2a 2a 20   TRANSACTION.** 
02b0: 20 20 20 20 43 4f 4d 4d 49 54 0a 2a 2a 20 20 20      COMMIT.**   
02c0: 20 20 52 4f 4c 4c 42 41 43 4b 0a 2a 2f 0a 23 69    ROLLBACK.*/.#i
02d0: 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 49 6e  nclude "sqliteIn
02e0: 74 2e 68 22 0a 0a 23 69 66 6e 64 65 66 20 53 51  t.h"..#ifndef SQ
02f0: 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
0300: 5f 43 41 43 48 45 0a 2f 2a 0a 2a 2a 20 54 68 65  _CACHE./*.** The
0310: 20 54 61 62 6c 65 4c 6f 63 6b 20 73 74 72 75 63   TableLock struc
0320: 74 75 72 65 20 69 73 20 6f 6e 6c 79 20 75 73 65  ture is only use
0330: 64 20 62 79 20 74 68 65 20 73 71 6c 69 74 65 33  d by the sqlite3
0340: 54 61 62 6c 65 4c 6f 63 6b 28 29 20 61 6e 64 0a  TableLock() and.
0350: 2a 2a 20 63 6f 64 65 54 61 62 6c 65 4c 6f 63 6b  ** codeTableLock
0360: 73 28 29 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 2a  s() functions..*
0370: 2f 0a 73 74 72 75 63 74 20 54 61 62 6c 65 4c 6f  /.struct TableLo
0380: 63 6b 20 7b 0a 20 20 69 6e 74 20 69 44 62 3b 20  ck {.  int iDb; 
0390: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
03a0: 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74  he database cont
03b0: 61 69 6e 69 6e 67 20 74 68 65 20 74 61 62 6c 65  aining the table
03c0: 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64 20 2a 2f   to be locked */
03d0: 0a 20 20 69 6e 74 20 69 54 61 62 3b 20 20 20 20  .  int iTab;    
03e0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72          /* The r
03f0: 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 68 65 20  oot page of the 
0400: 74 61 62 6c 65 20 74 6f 20 62 65 20 6c 6f 63 6b  table to be lock
0410: 65 64 20 2a 2f 0a 20 20 75 38 20 69 73 57 72 69  ed */.  u8 isWri
0420: 74 65 4c 6f 63 6b 3b 20 20 20 20 20 20 2f 2a 20  teLock;      /* 
0430: 54 72 75 65 20 66 6f 72 20 77 72 69 74 65 20 6c  True for write l
0440: 6f 63 6b 2e 20 20 46 61 6c 73 65 20 66 6f 72 20  ock.  False for 
0450: 61 20 72 65 61 64 20 6c 6f 63 6b 20 2a 2f 0a 20  a read lock */. 
0460: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
0470: 6d 65 3b 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66  me;   /* Name of
0480: 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 7d 3b   the table */.};
0490: 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6f 72 64 20 74  ../*.** Record t
04a0: 68 65 20 66 61 63 74 20 74 68 61 74 20 77 65 20  he fact that we 
04b0: 77 61 6e 74 20 74 6f 20 6c 6f 63 6b 20 61 20 74  want to lock a t
04c0: 61 62 6c 65 20 61 74 20 72 75 6e 2d 74 69 6d 65  able at run-time
04d0: 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 61  .  .**.** The ta
04e0: 62 6c 65 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64  ble to be locked
04f0: 20 68 61 73 20 72 6f 6f 74 20 70 61 67 65 20 69   has root page i
0500: 54 61 62 20 61 6e 64 20 69 73 20 66 6f 75 6e 64  Tab and is found
0510: 20 69 6e 20 64 61 74 61 62 61 73 65 20 69 44 62   in database iDb
0520: 2e 0a 2a 2a 20 41 20 72 65 61 64 20 6f 72 20 61  ..** A read or a
0530: 20 77 72 69 74 65 20 6c 6f 63 6b 20 63 61 6e 20   write lock can 
0540: 62 65 20 74 61 6b 65 6e 20 64 65 70 65 6e 64 69  be taken dependi
0550: 6e 67 20 6f 6e 20 69 73 57 72 69 74 65 6c 6f 63  ng on isWriteloc
0560: 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  k..**.** This ro
0570: 75 74 69 6e 65 20 6a 75 73 74 20 72 65 63 6f 72  utine just recor
0580: 64 73 20 74 68 65 20 66 61 63 74 20 74 68 61 74  ds the fact that
0590: 20 74 68 65 20 6c 6f 63 6b 20 69 73 20 64 65 73   the lock is des
05a0: 69 72 65 64 2e 20 20 54 68 65 0a 2a 2a 20 63 6f  ired.  The.** co
05b0: 64 65 20 74 6f 20 6d 61 6b 65 20 74 68 65 20 6c  de to make the l
05c0: 6f 63 6b 20 6f 63 63 75 72 20 69 73 20 67 65 6e  ock occur is gen
05d0: 65 72 61 74 65 64 20 62 79 20 61 20 6c 61 74 65  erated by a late
05e0: 72 20 63 61 6c 6c 20 74 6f 0a 2a 2a 20 63 6f 64  r call to.** cod
05f0: 65 54 61 62 6c 65 4c 6f 63 6b 73 28 29 20 77 68  eTableLocks() wh
0600: 69 63 68 20 6f 63 63 75 72 73 20 64 75 72 69 6e  ich occurs durin
0610: 67 20 73 71 6c 69 74 65 33 46 69 6e 69 73 68 43  g sqlite3FinishC
0620: 6f 64 69 6e 67 28 29 2e 0a 2a 2f 0a 76 6f 69 64  oding()..*/.void
0630: 20 73 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63   sqlite3TableLoc
0640: 6b 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  k(.  Parse *pPar
0650: 73 65 2c 20 20 20 20 20 2f 2a 20 50 61 72 73 69  se,     /* Parsi
0660: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
0670: 69 6e 74 20 69 44 62 2c 20 20 20 20 20 20 20 20  int iDb,        
0680: 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74     /* Index of t
0690: 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74  he database cont
06a0: 61 69 6e 69 6e 67 20 74 68 65 20 74 61 62 6c 65  aining the table
06b0: 20 74 6f 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 6e   to lock */.  in
06c0: 74 20 69 54 61 62 2c 20 20 20 20 20 20 20 20 20  t iTab,         
06d0: 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20 6e 75   /* Root page nu
06e0: 6d 62 65 72 20 6f 66 20 74 68 65 20 74 61 62 6c  mber of the tabl
06f0: 65 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64 20 2a  e to be locked *
0700: 2f 0a 20 20 75 38 20 69 73 57 72 69 74 65 4c 6f  /.  u8 isWriteLo
0710: 63 6b 2c 20 20 20 20 2f 2a 20 54 72 75 65 20 66  ck,    /* True f
0720: 6f 72 20 61 20 77 72 69 74 65 20 6c 6f 63 6b 20  or a write lock 
0730: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
0740: 2a 7a 4e 61 6d 65 20 20 2f 2a 20 4e 61 6d 65 20  *zName  /* Name 
0750: 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20  of the table to 
0760: 62 65 20 6c 6f 63 6b 65 64 20 2a 2f 0a 29 7b 0a  be locked */.){.
0770: 20 20 50 61 72 73 65 20 2a 70 54 6f 70 6c 65 76    Parse *pToplev
0780: 65 6c 20 3d 20 73 71 6c 69 74 65 33 50 61 72 73  el = sqlite3Pars
0790: 65 54 6f 70 6c 65 76 65 6c 28 70 50 61 72 73 65  eToplevel(pParse
07a0: 29 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e  );.  int i;.  in
07b0: 74 20 6e 42 79 74 65 73 3b 0a 20 20 54 61 62 6c  t nBytes;.  Tabl
07c0: 65 4c 6f 63 6b 20 2a 70 3b 0a 20 20 61 73 73 65  eLock *p;.  asse
07d0: 72 74 28 20 69 44 62 3e 3d 30 20 29 3b 0a 0a 20  rt( iDb>=0 );.. 
07e0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 6f 70   for(i=0; i<pTop
07f0: 6c 65 76 65 6c 2d 3e 6e 54 61 62 6c 65 4c 6f 63  level->nTableLoc
0800: 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70 20 3d  k; i++){.    p =
0810: 20 26 70 54 6f 70 6c 65 76 65 6c 2d 3e 61 54 61   &pToplevel->aTa
0820: 62 6c 65 4c 6f 63 6b 5b 69 5d 3b 0a 20 20 20 20  bleLock[i];.    
0830: 69 66 28 20 70 2d 3e 69 44 62 3d 3d 69 44 62 20  if( p->iDb==iDb 
0840: 26 26 20 70 2d 3e 69 54 61 62 3d 3d 69 54 61 62  && p->iTab==iTab
0850: 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 69 73 57   ){.      p->isW
0860: 72 69 74 65 4c 6f 63 6b 20 3d 20 28 70 2d 3e 69  riteLock = (p->i
0870: 73 57 72 69 74 65 4c 6f 63 6b 20 7c 7c 20 69 73  sWriteLock || is
0880: 57 72 69 74 65 4c 6f 63 6b 29 3b 0a 20 20 20 20  WriteLock);.    
0890: 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a    return;.    }.
08a0: 20 20 7d 0a 0a 20 20 6e 42 79 74 65 73 20 3d 20    }..  nBytes = 
08b0: 73 69 7a 65 6f 66 28 54 61 62 6c 65 4c 6f 63 6b  sizeof(TableLock
08c0: 29 20 2a 20 28 70 54 6f 70 6c 65 76 65 6c 2d 3e  ) * (pToplevel->
08d0: 6e 54 61 62 6c 65 4c 6f 63 6b 2b 31 29 3b 0a 20  nTableLock+1);. 
08e0: 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 61 54 61 62   pToplevel->aTab
08f0: 6c 65 4c 6f 63 6b 20 3d 0a 20 20 20 20 20 20 73  leLock =.      s
0900: 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 4f  qlite3DbReallocO
0910: 72 46 72 65 65 28 70 54 6f 70 6c 65 76 65 6c 2d  rFree(pToplevel-
0920: 3e 64 62 2c 20 70 54 6f 70 6c 65 76 65 6c 2d 3e  >db, pToplevel->
0930: 61 54 61 62 6c 65 4c 6f 63 6b 2c 20 6e 42 79 74  aTableLock, nByt
0940: 65 73 29 3b 0a 20 20 69 66 28 20 70 54 6f 70 6c  es);.  if( pTopl
0950: 65 76 65 6c 2d 3e 61 54 61 62 6c 65 4c 6f 63 6b  evel->aTableLock
0960: 20 29 7b 0a 20 20 20 20 70 20 3d 20 26 70 54 6f   ){.    p = &pTo
0970: 70 6c 65 76 65 6c 2d 3e 61 54 61 62 6c 65 4c 6f  plevel->aTableLo
0980: 63 6b 5b 70 54 6f 70 6c 65 76 65 6c 2d 3e 6e 54  ck[pToplevel->nT
0990: 61 62 6c 65 4c 6f 63 6b 2b 2b 5d 3b 0a 20 20 20  ableLock++];.   
09a0: 20 70 2d 3e 69 44 62 20 3d 20 69 44 62 3b 0a 20   p->iDb = iDb;. 
09b0: 20 20 20 70 2d 3e 69 54 61 62 20 3d 20 69 54 61     p->iTab = iTa
09c0: 62 3b 0a 20 20 20 20 70 2d 3e 69 73 57 72 69 74  b;.    p->isWrit
09d0: 65 4c 6f 63 6b 20 3d 20 69 73 57 72 69 74 65 4c  eLock = isWriteL
09e0: 6f 63 6b 3b 0a 20 20 20 20 70 2d 3e 7a 4e 61 6d  ock;.    p->zNam
09f0: 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20 7d 65 6c  e = zName;.  }el
0a00: 73 65 7b 0a 20 20 20 20 70 54 6f 70 6c 65 76 65  se{.    pTopleve
0a10: 6c 2d 3e 6e 54 61 62 6c 65 4c 6f 63 6b 20 3d 20  l->nTableLock = 
0a20: 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 6f  0;.    sqlite3Oo
0a30: 6d 46 61 75 6c 74 28 70 54 6f 70 6c 65 76 65 6c  mFault(pToplevel
0a40: 2d 3e 64 62 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  ->db);.  }.}../*
0a50: 0a 2a 2a 20 43 6f 64 65 20 61 6e 20 4f 50 5f 54  .** Code an OP_T
0a60: 61 62 6c 65 4c 6f 63 6b 20 69 6e 73 74 72 75 63  ableLock instruc
0a70: 74 69 6f 6e 20 66 6f 72 20 65 61 63 68 20 74 61  tion for each ta
0a80: 62 6c 65 20 6c 6f 63 6b 65 64 20 62 79 20 74 68  ble locked by th
0a90: 65 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 28  e.** statement (
0aa0: 63 6f 6e 66 69 67 75 72 65 64 20 62 79 20 63 61  configured by ca
0ab0: 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 54 61  lls to sqlite3Ta
0ac0: 62 6c 65 4c 6f 63 6b 28 29 29 2e 0a 2a 2f 0a 73  bleLock())..*/.s
0ad0: 74 61 74 69 63 20 76 6f 69 64 20 63 6f 64 65 54  tatic void codeT
0ae0: 61 62 6c 65 4c 6f 63 6b 73 28 50 61 72 73 65 20  ableLocks(Parse 
0af0: 2a 70 50 61 72 73 65 29 7b 0a 20 20 69 6e 74 20  *pParse){.  int 
0b00: 69 3b 0a 20 20 56 64 62 65 20 2a 70 56 64 62 65  i;.  Vdbe *pVdbe
0b10: 3b 20 0a 0a 20 20 70 56 64 62 65 20 3d 20 73 71  ; ..  pVdbe = sq
0b20: 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
0b30: 72 73 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20  rse);.  assert( 
0b40: 70 56 64 62 65 21 3d 30 20 29 3b 20 2f 2a 20 73  pVdbe!=0 ); /* s
0b50: 71 6c 69 74 65 33 47 65 74 56 64 62 65 20 63 61  qlite3GetVdbe ca
0b60: 6e 6e 6f 74 20 66 61 69 6c 3a 20 56 44 42 45 20  nnot fail: VDBE 
0b70: 61 6c 72 65 61 64 79 20 61 6c 6c 6f 63 61 74 65  already allocate
0b80: 64 20 2a 2f 0a 0a 20 20 66 6f 72 28 69 3d 30 3b  d */..  for(i=0;
0b90: 20 69 3c 70 50 61 72 73 65 2d 3e 6e 54 61 62 6c   i<pParse->nTabl
0ba0: 65 4c 6f 63 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20  eLock; i++){.   
0bb0: 20 54 61 62 6c 65 4c 6f 63 6b 20 2a 70 20 3d 20   TableLock *p = 
0bc0: 26 70 50 61 72 73 65 2d 3e 61 54 61 62 6c 65 4c  &pParse->aTableL
0bd0: 6f 63 6b 5b 69 5d 3b 0a 20 20 20 20 69 6e 74 20  ock[i];.    int 
0be0: 70 31 20 3d 20 70 2d 3e 69 44 62 3b 0a 20 20 20  p1 = p->iDb;.   
0bf0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
0c00: 70 34 28 70 56 64 62 65 2c 20 4f 50 5f 54 61 62  p4(pVdbe, OP_Tab
0c10: 6c 65 4c 6f 63 6b 2c 20 70 31 2c 20 70 2d 3e 69  leLock, p1, p->i
0c20: 54 61 62 2c 20 70 2d 3e 69 73 57 72 69 74 65 4c  Tab, p->isWriteL
0c30: 6f 63 6b 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ock,.           
0c40: 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 7a 4e             p->zN
0c50: 61 6d 65 2c 20 50 34 5f 53 54 41 54 49 43 29 3b  ame, P4_STATIC);
0c60: 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 20 20 23  .  }.}.#else.  #
0c70: 64 65 66 69 6e 65 20 63 6f 64 65 54 61 62 6c 65  define codeTable
0c80: 4c 6f 63 6b 73 28 78 29 0a 23 65 6e 64 69 66 0a  Locks(x).#endif.
0c90: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52  ./*.** Return TR
0ca0: 55 45 20 69 66 20 74 68 65 20 67 69 76 65 6e 20  UE if the given 
0cb0: 79 44 62 4d 61 73 6b 20 6f 62 6a 65 63 74 20 69  yDbMask object i
0cc0: 73 20 65 6d 70 74 79 20 2d 20 69 66 20 69 74 20  s empty - if it 
0cd0: 63 6f 6e 74 61 69 6e 73 20 6e 6f 0a 2a 2a 20 31  contains no.** 1
0ce0: 20 62 69 74 73 2e 20 20 54 68 69 73 20 72 6f 75   bits.  This rou
0cf0: 74 69 6e 65 20 69 73 20 75 73 65 64 20 62 79 20  tine is used by 
0d00: 74 68 65 20 44 62 4d 61 73 6b 41 6c 6c 5a 65 72  the DbMaskAllZer
0d10: 6f 28 29 20 61 6e 64 20 44 62 4d 61 73 6b 4e 6f  o() and DbMaskNo
0d20: 74 5a 65 72 6f 28 29 0a 2a 2a 20 6d 61 63 72 6f  tZero().** macro
0d30: 73 20 77 68 65 6e 20 53 51 4c 49 54 45 5f 4d 41  s when SQLITE_MA
0d40: 58 5f 41 54 54 41 43 48 45 44 20 69 73 20 67 72  X_ATTACHED is gr
0d50: 65 61 74 65 72 20 74 68 61 6e 20 33 30 2e 0a 2a  eater than 30..*
0d60: 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  /.#if SQLITE_MAX
0d70: 5f 41 54 54 41 43 48 45 44 3e 33 30 0a 69 6e 74  _ATTACHED>30.int
0d80: 20 73 71 6c 69 74 65 33 44 62 4d 61 73 6b 41 6c   sqlite3DbMaskAl
0d90: 6c 5a 65 72 6f 28 79 44 62 4d 61 73 6b 20 6d 29  lZero(yDbMask m)
0da0: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72  {.  int i;.  for
0db0: 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 79  (i=0; i<sizeof(y
0dc0: 44 62 4d 61 73 6b 29 3b 20 69 2b 2b 29 20 69 66  DbMask); i++) if
0dd0: 28 20 6d 5b 69 5d 20 29 20 72 65 74 75 72 6e 20  ( m[i] ) return 
0de0: 30 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d  0;.  return 1;.}
0df0: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54  .#endif../*.** T
0e00: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
0e10: 61 6c 6c 65 64 20 61 66 74 65 72 20 61 20 73 69  alled after a si
0e20: 6e 67 6c 65 20 53 51 4c 20 73 74 61 74 65 6d 65  ngle SQL stateme
0e30: 6e 74 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20 70  nt has been.** p
0e40: 61 72 73 65 64 20 61 6e 64 20 61 20 56 44 42 45  arsed and a VDBE
0e50: 20 70 72 6f 67 72 61 6d 20 74 6f 20 65 78 65 63   program to exec
0e60: 75 74 65 20 74 68 61 74 20 73 74 61 74 65 6d 65  ute that stateme
0e70: 6e 74 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20 70  nt has been.** p
0e80: 72 65 70 61 72 65 64 2e 20 20 54 68 69 73 20 72  repared.  This r
0e90: 6f 75 74 69 6e 65 20 70 75 74 73 20 74 68 65 20  outine puts the 
0ea0: 66 69 6e 69 73 68 69 6e 67 20 74 6f 75 63 68 65  finishing touche
0eb0: 73 20 6f 6e 20 74 68 65 0a 2a 2a 20 56 44 42 45  s on the.** VDBE
0ec0: 20 70 72 6f 67 72 61 6d 20 61 6e 64 20 72 65 73   program and res
0ed0: 65 74 73 20 74 68 65 20 70 50 61 72 73 65 20 73  ets the pParse s
0ee0: 74 72 75 63 74 75 72 65 20 66 6f 72 20 74 68 65  tructure for the
0ef0: 20 6e 65 78 74 0a 2a 2a 20 70 61 72 73 65 2e 0a   next.** parse..
0f00: 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20  **.** Note that 
0f10: 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  if an error occu
0f20: 72 72 65 64 2c 20 69 74 20 6d 69 67 68 74 20 62  rred, it might b
0f30: 65 20 74 68 65 20 63 61 73 65 20 74 68 61 74 0a  e the case that.
0f40: 2a 2a 20 6e 6f 20 56 44 42 45 20 63 6f 64 65 20  ** no VDBE code 
0f50: 77 61 73 20 67 65 6e 65 72 61 74 65 64 2e 0a 2a  was generated..*
0f60: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 46 69  /.void sqlite3Fi
0f70: 6e 69 73 68 43 6f 64 69 6e 67 28 50 61 72 73 65  nishCoding(Parse
0f80: 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 73 71 6c   *pParse){.  sql
0f90: 69 74 65 33 20 2a 64 62 3b 0a 20 20 56 64 62 65  ite3 *db;.  Vdbe
0fa0: 20 2a 76 3b 0a 0a 20 20 61 73 73 65 72 74 28 20   *v;..  assert( 
0fb0: 70 50 61 72 73 65 2d 3e 70 54 6f 70 6c 65 76 65  pParse->pTopleve
0fc0: 6c 3d 3d 30 20 29 3b 0a 20 20 64 62 20 3d 20 70  l==0 );.  db = p
0fd0: 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28  Parse->db;.  if(
0fe0: 20 70 50 61 72 73 65 2d 3e 6e 65 73 74 65 64 20   pParse->nested 
0ff0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
1000: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
1010: 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72   || pParse->nErr
1020: 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61 72   ){.    if( pPar
1030: 73 65 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  se->rc==SQLITE_O
1040: 4b 20 29 20 70 50 61 72 73 65 2d 3e 72 63 20 3d  K ) pParse->rc =
1050: 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
1060: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a     return;.  }..
1070: 20 20 2f 2a 20 42 65 67 69 6e 20 62 79 20 67 65    /* Begin by ge
1080: 6e 65 72 61 74 69 6e 67 20 73 6f 6d 65 20 74 65  nerating some te
1090: 72 6d 69 6e 61 74 69 6f 6e 20 63 6f 64 65 20 61  rmination code a
10a0: 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
10b0: 0a 20 20 2a 2a 20 76 64 62 65 20 70 72 6f 67 72  .  ** vdbe progr
10c0: 61 6d 0a 20 20 2a 2f 0a 20 20 76 20 3d 20 73 71  am.  */.  v = sq
10d0: 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
10e0: 72 73 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20  rse);.  assert( 
10f0: 21 70 50 61 72 73 65 2d 3e 69 73 4d 75 6c 74 69  !pParse->isMulti
1100: 57 72 69 74 65 20 0a 20 20 20 20 20 20 20 7c 7c  Write .       ||
1110: 20 73 71 6c 69 74 65 33 56 64 62 65 41 73 73 65   sqlite3VdbeAsse
1120: 72 74 4d 61 79 41 62 6f 72 74 28 76 2c 20 70 50  rtMayAbort(v, pP
1130: 61 72 73 65 2d 3e 6d 61 79 41 62 6f 72 74 29 29  arse->mayAbort))
1140: 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20  ;.  if( v ){.   
1150: 20 77 68 69 6c 65 28 20 73 71 6c 69 74 65 33 56   while( sqlite3V
1160: 64 62 65 44 65 6c 65 74 65 50 72 69 6f 72 4f 70  dbeDeletePriorOp
1170: 63 6f 64 65 28 76 2c 20 4f 50 5f 43 6c 6f 73 65  code(v, OP_Close
1180: 29 20 29 7b 7d 0a 20 20 20 20 73 71 6c 69 74 65  ) ){}.    sqlite
1190: 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f  3VdbeAddOp0(v, O
11a0: 50 5f 48 61 6c 74 29 3b 0a 0a 23 69 66 20 53 51  P_Halt);..#if SQ
11b0: 4c 49 54 45 5f 55 53 45 52 5f 41 55 54 48 45 4e  LITE_USER_AUTHEN
11c0: 54 49 43 41 54 49 4f 4e 0a 20 20 20 20 69 66 28  TICATION.    if(
11d0: 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 6c 65 4c   pParse->nTableL
11e0: 6f 63 6b 3e 30 20 26 26 20 64 62 2d 3e 69 6e 69  ock>0 && db->ini
11f0: 74 2e 62 75 73 79 3d 3d 30 20 29 7b 0a 20 20 20  t.busy==0 ){.   
1200: 20 20 20 73 71 6c 69 74 65 33 55 73 65 72 41 75     sqlite3UserAu
1210: 74 68 49 6e 69 74 28 64 62 29 3b 0a 20 20 20 20  thInit(db);.    
1220: 20 20 69 66 28 20 64 62 2d 3e 61 75 74 68 2e 61    if( db->auth.a
1230: 75 74 68 4c 65 76 65 6c 3c 55 41 55 54 48 5f 55  uthLevel<UAUTH_U
1240: 73 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ser ){.        p
1250: 50 61 72 73 65 2d 3e 72 63 20 3d 20 53 51 4c 49  Parse->rc = SQLI
1260: 54 45 5f 41 55 54 48 5f 55 53 45 52 3b 0a 20 20  TE_AUTH_USER;.  
1270: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
1280: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 75  orMsg(pParse, "u
1290: 73 65 72 20 6e 6f 74 20 61 75 74 68 65 6e 74 69  ser not authenti
12a0: 63 61 74 65 64 22 29 3b 0a 20 20 20 20 20 20 20  cated");.       
12b0: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d   return;.      }
12c0: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  .    }.#endif.. 
12d0: 20 20 20 2f 2a 20 54 68 65 20 63 6f 6f 6b 69 65     /* The cookie
12e0: 20 6d 61 73 6b 20 63 6f 6e 74 61 69 6e 73 20 6f   mask contains o
12f0: 6e 65 20 62 69 74 20 66 6f 72 20 65 61 63 68 20  ne bit for each 
1300: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6f 70  database file op
1310: 65 6e 2e 0a 20 20 20 20 2a 2a 20 28 42 69 74 20  en..    ** (Bit 
1320: 30 20 69 73 20 66 6f 72 20 6d 61 69 6e 2c 20 62  0 is for main, b
1330: 69 74 20 31 20 69 73 20 66 6f 72 20 74 65 6d 70  it 1 is for temp
1340: 2c 20 61 6e 64 20 73 6f 20 66 6f 72 74 68 2e 29  , and so forth.)
1350: 20 20 42 69 74 73 20 61 72 65 0a 20 20 20 20 2a    Bits are.    *
1360: 2a 20 73 65 74 20 66 6f 72 20 65 61 63 68 20 64  * set for each d
1370: 61 74 61 62 61 73 65 20 74 68 61 74 20 69 73 20  atabase that is 
1380: 75 73 65 64 2e 20 20 47 65 6e 65 72 61 74 65 20  used.  Generate 
1390: 63 6f 64 65 20 74 6f 20 73 74 61 72 74 20 61 0a  code to start a.
13a0: 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69      ** transacti
13b0: 6f 6e 20 6f 6e 20 65 61 63 68 20 75 73 65 64 20  on on each used 
13c0: 64 61 74 61 62 61 73 65 20 61 6e 64 20 74 6f 20  database and to 
13d0: 76 65 72 69 66 79 20 74 68 65 20 73 63 68 65 6d  verify the schem
13e0: 61 20 63 6f 6f 6b 69 65 0a 20 20 20 20 2a 2a 20  a cookie.    ** 
13f0: 6f 6e 20 65 61 63 68 20 75 73 65 64 20 64 61 74  on each used dat
1400: 61 62 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20  abase..    */.  
1410: 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
1420: 46 61 69 6c 65 64 3d 3d 30 20 0a 20 20 20 20 20  Failed==0 .     
1430: 26 26 20 28 44 62 4d 61 73 6b 4e 6f 6e 5a 65 72  && (DbMaskNonZer
1440: 6f 28 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65  o(pParse->cookie
1450: 4d 61 73 6b 29 20 7c 7c 20 70 50 61 72 73 65 2d  Mask) || pParse-
1460: 3e 70 43 6f 6e 73 74 45 78 70 72 29 0a 20 20 20  >pConstExpr).   
1470: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 44   ){.      int iD
1480: 62 2c 20 69 3b 0a 20 20 20 20 20 20 61 73 73 65  b, i;.      asse
1490: 72 74 28 20 73 71 6c 69 74 65 33 56 64 62 65 47  rt( sqlite3VdbeG
14a0: 65 74 4f 70 28 76 2c 20 30 29 2d 3e 6f 70 63 6f  etOp(v, 0)->opco
14b0: 64 65 3d 3d 4f 50 5f 49 6e 69 74 20 29 3b 0a 20  de==OP_Init );. 
14c0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
14d0: 4a 75 6d 70 48 65 72 65 28 76 2c 20 30 29 3b 0a  JumpHere(v, 0);.
14e0: 20 20 20 20 20 20 66 6f 72 28 69 44 62 3d 30 3b        for(iDb=0;
14f0: 20 69 44 62 3c 64 62 2d 3e 6e 44 62 3b 20 69 44   iDb<db->nDb; iD
1500: 62 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66  b++){.        if
1510: 28 20 44 62 4d 61 73 6b 54 65 73 74 28 70 50 61  ( DbMaskTest(pPa
1520: 72 73 65 2d 3e 63 6f 6f 6b 69 65 4d 61 73 6b 2c  rse->cookieMask,
1530: 20 69 44 62 29 3d 3d 30 20 29 20 63 6f 6e 74 69   iDb)==0 ) conti
1540: 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  nue;.        sql
1550: 69 74 65 33 56 64 62 65 55 73 65 73 42 74 72 65  ite3VdbeUsesBtre
1560: 65 28 76 2c 20 69 44 62 29 3b 0a 20 20 20 20 20  e(v, iDb);.     
1570: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1580: 64 4f 70 34 49 6e 74 28 76 2c 0a 20 20 20 20 20  dOp4Int(v,.     
1590: 20 20 20 20 20 4f 50 5f 54 72 61 6e 73 61 63 74       OP_Transact
15a0: 69 6f 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20  ion,            
15b0: 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 63 6f 64          /* Opcod
15c0: 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69  e */.          i
15d0: 44 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  Db,             
15e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15f0: 20 20 2f 2a 20 50 31 20 2a 2f 0a 20 20 20 20 20    /* P1 */.     
1600: 20 20 20 20 20 44 62 4d 61 73 6b 54 65 73 74 28       DbMaskTest(
1610: 70 50 61 72 73 65 2d 3e 77 72 69 74 65 4d 61 73  pParse->writeMas
1620: 6b 2c 69 44 62 29 2c 20 2f 2a 20 50 32 20 2a 2f  k,iDb), /* P2 */
1630: 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 72 73  .          pPars
1640: 65 2d 3e 63 6f 6f 6b 69 65 56 61 6c 75 65 5b 69  e->cookieValue[i
1650: 44 62 5d 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  Db],          /*
1660: 20 50 33 20 2a 2f 0a 20 20 20 20 20 20 20 20 20   P3 */.         
1670: 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53   db->aDb[iDb].pS
1680: 63 68 65 6d 61 2d 3e 69 47 65 6e 65 72 61 74 69  chema->iGenerati
1690: 6f 6e 20 20 2f 2a 20 50 34 20 2a 2f 0a 20 20 20  on  /* P4 */.   
16a0: 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20       );.        
16b0: 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73  if( db->init.bus
16c0: 79 3d 3d 30 20 29 20 73 71 6c 69 74 65 33 56 64  y==0 ) sqlite3Vd
16d0: 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 31 29  beChangeP5(v, 1)
16e0: 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f  ;.        VdbeCo
16f0: 6d 6d 65 6e 74 28 28 76 2c 0a 20 20 20 20 20 20  mment((v,.      
1700: 20 20 20 20 20 20 20 20 22 75 73 65 73 53 74 6d          "usesStm
1710: 74 4a 6f 75 72 6e 61 6c 3d 25 64 22 2c 20 70 50  tJournal=%d", pP
1720: 61 72 73 65 2d 3e 6d 61 79 41 62 6f 72 74 20 26  arse->mayAbort &
1730: 26 20 70 50 61 72 73 65 2d 3e 69 73 4d 75 6c 74  & pParse->isMult
1740: 69 57 72 69 74 65 29 29 3b 0a 20 20 20 20 20 20  iWrite));.      
1750: 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
1760: 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
1770: 4c 45 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  LE.      for(i=0
1780: 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e 56 74 61  ; i<pParse->nVta
1790: 62 4c 6f 63 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20  bLock; i++){.   
17a0: 20 20 20 20 20 63 68 61 72 20 2a 76 74 61 62 20       char *vtab 
17b0: 3d 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65  = (char *)sqlite
17c0: 33 47 65 74 56 54 61 62 6c 65 28 64 62 2c 20 70  3GetVTable(db, p
17d0: 50 61 72 73 65 2d 3e 61 70 56 74 61 62 4c 6f 63  Parse->apVtabLoc
17e0: 6b 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 73  k[i]);.        s
17f0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
1800: 28 76 2c 20 4f 50 5f 56 42 65 67 69 6e 2c 20 30  (v, OP_VBegin, 0
1810: 2c 20 30 2c 20 30 2c 20 76 74 61 62 2c 20 50 34  , 0, 0, vtab, P4
1820: 5f 56 54 41 42 29 3b 0a 20 20 20 20 20 20 7d 0a  _VTAB);.      }.
1830: 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 56        pParse->nV
1840: 74 61 62 4c 6f 63 6b 20 3d 20 30 3b 0a 23 65 6e  tabLock = 0;.#en
1850: 64 69 66 0a 0a 20 20 20 20 20 20 2f 2a 20 4f 6e  dif..      /* On
1860: 63 65 20 61 6c 6c 20 74 68 65 20 63 6f 6f 6b 69  ce all the cooki
1870: 65 73 20 68 61 76 65 20 62 65 65 6e 20 76 65 72  es have been ver
1880: 69 66 69 65 64 20 61 6e 64 20 74 72 61 6e 73 61  ified and transa
1890: 63 74 69 6f 6e 73 20 6f 70 65 6e 65 64 2c 20 0a  ctions opened, .
18a0: 20 20 20 20 20 20 2a 2a 20 6f 62 74 61 69 6e 20        ** obtain 
18b0: 74 68 65 20 72 65 71 75 69 72 65 64 20 74 61 62  the required tab
18c0: 6c 65 2d 6c 6f 63 6b 73 2e 20 54 68 69 73 20 69  le-locks. This i
18d0: 73 20 61 20 6e 6f 2d 6f 70 20 75 6e 6c 65 73 73  s a no-op unless
18e0: 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 73   the .      ** s
18f0: 68 61 72 65 64 2d 63 61 63 68 65 20 66 65 61 74  hared-cache feat
1900: 75 72 65 20 69 73 20 65 6e 61 62 6c 65 64 2e 0a  ure is enabled..
1910: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 63        */.      c
1920: 6f 64 65 54 61 62 6c 65 4c 6f 63 6b 73 28 70 50  odeTableLocks(pP
1930: 61 72 73 65 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  arse);..      /*
1940: 20 49 6e 69 74 69 61 6c 69 7a 65 20 61 6e 79 20   Initialize any 
1950: 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 20 64 61  AUTOINCREMENT da
1960: 74 61 20 73 74 72 75 63 74 75 72 65 73 20 72 65  ta structures re
1970: 71 75 69 72 65 64 2e 0a 20 20 20 20 20 20 2a 2f  quired..      */
1980: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 41 75  .      sqlite3Au
1990: 74 6f 69 6e 63 72 65 6d 65 6e 74 42 65 67 69 6e  toincrementBegin
19a0: 28 70 50 61 72 73 65 29 3b 0a 0a 20 20 20 20 20  (pParse);..     
19b0: 20 2f 2a 20 43 6f 64 65 20 63 6f 6e 73 74 61 6e   /* Code constan
19c0: 74 20 65 78 70 72 65 73 73 69 6f 6e 73 20 74 68  t expressions th
19d0: 61 74 20 77 68 65 72 65 20 66 61 63 74 6f 72 65  at where factore
19e0: 64 20 6f 75 74 20 6f 66 20 69 6e 6e 65 72 20 6c  d out of inner l
19f0: 6f 6f 70 73 20 2a 2f 0a 20 20 20 20 20 20 69 66  oops */.      if
1a00: 28 20 70 50 61 72 73 65 2d 3e 70 43 6f 6e 73 74  ( pParse->pConst
1a10: 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20  Expr ){.        
1a20: 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 20 3d 20  ExprList *pEL = 
1a30: 70 50 61 72 73 65 2d 3e 70 43 6f 6e 73 74 45 78  pParse->pConstEx
1a40: 70 72 3b 0a 20 20 20 20 20 20 20 20 70 50 61 72  pr;.        pPar
1a50: 73 65 2d 3e 6f 6b 43 6f 6e 73 74 46 61 63 74 6f  se->okConstFacto
1a60: 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 66  r = 0;.        f
1a70: 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c 2d 3e 6e  or(i=0; i<pEL->n
1a80: 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
1a90: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
1aa0: 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45  rCode(pParse, pE
1ab0: 4c 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 70  L->a[i].pExpr, p
1ac0: 45 4c 2d 3e 61 5b 69 5d 2e 75 2e 69 43 6f 6e 73  EL->a[i].u.iCons
1ad0: 74 45 78 70 72 52 65 67 29 3b 0a 20 20 20 20 20  tExprReg);.     
1ae0: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20     }.      }..  
1af0: 20 20 20 20 2f 2a 20 46 69 6e 61 6c 6c 79 2c 20      /* Finally, 
1b00: 6a 75 6d 70 20 62 61 63 6b 20 74 6f 20 74 68 65  jump back to the
1b10: 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68   beginning of th
1b20: 65 20 65 78 65 63 75 74 61 62 6c 65 20 63 6f 64  e executable cod
1b30: 65 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69  e. */.      sqli
1b40: 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 31  te3VdbeGoto(v, 1
1b50: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 0a 20  );.    }.  }... 
1b60: 20 2f 2a 20 47 65 74 20 74 68 65 20 56 44 42 45   /* Get the VDBE
1b70: 20 70 72 6f 67 72 61 6d 20 72 65 61 64 79 20 66   program ready f
1b80: 6f 72 20 65 78 65 63 75 74 69 6f 6e 0a 20 20 2a  or execution.  *
1b90: 2f 0a 20 20 69 66 28 20 76 20 26 26 20 70 50 61  /.  if( v && pPa
1ba0: 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 26 26 20  rse->nErr==0 && 
1bb0: 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  !db->mallocFaile
1bc0: 64 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  d ){.    assert(
1bd0: 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65 4c   pParse->iCacheL
1be0: 65 76 65 6c 3d 3d 30 20 29 3b 20 20 2f 2a 20 44  evel==0 );  /* D
1bf0: 69 73 61 62 6c 65 73 20 61 6e 64 20 72 65 2d 65  isables and re-e
1c00: 6e 61 62 6c 65 73 20 6d 61 74 63 68 20 2a 2f 0a  nables match */.
1c10: 20 20 20 20 2f 2a 20 41 20 6d 69 6e 69 6d 75 6d      /* A minimum
1c20: 20 6f 66 20 6f 6e 65 20 63 75 72 73 6f 72 20 69   of one cursor i
1c30: 73 20 72 65 71 75 69 72 65 64 20 69 66 20 61 75  s required if au
1c40: 74 6f 69 6e 63 72 65 6d 65 6e 74 20 69 73 20 75  toincrement is u
1c50: 73 65 64 0a 20 20 20 20 2a 20 20 53 65 65 20 74  sed.    *  See t
1c60: 69 63 6b 65 74 20 5b 61 36 39 36 33 37 39 63 31  icket [a696379c1
1c70: 66 30 38 38 36 36 5d 20 2a 2f 0a 20 20 20 20 69  f08866] */.    i
1c80: 66 28 20 70 50 61 72 73 65 2d 3e 70 41 69 6e 63  f( pParse->pAinc
1c90: 21 3d 30 20 26 26 20 70 50 61 72 73 65 2d 3e 6e  !=0 && pParse->n
1ca0: 54 61 62 3d 3d 30 20 29 20 70 50 61 72 73 65 2d  Tab==0 ) pParse-
1cb0: 3e 6e 54 61 62 20 3d 20 31 3b 0a 20 20 20 20 73  >nTab = 1;.    s
1cc0: 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 52 65  qlite3VdbeMakeRe
1cd0: 61 64 79 28 76 2c 20 70 50 61 72 73 65 29 3b 0a  ady(v, pParse);.
1ce0: 20 20 20 20 70 50 61 72 73 65 2d 3e 72 63 20 3d      pParse->rc =
1cf0: 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20   SQLITE_DONE;.  
1d00: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 72 73  }else{.    pPars
1d10: 65 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 45  e->rc = SQLITE_E
1d20: 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  RROR;.  }..  /* 
1d30: 57 65 20 61 72 65 20 64 6f 6e 65 20 77 69 74 68  We are done with
1d40: 20 74 68 69 73 20 50 61 72 73 65 20 6f 62 6a 65   this Parse obje
1d50: 63 74 2e 20 54 68 65 72 65 20 69 73 20 6e 6f 20  ct. There is no 
1d60: 6e 65 65 64 20 74 6f 20 64 65 2d 69 6e 69 74 69  need to de-initi
1d70: 61 6c 69 7a 65 20 69 74 20 2a 2f 0a 23 69 66 20  alize it */.#if 
1d80: 30 0a 20 20 70 50 61 72 73 65 2d 3e 63 6f 6c 4e  0.  pParse->colN
1d90: 61 6d 65 73 53 65 74 20 3d 20 30 3b 0a 20 20 70  amesSet = 0;.  p
1da0: 50 61 72 73 65 2d 3e 6e 54 61 62 20 3d 20 30 3b  Parse->nTab = 0;
1db0: 0a 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20  .  pParse->nMem 
1dc0: 3d 20 30 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e  = 0;.  pParse->n
1dd0: 53 65 74 20 3d 20 30 3b 0a 20 20 70 50 61 72 73  Set = 0;.  pPars
1de0: 65 2d 3e 6e 56 61 72 20 3d 20 30 3b 0a 20 20 44  e->nVar = 0;.  D
1df0: 62 4d 61 73 6b 5a 65 72 6f 28 70 50 61 72 73 65  bMaskZero(pParse
1e00: 2d 3e 63 6f 6f 6b 69 65 4d 61 73 6b 29 3b 0a 23  ->cookieMask);.#
1e10: 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  endif.}../*.** R
1e20: 75 6e 20 74 68 65 20 70 61 72 73 65 72 20 61 6e  un the parser an
1e30: 64 20 63 6f 64 65 20 67 65 6e 65 72 61 74 6f 72  d code generator
1e40: 20 72 65 63 75 72 73 69 76 65 6c 79 20 69 6e 20   recursively in 
1e50: 6f 72 64 65 72 20 74 6f 20 67 65 6e 65 72 61 74  order to generat
1e60: 65 0a 2a 2a 20 63 6f 64 65 20 66 6f 72 20 74 68  e.** code for th
1e70: 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20  e SQL statement 
1e80: 67 69 76 65 6e 20 6f 6e 74 6f 20 74 68 65 20 65  given onto the e
1e90: 6e 64 20 6f 66 20 74 68 65 20 70 50 61 72 73 65  nd of the pParse
1ea0: 20 63 6f 6e 74 65 78 74 0a 2a 2a 20 63 75 72 72   context.** curr
1eb0: 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73  ently under cons
1ec0: 74 72 75 63 74 69 6f 6e 2e 20 20 57 68 65 6e 20  truction.  When 
1ed0: 74 68 65 20 70 61 72 73 65 72 20 69 73 20 72 75  the parser is ru
1ee0: 6e 20 72 65 63 75 72 73 69 76 65 6c 79 0a 2a 2a  n recursively.**
1ef0: 20 74 68 69 73 20 77 61 79 2c 20 74 68 65 20 66   this way, the f
1f00: 69 6e 61 6c 20 4f 50 5f 48 61 6c 74 20 69 73 20  inal OP_Halt is 
1f10: 6e 6f 74 20 61 70 70 65 6e 64 65 64 20 61 6e 64  not appended and
1f20: 20 6f 74 68 65 72 20 69 6e 69 74 69 61 6c 69 7a   other initializ
1f30: 61 74 69 6f 6e 0a 2a 2a 20 61 6e 64 20 66 69 6e  ation.** and fin
1f40: 61 6c 69 7a 61 74 69 6f 6e 20 73 74 65 70 73 20  alization steps 
1f50: 61 72 65 20 6f 6d 69 74 74 65 64 20 62 65 63 61  are omitted beca
1f60: 75 73 65 20 74 68 6f 73 65 20 61 72 65 20 68 61  use those are ha
1f70: 6e 64 6c 69 6e 67 20 62 79 20 74 68 65 0a 2a 2a  ndling by the.**
1f80: 20 6f 75 74 65 72 6d 6f 73 74 20 70 61 72 73 65   outermost parse
1f90: 72 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 20 65 76 65  r..**.** Not eve
1fa0: 72 79 74 68 69 6e 67 20 69 73 20 6e 65 73 74 61  rything is nesta
1fb0: 62 6c 65 2e 20 20 54 68 69 73 20 66 61 63 69 6c  ble.  This facil
1fc0: 69 74 79 20 69 73 20 64 65 73 69 67 6e 65 64 20  ity is designed 
1fd0: 74 6f 20 70 65 72 6d 69 74 0a 2a 2a 20 49 4e 53  to permit.** INS
1fe0: 45 52 54 2c 20 55 50 44 41 54 45 2c 20 61 6e 64  ERT, UPDATE, and
1ff0: 20 44 45 4c 45 54 45 20 6f 70 65 72 61 74 69 6f   DELETE operatio
2000: 6e 73 20 61 67 61 69 6e 73 74 20 53 51 4c 49 54  ns against SQLIT
2010: 45 5f 4d 41 53 54 45 52 2e 20 20 55 73 65 0a 2a  E_MASTER.  Use.*
2020: 2a 20 63 61 72 65 20 69 66 20 79 6f 75 20 64 65  * care if you de
2030: 63 69 64 65 20 74 6f 20 74 72 79 20 74 6f 20 75  cide to try to u
2040: 73 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  se this routine 
2050: 66 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 20 70  for some other p
2060: 75 72 70 6f 73 65 73 2e 0a 2a 2f 0a 76 6f 69 64  urposes..*/.void
2070: 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61   sqlite3NestedPa
2080: 72 73 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  rse(Parse *pPars
2090: 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  e, const char *z
20a0: 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20  Format, ...){.  
20b0: 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 63 68  va_list ap;.  ch
20c0: 61 72 20 2a 7a 53 71 6c 3b 0a 20 20 63 68 61 72  ar *zSql;.  char
20d0: 20 2a 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20   *zErrMsg = 0;. 
20e0: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
20f0: 50 61 72 73 65 2d 3e 64 62 3b 0a 23 20 64 65 66  Parse->db;.# def
2100: 69 6e 65 20 53 41 56 45 5f 53 5a 20 20 28 73 69  ine SAVE_SZ  (si
2110: 7a 65 6f 66 28 50 61 72 73 65 29 20 2d 20 6f 66  zeof(Parse) - of
2120: 66 73 65 74 6f 66 28 50 61 72 73 65 2c 6e 56 61  fsetof(Parse,nVa
2130: 72 29 29 0a 20 20 63 68 61 72 20 73 61 76 65 42  r)).  char saveB
2140: 75 66 5b 53 41 56 45 5f 53 5a 5d 3b 0a 0a 20 20  uf[SAVE_SZ];..  
2150: 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  if( pParse->nErr
2160: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73   ) return;.  ass
2170: 65 72 74 28 20 70 50 61 72 73 65 2d 3e 6e 65 73  ert( pParse->nes
2180: 74 65 64 3c 31 30 20 29 3b 20 20 2f 2a 20 4e 65  ted<10 );  /* Ne
2190: 73 74 69 6e 67 20 73 68 6f 75 6c 64 20 6f 6e 6c  sting should onl
21a0: 79 20 62 65 20 6f 66 20 6c 69 6d 69 74 65 64 20  y be of limited 
21b0: 64 65 70 74 68 20 2a 2f 0a 20 20 76 61 5f 73 74  depth */.  va_st
21c0: 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61 74 29  art(ap, zFormat)
21d0: 3b 0a 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74  ;.  zSql = sqlit
21e0: 65 33 56 4d 50 72 69 6e 74 66 28 64 62 2c 20 7a  e3VMPrintf(db, z
21f0: 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20 76  Format, ap);.  v
2200: 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 69 66 28  a_end(ap);.  if(
2210: 20 7a 53 71 6c 3d 3d 30 20 29 7b 0a 20 20 20 20   zSql==0 ){.    
2220: 72 65 74 75 72 6e 3b 20 20 20 2f 2a 20 41 20 6d  return;   /* A m
2230: 61 6c 6c 6f 63 20 6d 75 73 74 20 68 61 76 65 20  alloc must have 
2240: 66 61 69 6c 65 64 20 2a 2f 0a 20 20 7d 0a 20 20  failed */.  }.  
2250: 70 50 61 72 73 65 2d 3e 6e 65 73 74 65 64 2b 2b  pParse->nested++
2260: 3b 0a 20 20 6d 65 6d 63 70 79 28 73 61 76 65 42  ;.  memcpy(saveB
2270: 75 66 2c 20 26 70 50 61 72 73 65 2d 3e 6e 56 61  uf, &pParse->nVa
2280: 72 2c 20 53 41 56 45 5f 53 5a 29 3b 0a 20 20 6d  r, SAVE_SZ);.  m
2290: 65 6d 73 65 74 28 26 70 50 61 72 73 65 2d 3e 6e  emset(&pParse->n
22a0: 56 61 72 2c 20 30 2c 20 53 41 56 45 5f 53 5a 29  Var, 0, SAVE_SZ)
22b0: 3b 0a 20 20 73 71 6c 69 74 65 33 52 75 6e 50 61  ;.  sqlite3RunPa
22c0: 72 73 65 72 28 70 50 61 72 73 65 2c 20 7a 53 71  rser(pParse, zSq
22d0: 6c 2c 20 26 7a 45 72 72 4d 73 67 29 3b 0a 20 20  l, &zErrMsg);.  
22e0: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
22f0: 2c 20 7a 45 72 72 4d 73 67 29 3b 0a 20 20 73 71  , zErrMsg);.  sq
2300: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
2310: 7a 53 71 6c 29 3b 0a 20 20 6d 65 6d 63 70 79 28  zSql);.  memcpy(
2320: 26 70 50 61 72 73 65 2d 3e 6e 56 61 72 2c 20 73  &pParse->nVar, s
2330: 61 76 65 42 75 66 2c 20 53 41 56 45 5f 53 5a 29  aveBuf, SAVE_SZ)
2340: 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 65 73 74  ;.  pParse->nest
2350: 65 64 2d 2d 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c  ed--;.}..#if SQL
2360: 49 54 45 5f 55 53 45 52 5f 41 55 54 48 45 4e 54  ITE_USER_AUTHENT
2370: 49 43 41 54 49 4f 4e 0a 2f 2a 0a 2a 2a 20 52 65  ICATION./*.** Re
2380: 74 75 72 6e 20 54 52 55 45 20 69 66 20 7a 54 61  turn TRUE if zTa
2390: 62 6c 65 20 69 73 20 74 68 65 20 6e 61 6d 65 20  ble is the name 
23a0: 6f 66 20 74 68 65 20 73 79 73 74 65 6d 20 74 61  of the system ta
23b0: 62 6c 65 20 74 68 61 74 20 73 74 6f 72 65 73 20  ble that stores 
23c0: 74 68 65 0a 2a 2a 20 6c 69 73 74 20 6f 66 20 75  the.** list of u
23d0: 73 65 72 73 20 61 6e 64 20 74 68 65 69 72 20 61  sers and their a
23e0: 63 63 65 73 73 20 63 72 65 64 65 6e 74 69 61 6c  ccess credential
23f0: 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  s..*/.int sqlite
2400: 33 55 73 65 72 41 75 74 68 54 61 62 6c 65 28 63  3UserAuthTable(c
2410: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62 6c  onst char *zTabl
2420: 65 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c  e){.  return sql
2430: 69 74 65 33 5f 73 74 72 69 63 6d 70 28 7a 54 61  ite3_stricmp(zTa
2440: 62 6c 65 2c 20 22 73 71 6c 69 74 65 5f 75 73 65  ble, "sqlite_use
2450: 72 22 29 3d 3d 30 3b 0a 7d 0a 23 65 6e 64 69 66  r")==0;.}.#endif
2460: 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61 74 65 20 74  ../*.** Locate t
2470: 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 73 74 72  he in-memory str
2480: 75 63 74 75 72 65 20 74 68 61 74 20 64 65 73 63  ucture that desc
2490: 72 69 62 65 73 20 61 20 70 61 72 74 69 63 75 6c  ribes a particul
24a0: 61 72 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 74  ar database.** t
24b0: 61 62 6c 65 20 67 69 76 65 6e 20 74 68 65 20 6e  able given the n
24c0: 61 6d 65 20 6f 66 20 74 68 61 74 20 74 61 62 6c  ame of that tabl
24d0: 65 20 61 6e 64 20 28 6f 70 74 69 6f 6e 61 6c 6c  e and (optionall
24e0: 79 29 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  y) the name of t
24f0: 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 63  he.** database c
2500: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 74 61  ontaining the ta
2510: 62 6c 65 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c  ble.  Return NUL
2520: 4c 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a  L if not found..
2530: 2a 2a 0a 2a 2a 20 49 66 20 7a 44 61 74 61 62 61  **.** If zDataba
2540: 73 65 20 69 73 20 30 2c 20 61 6c 6c 20 64 61 74  se is 0, all dat
2550: 61 62 61 73 65 73 20 61 72 65 20 73 65 61 72 63  abases are searc
2560: 68 65 64 20 66 6f 72 20 74 68 65 20 74 61 62 6c  hed for the tabl
2570: 65 20 61 6e 64 20 74 68 65 0a 2a 2a 20 66 69 72  e and the.** fir
2580: 73 74 20 6d 61 74 63 68 69 6e 67 20 74 61 62 6c  st matching tabl
2590: 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 20  e is returned.  
25a0: 28 4e 6f 20 63 68 65 63 6b 69 6e 67 20 66 6f 72  (No checking for
25b0: 20 64 75 70 6c 69 63 61 74 65 20 74 61 62 6c 65   duplicate table
25c0: 0a 2a 2a 20 6e 61 6d 65 73 20 69 73 20 64 6f 6e  .** names is don
25d0: 65 2e 29 20 20 54 68 65 20 73 65 61 72 63 68 20  e.)  The search 
25e0: 6f 72 64 65 72 20 69 73 20 54 45 4d 50 20 66 69  order is TEMP fi
25f0: 72 73 74 2c 20 74 68 65 6e 20 4d 41 49 4e 2c 20  rst, then MAIN, 
2600: 74 68 65 6e 20 61 6e 79 0a 2a 2a 20 61 75 78 69  then any.** auxi
2610: 6c 69 61 72 79 20 64 61 74 61 62 61 73 65 73 20  liary databases 
2620: 61 64 64 65 64 20 75 73 69 6e 67 20 74 68 65 20  added using the 
2630: 41 54 54 41 43 48 20 63 6f 6d 6d 61 6e 64 2e 0a  ATTACH command..
2640: 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20 73  **.** See also s
2650: 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62 6c  qlite3LocateTabl
2660: 65 28 29 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a 73  e()..*/.Table *s
2670: 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28  qlite3FindTable(
2680: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e  sqlite3 *db, con
2690: 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20  st char *zName, 
26a0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 61 74  const char *zDat
26b0: 61 62 61 73 65 29 7b 0a 20 20 54 61 62 6c 65 20  abase){.  Table 
26c0: 2a 70 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b  *p = 0;.  int i;
26d0: 0a 0a 20 20 2f 2a 20 41 6c 6c 20 6d 75 74 65 78  ..  /* All mutex
26e0: 65 73 20 61 72 65 20 72 65 71 75 69 72 65 64 20  es are required 
26f0: 66 6f 72 20 73 63 68 65 6d 61 20 61 63 63 65 73  for schema acces
2700: 73 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 77 65  s.  Make sure we
2710: 20 68 6f 6c 64 20 74 68 65 6d 2e 20 2a 2f 0a 20   hold them. */. 
2720: 20 61 73 73 65 72 74 28 20 7a 44 61 74 61 62 61   assert( zDataba
2730: 73 65 21 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33  se!=0 || sqlite3
2740: 42 74 72 65 65 48 6f 6c 64 73 41 6c 6c 4d 75 74  BtreeHoldsAllMut
2750: 65 78 65 73 28 64 62 29 20 29 3b 0a 23 69 66 20  exes(db) );.#if 
2760: 53 51 4c 49 54 45 5f 55 53 45 52 5f 41 55 54 48  SQLITE_USER_AUTH
2770: 45 4e 54 49 43 41 54 49 4f 4e 0a 20 20 2f 2a 20  ENTICATION.  /* 
2780: 4f 6e 6c 79 20 74 68 65 20 61 64 6d 69 6e 20 75  Only the admin u
2790: 73 65 72 20 69 73 20 61 6c 6c 6f 77 65 64 20 74  ser is allowed t
27a0: 6f 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65 20  o know that the 
27b0: 73 71 6c 69 74 65 5f 75 73 65 72 20 74 61 62 6c  sqlite_user tabl
27c0: 65 0a 20 20 2a 2a 20 65 78 69 73 74 73 20 2a 2f  e.  ** exists */
27d0: 0a 20 20 69 66 28 20 64 62 2d 3e 61 75 74 68 2e  .  if( db->auth.
27e0: 61 75 74 68 4c 65 76 65 6c 3c 55 41 55 54 48 5f  authLevel<UAUTH_
27f0: 41 64 6d 69 6e 20 26 26 20 73 71 6c 69 74 65 33  Admin && sqlite3
2800: 55 73 65 72 41 75 74 68 54 61 62 6c 65 28 7a 4e  UserAuthTable(zN
2810: 61 6d 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 72  ame)!=0 ){.    r
2820: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 23 65 6e  eturn 0;.  }.#en
2830: 64 69 66 0a 20 20 66 6f 72 28 69 3d 4f 4d 49 54  dif.  for(i=OMIT
2840: 5f 54 45 4d 50 44 42 3b 20 69 3c 64 62 2d 3e 6e  _TEMPDB; i<db->n
2850: 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e  Db; i++){.    in
2860: 74 20 6a 20 3d 20 28 69 3c 32 29 20 3f 20 69 5e  t j = (i<2) ? i^
2870: 31 20 3a 20 69 3b 20 20 20 2f 2a 20 53 65 61 72  1 : i;   /* Sear
2880: 63 68 20 54 45 4d 50 20 62 65 66 6f 72 65 20 4d  ch TEMP before M
2890: 41 49 4e 20 2a 2f 0a 20 20 20 20 69 66 28 20 7a  AIN */.    if( z
28a0: 44 61 74 61 62 61 73 65 21 3d 30 20 26 26 20 73  Database!=0 && s
28b0: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 44  qlite3StrICmp(zD
28c0: 61 74 61 62 61 73 65 2c 20 64 62 2d 3e 61 44 62  atabase, db->aDb
28d0: 5b 6a 5d 2e 7a 4e 61 6d 65 29 20 29 20 63 6f 6e  [j].zName) ) con
28e0: 74 69 6e 75 65 3b 0a 20 20 20 20 61 73 73 65 72  tinue;.    asser
28f0: 74 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61  t( sqlite3Schema
2900: 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20 6a 2c  MutexHeld(db, j,
2910: 20 30 29 20 29 3b 0a 20 20 20 20 70 20 3d 20 73   0) );.    p = s
2920: 71 6c 69 74 65 33 48 61 73 68 46 69 6e 64 28 26  qlite3HashFind(&
2930: 64 62 2d 3e 61 44 62 5b 6a 5d 2e 70 53 63 68 65  db->aDb[j].pSche
2940: 6d 61 2d 3e 74 62 6c 48 61 73 68 2c 20 7a 4e 61  ma->tblHash, zNa
2950: 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 70 20 29  me);.    if( p )
2960: 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65   break;.  }.  re
2970: 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn p;.}../*.**
2980: 20 4c 6f 63 61 74 65 20 74 68 65 20 69 6e 2d 6d   Locate the in-m
2990: 65 6d 6f 72 79 20 73 74 72 75 63 74 75 72 65 20  emory structure 
29a0: 74 68 61 74 20 64 65 73 63 72 69 62 65 73 20 61  that describes a
29b0: 20 70 61 72 74 69 63 75 6c 61 72 20 64 61 74 61   particular data
29c0: 62 61 73 65 0a 2a 2a 20 74 61 62 6c 65 20 67 69  base.** table gi
29d0: 76 65 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  ven the name of 
29e0: 74 68 61 74 20 74 61 62 6c 65 20 61 6e 64 20 28  that table and (
29f0: 6f 70 74 69 6f 6e 61 6c 6c 79 29 20 74 68 65 20  optionally) the 
2a00: 6e 61 6d 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64  name of the.** d
2a10: 61 74 61 62 61 73 65 20 63 6f 6e 74 61 69 6e 69  atabase containi
2a20: 6e 67 20 74 68 65 20 74 61 62 6c 65 2e 20 20 52  ng the table.  R
2a30: 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 6e 6f  eturn NULL if no
2a40: 74 20 66 6f 75 6e 64 2e 20 20 41 6c 73 6f 20 6c  t found.  Also l
2a50: 65 61 76 65 20 61 6e 0a 2a 2a 20 65 72 72 6f 72  eave an.** error
2a60: 20 6d 65 73 73 61 67 65 20 69 6e 20 70 50 61 72   message in pPar
2a70: 73 65 2d 3e 7a 45 72 72 4d 73 67 2e 0a 2a 2a 0a  se->zErrMsg..**.
2a80: 2a 2a 20 54 68 65 20 64 69 66 66 65 72 65 6e 63  ** The differenc
2a90: 65 20 62 65 74 77 65 65 6e 20 74 68 69 73 20 72  e between this r
2aa0: 6f 75 74 69 6e 65 20 61 6e 64 20 73 71 6c 69 74  outine and sqlit
2ab0: 65 33 46 69 6e 64 54 61 62 6c 65 28 29 20 69 73  e3FindTable() is
2ac0: 20 74 68 61 74 20 74 68 69 73 0a 2a 2a 20 72 6f   that this.** ro
2ad0: 75 74 69 6e 65 20 6c 65 61 76 65 73 20 61 6e 20  utine leaves an 
2ae0: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e  error message in
2af0: 20 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67   pParse->zErrMsg
2b00: 20 77 68 65 72 65 0a 2a 2a 20 73 71 6c 69 74 65   where.** sqlite
2b10: 33 46 69 6e 64 54 61 62 6c 65 28 29 20 64 6f 65  3FindTable() doe
2b20: 73 20 6e 6f 74 2e 0a 2a 2f 0a 54 61 62 6c 65 20  s not..*/.Table 
2b30: 2a 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61  *sqlite3LocateTa
2b40: 62 6c 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ble(.  Parse *pP
2b50: 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 2f 2a  arse,         /*
2b60: 20 63 6f 6e 74 65 78 74 20 69 6e 20 77 68 69 63   context in whic
2b70: 68 20 74 6f 20 72 65 70 6f 72 74 20 65 72 72 6f  h to report erro
2b80: 72 73 20 2a 2f 0a 20 20 69 6e 74 20 69 73 56 69  rs */.  int isVi
2b90: 65 77 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  ew,            /
2ba0: 2a 20 54 72 75 65 20 69 66 20 6c 6f 6f 6b 69 6e  * True if lookin
2bb0: 67 20 66 6f 72 20 61 20 56 49 45 57 20 72 61 74  g for a VIEW rat
2bc0: 68 65 72 20 74 68 61 6e 20 61 20 54 41 42 4c 45  her than a TABLE
2bd0: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
2be0: 20 2a 7a 4e 61 6d 65 2c 20 20 20 20 20 2f 2a 20   *zName,     /* 
2bf0: 4e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c  Name of the tabl
2c00: 65 20 77 65 20 61 72 65 20 6c 6f 6f 6b 69 6e 67  e we are looking
2c10: 20 66 6f 72 20 2a 2f 0a 20 20 63 6f 6e 73 74 20   for */.  const 
2c20: 63 68 61 72 20 2a 7a 44 62 61 73 65 20 20 20 20  char *zDbase    
2c30: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
2c40: 64 61 74 61 62 61 73 65 2e 20 20 4d 69 67 68 74  database.  Might
2c50: 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20   be NULL */.){. 
2c60: 20 54 61 62 6c 65 20 2a 70 3b 0a 0a 20 20 2f 2a   Table *p;..  /*
2c70: 20 52 65 61 64 20 74 68 65 20 64 61 74 61 62 61   Read the databa
2c80: 73 65 20 73 63 68 65 6d 61 2e 20 49 66 20 61 6e  se schema. If an
2c90: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 6c   error occurs, l
2ca0: 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65  eave an error me
2cb0: 73 73 61 67 65 0a 20 20 2a 2a 20 61 6e 64 20 63  ssage.  ** and c
2cc0: 6f 64 65 20 69 6e 20 70 50 61 72 73 65 20 61 6e  ode in pParse an
2cd0: 64 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 20 2a  d return NULL. *
2ce0: 2f 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f  /.  if( SQLITE_O
2cf0: 4b 21 3d 73 71 6c 69 74 65 33 52 65 61 64 53 63  K!=sqlite3ReadSc
2d00: 68 65 6d 61 28 70 50 61 72 73 65 29 20 29 7b 0a  hema(pParse) ){.
2d10: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
2d20: 7d 0a 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33  }..  p = sqlite3
2d30: 46 69 6e 64 54 61 62 6c 65 28 70 50 61 72 73 65  FindTable(pParse
2d40: 2d 3e 64 62 2c 20 7a 4e 61 6d 65 2c 20 7a 44 62  ->db, zName, zDb
2d50: 61 73 65 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30  ase);.  if( p==0
2d60: 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68   ){.    const ch
2d70: 61 72 20 2a 7a 4d 73 67 20 3d 20 69 73 56 69 65  ar *zMsg = isVie
2d80: 77 20 3f 20 22 6e 6f 20 73 75 63 68 20 76 69 65  w ? "no such vie
2d90: 77 22 20 3a 20 22 6e 6f 20 73 75 63 68 20 74 61  w" : "no such ta
2da0: 62 6c 65 22 3b 0a 23 69 66 6e 64 65 66 20 53 51  ble";.#ifndef SQ
2db0: 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
2dc0: 4c 54 41 42 4c 45 0a 20 20 20 20 69 66 28 20 73  LTABLE.    if( s
2dd0: 71 6c 69 74 65 33 46 69 6e 64 44 62 4e 61 6d 65  qlite3FindDbName
2de0: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 7a 44 62  (pParse->db, zDb
2df0: 61 73 65 29 3c 31 20 29 7b 0a 20 20 20 20 20 20  ase)<1 ){.      
2e00: 2f 2a 20 49 66 20 7a 4e 61 6d 65 20 69 73 20 74  /* If zName is t
2e10: 68 65 20 6e 6f 74 20 74 68 65 20 6e 61 6d 65 20  he not the name 
2e20: 6f 66 20 61 20 74 61 62 6c 65 20 69 6e 20 74 68  of a table in th
2e30: 65 20 73 63 68 65 6d 61 20 63 72 65 61 74 65 64  e schema created
2e40: 20 75 73 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20   using.      ** 
2e50: 43 52 45 41 54 45 2c 20 74 68 65 6e 20 63 68 65  CREATE, then che
2e60: 63 6b 20 74 6f 20 73 65 65 20 69 66 20 69 74 20  ck to see if it 
2e70: 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61  is the name of a
2e80: 6e 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20  n virtual table 
2e90: 74 68 61 74 0a 20 20 20 20 20 20 2a 2a 20 63 61  that.      ** ca
2ea0: 6e 20 62 65 20 61 6e 20 65 70 6f 6e 79 6d 6f 75  n be an eponymou
2eb0: 73 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e  s virtual table.
2ec0: 20 2a 2f 0a 20 20 20 20 20 20 4d 6f 64 75 6c 65   */.      Module
2ed0: 20 2a 70 4d 6f 64 20 3d 20 28 4d 6f 64 75 6c 65   *pMod = (Module
2ee0: 2a 29 73 71 6c 69 74 65 33 48 61 73 68 46 69 6e  *)sqlite3HashFin
2ef0: 64 28 26 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61  d(&pParse->db->a
2f00: 4d 6f 64 75 6c 65 2c 20 7a 4e 61 6d 65 29 3b 0a  Module, zName);.
2f10: 20 20 20 20 20 20 69 66 28 20 70 4d 6f 64 20 26        if( pMod &
2f20: 26 20 73 71 6c 69 74 65 33 56 74 61 62 45 70 6f  & sqlite3VtabEpo
2f30: 6e 79 6d 6f 75 73 54 61 62 6c 65 49 6e 69 74 28  nymousTableInit(
2f40: 70 50 61 72 73 65 2c 20 70 4d 6f 64 29 20 29 7b  pParse, pMod) ){
2f50: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
2f60: 70 4d 6f 64 2d 3e 70 45 70 6f 54 61 62 3b 0a 20  pMod->pEpoTab;. 
2f70: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e       }.    }.#en
2f80: 64 69 66 0a 20 20 20 20 69 66 28 20 7a 44 62 61  dif.    if( zDba
2f90: 73 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  se ){.      sqli
2fa0: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
2fb0: 73 65 2c 20 22 25 73 3a 20 25 73 2e 25 73 22 2c  se, "%s: %s.%s",
2fc0: 20 7a 4d 73 67 2c 20 7a 44 62 61 73 65 2c 20 7a   zMsg, zDbase, z
2fd0: 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65  Name);.    }else
2fe0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
2ff0: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
3000: 22 25 73 3a 20 25 73 22 2c 20 7a 4d 73 67 2c 20  "%s: %s", zMsg, 
3010: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20  zName);.    }.  
3020: 20 20 70 50 61 72 73 65 2d 3e 63 68 65 63 6b 53    pParse->checkS
3030: 63 68 65 6d 61 20 3d 20 31 3b 0a 20 20 7d 0a 0a  chema = 1;.  }..
3040: 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f    return p;.}../
3050: 2a 0a 2a 2a 20 4c 6f 63 61 74 65 20 74 68 65 20  *.** Locate the 
3060: 74 61 62 6c 65 20 69 64 65 6e 74 69 66 69 65 64  table identified
3070: 20 62 79 20 2a 70 2e 0a 2a 2a 0a 2a 2a 20 54 68   by *p..**.** Th
3080: 69 73 20 69 73 20 61 20 77 72 61 70 70 65 72 20  is is a wrapper 
3090: 61 72 6f 75 6e 64 20 73 71 6c 69 74 65 33 4c 6f  around sqlite3Lo
30a0: 63 61 74 65 54 61 62 6c 65 28 29 2e 20 54 68 65  cateTable(). The
30b0: 20 64 69 66 66 65 72 65 6e 63 65 20 62 65 74 77   difference betw
30c0: 65 65 6e 0a 2a 2a 20 73 71 6c 69 74 65 33 4c 6f  een.** sqlite3Lo
30d0: 63 61 74 65 54 61 62 6c 65 28 29 20 61 6e 64 20  cateTable() and 
30e0: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
30f0: 20 74 68 61 74 20 74 68 69 73 20 66 75 6e 63 74   that this funct
3100: 69 6f 6e 20 72 65 73 74 72 69 63 74 73 0a 2a 2a  ion restricts.**
3110: 20 74 68 65 20 73 65 61 72 63 68 20 74 6f 20 73   the search to s
3120: 63 68 65 6d 61 20 28 70 2d 3e 70 53 63 68 65 6d  chema (p->pSchem
3130: 61 29 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20  a) if it is not 
3140: 4e 55 4c 4c 2e 20 70 2d 3e 70 53 63 68 65 6d 61  NULL. p->pSchema
3150: 20 6d 61 79 20 62 65 0a 2a 2a 20 6e 6f 6e 2d 4e   may be.** non-N
3160: 55 4c 4c 20 69 66 20 69 74 20 69 73 20 70 61 72  ULL if it is par
3170: 74 20 6f 66 20 61 20 76 69 65 77 20 6f 72 20 74  t of a view or t
3180: 72 69 67 67 65 72 20 70 72 6f 67 72 61 6d 20 64  rigger program d
3190: 65 66 69 6e 69 74 69 6f 6e 2e 20 53 65 65 0a 2a  efinition. See.*
31a0: 2a 20 73 71 6c 69 74 65 33 46 69 78 53 72 63 4c  * sqlite3FixSrcL
31b0: 69 73 74 28 29 20 66 6f 72 20 64 65 74 61 69 6c  ist() for detail
31c0: 73 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a 73 71 6c  s..*/.Table *sql
31d0: 69 74 65 33 4c 6f 63 61 74 65 54 61 62 6c 65 49  ite3LocateTableI
31e0: 74 65 6d 28 0a 20 20 50 61 72 73 65 20 2a 70 50  tem(.  Parse *pP
31f0: 61 72 73 65 2c 20 0a 20 20 69 6e 74 20 69 73 56  arse, .  int isV
3200: 69 65 77 2c 20 0a 20 20 73 74 72 75 63 74 20 53  iew, .  struct S
3210: 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 0a 29  rcList_item *p.)
3220: 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  {.  const char *
3230: 7a 44 62 3b 0a 20 20 61 73 73 65 72 74 28 20 70  zDb;.  assert( p
3240: 2d 3e 70 53 63 68 65 6d 61 3d 3d 30 20 7c 7c 20  ->pSchema==0 || 
3250: 70 2d 3e 7a 44 61 74 61 62 61 73 65 3d 3d 30 20  p->zDatabase==0 
3260: 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 53 63 68  );.  if( p->pSch
3270: 65 6d 61 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  ema ){.    int i
3280: 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65  Db = sqlite3Sche
3290: 6d 61 54 6f 49 6e 64 65 78 28 70 50 61 72 73 65  maToIndex(pParse
32a0: 2d 3e 64 62 2c 20 70 2d 3e 70 53 63 68 65 6d 61  ->db, p->pSchema
32b0: 29 3b 0a 20 20 20 20 7a 44 62 20 3d 20 70 50 61  );.    zDb = pPa
32c0: 72 73 65 2d 3e 64 62 2d 3e 61 44 62 5b 69 44 62  rse->db->aDb[iDb
32d0: 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 7d 65 6c 73 65  ].zName;.  }else
32e0: 7b 0a 20 20 20 20 7a 44 62 20 3d 20 70 2d 3e 7a  {.    zDb = p->z
32f0: 44 61 74 61 62 61 73 65 3b 0a 20 20 7d 0a 20 20  Database;.  }.  
3300: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 4c 6f  return sqlite3Lo
3310: 63 61 74 65 54 61 62 6c 65 28 70 50 61 72 73 65  cateTable(pParse
3320: 2c 20 69 73 56 69 65 77 2c 20 70 2d 3e 7a 4e 61  , isView, p->zNa
3330: 6d 65 2c 20 7a 44 62 29 3b 0a 7d 0a 0a 2f 2a 0a  me, zDb);.}../*.
3340: 2a 2a 20 4c 6f 63 61 74 65 20 74 68 65 20 69 6e  ** Locate the in
3350: 2d 6d 65 6d 6f 72 79 20 73 74 72 75 63 74 75 72  -memory structur
3360: 65 20 74 68 61 74 20 64 65 73 63 72 69 62 65 73  e that describes
3370: 20 0a 2a 2a 20 61 20 70 61 72 74 69 63 75 6c 61   .** a particula
3380: 72 20 69 6e 64 65 78 20 67 69 76 65 6e 20 74 68  r index given th
3390: 65 20 6e 61 6d 65 20 6f 66 20 74 68 61 74 20 69  e name of that i
33a0: 6e 64 65 78 0a 2a 2a 20 61 6e 64 20 74 68 65 20  ndex.** and the 
33b0: 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61  name of the data
33c0: 62 61 73 65 20 74 68 61 74 20 63 6f 6e 74 61 69  base that contai
33d0: 6e 73 20 74 68 65 20 69 6e 64 65 78 2e 0a 2a 2a  ns the index..**
33e0: 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20   Return NULL if 
33f0: 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2a 0a 2a 2a  not found..**.**
3400: 20 49 66 20 7a 44 61 74 61 62 61 73 65 20 69 73   If zDatabase is
3410: 20 30 2c 20 61 6c 6c 20 64 61 74 61 62 61 73 65   0, all database
3420: 73 20 61 72 65 20 73 65 61 72 63 68 65 64 20 66  s are searched f
3430: 6f 72 20 74 68 65 0a 2a 2a 20 74 61 62 6c 65 20  or the.** table 
3440: 61 6e 64 20 74 68 65 20 66 69 72 73 74 20 6d 61  and the first ma
3450: 74 63 68 69 6e 67 20 69 6e 64 65 78 20 69 73 20  tching index is 
3460: 72 65 74 75 72 6e 65 64 2e 20 20 28 4e 6f 20 63  returned.  (No c
3470: 68 65 63 6b 69 6e 67 0a 2a 2a 20 66 6f 72 20 64  hecking.** for d
3480: 75 70 6c 69 63 61 74 65 20 69 6e 64 65 78 20 6e  uplicate index n
3490: 61 6d 65 73 20 69 73 20 64 6f 6e 65 2e 29 20 20  ames is done.)  
34a0: 54 68 65 20 73 65 61 72 63 68 20 6f 72 64 65 72  The search order
34b0: 20 69 73 0a 2a 2a 20 54 45 4d 50 20 66 69 72 73   is.** TEMP firs
34c0: 74 2c 20 74 68 65 6e 20 4d 41 49 4e 2c 20 74 68  t, then MAIN, th
34d0: 65 6e 20 61 6e 79 20 61 75 78 69 6c 69 61 72 79  en any auxiliary
34e0: 20 64 61 74 61 62 61 73 65 73 20 61 64 64 65 64   databases added
34f0: 0a 2a 2a 20 75 73 69 6e 67 20 74 68 65 20 41 54  .** using the AT
3500: 54 41 43 48 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2f  TACH command..*/
3510: 0a 49 6e 64 65 78 20 2a 73 71 6c 69 74 65 33 46  .Index *sqlite3F
3520: 69 6e 64 49 6e 64 65 78 28 73 71 6c 69 74 65 33  indIndex(sqlite3
3530: 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68 61 72   *db, const char
3540: 20 2a 7a 4e 61 6d 65 2c 20 63 6f 6e 73 74 20 63   *zName, const c
3550: 68 61 72 20 2a 7a 44 62 29 7b 0a 20 20 49 6e 64  har *zDb){.  Ind
3560: 65 78 20 2a 70 20 3d 20 30 3b 0a 20 20 69 6e 74  ex *p = 0;.  int
3570: 20 69 3b 0a 20 20 2f 2a 20 41 6c 6c 20 6d 75 74   i;.  /* All mut
3580: 65 78 65 73 20 61 72 65 20 72 65 71 75 69 72 65  exes are require
3590: 64 20 66 6f 72 20 73 63 68 65 6d 61 20 61 63 63  d for schema acc
35a0: 65 73 73 2e 20 20 4d 61 6b 65 20 73 75 72 65 20  ess.  Make sure 
35b0: 77 65 20 68 6f 6c 64 20 74 68 65 6d 2e 20 2a 2f  we hold them. */
35c0: 0a 20 20 61 73 73 65 72 74 28 20 7a 44 62 21 3d  .  assert( zDb!=
35d0: 30 20 7c 7c 20 73 71 6c 69 74 65 33 42 74 72 65  0 || sqlite3Btre
35e0: 65 48 6f 6c 64 73 41 6c 6c 4d 75 74 65 78 65 73  eHoldsAllMutexes
35f0: 28 64 62 29 20 29 3b 0a 20 20 66 6f 72 28 69 3d  (db) );.  for(i=
3600: 4f 4d 49 54 5f 54 45 4d 50 44 42 3b 20 69 3c 64  OMIT_TEMPDB; i<d
3610: 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20  b->nDb; i++){.  
3620: 20 20 69 6e 74 20 6a 20 3d 20 28 69 3c 32 29 20    int j = (i<2) 
3630: 3f 20 69 5e 31 20 3a 20 69 3b 20 20 2f 2a 20 53  ? i^1 : i;  /* S
3640: 65 61 72 63 68 20 54 45 4d 50 20 62 65 66 6f 72  earch TEMP befor
3650: 65 20 4d 41 49 4e 20 2a 2f 0a 20 20 20 20 53 63  e MAIN */.    Sc
3660: 68 65 6d 61 20 2a 70 53 63 68 65 6d 61 20 3d 20  hema *pSchema = 
3670: 64 62 2d 3e 61 44 62 5b 6a 5d 2e 70 53 63 68 65  db->aDb[j].pSche
3680: 6d 61 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ma;.    assert( 
3690: 70 53 63 68 65 6d 61 20 29 3b 0a 20 20 20 20 69  pSchema );.    i
36a0: 66 28 20 7a 44 62 20 26 26 20 73 71 6c 69 74 65  f( zDb && sqlite
36b0: 33 53 74 72 49 43 6d 70 28 7a 44 62 2c 20 64 62  3StrICmp(zDb, db
36c0: 2d 3e 61 44 62 5b 6a 5d 2e 7a 4e 61 6d 65 29 20  ->aDb[j].zName) 
36d0: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
36e0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 53  assert( sqlite3S
36f0: 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64  chemaMutexHeld(d
3700: 62 2c 20 6a 2c 20 30 29 20 29 3b 0a 20 20 20 20  b, j, 0) );.    
3710: 70 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68 46  p = sqlite3HashF
3720: 69 6e 64 28 26 70 53 63 68 65 6d 61 2d 3e 69 64  ind(&pSchema->id
3730: 78 48 61 73 68 2c 20 7a 4e 61 6d 65 29 3b 0a 20  xHash, zName);. 
3740: 20 20 20 69 66 28 20 70 20 29 20 62 72 65 61 6b     if( p ) break
3750: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
3760: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6c 61  ;.}../*.** Recla
3770: 69 6d 20 74 68 65 20 6d 65 6d 6f 72 79 20 75 73  im the memory us
3780: 65 64 20 62 79 20 61 6e 20 69 6e 64 65 78 0a 2a  ed by an index.*
3790: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 72  /.static void fr
37a0: 65 65 49 6e 64 65 78 28 73 71 6c 69 74 65 33 20  eeIndex(sqlite3 
37b0: 2a 64 62 2c 20 49 6e 64 65 78 20 2a 70 29 7b 0a  *db, Index *p){.
37c0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
37d0: 4d 49 54 5f 41 4e 41 4c 59 5a 45 0a 20 20 73 71  MIT_ANALYZE.  sq
37e0: 6c 69 74 65 33 44 65 6c 65 74 65 49 6e 64 65 78  lite3DeleteIndex
37f0: 53 61 6d 70 6c 65 73 28 64 62 2c 20 70 29 3b 0a  Samples(db, p);.
3800: 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33  #endif.  sqlite3
3810: 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70  ExprDelete(db, p
3820: 2d 3e 70 50 61 72 74 49 64 78 57 68 65 72 65 29  ->pPartIdxWhere)
3830: 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c  ;.  sqlite3ExprL
3840: 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d  istDelete(db, p-
3850: 3e 61 43 6f 6c 45 78 70 72 29 3b 0a 20 20 73 71  >aColExpr);.  sq
3860: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
3870: 70 2d 3e 7a 43 6f 6c 41 66 66 29 3b 0a 20 20 69  p->zColAff);.  i
3880: 66 28 20 70 2d 3e 69 73 52 65 73 69 7a 65 64 20  f( p->isResized 
3890: 29 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28  ) sqlite3DbFree(
38a0: 64 62 2c 20 28 76 6f 69 64 20 2a 29 70 2d 3e 61  db, (void *)p->a
38b0: 7a 43 6f 6c 6c 29 3b 0a 23 69 66 64 65 66 20 53  zColl);.#ifdef S
38c0: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41  QLITE_ENABLE_STA
38d0: 54 33 5f 4f 52 5f 53 54 41 54 34 0a 20 20 73 71  T3_OR_STAT4.  sq
38e0: 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 61 69  lite3_free(p->ai
38f0: 52 6f 77 45 73 74 29 3b 0a 23 65 6e 64 69 66 0a  RowEst);.#endif.
3900: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
3910: 64 62 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  db, p);.}../*.**
3920: 20 46 6f 72 20 74 68 65 20 69 6e 64 65 78 20 63   For the index c
3930: 61 6c 6c 65 64 20 7a 49 64 78 4e 61 6d 65 20 77  alled zIdxName w
3940: 68 69 63 68 20 69 73 20 66 6f 75 6e 64 20 69 6e  hich is found in
3950: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 44   the database iD
3960: 62 2c 0a 2a 2a 20 75 6e 6c 69 6b 65 20 74 68 61  b,.** unlike tha
3970: 74 20 69 6e 64 65 78 20 66 72 6f 6d 20 69 74 73  t index from its
3980: 20 54 61 62 6c 65 20 74 68 65 6e 20 72 65 6d 6f   Table then remo
3990: 76 65 20 74 68 65 20 69 6e 64 65 78 20 66 72 6f  ve the index fro
39a0: 6d 0a 2a 2a 20 74 68 65 20 69 6e 64 65 78 20 68  m.** the index h
39b0: 61 73 68 20 74 61 62 6c 65 20 61 6e 64 20 66 72  ash table and fr
39c0: 65 65 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 73 74  ee all memory st
39d0: 72 75 63 74 75 72 65 73 20 61 73 73 6f 63 69 61  ructures associa
39e0: 74 65 64 0a 2a 2a 20 77 69 74 68 20 74 68 65 20  ted.** with the 
39f0: 69 6e 64 65 78 2e 0a 2a 2f 0a 76 6f 69 64 20 73  index..*/.void s
3a00: 71 6c 69 74 65 33 55 6e 6c 69 6e 6b 41 6e 64 44  qlite3UnlinkAndD
3a10: 65 6c 65 74 65 49 6e 64 65 78 28 73 71 6c 69 74  eleteIndex(sqlit
3a20: 65 33 20 2a 64 62 2c 20 69 6e 74 20 69 44 62 2c  e3 *db, int iDb,
3a30: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 64   const char *zId
3a40: 78 4e 61 6d 65 29 7b 0a 20 20 49 6e 64 65 78 20  xName){.  Index 
3a50: 2a 70 49 6e 64 65 78 3b 0a 20 20 48 61 73 68 20  *pIndex;.  Hash 
3a60: 2a 70 48 61 73 68 3b 0a 0a 20 20 61 73 73 65 72  *pHash;..  asser
3a70: 74 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61  t( sqlite3Schema
3a80: 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20 69 44  MutexHeld(db, iD
3a90: 62 2c 20 30 29 20 29 3b 0a 20 20 70 48 61 73 68  b, 0) );.  pHash
3aa0: 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d   = &db->aDb[iDb]
3ab0: 2e 70 53 63 68 65 6d 61 2d 3e 69 64 78 48 61 73  .pSchema->idxHas
3ac0: 68 3b 0a 20 20 70 49 6e 64 65 78 20 3d 20 73 71  h;.  pIndex = sq
3ad0: 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72 74 28  lite3HashInsert(
3ae0: 70 48 61 73 68 2c 20 7a 49 64 78 4e 61 6d 65 2c  pHash, zIdxName,
3af0: 20 30 29 3b 0a 20 20 69 66 28 20 41 4c 57 41 59   0);.  if( ALWAY
3b00: 53 28 70 49 6e 64 65 78 29 20 29 7b 0a 20 20 20  S(pIndex) ){.   
3b10: 20 69 66 28 20 70 49 6e 64 65 78 2d 3e 70 54 61   if( pIndex->pTa
3b20: 62 6c 65 2d 3e 70 49 6e 64 65 78 3d 3d 70 49 6e  ble->pIndex==pIn
3b30: 64 65 78 20 29 7b 0a 20 20 20 20 20 20 70 49 6e  dex ){.      pIn
3b40: 64 65 78 2d 3e 70 54 61 62 6c 65 2d 3e 70 49 6e  dex->pTable->pIn
3b50: 64 65 78 20 3d 20 70 49 6e 64 65 78 2d 3e 70 4e  dex = pIndex->pN
3b60: 65 78 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ext;.    }else{.
3b70: 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70 3b 0a        Index *p;.
3b80: 20 20 20 20 20 20 2f 2a 20 4a 75 73 74 69 66 69        /* Justifi
3b90: 63 61 74 69 6f 6e 20 6f 66 20 41 4c 57 41 59 53  cation of ALWAYS
3ba0: 28 29 3b 20 20 54 68 65 20 69 6e 64 65 78 20 6d  ();  The index m
3bb0: 75 73 74 20 62 65 20 6f 6e 20 74 68 65 20 6c 69  ust be on the li
3bc0: 73 74 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20 69  st of.      ** i
3bd0: 6e 64 69 63 65 73 2e 20 2a 2f 0a 20 20 20 20 20  ndices. */.     
3be0: 20 70 20 3d 20 70 49 6e 64 65 78 2d 3e 70 54 61   p = pIndex->pTa
3bf0: 62 6c 65 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20  ble->pIndex;.   
3c00: 20 20 20 77 68 69 6c 65 28 20 41 4c 57 41 59 53     while( ALWAYS
3c10: 28 70 29 20 26 26 20 70 2d 3e 70 4e 65 78 74 21  (p) && p->pNext!
3c20: 3d 70 49 6e 64 65 78 20 29 7b 20 70 20 3d 20 70  =pIndex ){ p = p
3c30: 2d 3e 70 4e 65 78 74 3b 20 7d 0a 20 20 20 20 20  ->pNext; }.     
3c40: 20 69 66 28 20 41 4c 57 41 59 53 28 70 20 26 26   if( ALWAYS(p &&
3c50: 20 70 2d 3e 70 4e 65 78 74 3d 3d 70 49 6e 64 65   p->pNext==pInde
3c60: 78 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d  x) ){.        p-
3c70: 3e 70 4e 65 78 74 20 3d 20 70 49 6e 64 65 78 2d  >pNext = pIndex-
3c80: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a  >pNext;.      }.
3c90: 20 20 20 20 7d 0a 20 20 20 20 66 72 65 65 49 6e      }.    freeIn
3ca0: 64 65 78 28 64 62 2c 20 70 49 6e 64 65 78 29 3b  dex(db, pIndex);
3cb0: 0a 20 20 7d 0a 20 20 64 62 2d 3e 66 6c 61 67 73  .  }.  db->flags
3cc0: 20 7c 3d 20 53 51 4c 49 54 45 5f 49 6e 74 65 72   |= SQLITE_Inter
3cd0: 6e 43 68 61 6e 67 65 73 3b 0a 7d 0a 0a 2f 2a 0a  nChanges;.}../*.
3ce0: 2a 2a 20 4c 6f 6f 6b 20 74 68 72 6f 75 67 68 20  ** Look through 
3cf0: 74 68 65 20 6c 69 73 74 20 6f 66 20 6f 70 65 6e  the list of open
3d00: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73 20   database files 
3d10: 69 6e 20 64 62 2d 3e 61 44 62 5b 5d 20 61 6e 64  in db->aDb[] and
3d20: 20 69 66 0a 2a 2a 20 61 6e 79 20 68 61 76 65 20   if.** any have 
3d30: 62 65 65 6e 20 63 6c 6f 73 65 64 2c 20 72 65 6d  been closed, rem
3d40: 6f 76 65 20 74 68 65 6d 20 66 72 6f 6d 20 74 68  ove them from th
3d50: 65 20 6c 69 73 74 2e 20 20 52 65 61 6c 6c 6f 63  e list.  Realloc
3d60: 61 74 65 20 74 68 65 0a 2a 2a 20 64 62 2d 3e 61  ate the.** db->a
3d70: 44 62 5b 5d 20 73 74 72 75 63 74 75 72 65 20 74  Db[] structure t
3d80: 6f 20 61 20 73 6d 61 6c 6c 65 72 20 73 69 7a 65  o a smaller size
3d90: 2c 20 69 66 20 70 6f 73 73 69 62 6c 65 2e 0a 2a  , if possible..*
3da0: 2a 0a 2a 2a 20 45 6e 74 72 79 20 30 20 28 74 68  *.** Entry 0 (th
3db0: 65 20 22 6d 61 69 6e 22 20 64 61 74 61 62 61 73  e "main" databas
3dc0: 65 29 20 61 6e 64 20 65 6e 74 72 79 20 31 20 28  e) and entry 1 (
3dd0: 74 68 65 20 22 74 65 6d 70 22 20 64 61 74 61 62  the "temp" datab
3de0: 61 73 65 29 0a 2a 2a 20 61 72 65 20 6e 65 76 65  ase).** are neve
3df0: 72 20 63 61 6e 64 69 64 61 74 65 73 20 66 6f 72  r candidates for
3e00: 20 62 65 69 6e 67 20 63 6f 6c 6c 61 70 73 65 64   being collapsed
3e10: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
3e20: 33 43 6f 6c 6c 61 70 73 65 44 61 74 61 62 61 73  3CollapseDatabas
3e30: 65 41 72 72 61 79 28 73 71 6c 69 74 65 33 20 2a  eArray(sqlite3 *
3e40: 64 62 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b  db){.  int i, j;
3e50: 0a 20 20 66 6f 72 28 69 3d 6a 3d 32 3b 20 69 3c  .  for(i=j=2; i<
3e60: 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20  db->nDb; i++){. 
3e70: 20 20 20 73 74 72 75 63 74 20 44 62 20 2a 70 44     struct Db *pD
3e80: 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 5d 3b  b = &db->aDb[i];
3e90: 0a 20 20 20 20 69 66 28 20 70 44 62 2d 3e 70 42  .    if( pDb->pB
3ea0: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  t==0 ){.      sq
3eb0: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
3ec0: 70 44 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  pDb->zName);.   
3ed0: 20 20 20 70 44 62 2d 3e 7a 4e 61 6d 65 20 3d 20     pDb->zName = 
3ee0: 30 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75  0;.      continu
3ef0: 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  e;.    }.    if(
3f00: 20 6a 3c 69 20 29 7b 0a 20 20 20 20 20 20 64 62   j<i ){.      db
3f10: 2d 3e 61 44 62 5b 6a 5d 20 3d 20 64 62 2d 3e 61  ->aDb[j] = db->a
3f20: 44 62 5b 69 5d 3b 0a 20 20 20 20 7d 0a 20 20 20  Db[i];.    }.   
3f30: 20 6a 2b 2b 3b 0a 20 20 7d 0a 20 20 64 62 2d 3e   j++;.  }.  db->
3f40: 6e 44 62 20 3d 20 6a 3b 0a 20 20 69 66 28 20 64  nDb = j;.  if( d
3f50: 62 2d 3e 6e 44 62 3c 3d 32 20 26 26 20 64 62 2d  b->nDb<=2 && db-
3f60: 3e 61 44 62 21 3d 64 62 2d 3e 61 44 62 53 74 61  >aDb!=db->aDbSta
3f70: 74 69 63 20 29 7b 0a 20 20 20 20 6d 65 6d 63 70  tic ){.    memcp
3f80: 79 28 64 62 2d 3e 61 44 62 53 74 61 74 69 63 2c  y(db->aDbStatic,
3f90: 20 64 62 2d 3e 61 44 62 2c 20 32 2a 73 69 7a 65   db->aDb, 2*size
3fa0: 6f 66 28 64 62 2d 3e 61 44 62 5b 30 5d 29 29 3b  of(db->aDb[0]));
3fb0: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
3fc0: 65 65 28 64 62 2c 20 64 62 2d 3e 61 44 62 29 3b  ee(db, db->aDb);
3fd0: 0a 20 20 20 20 64 62 2d 3e 61 44 62 20 3d 20 64  .    db->aDb = d
3fe0: 62 2d 3e 61 44 62 53 74 61 74 69 63 3b 0a 20 20  b->aDbStatic;.  
3ff0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 65 74  }.}../*.** Reset
4000: 20 74 68 65 20 73 63 68 65 6d 61 20 66 6f 72 20   the schema for 
4010: 74 68 65 20 64 61 74 61 62 61 73 65 20 61 74 20  the database at 
4020: 69 6e 64 65 78 20 69 44 62 2e 20 20 41 6c 73 6f  index iDb.  Also
4030: 20 72 65 73 65 74 20 74 68 65 0a 2a 2a 20 54 45   reset the.** TE
4040: 4d 50 20 73 63 68 65 6d 61 2e 0a 2a 2f 0a 76 6f  MP schema..*/.vo
4050: 69 64 20 73 71 6c 69 74 65 33 52 65 73 65 74 4f  id sqlite3ResetO
4060: 6e 65 53 63 68 65 6d 61 28 73 71 6c 69 74 65 33  neSchema(sqlite3
4070: 20 2a 64 62 2c 20 69 6e 74 20 69 44 62 29 7b 0a   *db, int iDb){.
4080: 20 20 44 62 20 2a 70 44 62 3b 0a 20 20 61 73 73    Db *pDb;.  ass
4090: 65 72 74 28 20 69 44 62 3c 64 62 2d 3e 6e 44 62  ert( iDb<db->nDb
40a0: 20 29 3b 0a 0a 20 20 2f 2a 20 43 61 73 65 20 31   );..  /* Case 1
40b0: 3a 20 20 52 65 73 65 74 20 74 68 65 20 73 69 6e  :  Reset the sin
40c0: 67 6c 65 20 73 63 68 65 6d 61 20 69 64 65 6e 74  gle schema ident
40d0: 69 66 69 65 64 20 62 79 20 69 44 62 20 2a 2f 0a  ified by iDb */.
40e0: 20 20 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62    pDb = &db->aDb
40f0: 5b 69 44 62 5d 3b 0a 20 20 61 73 73 65 72 74 28  [iDb];.  assert(
4100: 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75   sqlite3SchemaMu
4110: 74 65 78 48 65 6c 64 28 64 62 2c 20 69 44 62 2c  texHeld(db, iDb,
4120: 20 30 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28   0) );.  assert(
4130: 20 70 44 62 2d 3e 70 53 63 68 65 6d 61 21 3d 30   pDb->pSchema!=0
4140: 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 63 68   );.  sqlite3Sch
4150: 65 6d 61 43 6c 65 61 72 28 70 44 62 2d 3e 70 53  emaClear(pDb->pS
4160: 63 68 65 6d 61 29 3b 0a 0a 20 20 2f 2a 20 49 66  chema);..  /* If
4170: 20 61 6e 79 20 64 61 74 61 62 61 73 65 20 6f 74   any database ot
4180: 68 65 72 20 74 68 61 6e 20 54 45 4d 50 20 69 73  her than TEMP is
4190: 20 72 65 73 65 74 2c 20 74 68 65 6e 20 61 6c 73   reset, then als
41a0: 6f 20 72 65 73 65 74 20 54 45 4d 50 0a 20 20 2a  o reset TEMP.  *
41b0: 2a 20 73 69 6e 63 65 20 54 45 4d 50 20 6d 69 67  * since TEMP mig
41c0: 68 74 20 62 65 20 68 6f 6c 64 69 6e 67 20 74 72  ht be holding tr
41d0: 69 67 67 65 72 73 20 74 68 61 74 20 72 65 66 65  iggers that refe
41e0: 72 65 6e 63 65 20 74 61 62 6c 65 73 20 69 6e 20  rence tables in 
41f0: 74 68 65 0a 20 20 2a 2a 20 6f 74 68 65 72 20 64  the.  ** other d
4200: 61 74 61 62 61 73 65 2e 0a 20 20 2a 2f 0a 20 20  atabase..  */.  
4210: 69 66 28 20 69 44 62 21 3d 31 20 29 7b 0a 20 20  if( iDb!=1 ){.  
4220: 20 20 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62    pDb = &db->aDb
4230: 5b 31 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28  [1];.    assert(
4240: 20 70 44 62 2d 3e 70 53 63 68 65 6d 61 21 3d 30   pDb->pSchema!=0
4250: 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53   );.    sqlite3S
4260: 63 68 65 6d 61 43 6c 65 61 72 28 70 44 62 2d 3e  chemaClear(pDb->
4270: 70 53 63 68 65 6d 61 29 3b 0a 20 20 7d 0a 20 20  pSchema);.  }.  
4280: 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  return;.}../*.**
4290: 20 45 72 61 73 65 20 61 6c 6c 20 73 63 68 65 6d   Erase all schem
42a0: 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72  a information fr
42b0: 6f 6d 20 61 6c 6c 20 61 74 74 61 63 68 65 64 20  om all attached 
42c0: 64 61 74 61 62 61 73 65 73 20 28 69 6e 63 6c 75  databases (inclu
42d0: 64 69 6e 67 0a 2a 2a 20 22 6d 61 69 6e 22 20 61  ding.** "main" a
42e0: 6e 64 20 22 74 65 6d 70 22 29 20 66 6f 72 20 61  nd "temp") for a
42f0: 20 73 69 6e 67 6c 65 20 64 61 74 61 62 61 73 65   single database
4300: 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a   connection..*/.
4310: 76 6f 69 64 20 73 71 6c 69 74 65 33 52 65 73 65  void sqlite3Rese
4320: 74 41 6c 6c 53 63 68 65 6d 61 73 4f 66 43 6f 6e  tAllSchemasOfCon
4330: 6e 65 63 74 69 6f 6e 28 73 71 6c 69 74 65 33 20  nection(sqlite3 
4340: 2a 64 62 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  *db){.  int i;. 
4350: 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
4360: 65 72 41 6c 6c 28 64 62 29 3b 0a 20 20 66 6f 72  erAll(db);.  for
4370: 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b  (i=0; i<db->nDb;
4380: 20 69 2b 2b 29 7b 0a 20 20 20 20 44 62 20 2a 70   i++){.    Db *p
4390: 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 5d  Db = &db->aDb[i]
43a0: 3b 0a 20 20 20 20 69 66 28 20 70 44 62 2d 3e 70  ;.    if( pDb->p
43b0: 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 20 20  Schema ){.      
43c0: 73 71 6c 69 74 65 33 53 63 68 65 6d 61 43 6c 65  sqlite3SchemaCle
43d0: 61 72 28 70 44 62 2d 3e 70 53 63 68 65 6d 61 29  ar(pDb->pSchema)
43e0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 64 62  ;.    }.  }.  db
43f0: 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49  ->flags &= ~SQLI
4400: 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73  TE_InternChanges
4410: 3b 0a 20 20 73 71 6c 69 74 65 33 56 74 61 62 55  ;.  sqlite3VtabU
4420: 6e 6c 6f 63 6b 4c 69 73 74 28 64 62 29 3b 0a 20  nlockList(db);. 
4430: 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
4440: 76 65 41 6c 6c 28 64 62 29 3b 0a 20 20 73 71 6c  veAll(db);.  sql
4450: 69 74 65 33 43 6f 6c 6c 61 70 73 65 44 61 74 61  ite3CollapseData
4460: 62 61 73 65 41 72 72 61 79 28 64 62 29 3b 0a 7d  baseArray(db);.}
4470: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
4480: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77  tine is called w
4490: 68 65 6e 20 61 20 63 6f 6d 6d 69 74 20 6f 63 63  hen a commit occ
44a0: 75 72 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  urs..*/.void sql
44b0: 69 74 65 33 43 6f 6d 6d 69 74 49 6e 74 65 72 6e  ite3CommitIntern
44c0: 61 6c 43 68 61 6e 67 65 73 28 73 71 6c 69 74 65  alChanges(sqlite
44d0: 33 20 2a 64 62 29 7b 0a 20 20 64 62 2d 3e 66 6c  3 *db){.  db->fl
44e0: 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 49  ags &= ~SQLITE_I
44f0: 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a 7d 0a  nternChanges;.}.
4500: 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 6d 65  ./*.** Delete me
4510: 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 65 64 20 66  mory allocated f
4520: 6f 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61  or the column na
4530: 6d 65 73 20 6f 66 20 61 20 74 61 62 6c 65 20 6f  mes of a table o
4540: 72 20 76 69 65 77 20 28 74 68 65 0a 2a 2a 20 54  r view (the.** T
4550: 61 62 6c 65 2e 61 43 6f 6c 5b 5d 20 61 72 72 61  able.aCol[] arra
4560: 79 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  y)..*/.void sqli
4570: 74 65 33 44 65 6c 65 74 65 43 6f 6c 75 6d 6e 4e  te3DeleteColumnN
4580: 61 6d 65 73 28 73 71 6c 69 74 65 33 20 2a 64 62  ames(sqlite3 *db
4590: 2c 20 54 61 62 6c 65 20 2a 70 54 61 62 6c 65 29  , Table *pTable)
45a0: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 43 6f 6c  {.  int i;.  Col
45b0: 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 61 73 73  umn *pCol;.  ass
45c0: 65 72 74 28 20 70 54 61 62 6c 65 21 3d 30 20 29  ert( pTable!=0 )
45d0: 3b 0a 20 20 69 66 28 20 28 70 43 6f 6c 20 3d 20  ;.  if( (pCol = 
45e0: 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 29 21 3d 30  pTable->aCol)!=0
45f0: 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   ){.    for(i=0;
4600: 20 69 3c 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3b   i<pTable->nCol;
4610: 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20   i++, pCol++){. 
4620: 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
4630: 65 65 28 64 62 2c 20 70 43 6f 6c 2d 3e 7a 4e 61  ee(db, pCol->zNa
4640: 6d 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  me);.      sqlit
4650: 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c  e3ExprDelete(db,
4660: 20 70 43 6f 6c 2d 3e 70 44 66 6c 74 29 3b 0a 20   pCol->pDflt);. 
4670: 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
4680: 65 65 28 64 62 2c 20 70 43 6f 6c 2d 3e 7a 43 6f  ee(db, pCol->zCo
4690: 6c 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  ll);.    }.    s
46a0: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
46b0: 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 29 3b 0a   pTable->aCol);.
46c0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d    }.}../*.** Rem
46d0: 6f 76 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 64  ove the memory d
46e0: 61 74 61 20 73 74 72 75 63 74 75 72 65 73 20 61  ata structures a
46f0: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
4700: 68 65 20 67 69 76 65 6e 0a 2a 2a 20 54 61 62 6c  he given.** Tabl
4710: 65 2e 20 20 4e 6f 20 63 68 61 6e 67 65 73 20 61  e.  No changes a
4720: 72 65 20 6d 61 64 65 20 74 6f 20 64 69 73 6b 20  re made to disk 
4730: 62 79 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e  by this routine.
4740: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
4750: 69 6e 65 20 6a 75 73 74 20 64 65 6c 65 74 65 73  ine just deletes
4760: 20 74 68 65 20 64 61 74 61 20 73 74 72 75 63 74   the data struct
4770: 75 72 65 2e 20 20 49 74 20 64 6f 65 73 20 6e 6f  ure.  It does no
4780: 74 20 75 6e 6c 69 6e 6b 0a 2a 2a 20 74 68 65 20  t unlink.** the 
4790: 74 61 62 6c 65 20 64 61 74 61 20 73 74 72 75 63  table data struc
47a0: 74 75 72 65 20 66 72 6f 6d 20 74 68 65 20 68 61  ture from the ha
47b0: 73 68 20 74 61 62 6c 65 2e 20 20 42 75 74 20 69  sh table.  But i
47c0: 74 20 64 6f 65 73 20 64 65 73 74 72 6f 79 0a 2a  t does destroy.*
47d0: 2a 20 6d 65 6d 6f 72 79 20 73 74 72 75 63 74 75  * memory structu
47e0: 72 65 73 20 6f 66 20 74 68 65 20 69 6e 64 69 63  res of the indic
47f0: 65 73 20 61 6e 64 20 66 6f 72 65 69 67 6e 20 6b  es and foreign k
4800: 65 79 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  eys associated w
4810: 69 74 68 20 0a 2a 2a 20 74 68 65 20 74 61 62 6c  ith .** the tabl
4820: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 62 20  e..**.** The db 
4830: 70 61 72 61 6d 65 74 65 72 20 69 73 20 6f 70 74  parameter is opt
4840: 69 6f 6e 61 6c 2e 20 20 49 74 20 69 73 20 6e 65  ional.  It is ne
4850: 65 64 65 64 20 69 66 20 74 68 65 20 54 61 62 6c  eded if the Tabl
4860: 65 20 6f 62 6a 65 63 74 20 0a 2a 2a 20 63 6f 6e  e object .** con
4870: 74 61 69 6e 73 20 6c 6f 6f 6b 61 73 69 64 65 20  tains lookaside 
4880: 6d 65 6d 6f 72 79 2e 20 20 28 54 61 62 6c 65 20  memory.  (Table 
4890: 6f 62 6a 65 63 74 73 20 69 6e 20 74 68 65 20 73  objects in the s
48a0: 63 68 65 6d 61 20 64 6f 20 6e 6f 74 20 75 73 65  chema do not use
48b0: 0a 2a 2a 20 6c 6f 6f 6b 61 73 69 64 65 20 6d 65  .** lookaside me
48c0: 6d 6f 72 79 2c 20 62 75 74 20 73 6f 6d 65 20 65  mory, but some e
48d0: 70 68 65 6d 65 72 61 6c 20 54 61 62 6c 65 20 6f  phemeral Table o
48e0: 62 6a 65 63 74 73 20 64 6f 2e 29 20 20 4f 72 20  bjects do.)  Or 
48f0: 74 68 65 0a 2a 2a 20 64 62 20 70 61 72 61 6d 65  the.** db parame
4900: 74 65 72 20 63 61 6e 20 62 65 20 75 73 65 64 20  ter can be used 
4910: 77 69 74 68 20 64 62 2d 3e 70 6e 42 79 74 65 73  with db->pnBytes
4920: 46 72 65 65 64 20 74 6f 20 6d 65 61 73 75 72 65  Freed to measure
4930: 20 74 68 65 20 6d 65 6d 6f 72 79 0a 2a 2a 20 75   the memory.** u
4940: 73 65 64 20 62 79 20 74 68 65 20 54 61 62 6c 65  sed by the Table
4950: 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 76 6f 69 64   object..*/.void
4960: 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61   sqlite3DeleteTa
4970: 62 6c 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  ble(sqlite3 *db,
4980: 20 54 61 62 6c 65 20 2a 70 54 61 62 6c 65 29 7b   Table *pTable){
4990: 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78  .  Index *pIndex
49a0: 2c 20 2a 70 4e 65 78 74 3b 0a 20 20 54 45 53 54  , *pNext;.  TEST
49b0: 4f 4e 4c 59 28 20 69 6e 74 20 6e 4c 6f 6f 6b 61  ONLY( int nLooka
49c0: 73 69 64 65 3b 20 29 20 2f 2a 20 55 73 65 64 20  side; ) /* Used 
49d0: 74 6f 20 76 65 72 69 66 79 20 6c 6f 6f 6b 61 73  to verify lookas
49e0: 69 64 65 20 6e 6f 74 20 75 73 65 64 20 66 6f 72  ide not used for
49f0: 20 73 63 68 65 6d 61 20 2a 2f 0a 0a 20 20 61 73   schema */..  as
4a00: 73 65 72 74 28 20 21 70 54 61 62 6c 65 20 7c 7c  sert( !pTable ||
4a10: 20 70 54 61 62 6c 65 2d 3e 6e 52 65 66 3e 30 20   pTable->nRef>0 
4a20: 29 3b 0a 0a 20 20 2f 2a 20 44 6f 20 6e 6f 74 20  );..  /* Do not 
4a30: 64 65 6c 65 74 65 20 74 68 65 20 74 61 62 6c 65  delete the table
4a40: 20 75 6e 74 69 6c 20 74 68 65 20 72 65 66 65 72   until the refer
4a50: 65 6e 63 65 20 63 6f 75 6e 74 20 72 65 61 63 68  ence count reach
4a60: 65 73 20 7a 65 72 6f 2e 20 2a 2f 0a 20 20 69 66  es zero. */.  if
4a70: 28 20 21 70 54 61 62 6c 65 20 29 20 72 65 74 75  ( !pTable ) retu
4a80: 72 6e 3b 0a 20 20 69 66 28 20 28 28 21 64 62 20  rn;.  if( ((!db 
4a90: 7c 7c 20 64 62 2d 3e 70 6e 42 79 74 65 73 46 72  || db->pnBytesFr
4aa0: 65 65 64 3d 3d 30 29 20 26 26 20 28 2d 2d 70 54  eed==0) && (--pT
4ab0: 61 62 6c 65 2d 3e 6e 52 65 66 29 3e 30 29 20 29  able->nRef)>0) )
4ac0: 20 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 52   return;..  /* R
4ad0: 65 63 6f 72 64 20 74 68 65 20 6e 75 6d 62 65 72  ecord the number
4ae0: 20 6f 66 20 6f 75 74 73 74 61 6e 64 69 6e 67 20   of outstanding 
4af0: 6c 6f 6f 6b 61 73 69 64 65 20 61 6c 6c 6f 63 61  lookaside alloca
4b00: 74 69 6f 6e 73 20 69 6e 20 73 63 68 65 6d 61 20  tions in schema 
4b10: 54 61 62 6c 65 73 0a 20 20 2a 2a 20 70 72 69 6f  Tables.  ** prio
4b20: 72 20 74 6f 20 64 6f 69 6e 67 20 61 6e 79 20 66  r to doing any f
4b30: 72 65 65 28 29 20 6f 70 65 72 61 74 69 6f 6e 73  ree() operations
4b40: 2e 20 20 53 69 6e 63 65 20 73 63 68 65 6d 61 20  .  Since schema 
4b50: 54 61 62 6c 65 73 20 64 6f 20 6e 6f 74 20 75 73  Tables do not us
4b60: 65 0a 20 20 2a 2a 20 6c 6f 6f 6b 61 73 69 64 65  e.  ** lookaside
4b70: 2c 20 74 68 69 73 20 6e 75 6d 62 65 72 20 73 68  , this number sh
4b80: 6f 75 6c 64 20 6e 6f 74 20 63 68 61 6e 67 65 2e  ould not change.
4b90: 20 2a 2f 0a 20 20 54 45 53 54 4f 4e 4c 59 28 20   */.  TESTONLY( 
4ba0: 6e 4c 6f 6f 6b 61 73 69 64 65 20 3d 20 28 64 62  nLookaside = (db
4bb0: 20 26 26 20 28 70 54 61 62 6c 65 2d 3e 74 61 62   && (pTable->tab
4bc0: 46 6c 61 67 73 20 26 20 54 46 5f 45 70 68 65 6d  Flags & TF_Ephem
4bd0: 65 72 61 6c 29 3d 3d 30 29 20 3f 0a 20 20 20 20  eral)==0) ?.    
4be0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4bf0: 20 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69       db->lookasi
4c00: 64 65 2e 6e 4f 75 74 20 3a 20 30 20 29 3b 0a 0a  de.nOut : 0 );..
4c10: 20 20 2f 2a 20 44 65 6c 65 74 65 20 61 6c 6c 20    /* Delete all 
4c20: 69 6e 64 69 63 65 73 20 61 73 73 6f 63 69 61 74  indices associat
4c30: 65 64 20 77 69 74 68 20 74 68 69 73 20 74 61 62  ed with this tab
4c40: 6c 65 2e 20 2a 2f 0a 20 20 66 6f 72 28 70 49 6e  le. */.  for(pIn
4c50: 64 65 78 20 3d 20 70 54 61 62 6c 65 2d 3e 70 49  dex = pTable->pI
4c60: 6e 64 65 78 3b 20 70 49 6e 64 65 78 3b 20 70 49  ndex; pIndex; pI
4c70: 6e 64 65 78 3d 70 4e 65 78 74 29 7b 0a 20 20 20  ndex=pNext){.   
4c80: 20 70 4e 65 78 74 20 3d 20 70 49 6e 64 65 78 2d   pNext = pIndex-
4c90: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 61 73 73 65  >pNext;.    asse
4ca0: 72 74 28 20 70 49 6e 64 65 78 2d 3e 70 53 63 68  rt( pIndex->pSch
4cb0: 65 6d 61 3d 3d 70 54 61 62 6c 65 2d 3e 70 53 63  ema==pTable->pSc
4cc0: 68 65 6d 61 20 29 3b 0a 20 20 20 20 69 66 28 20  hema );.    if( 
4cd0: 21 64 62 20 7c 7c 20 64 62 2d 3e 70 6e 42 79 74  !db || db->pnByt
4ce0: 65 73 46 72 65 65 64 3d 3d 30 20 29 7b 0a 20 20  esFreed==0 ){.  
4cf0: 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20      char *zName 
4d00: 3d 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 3b  = pIndex->zName;
4d10: 20 0a 20 20 20 20 20 20 54 45 53 54 4f 4e 4c 59   .      TESTONLY
4d20: 20 28 20 49 6e 64 65 78 20 2a 70 4f 6c 64 20 3d   ( Index *pOld =
4d30: 20 29 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e   ) sqlite3HashIn
4d40: 73 65 72 74 28 0a 20 20 20 20 20 20 20 20 20 26  sert(.         &
4d50: 70 49 6e 64 65 78 2d 3e 70 53 63 68 65 6d 61 2d  pIndex->pSchema-
4d60: 3e 69 64 78 48 61 73 68 2c 20 7a 4e 61 6d 65 2c  >idxHash, zName,
4d70: 20 30 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20   0.      );.    
4d80: 20 20 61 73 73 65 72 74 28 20 64 62 3d 3d 30 20    assert( db==0 
4d90: 7c 7c 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61  || sqlite3Schema
4da0: 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20 30 2c  MutexHeld(db, 0,
4db0: 20 70 49 6e 64 65 78 2d 3e 70 53 63 68 65 6d 61   pIndex->pSchema
4dc0: 29 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  ) );.      asser
4dd0: 74 28 20 70 4f 6c 64 3d 3d 70 49 6e 64 65 78 20  t( pOld==pIndex 
4de0: 7c 7c 20 70 4f 6c 64 3d 3d 30 20 29 3b 0a 20 20  || pOld==0 );.  
4df0: 20 20 7d 0a 20 20 20 20 66 72 65 65 49 6e 64 65    }.    freeInde
4e00: 78 28 64 62 2c 20 70 49 6e 64 65 78 29 3b 0a 20  x(db, pIndex);. 
4e10: 20 7d 0a 0a 20 20 2f 2a 20 44 65 6c 65 74 65 20   }..  /* Delete 
4e20: 61 6e 79 20 66 6f 72 65 69 67 6e 20 6b 65 79 73  any foreign keys
4e30: 20 61 74 74 61 63 68 65 64 20 74 6f 20 74 68 69   attached to thi
4e40: 73 20 74 61 62 6c 65 2e 20 2a 2f 0a 20 20 73 71  s table. */.  sq
4e50: 6c 69 74 65 33 46 6b 44 65 6c 65 74 65 28 64 62  lite3FkDelete(db
4e60: 2c 20 70 54 61 62 6c 65 29 3b 0a 0a 20 20 2f 2a  , pTable);..  /*
4e70: 20 44 65 6c 65 74 65 20 74 68 65 20 54 61 62 6c   Delete the Tabl
4e80: 65 20 73 74 72 75 63 74 75 72 65 20 69 74 73 65  e structure itse
4e90: 6c 66 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  lf..  */.  sqlit
4ea0: 65 33 44 65 6c 65 74 65 43 6f 6c 75 6d 6e 4e 61  e3DeleteColumnNa
4eb0: 6d 65 73 28 64 62 2c 20 70 54 61 62 6c 65 29 3b  mes(db, pTable);
4ec0: 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
4ed0: 28 64 62 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e 61  (db, pTable->zNa
4ee0: 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62  me);.  sqlite3Db
4ef0: 46 72 65 65 28 64 62 2c 20 70 54 61 62 6c 65 2d  Free(db, pTable-
4f00: 3e 7a 43 6f 6c 41 66 66 29 3b 0a 20 20 73 71 6c  >zColAff);.  sql
4f10: 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65  ite3SelectDelete
4f20: 28 64 62 2c 20 70 54 61 62 6c 65 2d 3e 70 53 65  (db, pTable->pSe
4f30: 6c 65 63 74 29 3b 0a 20 20 73 71 6c 69 74 65 33  lect);.  sqlite3
4f40: 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64  ExprListDelete(d
4f50: 62 2c 20 70 54 61 62 6c 65 2d 3e 70 43 68 65 63  b, pTable->pChec
4f60: 6b 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  k);.#ifndef SQLI
4f70: 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
4f80: 41 42 4c 45 0a 20 20 73 71 6c 69 74 65 33 56 74  ABLE.  sqlite3Vt
4f90: 61 62 43 6c 65 61 72 28 64 62 2c 20 70 54 61 62  abClear(db, pTab
4fa0: 6c 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71  le);.#endif.  sq
4fb0: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
4fc0: 70 54 61 62 6c 65 29 3b 0a 0a 20 20 2f 2a 20 56  pTable);..  /* V
4fd0: 65 72 69 66 79 20 74 68 61 74 20 6e 6f 20 6c 6f  erify that no lo
4fe0: 6f 6b 61 73 69 64 65 20 6d 65 6d 6f 72 79 20 77  okaside memory w
4ff0: 61 73 20 75 73 65 64 20 62 79 20 73 63 68 65 6d  as used by schem
5000: 61 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20 61 73  a tables */.  as
5010: 73 65 72 74 28 20 6e 4c 6f 6f 6b 61 73 69 64 65  sert( nLookaside
5020: 3d 3d 30 20 7c 7c 20 6e 4c 6f 6f 6b 61 73 69 64  ==0 || nLookasid
5030: 65 3d 3d 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65  e==db->lookaside
5040: 2e 6e 4f 75 74 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  .nOut );.}../*.*
5050: 2a 20 55 6e 6c 69 6e 6b 20 74 68 65 20 67 69 76  * Unlink the giv
5060: 65 6e 20 74 61 62 6c 65 20 66 72 6f 6d 20 74 68  en table from th
5070: 65 20 68 61 73 68 20 74 61 62 6c 65 73 20 61 6e  e hash tables an
5080: 64 20 74 68 65 20 64 65 6c 65 74 65 20 74 68 65  d the delete the
5090: 0a 2a 2a 20 74 61 62 6c 65 20 73 74 72 75 63 74  .** table struct
50a0: 75 72 65 20 77 69 74 68 20 61 6c 6c 20 69 74 73  ure with all its
50b0: 20 69 6e 64 69 63 65 73 20 61 6e 64 20 66 6f 72   indices and for
50c0: 65 69 67 6e 20 6b 65 79 73 2e 0a 2a 2f 0a 76 6f  eign keys..*/.vo
50d0: 69 64 20 73 71 6c 69 74 65 33 55 6e 6c 69 6e 6b  id sqlite3Unlink
50e0: 41 6e 64 44 65 6c 65 74 65 54 61 62 6c 65 28 73  AndDeleteTable(s
50f0: 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20  qlite3 *db, int 
5100: 69 44 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  iDb, const char 
5110: 2a 7a 54 61 62 4e 61 6d 65 29 7b 0a 20 20 54 61  *zTabName){.  Ta
5120: 62 6c 65 20 2a 70 3b 0a 20 20 44 62 20 2a 70 44  ble *p;.  Db *pD
5130: 62 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 64 62  b;..  assert( db
5140: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
5150: 20 69 44 62 3e 3d 30 20 26 26 20 69 44 62 3c 64   iDb>=0 && iDb<d
5160: 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 61 73 73 65  b->nDb );.  asse
5170: 72 74 28 20 7a 54 61 62 4e 61 6d 65 20 29 3b 0a  rt( zTabName );.
5180: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
5190: 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64  3SchemaMutexHeld
51a0: 28 64 62 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a  (db, iDb, 0) );.
51b0: 20 20 74 65 73 74 63 61 73 65 28 20 7a 54 61 62    testcase( zTab
51c0: 4e 61 6d 65 5b 30 5d 3d 3d 30 20 29 3b 20 20 2f  Name[0]==0 );  /
51d0: 2a 20 5a 65 72 6f 2d 6c 65 6e 67 74 68 20 74 61  * Zero-length ta
51e0: 62 6c 65 20 6e 61 6d 65 73 20 61 72 65 20 61 6c  ble names are al
51f0: 6c 6f 77 65 64 20 2a 2f 0a 20 20 70 44 62 20 3d  lowed */.  pDb =
5200: 20 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a   &db->aDb[iDb];.
5210: 20 20 70 20 3d 20 73 71 6c 69 74 65 33 48 61 73    p = sqlite3Has
5220: 68 49 6e 73 65 72 74 28 26 70 44 62 2d 3e 70 53  hInsert(&pDb->pS
5230: 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68 2c 20  chema->tblHash, 
5240: 7a 54 61 62 4e 61 6d 65 2c 20 30 29 3b 0a 20 20  zTabName, 0);.  
5250: 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62  sqlite3DeleteTab
5260: 6c 65 28 64 62 2c 20 70 29 3b 0a 20 20 64 62 2d  le(db, p);.  db-
5270: 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45  >flags |= SQLITE
5280: 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a  _InternChanges;.
5290: 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61  }../*.** Given a
52a0: 20 74 6f 6b 65 6e 2c 20 72 65 74 75 72 6e 20 61   token, return a
52b0: 20 73 74 72 69 6e 67 20 74 68 61 74 20 63 6f 6e   string that con
52c0: 73 69 73 74 73 20 6f 66 20 74 68 65 20 74 65 78  sists of the tex
52d0: 74 20 6f 66 20 74 68 61 74 0a 2a 2a 20 74 6f 6b  t of that.** tok
52e0: 65 6e 2e 20 20 53 70 61 63 65 20 74 6f 20 68 6f  en.  Space to ho
52f0: 6c 64 20 74 68 65 20 72 65 74 75 72 6e 65 64 20  ld the returned 
5300: 73 74 72 69 6e 67 0a 2a 2a 20 69 73 20 6f 62 74  string.** is obt
5310: 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74  ained from sqlit
5320: 65 4d 61 6c 6c 6f 63 28 29 20 61 6e 64 20 6d 75  eMalloc() and mu
5330: 73 74 20 62 65 20 66 72 65 65 64 20 62 79 20 74  st be freed by t
5340: 68 65 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 66 75  he calling.** fu
5350: 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 41 6e  nction..**.** An
5360: 79 20 71 75 6f 74 61 74 69 6f 6e 20 6d 61 72 6b  y quotation mark
5370: 73 20 28 65 78 3a 20 20 22 6e 61 6d 65 22 2c 20  s (ex:  "name", 
5380: 27 6e 61 6d 65 27 2c 20 5b 6e 61 6d 65 5d 2c 20  'name', [name], 
5390: 6f 72 20 60 6e 61 6d 65 60 29 20 74 68 61 74 0a  or `name`) that.
53a0: 2a 2a 20 73 75 72 72 6f 75 6e 64 20 74 68 65 20  ** surround the 
53b0: 62 6f 64 79 20 6f 66 20 74 68 65 20 74 6f 6b 65  body of the toke
53c0: 6e 20 61 72 65 20 72 65 6d 6f 76 65 64 2e 0a 2a  n are removed..*
53d0: 2a 0a 2a 2a 20 54 6f 6b 65 6e 73 20 61 72 65 20  *.** Tokens are 
53e0: 6f 66 74 65 6e 20 6a 75 73 74 20 70 6f 69 6e 74  often just point
53f0: 65 72 73 20 69 6e 74 6f 20 74 68 65 20 6f 72 69  ers into the ori
5400: 67 69 6e 61 6c 20 53 51 4c 20 74 65 78 74 20 61  ginal SQL text a
5410: 6e 64 20 73 6f 0a 2a 2a 20 61 72 65 20 6e 6f 74  nd so.** are not
5420: 20 5c 30 30 30 20 74 65 72 6d 69 6e 61 74 65 64   \000 terminated
5430: 20 61 6e 64 20 61 72 65 20 6e 6f 74 20 70 65 72   and are not per
5440: 73 69 73 74 65 6e 74 2e 20 20 54 68 65 20 72 65  sistent.  The re
5450: 74 75 72 6e 65 64 20 73 74 72 69 6e 67 0a 2a 2a  turned string.**
5460: 20 69 73 20 5c 30 30 30 20 74 65 72 6d 69 6e 61   is \000 termina
5470: 74 65 64 20 61 6e 64 20 69 73 20 70 65 72 73 69  ted and is persi
5480: 73 74 65 6e 74 2e 0a 2a 2f 0a 63 68 61 72 20 2a  stent..*/.char *
5490: 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54  sqlite3NameFromT
54a0: 6f 6b 65 6e 28 73 71 6c 69 74 65 33 20 2a 64 62  oken(sqlite3 *db
54b0: 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 29 7b  , Token *pName){
54c0: 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a  .  char *zName;.
54d0: 20 20 69 66 28 20 70 4e 61 6d 65 20 29 7b 0a 20    if( pName ){. 
54e0: 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74     zName = sqlit
54f0: 65 33 44 62 53 74 72 4e 44 75 70 28 64 62 2c 20  e3DbStrNDup(db, 
5500: 28 63 68 61 72 2a 29 70 4e 61 6d 65 2d 3e 7a 2c  (char*)pName->z,
5510: 20 70 4e 61 6d 65 2d 3e 6e 29 3b 0a 20 20 20 20   pName->n);.    
5520: 73 71 6c 69 74 65 33 44 65 71 75 6f 74 65 28 7a  sqlite3Dequote(z
5530: 4e 61 6d 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Name);.  }else{.
5540: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20      zName = 0;. 
5550: 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 4e 61 6d   }.  return zNam
5560: 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e  e;.}../*.** Open
5570: 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74   the sqlite_mast
5580: 65 72 20 74 61 62 6c 65 20 73 74 6f 72 65 64 20  er table stored 
5590: 69 6e 20 64 61 74 61 62 61 73 65 20 6e 75 6d 62  in database numb
55a0: 65 72 20 69 44 62 20 66 6f 72 0a 2a 2a 20 77 72  er iDb for.** wr
55b0: 69 74 69 6e 67 2e 20 54 68 65 20 74 61 62 6c 65  iting. The table
55c0: 20 69 73 20 6f 70 65 6e 65 64 20 75 73 69 6e 67   is opened using
55d0: 20 63 75 72 73 6f 72 20 30 2e 0a 2a 2f 0a 76 6f   cursor 0..*/.vo
55e0: 69 64 20 73 71 6c 69 74 65 33 4f 70 65 6e 4d 61  id sqlite3OpenMa
55f0: 73 74 65 72 54 61 62 6c 65 28 50 61 72 73 65 20  sterTable(Parse 
5600: 2a 70 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20 20  *p, int iDb){.  
5610: 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65  Vdbe *v = sqlite
5620: 33 47 65 74 56 64 62 65 28 70 29 3b 0a 20 20 73  3GetVdbe(p);.  s
5630: 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28  qlite3TableLock(
5640: 70 2c 20 69 44 62 2c 20 4d 41 53 54 45 52 5f 52  p, iDb, MASTER_R
5650: 4f 4f 54 2c 20 31 2c 20 53 43 48 45 4d 41 5f 54  OOT, 1, SCHEMA_T
5660: 41 42 4c 45 28 69 44 62 29 29 3b 0a 20 20 73 71  ABLE(iDb));.  sq
5670: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49  lite3VdbeAddOp4I
5680: 6e 74 28 76 2c 20 4f 50 5f 4f 70 65 6e 57 72 69  nt(v, OP_OpenWri
5690: 74 65 2c 20 30 2c 20 4d 41 53 54 45 52 5f 52 4f  te, 0, MASTER_RO
56a0: 4f 54 2c 20 69 44 62 2c 20 35 29 3b 0a 20 20 69  OT, iDb, 5);.  i
56b0: 66 28 20 70 2d 3e 6e 54 61 62 3d 3d 30 20 29 7b  f( p->nTab==0 ){
56c0: 0a 20 20 20 20 70 2d 3e 6e 54 61 62 20 3d 20 31  .    p->nTab = 1
56d0: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50  ;.  }.}../*.** P
56e0: 61 72 61 6d 65 74 65 72 20 7a 4e 61 6d 65 20 70  arameter zName p
56f0: 6f 69 6e 74 73 20 74 6f 20 61 20 6e 75 6c 2d 74  oints to a nul-t
5700: 65 72 6d 69 6e 61 74 65 64 20 62 75 66 66 65 72  erminated buffer
5710: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
5720: 6e 61 6d 65 0a 2a 2a 20 6f 66 20 61 20 64 61 74  name.** of a dat
5730: 61 62 61 73 65 20 28 22 6d 61 69 6e 22 2c 20 22  abase ("main", "
5740: 74 65 6d 70 22 20 6f 72 20 74 68 65 20 6e 61 6d  temp" or the nam
5750: 65 20 6f 66 20 61 6e 20 61 74 74 61 63 68 65 64  e of an attached
5760: 20 64 62 29 2e 20 54 68 69 73 0a 2a 2a 20 66 75   db). This.** fu
5770: 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 74  nction returns t
5780: 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20  he index of the 
5790: 6e 61 6d 65 64 20 64 61 74 61 62 61 73 65 20 69  named database i
57a0: 6e 20 64 62 2d 3e 61 44 62 5b 5d 2c 20 6f 72 0a  n db->aDb[], or.
57b0: 2a 2a 20 2d 31 20 69 66 20 74 68 65 20 6e 61 6d  ** -1 if the nam
57c0: 65 64 20 64 62 20 63 61 6e 6e 6f 74 20 62 65 20  ed db cannot be 
57d0: 66 6f 75 6e 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  found..*/.int sq
57e0: 6c 69 74 65 33 46 69 6e 64 44 62 4e 61 6d 65 28  lite3FindDbName(
57f0: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e  sqlite3 *db, con
5800: 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b  st char *zName){
5810: 0a 20 20 69 6e 74 20 69 20 3d 20 2d 31 3b 20 20  .  int i = -1;  
5820: 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
5830: 73 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 69  se number */.  i
5840: 66 28 20 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20  f( zName ){.    
5850: 44 62 20 2a 70 44 62 3b 0a 20 20 20 20 66 6f 72  Db *pDb;.    for
5860: 28 69 3d 28 64 62 2d 3e 6e 44 62 2d 31 29 2c 20  (i=(db->nDb-1), 
5870: 70 44 62 3d 26 64 62 2d 3e 61 44 62 5b 69 5d 3b  pDb=&db->aDb[i];
5880: 20 69 3e 3d 30 3b 20 69 2d 2d 2c 20 70 44 62 2d   i>=0; i--, pDb-
5890: 2d 29 7b 0a 20 20 20 20 20 20 69 66 28 20 30 3d  -){.      if( 0=
58a0: 3d 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28  =sqlite3StrICmp(
58b0: 70 44 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d  pDb->zName, zNam
58c0: 65 29 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  e) ) break;.    
58d0: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 69  }.  }.  return i
58e0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 74  ;.}../*.** The t
58f0: 6f 6b 65 6e 20 2a 70 4e 61 6d 65 20 63 6f 6e 74  oken *pName cont
5900: 61 69 6e 73 20 74 68 65 20 6e 61 6d 65 20 6f 66  ains the name of
5910: 20 61 20 64 61 74 61 62 61 73 65 20 28 65 69 74   a database (eit
5920: 68 65 72 20 22 6d 61 69 6e 22 20 6f 72 0a 2a 2a  her "main" or.**
5930: 20 22 74 65 6d 70 22 20 6f 72 20 74 68 65 20 6e   "temp" or the n
5940: 61 6d 65 20 6f 66 20 61 6e 20 61 74 74 61 63 68  ame of an attach
5950: 65 64 20 64 62 29 2e 20 54 68 69 73 20 72 6f 75  ed db). This rou
5960: 74 69 6e 65 20 72 65 74 75 72 6e 73 20 74 68 65  tine returns the
5970: 0a 2a 2a 20 69 6e 64 65 78 20 6f 66 20 74 68 65  .** index of the
5980: 20 6e 61 6d 65 64 20 64 61 74 61 62 61 73 65 20   named database 
5990: 69 6e 20 64 62 2d 3e 61 44 62 5b 5d 2c 20 6f 72  in db->aDb[], or
59a0: 20 2d 31 20 69 66 20 74 68 65 20 6e 61 6d 65 64   -1 if the named
59b0: 20 64 62 20 0a 2a 2a 20 64 6f 65 73 20 6e 6f 74   db .** does not
59c0: 20 65 78 69 73 74 2e 0a 2a 2f 0a 69 6e 74 20 73   exist..*/.int s
59d0: 71 6c 69 74 65 33 46 69 6e 64 44 62 28 73 71 6c  qlite3FindDb(sql
59e0: 69 74 65 33 20 2a 64 62 2c 20 54 6f 6b 65 6e 20  ite3 *db, Token 
59f0: 2a 70 4e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 69  *pName){.  int i
5a00: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
5a10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5a20: 2f 2a 20 44 61 74 61 62 61 73 65 20 6e 75 6d 62  /* Database numb
5a30: 65 72 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4e  er */.  char *zN
5a40: 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ame;            
5a50: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
5a60: 4e 61 6d 65 20 77 65 20 61 72 65 20 73 65 61 72  Name we are sear
5a70: 63 68 69 6e 67 20 66 6f 72 20 2a 2f 0a 20 20 7a  ching for */.  z
5a80: 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61  Name = sqlite3Na
5a90: 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20  meFromToken(db, 
5aa0: 70 4e 61 6d 65 29 3b 0a 20 20 69 20 3d 20 73 71  pName);.  i = sq
5ab0: 6c 69 74 65 33 46 69 6e 64 44 62 4e 61 6d 65 28  lite3FindDbName(
5ac0: 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 73 71  db, zName);.  sq
5ad0: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
5ae0: 7a 4e 61 6d 65 29 3b 0a 20 20 72 65 74 75 72 6e  zName);.  return
5af0: 20 69 3b 0a 7d 0a 0a 2f 2a 20 54 68 65 20 74 61   i;.}../* The ta
5b00: 62 6c 65 20 6f 72 20 76 69 65 77 20 6f 72 20 74  ble or view or t
5b10: 72 69 67 67 65 72 20 6e 61 6d 65 20 69 73 20 70  rigger name is p
5b20: 61 73 73 65 64 20 74 6f 20 74 68 69 73 20 72 6f  assed to this ro
5b30: 75 74 69 6e 65 20 76 69 61 20 74 6f 6b 65 6e 73  utine via tokens
5b40: 0a 2a 2a 20 70 4e 61 6d 65 31 20 61 6e 64 20 70  .** pName1 and p
5b50: 4e 61 6d 65 32 2e 20 49 66 20 74 68 65 20 74 61  Name2. If the ta
5b60: 62 6c 65 20 6e 61 6d 65 20 77 61 73 20 66 75 6c  ble name was ful
5b70: 6c 79 20 71 75 61 6c 69 66 69 65 64 2c 20 66 6f  ly qualified, fo
5b80: 72 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a  r example:.**.**
5b90: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 78 78   CREATE TABLE xx
5ba0: 78 2e 79 79 79 20 28 2e 2e 2e 29 3b 0a 2a 2a 20  x.yyy (...);.** 
5bb0: 0a 2a 2a 20 54 68 65 6e 20 70 4e 61 6d 65 31 20  .** Then pName1 
5bc0: 69 73 20 73 65 74 20 74 6f 20 22 78 78 78 22 20  is set to "xxx" 
5bd0: 61 6e 64 20 70 4e 61 6d 65 32 20 22 79 79 79 22  and pName2 "yyy"
5be0: 2e 20 4f 6e 20 74 68 65 20 6f 74 68 65 72 20 68  . On the other h
5bf0: 61 6e 64 20 69 66 0a 2a 2a 20 74 68 65 20 74 61  and if.** the ta
5c00: 62 6c 65 20 6e 61 6d 65 20 69 73 20 6e 6f 74 20  ble name is not 
5c10: 66 75 6c 6c 79 20 71 75 61 6c 69 66 69 65 64 2c  fully qualified,
5c20: 20 69 2e 65 2e 3a 0a 2a 2a 0a 2a 2a 20 43 52 45   i.e.:.**.** CRE
5c30: 41 54 45 20 54 41 42 4c 45 20 79 79 79 28 2e 2e  ATE TABLE yyy(..
5c40: 2e 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 70  .);.**.** Then p
5c50: 4e 61 6d 65 31 20 69 73 20 73 65 74 20 74 6f 20  Name1 is set to 
5c60: 22 79 79 79 22 20 61 6e 64 20 70 4e 61 6d 65 32  "yyy" and pName2
5c70: 20 69 73 20 22 22 2e 0a 2a 2a 0a 2a 2a 20 54 68   is ""..**.** Th
5c80: 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20  is routine sets 
5c90: 74 68 65 20 2a 70 70 55 6e 71 75 61 6c 20 70 6f  the *ppUnqual po
5ca0: 69 6e 74 65 72 20 74 6f 20 70 6f 69 6e 74 20 61  inter to point a
5cb0: 74 20 74 68 65 20 74 6f 6b 65 6e 20 28 70 4e 61  t the token (pNa
5cc0: 6d 65 31 20 6f 72 0a 2a 2a 20 70 4e 61 6d 65 32  me1 or.** pName2
5cd0: 29 20 74 68 61 74 20 73 74 6f 72 65 73 20 74 68  ) that stores th
5ce0: 65 20 75 6e 71 75 61 6c 69 66 69 65 64 20 74 61  e unqualified ta
5cf0: 62 6c 65 20 6e 61 6d 65 2e 20 20 54 68 65 20 69  ble name.  The i
5d00: 6e 64 65 78 20 6f 66 20 74 68 65 0a 2a 2a 20 64  ndex of the.** d
5d10: 61 74 61 62 61 73 65 20 22 78 78 78 22 20 69 73  atabase "xxx" is
5d20: 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e   returned..*/.in
5d30: 74 20 73 71 6c 69 74 65 33 54 77 6f 50 61 72 74  t sqlite3TwoPart
5d40: 4e 61 6d 65 28 0a 20 20 50 61 72 73 65 20 2a 70  Name(.  Parse *p
5d50: 50 61 72 73 65 2c 20 20 20 20 20 20 2f 2a 20 50  Parse,      /* P
5d60: 61 72 73 69 6e 67 20 61 6e 64 20 63 6f 64 65 20  arsing and code 
5d70: 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65  generating conte
5d80: 78 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  xt */.  Token *p
5d90: 4e 61 6d 65 31 2c 20 20 20 20 20 20 2f 2a 20 54  Name1,      /* T
5da0: 68 65 20 22 78 78 78 22 20 69 6e 20 74 68 65 20  he "xxx" in the 
5db0: 6e 61 6d 65 20 22 78 78 78 2e 79 79 79 22 20 6f  name "xxx.yyy" o
5dc0: 72 20 22 78 78 78 22 20 2a 2f 0a 20 20 54 6f 6b  r "xxx" */.  Tok
5dd0: 65 6e 20 2a 70 4e 61 6d 65 32 2c 20 20 20 20 20  en *pName2,     
5de0: 20 2f 2a 20 54 68 65 20 22 79 79 79 22 20 69 6e   /* The "yyy" in
5df0: 20 74 68 65 20 6e 61 6d 65 20 22 78 78 78 2e 79   the name "xxx.y
5e00: 79 79 22 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  yy" */.  Token *
5e10: 2a 70 55 6e 71 75 61 6c 20 20 20 20 20 2f 2a 20  *pUnqual     /* 
5e20: 57 72 69 74 65 20 74 68 65 20 75 6e 71 75 61 6c  Write the unqual
5e30: 69 66 69 65 64 20 6f 62 6a 65 63 74 20 6e 61 6d  ified object nam
5e40: 65 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69  e here */.){.  i
5e50: 6e 74 20 69 44 62 3b 20 20 20 20 20 20 20 20 20  nt iDb;         
5e60: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61             /* Da
5e70: 74 61 62 61 73 65 20 68 6f 6c 64 69 6e 67 20 74  tabase holding t
5e80: 68 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 73  he object */.  s
5e90: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
5ea0: 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 61 73 73 65  rse->db;..  asse
5eb0: 72 74 28 20 70 4e 61 6d 65 32 21 3d 30 20 29 3b  rt( pName2!=0 );
5ec0: 0a 20 20 69 66 28 20 70 4e 61 6d 65 32 2d 3e 6e  .  if( pName2->n
5ed0: 3e 30 20 29 7b 0a 20 20 20 20 69 66 28 20 64 62  >0 ){.    if( db
5ee0: 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 20 7b 0a  ->init.busy ) {.
5ef0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
5f00: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 63  orMsg(pParse, "c
5f10: 6f 72 72 75 70 74 20 64 61 74 61 62 61 73 65 22  orrupt database"
5f20: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
5f30: 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2a 70  -1;.    }.    *p
5f40: 55 6e 71 75 61 6c 20 3d 20 70 4e 61 6d 65 32 3b  Unqual = pName2;
5f50: 0a 20 20 20 20 69 44 62 20 3d 20 73 71 6c 69 74  .    iDb = sqlit
5f60: 65 33 46 69 6e 64 44 62 28 64 62 2c 20 70 4e 61  e3FindDb(db, pNa
5f70: 6d 65 31 29 3b 0a 20 20 20 20 69 66 28 20 69 44  me1);.    if( iD
5f80: 62 3c 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  b<0 ){.      sql
5f90: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
5fa0: 72 73 65 2c 20 22 75 6e 6b 6e 6f 77 6e 20 64 61  rse, "unknown da
5fb0: 74 61 62 61 73 65 20 25 54 22 2c 20 70 4e 61 6d  tabase %T", pNam
5fc0: 65 31 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  e1);.      retur
5fd0: 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  n -1;.    }.  }e
5fe0: 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28  lse{.    assert(
5ff0: 20 64 62 2d 3e 69 6e 69 74 2e 69 44 62 3d 3d 30   db->init.iDb==0
6000: 20 7c 7c 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73   || db->init.bus
6010: 79 20 29 3b 0a 20 20 20 20 69 44 62 20 3d 20 64  y );.    iDb = d
6020: 62 2d 3e 69 6e 69 74 2e 69 44 62 3b 0a 20 20 20  b->init.iDb;.   
6030: 20 2a 70 55 6e 71 75 61 6c 20 3d 20 70 4e 61 6d   *pUnqual = pNam
6040: 65 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  e1;.  }.  return
6050: 20 69 44 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54   iDb;.}../*.** T
6060: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75  his routine is u
6070: 73 65 64 20 74 6f 20 63 68 65 63 6b 20 69 66 20  sed to check if 
6080: 74 68 65 20 55 54 46 2d 38 20 73 74 72 69 6e 67  the UTF-8 string
6090: 20 7a 4e 61 6d 65 20 69 73 20 61 20 6c 65 67 61   zName is a lega
60a0: 6c 0a 2a 2a 20 75 6e 71 75 61 6c 69 66 69 65 64  l.** unqualified
60b0: 20 6e 61 6d 65 20 66 6f 72 20 61 20 6e 65 77 20   name for a new 
60c0: 73 63 68 65 6d 61 20 6f 62 6a 65 63 74 20 28 74  schema object (t
60d0: 61 62 6c 65 2c 20 69 6e 64 65 78 2c 20 76 69 65  able, index, vie
60e0: 77 20 6f 72 0a 2a 2a 20 74 72 69 67 67 65 72 29  w or.** trigger)
60f0: 2e 20 41 6c 6c 20 6e 61 6d 65 73 20 61 72 65 20  . All names are 
6100: 6c 65 67 61 6c 20 65 78 63 65 70 74 20 74 68 6f  legal except tho
6110: 73 65 20 74 68 61 74 20 62 65 67 69 6e 20 77 69  se that begin wi
6120: 74 68 20 74 68 65 20 73 74 72 69 6e 67 0a 2a 2a  th the string.**
6130: 20 22 73 71 6c 69 74 65 5f 22 20 28 69 6e 20 75   "sqlite_" (in u
6140: 70 70 65 72 2c 20 6c 6f 77 65 72 20 6f 72 20 6d  pper, lower or m
6150: 69 78 65 64 20 63 61 73 65 29 2e 20 54 68 69 73  ixed case). This
6160: 20 70 6f 72 74 69 6f 6e 20 6f 66 20 74 68 65 20   portion of the 
6170: 6e 61 6d 65 73 70 61 63 65 0a 2a 2a 20 69 73 20  namespace.** is 
6180: 72 65 73 65 72 76 65 64 20 66 6f 72 20 69 6e 74  reserved for int
6190: 65 72 6e 61 6c 20 75 73 65 2e 0a 2a 2f 0a 69 6e  ernal use..*/.in
61a0: 74 20 73 71 6c 69 74 65 33 43 68 65 63 6b 4f 62  t sqlite3CheckOb
61b0: 6a 65 63 74 4e 61 6d 65 28 50 61 72 73 65 20 2a  jectName(Parse *
61c0: 70 50 61 72 73 65 2c 20 63 6f 6e 73 74 20 63 68  pParse, const ch
61d0: 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69 66  ar *zName){.  if
61e0: 28 20 21 70 50 61 72 73 65 2d 3e 64 62 2d 3e 69  ( !pParse->db->i
61f0: 6e 69 74 2e 62 75 73 79 20 26 26 20 70 50 61 72  nit.busy && pPar
6200: 73 65 2d 3e 6e 65 73 74 65 64 3d 3d 30 20 0a 20  se->nested==0 . 
6210: 20 20 20 20 20 20 20 20 20 26 26 20 28 70 50 61           && (pPa
6220: 72 73 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26  rse->db->flags &
6230: 20 53 51 4c 49 54 45 5f 57 72 69 74 65 53 63 68   SQLITE_WriteSch
6240: 65 6d 61 29 3d 3d 30 0a 20 20 20 20 20 20 20 20  ema)==0.        
6250: 20 20 26 26 20 30 3d 3d 73 71 6c 69 74 65 33 53    && 0==sqlite3S
6260: 74 72 4e 49 43 6d 70 28 7a 4e 61 6d 65 2c 20 22  trNICmp(zName, "
6270: 73 71 6c 69 74 65 5f 22 2c 20 37 29 20 29 7b 0a  sqlite_", 7) ){.
6280: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
6290: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6f 62 6a  Msg(pParse, "obj
62a0: 65 63 74 20 6e 61 6d 65 20 72 65 73 65 72 76 65  ect name reserve
62b0: 64 20 66 6f 72 20 69 6e 74 65 72 6e 61 6c 20 75  d for internal u
62c0: 73 65 3a 20 25 73 22 2c 20 7a 4e 61 6d 65 29 3b  se: %s", zName);
62d0: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
62e0: 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  TE_ERROR;.  }.  
62f0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
6300: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
6310: 6e 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45  n the PRIMARY KE
6320: 59 20 69 6e 64 65 78 20 6f 66 20 61 20 74 61 62  Y index of a tab
6330: 6c 65 0a 2a 2f 0a 49 6e 64 65 78 20 2a 73 71 6c  le.*/.Index *sql
6340: 69 74 65 33 50 72 69 6d 61 72 79 4b 65 79 49 6e  ite3PrimaryKeyIn
6350: 64 65 78 28 54 61 62 6c 65 20 2a 70 54 61 62 29  dex(Table *pTab)
6360: 7b 0a 20 20 49 6e 64 65 78 20 2a 70 3b 0a 20 20  {.  Index *p;.  
6370: 66 6f 72 28 70 3d 70 54 61 62 2d 3e 70 49 6e 64  for(p=pTab->pInd
6380: 65 78 3b 20 70 20 26 26 20 21 49 73 50 72 69 6d  ex; p && !IsPrim
6390: 61 72 79 4b 65 79 49 6e 64 65 78 28 70 29 3b 20  aryKeyIndex(p); 
63a0: 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 7d 0a 20 20  p=p->pNext){}.  
63b0: 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a  return p;.}../*.
63c0: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 63 6f  ** Return the co
63d0: 6c 75 6d 6e 20 6f 66 20 69 6e 64 65 78 20 70 49  lumn of index pI
63e0: 64 78 20 74 68 61 74 20 63 6f 72 72 65 73 70 6f  dx that correspo
63f0: 6e 64 73 20 74 6f 20 74 61 62 6c 65 0a 2a 2a 20  nds to table.** 
6400: 63 6f 6c 75 6d 6e 20 69 43 6f 6c 2e 20 20 52 65  column iCol.  Re
6410: 74 75 72 6e 20 2d 31 20 69 66 20 6e 6f 74 20 66  turn -1 if not f
6420: 6f 75 6e 64 2e 0a 2a 2f 0a 69 31 36 20 73 71 6c  ound..*/.i16 sql
6430: 69 74 65 33 43 6f 6c 75 6d 6e 4f 66 49 6e 64 65  ite3ColumnOfInde
6440: 78 28 49 6e 64 65 78 20 2a 70 49 64 78 2c 20 69  x(Index *pIdx, i
6450: 31 36 20 69 43 6f 6c 29 7b 0a 20 20 69 6e 74 20  16 iCol){.  int 
6460: 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  i;.  for(i=0; i<
6470: 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69  pIdx->nColumn; i
6480: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 69 43 6f  ++){.    if( iCo
6490: 6c 3d 3d 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d  l==pIdx->aiColum
64a0: 6e 5b 69 5d 20 29 20 72 65 74 75 72 6e 20 69 3b  n[i] ) return i;
64b0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 2d 31  .  }.  return -1
64c0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65 67 69 6e  ;.}../*.** Begin
64d0: 20 63 6f 6e 73 74 72 75 63 74 69 6e 67 20 61 20   constructing a 
64e0: 6e 65 77 20 74 61 62 6c 65 20 72 65 70 72 65 73  new table repres
64f0: 65 6e 74 61 74 69 6f 6e 20 69 6e 20 6d 65 6d 6f  entation in memo
6500: 72 79 2e 20 20 54 68 69 73 20 69 73 0a 2a 2a 20  ry.  This is.** 
6510: 74 68 65 20 66 69 72 73 74 20 6f 66 20 73 65 76  the first of sev
6520: 65 72 61 6c 20 61 63 74 69 6f 6e 20 72 6f 75 74  eral action rout
6530: 69 6e 65 73 20 74 68 61 74 20 67 65 74 20 63 61  ines that get ca
6540: 6c 6c 65 64 20 69 6e 20 72 65 73 70 6f 6e 73 65  lled in response
6550: 0a 2a 2a 20 74 6f 20 61 20 43 52 45 41 54 45 20  .** to a CREATE 
6560: 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e  TABLE statement.
6570: 20 20 49 6e 20 70 61 72 74 69 63 75 6c 61 72 2c    In particular,
6580: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
6590: 20 63 61 6c 6c 65 64 0a 2a 2a 20 61 66 74 65 72   called.** after
65a0: 20 73 65 65 69 6e 67 20 74 6f 6b 65 6e 73 20 22   seeing tokens "
65b0: 43 52 45 41 54 45 22 20 61 6e 64 20 22 54 41 42  CREATE" and "TAB
65c0: 4c 45 22 20 61 6e 64 20 74 68 65 20 74 61 62 6c  LE" and the tabl
65d0: 65 20 6e 61 6d 65 2e 20 54 68 65 20 69 73 54 65  e name. The isTe
65e0: 6d 70 0a 2a 2a 20 66 6c 61 67 20 69 73 20 74 72  mp.** flag is tr
65f0: 75 65 20 69 66 20 74 68 65 20 74 61 62 6c 65 20  ue if the table 
6600: 73 68 6f 75 6c 64 20 62 65 20 73 74 6f 72 65 64  should be stored
6610: 20 69 6e 20 74 68 65 20 61 75 78 69 6c 69 61 72   in the auxiliar
6620: 79 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 66 69  y database.** fi
6630: 6c 65 20 69 6e 73 74 65 61 64 20 6f 66 20 69 6e  le instead of in
6640: 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61   the main databa
6650: 73 65 20 66 69 6c 65 2e 20 20 54 68 69 73 20 69  se file.  This i
6660: 73 20 6e 6f 72 6d 61 6c 6c 79 20 74 68 65 20 63  s normally the c
6670: 61 73 65 0a 2a 2a 20 77 68 65 6e 20 74 68 65 20  ase.** when the 
6680: 22 54 45 4d 50 22 20 6f 72 20 22 54 45 4d 50 4f  "TEMP" or "TEMPO
6690: 52 41 52 59 22 20 6b 65 79 77 6f 72 64 20 6f 63  RARY" keyword oc
66a0: 63 75 72 73 20 69 6e 20 62 65 74 77 65 65 6e 0a  curs in between.
66b0: 2a 2a 20 43 52 45 41 54 45 20 61 6e 64 20 54 41  ** CREATE and TA
66c0: 42 4c 45 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e  BLE..**.** The n
66d0: 65 77 20 74 61 62 6c 65 20 72 65 63 6f 72 64 20  ew table record 
66e0: 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 61  is initialized a
66f0: 6e 64 20 70 75 74 20 69 6e 20 70 50 61 72 73 65  nd put in pParse
6700: 2d 3e 70 4e 65 77 54 61 62 6c 65 2e 0a 2a 2a 20  ->pNewTable..** 
6710: 41 73 20 6d 6f 72 65 20 6f 66 20 74 68 65 20 43  As more of the C
6720: 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74  REATE TABLE stat
6730: 65 6d 65 6e 74 20 69 73 20 70 61 72 73 65 64 2c  ement is parsed,
6740: 20 61 64 64 69 74 69 6f 6e 61 6c 20 61 63 74 69   additional acti
6750: 6f 6e 0a 2a 2a 20 72 6f 75 74 69 6e 65 73 20 77  on.** routines w
6760: 69 6c 6c 20 62 65 20 63 61 6c 6c 65 64 20 74 6f  ill be called to
6770: 20 61 64 64 20 6d 6f 72 65 20 69 6e 66 6f 72 6d   add more inform
6780: 61 74 69 6f 6e 20 74 6f 20 74 68 69 73 20 72 65  ation to this re
6790: 63 6f 72 64 2e 0a 2a 2a 20 41 74 20 74 68 65 20  cord..** At the 
67a0: 65 6e 64 20 6f 66 20 74 68 65 20 43 52 45 41 54  end of the CREAT
67b0: 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e  E TABLE statemen
67c0: 74 2c 20 74 68 65 20 73 71 6c 69 74 65 33 45 6e  t, the sqlite3En
67d0: 64 54 61 62 6c 65 28 29 20 72 6f 75 74 69 6e 65  dTable() routine
67e0: 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64 20 74 6f  .** is called to
67f0: 20 63 6f 6d 70 6c 65 74 65 20 74 68 65 20 63 6f   complete the co
6800: 6e 73 74 72 75 63 74 69 6f 6e 20 6f 66 20 74 68  nstruction of th
6810: 65 20 6e 65 77 20 74 61 62 6c 65 20 72 65 63 6f  e new table reco
6820: 72 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  rd..*/.void sqli
6830: 74 65 33 53 74 61 72 74 54 61 62 6c 65 28 0a 20  te3StartTable(. 
6840: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
6850: 20 20 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e 74    /* Parser cont
6860: 65 78 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  ext */.  Token *
6870: 70 4e 61 6d 65 31 2c 20 20 20 2f 2a 20 46 69 72  pName1,   /* Fir
6880: 73 74 20 70 61 72 74 20 6f 66 20 74 68 65 20 6e  st part of the n
6890: 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65  ame of the table
68a0: 20 6f 72 20 76 69 65 77 20 2a 2f 0a 20 20 54 6f   or view */.  To
68b0: 6b 65 6e 20 2a 70 4e 61 6d 65 32 2c 20 20 20 2f  ken *pName2,   /
68c0: 2a 20 53 65 63 6f 6e 64 20 70 61 72 74 20 6f 66  * Second part of
68d0: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
68e0: 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77 20 2a   table or view *
68f0: 2f 0a 20 20 69 6e 74 20 69 73 54 65 6d 70 2c 20  /.  int isTemp, 
6900: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
6910: 74 68 69 73 20 69 73 20 61 20 54 45 4d 50 20 74  this is a TEMP t
6920: 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73  able */.  int is
6930: 56 69 65 77 2c 20 20 20 20 20 20 2f 2a 20 54 72  View,      /* Tr
6940: 75 65 20 69 66 20 74 68 69 73 20 69 73 20 61 20  ue if this is a 
6950: 56 49 45 57 20 2a 2f 0a 20 20 69 6e 74 20 69 73  VIEW */.  int is
6960: 56 69 72 74 75 61 6c 2c 20 20 20 2f 2a 20 54 72  Virtual,   /* Tr
6970: 75 65 20 69 66 20 74 68 69 73 20 69 73 20 61 20  ue if this is a 
6980: 56 49 52 54 55 41 4c 20 74 61 62 6c 65 20 2a 2f  VIRTUAL table */
6990: 0a 20 20 69 6e 74 20 6e 6f 45 72 72 20 20 20 20  .  int noErr    
69a0: 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 68 69 6e      /* Do nothin
69b0: 67 20 69 66 20 74 61 62 6c 65 20 61 6c 72 65 61  g if table alrea
69c0: 64 79 20 65 78 69 73 74 73 20 2a 2f 0a 29 7b 0a  dy exists */.){.
69d0: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 6c 65 3b    Table *pTable;
69e0: 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d  .  char *zName =
69f0: 20 30 3b 20 2f 2a 20 54 68 65 20 6e 61 6d 65 20   0; /* The name 
6a00: 6f 66 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65  of the new table
6a10: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
6a20: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
6a30: 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 69 6e 74    Vdbe *v;.  int
6a40: 20 69 44 62 3b 20 20 20 20 20 20 20 20 20 2f 2a   iDb;         /*
6a50: 20 44 61 74 61 62 61 73 65 20 6e 75 6d 62 65 72   Database number
6a60: 20 74 6f 20 63 72 65 61 74 65 20 74 68 65 20 74   to create the t
6a70: 61 62 6c 65 20 69 6e 20 2a 2f 0a 20 20 54 6f 6b  able in */.  Tok
6a80: 65 6e 20 2a 70 4e 61 6d 65 3b 20 20 20 20 2f 2a  en *pName;    /*
6a90: 20 55 6e 71 75 61 6c 69 66 69 65 64 20 6e 61 6d   Unqualified nam
6aa0: 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74  e of the table t
6ab0: 6f 20 63 72 65 61 74 65 20 2a 2f 0a 0a 20 20 69  o create */..  i
6ac0: 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  f( db->init.busy
6ad0: 20 26 26 20 64 62 2d 3e 69 6e 69 74 2e 6e 65 77   && db->init.new
6ae0: 54 6e 75 6d 3d 3d 31 20 29 7b 0a 20 20 20 20 2f  Tnum==1 ){.    /
6af0: 2a 20 53 70 65 63 69 61 6c 20 63 61 73 65 3a 20  * Special case: 
6b00: 20 50 61 72 73 69 6e 67 20 74 68 65 20 73 71 6c   Parsing the sql
6b10: 69 74 65 5f 6d 61 73 74 65 72 20 6f 72 20 73 71  ite_master or sq
6b20: 6c 69 74 65 5f 74 65 6d 70 5f 6d 61 73 74 65 72  lite_temp_master
6b30: 20 73 63 68 65 6d 61 20 2a 2f 0a 20 20 20 20 69   schema */.    i
6b40: 44 62 20 3d 20 64 62 2d 3e 69 6e 69 74 2e 69 44  Db = db->init.iD
6b50: 62 3b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73  b;.    zName = s
6b60: 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64  qlite3DbStrDup(d
6b70: 62 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28  b, SCHEMA_TABLE(
6b80: 69 44 62 29 29 3b 0a 20 20 20 20 70 4e 61 6d 65  iDb));.    pName
6b90: 20 3d 20 70 4e 61 6d 65 31 3b 0a 20 20 7d 65 6c   = pName1;.  }el
6ba0: 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 63  se{.    /* The c
6bb0: 6f 6d 6d 6f 6e 20 63 61 73 65 20 2a 2f 0a 20 20  ommon case */.  
6bc0: 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 54    iDb = sqlite3T
6bd0: 77 6f 50 61 72 74 4e 61 6d 65 28 70 50 61 72 73  woPartName(pPars
6be0: 65 2c 20 70 4e 61 6d 65 31 2c 20 70 4e 61 6d 65  e, pName1, pName
6bf0: 32 2c 20 26 70 4e 61 6d 65 29 3b 0a 20 20 20 20  2, &pName);.    
6c00: 69 66 28 20 69 44 62 3c 30 20 29 20 72 65 74 75  if( iDb<0 ) retu
6c10: 72 6e 3b 0a 20 20 20 20 69 66 28 20 21 4f 4d 49  rn;.    if( !OMI
6c20: 54 5f 54 45 4d 50 44 42 20 26 26 20 69 73 54 65  T_TEMPDB && isTe
6c30: 6d 70 20 26 26 20 70 4e 61 6d 65 32 2d 3e 6e 3e  mp && pName2->n>
6c40: 30 20 26 26 20 69 44 62 21 3d 31 20 29 7b 0a 20  0 && iDb!=1 ){. 
6c50: 20 20 20 20 20 2f 2a 20 49 66 20 63 72 65 61 74       /* If creat
6c60: 69 6e 67 20 61 20 74 65 6d 70 20 74 61 62 6c 65  ing a temp table
6c70: 2c 20 74 68 65 20 6e 61 6d 65 20 6d 61 79 20 6e  , the name may n
6c80: 6f 74 20 62 65 20 71 75 61 6c 69 66 69 65 64 2e  ot be qualified.
6c90: 20 55 6e 6c 65 73 73 20 0a 20 20 20 20 20 20 2a   Unless .      *
6ca0: 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6e  * the database n
6cb0: 61 6d 65 20 69 73 20 22 74 65 6d 70 22 20 61 6e  ame is "temp" an
6cc0: 79 77 61 79 2e 20 20 2a 2f 0a 20 20 20 20 20 20  yway.  */.      
6cd0: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
6ce0: 70 50 61 72 73 65 2c 20 22 74 65 6d 70 6f 72 61  pParse, "tempora
6cf0: 72 79 20 74 61 62 6c 65 20 6e 61 6d 65 20 6d 75  ry table name mu
6d00: 73 74 20 62 65 20 75 6e 71 75 61 6c 69 66 69 65  st be unqualifie
6d10: 64 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  d");.      retur
6d20: 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  n;.    }.    if(
6d30: 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26 26   !OMIT_TEMPDB &&
6d40: 20 69 73 54 65 6d 70 20 29 20 69 44 62 20 3d 20   isTemp ) iDb = 
6d50: 31 3b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73  1;.    zName = s
6d60: 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f  qlite3NameFromTo
6d70: 6b 65 6e 28 64 62 2c 20 70 4e 61 6d 65 29 3b 0a  ken(db, pName);.
6d80: 20 20 7d 0a 20 20 70 50 61 72 73 65 2d 3e 73 4e    }.  pParse->sN
6d90: 61 6d 65 54 6f 6b 65 6e 20 3d 20 2a 70 4e 61 6d  ameToken = *pNam
6da0: 65 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d  e;.  if( zName==
6db0: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66  0 ) return;.  if
6dc0: 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c  ( SQLITE_OK!=sql
6dd0: 69 74 65 33 43 68 65 63 6b 4f 62 6a 65 63 74 4e  ite3CheckObjectN
6de0: 61 6d 65 28 70 50 61 72 73 65 2c 20 7a 4e 61 6d  ame(pParse, zNam
6df0: 65 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 62  e) ){.    goto b
6e00: 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72  egin_table_error
6e10: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 64 62 2d 3e  ;.  }.  if( db->
6e20: 69 6e 69 74 2e 69 44 62 3d 3d 31 20 29 20 69 73  init.iDb==1 ) is
6e30: 54 65 6d 70 20 3d 20 31 3b 0a 23 69 66 6e 64 65  Temp = 1;.#ifnde
6e40: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
6e50: 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 61 73  THORIZATION.  as
6e60: 73 65 72 74 28 20 69 73 54 65 6d 70 3d 3d 30 20  sert( isTemp==0 
6e70: 7c 7c 20 69 73 54 65 6d 70 3d 3d 31 20 29 3b 0a  || isTemp==1 );.
6e80: 20 20 61 73 73 65 72 74 28 20 69 73 56 69 65 77    assert( isView
6e90: 3d 3d 30 20 7c 7c 20 69 73 56 69 65 77 3d 3d 31  ==0 || isView==1
6ea0: 20 29 3b 0a 20 20 7b 0a 20 20 20 20 73 74 61 74   );.  {.    stat
6eb0: 69 63 20 63 6f 6e 73 74 20 75 38 20 61 43 6f 64  ic const u8 aCod
6ec0: 65 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20 53  e[] = {.       S
6ed0: 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 41 42  QLITE_CREATE_TAB
6ee0: 4c 45 2c 0a 20 20 20 20 20 20 20 53 51 4c 49 54  LE,.       SQLIT
6ef0: 45 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f 54 41  E_CREATE_TEMP_TA
6f00: 42 4c 45 2c 0a 20 20 20 20 20 20 20 53 51 4c 49  BLE,.       SQLI
6f10: 54 45 5f 43 52 45 41 54 45 5f 56 49 45 57 2c 0a  TE_CREATE_VIEW,.
6f20: 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 43 52         SQLITE_CR
6f30: 45 41 54 45 5f 54 45 4d 50 5f 56 49 45 57 0a 20  EATE_TEMP_VIEW. 
6f40: 20 20 20 7d 3b 0a 20 20 20 20 63 68 61 72 20 2a     };.    char *
6f50: 7a 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44  zDb = db->aDb[iD
6f60: 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 69 66  b].zName;.    if
6f70: 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65  ( sqlite3AuthChe
6f80: 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54  ck(pParse, SQLIT
6f90: 45 5f 49 4e 53 45 52 54 2c 20 53 43 48 45 4d 41  E_INSERT, SCHEMA
6fa0: 5f 54 41 42 4c 45 28 69 73 54 65 6d 70 29 2c 20  _TABLE(isTemp), 
6fb0: 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20  0, zDb) ){.     
6fc0: 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c   goto begin_tabl
6fd0: 65 5f 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20  e_error;.    }. 
6fe0: 20 20 20 69 66 28 20 21 69 73 56 69 72 74 75 61     if( !isVirtua
6ff0: 6c 20 26 26 20 73 71 6c 69 74 65 33 41 75 74 68  l && sqlite3Auth
7000: 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 28 69  Check(pParse, (i
7010: 6e 74 29 61 43 6f 64 65 5b 69 73 54 65 6d 70 2b  nt)aCode[isTemp+
7020: 32 2a 69 73 56 69 65 77 5d 2c 0a 20 20 20 20 20  2*isView],.     
7030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7040: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7050: 20 20 7a 4e 61 6d 65 2c 20 30 2c 20 7a 44 62 29    zName, 0, zDb)
7060: 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 62   ){.      goto b
7070: 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72  egin_table_error
7080: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  ;.    }.  }.#end
7090: 69 66 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75  if..  /* Make su
70a0: 72 65 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65  re the new table
70b0: 20 6e 61 6d 65 20 64 6f 65 73 20 6e 6f 74 20 63   name does not c
70c0: 6f 6c 6c 69 64 65 20 77 69 74 68 20 61 6e 20 65  ollide with an e
70d0: 78 69 73 74 69 6e 67 0a 20 20 2a 2a 20 69 6e 64  xisting.  ** ind
70e0: 65 78 20 6f 72 20 74 61 62 6c 65 20 6e 61 6d 65  ex or table name
70f0: 20 69 6e 20 74 68 65 20 73 61 6d 65 20 64 61 74   in the same dat
7100: 61 62 61 73 65 2e 20 20 49 73 73 75 65 20 61 6e  abase.  Issue an
7110: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69   error message i
7120: 66 0a 20 20 2a 2a 20 69 74 20 64 6f 65 73 2e 20  f.  ** it does. 
7130: 54 68 65 20 65 78 63 65 70 74 69 6f 6e 20 69 73  The exception is
7140: 20 69 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e   if the statemen
7150: 74 20 62 65 69 6e 67 20 70 61 72 73 65 64 20 77  t being parsed w
7160: 61 73 20 70 61 73 73 65 64 0a 20 20 2a 2a 20 74  as passed.  ** t
7170: 6f 20 61 6e 20 73 71 6c 69 74 65 33 5f 64 65 63  o an sqlite3_dec
7180: 6c 61 72 65 5f 76 74 61 62 28 29 20 63 61 6c 6c  lare_vtab() call
7190: 2e 20 49 6e 20 74 68 61 74 20 63 61 73 65 20 6f  . In that case o
71a0: 6e 6c 79 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e  nly the column n
71b0: 61 6d 65 73 0a 20 20 2a 2a 20 61 6e 64 20 74 79  ames.  ** and ty
71c0: 70 65 73 20 77 69 6c 6c 20 62 65 20 75 73 65 64  pes will be used
71d0: 2c 20 73 6f 20 74 68 65 72 65 20 69 73 20 6e 6f  , so there is no
71e0: 20 6e 65 65 64 20 74 6f 20 74 65 73 74 20 66 6f   need to test fo
71f0: 72 20 6e 61 6d 65 73 70 61 63 65 0a 20 20 2a 2a  r namespace.  **
7200: 20 63 6f 6c 6c 69 73 69 6f 6e 73 2e 0a 20 20 2a   collisions..  *
7210: 2f 0a 20 20 69 66 28 20 21 49 4e 5f 44 45 43 4c  /.  if( !IN_DECL
7220: 41 52 45 5f 56 54 41 42 20 29 7b 0a 20 20 20 20  ARE_VTAB ){.    
7230: 63 68 61 72 20 2a 7a 44 62 20 3d 20 64 62 2d 3e  char *zDb = db->
7240: 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a  aDb[iDb].zName;.
7250: 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f      if( SQLITE_O
7260: 4b 21 3d 73 71 6c 69 74 65 33 52 65 61 64 53 63  K!=sqlite3ReadSc
7270: 68 65 6d 61 28 70 50 61 72 73 65 29 20 29 7b 0a  hema(pParse) ){.
7280: 20 20 20 20 20 20 67 6f 74 6f 20 62 65 67 69 6e        goto begin
7290: 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b 0a 20 20  _table_error;.  
72a0: 20 20 7d 0a 20 20 20 20 70 54 61 62 6c 65 20 3d    }.    pTable =
72b0: 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c   sqlite3FindTabl
72c0: 65 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 7a 44 62  e(db, zName, zDb
72d0: 29 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62 6c  );.    if( pTabl
72e0: 65 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 21  e ){.      if( !
72f0: 6e 6f 45 72 72 20 29 7b 0a 20 20 20 20 20 20 20  noErr ){.       
7300: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
7310: 28 70 50 61 72 73 65 2c 20 22 74 61 62 6c 65 20  (pParse, "table 
7320: 25 54 20 61 6c 72 65 61 64 79 20 65 78 69 73 74  %T already exist
7330: 73 22 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 20 20  s", pName);.    
7340: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
7350: 20 61 73 73 65 72 74 28 20 21 64 62 2d 3e 69 6e   assert( !db->in
7360: 69 74 2e 62 75 73 79 20 7c 7c 20 43 4f 52 52 55  it.busy || CORRU
7370: 50 54 5f 44 42 20 29 3b 0a 20 20 20 20 20 20 20  PT_DB );.       
7380: 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69   sqlite3CodeVeri
7390: 66 79 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c  fySchema(pParse,
73a0: 20 69 44 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20   iDb);.      }. 
73b0: 20 20 20 20 20 67 6f 74 6f 20 62 65 67 69 6e 5f       goto begin_
73c0: 74 61 62 6c 65 5f 65 72 72 6f 72 3b 0a 20 20 20  table_error;.   
73d0: 20 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74   }.    if( sqlit
73e0: 65 33 46 69 6e 64 49 6e 64 65 78 28 64 62 2c 20  e3FindIndex(db, 
73f0: 7a 4e 61 6d 65 2c 20 7a 44 62 29 21 3d 30 20 29  zName, zDb)!=0 )
7400: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
7410: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
7420: 22 74 68 65 72 65 20 69 73 20 61 6c 72 65 61 64  "there is alread
7430: 79 20 61 6e 20 69 6e 64 65 78 20 6e 61 6d 65 64  y an index named
7440: 20 25 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20   %s", zName);.  
7450: 20 20 20 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74      goto begin_t
7460: 61 62 6c 65 5f 65 72 72 6f 72 3b 0a 20 20 20 20  able_error;.    
7470: 7d 0a 20 20 7d 0a 0a 20 20 70 54 61 62 6c 65 20  }.  }..  pTable 
7480: 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
7490: 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66  cZero(db, sizeof
74a0: 28 54 61 62 6c 65 29 29 3b 0a 20 20 69 66 28 20  (Table));.  if( 
74b0: 70 54 61 62 6c 65 3d 3d 30 20 29 7b 0a 20 20 20  pTable==0 ){.   
74c0: 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c   assert( db->mal
74d0: 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20  locFailed );.   
74e0: 20 70 50 61 72 73 65 2d 3e 72 63 20 3d 20 53 51   pParse->rc = SQ
74f0: 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  LITE_NOMEM_BKPT;
7500: 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72  .    pParse->nEr
7510: 72 2b 2b 3b 0a 20 20 20 20 67 6f 74 6f 20 62 65  r++;.    goto be
7520: 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b  gin_table_error;
7530: 0a 20 20 7d 0a 20 20 70 54 61 62 6c 65 2d 3e 7a  .  }.  pTable->z
7540: 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20  Name = zName;.  
7550: 70 54 61 62 6c 65 2d 3e 69 50 4b 65 79 20 3d 20  pTable->iPKey = 
7560: 2d 31 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 70 53  -1;.  pTable->pS
7570: 63 68 65 6d 61 20 3d 20 64 62 2d 3e 61 44 62 5b  chema = db->aDb[
7580: 69 44 62 5d 2e 70 53 63 68 65 6d 61 3b 0a 20 20  iDb].pSchema;.  
7590: 70 54 61 62 6c 65 2d 3e 6e 52 65 66 20 3d 20 31  pTable->nRef = 1
75a0: 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 6e 52 6f 77  ;.  pTable->nRow
75b0: 4c 6f 67 45 73 74 20 3d 20 32 30 30 3b 20 61 73  LogEst = 200; as
75c0: 73 65 72 74 28 20 32 30 30 3d 3d 73 71 6c 69 74  sert( 200==sqlit
75d0: 65 33 4c 6f 67 45 73 74 28 31 30 34 38 35 37 36  e3LogEst(1048576
75e0: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
75f0: 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
7600: 3d 3d 30 20 29 3b 0a 20 20 70 50 61 72 73 65 2d  ==0 );.  pParse-
7610: 3e 70 4e 65 77 54 61 62 6c 65 20 3d 20 70 54 61  >pNewTable = pTa
7620: 62 6c 65 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  ble;..  /* If th
7630: 69 73 20 69 73 20 74 68 65 20 6d 61 67 69 63 20  is is the magic 
7640: 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 20  sqlite_sequence 
7650: 74 61 62 6c 65 20 75 73 65 64 20 62 79 20 61 75  table used by au
7660: 74 6f 69 6e 63 72 65 6d 65 6e 74 2c 0a 20 20 2a  toincrement,.  *
7670: 2a 20 74 68 65 6e 20 72 65 63 6f 72 64 20 61 20  * then record a 
7680: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 69 73 20  pointer to this 
7690: 74 61 62 6c 65 20 69 6e 20 74 68 65 20 6d 61 69  table in the mai
76a0: 6e 20 64 61 74 61 62 61 73 65 20 73 74 72 75 63  n database struc
76b0: 74 75 72 65 0a 20 20 2a 2a 20 73 6f 20 74 68 61  ture.  ** so tha
76c0: 74 20 49 4e 53 45 52 54 20 63 61 6e 20 66 69 6e  t INSERT can fin
76d0: 64 20 74 68 65 20 74 61 62 6c 65 20 65 61 73 69  d the table easi
76e0: 6c 79 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66  ly..  */.#ifndef
76f0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
7700: 4f 49 4e 43 52 45 4d 45 4e 54 0a 20 20 69 66 28  OINCREMENT.  if(
7710: 20 21 70 50 61 72 73 65 2d 3e 6e 65 73 74 65 64   !pParse->nested
7720: 20 26 26 20 73 74 72 63 6d 70 28 7a 4e 61 6d 65   && strcmp(zName
7730: 2c 20 22 73 71 6c 69 74 65 5f 73 65 71 75 65 6e  , "sqlite_sequen
7740: 63 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 61  ce")==0 ){.    a
7750: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 53 63  ssert( sqlite3Sc
7760: 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62  hemaMutexHeld(db
7770: 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a 20 20 20  , iDb, 0) );.   
7780: 20 70 54 61 62 6c 65 2d 3e 70 53 63 68 65 6d 61   pTable->pSchema
7790: 2d 3e 70 53 65 71 54 61 62 20 3d 20 70 54 61 62  ->pSeqTab = pTab
77a0: 6c 65 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  le;.  }.#endif..
77b0: 20 20 2f 2a 20 42 65 67 69 6e 20 67 65 6e 65 72    /* Begin gener
77c0: 61 74 69 6e 67 20 74 68 65 20 63 6f 64 65 20 74  ating the code t
77d0: 68 61 74 20 77 69 6c 6c 20 69 6e 73 65 72 74 20  hat will insert 
77e0: 74 68 65 20 74 61 62 6c 65 20 72 65 63 6f 72 64  the table record
77f0: 20 69 6e 74 6f 0a 20 20 2a 2a 20 74 68 65 20 53   into.  ** the S
7800: 51 4c 49 54 45 5f 4d 41 53 54 45 52 20 74 61 62  QLITE_MASTER tab
7810: 6c 65 2e 20 20 4e 6f 74 65 20 69 6e 20 70 61 72  le.  Note in par
7820: 74 69 63 75 6c 61 72 20 74 68 61 74 20 77 65 20  ticular that we 
7830: 6d 75 73 74 20 67 6f 20 61 68 65 61 64 0a 20 20  must go ahead.  
7840: 2a 2a 20 61 6e 64 20 61 6c 6c 6f 63 61 74 65 20  ** and allocate 
7850: 74 68 65 20 72 65 63 6f 72 64 20 6e 75 6d 62 65  the record numbe
7860: 72 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20  r for the table 
7870: 65 6e 74 72 79 20 6e 6f 77 2e 20 20 42 65 66 6f  entry now.  Befo
7880: 72 65 20 61 6e 79 0a 20 20 2a 2a 20 50 52 49 4d  re any.  ** PRIM
7890: 41 52 59 20 4b 45 59 20 6f 72 20 55 4e 49 51 55  ARY KEY or UNIQU
78a0: 45 20 6b 65 79 77 6f 72 64 73 20 61 72 65 20 70  E keywords are p
78b0: 61 72 73 65 64 2e 20 20 54 68 6f 73 65 20 6b 65  arsed.  Those ke
78c0: 79 77 6f 72 64 73 20 77 69 6c 6c 20 63 61 75 73  ywords will caus
78d0: 65 0a 20 20 2a 2a 20 69 6e 64 69 63 65 73 20 74  e.  ** indices t
78e0: 6f 20 62 65 20 63 72 65 61 74 65 64 20 61 6e 64  o be created and
78f0: 20 74 68 65 20 74 61 62 6c 65 20 72 65 63 6f 72   the table recor
7900: 64 20 6d 75 73 74 20 63 6f 6d 65 20 62 65 66 6f  d must come befo
7910: 72 65 20 74 68 65 20 0a 20 20 2a 2a 20 69 6e 64  re the .  ** ind
7920: 69 63 65 73 2e 20 20 48 65 6e 63 65 2c 20 74 68  ices.  Hence, th
7930: 65 20 72 65 63 6f 72 64 20 6e 75 6d 62 65 72 20  e record number 
7940: 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20 6d 75  for the table mu
7950: 73 74 20 62 65 20 61 6c 6c 6f 63 61 74 65 64 0a  st be allocated.
7960: 20 20 2a 2a 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20    ** now..  */. 
7970: 20 69 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62   if( !db->init.b
7980: 75 73 79 20 26 26 20 28 76 20 3d 20 73 71 6c 69  usy && (v = sqli
7990: 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
79a0: 65 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 69 6e  e))!=0 ){.    in
79b0: 74 20 61 64 64 72 31 3b 0a 20 20 20 20 69 6e 74  t addr1;.    int
79c0: 20 66 69 6c 65 46 6f 72 6d 61 74 3b 0a 20 20 20   fileFormat;.   
79d0: 20 69 6e 74 20 72 65 67 31 2c 20 72 65 67 32 2c   int reg1, reg2,
79e0: 20 72 65 67 33 3b 0a 20 20 20 20 2f 2a 20 6e 75   reg3;.    /* nu
79f0: 6c 6c 52 6f 77 5b 5d 20 69 73 20 61 6e 20 4f 50  llRow[] is an OP
7a00: 5f 52 65 63 6f 72 64 20 65 6e 63 6f 64 69 6e 67  _Record encoding
7a10: 20 6f 66 20 61 20 72 6f 77 20 63 6f 6e 74 61 69   of a row contai
7a20: 6e 69 6e 67 20 35 20 4e 55 4c 4c 73 20 2a 2f 0a  ning 5 NULLs */.
7a30: 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74      static const
7a40: 20 63 68 61 72 20 6e 75 6c 6c 52 6f 77 5b 5d 20   char nullRow[] 
7a50: 3d 20 7b 20 36 2c 20 30 2c 20 30 2c 20 30 2c 20  = { 6, 0, 0, 0, 
7a60: 30 2c 20 30 20 7d 3b 0a 20 20 20 20 73 71 6c 69  0, 0 };.    sqli
7a70: 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65  te3BeginWriteOpe
7a80: 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 31  ration(pParse, 1
7a90: 2c 20 69 44 62 29 3b 0a 0a 23 69 66 6e 64 65 66  , iDb);..#ifndef
7aa0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
7ab0: 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 69 66  TUALTABLE.    if
7ac0: 28 20 69 73 56 69 72 74 75 61 6c 20 29 7b 0a 20  ( isVirtual ){. 
7ad0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
7ae0: 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 56 42 65  AddOp0(v, OP_VBe
7af0: 67 69 6e 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  gin);.    }.#end
7b00: 69 66 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  if..    /* If th
7b10: 65 20 66 69 6c 65 20 66 6f 72 6d 61 74 20 61 6e  e file format an
7b20: 64 20 65 6e 63 6f 64 69 6e 67 20 69 6e 20 74 68  d encoding in th
7b30: 65 20 64 61 74 61 62 61 73 65 20 68 61 76 65 20  e database have 
7b40: 6e 6f 74 20 62 65 65 6e 20 73 65 74 2c 20 0a 20  not been set, . 
7b50: 20 20 20 2a 2a 20 73 65 74 20 74 68 65 6d 20 6e     ** set them n
7b60: 6f 77 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72  ow..    */.    r
7b70: 65 67 31 20 3d 20 70 50 61 72 73 65 2d 3e 72 65  eg1 = pParse->re
7b80: 67 52 6f 77 69 64 20 3d 20 2b 2b 70 50 61 72 73  gRowid = ++pPars
7b90: 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 72 65 67  e->nMem;.    reg
7ba0: 32 20 3d 20 70 50 61 72 73 65 2d 3e 72 65 67 52  2 = pParse->regR
7bb0: 6f 6f 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  oot = ++pParse->
7bc0: 6e 4d 65 6d 3b 0a 20 20 20 20 72 65 67 33 20 3d  nMem;.    reg3 =
7bd0: 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
7be0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
7bf0: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 52 65 61  AddOp3(v, OP_Rea
7c00: 64 43 6f 6f 6b 69 65 2c 20 69 44 62 2c 20 72 65  dCookie, iDb, re
7c10: 67 33 2c 20 42 54 52 45 45 5f 46 49 4c 45 5f 46  g3, BTREE_FILE_F
7c20: 4f 52 4d 41 54 29 3b 0a 20 20 20 20 73 71 6c 69  ORMAT);.    sqli
7c30: 74 65 33 56 64 62 65 55 73 65 73 42 74 72 65 65  te3VdbeUsesBtree
7c40: 28 76 2c 20 69 44 62 29 3b 0a 20 20 20 20 61 64  (v, iDb);.    ad
7c50: 64 72 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62  dr1 = sqlite3Vdb
7c60: 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66  eAddOp1(v, OP_If
7c70: 2c 20 72 65 67 33 29 3b 20 56 64 62 65 43 6f 76  , reg3); VdbeCov
7c80: 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 66 69  erage(v);.    fi
7c90: 6c 65 46 6f 72 6d 61 74 20 3d 20 28 64 62 2d 3e  leFormat = (db->
7ca0: 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4c  flags & SQLITE_L
7cb0: 65 67 61 63 79 46 69 6c 65 46 6d 74 29 21 3d 30  egacyFileFmt)!=0
7cc0: 20 3f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   ?.             
7cd0: 20 20 20 20 20 31 20 3a 20 53 51 4c 49 54 45 5f       1 : SQLITE_
7ce0: 4d 41 58 5f 46 49 4c 45 5f 46 4f 52 4d 41 54 3b  MAX_FILE_FORMAT;
7cf0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
7d00: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53 65 74  AddOp3(v, OP_Set
7d10: 43 6f 6f 6b 69 65 2c 20 69 44 62 2c 20 42 54 52  Cookie, iDb, BTR
7d20: 45 45 5f 46 49 4c 45 5f 46 4f 52 4d 41 54 2c 20  EE_FILE_FORMAT, 
7d30: 66 69 6c 65 46 6f 72 6d 61 74 29 3b 0a 20 20 20  fileFormat);.   
7d40: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
7d50: 70 33 28 76 2c 20 4f 50 5f 53 65 74 43 6f 6f 6b  p3(v, OP_SetCook
7d60: 69 65 2c 20 69 44 62 2c 20 42 54 52 45 45 5f 54  ie, iDb, BTREE_T
7d70: 45 58 54 5f 45 4e 43 4f 44 49 4e 47 2c 20 45 4e  EXT_ENCODING, EN
7d80: 43 28 64 62 29 29 3b 0a 20 20 20 20 73 71 6c 69  C(db));.    sqli
7d90: 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
7da0: 76 2c 20 61 64 64 72 31 29 3b 0a 0a 20 20 20 20  v, addr1);..    
7db0: 2f 2a 20 54 68 69 73 20 6a 75 73 74 20 63 72 65  /* This just cre
7dc0: 61 74 65 73 20 61 20 70 6c 61 63 65 2d 68 6f 6c  ates a place-hol
7dd0: 64 65 72 20 72 65 63 6f 72 64 20 69 6e 20 74 68  der record in th
7de0: 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  e sqlite_master 
7df0: 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2a 20 54 68  table..    ** Th
7e00: 65 20 72 65 63 6f 72 64 20 63 72 65 61 74 65 64  e record created
7e10: 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 61 69   does not contai
7e20: 6e 20 61 6e 79 74 68 69 6e 67 20 79 65 74 2e 20  n anything yet. 
7e30: 20 49 74 20 77 69 6c 6c 20 62 65 20 72 65 70 6c   It will be repl
7e40: 61 63 65 64 0a 20 20 20 20 2a 2a 20 62 79 20 74  aced.    ** by t
7e50: 68 65 20 72 65 61 6c 20 65 6e 74 72 79 20 69 6e  he real entry in
7e60: 20 63 6f 64 65 20 67 65 6e 65 72 61 74 65 64 20   code generated 
7e70: 61 74 20 73 71 6c 69 74 65 33 45 6e 64 54 61 62  at sqlite3EndTab
7e80: 6c 65 28 29 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  le()..    **.   
7e90: 20 2a 2a 20 54 68 65 20 72 6f 77 69 64 20 66 6f   ** The rowid fo
7ea0: 72 20 74 68 65 20 6e 65 77 20 65 6e 74 72 79 20  r the new entry 
7eb0: 69 73 20 6c 65 66 74 20 69 6e 20 72 65 67 69 73  is left in regis
7ec0: 74 65 72 20 70 50 61 72 73 65 2d 3e 72 65 67 52  ter pParse->regR
7ed0: 6f 77 69 64 2e 0a 20 20 20 20 2a 2a 20 54 68 65  owid..    ** The
7ee0: 20 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62 65   root page numbe
7ef0: 72 20 6f 66 20 74 68 65 20 6e 65 77 20 74 61 62  r of the new tab
7f00: 6c 65 20 69 73 20 6c 65 66 74 20 69 6e 20 72 65  le is left in re
7f10: 67 20 70 50 61 72 73 65 2d 3e 72 65 67 52 6f 6f  g pParse->regRoo
7f20: 74 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 72 6f  t..    ** The ro
7f30: 77 69 64 20 61 6e 64 20 72 6f 6f 74 20 70 61 67  wid and root pag
7f40: 65 20 6e 75 6d 62 65 72 20 76 61 6c 75 65 73 20  e number values 
7f50: 61 72 65 20 6e 65 65 64 65 64 20 62 79 20 74 68  are needed by th
7f60: 65 20 63 6f 64 65 20 74 68 61 74 0a 20 20 20 20  e code that.    
7f70: 2a 2a 20 73 71 6c 69 74 65 33 45 6e 64 54 61 62  ** sqlite3EndTab
7f80: 6c 65 20 77 69 6c 6c 20 67 65 6e 65 72 61 74 65  le will generate
7f90: 2e 0a 20 20 20 20 2a 2f 0a 23 69 66 20 21 64 65  ..    */.#if !de
7fa0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
7fb0: 54 5f 56 49 45 57 29 20 7c 7c 20 21 64 65 66 69  T_VIEW) || !defi
7fc0: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
7fd0: 56 49 52 54 55 41 4c 54 41 42 4c 45 29 0a 20 20  VIRTUALTABLE).  
7fe0: 20 20 69 66 28 20 69 73 56 69 65 77 20 7c 7c 20    if( isView || 
7ff0: 69 73 56 69 72 74 75 61 6c 20 29 7b 0a 20 20 20  isVirtual ){.   
8000: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
8010: 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
8020: 65 72 2c 20 30 2c 20 72 65 67 32 29 3b 0a 20 20  er, 0, reg2);.  
8030: 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20    }else.#endif. 
8040: 20 20 20 7b 0a 20 20 20 20 20 20 70 50 61 72 73     {.      pPars
8050: 65 2d 3e 61 64 64 72 43 72 54 61 62 20 3d 20 73  e->addrCrTab = s
8060: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
8070: 28 76 2c 20 4f 50 5f 43 72 65 61 74 65 54 61 62  (v, OP_CreateTab
8080: 6c 65 2c 20 69 44 62 2c 20 72 65 67 32 29 3b 0a  le, iDb, reg2);.
8090: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
80a0: 33 4f 70 65 6e 4d 61 73 74 65 72 54 61 62 6c 65  3OpenMasterTable
80b0: 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20  (pParse, iDb);. 
80c0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
80d0: 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 77 52 6f  dOp2(v, OP_NewRo
80e0: 77 69 64 2c 20 30 2c 20 72 65 67 31 29 3b 0a 20  wid, 0, reg1);. 
80f0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
8100: 64 4f 70 34 28 76 2c 20 4f 50 5f 42 6c 6f 62 2c  dOp4(v, OP_Blob,
8110: 20 36 2c 20 72 65 67 33 2c 20 30 2c 20 6e 75 6c   6, reg3, 0, nul
8120: 6c 52 6f 77 2c 20 50 34 5f 53 54 41 54 49 43 29  lRow, P4_STATIC)
8130: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
8140: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e  eAddOp3(v, OP_In
8150: 73 65 72 74 2c 20 30 2c 20 72 65 67 33 2c 20 72  sert, 0, reg3, r
8160: 65 67 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  eg1);.    sqlite
8170: 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c  3VdbeChangeP5(v,
8180: 20 4f 50 46 4c 41 47 5f 41 50 50 45 4e 44 29 3b   OPFLAG_APPEND);
8190: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
81a0: 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 43 6c 6f  AddOp0(v, OP_Clo
81b0: 73 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e  se);.  }..  /* N
81c0: 6f 72 6d 61 6c 20 28 6e 6f 6e 2d 65 72 72 6f 72  ormal (non-error
81d0: 29 20 72 65 74 75 72 6e 2e 20 2a 2f 0a 20 20 72  ) return. */.  r
81e0: 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 49 66 20  eturn;..  /* If 
81f0: 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
8200: 20 77 65 20 6a 75 6d 70 20 68 65 72 65 20 2a 2f   we jump here */
8210: 0a 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72  .begin_table_err
8220: 6f 72 3a 0a 20 20 73 71 6c 69 74 65 33 44 62 46  or:.  sqlite3DbF
8230: 72 65 65 28 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a  ree(db, zName);.
8240: 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20    return;.}../* 
8250: 53 65 74 20 70 72 6f 70 65 72 74 69 65 73 20 6f  Set properties o
8260: 66 20 61 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e  f a table column
8270: 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 28 6d   based on the (m
8280: 61 67 69 63 61 6c 29 0a 2a 2a 20 6e 61 6d 65 20  agical).** name 
8290: 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 2e 0a 2a  of the column..*
82a0: 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41  /.#if SQLITE_ENA
82b0: 42 4c 45 5f 48 49 44 44 45 4e 5f 43 4f 4c 55 4d  BLE_HIDDEN_COLUM
82c0: 4e 53 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43  NS.void sqlite3C
82d0: 6f 6c 75 6d 6e 50 72 6f 70 65 72 74 69 65 73 46  olumnPropertiesF
82e0: 72 6f 6d 4e 61 6d 65 28 54 61 62 6c 65 20 2a 70  romName(Table *p
82f0: 54 61 62 2c 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f  Tab, Column *pCo
8300: 6c 29 7b 0a 20 20 69 66 28 20 73 71 6c 69 74 65  l){.  if( sqlite
8310: 33 5f 73 74 72 6e 69 63 6d 70 28 70 43 6f 6c 2d  3_strnicmp(pCol-
8320: 3e 7a 4e 61 6d 65 2c 20 22 5f 5f 68 69 64 64 65  >zName, "__hidde
8330: 6e 5f 5f 22 2c 20 31 30 29 3d 3d 30 20 29 7b 0a  n__", 10)==0 ){.
8340: 20 20 20 20 70 43 6f 6c 2d 3e 63 6f 6c 46 6c 61      pCol->colFla
8350: 67 73 20 7c 3d 20 43 4f 4c 46 4c 41 47 5f 48 49  gs |= COLFLAG_HI
8360: 44 44 45 4e 3b 0a 20 20 7d 65 6c 73 65 20 69 66  DDEN;.  }else if
8370: 28 20 70 54 61 62 20 26 26 20 70 43 6f 6c 21 3d  ( pTab && pCol!=
8380: 70 54 61 62 2d 3e 61 43 6f 6c 20 26 26 20 28 70  pTab->aCol && (p
8390: 43 6f 6c 5b 2d 31 5d 2e 63 6f 6c 46 6c 61 67 73  Col[-1].colFlags
83a0: 20 26 20 43 4f 4c 46 4c 41 47 5f 48 49 44 44 45   & COLFLAG_HIDDE
83b0: 4e 29 20 29 7b 0a 20 20 20 20 70 54 61 62 2d 3e  N) ){.    pTab->
83c0: 74 61 62 46 6c 61 67 73 20 7c 3d 20 54 46 5f 4f  tabFlags |= TF_O
83d0: 4f 4f 48 69 64 64 65 6e 3b 0a 20 20 7d 0a 7d 0a  OOHidden;.  }.}.
83e0: 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 41  #endif.../*.** A
83f0: 64 64 20 61 20 6e 65 77 20 63 6f 6c 75 6d 6e 20  dd a new column 
8400: 74 6f 20 74 68 65 20 74 61 62 6c 65 20 63 75 72  to the table cur
8410: 72 65 6e 74 6c 79 20 62 65 69 6e 67 20 63 6f 6e  rently being con
8420: 73 74 72 75 63 74 65 64 2e 0a 2a 2a 0a 2a 2a 20  structed..**.** 
8430: 54 68 65 20 70 61 72 73 65 72 20 63 61 6c 6c 73  The parser calls
8440: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6f 6e   this routine on
8450: 63 65 20 66 6f 72 20 65 61 63 68 20 63 6f 6c 75  ce for each colu
8460: 6d 6e 20 64 65 63 6c 61 72 61 74 69 6f 6e 0a 2a  mn declaration.*
8470: 2a 20 69 6e 20 61 20 43 52 45 41 54 45 20 54 41  * in a CREATE TA
8480: 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 20 20  BLE statement.  
8490: 73 71 6c 69 74 65 33 53 74 61 72 74 54 61 62 6c  sqlite3StartTabl
84a0: 65 28 29 20 67 65 74 73 20 63 61 6c 6c 65 64 0a  e() gets called.
84b0: 2a 2a 20 66 69 72 73 74 20 74 6f 20 67 65 74 20  ** first to get 
84c0: 74 68 69 6e 67 73 20 67 6f 69 6e 67 2e 20 20 54  things going.  T
84d0: 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
84e0: 20 69 73 20 63 61 6c 6c 65 64 20 66 6f 72 20 65   is called for e
84f0: 61 63 68 0a 2a 2a 20 63 6f 6c 75 6d 6e 2e 0a 2a  ach.** column..*
8500: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 41 64  /.void sqlite3Ad
8510: 64 43 6f 6c 75 6d 6e 28 50 61 72 73 65 20 2a 70  dColumn(Parse *p
8520: 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 4e  Parse, Token *pN
8530: 61 6d 65 2c 20 54 6f 6b 65 6e 20 2a 70 54 79 70  ame, Token *pTyp
8540: 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a  e){.  Table *p;.
8550: 20 20 69 6e 74 20 69 3b 0a 20 20 63 68 61 72 20    int i;.  char 
8560: 2a 7a 3b 0a 20 20 63 68 61 72 20 2a 7a 54 79 70  *z;.  char *zTyp
8570: 65 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f  e;.  Column *pCo
8580: 6c 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  l;.  sqlite3 *db
8590: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
85a0: 20 69 66 28 20 28 70 20 3d 20 70 50 61 72 73 65   if( (p = pParse
85b0: 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3d 3d 30 20  ->pNewTable)==0 
85c0: 29 20 72 65 74 75 72 6e 3b 0a 23 69 66 20 53 51  ) return;.#if SQ
85d0: 4c 49 54 45 5f 4d 41 58 5f 43 4f 4c 55 4d 4e 0a  LITE_MAX_COLUMN.
85e0: 20 20 69 66 28 20 70 2d 3e 6e 43 6f 6c 2b 31 3e    if( p->nCol+1>
85f0: 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54  db->aLimit[SQLIT
8600: 45 5f 4c 49 4d 49 54 5f 43 4f 4c 55 4d 4e 5d 20  E_LIMIT_COLUMN] 
8610: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
8620: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
8630: 74 6f 6f 20 6d 61 6e 79 20 63 6f 6c 75 6d 6e 73  too many columns
8640: 20 6f 6e 20 25 73 22 2c 20 70 2d 3e 7a 4e 61 6d   on %s", p->zNam
8650: 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  e);.    return;.
8660: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7a 20 3d    }.#endif.  z =
8670: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
8680: 52 61 77 28 64 62 2c 20 70 4e 61 6d 65 2d 3e 6e  Raw(db, pName->n
8690: 20 2b 20 70 54 79 70 65 2d 3e 6e 20 2b 20 32 29   + pType->n + 2)
86a0: 3b 0a 20 20 69 66 28 20 7a 3d 3d 30 20 29 20 72  ;.  if( z==0 ) r
86b0: 65 74 75 72 6e 3b 0a 20 20 6d 65 6d 63 70 79 28  eturn;.  memcpy(
86c0: 7a 2c 20 70 4e 61 6d 65 2d 3e 7a 2c 20 70 4e 61  z, pName->z, pNa
86d0: 6d 65 2d 3e 6e 29 3b 0a 20 20 7a 5b 70 4e 61 6d  me->n);.  z[pNam
86e0: 65 2d 3e 6e 5d 20 3d 20 30 3b 0a 20 20 73 71 6c  e->n] = 0;.  sql
86f0: 69 74 65 33 44 65 71 75 6f 74 65 28 7a 29 3b 0a  ite3Dequote(z);.
8700: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
8710: 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nCol; i++){.    
8720: 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74 72 69  if( sqlite3_stri
8730: 63 6d 70 28 7a 2c 20 70 2d 3e 61 43 6f 6c 5b 69  cmp(z, p->aCol[i
8740: 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20  ].zName)==0 ){. 
8750: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
8760: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 64 75  rMsg(pParse, "du
8770: 70 6c 69 63 61 74 65 20 63 6f 6c 75 6d 6e 20 6e  plicate column n
8780: 61 6d 65 3a 20 25 73 22 2c 20 7a 29 3b 0a 20 20  ame: %s", z);.  
8790: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
87a0: 65 28 64 62 2c 20 7a 29 3b 0a 20 20 20 20 20 20  e(db, z);.      
87b0: 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20  return;.    }.  
87c0: 7d 0a 20 20 69 66 28 20 28 70 2d 3e 6e 43 6f 6c  }.  if( (p->nCol
87d0: 20 26 20 30 78 37 29 3d 3d 30 20 29 7b 0a 20 20   & 0x7)==0 ){.  
87e0: 20 20 43 6f 6c 75 6d 6e 20 2a 61 4e 65 77 3b 0a    Column *aNew;.
87f0: 20 20 20 20 61 4e 65 77 20 3d 20 73 71 6c 69 74      aNew = sqlit
8800: 65 33 44 62 52 65 61 6c 6c 6f 63 28 64 62 2c 70  e3DbRealloc(db,p
8810: 2d 3e 61 43 6f 6c 2c 28 70 2d 3e 6e 43 6f 6c 2b  ->aCol,(p->nCol+
8820: 38 29 2a 73 69 7a 65 6f 66 28 70 2d 3e 61 43 6f  8)*sizeof(p->aCo
8830: 6c 5b 30 5d 29 29 3b 0a 20 20 20 20 69 66 28 20  l[0]));.    if( 
8840: 61 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20  aNew==0 ){.     
8850: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
8860: 62 2c 20 7a 29 3b 0a 20 20 20 20 20 20 72 65 74  b, z);.      ret
8870: 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  urn;.    }.    p
8880: 2d 3e 61 43 6f 6c 20 3d 20 61 4e 65 77 3b 0a 20  ->aCol = aNew;. 
8890: 20 7d 0a 20 20 70 43 6f 6c 20 3d 20 26 70 2d 3e   }.  pCol = &p->
88a0: 61 43 6f 6c 5b 70 2d 3e 6e 43 6f 6c 5d 3b 0a 20  aCol[p->nCol];. 
88b0: 20 6d 65 6d 73 65 74 28 70 43 6f 6c 2c 20 30 2c   memset(pCol, 0,
88c0: 20 73 69 7a 65 6f 66 28 70 2d 3e 61 43 6f 6c 5b   sizeof(p->aCol[
88d0: 30 5d 29 29 3b 0a 20 20 70 43 6f 6c 2d 3e 7a 4e  0]));.  pCol->zN
88e0: 61 6d 65 20 3d 20 7a 3b 0a 20 20 73 71 6c 69 74  ame = z;.  sqlit
88f0: 65 33 43 6f 6c 75 6d 6e 50 72 6f 70 65 72 74 69  e3ColumnProperti
8900: 65 73 46 72 6f 6d 4e 61 6d 65 28 70 2c 20 70 43  esFromName(p, pC
8910: 6f 6c 29 3b 0a 20 0a 20 20 69 66 28 20 70 54 79  ol);. .  if( pTy
8920: 70 65 2d 3e 6e 3d 3d 30 20 29 7b 0a 20 20 20 20  pe->n==0 ){.    
8930: 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 6e  /* If there is n
8940: 6f 20 74 79 70 65 20 73 70 65 63 69 66 69 65 64  o type specified
8950: 2c 20 63 6f 6c 75 6d 6e 73 20 68 61 76 65 20 74  , columns have t
8960: 68 65 20 64 65 66 61 75 6c 74 20 61 66 66 69 6e  he default affin
8970: 69 74 79 0a 20 20 20 20 2a 2a 20 27 42 4c 4f 42  ity.    ** 'BLOB
8980: 27 2e 20 2a 2f 0a 20 20 20 20 70 43 6f 6c 2d 3e  '. */.    pCol->
8990: 61 66 66 69 6e 69 74 79 20 3d 20 53 51 4c 49 54  affinity = SQLIT
89a0: 45 5f 41 46 46 5f 42 4c 4f 42 3b 0a 20 20 20 20  E_AFF_BLOB;.    
89b0: 70 43 6f 6c 2d 3e 73 7a 45 73 74 20 3d 20 31 3b  pCol->szEst = 1;
89c0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 54  .  }else{.    zT
89d0: 79 70 65 20 3d 20 7a 20 2b 20 73 71 6c 69 74 65  ype = z + sqlite
89e0: 33 53 74 72 6c 65 6e 33 30 28 7a 29 20 2b 20 31  3Strlen30(z) + 1
89f0: 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 7a 54 79  ;.    memcpy(zTy
8a00: 70 65 2c 20 70 54 79 70 65 2d 3e 7a 2c 20 70 54  pe, pType->z, pT
8a10: 79 70 65 2d 3e 6e 29 3b 0a 20 20 20 20 7a 54 79  ype->n);.    zTy
8a20: 70 65 5b 70 54 79 70 65 2d 3e 6e 5d 20 3d 20 30  pe[pType->n] = 0
8a30: 3b 0a 20 20 20 20 70 43 6f 6c 2d 3e 61 66 66 69  ;.    pCol->affi
8a40: 6e 69 74 79 20 3d 20 73 71 6c 69 74 65 33 41 66  nity = sqlite3Af
8a50: 66 69 6e 69 74 79 54 79 70 65 28 7a 54 79 70 65  finityType(zType
8a60: 2c 20 26 70 43 6f 6c 2d 3e 73 7a 45 73 74 29 3b  , &pCol->szEst);
8a70: 0a 20 20 20 20 70 43 6f 6c 2d 3e 63 6f 6c 46 6c  .    pCol->colFl
8a80: 61 67 73 20 7c 3d 20 43 4f 4c 46 4c 41 47 5f 48  ags |= COLFLAG_H
8a90: 41 53 54 59 50 45 3b 0a 20 20 7d 0a 20 20 70 2d  ASTYPE;.  }.  p-
8aa0: 3e 6e 43 6f 6c 2b 2b 3b 0a 20 20 70 50 61 72 73  >nCol++;.  pPars
8ab0: 65 2d 3e 63 6f 6e 73 74 72 61 69 6e 74 4e 61 6d  e->constraintNam
8ac0: 65 2e 6e 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  e.n = 0;.}../*.*
8ad0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
8ae0: 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20  s called by the 
8af0: 70 61 72 73 65 72 20 77 68 69 6c 65 20 69 6e 20  parser while in 
8b00: 74 68 65 20 6d 69 64 64 6c 65 20 6f 66 0a 2a 2a  the middle of.**
8b10: 20 70 61 72 73 69 6e 67 20 61 20 43 52 45 41 54   parsing a CREAT
8b20: 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e  E TABLE statemen
8b30: 74 2e 20 20 41 20 22 4e 4f 54 20 4e 55 4c 4c 22  t.  A "NOT NULL"
8b40: 20 63 6f 6e 73 74 72 61 69 6e 74 20 68 61 73 0a   constraint has.
8b50: 2a 2a 20 62 65 65 6e 20 73 65 65 6e 20 6f 6e 20  ** been seen on 
8b60: 61 20 63 6f 6c 75 6d 6e 2e 20 20 54 68 69 73 20  a column.  This 
8b70: 72 6f 75 74 69 6e 65 20 73 65 74 73 20 74 68 65  routine sets the
8b80: 20 6e 6f 74 4e 75 6c 6c 20 66 6c 61 67 20 6f 6e   notNull flag on
8b90: 0a 2a 2a 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63  .** the column c
8ba0: 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63  urrently under c
8bb0: 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a  onstruction..*/.
8bc0: 76 6f 69 64 20 73 71 6c 69 74 65 33 41 64 64 4e  void sqlite3AddN
8bd0: 6f 74 4e 75 6c 6c 28 50 61 72 73 65 20 2a 70 50  otNull(Parse *pP
8be0: 61 72 73 65 2c 20 69 6e 74 20 6f 6e 45 72 72 6f  arse, int onErro
8bf0: 72 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a  r){.  Table *p;.
8c00: 20 20 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e    p = pParse->pN
8c10: 65 77 54 61 62 6c 65 3b 0a 20 20 69 66 28 20 70  ewTable;.  if( p
8c20: 3d 3d 30 20 7c 7c 20 4e 45 56 45 52 28 70 2d 3e  ==0 || NEVER(p->
8c30: 6e 43 6f 6c 3c 31 29 20 29 20 72 65 74 75 72 6e  nCol<1) ) return
8c40: 3b 0a 20 20 70 2d 3e 61 43 6f 6c 5b 70 2d 3e 6e  ;.  p->aCol[p->n
8c50: 43 6f 6c 2d 31 5d 2e 6e 6f 74 4e 75 6c 6c 20 3d  Col-1].notNull =
8c60: 20 28 75 38 29 6f 6e 45 72 72 6f 72 3b 0a 7d 0a   (u8)onError;.}.
8c70: 0a 2f 2a 0a 2a 2a 20 53 63 61 6e 20 74 68 65 20  ./*.** Scan the 
8c80: 63 6f 6c 75 6d 6e 20 74 79 70 65 20 6e 61 6d 65  column type name
8c90: 20 7a 54 79 70 65 20 28 6c 65 6e 67 74 68 20 6e   zType (length n
8ca0: 54 79 70 65 29 20 61 6e 64 20 72 65 74 75 72 6e  Type) and return
8cb0: 20 74 68 65 0a 2a 2a 20 61 73 73 6f 63 69 61 74   the.** associat
8cc0: 65 64 20 61 66 66 69 6e 69 74 79 20 74 79 70 65  ed affinity type
8cd0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
8ce0: 74 69 6e 65 20 64 6f 65 73 20 61 20 63 61 73 65  tine does a case
8cf0: 2d 69 6e 64 65 70 65 6e 64 65 6e 74 20 73 65 61  -independent sea
8d00: 72 63 68 20 6f 66 20 7a 54 79 70 65 20 66 6f 72  rch of zType for
8d10: 20 74 68 65 20 0a 2a 2a 20 73 75 62 73 74 72 69   the .** substri
8d20: 6e 67 73 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f  ngs in the follo
8d30: 77 69 6e 67 20 74 61 62 6c 65 2e 20 49 66 20 6f  wing table. If o
8d40: 6e 65 20 6f 66 20 74 68 65 20 73 75 62 73 74 72  ne of the substr
8d50: 69 6e 67 73 20 69 73 0a 2a 2a 20 66 6f 75 6e 64  ings is.** found
8d60: 2c 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64  , the correspond
8d70: 69 6e 67 20 61 66 66 69 6e 69 74 79 20 69 73 20  ing affinity is 
8d80: 72 65 74 75 72 6e 65 64 2e 20 49 66 20 7a 54 79  returned. If zTy
8d90: 70 65 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 6d  pe contains.** m
8da0: 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 6f 66 20  ore than one of 
8db0: 74 68 65 20 73 75 62 73 74 72 69 6e 67 73 2c 20  the substrings, 
8dc0: 65 6e 74 72 69 65 73 20 74 6f 77 61 72 64 20 74  entries toward t
8dd0: 68 65 20 74 6f 70 20 6f 66 20 0a 2a 2a 20 74 68  he top of .** th
8de0: 65 20 74 61 62 6c 65 20 74 61 6b 65 20 70 72 69  e table take pri
8df0: 6f 72 69 74 79 2e 20 46 6f 72 20 65 78 61 6d 70  ority. For examp
8e00: 6c 65 2c 20 69 66 20 7a 54 79 70 65 20 69 73 20  le, if zType is 
8e10: 27 42 4c 4f 42 49 4e 54 27 2c 20 0a 2a 2a 20 53  'BLOBINT', .** S
8e20: 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45  QLITE_AFF_INTEGE
8e30: 52 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  R is returned..*
8e40: 2a 0a 2a 2a 20 53 75 62 73 74 72 69 6e 67 20 20  *.** Substring  
8e50: 20 20 20 7c 20 41 66 66 69 6e 69 74 79 0a 2a 2a     | Affinity.**
8e60: 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   ---------------
8e70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8e80: 2d 0a 2a 2a 20 27 49 4e 54 27 20 20 20 20 20 20  -.** 'INT'      
8e90: 20 20 20 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f     | SQLITE_AFF_
8ea0: 49 4e 54 45 47 45 52 0a 2a 2a 20 27 43 48 41 52  INTEGER.** 'CHAR
8eb0: 27 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54  '        | SQLIT
8ec0: 45 5f 41 46 46 5f 54 45 58 54 0a 2a 2a 20 27 43  E_AFF_TEXT.** 'C
8ed0: 4c 4f 42 27 20 20 20 20 20 20 20 20 7c 20 53 51  LOB'        | SQ
8ee0: 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 0a 2a 2a  LITE_AFF_TEXT.**
8ef0: 20 27 54 45 58 54 27 20 20 20 20 20 20 20 20 7c   'TEXT'        |
8f00: 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54   SQLITE_AFF_TEXT
8f10: 0a 2a 2a 20 27 42 4c 4f 42 27 20 20 20 20 20 20  .** 'BLOB'      
8f20: 20 20 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f 42    | SQLITE_AFF_B
8f30: 4c 4f 42 0a 2a 2a 20 27 52 45 41 4c 27 20 20 20  LOB.** 'REAL'   
8f40: 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 41 46       | SQLITE_AF
8f50: 46 5f 52 45 41 4c 0a 2a 2a 20 27 46 4c 4f 41 27  F_REAL.** 'FLOA'
8f60: 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45          | SQLITE
8f70: 5f 41 46 46 5f 52 45 41 4c 0a 2a 2a 20 27 44 4f  _AFF_REAL.** 'DO
8f80: 55 42 27 20 20 20 20 20 20 20 20 7c 20 53 51 4c  UB'        | SQL
8f90: 49 54 45 5f 41 46 46 5f 52 45 41 4c 0a 2a 2a 0a  ITE_AFF_REAL.**.
8fa0: 2a 2a 20 49 66 20 6e 6f 6e 65 20 6f 66 20 74 68  ** If none of th
8fb0: 65 20 73 75 62 73 74 72 69 6e 67 73 20 69 6e 20  e substrings in 
8fc0: 74 68 65 20 61 62 6f 76 65 20 74 61 62 6c 65 20  the above table 
8fd0: 61 72 65 20 66 6f 75 6e 64 2c 0a 2a 2a 20 53 51  are found,.** SQ
8fe0: 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43  LITE_AFF_NUMERIC
8ff0: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f   is returned..*/
9000: 0a 63 68 61 72 20 73 71 6c 69 74 65 33 41 66 66  .char sqlite3Aff
9010: 69 6e 69 74 79 54 79 70 65 28 63 6f 6e 73 74 20  inityType(const 
9020: 63 68 61 72 20 2a 7a 49 6e 2c 20 75 38 20 2a 70  char *zIn, u8 *p
9030: 73 7a 45 73 74 29 7b 0a 20 20 75 33 32 20 68 20  szEst){.  u32 h 
9040: 3d 20 30 3b 0a 20 20 63 68 61 72 20 61 66 66 20  = 0;.  char aff 
9050: 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d  = SQLITE_AFF_NUM
9060: 45 52 49 43 3b 0a 20 20 63 6f 6e 73 74 20 63 68  ERIC;.  const ch
9070: 61 72 20 2a 7a 43 68 61 72 20 3d 20 30 3b 0a 0a  ar *zChar = 0;..
9080: 20 20 61 73 73 65 72 74 28 20 7a 49 6e 21 3d 30    assert( zIn!=0
9090: 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 7a 49 6e   );.  while( zIn
90a0: 5b 30 5d 20 29 7b 0a 20 20 20 20 68 20 3d 20 28  [0] ){.    h = (
90b0: 68 3c 3c 38 29 20 2b 20 73 71 6c 69 74 65 33 55  h<<8) + sqlite3U
90c0: 70 70 65 72 54 6f 4c 6f 77 65 72 5b 28 2a 7a 49  pperToLower[(*zI
90d0: 6e 29 26 30 78 66 66 5d 3b 0a 20 20 20 20 7a 49  n)&0xff];.    zI
90e0: 6e 2b 2b 3b 0a 20 20 20 20 69 66 28 20 68 3d 3d  n++;.    if( h==
90f0: 28 28 27 63 27 3c 3c 32 34 29 2b 28 27 68 27 3c  (('c'<<24)+('h'<
9100: 3c 31 36 29 2b 28 27 61 27 3c 3c 38 29 2b 27 72  <16)+('a'<<8)+'r
9110: 27 29 20 29 7b 20 20 20 20 20 20 20 20 20 20 20  ') ){           
9120: 20 20 2f 2a 20 43 48 41 52 20 2a 2f 0a 20 20 20    /* CHAR */.   
9130: 20 20 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f     aff = SQLITE_
9140: 41 46 46 5f 54 45 58 54 3b 0a 20 20 20 20 20 20  AFF_TEXT;.      
9150: 7a 43 68 61 72 20 3d 20 7a 49 6e 3b 0a 20 20 20  zChar = zIn;.   
9160: 20 7d 65 6c 73 65 20 69 66 28 20 68 3d 3d 28 28   }else if( h==((
9170: 27 63 27 3c 3c 32 34 29 2b 28 27 6c 27 3c 3c 31  'c'<<24)+('l'<<1
9180: 36 29 2b 28 27 6f 27 3c 3c 38 29 2b 27 62 27 29  6)+('o'<<8)+'b')
9190: 20 29 7b 20 20 20 20 20 20 20 2f 2a 20 43 4c 4f   ){       /* CLO
91a0: 42 20 2a 2f 0a 20 20 20 20 20 20 61 66 66 20 3d  B */.      aff =
91b0: 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54   SQLITE_AFF_TEXT
91c0: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
91d0: 68 3d 3d 28 28 27 74 27 3c 3c 32 34 29 2b 28 27  h==(('t'<<24)+('
91e0: 65 27 3c 3c 31 36 29 2b 28 27 78 27 3c 3c 38 29  e'<<16)+('x'<<8)
91f0: 2b 27 74 27 29 20 29 7b 20 20 20 20 20 20 20 2f  +'t') ){       /
9200: 2a 20 54 45 58 54 20 2a 2f 0a 20 20 20 20 20 20  * TEXT */.      
9210: 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46  aff = SQLITE_AFF
9220: 5f 54 45 58 54 3b 0a 20 20 20 20 7d 65 6c 73 65  _TEXT;.    }else
9230: 20 69 66 28 20 68 3d 3d 28 28 27 62 27 3c 3c 32   if( h==(('b'<<2
9240: 34 29 2b 28 27 6c 27 3c 3c 31 36 29 2b 28 27 6f  4)+('l'<<16)+('o
9250: 27 3c 3c 38 29 2b 27 62 27 29 20 20 20 20 20 20  '<<8)+'b')      
9260: 20 20 20 20 2f 2a 20 42 4c 4f 42 20 2a 2f 0a 20      /* BLOB */. 
9270: 20 20 20 20 20 20 20 26 26 20 28 61 66 66 3d 3d         && (aff==
9280: 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52  SQLITE_AFF_NUMER
9290: 49 43 20 7c 7c 20 61 66 66 3d 3d 53 51 4c 49 54  IC || aff==SQLIT
92a0: 45 5f 41 46 46 5f 52 45 41 4c 29 20 29 7b 0a 20  E_AFF_REAL) ){. 
92b0: 20 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49 54       aff = SQLIT
92c0: 45 5f 41 46 46 5f 42 4c 4f 42 3b 0a 20 20 20 20  E_AFF_BLOB;.    
92d0: 20 20 69 66 28 20 7a 49 6e 5b 30 5d 3d 3d 27 28    if( zIn[0]=='(
92e0: 27 20 29 20 7a 43 68 61 72 20 3d 20 7a 49 6e 3b  ' ) zChar = zIn;
92f0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
9300: 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f  OMIT_FLOATING_PO
9310: 49 4e 54 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  INT.    }else if
9320: 28 20 68 3d 3d 28 28 27 72 27 3c 3c 32 34 29 2b  ( h==(('r'<<24)+
9330: 28 27 65 27 3c 3c 31 36 29 2b 28 27 61 27 3c 3c  ('e'<<16)+('a'<<
9340: 38 29 2b 27 6c 27 29 20 20 20 20 20 20 20 20 20  8)+'l')         
9350: 20 2f 2a 20 52 45 41 4c 20 2a 2f 0a 20 20 20 20   /* REAL */.    
9360: 20 20 20 20 26 26 20 61 66 66 3d 3d 53 51 4c 49      && aff==SQLI
9370: 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20 29  TE_AFF_NUMERIC )
9380: 7b 0a 20 20 20 20 20 20 61 66 66 20 3d 20 53 51  {.      aff = SQ
9390: 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 3b 0a 20  LITE_AFF_REAL;. 
93a0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 68 3d 3d     }else if( h==
93b0: 28 28 27 66 27 3c 3c 32 34 29 2b 28 27 6c 27 3c  (('f'<<24)+('l'<
93c0: 3c 31 36 29 2b 28 27 6f 27 3c 3c 38 29 2b 27 61  <16)+('o'<<8)+'a
93d0: 27 29 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46  ')          /* F
93e0: 4c 4f 41 20 2a 2f 0a 20 20 20 20 20 20 20 20 26  LOA */.        &
93f0: 26 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46  & aff==SQLITE_AF
9400: 46 5f 4e 55 4d 45 52 49 43 20 29 7b 0a 20 20 20  F_NUMERIC ){.   
9410: 20 20 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f     aff = SQLITE_
9420: 41 46 46 5f 52 45 41 4c 3b 0a 20 20 20 20 7d 65  AFF_REAL;.    }e
9430: 6c 73 65 20 69 66 28 20 68 3d 3d 28 28 27 64 27  lse if( h==(('d'
9440: 3c 3c 32 34 29 2b 28 27 6f 27 3c 3c 31 36 29 2b  <<24)+('o'<<16)+
9450: 28 27 75 27 3c 3c 38 29 2b 27 62 27 29 20 20 20  ('u'<<8)+'b')   
9460: 20 20 20 20 20 20 20 2f 2a 20 44 4f 55 42 20 2a         /* DOUB *
9470: 2f 0a 20 20 20 20 20 20 20 20 26 26 20 61 66 66  /.        && aff
9480: 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d  ==SQLITE_AFF_NUM
9490: 45 52 49 43 20 29 7b 0a 20 20 20 20 20 20 61 66  ERIC ){.      af
94a0: 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 52  f = SQLITE_AFF_R
94b0: 45 41 4c 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  EAL;.#endif.    
94c0: 7d 65 6c 73 65 20 69 66 28 20 28 68 26 30 78 30  }else if( (h&0x0
94d0: 30 46 46 46 46 46 46 29 3d 3d 28 28 27 69 27 3c  0FFFFFF)==(('i'<
94e0: 3c 31 36 29 2b 28 27 6e 27 3c 3c 38 29 2b 27 74  <16)+('n'<<8)+'t
94f0: 27 29 20 29 7b 20 20 20 20 2f 2a 20 49 4e 54 20  ') ){    /* INT 
9500: 2a 2f 0a 20 20 20 20 20 20 61 66 66 20 3d 20 53  */.      aff = S
9510: 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45  QLITE_AFF_INTEGE
9520: 52 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  R;.      break;.
9530: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
9540: 49 66 20 70 73 7a 45 73 74 20 69 73 20 6e 6f 74  If pszEst is not
9550: 20 4e 55 4c 4c 2c 20 73 74 6f 72 65 20 61 6e 20   NULL, store an 
9560: 65 73 74 69 6d 61 74 65 20 6f 66 20 74 68 65 20  estimate of the 
9570: 66 69 65 6c 64 20 73 69 7a 65 2e 20 20 54 68 65  field size.  The
9580: 0a 20 20 2a 2a 20 65 73 74 69 6d 61 74 65 20 69  .  ** estimate i
9590: 73 20 73 63 61 6c 65 64 20 73 6f 20 74 68 61 74  s scaled so that
95a0: 20 74 68 65 20 73 69 7a 65 20 6f 66 20 61 6e 20   the size of an 
95b0: 69 6e 74 65 67 65 72 20 69 73 20 31 2e 20 20 2a  integer is 1.  *
95c0: 2f 0a 20 20 69 66 28 20 70 73 7a 45 73 74 20 29  /.  if( pszEst )
95d0: 7b 0a 20 20 20 20 2a 70 73 7a 45 73 74 20 3d 20  {.    *pszEst = 
95e0: 31 3b 20 20 20 2f 2a 20 64 65 66 61 75 6c 74 20  1;   /* default 
95f0: 73 69 7a 65 20 69 73 20 61 70 70 72 6f 78 20 34  size is approx 4
9600: 20 62 79 74 65 73 20 2a 2f 0a 20 20 20 20 69 66   bytes */.    if
9610: 28 20 61 66 66 3c 53 51 4c 49 54 45 5f 41 46 46  ( aff<SQLITE_AFF
9620: 5f 4e 55 4d 45 52 49 43 20 29 7b 0a 20 20 20 20  _NUMERIC ){.    
9630: 20 20 69 66 28 20 7a 43 68 61 72 20 29 7b 0a 20    if( zChar ){. 
9640: 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 7a 43         while( zC
9650: 68 61 72 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20  har[0] ){.      
9660: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 49      if( sqlite3I
9670: 73 64 69 67 69 74 28 7a 43 68 61 72 5b 30 5d 29  sdigit(zChar[0])
9680: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
9690: 69 6e 74 20 76 20 3d 20 30 3b 0a 20 20 20 20 20  int v = 0;.     
96a0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 65         sqlite3Ge
96b0: 74 49 6e 74 33 32 28 7a 43 68 61 72 2c 20 26 76  tInt32(zChar, &v
96c0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 76  );.            v
96d0: 20 3d 20 76 2f 34 20 2b 20 31 3b 0a 20 20 20 20   = v/4 + 1;.    
96e0: 20 20 20 20 20 20 20 20 69 66 28 20 76 3e 32 35          if( v>25
96f0: 35 20 29 20 76 20 3d 20 32 35 35 3b 0a 20 20 20  5 ) v = 255;.   
9700: 20 20 20 20 20 20 20 20 20 2a 70 73 7a 45 73 74           *pszEst
9710: 20 3d 20 76 3b 20 2f 2a 20 42 4c 4f 42 28 6b 29   = v; /* BLOB(k)
9720: 2c 20 56 41 52 43 48 41 52 28 6b 29 2c 20 43 48  , VARCHAR(k), CH
9730: 41 52 28 6b 29 20 2d 3e 20 72 3d 28 6b 2f 34 2b  AR(k) -> r=(k/4+
9740: 31 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  1) */.          
9750: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
9760: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7a     }.          z
9770: 43 68 61 72 2b 2b 3b 0a 20 20 20 20 20 20 20 20  Char++;.        
9780: 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  }.      }else{. 
9790: 20 20 20 20 20 20 20 2a 70 73 7a 45 73 74 20 3d         *pszEst =
97a0: 20 35 3b 20 20 20 2f 2a 20 42 4c 4f 42 2c 20 54   5;   /* BLOB, T
97b0: 45 58 54 2c 20 43 4c 4f 42 20 2d 3e 20 72 3d 35  EXT, CLOB -> r=5
97c0: 20 20 28 61 70 70 72 6f 78 20 32 30 20 62 79 74    (approx 20 byt
97d0: 65 73 29 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20  es)*/.      }.  
97e0: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
97f0: 20 61 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54   aff;.}../*.** T
9800: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
9810: 20 74 68 65 20 64 65 66 61 75 6c 74 20 76 61 6c   the default val
9820: 75 65 20 66 6f 72 20 74 68 65 20 6d 6f 73 74 20  ue for the most 
9830: 72 65 63 65 6e 74 6c 79 20 61 64 64 65 64 20 63  recently added c
9840: 6f 6c 75 6d 6e 0a 2a 2a 20 6f 66 20 74 68 65 20  olumn.** of the 
9850: 74 61 62 6c 65 20 63 75 72 72 65 6e 74 6c 79 20  table currently 
9860: 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69  under constructi
9870: 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 44 65 66 61 75 6c  on..**.** Defaul
9880: 74 20 76 61 6c 75 65 20 65 78 70 72 65 73 73 69  t value expressi
9890: 6f 6e 73 20 6d 75 73 74 20 62 65 20 63 6f 6e 73  ons must be cons
98a0: 74 61 6e 74 2e 20 20 52 61 69 73 65 20 61 6e 20  tant.  Raise an 
98b0: 65 78 63 65 70 74 69 6f 6e 20 69 66 20 74 68 69  exception if thi
98c0: 73 0a 2a 2a 20 69 73 20 6e 6f 74 20 74 68 65 20  s.** is not the 
98d0: 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  case..**.** This
98e0: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
98f0: 65 64 20 62 79 20 74 68 65 20 70 61 72 73 65 72  ed by the parser
9900: 20 77 68 69 6c 65 20 69 6e 20 74 68 65 20 6d 69   while in the mi
9910: 64 64 6c 65 20 6f 66 0a 2a 2a 20 70 61 72 73 69  ddle of.** parsi
9920: 6e 67 20 61 20 43 52 45 41 54 45 20 54 41 42 4c  ng a CREATE TABL
9930: 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a  E statement..*/.
9940: 76 6f 69 64 20 73 71 6c 69 74 65 33 41 64 64 44  void sqlite3AddD
9950: 65 66 61 75 6c 74 56 61 6c 75 65 28 50 61 72 73  efaultValue(Pars
9960: 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 53  e *pParse, ExprS
9970: 70 61 6e 20 2a 70 53 70 61 6e 29 7b 0a 20 20 54  pan *pSpan){.  T
9980: 61 62 6c 65 20 2a 70 3b 0a 20 20 43 6f 6c 75 6d  able *p;.  Colum
9990: 6e 20 2a 70 43 6f 6c 3b 0a 20 20 73 71 6c 69 74  n *pCol;.  sqlit
99a0: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
99b0: 3e 64 62 3b 0a 20 20 70 20 3d 20 70 50 61 72 73  >db;.  p = pPars
99c0: 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20  e->pNewTable;.  
99d0: 69 66 28 20 70 21 3d 30 20 29 7b 0a 20 20 20 20  if( p!=0 ){.    
99e0: 70 43 6f 6c 20 3d 20 26 28 70 2d 3e 61 43 6f 6c  pCol = &(p->aCol
99f0: 5b 70 2d 3e 6e 43 6f 6c 2d 31 5d 29 3b 0a 20 20  [p->nCol-1]);.  
9a00: 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 45 78    if( !sqlite3Ex
9a10: 70 72 49 73 43 6f 6e 73 74 61 6e 74 4f 72 46 75  prIsConstantOrFu
9a20: 6e 63 74 69 6f 6e 28 70 53 70 61 6e 2d 3e 70 45  nction(pSpan->pE
9a30: 78 70 72 2c 20 64 62 2d 3e 69 6e 69 74 2e 62 75  xpr, db->init.bu
9a40: 73 79 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  sy) ){.      sql
9a50: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
9a60: 72 73 65 2c 20 22 64 65 66 61 75 6c 74 20 76 61  rse, "default va
9a70: 6c 75 65 20 6f 66 20 63 6f 6c 75 6d 6e 20 5b 25  lue of column [%
9a80: 73 5d 20 69 73 20 6e 6f 74 20 63 6f 6e 73 74 61  s] is not consta
9a90: 6e 74 22 2c 0a 20 20 20 20 20 20 20 20 20 20 70  nt",.          p
9aa0: 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  Col->zName);.   
9ab0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a   }else{.      /*
9ac0: 20 41 20 63 6f 70 79 20 6f 66 20 70 45 78 70 72   A copy of pExpr
9ad0: 20 69 73 20 75 73 65 64 20 69 6e 73 74 65 61 64   is used instead
9ae0: 20 6f 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c   of the original
9af0: 2c 20 61 73 20 70 45 78 70 72 20 63 6f 6e 74 61  , as pExpr conta
9b00: 69 6e 73 0a 20 20 20 20 20 20 2a 2a 20 74 6f 6b  ins.      ** tok
9b10: 65 6e 73 20 74 68 61 74 20 70 6f 69 6e 74 20 74  ens that point t
9b20: 6f 20 76 6f 6c 61 74 69 6c 65 20 6d 65 6d 6f 72  o volatile memor
9b30: 79 2e 20 54 68 65 20 27 73 70 61 6e 27 20 6f 66  y. The 'span' of
9b40: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 0a   the expression.
9b50: 20 20 20 20 20 20 2a 2a 20 69 73 20 72 65 71 75        ** is requ
9b60: 69 72 65 64 20 62 79 20 70 72 61 67 6d 61 20 74  ired by pragma t
9b70: 61 62 6c 65 5f 69 6e 66 6f 2e 0a 20 20 20 20 20  able_info..     
9b80: 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 20 78   */.      Expr x
9b90: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
9ba0: 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 43  xprDelete(db, pC
9bb0: 6f 6c 2d 3e 70 44 66 6c 74 29 3b 0a 20 20 20 20  ol->pDflt);.    
9bc0: 20 20 6d 65 6d 73 65 74 28 26 78 2c 20 30 2c 20    memset(&x, 0, 
9bd0: 73 69 7a 65 6f 66 28 78 29 29 3b 0a 20 20 20 20  sizeof(x));.    
9be0: 20 20 78 2e 6f 70 20 3d 20 54 4b 5f 53 50 41 4e    x.op = TK_SPAN
9bf0: 3b 0a 20 20 20 20 20 20 78 2e 75 2e 7a 54 6f 6b  ;.      x.u.zTok
9c00: 65 6e 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  en = sqlite3DbSt
9c10: 72 4e 44 75 70 28 64 62 2c 20 28 63 68 61 72 2a  rNDup(db, (char*
9c20: 29 70 53 70 61 6e 2d 3e 7a 53 74 61 72 74 2c 0a  )pSpan->zStart,.
9c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9c40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9c50: 20 20 20 20 28 69 6e 74 29 28 70 53 70 61 6e 2d      (int)(pSpan-
9c60: 3e 7a 45 6e 64 20 2d 20 70 53 70 61 6e 2d 3e 7a  >zEnd - pSpan->z
9c70: 53 74 61 72 74 29 29 3b 0a 20 20 20 20 20 20 78  Start));.      x
9c80: 2e 70 4c 65 66 74 20 3d 20 70 53 70 61 6e 2d 3e  .pLeft = pSpan->
9c90: 70 45 78 70 72 3b 0a 20 20 20 20 20 20 78 2e 66  pExpr;.      x.f
9ca0: 6c 61 67 73 20 3d 20 45 50 5f 53 6b 69 70 3b 0a  lags = EP_Skip;.
9cb0: 20 20 20 20 20 20 70 43 6f 6c 2d 3e 70 44 66 6c        pCol->pDfl
9cc0: 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  t = sqlite3ExprD
9cd0: 75 70 28 64 62 2c 20 26 78 2c 20 45 58 50 52 44  up(db, &x, EXPRD
9ce0: 55 50 5f 52 45 44 55 43 45 29 3b 0a 20 20 20 20  UP_REDUCE);.    
9cf0: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
9d00: 64 62 2c 20 78 2e 75 2e 7a 54 6f 6b 65 6e 29 3b  db, x.u.zToken);
9d10: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c  .    }.  }.  sql
9d20: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64  ite3ExprDelete(d
9d30: 62 2c 20 70 53 70 61 6e 2d 3e 70 45 78 70 72 29  b, pSpan->pExpr)
9d40: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 61 63 6b 77  ;.}../*.** Backw
9d50: 61 72 64 73 20 43 6f 6d 70 61 74 69 62 69 6c 69  ards Compatibili
9d60: 74 79 20 48 61 63 6b 3a 0a 2a 2a 20 0a 2a 2a 20  ty Hack:.** .** 
9d70: 48 69 73 74 6f 72 69 63 61 6c 20 76 65 72 73 69  Historical versi
9d80: 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65 20 61 63  ons of SQLite ac
9d90: 63 65 70 74 65 64 20 73 74 72 69 6e 67 73 20 61  cepted strings a
9da0: 73 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 69  s column names i
9db0: 6e 0a 2a 2a 20 69 6e 64 65 78 65 73 20 61 6e 64  n.** indexes and
9dc0: 20 50 52 49 4d 41 52 59 20 4b 45 59 20 63 6f 6e   PRIMARY KEY con
9dd0: 73 74 72 61 69 6e 74 73 20 61 6e 64 20 69 6e 20  straints and in 
9de0: 55 4e 49 51 55 45 20 63 6f 6e 73 74 72 61 69 6e  UNIQUE constrain
9df0: 74 73 2e 20 20 45 78 61 6d 70 6c 65 3a 0a 2a 2a  ts.  Example:.**
9e00: 0a 2a 2a 20 20 20 20 20 43 52 45 41 54 45 20 54  .**     CREATE T
9e10: 41 42 4c 45 20 78 79 7a 28 61 2c 62 2c 63 2c 64  ABLE xyz(a,b,c,d
9e20: 2c 65 2c 50 52 49 4d 41 52 59 20 4b 45 59 28 27  ,e,PRIMARY KEY('
9e30: 61 27 29 2c 55 4e 49 51 55 45 28 27 62 27 2c 27  a'),UNIQUE('b','
9e40: 63 27 20 43 4f 4c 4c 41 54 45 20 74 72 69 6d 29  c' COLLATE trim)
9e50: 0a 2a 2a 20 20 20 20 20 43 52 45 41 54 45 20 49  .**     CREATE I
9e60: 4e 44 45 58 20 61 62 63 20 4f 4e 20 78 79 7a 28  NDEX abc ON xyz(
9e70: 27 63 27 2c 27 64 27 20 44 45 53 43 2c 27 65 27  'c','d' DESC,'e'
9e80: 20 43 4f 4c 4c 41 54 45 20 6e 6f 63 61 73 65 20   COLLATE nocase 
9e90: 44 45 53 43 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 69  DESC);.**.** Thi
9ea0: 73 20 69 73 20 67 6f 6f 66 79 2e 20 20 42 75 74  s is goofy.  But
9eb0: 20 74 6f 20 70 72 65 73 65 72 76 65 20 62 61 63   to preserve bac
9ec0: 6b 77 61 72 64 73 20 63 6f 6d 70 61 74 69 62 69  kwards compatibi
9ed0: 6c 69 74 79 20 77 65 20 63 6f 6e 74 69 6e 75 65  lity we continue
9ee0: 20 74 6f 0a 2a 2a 20 61 63 63 65 70 74 20 69 74   to.** accept it
9ef0: 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
9f00: 64 6f 65 73 20 74 68 65 20 6e 65 63 65 73 73 61  does the necessa
9f10: 72 79 20 63 6f 6e 76 65 72 73 69 6f 6e 2e 20 20  ry conversion.  
9f20: 49 74 20 63 6f 6e 76 65 72 74 73 0a 2a 2a 20 74  It converts.** t
9f30: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 67 69  he expression gi
9f40: 76 65 6e 20 69 6e 20 69 74 73 20 61 72 67 75 6d  ven in its argum
9f50: 65 6e 74 20 66 72 6f 6d 20 61 20 54 4b 5f 53 54  ent from a TK_ST
9f60: 52 49 4e 47 20 69 6e 74 6f 20 61 20 54 4b 5f 49  RING into a TK_I
9f70: 44 0a 2a 2a 20 69 66 20 74 68 65 20 65 78 70 72  D.** if the expr
9f80: 65 73 73 69 6f 6e 20 69 73 20 6a 75 73 74 20 61  ession is just a
9f90: 20 54 4b 5f 53 54 52 49 4e 47 20 77 69 74 68 20   TK_STRING with 
9fa0: 61 6e 20 6f 70 74 69 6f 6e 61 6c 20 43 4f 4c 4c  an optional COLL
9fb0: 41 54 45 20 63 6c 61 75 73 65 2e 0a 2a 2a 20 49  ATE clause..** I
9fc0: 66 20 74 68 65 20 65 70 78 72 65 73 73 69 6f 6e  f the epxression
9fd0: 20 69 73 20 61 6e 79 74 68 69 6e 67 20 6f 74 68   is anything oth
9fe0: 65 72 20 74 68 61 6e 20 54 4b 5f 53 54 52 49 4e  er than TK_STRIN
9ff0: 47 2c 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  G, the expressio
a000: 6e 20 69 73 0a 2a 2a 20 75 6e 63 68 61 6e 67 65  n is.** unchange
a010: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  d..*/.static voi
a020: 64 20 73 71 6c 69 74 65 33 53 74 72 69 6e 67 54  d sqlite3StringT
a030: 6f 49 64 28 45 78 70 72 20 2a 70 29 7b 0a 20 20  oId(Expr *p){.  
a040: 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 53 54  if( p->op==TK_ST
a050: 52 49 4e 47 20 29 7b 0a 20 20 20 20 70 2d 3e 6f  RING ){.    p->o
a060: 70 20 3d 20 54 4b 5f 49 44 3b 0a 20 20 7d 65 6c  p = TK_ID;.  }el
a070: 73 65 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b  se if( p->op==TK
a080: 5f 43 4f 4c 4c 41 54 45 20 26 26 20 70 2d 3e 70  _COLLATE && p->p
a090: 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 53 54 52  Left->op==TK_STR
a0a0: 49 4e 47 20 29 7b 0a 20 20 20 20 70 2d 3e 70 4c  ING ){.    p->pL
a0b0: 65 66 74 2d 3e 6f 70 20 3d 20 54 4b 5f 49 44 3b  eft->op = TK_ID;
a0c0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65  .  }.}../*.** De
a0d0: 73 69 67 6e 61 74 65 20 74 68 65 20 50 52 49 4d  signate the PRIM
a0e0: 41 52 59 20 4b 45 59 20 66 6f 72 20 74 68 65 20  ARY KEY for the 
a0f0: 74 61 62 6c 65 2e 20 20 70 4c 69 73 74 20 69 73  table.  pList is
a100: 20 61 20 6c 69 73 74 20 6f 66 20 6e 61 6d 65 73   a list of names
a110: 20 0a 2a 2a 20 6f 66 20 63 6f 6c 75 6d 6e 73 20   .** of columns 
a120: 74 68 61 74 20 66 6f 72 6d 20 74 68 65 20 70 72  that form the pr
a130: 69 6d 61 72 79 20 6b 65 79 2e 20 20 49 66 20 70  imary key.  If p
a140: 4c 69 73 74 20 69 73 20 4e 55 4c 4c 2c 20 74 68  List is NULL, th
a150: 65 6e 20 74 68 65 0a 2a 2a 20 6d 6f 73 74 20 72  en the.** most r
a160: 65 63 65 6e 74 6c 79 20 61 64 64 65 64 20 63 6f  ecently added co
a170: 6c 75 6d 6e 20 6f 66 20 74 68 65 20 74 61 62 6c  lumn of the tabl
a180: 65 20 69 73 20 74 68 65 20 70 72 69 6d 61 72 79  e is the primary
a190: 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20 41 20 74 61   key..**.** A ta
a1a0: 62 6c 65 20 63 61 6e 20 68 61 76 65 20 61 74 20  ble can have at 
a1b0: 6d 6f 73 74 20 6f 6e 65 20 70 72 69 6d 61 72 79  most one primary
a1c0: 20 6b 65 79 2e 20 20 49 66 20 74 68 65 20 74 61   key.  If the ta
a1d0: 62 6c 65 20 61 6c 72 65 61 64 79 20 68 61 73 0a  ble already has.
a1e0: 2a 2a 20 61 20 70 72 69 6d 61 72 79 20 6b 65 79  ** a primary key
a1f0: 20 28 61 6e 64 20 74 68 69 73 20 69 73 20 74 68   (and this is th
a200: 65 20 73 65 63 6f 6e 64 20 70 72 69 6d 61 72 79  e second primary
a210: 20 6b 65 79 29 20 74 68 65 6e 20 63 72 65 61 74   key) then creat
a220: 65 20 61 6e 0a 2a 2a 20 65 72 72 6f 72 2e 0a 2a  e an.** error..*
a230: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 50 52 49 4d  *.** If the PRIM
a240: 41 52 59 20 4b 45 59 20 69 73 20 6f 6e 20 61 20  ARY KEY is on a 
a250: 73 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20 77 68  single column wh
a260: 6f 73 65 20 64 61 74 61 74 79 70 65 20 69 73 20  ose datatype is 
a270: 49 4e 54 45 47 45 52 2c 0a 2a 2a 20 74 68 65 6e  INTEGER,.** then
a280: 20 77 65 20 77 69 6c 6c 20 74 72 79 20 74 6f 20   we will try to 
a290: 75 73 65 20 74 68 61 74 20 63 6f 6c 75 6d 6e 20  use that column 
a2a0: 61 73 20 74 68 65 20 72 6f 77 69 64 2e 20 20 53  as the rowid.  S
a2b0: 65 74 20 74 68 65 20 54 61 62 6c 65 2e 69 50 4b  et the Table.iPK
a2c0: 65 79 0a 2a 2a 20 66 69 65 6c 64 20 6f 66 20 74  ey.** field of t
a2d0: 68 65 20 74 61 62 6c 65 20 75 6e 64 65 72 20 63  he table under c
a2e0: 6f 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f 20 62  onstruction to b
a2f0: 65 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74  e the index of t
a300: 68 65 0a 2a 2a 20 49 4e 54 45 47 45 52 20 50 52  he.** INTEGER PR
a310: 49 4d 41 52 59 20 4b 45 59 20 63 6f 6c 75 6d 6e  IMARY KEY column
a320: 2e 20 20 54 61 62 6c 65 2e 69 50 4b 65 79 20 69  .  Table.iPKey i
a330: 73 20 73 65 74 20 74 6f 20 2d 31 20 69 66 20 74  s set to -1 if t
a340: 68 65 72 65 20 69 73 0a 2a 2a 20 6e 6f 20 49 4e  here is.** no IN
a350: 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45  TEGER PRIMARY KE
a360: 59 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  Y..**.** If the 
a370: 6b 65 79 20 69 73 20 6e 6f 74 20 61 6e 20 49 4e  key is not an IN
a380: 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45  TEGER PRIMARY KE
a390: 59 2c 20 74 68 65 6e 20 63 72 65 61 74 65 20 61  Y, then create a
a3a0: 20 75 6e 69 71 75 65 0a 2a 2a 20 69 6e 64 65 78   unique.** index
a3b0: 20 66 6f 72 20 74 68 65 20 6b 65 79 2e 20 20 4e   for the key.  N
a3c0: 6f 20 69 6e 64 65 78 20 69 73 20 63 72 65 61 74  o index is creat
a3d0: 65 64 20 66 6f 72 20 49 4e 54 45 47 45 52 20 50  ed for INTEGER P
a3e0: 52 49 4d 41 52 59 20 4b 45 59 73 2e 0a 2a 2f 0a  RIMARY KEYs..*/.
a3f0: 76 6f 69 64 20 73 71 6c 69 74 65 33 41 64 64 50  void sqlite3AddP
a400: 72 69 6d 61 72 79 4b 65 79 28 0a 20 20 50 61 72  rimaryKey(.  Par
a410: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f  se *pParse,    /
a420: 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
a430: 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  t */.  ExprList 
a440: 2a 70 4c 69 73 74 2c 20 20 2f 2a 20 4c 69 73 74  *pList,  /* List
a450: 20 6f 66 20 66 69 65 6c 64 20 6e 61 6d 65 73 20   of field names 
a460: 74 6f 20 62 65 20 69 6e 64 65 78 65 64 20 2a 2f  to be indexed */
a470: 0a 20 20 69 6e 74 20 6f 6e 45 72 72 6f 72 2c 20  .  int onError, 
a480: 20 20 20 20 20 2f 2a 20 57 68 61 74 20 74 6f 20       /* What to 
a490: 64 6f 20 77 69 74 68 20 61 20 75 6e 69 71 75 65  do with a unique
a4a0: 6e 65 73 73 20 63 6f 6e 66 6c 69 63 74 20 2a 2f  ness conflict */
a4b0: 0a 20 20 69 6e 74 20 61 75 74 6f 49 6e 63 2c 20  .  int autoInc, 
a4c0: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
a4d0: 74 68 65 20 41 55 54 4f 49 4e 43 52 45 4d 45 4e  the AUTOINCREMEN
a4e0: 54 20 6b 65 79 77 6f 72 64 20 69 73 20 70 72 65  T keyword is pre
a4f0: 73 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 73 6f  sent */.  int so
a500: 72 74 4f 72 64 65 72 20 20 20 20 20 2f 2a 20 53  rtOrder     /* S
a510: 51 4c 49 54 45 5f 53 4f 5f 41 53 43 20 6f 72 20  QLITE_SO_ASC or 
a520: 53 51 4c 49 54 45 5f 53 4f 5f 44 45 53 43 20 2a  SQLITE_SO_DESC *
a530: 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54  /.){.  Table *pT
a540: 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65  ab = pParse->pNe
a550: 77 54 61 62 6c 65 3b 0a 20 20 43 6f 6c 75 6d 6e  wTable;.  Column
a560: 20 2a 70 43 6f 6c 20 3d 20 30 3b 0a 20 20 69 6e   *pCol = 0;.  in
a570: 74 20 69 43 6f 6c 20 3d 20 2d 31 2c 20 69 3b 0a  t iCol = -1, i;.
a580: 20 20 69 6e 74 20 6e 54 65 72 6d 3b 0a 20 20 69    int nTerm;.  i
a590: 66 28 20 70 54 61 62 3d 3d 30 20 7c 7c 20 49 4e  f( pTab==0 || IN
a5a0: 5f 44 45 43 4c 41 52 45 5f 56 54 41 42 20 29 20  _DECLARE_VTAB ) 
a5b0: 67 6f 74 6f 20 70 72 69 6d 61 72 79 5f 6b 65 79  goto primary_key
a5c0: 5f 65 78 69 74 3b 0a 20 20 69 66 28 20 70 54 61  _exit;.  if( pTa
a5d0: 62 2d 3e 74 61 62 46 6c 61 67 73 20 26 20 54 46  b->tabFlags & TF
a5e0: 5f 48 61 73 50 72 69 6d 61 72 79 4b 65 79 20 29  _HasPrimaryKey )
a5f0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
a600: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 0a 20  orMsg(pParse, . 
a610: 20 20 20 20 20 22 74 61 62 6c 65 20 5c 22 25 73       "table \"%s
a620: 5c 22 20 68 61 73 20 6d 6f 72 65 20 74 68 61 6e  \" has more than
a630: 20 6f 6e 65 20 70 72 69 6d 61 72 79 20 6b 65 79   one primary key
a640: 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b  ", pTab->zName);
a650: 0a 20 20 20 20 67 6f 74 6f 20 70 72 69 6d 61 72  .    goto primar
a660: 79 5f 6b 65 79 5f 65 78 69 74 3b 0a 20 20 7d 0a  y_key_exit;.  }.
a670: 20 20 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73    pTab->tabFlags
a680: 20 7c 3d 20 54 46 5f 48 61 73 50 72 69 6d 61 72   |= TF_HasPrimar
a690: 79 4b 65 79 3b 0a 20 20 69 66 28 20 70 4c 69 73  yKey;.  if( pLis
a6a0: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 69 43 6f 6c  t==0 ){.    iCol
a6b0: 20 3d 20 70 54 61 62 2d 3e 6e 43 6f 6c 20 2d 20   = pTab->nCol - 
a6c0: 31 3b 0a 20 20 20 20 70 43 6f 6c 20 3d 20 26 70  1;.    pCol = &p
a6d0: 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 3b  Tab->aCol[iCol];
a6e0: 0a 20 20 20 20 70 43 6f 6c 2d 3e 63 6f 6c 46 6c  .    pCol->colFl
a6f0: 61 67 73 20 7c 3d 20 43 4f 4c 46 4c 41 47 5f 50  ags |= COLFLAG_P
a700: 52 49 4d 4b 45 59 3b 0a 20 20 20 20 6e 54 65 72  RIMKEY;.    nTer
a710: 6d 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a  m = 1;.  }else{.
a720: 20 20 20 20 6e 54 65 72 6d 20 3d 20 70 4c 69 73      nTerm = pLis
a730: 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 66 6f  t->nExpr;.    fo
a740: 72 28 69 3d 30 3b 20 69 3c 6e 54 65 72 6d 3b 20  r(i=0; i<nTerm; 
a750: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 45 78 70 72  i++){.      Expr
a760: 20 2a 70 43 45 78 70 72 20 3d 20 73 71 6c 69 74   *pCExpr = sqlit
a770: 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74  e3ExprSkipCollat
a780: 65 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45  e(pList->a[i].pE
a790: 78 70 72 29 3b 0a 20 20 20 20 20 20 61 73 73 65  xpr);.      asse
a7a0: 72 74 28 20 70 43 45 78 70 72 21 3d 30 20 29 3b  rt( pCExpr!=0 );
a7b0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 74  .      sqlite3St
a7c0: 72 69 6e 67 54 6f 49 64 28 70 43 45 78 70 72 29  ringToId(pCExpr)
a7d0: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 43 45 78  ;.      if( pCEx
a7e0: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 20 29 7b  pr->op==TK_ID ){
a7f0: 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63  .        const c
a800: 68 61 72 20 2a 7a 43 4e 61 6d 65 20 3d 20 70 43  har *zCName = pC
a810: 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a  Expr->u.zToken;.
a820: 20 20 20 20 20 20 20 20 66 6f 72 28 69 43 6f 6c          for(iCol
a830: 3d 30 3b 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e  =0; iCol<pTab->n
a840: 43 6f 6c 3b 20 69 43 6f 6c 2b 2b 29 7b 0a 20 20  Col; iCol++){.  
a850: 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
a860: 74 65 33 53 74 72 49 43 6d 70 28 7a 43 4e 61 6d  te3StrICmp(zCNam
a870: 65 2c 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43  e, pTab->aCol[iC
a880: 6f 6c 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b  ol].zName)==0 ){
a890: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f  .            pCo
a8a0: 6c 20 3d 20 26 70 54 61 62 2d 3e 61 43 6f 6c 5b  l = &pTab->aCol[
a8b0: 69 43 6f 6c 5d 3b 0a 20 20 20 20 20 20 20 20 20  iCol];.         
a8c0: 20 20 20 70 43 6f 6c 2d 3e 63 6f 6c 46 6c 61 67     pCol->colFlag
a8d0: 73 20 7c 3d 20 43 4f 4c 46 4c 41 47 5f 50 52 49  s |= COLFLAG_PRI
a8e0: 4d 4b 45 59 3b 0a 20 20 20 20 20 20 20 20 20 20  MKEY;.          
a8f0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
a900: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
a910: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
a920: 0a 20 20 69 66 28 20 6e 54 65 72 6d 3d 3d 31 0a  .  if( nTerm==1.
a930: 20 20 20 26 26 20 70 43 6f 6c 0a 20 20 20 26 26     && pCol.   &&
a940: 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
a950: 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 54 79 70  sqlite3ColumnTyp
a960: 65 28 70 43 6f 6c 2c 22 22 29 2c 20 22 49 4e 54  e(pCol,""), "INT
a970: 45 47 45 52 22 29 3d 3d 30 0a 20 20 20 26 26 20  EGER")==0.   && 
a980: 73 6f 72 74 4f 72 64 65 72 21 3d 53 51 4c 49 54  sortOrder!=SQLIT
a990: 45 5f 53 4f 5f 44 45 53 43 0a 20 20 29 7b 0a 20  E_SO_DESC.  ){. 
a9a0: 20 20 20 70 54 61 62 2d 3e 69 50 4b 65 79 20 3d     pTab->iPKey =
a9b0: 20 69 43 6f 6c 3b 0a 20 20 20 20 70 54 61 62 2d   iCol;.    pTab-
a9c0: 3e 6b 65 79 43 6f 6e 66 20 3d 20 28 75 38 29 6f  >keyConf = (u8)o
a9d0: 6e 45 72 72 6f 72 3b 0a 20 20 20 20 61 73 73 65  nError;.    asse
a9e0: 72 74 28 20 61 75 74 6f 49 6e 63 3d 3d 30 20 7c  rt( autoInc==0 |
a9f0: 7c 20 61 75 74 6f 49 6e 63 3d 3d 31 20 29 3b 0a  | autoInc==1 );.
aa00: 20 20 20 20 70 54 61 62 2d 3e 74 61 62 46 6c 61      pTab->tabFla
aa10: 67 73 20 7c 3d 20 61 75 74 6f 49 6e 63 2a 54 46  gs |= autoInc*TF
aa20: 5f 41 75 74 6f 69 6e 63 72 65 6d 65 6e 74 3b 0a  _Autoincrement;.
aa30: 20 20 20 20 69 66 28 20 70 4c 69 73 74 20 29 20      if( pList ) 
aa40: 70 50 61 72 73 65 2d 3e 69 50 6b 53 6f 72 74 4f  pParse->iPkSortO
aa50: 72 64 65 72 20 3d 20 70 4c 69 73 74 2d 3e 61 5b  rder = pList->a[
aa60: 30 5d 2e 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20  0].sortOrder;.  
aa70: 7d 65 6c 73 65 20 69 66 28 20 61 75 74 6f 49 6e  }else if( autoIn
aa80: 63 20 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c  c ){.#ifndef SQL
aa90: 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 43  ITE_OMIT_AUTOINC
aaa0: 52 45 4d 45 4e 54 0a 20 20 20 20 73 71 6c 69 74  REMENT.    sqlit
aab0: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
aac0: 65 2c 20 22 41 55 54 4f 49 4e 43 52 45 4d 45 4e  e, "AUTOINCREMEN
aad0: 54 20 69 73 20 6f 6e 6c 79 20 61 6c 6c 6f 77 65  T is only allowe
aae0: 64 20 6f 6e 20 61 6e 20 22 0a 20 20 20 20 20 20  d on an ".      
aaf0: 20 22 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52   "INTEGER PRIMAR
ab00: 59 20 4b 45 59 22 29 3b 0a 23 65 6e 64 69 66 0a  Y KEY");.#endif.
ab10: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 49 6e 64    }else{.    Ind
ab20: 65 78 20 2a 70 3b 0a 20 20 20 20 70 20 3d 20 73  ex *p;.    p = s
ab30: 71 6c 69 74 65 33 43 72 65 61 74 65 49 6e 64 65  qlite3CreateInde
ab40: 78 28 70 50 61 72 73 65 2c 20 30 2c 20 30 2c 20  x(pParse, 0, 0, 
ab50: 30 2c 20 70 4c 69 73 74 2c 20 6f 6e 45 72 72 6f  0, pList, onErro
ab60: 72 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20  r, 0,.          
ab70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ab80: 20 30 2c 20 73 6f 72 74 4f 72 64 65 72 2c 20 30   0, sortOrder, 0
ab90: 29 3b 0a 20 20 20 20 69 66 28 20 70 20 29 7b 0a  );.    if( p ){.
aba0: 20 20 20 20 20 20 70 2d 3e 69 64 78 54 79 70 65        p->idxType
abb0: 20 3d 20 53 51 4c 49 54 45 5f 49 44 58 54 59 50   = SQLITE_IDXTYP
abc0: 45 5f 50 52 49 4d 41 52 59 4b 45 59 3b 0a 20 20  E_PRIMARYKEY;.  
abd0: 20 20 7d 0a 20 20 20 20 70 4c 69 73 74 20 3d 20    }.    pList = 
abe0: 30 3b 0a 20 20 7d 0a 0a 70 72 69 6d 61 72 79 5f  0;.  }..primary_
abf0: 6b 65 79 5f 65 78 69 74 3a 0a 20 20 73 71 6c 69  key_exit:.  sqli
ac00: 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
ac10: 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 4c  e(pParse->db, pL
ac20: 69 73 74 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a  ist);.  return;.
ac30: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e  }../*.** Add a n
ac40: 65 77 20 43 48 45 43 4b 20 63 6f 6e 73 74 72 61  ew CHECK constra
ac50: 69 6e 74 20 74 6f 20 74 68 65 20 74 61 62 6c 65  int to the table
ac60: 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72   currently under
ac70: 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a   construction..*
ac80: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 41 64  /.void sqlite3Ad
ac90: 64 43 68 65 63 6b 43 6f 6e 73 74 72 61 69 6e 74  dCheckConstraint
aca0: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
acb0: 65 2c 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67  e,    /* Parsing
acc0: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78   context */.  Ex
acd0: 70 72 20 2a 70 43 68 65 63 6b 45 78 70 72 20 20  pr *pCheckExpr  
ace0: 2f 2a 20 54 68 65 20 63 68 65 63 6b 20 65 78 70  /* The check exp
acf0: 72 65 73 73 69 6f 6e 20 2a 2f 0a 29 7b 0a 23 69  ression */.){.#i
ad00: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
ad10: 54 5f 43 48 45 43 4b 0a 20 20 54 61 62 6c 65 20  T_CHECK.  Table 
ad20: 2a 70 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e  *pTab = pParse->
ad30: 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 73 71 6c  pNewTable;.  sql
ad40: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
ad50: 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20 70 54 61  e->db;.  if( pTa
ad60: 62 20 26 26 20 21 49 4e 5f 44 45 43 4c 41 52 45  b && !IN_DECLARE
ad70: 5f 56 54 41 42 0a 20 20 20 26 26 20 21 73 71 6c  _VTAB.   && !sql
ad80: 69 74 65 33 42 74 72 65 65 49 73 52 65 61 64 6f  ite3BtreeIsReado
ad90: 6e 6c 79 28 64 62 2d 3e 61 44 62 5b 64 62 2d 3e  nly(db->aDb[db->
ada0: 69 6e 69 74 2e 69 44 62 5d 2e 70 42 74 29 0a 20  init.iDb].pBt). 
adb0: 20 29 7b 0a 20 20 20 20 70 54 61 62 2d 3e 70 43   ){.    pTab->pC
adc0: 68 65 63 6b 20 3d 20 73 71 6c 69 74 65 33 45 78  heck = sqlite3Ex
add0: 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61  prListAppend(pPa
ade0: 72 73 65 2c 20 70 54 61 62 2d 3e 70 43 68 65 63  rse, pTab->pChec
adf0: 6b 2c 20 70 43 68 65 63 6b 45 78 70 72 29 3b 0a  k, pCheckExpr);.
ae00: 20 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e      if( pParse->
ae10: 63 6f 6e 73 74 72 61 69 6e 74 4e 61 6d 65 2e 6e  constraintName.n
ae20: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
ae30: 33 45 78 70 72 4c 69 73 74 53 65 74 4e 61 6d 65  3ExprListSetName
ae40: 28 70 50 61 72 73 65 2c 20 70 54 61 62 2d 3e 70  (pParse, pTab->p
ae50: 43 68 65 63 6b 2c 20 26 70 50 61 72 73 65 2d 3e  Check, &pParse->
ae60: 63 6f 6e 73 74 72 61 69 6e 74 4e 61 6d 65 2c 20  constraintName, 
ae70: 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  1);.    }.  }els
ae80: 65 0a 23 65 6e 64 69 66 0a 20 20 7b 0a 20 20 20  e.#endif.  {.   
ae90: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
aea0: 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  te(pParse->db, p
aeb0: 43 68 65 63 6b 45 78 70 72 29 3b 0a 20 20 7d 0a  CheckExpr);.  }.
aec0: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  }../*.** Set the
aed0: 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 75 6e 63 74   collation funct
aee0: 69 6f 6e 20 6f 66 20 74 68 65 20 6d 6f 73 74 20  ion of the most 
aef0: 72 65 63 65 6e 74 6c 79 20 70 61 72 73 65 64 20  recently parsed 
af00: 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 0a 2a 2a 20  table column.** 
af10: 74 6f 20 74 68 65 20 43 6f 6c 6c 53 65 71 20 67  to the CollSeq g
af20: 69 76 65 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  iven..*/.void sq
af30: 6c 69 74 65 33 41 64 64 43 6f 6c 6c 61 74 65 54  lite3AddCollateT
af40: 79 70 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  ype(Parse *pPars
af50: 65 2c 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e  e, Token *pToken
af60: 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20  ){.  Table *p;. 
af70: 20 69 6e 74 20 69 3b 0a 20 20 63 68 61 72 20 2a   int i;.  char *
af80: 7a 43 6f 6c 6c 3b 20 20 20 20 20 20 20 20 20 20  zColl;          
af90: 20 20 20 20 2f 2a 20 44 65 71 75 6f 74 65 64 20      /* Dequoted 
afa0: 6e 61 6d 65 20 6f 66 20 63 6f 6c 6c 61 74 69 6f  name of collatio
afb0: 6e 20 73 65 71 75 65 6e 63 65 20 2a 2f 0a 20 20  n sequence */.  
afc0: 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 0a 20 20  sqlite3 *db;..  
afd0: 69 66 28 20 28 70 20 3d 20 70 50 61 72 73 65 2d  if( (p = pParse-
afe0: 3e 70 4e 65 77 54 61 62 6c 65 29 3d 3d 30 20 29  >pNewTable)==0 )
aff0: 20 72 65 74 75 72 6e 3b 0a 20 20 69 20 3d 20 70   return;.  i = p
b000: 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 64 62 20 3d  ->nCol-1;.  db =
b010: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 7a   pParse->db;.  z
b020: 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 4e 61  Coll = sqlite3Na
b030: 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20  meFromToken(db, 
b040: 70 54 6f 6b 65 6e 29 3b 0a 20 20 69 66 28 20 21  pToken);.  if( !
b050: 7a 43 6f 6c 6c 20 29 20 72 65 74 75 72 6e 3b 0a  zColl ) return;.
b060: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 4c 6f  .  if( sqlite3Lo
b070: 63 61 74 65 43 6f 6c 6c 53 65 71 28 70 50 61 72  cateCollSeq(pPar
b080: 73 65 2c 20 7a 43 6f 6c 6c 29 20 29 7b 0a 20 20  se, zColl) ){.  
b090: 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20    Index *pIdx;. 
b0a0: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
b0b0: 28 64 62 2c 20 70 2d 3e 61 43 6f 6c 5b 69 5d 2e  (db, p->aCol[i].
b0c0: 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20 70 2d 3e 61  zColl);.    p->a
b0d0: 43 6f 6c 5b 69 5d 2e 7a 43 6f 6c 6c 20 3d 20 7a  Col[i].zColl = z
b0e0: 43 6f 6c 6c 3b 0a 20 20 0a 20 20 20 20 2f 2a 20  Coll;.  .    /* 
b0f0: 49 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69 73  If the column is
b100: 20 64 65 63 6c 61 72 65 64 20 61 73 20 22 3c 6e   declared as "<n
b110: 61 6d 65 3e 20 50 52 49 4d 41 52 59 20 4b 45 59  ame> PRIMARY KEY
b120: 20 43 4f 4c 4c 41 54 45 20 3c 74 79 70 65 3e 22   COLLATE <type>"
b130: 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20 61 6e  ,.    ** then an
b140: 20 69 6e 64 65 78 20 6d 61 79 20 68 61 76 65 20   index may have 
b150: 62 65 65 6e 20 63 72 65 61 74 65 64 20 6f 6e 20  been created on 
b160: 74 68 69 73 20 63 6f 6c 75 6d 6e 20 62 65 66 6f  this column befo
b170: 72 65 20 74 68 65 0a 20 20 20 20 2a 2a 20 63 6f  re the.    ** co
b180: 6c 6c 61 74 69 6f 6e 20 74 79 70 65 20 77 61 73  llation type was
b190: 20 61 64 64 65 64 2e 20 43 6f 72 72 65 63 74 20   added. Correct 
b1a0: 74 68 69 73 20 69 66 20 69 74 20 69 73 20 74 68  this if it is th
b1b0: 65 20 63 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20  e case..    */. 
b1c0: 20 20 20 66 6f 72 28 70 49 64 78 3d 70 2d 3e 70     for(pIdx=p->p
b1d0: 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64  Index; pIdx; pId
b1e0: 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a  x=pIdx->pNext){.
b1f0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49        assert( pI
b200: 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3d 3d 31 20 29  dx->nKeyCol==1 )
b210: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49 64 78  ;.      if( pIdx
b220: 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 30 5d 3d 3d 69  ->aiColumn[0]==i
b230: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 49 64 78   ){.        pIdx
b240: 2d 3e 61 7a 43 6f 6c 6c 5b 30 5d 20 3d 20 70 2d  ->azColl[0] = p-
b250: 3e 61 43 6f 6c 5b 69 5d 2e 7a 43 6f 6c 6c 3b 0a  >aCol[i].zColl;.
b260: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
b270: 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74  }else{.    sqlit
b280: 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 43 6f  e3DbFree(db, zCo
b290: 6c 6c 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  ll);.  }.}../*.*
b2a0: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
b2b0: 72 65 74 75 72 6e 73 20 74 68 65 20 63 6f 6c 6c  returns the coll
b2c0: 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 66  ation sequence f
b2d0: 6f 72 20 64 61 74 61 62 61 73 65 20 6e 61 74 69  or database nati
b2e0: 76 65 20 74 65 78 74 0a 2a 2a 20 65 6e 63 6f 64  ve text.** encod
b2f0: 69 6e 67 20 69 64 65 6e 74 69 66 69 65 64 20 62  ing identified b
b300: 79 20 74 68 65 20 73 74 72 69 6e 67 20 7a 4e 61  y the string zNa
b310: 6d 65 2c 20 6c 65 6e 67 74 68 20 6e 4e 61 6d 65  me, length nName
b320: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 72  ..**.** If the r
b330: 65 71 75 65 73 74 65 64 20 63 6f 6c 6c 61 74 69  equested collati
b340: 6f 6e 20 73 65 71 75 65 6e 63 65 20 69 73 20 6e  on sequence is n
b350: 6f 74 20 61 76 61 69 6c 61 62 6c 65 2c 20 6f 72  ot available, or
b360: 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 0a 2a   not available.*
b370: 2a 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  * in the databas
b380: 65 20 6e 61 74 69 76 65 20 65 6e 63 6f 64 69 6e  e native encodin
b390: 67 2c 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e  g, the collation
b3a0: 20 66 61 63 74 6f 72 79 20 69 73 20 69 6e 76 6f   factory is invo
b3b0: 6b 65 64 20 74 6f 0a 2a 2a 20 72 65 71 75 65 73  ked to.** reques
b3c0: 74 20 69 74 2e 20 49 66 20 74 68 65 20 63 6f 6c  t it. If the col
b3d0: 6c 61 74 69 6f 6e 20 66 61 63 74 6f 72 79 20 64  lation factory d
b3e0: 6f 65 73 20 6e 6f 74 20 73 75 70 70 6c 79 20 73  oes not supply s
b3f0: 75 63 68 20 61 20 73 65 71 75 65 6e 63 65 2c 0a  uch a sequence,.
b400: 2a 2a 20 61 6e 64 20 74 68 65 20 73 65 71 75 65  ** and the seque
b410: 6e 63 65 20 69 73 20 61 76 61 69 6c 61 62 6c 65  nce is available
b420: 20 69 6e 20 61 6e 6f 74 68 65 72 20 74 65 78 74   in another text
b430: 20 65 6e 63 6f 64 69 6e 67 2c 20 74 68 65 6e 20   encoding, then 
b440: 74 68 61 74 20 69 73 0a 2a 2a 20 72 65 74 75 72  that is.** retur
b450: 6e 65 64 20 69 6e 73 74 65 61 64 2e 0a 2a 2a 0a  ned instead..**.
b460: 2a 2a 20 49 66 20 6e 6f 20 76 65 72 73 69 6f 6e  ** If no version
b470: 73 20 6f 66 20 74 68 65 20 72 65 71 75 65 73 74  s of the request
b480: 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 73 20 73 65  ed collations se
b490: 71 75 65 6e 63 65 20 61 72 65 20 61 76 61 69 6c  quence are avail
b4a0: 61 62 6c 65 2c 20 6f 72 0a 2a 2a 20 61 6e 6f 74  able, or.** anot
b4b0: 68 65 72 20 65 72 72 6f 72 20 6f 63 63 75 72 73  her error occurs
b4c0: 2c 20 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e  , NULL is return
b4d0: 65 64 20 61 6e 64 20 61 6e 20 65 72 72 6f 72 20  ed and an error 
b4e0: 6d 65 73 73 61 67 65 20 77 72 69 74 74 65 6e 20  message written 
b4f0: 69 6e 74 6f 0a 2a 2a 20 70 50 61 72 73 65 2e 0a  into.** pParse..
b500: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
b510: 6e 65 20 69 73 20 61 20 77 72 61 70 70 65 72 20  ne is a wrapper 
b520: 61 72 6f 75 6e 64 20 73 71 6c 69 74 65 33 46 69  around sqlite3Fi
b530: 6e 64 43 6f 6c 6c 53 65 71 28 29 2e 20 20 54 68  ndCollSeq().  Th
b540: 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 6e  is routine.** in
b550: 76 6f 6b 65 73 20 74 68 65 20 63 6f 6c 6c 61 74  vokes the collat
b560: 69 6f 6e 20 66 61 63 74 6f 72 79 20 69 66 20 74  ion factory if t
b570: 68 65 20 6e 61 6d 65 64 20 63 6f 6c 6c 61 74 69  he named collati
b580: 6f 6e 20 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75  on cannot be fou
b590: 6e 64 0a 2a 2a 20 61 6e 64 20 67 65 6e 65 72 61  nd.** and genera
b5a0: 74 65 73 20 61 6e 20 65 72 72 6f 72 20 6d 65 73  tes an error mes
b5b0: 73 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20  sage..**.** See 
b5c0: 61 6c 73 6f 3a 20 73 71 6c 69 74 65 33 46 69 6e  also: sqlite3Fin
b5d0: 64 43 6f 6c 6c 53 65 71 28 29 2c 20 73 71 6c 69  dCollSeq(), sqli
b5e0: 74 65 33 47 65 74 43 6f 6c 6c 53 65 71 28 29 0a  te3GetCollSeq().
b5f0: 2a 2f 0a 43 6f 6c 6c 53 65 71 20 2a 73 71 6c 69  */.CollSeq *sqli
b600: 74 65 33 4c 6f 63 61 74 65 43 6f 6c 6c 53 65 71  te3LocateCollSeq
b610: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
b620: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
b630: 65 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  e){.  sqlite3 *d
b640: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
b650: 20 20 75 38 20 65 6e 63 20 3d 20 45 4e 43 28 64    u8 enc = ENC(d
b660: 62 29 3b 0a 20 20 75 38 20 69 6e 69 74 62 75 73  b);.  u8 initbus
b670: 79 20 3d 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73  y = db->init.bus
b680: 79 3b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43  y;.  CollSeq *pC
b690: 6f 6c 6c 3b 0a 0a 20 20 70 43 6f 6c 6c 20 3d 20  oll;..  pColl = 
b6a0: 73 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53  sqlite3FindCollS
b6b0: 65 71 28 64 62 2c 20 65 6e 63 2c 20 7a 4e 61 6d  eq(db, enc, zNam
b6c0: 65 2c 20 69 6e 69 74 62 75 73 79 29 3b 0a 20 20  e, initbusy);.  
b6d0: 69 66 28 20 21 69 6e 69 74 62 75 73 79 20 26 26  if( !initbusy &&
b6e0: 20 28 21 70 43 6f 6c 6c 20 7c 7c 20 21 70 43 6f   (!pColl || !pCo
b6f0: 6c 6c 2d 3e 78 43 6d 70 29 20 29 7b 0a 20 20 20  ll->xCmp) ){.   
b700: 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33   pColl = sqlite3
b710: 47 65 74 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  GetCollSeq(pPars
b720: 65 2c 20 65 6e 63 2c 20 70 43 6f 6c 6c 2c 20 7a  e, enc, pColl, z
b730: 4e 61 6d 65 29 3b 0a 20 20 7d 0a 0a 20 20 72 65  Name);.  }..  re
b740: 74 75 72 6e 20 70 43 6f 6c 6c 3b 0a 7d 0a 0a 0a  turn pColl;.}...
b750: 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
b760: 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 69 6e  ode that will in
b770: 63 72 65 6d 65 6e 74 20 74 68 65 20 73 63 68 65  crement the sche
b780: 6d 61 20 63 6f 6f 6b 69 65 2e 0a 2a 2a 0a 2a 2a  ma cookie..**.**
b790: 20 54 68 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b   The schema cook
b7a0: 69 65 20 69 73 20 75 73 65 64 20 74 6f 20 64 65  ie is used to de
b7b0: 74 65 72 6d 69 6e 65 20 77 68 65 6e 20 74 68 65  termine when the
b7c0: 20 73 63 68 65 6d 61 20 66 6f 72 20 74 68 65 0a   schema for the.
b7d0: 2a 2a 20 64 61 74 61 62 61 73 65 20 63 68 61 6e  ** database chan
b7e0: 67 65 73 2e 20 20 41 66 74 65 72 20 65 61 63 68  ges.  After each
b7f0: 20 73 63 68 65 6d 61 20 63 68 61 6e 67 65 2c 20   schema change, 
b800: 74 68 65 20 63 6f 6f 6b 69 65 20 76 61 6c 75 65  the cookie value
b810: 0a 2a 2a 20 63 68 61 6e 67 65 73 2e 20 20 57 68  .** changes.  Wh
b820: 65 6e 20 61 20 70 72 6f 63 65 73 73 20 66 69 72  en a process fir
b830: 73 74 20 72 65 61 64 73 20 74 68 65 20 73 63 68  st reads the sch
b840: 65 6d 61 20 69 74 20 72 65 63 6f 72 64 73 20 74  ema it records t
b850: 68 65 0a 2a 2a 20 63 6f 6f 6b 69 65 2e 20 20 54  he.** cookie.  T
b860: 68 65 72 65 61 66 74 65 72 2c 20 77 68 65 6e 65  hereafter, whene
b870: 76 65 72 20 69 74 20 67 6f 65 73 20 74 6f 20 61  ver it goes to a
b880: 63 63 65 73 73 20 74 68 65 20 64 61 74 61 62 61  ccess the databa
b890: 73 65 2c 0a 2a 2a 20 69 74 20 63 68 65 63 6b 73  se,.** it checks
b8a0: 20 74 68 65 20 63 6f 6f 6b 69 65 20 74 6f 20 6d   the cookie to m
b8b0: 61 6b 65 20 73 75 72 65 20 74 68 65 20 73 63 68  ake sure the sch
b8c0: 65 6d 61 20 68 61 73 20 6e 6f 74 20 63 68 61 6e  ema has not chan
b8d0: 67 65 64 0a 2a 2a 20 73 69 6e 63 65 20 69 74 20  ged.** since it 
b8e0: 77 61 73 20 6c 61 73 74 20 72 65 61 64 2e 0a 2a  was last read..*
b8f0: 2a 0a 2a 2a 20 54 68 69 73 20 70 6c 61 6e 20 69  *.** This plan i
b900: 73 20 6e 6f 74 20 63 6f 6d 70 6c 65 74 65 6c 79  s not completely
b910: 20 62 75 6c 6c 65 74 2d 70 72 6f 6f 66 2e 20 20   bullet-proof.  
b920: 49 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20 66  It is possible f
b930: 6f 72 0a 2a 2a 20 74 68 65 20 73 63 68 65 6d 61  or.** the schema
b940: 20 74 6f 20 63 68 61 6e 67 65 20 6d 75 6c 74 69   to change multi
b950: 70 6c 65 20 74 69 6d 65 73 20 61 6e 64 20 66 6f  ple times and fo
b960: 72 20 74 68 65 20 63 6f 6f 6b 69 65 20 74 6f 20  r the cookie to 
b970: 62 65 0a 2a 2a 20 73 65 74 20 62 61 63 6b 20 74  be.** set back t
b980: 6f 20 70 72 69 6f 72 20 76 61 6c 75 65 2e 20 20  o prior value.  
b990: 42 75 74 20 73 63 68 65 6d 61 20 63 68 61 6e 67  But schema chang
b9a0: 65 73 20 61 72 65 20 69 6e 66 72 65 71 75 65 6e  es are infrequen
b9b0: 74 0a 2a 2a 20 61 6e 64 20 74 68 65 20 70 72 6f  t.** and the pro
b9c0: 62 61 62 69 6c 69 74 79 20 6f 66 20 68 69 74 74  bability of hitt
b9d0: 69 6e 67 20 74 68 65 20 73 61 6d 65 20 63 6f 6f  ing the same coo
b9e0: 6b 69 65 20 76 61 6c 75 65 20 69 73 20 6f 6e 6c  kie value is onl
b9f0: 79 0a 2a 2a 20 31 20 63 68 61 6e 63 65 20 69 6e  y.** 1 chance in
ba00: 20 32 5e 33 32 2e 20 20 53 6f 20 77 65 27 72 65   2^32.  So we're
ba10: 20 73 61 66 65 20 65 6e 6f 75 67 68 2e 0a 2a 2f   safe enough..*/
ba20: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 68 61  .void sqlite3Cha
ba30: 6e 67 65 43 6f 6f 6b 69 65 28 50 61 72 73 65 20  ngeCookie(Parse 
ba40: 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69 44 62  *pParse, int iDb
ba50: 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
ba60: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
ba70: 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
ba80: 65 2d 3e 70 56 64 62 65 3b 0a 20 20 61 73 73 65  e->pVdbe;.  asse
ba90: 72 74 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d  rt( sqlite3Schem
baa0: 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20 69  aMutexHeld(db, i
bab0: 44 62 2c 20 30 29 20 29 3b 0a 20 20 73 71 6c 69  Db, 0) );.  sqli
bac0: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
bad0: 20 4f 50 5f 53 65 74 43 6f 6f 6b 69 65 2c 20 69   OP_SetCookie, i
bae0: 44 62 2c 20 42 54 52 45 45 5f 53 43 48 45 4d 41  Db, BTREE_SCHEMA
baf0: 5f 56 45 52 53 49 4f 4e 2c 20 0a 20 20 20 20 20  _VERSION, .     
bb00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64                 d
bb10: 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53 63 68  b->aDb[iDb].pSch
bb20: 65 6d 61 2d 3e 73 63 68 65 6d 61 5f 63 6f 6f 6b  ema->schema_cook
bb30: 69 65 2b 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ie+1);.}../*.** 
bb40: 4d 65 61 73 75 72 65 20 74 68 65 20 6e 75 6d 62  Measure the numb
bb50: 65 72 20 6f 66 20 63 68 61 72 61 63 74 65 72 73  er of characters
bb60: 20 6e 65 65 64 65 64 20 74 6f 20 6f 75 74 70 75   needed to outpu
bb70: 74 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20 69  t the given.** i
bb80: 64 65 6e 74 69 66 69 65 72 2e 20 20 54 68 65 20  dentifier.  The 
bb90: 6e 75 6d 62 65 72 20 72 65 74 75 72 6e 65 64 20  number returned 
bba0: 69 6e 63 6c 75 64 65 73 20 61 6e 79 20 71 75 6f  includes any quo
bbb0: 74 65 73 20 75 73 65 64 0a 2a 2a 20 62 75 74 20  tes used.** but 
bbc0: 64 6f 65 73 20 6e 6f 74 20 69 6e 63 6c 75 64 65  does not include
bbd0: 20 74 68 65 20 6e 75 6c 6c 20 74 65 72 6d 69 6e   the null termin
bbe0: 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ator..**.** The 
bbf0: 65 73 74 69 6d 61 74 65 20 69 73 20 63 6f 6e 73  estimate is cons
bc00: 65 72 76 61 74 69 76 65 2e 20 20 49 74 20 6d 69  ervative.  It mi
bc10: 67 68 74 20 62 65 20 6c 61 72 67 65 72 20 74 68  ght be larger th
bc20: 61 74 20 77 68 61 74 20 69 73 0a 2a 2a 20 72 65  at what is.** re
bc30: 61 6c 6c 79 20 6e 65 65 64 65 64 2e 0a 2a 2f 0a  ally needed..*/.
bc40: 73 74 61 74 69 63 20 69 6e 74 20 69 64 65 6e 74  static int ident
bc50: 4c 65 6e 67 74 68 28 63 6f 6e 73 74 20 63 68 61  Length(const cha
bc60: 72 20 2a 7a 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a  r *z){.  int n;.
bc70: 20 20 66 6f 72 28 6e 3d 30 3b 20 2a 7a 3b 20 6e    for(n=0; *z; n
bc80: 2b 2b 2c 20 7a 2b 2b 29 7b 0a 20 20 20 20 69 66  ++, z++){.    if
bc90: 28 20 2a 7a 3d 3d 27 22 27 20 29 7b 20 6e 2b 2b  ( *z=='"' ){ n++
bca0: 3b 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ; }.  }.  return
bcb0: 20 6e 20 2b 20 32 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   n + 2;.}../*.**
bcc0: 20 54 68 65 20 66 69 72 73 74 20 70 61 72 61 6d   The first param
bcd0: 65 74 65 72 20 69 73 20 61 20 70 6f 69 6e 74 65  eter is a pointe
bce0: 72 20 74 6f 20 61 6e 20 6f 75 74 70 75 74 20 62  r to an output b
bcf0: 75 66 66 65 72 2e 20 54 68 65 20 73 65 63 6f 6e  uffer. The secon
bd00: 64 20 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 20  d .** parameter 
bd10: 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  is a pointer to 
bd20: 61 6e 20 69 6e 74 65 67 65 72 20 74 68 61 74 20  an integer that 
bd30: 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 6f 66 66  contains the off
bd40: 73 65 74 20 61 74 0a 2a 2a 20 77 68 69 63 68 20  set at.** which 
bd50: 74 6f 20 77 72 69 74 65 20 69 6e 74 6f 20 74 68  to write into th
bd60: 65 20 6f 75 74 70 75 74 20 62 75 66 66 65 72 2e  e output buffer.
bd70: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63   This function c
bd80: 6f 70 69 65 73 20 74 68 65 0a 2a 2a 20 6e 75 6c  opies the.** nul
bd90: 2d 74 65 72 6d 69 6e 61 74 65 64 20 73 74 72 69  -terminated stri
bda0: 6e 67 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79  ng pointed to by
bdb0: 20 74 68 65 20 74 68 69 72 64 20 70 61 72 61 6d   the third param
bdc0: 65 74 65 72 2c 20 7a 53 69 67 6e 65 64 49 64 65  eter, zSignedIde
bdd0: 6e 74 2c 0a 2a 2a 20 74 6f 20 74 68 65 20 73 70  nt,.** to the sp
bde0: 65 63 69 66 69 65 64 20 6f 66 66 73 65 74 20 69  ecified offset i
bdf0: 6e 20 74 68 65 20 62 75 66 66 65 72 20 61 6e 64  n the buffer and
be00: 20 75 70 64 61 74 65 73 20 2a 70 49 64 78 20 74   updates *pIdx t
be10: 6f 20 72 65 66 65 72 0a 2a 2a 20 74 6f 20 74 68  o refer.** to th
be20: 65 20 66 69 72 73 74 20 62 79 74 65 20 61 66 74  e first byte aft
be30: 65 72 20 74 68 65 20 6c 61 73 74 20 62 79 74 65  er the last byte
be40: 20 77 72 69 74 74 65 6e 20 62 65 66 6f 72 65 20   written before 
be50: 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 20 0a 2a  returning..** .*
be60: 2a 20 49 66 20 74 68 65 20 73 74 72 69 6e 67 20  * If the string 
be70: 7a 53 69 67 6e 65 64 49 64 65 6e 74 20 63 6f 6e  zSignedIdent con
be80: 73 69 73 74 73 20 65 6e 74 69 72 65 6c 79 20 6f  sists entirely o
be90: 66 20 61 6c 70 68 61 2d 6e 75 6d 65 72 69 63 0a  f alpha-numeric.
bea0: 2a 2a 20 63 68 61 72 61 63 74 65 72 73 2c 20 64  ** characters, d
beb0: 6f 65 73 20 6e 6f 74 20 62 65 67 69 6e 20 77 69  oes not begin wi
bec0: 74 68 20 61 20 64 69 67 69 74 20 61 6e 64 20 69  th a digit and i
bed0: 73 20 6e 6f 74 20 61 6e 20 53 51 4c 20 6b 65 79  s not an SQL key
bee0: 77 6f 72 64 2c 0a 2a 2a 20 74 68 65 6e 20 69 74  word,.** then it
bef0: 20 69 73 20 63 6f 70 69 65 64 20 74 6f 20 74 68   is copied to th
bf00: 65 20 6f 75 74 70 75 74 20 62 75 66 66 65 72 20  e output buffer 
bf10: 65 78 61 63 74 6c 79 20 61 73 20 69 74 20 69 73  exactly as it is
bf20: 2e 20 4f 74 68 65 72 77 69 73 65 2c 0a 2a 2a 20  . Otherwise,.** 
bf30: 69 74 20 69 73 20 71 75 6f 74 65 64 20 75 73 69  it is quoted usi
bf40: 6e 67 20 64 6f 75 62 6c 65 2d 71 75 6f 74 65 73  ng double-quotes
bf50: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
bf60: 20 69 64 65 6e 74 50 75 74 28 63 68 61 72 20 2a   identPut(char *
bf70: 7a 2c 20 69 6e 74 20 2a 70 49 64 78 2c 20 63 68  z, int *pIdx, ch
bf80: 61 72 20 2a 7a 53 69 67 6e 65 64 49 64 65 6e 74  ar *zSignedIdent
bf90: 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  ){.  unsigned ch
bfa0: 61 72 20 2a 7a 49 64 65 6e 74 20 3d 20 28 75 6e  ar *zIdent = (un
bfb0: 73 69 67 6e 65 64 20 63 68 61 72 2a 29 7a 53 69  signed char*)zSi
bfc0: 67 6e 65 64 49 64 65 6e 74 3b 0a 20 20 69 6e 74  gnedIdent;.  int
bfd0: 20 69 2c 20 6a 2c 20 6e 65 65 64 51 75 6f 74 65   i, j, needQuote
bfe0: 3b 0a 20 20 69 20 3d 20 2a 70 49 64 78 3b 0a 0a  ;.  i = *pIdx;..
bff0: 20 20 66 6f 72 28 6a 3d 30 3b 20 7a 49 64 65 6e    for(j=0; zIden
c000: 74 5b 6a 5d 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  t[j]; j++){.    
c010: 69 66 28 20 21 73 71 6c 69 74 65 33 49 73 61 6c  if( !sqlite3Isal
c020: 6e 75 6d 28 7a 49 64 65 6e 74 5b 6a 5d 29 20 26  num(zIdent[j]) &
c030: 26 20 7a 49 64 65 6e 74 5b 6a 5d 21 3d 27 5f 27  & zIdent[j]!='_'
c040: 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20   ) break;.  }.  
c050: 6e 65 65 64 51 75 6f 74 65 20 3d 20 73 71 6c 69  needQuote = sqli
c060: 74 65 33 49 73 64 69 67 69 74 28 7a 49 64 65 6e  te3Isdigit(zIden
c070: 74 5b 30 5d 29 0a 20 20 20 20 20 20 20 20 20 20  t[0]).          
c080: 20 20 7c 7c 20 73 71 6c 69 74 65 33 4b 65 79 77    || sqlite3Keyw
c090: 6f 72 64 43 6f 64 65 28 7a 49 64 65 6e 74 2c 20  ordCode(zIdent, 
c0a0: 6a 29 21 3d 54 4b 5f 49 44 0a 20 20 20 20 20 20  j)!=TK_ID.      
c0b0: 20 20 20 20 20 20 7c 7c 20 7a 49 64 65 6e 74 5b        || zIdent[
c0c0: 6a 5d 21 3d 30 0a 20 20 20 20 20 20 20 20 20 20  j]!=0.          
c0d0: 20 20 7c 7c 20 6a 3d 3d 30 3b 0a 0a 20 20 69 66    || j==0;..  if
c0e0: 28 20 6e 65 65 64 51 75 6f 74 65 20 29 20 7a 5b  ( needQuote ) z[
c0f0: 69 2b 2b 5d 20 3d 20 27 22 27 3b 0a 20 20 66 6f  i++] = '"';.  fo
c100: 72 28 6a 3d 30 3b 20 7a 49 64 65 6e 74 5b 6a 5d  r(j=0; zIdent[j]
c110: 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 7a 5b 69 2b  ; j++){.    z[i+
c120: 2b 5d 20 3d 20 7a 49 64 65 6e 74 5b 6a 5d 3b 0a  +] = zIdent[j];.
c130: 20 20 20 20 69 66 28 20 7a 49 64 65 6e 74 5b 6a      if( zIdent[j
c140: 5d 3d 3d 27 22 27 20 29 20 7a 5b 69 2b 2b 5d 20  ]=='"' ) z[i++] 
c150: 3d 20 27 22 27 3b 0a 20 20 7d 0a 20 20 69 66 28  = '"';.  }.  if(
c160: 20 6e 65 65 64 51 75 6f 74 65 20 29 20 7a 5b 69   needQuote ) z[i
c170: 2b 2b 5d 20 3d 20 27 22 27 3b 0a 20 20 7a 5b 69  ++] = '"';.  z[i
c180: 5d 20 3d 20 30 3b 0a 20 20 2a 70 49 64 78 20 3d  ] = 0;.  *pIdx =
c190: 20 69 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e   i;.}../*.** Gen
c1a0: 65 72 61 74 65 20 61 20 43 52 45 41 54 45 20 54  erate a CREATE T
c1b0: 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 20 61  ABLE statement a
c1c0: 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20 74  ppropriate for t
c1d0: 68 65 20 67 69 76 65 6e 0a 2a 2a 20 74 61 62 6c  he given.** tabl
c1e0: 65 2e 20 20 4d 65 6d 6f 72 79 20 74 6f 20 68 6f  e.  Memory to ho
c1f0: 6c 64 20 74 68 65 20 74 65 78 74 20 6f 66 20 74  ld the text of t
c200: 68 65 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20  he statement is 
c210: 6f 62 74 61 69 6e 65 64 0a 2a 2a 20 66 72 6f 6d  obtained.** from
c220: 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 20   sqliteMalloc() 
c230: 61 6e 64 20 6d 75 73 74 20 62 65 20 66 72 65 65  and must be free
c240: 64 20 62 79 20 74 68 65 20 63 61 6c 6c 69 6e 67  d by the calling
c250: 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74   function..*/.st
c260: 61 74 69 63 20 63 68 61 72 20 2a 63 72 65 61 74  atic char *creat
c270: 65 54 61 62 6c 65 53 74 6d 74 28 73 71 6c 69 74  eTableStmt(sqlit
c280: 65 33 20 2a 64 62 2c 20 54 61 62 6c 65 20 2a 70  e3 *db, Table *p
c290: 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6b 2c 20 6e  ){.  int i, k, n
c2a0: 3b 0a 20 20 63 68 61 72 20 2a 7a 53 74 6d 74 3b  ;.  char *zStmt;
c2b0: 0a 20 20 63 68 61 72 20 2a 7a 53 65 70 2c 20 2a  .  char *zSep, *
c2c0: 7a 53 65 70 32 2c 20 2a 7a 45 6e 64 3b 0a 20 20  zSep2, *zEnd;.  
c2d0: 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20  Column *pCol;.  
c2e0: 6e 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70 43 6f  n = 0;.  for(pCo
c2f0: 6c 20 3d 20 70 2d 3e 61 43 6f 6c 2c 20 69 3d 30  l = p->aCol, i=0
c300: 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b  ; i<p->nCol; i++
c310: 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 6e  , pCol++){.    n
c320: 20 2b 3d 20 69 64 65 6e 74 4c 65 6e 67 74 68 28   += identLength(
c330: 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 20 2b 20 35  pCol->zName) + 5
c340: 3b 0a 20 20 7d 0a 20 20 6e 20 2b 3d 20 69 64 65  ;.  }.  n += ide
c350: 6e 74 4c 65 6e 67 74 68 28 70 2d 3e 7a 4e 61 6d  ntLength(p->zNam
c360: 65 29 3b 0a 20 20 69 66 28 20 6e 3c 35 30 20 29  e);.  if( n<50 )
c370: 7b 20 0a 20 20 20 20 7a 53 65 70 20 3d 20 22 22  { .    zSep = ""
c380: 3b 0a 20 20 20 20 7a 53 65 70 32 20 3d 20 22 2c  ;.    zSep2 = ",
c390: 22 3b 0a 20 20 20 20 7a 45 6e 64 20 3d 20 22 29  ";.    zEnd = ")
c3a0: 22 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  ";.  }else{.    
c3b0: 7a 53 65 70 20 3d 20 22 5c 6e 20 20 22 3b 0a 20  zSep = "\n  ";. 
c3c0: 20 20 20 7a 53 65 70 32 20 3d 20 22 2c 5c 6e 20     zSep2 = ",\n 
c3d0: 20 22 3b 0a 20 20 20 20 7a 45 6e 64 20 3d 20 22   ";.    zEnd = "
c3e0: 5c 6e 29 22 3b 0a 20 20 7d 0a 20 20 6e 20 2b 3d  \n)";.  }.  n +=
c3f0: 20 33 35 20 2b 20 36 2a 70 2d 3e 6e 43 6f 6c 3b   35 + 6*p->nCol;
c400: 0a 20 20 7a 53 74 6d 74 20 3d 20 73 71 6c 69 74  .  zStmt = sqlit
c410: 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 30 2c  e3DbMallocRaw(0,
c420: 20 6e 29 3b 0a 20 20 69 66 28 20 7a 53 74 6d 74   n);.  if( zStmt
c430: 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
c440: 65 33 4f 6f 6d 46 61 75 6c 74 28 64 62 29 3b 0a  e3OomFault(db);.
c450: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
c460: 7d 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72  }.  sqlite3_snpr
c470: 69 6e 74 66 28 6e 2c 20 7a 53 74 6d 74 2c 20 22  intf(n, zStmt, "
c480: 43 52 45 41 54 45 20 54 41 42 4c 45 20 22 29 3b  CREATE TABLE ");
c490: 0a 20 20 6b 20 3d 20 73 71 6c 69 74 65 33 53 74  .  k = sqlite3St
c4a0: 72 6c 65 6e 33 30 28 7a 53 74 6d 74 29 3b 0a 20  rlen30(zStmt);. 
c4b0: 20 69 64 65 6e 74 50 75 74 28 7a 53 74 6d 74 2c   identPut(zStmt,
c4c0: 20 26 6b 2c 20 70 2d 3e 7a 4e 61 6d 65 29 3b 0a   &k, p->zName);.
c4d0: 20 20 7a 53 74 6d 74 5b 6b 2b 2b 5d 20 3d 20 27    zStmt[k++] = '
c4e0: 28 27 3b 0a 20 20 66 6f 72 28 70 43 6f 6c 3d 70  (';.  for(pCol=p
c4f0: 2d 3e 61 43 6f 6c 2c 20 69 3d 30 3b 20 69 3c 70  ->aCol, i=0; i<p
c500: 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f  ->nCol; i++, pCo
c510: 6c 2b 2b 29 7b 0a 20 20 20 20 73 74 61 74 69 63  l++){.    static
c520: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 20 63 6f   const char * co
c530: 6e 73 74 20 61 7a 54 79 70 65 5b 5d 20 3d 20 7b  nst azType[] = {
c540: 0a 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 49  .        /* SQLI
c550: 54 45 5f 41 46 46 5f 42 4c 4f 42 20 20 20 20 2a  TE_AFF_BLOB    *
c560: 2f 20 22 22 2c 0a 20 20 20 20 20 20 20 20 2f 2a  / "",.        /*
c570: 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54   SQLITE_AFF_TEXT
c580: 20 20 20 20 2a 2f 20 22 20 54 45 58 54 22 2c 0a      */ " TEXT",.
c590: 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 49 54          /* SQLIT
c5a0: 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20 2a 2f  E_AFF_NUMERIC */
c5b0: 20 22 20 4e 55 4d 22 2c 0a 20 20 20 20 20 20 20   " NUM",.       
c5c0: 20 2f 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f 49   /* SQLITE_AFF_I
c5d0: 4e 54 45 47 45 52 20 2a 2f 20 22 20 49 4e 54 22  NTEGER */ " INT"
c5e0: 2c 0a 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c  ,.        /* SQL
c5f0: 49 54 45 5f 41 46 46 5f 52 45 41 4c 20 20 20 20  ITE_AFF_REAL    
c600: 2a 2f 20 22 20 52 45 41 4c 22 0a 20 20 20 20 7d  */ " REAL".    }
c610: 3b 0a 20 20 20 20 69 6e 74 20 6c 65 6e 3b 0a 20  ;.    int len;. 
c620: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
c630: 54 79 70 65 3b 0a 0a 20 20 20 20 73 71 6c 69 74  Type;..    sqlit
c640: 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 2d 6b 2c  e3_snprintf(n-k,
c650: 20 26 7a 53 74 6d 74 5b 6b 5d 2c 20 7a 53 65 70   &zStmt[k], zSep
c660: 29 3b 0a 20 20 20 20 6b 20 2b 3d 20 73 71 6c 69  );.    k += sqli
c670: 74 65 33 53 74 72 6c 65 6e 33 30 28 26 7a 53 74  te3Strlen30(&zSt
c680: 6d 74 5b 6b 5d 29 3b 0a 20 20 20 20 7a 53 65 70  mt[k]);.    zSep
c690: 20 3d 20 7a 53 65 70 32 3b 0a 20 20 20 20 69 64   = zSep2;.    id
c6a0: 65 6e 74 50 75 74 28 7a 53 74 6d 74 2c 20 26 6b  entPut(zStmt, &k
c6b0: 2c 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a  , pCol->zName);.
c6c0: 20 20 20 20 61 73 73 65 72 74 28 20 70 43 6f 6c      assert( pCol
c6d0: 2d 3e 61 66 66 69 6e 69 74 79 2d 53 51 4c 49 54  ->affinity-SQLIT
c6e0: 45 5f 41 46 46 5f 42 4c 4f 42 20 3e 3d 20 30 20  E_AFF_BLOB >= 0 
c6f0: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
c700: 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 2d 53 51  Col->affinity-SQ
c710: 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 20 3c 20  LITE_AFF_BLOB < 
c720: 41 72 72 61 79 53 69 7a 65 28 61 7a 54 79 70 65  ArraySize(azType
c730: 29 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  ) );.    testcas
c740: 65 28 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74  e( pCol->affinit
c750: 79 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c  y==SQLITE_AFF_BL
c760: 4f 42 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61  OB );.    testca
c770: 73 65 28 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69  se( pCol->affini
c780: 74 79 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 54  ty==SQLITE_AFF_T
c790: 45 58 54 20 29 3b 0a 20 20 20 20 74 65 73 74 63  EXT );.    testc
c7a0: 61 73 65 28 20 70 43 6f 6c 2d 3e 61 66 66 69 6e  ase( pCol->affin
c7b0: 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f  ity==SQLITE_AFF_
c7c0: 4e 55 4d 45 52 49 43 20 29 3b 0a 20 20 20 20 74  NUMERIC );.    t
c7d0: 65 73 74 63 61 73 65 28 20 70 43 6f 6c 2d 3e 61  estcase( pCol->a
c7e0: 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f  ffinity==SQLITE_
c7f0: 41 46 46 5f 49 4e 54 45 47 45 52 20 29 3b 0a 20  AFF_INTEGER );. 
c800: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 43 6f     testcase( pCo
c810: 6c 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 53 51 4c  l->affinity==SQL
c820: 49 54 45 5f 41 46 46 5f 52 45 41 4c 20 29 3b 0a  ITE_AFF_REAL );.
c830: 20 20 20 20 0a 20 20 20 20 7a 54 79 70 65 20 3d      .    zType =
c840: 20 61 7a 54 79 70 65 5b 70 43 6f 6c 2d 3e 61 66   azType[pCol->af
c850: 66 69 6e 69 74 79 20 2d 20 53 51 4c 49 54 45 5f  finity - SQLITE_
c860: 41 46 46 5f 42 4c 4f 42 5d 3b 0a 20 20 20 20 6c  AFF_BLOB];.    l
c870: 65 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  en = sqlite3Strl
c880: 65 6e 33 30 28 7a 54 79 70 65 29 3b 0a 20 20 20  en30(zType);.   
c890: 20 61 73 73 65 72 74 28 20 70 43 6f 6c 2d 3e 61   assert( pCol->a
c8a0: 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f  ffinity==SQLITE_
c8b0: 41 46 46 5f 42 4c 4f 42 20 0a 20 20 20 20 20 20  AFF_BLOB .      
c8c0: 20 20 20 20 20 20 7c 7c 20 70 43 6f 6c 2d 3e 61        || pCol->a
c8d0: 66 66 69 6e 69 74 79 3d 3d 73 71 6c 69 74 65 33  ffinity==sqlite3
c8e0: 41 66 66 69 6e 69 74 79 54 79 70 65 28 7a 54 79  AffinityType(zTy
c8f0: 70 65 2c 20 30 29 20 29 3b 0a 20 20 20 20 6d 65  pe, 0) );.    me
c900: 6d 63 70 79 28 26 7a 53 74 6d 74 5b 6b 5d 2c 20  mcpy(&zStmt[k], 
c910: 7a 54 79 70 65 2c 20 6c 65 6e 29 3b 0a 20 20 20  zType, len);.   
c920: 20 6b 20 2b 3d 20 6c 65 6e 3b 0a 20 20 20 20 61   k += len;.    a
c930: 73 73 65 72 74 28 20 6b 3c 3d 6e 20 29 3b 0a 20  ssert( k<=n );. 
c940: 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70   }.  sqlite3_snp
c950: 72 69 6e 74 66 28 6e 2d 6b 2c 20 26 7a 53 74 6d  rintf(n-k, &zStm
c960: 74 5b 6b 5d 2c 20 22 25 73 22 2c 20 7a 45 6e 64  t[k], "%s", zEnd
c970: 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a 53 74 6d  );.  return zStm
c980: 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 69  t;.}../*.** Resi
c990: 7a 65 20 61 6e 20 49 6e 64 65 78 20 6f 62 6a 65  ze an Index obje
c9a0: 63 74 20 74 6f 20 68 6f 6c 64 20 4e 20 63 6f 6c  ct to hold N col
c9b0: 75 6d 6e 73 20 74 6f 74 61 6c 2e 20 20 52 65 74  umns total.  Ret
c9c0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a  urn SQLITE_OK.**
c9d0: 20 6f 6e 20 73 75 63 63 65 73 73 20 61 6e 64 20   on success and 
c9e0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 6f 6e 20  SQLITE_NOMEM on 
c9f0: 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 2e 0a 2a 2f  an OOM error..*/
ca00: 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 73 69  .static int resi
ca10: 7a 65 49 6e 64 65 78 4f 62 6a 65 63 74 28 73 71  zeIndexObject(sq
ca20: 6c 69 74 65 33 20 2a 64 62 2c 20 49 6e 64 65 78  lite3 *db, Index
ca30: 20 2a 70 49 64 78 2c 20 69 6e 74 20 4e 29 7b 0a   *pIdx, int N){.
ca40: 20 20 63 68 61 72 20 2a 7a 45 78 74 72 61 3b 0a    char *zExtra;.
ca50: 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20 69    int nByte;.  i
ca60: 66 28 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e  f( pIdx->nColumn
ca70: 3e 3d 4e 20 29 20 72 65 74 75 72 6e 20 53 51 4c  >=N ) return SQL
ca80: 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65 72 74  ITE_OK;.  assert
ca90: 28 20 70 49 64 78 2d 3e 69 73 52 65 73 69 7a 65  ( pIdx->isResize
caa0: 64 3d 3d 30 20 29 3b 0a 20 20 6e 42 79 74 65 20  d==0 );.  nByte 
cab0: 3d 20 28 73 69 7a 65 6f 66 28 63 68 61 72 2a 29  = (sizeof(char*)
cac0: 20 2b 20 73 69 7a 65 6f 66 28 69 31 36 29 20 2b   + sizeof(i16) +
cad0: 20 31 29 2a 4e 3b 0a 20 20 7a 45 78 74 72 61 20   1)*N;.  zExtra 
cae0: 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
caf0: 63 5a 65 72 6f 28 64 62 2c 20 6e 42 79 74 65 29  cZero(db, nByte)
cb00: 3b 0a 20 20 69 66 28 20 7a 45 78 74 72 61 3d 3d  ;.  if( zExtra==
cb10: 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  0 ) return SQLIT
cb20: 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20  E_NOMEM_BKPT;.  
cb30: 6d 65 6d 63 70 79 28 7a 45 78 74 72 61 2c 20 70  memcpy(zExtra, p
cb40: 49 64 78 2d 3e 61 7a 43 6f 6c 6c 2c 20 73 69 7a  Idx->azColl, siz
cb50: 65 6f 66 28 63 68 61 72 2a 29 2a 70 49 64 78 2d  eof(char*)*pIdx-
cb60: 3e 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 70 49 64  >nColumn);.  pId
cb70: 78 2d 3e 61 7a 43 6f 6c 6c 20 3d 20 28 63 6f 6e  x->azColl = (con
cb80: 73 74 20 63 68 61 72 2a 2a 29 7a 45 78 74 72 61  st char**)zExtra
cb90: 3b 0a 20 20 7a 45 78 74 72 61 20 2b 3d 20 73 69  ;.  zExtra += si
cba0: 7a 65 6f 66 28 63 68 61 72 2a 29 2a 4e 3b 0a 20  zeof(char*)*N;. 
cbb0: 20 6d 65 6d 63 70 79 28 7a 45 78 74 72 61 2c 20   memcpy(zExtra, 
cbc0: 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 2c 20  pIdx->aiColumn, 
cbd0: 73 69 7a 65 6f 66 28 69 31 36 29 2a 70 49 64 78  sizeof(i16)*pIdx
cbe0: 2d 3e 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 70 49  ->nColumn);.  pI
cbf0: 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 20 3d 20 28  dx->aiColumn = (
cc00: 69 31 36 2a 29 7a 45 78 74 72 61 3b 0a 20 20 7a  i16*)zExtra;.  z
cc10: 45 78 74 72 61 20 2b 3d 20 73 69 7a 65 6f 66 28  Extra += sizeof(
cc20: 69 31 36 29 2a 4e 3b 0a 20 20 6d 65 6d 63 70 79  i16)*N;.  memcpy
cc30: 28 7a 45 78 74 72 61 2c 20 70 49 64 78 2d 3e 61  (zExtra, pIdx->a
cc40: 53 6f 72 74 4f 72 64 65 72 2c 20 70 49 64 78 2d  SortOrder, pIdx-
cc50: 3e 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 70 49 64  >nColumn);.  pId
cc60: 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 20 3d 20  x->aSortOrder = 
cc70: 28 75 38 2a 29 7a 45 78 74 72 61 3b 0a 20 20 70  (u8*)zExtra;.  p
cc80: 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 3d 20 4e  Idx->nColumn = N
cc90: 3b 0a 20 20 70 49 64 78 2d 3e 69 73 52 65 73 69  ;.  pIdx->isResi
cca0: 7a 65 64 20 3d 20 31 3b 0a 20 20 72 65 74 75 72  zed = 1;.  retur
ccb0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
ccc0: 2f 2a 0a 2a 2a 20 45 73 74 69 6d 61 74 65 20 74  /*.** Estimate t
ccd0: 68 65 20 74 6f 74 61 6c 20 72 6f 77 20 77 69 64  he total row wid
cce0: 74 68 20 66 6f 72 20 61 20 74 61 62 6c 65 2e 0a  th for a table..
ccf0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65  */.static void e
cd00: 73 74 69 6d 61 74 65 54 61 62 6c 65 57 69 64 74  stimateTableWidt
cd10: 68 28 54 61 62 6c 65 20 2a 70 54 61 62 29 7b 0a  h(Table *pTab){.
cd20: 20 20 75 6e 73 69 67 6e 65 64 20 77 54 61 62 6c    unsigned wTabl
cd30: 65 20 3d 20 30 3b 0a 20 20 63 6f 6e 73 74 20 43  e = 0;.  const C
cd40: 6f 6c 75 6d 6e 20 2a 70 54 61 62 43 6f 6c 3b 0a  olumn *pTabCol;.
cd50: 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69    int i;.  for(i
cd60: 3d 70 54 61 62 2d 3e 6e 43 6f 6c 2c 20 70 54 61  =pTab->nCol, pTa
cd70: 62 43 6f 6c 3d 70 54 61 62 2d 3e 61 43 6f 6c 3b  bCol=pTab->aCol;
cd80: 20 69 3e 30 3b 20 69 2d 2d 2c 20 70 54 61 62 43   i>0; i--, pTabC
cd90: 6f 6c 2b 2b 29 7b 0a 20 20 20 20 77 54 61 62 6c  ol++){.    wTabl
cda0: 65 20 2b 3d 20 70 54 61 62 43 6f 6c 2d 3e 73 7a  e += pTabCol->sz
cdb0: 45 73 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  Est;.  }.  if( p
cdc0: 54 61 62 2d 3e 69 50 4b 65 79 3c 30 20 29 20 77  Tab->iPKey<0 ) w
cdd0: 54 61 62 6c 65 2b 2b 3b 0a 20 20 70 54 61 62 2d  Table++;.  pTab-
cde0: 3e 73 7a 54 61 62 52 6f 77 20 3d 20 73 71 6c 69  >szTabRow = sqli
cdf0: 74 65 33 4c 6f 67 45 73 74 28 77 54 61 62 6c 65  te3LogEst(wTable
ce00: 2a 34 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 73  *4);.}../*.** Es
ce10: 74 69 6d 61 74 65 20 74 68 65 20 61 76 65 72 61  timate the avera
ce20: 67 65 20 73 69 7a 65 20 6f 66 20 61 20 72 6f 77  ge size of a row
ce30: 20 66 6f 72 20 61 6e 20 69 6e 64 65 78 2e 0a 2a   for an index..*
ce40: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 73  /.static void es
ce50: 74 69 6d 61 74 65 49 6e 64 65 78 57 69 64 74 68  timateIndexWidth
ce60: 28 49 6e 64 65 78 20 2a 70 49 64 78 29 7b 0a 20  (Index *pIdx){. 
ce70: 20 75 6e 73 69 67 6e 65 64 20 77 49 6e 64 65 78   unsigned wIndex
ce80: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 20   = 0;.  int i;. 
ce90: 20 63 6f 6e 73 74 20 43 6f 6c 75 6d 6e 20 2a 61   const Column *a
cea0: 43 6f 6c 20 3d 20 70 49 64 78 2d 3e 70 54 61 62  Col = pIdx->pTab
ceb0: 6c 65 2d 3e 61 43 6f 6c 3b 0a 20 20 66 6f 72 28  le->aCol;.  for(
cec0: 69 3d 30 3b 20 69 3c 70 49 64 78 2d 3e 6e 43 6f  i=0; i<pIdx->nCo
ced0: 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  lumn; i++){.    
cee0: 69 31 36 20 78 20 3d 20 70 49 64 78 2d 3e 61 69  i16 x = pIdx->ai
cef0: 43 6f 6c 75 6d 6e 5b 69 5d 3b 0a 20 20 20 20 61  Column[i];.    a
cf00: 73 73 65 72 74 28 20 78 3c 70 49 64 78 2d 3e 70  ssert( x<pIdx->p
cf10: 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 29 3b 0a 20  Table->nCol );. 
cf20: 20 20 20 77 49 6e 64 65 78 20 2b 3d 20 78 3c 30     wIndex += x<0
cf30: 20 3f 20 31 20 3a 20 61 43 6f 6c 5b 70 49 64 78   ? 1 : aCol[pIdx
cf40: 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 5d 2e 73  ->aiColumn[i]].s
cf50: 7a 45 73 74 3b 0a 20 20 7d 0a 20 20 70 49 64 78  zEst;.  }.  pIdx
cf60: 2d 3e 73 7a 49 64 78 52 6f 77 20 3d 20 73 71 6c  ->szIdxRow = sql
cf70: 69 74 65 33 4c 6f 67 45 73 74 28 77 49 6e 64 65  ite3LogEst(wInde
cf80: 78 2a 34 29 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75  x*4);.}../* Retu
cf90: 72 6e 20 74 72 75 65 20 69 66 20 76 61 6c 75 65  rn true if value
cfa0: 20 78 20 69 73 20 66 6f 75 6e 64 20 61 6e 79 20   x is found any 
cfb0: 6f 66 20 74 68 65 20 66 69 72 73 74 20 6e 43 6f  of the first nCo
cfc0: 6c 20 65 6e 74 72 69 65 73 20 6f 66 20 61 69 43  l entries of aiC
cfd0: 6f 6c 5b 5d 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ol[].*/.static i
cfe0: 6e 74 20 68 61 73 43 6f 6c 75 6d 6e 28 63 6f 6e  nt hasColumn(con
cff0: 73 74 20 69 31 36 20 2a 61 69 43 6f 6c 2c 20 69  st i16 *aiCol, i
d000: 6e 74 20 6e 43 6f 6c 2c 20 69 6e 74 20 78 29 7b  nt nCol, int x){
d010: 0a 20 20 77 68 69 6c 65 28 20 6e 43 6f 6c 2d 2d  .  while( nCol--
d020: 20 3e 20 30 20 29 20 69 66 28 20 78 3d 3d 2a 28   > 0 ) if( x==*(
d030: 61 69 43 6f 6c 2b 2b 29 20 29 20 72 65 74 75 72  aiCol++) ) retur
d040: 6e 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b  n 1;.  return 0;
d050: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
d060: 6f 75 74 69 6e 65 20 72 75 6e 73 20 61 74 20 74  outine runs at t
d070: 68 65 20 65 6e 64 20 6f 66 20 70 61 72 73 69 6e  he end of parsin
d080: 67 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45  g a CREATE TABLE
d090: 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74 0a   statement that.
d0a0: 2a 2a 20 68 61 73 20 61 20 57 49 54 48 4f 55 54  ** has a WITHOUT
d0b0: 20 52 4f 57 49 44 20 63 6c 61 75 73 65 2e 20 20   ROWID clause.  
d0c0: 54 68 65 20 6a 6f 62 20 6f 66 20 74 68 69 73 20  The job of this 
d0d0: 72 6f 75 74 69 6e 65 20 69 73 20 74 6f 20 63 6f  routine is to co
d0e0: 6e 76 65 72 74 20 62 6f 74 68 0a 2a 2a 20 69 6e  nvert both.** in
d0f0: 74 65 72 6e 61 6c 20 73 63 68 65 6d 61 20 64 61  ternal schema da
d100: 74 61 20 73 74 72 75 63 74 75 72 65 73 20 61 6e  ta structures an
d110: 64 20 74 68 65 20 67 65 6e 65 72 61 74 65 64 20  d the generated 
d120: 56 44 42 45 20 63 6f 64 65 20 73 6f 20 74 68 61  VDBE code so tha
d130: 74 20 74 68 65 79 0a 2a 2a 20 61 72 65 20 61 70  t they.** are ap
d140: 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20 61 20  propriate for a 
d150: 57 49 54 48 4f 55 54 20 52 4f 57 49 44 20 74 61  WITHOUT ROWID ta
d160: 62 6c 65 20 69 6e 73 74 65 61 64 20 6f 66 20 61  ble instead of a
d170: 20 72 6f 77 69 64 20 74 61 62 6c 65 2e 0a 2a 2a   rowid table..**
d180: 20 43 68 61 6e 67 65 73 20 69 6e 63 6c 75 64 65   Changes include
d190: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20  :.**.**     (1) 
d1a0: 20 43 6f 6e 76 65 72 74 20 74 68 65 20 4f 50 5f   Convert the OP_
d1b0: 43 72 65 61 74 65 54 61 62 6c 65 20 69 6e 74 6f  CreateTable into
d1c0: 20 61 6e 20 4f 50 5f 43 72 65 61 74 65 49 6e 64   an OP_CreateInd
d1d0: 65 78 2e 20 20 54 68 65 72 65 20 69 73 0a 2a 2a  ex.  There is.**
d1e0: 20 20 20 20 20 20 20 20 20 20 6e 6f 20 72 6f 77            no row
d1f0: 69 64 20 62 74 72 65 65 20 66 6f 72 20 61 20 57  id btree for a W
d200: 49 54 48 4f 55 54 20 52 4f 57 49 44 2e 20 20 49  ITHOUT ROWID.  I
d210: 6e 73 74 65 61 64 2c 20 74 68 65 20 63 61 6e 6f  nstead, the cano
d220: 6e 69 63 61 6c 0a 2a 2a 20 20 20 20 20 20 20 20  nical.**        
d230: 20 20 64 61 74 61 20 73 74 6f 72 61 67 65 20 69    data storage i
d240: 73 20 61 20 63 6f 76 65 72 69 6e 67 20 69 6e 64  s a covering ind
d250: 65 78 20 62 74 72 65 65 2e 0a 2a 2a 20 20 20 20  ex btree..**    
d260: 20 28 32 29 20 20 42 79 70 61 73 73 20 74 68 65   (2)  Bypass the
d270: 20 63 72 65 61 74 69 6f 6e 20 6f 66 20 74 68 65   creation of the
d280: 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74   sqlite_master t
d290: 61 62 6c 65 20 65 6e 74 72 79 0a 2a 2a 20 20 20  able entry.**   
d2a0: 20 20 20 20 20 20 20 66 6f 72 20 74 68 65 20 50         for the P
d2b0: 52 49 4d 41 52 59 20 4b 45 59 20 61 73 20 74 68  RIMARY KEY as th
d2c0: 65 20 70 72 69 6d 61 72 79 20 6b 65 79 20 69 6e  e primary key in
d2d0: 64 65 78 20 69 73 20 6e 6f 77 0a 2a 2a 20 20 20  dex is now.**   
d2e0: 20 20 20 20 20 20 20 69 64 65 6e 74 69 66 69 65         identifie
d2f0: 64 20 62 79 20 74 68 65 20 73 71 6c 69 74 65 5f  d by the sqlite_
d300: 6d 61 73 74 65 72 20 74 61 62 6c 65 20 65 6e 74  master table ent
d310: 72 79 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  ry of the table 
d320: 69 74 73 65 6c 66 2e 0a 2a 2a 20 20 20 20 20 28  itself..**     (
d330: 33 29 20 20 53 65 74 20 74 68 65 20 49 6e 64 65  3)  Set the Inde
d340: 78 2e 74 6e 75 6d 20 6f 66 20 74 68 65 20 50 52  x.tnum of the PR
d350: 49 4d 41 52 59 20 4b 45 59 20 49 6e 64 65 78 20  IMARY KEY Index 
d360: 6f 62 6a 65 63 74 20 69 6e 20 74 68 65 0a 2a 2a  object in the.**
d370: 20 20 20 20 20 20 20 20 20 20 73 63 68 65 6d 61            schema
d380: 20 74 6f 20 74 68 65 20 72 6f 6f 74 70 61 67 65   to the rootpage
d390: 20 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e 20 74   from the main t
d3a0: 61 62 6c 65 2e 0a 2a 2a 20 20 20 20 20 28 34 29  able..**     (4)
d3b0: 20 20 53 65 74 20 61 6c 6c 20 63 6f 6c 75 6d 6e    Set all column
d3c0: 73 20 6f 66 20 74 68 65 20 50 52 49 4d 41 52 59  s of the PRIMARY
d3d0: 20 4b 45 59 20 73 63 68 65 6d 61 20 6f 62 6a 65   KEY schema obje
d3e0: 63 74 20 74 6f 20 62 65 20 4e 4f 54 20 4e 55 4c  ct to be NOT NUL
d3f0: 4c 2e 0a 2a 2a 20 20 20 20 20 28 35 29 20 20 41  L..**     (5)  A
d400: 64 64 20 61 6c 6c 20 74 61 62 6c 65 20 63 6f 6c  dd all table col
d410: 75 6d 6e 73 20 74 6f 20 74 68 65 20 50 52 49 4d  umns to the PRIM
d420: 41 52 59 20 4b 45 59 20 49 6e 64 65 78 20 6f 62  ARY KEY Index ob
d430: 6a 65 63 74 0a 2a 2a 20 20 20 20 20 20 20 20 20  ject.**         
d440: 20 73 6f 20 74 68 61 74 20 74 68 65 20 50 52 49   so that the PRI
d450: 4d 41 52 59 20 4b 45 59 20 69 73 20 61 20 63 6f  MARY KEY is a co
d460: 76 65 72 69 6e 67 20 69 6e 64 65 78 2e 20 20 54  vering index.  T
d470: 68 65 20 73 75 72 70 6c 75 73 0a 2a 2a 20 20 20  he surplus.**   
d480: 20 20 20 20 20 20 20 63 6f 6c 75 6d 6e 73 20 61         columns a
d490: 72 65 20 70 61 72 74 20 6f 66 20 4b 65 79 49 6e  re part of KeyIn
d4a0: 66 6f 2e 6e 58 46 69 65 6c 64 20 61 6e 64 20 61  fo.nXField and a
d4b0: 72 65 20 6e 6f 74 20 75 73 65 64 20 66 6f 72 0a  re not used for.
d4c0: 2a 2a 20 20 20 20 20 20 20 20 20 20 73 6f 72 74  **          sort
d4d0: 69 6e 67 20 6f 72 20 6c 6f 6f 6b 75 70 20 6f 72  ing or lookup or
d4e0: 20 75 6e 69 71 75 65 6e 65 73 73 20 63 68 65 63   uniqueness chec
d4f0: 6b 73 2e 0a 2a 2a 20 20 20 20 20 28 36 29 20 20  ks..**     (6)  
d500: 52 65 70 6c 61 63 65 20 74 68 65 20 72 6f 77 69  Replace the rowi
d510: 64 20 74 61 69 6c 20 6f 6e 20 61 6c 6c 20 61 75  d tail on all au
d520: 74 6f 6d 61 74 69 63 61 6c 6c 79 20 67 65 6e 65  tomatically gene
d530: 72 61 74 65 64 20 55 4e 49 51 55 45 0a 2a 2a 20  rated UNIQUE.** 
d540: 20 20 20 20 20 20 20 20 20 69 6e 64 69 63 65 73           indices
d550: 20 77 69 74 68 20 74 68 65 20 50 52 49 4d 41 52   with the PRIMAR
d560: 59 20 4b 45 59 20 63 6f 6c 75 6d 6e 73 2e 0a 2a  Y KEY columns..*
d570: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f  /.static void co
d580: 6e 76 65 72 74 54 6f 57 69 74 68 6f 75 74 52 6f  nvertToWithoutRo
d590: 77 69 64 54 61 62 6c 65 28 50 61 72 73 65 20 2a  widTable(Parse *
d5a0: 70 50 61 72 73 65 2c 20 54 61 62 6c 65 20 2a 70  pParse, Table *p
d5b0: 54 61 62 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70  Tab){.  Index *p
d5c0: 49 64 78 3b 0a 20 20 49 6e 64 65 78 20 2a 70 50  Idx;.  Index *pP
d5d0: 6b 3b 0a 20 20 69 6e 74 20 6e 50 6b 3b 0a 20 20  k;.  int nPk;.  
d5e0: 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 73 71 6c 69  int i, j;.  sqli
d5f0: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
d600: 2d 3e 64 62 3b 0a 20 20 56 64 62 65 20 2a 76 20  ->db;.  Vdbe *v 
d610: 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
d620: 0a 0a 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20 74  ..  /* Convert t
d630: 68 65 20 4f 50 5f 43 72 65 61 74 65 54 61 62 6c  he OP_CreateTabl
d640: 65 20 6f 70 63 6f 64 65 20 74 68 61 74 20 77 6f  e opcode that wo
d650: 75 6c 64 20 6e 6f 72 6d 61 6c 6c 79 20 63 72 65  uld normally cre
d660: 61 74 65 20 74 68 65 0a 20 20 2a 2a 20 72 6f 6f  ate the.  ** roo
d670: 74 2d 70 61 67 65 20 66 6f 72 20 74 68 65 20 74  t-page for the t
d680: 61 62 6c 65 20 69 6e 74 6f 20 61 6e 20 4f 50 5f  able into an OP_
d690: 43 72 65 61 74 65 49 6e 64 65 78 20 6f 70 63 6f  CreateIndex opco
d6a0: 64 65 2e 20 20 54 68 65 20 69 6e 64 65 78 0a 20  de.  The index. 
d6b0: 20 2a 2a 20 63 72 65 61 74 65 64 20 77 69 6c 6c   ** created will
d6c0: 20 62 65 63 6f 6d 65 20 74 68 65 20 50 52 49 4d   become the PRIM
d6d0: 41 52 59 20 4b 45 59 20 69 6e 64 65 78 2e 0a 20  ARY KEY index.. 
d6e0: 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 72 73 65   */.  if( pParse
d6f0: 2d 3e 61 64 64 72 43 72 54 61 62 20 29 7b 0a 20  ->addrCrTab ){. 
d700: 20 20 20 61 73 73 65 72 74 28 20 76 20 29 3b 0a     assert( v );.
d710: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
d720: 68 61 6e 67 65 4f 70 63 6f 64 65 28 76 2c 20 70  hangeOpcode(v, p
d730: 50 61 72 73 65 2d 3e 61 64 64 72 43 72 54 61 62  Parse->addrCrTab
d740: 2c 20 4f 50 5f 43 72 65 61 74 65 49 6e 64 65 78  , OP_CreateIndex
d750: 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 63  );.  }..  /* Loc
d760: 61 74 65 20 74 68 65 20 50 52 49 4d 41 52 59 20  ate the PRIMARY 
d770: 4b 45 59 20 69 6e 64 65 78 2e 20 20 4f 72 2c 20  KEY index.  Or, 
d780: 69 66 20 74 68 69 73 20 74 61 62 6c 65 20 77 61  if this table wa
d790: 73 20 6f 72 69 67 69 6e 61 6c 6c 79 0a 20 20 2a  s originally.  *
d7a0: 2a 20 61 6e 20 49 4e 54 45 47 45 52 20 50 52 49  * an INTEGER PRI
d7b0: 4d 41 52 59 20 4b 45 59 20 74 61 62 6c 65 2c 20  MARY KEY table, 
d7c0: 63 72 65 61 74 65 20 61 20 6e 65 77 20 50 52 49  create a new PRI
d7d0: 4d 41 52 59 20 4b 45 59 20 69 6e 64 65 78 2e 20  MARY KEY index. 
d7e0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 54 61 62  .  */.  if( pTab
d7f0: 2d 3e 69 50 4b 65 79 3e 3d 30 20 29 7b 0a 20 20  ->iPKey>=0 ){.  
d800: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73    ExprList *pLis
d810: 74 3b 0a 20 20 20 20 54 6f 6b 65 6e 20 69 70 6b  t;.    Token ipk
d820: 54 6f 6b 65 6e 3b 0a 20 20 20 20 73 71 6c 69 74  Token;.    sqlit
d830: 65 33 54 6f 6b 65 6e 49 6e 69 74 28 26 69 70 6b  e3TokenInit(&ipk
d840: 54 6f 6b 65 6e 2c 20 70 54 61 62 2d 3e 61 43 6f  Token, pTab->aCo
d850: 6c 5b 70 54 61 62 2d 3e 69 50 4b 65 79 5d 2e 7a  l[pTab->iPKey].z
d860: 4e 61 6d 65 29 3b 0a 20 20 20 20 70 4c 69 73 74  Name);.    pList
d870: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69   = sqlite3ExprLi
d880: 73 74 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c  stAppend(pParse,
d890: 20 30 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20   0, .           
d8a0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
d8b0: 70 72 41 6c 6c 6f 63 28 64 62 2c 20 54 4b 5f 49  prAlloc(db, TK_I
d8c0: 44 2c 20 26 69 70 6b 54 6f 6b 65 6e 2c 20 30 29  D, &ipkToken, 0)
d8d0: 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74  );.    if( pList
d8e0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
d8f0: 20 20 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 73 6f    pList->a[0].so
d900: 72 74 4f 72 64 65 72 20 3d 20 70 50 61 72 73 65  rtOrder = pParse
d910: 2d 3e 69 50 6b 53 6f 72 74 4f 72 64 65 72 3b 0a  ->iPkSortOrder;.
d920: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72      assert( pPar
d930: 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3d 3d 70  se->pNewTable==p
d940: 54 61 62 20 29 3b 0a 20 20 20 20 70 50 6b 20 3d  Tab );.    pPk =
d950: 20 73 71 6c 69 74 65 33 43 72 65 61 74 65 49 6e   sqlite3CreateIn
d960: 64 65 78 28 70 50 61 72 73 65 2c 20 30 2c 20 30  dex(pParse, 0, 0
d970: 2c 20 30 2c 20 70 4c 69 73 74 2c 20 70 54 61 62  , 0, pList, pTab
d980: 2d 3e 6b 65 79 43 6f 6e 66 2c 20 30 2c 20 30 2c  ->keyConf, 0, 0,
d990: 20 30 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20   0, 0);.    if( 
d9a0: 70 50 6b 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  pPk==0 ) return;
d9b0: 0a 20 20 20 20 70 50 6b 2d 3e 69 64 78 54 79 70  .    pPk->idxTyp
d9c0: 65 20 3d 20 53 51 4c 49 54 45 5f 49 44 58 54 59  e = SQLITE_IDXTY
d9d0: 50 45 5f 50 52 49 4d 41 52 59 4b 45 59 3b 0a 20  PE_PRIMARYKEY;. 
d9e0: 20 20 20 70 54 61 62 2d 3e 69 50 4b 65 79 20 3d     pTab->iPKey =
d9f0: 20 2d 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20   -1;.  }else{.  
da00: 20 20 70 50 6b 20 3d 20 73 71 6c 69 74 65 33 50    pPk = sqlite3P
da10: 72 69 6d 61 72 79 4b 65 79 49 6e 64 65 78 28 70  rimaryKeyIndex(p
da20: 54 61 62 29 3b 0a 0a 20 20 20 20 2f 2a 20 42 79  Tab);..    /* By
da30: 70 61 73 73 20 74 68 65 20 63 72 65 61 74 69 6f  pass the creatio
da40: 6e 20 6f 66 20 74 68 65 20 50 52 49 4d 41 52 59  n of the PRIMARY
da50: 20 4b 45 59 20 62 74 72 65 65 20 61 6e 64 20 74   KEY btree and t
da60: 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  he sqlite_master
da70: 0a 20 20 20 20 2a 2a 20 74 61 62 6c 65 20 65 6e  .    ** table en
da80: 74 72 79 2e 20 54 68 69 73 20 69 73 20 6f 6e 6c  try. This is onl
da90: 79 20 72 65 71 75 69 72 65 64 20 69 66 20 63 75  y required if cu
daa0: 72 72 65 6e 74 6c 79 20 67 65 6e 65 72 61 74 69  rrently generati
dab0: 6e 67 20 56 44 42 45 0a 20 20 20 20 2a 2a 20 63  ng VDBE.    ** c
dac0: 6f 64 65 20 66 6f 72 20 61 20 43 52 45 41 54 45  ode for a CREATE
dad0: 20 54 41 42 4c 45 20 28 6e 6f 74 20 77 68 65 6e   TABLE (not when
dae0: 20 70 61 72 73 69 6e 67 20 6f 6e 65 20 61 73 20   parsing one as 
daf0: 70 61 72 74 20 6f 66 20 72 65 61 64 69 6e 67 0a  part of reading.
db00: 20 20 20 20 2a 2a 20 61 20 64 61 74 61 62 61 73      ** a databas
db10: 65 20 73 63 68 65 6d 61 29 2e 20 20 2a 2f 0a 20  e schema).  */. 
db20: 20 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20     if( v ){.    
db30: 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 69 6e    assert( db->in
db40: 69 74 2e 62 75 73 79 3d 3d 30 20 29 3b 0a 20 20  it.busy==0 );.  
db50: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
db60: 68 61 6e 67 65 4f 70 63 6f 64 65 28 76 2c 20 70  hangeOpcode(v, p
db70: 50 6b 2d 3e 74 6e 75 6d 2c 20 4f 50 5f 47 6f 74  Pk->tnum, OP_Got
db80: 6f 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  o);.    }..    /
db90: 2a 0a 20 20 20 20 2a 2a 20 52 65 6d 6f 76 65 20  *.    ** Remove 
dba0: 61 6c 6c 20 72 65 64 75 6e 64 61 6e 74 20 63 6f  all redundant co
dbb0: 6c 75 6d 6e 73 20 66 72 6f 6d 20 74 68 65 20 50  lumns from the P
dbc0: 52 49 4d 41 52 59 20 4b 45 59 2e 20 20 46 6f 72  RIMARY KEY.  For
dbd0: 20 65 78 61 6d 70 6c 65 2c 20 63 68 61 6e 67 65   example, change
dbe0: 0a 20 20 20 20 2a 2a 20 22 50 52 49 4d 41 52 59  .    ** "PRIMARY
dbf0: 20 4b 45 59 28 61 2c 62 2c 61 2c 62 2c 63 2c 62   KEY(a,b,a,b,c,b
dc00: 2c 63 2c 64 29 22 20 69 6e 74 6f 20 6a 75 73 74  ,c,d)" into just
dc10: 20 22 50 52 49 4d 41 52 59 20 4b 45 59 28 61 2c   "PRIMARY KEY(a,
dc20: 62 2c 63 2c 64 29 22 2e 20 20 4c 61 74 65 72 0a  b,c,d)".  Later.
dc30: 20 20 20 20 2a 2a 20 63 6f 64 65 20 61 73 73 75      ** code assu
dc40: 6d 65 73 20 74 68 65 20 50 52 49 4d 41 52 59 20  mes the PRIMARY 
dc50: 4b 45 59 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20  KEY contains no 
dc60: 72 65 70 65 61 74 65 64 20 63 6f 6c 75 6d 6e 73  repeated columns
dc70: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72  ..    */.    for
dc80: 28 69 3d 6a 3d 31 3b 20 69 3c 70 50 6b 2d 3e 6e  (i=j=1; i<pPk->n
dc90: 4b 65 79 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  KeyCol; i++){.  
dca0: 20 20 20 20 69 66 28 20 68 61 73 43 6f 6c 75 6d      if( hasColum
dcb0: 6e 28 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 2c  n(pPk->aiColumn,
dcc0: 20 6a 2c 20 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d   j, pPk->aiColum
dcd0: 6e 5b 69 5d 29 20 29 7b 0a 20 20 20 20 20 20 20  n[i]) ){.       
dce0: 20 70 50 6b 2d 3e 6e 43 6f 6c 75 6d 6e 2d 2d 3b   pPk->nColumn--;
dcf0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
dd00: 20 20 20 20 20 20 70 50 6b 2d 3e 61 69 43 6f 6c        pPk->aiCol
dd10: 75 6d 6e 5b 6a 2b 2b 5d 20 3d 20 70 50 6b 2d 3e  umn[j++] = pPk->
dd20: 61 69 43 6f 6c 75 6d 6e 5b 69 5d 3b 0a 20 20 20  aiColumn[i];.   
dd30: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70     }.    }.    p
dd40: 50 6b 2d 3e 6e 4b 65 79 43 6f 6c 20 3d 20 6a 3b  Pk->nKeyCol = j;
dd50: 0a 20 20 7d 0a 20 20 70 50 6b 2d 3e 69 73 43 6f  .  }.  pPk->isCo
dd60: 76 65 72 69 6e 67 20 3d 20 31 3b 0a 20 20 61 73  vering = 1;.  as
dd70: 73 65 72 74 28 20 70 50 6b 21 3d 30 20 29 3b 0a  sert( pPk!=0 );.
dd80: 20 20 6e 50 6b 20 3d 20 70 50 6b 2d 3e 6e 4b 65    nPk = pPk->nKe
dd90: 79 43 6f 6c 3b 0a 0a 20 20 2f 2a 20 4d 61 6b 65  yCol;..  /* Make
dda0: 20 73 75 72 65 20 65 76 65 72 79 20 63 6f 6c 75   sure every colu
ddb0: 6d 6e 20 6f 66 20 74 68 65 20 50 52 49 4d 41 52  mn of the PRIMAR
ddc0: 59 20 4b 45 59 20 69 73 20 4e 4f 54 20 4e 55 4c  Y KEY is NOT NUL
ddd0: 4c 2e 20 20 28 45 78 63 65 70 74 2c 0a 20 20 2a  L.  (Except,.  *
dde0: 2a 20 64 6f 20 6e 6f 74 20 65 6e 66 6f 72 63 65  * do not enforce
ddf0: 20 74 68 69 73 20 66 6f 72 20 69 6d 70 6f 73 74   this for impost
de00: 65 72 20 74 61 62 6c 65 73 2e 29 20 2a 2f 0a 20  er tables.) */. 
de10: 20 69 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e 69   if( !db->init.i
de20: 6d 70 6f 73 74 65 72 54 61 62 6c 65 20 29 7b 0a  mposterTable ){.
de30: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
de40: 50 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  Pk; i++){.      
de50: 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 50 6b 2d 3e  pTab->aCol[pPk->
de60: 61 69 43 6f 6c 75 6d 6e 5b 69 5d 5d 2e 6e 6f 74  aiColumn[i]].not
de70: 4e 75 6c 6c 20 3d 20 4f 45 5f 41 62 6f 72 74 3b  Null = OE_Abort;
de80: 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 6b 2d 3e  .    }.    pPk->
de90: 75 6e 69 71 4e 6f 74 4e 75 6c 6c 20 3d 20 31 3b  uniqNotNull = 1;
dea0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 72  .  }..  /* The r
deb0: 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 68 65 20  oot page of the 
dec0: 50 52 49 4d 41 52 59 20 4b 45 59 20 69 73 20 74  PRIMARY KEY is t
ded0: 68 65 20 74 61 62 6c 65 20 72 6f 6f 74 20 70 61  he table root pa
dee0: 67 65 20 2a 2f 0a 20 20 70 50 6b 2d 3e 74 6e 75  ge */.  pPk->tnu
def0: 6d 20 3d 20 70 54 61 62 2d 3e 74 6e 75 6d 3b 0a  m = pTab->tnum;.
df00: 0a 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65  .  /* Update the
df10: 20 69 6e 2d 6d 65 6d 6f 72 79 20 72 65 70 72 65   in-memory repre
df20: 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 61 6c 6c  sentation of all
df30: 20 55 4e 49 51 55 45 20 69 6e 64 69 63 65 73 20   UNIQUE indices 
df40: 62 79 20 63 6f 6e 76 65 72 74 69 6e 67 0a 20 20  by converting.  
df50: 2a 2a 20 74 68 65 20 66 69 6e 61 6c 20 72 6f 77  ** the final row
df60: 69 64 20 63 6f 6c 75 6d 6e 20 69 6e 74 6f 20 6f  id column into o
df70: 6e 65 20 6f 72 20 6d 6f 72 65 20 63 6f 6c 75 6d  ne or more colum
df80: 6e 73 20 6f 66 20 74 68 65 20 50 52 49 4d 41 52  ns of the PRIMAR
df90: 59 20 4b 45 59 2e 0a 20 20 2a 2f 0a 20 20 66 6f  Y KEY..  */.  fo
dfa0: 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e  r(pIdx=pTab->pIn
dfb0: 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d  dex; pIdx; pIdx=
dfc0: 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  pIdx->pNext){.  
dfd0: 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 69 66 28    int n;.    if(
dfe0: 20 49 73 50 72 69 6d 61 72 79 4b 65 79 49 6e 64   IsPrimaryKeyInd
dff0: 65 78 28 70 49 64 78 29 20 29 20 63 6f 6e 74 69  ex(pIdx) ) conti
e000: 6e 75 65 3b 0a 20 20 20 20 66 6f 72 28 69 3d 6e  nue;.    for(i=n
e010: 3d 30 3b 20 69 3c 6e 50 6b 3b 20 69 2b 2b 29 7b  =0; i<nPk; i++){
e020: 0a 20 20 20 20 20 20 69 66 28 20 21 68 61 73 43  .      if( !hasC
e030: 6f 6c 75 6d 6e 28 70 49 64 78 2d 3e 61 69 43 6f  olumn(pIdx->aiCo
e040: 6c 75 6d 6e 2c 20 70 49 64 78 2d 3e 6e 4b 65 79  lumn, pIdx->nKey
e050: 43 6f 6c 2c 20 70 50 6b 2d 3e 61 69 43 6f 6c 75  Col, pPk->aiColu
e060: 6d 6e 5b 69 5d 29 20 29 20 6e 2b 2b 3b 0a 20 20  mn[i]) ) n++;.  
e070: 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 3d 3d 30    }.    if( n==0
e080: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69   ){.      /* Thi
e090: 73 20 69 6e 64 65 78 20 69 73 20 61 20 73 75 70  s index is a sup
e0a0: 65 72 73 65 74 20 6f 66 20 74 68 65 20 70 72 69  erset of the pri
e0b0: 6d 61 72 79 20 6b 65 79 20 2a 2f 0a 20 20 20 20  mary key */.    
e0c0: 20 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 20    pIdx->nColumn 
e0d0: 3d 20 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3b  = pIdx->nKeyCol;
e0e0: 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b  .      continue;
e0f0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
e100: 65 73 69 7a 65 49 6e 64 65 78 4f 62 6a 65 63 74  esizeIndexObject
e110: 28 64 62 2c 20 70 49 64 78 2c 20 70 49 64 78 2d  (db, pIdx, pIdx-
e120: 3e 6e 4b 65 79 43 6f 6c 2b 6e 29 20 29 20 72 65  >nKeyCol+n) ) re
e130: 74 75 72 6e 3b 0a 20 20 20 20 66 6f 72 28 69 3d  turn;.    for(i=
e140: 30 2c 20 6a 3d 70 49 64 78 2d 3e 6e 4b 65 79 43  0, j=pIdx->nKeyC
e150: 6f 6c 3b 20 69 3c 6e 50 6b 3b 20 69 2b 2b 29 7b  ol; i<nPk; i++){
e160: 0a 20 20 20 20 20 20 69 66 28 20 21 68 61 73 43  .      if( !hasC
e170: 6f 6c 75 6d 6e 28 70 49 64 78 2d 3e 61 69 43 6f  olumn(pIdx->aiCo
e180: 6c 75 6d 6e 2c 20 70 49 64 78 2d 3e 6e 4b 65 79  lumn, pIdx->nKey
e190: 43 6f 6c 2c 20 70 50 6b 2d 3e 61 69 43 6f 6c 75  Col, pPk->aiColu
e1a0: 6d 6e 5b 69 5d 29 20 29 7b 0a 20 20 20 20 20 20  mn[i]) ){.      
e1b0: 20 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e    pIdx->aiColumn
e1c0: 5b 6a 5d 20 3d 20 70 50 6b 2d 3e 61 69 43 6f 6c  [j] = pPk->aiCol
e1d0: 75 6d 6e 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20  umn[i];.        
e1e0: 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6a 5d 20  pIdx->azColl[j] 
e1f0: 3d 20 70 50 6b 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d  = pPk->azColl[i]
e200: 3b 0a 20 20 20 20 20 20 20 20 6a 2b 2b 3b 0a 20  ;.        j++;. 
e210: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
e220: 20 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e 6e   assert( pIdx->n
e230: 43 6f 6c 75 6d 6e 3e 3d 70 49 64 78 2d 3e 6e 4b  Column>=pIdx->nK
e240: 65 79 43 6f 6c 2b 6e 20 29 3b 0a 20 20 20 20 61  eyCol+n );.    a
e250: 73 73 65 72 74 28 20 70 49 64 78 2d 3e 6e 43 6f  ssert( pIdx->nCo
e260: 6c 75 6d 6e 3e 3d 6a 20 29 3b 0a 20 20 7d 0a 0a  lumn>=j );.  }..
e270: 20 20 2f 2a 20 41 64 64 20 61 6c 6c 20 74 61 62    /* Add all tab
e280: 6c 65 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 74 68  le columns to th
e290: 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 69 6e  e PRIMARY KEY in
e2a0: 64 65 78 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6e  dex.  */.  if( n
e2b0: 50 6b 3c 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 7b  Pk<pTab->nCol ){
e2c0: 0a 20 20 20 20 69 66 28 20 72 65 73 69 7a 65 49  .    if( resizeI
e2d0: 6e 64 65 78 4f 62 6a 65 63 74 28 64 62 2c 20 70  ndexObject(db, p
e2e0: 50 6b 2c 20 70 54 61 62 2d 3e 6e 43 6f 6c 29 20  Pk, pTab->nCol) 
e2f0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 66 6f  ) return;.    fo
e300: 72 28 69 3d 30 2c 20 6a 3d 6e 50 6b 3b 20 69 3c  r(i=0, j=nPk; i<
e310: 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29  pTab->nCol; i++)
e320: 7b 0a 20 20 20 20 20 20 69 66 28 20 21 68 61 73  {.      if( !has
e330: 43 6f 6c 75 6d 6e 28 70 50 6b 2d 3e 61 69 43 6f  Column(pPk->aiCo
e340: 6c 75 6d 6e 2c 20 6a 2c 20 69 29 20 29 7b 0a 20  lumn, j, i) ){. 
e350: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6a         assert( j
e360: 3c 70 50 6b 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 3b  <pPk->nColumn );
e370: 0a 20 20 20 20 20 20 20 20 70 50 6b 2d 3e 61 69  .        pPk->ai
e380: 43 6f 6c 75 6d 6e 5b 6a 5d 20 3d 20 69 3b 0a 20  Column[j] = i;. 
e390: 20 20 20 20 20 20 20 70 50 6b 2d 3e 61 7a 43 6f         pPk->azCo
e3a0: 6c 6c 5b 6a 5d 20 3d 20 73 71 6c 69 74 65 33 53  ll[j] = sqlite3S
e3b0: 74 72 42 49 4e 41 52 59 3b 0a 20 20 20 20 20 20  trBINARY;.      
e3c0: 20 20 6a 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20    j++;.      }. 
e3d0: 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
e3e0: 20 70 50 6b 2d 3e 6e 43 6f 6c 75 6d 6e 3d 3d 6a   pPk->nColumn==j
e3f0: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
e400: 70 54 61 62 2d 3e 6e 43 6f 6c 3d 3d 6a 20 29 3b  pTab->nCol==j );
e410: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50  .  }else{.    pP
e420: 6b 2d 3e 6e 43 6f 6c 75 6d 6e 20 3d 20 70 54 61  k->nColumn = pTa
e430: 62 2d 3e 6e 43 6f 6c 3b 0a 20 20 7d 0a 7d 0a 0a  b->nCol;.  }.}..
e440: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
e450: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20  ne is called to 
e460: 72 65 70 6f 72 74 20 74 68 65 20 66 69 6e 61 6c  report the final
e470: 20 22 29 22 20 74 68 61 74 20 74 65 72 6d 69 6e   ")" that termin
e480: 61 74 65 73 0a 2a 2a 20 61 20 43 52 45 41 54 45  ates.** a CREATE
e490: 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74   TABLE statement
e4a0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 61 62 6c  ..**.** The tabl
e4b0: 65 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74  e structure that
e4c0: 20 6f 74 68 65 72 20 61 63 74 69 6f 6e 20 72 6f   other action ro
e4d0: 75 74 69 6e 65 73 20 68 61 76 65 20 62 65 65 6e  utines have been
e4e0: 20 62 75 69 6c 64 69 6e 67 0a 2a 2a 20 69 73 20   building.** is 
e4f0: 61 64 64 65 64 20 74 6f 20 74 68 65 20 69 6e 74  added to the int
e500: 65 72 6e 61 6c 20 68 61 73 68 20 74 61 62 6c 65  ernal hash table
e510: 73 2c 20 61 73 73 75 6d 69 6e 67 20 6e 6f 20 65  s, assuming no e
e520: 72 72 6f 72 73 20 68 61 76 65 0a 2a 2a 20 6f 63  rrors have.** oc
e530: 63 75 72 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 6e  curred..**.** An
e540: 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20 74   entry for the t
e550: 61 62 6c 65 20 69 73 20 6d 61 64 65 20 69 6e 20  able is made in 
e560: 74 68 65 20 6d 61 73 74 65 72 20 74 61 62 6c 65  the master table
e570: 20 6f 6e 20 64 69 73 6b 2c 20 75 6e 6c 65 73 73   on disk, unless
e580: 0a 2a 2a 20 74 68 69 73 20 69 73 20 61 20 74 65  .** this is a te
e590: 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 6f 72  mporary table or
e5a0: 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d   db->init.busy==
e5b0: 31 2e 20 20 57 68 65 6e 20 64 62 2d 3e 69 6e 69  1.  When db->ini
e5c0: 74 2e 62 75 73 79 3d 3d 31 0a 2a 2a 20 69 74 20  t.busy==1.** it 
e5d0: 6d 65 61 6e 73 20 77 65 20 61 72 65 20 72 65 61  means we are rea
e5e0: 64 69 6e 67 20 74 68 65 20 73 71 6c 69 74 65 5f  ding the sqlite_
e5f0: 6d 61 73 74 65 72 20 74 61 62 6c 65 20 62 65 63  master table bec
e600: 61 75 73 65 20 77 65 20 6a 75 73 74 0a 2a 2a 20  ause we just.** 
e610: 63 6f 6e 6e 65 63 74 65 64 20 74 6f 20 74 68 65  connected to the
e620: 20 64 61 74 61 62 61 73 65 20 6f 72 20 62 65 63   database or bec
e630: 61 75 73 65 20 74 68 65 20 73 71 6c 69 74 65 5f  ause the sqlite_
e640: 6d 61 73 74 65 72 20 74 61 62 6c 65 20 68 61 73  master table has
e650: 0a 2a 2a 20 72 65 63 65 6e 74 6c 79 20 63 68 61  .** recently cha
e660: 6e 67 65 64 2c 20 73 6f 20 74 68 65 20 65 6e 74  nged, so the ent
e670: 72 79 20 66 6f 72 20 74 68 69 73 20 74 61 62 6c  ry for this tabl
e680: 65 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73  e already exists
e690: 20 69 6e 0a 2a 2a 20 74 68 65 20 73 71 6c 69 74   in.** the sqlit
e6a0: 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 2e 20  e_master table. 
e6b0: 20 57 65 20 64 6f 20 6e 6f 74 20 77 61 6e 74 20   We do not want 
e6c0: 74 6f 20 63 72 65 61 74 65 20 69 74 20 61 67 61  to create it aga
e6d0: 69 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  in..**.** If the
e6e0: 20 70 53 65 6c 65 63 74 20 61 72 67 75 6d 65 6e   pSelect argumen
e6f0: 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 69  t is not NULL, i
e700: 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 69  t means that thi
e710: 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 77 61 73  s routine.** was
e720: 20 63 61 6c 6c 65 64 20 74 6f 20 63 72 65 61 74   called to creat
e730: 65 20 61 20 74 61 62 6c 65 20 67 65 6e 65 72 61  e a table genera
e740: 74 65 64 20 66 72 6f 6d 20 61 20 0a 2a 2a 20 22  ted from a .** "
e750: 43 52 45 41 54 45 20 54 41 42 4c 45 20 2e 2e 2e  CREATE TABLE ...
e760: 20 41 53 20 53 45 4c 45 43 54 20 2e 2e 2e 22 20   AS SELECT ..." 
e770: 73 74 61 74 65 6d 65 6e 74 2e 20 20 54 68 65 20  statement.  The 
e780: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 6f 66 0a  column names of.
e790: 2a 2a 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65  ** the new table
e7a0: 20 77 69 6c 6c 20 6d 61 74 63 68 20 74 68 65 20   will match the 
e7b0: 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68  result set of th
e7c0: 65 20 53 45 4c 45 43 54 2e 0a 2a 2f 0a 76 6f 69  e SELECT..*/.voi
e7d0: 64 20 73 71 6c 69 74 65 33 45 6e 64 54 61 62 6c  d sqlite3EndTabl
e7e0: 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  e(.  Parse *pPar
e7f0: 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  se,          /* 
e800: 50 61 72 73 65 20 63 6f 6e 74 65 78 74 20 2a 2f  Parse context */
e810: 0a 20 20 54 6f 6b 65 6e 20 2a 70 43 6f 6e 73 2c  .  Token *pCons,
e820: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
e830: 65 20 27 2c 27 20 74 6f 6b 65 6e 20 61 66 74 65  e ',' token afte
e840: 72 20 74 68 65 20 6c 61 73 74 20 63 6f 6c 75 6d  r the last colum
e850: 6e 20 64 65 66 6e 2e 20 2a 2f 0a 20 20 54 6f 6b  n defn. */.  Tok
e860: 65 6e 20 2a 70 45 6e 64 2c 20 20 20 20 20 20 20  en *pEnd,       
e870: 20 20 20 20 20 2f 2a 20 54 68 65 20 27 29 27 20       /* The ')' 
e880: 62 65 66 6f 72 65 20 6f 70 74 69 6f 6e 73 20 69  before options i
e890: 6e 20 74 68 65 20 43 52 45 41 54 45 20 54 41 42  n the CREATE TAB
e8a0: 4c 45 20 2a 2f 0a 20 20 75 38 20 74 61 62 4f 70  LE */.  u8 tabOp
e8b0: 74 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ts,             
e8c0: 2f 2a 20 45 78 74 72 61 20 74 61 62 6c 65 20 6f  /* Extra table o
e8d0: 70 74 69 6f 6e 73 2e 20 55 73 75 61 6c 6c 79 20  ptions. Usually 
e8e0: 30 2e 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  0. */.  Select *
e8f0: 70 53 65 6c 65 63 74 20 20 20 20 20 20 20 20 20  pSelect         
e900: 2f 2a 20 53 65 6c 65 63 74 20 66 72 6f 6d 20 61  /* Select from a
e910: 20 22 43 52 45 41 54 45 20 2e 2e 2e 20 41 53 20   "CREATE ... AS 
e920: 53 45 4c 45 43 54 22 20 2a 2f 0a 29 7b 0a 20 20  SELECT" */.){.  
e930: 54 61 62 6c 65 20 2a 70 3b 20 20 20 20 20 20 20  Table *p;       
e940: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
e950: 20 6e 65 77 20 74 61 62 6c 65 20 2a 2f 0a 20 20   new table */.  
e960: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
e970: 61 72 73 65 2d 3e 64 62 3b 20 2f 2a 20 54 68 65  arse->db; /* The
e980: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
e990: 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 44  tion */.  int iD
e9a0: 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
e9b0: 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
e9c0: 69 6e 20 77 68 69 63 68 20 74 68 65 20 74 61 62  in which the tab
e9d0: 6c 65 20 6c 69 76 65 73 20 2a 2f 0a 20 20 49 6e  le lives */.  In
e9e0: 64 65 78 20 2a 70 49 64 78 3b 20 20 20 20 20 20  dex *pIdx;      
e9f0: 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 69 6d          /* An im
ea00: 70 6c 69 65 64 20 69 6e 64 65 78 20 6f 66 20 74  plied index of t
ea10: 68 65 20 74 61 62 6c 65 20 2a 2f 0a 0a 20 20 69  he table */..  i
ea20: 66 28 20 70 45 6e 64 3d 3d 30 20 26 26 20 70 53  f( pEnd==0 && pS
ea30: 65 6c 65 63 74 3d 3d 30 20 29 7b 0a 20 20 20 20  elect==0 ){.    
ea40: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 61 73  return;.  }.  as
ea50: 73 65 72 74 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f  sert( !db->mallo
ea60: 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 70 20 3d  cFailed );.  p =
ea70: 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
ea80: 6c 65 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29  le;.  if( p==0 )
ea90: 20 72 65 74 75 72 6e 3b 0a 0a 20 20 61 73 73 65   return;..  asse
eaa0: 72 74 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75  rt( !db->init.bu
eab0: 73 79 20 7c 7c 20 21 70 53 65 6c 65 63 74 20 29  sy || !pSelect )
eac0: 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 64  ;..  /* If the d
ead0: 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 69 73 20  b->init.busy is 
eae0: 31 20 69 74 20 6d 65 61 6e 73 20 77 65 20 61 72  1 it means we ar
eaf0: 65 20 72 65 61 64 69 6e 67 20 74 68 65 20 53 51  e reading the SQ
eb00: 4c 20 6f 66 66 20 74 68 65 0a 20 20 2a 2a 20 22  L off the.  ** "
eb10: 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 22 20 6f  sqlite_master" o
eb20: 72 20 22 73 71 6c 69 74 65 5f 74 65 6d 70 5f 6d  r "sqlite_temp_m
eb30: 61 73 74 65 72 22 20 74 61 62 6c 65 20 6f 6e 20  aster" table on 
eb40: 74 68 65 20 64 69 73 6b 2e 0a 20 20 2a 2a 20 53  the disk..  ** S
eb50: 6f 20 64 6f 20 6e 6f 74 20 77 72 69 74 65 20 74  o do not write t
eb60: 6f 20 74 68 65 20 64 69 73 6b 20 61 67 61 69 6e  o the disk again
eb70: 2e 20 20 45 78 74 72 61 63 74 20 74 68 65 20 72  .  Extract the r
eb80: 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62 65 72 0a  oot page number.
eb90: 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 74 61 62    ** for the tab
eba0: 6c 65 20 66 72 6f 6d 20 74 68 65 20 64 62 2d 3e  le from the db->
ebb0: 69 6e 69 74 2e 6e 65 77 54 6e 75 6d 20 66 69 65  init.newTnum fie
ebc0: 6c 64 2e 20 20 28 54 68 65 20 70 61 67 65 20 6e  ld.  (The page n
ebd0: 75 6d 62 65 72 0a 20 20 2a 2a 20 73 68 6f 75 6c  umber.  ** shoul
ebe0: 64 20 68 61 76 65 20 62 65 65 6e 20 70 75 74 20  d have been put 
ebf0: 74 68 65 72 65 20 62 79 20 74 68 65 20 73 71 6c  there by the sql
ec00: 69 74 65 4f 70 65 6e 43 62 20 72 6f 75 74 69 6e  iteOpenCb routin
ec10: 65 2e 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66  e.).  **.  ** If
ec20: 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6e   the root page n
ec30: 75 6d 62 65 72 20 69 73 20 31 2c 20 74 68 61 74  umber is 1, that
ec40: 20 6d 65 61 6e 73 20 74 68 69 73 20 69 73 20 74   means this is t
ec50: 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  he sqlite_master
ec60: 0a 20 20 2a 2a 20 74 61 62 6c 65 20 69 74 73 65  .  ** table itse
ec70: 6c 66 2e 20 20 53 6f 20 6d 61 72 6b 20 69 74 20  lf.  So mark it 
ec80: 72 65 61 64 2d 6f 6e 6c 79 2e 0a 20 20 2a 2f 0a  read-only..  */.
ec90: 20 20 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62    if( db->init.b
eca0: 75 73 79 20 29 7b 0a 20 20 20 20 70 2d 3e 74 6e  usy ){.    p->tn
ecb0: 75 6d 20 3d 20 64 62 2d 3e 69 6e 69 74 2e 6e 65  um = db->init.ne
ecc0: 77 54 6e 75 6d 3b 0a 20 20 20 20 69 66 28 20 70  wTnum;.    if( p
ecd0: 2d 3e 74 6e 75 6d 3d 3d 31 20 29 20 70 2d 3e 74  ->tnum==1 ) p->t
ece0: 61 62 46 6c 61 67 73 20 7c 3d 20 54 46 5f 52 65  abFlags |= TF_Re
ecf0: 61 64 6f 6e 6c 79 3b 0a 20 20 7d 0a 0a 20 20 2f  adonly;.  }..  /
ed00: 2a 20 53 70 65 63 69 61 6c 20 70 72 6f 63 65 73  * Special proces
ed10: 73 69 6e 67 20 66 6f 72 20 57 49 54 48 4f 55 54  sing for WITHOUT
ed20: 20 52 4f 57 49 44 20 54 61 62 6c 65 73 20 2a 2f   ROWID Tables */
ed30: 0a 20 20 69 66 28 20 74 61 62 4f 70 74 73 20 26  .  if( tabOpts &
ed40: 20 54 46 5f 57 69 74 68 6f 75 74 52 6f 77 69 64   TF_WithoutRowid
ed50: 20 29 7b 0a 20 20 20 20 69 66 28 20 28 70 2d 3e   ){.    if( (p->
ed60: 74 61 62 46 6c 61 67 73 20 26 20 54 46 5f 41 75  tabFlags & TF_Au
ed70: 74 6f 69 6e 63 72 65 6d 65 6e 74 29 20 29 7b 0a  toincrement) ){.
ed80: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
ed90: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 0a 20 20  orMsg(pParse,.  
eda0: 20 20 20 20 20 20 20 20 22 41 55 54 4f 49 4e 43          "AUTOINC
edb0: 52 45 4d 45 4e 54 20 6e 6f 74 20 61 6c 6c 6f 77  REMENT not allow
edc0: 65 64 20 6f 6e 20 57 49 54 48 4f 55 54 20 52 4f  ed on WITHOUT RO
edd0: 57 49 44 20 74 61 62 6c 65 73 22 29 3b 0a 20 20  WID tables");.  
ede0: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
edf0: 7d 0a 20 20 20 20 69 66 28 20 28 70 2d 3e 74 61  }.    if( (p->ta
ee00: 62 46 6c 61 67 73 20 26 20 54 46 5f 48 61 73 50  bFlags & TF_HasP
ee10: 72 69 6d 61 72 79 4b 65 79 29 3d 3d 30 20 29 7b  rimaryKey)==0 ){
ee20: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
ee30: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
ee40: 50 52 49 4d 41 52 59 20 4b 45 59 20 6d 69 73 73  PRIMARY KEY miss
ee50: 69 6e 67 20 6f 6e 20 74 61 62 6c 65 20 25 73 22  ing on table %s"
ee60: 2c 20 70 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  , p->zName);.   
ee70: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 2d   }else{.      p-
ee80: 3e 74 61 62 46 6c 61 67 73 20 7c 3d 20 54 46 5f  >tabFlags |= TF_
ee90: 57 69 74 68 6f 75 74 52 6f 77 69 64 20 7c 20 54  WithoutRowid | T
eea0: 46 5f 4e 6f 56 69 73 69 62 6c 65 52 6f 77 69 64  F_NoVisibleRowid
eeb0: 3b 0a 20 20 20 20 20 20 63 6f 6e 76 65 72 74 54  ;.      convertT
eec0: 6f 57 69 74 68 6f 75 74 52 6f 77 69 64 54 61 62  oWithoutRowidTab
eed0: 6c 65 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20  le(pParse, p);. 
eee0: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 44 62 20     }.  }..  iDb 
eef0: 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54  = sqlite3SchemaT
ef00: 6f 49 6e 64 65 78 28 64 62 2c 20 70 2d 3e 70 53  oIndex(db, p->pS
ef10: 63 68 65 6d 61 29 3b 0a 0a 23 69 66 6e 64 65 66  chema);..#ifndef
ef20: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 48 45   SQLITE_OMIT_CHE
ef30: 43 4b 0a 20 20 2f 2a 20 52 65 73 6f 6c 76 65 20  CK.  /* Resolve 
ef40: 6e 61 6d 65 73 20 69 6e 20 61 6c 6c 20 43 48 45  names in all CHE
ef50: 43 4b 20 63 6f 6e 73 74 72 61 69 6e 74 20 65 78  CK constraint ex
ef60: 70 72 65 73 73 69 6f 6e 73 2e 0a 20 20 2a 2f 0a  pressions..  */.
ef70: 20 20 69 66 28 20 70 2d 3e 70 43 68 65 63 6b 20    if( p->pCheck 
ef80: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65  ){.    sqlite3Re
ef90: 73 6f 6c 76 65 53 65 6c 66 52 65 66 65 72 65 6e  solveSelfReferen
efa0: 63 65 28 70 50 61 72 73 65 2c 20 70 2c 20 4e 43  ce(pParse, p, NC
efb0: 5f 49 73 43 68 65 63 6b 2c 20 30 2c 20 70 2d 3e  _IsCheck, 0, p->
efc0: 70 43 68 65 63 6b 29 3b 0a 20 20 7d 0a 23 65 6e  pCheck);.  }.#en
efd0: 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28  dif /* !defined(
efe0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 48 45 43  SQLITE_OMIT_CHEC
eff0: 4b 29 20 2a 2f 0a 0a 20 20 2f 2a 20 45 73 74 69  K) */..  /* Esti
f000: 6d 61 74 65 20 74 68 65 20 61 76 65 72 61 67 65  mate the average
f010: 20 72 6f 77 20 73 69 7a 65 20 66 6f 72 20 74 68   row size for th
f020: 65 20 74 61 62 6c 65 20 61 6e 64 20 66 6f 72 20  e table and for 
f030: 61 6c 6c 20 69 6d 70 6c 69 65 64 20 69 6e 64 69  all implied indi
f040: 63 65 73 20 2a 2f 0a 20 20 65 73 74 69 6d 61 74  ces */.  estimat
f050: 65 54 61 62 6c 65 57 69 64 74 68 28 70 29 3b 0a  eTableWidth(p);.
f060: 20 20 66 6f 72 28 70 49 64 78 3d 70 2d 3e 70 49    for(pIdx=p->pI
f070: 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78  ndex; pIdx; pIdx
f080: 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20  =pIdx->pNext){. 
f090: 20 20 20 65 73 74 69 6d 61 74 65 49 6e 64 65 78     estimateIndex
f0a0: 57 69 64 74 68 28 70 49 64 78 29 3b 0a 20 20 7d  Width(pIdx);.  }
f0b0: 0a 0a 20 20 2f 2a 20 49 66 20 6e 6f 74 20 69 6e  ..  /* If not in
f0c0: 69 74 69 61 6c 69 7a 69 6e 67 2c 20 74 68 65 6e  itializing, then
f0d0: 20 63 72 65 61 74 65 20 61 20 72 65 63 6f 72 64   create a record
f0e0: 20 66 6f 72 20 74 68 65 20 6e 65 77 20 74 61 62   for the new tab
f0f0: 6c 65 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 53  le.  ** in the S
f100: 51 4c 49 54 45 5f 4d 41 53 54 45 52 20 74 61 62  QLITE_MASTER tab
f110: 6c 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  le of the databa
f120: 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66  se..  **.  ** If
f130: 20 74 68 69 73 20 69 73 20 61 20 54 45 4d 50 4f   this is a TEMPO
f140: 52 41 52 59 20 74 61 62 6c 65 2c 20 77 72 69 74  RARY table, writ
f150: 65 20 74 68 65 20 65 6e 74 72 79 20 69 6e 74 6f  e the entry into
f160: 20 74 68 65 20 61 75 78 69 6c 69 61 72 79 0a 20   the auxiliary. 
f170: 20 2a 2a 20 66 69 6c 65 20 69 6e 73 74 65 61 64   ** file instead
f180: 20 6f 66 20 69 6e 74 6f 20 74 68 65 20 6d 61 69   of into the mai
f190: 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  n database file.
f1a0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 64 62 2d  .  */.  if( !db-
f1b0: 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20 20  >init.busy ){.  
f1c0: 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 56 64 62    int n;.    Vdb
f1d0: 65 20 2a 76 3b 0a 20 20 20 20 63 68 61 72 20 2a  e *v;.    char *
f1e0: 7a 54 79 70 65 3b 20 20 20 20 2f 2a 20 22 76 69  zType;    /* "vi
f1f0: 65 77 22 20 6f 72 20 22 74 61 62 6c 65 22 20 2a  ew" or "table" *
f200: 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 54 79 70  /.    char *zTyp
f210: 65 32 3b 20 20 20 2f 2a 20 22 56 49 45 57 22 20  e2;   /* "VIEW" 
f220: 6f 72 20 22 54 41 42 4c 45 22 20 2a 2f 0a 20 20  or "TABLE" */.  
f230: 20 20 63 68 61 72 20 2a 7a 53 74 6d 74 3b 20 20    char *zStmt;  
f240: 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 74 68 65    /* Text of the
f250: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 6f 72   CREATE TABLE or
f260: 20 43 52 45 41 54 45 20 56 49 45 57 20 73 74 61   CREATE VIEW sta
f270: 74 65 6d 65 6e 74 20 2a 2f 0a 0a 20 20 20 20 76  tement */..    v
f280: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
f290: 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 69  e(pParse);.    i
f2a0: 66 28 20 4e 45 56 45 52 28 76 3d 3d 30 29 20 29  f( NEVER(v==0) )
f2b0: 20 72 65 74 75 72 6e 3b 0a 0a 20 20 20 20 73 71   return;..    sq
f2c0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
f2d0: 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 30 29 3b  v, OP_Close, 0);
f2e0: 0a 0a 20 20 20 20 2f 2a 20 0a 20 20 20 20 2a 2a  ..    /* .    **
f2f0: 20 49 6e 69 74 69 61 6c 69 7a 65 20 7a 54 79 70   Initialize zTyp
f300: 65 20 66 6f 72 20 74 68 65 20 6e 65 77 20 76 69  e for the new vi
f310: 65 77 20 6f 72 20 74 61 62 6c 65 2e 0a 20 20 20  ew or table..   
f320: 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 70   */.    if( p->p
f330: 53 65 6c 65 63 74 3d 3d 30 20 29 7b 0a 20 20 20  Select==0 ){.   
f340: 20 20 20 2f 2a 20 41 20 72 65 67 75 6c 61 72 20     /* A regular 
f350: 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 7a  table */.      z
f360: 54 79 70 65 20 3d 20 22 74 61 62 6c 65 22 3b 0a  Type = "table";.
f370: 20 20 20 20 20 20 7a 54 79 70 65 32 20 3d 20 22        zType2 = "
f380: 54 41 42 4c 45 22 3b 0a 23 69 66 6e 64 65 66 20  TABLE";.#ifndef 
f390: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57  SQLITE_OMIT_VIEW
f3a0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
f3b0: 20 20 2f 2a 20 41 20 76 69 65 77 20 2a 2f 0a 20    /* A view */. 
f3c0: 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22 76 69       zType = "vi
f3d0: 65 77 22 3b 0a 20 20 20 20 20 20 7a 54 79 70 65  ew";.      zType
f3e0: 32 20 3d 20 22 56 49 45 57 22 3b 0a 23 65 6e 64  2 = "VIEW";.#end
f3f0: 69 66 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  if.    }..    /*
f400: 20 49 66 20 74 68 69 73 20 69 73 20 61 20 43 52   If this is a CR
f410: 45 41 54 45 20 54 41 42 4c 45 20 78 78 20 41 53  EATE TABLE xx AS
f420: 20 53 45 4c 45 43 54 20 2e 2e 2e 2c 20 65 78 65   SELECT ..., exe
f430: 63 75 74 65 20 74 68 65 20 53 45 4c 45 43 54 0a  cute the SELECT.
f440: 20 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74      ** statement
f450: 20 74 6f 20 70 6f 70 75 6c 61 74 65 20 74 68 65   to populate the
f460: 20 6e 65 77 20 74 61 62 6c 65 2e 20 54 68 65 20   new table. The 
f470: 72 6f 6f 74 2d 70 61 67 65 20 6e 75 6d 62 65 72  root-page number
f480: 20 66 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a 20   for the.    ** 
f490: 6e 65 77 20 74 61 62 6c 65 20 69 73 20 69 6e 20  new table is in 
f4a0: 72 65 67 69 73 74 65 72 20 70 50 61 72 73 65 2d  register pParse-
f4b0: 3e 72 65 67 52 6f 6f 74 2e 0a 20 20 20 20 2a 2a  >regRoot..    **
f4c0: 0a 20 20 20 20 2a 2a 20 4f 6e 63 65 20 74 68 65  .    ** Once the
f4d0: 20 53 45 4c 45 43 54 20 68 61 73 20 62 65 65 6e   SELECT has been
f4e0: 20 63 6f 64 65 64 20 62 79 20 73 71 6c 69 74 65   coded by sqlite
f4f0: 33 53 65 6c 65 63 74 28 29 2c 20 69 74 20 69 73  3Select(), it is
f500: 20 69 6e 20 61 0a 20 20 20 20 2a 2a 20 73 75 69   in a.    ** sui
f510: 74 61 62 6c 65 20 73 74 61 74 65 20 74 6f 20 71  table state to q
f520: 75 65 72 79 20 66 6f 72 20 74 68 65 20 63 6f 6c  uery for the col
f530: 75 6d 6e 20 6e 61 6d 65 73 20 61 6e 64 20 74 79  umn names and ty
f540: 70 65 73 20 74 6f 20 62 65 20 75 73 65 64 0a 20  pes to be used. 
f550: 20 20 20 2a 2a 20 62 79 20 74 68 65 20 6e 65 77     ** by the new
f560: 20 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20   table..    **. 
f570: 20 20 20 2a 2a 20 41 20 73 68 61 72 65 64 2d 63     ** A shared-c
f580: 61 63 68 65 20 77 72 69 74 65 2d 6c 6f 63 6b 20  ache write-lock 
f590: 69 73 20 6e 6f 74 20 72 65 71 75 69 72 65 64 20  is not required 
f5a0: 74 6f 20 77 72 69 74 65 20 74 6f 20 74 68 65 20  to write to the 
f5b0: 6e 65 77 20 74 61 62 6c 65 2c 0a 20 20 20 20 2a  new table,.    *
f5c0: 2a 20 61 73 20 61 20 73 63 68 65 6d 61 2d 6c 6f  * as a schema-lo
f5d0: 63 6b 20 6d 75 73 74 20 68 61 76 65 20 61 6c 72  ck must have alr
f5e0: 65 61 64 79 20 62 65 65 6e 20 6f 62 74 61 69 6e  eady been obtain
f5f0: 65 64 20 74 6f 20 63 72 65 61 74 65 20 69 74 2e  ed to create it.
f600: 20 53 69 6e 63 65 0a 20 20 20 20 2a 2a 20 61 20   Since.    ** a 
f610: 73 63 68 65 6d 61 2d 6c 6f 63 6b 20 65 78 63 6c  schema-lock excl
f620: 75 64 65 73 20 61 6c 6c 20 6f 74 68 65 72 20 64  udes all other d
f630: 61 74 61 62 61 73 65 20 75 73 65 72 73 2c 20 74  atabase users, t
f640: 68 65 20 77 72 69 74 65 2d 6c 6f 63 6b 20 77 6f  he write-lock wo
f650: 75 6c 64 0a 20 20 20 20 2a 2a 20 62 65 20 72 65  uld.    ** be re
f660: 64 75 6e 64 61 6e 74 2e 0a 20 20 20 20 2a 2f 0a  dundant..    */.
f670: 20 20 20 20 69 66 28 20 70 53 65 6c 65 63 74 20      if( pSelect 
f680: 29 7b 0a 20 20 20 20 20 20 53 65 6c 65 63 74 44  ){.      SelectD
f690: 65 73 74 20 64 65 73 74 3b 20 20 20 20 2f 2a 20  est dest;    /* 
f6a0: 57 68 65 72 65 20 74 68 65 20 53 45 4c 45 43 54  Where the SELECT
f6b0: 20 73 68 6f 75 6c 64 20 73 74 6f 72 65 20 72 65   should store re
f6c0: 73 75 6c 74 73 20 2a 2f 0a 20 20 20 20 20 20 69  sults */.      i
f6d0: 6e 74 20 72 65 67 59 69 65 6c 64 3b 20 20 20 20  nt regYield;    
f6e0: 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 68     /* Register h
f6f0: 6f 6c 64 69 6e 67 20 63 6f 2d 72 6f 75 74 69 6e  olding co-routin
f700: 65 20 65 6e 74 72 79 2d 70 6f 69 6e 74 20 2a 2f  e entry-point */
f710: 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 54  .      int addrT
f720: 6f 70 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 6f  op;        /* To
f730: 70 20 6f 66 20 74 68 65 20 63 6f 2d 72 6f 75 74  p of the co-rout
f740: 69 6e 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  ine */.      int
f750: 20 72 65 67 52 65 63 3b 20 20 20 20 20 20 20 20   regRec;        
f760: 20 2f 2a 20 41 20 72 65 63 6f 72 64 20 74 6f 20   /* A record to 
f770: 62 65 20 69 6e 73 65 72 74 20 69 6e 74 6f 20 74  be insert into t
f780: 68 65 20 6e 65 77 20 74 61 62 6c 65 20 2a 2f 0a  he new table */.
f790: 20 20 20 20 20 20 69 6e 74 20 72 65 67 52 6f 77        int regRow
f7a0: 69 64 3b 20 20 20 20 20 20 20 2f 2a 20 52 6f 77  id;       /* Row
f7b0: 69 64 20 6f 66 20 74 68 65 20 6e 65 78 74 20 72  id of the next r
f7c0: 6f 77 20 74 6f 20 69 6e 73 65 72 74 20 2a 2f 0a  ow to insert */.
f7d0: 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 49 6e        int addrIn
f7e0: 73 4c 6f 6f 70 3b 20 20 20 20 2f 2a 20 54 6f 70  sLoop;    /* Top
f7f0: 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 66 6f 72   of the loop for
f800: 20 69 6e 73 65 72 74 69 6e 67 20 72 6f 77 73 20   inserting rows 
f810: 2a 2f 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a  */.      Table *
f820: 70 53 65 6c 54 61 62 3b 20 20 20 20 20 2f 2a 20  pSelTab;     /* 
f830: 41 20 74 61 62 6c 65 20 74 68 61 74 20 64 65 73  A table that des
f840: 63 72 69 62 65 73 20 74 68 65 20 53 45 4c 45 43  cribes the SELEC
f850: 54 20 72 65 73 75 6c 74 73 20 2a 2f 0a 0a 20 20  T results */..  
f860: 20 20 20 20 72 65 67 59 69 65 6c 64 20 3d 20 2b      regYield = +
f870: 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
f880: 20 20 20 20 20 72 65 67 52 65 63 20 3d 20 2b 2b       regRec = ++
f890: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
f8a0: 20 20 20 20 72 65 67 52 6f 77 69 64 20 3d 20 2b      regRowid = +
f8b0: 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
f8c0: 20 20 20 20 20 61 73 73 65 72 74 28 70 50 61 72       assert(pPar
f8d0: 73 65 2d 3e 6e 54 61 62 3d 3d 31 29 3b 0a 20 20  se->nTab==1);.  
f8e0: 20 20 20 20 73 71 6c 69 74 65 33 4d 61 79 41 62      sqlite3MayAb
f8f0: 6f 72 74 28 70 50 61 72 73 65 29 3b 0a 20 20 20  ort(pParse);.   
f900: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
f910: 64 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 57  dOp3(v, OP_OpenW
f920: 72 69 74 65 2c 20 31 2c 20 70 50 61 72 73 65 2d  rite, 1, pParse-
f930: 3e 72 65 67 52 6f 6f 74 2c 20 69 44 62 29 3b 0a  >regRoot, iDb);.
f940: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
f950: 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46  eChangeP5(v, OPF
f960: 4c 41 47 5f 50 32 49 53 52 45 47 29 3b 0a 20 20  LAG_P2ISREG);.  
f970: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 54 61 62      pParse->nTab
f980: 20 3d 20 32 3b 0a 20 20 20 20 20 20 61 64 64 72   = 2;.      addr
f990: 54 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62  Top = sqlite3Vdb
f9a0: 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 20  eCurrentAddr(v) 
f9b0: 2b 20 31 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  + 1;.      sqlit
f9c0: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
f9d0: 4f 50 5f 49 6e 69 74 43 6f 72 6f 75 74 69 6e 65  OP_InitCoroutine
f9e0: 2c 20 72 65 67 59 69 65 6c 64 2c 20 30 2c 20 61  , regYield, 0, a
f9f0: 64 64 72 54 6f 70 29 3b 0a 20 20 20 20 20 20 73  ddrTop);.      s
fa00: 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73 74  qlite3SelectDest
fa10: 49 6e 69 74 28 26 64 65 73 74 2c 20 53 52 54 5f  Init(&dest, SRT_
fa20: 43 6f 72 6f 75 74 69 6e 65 2c 20 72 65 67 59 69  Coroutine, regYi
fa30: 65 6c 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  eld);.      sqli
fa40: 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65  te3Select(pParse
fa50: 2c 20 70 53 65 6c 65 63 74 2c 20 26 64 65 73 74  , pSelect, &dest
fa60: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
fa70: 56 64 62 65 45 6e 64 43 6f 72 6f 75 74 69 6e 65  VdbeEndCoroutine
fa80: 28 76 2c 20 72 65 67 59 69 65 6c 64 29 3b 0a 20  (v, regYield);. 
fa90: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
faa0: 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
fab0: 54 6f 70 20 2d 20 31 29 3b 0a 20 20 20 20 20 20  Top - 1);.      
fac0: 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  if( pParse->nErr
fad0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20   ) return;.     
fae0: 20 70 53 65 6c 54 61 62 20 3d 20 73 71 6c 69 74   pSelTab = sqlit
faf0: 65 33 52 65 73 75 6c 74 53 65 74 4f 66 53 65 6c  e3ResultSetOfSel
fb00: 65 63 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c  ect(pParse, pSel
fb10: 65 63 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ect);.      if( 
fb20: 70 53 65 6c 54 61 62 3d 3d 30 20 29 20 72 65 74  pSelTab==0 ) ret
fb30: 75 72 6e 3b 0a 20 20 20 20 20 20 61 73 73 65 72  urn;.      asser
fb40: 74 28 20 70 2d 3e 61 43 6f 6c 3d 3d 30 20 29 3b  t( p->aCol==0 );
fb50: 0a 20 20 20 20 20 20 70 2d 3e 6e 43 6f 6c 20 3d  .      p->nCol =
fb60: 20 70 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c 3b 0a   pSelTab->nCol;.
fb70: 20 20 20 20 20 20 70 2d 3e 61 43 6f 6c 20 3d 20        p->aCol = 
fb80: 70 53 65 6c 54 61 62 2d 3e 61 43 6f 6c 3b 0a 20  pSelTab->aCol;. 
fb90: 20 20 20 20 20 70 53 65 6c 54 61 62 2d 3e 6e 43       pSelTab->nC
fba0: 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 53  ol = 0;.      pS
fbb0: 65 6c 54 61 62 2d 3e 61 43 6f 6c 20 3d 20 30 3b  elTab->aCol = 0;
fbc0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65  .      sqlite3De
fbd0: 6c 65 74 65 54 61 62 6c 65 28 64 62 2c 20 70 53  leteTable(db, pS
fbe0: 65 6c 54 61 62 29 3b 0a 20 20 20 20 20 20 61 64  elTab);.      ad
fbf0: 64 72 49 6e 73 4c 6f 6f 70 20 3d 20 73 71 6c 69  drInsLoop = sqli
fc00: 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
fc10: 20 4f 50 5f 59 69 65 6c 64 2c 20 64 65 73 74 2e   OP_Yield, dest.
fc20: 69 53 44 50 61 72 6d 29 3b 0a 20 20 20 20 20 20  iSDParm);.      
fc30: 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
fc40: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
fc50: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d  beAddOp3(v, OP_M
fc60: 61 6b 65 52 65 63 6f 72 64 2c 20 64 65 73 74 2e  akeRecord, dest.
fc70: 69 53 64 73 74 2c 20 64 65 73 74 2e 6e 53 64 73  iSdst, dest.nSds
fc80: 74 2c 20 72 65 67 52 65 63 29 3b 0a 20 20 20 20  t, regRec);.    
fc90: 20 20 73 71 6c 69 74 65 33 54 61 62 6c 65 41 66    sqlite3TableAf
fca0: 66 69 6e 69 74 79 28 76 2c 20 70 2c 20 30 29 3b  finity(v, p, 0);
fcb0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
fcc0: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
fcd0: 65 77 52 6f 77 69 64 2c 20 31 2c 20 72 65 67 52  ewRowid, 1, regR
fce0: 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 73 71 6c  owid);.      sql
fcf0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
fd00: 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20 31 2c 20  , OP_Insert, 1, 
fd10: 72 65 67 52 65 63 2c 20 72 65 67 52 6f 77 69 64  regRec, regRowid
fd20: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
fd30: 56 64 62 65 47 6f 74 6f 28 76 2c 20 61 64 64 72  VdbeGoto(v, addr
fd40: 49 6e 73 4c 6f 6f 70 29 3b 0a 20 20 20 20 20 20  InsLoop);.      
fd50: 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
fd60: 65 72 65 28 76 2c 20 61 64 64 72 49 6e 73 4c 6f  ere(v, addrInsLo
fd70: 6f 70 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  op);.      sqlit
fd80: 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
fd90: 4f 50 5f 43 6c 6f 73 65 2c 20 31 29 3b 0a 20 20  OP_Close, 1);.  
fda0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d 70    }..    /* Comp
fdb0: 75 74 65 20 74 68 65 20 63 6f 6d 70 6c 65 74 65  ute the complete
fdc0: 20 74 65 78 74 20 6f 66 20 74 68 65 20 43 52 45   text of the CRE
fdd0: 41 54 45 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  ATE statement */
fde0: 0a 20 20 20 20 69 66 28 20 70 53 65 6c 65 63 74  .    if( pSelect
fdf0: 20 29 7b 0a 20 20 20 20 20 20 7a 53 74 6d 74 20   ){.      zStmt 
fe00: 3d 20 63 72 65 61 74 65 54 61 62 6c 65 53 74 6d  = createTableStm
fe10: 74 28 64 62 2c 20 70 29 3b 0a 20 20 20 20 7d 65  t(db, p);.    }e
fe20: 6c 73 65 7b 0a 20 20 20 20 20 20 54 6f 6b 65 6e  lse{.      Token
fe30: 20 2a 70 45 6e 64 32 20 3d 20 74 61 62 4f 70 74   *pEnd2 = tabOpt
fe40: 73 20 3f 20 26 70 50 61 72 73 65 2d 3e 73 4c 61  s ? &pParse->sLa
fe50: 73 74 54 6f 6b 65 6e 20 3a 20 70 45 6e 64 3b 0a  stToken : pEnd;.
fe60: 20 20 20 20 20 20 6e 20 3d 20 28 69 6e 74 29 28        n = (int)(
fe70: 70 45 6e 64 32 2d 3e 7a 20 2d 20 70 50 61 72 73  pEnd2->z - pPars
fe80: 65 2d 3e 73 4e 61 6d 65 54 6f 6b 65 6e 2e 7a 29  e->sNameToken.z)
fe90: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45 6e 64  ;.      if( pEnd
fea0: 32 2d 3e 7a 5b 30 5d 21 3d 27 3b 27 20 29 20 6e  2->z[0]!=';' ) n
feb0: 20 2b 3d 20 70 45 6e 64 32 2d 3e 6e 3b 0a 20 20   += pEnd2->n;.  
fec0: 20 20 20 20 7a 53 74 6d 74 20 3d 20 73 71 6c 69      zStmt = sqli
fed0: 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 0a  te3MPrintf(db, .
fee0: 20 20 20 20 20 20 20 20 20 20 22 43 52 45 41 54            "CREAT
fef0: 45 20 25 73 20 25 2e 2a 73 22 2c 20 7a 54 79 70  E %s %.*s", zTyp
ff00: 65 32 2c 20 6e 2c 20 70 50 61 72 73 65 2d 3e 73  e2, n, pParse->s
ff10: 4e 61 6d 65 54 6f 6b 65 6e 2e 7a 0a 20 20 20 20  NameToken.z.    
ff20: 20 20 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20    );.    }..    
ff30: 2f 2a 20 41 20 73 6c 6f 74 20 66 6f 72 20 74 68  /* A slot for th
ff40: 65 20 72 65 63 6f 72 64 20 68 61 73 20 61 6c 72  e record has alr
ff50: 65 61 64 79 20 62 65 65 6e 20 61 6c 6c 6f 63 61  eady been alloca
ff60: 74 65 64 20 69 6e 20 74 68 65 20 0a 20 20 20 20  ted in the .    
ff70: 2a 2a 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52  ** SQLITE_MASTER
ff80: 20 74 61 62 6c 65 2e 20 20 57 65 20 6a 75 73 74   table.  We just
ff90: 20 6e 65 65 64 20 74 6f 20 75 70 64 61 74 65 20   need to update 
ffa0: 74 68 61 74 20 73 6c 6f 74 20 77 69 74 68 20 61  that slot with a
ffb0: 6c 6c 0a 20 20 20 20 2a 2a 20 74 68 65 20 69 6e  ll.    ** the in
ffc0: 66 6f 72 6d 61 74 69 6f 6e 20 77 65 27 76 65 20  formation we've 
ffd0: 63 6f 6c 6c 65 63 74 65 64 2e 0a 20 20 20 20 2a  collected..    *
ffe0: 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 4e 65 73  /.    sqlite3Nes
fff0: 74 65 64 50 61 72 73 65 28 70 50 61 72 73 65 2c  tedParse(pParse,
10000 0a 20 20 20 20 20 20 22 55 50 44 41 54 45 20 25  .      "UPDATE %
10010 51 2e 25 73 20 22 0a 20 20 20 20 20 20 20 20 20  Q.%s ".         
10020 22 53 45 54 20 74 79 70 65 3d 27 25 73 27 2c 20  "SET type='%s', 
10030 6e 61 6d 65 3d 25 51 2c 20 74 62 6c 5f 6e 61 6d  name=%Q, tbl_nam
10040 65 3d 25 51 2c 20 72 6f 6f 74 70 61 67 65 3d 23  e=%Q, rootpage=#
10050 25 64 2c 20 73 71 6c 3d 25 51 20 22 0a 20 20 20  %d, sql=%Q ".   
10060 20 20 20 20 22 57 48 45 52 45 20 72 6f 77 69 64      "WHERE rowid
10070 3d 23 25 64 22 2c 0a 20 20 20 20 20 20 64 62 2d  =#%d",.      db-
10080 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 2c  >aDb[iDb].zName,
10090 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 44   SCHEMA_TABLE(iD
100a0 62 29 2c 0a 20 20 20 20 20 20 7a 54 79 70 65 2c  b),.      zType,
100b0 0a 20 20 20 20 20 20 70 2d 3e 7a 4e 61 6d 65 2c  .      p->zName,
100c0 0a 20 20 20 20 20 20 70 2d 3e 7a 4e 61 6d 65 2c  .      p->zName,
100d0 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 72  .      pParse->r
100e0 65 67 52 6f 6f 74 2c 0a 20 20 20 20 20 20 7a 53  egRoot,.      zS
100f0 74 6d 74 2c 0a 20 20 20 20 20 20 70 50 61 72 73  tmt,.      pPars
10100 65 2d 3e 72 65 67 52 6f 77 69 64 0a 20 20 20 20  e->regRowid.    
10110 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  );.    sqlite3Db
10120 46 72 65 65 28 64 62 2c 20 7a 53 74 6d 74 29 3b  Free(db, zStmt);
10130 0a 20 20 20 20 73 71 6c 69 74 65 33 43 68 61 6e  .    sqlite3Chan
10140 67 65 43 6f 6f 6b 69 65 28 70 50 61 72 73 65 2c  geCookie(pParse,
10150 20 69 44 62 29 3b 0a 0a 23 69 66 6e 64 65 66 20   iDb);..#ifndef 
10160 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
10170 49 4e 43 52 45 4d 45 4e 54 0a 20 20 20 20 2f 2a  INCREMENT.    /*
10180 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   Check to see if
10190 20 77 65 20 6e 65 65 64 20 74 6f 20 63 72 65 61   we need to crea
101a0 74 65 20 61 6e 20 73 71 6c 69 74 65 5f 73 65 71  te an sqlite_seq
101b0 75 65 6e 63 65 20 74 61 62 6c 65 20 66 6f 72 0a  uence table for.
101c0 20 20 20 20 2a 2a 20 6b 65 65 70 69 6e 67 20 74      ** keeping t
101d0 72 61 63 6b 20 6f 66 20 61 75 74 6f 69 6e 63 72  rack of autoincr
101e0 65 6d 65 6e 74 20 6b 65 79 73 2e 0a 20 20 20 20  ement keys..    
101f0 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 74 61  */.    if( p->ta
10200 62 46 6c 61 67 73 20 26 20 54 46 5f 41 75 74 6f  bFlags & TF_Auto
10210 69 6e 63 72 65 6d 65 6e 74 20 29 7b 0a 20 20 20  increment ){.   
10220 20 20 20 44 62 20 2a 70 44 62 20 3d 20 26 64 62     Db *pDb = &db
10230 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a 20 20 20 20  ->aDb[iDb];.    
10240 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
10250 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64  3SchemaMutexHeld
10260 28 64 62 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a  (db, iDb, 0) );.
10270 20 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e 70        if( pDb->p
10280 53 63 68 65 6d 61 2d 3e 70 53 65 71 54 61 62 3d  Schema->pSeqTab=
10290 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  =0 ){.        sq
102a0 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72 73 65  lite3NestedParse
102b0 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20  (pParse,.       
102c0 20 20 20 22 43 52 45 41 54 45 20 54 41 42 4c 45     "CREATE TABLE
102d0 20 25 51 2e 73 71 6c 69 74 65 5f 73 65 71 75 65   %Q.sqlite_seque
102e0 6e 63 65 28 6e 61 6d 65 2c 73 65 71 29 22 2c 0a  nce(name,seq)",.
102f0 20 20 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a            pDb->z
10300 4e 61 6d 65 0a 20 20 20 20 20 20 20 20 29 3b 0a  Name.        );.
10310 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65        }.    }.#e
10320 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 52 65 70  ndif..    /* Rep
10330 61 72 73 65 20 65 76 65 72 79 74 68 69 6e 67 20  arse everything 
10340 74 6f 20 75 70 64 61 74 65 20 6f 75 72 20 69 6e  to update our in
10350 74 65 72 6e 61 6c 20 64 61 74 61 20 73 74 72 75  ternal data stru
10360 63 74 75 72 65 73 20 2a 2f 0a 20 20 20 20 73 71  ctures */.    sq
10370 6c 69 74 65 33 56 64 62 65 41 64 64 50 61 72 73  lite3VdbeAddPars
10380 65 53 63 68 65 6d 61 4f 70 28 76 2c 20 69 44 62  eSchemaOp(v, iDb
10390 2c 0a 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  ,.           sql
103a0 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20  ite3MPrintf(db, 
103b0 22 74 62 6c 5f 6e 61 6d 65 3d 27 25 71 27 20 41  "tbl_name='%q' A
103c0 4e 44 20 74 79 70 65 21 3d 27 74 72 69 67 67 65  ND type!='trigge
103d0 72 27 22 2c 20 70 2d 3e 7a 4e 61 6d 65 29 29 3b  r'", p->zName));
103e0 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20 41 64 64 20  .  }...  /* Add 
103f0 74 68 65 20 74 61 62 6c 65 20 74 6f 20 74 68 65  the table to the
10400 20 69 6e 2d 6d 65 6d 6f 72 79 20 72 65 70 72 65   in-memory repre
10410 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65  sentation of the
10420 20 64 61 74 61 62 61 73 65 2e 0a 20 20 2a 2f 0a   database..  */.
10430 20 20 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62    if( db->init.b
10440 75 73 79 20 29 7b 0a 20 20 20 20 54 61 62 6c 65  usy ){.    Table
10450 20 2a 70 4f 6c 64 3b 0a 20 20 20 20 53 63 68 65   *pOld;.    Sche
10460 6d 61 20 2a 70 53 63 68 65 6d 61 20 3d 20 70 2d  ma *pSchema = p-
10470 3e 70 53 63 68 65 6d 61 3b 0a 20 20 20 20 61 73  >pSchema;.    as
10480 73 65 72 74 28 20 73 71 6c 69 74 65 33 53 63 68  sert( sqlite3Sch
10490 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c  emaMutexHeld(db,
104a0 20 69 44 62 2c 20 30 29 20 29 3b 0a 20 20 20 20   iDb, 0) );.    
104b0 70 4f 6c 64 20 3d 20 73 71 6c 69 74 65 33 48 61  pOld = sqlite3Ha
104c0 73 68 49 6e 73 65 72 74 28 26 70 53 63 68 65 6d  shInsert(&pSchem
104d0 61 2d 3e 74 62 6c 48 61 73 68 2c 20 70 2d 3e 7a  a->tblHash, p->z
104e0 4e 61 6d 65 2c 20 70 29 3b 0a 20 20 20 20 69 66  Name, p);.    if
104f0 28 20 70 4f 6c 64 20 29 7b 0a 20 20 20 20 20 20  ( pOld ){.      
10500 61 73 73 65 72 74 28 20 70 3d 3d 70 4f 6c 64 20  assert( p==pOld 
10510 29 3b 20 20 2f 2a 20 4d 61 6c 6c 6f 63 20 6d 75  );  /* Malloc mu
10520 73 74 20 68 61 76 65 20 66 61 69 6c 65 64 20 69  st have failed i
10530 6e 73 69 64 65 20 48 61 73 68 49 6e 73 65 72 74  nside HashInsert
10540 28 29 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69  () */.      sqli
10550 74 65 33 4f 6f 6d 46 61 75 6c 74 28 64 62 29 3b  te3OomFault(db);
10560 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  .      return;. 
10570 20 20 20 7d 0a 20 20 20 20 70 50 61 72 73 65 2d     }.    pParse-
10580 3e 70 4e 65 77 54 61 62 6c 65 20 3d 20 30 3b 0a  >pNewTable = 0;.
10590 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d      db->flags |=
105a0 20 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68   SQLITE_InternCh
105b0 61 6e 67 65 73 3b 0a 0a 23 69 66 6e 64 65 66 20  anges;..#ifndef 
105c0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 4c 54 45  SQLITE_OMIT_ALTE
105d0 52 54 41 42 4c 45 0a 20 20 20 20 69 66 28 20 21  RTABLE.    if( !
105e0 70 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20  p->pSelect ){.  
105f0 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
10600 7a 4e 61 6d 65 20 3d 20 28 63 6f 6e 73 74 20 63  zName = (const c
10610 68 61 72 20 2a 29 70 50 61 72 73 65 2d 3e 73 4e  har *)pParse->sN
10620 61 6d 65 54 6f 6b 65 6e 2e 7a 3b 0a 20 20 20 20  ameToken.z;.    
10630 20 20 69 6e 74 20 6e 4e 61 6d 65 3b 0a 20 20 20    int nName;.   
10640 20 20 20 61 73 73 65 72 74 28 20 21 70 53 65 6c     assert( !pSel
10650 65 63 74 20 26 26 20 70 43 6f 6e 73 20 26 26 20  ect && pCons && 
10660 70 45 6e 64 20 29 3b 0a 20 20 20 20 20 20 69 66  pEnd );.      if
10670 28 20 70 43 6f 6e 73 2d 3e 7a 3d 3d 30 20 29 7b  ( pCons->z==0 ){
10680 0a 20 20 20 20 20 20 20 20 70 43 6f 6e 73 20 3d  .        pCons =
10690 20 70 45 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20   pEnd;.      }. 
106a0 20 20 20 20 20 6e 4e 61 6d 65 20 3d 20 28 69 6e       nName = (in
106b0 74 29 28 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  t)((const char *
106c0 29 70 43 6f 6e 73 2d 3e 7a 20 2d 20 7a 4e 61 6d  )pCons->z - zNam
106d0 65 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61 64 64  e);.      p->add
106e0 43 6f 6c 4f 66 66 73 65 74 20 3d 20 31 33 20 2b  ColOffset = 13 +
106f0 20 73 71 6c 69 74 65 33 55 74 66 38 43 68 61 72   sqlite3Utf8Char
10700 4c 65 6e 28 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65  Len(zName, nName
10710 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  );.    }.#endif.
10720 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53    }.}..#ifndef S
10730 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a  QLITE_OMIT_VIEW.
10740 2f 2a 0a 2a 2a 20 54 68 65 20 70 61 72 73 65 72  /*.** The parser
10750 20 63 61 6c 6c 73 20 74 68 69 73 20 72 6f 75 74   calls this rout
10760 69 6e 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  ine in order to 
10770 63 72 65 61 74 65 20 61 20 6e 65 77 20 56 49 45  create a new VIE
10780 57 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  W.*/.void sqlite
10790 33 43 72 65 61 74 65 56 69 65 77 28 0a 20 20 50  3CreateView(.  P
107a0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
107b0 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67    /* The parsing
107c0 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 6f   context */.  To
107d0 6b 65 6e 20 2a 70 42 65 67 69 6e 2c 20 20 20 20  ken *pBegin,    
107e0 20 2f 2a 20 54 68 65 20 43 52 45 41 54 45 20 74   /* The CREATE t
107f0 6f 6b 65 6e 20 74 68 61 74 20 62 65 67 69 6e 73  oken that begins
10800 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 2a   the statement *
10810 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65  /.  Token *pName
10820 31 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 74 6f  1,     /* The to
10830 6b 65 6e 20 74 68 61 74 20 68 6f 6c 64 73 20 74  ken that holds t
10840 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 76  he name of the v
10850 69 65 77 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  iew */.  Token *
10860 70 4e 61 6d 65 32 2c 20 20 20 20 20 2f 2a 20 54  pName2,     /* T
10870 68 65 20 74 6f 6b 65 6e 20 74 68 61 74 20 68 6f  he token that ho
10880 6c 64 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  lds the name of 
10890 74 68 65 20 76 69 65 77 20 2a 2f 0a 20 20 45 78  the view */.  Ex
108a0 70 72 4c 69 73 74 20 2a 70 43 4e 61 6d 65 73 2c  prList *pCNames,
108b0 20 2f 2a 20 4f 70 74 69 6f 6e 61 6c 20 6c 69 73   /* Optional lis
108c0 74 20 6f 66 20 76 69 65 77 20 63 6f 6c 75 6d 6e  t of view column
108d0 20 6e 61 6d 65 73 20 2a 2f 0a 20 20 53 65 6c 65   names */.  Sele
108e0 63 74 20 2a 70 53 65 6c 65 63 74 2c 20 20 20 2f  ct *pSelect,   /
108f0 2a 20 41 20 53 45 4c 45 43 54 20 73 74 61 74 65  * A SELECT state
10900 6d 65 6e 74 20 74 68 61 74 20 77 69 6c 6c 20 62  ment that will b
10910 65 63 6f 6d 65 20 74 68 65 20 6e 65 77 20 76 69  ecome the new vi
10920 65 77 20 2a 2f 0a 20 20 69 6e 74 20 69 73 54 65  ew */.  int isTe
10930 6d 70 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 52  mp,        /* TR
10940 55 45 20 66 6f 72 20 61 20 54 45 4d 50 4f 52 41  UE for a TEMPORA
10950 52 59 20 76 69 65 77 20 2a 2f 0a 20 20 69 6e 74  RY view */.  int
10960 20 6e 6f 45 72 72 20 20 20 20 20 20 20 20 20 20   noErr          
10970 2f 2a 20 53 75 70 70 72 65 73 73 20 65 72 72 6f  /* Suppress erro
10980 72 20 6d 65 73 73 61 67 65 73 20 69 66 20 56 49  r messages if VI
10990 45 57 20 61 6c 72 65 61 64 79 20 65 78 69 73 74  EW already exist
109a0 73 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20  s */.){.  Table 
109b0 2a 70 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 63  *p;.  int n;.  c
109c0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20  onst char *z;.  
109d0 54 6f 6b 65 6e 20 73 45 6e 64 3b 0a 20 20 44 62  Token sEnd;.  Db
109e0 46 69 78 65 72 20 73 46 69 78 3b 0a 20 20 54 6f  Fixer sFix;.  To
109f0 6b 65 6e 20 2a 70 4e 61 6d 65 20 3d 20 30 3b 0a  ken *pName = 0;.
10a00 20 20 69 6e 74 20 69 44 62 3b 0a 20 20 73 71 6c    int iDb;.  sql
10a10 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
10a20 65 2d 3e 64 62 3b 0a 0a 20 20 69 66 28 20 70 50  e->db;..  if( pP
10a30 61 72 73 65 2d 3e 6e 56 61 72 3e 30 20 29 7b 0a  arse->nVar>0 ){.
10a40 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
10a50 4d 73 67 28 70 50 61 72 73 65 2c 20 22 70 61 72  Msg(pParse, "par
10a60 61 6d 65 74 65 72 73 20 61 72 65 20 6e 6f 74 20  ameters are not 
10a70 61 6c 6c 6f 77 65 64 20 69 6e 20 76 69 65 77 73  allowed in views
10a80 22 29 3b 0a 20 20 20 20 67 6f 74 6f 20 63 72 65  ");.    goto cre
10a90 61 74 65 5f 76 69 65 77 5f 66 61 69 6c 3b 0a 20  ate_view_fail;. 
10aa0 20 7d 0a 20 20 73 71 6c 69 74 65 33 53 74 61 72   }.  sqlite3Star
10ab0 74 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70  tTable(pParse, p
10ac0 4e 61 6d 65 31 2c 20 70 4e 61 6d 65 32 2c 20 69  Name1, pName2, i
10ad0 73 54 65 6d 70 2c 20 31 2c 20 30 2c 20 6e 6f 45  sTemp, 1, 0, noE
10ae0 72 72 29 3b 0a 20 20 70 20 3d 20 70 50 61 72 73  rr);.  p = pPars
10af0 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20  e->pNewTable;.  
10b00 69 66 28 20 70 3d 3d 30 20 7c 7c 20 70 50 61 72  if( p==0 || pPar
10b10 73 65 2d 3e 6e 45 72 72 20 29 20 67 6f 74 6f 20  se->nErr ) goto 
10b20 63 72 65 61 74 65 5f 76 69 65 77 5f 66 61 69 6c  create_view_fail
10b30 3b 0a 20 20 73 71 6c 69 74 65 33 54 77 6f 50 61  ;.  sqlite3TwoPa
10b40 72 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 70  rtName(pParse, p
10b50 4e 61 6d 65 31 2c 20 70 4e 61 6d 65 32 2c 20 26  Name1, pName2, &
10b60 70 4e 61 6d 65 29 3b 0a 20 20 69 44 62 20 3d 20  pName);.  iDb = 
10b70 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49  sqlite3SchemaToI
10b80 6e 64 65 78 28 64 62 2c 20 70 2d 3e 70 53 63 68  ndex(db, p->pSch
10b90 65 6d 61 29 3b 0a 20 20 73 71 6c 69 74 65 33 46  ema);.  sqlite3F
10ba0 69 78 49 6e 69 74 28 26 73 46 69 78 2c 20 70 50  ixInit(&sFix, pP
10bb0 61 72 73 65 2c 20 69 44 62 2c 20 22 76 69 65 77  arse, iDb, "view
10bc0 22 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28  ", pName);.  if(
10bd0 20 73 71 6c 69 74 65 33 46 69 78 53 65 6c 65 63   sqlite3FixSelec
10be0 74 28 26 73 46 69 78 2c 20 70 53 65 6c 65 63 74  t(&sFix, pSelect
10bf0 29 20 29 20 67 6f 74 6f 20 63 72 65 61 74 65 5f  ) ) goto create_
10c00 76 69 65 77 5f 66 61 69 6c 3b 0a 0a 20 20 2f 2a  view_fail;..  /*
10c10 20 4d 61 6b 65 20 61 20 63 6f 70 79 20 6f 66 20   Make a copy of 
10c20 74 68 65 20 65 6e 74 69 72 65 20 53 45 4c 45 43  the entire SELEC
10c30 54 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74  T statement that
10c40 20 64 65 66 69 6e 65 73 20 74 68 65 20 76 69 65   defines the vie
10c50 77 2e 0a 20 20 2a 2a 20 54 68 69 73 20 77 69 6c  w..  ** This wil
10c60 6c 20 66 6f 72 63 65 20 61 6c 6c 20 74 68 65 20  l force all the 
10c70 45 78 70 72 2e 74 6f 6b 65 6e 2e 7a 20 76 61 6c  Expr.token.z val
10c80 75 65 73 20 74 6f 20 62 65 20 64 79 6e 61 6d 69  ues to be dynami
10c90 63 61 6c 6c 79 0a 20 20 2a 2a 20 61 6c 6c 6f 63  cally.  ** alloc
10ca0 61 74 65 64 20 72 61 74 68 65 72 20 74 68 61 6e  ated rather than
10cb0 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 69 6e   point to the in
10cc0 70 75 74 20 73 74 72 69 6e 67 20 2d 20 77 68 69  put string - whi
10cd0 63 68 20 6d 65 61 6e 73 20 74 68 61 74 0a 20 20  ch means that.  
10ce0 2a 2a 20 74 68 65 79 20 77 69 6c 6c 20 70 65 72  ** they will per
10cf0 73 69 73 74 20 61 66 74 65 72 20 74 68 65 20 63  sist after the c
10d00 75 72 72 65 6e 74 20 73 71 6c 69 74 65 33 5f 65  urrent sqlite3_e
10d10 78 65 63 28 29 20 63 61 6c 6c 20 72 65 74 75 72  xec() call retur
10d20 6e 73 2e 0a 20 20 2a 2f 0a 20 20 70 2d 3e 70 53  ns..  */.  p->pS
10d30 65 6c 65 63 74 20 3d 20 73 71 6c 69 74 65 33 53  elect = sqlite3S
10d40 65 6c 65 63 74 44 75 70 28 64 62 2c 20 70 53 65  electDup(db, pSe
10d50 6c 65 63 74 2c 20 45 58 50 52 44 55 50 5f 52 45  lect, EXPRDUP_RE
10d60 44 55 43 45 29 3b 0a 20 20 70 2d 3e 70 43 68 65  DUCE);.  p->pChe
10d70 63 6b 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ck = sqlite3Expr
10d80 4c 69 73 74 44 75 70 28 64 62 2c 20 70 43 4e 61  ListDup(db, pCNa
10d90 6d 65 73 2c 20 45 58 50 52 44 55 50 5f 52 45 44  mes, EXPRDUP_RED
10da0 55 43 45 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e  UCE);.  if( db->
10db0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 67  mallocFailed ) g
10dc0 6f 74 6f 20 63 72 65 61 74 65 5f 76 69 65 77 5f  oto create_view_
10dd0 66 61 69 6c 3b 0a 0a 20 20 2f 2a 20 4c 6f 63 61  fail;..  /* Loca
10de0 74 65 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  te the end of th
10df0 65 20 43 52 45 41 54 45 20 56 49 45 57 20 73 74  e CREATE VIEW st
10e00 61 74 65 6d 65 6e 74 2e 20 20 4d 61 6b 65 20 73  atement.  Make s
10e10 45 6e 64 20 70 6f 69 6e 74 20 74 6f 0a 20 20 2a  End point to.  *
10e20 2a 20 74 68 65 20 65 6e 64 2e 0a 20 20 2a 2f 0a  * the end..  */.
10e30 20 20 73 45 6e 64 20 3d 20 70 50 61 72 73 65 2d    sEnd = pParse-
10e40 3e 73 4c 61 73 74 54 6f 6b 65 6e 3b 0a 20 20 61  >sLastToken;.  a
10e50 73 73 65 72 74 28 20 73 45 6e 64 2e 7a 5b 30 5d  ssert( sEnd.z[0]
10e60 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 73 45 6e  !=0 );.  if( sEn
10e70 64 2e 7a 5b 30 5d 21 3d 27 3b 27 20 29 7b 0a 20  d.z[0]!=';' ){. 
10e80 20 20 20 73 45 6e 64 2e 7a 20 2b 3d 20 73 45 6e     sEnd.z += sEn
10e90 64 2e 6e 3b 0a 20 20 7d 0a 20 20 73 45 6e 64 2e  d.n;.  }.  sEnd.
10ea0 6e 20 3d 20 30 3b 0a 20 20 6e 20 3d 20 28 69 6e  n = 0;.  n = (in
10eb0 74 29 28 73 45 6e 64 2e 7a 20 2d 20 70 42 65 67  t)(sEnd.z - pBeg
10ec0 69 6e 2d 3e 7a 29 3b 0a 20 20 61 73 73 65 72 74  in->z);.  assert
10ed0 28 20 6e 3e 30 20 29 3b 0a 20 20 7a 20 3d 20 70  ( n>0 );.  z = p
10ee0 42 65 67 69 6e 2d 3e 7a 3b 0a 20 20 77 68 69 6c  Begin->z;.  whil
10ef0 65 28 20 73 71 6c 69 74 65 33 49 73 73 70 61 63  e( sqlite3Isspac
10f00 65 28 7a 5b 6e 2d 31 5d 29 20 29 7b 20 6e 2d 2d  e(z[n-1]) ){ n--
10f10 3b 20 7d 0a 20 20 73 45 6e 64 2e 7a 20 3d 20 26  ; }.  sEnd.z = &
10f20 7a 5b 6e 2d 31 5d 3b 0a 20 20 73 45 6e 64 2e 6e  z[n-1];.  sEnd.n
10f30 20 3d 20 31 3b 0a 0a 20 20 2f 2a 20 55 73 65 20   = 1;..  /* Use 
10f40 73 71 6c 69 74 65 33 45 6e 64 54 61 62 6c 65 28  sqlite3EndTable(
10f50 29 20 74 6f 20 61 64 64 20 74 68 65 20 76 69 65  ) to add the vie
10f60 77 20 74 6f 20 74 68 65 20 53 51 4c 49 54 45 5f  w to the SQLITE_
10f70 4d 41 53 54 45 52 20 74 61 62 6c 65 20 2a 2f 0a  MASTER table */.
10f80 20 20 73 71 6c 69 74 65 33 45 6e 64 54 61 62 6c    sqlite3EndTabl
10f90 65 28 70 50 61 72 73 65 2c 20 30 2c 20 26 73 45  e(pParse, 0, &sE
10fa0 6e 64 2c 20 30 2c 20 30 29 3b 0a 0a 63 72 65 61  nd, 0, 0);..crea
10fb0 74 65 5f 76 69 65 77 5f 66 61 69 6c 3a 0a 20 20  te_view_fail:.  
10fc0 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c  sqlite3SelectDel
10fd0 65 74 65 28 64 62 2c 20 70 53 65 6c 65 63 74 29  ete(db, pSelect)
10fe0 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c  ;.  sqlite3ExprL
10ff0 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 43  istDelete(db, pC
11000 4e 61 6d 65 73 29 3b 0a 20 20 72 65 74 75 72 6e  Names);.  return
11010 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
11020 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 20 2a  LITE_OMIT_VIEW *
11030 2f 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  /..#if !defined(
11040 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57  SQLITE_OMIT_VIEW
11050 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51  ) || !defined(SQ
11060 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
11070 4c 54 41 42 4c 45 29 0a 2f 2a 0a 2a 2a 20 54 68  LTABLE)./*.** Th
11080 65 20 54 61 62 6c 65 20 73 74 72 75 63 74 75 72  e Table structur
11090 65 20 70 54 61 62 6c 65 20 69 73 20 72 65 61 6c  e pTable is real
110a0 6c 79 20 61 20 56 49 45 57 2e 20 20 46 69 6c 6c  ly a VIEW.  Fill
110b0 20 69 6e 20 74 68 65 20 6e 61 6d 65 73 20 6f 66   in the names of
110c0 0a 2a 2a 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20  .** the columns 
110d0 6f 66 20 74 68 65 20 76 69 65 77 20 69 6e 20 74  of the view in t
110e0 68 65 20 70 54 61 62 6c 65 20 73 74 72 75 63 74  he pTable struct
110f0 75 72 65 2e 20 20 52 65 74 75 72 6e 20 74 68 65  ure.  Return the
11100 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66 20 65 72   number.** of er
11110 72 6f 72 73 2e 20 20 49 66 20 61 6e 20 65 72 72  rors.  If an err
11120 6f 72 20 69 73 20 73 65 65 6e 20 6c 65 61 76 65  or is seen leave
11130 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67   an error messag
11140 65 20 69 6e 20 70 50 61 72 73 65 2d 3e 7a 45 72  e in pParse->zEr
11150 72 4d 73 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  rMsg..*/.int sql
11160 69 74 65 33 56 69 65 77 47 65 74 43 6f 6c 75 6d  ite3ViewGetColum
11170 6e 4e 61 6d 65 73 28 50 61 72 73 65 20 2a 70 50  nNames(Parse *pP
11180 61 72 73 65 2c 20 54 61 62 6c 65 20 2a 70 54 61  arse, Table *pTa
11190 62 6c 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70  ble){.  Table *p
111a0 53 65 6c 54 61 62 3b 20 20 20 2f 2a 20 41 20 66  SelTab;   /* A f
111b0 61 6b 65 20 74 61 62 6c 65 20 66 72 6f 6d 20 77  ake table from w
111c0 68 69 63 68 20 77 65 20 67 65 74 20 74 68 65 20  hich we get the 
111d0 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 20 20  result set */.  
111e0 53 65 6c 65 63 74 20 2a 70 53 65 6c 3b 20 20 20  Select *pSel;   
111f0 20 20 2f 2a 20 43 6f 70 79 20 6f 66 20 74 68 65    /* Copy of the
11200 20 53 45 4c 45 43 54 20 74 68 61 74 20 69 6d 70   SELECT that imp
11210 6c 65 6d 65 6e 74 73 20 74 68 65 20 76 69 65 77  lements the view
11220 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 72 72 20 3d   */.  int nErr =
11230 20 30 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65   0;     /* Numbe
11240 72 20 6f 66 20 65 72 72 6f 72 73 20 65 6e 63 6f  r of errors enco
11250 75 6e 74 65 72 65 64 20 2a 2f 0a 20 20 69 6e 74  untered */.  int
11260 20 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f   n;            /
11270 2a 20 54 65 6d 70 6f 72 61 72 69 6c 79 20 68 6f  * Temporarily ho
11280 6c 64 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  lds the number o
11290 66 20 63 75 72 73 6f 72 73 20 61 73 73 69 67 6e  f cursors assign
112a0 65 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  ed */.  sqlite3 
112b0 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
112c0 3b 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63  ;  /* Database c
112d0 6f 6e 6e 65 63 74 69 6f 6e 20 66 6f 72 20 6d 61  onnection for ma
112e0 6c 6c 6f 63 20 65 72 72 6f 72 73 20 2a 2f 0a 20  lloc errors */. 
112f0 20 73 71 6c 69 74 65 33 5f 78 61 75 74 68 20 78   sqlite3_xauth x
11300 41 75 74 68 3b 20 20 20 20 20 20 20 2f 2a 20 53  Auth;       /* S
11310 61 76 65 64 20 78 41 75 74 68 20 70 6f 69 6e 74  aved xAuth point
11320 65 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  er */..  assert(
11330 20 70 54 61 62 6c 65 20 29 3b 0a 0a 23 69 66 6e   pTable );..#ifn
11340 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
11350 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 69  VIRTUALTABLE.  i
11360 66 28 20 73 71 6c 69 74 65 33 56 74 61 62 43 61  f( sqlite3VtabCa
11370 6c 6c 43 6f 6e 6e 65 63 74 28 70 50 61 72 73 65  llConnect(pParse
11380 2c 20 70 54 61 62 6c 65 29 20 29 7b 0a 20 20 20  , pTable) ){.   
11390 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
113a0 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20  RROR;.  }.  if( 
113b0 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 6c 65  IsVirtual(pTable
113c0 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 23 65  ) ) return 0;.#e
113d0 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51  ndif..#ifndef SQ
113e0 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 20  LITE_OMIT_VIEW. 
113f0 20 2f 2a 20 41 20 70 6f 73 69 74 69 76 65 20 6e   /* A positive n
11400 43 6f 6c 20 6d 65 61 6e 73 20 74 68 65 20 63 6f  Col means the co
11410 6c 75 6d 6e 73 20 6e 61 6d 65 73 20 66 6f 72 20  lumns names for 
11420 74 68 69 73 20 76 69 65 77 20 61 72 65 0a 20 20  this view are.  
11430 2a 2a 20 61 6c 72 65 61 64 79 20 6b 6e 6f 77 6e  ** already known
11440 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 54 61  ..  */.  if( pTa
11450 62 6c 65 2d 3e 6e 43 6f 6c 3e 30 20 29 20 72 65  ble->nCol>0 ) re
11460 74 75 72 6e 20 30 3b 0a 0a 20 20 2f 2a 20 41 20  turn 0;..  /* A 
11470 6e 65 67 61 74 69 76 65 20 6e 43 6f 6c 20 69 73  negative nCol is
11480 20 61 20 73 70 65 63 69 61 6c 20 6d 61 72 6b 65   a special marke
11490 72 20 6d 65 61 6e 69 6e 67 20 74 68 61 74 20 77  r meaning that w
114a0 65 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79 0a  e are currently.
114b0 20 20 2a 2a 20 74 72 79 69 6e 67 20 74 6f 20 63    ** trying to c
114c0 6f 6d 70 75 74 65 20 74 68 65 20 63 6f 6c 75 6d  ompute the colum
114d0 6e 20 6e 61 6d 65 73 2e 20 20 49 66 20 77 65 20  n names.  If we 
114e0 65 6e 74 65 72 20 74 68 69 73 20 72 6f 75 74 69  enter this routi
114f0 6e 65 20 77 69 74 68 0a 20 20 2a 2a 20 61 20 6e  ne with.  ** a n
11500 65 67 61 74 69 76 65 20 6e 43 6f 6c 2c 20 69 74  egative nCol, it
11510 20 6d 65 61 6e 73 20 74 77 6f 20 6f 72 20 6d 6f   means two or mo
11520 72 65 20 76 69 65 77 73 20 66 6f 72 6d 20 61 20  re views form a 
11530 6c 6f 6f 70 2c 20 6c 69 6b 65 20 74 68 69 73 3a  loop, like this:
11540 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 43  .  **.  **     C
11550 52 45 41 54 45 20 56 49 45 57 20 6f 6e 65 20 41  REATE VIEW one A
11560 53 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20  S SELECT * FROM 
11570 74 77 6f 3b 0a 20 20 2a 2a 20 20 20 20 20 43 52  two;.  **     CR
11580 45 41 54 45 20 56 49 45 57 20 74 77 6f 20 41 53  EATE VIEW two AS
11590 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 6f   SELECT * FROM o
115a0 6e 65 3b 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 63  ne;.  **.  ** Ac
115b0 74 75 61 6c 6c 79 2c 20 74 68 65 20 65 72 72 6f  tually, the erro
115c0 72 20 61 62 6f 76 65 20 69 73 20 6e 6f 77 20 63  r above is now c
115d0 61 75 67 68 74 20 70 72 69 6f 72 20 74 6f 20 72  aught prior to r
115e0 65 61 63 68 69 6e 67 20 74 68 69 73 20 70 6f 69  eaching this poi
115f0 6e 74 2e 0a 20 20 2a 2a 20 42 75 74 20 74 68 65  nt..  ** But the
11600 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 65 73 74 20   following test 
11610 69 73 20 73 74 69 6c 6c 20 69 6d 70 6f 72 74 61  is still importa
11620 6e 74 20 61 73 20 69 74 20 64 6f 65 73 20 63 6f  nt as it does co
11630 6d 65 20 75 70 0a 20 20 2a 2a 20 69 6e 20 74 68  me up.  ** in th
11640 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 20 20 2a  e following:.  *
11650 2a 20 0a 20 20 2a 2a 20 20 20 20 20 43 52 45 41  * .  **     CREA
11660 54 45 20 54 41 42 4c 45 20 6d 61 69 6e 2e 65 78  TE TABLE main.ex
11670 31 28 61 29 3b 0a 20 20 2a 2a 20 20 20 20 20 43  1(a);.  **     C
11680 52 45 41 54 45 20 54 45 4d 50 20 56 49 45 57 20  REATE TEMP VIEW 
11690 65 78 31 20 41 53 20 53 45 4c 45 43 54 20 61 20  ex1 AS SELECT a 
116a0 46 52 4f 4d 20 65 78 31 3b 0a 20 20 2a 2a 20 20  FROM ex1;.  **  
116b0 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d     SELECT * FROM
116c0 20 74 65 6d 70 2e 65 78 31 3b 0a 20 20 2a 2f 0a   temp.ex1;.  */.
116d0 20 20 69 66 28 20 70 54 61 62 6c 65 2d 3e 6e 43    if( pTable->nC
116e0 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  ol<0 ){.    sqli
116f0 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
11700 73 65 2c 20 22 76 69 65 77 20 25 73 20 69 73 20  se, "view %s is 
11710 63 69 72 63 75 6c 61 72 6c 79 20 64 65 66 69 6e  circularly defin
11720 65 64 22 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e 61  ed", pTable->zNa
11730 6d 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  me);.    return 
11740 31 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  1;.  }.  assert(
11750 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3e 3d 30   pTable->nCol>=0
11760 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20   );..  /* If we 
11770 67 65 74 20 74 68 69 73 20 66 61 72 2c 20 69 74  get this far, it
11780 20 6d 65 61 6e 73 20 77 65 20 6e 65 65 64 20 74   means we need t
11790 6f 20 63 6f 6d 70 75 74 65 20 74 68 65 20 74 61  o compute the ta
117a0 62 6c 65 20 6e 61 6d 65 73 2e 0a 20 20 2a 2a 20  ble names..  ** 
117b0 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 63 61  Note that the ca
117c0 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 52 65 73  ll to sqlite3Res
117d0 75 6c 74 53 65 74 4f 66 53 65 6c 65 63 74 28 29  ultSetOfSelect()
117e0 20 77 69 6c 6c 20 65 78 70 61 6e 64 20 61 6e 79   will expand any
117f0 0a 20 20 2a 2a 20 22 2a 22 20 65 6c 65 6d 65 6e  .  ** "*" elemen
11800 74 73 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74  ts in the result
11810 73 20 73 65 74 20 6f 66 20 74 68 65 20 76 69 65  s set of the vie
11820 77 20 61 6e 64 20 77 69 6c 6c 20 61 73 73 69 67  w and will assig
11830 6e 20 63 75 72 73 6f 72 73 0a 20 20 2a 2a 20 74  n cursors.  ** t
11840 6f 20 74 68 65 20 65 6c 65 6d 65 6e 74 73 20 6f  o the elements o
11850 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  f the FROM claus
11860 65 2e 20 20 42 75 74 20 77 65 20 64 6f 20 6e 6f  e.  But we do no
11870 74 20 77 61 6e 74 20 74 68 65 73 65 20 63 68 61  t want these cha
11880 6e 67 65 73 0a 20 20 2a 2a 20 74 6f 20 62 65 20  nges.  ** to be 
11890 70 65 72 6d 61 6e 65 6e 74 2e 20 20 53 6f 20 74  permanent.  So t
118a0 68 65 20 63 6f 6d 70 75 74 61 74 69 6f 6e 20 69  he computation i
118b0 73 20 64 6f 6e 65 20 6f 6e 20 61 20 63 6f 70 79  s done on a copy
118c0 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 0a 20   of the SELECT. 
118d0 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 74 68   ** statement th
118e0 61 74 20 64 65 66 69 6e 65 73 20 74 68 65 20 76  at defines the v
118f0 69 65 77 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  iew..  */.  asse
11900 72 74 28 20 70 54 61 62 6c 65 2d 3e 70 53 65 6c  rt( pTable->pSel
11910 65 63 74 20 29 3b 0a 20 20 69 66 28 20 70 54 61  ect );.  if( pTa
11920 62 6c 65 2d 3e 70 43 68 65 63 6b 20 29 7b 0a 20  ble->pCheck ){. 
11930 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65     db->lookaside
11940 2e 62 44 69 73 61 62 6c 65 2b 2b 3b 0a 20 20 20  .bDisable++;.   
11950 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 73 46   sqlite3ColumnsF
11960 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72  romExprList(pPar
11970 73 65 2c 20 70 54 61 62 6c 65 2d 3e 70 43 68 65  se, pTable->pChe
11980 63 6b 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  ck, .           
11990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
119a0 20 20 20 20 26 70 54 61 62 6c 65 2d 3e 6e 43 6f      &pTable->nCo
119b0 6c 2c 20 26 70 54 61 62 6c 65 2d 3e 61 43 6f 6c  l, &pTable->aCol
119c0 29 3b 0a 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61  );.    db->looka
119d0 73 69 64 65 2e 62 44 69 73 61 62 6c 65 2d 2d 3b  side.bDisable--;
119e0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 53  .  }else{.    pS
119f0 65 6c 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65  el = sqlite3Sele
11a00 63 74 44 75 70 28 64 62 2c 20 70 54 61 62 6c 65  ctDup(db, pTable
11a10 2d 3e 70 53 65 6c 65 63 74 2c 20 30 29 3b 0a 20  ->pSelect, 0);. 
11a20 20 20 20 69 66 28 20 70 53 65 6c 20 29 7b 0a 20     if( pSel ){. 
11a30 20 20 20 20 20 6e 20 3d 20 70 50 61 72 73 65 2d       n = pParse-
11a40 3e 6e 54 61 62 3b 0a 20 20 20 20 20 20 73 71 6c  >nTab;.      sql
11a50 69 74 65 33 53 72 63 4c 69 73 74 41 73 73 69 67  ite3SrcListAssig
11a60 6e 43 75 72 73 6f 72 73 28 70 50 61 72 73 65 2c  nCursors(pParse,
11a70 20 70 53 65 6c 2d 3e 70 53 72 63 29 3b 0a 20 20   pSel->pSrc);.  
11a80 20 20 20 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c      pTable->nCol
11a90 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 64 62 2d   = -1;.      db-
11aa0 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 44 69 73 61  >lookaside.bDisa
11ab0 62 6c 65 2b 2b 3b 0a 23 69 66 6e 64 65 66 20 53  ble++;.#ifndef S
11ac0 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f  QLITE_OMIT_AUTHO
11ad0 52 49 5a 41 54 49 4f 4e 0a 20 20 20 20 20 20 78  RIZATION.      x
11ae0 41 75 74 68 20 3d 20 64 62 2d 3e 78 41 75 74 68  Auth = db->xAuth
11af0 3b 0a 20 20 20 20 20 20 64 62 2d 3e 78 41 75 74  ;.      db->xAut
11b00 68 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 53 65  h = 0;.      pSe
11b10 6c 54 61 62 20 3d 20 73 71 6c 69 74 65 33 52 65  lTab = sqlite3Re
11b20 73 75 6c 74 53 65 74 4f 66 53 65 6c 65 63 74 28  sultSetOfSelect(
11b30 70 50 61 72 73 65 2c 20 70 53 65 6c 29 3b 0a 20  pParse, pSel);. 
11b40 20 20 20 20 20 64 62 2d 3e 78 41 75 74 68 20 3d       db->xAuth =
11b50 20 78 41 75 74 68 3b 0a 23 65 6c 73 65 0a 20 20   xAuth;.#else.  
11b60 20 20 20 20 70 53 65 6c 54 61 62 20 3d 20 73 71      pSelTab = sq
11b70 6c 69 74 65 33 52 65 73 75 6c 74 53 65 74 4f 66  lite3ResultSetOf
11b80 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  Select(pParse, p
11b90 53 65 6c 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  Sel);.#endif.   
11ba0 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65     db->lookaside
11bb0 2e 62 44 69 73 61 62 6c 65 2d 2d 3b 0a 20 20 20  .bDisable--;.   
11bc0 20 20 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 20     pParse->nTab 
11bd0 3d 20 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 70  = n;.      if( p
11be0 53 65 6c 54 61 62 20 29 7b 0a 20 20 20 20 20 20  SelTab ){.      
11bf0 20 20 61 73 73 65 72 74 28 20 70 54 61 62 6c 65    assert( pTable
11c00 2d 3e 61 43 6f 6c 3d 3d 30 20 29 3b 0a 20 20 20  ->aCol==0 );.   
11c10 20 20 20 20 20 70 54 61 62 6c 65 2d 3e 6e 43 6f       pTable->nCo
11c20 6c 20 3d 20 70 53 65 6c 54 61 62 2d 3e 6e 43 6f  l = pSelTab->nCo
11c30 6c 3b 0a 20 20 20 20 20 20 20 20 70 54 61 62 6c  l;.        pTabl
11c40 65 2d 3e 61 43 6f 6c 20 3d 20 70 53 65 6c 54 61  e->aCol = pSelTa
11c50 62 2d 3e 61 43 6f 6c 3b 0a 20 20 20 20 20 20 20  b->aCol;.       
11c60 20 70 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c 20 3d   pSelTab->nCol =
11c70 20 30 3b 0a 20 20 20 20 20 20 20 20 70 53 65 6c   0;.        pSel
11c80 54 61 62 2d 3e 61 43 6f 6c 20 3d 20 30 3b 0a 20  Tab->aCol = 0;. 
11c90 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65         sqlite3De
11ca0 6c 65 74 65 54 61 62 6c 65 28 64 62 2c 20 70 53  leteTable(db, pS
11cb0 65 6c 54 61 62 29 3b 0a 20 20 20 20 20 20 20 20  elTab);.        
11cc0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 53  assert( sqlite3S
11cd0 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64  chemaMutexHeld(d
11ce0 62 2c 20 30 2c 20 70 54 61 62 6c 65 2d 3e 70 53  b, 0, pTable->pS
11cf0 63 68 65 6d 61 29 20 29 3b 0a 20 20 20 20 20 20  chema) );.      
11d00 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70  }else{.        p
11d10 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 30 3b  Table->nCol = 0;
11d20 0a 20 20 20 20 20 20 20 20 6e 45 72 72 2b 2b 3b  .        nErr++;
11d30 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
11d40 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65  qlite3SelectDele
11d50 74 65 28 64 62 2c 20 70 53 65 6c 29 3b 0a 20 20  te(db, pSel);.  
11d60 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20    } else {.     
11d70 20 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 7d 0a 20   nErr++;.    }. 
11d80 20 7d 0a 20 20 70 54 61 62 6c 65 2d 3e 70 53 63   }.  pTable->pSc
11d90 68 65 6d 61 2d 3e 73 63 68 65 6d 61 46 6c 61 67  hema->schemaFlag
11da0 73 20 7c 3d 20 44 42 5f 55 6e 72 65 73 65 74 56  s |= DB_UnresetV
11db0 69 65 77 73 3b 0a 23 65 6e 64 69 66 20 2f 2a 20  iews;.#endif /* 
11dc0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57  SQLITE_OMIT_VIEW
11dd0 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 6e 45 72   */.  return nEr
11de0 72 3b 20 20 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  r;  .}.#endif /*
11df0 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
11e00 5f 4f 4d 49 54 5f 56 49 45 57 29 20 7c 7c 20 21  _OMIT_VIEW) || !
11e10 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
11e20 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
11e30 29 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51  ) */..#ifndef SQ
11e40 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 2f  LITE_OMIT_VIEW./
11e50 2a 0a 2a 2a 20 43 6c 65 61 72 20 74 68 65 20 63  *.** Clear the c
11e60 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 66 72 6f 6d  olumn names from
11e70 20 65 76 65 72 79 20 56 49 45 57 20 69 6e 20 64   every VIEW in d
11e80 61 74 61 62 61 73 65 20 69 64 78 2e 0a 2a 2f 0a  atabase idx..*/.
11e90 73 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69  static void sqli
11ea0 74 65 56 69 65 77 52 65 73 65 74 41 6c 6c 28 73  teViewResetAll(s
11eb0 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20  qlite3 *db, int 
11ec0 69 64 78 29 7b 0a 20 20 48 61 73 68 45 6c 65 6d  idx){.  HashElem
11ed0 20 2a 69 3b 0a 20 20 61 73 73 65 72 74 28 20 73   *i;.  assert( s
11ee0 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65  qlite3SchemaMute
11ef0 78 48 65 6c 64 28 64 62 2c 20 69 64 78 2c 20 30  xHeld(db, idx, 0
11f00 29 20 29 3b 0a 20 20 69 66 28 20 21 44 62 48 61  ) );.  if( !DbHa
11f10 73 50 72 6f 70 65 72 74 79 28 64 62 2c 20 69 64  sProperty(db, id
11f20 78 2c 20 44 42 5f 55 6e 72 65 73 65 74 56 69 65  x, DB_UnresetVie
11f30 77 73 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ws) ) return;.  
11f40 66 6f 72 28 69 3d 73 71 6c 69 74 65 48 61 73 68  for(i=sqliteHash
11f50 46 69 72 73 74 28 26 64 62 2d 3e 61 44 62 5b 69  First(&db->aDb[i
11f60 64 78 5d 2e 70 53 63 68 65 6d 61 2d 3e 74 62 6c  dx].pSchema->tbl
11f70 48 61 73 68 29 3b 20 69 3b 69 3d 73 71 6c 69 74  Hash); i;i=sqlit
11f80 65 48 61 73 68 4e 65 78 74 28 69 29 29 7b 0a 20  eHashNext(i)){. 
11f90 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d     Table *pTab =
11fa0 20 73 71 6c 69 74 65 48 61 73 68 44 61 74 61 28   sqliteHashData(
11fb0 69 29 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62  i);.    if( pTab
11fc0 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20  ->pSelect ){.   
11fd0 20 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65     sqlite3Delete
11fe0 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 64 62 2c 20  ColumnNames(db, 
11ff0 70 54 61 62 29 3b 0a 20 20 20 20 20 20 70 54 61  pTab);.      pTa
12000 62 2d 3e 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 20  b->aCol = 0;.   
12010 20 20 20 70 54 61 62 2d 3e 6e 43 6f 6c 20 3d 20     pTab->nCol = 
12020 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 44  0;.    }.  }.  D
12030 62 43 6c 65 61 72 50 72 6f 70 65 72 74 79 28 64  bClearProperty(d
12040 62 2c 20 69 64 78 2c 20 44 42 5f 55 6e 72 65 73  b, idx, DB_Unres
12050 65 74 56 69 65 77 73 29 3b 0a 7d 0a 23 65 6c 73  etViews);.}.#els
12060 65 0a 23 20 64 65 66 69 6e 65 20 73 71 6c 69 74  e.# define sqlit
12070 65 56 69 65 77 52 65 73 65 74 41 6c 6c 28 41 2c  eViewResetAll(A,
12080 42 29 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  B).#endif /* SQL
12090 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 20 2a 2f  ITE_OMIT_VIEW */
120a0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
120b0 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
120c0 62 79 20 74 68 65 20 56 44 42 45 20 74 6f 20 61  by the VDBE to a
120d0 64 6a 75 73 74 20 74 68 65 20 69 6e 74 65 72 6e  djust the intern
120e0 61 6c 20 73 63 68 65 6d 61 0a 2a 2a 20 75 73 65  al schema.** use
120f0 64 20 62 79 20 53 51 4c 69 74 65 20 77 68 65 6e  d by SQLite when
12100 20 74 68 65 20 62 74 72 65 65 20 6c 61 79 65 72   the btree layer
12110 20 6d 6f 76 65 73 20 61 20 74 61 62 6c 65 20 72   moves a table r
12120 6f 6f 74 20 70 61 67 65 2e 20 54 68 65 0a 2a 2a  oot page. The.**
12130 20 72 6f 6f 74 2d 70 61 67 65 20 6f 66 20 61 20   root-page of a 
12140 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 69  table or index i
12150 6e 20 64 61 74 61 62 61 73 65 20 69 44 62 20 68  n database iDb h
12160 61 73 20 63 68 61 6e 67 65 64 20 66 72 6f 6d 20  as changed from 
12170 69 46 72 6f 6d 0a 2a 2a 20 74 6f 20 69 54 6f 2e  iFrom.** to iTo.
12180 0a 2a 2a 0a 2a 2a 20 54 69 63 6b 65 74 20 23 31  .**.** Ticket #1
12190 37 32 38 3a 20 20 54 68 65 20 73 79 6d 62 6f 6c  728:  The symbol
121a0 20 74 61 62 6c 65 20 6d 69 67 68 74 20 73 74 69   table might sti
121b0 6c 6c 20 63 6f 6e 74 61 69 6e 20 69 6e 66 6f 72  ll contain infor
121c0 6d 61 74 69 6f 6e 0a 2a 2a 20 6f 6e 20 74 61 62  mation.** on tab
121d0 6c 65 73 20 61 6e 64 2f 6f 72 20 69 6e 64 69 63  les and/or indic
121e0 65 73 20 74 68 61 74 20 61 72 65 20 74 68 65 20  es that are the 
121f0 70 72 6f 63 65 73 73 20 6f 66 20 62 65 69 6e 67  process of being
12200 20 64 65 6c 65 74 65 64 2e 0a 2a 2a 20 49 66 20   deleted..** If 
12210 79 6f 75 20 61 72 65 20 75 6e 6c 75 63 6b 79 2c  you are unlucky,
12220 20 6f 6e 65 20 6f 66 20 74 68 6f 73 65 20 64 65   one of those de
12230 6c 65 74 65 64 20 69 6e 64 69 63 65 73 20 6f 72  leted indices or
12240 20 74 61 62 6c 65 73 20 6d 69 67 68 74 0a 2a 2a   tables might.**
12250 20 68 61 76 65 20 74 68 65 20 73 61 6d 65 20 72   have the same r
12260 6f 6f 74 70 61 67 65 20 6e 75 6d 62 65 72 20 61  ootpage number a
12270 73 20 74 68 65 20 72 65 61 6c 20 74 61 62 6c 65  s the real table
12280 20 6f 72 20 69 6e 64 65 78 20 74 68 61 74 20 69   or index that i
12290 73 0a 2a 2a 20 62 65 69 6e 67 20 6d 6f 76 65 64  s.** being moved
122a0 2e 20 20 53 6f 20 77 65 20 63 61 6e 6e 6f 74 20  .  So we cannot 
122b0 73 74 6f 70 20 73 65 61 72 63 68 69 6e 67 20 61  stop searching a
122c0 66 74 65 72 20 74 68 65 20 66 69 72 73 74 20 6d  fter the first m
122d0 61 74 63 68 20 0a 2a 2a 20 62 65 63 61 75 73 65  atch .** because
122e0 20 74 68 65 20 66 69 72 73 74 20 6d 61 74 63 68   the first match
122f0 20 6d 69 67 68 74 20 62 65 20 66 6f 72 20 6f 6e   might be for on
12300 65 20 6f 66 20 74 68 65 20 64 65 6c 65 74 65 64  e of the deleted
12310 20 69 6e 64 69 63 65 73 0a 2a 2a 20 6f 72 20 74   indices.** or t
12320 61 62 6c 65 73 20 61 6e 64 20 6e 6f 74 20 74 68  ables and not th
12330 65 20 74 61 62 6c 65 2f 69 6e 64 65 78 20 74 68  e table/index th
12340 61 74 20 69 73 20 61 63 74 75 61 6c 6c 79 20 62  at is actually b
12350 65 69 6e 67 20 6d 6f 76 65 64 2e 0a 2a 2a 20 57  eing moved..** W
12360 65 20 6d 75 73 74 20 63 6f 6e 74 69 6e 75 65 20  e must continue 
12370 6c 6f 6f 70 69 6e 67 20 75 6e 74 69 6c 20 61 6c  looping until al
12380 6c 20 74 61 62 6c 65 73 20 61 6e 64 20 69 6e 64  l tables and ind
12390 69 63 65 73 20 77 69 74 68 0a 2a 2a 20 72 6f 6f  ices with.** roo
123a0 74 70 61 67 65 3d 3d 69 46 72 6f 6d 20 68 61 76  tpage==iFrom hav
123b0 65 20 62 65 65 6e 20 63 6f 6e 76 65 72 74 65 64  e been converted
123c0 20 74 6f 20 68 61 76 65 20 61 20 72 6f 6f 74 70   to have a rootp
123d0 61 67 65 20 6f 66 20 69 54 6f 0a 2a 2a 20 69 6e  age of iTo.** in
123e0 20 6f 72 64 65 72 20 74 6f 20 62 65 20 63 65 72   order to be cer
123f0 74 61 69 6e 20 74 68 61 74 20 77 65 20 67 6f 74  tain that we got
12400 20 74 68 65 20 72 69 67 68 74 20 6f 6e 65 2e 0a   the right one..
12410 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
12420 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
12430 4d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52 6f  M.void sqlite3Ro
12440 6f 74 50 61 67 65 4d 6f 76 65 64 28 73 71 6c 69  otPageMoved(sqli
12450 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 69 44 62  te3 *db, int iDb
12460 2c 20 69 6e 74 20 69 46 72 6f 6d 2c 20 69 6e 74  , int iFrom, int
12470 20 69 54 6f 29 7b 0a 20 20 48 61 73 68 45 6c 65   iTo){.  HashEle
12480 6d 20 2a 70 45 6c 65 6d 3b 0a 20 20 48 61 73 68  m *pElem;.  Hash
12490 20 2a 70 48 61 73 68 3b 0a 20 20 44 62 20 2a 70   *pHash;.  Db *p
124a0 44 62 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73  Db;..  assert( s
124b0 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65  qlite3SchemaMute
124c0 78 48 65 6c 64 28 64 62 2c 20 69 44 62 2c 20 30  xHeld(db, iDb, 0
124d0 29 20 29 3b 0a 20 20 70 44 62 20 3d 20 26 64 62  ) );.  pDb = &db
124e0 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a 20 20 70 48  ->aDb[iDb];.  pH
124f0 61 73 68 20 3d 20 26 70 44 62 2d 3e 70 53 63 68  ash = &pDb->pSch
12500 65 6d 61 2d 3e 74 62 6c 48 61 73 68 3b 0a 20 20  ema->tblHash;.  
12510 66 6f 72 28 70 45 6c 65 6d 3d 73 71 6c 69 74 65  for(pElem=sqlite
12520 48 61 73 68 46 69 72 73 74 28 70 48 61 73 68 29  HashFirst(pHash)
12530 3b 20 70 45 6c 65 6d 3b 20 70 45 6c 65 6d 3d 73  ; pElem; pElem=s
12540 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28 70 45  qliteHashNext(pE
12550 6c 65 6d 29 29 7b 0a 20 20 20 20 54 61 62 6c 65  lem)){.    Table
12560 20 2a 70 54 61 62 20 3d 20 73 71 6c 69 74 65 48   *pTab = sqliteH
12570 61 73 68 44 61 74 61 28 70 45 6c 65 6d 29 3b 0a  ashData(pElem);.
12580 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e 74 6e      if( pTab->tn
12590 75 6d 3d 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20  um==iFrom ){.   
125a0 20 20 20 70 54 61 62 2d 3e 74 6e 75 6d 20 3d 20     pTab->tnum = 
125b0 69 54 6f 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  iTo;.    }.  }. 
125c0 20 70 48 61 73 68 20 3d 20 26 70 44 62 2d 3e 70   pHash = &pDb->p
125d0 53 63 68 65 6d 61 2d 3e 69 64 78 48 61 73 68 3b  Schema->idxHash;
125e0 0a 20 20 66 6f 72 28 70 45 6c 65 6d 3d 73 71 6c  .  for(pElem=sql
125f0 69 74 65 48 61 73 68 46 69 72 73 74 28 70 48 61  iteHashFirst(pHa
12600 73 68 29 3b 20 70 45 6c 65 6d 3b 20 70 45 6c 65  sh); pElem; pEle
12610 6d 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74  m=sqliteHashNext
12620 28 70 45 6c 65 6d 29 29 7b 0a 20 20 20 20 49 6e  (pElem)){.    In
12630 64 65 78 20 2a 70 49 64 78 20 3d 20 73 71 6c 69  dex *pIdx = sqli
12640 74 65 48 61 73 68 44 61 74 61 28 70 45 6c 65 6d  teHashData(pElem
12650 29 3b 0a 20 20 20 20 69 66 28 20 70 49 64 78 2d  );.    if( pIdx-
12660 3e 74 6e 75 6d 3d 3d 69 46 72 6f 6d 20 29 7b 0a  >tnum==iFrom ){.
12670 20 20 20 20 20 20 70 49 64 78 2d 3e 74 6e 75 6d        pIdx->tnum
12680 20 3d 20 69 54 6f 3b 0a 20 20 20 20 7d 0a 20 20   = iTo;.    }.  
12690 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  }.}.#endif../*.*
126a0 2a 20 57 72 69 74 65 20 63 6f 64 65 20 74 6f 20  * Write code to 
126b0 65 72 61 73 65 20 74 68 65 20 74 61 62 6c 65 20  erase the table 
126c0 77 69 74 68 20 72 6f 6f 74 2d 70 61 67 65 20 69  with root-page i
126d0 54 61 62 6c 65 20 66 72 6f 6d 20 64 61 74 61 62  Table from datab
126e0 61 73 65 20 69 44 62 2e 0a 2a 2a 20 41 6c 73 6f  ase iDb..** Also
126f0 20 77 72 69 74 65 20 63 6f 64 65 20 74 6f 20 6d   write code to m
12700 6f 64 69 66 79 20 74 68 65 20 73 71 6c 69 74 65  odify the sqlite
12710 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20 61 6e  _master table an
12720 64 20 69 6e 74 65 72 6e 61 6c 20 73 63 68 65 6d  d internal schem
12730 61 0a 2a 2a 20 69 66 20 61 20 72 6f 6f 74 2d 70  a.** if a root-p
12740 61 67 65 20 6f 66 20 61 6e 6f 74 68 65 72 20 74  age of another t
12750 61 62 6c 65 20 69 73 20 6d 6f 76 65 64 20 62 79  able is moved by
12760 20 74 68 65 20 62 74 72 65 65 2d 6c 61 79 65 72   the btree-layer
12770 20 77 68 69 6c 73 74 0a 2a 2a 20 65 72 61 73 69   whilst.** erasi
12780 6e 67 20 69 54 61 62 6c 65 20 28 74 68 69 73 20  ng iTable (this 
12790 63 61 6e 20 68 61 70 70 65 6e 20 77 69 74 68 20  can happen with 
127a0 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64  an auto-vacuum d
127b0 61 74 61 62 61 73 65 29 2e 0a 2a 2f 20 0a 73 74  atabase)..*/ .st
127c0 61 74 69 63 20 76 6f 69 64 20 64 65 73 74 72 6f  atic void destro
127d0 79 52 6f 6f 74 50 61 67 65 28 50 61 72 73 65 20  yRootPage(Parse 
127e0 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69 54 61  *pParse, int iTa
127f0 62 6c 65 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20  ble, int iDb){. 
12800 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74   Vdbe *v = sqlit
12810 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
12820 29 3b 0a 20 20 69 6e 74 20 72 31 20 3d 20 73 71  );.  int r1 = sq
12830 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
12840 70 50 61 72 73 65 29 3b 0a 20 20 61 73 73 65 72  pParse);.  asser
12850 74 28 20 69 54 61 62 6c 65 3e 31 20 29 3b 0a 20  t( iTable>1 );. 
12860 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
12870 70 33 28 76 2c 20 4f 50 5f 44 65 73 74 72 6f 79  p3(v, OP_Destroy
12880 2c 20 69 54 61 62 6c 65 2c 20 72 31 2c 20 69 44  , iTable, r1, iD
12890 62 29 3b 0a 20 20 73 71 6c 69 74 65 33 4d 61 79  b);.  sqlite3May
128a0 41 62 6f 72 74 28 70 50 61 72 73 65 29 3b 0a 23  Abort(pParse);.#
128b0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
128c0 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
128d0 2f 2a 20 4f 50 5f 44 65 73 74 72 6f 79 20 73 74  /* OP_Destroy st
128e0 6f 72 65 73 20 61 6e 20 69 6e 20 69 6e 74 65 67  ores an in integ
128f0 65 72 20 72 31 2e 20 49 66 20 74 68 69 73 20 69  er r1. If this i
12900 6e 74 65 67 65 72 0a 20 20 2a 2a 20 69 73 20 6e  nteger.  ** is n
12910 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 69 74  on-zero, then it
12920 20 69 73 20 74 68 65 20 72 6f 6f 74 20 70 61 67   is the root pag
12930 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 20 74 61  e number of a ta
12940 62 6c 65 20 6d 6f 76 65 64 20 74 6f 0a 20 20 2a  ble moved to.  *
12950 2a 20 6c 6f 63 61 74 69 6f 6e 20 69 54 61 62 6c  * location iTabl
12960 65 2e 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  e. The following
12970 20 63 6f 64 65 20 6d 6f 64 69 66 69 65 73 20 74   code modifies t
12980 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  he sqlite_master
12990 20 74 61 62 6c 65 20 74 6f 0a 20 20 2a 2a 20 72   table to.  ** r
129a0 65 66 6c 65 63 74 20 74 68 69 73 2e 0a 20 20 2a  eflect this..  *
129b0 2a 0a 20 20 2a 2a 20 54 68 65 20 22 23 4e 4e 4e  *.  ** The "#NNN
129c0 22 20 69 6e 20 74 68 65 20 53 51 4c 20 69 73 20  " in the SQL is 
129d0 61 20 73 70 65 63 69 61 6c 20 63 6f 6e 73 74 61  a special consta
129e0 6e 74 20 74 68 61 74 20 6d 65 61 6e 73 20 77 68  nt that means wh
129f0 61 74 65 76 65 72 20 76 61 6c 75 65 0a 20 20 2a  atever value.  *
12a00 2a 20 69 73 20 69 6e 20 72 65 67 69 73 74 65 72  * is in register
12a10 20 4e 4e 4e 2e 20 20 53 65 65 20 67 72 61 6d 6d   NNN.  See gramm
12a20 61 72 20 72 75 6c 65 73 20 61 73 73 6f 63 69 61  ar rules associa
12a30 74 65 64 20 77 69 74 68 20 74 68 65 20 54 4b 5f  ted with the TK_
12a40 52 45 47 49 53 54 45 52 0a 20 20 2a 2a 20 74 6f  REGISTER.  ** to
12a50 6b 65 6e 20 66 6f 72 20 61 64 64 69 74 69 6f 6e  ken for addition
12a60 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a  al information..
12a70 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 4e 65    */.  sqlite3Ne
12a80 73 74 65 64 50 61 72 73 65 28 70 50 61 72 73 65  stedParse(pParse
12a90 2c 20 0a 20 20 20 20 20 22 55 50 44 41 54 45 20  , .     "UPDATE 
12aa0 25 51 2e 25 73 20 53 45 54 20 72 6f 6f 74 70 61  %Q.%s SET rootpa
12ab0 67 65 3d 25 64 20 57 48 45 52 45 20 23 25 64 20  ge=%d WHERE #%d 
12ac0 41 4e 44 20 72 6f 6f 74 70 61 67 65 3d 23 25 64  AND rootpage=#%d
12ad0 22 2c 0a 20 20 20 20 20 70 50 61 72 73 65 2d 3e  ",.     pParse->
12ae0 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61  db->aDb[iDb].zNa
12af0 6d 65 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c 45  me, SCHEMA_TABLE
12b00 28 69 44 62 29 2c 20 69 54 61 62 6c 65 2c 20 72  (iDb), iTable, r
12b10 31 2c 20 72 31 29 3b 0a 23 65 6e 64 69 66 0a 20  1, r1);.#endif. 
12b20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
12b30 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
12b40 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69  1);.}../*.** Wri
12b50 74 65 20 56 44 42 45 20 63 6f 64 65 20 74 6f 20  te VDBE code to 
12b60 65 72 61 73 65 20 74 61 62 6c 65 20 70 54 61 62  erase table pTab
12b70 20 61 6e 64 20 61 6c 6c 20 61 73 73 6f 63 69 61   and all associa
12b80 74 65 64 20 69 6e 64 69 63 65 73 20 6f 6e 20 64  ted indices on d
12b90 69 73 6b 2e 0a 2a 2a 20 43 6f 64 65 20 74 6f 20  isk..** Code to 
12ba0 75 70 64 61 74 65 20 74 68 65 20 73 71 6c 69 74  update the sqlit
12bb0 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 73 20  e_master tables 
12bc0 61 6e 64 20 69 6e 74 65 72 6e 61 6c 20 73 63 68  and internal sch
12bd0 65 6d 61 20 64 65 66 69 6e 69 74 69 6f 6e 73 0a  ema definitions.
12be0 2a 2a 20 69 6e 20 63 61 73 65 20 61 20 72 6f 6f  ** in case a roo
12bf0 74 2d 70 61 67 65 20 62 65 6c 6f 6e 67 69 6e 67  t-page belonging
12c00 20 74 6f 20 61 6e 6f 74 68 65 72 20 74 61 62 6c   to another tabl
12c10 65 20 69 73 20 6d 6f 76 65 64 20 62 79 20 74 68  e is moved by th
12c20 65 20 62 74 72 65 65 20 6c 61 79 65 72 0a 2a 2a  e btree layer.**
12c30 20 69 73 20 61 6c 73 6f 20 61 64 64 65 64 20 28   is also added (
12c40 74 68 69 73 20 63 61 6e 20 68 61 70 70 65 6e 20  this can happen 
12c50 77 69 74 68 20 61 6e 20 61 75 74 6f 2d 76 61 63  with an auto-vac
12c60 75 75 6d 20 64 61 74 61 62 61 73 65 29 2e 0a 2a  uum database)..*
12c70 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64 65  /.static void de
12c80 73 74 72 6f 79 54 61 62 6c 65 28 50 61 72 73 65  stroyTable(Parse
12c90 20 2a 70 50 61 72 73 65 2c 20 54 61 62 6c 65 20   *pParse, Table 
12ca0 2a 70 54 61 62 29 7b 0a 23 69 66 64 65 66 20 53  *pTab){.#ifdef S
12cb0 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
12cc0 41 43 55 55 4d 0a 20 20 49 6e 64 65 78 20 2a 70  ACUUM.  Index *p
12cd0 49 64 78 3b 0a 20 20 69 6e 74 20 69 44 62 20 3d  Idx;.  int iDb =
12ce0 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f   sqlite3SchemaTo
12cf0 49 6e 64 65 78 28 70 50 61 72 73 65 2d 3e 64 62  Index(pParse->db
12d00 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29  , pTab->pSchema)
12d10 3b 0a 20 20 64 65 73 74 72 6f 79 52 6f 6f 74 50  ;.  destroyRootP
12d20 61 67 65 28 70 50 61 72 73 65 2c 20 70 54 61 62  age(pParse, pTab
12d30 2d 3e 74 6e 75 6d 2c 20 69 44 62 29 3b 0a 20 20  ->tnum, iDb);.  
12d40 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70  for(pIdx=pTab->p
12d50 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64  Index; pIdx; pId
12d60 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a  x=pIdx->pNext){.
12d70 20 20 20 20 64 65 73 74 72 6f 79 52 6f 6f 74 50      destroyRootP
12d80 61 67 65 28 70 50 61 72 73 65 2c 20 70 49 64 78  age(pParse, pIdx
12d90 2d 3e 74 6e 75 6d 2c 20 69 44 62 29 3b 0a 20 20  ->tnum, iDb);.  
12da0 7d 0a 23 65 6c 73 65 0a 20 20 2f 2a 20 49 66 20  }.#else.  /* If 
12db0 74 68 65 20 64 61 74 61 62 61 73 65 20 6d 61 79  the database may
12dc0 20 62 65 20 61 75 74 6f 2d 76 61 63 75 75 6d 20   be auto-vacuum 
12dd0 63 61 70 61 62 6c 65 20 28 69 66 20 53 51 4c 49  capable (if SQLI
12de0 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
12df0 55 4d 0a 20 20 2a 2a 20 69 73 20 6e 6f 74 20 64  UM.  ** is not d
12e00 65 66 69 6e 65 64 29 2c 20 74 68 65 6e 20 69 74  efined), then it
12e10 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f   is important to
12e20 20 63 61 6c 6c 20 4f 50 5f 44 65 73 74 72 6f 79   call OP_Destroy
12e30 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 74 61 62   on the.  ** tab
12e40 6c 65 20 61 6e 64 20 69 6e 64 65 78 20 72 6f 6f  le and index roo
12e50 74 2d 70 61 67 65 73 20 69 6e 20 6f 72 64 65 72  t-pages in order
12e60 2c 20 73 74 61 72 74 69 6e 67 20 77 69 74 68 20  , starting with 
12e70 74 68 65 20 6e 75 6d 65 72 69 63 61 6c 6c 79 20  the numerically 
12e80 0a 20 20 2a 2a 20 6c 61 72 67 65 73 74 20 72 6f  .  ** largest ro
12e90 6f 74 2d 70 61 67 65 20 6e 75 6d 62 65 72 2e 20  ot-page number. 
12ea0 54 68 69 73 20 67 75 61 72 61 6e 74 65 65 73 20  This guarantees 
12eb0 74 68 61 74 20 6e 6f 6e 65 20 6f 66 20 74 68 65  that none of the
12ec0 20 72 6f 6f 74 2d 70 61 67 65 73 0a 20 20 2a 2a   root-pages.  **
12ed0 20 74 6f 20 62 65 20 64 65 73 74 72 6f 79 65 64   to be destroyed
12ee0 20 69 73 20 72 65 6c 6f 63 61 74 65 64 20 62 79   is relocated by
12ef0 20 61 6e 20 65 61 72 6c 69 65 72 20 4f 50 5f 44   an earlier OP_D
12f00 65 73 74 72 6f 79 2e 20 69 2e 65 2e 20 69 66 20  estroy. i.e. if 
12f10 74 68 65 0a 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69  the.  ** followi
12f20 6e 67 20 77 65 72 65 20 63 6f 64 65 64 3a 0a 20  ng were coded:. 
12f30 20 2a 2a 0a 20 20 2a 2a 20 4f 50 5f 44 65 73 74   **.  ** OP_Dest
12f40 72 6f 79 20 34 20 30 0a 20 20 2a 2a 20 2e 2e 2e  roy 4 0.  ** ...
12f50 0a 20 20 2a 2a 20 4f 50 5f 44 65 73 74 72 6f 79  .  ** OP_Destroy
12f60 20 35 20 30 0a 20 20 2a 2a 0a 20 20 2a 2a 20 61   5 0.  **.  ** a
12f70 6e 64 20 72 6f 6f 74 20 70 61 67 65 20 35 20 68  nd root page 5 h
12f80 61 70 70 65 6e 65 64 20 74 6f 20 62 65 20 74 68  appened to be th
12f90 65 20 6c 61 72 67 65 73 74 20 72 6f 6f 74 2d 70  e largest root-p
12fa0 61 67 65 20 6e 75 6d 62 65 72 20 69 6e 20 74 68  age number in th
12fb0 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 2c  e.  ** database,
12fc0 20 74 68 65 6e 20 72 6f 6f 74 20 70 61 67 65 20   then root page 
12fd0 35 20 77 6f 75 6c 64 20 62 65 20 6d 6f 76 65 64  5 would be moved
12fe0 20 74 6f 20 70 61 67 65 20 34 20 62 79 20 74 68   to page 4 by th
12ff0 65 20 0a 20 20 2a 2a 20 22 4f 50 5f 44 65 73 74  e .  ** "OP_Dest
13000 72 6f 79 20 34 20 30 22 20 6f 70 63 6f 64 65 2e  roy 4 0" opcode.
13010 20 54 68 65 20 73 75 62 73 65 71 75 65 6e 74 20   The subsequent 
13020 22 4f 50 5f 44 65 73 74 72 6f 79 20 35 20 30 22  "OP_Destroy 5 0"
13030 20 77 6f 75 6c 64 20 68 69 74 0a 20 20 2a 2a 20   would hit.  ** 
13040 61 20 66 72 65 65 2d 6c 69 73 74 20 70 61 67 65  a free-list page
13050 2e 0a 20 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61  ..  */.  int iTa
13060 62 20 3d 20 70 54 61 62 2d 3e 74 6e 75 6d 3b 0a  b = pTab->tnum;.
13070 20 20 69 6e 74 20 69 44 65 73 74 72 6f 79 65 64    int iDestroyed
13080 20 3d 20 30 3b 0a 0a 20 20 77 68 69 6c 65 28 20   = 0;..  while( 
13090 31 20 29 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a  1 ){.    Index *
130a0 70 49 64 78 3b 0a 20 20 20 20 69 6e 74 20 69 4c  pIdx;.    int iL
130b0 61 72 67 65 73 74 20 3d 20 30 3b 0a 0a 20 20 20  argest = 0;..   
130c0 20 69 66 28 20 69 44 65 73 74 72 6f 79 65 64 3d   if( iDestroyed=
130d0 3d 30 20 7c 7c 20 69 54 61 62 3c 69 44 65 73 74  =0 || iTab<iDest
130e0 72 6f 79 65 64 20 29 7b 0a 20 20 20 20 20 20 69  royed ){.      i
130f0 4c 61 72 67 65 73 74 20 3d 20 69 54 61 62 3b 0a  Largest = iTab;.
13100 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 70 49      }.    for(pI
13110 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b  dx=pTab->pIndex;
13120 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78   pIdx; pIdx=pIdx
13130 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20  ->pNext){.      
13140 69 6e 74 20 69 49 64 78 20 3d 20 70 49 64 78 2d  int iIdx = pIdx-
13150 3e 74 6e 75 6d 3b 0a 20 20 20 20 20 20 61 73 73  >tnum;.      ass
13160 65 72 74 28 20 70 49 64 78 2d 3e 70 53 63 68 65  ert( pIdx->pSche
13170 6d 61 3d 3d 70 54 61 62 2d 3e 70 53 63 68 65 6d  ma==pTab->pSchem
13180 61 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28  a );.      if( (
13190 69 44 65 73 74 72 6f 79 65 64 3d 3d 30 20 7c 7c  iDestroyed==0 ||
131a0 20 28 69 49 64 78 3c 69 44 65 73 74 72 6f 79 65   (iIdx<iDestroye
131b0 64 29 29 20 26 26 20 69 49 64 78 3e 69 4c 61 72  d)) && iIdx>iLar
131c0 67 65 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20  gest ){.        
131d0 69 4c 61 72 67 65 73 74 20 3d 20 69 49 64 78 3b  iLargest = iIdx;
131e0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
131f0 20 20 20 69 66 28 20 69 4c 61 72 67 65 73 74 3d     if( iLargest=
13200 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  =0 ){.      retu
13210 72 6e 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  rn;.    }else{. 
13220 20 20 20 20 20 69 6e 74 20 69 44 62 20 3d 20 73       int iDb = s
13230 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e  qlite3SchemaToIn
13240 64 65 78 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  dex(pParse->db, 
13250 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a  pTab->pSchema);.
13260 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 44        assert( iD
13270 62 3e 3d 30 20 26 26 20 69 44 62 3c 70 50 61 72  b>=0 && iDb<pPar
13280 73 65 2d 3e 64 62 2d 3e 6e 44 62 20 29 3b 0a 20  se->db->nDb );. 
13290 20 20 20 20 20 64 65 73 74 72 6f 79 52 6f 6f 74       destroyRoot
132a0 50 61 67 65 28 70 50 61 72 73 65 2c 20 69 4c 61  Page(pParse, iLa
132b0 72 67 65 73 74 2c 20 69 44 62 29 3b 0a 20 20 20  rgest, iDb);.   
132c0 20 20 20 69 44 65 73 74 72 6f 79 65 64 20 3d 20     iDestroyed = 
132d0 69 4c 61 72 67 65 73 74 3b 0a 20 20 20 20 7d 0a  iLargest;.    }.
132e0 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a    }.#endif.}../*
132f0 0a 2a 2a 20 52 65 6d 6f 76 65 20 65 6e 74 72 69  .** Remove entri
13300 65 73 20 66 72 6f 6d 20 74 68 65 20 73 71 6c 69  es from the sqli
13310 74 65 5f 73 74 61 74 4e 20 74 61 62 6c 65 73 20  te_statN tables 
13320 28 66 6f 72 20 4e 20 69 6e 20 28 31 2c 32 2c 33  (for N in (1,2,3
13330 29 29 0a 2a 2a 20 61 66 74 65 72 20 61 20 44 52  )).** after a DR
13340 4f 50 20 49 4e 44 45 58 20 6f 72 20 44 52 4f 50  OP INDEX or DROP
13350 20 54 41 42 4c 45 20 63 6f 6d 6d 61 6e 64 2e 0a   TABLE command..
13360 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
13370 71 6c 69 74 65 33 43 6c 65 61 72 53 74 61 74 54  qlite3ClearStatT
13380 61 62 6c 65 73 28 0a 20 20 50 61 72 73 65 20 2a  ables(.  Parse *
13390 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
133a0 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20 63  /* The parsing c
133b0 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20  ontext */.  int 
133c0 69 44 62 2c 20 20 20 20 20 20 20 20 20 20 20 20  iDb,            
133d0 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61     /* The databa
133e0 73 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 63  se number */.  c
133f0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 79 70 65  onst char *zType
13400 2c 20 20 20 20 20 2f 2a 20 22 69 64 78 22 20 6f  ,     /* "idx" o
13410 72 20 22 74 62 6c 22 20 2a 2f 0a 20 20 63 6f 6e  r "tbl" */.  con
13420 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 20  st char *zName  
13430 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 69      /* Name of i
13440 6e 64 65 78 20 6f 72 20 74 61 62 6c 65 20 2a 2f  ndex or table */
13450 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63  .){.  int i;.  c
13460 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 4e 61  onst char *zDbNa
13470 6d 65 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d  me = pParse->db-
13480 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 3b  >aDb[iDb].zName;
13490 0a 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 3d 34  .  for(i=1; i<=4
134a0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 68 61 72  ; i++){.    char
134b0 20 7a 54 61 62 5b 32 34 5d 3b 0a 20 20 20 20 73   zTab[24];.    s
134c0 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
134d0 73 69 7a 65 6f 66 28 7a 54 61 62 29 2c 7a 54 61  sizeof(zTab),zTa
134e0 62 2c 22 73 71 6c 69 74 65 5f 73 74 61 74 25 64  b,"sqlite_stat%d
134f0 22 2c 69 29 3b 0a 20 20 20 20 69 66 28 20 73 71  ",i);.    if( sq
13500 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28 70  lite3FindTable(p
13510 50 61 72 73 65 2d 3e 64 62 2c 20 7a 54 61 62 2c  Parse->db, zTab,
13520 20 7a 44 62 4e 61 6d 65 29 20 29 7b 0a 20 20 20   zDbName) ){.   
13530 20 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64     sqlite3Nested
13540 50 61 72 73 65 28 70 50 61 72 73 65 2c 0a 20 20  Parse(pParse,.  
13550 20 20 20 20 20 20 22 44 45 4c 45 54 45 20 46 52        "DELETE FR
13560 4f 4d 20 25 51 2e 25 73 20 57 48 45 52 45 20 25  OM %Q.%s WHERE %
13570 73 3d 25 51 22 2c 0a 20 20 20 20 20 20 20 20 7a  s=%Q",.        z
13580 44 62 4e 61 6d 65 2c 20 7a 54 61 62 2c 20 7a 54  DbName, zTab, zT
13590 79 70 65 2c 20 7a 4e 61 6d 65 0a 20 20 20 20 20  ype, zName.     
135a0 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a   );.    }.  }.}.
135b0 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
135c0 63 6f 64 65 20 74 6f 20 64 72 6f 70 20 61 20 74  code to drop a t
135d0 61 62 6c 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  able..*/.void sq
135e0 6c 69 74 65 33 43 6f 64 65 44 72 6f 70 54 61 62  lite3CodeDropTab
135f0 6c 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  le(Parse *pParse
13600 2c 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 69  , Table *pTab, i
13610 6e 74 20 69 44 62 2c 20 69 6e 74 20 69 73 56 69  nt iDb, int isVi
13620 65 77 29 7b 0a 20 20 56 64 62 65 20 2a 76 3b 0a  ew){.  Vdbe *v;.
13630 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
13640 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 54 72  pParse->db;.  Tr
13650 69 67 67 65 72 20 2a 70 54 72 69 67 67 65 72 3b  igger *pTrigger;
13660 0a 20 20 44 62 20 2a 70 44 62 20 3d 20 26 64 62  .  Db *pDb = &db
13670 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a 0a 20 20 76  ->aDb[iDb];..  v
13680 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
13690 65 28 70 50 61 72 73 65 29 3b 0a 20 20 61 73 73  e(pParse);.  ass
136a0 65 72 74 28 20 76 21 3d 30 20 29 3b 0a 20 20 73  ert( v!=0 );.  s
136b0 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74 65  qlite3BeginWrite
136c0 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65  Operation(pParse
136d0 2c 20 31 2c 20 69 44 62 29 3b 0a 0a 23 69 66 6e  , 1, iDb);..#ifn
136e0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
136f0 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 69  VIRTUALTABLE.  i
13700 66 28 20 49 73 56 69 72 74 75 61 6c 28 70 54 61  f( IsVirtual(pTa
13710 62 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  b) ){.    sqlite
13720 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f  3VdbeAddOp0(v, O
13730 50 5f 56 42 65 67 69 6e 29 3b 0a 20 20 7d 0a 23  P_VBegin);.  }.#
13740 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 44 72 6f 70  endif..  /* Drop
13750 20 61 6c 6c 20 74 72 69 67 67 65 72 73 20 61 73   all triggers as
13760 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
13770 65 20 74 61 62 6c 65 20 62 65 69 6e 67 20 64 72  e table being dr
13780 6f 70 70 65 64 2e 20 43 6f 64 65 0a 20 20 2a 2a  opped. Code.  **
13790 20 69 73 20 67 65 6e 65 72 61 74 65 64 20 74 6f   is generated to
137a0 20 72 65 6d 6f 76 65 20 65 6e 74 72 69 65 73 20   remove entries 
137b0 66 72 6f 6d 20 73 71 6c 69 74 65 5f 6d 61 73 74  from sqlite_mast
137c0 65 72 20 61 6e 64 2f 6f 72 0a 20 20 2a 2a 20 73  er and/or.  ** s
137d0 71 6c 69 74 65 5f 74 65 6d 70 5f 6d 61 73 74 65  qlite_temp_maste
137e0 72 20 69 66 20 72 65 71 75 69 72 65 64 2e 0a 20  r if required.. 
137f0 20 2a 2f 0a 20 20 70 54 72 69 67 67 65 72 20 3d   */.  pTrigger =
13800 20 73 71 6c 69 74 65 33 54 72 69 67 67 65 72 4c   sqlite3TriggerL
13810 69 73 74 28 70 50 61 72 73 65 2c 20 70 54 61 62  ist(pParse, pTab
13820 29 3b 0a 20 20 77 68 69 6c 65 28 20 70 54 72 69  );.  while( pTri
13830 67 67 65 72 20 29 7b 0a 20 20 20 20 61 73 73 65  gger ){.    asse
13840 72 74 28 20 70 54 72 69 67 67 65 72 2d 3e 70 53  rt( pTrigger->pS
13850 63 68 65 6d 61 3d 3d 70 54 61 62 2d 3e 70 53 63  chema==pTab->pSc
13860 68 65 6d 61 20 7c 7c 20 0a 20 20 20 20 20 20 20  hema || .       
13870 20 70 54 72 69 67 67 65 72 2d 3e 70 53 63 68 65   pTrigger->pSche
13880 6d 61 3d 3d 64 62 2d 3e 61 44 62 5b 31 5d 2e 70  ma==db->aDb[1].p
13890 53 63 68 65 6d 61 20 29 3b 0a 20 20 20 20 73 71  Schema );.    sq
138a0 6c 69 74 65 33 44 72 6f 70 54 72 69 67 67 65 72  lite3DropTrigger
138b0 50 74 72 28 70 50 61 72 73 65 2c 20 70 54 72 69  Ptr(pParse, pTri
138c0 67 67 65 72 29 3b 0a 20 20 20 20 70 54 72 69 67  gger);.    pTrig
138d0 67 65 72 20 3d 20 70 54 72 69 67 67 65 72 2d 3e  ger = pTrigger->
138e0 70 4e 65 78 74 3b 0a 20 20 7d 0a 0a 23 69 66 6e  pNext;.  }..#ifn
138f0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
13900 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 0a 20 20  AUTOINCREMENT.  
13910 2f 2a 20 52 65 6d 6f 76 65 20 61 6e 79 20 65 6e  /* Remove any en
13920 74 72 69 65 73 20 6f 66 20 74 68 65 20 73 71 6c  tries of the sql
13930 69 74 65 5f 73 65 71 75 65 6e 63 65 20 74 61 62  ite_sequence tab
13940 6c 65 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  le associated wi
13950 74 68 0a 20 20 2a 2a 20 74 68 65 20 74 61 62 6c  th.  ** the tabl
13960 65 20 62 65 69 6e 67 20 64 72 6f 70 70 65 64 2e  e being dropped.
13970 20 54 68 69 73 20 69 73 20 64 6f 6e 65 20 62 65   This is done be
13980 66 6f 72 65 20 74 68 65 20 74 61 62 6c 65 20 69  fore the table i
13990 73 20 64 72 6f 70 70 65 64 0a 20 20 2a 2a 20 61  s dropped.  ** a
139a0 74 20 74 68 65 20 62 74 72 65 65 20 6c 65 76 65  t the btree leve
139b0 6c 2c 20 69 6e 20 63 61 73 65 20 74 68 65 20 73  l, in case the s
139c0 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 20 74  qlite_sequence t
139d0 61 62 6c 65 20 6e 65 65 64 73 20 74 6f 0a 20 20  able needs to.  
139e0 2a 2a 20 6d 6f 76 65 20 61 73 20 61 20 72 65 73  ** move as a res
139f0 75 6c 74 20 6f 66 20 74 68 65 20 64 72 6f 70 20  ult of the drop 
13a00 28 63 61 6e 20 68 61 70 70 65 6e 20 69 6e 20 61  (can happen in a
13a10 75 74 6f 2d 76 61 63 75 75 6d 20 6d 6f 64 65 29  uto-vacuum mode)
13a20 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 54 61  ..  */.  if( pTa
13a30 62 2d 3e 74 61 62 46 6c 61 67 73 20 26 20 54 46  b->tabFlags & TF
13a40 5f 41 75 74 6f 69 6e 63 72 65 6d 65 6e 74 20 29  _Autoincrement )
13a50 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4e 65 73  {.    sqlite3Nes
13a60 74 65 64 50 61 72 73 65 28 70 50 61 72 73 65 2c  tedParse(pParse,
13a70 0a 20 20 20 20 20 20 22 44 45 4c 45 54 45 20 46  .      "DELETE F
13a80 52 4f 4d 20 25 51 2e 73 71 6c 69 74 65 5f 73 65  ROM %Q.sqlite_se
13a90 71 75 65 6e 63 65 20 57 48 45 52 45 20 6e 61 6d  quence WHERE nam
13aa0 65 3d 25 51 22 2c 0a 20 20 20 20 20 20 70 44 62  e=%Q",.      pDb
13ab0 2d 3e 7a 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 7a  ->zName, pTab->z
13ac0 4e 61 6d 65 0a 20 20 20 20 29 3b 0a 20 20 7d 0a  Name.    );.  }.
13ad0 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 44 72 6f  #endif..  /* Dro
13ae0 70 20 61 6c 6c 20 53 51 4c 49 54 45 5f 4d 41 53  p all SQLITE_MAS
13af0 54 45 52 20 74 61 62 6c 65 20 61 6e 64 20 69 6e  TER table and in
13b00 64 65 78 20 65 6e 74 72 69 65 73 20 74 68 61 74  dex entries that
13b10 20 72 65 66 65 72 20 74 6f 20 74 68 65 0a 20 20   refer to the.  
13b20 2a 2a 20 74 61 62 6c 65 2e 20 54 68 65 20 70 72  ** table. The pr
13b30 6f 67 72 61 6d 20 6e 61 6d 65 20 6c 6f 6f 70 73  ogram name loops
13b40 20 74 68 72 6f 75 67 68 20 74 68 65 20 6d 61 73   through the mas
13b50 74 65 72 20 74 61 62 6c 65 20 61 6e 64 20 64 65  ter table and de
13b60 6c 65 74 65 73 0a 20 20 2a 2a 20 65 76 65 72 79  letes.  ** every
13b70 20 72 6f 77 20 74 68 61 74 20 72 65 66 65 72 73   row that refers
13b80 20 74 6f 20 61 20 74 61 62 6c 65 20 6f 66 20 74   to a table of t
13b90 68 65 20 73 61 6d 65 20 6e 61 6d 65 20 61 73 20  he same name as 
13ba0 74 68 65 20 6f 6e 65 20 62 65 69 6e 67 0a 20 20  the one being.  
13bb0 2a 2a 20 64 72 6f 70 70 65 64 2e 20 54 72 69 67  ** dropped. Trig
13bc0 67 65 72 73 20 61 72 65 20 68 61 6e 64 6c 65 64  gers are handled
13bd0 20 73 65 70 61 72 61 74 65 6c 79 20 62 65 63 61   separately beca
13be0 75 73 65 20 61 20 74 72 69 67 67 65 72 20 63 61  use a trigger ca
13bf0 6e 20 62 65 0a 20 20 2a 2a 20 63 72 65 61 74 65  n be.  ** create
13c00 64 20 69 6e 20 74 68 65 20 74 65 6d 70 20 64 61  d in the temp da
13c10 74 61 62 61 73 65 20 74 68 61 74 20 72 65 66 65  tabase that refe
13c20 72 73 20 74 6f 20 61 20 74 61 62 6c 65 20 69 6e  rs to a table in
13c30 20 61 6e 6f 74 68 65 72 0a 20 20 2a 2a 20 64 61   another.  ** da
13c40 74 61 62 61 73 65 2e 0a 20 20 2a 2f 0a 20 20 73  tabase..  */.  s
13c50 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72 73  qlite3NestedPars
13c60 65 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20  e(pParse, .     
13c70 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 25 51   "DELETE FROM %Q
13c80 2e 25 73 20 57 48 45 52 45 20 74 62 6c 5f 6e 61  .%s WHERE tbl_na
13c90 6d 65 3d 25 51 20 61 6e 64 20 74 79 70 65 21 3d  me=%Q and type!=
13ca0 27 74 72 69 67 67 65 72 27 22 2c 0a 20 20 20 20  'trigger'",.    
13cb0 20 20 70 44 62 2d 3e 7a 4e 61 6d 65 2c 20 53 43    pDb->zName, SC
13cc0 48 45 4d 41 5f 54 41 42 4c 45 28 69 44 62 29 2c  HEMA_TABLE(iDb),
13cd0 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20   pTab->zName);. 
13ce0 20 69 66 28 20 21 69 73 56 69 65 77 20 26 26 20   if( !isView && 
13cf0 21 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29  !IsVirtual(pTab)
13d00 20 29 7b 0a 20 20 20 20 64 65 73 74 72 6f 79 54   ){.    destroyT
13d10 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70 54 61  able(pParse, pTa
13d20 62 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65  b);.  }..  /* Re
13d30 6d 6f 76 65 20 74 68 65 20 74 61 62 6c 65 20 65  move the table e
13d40 6e 74 72 79 20 66 72 6f 6d 20 53 51 4c 69 74 65  ntry from SQLite
13d50 27 73 20 69 6e 74 65 72 6e 61 6c 20 73 63 68 65  's internal sche
13d60 6d 61 20 61 6e 64 20 6d 6f 64 69 66 79 0a 20 20  ma and modify.  
13d70 2a 2a 20 74 68 65 20 73 63 68 65 6d 61 20 63 6f  ** the schema co
13d80 6f 6b 69 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  okie..  */.  if(
13d90 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29   IsVirtual(pTab)
13da0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
13db0 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
13dc0 56 44 65 73 74 72 6f 79 2c 20 69 44 62 2c 20 30  VDestroy, iDb, 0
13dd0 2c 20 30 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  , 0, pTab->zName
13de0 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  , 0);.  }.  sqli
13df0 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
13e00 20 4f 50 5f 44 72 6f 70 54 61 62 6c 65 2c 20 69   OP_DropTable, i
13e10 44 62 2c 20 30 2c 20 30 2c 20 70 54 61 62 2d 3e  Db, 0, 0, pTab->
13e20 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 73 71 6c  zName, 0);.  sql
13e30 69 74 65 33 43 68 61 6e 67 65 43 6f 6f 6b 69 65  ite3ChangeCookie
13e40 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20  (pParse, iDb);. 
13e50 20 73 71 6c 69 74 65 56 69 65 77 52 65 73 65 74   sqliteViewReset
13e60 41 6c 6c 28 64 62 2c 20 69 44 62 29 3b 0a 7d 0a  All(db, iDb);.}.
13e70 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
13e80 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f  ine is called to
13e90 20 64 6f 20 74 68 65 20 77 6f 72 6b 20 6f 66 20   do the work of 
13ea0 61 20 44 52 4f 50 20 54 41 42 4c 45 20 73 74 61  a DROP TABLE sta
13eb0 74 65 6d 65 6e 74 2e 0a 2a 2a 20 70 4e 61 6d 65  tement..** pName
13ec0 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20   is the name of 
13ed0 74 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20  the table to be 
13ee0 64 72 6f 70 70 65 64 2e 0a 2a 2f 0a 76 6f 69 64  dropped..*/.void
13ef0 20 73 71 6c 69 74 65 33 44 72 6f 70 54 61 62 6c   sqlite3DropTabl
13f00 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
13f10 20 53 72 63 4c 69 73 74 20 2a 70 4e 61 6d 65 2c   SrcList *pName,
13f20 20 69 6e 74 20 69 73 56 69 65 77 2c 20 69 6e 74   int isView, int
13f30 20 6e 6f 45 72 72 29 7b 0a 20 20 54 61 62 6c 65   noErr){.  Table
13f40 20 2a 70 54 61 62 3b 0a 20 20 56 64 62 65 20 2a   *pTab;.  Vdbe *
13f50 76 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  v;.  sqlite3 *db
13f60 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
13f70 20 69 6e 74 20 69 44 62 3b 0a 0a 20 20 69 66 28   int iDb;..  if(
13f80 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
13f90 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78  d ){.    goto ex
13fa0 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20  it_drop_table;. 
13fb0 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 50 61   }.  assert( pPa
13fc0 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 29 3b 0a  rse->nErr==0 );.
13fd0 20 20 61 73 73 65 72 74 28 20 70 4e 61 6d 65 2d    assert( pName-
13fe0 3e 6e 53 72 63 3d 3d 31 20 29 3b 0a 20 20 69 66  >nSrc==1 );.  if
13ff0 28 20 73 71 6c 69 74 65 33 52 65 61 64 53 63 68  ( sqlite3ReadSch
14000 65 6d 61 28 70 50 61 72 73 65 29 20 29 20 67 6f  ema(pParse) ) go
14010 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62  to exit_drop_tab
14020 6c 65 3b 0a 20 20 69 66 28 20 6e 6f 45 72 72 20  le;.  if( noErr 
14030 29 20 64 62 2d 3e 73 75 70 70 72 65 73 73 45 72  ) db->suppressEr
14040 72 2b 2b 3b 0a 20 20 70 54 61 62 20 3d 20 73 71  r++;.  pTab = sq
14050 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62 6c 65  lite3LocateTable
14060 49 74 65 6d 28 70 50 61 72 73 65 2c 20 69 73 56  Item(pParse, isV
14070 69 65 77 2c 20 26 70 4e 61 6d 65 2d 3e 61 5b 30  iew, &pName->a[0
14080 5d 29 3b 0a 20 20 69 66 28 20 6e 6f 45 72 72 20  ]);.  if( noErr 
14090 29 20 64 62 2d 3e 73 75 70 70 72 65 73 73 45 72  ) db->suppressEr
140a0 72 2d 2d 3b 0a 0a 20 20 69 66 28 20 70 54 61 62  r--;..  if( pTab
140b0 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 6e  ==0 ){.    if( n
140c0 6f 45 72 72 20 29 20 73 71 6c 69 74 65 33 43 6f  oErr ) sqlite3Co
140d0 64 65 56 65 72 69 66 79 4e 61 6d 65 64 53 63 68  deVerifyNamedSch
140e0 65 6d 61 28 70 50 61 72 73 65 2c 20 70 4e 61 6d  ema(pParse, pNam
140f0 65 2d 3e 61 5b 30 5d 2e 7a 44 61 74 61 62 61 73  e->a[0].zDatabas
14100 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69  e);.    goto exi
14110 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20  t_drop_table;.  
14120 7d 0a 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65  }.  iDb = sqlite
14130 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64  3SchemaToIndex(d
14140 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61  b, pTab->pSchema
14150 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 44 62  );.  assert( iDb
14160 3e 3d 30 20 26 26 20 69 44 62 3c 64 62 2d 3e 6e  >=0 && iDb<db->n
14170 44 62 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 70  Db );..  /* If p
14180 54 61 62 20 69 73 20 61 20 76 69 72 74 75 61 6c  Tab is a virtual
14190 20 74 61 62 6c 65 2c 20 63 61 6c 6c 20 56 69 65   table, call Vie
141a0 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28  wGetColumnNames(
141b0 29 20 74 6f 20 65 6e 73 75 72 65 0a 20 20 2a 2a  ) to ensure.  **
141c0 20 69 74 20 69 73 20 69 6e 69 74 69 61 6c 69 7a   it is initializ
141d0 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 49  ed..  */.  if( I
141e0 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 26  sVirtual(pTab) &
141f0 26 20 73 71 6c 69 74 65 33 56 69 65 77 47 65 74  & sqlite3ViewGet
14200 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72  ColumnNames(pPar
14210 73 65 2c 20 70 54 61 62 29 20 29 7b 0a 20 20 20  se, pTab) ){.   
14220 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f   goto exit_drop_
14230 74 61 62 6c 65 3b 0a 20 20 7d 0a 23 69 66 6e 64  table;.  }.#ifnd
14240 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
14250 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 7b  UTHORIZATION.  {
14260 0a 20 20 20 20 69 6e 74 20 63 6f 64 65 3b 0a 20  .    int code;. 
14270 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
14280 54 61 62 20 3d 20 53 43 48 45 4d 41 5f 54 41 42  Tab = SCHEMA_TAB
14290 4c 45 28 69 44 62 29 3b 0a 20 20 20 20 63 6f 6e  LE(iDb);.    con
142a0 73 74 20 63 68 61 72 20 2a 7a 44 62 20 3d 20 64  st char *zDb = d
142b0 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d  b->aDb[iDb].zNam
142c0 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  e;.    const cha
142d0 72 20 2a 7a 41 72 67 32 20 3d 20 30 3b 0a 20 20  r *zArg2 = 0;.  
142e0 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74    if( sqlite3Aut
142f0 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53  hCheck(pParse, S
14300 51 4c 49 54 45 5f 44 45 4c 45 54 45 2c 20 7a 54  QLITE_DELETE, zT
14310 61 62 2c 20 30 2c 20 7a 44 62 29 29 7b 0a 20 20  ab, 0, zDb)){.  
14320 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72      goto exit_dr
14330 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 20 20 7d 0a  op_table;.    }.
14340 20 20 20 20 69 66 28 20 69 73 56 69 65 77 20 29      if( isView )
14350 7b 0a 20 20 20 20 20 20 69 66 28 20 21 4f 4d 49  {.      if( !OMI
14360 54 5f 54 45 4d 50 44 42 20 26 26 20 69 44 62 3d  T_TEMPDB && iDb=
14370 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f  =1 ){.        co
14380 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50  de = SQLITE_DROP
14390 5f 54 45 4d 50 5f 56 49 45 57 3b 0a 20 20 20 20  _TEMP_VIEW;.    
143a0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
143b0 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44   code = SQLITE_D
143c0 52 4f 50 5f 56 49 45 57 3b 0a 20 20 20 20 20 20  ROP_VIEW;.      
143d0 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
143e0 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
143f0 4c 45 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  LE.    }else if(
14400 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29   IsVirtual(pTab)
14410 20 29 7b 0a 20 20 20 20 20 20 63 6f 64 65 20 3d   ){.      code =
14420 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 56 54 41   SQLITE_DROP_VTA
14430 42 4c 45 3b 0a 20 20 20 20 20 20 7a 41 72 67 32  BLE;.      zArg2
14440 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 54 61   = sqlite3GetVTa
14450 62 6c 65 28 64 62 2c 20 70 54 61 62 29 2d 3e 70  ble(db, pTab)->p
14460 4d 6f 64 2d 3e 7a 4e 61 6d 65 3b 0a 23 65 6e 64  Mod->zName;.#end
14470 69 66 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  if.    }else{.  
14480 20 20 20 20 69 66 28 20 21 4f 4d 49 54 5f 54 45      if( !OMIT_TE
14490 4d 50 44 42 20 26 26 20 69 44 62 3d 3d 31 20 29  MPDB && iDb==1 )
144a0 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20 3d  {.        code =
144b0 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d   SQLITE_DROP_TEM
144c0 50 5f 54 41 42 4c 45 3b 0a 20 20 20 20 20 20 7d  P_TABLE;.      }
144d0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 63 6f  else{.        co
144e0 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50  de = SQLITE_DROP
144f0 5f 54 41 42 4c 45 3b 0a 20 20 20 20 20 20 7d 0a  _TABLE;.      }.
14500 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 71      }.    if( sq
14510 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70  lite3AuthCheck(p
14520 50 61 72 73 65 2c 20 63 6f 64 65 2c 20 70 54 61  Parse, code, pTa
14530 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 41 72 67 32 2c  b->zName, zArg2,
14540 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20 67   zDb) ){.      g
14550 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61  oto exit_drop_ta
14560 62 6c 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ble;.    }.    i
14570 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68  f( sqlite3AuthCh
14580 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49  eck(pParse, SQLI
14590 54 45 5f 44 45 4c 45 54 45 2c 20 70 54 61 62 2d  TE_DELETE, pTab-
145a0 3e 7a 4e 61 6d 65 2c 20 30 2c 20 7a 44 62 29 20  >zName, 0, zDb) 
145b0 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78  ){.      goto ex
145c0 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20  it_drop_table;. 
145d0 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
145e0 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72    if( sqlite3Str
145f0 4e 49 43 6d 70 28 70 54 61 62 2d 3e 7a 4e 61 6d  NICmp(pTab->zNam
14600 65 2c 20 22 73 71 6c 69 74 65 5f 22 2c 20 37 29  e, "sqlite_", 7)
14610 3d 3d 30 20 0a 20 20 20 20 26 26 20 73 71 6c 69  ==0 .    && sqli
14620 74 65 33 53 74 72 4e 49 43 6d 70 28 70 54 61 62  te3StrNICmp(pTab
14630 2d 3e 7a 4e 61 6d 65 2c 20 22 73 71 6c 69 74 65  ->zName, "sqlite
14640 5f 73 74 61 74 22 2c 20 31 31 29 21 3d 30 20 29  _stat", 11)!=0 )
14650 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
14660 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74  orMsg(pParse, "t
14670 61 62 6c 65 20 25 73 20 6d 61 79 20 6e 6f 74 20  able %s may not 
14680 62 65 20 64 72 6f 70 70 65 64 22 2c 20 70 54 61  be dropped", pTa
14690 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 67  b->zName);.    g
146a0 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61  oto exit_drop_ta
146b0 62 6c 65 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65  ble;.  }..#ifnde
146c0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
146d0 45 57 0a 20 20 2f 2a 20 45 6e 73 75 72 65 20 44  EW.  /* Ensure D
146e0 52 4f 50 20 54 41 42 4c 45 20 69 73 20 6e 6f 74  ROP TABLE is not
146f0 20 75 73 65 64 20 6f 6e 20 61 20 76 69 65 77 2c   used on a view,
14700 20 61 6e 64 20 44 52 4f 50 20 56 49 45 57 20 69   and DROP VIEW i
14710 73 20 6e 6f 74 20 75 73 65 64 0a 20 20 2a 2a 20  s not used.  ** 
14720 6f 6e 20 61 20 74 61 62 6c 65 2e 0a 20 20 2a 2f  on a table..  */
14730 0a 20 20 69 66 28 20 69 73 56 69 65 77 20 26 26  .  if( isView &&
14740 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 3d 3d   pTab->pSelect==
14750 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
14760 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
14770 20 22 75 73 65 20 44 52 4f 50 20 54 41 42 4c 45   "use DROP TABLE
14780 20 74 6f 20 64 65 6c 65 74 65 20 74 61 62 6c 65   to delete table
14790 20 25 73 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d   %s", pTab->zNam
147a0 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69  e);.    goto exi
147b0 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20  t_drop_table;.  
147c0 7d 0a 20 20 69 66 28 20 21 69 73 56 69 65 77 20  }.  if( !isView 
147d0 26 26 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74  && pTab->pSelect
147e0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
147f0 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
14800 22 75 73 65 20 44 52 4f 50 20 56 49 45 57 20 74  "use DROP VIEW t
14810 6f 20 64 65 6c 65 74 65 20 76 69 65 77 20 25 73  o delete view %s
14820 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b  ", pTab->zName);
14830 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64  .    goto exit_d
14840 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 23  rop_table;.  }.#
14850 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 47 65 6e 65  endif..  /* Gene
14860 72 61 74 65 20 63 6f 64 65 20 74 6f 20 72 65 6d  rate code to rem
14870 6f 76 65 20 74 68 65 20 74 61 62 6c 65 20 66 72  ove the table fr
14880 6f 6d 20 74 68 65 20 6d 61 73 74 65 72 20 74 61  om the master ta
14890 62 6c 65 0a 20 20 2a 2a 20 6f 6e 20 64 69 73 6b  ble.  ** on disk
148a0 2e 0a 20 20 2a 2f 0a 20 20 76 20 3d 20 73 71 6c  ..  */.  v = sql
148b0 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
148c0 73 65 29 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a  se);.  if( v ){.
148d0 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e      sqlite3Begin
148e0 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70  WriteOperation(p
148f0 50 61 72 73 65 2c 20 31 2c 20 69 44 62 29 3b 0a  Parse, 1, iDb);.
14900 20 20 20 20 73 71 6c 69 74 65 33 43 6c 65 61 72      sqlite3Clear
14910 53 74 61 74 54 61 62 6c 65 73 28 70 50 61 72 73  StatTables(pPars
14920 65 2c 20 69 44 62 2c 20 22 74 62 6c 22 2c 20 70  e, iDb, "tbl", p
14930 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  Tab->zName);.   
14940 20 73 71 6c 69 74 65 33 46 6b 44 72 6f 70 54 61   sqlite3FkDropTa
14950 62 6c 65 28 70 50 61 72 73 65 2c 20 70 4e 61 6d  ble(pParse, pNam
14960 65 2c 20 70 54 61 62 29 3b 0a 20 20 20 20 73 71  e, pTab);.    sq
14970 6c 69 74 65 33 43 6f 64 65 44 72 6f 70 54 61 62  lite3CodeDropTab
14980 6c 65 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c  le(pParse, pTab,
14990 20 69 44 62 2c 20 69 73 56 69 65 77 29 3b 0a 20   iDb, isView);. 
149a0 20 7d 0a 0a 65 78 69 74 5f 64 72 6f 70 5f 74 61   }..exit_drop_ta
149b0 62 6c 65 3a 0a 20 20 73 71 6c 69 74 65 33 53 72  ble:.  sqlite3Sr
149c0 63 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20  cListDelete(db, 
149d0 70 4e 61 6d 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pName);.}../*.**
149e0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
149f0 20 63 61 6c 6c 65 64 20 74 6f 20 63 72 65 61 74   called to creat
14a00 65 20 61 20 6e 65 77 20 66 6f 72 65 69 67 6e 20  e a new foreign 
14a10 6b 65 79 20 6f 6e 20 74 68 65 20 74 61 62 6c 65  key on the table
14a20 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 75 6e  .** currently un
14a30 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e  der construction
14a40 2e 20 20 70 46 72 6f 6d 43 6f 6c 20 64 65 74 65  .  pFromCol dete
14a50 72 6d 69 6e 65 73 20 77 68 69 63 68 20 63 6f 6c  rmines which col
14a60 75 6d 6e 73 0a 2a 2a 20 69 6e 20 74 68 65 20 63  umns.** in the c
14a70 75 72 72 65 6e 74 20 74 61 62 6c 65 20 70 6f 69  urrent table poi
14a80 6e 74 20 74 6f 20 74 68 65 20 66 6f 72 65 69 67  nt to the foreig
14a90 6e 20 6b 65 79 2e 20 20 49 66 20 70 46 72 6f 6d  n key.  If pFrom
14aa0 43 6f 6c 3d 3d 30 20 74 68 65 6e 0a 2a 2a 20 63  Col==0 then.** c
14ab0 6f 6e 6e 65 63 74 20 74 68 65 20 6b 65 79 20 74  onnect the key t
14ac0 6f 20 74 68 65 20 6c 61 73 74 20 63 6f 6c 75 6d  o the last colum
14ad0 6e 20 69 6e 73 65 72 74 65 64 2e 20 20 70 54 6f  n inserted.  pTo
14ae0 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 0a   is the name of.
14af0 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 72 65 66  ** the table ref
14b00 65 72 72 65 64 20 74 6f 20 28 61 2e 6b 2e 61 20  erred to (a.k.a 
14b10 74 68 65 20 22 70 61 72 65 6e 74 22 20 74 61 62  the "parent" tab
14b20 6c 65 29 2e 20 20 70 54 6f 43 6f 6c 20 69 73 20  le).  pToCol is 
14b30 61 20 6c 69 73 74 0a 2a 2a 20 6f 66 20 74 61 62  a list.** of tab
14b40 6c 65 73 20 69 6e 20 74 68 65 20 70 61 72 65 6e  les in the paren
14b50 74 20 70 54 6f 20 74 61 62 6c 65 2e 20 20 66 6c  t pTo table.  fl
14b60 61 67 73 20 63 6f 6e 74 61 69 6e 73 20 61 6c 6c  ags contains all
14b70 0a 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  .** information 
14b80 61 62 6f 75 74 20 74 68 65 20 63 6f 6e 66 6c 69  about the confli
14b90 63 74 20 72 65 73 6f 6c 75 74 69 6f 6e 20 61 6c  ct resolution al
14ba0 67 6f 72 69 74 68 6d 73 20 73 70 65 63 69 66 69  gorithms specifi
14bb0 65 64 0a 2a 2a 20 69 6e 20 74 68 65 20 4f 4e 20  ed.** in the ON 
14bc0 44 45 4c 45 54 45 2c 20 4f 4e 20 55 50 44 41 54  DELETE, ON UPDAT
14bd0 45 20 61 6e 64 20 4f 4e 20 49 4e 53 45 52 54 20  E and ON INSERT 
14be0 63 6c 61 75 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 41  clauses..**.** A
14bf0 6e 20 46 4b 65 79 20 73 74 72 75 63 74 75 72 65  n FKey structure
14c00 20 69 73 20 63 72 65 61 74 65 64 20 61 6e 64 20   is created and 
14c10 61 64 64 65 64 20 74 6f 20 74 68 65 20 74 61 62  added to the tab
14c20 6c 65 20 63 75 72 72 65 6e 74 6c 79 0a 2a 2a 20  le currently.** 
14c30 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69  under constructi
14c40 6f 6e 20 69 6e 20 74 68 65 20 70 50 61 72 73 65  on in the pParse
14c50 2d 3e 70 4e 65 77 54 61 62 6c 65 20 66 69 65 6c  ->pNewTable fiel
14c60 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 72  d..**.** The for
14c70 65 69 67 6e 20 6b 65 79 20 69 73 20 73 65 74 20  eign key is set 
14c80 66 6f 72 20 49 4d 4d 45 44 49 41 54 45 20 70 72  for IMMEDIATE pr
14c90 6f 63 65 73 73 69 6e 67 2e 20 20 41 20 73 75 62  ocessing.  A sub
14ca0 73 65 71 75 65 6e 74 20 63 61 6c 6c 0a 2a 2a 20  sequent call.** 
14cb0 74 6f 20 73 71 6c 69 74 65 33 44 65 66 65 72 46  to sqlite3DeferF
14cc0 6f 72 65 69 67 6e 4b 65 79 28 29 20 6d 69 67 68  oreignKey() migh
14cd0 74 20 63 68 61 6e 67 65 20 74 68 69 73 20 74 6f  t change this to
14ce0 20 44 45 46 45 52 52 45 44 2e 0a 2a 2f 0a 76 6f   DEFERRED..*/.vo
14cf0 69 64 20 73 71 6c 69 74 65 33 43 72 65 61 74 65  id sqlite3Create
14d00 46 6f 72 65 69 67 6e 4b 65 79 28 0a 20 20 50 61  ForeignKey(.  Pa
14d10 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
14d20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
14d30 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c  ntext */.  ExprL
14d40 69 73 74 20 2a 70 46 72 6f 6d 43 6f 6c 2c 20 20  ist *pFromCol,  
14d50 2f 2a 20 43 6f 6c 75 6d 6e 73 20 69 6e 20 74 68  /* Columns in th
14d60 69 73 20 74 61 62 6c 65 20 74 68 61 74 20 70 6f  is table that po
14d70 69 6e 74 20 74 6f 20 6f 74 68 65 72 20 74 61 62  int to other tab
14d80 6c 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  le */.  Token *p
14d90 54 6f 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  To,          /* 
14da0 4e 61 6d 65 20 6f 66 20 74 68 65 20 6f 74 68 65  Name of the othe
14db0 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20 45 78 70  r table */.  Exp
14dc0 72 4c 69 73 74 20 2a 70 54 6f 43 6f 6c 2c 20 20  rList *pToCol,  
14dd0 20 20 2f 2a 20 43 6f 6c 75 6d 6e 73 20 69 6e 20    /* Columns in 
14de0 74 68 65 20 6f 74 68 65 72 20 74 61 62 6c 65 20  the other table 
14df0 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 20  */.  int flags  
14e00 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e            /* Con
14e10 66 6c 69 63 74 20 72 65 73 6f 6c 75 74 69 6f 6e  flict resolution
14e20 20 61 6c 67 6f 72 69 74 68 6d 73 2e 20 2a 2f 0a   algorithms. */.
14e30 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
14e40 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 23   = pParse->db;.#
14e50 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
14e60 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 0a 20  IT_FOREIGN_KEY. 
14e70 20 46 4b 65 79 20 2a 70 46 4b 65 79 20 3d 20 30   FKey *pFKey = 0
14e80 3b 0a 20 20 46 4b 65 79 20 2a 70 4e 65 78 74 54  ;.  FKey *pNextT
14e90 6f 3b 0a 20 20 54 61 62 6c 65 20 2a 70 20 3d 20  o;.  Table *p = 
14ea0 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
14eb0 65 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a  e;.  int nByte;.
14ec0 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e    int i;.  int n
14ed0 43 6f 6c 3b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a  Col;.  char *z;.
14ee0 0a 20 20 61 73 73 65 72 74 28 20 70 54 6f 21 3d  .  assert( pTo!=
14ef0 30 20 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20  0 );.  if( p==0 
14f00 7c 7c 20 49 4e 5f 44 45 43 4c 41 52 45 5f 56 54  || IN_DECLARE_VT
14f10 41 42 20 29 20 67 6f 74 6f 20 66 6b 5f 65 6e 64  AB ) goto fk_end
14f20 3b 0a 20 20 69 66 28 20 70 46 72 6f 6d 43 6f 6c  ;.  if( pFromCol
14f30 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  ==0 ){.    int i
14f40 43 6f 6c 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b  Col = p->nCol-1;
14f50 0a 20 20 20 20 69 66 28 20 4e 45 56 45 52 28 69  .    if( NEVER(i
14f60 43 6f 6c 3c 30 29 20 29 20 67 6f 74 6f 20 66 6b  Col<0) ) goto fk
14f70 5f 65 6e 64 3b 0a 20 20 20 20 69 66 28 20 70 54  _end;.    if( pT
14f80 6f 43 6f 6c 20 26 26 20 70 54 6f 43 6f 6c 2d 3e  oCol && pToCol->
14f90 6e 45 78 70 72 21 3d 31 20 29 7b 0a 20 20 20 20  nExpr!=1 ){.    
14fa0 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
14fb0 67 28 70 50 61 72 73 65 2c 20 22 66 6f 72 65 69  g(pParse, "forei
14fc0 67 6e 20 6b 65 79 20 6f 6e 20 25 73 22 0a 20 20  gn key on %s".  
14fd0 20 20 20 20 20 20 20 22 20 73 68 6f 75 6c 64 20         " should 
14fe0 72 65 66 65 72 65 6e 63 65 20 6f 6e 6c 79 20 6f  reference only o
14ff0 6e 65 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 61 62  ne column of tab
15000 6c 65 20 25 54 22 2c 0a 20 20 20 20 20 20 20 20  le %T",.        
15010 20 70 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a   p->aCol[iCol].z
15020 4e 61 6d 65 2c 20 70 54 6f 29 3b 0a 20 20 20 20  Name, pTo);.    
15030 20 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20    goto fk_end;. 
15040 20 20 20 7d 0a 20 20 20 20 6e 43 6f 6c 20 3d 20     }.    nCol = 
15050 31 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  1;.  }else if( p
15060 54 6f 43 6f 6c 20 26 26 20 70 54 6f 43 6f 6c 2d  ToCol && pToCol-
15070 3e 6e 45 78 70 72 21 3d 70 46 72 6f 6d 43 6f 6c  >nExpr!=pFromCol
15080 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 73  ->nExpr ){.    s
15090 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
150a0 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20 22  Parse,.        "
150b0 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e  number of column
150c0 73 20 69 6e 20 66 6f 72 65 69 67 6e 20 6b 65 79  s in foreign key
150d0 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 20   does not match 
150e0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 22 0a  the number of ".
150f0 20 20 20 20 20 20 20 20 22 63 6f 6c 75 6d 6e 73          "columns
15100 20 69 6e 20 74 68 65 20 72 65 66 65 72 65 6e 63   in the referenc
15110 65 64 20 74 61 62 6c 65 22 29 3b 0a 20 20 20 20  ed table");.    
15120 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 7d  goto fk_end;.  }
15130 65 6c 73 65 7b 0a 20 20 20 20 6e 43 6f 6c 20 3d  else{.    nCol =
15140 20 70 46 72 6f 6d 43 6f 6c 2d 3e 6e 45 78 70 72   pFromCol->nExpr
15150 3b 0a 20 20 7d 0a 20 20 6e 42 79 74 65 20 3d 20  ;.  }.  nByte = 
15160 73 69 7a 65 6f 66 28 2a 70 46 4b 65 79 29 20 2b  sizeof(*pFKey) +
15170 20 28 6e 43 6f 6c 2d 31 29 2a 73 69 7a 65 6f 66   (nCol-1)*sizeof
15180 28 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b 30 5d 29  (pFKey->aCol[0])
15190 20 2b 20 70 54 6f 2d 3e 6e 20 2b 20 31 3b 0a 20   + pTo->n + 1;. 
151a0 20 69 66 28 20 70 54 6f 43 6f 6c 20 29 7b 0a 20   if( pToCol ){. 
151b0 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54     for(i=0; i<pT
151c0 6f 43 6f 6c 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  oCol->nExpr; i++
151d0 29 7b 0a 20 20 20 20 20 20 6e 42 79 74 65 20 2b  ){.      nByte +
151e0 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
151f0 30 28 70 54 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a  0(pToCol->a[i].z
15200 4e 61 6d 65 29 20 2b 20 31 3b 0a 20 20 20 20 7d  Name) + 1;.    }
15210 0a 20 20 7d 0a 20 20 70 46 4b 65 79 20 3d 20 73  .  }.  pFKey = s
15220 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
15230 72 6f 28 64 62 2c 20 6e 42 79 74 65 20 29 3b 0a  ro(db, nByte );.
15240 20 20 69 66 28 20 70 46 4b 65 79 3d 3d 30 20 29    if( pFKey==0 )
15250 7b 0a 20 20 20 20 67 6f 74 6f 20 66 6b 5f 65 6e  {.    goto fk_en
15260 64 3b 0a 20 20 7d 0a 20 20 70 46 4b 65 79 2d 3e  d;.  }.  pFKey->
15270 70 46 72 6f 6d 20 3d 20 70 3b 0a 20 20 70 46 4b  pFrom = p;.  pFK
15280 65 79 2d 3e 70 4e 65 78 74 46 72 6f 6d 20 3d 20  ey->pNextFrom = 
15290 70 2d 3e 70 46 4b 65 79 3b 0a 20 20 7a 20 3d 20  p->pFKey;.  z = 
152a0 28 63 68 61 72 2a 29 26 70 46 4b 65 79 2d 3e 61  (char*)&pFKey->a
152b0 43 6f 6c 5b 6e 43 6f 6c 5d 3b 0a 20 20 70 46 4b  Col[nCol];.  pFK
152c0 65 79 2d 3e 7a 54 6f 20 3d 20 7a 3b 0a 20 20 6d  ey->zTo = z;.  m
152d0 65 6d 63 70 79 28 7a 2c 20 70 54 6f 2d 3e 7a 2c  emcpy(z, pTo->z,
152e0 20 70 54 6f 2d 3e 6e 29 3b 0a 20 20 7a 5b 70 54   pTo->n);.  z[pT
152f0 6f 2d 3e 6e 5d 20 3d 20 30 3b 0a 20 20 73 71 6c  o->n] = 0;.  sql
15300 69 74 65 33 44 65 71 75 6f 74 65 28 7a 29 3b 0a  ite3Dequote(z);.
15310 20 20 7a 20 2b 3d 20 70 54 6f 2d 3e 6e 2b 31 3b    z += pTo->n+1;
15320 0a 20 20 70 46 4b 65 79 2d 3e 6e 43 6f 6c 20 3d  .  pFKey->nCol =
15330 20 6e 43 6f 6c 3b 0a 20 20 69 66 28 20 70 46 72   nCol;.  if( pFr
15340 6f 6d 43 6f 6c 3d 3d 30 20 29 7b 0a 20 20 20 20  omCol==0 ){.    
15350 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b 30 5d 2e 69  pFKey->aCol[0].i
15360 46 72 6f 6d 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31  From = p->nCol-1
15370 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66  ;.  }else{.    f
15380 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20  or(i=0; i<nCol; 
15390 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  i++){.      int 
153a0 6a 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30  j;.      for(j=0
153b0 3b 20 6a 3c 70 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b  ; j<p->nCol; j++
153c0 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73  ){.        if( s
153d0 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 2d  qlite3StrICmp(p-
153e0 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 2c 20  >aCol[j].zName, 
153f0 70 46 72 6f 6d 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a  pFromCol->a[i].z
15400 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20  Name)==0 ){.    
15410 20 20 20 20 20 20 70 46 4b 65 79 2d 3e 61 43 6f        pFKey->aCo
15420 6c 5b 69 5d 2e 69 46 72 6f 6d 20 3d 20 6a 3b 0a  l[i].iFrom = j;.
15430 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
15440 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
15450 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6a 3e 3d   }.      if( j>=
15460 70 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 20  p->nCol ){.     
15470 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
15480 73 67 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20  sg(pParse, .    
15490 20 20 20 20 20 20 22 75 6e 6b 6e 6f 77 6e 20 63        "unknown c
154a0 6f 6c 75 6d 6e 20 5c 22 25 73 5c 22 20 69 6e 20  olumn \"%s\" in 
154b0 66 6f 72 65 69 67 6e 20 6b 65 79 20 64 65 66 69  foreign key defi
154c0 6e 69 74 69 6f 6e 22 2c 20 0a 20 20 20 20 20 20  nition", .      
154d0 20 20 20 20 70 46 72 6f 6d 43 6f 6c 2d 3e 61 5b      pFromCol->a[
154e0 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  i].zName);.     
154f0 20 20 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a     goto fk_end;.
15500 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
15510 7d 0a 20 20 69 66 28 20 70 54 6f 43 6f 6c 20 29  }.  if( pToCol )
15520 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  {.    for(i=0; i
15530 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nCol; i++){.   
15540 20 20 20 69 6e 74 20 6e 20 3d 20 73 71 6c 69 74     int n = sqlit
15550 65 33 53 74 72 6c 65 6e 33 30 28 70 54 6f 43 6f  e3Strlen30(pToCo
15560 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a  l->a[i].zName);.
15570 20 20 20 20 20 20 70 46 4b 65 79 2d 3e 61 43 6f        pFKey->aCo
15580 6c 5b 69 5d 2e 7a 43 6f 6c 20 3d 20 7a 3b 0a 20  l[i].zCol = z;. 
15590 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 2c 20 70       memcpy(z, p
155a0 54 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  ToCol->a[i].zNam
155b0 65 2c 20 6e 29 3b 0a 20 20 20 20 20 20 7a 5b 6e  e, n);.      z[n
155c0 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 7a 20 2b  ] = 0;.      z +
155d0 3d 20 6e 2b 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  = n+1;.    }.  }
155e0 0a 20 20 70 46 4b 65 79 2d 3e 69 73 44 65 66 65  .  pFKey->isDefe
155f0 72 72 65 64 20 3d 20 30 3b 0a 20 20 70 46 4b 65  rred = 0;.  pFKe
15600 79 2d 3e 61 41 63 74 69 6f 6e 5b 30 5d 20 3d 20  y->aAction[0] = 
15610 28 75 38 29 28 66 6c 61 67 73 20 26 20 30 78 66  (u8)(flags & 0xf
15620 66 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  f);            /
15630 2a 20 4f 4e 20 44 45 4c 45 54 45 20 61 63 74 69  * ON DELETE acti
15640 6f 6e 20 2a 2f 0a 20 20 70 46 4b 65 79 2d 3e 61  on */.  pFKey->a
15650 41 63 74 69 6f 6e 5b 31 5d 20 3d 20 28 75 38 29  Action[1] = (u8)
15660 28 28 66 6c 61 67 73 20 3e 3e 20 38 20 29 20 26  ((flags >> 8 ) &
15670 20 30 78 66 66 29 3b 20 20 20 20 2f 2a 20 4f 4e   0xff);    /* ON
15680 20 55 50 44 41 54 45 20 61 63 74 69 6f 6e 20 2a   UPDATE action *
15690 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  /..  assert( sql
156a0 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48  ite3SchemaMutexH
156b0 65 6c 64 28 64 62 2c 20 30 2c 20 70 2d 3e 70 53  eld(db, 0, p->pS
156c0 63 68 65 6d 61 29 20 29 3b 0a 20 20 70 4e 65 78  chema) );.  pNex
156d0 74 54 6f 20 3d 20 28 46 4b 65 79 20 2a 29 73 71  tTo = (FKey *)sq
156e0 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72 74 28  lite3HashInsert(
156f0 26 70 2d 3e 70 53 63 68 65 6d 61 2d 3e 66 6b 65  &p->pSchema->fke
15700 79 48 61 73 68 2c 20 0a 20 20 20 20 20 20 70 46  yHash, .      pF
15710 4b 65 79 2d 3e 7a 54 6f 2c 20 28 76 6f 69 64 20  Key->zTo, (void 
15720 2a 29 70 46 4b 65 79 0a 20 20 29 3b 0a 20 20 69  *)pFKey.  );.  i
15730 66 28 20 70 4e 65 78 74 54 6f 3d 3d 70 46 4b 65  f( pNextTo==pFKe
15740 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  y ){.    sqlite3
15750 4f 6f 6d 46 61 75 6c 74 28 64 62 29 3b 0a 20 20  OomFault(db);.  
15760 20 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20    goto fk_end;. 
15770 20 7d 0a 20 20 69 66 28 20 70 4e 65 78 74 54 6f   }.  if( pNextTo
15780 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
15790 70 4e 65 78 74 54 6f 2d 3e 70 50 72 65 76 54 6f  pNextTo->pPrevTo
157a0 3d 3d 30 20 29 3b 0a 20 20 20 20 70 46 4b 65 79  ==0 );.    pFKey
157b0 2d 3e 70 4e 65 78 74 54 6f 20 3d 20 70 4e 65 78  ->pNextTo = pNex
157c0 74 54 6f 3b 0a 20 20 20 20 70 4e 65 78 74 54 6f  tTo;.    pNextTo
157d0 2d 3e 70 50 72 65 76 54 6f 20 3d 20 70 46 4b 65  ->pPrevTo = pFKe
157e0 79 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 69 6e  y;.  }..  /* Lin
157f0 6b 20 74 68 65 20 66 6f 72 65 69 67 6e 20 6b 65  k the foreign ke
15800 79 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 61  y to the table a
15810 73 20 74 68 65 20 6c 61 73 74 20 73 74 65 70 2e  s the last step.
15820 0a 20 20 2a 2f 0a 20 20 70 2d 3e 70 46 4b 65 79  .  */.  p->pFKey
15830 20 3d 20 70 46 4b 65 79 3b 0a 20 20 70 46 4b 65   = pFKey;.  pFKe
15840 79 20 3d 20 30 3b 0a 0a 66 6b 5f 65 6e 64 3a 0a  y = 0;..fk_end:.
15850 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
15860 64 62 2c 20 70 46 4b 65 79 29 3b 0a 23 65 6e 64  db, pFKey);.#end
15870 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53  if /* !defined(S
15880 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49  QLITE_OMIT_FOREI
15890 47 4e 5f 4b 45 59 29 20 2a 2f 0a 20 20 73 71 6c  GN_KEY) */.  sql
158a0 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65  ite3ExprListDele
158b0 74 65 28 64 62 2c 20 70 46 72 6f 6d 43 6f 6c 29  te(db, pFromCol)
158c0 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c  ;.  sqlite3ExprL
158d0 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 54  istDelete(db, pT
158e0 6f 43 6f 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  oCol);.}../*.** 
158f0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
15900 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 6e 20 49  called when an I
15910 4e 49 54 49 41 4c 4c 59 20 49 4d 4d 45 44 49 41  NITIALLY IMMEDIA
15920 54 45 20 6f 72 20 49 4e 49 54 49 41 4c 4c 59 20  TE or INITIALLY 
15930 44 45 46 45 52 52 45 44 0a 2a 2a 20 63 6c 61 75  DEFERRED.** clau
15940 73 65 20 69 73 20 73 65 65 6e 20 61 73 20 70 61  se is seen as pa
15950 72 74 20 6f 66 20 61 20 66 6f 72 65 69 67 6e 20  rt of a foreign 
15960 6b 65 79 20 64 65 66 69 6e 69 74 69 6f 6e 2e 20  key definition. 
15970 20 54 68 65 20 69 73 44 65 66 65 72 72 65 64 0a   The isDeferred.
15980 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  ** parameter is 
15990 31 20 66 6f 72 20 49 4e 49 54 49 41 4c 4c 59 20  1 for INITIALLY 
159a0 44 45 46 45 52 52 45 44 20 61 6e 64 20 30 20 66  DEFERRED and 0 f
159b0 6f 72 20 49 4e 49 54 49 41 4c 4c 59 20 49 4d 4d  or INITIALLY IMM
159c0 45 44 49 41 54 45 2e 0a 2a 2a 20 54 68 65 20 62  EDIATE..** The b
159d0 65 68 61 76 69 6f 72 20 6f 66 20 74 68 65 20 6d  ehavior of the m
159e0 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 63 72 65  ost recently cre
159f0 61 74 65 64 20 66 6f 72 65 69 67 6e 20 6b 65 79  ated foreign key
15a00 20 69 73 20 61 64 6a 75 73 74 65 64 0a 2a 2a 20   is adjusted.** 
15a10 61 63 63 6f 72 64 69 6e 67 6c 79 2e 0a 2a 2f 0a  accordingly..*/.
15a20 76 6f 69 64 20 73 71 6c 69 74 65 33 44 65 66 65  void sqlite3Defe
15a30 72 46 6f 72 65 69 67 6e 4b 65 79 28 50 61 72 73  rForeignKey(Pars
15a40 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69  e *pParse, int i
15a50 73 44 65 66 65 72 72 65 64 29 7b 0a 23 69 66 6e  sDeferred){.#ifn
15a60 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
15a70 46 4f 52 45 49 47 4e 5f 4b 45 59 0a 20 20 54 61  FOREIGN_KEY.  Ta
15a80 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 46 4b 65  ble *pTab;.  FKe
15a90 79 20 2a 70 46 4b 65 79 3b 0a 20 20 69 66 28 20  y *pFKey;.  if( 
15aa0 28 70 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e  (pTab = pParse->
15ab0 70 4e 65 77 54 61 62 6c 65 29 3d 3d 30 20 7c 7c  pNewTable)==0 ||
15ac0 20 28 70 46 4b 65 79 20 3d 20 70 54 61 62 2d 3e   (pFKey = pTab->
15ad0 70 46 4b 65 79 29 3d 3d 30 20 29 20 72 65 74 75  pFKey)==0 ) retu
15ae0 72 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73  rn;.  assert( is
15af0 44 65 66 65 72 72 65 64 3d 3d 30 20 7c 7c 20 69  Deferred==0 || i
15b00 73 44 65 66 65 72 72 65 64 3d 3d 31 20 29 3b 20  sDeferred==1 ); 
15b10 2f 2a 20 45 56 3a 20 52 2d 33 30 33 32 33 2d 32  /* EV: R-30323-2
15b20 31 39 31 37 20 2a 2f 0a 20 20 70 46 4b 65 79 2d  1917 */.  pFKey-
15b30 3e 69 73 44 65 66 65 72 72 65 64 20 3d 20 28 75  >isDeferred = (u
15b40 38 29 69 73 44 65 66 65 72 72 65 64 3b 0a 23 65  8)isDeferred;.#e
15b50 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  ndif.}../*.** Ge
15b60 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74  nerate code that
15b70 20 77 69 6c 6c 20 65 72 61 73 65 20 61 6e 64 20   will erase and 
15b80 72 65 66 69 6c 6c 20 69 6e 64 65 78 20 2a 70 49  refill index *pI
15b90 64 78 2e 20 20 54 68 69 73 20 69 73 0a 2a 2a 20  dx.  This is.** 
15ba0 75 73 65 64 20 74 6f 20 69 6e 69 74 69 61 6c 69  used to initiali
15bb0 7a 65 20 61 20 6e 65 77 6c 79 20 63 72 65 61 74  ze a newly creat
15bc0 65 64 20 69 6e 64 65 78 20 6f 72 20 74 6f 20 72  ed index or to r
15bd0 65 63 6f 6d 70 75 74 65 20 74 68 65 0a 2a 2a 20  ecompute the.** 
15be0 63 6f 6e 74 65 6e 74 20 6f 66 20 61 6e 20 69 6e  content of an in
15bf0 64 65 78 20 69 6e 20 72 65 73 70 6f 6e 73 65 20  dex in response 
15c00 74 6f 20 61 20 52 45 49 4e 44 45 58 20 63 6f 6d  to a REINDEX com
15c10 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 69 66 20 6d  mand..**.** if m
15c20 65 6d 52 6f 6f 74 50 61 67 65 20 69 73 20 6e 6f  emRootPage is no
15c30 74 20 6e 65 67 61 74 69 76 65 2c 20 69 74 20 6d  t negative, it m
15c40 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 69 6e  eans that the in
15c50 64 65 78 20 69 73 20 6e 65 77 6c 79 0a 2a 2a 20  dex is newly.** 
15c60 63 72 65 61 74 65 64 2e 20 20 54 68 65 20 72 65  created.  The re
15c70 67 69 73 74 65 72 20 73 70 65 63 69 66 69 65 64  gister specified
15c80 20 62 79 20 6d 65 6d 52 6f 6f 74 50 61 67 65 20   by memRootPage 
15c90 63 6f 6e 74 61 69 6e 73 20 74 68 65 0a 2a 2a 20  contains the.** 
15ca0 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62 65 72  root page number
15cb0 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e 20 20   of the index.  
15cc0 49 66 20 6d 65 6d 52 6f 6f 74 50 61 67 65 20 69  If memRootPage i
15cd0 73 20 6e 65 67 61 74 69 76 65 2c 20 74 68 65 6e  s negative, then
15ce0 0a 2a 2a 20 74 68 65 20 69 6e 64 65 78 20 61 6c  .** the index al
15cf0 72 65 61 64 79 20 65 78 69 73 74 73 20 61 6e 64  ready exists and
15d00 20 6d 75 73 74 20 62 65 20 63 6c 65 61 72 65 64   must be cleared
15d10 20 62 65 66 6f 72 65 20 62 65 69 6e 67 20 72 65   before being re
15d20 66 69 6c 6c 65 64 20 61 6e 64 0a 2a 2a 20 74 68  filled and.** th
15d30 65 20 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62  e root page numb
15d40 65 72 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20  er of the index 
15d50 69 73 20 74 61 6b 65 6e 20 66 72 6f 6d 20 70 49  is taken from pI
15d60 6e 64 65 78 2d 3e 74 6e 75 6d 2e 0a 2a 2f 0a 73  ndex->tnum..*/.s
15d70 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74  tatic void sqlit
15d80 65 33 52 65 66 69 6c 6c 49 6e 64 65 78 28 50 61  e3RefillIndex(Pa
15d90 72 73 65 20 2a 70 50 61 72 73 65 2c 20 49 6e 64  rse *pParse, Ind
15da0 65 78 20 2a 70 49 6e 64 65 78 2c 20 69 6e 74 20  ex *pIndex, int 
15db0 6d 65 6d 52 6f 6f 74 50 61 67 65 29 7b 0a 20 20  memRootPage){.  
15dc0 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 49  Table *pTab = pI
15dd0 6e 64 65 78 2d 3e 70 54 61 62 6c 65 3b 20 20 2f  ndex->pTable;  /
15de0 2a 20 54 68 65 20 74 61 62 6c 65 20 74 68 61 74  * The table that
15df0 20 69 73 20 69 6e 64 65 78 65 64 20 2a 2f 0a 20   is indexed */. 
15e00 20 69 6e 74 20 69 54 61 62 20 3d 20 70 50 61 72   int iTab = pPar
15e10 73 65 2d 3e 6e 54 61 62 2b 2b 3b 20 20 20 20 20  se->nTab++;     
15e20 2f 2a 20 42 74 72 65 65 20 63 75 72 73 6f 72 20  /* Btree cursor 
15e30 75 73 65 64 20 66 6f 72 20 70 54 61 62 20 2a 2f  used for pTab */
15e40 0a 20 20 69 6e 74 20 69 49 64 78 20 3d 20 70 50  .  int iIdx = pP
15e50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 20 20 20  arse->nTab++;   
15e60 20 20 2f 2a 20 42 74 72 65 65 20 63 75 72 73 6f    /* Btree curso
15e70 72 20 75 73 65 64 20 66 6f 72 20 70 49 6e 64 65  r used for pInde
15e80 78 20 2a 2f 0a 20 20 69 6e 74 20 69 53 6f 72 74  x */.  int iSort
15e90 65 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  er;             
15ea0 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20        /* Cursor 
15eb0 6f 70 65 6e 65 64 20 62 79 20 4f 70 65 6e 53 6f  opened by OpenSo
15ec0 72 74 65 72 20 28 69 66 20 69 6e 20 75 73 65 29  rter (if in use)
15ed0 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 31 3b   */.  int addr1;
15ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15ef0 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
15f00 6f 66 20 74 6f 70 20 6f 66 20 6c 6f 6f 70 20 2a  of top of loop *
15f10 2f 0a 20 20 69 6e 74 20 61 64 64 72 32 3b 20 20  /.  int addr2;  
15f20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15f30 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 74 6f     /* Address to
15f40 20 6a 75 6d 70 20 74 6f 20 66 6f 72 20 6e 65 78   jump to for nex
15f50 74 20 69 74 65 72 61 74 69 6f 6e 20 2a 2f 0a 20  t iteration */. 
15f60 20 69 6e 74 20 74 6e 75 6d 3b 20 20 20 20 20 20   int tnum;      
15f70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15f80 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20 6f 66 20  /* Root page of 
15f90 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 69  index */.  int i
15fa0 50 61 72 74 49 64 78 4c 61 62 65 6c 3b 20 20 20  PartIdxLabel;   
15fb0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d            /* Jum
15fc0 70 20 74 6f 20 74 68 69 73 20 6c 61 62 65 6c 20  p to this label 
15fd0 74 6f 20 73 6b 69 70 20 61 20 72 6f 77 20 2a 2f  to skip a row */
15fe0 0a 20 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20  .  Vdbe *v;     
15ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16000 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f    /* Generate co
16010 64 65 20 69 6e 74 6f 20 74 68 69 73 20 76 69 72  de into this vir
16020 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 2a 2f 0a  tual machine */.
16030 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 3b    KeyInfo *pKey;
16040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16050 20 2f 2a 20 4b 65 79 49 6e 66 6f 20 66 6f 72 20   /* KeyInfo for 
16060 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 72  index */.  int r
16070 65 67 52 65 63 6f 72 64 3b 20 20 20 20 20 20 20  egRecord;       
16080 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67            /* Reg
16090 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 61 73  ister holding as
160a0 73 65 6d 62 6c 65 64 20 69 6e 64 65 78 20 72 65  sembled index re
160b0 63 6f 72 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65  cord */.  sqlite
160c0 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
160d0 64 62 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20  db;      /* The 
160e0 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
160f0 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62  ion */.  int iDb
16100 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61   = sqlite3Schema
16110 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 49 6e 64  ToIndex(db, pInd
16120 65 78 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 0a 23  ex->pSchema);..#
16130 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
16140 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e  IT_AUTHORIZATION
16150 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75  .  if( sqlite3Au
16160 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  thCheck(pParse, 
16170 53 51 4c 49 54 45 5f 52 45 49 4e 44 45 58 2c 20  SQLITE_REINDEX, 
16180 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 30  pIndex->zName, 0
16190 2c 0a 20 20 20 20 20 20 64 62 2d 3e 61 44 62 5b  ,.      db->aDb[
161a0 69 44 62 5d 2e 7a 4e 61 6d 65 20 29 20 29 7b 0a  iDb].zName ) ){.
161b0 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
161c0 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 52 65 71  #endif..  /* Req
161d0 75 69 72 65 20 61 20 77 72 69 74 65 2d 6c 6f 63  uire a write-loc
161e0 6b 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 20 74  k on the table t
161f0 6f 20 70 65 72 66 6f 72 6d 20 74 68 69 73 20 6f  o perform this o
16200 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 73 71  peration */.  sq
16210 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28 70  lite3TableLock(p
16220 50 61 72 73 65 2c 20 69 44 62 2c 20 70 54 61 62  Parse, iDb, pTab
16230 2d 3e 74 6e 75 6d 2c 20 31 2c 20 70 54 61 62 2d  ->tnum, 1, pTab-
16240 3e 7a 4e 61 6d 65 29 3b 0a 0a 20 20 76 20 3d 20  >zName);..  v = 
16250 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
16260 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76 3d  Parse);.  if( v=
16270 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69  =0 ) return;.  i
16280 66 28 20 6d 65 6d 52 6f 6f 74 50 61 67 65 3e 3d  f( memRootPage>=
16290 30 20 29 7b 0a 20 20 20 20 74 6e 75 6d 20 3d 20  0 ){.    tnum = 
162a0 6d 65 6d 52 6f 6f 74 50 61 67 65 3b 0a 20 20 7d  memRootPage;.  }
162b0 65 6c 73 65 7b 0a 20 20 20 20 74 6e 75 6d 20 3d  else{.    tnum =
162c0 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 3b 0a 20   pIndex->tnum;. 
162d0 20 7d 0a 20 20 70 4b 65 79 20 3d 20 73 71 6c 69   }.  pKey = sqli
162e0 74 65 33 4b 65 79 49 6e 66 6f 4f 66 49 6e 64 65  te3KeyInfoOfInde
162f0 78 28 70 50 61 72 73 65 2c 20 70 49 6e 64 65 78  x(pParse, pIndex
16300 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4b 65  );.  assert( pKe
16310 79 21 3d 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c  y!=0 || db->mall
16320 6f 63 46 61 69 6c 65 64 20 7c 7c 20 70 50 61 72  ocFailed || pPar
16330 73 65 2d 3e 6e 45 72 72 20 29 3b 0a 0a 20 20 2f  se->nErr );..  /
16340 2a 20 4f 70 65 6e 20 74 68 65 20 73 6f 72 74 65  * Open the sorte
16350 72 20 63 75 72 73 6f 72 20 69 66 20 77 65 20 61  r cursor if we a
16360 72 65 20 74 6f 20 75 73 65 20 6f 6e 65 2e 20 2a  re to use one. *
16370 2f 0a 20 20 69 53 6f 72 74 65 72 20 3d 20 70 50  /.  iSorter = pP
16380 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20  arse->nTab++;.  
16390 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
163a0 34 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 4f 70  4(v, OP_SorterOp
163b0 65 6e 2c 20 69 53 6f 72 74 65 72 2c 20 30 2c 20  en, iSorter, 0, 
163c0 70 49 6e 64 65 78 2d 3e 6e 4b 65 79 43 6f 6c 2c  pIndex->nKeyCol,
163d0 20 28 63 68 61 72 2a 29 0a 20 20 20 20 20 20 20   (char*).       
163e0 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
163f0 69 74 65 33 4b 65 79 49 6e 66 6f 52 65 66 28 70  ite3KeyInfoRef(p
16400 4b 65 79 29 2c 20 50 34 5f 4b 45 59 49 4e 46 4f  Key), P4_KEYINFO
16410 29 3b 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 74 68  );..  /* Open th
16420 65 20 74 61 62 6c 65 2e 20 4c 6f 6f 70 20 74 68  e table. Loop th
16430 72 6f 75 67 68 20 61 6c 6c 20 72 6f 77 73 20 6f  rough all rows o
16440 66 20 74 68 65 20 74 61 62 6c 65 2c 20 69 6e 73  f the table, ins
16450 65 72 74 69 6e 67 20 69 6e 64 65 78 0a 20 20 2a  erting index.  *
16460 2a 20 72 65 63 6f 72 64 73 20 69 6e 74 6f 20 74  * records into t
16470 68 65 20 73 6f 72 74 65 72 2e 20 2a 2f 0a 20 20  he sorter. */.  
16480 73 71 6c 69 74 65 33 4f 70 65 6e 54 61 62 6c 65  sqlite3OpenTable
16490 28 70 50 61 72 73 65 2c 20 69 54 61 62 2c 20 69  (pParse, iTab, i
164a0 44 62 2c 20 70 54 61 62 2c 20 4f 50 5f 4f 70 65  Db, pTab, OP_Ope
164b0 6e 52 65 61 64 29 3b 0a 20 20 61 64 64 72 31 20  nRead);.  addr1 
164c0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
164d0 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64  Op2(v, OP_Rewind
164e0 2c 20 69 54 61 62 2c 20 30 29 3b 20 56 64 62 65  , iTab, 0); Vdbe
164f0 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 72  Coverage(v);.  r
16500 65 67 52 65 63 6f 72 64 20 3d 20 73 71 6c 69 74  egRecord = sqlit
16510 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
16520 72 73 65 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33  rse);..  sqlite3
16530 47 65 6e 65 72 61 74 65 49 6e 64 65 78 4b 65 79  GenerateIndexKey
16540 28 70 50 61 72 73 65 2c 70 49 6e 64 65 78 2c 69  (pParse,pIndex,i
16550 54 61 62 2c 72 65 67 52 65 63 6f 72 64 2c 30 2c  Tab,regRecord,0,
16560 26 69 50 61 72 74 49 64 78 4c 61 62 65 6c 2c 30  &iPartIdxLabel,0
16570 2c 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  ,0);.  sqlite3Vd
16580 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53  beAddOp2(v, OP_S
16590 6f 72 74 65 72 49 6e 73 65 72 74 2c 20 69 53 6f  orterInsert, iSo
165a0 72 74 65 72 2c 20 72 65 67 52 65 63 6f 72 64 29  rter, regRecord)
165b0 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 73 6f 6c  ;.  sqlite3Resol
165c0 76 65 50 61 72 74 49 64 78 4c 61 62 65 6c 28 70  vePartIdxLabel(p
165d0 50 61 72 73 65 2c 20 69 50 61 72 74 49 64 78 4c  Parse, iPartIdxL
165e0 61 62 65 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33  abel);.  sqlite3
165f0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
16600 5f 4e 65 78 74 2c 20 69 54 61 62 2c 20 61 64 64  _Next, iTab, add
16610 72 31 2b 31 29 3b 20 56 64 62 65 43 6f 76 65 72  r1+1); VdbeCover
16620 61 67 65 28 76 29 3b 0a 20 20 73 71 6c 69 74 65  age(v);.  sqlite
16630 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
16640 20 61 64 64 72 31 29 3b 0a 20 20 69 66 28 20 6d   addr1);.  if( m
16650 65 6d 52 6f 6f 74 50 61 67 65 3c 30 20 29 20 73  emRootPage<0 ) s
16660 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
16670 28 76 2c 20 4f 50 5f 43 6c 65 61 72 2c 20 74 6e  (v, OP_Clear, tn
16680 75 6d 2c 20 69 44 62 29 3b 0a 20 20 73 71 6c 69  um, iDb);.  sqli
16690 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
166a0 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65 2c 20 69   OP_OpenWrite, i
166b0 49 64 78 2c 20 74 6e 75 6d 2c 20 69 44 62 2c 20  Idx, tnum, iDb, 
166c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
166d0 20 20 20 20 20 28 63 68 61 72 20 2a 29 70 4b 65       (char *)pKe
166e0 79 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a  y, P4_KEYINFO);.
166f0 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
16700 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f  ngeP5(v, OPFLAG_
16710 42 55 4c 4b 43 53 52 7c 28 28 6d 65 6d 52 6f 6f  BULKCSR|((memRoo
16720 74 50 61 67 65 3e 3d 30 29 3f 4f 50 46 4c 41 47  tPage>=0)?OPFLAG
16730 5f 50 32 49 53 52 45 47 3a 30 29 29 3b 0a 0a 20  _P2ISREG:0));.. 
16740 20 61 64 64 72 31 20 3d 20 73 71 6c 69 74 65 33   addr1 = sqlite3
16750 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
16760 5f 53 6f 72 74 65 72 53 6f 72 74 2c 20 69 53 6f  _SorterSort, iSo
16770 72 74 65 72 2c 20 30 29 3b 20 56 64 62 65 43 6f  rter, 0); VdbeCo
16780 76 65 72 61 67 65 28 76 29 3b 0a 20 20 69 66 28  verage(v);.  if(
16790 20 49 73 55 6e 69 71 75 65 49 6e 64 65 78 28 70   IsUniqueIndex(p
167a0 49 6e 64 65 78 29 20 29 7b 0a 20 20 20 20 69 6e  Index) ){.    in
167b0 74 20 6a 32 20 3d 20 73 71 6c 69 74 65 33 56 64  t j2 = sqlite3Vd
167c0 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
167d0 20 2b 20 33 3b 0a 20 20 20 20 73 71 6c 69 74 65   + 3;.    sqlite
167e0 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 6a 32 29  3VdbeGoto(v, j2)
167f0 3b 0a 20 20 20 20 61 64 64 72 32 20 3d 20 73 71  ;.    addr2 = sq
16800 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
16810 41 64 64 72 28 76 29 3b 0a 20 20 20 20 73 71 6c  Addr(v);.    sql
16820 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e  ite3VdbeAddOp4In
16830 74 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 43 6f  t(v, OP_SorterCo
16840 6d 70 61 72 65 2c 20 69 53 6f 72 74 65 72 2c 20  mpare, iSorter, 
16850 6a 32 2c 20 72 65 67 52 65 63 6f 72 64 2c 0a 20  j2, regRecord,. 
16860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16870 20 20 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e          pIndex->
16880 6e 4b 65 79 43 6f 6c 29 3b 20 56 64 62 65 43 6f  nKeyCol); VdbeCo
16890 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 73  verage(v);.    s
168a0 71 6c 69 74 65 33 55 6e 69 71 75 65 43 6f 6e 73  qlite3UniqueCons
168b0 74 72 61 69 6e 74 28 70 50 61 72 73 65 2c 20 4f  traint(pParse, O
168c0 45 5f 41 62 6f 72 74 2c 20 70 49 6e 64 65 78 29  E_Abort, pIndex)
168d0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  ;.  }else{.    a
168e0 64 64 72 32 20 3d 20 73 71 6c 69 74 65 33 56 64  ddr2 = sqlite3Vd
168f0 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
16900 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56  ;.  }.  sqlite3V
16910 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
16920 53 6f 72 74 65 72 44 61 74 61 2c 20 69 53 6f 72  SorterData, iSor
16930 74 65 72 2c 20 72 65 67 52 65 63 6f 72 64 2c 20  ter, regRecord, 
16940 69 49 64 78 29 3b 0a 20 20 73 71 6c 69 74 65 33  iIdx);.  sqlite3
16950 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
16960 5f 4c 61 73 74 2c 20 69 49 64 78 2c 20 30 2c 20  _Last, iIdx, 0, 
16970 2d 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  -1);.  sqlite3Vd
16980 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49  beAddOp3(v, OP_I
16990 64 78 49 6e 73 65 72 74 2c 20 69 49 64 78 2c 20  dxInsert, iIdx, 
169a0 72 65 67 52 65 63 6f 72 64 2c 20 30 29 3b 0a 20  regRecord, 0);. 
169b0 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
169c0 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 55  geP5(v, OPFLAG_U
169d0 53 45 53 45 45 4b 52 45 53 55 4c 54 29 3b 0a 20  SESEEKRESULT);. 
169e0 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
169f0 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
16a00 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 73 71 6c  egRecord);.  sql
16a10 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
16a20 2c 20 4f 50 5f 53 6f 72 74 65 72 4e 65 78 74 2c  , OP_SorterNext,
16a30 20 69 53 6f 72 74 65 72 2c 20 61 64 64 72 32 29   iSorter, addr2)
16a40 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
16a50 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
16a60 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
16a70 31 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33 56 64  1);..  sqlite3Vd
16a80 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 43  beAddOp1(v, OP_C
16a90 6c 6f 73 65 2c 20 69 54 61 62 29 3b 0a 20 20 73  lose, iTab);.  s
16aa0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
16ab0 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 69 49  (v, OP_Close, iI
16ac0 64 78 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  dx);.  sqlite3Vd
16ad0 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 43  beAddOp1(v, OP_C
16ae0 6c 6f 73 65 2c 20 69 53 6f 72 74 65 72 29 3b 0a  lose, iSorter);.
16af0 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74  }../*.** Allocat
16b00 65 20 68 65 61 70 20 73 70 61 63 65 20 74 6f 20  e heap space to 
16b10 68 6f 6c 64 20 61 6e 20 49 6e 64 65 78 20 6f 62  hold an Index ob
16b20 6a 65 63 74 20 77 69 74 68 20 6e 43 6f 6c 20 63  ject with nCol c
16b30 6f 6c 75 6d 6e 73 2e 0a 2a 2a 0a 2a 2a 20 49 6e  olumns..**.** In
16b40 63 72 65 61 73 65 20 74 68 65 20 61 6c 6c 6f 63  crease the alloc
16b50 61 74 69 6f 6e 20 73 69 7a 65 20 74 6f 20 70 72  ation size to pr
16b60 6f 76 69 64 65 20 61 6e 20 65 78 74 72 61 20 6e  ovide an extra n
16b70 45 78 74 72 61 20 62 79 74 65 73 0a 2a 2a 20 6f  Extra bytes.** o
16b80 66 20 38 2d 62 79 74 65 20 61 6c 69 67 6e 65 64  f 8-byte aligned
16b90 20 73 70 61 63 65 20 61 66 74 65 72 20 74 68 65   space after the
16ba0 20 49 6e 64 65 78 20 6f 62 6a 65 63 74 20 61 6e   Index object an
16bb0 64 20 72 65 74 75 72 6e 20 61 0a 2a 2a 20 70 6f  d return a.** po
16bc0 69 6e 74 65 72 20 74 6f 20 74 68 69 73 20 65 78  inter to this ex
16bd0 74 72 61 20 73 70 61 63 65 20 69 6e 20 2a 70 70  tra space in *pp
16be0 45 78 74 72 61 2e 0a 2a 2f 0a 49 6e 64 65 78 20  Extra..*/.Index 
16bf0 2a 73 71 6c 69 74 65 33 41 6c 6c 6f 63 61 74 65  *sqlite3Allocate
16c00 49 6e 64 65 78 4f 62 6a 65 63 74 28 0a 20 20 73  IndexObject(.  s
16c10 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20  qlite3 *db,     
16c20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
16c30 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20  connection */.  
16c40 69 31 36 20 6e 43 6f 6c 2c 20 20 20 20 20 20 20  i16 nCol,       
16c50 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 6e 75       /* Total nu
16c60 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  mber of columns 
16c70 69 6e 20 74 68 65 20 69 6e 64 65 78 20 2a 2f 0a  in the index */.
16c80 20 20 69 6e 74 20 6e 45 78 74 72 61 2c 20 20 20    int nExtra,   
16c90 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
16ca0 20 6f 66 20 62 79 74 65 73 20 6f 66 20 65 78 74   of bytes of ext
16cb0 72 61 20 73 70 61 63 65 20 74 6f 20 61 6c 6c 6f  ra space to allo
16cc0 63 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 70 70  c */.  char **pp
16cd0 45 78 74 72 61 20 20 20 20 20 20 20 2f 2a 20 50  Extra       /* P
16ce0 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 22 65  ointer to the "e
16cf0 78 74 72 61 22 20 73 70 61 63 65 20 2a 2f 0a 29  xtra" space */.)
16d00 7b 0a 20 20 49 6e 64 65 78 20 2a 70 3b 20 20 20  {.  Index *p;   
16d10 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 6f           /* Allo
16d20 63 61 74 65 64 20 69 6e 64 65 78 20 6f 62 6a 65  cated index obje
16d30 63 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74  ct */.  int nByt
16d40 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e;           /* 
16d50 42 79 74 65 73 20 6f 66 20 73 70 61 63 65 20 66  Bytes of space f
16d60 6f 72 20 49 6e 64 65 78 20 6f 62 6a 65 63 74 20  or Index object 
16d70 2b 20 61 72 72 61 79 73 20 2a 2f 0a 0a 20 20 6e  + arrays */..  n
16d80 42 79 74 65 20 3d 20 52 4f 55 4e 44 38 28 73 69  Byte = ROUND8(si
16d90 7a 65 6f 66 28 49 6e 64 65 78 29 29 20 2b 20 20  zeof(Index)) +  
16da0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
16db0 6e 64 65 78 20 73 74 72 75 63 74 75 72 65 20 20  ndex structure  
16dc0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 52 4f 55  */.          ROU
16dd0 4e 44 38 28 73 69 7a 65 6f 66 28 63 68 61 72 2a  ND8(sizeof(char*
16de0 29 2a 6e 43 6f 6c 29 20 2b 20 20 20 20 20 20 20  )*nCol) +       
16df0 20 20 2f 2a 20 49 6e 64 65 78 2e 61 7a 43 6f 6c    /* Index.azCol
16e00 6c 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20  l     */.       
16e10 20 20 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66     ROUND8(sizeof
16e20 28 4c 6f 67 45 73 74 29 2a 28 6e 43 6f 6c 2b 31  (LogEst)*(nCol+1
16e30 29 20 2b 20 20 20 20 20 2f 2a 20 49 6e 64 65 78  ) +     /* Index
16e40 2e 61 69 52 6f 77 4c 6f 67 45 73 74 20 20 20 2a  .aiRowLogEst   *
16e50 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /.              
16e60 20 20 20 73 69 7a 65 6f 66 28 69 31 36 29 2a 6e     sizeof(i16)*n
16e70 43 6f 6c 20 2b 20 20 20 20 20 20 20 20 20 20 20  Col +           
16e80 20 2f 2a 20 49 6e 64 65 78 2e 61 69 43 6f 6c 75   /* Index.aiColu
16e90 6d 6e 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20  mn   */.        
16ea0 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28           sizeof(
16eb0 75 38 29 2a 6e 43 6f 6c 29 3b 20 20 20 20 20 20  u8)*nCol);      
16ec0 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 2e         /* Index.
16ed0 61 53 6f 72 74 4f 72 64 65 72 20 2a 2f 0a 20 20  aSortOrder */.  
16ee0 70 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  p = sqlite3DbMal
16ef0 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 6e 42 79 74  locZero(db, nByt
16f00 65 20 2b 20 6e 45 78 74 72 61 29 3b 0a 20 20 69  e + nExtra);.  i
16f10 66 28 20 70 20 29 7b 0a 20 20 20 20 63 68 61 72  f( p ){.    char
16f20 20 2a 70 45 78 74 72 61 20 3d 20 28 28 63 68 61   *pExtra = ((cha
16f30 72 2a 29 70 29 2b 52 4f 55 4e 44 38 28 73 69 7a  r*)p)+ROUND8(siz
16f40 65 6f 66 28 49 6e 64 65 78 29 29 3b 0a 20 20 20  eof(Index));.   
16f50 20 70 2d 3e 61 7a 43 6f 6c 6c 20 3d 20 28 63 6f   p->azColl = (co
16f60 6e 73 74 20 63 68 61 72 2a 2a 29 70 45 78 74 72  nst char**)pExtr
16f70 61 3b 20 70 45 78 74 72 61 20 2b 3d 20 52 4f 55  a; pExtra += ROU
16f80 4e 44 38 28 73 69 7a 65 6f 66 28 63 68 61 72 2a  ND8(sizeof(char*
16f90 29 2a 6e 43 6f 6c 29 3b 0a 20 20 20 20 70 2d 3e  )*nCol);.    p->
16fa0 61 69 52 6f 77 4c 6f 67 45 73 74 20 3d 20 28 4c  aiRowLogEst = (L
16fb0 6f 67 45 73 74 2a 29 70 45 78 74 72 61 3b 20 70  ogEst*)pExtra; p
16fc0 45 78 74 72 61 20 2b 3d 20 73 69 7a 65 6f 66 28  Extra += sizeof(
16fd0 4c 6f 67 45 73 74 29 2a 28 6e 43 6f 6c 2b 31 29  LogEst)*(nCol+1)
16fe0 3b 0a 20 20 20 20 70 2d 3e 61 69 43 6f 6c 75 6d  ;.    p->aiColum
16ff0 6e 20 3d 20 28 69 31 36 2a 29 70 45 78 74 72 61  n = (i16*)pExtra
17000 3b 20 20 20 20 20 20 20 70 45 78 74 72 61 20 2b  ;       pExtra +
17010 3d 20 73 69 7a 65 6f 66 28 69 31 36 29 2a 6e 43  = sizeof(i16)*nC
17020 6f 6c 3b 0a 20 20 20 20 70 2d 3e 61 53 6f 72 74  ol;.    p->aSort
17030 4f 72 64 65 72 20 3d 20 28 75 38 2a 29 70 45 78  Order = (u8*)pEx
17040 74 72 61 3b 0a 20 20 20 20 70 2d 3e 6e 43 6f 6c  tra;.    p->nCol
17050 75 6d 6e 20 3d 20 6e 43 6f 6c 3b 0a 20 20 20 20  umn = nCol;.    
17060 70 2d 3e 6e 4b 65 79 43 6f 6c 20 3d 20 6e 43 6f  p->nKeyCol = nCo
17070 6c 20 2d 20 31 3b 0a 20 20 20 20 2a 70 70 45 78  l - 1;.    *ppEx
17080 74 72 61 20 3d 20 28 28 63 68 61 72 2a 29 70 29  tra = ((char*)p)
17090 20 2b 20 6e 42 79 74 65 3b 0a 20 20 7d 0a 20 20   + nByte;.  }.  
170a0 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a  return p;.}../*.
170b0 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20  ** Create a new 
170c0 69 6e 64 65 78 20 66 6f 72 20 61 6e 20 53 51 4c  index for an SQL
170d0 20 74 61 62 6c 65 2e 20 20 70 4e 61 6d 65 31 2e   table.  pName1.
170e0 70 4e 61 6d 65 32 20 69 73 20 74 68 65 20 6e 61  pName2 is the na
170f0 6d 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20  me of the index 
17100 0a 2a 2a 20 61 6e 64 20 70 54 62 6c 4c 69 73 74  .** and pTblList
17110 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20   is the name of 
17120 74 68 65 20 74 61 62 6c 65 20 74 68 61 74 20 69  the table that i
17130 73 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64 2e  s to be indexed.
17140 20 20 42 6f 74 68 20 77 69 6c 6c 20 0a 2a 2a 20    Both will .** 
17150 62 65 20 4e 55 4c 4c 20 66 6f 72 20 61 20 70 72  be NULL for a pr
17160 69 6d 61 72 79 20 6b 65 79 20 6f 72 20 61 6e 20  imary key or an 
17170 69 6e 64 65 78 20 74 68 61 74 20 69 73 20 63 72  index that is cr
17180 65 61 74 65 64 20 74 6f 20 73 61 74 69 73 66 79  eated to satisfy
17190 20 61 0a 2a 2a 20 55 4e 49 51 55 45 20 63 6f 6e   a.** UNIQUE con
171a0 73 74 72 61 69 6e 74 2e 20 20 49 66 20 70 54 61  straint.  If pTa
171b0 62 6c 65 20 61 6e 64 20 70 49 6e 64 65 78 20 61  ble and pIndex a
171c0 72 65 20 4e 55 4c 4c 2c 20 75 73 65 20 70 50 61  re NULL, use pPa
171d0 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 0a 2a  rse->pNewTable.*
171e0 2a 20 61 73 20 74 68 65 20 74 61 62 6c 65 20 74  * as the table t
171f0 6f 20 62 65 20 69 6e 64 65 78 65 64 2e 20 20 70  o be indexed.  p
17200 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
17210 20 69 73 20 61 20 74 61 62 6c 65 20 74 68 61 74   is a table that
17220 20 69 73 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79   is.** currently
17230 20 62 65 69 6e 67 20 63 6f 6e 73 74 72 75 63 74   being construct
17240 65 64 20 62 79 20 61 20 43 52 45 41 54 45 20 54  ed by a CREATE T
17250 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a  ABLE statement..
17260 2a 2a 0a 2a 2a 20 70 4c 69 73 74 20 69 73 20 61  **.** pList is a
17270 20 6c 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73   list of columns
17280 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64 2e 20   to be indexed. 
17290 20 70 4c 69 73 74 20 77 69 6c 6c 20 62 65 20 4e   pList will be N
172a0 55 4c 4c 20 69 66 20 74 68 69 73 0a 2a 2a 20 69  ULL if this.** i
172b0 73 20 61 20 70 72 69 6d 61 72 79 20 6b 65 79 20  s a primary key 
172c0 6f 72 20 75 6e 69 71 75 65 2d 63 6f 6e 73 74 72  or unique-constr
172d0 61 69 6e 74 20 6f 6e 20 74 68 65 20 6d 6f 73 74  aint on the most
172e0 20 72 65 63 65 6e 74 20 63 6f 6c 75 6d 6e 20 61   recent column a
172f0 64 64 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20 74  dded.** to the t
17300 61 62 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 75  able currently u
17310 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f  nder constructio
17320 6e 2e 20 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  n.  .**.** If th
17330 65 20 69 6e 64 65 78 20 69 73 20 63 72 65 61 74  e index is creat
17340 65 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2c  ed successfully,
17350 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   return a pointe
17360 72 20 74 6f 20 74 68 65 20 6e 65 77 20 49 6e 64  r to the new Ind
17370 65 78 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 2e  ex.** structure.
17380 20 54 68 69 73 20 69 73 20 75 73 65 64 20 62 79   This is used by
17390 20 73 71 6c 69 74 65 33 41 64 64 50 72 69 6d 61   sqlite3AddPrima
173a0 72 79 4b 65 79 28 29 20 74 6f 20 6d 61 72 6b 20  ryKey() to mark 
173b0 74 68 65 20 69 6e 64 65 78 0a 2a 2a 20 61 73 20  the index.** as 
173c0 74 68 65 20 74 61 62 6c 65 73 20 70 72 69 6d 61  the tables prima
173d0 72 79 20 6b 65 79 20 28 49 6e 64 65 78 2e 69 64  ry key (Index.id
173e0 78 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 49 44  xType==SQLITE_ID
173f0 58 54 59 50 45 5f 50 52 49 4d 41 52 59 4b 45 59  XTYPE_PRIMARYKEY
17400 29 0a 2a 2f 0a 49 6e 64 65 78 20 2a 73 71 6c 69  ).*/.Index *sqli
17410 74 65 33 43 72 65 61 74 65 49 6e 64 65 78 28 0a  te3CreateIndex(.
17420 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
17430 20 20 20 20 20 2f 2a 20 41 6c 6c 20 69 6e 66 6f       /* All info
17440 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68  rmation about th
17450 69 73 20 70 61 72 73 65 20 2a 2f 0a 20 20 54 6f  is parse */.  To
17460 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c 20 20 20 20  ken *pName1,    
17470 20 2f 2a 20 46 69 72 73 74 20 70 61 72 74 20 6f   /* First part o
17480 66 20 69 6e 64 65 78 20 6e 61 6d 65 2e 20 4d 61  f index name. Ma
17490 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 54  y be NULL */.  T
174a0 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32 2c 20 20 20  oken *pName2,   
174b0 20 20 2f 2a 20 53 65 63 6f 6e 64 20 70 61 72 74    /* Second part
174c0 20 6f 66 20 69 6e 64 65 78 20 6e 61 6d 65 2e 20   of index name. 
174d0 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20  May be NULL */. 
174e0 20 53 72 63 4c 69 73 74 20 2a 70 54 62 6c 4e 61   SrcList *pTblNa
174f0 6d 65 2c 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20  me, /* Table to 
17500 69 6e 64 65 78 2e 20 55 73 65 20 70 50 61 72 73  index. Use pPars
17510 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 69 66 20  e->pNewTable if 
17520 30 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  0 */.  ExprList 
17530 2a 70 4c 69 73 74 2c 20 20 20 2f 2a 20 41 20 6c  *pList,   /* A l
17540 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74  ist of columns t
17550 6f 20 62 65 20 69 6e 64 65 78 65 64 20 2a 2f 0a  o be indexed */.
17560 20 20 69 6e 74 20 6f 6e 45 72 72 6f 72 2c 20 20    int onError,  
17570 20 20 20 20 20 2f 2a 20 4f 45 5f 41 62 6f 72 74       /* OE_Abort
17580 2c 20 4f 45 5f 49 67 6e 6f 72 65 2c 20 4f 45 5f  , OE_Ignore, OE_
17590 52 65 70 6c 61 63 65 2c 20 6f 72 20 4f 45 5f 4e  Replace, or OE_N
175a0 6f 6e 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  one */.  Token *
175b0 70 53 74 61 72 74 2c 20 20 20 20 20 2f 2a 20 54  pStart,     /* T
175c0 68 65 20 43 52 45 41 54 45 20 74 6f 6b 65 6e 20  he CREATE token 
175d0 74 68 61 74 20 62 65 67 69 6e 73 20 74 68 69 73  that begins this
175e0 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20   statement */.  
175f0 45 78 70 72 20 2a 70 50 49 57 68 65 72 65 2c 20  Expr *pPIWhere, 
17600 20 20 20 2f 2a 20 57 48 45 52 45 20 63 6c 61 75     /* WHERE clau
17610 73 65 20 66 6f 72 20 70 61 72 74 69 61 6c 20 69  se for partial i
17620 6e 64 69 63 65 73 20 2a 2f 0a 20 20 69 6e 74 20  ndices */.  int 
17630 73 6f 72 74 4f 72 64 65 72 2c 20 20 20 20 20 2f  sortOrder,     /
17640 2a 20 53 6f 72 74 20 6f 72 64 65 72 20 6f 66 20  * Sort order of 
17650 70 72 69 6d 61 72 79 20 6b 65 79 20 77 68 65 6e  primary key when
17660 20 70 4c 69 73 74 3d 3d 4e 55 4c 4c 20 2a 2f 0a   pList==NULL */.
17670 20 20 69 6e 74 20 69 66 4e 6f 74 45 78 69 73 74    int ifNotExist
17680 20 20 20 20 20 2f 2a 20 4f 6d 69 74 20 65 72 72       /* Omit err
17690 6f 72 20 69 66 20 69 6e 64 65 78 20 61 6c 72 65  or if index alre
176a0 61 64 79 20 65 78 69 73 74 73 20 2a 2f 0a 29 7b  ady exists */.){
176b0 0a 20 20 49 6e 64 65 78 20 2a 70 52 65 74 20 3d  .  Index *pRet =
176c0 20 30 3b 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74   0;     /* Point
176d0 65 72 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a  er to return */.
176e0 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20    Table *pTab = 
176f0 30 3b 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20  0;     /* Table 
17700 74 6f 20 62 65 20 69 6e 64 65 78 65 64 20 2a 2f  to be indexed */
17710 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78  .  Index *pIndex
17720 20 3d 20 30 3b 20 20 20 2f 2a 20 54 68 65 20 69   = 0;   /* The i
17730 6e 64 65 78 20 74 6f 20 62 65 20 63 72 65 61 74  ndex to be creat
17740 65 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4e  ed */.  char *zN
17750 61 6d 65 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20  ame = 0;     /* 
17760 4e 61 6d 65 20 6f 66 20 74 68 65 20 69 6e 64 65  Name of the inde
17770 78 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e 61 6d 65  x */.  int nName
17780 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  ;           /* N
17790 75 6d 62 65 72 20 6f 66 20 63 68 61 72 61 63 74  umber of charact
177a0 65 72 73 20 69 6e 20 7a 4e 61 6d 65 20 2a 2f 0a  ers in zName */.
177b0 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 44 62    int i, j;.  Db
177c0 46 69 78 65 72 20 73 46 69 78 3b 20 20 20 20 20  Fixer sFix;     
177d0 20 20 20 2f 2a 20 46 6f 72 20 61 73 73 69 67 6e     /* For assign
177e0 69 6e 67 20 64 61 74 61 62 61 73 65 20 6e 61 6d  ing database nam
177f0 65 73 20 74 6f 20 70 54 61 62 6c 65 20 2a 2f 0a  es to pTable */.
17800 20 20 69 6e 74 20 73 6f 72 74 4f 72 64 65 72 4d    int sortOrderM
17810 61 73 6b 3b 20 20 20 2f 2a 20 31 20 74 6f 20 68  ask;   /* 1 to h
17820 6f 6e 6f 72 20 44 45 53 43 20 69 6e 20 69 6e 64  onor DESC in ind
17830 65 78 2e 20 20 30 20 74 6f 20 69 67 6e 6f 72 65  ex.  0 to ignore
17840 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a  . */.  sqlite3 *
17850 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
17860 0a 20 20 44 62 20 2a 70 44 62 3b 20 20 20 20 20  .  Db *pDb;     
17870 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73          /* The s
17880 70 65 63 69 66 69 63 20 74 61 62 6c 65 20 63 6f  pecific table co
17890 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 69 6e 64  ntaining the ind
178a0 65 78 65 64 20 64 61 74 61 62 61 73 65 20 2a 2f  exed database */
178b0 0a 20 20 69 6e 74 20 69 44 62 3b 20 20 20 20 20  .  int iDb;     
178c0 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
178d0 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
178e0 20 74 68 61 74 20 69 73 20 62 65 69 6e 67 20 77   that is being w
178f0 72 69 74 74 65 6e 20 2a 2f 0a 20 20 54 6f 6b 65  ritten */.  Toke
17900 6e 20 2a 70 4e 61 6d 65 20 3d 20 30 3b 20 20 20  n *pName = 0;   
17910 20 2f 2a 20 55 6e 71 75 61 6c 69 66 69 65 64 20   /* Unqualified 
17920 6e 61 6d 65 20 6f 66 20 74 68 65 20 69 6e 64 65  name of the inde
17930 78 20 74 6f 20 63 72 65 61 74 65 20 2a 2f 0a 20  x to create */. 
17940 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
17950 5f 69 74 65 6d 20 2a 70 4c 69 73 74 49 74 65 6d  _item *pListItem
17960 3b 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67  ; /* For looping
17970 20 6f 76 65 72 20 70 4c 69 73 74 20 2a 2f 0a 20   over pList */. 
17980 20 69 6e 74 20 6e 45 78 74 72 61 20 3d 20 30 3b   int nExtra = 0;
17990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
179a0 20 20 2f 2a 20 53 70 61 63 65 20 61 6c 6c 6f 63    /* Space alloc
179b0 61 74 65 64 20 66 6f 72 20 7a 45 78 74 72 61 5b  ated for zExtra[
179c0 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72  ] */.  int nExtr
179d0 61 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20  aCol;           
179e0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
179f0 72 20 6f 66 20 65 78 74 72 61 20 63 6f 6c 75 6d  r of extra colum
17a00 6e 73 20 6e 65 65 64 65 64 20 2a 2f 0a 20 20 63  ns needed */.  c
17a10 68 61 72 20 2a 7a 45 78 74 72 61 20 3d 20 30 3b  har *zExtra = 0;
17a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17a30 2f 2a 20 45 78 74 72 61 20 73 70 61 63 65 20 61  /* Extra space a
17a40 66 74 65 72 20 74 68 65 20 49 6e 64 65 78 20 6f  fter the Index o
17a50 62 6a 65 63 74 20 2a 2f 0a 20 20 49 6e 64 65 78  bject */.  Index
17a60 20 2a 70 50 6b 20 3d 20 30 3b 20 20 20 20 20 20   *pPk = 0;      
17a70 2f 2a 20 50 52 49 4d 41 52 59 20 4b 45 59 20 69  /* PRIMARY KEY i
17a80 6e 64 65 78 20 66 6f 72 20 57 49 54 48 4f 55 54  ndex for WITHOUT
17a90 20 52 4f 57 49 44 20 74 61 62 6c 65 73 20 2a 2f   ROWID tables */
17aa0 0a 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c  ..  if( db->mall
17ab0 6f 63 46 61 69 6c 65 64 20 7c 7c 20 49 4e 5f 44  ocFailed || IN_D
17ac0 45 43 4c 41 52 45 5f 56 54 41 42 20 7c 7c 20 70  ECLARE_VTAB || p
17ad0 50 61 72 73 65 2d 3e 6e 45 72 72 3e 30 20 29 7b  Parse->nErr>0 ){
17ae0 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63  .    goto exit_c
17af0 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d  reate_index;.  }
17b00 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b  .  if( SQLITE_OK
17b10 21 3d 73 71 6c 69 74 65 33 52 65 61 64 53 63 68  !=sqlite3ReadSch
17b20 65 6d 61 28 70 50 61 72 73 65 29 20 29 7b 0a 20  ema(pParse) ){. 
17b30 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65     goto exit_cre
17b40 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 0a  ate_index;.  }..
17b50 20 20 2f 2a 0a 20 20 2a 2a 20 46 69 6e 64 20 74    /*.  ** Find t
17b60 68 65 20 74 61 62 6c 65 20 74 68 61 74 20 69 73  he table that is
17b70 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64 2e 20   to be indexed. 
17b80 20 52 65 74 75 72 6e 20 65 61 72 6c 79 20 69 66   Return early if
17b90 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 20 20 2a 2f   not found..  */
17ba0 0a 20 20 69 66 28 20 70 54 62 6c 4e 61 6d 65 21  .  if( pTblName!
17bb0 3d 30 20 29 7b 0a 0a 20 20 20 20 2f 2a 20 55 73  =0 ){..    /* Us
17bc0 65 20 74 68 65 20 74 77 6f 2d 70 61 72 74 20 69  e the two-part i
17bd0 6e 64 65 78 20 6e 61 6d 65 20 74 6f 20 64 65 74  ndex name to det
17be0 65 72 6d 69 6e 65 20 74 68 65 20 64 61 74 61 62  ermine the datab
17bf0 61 73 65 20 0a 20 20 20 20 2a 2a 20 74 6f 20 73  ase .    ** to s
17c00 65 61 72 63 68 20 66 6f 72 20 74 68 65 20 74 61  earch for the ta
17c10 62 6c 65 2e 20 27 46 69 78 27 20 74 68 65 20 74  ble. 'Fix' the t
17c20 61 62 6c 65 20 6e 61 6d 65 20 74 6f 20 74 68 69  able name to thi
17c30 73 20 64 62 0a 20 20 20 20 2a 2a 20 62 65 66 6f  s db.    ** befo
17c40 72 65 20 6c 6f 6f 6b 69 6e 67 20 75 70 20 74 68  re looking up th
17c50 65 20 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2f 0a  e table..    */.
17c60 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 61 6d      assert( pNam
17c70 65 31 20 26 26 20 70 4e 61 6d 65 32 20 29 3b 0a  e1 && pName2 );.
17c80 20 20 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65      iDb = sqlite
17c90 33 54 77 6f 50 61 72 74 4e 61 6d 65 28 70 50 61  3TwoPartName(pPa
17ca0 72 73 65 2c 20 70 4e 61 6d 65 31 2c 20 70 4e 61  rse, pName1, pNa
17cb0 6d 65 32 2c 20 26 70 4e 61 6d 65 29 3b 0a 20 20  me2, &pName);.  
17cc0 20 20 69 66 28 20 69 44 62 3c 30 20 29 20 67 6f    if( iDb<0 ) go
17cd0 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
17ce0 6e 64 65 78 3b 0a 20 20 20 20 61 73 73 65 72 74  ndex;.    assert
17cf0 28 20 70 4e 61 6d 65 20 26 26 20 70 4e 61 6d 65  ( pName && pName
17d00 2d 3e 7a 20 29 3b 0a 0a 23 69 66 6e 64 65 66 20  ->z );..#ifndef 
17d10 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 45 4d 50  SQLITE_OMIT_TEMP
17d20 44 42 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  DB.    /* If the
17d30 20 69 6e 64 65 78 20 6e 61 6d 65 20 77 61 73 20   index name was 
17d40 75 6e 71 75 61 6c 69 66 69 65 64 2c 20 63 68 65  unqualified, che
17d50 63 6b 20 69 66 20 74 68 65 20 74 61 62 6c 65 0a  ck if the table.
17d60 20 20 20 20 2a 2a 20 69 73 20 61 20 74 65 6d 70      ** is a temp
17d70 20 74 61 62 6c 65 2e 20 49 66 20 73 6f 2c 20 73   table. If so, s
17d80 65 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20  et the database 
17d90 74 6f 20 31 2e 20 44 6f 20 6e 6f 74 20 64 6f 20  to 1. Do not do 
17da0 74 68 69 73 0a 20 20 20 20 2a 2a 20 69 66 20 69  this.    ** if i
17db0 6e 69 74 69 61 6c 69 73 69 6e 67 20 61 20 64 61  nitialising a da
17dc0 74 61 62 61 73 65 20 73 63 68 65 6d 61 2e 0a 20  tabase schema.. 
17dd0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 64     */.    if( !d
17de0 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a  b->init.busy ){.
17df0 20 20 20 20 20 20 70 54 61 62 20 3d 20 73 71 6c        pTab = sql
17e00 69 74 65 33 53 72 63 4c 69 73 74 4c 6f 6f 6b 75  ite3SrcListLooku
17e10 70 28 70 50 61 72 73 65 2c 20 70 54 62 6c 4e 61  p(pParse, pTblNa
17e20 6d 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  me);.      if( p
17e30 4e 61 6d 65 32 2d 3e 6e 3d 3d 30 20 26 26 20 70  Name2->n==0 && p
17e40 54 61 62 20 26 26 20 70 54 61 62 2d 3e 70 53 63  Tab && pTab->pSc
17e50 68 65 6d 61 3d 3d 64 62 2d 3e 61 44 62 5b 31 5d  hema==db->aDb[1]
17e60 2e 70 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20  .pSchema ){.    
17e70 20 20 20 20 69 44 62 20 3d 20 31 3b 0a 20 20 20      iDb = 1;.   
17e80 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69     }.    }.#endi
17e90 66 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 46 69  f..    sqlite3Fi
17ea0 78 49 6e 69 74 28 26 73 46 69 78 2c 20 70 50 61  xInit(&sFix, pPa
17eb0 72 73 65 2c 20 69 44 62 2c 20 22 69 6e 64 65 78  rse, iDb, "index
17ec0 22 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 20 20 69  ", pName);.    i
17ed0 66 28 20 73 71 6c 69 74 65 33 46 69 78 53 72 63  f( sqlite3FixSrc
17ee0 4c 69 73 74 28 26 73 46 69 78 2c 20 70 54 62 6c  List(&sFix, pTbl
17ef0 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 20 20 2f  Name) ){.      /
17f00 2a 20 42 65 63 61 75 73 65 20 74 68 65 20 70 61  * Because the pa
17f10 72 73 65 72 20 63 6f 6e 73 74 72 75 63 74 73 20  rser constructs 
17f20 70 54 62 6c 4e 61 6d 65 20 66 72 6f 6d 20 61 20  pTblName from a 
17f30 73 69 6e 67 6c 65 20 69 64 65 6e 74 69 66 69 65  single identifie
17f40 72 2c 0a 20 20 20 20 20 20 2a 2a 20 73 71 6c 69  r,.      ** sqli
17f50 74 65 33 46 69 78 53 72 63 4c 69 73 74 20 63 61  te3FixSrcList ca
17f60 6e 20 6e 65 76 65 72 20 66 61 69 6c 2e 20 2a 2f  n never fail. */
17f70 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 30 29  .      assert(0)
17f80 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 54 61 62  ;.    }.    pTab
17f90 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65   = sqlite3Locate
17fa0 54 61 62 6c 65 49 74 65 6d 28 70 50 61 72 73 65  TableItem(pParse
17fb0 2c 20 30 2c 20 26 70 54 62 6c 4e 61 6d 65 2d 3e  , 0, &pTblName->
17fc0 61 5b 30 5d 29 3b 0a 20 20 20 20 61 73 73 65 72  a[0]);.    asser
17fd0 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  t( db->mallocFai
17fe0 6c 65 64 3d 3d 30 20 7c 7c 20 70 54 61 62 3d 3d  led==0 || pTab==
17ff0 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70 54 61  0 );.    if( pTa
18000 62 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78 69 74  b==0 ) goto exit
18010 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
18020 20 20 20 69 66 28 20 69 44 62 3d 3d 31 20 26 26     if( iDb==1 &&
18030 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53   db->aDb[iDb].pS
18040 63 68 65 6d 61 21 3d 70 54 61 62 2d 3e 70 53 63  chema!=pTab->pSc
18050 68 65 6d 61 20 29 7b 0a 20 20 20 20 20 20 73 71  hema ){.      sq
18060 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
18070 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20 20  arse, .         
18080 20 20 22 63 61 6e 6e 6f 74 20 63 72 65 61 74 65    "cannot create
18090 20 61 20 54 45 4d 50 20 69 6e 64 65 78 20 6f 6e   a TEMP index on
180a0 20 6e 6f 6e 2d 54 45 4d 50 20 74 61 62 6c 65 20   non-TEMP table 
180b0 5c 22 25 73 5c 22 22 2c 0a 20 20 20 20 20 20 20  \"%s\"",.       
180c0 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29      pTab->zName)
180d0 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69  ;.      goto exi
180e0 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
180f0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21 48      }.    if( !H
18100 61 73 52 6f 77 69 64 28 70 54 61 62 29 20 29 20  asRowid(pTab) ) 
18110 70 50 6b 20 3d 20 73 71 6c 69 74 65 33 50 72 69  pPk = sqlite3Pri
18120 6d 61 72 79 4b 65 79 49 6e 64 65 78 28 70 54 61  maryKeyIndex(pTa
18130 62 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  b);.  }else{.   
18140 20 61 73 73 65 72 74 28 20 70 4e 61 6d 65 3d 3d   assert( pName==
18150 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
18160 20 70 53 74 61 72 74 3d 3d 30 20 29 3b 0a 20 20   pStart==0 );.  
18170 20 20 70 54 61 62 20 3d 20 70 50 61 72 73 65 2d    pTab = pParse-
18180 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 20 20  >pNewTable;.    
18190 69 66 28 20 21 70 54 61 62 20 29 20 67 6f 74 6f  if( !pTab ) goto
181a0 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
181b0 65 78 3b 0a 20 20 20 20 69 44 62 20 3d 20 73 71  ex;.    iDb = sq
181c0 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64  lite3SchemaToInd
181d0 65 78 28 64 62 2c 20 70 54 61 62 2d 3e 70 53 63  ex(db, pTab->pSc
181e0 68 65 6d 61 29 3b 0a 20 20 7d 0a 20 20 70 44 62  hema);.  }.  pDb
181f0 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d   = &db->aDb[iDb]
18200 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 54 61  ;..  assert( pTa
18210 62 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  b!=0 );.  assert
18220 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d  ( pParse->nErr==
18230 30 20 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  0 );.  if( sqlit
18240 65 33 53 74 72 4e 49 43 6d 70 28 70 54 61 62 2d  e3StrNICmp(pTab-
18250 3e 7a 4e 61 6d 65 2c 20 22 73 71 6c 69 74 65 5f  >zName, "sqlite_
18260 22 2c 20 37 29 3d 3d 30 20 0a 20 20 20 20 20 20  ", 7)==0 .      
18270 20 26 26 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73   && db->init.bus
18280 79 3d 3d 30 0a 23 69 66 20 53 51 4c 49 54 45 5f  y==0.#if SQLITE_
18290 55 53 45 52 5f 41 55 54 48 45 4e 54 49 43 41 54  USER_AUTHENTICAT
182a0 49 4f 4e 0a 20 20 20 20 20 20 20 26 26 20 73 71  ION.       && sq
182b0 6c 69 74 65 33 55 73 65 72 41 75 74 68 54 61 62  lite3UserAuthTab
182c0 6c 65 28 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3d  le(pTab->zName)=
182d0 3d 30 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  =0.#endif.      
182e0 20 26 26 20 73 71 6c 69 74 65 33 53 74 72 4e 49   && sqlite3StrNI
182f0 43 6d 70 28 26 70 54 61 62 2d 3e 7a 4e 61 6d 65  Cmp(&pTab->zName
18300 5b 37 5d 2c 22 61 6c 74 65 72 74 61 62 5f 22 2c  [7],"altertab_",
18310 39 29 21 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  9)!=0 ){.    sql
18320 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
18330 72 73 65 2c 20 22 74 61 62 6c 65 20 25 73 20 6d  rse, "table %s m
18340 61 79 20 6e 6f 74 20 62 65 20 69 6e 64 65 78 65  ay not be indexe
18350 64 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29  d", pTab->zName)
18360 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f  ;.    goto exit_
18370 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
18380 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
18390 5f 4f 4d 49 54 5f 56 49 45 57 0a 20 20 69 66 28  _OMIT_VIEW.  if(
183a0 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 29   pTab->pSelect )
183b0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
183c0 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 76  orMsg(pParse, "v
183d0 69 65 77 73 20 6d 61 79 20 6e 6f 74 20 62 65 20  iews may not be 
183e0 69 6e 64 65 78 65 64 22 29 3b 0a 20 20 20 20 67  indexed");.    g
183f0 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
18400 69 6e 64 65 78 3b 0a 20 20 7d 0a 23 65 6e 64 69  index;.  }.#endi
18410 66 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  f.#ifndef SQLITE
18420 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
18430 4c 45 0a 20 20 69 66 28 20 49 73 56 69 72 74 75  LE.  if( IsVirtu
18440 61 6c 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20  al(pTab) ){.    
18450 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
18460 70 50 61 72 73 65 2c 20 22 76 69 72 74 75 61 6c  pParse, "virtual
18470 20 74 61 62 6c 65 73 20 6d 61 79 20 6e 6f 74 20   tables may not 
18480 62 65 20 69 6e 64 65 78 65 64 22 29 3b 0a 20 20  be indexed");.  
18490 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61    goto exit_crea
184a0 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 23 65  te_index;.  }.#e
184b0 6e 64 69 66 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  ndif..  /*.  ** 
184c0 46 69 6e 64 20 74 68 65 20 6e 61 6d 65 20 6f 66  Find the name of
184d0 20 74 68 65 20 69 6e 64 65 78 2e 20 20 4d 61 6b   the index.  Mak
184e0 65 20 73 75 72 65 20 74 68 65 72 65 20 69 73 20  e sure there is 
184f0 6e 6f 74 20 61 6c 72 65 61 64 79 20 61 6e 6f 74  not already anot
18500 68 65 72 0a 20 20 2a 2a 20 69 6e 64 65 78 20 6f  her.  ** index o
18510 72 20 74 61 62 6c 65 20 77 69 74 68 20 74 68 65  r table with the
18520 20 73 61 6d 65 20 6e 61 6d 65 2e 20 20 0a 20 20   same name.  .  
18530 2a 2a 0a 20 20 2a 2a 20 45 78 63 65 70 74 69 6f  **.  ** Exceptio
18540 6e 3a 20 20 49 66 20 77 65 20 61 72 65 20 72 65  n:  If we are re
18550 61 64 69 6e 67 20 74 68 65 20 6e 61 6d 65 73 20  ading the names 
18560 6f 66 20 70 65 72 6d 61 6e 65 6e 74 20 69 6e 64  of permanent ind
18570 69 63 65 73 20 66 72 6f 6d 20 74 68 65 0a 20 20  ices from the.  
18580 2a 2a 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  ** sqlite_master
18590 20 74 61 62 6c 65 20 28 62 65 63 61 75 73 65 20   table (because 
185a0 73 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f 63 65  some other proce
185b0 73 73 20 63 68 61 6e 67 65 64 20 74 68 65 20 73  ss changed the s
185c0 63 68 65 6d 61 29 20 61 6e 64 0a 20 20 2a 2a 20  chema) and.  ** 
185d0 6f 6e 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78  one of the index
185e0 20 6e 61 6d 65 73 20 63 6f 6c 6c 69 64 65 73 20   names collides 
185f0 77 69 74 68 20 74 68 65 20 6e 61 6d 65 20 6f 66  with the name of
18600 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62   a temporary tab
18610 6c 65 20 6f 72 0a 20 20 2a 2a 20 69 6e 64 65 78  le or.  ** index
18620 2c 20 74 68 65 6e 20 77 65 20 77 69 6c 6c 20 63  , then we will c
18630 6f 6e 74 69 6e 75 65 20 74 6f 20 70 72 6f 63 65  ontinue to proce
18640 73 73 20 74 68 69 73 20 69 6e 64 65 78 2e 0a 20  ss this index.. 
18650 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 70 4e 61 6d   **.  ** If pNam
18660 65 3d 3d 30 20 69 74 20 6d 65 61 6e 73 20 74 68  e==0 it means th
18670 61 74 20 77 65 20 61 72 65 0a 20 20 2a 2a 20 64  at we are.  ** d
18680 65 61 6c 69 6e 67 20 77 69 74 68 20 61 20 70 72  ealing with a pr
18690 69 6d 61 72 79 20 6b 65 79 20 6f 72 20 55 4e 49  imary key or UNI
186a0 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 2e 20  QUE constraint. 
186b0 20 57 65 20 68 61 76 65 20 74 6f 20 69 6e 76 65   We have to inve
186c0 6e 74 20 6f 75 72 0a 20 20 2a 2a 20 6f 77 6e 20  nt our.  ** own 
186d0 6e 61 6d 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  name..  */.  if(
186e0 20 70 4e 61 6d 65 20 29 7b 0a 20 20 20 20 7a 4e   pName ){.    zN
186f0 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d  ame = sqlite3Nam
18700 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70  eFromToken(db, p
18710 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 7a  Name);.    if( z
18720 4e 61 6d 65 3d 3d 30 20 29 20 67 6f 74 6f 20 65  Name==0 ) goto e
18730 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
18740 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4e  ;.    assert( pN
18750 61 6d 65 2d 3e 7a 21 3d 30 20 29 3b 0a 20 20 20  ame->z!=0 );.   
18760 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d   if( SQLITE_OK!=
18770 73 71 6c 69 74 65 33 43 68 65 63 6b 4f 62 6a 65  sqlite3CheckObje
18780 63 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 7a  ctName(pParse, z
18790 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 20 20 67  Name) ){.      g
187a0 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
187b0 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20  index;.    }.   
187c0 20 69 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62   if( !db->init.b
187d0 75 73 79 20 29 7b 0a 20 20 20 20 20 20 69 66 28  usy ){.      if(
187e0 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c   sqlite3FindTabl
187f0 65 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 30 29 21  e(db, zName, 0)!
18800 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  =0 ){.        sq
18810 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
18820 61 72 73 65 2c 20 22 74 68 65 72 65 20 69 73 20  arse, "there is 
18830 61 6c 72 65 61 64 79 20 61 20 74 61 62 6c 65 20  already a table 
18840 6e 61 6d 65 64 20 25 73 22 2c 20 7a 4e 61 6d 65  named %s", zName
18850 29 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  );.        goto 
18860 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
18870 78 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  x;.      }.    }
18880 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
18890 46 69 6e 64 49 6e 64 65 78 28 64 62 2c 20 7a 4e  FindIndex(db, zN
188a0 61 6d 65 2c 20 70 44 62 2d 3e 7a 4e 61 6d 65 29  ame, pDb->zName)
188b0 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28  !=0 ){.      if(
188c0 20 21 69 66 4e 6f 74 45 78 69 73 74 20 29 7b 0a   !ifNotExist ){.
188d0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
188e0 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
188f0 22 69 6e 64 65 78 20 25 73 20 61 6c 72 65 61 64  "index %s alread
18900 79 20 65 78 69 73 74 73 22 2c 20 7a 4e 61 6d 65  y exists", zName
18910 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
18920 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
18930 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29  !db->init.busy )
18940 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
18950 33 43 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d  3CodeVerifySchem
18960 61 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a  a(pParse, iDb);.
18970 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 67 6f        }.      go
18980 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
18990 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  ndex;.    }.  }e
189a0 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 6e 3b 0a  lse{.    int n;.
189b0 20 20 20 20 49 6e 64 65 78 20 2a 70 4c 6f 6f 70      Index *pLoop
189c0 3b 0a 20 20 20 20 66 6f 72 28 70 4c 6f 6f 70 3d  ;.    for(pLoop=
189d0 70 54 61 62 2d 3e 70 49 6e 64 65 78 2c 20 6e 3d  pTab->pIndex, n=
189e0 31 3b 20 70 4c 6f 6f 70 3b 20 70 4c 6f 6f 70 3d  1; pLoop; pLoop=
189f0 70 4c 6f 6f 70 2d 3e 70 4e 65 78 74 2c 20 6e 2b  pLoop->pNext, n+
18a00 2b 29 7b 7d 0a 20 20 20 20 7a 4e 61 6d 65 20 3d  +){}.    zName =
18a10 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
18a20 64 62 2c 20 22 73 71 6c 69 74 65 5f 61 75 74 6f  db, "sqlite_auto
18a30 69 6e 64 65 78 5f 25 73 5f 25 64 22 2c 20 70 54  index_%s_%d", pT
18a40 61 62 2d 3e 7a 4e 61 6d 65 2c 20 6e 29 3b 0a 20  ab->zName, n);. 
18a50 20 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20     if( zName==0 
18a60 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78  ){.      goto ex
18a70 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
18a80 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
18a90 20 43 68 65 63 6b 20 66 6f 72 20 61 75 74 68 6f   Check for autho
18aa0 72 69 7a 61 74 69 6f 6e 20 74 6f 20 63 72 65 61  rization to crea
18ab0 74 65 20 61 6e 20 69 6e 64 65 78 2e 0a 20 20 2a  te an index..  *
18ac0 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
18ad0 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54  _OMIT_AUTHORIZAT
18ae0 49 4f 4e 0a 20 20 7b 0a 20 20 20 20 63 6f 6e 73  ION.  {.    cons
18af0 74 20 63 68 61 72 20 2a 7a 44 62 20 3d 20 70 44  t char *zDb = pD
18b00 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 69 66  b->zName;.    if
18b10 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65  ( sqlite3AuthChe
18b20 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54  ck(pParse, SQLIT
18b30 45 5f 49 4e 53 45 52 54 2c 20 53 43 48 45 4d 41  E_INSERT, SCHEMA
18b40 5f 54 41 42 4c 45 28 69 44 62 29 2c 20 30 2c 20  _TABLE(iDb), 0, 
18b50 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f  zDb) ){.      go
18b60 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
18b70 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ndex;.    }.    
18b80 69 20 3d 20 53 51 4c 49 54 45 5f 43 52 45 41 54  i = SQLITE_CREAT
18b90 45 5f 49 4e 44 45 58 3b 0a 20 20 20 20 69 66 28  E_INDEX;.    if(
18ba0 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26 26   !OMIT_TEMPDB &&
18bb0 20 69 44 62 3d 3d 31 20 29 20 69 20 3d 20 53 51   iDb==1 ) i = SQ
18bc0 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 45 4d 50  LITE_CREATE_TEMP
18bd0 5f 49 4e 44 45 58 3b 0a 20 20 20 20 69 66 28 20  _INDEX;.    if( 
18be0 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b  sqlite3AuthCheck
18bf0 28 70 50 61 72 73 65 2c 20 69 2c 20 7a 4e 61 6d  (pParse, i, zNam
18c00 65 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20  e, pTab->zName, 
18c10 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f  zDb) ){.      go
18c20 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
18c30 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ndex;.    }.  }.
18c40 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20  #endif..  /* If 
18c50 70 4c 69 73 74 3d 3d 30 2c 20 69 74 20 6d 65 61  pList==0, it mea
18c60 6e 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ns this routine 
18c70 77 61 73 20 63 61 6c 6c 65 64 20 74 6f 20 6d 61  was called to ma
18c80 6b 65 20 61 20 70 72 69 6d 61 72 79 0a 20 20 2a  ke a primary.  *
18c90 2a 20 6b 65 79 20 6f 75 74 20 6f 66 20 74 68 65  * key out of the
18ca0 20 6c 61 73 74 20 63 6f 6c 75 6d 6e 20 61 64 64   last column add
18cb0 65 64 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20  ed to the table 
18cc0 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69  under constructi
18cd0 6f 6e 2e 0a 20 20 2a 2a 20 53 6f 20 63 72 65 61  on..  ** So crea
18ce0 74 65 20 61 20 66 61 6b 65 20 6c 69 73 74 20 74  te a fake list t
18cf0 6f 20 73 69 6d 75 6c 61 74 65 20 74 68 69 73 2e  o simulate this.
18d00 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4c 69 73  .  */.  if( pLis
18d10 74 3d 3d 30 20 29 7b 0a 20 20 20 20 54 6f 6b 65  t==0 ){.    Toke
18d20 6e 20 70 72 65 76 43 6f 6c 3b 0a 20 20 20 20 73  n prevCol;.    s
18d30 71 6c 69 74 65 33 54 6f 6b 65 6e 49 6e 69 74 28  qlite3TokenInit(
18d40 26 70 72 65 76 43 6f 6c 2c 20 70 54 61 62 2d 3e  &prevCol, pTab->
18d50 61 43 6f 6c 5b 70 54 61 62 2d 3e 6e 43 6f 6c 2d  aCol[pTab->nCol-
18d60 31 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70  1].zName);.    p
18d70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78  List = sqlite3Ex
18d80 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61  prListAppend(pPa
18d90 72 73 65 2c 20 30 2c 0a 20 20 20 20 20 20 20 20  rse, 0,.        
18da0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
18db0 72 41 6c 6c 6f 63 28 64 62 2c 20 54 4b 5f 49 44  rAlloc(db, TK_ID
18dc0 2c 20 26 70 72 65 76 43 6f 6c 2c 20 30 29 29 3b  , &prevCol, 0));
18dd0 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 3d 3d  .    if( pList==
18de0 30 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72  0 ) goto exit_cr
18df0 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20  eate_index;.    
18e00 61 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e 6e  assert( pList->n
18e10 45 78 70 72 3d 3d 31 20 29 3b 0a 20 20 20 20 73  Expr==1 );.    s
18e20 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 53 65  qlite3ExprListSe
18e30 74 53 6f 72 74 4f 72 64 65 72 28 70 4c 69 73 74  tSortOrder(pList
18e40 2c 20 73 6f 72 74 4f 72 64 65 72 29 3b 0a 20 20  , sortOrder);.  
18e50 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74  }else{.    sqlit
18e60 65 33 45 78 70 72 4c 69 73 74 43 68 65 63 6b 4c  e3ExprListCheckL
18e70 65 6e 67 74 68 28 70 50 61 72 73 65 2c 20 70 4c  ength(pParse, pL
18e80 69 73 74 2c 20 22 69 6e 64 65 78 22 29 3b 0a 20  ist, "index");. 
18e90 20 7d 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20   }..  /* Figure 
18ea0 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20 62 79 74  out how many byt
18eb0 65 73 20 6f 66 20 73 70 61 63 65 20 61 72 65 20  es of space are 
18ec0 72 65 71 75 69 72 65 64 20 74 6f 20 73 74 6f 72  required to stor
18ed0 65 20 65 78 70 6c 69 63 69 74 6c 79 0a 20 20 2a  e explicitly.  *
18ee0 2a 20 73 70 65 63 69 66 69 65 64 20 63 6f 6c 6c  * specified coll
18ef0 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 6e  ation sequence n
18f00 61 6d 65 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  ames..  */.  for
18f10 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e  (i=0; i<pList->n
18f20 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
18f30 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70 4c  Expr *pExpr = pL
18f40 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b  ist->a[i].pExpr;
18f50 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78  .    assert( pEx
18f60 70 72 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28  pr!=0 );.    if(
18f70 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43   pExpr->op==TK_C
18f80 4f 4c 4c 41 54 45 20 29 7b 0a 20 20 20 20 20 20  OLLATE ){.      
18f90 6e 45 78 74 72 61 20 2b 3d 20 28 31 20 2b 20 73  nExtra += (1 + s
18fa0 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70  qlite3Strlen30(p
18fb0 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 29  Expr->u.zToken))
18fc0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
18fd0 2a 20 0a 20 20 2a 2a 20 41 6c 6c 6f 63 61 74 65  * .  ** Allocate
18fe0 20 74 68 65 20 69 6e 64 65 78 20 73 74 72 75 63   the index struc
18ff0 74 75 72 65 2e 20 0a 20 20 2a 2f 0a 20 20 6e 4e  ture. .  */.  nN
19000 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 53 74 72  ame = sqlite3Str
19010 6c 65 6e 33 30 28 7a 4e 61 6d 65 29 3b 0a 20 20  len30(zName);.  
19020 6e 45 78 74 72 61 43 6f 6c 20 3d 20 70 50 6b 20  nExtraCol = pPk 
19030 3f 20 70 50 6b 2d 3e 6e 4b 65 79 43 6f 6c 20 3a  ? pPk->nKeyCol :
19040 20 31 3b 0a 20 20 70 49 6e 64 65 78 20 3d 20 73   1;.  pIndex = s
19050 71 6c 69 74 65 33 41 6c 6c 6f 63 61 74 65 49 6e  qlite3AllocateIn
19060 64 65 78 4f 62 6a 65 63 74 28 64 62 2c 20 70 4c  dexObject(db, pL
19070 69 73 74 2d 3e 6e 45 78 70 72 20 2b 20 6e 45 78  ist->nExpr + nEx
19080 74 72 61 43 6f 6c 2c 0a 20 20 20 20 20 20 20 20  traCol,.        
19090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
190a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 4e                nN
190b0 61 6d 65 20 2b 20 6e 45 78 74 72 61 20 2b 20 31  ame + nExtra + 1
190c0 2c 20 26 7a 45 78 74 72 61 29 3b 0a 20 20 69 66  , &zExtra);.  if
190d0 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
190e0 65 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65  ed ){.    goto e
190f0 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
19100 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
19110 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e  EIGHT_BYTE_ALIGN
19120 4d 45 4e 54 28 70 49 6e 64 65 78 2d 3e 61 69 52  MENT(pIndex->aiR
19130 6f 77 4c 6f 67 45 73 74 29 20 29 3b 0a 20 20 61  owLogEst) );.  a
19140 73 73 65 72 74 28 20 45 49 47 48 54 5f 42 59 54  ssert( EIGHT_BYT
19150 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 70 49 6e 64  E_ALIGNMENT(pInd
19160 65 78 2d 3e 61 7a 43 6f 6c 6c 29 20 29 3b 0a 20  ex->azColl) );. 
19170 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 20 3d   pIndex->zName =
19180 20 7a 45 78 74 72 61 3b 0a 20 20 7a 45 78 74 72   zExtra;.  zExtr
19190 61 20 2b 3d 20 6e 4e 61 6d 65 20 2b 20 31 3b 0a  a += nName + 1;.
191a0 20 20 6d 65 6d 63 70 79 28 70 49 6e 64 65 78 2d    memcpy(pIndex-
191b0 3e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65 2c 20 6e  >zName, zName, n
191c0 4e 61 6d 65 2b 31 29 3b 0a 20 20 70 49 6e 64 65  Name+1);.  pInde
191d0 78 2d 3e 70 54 61 62 6c 65 20 3d 20 70 54 61 62  x->pTable = pTab
191e0 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 6f 6e 45 72  ;.  pIndex->onEr
191f0 72 6f 72 20 3d 20 28 75 38 29 6f 6e 45 72 72 6f  ror = (u8)onErro
19200 72 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 75 6e 69  r;.  pIndex->uni
19210 71 4e 6f 74 4e 75 6c 6c 20 3d 20 6f 6e 45 72 72  qNotNull = onErr
19220 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 3b 0a 20 20 70  or!=OE_None;.  p
19230 49 6e 64 65 78 2d 3e 69 64 78 54 79 70 65 20 3d  Index->idxType =
19240 20 70 4e 61 6d 65 20 3f 20 53 51 4c 49 54 45 5f   pName ? SQLITE_
19250 49 44 58 54 59 50 45 5f 41 50 50 44 45 46 20 3a  IDXTYPE_APPDEF :
19260 20 53 51 4c 49 54 45 5f 49 44 58 54 59 50 45 5f   SQLITE_IDXTYPE_
19270 55 4e 49 51 55 45 3b 0a 20 20 70 49 6e 64 65 78  UNIQUE;.  pIndex
19280 2d 3e 70 53 63 68 65 6d 61 20 3d 20 64 62 2d 3e  ->pSchema = db->
19290 61 44 62 5b 69 44 62 5d 2e 70 53 63 68 65 6d 61  aDb[iDb].pSchema
192a0 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 6e 4b 65 79  ;.  pIndex->nKey
192b0 43 6f 6c 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78  Col = pList->nEx
192c0 70 72 3b 0a 20 20 69 66 28 20 70 50 49 57 68 65  pr;.  if( pPIWhe
192d0 72 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  re ){.    sqlite
192e0 33 52 65 73 6f 6c 76 65 53 65 6c 66 52 65 66 65  3ResolveSelfRefe
192f0 72 65 6e 63 65 28 70 50 61 72 73 65 2c 20 70 54  rence(pParse, pT
19300 61 62 2c 20 4e 43 5f 50 61 72 74 49 64 78 2c 20  ab, NC_PartIdx, 
19310 70 50 49 57 68 65 72 65 2c 20 30 29 3b 0a 20 20  pPIWhere, 0);.  
19320 20 20 70 49 6e 64 65 78 2d 3e 70 50 61 72 74 49    pIndex->pPartI
19330 64 78 57 68 65 72 65 20 3d 20 70 50 49 57 68 65  dxWhere = pPIWhe
19340 72 65 3b 0a 20 20 20 20 70 50 49 57 68 65 72 65  re;.    pPIWhere
19350 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 61 73 73 65   = 0;.  }.  asse
19360 72 74 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d  rt( sqlite3Schem
19370 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20 69  aMutexHeld(db, i
19380 44 62 2c 20 30 29 20 29 3b 0a 0a 20 20 2f 2a 20  Db, 0) );..  /* 
19390 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  Check to see if 
193a0 77 65 20 73 68 6f 75 6c 64 20 68 6f 6e 6f 72 20  we should honor 
193b0 44 45 53 43 20 72 65 71 75 65 73 74 73 20 6f 6e  DESC requests on
193c0 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 73 0a 20   index columns. 
193d0 20 2a 2f 0a 20 20 69 66 28 20 70 44 62 2d 3e 70   */.  if( pDb->p
193e0 53 63 68 65 6d 61 2d 3e 66 69 6c 65 5f 66 6f 72  Schema->file_for
193f0 6d 61 74 3e 3d 34 20 29 7b 0a 20 20 20 20 73 6f  mat>=4 ){.    so
19400 72 74 4f 72 64 65 72 4d 61 73 6b 20 3d 20 2d 31  rtOrderMask = -1
19410 3b 20 20 20 2f 2a 20 48 6f 6e 6f 72 20 44 45 53  ;   /* Honor DES
19420 43 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  C */.  }else{.  
19430 20 20 73 6f 72 74 4f 72 64 65 72 4d 61 73 6b 20    sortOrderMask 
19440 3d 20 30 3b 20 20 20 20 2f 2a 20 49 67 6e 6f 72  = 0;    /* Ignor
19450 65 20 44 45 53 43 20 2a 2f 0a 20 20 7d 0a 0a 20  e DESC */.  }.. 
19460 20 2f 2a 20 41 6e 61 6c 79 7a 65 20 74 68 65 20   /* Analyze the 
19470 6c 69 73 74 20 6f 66 20 65 78 70 72 65 73 73 69  list of expressi
19480 6f 6e 73 20 74 68 61 74 20 66 6f 72 6d 20 74 68  ons that form th
19490 65 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 69  e terms of the i
194a0 6e 64 65 78 20 61 6e 64 0a 20 20 2a 2a 20 72 65  ndex and.  ** re
194b0 70 6f 72 74 20 61 6e 79 20 65 72 72 6f 72 73 2e  port any errors.
194c0 20 20 49 6e 20 74 68 65 20 63 6f 6d 6d 6f 6e 20    In the common 
194d0 63 61 73 65 20 77 68 65 72 65 20 74 68 65 20 65  case where the e
194e0 78 70 72 65 73 73 69 6f 6e 20 69 73 20 65 78 61  xpression is exa
194f0 63 74 6c 79 0a 20 20 2a 2a 20 61 20 74 61 62 6c  ctly.  ** a tabl
19500 65 20 63 6f 6c 75 6d 6e 2c 20 73 74 6f 72 65 20  e column, store 
19510 74 68 61 74 20 63 6f 6c 75 6d 6e 20 69 6e 20 61  that column in a
19520 69 43 6f 6c 75 6d 6e 5b 5d 2e 20 20 46 6f 72 20  iColumn[].  For 
19530 67 65 6e 65 72 61 6c 20 65 78 70 72 65 73 73 69  general expressi
19540 6f 6e 73 2c 0a 20 20 2a 2a 20 70 6f 70 75 6c 61  ons,.  ** popula
19550 74 65 20 70 49 6e 64 65 78 2d 3e 61 43 6f 6c 45  te pIndex->aColE
19560 78 70 72 20 61 6e 64 20 73 74 6f 72 65 20 58 4e  xpr and store XN
19570 5f 45 58 50 52 20 28 2d 32 29 20 69 6e 20 61 69  _EXPR (-2) in ai
19580 43 6f 6c 75 6d 6e 5b 5d 2e 0a 20 20 2a 2a 0a 20  Column[]..  **. 
19590 20 2a 2a 20 54 4f 44 4f 3a 20 49 73 73 75 65 20   ** TODO: Issue 
195a0 61 20 77 61 72 6e 69 6e 67 20 69 66 20 74 77 6f  a warning if two
195b0 20 6f 72 20 6d 6f 72 65 20 63 6f 6c 75 6d 6e 73   or more columns
195c0 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 61 72   of the index ar
195d0 65 20 69 64 65 6e 74 69 63 61 6c 2e 0a 20 20 2a  e identical..  *
195e0 2a 20 54 4f 44 4f 3a 20 49 73 73 75 65 20 61 20  * TODO: Issue a 
195f0 77 61 72 6e 69 6e 67 20 69 66 20 74 68 65 20 74  warning if the t
19600 61 62 6c 65 20 70 72 69 6d 61 72 79 20 6b 65 79  able primary key
19610 20 69 73 20 75 73 65 64 20 61 73 20 70 61 72 74   is used as part
19620 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 69 6e 64   of the.  ** ind
19630 65 78 20 6b 65 79 2e 0a 20 20 2a 2f 0a 20 20 66  ex key..  */.  f
19640 6f 72 28 69 3d 30 2c 20 70 4c 69 73 74 49 74 65  or(i=0, pListIte
19650 6d 3d 70 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 4c  m=pList->a; i<pL
19660 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 2c  ist->nExpr; i++,
19670 20 70 4c 69 73 74 49 74 65 6d 2b 2b 29 7b 0a 20   pListItem++){. 
19680 20 20 20 45 78 70 72 20 2a 70 43 45 78 70 72 3b     Expr *pCExpr;
19690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
196a0 20 20 2f 2a 20 54 68 65 20 69 2d 74 68 20 69 6e    /* The i-th in
196b0 64 65 78 20 65 78 70 72 65 73 73 69 6f 6e 20 2a  dex expression *
196c0 2f 0a 20 20 20 20 69 6e 74 20 72 65 71 75 65 73  /.    int reques
196d0 74 65 64 53 6f 72 74 4f 72 64 65 72 3b 20 20 20  tedSortOrder;   
196e0 20 20 20 20 20 2f 2a 20 41 53 43 20 6f 72 20 44       /* ASC or D
196f0 45 53 43 20 6f 6e 20 74 68 65 20 69 2d 74 68 20  ESC on the i-th 
19700 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20  expression */.  
19710 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43    const char *zC
19720 6f 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  oll;            
19730 20 2f 2a 20 43 6f 6c 6c 61 74 69 6f 6e 20 73 65   /* Collation se
19740 71 75 65 6e 63 65 20 6e 61 6d 65 20 2a 2f 0a 0a  quence name */..
19750 20 20 20 20 73 71 6c 69 74 65 33 53 74 72 69 6e      sqlite3Strin
19760 67 54 6f 49 64 28 70 4c 69 73 74 49 74 65 6d 2d  gToId(pListItem-
19770 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 73 71 6c  >pExpr);.    sql
19780 69 74 65 33 52 65 73 6f 6c 76 65 53 65 6c 66 52  ite3ResolveSelfR
19790 65 66 65 72 65 6e 63 65 28 70 50 61 72 73 65 2c  eference(pParse,
197a0 20 70 54 61 62 2c 20 4e 43 5f 49 64 78 45 78 70   pTab, NC_IdxExp
197b0 72 2c 20 70 4c 69 73 74 49 74 65 6d 2d 3e 70 45  r, pListItem->pE
197c0 78 70 72 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  xpr, 0);.    if(
197d0 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 20   pParse->nErr ) 
197e0 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
197f0 5f 69 6e 64 65 78 3b 0a 20 20 20 20 70 43 45 78  _index;.    pCEx
19800 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  pr = sqlite3Expr
19810 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 4c 69 73  SkipCollate(pLis
19820 74 49 74 65 6d 2d 3e 70 45 78 70 72 29 3b 0a 20  tItem->pExpr);. 
19830 20 20 20 69 66 28 20 70 43 45 78 70 72 2d 3e 6f     if( pCExpr->o
19840 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a  p!=TK_COLUMN ){.
19850 20 20 20 20 20 20 69 66 28 20 70 54 61 62 3d 3d        if( pTab==
19860 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
19870 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  e ){.        sql
19880 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
19890 72 73 65 2c 20 22 65 78 70 72 65 73 73 69 6f 6e  rse, "expression
198a0 73 20 70 72 6f 68 69 62 69 74 65 64 20 69 6e 20  s prohibited in 
198b0 50 52 49 4d 41 52 59 20 4b 45 59 20 61 6e 64 20  PRIMARY KEY and 
198c0 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ".              
198d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
198e0 20 20 22 55 4e 49 51 55 45 20 63 6f 6e 73 74 72    "UNIQUE constr
198f0 61 69 6e 74 73 22 29 3b 0a 20 20 20 20 20 20 20  aints");.       
19900 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
19910 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 20 20 7d  e_index;.      }
19920 0a 20 20 20 20 20 20 69 66 28 20 70 49 6e 64 65  .      if( pInde
19930 78 2d 3e 61 43 6f 6c 45 78 70 72 3d 3d 30 20 29  x->aColExpr==0 )
19940 7b 0a 20 20 20 20 20 20 20 20 45 78 70 72 4c 69  {.        ExprLi
19950 73 74 20 2a 70 43 6f 70 79 20 3d 20 73 71 6c 69  st *pCopy = sqli
19960 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 64  te3ExprListDup(d
19970 62 2c 20 70 4c 69 73 74 2c 20 30 29 3b 0a 20 20  b, pList, 0);.  
19980 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 61 43        pIndex->aC
19990 6f 6c 45 78 70 72 20 3d 20 70 43 6f 70 79 3b 0a  olExpr = pCopy;.
199a0 20 20 20 20 20 20 20 20 69 66 28 20 21 64 62 2d          if( !db-
199b0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
199c0 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
199d0 74 28 20 70 43 6f 70 79 21 3d 30 20 29 3b 0a 20  t( pCopy!=0 );. 
199e0 20 20 20 20 20 20 20 20 20 70 4c 69 73 74 49 74           pListIt
199f0 65 6d 20 3d 20 26 70 43 6f 70 79 2d 3e 61 5b 69  em = &pCopy->a[i
19a00 5d 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  ];.        }.   
19a10 20 20 20 7d 0a 20 20 20 20 20 20 6a 20 3d 20 58     }.      j = X
19a20 4e 5f 45 58 50 52 3b 0a 20 20 20 20 20 20 70 49  N_EXPR;.      pI
19a30 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69  ndex->aiColumn[i
19a40 5d 20 3d 20 58 4e 5f 45 58 50 52 3b 0a 20 20 20  ] = XN_EXPR;.   
19a50 20 20 20 70 49 6e 64 65 78 2d 3e 75 6e 69 71 4e     pIndex->uniqN
19a60 6f 74 4e 75 6c 6c 20 3d 20 30 3b 0a 20 20 20 20  otNull = 0;.    
19a70 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6a 20 3d  }else{.      j =
19a80 20 70 43 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e   pCExpr->iColumn
19a90 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
19aa0 6a 3c 3d 30 78 37 66 66 66 20 29 3b 0a 20 20 20  j<=0x7fff );.   
19ab0 20 20 20 69 66 28 20 6a 3c 30 20 29 7b 0a 20 20     if( j<0 ){.  
19ac0 20 20 20 20 20 20 6a 20 3d 20 70 54 61 62 2d 3e        j = pTab->
19ad0 69 50 4b 65 79 3b 0a 20 20 20 20 20 20 7d 65 6c  iPKey;.      }el
19ae0 73 65 20 69 66 28 20 70 54 61 62 2d 3e 61 43 6f  se if( pTab->aCo
19af0 6c 5b 6a 5d 2e 6e 6f 74 4e 75 6c 6c 3d 3d 30 20  l[j].notNull==0 
19b00 29 7b 0a 20 20 20 20 20 20 20 20 70 49 6e 64 65  ){.        pInde
19b10 78 2d 3e 75 6e 69 71 4e 6f 74 4e 75 6c 6c 20 3d  x->uniqNotNull =
19b20 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
19b30 20 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75    pIndex->aiColu
19b40 6d 6e 5b 69 5d 20 3d 20 28 69 31 36 29 6a 3b 0a  mn[i] = (i16)j;.
19b50 20 20 20 20 7d 0a 20 20 20 20 7a 43 6f 6c 6c 20      }.    zColl 
19b60 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 70 4c 69  = 0;.    if( pLi
19b70 73 74 49 74 65 6d 2d 3e 70 45 78 70 72 2d 3e 6f  stItem->pExpr->o
19b80 70 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45 20 29 7b  p==TK_COLLATE ){
19b90 0a 20 20 20 20 20 20 69 6e 74 20 6e 43 6f 6c 6c  .      int nColl
19ba0 3b 0a 20 20 20 20 20 20 7a 43 6f 6c 6c 20 3d 20  ;.      zColl = 
19bb0 70 4c 69 73 74 49 74 65 6d 2d 3e 70 45 78 70 72  pListItem->pExpr
19bc0 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20  ->u.zToken;.    
19bd0 20 20 6e 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65    nColl = sqlite
19be0 33 53 74 72 6c 65 6e 33 30 28 7a 43 6f 6c 6c 29  3Strlen30(zColl)
19bf0 20 2b 20 31 3b 0a 20 20 20 20 20 20 61 73 73 65   + 1;.      asse
19c00 72 74 28 20 6e 45 78 74 72 61 3e 3d 6e 43 6f 6c  rt( nExtra>=nCol
19c10 6c 20 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70  l );.      memcp
19c20 79 28 7a 45 78 74 72 61 2c 20 7a 43 6f 6c 6c 2c  y(zExtra, zColl,
19c30 20 6e 43 6f 6c 6c 29 3b 0a 20 20 20 20 20 20 7a   nColl);.      z
19c40 43 6f 6c 6c 20 3d 20 7a 45 78 74 72 61 3b 0a 20  Coll = zExtra;. 
19c50 20 20 20 20 20 7a 45 78 74 72 61 20 2b 3d 20 6e       zExtra += n
19c60 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 6e 45 78 74  Coll;.      nExt
19c70 72 61 20 2d 3d 20 6e 43 6f 6c 6c 3b 0a 20 20 20  ra -= nColl;.   
19c80 20 7d 65 6c 73 65 20 69 66 28 20 6a 3e 3d 30 20   }else if( j>=0 
19c90 29 7b 0a 20 20 20 20 20 20 7a 43 6f 6c 6c 20 3d  ){.      zColl =
19ca0 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a   pTab->aCol[j].z
19cb0 43 6f 6c 6c 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Coll;.    }.    
19cc0 69 66 28 20 21 7a 43 6f 6c 6c 20 29 20 7a 43 6f  if( !zColl ) zCo
19cd0 6c 6c 20 3d 20 73 71 6c 69 74 65 33 53 74 72 42  ll = sqlite3StrB
19ce0 49 4e 41 52 59 3b 0a 20 20 20 20 69 66 28 20 21  INARY;.    if( !
19cf0 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 26 26  db->init.busy &&
19d00 20 21 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 43   !sqlite3LocateC
19d10 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 7a  ollSeq(pParse, z
19d20 43 6f 6c 6c 29 20 29 7b 0a 20 20 20 20 20 20 67  Coll) ){.      g
19d30 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
19d40 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20  index;.    }.   
19d50 20 70 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c 5b   pIndex->azColl[
19d60 69 5d 20 3d 20 7a 43 6f 6c 6c 3b 0a 20 20 20 20  i] = zColl;.    
19d70 72 65 71 75 65 73 74 65 64 53 6f 72 74 4f 72 64  requestedSortOrd
19d80 65 72 20 3d 20 70 4c 69 73 74 49 74 65 6d 2d 3e  er = pListItem->
19d90 73 6f 72 74 4f 72 64 65 72 20 26 20 73 6f 72 74  sortOrder & sort
19da0 4f 72 64 65 72 4d 61 73 6b 3b 0a 20 20 20 20 70  OrderMask;.    p
19db0 49 6e 64 65 78 2d 3e 61 53 6f 72 74 4f 72 64 65  Index->aSortOrde
19dc0 72 5b 69 5d 20 3d 20 28 75 38 29 72 65 71 75 65  r[i] = (u8)reque
19dd0 73 74 65 64 53 6f 72 74 4f 72 64 65 72 3b 0a 20  stedSortOrder;. 
19de0 20 7d 0a 0a 20 20 2f 2a 20 41 70 70 65 6e 64 20   }..  /* Append 
19df0 74 68 65 20 74 61 62 6c 65 20 6b 65 79 20 74 6f  the table key to
19e00 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
19e10 69 6e 64 65 78 2e 20 20 46 6f 72 20 57 49 54 48  index.  For WITH
19e20 4f 55 54 20 52 4f 57 49 44 0a 20 20 2a 2a 20 74  OUT ROWID.  ** t
19e30 61 62 6c 65 73 20 28 77 68 65 6e 20 70 50 6b 21  ables (when pPk!
19e40 3d 30 29 20 74 68 69 73 20 77 69 6c 6c 20 62 65  =0) this will be
19e50 20 74 68 65 20 64 65 63 6c 61 72 65 64 20 50 52   the declared PR
19e60 49 4d 41 52 59 20 4b 45 59 2e 20 20 46 6f 72 0a  IMARY KEY.  For.
19e70 20 20 2a 2a 20 6e 6f 72 6d 61 6c 20 74 61 62 6c    ** normal tabl
19e80 65 73 20 28 77 68 65 6e 20 70 50 6b 3d 3d 30 29  es (when pPk==0)
19e90 20 74 68 69 73 20 77 69 6c 6c 20 62 65 20 74 68   this will be th
19ea0 65 20 72 6f 77 69 64 2e 0a 20 20 2a 2f 0a 20 20  e rowid..  */.  
19eb0 69 66 28 20 70 50 6b 20 29 7b 0a 20 20 20 20 66  if( pPk ){.    f
19ec0 6f 72 28 6a 3d 30 3b 20 6a 3c 70 50 6b 2d 3e 6e  or(j=0; j<pPk->n
19ed0 4b 65 79 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20  KeyCol; j++){.  
19ee0 20 20 20 20 69 6e 74 20 78 20 3d 20 70 50 6b 2d      int x = pPk-
19ef0 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 3b 0a 20 20  >aiColumn[j];.  
19f00 20 20 20 20 61 73 73 65 72 74 28 20 78 3e 3d 30      assert( x>=0
19f10 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 68 61   );.      if( ha
19f20 73 43 6f 6c 75 6d 6e 28 70 49 6e 64 65 78 2d 3e  sColumn(pIndex->
19f30 61 69 43 6f 6c 75 6d 6e 2c 20 70 49 6e 64 65 78  aiColumn, pIndex
19f40 2d 3e 6e 4b 65 79 43 6f 6c 2c 20 78 29 20 29 7b  ->nKeyCol, x) ){
19f50 0a 20 20 20 20 20 20 20 20 70 49 6e 64 65 78 2d  .        pIndex-
19f60 3e 6e 43 6f 6c 75 6d 6e 2d 2d 3b 20 0a 20 20 20  >nColumn--; .   
19f70 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
19f80 20 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75    pIndex->aiColu
19f90 6d 6e 5b 69 5d 20 3d 20 78 3b 0a 20 20 20 20 20  mn[i] = x;.     
19fa0 20 20 20 70 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c     pIndex->azCol
19fb0 6c 5b 69 5d 20 3d 20 70 50 6b 2d 3e 61 7a 43 6f  l[i] = pPk->azCo
19fc0 6c 6c 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20 70  ll[j];.        p
19fd0 49 6e 64 65 78 2d 3e 61 53 6f 72 74 4f 72 64 65  Index->aSortOrde
19fe0 72 5b 69 5d 20 3d 20 70 50 6b 2d 3e 61 53 6f 72  r[i] = pPk->aSor
19ff0 74 4f 72 64 65 72 5b 6a 5d 3b 0a 20 20 20 20 20  tOrder[j];.     
1a000 20 20 20 69 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a     i++;.      }.
1a010 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
1a020 28 20 69 3d 3d 70 49 6e 64 65 78 2d 3e 6e 43 6f  ( i==pIndex->nCo
1a030 6c 75 6d 6e 20 29 3b 0a 20 20 7d 65 6c 73 65 7b  lumn );.  }else{
1a040 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e 61 69 43  .    pIndex->aiC
1a050 6f 6c 75 6d 6e 5b 69 5d 20 3d 20 58 4e 5f 52 4f  olumn[i] = XN_RO
1a060 57 49 44 3b 0a 20 20 20 20 70 49 6e 64 65 78 2d  WID;.    pIndex-
1a070 3e 61 7a 43 6f 6c 6c 5b 69 5d 20 3d 20 73 71 6c  >azColl[i] = sql
1a080 69 74 65 33 53 74 72 42 49 4e 41 52 59 3b 0a 20  ite3StrBINARY;. 
1a090 20 7d 0a 20 20 73 71 6c 69 74 65 33 44 65 66 61   }.  sqlite3Defa
1a0a0 75 6c 74 52 6f 77 45 73 74 28 70 49 6e 64 65 78  ultRowEst(pIndex
1a0b0 29 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  );.  if( pParse-
1a0c0 3e 70 4e 65 77 54 61 62 6c 65 3d 3d 30 20 29 20  >pNewTable==0 ) 
1a0d0 65 73 74 69 6d 61 74 65 49 6e 64 65 78 57 69 64  estimateIndexWid
1a0e0 74 68 28 70 49 6e 64 65 78 29 3b 0a 0a 20 20 2f  th(pIndex);..  /
1a0f0 2a 20 49 66 20 74 68 69 73 20 69 6e 64 65 78 20  * If this index 
1a100 63 6f 6e 74 61 69 6e 73 20 65 76 65 72 79 20 63  contains every c
1a110 6f 6c 75 6d 6e 20 6f 66 20 69 74 73 20 74 61 62  olumn of its tab
1a120 6c 65 2c 20 74 68 65 6e 20 6d 61 72 6b 0a 20 20  le, then mark.  
1a130 2a 2a 20 69 74 20 61 73 20 61 20 63 6f 76 65 72  ** it as a cover
1a140 69 6e 67 20 69 6e 64 65 78 20 2a 2f 0a 20 20 61  ing index */.  a
1a150 73 73 65 72 74 28 20 48 61 73 52 6f 77 69 64 28  ssert( HasRowid(
1a160 70 54 61 62 29 20 0a 20 20 20 20 20 20 7c 7c 20  pTab) .      || 
1a170 70 54 61 62 2d 3e 69 50 4b 65 79 3c 30 20 7c 7c  pTab->iPKey<0 ||
1a180 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 4f 66   sqlite3ColumnOf
1a190 49 6e 64 65 78 28 70 49 6e 64 65 78 2c 20 70 54  Index(pIndex, pT
1a1a0 61 62 2d 3e 69 50 4b 65 79 29 3e 3d 30 20 29 3b  ab->iPKey)>=0 );
1a1b0 0a 20 20 69 66 28 20 70 54 62 6c 4e 61 6d 65 21  .  if( pTblName!
1a1c0 3d 30 20 26 26 20 70 49 6e 64 65 78 2d 3e 6e 43  =0 && pIndex->nC
1a1d0 6f 6c 75 6d 6e 3e 3d 70 54 61 62 2d 3e 6e 43 6f  olumn>=pTab->nCo
1a1e0 6c 20 29 7b 0a 20 20 20 20 70 49 6e 64 65 78 2d  l ){.    pIndex-
1a1f0 3e 69 73 43 6f 76 65 72 69 6e 67 20 3d 20 31 3b  >isCovering = 1;
1a200 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c  .    for(j=0; j<
1a210 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29  pTab->nCol; j++)
1a220 7b 0a 20 20 20 20 20 20 69 66 28 20 6a 3d 3d 70  {.      if( j==p
1a230 54 61 62 2d 3e 69 50 4b 65 79 20 29 20 63 6f 6e  Tab->iPKey ) con
1a240 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 66 28  tinue;.      if(
1a250 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 4f 66   sqlite3ColumnOf
1a260 49 6e 64 65 78 28 70 49 6e 64 65 78 2c 6a 29 3e  Index(pIndex,j)>
1a270 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =0 ) continue;. 
1a280 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 69 73 43       pIndex->isC
1a290 6f 76 65 72 69 6e 67 20 3d 20 30 3b 0a 20 20 20  overing = 0;.   
1a2a0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1a2b0 20 20 7d 0a 0a 20 20 69 66 28 20 70 54 61 62 3d    }..  if( pTab=
1a2c0 3d 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62  =pParse->pNewTab
1a2d0 6c 65 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69  le ){.    /* Thi
1a2e0 73 20 72 6f 75 74 69 6e 65 20 68 61 73 20 62 65  s routine has be
1a2f0 65 6e 20 63 61 6c 6c 65 64 20 74 6f 20 63 72 65  en called to cre
1a300 61 74 65 20 61 6e 20 61 75 74 6f 6d 61 74 69 63  ate an automatic
1a310 20 69 6e 64 65 78 20 61 73 20 61 0a 20 20 20 20   index as a.    
1a320 2a 2a 20 72 65 73 75 6c 74 20 6f 66 20 61 20 50  ** result of a P
1a330 52 49 4d 41 52 59 20 4b 45 59 20 6f 72 20 55 4e  RIMARY KEY or UN
1a340 49 51 55 45 20 63 6c 61 75 73 65 20 6f 6e 20 61  IQUE clause on a
1a350 20 63 6f 6c 75 6d 6e 20 64 65 66 69 6e 69 74 69   column definiti
1a360 6f 6e 2c 20 6f 72 0a 20 20 20 20 2a 2a 20 61 20  on, or.    ** a 
1a370 50 52 49 4d 41 52 59 20 4b 45 59 20 6f 72 20 55  PRIMARY KEY or U
1a380 4e 49 51 55 45 20 63 6c 61 75 73 65 20 66 6f 6c  NIQUE clause fol
1a390 6c 6f 77 69 6e 67 20 74 68 65 20 63 6f 6c 75 6d  lowing the colum
1a3a0 6e 20 64 65 66 69 6e 69 74 69 6f 6e 73 2e 0a 20  n definitions.. 
1a3b0 20 20 20 2a 2a 20 69 2e 65 2e 20 6f 6e 65 20 6f     ** i.e. one o
1a3c0 66 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  f:.    **.    **
1a3d0 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 28   CREATE TABLE t(
1a3e0 78 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 79  x PRIMARY KEY, y
1a3f0 29 3b 0a 20 20 20 20 2a 2a 20 43 52 45 41 54 45  );.    ** CREATE
1a400 20 54 41 42 4c 45 20 74 28 78 2c 20 79 2c 20 55   TABLE t(x, y, U
1a410 4e 49 51 55 45 28 78 2c 20 79 29 29 3b 0a 20 20  NIQUE(x, y));.  
1a420 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 45 69 74 68    **.    ** Eith
1a430 65 72 20 77 61 79 2c 20 63 68 65 63 6b 20 74 6f  er way, check to
1a440 20 73 65 65 20 69 66 20 74 68 65 20 74 61 62 6c   see if the tabl
1a450 65 20 61 6c 72 65 61 64 79 20 68 61 73 20 73 75  e already has su
1a460 63 68 20 61 6e 20 69 6e 64 65 78 2e 20 49 66 0a  ch an index. If.
1a470 20 20 20 20 2a 2a 20 73 6f 2c 20 64 6f 6e 27 74      ** so, don't
1a480 20 62 6f 74 68 65 72 20 63 72 65 61 74 69 6e 67   bother creating
1a490 20 74 68 69 73 20 6f 6e 65 2e 20 54 68 69 73 20   this one. This 
1a4a0 6f 6e 6c 79 20 61 70 70 6c 69 65 73 20 74 6f 0a  only applies to.
1a4b0 20 20 20 20 2a 2a 20 61 75 74 6f 6d 61 74 69 63      ** automatic
1a4c0 61 6c 6c 79 20 63 72 65 61 74 65 64 20 69 6e 64  ally created ind
1a4d0 69 63 65 73 2e 20 55 73 65 72 73 20 63 61 6e 20  ices. Users can 
1a4e0 64 6f 20 61 73 20 74 68 65 79 20 77 69 73 68 20  do as they wish 
1a4f0 77 69 74 68 0a 20 20 20 20 2a 2a 20 65 78 70 6c  with.    ** expl
1a500 69 63 69 74 20 69 6e 64 69 63 65 73 2e 0a 20 20  icit indices..  
1a510 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 77 6f 20    **.    ** Two 
1a520 55 4e 49 51 55 45 20 6f 72 20 50 52 49 4d 41 52  UNIQUE or PRIMAR
1a530 59 20 4b 45 59 20 63 6f 6e 73 74 72 61 69 6e 74  Y KEY constraint
1a540 73 20 61 72 65 20 63 6f 6e 73 69 64 65 72 65 64  s are considered
1a550 20 65 71 75 69 76 61 6c 65 6e 74 0a 20 20 20 20   equivalent.    
1a560 2a 2a 20 28 61 6e 64 20 74 68 75 73 20 73 75 70  ** (and thus sup
1a570 70 72 65 73 73 69 6e 67 20 74 68 65 20 73 65 63  pressing the sec
1a580 6f 6e 64 20 6f 6e 65 29 20 65 76 65 6e 20 69 66  ond one) even if
1a590 20 74 68 65 79 20 68 61 76 65 20 64 69 66 66 65   they have diffe
1a5a0 72 65 6e 74 0a 20 20 20 20 2a 2a 20 73 6f 72 74  rent.    ** sort
1a5b0 20 6f 72 64 65 72 73 2e 0a 20 20 20 20 2a 2a 0a   orders..    **.
1a5c0 20 20 20 20 2a 2a 20 49 66 20 74 68 65 72 65 20      ** If there 
1a5d0 61 72 65 20 64 69 66 66 65 72 65 6e 74 20 63 6f  are different co
1a5e0 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
1a5f0 73 20 6f 72 20 69 66 20 74 68 65 20 63 6f 6c 75  s or if the colu
1a600 6d 6e 73 20 6f 66 0a 20 20 20 20 2a 2a 20 74 68  mns of.    ** th
1a610 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 6f 63 63  e constraint occ
1a620 75 72 20 69 6e 20 64 69 66 66 65 72 65 6e 74 20  ur in different 
1a630 6f 72 64 65 72 73 2c 20 74 68 65 6e 20 74 68 65  orders, then the
1a640 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 61 72 65   constraints are
1a650 0a 20 20 20 20 2a 2a 20 63 6f 6e 73 69 64 65 72  .    ** consider
1a660 65 64 20 64 69 73 74 69 6e 63 74 20 61 6e 64 20  ed distinct and 
1a670 62 6f 74 68 20 72 65 73 75 6c 74 20 69 6e 20 73  both result in s
1a680 65 70 61 72 61 74 65 20 69 6e 64 69 63 65 73 2e  eparate indices.
1a690 0a 20 20 20 20 2a 2f 0a 20 20 20 20 49 6e 64 65  .    */.    Inde
1a6a0 78 20 2a 70 49 64 78 3b 0a 20 20 20 20 66 6f 72  x *pIdx;.    for
1a6b0 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64  (pIdx=pTab->pInd
1a6c0 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70  ex; pIdx; pIdx=p
1a6d0 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  Idx->pNext){.   
1a6e0 20 20 20 69 6e 74 20 6b 3b 0a 20 20 20 20 20 20     int k;.      
1a6f0 61 73 73 65 72 74 28 20 49 73 55 6e 69 71 75 65  assert( IsUnique
1a700 49 6e 64 65 78 28 70 49 64 78 29 20 29 3b 0a 20  Index(pIdx) );. 
1a710 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49 64       assert( pId
1a720 78 2d 3e 69 64 78 54 79 70 65 21 3d 53 51 4c 49  x->idxType!=SQLI
1a730 54 45 5f 49 44 58 54 59 50 45 5f 41 50 50 44 45  TE_IDXTYPE_APPDE
1a740 46 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  F );.      asser
1a750 74 28 20 49 73 55 6e 69 71 75 65 49 6e 64 65 78  t( IsUniqueIndex
1a760 28 70 49 6e 64 65 78 29 20 29 3b 0a 0a 20 20 20  (pIndex) );..   
1a770 20 20 20 69 66 28 20 70 49 64 78 2d 3e 6e 4b 65     if( pIdx->nKe
1a780 79 43 6f 6c 21 3d 70 49 6e 64 65 78 2d 3e 6e 4b  yCol!=pIndex->nK
1a790 65 79 43 6f 6c 20 29 20 63 6f 6e 74 69 6e 75 65  eyCol ) continue
1a7a0 3b 0a 20 20 20 20 20 20 66 6f 72 28 6b 3d 30 3b  ;.      for(k=0;
1a7b0 20 6b 3c 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c   k<pIdx->nKeyCol
1a7c0 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; k++){.        
1a7d0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 31 3b 0a  const char *z1;.
1a7e0 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68          const ch
1a7f0 61 72 20 2a 7a 32 3b 0a 20 20 20 20 20 20 20 20  ar *z2;.        
1a800 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e 61 69  assert( pIdx->ai
1a810 43 6f 6c 75 6d 6e 5b 6b 5d 3e 3d 30 20 29 3b 0a  Column[k]>=0 );.
1a820 20 20 20 20 20 20 20 20 69 66 28 20 70 49 64 78          if( pIdx
1a830 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6b 5d 21 3d 70  ->aiColumn[k]!=p
1a840 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b  Index->aiColumn[
1a850 6b 5d 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  k] ) break;.    
1a860 20 20 20 20 7a 31 20 3d 20 70 49 64 78 2d 3e 61      z1 = pIdx->a
1a870 7a 43 6f 6c 6c 5b 6b 5d 3b 0a 20 20 20 20 20 20  zColl[k];.      
1a880 20 20 7a 32 20 3d 20 70 49 6e 64 65 78 2d 3e 61    z2 = pIndex->a
1a890 7a 43 6f 6c 6c 5b 6b 5d 3b 0a 20 20 20 20 20 20  zColl[k];.      
1a8a0 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72    if( sqlite3Str
1a8b0 49 43 6d 70 28 7a 31 2c 20 7a 32 29 20 29 20 62  ICmp(z1, z2) ) b
1a8c0 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
1a8d0 20 20 20 20 69 66 28 20 6b 3d 3d 70 49 64 78 2d      if( k==pIdx-
1a8e0 3e 6e 4b 65 79 43 6f 6c 20 29 7b 0a 20 20 20 20  >nKeyCol ){.    
1a8f0 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 6f 6e      if( pIdx->on
1a900 45 72 72 6f 72 21 3d 70 49 6e 64 65 78 2d 3e 6f  Error!=pIndex->o
1a910 6e 45 72 72 6f 72 20 29 7b 0a 20 20 20 20 20 20  nError ){.      
1a920 20 20 20 20 2f 2a 20 54 68 69 73 20 63 6f 6e 73      /* This cons
1a930 74 72 61 69 6e 74 20 63 72 65 61 74 65 73 20 74  traint creates t
1a940 68 65 20 73 61 6d 65 20 69 6e 64 65 78 20 61 73  he same index as
1a950 20 61 20 70 72 65 76 69 6f 75 73 0a 20 20 20 20   a previous.    
1a960 20 20 20 20 20 20 2a 2a 20 63 6f 6e 73 74 72 61        ** constra
1a970 69 6e 74 20 73 70 65 63 69 66 69 65 64 20 73 6f  int specified so
1a980 6d 65 77 68 65 72 65 20 69 6e 20 74 68 65 20 43  mewhere in the C
1a990 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74  REATE TABLE stat
1a9a0 65 6d 65 6e 74 2e 0a 20 20 20 20 20 20 20 20 20  ement..         
1a9b0 20 2a 2a 20 48 6f 77 65 76 65 72 20 74 68 65 20   ** However the 
1a9c0 4f 4e 20 43 4f 4e 46 4c 49 43 54 20 63 6c 61 75  ON CONFLICT clau
1a9d0 73 65 73 20 61 72 65 20 64 69 66 66 65 72 65 6e  ses are differen
1a9e0 74 2e 20 49 66 20 62 6f 74 68 20 74 68 69 73 20  t. If both this 
1a9f0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 6f  .          ** co
1aa00 6e 73 74 72 61 69 6e 74 20 61 6e 64 20 74 68 65  nstraint and the
1aa10 20 70 72 65 76 69 6f 75 73 20 65 71 75 69 76 61   previous equiva
1aa20 6c 65 6e 74 20 63 6f 6e 73 74 72 61 69 6e 74 20  lent constraint 
1aa30 68 61 76 65 20 65 78 70 6c 69 63 69 74 0a 20 20  have explicit.  
1aa40 20 20 20 20 20 20 20 20 2a 2a 20 4f 4e 20 43 4f          ** ON CO
1aa50 4e 46 4c 49 43 54 20 63 6c 61 75 73 65 73 20 74  NFLICT clauses t
1aa60 68 69 73 20 69 73 20 61 6e 20 65 72 72 6f 72 2e  his is an error.
1aa70 20 4f 74 68 65 72 77 69 73 65 2c 20 75 73 65 20   Otherwise, use 
1aa80 74 68 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  the.          **
1aa90 20 65 78 70 6c 69 63 69 74 6c 79 20 73 70 65 63   explicitly spec
1aaa0 69 66 69 65 64 20 62 65 68 61 76 69 6f 72 20 66  ified behavior f
1aab0 6f 72 20 74 68 65 20 69 6e 64 65 78 2e 0a 20 20  or the index..  
1aac0 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
1aad0 20 20 20 20 20 69 66 28 20 21 28 70 49 64 78 2d       if( !(pIdx-
1aae0 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 44 65 66  >onError==OE_Def
1aaf0 61 75 6c 74 20 7c 7c 20 70 49 6e 64 65 78 2d 3e  ault || pIndex->
1ab00 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 44 65 66 61  onError==OE_Defa
1ab10 75 6c 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ult) ){.        
1ab20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
1ab30 4d 73 67 28 70 50 61 72 73 65 2c 20 0a 20 20 20  Msg(pParse, .   
1ab40 20 20 20 20 20 20 20 20 20 20 20 20 20 22 63 6f               "co
1ab50 6e 66 6c 69 63 74 69 6e 67 20 4f 4e 20 43 4f 4e  nflicting ON CON
1ab60 46 4c 49 43 54 20 63 6c 61 75 73 65 73 20 73 70  FLICT clauses sp
1ab70 65 63 69 66 69 65 64 22 2c 20 30 29 3b 0a 20 20  ecified", 0);.  
1ab80 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1ab90 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 6f 6e      if( pIdx->on
1aba0 45 72 72 6f 72 3d 3d 4f 45 5f 44 65 66 61 75 6c  Error==OE_Defaul
1abb0 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  t ){.           
1abc0 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 20 3d   pIdx->onError =
1abd0 20 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72   pIndex->onError
1abe0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
1abf0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1ac00 70 52 65 74 20 3d 20 70 49 64 78 3b 0a 20 20 20  pRet = pIdx;.   
1ac10 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63       goto exit_c
1ac20 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20  reate_index;.   
1ac30 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
1ac40 20 20 2f 2a 20 4c 69 6e 6b 20 74 68 65 20 6e 65    /* Link the ne
1ac50 77 20 49 6e 64 65 78 20 73 74 72 75 63 74 75 72  w Index structur
1ac60 65 20 74 6f 20 69 74 73 20 74 61 62 6c 65 20 61  e to its table a
1ac70 6e 64 20 74 6f 20 74 68 65 20 6f 74 68 65 72 0a  nd to the other.
1ac80 20 20 2a 2a 20 69 6e 2d 6d 65 6d 6f 72 79 20 64    ** in-memory d
1ac90 61 74 61 62 61 73 65 20 73 74 72 75 63 74 75 72  atabase structur
1aca0 65 73 2e 20 0a 20 20 2a 2f 0a 20 20 61 73 73 65  es. .  */.  asse
1acb0 72 74 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  rt( pParse->nErr
1acc0 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 64 62 2d  ==0 );.  if( db-
1acd0 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20 20  >init.busy ){.  
1ace0 20 20 49 6e 64 65 78 20 2a 70 3b 0a 20 20 20 20    Index *p;.    
1acf0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 53  assert( sqlite3S
1ad00 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64  chemaMutexHeld(d
1ad10 62 2c 20 30 2c 20 70 49 6e 64 65 78 2d 3e 70 53  b, 0, pIndex->pS
1ad20 63 68 65 6d 61 29 20 29 3b 0a 20 20 20 20 70 20  chema) );.    p 
1ad30 3d 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73  = sqlite3HashIns
1ad40 65 72 74 28 26 70 49 6e 64 65 78 2d 3e 70 53 63  ert(&pIndex->pSc
1ad50 68 65 6d 61 2d 3e 69 64 78 48 61 73 68 2c 20 0a  hema->idxHash, .
1ad60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ad70 20 20 20 20 20 20 20 20 20 20 70 49 6e 64 65 78            pIndex
1ad80 2d 3e 7a 4e 61 6d 65 2c 20 70 49 6e 64 65 78 29  ->zName, pIndex)
1ad90 3b 0a 20 20 20 20 69 66 28 20 70 20 29 7b 0a 20  ;.    if( p ){. 
1ada0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 3d 3d       assert( p==
1adb0 70 49 6e 64 65 78 20 29 3b 20 20 2f 2a 20 4d 61  pIndex );  /* Ma
1adc0 6c 6c 6f 63 20 6d 75 73 74 20 68 61 76 65 20 66  lloc must have f
1add0 61 69 6c 65 64 20 2a 2f 0a 20 20 20 20 20 20 73  ailed */.      s
1ade0 71 6c 69 74 65 33 4f 6f 6d 46 61 75 6c 74 28 64  qlite3OomFault(d
1adf0 62 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65  b);.      goto e
1ae00 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
1ae10 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 62 2d 3e  ;.    }.    db->
1ae20 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f  flags |= SQLITE_
1ae30 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a 20  InternChanges;. 
1ae40 20 20 20 69 66 28 20 70 54 62 6c 4e 61 6d 65 21     if( pTblName!
1ae50 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 49 6e 64  =0 ){.      pInd
1ae60 65 78 2d 3e 74 6e 75 6d 20 3d 20 64 62 2d 3e 69  ex->tnum = db->i
1ae70 6e 69 74 2e 6e 65 77 54 6e 75 6d 3b 0a 20 20 20  nit.newTnum;.   
1ae80 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20   }.  }..  /* If 
1ae90 74 68 69 73 20 69 73 20 74 68 65 20 69 6e 69 74  this is the init
1aea0 69 61 6c 20 43 52 45 41 54 45 20 49 4e 44 45 58  ial CREATE INDEX
1aeb0 20 73 74 61 74 65 6d 65 6e 74 20 28 6f 72 20 43   statement (or C
1aec0 52 45 41 54 45 20 54 41 42 4c 45 20 69 66 20 74  REATE TABLE if t
1aed0 68 65 0a 20 20 2a 2a 20 69 6e 64 65 78 20 69 73  he.  ** index is
1aee0 20 61 6e 20 69 6d 70 6c 69 65 64 20 69 6e 64 65   an implied inde
1aef0 78 20 66 6f 72 20 61 20 55 4e 49 51 55 45 20 6f  x for a UNIQUE o
1af00 72 20 50 52 49 4d 41 52 59 20 4b 45 59 20 63 6f  r PRIMARY KEY co
1af10 6e 73 74 72 61 69 6e 74 29 20 74 68 65 6e 0a 20  nstraint) then. 
1af20 20 2a 2a 20 65 6d 69 74 20 63 6f 64 65 20 74 6f   ** emit code to
1af30 20 61 6c 6c 6f 63 61 74 65 20 74 68 65 20 69 6e   allocate the in
1af40 64 65 78 20 72 6f 6f 74 70 61 67 65 20 6f 6e 20  dex rootpage on 
1af50 64 69 73 6b 20 61 6e 64 20 6d 61 6b 65 20 61 6e  disk and make an
1af60 20 65 6e 74 72 79 20 66 6f 72 0a 20 20 2a 2a 20   entry for.  ** 
1af70 74 68 65 20 69 6e 64 65 78 20 69 6e 20 74 68 65  the index in the
1af80 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74   sqlite_master t
1af90 61 62 6c 65 20 61 6e 64 20 70 6f 70 75 6c 61 74  able and populat
1afa0 65 20 74 68 65 20 69 6e 64 65 78 20 77 69 74 68  e the index with
1afb0 0a 20 20 2a 2a 20 63 6f 6e 74 65 6e 74 2e 20 20  .  ** content.  
1afc0 42 75 74 2c 20 64 6f 20 6e 6f 74 20 64 6f 20 74  But, do not do t
1afd0 68 69 73 20 69 66 20 77 65 20 61 72 65 20 73 69  his if we are si
1afe0 6d 70 6c 79 20 72 65 61 64 69 6e 67 20 74 68 65  mply reading the
1aff0 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 0a 20   sqlite_master. 
1b000 20 2a 2a 20 74 61 62 6c 65 20 74 6f 20 70 61 72   ** table to par
1b010 73 65 20 74 68 65 20 73 63 68 65 6d 61 2c 20 6f  se the schema, o
1b020 72 20 69 66 20 74 68 69 73 20 69 6e 64 65 78 20  r if this index 
1b030 69 73 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b  is the PRIMARY K
1b040 45 59 20 69 6e 64 65 78 0a 20 20 2a 2a 20 6f 66  EY index.  ** of
1b050 20 61 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44   a WITHOUT ROWID
1b060 20 74 61 62 6c 65 2e 0a 20 20 2a 2a 0a 20 20 2a   table..  **.  *
1b070 2a 20 49 66 20 70 54 62 6c 4e 61 6d 65 3d 3d 30  * If pTblName==0
1b080 20 69 74 20 6d 65 61 6e 73 20 74 68 69 73 20 69   it means this i
1b090 6e 64 65 78 20 69 73 20 67 65 6e 65 72 61 74 65  ndex is generate
1b0a0 64 20 61 73 20 61 6e 20 69 6d 70 6c 69 65 64 20  d as an implied 
1b0b0 50 52 49 4d 41 52 59 20 4b 45 59 0a 20 20 2a 2a  PRIMARY KEY.  **
1b0c0 20 6f 72 20 55 4e 49 51 55 45 20 69 6e 64 65 78   or UNIQUE index
1b0d0 20 69 6e 20 61 20 43 52 45 41 54 45 20 54 41 42   in a CREATE TAB
1b0e0 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 53  LE statement.  S
1b0f0 69 6e 63 65 20 74 68 65 20 74 61 62 6c 65 0a 20  ince the table. 
1b100 20 2a 2a 20 68 61 73 20 6a 75 73 74 20 62 65 65   ** has just bee
1b110 6e 20 63 72 65 61 74 65 64 2c 20 69 74 20 63 6f  n created, it co
1b120 6e 74 61 69 6e 73 20 6e 6f 20 64 61 74 61 20 61  ntains no data a
1b130 6e 64 20 74 68 65 20 69 6e 64 65 78 20 69 6e 69  nd the index ini
1b140 74 69 61 6c 69 7a 61 74 69 6f 6e 0a 20 20 2a 2a  tialization.  **
1b150 20 73 74 65 70 20 63 61 6e 20 62 65 20 73 6b 69   step can be ski
1b160 70 70 65 64 2e 0a 20 20 2a 2f 0a 20 20 65 6c 73  pped..  */.  els
1b170 65 20 69 66 28 20 48 61 73 52 6f 77 69 64 28 70  e if( HasRowid(p
1b180 54 61 62 29 20 7c 7c 20 70 54 62 6c 4e 61 6d 65  Tab) || pTblName
1b190 21 3d 30 20 29 7b 0a 20 20 20 20 56 64 62 65 20  !=0 ){.    Vdbe 
1b1a0 2a 76 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 53  *v;.    char *zS
1b1b0 74 6d 74 3b 0a 20 20 20 20 69 6e 74 20 69 4d 65  tmt;.    int iMe
1b1c0 6d 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  m = ++pParse->nM
1b1d0 65 6d 3b 0a 0a 20 20 20 20 76 20 3d 20 73 71 6c  em;..    v = sql
1b1e0 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
1b1f0 73 65 29 3b 0a 20 20 20 20 69 66 28 20 76 3d 3d  se);.    if( v==
1b200 30 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72  0 ) goto exit_cr
1b210 65 61 74 65 5f 69 6e 64 65 78 3b 0a 0a 20 20 20  eate_index;..   
1b220 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69   sqlite3BeginWri
1b230 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72  teOperation(pPar
1b240 73 65 2c 20 31 2c 20 69 44 62 29 3b 0a 0a 20 20  se, 1, iDb);..  
1b250 20 20 2f 2a 20 43 72 65 61 74 65 20 74 68 65 20    /* Create the 
1b260 72 6f 6f 74 70 61 67 65 20 66 6f 72 20 74 68 65  rootpage for the
1b270 20 69 6e 64 65 78 20 75 73 69 6e 67 20 43 72 65   index using Cre
1b280 61 74 65 49 6e 64 65 78 2e 20 42 75 74 20 62 65  ateIndex. But be
1b290 66 6f 72 65 0a 20 20 20 20 2a 2a 20 64 6f 69 6e  fore.    ** doin
1b2a0 67 20 73 6f 2c 20 63 6f 64 65 20 61 20 4e 6f 6f  g so, code a Noo
1b2b0 70 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 61 6e  p instruction an
1b2c0 64 20 73 74 6f 72 65 20 69 74 73 20 61 64 64 72  d store its addr
1b2d0 65 73 73 20 69 6e 20 0a 20 20 20 20 2a 2a 20 49  ess in .    ** I
1b2e0 6e 64 65 78 2e 74 6e 75 6d 2e 20 54 68 69 73 20  ndex.tnum. This 
1b2f0 69 73 20 72 65 71 75 69 72 65 64 20 69 6e 20 63  is required in c
1b300 61 73 65 20 74 68 69 73 20 69 6e 64 65 78 20 69  ase this index i
1b310 73 20 61 63 74 75 61 6c 6c 79 20 61 20 0a 20 20  s actually a .  
1b320 20 20 2a 2a 20 50 52 49 4d 41 52 59 20 4b 45 59    ** PRIMARY KEY
1b330 20 61 6e 64 20 74 68 65 20 74 61 62 6c 65 20 69   and the table i
1b340 73 20 61 63 74 75 61 6c 6c 79 20 61 20 57 49 54  s actually a WIT
1b350 48 4f 55 54 20 52 4f 57 49 44 20 74 61 62 6c 65  HOUT ROWID table
1b360 2e 20 49 6e 20 0a 20 20 20 20 2a 2a 20 74 68 61  . In .    ** tha
1b370 74 20 63 61 73 65 20 74 68 65 20 63 6f 6e 76 65  t case the conve
1b380 72 74 54 6f 57 69 74 68 6f 75 74 52 6f 77 69 64  rtToWithoutRowid
1b390 54 61 62 6c 65 28 29 20 72 6f 75 74 69 6e 65 20  Table() routine 
1b3a0 77 69 6c 6c 20 72 65 70 6c 61 63 65 0a 20 20 20  will replace.   
1b3b0 20 2a 2a 20 74 68 65 20 4e 6f 6f 70 20 77 69 74   ** the Noop wit
1b3c0 68 20 61 20 47 6f 74 6f 20 74 6f 20 6a 75 6d 70  h a Goto to jump
1b3d0 20 6f 76 65 72 20 74 68 65 20 56 44 42 45 20 63   over the VDBE c
1b3e0 6f 64 65 20 67 65 6e 65 72 61 74 65 64 20 62 65  ode generated be
1b3f0 6c 6f 77 2e 20 2a 2f 0a 20 20 20 20 70 49 6e 64  low. */.    pInd
1b400 65 78 2d 3e 74 6e 75 6d 20 3d 20 73 71 6c 69 74  ex->tnum = sqlit
1b410 65 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20  e3VdbeAddOp0(v, 
1b420 4f 50 5f 4e 6f 6f 70 29 3b 0a 20 20 20 20 73 71  OP_Noop);.    sq
1b430 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1b440 76 2c 20 4f 50 5f 43 72 65 61 74 65 49 6e 64 65  v, OP_CreateInde
1b450 78 2c 20 69 44 62 2c 20 69 4d 65 6d 29 3b 0a 0a  x, iDb, iMem);..
1b460 20 20 20 20 2f 2a 20 47 61 74 68 65 72 20 74 68      /* Gather th
1b470 65 20 63 6f 6d 70 6c 65 74 65 20 74 65 78 74 20  e complete text 
1b480 6f 66 20 74 68 65 20 43 52 45 41 54 45 20 49 4e  of the CREATE IN
1b490 44 45 58 20 73 74 61 74 65 6d 65 6e 74 20 69 6e  DEX statement in
1b4a0 74 6f 0a 20 20 20 20 2a 2a 20 74 68 65 20 7a 53  to.    ** the zS
1b4b0 74 6d 74 20 76 61 72 69 61 62 6c 65 0a 20 20 20  tmt variable.   
1b4c0 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 53 74 61   */.    if( pSta
1b4d0 72 74 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  rt ){.      int 
1b4e0 6e 20 3d 20 28 69 6e 74 29 28 70 50 61 72 73 65  n = (int)(pParse
1b4f0 2d 3e 73 4c 61 73 74 54 6f 6b 65 6e 2e 7a 20 2d  ->sLastToken.z -
1b500 20 70 4e 61 6d 65 2d 3e 7a 29 20 2b 20 70 50 61   pName->z) + pPa
1b510 72 73 65 2d 3e 73 4c 61 73 74 54 6f 6b 65 6e 2e  rse->sLastToken.
1b520 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4e 61  n;.      if( pNa
1b530 6d 65 2d 3e 7a 5b 6e 2d 31 5d 3d 3d 27 3b 27 20  me->z[n-1]==';' 
1b540 29 20 6e 2d 2d 3b 0a 20 20 20 20 20 20 2f 2a 20  ) n--;.      /* 
1b550 41 20 6e 61 6d 65 64 20 69 6e 64 65 78 20 77 69  A named index wi
1b560 74 68 20 61 6e 20 65 78 70 6c 69 63 69 74 20 43  th an explicit C
1b570 52 45 41 54 45 20 49 4e 44 45 58 20 73 74 61 74  REATE INDEX stat
1b580 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 20 20 7a  ement */.      z
1b590 53 74 6d 74 20 3d 20 73 71 6c 69 74 65 33 4d 50  Stmt = sqlite3MP
1b5a0 72 69 6e 74 66 28 64 62 2c 20 22 43 52 45 41 54  rintf(db, "CREAT
1b5b0 45 25 73 20 49 4e 44 45 58 20 25 2e 2a 73 22 2c  E%s INDEX %.*s",
1b5c0 0a 20 20 20 20 20 20 20 20 6f 6e 45 72 72 6f 72  .        onError
1b5d0 3d 3d 4f 45 5f 4e 6f 6e 65 20 3f 20 22 22 20 3a  ==OE_None ? "" :
1b5e0 20 22 20 55 4e 49 51 55 45 22 2c 20 6e 2c 20 70   " UNIQUE", n, p
1b5f0 4e 61 6d 65 2d 3e 7a 29 3b 0a 20 20 20 20 7d 65  Name->z);.    }e
1b600 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 41 6e  lse{.      /* An
1b610 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78   automatic index
1b620 20 63 72 65 61 74 65 64 20 62 79 20 61 20 50 52   created by a PR
1b630 49 4d 41 52 59 20 4b 45 59 20 6f 72 20 55 4e 49  IMARY KEY or UNI
1b640 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a  QUE constraint *
1b650 2f 0a 20 20 20 20 20 20 2f 2a 20 7a 53 74 6d 74  /.      /* zStmt
1b660 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74   = sqlite3MPrint
1b670 66 28 22 22 29 3b 20 2a 2f 0a 20 20 20 20 20 20  f(""); */.      
1b680 7a 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 7d  zStmt = 0;.    }
1b690 0a 0a 20 20 20 20 2f 2a 20 41 64 64 20 61 6e 20  ..    /* Add an 
1b6a0 65 6e 74 72 79 20 69 6e 20 73 71 6c 69 74 65 5f  entry in sqlite_
1b6b0 6d 61 73 74 65 72 20 66 6f 72 20 74 68 69 73 20  master for this 
1b6c0 69 6e 64 65 78 0a 20 20 20 20 2a 2f 0a 20 20 20  index.    */.   
1b6d0 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61   sqlite3NestedPa
1b6e0 72 73 65 28 70 50 61 72 73 65 2c 20 0a 20 20 20  rse(pParse, .   
1b6f0 20 20 20 20 20 22 49 4e 53 45 52 54 20 49 4e 54       "INSERT INT
1b700 4f 20 25 51 2e 25 73 20 56 41 4c 55 45 53 28 27  O %Q.%s VALUES('
1b710 69 6e 64 65 78 27 2c 25 51 2c 25 51 2c 23 25 64  index',%Q,%Q,#%d
1b720 2c 25 51 29 3b 22 2c 0a 20 20 20 20 20 20 20 20  ,%Q);",.        
1b730 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61  db->aDb[iDb].zNa
1b740 6d 65 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c 45  me, SCHEMA_TABLE
1b750 28 69 44 62 29 2c 0a 20 20 20 20 20 20 20 20 70  (iDb),.        p
1b760 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 0a 20 20  Index->zName,.  
1b770 20 20 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d        pTab->zNam
1b780 65 2c 0a 20 20 20 20 20 20 20 20 69 4d 65 6d 2c  e,.        iMem,
1b790 0a 20 20 20 20 20 20 20 20 7a 53 74 6d 74 0a 20  .        zStmt. 
1b7a0 20 20 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65     );.    sqlite
1b7b0 33 44 62 46 72 65 65 28 64 62 2c 20 7a 53 74 6d  3DbFree(db, zStm
1b7c0 74 29 3b 0a 0a 20 20 20 20 2f 2a 20 46 69 6c 6c  t);..    /* Fill
1b7d0 20 74 68 65 20 69 6e 64 65 78 20 77 69 74 68 20   the index with 
1b7e0 64 61 74 61 20 61 6e 64 20 72 65 70 61 72 73 65  data and reparse
1b7f0 20 74 68 65 20 73 63 68 65 6d 61 2e 20 43 6f 64   the schema. Cod
1b800 65 20 61 6e 20 4f 50 5f 45 78 70 69 72 65 0a 20  e an OP_Expire. 
1b810 20 20 20 2a 2a 20 74 6f 20 69 6e 76 61 6c 69 64     ** to invalid
1b820 61 74 65 20 61 6c 6c 20 70 72 65 2d 63 6f 6d 70  ate all pre-comp
1b830 69 6c 65 64 20 73 74 61 74 65 6d 65 6e 74 73 2e  iled statements.
1b840 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
1b850 70 54 62 6c 4e 61 6d 65 20 29 7b 0a 20 20 20 20  pTblName ){.    
1b860 20 20 73 71 6c 69 74 65 33 52 65 66 69 6c 6c 49    sqlite3RefillI
1b870 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70 49 6e  ndex(pParse, pIn
1b880 64 65 78 2c 20 69 4d 65 6d 29 3b 0a 20 20 20 20  dex, iMem);.    
1b890 20 20 73 71 6c 69 74 65 33 43 68 61 6e 67 65 43    sqlite3ChangeC
1b8a0 6f 6f 6b 69 65 28 70 50 61 72 73 65 2c 20 69 44  ookie(pParse, iD
1b8b0 62 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  b);.      sqlite
1b8c0 33 56 64 62 65 41 64 64 50 61 72 73 65 53 63 68  3VdbeAddParseSch
1b8d0 65 6d 61 4f 70 28 76 2c 20 69 44 62 2c 0a 20 20  emaOp(v, iDb,.  
1b8e0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4d 50         sqlite3MP
1b8f0 72 69 6e 74 66 28 64 62 2c 20 22 6e 61 6d 65 3d  rintf(db, "name=
1b900 27 25 71 27 20 41 4e 44 20 74 79 70 65 3d 27 69  '%q' AND type='i
1b910 6e 64 65 78 27 22 2c 20 70 49 6e 64 65 78 2d 3e  ndex'", pIndex->
1b920 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20 20 73  zName));.      s
1b930 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
1b940 28 76 2c 20 4f 50 5f 45 78 70 69 72 65 2c 20 30  (v, OP_Expire, 0
1b950 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73 71  );.    }..    sq
1b960 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
1b970 65 28 76 2c 20 70 49 6e 64 65 78 2d 3e 74 6e 75  e(v, pIndex->tnu
1b980 6d 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 68  m);.  }..  /* Wh
1b990 65 6e 20 61 64 64 69 6e 67 20 61 6e 20 69 6e 64  en adding an ind
1b9a0 65 78 20 74 6f 20 74 68 65 20 6c 69 73 74 20 6f  ex to the list o
1b9b0 66 20 69 6e 64 69 63 65 73 20 66 6f 72 20 61 20  f indices for a 
1b9c0 74 61 62 6c 65 2c 20 6d 61 6b 65 0a 20 20 2a 2a  table, make.  **
1b9d0 20 73 75 72 65 20 61 6c 6c 20 69 6e 64 69 63 65   sure all indice
1b9e0 73 20 6c 61 62 65 6c 65 64 20 4f 45 5f 52 65 70  s labeled OE_Rep
1b9f0 6c 61 63 65 20 63 6f 6d 65 20 61 66 74 65 72 20  lace come after 
1ba00 61 6c 6c 20 74 68 6f 73 65 20 6c 61 62 65 6c 65  all those labele
1ba10 64 0a 20 20 2a 2a 20 4f 45 5f 49 67 6e 6f 72 65  d.  ** OE_Ignore
1ba20 2e 20 20 54 68 69 73 20 69 73 20 6e 65 63 65 73  .  This is neces
1ba30 73 61 72 79 20 66 6f 72 20 74 68 65 20 63 6f 72  sary for the cor
1ba40 72 65 63 74 20 63 6f 6e 73 74 72 61 69 6e 74 20  rect constraint 
1ba50 63 68 65 63 6b 0a 20 20 2a 2a 20 70 72 6f 63 65  check.  ** proce
1ba60 73 73 69 6e 67 20 28 69 6e 20 73 71 6c 69 74 65  ssing (in sqlite
1ba70 33 47 65 6e 65 72 61 74 65 43 6f 6e 73 74 72 61  3GenerateConstra
1ba80 69 6e 74 43 68 65 63 6b 73 28 29 29 20 61 73 20  intChecks()) as 
1ba90 70 61 72 74 20 6f 66 0a 20 20 2a 2a 20 55 50 44  part of.  ** UPD
1baa0 41 54 45 20 61 6e 64 20 49 4e 53 45 52 54 20 73  ATE and INSERT s
1bab0 74 61 74 65 6d 65 6e 74 73 2e 20 20 0a 20 20 2a  tatements.  .  *
1bac0 2f 0a 20 20 69 66 28 20 64 62 2d 3e 69 6e 69 74  /.  if( db->init
1bad0 2e 62 75 73 79 20 7c 7c 20 70 54 62 6c 4e 61 6d  .busy || pTblNam
1bae0 65 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  e==0 ){.    if( 
1baf0 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 52 65 70 6c  onError!=OE_Repl
1bb00 61 63 65 20 7c 7c 20 70 54 61 62 2d 3e 70 49 6e  ace || pTab->pIn
1bb10 64 65 78 3d 3d 30 0a 20 20 20 20 20 20 20 20 20  dex==0.         
1bb20 7c 7c 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 2d  || pTab->pIndex-
1bb30 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 52 65 70  >onError==OE_Rep
1bb40 6c 61 63 65 29 7b 0a 20 20 20 20 20 20 70 49 6e  lace){.      pIn
1bb50 64 65 78 2d 3e 70 4e 65 78 74 20 3d 20 70 54 61  dex->pNext = pTa
1bb60 62 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20 20 20  b->pIndex;.     
1bb70 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 20 3d 20   pTab->pIndex = 
1bb80 70 49 6e 64 65 78 3b 0a 20 20 20 20 7d 65 6c 73  pIndex;.    }els
1bb90 65 7b 0a 20 20 20 20 20 20 49 6e 64 65 78 20 2a  e{.      Index *
1bba0 70 4f 74 68 65 72 20 3d 20 70 54 61 62 2d 3e 70  pOther = pTab->p
1bbb0 49 6e 64 65 78 3b 0a 20 20 20 20 20 20 77 68 69  Index;.      whi
1bbc0 6c 65 28 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78  le( pOther->pNex
1bbd0 74 20 26 26 20 70 4f 74 68 65 72 2d 3e 70 4e 65  t && pOther->pNe
1bbe0 78 74 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f  xt->onError!=OE_
1bbf0 52 65 70 6c 61 63 65 20 29 7b 0a 20 20 20 20 20  Replace ){.     
1bc00 20 20 20 70 4f 74 68 65 72 20 3d 20 70 4f 74 68     pOther = pOth
1bc10 65 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20  er->pNext;.     
1bc20 20 7d 0a 20 20 20 20 20 20 70 49 6e 64 65 78 2d   }.      pIndex-
1bc30 3e 70 4e 65 78 74 20 3d 20 70 4f 74 68 65 72 2d  >pNext = pOther-
1bc40 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 70 4f  >pNext;.      pO
1bc50 74 68 65 72 2d 3e 70 4e 65 78 74 20 3d 20 70 49  ther->pNext = pI
1bc60 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ndex;.    }.    
1bc70 70 52 65 74 20 3d 20 70 49 6e 64 65 78 3b 0a 20  pRet = pIndex;. 
1bc80 20 20 20 70 49 6e 64 65 78 20 3d 20 30 3b 0a 20     pIndex = 0;. 
1bc90 20 7d 0a 0a 20 20 2f 2a 20 43 6c 65 61 6e 20 75   }..  /* Clean u
1bca0 70 20 62 65 66 6f 72 65 20 65 78 69 74 69 6e 67  p before exiting
1bcb0 20 2a 2f 0a 65 78 69 74 5f 63 72 65 61 74 65 5f   */.exit_create_
1bcc0 69 6e 64 65 78 3a 0a 20 20 69 66 28 20 70 49 6e  index:.  if( pIn
1bcd0 64 65 78 20 29 20 66 72 65 65 49 6e 64 65 78 28  dex ) freeIndex(
1bce0 64 62 2c 20 70 49 6e 64 65 78 29 3b 0a 20 20 73  db, pIndex);.  s
1bcf0 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
1bd00 28 64 62 2c 20 70 50 49 57 68 65 72 65 29 3b 0a  (db, pPIWhere);.
1bd10 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
1bd20 74 44 65 6c 65 74 65 28 64 62 2c 20 70 4c 69 73  tDelete(db, pLis
1bd30 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 72 63  t);.  sqlite3Src
1bd40 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70  ListDelete(db, p
1bd50 54 62 6c 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69  TblName);.  sqli
1bd60 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4e  te3DbFree(db, zN
1bd70 61 6d 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  ame);.  return p
1bd80 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69  Ret;.}../*.** Fi
1bd90 6c 6c 20 74 68 65 20 49 6e 64 65 78 2e 61 69 52  ll the Index.aiR
1bda0 6f 77 45 73 74 5b 5d 20 61 72 72 61 79 20 77 69  owEst[] array wi
1bdb0 74 68 20 64 65 66 61 75 6c 74 20 69 6e 66 6f 72  th default infor
1bdc0 6d 61 74 69 6f 6e 20 2d 20 69 6e 66 6f 72 6d 61  mation - informa
1bdd0 74 69 6f 6e 0a 2a 2a 20 74 6f 20 62 65 20 75 73  tion.** to be us
1bde0 65 64 20 77 68 65 6e 20 77 65 20 68 61 76 65 20  ed when we have 
1bdf0 6e 6f 74 20 72 75 6e 20 74 68 65 20 41 4e 41 4c  not run the ANAL
1be00 59 5a 45 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a  YZE command..**.
1be10 2a 2a 20 61 69 52 6f 77 45 73 74 5b 30 5d 20 69  ** aiRowEst[0] i
1be20 73 20 73 75 70 70 6f 73 65 64 20 74 6f 20 63 6f  s supposed to co
1be30 6e 74 61 69 6e 20 74 68 65 20 6e 75 6d 62 65 72  ntain the number
1be40 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20   of elements in 
1be50 74 68 65 20 69 6e 64 65 78 2e 0a 2a 2a 20 53 69  the index..** Si
1be60 6e 63 65 20 77 65 20 64 6f 20 6e 6f 74 20 6b 6e  nce we do not kn
1be70 6f 77 2c 20 67 75 65 73 73 20 31 20 6d 69 6c 6c  ow, guess 1 mill
1be80 69 6f 6e 2e 20 20 61 69 52 6f 77 45 73 74 5b 31  ion.  aiRowEst[1
1be90 5d 20 69 73 20 61 6e 20 65 73 74 69 6d 61 74 65  ] is an estimate
1bea0 20 6f 66 20 74 68 65 0a 2a 2a 20 6e 75 6d 62 65   of the.** numbe
1beb0 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74 68 65  r of rows in the
1bec0 20 74 61 62 6c 65 20 74 68 61 74 20 6d 61 74 63   table that matc
1bed0 68 20 61 6e 79 20 70 61 72 74 69 63 75 6c 61 72  h any particular
1bee0 20 76 61 6c 75 65 20 6f 66 20 74 68 65 0a 2a 2a   value of the.**
1bef0 20 66 69 72 73 74 20 63 6f 6c 75 6d 6e 20 6f 66   first column of
1bf00 20 74 68 65 20 69 6e 64 65 78 2e 20 20 61 69 52   the index.  aiR
1bf10 6f 77 45 73 74 5b 32 5d 20 69 73 20 61 6e 20 65  owEst[2] is an e
1bf20 73 74 69 6d 61 74 65 20 6f 66 20 74 68 65 20 6e  stimate of the n
1bf30 75 6d 62 65 72 0a 2a 2a 20 6f 66 20 72 6f 77 73  umber.** of rows
1bf40 20 74 68 61 74 20 6d 61 74 63 68 20 61 6e 79 20   that match any 
1bf50 70 61 72 74 69 63 75 6c 61 72 20 63 6f 6d 62 69  particular combi
1bf60 6e 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 66 69  nation of the fi
1bf70 72 73 74 20 32 20 63 6f 6c 75 6d 6e 73 0a 2a 2a  rst 2 columns.**
1bf80 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e 20 20   of the index.  
1bf90 41 6e 64 20 73 6f 20 66 6f 72 74 68 2e 20 20 49  And so forth.  I
1bfa0 74 20 6d 75 73 74 20 61 6c 77 61 79 73 20 62 65  t must always be
1bfb0 20 74 68 65 20 63 61 73 65 20 74 68 61 74 0a 2a   the case that.*
1bfc0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 61 69  .**           ai
1bfd0 52 6f 77 45 73 74 5b 4e 5d 3c 3d 61 69 52 6f 77  RowEst[N]<=aiRow
1bfe0 45 73 74 5b 4e 2d 31 5d 0a 2a 2a 20 20 20 20 20  Est[N-1].**     
1bff0 20 20 20 20 20 20 61 69 52 6f 77 45 73 74 5b 4e        aiRowEst[N
1c000 5d 3e 3d 31 0a 2a 2a 0a 2a 2a 20 41 70 61 72 74  ]>=1.**.** Apart
1c010 20 66 72 6f 6d 20 74 68 61 74 2c 20 77 65 20 68   from that, we h
1c020 61 76 65 20 6c 69 74 74 6c 65 20 74 6f 20 67 6f  ave little to go
1c030 20 6f 6e 20 62 65 73 69 64 65 73 20 69 6e 74 75   on besides intu
1c040 69 74 69 6f 6e 20 61 73 20 74 6f 0a 2a 2a 20 68  ition as to.** h
1c050 6f 77 20 61 69 52 6f 77 45 73 74 5b 5d 20 73 68  ow aiRowEst[] sh
1c060 6f 75 6c 64 20 62 65 20 69 6e 69 74 69 61 6c 69  ould be initiali
1c070 7a 65 64 2e 20 20 54 68 65 20 6e 75 6d 62 65 72  zed.  The number
1c080 73 20 67 65 6e 65 72 61 74 65 64 20 68 65 72 65  s generated here
1c090 0a 2a 2a 20 61 72 65 20 62 61 73 65 64 20 6f 6e  .** are based on
1c0a0 20 74 79 70 69 63 61 6c 20 76 61 6c 75 65 73 20   typical values 
1c0b0 66 6f 75 6e 64 20 69 6e 20 61 63 74 75 61 6c 20  found in actual 
1c0c0 69 6e 64 69 63 65 73 2e 0a 2a 2f 0a 76 6f 69 64  indices..*/.void
1c0d0 20 73 71 6c 69 74 65 33 44 65 66 61 75 6c 74 52   sqlite3DefaultR
1c0e0 6f 77 45 73 74 28 49 6e 64 65 78 20 2a 70 49 64  owEst(Index *pId
1c0f0 78 29 7b 0a 20 20 2f 2a 20 20 20 20 20 20 20 20  x){.  /*        
1c100 20 20 20 20 20 20 20 20 31 30 2c 20 20 39 2c 20          10,  9, 
1c110 20 38 2c 20 20 37 2c 20 20 36 20 2a 2f 0a 20 20   8,  7,  6 */.  
1c120 4c 6f 67 45 73 74 20 61 56 61 6c 5b 5d 20 3d 20  LogEst aVal[] = 
1c130 7b 20 33 33 2c 20 33 32 2c 20 33 30 2c 20 32 38  { 33, 32, 30, 28
1c140 2c 20 32 36 20 7d 3b 0a 20 20 4c 6f 67 45 73 74  , 26 };.  LogEst
1c150 20 2a 61 20 3d 20 70 49 64 78 2d 3e 61 69 52 6f   *a = pIdx->aiRo
1c160 77 4c 6f 67 45 73 74 3b 0a 20 20 69 6e 74 20 6e  wLogEst;.  int n
1c170 43 6f 70 79 20 3d 20 4d 49 4e 28 41 72 72 61 79  Copy = MIN(Array
1c180 53 69 7a 65 28 61 56 61 6c 29 2c 20 70 49 64 78  Size(aVal), pIdx
1c190 2d 3e 6e 4b 65 79 43 6f 6c 29 3b 0a 20 20 69 6e  ->nKeyCol);.  in
1c1a0 74 20 69 3b 0a 0a 20 20 2f 2a 20 53 65 74 20 74  t i;..  /* Set t
1c1b0 68 65 20 66 69 72 73 74 20 65 6e 74 72 79 20 28  he first entry (
1c1c0 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69  number of rows i
1c1d0 6e 20 74 68 65 20 69 6e 64 65 78 29 20 74 6f 20  n the index) to 
1c1e0 74 68 65 20 65 73 74 69 6d 61 74 65 64 20 0a 20  the estimated . 
1c1f0 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f   ** number of ro
1c200 77 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e  ws in the table.
1c210 20 4f 72 20 31 30 2c 20 69 66 20 74 68 65 20 65   Or 10, if the e
1c220 73 74 69 6d 61 74 65 64 20 6e 75 6d 62 65 72 20  stimated number 
1c230 6f 66 20 72 6f 77 73 20 0a 20 20 2a 2a 20 69 6e  of rows .  ** in
1c240 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 6c 65   the table is le
1c250 73 73 20 74 68 61 6e 20 74 68 61 74 2e 20 20 2a  ss than that.  *
1c260 2f 0a 20 20 61 5b 30 5d 20 3d 20 70 49 64 78 2d  /.  a[0] = pIdx-
1c270 3e 70 54 61 62 6c 65 2d 3e 6e 52 6f 77 4c 6f 67  >pTable->nRowLog
1c280 45 73 74 3b 0a 20 20 69 66 28 20 61 5b 30 5d 3c  Est;.  if( a[0]<
1c290 33 33 20 29 20 61 5b 30 5d 20 3d 20 33 33 3b 20  33 ) a[0] = 33; 
1c2a0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 33         assert( 3
1c2b0 33 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74  3==sqlite3LogEst
1c2c0 28 31 30 29 20 29 3b 0a 0a 20 20 2f 2a 20 45 73  (10) );..  /* Es
1c2d0 74 69 6d 61 74 65 20 74 68 61 74 20 61 5b 31 5d  timate that a[1]
1c2e0 20 69 73 20 31 30 2c 20 61 5b 32 5d 20 69 73 20   is 10, a[2] is 
1c2f0 39 2c 20 61 5b 33 5d 20 69 73 20 38 2c 20 61 5b  9, a[3] is 8, a[
1c300 34 5d 20 69 73 20 37 2c 20 61 5b 35 5d 20 69 73  4] is 7, a[5] is
1c310 0a 20 20 2a 2a 20 36 20 61 6e 64 20 65 61 63 68  .  ** 6 and each
1c320 20 73 75 62 73 65 71 75 65 6e 74 20 76 61 6c 75   subsequent valu
1c330 65 20 28 69 66 20 61 6e 79 29 20 69 73 20 35 2e  e (if any) is 5.
1c340 20 20 2a 2f 0a 20 20 6d 65 6d 63 70 79 28 26 61    */.  memcpy(&a
1c350 5b 31 5d 2c 20 61 56 61 6c 2c 20 6e 43 6f 70 79  [1], aVal, nCopy
1c360 2a 73 69 7a 65 6f 66 28 4c 6f 67 45 73 74 29 29  *sizeof(LogEst))
1c370 3b 0a 20 20 66 6f 72 28 69 3d 6e 43 6f 70 79 2b  ;.  for(i=nCopy+
1c380 31 3b 20 69 3c 3d 70 49 64 78 2d 3e 6e 4b 65 79  1; i<=pIdx->nKey
1c390 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 61  Col; i++){.    a
1c3a0 5b 69 5d 20 3d 20 32 33 3b 20 20 20 20 20 20 20  [i] = 23;       
1c3b0 20 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73               ass
1c3c0 65 72 74 28 20 32 33 3d 3d 73 71 6c 69 74 65 33  ert( 23==sqlite3
1c3d0 4c 6f 67 45 73 74 28 35 29 20 29 3b 0a 20 20 7d  LogEst(5) );.  }
1c3e0 0a 0a 20 20 61 73 73 65 72 74 28 20 30 3d 3d 73  ..  assert( 0==s
1c3f0 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 31 29 20  qlite3LogEst(1) 
1c400 29 3b 0a 20 20 69 66 28 20 49 73 55 6e 69 71 75  );.  if( IsUniqu
1c410 65 49 6e 64 65 78 28 70 49 64 78 29 20 29 20 61  eIndex(pIdx) ) a
1c420 5b 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 5d 20  [pIdx->nKeyCol] 
1c430 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  = 0;.}../*.** Th
1c440 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20  is routine will 
1c450 64 72 6f 70 20 61 6e 20 65 78 69 73 74 69 6e 67  drop an existing
1c460 20 6e 61 6d 65 64 20 69 6e 64 65 78 2e 20 20 54   named index.  T
1c470 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69  his routine.** i
1c480 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 44 52  mplements the DR
1c490 4f 50 20 49 4e 44 45 58 20 73 74 61 74 65 6d 65  OP INDEX stateme
1c4a0 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  nt..*/.void sqli
1c4b0 74 65 33 44 72 6f 70 49 6e 64 65 78 28 50 61 72  te3DropIndex(Par
1c4c0 73 65 20 2a 70 50 61 72 73 65 2c 20 53 72 63 4c  se *pParse, SrcL
1c4d0 69 73 74 20 2a 70 4e 61 6d 65 2c 20 69 6e 74 20  ist *pName, int 
1c4e0 69 66 45 78 69 73 74 73 29 7b 0a 20 20 49 6e 64  ifExists){.  Ind
1c4f0 65 78 20 2a 70 49 6e 64 65 78 3b 0a 20 20 56 64  ex *pIndex;.  Vd
1c500 62 65 20 2a 76 3b 0a 20 20 73 71 6c 69 74 65 33  be *v;.  sqlite3
1c510 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
1c520 62 3b 0a 20 20 69 6e 74 20 69 44 62 3b 0a 0a 20  b;.  int iDb;.. 
1c530 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d   assert( pParse-
1c540 3e 6e 45 72 72 3d 3d 30 20 29 3b 20 20 20 2f 2a  >nErr==0 );   /*
1c550 20 4e 65 76 65 72 20 63 61 6c 6c 65 64 20 77 69   Never called wi
1c560 74 68 20 70 72 69 6f 72 20 65 72 72 6f 72 73 20  th prior errors 
1c570 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  */.  if( db->mal
1c580 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
1c590 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f   goto exit_drop_
1c5a0 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 61 73 73  index;.  }.  ass
1c5b0 65 72 74 28 20 70 4e 61 6d 65 2d 3e 6e 53 72 63  ert( pName->nSrc
1c5c0 3d 3d 31 20 29 3b 0a 20 20 69 66 28 20 53 51 4c  ==1 );.  if( SQL
1c5d0 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52  ITE_OK!=sqlite3R
1c5e0 65 61 64 53 63 68 65 6d 61 28 70 50 61 72 73 65  eadSchema(pParse
1c5f0 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78  ) ){.    goto ex
1c600 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20  it_drop_index;. 
1c610 20 7d 0a 20 20 70 49 6e 64 65 78 20 3d 20 73 71   }.  pIndex = sq
1c620 6c 69 74 65 33 46 69 6e 64 49 6e 64 65 78 28 64  lite3FindIndex(d
1c630 62 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a  b, pName->a[0].z
1c640 4e 61 6d 65 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30  Name, pName->a[0
1c650 5d 2e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20  ].zDatabase);.  
1c660 69 66 28 20 70 49 6e 64 65 78 3d 3d 30 20 29 7b  if( pIndex==0 ){
1c670 0a 20 20 20 20 69 66 28 20 21 69 66 45 78 69 73  .    if( !ifExis
1c680 74 73 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ts ){.      sqli
1c690 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
1c6a0 73 65 2c 20 22 6e 6f 20 73 75 63 68 20 69 6e 64  se, "no such ind
1c6b0 65 78 3a 20 25 53 22 2c 20 70 4e 61 6d 65 2c 20  ex: %S", pName, 
1c6c0 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  0);.    }else{. 
1c6d0 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65       sqlite3Code
1c6e0 56 65 72 69 66 79 4e 61 6d 65 64 53 63 68 65 6d  VerifyNamedSchem
1c6f0 61 28 70 50 61 72 73 65 2c 20 70 4e 61 6d 65 2d  a(pParse, pName-
1c700 3e 61 5b 30 5d 2e 7a 44 61 74 61 62 61 73 65 29  >a[0].zDatabase)
1c710 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 72  ;.    }.    pPar
1c720 73 65 2d 3e 63 68 65 63 6b 53 63 68 65 6d 61 20  se->checkSchema 
1c730 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78  = 1;.    goto ex
1c740 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20  it_drop_index;. 
1c750 20 7d 0a 20 20 69 66 28 20 70 49 6e 64 65 78 2d   }.  if( pIndex-
1c760 3e 69 64 78 54 79 70 65 21 3d 53 51 4c 49 54 45  >idxType!=SQLITE
1c770 5f 49 44 58 54 59 50 45 5f 41 50 50 44 45 46 20  _IDXTYPE_APPDEF 
1c780 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
1c790 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
1c7a0 69 6e 64 65 78 20 61 73 73 6f 63 69 61 74 65 64  index associated
1c7b0 20 77 69 74 68 20 55 4e 49 51 55 45 20 22 0a 20   with UNIQUE ". 
1c7c0 20 20 20 20 20 22 6f 72 20 50 52 49 4d 41 52 59       "or PRIMARY
1c7d0 20 4b 45 59 20 63 6f 6e 73 74 72 61 69 6e 74 20   KEY constraint 
1c7e0 63 61 6e 6e 6f 74 20 62 65 20 64 72 6f 70 70 65  cannot be droppe
1c7f0 64 22 2c 20 30 29 3b 0a 20 20 20 20 67 6f 74 6f  d", 0);.    goto
1c800 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78   exit_drop_index
1c810 3b 0a 20 20 7d 0a 20 20 69 44 62 20 3d 20 73 71  ;.  }.  iDb = sq
1c820 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64  lite3SchemaToInd
1c830 65 78 28 64 62 2c 20 70 49 6e 64 65 78 2d 3e 70  ex(db, pIndex->p
1c840 53 63 68 65 6d 61 29 3b 0a 23 69 66 6e 64 65 66  Schema);.#ifndef
1c850 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
1c860 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 7b 0a 20  HORIZATION.  {. 
1c870 20 20 20 69 6e 74 20 63 6f 64 65 20 3d 20 53 51     int code = SQ
1c880 4c 49 54 45 5f 44 52 4f 50 5f 49 4e 44 45 58 3b  LITE_DROP_INDEX;
1c890 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62  .    Table *pTab
1c8a0 20 3d 20 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c   = pIndex->pTabl
1c8b0 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  e;.    const cha
1c8c0 72 20 2a 7a 44 62 20 3d 20 64 62 2d 3e 61 44 62  r *zDb = db->aDb
1c8d0 5b 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20  [iDb].zName;.   
1c8e0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61   const char *zTa
1c8f0 62 20 3d 20 53 43 48 45 4d 41 5f 54 41 42 4c 45  b = SCHEMA_TABLE
1c900 28 69 44 62 29 3b 0a 20 20 20 20 69 66 28 20 73  (iDb);.    if( s
1c910 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28  qlite3AuthCheck(
1c920 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 44  pParse, SQLITE_D
1c930 45 4c 45 54 45 2c 20 7a 54 61 62 2c 20 30 2c 20  ELETE, zTab, 0, 
1c940 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f  zDb) ){.      go
1c950 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64  to exit_drop_ind
1c960 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ex;.    }.    if
1c970 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26  ( !OMIT_TEMPDB &
1c980 26 20 69 44 62 20 29 20 63 6f 64 65 20 3d 20 53  & iDb ) code = S
1c990 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f  QLITE_DROP_TEMP_
1c9a0 49 4e 44 45 58 3b 0a 20 20 20 20 69 66 28 20 73  INDEX;.    if( s
1c9b0 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28  qlite3AuthCheck(
1c9c0 70 50 61 72 73 65 2c 20 63 6f 64 65 2c 20 70 49  pParse, code, pI
1c9d0 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 70 54 61  ndex->zName, pTa
1c9e0 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 44 62 29 20 29  b->zName, zDb) )
1c9f0 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69  {.      goto exi
1ca00 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20  t_drop_index;.  
1ca10 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a    }.  }.#endif..
1ca20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f    /* Generate co
1ca30 64 65 20 74 6f 20 72 65 6d 6f 76 65 20 74 68 65  de to remove the
1ca40 20 69 6e 64 65 78 20 61 6e 64 20 66 72 6f 6d 20   index and from 
1ca50 74 68 65 20 6d 61 73 74 65 72 20 74 61 62 6c 65  the master table
1ca60 20 2a 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74 65   */.  v = sqlite
1ca70 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
1ca80 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20  ;.  if( v ){.   
1ca90 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69   sqlite3BeginWri
1caa0 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72  teOperation(pPar
1cab0 73 65 2c 20 31 2c 20 69 44 62 29 3b 0a 20 20 20  se, 1, iDb);.   
1cac0 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61   sqlite3NestedPa
1cad0 72 73 65 28 70 50 61 72 73 65 2c 0a 20 20 20 20  rse(pParse,.    
1cae0 20 20 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20     "DELETE FROM 
1caf0 25 51 2e 25 73 20 57 48 45 52 45 20 6e 61 6d 65  %Q.%s WHERE name
1cb00 3d 25 51 20 41 4e 44 20 74 79 70 65 3d 27 69 6e  =%Q AND type='in
1cb10 64 65 78 27 22 2c 0a 20 20 20 20 20 20 20 64 62  dex'",.       db
1cb20 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65  ->aDb[iDb].zName
1cb30 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69  , SCHEMA_TABLE(i
1cb40 44 62 29 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61  Db), pIndex->zNa
1cb50 6d 65 0a 20 20 20 20 29 3b 0a 20 20 20 20 73 71  me.    );.    sq
1cb60 6c 69 74 65 33 43 6c 65 61 72 53 74 61 74 54 61  lite3ClearStatTa
1cb70 62 6c 65 73 28 70 50 61 72 73 65 2c 20 69 44 62  bles(pParse, iDb
1cb80 2c 20 22 69 64 78 22 2c 20 70 49 6e 64 65 78 2d  , "idx", pIndex-
1cb90 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c  >zName);.    sql
1cba0 69 74 65 33 43 68 61 6e 67 65 43 6f 6f 6b 69 65  ite3ChangeCookie
1cbb0 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20  (pParse, iDb);. 
1cbc0 20 20 20 64 65 73 74 72 6f 79 52 6f 6f 74 50 61     destroyRootPa
1cbd0 67 65 28 70 50 61 72 73 65 2c 20 70 49 6e 64 65  ge(pParse, pInde
1cbe0 78 2d 3e 74 6e 75 6d 2c 20 69 44 62 29 3b 0a 20  x->tnum, iDb);. 
1cbf0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1cc00 64 4f 70 34 28 76 2c 20 4f 50 5f 44 72 6f 70 49  dOp4(v, OP_DropI
1cc10 6e 64 65 78 2c 20 69 44 62 2c 20 30 2c 20 30 2c  ndex, iDb, 0, 0,
1cc20 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20   pIndex->zName, 
1cc30 30 29 3b 0a 20 20 7d 0a 0a 65 78 69 74 5f 64 72  0);.  }..exit_dr
1cc40 6f 70 5f 69 6e 64 65 78 3a 0a 20 20 73 71 6c 69  op_index:.  sqli
1cc50 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65  te3SrcListDelete
1cc60 28 64 62 2c 20 70 4e 61 6d 65 29 3b 0a 7d 0a 0a  (db, pName);.}..
1cc70 2f 2a 0a 2a 2a 20 70 41 72 72 61 79 20 69 73 20  /*.** pArray is 
1cc80 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20  a pointer to an 
1cc90 61 72 72 61 79 20 6f 66 20 6f 62 6a 65 63 74 73  array of objects
1cca0 2e 20 45 61 63 68 20 6f 62 6a 65 63 74 20 69 6e  . Each object in
1ccb0 20 74 68 65 0a 2a 2a 20 61 72 72 61 79 20 69 73   the.** array is
1ccc0 20 73 7a 45 6e 74 72 79 20 62 79 74 65 73 20 69   szEntry bytes i
1ccd0 6e 20 73 69 7a 65 2e 20 54 68 69 73 20 72 6f 75  n size. This rou
1cce0 74 69 6e 65 20 75 73 65 73 20 73 71 6c 69 74 65  tine uses sqlite
1ccf0 33 44 62 52 65 61 6c 6c 6f 63 28 29 0a 2a 2a 20  3DbRealloc().** 
1cd00 74 6f 20 65 78 74 65 6e 64 20 74 68 65 20 61 72  to extend the ar
1cd10 72 61 79 20 73 6f 20 74 68 61 74 20 74 68 65 72  ray so that ther
1cd20 65 20 69 73 20 73 70 61 63 65 20 66 6f 72 20 61  e is space for a
1cd30 20 6e 65 77 20 6f 62 6a 65 63 74 20 61 74 20 74   new object at t
1cd40 68 65 20 65 6e 64 2e 0a 2a 2a 0a 2a 2a 20 57 68  he end..**.** Wh
1cd50 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
1cd60 20 69 73 20 63 61 6c 6c 65 64 2c 20 2a 70 6e 45   is called, *pnE
1cd70 6e 74 72 79 20 63 6f 6e 74 61 69 6e 73 20 74 68  ntry contains th
1cd80 65 20 63 75 72 72 65 6e 74 20 73 69 7a 65 20 6f  e current size o
1cd90 66 0a 2a 2a 20 74 68 65 20 61 72 72 61 79 20 28  f.** the array (
1cda0 69 6e 20 65 6e 74 72 69 65 73 20 2d 20 73 6f 20  in entries - so 
1cdb0 74 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 69  the allocation i
1cdc0 73 20 28 28 2a 70 6e 45 6e 74 72 79 29 20 2a 20  s ((*pnEntry) * 
1cdd0 73 7a 45 6e 74 72 79 29 20 62 79 74 65 73 0a 2a  szEntry) bytes.*
1cde0 2a 20 69 6e 20 74 6f 74 61 6c 29 2e 0a 2a 2a 0a  * in total)..**.
1cdf0 2a 2a 20 49 66 20 74 68 65 20 72 65 61 6c 6c 6f  ** If the reallo
1ce00 63 28 29 20 69 73 20 73 75 63 63 65 73 73 66 75  c() is successfu
1ce10 6c 20 28 69 2e 65 2e 20 69 66 20 6e 6f 20 4f 4f  l (i.e. if no OO
1ce20 4d 20 63 6f 6e 64 69 74 69 6f 6e 20 6f 63 63 75  M condition occu
1ce30 72 73 29 2c 20 74 68 65 0a 2a 2a 20 73 70 61 63  rs), the.** spac
1ce40 65 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20  e allocated for 
1ce50 74 68 65 20 6e 65 77 20 6f 62 6a 65 63 74 20 69  the new object i
1ce60 73 20 7a 65 72 6f 65 64 2c 20 2a 70 6e 45 6e 74  s zeroed, *pnEnt
1ce70 72 79 20 75 70 64 61 74 65 64 20 74 6f 0a 2a 2a  ry updated to.**
1ce80 20 72 65 66 6c 65 63 74 20 74 68 65 20 6e 65 77   reflect the new
1ce90 20 73 69 7a 65 20 6f 66 20 74 68 65 20 61 72 72   size of the arr
1cea0 61 79 20 61 6e 64 20 61 20 70 6f 69 6e 74 65 72  ay and a pointer
1ceb0 20 74 6f 20 74 68 65 20 6e 65 77 20 61 6c 6c 6f   to the new allo
1cec0 63 61 74 69 6f 6e 0a 2a 2a 20 72 65 74 75 72 6e  cation.** return
1ced0 65 64 2e 20 2a 70 49 64 78 20 69 73 20 73 65 74  ed. *pIdx is set
1cee0 20 74 6f 20 74 68 65 20 69 6e 64 65 78 20 6f 66   to the index of
1cef0 20 74 68 65 20 6e 65 77 20 61 72 72 61 79 20 65   the new array e
1cf00 6e 74 72 79 20 69 6e 20 74 68 69 73 20 63 61 73  ntry in this cas
1cf10 65 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69  e..**.** Otherwi
1cf20 73 65 2c 20 69 66 20 74 68 65 20 72 65 61 6c 6c  se, if the reall
1cf30 6f 63 28 29 20 66 61 69 6c 73 2c 20 2a 70 49 64  oc() fails, *pId
1cf40 78 20 69 73 20 73 65 74 20 74 6f 20 2d 31 2c 20  x is set to -1, 
1cf50 2a 70 6e 45 6e 74 72 79 20 72 65 6d 61 69 6e 73  *pnEntry remains
1cf60 0a 2a 2a 20 75 6e 63 68 61 6e 67 65 64 20 61 6e  .** unchanged an
1cf70 64 20 61 20 63 6f 70 79 20 6f 66 20 70 41 72 72  d a copy of pArr
1cf80 61 79 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  ay returned..*/.
1cf90 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 41 72 72  void *sqlite3Arr
1cfa0 61 79 41 6c 6c 6f 63 61 74 65 28 0a 20 20 73 71  ayAllocate(.  sq
1cfb0 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20  lite3 *db,      
1cfc0 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f  /* Connection to
1cfd0 20 6e 6f 74 69 66 79 20 6f 66 20 6d 61 6c 6c 6f   notify of mallo
1cfe0 63 20 66 61 69 6c 75 72 65 73 20 2a 2f 0a 20 20  c failures */.  
1cff0 76 6f 69 64 20 2a 70 41 72 72 61 79 2c 20 20 20  void *pArray,   
1d000 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 6f 62    /* Array of ob
1d010 6a 65 63 74 73 2e 20 20 4d 69 67 68 74 20 62 65  jects.  Might be
1d020 20 72 65 61 6c 6c 6f 63 61 74 65 64 20 2a 2f 0a   reallocated */.
1d030 20 20 69 6e 74 20 73 7a 45 6e 74 72 79 2c 20 20    int szEntry,  
1d040 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 65      /* Size of e
1d050 61 63 68 20 6f 62 6a 65 63 74 20 69 6e 20 74 68  ach object in th
1d060 65 20 61 72 72 61 79 20 2a 2f 0a 20 20 69 6e 74  e array */.  int
1d070 20 2a 70 6e 45 6e 74 72 79 2c 20 20 20 20 20 2f   *pnEntry,     /
1d080 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6f 62 6a 65  * Number of obje
1d090 63 74 73 20 63 75 72 72 65 6e 74 6c 79 20 69 6e  cts currently in
1d0a0 20 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70   use */.  int *p
1d0b0 49 64 78 20 20 20 20 20 20 20 20 20 2f 2a 20 57  Idx         /* W
1d0c0 72 69 74 65 20 74 68 65 20 69 6e 64 65 78 20 6f  rite the index o
1d0d0 66 20 61 20 6e 65 77 20 73 6c 6f 74 20 68 65 72  f a new slot her
1d0e0 65 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20 2a  e */.){.  char *
1d0f0 7a 3b 0a 20 20 69 6e 74 20 6e 20 3d 20 2a 70 6e  z;.  int n = *pn
1d100 45 6e 74 72 79 3b 0a 20 20 69 66 28 20 28 6e 20  Entry;.  if( (n 
1d110 26 20 28 6e 2d 31 29 29 3d 3d 30 20 29 7b 0a 20  & (n-1))==0 ){. 
1d120 20 20 20 69 6e 74 20 73 7a 20 3d 20 28 6e 3d 3d     int sz = (n==
1d130 30 29 20 3f 20 31 20 3a 20 32 2a 6e 3b 0a 20 20  0) ? 1 : 2*n;.  
1d140 20 20 76 6f 69 64 20 2a 70 4e 65 77 20 3d 20 73    void *pNew = s
1d150 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 28  qlite3DbRealloc(
1d160 64 62 2c 20 70 41 72 72 61 79 2c 20 73 7a 2a 73  db, pArray, sz*s
1d170 7a 45 6e 74 72 79 29 3b 0a 20 20 20 20 69 66 28  zEntry);.    if(
1d180 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20   pNew==0 ){.    
1d190 20 20 2a 70 49 64 78 20 3d 20 2d 31 3b 0a 20 20    *pIdx = -1;.  
1d1a0 20 20 20 20 72 65 74 75 72 6e 20 70 41 72 72 61      return pArra
1d1b0 79 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 41 72  y;.    }.    pAr
1d1c0 72 61 79 20 3d 20 70 4e 65 77 3b 0a 20 20 7d 0a  ray = pNew;.  }.
1d1d0 20 20 7a 20 3d 20 28 63 68 61 72 2a 29 70 41 72    z = (char*)pAr
1d1e0 72 61 79 3b 0a 20 20 6d 65 6d 73 65 74 28 26 7a  ray;.  memset(&z
1d1f0 5b 6e 20 2a 20 73 7a 45 6e 74 72 79 5d 2c 20 30  [n * szEntry], 0
1d200 2c 20 73 7a 45 6e 74 72 79 29 3b 0a 20 20 2a 70  , szEntry);.  *p
1d210 49 64 78 20 3d 20 6e 3b 0a 20 20 2b 2b 2a 70 6e  Idx = n;.  ++*pn
1d220 45 6e 74 72 79 3b 0a 20 20 72 65 74 75 72 6e 20  Entry;.  return 
1d230 70 41 72 72 61 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pArray;.}../*.**
1d240 20 41 70 70 65 6e 64 20 61 20 6e 65 77 20 65 6c   Append a new el
1d250 65 6d 65 6e 74 20 74 6f 20 74 68 65 20 67 69 76  ement to the giv
1d260 65 6e 20 49 64 4c 69 73 74 2e 20 20 43 72 65 61  en IdList.  Crea
1d270 74 65 20 61 20 6e 65 77 20 49 64 4c 69 73 74 20  te a new IdList 
1d280 69 66 0a 2a 2a 20 6e 65 65 64 20 62 65 2e 0a 2a  if.** need be..*
1d290 2a 0a 2a 2a 20 41 20 6e 65 77 20 49 64 4c 69 73  *.** A new IdLis
1d2a0 74 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20 6f  t is returned, o
1d2b0 72 20 4e 55 4c 4c 20 69 66 20 6d 61 6c 6c 6f 63  r NULL if malloc
1d2c0 28 29 20 66 61 69 6c 73 2e 0a 2a 2f 0a 49 64 4c  () fails..*/.IdL
1d2d0 69 73 74 20 2a 73 71 6c 69 74 65 33 49 64 4c 69  ist *sqlite3IdLi
1d2e0 73 74 41 70 70 65 6e 64 28 73 71 6c 69 74 65 33  stAppend(sqlite3
1d2f0 20 2a 64 62 2c 20 49 64 4c 69 73 74 20 2a 70 4c   *db, IdList *pL
1d300 69 73 74 2c 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b  ist, Token *pTok
1d310 65 6e 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  en){.  int i;.  
1d320 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a  if( pList==0 ){.
1d330 20 20 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69      pList = sqli
1d340 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28  te3DbMallocZero(
1d350 64 62 2c 20 73 69 7a 65 6f 66 28 49 64 4c 69 73  db, sizeof(IdLis
1d360 74 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c  t) );.    if( pL
1d370 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ist==0 ) return 
1d380 30 3b 0a 20 20 7d 0a 20 20 70 4c 69 73 74 2d 3e  0;.  }.  pList->
1d390 61 20 3d 20 73 71 6c 69 74 65 33 41 72 72 61 79  a = sqlite3Array
1d3a0 41 6c 6c 6f 63 61 74 65 28 0a 20 20 20 20 20 20  Allocate(.      
1d3b0 64 62 2c 0a 20 20 20 20 20 20 70 4c 69 73 74 2d  db,.      pList-
1d3c0 3e 61 2c 0a 20 20 20 20 20 20 73 69 7a 65 6f 66  >a,.      sizeof
1d3d0 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 29 2c 0a 20  (pList->a[0]),. 
1d3e0 20 20 20 20 20 26 70 4c 69 73 74 2d 3e 6e 49 64       &pList->nId
1d3f0 2c 0a 20 20 20 20 20 20 26 69 0a 20 20 29 3b 0a  ,.      &i.  );.
1d400 20 20 69 66 28 20 69 3c 30 20 29 7b 0a 20 20 20    if( i<0 ){.   
1d410 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44 65   sqlite3IdListDe
1d420 6c 65 74 65 28 64 62 2c 20 70 4c 69 73 74 29 3b  lete(db, pList);
1d430 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
1d440 20 7d 0a 20 20 70 4c 69 73 74 2d 3e 61 5b 69 5d   }.  pList->a[i]
1d450 2e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33  .zName = sqlite3
1d460 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62  NameFromToken(db
1d470 2c 20 70 54 6f 6b 65 6e 29 3b 0a 20 20 72 65 74  , pToken);.  ret
1d480 75 72 6e 20 70 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a  urn pList;.}../*
1d490 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6e 20 49 64  .** Delete an Id
1d4a0 4c 69 73 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  List..*/.void sq
1d4b0 6c 69 74 65 33 49 64 4c 69 73 74 44 65 6c 65 74  lite3IdListDelet
1d4c0 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 49  e(sqlite3 *db, I
1d4d0 64 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20  dList *pList){. 
1d4e0 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 4c   int i;.  if( pL
1d4f0 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ist==0 ) return;
1d500 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c  .  for(i=0; i<pL
1d510 69 73 74 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a  ist->nId; i++){.
1d520 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
1d530 65 28 64 62 2c 20 70 4c 69 73 74 2d 3e 61 5b 69  e(db, pList->a[i
1d540 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20  ].zName);.  }.  
1d550 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
1d560 2c 20 70 4c 69 73 74 2d 3e 61 29 3b 0a 20 20 73  , pList->a);.  s
1d570 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
1d580 20 70 4c 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a   pList);.}../*.*
1d590 2a 20 52 65 74 75 72 6e 20 74 68 65 20 69 6e 64  * Return the ind
1d5a0 65 78 20 69 6e 20 70 4c 69 73 74 20 6f 66 20 74  ex in pList of t
1d5b0 68 65 20 69 64 65 6e 74 69 66 69 65 72 20 6e 61  he identifier na
1d5c0 6d 65 64 20 7a 49 64 2e 20 20 52 65 74 75 72 6e  med zId.  Return
1d5d0 20 2d 31 0a 2a 2a 20 69 66 20 6e 6f 74 20 66 6f   -1.** if not fo
1d5e0 75 6e 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  und..*/.int sqli
1d5f0 74 65 33 49 64 4c 69 73 74 49 6e 64 65 78 28 49  te3IdListIndex(I
1d600 64 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 63 6f  dList *pList, co
1d610 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29  nst char *zName)
1d620 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28  {.  int i;.  if(
1d630 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75   pList==0 ) retu
1d640 72 6e 20 2d 31 3b 0a 20 20 66 6f 72 28 69 3d 30  rn -1;.  for(i=0
1d650 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 49 64 3b 20  ; i<pList->nId; 
1d660 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73 71  i++){.    if( sq
1d670 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 4c 69  lite3StrICmp(pLi
1d680 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20  st->a[i].zName, 
1d690 7a 4e 61 6d 65 29 3d 3d 30 20 29 20 72 65 74 75  zName)==0 ) retu
1d6a0 72 6e 20 69 3b 0a 20 20 7d 0a 20 20 72 65 74 75  rn i;.  }.  retu
1d6b0 72 6e 20 2d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn -1;.}../*.** 
1d6c0 45 78 70 61 6e 64 20 74 68 65 20 73 70 61 63 65  Expand the space
1d6d0 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 74   allocated for t
1d6e0 68 65 20 67 69 76 65 6e 20 53 72 63 4c 69 73 74  he given SrcList
1d6f0 20 6f 62 6a 65 63 74 20 62 79 0a 2a 2a 20 63 72   object by.** cr
1d700 65 61 74 69 6e 67 20 6e 45 78 74 72 61 20 6e 65  eating nExtra ne
1d710 77 20 73 6c 6f 74 73 20 62 65 67 69 6e 6e 69 6e  w slots beginnin
1d720 67 20 61 74 20 69 53 74 61 72 74 2e 20 20 69 53  g at iStart.  iS
1d730 74 61 72 74 20 69 73 20 7a 65 72 6f 20 62 61 73  tart is zero bas
1d740 65 64 2e 0a 2a 2a 20 4e 65 77 20 73 6c 6f 74 73  ed..** New slots
1d750 20 61 72 65 20 7a 65 72 6f 65 64 2e 0a 2a 2a 0a   are zeroed..**.
1d760 2a 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20  ** For example, 
1d770 73 75 70 70 6f 73 65 20 61 20 53 72 63 4c 69 73  suppose a SrcLis
1d780 74 20 69 6e 69 74 69 61 6c 6c 79 20 63 6f 6e 74  t initially cont
1d790 61 69 6e 73 20 74 77 6f 20 65 6e 74 72 69 65 73  ains two entries
1d7a0 3a 20 41 2c 42 2e 0a 2a 2a 20 54 6f 20 61 70 70  : A,B..** To app
1d7b0 65 6e 64 20 33 20 6e 65 77 20 65 6e 74 72 69 65  end 3 new entrie
1d7c0 73 20 6f 6e 74 6f 20 74 68 65 20 65 6e 64 2c 20  s onto the end, 
1d7d0 64 6f 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20  do this:.**.**  
1d7e0 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74    sqlite3SrcList
1d7f0 45 6e 6c 61 72 67 65 28 64 62 2c 20 70 53 72 63  Enlarge(db, pSrc
1d800 6c 69 73 74 2c 20 33 2c 20 32 29 3b 0a 2a 2a 0a  list, 3, 2);.**.
1d810 2a 2a 20 41 66 74 65 72 20 74 68 65 20 63 61 6c  ** After the cal
1d820 6c 20 61 62 6f 76 65 20 69 74 20 77 6f 75 6c 64  l above it would
1d830 20 63 6f 6e 74 61 69 6e 3a 20 20 41 2c 20 42 2c   contain:  A, B,
1d840 20 6e 69 6c 2c 20 6e 69 6c 2c 20 6e 69 6c 2e 0a   nil, nil, nil..
1d850 2a 2a 20 49 66 20 74 68 65 20 69 53 74 61 72 74  ** If the iStart
1d860 20 61 72 67 75 6d 65 6e 74 20 68 61 64 20 62 65   argument had be
1d870 65 6e 20 31 20 69 6e 73 74 65 61 64 20 6f 66 20  en 1 instead of 
1d880 32 2c 20 74 68 65 6e 20 74 68 65 20 72 65 73 75  2, then the resu
1d890 6c 74 0a 2a 2a 20 77 6f 75 6c 64 20 68 61 76 65  lt.** would have
1d8a0 20 62 65 65 6e 3a 20 20 41 2c 20 6e 69 6c 2c 20   been:  A, nil, 
1d8b0 6e 69 6c 2c 20 6e 69 6c 2c 20 42 2e 20 20 54 6f  nil, nil, B.  To
1d8c0 20 70 72 65 70 65 6e 64 20 74 68 65 20 6e 65 77   prepend the new
1d8d0 20 73 6c 6f 74 73 2c 0a 2a 2a 20 74 68 65 20 69   slots,.** the i
1d8e0 53 74 61 72 74 20 76 61 6c 75 65 20 77 6f 75 6c  Start value woul
1d8f0 64 20 62 65 20 30 2e 20 20 54 68 65 20 72 65 73  d be 0.  The res
1d900 75 6c 74 20 74 68 65 6e 20 77 6f 75 6c 64 0a 2a  ult then would.*
1d910 2a 20 62 65 3a 20 6e 69 6c 2c 20 6e 69 6c 2c 20  * be: nil, nil, 
1d920 6e 69 6c 2c 20 41 2c 20 42 2e 0a 2a 2a 0a 2a 2a  nil, A, B..**.**
1d930 20 49 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c   If a memory all
1d940 6f 63 61 74 69 6f 6e 20 66 61 69 6c 73 20 74 68  ocation fails th
1d950 65 20 53 72 63 4c 69 73 74 20 69 73 20 75 6e 63  e SrcList is unc
1d960 68 61 6e 67 65 64 2e 20 20 54 68 65 0a 2a 2a 20  hanged.  The.** 
1d970 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
1d980 20 66 6c 61 67 20 77 69 6c 6c 20 62 65 20 73 65   flag will be se
1d990 74 20 74 6f 20 74 72 75 65 2e 0a 2a 2f 0a 53 72  t to true..*/.Sr
1d9a0 63 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 53 72  cList *sqlite3Sr
1d9b0 63 4c 69 73 74 45 6e 6c 61 72 67 65 28 0a 20 20  cListEnlarge(.  
1d9c0 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20  sqlite3 *db,    
1d9d0 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63     /* Database c
1d9e0 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 6e 6f 74  onnection to not
1d9f0 69 66 79 20 6f 66 20 4f 4f 4d 20 65 72 72 6f 72  ify of OOM error
1da00 73 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a  s */.  SrcList *
1da10 70 53 72 63 2c 20 20 20 20 20 2f 2a 20 54 68 65  pSrc,     /* The
1da20 20 53 72 63 4c 69 73 74 20 74 6f 20 62 65 20 65   SrcList to be e
1da30 6e 6c 61 72 67 65 64 20 2a 2f 0a 20 20 69 6e 74  nlarged */.  int
1da40 20 6e 45 78 74 72 61 2c 20 20 20 20 20 20 20 20   nExtra,        
1da50 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6e 65 77  /* Number of new
1da60 20 73 6c 6f 74 73 20 74 6f 20 61 64 64 20 74 6f   slots to add to
1da70 20 70 53 72 63 2d 3e 61 5b 5d 20 2a 2f 0a 20 20   pSrc->a[] */.  
1da80 69 6e 74 20 69 53 74 61 72 74 20 20 20 20 20 20  int iStart      
1da90 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20 70     /* Index in p
1daa0 53 72 63 2d 3e 61 5b 5d 20 6f 66 20 66 69 72 73  Src->a[] of firs
1dab0 74 20 6e 65 77 20 73 6c 6f 74 20 2a 2f 0a 29 7b  t new slot */.){
1dac0 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 2f 2a 20  .  int i;..  /* 
1dad0 53 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20  Sanity checking 
1dae0 6f 6e 20 63 61 6c 6c 69 6e 67 20 70 61 72 61 6d  on calling param
1daf0 65 74 65 72 73 20 2a 2f 0a 20 20 61 73 73 65 72  eters */.  asser
1db00 74 28 20 69 53 74 61 72 74 3e 3d 30 20 29 3b 0a  t( iStart>=0 );.
1db10 20 20 61 73 73 65 72 74 28 20 6e 45 78 74 72 61    assert( nExtra
1db20 3e 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28  >=1 );.  assert(
1db30 20 70 53 72 63 21 3d 30 20 29 3b 0a 20 20 61 73   pSrc!=0 );.  as
1db40 73 65 72 74 28 20 69 53 74 61 72 74 3c 3d 70 53  sert( iStart<=pS
1db50 72 63 2d 3e 6e 53 72 63 20 29 3b 0a 0a 20 20 2f  rc->nSrc );..  /
1db60 2a 20 41 6c 6c 6f 63 61 74 65 20 61 64 64 69 74  * Allocate addit
1db70 69 6f 6e 61 6c 20 73 70 61 63 65 20 69 66 20 6e  ional space if n
1db80 65 65 64 65 64 20 2a 2f 0a 20 20 69 66 28 20 28  eeded */.  if( (
1db90 75 33 32 29 70 53 72 63 2d 3e 6e 53 72 63 2b 6e  u32)pSrc->nSrc+n
1dba0 45 78 74 72 61 3e 70 53 72 63 2d 3e 6e 41 6c 6c  Extra>pSrc->nAll
1dbb0 6f 63 20 29 7b 0a 20 20 20 20 53 72 63 4c 69 73  oc ){.    SrcLis
1dbc0 74 20 2a 70 4e 65 77 3b 0a 20 20 20 20 69 6e 74  t *pNew;.    int
1dbd0 20 6e 41 6c 6c 6f 63 20 3d 20 70 53 72 63 2d 3e   nAlloc = pSrc->
1dbe0 6e 53 72 63 2b 6e 45 78 74 72 61 3b 0a 20 20 20  nSrc+nExtra;.   
1dbf0 20 69 6e 74 20 6e 47 6f 74 3b 0a 20 20 20 20 70   int nGot;.    p
1dc00 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62 52  New = sqlite3DbR
1dc10 65 61 6c 6c 6f 63 28 64 62 2c 20 70 53 72 63 2c  ealloc(db, pSrc,
1dc20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1dc30 73 69 7a 65 6f 66 28 2a 70 53 72 63 29 20 2b 20  sizeof(*pSrc) + 
1dc40 28 6e 41 6c 6c 6f 63 2d 31 29 2a 73 69 7a 65 6f  (nAlloc-1)*sizeo
1dc50 66 28 70 53 72 63 2d 3e 61 5b 30 5d 29 20 29 3b  f(pSrc->a[0]) );
1dc60 0a 20 20 20 20 69 66 28 20 70 4e 65 77 3d 3d 30  .    if( pNew==0
1dc70 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
1dc80 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
1dc90 65 64 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ed );.      retu
1dca0 72 6e 20 70 53 72 63 3b 0a 20 20 20 20 7d 0a 20  rn pSrc;.    }. 
1dcb0 20 20 20 70 53 72 63 20 3d 20 70 4e 65 77 3b 0a     pSrc = pNew;.
1dcc0 20 20 20 20 6e 47 6f 74 20 3d 20 28 73 71 6c 69      nGot = (sqli
1dcd0 74 65 33 44 62 4d 61 6c 6c 6f 63 53 69 7a 65 28  te3DbMallocSize(
1dce0 64 62 2c 20 70 4e 65 77 29 20 2d 20 73 69 7a 65  db, pNew) - size
1dcf0 6f 66 28 2a 70 53 72 63 29 29 2f 73 69 7a 65 6f  of(*pSrc))/sizeo
1dd00 66 28 70 53 72 63 2d 3e 61 5b 30 5d 29 2b 31 3b  f(pSrc->a[0])+1;
1dd10 0a 20 20 20 20 70 53 72 63 2d 3e 6e 41 6c 6c 6f  .    pSrc->nAllo
1dd20 63 20 3d 20 6e 47 6f 74 3b 0a 20 20 7d 0a 0a 20  c = nGot;.  }.. 
1dd30 20 2f 2a 20 4d 6f 76 65 20 65 78 69 73 74 69 6e   /* Move existin
1dd40 67 20 73 6c 6f 74 73 20 74 68 61 74 20 63 6f 6d  g slots that com
1dd50 65 20 61 66 74 65 72 20 74 68 65 20 6e 65 77 6c  e after the newl
1dd60 79 20 69 6e 73 65 72 74 65 64 20 73 6c 6f 74 73  y inserted slots
1dd70 0a 20 20 2a 2a 20 6f 75 74 20 6f 66 20 74 68 65  .  ** out of the
1dd80 20 77 61 79 20 2a 2f 0a 20 20 66 6f 72 28 69 3d   way */.  for(i=
1dd90 70 53 72 63 2d 3e 6e 53 72 63 2d 31 3b 20 69 3e  pSrc->nSrc-1; i>
1dda0 3d 69 53 74 61 72 74 3b 20 69 2d 2d 29 7b 0a 20  =iStart; i--){. 
1ddb0 20 20 20 70 53 72 63 2d 3e 61 5b 69 2b 6e 45 78     pSrc->a[i+nEx
1ddc0 74 72 61 5d 20 3d 20 70 53 72 63 2d 3e 61 5b 69  tra] = pSrc->a[i
1ddd0 5d 3b 0a 20 20 7d 0a 20 20 70 53 72 63 2d 3e 6e  ];.  }.  pSrc->n
1dde0 53 72 63 20 2b 3d 20 6e 45 78 74 72 61 3b 0a 0a  Src += nExtra;..
1ddf0 20 20 2f 2a 20 5a 65 72 6f 20 74 68 65 20 6e 65    /* Zero the ne
1de00 77 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 73 6c  wly allocated sl
1de10 6f 74 73 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28  ots */.  memset(
1de20 26 70 53 72 63 2d 3e 61 5b 69 53 74 61 72 74 5d  &pSrc->a[iStart]
1de30 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 53 72 63  , 0, sizeof(pSrc
1de40 2d 3e 61 5b 30 5d 29 2a 6e 45 78 74 72 61 29 3b  ->a[0])*nExtra);
1de50 0a 20 20 66 6f 72 28 69 3d 69 53 74 61 72 74 3b  .  for(i=iStart;
1de60 20 69 3c 69 53 74 61 72 74 2b 6e 45 78 74 72 61   i<iStart+nExtra
1de70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70 53 72 63  ; i++){.    pSrc
1de80 2d 3e 61 5b 69 5d 2e 69 43 75 72 73 6f 72 20 3d  ->a[i].iCursor =
1de90 20 2d 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52   -1;.  }..  /* R
1dea0 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
1deb0 74 6f 20 74 68 65 20 65 6e 6c 61 72 67 65 64 20  to the enlarged 
1dec0 53 72 63 4c 69 73 74 20 2a 2f 0a 20 20 72 65 74  SrcList */.  ret
1ded0 75 72 6e 20 70 53 72 63 3b 0a 7d 0a 0a 0a 2f 2a  urn pSrc;.}.../*
1dee0 0a 2a 2a 20 41 70 70 65 6e 64 20 61 20 6e 65 77  .** Append a new
1def0 20 74 61 62 6c 65 20 6e 61 6d 65 20 74 6f 20 74   table name to t
1df00 68 65 20 67 69 76 65 6e 20 53 72 63 4c 69 73 74  he given SrcList
1df10 2e 20 20 43 72 65 61 74 65 20 61 20 6e 65 77 20  .  Create a new 
1df20 53 72 63 4c 69 73 74 20 69 66 0a 2a 2a 20 6e 65  SrcList if.** ne
1df30 65 64 20 62 65 2e 20 20 41 20 6e 65 77 20 65 6e  ed be.  A new en
1df40 74 72 79 20 69 73 20 63 72 65 61 74 65 64 20 69  try is created i
1df50 6e 20 74 68 65 20 53 72 63 4c 69 73 74 20 65 76  n the SrcList ev
1df60 65 6e 20 69 66 20 70 54 61 62 6c 65 20 69 73 20  en if pTable is 
1df70 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 41 20 53 72  NULL..**.** A Sr
1df80 63 4c 69 73 74 20 69 73 20 72 65 74 75 72 6e 65  cList is returne
1df90 64 2c 20 6f 72 20 4e 55 4c 4c 20 69 66 20 74 68  d, or NULL if th
1dfa0 65 72 65 20 69 73 20 61 6e 20 4f 4f 4d 20 65 72  ere is an OOM er
1dfb0 72 6f 72 2e 20 20 54 68 65 20 72 65 74 75 72 6e  ror.  The return
1dfc0 65 64 0a 2a 2a 20 53 72 63 4c 69 73 74 20 6d 69  ed.** SrcList mi
1dfd0 67 68 74 20 62 65 20 74 68 65 20 73 61 6d 65 20  ght be the same 
1dfe0 61 73 20 74 68 65 20 53 72 63 4c 69 73 74 20 74  as the SrcList t
1dff0 68 61 74 20 77 61 73 20 69 6e 70 75 74 20 6f 72  hat was input or
1e000 20 69 74 20 6d 69 67 68 74 20 62 65 0a 2a 2a 20   it might be.** 
1e010 61 20 6e 65 77 20 6f 6e 65 2e 20 20 49 66 20 61  a new one.  If a
1e020 6e 20 4f 4f 4d 20 65 72 72 6f 72 20 64 6f 65 73  n OOM error does
1e030 20 6f 63 63 75 72 73 2c 20 74 68 65 6e 20 74 68   occurs, then th
1e040 65 20 70 72 69 6f 72 20 76 61 6c 75 65 20 6f 66  e prior value of
1e050 20 70 4c 69 73 74 0a 2a 2a 20 74 68 61 74 20 69   pList.** that i
1e060 73 20 69 6e 70 75 74 20 74 6f 20 74 68 69 73 20  s input to this 
1e070 72 6f 75 74 69 6e 65 20 69 73 20 61 75 74 6f 6d  routine is autom
1e080 61 74 69 63 61 6c 6c 79 20 66 72 65 65 64 2e 0a  atically freed..
1e090 2a 2a 0a 2a 2a 20 49 66 20 70 44 61 74 61 62 61  **.** If pDataba
1e0a0 73 65 20 69 73 20 6e 6f 74 20 6e 75 6c 6c 2c 20  se is not null, 
1e0b0 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68  it means that th
1e0c0 65 20 74 61 62 6c 65 20 68 61 73 20 61 6e 20 6f  e table has an o
1e0d0 70 74 69 6f 6e 61 6c 0a 2a 2a 20 64 61 74 61 62  ptional.** datab
1e0e0 61 73 65 20 6e 61 6d 65 20 70 72 65 66 69 78 2e  ase name prefix.
1e0f0 20 20 4c 69 6b 65 20 74 68 69 73 3a 20 20 22 64    Like this:  "d
1e100 61 74 61 62 61 73 65 2e 74 61 62 6c 65 22 2e 20  atabase.table". 
1e110 20 54 68 65 20 70 44 61 74 61 62 61 73 65 0a 2a   The pDatabase.*
1e120 2a 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20  * points to the 
1e130 74 61 62 6c 65 20 6e 61 6d 65 20 61 6e 64 20 74  table name and t
1e140 68 65 20 70 54 61 62 6c 65 20 70 6f 69 6e 74 73  he pTable points
1e150 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
1e160 20 6e 61 6d 65 2e 0a 2a 2a 20 54 68 65 20 53 72   name..** The Sr
1e170 63 4c 69 73 74 2e 61 5b 5d 2e 7a 4e 61 6d 65 20  cList.a[].zName 
1e180 66 69 65 6c 64 20 69 73 20 66 69 6c 6c 65 64 20  field is filled 
1e190 77 69 74 68 20 74 68 65 20 74 61 62 6c 65 20 6e  with the table n
1e1a0 61 6d 65 20 77 68 69 63 68 20 6d 69 67 68 74 0a  ame which might.
1e1b0 2a 2a 20 63 6f 6d 65 20 66 72 6f 6d 20 70 54 61  ** come from pTa
1e1c0 62 6c 65 20 28 69 66 20 70 44 61 74 61 62 61 73  ble (if pDatabas
1e1d0 65 20 69 73 20 4e 55 4c 4c 29 20 6f 72 20 66 72  e is NULL) or fr
1e1e0 6f 6d 20 70 44 61 74 61 62 61 73 65 2e 20 20 0a  om pDatabase.  .
1e1f0 2a 2a 20 53 72 63 4c 69 73 74 2e 61 5b 5d 2e 7a  ** SrcList.a[].z
1e200 44 61 74 61 62 61 73 65 20 69 73 20 66 69 6c 6c  Database is fill
1e210 65 64 20 77 69 74 68 20 74 68 65 20 64 61 74 61  ed with the data
1e220 62 61 73 65 20 6e 61 6d 65 20 66 72 6f 6d 20 70  base name from p
1e230 54 61 62 6c 65 2c 0a 2a 2a 20 6f 72 20 77 69 74  Table,.** or wit
1e240 68 20 4e 55 4c 4c 20 69 66 20 6e 6f 20 64 61 74  h NULL if no dat
1e250 61 62 61 73 65 20 69 73 20 73 70 65 63 69 66 69  abase is specifi
1e260 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 6f 74 68  ed..**.** In oth
1e270 65 72 20 77 6f 72 64 73 2c 20 69 66 20 63 61 6c  er words, if cal
1e280 6c 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a  l like this:.**.
1e290 2a 2a 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  **         sqlit
1e2a0 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64 28  e3SrcListAppend(
1e2b0 44 2c 41 2c 42 2c 30 29 3b 0a 2a 2a 0a 2a 2a 20  D,A,B,0);.**.** 
1e2c0 54 68 65 6e 20 42 20 69 73 20 61 20 74 61 62 6c  Then B is a tabl
1e2d0 65 20 6e 61 6d 65 20 61 6e 64 20 74 68 65 20 64  e name and the d
1e2e0 61 74 61 62 61 73 65 20 6e 61 6d 65 20 69 73 20  atabase name is 
1e2f0 75 6e 73 70 65 63 69 66 69 65 64 2e 20 20 49 66  unspecified.  If
1e300 20 63 61 6c 6c 65 64 0a 2a 2a 20 6c 69 6b 65 20   called.** like 
1e310 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  this:.**.**     
1e320 20 20 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69      sqlite3SrcLi
1e330 73 74 41 70 70 65 6e 64 28 44 2c 41 2c 42 2c 43  stAppend(D,A,B,C
1e340 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 43 20  );.**.** Then C 
1e350 69 73 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d  is the table nam
1e360 65 20 61 6e 64 20 42 20 69 73 20 74 68 65 20 64  e and B is the d
1e370 61 74 61 62 61 73 65 20 6e 61 6d 65 2e 20 20 49  atabase name.  I
1e380 66 20 43 20 69 73 20 64 65 66 69 6e 65 64 0a 2a  f C is defined.*
1e390 2a 20 74 68 65 6e 20 73 6f 20 69 73 20 42 2e 20  * then so is B. 
1e3a0 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c   In other words,
1e3b0 20 77 65 20 6e 65 76 65 72 20 68 61 76 65 20 61   we never have a
1e3c0 20 63 61 73 65 20 77 68 65 72 65 3a 0a 2a 2a 0a   case where:.**.
1e3d0 2a 2a 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  **         sqlit
1e3e0 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64 28  e3SrcListAppend(
1e3f0 44 2c 41 2c 30 2c 43 29 3b 0a 2a 2a 0a 2a 2a 20  D,A,0,C);.**.** 
1e400 42 6f 74 68 20 70 54 61 62 6c 65 20 61 6e 64 20  Both pTable and 
1e410 70 44 61 74 61 62 61 73 65 20 61 72 65 20 61 73  pDatabase are as
1e420 73 75 6d 65 64 20 74 6f 20 62 65 20 71 75 6f 74  sumed to be quot
1e430 65 64 2e 20 20 54 68 65 79 20 61 72 65 20 64 65  ed.  They are de
1e440 71 75 6f 74 65 64 0a 2a 2a 20 62 65 66 6f 72 65  quoted.** before
1e450 20 62 65 69 6e 67 20 61 64 64 65 64 20 74 6f 20   being added to 
1e460 74 68 65 20 53 72 63 4c 69 73 74 2e 0a 2a 2f 0a  the SrcList..*/.
1e470 53 72 63 4c 69 73 74 20 2a 73 71 6c 69 74 65 33  SrcList *sqlite3
1e480 53 72 63 4c 69 73 74 41 70 70 65 6e 64 28 0a 20  SrcListAppend(. 
1e490 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20   sqlite3 *db,   
1e4a0 20 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69       /* Connecti
1e4b0 6f 6e 20 74 6f 20 6e 6f 74 69 66 79 20 6f 66 20  on to notify of 
1e4c0 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65 73 20  malloc failures 
1e4d0 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 4c  */.  SrcList *pL
1e4e0 69 73 74 2c 20 20 20 20 20 2f 2a 20 41 70 70 65  ist,     /* Appe
1e4f0 6e 64 20 74 6f 20 74 68 69 73 20 53 72 63 4c 69  nd to this SrcLi
1e500 73 74 2e 20 4e 55 4c 4c 20 63 72 65 61 74 65 73  st. NULL creates
1e510 20 61 20 6e 65 77 20 53 72 63 4c 69 73 74 20 2a   a new SrcList *
1e520 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 54 61 62 6c  /.  Token *pTabl
1e530 65 2c 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65  e,      /* Table
1e540 20 74 6f 20 61 70 70 65 6e 64 20 2a 2f 0a 20 20   to append */.  
1e550 54 6f 6b 65 6e 20 2a 70 44 61 74 61 62 61 73 65  Token *pDatabase
1e560 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
1e570 6f 66 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a  of the table */.
1e580 29 7b 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  ){.  struct SrcL
1e590 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b  ist_item *pItem;
1e5a0 0a 20 20 61 73 73 65 72 74 28 20 70 44 61 74 61  .  assert( pData
1e5b0 62 61 73 65 3d 3d 30 20 7c 7c 20 70 54 61 62 6c  base==0 || pTabl
1e5c0 65 21 3d 30 20 29 3b 20 20 2f 2a 20 43 61 6e 6e  e!=0 );  /* Cann
1e5d0 6f 74 20 68 61 76 65 20 43 20 77 69 74 68 6f 75  ot have C withou
1e5e0 74 20 42 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  t B */.  assert(
1e5f0 20 64 62 21 3d 30 20 29 3b 0a 20 20 69 66 28 20   db!=0 );.  if( 
1e600 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20  pList==0 ){.    
1e610 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 44  pList = sqlite3D
1e620 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c  bMallocRawNN(db,
1e630 20 73 69 7a 65 6f 66 28 53 72 63 4c 69 73 74 29   sizeof(SrcList)
1e640 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73   );.    if( pLis
1e650 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  t==0 ) return 0;
1e660 0a 20 20 20 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c  .    pList->nAll
1e670 6f 63 20 3d 20 31 3b 0a 20 20 20 20 70 4c 69 73  oc = 1;.    pLis
1e680 74 2d 3e 6e 53 72 63 20 3d 20 30 3b 0a 20 20 7d  t->nSrc = 0;.  }
1e690 0a 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74  .  pList = sqlit
1e6a0 65 33 53 72 63 4c 69 73 74 45 6e 6c 61 72 67 65  e3SrcListEnlarge
1e6b0 28 64 62 2c 20 70 4c 69 73 74 2c 20 31 2c 20 70  (db, pList, 1, p
1e6c0 4c 69 73 74 2d 3e 6e 53 72 63 29 3b 0a 20 20 69  List->nSrc);.  i
1e6d0 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
1e6e0 6c 65 64 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  led ){.    sqlit
1e6f0 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28  e3SrcListDelete(
1e700 64 62 2c 20 70 4c 69 73 74 29 3b 0a 20 20 20 20  db, pList);.    
1e710 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
1e720 70 49 74 65 6d 20 3d 20 26 70 4c 69 73 74 2d 3e  pItem = &pList->
1e730 61 5b 70 4c 69 73 74 2d 3e 6e 53 72 63 2d 31 5d  a[pList->nSrc-1]
1e740 3b 0a 20 20 69 66 28 20 70 44 61 74 61 62 61 73  ;.  if( pDatabas
1e750 65 20 26 26 20 70 44 61 74 61 62 61 73 65 2d 3e  e && pDatabase->
1e760 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 70 44 61 74  z==0 ){.    pDat
1e770 61 62 61 73 65 20 3d 20 30 3b 0a 20 20 7d 0a 20  abase = 0;.  }. 
1e780 20 69 66 28 20 70 44 61 74 61 62 61 73 65 20 29   if( pDatabase )
1e790 7b 0a 20 20 20 20 54 6f 6b 65 6e 20 2a 70 54 65  {.    Token *pTe
1e7a0 6d 70 20 3d 20 70 44 61 74 61 62 61 73 65 3b 0a  mp = pDatabase;.
1e7b0 20 20 20 20 70 44 61 74 61 62 61 73 65 20 3d 20      pDatabase = 
1e7c0 70 54 61 62 6c 65 3b 0a 20 20 20 20 70 54 61 62  pTable;.    pTab
1e7d0 6c 65 20 3d 20 70 54 65 6d 70 3b 0a 20 20 7d 0a  le = pTemp;.  }.
1e7e0 20 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d    pItem->zName =
1e7f0 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d   sqlite3NameFrom
1e800 54 6f 6b 65 6e 28 64 62 2c 20 70 54 61 62 6c 65  Token(db, pTable
1e810 29 3b 0a 20 20 70 49 74 65 6d 2d 3e 7a 44 61 74  );.  pItem->zDat
1e820 61 62 61 73 65 20 3d 20 73 71 6c 69 74 65 33 4e  abase = sqlite3N
1e830 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c  ameFromToken(db,
1e840 20 70 44 61 74 61 62 61 73 65 29 3b 0a 20 20 72   pDatabase);.  r
1e850 65 74 75 72 6e 20 70 4c 69 73 74 3b 0a 7d 0a 0a  eturn pList;.}..
1e860 2f 2a 0a 2a 2a 20 41 73 73 69 67 6e 20 56 64 62  /*.** Assign Vdb
1e870 65 43 75 72 73 6f 72 20 69 6e 64 65 78 20 6e 75  eCursor index nu
1e880 6d 62 65 72 73 20 74 6f 20 61 6c 6c 20 74 61 62  mbers to all tab
1e890 6c 65 73 20 69 6e 20 61 20 53 72 63 4c 69 73 74  les in a SrcList
1e8a0 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
1e8b0 53 72 63 4c 69 73 74 41 73 73 69 67 6e 43 75 72  SrcListAssignCur
1e8c0 73 6f 72 73 28 50 61 72 73 65 20 2a 70 50 61 72  sors(Parse *pPar
1e8d0 73 65 2c 20 53 72 63 4c 69 73 74 20 2a 70 4c 69  se, SrcList *pLi
1e8e0 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  st){.  int i;.  
1e8f0 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
1e900 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 61 73  tem *pItem;.  as
1e910 73 65 72 74 28 70 4c 69 73 74 20 7c 7c 20 70 50  sert(pList || pP
1e920 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  arse->db->malloc
1e930 46 61 69 6c 65 64 20 29 3b 0a 20 20 69 66 28 20  Failed );.  if( 
1e940 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 66 6f 72  pList ){.    for
1e950 28 69 3d 30 2c 20 70 49 74 65 6d 3d 70 4c 69 73  (i=0, pItem=pLis
1e960 74 2d 3e 61 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e  t->a; i<pList->n
1e970 53 72 63 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b  Src; i++, pItem+
1e980 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 49  +){.      if( pI
1e990 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3e 3d 30 20  tem->iCursor>=0 
1e9a0 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 70  ) break;.      p
1e9b0 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 20 3d 20  Item->iCursor = 
1e9c0 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a  pParse->nTab++;.
1e9d0 20 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d        if( pItem-
1e9e0 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20  >pSelect ){.    
1e9f0 20 20 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69      sqlite3SrcLi
1ea00 73 74 41 73 73 69 67 6e 43 75 72 73 6f 72 73 28  stAssignCursors(
1ea10 70 50 61 72 73 65 2c 20 70 49 74 65 6d 2d 3e 70  pParse, pItem->p
1ea20 53 65 6c 65 63 74 2d 3e 70 53 72 63 29 3b 0a 20  Select->pSrc);. 
1ea30 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
1ea40 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65  .}../*.** Delete
1ea50 20 61 6e 20 65 6e 74 69 72 65 20 53 72 63 4c 69   an entire SrcLi
1ea60 73 74 20 69 6e 63 6c 75 64 69 6e 67 20 61 6c 6c  st including all
1ea70 20 69 74 73 20 73 75 62 73 74 72 75 63 74 75 72   its substructur
1ea80 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  e..*/.void sqlit
1ea90 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28  e3SrcListDelete(
1eaa0 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 53 72 63  sqlite3 *db, Src
1eab0 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20  List *pList){.  
1eac0 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20  int i;.  struct 
1ead0 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  SrcList_item *pI
1eae0 74 65 6d 3b 0a 20 20 69 66 28 20 70 4c 69 73 74  tem;.  if( pList
1eaf0 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
1eb00 66 6f 72 28 70 49 74 65 6d 3d 70 4c 69 73 74 2d  for(pItem=pList-
1eb10 3e 61 2c 20 69 3d 30 3b 20 69 3c 70 4c 69 73 74  >a, i=0; i<pList
1eb20 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 49 74  ->nSrc; i++, pIt
1eb30 65 6d 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74  em++){.    sqlit
1eb40 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 49 74  e3DbFree(db, pIt
1eb50 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 29 3b 0a  em->zDatabase);.
1eb60 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
1eb70 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 7a 4e 61  e(db, pItem->zNa
1eb80 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  me);.    sqlite3
1eb90 44 62 46 72 65 65 28 64 62 2c 20 70 49 74 65 6d  DbFree(db, pItem
1eba0 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20 20 20 20 69  ->zAlias);.    i
1ebb0 66 28 20 70 49 74 65 6d 2d 3e 66 67 2e 69 73 49  f( pItem->fg.isI
1ebc0 6e 64 65 78 65 64 42 79 20 29 20 73 71 6c 69 74  ndexedBy ) sqlit
1ebd0 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 49 74  e3DbFree(db, pIt
1ebe0 65 6d 2d 3e 75 31 2e 7a 49 6e 64 65 78 65 64 42  em->u1.zIndexedB
1ebf0 79 29 3b 0a 20 20 20 20 69 66 28 20 70 49 74 65  y);.    if( pIte
1ec00 6d 2d 3e 66 67 2e 69 73 54 61 62 46 75 6e 63 20  m->fg.isTabFunc 
1ec10 29 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  ) sqlite3ExprLis
1ec20 74 44 65 6c 65 74 65 28 64 62 2c 20 70 49 74 65  tDelete(db, pIte
1ec30 6d 2d 3e 75 31 2e 70 46 75 6e 63 41 72 67 29 3b  m->u1.pFuncArg);
1ec40 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 6c 65  .    sqlite3Dele
1ec50 74 65 54 61 62 6c 65 28 64 62 2c 20 70 49 74 65  teTable(db, pIte
1ec60 6d 2d 3e 70 54 61 62 29 3b 0a 20 20 20 20 73 71  m->pTab);.    sq
1ec70 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74  lite3SelectDelet
1ec80 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 70 53 65  e(db, pItem->pSe
1ec90 6c 65 63 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  lect);.    sqlit
1eca0 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c  e3ExprDelete(db,
1ecb0 20 70 49 74 65 6d 2d 3e 70 4f 6e 29 3b 0a 20 20   pItem->pOn);.  
1ecc0 20 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44    sqlite3IdListD
1ecd0 65 6c 65 74 65 28 64 62 2c 20 70 49 74 65 6d 2d  elete(db, pItem-
1ece0 3e 70 55 73 69 6e 67 29 3b 0a 20 20 7d 0a 20 20  >pUsing);.  }.  
1ecf0 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
1ed00 2c 20 70 4c 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a  , pList);.}../*.
1ed10 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
1ed20 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65  is called by the
1ed30 20 70 61 72 73 65 72 20 74 6f 20 61 64 64 20 61   parser to add a
1ed40 20 6e 65 77 20 74 65 72 6d 20 74 6f 20 74 68 65   new term to the
1ed50 0a 2a 2a 20 65 6e 64 20 6f 66 20 61 20 67 72 6f  .** end of a gro
1ed60 77 69 6e 67 20 46 52 4f 4d 20 63 6c 61 75 73 65  wing FROM clause
1ed70 2e 20 20 54 68 65 20 22 70 22 20 70 61 72 61 6d  .  The "p" param
1ed80 65 74 65 72 20 69 73 20 74 68 65 20 70 61 72 74  eter is the part
1ed90 20 6f 66 0a 2a 2a 20 74 68 65 20 46 52 4f 4d 20   of.** the FROM 
1eda0 63 6c 61 75 73 65 20 74 68 61 74 20 68 61 73 20  clause that has 
1edb0 61 6c 72 65 61 64 79 20 62 65 65 6e 20 63 6f 6e  already been con
1edc0 73 74 72 75 63 74 65 64 2e 20 20 22 70 22 20 69  structed.  "p" i
1edd0 73 20 4e 55 4c 4c 0a 2a 2a 20 69 66 20 74 68 69  s NULL.** if thi
1ede0 73 20 69 73 20 74 68 65 20 66 69 72 73 74 20 74  s is the first t
1edf0 65 72 6d 20 6f 66 20 74 68 65 20 46 52 4f 4d 20  erm of the FROM 
1ee00 63 6c 61 75 73 65 2e 20 20 70 54 61 62 6c 65 20  clause.  pTable 
1ee10 61 6e 64 20 70 44 61 74 61 62 61 73 65 0a 2a 2a  and pDatabase.**
1ee20 20 61 72 65 20 74 68 65 20 6e 61 6d 65 20 6f 66   are the name of
1ee30 20 74 68 65 20 74 61 62 6c 65 20 61 6e 64 20 64   the table and d
1ee40 61 74 61 62 61 73 65 20 6e 61 6d 65 64 20 69 6e  atabase named in
1ee50 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
1ee60 20 74 65 72 6d 2e 0a 2a 2a 20 70 44 61 74 61 62   term..** pDatab
1ee70 61 73 65 20 69 73 20 4e 55 4c 4c 20 69 66 20 74  ase is NULL if t
1ee80 68 65 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65  he database name
1ee90 20 71 75 61 6c 69 66 69 65 72 20 69 73 20 6d 69   qualifier is mi
1eea0 73 73 69 6e 67 20 2d 20 74 68 65 0a 2a 2a 20 75  ssing - the.** u
1eeb0 73 75 61 6c 20 63 61 73 65 2e 20 20 49 66 20 74  sual case.  If t
1eec0 68 65 20 74 65 72 6d 20 68 61 73 20 61 6e 20 61  he term has an a
1eed0 6c 69 61 73 2c 20 74 68 65 6e 20 70 41 6c 69 61  lias, then pAlia
1eee0 73 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 0a  s points to the.
1eef0 2a 2a 20 61 6c 69 61 73 20 74 6f 6b 65 6e 2e 20  ** alias token. 
1ef00 20 49 66 20 74 68 65 20 74 65 72 6d 20 69 73 20   If the term is 
1ef10 61 20 73 75 62 71 75 65 72 79 2c 20 74 68 65 6e  a subquery, then
1ef20 20 70 53 75 62 71 75 65 72 79 20 69 73 20 74 68   pSubquery is th
1ef30 65 0a 2a 2a 20 53 45 4c 45 43 54 20 73 74 61 74  e.** SELECT stat
1ef40 65 6d 65 6e 74 20 74 68 61 74 20 74 68 65 20 73  ement that the s
1ef50 75 62 71 75 65 72 79 20 65 6e 63 6f 64 65 73 2e  ubquery encodes.
1ef60 20 20 54 68 65 20 70 54 61 62 6c 65 20 61 6e 64    The pTable and
1ef70 0a 2a 2a 20 70 44 61 74 61 62 61 73 65 20 70 61  .** pDatabase pa
1ef80 72 61 6d 65 74 65 72 73 20 61 72 65 20 4e 55 4c  rameters are NUL
1ef90 4c 20 66 6f 72 20 73 75 62 71 75 65 72 69 65 73  L for subqueries
1efa0 2e 20 20 54 68 65 20 70 4f 6e 20 61 6e 64 20 70  .  The pOn and p
1efb0 55 73 69 6e 67 0a 2a 2a 20 70 61 72 61 6d 65 74  Using.** paramet
1efc0 65 72 73 20 61 72 65 20 74 68 65 20 63 6f 6e 74  ers are the cont
1efd0 65 6e 74 20 6f 66 20 74 68 65 20 4f 4e 20 61 6e  ent of the ON an
1efe0 64 20 55 53 49 4e 47 20 63 6c 61 75 73 65 73 2e  d USING clauses.
1eff0 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  .**.** Return a 
1f000 6e 65 77 20 53 72 63 4c 69 73 74 20 77 68 69 63  new SrcList whic
1f010 68 20 65 6e 63 6f 64 65 73 20 69 73 20 74 68 65  h encodes is the
1f020 20 46 52 4f 4d 20 77 69 74 68 20 74 68 65 20 6e   FROM with the n
1f030 65 77 0a 2a 2a 20 74 65 72 6d 20 61 64 64 65 64  ew.** term added
1f040 2e 0a 2a 2f 0a 53 72 63 4c 69 73 74 20 2a 73 71  ..*/.SrcList *sq
1f050 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70 70 65  lite3SrcListAppe
1f060 6e 64 46 72 6f 6d 54 65 72 6d 28 0a 20 20 50 61  ndFromTerm(.  Pa
1f070 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
1f080 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
1f090 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72   context */.  Sr
1f0a0 63 4c 69 73 74 20 2a 70 2c 20 20 20 20 20 20 20  cList *p,       
1f0b0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6c 65 66        /* The lef
1f0c0 74 20 70 61 72 74 20 6f 66 20 74 68 65 20 46 52  t part of the FR
1f0d0 4f 4d 20 63 6c 61 75 73 65 20 61 6c 72 65 61 64  OM clause alread
1f0e0 79 20 73 65 65 6e 20 2a 2f 0a 20 20 54 6f 6b 65  y seen */.  Toke
1f0f0 6e 20 2a 70 54 61 62 6c 65 2c 20 20 20 20 20 20  n *pTable,      
1f100 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
1f110 68 65 20 74 61 62 6c 65 20 74 6f 20 61 64 64 20  he table to add 
1f120 74 6f 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  to the FROM clau
1f130 73 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  se */.  Token *p
1f140 44 61 74 61 62 61 73 65 2c 20 20 20 20 20 20 20  Database,       
1f150 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64  /* Name of the d
1f160 61 74 61 62 61 73 65 20 63 6f 6e 74 61 69 6e 69  atabase containi
1f170 6e 67 20 70 54 61 62 6c 65 20 2a 2f 0a 20 20 54  ng pTable */.  T
1f180 6f 6b 65 6e 20 2a 70 41 6c 69 61 73 2c 20 20 20  oken *pAlias,   
1f190 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 69         /* The ri
1f1a0 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20 6f 66  ght-hand side of
1f1b0 20 74 68 65 20 41 53 20 73 75 62 65 78 70 72 65   the AS subexpre
1f1c0 73 73 69 6f 6e 20 2a 2f 0a 20 20 53 65 6c 65 63  ssion */.  Selec
1f1d0 74 20 2a 70 53 75 62 71 75 65 72 79 2c 20 20 20  t *pSubquery,   
1f1e0 20 20 20 2f 2a 20 41 20 73 75 62 71 75 65 72 79     /* A subquery
1f1f0 20 75 73 65 64 20 69 6e 20 70 6c 61 63 65 20 6f   used in place o
1f200 66 20 61 20 74 61 62 6c 65 20 6e 61 6d 65 20 2a  f a table name *
1f210 2f 0a 20 20 45 78 70 72 20 2a 70 4f 6e 2c 20 20  /.  Expr *pOn,  
1f220 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1f230 68 65 20 4f 4e 20 63 6c 61 75 73 65 20 6f 66 20  he ON clause of 
1f240 61 20 6a 6f 69 6e 20 2a 2f 0a 20 20 49 64 4c 69  a join */.  IdLi
1f250 73 74 20 2a 70 55 73 69 6e 67 20 20 20 20 20 20  st *pUsing      
1f260 20 20 20 20 2f 2a 20 54 68 65 20 55 53 49 4e 47      /* The USING
1f270 20 63 6c 61 75 73 65 20 6f 66 20 61 20 6a 6f 69   clause of a joi
1f280 6e 20 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74  n */.){.  struct
1f290 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
1f2a0 49 74 65 6d 3b 0a 20 20 73 71 6c 69 74 65 33 20  Item;.  sqlite3 
1f2b0 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
1f2c0 3b 0a 20 20 69 66 28 20 21 70 20 26 26 20 28 70  ;.  if( !p && (p
1f2d0 4f 6e 20 7c 7c 20 70 55 73 69 6e 67 29 20 29 7b  On || pUsing) ){
1f2e0 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
1f2f0 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 61 20  rMsg(pParse, "a 
1f300 4a 4f 49 4e 20 63 6c 61 75 73 65 20 69 73 20 72  JOIN clause is r
1f310 65 71 75 69 72 65 64 20 62 65 66 6f 72 65 20 25  equired before %
1f320 73 22 2c 20 0a 20 20 20 20 20 20 28 70 4f 6e 20  s", .      (pOn 
1f330 3f 20 22 4f 4e 22 20 3a 20 22 55 53 49 4e 47 22  ? "ON" : "USING"
1f340 29 0a 20 20 20 20 29 3b 0a 20 20 20 20 67 6f 74  ).    );.    got
1f350 6f 20 61 70 70 65 6e 64 5f 66 72 6f 6d 5f 65 72  o append_from_er
1f360 72 6f 72 3b 0a 20 20 7d 0a 20 20 70 20 3d 20 73  ror;.  }.  p = s
1f370 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70 70  qlite3SrcListApp
1f380 65 6e 64 28 64 62 2c 20 70 2c 20 70 54 61 62 6c  end(db, p, pTabl
1f390 65 2c 20 70 44 61 74 61 62 61 73 65 29 3b 0a 20  e, pDatabase);. 
1f3a0 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20 4e 45 56   if( p==0 || NEV
1f3b0 45 52 28 70 2d 3e 6e 53 72 63 3d 3d 30 29 20 29  ER(p->nSrc==0) )
1f3c0 7b 0a 20 20 20 20 67 6f 74 6f 20 61 70 70 65 6e  {.    goto appen
1f3d0 64 5f 66 72 6f 6d 5f 65 72 72 6f 72 3b 0a 20 20  d_from_error;.  
1f3e0 7d 0a 20 20 70 49 74 65 6d 20 3d 20 26 70 2d 3e  }.  pItem = &p->
1f3f0 61 5b 70 2d 3e 6e 53 72 63 2d 31 5d 3b 0a 20 20  a[p->nSrc-1];.  
1f400 61 73 73 65 72 74 28 20 70 41 6c 69 61 73 21 3d  assert( pAlias!=
1f410 30 20 29 3b 0a 20 20 69 66 28 20 70 41 6c 69 61  0 );.  if( pAlia
1f420 73 2d 3e 6e 20 29 7b 0a 20 20 20 20 70 49 74 65  s->n ){.    pIte
1f430 6d 2d 3e 7a 41 6c 69 61 73 20 3d 20 73 71 6c 69  m->zAlias = sqli
1f440 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e  te3NameFromToken
1f450 28 64 62 2c 20 70 41 6c 69 61 73 29 3b 0a 20 20  (db, pAlias);.  
1f460 7d 0a 20 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65  }.  pItem->pSele
1f470 63 74 20 3d 20 70 53 75 62 71 75 65 72 79 3b 0a  ct = pSubquery;.
1f480 20 20 70 49 74 65 6d 2d 3e 70 4f 6e 20 3d 20 70    pItem->pOn = p
1f490 4f 6e 3b 0a 20 20 70 49 74 65 6d 2d 3e 70 55 73  On;.  pItem->pUs
1f4a0 69 6e 67 20 3d 20 70 55 73 69 6e 67 3b 0a 20 20  ing = pUsing;.  
1f4b0 72 65 74 75 72 6e 20 70 3b 0a 0a 20 61 70 70 65  return p;.. appe
1f4c0 6e 64 5f 66 72 6f 6d 5f 65 72 72 6f 72 3a 0a 20  nd_from_error:. 
1f4d0 20 61 73 73 65 72 74 28 20 70 3d 3d 30 20 29 3b   assert( p==0 );
1f4e0 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65  .  sqlite3ExprDe
1f4f0 6c 65 74 65 28 64 62 2c 20 70 4f 6e 29 3b 0a 20  lete(db, pOn);. 
1f500 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44 65   sqlite3IdListDe
1f510 6c 65 74 65 28 64 62 2c 20 70 55 73 69 6e 67 29  lete(db, pUsing)
1f520 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63  ;.  sqlite3Selec
1f530 74 44 65 6c 65 74 65 28 64 62 2c 20 70 53 75 62  tDelete(db, pSub
1f540 71 75 65 72 79 29 3b 0a 20 20 72 65 74 75 72 6e  query);.  return
1f550 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64   0;.}../*.** Add
1f560 20 61 6e 20 49 4e 44 45 58 45 44 20 42 59 20 6f   an INDEXED BY o
1f570 72 20 4e 4f 54 20 49 4e 44 45 58 45 44 20 63 6c  r NOT INDEXED cl
1f580 61 75 73 65 20 74 6f 20 74 68 65 20 6d 6f 73 74  ause to the most
1f590 20 72 65 63 65 6e 74 6c 79 20 61 64 64 65 64 20   recently added 
1f5a0 0a 2a 2a 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74  .** element of t
1f5b0 68 65 20 73 6f 75 72 63 65 2d 6c 69 73 74 20 70  he source-list p
1f5c0 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63  assed as the sec
1f5d0 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f  ond argument..*/
1f5e0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53 72 63  .void sqlite3Src
1f5f0 4c 69 73 74 49 6e 64 65 78 65 64 42 79 28 50 61  ListIndexedBy(Pa
1f600 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 72 63  rse *pParse, Src
1f610 4c 69 73 74 20 2a 70 2c 20 54 6f 6b 65 6e 20 2a  List *p, Token *
1f620 70 49 6e 64 65 78 65 64 42 79 29 7b 0a 20 20 61  pIndexedBy){.  a
1f630 73 73 65 72 74 28 20 70 49 6e 64 65 78 65 64 42  ssert( pIndexedB
1f640 79 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 20  y!=0 );.  if( p 
1f650 26 26 20 41 4c 57 41 59 53 28 70 2d 3e 6e 53 72  && ALWAYS(p->nSr
1f660 63 3e 30 29 20 29 7b 0a 20 20 20 20 73 74 72 75  c>0) ){.    stru
1f670 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
1f680 2a 70 49 74 65 6d 20 3d 20 26 70 2d 3e 61 5b 70  *pItem = &p->a[p
1f690 2d 3e 6e 53 72 63 2d 31 5d 3b 0a 20 20 20 20 61  ->nSrc-1];.    a
1f6a0 73 73 65 72 74 28 20 70 49 74 65 6d 2d 3e 66 67  ssert( pItem->fg
1f6b0 2e 6e 6f 74 49 6e 64 65 78 65 64 3d 3d 30 20 29  .notIndexed==0 )
1f6c0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49  ;.    assert( pI
1f6d0 74 65 6d 2d 3e 66 67 2e 69 73 49 6e 64 65 78 65  tem->fg.isIndexe
1f6e0 64 42 79 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73  dBy==0 );.    as
1f6f0 73 65 72 74 28 20 70 49 74 65 6d 2d 3e 66 67 2e  sert( pItem->fg.
1f700 69 73 54 61 62 46 75 6e 63 3d 3d 30 20 29 3b 0a  isTabFunc==0 );.
1f710 20 20 20 20 69 66 28 20 70 49 6e 64 65 78 65 64      if( pIndexed
1f720 42 79 2d 3e 6e 3d 3d 31 20 26 26 20 21 70 49 6e  By->n==1 && !pIn
1f730 64 65 78 65 64 42 79 2d 3e 7a 20 29 7b 0a 20 20  dexedBy->z ){.  
1f740 20 20 20 20 2f 2a 20 41 20 22 4e 4f 54 20 49 4e      /* A "NOT IN
1f750 44 45 58 45 44 22 20 63 6c 61 75 73 65 20 77 61  DEXED" clause wa
1f760 73 20 73 75 70 70 6c 69 65 64 2e 20 53 65 65 20  s supplied. See 
1f770 70 61 72 73 65 2e 79 20 0a 20 20 20 20 20 20 2a  parse.y .      *
1f780 2a 20 63 6f 6e 73 74 72 75 63 74 20 22 69 6e 64  * construct "ind
1f790 65 78 65 64 5f 6f 70 74 22 20 66 6f 72 20 64 65  exed_opt" for de
1f7a0 74 61 69 6c 73 2e 20 2a 2f 0a 20 20 20 20 20 20  tails. */.      
1f7b0 70 49 74 65 6d 2d 3e 66 67 2e 6e 6f 74 49 6e 64  pItem->fg.notInd
1f7c0 65 78 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d 65  exed = 1;.    }e
1f7d0 6c 73 65 7b 0a 20 20 20 20 20 20 70 49 74 65 6d  lse{.      pItem
1f7e0 2d 3e 75 31 2e 7a 49 6e 64 65 78 65 64 42 79 20  ->u1.zIndexedBy 
1f7f0 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f  = sqlite3NameFro
1f800 6d 54 6f 6b 65 6e 28 70 50 61 72 73 65 2d 3e 64  mToken(pParse->d
1f810 62 2c 20 70 49 6e 64 65 78 65 64 42 79 29 3b 0a  b, pIndexedBy);.
1f820 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 66 67 2e        pItem->fg.
1f830 69 73 49 6e 64 65 78 65 64 42 79 20 3d 20 28 70  isIndexedBy = (p
1f840 49 74 65 6d 2d 3e 75 31 2e 7a 49 6e 64 65 78 65  Item->u1.zIndexe
1f850 64 42 79 21 3d 30 29 3b 0a 20 20 20 20 7d 0a 20  dBy!=0);.    }. 
1f860 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20   }.}../*.** Add 
1f870 74 68 65 20 6c 69 73 74 20 6f 66 20 66 75 6e 63  the list of func
1f880 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74 73 20 74  tion arguments t
1f890 6f 20 74 68 65 20 53 72 63 4c 69 73 74 20 65 6e  o the SrcList en
1f8a0 74 72 79 20 66 6f 72 20 61 0a 2a 2a 20 74 61 62  try for a.** tab
1f8b0 6c 65 2d 76 61 6c 75 65 64 2d 66 75 6e 63 74 69  le-valued-functi
1f8c0 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  on..*/.void sqli
1f8d0 74 65 33 53 72 63 4c 69 73 74 46 75 6e 63 41 72  te3SrcListFuncAr
1f8e0 67 73 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  gs(Parse *pParse
1f8f0 2c 20 53 72 63 4c 69 73 74 20 2a 70 2c 20 45 78  , SrcList *p, Ex
1f900 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a  prList *pList){.
1f910 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 73    if( p ){.    s
1f920 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
1f930 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70 2d 3e  em *pItem = &p->
1f940 61 5b 70 2d 3e 6e 53 72 63 2d 31 5d 3b 0a 20 20  a[p->nSrc-1];.  
1f950 20 20 61 73 73 65 72 74 28 20 70 49 74 65 6d 2d    assert( pItem-
1f960 3e 66 67 2e 6e 6f 74 49 6e 64 65 78 65 64 3d 3d  >fg.notIndexed==
1f970 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
1f980 20 70 49 74 65 6d 2d 3e 66 67 2e 69 73 49 6e 64   pItem->fg.isInd
1f990 65 78 65 64 42 79 3d 3d 30 20 29 3b 0a 20 20 20  exedBy==0 );.   
1f9a0 20 61 73 73 65 72 74 28 20 70 49 74 65 6d 2d 3e   assert( pItem->
1f9b0 66 67 2e 69 73 54 61 62 46 75 6e 63 3d 3d 30 20  fg.isTabFunc==0 
1f9c0 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 75 31  );.    pItem->u1
1f9d0 2e 70 46 75 6e 63 41 72 67 20 3d 20 70 4c 69 73  .pFuncArg = pLis
1f9e0 74 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 66 67  t;.    pItem->fg
1f9f0 2e 69 73 54 61 62 46 75 6e 63 20 3d 20 31 3b 0a  .isTabFunc = 1;.
1fa00 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c    }else{.    sql
1fa10 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65  ite3ExprListDele
1fa20 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  te(pParse->db, p
1fa30 4c 69 73 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  List);.  }.}../*
1fa40 0a 2a 2a 20 57 68 65 6e 20 62 75 69 6c 64 69 6e  .** When buildin
1fa50 67 20 75 70 20 61 20 46 52 4f 4d 20 63 6c 61 75  g up a FROM clau
1fa60 73 65 20 69 6e 20 74 68 65 20 70 61 72 73 65 72  se in the parser
1fa70 2c 20 74 68 65 20 6a 6f 69 6e 20 6f 70 65 72 61  , the join opera
1fa80 74 6f 72 0a 2a 2a 20 69 73 20 69 6e 69 74 69 61  tor.** is initia
1fa90 6c 6c 79 20 61 74 74 61 63 68 65 64 20 74 6f 20  lly attached to 
1faa0 74 68 65 20 6c 65 66 74 20 6f 70 65 72 61 6e 64  the left operand
1fab0 2e 20 20 42 75 74 20 74 68 65 20 63 6f 64 65 20  .  But the code 
1fac0 67 65 6e 65 72 61 74 6f 72 0a 2a 2a 20 65 78 70  generator.** exp
1fad0 65 63 74 73 20 74 68 65 20 6a 6f 69 6e 20 6f 70  ects the join op
1fae0 65 72 61 74 6f 72 20 74 6f 20 62 65 20 6f 6e 20  erator to be on 
1faf0 74 68 65 20 72 69 67 68 74 20 6f 70 65 72 61 6e  the right operan
1fb00 64 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  d.  This routine
1fb10 0a 2a 2a 20 53 68 69 66 74 73 20 61 6c 6c 20 6a  .** Shifts all j
1fb20 6f 69 6e 20 6f 70 65 72 61 74 6f 72 73 20 66 72  oin operators fr
1fb30 6f 6d 20 6c 65 66 74 20 74 6f 20 72 69 67 68 74  om left to right
1fb40 20 66 6f 72 20 61 6e 20 65 6e 74 69 72 65 20 46   for an entire F
1fb50 52 4f 4d 0a 2a 2a 20 63 6c 61 75 73 65 2e 0a 2a  ROM.** clause..*
1fb60 2a 0a 2a 2a 20 45 78 61 6d 70 6c 65 3a 20 53 75  *.** Example: Su
1fb70 70 70 6f 73 65 20 74 68 65 20 6a 6f 69 6e 20 69  ppose the join i
1fb80 73 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a  s like this:.**.
1fb90 2a 2a 20 20 20 20 20 20 20 20 20 20 20 41 20 6e  **           A n
1fba0 61 74 75 72 61 6c 20 63 72 6f 73 73 20 6a 6f 69  atural cross joi
1fbb0 6e 20 42 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 70  n B.**.** The op
1fbc0 65 72 61 74 6f 72 20 69 73 20 22 6e 61 74 75 72  erator is "natur
1fbd0 61 6c 20 63 72 6f 73 73 20 6a 6f 69 6e 22 2e 20  al cross join". 
1fbe0 20 54 68 65 20 41 20 61 6e 64 20 42 20 6f 70 65   The A and B ope
1fbf0 72 61 6e 64 73 20 61 72 65 20 73 74 6f 72 65 64  rands are stored
1fc00 0a 2a 2a 20 69 6e 20 70 2d 3e 61 5b 30 5d 20 61  .** in p->a[0] a
1fc10 6e 64 20 70 2d 3e 61 5b 31 5d 2c 20 72 65 73 70  nd p->a[1], resp
1fc20 65 63 74 69 76 65 6c 79 2e 20 20 54 68 65 20 70  ectively.  The p
1fc30 61 72 73 65 72 20 69 6e 69 74 69 61 6c 6c 79 20  arser initially 
1fc40 73 74 6f 72 65 73 20 74 68 65 0a 2a 2a 20 6f 70  stores the.** op
1fc50 65 72 61 74 6f 72 20 77 69 74 68 20 41 2e 20 20  erator with A.  
1fc60 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 68 69  This routine shi
1fc70 66 74 73 20 74 68 61 74 20 6f 70 65 72 61 74 6f  fts that operato
1fc80 72 20 6f 76 65 72 20 74 6f 20 42 2e 0a 2a 2f 0a  r over to B..*/.
1fc90 76 6f 69 64 20 73 71 6c 69 74 65 33 53 72 63 4c  void sqlite3SrcL
1fca0 69 73 74 53 68 69 66 74 4a 6f 69 6e 54 79 70 65  istShiftJoinType
1fcb0 28 53 72 63 4c 69 73 74 20 2a 70 29 7b 0a 20 20  (SrcList *p){.  
1fcc0 69 66 28 20 70 20 29 7b 0a 20 20 20 20 69 6e 74  if( p ){.    int
1fcd0 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 70 2d   i;.    for(i=p-
1fce0 3e 6e 53 72 63 2d 31 3b 20 69 3e 30 3b 20 69 2d  >nSrc-1; i>0; i-
1fcf0 2d 29 7b 0a 20 20 20 20 20 20 70 2d 3e 61 5b 69  -){.      p->a[i
1fd00 5d 2e 66 67 2e 6a 6f 69 6e 74 79 70 65 20 3d 20  ].fg.jointype = 
1fd10 70 2d 3e 61 5b 69 2d 31 5d 2e 66 67 2e 6a 6f 69  p->a[i-1].fg.joi
1fd20 6e 74 79 70 65 3b 0a 20 20 20 20 7d 0a 20 20 20  ntype;.    }.   
1fd30 20 70 2d 3e 61 5b 30 5d 2e 66 67 2e 6a 6f 69 6e   p->a[0].fg.join
1fd40 74 79 70 65 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a  type = 0;.  }.}.
1fd50 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
1fd60 56 44 42 45 20 63 6f 64 65 20 66 6f 72 20 61 20  VDBE code for a 
1fd70 42 45 47 49 4e 20 73 74 61 74 65 6d 65 6e 74 2e  BEGIN statement.
1fd80 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
1fd90 42 65 67 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  BeginTransaction
1fda0 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
1fdb0 69 6e 74 20 74 79 70 65 29 7b 0a 20 20 73 71 6c  int type){.  sql
1fdc0 69 74 65 33 20 2a 64 62 3b 0a 20 20 56 64 62 65  ite3 *db;.  Vdbe
1fdd0 20 2a 76 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20   *v;.  int i;.. 
1fde0 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65 21   assert( pParse!
1fdf0 3d 30 20 29 3b 0a 20 20 64 62 20 3d 20 70 50 61  =0 );.  db = pPa
1fe00 72 73 65 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72  rse->db;.  asser
1fe10 74 28 20 64 62 21 3d 30 20 29 3b 0a 20 20 69 66  t( db!=0 );.  if
1fe20 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65  ( sqlite3AuthChe
1fe30 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54  ck(pParse, SQLIT
1fe40 45 5f 54 52 41 4e 53 41 43 54 49 4f 4e 2c 20 22  E_TRANSACTION, "
1fe50 42 45 47 49 4e 22 2c 20 30 2c 20 30 29 20 29 7b  BEGIN", 0, 0) ){
1fe60 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
1fe70 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65  .  v = sqlite3Ge
1fe80 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
1fe90 20 69 66 28 20 21 76 20 29 20 72 65 74 75 72 6e   if( !v ) return
1fea0 3b 0a 20 20 69 66 28 20 74 79 70 65 21 3d 54 4b  ;.  if( type!=TK
1feb0 5f 44 45 46 45 52 52 45 44 20 29 7b 0a 20 20 20  _DEFERRED ){.   
1fec0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e   for(i=0; i<db->
1fed0 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  nDb; i++){.     
1fee0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1fef0 70 32 28 76 2c 20 4f 50 5f 54 72 61 6e 73 61 63  p2(v, OP_Transac
1ff00 74 69 6f 6e 2c 20 69 2c 20 28 74 79 70 65 3d 3d  tion, i, (type==
1ff10 54 4b 5f 45 58 43 4c 55 53 49 56 45 29 2b 31 29  TK_EXCLUSIVE)+1)
1ff20 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
1ff30 64 62 65 55 73 65 73 42 74 72 65 65 28 76 2c 20  dbeUsesBtree(v, 
1ff40 69 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  i);.    }.  }.  
1ff50 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1ff60 30 28 76 2c 20 4f 50 5f 41 75 74 6f 43 6f 6d 6d  0(v, OP_AutoComm
1ff70 69 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  it);.}../*.** Ge
1ff80 6e 65 72 61 74 65 20 56 44 42 45 20 63 6f 64 65  nerate VDBE code
1ff90 20 66 6f 72 20 61 20 43 4f 4d 4d 49 54 20 73 74   for a COMMIT st
1ffa0 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64  atement..*/.void
1ffb0 20 73 71 6c 69 74 65 33 43 6f 6d 6d 69 74 54 72   sqlite3CommitTr
1ffc0 61 6e 73 61 63 74 69 6f 6e 28 50 61 72 73 65 20  ansaction(Parse 
1ffd0 2a 70 50 61 72 73 65 29 7b 0a 20 20 56 64 62 65  *pParse){.  Vdbe
1ffe0 20 2a 76 3b 0a 0a 20 20 61 73 73 65 72 74 28 20   *v;..  assert( 
1fff0 70 50 61 72 73 65 21 3d 30 20 29 3b 0a 20 20 61  pParse!=0 );.  a
20000 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 64  ssert( pParse->d
20010 62 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 73 71  b!=0 );.  if( sq
20020 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70  lite3AuthCheck(p
20030 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 54 52  Parse, SQLITE_TR
20040 41 4e 53 41 43 54 49 4f 4e 2c 20 22 43 4f 4d 4d  ANSACTION, "COMM
20050 49 54 22 2c 20 30 2c 20 30 29 20 29 7b 0a 20 20  IT", 0, 0) ){.  
20060 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
20070 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
20080 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66  be(pParse);.  if
20090 28 20 76 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ( v ){.    sqlit
200a0 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
200b0 4f 50 5f 41 75 74 6f 43 6f 6d 6d 69 74 2c 20 31  OP_AutoCommit, 1
200c0 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
200d0 47 65 6e 65 72 61 74 65 20 56 44 42 45 20 63 6f  Generate VDBE co
200e0 64 65 20 66 6f 72 20 61 20 52 4f 4c 4c 42 41 43  de for a ROLLBAC
200f0 4b 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a  K statement..*/.
20100 76 6f 69 64 20 73 71 6c 69 74 65 33 52 6f 6c 6c  void sqlite3Roll
20110 62 61 63 6b 54 72 61 6e 73 61 63 74 69 6f 6e 28  backTransaction(
20120 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a  Parse *pParse){.
20130 20 20 56 64 62 65 20 2a 76 3b 0a 0a 20 20 61 73    Vdbe *v;..  as
20140 73 65 72 74 28 20 70 50 61 72 73 65 21 3d 30 20  sert( pParse!=0 
20150 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
20160 72 73 65 2d 3e 64 62 21 3d 30 20 29 3b 0a 20 20  rse->db!=0 );.  
20170 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43  if( sqlite3AuthC
20180 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c  heck(pParse, SQL
20190 49 54 45 5f 54 52 41 4e 53 41 43 54 49 4f 4e 2c  ITE_TRANSACTION,
201a0 20 22 52 4f 4c 4c 42 41 43 4b 22 2c 20 30 2c 20   "ROLLBACK", 0, 
201b0 30 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  0) ){.    return
201c0 3b 0a 20 20 7d 0a 20 20 76 20 3d 20 73 71 6c 69  ;.  }.  v = sqli
201d0 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
201e0 65 29 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a 20  e);.  if( v ){. 
201f0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
20200 64 4f 70 32 28 76 2c 20 4f 50 5f 41 75 74 6f 43  dOp2(v, OP_AutoC
20210 6f 6d 6d 69 74 2c 20 31 2c 20 31 29 3b 0a 20 20  ommit, 1, 1);.  
20220 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  }.}../*.** This 
20230 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
20240 65 64 20 62 79 20 74 68 65 20 70 61 72 73 65 72  ed by the parser
20250 20 77 68 65 6e 20 69 74 20 70 61 72 73 65 73 20   when it parses 
20260 61 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 63 72 65  a command to cre
20270 61 74 65 2c 0a 2a 2a 20 72 65 6c 65 61 73 65 20  ate,.** release 
20280 6f 72 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 20 53  or rollback an S
20290 51 4c 20 73 61 76 65 70 6f 69 6e 74 2e 20 0a 2a  QL savepoint. .*
202a0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53 61  /.void sqlite3Sa
202b0 76 65 70 6f 69 6e 74 28 50 61 72 73 65 20 2a 70  vepoint(Parse *p
202c0 50 61 72 73 65 2c 20 69 6e 74 20 6f 70 2c 20 54  Parse, int op, T
202d0 6f 6b 65 6e 20 2a 70 4e 61 6d 65 29 7b 0a 20 20  oken *pName){.  
202e0 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 73 71  char *zName = sq
202f0 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b  lite3NameFromTok
20300 65 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  en(pParse->db, p
20310 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a 4e 61  Name);.  if( zNa
20320 6d 65 20 29 7b 0a 20 20 20 20 56 64 62 65 20 2a  me ){.    Vdbe *
20330 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
20340 62 65 28 70 50 61 72 73 65 29 3b 0a 23 69 66 6e  be(pParse);.#ifn
20350 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
20360 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20  AUTHORIZATION.  
20370 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63    static const c
20380 68 61 72 20 2a 20 63 6f 6e 73 74 20 61 7a 5b 5d  har * const az[]
20390 20 3d 20 7b 20 22 42 45 47 49 4e 22 2c 20 22 52   = { "BEGIN", "R
203a0 45 4c 45 41 53 45 22 2c 20 22 52 4f 4c 4c 42 41  ELEASE", "ROLLBA
203b0 43 4b 22 20 7d 3b 0a 20 20 20 20 61 73 73 65 72  CK" };.    asser
203c0 74 28 20 21 53 41 56 45 50 4f 49 4e 54 5f 42 45  t( !SAVEPOINT_BE
203d0 47 49 4e 20 26 26 20 53 41 56 45 50 4f 49 4e 54  GIN && SAVEPOINT
203e0 5f 52 45 4c 45 41 53 45 3d 3d 31 20 26 26 20 53  _RELEASE==1 && S
203f0 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43  AVEPOINT_ROLLBAC
20400 4b 3d 3d 32 20 29 3b 0a 23 65 6e 64 69 66 0a 20  K==2 );.#endif. 
20410 20 20 20 69 66 28 20 21 76 20 7c 7c 20 73 71 6c     if( !v || sql
20420 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50  ite3AuthCheck(pP
20430 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 53 41 56  arse, SQLITE_SAV
20440 45 50 4f 49 4e 54 2c 20 61 7a 5b 6f 70 5d 2c 20  EPOINT, az[op], 
20450 7a 4e 61 6d 65 2c 20 30 29 20 29 7b 0a 20 20 20  zName, 0) ){.   
20460 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
20470 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 7a 4e 61  (pParse->db, zNa
20480 6d 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  me);.      retur
20490 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  n;.    }.    sql
204a0 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
204b0 2c 20 4f 50 5f 53 61 76 65 70 6f 69 6e 74 2c 20  , OP_Savepoint, 
204c0 6f 70 2c 20 30 2c 20 30 2c 20 7a 4e 61 6d 65 2c  op, 0, 0, zName,
204d0 20 50 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20   P4_DYNAMIC);.  
204e0 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20  }.}../*.** Make 
204f0 73 75 72 65 20 74 68 65 20 54 45 4d 50 20 64 61  sure the TEMP da
20500 74 61 62 61 73 65 20 69 73 20 6f 70 65 6e 20 61  tabase is open a
20510 6e 64 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72  nd available for
20520 20 75 73 65 2e 20 20 52 65 74 75 72 6e 0a 2a 2a   use.  Return.**
20530 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65   the number of e
20540 72 72 6f 72 73 2e 20 20 4c 65 61 76 65 20 61 6e  rrors.  Leave an
20550 79 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73  y error messages
20560 20 69 6e 20 74 68 65 20 70 50 61 72 73 65 20 73   in the pParse s
20570 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 69 6e 74  tructure..*/.int
20580 20 73 71 6c 69 74 65 33 4f 70 65 6e 54 65 6d 70   sqlite3OpenTemp
20590 44 61 74 61 62 61 73 65 28 50 61 72 73 65 20 2a  Database(Parse *
205a0 70 50 61 72 73 65 29 7b 0a 20 20 73 71 6c 69 74  pParse){.  sqlit
205b0 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
205c0 3e 64 62 3b 0a 20 20 69 66 28 20 64 62 2d 3e 61  >db;.  if( db->a
205d0 44 62 5b 31 5d 2e 70 42 74 3d 3d 30 20 26 26 20  Db[1].pBt==0 && 
205e0 21 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e  !pParse->explain
205f0 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a   ){.    int rc;.
20600 20 20 20 20 42 74 72 65 65 20 2a 70 42 74 3b 0a      Btree *pBt;.
20610 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74      static const
20620 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 0a 20 20   int flags = .  
20630 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f          SQLITE_O
20640 50 45 4e 5f 52 45 41 44 57 52 49 54 45 20 7c 0a  PEN_READWRITE |.
20650 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
20660 5f 4f 50 45 4e 5f 43 52 45 41 54 45 20 7c 0a 20  _OPEN_CREATE |. 
20670 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
20680 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 20 7c  OPEN_EXCLUSIVE |
20690 0a 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54  .          SQLIT
206a0 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43  E_OPEN_DELETEONC
206b0 4c 4f 53 45 20 7c 0a 20 20 20 20 20 20 20 20 20  LOSE |.         
206c0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d   SQLITE_OPEN_TEM
206d0 50 5f 44 42 3b 0a 0a 20 20 20 20 72 63 20 3d 20  P_DB;..    rc = 
206e0 73 71 6c 69 74 65 33 42 74 72 65 65 4f 70 65 6e  sqlite3BtreeOpen
206f0 28 64 62 2d 3e 70 56 66 73 2c 20 30 2c 20 64 62  (db->pVfs, 0, db
20700 2c 20 26 70 42 74 2c 20 30 2c 20 66 6c 61 67 73  , &pBt, 0, flags
20710 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
20720 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
20730 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
20740 67 28 70 50 61 72 73 65 2c 20 22 75 6e 61 62 6c  g(pParse, "unabl
20750 65 20 74 6f 20 6f 70 65 6e 20 61 20 74 65 6d 70  e to open a temp
20760 6f 72 61 72 79 20 64 61 74 61 62 61 73 65 20 22  orary database "
20770 0a 20 20 20 20 20 20 20 20 22 66 69 6c 65 20 66  .        "file f
20780 6f 72 20 73 74 6f 72 69 6e 67 20 74 65 6d 70 6f  or storing tempo
20790 72 61 72 79 20 74 61 62 6c 65 73 22 29 3b 0a 20  rary tables");. 
207a0 20 20 20 20 20 70 50 61 72 73 65 2d 3e 72 63 20       pParse->rc 
207b0 3d 20 72 63 3b 0a 20 20 20 20 20 20 72 65 74 75  = rc;.      retu
207c0 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 1;.    }.    
207d0 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 42 74 20 3d  db->aDb[1].pBt =
207e0 20 70 42 74 3b 0a 20 20 20 20 61 73 73 65 72 74   pBt;.    assert
207f0 28 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 53 63  ( db->aDb[1].pSc
20800 68 65 6d 61 20 29 3b 0a 20 20 20 20 69 66 28 20  hema );.    if( 
20810 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3d 3d 73 71  SQLITE_NOMEM==sq
20820 6c 69 74 65 33 42 74 72 65 65 53 65 74 50 61 67  lite3BtreeSetPag
20830 65 53 69 7a 65 28 70 42 74 2c 20 64 62 2d 3e 6e  eSize(pBt, db->n
20840 65 78 74 50 61 67 65 73 69 7a 65 2c 20 2d 31 2c  extPagesize, -1,
20850 20 30 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c   0) ){.      sql
20860 69 74 65 33 4f 6f 6d 46 61 75 6c 74 28 64 62 29  ite3OomFault(db)
20870 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31  ;.      return 1
20880 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
20890 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
208a0 20 52 65 63 6f 72 64 20 74 68 65 20 66 61 63 74   Record the fact
208b0 20 74 68 61 74 20 74 68 65 20 73 63 68 65 6d 61   that the schema
208c0 20 63 6f 6f 6b 69 65 20 77 69 6c 6c 20 6e 65 65   cookie will nee
208d0 64 20 74 6f 20 62 65 20 76 65 72 69 66 69 65 64  d to be verified
208e0 0a 2a 2a 20 66 6f 72 20 64 61 74 61 62 61 73 65  .** for database
208f0 20 69 44 62 2e 20 20 54 68 65 20 63 6f 64 65 20   iDb.  The code 
20900 74 6f 20 61 63 74 75 61 6c 6c 79 20 76 65 72 69  to actually veri
20910 66 79 20 74 68 65 20 73 63 68 65 6d 61 20 63 6f  fy the schema co
20920 6f 6b 69 65 0a 2a 2a 20 77 69 6c 6c 20 6f 63 63  okie.** will occ
20930 75 72 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66  ur at the end of
20940 20 74 68 65 20 74 6f 70 2d 6c 65 76 65 6c 20 56   the top-level V
20950 44 42 45 20 61 6e 64 20 77 69 6c 6c 20 62 65 20  DBE and will be 
20960 67 65 6e 65 72 61 74 65 64 0a 2a 2a 20 6c 61 74  generated.** lat
20970 65 72 2c 20 62 79 20 73 71 6c 69 74 65 33 46 69  er, by sqlite3Fi
20980 6e 69 73 68 43 6f 64 69 6e 67 28 29 2e 0a 2a 2f  nishCoding()..*/
20990 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 6f 64  .void sqlite3Cod
209a0 65 56 65 72 69 66 79 53 63 68 65 6d 61 28 50 61  eVerifySchema(Pa
209b0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74  rse *pParse, int
209c0 20 69 44 62 29 7b 0a 20 20 50 61 72 73 65 20 2a   iDb){.  Parse *
209d0 70 54 6f 70 6c 65 76 65 6c 20 3d 20 73 71 6c 69  pToplevel = sqli
209e0 74 65 33 50 61 72 73 65 54 6f 70 6c 65 76 65 6c  te3ParseToplevel
209f0 28 70 50 61 72 73 65 29 3b 0a 20 20 73 71 6c 69  (pParse);.  sqli
20a00 74 65 33 20 2a 64 62 20 3d 20 70 54 6f 70 6c 65  te3 *db = pTople
20a10 76 65 6c 2d 3e 64 62 3b 0a 0a 20 20 61 73 73 65  vel->db;..  asse
20a20 72 74 28 20 69 44 62 3e 3d 30 20 26 26 20 69 44  rt( iDb>=0 && iD
20a30 62 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 61  b<db->nDb );.  a
20a40 73 73 65 72 74 28 20 64 62 2d 3e 61 44 62 5b 69  ssert( db->aDb[i
20a50 44 62 5d 2e 70 42 74 21 3d 30 20 7c 7c 20 69 44  Db].pBt!=0 || iD
20a60 62 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74  b==1 );.  assert
20a70 28 20 69 44 62 3c 53 51 4c 49 54 45 5f 4d 41 58  ( iDb<SQLITE_MAX
20a80 5f 41 54 54 41 43 48 45 44 2b 32 20 29 3b 0a 20  _ATTACHED+2 );. 
20a90 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
20aa0 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28  SchemaMutexHeld(
20ab0 64 62 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a 20  db, iDb, 0) );. 
20ac0 20 69 66 28 20 44 62 4d 61 73 6b 54 65 73 74 28   if( DbMaskTest(
20ad0 70 54 6f 70 6c 65 76 65 6c 2d 3e 63 6f 6f 6b 69  pToplevel->cooki
20ae0 65 4d 61 73 6b 2c 20 69 44 62 29 3d 3d 30 20 29  eMask, iDb)==0 )
20af0 7b 0a 20 20 20 20 44 62 4d 61 73 6b 53 65 74 28  {.    DbMaskSet(
20b00 70 54 6f 70 6c 65 76 65 6c 2d 3e 63 6f 6f 6b 69  pToplevel->cooki
20b10 65 4d 61 73 6b 2c 20 69 44 62 29 3b 0a 20 20 20  eMask, iDb);.   
20b20 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 63 6f 6f 6b   pToplevel->cook
20b30 69 65 56 61 6c 75 65 5b 69 44 62 5d 20 3d 20 64  ieValue[iDb] = d
20b40 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53 63 68  b->aDb[iDb].pSch
20b50 65 6d 61 2d 3e 73 63 68 65 6d 61 5f 63 6f 6f 6b  ema->schema_cook
20b60 69 65 3b 0a 20 20 20 20 69 66 28 20 21 4f 4d 49  ie;.    if( !OMI
20b70 54 5f 54 45 4d 50 44 42 20 26 26 20 69 44 62 3d  T_TEMPDB && iDb=
20b80 3d 31 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =1 ){.      sqli
20b90 74 65 33 4f 70 65 6e 54 65 6d 70 44 61 74 61 62  te3OpenTempDatab
20ba0 61 73 65 28 70 54 6f 70 6c 65 76 65 6c 29 3b 0a  ase(pToplevel);.
20bb0 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
20bc0 2a 2a 20 49 66 20 61 72 67 75 6d 65 6e 74 20 7a  ** If argument z
20bd0 44 62 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e  Db is NULL, then
20be0 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 43 6f 64   call sqlite3Cod
20bf0 65 56 65 72 69 66 79 53 63 68 65 6d 61 28 29 20  eVerifySchema() 
20c00 66 6f 72 20 65 61 63 68 20 0a 2a 2a 20 61 74 74  for each .** att
20c10 61 63 68 65 64 20 64 61 74 61 62 61 73 65 2e 20  ached database. 
20c20 4f 74 68 65 72 77 69 73 65 2c 20 69 6e 76 6f 6b  Otherwise, invok
20c30 65 20 69 74 20 66 6f 72 20 74 68 65 20 64 61 74  e it for the dat
20c40 61 62 61 73 65 20 6e 61 6d 65 64 20 7a 44 62 20  abase named zDb 
20c50 6f 6e 6c 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  only..*/.void sq
20c60 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66 79 4e  lite3CodeVerifyN
20c70 61 6d 65 64 53 63 68 65 6d 61 28 50 61 72 73 65  amedSchema(Parse
20c80 20 2a 70 50 61 72 73 65 2c 20 63 6f 6e 73 74 20   *pParse, const 
20c90 63 68 61 72 20 2a 7a 44 62 29 7b 0a 20 20 73 71  char *zDb){.  sq
20ca0 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
20cb0 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 69 3b  se->db;.  int i;
20cc0 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62  .  for(i=0; i<db
20cd0 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nDb; i++){.   
20ce0 20 44 62 20 2a 70 44 62 20 3d 20 26 64 62 2d 3e   Db *pDb = &db->
20cf0 61 44 62 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20  aDb[i];.    if( 
20d00 70 44 62 2d 3e 70 42 74 20 26 26 20 28 21 7a 44  pDb->pBt && (!zD
20d10 62 20 7c 7c 20 30 3d 3d 73 71 6c 69 74 65 33 53  b || 0==sqlite3S
20d20 74 72 49 43 6d 70 28 7a 44 62 2c 20 70 44 62 2d  trICmp(zDb, pDb-
20d30 3e 7a 4e 61 6d 65 29 29 20 29 7b 0a 20 20 20 20  >zName)) ){.    
20d40 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72    sqlite3CodeVer
20d50 69 66 79 53 63 68 65 6d 61 28 70 50 61 72 73 65  ifySchema(pParse
20d60 2c 20 69 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  , i);.    }.  }.
20d70 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
20d80 65 20 56 44 42 45 20 63 6f 64 65 20 74 68 61 74  e VDBE code that
20d90 20 70 72 65 70 61 72 65 73 20 66 6f 72 20 64 6f   prepares for do
20da0 69 6e 67 20 61 6e 20 6f 70 65 72 61 74 69 6f 6e  ing an operation
20db0 20 74 68 61 74 0a 2a 2a 20 6d 69 67 68 74 20 63   that.** might c
20dc0 68 61 6e 67 65 20 74 68 65 20 64 61 74 61 62 61  hange the databa
20dd0 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  se..**.** This r
20de0 6f 75 74 69 6e 65 20 73 74 61 72 74 73 20 61 20  outine starts a 
20df0 6e 65 77 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  new transaction 
20e00 69 66 20 77 65 20 61 72 65 20 6e 6f 74 20 61 6c  if we are not al
20e10 72 65 61 64 79 20 77 69 74 68 69 6e 0a 2a 2a 20  ready within.** 
20e20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20  a transaction.  
20e30 49 66 20 77 65 20 61 72 65 20 61 6c 72 65 61 64  If we are alread
20e40 79 20 77 69 74 68 69 6e 20 61 20 74 72 61 6e 73  y within a trans
20e50 61 63 74 69 6f 6e 2c 20 74 68 65 6e 20 61 20 63  action, then a c
20e60 68 65 63 6b 70 6f 69 6e 74 0a 2a 2a 20 69 73 20  heckpoint.** is 
20e70 73 65 74 20 69 66 20 74 68 65 20 73 65 74 53 74  set if the setSt
20e80 61 74 65 6d 65 6e 74 20 70 61 72 61 6d 65 74 65  atement paramete
20e90 72 20 69 73 20 74 72 75 65 2e 20 20 41 20 63 68  r is true.  A ch
20ea0 65 63 6b 70 6f 69 6e 74 20 73 68 6f 75 6c 64 0a  eckpoint should.
20eb0 2a 2a 20 62 65 20 73 65 74 20 66 6f 72 20 6f 70  ** be set for op
20ec0 65 72 61 74 69 6f 6e 73 20 74 68 61 74 20 6d 69  erations that mi
20ed0 67 68 74 20 66 61 69 6c 20 28 64 75 65 20 74 6f  ght fail (due to
20ee0 20 61 20 63 6f 6e 73 74 72 61 69 6e 74 29 20 70   a constraint) p
20ef0 61 72 74 20 6f 66 0a 2a 2a 20 74 68 65 20 77 61  art of.** the wa
20f00 79 20 74 68 72 6f 75 67 68 20 61 6e 64 20 77 68  y through and wh
20f10 69 63 68 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f  ich will need to
20f20 20 75 6e 64 6f 20 73 6f 6d 65 20 77 72 69 74 65   undo some write
20f30 73 20 77 69 74 68 6f 75 74 20 68 61 76 69 6e 67  s without having
20f40 20 74 6f 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20   to.** rollback 
20f50 74 68 65 20 77 68 6f 6c 65 20 74 72 61 6e 73 61  the whole transa
20f60 63 74 69 6f 6e 2e 20 20 46 6f 72 20 6f 70 65 72  ction.  For oper
20f70 61 74 69 6f 6e 73 20 77 68 65 72 65 20 61 6c 6c  ations where all
20f80 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a 2a 2a 20   constraints.** 
20f90 63 61 6e 20 62 65 20 63 68 65 63 6b 65 64 20 62  can be checked b
20fa0 65 66 6f 72 65 20 61 6e 79 20 63 68 61 6e 67 65  efore any change
20fb0 73 20 61 72 65 20 6d 61 64 65 20 74 6f 20 74 68  s are made to th
20fc0 65 20 64 61 74 61 62 61 73 65 2c 20 69 74 20 69  e database, it i
20fd0 73 20 6e 65 76 65 72 0a 2a 2a 20 6e 65 63 65 73  s never.** neces
20fe0 73 61 72 79 20 74 6f 20 75 6e 64 6f 20 61 20 77  sary to undo a w
20ff0 72 69 74 65 20 61 6e 64 20 74 68 65 20 63 68 65  rite and the che
21000 63 6b 70 6f 69 6e 74 20 73 68 6f 75 6c 64 20 6e  ckpoint should n
21010 6f 74 20 62 65 20 73 65 74 2e 0a 2a 2f 0a 76 6f  ot be set..*/.vo
21020 69 64 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57  id sqlite3BeginW
21030 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 50 61  riteOperation(Pa
21040 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74  rse *pParse, int
21050 20 73 65 74 53 74 61 74 65 6d 65 6e 74 2c 20 69   setStatement, i
21060 6e 74 20 69 44 62 29 7b 0a 20 20 50 61 72 73 65  nt iDb){.  Parse
21070 20 2a 70 54 6f 70 6c 65 76 65 6c 20 3d 20 73 71   *pToplevel = sq
21080 6c 69 74 65 33 50 61 72 73 65 54 6f 70 6c 65 76  lite3ParseToplev
21090 65 6c 28 70 50 61 72 73 65 29 3b 0a 20 20 73 71  el(pParse);.  sq
210a0 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66 79 53  lite3CodeVerifyS
210b0 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20 69 44  chema(pParse, iD
210c0 62 29 3b 0a 20 20 44 62 4d 61 73 6b 53 65 74 28  b);.  DbMaskSet(
210d0 70 54 6f 70 6c 65 76 65 6c 2d 3e 77 72 69 74 65  pToplevel->write
210e0 4d 61 73 6b 2c 20 69 44 62 29 3b 0a 20 20 70 54  Mask, iDb);.  pT
210f0 6f 70 6c 65 76 65 6c 2d 3e 69 73 4d 75 6c 74 69  oplevel->isMulti
21100 57 72 69 74 65 20 7c 3d 20 73 65 74 53 74 61 74  Write |= setStat
21110 65 6d 65 6e 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ement;.}../*.** 
21120 49 6e 64 69 63 61 74 65 20 74 68 61 74 20 74 68  Indicate that th
21130 65 20 73 74 61 74 65 6d 65 6e 74 20 63 75 72 72  e statement curr
21140 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73  ently under cons
21150 74 72 75 63 74 69 6f 6e 20 6d 69 67 68 74 20 77  truction might w
21160 72 69 74 65 0a 2a 2a 20 6d 6f 72 65 20 74 68 61  rite.** more tha
21170 6e 20 6f 6e 65 20 65 6e 74 72 79 20 28 65 78 61  n one entry (exa
21180 6d 70 6c 65 3a 20 64 65 6c 65 74 69 6e 67 20 6f  mple: deleting o
21190 6e 65 20 72 6f 77 20 74 68 65 6e 20 69 6e 73 65  ne row then inse
211a0 72 74 69 6e 67 20 61 6e 6f 74 68 65 72 2c 0a 2a  rting another,.*
211b0 2a 20 69 6e 73 65 72 74 69 6e 67 20 6d 75 6c 74  * inserting mult
211c0 69 70 6c 65 20 72 6f 77 73 20 69 6e 20 61 20 74  iple rows in a t
211d0 61 62 6c 65 2c 20 6f 72 20 69 6e 73 65 72 74 69  able, or inserti
211e0 6e 67 20 61 20 72 6f 77 20 61 6e 64 20 69 6e 64  ng a row and ind
211f0 65 78 20 65 6e 74 72 69 65 73 2e 29 0a 2a 2a 20  ex entries.).** 
21200 49 66 20 61 6e 20 61 62 6f 72 74 20 6f 63 63 75  If an abort occu
21210 72 73 20 61 66 74 65 72 20 73 6f 6d 65 20 6f 66  rs after some of
21220 20 74 68 65 73 65 20 77 72 69 74 65 73 20 68 61   these writes ha
21230 76 65 20 63 6f 6d 70 6c 65 74 65 64 2c 20 74 68  ve completed, th
21240 65 6e 20 69 74 20 77 69 6c 6c 0a 2a 2a 20 62 65  en it will.** be
21250 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 75 6e   necessary to un
21260 64 6f 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 64  do the completed
21270 20 77 72 69 74 65 73 2e 0a 2a 2f 0a 76 6f 69 64   writes..*/.void
21280 20 73 71 6c 69 74 65 33 4d 75 6c 74 69 57 72 69   sqlite3MultiWri
21290 74 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  te(Parse *pParse
212a0 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 54 6f 70  ){.  Parse *pTop
212b0 6c 65 76 65 6c 20 3d 20 73 71 6c 69 74 65 33 50  level = sqlite3P
212c0 61 72 73 65 54 6f 70 6c 65 76 65 6c 28 70 50 61  arseToplevel(pPa
212d0 72 73 65 29 3b 0a 20 20 70 54 6f 70 6c 65 76 65  rse);.  pTopleve
212e0 6c 2d 3e 69 73 4d 75 6c 74 69 57 72 69 74 65 20  l->isMultiWrite 
212f0 3d 20 31 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 54  = 1;.}../* .** T
21300 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74 6f  he code generato
21310 72 20 63 61 6c 6c 73 20 74 68 69 73 20 72 6f 75  r calls this rou
21320 74 69 6e 65 20 69 66 20 69 73 20 64 69 73 63 6f  tine if is disco
21330 76 65 72 73 20 74 68 61 74 20 69 74 20 69 73 0a  vers that it is.
21340 2a 2a 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 61  ** possible to a
21350 62 6f 72 74 20 61 20 73 74 61 74 65 6d 65 6e 74  bort a statement
21360 20 70 72 69 6f 72 20 74 6f 20 63 6f 6d 70 6c 65   prior to comple
21370 74 69 6f 6e 2e 20 20 49 6e 20 6f 72 64 65 72 20  tion.  In order 
21380 74 6f 20 0a 2a 2a 20 70 65 72 66 6f 72 6d 20 74  to .** perform t
21390 68 69 73 20 61 62 6f 72 74 20 77 69 74 68 6f 75  his abort withou
213a0 74 20 63 6f 72 72 75 70 74 69 6e 67 20 74 68 65  t corrupting the
213b0 20 64 61 74 61 62 61 73 65 2c 20 77 65 20 6e 65   database, we ne
213c0 65 64 20 74 6f 20 6d 61 6b 65 0a 2a 2a 20 73 75  ed to make.** su
213d0 72 65 20 74 68 61 74 20 74 68 65 20 73 74 61 74  re that the stat
213e0 65 6d 65 6e 74 20 69 73 20 70 72 6f 74 65 63 74  ement is protect
213f0 65 64 20 62 79 20 61 20 73 74 61 74 65 6d 65 6e  ed by a statemen
21400 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a  t transaction..*
21410 2a 0a 2a 2a 20 54 65 63 68 6e 69 63 61 6c 6c 79  *.** Technically
21420 2c 20 77 65 20 6f 6e 6c 79 20 6e 65 65 64 20 74  , we only need t
21430 6f 20 73 65 74 20 74 68 65 20 6d 61 79 41 62 6f  o set the mayAbo
21440 72 74 20 66 6c 61 67 20 69 66 20 74 68 65 0a 2a  rt flag if the.*
21450 2a 20 69 73 4d 75 6c 74 69 57 72 69 74 65 20 66  * isMultiWrite f
21460 6c 61 67 20 77 61 73 20 70 72 65 76 69 6f 75 73  lag was previous
21470 6c 79 20 73 65 74 2e 20 20 54 68 65 72 65 20 69  ly set.  There i
21480 73 20 61 20 74 69 6d 65 20 64 65 70 65 6e 64 65  s a time depende
21490 6e 63 79 0a 2a 2a 20 73 75 63 68 20 74 68 61 74  ncy.** such that
214a0 20 74 68 65 20 61 62 6f 72 74 20 6d 75 73 74 20   the abort must 
214b0 6f 63 63 75 72 20 61 66 74 65 72 20 74 68 65 20  occur after the 
214c0 6d 75 6c 74 69 77 72 69 74 65 2e 20 20 54 68 69  multiwrite.  Thi
214d0 73 20 6d 61 6b 65 73 0a 2a 2a 20 73 6f 6d 65 20  s makes.** some 
214e0 73 74 61 74 65 6d 65 6e 74 73 20 69 6e 76 6f 6c  statements invol
214f0 76 69 6e 67 20 74 68 65 20 52 45 50 4c 41 43 45  ving the REPLACE
21500 20 63 6f 6e 66 6c 69 63 74 20 72 65 73 6f 6c 75   conflict resolu
21510 74 69 6f 6e 20 61 6c 67 6f 72 69 74 68 6d 0a 2a  tion algorithm.*
21520 2a 20 67 6f 20 61 20 6c 69 74 74 6c 65 20 66 61  * go a little fa
21530 73 74 65 72 2e 20 20 42 75 74 20 74 61 6b 69 6e  ster.  But takin
21540 67 20 61 64 76 61 6e 74 61 67 65 20 6f 66 20 74  g advantage of t
21550 68 69 73 20 74 69 6d 65 20 64 65 70 65 6e 64 65  his time depende
21560 6e 63 79 0a 2a 2a 20 6d 61 6b 65 73 20 69 74 20  ncy.** makes it 
21570 6d 6f 72 65 20 64 69 66 66 69 63 75 6c 74 20 74  more difficult t
21580 6f 20 70 72 6f 76 65 20 74 68 61 74 20 74 68 65  o prove that the
21590 20 63 6f 64 65 20 69 73 20 63 6f 72 72 65 63 74   code is correct
215a0 20 28 69 6e 20 0a 2a 2a 20 70 61 72 74 69 63 75   (in .** particu
215b0 6c 61 72 2c 20 69 74 20 70 72 65 76 65 6e 74 73  lar, it prevents
215c0 20 75 73 20 66 72 6f 6d 20 77 72 69 74 69 6e 67   us from writing
215d0 20 61 6e 20 65 66 66 65 63 74 69 76 65 0a 2a 2a   an effective.**
215e0 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
215f0 6f 66 20 73 71 6c 69 74 65 33 41 73 73 65 72 74  of sqlite3Assert
21600 4d 61 79 41 62 6f 72 74 28 29 29 20 61 6e 64 20  MayAbort()) and 
21610 73 6f 20 77 65 20 68 61 76 65 20 63 68 6f 73 65  so we have chose
21620 6e 0a 2a 2a 20 74 6f 20 74 61 6b 65 20 74 68 65  n.** to take the
21630 20 73 61 66 65 20 72 6f 75 74 65 20 61 6e 64 20   safe route and 
21640 73 6b 69 70 20 74 68 65 20 6f 70 74 69 6d 69 7a  skip the optimiz
21650 61 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ation..*/.void s
21660 71 6c 69 74 65 33 4d 61 79 41 62 6f 72 74 28 50  qlite3MayAbort(P
21670 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20  arse *pParse){. 
21680 20 50 61 72 73 65 20 2a 70 54 6f 70 6c 65 76 65   Parse *pTopleve
21690 6c 20 3d 20 73 71 6c 69 74 65 33 50 61 72 73 65  l = sqlite3Parse
216a0 54 6f 70 6c 65 76 65 6c 28 70 50 61 72 73 65 29  Toplevel(pParse)
216b0 3b 0a 20 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 6d  ;.  pToplevel->m
216c0 61 79 41 62 6f 72 74 20 3d 20 31 3b 0a 7d 0a 0a  ayAbort = 1;.}..
216d0 2f 2a 0a 2a 2a 20 43 6f 64 65 20 61 6e 20 4f 50  /*.** Code an OP
216e0 5f 48 61 6c 74 20 74 68 61 74 20 63 61 75 73 65  _Halt that cause
216f0 73 20 74 68 65 20 76 64 62 65 20 74 6f 20 72 65  s the vdbe to re
21700 74 75 72 6e 20 61 6e 20 53 51 4c 49 54 45 5f 43  turn an SQLITE_C
21710 4f 4e 53 54 52 41 49 4e 54 0a 2a 2a 20 65 72 72  ONSTRAINT.** err
21720 6f 72 2e 20 54 68 65 20 6f 6e 45 72 72 6f 72 20  or. The onError 
21730 70 61 72 61 6d 65 74 65 72 20 64 65 74 65 72 6d  parameter determ
21740 69 6e 65 73 20 77 68 69 63 68 20 28 69 66 20 61  ines which (if a
21750 6e 79 29 20 6f 66 20 74 68 65 20 73 74 61 74 65  ny) of the state
21760 6d 65 6e 74 0a 2a 2a 20 61 6e 64 2f 6f 72 20 63  ment.** and/or c
21770 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69  urrent transacti
21780 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63  on is rolled bac
21790 6b 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  k..*/.void sqlit
217a0 65 33 48 61 6c 74 43 6f 6e 73 74 72 61 69 6e 74  e3HaltConstraint
217b0 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
217c0 65 2c 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67  e,    /* Parsing
217d0 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e   context */.  in
217e0 74 20 65 72 72 43 6f 64 65 2c 20 20 20 20 20 20  t errCode,      
217f0 2f 2a 20 65 78 74 65 6e 64 65 64 20 65 72 72 6f  /* extended erro
21800 72 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20  r code */.  int 
21810 6f 6e 45 72 72 6f 72 2c 20 20 20 20 20 20 2f 2a  onError,      /*
21820 20 43 6f 6e 73 74 72 61 69 6e 74 20 74 79 70 65   Constraint type
21830 20 2a 2f 0a 20 20 63 68 61 72 20 2a 70 34 2c 20   */.  char *p4, 
21840 20 20 20 20 20 20 20 20 2f 2a 20 45 72 72 6f 72          /* Error
21850 20 6d 65 73 73 61 67 65 20 2a 2f 0a 20 20 69 38   message */.  i8
21860 20 70 34 74 79 70 65 2c 20 20 20 20 20 20 20 20   p4type,        
21870 2f 2a 20 50 34 5f 53 54 41 54 49 43 20 6f 72 20  /* P4_STATIC or 
21880 50 34 5f 54 52 41 4e 53 49 45 4e 54 20 2a 2f 0a  P4_TRANSIENT */.
21890 20 20 75 38 20 70 35 45 72 72 6d 73 67 20 20 20    u8 p5Errmsg   
218a0 20 20 20 20 2f 2a 20 50 35 5f 45 72 72 4d 73 67      /* P5_ErrMsg
218b0 20 74 79 70 65 20 2a 2f 0a 29 7b 0a 20 20 56 64   type */.){.  Vd
218c0 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47  be *v = sqlite3G
218d0 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
218e0 20 20 61 73 73 65 72 74 28 20 28 65 72 72 43 6f    assert( (errCo
218f0 64 65 26 30 78 66 66 29 3d 3d 53 51 4c 49 54 45  de&0xff)==SQLITE
21900 5f 43 4f 4e 53 54 52 41 49 4e 54 20 29 3b 0a 20  _CONSTRAINT );. 
21910 20 69 66 28 20 6f 6e 45 72 72 6f 72 3d 3d 4f 45   if( onError==OE
21920 5f 41 62 6f 72 74 20 29 7b 0a 20 20 20 20 73 71  _Abort ){.    sq
21930 6c 69 74 65 33 4d 61 79 41 62 6f 72 74 28 70 50  lite3MayAbort(pP
21940 61 72 73 65 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  arse);.  }.  sql
21950 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
21960 2c 20 4f 50 5f 48 61 6c 74 2c 20 65 72 72 43 6f  , OP_Halt, errCo
21970 64 65 2c 20 6f 6e 45 72 72 6f 72 2c 20 30 2c 20  de, onError, 0, 
21980 70 34 2c 20 70 34 74 79 70 65 29 3b 0a 20 20 73  p4, p4type);.  s
21990 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
219a0 50 35 28 76 2c 20 70 35 45 72 72 6d 73 67 29 3b  P5(v, p5Errmsg);
219b0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20 61  .}../*.** Code a
219c0 6e 20 4f 50 5f 48 61 6c 74 20 64 75 65 20 74 6f  n OP_Halt due to
219d0 20 55 4e 49 51 55 45 20 6f 72 20 50 52 49 4d 41   UNIQUE or PRIMA
219e0 52 59 20 4b 45 59 20 63 6f 6e 73 74 72 61 69 6e  RY KEY constrain
219f0 74 20 76 69 6f 6c 61 74 69 6f 6e 2e 0a 2a 2f 0a  t violation..*/.
21a00 76 6f 69 64 20 73 71 6c 69 74 65 33 55 6e 69 71  void sqlite3Uniq
21a10 75 65 43 6f 6e 73 74 72 61 69 6e 74 28 0a 20 20  ueConstraint(.  
21a20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
21a30 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
21a40 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20 6f 6e  text */.  int on
21a50 45 72 72 6f 72 2c 20 20 20 20 20 20 2f 2a 20 43  Error,      /* C
21a60 6f 6e 73 74 72 61 69 6e 74 20 74 79 70 65 20 2a  onstraint type *
21a70 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 20  /.  Index *pIdx 
21a80 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 64        /* The ind
21a90 65 78 20 74 68 61 74 20 74 72 69 67 67 65 72 73  ex that triggers
21aa0 20 74 68 65 20 63 6f 6e 73 74 72 61 69 6e 74 20   the constraint 
21ab0 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a 45  */.){.  char *zE
21ac0 72 72 3b 0a 20 20 69 6e 74 20 6a 3b 0a 20 20 53  rr;.  int j;.  S
21ad0 74 72 41 63 63 75 6d 20 65 72 72 4d 73 67 3b 0a  trAccum errMsg;.
21ae0 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20    Table *pTab = 
21af0 70 49 64 78 2d 3e 70 54 61 62 6c 65 3b 0a 0a 20  pIdx->pTable;.. 
21b00 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d   sqlite3StrAccum
21b10 49 6e 69 74 28 26 65 72 72 4d 73 67 2c 20 70 50  Init(&errMsg, pP
21b20 61 72 73 65 2d 3e 64 62 2c 20 30 2c 20 30 2c 20  arse->db, 0, 0, 
21b30 32 30 30 29 3b 0a 20 20 69 66 28 20 70 49 64 78  200);.  if( pIdx
21b40 2d 3e 61 43 6f 6c 45 78 70 72 20 29 7b 0a 20 20  ->aColExpr ){.  
21b50 20 20 73 71 6c 69 74 65 33 58 50 72 69 6e 74 66    sqlite3XPrintf
21b60 28 26 65 72 72 4d 73 67 2c 20 22 69 6e 64 65 78  (&errMsg, "index
21b70 20 27 25 71 27 22 2c 20 70 49 64 78 2d 3e 7a 4e   '%q'", pIdx->zN
21b80 61 6d 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ame);.  }else{. 
21b90 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 49     for(j=0; j<pI
21ba0 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 6a 2b 2b  dx->nKeyCol; j++
21bb0 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a  ){.      char *z
21bc0 43 6f 6c 3b 0a 20 20 20 20 20 20 61 73 73 65 72  Col;.      asser
21bd0 74 28 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d  t( pIdx->aiColum
21be0 6e 5b 6a 5d 3e 3d 30 20 29 3b 0a 20 20 20 20 20  n[j]>=0 );.     
21bf0 20 7a 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 61 43   zCol = pTab->aC
21c00 6f 6c 5b 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d  ol[pIdx->aiColum
21c10 6e 5b 6a 5d 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20  n[j]].zName;.   
21c20 20 20 20 69 66 28 20 6a 20 29 20 73 71 6c 69 74     if( j ) sqlit
21c30 65 33 53 74 72 41 63 63 75 6d 41 70 70 65 6e 64  e3StrAccumAppend
21c40 28 26 65 72 72 4d 73 67 2c 20 22 2c 20 22 2c 20  (&errMsg, ", ", 
21c50 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  2);.      sqlite
21c60 33 58 50 72 69 6e 74 66 28 26 65 72 72 4d 73 67  3XPrintf(&errMsg
21c70 2c 20 22 25 73 2e 25 73 22 2c 20 70 54 61 62 2d  , "%s.%s", pTab-
21c80 3e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 29 3b 0a 20  >zName, zCol);. 
21c90 20 20 20 7d 0a 20 20 7d 0a 20 20 7a 45 72 72 20     }.  }.  zErr 
21ca0 3d 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75  = sqlite3StrAccu
21cb0 6d 46 69 6e 69 73 68 28 26 65 72 72 4d 73 67 29  mFinish(&errMsg)
21cc0 3b 0a 20 20 73 71 6c 69 74 65 33 48 61 6c 74 43  ;.  sqlite3HaltC
21cd0 6f 6e 73 74 72 61 69 6e 74 28 70 50 61 72 73 65  onstraint(pParse
21ce0 2c 20 0a 20 20 20 20 49 73 50 72 69 6d 61 72 79  , .    IsPrimary
21cf0 4b 65 79 49 6e 64 65 78 28 70 49 64 78 29 20 3f  KeyIndex(pIdx) ?
21d00 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49   SQLITE_CONSTRAI
21d10 4e 54 5f 50 52 49 4d 41 52 59 4b 45 59 20 0a 20  NT_PRIMARYKEY . 
21d20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21d30 20 20 20 20 20 20 20 20 20 20 20 3a 20 53 51 4c             : SQL
21d40 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 55  ITE_CONSTRAINT_U
21d50 4e 49 51 55 45 2c 0a 20 20 20 20 6f 6e 45 72 72  NIQUE,.    onErr
21d60 6f 72 2c 20 7a 45 72 72 2c 20 50 34 5f 44 59 4e  or, zErr, P4_DYN
21d70 41 4d 49 43 2c 20 50 35 5f 43 6f 6e 73 74 72 61  AMIC, P5_Constra
21d80 69 6e 74 55 6e 69 71 75 65 29 3b 0a 7d 0a 0a 0a  intUnique);.}...
21d90 2f 2a 0a 2a 2a 20 43 6f 64 65 20 61 6e 20 4f 50  /*.** Code an OP
21da0 5f 48 61 6c 74 20 64 75 65 20 74 6f 20 6e 6f 6e  _Halt due to non
21db0 2d 75 6e 69 71 75 65 20 72 6f 77 69 64 2e 0a 2a  -unique rowid..*
21dc0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52 6f  /.void sqlite3Ro
21dd0 77 69 64 43 6f 6e 73 74 72 61 69 6e 74 28 0a 20  widConstraint(. 
21de0 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
21df0 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
21e00 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20 6f  ntext */.  int o
21e10 6e 45 72 72 6f 72 2c 20 20 20 20 20 20 2f 2a 20  nError,      /* 
21e20 43 6f 6e 66 6c 69 63 74 20 72 65 73 6f 6c 75 74  Conflict resolut
21e30 69 6f 6e 20 61 6c 67 6f 72 69 74 68 6d 20 2a 2f  ion algorithm */
21e40 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 20  .  Table *pTab  
21e50 20 20 20 20 20 2f 2a 20 54 68 65 20 74 61 62 6c       /* The tabl
21e60 65 20 77 69 74 68 20 74 68 65 20 6e 6f 6e 2d 75  e with the non-u
21e70 6e 69 71 75 65 20 72 6f 77 69 64 20 2a 2f 20 0a  nique rowid */ .
21e80 29 7b 0a 20 20 63 68 61 72 20 2a 7a 4d 73 67 3b  ){.  char *zMsg;
21e90 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 66 28  .  int rc;.  if(
21ea0 20 70 54 61 62 2d 3e 69 50 4b 65 79 3e 3d 30 20   pTab->iPKey>=0 
21eb0 29 7b 0a 20 20 20 20 7a 4d 73 67 20 3d 20 73 71  ){.    zMsg = sq
21ec0 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 70 50 61  lite3MPrintf(pPa
21ed0 72 73 65 2d 3e 64 62 2c 20 22 25 73 2e 25 73 22  rse->db, "%s.%s"
21ee0 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 0a 20  , pTab->zName,. 
21ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21f00 20 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e 61           pTab->a
21f10 43 6f 6c 5b 70 54 61 62 2d 3e 69 50 4b 65 79 5d  Col[pTab->iPKey]
21f20 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72 63 20  .zName);.    rc 
21f30 3d 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41  = SQLITE_CONSTRA
21f40 49 4e 54 5f 50 52 49 4d 41 52 59 4b 45 59 3b 0a  INT_PRIMARYKEY;.
21f50 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 4d 73    }else{.    zMs
21f60 67 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e  g = sqlite3MPrin
21f70 74 66 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 22  tf(pParse->db, "
21f80 25 73 2e 72 6f 77 69 64 22 2c 20 70 54 61 62 2d  %s.rowid", pTab-
21f90 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72 63 20  >zName);.    rc 
21fa0 3d 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41  = SQLITE_CONSTRA
21fb0 49 4e 54 5f 52 4f 57 49 44 3b 0a 20 20 7d 0a 20  INT_ROWID;.  }. 
21fc0 20 73 71 6c 69 74 65 33 48 61 6c 74 43 6f 6e 73   sqlite3HaltCons
21fd0 74 72 61 69 6e 74 28 70 50 61 72 73 65 2c 20 72  traint(pParse, r
21fe0 63 2c 20 6f 6e 45 72 72 6f 72 2c 20 7a 4d 73 67  c, onError, zMsg
21ff0 2c 20 50 34 5f 44 59 4e 41 4d 49 43 2c 0a 20 20  , P4_DYNAMIC,.  
22000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22010 20 20 20 20 20 20 50 35 5f 43 6f 6e 73 74 72 61        P5_Constra
22020 69 6e 74 55 6e 69 71 75 65 29 3b 0a 7d 0a 0a 2f  intUnique);.}../
22030 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73 65  *.** Check to se
22040 65 20 69 66 20 70 49 6e 64 65 78 20 75 73 65 73  e if pIndex uses
22050 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73   the collating s
22060 65 71 75 65 6e 63 65 20 70 43 6f 6c 6c 2e 20 20  equence pColl.  
22070 52 65 74 75 72 6e 0a 2a 2a 20 74 72 75 65 20 69  Return.** true i
22080 66 20 69 74 20 64 6f 65 73 20 61 6e 64 20 66 61  f it does and fa
22090 6c 73 65 20 69 66 20 69 74 20 64 6f 65 73 20 6e  lse if it does n
220a0 6f 74 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53  ot..*/.#ifndef S
220b0 51 4c 49 54 45 5f 4f 4d 49 54 5f 52 45 49 4e 44  QLITE_OMIT_REIND
220c0 45 58 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f  EX.static int co
220d0 6c 6c 61 74 69 6f 6e 4d 61 74 63 68 28 63 6f 6e  llationMatch(con
220e0 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 2c 20  st char *zColl, 
220f0 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 29 7b 0a  Index *pIndex){.
22100 20 20 69 6e 74 20 69 3b 0a 20 20 61 73 73 65 72    int i;.  asser
22110 74 28 20 7a 43 6f 6c 6c 21 3d 30 20 29 3b 0a 20  t( zColl!=0 );. 
22120 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 6e 64   for(i=0; i<pInd
22130 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b  ex->nColumn; i++
22140 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  ){.    const cha
22150 72 20 2a 7a 20 3d 20 70 49 6e 64 65 78 2d 3e 61  r *z = pIndex->a
22160 7a 43 6f 6c 6c 5b 69 5d 3b 0a 20 20 20 20 61 73  zColl[i];.    as
22170 73 65 72 74 28 20 7a 21 3d 30 20 7c 7c 20 70 49  sert( z!=0 || pI
22180 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69  ndex->aiColumn[i
22190 5d 3c 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70  ]<0 );.    if( p
221a0 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b  Index->aiColumn[
221b0 69 5d 3e 3d 30 20 26 26 20 30 3d 3d 73 71 6c 69  i]>=0 && 0==sqli
221c0 74 65 33 53 74 72 49 43 6d 70 28 7a 2c 20 7a 43  te3StrICmp(z, zC
221d0 6f 6c 6c 29 20 29 7b 0a 20 20 20 20 20 20 72 65  oll) ){.      re
221e0 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20  turn 1;.    }.  
221f0 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
22200 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65  #endif../*.** Re
22210 63 6f 6d 70 75 74 65 20 61 6c 6c 20 69 6e 64 69  compute all indi
22220 63 65 73 20 6f 66 20 70 54 61 62 20 74 68 61 74  ces of pTab that
22230 20 75 73 65 20 74 68 65 20 63 6f 6c 6c 61 74 69   use the collati
22240 6e 67 20 73 65 71 75 65 6e 63 65 20 70 43 6f 6c  ng sequence pCol
22250 6c 2e 0a 2a 2a 20 49 66 20 70 43 6f 6c 6c 3d 3d  l..** If pColl==
22260 30 20 74 68 65 6e 20 72 65 63 6f 6d 70 75 74 65  0 then recompute
22270 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 6f 66 20   all indices of 
22280 70 54 61 62 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  pTab..*/.#ifndef
22290 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 52 45 49   SQLITE_OMIT_REI
222a0 4e 44 45 58 0a 73 74 61 74 69 63 20 76 6f 69 64  NDEX.static void
222b0 20 72 65 69 6e 64 65 78 54 61 62 6c 65 28 50 61   reindexTable(Pa
222c0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 61 62  rse *pParse, Tab
222d0 6c 65 20 2a 70 54 61 62 2c 20 63 68 61 72 20 63  le *pTab, char c
222e0 6f 6e 73 74 20 2a 7a 43 6f 6c 6c 29 7b 0a 20 20  onst *zColl){.  
222f0 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b 20 20  Index *pIndex;  
22300 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
22310 6e 20 69 6e 64 65 78 20 61 73 73 6f 63 69 61 74  n index associat
22320 65 64 20 77 69 74 68 20 70 54 61 62 20 2a 2f 0a  ed with pTab */.
22330 0a 20 20 66 6f 72 28 70 49 6e 64 65 78 3d 70 54  .  for(pIndex=pT
22340 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 6e 64  ab->pIndex; pInd
22350 65 78 3b 20 70 49 6e 64 65 78 3d 70 49 6e 64 65  ex; pIndex=pInde
22360 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69  x->pNext){.    i
22370 66 28 20 7a 43 6f 6c 6c 3d 3d 30 20 7c 7c 20 63  f( zColl==0 || c
22380 6f 6c 6c 61 74 69 6f 6e 4d 61 74 63 68 28 7a 43  ollationMatch(zC
22390 6f 6c 6c 2c 20 70 49 6e 64 65 78 29 20 29 7b 0a  oll, pIndex) ){.
223a0 20 20 20 20 20 20 69 6e 74 20 69 44 62 20 3d 20        int iDb = 
223b0 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49  sqlite3SchemaToI
223c0 6e 64 65 78 28 70 50 61 72 73 65 2d 3e 64 62 2c  ndex(pParse->db,
223d0 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b   pTab->pSchema);
223e0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 65  .      sqlite3Be
223f0 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f  ginWriteOperatio
22400 6e 28 70 50 61 72 73 65 2c 20 30 2c 20 69 44 62  n(pParse, 0, iDb
22410 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
22420 52 65 66 69 6c 6c 49 6e 64 65 78 28 70 50 61 72  RefillIndex(pPar
22430 73 65 2c 20 70 49 6e 64 65 78 2c 20 2d 31 29 3b  se, pIndex, -1);
22440 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e  .    }.  }.}.#en
22450 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6f 6d  dif../*.** Recom
22460 70 75 74 65 20 61 6c 6c 20 69 6e 64 69 63 65 73  pute all indices
22470 20 6f 66 20 61 6c 6c 20 74 61 62 6c 65 73 20 69   of all tables i
22480 6e 20 61 6c 6c 20 64 61 74 61 62 61 73 65 73 20  n all databases 
22490 77 68 65 72 65 20 74 68 65 0a 2a 2a 20 69 6e 64  where the.** ind
224a0 69 63 65 73 20 75 73 65 20 74 68 65 20 63 6f 6c  ices use the col
224b0 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20  lating sequence 
224c0 70 43 6f 6c 6c 2e 20 20 49 66 20 70 43 6f 6c 6c  pColl.  If pColl
224d0 3d 3d 30 20 74 68 65 6e 20 72 65 63 6f 6d 70 75  ==0 then recompu
224e0 74 65 0a 2a 2a 20 61 6c 6c 20 69 6e 64 69 63 65  te.** all indice
224f0 73 20 65 76 65 72 79 77 68 65 72 65 2e 0a 2a 2f  s everywhere..*/
22500 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
22510 4f 4d 49 54 5f 52 45 49 4e 44 45 58 0a 73 74 61  OMIT_REINDEX.sta
22520 74 69 63 20 76 6f 69 64 20 72 65 69 6e 64 65 78  tic void reindex
22530 44 61 74 61 62 61 73 65 73 28 50 61 72 73 65 20  Databases(Parse 
22540 2a 70 50 61 72 73 65 2c 20 63 68 61 72 20 63 6f  *pParse, char co
22550 6e 73 74 20 2a 7a 43 6f 6c 6c 29 7b 0a 20 20 44  nst *zColl){.  D
22560 62 20 2a 70 44 62 3b 20 20 20 20 20 20 20 20 20  b *pDb;         
22570 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20             /* A 
22580 73 69 6e 67 6c 65 20 64 61 74 61 62 61 73 65 20  single database 
22590 2a 2f 0a 20 20 69 6e 74 20 69 44 62 3b 20 20 20  */.  int iDb;   
225a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
225b0 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65   /* The database
225c0 20 69 6e 64 65 78 20 6e 75 6d 62 65 72 20 2a 2f   index number */
225d0 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
225e0 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 20 2f   pParse->db;   /
225f0 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 63  * The database c
22600 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 48  onnection */.  H
22610 61 73 68 45 6c 65 6d 20 2a 6b 3b 20 20 20 20 20  ashElem *k;     
22620 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f             /* Fo
22630 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 74  r looping over t
22640 61 62 6c 65 73 20 69 6e 20 70 44 62 20 2a 2f 0a  ables in pDb */.
22650 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 20 20    Table *pTab;  
22660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
22670 20 41 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20   A table in the 
22680 64 61 74 61 62 61 73 65 20 2a 2f 0a 0a 20 20 61  database */..  a
22690 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74  ssert( sqlite3Bt
226a0 72 65 65 48 6f 6c 64 73 41 6c 6c 4d 75 74 65 78  reeHoldsAllMutex
226b0 65 73 28 64 62 29 20 29 3b 20 20 2f 2a 20 4e 65  es(db) );  /* Ne
226c0 65 64 65 64 20 66 6f 72 20 73 63 68 65 6d 61 20  eded for schema 
226d0 61 63 63 65 73 73 20 2a 2f 0a 20 20 66 6f 72 28  access */.  for(
226e0 69 44 62 3d 30 2c 20 70 44 62 3d 64 62 2d 3e 61  iDb=0, pDb=db->a
226f0 44 62 3b 20 69 44 62 3c 64 62 2d 3e 6e 44 62 3b  Db; iDb<db->nDb;
22700 20 69 44 62 2b 2b 2c 20 70 44 62 2b 2b 29 7b 0a   iDb++, pDb++){.
22710 20 20 20 20 61 73 73 65 72 74 28 20 70 44 62 21      assert( pDb!
22720 3d 30 20 29 3b 0a 20 20 20 20 66 6f 72 28 6b 3d  =0 );.    for(k=
22730 73 71 6c 69 74 65 48 61 73 68 46 69 72 73 74 28  sqliteHashFirst(
22740 26 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 74  &pDb->pSchema->t
22750 62 6c 48 61 73 68 29 3b 20 20 6b 3b 20 6b 3d 73  blHash);  k; k=s
22760 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28 6b 29  qliteHashNext(k)
22770 29 7b 0a 20 20 20 20 20 20 70 54 61 62 20 3d 20  ){.      pTab = 
22780 28 54 61 62 6c 65 2a 29 73 71 6c 69 74 65 48 61  (Table*)sqliteHa
22790 73 68 44 61 74 61 28 6b 29 3b 0a 20 20 20 20 20  shData(k);.     
227a0 20 72 65 69 6e 64 65 78 54 61 62 6c 65 28 70 50   reindexTable(pP
227b0 61 72 73 65 2c 20 70 54 61 62 2c 20 7a 43 6f 6c  arse, pTab, zCol
227c0 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  l);.    }.  }.}.
227d0 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 47 65  #endif../*.** Ge
227e0 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20  nerate code for 
227f0 74 68 65 20 52 45 49 4e 44 45 58 20 63 6f 6d 6d  the REINDEX comm
22800 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  and..**.**      
22810 20 20 52 45 49 4e 44 45 58 20 20 20 20 20 20 20    REINDEX       
22820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22830 20 20 20 20 20 2d 2d 20 31 0a 2a 2a 20 20 20 20       -- 1.**    
22840 20 20 20 20 52 45 49 4e 44 45 58 20 20 3c 63 6f      REINDEX  <co
22850 6c 6c 61 74 69 6f 6e 3e 20 20 20 20 20 20 20 20  llation>        
22860 20 20 20 20 20 20 20 2d 2d 20 32 0a 2a 2a 20 20         -- 2.**  
22870 20 20 20 20 20 20 52 45 49 4e 44 45 58 20 20 3f        REINDEX  ?
22880 3c 64 61 74 61 62 61 73 65 3e 2e 3f 3c 74 61 62  <database>.?<tab
22890 6c 65 6e 61 6d 65 3e 20 20 2d 2d 20 33 0a 2a 2a  lename>  -- 3.**
228a0 20 20 20 20 20 20 20 20 52 45 49 4e 44 45 58 20          REINDEX 
228b0 20 3f 3c 64 61 74 61 62 61 73 65 3e 2e 3f 3c 69   ?<database>.?<i
228c0 6e 64 65 78 6e 61 6d 65 3e 20 20 2d 2d 20 34 0a  ndexname>  -- 4.
228d0 2a 2a 0a 2a 2a 20 46 6f 72 6d 20 31 20 63 61 75  **.** Form 1 cau
228e0 73 65 73 20 61 6c 6c 20 69 6e 64 69 63 65 73 20  ses all indices 
228f0 69 6e 20 61 6c 6c 20 61 74 74 61 63 68 65 64 20  in all attached 
22900 64 61 74 61 62 61 73 65 73 20 74 6f 20 62 65 20  databases to be 
22910 72 65 62 75 69 6c 74 2e 0a 2a 2a 20 46 6f 72 6d  rebuilt..** Form
22920 20 32 20 72 65 62 75 69 6c 64 73 20 61 6c 6c 20   2 rebuilds all 
22930 69 6e 64 69 63 65 73 20 69 6e 20 61 6c 6c 20 64  indices in all d
22940 61 74 61 62 61 73 65 73 20 74 68 61 74 20 75 73  atabases that us
22950 65 20 74 68 65 20 6e 61 6d 65 64 0a 2a 2a 20 63  e the named.** c
22960 6f 6c 6c 61 74 69 6e 67 20 66 75 6e 63 74 69 6f  ollating functio
22970 6e 2e 20 20 46 6f 72 6d 73 20 33 20 61 6e 64 20  n.  Forms 3 and 
22980 34 20 72 65 62 75 69 6c 64 20 74 68 65 20 6e 61  4 rebuild the na
22990 6d 65 64 20 69 6e 64 65 78 20 6f 72 20 61 6c 6c  med index or all
229a0 0a 2a 2a 20 69 6e 64 69 63 65 73 20 61 73 73 6f  .** indices asso
229b0 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20  ciated with the 
229c0 6e 61 6d 65 64 20 74 61 62 6c 65 2e 0a 2a 2f 0a  named table..*/.
229d0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
229e0 4d 49 54 5f 52 45 49 4e 44 45 58 0a 76 6f 69 64  MIT_REINDEX.void
229f0 20 73 71 6c 69 74 65 33 52 65 69 6e 64 65 78 28   sqlite3Reindex(
22a00 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54  Parse *pParse, T
22a10 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c 20 54 6f  oken *pName1, To
22a20 6b 65 6e 20 2a 70 4e 61 6d 65 32 29 7b 0a 20 20  ken *pName2){.  
22a30 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 20  CollSeq *pColl; 
22a40 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
22a50 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
22a60 65 20 74 6f 20 62 65 20 72 65 69 6e 64 65 78 65  e to be reindexe
22a70 64 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20  d, or NULL */.  
22a80 63 68 61 72 20 2a 7a 3b 20 20 20 20 20 20 20 20  char *z;        
22a90 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
22aa0 61 6d 65 20 6f 66 20 61 20 74 61 62 6c 65 20 6f  ame of a table o
22ab0 72 20 69 6e 64 65 78 20 2a 2f 0a 20 20 63 6f 6e  r index */.  con
22ac0 73 74 20 63 68 61 72 20 2a 7a 44 62 3b 20 20 20  st char *zDb;   
22ad0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
22ae0 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
22af0 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61   */.  Table *pTa
22b00 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
22b10 20 20 2f 2a 20 41 20 74 61 62 6c 65 20 69 6e 20    /* A table in 
22b20 74 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  the database */.
22b30 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b    Index *pIndex;
22b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
22b50 20 41 6e 20 69 6e 64 65 78 20 61 73 73 6f 63 69   An index associ
22b60 61 74 65 64 20 77 69 74 68 20 70 54 61 62 20 2a  ated with pTab *
22b70 2f 0a 20 20 69 6e 74 20 69 44 62 3b 20 20 20 20  /.  int iDb;    
22b80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22b90 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20  /* The database 
22ba0 69 6e 64 65 78 20 6e 75 6d 62 65 72 20 2a 2f 0a  index number */.
22bb0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
22bc0 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 20 2f 2a  pParse->db;   /*
22bd0 20 54 68 65 20 64 61 74 61 62 61 73 65 20 63 6f   The database co
22be0 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 6f  nnection */.  To
22bf0 6b 65 6e 20 2a 70 4f 62 6a 4e 61 6d 65 3b 20 20  ken *pObjName;  
22c00 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
22c10 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 6f  e of the table o
22c20 72 20 69 6e 64 65 78 20 74 6f 20 62 65 20 72 65  r index to be re
22c30 69 6e 64 65 78 65 64 20 2a 2f 0a 0a 20 20 2f 2a  indexed */..  /*
22c40 20 52 65 61 64 20 74 68 65 20 64 61 74 61 62 61   Read the databa
22c50 73 65 20 73 63 68 65 6d 61 2e 20 49 66 20 61 6e  se schema. If an
22c60 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 6c   error occurs, l
22c70 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65  eave an error me
22c80 73 73 61 67 65 0a 20 20 2a 2a 20 61 6e 64 20 63  ssage.  ** and c
22c90 6f 64 65 20 69 6e 20 70 50 61 72 73 65 20 61 6e  ode in pParse an
22ca0 64 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 20 2a  d return NULL. *
22cb0 2f 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f  /.  if( SQLITE_O
22cc0 4b 21 3d 73 71 6c 69 74 65 33 52 65 61 64 53 63  K!=sqlite3ReadSc
22cd0 68 65 6d 61 28 70 50 61 72 73 65 29 20 29 7b 0a  hema(pParse) ){.
22ce0 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
22cf0 0a 20 20 69 66 28 20 70 4e 61 6d 65 31 3d 3d 30  .  if( pName1==0
22d00 20 29 7b 0a 20 20 20 20 72 65 69 6e 64 65 78 44   ){.    reindexD
22d10 61 74 61 62 61 73 65 73 28 70 50 61 72 73 65 2c  atabases(pParse,
22d20 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b   0);.    return;
22d30 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 4e 45 56  .  }else if( NEV
22d40 45 52 28 70 4e 61 6d 65 32 3d 3d 30 29 20 7c 7c  ER(pName2==0) ||
22d50 20 70 4e 61 6d 65 32 2d 3e 7a 3d 3d 30 20 29 7b   pName2->z==0 ){
22d60 0a 20 20 20 20 63 68 61 72 20 2a 7a 43 6f 6c 6c  .    char *zColl
22d70 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4e  ;.    assert( pN
22d80 61 6d 65 31 2d 3e 7a 20 29 3b 0a 20 20 20 20 7a  ame1->z );.    z
22d90 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 4e 61  Coll = sqlite3Na
22da0 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 50 61 72  meFromToken(pPar
22db0 73 65 2d 3e 64 62 2c 20 70 4e 61 6d 65 31 29 3b  se->db, pName1);
22dc0 0a 20 20 20 20 69 66 28 20 21 7a 43 6f 6c 6c 20  .    if( !zColl 
22dd0 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 70 43  ) return;.    pC
22de0 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 46 69 6e  oll = sqlite3Fin
22df0 64 43 6f 6c 6c 53 65 71 28 64 62 2c 20 45 4e 43  dCollSeq(db, ENC
22e00 28 64 62 29 2c 20 7a 43 6f 6c 6c 2c 20 30 29 3b  (db), zColl, 0);
22e10 0a 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 20 29  .    if( pColl )
22e20 7b 0a 20 20 20 20 20 20 72 65 69 6e 64 65 78 44  {.      reindexD
22e30 61 74 61 62 61 73 65 73 28 70 50 61 72 73 65 2c  atabases(pParse,
22e40 20 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20 20 20 73   zColl);.      s
22e50 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
22e60 20 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20 20 20 72   zColl);.      r
22e70 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20  eturn;.    }.   
22e80 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
22e90 62 2c 20 7a 43 6f 6c 6c 29 3b 0a 20 20 7d 0a 20  b, zColl);.  }. 
22ea0 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 54 77   iDb = sqlite3Tw
22eb0 6f 50 61 72 74 4e 61 6d 65 28 70 50 61 72 73 65  oPartName(pParse
22ec0 2c 20 70 4e 61 6d 65 31 2c 20 70 4e 61 6d 65 32  , pName1, pName2
22ed0 2c 20 26 70 4f 62 6a 4e 61 6d 65 29 3b 0a 20 20  , &pObjName);.  
22ee0 69 66 28 20 69 44 62 3c 30 20 29 20 72 65 74 75  if( iDb<0 ) retu
22ef0 72 6e 3b 0a 20 20 7a 20 3d 20 73 71 6c 69 74 65  rn;.  z = sqlite
22f00 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64  3NameFromToken(d
22f10 62 2c 20 70 4f 62 6a 4e 61 6d 65 29 3b 0a 20 20  b, pObjName);.  
22f20 69 66 28 20 7a 3d 3d 30 20 29 20 72 65 74 75 72  if( z==0 ) retur
22f30 6e 3b 0a 20 20 7a 44 62 20 3d 20 64 62 2d 3e 61  n;.  zDb = db->a
22f40 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20  Db[iDb].zName;. 
22f50 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33 46   pTab = sqlite3F
22f60 69 6e 64 54 61 62 6c 65 28 64 62 2c 20 7a 2c 20  indTable(db, z, 
22f70 7a 44 62 29 3b 0a 20 20 69 66 28 20 70 54 61 62  zDb);.  if( pTab
22f80 20 29 7b 0a 20 20 20 20 72 65 69 6e 64 65 78 54   ){.    reindexT
22f90 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70 54 61  able(pParse, pTa
22fa0 62 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  b, 0);.    sqlit
22fb0 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 29 3b  e3DbFree(db, z);
22fc0 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
22fd0 0a 20 20 70 49 6e 64 65 78 20 3d 20 73 71 6c 69  .  pIndex = sqli
22fe0 74 65 33 46 69 6e 64 49 6e 64 65 78 28 64 62 2c  te3FindIndex(db,
22ff0 20 7a 2c 20 7a 44 62 29 3b 0a 20 20 73 71 6c 69   z, zDb);.  sqli
23000 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 29  te3DbFree(db, z)
23010 3b 0a 20 20 69 66 28 20 70 49 6e 64 65 78 20 29  ;.  if( pIndex )
23020 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65 67  {.    sqlite3Beg
23030 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e  inWriteOperation
23040 28 70 50 61 72 73 65 2c 20 30 2c 20 69 44 62 29  (pParse, 0, iDb)
23050 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 66  ;.    sqlite3Ref
23060 69 6c 6c 49 6e 64 65 78 28 70 50 61 72 73 65 2c  illIndex(pParse,
23070 20 70 49 6e 64 65 78 2c 20 2d 31 29 3b 0a 20 20   pIndex, -1);.  
23080 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
23090 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
230a0 70 50 61 72 73 65 2c 20 22 75 6e 61 62 6c 65 20  pParse, "unable 
230b0 74 6f 20 69 64 65 6e 74 69 66 79 20 74 68 65 20  to identify the 
230c0 6f 62 6a 65 63 74 20 74 6f 20 62 65 20 72 65 69  object to be rei
230d0 6e 64 65 78 65 64 22 29 3b 0a 7d 0a 23 65 6e 64  ndexed");.}.#end
230e0 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  if../*.** Return
230f0 20 61 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63   a KeyInfo struc
23100 74 75 72 65 20 74 68 61 74 20 69 73 20 61 70 70  ture that is app
23110 72 6f 70 72 69 61 74 65 20 66 6f 72 20 74 68 65  ropriate for the
23120 20 67 69 76 65 6e 20 49 6e 64 65 78 2e 0a 2a 2a   given Index..**
23130 0a 2a 2a 20 54 68 65 20 4b 65 79 49 6e 66 6f 20  .** The KeyInfo 
23140 73 74 72 75 63 74 75 72 65 20 66 6f 72 20 61 6e  structure for an
23150 20 69 6e 64 65 78 20 69 73 20 63 61 63 68 65 64   index is cached
23160 20 69 6e 20 74 68 65 20 49 6e 64 65 78 20 6f 62   in the Index ob
23170 6a 65 63 74 2e 0a 2a 2a 20 53 6f 20 74 68 65 72  ject..** So ther
23180 65 20 6d 69 67 68 74 20 62 65 20 6d 75 6c 74 69  e might be multi
23190 70 6c 65 20 72 65 66 65 72 65 6e 63 65 73 20 74  ple references t
231a0 6f 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 70  o the returned p
231b0 6f 69 6e 74 65 72 2e 20 20 54 68 65 0a 2a 2a 20  ointer.  The.** 
231c0 63 61 6c 6c 65 72 20 73 68 6f 75 6c 64 20 6e 6f  caller should no
231d0 74 20 74 72 79 20 74 6f 20 6d 6f 64 69 66 79 20  t try to modify 
231e0 74 68 65 20 4b 65 79 49 6e 66 6f 20 6f 62 6a 65  the KeyInfo obje
231f0 63 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61  ct..**.** The ca
23200 6c 6c 65 72 20 73 68 6f 75 6c 64 20 69 6e 76 6f  ller should invo
23210 6b 65 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66  ke sqlite3KeyInf
23220 6f 55 6e 72 65 66 28 29 20 6f 6e 20 74 68 65 20  oUnref() on the 
23230 72 65 74 75 72 6e 65 64 20 6f 62 6a 65 63 74 0a  returned object.
23240 2a 2a 20 77 68 65 6e 20 69 74 20 68 61 73 20 66  ** when it has f
23250 69 6e 69 73 68 65 64 20 75 73 69 6e 67 20 69 74  inished using it
23260 2e 0a 2a 2f 0a 4b 65 79 49 6e 66 6f 20 2a 73 71  ..*/.KeyInfo *sq
23270 6c 69 74 65 33 4b 65 79 49 6e 66 6f 4f 66 49 6e  lite3KeyInfoOfIn
23280 64 65 78 28 50 61 72 73 65 20 2a 70 50 61 72 73  dex(Parse *pPars
23290 65 2c 20 49 6e 64 65 78 20 2a 70 49 64 78 29 7b  e, Index *pIdx){
232a0 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20  .  int i;.  int 
232b0 6e 43 6f 6c 20 3d 20 70 49 64 78 2d 3e 6e 43 6f  nCol = pIdx->nCo
232c0 6c 75 6d 6e 3b 0a 20 20 69 6e 74 20 6e 4b 65 79  lumn;.  int nKey
232d0 20 3d 20 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c   = pIdx->nKeyCol
232e0 3b 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65  ;.  KeyInfo *pKe
232f0 79 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  y;.  if( pParse-
23300 3e 6e 45 72 72 20 29 20 72 65 74 75 72 6e 20 30  >nErr ) return 0
23310 3b 0a 20 20 69 66 28 20 70 49 64 78 2d 3e 75 6e  ;.  if( pIdx->un
23320 69 71 4e 6f 74 4e 75 6c 6c 20 29 7b 0a 20 20 20  iqNotNull ){.   
23330 20 70 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 4b   pKey = sqlite3K
23340 65 79 49 6e 66 6f 41 6c 6c 6f 63 28 70 50 61 72  eyInfoAlloc(pPar
23350 73 65 2d 3e 64 62 2c 20 6e 4b 65 79 2c 20 6e 43  se->db, nKey, nC
23360 6f 6c 2d 6e 4b 65 79 29 3b 0a 20 20 7d 65 6c 73  ol-nKey);.  }els
23370 65 7b 0a 20 20 20 20 70 4b 65 79 20 3d 20 73 71  e{.    pKey = sq
23380 6c 69 74 65 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f  lite3KeyInfoAllo
23390 63 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 6e 43  c(pParse->db, nC
233a0 6f 6c 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66  ol, 0);.  }.  if
233b0 28 20 70 4b 65 79 20 29 7b 0a 20 20 20 20 61 73  ( pKey ){.    as
233c0 73 65 72 74 28 20 73 71 6c 69 74 65 33 4b 65 79  sert( sqlite3Key
233d0 49 6e 66 6f 49 73 57 72 69 74 65 61 62 6c 65 28  InfoIsWriteable(
233e0 70 4b 65 79 29 20 29 3b 0a 20 20 20 20 66 6f 72  pKey) );.    for
233f0 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b  (i=0; i<nCol; i+
23400 2b 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20  +){.      const 
23410 63 68 61 72 20 2a 7a 43 6f 6c 6c 20 3d 20 70 49  char *zColl = pI
23420 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 3b 0a 20  dx->azColl[i];. 
23430 20 20 20 20 20 70 4b 65 79 2d 3e 61 43 6f 6c 6c       pKey->aColl
23440 5b 69 5d 20 3d 20 7a 43 6f 6c 6c 3d 3d 73 71 6c  [i] = zColl==sql
23450 69 74 65 33 53 74 72 42 49 4e 41 52 59 20 3f 20  ite3StrBINARY ? 
23460 30 20 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20  0 :.            
23470 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
23480 74 65 33 4c 6f 63 61 74 65 43 6f 6c 6c 53 65 71  te3LocateCollSeq
23490 28 70 50 61 72 73 65 2c 20 7a 43 6f 6c 6c 29 3b  (pParse, zColl);
234a0 0a 20 20 20 20 20 20 70 4b 65 79 2d 3e 61 53 6f  .      pKey->aSo
234b0 72 74 4f 72 64 65 72 5b 69 5d 20 3d 20 70 49 64  rtOrder[i] = pId
234c0 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d  x->aSortOrder[i]
234d0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
234e0 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 7b 0a  pParse->nErr ){.
234f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 4b 65 79        sqlite3Key
23500 49 6e 66 6f 55 6e 72 65 66 28 70 4b 65 79 29 3b  InfoUnref(pKey);
23510 0a 20 20 20 20 20 20 70 4b 65 79 20 3d 20 30 3b  .      pKey = 0;
23520 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
23530 75 72 6e 20 70 4b 65 79 3b 0a 7d 0a 0a 23 69 66  urn pKey;.}..#if
23540 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
23550 5f 43 54 45 0a 2f 2a 20 0a 2a 2a 20 54 68 69 73  _CTE./* .** This
23560 20 72 6f 75 74 69 6e 65 20 69 73 20 69 6e 76 6f   routine is invo
23570 6b 65 64 20 6f 6e 63 65 20 70 65 72 20 43 54 45  ked once per CTE
23580 20 62 79 20 74 68 65 20 70 61 72 73 65 72 20 77   by the parser w
23590 68 69 6c 65 20 70 61 72 73 69 6e 67 20 61 20 0a  hile parsing a .
235a0 2a 2a 20 57 49 54 48 20 63 6c 61 75 73 65 2e 20  ** WITH clause. 
235b0 0a 2a 2f 0a 57 69 74 68 20 2a 73 71 6c 69 74 65  .*/.With *sqlite
235c0 33 57 69 74 68 41 64 64 28 0a 20 20 50 61 72 73  3WithAdd(.  Pars
235d0 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
235e0 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
235f0 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 69 74 68  ontext */.  With
23600 20 2a 70 57 69 74 68 2c 20 20 20 20 20 20 20 20   *pWith,        
23610 20 20 20 20 2f 2a 20 45 78 69 73 74 69 6e 67 20      /* Existing 
23620 57 49 54 48 20 63 6c 61 75 73 65 2c 20 6f 72 20  WITH clause, or 
23630 4e 55 4c 4c 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  NULL */.  Token 
23640 2a 70 4e 61 6d 65 2c 20 20 20 20 20 20 20 20 20  *pName,         
23650 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
23660 20 63 6f 6d 6d 6f 6e 2d 74 61 62 6c 65 20 2a 2f   common-table */
23670 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 41 72  .  ExprList *pAr
23680 67 6c 69 73 74 2c 20 20 20 20 20 2f 2a 20 4f 70  glist,     /* Op
23690 74 69 6f 6e 61 6c 20 63 6f 6c 75 6d 6e 20 6e 61  tional column na
236a0 6d 65 20 6c 69 73 74 20 66 6f 72 20 74 68 65 20  me list for the 
236b0 74 61 62 6c 65 20 2a 2f 0a 20 20 53 65 6c 65 63  table */.  Selec
236c0 74 20 2a 70 51 75 65 72 79 20 20 20 20 20 20 20  t *pQuery       
236d0 20 20 20 2f 2a 20 51 75 65 72 79 20 75 73 65 64     /* Query used
236e0 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 74   to initialize t
236f0 68 65 20 74 61 62 6c 65 20 2a 2f 0a 29 7b 0a 20  he table */.){. 
23700 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
23710 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 57 69 74  Parse->db;.  Wit
23720 68 20 2a 70 4e 65 77 3b 0a 20 20 63 68 61 72 20  h *pNew;.  char 
23730 2a 7a 4e 61 6d 65 3b 0a 0a 20 20 2f 2a 20 43 68  *zName;..  /* Ch
23740 65 63 6b 20 74 68 61 74 20 74 68 65 20 43 54 45  eck that the CTE
23750 20 6e 61 6d 65 20 69 73 20 75 6e 69 71 75 65 20   name is unique 
23760 77 69 74 68 69 6e 20 74 68 69 73 20 57 49 54 48  within this WITH
23770 20 63 6c 61 75 73 65 2e 20 49 66 0a 20 20 2a 2a   clause. If.  **
23780 20 6e 6f 74 2c 20 73 74 6f 72 65 20 61 6e 20 65   not, store an e
23790 72 72 6f 72 20 69 6e 20 74 68 65 20 50 61 72 73  rror in the Pars
237a0 65 20 73 74 72 75 63 74 75 72 65 2e 20 2a 2f 0a  e structure. */.
237b0 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65    zName = sqlite
237c0 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70  3NameFromToken(p
237d0 50 61 72 73 65 2d 3e 64 62 2c 20 70 4e 61 6d 65  Parse->db, pName
237e0 29 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65 20 26  );.  if( zName &
237f0 26 20 70 57 69 74 68 20 29 7b 0a 20 20 20 20 69  & pWith ){.    i
23800 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d  nt i;.    for(i=
23810 30 3b 20 69 3c 70 57 69 74 68 2d 3e 6e 43 74 65  0; i<pWith->nCte
23820 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; i++){.      if
23830 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ( sqlite3StrICmp
23840 28 7a 4e 61 6d 65 2c 20 70 57 69 74 68 2d 3e 61  (zName, pWith->a
23850 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b  [i].zName)==0 ){
23860 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
23870 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
23880 20 22 64 75 70 6c 69 63 61 74 65 20 57 49 54 48   "duplicate WITH
23890 20 74 61 62 6c 65 20 6e 61 6d 65 3a 20 25 73 22   table name: %s"
238a0 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  , zName);.      
238b0 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69  }.    }.  }..  i
238c0 66 28 20 70 57 69 74 68 20 29 7b 0a 20 20 20 20  f( pWith ){.    
238d0 69 6e 74 20 6e 42 79 74 65 20 3d 20 73 69 7a 65  int nByte = size
238e0 6f 66 28 2a 70 57 69 74 68 29 20 2b 20 28 73 69  of(*pWith) + (si
238f0 7a 65 6f 66 28 70 57 69 74 68 2d 3e 61 5b 31 5d  zeof(pWith->a[1]
23900 29 20 2a 20 70 57 69 74 68 2d 3e 6e 43 74 65 29  ) * pWith->nCte)
23910 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c  ;.    pNew = sql
23920 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 28 64 62  ite3DbRealloc(db
23930 2c 20 70 57 69 74 68 2c 20 6e 42 79 74 65 29 3b  , pWith, nByte);
23940 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 4e  .  }else{.    pN
23950 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  ew = sqlite3DbMa
23960 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a  llocZero(db, siz
23970 65 6f 66 28 2a 70 57 69 74 68 29 29 3b 0a 20 20  eof(*pWith));.  
23980 7d 0a 20 20 61 73 73 65 72 74 28 20 28 70 4e 65  }.  assert( (pNe
23990 77 21 3d 30 20 26 26 20 7a 4e 61 6d 65 21 3d 30  w!=0 && zName!=0
239a0 29 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  ) || db->mallocF
239b0 61 69 6c 65 64 20 29 3b 0a 0a 20 20 69 66 28 20  ailed );..  if( 
239c0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
239d0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
239e0 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62  xprListDelete(db
239f0 2c 20 70 41 72 67 6c 69 73 74 29 3b 0a 20 20 20  , pArglist);.   
23a00 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
23a10 6c 65 74 65 28 64 62 2c 20 70 51 75 65 72 79 29  lete(db, pQuery)
23a20 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  ;.    sqlite3DbF
23a30 72 65 65 28 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a  ree(db, zName);.
23a40 20 20 20 20 70 4e 65 77 20 3d 20 70 57 69 74 68      pNew = pWith
23a50 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
23a60 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e 43 74  New->a[pNew->nCt
23a70 65 5d 2e 70 53 65 6c 65 63 74 20 3d 20 70 51 75  e].pSelect = pQu
23a80 65 72 79 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 61  ery;.    pNew->a
23a90 5b 70 4e 65 77 2d 3e 6e 43 74 65 5d 2e 70 43 6f  [pNew->nCte].pCo
23aa0 6c 73 20 3d 20 70 41 72 67 6c 69 73 74 3b 0a 20  ls = pArglist;. 
23ab0 20 20 20 70 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d     pNew->a[pNew-
23ac0 3e 6e 43 74 65 5d 2e 7a 4e 61 6d 65 20 3d 20 7a  >nCte].zName = z
23ad0 4e 61 6d 65 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  Name;.    pNew->
23ae0 61 5b 70 4e 65 77 2d 3e 6e 43 74 65 5d 2e 7a 43  a[pNew->nCte].zC
23af0 74 65 45 72 72 20 3d 20 30 3b 0a 20 20 20 20 70  teErr = 0;.    p
23b00 4e 65 77 2d 3e 6e 43 74 65 2b 2b 3b 0a 20 20 7d  New->nCte++;.  }
23b10 0a 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b  ..  return pNew;
23b20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 74  .}../*.** Free t
23b30 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
23b40 68 65 20 57 69 74 68 20 6f 62 6a 65 63 74 20 70  he With object p
23b50 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63  assed as the sec
23b60 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f  ond argument..*/
23b70 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 57 69 74  .void sqlite3Wit
23b80 68 44 65 6c 65 74 65 28 73 71 6c 69 74 65 33 20  hDelete(sqlite3 
23b90 2a 64 62 2c 20 57 69 74 68 20 2a 70 57 69 74 68  *db, With *pWith
23ba0 29 7b 0a 20 20 69 66 28 20 70 57 69 74 68 20 29  ){.  if( pWith )
23bb0 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  {.    int i;.   
23bc0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 57 69 74   for(i=0; i<pWit
23bd0 68 2d 3e 6e 43 74 65 3b 20 69 2b 2b 29 7b 0a 20  h->nCte; i++){. 
23be0 20 20 20 20 20 73 74 72 75 63 74 20 43 74 65 20       struct Cte 
23bf0 2a 70 43 74 65 20 3d 20 26 70 57 69 74 68 2d 3e  *pCte = &pWith->
23c00 61 5b 69 5d 3b 0a 20 20 20 20 20 20 73 71 6c 69  a[i];.      sqli
23c10 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
23c20 65 28 64 62 2c 20 70 43 74 65 2d 3e 70 43 6f 6c  e(db, pCte->pCol
23c30 73 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  s);.      sqlite
23c40 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62  3SelectDelete(db
23c50 2c 20 70 43 74 65 2d 3e 70 53 65 6c 65 63 74 29  , pCte->pSelect)
23c60 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  ;.      sqlite3D
23c70 62 46 72 65 65 28 64 62 2c 20 70 43 74 65 2d 3e  bFree(db, pCte->
23c80 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20  zName);.    }.  
23c90 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
23ca0 64 62 2c 20 70 57 69 74 68 29 3b 0a 20 20 7d 0a  db, pWith);.  }.
23cb0 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66  }.#endif /* !def
23cc0 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
23cd0 5f 43 54 45 29 20 2a 2f 0a                       _CTE) */.