/ Hex Artifact Content
Login

Artifact d65be62254ca9df36e1e1c433324f0333f80009c:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43 20 63  ile contains C c
0190: 6f 64 65 20 72 6f 75 74 69 6e 65 73 20 74 68 61  ode routines tha
01a0: 74 20 61 72 65 20 63 61 6c 6c 65 64 20 62 79 20  t are called by 
01b0: 74 68 65 20 53 51 4c 69 74 65 20 70 61 72 73 65  the SQLite parse
01c0: 72 0a 2a 2a 20 77 68 65 6e 20 73 79 6e 74 61 78  r.** when syntax
01d0: 20 72 75 6c 65 73 20 61 72 65 20 72 65 64 75 63   rules are reduc
01e0: 65 64 2e 20 20 54 68 65 20 72 6f 75 74 69 6e 65  ed.  The routine
01f0: 73 20 69 6e 20 74 68 69 73 20 66 69 6c 65 20 68  s in this file h
0200: 61 6e 64 6c 65 20 74 68 65 0a 2a 2a 20 66 6f 6c  andle the.** fol
0210: 6c 6f 77 69 6e 67 20 6b 69 6e 64 73 20 6f 66 20  lowing kinds of 
0220: 53 51 4c 20 73 79 6e 74 61 78 3a 0a 2a 2a 0a 2a  SQL syntax:.**.*
0230: 2a 20 20 20 20 20 43 52 45 41 54 45 20 54 41 42  *     CREATE TAB
0240: 4c 45 0a 2a 2a 20 20 20 20 20 44 52 4f 50 20 54  LE.**     DROP T
0250: 41 42 4c 45 0a 2a 2a 20 20 20 20 20 43 52 45 41  ABLE.**     CREA
0260: 54 45 20 49 4e 44 45 58 0a 2a 2a 20 20 20 20 20  TE INDEX.**     
0270: 44 52 4f 50 20 49 4e 44 45 58 0a 2a 2a 20 20 20  DROP INDEX.**   
0280: 20 20 63 72 65 61 74 69 6e 67 20 49 44 20 6c 69    creating ID li
0290: 73 74 73 0a 2a 2a 20 20 20 20 20 42 45 47 49 4e  sts.**     BEGIN
02a0: 20 54 52 41 4e 53 41 43 54 49 4f 4e 0a 2a 2a 20   TRANSACTION.** 
02b0: 20 20 20 20 43 4f 4d 4d 49 54 0a 2a 2a 20 20 20      COMMIT.**   
02c0: 20 20 52 4f 4c 4c 42 41 43 4b 0a 2a 2f 0a 23 69    ROLLBACK.*/.#i
02d0: 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 49 6e  nclude "sqliteIn
02e0: 74 2e 68 22 0a 0a 23 69 66 6e 64 65 66 20 53 51  t.h"..#ifndef SQ
02f0: 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
0300: 5f 43 41 43 48 45 0a 2f 2a 0a 2a 2a 20 54 68 65  _CACHE./*.** The
0310: 20 54 61 62 6c 65 4c 6f 63 6b 20 73 74 72 75 63   TableLock struc
0320: 74 75 72 65 20 69 73 20 6f 6e 6c 79 20 75 73 65  ture is only use
0330: 64 20 62 79 20 74 68 65 20 73 71 6c 69 74 65 33  d by the sqlite3
0340: 54 61 62 6c 65 4c 6f 63 6b 28 29 20 61 6e 64 0a  TableLock() and.
0350: 2a 2a 20 63 6f 64 65 54 61 62 6c 65 4c 6f 63 6b  ** codeTableLock
0360: 73 28 29 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 2a  s() functions..*
0370: 2f 0a 73 74 72 75 63 74 20 54 61 62 6c 65 4c 6f  /.struct TableLo
0380: 63 6b 20 7b 0a 20 20 69 6e 74 20 69 44 62 3b 20  ck {.  int iDb; 
0390: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
03a0: 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74  he database cont
03b0: 61 69 6e 69 6e 67 20 74 68 65 20 74 61 62 6c 65  aining the table
03c0: 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64 20 2a 2f   to be locked */
03d0: 0a 20 20 69 6e 74 20 69 54 61 62 3b 20 20 20 20  .  int iTab;    
03e0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72          /* The r
03f0: 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 68 65 20  oot page of the 
0400: 74 61 62 6c 65 20 74 6f 20 62 65 20 6c 6f 63 6b  table to be lock
0410: 65 64 20 2a 2f 0a 20 20 75 38 20 69 73 57 72 69  ed */.  u8 isWri
0420: 74 65 4c 6f 63 6b 3b 20 20 20 20 20 20 2f 2a 20  teLock;      /* 
0430: 54 72 75 65 20 66 6f 72 20 77 72 69 74 65 20 6c  True for write l
0440: 6f 63 6b 2e 20 20 46 61 6c 73 65 20 66 6f 72 20  ock.  False for 
0450: 61 20 72 65 61 64 20 6c 6f 63 6b 20 2a 2f 0a 20  a read lock */. 
0460: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
0470: 6d 65 3b 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66  me;   /* Name of
0480: 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 7d 3b   the table */.};
0490: 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6f 72 64 20 74  ../*.** Record t
04a0: 68 65 20 66 61 63 74 20 74 68 61 74 20 77 65 20  he fact that we 
04b0: 77 61 6e 74 20 74 6f 20 6c 6f 63 6b 20 61 20 74  want to lock a t
04c0: 61 62 6c 65 20 61 74 20 72 75 6e 2d 74 69 6d 65  able at run-time
04d0: 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 61  .  .**.** The ta
04e0: 62 6c 65 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64  ble to be locked
04f0: 20 68 61 73 20 72 6f 6f 74 20 70 61 67 65 20 69   has root page i
0500: 54 61 62 20 61 6e 64 20 69 73 20 66 6f 75 6e 64  Tab and is found
0510: 20 69 6e 20 64 61 74 61 62 61 73 65 20 69 44 62   in database iDb
0520: 2e 0a 2a 2a 20 41 20 72 65 61 64 20 6f 72 20 61  ..** A read or a
0530: 20 77 72 69 74 65 20 6c 6f 63 6b 20 63 61 6e 20   write lock can 
0540: 62 65 20 74 61 6b 65 6e 20 64 65 70 65 6e 64 69  be taken dependi
0550: 6e 67 20 6f 6e 20 69 73 57 72 69 74 65 6c 6f 63  ng on isWriteloc
0560: 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  k..**.** This ro
0570: 75 74 69 6e 65 20 6a 75 73 74 20 72 65 63 6f 72  utine just recor
0580: 64 73 20 74 68 65 20 66 61 63 74 20 74 68 61 74  ds the fact that
0590: 20 74 68 65 20 6c 6f 63 6b 20 69 73 20 64 65 73   the lock is des
05a0: 69 72 65 64 2e 20 20 54 68 65 0a 2a 2a 20 63 6f  ired.  The.** co
05b0: 64 65 20 74 6f 20 6d 61 6b 65 20 74 68 65 20 6c  de to make the l
05c0: 6f 63 6b 20 6f 63 63 75 72 20 69 73 20 67 65 6e  ock occur is gen
05d0: 65 72 61 74 65 64 20 62 79 20 61 20 6c 61 74 65  erated by a late
05e0: 72 20 63 61 6c 6c 20 74 6f 0a 2a 2a 20 63 6f 64  r call to.** cod
05f0: 65 54 61 62 6c 65 4c 6f 63 6b 73 28 29 20 77 68  eTableLocks() wh
0600: 69 63 68 20 6f 63 63 75 72 73 20 64 75 72 69 6e  ich occurs durin
0610: 67 20 73 71 6c 69 74 65 33 46 69 6e 69 73 68 43  g sqlite3FinishC
0620: 6f 64 69 6e 67 28 29 2e 0a 2a 2f 0a 76 6f 69 64  oding()..*/.void
0630: 20 73 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63   sqlite3TableLoc
0640: 6b 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  k(.  Parse *pPar
0650: 73 65 2c 20 20 20 20 20 2f 2a 20 50 61 72 73 69  se,     /* Parsi
0660: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
0670: 69 6e 74 20 69 44 62 2c 20 20 20 20 20 20 20 20  int iDb,        
0680: 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74     /* Index of t
0690: 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74  he database cont
06a0: 61 69 6e 69 6e 67 20 74 68 65 20 74 61 62 6c 65  aining the table
06b0: 20 74 6f 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 6e   to lock */.  in
06c0: 74 20 69 54 61 62 2c 20 20 20 20 20 20 20 20 20  t iTab,         
06d0: 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20 6e 75   /* Root page nu
06e0: 6d 62 65 72 20 6f 66 20 74 68 65 20 74 61 62 6c  mber of the tabl
06f0: 65 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64 20 2a  e to be locked *
0700: 2f 0a 20 20 75 38 20 69 73 57 72 69 74 65 4c 6f  /.  u8 isWriteLo
0710: 63 6b 2c 20 20 20 20 2f 2a 20 54 72 75 65 20 66  ck,    /* True f
0720: 6f 72 20 61 20 77 72 69 74 65 20 6c 6f 63 6b 20  or a write lock 
0730: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
0740: 2a 7a 4e 61 6d 65 20 20 2f 2a 20 4e 61 6d 65 20  *zName  /* Name 
0750: 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20  of the table to 
0760: 62 65 20 6c 6f 63 6b 65 64 20 2a 2f 0a 29 7b 0a  be locked */.){.
0770: 20 20 50 61 72 73 65 20 2a 70 54 6f 70 6c 65 76    Parse *pToplev
0780: 65 6c 20 3d 20 73 71 6c 69 74 65 33 50 61 72 73  el = sqlite3Pars
0790: 65 54 6f 70 6c 65 76 65 6c 28 70 50 61 72 73 65  eToplevel(pParse
07a0: 29 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e  );.  int i;.  in
07b0: 74 20 6e 42 79 74 65 73 3b 0a 20 20 54 61 62 6c  t nBytes;.  Tabl
07c0: 65 4c 6f 63 6b 20 2a 70 3b 0a 20 20 61 73 73 65  eLock *p;.  asse
07d0: 72 74 28 20 69 44 62 3e 3d 30 20 29 3b 0a 0a 20  rt( iDb>=0 );.. 
07e0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 6f 70   for(i=0; i<pTop
07f0: 6c 65 76 65 6c 2d 3e 6e 54 61 62 6c 65 4c 6f 63  level->nTableLoc
0800: 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70 20 3d  k; i++){.    p =
0810: 20 26 70 54 6f 70 6c 65 76 65 6c 2d 3e 61 54 61   &pToplevel->aTa
0820: 62 6c 65 4c 6f 63 6b 5b 69 5d 3b 0a 20 20 20 20  bleLock[i];.    
0830: 69 66 28 20 70 2d 3e 69 44 62 3d 3d 69 44 62 20  if( p->iDb==iDb 
0840: 26 26 20 70 2d 3e 69 54 61 62 3d 3d 69 54 61 62  && p->iTab==iTab
0850: 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 69 73 57   ){.      p->isW
0860: 72 69 74 65 4c 6f 63 6b 20 3d 20 28 70 2d 3e 69  riteLock = (p->i
0870: 73 57 72 69 74 65 4c 6f 63 6b 20 7c 7c 20 69 73  sWriteLock || is
0880: 57 72 69 74 65 4c 6f 63 6b 29 3b 0a 20 20 20 20  WriteLock);.    
0890: 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a    return;.    }.
08a0: 20 20 7d 0a 0a 20 20 6e 42 79 74 65 73 20 3d 20    }..  nBytes = 
08b0: 73 69 7a 65 6f 66 28 54 61 62 6c 65 4c 6f 63 6b  sizeof(TableLock
08c0: 29 20 2a 20 28 70 54 6f 70 6c 65 76 65 6c 2d 3e  ) * (pToplevel->
08d0: 6e 54 61 62 6c 65 4c 6f 63 6b 2b 31 29 3b 0a 20  nTableLock+1);. 
08e0: 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 61 54 61 62   pToplevel->aTab
08f0: 6c 65 4c 6f 63 6b 20 3d 0a 20 20 20 20 20 20 73  leLock =.      s
0900: 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 4f  qlite3DbReallocO
0910: 72 46 72 65 65 28 70 54 6f 70 6c 65 76 65 6c 2d  rFree(pToplevel-
0920: 3e 64 62 2c 20 70 54 6f 70 6c 65 76 65 6c 2d 3e  >db, pToplevel->
0930: 61 54 61 62 6c 65 4c 6f 63 6b 2c 20 6e 42 79 74  aTableLock, nByt
0940: 65 73 29 3b 0a 20 20 69 66 28 20 70 54 6f 70 6c  es);.  if( pTopl
0950: 65 76 65 6c 2d 3e 61 54 61 62 6c 65 4c 6f 63 6b  evel->aTableLock
0960: 20 29 7b 0a 20 20 20 20 70 20 3d 20 26 70 54 6f   ){.    p = &pTo
0970: 70 6c 65 76 65 6c 2d 3e 61 54 61 62 6c 65 4c 6f  plevel->aTableLo
0980: 63 6b 5b 70 54 6f 70 6c 65 76 65 6c 2d 3e 6e 54  ck[pToplevel->nT
0990: 61 62 6c 65 4c 6f 63 6b 2b 2b 5d 3b 0a 20 20 20  ableLock++];.   
09a0: 20 70 2d 3e 69 44 62 20 3d 20 69 44 62 3b 0a 20   p->iDb = iDb;. 
09b0: 20 20 20 70 2d 3e 69 54 61 62 20 3d 20 69 54 61     p->iTab = iTa
09c0: 62 3b 0a 20 20 20 20 70 2d 3e 69 73 57 72 69 74  b;.    p->isWrit
09d0: 65 4c 6f 63 6b 20 3d 20 69 73 57 72 69 74 65 4c  eLock = isWriteL
09e0: 6f 63 6b 3b 0a 20 20 20 20 70 2d 3e 7a 4e 61 6d  ock;.    p->zNam
09f0: 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20 7d 65 6c  e = zName;.  }el
0a00: 73 65 7b 0a 20 20 20 20 70 54 6f 70 6c 65 76 65  se{.    pTopleve
0a10: 6c 2d 3e 6e 54 61 62 6c 65 4c 6f 63 6b 20 3d 20  l->nTableLock = 
0a20: 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 6f  0;.    sqlite3Oo
0a30: 6d 46 61 75 6c 74 28 70 54 6f 70 6c 65 76 65 6c  mFault(pToplevel
0a40: 2d 3e 64 62 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  ->db);.  }.}../*
0a50: 0a 2a 2a 20 43 6f 64 65 20 61 6e 20 4f 50 5f 54  .** Code an OP_T
0a60: 61 62 6c 65 4c 6f 63 6b 20 69 6e 73 74 72 75 63  ableLock instruc
0a70: 74 69 6f 6e 20 66 6f 72 20 65 61 63 68 20 74 61  tion for each ta
0a80: 62 6c 65 20 6c 6f 63 6b 65 64 20 62 79 20 74 68  ble locked by th
0a90: 65 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 28  e.** statement (
0aa0: 63 6f 6e 66 69 67 75 72 65 64 20 62 79 20 63 61  configured by ca
0ab0: 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 54 61  lls to sqlite3Ta
0ac0: 62 6c 65 4c 6f 63 6b 28 29 29 2e 0a 2a 2f 0a 73  bleLock())..*/.s
0ad0: 74 61 74 69 63 20 76 6f 69 64 20 63 6f 64 65 54  tatic void codeT
0ae0: 61 62 6c 65 4c 6f 63 6b 73 28 50 61 72 73 65 20  ableLocks(Parse 
0af0: 2a 70 50 61 72 73 65 29 7b 0a 20 20 69 6e 74 20  *pParse){.  int 
0b00: 69 3b 0a 20 20 56 64 62 65 20 2a 70 56 64 62 65  i;.  Vdbe *pVdbe
0b10: 3b 20 0a 0a 20 20 70 56 64 62 65 20 3d 20 73 71  ; ..  pVdbe = sq
0b20: 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
0b30: 72 73 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20  rse);.  assert( 
0b40: 70 56 64 62 65 21 3d 30 20 29 3b 20 2f 2a 20 73  pVdbe!=0 ); /* s
0b50: 71 6c 69 74 65 33 47 65 74 56 64 62 65 20 63 61  qlite3GetVdbe ca
0b60: 6e 6e 6f 74 20 66 61 69 6c 3a 20 56 44 42 45 20  nnot fail: VDBE 
0b70: 61 6c 72 65 61 64 79 20 61 6c 6c 6f 63 61 74 65  already allocate
0b80: 64 20 2a 2f 0a 0a 20 20 66 6f 72 28 69 3d 30 3b  d */..  for(i=0;
0b90: 20 69 3c 70 50 61 72 73 65 2d 3e 6e 54 61 62 6c   i<pParse->nTabl
0ba0: 65 4c 6f 63 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20  eLock; i++){.   
0bb0: 20 54 61 62 6c 65 4c 6f 63 6b 20 2a 70 20 3d 20   TableLock *p = 
0bc0: 26 70 50 61 72 73 65 2d 3e 61 54 61 62 6c 65 4c  &pParse->aTableL
0bd0: 6f 63 6b 5b 69 5d 3b 0a 20 20 20 20 69 6e 74 20  ock[i];.    int 
0be0: 70 31 20 3d 20 70 2d 3e 69 44 62 3b 0a 20 20 20  p1 = p->iDb;.   
0bf0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
0c00: 70 34 28 70 56 64 62 65 2c 20 4f 50 5f 54 61 62  p4(pVdbe, OP_Tab
0c10: 6c 65 4c 6f 63 6b 2c 20 70 31 2c 20 70 2d 3e 69  leLock, p1, p->i
0c20: 54 61 62 2c 20 70 2d 3e 69 73 57 72 69 74 65 4c  Tab, p->isWriteL
0c30: 6f 63 6b 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ock,.           
0c40: 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 7a 4e             p->zN
0c50: 61 6d 65 2c 20 50 34 5f 53 54 41 54 49 43 29 3b  ame, P4_STATIC);
0c60: 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 20 20 23  .  }.}.#else.  #
0c70: 64 65 66 69 6e 65 20 63 6f 64 65 54 61 62 6c 65  define codeTable
0c80: 4c 6f 63 6b 73 28 78 29 0a 23 65 6e 64 69 66 0a  Locks(x).#endif.
0c90: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52  ./*.** Return TR
0ca0: 55 45 20 69 66 20 74 68 65 20 67 69 76 65 6e 20  UE if the given 
0cb0: 79 44 62 4d 61 73 6b 20 6f 62 6a 65 63 74 20 69  yDbMask object i
0cc0: 73 20 65 6d 70 74 79 20 2d 20 69 66 20 69 74 20  s empty - if it 
0cd0: 63 6f 6e 74 61 69 6e 73 20 6e 6f 0a 2a 2a 20 31  contains no.** 1
0ce0: 20 62 69 74 73 2e 20 20 54 68 69 73 20 72 6f 75   bits.  This rou
0cf0: 74 69 6e 65 20 69 73 20 75 73 65 64 20 62 79 20  tine is used by 
0d00: 74 68 65 20 44 62 4d 61 73 6b 41 6c 6c 5a 65 72  the DbMaskAllZer
0d10: 6f 28 29 20 61 6e 64 20 44 62 4d 61 73 6b 4e 6f  o() and DbMaskNo
0d20: 74 5a 65 72 6f 28 29 0a 2a 2a 20 6d 61 63 72 6f  tZero().** macro
0d30: 73 20 77 68 65 6e 20 53 51 4c 49 54 45 5f 4d 41  s when SQLITE_MA
0d40: 58 5f 41 54 54 41 43 48 45 44 20 69 73 20 67 72  X_ATTACHED is gr
0d50: 65 61 74 65 72 20 74 68 61 6e 20 33 30 2e 0a 2a  eater than 30..*
0d60: 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  /.#if SQLITE_MAX
0d70: 5f 41 54 54 41 43 48 45 44 3e 33 30 0a 69 6e 74  _ATTACHED>30.int
0d80: 20 73 71 6c 69 74 65 33 44 62 4d 61 73 6b 41 6c   sqlite3DbMaskAl
0d90: 6c 5a 65 72 6f 28 79 44 62 4d 61 73 6b 20 6d 29  lZero(yDbMask m)
0da0: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72  {.  int i;.  for
0db0: 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 79  (i=0; i<sizeof(y
0dc0: 44 62 4d 61 73 6b 29 3b 20 69 2b 2b 29 20 69 66  DbMask); i++) if
0dd0: 28 20 6d 5b 69 5d 20 29 20 72 65 74 75 72 6e 20  ( m[i] ) return 
0de0: 30 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d  0;.  return 1;.}
0df0: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54  .#endif../*.** T
0e00: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
0e10: 61 6c 6c 65 64 20 61 66 74 65 72 20 61 20 73 69  alled after a si
0e20: 6e 67 6c 65 20 53 51 4c 20 73 74 61 74 65 6d 65  ngle SQL stateme
0e30: 6e 74 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20 70  nt has been.** p
0e40: 61 72 73 65 64 20 61 6e 64 20 61 20 56 44 42 45  arsed and a VDBE
0e50: 20 70 72 6f 67 72 61 6d 20 74 6f 20 65 78 65 63   program to exec
0e60: 75 74 65 20 74 68 61 74 20 73 74 61 74 65 6d 65  ute that stateme
0e70: 6e 74 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20 70  nt has been.** p
0e80: 72 65 70 61 72 65 64 2e 20 20 54 68 69 73 20 72  repared.  This r
0e90: 6f 75 74 69 6e 65 20 70 75 74 73 20 74 68 65 20  outine puts the 
0ea0: 66 69 6e 69 73 68 69 6e 67 20 74 6f 75 63 68 65  finishing touche
0eb0: 73 20 6f 6e 20 74 68 65 0a 2a 2a 20 56 44 42 45  s on the.** VDBE
0ec0: 20 70 72 6f 67 72 61 6d 20 61 6e 64 20 72 65 73   program and res
0ed0: 65 74 73 20 74 68 65 20 70 50 61 72 73 65 20 73  ets the pParse s
0ee0: 74 72 75 63 74 75 72 65 20 66 6f 72 20 74 68 65  tructure for the
0ef0: 20 6e 65 78 74 0a 2a 2a 20 70 61 72 73 65 2e 0a   next.** parse..
0f00: 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20  **.** Note that 
0f10: 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  if an error occu
0f20: 72 72 65 64 2c 20 69 74 20 6d 69 67 68 74 20 62  rred, it might b
0f30: 65 20 74 68 65 20 63 61 73 65 20 74 68 61 74 0a  e the case that.
0f40: 2a 2a 20 6e 6f 20 56 44 42 45 20 63 6f 64 65 20  ** no VDBE code 
0f50: 77 61 73 20 67 65 6e 65 72 61 74 65 64 2e 0a 2a  was generated..*
0f60: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 46 69  /.void sqlite3Fi
0f70: 6e 69 73 68 43 6f 64 69 6e 67 28 50 61 72 73 65  nishCoding(Parse
0f80: 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 73 71 6c   *pParse){.  sql
0f90: 69 74 65 33 20 2a 64 62 3b 0a 20 20 56 64 62 65  ite3 *db;.  Vdbe
0fa0: 20 2a 76 3b 0a 0a 20 20 61 73 73 65 72 74 28 20   *v;..  assert( 
0fb0: 70 50 61 72 73 65 2d 3e 70 54 6f 70 6c 65 76 65  pParse->pTopleve
0fc0: 6c 3d 3d 30 20 29 3b 0a 20 20 64 62 20 3d 20 70  l==0 );.  db = p
0fd0: 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28  Parse->db;.  if(
0fe0: 20 70 50 61 72 73 65 2d 3e 6e 65 73 74 65 64 20   pParse->nested 
0ff0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
1000: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
1010: 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72   || pParse->nErr
1020: 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61 72   ){.    if( pPar
1030: 73 65 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  se->rc==SQLITE_O
1040: 4b 20 29 20 70 50 61 72 73 65 2d 3e 72 63 20 3d  K ) pParse->rc =
1050: 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
1060: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a     return;.  }..
1070: 20 20 2f 2a 20 42 65 67 69 6e 20 62 79 20 67 65    /* Begin by ge
1080: 6e 65 72 61 74 69 6e 67 20 73 6f 6d 65 20 74 65  nerating some te
1090: 72 6d 69 6e 61 74 69 6f 6e 20 63 6f 64 65 20 61  rmination code a
10a0: 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
10b0: 0a 20 20 2a 2a 20 76 64 62 65 20 70 72 6f 67 72  .  ** vdbe progr
10c0: 61 6d 0a 20 20 2a 2f 0a 20 20 76 20 3d 20 73 71  am.  */.  v = sq
10d0: 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
10e0: 72 73 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20  rse);.  assert( 
10f0: 21 70 50 61 72 73 65 2d 3e 69 73 4d 75 6c 74 69  !pParse->isMulti
1100: 57 72 69 74 65 20 0a 20 20 20 20 20 20 20 7c 7c  Write .       ||
1110: 20 73 71 6c 69 74 65 33 56 64 62 65 41 73 73 65   sqlite3VdbeAsse
1120: 72 74 4d 61 79 41 62 6f 72 74 28 76 2c 20 70 50  rtMayAbort(v, pP
1130: 61 72 73 65 2d 3e 6d 61 79 41 62 6f 72 74 29 29  arse->mayAbort))
1140: 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20  ;.  if( v ){.   
1150: 20 77 68 69 6c 65 28 20 73 71 6c 69 74 65 33 56   while( sqlite3V
1160: 64 62 65 44 65 6c 65 74 65 50 72 69 6f 72 4f 70  dbeDeletePriorOp
1170: 63 6f 64 65 28 76 2c 20 4f 50 5f 43 6c 6f 73 65  code(v, OP_Close
1180: 29 20 29 7b 7d 0a 20 20 20 20 73 71 6c 69 74 65  ) ){}.    sqlite
1190: 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f  3VdbeAddOp0(v, O
11a0: 50 5f 48 61 6c 74 29 3b 0a 0a 23 69 66 20 53 51  P_Halt);..#if SQ
11b0: 4c 49 54 45 5f 55 53 45 52 5f 41 55 54 48 45 4e  LITE_USER_AUTHEN
11c0: 54 49 43 41 54 49 4f 4e 0a 20 20 20 20 69 66 28  TICATION.    if(
11d0: 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 6c 65 4c   pParse->nTableL
11e0: 6f 63 6b 3e 30 20 26 26 20 64 62 2d 3e 69 6e 69  ock>0 && db->ini
11f0: 74 2e 62 75 73 79 3d 3d 30 20 29 7b 0a 20 20 20  t.busy==0 ){.   
1200: 20 20 20 73 71 6c 69 74 65 33 55 73 65 72 41 75     sqlite3UserAu
1210: 74 68 49 6e 69 74 28 64 62 29 3b 0a 20 20 20 20  thInit(db);.    
1220: 20 20 69 66 28 20 64 62 2d 3e 61 75 74 68 2e 61    if( db->auth.a
1230: 75 74 68 4c 65 76 65 6c 3c 55 41 55 54 48 5f 55  uthLevel<UAUTH_U
1240: 73 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ser ){.        p
1250: 50 61 72 73 65 2d 3e 72 63 20 3d 20 53 51 4c 49  Parse->rc = SQLI
1260: 54 45 5f 41 55 54 48 5f 55 53 45 52 3b 0a 20 20  TE_AUTH_USER;.  
1270: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
1280: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 75  orMsg(pParse, "u
1290: 73 65 72 20 6e 6f 74 20 61 75 74 68 65 6e 74 69  ser not authenti
12a0: 63 61 74 65 64 22 29 3b 0a 20 20 20 20 20 20 20  cated");.       
12b0: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d   return;.      }
12c0: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  .    }.#endif.. 
12d0: 20 20 20 2f 2a 20 54 68 65 20 63 6f 6f 6b 69 65     /* The cookie
12e0: 20 6d 61 73 6b 20 63 6f 6e 74 61 69 6e 73 20 6f   mask contains o
12f0: 6e 65 20 62 69 74 20 66 6f 72 20 65 61 63 68 20  ne bit for each 
1300: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6f 70  database file op
1310: 65 6e 2e 0a 20 20 20 20 2a 2a 20 28 42 69 74 20  en..    ** (Bit 
1320: 30 20 69 73 20 66 6f 72 20 6d 61 69 6e 2c 20 62  0 is for main, b
1330: 69 74 20 31 20 69 73 20 66 6f 72 20 74 65 6d 70  it 1 is for temp
1340: 2c 20 61 6e 64 20 73 6f 20 66 6f 72 74 68 2e 29  , and so forth.)
1350: 20 20 42 69 74 73 20 61 72 65 0a 20 20 20 20 2a    Bits are.    *
1360: 2a 20 73 65 74 20 66 6f 72 20 65 61 63 68 20 64  * set for each d
1370: 61 74 61 62 61 73 65 20 74 68 61 74 20 69 73 20  atabase that is 
1380: 75 73 65 64 2e 20 20 47 65 6e 65 72 61 74 65 20  used.  Generate 
1390: 63 6f 64 65 20 74 6f 20 73 74 61 72 74 20 61 0a  code to start a.
13a0: 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69      ** transacti
13b0: 6f 6e 20 6f 6e 20 65 61 63 68 20 75 73 65 64 20  on on each used 
13c0: 64 61 74 61 62 61 73 65 20 61 6e 64 20 74 6f 20  database and to 
13d0: 76 65 72 69 66 79 20 74 68 65 20 73 63 68 65 6d  verify the schem
13e0: 61 20 63 6f 6f 6b 69 65 0a 20 20 20 20 2a 2a 20  a cookie.    ** 
13f0: 6f 6e 20 65 61 63 68 20 75 73 65 64 20 64 61 74  on each used dat
1400: 61 62 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20  abase..    */.  
1410: 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
1420: 46 61 69 6c 65 64 3d 3d 30 20 0a 20 20 20 20 20  Failed==0 .     
1430: 26 26 20 28 44 62 4d 61 73 6b 4e 6f 6e 5a 65 72  && (DbMaskNonZer
1440: 6f 28 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65  o(pParse->cookie
1450: 4d 61 73 6b 29 20 7c 7c 20 70 50 61 72 73 65 2d  Mask) || pParse-
1460: 3e 70 43 6f 6e 73 74 45 78 70 72 29 0a 20 20 20  >pConstExpr).   
1470: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 44   ){.      int iD
1480: 62 2c 20 69 3b 0a 20 20 20 20 20 20 61 73 73 65  b, i;.      asse
1490: 72 74 28 20 73 71 6c 69 74 65 33 56 64 62 65 47  rt( sqlite3VdbeG
14a0: 65 74 4f 70 28 76 2c 20 30 29 2d 3e 6f 70 63 6f  etOp(v, 0)->opco
14b0: 64 65 3d 3d 4f 50 5f 49 6e 69 74 20 29 3b 0a 20  de==OP_Init );. 
14c0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
14d0: 4a 75 6d 70 48 65 72 65 28 76 2c 20 30 29 3b 0a  JumpHere(v, 0);.
14e0: 20 20 20 20 20 20 66 6f 72 28 69 44 62 3d 30 3b        for(iDb=0;
14f0: 20 69 44 62 3c 64 62 2d 3e 6e 44 62 3b 20 69 44   iDb<db->nDb; iD
1500: 62 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66  b++){.        if
1510: 28 20 44 62 4d 61 73 6b 54 65 73 74 28 70 50 61  ( DbMaskTest(pPa
1520: 72 73 65 2d 3e 63 6f 6f 6b 69 65 4d 61 73 6b 2c  rse->cookieMask,
1530: 20 69 44 62 29 3d 3d 30 20 29 20 63 6f 6e 74 69   iDb)==0 ) conti
1540: 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  nue;.        sql
1550: 69 74 65 33 56 64 62 65 55 73 65 73 42 74 72 65  ite3VdbeUsesBtre
1560: 65 28 76 2c 20 69 44 62 29 3b 0a 20 20 20 20 20  e(v, iDb);.     
1570: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1580: 64 4f 70 34 49 6e 74 28 76 2c 0a 20 20 20 20 20  dOp4Int(v,.     
1590: 20 20 20 20 20 4f 50 5f 54 72 61 6e 73 61 63 74       OP_Transact
15a0: 69 6f 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20  ion,            
15b0: 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 63 6f 64          /* Opcod
15c0: 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69  e */.          i
15d0: 44 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  Db,             
15e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15f0: 20 20 2f 2a 20 50 31 20 2a 2f 0a 20 20 20 20 20    /* P1 */.     
1600: 20 20 20 20 20 44 62 4d 61 73 6b 54 65 73 74 28       DbMaskTest(
1610: 70 50 61 72 73 65 2d 3e 77 72 69 74 65 4d 61 73  pParse->writeMas
1620: 6b 2c 69 44 62 29 2c 20 2f 2a 20 50 32 20 2a 2f  k,iDb), /* P2 */
1630: 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 72 73  .          pPars
1640: 65 2d 3e 63 6f 6f 6b 69 65 56 61 6c 75 65 5b 69  e->cookieValue[i
1650: 44 62 5d 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  Db],          /*
1660: 20 50 33 20 2a 2f 0a 20 20 20 20 20 20 20 20 20   P3 */.         
1670: 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53   db->aDb[iDb].pS
1680: 63 68 65 6d 61 2d 3e 69 47 65 6e 65 72 61 74 69  chema->iGenerati
1690: 6f 6e 20 20 2f 2a 20 50 34 20 2a 2f 0a 20 20 20  on  /* P4 */.   
16a0: 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20       );.        
16b0: 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73  if( db->init.bus
16c0: 79 3d 3d 30 20 29 20 73 71 6c 69 74 65 33 56 64  y==0 ) sqlite3Vd
16d0: 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 31 29  beChangeP5(v, 1)
16e0: 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f  ;.        VdbeCo
16f0: 6d 6d 65 6e 74 28 28 76 2c 0a 20 20 20 20 20 20  mment((v,.      
1700: 20 20 20 20 20 20 20 20 22 75 73 65 73 53 74 6d          "usesStm
1710: 74 4a 6f 75 72 6e 61 6c 3d 25 64 22 2c 20 70 50  tJournal=%d", pP
1720: 61 72 73 65 2d 3e 6d 61 79 41 62 6f 72 74 20 26  arse->mayAbort &
1730: 26 20 70 50 61 72 73 65 2d 3e 69 73 4d 75 6c 74  & pParse->isMult
1740: 69 57 72 69 74 65 29 29 3b 0a 20 20 20 20 20 20  iWrite));.      
1750: 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
1760: 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
1770: 4c 45 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  LE.      for(i=0
1780: 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e 56 74 61  ; i<pParse->nVta
1790: 62 4c 6f 63 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20  bLock; i++){.   
17a0: 20 20 20 20 20 63 68 61 72 20 2a 76 74 61 62 20       char *vtab 
17b0: 3d 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65  = (char *)sqlite
17c0: 33 47 65 74 56 54 61 62 6c 65 28 64 62 2c 20 70  3GetVTable(db, p
17d0: 50 61 72 73 65 2d 3e 61 70 56 74 61 62 4c 6f 63  Parse->apVtabLoc
17e0: 6b 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 73  k[i]);.        s
17f0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
1800: 28 76 2c 20 4f 50 5f 56 42 65 67 69 6e 2c 20 30  (v, OP_VBegin, 0
1810: 2c 20 30 2c 20 30 2c 20 76 74 61 62 2c 20 50 34  , 0, 0, vtab, P4
1820: 5f 56 54 41 42 29 3b 0a 20 20 20 20 20 20 7d 0a  _VTAB);.      }.
1830: 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 56        pParse->nV
1840: 74 61 62 4c 6f 63 6b 20 3d 20 30 3b 0a 23 65 6e  tabLock = 0;.#en
1850: 64 69 66 0a 0a 20 20 20 20 20 20 2f 2a 20 4f 6e  dif..      /* On
1860: 63 65 20 61 6c 6c 20 74 68 65 20 63 6f 6f 6b 69  ce all the cooki
1870: 65 73 20 68 61 76 65 20 62 65 65 6e 20 76 65 72  es have been ver
1880: 69 66 69 65 64 20 61 6e 64 20 74 72 61 6e 73 61  ified and transa
1890: 63 74 69 6f 6e 73 20 6f 70 65 6e 65 64 2c 20 0a  ctions opened, .
18a0: 20 20 20 20 20 20 2a 2a 20 6f 62 74 61 69 6e 20        ** obtain 
18b0: 74 68 65 20 72 65 71 75 69 72 65 64 20 74 61 62  the required tab
18c0: 6c 65 2d 6c 6f 63 6b 73 2e 20 54 68 69 73 20 69  le-locks. This i
18d0: 73 20 61 20 6e 6f 2d 6f 70 20 75 6e 6c 65 73 73  s a no-op unless
18e0: 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 73   the .      ** s
18f0: 68 61 72 65 64 2d 63 61 63 68 65 20 66 65 61 74  hared-cache feat
1900: 75 72 65 20 69 73 20 65 6e 61 62 6c 65 64 2e 0a  ure is enabled..
1910: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 63        */.      c
1920: 6f 64 65 54 61 62 6c 65 4c 6f 63 6b 73 28 70 50  odeTableLocks(pP
1930: 61 72 73 65 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  arse);..      /*
1940: 20 49 6e 69 74 69 61 6c 69 7a 65 20 61 6e 79 20   Initialize any 
1950: 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 20 64 61  AUTOINCREMENT da
1960: 74 61 20 73 74 72 75 63 74 75 72 65 73 20 72 65  ta structures re
1970: 71 75 69 72 65 64 2e 0a 20 20 20 20 20 20 2a 2f  quired..      */
1980: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 41 75  .      sqlite3Au
1990: 74 6f 69 6e 63 72 65 6d 65 6e 74 42 65 67 69 6e  toincrementBegin
19a0: 28 70 50 61 72 73 65 29 3b 0a 0a 20 20 20 20 20  (pParse);..     
19b0: 20 2f 2a 20 43 6f 64 65 20 63 6f 6e 73 74 61 6e   /* Code constan
19c0: 74 20 65 78 70 72 65 73 73 69 6f 6e 73 20 74 68  t expressions th
19d0: 61 74 20 77 68 65 72 65 20 66 61 63 74 6f 72 65  at where factore
19e0: 64 20 6f 75 74 20 6f 66 20 69 6e 6e 65 72 20 6c  d out of inner l
19f0: 6f 6f 70 73 20 2a 2f 0a 20 20 20 20 20 20 69 66  oops */.      if
1a00: 28 20 70 50 61 72 73 65 2d 3e 70 43 6f 6e 73 74  ( pParse->pConst
1a10: 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20  Expr ){.        
1a20: 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 20 3d 20  ExprList *pEL = 
1a30: 70 50 61 72 73 65 2d 3e 70 43 6f 6e 73 74 45 78  pParse->pConstEx
1a40: 70 72 3b 0a 20 20 20 20 20 20 20 20 70 50 61 72  pr;.        pPar
1a50: 73 65 2d 3e 6f 6b 43 6f 6e 73 74 46 61 63 74 6f  se->okConstFacto
1a60: 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 66  r = 0;.        f
1a70: 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c 2d 3e 6e  or(i=0; i<pEL->n
1a80: 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
1a90: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
1aa0: 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45  rCode(pParse, pE
1ab0: 4c 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 70  L->a[i].pExpr, p
1ac0: 45 4c 2d 3e 61 5b 69 5d 2e 75 2e 69 43 6f 6e 73  EL->a[i].u.iCons
1ad0: 74 45 78 70 72 52 65 67 29 3b 0a 20 20 20 20 20  tExprReg);.     
1ae0: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20     }.      }..  
1af0: 20 20 20 20 2f 2a 20 46 69 6e 61 6c 6c 79 2c 20      /* Finally, 
1b00: 6a 75 6d 70 20 62 61 63 6b 20 74 6f 20 74 68 65  jump back to the
1b10: 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68   beginning of th
1b20: 65 20 65 78 65 63 75 74 61 62 6c 65 20 63 6f 64  e executable cod
1b30: 65 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69  e. */.      sqli
1b40: 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 31  te3VdbeGoto(v, 1
1b50: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 0a 20  );.    }.  }... 
1b60: 20 2f 2a 20 47 65 74 20 74 68 65 20 56 44 42 45   /* Get the VDBE
1b70: 20 70 72 6f 67 72 61 6d 20 72 65 61 64 79 20 66   program ready f
1b80: 6f 72 20 65 78 65 63 75 74 69 6f 6e 0a 20 20 2a  or execution.  *
1b90: 2f 0a 20 20 69 66 28 20 76 20 26 26 20 70 50 61  /.  if( v && pPa
1ba0: 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 26 26 20  rse->nErr==0 && 
1bb0: 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  !db->mallocFaile
1bc0: 64 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  d ){.    assert(
1bd0: 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65 4c   pParse->iCacheL
1be0: 65 76 65 6c 3d 3d 30 20 29 3b 20 20 2f 2a 20 44  evel==0 );  /* D
1bf0: 69 73 61 62 6c 65 73 20 61 6e 64 20 72 65 2d 65  isables and re-e
1c00: 6e 61 62 6c 65 73 20 6d 61 74 63 68 20 2a 2f 0a  nables match */.
1c10: 20 20 20 20 2f 2a 20 41 20 6d 69 6e 69 6d 75 6d      /* A minimum
1c20: 20 6f 66 20 6f 6e 65 20 63 75 72 73 6f 72 20 69   of one cursor i
1c30: 73 20 72 65 71 75 69 72 65 64 20 69 66 20 61 75  s required if au
1c40: 74 6f 69 6e 63 72 65 6d 65 6e 74 20 69 73 20 75  toincrement is u
1c50: 73 65 64 0a 20 20 20 20 2a 20 20 53 65 65 20 74  sed.    *  See t
1c60: 69 63 6b 65 74 20 5b 61 36 39 36 33 37 39 63 31  icket [a696379c1
1c70: 66 30 38 38 36 36 5d 20 2a 2f 0a 20 20 20 20 69  f08866] */.    i
1c80: 66 28 20 70 50 61 72 73 65 2d 3e 70 41 69 6e 63  f( pParse->pAinc
1c90: 21 3d 30 20 26 26 20 70 50 61 72 73 65 2d 3e 6e  !=0 && pParse->n
1ca0: 54 61 62 3d 3d 30 20 29 20 70 50 61 72 73 65 2d  Tab==0 ) pParse-
1cb0: 3e 6e 54 61 62 20 3d 20 31 3b 0a 20 20 20 20 73  >nTab = 1;.    s
1cc0: 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 52 65  qlite3VdbeMakeRe
1cd0: 61 64 79 28 76 2c 20 70 50 61 72 73 65 29 3b 0a  ady(v, pParse);.
1ce0: 20 20 20 20 70 50 61 72 73 65 2d 3e 72 63 20 3d      pParse->rc =
1cf0: 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20   SQLITE_DONE;.  
1d00: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 72 73  }else{.    pPars
1d10: 65 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 45  e->rc = SQLITE_E
1d20: 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  RROR;.  }..  /* 
1d30: 57 65 20 61 72 65 20 64 6f 6e 65 20 77 69 74 68  We are done with
1d40: 20 74 68 69 73 20 50 61 72 73 65 20 6f 62 6a 65   this Parse obje
1d50: 63 74 2e 20 54 68 65 72 65 20 69 73 20 6e 6f 20  ct. There is no 
1d60: 6e 65 65 64 20 74 6f 20 64 65 2d 69 6e 69 74 69  need to de-initi
1d70: 61 6c 69 7a 65 20 69 74 20 2a 2f 0a 23 69 66 20  alize it */.#if 
1d80: 30 0a 20 20 70 50 61 72 73 65 2d 3e 63 6f 6c 4e  0.  pParse->colN
1d90: 61 6d 65 73 53 65 74 20 3d 20 30 3b 0a 20 20 70  amesSet = 0;.  p
1da0: 50 61 72 73 65 2d 3e 6e 54 61 62 20 3d 20 30 3b  Parse->nTab = 0;
1db0: 0a 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20  .  pParse->nMem 
1dc0: 3d 20 30 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e  = 0;.  pParse->n
1dd0: 53 65 74 20 3d 20 30 3b 0a 20 20 70 50 61 72 73  Set = 0;.  pPars
1de0: 65 2d 3e 6e 56 61 72 20 3d 20 30 3b 0a 20 20 44  e->nVar = 0;.  D
1df0: 62 4d 61 73 6b 5a 65 72 6f 28 70 50 61 72 73 65  bMaskZero(pParse
1e00: 2d 3e 63 6f 6f 6b 69 65 4d 61 73 6b 29 3b 0a 23  ->cookieMask);.#
1e10: 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  endif.}../*.** R
1e20: 75 6e 20 74 68 65 20 70 61 72 73 65 72 20 61 6e  un the parser an
1e30: 64 20 63 6f 64 65 20 67 65 6e 65 72 61 74 6f 72  d code generator
1e40: 20 72 65 63 75 72 73 69 76 65 6c 79 20 69 6e 20   recursively in 
1e50: 6f 72 64 65 72 20 74 6f 20 67 65 6e 65 72 61 74  order to generat
1e60: 65 0a 2a 2a 20 63 6f 64 65 20 66 6f 72 20 74 68  e.** code for th
1e70: 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20  e SQL statement 
1e80: 67 69 76 65 6e 20 6f 6e 74 6f 20 74 68 65 20 65  given onto the e
1e90: 6e 64 20 6f 66 20 74 68 65 20 70 50 61 72 73 65  nd of the pParse
1ea0: 20 63 6f 6e 74 65 78 74 0a 2a 2a 20 63 75 72 72   context.** curr
1eb0: 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73  ently under cons
1ec0: 74 72 75 63 74 69 6f 6e 2e 20 20 57 68 65 6e 20  truction.  When 
1ed0: 74 68 65 20 70 61 72 73 65 72 20 69 73 20 72 75  the parser is ru
1ee0: 6e 20 72 65 63 75 72 73 69 76 65 6c 79 0a 2a 2a  n recursively.**
1ef0: 20 74 68 69 73 20 77 61 79 2c 20 74 68 65 20 66   this way, the f
1f00: 69 6e 61 6c 20 4f 50 5f 48 61 6c 74 20 69 73 20  inal OP_Halt is 
1f10: 6e 6f 74 20 61 70 70 65 6e 64 65 64 20 61 6e 64  not appended and
1f20: 20 6f 74 68 65 72 20 69 6e 69 74 69 61 6c 69 7a   other initializ
1f30: 61 74 69 6f 6e 0a 2a 2a 20 61 6e 64 20 66 69 6e  ation.** and fin
1f40: 61 6c 69 7a 61 74 69 6f 6e 20 73 74 65 70 73 20  alization steps 
1f50: 61 72 65 20 6f 6d 69 74 74 65 64 20 62 65 63 61  are omitted beca
1f60: 75 73 65 20 74 68 6f 73 65 20 61 72 65 20 68 61  use those are ha
1f70: 6e 64 6c 69 6e 67 20 62 79 20 74 68 65 0a 2a 2a  ndling by the.**
1f80: 20 6f 75 74 65 72 6d 6f 73 74 20 70 61 72 73 65   outermost parse
1f90: 72 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 20 65 76 65  r..**.** Not eve
1fa0: 72 79 74 68 69 6e 67 20 69 73 20 6e 65 73 74 61  rything is nesta
1fb0: 62 6c 65 2e 20 20 54 68 69 73 20 66 61 63 69 6c  ble.  This facil
1fc0: 69 74 79 20 69 73 20 64 65 73 69 67 6e 65 64 20  ity is designed 
1fd0: 74 6f 20 70 65 72 6d 69 74 0a 2a 2a 20 49 4e 53  to permit.** INS
1fe0: 45 52 54 2c 20 55 50 44 41 54 45 2c 20 61 6e 64  ERT, UPDATE, and
1ff0: 20 44 45 4c 45 54 45 20 6f 70 65 72 61 74 69 6f   DELETE operatio
2000: 6e 73 20 61 67 61 69 6e 73 74 20 53 51 4c 49 54  ns against SQLIT
2010: 45 5f 4d 41 53 54 45 52 2e 20 20 55 73 65 0a 2a  E_MASTER.  Use.*
2020: 2a 20 63 61 72 65 20 69 66 20 79 6f 75 20 64 65  * care if you de
2030: 63 69 64 65 20 74 6f 20 74 72 79 20 74 6f 20 75  cide to try to u
2040: 73 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  se this routine 
2050: 66 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 20 70  for some other p
2060: 75 72 70 6f 73 65 73 2e 0a 2a 2f 0a 76 6f 69 64  urposes..*/.void
2070: 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61   sqlite3NestedPa
2080: 72 73 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  rse(Parse *pPars
2090: 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  e, const char *z
20a0: 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20  Format, ...){.  
20b0: 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 63 68  va_list ap;.  ch
20c0: 61 72 20 2a 7a 53 71 6c 3b 0a 20 20 63 68 61 72  ar *zSql;.  char
20d0: 20 2a 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20   *zErrMsg = 0;. 
20e0: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
20f0: 50 61 72 73 65 2d 3e 64 62 3b 0a 23 20 64 65 66  Parse->db;.# def
2100: 69 6e 65 20 53 41 56 45 5f 53 5a 20 20 28 73 69  ine SAVE_SZ  (si
2110: 7a 65 6f 66 28 50 61 72 73 65 29 20 2d 20 6f 66  zeof(Parse) - of
2120: 66 73 65 74 6f 66 28 50 61 72 73 65 2c 6e 56 61  fsetof(Parse,nVa
2130: 72 29 29 0a 20 20 63 68 61 72 20 73 61 76 65 42  r)).  char saveB
2140: 75 66 5b 53 41 56 45 5f 53 5a 5d 3b 0a 0a 20 20  uf[SAVE_SZ];..  
2150: 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  if( pParse->nErr
2160: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73   ) return;.  ass
2170: 65 72 74 28 20 70 50 61 72 73 65 2d 3e 6e 65 73  ert( pParse->nes
2180: 74 65 64 3c 31 30 20 29 3b 20 20 2f 2a 20 4e 65  ted<10 );  /* Ne
2190: 73 74 69 6e 67 20 73 68 6f 75 6c 64 20 6f 6e 6c  sting should onl
21a0: 79 20 62 65 20 6f 66 20 6c 69 6d 69 74 65 64 20  y be of limited 
21b0: 64 65 70 74 68 20 2a 2f 0a 20 20 76 61 5f 73 74  depth */.  va_st
21c0: 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61 74 29  art(ap, zFormat)
21d0: 3b 0a 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74  ;.  zSql = sqlit
21e0: 65 33 56 4d 50 72 69 6e 74 66 28 64 62 2c 20 7a  e3VMPrintf(db, z
21f0: 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20 76  Format, ap);.  v
2200: 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 69 66 28  a_end(ap);.  if(
2210: 20 7a 53 71 6c 3d 3d 30 20 29 7b 0a 20 20 20 20   zSql==0 ){.    
2220: 72 65 74 75 72 6e 3b 20 20 20 2f 2a 20 41 20 6d  return;   /* A m
2230: 61 6c 6c 6f 63 20 6d 75 73 74 20 68 61 76 65 20  alloc must have 
2240: 66 61 69 6c 65 64 20 2a 2f 0a 20 20 7d 0a 20 20  failed */.  }.  
2250: 70 50 61 72 73 65 2d 3e 6e 65 73 74 65 64 2b 2b  pParse->nested++
2260: 3b 0a 20 20 6d 65 6d 63 70 79 28 73 61 76 65 42  ;.  memcpy(saveB
2270: 75 66 2c 20 26 70 50 61 72 73 65 2d 3e 6e 56 61  uf, &pParse->nVa
2280: 72 2c 20 53 41 56 45 5f 53 5a 29 3b 0a 20 20 6d  r, SAVE_SZ);.  m
2290: 65 6d 73 65 74 28 26 70 50 61 72 73 65 2d 3e 6e  emset(&pParse->n
22a0: 56 61 72 2c 20 30 2c 20 53 41 56 45 5f 53 5a 29  Var, 0, SAVE_SZ)
22b0: 3b 0a 20 20 73 71 6c 69 74 65 33 52 75 6e 50 61  ;.  sqlite3RunPa
22c0: 72 73 65 72 28 70 50 61 72 73 65 2c 20 7a 53 71  rser(pParse, zSq
22d0: 6c 2c 20 26 7a 45 72 72 4d 73 67 29 3b 0a 20 20  l, &zErrMsg);.  
22e0: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
22f0: 2c 20 7a 45 72 72 4d 73 67 29 3b 0a 20 20 73 71  , zErrMsg);.  sq
2300: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
2310: 7a 53 71 6c 29 3b 0a 20 20 6d 65 6d 63 70 79 28  zSql);.  memcpy(
2320: 26 70 50 61 72 73 65 2d 3e 6e 56 61 72 2c 20 73  &pParse->nVar, s
2330: 61 76 65 42 75 66 2c 20 53 41 56 45 5f 53 5a 29  aveBuf, SAVE_SZ)
2340: 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 65 73 74  ;.  pParse->nest
2350: 65 64 2d 2d 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c  ed--;.}..#if SQL
2360: 49 54 45 5f 55 53 45 52 5f 41 55 54 48 45 4e 54  ITE_USER_AUTHENT
2370: 49 43 41 54 49 4f 4e 0a 2f 2a 0a 2a 2a 20 52 65  ICATION./*.** Re
2380: 74 75 72 6e 20 54 52 55 45 20 69 66 20 7a 54 61  turn TRUE if zTa
2390: 62 6c 65 20 69 73 20 74 68 65 20 6e 61 6d 65 20  ble is the name 
23a0: 6f 66 20 74 68 65 20 73 79 73 74 65 6d 20 74 61  of the system ta
23b0: 62 6c 65 20 74 68 61 74 20 73 74 6f 72 65 73 20  ble that stores 
23c0: 74 68 65 0a 2a 2a 20 6c 69 73 74 20 6f 66 20 75  the.** list of u
23d0: 73 65 72 73 20 61 6e 64 20 74 68 65 69 72 20 61  sers and their a
23e0: 63 63 65 73 73 20 63 72 65 64 65 6e 74 69 61 6c  ccess credential
23f0: 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  s..*/.int sqlite
2400: 33 55 73 65 72 41 75 74 68 54 61 62 6c 65 28 63  3UserAuthTable(c
2410: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62 6c  onst char *zTabl
2420: 65 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c  e){.  return sql
2430: 69 74 65 33 5f 73 74 72 69 63 6d 70 28 7a 54 61  ite3_stricmp(zTa
2440: 62 6c 65 2c 20 22 73 71 6c 69 74 65 5f 75 73 65  ble, "sqlite_use
2450: 72 22 29 3d 3d 30 3b 0a 7d 0a 23 65 6e 64 69 66  r")==0;.}.#endif
2460: 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61 74 65 20 74  ../*.** Locate t
2470: 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 73 74 72  he in-memory str
2480: 75 63 74 75 72 65 20 74 68 61 74 20 64 65 73 63  ucture that desc
2490: 72 69 62 65 73 20 61 20 70 61 72 74 69 63 75 6c  ribes a particul
24a0: 61 72 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 74  ar database.** t
24b0: 61 62 6c 65 20 67 69 76 65 6e 20 74 68 65 20 6e  able given the n
24c0: 61 6d 65 20 6f 66 20 74 68 61 74 20 74 61 62 6c  ame of that tabl
24d0: 65 20 61 6e 64 20 28 6f 70 74 69 6f 6e 61 6c 6c  e and (optionall
24e0: 79 29 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  y) the name of t
24f0: 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 63  he.** database c
2500: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 74 61  ontaining the ta
2510: 62 6c 65 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c  ble.  Return NUL
2520: 4c 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a  L if not found..
2530: 2a 2a 0a 2a 2a 20 49 66 20 7a 44 61 74 61 62 61  **.** If zDataba
2540: 73 65 20 69 73 20 30 2c 20 61 6c 6c 20 64 61 74  se is 0, all dat
2550: 61 62 61 73 65 73 20 61 72 65 20 73 65 61 72 63  abases are searc
2560: 68 65 64 20 66 6f 72 20 74 68 65 20 74 61 62 6c  hed for the tabl
2570: 65 20 61 6e 64 20 74 68 65 0a 2a 2a 20 66 69 72  e and the.** fir
2580: 73 74 20 6d 61 74 63 68 69 6e 67 20 74 61 62 6c  st matching tabl
2590: 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 20  e is returned.  
25a0: 28 4e 6f 20 63 68 65 63 6b 69 6e 67 20 66 6f 72  (No checking for
25b0: 20 64 75 70 6c 69 63 61 74 65 20 74 61 62 6c 65   duplicate table
25c0: 0a 2a 2a 20 6e 61 6d 65 73 20 69 73 20 64 6f 6e  .** names is don
25d0: 65 2e 29 20 20 54 68 65 20 73 65 61 72 63 68 20  e.)  The search 
25e0: 6f 72 64 65 72 20 69 73 20 54 45 4d 50 20 66 69  order is TEMP fi
25f0: 72 73 74 2c 20 74 68 65 6e 20 4d 41 49 4e 2c 20  rst, then MAIN, 
2600: 74 68 65 6e 20 61 6e 79 0a 2a 2a 20 61 75 78 69  then any.** auxi
2610: 6c 69 61 72 79 20 64 61 74 61 62 61 73 65 73 20  liary databases 
2620: 61 64 64 65 64 20 75 73 69 6e 67 20 74 68 65 20  added using the 
2630: 41 54 54 41 43 48 20 63 6f 6d 6d 61 6e 64 2e 0a  ATTACH command..
2640: 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20 73  **.** See also s
2650: 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62 6c  qlite3LocateTabl
2660: 65 28 29 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a 73  e()..*/.Table *s
2670: 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28  qlite3FindTable(
2680: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e  sqlite3 *db, con
2690: 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20  st char *zName, 
26a0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 61 74  const char *zDat
26b0: 61 62 61 73 65 29 7b 0a 20 20 54 61 62 6c 65 20  abase){.  Table 
26c0: 2a 70 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b  *p = 0;.  int i;
26d0: 0a 0a 20 20 2f 2a 20 41 6c 6c 20 6d 75 74 65 78  ..  /* All mutex
26e0: 65 73 20 61 72 65 20 72 65 71 75 69 72 65 64 20  es are required 
26f0: 66 6f 72 20 73 63 68 65 6d 61 20 61 63 63 65 73  for schema acces
2700: 73 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 77 65  s.  Make sure we
2710: 20 68 6f 6c 64 20 74 68 65 6d 2e 20 2a 2f 0a 20   hold them. */. 
2720: 20 61 73 73 65 72 74 28 20 7a 44 61 74 61 62 61   assert( zDataba
2730: 73 65 21 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33  se!=0 || sqlite3
2740: 42 74 72 65 65 48 6f 6c 64 73 41 6c 6c 4d 75 74  BtreeHoldsAllMut
2750: 65 78 65 73 28 64 62 29 20 29 3b 0a 23 69 66 20  exes(db) );.#if 
2760: 53 51 4c 49 54 45 5f 55 53 45 52 5f 41 55 54 48  SQLITE_USER_AUTH
2770: 45 4e 54 49 43 41 54 49 4f 4e 0a 20 20 2f 2a 20  ENTICATION.  /* 
2780: 4f 6e 6c 79 20 74 68 65 20 61 64 6d 69 6e 20 75  Only the admin u
2790: 73 65 72 20 69 73 20 61 6c 6c 6f 77 65 64 20 74  ser is allowed t
27a0: 6f 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65 20  o know that the 
27b0: 73 71 6c 69 74 65 5f 75 73 65 72 20 74 61 62 6c  sqlite_user tabl
27c0: 65 0a 20 20 2a 2a 20 65 78 69 73 74 73 20 2a 2f  e.  ** exists */
27d0: 0a 20 20 69 66 28 20 64 62 2d 3e 61 75 74 68 2e  .  if( db->auth.
27e0: 61 75 74 68 4c 65 76 65 6c 3c 55 41 55 54 48 5f  authLevel<UAUTH_
27f0: 41 64 6d 69 6e 20 26 26 20 73 71 6c 69 74 65 33  Admin && sqlite3
2800: 55 73 65 72 41 75 74 68 54 61 62 6c 65 28 7a 4e  UserAuthTable(zN
2810: 61 6d 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 72  ame)!=0 ){.    r
2820: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 23 65 6e  eturn 0;.  }.#en
2830: 64 69 66 0a 20 20 66 6f 72 28 69 3d 4f 4d 49 54  dif.  for(i=OMIT
2840: 5f 54 45 4d 50 44 42 3b 20 69 3c 64 62 2d 3e 6e  _TEMPDB; i<db->n
2850: 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e  Db; i++){.    in
2860: 74 20 6a 20 3d 20 28 69 3c 32 29 20 3f 20 69 5e  t j = (i<2) ? i^
2870: 31 20 3a 20 69 3b 20 20 20 2f 2a 20 53 65 61 72  1 : i;   /* Sear
2880: 63 68 20 54 45 4d 50 20 62 65 66 6f 72 65 20 4d  ch TEMP before M
2890: 41 49 4e 20 2a 2f 0a 20 20 20 20 69 66 28 20 7a  AIN */.    if( z
28a0: 44 61 74 61 62 61 73 65 21 3d 30 20 26 26 20 73  Database!=0 && s
28b0: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 44  qlite3StrICmp(zD
28c0: 61 74 61 62 61 73 65 2c 20 64 62 2d 3e 61 44 62  atabase, db->aDb
28d0: 5b 6a 5d 2e 7a 4e 61 6d 65 29 20 29 20 63 6f 6e  [j].zName) ) con
28e0: 74 69 6e 75 65 3b 0a 20 20 20 20 61 73 73 65 72  tinue;.    asser
28f0: 74 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61  t( sqlite3Schema
2900: 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20 6a 2c  MutexHeld(db, j,
2910: 20 30 29 20 29 3b 0a 20 20 20 20 70 20 3d 20 73   0) );.    p = s
2920: 71 6c 69 74 65 33 48 61 73 68 46 69 6e 64 28 26  qlite3HashFind(&
2930: 64 62 2d 3e 61 44 62 5b 6a 5d 2e 70 53 63 68 65  db->aDb[j].pSche
2940: 6d 61 2d 3e 74 62 6c 48 61 73 68 2c 20 7a 4e 61  ma->tblHash, zNa
2950: 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 70 20 29  me);.    if( p )
2960: 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65   break;.  }.  re
2970: 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn p;.}../*.**
2980: 20 4c 6f 63 61 74 65 20 74 68 65 20 69 6e 2d 6d   Locate the in-m
2990: 65 6d 6f 72 79 20 73 74 72 75 63 74 75 72 65 20  emory structure 
29a0: 74 68 61 74 20 64 65 73 63 72 69 62 65 73 20 61  that describes a
29b0: 20 70 61 72 74 69 63 75 6c 61 72 20 64 61 74 61   particular data
29c0: 62 61 73 65 0a 2a 2a 20 74 61 62 6c 65 20 67 69  base.** table gi
29d0: 76 65 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  ven the name of 
29e0: 74 68 61 74 20 74 61 62 6c 65 20 61 6e 64 20 28  that table and (
29f0: 6f 70 74 69 6f 6e 61 6c 6c 79 29 20 74 68 65 20  optionally) the 
2a00: 6e 61 6d 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64  name of the.** d
2a10: 61 74 61 62 61 73 65 20 63 6f 6e 74 61 69 6e 69  atabase containi
2a20: 6e 67 20 74 68 65 20 74 61 62 6c 65 2e 20 20 52  ng the table.  R
2a30: 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 6e 6f  eturn NULL if no
2a40: 74 20 66 6f 75 6e 64 2e 20 20 41 6c 73 6f 20 6c  t found.  Also l
2a50: 65 61 76 65 20 61 6e 0a 2a 2a 20 65 72 72 6f 72  eave an.** error
2a60: 20 6d 65 73 73 61 67 65 20 69 6e 20 70 50 61 72   message in pPar
2a70: 73 65 2d 3e 7a 45 72 72 4d 73 67 2e 0a 2a 2a 0a  se->zErrMsg..**.
2a80: 2a 2a 20 54 68 65 20 64 69 66 66 65 72 65 6e 63  ** The differenc
2a90: 65 20 62 65 74 77 65 65 6e 20 74 68 69 73 20 72  e between this r
2aa0: 6f 75 74 69 6e 65 20 61 6e 64 20 73 71 6c 69 74  outine and sqlit
2ab0: 65 33 46 69 6e 64 54 61 62 6c 65 28 29 20 69 73  e3FindTable() is
2ac0: 20 74 68 61 74 20 74 68 69 73 0a 2a 2a 20 72 6f   that this.** ro
2ad0: 75 74 69 6e 65 20 6c 65 61 76 65 73 20 61 6e 20  utine leaves an 
2ae0: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e  error message in
2af0: 20 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67   pParse->zErrMsg
2b00: 20 77 68 65 72 65 0a 2a 2a 20 73 71 6c 69 74 65   where.** sqlite
2b10: 33 46 69 6e 64 54 61 62 6c 65 28 29 20 64 6f 65  3FindTable() doe
2b20: 73 20 6e 6f 74 2e 0a 2a 2f 0a 54 61 62 6c 65 20  s not..*/.Table 
2b30: 2a 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61  *sqlite3LocateTa
2b40: 62 6c 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ble(.  Parse *pP
2b50: 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 2f 2a  arse,         /*
2b60: 20 63 6f 6e 74 65 78 74 20 69 6e 20 77 68 69 63   context in whic
2b70: 68 20 74 6f 20 72 65 70 6f 72 74 20 65 72 72 6f  h to report erro
2b80: 72 73 20 2a 2f 0a 20 20 69 6e 74 20 69 73 56 69  rs */.  int isVi
2b90: 65 77 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  ew,            /
2ba0: 2a 20 54 72 75 65 20 69 66 20 6c 6f 6f 6b 69 6e  * True if lookin
2bb0: 67 20 66 6f 72 20 61 20 56 49 45 57 20 72 61 74  g for a VIEW rat
2bc0: 68 65 72 20 74 68 61 6e 20 61 20 54 41 42 4c 45  her than a TABLE
2bd0: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
2be0: 20 2a 7a 4e 61 6d 65 2c 20 20 20 20 20 2f 2a 20   *zName,     /* 
2bf0: 4e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c  Name of the tabl
2c00: 65 20 77 65 20 61 72 65 20 6c 6f 6f 6b 69 6e 67  e we are looking
2c10: 20 66 6f 72 20 2a 2f 0a 20 20 63 6f 6e 73 74 20   for */.  const 
2c20: 63 68 61 72 20 2a 7a 44 62 61 73 65 20 20 20 20  char *zDbase    
2c30: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
2c40: 64 61 74 61 62 61 73 65 2e 20 20 4d 69 67 68 74  database.  Might
2c50: 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20   be NULL */.){. 
2c60: 20 54 61 62 6c 65 20 2a 70 3b 0a 0a 20 20 2f 2a   Table *p;..  /*
2c70: 20 52 65 61 64 20 74 68 65 20 64 61 74 61 62 61   Read the databa
2c80: 73 65 20 73 63 68 65 6d 61 2e 20 49 66 20 61 6e  se schema. If an
2c90: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 6c   error occurs, l
2ca0: 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65  eave an error me
2cb0: 73 73 61 67 65 0a 20 20 2a 2a 20 61 6e 64 20 63  ssage.  ** and c
2cc0: 6f 64 65 20 69 6e 20 70 50 61 72 73 65 20 61 6e  ode in pParse an
2cd0: 64 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 20 2a  d return NULL. *
2ce0: 2f 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f  /.  if( SQLITE_O
2cf0: 4b 21 3d 73 71 6c 69 74 65 33 52 65 61 64 53 63  K!=sqlite3ReadSc
2d00: 68 65 6d 61 28 70 50 61 72 73 65 29 20 29 7b 0a  hema(pParse) ){.
2d10: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
2d20: 7d 0a 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33  }..  p = sqlite3
2d30: 46 69 6e 64 54 61 62 6c 65 28 70 50 61 72 73 65  FindTable(pParse
2d40: 2d 3e 64 62 2c 20 7a 4e 61 6d 65 2c 20 7a 44 62  ->db, zName, zDb
2d50: 61 73 65 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30  ase);.  if( p==0
2d60: 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68   ){.    const ch
2d70: 61 72 20 2a 7a 4d 73 67 20 3d 20 69 73 56 69 65  ar *zMsg = isVie
2d80: 77 20 3f 20 22 6e 6f 20 73 75 63 68 20 76 69 65  w ? "no such vie
2d90: 77 22 20 3a 20 22 6e 6f 20 73 75 63 68 20 74 61  w" : "no such ta
2da0: 62 6c 65 22 3b 0a 23 69 66 6e 64 65 66 20 53 51  ble";.#ifndef SQ
2db0: 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
2dc0: 4c 54 41 42 4c 45 0a 20 20 20 20 69 66 28 20 73  LTABLE.    if( s
2dd0: 71 6c 69 74 65 33 46 69 6e 64 44 62 4e 61 6d 65  qlite3FindDbName
2de0: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 7a 44 62  (pParse->db, zDb
2df0: 61 73 65 29 3c 31 20 29 7b 0a 20 20 20 20 20 20  ase)<1 ){.      
2e00: 2f 2a 20 49 66 20 7a 4e 61 6d 65 20 69 73 20 74  /* If zName is t
2e10: 68 65 20 6e 6f 74 20 74 68 65 20 6e 61 6d 65 20  he not the name 
2e20: 6f 66 20 61 20 74 61 62 6c 65 20 69 6e 20 74 68  of a table in th
2e30: 65 20 73 63 68 65 6d 61 20 63 72 65 61 74 65 64  e schema created
2e40: 20 75 73 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20   using.      ** 
2e50: 43 52 45 41 54 45 2c 20 74 68 65 6e 20 63 68 65  CREATE, then che
2e60: 63 6b 20 74 6f 20 73 65 65 20 69 66 20 69 74 20  ck to see if it 
2e70: 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61  is the name of a
2e80: 6e 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20  n virtual table 
2e90: 74 68 61 74 0a 20 20 20 20 20 20 2a 2a 20 63 61  that.      ** ca
2ea0: 6e 20 62 65 20 61 6e 20 65 70 6f 6e 79 6d 6f 75  n be an eponymou
2eb0: 73 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e  s virtual table.
2ec0: 20 2a 2f 0a 20 20 20 20 20 20 4d 6f 64 75 6c 65   */.      Module
2ed0: 20 2a 70 4d 6f 64 20 3d 20 28 4d 6f 64 75 6c 65   *pMod = (Module
2ee0: 2a 29 73 71 6c 69 74 65 33 48 61 73 68 46 69 6e  *)sqlite3HashFin
2ef0: 64 28 26 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61  d(&pParse->db->a
2f00: 4d 6f 64 75 6c 65 2c 20 7a 4e 61 6d 65 29 3b 0a  Module, zName);.
2f10: 20 20 20 20 20 20 69 66 28 20 70 4d 6f 64 20 26        if( pMod &
2f20: 26 20 73 71 6c 69 74 65 33 56 74 61 62 45 70 6f  & sqlite3VtabEpo
2f30: 6e 79 6d 6f 75 73 54 61 62 6c 65 49 6e 69 74 28  nymousTableInit(
2f40: 70 50 61 72 73 65 2c 20 70 4d 6f 64 29 20 29 7b  pParse, pMod) ){
2f50: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
2f60: 70 4d 6f 64 2d 3e 70 45 70 6f 54 61 62 3b 0a 20  pMod->pEpoTab;. 
2f70: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e       }.    }.#en
2f80: 64 69 66 0a 20 20 20 20 69 66 28 20 7a 44 62 61  dif.    if( zDba
2f90: 73 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  se ){.      sqli
2fa0: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
2fb0: 73 65 2c 20 22 25 73 3a 20 25 73 2e 25 73 22 2c  se, "%s: %s.%s",
2fc0: 20 7a 4d 73 67 2c 20 7a 44 62 61 73 65 2c 20 7a   zMsg, zDbase, z
2fd0: 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65  Name);.    }else
2fe0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
2ff0: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
3000: 22 25 73 3a 20 25 73 22 2c 20 7a 4d 73 67 2c 20  "%s: %s", zMsg, 
3010: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20  zName);.    }.  
3020: 20 20 70 50 61 72 73 65 2d 3e 63 68 65 63 6b 53    pParse->checkS
3030: 63 68 65 6d 61 20 3d 20 31 3b 0a 20 20 7d 0a 0a  chema = 1;.  }..
3040: 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f    return p;.}../
3050: 2a 0a 2a 2a 20 4c 6f 63 61 74 65 20 74 68 65 20  *.** Locate the 
3060: 74 61 62 6c 65 20 69 64 65 6e 74 69 66 69 65 64  table identified
3070: 20 62 79 20 2a 70 2e 0a 2a 2a 0a 2a 2a 20 54 68   by *p..**.** Th
3080: 69 73 20 69 73 20 61 20 77 72 61 70 70 65 72 20  is is a wrapper 
3090: 61 72 6f 75 6e 64 20 73 71 6c 69 74 65 33 4c 6f  around sqlite3Lo
30a0: 63 61 74 65 54 61 62 6c 65 28 29 2e 20 54 68 65  cateTable(). The
30b0: 20 64 69 66 66 65 72 65 6e 63 65 20 62 65 74 77   difference betw
30c0: 65 65 6e 0a 2a 2a 20 73 71 6c 69 74 65 33 4c 6f  een.** sqlite3Lo
30d0: 63 61 74 65 54 61 62 6c 65 28 29 20 61 6e 64 20  cateTable() and 
30e0: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
30f0: 20 74 68 61 74 20 74 68 69 73 20 66 75 6e 63 74   that this funct
3100: 69 6f 6e 20 72 65 73 74 72 69 63 74 73 0a 2a 2a  ion restricts.**
3110: 20 74 68 65 20 73 65 61 72 63 68 20 74 6f 20 73   the search to s
3120: 63 68 65 6d 61 20 28 70 2d 3e 70 53 63 68 65 6d  chema (p->pSchem
3130: 61 29 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20  a) if it is not 
3140: 4e 55 4c 4c 2e 20 70 2d 3e 70 53 63 68 65 6d 61  NULL. p->pSchema
3150: 20 6d 61 79 20 62 65 0a 2a 2a 20 6e 6f 6e 2d 4e   may be.** non-N
3160: 55 4c 4c 20 69 66 20 69 74 20 69 73 20 70 61 72  ULL if it is par
3170: 74 20 6f 66 20 61 20 76 69 65 77 20 6f 72 20 74  t of a view or t
3180: 72 69 67 67 65 72 20 70 72 6f 67 72 61 6d 20 64  rigger program d
3190: 65 66 69 6e 69 74 69 6f 6e 2e 20 53 65 65 0a 2a  efinition. See.*
31a0: 2a 20 73 71 6c 69 74 65 33 46 69 78 53 72 63 4c  * sqlite3FixSrcL
31b0: 69 73 74 28 29 20 66 6f 72 20 64 65 74 61 69 6c  ist() for detail
31c0: 73 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a 73 71 6c  s..*/.Table *sql
31d0: 69 74 65 33 4c 6f 63 61 74 65 54 61 62 6c 65 49  ite3LocateTableI
31e0: 74 65 6d 28 0a 20 20 50 61 72 73 65 20 2a 70 50  tem(.  Parse *pP
31f0: 61 72 73 65 2c 20 0a 20 20 69 6e 74 20 69 73 56  arse, .  int isV
3200: 69 65 77 2c 20 0a 20 20 73 74 72 75 63 74 20 53  iew, .  struct S
3210: 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 0a 29  rcList_item *p.)
3220: 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  {.  const char *
3230: 7a 44 62 3b 0a 20 20 61 73 73 65 72 74 28 20 70  zDb;.  assert( p
3240: 2d 3e 70 53 63 68 65 6d 61 3d 3d 30 20 7c 7c 20  ->pSchema==0 || 
3250: 70 2d 3e 7a 44 61 74 61 62 61 73 65 3d 3d 30 20  p->zDatabase==0 
3260: 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 53 63 68  );.  if( p->pSch
3270: 65 6d 61 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  ema ){.    int i
3280: 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65  Db = sqlite3Sche
3290: 6d 61 54 6f 49 6e 64 65 78 28 70 50 61 72 73 65  maToIndex(pParse
32a0: 2d 3e 64 62 2c 20 70 2d 3e 70 53 63 68 65 6d 61  ->db, p->pSchema
32b0: 29 3b 0a 20 20 20 20 7a 44 62 20 3d 20 70 50 61  );.    zDb = pPa
32c0: 72 73 65 2d 3e 64 62 2d 3e 61 44 62 5b 69 44 62  rse->db->aDb[iDb
32d0: 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 7d 65 6c 73 65  ].zName;.  }else
32e0: 7b 0a 20 20 20 20 7a 44 62 20 3d 20 70 2d 3e 7a  {.    zDb = p->z
32f0: 44 61 74 61 62 61 73 65 3b 0a 20 20 7d 0a 20 20  Database;.  }.  
3300: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 4c 6f  return sqlite3Lo
3310: 63 61 74 65 54 61 62 6c 65 28 70 50 61 72 73 65  cateTable(pParse
3320: 2c 20 69 73 56 69 65 77 2c 20 70 2d 3e 7a 4e 61  , isView, p->zNa
3330: 6d 65 2c 20 7a 44 62 29 3b 0a 7d 0a 0a 2f 2a 0a  me, zDb);.}../*.
3340: 2a 2a 20 4c 6f 63 61 74 65 20 74 68 65 20 69 6e  ** Locate the in
3350: 2d 6d 65 6d 6f 72 79 20 73 74 72 75 63 74 75 72  -memory structur
3360: 65 20 74 68 61 74 20 64 65 73 63 72 69 62 65 73  e that describes
3370: 20 0a 2a 2a 20 61 20 70 61 72 74 69 63 75 6c 61   .** a particula
3380: 72 20 69 6e 64 65 78 20 67 69 76 65 6e 20 74 68  r index given th
3390: 65 20 6e 61 6d 65 20 6f 66 20 74 68 61 74 20 69  e name of that i
33a0: 6e 64 65 78 0a 2a 2a 20 61 6e 64 20 74 68 65 20  ndex.** and the 
33b0: 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61  name of the data
33c0: 62 61 73 65 20 74 68 61 74 20 63 6f 6e 74 61 69  base that contai
33d0: 6e 73 20 74 68 65 20 69 6e 64 65 78 2e 0a 2a 2a  ns the index..**
33e0: 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20   Return NULL if 
33f0: 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2a 0a 2a 2a  not found..**.**
3400: 20 49 66 20 7a 44 61 74 61 62 61 73 65 20 69 73   If zDatabase is
3410: 20 30 2c 20 61 6c 6c 20 64 61 74 61 62 61 73 65   0, all database
3420: 73 20 61 72 65 20 73 65 61 72 63 68 65 64 20 66  s are searched f
3430: 6f 72 20 74 68 65 0a 2a 2a 20 74 61 62 6c 65 20  or the.** table 
3440: 61 6e 64 20 74 68 65 20 66 69 72 73 74 20 6d 61  and the first ma
3450: 74 63 68 69 6e 67 20 69 6e 64 65 78 20 69 73 20  tching index is 
3460: 72 65 74 75 72 6e 65 64 2e 20 20 28 4e 6f 20 63  returned.  (No c
3470: 68 65 63 6b 69 6e 67 0a 2a 2a 20 66 6f 72 20 64  hecking.** for d
3480: 75 70 6c 69 63 61 74 65 20 69 6e 64 65 78 20 6e  uplicate index n
3490: 61 6d 65 73 20 69 73 20 64 6f 6e 65 2e 29 20 20  ames is done.)  
34a0: 54 68 65 20 73 65 61 72 63 68 20 6f 72 64 65 72  The search order
34b0: 20 69 73 0a 2a 2a 20 54 45 4d 50 20 66 69 72 73   is.** TEMP firs
34c0: 74 2c 20 74 68 65 6e 20 4d 41 49 4e 2c 20 74 68  t, then MAIN, th
34d0: 65 6e 20 61 6e 79 20 61 75 78 69 6c 69 61 72 79  en any auxiliary
34e0: 20 64 61 74 61 62 61 73 65 73 20 61 64 64 65 64   databases added
34f0: 0a 2a 2a 20 75 73 69 6e 67 20 74 68 65 20 41 54  .** using the AT
3500: 54 41 43 48 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2f  TACH command..*/
3510: 0a 49 6e 64 65 78 20 2a 73 71 6c 69 74 65 33 46  .Index *sqlite3F
3520: 69 6e 64 49 6e 64 65 78 28 73 71 6c 69 74 65 33  indIndex(sqlite3
3530: 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68 61 72   *db, const char
3540: 20 2a 7a 4e 61 6d 65 2c 20 63 6f 6e 73 74 20 63   *zName, const c
3550: 68 61 72 20 2a 7a 44 62 29 7b 0a 20 20 49 6e 64  har *zDb){.  Ind
3560: 65 78 20 2a 70 20 3d 20 30 3b 0a 20 20 69 6e 74  ex *p = 0;.  int
3570: 20 69 3b 0a 20 20 2f 2a 20 41 6c 6c 20 6d 75 74   i;.  /* All mut
3580: 65 78 65 73 20 61 72 65 20 72 65 71 75 69 72 65  exes are require
3590: 64 20 66 6f 72 20 73 63 68 65 6d 61 20 61 63 63  d for schema acc
35a0: 65 73 73 2e 20 20 4d 61 6b 65 20 73 75 72 65 20  ess.  Make sure 
35b0: 77 65 20 68 6f 6c 64 20 74 68 65 6d 2e 20 2a 2f  we hold them. */
35c0: 0a 20 20 61 73 73 65 72 74 28 20 7a 44 62 21 3d  .  assert( zDb!=
35d0: 30 20 7c 7c 20 73 71 6c 69 74 65 33 42 74 72 65  0 || sqlite3Btre
35e0: 65 48 6f 6c 64 73 41 6c 6c 4d 75 74 65 78 65 73  eHoldsAllMutexes
35f0: 28 64 62 29 20 29 3b 0a 20 20 66 6f 72 28 69 3d  (db) );.  for(i=
3600: 4f 4d 49 54 5f 54 45 4d 50 44 42 3b 20 69 3c 64  OMIT_TEMPDB; i<d
3610: 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20  b->nDb; i++){.  
3620: 20 20 69 6e 74 20 6a 20 3d 20 28 69 3c 32 29 20    int j = (i<2) 
3630: 3f 20 69 5e 31 20 3a 20 69 3b 20 20 2f 2a 20 53  ? i^1 : i;  /* S
3640: 65 61 72 63 68 20 54 45 4d 50 20 62 65 66 6f 72  earch TEMP befor
3650: 65 20 4d 41 49 4e 20 2a 2f 0a 20 20 20 20 53 63  e MAIN */.    Sc
3660: 68 65 6d 61 20 2a 70 53 63 68 65 6d 61 20 3d 20  hema *pSchema = 
3670: 64 62 2d 3e 61 44 62 5b 6a 5d 2e 70 53 63 68 65  db->aDb[j].pSche
3680: 6d 61 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ma;.    assert( 
3690: 70 53 63 68 65 6d 61 20 29 3b 0a 20 20 20 20 69  pSchema );.    i
36a0: 66 28 20 7a 44 62 20 26 26 20 73 71 6c 69 74 65  f( zDb && sqlite
36b0: 33 53 74 72 49 43 6d 70 28 7a 44 62 2c 20 64 62  3StrICmp(zDb, db
36c0: 2d 3e 61 44 62 5b 6a 5d 2e 7a 4e 61 6d 65 29 20  ->aDb[j].zName) 
36d0: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
36e0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 53  assert( sqlite3S
36f0: 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64  chemaMutexHeld(d
3700: 62 2c 20 6a 2c 20 30 29 20 29 3b 0a 20 20 20 20  b, j, 0) );.    
3710: 70 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68 46  p = sqlite3HashF
3720: 69 6e 64 28 26 70 53 63 68 65 6d 61 2d 3e 69 64  ind(&pSchema->id
3730: 78 48 61 73 68 2c 20 7a 4e 61 6d 65 29 3b 0a 20  xHash, zName);. 
3740: 20 20 20 69 66 28 20 70 20 29 20 62 72 65 61 6b     if( p ) break
3750: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
3760: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6c 61  ;.}../*.** Recla
3770: 69 6d 20 74 68 65 20 6d 65 6d 6f 72 79 20 75 73  im the memory us
3780: 65 64 20 62 79 20 61 6e 20 69 6e 64 65 78 0a 2a  ed by an index.*
3790: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 72  /.static void fr
37a0: 65 65 49 6e 64 65 78 28 73 71 6c 69 74 65 33 20  eeIndex(sqlite3 
37b0: 2a 64 62 2c 20 49 6e 64 65 78 20 2a 70 29 7b 0a  *db, Index *p){.
37c0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
37d0: 4d 49 54 5f 41 4e 41 4c 59 5a 45 0a 20 20 73 71  MIT_ANALYZE.  sq
37e0: 6c 69 74 65 33 44 65 6c 65 74 65 49 6e 64 65 78  lite3DeleteIndex
37f0: 53 61 6d 70 6c 65 73 28 64 62 2c 20 70 29 3b 0a  Samples(db, p);.
3800: 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33  #endif.  sqlite3
3810: 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70  ExprDelete(db, p
3820: 2d 3e 70 50 61 72 74 49 64 78 57 68 65 72 65 29  ->pPartIdxWhere)
3830: 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c  ;.  sqlite3ExprL
3840: 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d  istDelete(db, p-
3850: 3e 61 43 6f 6c 45 78 70 72 29 3b 0a 20 20 73 71  >aColExpr);.  sq
3860: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
3870: 70 2d 3e 7a 43 6f 6c 41 66 66 29 3b 0a 20 20 69  p->zColAff);.  i
3880: 66 28 20 70 2d 3e 69 73 52 65 73 69 7a 65 64 20  f( p->isResized 
3890: 29 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28  ) sqlite3DbFree(
38a0: 64 62 2c 20 28 76 6f 69 64 20 2a 29 70 2d 3e 61  db, (void *)p->a
38b0: 7a 43 6f 6c 6c 29 3b 0a 23 69 66 64 65 66 20 53  zColl);.#ifdef S
38c0: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41  QLITE_ENABLE_STA
38d0: 54 33 5f 4f 52 5f 53 54 41 54 34 0a 20 20 73 71  T3_OR_STAT4.  sq
38e0: 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 61 69  lite3_free(p->ai
38f0: 52 6f 77 45 73 74 29 3b 0a 23 65 6e 64 69 66 0a  RowEst);.#endif.
3900: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
3910: 64 62 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  db, p);.}../*.**
3920: 20 46 6f 72 20 74 68 65 20 69 6e 64 65 78 20 63   For the index c
3930: 61 6c 6c 65 64 20 7a 49 64 78 4e 61 6d 65 20 77  alled zIdxName w
3940: 68 69 63 68 20 69 73 20 66 6f 75 6e 64 20 69 6e  hich is found in
3950: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 44   the database iD
3960: 62 2c 0a 2a 2a 20 75 6e 6c 69 6b 65 20 74 68 61  b,.** unlike tha
3970: 74 20 69 6e 64 65 78 20 66 72 6f 6d 20 69 74 73  t index from its
3980: 20 54 61 62 6c 65 20 74 68 65 6e 20 72 65 6d 6f   Table then remo
3990: 76 65 20 74 68 65 20 69 6e 64 65 78 20 66 72 6f  ve the index fro
39a0: 6d 0a 2a 2a 20 74 68 65 20 69 6e 64 65 78 20 68  m.** the index h
39b0: 61 73 68 20 74 61 62 6c 65 20 61 6e 64 20 66 72  ash table and fr
39c0: 65 65 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 73 74  ee all memory st
39d0: 72 75 63 74 75 72 65 73 20 61 73 73 6f 63 69 61  ructures associa
39e0: 74 65 64 0a 2a 2a 20 77 69 74 68 20 74 68 65 20  ted.** with the 
39f0: 69 6e 64 65 78 2e 0a 2a 2f 0a 76 6f 69 64 20 73  index..*/.void s
3a00: 71 6c 69 74 65 33 55 6e 6c 69 6e 6b 41 6e 64 44  qlite3UnlinkAndD
3a10: 65 6c 65 74 65 49 6e 64 65 78 28 73 71 6c 69 74  eleteIndex(sqlit
3a20: 65 33 20 2a 64 62 2c 20 69 6e 74 20 69 44 62 2c  e3 *db, int iDb,
3a30: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 64   const char *zId
3a40: 78 4e 61 6d 65 29 7b 0a 20 20 49 6e 64 65 78 20  xName){.  Index 
3a50: 2a 70 49 6e 64 65 78 3b 0a 20 20 48 61 73 68 20  *pIndex;.  Hash 
3a60: 2a 70 48 61 73 68 3b 0a 0a 20 20 61 73 73 65 72  *pHash;..  asser
3a70: 74 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61  t( sqlite3Schema
3a80: 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20 69 44  MutexHeld(db, iD
3a90: 62 2c 20 30 29 20 29 3b 0a 20 20 70 48 61 73 68  b, 0) );.  pHash
3aa0: 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d   = &db->aDb[iDb]
3ab0: 2e 70 53 63 68 65 6d 61 2d 3e 69 64 78 48 61 73  .pSchema->idxHas
3ac0: 68 3b 0a 20 20 70 49 6e 64 65 78 20 3d 20 73 71  h;.  pIndex = sq
3ad0: 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72 74 28  lite3HashInsert(
3ae0: 70 48 61 73 68 2c 20 7a 49 64 78 4e 61 6d 65 2c  pHash, zIdxName,
3af0: 20 30 29 3b 0a 20 20 69 66 28 20 41 4c 57 41 59   0);.  if( ALWAY
3b00: 53 28 70 49 6e 64 65 78 29 20 29 7b 0a 20 20 20  S(pIndex) ){.   
3b10: 20 69 66 28 20 70 49 6e 64 65 78 2d 3e 70 54 61   if( pIndex->pTa
3b20: 62 6c 65 2d 3e 70 49 6e 64 65 78 3d 3d 70 49 6e  ble->pIndex==pIn
3b30: 64 65 78 20 29 7b 0a 20 20 20 20 20 20 70 49 6e  dex ){.      pIn
3b40: 64 65 78 2d 3e 70 54 61 62 6c 65 2d 3e 70 49 6e  dex->pTable->pIn
3b50: 64 65 78 20 3d 20 70 49 6e 64 65 78 2d 3e 70 4e  dex = pIndex->pN
3b60: 65 78 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ext;.    }else{.
3b70: 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70 3b 0a        Index *p;.
3b80: 20 20 20 20 20 20 2f 2a 20 4a 75 73 74 69 66 69        /* Justifi
3b90: 63 61 74 69 6f 6e 20 6f 66 20 41 4c 57 41 59 53  cation of ALWAYS
3ba0: 28 29 3b 20 20 54 68 65 20 69 6e 64 65 78 20 6d  ();  The index m
3bb0: 75 73 74 20 62 65 20 6f 6e 20 74 68 65 20 6c 69  ust be on the li
3bc0: 73 74 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20 69  st of.      ** i
3bd0: 6e 64 69 63 65 73 2e 20 2a 2f 0a 20 20 20 20 20  ndices. */.     
3be0: 20 70 20 3d 20 70 49 6e 64 65 78 2d 3e 70 54 61   p = pIndex->pTa
3bf0: 62 6c 65 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20  ble->pIndex;.   
3c00: 20 20 20 77 68 69 6c 65 28 20 41 4c 57 41 59 53     while( ALWAYS
3c10: 28 70 29 20 26 26 20 70 2d 3e 70 4e 65 78 74 21  (p) && p->pNext!
3c20: 3d 70 49 6e 64 65 78 20 29 7b 20 70 20 3d 20 70  =pIndex ){ p = p
3c30: 2d 3e 70 4e 65 78 74 3b 20 7d 0a 20 20 20 20 20  ->pNext; }.     
3c40: 20 69 66 28 20 41 4c 57 41 59 53 28 70 20 26 26   if( ALWAYS(p &&
3c50: 20 70 2d 3e 70 4e 65 78 74 3d 3d 70 49 6e 64 65   p->pNext==pInde
3c60: 78 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d  x) ){.        p-
3c70: 3e 70 4e 65 78 74 20 3d 20 70 49 6e 64 65 78 2d  >pNext = pIndex-
3c80: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a  >pNext;.      }.
3c90: 20 20 20 20 7d 0a 20 20 20 20 66 72 65 65 49 6e      }.    freeIn
3ca0: 64 65 78 28 64 62 2c 20 70 49 6e 64 65 78 29 3b  dex(db, pIndex);
3cb0: 0a 20 20 7d 0a 20 20 64 62 2d 3e 66 6c 61 67 73  .  }.  db->flags
3cc0: 20 7c 3d 20 53 51 4c 49 54 45 5f 49 6e 74 65 72   |= SQLITE_Inter
3cd0: 6e 43 68 61 6e 67 65 73 3b 0a 7d 0a 0a 2f 2a 0a  nChanges;.}../*.
3ce0: 2a 2a 20 4c 6f 6f 6b 20 74 68 72 6f 75 67 68 20  ** Look through 
3cf0: 74 68 65 20 6c 69 73 74 20 6f 66 20 6f 70 65 6e  the list of open
3d00: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73 20   database files 
3d10: 69 6e 20 64 62 2d 3e 61 44 62 5b 5d 20 61 6e 64  in db->aDb[] and
3d20: 20 69 66 0a 2a 2a 20 61 6e 79 20 68 61 76 65 20   if.** any have 
3d30: 62 65 65 6e 20 63 6c 6f 73 65 64 2c 20 72 65 6d  been closed, rem
3d40: 6f 76 65 20 74 68 65 6d 20 66 72 6f 6d 20 74 68  ove them from th
3d50: 65 20 6c 69 73 74 2e 20 20 52 65 61 6c 6c 6f 63  e list.  Realloc
3d60: 61 74 65 20 74 68 65 0a 2a 2a 20 64 62 2d 3e 61  ate the.** db->a
3d70: 44 62 5b 5d 20 73 74 72 75 63 74 75 72 65 20 74  Db[] structure t
3d80: 6f 20 61 20 73 6d 61 6c 6c 65 72 20 73 69 7a 65  o a smaller size
3d90: 2c 20 69 66 20 70 6f 73 73 69 62 6c 65 2e 0a 2a  , if possible..*
3da0: 2a 0a 2a 2a 20 45 6e 74 72 79 20 30 20 28 74 68  *.** Entry 0 (th
3db0: 65 20 22 6d 61 69 6e 22 20 64 61 74 61 62 61 73  e "main" databas
3dc0: 65 29 20 61 6e 64 20 65 6e 74 72 79 20 31 20 28  e) and entry 1 (
3dd0: 74 68 65 20 22 74 65 6d 70 22 20 64 61 74 61 62  the "temp" datab
3de0: 61 73 65 29 0a 2a 2a 20 61 72 65 20 6e 65 76 65  ase).** are neve
3df0: 72 20 63 61 6e 64 69 64 61 74 65 73 20 66 6f 72  r candidates for
3e00: 20 62 65 69 6e 67 20 63 6f 6c 6c 61 70 73 65 64   being collapsed
3e10: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
3e20: 33 43 6f 6c 6c 61 70 73 65 44 61 74 61 62 61 73  3CollapseDatabas
3e30: 65 41 72 72 61 79 28 73 71 6c 69 74 65 33 20 2a  eArray(sqlite3 *
3e40: 64 62 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b  db){.  int i, j;
3e50: 0a 20 20 66 6f 72 28 69 3d 6a 3d 32 3b 20 69 3c  .  for(i=j=2; i<
3e60: 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20  db->nDb; i++){. 
3e70: 20 20 20 73 74 72 75 63 74 20 44 62 20 2a 70 44     struct Db *pD
3e80: 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 5d 3b  b = &db->aDb[i];
3e90: 0a 20 20 20 20 69 66 28 20 70 44 62 2d 3e 70 42  .    if( pDb->pB
3ea0: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  t==0 ){.      sq
3eb0: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
3ec0: 70 44 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  pDb->zName);.   
3ed0: 20 20 20 70 44 62 2d 3e 7a 4e 61 6d 65 20 3d 20     pDb->zName = 
3ee0: 30 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75  0;.      continu
3ef0: 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  e;.    }.    if(
3f00: 20 6a 3c 69 20 29 7b 0a 20 20 20 20 20 20 64 62   j<i ){.      db
3f10: 2d 3e 61 44 62 5b 6a 5d 20 3d 20 64 62 2d 3e 61  ->aDb[j] = db->a
3f20: 44 62 5b 69 5d 3b 0a 20 20 20 20 7d 0a 20 20 20  Db[i];.    }.   
3f30: 20 6a 2b 2b 3b 0a 20 20 7d 0a 20 20 64 62 2d 3e   j++;.  }.  db->
3f40: 6e 44 62 20 3d 20 6a 3b 0a 20 20 69 66 28 20 64  nDb = j;.  if( d
3f50: 62 2d 3e 6e 44 62 3c 3d 32 20 26 26 20 64 62 2d  b->nDb<=2 && db-
3f60: 3e 61 44 62 21 3d 64 62 2d 3e 61 44 62 53 74 61  >aDb!=db->aDbSta
3f70: 74 69 63 20 29 7b 0a 20 20 20 20 6d 65 6d 63 70  tic ){.    memcp
3f80: 79 28 64 62 2d 3e 61 44 62 53 74 61 74 69 63 2c  y(db->aDbStatic,
3f90: 20 64 62 2d 3e 61 44 62 2c 20 32 2a 73 69 7a 65   db->aDb, 2*size
3fa0: 6f 66 28 64 62 2d 3e 61 44 62 5b 30 5d 29 29 3b  of(db->aDb[0]));
3fb0: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
3fc0: 65 65 28 64 62 2c 20 64 62 2d 3e 61 44 62 29 3b  ee(db, db->aDb);
3fd0: 0a 20 20 20 20 64 62 2d 3e 61 44 62 20 3d 20 64  .    db->aDb = d
3fe0: 62 2d 3e 61 44 62 53 74 61 74 69 63 3b 0a 20 20  b->aDbStatic;.  
3ff0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 65 74  }.}../*.** Reset
4000: 20 74 68 65 20 73 63 68 65 6d 61 20 66 6f 72 20   the schema for 
4010: 74 68 65 20 64 61 74 61 62 61 73 65 20 61 74 20  the database at 
4020: 69 6e 64 65 78 20 69 44 62 2e 20 20 41 6c 73 6f  index iDb.  Also
4030: 20 72 65 73 65 74 20 74 68 65 0a 2a 2a 20 54 45   reset the.** TE
4040: 4d 50 20 73 63 68 65 6d 61 2e 0a 2a 2f 0a 76 6f  MP schema..*/.vo
4050: 69 64 20 73 71 6c 69 74 65 33 52 65 73 65 74 4f  id sqlite3ResetO
4060: 6e 65 53 63 68 65 6d 61 28 73 71 6c 69 74 65 33  neSchema(sqlite3
4070: 20 2a 64 62 2c 20 69 6e 74 20 69 44 62 29 7b 0a   *db, int iDb){.
4080: 20 20 44 62 20 2a 70 44 62 3b 0a 20 20 61 73 73    Db *pDb;.  ass
4090: 65 72 74 28 20 69 44 62 3c 64 62 2d 3e 6e 44 62  ert( iDb<db->nDb
40a0: 20 29 3b 0a 0a 20 20 2f 2a 20 43 61 73 65 20 31   );..  /* Case 1
40b0: 3a 20 20 52 65 73 65 74 20 74 68 65 20 73 69 6e  :  Reset the sin
40c0: 67 6c 65 20 73 63 68 65 6d 61 20 69 64 65 6e 74  gle schema ident
40d0: 69 66 69 65 64 20 62 79 20 69 44 62 20 2a 2f 0a  ified by iDb */.
40e0: 20 20 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62    pDb = &db->aDb
40f0: 5b 69 44 62 5d 3b 0a 20 20 61 73 73 65 72 74 28  [iDb];.  assert(
4100: 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75   sqlite3SchemaMu
4110: 74 65 78 48 65 6c 64 28 64 62 2c 20 69 44 62 2c  texHeld(db, iDb,
4120: 20 30 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28   0) );.  assert(
4130: 20 70 44 62 2d 3e 70 53 63 68 65 6d 61 21 3d 30   pDb->pSchema!=0
4140: 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 63 68   );.  sqlite3Sch
4150: 65 6d 61 43 6c 65 61 72 28 70 44 62 2d 3e 70 53  emaClear(pDb->pS
4160: 63 68 65 6d 61 29 3b 0a 0a 20 20 2f 2a 20 49 66  chema);..  /* If
4170: 20 61 6e 79 20 64 61 74 61 62 61 73 65 20 6f 74   any database ot
4180: 68 65 72 20 74 68 61 6e 20 54 45 4d 50 20 69 73  her than TEMP is
4190: 20 72 65 73 65 74 2c 20 74 68 65 6e 20 61 6c 73   reset, then als
41a0: 6f 20 72 65 73 65 74 20 54 45 4d 50 0a 20 20 2a  o reset TEMP.  *
41b0: 2a 20 73 69 6e 63 65 20 54 45 4d 50 20 6d 69 67  * since TEMP mig
41c0: 68 74 20 62 65 20 68 6f 6c 64 69 6e 67 20 74 72  ht be holding tr
41d0: 69 67 67 65 72 73 20 74 68 61 74 20 72 65 66 65  iggers that refe
41e0: 72 65 6e 63 65 20 74 61 62 6c 65 73 20 69 6e 20  rence tables in 
41f0: 74 68 65 0a 20 20 2a 2a 20 6f 74 68 65 72 20 64  the.  ** other d
4200: 61 74 61 62 61 73 65 2e 0a 20 20 2a 2f 0a 20 20  atabase..  */.  
4210: 69 66 28 20 69 44 62 21 3d 31 20 29 7b 0a 20 20  if( iDb!=1 ){.  
4220: 20 20 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62    pDb = &db->aDb
4230: 5b 31 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28  [1];.    assert(
4240: 20 70 44 62 2d 3e 70 53 63 68 65 6d 61 21 3d 30   pDb->pSchema!=0
4250: 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53   );.    sqlite3S
4260: 63 68 65 6d 61 43 6c 65 61 72 28 70 44 62 2d 3e  chemaClear(pDb->
4270: 70 53 63 68 65 6d 61 29 3b 0a 20 20 7d 0a 20 20  pSchema);.  }.  
4280: 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  return;.}../*.**
4290: 20 45 72 61 73 65 20 61 6c 6c 20 73 63 68 65 6d   Erase all schem
42a0: 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72  a information fr
42b0: 6f 6d 20 61 6c 6c 20 61 74 74 61 63 68 65 64 20  om all attached 
42c0: 64 61 74 61 62 61 73 65 73 20 28 69 6e 63 6c 75  databases (inclu
42d0: 64 69 6e 67 0a 2a 2a 20 22 6d 61 69 6e 22 20 61  ding.** "main" a
42e0: 6e 64 20 22 74 65 6d 70 22 29 20 66 6f 72 20 61  nd "temp") for a
42f0: 20 73 69 6e 67 6c 65 20 64 61 74 61 62 61 73 65   single database
4300: 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a   connection..*/.
4310: 76 6f 69 64 20 73 71 6c 69 74 65 33 52 65 73 65  void sqlite3Rese
4320: 74 41 6c 6c 53 63 68 65 6d 61 73 4f 66 43 6f 6e  tAllSchemasOfCon
4330: 6e 65 63 74 69 6f 6e 28 73 71 6c 69 74 65 33 20  nection(sqlite3 
4340: 2a 64 62 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  *db){.  int i;. 
4350: 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
4360: 65 72 41 6c 6c 28 64 62 29 3b 0a 20 20 66 6f 72  erAll(db);.  for
4370: 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b  (i=0; i<db->nDb;
4380: 20 69 2b 2b 29 7b 0a 20 20 20 20 44 62 20 2a 70   i++){.    Db *p
4390: 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 5d  Db = &db->aDb[i]
43a0: 3b 0a 20 20 20 20 69 66 28 20 70 44 62 2d 3e 70  ;.    if( pDb->p
43b0: 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 20 20  Schema ){.      
43c0: 73 71 6c 69 74 65 33 53 63 68 65 6d 61 43 6c 65  sqlite3SchemaCle
43d0: 61 72 28 70 44 62 2d 3e 70 53 63 68 65 6d 61 29  ar(pDb->pSchema)
43e0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 64 62  ;.    }.  }.  db
43f0: 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49  ->flags &= ~SQLI
4400: 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73  TE_InternChanges
4410: 3b 0a 20 20 73 71 6c 69 74 65 33 56 74 61 62 55  ;.  sqlite3VtabU
4420: 6e 6c 6f 63 6b 4c 69 73 74 28 64 62 29 3b 0a 20  nlockList(db);. 
4430: 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
4440: 76 65 41 6c 6c 28 64 62 29 3b 0a 20 20 73 71 6c  veAll(db);.  sql
4450: 69 74 65 33 43 6f 6c 6c 61 70 73 65 44 61 74 61  ite3CollapseData
4460: 62 61 73 65 41 72 72 61 79 28 64 62 29 3b 0a 7d  baseArray(db);.}
4470: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
4480: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77  tine is called w
4490: 68 65 6e 20 61 20 63 6f 6d 6d 69 74 20 6f 63 63  hen a commit occ
44a0: 75 72 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  urs..*/.void sql
44b0: 69 74 65 33 43 6f 6d 6d 69 74 49 6e 74 65 72 6e  ite3CommitIntern
44c0: 61 6c 43 68 61 6e 67 65 73 28 73 71 6c 69 74 65  alChanges(sqlite
44d0: 33 20 2a 64 62 29 7b 0a 20 20 64 62 2d 3e 66 6c  3 *db){.  db->fl
44e0: 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 49  ags &= ~SQLITE_I
44f0: 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a 7d 0a  nternChanges;.}.
4500: 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 6d 65  ./*.** Delete me
4510: 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 65 64 20 66  mory allocated f
4520: 6f 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61  or the column na
4530: 6d 65 73 20 6f 66 20 61 20 74 61 62 6c 65 20 6f  mes of a table o
4540: 72 20 76 69 65 77 20 28 74 68 65 0a 2a 2a 20 54  r view (the.** T
4550: 61 62 6c 65 2e 61 43 6f 6c 5b 5d 20 61 72 72 61  able.aCol[] arra
4560: 79 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  y)..*/.void sqli
4570: 74 65 33 44 65 6c 65 74 65 43 6f 6c 75 6d 6e 4e  te3DeleteColumnN
4580: 61 6d 65 73 28 73 71 6c 69 74 65 33 20 2a 64 62  ames(sqlite3 *db
4590: 2c 20 54 61 62 6c 65 20 2a 70 54 61 62 6c 65 29  , Table *pTable)
45a0: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 43 6f 6c  {.  int i;.  Col
45b0: 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 61 73 73  umn *pCol;.  ass
45c0: 65 72 74 28 20 70 54 61 62 6c 65 21 3d 30 20 29  ert( pTable!=0 )
45d0: 3b 0a 20 20 69 66 28 20 28 70 43 6f 6c 20 3d 20  ;.  if( (pCol = 
45e0: 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 29 21 3d 30  pTable->aCol)!=0
45f0: 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   ){.    for(i=0;
4600: 20 69 3c 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3b   i<pTable->nCol;
4610: 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20   i++, pCol++){. 
4620: 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
4630: 65 65 28 64 62 2c 20 70 43 6f 6c 2d 3e 7a 4e 61  ee(db, pCol->zNa
4640: 6d 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  me);.      sqlit
4650: 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c  e3ExprDelete(db,
4660: 20 70 43 6f 6c 2d 3e 70 44 66 6c 74 29 3b 0a 20   pCol->pDflt);. 
4670: 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
4680: 65 65 28 64 62 2c 20 70 43 6f 6c 2d 3e 7a 43 6f  ee(db, pCol->zCo
4690: 6c 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  ll);.    }.    s
46a0: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
46b0: 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 29 3b 0a   pTable->aCol);.
46c0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d    }.}../*.** Rem
46d0: 6f 76 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 64  ove the memory d
46e0: 61 74 61 20 73 74 72 75 63 74 75 72 65 73 20 61  ata structures a
46f0: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
4700: 68 65 20 67 69 76 65 6e 0a 2a 2a 20 54 61 62 6c  he given.** Tabl
4710: 65 2e 20 20 4e 6f 20 63 68 61 6e 67 65 73 20 61  e.  No changes a
4720: 72 65 20 6d 61 64 65 20 74 6f 20 64 69 73 6b 20  re made to disk 
4730: 62 79 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e  by this routine.
4740: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
4750: 69 6e 65 20 6a 75 73 74 20 64 65 6c 65 74 65 73  ine just deletes
4760: 20 74 68 65 20 64 61 74 61 20 73 74 72 75 63 74   the data struct
4770: 75 72 65 2e 20 20 49 74 20 64 6f 65 73 20 6e 6f  ure.  It does no
4780: 74 20 75 6e 6c 69 6e 6b 0a 2a 2a 20 74 68 65 20  t unlink.** the 
4790: 74 61 62 6c 65 20 64 61 74 61 20 73 74 72 75 63  table data struc
47a0: 74 75 72 65 20 66 72 6f 6d 20 74 68 65 20 68 61  ture from the ha
47b0: 73 68 20 74 61 62 6c 65 2e 20 20 42 75 74 20 69  sh table.  But i
47c0: 74 20 64 6f 65 73 20 64 65 73 74 72 6f 79 0a 2a  t does destroy.*
47d0: 2a 20 6d 65 6d 6f 72 79 20 73 74 72 75 63 74 75  * memory structu
47e0: 72 65 73 20 6f 66 20 74 68 65 20 69 6e 64 69 63  res of the indic
47f0: 65 73 20 61 6e 64 20 66 6f 72 65 69 67 6e 20 6b  es and foreign k
4800: 65 79 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  eys associated w
4810: 69 74 68 20 0a 2a 2a 20 74 68 65 20 74 61 62 6c  ith .** the tabl
4820: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 62 20  e..**.** The db 
4830: 70 61 72 61 6d 65 74 65 72 20 69 73 20 6f 70 74  parameter is opt
4840: 69 6f 6e 61 6c 2e 20 20 49 74 20 69 73 20 6e 65  ional.  It is ne
4850: 65 64 65 64 20 69 66 20 74 68 65 20 54 61 62 6c  eded if the Tabl
4860: 65 20 6f 62 6a 65 63 74 20 0a 2a 2a 20 63 6f 6e  e object .** con
4870: 74 61 69 6e 73 20 6c 6f 6f 6b 61 73 69 64 65 20  tains lookaside 
4880: 6d 65 6d 6f 72 79 2e 20 20 28 54 61 62 6c 65 20  memory.  (Table 
4890: 6f 62 6a 65 63 74 73 20 69 6e 20 74 68 65 20 73  objects in the s
48a0: 63 68 65 6d 61 20 64 6f 20 6e 6f 74 20 75 73 65  chema do not use
48b0: 0a 2a 2a 20 6c 6f 6f 6b 61 73 69 64 65 20 6d 65  .** lookaside me
48c0: 6d 6f 72 79 2c 20 62 75 74 20 73 6f 6d 65 20 65  mory, but some e
48d0: 70 68 65 6d 65 72 61 6c 20 54 61 62 6c 65 20 6f  phemeral Table o
48e0: 62 6a 65 63 74 73 20 64 6f 2e 29 20 20 4f 72 20  bjects do.)  Or 
48f0: 74 68 65 0a 2a 2a 20 64 62 20 70 61 72 61 6d 65  the.** db parame
4900: 74 65 72 20 63 61 6e 20 62 65 20 75 73 65 64 20  ter can be used 
4910: 77 69 74 68 20 64 62 2d 3e 70 6e 42 79 74 65 73  with db->pnBytes
4920: 46 72 65 65 64 20 74 6f 20 6d 65 61 73 75 72 65  Freed to measure
4930: 20 74 68 65 20 6d 65 6d 6f 72 79 0a 2a 2a 20 75   the memory.** u
4940: 73 65 64 20 62 79 20 74 68 65 20 54 61 62 6c 65  sed by the Table
4950: 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 73 74 61 74   object..*/.stat
4960: 69 63 20 76 6f 69 64 20 53 51 4c 49 54 45 5f 4e  ic void SQLITE_N
4970: 4f 49 4e 4c 49 4e 45 20 64 65 6c 65 74 65 54 61  OINLINE deleteTa
4980: 62 6c 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  ble(sqlite3 *db,
4990: 20 54 61 62 6c 65 20 2a 70 54 61 62 6c 65 29 7b   Table *pTable){
49a0: 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78  .  Index *pIndex
49b0: 2c 20 2a 70 4e 65 78 74 3b 0a 20 20 54 45 53 54  , *pNext;.  TEST
49c0: 4f 4e 4c 59 28 20 69 6e 74 20 6e 4c 6f 6f 6b 61  ONLY( int nLooka
49d0: 73 69 64 65 3b 20 29 20 2f 2a 20 55 73 65 64 20  side; ) /* Used 
49e0: 74 6f 20 76 65 72 69 66 79 20 6c 6f 6f 6b 61 73  to verify lookas
49f0: 69 64 65 20 6e 6f 74 20 75 73 65 64 20 66 6f 72  ide not used for
4a00: 20 73 63 68 65 6d 61 20 2a 2f 0a 0a 20 20 2f 2a   schema */..  /*
4a10: 20 52 65 63 6f 72 64 20 74 68 65 20 6e 75 6d 62   Record the numb
4a20: 65 72 20 6f 66 20 6f 75 74 73 74 61 6e 64 69 6e  er of outstandin
4a30: 67 20 6c 6f 6f 6b 61 73 69 64 65 20 61 6c 6c 6f  g lookaside allo
4a40: 63 61 74 69 6f 6e 73 20 69 6e 20 73 63 68 65 6d  cations in schem
4a50: 61 20 54 61 62 6c 65 73 0a 20 20 2a 2a 20 70 72  a Tables.  ** pr
4a60: 69 6f 72 20 74 6f 20 64 6f 69 6e 67 20 61 6e 79  ior to doing any
4a70: 20 66 72 65 65 28 29 20 6f 70 65 72 61 74 69 6f   free() operatio
4a80: 6e 73 2e 20 20 53 69 6e 63 65 20 73 63 68 65 6d  ns.  Since schem
4a90: 61 20 54 61 62 6c 65 73 20 64 6f 20 6e 6f 74 20  a Tables do not 
4aa0: 75 73 65 0a 20 20 2a 2a 20 6c 6f 6f 6b 61 73 69  use.  ** lookasi
4ab0: 64 65 2c 20 74 68 69 73 20 6e 75 6d 62 65 72 20  de, this number 
4ac0: 73 68 6f 75 6c 64 20 6e 6f 74 20 63 68 61 6e 67  should not chang
4ad0: 65 2e 20 2a 2f 0a 20 20 54 45 53 54 4f 4e 4c 59  e. */.  TESTONLY
4ae0: 28 20 6e 4c 6f 6f 6b 61 73 69 64 65 20 3d 20 28  ( nLookaside = (
4af0: 64 62 20 26 26 20 28 70 54 61 62 6c 65 2d 3e 74  db && (pTable->t
4b00: 61 62 46 6c 61 67 73 20 26 20 54 46 5f 45 70 68  abFlags & TF_Eph
4b10: 65 6d 65 72 61 6c 29 3d 3d 30 29 20 3f 0a 20 20  emeral)==0) ?.  
4b20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4b30: 20 20 20 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61         db->looka
4b40: 73 69 64 65 2e 6e 4f 75 74 20 3a 20 30 20 29 3b  side.nOut : 0 );
4b50: 0a 0a 20 20 2f 2a 20 44 65 6c 65 74 65 20 61 6c  ..  /* Delete al
4b60: 6c 20 69 6e 64 69 63 65 73 20 61 73 73 6f 63 69  l indices associ
4b70: 61 74 65 64 20 77 69 74 68 20 74 68 69 73 20 74  ated with this t
4b80: 61 62 6c 65 2e 20 2a 2f 0a 20 20 66 6f 72 28 70  able. */.  for(p
4b90: 49 6e 64 65 78 20 3d 20 70 54 61 62 6c 65 2d 3e  Index = pTable->
4ba0: 70 49 6e 64 65 78 3b 20 70 49 6e 64 65 78 3b 20  pIndex; pIndex; 
4bb0: 70 49 6e 64 65 78 3d 70 4e 65 78 74 29 7b 0a 20  pIndex=pNext){. 
4bc0: 20 20 20 70 4e 65 78 74 20 3d 20 70 49 6e 64 65     pNext = pInde
4bd0: 78 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 61 73  x->pNext;.    as
4be0: 73 65 72 74 28 20 70 49 6e 64 65 78 2d 3e 70 53  sert( pIndex->pS
4bf0: 63 68 65 6d 61 3d 3d 70 54 61 62 6c 65 2d 3e 70  chema==pTable->p
4c00: 53 63 68 65 6d 61 20 29 3b 0a 20 20 20 20 69 66  Schema );.    if
4c10: 28 20 21 64 62 20 7c 7c 20 64 62 2d 3e 70 6e 42  ( !db || db->pnB
4c20: 79 74 65 73 46 72 65 65 64 3d 3d 30 20 29 7b 0a  ytesFreed==0 ){.
4c30: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d        char *zNam
4c40: 65 20 3d 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d  e = pIndex->zNam
4c50: 65 3b 20 0a 20 20 20 20 20 20 54 45 53 54 4f 4e  e; .      TESTON
4c60: 4c 59 20 28 20 49 6e 64 65 78 20 2a 70 4f 6c 64  LY ( Index *pOld
4c70: 20 3d 20 29 20 73 71 6c 69 74 65 33 48 61 73 68   = ) sqlite3Hash
4c80: 49 6e 73 65 72 74 28 0a 20 20 20 20 20 20 20 20  Insert(.        
4c90: 20 26 70 49 6e 64 65 78 2d 3e 70 53 63 68 65 6d   &pIndex->pSchem
4ca0: 61 2d 3e 69 64 78 48 61 73 68 2c 20 7a 4e 61 6d  a->idxHash, zNam
4cb0: 65 2c 20 30 0a 20 20 20 20 20 20 29 3b 0a 20 20  e, 0.      );.  
4cc0: 20 20 20 20 61 73 73 65 72 74 28 20 64 62 3d 3d      assert( db==
4cd0: 30 20 7c 7c 20 73 71 6c 69 74 65 33 53 63 68 65  0 || sqlite3Sche
4ce0: 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20  maMutexHeld(db, 
4cf0: 30 2c 20 70 49 6e 64 65 78 2d 3e 70 53 63 68 65  0, pIndex->pSche
4d00: 6d 61 29 20 29 3b 0a 20 20 20 20 20 20 61 73 73  ma) );.      ass
4d10: 65 72 74 28 20 70 4f 6c 64 3d 3d 70 49 6e 64 65  ert( pOld==pInde
4d20: 78 20 7c 7c 20 70 4f 6c 64 3d 3d 30 20 29 3b 0a  x || pOld==0 );.
4d30: 20 20 20 20 7d 0a 20 20 20 20 66 72 65 65 49 6e      }.    freeIn
4d40: 64 65 78 28 64 62 2c 20 70 49 6e 64 65 78 29 3b  dex(db, pIndex);
4d50: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 65 6c 65 74  .  }..  /* Delet
4d60: 65 20 61 6e 79 20 66 6f 72 65 69 67 6e 20 6b 65  e any foreign ke
4d70: 79 73 20 61 74 74 61 63 68 65 64 20 74 6f 20 74  ys attached to t
4d80: 68 69 73 20 74 61 62 6c 65 2e 20 2a 2f 0a 20 20  his table. */.  
4d90: 73 71 6c 69 74 65 33 46 6b 44 65 6c 65 74 65 28  sqlite3FkDelete(
4da0: 64 62 2c 20 70 54 61 62 6c 65 29 3b 0a 0a 20 20  db, pTable);..  
4db0: 2f 2a 20 44 65 6c 65 74 65 20 74 68 65 20 54 61  /* Delete the Ta
4dc0: 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 69 74  ble structure it
4dd0: 73 65 6c 66 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c  self..  */.  sql
4de0: 69 74 65 33 44 65 6c 65 74 65 43 6f 6c 75 6d 6e  ite3DeleteColumn
4df0: 4e 61 6d 65 73 28 64 62 2c 20 70 54 61 62 6c 65  Names(db, pTable
4e00: 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  );.  sqlite3DbFr
4e10: 65 65 28 64 62 2c 20 70 54 61 62 6c 65 2d 3e 7a  ee(db, pTable->z
4e20: 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65 33  Name);.  sqlite3
4e30: 44 62 46 72 65 65 28 64 62 2c 20 70 54 61 62 6c  DbFree(db, pTabl
4e40: 65 2d 3e 7a 43 6f 6c 41 66 66 29 3b 0a 20 20 73  e->zColAff);.  s
4e50: 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65  qlite3SelectDele
4e60: 74 65 28 64 62 2c 20 70 54 61 62 6c 65 2d 3e 70  te(db, pTable->p
4e70: 53 65 6c 65 63 74 29 3b 0a 20 20 73 71 6c 69 74  Select);.  sqlit
4e80: 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65  e3ExprListDelete
4e90: 28 64 62 2c 20 70 54 61 62 6c 65 2d 3e 70 43 68  (db, pTable->pCh
4ea0: 65 63 6b 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  eck);.#ifndef SQ
4eb0: 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
4ec0: 4c 54 41 42 4c 45 0a 20 20 73 71 6c 69 74 65 33  LTABLE.  sqlite3
4ed0: 56 74 61 62 43 6c 65 61 72 28 64 62 2c 20 70 54  VtabClear(db, pT
4ee0: 61 62 6c 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20  able);.#endif.  
4ef0: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
4f00: 2c 20 70 54 61 62 6c 65 29 3b 0a 0a 20 20 2f 2a  , pTable);..  /*
4f10: 20 56 65 72 69 66 79 20 74 68 61 74 20 6e 6f 20   Verify that no 
4f20: 6c 6f 6f 6b 61 73 69 64 65 20 6d 65 6d 6f 72 79  lookaside memory
4f30: 20 77 61 73 20 75 73 65 64 20 62 79 20 73 63 68   was used by sch
4f40: 65 6d 61 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20  ema tables */.  
4f50: 61 73 73 65 72 74 28 20 6e 4c 6f 6f 6b 61 73 69  assert( nLookasi
4f60: 64 65 3d 3d 30 20 7c 7c 20 6e 4c 6f 6f 6b 61 73  de==0 || nLookas
4f70: 69 64 65 3d 3d 64 62 2d 3e 6c 6f 6f 6b 61 73 69  ide==db->lookasi
4f80: 64 65 2e 6e 4f 75 74 20 29 3b 0a 7d 0a 76 6f 69  de.nOut );.}.voi
4f90: 64 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54  d sqlite3DeleteT
4fa0: 61 62 6c 65 28 73 71 6c 69 74 65 33 20 2a 64 62  able(sqlite3 *db
4fb0: 2c 20 54 61 62 6c 65 20 2a 70 54 61 62 6c 65 29  , Table *pTable)
4fc0: 7b 0a 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 64 65  {.  /* Do not de
4fd0: 6c 65 74 65 20 74 68 65 20 74 61 62 6c 65 20 75  lete the table u
4fe0: 6e 74 69 6c 20 74 68 65 20 72 65 66 65 72 65 6e  ntil the referen
4ff0: 63 65 20 63 6f 75 6e 74 20 72 65 61 63 68 65 73  ce count reaches
5000: 20 7a 65 72 6f 2e 20 2a 2f 0a 20 20 69 66 28 20   zero. */.  if( 
5010: 21 70 54 61 62 6c 65 20 29 20 72 65 74 75 72 6e  !pTable ) return
5020: 3b 0a 20 20 69 66 28 20 28 28 21 64 62 20 7c 7c  ;.  if( ((!db ||
5030: 20 64 62 2d 3e 70 6e 42 79 74 65 73 46 72 65 65   db->pnBytesFree
5040: 64 3d 3d 30 29 20 26 26 20 28 2d 2d 70 54 61 62  d==0) && (--pTab
5050: 6c 65 2d 3e 6e 52 65 66 29 3e 30 29 20 29 20 72  le->nRef)>0) ) r
5060: 65 74 75 72 6e 3b 0a 20 20 64 65 6c 65 74 65 54  eturn;.  deleteT
5070: 61 62 6c 65 28 64 62 2c 20 70 54 61 62 6c 65 29  able(db, pTable)
5080: 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 69  ;.}.../*.** Unli
5090: 6e 6b 20 74 68 65 20 67 69 76 65 6e 20 74 61 62  nk the given tab
50a0: 6c 65 20 66 72 6f 6d 20 74 68 65 20 68 61 73 68  le from the hash
50b0: 20 74 61 62 6c 65 73 20 61 6e 64 20 74 68 65 20   tables and the 
50c0: 64 65 6c 65 74 65 20 74 68 65 0a 2a 2a 20 74 61  delete the.** ta
50d0: 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 77 69  ble structure wi
50e0: 74 68 20 61 6c 6c 20 69 74 73 20 69 6e 64 69 63  th all its indic
50f0: 65 73 20 61 6e 64 20 66 6f 72 65 69 67 6e 20 6b  es and foreign k
5100: 65 79 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  eys..*/.void sql
5110: 69 74 65 33 55 6e 6c 69 6e 6b 41 6e 64 44 65 6c  ite3UnlinkAndDel
5120: 65 74 65 54 61 62 6c 65 28 73 71 6c 69 74 65 33  eteTable(sqlite3
5130: 20 2a 64 62 2c 20 69 6e 74 20 69 44 62 2c 20 63   *db, int iDb, c
5140: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62 4e  onst char *zTabN
5150: 61 6d 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70  ame){.  Table *p
5160: 3b 0a 20 20 44 62 20 2a 70 44 62 3b 0a 0a 20 20  ;.  Db *pDb;..  
5170: 61 73 73 65 72 74 28 20 64 62 21 3d 30 20 29 3b  assert( db!=0 );
5180: 0a 20 20 61 73 73 65 72 74 28 20 69 44 62 3e 3d  .  assert( iDb>=
5190: 30 20 26 26 20 69 44 62 3c 64 62 2d 3e 6e 44 62  0 && iDb<db->nDb
51a0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 7a 54   );.  assert( zT
51b0: 61 62 4e 61 6d 65 20 29 3b 0a 20 20 61 73 73 65  abName );.  asse
51c0: 72 74 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d  rt( sqlite3Schem
51d0: 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20 69  aMutexHeld(db, i
51e0: 44 62 2c 20 30 29 20 29 3b 0a 20 20 74 65 73 74  Db, 0) );.  test
51f0: 63 61 73 65 28 20 7a 54 61 62 4e 61 6d 65 5b 30  case( zTabName[0
5200: 5d 3d 3d 30 20 29 3b 20 20 2f 2a 20 5a 65 72 6f  ]==0 );  /* Zero
5210: 2d 6c 65 6e 67 74 68 20 74 61 62 6c 65 20 6e 61  -length table na
5220: 6d 65 73 20 61 72 65 20 61 6c 6c 6f 77 65 64 20  mes are allowed 
5230: 2a 2f 0a 20 20 70 44 62 20 3d 20 26 64 62 2d 3e  */.  pDb = &db->
5240: 61 44 62 5b 69 44 62 5d 3b 0a 20 20 70 20 3d 20  aDb[iDb];.  p = 
5250: 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72  sqlite3HashInser
5260: 74 28 26 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d  t(&pDb->pSchema-
5270: 3e 74 62 6c 48 61 73 68 2c 20 7a 54 61 62 4e 61  >tblHash, zTabNa
5280: 6d 65 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65  me, 0);.  sqlite
5290: 33 44 65 6c 65 74 65 54 61 62 6c 65 28 64 62 2c  3DeleteTable(db,
52a0: 20 70 29 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73   p);.  db->flags
52b0: 20 7c 3d 20 53 51 4c 49 54 45 5f 49 6e 74 65 72   |= SQLITE_Inter
52c0: 6e 43 68 61 6e 67 65 73 3b 0a 7d 0a 0a 2f 2a 0a  nChanges;.}../*.
52d0: 2a 2a 20 47 69 76 65 6e 20 61 20 74 6f 6b 65 6e  ** Given a token
52e0: 2c 20 72 65 74 75 72 6e 20 61 20 73 74 72 69 6e  , return a strin
52f0: 67 20 74 68 61 74 20 63 6f 6e 73 69 73 74 73 20  g that consists 
5300: 6f 66 20 74 68 65 20 74 65 78 74 20 6f 66 20 74  of the text of t
5310: 68 61 74 0a 2a 2a 20 74 6f 6b 65 6e 2e 20 20 53  hat.** token.  S
5320: 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65  pace to hold the
5330: 20 72 65 74 75 72 6e 65 64 20 73 74 72 69 6e 67   returned string
5340: 0a 2a 2a 20 69 73 20 6f 62 74 61 69 6e 65 64 20  .** is obtained 
5350: 66 72 6f 6d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f  from sqliteMallo
5360: 63 28 29 20 61 6e 64 20 6d 75 73 74 20 62 65 20  c() and must be 
5370: 66 72 65 65 64 20 62 79 20 74 68 65 20 63 61 6c  freed by the cal
5380: 6c 69 6e 67 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  ling.** function
5390: 2e 0a 2a 2a 0a 2a 2a 20 41 6e 79 20 71 75 6f 74  ..**.** Any quot
53a0: 61 74 69 6f 6e 20 6d 61 72 6b 73 20 28 65 78 3a  ation marks (ex:
53b0: 20 20 22 6e 61 6d 65 22 2c 20 27 6e 61 6d 65 27    "name", 'name'
53c0: 2c 20 5b 6e 61 6d 65 5d 2c 20 6f 72 20 60 6e 61  , [name], or `na
53d0: 6d 65 60 29 20 74 68 61 74 0a 2a 2a 20 73 75 72  me`) that.** sur
53e0: 72 6f 75 6e 64 20 74 68 65 20 62 6f 64 79 20 6f  round the body o
53f0: 66 20 74 68 65 20 74 6f 6b 65 6e 20 61 72 65 20  f the token are 
5400: 72 65 6d 6f 76 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  removed..**.** T
5410: 6f 6b 65 6e 73 20 61 72 65 20 6f 66 74 65 6e 20  okens are often 
5420: 6a 75 73 74 20 70 6f 69 6e 74 65 72 73 20 69 6e  just pointers in
5430: 74 6f 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  to the original 
5440: 53 51 4c 20 74 65 78 74 20 61 6e 64 20 73 6f 0a  SQL text and so.
5450: 2a 2a 20 61 72 65 20 6e 6f 74 20 5c 30 30 30 20  ** are not \000 
5460: 74 65 72 6d 69 6e 61 74 65 64 20 61 6e 64 20 61  terminated and a
5470: 72 65 20 6e 6f 74 20 70 65 72 73 69 73 74 65 6e  re not persisten
5480: 74 2e 20 20 54 68 65 20 72 65 74 75 72 6e 65 64  t.  The returned
5490: 20 73 74 72 69 6e 67 0a 2a 2a 20 69 73 20 5c 30   string.** is \0
54a0: 30 30 20 74 65 72 6d 69 6e 61 74 65 64 20 61 6e  00 terminated an
54b0: 64 20 69 73 20 70 65 72 73 69 73 74 65 6e 74 2e  d is persistent.
54c0: 0a 2a 2f 0a 63 68 61 72 20 2a 73 71 6c 69 74 65  .*/.char *sqlite
54d0: 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 73  3NameFromToken(s
54e0: 71 6c 69 74 65 33 20 2a 64 62 2c 20 54 6f 6b 65  qlite3 *db, Toke
54f0: 6e 20 2a 70 4e 61 6d 65 29 7b 0a 20 20 63 68 61  n *pName){.  cha
5500: 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 69 66 28 20  r *zName;.  if( 
5510: 70 4e 61 6d 65 20 29 7b 0a 20 20 20 20 7a 4e 61  pName ){.    zNa
5520: 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  me = sqlite3DbSt
5530: 72 4e 44 75 70 28 64 62 2c 20 28 63 68 61 72 2a  rNDup(db, (char*
5540: 29 70 4e 61 6d 65 2d 3e 7a 2c 20 70 4e 61 6d 65  )pName->z, pName
5550: 2d 3e 6e 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ->n);.    sqlite
5560: 33 44 65 71 75 6f 74 65 28 7a 4e 61 6d 65 29 3b  3Dequote(zName);
5570: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 4e  .  }else{.    zN
5580: 61 6d 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72  ame = 0;.  }.  r
5590: 65 74 75 72 6e 20 7a 4e 61 6d 65 3b 0a 7d 0a 0a  eturn zName;.}..
55a0: 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 74 68 65 20 73  /*.** Open the s
55b0: 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62  qlite_master tab
55c0: 6c 65 20 73 74 6f 72 65 64 20 69 6e 20 64 61 74  le stored in dat
55d0: 61 62 61 73 65 20 6e 75 6d 62 65 72 20 69 44 62  abase number iDb
55e0: 20 66 6f 72 0a 2a 2a 20 77 72 69 74 69 6e 67 2e   for.** writing.
55f0: 20 54 68 65 20 74 61 62 6c 65 20 69 73 20 6f 70   The table is op
5600: 65 6e 65 64 20 75 73 69 6e 67 20 63 75 72 73 6f  ened using curso
5610: 72 20 30 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  r 0..*/.void sql
5620: 69 74 65 33 4f 70 65 6e 4d 61 73 74 65 72 54 61  ite3OpenMasterTa
5630: 62 6c 65 28 50 61 72 73 65 20 2a 70 2c 20 69 6e  ble(Parse *p, in
5640: 74 20 69 44 62 29 7b 0a 20 20 56 64 62 65 20 2a  t iDb){.  Vdbe *
5650: 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
5660: 62 65 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33  be(p);.  sqlite3
5670: 54 61 62 6c 65 4c 6f 63 6b 28 70 2c 20 69 44 62  TableLock(p, iDb
5680: 2c 20 4d 41 53 54 45 52 5f 52 4f 4f 54 2c 20 31  , MASTER_ROOT, 1
5690: 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69  , SCHEMA_TABLE(i
56a0: 44 62 29 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  Db));.  sqlite3V
56b0: 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20  dbeAddOp4Int(v, 
56c0: 4f 50 5f 4f 70 65 6e 57 72 69 74 65 2c 20 30 2c  OP_OpenWrite, 0,
56d0: 20 4d 41 53 54 45 52 5f 52 4f 4f 54 2c 20 69 44   MASTER_ROOT, iD
56e0: 62 2c 20 35 29 3b 0a 20 20 69 66 28 20 70 2d 3e  b, 5);.  if( p->
56f0: 6e 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 70  nTab==0 ){.    p
5700: 2d 3e 6e 54 61 62 20 3d 20 31 3b 0a 20 20 7d 0a  ->nTab = 1;.  }.
5710: 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 61 6d 65 74  }../*.** Paramet
5720: 65 72 20 7a 4e 61 6d 65 20 70 6f 69 6e 74 73 20  er zName points 
5730: 74 6f 20 61 20 6e 75 6c 2d 74 65 72 6d 69 6e 61  to a nul-termina
5740: 74 65 64 20 62 75 66 66 65 72 20 63 6f 6e 74 61  ted buffer conta
5750: 69 6e 69 6e 67 20 74 68 65 20 6e 61 6d 65 0a 2a  ining the name.*
5760: 2a 20 6f 66 20 61 20 64 61 74 61 62 61 73 65 20  * of a database 
5770: 28 22 6d 61 69 6e 22 2c 20 22 74 65 6d 70 22 20  ("main", "temp" 
5780: 6f 72 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61  or the name of a
5790: 6e 20 61 74 74 61 63 68 65 64 20 64 62 29 2e 20  n attached db). 
57a0: 54 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  This.** function
57b0: 20 72 65 74 75 72 6e 73 20 74 68 65 20 69 6e 64   returns the ind
57c0: 65 78 20 6f 66 20 74 68 65 20 6e 61 6d 65 64 20  ex of the named 
57d0: 64 61 74 61 62 61 73 65 20 69 6e 20 64 62 2d 3e  database in db->
57e0: 61 44 62 5b 5d 2c 20 6f 72 0a 2a 2a 20 2d 31 20  aDb[], or.** -1 
57f0: 69 66 20 74 68 65 20 6e 61 6d 65 64 20 64 62 20  if the named db 
5800: 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64 2e  cannot be found.
5810: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46  .*/.int sqlite3F
5820: 69 6e 64 44 62 4e 61 6d 65 28 73 71 6c 69 74 65  indDbName(sqlite
5830: 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68 61  3 *db, const cha
5840: 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69 6e 74  r *zName){.  int
5850: 20 69 20 3d 20 2d 31 3b 20 20 20 20 20 20 20 20   i = -1;        
5860: 20 2f 2a 20 44 61 74 61 62 61 73 65 20 6e 75 6d   /* Database num
5870: 62 65 72 20 2a 2f 0a 20 20 69 66 28 20 7a 4e 61  ber */.  if( zNa
5880: 6d 65 20 29 7b 0a 20 20 20 20 44 62 20 2a 70 44  me ){.    Db *pD
5890: 62 3b 0a 20 20 20 20 66 6f 72 28 69 3d 28 64 62  b;.    for(i=(db
58a0: 2d 3e 6e 44 62 2d 31 29 2c 20 70 44 62 3d 26 64  ->nDb-1), pDb=&d
58b0: 62 2d 3e 61 44 62 5b 69 5d 3b 20 69 3e 3d 30 3b  b->aDb[i]; i>=0;
58c0: 20 69 2d 2d 2c 20 70 44 62 2d 2d 29 7b 0a 20 20   i--, pDb--){.  
58d0: 20 20 20 20 69 66 28 20 30 3d 3d 73 71 6c 69 74      if( 0==sqlit
58e0: 65 33 53 74 72 49 43 6d 70 28 70 44 62 2d 3e 7a  e3StrICmp(pDb->z
58f0: 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29 20 29 20 62  Name, zName) ) b
5900: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
5910: 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d 0a 0a 2f    return i;.}../
5920: 2a 0a 2a 2a 20 54 68 65 20 74 6f 6b 65 6e 20 2a  *.** The token *
5930: 70 4e 61 6d 65 20 63 6f 6e 74 61 69 6e 73 20 74  pName contains t
5940: 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 64 61 74  he name of a dat
5950: 61 62 61 73 65 20 28 65 69 74 68 65 72 20 22 6d  abase (either "m
5960: 61 69 6e 22 20 6f 72 0a 2a 2a 20 22 74 65 6d 70  ain" or.** "temp
5970: 22 20 6f 72 20 74 68 65 20 6e 61 6d 65 20 6f 66  " or the name of
5980: 20 61 6e 20 61 74 74 61 63 68 65 64 20 64 62 29   an attached db)
5990: 2e 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72  . This routine r
59a0: 65 74 75 72 6e 73 20 74 68 65 0a 2a 2a 20 69 6e  eturns the.** in
59b0: 64 65 78 20 6f 66 20 74 68 65 20 6e 61 6d 65 64  dex of the named
59c0: 20 64 61 74 61 62 61 73 65 20 69 6e 20 64 62 2d   database in db-
59d0: 3e 61 44 62 5b 5d 2c 20 6f 72 20 2d 31 20 69 66  >aDb[], or -1 if
59e0: 20 74 68 65 20 6e 61 6d 65 64 20 64 62 20 0a 2a   the named db .*
59f0: 2a 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74  * does not exist
5a00: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
5a10: 46 69 6e 64 44 62 28 73 71 6c 69 74 65 33 20 2a  FindDb(sqlite3 *
5a20: 64 62 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65  db, Token *pName
5a30: 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20  ){.  int i;     
5a40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5a50: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74            /* Dat
5a60: 61 62 61 73 65 20 6e 75 6d 62 65 72 20 2a 2f 0a  abase number */.
5a70: 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 20 20    char *zName;  
5a80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5a90: 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 77         /* Name w
5aa0: 65 20 61 72 65 20 73 65 61 72 63 68 69 6e 67 20  e are searching 
5ab0: 66 6f 72 20 2a 2f 0a 20 20 7a 4e 61 6d 65 20 3d  for */.  zName =
5ac0: 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d   sqlite3NameFrom
5ad0: 54 6f 6b 65 6e 28 64 62 2c 20 70 4e 61 6d 65 29  Token(db, pName)
5ae0: 3b 0a 20 20 69 20 3d 20 73 71 6c 69 74 65 33 46  ;.  i = sqlite3F
5af0: 69 6e 64 44 62 4e 61 6d 65 28 64 62 2c 20 7a 4e  indDbName(db, zN
5b00: 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  ame);.  sqlite3D
5b10: 62 46 72 65 65 28 64 62 2c 20 7a 4e 61 6d 65 29  bFree(db, zName)
5b20: 3b 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d 0a  ;.  return i;.}.
5b30: 0a 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 6f 72  ./* The table or
5b40: 20 76 69 65 77 20 6f 72 20 74 72 69 67 67 65 72   view or trigger
5b50: 20 6e 61 6d 65 20 69 73 20 70 61 73 73 65 64 20   name is passed 
5b60: 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  to this routine 
5b70: 76 69 61 20 74 6f 6b 65 6e 73 0a 2a 2a 20 70 4e  via tokens.** pN
5b80: 61 6d 65 31 20 61 6e 64 20 70 4e 61 6d 65 32 2e  ame1 and pName2.
5b90: 20 49 66 20 74 68 65 20 74 61 62 6c 65 20 6e 61   If the table na
5ba0: 6d 65 20 77 61 73 20 66 75 6c 6c 79 20 71 75 61  me was fully qua
5bb0: 6c 69 66 69 65 64 2c 20 66 6f 72 20 65 78 61 6d  lified, for exam
5bc0: 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 43 52 45 41 54  ple:.**.** CREAT
5bd0: 45 20 54 41 42 4c 45 20 78 78 78 2e 79 79 79 20  E TABLE xxx.yyy 
5be0: 28 2e 2e 2e 29 3b 0a 2a 2a 20 0a 2a 2a 20 54 68  (...);.** .** Th
5bf0: 65 6e 20 70 4e 61 6d 65 31 20 69 73 20 73 65 74  en pName1 is set
5c00: 20 74 6f 20 22 78 78 78 22 20 61 6e 64 20 70 4e   to "xxx" and pN
5c10: 61 6d 65 32 20 22 79 79 79 22 2e 20 4f 6e 20 74  ame2 "yyy". On t
5c20: 68 65 20 6f 74 68 65 72 20 68 61 6e 64 20 69 66  he other hand if
5c30: 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 6e 61  .** the table na
5c40: 6d 65 20 69 73 20 6e 6f 74 20 66 75 6c 6c 79 20  me is not fully 
5c50: 71 75 61 6c 69 66 69 65 64 2c 20 69 2e 65 2e 3a  qualified, i.e.:
5c60: 0a 2a 2a 0a 2a 2a 20 43 52 45 41 54 45 20 54 41  .**.** CREATE TA
5c70: 42 4c 45 20 79 79 79 28 2e 2e 2e 29 3b 0a 2a 2a  BLE yyy(...);.**
5c80: 0a 2a 2a 20 54 68 65 6e 20 70 4e 61 6d 65 31 20  .** Then pName1 
5c90: 69 73 20 73 65 74 20 74 6f 20 22 79 79 79 22 20  is set to "yyy" 
5ca0: 61 6e 64 20 70 4e 61 6d 65 32 20 69 73 20 22 22  and pName2 is ""
5cb0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
5cc0: 74 69 6e 65 20 73 65 74 73 20 74 68 65 20 2a 70  tine sets the *p
5cd0: 70 55 6e 71 75 61 6c 20 70 6f 69 6e 74 65 72 20  pUnqual pointer 
5ce0: 74 6f 20 70 6f 69 6e 74 20 61 74 20 74 68 65 20  to point at the 
5cf0: 74 6f 6b 65 6e 20 28 70 4e 61 6d 65 31 20 6f 72  token (pName1 or
5d00: 0a 2a 2a 20 70 4e 61 6d 65 32 29 20 74 68 61 74  .** pName2) that
5d10: 20 73 74 6f 72 65 73 20 74 68 65 20 75 6e 71 75   stores the unqu
5d20: 61 6c 69 66 69 65 64 20 74 61 62 6c 65 20 6e 61  alified table na
5d30: 6d 65 2e 20 20 54 68 65 20 69 6e 64 65 78 20 6f  me.  The index o
5d40: 66 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73  f the.** databas
5d50: 65 20 22 78 78 78 22 20 69 73 20 72 65 74 75 72  e "xxx" is retur
5d60: 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ned..*/.int sqli
5d70: 74 65 33 54 77 6f 50 61 72 74 4e 61 6d 65 28 0a  te3TwoPartName(.
5d80: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
5d90: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
5da0: 20 61 6e 64 20 63 6f 64 65 20 67 65 6e 65 72 61   and code genera
5db0: 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  ting context */.
5dc0: 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c    Token *pName1,
5dd0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 22 78 78        /* The "xx
5de0: 78 22 20 69 6e 20 74 68 65 20 6e 61 6d 65 20 22  x" in the name "
5df0: 78 78 78 2e 79 79 79 22 20 6f 72 20 22 78 78 78  xxx.yyy" or "xxx
5e00: 22 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e  " */.  Token *pN
5e10: 61 6d 65 32 2c 20 20 20 20 20 20 2f 2a 20 54 68  ame2,      /* Th
5e20: 65 20 22 79 79 79 22 20 69 6e 20 74 68 65 20 6e  e "yyy" in the n
5e30: 61 6d 65 20 22 78 78 78 2e 79 79 79 22 20 2a 2f  ame "xxx.yyy" */
5e40: 0a 20 20 54 6f 6b 65 6e 20 2a 2a 70 55 6e 71 75  .  Token **pUnqu
5e50: 61 6c 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20  al     /* Write 
5e60: 74 68 65 20 75 6e 71 75 61 6c 69 66 69 65 64 20  the unqualified 
5e70: 6f 62 6a 65 63 74 20 6e 61 6d 65 20 68 65 72 65  object name here
5e80: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 44 62   */.){.  int iDb
5e90: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
5ea0: 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
5eb0: 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 6f 62 6a   holding the obj
5ec0: 65 63 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ect */.  sqlite3
5ed0: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
5ee0: 62 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4e  b;..  assert( pN
5ef0: 61 6d 65 32 21 3d 30 20 29 3b 0a 20 20 69 66 28  ame2!=0 );.  if(
5f00: 20 70 4e 61 6d 65 32 2d 3e 6e 3e 30 20 29 7b 0a   pName2->n>0 ){.
5f10: 20 20 20 20 69 66 28 20 64 62 2d 3e 69 6e 69 74      if( db->init
5f20: 2e 62 75 73 79 20 29 20 7b 0a 20 20 20 20 20 20  .busy ) {.      
5f30: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
5f40: 70 50 61 72 73 65 2c 20 22 63 6f 72 72 75 70 74  pParse, "corrupt
5f50: 20 64 61 74 61 62 61 73 65 22 29 3b 0a 20 20 20   database");.   
5f60: 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20     return -1;.  
5f70: 20 20 7d 0a 20 20 20 20 2a 70 55 6e 71 75 61 6c    }.    *pUnqual
5f80: 20 3d 20 70 4e 61 6d 65 32 3b 0a 20 20 20 20 69   = pName2;.    i
5f90: 44 62 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64  Db = sqlite3Find
5fa0: 44 62 28 64 62 2c 20 70 4e 61 6d 65 31 29 3b 0a  Db(db, pName1);.
5fb0: 20 20 20 20 69 66 28 20 69 44 62 3c 30 20 29 7b      if( iDb<0 ){
5fc0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
5fd0: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
5fe0: 75 6e 6b 6e 6f 77 6e 20 64 61 74 61 62 61 73 65  unknown database
5ff0: 20 25 54 22 2c 20 70 4e 61 6d 65 31 29 3b 0a 20   %T", pName1);. 
6000: 20 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a       return -1;.
6010: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
6020: 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 69     assert( db->i
6030: 6e 69 74 2e 69 44 62 3d 3d 30 20 7c 7c 20 64 62  nit.iDb==0 || db
6040: 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 3b 0a 20  ->init.busy );. 
6050: 20 20 20 69 44 62 20 3d 20 64 62 2d 3e 69 6e 69     iDb = db->ini
6060: 74 2e 69 44 62 3b 0a 20 20 20 20 2a 70 55 6e 71  t.iDb;.    *pUnq
6070: 75 61 6c 20 3d 20 70 4e 61 6d 65 31 3b 0a 20 20  ual = pName1;.  
6080: 7d 0a 20 20 72 65 74 75 72 6e 20 69 44 62 3b 0a  }.  return iDb;.
6090: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
60a0: 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 74 6f  utine is used to
60b0: 20 63 68 65 63 6b 20 69 66 20 74 68 65 20 55 54   check if the UT
60c0: 46 2d 38 20 73 74 72 69 6e 67 20 7a 4e 61 6d 65  F-8 string zName
60d0: 20 69 73 20 61 20 6c 65 67 61 6c 0a 2a 2a 20 75   is a legal.** u
60e0: 6e 71 75 61 6c 69 66 69 65 64 20 6e 61 6d 65 20  nqualified name 
60f0: 66 6f 72 20 61 20 6e 65 77 20 73 63 68 65 6d 61  for a new schema
6100: 20 6f 62 6a 65 63 74 20 28 74 61 62 6c 65 2c 20   object (table, 
6110: 69 6e 64 65 78 2c 20 76 69 65 77 20 6f 72 0a 2a  index, view or.*
6120: 2a 20 74 72 69 67 67 65 72 29 2e 20 41 6c 6c 20  * trigger). All 
6130: 6e 61 6d 65 73 20 61 72 65 20 6c 65 67 61 6c 20  names are legal 
6140: 65 78 63 65 70 74 20 74 68 6f 73 65 20 74 68 61  except those tha
6150: 74 20 62 65 67 69 6e 20 77 69 74 68 20 74 68 65  t begin with the
6160: 20 73 74 72 69 6e 67 0a 2a 2a 20 22 73 71 6c 69   string.** "sqli
6170: 74 65 5f 22 20 28 69 6e 20 75 70 70 65 72 2c 20  te_" (in upper, 
6180: 6c 6f 77 65 72 20 6f 72 20 6d 69 78 65 64 20 63  lower or mixed c
6190: 61 73 65 29 2e 20 54 68 69 73 20 70 6f 72 74 69  ase). This porti
61a0: 6f 6e 20 6f 66 20 74 68 65 20 6e 61 6d 65 73 70  on of the namesp
61b0: 61 63 65 0a 2a 2a 20 69 73 20 72 65 73 65 72 76  ace.** is reserv
61c0: 65 64 20 66 6f 72 20 69 6e 74 65 72 6e 61 6c 20  ed for internal 
61d0: 75 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  use..*/.int sqli
61e0: 74 65 33 43 68 65 63 6b 4f 62 6a 65 63 74 4e 61  te3CheckObjectNa
61f0: 6d 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  me(Parse *pParse
6200: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e  , const char *zN
6210: 61 6d 65 29 7b 0a 20 20 69 66 28 20 21 70 50 61  ame){.  if( !pPa
6220: 72 73 65 2d 3e 64 62 2d 3e 69 6e 69 74 2e 62 75  rse->db->init.bu
6230: 73 79 20 26 26 20 70 50 61 72 73 65 2d 3e 6e 65  sy && pParse->ne
6240: 73 74 65 64 3d 3d 30 20 0a 20 20 20 20 20 20 20  sted==0 .       
6250: 20 20 20 26 26 20 28 70 50 61 72 73 65 2d 3e 64     && (pParse->d
6260: 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54  b->flags & SQLIT
6270: 45 5f 57 72 69 74 65 53 63 68 65 6d 61 29 3d 3d  E_WriteSchema)==
6280: 30 0a 20 20 20 20 20 20 20 20 20 20 26 26 20 30  0.          && 0
6290: 3d 3d 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d  ==sqlite3StrNICm
62a0: 70 28 7a 4e 61 6d 65 2c 20 22 73 71 6c 69 74 65  p(zName, "sqlite
62b0: 5f 22 2c 20 37 29 20 29 7b 0a 20 20 20 20 73 71  _", 7) ){.    sq
62c0: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
62d0: 61 72 73 65 2c 20 22 6f 62 6a 65 63 74 20 6e 61  arse, "object na
62e0: 6d 65 20 72 65 73 65 72 76 65 64 20 66 6f 72 20  me reserved for 
62f0: 69 6e 74 65 72 6e 61 6c 20 75 73 65 3a 20 25 73  internal use: %s
6300: 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72  ", zName);.    r
6310: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
6320: 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  OR;.  }.  return
6330: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
6340: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
6350: 50 52 49 4d 41 52 59 20 4b 45 59 20 69 6e 64 65  PRIMARY KEY inde
6360: 78 20 6f 66 20 61 20 74 61 62 6c 65 0a 2a 2f 0a  x of a table.*/.
6370: 49 6e 64 65 78 20 2a 73 71 6c 69 74 65 33 50 72  Index *sqlite3Pr
6380: 69 6d 61 72 79 4b 65 79 49 6e 64 65 78 28 54 61  imaryKeyIndex(Ta
6390: 62 6c 65 20 2a 70 54 61 62 29 7b 0a 20 20 49 6e  ble *pTab){.  In
63a0: 64 65 78 20 2a 70 3b 0a 20 20 66 6f 72 28 70 3d  dex *p;.  for(p=
63b0: 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 20  pTab->pIndex; p 
63c0: 26 26 20 21 49 73 50 72 69 6d 61 72 79 4b 65 79  && !IsPrimaryKey
63d0: 49 6e 64 65 78 28 70 29 3b 20 70 3d 70 2d 3e 70  Index(p); p=p->p
63e0: 4e 65 78 74 29 7b 7d 0a 20 20 72 65 74 75 72 6e  Next){}.  return
63f0: 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74   p;.}../*.** Ret
6400: 75 72 6e 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6f  urn the column o
6410: 66 20 69 6e 64 65 78 20 70 49 64 78 20 74 68 61  f index pIdx tha
6420: 74 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f  t corresponds to
6430: 20 74 61 62 6c 65 0a 2a 2a 20 63 6f 6c 75 6d 6e   table.** column
6440: 20 69 43 6f 6c 2e 20 20 52 65 74 75 72 6e 20 2d   iCol.  Return -
6450: 31 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a  1 if not found..
6460: 2a 2f 0a 69 31 36 20 73 71 6c 69 74 65 33 43 6f  */.i16 sqlite3Co
6470: 6c 75 6d 6e 4f 66 49 6e 64 65 78 28 49 6e 64 65  lumnOfIndex(Inde
6480: 78 20 2a 70 49 64 78 2c 20 69 31 36 20 69 43 6f  x *pIdx, i16 iCo
6490: 6c 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66  l){.  int i;.  f
64a0: 6f 72 28 69 3d 30 3b 20 69 3c 70 49 64 78 2d 3e  or(i=0; i<pIdx->
64b0: 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20  nColumn; i++){. 
64c0: 20 20 20 69 66 28 20 69 43 6f 6c 3d 3d 70 49 64     if( iCol==pId
64d0: 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 20 29  x->aiColumn[i] )
64e0: 20 72 65 74 75 72 6e 20 69 3b 0a 20 20 7d 0a 20   return i;.  }. 
64f0: 20 72 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 2f   return -1;.}../
6500: 2a 0a 2a 2a 20 42 65 67 69 6e 20 63 6f 6e 73 74  *.** Begin const
6510: 72 75 63 74 69 6e 67 20 61 20 6e 65 77 20 74 61  ructing a new ta
6520: 62 6c 65 20 72 65 70 72 65 73 65 6e 74 61 74 69  ble representati
6530: 6f 6e 20 69 6e 20 6d 65 6d 6f 72 79 2e 20 20 54  on in memory.  T
6540: 68 69 73 20 69 73 0a 2a 2a 20 74 68 65 20 66 69  his is.** the fi
6550: 72 73 74 20 6f 66 20 73 65 76 65 72 61 6c 20 61  rst of several a
6560: 63 74 69 6f 6e 20 72 6f 75 74 69 6e 65 73 20 74  ction routines t
6570: 68 61 74 20 67 65 74 20 63 61 6c 6c 65 64 20 69  hat get called i
6580: 6e 20 72 65 73 70 6f 6e 73 65 0a 2a 2a 20 74 6f  n response.** to
6590: 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20   a CREATE TABLE 
65a0: 73 74 61 74 65 6d 65 6e 74 2e 20 20 49 6e 20 70  statement.  In p
65b0: 61 72 74 69 63 75 6c 61 72 2c 20 74 68 69 73 20  articular, this 
65c0: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
65d0: 64 0a 2a 2a 20 61 66 74 65 72 20 73 65 65 69 6e  d.** after seein
65e0: 67 20 74 6f 6b 65 6e 73 20 22 43 52 45 41 54 45  g tokens "CREATE
65f0: 22 20 61 6e 64 20 22 54 41 42 4c 45 22 20 61 6e  " and "TABLE" an
6600: 64 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65  d the table name
6610: 2e 20 54 68 65 20 69 73 54 65 6d 70 0a 2a 2a 20  . The isTemp.** 
6620: 66 6c 61 67 20 69 73 20 74 72 75 65 20 69 66 20  flag is true if 
6630: 74 68 65 20 74 61 62 6c 65 20 73 68 6f 75 6c 64  the table should
6640: 20 62 65 20 73 74 6f 72 65 64 20 69 6e 20 74 68   be stored in th
6650: 65 20 61 75 78 69 6c 69 61 72 79 20 64 61 74 61  e auxiliary data
6660: 62 61 73 65 0a 2a 2a 20 66 69 6c 65 20 69 6e 73  base.** file ins
6670: 74 65 61 64 20 6f 66 20 69 6e 20 74 68 65 20 6d  tead of in the m
6680: 61 69 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c  ain database fil
6690: 65 2e 20 20 54 68 69 73 20 69 73 20 6e 6f 72 6d  e.  This is norm
66a0: 61 6c 6c 79 20 74 68 65 20 63 61 73 65 0a 2a 2a  ally the case.**
66b0: 20 77 68 65 6e 20 74 68 65 20 22 54 45 4d 50 22   when the "TEMP"
66c0: 20 6f 72 20 22 54 45 4d 50 4f 52 41 52 59 22 20   or "TEMPORARY" 
66d0: 6b 65 79 77 6f 72 64 20 6f 63 63 75 72 73 20 69  keyword occurs i
66e0: 6e 20 62 65 74 77 65 65 6e 0a 2a 2a 20 43 52 45  n between.** CRE
66f0: 41 54 45 20 61 6e 64 20 54 41 42 4c 45 2e 0a 2a  ATE and TABLE..*
6700: 2a 0a 2a 2a 20 54 68 65 20 6e 65 77 20 74 61 62  *.** The new tab
6710: 6c 65 20 72 65 63 6f 72 64 20 69 73 20 69 6e 69  le record is ini
6720: 74 69 61 6c 69 7a 65 64 20 61 6e 64 20 70 75 74  tialized and put
6730: 20 69 6e 20 70 50 61 72 73 65 2d 3e 70 4e 65 77   in pParse->pNew
6740: 54 61 62 6c 65 2e 0a 2a 2a 20 41 73 20 6d 6f 72  Table..** As mor
6750: 65 20 6f 66 20 74 68 65 20 43 52 45 41 54 45 20  e of the CREATE 
6760: 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 20  TABLE statement 
6770: 69 73 20 70 61 72 73 65 64 2c 20 61 64 64 69 74  is parsed, addit
6780: 69 6f 6e 61 6c 20 61 63 74 69 6f 6e 0a 2a 2a 20  ional action.** 
6790: 72 6f 75 74 69 6e 65 73 20 77 69 6c 6c 20 62 65  routines will be
67a0: 20 63 61 6c 6c 65 64 20 74 6f 20 61 64 64 20 6d   called to add m
67b0: 6f 72 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ore information 
67c0: 74 6f 20 74 68 69 73 20 72 65 63 6f 72 64 2e 0a  to this record..
67d0: 2a 2a 20 41 74 20 74 68 65 20 65 6e 64 20 6f 66  ** At the end of
67e0: 20 74 68 65 20 43 52 45 41 54 45 20 54 41 42 4c   the CREATE TABL
67f0: 45 20 73 74 61 74 65 6d 65 6e 74 2c 20 74 68 65  E statement, the
6800: 20 73 71 6c 69 74 65 33 45 6e 64 54 61 62 6c 65   sqlite3EndTable
6810: 28 29 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 73  () routine.** is
6820: 20 63 61 6c 6c 65 64 20 74 6f 20 63 6f 6d 70 6c   called to compl
6830: 65 74 65 20 74 68 65 20 63 6f 6e 73 74 72 75 63  ete the construc
6840: 74 69 6f 6e 20 6f 66 20 74 68 65 20 6e 65 77 20  tion of the new 
6850: 74 61 62 6c 65 20 72 65 63 6f 72 64 2e 0a 2a 2f  table record..*/
6860: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53 74 61  .void sqlite3Sta
6870: 72 74 54 61 62 6c 65 28 0a 20 20 50 61 72 73 65  rtTable(.  Parse
6880: 20 2a 70 50 61 72 73 65 2c 20 20 20 2f 2a 20 50   *pParse,   /* P
6890: 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f  arser context */
68a0: 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31  .  Token *pName1
68b0: 2c 20 20 20 2f 2a 20 46 69 72 73 74 20 70 61 72  ,   /* First par
68c0: 74 20 6f 66 20 74 68 65 20 6e 61 6d 65 20 6f 66  t of the name of
68d0: 20 74 68 65 20 74 61 62 6c 65 20 6f 72 20 76 69   the table or vi
68e0: 65 77 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  ew */.  Token *p
68f0: 4e 61 6d 65 32 2c 20 20 20 2f 2a 20 53 65 63 6f  Name2,   /* Seco
6900: 6e 64 20 70 61 72 74 20 6f 66 20 74 68 65 20 6e  nd part of the n
6910: 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65  ame of the table
6920: 20 6f 72 20 76 69 65 77 20 2a 2f 0a 20 20 69 6e   or view */.  in
6930: 74 20 69 73 54 65 6d 70 2c 20 20 20 20 20 20 2f  t isTemp,      /
6940: 2a 20 54 72 75 65 20 69 66 20 74 68 69 73 20 69  * True if this i
6950: 73 20 61 20 54 45 4d 50 20 74 61 62 6c 65 20 2a  s a TEMP table *
6960: 2f 0a 20 20 69 6e 74 20 69 73 56 69 65 77 2c 20  /.  int isView, 
6970: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
6980: 74 68 69 73 20 69 73 20 61 20 56 49 45 57 20 2a  this is a VIEW *
6990: 2f 0a 20 20 69 6e 74 20 69 73 56 69 72 74 75 61  /.  int isVirtua
69a0: 6c 2c 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20  l,   /* True if 
69b0: 74 68 69 73 20 69 73 20 61 20 56 49 52 54 55 41  this is a VIRTUA
69c0: 4c 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74  L table */.  int
69d0: 20 6e 6f 45 72 72 20 20 20 20 20 20 20 20 2f 2a   noErr        /*
69e0: 20 44 6f 20 6e 6f 74 68 69 6e 67 20 69 66 20 74   Do nothing if t
69f0: 61 62 6c 65 20 61 6c 72 65 61 64 79 20 65 78 69  able already exi
6a00: 73 74 73 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c  sts */.){.  Tabl
6a10: 65 20 2a 70 54 61 62 6c 65 3b 0a 20 20 63 68 61  e *pTable;.  cha
6a20: 72 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b 20 2f 2a  r *zName = 0; /*
6a30: 20 54 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   The name of the
6a40: 20 6e 65 77 20 74 61 62 6c 65 20 2a 2f 0a 20 20   new table */.  
6a50: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
6a60: 61 72 73 65 2d 3e 64 62 3b 0a 20 20 56 64 62 65  arse->db;.  Vdbe
6a70: 20 2a 76 3b 0a 20 20 69 6e 74 20 69 44 62 3b 20   *v;.  int iDb; 
6a80: 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
6a90: 61 73 65 20 6e 75 6d 62 65 72 20 74 6f 20 63 72  ase number to cr
6aa0: 65 61 74 65 20 74 68 65 20 74 61 62 6c 65 20 69  eate the table i
6ab0: 6e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e  n */.  Token *pN
6ac0: 61 6d 65 3b 20 20 20 20 2f 2a 20 55 6e 71 75 61  ame;    /* Unqua
6ad0: 6c 69 66 69 65 64 20 6e 61 6d 65 20 6f 66 20 74  lified name of t
6ae0: 68 65 20 74 61 62 6c 65 20 74 6f 20 63 72 65 61  he table to crea
6af0: 74 65 20 2a 2f 0a 0a 20 20 69 66 28 20 64 62 2d  te */..  if( db-
6b00: 3e 69 6e 69 74 2e 62 75 73 79 20 26 26 20 64 62  >init.busy && db
6b10: 2d 3e 69 6e 69 74 2e 6e 65 77 54 6e 75 6d 3d 3d  ->init.newTnum==
6b20: 31 20 29 7b 0a 20 20 20 20 2f 2a 20 53 70 65 63  1 ){.    /* Spec
6b30: 69 61 6c 20 63 61 73 65 3a 20 20 50 61 72 73 69  ial case:  Parsi
6b40: 6e 67 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61  ng the sqlite_ma
6b50: 73 74 65 72 20 6f 72 20 73 71 6c 69 74 65 5f 74  ster or sqlite_t
6b60: 65 6d 70 5f 6d 61 73 74 65 72 20 73 63 68 65 6d  emp_master schem
6b70: 61 20 2a 2f 0a 20 20 20 20 69 44 62 20 3d 20 64  a */.    iDb = d
6b80: 62 2d 3e 69 6e 69 74 2e 69 44 62 3b 0a 20 20 20  b->init.iDb;.   
6b90: 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33   zName = sqlite3
6ba0: 44 62 53 74 72 44 75 70 28 64 62 2c 20 53 43 48  DbStrDup(db, SCH
6bb0: 45 4d 41 5f 54 41 42 4c 45 28 69 44 62 29 29 3b  EMA_TABLE(iDb));
6bc0: 0a 20 20 20 20 70 4e 61 6d 65 20 3d 20 70 4e 61  .    pName = pNa
6bd0: 6d 65 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  me1;.  }else{.  
6be0: 20 20 2f 2a 20 54 68 65 20 63 6f 6d 6d 6f 6e 20    /* The common 
6bf0: 63 61 73 65 20 2a 2f 0a 20 20 20 20 69 44 62 20  case */.    iDb 
6c00: 3d 20 73 71 6c 69 74 65 33 54 77 6f 50 61 72 74  = sqlite3TwoPart
6c10: 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 70 4e 61  Name(pParse, pNa
6c20: 6d 65 31 2c 20 70 4e 61 6d 65 32 2c 20 26 70 4e  me1, pName2, &pN
6c30: 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 69 44  ame);.    if( iD
6c40: 62 3c 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  b<0 ) return;.  
6c50: 20 20 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50    if( !OMIT_TEMP
6c60: 44 42 20 26 26 20 69 73 54 65 6d 70 20 26 26 20  DB && isTemp && 
6c70: 70 4e 61 6d 65 32 2d 3e 6e 3e 30 20 26 26 20 69  pName2->n>0 && i
6c80: 44 62 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 2f  Db!=1 ){.      /
6c90: 2a 20 49 66 20 63 72 65 61 74 69 6e 67 20 61 20  * If creating a 
6ca0: 74 65 6d 70 20 74 61 62 6c 65 2c 20 74 68 65 20  temp table, the 
6cb0: 6e 61 6d 65 20 6d 61 79 20 6e 6f 74 20 62 65 20  name may not be 
6cc0: 71 75 61 6c 69 66 69 65 64 2e 20 55 6e 6c 65 73  qualified. Unles
6cd0: 73 20 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  s .      ** the 
6ce0: 64 61 74 61 62 61 73 65 20 6e 61 6d 65 20 69 73  database name is
6cf0: 20 22 74 65 6d 70 22 20 61 6e 79 77 61 79 2e 20   "temp" anyway. 
6d00: 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
6d10: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
6d20: 2c 20 22 74 65 6d 70 6f 72 61 72 79 20 74 61 62  , "temporary tab
6d30: 6c 65 20 6e 61 6d 65 20 6d 75 73 74 20 62 65 20  le name must be 
6d40: 75 6e 71 75 61 6c 69 66 69 65 64 22 29 3b 0a 20  unqualified");. 
6d50: 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20       return;.   
6d60: 20 7d 0a 20 20 20 20 69 66 28 20 21 4f 4d 49 54   }.    if( !OMIT
6d70: 5f 54 45 4d 50 44 42 20 26 26 20 69 73 54 65 6d  _TEMPDB && isTem
6d80: 70 20 29 20 69 44 62 20 3d 20 31 3b 0a 20 20 20  p ) iDb = 1;.   
6d90: 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33   zName = sqlite3
6da0: 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62  NameFromToken(db
6db0: 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20  , pName);.  }.  
6dc0: 70 50 61 72 73 65 2d 3e 73 4e 61 6d 65 54 6f 6b  pParse->sNameTok
6dd0: 65 6e 20 3d 20 2a 70 4e 61 6d 65 3b 0a 20 20 69  en = *pName;.  i
6de0: 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 20 72 65  f( zName==0 ) re
6df0: 74 75 72 6e 3b 0a 20 20 69 66 28 20 53 51 4c 49  turn;.  if( SQLI
6e00: 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 43 68  TE_OK!=sqlite3Ch
6e10: 65 63 6b 4f 62 6a 65 63 74 4e 61 6d 65 28 70 50  eckObjectName(pP
6e20: 61 72 73 65 2c 20 7a 4e 61 6d 65 29 20 29 7b 0a  arse, zName) ){.
6e30: 20 20 20 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74      goto begin_t
6e40: 61 62 6c 65 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a  able_error;.  }.
6e50: 20 20 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 69    if( db->init.i
6e60: 44 62 3d 3d 31 20 29 20 69 73 54 65 6d 70 20 3d  Db==1 ) isTemp =
6e70: 20 31 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   1;.#ifndef SQLI
6e80: 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a  TE_OMIT_AUTHORIZ
6e90: 41 54 49 4f 4e 0a 20 20 61 73 73 65 72 74 28 20  ATION.  assert( 
6ea0: 69 73 54 65 6d 70 3d 3d 30 20 7c 7c 20 69 73 54  isTemp==0 || isT
6eb0: 65 6d 70 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65  emp==1 );.  asse
6ec0: 72 74 28 20 69 73 56 69 65 77 3d 3d 30 20 7c 7c  rt( isView==0 ||
6ed0: 20 69 73 56 69 65 77 3d 3d 31 20 29 3b 0a 20 20   isView==1 );.  
6ee0: 7b 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e  {.    static con
6ef0: 73 74 20 75 38 20 61 43 6f 64 65 5b 5d 20 3d 20  st u8 aCode[] = 
6f00: 7b 0a 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f  {.       SQLITE_
6f10: 43 52 45 41 54 45 5f 54 41 42 4c 45 2c 0a 20 20  CREATE_TABLE,.  
6f20: 20 20 20 20 20 53 51 4c 49 54 45 5f 43 52 45 41       SQLITE_CREA
6f30: 54 45 5f 54 45 4d 50 5f 54 41 42 4c 45 2c 0a 20  TE_TEMP_TABLE,. 
6f40: 20 20 20 20 20 20 53 51 4c 49 54 45 5f 43 52 45        SQLITE_CRE
6f50: 41 54 45 5f 56 49 45 57 2c 0a 20 20 20 20 20 20  ATE_VIEW,.      
6f60: 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54   SQLITE_CREATE_T
6f70: 45 4d 50 5f 56 49 45 57 0a 20 20 20 20 7d 3b 0a  EMP_VIEW.    };.
6f80: 20 20 20 20 63 68 61 72 20 2a 7a 44 62 20 3d 20      char *zDb = 
6f90: 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61  db->aDb[iDb].zNa
6fa0: 6d 65 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69  me;.    if( sqli
6fb0: 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61  te3AuthCheck(pPa
6fc0: 72 73 65 2c 20 53 51 4c 49 54 45 5f 49 4e 53 45  rse, SQLITE_INSE
6fd0: 52 54 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c 45  RT, SCHEMA_TABLE
6fe0: 28 69 73 54 65 6d 70 29 2c 20 30 2c 20 7a 44 62  (isTemp), 0, zDb
6ff0: 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  ) ){.      goto 
7000: 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f  begin_table_erro
7010: 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  r;.    }.    if(
7020: 20 21 69 73 56 69 72 74 75 61 6c 20 26 26 20 73   !isVirtual && s
7030: 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28  qlite3AuthCheck(
7040: 70 50 61 72 73 65 2c 20 28 69 6e 74 29 61 43 6f  pParse, (int)aCo
7050: 64 65 5b 69 73 54 65 6d 70 2b 32 2a 69 73 56 69  de[isTemp+2*isVi
7060: 65 77 5d 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ew],.           
7070: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7080: 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d              zNam
7090: 65 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20  e, 0, zDb) ){.  
70a0: 20 20 20 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74      goto begin_t
70b0: 61 62 6c 65 5f 65 72 72 6f 72 3b 0a 20 20 20 20  able_error;.    
70c0: 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  }.  }.#endif..  
70d0: 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  /* Make sure the
70e0: 20 6e 65 77 20 74 61 62 6c 65 20 6e 61 6d 65 20   new table name 
70f0: 64 6f 65 73 20 6e 6f 74 20 63 6f 6c 6c 69 64 65  does not collide
7100: 20 77 69 74 68 20 61 6e 20 65 78 69 73 74 69 6e   with an existin
7110: 67 0a 20 20 2a 2a 20 69 6e 64 65 78 20 6f 72 20  g.  ** index or 
7120: 74 61 62 6c 65 20 6e 61 6d 65 20 69 6e 20 74 68  table name in th
7130: 65 20 73 61 6d 65 20 64 61 74 61 62 61 73 65 2e  e same database.
7140: 20 20 49 73 73 75 65 20 61 6e 20 65 72 72 6f 72    Issue an error
7150: 20 6d 65 73 73 61 67 65 20 69 66 0a 20 20 2a 2a   message if.  **
7160: 20 69 74 20 64 6f 65 73 2e 20 54 68 65 20 65 78   it does. The ex
7170: 63 65 70 74 69 6f 6e 20 69 73 20 69 66 20 74 68  ception is if th
7180: 65 20 73 74 61 74 65 6d 65 6e 74 20 62 65 69 6e  e statement bein
7190: 67 20 70 61 72 73 65 64 20 77 61 73 20 70 61 73  g parsed was pas
71a0: 73 65 64 0a 20 20 2a 2a 20 74 6f 20 61 6e 20 73  sed.  ** to an s
71b0: 71 6c 69 74 65 33 5f 64 65 63 6c 61 72 65 5f 76  qlite3_declare_v
71c0: 74 61 62 28 29 20 63 61 6c 6c 2e 20 49 6e 20 74  tab() call. In t
71d0: 68 61 74 20 63 61 73 65 20 6f 6e 6c 79 20 74 68  hat case only th
71e0: 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 0a 20  e column names. 
71f0: 20 2a 2a 20 61 6e 64 20 74 79 70 65 73 20 77 69   ** and types wi
7200: 6c 6c 20 62 65 20 75 73 65 64 2c 20 73 6f 20 74  ll be used, so t
7210: 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 20  here is no need 
7220: 74 6f 20 74 65 73 74 20 66 6f 72 20 6e 61 6d 65  to test for name
7230: 73 70 61 63 65 0a 20 20 2a 2a 20 63 6f 6c 6c 69  space.  ** colli
7240: 73 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66  sions..  */.  if
7250: 28 20 21 49 4e 5f 44 45 43 4c 41 52 45 5f 56 54  ( !IN_DECLARE_VT
7260: 41 42 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a  AB ){.    char *
7270: 7a 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44  zDb = db->aDb[iD
7280: 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 69 66  b].zName;.    if
7290: 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c  ( SQLITE_OK!=sql
72a0: 69 74 65 33 52 65 61 64 53 63 68 65 6d 61 28 70  ite3ReadSchema(p
72b0: 50 61 72 73 65 29 20 29 7b 0a 20 20 20 20 20 20  Parse) ){.      
72c0: 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65  goto begin_table
72d0: 5f 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20  _error;.    }.  
72e0: 20 20 70 54 61 62 6c 65 20 3d 20 73 71 6c 69 74    pTable = sqlit
72f0: 65 33 46 69 6e 64 54 61 62 6c 65 28 64 62 2c 20  e3FindTable(db, 
7300: 7a 4e 61 6d 65 2c 20 7a 44 62 29 3b 0a 20 20 20  zName, zDb);.   
7310: 20 69 66 28 20 70 54 61 62 6c 65 20 29 7b 0a 20   if( pTable ){. 
7320: 20 20 20 20 20 69 66 28 20 21 6e 6f 45 72 72 20       if( !noErr 
7330: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
7340: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
7350: 65 2c 20 22 74 61 62 6c 65 20 25 54 20 61 6c 72  e, "table %T alr
7360: 65 61 64 79 20 65 78 69 73 74 73 22 2c 20 70 4e  eady exists", pN
7370: 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  ame);.      }els
7380: 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  e{.        asser
7390: 74 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73  t( !db->init.bus
73a0: 79 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20  y || CORRUPT_DB 
73b0: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
73c0: 65 33 43 6f 64 65 56 65 72 69 66 79 53 63 68 65  e3CodeVerifySche
73d0: 6d 61 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b  ma(pParse, iDb);
73e0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 67  .      }.      g
73f0: 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f  oto begin_table_
7400: 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 20  error;.    }.   
7410: 20 69 66 28 20 73 71 6c 69 74 65 33 46 69 6e 64   if( sqlite3Find
7420: 49 6e 64 65 78 28 64 62 2c 20 7a 4e 61 6d 65 2c  Index(db, zName,
7430: 20 7a 44 62 29 21 3d 30 20 29 7b 0a 20 20 20 20   zDb)!=0 ){.    
7440: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
7450: 67 28 70 50 61 72 73 65 2c 20 22 74 68 65 72 65  g(pParse, "there
7460: 20 69 73 20 61 6c 72 65 61 64 79 20 61 6e 20 69   is already an i
7470: 6e 64 65 78 20 6e 61 6d 65 64 20 25 73 22 2c 20  ndex named %s", 
7480: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 67 6f  zName);.      go
7490: 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65  to begin_table_e
74a0: 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rror;.    }.  }.
74b0: 0a 20 20 70 54 61 62 6c 65 20 3d 20 73 71 6c 69  .  pTable = sqli
74c0: 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28  te3DbMallocZero(
74d0: 64 62 2c 20 73 69 7a 65 6f 66 28 54 61 62 6c 65  db, sizeof(Table
74e0: 29 29 3b 0a 20 20 69 66 28 20 70 54 61 62 6c 65  ));.  if( pTable
74f0: 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ==0 ){.    asser
7500: 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  t( db->mallocFai
7510: 6c 65 64 20 29 3b 0a 20 20 20 20 70 50 61 72 73  led );.    pPars
7520: 65 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e  e->rc = SQLITE_N
7530: 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 70  OMEM_BKPT;.    p
7540: 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20  Parse->nErr++;. 
7550: 20 20 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61     goto begin_ta
7560: 62 6c 65 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 20  ble_error;.  }. 
7570: 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 20 3d   pTable->zName =
7580: 20 7a 4e 61 6d 65 3b 0a 20 20 70 54 61 62 6c 65   zName;.  pTable
7590: 2d 3e 69 50 4b 65 79 20 3d 20 2d 31 3b 0a 20 20  ->iPKey = -1;.  
75a0: 70 54 61 62 6c 65 2d 3e 70 53 63 68 65 6d 61 20  pTable->pSchema 
75b0: 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70  = db->aDb[iDb].p
75c0: 53 63 68 65 6d 61 3b 0a 20 20 70 54 61 62 6c 65  Schema;.  pTable
75d0: 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20 70 54  ->nRef = 1;.  pT
75e0: 61 62 6c 65 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74  able->nRowLogEst
75f0: 20 3d 20 32 30 30 3b 20 61 73 73 65 72 74 28 20   = 200; assert( 
7600: 32 30 30 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45  200==sqlite3LogE
7610: 73 74 28 31 30 34 38 35 37 36 29 20 29 3b 0a 20  st(1048576) );. 
7620: 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d   assert( pParse-
7630: 3e 70 4e 65 77 54 61 62 6c 65 3d 3d 30 20 29 3b  >pNewTable==0 );
7640: 0a 20 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54  .  pParse->pNewT
7650: 61 62 6c 65 20 3d 20 70 54 61 62 6c 65 3b 0a 0a  able = pTable;..
7660: 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20    /* If this is 
7670: 74 68 65 20 6d 61 67 69 63 20 73 71 6c 69 74 65  the magic sqlite
7680: 5f 73 65 71 75 65 6e 63 65 20 74 61 62 6c 65 20  _sequence table 
7690: 75 73 65 64 20 62 79 20 61 75 74 6f 69 6e 63 72  used by autoincr
76a0: 65 6d 65 6e 74 2c 0a 20 20 2a 2a 20 74 68 65 6e  ement,.  ** then
76b0: 20 72 65 63 6f 72 64 20 61 20 70 6f 69 6e 74 65   record a pointe
76c0: 72 20 74 6f 20 74 68 69 73 20 74 61 62 6c 65 20  r to this table 
76d0: 69 6e 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61  in the main data
76e0: 62 61 73 65 20 73 74 72 75 63 74 75 72 65 0a 20  base structure. 
76f0: 20 2a 2a 20 73 6f 20 74 68 61 74 20 49 4e 53 45   ** so that INSE
7700: 52 54 20 63 61 6e 20 66 69 6e 64 20 74 68 65 20  RT can find the 
7710: 74 61 62 6c 65 20 65 61 73 69 6c 79 2e 0a 20 20  table easily..  
7720: 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
7730: 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 43 52 45  E_OMIT_AUTOINCRE
7740: 4d 45 4e 54 0a 20 20 69 66 28 20 21 70 50 61 72  MENT.  if( !pPar
7750: 73 65 2d 3e 6e 65 73 74 65 64 20 26 26 20 73 74  se->nested && st
7760: 72 63 6d 70 28 7a 4e 61 6d 65 2c 20 22 73 71 6c  rcmp(zName, "sql
7770: 69 74 65 5f 73 65 71 75 65 6e 63 65 22 29 3d 3d  ite_sequence")==
7780: 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  0 ){.    assert(
7790: 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75   sqlite3SchemaMu
77a0: 74 65 78 48 65 6c 64 28 64 62 2c 20 69 44 62 2c  texHeld(db, iDb,
77b0: 20 30 29 20 29 3b 0a 20 20 20 20 70 54 61 62 6c   0) );.    pTabl
77c0: 65 2d 3e 70 53 63 68 65 6d 61 2d 3e 70 53 65 71  e->pSchema->pSeq
77d0: 54 61 62 20 3d 20 70 54 61 62 6c 65 3b 0a 20 20  Tab = pTable;.  
77e0: 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 42  }.#endif..  /* B
77f0: 65 67 69 6e 20 67 65 6e 65 72 61 74 69 6e 67 20  egin generating 
7800: 74 68 65 20 63 6f 64 65 20 74 68 61 74 20 77 69  the code that wi
7810: 6c 6c 20 69 6e 73 65 72 74 20 74 68 65 20 74 61  ll insert the ta
7820: 62 6c 65 20 72 65 63 6f 72 64 20 69 6e 74 6f 0a  ble record into.
7830: 20 20 2a 2a 20 74 68 65 20 53 51 4c 49 54 45 5f    ** the SQLITE_
7840: 4d 41 53 54 45 52 20 74 61 62 6c 65 2e 20 20 4e  MASTER table.  N
7850: 6f 74 65 20 69 6e 20 70 61 72 74 69 63 75 6c 61  ote in particula
7860: 72 20 74 68 61 74 20 77 65 20 6d 75 73 74 20 67  r that we must g
7870: 6f 20 61 68 65 61 64 0a 20 20 2a 2a 20 61 6e 64  o ahead.  ** and
7880: 20 61 6c 6c 6f 63 61 74 65 20 74 68 65 20 72 65   allocate the re
7890: 63 6f 72 64 20 6e 75 6d 62 65 72 20 66 6f 72 20  cord number for 
78a0: 74 68 65 20 74 61 62 6c 65 20 65 6e 74 72 79 20  the table entry 
78b0: 6e 6f 77 2e 20 20 42 65 66 6f 72 65 20 61 6e 79  now.  Before any
78c0: 0a 20 20 2a 2a 20 50 52 49 4d 41 52 59 20 4b 45  .  ** PRIMARY KE
78d0: 59 20 6f 72 20 55 4e 49 51 55 45 20 6b 65 79 77  Y or UNIQUE keyw
78e0: 6f 72 64 73 20 61 72 65 20 70 61 72 73 65 64 2e  ords are parsed.
78f0: 20 20 54 68 6f 73 65 20 6b 65 79 77 6f 72 64 73    Those keywords
7900: 20 77 69 6c 6c 20 63 61 75 73 65 0a 20 20 2a 2a   will cause.  **
7910: 20 69 6e 64 69 63 65 73 20 74 6f 20 62 65 20 63   indices to be c
7920: 72 65 61 74 65 64 20 61 6e 64 20 74 68 65 20 74  reated and the t
7930: 61 62 6c 65 20 72 65 63 6f 72 64 20 6d 75 73 74  able record must
7940: 20 63 6f 6d 65 20 62 65 66 6f 72 65 20 74 68 65   come before the
7950: 20 0a 20 20 2a 2a 20 69 6e 64 69 63 65 73 2e 20   .  ** indices. 
7960: 20 48 65 6e 63 65 2c 20 74 68 65 20 72 65 63 6f   Hence, the reco
7970: 72 64 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68  rd number for th
7980: 65 20 74 61 62 6c 65 20 6d 75 73 74 20 62 65 20  e table must be 
7990: 61 6c 6c 6f 63 61 74 65 64 0a 20 20 2a 2a 20 6e  allocated.  ** n
79a0: 6f 77 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21  ow..  */.  if( !
79b0: 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 26 26  db->init.busy &&
79c0: 20 28 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74   (v = sqlite3Get
79d0: 56 64 62 65 28 70 50 61 72 73 65 29 29 21 3d 30  Vdbe(pParse))!=0
79e0: 20 29 7b 0a 20 20 20 20 69 6e 74 20 61 64 64 72   ){.    int addr
79f0: 31 3b 0a 20 20 20 20 69 6e 74 20 66 69 6c 65 46  1;.    int fileF
7a00: 6f 72 6d 61 74 3b 0a 20 20 20 20 69 6e 74 20 72  ormat;.    int r
7a10: 65 67 31 2c 20 72 65 67 32 2c 20 72 65 67 33 3b  eg1, reg2, reg3;
7a20: 0a 20 20 20 20 2f 2a 20 6e 75 6c 6c 52 6f 77 5b  .    /* nullRow[
7a30: 5d 20 69 73 20 61 6e 20 4f 50 5f 52 65 63 6f 72  ] is an OP_Recor
7a40: 64 20 65 6e 63 6f 64 69 6e 67 20 6f 66 20 61 20  d encoding of a 
7a50: 72 6f 77 20 63 6f 6e 74 61 69 6e 69 6e 67 20 35  row containing 5
7a60: 20 4e 55 4c 4c 73 20 2a 2f 0a 20 20 20 20 73 74   NULLs */.    st
7a70: 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
7a80: 6e 75 6c 6c 52 6f 77 5b 5d 20 3d 20 7b 20 36 2c  nullRow[] = { 6,
7a90: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 20 7d   0, 0, 0, 0, 0 }
7aa0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65 67  ;.    sqlite3Beg
7ab0: 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e  inWriteOperation
7ac0: 28 70 50 61 72 73 65 2c 20 31 2c 20 69 44 62 29  (pParse, 1, iDb)
7ad0: 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ;..#ifndef SQLIT
7ae0: 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
7af0: 42 4c 45 0a 20 20 20 20 69 66 28 20 69 73 56 69  BLE.    if( isVi
7b00: 72 74 75 61 6c 20 29 7b 0a 20 20 20 20 20 20 73  rtual ){.      s
7b10: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30  qlite3VdbeAddOp0
7b20: 28 76 2c 20 4f 50 5f 56 42 65 67 69 6e 29 3b 0a  (v, OP_VBegin);.
7b30: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20      }.#endif..  
7b40: 20 20 2f 2a 20 49 66 20 74 68 65 20 66 69 6c 65    /* If the file
7b50: 20 66 6f 72 6d 61 74 20 61 6e 64 20 65 6e 63 6f   format and enco
7b60: 64 69 6e 67 20 69 6e 20 74 68 65 20 64 61 74 61  ding in the data
7b70: 62 61 73 65 20 68 61 76 65 20 6e 6f 74 20 62 65  base have not be
7b80: 65 6e 20 73 65 74 2c 20 0a 20 20 20 20 2a 2a 20  en set, .    ** 
7b90: 73 65 74 20 74 68 65 6d 20 6e 6f 77 2e 0a 20 20  set them now..  
7ba0: 20 20 2a 2f 0a 20 20 20 20 72 65 67 31 20 3d 20    */.    reg1 = 
7bb0: 70 50 61 72 73 65 2d 3e 72 65 67 52 6f 77 69 64  pParse->regRowid
7bc0: 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
7bd0: 6d 3b 0a 20 20 20 20 72 65 67 32 20 3d 20 70 50  m;.    reg2 = pP
7be0: 61 72 73 65 2d 3e 72 65 67 52 6f 6f 74 20 3d 20  arse->regRoot = 
7bf0: 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
7c00: 20 20 20 20 72 65 67 33 20 3d 20 2b 2b 70 50 61      reg3 = ++pPa
7c10: 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 73  rse->nMem;.    s
7c20: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
7c30: 28 76 2c 20 4f 50 5f 52 65 61 64 43 6f 6f 6b 69  (v, OP_ReadCooki
7c40: 65 2c 20 69 44 62 2c 20 72 65 67 33 2c 20 42 54  e, iDb, reg3, BT
7c50: 52 45 45 5f 46 49 4c 45 5f 46 4f 52 4d 41 54 29  REE_FILE_FORMAT)
7c60: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
7c70: 65 55 73 65 73 42 74 72 65 65 28 76 2c 20 69 44  eUsesBtree(v, iD
7c80: 62 29 3b 0a 20 20 20 20 61 64 64 72 31 20 3d 20  b);.    addr1 = 
7c90: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
7ca0: 31 28 76 2c 20 4f 50 5f 49 66 2c 20 72 65 67 33  1(v, OP_If, reg3
7cb0: 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
7cc0: 76 29 3b 0a 20 20 20 20 66 69 6c 65 46 6f 72 6d  v);.    fileForm
7cd0: 61 74 20 3d 20 28 64 62 2d 3e 66 6c 61 67 73 20  at = (db->flags 
7ce0: 26 20 53 51 4c 49 54 45 5f 4c 65 67 61 63 79 46  & SQLITE_LegacyF
7cf0: 69 6c 65 46 6d 74 29 21 3d 30 20 3f 0a 20 20 20  ileFmt)!=0 ?.   
7d00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 31                 1
7d10: 20 3a 20 53 51 4c 49 54 45 5f 4d 41 58 5f 46 49   : SQLITE_MAX_FI
7d20: 4c 45 5f 46 4f 52 4d 41 54 3b 0a 20 20 20 20 73  LE_FORMAT;.    s
7d30: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
7d40: 28 76 2c 20 4f 50 5f 53 65 74 43 6f 6f 6b 69 65  (v, OP_SetCookie
7d50: 2c 20 69 44 62 2c 20 42 54 52 45 45 5f 46 49 4c  , iDb, BTREE_FIL
7d60: 45 5f 46 4f 52 4d 41 54 2c 20 66 69 6c 65 46 6f  E_FORMAT, fileFo
7d70: 72 6d 61 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  rmat);.    sqlit
7d80: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
7d90: 4f 50 5f 53 65 74 43 6f 6f 6b 69 65 2c 20 69 44  OP_SetCookie, iD
7da0: 62 2c 20 42 54 52 45 45 5f 54 45 58 54 5f 45 4e  b, BTREE_TEXT_EN
7db0: 43 4f 44 49 4e 47 2c 20 45 4e 43 28 64 62 29 29  CODING, ENC(db))
7dc0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
7dd0: 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64  eJumpHere(v, add
7de0: 72 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 69  r1);..    /* Thi
7df0: 73 20 6a 75 73 74 20 63 72 65 61 74 65 73 20 61  s just creates a
7e00: 20 70 6c 61 63 65 2d 68 6f 6c 64 65 72 20 72 65   place-holder re
7e10: 63 6f 72 64 20 69 6e 20 74 68 65 20 73 71 6c 69  cord in the sqli
7e20: 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 2e  te_master table.
7e30: 0a 20 20 20 20 2a 2a 20 54 68 65 20 72 65 63 6f  .    ** The reco
7e40: 72 64 20 63 72 65 61 74 65 64 20 64 6f 65 73 20  rd created does 
7e50: 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61 6e 79 74  not contain anyt
7e60: 68 69 6e 67 20 79 65 74 2e 20 20 49 74 20 77 69  hing yet.  It wi
7e70: 6c 6c 20 62 65 20 72 65 70 6c 61 63 65 64 0a 20  ll be replaced. 
7e80: 20 20 20 2a 2a 20 62 79 20 74 68 65 20 72 65 61     ** by the rea
7e90: 6c 20 65 6e 74 72 79 20 69 6e 20 63 6f 64 65 20  l entry in code 
7ea0: 67 65 6e 65 72 61 74 65 64 20 61 74 20 73 71 6c  generated at sql
7eb0: 69 74 65 33 45 6e 64 54 61 62 6c 65 28 29 2e 0a  ite3EndTable()..
7ec0: 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68      **.    ** Th
7ed0: 65 20 72 6f 77 69 64 20 66 6f 72 20 74 68 65 20  e rowid for the 
7ee0: 6e 65 77 20 65 6e 74 72 79 20 69 73 20 6c 65 66  new entry is lef
7ef0: 74 20 69 6e 20 72 65 67 69 73 74 65 72 20 70 50  t in register pP
7f00: 61 72 73 65 2d 3e 72 65 67 52 6f 77 69 64 2e 0a  arse->regRowid..
7f10: 20 20 20 20 2a 2a 20 54 68 65 20 72 6f 6f 74 20      ** The root 
7f20: 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74  page number of t
7f30: 68 65 20 6e 65 77 20 74 61 62 6c 65 20 69 73 20  he new table is 
7f40: 6c 65 66 74 20 69 6e 20 72 65 67 20 70 50 61 72  left in reg pPar
7f50: 73 65 2d 3e 72 65 67 52 6f 6f 74 2e 0a 20 20 20  se->regRoot..   
7f60: 20 2a 2a 20 54 68 65 20 72 6f 77 69 64 20 61 6e   ** The rowid an
7f70: 64 20 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62  d root page numb
7f80: 65 72 20 76 61 6c 75 65 73 20 61 72 65 20 6e 65  er values are ne
7f90: 65 64 65 64 20 62 79 20 74 68 65 20 63 6f 64 65  eded by the code
7fa0: 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 73 71 6c   that.    ** sql
7fb0: 69 74 65 33 45 6e 64 54 61 62 6c 65 20 77 69 6c  ite3EndTable wil
7fc0: 6c 20 67 65 6e 65 72 61 74 65 2e 0a 20 20 20 20  l generate..    
7fd0: 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  */.#if !defined(
7fe0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57  SQLITE_OMIT_VIEW
7ff0: 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51  ) || !defined(SQ
8000: 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
8010: 4c 54 41 42 4c 45 29 0a 20 20 20 20 69 66 28 20  LTABLE).    if( 
8020: 69 73 56 69 65 77 20 7c 7c 20 69 73 56 69 72 74  isView || isVirt
8030: 75 61 6c 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ual ){.      sql
8040: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
8050: 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c  , OP_Integer, 0,
8060: 20 72 65 67 32 29 3b 0a 20 20 20 20 7d 65 6c 73   reg2);.    }els
8070: 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 7b 0a 20  e.#endif.    {. 
8080: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 61 64 64       pParse->add
8090: 72 43 72 54 61 62 20 3d 20 73 71 6c 69 74 65 33  rCrTab = sqlite3
80a0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
80b0: 5f 43 72 65 61 74 65 54 61 62 6c 65 2c 20 69 44  _CreateTable, iD
80c0: 62 2c 20 72 65 67 32 29 3b 0a 20 20 20 20 7d 0a  b, reg2);.    }.
80d0: 20 20 20 20 73 71 6c 69 74 65 33 4f 70 65 6e 4d      sqlite3OpenM
80e0: 61 73 74 65 72 54 61 62 6c 65 28 70 50 61 72 73  asterTable(pPars
80f0: 65 2c 20 69 44 62 29 3b 0a 20 20 20 20 73 71 6c  e, iDb);.    sql
8100: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
8110: 2c 20 4f 50 5f 4e 65 77 52 6f 77 69 64 2c 20 30  , OP_NewRowid, 0
8120: 2c 20 72 65 67 31 29 3b 0a 20 20 20 20 73 71 6c  , reg1);.    sql
8130: 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
8140: 2c 20 4f 50 5f 42 6c 6f 62 2c 20 36 2c 20 72 65  , OP_Blob, 6, re
8150: 67 33 2c 20 30 2c 20 6e 75 6c 6c 52 6f 77 2c 20  g3, 0, nullRow, 
8160: 50 34 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20  P4_STATIC);.    
8170: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
8180: 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20  3(v, OP_Insert, 
8190: 30 2c 20 72 65 67 33 2c 20 72 65 67 31 29 3b 0a  0, reg3, reg1);.
81a0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
81b0: 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41  hangeP5(v, OPFLA
81c0: 47 5f 41 50 50 45 4e 44 29 3b 0a 20 20 20 20 73  G_APPEND);.    s
81d0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30  qlite3VdbeAddOp0
81e0: 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 29 3b 0a 20  (v, OP_Close);. 
81f0: 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 72 6d 61 6c 20   }..  /* Normal 
8200: 28 6e 6f 6e 2d 65 72 72 6f 72 29 20 72 65 74 75  (non-error) retu
8210: 72 6e 2e 20 2a 2f 0a 20 20 72 65 74 75 72 6e 3b  rn. */.  return;
8220: 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 20 65 72 72  ..  /* If an err
8230: 6f 72 20 6f 63 63 75 72 73 2c 20 77 65 20 6a 75  or occurs, we ju
8240: 6d 70 20 68 65 72 65 20 2a 2f 0a 62 65 67 69 6e  mp here */.begin
8250: 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3a 0a 20 20  _table_error:.  
8260: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
8270: 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 72 65 74 75  , zName);.  retu
8280: 72 6e 3b 0a 7d 0a 0a 2f 2a 20 53 65 74 20 70 72  rn;.}../* Set pr
8290: 6f 70 65 72 74 69 65 73 20 6f 66 20 61 20 74 61  operties of a ta
82a0: 62 6c 65 20 63 6f 6c 75 6d 6e 20 62 61 73 65 64  ble column based
82b0: 20 6f 6e 20 74 68 65 20 28 6d 61 67 69 63 61 6c   on the (magical
82c0: 29 0a 2a 2a 20 6e 61 6d 65 20 6f 66 20 74 68 65  ).** name of the
82d0: 20 63 6f 6c 75 6d 6e 2e 0a 2a 2f 0a 23 69 66 20   column..*/.#if 
82e0: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 48 49  SQLITE_ENABLE_HI
82f0: 44 44 45 4e 5f 43 4f 4c 55 4d 4e 53 0a 76 6f 69  DDEN_COLUMNS.voi
8300: 64 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 50  d sqlite3ColumnP
8310: 72 6f 70 65 72 74 69 65 73 46 72 6f 6d 4e 61 6d  ropertiesFromNam
8320: 65 28 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 43  e(Table *pTab, C
8330: 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 29 7b 0a 20 20  olumn *pCol){.  
8340: 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74 72 6e  if( sqlite3_strn
8350: 69 63 6d 70 28 70 43 6f 6c 2d 3e 7a 4e 61 6d 65  icmp(pCol->zName
8360: 2c 20 22 5f 5f 68 69 64 64 65 6e 5f 5f 22 2c 20  , "__hidden__", 
8370: 31 30 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70 43  10)==0 ){.    pC
8380: 6f 6c 2d 3e 63 6f 6c 46 6c 61 67 73 20 7c 3d 20  ol->colFlags |= 
8390: 43 4f 4c 46 4c 41 47 5f 48 49 44 44 45 4e 3b 0a  COLFLAG_HIDDEN;.
83a0: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 54 61 62    }else if( pTab
83b0: 20 26 26 20 70 43 6f 6c 21 3d 70 54 61 62 2d 3e   && pCol!=pTab->
83c0: 61 43 6f 6c 20 26 26 20 28 70 43 6f 6c 5b 2d 31  aCol && (pCol[-1
83d0: 5d 2e 63 6f 6c 46 6c 61 67 73 20 26 20 43 4f 4c  ].colFlags & COL
83e0: 46 4c 41 47 5f 48 49 44 44 45 4e 29 20 29 7b 0a  FLAG_HIDDEN) ){.
83f0: 20 20 20 20 70 54 61 62 2d 3e 74 61 62 46 6c 61      pTab->tabFla
8400: 67 73 20 7c 3d 20 54 46 5f 4f 4f 4f 48 69 64 64  gs |= TF_OOOHidd
8410: 65 6e 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66  en;.  }.}.#endif
8420: 0a 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e  .../*.** Add a n
8430: 65 77 20 63 6f 6c 75 6d 6e 20 74 6f 20 74 68 65  ew column to the
8440: 20 74 61 62 6c 65 20 63 75 72 72 65 6e 74 6c 79   table currently
8450: 20 62 65 69 6e 67 20 63 6f 6e 73 74 72 75 63 74   being construct
8460: 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61  ed..**.** The pa
8470: 72 73 65 72 20 63 61 6c 6c 73 20 74 68 69 73 20  rser calls this 
8480: 72 6f 75 74 69 6e 65 20 6f 6e 63 65 20 66 6f 72  routine once for
8490: 20 65 61 63 68 20 63 6f 6c 75 6d 6e 20 64 65 63   each column dec
84a0: 6c 61 72 61 74 69 6f 6e 0a 2a 2a 20 69 6e 20 61  laration.** in a
84b0: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74   CREATE TABLE st
84c0: 61 74 65 6d 65 6e 74 2e 20 20 73 71 6c 69 74 65  atement.  sqlite
84d0: 33 53 74 61 72 74 54 61 62 6c 65 28 29 20 67 65  3StartTable() ge
84e0: 74 73 20 63 61 6c 6c 65 64 0a 2a 2a 20 66 69 72  ts called.** fir
84f0: 73 74 20 74 6f 20 67 65 74 20 74 68 69 6e 67 73  st to get things
8500: 20 67 6f 69 6e 67 2e 20 20 54 68 65 6e 20 74 68   going.  Then th
8510: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
8520: 6c 6c 65 64 20 66 6f 72 20 65 61 63 68 0a 2a 2a  lled for each.**
8530: 20 63 6f 6c 75 6d 6e 2e 0a 2a 2f 0a 76 6f 69 64   column..*/.void
8540: 20 73 71 6c 69 74 65 33 41 64 64 43 6f 6c 75 6d   sqlite3AddColum
8550: 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  n(Parse *pParse,
8560: 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 2c 20 54   Token *pName, T
8570: 6f 6b 65 6e 20 2a 70 54 79 70 65 29 7b 0a 20 20  oken *pType){.  
8580: 54 61 62 6c 65 20 2a 70 3b 0a 20 20 69 6e 74 20  Table *p;.  int 
8590: 69 3b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20  i;.  char *z;.  
85a0: 63 68 61 72 20 2a 7a 54 79 70 65 3b 0a 20 20 43  char *zType;.  C
85b0: 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 73  olumn *pCol;.  s
85c0: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
85d0: 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20 28  rse->db;.  if( (
85e0: 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  p = pParse->pNew
85f0: 54 61 62 6c 65 29 3d 3d 30 20 29 20 72 65 74 75  Table)==0 ) retu
8600: 72 6e 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d  rn;.#if SQLITE_M
8610: 41 58 5f 43 4f 4c 55 4d 4e 0a 20 20 69 66 28 20  AX_COLUMN.  if( 
8620: 70 2d 3e 6e 43 6f 6c 2b 31 3e 64 62 2d 3e 61 4c  p->nCol+1>db->aL
8630: 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49  imit[SQLITE_LIMI
8640: 54 5f 43 4f 4c 55 4d 4e 5d 20 29 7b 0a 20 20 20  T_COLUMN] ){.   
8650: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
8660: 28 70 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61  (pParse, "too ma
8670: 6e 79 20 63 6f 6c 75 6d 6e 73 20 6f 6e 20 25 73  ny columns on %s
8680: 22 2c 20 70 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  ", p->zName);.  
8690: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 23 65    return;.  }.#e
86a0: 6e 64 69 66 0a 20 20 7a 20 3d 20 73 71 6c 69 74  ndif.  z = sqlit
86b0: 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62  e3DbMallocRaw(db
86c0: 2c 20 70 4e 61 6d 65 2d 3e 6e 20 2b 20 70 54 79  , pName->n + pTy
86d0: 70 65 2d 3e 6e 20 2b 20 32 29 3b 0a 20 20 69 66  pe->n + 2);.  if
86e0: 28 20 7a 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ( z==0 ) return;
86f0: 0a 20 20 6d 65 6d 63 70 79 28 7a 2c 20 70 4e 61  .  memcpy(z, pNa
8700: 6d 65 2d 3e 7a 2c 20 70 4e 61 6d 65 2d 3e 6e 29  me->z, pName->n)
8710: 3b 0a 20 20 7a 5b 70 4e 61 6d 65 2d 3e 6e 5d 20  ;.  z[pName->n] 
8720: 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 44 65  = 0;.  sqlite3De
8730: 71 75 6f 74 65 28 7a 29 3b 0a 20 20 66 6f 72 28  quote(z);.  for(
8740: 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 3b 20  i=0; i<p->nCol; 
8750: 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73 71  i++){.    if( sq
8760: 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28 7a 2c  lite3_stricmp(z,
8770: 20 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d   p->aCol[i].zNam
8780: 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  e)==0 ){.      s
8790: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
87a0: 50 61 72 73 65 2c 20 22 64 75 70 6c 69 63 61 74  Parse, "duplicat
87b0: 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 3a 20 25  e column name: %
87c0: 73 22 2c 20 7a 29 3b 0a 20 20 20 20 20 20 73 71  s", z);.      sq
87d0: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
87e0: 7a 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  z);.      return
87f0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
8800: 28 20 28 70 2d 3e 6e 43 6f 6c 20 26 20 30 78 37  ( (p->nCol & 0x7
8810: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 43 6f 6c 75  )==0 ){.    Colu
8820: 6d 6e 20 2a 61 4e 65 77 3b 0a 20 20 20 20 61 4e  mn *aNew;.    aN
8830: 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62 52 65  ew = sqlite3DbRe
8840: 61 6c 6c 6f 63 28 64 62 2c 70 2d 3e 61 43 6f 6c  alloc(db,p->aCol
8850: 2c 28 70 2d 3e 6e 43 6f 6c 2b 38 29 2a 73 69 7a  ,(p->nCol+8)*siz
8860: 65 6f 66 28 70 2d 3e 61 43 6f 6c 5b 30 5d 29 29  eof(p->aCol[0]))
8870: 3b 0a 20 20 20 20 69 66 28 20 61 4e 65 77 3d 3d  ;.    if( aNew==
8880: 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
8890: 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 29 3b  e3DbFree(db, z);
88a0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  .      return;. 
88b0: 20 20 20 7d 0a 20 20 20 20 70 2d 3e 61 43 6f 6c     }.    p->aCol
88c0: 20 3d 20 61 4e 65 77 3b 0a 20 20 7d 0a 20 20 70   = aNew;.  }.  p
88d0: 43 6f 6c 20 3d 20 26 70 2d 3e 61 43 6f 6c 5b 70  Col = &p->aCol[p
88e0: 2d 3e 6e 43 6f 6c 5d 3b 0a 20 20 6d 65 6d 73 65  ->nCol];.  memse
88f0: 74 28 70 43 6f 6c 2c 20 30 2c 20 73 69 7a 65 6f  t(pCol, 0, sizeo
8900: 66 28 70 2d 3e 61 43 6f 6c 5b 30 5d 29 29 3b 0a  f(p->aCol[0]));.
8910: 20 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 20 3d 20    pCol->zName = 
8920: 7a 3b 0a 20 20 73 71 6c 69 74 65 33 43 6f 6c 75  z;.  sqlite3Colu
8930: 6d 6e 50 72 6f 70 65 72 74 69 65 73 46 72 6f 6d  mnPropertiesFrom
8940: 4e 61 6d 65 28 70 2c 20 70 43 6f 6c 29 3b 0a 20  Name(p, pCol);. 
8950: 0a 20 20 69 66 28 20 70 54 79 70 65 2d 3e 6e 3d  .  if( pType->n=
8960: 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20  =0 ){.    /* If 
8970: 74 68 65 72 65 20 69 73 20 6e 6f 20 74 79 70 65  there is no type
8980: 20 73 70 65 63 69 66 69 65 64 2c 20 63 6f 6c 75   specified, colu
8990: 6d 6e 73 20 68 61 76 65 20 74 68 65 20 64 65 66  mns have the def
89a0: 61 75 6c 74 20 61 66 66 69 6e 69 74 79 0a 20 20  ault affinity.  
89b0: 20 20 2a 2a 20 27 42 4c 4f 42 27 2e 20 2a 2f 0a    ** 'BLOB'. */.
89c0: 20 20 20 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69      pCol->affini
89d0: 74 79 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f  ty = SQLITE_AFF_
89e0: 42 4c 4f 42 3b 0a 20 20 20 20 70 43 6f 6c 2d 3e  BLOB;.    pCol->
89f0: 73 7a 45 73 74 20 3d 20 31 3b 0a 20 20 7d 65 6c  szEst = 1;.  }el
8a00: 73 65 7b 0a 20 20 20 20 7a 54 79 70 65 20 3d 20  se{.    zType = 
8a10: 7a 20 2b 20 73 71 6c 69 74 65 33 53 74 72 6c 65  z + sqlite3Strle
8a20: 6e 33 30 28 7a 29 20 2b 20 31 3b 0a 20 20 20 20  n30(z) + 1;.    
8a30: 6d 65 6d 63 70 79 28 7a 54 79 70 65 2c 20 70 54  memcpy(zType, pT
8a40: 79 70 65 2d 3e 7a 2c 20 70 54 79 70 65 2d 3e 6e  ype->z, pType->n
8a50: 29 3b 0a 20 20 20 20 7a 54 79 70 65 5b 70 54 79  );.    zType[pTy
8a60: 70 65 2d 3e 6e 5d 20 3d 20 30 3b 0a 20 20 20 20  pe->n] = 0;.    
8a70: 73 71 6c 69 74 65 33 44 65 71 75 6f 74 65 28 7a  sqlite3Dequote(z
8a80: 54 79 70 65 29 3b 0a 20 20 20 20 70 43 6f 6c 2d  Type);.    pCol-
8a90: 3e 61 66 66 69 6e 69 74 79 20 3d 20 73 71 6c 69  >affinity = sqli
8aa0: 74 65 33 41 66 66 69 6e 69 74 79 54 79 70 65 28  te3AffinityType(
8ab0: 7a 54 79 70 65 2c 20 26 70 43 6f 6c 2d 3e 73 7a  zType, &pCol->sz
8ac0: 45 73 74 29 3b 0a 20 20 20 20 70 43 6f 6c 2d 3e  Est);.    pCol->
8ad0: 63 6f 6c 46 6c 61 67 73 20 7c 3d 20 43 4f 4c 46  colFlags |= COLF
8ae0: 4c 41 47 5f 48 41 53 54 59 50 45 3b 0a 20 20 7d  LAG_HASTYPE;.  }
8af0: 0a 20 20 70 2d 3e 6e 43 6f 6c 2b 2b 3b 0a 20 20  .  p->nCol++;.  
8b00: 70 50 61 72 73 65 2d 3e 63 6f 6e 73 74 72 61 69  pParse->constrai
8b10: 6e 74 4e 61 6d 65 2e 6e 20 3d 20 30 3b 0a 7d 0a  ntName.n = 0;.}.
8b20: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
8b30: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 62 79  ine is called by
8b40: 20 74 68 65 20 70 61 72 73 65 72 20 77 68 69 6c   the parser whil
8b50: 65 20 69 6e 20 74 68 65 20 6d 69 64 64 6c 65 20  e in the middle 
8b60: 6f 66 0a 2a 2a 20 70 61 72 73 69 6e 67 20 61 20  of.** parsing a 
8b70: 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61  CREATE TABLE sta
8b80: 74 65 6d 65 6e 74 2e 20 20 41 20 22 4e 4f 54 20  tement.  A "NOT 
8b90: 4e 55 4c 4c 22 20 63 6f 6e 73 74 72 61 69 6e 74  NULL" constraint
8ba0: 20 68 61 73 0a 2a 2a 20 62 65 65 6e 20 73 65 65   has.** been see
8bb0: 6e 20 6f 6e 20 61 20 63 6f 6c 75 6d 6e 2e 20 20  n on a column.  
8bc0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74  This routine set
8bd0: 73 20 74 68 65 20 6e 6f 74 4e 75 6c 6c 20 66 6c  s the notNull fl
8be0: 61 67 20 6f 6e 0a 2a 2a 20 74 68 65 20 63 6f 6c  ag on.** the col
8bf0: 75 6d 6e 20 63 75 72 72 65 6e 74 6c 79 20 75 6e  umn currently un
8c00: 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e  der construction
8c10: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
8c20: 33 41 64 64 4e 6f 74 4e 75 6c 6c 28 50 61 72 73  3AddNotNull(Pars
8c30: 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 6f  e *pParse, int o
8c40: 6e 45 72 72 6f 72 29 7b 0a 20 20 54 61 62 6c 65  nError){.  Table
8c50: 20 2a 70 3b 0a 20 20 70 20 3d 20 70 50 61 72 73   *p;.  p = pPars
8c60: 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20  e->pNewTable;.  
8c70: 69 66 28 20 70 3d 3d 30 20 7c 7c 20 4e 45 56 45  if( p==0 || NEVE
8c80: 52 28 70 2d 3e 6e 43 6f 6c 3c 31 29 20 29 20 72  R(p->nCol<1) ) r
8c90: 65 74 75 72 6e 3b 0a 20 20 70 2d 3e 61 43 6f 6c  eturn;.  p->aCol
8ca0: 5b 70 2d 3e 6e 43 6f 6c 2d 31 5d 2e 6e 6f 74 4e  [p->nCol-1].notN
8cb0: 75 6c 6c 20 3d 20 28 75 38 29 6f 6e 45 72 72 6f  ull = (u8)onErro
8cc0: 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 63 61 6e  r;.}../*.** Scan
8cd0: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 74 79 70 65   the column type
8ce0: 20 6e 61 6d 65 20 7a 54 79 70 65 20 28 6c 65 6e   name zType (len
8cf0: 67 74 68 20 6e 54 79 70 65 29 20 61 6e 64 20 72  gth nType) and r
8d00: 65 74 75 72 6e 20 74 68 65 0a 2a 2a 20 61 73 73  eturn the.** ass
8d10: 6f 63 69 61 74 65 64 20 61 66 66 69 6e 69 74 79  ociated affinity
8d20: 20 74 79 70 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69   type..**.** Thi
8d30: 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 61  s routine does a
8d40: 20 63 61 73 65 2d 69 6e 64 65 70 65 6e 64 65 6e   case-independen
8d50: 74 20 73 65 61 72 63 68 20 6f 66 20 7a 54 79 70  t search of zTyp
8d60: 65 20 66 6f 72 20 74 68 65 20 0a 2a 2a 20 73 75  e for the .** su
8d70: 62 73 74 72 69 6e 67 73 20 69 6e 20 74 68 65 20  bstrings in the 
8d80: 66 6f 6c 6c 6f 77 69 6e 67 20 74 61 62 6c 65 2e  following table.
8d90: 20 49 66 20 6f 6e 65 20 6f 66 20 74 68 65 20 73   If one of the s
8da0: 75 62 73 74 72 69 6e 67 73 20 69 73 0a 2a 2a 20  ubstrings is.** 
8db0: 66 6f 75 6e 64 2c 20 74 68 65 20 63 6f 72 72 65  found, the corre
8dc0: 73 70 6f 6e 64 69 6e 67 20 61 66 66 69 6e 69 74  sponding affinit
8dd0: 79 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49  y is returned. I
8de0: 66 20 7a 54 79 70 65 20 63 6f 6e 74 61 69 6e 73  f zType contains
8df0: 0a 2a 2a 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e  .** more than on
8e00: 65 20 6f 66 20 74 68 65 20 73 75 62 73 74 72 69  e of the substri
8e10: 6e 67 73 2c 20 65 6e 74 72 69 65 73 20 74 6f 77  ngs, entries tow
8e20: 61 72 64 20 74 68 65 20 74 6f 70 20 6f 66 20 0a  ard the top of .
8e30: 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 74 61 6b  ** the table tak
8e40: 65 20 70 72 69 6f 72 69 74 79 2e 20 46 6f 72 20  e priority. For 
8e50: 65 78 61 6d 70 6c 65 2c 20 69 66 20 7a 54 79 70  example, if zTyp
8e60: 65 20 69 73 20 27 42 4c 4f 42 49 4e 54 27 2c 20  e is 'BLOBINT', 
8e70: 0a 2a 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f 49  .** SQLITE_AFF_I
8e80: 4e 54 45 47 45 52 20 69 73 20 72 65 74 75 72 6e  NTEGER is return
8e90: 65 64 2e 0a 2a 2a 0a 2a 2a 20 53 75 62 73 74 72  ed..**.** Substr
8ea0: 69 6e 67 20 20 20 20 20 7c 20 41 66 66 69 6e 69  ing     | Affini
8eb0: 74 79 0a 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ty.** ----------
8ec0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8ed0: 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 27 49 4e 54 27 20  ------.** 'INT' 
8ee0: 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45          | SQLITE
8ef0: 5f 41 46 46 5f 49 4e 54 45 47 45 52 0a 2a 2a 20  _AFF_INTEGER.** 
8f00: 27 43 48 41 52 27 20 20 20 20 20 20 20 20 7c 20  'CHAR'        | 
8f10: 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 0a  SQLITE_AFF_TEXT.
8f20: 2a 2a 20 27 43 4c 4f 42 27 20 20 20 20 20 20 20  ** 'CLOB'       
8f30: 20 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45   | SQLITE_AFF_TE
8f40: 58 54 0a 2a 2a 20 27 54 45 58 54 27 20 20 20 20  XT.** 'TEXT'    
8f50: 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 41 46 46      | SQLITE_AFF
8f60: 5f 54 45 58 54 0a 2a 2a 20 27 42 4c 4f 42 27 20  _TEXT.** 'BLOB' 
8f70: 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f         | SQLITE_
8f80: 41 46 46 5f 42 4c 4f 42 0a 2a 2a 20 27 52 45 41  AFF_BLOB.** 'REA
8f90: 4c 27 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49  L'        | SQLI
8fa0: 54 45 5f 41 46 46 5f 52 45 41 4c 0a 2a 2a 20 27  TE_AFF_REAL.** '
8fb0: 46 4c 4f 41 27 20 20 20 20 20 20 20 20 7c 20 53  FLOA'        | S
8fc0: 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 0a 2a  QLITE_AFF_REAL.*
8fd0: 2a 20 27 44 4f 55 42 27 20 20 20 20 20 20 20 20  * 'DOUB'        
8fe0: 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41  | SQLITE_AFF_REA
8ff0: 4c 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 6e 65 20  L.**.** If none 
9000: 6f 66 20 74 68 65 20 73 75 62 73 74 72 69 6e 67  of the substring
9010: 73 20 69 6e 20 74 68 65 20 61 62 6f 76 65 20 74  s in the above t
9020: 61 62 6c 65 20 61 72 65 20 66 6f 75 6e 64 2c 0a  able are found,.
9030: 2a 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55  ** SQLITE_AFF_NU
9040: 4d 45 52 49 43 20 69 73 20 72 65 74 75 72 6e 65  MERIC is returne
9050: 64 2e 0a 2a 2f 0a 63 68 61 72 20 73 71 6c 69 74  d..*/.char sqlit
9060: 65 33 41 66 66 69 6e 69 74 79 54 79 70 65 28 63  e3AffinityType(c
9070: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 6e 2c 20  onst char *zIn, 
9080: 75 38 20 2a 70 73 7a 45 73 74 29 7b 0a 20 20 75  u8 *pszEst){.  u
9090: 33 32 20 68 20 3d 20 30 3b 0a 20 20 63 68 61 72  32 h = 0;.  char
90a0: 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46   aff = SQLITE_AF
90b0: 46 5f 4e 55 4d 45 52 49 43 3b 0a 20 20 63 6f 6e  F_NUMERIC;.  con
90c0: 73 74 20 63 68 61 72 20 2a 7a 43 68 61 72 20 3d  st char *zChar =
90d0: 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 7a   0;..  assert( z
90e0: 49 6e 21 3d 30 20 29 3b 0a 20 20 77 68 69 6c 65  In!=0 );.  while
90f0: 28 20 7a 49 6e 5b 30 5d 20 29 7b 0a 20 20 20 20  ( zIn[0] ){.    
9100: 68 20 3d 20 28 68 3c 3c 38 29 20 2b 20 73 71 6c  h = (h<<8) + sql
9110: 69 74 65 33 55 70 70 65 72 54 6f 4c 6f 77 65 72  ite3UpperToLower
9120: 5b 28 2a 7a 49 6e 29 26 30 78 66 66 5d 3b 0a 20  [(*zIn)&0xff];. 
9130: 20 20 20 7a 49 6e 2b 2b 3b 0a 20 20 20 20 69 66     zIn++;.    if
9140: 28 20 68 3d 3d 28 28 27 63 27 3c 3c 32 34 29 2b  ( h==(('c'<<24)+
9150: 28 27 68 27 3c 3c 31 36 29 2b 28 27 61 27 3c 3c  ('h'<<16)+('a'<<
9160: 38 29 2b 27 72 27 29 20 29 7b 20 20 20 20 20 20  8)+'r') ){      
9170: 20 20 20 20 20 20 20 2f 2a 20 43 48 41 52 20 2a         /* CHAR *
9180: 2f 0a 20 20 20 20 20 20 61 66 66 20 3d 20 53 51  /.      aff = SQ
9190: 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 3b 0a 20  LITE_AFF_TEXT;. 
91a0: 20 20 20 20 20 7a 43 68 61 72 20 3d 20 7a 49 6e       zChar = zIn
91b0: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
91c0: 68 3d 3d 28 28 27 63 27 3c 3c 32 34 29 2b 28 27  h==(('c'<<24)+('
91d0: 6c 27 3c 3c 31 36 29 2b 28 27 6f 27 3c 3c 38 29  l'<<16)+('o'<<8)
91e0: 2b 27 62 27 29 20 29 7b 20 20 20 20 20 20 20 2f  +'b') ){       /
91f0: 2a 20 43 4c 4f 42 20 2a 2f 0a 20 20 20 20 20 20  * CLOB */.      
9200: 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46  aff = SQLITE_AFF
9210: 5f 54 45 58 54 3b 0a 20 20 20 20 7d 65 6c 73 65  _TEXT;.    }else
9220: 20 69 66 28 20 68 3d 3d 28 28 27 74 27 3c 3c 32   if( h==(('t'<<2
9230: 34 29 2b 28 27 65 27 3c 3c 31 36 29 2b 28 27 78  4)+('e'<<16)+('x
9240: 27 3c 3c 38 29 2b 27 74 27 29 20 29 7b 20 20 20  '<<8)+'t') ){   
9250: 20 20 20 20 2f 2a 20 54 45 58 54 20 2a 2f 0a 20      /* TEXT */. 
9260: 20 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49 54       aff = SQLIT
9270: 45 5f 41 46 46 5f 54 45 58 54 3b 0a 20 20 20 20  E_AFF_TEXT;.    
9280: 7d 65 6c 73 65 20 69 66 28 20 68 3d 3d 28 28 27  }else if( h==(('
9290: 62 27 3c 3c 32 34 29 2b 28 27 6c 27 3c 3c 31 36  b'<<24)+('l'<<16
92a0: 29 2b 28 27 6f 27 3c 3c 38 29 2b 27 62 27 29 20  )+('o'<<8)+'b') 
92b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 42 4c 4f 42           /* BLOB
92c0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 26 26 20 28   */.        && (
92d0: 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f  aff==SQLITE_AFF_
92e0: 4e 55 4d 45 52 49 43 20 7c 7c 20 61 66 66 3d 3d  NUMERIC || aff==
92f0: 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 29  SQLITE_AFF_REAL)
9300: 20 29 7b 0a 20 20 20 20 20 20 61 66 66 20 3d 20   ){.      aff = 
9310: 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 3b  SQLITE_AFF_BLOB;
9320: 0a 20 20 20 20 20 20 69 66 28 20 7a 49 6e 5b 30  .      if( zIn[0
9330: 5d 3d 3d 27 28 27 20 29 20 7a 43 68 61 72 20 3d  ]=='(' ) zChar =
9340: 20 7a 49 6e 3b 0a 23 69 66 6e 64 65 66 20 53 51   zIn;.#ifndef SQ
9350: 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49  LITE_OMIT_FLOATI
9360: 4e 47 5f 50 4f 49 4e 54 0a 20 20 20 20 7d 65 6c  NG_POINT.    }el
9370: 73 65 20 69 66 28 20 68 3d 3d 28 28 27 72 27 3c  se if( h==(('r'<
9380: 3c 32 34 29 2b 28 27 65 27 3c 3c 31 36 29 2b 28  <24)+('e'<<16)+(
9390: 27 61 27 3c 3c 38 29 2b 27 6c 27 29 20 20 20 20  'a'<<8)+'l')    
93a0: 20 20 20 20 20 20 2f 2a 20 52 45 41 4c 20 2a 2f        /* REAL */
93b0: 0a 20 20 20 20 20 20 20 20 26 26 20 61 66 66 3d  .        && aff=
93c0: 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45  =SQLITE_AFF_NUME
93d0: 52 49 43 20 29 7b 0a 20 20 20 20 20 20 61 66 66  RIC ){.      aff
93e0: 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 52 45   = SQLITE_AFF_RE
93f0: 41 4c 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  AL;.    }else if
9400: 28 20 68 3d 3d 28 28 27 66 27 3c 3c 32 34 29 2b  ( h==(('f'<<24)+
9410: 28 27 6c 27 3c 3c 31 36 29 2b 28 27 6f 27 3c 3c  ('l'<<16)+('o'<<
9420: 38 29 2b 27 61 27 29 20 20 20 20 20 20 20 20 20  8)+'a')         
9430: 20 2f 2a 20 46 4c 4f 41 20 2a 2f 0a 20 20 20 20   /* FLOA */.    
9440: 20 20 20 20 26 26 20 61 66 66 3d 3d 53 51 4c 49      && aff==SQLI
9450: 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20 29  TE_AFF_NUMERIC )
9460: 7b 0a 20 20 20 20 20 20 61 66 66 20 3d 20 53 51  {.      aff = SQ
9470: 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 3b 0a 20  LITE_AFF_REAL;. 
9480: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 68 3d 3d     }else if( h==
9490: 28 28 27 64 27 3c 3c 32 34 29 2b 28 27 6f 27 3c  (('d'<<24)+('o'<
94a0: 3c 31 36 29 2b 28 27 75 27 3c 3c 38 29 2b 27 62  <16)+('u'<<8)+'b
94b0: 27 29 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44  ')          /* D
94c0: 4f 55 42 20 2a 2f 0a 20 20 20 20 20 20 20 20 26  OUB */.        &
94d0: 26 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46  & aff==SQLITE_AF
94e0: 46 5f 4e 55 4d 45 52 49 43 20 29 7b 0a 20 20 20  F_NUMERIC ){.   
94f0: 20 20 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f     aff = SQLITE_
9500: 41 46 46 5f 52 45 41 4c 3b 0a 23 65 6e 64 69 66  AFF_REAL;.#endif
9510: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28  .    }else if( (
9520: 68 26 30 78 30 30 46 46 46 46 46 46 29 3d 3d 28  h&0x00FFFFFF)==(
9530: 28 27 69 27 3c 3c 31 36 29 2b 28 27 6e 27 3c 3c  ('i'<<16)+('n'<<
9540: 38 29 2b 27 74 27 29 20 29 7b 20 20 20 20 2f 2a  8)+'t') ){    /*
9550: 20 49 4e 54 20 2a 2f 0a 20 20 20 20 20 20 61 66   INT */.      af
9560: 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 49  f = SQLITE_AFF_I
9570: 4e 54 45 47 45 52 3b 0a 20 20 20 20 20 20 62 72  NTEGER;.      br
9580: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  eak;.    }.  }..
9590: 20 20 2f 2a 20 49 66 20 70 73 7a 45 73 74 20 69    /* If pszEst i
95a0: 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 73 74 6f 72  s not NULL, stor
95b0: 65 20 61 6e 20 65 73 74 69 6d 61 74 65 20 6f 66  e an estimate of
95c0: 20 74 68 65 20 66 69 65 6c 64 20 73 69 7a 65 2e   the field size.
95d0: 20 20 54 68 65 0a 20 20 2a 2a 20 65 73 74 69 6d    The.  ** estim
95e0: 61 74 65 20 69 73 20 73 63 61 6c 65 64 20 73 6f  ate is scaled so
95f0: 20 74 68 61 74 20 74 68 65 20 73 69 7a 65 20 6f   that the size o
9600: 66 20 61 6e 20 69 6e 74 65 67 65 72 20 69 73 20  f an integer is 
9610: 31 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70 73 7a  1.  */.  if( psz
9620: 45 73 74 20 29 7b 0a 20 20 20 20 2a 70 73 7a 45  Est ){.    *pszE
9630: 73 74 20 3d 20 31 3b 20 20 20 2f 2a 20 64 65 66  st = 1;   /* def
9640: 61 75 6c 74 20 73 69 7a 65 20 69 73 20 61 70 70  ault size is app
9650: 72 6f 78 20 34 20 62 79 74 65 73 20 2a 2f 0a 20  rox 4 bytes */. 
9660: 20 20 20 69 66 28 20 61 66 66 3c 53 51 4c 49 54     if( aff<SQLIT
9670: 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20 29 7b  E_AFF_NUMERIC ){
9680: 0a 20 20 20 20 20 20 69 66 28 20 7a 43 68 61 72  .      if( zChar
9690: 20 29 7b 0a 20 20 20 20 20 20 20 20 77 68 69 6c   ){.        whil
96a0: 65 28 20 7a 43 68 61 72 5b 30 5d 20 29 7b 0a 20  e( zChar[0] ){. 
96b0: 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c           if( sql
96c0: 69 74 65 33 49 73 64 69 67 69 74 28 7a 43 68 61  ite3Isdigit(zCha
96d0: 72 5b 30 5d 29 20 29 7b 0a 20 20 20 20 20 20 20  r[0]) ){.       
96e0: 20 20 20 20 20 69 6e 74 20 76 20 3d 20 30 3b 0a       int v = 0;.
96f0: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
9700: 74 65 33 47 65 74 49 6e 74 33 32 28 7a 43 68 61  te3GetInt32(zCha
9710: 72 2c 20 26 76 29 3b 0a 20 20 20 20 20 20 20 20  r, &v);.        
9720: 20 20 20 20 76 20 3d 20 76 2f 34 20 2b 20 31 3b      v = v/4 + 1;
9730: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
9740: 20 76 3e 32 35 35 20 29 20 76 20 3d 20 32 35 35   v>255 ) v = 255
9750: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 70  ;.            *p
9760: 73 7a 45 73 74 20 3d 20 76 3b 20 2f 2a 20 42 4c  szEst = v; /* BL
9770: 4f 42 28 6b 29 2c 20 56 41 52 43 48 41 52 28 6b  OB(k), VARCHAR(k
9780: 29 2c 20 43 48 41 52 28 6b 29 20 2d 3e 20 72 3d  ), CHAR(k) -> r=
9790: 28 6b 2f 34 2b 31 29 20 2a 2f 0a 20 20 20 20 20  (k/4+1) */.     
97a0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
97b0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
97c0: 20 20 20 20 7a 43 68 61 72 2b 2b 3b 0a 20 20 20      zChar++;.   
97d0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
97e0: 73 65 7b 0a 20 20 20 20 20 20 20 20 2a 70 73 7a  se{.        *psz
97f0: 45 73 74 20 3d 20 35 3b 20 20 20 2f 2a 20 42 4c  Est = 5;   /* BL
9800: 4f 42 2c 20 54 45 58 54 2c 20 43 4c 4f 42 20 2d  OB, TEXT, CLOB -
9810: 3e 20 72 3d 35 20 20 28 61 70 70 72 6f 78 20 32  > r=5  (approx 2
9820: 30 20 62 79 74 65 73 29 2a 2f 0a 20 20 20 20 20  0 bytes)*/.     
9830: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72   }.    }.  }.  r
9840: 65 74 75 72 6e 20 61 66 66 3b 0a 7d 0a 0a 2f 2a  eturn aff;.}../*
9850: 0a 2a 2a 20 54 68 65 20 65 78 70 72 65 73 73 69  .** The expressi
9860: 6f 6e 20 69 73 20 74 68 65 20 64 65 66 61 75 6c  on is the defaul
9870: 74 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20  t value for the 
9880: 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 61 64  most recently ad
9890: 64 65 64 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 6f 66  ded column.** of
98a0: 20 74 68 65 20 74 61 62 6c 65 20 63 75 72 72 65   the table curre
98b0: 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74  ntly under const
98c0: 72 75 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 44  ruction..**.** D
98d0: 65 66 61 75 6c 74 20 76 61 6c 75 65 20 65 78 70  efault value exp
98e0: 72 65 73 73 69 6f 6e 73 20 6d 75 73 74 20 62 65  ressions must be
98f0: 20 63 6f 6e 73 74 61 6e 74 2e 20 20 52 61 69 73   constant.  Rais
9900: 65 20 61 6e 20 65 78 63 65 70 74 69 6f 6e 20 69  e an exception i
9910: 66 20 74 68 69 73 0a 2a 2a 20 69 73 20 6e 6f 74  f this.** is not
9920: 20 74 68 65 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a   the case..**.**
9930: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
9940: 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20 70   called by the p
9950: 61 72 73 65 72 20 77 68 69 6c 65 20 69 6e 20 74  arser while in t
9960: 68 65 20 6d 69 64 64 6c 65 20 6f 66 0a 2a 2a 20  he middle of.** 
9970: 70 61 72 73 69 6e 67 20 61 20 43 52 45 41 54 45  parsing a CREATE
9980: 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74   TABLE statement
9990: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
99a0: 33 41 64 64 44 65 66 61 75 6c 74 56 61 6c 75 65  3AddDefaultValue
99b0: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
99c0: 45 78 70 72 53 70 61 6e 20 2a 70 53 70 61 6e 29  ExprSpan *pSpan)
99d0: 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20  {.  Table *p;.  
99e0: 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20  Column *pCol;.  
99f0: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
9a00: 61 72 73 65 2d 3e 64 62 3b 0a 20 20 70 20 3d 20  arse->db;.  p = 
9a10: 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
9a20: 65 3b 0a 20 20 69 66 28 20 70 21 3d 30 20 29 7b  e;.  if( p!=0 ){
9a30: 0a 20 20 20 20 70 43 6f 6c 20 3d 20 26 28 70 2d  .    pCol = &(p-
9a40: 3e 61 43 6f 6c 5b 70 2d 3e 6e 43 6f 6c 2d 31 5d  >aCol[p->nCol-1]
9a50: 29 3b 0a 20 20 20 20 69 66 28 20 21 73 71 6c 69  );.    if( !sqli
9a60: 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e  te3ExprIsConstan
9a70: 74 4f 72 46 75 6e 63 74 69 6f 6e 28 70 53 70 61  tOrFunction(pSpa
9a80: 6e 2d 3e 70 45 78 70 72 2c 20 64 62 2d 3e 69 6e  n->pExpr, db->in
9a90: 69 74 2e 62 75 73 79 29 20 29 7b 0a 20 20 20 20  it.busy) ){.    
9aa0: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
9ab0: 67 28 70 50 61 72 73 65 2c 20 22 64 65 66 61 75  g(pParse, "defau
9ac0: 6c 74 20 76 61 6c 75 65 20 6f 66 20 63 6f 6c 75  lt value of colu
9ad0: 6d 6e 20 5b 25 73 5d 20 69 73 20 6e 6f 74 20 63  mn [%s] is not c
9ae0: 6f 6e 73 74 61 6e 74 22 2c 0a 20 20 20 20 20 20  onstant",.      
9af0: 20 20 20 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 29      pCol->zName)
9b00: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
9b10: 20 20 20 2f 2a 20 41 20 63 6f 70 79 20 6f 66 20     /* A copy of 
9b20: 70 45 78 70 72 20 69 73 20 75 73 65 64 20 69 6e  pExpr is used in
9b30: 73 74 65 61 64 20 6f 66 20 74 68 65 20 6f 72 69  stead of the ori
9b40: 67 69 6e 61 6c 2c 20 61 73 20 70 45 78 70 72 20  ginal, as pExpr 
9b50: 63 6f 6e 74 61 69 6e 73 0a 20 20 20 20 20 20 2a  contains.      *
9b60: 2a 20 74 6f 6b 65 6e 73 20 74 68 61 74 20 70 6f  * tokens that po
9b70: 69 6e 74 20 74 6f 20 76 6f 6c 61 74 69 6c 65 20  int to volatile 
9b80: 6d 65 6d 6f 72 79 2e 20 54 68 65 20 27 73 70 61  memory. The 'spa
9b90: 6e 27 20 6f 66 20 74 68 65 20 65 78 70 72 65 73  n' of the expres
9ba0: 73 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 69 73  sion.      ** is
9bb0: 20 72 65 71 75 69 72 65 64 20 62 79 20 70 72 61   required by pra
9bc0: 67 6d 61 20 74 61 62 6c 65 5f 69 6e 66 6f 2e 0a  gma table_info..
9bd0: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 45        */.      E
9be0: 78 70 72 20 78 3b 0a 20 20 20 20 20 20 73 71 6c  xpr x;.      sql
9bf0: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64  ite3ExprDelete(d
9c00: 62 2c 20 70 43 6f 6c 2d 3e 70 44 66 6c 74 29 3b  b, pCol->pDflt);
9c10: 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26 78  .      memset(&x
9c20: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 78 29 29 3b  , 0, sizeof(x));
9c30: 0a 20 20 20 20 20 20 78 2e 6f 70 20 3d 20 54 4b  .      x.op = TK
9c40: 5f 53 50 41 4e 3b 0a 20 20 20 20 20 20 78 2e 75  _SPAN;.      x.u
9c50: 2e 7a 54 6f 6b 65 6e 20 3d 20 73 71 6c 69 74 65  .zToken = sqlite
9c60: 33 44 62 53 74 72 4e 44 75 70 28 64 62 2c 20 28  3DbStrNDup(db, (
9c70: 63 68 61 72 2a 29 70 53 70 61 6e 2d 3e 7a 53 74  char*)pSpan->zSt
9c80: 61 72 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20  art,.           
9c90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9ca0: 20 20 20 20 20 20 20 20 20 28 69 6e 74 29 28 70           (int)(p
9cb0: 53 70 61 6e 2d 3e 7a 45 6e 64 20 2d 20 70 53 70  Span->zEnd - pSp
9cc0: 61 6e 2d 3e 7a 53 74 61 72 74 29 29 3b 0a 20 20  an->zStart));.  
9cd0: 20 20 20 20 78 2e 70 4c 65 66 74 20 3d 20 70 53      x.pLeft = pS
9ce0: 70 61 6e 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20  pan->pExpr;.    
9cf0: 20 20 78 2e 66 6c 61 67 73 20 3d 20 45 50 5f 53    x.flags = EP_S
9d00: 6b 69 70 3b 0a 20 20 20 20 20 20 70 43 6f 6c 2d  kip;.      pCol-
9d10: 3e 70 44 66 6c 74 20 3d 20 73 71 6c 69 74 65 33  >pDflt = sqlite3
9d20: 45 78 70 72 44 75 70 28 64 62 2c 20 26 78 2c 20  ExprDup(db, &x, 
9d30: 45 58 50 52 44 55 50 5f 52 45 44 55 43 45 29 3b  EXPRDUP_REDUCE);
9d40: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62  .      sqlite3Db
9d50: 46 72 65 65 28 64 62 2c 20 78 2e 75 2e 7a 54 6f  Free(db, x.u.zTo
9d60: 6b 65 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ken);.    }.  }.
9d70: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
9d80: 65 74 65 28 64 62 2c 20 70 53 70 61 6e 2d 3e 70  ete(db, pSpan->p
9d90: 45 78 70 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Expr);.}../*.** 
9da0: 42 61 63 6b 77 61 72 64 73 20 43 6f 6d 70 61 74  Backwards Compat
9db0: 69 62 69 6c 69 74 79 20 48 61 63 6b 3a 0a 2a 2a  ibility Hack:.**
9dc0: 20 0a 2a 2a 20 48 69 73 74 6f 72 69 63 61 6c 20   .** Historical 
9dd0: 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69  versions of SQLi
9de0: 74 65 20 61 63 63 65 70 74 65 64 20 73 74 72 69  te accepted stri
9df0: 6e 67 73 20 61 73 20 63 6f 6c 75 6d 6e 20 6e 61  ngs as column na
9e00: 6d 65 73 20 69 6e 0a 2a 2a 20 69 6e 64 65 78 65  mes in.** indexe
9e10: 73 20 61 6e 64 20 50 52 49 4d 41 52 59 20 4b 45  s and PRIMARY KE
9e20: 59 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 61 6e  Y constraints an
9e30: 64 20 69 6e 20 55 4e 49 51 55 45 20 63 6f 6e 73  d in UNIQUE cons
9e40: 74 72 61 69 6e 74 73 2e 20 20 45 78 61 6d 70 6c  traints.  Exampl
9e50: 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 43 52 45  e:.**.**     CRE
9e60: 41 54 45 20 54 41 42 4c 45 20 78 79 7a 28 61 2c  ATE TABLE xyz(a,
9e70: 62 2c 63 2c 64 2c 65 2c 50 52 49 4d 41 52 59 20  b,c,d,e,PRIMARY 
9e80: 4b 45 59 28 27 61 27 29 2c 55 4e 49 51 55 45 28  KEY('a'),UNIQUE(
9e90: 27 62 27 2c 27 63 27 20 43 4f 4c 4c 41 54 45 20  'b','c' COLLATE 
9ea0: 74 72 69 6d 29 0a 2a 2a 20 20 20 20 20 43 52 45  trim).**     CRE
9eb0: 41 54 45 20 49 4e 44 45 58 20 61 62 63 20 4f 4e  ATE INDEX abc ON
9ec0: 20 78 79 7a 28 27 63 27 2c 27 64 27 20 44 45 53   xyz('c','d' DES
9ed0: 43 2c 27 65 27 20 43 4f 4c 4c 41 54 45 20 6e 6f  C,'e' COLLATE no
9ee0: 63 61 73 65 20 44 45 53 43 29 3b 0a 2a 2a 0a 2a  case DESC);.**.*
9ef0: 2a 20 54 68 69 73 20 69 73 20 67 6f 6f 66 79 2e  * This is goofy.
9f00: 20 20 42 75 74 20 74 6f 20 70 72 65 73 65 72 76    But to preserv
9f10: 65 20 62 61 63 6b 77 61 72 64 73 20 63 6f 6d 70  e backwards comp
9f20: 61 74 69 62 69 6c 69 74 79 20 77 65 20 63 6f 6e  atibility we con
9f30: 74 69 6e 75 65 20 74 6f 0a 2a 2a 20 61 63 63 65  tinue to.** acce
9f40: 70 74 20 69 74 2e 20 20 54 68 69 73 20 72 6f 75  pt it.  This rou
9f50: 74 69 6e 65 20 64 6f 65 73 20 74 68 65 20 6e 65  tine does the ne
9f60: 63 65 73 73 61 72 79 20 63 6f 6e 76 65 72 73 69  cessary conversi
9f70: 6f 6e 2e 20 20 49 74 20 63 6f 6e 76 65 72 74 73  on.  It converts
9f80: 0a 2a 2a 20 74 68 65 20 65 78 70 72 65 73 73 69  .** the expressi
9f90: 6f 6e 20 67 69 76 65 6e 20 69 6e 20 69 74 73 20  on given in its 
9fa0: 61 72 67 75 6d 65 6e 74 20 66 72 6f 6d 20 61 20  argument from a 
9fb0: 54 4b 5f 53 54 52 49 4e 47 20 69 6e 74 6f 20 61  TK_STRING into a
9fc0: 20 54 4b 5f 49 44 0a 2a 2a 20 69 66 20 74 68 65   TK_ID.** if the
9fd0: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 6a   expression is j
9fe0: 75 73 74 20 61 20 54 4b 5f 53 54 52 49 4e 47 20  ust a TK_STRING 
9ff0: 77 69 74 68 20 61 6e 20 6f 70 74 69 6f 6e 61 6c  with an optional
a000: 20 43 4f 4c 4c 41 54 45 20 63 6c 61 75 73 65 2e   COLLATE clause.
a010: 0a 2a 2a 20 49 66 20 74 68 65 20 65 70 78 72 65  .** If the epxre
a020: 73 73 69 6f 6e 20 69 73 20 61 6e 79 74 68 69 6e  ssion is anythin
a030: 67 20 6f 74 68 65 72 20 74 68 61 6e 20 54 4b 5f  g other than TK_
a040: 53 54 52 49 4e 47 2c 20 74 68 65 20 65 78 70 72  STRING, the expr
a050: 65 73 73 69 6f 6e 20 69 73 0a 2a 2a 20 75 6e 63  ession is.** unc
a060: 68 61 6e 67 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  hanged..*/.stati
a070: 63 20 76 6f 69 64 20 73 71 6c 69 74 65 33 53 74  c void sqlite3St
a080: 72 69 6e 67 54 6f 49 64 28 45 78 70 72 20 2a 70  ringToId(Expr *p
a090: 29 7b 0a 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d  ){.  if( p->op==
a0a0: 54 4b 5f 53 54 52 49 4e 47 20 29 7b 0a 20 20 20  TK_STRING ){.   
a0b0: 20 70 2d 3e 6f 70 20 3d 20 54 4b 5f 49 44 3b 0a   p->op = TK_ID;.
a0c0: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 6f    }else if( p->o
a0d0: 70 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45 20 26 26  p==TK_COLLATE &&
a0e0: 20 70 2d 3e 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54   p->pLeft->op==T
a0f0: 4b 5f 53 54 52 49 4e 47 20 29 7b 0a 20 20 20 20  K_STRING ){.    
a100: 70 2d 3e 70 4c 65 66 74 2d 3e 6f 70 20 3d 20 54  p->pLeft->op = T
a110: 4b 5f 49 44 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  K_ID;.  }.}../*.
a120: 2a 2a 20 44 65 73 69 67 6e 61 74 65 20 74 68 65  ** Designate the
a130: 20 50 52 49 4d 41 52 59 20 4b 45 59 20 66 6f 72   PRIMARY KEY for
a140: 20 74 68 65 20 74 61 62 6c 65 2e 20 20 70 4c 69   the table.  pLi
a150: 73 74 20 69 73 20 61 20 6c 69 73 74 20 6f 66 20  st is a list of 
a160: 6e 61 6d 65 73 20 0a 2a 2a 20 6f 66 20 63 6f 6c  names .** of col
a170: 75 6d 6e 73 20 74 68 61 74 20 66 6f 72 6d 20 74  umns that form t
a180: 68 65 20 70 72 69 6d 61 72 79 20 6b 65 79 2e 20  he primary key. 
a190: 20 49 66 20 70 4c 69 73 74 20 69 73 20 4e 55 4c   If pList is NUL
a1a0: 4c 2c 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20 6d  L, then the.** m
a1b0: 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 61 64 64  ost recently add
a1c0: 65 64 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65  ed column of the
a1d0: 20 74 61 62 6c 65 20 69 73 20 74 68 65 20 70 72   table is the pr
a1e0: 69 6d 61 72 79 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a  imary key..**.**
a1f0: 20 41 20 74 61 62 6c 65 20 63 61 6e 20 68 61 76   A table can hav
a200: 65 20 61 74 20 6d 6f 73 74 20 6f 6e 65 20 70 72  e at most one pr
a210: 69 6d 61 72 79 20 6b 65 79 2e 20 20 49 66 20 74  imary key.  If t
a220: 68 65 20 74 61 62 6c 65 20 61 6c 72 65 61 64 79  he table already
a230: 20 68 61 73 0a 2a 2a 20 61 20 70 72 69 6d 61 72   has.** a primar
a240: 79 20 6b 65 79 20 28 61 6e 64 20 74 68 69 73 20  y key (and this 
a250: 69 73 20 74 68 65 20 73 65 63 6f 6e 64 20 70 72  is the second pr
a260: 69 6d 61 72 79 20 6b 65 79 29 20 74 68 65 6e 20  imary key) then 
a270: 63 72 65 61 74 65 20 61 6e 0a 2a 2a 20 65 72 72  create an.** err
a280: 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  or..**.** If the
a290: 20 50 52 49 4d 41 52 59 20 4b 45 59 20 69 73 20   PRIMARY KEY is 
a2a0: 6f 6e 20 61 20 73 69 6e 67 6c 65 20 63 6f 6c 75  on a single colu
a2b0: 6d 6e 20 77 68 6f 73 65 20 64 61 74 61 74 79 70  mn whose datatyp
a2c0: 65 20 69 73 20 49 4e 54 45 47 45 52 2c 0a 2a 2a  e is INTEGER,.**
a2d0: 20 74 68 65 6e 20 77 65 20 77 69 6c 6c 20 74 72   then we will tr
a2e0: 79 20 74 6f 20 75 73 65 20 74 68 61 74 20 63 6f  y to use that co
a2f0: 6c 75 6d 6e 20 61 73 20 74 68 65 20 72 6f 77 69  lumn as the rowi
a300: 64 2e 20 20 53 65 74 20 74 68 65 20 54 61 62 6c  d.  Set the Tabl
a310: 65 2e 69 50 4b 65 79 0a 2a 2a 20 66 69 65 6c 64  e.iPKey.** field
a320: 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 75 6e   of the table un
a330: 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e  der construction
a340: 20 74 6f 20 62 65 20 74 68 65 20 69 6e 64 65 78   to be the index
a350: 20 6f 66 20 74 68 65 0a 2a 2a 20 49 4e 54 45 47   of the.** INTEG
a360: 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 20 63  ER PRIMARY KEY c
a370: 6f 6c 75 6d 6e 2e 20 20 54 61 62 6c 65 2e 69 50  olumn.  Table.iP
a380: 4b 65 79 20 69 73 20 73 65 74 20 74 6f 20 2d 31  Key is set to -1
a390: 20 69 66 20 74 68 65 72 65 20 69 73 0a 2a 2a 20   if there is.** 
a3a0: 6e 6f 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41  no INTEGER PRIMA
a3b0: 52 59 20 4b 45 59 2e 0a 2a 2a 0a 2a 2a 20 49 66  RY KEY..**.** If
a3c0: 20 74 68 65 20 6b 65 79 20 69 73 20 6e 6f 74 20   the key is not 
a3d0: 61 6e 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41  an INTEGER PRIMA
a3e0: 52 59 20 4b 45 59 2c 20 74 68 65 6e 20 63 72 65  RY KEY, then cre
a3f0: 61 74 65 20 61 20 75 6e 69 71 75 65 0a 2a 2a 20  ate a unique.** 
a400: 69 6e 64 65 78 20 66 6f 72 20 74 68 65 20 6b 65  index for the ke
a410: 79 2e 20 20 4e 6f 20 69 6e 64 65 78 20 69 73 20  y.  No index is 
a420: 63 72 65 61 74 65 64 20 66 6f 72 20 49 4e 54 45  created for INTE
a430: 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 73  GER PRIMARY KEYs
a440: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
a450: 33 41 64 64 50 72 69 6d 61 72 79 4b 65 79 28 0a  3AddPrimaryKey(.
a460: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
a470: 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
a480: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72  ontext */.  Expr
a490: 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 2f 2a  List *pList,  /*
a4a0: 20 4c 69 73 74 20 6f 66 20 66 69 65 6c 64 20 6e   List of field n
a4b0: 61 6d 65 73 20 74 6f 20 62 65 20 69 6e 64 65 78  ames to be index
a4c0: 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 6e 45 72  ed */.  int onEr
a4d0: 72 6f 72 2c 20 20 20 20 20 20 2f 2a 20 57 68 61  ror,      /* Wha
a4e0: 74 20 74 6f 20 64 6f 20 77 69 74 68 20 61 20 75  t to do with a u
a4f0: 6e 69 71 75 65 6e 65 73 73 20 63 6f 6e 66 6c 69  niqueness confli
a500: 63 74 20 2a 2f 0a 20 20 69 6e 74 20 61 75 74 6f  ct */.  int auto
a510: 49 6e 63 2c 20 20 20 20 20 20 2f 2a 20 54 72 75  Inc,      /* Tru
a520: 65 20 69 66 20 74 68 65 20 41 55 54 4f 49 4e 43  e if the AUTOINC
a530: 52 45 4d 45 4e 54 20 6b 65 79 77 6f 72 64 20 69  REMENT keyword i
a540: 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a 20 20 69  s present */.  i
a550: 6e 74 20 73 6f 72 74 4f 72 64 65 72 20 20 20 20  nt sortOrder    
a560: 20 2f 2a 20 53 51 4c 49 54 45 5f 53 4f 5f 41 53   /* SQLITE_SO_AS
a570: 43 20 6f 72 20 53 51 4c 49 54 45 5f 53 4f 5f 44  C or SQLITE_SO_D
a580: 45 53 43 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c  ESC */.){.  Tabl
a590: 65 20 2a 70 54 61 62 20 3d 20 70 50 61 72 73 65  e *pTab = pParse
a5a0: 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 43  ->pNewTable;.  C
a5b0: 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 20 3d 20 30 3b  olumn *pCol = 0;
a5c0: 0a 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 2d 31  .  int iCol = -1
a5d0: 2c 20 69 3b 0a 20 20 69 6e 74 20 6e 54 65 72 6d  , i;.  int nTerm
a5e0: 3b 0a 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20  ;.  if( pTab==0 
a5f0: 7c 7c 20 49 4e 5f 44 45 43 4c 41 52 45 5f 56 54  || IN_DECLARE_VT
a600: 41 42 20 29 20 67 6f 74 6f 20 70 72 69 6d 61 72  AB ) goto primar
a610: 79 5f 6b 65 79 5f 65 78 69 74 3b 0a 20 20 69 66  y_key_exit;.  if
a620: 28 20 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73  ( pTab->tabFlags
a630: 20 26 20 54 46 5f 48 61 73 50 72 69 6d 61 72 79   & TF_HasPrimary
a640: 4b 65 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  Key ){.    sqlit
a650: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
a660: 65 2c 20 0a 20 20 20 20 20 20 22 74 61 62 6c 65  e, .      "table
a670: 20 5c 22 25 73 5c 22 20 68 61 73 20 6d 6f 72 65   \"%s\" has more
a680: 20 74 68 61 6e 20 6f 6e 65 20 70 72 69 6d 61 72   than one primar
a690: 79 20 6b 65 79 22 2c 20 70 54 61 62 2d 3e 7a 4e  y key", pTab->zN
a6a0: 61 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20 70  ame);.    goto p
a6b0: 72 69 6d 61 72 79 5f 6b 65 79 5f 65 78 69 74 3b  rimary_key_exit;
a6c0: 0a 20 20 7d 0a 20 20 70 54 61 62 2d 3e 74 61 62  .  }.  pTab->tab
a6d0: 46 6c 61 67 73 20 7c 3d 20 54 46 5f 48 61 73 50  Flags |= TF_HasP
a6e0: 72 69 6d 61 72 79 4b 65 79 3b 0a 20 20 69 66 28  rimaryKey;.  if(
a6f0: 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20   pList==0 ){.   
a700: 20 69 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 6e 43   iCol = pTab->nC
a710: 6f 6c 20 2d 20 31 3b 0a 20 20 20 20 70 43 6f 6c  ol - 1;.    pCol
a720: 20 3d 20 26 70 54 61 62 2d 3e 61 43 6f 6c 5b 69   = &pTab->aCol[i
a730: 43 6f 6c 5d 3b 0a 20 20 20 20 70 43 6f 6c 2d 3e  Col];.    pCol->
a740: 63 6f 6c 46 6c 61 67 73 20 7c 3d 20 43 4f 4c 46  colFlags |= COLF
a750: 4c 41 47 5f 50 52 49 4d 4b 45 59 3b 0a 20 20 20  LAG_PRIMKEY;.   
a760: 20 6e 54 65 72 6d 20 3d 20 31 3b 0a 20 20 7d 65   nTerm = 1;.  }e
a770: 6c 73 65 7b 0a 20 20 20 20 6e 54 65 72 6d 20 3d  lse{.    nTerm =
a780: 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20   pList->nExpr;. 
a790: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 54     for(i=0; i<nT
a7a0: 65 72 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  erm; i++){.     
a7b0: 20 45 78 70 72 20 2a 70 43 45 78 70 72 20 3d 20   Expr *pCExpr = 
a7c0: 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43  sqlite3ExprSkipC
a7d0: 6f 6c 6c 61 74 65 28 70 4c 69 73 74 2d 3e 61 5b  ollate(pList->a[
a7e0: 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20  i].pExpr);.     
a7f0: 20 61 73 73 65 72 74 28 20 70 43 45 78 70 72 21   assert( pCExpr!
a800: 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  =0 );.      sqli
a810: 74 65 33 53 74 72 69 6e 67 54 6f 49 64 28 70 43  te3StringToId(pC
a820: 45 78 70 72 29 3b 0a 20 20 20 20 20 20 69 66 28  Expr);.      if(
a830: 20 70 43 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f   pCExpr->op==TK_
a840: 49 44 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f  ID ){.        co
a850: 6e 73 74 20 63 68 61 72 20 2a 7a 43 4e 61 6d 65  nst char *zCName
a860: 20 3d 20 70 43 45 78 70 72 2d 3e 75 2e 7a 54 6f   = pCExpr->u.zTo
a870: 6b 65 6e 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  ken;.        for
a880: 28 69 43 6f 6c 3d 30 3b 20 69 43 6f 6c 3c 70 54  (iCol=0; iCol<pT
a890: 61 62 2d 3e 6e 43 6f 6c 3b 20 69 43 6f 6c 2b 2b  ab->nCol; iCol++
a8a0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
a8b0: 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
a8c0: 7a 43 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 61 43  zCName, pTab->aC
a8d0: 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 29 3d  ol[iCol].zName)=
a8e0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
a8f0: 20 20 70 43 6f 6c 20 3d 20 26 70 54 61 62 2d 3e    pCol = &pTab->
a900: 61 43 6f 6c 5b 69 43 6f 6c 5d 3b 0a 20 20 20 20  aCol[iCol];.    
a910: 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 63 6f          pCol->co
a920: 6c 46 6c 61 67 73 20 7c 3d 20 43 4f 4c 46 4c 41  lFlags |= COLFLA
a930: 47 5f 50 52 49 4d 4b 45 59 3b 0a 20 20 20 20 20  G_PRIMKEY;.     
a940: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
a950: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
a960: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
a970: 7d 0a 20 20 7d 0a 20 20 69 66 28 20 6e 54 65 72  }.  }.  if( nTer
a980: 6d 3d 3d 31 0a 20 20 20 26 26 20 70 43 6f 6c 0a  m==1.   && pCol.
a990: 20 20 20 26 26 20 73 71 6c 69 74 65 33 53 74 72     && sqlite3Str
a9a0: 49 43 6d 70 28 73 71 6c 69 74 65 33 43 6f 6c 75  ICmp(sqlite3Colu
a9b0: 6d 6e 54 79 70 65 28 70 43 6f 6c 2c 22 22 29 2c  mnType(pCol,""),
a9c0: 20 22 49 4e 54 45 47 45 52 22 29 3d 3d 30 0a 20   "INTEGER")==0. 
a9d0: 20 20 26 26 20 73 6f 72 74 4f 72 64 65 72 21 3d    && sortOrder!=
a9e0: 53 51 4c 49 54 45 5f 53 4f 5f 44 45 53 43 0a 20  SQLITE_SO_DESC. 
a9f0: 20 29 7b 0a 20 20 20 20 70 54 61 62 2d 3e 69 50   ){.    pTab->iP
aa00: 4b 65 79 20 3d 20 69 43 6f 6c 3b 0a 20 20 20 20  Key = iCol;.    
aa10: 70 54 61 62 2d 3e 6b 65 79 43 6f 6e 66 20 3d 20  pTab->keyConf = 
aa20: 28 75 38 29 6f 6e 45 72 72 6f 72 3b 0a 20 20 20  (u8)onError;.   
aa30: 20 61 73 73 65 72 74 28 20 61 75 74 6f 49 6e 63   assert( autoInc
aa40: 3d 3d 30 20 7c 7c 20 61 75 74 6f 49 6e 63 3d 3d  ==0 || autoInc==
aa50: 31 20 29 3b 0a 20 20 20 20 70 54 61 62 2d 3e 74  1 );.    pTab->t
aa60: 61 62 46 6c 61 67 73 20 7c 3d 20 61 75 74 6f 49  abFlags |= autoI
aa70: 6e 63 2a 54 46 5f 41 75 74 6f 69 6e 63 72 65 6d  nc*TF_Autoincrem
aa80: 65 6e 74 3b 0a 20 20 20 20 69 66 28 20 70 4c 69  ent;.    if( pLi
aa90: 73 74 20 29 20 70 50 61 72 73 65 2d 3e 69 50 6b  st ) pParse->iPk
aaa0: 53 6f 72 74 4f 72 64 65 72 20 3d 20 70 4c 69 73  SortOrder = pLis
aab0: 74 2d 3e 61 5b 30 5d 2e 73 6f 72 74 4f 72 64 65  t->a[0].sortOrde
aac0: 72 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 61  r;.  }else if( a
aad0: 75 74 6f 49 6e 63 20 29 7b 0a 23 69 66 6e 64 65  utoInc ){.#ifnde
aae0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
aaf0: 54 4f 49 4e 43 52 45 4d 45 4e 54 0a 20 20 20 20  TOINCREMENT.    
ab00: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
ab10: 70 50 61 72 73 65 2c 20 22 41 55 54 4f 49 4e 43  pParse, "AUTOINC
ab20: 52 45 4d 45 4e 54 20 69 73 20 6f 6e 6c 79 20 61  REMENT is only a
ab30: 6c 6c 6f 77 65 64 20 6f 6e 20 61 6e 20 22 0a 20  llowed on an ". 
ab40: 20 20 20 20 20 20 22 49 4e 54 45 47 45 52 20 50        "INTEGER P
ab50: 52 49 4d 41 52 59 20 4b 45 59 22 29 3b 0a 23 65  RIMARY KEY");.#e
ab60: 6e 64 69 66 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ndif.  }else{.  
ab70: 20 20 49 6e 64 65 78 20 2a 70 3b 0a 20 20 20 20    Index *p;.    
ab80: 70 20 3d 20 73 71 6c 69 74 65 33 43 72 65 61 74  p = sqlite3Creat
ab90: 65 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 30  eIndex(pParse, 0
aba0: 2c 20 30 2c 20 30 2c 20 70 4c 69 73 74 2c 20 6f  , 0, 0, pList, o
abb0: 6e 45 72 72 6f 72 2c 20 30 2c 0a 20 20 20 20 20  nError, 0,.     
abc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
abd0: 20 20 20 20 20 20 30 2c 20 73 6f 72 74 4f 72 64        0, sortOrd
abe0: 65 72 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  er, 0);.    if( 
abf0: 70 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 69 64  p ){.      p->id
ac00: 78 54 79 70 65 20 3d 20 53 51 4c 49 54 45 5f 49  xType = SQLITE_I
ac10: 44 58 54 59 50 45 5f 50 52 49 4d 41 52 59 4b 45  DXTYPE_PRIMARYKE
ac20: 59 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c 69  Y;.    }.    pLi
ac30: 73 74 20 3d 20 30 3b 0a 20 20 7d 0a 0a 70 72 69  st = 0;.  }..pri
ac40: 6d 61 72 79 5f 6b 65 79 5f 65 78 69 74 3a 0a 20  mary_key_exit:. 
ac50: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
ac60: 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64  Delete(pParse->d
ac70: 62 2c 20 70 4c 69 73 74 29 3b 0a 20 20 72 65 74  b, pList);.  ret
ac80: 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64  urn;.}../*.** Ad
ac90: 64 20 61 20 6e 65 77 20 43 48 45 43 4b 20 63 6f  d a new CHECK co
aca0: 6e 73 74 72 61 69 6e 74 20 74 6f 20 74 68 65 20  nstraint to the 
acb0: 74 61 62 6c 65 20 63 75 72 72 65 6e 74 6c 79 20  table currently 
acc0: 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69  under constructi
acd0: 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  on..*/.void sqli
ace0: 74 65 33 41 64 64 43 68 65 63 6b 43 6f 6e 73 74  te3AddCheckConst
acf0: 72 61 69 6e 74 28 0a 20 20 50 61 72 73 65 20 2a  raint(.  Parse *
ad00: 70 50 61 72 73 65 2c 20 20 20 20 2f 2a 20 50 61  pParse,    /* Pa
ad10: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
ad20: 0a 20 20 45 78 70 72 20 2a 70 43 68 65 63 6b 45  .  Expr *pCheckE
ad30: 78 70 72 20 20 2f 2a 20 54 68 65 20 63 68 65 63  xpr  /* The chec
ad40: 6b 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a  k expression */.
ad50: 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ){.#ifndef SQLIT
ad60: 45 5f 4f 4d 49 54 5f 43 48 45 43 4b 0a 20 20 54  E_OMIT_CHECK.  T
ad70: 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 50 61  able *pTab = pPa
ad80: 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a  rse->pNewTable;.
ad90: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
ada0: 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66  pParse->db;.  if
adb0: 28 20 70 54 61 62 20 26 26 20 21 49 4e 5f 44 45  ( pTab && !IN_DE
adc0: 43 4c 41 52 45 5f 56 54 41 42 0a 20 20 20 26 26  CLARE_VTAB.   &&
add0: 20 21 73 71 6c 69 74 65 33 42 74 72 65 65 49 73   !sqlite3BtreeIs
ade0: 52 65 61 64 6f 6e 6c 79 28 64 62 2d 3e 61 44 62  Readonly(db->aDb
adf0: 5b 64 62 2d 3e 69 6e 69 74 2e 69 44 62 5d 2e 70  [db->init.iDb].p
ae00: 42 74 29 0a 20 20 29 7b 0a 20 20 20 20 70 54 61  Bt).  ){.    pTa
ae10: 62 2d 3e 70 43 68 65 63 6b 20 3d 20 73 71 6c 69  b->pCheck = sqli
ae20: 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e  te3ExprListAppen
ae30: 64 28 70 50 61 72 73 65 2c 20 70 54 61 62 2d 3e  d(pParse, pTab->
ae40: 70 43 68 65 63 6b 2c 20 70 43 68 65 63 6b 45 78  pCheck, pCheckEx
ae50: 70 72 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61  pr);.    if( pPa
ae60: 72 73 65 2d 3e 63 6f 6e 73 74 72 61 69 6e 74 4e  rse->constraintN
ae70: 61 6d 65 2e 6e 20 29 7b 0a 20 20 20 20 20 20 73  ame.n ){.      s
ae80: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 53 65  qlite3ExprListSe
ae90: 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 70 54  tName(pParse, pT
aea0: 61 62 2d 3e 70 43 68 65 63 6b 2c 20 26 70 50 61  ab->pCheck, &pPa
aeb0: 72 73 65 2d 3e 63 6f 6e 73 74 72 61 69 6e 74 4e  rse->constraintN
aec0: 61 6d 65 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20  ame, 1);.    }. 
aed0: 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20   }else.#endif.  
aee0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  {.    sqlite3Exp
aef0: 72 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e  rDelete(pParse->
af00: 64 62 2c 20 70 43 68 65 63 6b 45 78 70 72 29 3b  db, pCheckExpr);
af10: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  .  }.}../*.** Se
af20: 74 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20  t the collation 
af30: 66 75 6e 63 74 69 6f 6e 20 6f 66 20 74 68 65 20  function of the 
af40: 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 70 61  most recently pa
af50: 72 73 65 64 20 74 61 62 6c 65 20 63 6f 6c 75 6d  rsed table colum
af60: 6e 0a 2a 2a 20 74 6f 20 74 68 65 20 43 6f 6c 6c  n.** to the Coll
af70: 53 65 71 20 67 69 76 65 6e 2e 0a 2a 2f 0a 76 6f  Seq given..*/.vo
af80: 69 64 20 73 71 6c 69 74 65 33 41 64 64 43 6f 6c  id sqlite3AddCol
af90: 6c 61 74 65 54 79 70 65 28 50 61 72 73 65 20 2a  lateType(Parse *
afa0: 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70  pParse, Token *p
afb0: 54 6f 6b 65 6e 29 7b 0a 20 20 54 61 62 6c 65 20  Token){.  Table 
afc0: 2a 70 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63  *p;.  int i;.  c
afd0: 68 61 72 20 2a 7a 43 6f 6c 6c 3b 20 20 20 20 20  har *zColl;     
afe0: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65 71 75           /* Dequ
aff0: 6f 74 65 64 20 6e 61 6d 65 20 6f 66 20 63 6f 6c  oted name of col
b000: 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20  lation sequence 
b010: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
b020: 3b 0a 0a 20 20 69 66 28 20 28 70 20 3d 20 70 50  ;..  if( (p = pP
b030: 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29  arse->pNewTable)
b040: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
b050: 69 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20  i = p->nCol-1;. 
b060: 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62   db = pParse->db
b070: 3b 0a 20 20 7a 43 6f 6c 6c 20 3d 20 73 71 6c 69  ;.  zColl = sqli
b080: 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e  te3NameFromToken
b090: 28 64 62 2c 20 70 54 6f 6b 65 6e 29 3b 0a 20 20  (db, pToken);.  
b0a0: 69 66 28 20 21 7a 43 6f 6c 6c 20 29 20 72 65 74  if( !zColl ) ret
b0b0: 75 72 6e 3b 0a 0a 20 20 69 66 28 20 73 71 6c 69  urn;..  if( sqli
b0c0: 74 65 33 4c 6f 63 61 74 65 43 6f 6c 6c 53 65 71  te3LocateCollSeq
b0d0: 28 70 50 61 72 73 65 2c 20 7a 43 6f 6c 6c 29 20  (pParse, zColl) 
b0e0: 29 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49  ){.    Index *pI
b0f0: 64 78 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  dx;.    sqlite3D
b100: 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 61 43 6f  bFree(db, p->aCo
b110: 6c 5b 69 5d 2e 7a 43 6f 6c 6c 29 3b 0a 20 20 20  l[i].zColl);.   
b120: 20 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 43 6f 6c   p->aCol[i].zCol
b130: 6c 20 3d 20 7a 43 6f 6c 6c 3b 0a 20 20 0a 20 20  l = zColl;.  .  
b140: 20 20 2f 2a 20 49 66 20 74 68 65 20 63 6f 6c 75    /* If the colu
b150: 6d 6e 20 69 73 20 64 65 63 6c 61 72 65 64 20 61  mn is declared a
b160: 73 20 22 3c 6e 61 6d 65 3e 20 50 52 49 4d 41 52  s "<name> PRIMAR
b170: 59 20 4b 45 59 20 43 4f 4c 4c 41 54 45 20 3c 74  Y KEY COLLATE <t
b180: 79 70 65 3e 22 2c 0a 20 20 20 20 2a 2a 20 74 68  ype>",.    ** th
b190: 65 6e 20 61 6e 20 69 6e 64 65 78 20 6d 61 79 20  en an index may 
b1a0: 68 61 76 65 20 62 65 65 6e 20 63 72 65 61 74 65  have been create
b1b0: 64 20 6f 6e 20 74 68 69 73 20 63 6f 6c 75 6d 6e  d on this column
b1c0: 20 62 65 66 6f 72 65 20 74 68 65 0a 20 20 20 20   before the.    
b1d0: 2a 2a 20 63 6f 6c 6c 61 74 69 6f 6e 20 74 79 70  ** collation typ
b1e0: 65 20 77 61 73 20 61 64 64 65 64 2e 20 43 6f 72  e was added. Cor
b1f0: 72 65 63 74 20 74 68 69 73 20 69 66 20 69 74 20  rect this if it 
b200: 69 73 20 74 68 65 20 63 61 73 65 2e 0a 20 20 20  is the case..   
b210: 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70 49 64 78   */.    for(pIdx
b220: 3d 70 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78  =p->pIndex; pIdx
b230: 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65  ; pIdx=pIdx->pNe
b240: 78 74 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  xt){.      asser
b250: 74 28 20 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c  t( pIdx->nKeyCol
b260: 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ==1 );.      if(
b270: 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b   pIdx->aiColumn[
b280: 30 5d 3d 3d 69 20 29 7b 0a 20 20 20 20 20 20 20  0]==i ){.       
b290: 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 30 5d   pIdx->azColl[0]
b2a0: 20 3d 20 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 43   = p->aCol[i].zC
b2b0: 6f 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  oll;.      }.   
b2c0: 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
b2d0: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
b2e0: 2c 20 7a 43 6f 6c 6c 29 3b 0a 20 20 7d 0a 7d 0a  , zColl);.  }.}.
b2f0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
b300: 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 74 68 65  tion returns the
b310: 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
b320: 6e 63 65 20 66 6f 72 20 64 61 74 61 62 61 73 65  nce for database
b330: 20 6e 61 74 69 76 65 20 74 65 78 74 0a 2a 2a 20   native text.** 
b340: 65 6e 63 6f 64 69 6e 67 20 69 64 65 6e 74 69 66  encoding identif
b350: 69 65 64 20 62 79 20 74 68 65 20 73 74 72 69 6e  ied by the strin
b360: 67 20 7a 4e 61 6d 65 2c 20 6c 65 6e 67 74 68 20  g zName, length 
b370: 6e 4e 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  nName..**.** If 
b380: 74 68 65 20 72 65 71 75 65 73 74 65 64 20 63 6f  the requested co
b390: 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
b3a0: 20 69 73 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c   is not availabl
b3b0: 65 2c 20 6f 72 20 6e 6f 74 20 61 76 61 69 6c 61  e, or not availa
b3c0: 62 6c 65 0a 2a 2a 20 69 6e 20 74 68 65 20 64 61  ble.** in the da
b3d0: 74 61 62 61 73 65 20 6e 61 74 69 76 65 20 65 6e  tabase native en
b3e0: 63 6f 64 69 6e 67 2c 20 74 68 65 20 63 6f 6c 6c  coding, the coll
b3f0: 61 74 69 6f 6e 20 66 61 63 74 6f 72 79 20 69 73  ation factory is
b400: 20 69 6e 76 6f 6b 65 64 20 74 6f 0a 2a 2a 20 72   invoked to.** r
b410: 65 71 75 65 73 74 20 69 74 2e 20 49 66 20 74 68  equest it. If th
b420: 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 61 63 74  e collation fact
b430: 6f 72 79 20 64 6f 65 73 20 6e 6f 74 20 73 75 70  ory does not sup
b440: 70 6c 79 20 73 75 63 68 20 61 20 73 65 71 75 65  ply such a seque
b450: 6e 63 65 2c 0a 2a 2a 20 61 6e 64 20 74 68 65 20  nce,.** and the 
b460: 73 65 71 75 65 6e 63 65 20 69 73 20 61 76 61 69  sequence is avai
b470: 6c 61 62 6c 65 20 69 6e 20 61 6e 6f 74 68 65 72  lable in another
b480: 20 74 65 78 74 20 65 6e 63 6f 64 69 6e 67 2c 20   text encoding, 
b490: 74 68 65 6e 20 74 68 61 74 20 69 73 0a 2a 2a 20  then that is.** 
b4a0: 72 65 74 75 72 6e 65 64 20 69 6e 73 74 65 61 64  returned instead
b4b0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 20 76 65  ..**.** If no ve
b4c0: 72 73 69 6f 6e 73 20 6f 66 20 74 68 65 20 72 65  rsions of the re
b4d0: 71 75 65 73 74 65 64 20 63 6f 6c 6c 61 74 69 6f  quested collatio
b4e0: 6e 73 20 73 65 71 75 65 6e 63 65 20 61 72 65 20  ns sequence are 
b4f0: 61 76 61 69 6c 61 62 6c 65 2c 20 6f 72 0a 2a 2a  available, or.**
b500: 20 61 6e 6f 74 68 65 72 20 65 72 72 6f 72 20 6f   another error o
b510: 63 63 75 72 73 2c 20 4e 55 4c 4c 20 69 73 20 72  ccurs, NULL is r
b520: 65 74 75 72 6e 65 64 20 61 6e 64 20 61 6e 20 65  eturned and an e
b530: 72 72 6f 72 20 6d 65 73 73 61 67 65 20 77 72 69  rror message wri
b540: 74 74 65 6e 20 69 6e 74 6f 0a 2a 2a 20 70 50 61  tten into.** pPa
b550: 72 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  rse..**.** This 
b560: 72 6f 75 74 69 6e 65 20 69 73 20 61 20 77 72 61  routine is a wra
b570: 70 70 65 72 20 61 72 6f 75 6e 64 20 73 71 6c 69  pper around sqli
b580: 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28 29  te3FindCollSeq()
b590: 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a  .  This routine.
b5a0: 2a 2a 20 69 6e 76 6f 6b 65 73 20 74 68 65 20 63  ** invokes the c
b5b0: 6f 6c 6c 61 74 69 6f 6e 20 66 61 63 74 6f 72 79  ollation factory
b5c0: 20 69 66 20 74 68 65 20 6e 61 6d 65 64 20 63 6f   if the named co
b5d0: 6c 6c 61 74 69 6f 6e 20 63 61 6e 6e 6f 74 20 62  llation cannot b
b5e0: 65 20 66 6f 75 6e 64 0a 2a 2a 20 61 6e 64 20 67  e found.** and g
b5f0: 65 6e 65 72 61 74 65 73 20 61 6e 20 65 72 72 6f  enerates an erro
b600: 72 20 6d 65 73 73 61 67 65 2e 0a 2a 2a 0a 2a 2a  r message..**.**
b610: 20 53 65 65 20 61 6c 73 6f 3a 20 73 71 6c 69 74   See also: sqlit
b620: 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28 29 2c  e3FindCollSeq(),
b630: 20 73 71 6c 69 74 65 33 47 65 74 43 6f 6c 6c 53   sqlite3GetCollS
b640: 65 71 28 29 0a 2a 2f 0a 43 6f 6c 6c 53 65 71 20  eq().*/.CollSeq 
b650: 2a 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 43 6f  *sqlite3LocateCo
b660: 6c 6c 53 65 71 28 50 61 72 73 65 20 2a 70 50 61  llSeq(Parse *pPa
b670: 72 73 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  rse, const char 
b680: 2a 7a 4e 61 6d 65 29 7b 0a 20 20 73 71 6c 69 74  *zName){.  sqlit
b690: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
b6a0: 3e 64 62 3b 0a 20 20 75 38 20 65 6e 63 20 3d 20  >db;.  u8 enc = 
b6b0: 45 4e 43 28 64 62 29 3b 0a 20 20 75 38 20 69 6e  ENC(db);.  u8 in
b6c0: 69 74 62 75 73 79 20 3d 20 64 62 2d 3e 69 6e 69  itbusy = db->ini
b6d0: 74 2e 62 75 73 79 3b 0a 20 20 43 6f 6c 6c 53 65  t.busy;.  CollSe
b6e0: 71 20 2a 70 43 6f 6c 6c 3b 0a 0a 20 20 70 43 6f  q *pColl;..  pCo
b6f0: 6c 6c 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64  ll = sqlite3Find
b700: 43 6f 6c 6c 53 65 71 28 64 62 2c 20 65 6e 63 2c  CollSeq(db, enc,
b710: 20 7a 4e 61 6d 65 2c 20 69 6e 69 74 62 75 73 79   zName, initbusy
b720: 29 3b 0a 20 20 69 66 28 20 21 69 6e 69 74 62 75  );.  if( !initbu
b730: 73 79 20 26 26 20 28 21 70 43 6f 6c 6c 20 7c 7c  sy && (!pColl ||
b740: 20 21 70 43 6f 6c 6c 2d 3e 78 43 6d 70 29 20 29   !pColl->xCmp) )
b750: 7b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71  {.    pColl = sq
b760: 6c 69 74 65 33 47 65 74 43 6f 6c 6c 53 65 71 28  lite3GetCollSeq(
b770: 70 50 61 72 73 65 2c 20 65 6e 63 2c 20 70 43 6f  pParse, enc, pCo
b780: 6c 6c 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a  ll, zName);.  }.
b790: 0a 20 20 72 65 74 75 72 6e 20 70 43 6f 6c 6c 3b  .  return pColl;
b7a0: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  .}.../*.** Gener
b7b0: 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 77 69  ate code that wi
b7c0: 6c 6c 20 69 6e 63 72 65 6d 65 6e 74 20 74 68 65  ll increment the
b7d0: 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 2e 0a   schema cookie..
b7e0: 2a 2a 0a 2a 2a 20 54 68 65 20 73 63 68 65 6d 61  **.** The schema
b7f0: 20 63 6f 6f 6b 69 65 20 69 73 20 75 73 65 64 20   cookie is used 
b800: 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 77 68 65  to determine whe
b810: 6e 20 74 68 65 20 73 63 68 65 6d 61 20 66 6f 72  n the schema for
b820: 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65   the.** database
b830: 20 63 68 61 6e 67 65 73 2e 20 20 41 66 74 65 72   changes.  After
b840: 20 65 61 63 68 20 73 63 68 65 6d 61 20 63 68 61   each schema cha
b850: 6e 67 65 2c 20 74 68 65 20 63 6f 6f 6b 69 65 20  nge, the cookie 
b860: 76 61 6c 75 65 0a 2a 2a 20 63 68 61 6e 67 65 73  value.** changes
b870: 2e 20 20 57 68 65 6e 20 61 20 70 72 6f 63 65 73  .  When a proces
b880: 73 20 66 69 72 73 74 20 72 65 61 64 73 20 74 68  s first reads th
b890: 65 20 73 63 68 65 6d 61 20 69 74 20 72 65 63 6f  e schema it reco
b8a0: 72 64 73 20 74 68 65 0a 2a 2a 20 63 6f 6f 6b 69  rds the.** cooki
b8b0: 65 2e 20 20 54 68 65 72 65 61 66 74 65 72 2c 20  e.  Thereafter, 
b8c0: 77 68 65 6e 65 76 65 72 20 69 74 20 67 6f 65 73  whenever it goes
b8d0: 20 74 6f 20 61 63 63 65 73 73 20 74 68 65 20 64   to access the d
b8e0: 61 74 61 62 61 73 65 2c 0a 2a 2a 20 69 74 20 63  atabase,.** it c
b8f0: 68 65 63 6b 73 20 74 68 65 20 63 6f 6f 6b 69 65  hecks the cookie
b900: 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68   to make sure th
b910: 65 20 73 63 68 65 6d 61 20 68 61 73 20 6e 6f 74  e schema has not
b920: 20 63 68 61 6e 67 65 64 0a 2a 2a 20 73 69 6e 63   changed.** sinc
b930: 65 20 69 74 20 77 61 73 20 6c 61 73 74 20 72 65  e it was last re
b940: 61 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 70  ad..**.** This p
b950: 6c 61 6e 20 69 73 20 6e 6f 74 20 63 6f 6d 70 6c  lan is not compl
b960: 65 74 65 6c 79 20 62 75 6c 6c 65 74 2d 70 72 6f  etely bullet-pro
b970: 6f 66 2e 20 20 49 74 20 69 73 20 70 6f 73 73 69  of.  It is possi
b980: 62 6c 65 20 66 6f 72 0a 2a 2a 20 74 68 65 20 73  ble for.** the s
b990: 63 68 65 6d 61 20 74 6f 20 63 68 61 6e 67 65 20  chema to change 
b9a0: 6d 75 6c 74 69 70 6c 65 20 74 69 6d 65 73 20 61  multiple times a
b9b0: 6e 64 20 66 6f 72 20 74 68 65 20 63 6f 6f 6b 69  nd for the cooki
b9c0: 65 20 74 6f 20 62 65 0a 2a 2a 20 73 65 74 20 62  e to be.** set b
b9d0: 61 63 6b 20 74 6f 20 70 72 69 6f 72 20 76 61 6c  ack to prior val
b9e0: 75 65 2e 20 20 42 75 74 20 73 63 68 65 6d 61 20  ue.  But schema 
b9f0: 63 68 61 6e 67 65 73 20 61 72 65 20 69 6e 66 72  changes are infr
ba00: 65 71 75 65 6e 74 0a 2a 2a 20 61 6e 64 20 74 68  equent.** and th
ba10: 65 20 70 72 6f 62 61 62 69 6c 69 74 79 20 6f 66  e probability of
ba20: 20 68 69 74 74 69 6e 67 20 74 68 65 20 73 61 6d   hitting the sam
ba30: 65 20 63 6f 6f 6b 69 65 20 76 61 6c 75 65 20 69  e cookie value i
ba40: 73 20 6f 6e 6c 79 0a 2a 2a 20 31 20 63 68 61 6e  s only.** 1 chan
ba50: 63 65 20 69 6e 20 32 5e 33 32 2e 20 20 53 6f 20  ce in 2^32.  So 
ba60: 77 65 27 72 65 20 73 61 66 65 20 65 6e 6f 75 67  we're safe enoug
ba70: 68 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  h..*/.void sqlit
ba80: 65 33 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28 50  e3ChangeCookie(P
ba90: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e  arse *pParse, in
baa0: 74 20 69 44 62 29 7b 0a 20 20 73 71 6c 69 74 65  t iDb){.  sqlite
bab0: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
bac0: 64 62 3b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  db;.  Vdbe *v = 
bad0: 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
bae0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
baf0: 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28  SchemaMutexHeld(
bb00: 64 62 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a 20  db, iDb, 0) );. 
bb10: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
bb20: 70 33 28 76 2c 20 4f 50 5f 53 65 74 43 6f 6f 6b  p3(v, OP_SetCook
bb30: 69 65 2c 20 69 44 62 2c 20 42 54 52 45 45 5f 53  ie, iDb, BTREE_S
bb40: 43 48 45 4d 41 5f 56 45 52 53 49 4f 4e 2c 20 0a  CHEMA_VERSION, .
bb50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bb60: 20 20 20 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d      db->aDb[iDb]
bb70: 2e 70 53 63 68 65 6d 61 2d 3e 73 63 68 65 6d 61  .pSchema->schema
bb80: 5f 63 6f 6f 6b 69 65 2b 31 29 3b 0a 7d 0a 0a 2f  _cookie+1);.}../
bb90: 2a 0a 2a 2a 20 4d 65 61 73 75 72 65 20 74 68 65  *.** Measure the
bba0: 20 6e 75 6d 62 65 72 20 6f 66 20 63 68 61 72 61   number of chara
bbb0: 63 74 65 72 73 20 6e 65 65 64 65 64 20 74 6f 20  cters needed to 
bbc0: 6f 75 74 70 75 74 20 74 68 65 20 67 69 76 65 6e  output the given
bbd0: 0a 2a 2a 20 69 64 65 6e 74 69 66 69 65 72 2e 20  .** identifier. 
bbe0: 20 54 68 65 20 6e 75 6d 62 65 72 20 72 65 74 75   The number retu
bbf0: 72 6e 65 64 20 69 6e 63 6c 75 64 65 73 20 61 6e  rned includes an
bc00: 79 20 71 75 6f 74 65 73 20 75 73 65 64 0a 2a 2a  y quotes used.**
bc10: 20 62 75 74 20 64 6f 65 73 20 6e 6f 74 20 69 6e   but does not in
bc20: 63 6c 75 64 65 20 74 68 65 20 6e 75 6c 6c 20 74  clude the null t
bc30: 65 72 6d 69 6e 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a  erminator..**.**
bc40: 20 54 68 65 20 65 73 74 69 6d 61 74 65 20 69 73   The estimate is
bc50: 20 63 6f 6e 73 65 72 76 61 74 69 76 65 2e 20 20   conservative.  
bc60: 49 74 20 6d 69 67 68 74 20 62 65 20 6c 61 72 67  It might be larg
bc70: 65 72 20 74 68 61 74 20 77 68 61 74 20 69 73 0a  er that what is.
bc80: 2a 2a 20 72 65 61 6c 6c 79 20 6e 65 65 64 65 64  ** really needed
bc90: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
bca0: 69 64 65 6e 74 4c 65 6e 67 74 68 28 63 6f 6e 73  identLength(cons
bcb0: 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20 69 6e  t char *z){.  in
bcc0: 74 20 6e 3b 0a 20 20 66 6f 72 28 6e 3d 30 3b 20  t n;.  for(n=0; 
bcd0: 2a 7a 3b 20 6e 2b 2b 2c 20 7a 2b 2b 29 7b 0a 20  *z; n++, z++){. 
bce0: 20 20 20 69 66 28 20 2a 7a 3d 3d 27 22 27 20 29     if( *z=='"' )
bcf0: 7b 20 6e 2b 2b 3b 20 7d 0a 20 20 7d 0a 20 20 72  { n++; }.  }.  r
bd00: 65 74 75 72 6e 20 6e 20 2b 20 32 3b 0a 7d 0a 0a  eturn n + 2;.}..
bd10: 2f 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20  /*.** The first 
bd20: 70 61 72 61 6d 65 74 65 72 20 69 73 20 61 20 70  parameter is a p
bd30: 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 6f 75 74  ointer to an out
bd40: 70 75 74 20 62 75 66 66 65 72 2e 20 54 68 65 20  put buffer. The 
bd50: 73 65 63 6f 6e 64 20 0a 2a 2a 20 70 61 72 61 6d  second .** param
bd60: 65 74 65 72 20 69 73 20 61 20 70 6f 69 6e 74 65  eter is a pointe
bd70: 72 20 74 6f 20 61 6e 20 69 6e 74 65 67 65 72 20  r to an integer 
bd80: 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68  that contains th
bd90: 65 20 6f 66 66 73 65 74 20 61 74 0a 2a 2a 20 77  e offset at.** w
bda0: 68 69 63 68 20 74 6f 20 77 72 69 74 65 20 69 6e  hich to write in
bdb0: 74 6f 20 74 68 65 20 6f 75 74 70 75 74 20 62 75  to the output bu
bdc0: 66 66 65 72 2e 20 54 68 69 73 20 66 75 6e 63 74  ffer. This funct
bdd0: 69 6f 6e 20 63 6f 70 69 65 73 20 74 68 65 0a 2a  ion copies the.*
bde0: 2a 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64  * nul-terminated
bdf0: 20 73 74 72 69 6e 67 20 70 6f 69 6e 74 65 64 20   string pointed 
be00: 74 6f 20 62 79 20 74 68 65 20 74 68 69 72 64 20  to by the third 
be10: 70 61 72 61 6d 65 74 65 72 2c 20 7a 53 69 67 6e  parameter, zSign
be20: 65 64 49 64 65 6e 74 2c 0a 2a 2a 20 74 6f 20 74  edIdent,.** to t
be30: 68 65 20 73 70 65 63 69 66 69 65 64 20 6f 66 66  he specified off
be40: 73 65 74 20 69 6e 20 74 68 65 20 62 75 66 66 65  set in the buffe
be50: 72 20 61 6e 64 20 75 70 64 61 74 65 73 20 2a 70  r and updates *p
be60: 49 64 78 20 74 6f 20 72 65 66 65 72 0a 2a 2a 20  Idx to refer.** 
be70: 74 6f 20 74 68 65 20 66 69 72 73 74 20 62 79 74  to the first byt
be80: 65 20 61 66 74 65 72 20 74 68 65 20 6c 61 73 74  e after the last
be90: 20 62 79 74 65 20 77 72 69 74 74 65 6e 20 62 65   byte written be
bea0: 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a  fore returning..
beb0: 2a 2a 20 0a 2a 2a 20 49 66 20 74 68 65 20 73 74  ** .** If the st
bec0: 72 69 6e 67 20 7a 53 69 67 6e 65 64 49 64 65 6e  ring zSignedIden
bed0: 74 20 63 6f 6e 73 69 73 74 73 20 65 6e 74 69 72  t consists entir
bee0: 65 6c 79 20 6f 66 20 61 6c 70 68 61 2d 6e 75 6d  ely of alpha-num
bef0: 65 72 69 63 0a 2a 2a 20 63 68 61 72 61 63 74 65  eric.** characte
bf00: 72 73 2c 20 64 6f 65 73 20 6e 6f 74 20 62 65 67  rs, does not beg
bf10: 69 6e 20 77 69 74 68 20 61 20 64 69 67 69 74 20  in with a digit 
bf20: 61 6e 64 20 69 73 20 6e 6f 74 20 61 6e 20 53 51  and is not an SQ
bf30: 4c 20 6b 65 79 77 6f 72 64 2c 0a 2a 2a 20 74 68  L keyword,.** th
bf40: 65 6e 20 69 74 20 69 73 20 63 6f 70 69 65 64 20  en it is copied 
bf50: 74 6f 20 74 68 65 20 6f 75 74 70 75 74 20 62 75  to the output bu
bf60: 66 66 65 72 20 65 78 61 63 74 6c 79 20 61 73 20  ffer exactly as 
bf70: 69 74 20 69 73 2e 20 4f 74 68 65 72 77 69 73 65  it is. Otherwise
bf80: 2c 0a 2a 2a 20 69 74 20 69 73 20 71 75 6f 74 65  ,.** it is quote
bf90: 64 20 75 73 69 6e 67 20 64 6f 75 62 6c 65 2d 71  d using double-q
bfa0: 75 6f 74 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  uotes..*/.static
bfb0: 20 76 6f 69 64 20 69 64 65 6e 74 50 75 74 28 63   void identPut(c
bfc0: 68 61 72 20 2a 7a 2c 20 69 6e 74 20 2a 70 49 64  har *z, int *pId
bfd0: 78 2c 20 63 68 61 72 20 2a 7a 53 69 67 6e 65 64  x, char *zSigned
bfe0: 49 64 65 6e 74 29 7b 0a 20 20 75 6e 73 69 67 6e  Ident){.  unsign
bff0: 65 64 20 63 68 61 72 20 2a 7a 49 64 65 6e 74 20  ed char *zIdent 
c000: 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72  = (unsigned char
c010: 2a 29 7a 53 69 67 6e 65 64 49 64 65 6e 74 3b 0a  *)zSignedIdent;.
c020: 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6e 65 65 64    int i, j, need
c030: 51 75 6f 74 65 3b 0a 20 20 69 20 3d 20 2a 70 49  Quote;.  i = *pI
c040: 64 78 3b 0a 0a 20 20 66 6f 72 28 6a 3d 30 3b 20  dx;..  for(j=0; 
c050: 7a 49 64 65 6e 74 5b 6a 5d 3b 20 6a 2b 2b 29 7b  zIdent[j]; j++){
c060: 0a 20 20 20 20 69 66 28 20 21 73 71 6c 69 74 65  .    if( !sqlite
c070: 33 49 73 61 6c 6e 75 6d 28 7a 49 64 65 6e 74 5b  3Isalnum(zIdent[
c080: 6a 5d 29 20 26 26 20 7a 49 64 65 6e 74 5b 6a 5d  j]) && zIdent[j]
c090: 21 3d 27 5f 27 20 29 20 62 72 65 61 6b 3b 0a 20  !='_' ) break;. 
c0a0: 20 7d 0a 20 20 6e 65 65 64 51 75 6f 74 65 20 3d   }.  needQuote =
c0b0: 20 73 71 6c 69 74 65 33 49 73 64 69 67 69 74 28   sqlite3Isdigit(
c0c0: 7a 49 64 65 6e 74 5b 30 5d 29 0a 20 20 20 20 20  zIdent[0]).     
c0d0: 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65         || sqlite
c0e0: 33 4b 65 79 77 6f 72 64 43 6f 64 65 28 7a 49 64  3KeywordCode(zId
c0f0: 65 6e 74 2c 20 6a 29 21 3d 54 4b 5f 49 44 0a 20  ent, j)!=TK_ID. 
c100: 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 7a 49             || zI
c110: 64 65 6e 74 5b 6a 5d 21 3d 30 0a 20 20 20 20 20  dent[j]!=0.     
c120: 20 20 20 20 20 20 20 7c 7c 20 6a 3d 3d 30 3b 0a         || j==0;.
c130: 0a 20 20 69 66 28 20 6e 65 65 64 51 75 6f 74 65  .  if( needQuote
c140: 20 29 20 7a 5b 69 2b 2b 5d 20 3d 20 27 22 27 3b   ) z[i++] = '"';
c150: 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 7a 49 64 65  .  for(j=0; zIde
c160: 6e 74 5b 6a 5d 3b 20 6a 2b 2b 29 7b 0a 20 20 20  nt[j]; j++){.   
c170: 20 7a 5b 69 2b 2b 5d 20 3d 20 7a 49 64 65 6e 74   z[i++] = zIdent
c180: 5b 6a 5d 3b 0a 20 20 20 20 69 66 28 20 7a 49 64  [j];.    if( zId
c190: 65 6e 74 5b 6a 5d 3d 3d 27 22 27 20 29 20 7a 5b  ent[j]=='"' ) z[
c1a0: 69 2b 2b 5d 20 3d 20 27 22 27 3b 0a 20 20 7d 0a  i++] = '"';.  }.
c1b0: 20 20 69 66 28 20 6e 65 65 64 51 75 6f 74 65 20    if( needQuote 
c1c0: 29 20 7a 5b 69 2b 2b 5d 20 3d 20 27 22 27 3b 0a  ) z[i++] = '"';.
c1d0: 20 20 7a 5b 69 5d 20 3d 20 30 3b 0a 20 20 2a 70    z[i] = 0;.  *p
c1e0: 49 64 78 20 3d 20 69 3b 0a 7d 0a 0a 2f 2a 0a 2a  Idx = i;.}../*.*
c1f0: 2a 20 47 65 6e 65 72 61 74 65 20 61 20 43 52 45  * Generate a CRE
c200: 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d  ATE TABLE statem
c210: 65 6e 74 20 61 70 70 72 6f 70 72 69 61 74 65 20  ent appropriate 
c220: 66 6f 72 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a  for the given.**
c230: 20 74 61 62 6c 65 2e 20 20 4d 65 6d 6f 72 79 20   table.  Memory 
c240: 74 6f 20 68 6f 6c 64 20 74 68 65 20 74 65 78 74  to hold the text
c250: 20 6f 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e   of the statemen
c260: 74 20 69 73 20 6f 62 74 61 69 6e 65 64 0a 2a 2a  t is obtained.**
c270: 20 66 72 6f 6d 20 73 71 6c 69 74 65 4d 61 6c 6c   from sqliteMall
c280: 6f 63 28 29 20 61 6e 64 20 6d 75 73 74 20 62 65  oc() and must be
c290: 20 66 72 65 65 64 20 62 79 20 74 68 65 20 63 61   freed by the ca
c2a0: 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 2e 0a  lling function..
c2b0: 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a  */.static char *
c2c0: 63 72 65 61 74 65 54 61 62 6c 65 53 74 6d 74 28  createTableStmt(
c2d0: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 54 61 62  sqlite3 *db, Tab
c2e0: 6c 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 2c  le *p){.  int i,
c2f0: 20 6b 2c 20 6e 3b 0a 20 20 63 68 61 72 20 2a 7a   k, n;.  char *z
c300: 53 74 6d 74 3b 0a 20 20 63 68 61 72 20 2a 7a 53  Stmt;.  char *zS
c310: 65 70 2c 20 2a 7a 53 65 70 32 2c 20 2a 7a 45 6e  ep, *zSep2, *zEn
c320: 64 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f  d;.  Column *pCo
c330: 6c 3b 0a 20 20 6e 20 3d 20 30 3b 0a 20 20 66 6f  l;.  n = 0;.  fo
c340: 72 28 70 43 6f 6c 20 3d 20 70 2d 3e 61 43 6f 6c  r(pCol = p->aCol
c350: 2c 20 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6c  , i=0; i<p->nCol
c360: 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a  ; i++, pCol++){.
c370: 20 20 20 20 6e 20 2b 3d 20 69 64 65 6e 74 4c 65      n += identLe
c380: 6e 67 74 68 28 70 43 6f 6c 2d 3e 7a 4e 61 6d 65  ngth(pCol->zName
c390: 29 20 2b 20 35 3b 0a 20 20 7d 0a 20 20 6e 20 2b  ) + 5;.  }.  n +
c3a0: 3d 20 69 64 65 6e 74 4c 65 6e 67 74 68 28 70 2d  = identLength(p-
c3b0: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 6e  >zName);.  if( n
c3c0: 3c 35 30 20 29 7b 20 0a 20 20 20 20 7a 53 65 70  <50 ){ .    zSep
c3d0: 20 3d 20 22 22 3b 0a 20 20 20 20 7a 53 65 70 32   = "";.    zSep2
c3e0: 20 3d 20 22 2c 22 3b 0a 20 20 20 20 7a 45 6e 64   = ",";.    zEnd
c3f0: 20 3d 20 22 29 22 3b 0a 20 20 7d 65 6c 73 65 7b   = ")";.  }else{
c400: 0a 20 20 20 20 7a 53 65 70 20 3d 20 22 5c 6e 20  .    zSep = "\n 
c410: 20 22 3b 0a 20 20 20 20 7a 53 65 70 32 20 3d 20   ";.    zSep2 = 
c420: 22 2c 5c 6e 20 20 22 3b 0a 20 20 20 20 7a 45 6e  ",\n  ";.    zEn
c430: 64 20 3d 20 22 5c 6e 29 22 3b 0a 20 20 7d 0a 20  d = "\n)";.  }. 
c440: 20 6e 20 2b 3d 20 33 35 20 2b 20 36 2a 70 2d 3e   n += 35 + 6*p->
c450: 6e 43 6f 6c 3b 0a 20 20 7a 53 74 6d 74 20 3d 20  nCol;.  zStmt = 
c460: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52  sqlite3DbMallocR
c470: 61 77 28 30 2c 20 6e 29 3b 0a 20 20 69 66 28 20  aw(0, n);.  if( 
c480: 7a 53 74 6d 74 3d 3d 30 20 29 7b 0a 20 20 20 20  zStmt==0 ){.    
c490: 73 71 6c 69 74 65 33 4f 6f 6d 46 61 75 6c 74 28  sqlite3OomFault(
c4a0: 64 62 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  db);.    return 
c4b0: 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  0;.  }.  sqlite3
c4c0: 5f 73 6e 70 72 69 6e 74 66 28 6e 2c 20 7a 53 74  _snprintf(n, zSt
c4d0: 6d 74 2c 20 22 43 52 45 41 54 45 20 54 41 42 4c  mt, "CREATE TABL
c4e0: 45 20 22 29 3b 0a 20 20 6b 20 3d 20 73 71 6c 69  E ");.  k = sqli
c4f0: 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 53 74 6d  te3Strlen30(zStm
c500: 74 29 3b 0a 20 20 69 64 65 6e 74 50 75 74 28 7a  t);.  identPut(z
c510: 53 74 6d 74 2c 20 26 6b 2c 20 70 2d 3e 7a 4e 61  Stmt, &k, p->zNa
c520: 6d 65 29 3b 0a 20 20 7a 53 74 6d 74 5b 6b 2b 2b  me);.  zStmt[k++
c530: 5d 20 3d 20 27 28 27 3b 0a 20 20 66 6f 72 28 70  ] = '(';.  for(p
c540: 43 6f 6c 3d 70 2d 3e 61 43 6f 6c 2c 20 69 3d 30  Col=p->aCol, i=0
c550: 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b  ; i<p->nCol; i++
c560: 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 73  , pCol++){.    s
c570: 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72  tatic const char
c580: 20 2a 20 63 6f 6e 73 74 20 61 7a 54 79 70 65 5b   * const azType[
c590: 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a  ] = {.        /*
c5a0: 20 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42   SQLITE_AFF_BLOB
c5b0: 20 20 20 20 2a 2f 20 22 22 2c 0a 20 20 20 20 20      */ "",.     
c5c0: 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 41 46 46     /* SQLITE_AFF
c5d0: 5f 54 45 58 54 20 20 20 20 2a 2f 20 22 20 54 45  _TEXT    */ " TE
c5e0: 58 54 22 2c 0a 20 20 20 20 20 20 20 20 2f 2a 20  XT",.        /* 
c5f0: 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52  SQLITE_AFF_NUMER
c600: 49 43 20 2a 2f 20 22 20 4e 55 4d 22 2c 0a 20 20  IC */ " NUM",.  
c610: 20 20 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f        /* SQLITE_
c620: 41 46 46 5f 49 4e 54 45 47 45 52 20 2a 2f 20 22  AFF_INTEGER */ "
c630: 20 49 4e 54 22 2c 0a 20 20 20 20 20 20 20 20 2f   INT",.        /
c640: 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41  * SQLITE_AFF_REA
c650: 4c 20 20 20 20 2a 2f 20 22 20 52 45 41 4c 22 0a  L    */ " REAL".
c660: 20 20 20 20 7d 3b 0a 20 20 20 20 69 6e 74 20 6c      };.    int l
c670: 65 6e 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  en;.    const ch
c680: 61 72 20 2a 7a 54 79 70 65 3b 0a 0a 20 20 20 20  ar *zType;..    
c690: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
c6a0: 28 6e 2d 6b 2c 20 26 7a 53 74 6d 74 5b 6b 5d 2c  (n-k, &zStmt[k],
c6b0: 20 7a 53 65 70 29 3b 0a 20 20 20 20 6b 20 2b 3d   zSep);.    k +=
c6c0: 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
c6d0: 28 26 7a 53 74 6d 74 5b 6b 5d 29 3b 0a 20 20 20  (&zStmt[k]);.   
c6e0: 20 7a 53 65 70 20 3d 20 7a 53 65 70 32 3b 0a 20   zSep = zSep2;. 
c6f0: 20 20 20 69 64 65 6e 74 50 75 74 28 7a 53 74 6d     identPut(zStm
c700: 74 2c 20 26 6b 2c 20 70 43 6f 6c 2d 3e 7a 4e 61  t, &k, pCol->zNa
c710: 6d 65 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  me);.    assert(
c720: 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 2d   pCol->affinity-
c730: 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 20  SQLITE_AFF_BLOB 
c740: 3e 3d 20 30 20 29 3b 0a 20 20 20 20 61 73 73 65  >= 0 );.    asse
c750: 72 74 28 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69  rt( pCol->affini
c760: 74 79 2d 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c  ty-SQLITE_AFF_BL
c770: 4f 42 20 3c 20 41 72 72 61 79 53 69 7a 65 28 61  OB < ArraySize(a
c780: 7a 54 79 70 65 29 20 29 3b 0a 20 20 20 20 74 65  zType) );.    te
c790: 73 74 63 61 73 65 28 20 70 43 6f 6c 2d 3e 61 66  stcase( pCol->af
c7a0: 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41  finity==SQLITE_A
c7b0: 46 46 5f 42 4c 4f 42 20 29 3b 0a 20 20 20 20 74  FF_BLOB );.    t
c7c0: 65 73 74 63 61 73 65 28 20 70 43 6f 6c 2d 3e 61  estcase( pCol->a
c7d0: 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f  ffinity==SQLITE_
c7e0: 41 46 46 5f 54 45 58 54 20 29 3b 0a 20 20 20 20  AFF_TEXT );.    
c7f0: 74 65 73 74 63 61 73 65 28 20 70 43 6f 6c 2d 3e  testcase( pCol->
c800: 61 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45  affinity==SQLITE
c810: 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20 29 3b 0a  _AFF_NUMERIC );.
c820: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 43      testcase( pC
c830: 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 53 51  ol->affinity==SQ
c840: 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52  LITE_AFF_INTEGER
c850: 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
c860: 28 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79  ( pCol->affinity
c870: 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41  ==SQLITE_AFF_REA
c880: 4c 20 29 3b 0a 20 20 20 20 0a 20 20 20 20 7a 54  L );.    .    zT
c890: 79 70 65 20 3d 20 61 7a 54 79 70 65 5b 70 43 6f  ype = azType[pCo
c8a0: 6c 2d 3e 61 66 66 69 6e 69 74 79 20 2d 20 53 51  l->affinity - SQ
c8b0: 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 5d 3b 0a  LITE_AFF_BLOB];.
c8c0: 20 20 20 20 6c 65 6e 20 3d 20 73 71 6c 69 74 65      len = sqlite
c8d0: 33 53 74 72 6c 65 6e 33 30 28 7a 54 79 70 65 29  3Strlen30(zType)
c8e0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43  ;.    assert( pC
c8f0: 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 53 51  ol->affinity==SQ
c900: 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 20 0a 20  LITE_AFF_BLOB . 
c910: 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 43             || pC
c920: 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 73 71  ol->affinity==sq
c930: 6c 69 74 65 33 41 66 66 69 6e 69 74 79 54 79 70  lite3AffinityTyp
c940: 65 28 7a 54 79 70 65 2c 20 30 29 20 29 3b 0a 20  e(zType, 0) );. 
c950: 20 20 20 6d 65 6d 63 70 79 28 26 7a 53 74 6d 74     memcpy(&zStmt
c960: 5b 6b 5d 2c 20 7a 54 79 70 65 2c 20 6c 65 6e 29  [k], zType, len)
c970: 3b 0a 20 20 20 20 6b 20 2b 3d 20 6c 65 6e 3b 0a  ;.    k += len;.
c980: 20 20 20 20 61 73 73 65 72 74 28 20 6b 3c 3d 6e      assert( k<=n
c990: 20 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65   );.  }.  sqlite
c9a0: 33 5f 73 6e 70 72 69 6e 74 66 28 6e 2d 6b 2c 20  3_snprintf(n-k, 
c9b0: 26 7a 53 74 6d 74 5b 6b 5d 2c 20 22 25 73 22 2c  &zStmt[k], "%s",
c9c0: 20 7a 45 6e 64 29 3b 0a 20 20 72 65 74 75 72 6e   zEnd);.  return
c9d0: 20 7a 53 74 6d 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   zStmt;.}../*.**
c9e0: 20 52 65 73 69 7a 65 20 61 6e 20 49 6e 64 65 78   Resize an Index
c9f0: 20 6f 62 6a 65 63 74 20 74 6f 20 68 6f 6c 64 20   object to hold 
ca00: 4e 20 63 6f 6c 75 6d 6e 73 20 74 6f 74 61 6c 2e  N columns total.
ca10: 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    Return SQLITE_
ca20: 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73  OK.** on success
ca30: 20 61 6e 64 20 53 51 4c 49 54 45 5f 4e 4f 4d 45   and SQLITE_NOME
ca40: 4d 20 6f 6e 20 61 6e 20 4f 4f 4d 20 65 72 72 6f  M on an OOM erro
ca50: 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  r..*/.static int
ca60: 20 72 65 73 69 7a 65 49 6e 64 65 78 4f 62 6a 65   resizeIndexObje
ca70: 63 74 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  ct(sqlite3 *db, 
ca80: 49 6e 64 65 78 20 2a 70 49 64 78 2c 20 69 6e 74  Index *pIdx, int
ca90: 20 4e 29 7b 0a 20 20 63 68 61 72 20 2a 7a 45 78   N){.  char *zEx
caa0: 74 72 61 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65  tra;.  int nByte
cab0: 3b 0a 20 20 69 66 28 20 70 49 64 78 2d 3e 6e 43  ;.  if( pIdx->nC
cac0: 6f 6c 75 6d 6e 3e 3d 4e 20 29 20 72 65 74 75 72  olumn>=N ) retur
cad0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61  n SQLITE_OK;.  a
cae0: 73 73 65 72 74 28 20 70 49 64 78 2d 3e 69 73 52  ssert( pIdx->isR
caf0: 65 73 69 7a 65 64 3d 3d 30 20 29 3b 0a 20 20 6e  esized==0 );.  n
cb00: 42 79 74 65 20 3d 20 28 73 69 7a 65 6f 66 28 63  Byte = (sizeof(c
cb10: 68 61 72 2a 29 20 2b 20 73 69 7a 65 6f 66 28 69  har*) + sizeof(i
cb20: 31 36 29 20 2b 20 31 29 2a 4e 3b 0a 20 20 7a 45  16) + 1)*N;.  zE
cb30: 78 74 72 61 20 3d 20 73 71 6c 69 74 65 33 44 62  xtra = sqlite3Db
cb40: 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 6e  MallocZero(db, n
cb50: 42 79 74 65 29 3b 0a 20 20 69 66 28 20 7a 45 78  Byte);.  if( zEx
cb60: 74 72 61 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  tra==0 ) return 
cb70: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50  SQLITE_NOMEM_BKP
cb80: 54 3b 0a 20 20 6d 65 6d 63 70 79 28 7a 45 78 74  T;.  memcpy(zExt
cb90: 72 61 2c 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c  ra, pIdx->azColl
cba0: 2c 20 73 69 7a 65 6f 66 28 63 68 61 72 2a 29 2a  , sizeof(char*)*
cbb0: 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 29 3b 0a  pIdx->nColumn);.
cbc0: 20 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 20 3d    pIdx->azColl =
cbd0: 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 2a 29 7a   (const char**)z
cbe0: 45 78 74 72 61 3b 0a 20 20 7a 45 78 74 72 61 20  Extra;.  zExtra 
cbf0: 2b 3d 20 73 69 7a 65 6f 66 28 63 68 61 72 2a 29  += sizeof(char*)
cc00: 2a 4e 3b 0a 20 20 6d 65 6d 63 70 79 28 7a 45 78  *N;.  memcpy(zEx
cc10: 74 72 61 2c 20 70 49 64 78 2d 3e 61 69 43 6f 6c  tra, pIdx->aiCol
cc20: 75 6d 6e 2c 20 73 69 7a 65 6f 66 28 69 31 36 29  umn, sizeof(i16)
cc30: 2a 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 29 3b  *pIdx->nColumn);
cc40: 0a 20 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d  .  pIdx->aiColum
cc50: 6e 20 3d 20 28 69 31 36 2a 29 7a 45 78 74 72 61  n = (i16*)zExtra
cc60: 3b 0a 20 20 7a 45 78 74 72 61 20 2b 3d 20 73 69  ;.  zExtra += si
cc70: 7a 65 6f 66 28 69 31 36 29 2a 4e 3b 0a 20 20 6d  zeof(i16)*N;.  m
cc80: 65 6d 63 70 79 28 7a 45 78 74 72 61 2c 20 70 49  emcpy(zExtra, pI
cc90: 64 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 2c 20  dx->aSortOrder, 
cca0: 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 29 3b 0a  pIdx->nColumn);.
ccb0: 20 20 70 49 64 78 2d 3e 61 53 6f 72 74 4f 72 64    pIdx->aSortOrd
ccc0: 65 72 20 3d 20 28 75 38 2a 29 7a 45 78 74 72 61  er = (u8*)zExtra
ccd0: 3b 0a 20 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d  ;.  pIdx->nColum
cce0: 6e 20 3d 20 4e 3b 0a 20 20 70 49 64 78 2d 3e 69  n = N;.  pIdx->i
ccf0: 73 52 65 73 69 7a 65 64 20 3d 20 31 3b 0a 20 20  sResized = 1;.  
cd00: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
cd10: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 73 74 69 6d  ;.}../*.** Estim
cd20: 61 74 65 20 74 68 65 20 74 6f 74 61 6c 20 72 6f  ate the total ro
cd30: 77 20 77 69 64 74 68 20 66 6f 72 20 61 20 74 61  w width for a ta
cd40: 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ble..*/.static v
cd50: 6f 69 64 20 65 73 74 69 6d 61 74 65 54 61 62 6c  oid estimateTabl
cd60: 65 57 69 64 74 68 28 54 61 62 6c 65 20 2a 70 54  eWidth(Table *pT
cd70: 61 62 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20  ab){.  unsigned 
cd80: 77 54 61 62 6c 65 20 3d 20 30 3b 0a 20 20 63 6f  wTable = 0;.  co
cd90: 6e 73 74 20 43 6f 6c 75 6d 6e 20 2a 70 54 61 62  nst Column *pTab
cda0: 43 6f 6c 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  Col;.  int i;.  
cdb0: 66 6f 72 28 69 3d 70 54 61 62 2d 3e 6e 43 6f 6c  for(i=pTab->nCol
cdc0: 2c 20 70 54 61 62 43 6f 6c 3d 70 54 61 62 2d 3e  , pTabCol=pTab->
cdd0: 61 43 6f 6c 3b 20 69 3e 30 3b 20 69 2d 2d 2c 20  aCol; i>0; i--, 
cde0: 70 54 61 62 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20  pTabCol++){.    
cdf0: 77 54 61 62 6c 65 20 2b 3d 20 70 54 61 62 43 6f  wTable += pTabCo
ce00: 6c 2d 3e 73 7a 45 73 74 3b 0a 20 20 7d 0a 20 20  l->szEst;.  }.  
ce10: 69 66 28 20 70 54 61 62 2d 3e 69 50 4b 65 79 3c  if( pTab->iPKey<
ce20: 30 20 29 20 77 54 61 62 6c 65 2b 2b 3b 0a 20 20  0 ) wTable++;.  
ce30: 70 54 61 62 2d 3e 73 7a 54 61 62 52 6f 77 20 3d  pTab->szTabRow =
ce40: 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 77   sqlite3LogEst(w
ce50: 54 61 62 6c 65 2a 34 29 3b 0a 7d 0a 0a 2f 2a 0a  Table*4);.}../*.
ce60: 2a 2a 20 45 73 74 69 6d 61 74 65 20 74 68 65 20  ** Estimate the 
ce70: 61 76 65 72 61 67 65 20 73 69 7a 65 20 6f 66 20  average size of 
ce80: 61 20 72 6f 77 20 66 6f 72 20 61 6e 20 69 6e 64  a row for an ind
ce90: 65 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ex..*/.static vo
cea0: 69 64 20 65 73 74 69 6d 61 74 65 49 6e 64 65 78  id estimateIndex
ceb0: 57 69 64 74 68 28 49 6e 64 65 78 20 2a 70 49 64  Width(Index *pId
cec0: 78 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 77  x){.  unsigned w
ced0: 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20 69 6e 74  Index = 0;.  int
cee0: 20 69 3b 0a 20 20 63 6f 6e 73 74 20 43 6f 6c 75   i;.  const Colu
cef0: 6d 6e 20 2a 61 43 6f 6c 20 3d 20 70 49 64 78 2d  mn *aCol = pIdx-
cf00: 3e 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 3b 0a 20  >pTable->aCol;. 
cf10: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 64 78   for(i=0; i<pIdx
cf20: 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b  ->nColumn; i++){
cf30: 0a 20 20 20 20 69 31 36 20 78 20 3d 20 70 49 64  .    i16 x = pId
cf40: 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 3b 0a  x->aiColumn[i];.
cf50: 20 20 20 20 61 73 73 65 72 74 28 20 78 3c 70 49      assert( x<pI
cf60: 64 78 2d 3e 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c  dx->pTable->nCol
cf70: 20 29 3b 0a 20 20 20 20 77 49 6e 64 65 78 20 2b   );.    wIndex +
cf80: 3d 20 78 3c 30 20 3f 20 31 20 3a 20 61 43 6f 6c  = x<0 ? 1 : aCol
cf90: 5b 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b  [pIdx->aiColumn[
cfa0: 69 5d 5d 2e 73 7a 45 73 74 3b 0a 20 20 7d 0a 20  i]].szEst;.  }. 
cfb0: 20 70 49 64 78 2d 3e 73 7a 49 64 78 52 6f 77 20   pIdx->szIdxRow 
cfc0: 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28  = sqlite3LogEst(
cfd0: 77 49 6e 64 65 78 2a 34 29 3b 0a 7d 0a 0a 2f 2a  wIndex*4);.}../*
cfe0: 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20   Return true if 
cff0: 76 61 6c 75 65 20 78 20 69 73 20 66 6f 75 6e 64  value x is found
d000: 20 61 6e 79 20 6f 66 20 74 68 65 20 66 69 72 73   any of the firs
d010: 74 20 6e 43 6f 6c 20 65 6e 74 72 69 65 73 20 6f  t nCol entries o
d020: 66 20 61 69 43 6f 6c 5b 5d 0a 2a 2f 0a 73 74 61  f aiCol[].*/.sta
d030: 74 69 63 20 69 6e 74 20 68 61 73 43 6f 6c 75 6d  tic int hasColum
d040: 6e 28 63 6f 6e 73 74 20 69 31 36 20 2a 61 69 43  n(const i16 *aiC
d050: 6f 6c 2c 20 69 6e 74 20 6e 43 6f 6c 2c 20 69 6e  ol, int nCol, in
d060: 74 20 78 29 7b 0a 20 20 77 68 69 6c 65 28 20 6e  t x){.  while( n
d070: 43 6f 6c 2d 2d 20 3e 20 30 20 29 20 69 66 28 20  Col-- > 0 ) if( 
d080: 78 3d 3d 2a 28 61 69 43 6f 6c 2b 2b 29 20 29 20  x==*(aiCol++) ) 
d090: 72 65 74 75 72 6e 20 31 3b 0a 20 20 72 65 74 75  return 1;.  retu
d0a0: 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  rn 0;.}../*.** T
d0b0: 68 69 73 20 72 6f 75 74 69 6e 65 20 72 75 6e 73  his routine runs
d0c0: 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 70   at the end of p
d0d0: 61 72 73 69 6e 67 20 61 20 43 52 45 41 54 45 20  arsing a CREATE 
d0e0: 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 20  TABLE statement 
d0f0: 74 68 61 74 0a 2a 2a 20 68 61 73 20 61 20 57 49  that.** has a WI
d100: 54 48 4f 55 54 20 52 4f 57 49 44 20 63 6c 61 75  THOUT ROWID clau
d110: 73 65 2e 20 20 54 68 65 20 6a 6f 62 20 6f 66 20  se.  The job of 
d120: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
d130: 74 6f 20 63 6f 6e 76 65 72 74 20 62 6f 74 68 0a  to convert both.
d140: 2a 2a 20 69 6e 74 65 72 6e 61 6c 20 73 63 68 65  ** internal sche
d150: 6d 61 20 64 61 74 61 20 73 74 72 75 63 74 75 72  ma data structur
d160: 65 73 20 61 6e 64 20 74 68 65 20 67 65 6e 65 72  es and the gener
d170: 61 74 65 64 20 56 44 42 45 20 63 6f 64 65 20 73  ated VDBE code s
d180: 6f 20 74 68 61 74 20 74 68 65 79 0a 2a 2a 20 61  o that they.** a
d190: 72 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 66  re appropriate f
d1a0: 6f 72 20 61 20 57 49 54 48 4f 55 54 20 52 4f 57  or a WITHOUT ROW
d1b0: 49 44 20 74 61 62 6c 65 20 69 6e 73 74 65 61 64  ID table instead
d1c0: 20 6f 66 20 61 20 72 6f 77 69 64 20 74 61 62 6c   of a rowid tabl
d1d0: 65 2e 0a 2a 2a 20 43 68 61 6e 67 65 73 20 69 6e  e..** Changes in
d1e0: 63 6c 75 64 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  clude:.**.**    
d1f0: 20 28 31 29 20 20 43 6f 6e 76 65 72 74 20 74 68   (1)  Convert th
d200: 65 20 4f 50 5f 43 72 65 61 74 65 54 61 62 6c 65  e OP_CreateTable
d210: 20 69 6e 74 6f 20 61 6e 20 4f 50 5f 43 72 65 61   into an OP_Crea
d220: 74 65 49 6e 64 65 78 2e 20 20 54 68 65 72 65 20  teIndex.  There 
d230: 69 73 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 6e  is.**          n
d240: 6f 20 72 6f 77 69 64 20 62 74 72 65 65 20 66 6f  o rowid btree fo
d250: 72 20 61 20 57 49 54 48 4f 55 54 20 52 4f 57 49  r a WITHOUT ROWI
d260: 44 2e 20 20 49 6e 73 74 65 61 64 2c 20 74 68 65  D.  Instead, the
d270: 20 63 61 6e 6f 6e 69 63 61 6c 0a 2a 2a 20 20 20   canonical.**   
d280: 20 20 20 20 20 20 20 64 61 74 61 20 73 74 6f 72         data stor
d290: 61 67 65 20 69 73 20 61 20 63 6f 76 65 72 69 6e  age is a coverin
d2a0: 67 20 69 6e 64 65 78 20 62 74 72 65 65 2e 0a 2a  g index btree..*
d2b0: 2a 20 20 20 20 20 28 32 29 20 20 42 79 70 61 73  *     (2)  Bypas
d2c0: 73 20 74 68 65 20 63 72 65 61 74 69 6f 6e 20 6f  s the creation o
d2d0: 66 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73  f the sqlite_mas
d2e0: 74 65 72 20 74 61 62 6c 65 20 65 6e 74 72 79 0a  ter table entry.
d2f0: 2a 2a 20 20 20 20 20 20 20 20 20 20 66 6f 72 20  **          for 
d300: 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20  the PRIMARY KEY 
d310: 61 73 20 74 68 65 20 70 72 69 6d 61 72 79 20 6b  as the primary k
d320: 65 79 20 69 6e 64 65 78 20 69 73 20 6e 6f 77 0a  ey index is now.
d330: 2a 2a 20 20 20 20 20 20 20 20 20 20 69 64 65 6e  **          iden
d340: 74 69 66 69 65 64 20 62 79 20 74 68 65 20 73 71  tified by the sq
d350: 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c  lite_master tabl
d360: 65 20 65 6e 74 72 79 20 6f 66 20 74 68 65 20 74  e entry of the t
d370: 61 62 6c 65 20 69 74 73 65 6c 66 2e 0a 2a 2a 20  able itself..** 
d380: 20 20 20 20 28 33 29 20 20 53 65 74 20 74 68 65      (3)  Set the
d390: 20 49 6e 64 65 78 2e 74 6e 75 6d 20 6f 66 20 74   Index.tnum of t
d3a0: 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 49  he PRIMARY KEY I
d3b0: 6e 64 65 78 20 6f 62 6a 65 63 74 20 69 6e 20 74  ndex object in t
d3c0: 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 73  he.**          s
d3d0: 63 68 65 6d 61 20 74 6f 20 74 68 65 20 72 6f 6f  chema to the roo
d3e0: 74 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 6d  tpage from the m
d3f0: 61 69 6e 20 74 61 62 6c 65 2e 0a 2a 2a 20 20 20  ain table..**   
d400: 20 20 28 34 29 20 20 53 65 74 20 61 6c 6c 20 63    (4)  Set all c
d410: 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 50 52  olumns of the PR
d420: 49 4d 41 52 59 20 4b 45 59 20 73 63 68 65 6d 61  IMARY KEY schema
d430: 20 6f 62 6a 65 63 74 20 74 6f 20 62 65 20 4e 4f   object to be NO
d440: 54 20 4e 55 4c 4c 2e 0a 2a 2a 20 20 20 20 20 28  T NULL..**     (
d450: 35 29 20 20 41 64 64 20 61 6c 6c 20 74 61 62 6c  5)  Add all tabl
d460: 65 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 74 68 65  e columns to the
d470: 20 50 52 49 4d 41 52 59 20 4b 45 59 20 49 6e 64   PRIMARY KEY Ind
d480: 65 78 20 6f 62 6a 65 63 74 0a 2a 2a 20 20 20 20  ex object.**    
d490: 20 20 20 20 20 20 73 6f 20 74 68 61 74 20 74 68        so that th
d4a0: 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 69 73  e PRIMARY KEY is
d4b0: 20 61 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65   a covering inde
d4c0: 78 2e 20 20 54 68 65 20 73 75 72 70 6c 75 73 0a  x.  The surplus.
d4d0: 2a 2a 20 20 20 20 20 20 20 20 20 20 63 6f 6c 75  **          colu
d4e0: 6d 6e 73 20 61 72 65 20 70 61 72 74 20 6f 66 20  mns are part of 
d4f0: 4b 65 79 49 6e 66 6f 2e 6e 58 46 69 65 6c 64 20  KeyInfo.nXField 
d500: 61 6e 64 20 61 72 65 20 6e 6f 74 20 75 73 65 64  and are not used
d510: 20 66 6f 72 0a 2a 2a 20 20 20 20 20 20 20 20 20   for.**         
d520: 20 73 6f 72 74 69 6e 67 20 6f 72 20 6c 6f 6f 6b   sorting or look
d530: 75 70 20 6f 72 20 75 6e 69 71 75 65 6e 65 73 73  up or uniqueness
d540: 20 63 68 65 63 6b 73 2e 0a 2a 2a 20 20 20 20 20   checks..**     
d550: 28 36 29 20 20 52 65 70 6c 61 63 65 20 74 68 65  (6)  Replace the
d560: 20 72 6f 77 69 64 20 74 61 69 6c 20 6f 6e 20 61   rowid tail on a
d570: 6c 6c 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  ll automatically
d580: 20 67 65 6e 65 72 61 74 65 64 20 55 4e 49 51 55   generated UNIQU
d590: 45 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 69 6e  E.**          in
d5a0: 64 69 63 65 73 20 77 69 74 68 20 74 68 65 20 50  dices with the P
d5b0: 52 49 4d 41 52 59 20 4b 45 59 20 63 6f 6c 75 6d  RIMARY KEY colum
d5c0: 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ns..*/.static vo
d5d0: 69 64 20 63 6f 6e 76 65 72 74 54 6f 57 69 74 68  id convertToWith
d5e0: 6f 75 74 52 6f 77 69 64 54 61 62 6c 65 28 50 61  outRowidTable(Pa
d5f0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 61 62  rse *pParse, Tab
d600: 6c 65 20 2a 70 54 61 62 29 7b 0a 20 20 49 6e 64  le *pTab){.  Ind
d610: 65 78 20 2a 70 49 64 78 3b 0a 20 20 49 6e 64 65  ex *pIdx;.  Inde
d620: 78 20 2a 70 50 6b 3b 0a 20 20 69 6e 74 20 6e 50  x *pPk;.  int nP
d630: 6b 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20  k;.  int i, j;. 
d640: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
d650: 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 56 64 62  Parse->db;.  Vdb
d660: 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
d670: 56 64 62 65 3b 0a 0a 20 20 2f 2a 20 43 6f 6e 76  Vdbe;..  /* Conv
d680: 65 72 74 20 74 68 65 20 4f 50 5f 43 72 65 61 74  ert the OP_Creat
d690: 65 54 61 62 6c 65 20 6f 70 63 6f 64 65 20 74 68  eTable opcode th
d6a0: 61 74 20 77 6f 75 6c 64 20 6e 6f 72 6d 61 6c 6c  at would normall
d6b0: 79 20 63 72 65 61 74 65 20 74 68 65 0a 20 20 2a  y create the.  *
d6c0: 2a 20 72 6f 6f 74 2d 70 61 67 65 20 66 6f 72 20  * root-page for 
d6d0: 74 68 65 20 74 61 62 6c 65 20 69 6e 74 6f 20 61  the table into a
d6e0: 6e 20 4f 50 5f 43 72 65 61 74 65 49 6e 64 65 78  n OP_CreateIndex
d6f0: 20 6f 70 63 6f 64 65 2e 20 20 54 68 65 20 69 6e   opcode.  The in
d700: 64 65 78 0a 20 20 2a 2a 20 63 72 65 61 74 65 64  dex.  ** created
d710: 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65   will become the
d720: 20 50 52 49 4d 41 52 59 20 4b 45 59 20 69 6e 64   PRIMARY KEY ind
d730: 65 78 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ex..  */.  if( p
d740: 50 61 72 73 65 2d 3e 61 64 64 72 43 72 54 61 62  Parse->addrCrTab
d750: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
d760: 76 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  v );.    sqlite3
d770: 56 64 62 65 43 68 61 6e 67 65 4f 70 63 6f 64 65  VdbeChangeOpcode
d780: 28 76 2c 20 70 50 61 72 73 65 2d 3e 61 64 64 72  (v, pParse->addr
d790: 43 72 54 61 62 2c 20 4f 50 5f 43 72 65 61 74 65  CrTab, OP_Create
d7a0: 49 6e 64 65 78 29 3b 0a 20 20 7d 0a 0a 20 20 2f  Index);.  }..  /
d7b0: 2a 20 4c 6f 63 61 74 65 20 74 68 65 20 50 52 49  * Locate the PRI
d7c0: 4d 41 52 59 20 4b 45 59 20 69 6e 64 65 78 2e 20  MARY KEY index. 
d7d0: 20 4f 72 2c 20 69 66 20 74 68 69 73 20 74 61 62   Or, if this tab
d7e0: 6c 65 20 77 61 73 20 6f 72 69 67 69 6e 61 6c 6c  le was originall
d7f0: 79 0a 20 20 2a 2a 20 61 6e 20 49 4e 54 45 47 45  y.  ** an INTEGE
d800: 52 20 50 52 49 4d 41 52 59 20 4b 45 59 20 74 61  R PRIMARY KEY ta
d810: 62 6c 65 2c 20 63 72 65 61 74 65 20 61 20 6e 65  ble, create a ne
d820: 77 20 50 52 49 4d 41 52 59 20 4b 45 59 20 69 6e  w PRIMARY KEY in
d830: 64 65 78 2e 20 0a 20 20 2a 2f 0a 20 20 69 66 28  dex. .  */.  if(
d840: 20 70 54 61 62 2d 3e 69 50 4b 65 79 3e 3d 30 20   pTab->iPKey>=0 
d850: 29 7b 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20  ){.    ExprList 
d860: 2a 70 4c 69 73 74 3b 0a 20 20 20 20 54 6f 6b 65  *pList;.    Toke
d870: 6e 20 69 70 6b 54 6f 6b 65 6e 3b 0a 20 20 20 20  n ipkToken;.    
d880: 73 71 6c 69 74 65 33 54 6f 6b 65 6e 49 6e 69 74  sqlite3TokenInit
d890: 28 26 69 70 6b 54 6f 6b 65 6e 2c 20 70 54 61 62  (&ipkToken, pTab
d8a0: 2d 3e 61 43 6f 6c 5b 70 54 61 62 2d 3e 69 50 4b  ->aCol[pTab->iPK
d8b0: 65 79 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ey].zName);.    
d8c0: 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45  pList = sqlite3E
d8d0: 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50  xprListAppend(pP
d8e0: 61 72 73 65 2c 20 30 2c 20 0a 20 20 20 20 20 20  arse, 0, .      
d8f0: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
d900: 74 65 33 45 78 70 72 41 6c 6c 6f 63 28 64 62 2c  te3ExprAlloc(db,
d910: 20 54 4b 5f 49 44 2c 20 26 69 70 6b 54 6f 6b 65   TK_ID, &ipkToke
d920: 6e 2c 20 30 29 29 3b 0a 20 20 20 20 69 66 28 20  n, 0));.    if( 
d930: 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72  pList==0 ) retur
d940: 6e 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 61 5b  n;.    pList->a[
d950: 30 5d 2e 73 6f 72 74 4f 72 64 65 72 20 3d 20 70  0].sortOrder = p
d960: 50 61 72 73 65 2d 3e 69 50 6b 53 6f 72 74 4f 72  Parse->iPkSortOr
d970: 64 65 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28  der;.    assert(
d980: 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
d990: 6c 65 3d 3d 70 54 61 62 20 29 3b 0a 20 20 20 20  le==pTab );.    
d9a0: 70 50 6b 20 3d 20 73 71 6c 69 74 65 33 43 72 65  pPk = sqlite3Cre
d9b0: 61 74 65 49 6e 64 65 78 28 70 50 61 72 73 65 2c  ateIndex(pParse,
d9c0: 20 30 2c 20 30 2c 20 30 2c 20 70 4c 69 73 74 2c   0, 0, 0, pList,
d9d0: 20 70 54 61 62 2d 3e 6b 65 79 43 6f 6e 66 2c 20   pTab->keyConf, 
d9e0: 30 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20  0, 0, 0, 0);.   
d9f0: 20 69 66 28 20 70 50 6b 3d 3d 30 20 29 20 72 65   if( pPk==0 ) re
da00: 74 75 72 6e 3b 0a 20 20 20 20 70 50 6b 2d 3e 69  turn;.    pPk->i
da10: 64 78 54 79 70 65 20 3d 20 53 51 4c 49 54 45 5f  dxType = SQLITE_
da20: 49 44 58 54 59 50 45 5f 50 52 49 4d 41 52 59 4b  IDXTYPE_PRIMARYK
da30: 45 59 3b 0a 20 20 20 20 70 54 61 62 2d 3e 69 50  EY;.    pTab->iP
da40: 4b 65 79 20 3d 20 2d 31 3b 0a 20 20 7d 65 6c 73  Key = -1;.  }els
da50: 65 7b 0a 20 20 20 20 70 50 6b 20 3d 20 73 71 6c  e{.    pPk = sql
da60: 69 74 65 33 50 72 69 6d 61 72 79 4b 65 79 49 6e  ite3PrimaryKeyIn
da70: 64 65 78 28 70 54 61 62 29 3b 0a 0a 20 20 20 20  dex(pTab);..    
da80: 2f 2a 20 42 79 70 61 73 73 20 74 68 65 20 63 72  /* Bypass the cr
da90: 65 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 50 52  eation of the PR
daa0: 49 4d 41 52 59 20 4b 45 59 20 62 74 72 65 65 20  IMARY KEY btree 
dab0: 61 6e 64 20 74 68 65 20 73 71 6c 69 74 65 5f 6d  and the sqlite_m
dac0: 61 73 74 65 72 0a 20 20 20 20 2a 2a 20 74 61 62  aster.    ** tab
dad0: 6c 65 20 65 6e 74 72 79 2e 20 54 68 69 73 20 69  le entry. This i
dae0: 73 20 6f 6e 6c 79 20 72 65 71 75 69 72 65 64 20  s only required 
daf0: 69 66 20 63 75 72 72 65 6e 74 6c 79 20 67 65 6e  if currently gen
db00: 65 72 61 74 69 6e 67 20 56 44 42 45 0a 20 20 20  erating VDBE.   
db10: 20 2a 2a 20 63 6f 64 65 20 66 6f 72 20 61 20 43   ** code for a C
db20: 52 45 41 54 45 20 54 41 42 4c 45 20 28 6e 6f 74  REATE TABLE (not
db30: 20 77 68 65 6e 20 70 61 72 73 69 6e 67 20 6f 6e   when parsing on
db40: 65 20 61 73 20 70 61 72 74 20 6f 66 20 72 65 61  e as part of rea
db50: 64 69 6e 67 0a 20 20 20 20 2a 2a 20 61 20 64 61  ding.    ** a da
db60: 74 61 62 61 73 65 20 73 63 68 65 6d 61 29 2e 20  tabase schema). 
db70: 20 2a 2f 0a 20 20 20 20 69 66 28 20 76 20 29 7b   */.    if( v ){
db80: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 64  .      assert( d
db90: 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d 30 20  b->init.busy==0 
dba0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
dbb0: 56 64 62 65 43 68 61 6e 67 65 4f 70 63 6f 64 65  VdbeChangeOpcode
dbc0: 28 76 2c 20 70 50 6b 2d 3e 74 6e 75 6d 2c 20 4f  (v, pPk->tnum, O
dbd0: 50 5f 47 6f 74 6f 29 3b 0a 20 20 20 20 7d 0a 0a  P_Goto);.    }..
dbe0: 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 52 65      /*.    ** Re
dbf0: 6d 6f 76 65 20 61 6c 6c 20 72 65 64 75 6e 64 61  move all redunda
dc00: 6e 74 20 63 6f 6c 75 6d 6e 73 20 66 72 6f 6d 20  nt columns from 
dc10: 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59 2e  the PRIMARY KEY.
dc20: 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 63    For example, c
dc30: 68 61 6e 67 65 0a 20 20 20 20 2a 2a 20 22 50 52  hange.    ** "PR
dc40: 49 4d 41 52 59 20 4b 45 59 28 61 2c 62 2c 61 2c  IMARY KEY(a,b,a,
dc50: 62 2c 63 2c 62 2c 63 2c 64 29 22 20 69 6e 74 6f  b,c,b,c,d)" into
dc60: 20 6a 75 73 74 20 22 50 52 49 4d 41 52 59 20 4b   just "PRIMARY K
dc70: 45 59 28 61 2c 62 2c 63 2c 64 29 22 2e 20 20 4c  EY(a,b,c,d)".  L
dc80: 61 74 65 72 0a 20 20 20 20 2a 2a 20 63 6f 64 65  ater.    ** code
dc90: 20 61 73 73 75 6d 65 73 20 74 68 65 20 50 52 49   assumes the PRI
dca0: 4d 41 52 59 20 4b 45 59 20 63 6f 6e 74 61 69 6e  MARY KEY contain
dcb0: 73 20 6e 6f 20 72 65 70 65 61 74 65 64 20 63 6f  s no repeated co
dcc0: 6c 75 6d 6e 73 2e 0a 20 20 20 20 2a 2f 0a 20 20  lumns..    */.  
dcd0: 20 20 66 6f 72 28 69 3d 6a 3d 31 3b 20 69 3c 70    for(i=j=1; i<p
dce0: 50 6b 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 69 2b 2b  Pk->nKeyCol; i++
dcf0: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 68 61 73  ){.      if( has
dd00: 43 6f 6c 75 6d 6e 28 70 50 6b 2d 3e 61 69 43 6f  Column(pPk->aiCo
dd10: 6c 75 6d 6e 2c 20 6a 2c 20 70 50 6b 2d 3e 61 69  lumn, j, pPk->ai
dd20: 43 6f 6c 75 6d 6e 5b 69 5d 29 20 29 7b 0a 20 20  Column[i]) ){.  
dd30: 20 20 20 20 20 20 70 50 6b 2d 3e 6e 43 6f 6c 75        pPk->nColu
dd40: 6d 6e 2d 2d 3b 0a 20 20 20 20 20 20 7d 65 6c 73  mn--;.      }els
dd50: 65 7b 0a 20 20 20 20 20 20 20 20 70 50 6b 2d 3e  e{.        pPk->
dd60: 61 69 43 6f 6c 75 6d 6e 5b 6a 2b 2b 5d 20 3d 20  aiColumn[j++] = 
dd70: 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d  pPk->aiColumn[i]
dd80: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
dd90: 20 20 20 20 70 50 6b 2d 3e 6e 4b 65 79 43 6f 6c      pPk->nKeyCol
dda0: 20 3d 20 6a 3b 0a 20 20 7d 0a 20 20 70 50 6b 2d   = j;.  }.  pPk-
ddb0: 3e 69 73 43 6f 76 65 72 69 6e 67 20 3d 20 31 3b  >isCovering = 1;
ddc0: 0a 20 20 61 73 73 65 72 74 28 20 70 50 6b 21 3d  .  assert( pPk!=
ddd0: 30 20 29 3b 0a 20 20 6e 50 6b 20 3d 20 70 50 6b  0 );.  nPk = pPk
dde0: 2d 3e 6e 4b 65 79 43 6f 6c 3b 0a 0a 20 20 2f 2a  ->nKeyCol;..  /*
ddf0: 20 4d 61 6b 65 20 73 75 72 65 20 65 76 65 72 79   Make sure every
de00: 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 50   column of the P
de10: 52 49 4d 41 52 59 20 4b 45 59 20 69 73 20 4e 4f  RIMARY KEY is NO
de20: 54 20 4e 55 4c 4c 2e 20 20 28 45 78 63 65 70 74  T NULL.  (Except
de30: 2c 0a 20 20 2a 2a 20 64 6f 20 6e 6f 74 20 65 6e  ,.  ** do not en
de40: 66 6f 72 63 65 20 74 68 69 73 20 66 6f 72 20 69  force this for i
de50: 6d 70 6f 73 74 65 72 20 74 61 62 6c 65 73 2e 29  mposter tables.)
de60: 20 2a 2f 0a 20 20 69 66 28 20 21 64 62 2d 3e 69   */.  if( !db->i
de70: 6e 69 74 2e 69 6d 70 6f 73 74 65 72 54 61 62 6c  nit.imposterTabl
de80: 65 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30  e ){.    for(i=0
de90: 3b 20 69 3c 6e 50 6b 3b 20 69 2b 2b 29 7b 0a 20  ; i<nPk; i++){. 
dea0: 20 20 20 20 20 70 54 61 62 2d 3e 61 43 6f 6c 5b       pTab->aCol[
deb0: 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d  pPk->aiColumn[i]
dec0: 5d 2e 6e 6f 74 4e 75 6c 6c 20 3d 20 4f 45 5f 41  ].notNull = OE_A
ded0: 62 6f 72 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  bort;.    }.    
dee0: 70 50 6b 2d 3e 75 6e 69 71 4e 6f 74 4e 75 6c 6c  pPk->uniqNotNull
def0: 20 3d 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20   = 1;.  }..  /* 
df00: 54 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66  The root page of
df10: 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59   the PRIMARY KEY
df20: 20 69 73 20 74 68 65 20 74 61 62 6c 65 20 72 6f   is the table ro
df30: 6f 74 20 70 61 67 65 20 2a 2f 0a 20 20 70 50 6b  ot page */.  pPk
df40: 2d 3e 74 6e 75 6d 20 3d 20 70 54 61 62 2d 3e 74  ->tnum = pTab->t
df50: 6e 75 6d 3b 0a 0a 20 20 2f 2a 20 55 70 64 61 74  num;..  /* Updat
df60: 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20  e the in-memory 
df70: 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f  representation o
df80: 66 20 61 6c 6c 20 55 4e 49 51 55 45 20 69 6e 64  f all UNIQUE ind
df90: 69 63 65 73 20 62 79 20 63 6f 6e 76 65 72 74 69  ices by converti
dfa0: 6e 67 0a 20 20 2a 2a 20 74 68 65 20 66 69 6e 61  ng.  ** the fina
dfb0: 6c 20 72 6f 77 69 64 20 63 6f 6c 75 6d 6e 20 69  l rowid column i
dfc0: 6e 74 6f 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20  nto one or more 
dfd0: 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 50  columns of the P
dfe0: 52 49 4d 41 52 59 20 4b 45 59 2e 0a 20 20 2a 2f  RIMARY KEY..  */
dff0: 0a 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62  .  for(pIdx=pTab
e000: 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20  ->pIndex; pIdx; 
e010: 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74  pIdx=pIdx->pNext
e020: 29 7b 0a 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20  ){.    int n;.  
e030: 20 20 69 66 28 20 49 73 50 72 69 6d 61 72 79 4b    if( IsPrimaryK
e040: 65 79 49 6e 64 65 78 28 70 49 64 78 29 20 29 20  eyIndex(pIdx) ) 
e050: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 66 6f  continue;.    fo
e060: 72 28 69 3d 6e 3d 30 3b 20 69 3c 6e 50 6b 3b 20  r(i=n=0; i<nPk; 
e070: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  i++){.      if( 
e080: 21 68 61 73 43 6f 6c 75 6d 6e 28 70 49 64 78 2d  !hasColumn(pIdx-
e090: 3e 61 69 43 6f 6c 75 6d 6e 2c 20 70 49 64 78 2d  >aiColumn, pIdx-
e0a0: 3e 6e 4b 65 79 43 6f 6c 2c 20 70 50 6b 2d 3e 61  >nKeyCol, pPk->a
e0b0: 69 43 6f 6c 75 6d 6e 5b 69 5d 29 20 29 20 6e 2b  iColumn[i]) ) n+
e0c0: 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  +;.    }.    if(
e0d0: 20 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f   n==0 ){.      /
e0e0: 2a 20 54 68 69 73 20 69 6e 64 65 78 20 69 73 20  * This index is 
e0f0: 61 20 73 75 70 65 72 73 65 74 20 6f 66 20 74 68  a superset of th
e100: 65 20 70 72 69 6d 61 72 79 20 6b 65 79 20 2a 2f  e primary key */
e110: 0a 20 20 20 20 20 20 70 49 64 78 2d 3e 6e 43 6f  .      pIdx->nCo
e120: 6c 75 6d 6e 20 3d 20 70 49 64 78 2d 3e 6e 4b 65  lumn = pIdx->nKe
e130: 79 43 6f 6c 3b 0a 20 20 20 20 20 20 63 6f 6e 74  yCol;.      cont
e140: 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20  inue;.    }.    
e150: 69 66 28 20 72 65 73 69 7a 65 49 6e 64 65 78 4f  if( resizeIndexO
e160: 62 6a 65 63 74 28 64 62 2c 20 70 49 64 78 2c 20  bject(db, pIdx, 
e170: 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 2b 6e 29  pIdx->nKeyCol+n)
e180: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 66   ) return;.    f
e190: 6f 72 28 69 3d 30 2c 20 6a 3d 70 49 64 78 2d 3e  or(i=0, j=pIdx->
e1a0: 6e 4b 65 79 43 6f 6c 3b 20 69 3c 6e 50 6b 3b 20  nKeyCol; i<nPk; 
e1b0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  i++){.      if( 
e1c0: 21 68 61 73 43 6f 6c 75 6d 6e 28 70 49 64 78 2d  !hasColumn(pIdx-
e1d0: 3e 61 69 43 6f 6c 75 6d 6e 2c 20 70 49 64 78 2d  >aiColumn, pIdx-
e1e0: 3e 6e 4b 65 79 43 6f 6c 2c 20 70 50 6b 2d 3e 61  >nKeyCol, pPk->a
e1f0: 69 43 6f 6c 75 6d 6e 5b 69 5d 29 20 29 7b 0a 20  iColumn[i]) ){. 
e200: 20 20 20 20 20 20 20 70 49 64 78 2d 3e 61 69 43         pIdx->aiC
e210: 6f 6c 75 6d 6e 5b 6a 5d 20 3d 20 70 50 6b 2d 3e  olumn[j] = pPk->
e220: 61 69 43 6f 6c 75 6d 6e 5b 69 5d 3b 0a 20 20 20  aiColumn[i];.   
e230: 20 20 20 20 20 70 49 64 78 2d 3e 61 7a 43 6f 6c       pIdx->azCol
e240: 6c 5b 6a 5d 20 3d 20 70 50 6b 2d 3e 61 7a 43 6f  l[j] = pPk->azCo
e250: 6c 6c 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 6a  ll[i];.        j
e260: 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ++;.      }.    
e270: 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49  }.    assert( pI
e280: 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3e 3d 70 49 64  dx->nColumn>=pId
e290: 78 2d 3e 6e 4b 65 79 43 6f 6c 2b 6e 20 29 3b 0a  x->nKeyCol+n );.
e2a0: 20 20 20 20 61 73 73 65 72 74 28 20 70 49 64 78      assert( pIdx
e2b0: 2d 3e 6e 43 6f 6c 75 6d 6e 3e 3d 6a 20 29 3b 0a  ->nColumn>=j );.
e2c0: 20 20 7d 0a 0a 20 20 2f 2a 20 41 64 64 20 61 6c    }..  /* Add al
e2d0: 6c 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 73 20  l table columns 
e2e0: 74 6f 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b  to the PRIMARY K
e2f0: 45 59 20 69 6e 64 65 78 0a 20 20 2a 2f 0a 20 20  EY index.  */.  
e300: 69 66 28 20 6e 50 6b 3c 70 54 61 62 2d 3e 6e 43  if( nPk<pTab->nC
e310: 6f 6c 20 29 7b 0a 20 20 20 20 69 66 28 20 72 65  ol ){.    if( re
e320: 73 69 7a 65 49 6e 64 65 78 4f 62 6a 65 63 74 28  sizeIndexObject(
e330: 64 62 2c 20 70 50 6b 2c 20 70 54 61 62 2d 3e 6e  db, pPk, pTab->n
e340: 43 6f 6c 29 20 29 20 72 65 74 75 72 6e 3b 0a 20  Col) ) return;. 
e350: 20 20 20 66 6f 72 28 69 3d 30 2c 20 6a 3d 6e 50     for(i=0, j=nP
e360: 6b 3b 20 69 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b  k; i<pTab->nCol;
e370: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   i++){.      if(
e380: 20 21 68 61 73 43 6f 6c 75 6d 6e 28 70 50 6b 2d   !hasColumn(pPk-
e390: 3e 61 69 43 6f 6c 75 6d 6e 2c 20 6a 2c 20 69 29  >aiColumn, j, i)
e3a0: 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
e3b0: 72 74 28 20 6a 3c 70 50 6b 2d 3e 6e 43 6f 6c 75  rt( j<pPk->nColu
e3c0: 6d 6e 20 29 3b 0a 20 20 20 20 20 20 20 20 70 50  mn );.        pP
e3d0: 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 20 3d  k->aiColumn[j] =
e3e0: 20 69 3b 0a 20 20 20 20 20 20 20 20 70 50 6b 2d   i;.        pPk-
e3f0: 3e 61 7a 43 6f 6c 6c 5b 6a 5d 20 3d 20 73 71 6c  >azColl[j] = sql
e400: 69 74 65 33 53 74 72 42 49 4e 41 52 59 3b 0a 20  ite3StrBINARY;. 
e410: 20 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20         j++;.    
e420: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61 73    }.    }.    as
e430: 73 65 72 74 28 20 70 50 6b 2d 3e 6e 43 6f 6c 75  sert( pPk->nColu
e440: 6d 6e 3d 3d 6a 20 29 3b 0a 20 20 20 20 61 73 73  mn==j );.    ass
e450: 65 72 74 28 20 70 54 61 62 2d 3e 6e 43 6f 6c 3d  ert( pTab->nCol=
e460: 3d 6a 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  =j );.  }else{. 
e470: 20 20 20 70 50 6b 2d 3e 6e 43 6f 6c 75 6d 6e 20     pPk->nColumn 
e480: 3d 20 70 54 61 62 2d 3e 6e 43 6f 6c 3b 0a 20 20  = pTab->nCol;.  
e490: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  }.}../*.** This 
e4a0: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
e4b0: 64 20 74 6f 20 72 65 70 6f 72 74 20 74 68 65 20  d to report the 
e4c0: 66 69 6e 61 6c 20 22 29 22 20 74 68 61 74 20 74  final ")" that t
e4d0: 65 72 6d 69 6e 61 74 65 73 0a 2a 2a 20 61 20 43  erminates.** a C
e4e0: 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74  REATE TABLE stat
e4f0: 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ement..**.** The
e500: 20 74 61 62 6c 65 20 73 74 72 75 63 74 75 72 65   table structure
e510: 20 74 68 61 74 20 6f 74 68 65 72 20 61 63 74 69   that other acti
e520: 6f 6e 20 72 6f 75 74 69 6e 65 73 20 68 61 76 65  on routines have
e530: 20 62 65 65 6e 20 62 75 69 6c 64 69 6e 67 0a 2a   been building.*
e540: 2a 20 69 73 20 61 64 64 65 64 20 74 6f 20 74 68  * is added to th
e550: 65 20 69 6e 74 65 72 6e 61 6c 20 68 61 73 68 20  e internal hash 
e560: 74 61 62 6c 65 73 2c 20 61 73 73 75 6d 69 6e 67  tables, assuming
e570: 20 6e 6f 20 65 72 72 6f 72 73 20 68 61 76 65 0a   no errors have.
e580: 2a 2a 20 6f 63 63 75 72 72 65 64 2e 0a 2a 2a 0a  ** occurred..**.
e590: 2a 2a 20 41 6e 20 65 6e 74 72 79 20 66 6f 72 20  ** An entry for 
e5a0: 74 68 65 20 74 61 62 6c 65 20 69 73 20 6d 61 64  the table is mad
e5b0: 65 20 69 6e 20 74 68 65 20 6d 61 73 74 65 72 20  e in the master 
e5c0: 74 61 62 6c 65 20 6f 6e 20 64 69 73 6b 2c 20 75  table on disk, u
e5d0: 6e 6c 65 73 73 0a 2a 2a 20 74 68 69 73 20 69 73  nless.** this is
e5e0: 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62   a temporary tab
e5f0: 6c 65 20 6f 72 20 64 62 2d 3e 69 6e 69 74 2e 62  le or db->init.b
e600: 75 73 79 3d 3d 31 2e 20 20 57 68 65 6e 20 64 62  usy==1.  When db
e610: 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d 31 0a 2a  ->init.busy==1.*
e620: 2a 20 69 74 20 6d 65 61 6e 73 20 77 65 20 61 72  * it means we ar
e630: 65 20 72 65 61 64 69 6e 67 20 74 68 65 20 73 71  e reading the sq
e640: 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c  lite_master tabl
e650: 65 20 62 65 63 61 75 73 65 20 77 65 20 6a 75 73  e because we jus
e660: 74 0a 2a 2a 20 63 6f 6e 6e 65 63 74 65 64 20 74  t.** connected t
e670: 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6f  o the database o
e680: 72 20 62 65 63 61 75 73 65 20 74 68 65 20 73 71  r because the sq
e690: 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c  lite_master tabl
e6a0: 65 20 68 61 73 0a 2a 2a 20 72 65 63 65 6e 74 6c  e has.** recentl
e6b0: 79 20 63 68 61 6e 67 65 64 2c 20 73 6f 20 74 68  y changed, so th
e6c0: 65 20 65 6e 74 72 79 20 66 6f 72 20 74 68 69 73  e entry for this
e6d0: 20 74 61 62 6c 65 20 61 6c 72 65 61 64 79 20 65   table already e
e6e0: 78 69 73 74 73 20 69 6e 0a 2a 2a 20 74 68 65 20  xists in.** the 
e6f0: 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61  sqlite_master ta
e700: 62 6c 65 2e 20 20 57 65 20 64 6f 20 6e 6f 74 20  ble.  We do not 
e710: 77 61 6e 74 20 74 6f 20 63 72 65 61 74 65 20 69  want to create i
e720: 74 20 61 67 61 69 6e 2e 0a 2a 2a 0a 2a 2a 20 49  t again..**.** I
e730: 66 20 74 68 65 20 70 53 65 6c 65 63 74 20 61 72  f the pSelect ar
e740: 67 75 6d 65 6e 74 20 69 73 20 6e 6f 74 20 4e 55  gument is not NU
e750: 4c 4c 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61  LL, it means tha
e760: 74 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a  t this routine.*
e770: 2a 20 77 61 73 20 63 61 6c 6c 65 64 20 74 6f 20  * was called to 
e780: 63 72 65 61 74 65 20 61 20 74 61 62 6c 65 20 67  create a table g
e790: 65 6e 65 72 61 74 65 64 20 66 72 6f 6d 20 61 20  enerated from a 
e7a0: 0a 2a 2a 20 22 43 52 45 41 54 45 20 54 41 42 4c  .** "CREATE TABL
e7b0: 45 20 2e 2e 2e 20 41 53 20 53 45 4c 45 43 54 20  E ... AS SELECT 
e7c0: 2e 2e 2e 22 20 73 74 61 74 65 6d 65 6e 74 2e 20  ..." statement. 
e7d0: 20 54 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65   The column name
e7e0: 73 20 6f 66 0a 2a 2a 20 74 68 65 20 6e 65 77 20  s of.** the new 
e7f0: 74 61 62 6c 65 20 77 69 6c 6c 20 6d 61 74 63 68  table will match
e800: 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
e810: 6f 66 20 74 68 65 20 53 45 4c 45 43 54 2e 0a 2a  of the SELECT..*
e820: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 6e  /.void sqlite3En
e830: 64 54 61 62 6c 65 28 0a 20 20 50 61 72 73 65 20  dTable(.  Parse 
e840: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
e850: 20 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74 65    /* Parse conte
e860: 78 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  xt */.  Token *p
e870: 43 6f 6e 73 2c 20 20 20 20 20 20 20 20 20 20 20  Cons,           
e880: 2f 2a 20 54 68 65 20 27 2c 27 20 74 6f 6b 65 6e  /* The ',' token
e890: 20 61 66 74 65 72 20 74 68 65 20 6c 61 73 74 20   after the last 
e8a0: 63 6f 6c 75 6d 6e 20 64 65 66 6e 2e 20 2a 2f 0a  column defn. */.
e8b0: 20 20 54 6f 6b 65 6e 20 2a 70 45 6e 64 2c 20 20    Token *pEnd,  
e8c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
e8d0: 20 27 29 27 20 62 65 66 6f 72 65 20 6f 70 74 69   ')' before opti
e8e0: 6f 6e 73 20 69 6e 20 74 68 65 20 43 52 45 41 54  ons in the CREAT
e8f0: 45 20 54 41 42 4c 45 20 2a 2f 0a 20 20 75 38 20  E TABLE */.  u8 
e900: 74 61 62 4f 70 74 73 2c 20 20 20 20 20 20 20 20  tabOpts,        
e910: 20 20 20 20 20 2f 2a 20 45 78 74 72 61 20 74 61       /* Extra ta
e920: 62 6c 65 20 6f 70 74 69 6f 6e 73 2e 20 55 73 75  ble options. Usu
e930: 61 6c 6c 79 20 30 2e 20 2a 2f 0a 20 20 53 65 6c  ally 0. */.  Sel
e940: 65 63 74 20 2a 70 53 65 6c 65 63 74 20 20 20 20  ect *pSelect    
e950: 20 20 20 20 20 2f 2a 20 53 65 6c 65 63 74 20 66       /* Select f
e960: 72 6f 6d 20 61 20 22 43 52 45 41 54 45 20 2e 2e  rom a "CREATE ..
e970: 2e 20 41 53 20 53 45 4c 45 43 54 22 20 2a 2f 0a  . AS SELECT" */.
e980: 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 20 20  ){.  Table *p;  
e990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
e9a0: 2a 20 54 68 65 20 6e 65 77 20 74 61 62 6c 65 20  * The new table 
e9b0: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
e9c0: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 2f   = pParse->db; /
e9d0: 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 63  * The database c
e9e0: 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69  onnection */.  i
e9f0: 6e 74 20 69 44 62 3b 20 20 20 20 20 20 20 20 20  nt iDb;         
ea00: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
ea10: 62 61 73 65 20 69 6e 20 77 68 69 63 68 20 74 68  base in which th
ea20: 65 20 74 61 62 6c 65 20 6c 69 76 65 73 20 2a 2f  e table lives */
ea30: 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 20  .  Index *pIdx; 
ea40: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
ea50: 41 6e 20 69 6d 70 6c 69 65 64 20 69 6e 64 65 78  An implied index
ea60: 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 2a 2f   of the table */
ea70: 0a 0a 20 20 69 66 28 20 70 45 6e 64 3d 3d 30 20  ..  if( pEnd==0 
ea80: 26 26 20 70 53 65 6c 65 63 74 3d 3d 30 20 29 7b  && pSelect==0 ){
ea90: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
eaa0: 0a 20 20 61 73 73 65 72 74 28 20 21 64 62 2d 3e  .  assert( !db->
eab0: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
eac0: 20 20 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e    p = pParse->pN
ead0: 65 77 54 61 62 6c 65 3b 0a 20 20 69 66 28 20 70  ewTable;.  if( p
eae0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20  ==0 ) return;.. 
eaf0: 20 61 73 73 65 72 74 28 20 21 64 62 2d 3e 69 6e   assert( !db->in
eb00: 69 74 2e 62 75 73 79 20 7c 7c 20 21 70 53 65 6c  it.busy || !pSel
eb10: 65 63 74 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  ect );..  /* If 
eb20: 74 68 65 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73  the db->init.bus
eb30: 79 20 69 73 20 31 20 69 74 20 6d 65 61 6e 73 20  y is 1 it means 
eb40: 77 65 20 61 72 65 20 72 65 61 64 69 6e 67 20 74  we are reading t
eb50: 68 65 20 53 51 4c 20 6f 66 66 20 74 68 65 0a 20  he SQL off the. 
eb60: 20 2a 2a 20 22 73 71 6c 69 74 65 5f 6d 61 73 74   ** "sqlite_mast
eb70: 65 72 22 20 6f 72 20 22 73 71 6c 69 74 65 5f 74  er" or "sqlite_t
eb80: 65 6d 70 5f 6d 61 73 74 65 72 22 20 74 61 62 6c  emp_master" tabl
eb90: 65 20 6f 6e 20 74 68 65 20 64 69 73 6b 2e 0a 20  e on the disk.. 
eba0: 20 2a 2a 20 53 6f 20 64 6f 20 6e 6f 74 20 77 72   ** So do not wr
ebb0: 69 74 65 20 74 6f 20 74 68 65 20 64 69 73 6b 20  ite to the disk 
ebc0: 61 67 61 69 6e 2e 20 20 45 78 74 72 61 63 74 20  again.  Extract 
ebd0: 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6e 75  the root page nu
ebe0: 6d 62 65 72 0a 20 20 2a 2a 20 66 6f 72 20 74 68  mber.  ** for th
ebf0: 65 20 74 61 62 6c 65 20 66 72 6f 6d 20 74 68 65  e table from the
ec00: 20 64 62 2d 3e 69 6e 69 74 2e 6e 65 77 54 6e 75   db->init.newTnu
ec10: 6d 20 66 69 65 6c 64 2e 20 20 28 54 68 65 20 70  m field.  (The p
ec20: 61 67 65 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20  age number.  ** 
ec30: 73 68 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e  should have been
ec40: 20 70 75 74 20 74 68 65 72 65 20 62 79 20 74 68   put there by th
ec50: 65 20 73 71 6c 69 74 65 4f 70 65 6e 43 62 20 72  e sqliteOpenCb r
ec60: 6f 75 74 69 6e 65 2e 29 0a 20 20 2a 2a 0a 20 20  outine.).  **.  
ec70: 2a 2a 20 49 66 20 74 68 65 20 72 6f 6f 74 20 70  ** If the root p
ec80: 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20 31 2c  age number is 1,
ec90: 20 74 68 61 74 20 6d 65 61 6e 73 20 74 68 69 73   that means this
eca0: 20 69 73 20 74 68 65 20 73 71 6c 69 74 65 5f 6d   is the sqlite_m
ecb0: 61 73 74 65 72 0a 20 20 2a 2a 20 74 61 62 6c 65  aster.  ** table
ecc0: 20 69 74 73 65 6c 66 2e 20 20 53 6f 20 6d 61 72   itself.  So mar
ecd0: 6b 20 69 74 20 72 65 61 64 2d 6f 6e 6c 79 2e 0a  k it read-only..
ece0: 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 69    */.  if( db->i
ecf0: 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20 20 20 20  nit.busy ){.    
ed00: 70 2d 3e 74 6e 75 6d 20 3d 20 64 62 2d 3e 69 6e  p->tnum = db->in
ed10: 69 74 2e 6e 65 77 54 6e 75 6d 3b 0a 20 20 20 20  it.newTnum;.    
ed20: 69 66 28 20 70 2d 3e 74 6e 75 6d 3d 3d 31 20 29  if( p->tnum==1 )
ed30: 20 70 2d 3e 74 61 62 46 6c 61 67 73 20 7c 3d 20   p->tabFlags |= 
ed40: 54 46 5f 52 65 61 64 6f 6e 6c 79 3b 0a 20 20 7d  TF_Readonly;.  }
ed50: 0a 0a 20 20 2f 2a 20 53 70 65 63 69 61 6c 20 70  ..  /* Special p
ed60: 72 6f 63 65 73 73 69 6e 67 20 66 6f 72 20 57 49  rocessing for WI
ed70: 54 48 4f 55 54 20 52 4f 57 49 44 20 54 61 62 6c  THOUT ROWID Tabl
ed80: 65 73 20 2a 2f 0a 20 20 69 66 28 20 74 61 62 4f  es */.  if( tabO
ed90: 70 74 73 20 26 20 54 46 5f 57 69 74 68 6f 75 74  pts & TF_Without
eda0: 52 6f 77 69 64 20 29 7b 0a 20 20 20 20 69 66 28  Rowid ){.    if(
edb0: 20 28 70 2d 3e 74 61 62 46 6c 61 67 73 20 26 20   (p->tabFlags & 
edc0: 54 46 5f 41 75 74 6f 69 6e 63 72 65 6d 65 6e 74  TF_Autoincrement
edd0: 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ) ){.      sqlit
ede0: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
edf0: 65 2c 0a 20 20 20 20 20 20 20 20 20 20 22 41 55  e,.          "AU
ee00: 54 4f 49 4e 43 52 45 4d 45 4e 54 20 6e 6f 74 20  TOINCREMENT not 
ee10: 61 6c 6c 6f 77 65 64 20 6f 6e 20 57 49 54 48 4f  allowed on WITHO
ee20: 55 54 20 52 4f 57 49 44 20 74 61 62 6c 65 73 22  UT ROWID tables"
ee30: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b  );.      return;
ee40: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28  .    }.    if( (
ee50: 70 2d 3e 74 61 62 46 6c 61 67 73 20 26 20 54 46  p->tabFlags & TF
ee60: 5f 48 61 73 50 72 69 6d 61 72 79 4b 65 79 29 3d  _HasPrimaryKey)=
ee70: 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
ee80: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
ee90: 73 65 2c 20 22 50 52 49 4d 41 52 59 20 4b 45 59  se, "PRIMARY KEY
eea0: 20 6d 69 73 73 69 6e 67 20 6f 6e 20 74 61 62 6c   missing on tabl
eeb0: 65 20 25 73 22 2c 20 70 2d 3e 7a 4e 61 6d 65 29  e %s", p->zName)
eec0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
eed0: 20 20 20 70 2d 3e 74 61 62 46 6c 61 67 73 20 7c     p->tabFlags |
eee0: 3d 20 54 46 5f 57 69 74 68 6f 75 74 52 6f 77 69  = TF_WithoutRowi
eef0: 64 20 7c 20 54 46 5f 4e 6f 56 69 73 69 62 6c 65  d | TF_NoVisible
ef00: 52 6f 77 69 64 3b 0a 20 20 20 20 20 20 63 6f 6e  Rowid;.      con
ef10: 76 65 72 74 54 6f 57 69 74 68 6f 75 74 52 6f 77  vertToWithoutRow
ef20: 69 64 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20  idTable(pParse, 
ef30: 70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  p);.    }.  }.. 
ef40: 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63   iDb = sqlite3Sc
ef50: 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20  hemaToIndex(db, 
ef60: 70 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 0a 23 69  p->pSchema);..#i
ef70: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
ef80: 54 5f 43 48 45 43 4b 0a 20 20 2f 2a 20 52 65 73  T_CHECK.  /* Res
ef90: 6f 6c 76 65 20 6e 61 6d 65 73 20 69 6e 20 61 6c  olve names in al
efa0: 6c 20 43 48 45 43 4b 20 63 6f 6e 73 74 72 61 69  l CHECK constrai
efb0: 6e 74 20 65 78 70 72 65 73 73 69 6f 6e 73 2e 0a  nt expressions..
efc0: 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 43    */.  if( p->pC
efd0: 68 65 63 6b 20 29 7b 0a 20 20 20 20 73 71 6c 69  heck ){.    sqli
efe0: 74 65 33 52 65 73 6f 6c 76 65 53 65 6c 66 52 65  te3ResolveSelfRe
eff0: 66 65 72 65 6e 63 65 28 70 50 61 72 73 65 2c 20  ference(pParse, 
f000: 70 2c 20 4e 43 5f 49 73 43 68 65 63 6b 2c 20 30  p, NC_IsCheck, 0
f010: 2c 20 70 2d 3e 70 43 68 65 63 6b 29 3b 0a 20 20  , p->pCheck);.  
f020: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66  }.#endif /* !def
f030: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
f040: 5f 43 48 45 43 4b 29 20 2a 2f 0a 0a 20 20 2f 2a  _CHECK) */..  /*
f050: 20 45 73 74 69 6d 61 74 65 20 74 68 65 20 61 76   Estimate the av
f060: 65 72 61 67 65 20 72 6f 77 20 73 69 7a 65 20 66  erage row size f
f070: 6f 72 20 74 68 65 20 74 61 62 6c 65 20 61 6e 64  or the table and
f080: 20 66 6f 72 20 61 6c 6c 20 69 6d 70 6c 69 65 64   for all implied
f090: 20 69 6e 64 69 63 65 73 20 2a 2f 0a 20 20 65 73   indices */.  es
f0a0: 74 69 6d 61 74 65 54 61 62 6c 65 57 69 64 74 68  timateTableWidth
f0b0: 28 70 29 3b 0a 20 20 66 6f 72 28 70 49 64 78 3d  (p);.  for(pIdx=
f0c0: 70 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b  p->pIndex; pIdx;
f0d0: 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78   pIdx=pIdx->pNex
f0e0: 74 29 7b 0a 20 20 20 20 65 73 74 69 6d 61 74 65  t){.    estimate
f0f0: 49 6e 64 65 78 57 69 64 74 68 28 70 49 64 78 29  IndexWidth(pIdx)
f100: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 6e  ;.  }..  /* If n
f110: 6f 74 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 2c  ot initializing,
f120: 20 74 68 65 6e 20 63 72 65 61 74 65 20 61 20 72   then create a r
f130: 65 63 6f 72 64 20 66 6f 72 20 74 68 65 20 6e 65  ecord for the ne
f140: 77 20 74 61 62 6c 65 0a 20 20 2a 2a 20 69 6e 20  w table.  ** in 
f150: 74 68 65 20 53 51 4c 49 54 45 5f 4d 41 53 54 45  the SQLITE_MASTE
f160: 52 20 74 61 62 6c 65 20 6f 66 20 74 68 65 20 64  R table of the d
f170: 61 74 61 62 61 73 65 2e 0a 20 20 2a 2a 0a 20 20  atabase..  **.  
f180: 2a 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 20  ** If this is a 
f190: 54 45 4d 50 4f 52 41 52 59 20 74 61 62 6c 65 2c  TEMPORARY table,
f1a0: 20 77 72 69 74 65 20 74 68 65 20 65 6e 74 72 79   write the entry
f1b0: 20 69 6e 74 6f 20 74 68 65 20 61 75 78 69 6c 69   into the auxili
f1c0: 61 72 79 0a 20 20 2a 2a 20 66 69 6c 65 20 69 6e  ary.  ** file in
f1d0: 73 74 65 61 64 20 6f 66 20 69 6e 74 6f 20 74 68  stead of into th
f1e0: 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20  e main database 
f1f0: 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  file..  */.  if(
f200: 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20   !db->init.busy 
f210: 29 7b 0a 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20  ){.    int n;.  
f220: 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 20 20 63    Vdbe *v;.    c
f230: 68 61 72 20 2a 7a 54 79 70 65 3b 20 20 20 20 2f  har *zType;    /
f240: 2a 20 22 76 69 65 77 22 20 6f 72 20 22 74 61 62  * "view" or "tab
f250: 6c 65 22 20 2a 2f 0a 20 20 20 20 63 68 61 72 20  le" */.    char 
f260: 2a 7a 54 79 70 65 32 3b 20 20 20 2f 2a 20 22 56  *zType2;   /* "V
f270: 49 45 57 22 20 6f 72 20 22 54 41 42 4c 45 22 20  IEW" or "TABLE" 
f280: 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 53 74  */.    char *zSt
f290: 6d 74 3b 20 20 20 20 2f 2a 20 54 65 78 74 20 6f  mt;    /* Text o
f2a0: 66 20 74 68 65 20 43 52 45 41 54 45 20 54 41 42  f the CREATE TAB
f2b0: 4c 45 20 6f 72 20 43 52 45 41 54 45 20 56 49 45  LE or CREATE VIE
f2c0: 57 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 0a  W statement */..
f2d0: 20 20 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47      v = sqlite3G
f2e0: 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
f2f0: 20 20 20 20 69 66 28 20 4e 45 56 45 52 28 76 3d      if( NEVER(v=
f300: 3d 30 29 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20  =0) ) return;.. 
f310: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
f320: 64 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65  dOp1(v, OP_Close
f330: 2c 20 30 29 3b 0a 0a 20 20 20 20 2f 2a 20 0a 20  , 0);..    /* . 
f340: 20 20 20 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65     ** Initialize
f350: 20 7a 54 79 70 65 20 66 6f 72 20 74 68 65 20 6e   zType for the n
f360: 65 77 20 76 69 65 77 20 6f 72 20 74 61 62 6c 65  ew view or table
f370: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
f380: 20 70 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20 29   p->pSelect==0 )
f390: 7b 0a 20 20 20 20 20 20 2f 2a 20 41 20 72 65 67  {.      /* A reg
f3a0: 75 6c 61 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20  ular table */.  
f3b0: 20 20 20 20 7a 54 79 70 65 20 3d 20 22 74 61 62      zType = "tab
f3c0: 6c 65 22 3b 0a 20 20 20 20 20 20 7a 54 79 70 65  le";.      zType
f3d0: 32 20 3d 20 22 54 41 42 4c 45 22 3b 0a 23 69 66  2 = "TABLE";.#if
f3e0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
f3f0: 5f 56 49 45 57 0a 20 20 20 20 7d 65 6c 73 65 7b  _VIEW.    }else{
f400: 0a 20 20 20 20 20 20 2f 2a 20 41 20 76 69 65 77  .      /* A view
f410: 20 2a 2f 0a 20 20 20 20 20 20 7a 54 79 70 65 20   */.      zType 
f420: 3d 20 22 76 69 65 77 22 3b 0a 20 20 20 20 20 20  = "view";.      
f430: 7a 54 79 70 65 32 20 3d 20 22 56 49 45 57 22 3b  zType2 = "VIEW";
f440: 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 0a 20  .#endif.    }.. 
f450: 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73     /* If this is
f460: 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20   a CREATE TABLE 
f470: 78 78 20 41 53 20 53 45 4c 45 43 54 20 2e 2e 2e  xx AS SELECT ...
f480: 2c 20 65 78 65 63 75 74 65 20 74 68 65 20 53 45  , execute the SE
f490: 4c 45 43 54 0a 20 20 20 20 2a 2a 20 73 74 61 74  LECT.    ** stat
f4a0: 65 6d 65 6e 74 20 74 6f 20 70 6f 70 75 6c 61 74  ement to populat
f4b0: 65 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 2e  e the new table.
f4c0: 20 54 68 65 20 72 6f 6f 74 2d 70 61 67 65 20 6e   The root-page n
f4d0: 75 6d 62 65 72 20 66 6f 72 20 74 68 65 0a 20 20  umber for the.  
f4e0: 20 20 2a 2a 20 6e 65 77 20 74 61 62 6c 65 20 69    ** new table i
f4f0: 73 20 69 6e 20 72 65 67 69 73 74 65 72 20 70 50  s in register pP
f500: 61 72 73 65 2d 3e 72 65 67 52 6f 6f 74 2e 0a 20  arse->regRoot.. 
f510: 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 4f 6e 63     **.    ** Onc
f520: 65 20 74 68 65 20 53 45 4c 45 43 54 20 68 61 73  e the SELECT has
f530: 20 62 65 65 6e 20 63 6f 64 65 64 20 62 79 20 73   been coded by s
f540: 71 6c 69 74 65 33 53 65 6c 65 63 74 28 29 2c 20  qlite3Select(), 
f550: 69 74 20 69 73 20 69 6e 20 61 0a 20 20 20 20 2a  it is in a.    *
f560: 2a 20 73 75 69 74 61 62 6c 65 20 73 74 61 74 65  * suitable state
f570: 20 74 6f 20 71 75 65 72 79 20 66 6f 72 20 74 68   to query for th
f580: 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 61  e column names a
f590: 6e 64 20 74 79 70 65 73 20 74 6f 20 62 65 20 75  nd types to be u
f5a0: 73 65 64 0a 20 20 20 20 2a 2a 20 62 79 20 74 68  sed.    ** by th
f5b0: 65 20 6e 65 77 20 74 61 62 6c 65 2e 0a 20 20 20  e new table..   
f5c0: 20 2a 2a 0a 20 20 20 20 2a 2a 20 41 20 73 68 61   **.    ** A sha
f5d0: 72 65 64 2d 63 61 63 68 65 20 77 72 69 74 65 2d  red-cache write-
f5e0: 6c 6f 63 6b 20 69 73 20 6e 6f 74 20 72 65 71 75  lock is not requ
f5f0: 69 72 65 64 20 74 6f 20 77 72 69 74 65 20 74 6f  ired to write to
f600: 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 2c 0a   the new table,.
f610: 20 20 20 20 2a 2a 20 61 73 20 61 20 73 63 68 65      ** as a sche
f620: 6d 61 2d 6c 6f 63 6b 20 6d 75 73 74 20 68 61 76  ma-lock must hav
f630: 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 6f  e already been o
f640: 62 74 61 69 6e 65 64 20 74 6f 20 63 72 65 61 74  btained to creat
f650: 65 20 69 74 2e 20 53 69 6e 63 65 0a 20 20 20 20  e it. Since.    
f660: 2a 2a 20 61 20 73 63 68 65 6d 61 2d 6c 6f 63 6b  ** a schema-lock
f670: 20 65 78 63 6c 75 64 65 73 20 61 6c 6c 20 6f 74   excludes all ot
f680: 68 65 72 20 64 61 74 61 62 61 73 65 20 75 73 65  her database use
f690: 72 73 2c 20 74 68 65 20 77 72 69 74 65 2d 6c 6f  rs, the write-lo
f6a0: 63 6b 20 77 6f 75 6c 64 0a 20 20 20 20 2a 2a 20  ck would.    ** 
f6b0: 62 65 20 72 65 64 75 6e 64 61 6e 74 2e 0a 20 20  be redundant..  
f6c0: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 53 65    */.    if( pSe
f6d0: 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 53 65  lect ){.      Se
f6e0: 6c 65 63 74 44 65 73 74 20 64 65 73 74 3b 20 20  lectDest dest;  
f6f0: 20 20 2f 2a 20 57 68 65 72 65 20 74 68 65 20 53    /* Where the S
f700: 45 4c 45 43 54 20 73 68 6f 75 6c 64 20 73 74 6f  ELECT should sto
f710: 72 65 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20  re results */.  
f720: 20 20 20 20 69 6e 74 20 72 65 67 59 69 65 6c 64      int regYield
f730: 3b 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73  ;       /* Regis
f740: 74 65 72 20 68 6f 6c 64 69 6e 67 20 63 6f 2d 72  ter holding co-r
f750: 6f 75 74 69 6e 65 20 65 6e 74 72 79 2d 70 6f 69  outine entry-poi
f760: 6e 74 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  nt */.      int 
f770: 61 64 64 72 54 6f 70 3b 20 20 20 20 20 20 20 20  addrTop;        
f780: 2f 2a 20 54 6f 70 20 6f 66 20 74 68 65 20 63 6f  /* Top of the co
f790: 2d 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 20 20  -routine */.    
f7a0: 20 20 69 6e 74 20 72 65 67 52 65 63 3b 20 20 20    int regRec;   
f7b0: 20 20 20 20 20 20 2f 2a 20 41 20 72 65 63 6f 72        /* A recor
f7c0: 64 20 74 6f 20 62 65 20 69 6e 73 65 72 74 20 69  d to be insert i
f7d0: 6e 74 6f 20 74 68 65 20 6e 65 77 20 74 61 62 6c  nto the new tabl
f7e0: 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 72  e */.      int r
f7f0: 65 67 52 6f 77 69 64 3b 20 20 20 20 20 20 20 2f  egRowid;       /
f800: 2a 20 52 6f 77 69 64 20 6f 66 20 74 68 65 20 6e  * Rowid of the n
f810: 65 78 74 20 72 6f 77 20 74 6f 20 69 6e 73 65 72  ext row to inser
f820: 74 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61  t */.      int a
f830: 64 64 72 49 6e 73 4c 6f 6f 70 3b 20 20 20 20 2f  ddrInsLoop;    /
f840: 2a 20 54 6f 70 20 6f 66 20 74 68 65 20 6c 6f 6f  * Top of the loo
f850: 70 20 66 6f 72 20 69 6e 73 65 72 74 69 6e 67 20  p for inserting 
f860: 72 6f 77 73 20 2a 2f 0a 20 20 20 20 20 20 54 61  rows */.      Ta
f870: 62 6c 65 20 2a 70 53 65 6c 54 61 62 3b 20 20 20  ble *pSelTab;   
f880: 20 20 2f 2a 20 41 20 74 61 62 6c 65 20 74 68 61    /* A table tha
f890: 74 20 64 65 73 63 72 69 62 65 73 20 74 68 65 20  t describes the 
f8a0: 53 45 4c 45 43 54 20 72 65 73 75 6c 74 73 20 2a  SELECT results *
f8b0: 2f 0a 0a 20 20 20 20 20 20 72 65 67 59 69 65 6c  /..      regYiel
f8c0: 64 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  d = ++pParse->nM
f8d0: 65 6d 3b 0a 20 20 20 20 20 20 72 65 67 52 65 63  em;.      regRec
f8e0: 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
f8f0: 6d 3b 0a 20 20 20 20 20 20 72 65 67 52 6f 77 69  m;.      regRowi
f900: 64 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  d = ++pParse->nM
f910: 65 6d 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  em;.      assert
f920: 28 70 50 61 72 73 65 2d 3e 6e 54 61 62 3d 3d 31  (pParse->nTab==1
f930: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
f940: 4d 61 79 41 62 6f 72 74 28 70 50 61 72 73 65 29  MayAbort(pParse)
f950: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
f960: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
f970: 4f 70 65 6e 57 72 69 74 65 2c 20 31 2c 20 70 50  OpenWrite, 1, pP
f980: 61 72 73 65 2d 3e 72 65 67 52 6f 6f 74 2c 20 69  arse->regRoot, i
f990: 44 62 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  Db);.      sqlit
f9a0: 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76  e3VdbeChangeP5(v
f9b0: 2c 20 4f 50 46 4c 41 47 5f 50 32 49 53 52 45 47  , OPFLAG_P2ISREG
f9c0: 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d  );.      pParse-
f9d0: 3e 6e 54 61 62 20 3d 20 32 3b 0a 20 20 20 20 20  >nTab = 2;.     
f9e0: 20 61 64 64 72 54 6f 70 20 3d 20 73 71 6c 69 74   addrTop = sqlit
f9f0: 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
fa00: 72 28 76 29 20 2b 20 31 3b 0a 20 20 20 20 20 20  r(v) + 1;.      
fa10: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
fa20: 33 28 76 2c 20 4f 50 5f 49 6e 69 74 43 6f 72 6f  3(v, OP_InitCoro
fa30: 75 74 69 6e 65 2c 20 72 65 67 59 69 65 6c 64 2c  utine, regYield,
fa40: 20 30 2c 20 61 64 64 72 54 6f 70 29 3b 0a 20 20   0, addrTop);.  
fa50: 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63      sqlite3Selec
fa60: 74 44 65 73 74 49 6e 69 74 28 26 64 65 73 74 2c  tDestInit(&dest,
fa70: 20 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 2c 20   SRT_Coroutine, 
fa80: 72 65 67 59 69 65 6c 64 29 3b 0a 20 20 20 20 20  regYield);.     
fa90: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70   sqlite3Select(p
faa0: 50 61 72 73 65 2c 20 70 53 65 6c 65 63 74 2c 20  Parse, pSelect, 
fab0: 26 64 65 73 74 29 3b 0a 20 20 20 20 20 20 73 71  &dest);.      sq
fac0: 6c 69 74 65 33 56 64 62 65 45 6e 64 43 6f 72 6f  lite3VdbeEndCoro
fad0: 75 74 69 6e 65 28 76 2c 20 72 65 67 59 69 65 6c  utine(v, regYiel
fae0: 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  d);.      sqlite
faf0: 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
fb00: 20 61 64 64 72 54 6f 70 20 2d 20 31 29 3b 0a 20   addrTop - 1);. 
fb10: 20 20 20 20 20 69 66 28 20 70 50 61 72 73 65 2d       if( pParse-
fb20: 3e 6e 45 72 72 20 29 20 72 65 74 75 72 6e 3b 0a  >nErr ) return;.
fb30: 20 20 20 20 20 20 70 53 65 6c 54 61 62 20 3d 20        pSelTab = 
fb40: 73 71 6c 69 74 65 33 52 65 73 75 6c 74 53 65 74  sqlite3ResultSet
fb50: 4f 66 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  OfSelect(pParse,
fb60: 20 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 20   pSelect);.     
fb70: 20 69 66 28 20 70 53 65 6c 54 61 62 3d 3d 30 20   if( pSelTab==0 
fb80: 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20  ) return;.      
fb90: 61 73 73 65 72 74 28 20 70 2d 3e 61 43 6f 6c 3d  assert( p->aCol=
fba0: 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 2d 3e 6e  =0 );.      p->n
fbb0: 43 6f 6c 20 3d 20 70 53 65 6c 54 61 62 2d 3e 6e  Col = pSelTab->n
fbc0: 43 6f 6c 3b 0a 20 20 20 20 20 20 70 2d 3e 61 43  Col;.      p->aC
fbd0: 6f 6c 20 3d 20 70 53 65 6c 54 61 62 2d 3e 61 43  ol = pSelTab->aC
fbe0: 6f 6c 3b 0a 20 20 20 20 20 20 70 53 65 6c 54 61  ol;.      pSelTa
fbf0: 62 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20  b->nCol = 0;.   
fc00: 20 20 20 70 53 65 6c 54 61 62 2d 3e 61 43 6f 6c     pSelTab->aCol
fc10: 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 71 6c 69   = 0;.      sqli
fc20: 74 65 33 44 65 6c 65 74 65 54 61 62 6c 65 28 64  te3DeleteTable(d
fc30: 62 2c 20 70 53 65 6c 54 61 62 29 3b 0a 20 20 20  b, pSelTab);.   
fc40: 20 20 20 61 64 64 72 49 6e 73 4c 6f 6f 70 20 3d     addrInsLoop =
fc50: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
fc60: 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20  p1(v, OP_Yield, 
fc70: 64 65 73 74 2e 69 53 44 50 61 72 6d 29 3b 0a 20  dest.iSDParm);. 
fc80: 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
fc90: 65 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  e(v);.      sqli
fca0: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
fcb0: 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20   OP_MakeRecord, 
fcc0: 64 65 73 74 2e 69 53 64 73 74 2c 20 64 65 73 74  dest.iSdst, dest
fcd0: 2e 6e 53 64 73 74 2c 20 72 65 67 52 65 63 29 3b  .nSdst, regRec);
fce0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 54 61  .      sqlite3Ta
fcf0: 62 6c 65 41 66 66 69 6e 69 74 79 28 76 2c 20 70  bleAffinity(v, p
fd00: 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
fd10: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
fd20: 20 4f 50 5f 4e 65 77 52 6f 77 69 64 2c 20 31 2c   OP_NewRowid, 1,
fd30: 20 72 65 67 52 6f 77 69 64 29 3b 0a 20 20 20 20   regRowid);.    
fd40: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
fd50: 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74  Op3(v, OP_Insert
fd60: 2c 20 31 2c 20 72 65 67 52 65 63 2c 20 72 65 67  , 1, regRec, reg
fd70: 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 73 71  Rowid);.      sq
fd80: 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c  lite3VdbeGoto(v,
fd90: 20 61 64 64 72 49 6e 73 4c 6f 6f 70 29 3b 0a 20   addrInsLoop);. 
fda0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
fdb0: 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
fdc0: 49 6e 73 4c 6f 6f 70 29 3b 0a 20 20 20 20 20 20  InsLoop);.      
fdd0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
fde0: 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 31  1(v, OP_Close, 1
fdf0: 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  );.    }..    /*
fe00: 20 43 6f 6d 70 75 74 65 20 74 68 65 20 63 6f 6d   Compute the com
fe10: 70 6c 65 74 65 20 74 65 78 74 20 6f 66 20 74 68  plete text of th
fe20: 65 20 43 52 45 41 54 45 20 73 74 61 74 65 6d 65  e CREATE stateme
fe30: 6e 74 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 53  nt */.    if( pS
fe40: 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 7a  elect ){.      z
fe50: 53 74 6d 74 20 3d 20 63 72 65 61 74 65 54 61 62  Stmt = createTab
fe60: 6c 65 53 74 6d 74 28 64 62 2c 20 70 29 3b 0a 20  leStmt(db, p);. 
fe70: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
fe80: 54 6f 6b 65 6e 20 2a 70 45 6e 64 32 20 3d 20 74  Token *pEnd2 = t
fe90: 61 62 4f 70 74 73 20 3f 20 26 70 50 61 72 73 65  abOpts ? &pParse
fea0: 2d 3e 73 4c 61 73 74 54 6f 6b 65 6e 20 3a 20 70  ->sLastToken : p
feb0: 45 6e 64 3b 0a 20 20 20 20 20 20 6e 20 3d 20 28  End;.      n = (
fec0: 69 6e 74 29 28 70 45 6e 64 32 2d 3e 7a 20 2d 20  int)(pEnd2->z - 
fed0: 70 50 61 72 73 65 2d 3e 73 4e 61 6d 65 54 6f 6b  pParse->sNameTok
fee0: 65 6e 2e 7a 29 3b 0a 20 20 20 20 20 20 69 66 28  en.z);.      if(
fef0: 20 70 45 6e 64 32 2d 3e 7a 5b 30 5d 21 3d 27 3b   pEnd2->z[0]!=';
ff00: 27 20 29 20 6e 20 2b 3d 20 70 45 6e 64 32 2d 3e  ' ) n += pEnd2->
ff10: 6e 3b 0a 20 20 20 20 20 20 7a 53 74 6d 74 20 3d  n;.      zStmt =
ff20: 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
ff30: 64 62 2c 20 0a 20 20 20 20 20 20 20 20 20 20 22  db, .          "
ff40: 43 52 45 41 54 45 20 25 73 20 25 2e 2a 73 22 2c  CREATE %s %.*s",
ff50: 20 7a 54 79 70 65 32 2c 20 6e 2c 20 70 50 61 72   zType2, n, pPar
ff60: 73 65 2d 3e 73 4e 61 6d 65 54 6f 6b 65 6e 2e 7a  se->sNameToken.z
ff70: 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a  .      );.    }.
ff80: 0a 20 20 20 20 2f 2a 20 41 20 73 6c 6f 74 20 66  .    /* A slot f
ff90: 6f 72 20 74 68 65 20 72 65 63 6f 72 64 20 68 61  or the record ha
ffa0: 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 61  s already been a
ffb0: 6c 6c 6f 63 61 74 65 64 20 69 6e 20 74 68 65 20  llocated in the 
ffc0: 0a 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 4d  .    ** SQLITE_M
ffd0: 41 53 54 45 52 20 74 61 62 6c 65 2e 20 20 57 65  ASTER table.  We
ffe0: 20 6a 75 73 74 20 6e 65 65 64 20 74 6f 20 75 70   just need to up
fff0: 64 61 74 65 20 74 68 61 74 20 73 6c 6f 74 20 77  date that slot w
10000 69 74 68 20 61 6c 6c 0a 20 20 20 20 2a 2a 20 74  ith all.    ** t
10010 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 77  he information w
10020 65 27 76 65 20 63 6f 6c 6c 65 63 74 65 64 2e 0a  e've collected..
10030 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74      */.    sqlit
10040 65 33 4e 65 73 74 65 64 50 61 72 73 65 28 70 50  e3NestedParse(pP
10050 61 72 73 65 2c 0a 20 20 20 20 20 20 22 55 50 44  arse,.      "UPD
10060 41 54 45 20 25 51 2e 25 73 20 22 0a 20 20 20 20  ATE %Q.%s ".    
10070 20 20 20 20 20 22 53 45 54 20 74 79 70 65 3d 27       "SET type='
10080 25 73 27 2c 20 6e 61 6d 65 3d 25 51 2c 20 74 62  %s', name=%Q, tb
10090 6c 5f 6e 61 6d 65 3d 25 51 2c 20 72 6f 6f 74 70  l_name=%Q, rootp
100a0 61 67 65 3d 23 25 64 2c 20 73 71 6c 3d 25 51 20  age=#%d, sql=%Q 
100b0 22 0a 20 20 20 20 20 20 20 22 57 48 45 52 45 20  ".       "WHERE 
100c0 72 6f 77 69 64 3d 23 25 64 22 2c 0a 20 20 20 20  rowid=#%d",.    
100d0 20 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a    db->aDb[iDb].z
100e0 4e 61 6d 65 2c 20 53 43 48 45 4d 41 5f 54 41 42  Name, SCHEMA_TAB
100f0 4c 45 28 69 44 62 29 2c 0a 20 20 20 20 20 20 7a  LE(iDb),.      z
10100 54 79 70 65 2c 0a 20 20 20 20 20 20 70 2d 3e 7a  Type,.      p->z
10110 4e 61 6d 65 2c 0a 20 20 20 20 20 20 70 2d 3e 7a  Name,.      p->z
10120 4e 61 6d 65 2c 0a 20 20 20 20 20 20 70 50 61 72  Name,.      pPar
10130 73 65 2d 3e 72 65 67 52 6f 6f 74 2c 0a 20 20 20  se->regRoot,.   
10140 20 20 20 7a 53 74 6d 74 2c 0a 20 20 20 20 20 20     zStmt,.      
10150 70 50 61 72 73 65 2d 3e 72 65 67 52 6f 77 69 64  pParse->regRowid
10160 0a 20 20 20 20 29 3b 0a 20 20 20 20 73 71 6c 69  .    );.    sqli
10170 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 53  te3DbFree(db, zS
10180 74 6d 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  tmt);.    sqlite
10190 33 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28 70 50  3ChangeCookie(pP
101a0 61 72 73 65 2c 20 69 44 62 29 3b 0a 0a 23 69 66  arse, iDb);..#if
101b0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
101c0 5f 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 0a 20  _AUTOINCREMENT. 
101d0 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73     /* Check to s
101e0 65 65 20 69 66 20 77 65 20 6e 65 65 64 20 74 6f  ee if we need to
101f0 20 63 72 65 61 74 65 20 61 6e 20 73 71 6c 69 74   create an sqlit
10200 65 5f 73 65 71 75 65 6e 63 65 20 74 61 62 6c 65  e_sequence table
10210 20 66 6f 72 0a 20 20 20 20 2a 2a 20 6b 65 65 70   for.    ** keep
10220 69 6e 67 20 74 72 61 63 6b 20 6f 66 20 61 75 74  ing track of aut
10230 6f 69 6e 63 72 65 6d 65 6e 74 20 6b 65 79 73 2e  oincrement keys.
10240 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
10250 70 2d 3e 74 61 62 46 6c 61 67 73 20 26 20 54 46  p->tabFlags & TF
10260 5f 41 75 74 6f 69 6e 63 72 65 6d 65 6e 74 20 29  _Autoincrement )
10270 7b 0a 20 20 20 20 20 20 44 62 20 2a 70 44 62 20  {.      Db *pDb 
10280 3d 20 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d 3b  = &db->aDb[iDb];
10290 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73  .      assert( s
102a0 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65  qlite3SchemaMute
102b0 78 48 65 6c 64 28 64 62 2c 20 69 44 62 2c 20 30  xHeld(db, iDb, 0
102c0 29 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  ) );.      if( p
102d0 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 70 53 65  Db->pSchema->pSe
102e0 71 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 20  qTab==0 ){.     
102f0 20 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64     sqlite3Nested
10300 50 61 72 73 65 28 70 50 61 72 73 65 2c 0a 20 20  Parse(pParse,.  
10310 20 20 20 20 20 20 20 20 22 43 52 45 41 54 45 20          "CREATE 
10320 54 41 42 4c 45 20 25 51 2e 73 71 6c 69 74 65 5f  TABLE %Q.sqlite_
10330 73 65 71 75 65 6e 63 65 28 6e 61 6d 65 2c 73 65  sequence(name,se
10340 71 29 22 2c 0a 20 20 20 20 20 20 20 20 20 20 70  q)",.          p
10350 44 62 2d 3e 7a 4e 61 6d 65 0a 20 20 20 20 20 20  Db->zName.      
10360 20 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20    );.      }.   
10370 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f   }.#endif..    /
10380 2a 20 52 65 70 61 72 73 65 20 65 76 65 72 79 74  * Reparse everyt
10390 68 69 6e 67 20 74 6f 20 75 70 64 61 74 65 20 6f  hing to update o
103a0 75 72 20 69 6e 74 65 72 6e 61 6c 20 64 61 74 61  ur internal data
103b0 20 73 74 72 75 63 74 75 72 65 73 20 2a 2f 0a 20   structures */. 
103c0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
103d0 64 50 61 72 73 65 53 63 68 65 6d 61 4f 70 28 76  dParseSchemaOp(v
103e0 2c 20 69 44 62 2c 0a 20 20 20 20 20 20 20 20 20  , iDb,.         
103f0 20 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66    sqlite3MPrintf
10400 28 64 62 2c 20 22 74 62 6c 5f 6e 61 6d 65 3d 27  (db, "tbl_name='
10410 25 71 27 20 41 4e 44 20 74 79 70 65 21 3d 27 74  %q' AND type!='t
10420 72 69 67 67 65 72 27 22 2c 20 70 2d 3e 7a 4e 61  rigger'", p->zNa
10430 6d 65 29 29 3b 0a 20 20 7d 0a 0a 0a 20 20 2f 2a  me));.  }...  /*
10440 20 41 64 64 20 74 68 65 20 74 61 62 6c 65 20 74   Add the table t
10450 6f 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20  o the in-memory 
10460 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f  representation o
10470 66 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a  f the database..
10480 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 69    */.  if( db->i
10490 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20 20 20 20  nit.busy ){.    
104a0 54 61 62 6c 65 20 2a 70 4f 6c 64 3b 0a 20 20 20  Table *pOld;.   
104b0 20 53 63 68 65 6d 61 20 2a 70 53 63 68 65 6d 61   Schema *pSchema
104c0 20 3d 20 70 2d 3e 70 53 63 68 65 6d 61 3b 0a 20   = p->pSchema;. 
104d0 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
104e0 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c  e3SchemaMutexHel
104f0 64 28 64 62 2c 20 69 44 62 2c 20 30 29 20 29 3b  d(db, iDb, 0) );
10500 0a 20 20 20 20 70 4f 6c 64 20 3d 20 73 71 6c 69  .    pOld = sqli
10510 74 65 33 48 61 73 68 49 6e 73 65 72 74 28 26 70  te3HashInsert(&p
10520 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68 2c  Schema->tblHash,
10530 20 70 2d 3e 7a 4e 61 6d 65 2c 20 70 29 3b 0a 20   p->zName, p);. 
10540 20 20 20 69 66 28 20 70 4f 6c 64 20 29 7b 0a 20     if( pOld ){. 
10550 20 20 20 20 20 61 73 73 65 72 74 28 20 70 3d 3d       assert( p==
10560 70 4f 6c 64 20 29 3b 20 20 2f 2a 20 4d 61 6c 6c  pOld );  /* Mall
10570 6f 63 20 6d 75 73 74 20 68 61 76 65 20 66 61 69  oc must have fai
10580 6c 65 64 20 69 6e 73 69 64 65 20 48 61 73 68 49  led inside HashI
10590 6e 73 65 72 74 28 29 20 2a 2f 0a 20 20 20 20 20  nsert() */.     
105a0 20 73 71 6c 69 74 65 33 4f 6f 6d 46 61 75 6c 74   sqlite3OomFault
105b0 28 64 62 29 3b 0a 20 20 20 20 20 20 72 65 74 75  (db);.      retu
105c0 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50  rn;.    }.    pP
105d0 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20  arse->pNewTable 
105e0 3d 20 30 3b 0a 20 20 20 20 64 62 2d 3e 66 6c 61  = 0;.    db->fla
105f0 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 49 6e 74  gs |= SQLITE_Int
10600 65 72 6e 43 68 61 6e 67 65 73 3b 0a 0a 23 69 66  ernChanges;..#if
10610 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
10620 5f 41 4c 54 45 52 54 41 42 4c 45 0a 20 20 20 20  _ALTERTABLE.    
10630 69 66 28 20 21 70 2d 3e 70 53 65 6c 65 63 74 20  if( !p->pSelect 
10640 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63  ){.      const c
10650 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 28 63 6f  har *zName = (co
10660 6e 73 74 20 63 68 61 72 20 2a 29 70 50 61 72 73  nst char *)pPars
10670 65 2d 3e 73 4e 61 6d 65 54 6f 6b 65 6e 2e 7a 3b  e->sNameToken.z;
10680 0a 20 20 20 20 20 20 69 6e 74 20 6e 4e 61 6d 65  .      int nName
10690 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
106a0 21 70 53 65 6c 65 63 74 20 26 26 20 70 43 6f 6e  !pSelect && pCon
106b0 73 20 26 26 20 70 45 6e 64 20 29 3b 0a 20 20 20  s && pEnd );.   
106c0 20 20 20 69 66 28 20 70 43 6f 6e 73 2d 3e 7a 3d     if( pCons->z=
106d0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43  =0 ){.        pC
106e0 6f 6e 73 20 3d 20 70 45 6e 64 3b 0a 20 20 20 20  ons = pEnd;.    
106f0 20 20 7d 0a 20 20 20 20 20 20 6e 4e 61 6d 65 20    }.      nName 
10700 3d 20 28 69 6e 74 29 28 28 63 6f 6e 73 74 20 63  = (int)((const c
10710 68 61 72 20 2a 29 70 43 6f 6e 73 2d 3e 7a 20 2d  har *)pCons->z -
10720 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 70   zName);.      p
10730 2d 3e 61 64 64 43 6f 6c 4f 66 66 73 65 74 20 3d  ->addColOffset =
10740 20 31 33 20 2b 20 73 71 6c 69 74 65 33 55 74 66   13 + sqlite3Utf
10750 38 43 68 61 72 4c 65 6e 28 7a 4e 61 6d 65 2c 20  8CharLen(zName, 
10760 6e 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 23 65  nName);.    }.#e
10770 6e 64 69 66 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e  ndif.  }.}..#ifn
10780 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
10790 56 49 45 57 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70  VIEW./*.** The p
107a0 61 72 73 65 72 20 63 61 6c 6c 73 20 74 68 69 73  arser calls this
107b0 20 72 6f 75 74 69 6e 65 20 69 6e 20 6f 72 64 65   routine in orde
107c0 72 20 74 6f 20 63 72 65 61 74 65 20 61 20 6e 65  r to create a ne
107d0 77 20 56 49 45 57 0a 2a 2f 0a 76 6f 69 64 20 73  w VIEW.*/.void s
107e0 71 6c 69 74 65 33 43 72 65 61 74 65 56 69 65 77  qlite3CreateView
107f0 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
10800 65 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61  e,     /* The pa
10810 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
10820 0a 20 20 54 6f 6b 65 6e 20 2a 70 42 65 67 69 6e  .  Token *pBegin
10830 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 43 52 45  ,     /* The CRE
10840 41 54 45 20 74 6f 6b 65 6e 20 74 68 61 74 20 62  ATE token that b
10850 65 67 69 6e 73 20 74 68 65 20 73 74 61 74 65 6d  egins the statem
10860 65 6e 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  ent */.  Token *
10870 70 4e 61 6d 65 31 2c 20 20 20 20 20 2f 2a 20 54  pName1,     /* T
10880 68 65 20 74 6f 6b 65 6e 20 74 68 61 74 20 68 6f  he token that ho
10890 6c 64 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  lds the name of 
108a0 74 68 65 20 76 69 65 77 20 2a 2f 0a 20 20 54 6f  the view */.  To
108b0 6b 65 6e 20 2a 70 4e 61 6d 65 32 2c 20 20 20 20  ken *pName2,    
108c0 20 2f 2a 20 54 68 65 20 74 6f 6b 65 6e 20 74 68   /* The token th
108d0 61 74 20 68 6f 6c 64 73 20 74 68 65 20 6e 61 6d  at holds the nam
108e0 65 20 6f 66 20 74 68 65 20 76 69 65 77 20 2a 2f  e of the view */
108f0 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 43 4e  .  ExprList *pCN
10900 61 6d 65 73 2c 20 2f 2a 20 4f 70 74 69 6f 6e 61  ames, /* Optiona
10910 6c 20 6c 69 73 74 20 6f 66 20 76 69 65 77 20 63  l list of view c
10920 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a 20  olumn names */. 
10930 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74   Select *pSelect
10940 2c 20 20 20 2f 2a 20 41 20 53 45 4c 45 43 54 20  ,   /* A SELECT 
10950 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20 77  statement that w
10960 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65 20 6e  ill become the n
10970 65 77 20 76 69 65 77 20 2a 2f 0a 20 20 69 6e 74  ew view */.  int
10980 20 69 73 54 65 6d 70 2c 20 20 20 20 20 20 20 20   isTemp,        
10990 2f 2a 20 54 52 55 45 20 66 6f 72 20 61 20 54 45  /* TRUE for a TE
109a0 4d 50 4f 52 41 52 59 20 76 69 65 77 20 2a 2f 0a  MPORARY view */.
109b0 20 20 69 6e 74 20 6e 6f 45 72 72 20 20 20 20 20    int noErr     
109c0 20 20 20 20 20 2f 2a 20 53 75 70 70 72 65 73 73       /* Suppress
109d0 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73 20   error messages 
109e0 69 66 20 56 49 45 57 20 61 6c 72 65 61 64 79 20  if VIEW already 
109f0 65 78 69 73 74 73 20 2a 2f 0a 29 7b 0a 20 20 54  exists */.){.  T
10a00 61 62 6c 65 20 2a 70 3b 0a 20 20 69 6e 74 20 6e  able *p;.  int n
10a10 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
10a20 7a 3b 0a 20 20 54 6f 6b 65 6e 20 73 45 6e 64 3b  z;.  Token sEnd;
10a30 0a 20 20 44 62 46 69 78 65 72 20 73 46 69 78 3b  .  DbFixer sFix;
10a40 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 20  .  Token *pName 
10a50 3d 20 30 3b 0a 20 20 69 6e 74 20 69 44 62 3b 0a  = 0;.  int iDb;.
10a60 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
10a70 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 69  pParse->db;..  i
10a80 66 28 20 70 50 61 72 73 65 2d 3e 6e 56 61 72 3e  f( pParse->nVar>
10a90 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
10aa0 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
10ab0 20 22 70 61 72 61 6d 65 74 65 72 73 20 61 72 65   "parameters are
10ac0 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 20 69 6e 20   not allowed in 
10ad0 76 69 65 77 73 22 29 3b 0a 20 20 20 20 67 6f 74  views");.    got
10ae0 6f 20 63 72 65 61 74 65 5f 76 69 65 77 5f 66 61  o create_view_fa
10af0 69 6c 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  il;.  }.  sqlite
10b00 33 53 74 61 72 74 54 61 62 6c 65 28 70 50 61 72  3StartTable(pPar
10b10 73 65 2c 20 70 4e 61 6d 65 31 2c 20 70 4e 61 6d  se, pName1, pNam
10b20 65 32 2c 20 69 73 54 65 6d 70 2c 20 31 2c 20 30  e2, isTemp, 1, 0
10b30 2c 20 6e 6f 45 72 72 29 3b 0a 20 20 70 20 3d 20  , noErr);.  p = 
10b40 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
10b50 65 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c  e;.  if( p==0 ||
10b60 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 20   pParse->nErr ) 
10b70 67 6f 74 6f 20 63 72 65 61 74 65 5f 76 69 65 77  goto create_view
10b80 5f 66 61 69 6c 3b 0a 20 20 73 71 6c 69 74 65 33  _fail;.  sqlite3
10b90 54 77 6f 50 61 72 74 4e 61 6d 65 28 70 50 61 72  TwoPartName(pPar
10ba0 73 65 2c 20 70 4e 61 6d 65 31 2c 20 70 4e 61 6d  se, pName1, pNam
10bb0 65 32 2c 20 26 70 4e 61 6d 65 29 3b 0a 20 20 69  e2, &pName);.  i
10bc0 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65  Db = sqlite3Sche
10bd0 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 2d  maToIndex(db, p-
10be0 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 73 71 6c  >pSchema);.  sql
10bf0 69 74 65 33 46 69 78 49 6e 69 74 28 26 73 46 69  ite3FixInit(&sFi
10c00 78 2c 20 70 50 61 72 73 65 2c 20 69 44 62 2c 20  x, pParse, iDb, 
10c10 22 76 69 65 77 22 2c 20 70 4e 61 6d 65 29 3b 0a  "view", pName);.
10c20 20 20 69 66 28 20 73 71 6c 69 74 65 33 46 69 78    if( sqlite3Fix
10c30 53 65 6c 65 63 74 28 26 73 46 69 78 2c 20 70 53  Select(&sFix, pS
10c40 65 6c 65 63 74 29 20 29 20 67 6f 74 6f 20 63 72  elect) ) goto cr
10c50 65 61 74 65 5f 76 69 65 77 5f 66 61 69 6c 3b 0a  eate_view_fail;.
10c60 0a 20 20 2f 2a 20 4d 61 6b 65 20 61 20 63 6f 70  .  /* Make a cop
10c70 79 20 6f 66 20 74 68 65 20 65 6e 74 69 72 65 20  y of the entire 
10c80 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
10c90 20 74 68 61 74 20 64 65 66 69 6e 65 73 20 74 68   that defines th
10ca0 65 20 76 69 65 77 2e 0a 20 20 2a 2a 20 54 68 69  e view..  ** Thi
10cb0 73 20 77 69 6c 6c 20 66 6f 72 63 65 20 61 6c 6c  s will force all
10cc0 20 74 68 65 20 45 78 70 72 2e 74 6f 6b 65 6e 2e   the Expr.token.
10cd0 7a 20 76 61 6c 75 65 73 20 74 6f 20 62 65 20 64  z values to be d
10ce0 79 6e 61 6d 69 63 61 6c 6c 79 0a 20 20 2a 2a 20  ynamically.  ** 
10cf0 61 6c 6c 6f 63 61 74 65 64 20 72 61 74 68 65 72  allocated rather
10d00 20 74 68 61 6e 20 70 6f 69 6e 74 20 74 6f 20 74   than point to t
10d10 68 65 20 69 6e 70 75 74 20 73 74 72 69 6e 67 20  he input string 
10d20 2d 20 77 68 69 63 68 20 6d 65 61 6e 73 20 74 68  - which means th
10d30 61 74 0a 20 20 2a 2a 20 74 68 65 79 20 77 69 6c  at.  ** they wil
10d40 6c 20 70 65 72 73 69 73 74 20 61 66 74 65 72 20  l persist after 
10d50 74 68 65 20 63 75 72 72 65 6e 74 20 73 71 6c 69  the current sqli
10d60 74 65 33 5f 65 78 65 63 28 29 20 63 61 6c 6c 20  te3_exec() call 
10d70 72 65 74 75 72 6e 73 2e 0a 20 20 2a 2f 0a 20 20  returns..  */.  
10d80 70 2d 3e 70 53 65 6c 65 63 74 20 3d 20 73 71 6c  p->pSelect = sql
10d90 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 64 62  ite3SelectDup(db
10da0 2c 20 70 53 65 6c 65 63 74 2c 20 45 58 50 52 44  , pSelect, EXPRD
10db0 55 50 5f 52 45 44 55 43 45 29 3b 0a 20 20 70 2d  UP_REDUCE);.  p-
10dc0 3e 70 43 68 65 63 6b 20 3d 20 73 71 6c 69 74 65  >pCheck = sqlite
10dd0 33 45 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c  3ExprListDup(db,
10de0 20 70 43 4e 61 6d 65 73 2c 20 45 58 50 52 44 55   pCNames, EXPRDU
10df0 50 5f 52 45 44 55 43 45 29 3b 0a 20 20 69 66 28  P_REDUCE);.  if(
10e00 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
10e10 64 20 29 20 67 6f 74 6f 20 63 72 65 61 74 65 5f  d ) goto create_
10e20 76 69 65 77 5f 66 61 69 6c 3b 0a 0a 20 20 2f 2a  view_fail;..  /*
10e30 20 4c 6f 63 61 74 65 20 74 68 65 20 65 6e 64 20   Locate the end 
10e40 6f 66 20 74 68 65 20 43 52 45 41 54 45 20 56 49  of the CREATE VI
10e50 45 57 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 4d  EW statement.  M
10e60 61 6b 65 20 73 45 6e 64 20 70 6f 69 6e 74 20 74  ake sEnd point t
10e70 6f 0a 20 20 2a 2a 20 74 68 65 20 65 6e 64 2e 0a  o.  ** the end..
10e80 20 20 2a 2f 0a 20 20 73 45 6e 64 20 3d 20 70 50    */.  sEnd = pP
10e90 61 72 73 65 2d 3e 73 4c 61 73 74 54 6f 6b 65 6e  arse->sLastToken
10ea0 3b 0a 20 20 61 73 73 65 72 74 28 20 73 45 6e 64  ;.  assert( sEnd
10eb0 2e 7a 5b 30 5d 21 3d 30 20 29 3b 0a 20 20 69 66  .z[0]!=0 );.  if
10ec0 28 20 73 45 6e 64 2e 7a 5b 30 5d 21 3d 27 3b 27  ( sEnd.z[0]!=';'
10ed0 20 29 7b 0a 20 20 20 20 73 45 6e 64 2e 7a 20 2b   ){.    sEnd.z +
10ee0 3d 20 73 45 6e 64 2e 6e 3b 0a 20 20 7d 0a 20 20  = sEnd.n;.  }.  
10ef0 73 45 6e 64 2e 6e 20 3d 20 30 3b 0a 20 20 6e 20  sEnd.n = 0;.  n 
10f00 3d 20 28 69 6e 74 29 28 73 45 6e 64 2e 7a 20 2d  = (int)(sEnd.z -
10f10 20 70 42 65 67 69 6e 2d 3e 7a 29 3b 0a 20 20 61   pBegin->z);.  a
10f20 73 73 65 72 74 28 20 6e 3e 30 20 29 3b 0a 20 20  ssert( n>0 );.  
10f30 7a 20 3d 20 70 42 65 67 69 6e 2d 3e 7a 3b 0a 20  z = pBegin->z;. 
10f40 20 77 68 69 6c 65 28 20 73 71 6c 69 74 65 33 49   while( sqlite3I
10f50 73 73 70 61 63 65 28 7a 5b 6e 2d 31 5d 29 20 29  sspace(z[n-1]) )
10f60 7b 20 6e 2d 2d 3b 20 7d 0a 20 20 73 45 6e 64 2e  { n--; }.  sEnd.
10f70 7a 20 3d 20 26 7a 5b 6e 2d 31 5d 3b 0a 20 20 73  z = &z[n-1];.  s
10f80 45 6e 64 2e 6e 20 3d 20 31 3b 0a 0a 20 20 2f 2a  End.n = 1;..  /*
10f90 20 55 73 65 20 73 71 6c 69 74 65 33 45 6e 64 54   Use sqlite3EndT
10fa0 61 62 6c 65 28 29 20 74 6f 20 61 64 64 20 74 68  able() to add th
10fb0 65 20 76 69 65 77 20 74 6f 20 74 68 65 20 53 51  e view to the SQ
10fc0 4c 49 54 45 5f 4d 41 53 54 45 52 20 74 61 62 6c  LITE_MASTER tabl
10fd0 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 45 6e  e */.  sqlite3En
10fe0 64 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 30  dTable(pParse, 0
10ff0 2c 20 26 73 45 6e 64 2c 20 30 2c 20 30 29 3b 0a  , &sEnd, 0, 0);.
11000 0a 63 72 65 61 74 65 5f 76 69 65 77 5f 66 61 69  .create_view_fai
11010 6c 3a 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65  l:.  sqlite3Sele
11020 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70 53 65  ctDelete(db, pSe
11030 6c 65 63 74 29 3b 0a 20 20 73 71 6c 69 74 65 33  lect);.  sqlite3
11040 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64  ExprListDelete(d
11050 62 2c 20 70 43 4e 61 6d 65 73 29 3b 0a 20 20 72  b, pCNames);.  r
11060 65 74 75 72 6e 3b 0a 7d 0a 23 65 6e 64 69 66 20  eturn;.}.#endif 
11070 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  /* SQLITE_OMIT_V
11080 49 45 57 20 2a 2f 0a 0a 23 69 66 20 21 64 65 66  IEW */..#if !def
11090 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
110a0 5f 56 49 45 57 29 20 7c 7c 20 21 64 65 66 69 6e  _VIEW) || !defin
110b0 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ed(SQLITE_OMIT_V
110c0 49 52 54 55 41 4c 54 41 42 4c 45 29 0a 2f 2a 0a  IRTUALTABLE)./*.
110d0 2a 2a 20 54 68 65 20 54 61 62 6c 65 20 73 74 72  ** The Table str
110e0 75 63 74 75 72 65 20 70 54 61 62 6c 65 20 69 73  ucture pTable is
110f0 20 72 65 61 6c 6c 79 20 61 20 56 49 45 57 2e 20   really a VIEW. 
11100 20 46 69 6c 6c 20 69 6e 20 74 68 65 20 6e 61 6d   Fill in the nam
11110 65 73 20 6f 66 0a 2a 2a 20 74 68 65 20 63 6f 6c  es of.** the col
11120 75 6d 6e 73 20 6f 66 20 74 68 65 20 76 69 65 77  umns of the view
11130 20 69 6e 20 74 68 65 20 70 54 61 62 6c 65 20 73   in the pTable s
11140 74 72 75 63 74 75 72 65 2e 20 20 52 65 74 75 72  tructure.  Retur
11150 6e 20 74 68 65 20 6e 75 6d 62 65 72 0a 2a 2a 20  n the number.** 
11160 6f 66 20 65 72 72 6f 72 73 2e 20 20 49 66 20 61  of errors.  If a
11170 6e 20 65 72 72 6f 72 20 69 73 20 73 65 65 6e 20  n error is seen 
11180 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d  leave an error m
11190 65 73 73 61 67 65 20 69 6e 20 70 50 61 72 73 65  essage in pParse
111a0 2d 3e 7a 45 72 72 4d 73 67 2e 0a 2a 2f 0a 69 6e  ->zErrMsg..*/.in
111b0 74 20 73 71 6c 69 74 65 33 56 69 65 77 47 65 74  t sqlite3ViewGet
111c0 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 50 61 72 73  ColumnNames(Pars
111d0 65 20 2a 70 50 61 72 73 65 2c 20 54 61 62 6c 65  e *pParse, Table
111e0 20 2a 70 54 61 62 6c 65 29 7b 0a 20 20 54 61 62   *pTable){.  Tab
111f0 6c 65 20 2a 70 53 65 6c 54 61 62 3b 20 20 20 2f  le *pSelTab;   /
11200 2a 20 41 20 66 61 6b 65 20 74 61 62 6c 65 20 66  * A fake table f
11210 72 6f 6d 20 77 68 69 63 68 20 77 65 20 67 65 74  rom which we get
11220 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
11230 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65  */.  Select *pSe
11240 6c 3b 20 20 20 20 20 2f 2a 20 43 6f 70 79 20 6f  l;     /* Copy o
11250 66 20 74 68 65 20 53 45 4c 45 43 54 20 74 68 61  f the SELECT tha
11260 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65  t implements the
11270 20 76 69 65 77 20 2a 2f 0a 20 20 69 6e 74 20 6e   view */.  int n
11280 45 72 72 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20  Err = 0;     /* 
11290 4e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73  Number of errors
112a0 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 2a 2f 0a   encountered */.
112b0 20 20 69 6e 74 20 6e 3b 20 20 20 20 20 20 20 20    int n;        
112c0 20 20 20 20 2f 2a 20 54 65 6d 70 6f 72 61 72 69      /* Temporari
112d0 6c 79 20 68 6f 6c 64 73 20 74 68 65 20 6e 75 6d  ly holds the num
112e0 62 65 72 20 6f 66 20 63 75 72 73 6f 72 73 20 61  ber of cursors a
112f0 73 73 69 67 6e 65 64 20 2a 2f 0a 20 20 73 71 6c  ssigned */.  sql
11300 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
11310 65 2d 3e 64 62 3b 20 20 2f 2a 20 44 61 74 61 62  e->db;  /* Datab
11320 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 66  ase connection f
11330 6f 72 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 73  or malloc errors
11340 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 78 61   */.  sqlite3_xa
11350 75 74 68 20 78 41 75 74 68 3b 20 20 20 20 20 20  uth xAuth;      
11360 20 2f 2a 20 53 61 76 65 64 20 78 41 75 74 68 20   /* Saved xAuth 
11370 70 6f 69 6e 74 65 72 20 2a 2f 0a 0a 20 20 61 73  pointer */..  as
11380 73 65 72 74 28 20 70 54 61 62 6c 65 20 29 3b 0a  sert( pTable );.
11390 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
113a0 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
113b0 45 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 56  E.  if( sqlite3V
113c0 74 61 62 43 61 6c 6c 43 6f 6e 6e 65 63 74 28 70  tabCallConnect(p
113d0 50 61 72 73 65 2c 20 70 54 61 62 6c 65 29 20 29  Parse, pTable) )
113e0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
113f0 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  ITE_ERROR;.  }. 
11400 20 69 66 28 20 49 73 56 69 72 74 75 61 6c 28 70   if( IsVirtual(p
11410 54 61 62 6c 65 29 20 29 20 72 65 74 75 72 6e 20  Table) ) return 
11420 30 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64  0;.#endif..#ifnd
11430 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
11440 49 45 57 0a 20 20 2f 2a 20 41 20 70 6f 73 69 74  IEW.  /* A posit
11450 69 76 65 20 6e 43 6f 6c 20 6d 65 61 6e 73 20 74  ive nCol means t
11460 68 65 20 63 6f 6c 75 6d 6e 73 20 6e 61 6d 65 73  he columns names
11470 20 66 6f 72 20 74 68 69 73 20 76 69 65 77 20 61   for this view a
11480 72 65 0a 20 20 2a 2a 20 61 6c 72 65 61 64 79 20  re.  ** already 
11490 6b 6e 6f 77 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66  known..  */.  if
114a0 28 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3e 30  ( pTable->nCol>0
114b0 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20   ) return 0;..  
114c0 2f 2a 20 41 20 6e 65 67 61 74 69 76 65 20 6e 43  /* A negative nC
114d0 6f 6c 20 69 73 20 61 20 73 70 65 63 69 61 6c 20  ol is a special 
114e0 6d 61 72 6b 65 72 20 6d 65 61 6e 69 6e 67 20 74  marker meaning t
114f0 68 61 74 20 77 65 20 61 72 65 20 63 75 72 72 65  hat we are curre
11500 6e 74 6c 79 0a 20 20 2a 2a 20 74 72 79 69 6e 67  ntly.  ** trying
11510 20 74 6f 20 63 6f 6d 70 75 74 65 20 74 68 65 20   to compute the 
11520 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 2e 20 20 49  column names.  I
11530 66 20 77 65 20 65 6e 74 65 72 20 74 68 69 73 20  f we enter this 
11540 72 6f 75 74 69 6e 65 20 77 69 74 68 0a 20 20 2a  routine with.  *
11550 2a 20 61 20 6e 65 67 61 74 69 76 65 20 6e 43 6f  * a negative nCo
11560 6c 2c 20 69 74 20 6d 65 61 6e 73 20 74 77 6f 20  l, it means two 
11570 6f 72 20 6d 6f 72 65 20 76 69 65 77 73 20 66 6f  or more views fo
11580 72 6d 20 61 20 6c 6f 6f 70 2c 20 6c 69 6b 65 20  rm a loop, like 
11590 74 68 69 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  this:.  **.  ** 
115a0 20 20 20 20 43 52 45 41 54 45 20 56 49 45 57 20      CREATE VIEW 
115b0 6f 6e 65 20 41 53 20 53 45 4c 45 43 54 20 2a 20  one AS SELECT * 
115c0 46 52 4f 4d 20 74 77 6f 3b 0a 20 20 2a 2a 20 20  FROM two;.  **  
115d0 20 20 20 43 52 45 41 54 45 20 56 49 45 57 20 74     CREATE VIEW t
115e0 77 6f 20 41 53 20 53 45 4c 45 43 54 20 2a 20 46  wo AS SELECT * F
115f0 52 4f 4d 20 6f 6e 65 3b 0a 20 20 2a 2a 0a 20 20  ROM one;.  **.  
11600 2a 2a 20 41 63 74 75 61 6c 6c 79 2c 20 74 68 65  ** Actually, the
11610 20 65 72 72 6f 72 20 61 62 6f 76 65 20 69 73 20   error above is 
11620 6e 6f 77 20 63 61 75 67 68 74 20 70 72 69 6f 72  now caught prior
11630 20 74 6f 20 72 65 61 63 68 69 6e 67 20 74 68 69   to reaching thi
11640 73 20 70 6f 69 6e 74 2e 0a 20 20 2a 2a 20 42 75  s point..  ** Bu
11650 74 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  t the following 
11660 74 65 73 74 20 69 73 20 73 74 69 6c 6c 20 69 6d  test is still im
11670 70 6f 72 74 61 6e 74 20 61 73 20 69 74 20 64 6f  portant as it do
11680 65 73 20 63 6f 6d 65 20 75 70 0a 20 20 2a 2a 20  es come up.  ** 
11690 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  in the following
116a0 3a 0a 20 20 2a 2a 20 0a 20 20 2a 2a 20 20 20 20  :.  ** .  **    
116b0 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 6d 61   CREATE TABLE ma
116c0 69 6e 2e 65 78 31 28 61 29 3b 0a 20 20 2a 2a 20  in.ex1(a);.  ** 
116d0 20 20 20 20 43 52 45 41 54 45 20 54 45 4d 50 20      CREATE TEMP 
116e0 56 49 45 57 20 65 78 31 20 41 53 20 53 45 4c 45  VIEW ex1 AS SELE
116f0 43 54 20 61 20 46 52 4f 4d 20 65 78 31 3b 0a 20  CT a FROM ex1;. 
11700 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 2a   **     SELECT *
11710 20 46 52 4f 4d 20 74 65 6d 70 2e 65 78 31 3b 0a   FROM temp.ex1;.
11720 20 20 2a 2f 0a 20 20 69 66 28 20 70 54 61 62 6c    */.  if( pTabl
11730 65 2d 3e 6e 43 6f 6c 3c 30 20 29 7b 0a 20 20 20  e->nCol<0 ){.   
11740 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
11750 28 70 50 61 72 73 65 2c 20 22 76 69 65 77 20 25  (pParse, "view %
11760 73 20 69 73 20 63 69 72 63 75 6c 61 72 6c 79 20  s is circularly 
11770 64 65 66 69 6e 65 64 22 2c 20 70 54 61 62 6c 65  defined", pTable
11780 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72 65  ->zName);.    re
11790 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 61 73  turn 1;.  }.  as
117a0 73 65 72 74 28 20 70 54 61 62 6c 65 2d 3e 6e 43  sert( pTable->nC
117b0 6f 6c 3e 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 49  ol>=0 );..  /* I
117c0 66 20 77 65 20 67 65 74 20 74 68 69 73 20 66 61  f we get this fa
117d0 72 2c 20 69 74 20 6d 65 61 6e 73 20 77 65 20 6e  r, it means we n
117e0 65 65 64 20 74 6f 20 63 6f 6d 70 75 74 65 20 74  eed to compute t
117f0 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 73 2e 0a  he table names..
11800 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74    ** Note that t
11810 68 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74  he call to sqlit
11820 65 33 52 65 73 75 6c 74 53 65 74 4f 66 53 65 6c  e3ResultSetOfSel
11830 65 63 74 28 29 20 77 69 6c 6c 20 65 78 70 61 6e  ect() will expan
11840 64 20 61 6e 79 0a 20 20 2a 2a 20 22 2a 22 20 65  d any.  ** "*" e
11850 6c 65 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 72  lements in the r
11860 65 73 75 6c 74 73 20 73 65 74 20 6f 66 20 74 68  esults set of th
11870 65 20 76 69 65 77 20 61 6e 64 20 77 69 6c 6c 20  e view and will 
11880 61 73 73 69 67 6e 20 63 75 72 73 6f 72 73 0a 20  assign cursors. 
11890 20 2a 2a 20 74 6f 20 74 68 65 20 65 6c 65 6d 65   ** to the eleme
118a0 6e 74 73 20 6f 66 20 74 68 65 20 46 52 4f 4d 20  nts of the FROM 
118b0 63 6c 61 75 73 65 2e 20 20 42 75 74 20 77 65 20  clause.  But we 
118c0 64 6f 20 6e 6f 74 20 77 61 6e 74 20 74 68 65 73  do not want thes
118d0 65 20 63 68 61 6e 67 65 73 0a 20 20 2a 2a 20 74  e changes.  ** t
118e0 6f 20 62 65 20 70 65 72 6d 61 6e 65 6e 74 2e 20  o be permanent. 
118f0 20 53 6f 20 74 68 65 20 63 6f 6d 70 75 74 61 74   So the computat
11900 69 6f 6e 20 69 73 20 64 6f 6e 65 20 6f 6e 20 61  ion is done on a
11910 20 63 6f 70 79 20 6f 66 20 74 68 65 20 53 45 4c   copy of the SEL
11920 45 43 54 0a 20 20 2a 2a 20 73 74 61 74 65 6d 65  ECT.  ** stateme
11930 6e 74 20 74 68 61 74 20 64 65 66 69 6e 65 73 20  nt that defines 
11940 74 68 65 20 76 69 65 77 2e 0a 20 20 2a 2f 0a 20  the view..  */. 
11950 20 61 73 73 65 72 74 28 20 70 54 61 62 6c 65 2d   assert( pTable-
11960 3e 70 53 65 6c 65 63 74 20 29 3b 0a 20 20 70 53  >pSelect );.  pS
11970 65 6c 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65  el = sqlite3Sele
11980 63 74 44 75 70 28 64 62 2c 20 70 54 61 62 6c 65  ctDup(db, pTable
11990 2d 3e 70 53 65 6c 65 63 74 2c 20 30 29 3b 0a 20  ->pSelect, 0);. 
119a0 20 69 66 28 20 70 53 65 6c 20 29 7b 0a 20 20 20   if( pSel ){.   
119b0 20 6e 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61   n = pParse->nTa
119c0 62 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 72  b;.    sqlite3Sr
119d0 63 4c 69 73 74 41 73 73 69 67 6e 43 75 72 73 6f  cListAssignCurso
119e0 72 73 28 70 50 61 72 73 65 2c 20 70 53 65 6c 2d  rs(pParse, pSel-
119f0 3e 70 53 72 63 29 3b 0a 20 20 20 20 70 54 61 62  >pSrc);.    pTab
11a00 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 2d 31 3b 0a 20  le->nCol = -1;. 
11a10 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65     db->lookaside
11a20 2e 62 44 69 73 61 62 6c 65 2b 2b 3b 0a 23 69 66  .bDisable++;.#if
11a30 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
11a40 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20  _AUTHORIZATION. 
11a50 20 20 20 78 41 75 74 68 20 3d 20 64 62 2d 3e 78     xAuth = db->x
11a60 41 75 74 68 3b 0a 20 20 20 20 64 62 2d 3e 78 41  Auth;.    db->xA
11a70 75 74 68 20 3d 20 30 3b 0a 20 20 20 20 70 53 65  uth = 0;.    pSe
11a80 6c 54 61 62 20 3d 20 73 71 6c 69 74 65 33 52 65  lTab = sqlite3Re
11a90 73 75 6c 74 53 65 74 4f 66 53 65 6c 65 63 74 28  sultSetOfSelect(
11aa0 70 50 61 72 73 65 2c 20 70 53 65 6c 29 3b 0a 20  pParse, pSel);. 
11ab0 20 20 20 64 62 2d 3e 78 41 75 74 68 20 3d 20 78     db->xAuth = x
11ac0 41 75 74 68 3b 0a 23 65 6c 73 65 0a 20 20 20 20  Auth;.#else.    
11ad0 70 53 65 6c 54 61 62 20 3d 20 73 71 6c 69 74 65  pSelTab = sqlite
11ae0 33 52 65 73 75 6c 74 53 65 74 4f 66 53 65 6c 65  3ResultSetOfSele
11af0 63 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c 29  ct(pParse, pSel)
11b00 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 70 50 61  ;.#endif.    pPa
11b10 72 73 65 2d 3e 6e 54 61 62 20 3d 20 6e 3b 0a 20  rse->nTab = n;. 
11b20 20 20 20 69 66 28 20 70 54 61 62 6c 65 2d 3e 70     if( pTable->p
11b30 43 68 65 63 6b 20 29 7b 0a 20 20 20 20 20 20 2f  Check ){.      /
11b40 2a 20 43 52 45 41 54 45 20 56 49 45 57 20 6e 61  * CREATE VIEW na
11b50 6d 65 28 61 72 67 6c 69 73 74 29 20 41 53 20 2e  me(arglist) AS .
11b60 2e 2e 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 20  ...      ** The 
11b70 6e 61 6d 65 73 20 6f 66 20 74 68 65 20 63 6f 6c  names of the col
11b80 75 6d 6e 73 20 69 6e 20 74 68 65 20 74 61 62 6c  umns in the tabl
11b90 65 20 61 72 65 20 74 61 6b 65 6e 20 66 72 6f 6d  e are taken from
11ba0 0a 20 20 20 20 20 20 2a 2a 20 61 72 67 6c 69 73  .      ** arglis
11bb0 74 20 77 68 69 63 68 20 69 73 20 73 74 6f 72 65  t which is store
11bc0 64 20 69 6e 20 70 54 61 62 6c 65 2d 3e 70 43 68  d in pTable->pCh
11bd0 65 63 6b 2e 20 20 54 68 65 20 70 43 68 65 63 6b  eck.  The pCheck
11be0 20 66 69 65 6c 64 0a 20 20 20 20 20 20 2a 2a 20   field.      ** 
11bf0 6e 6f 72 6d 61 6c 6c 79 20 68 6f 6c 64 73 20 43  normally holds C
11c00 48 45 43 4b 20 63 6f 6e 73 74 72 61 69 6e 74 73  HECK constraints
11c10 20 6f 6e 20 61 6e 20 6f 72 64 69 6e 61 72 79 20   on an ordinary 
11c20 74 61 62 6c 65 2c 20 62 75 74 20 66 6f 72 0a 20  table, but for. 
11c30 20 20 20 20 20 2a 2a 20 61 20 56 49 45 57 20 69       ** a VIEW i
11c40 74 20 68 6f 6c 64 73 20 74 68 65 20 6c 69 73 74  t holds the list
11c50 20 6f 66 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73   of column names
11c60 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
11c70 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 73 46   sqlite3ColumnsF
11c80 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72  romExprList(pPar
11c90 73 65 2c 20 70 54 61 62 6c 65 2d 3e 70 43 68 65  se, pTable->pChe
11ca0 63 6b 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  ck, .           
11cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11cc0 20 20 20 20 20 20 26 70 54 61 62 6c 65 2d 3e 6e        &pTable->n
11cd0 43 6f 6c 2c 20 26 70 54 61 62 6c 65 2d 3e 61 43  Col, &pTable->aC
11ce0 6f 6c 29 3b 0a 20 20 20 20 20 20 69 66 28 20 64  ol);.      if( d
11cf0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3d  b->mallocFailed=
11d00 3d 30 20 0a 20 20 20 20 20 20 20 26 26 20 70 50  =0 .       && pP
11d10 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 0a 20 20  arse->nErr==0.  
11d20 20 20 20 20 20 26 26 20 70 54 61 62 6c 65 2d 3e       && pTable->
11d30 6e 43 6f 6c 3d 3d 70 53 65 6c 2d 3e 70 45 4c 69  nCol==pSel->pELi
11d40 73 74 2d 3e 6e 45 78 70 72 0a 20 20 20 20 20 20  st->nExpr.      
11d50 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
11d60 65 33 53 65 6c 65 63 74 41 64 64 43 6f 6c 75 6d  e3SelectAddColum
11d70 6e 54 79 70 65 41 6e 64 43 6f 6c 6c 61 74 69 6f  nTypeAndCollatio
11d80 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62 6c 65  n(pParse, pTable
11d90 2c 20 70 53 65 6c 29 3b 0a 20 20 20 20 20 20 7d  , pSel);.      }
11da0 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70  .    }else if( p
11db0 53 65 6c 54 61 62 20 29 7b 0a 20 20 20 20 20 20  SelTab ){.      
11dc0 2f 2a 20 43 52 45 41 54 45 20 56 49 45 57 20 6e  /* CREATE VIEW n
11dd0 61 6d 65 20 41 53 2e 2e 2e 20 20 77 69 74 68 6f  ame AS...  witho
11de0 75 74 20 61 6e 20 61 72 67 75 6d 65 6e 74 20 6c  ut an argument l
11df0 69 73 74 2e 20 20 43 6f 6e 73 74 72 75 63 74 0a  ist.  Construct.
11e00 20 20 20 20 20 20 2a 2a 20 74 68 65 20 63 6f 6c        ** the col
11e10 75 6d 6e 20 6e 61 6d 65 73 20 66 72 6f 6d 20 74  umn names from t
11e20 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
11e30 65 6e 74 20 74 68 61 74 20 64 65 66 69 6e 65 73  ent that defines
11e40 20 74 68 65 20 76 69 65 77 2e 0a 20 20 20 20 20   the view..     
11e50 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74   */.      assert
11e60 28 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 3d 3d  ( pTable->aCol==
11e70 30 20 29 3b 0a 20 20 20 20 20 20 70 54 61 62 6c  0 );.      pTabl
11e80 65 2d 3e 6e 43 6f 6c 20 3d 20 70 53 65 6c 54 61  e->nCol = pSelTa
11e90 62 2d 3e 6e 43 6f 6c 3b 0a 20 20 20 20 20 20 70  b->nCol;.      p
11ea0 54 61 62 6c 65 2d 3e 61 43 6f 6c 20 3d 20 70 53  Table->aCol = pS
11eb0 65 6c 54 61 62 2d 3e 61 43 6f 6c 3b 0a 20 20 20  elTab->aCol;.   
11ec0 20 20 20 70 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c     pSelTab->nCol
11ed0 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 53 65 6c   = 0;.      pSel
11ee0 54 61 62 2d 3e 61 43 6f 6c 20 3d 20 30 3b 0a 20  Tab->aCol = 0;. 
11ef0 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c       assert( sql
11f00 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48  ite3SchemaMutexH
11f10 65 6c 64 28 64 62 2c 20 30 2c 20 70 54 61 62 6c  eld(db, 0, pTabl
11f20 65 2d 3e 70 53 63 68 65 6d 61 29 20 29 3b 0a 20  e->pSchema) );. 
11f30 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
11f40 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 30  pTable->nCol = 0
11f50 3b 0a 20 20 20 20 20 20 6e 45 72 72 2b 2b 3b 0a  ;.      nErr++;.
11f60 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
11f70 33 44 65 6c 65 74 65 54 61 62 6c 65 28 64 62 2c  3DeleteTable(db,
11f80 20 70 53 65 6c 54 61 62 29 3b 0a 20 20 20 20 73   pSelTab);.    s
11f90 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65  qlite3SelectDele
11fa0 74 65 28 64 62 2c 20 70 53 65 6c 29 3b 0a 20 20  te(db, pSel);.  
11fb0 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e    db->lookaside.
11fc0 62 44 69 73 61 62 6c 65 2d 2d 3b 0a 20 20 7d 20  bDisable--;.  } 
11fd0 65 6c 73 65 20 7b 0a 20 20 20 20 6e 45 72 72 2b  else {.    nErr+
11fe0 2b 3b 0a 20 20 7d 0a 20 20 70 54 61 62 6c 65 2d  +;.  }.  pTable-
11ff0 3e 70 53 63 68 65 6d 61 2d 3e 73 63 68 65 6d 61  >pSchema->schema
12000 46 6c 61 67 73 20 7c 3d 20 44 42 5f 55 6e 72 65  Flags |= DB_Unre
12010 73 65 74 56 69 65 77 73 3b 0a 23 65 6e 64 69 66  setViews;.#endif
12020 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
12030 56 49 45 57 20 2a 2f 0a 20 20 72 65 74 75 72 6e  VIEW */.  return
12040 20 6e 45 72 72 3b 20 20 0a 7d 0a 23 65 6e 64 69   nErr;  .}.#endi
12050 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51  f /* !defined(SQ
12060 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20  LITE_OMIT_VIEW) 
12070 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  || !defined(SQLI
12080 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
12090 41 42 4c 45 29 20 2a 2f 0a 0a 23 69 66 6e 64 65  ABLE) */..#ifnde
120a0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
120b0 45 57 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 74  EW./*.** Clear t
120c0 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20  he column names 
120d0 66 72 6f 6d 20 65 76 65 72 79 20 56 49 45 57 20  from every VIEW 
120e0 69 6e 20 64 61 74 61 62 61 73 65 20 69 64 78 2e  in database idx.
120f0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
12100 73 71 6c 69 74 65 56 69 65 77 52 65 73 65 74 41  sqliteViewResetA
12110 6c 6c 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  ll(sqlite3 *db, 
12120 69 6e 74 20 69 64 78 29 7b 0a 20 20 48 61 73 68  int idx){.  Hash
12130 45 6c 65 6d 20 2a 69 3b 0a 20 20 61 73 73 65 72  Elem *i;.  asser
12140 74 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61  t( sqlite3Schema
12150 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20 69 64  MutexHeld(db, id
12160 78 2c 20 30 29 20 29 3b 0a 20 20 69 66 28 20 21  x, 0) );.  if( !
12170 44 62 48 61 73 50 72 6f 70 65 72 74 79 28 64 62  DbHasProperty(db
12180 2c 20 69 64 78 2c 20 44 42 5f 55 6e 72 65 73 65  , idx, DB_Unrese
12190 74 56 69 65 77 73 29 20 29 20 72 65 74 75 72 6e  tViews) ) return
121a0 3b 0a 20 20 66 6f 72 28 69 3d 73 71 6c 69 74 65  ;.  for(i=sqlite
121b0 48 61 73 68 46 69 72 73 74 28 26 64 62 2d 3e 61  HashFirst(&db->a
121c0 44 62 5b 69 64 78 5d 2e 70 53 63 68 65 6d 61 2d  Db[idx].pSchema-
121d0 3e 74 62 6c 48 61 73 68 29 3b 20 69 3b 69 3d 73  >tblHash); i;i=s
121e0 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28 69 29  qliteHashNext(i)
121f0 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54  ){.    Table *pT
12200 61 62 20 3d 20 73 71 6c 69 74 65 48 61 73 68 44  ab = sqliteHashD
12210 61 74 61 28 69 29 3b 0a 20 20 20 20 69 66 28 20  ata(i);.    if( 
12220 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 29 7b  pTab->pSelect ){
12230 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65  .      sqlite3De
12240 6c 65 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28  leteColumnNames(
12250 64 62 2c 20 70 54 61 62 29 3b 0a 20 20 20 20 20  db, pTab);.     
12260 20 70 54 61 62 2d 3e 61 43 6f 6c 20 3d 20 30 3b   pTab->aCol = 0;
12270 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 6e 43 6f  .      pTab->nCo
12280 6c 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  l = 0;.    }.  }
12290 0a 20 20 44 62 43 6c 65 61 72 50 72 6f 70 65 72  .  DbClearProper
122a0 74 79 28 64 62 2c 20 69 64 78 2c 20 44 42 5f 55  ty(db, idx, DB_U
122b0 6e 72 65 73 65 74 56 69 65 77 73 29 3b 0a 7d 0a  nresetViews);.}.
122c0 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 73  #else.# define s
122d0 71 6c 69 74 65 56 69 65 77 52 65 73 65 74 41 6c  qliteViewResetAl
122e0 6c 28 41 2c 42 29 0a 23 65 6e 64 69 66 20 2f 2a  l(A,B).#endif /*
122f0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45   SQLITE_OMIT_VIE
12300 57 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  W */../*.** This
12310 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
12320 6c 65 64 20 62 79 20 74 68 65 20 56 44 42 45 20  led by the VDBE 
12330 74 6f 20 61 64 6a 75 73 74 20 74 68 65 20 69 6e  to adjust the in
12340 74 65 72 6e 61 6c 20 73 63 68 65 6d 61 0a 2a 2a  ternal schema.**
12350 20 75 73 65 64 20 62 79 20 53 51 4c 69 74 65 20   used by SQLite 
12360 77 68 65 6e 20 74 68 65 20 62 74 72 65 65 20 6c  when the btree l
12370 61 79 65 72 20 6d 6f 76 65 73 20 61 20 74 61 62  ayer moves a tab
12380 6c 65 20 72 6f 6f 74 20 70 61 67 65 2e 20 54 68  le root page. Th
12390 65 0a 2a 2a 20 72 6f 6f 74 2d 70 61 67 65 20 6f  e.** root-page o
123a0 66 20 61 20 74 61 62 6c 65 20 6f 72 20 69 6e 64  f a table or ind
123b0 65 78 20 69 6e 20 64 61 74 61 62 61 73 65 20 69  ex in database i
123c0 44 62 20 68 61 73 20 63 68 61 6e 67 65 64 20 66  Db has changed f
123d0 72 6f 6d 20 69 46 72 6f 6d 0a 2a 2a 20 74 6f 20  rom iFrom.** to 
123e0 69 54 6f 2e 0a 2a 2a 0a 2a 2a 20 54 69 63 6b 65  iTo..**.** Ticke
123f0 74 20 23 31 37 32 38 3a 20 20 54 68 65 20 73 79  t #1728:  The sy
12400 6d 62 6f 6c 20 74 61 62 6c 65 20 6d 69 67 68 74  mbol table might
12410 20 73 74 69 6c 6c 20 63 6f 6e 74 61 69 6e 20 69   still contain i
12420 6e 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20 6f 6e  nformation.** on
12430 20 74 61 62 6c 65 73 20 61 6e 64 2f 6f 72 20 69   tables and/or i
12440 6e 64 69 63 65 73 20 74 68 61 74 20 61 72 65 20  ndices that are 
12450 74 68 65 20 70 72 6f 63 65 73 73 20 6f 66 20 62  the process of b
12460 65 69 6e 67 20 64 65 6c 65 74 65 64 2e 0a 2a 2a  eing deleted..**
12470 20 49 66 20 79 6f 75 20 61 72 65 20 75 6e 6c 75   If you are unlu
12480 63 6b 79 2c 20 6f 6e 65 20 6f 66 20 74 68 6f 73  cky, one of thos
12490 65 20 64 65 6c 65 74 65 64 20 69 6e 64 69 63 65  e deleted indice
124a0 73 20 6f 72 20 74 61 62 6c 65 73 20 6d 69 67 68  s or tables migh
124b0 74 0a 2a 2a 20 68 61 76 65 20 74 68 65 20 73 61  t.** have the sa
124c0 6d 65 20 72 6f 6f 74 70 61 67 65 20 6e 75 6d 62  me rootpage numb
124d0 65 72 20 61 73 20 74 68 65 20 72 65 61 6c 20 74  er as the real t
124e0 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 74 68  able or index th
124f0 61 74 20 69 73 0a 2a 2a 20 62 65 69 6e 67 20 6d  at is.** being m
12500 6f 76 65 64 2e 20 20 53 6f 20 77 65 20 63 61 6e  oved.  So we can
12510 6e 6f 74 20 73 74 6f 70 20 73 65 61 72 63 68 69  not stop searchi
12520 6e 67 20 61 66 74 65 72 20 74 68 65 20 66 69 72  ng after the fir
12530 73 74 20 6d 61 74 63 68 20 0a 2a 2a 20 62 65 63  st match .** bec
12540 61 75 73 65 20 74 68 65 20 66 69 72 73 74 20 6d  ause the first m
12550 61 74 63 68 20 6d 69 67 68 74 20 62 65 20 66 6f  atch might be fo
12560 72 20 6f 6e 65 20 6f 66 20 74 68 65 20 64 65 6c  r one of the del
12570 65 74 65 64 20 69 6e 64 69 63 65 73 0a 2a 2a 20  eted indices.** 
12580 6f 72 20 74 61 62 6c 65 73 20 61 6e 64 20 6e 6f  or tables and no
12590 74 20 74 68 65 20 74 61 62 6c 65 2f 69 6e 64 65  t the table/inde
125a0 78 20 74 68 61 74 20 69 73 20 61 63 74 75 61 6c  x that is actual
125b0 6c 79 20 62 65 69 6e 67 20 6d 6f 76 65 64 2e 0a  ly being moved..
125c0 2a 2a 20 57 65 20 6d 75 73 74 20 63 6f 6e 74 69  ** We must conti
125d0 6e 75 65 20 6c 6f 6f 70 69 6e 67 20 75 6e 74 69  nue looping unti
125e0 6c 20 61 6c 6c 20 74 61 62 6c 65 73 20 61 6e 64  l all tables and
125f0 20 69 6e 64 69 63 65 73 20 77 69 74 68 0a 2a 2a   indices with.**
12600 20 72 6f 6f 74 70 61 67 65 3d 3d 69 46 72 6f 6d   rootpage==iFrom
12610 20 68 61 76 65 20 62 65 65 6e 20 63 6f 6e 76 65   have been conve
12620 72 74 65 64 20 74 6f 20 68 61 76 65 20 61 20 72  rted to have a r
12630 6f 6f 74 70 61 67 65 20 6f 66 20 69 54 6f 0a 2a  ootpage of iTo.*
12640 2a 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 62 65  * in order to be
12650 20 63 65 72 74 61 69 6e 20 74 68 61 74 20 77 65   certain that we
12660 20 67 6f 74 20 74 68 65 20 72 69 67 68 74 20 6f   got the right o
12670 6e 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53  ne..*/.#ifndef S
12680 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
12690 41 43 55 55 4d 0a 76 6f 69 64 20 73 71 6c 69 74  ACUUM.void sqlit
126a0 65 33 52 6f 6f 74 50 61 67 65 4d 6f 76 65 64 28  e3RootPageMoved(
126b0 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74  sqlite3 *db, int
126c0 20 69 44 62 2c 20 69 6e 74 20 69 46 72 6f 6d 2c   iDb, int iFrom,
126d0 20 69 6e 74 20 69 54 6f 29 7b 0a 20 20 48 61 73   int iTo){.  Has
126e0 68 45 6c 65 6d 20 2a 70 45 6c 65 6d 3b 0a 20 20  hElem *pElem;.  
126f0 48 61 73 68 20 2a 70 48 61 73 68 3b 0a 20 20 44  Hash *pHash;.  D
12700 62 20 2a 70 44 62 3b 0a 0a 20 20 61 73 73 65 72  b *pDb;..  asser
12710 74 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61  t( sqlite3Schema
12720 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20 69 44  MutexHeld(db, iD
12730 62 2c 20 30 29 20 29 3b 0a 20 20 70 44 62 20 3d  b, 0) );.  pDb =
12740 20 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a   &db->aDb[iDb];.
12750 20 20 70 48 61 73 68 20 3d 20 26 70 44 62 2d 3e    pHash = &pDb->
12760 70 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68  pSchema->tblHash
12770 3b 0a 20 20 66 6f 72 28 70 45 6c 65 6d 3d 73 71  ;.  for(pElem=sq
12780 6c 69 74 65 48 61 73 68 46 69 72 73 74 28 70 48  liteHashFirst(pH
12790 61 73 68 29 3b 20 70 45 6c 65 6d 3b 20 70 45 6c  ash); pElem; pEl
127a0 65 6d 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78  em=sqliteHashNex
127b0 74 28 70 45 6c 65 6d 29 29 7b 0a 20 20 20 20 54  t(pElem)){.    T
127c0 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 73 71 6c  able *pTab = sql
127d0 69 74 65 48 61 73 68 44 61 74 61 28 70 45 6c 65  iteHashData(pEle
127e0 6d 29 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62  m);.    if( pTab
127f0 2d 3e 74 6e 75 6d 3d 3d 69 46 72 6f 6d 20 29 7b  ->tnum==iFrom ){
12800 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 74 6e 75  .      pTab->tnu
12810 6d 20 3d 20 69 54 6f 3b 0a 20 20 20 20 7d 0a 20  m = iTo;.    }. 
12820 20 7d 0a 20 20 70 48 61 73 68 20 3d 20 26 70 44   }.  pHash = &pD
12830 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 69 64 78 48  b->pSchema->idxH
12840 61 73 68 3b 0a 20 20 66 6f 72 28 70 45 6c 65 6d  ash;.  for(pElem
12850 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72 73 74  =sqliteHashFirst
12860 28 70 48 61 73 68 29 3b 20 70 45 6c 65 6d 3b 20  (pHash); pElem; 
12870 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73 68  pElem=sqliteHash
12880 4e 65 78 74 28 70 45 6c 65 6d 29 29 7b 0a 20 20  Next(pElem)){.  
12890 20 20 49 6e 64 65 78 20 2a 70 49 64 78 20 3d 20    Index *pIdx = 
128a0 73 71 6c 69 74 65 48 61 73 68 44 61 74 61 28 70  sqliteHashData(p
128b0 45 6c 65 6d 29 3b 0a 20 20 20 20 69 66 28 20 70  Elem);.    if( p
128c0 49 64 78 2d 3e 74 6e 75 6d 3d 3d 69 46 72 6f 6d  Idx->tnum==iFrom
128d0 20 29 7b 0a 20 20 20 20 20 20 70 49 64 78 2d 3e   ){.      pIdx->
128e0 74 6e 75 6d 20 3d 20 69 54 6f 3b 0a 20 20 20 20  tnum = iTo;.    
128f0 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a  }.  }.}.#endif..
12900 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 63 6f 64 65  /*.** Write code
12910 20 74 6f 20 65 72 61 73 65 20 74 68 65 20 74 61   to erase the ta
12920 62 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d 70 61  ble with root-pa
12930 67 65 20 69 54 61 62 6c 65 20 66 72 6f 6d 20 64  ge iTable from d
12940 61 74 61 62 61 73 65 20 69 44 62 2e 0a 2a 2a 20  atabase iDb..** 
12950 41 6c 73 6f 20 77 72 69 74 65 20 63 6f 64 65 20  Also write code 
12960 74 6f 20 6d 6f 64 69 66 79 20 74 68 65 20 73 71  to modify the sq
12970 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c  lite_master tabl
12980 65 20 61 6e 64 20 69 6e 74 65 72 6e 61 6c 20 73  e and internal s
12990 63 68 65 6d 61 0a 2a 2a 20 69 66 20 61 20 72 6f  chema.** if a ro
129a0 6f 74 2d 70 61 67 65 20 6f 66 20 61 6e 6f 74 68  ot-page of anoth
129b0 65 72 20 74 61 62 6c 65 20 69 73 20 6d 6f 76 65  er table is move
129c0 64 20 62 79 20 74 68 65 20 62 74 72 65 65 2d 6c  d by the btree-l
129d0 61 79 65 72 20 77 68 69 6c 73 74 0a 2a 2a 20 65  ayer whilst.** e
129e0 72 61 73 69 6e 67 20 69 54 61 62 6c 65 20 28 74  rasing iTable (t
129f0 68 69 73 20 63 61 6e 20 68 61 70 70 65 6e 20 77  his can happen w
12a00 69 74 68 20 61 6e 20 61 75 74 6f 2d 76 61 63 75  ith an auto-vacu
12a10 75 6d 20 64 61 74 61 62 61 73 65 29 2e 0a 2a 2f  um database)..*/
12a20 20 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64 65   .static void de
12a30 73 74 72 6f 79 52 6f 6f 74 50 61 67 65 28 50 61  stroyRootPage(Pa
12a40 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74  rse *pParse, int
12a50 20 69 54 61 62 6c 65 2c 20 69 6e 74 20 69 44 62   iTable, int iDb
12a60 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 73  ){.  Vdbe *v = s
12a70 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
12a80 61 72 73 65 29 3b 0a 20 20 69 6e 74 20 72 31 20  arse);.  int r1 
12a90 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
12aa0 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 61  Reg(pParse);.  a
12ab0 73 73 65 72 74 28 20 69 54 61 62 6c 65 3e 31 20  ssert( iTable>1 
12ac0 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
12ad0 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 44 65 73  AddOp3(v, OP_Des
12ae0 74 72 6f 79 2c 20 69 54 61 62 6c 65 2c 20 72 31  troy, iTable, r1
12af0 2c 20 69 44 62 29 3b 0a 20 20 73 71 6c 69 74 65  , iDb);.  sqlite
12b00 33 4d 61 79 41 62 6f 72 74 28 70 50 61 72 73 65  3MayAbort(pParse
12b10 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  );.#ifndef SQLIT
12b20 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
12b30 4d 0a 20 20 2f 2a 20 4f 50 5f 44 65 73 74 72 6f  M.  /* OP_Destro
12b40 79 20 73 74 6f 72 65 73 20 61 6e 20 69 6e 20 69  y stores an in i
12b50 6e 74 65 67 65 72 20 72 31 2e 20 49 66 20 74 68  nteger r1. If th
12b60 69 73 20 69 6e 74 65 67 65 72 0a 20 20 2a 2a 20  is integer.  ** 
12b70 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65  is non-zero, the
12b80 6e 20 69 74 20 69 73 20 74 68 65 20 72 6f 6f 74  n it is the root
12b90 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
12ba0 61 20 74 61 62 6c 65 20 6d 6f 76 65 64 20 74 6f  a table moved to
12bb0 0a 20 20 2a 2a 20 6c 6f 63 61 74 69 6f 6e 20 69  .  ** location i
12bc0 54 61 62 6c 65 2e 20 54 68 65 20 66 6f 6c 6c 6f  Table. The follo
12bd0 77 69 6e 67 20 63 6f 64 65 20 6d 6f 64 69 66 69  wing code modifi
12be0 65 73 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61  es the sqlite_ma
12bf0 73 74 65 72 20 74 61 62 6c 65 20 74 6f 0a 20 20  ster table to.  
12c00 2a 2a 20 72 65 66 6c 65 63 74 20 74 68 69 73 2e  ** reflect this.
12c10 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 22  .  **.  ** The "
12c20 23 4e 4e 4e 22 20 69 6e 20 74 68 65 20 53 51 4c  #NNN" in the SQL
12c30 20 69 73 20 61 20 73 70 65 63 69 61 6c 20 63 6f   is a special co
12c40 6e 73 74 61 6e 74 20 74 68 61 74 20 6d 65 61 6e  nstant that mean
12c50 73 20 77 68 61 74 65 76 65 72 20 76 61 6c 75 65  s whatever value
12c60 0a 20 20 2a 2a 20 69 73 20 69 6e 20 72 65 67 69  .  ** is in regi
12c70 73 74 65 72 20 4e 4e 4e 2e 20 20 53 65 65 20 67  ster NNN.  See g
12c80 72 61 6d 6d 61 72 20 72 75 6c 65 73 20 61 73 73  rammar rules ass
12c90 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
12ca0 20 54 4b 5f 52 45 47 49 53 54 45 52 0a 20 20 2a   TK_REGISTER.  *
12cb0 2a 20 74 6f 6b 65 6e 20 66 6f 72 20 61 64 64 69  * token for addi
12cc0 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69  tional informati
12cd0 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  on..  */.  sqlit
12ce0 65 33 4e 65 73 74 65 64 50 61 72 73 65 28 70 50  e3NestedParse(pP
12cf0 61 72 73 65 2c 20 0a 20 20 20 20 20 22 55 50 44  arse, .     "UPD
12d00 41 54 45 20 25 51 2e 25 73 20 53 45 54 20 72 6f  ATE %Q.%s SET ro
12d10 6f 74 70 61 67 65 3d 25 64 20 57 48 45 52 45 20  otpage=%d WHERE 
12d20 23 25 64 20 41 4e 44 20 72 6f 6f 74 70 61 67 65  #%d AND rootpage
12d30 3d 23 25 64 22 2c 0a 20 20 20 20 20 70 50 61 72  =#%d",.     pPar
12d40 73 65 2d 3e 64 62 2d 3e 61 44 62 5b 69 44 62 5d  se->db->aDb[iDb]
12d50 2e 7a 4e 61 6d 65 2c 20 53 43 48 45 4d 41 5f 54  .zName, SCHEMA_T
12d60 41 42 4c 45 28 69 44 62 29 2c 20 69 54 61 62 6c  ABLE(iDb), iTabl
12d70 65 2c 20 72 31 2c 20 72 31 29 3b 0a 23 65 6e 64  e, r1, r1);.#end
12d80 69 66 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65  if.  sqlite3Rele
12d90 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
12da0 65 2c 20 72 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  e, r1);.}../*.**
12db0 20 57 72 69 74 65 20 56 44 42 45 20 63 6f 64 65   Write VDBE code
12dc0 20 74 6f 20 65 72 61 73 65 20 74 61 62 6c 65 20   to erase table 
12dd0 70 54 61 62 20 61 6e 64 20 61 6c 6c 20 61 73 73  pTab and all ass
12de0 6f 63 69 61 74 65 64 20 69 6e 64 69 63 65 73 20  ociated indices 
12df0 6f 6e 20 64 69 73 6b 2e 0a 2a 2a 20 43 6f 64 65  on disk..** Code
12e00 20 74 6f 20 75 70 64 61 74 65 20 74 68 65 20 73   to update the s
12e10 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62  qlite_master tab
12e20 6c 65 73 20 61 6e 64 20 69 6e 74 65 72 6e 61 6c  les and internal
12e30 20 73 63 68 65 6d 61 20 64 65 66 69 6e 69 74 69   schema definiti
12e40 6f 6e 73 0a 2a 2a 20 69 6e 20 63 61 73 65 20 61  ons.** in case a
12e50 20 72 6f 6f 74 2d 70 61 67 65 20 62 65 6c 6f 6e   root-page belon
12e60 67 69 6e 67 20 74 6f 20 61 6e 6f 74 68 65 72 20  ging to another 
12e70 74 61 62 6c 65 20 69 73 20 6d 6f 76 65 64 20 62  table is moved b
12e80 79 20 74 68 65 20 62 74 72 65 65 20 6c 61 79 65  y the btree laye
12e90 72 0a 2a 2a 20 69 73 20 61 6c 73 6f 20 61 64 64  r.** is also add
12ea0 65 64 20 28 74 68 69 73 20 63 61 6e 20 68 61 70  ed (this can hap
12eb0 70 65 6e 20 77 69 74 68 20 61 6e 20 61 75 74 6f  pen with an auto
12ec0 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61 73 65  -vacuum database
12ed0 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  )..*/.static voi
12ee0 64 20 64 65 73 74 72 6f 79 54 61 62 6c 65 28 50  d destroyTable(P
12ef0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 61  arse *pParse, Ta
12f00 62 6c 65 20 2a 70 54 61 62 29 7b 0a 23 69 66 64  ble *pTab){.#ifd
12f10 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
12f20 55 54 4f 56 41 43 55 55 4d 0a 20 20 49 6e 64 65  UTOVACUUM.  Inde
12f30 78 20 2a 70 49 64 78 3b 0a 20 20 69 6e 74 20 69  x *pIdx;.  int i
12f40 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65  Db = sqlite3Sche
12f50 6d 61 54 6f 49 6e 64 65 78 28 70 50 61 72 73 65  maToIndex(pParse
12f60 2d 3e 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68  ->db, pTab->pSch
12f70 65 6d 61 29 3b 0a 20 20 64 65 73 74 72 6f 79 52  ema);.  destroyR
12f80 6f 6f 74 50 61 67 65 28 70 50 61 72 73 65 2c 20  ootPage(pParse, 
12f90 70 54 61 62 2d 3e 74 6e 75 6d 2c 20 69 44 62 29  pTab->tnum, iDb)
12fa0 3b 0a 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61  ;.  for(pIdx=pTa
12fb0 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b  b->pIndex; pIdx;
12fc0 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78   pIdx=pIdx->pNex
12fd0 74 29 7b 0a 20 20 20 20 64 65 73 74 72 6f 79 52  t){.    destroyR
12fe0 6f 6f 74 50 61 67 65 28 70 50 61 72 73 65 2c 20  ootPage(pParse, 
12ff0 70 49 64 78 2d 3e 74 6e 75 6d 2c 20 69 44 62 29  pIdx->tnum, iDb)
13000 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20 2f 2a  ;.  }.#else.  /*
13010 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65   If the database
13020 20 6d 61 79 20 62 65 20 61 75 74 6f 2d 76 61 63   may be auto-vac
13030 75 75 6d 20 63 61 70 61 62 6c 65 20 28 69 66 20  uum capable (if 
13040 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
13050 56 41 43 55 55 4d 0a 20 20 2a 2a 20 69 73 20 6e  VACUUM.  ** is n
13060 6f 74 20 64 65 66 69 6e 65 64 29 2c 20 74 68 65  ot defined), the
13070 6e 20 69 74 20 69 73 20 69 6d 70 6f 72 74 61 6e  n it is importan
13080 74 20 74 6f 20 63 61 6c 6c 20 4f 50 5f 44 65 73  t to call OP_Des
13090 74 72 6f 79 20 6f 6e 20 74 68 65 0a 20 20 2a 2a  troy on the.  **
130a0 20 74 61 62 6c 65 20 61 6e 64 20 69 6e 64 65 78   table and index
130b0 20 72 6f 6f 74 2d 70 61 67 65 73 20 69 6e 20 6f   root-pages in o
130c0 72 64 65 72 2c 20 73 74 61 72 74 69 6e 67 20 77  rder, starting w
130d0 69 74 68 20 74 68 65 20 6e 75 6d 65 72 69 63 61  ith the numerica
130e0 6c 6c 79 20 0a 20 20 2a 2a 20 6c 61 72 67 65 73  lly .  ** larges
130f0 74 20 72 6f 6f 74 2d 70 61 67 65 20 6e 75 6d 62  t root-page numb
13100 65 72 2e 20 54 68 69 73 20 67 75 61 72 61 6e 74  er. This guarant
13110 65 65 73 20 74 68 61 74 20 6e 6f 6e 65 20 6f 66  ees that none of
13120 20 74 68 65 20 72 6f 6f 74 2d 70 61 67 65 73 0a   the root-pages.
13130 20 20 2a 2a 20 74 6f 20 62 65 20 64 65 73 74 72    ** to be destr
13140 6f 79 65 64 20 69 73 20 72 65 6c 6f 63 61 74 65  oyed is relocate
13150 64 20 62 79 20 61 6e 20 65 61 72 6c 69 65 72 20  d by an earlier 
13160 4f 50 5f 44 65 73 74 72 6f 79 2e 20 69 2e 65 2e  OP_Destroy. i.e.
13170 20 69 66 20 74 68 65 0a 20 20 2a 2a 20 66 6f 6c   if the.  ** fol
13180 6c 6f 77 69 6e 67 20 77 65 72 65 20 63 6f 64 65  lowing were code
13190 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4f 50 5f  d:.  **.  ** OP_
131a0 44 65 73 74 72 6f 79 20 34 20 30 0a 20 20 2a 2a  Destroy 4 0.  **
131b0 20 2e 2e 2e 0a 20 20 2a 2a 20 4f 50 5f 44 65 73   ....  ** OP_Des
131c0 74 72 6f 79 20 35 20 30 0a 20 20 2a 2a 0a 20 20  troy 5 0.  **.  
131d0 2a 2a 20 61 6e 64 20 72 6f 6f 74 20 70 61 67 65  ** and root page
131e0 20 35 20 68 61 70 70 65 6e 65 64 20 74 6f 20 62   5 happened to b
131f0 65 20 74 68 65 20 6c 61 72 67 65 73 74 20 72 6f  e the largest ro
13200 6f 74 2d 70 61 67 65 20 6e 75 6d 62 65 72 20 69  ot-page number i
13210 6e 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62  n the.  ** datab
13220 61 73 65 2c 20 74 68 65 6e 20 72 6f 6f 74 20 70  ase, then root p
13230 61 67 65 20 35 20 77 6f 75 6c 64 20 62 65 20 6d  age 5 would be m
13240 6f 76 65 64 20 74 6f 20 70 61 67 65 20 34 20 62  oved to page 4 b
13250 79 20 74 68 65 20 0a 20 20 2a 2a 20 22 4f 50 5f  y the .  ** "OP_
13260 44 65 73 74 72 6f 79 20 34 20 30 22 20 6f 70 63  Destroy 4 0" opc
13270 6f 64 65 2e 20 54 68 65 20 73 75 62 73 65 71 75  ode. The subsequ
13280 65 6e 74 20 22 4f 50 5f 44 65 73 74 72 6f 79 20  ent "OP_Destroy 
13290 35 20 30 22 20 77 6f 75 6c 64 20 68 69 74 0a 20  5 0" would hit. 
132a0 20 2a 2a 20 61 20 66 72 65 65 2d 6c 69 73 74 20   ** a free-list 
132b0 70 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 6e 74  page..  */.  int
132c0 20 69 54 61 62 20 3d 20 70 54 61 62 2d 3e 74 6e   iTab = pTab->tn
132d0 75 6d 3b 0a 20 20 69 6e 74 20 69 44 65 73 74 72  um;.  int iDestr
132e0 6f 79 65 64 20 3d 20 30 3b 0a 0a 20 20 77 68 69  oyed = 0;..  whi
132f0 6c 65 28 20 31 20 29 7b 0a 20 20 20 20 49 6e 64  le( 1 ){.    Ind
13300 65 78 20 2a 70 49 64 78 3b 0a 20 20 20 20 69 6e  ex *pIdx;.    in
13310 74 20 69 4c 61 72 67 65 73 74 20 3d 20 30 3b 0a  t iLargest = 0;.
13320 0a 20 20 20 20 69 66 28 20 69 44 65 73 74 72 6f  .    if( iDestro
13330 79 65 64 3d 3d 30 20 7c 7c 20 69 54 61 62 3c 69  yed==0 || iTab<i
13340 44 65 73 74 72 6f 79 65 64 20 29 7b 0a 20 20 20  Destroyed ){.   
13350 20 20 20 69 4c 61 72 67 65 73 74 20 3d 20 69 54     iLargest = iT
13360 61 62 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f  ab;.    }.    fo
13370 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e  r(pIdx=pTab->pIn
13380 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d  dex; pIdx; pIdx=
13390 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  pIdx->pNext){.  
133a0 20 20 20 20 69 6e 74 20 69 49 64 78 20 3d 20 70      int iIdx = p
133b0 49 64 78 2d 3e 74 6e 75 6d 3b 0a 20 20 20 20 20  Idx->tnum;.     
133c0 20 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e 70   assert( pIdx->p
133d0 53 63 68 65 6d 61 3d 3d 70 54 61 62 2d 3e 70 53  Schema==pTab->pS
133e0 63 68 65 6d 61 20 29 3b 0a 20 20 20 20 20 20 69  chema );.      i
133f0 66 28 20 28 69 44 65 73 74 72 6f 79 65 64 3d 3d  f( (iDestroyed==
13400 30 20 7c 7c 20 28 69 49 64 78 3c 69 44 65 73 74  0 || (iIdx<iDest
13410 72 6f 79 65 64 29 29 20 26 26 20 69 49 64 78 3e  royed)) && iIdx>
13420 69 4c 61 72 67 65 73 74 20 29 7b 0a 20 20 20 20  iLargest ){.    
13430 20 20 20 20 69 4c 61 72 67 65 73 74 20 3d 20 69      iLargest = i
13440 49 64 78 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  Idx;.      }.   
13450 20 7d 0a 20 20 20 20 69 66 28 20 69 4c 61 72 67   }.    if( iLarg
13460 65 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  est==0 ){.      
13470 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 65 6c 73  return;.    }els
13480 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 44 62  e{.      int iDb
13490 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61   = sqlite3Schema
134a0 54 6f 49 6e 64 65 78 28 70 50 61 72 73 65 2d 3e  ToIndex(pParse->
134b0 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d  db, pTab->pSchem
134c0 61 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  a);.      assert
134d0 28 20 69 44 62 3e 3d 30 20 26 26 20 69 44 62 3c  ( iDb>=0 && iDb<
134e0 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6e 44 62 20  pParse->db->nDb 
134f0 29 3b 0a 20 20 20 20 20 20 64 65 73 74 72 6f 79  );.      destroy
13500 52 6f 6f 74 50 61 67 65 28 70 50 61 72 73 65 2c  RootPage(pParse,
13510 20 69 4c 61 72 67 65 73 74 2c 20 69 44 62 29 3b   iLargest, iDb);
13520 0a 20 20 20 20 20 20 69 44 65 73 74 72 6f 79 65  .      iDestroye
13530 64 20 3d 20 69 4c 61 72 67 65 73 74 3b 0a 20 20  d = iLargest;.  
13540 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d    }.  }.#endif.}
13550 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 65  ../*.** Remove e
13560 6e 74 72 69 65 73 20 66 72 6f 6d 20 74 68 65 20  ntries from the 
13570 73 71 6c 69 74 65 5f 73 74 61 74 4e 20 74 61 62  sqlite_statN tab
13580 6c 65 73 20 28 66 6f 72 20 4e 20 69 6e 20 28 31  les (for N in (1
13590 2c 32 2c 33 29 29 0a 2a 2a 20 61 66 74 65 72 20  ,2,3)).** after 
135a0 61 20 44 52 4f 50 20 49 4e 44 45 58 20 6f 72 20  a DROP INDEX or 
135b0 44 52 4f 50 20 54 41 42 4c 45 20 63 6f 6d 6d 61  DROP TABLE comma
135c0 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  nd..*/.static vo
135d0 69 64 20 73 71 6c 69 74 65 33 43 6c 65 61 72 53  id sqlite3ClearS
135e0 74 61 74 54 61 62 6c 65 73 28 0a 20 20 50 61 72  tatTables(.  Par
135f0 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
13600 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69      /* The parsi
13610 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
13620 69 6e 74 20 69 44 62 2c 20 20 20 20 20 20 20 20  int iDb,        
13630 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61         /* The da
13640 74 61 62 61 73 65 20 6e 75 6d 62 65 72 20 2a 2f  tabase number */
13650 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
13660 54 79 70 65 2c 20 20 20 20 20 2f 2a 20 22 69 64  Type,     /* "id
13670 78 22 20 6f 72 20 22 74 62 6c 22 20 2a 2f 0a 20  x" or "tbl" */. 
13680 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
13690 6d 65 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20  me      /* Name 
136a0 6f 66 20 69 6e 64 65 78 20 6f 72 20 74 61 62 6c  of index or tabl
136b0 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b  e */.){.  int i;
136c0 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
136d0 44 62 4e 61 6d 65 20 3d 20 70 50 61 72 73 65 2d  DbName = pParse-
136e0 3e 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e  >db->aDb[iDb].zN
136f0 61 6d 65 3b 0a 20 20 66 6f 72 28 69 3d 31 3b 20  ame;.  for(i=1; 
13700 69 3c 3d 34 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  i<=4; i++){.    
13710 63 68 61 72 20 7a 54 61 62 5b 32 34 5d 3b 0a 20  char zTab[24];. 
13720 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
13730 6e 74 66 28 73 69 7a 65 6f 66 28 7a 54 61 62 29  ntf(sizeof(zTab)
13740 2c 7a 54 61 62 2c 22 73 71 6c 69 74 65 5f 73 74  ,zTab,"sqlite_st
13750 61 74 25 64 22 2c 69 29 3b 0a 20 20 20 20 69 66  at%d",i);.    if
13760 28 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62  ( sqlite3FindTab
13770 6c 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 7a  le(pParse->db, z
13780 54 61 62 2c 20 7a 44 62 4e 61 6d 65 29 20 29 7b  Tab, zDbName) ){
13790 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4e 65  .      sqlite3Ne
137a0 73 74 65 64 50 61 72 73 65 28 70 50 61 72 73 65  stedParse(pParse
137b0 2c 0a 20 20 20 20 20 20 20 20 22 44 45 4c 45 54  ,.        "DELET
137c0 45 20 46 52 4f 4d 20 25 51 2e 25 73 20 57 48 45  E FROM %Q.%s WHE
137d0 52 45 20 25 73 3d 25 51 22 2c 0a 20 20 20 20 20  RE %s=%Q",.     
137e0 20 20 20 7a 44 62 4e 61 6d 65 2c 20 7a 54 61 62     zDbName, zTab
137f0 2c 20 7a 54 79 70 65 2c 20 7a 4e 61 6d 65 0a 20  , zType, zName. 
13800 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20       );.    }.  
13810 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  }.}../*.** Gener
13820 61 74 65 20 63 6f 64 65 20 74 6f 20 64 72 6f 70  ate code to drop
13830 20 61 20 74 61 62 6c 65 2e 0a 2a 2f 0a 76 6f 69   a table..*/.voi
13840 64 20 73 71 6c 69 74 65 33 43 6f 64 65 44 72 6f  d sqlite3CodeDro
13850 70 54 61 62 6c 65 28 50 61 72 73 65 20 2a 70 50  pTable(Parse *pP
13860 61 72 73 65 2c 20 54 61 62 6c 65 20 2a 70 54 61  arse, Table *pTa
13870 62 2c 20 69 6e 74 20 69 44 62 2c 20 69 6e 74 20  b, int iDb, int 
13880 69 73 56 69 65 77 29 7b 0a 20 20 56 64 62 65 20  isView){.  Vdbe 
13890 2a 76 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  *v;.  sqlite3 *d
138a0 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
138b0 20 20 54 72 69 67 67 65 72 20 2a 70 54 72 69 67    Trigger *pTrig
138c0 67 65 72 3b 0a 20 20 44 62 20 2a 70 44 62 20 3d  ger;.  Db *pDb =
138d0 20 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a   &db->aDb[iDb];.
138e0 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65  .  v = sqlite3Ge
138f0 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
13900 20 61 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b   assert( v!=0 );
13910 0a 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57  .  sqlite3BeginW
13920 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50  riteOperation(pP
13930 61 72 73 65 2c 20 31 2c 20 69 44 62 29 3b 0a 0a  arse, 1, iDb);..
13940 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
13950 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
13960 0a 20 20 69 66 28 20 49 73 56 69 72 74 75 61 6c  .  if( IsVirtual
13970 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20 73 71  (pTab) ){.    sq
13980 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 28  lite3VdbeAddOp0(
13990 76 2c 20 4f 50 5f 56 42 65 67 69 6e 29 3b 0a 20  v, OP_VBegin);. 
139a0 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
139b0 44 72 6f 70 20 61 6c 6c 20 74 72 69 67 67 65 72  Drop all trigger
139c0 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
139d0 68 20 74 68 65 20 74 61 62 6c 65 20 62 65 69 6e  h the table bein
139e0 67 20 64 72 6f 70 70 65 64 2e 20 43 6f 64 65 0a  g dropped. Code.
139f0 20 20 2a 2a 20 69 73 20 67 65 6e 65 72 61 74 65    ** is generate
13a00 64 20 74 6f 20 72 65 6d 6f 76 65 20 65 6e 74 72  d to remove entr
13a10 69 65 73 20 66 72 6f 6d 20 73 71 6c 69 74 65 5f  ies from sqlite_
13a20 6d 61 73 74 65 72 20 61 6e 64 2f 6f 72 0a 20 20  master and/or.  
13a30 2a 2a 20 73 71 6c 69 74 65 5f 74 65 6d 70 5f 6d  ** sqlite_temp_m
13a40 61 73 74 65 72 20 69 66 20 72 65 71 75 69 72 65  aster if require
13a50 64 2e 0a 20 20 2a 2f 0a 20 20 70 54 72 69 67 67  d..  */.  pTrigg
13a60 65 72 20 3d 20 73 71 6c 69 74 65 33 54 72 69 67  er = sqlite3Trig
13a70 67 65 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20  gerList(pParse, 
13a80 70 54 61 62 29 3b 0a 20 20 77 68 69 6c 65 28 20  pTab);.  while( 
13a90 70 54 72 69 67 67 65 72 20 29 7b 0a 20 20 20 20  pTrigger ){.    
13aa0 61 73 73 65 72 74 28 20 70 54 72 69 67 67 65 72  assert( pTrigger
13ab0 2d 3e 70 53 63 68 65 6d 61 3d 3d 70 54 61 62 2d  ->pSchema==pTab-
13ac0 3e 70 53 63 68 65 6d 61 20 7c 7c 20 0a 20 20 20  >pSchema || .   
13ad0 20 20 20 20 20 70 54 72 69 67 67 65 72 2d 3e 70       pTrigger->p
13ae0 53 63 68 65 6d 61 3d 3d 64 62 2d 3e 61 44 62 5b  Schema==db->aDb[
13af0 31 5d 2e 70 53 63 68 65 6d 61 20 29 3b 0a 20 20  1].pSchema );.  
13b00 20 20 73 71 6c 69 74 65 33 44 72 6f 70 54 72 69    sqlite3DropTri
13b10 67 67 65 72 50 74 72 28 70 50 61 72 73 65 2c 20  ggerPtr(pParse, 
13b20 70 54 72 69 67 67 65 72 29 3b 0a 20 20 20 20 70  pTrigger);.    p
13b30 54 72 69 67 67 65 72 20 3d 20 70 54 72 69 67 67  Trigger = pTrigg
13b40 65 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 0a  er->pNext;.  }..
13b50 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
13b60 4d 49 54 5f 41 55 54 4f 49 4e 43 52 45 4d 45 4e  MIT_AUTOINCREMEN
13b70 54 0a 20 20 2f 2a 20 52 65 6d 6f 76 65 20 61 6e  T.  /* Remove an
13b80 79 20 65 6e 74 72 69 65 73 20 6f 66 20 74 68 65  y entries of the
13b90 20 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65   sqlite_sequence
13ba0 20 74 61 62 6c 65 20 61 73 73 6f 63 69 61 74 65   table associate
13bb0 64 20 77 69 74 68 0a 20 20 2a 2a 20 74 68 65 20  d with.  ** the 
13bc0 74 61 62 6c 65 20 62 65 69 6e 67 20 64 72 6f 70  table being drop
13bd0 70 65 64 2e 20 54 68 69 73 20 69 73 20 64 6f 6e  ped. This is don
13be0 65 20 62 65 66 6f 72 65 20 74 68 65 20 74 61 62  e before the tab
13bf0 6c 65 20 69 73 20 64 72 6f 70 70 65 64 0a 20 20  le is dropped.  
13c00 2a 2a 20 61 74 20 74 68 65 20 62 74 72 65 65 20  ** at the btree 
13c10 6c 65 76 65 6c 2c 20 69 6e 20 63 61 73 65 20 74  level, in case t
13c20 68 65 20 73 71 6c 69 74 65 5f 73 65 71 75 65 6e  he sqlite_sequen
13c30 63 65 20 74 61 62 6c 65 20 6e 65 65 64 73 20 74  ce table needs t
13c40 6f 0a 20 20 2a 2a 20 6d 6f 76 65 20 61 73 20 61  o.  ** move as a
13c50 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20 64   result of the d
13c60 72 6f 70 20 28 63 61 6e 20 68 61 70 70 65 6e 20  rop (can happen 
13c70 69 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 6d  in auto-vacuum m
13c80 6f 64 65 29 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ode)..  */.  if(
13c90 20 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20   pTab->tabFlags 
13ca0 26 20 54 46 5f 41 75 74 6f 69 6e 63 72 65 6d 65  & TF_Autoincreme
13cb0 6e 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  nt ){.    sqlite
13cc0 33 4e 65 73 74 65 64 50 61 72 73 65 28 70 50 61  3NestedParse(pPa
13cd0 72 73 65 2c 0a 20 20 20 20 20 20 22 44 45 4c 45  rse,.      "DELE
13ce0 54 45 20 46 52 4f 4d 20 25 51 2e 73 71 6c 69 74  TE FROM %Q.sqlit
13cf0 65 5f 73 65 71 75 65 6e 63 65 20 57 48 45 52 45  e_sequence WHERE
13d00 20 6e 61 6d 65 3d 25 51 22 2c 0a 20 20 20 20 20   name=%Q",.     
13d10 20 70 44 62 2d 3e 7a 4e 61 6d 65 2c 20 70 54 61   pDb->zName, pTa
13d20 62 2d 3e 7a 4e 61 6d 65 0a 20 20 20 20 29 3b 0a  b->zName.    );.
13d30 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a    }.#endif..  /*
13d40 20 44 72 6f 70 20 61 6c 6c 20 53 51 4c 49 54 45   Drop all SQLITE
13d50 5f 4d 41 53 54 45 52 20 74 61 62 6c 65 20 61 6e  _MASTER table an
13d60 64 20 69 6e 64 65 78 20 65 6e 74 72 69 65 73 20  d index entries 
13d70 74 68 61 74 20 72 65 66 65 72 20 74 6f 20 74 68  that refer to th
13d80 65 0a 20 20 2a 2a 20 74 61 62 6c 65 2e 20 54 68  e.  ** table. Th
13d90 65 20 70 72 6f 67 72 61 6d 20 6e 61 6d 65 20 6c  e program name l
13da0 6f 6f 70 73 20 74 68 72 6f 75 67 68 20 74 68 65  oops through the
13db0 20 6d 61 73 74 65 72 20 74 61 62 6c 65 20 61 6e   master table an
13dc0 64 20 64 65 6c 65 74 65 73 0a 20 20 2a 2a 20 65  d deletes.  ** e
13dd0 76 65 72 79 20 72 6f 77 20 74 68 61 74 20 72 65  very row that re
13de0 66 65 72 73 20 74 6f 20 61 20 74 61 62 6c 65 20  fers to a table 
13df0 6f 66 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65  of the same name
13e00 20 61 73 20 74 68 65 20 6f 6e 65 20 62 65 69 6e   as the one bein
13e10 67 0a 20 20 2a 2a 20 64 72 6f 70 70 65 64 2e 20  g.  ** dropped. 
13e20 54 72 69 67 67 65 72 73 20 61 72 65 20 68 61 6e  Triggers are han
13e30 64 6c 65 64 20 73 65 70 61 72 61 74 65 6c 79 20  dled separately 
13e40 62 65 63 61 75 73 65 20 61 20 74 72 69 67 67 65  because a trigge
13e50 72 20 63 61 6e 20 62 65 0a 20 20 2a 2a 20 63 72  r can be.  ** cr
13e60 65 61 74 65 64 20 69 6e 20 74 68 65 20 74 65 6d  eated in the tem
13e70 70 20 64 61 74 61 62 61 73 65 20 74 68 61 74 20  p database that 
13e80 72 65 66 65 72 73 20 74 6f 20 61 20 74 61 62 6c  refers to a tabl
13e90 65 20 69 6e 20 61 6e 6f 74 68 65 72 0a 20 20 2a  e in another.  *
13ea0 2a 20 64 61 74 61 62 61 73 65 2e 0a 20 20 2a 2f  * database..  */
13eb0 0a 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64  .  sqlite3Nested
13ec0 50 61 72 73 65 28 70 50 61 72 73 65 2c 20 0a 20  Parse(pParse, . 
13ed0 20 20 20 20 20 22 44 45 4c 45 54 45 20 46 52 4f       "DELETE FRO
13ee0 4d 20 25 51 2e 25 73 20 57 48 45 52 45 20 74 62  M %Q.%s WHERE tb
13ef0 6c 5f 6e 61 6d 65 3d 25 51 20 61 6e 64 20 74 79  l_name=%Q and ty
13f00 70 65 21 3d 27 74 72 69 67 67 65 72 27 22 2c 0a  pe!='trigger'",.
13f10 20 20 20 20 20 20 70 44 62 2d 3e 7a 4e 61 6d 65        pDb->zName
13f20 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69  , SCHEMA_TABLE(i
13f30 44 62 29 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  Db), pTab->zName
13f40 29 3b 0a 20 20 69 66 28 20 21 69 73 56 69 65 77  );.  if( !isView
13f50 20 26 26 20 21 49 73 56 69 72 74 75 61 6c 28 70   && !IsVirtual(p
13f60 54 61 62 29 20 29 7b 0a 20 20 20 20 64 65 73 74  Tab) ){.    dest
13f70 72 6f 79 54 61 62 6c 65 28 70 50 61 72 73 65 2c  royTable(pParse,
13f80 20 70 54 61 62 29 3b 0a 20 20 7d 0a 0a 20 20 2f   pTab);.  }..  /
13f90 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 74 61 62  * Remove the tab
13fa0 6c 65 20 65 6e 74 72 79 20 66 72 6f 6d 20 53 51  le entry from SQ
13fb0 4c 69 74 65 27 73 20 69 6e 74 65 72 6e 61 6c 20  Lite's internal 
13fc0 73 63 68 65 6d 61 20 61 6e 64 20 6d 6f 64 69 66  schema and modif
13fd0 79 0a 20 20 2a 2a 20 74 68 65 20 73 63 68 65 6d  y.  ** the schem
13fe0 61 20 63 6f 6f 6b 69 65 2e 0a 20 20 2a 2f 0a 20  a cookie..  */. 
13ff0 20 69 66 28 20 49 73 56 69 72 74 75 61 6c 28 70   if( IsVirtual(p
14000 54 61 62 29 20 29 7b 0a 20 20 20 20 73 71 6c 69  Tab) ){.    sqli
14010 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
14020 20 4f 50 5f 56 44 65 73 74 72 6f 79 2c 20 69 44   OP_VDestroy, iD
14030 62 2c 20 30 2c 20 30 2c 20 70 54 61 62 2d 3e 7a  b, 0, 0, pTab->z
14040 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 7d 0a 20 20  Name, 0);.  }.  
14050 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
14060 34 28 76 2c 20 4f 50 5f 44 72 6f 70 54 61 62 6c  4(v, OP_DropTabl
14070 65 2c 20 69 44 62 2c 20 30 2c 20 30 2c 20 70 54  e, iDb, 0, 0, pT
14080 61 62 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20  ab->zName, 0);. 
14090 20 73 71 6c 69 74 65 33 43 68 61 6e 67 65 43 6f   sqlite3ChangeCo
140a0 6f 6b 69 65 28 70 50 61 72 73 65 2c 20 69 44 62  okie(pParse, iDb
140b0 29 3b 0a 20 20 73 71 6c 69 74 65 56 69 65 77 52  );.  sqliteViewR
140c0 65 73 65 74 41 6c 6c 28 64 62 2c 20 69 44 62 29  esetAll(db, iDb)
140d0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
140e0 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
140f0 64 20 74 6f 20 64 6f 20 74 68 65 20 77 6f 72 6b  d to do the work
14100 20 6f 66 20 61 20 44 52 4f 50 20 54 41 42 4c 45   of a DROP TABLE
14110 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 70   statement..** p
14120 4e 61 6d 65 20 69 73 20 74 68 65 20 6e 61 6d 65  Name is the name
14130 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74 6f   of the table to
14140 20 62 65 20 64 72 6f 70 70 65 64 2e 0a 2a 2f 0a   be dropped..*/.
14150 76 6f 69 64 20 73 71 6c 69 74 65 33 44 72 6f 70  void sqlite3Drop
14160 54 61 62 6c 65 28 50 61 72 73 65 20 2a 70 50 61  Table(Parse *pPa
14170 72 73 65 2c 20 53 72 63 4c 69 73 74 20 2a 70 4e  rse, SrcList *pN
14180 61 6d 65 2c 20 69 6e 74 20 69 73 56 69 65 77 2c  ame, int isView,
14190 20 69 6e 74 20 6e 6f 45 72 72 29 7b 0a 20 20 54   int noErr){.  T
141a0 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 56 64  able *pTab;.  Vd
141b0 62 65 20 2a 76 3b 0a 20 20 73 71 6c 69 74 65 33  be *v;.  sqlite3
141c0 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
141d0 62 3b 0a 20 20 69 6e 74 20 69 44 62 3b 0a 0a 20  b;.  int iDb;.. 
141e0 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
141f0 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f 74  ailed ){.    got
14200 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c  o exit_drop_tabl
14210 65 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  e;.  }.  assert(
14220 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30   pParse->nErr==0
14230 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4e   );.  assert( pN
14240 61 6d 65 2d 3e 6e 53 72 63 3d 3d 31 20 29 3b 0a  ame->nSrc==1 );.
14250 20 20 69 66 28 20 73 71 6c 69 74 65 33 52 65 61    if( sqlite3Rea
14260 64 53 63 68 65 6d 61 28 70 50 61 72 73 65 29 20  dSchema(pParse) 
14270 29 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70  ) goto exit_drop
14280 5f 74 61 62 6c 65 3b 0a 20 20 69 66 28 20 6e 6f  _table;.  if( no
14290 45 72 72 20 29 20 64 62 2d 3e 73 75 70 70 72 65  Err ) db->suppre
142a0 73 73 45 72 72 2b 2b 3b 0a 20 20 70 54 61 62 20  ssErr++;.  pTab 
142b0 3d 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54  = sqlite3LocateT
142c0 61 62 6c 65 49 74 65 6d 28 70 50 61 72 73 65 2c  ableItem(pParse,
142d0 20 69 73 56 69 65 77 2c 20 26 70 4e 61 6d 65 2d   isView, &pName-
142e0 3e 61 5b 30 5d 29 3b 0a 20 20 69 66 28 20 6e 6f  >a[0]);.  if( no
142f0 45 72 72 20 29 20 64 62 2d 3e 73 75 70 70 72 65  Err ) db->suppre
14300 73 73 45 72 72 2d 2d 3b 0a 0a 20 20 69 66 28 20  ssErr--;..  if( 
14310 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 69  pTab==0 ){.    i
14320 66 28 20 6e 6f 45 72 72 20 29 20 73 71 6c 69 74  f( noErr ) sqlit
14330 65 33 43 6f 64 65 56 65 72 69 66 79 4e 61 6d 65  e3CodeVerifyName
14340 64 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20  dSchema(pParse, 
14350 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 44 61 74  pName->a[0].zDat
14360 61 62 61 73 65 29 3b 0a 20 20 20 20 67 6f 74 6f  abase);.    goto
14370 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65   exit_drop_table
14380 3b 0a 20 20 7d 0a 20 20 69 44 62 20 3d 20 73 71  ;.  }.  iDb = sq
14390 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64  lite3SchemaToInd
143a0 65 78 28 64 62 2c 20 70 54 61 62 2d 3e 70 53 63  ex(db, pTab->pSc
143b0 68 65 6d 61 29 3b 0a 20 20 61 73 73 65 72 74 28  hema);.  assert(
143c0 20 69 44 62 3e 3d 30 20 26 26 20 69 44 62 3c 64   iDb>=0 && iDb<d
143d0 62 2d 3e 6e 44 62 20 29 3b 0a 0a 20 20 2f 2a 20  b->nDb );..  /* 
143e0 49 66 20 70 54 61 62 20 69 73 20 61 20 76 69 72  If pTab is a vir
143f0 74 75 61 6c 20 74 61 62 6c 65 2c 20 63 61 6c 6c  tual table, call
14400 20 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61   ViewGetColumnNa
14410 6d 65 73 28 29 20 74 6f 20 65 6e 73 75 72 65 0a  mes() to ensure.
14420 20 20 2a 2a 20 69 74 20 69 73 20 69 6e 69 74 69    ** it is initi
14430 61 6c 69 7a 65 64 2e 0a 20 20 2a 2f 0a 20 20 69  alized..  */.  i
14440 66 28 20 49 73 56 69 72 74 75 61 6c 28 70 54 61  f( IsVirtual(pTa
14450 62 29 20 26 26 20 73 71 6c 69 74 65 33 56 69 65  b) && sqlite3Vie
14460 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28  wGetColumnNames(
14470 70 50 61 72 73 65 2c 20 70 54 61 62 29 20 29 7b  pParse, pTab) ){
14480 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64  .    goto exit_d
14490 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 23  rop_table;.  }.#
144a0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
144b0 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e  IT_AUTHORIZATION
144c0 0a 20 20 7b 0a 20 20 20 20 69 6e 74 20 63 6f 64  .  {.    int cod
144d0 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  e;.    const cha
144e0 72 20 2a 7a 54 61 62 20 3d 20 53 43 48 45 4d 41  r *zTab = SCHEMA
144f0 5f 54 41 42 4c 45 28 69 44 62 29 3b 0a 20 20 20  _TABLE(iDb);.   
14500 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62   const char *zDb
14510 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e   = db->aDb[iDb].
14520 7a 4e 61 6d 65 3b 0a 20 20 20 20 63 6f 6e 73 74  zName;.    const
14530 20 63 68 61 72 20 2a 7a 41 72 67 32 20 3d 20 30   char *zArg2 = 0
14540 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
14550 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73  3AuthCheck(pPars
14560 65 2c 20 53 51 4c 49 54 45 5f 44 45 4c 45 54 45  e, SQLITE_DELETE
14570 2c 20 7a 54 61 62 2c 20 30 2c 20 7a 44 62 29 29  , zTab, 0, zDb))
14580 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69  {.      goto exi
14590 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20  t_drop_table;.  
145a0 20 20 7d 0a 20 20 20 20 69 66 28 20 69 73 56 69    }.    if( isVi
145b0 65 77 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ew ){.      if( 
145c0 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26 26 20  !OMIT_TEMPDB && 
145d0 69 44 62 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20  iDb==1 ){.      
145e0 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f    code = SQLITE_
145f0 44 52 4f 50 5f 54 45 4d 50 5f 56 49 45 57 3b 0a  DROP_TEMP_VIEW;.
14600 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
14610 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49       code = SQLI
14620 54 45 5f 44 52 4f 50 5f 56 49 45 57 3b 0a 20 20  TE_DROP_VIEW;.  
14630 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51      }.#ifndef SQ
14640 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
14650 4c 54 41 42 4c 45 0a 20 20 20 20 7d 65 6c 73 65  LTABLE.    }else
14660 20 69 66 28 20 49 73 56 69 72 74 75 61 6c 28 70   if( IsVirtual(p
14670 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20 63 6f  Tab) ){.      co
14680 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50  de = SQLITE_DROP
14690 5f 56 54 41 42 4c 45 3b 0a 20 20 20 20 20 20 7a  _VTABLE;.      z
146a0 41 72 67 32 20 3d 20 73 71 6c 69 74 65 33 47 65  Arg2 = sqlite3Ge
146b0 74 56 54 61 62 6c 65 28 64 62 2c 20 70 54 61 62  tVTable(db, pTab
146c0 29 2d 3e 70 4d 6f 64 2d 3e 7a 4e 61 6d 65 3b 0a  )->pMod->zName;.
146d0 23 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c 73 65  #endif.    }else
146e0 7b 0a 20 20 20 20 20 20 69 66 28 20 21 4f 4d 49  {.      if( !OMI
146f0 54 5f 54 45 4d 50 44 42 20 26 26 20 69 44 62 3d  T_TEMPDB && iDb=
14700 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f  =1 ){.        co
14710 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50  de = SQLITE_DROP
14720 5f 54 45 4d 50 5f 54 41 42 4c 45 3b 0a 20 20 20  _TEMP_TABLE;.   
14730 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
14740 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f    code = SQLITE_
14750 44 52 4f 50 5f 54 41 42 4c 45 3b 0a 20 20 20 20  DROP_TABLE;.    
14760 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
14770 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65  ( sqlite3AuthChe
14780 63 6b 28 70 50 61 72 73 65 2c 20 63 6f 64 65 2c  ck(pParse, code,
14790 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 41   pTab->zName, zA
147a0 72 67 32 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20  rg2, zDb) ){.   
147b0 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f     goto exit_dro
147c0 70 5f 74 61 62 6c 65 3b 0a 20 20 20 20 7d 0a 20  p_table;.    }. 
147d0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75     if( sqlite3Au
147e0 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  thCheck(pParse, 
147f0 53 51 4c 49 54 45 5f 44 45 4c 45 54 45 2c 20 70  SQLITE_DELETE, p
14800 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 30 2c 20 7a  Tab->zName, 0, z
14810 44 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  Db) ){.      got
14820 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c  o exit_drop_tabl
14830 65 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  e;.    }.  }.#en
14840 64 69 66 0a 20 20 69 66 28 20 73 71 6c 69 74 65  dif.  if( sqlite
14850 33 53 74 72 4e 49 43 6d 70 28 70 54 61 62 2d 3e  3StrNICmp(pTab->
14860 7a 4e 61 6d 65 2c 20 22 73 71 6c 69 74 65 5f 22  zName, "sqlite_"
14870 2c 20 37 29 3d 3d 30 20 0a 20 20 20 20 26 26 20  , 7)==0 .    && 
14880 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28  sqlite3StrNICmp(
14890 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 22 73 71  pTab->zName, "sq
148a0 6c 69 74 65 5f 73 74 61 74 22 2c 20 31 31 29 21  lite_stat", 11)!
148b0 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
148c0 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
148d0 2c 20 22 74 61 62 6c 65 20 25 73 20 6d 61 79 20  , "table %s may 
148e0 6e 6f 74 20 62 65 20 64 72 6f 70 70 65 64 22 2c  not be dropped",
148f0 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20   pTab->zName);. 
14900 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f     goto exit_dro
14910 70 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 0a 23 69  p_table;.  }..#i
14920 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
14930 54 5f 56 49 45 57 0a 20 20 2f 2a 20 45 6e 73 75  T_VIEW.  /* Ensu
14940 72 65 20 44 52 4f 50 20 54 41 42 4c 45 20 69 73  re DROP TABLE is
14950 20 6e 6f 74 20 75 73 65 64 20 6f 6e 20 61 20 76   not used on a v
14960 69 65 77 2c 20 61 6e 64 20 44 52 4f 50 20 56 49  iew, and DROP VI
14970 45 57 20 69 73 20 6e 6f 74 20 75 73 65 64 0a 20  EW is not used. 
14980 20 2a 2a 20 6f 6e 20 61 20 74 61 62 6c 65 2e 0a   ** on a table..
14990 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 56 69 65    */.  if( isVie
149a0 77 20 26 26 20 70 54 61 62 2d 3e 70 53 65 6c 65  w && pTab->pSele
149b0 63 74 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  ct==0 ){.    sql
149c0 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
149d0 72 73 65 2c 20 22 75 73 65 20 44 52 4f 50 20 54  rse, "use DROP T
149e0 41 42 4c 45 20 74 6f 20 64 65 6c 65 74 65 20 74  ABLE to delete t
149f0 61 62 6c 65 20 25 73 22 2c 20 70 54 61 62 2d 3e  able %s", pTab->
14a00 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f  zName);.    goto
14a10 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65   exit_drop_table
14a20 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 69 73 56  ;.  }.  if( !isV
14a30 69 65 77 20 26 26 20 70 54 61 62 2d 3e 70 53 65  iew && pTab->pSe
14a40 6c 65 63 74 20 29 7b 0a 20 20 20 20 73 71 6c 69  lect ){.    sqli
14a50 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
14a60 73 65 2c 20 22 75 73 65 20 44 52 4f 50 20 56 49  se, "use DROP VI
14a70 45 57 20 74 6f 20 64 65 6c 65 74 65 20 76 69 65  EW to delete vie
14a80 77 20 25 73 22 2c 20 70 54 61 62 2d 3e 7a 4e 61  w %s", pTab->zNa
14a90 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78  me);.    goto ex
14aa0 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20  it_drop_table;. 
14ab0 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
14ac0 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  Generate code to
14ad0 20 72 65 6d 6f 76 65 20 74 68 65 20 74 61 62 6c   remove the tabl
14ae0 65 20 66 72 6f 6d 20 74 68 65 20 6d 61 73 74 65  e from the maste
14af0 72 20 74 61 62 6c 65 0a 20 20 2a 2a 20 6f 6e 20  r table.  ** on 
14b00 64 69 73 6b 2e 0a 20 20 2a 2f 0a 20 20 76 20 3d  disk..  */.  v =
14b10 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
14b20 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76  pParse);.  if( v
14b30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42   ){.    sqlite3B
14b40 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69  eginWriteOperati
14b50 6f 6e 28 70 50 61 72 73 65 2c 20 31 2c 20 69 44  on(pParse, 1, iD
14b60 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 43  b);.    sqlite3C
14b70 6c 65 61 72 53 74 61 74 54 61 62 6c 65 73 28 70  learStatTables(p
14b80 50 61 72 73 65 2c 20 69 44 62 2c 20 22 74 62 6c  Parse, iDb, "tbl
14b90 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b  ", pTab->zName);
14ba0 0a 20 20 20 20 73 71 6c 69 74 65 33 46 6b 44 72  .    sqlite3FkDr
14bb0 6f 70 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20  opTable(pParse, 
14bc0 70 4e 61 6d 65 2c 20 70 54 61 62 29 3b 0a 20 20  pName, pTab);.  
14bd0 20 20 73 71 6c 69 74 65 33 43 6f 64 65 44 72 6f    sqlite3CodeDro
14be0 70 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70  pTable(pParse, p
14bf0 54 61 62 2c 20 69 44 62 2c 20 69 73 56 69 65 77  Tab, iDb, isView
14c00 29 3b 0a 20 20 7d 0a 0a 65 78 69 74 5f 64 72 6f  );.  }..exit_dro
14c10 70 5f 74 61 62 6c 65 3a 0a 20 20 73 71 6c 69 74  p_table:.  sqlit
14c20 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28  e3SrcListDelete(
14c30 64 62 2c 20 70 4e 61 6d 65 29 3b 0a 7d 0a 0a 2f  db, pName);.}../
14c40 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
14c50 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 63  e is called to c
14c60 72 65 61 74 65 20 61 20 6e 65 77 20 66 6f 72 65  reate a new fore
14c70 69 67 6e 20 6b 65 79 20 6f 6e 20 74 68 65 20 74  ign key on the t
14c80 61 62 6c 65 0a 2a 2a 20 63 75 72 72 65 6e 74 6c  able.** currentl
14c90 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63  y under construc
14ca0 74 69 6f 6e 2e 20 20 70 46 72 6f 6d 43 6f 6c 20  tion.  pFromCol 
14cb0 64 65 74 65 72 6d 69 6e 65 73 20 77 68 69 63 68  determines which
14cc0 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 69 6e 20 74   columns.** in t
14cd0 68 65 20 63 75 72 72 65 6e 74 20 74 61 62 6c 65  he current table
14ce0 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 66 6f   point to the fo
14cf0 72 65 69 67 6e 20 6b 65 79 2e 20 20 49 66 20 70  reign key.  If p
14d00 46 72 6f 6d 43 6f 6c 3d 3d 30 20 74 68 65 6e 0a  FromCol==0 then.
14d10 2a 2a 20 63 6f 6e 6e 65 63 74 20 74 68 65 20 6b  ** connect the k
14d20 65 79 20 74 6f 20 74 68 65 20 6c 61 73 74 20 63  ey to the last c
14d30 6f 6c 75 6d 6e 20 69 6e 73 65 72 74 65 64 2e 20  olumn inserted. 
14d40 20 70 54 6f 20 69 73 20 74 68 65 20 6e 61 6d 65   pTo is the name
14d50 20 6f 66 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65   of.** the table
14d60 20 72 65 66 65 72 72 65 64 20 74 6f 20 28 61 2e   referred to (a.
14d70 6b 2e 61 20 74 68 65 20 22 70 61 72 65 6e 74 22  k.a the "parent"
14d80 20 74 61 62 6c 65 29 2e 20 20 70 54 6f 43 6f 6c   table).  pToCol
14d90 20 69 73 20 61 20 6c 69 73 74 0a 2a 2a 20 6f 66   is a list.** of
14da0 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20 70   tables in the p
14db0 61 72 65 6e 74 20 70 54 6f 20 74 61 62 6c 65 2e  arent pTo table.
14dc0 20 20 66 6c 61 67 73 20 63 6f 6e 74 61 69 6e 73    flags contains
14dd0 20 61 6c 6c 0a 2a 2a 20 69 6e 66 6f 72 6d 61 74   all.** informat
14de0 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 63 6f  ion about the co
14df0 6e 66 6c 69 63 74 20 72 65 73 6f 6c 75 74 69 6f  nflict resolutio
14e00 6e 20 61 6c 67 6f 72 69 74 68 6d 73 20 73 70 65  n algorithms spe
14e10 63 69 66 69 65 64 0a 2a 2a 20 69 6e 20 74 68 65  cified.** in the
14e20 20 4f 4e 20 44 45 4c 45 54 45 2c 20 4f 4e 20 55   ON DELETE, ON U
14e30 50 44 41 54 45 20 61 6e 64 20 4f 4e 20 49 4e 53  PDATE and ON INS
14e40 45 52 54 20 63 6c 61 75 73 65 73 2e 0a 2a 2a 0a  ERT clauses..**.
14e50 2a 2a 20 41 6e 20 46 4b 65 79 20 73 74 72 75 63  ** An FKey struc
14e60 74 75 72 65 20 69 73 20 63 72 65 61 74 65 64 20  ture is created 
14e70 61 6e 64 20 61 64 64 65 64 20 74 6f 20 74 68 65  and added to the
14e80 20 74 61 62 6c 65 20 63 75 72 72 65 6e 74 6c 79   table currently
14e90 0a 2a 2a 20 75 6e 64 65 72 20 63 6f 6e 73 74 72  .** under constr
14ea0 75 63 74 69 6f 6e 20 69 6e 20 74 68 65 20 70 50  uction in the pP
14eb0 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20  arse->pNewTable 
14ec0 66 69 65 6c 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  field..**.** The
14ed0 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 69 73 20   foreign key is 
14ee0 73 65 74 20 66 6f 72 20 49 4d 4d 45 44 49 41 54  set for IMMEDIAT
14ef0 45 20 70 72 6f 63 65 73 73 69 6e 67 2e 20 20 41  E processing.  A
14f00 20 73 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c   subsequent call
14f10 0a 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33 44 65  .** to sqlite3De
14f20 66 65 72 46 6f 72 65 69 67 6e 4b 65 79 28 29 20  ferForeignKey() 
14f30 6d 69 67 68 74 20 63 68 61 6e 67 65 20 74 68 69  might change thi
14f40 73 20 74 6f 20 44 45 46 45 52 52 45 44 2e 0a 2a  s to DEFERRED..*
14f50 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 72  /.void sqlite3Cr
14f60 65 61 74 65 46 6f 72 65 69 67 6e 4b 65 79 28 0a  eateForeignKey(.
14f70 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
14f80 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
14f90 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45  g context */.  E
14fa0 78 70 72 4c 69 73 74 20 2a 70 46 72 6f 6d 43 6f  xprList *pFromCo
14fb0 6c 2c 20 20 2f 2a 20 43 6f 6c 75 6d 6e 73 20 69  l,  /* Columns i
14fc0 6e 20 74 68 69 73 20 74 61 62 6c 65 20 74 68 61  n this table tha
14fd0 74 20 70 6f 69 6e 74 20 74 6f 20 6f 74 68 65 72  t point to other
14fe0 20 74 61 62 6c 65 20 2a 2f 0a 20 20 54 6f 6b 65   table */.  Toke
14ff0 6e 20 2a 70 54 6f 2c 20 20 20 20 20 20 20 20 20  n *pTo,         
15000 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
15010 6f 74 68 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20  other table */. 
15020 20 45 78 70 72 4c 69 73 74 20 2a 70 54 6f 43 6f   ExprList *pToCo
15030 6c 2c 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 73  l,    /* Columns
15040 20 69 6e 20 74 68 65 20 6f 74 68 65 72 20 74 61   in the other ta
15050 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61  ble */.  int fla
15060 67 73 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  gs            /*
15070 20 43 6f 6e 66 6c 69 63 74 20 72 65 73 6f 6c 75   Conflict resolu
15080 74 69 6f 6e 20 61 6c 67 6f 72 69 74 68 6d 73 2e  tion algorithms.
15090 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33   */.){.  sqlite3
150a0 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
150b0 62 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  b;.#ifndef SQLIT
150c0 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b  E_OMIT_FOREIGN_K
150d0 45 59 0a 20 20 46 4b 65 79 20 2a 70 46 4b 65 79  EY.  FKey *pFKey
150e0 20 3d 20 30 3b 0a 20 20 46 4b 65 79 20 2a 70 4e   = 0;.  FKey *pN
150f0 65 78 74 54 6f 3b 0a 20 20 54 61 62 6c 65 20 2a  extTo;.  Table *
15100 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  p = pParse->pNew
15110 54 61 62 6c 65 3b 0a 20 20 69 6e 74 20 6e 42 79  Table;.  int nBy
15120 74 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  te;.  int i;.  i
15130 6e 74 20 6e 43 6f 6c 3b 0a 20 20 63 68 61 72 20  nt nCol;.  char 
15140 2a 7a 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  *z;..  assert( p
15150 54 6f 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  To!=0 );.  if( p
15160 3d 3d 30 20 7c 7c 20 49 4e 5f 44 45 43 4c 41 52  ==0 || IN_DECLAR
15170 45 5f 56 54 41 42 20 29 20 67 6f 74 6f 20 66 6b  E_VTAB ) goto fk
15180 5f 65 6e 64 3b 0a 20 20 69 66 28 20 70 46 72 6f  _end;.  if( pFro
15190 6d 43 6f 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 69  mCol==0 ){.    i
151a0 6e 74 20 69 43 6f 6c 20 3d 20 70 2d 3e 6e 43 6f  nt iCol = p->nCo
151b0 6c 2d 31 3b 0a 20 20 20 20 69 66 28 20 4e 45 56  l-1;.    if( NEV
151c0 45 52 28 69 43 6f 6c 3c 30 29 20 29 20 67 6f 74  ER(iCol<0) ) got
151d0 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 20 20 69 66  o fk_end;.    if
151e0 28 20 70 54 6f 43 6f 6c 20 26 26 20 70 54 6f 43  ( pToCol && pToC
151f0 6f 6c 2d 3e 6e 45 78 70 72 21 3d 31 20 29 7b 0a  ol->nExpr!=1 ){.
15200 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
15210 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 66  orMsg(pParse, "f
15220 6f 72 65 69 67 6e 20 6b 65 79 20 6f 6e 20 25 73  oreign key on %s
15230 22 0a 20 20 20 20 20 20 20 20 20 22 20 73 68 6f  ".         " sho
15240 75 6c 64 20 72 65 66 65 72 65 6e 63 65 20 6f 6e  uld reference on
15250 6c 79 20 6f 6e 65 20 63 6f 6c 75 6d 6e 20 6f 66  ly one column of
15260 20 74 61 62 6c 65 20 25 54 22 2c 0a 20 20 20 20   table %T",.    
15270 20 20 20 20 20 70 2d 3e 61 43 6f 6c 5b 69 43 6f       p->aCol[iCo
15280 6c 5d 2e 7a 4e 61 6d 65 2c 20 70 54 6f 29 3b 0a  l].zName, pTo);.
15290 20 20 20 20 20 20 67 6f 74 6f 20 66 6b 5f 65 6e        goto fk_en
152a0 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 43 6f  d;.    }.    nCo
152b0 6c 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 20 69  l = 1;.  }else i
152c0 66 28 20 70 54 6f 43 6f 6c 20 26 26 20 70 54 6f  f( pToCol && pTo
152d0 43 6f 6c 2d 3e 6e 45 78 70 72 21 3d 70 46 72 6f  Col->nExpr!=pFro
152e0 6d 43 6f 6c 2d 3e 6e 45 78 70 72 20 29 7b 0a 20  mCol->nExpr ){. 
152f0 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
15300 73 67 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20  sg(pParse,.     
15310 20 20 20 22 6e 75 6d 62 65 72 20 6f 66 20 63 6f     "number of co
15320 6c 75 6d 6e 73 20 69 6e 20 66 6f 72 65 69 67 6e  lumns in foreign
15330 20 6b 65 79 20 64 6f 65 73 20 6e 6f 74 20 6d 61   key does not ma
15340 74 63 68 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  tch the number o
15350 66 20 22 0a 20 20 20 20 20 20 20 20 22 63 6f 6c  f ".        "col
15360 75 6d 6e 73 20 69 6e 20 74 68 65 20 72 65 66 65  umns in the refe
15370 72 65 6e 63 65 64 20 74 61 62 6c 65 22 29 3b 0a  renced table");.
15380 20 20 20 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b      goto fk_end;
15390 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 43  .  }else{.    nC
153a0 6f 6c 20 3d 20 70 46 72 6f 6d 43 6f 6c 2d 3e 6e  ol = pFromCol->n
153b0 45 78 70 72 3b 0a 20 20 7d 0a 20 20 6e 42 79 74  Expr;.  }.  nByt
153c0 65 20 3d 20 73 69 7a 65 6f 66 28 2a 70 46 4b 65  e = sizeof(*pFKe
153d0 79 29 20 2b 20 28 6e 43 6f 6c 2d 31 29 2a 73 69  y) + (nCol-1)*si
153e0 7a 65 6f 66 28 70 46 4b 65 79 2d 3e 61 43 6f 6c  zeof(pFKey->aCol
153f0 5b 30 5d 29 20 2b 20 70 54 6f 2d 3e 6e 20 2b 20  [0]) + pTo->n + 
15400 31 3b 0a 20 20 69 66 28 20 70 54 6f 43 6f 6c 20  1;.  if( pToCol 
15410 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  ){.    for(i=0; 
15420 69 3c 70 54 6f 43 6f 6c 2d 3e 6e 45 78 70 72 3b  i<pToCol->nExpr;
15430 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 6e 42 79   i++){.      nBy
15440 74 65 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72  te += sqlite3Str
15450 6c 65 6e 33 30 28 70 54 6f 43 6f 6c 2d 3e 61 5b  len30(pToCol->a[
15460 69 5d 2e 7a 4e 61 6d 65 29 20 2b 20 31 3b 0a 20  i].zName) + 1;. 
15470 20 20 20 7d 0a 20 20 7d 0a 20 20 70 46 4b 65 79     }.  }.  pFKey
15480 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
15490 6f 63 5a 65 72 6f 28 64 62 2c 20 6e 42 79 74 65  ocZero(db, nByte
154a0 20 29 3b 0a 20 20 69 66 28 20 70 46 4b 65 79 3d   );.  if( pFKey=
154b0 3d 30 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 66  =0 ){.    goto f
154c0 6b 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 70 46 4b  k_end;.  }.  pFK
154d0 65 79 2d 3e 70 46 72 6f 6d 20 3d 20 70 3b 0a 20  ey->pFrom = p;. 
154e0 20 70 46 4b 65 79 2d 3e 70 4e 65 78 74 46 72 6f   pFKey->pNextFro
154f0 6d 20 3d 20 70 2d 3e 70 46 4b 65 79 3b 0a 20 20  m = p->pFKey;.  
15500 7a 20 3d 20 28 63 68 61 72 2a 29 26 70 46 4b 65  z = (char*)&pFKe
15510 79 2d 3e 61 43 6f 6c 5b 6e 43 6f 6c 5d 3b 0a 20  y->aCol[nCol];. 
15520 20 70 46 4b 65 79 2d 3e 7a 54 6f 20 3d 20 7a 3b   pFKey->zTo = z;
15530 0a 20 20 6d 65 6d 63 70 79 28 7a 2c 20 70 54 6f  .  memcpy(z, pTo
15540 2d 3e 7a 2c 20 70 54 6f 2d 3e 6e 29 3b 0a 20 20  ->z, pTo->n);.  
15550 7a 5b 70 54 6f 2d 3e 6e 5d 20 3d 20 30 3b 0a 20  z[pTo->n] = 0;. 
15560 20 73 71 6c 69 74 65 33 44 65 71 75 6f 74 65 28   sqlite3Dequote(
15570 7a 29 3b 0a 20 20 7a 20 2b 3d 20 70 54 6f 2d 3e  z);.  z += pTo->
15580 6e 2b 31 3b 0a 20 20 70 46 4b 65 79 2d 3e 6e 43  n+1;.  pFKey->nC
15590 6f 6c 20 3d 20 6e 43 6f 6c 3b 0a 20 20 69 66 28  ol = nCol;.  if(
155a0 20 70 46 72 6f 6d 43 6f 6c 3d 3d 30 20 29 7b 0a   pFromCol==0 ){.
155b0 20 20 20 20 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b      pFKey->aCol[
155c0 30 5d 2e 69 46 72 6f 6d 20 3d 20 70 2d 3e 6e 43  0].iFrom = p->nC
155d0 6f 6c 2d 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ol-1;.  }else{. 
155e0 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43     for(i=0; i<nC
155f0 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ol; i++){.      
15600 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 66 6f 72  int j;.      for
15610 28 6a 3d 30 3b 20 6a 3c 70 2d 3e 6e 43 6f 6c 3b  (j=0; j<p->nCol;
15620 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69   j++){.        i
15630 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  f( sqlite3StrICm
15640 70 28 70 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61  p(p->aCol[j].zNa
15650 6d 65 2c 20 70 46 72 6f 6d 43 6f 6c 2d 3e 61 5b  me, pFromCol->a[
15660 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a  i].zName)==0 ){.
15670 20 20 20 20 20 20 20 20 20 20 70 46 4b 65 79 2d            pFKey-
15680 3e 61 43 6f 6c 5b 69 5d 2e 69 46 72 6f 6d 20 3d  >aCol[i].iFrom =
15690 20 6a 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72   j;.          br
156a0 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
156b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
156c0 20 6a 3e 3d 70 2d 3e 6e 43 6f 6c 20 29 7b 0a 20   j>=p->nCol ){. 
156d0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
156e0 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 0a  rorMsg(pParse, .
156f0 20 20 20 20 20 20 20 20 20 20 22 75 6e 6b 6e 6f            "unkno
15700 77 6e 20 63 6f 6c 75 6d 6e 20 5c 22 25 73 5c 22  wn column \"%s\"
15710 20 69 6e 20 66 6f 72 65 69 67 6e 20 6b 65 79 20   in foreign key 
15720 64 65 66 69 6e 69 74 69 6f 6e 22 2c 20 0a 20 20  definition", .  
15730 20 20 20 20 20 20 20 20 70 46 72 6f 6d 43 6f 6c          pFromCol
15740 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20  ->a[i].zName);. 
15750 20 20 20 20 20 20 20 67 6f 74 6f 20 66 6b 5f 65         goto fk_e
15760 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  nd;.      }.    
15770 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 54 6f 43  }.  }.  if( pToC
15780 6f 6c 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d  ol ){.    for(i=
15790 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b  0; i<nCol; i++){
157a0 0a 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 73  .      int n = s
157b0 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70  qlite3Strlen30(p
157c0 54 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  ToCol->a[i].zNam
157d0 65 29 3b 0a 20 20 20 20 20 20 70 46 4b 65 79 2d  e);.      pFKey-
157e0 3e 61 43 6f 6c 5b 69 5d 2e 7a 43 6f 6c 20 3d 20  >aCol[i].zCol = 
157f0 7a 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  z;.      memcpy(
15800 7a 2c 20 70 54 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e  z, pToCol->a[i].
15810 7a 4e 61 6d 65 2c 20 6e 29 3b 0a 20 20 20 20 20  zName, n);.     
15820 20 7a 5b 6e 5d 20 3d 20 30 3b 0a 20 20 20 20 20   z[n] = 0;.     
15830 20 7a 20 2b 3d 20 6e 2b 31 3b 0a 20 20 20 20 7d   z += n+1;.    }
15840 0a 20 20 7d 0a 20 20 70 46 4b 65 79 2d 3e 69 73  .  }.  pFKey->is
15850 44 65 66 65 72 72 65 64 20 3d 20 30 3b 0a 20 20  Deferred = 0;.  
15860 70 46 4b 65 79 2d 3e 61 41 63 74 69 6f 6e 5b 30  pFKey->aAction[0
15870 5d 20 3d 20 28 75 38 29 28 66 6c 61 67 73 20 26  ] = (u8)(flags &
15880 20 30 78 66 66 29 3b 20 20 20 20 20 20 20 20 20   0xff);         
15890 20 20 20 2f 2a 20 4f 4e 20 44 45 4c 45 54 45 20     /* ON DELETE 
158a0 61 63 74 69 6f 6e 20 2a 2f 0a 20 20 70 46 4b 65  action */.  pFKe
158b0 79 2d 3e 61 41 63 74 69 6f 6e 5b 31 5d 20 3d 20  y->aAction[1] = 
158c0 28 75 38 29 28 28 66 6c 61 67 73 20 3e 3e 20 38  (u8)((flags >> 8
158d0 20 29 20 26 20 30 78 66 66 29 3b 20 20 20 20 2f   ) & 0xff);    /
158e0 2a 20 4f 4e 20 55 50 44 41 54 45 20 61 63 74 69  * ON UPDATE acti
158f0 6f 6e 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  on */..  assert(
15900 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75   sqlite3SchemaMu
15910 74 65 78 48 65 6c 64 28 64 62 2c 20 30 2c 20 70  texHeld(db, 0, p
15920 2d 3e 70 53 63 68 65 6d 61 29 20 29 3b 0a 20 20  ->pSchema) );.  
15930 70 4e 65 78 74 54 6f 20 3d 20 28 46 4b 65 79 20  pNextTo = (FKey 
15940 2a 29 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73  *)sqlite3HashIns
15950 65 72 74 28 26 70 2d 3e 70 53 63 68 65 6d 61 2d  ert(&p->pSchema-
15960 3e 66 6b 65 79 48 61 73 68 2c 20 0a 20 20 20 20  >fkeyHash, .    
15970 20 20 70 46 4b 65 79 2d 3e 7a 54 6f 2c 20 28 76    pFKey->zTo, (v
15980 6f 69 64 20 2a 29 70 46 4b 65 79 0a 20 20 29 3b  oid *)pFKey.  );
15990 0a 20 20 69 66 28 20 70 4e 65 78 74 54 6f 3d 3d  .  if( pNextTo==
159a0 70 46 4b 65 79 20 29 7b 0a 20 20 20 20 73 71 6c  pFKey ){.    sql
159b0 69 74 65 33 4f 6f 6d 46 61 75 6c 74 28 64 62 29  ite3OomFault(db)
159c0 3b 0a 20 20 20 20 67 6f 74 6f 20 66 6b 5f 65 6e  ;.    goto fk_en
159d0 64 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 4e 65  d;.  }.  if( pNe
159e0 78 74 54 6f 20 29 7b 0a 20 20 20 20 61 73 73 65  xtTo ){.    asse
159f0 72 74 28 20 70 4e 65 78 74 54 6f 2d 3e 70 50 72  rt( pNextTo->pPr
15a00 65 76 54 6f 3d 3d 30 20 29 3b 0a 20 20 20 20 70  evTo==0 );.    p
15a10 46 4b 65 79 2d 3e 70 4e 65 78 74 54 6f 20 3d 20  FKey->pNextTo = 
15a20 70 4e 65 78 74 54 6f 3b 0a 20 20 20 20 70 4e 65  pNextTo;.    pNe
15a30 78 74 54 6f 2d 3e 70 50 72 65 76 54 6f 20 3d 20  xtTo->pPrevTo = 
15a40 70 46 4b 65 79 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  pFKey;.  }..  /*
15a50 20 4c 69 6e 6b 20 74 68 65 20 66 6f 72 65 69 67   Link the foreig
15a60 6e 20 6b 65 79 20 74 6f 20 74 68 65 20 74 61 62  n key to the tab
15a70 6c 65 20 61 73 20 74 68 65 20 6c 61 73 74 20 73  le as the last s
15a80 74 65 70 2e 0a 20 20 2a 2f 0a 20 20 70 2d 3e 70  tep..  */.  p->p
15a90 46 4b 65 79 20 3d 20 70 46 4b 65 79 3b 0a 20 20  FKey = pFKey;.  
15aa0 70 46 4b 65 79 20 3d 20 30 3b 0a 0a 66 6b 5f 65  pFKey = 0;..fk_e
15ab0 6e 64 3a 0a 20 20 73 71 6c 69 74 65 33 44 62 46  nd:.  sqlite3DbF
15ac0 72 65 65 28 64 62 2c 20 70 46 4b 65 79 29 3b 0a  ree(db, pFKey);.
15ad0 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e  #endif /* !defin
15ae0 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46  ed(SQLITE_OMIT_F
15af0 4f 52 45 49 47 4e 5f 4b 45 59 29 20 2a 2f 0a 20  OREIGN_KEY) */. 
15b00 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
15b10 44 65 6c 65 74 65 28 64 62 2c 20 70 46 72 6f 6d  Delete(db, pFrom
15b20 43 6f 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33 45  Col);.  sqlite3E
15b30 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62  xprListDelete(db
15b40 2c 20 70 54 6f 43 6f 6c 29 3b 0a 7d 0a 0a 2f 2a  , pToCol);.}../*
15b50 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
15b60 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20   is called when 
15b70 61 6e 20 49 4e 49 54 49 41 4c 4c 59 20 49 4d 4d  an INITIALLY IMM
15b80 45 44 49 41 54 45 20 6f 72 20 49 4e 49 54 49 41  EDIATE or INITIA
15b90 4c 4c 59 20 44 45 46 45 52 52 45 44 0a 2a 2a 20  LLY DEFERRED.** 
15ba0 63 6c 61 75 73 65 20 69 73 20 73 65 65 6e 20 61  clause is seen a
15bb0 73 20 70 61 72 74 20 6f 66 20 61 20 66 6f 72 65  s part of a fore
15bc0 69 67 6e 20 6b 65 79 20 64 65 66 69 6e 69 74 69  ign key definiti
15bd0 6f 6e 2e 20 20 54 68 65 20 69 73 44 65 66 65 72  on.  The isDefer
15be0 72 65 64 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72  red.** parameter
15bf0 20 69 73 20 31 20 66 6f 72 20 49 4e 49 54 49 41   is 1 for INITIA
15c00 4c 4c 59 20 44 45 46 45 52 52 45 44 20 61 6e 64  LLY DEFERRED and
15c10 20 30 20 66 6f 72 20 49 4e 49 54 49 41 4c 4c 59   0 for INITIALLY
15c20 20 49 4d 4d 45 44 49 41 54 45 2e 0a 2a 2a 20 54   IMMEDIATE..** T
15c30 68 65 20 62 65 68 61 76 69 6f 72 20 6f 66 20 74  he behavior of t
15c40 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79  he most recently
15c50 20 63 72 65 61 74 65 64 20 66 6f 72 65 69 67 6e   created foreign
15c60 20 6b 65 79 20 69 73 20 61 64 6a 75 73 74 65 64   key is adjusted
15c70 0a 2a 2a 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e  .** accordingly.
15c80 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
15c90 44 65 66 65 72 46 6f 72 65 69 67 6e 4b 65 79 28  DeferForeignKey(
15ca0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69  Parse *pParse, i
15cb0 6e 74 20 69 73 44 65 66 65 72 72 65 64 29 7b 0a  nt isDeferred){.
15cc0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
15cd0 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 0a  MIT_FOREIGN_KEY.
15ce0 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20    Table *pTab;. 
15cf0 20 46 4b 65 79 20 2a 70 46 4b 65 79 3b 0a 20 20   FKey *pFKey;.  
15d00 69 66 28 20 28 70 54 61 62 20 3d 20 70 50 61 72  if( (pTab = pPar
15d10 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3d 3d  se->pNewTable)==
15d20 30 20 7c 7c 20 28 70 46 4b 65 79 20 3d 20 70 54  0 || (pFKey = pT
15d30 61 62 2d 3e 70 46 4b 65 79 29 3d 3d 30 20 29 20  ab->pFKey)==0 ) 
15d40 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74  return;.  assert
15d50 28 20 69 73 44 65 66 65 72 72 65 64 3d 3d 30 20  ( isDeferred==0 
15d60 7c 7c 20 69 73 44 65 66 65 72 72 65 64 3d 3d 31  || isDeferred==1
15d70 20 29 3b 20 2f 2a 20 45 56 3a 20 52 2d 33 30 33   ); /* EV: R-303
15d80 32 33 2d 32 31 39 31 37 20 2a 2f 0a 20 20 70 46  23-21917 */.  pF
15d90 4b 65 79 2d 3e 69 73 44 65 66 65 72 72 65 64 20  Key->isDeferred 
15da0 3d 20 28 75 38 29 69 73 44 65 66 65 72 72 65 64  = (u8)isDeferred
15db0 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a  ;.#endif.}../*.*
15dc0 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
15dd0 74 68 61 74 20 77 69 6c 6c 20 65 72 61 73 65 20  that will erase 
15de0 61 6e 64 20 72 65 66 69 6c 6c 20 69 6e 64 65 78  and refill index
15df0 20 2a 70 49 64 78 2e 20 20 54 68 69 73 20 69 73   *pIdx.  This is
15e00 0a 2a 2a 20 75 73 65 64 20 74 6f 20 69 6e 69 74  .** used to init
15e10 69 61 6c 69 7a 65 20 61 20 6e 65 77 6c 79 20 63  ialize a newly c
15e20 72 65 61 74 65 64 20 69 6e 64 65 78 20 6f 72 20  reated index or 
15e30 74 6f 20 72 65 63 6f 6d 70 75 74 65 20 74 68 65  to recompute the
15e40 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61  .** content of a
15e50 6e 20 69 6e 64 65 78 20 69 6e 20 72 65 73 70 6f  n index in respo
15e60 6e 73 65 20 74 6f 20 61 20 52 45 49 4e 44 45 58  nse to a REINDEX
15e70 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20   command..**.** 
15e80 69 66 20 6d 65 6d 52 6f 6f 74 50 61 67 65 20 69  if memRootPage i
15e90 73 20 6e 6f 74 20 6e 65 67 61 74 69 76 65 2c 20  s not negative, 
15ea0 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68  it means that th
15eb0 65 20 69 6e 64 65 78 20 69 73 20 6e 65 77 6c 79  e index is newly
15ec0 0a 2a 2a 20 63 72 65 61 74 65 64 2e 20 20 54 68  .** created.  Th
15ed0 65 20 72 65 67 69 73 74 65 72 20 73 70 65 63 69  e register speci
15ee0 66 69 65 64 20 62 79 20 6d 65 6d 52 6f 6f 74 50  fied by memRootP
15ef0 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  age contains the
15f00 0a 2a 2a 20 72 6f 6f 74 20 70 61 67 65 20 6e 75  .** root page nu
15f10 6d 62 65 72 20 6f 66 20 74 68 65 20 69 6e 64 65  mber of the inde
15f20 78 2e 20 20 49 66 20 6d 65 6d 52 6f 6f 74 50 61  x.  If memRootPa
15f30 67 65 20 69 73 20 6e 65 67 61 74 69 76 65 2c 20  ge is negative, 
15f40 74 68 65 6e 0a 2a 2a 20 74 68 65 20 69 6e 64 65  then.** the inde
15f50 78 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73  x already exists
15f60 20 61 6e 64 20 6d 75 73 74 20 62 65 20 63 6c 65   and must be cle
15f70 61 72 65 64 20 62 65 66 6f 72 65 20 62 65 69 6e  ared before bein
15f80 67 20 72 65 66 69 6c 6c 65 64 20 61 6e 64 0a 2a  g refilled and.*
15f90 2a 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20  * the root page 
15fa0 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 69 6e  number of the in
15fb0 64 65 78 20 69 73 20 74 61 6b 65 6e 20 66 72 6f  dex is taken fro
15fc0 6d 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 2e 0a  m pIndex->tnum..
15fd0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
15fe0 71 6c 69 74 65 33 52 65 66 69 6c 6c 49 6e 64 65  qlite3RefillInde
15ff0 78 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  x(Parse *pParse,
16000 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 2c 20   Index *pIndex, 
16010 69 6e 74 20 6d 65 6d 52 6f 6f 74 50 61 67 65 29  int memRootPage)
16020 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20  {.  Table *pTab 
16030 3d 20 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65  = pIndex->pTable
16040 3b 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20  ;  /* The table 
16050 74 68 61 74 20 69 73 20 69 6e 64 65 78 65 64 20  that is indexed 
16060 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 20 3d 20  */.  int iTab = 
16070 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 20  pParse->nTab++; 
16080 20 20 20 20 2f 2a 20 42 74 72 65 65 20 63 75 72      /* Btree cur
16090 73 6f 72 20 75 73 65 64 20 66 6f 72 20 70 54 61  sor used for pTa
160a0 62 20 2a 2f 0a 20 20 69 6e 74 20 69 49 64 78 20  b */.  int iIdx 
160b0 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b  = pParse->nTab++
160c0 3b 20 20 20 20 20 2f 2a 20 42 74 72 65 65 20 63  ;     /* Btree c
160d0 75 72 73 6f 72 20 75 73 65 64 20 66 6f 72 20 70  ursor used for p
160e0 49 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 69  Index */.  int i
160f0 53 6f 72 74 65 72 3b 20 20 20 20 20 20 20 20 20  Sorter;         
16100 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
16110 73 6f 72 20 6f 70 65 6e 65 64 20 62 79 20 4f 70  sor opened by Op
16120 65 6e 53 6f 72 74 65 72 20 28 69 66 20 69 6e 20  enSorter (if in 
16130 75 73 65 29 20 2a 2f 0a 20 20 69 6e 74 20 61 64  use) */.  int ad
16140 64 72 31 3b 20 20 20 20 20 20 20 20 20 20 20 20  dr1;            
16150 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72           /* Addr
16160 65 73 73 20 6f 66 20 74 6f 70 20 6f 66 20 6c 6f  ess of top of lo
16170 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72  op */.  int addr
16180 32 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  2;              
16190 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
161a0 73 20 74 6f 20 6a 75 6d 70 20 74 6f 20 66 6f 72  s to jump to for
161b0 20 6e 65 78 74 20 69 74 65 72 61 74 69 6f 6e 20   next iteration 
161c0 2a 2f 0a 20 20 69 6e 74 20 74 6e 75 6d 3b 20 20  */.  int tnum;  
161d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
161e0 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65      /* Root page
161f0 20 6f 66 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69   of index */.  i
16200 6e 74 20 69 50 61 72 74 49 64 78 4c 61 62 65 6c  nt iPartIdxLabel
16210 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
16220 20 4a 75 6d 70 20 74 6f 20 74 68 69 73 20 6c 61   Jump to this la
16230 62 65 6c 20 74 6f 20 73 6b 69 70 20 61 20 72 6f  bel to skip a ro
16240 77 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20  w */.  Vdbe *v; 
16250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16260 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74        /* Generat
16270 65 20 63 6f 64 65 20 69 6e 74 6f 20 74 68 69 73  e code into this
16280 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65   virtual machine
16290 20 2a 2f 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70   */.  KeyInfo *p
162a0 4b 65 79 3b 20 20 20 20 20 20 20 20 20 20 20 20  Key;            
162b0 20 20 20 20 20 2f 2a 20 4b 65 79 49 6e 66 6f 20       /* KeyInfo 
162c0 66 6f 72 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69  for index */.  i
162d0 6e 74 20 72 65 67 52 65 63 6f 72 64 3b 20 20 20  nt regRecord;   
162e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
162f0 20 52 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e   Register holdin
16300 67 20 61 73 73 65 6d 62 6c 65 64 20 69 6e 64 65  g assembled inde
16310 78 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 73 71  x record */.  sq
16320 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
16330 73 65 2d 3e 64 62 3b 20 20 20 20 20 20 2f 2a 20  se->db;      /* 
16340 54 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e  The database con
16350 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74  nection */.  int
16360 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63   iDb = sqlite3Sc
16370 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20  hemaToIndex(db, 
16380 70 49 6e 64 65 78 2d 3e 70 53 63 68 65 6d 61 29  pIndex->pSchema)
16390 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ;..#ifndef SQLIT
163a0 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41  E_OMIT_AUTHORIZA
163b0 54 49 4f 4e 0a 20 20 69 66 28 20 73 71 6c 69 74  TION.  if( sqlit
163c0 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72  e3AuthCheck(pPar
163d0 73 65 2c 20 53 51 4c 49 54 45 5f 52 45 49 4e 44  se, SQLITE_REIND
163e0 45 58 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d  EX, pIndex->zNam
163f0 65 2c 20 30 2c 0a 20 20 20 20 20 20 64 62 2d 3e  e, 0,.      db->
16400 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 20 29  aDb[iDb].zName )
16410 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a   ){.    return;.
16420 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a    }.#endif..  /*
16430 20 52 65 71 75 69 72 65 20 61 20 77 72 69 74 65   Require a write
16440 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 74 61 62  -lock on the tab
16450 6c 65 20 74 6f 20 70 65 72 66 6f 72 6d 20 74 68  le to perform th
16460 69 73 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a  is operation */.
16470 20 20 73 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f    sqlite3TableLo
16480 63 6b 28 70 50 61 72 73 65 2c 20 69 44 62 2c 20  ck(pParse, iDb, 
16490 70 54 61 62 2d 3e 74 6e 75 6d 2c 20 31 2c 20 70  pTab->tnum, 1, p
164a0 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 0a 20 20  Tab->zName);..  
164b0 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
164c0 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66  be(pParse);.  if
164d0 28 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ( v==0 ) return;
164e0 0a 20 20 69 66 28 20 6d 65 6d 52 6f 6f 74 50 61  .  if( memRootPa
164f0 67 65 3e 3d 30 20 29 7b 0a 20 20 20 20 74 6e 75  ge>=0 ){.    tnu
16500 6d 20 3d 20 6d 65 6d 52 6f 6f 74 50 61 67 65 3b  m = memRootPage;
16510 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 74 6e  .  }else{.    tn
16520 75 6d 20 3d 20 70 49 6e 64 65 78 2d 3e 74 6e 75  um = pIndex->tnu
16530 6d 3b 0a 20 20 7d 0a 20 20 70 4b 65 79 20 3d 20  m;.  }.  pKey = 
16540 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 4f 66  sqlite3KeyInfoOf
16550 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70 49  Index(pParse, pI
16560 6e 64 65 78 29 3b 0a 20 20 61 73 73 65 72 74 28  ndex);.  assert(
16570 20 70 4b 65 79 21 3d 30 20 7c 7c 20 64 62 2d 3e   pKey!=0 || db->
16580 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20  mallocFailed || 
16590 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 3b 0a  pParse->nErr );.
165a0 0a 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 73  .  /* Open the s
165b0 6f 72 74 65 72 20 63 75 72 73 6f 72 20 69 66 20  orter cursor if 
165c0 77 65 20 61 72 65 20 74 6f 20 75 73 65 20 6f 6e  we are to use on
165d0 65 2e 20 2a 2f 0a 20 20 69 53 6f 72 74 65 72 20  e. */.  iSorter 
165e0 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b  = pParse->nTab++
165f0 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
16600 64 64 4f 70 34 28 76 2c 20 4f 50 5f 53 6f 72 74  ddOp4(v, OP_Sort
16610 65 72 4f 70 65 6e 2c 20 69 53 6f 72 74 65 72 2c  erOpen, iSorter,
16620 20 30 2c 20 70 49 6e 64 65 78 2d 3e 6e 4b 65 79   0, pIndex->nKey
16630 43 6f 6c 2c 20 28 63 68 61 72 2a 29 0a 20 20 20  Col, (char*).   
16640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16650 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 52   sqlite3KeyInfoR
16660 65 66 28 70 4b 65 79 29 2c 20 50 34 5f 4b 45 59  ef(pKey), P4_KEY
16670 49 4e 46 4f 29 3b 0a 0a 20 20 2f 2a 20 4f 70 65  INFO);..  /* Ope
16680 6e 20 74 68 65 20 74 61 62 6c 65 2e 20 4c 6f 6f  n the table. Loo
16690 70 20 74 68 72 6f 75 67 68 20 61 6c 6c 20 72 6f  p through all ro
166a0 77 73 20 6f 66 20 74 68 65 20 74 61 62 6c 65 2c  ws of the table,
166b0 20 69 6e 73 65 72 74 69 6e 67 20 69 6e 64 65 78   inserting index
166c0 0a 20 20 2a 2a 20 72 65 63 6f 72 64 73 20 69 6e  .  ** records in
166d0 74 6f 20 74 68 65 20 73 6f 72 74 65 72 2e 20 2a  to the sorter. *
166e0 2f 0a 20 20 73 71 6c 69 74 65 33 4f 70 65 6e 54  /.  sqlite3OpenT
166f0 61 62 6c 65 28 70 50 61 72 73 65 2c 20 69 54 61  able(pParse, iTa
16700 62 2c 20 69 44 62 2c 20 70 54 61 62 2c 20 4f 50  b, iDb, pTab, OP
16710 5f 4f 70 65 6e 52 65 61 64 29 3b 0a 20 20 61 64  _OpenRead);.  ad
16720 64 72 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62  dr1 = sqlite3Vdb
16730 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65  eAddOp2(v, OP_Re
16740 77 69 6e 64 2c 20 69 54 61 62 2c 20 30 29 3b 20  wind, iTab, 0); 
16750 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
16760 0a 20 20 72 65 67 52 65 63 6f 72 64 20 3d 20 73  .  regRecord = s
16770 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
16780 28 70 50 61 72 73 65 29 3b 0a 0a 20 20 73 71 6c  (pParse);..  sql
16790 69 74 65 33 47 65 6e 65 72 61 74 65 49 6e 64 65  ite3GenerateInde
167a0 78 4b 65 79 28 70 50 61 72 73 65 2c 70 49 6e 64  xKey(pParse,pInd
167b0 65 78 2c 69 54 61 62 2c 72 65 67 52 65 63 6f 72  ex,iTab,regRecor
167c0 64 2c 30 2c 26 69 50 61 72 74 49 64 78 4c 61 62  d,0,&iPartIdxLab
167d0 65 6c 2c 30 2c 30 29 3b 0a 20 20 73 71 6c 69 74  el,0,0);.  sqlit
167e0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
167f0 4f 50 5f 53 6f 72 74 65 72 49 6e 73 65 72 74 2c  OP_SorterInsert,
16800 20 69 53 6f 72 74 65 72 2c 20 72 65 67 52 65 63   iSorter, regRec
16810 6f 72 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 52  ord);.  sqlite3R
16820 65 73 6f 6c 76 65 50 61 72 74 49 64 78 4c 61 62  esolvePartIdxLab
16830 65 6c 28 70 50 61 72 73 65 2c 20 69 50 61 72 74  el(pParse, iPart
16840 49 64 78 4c 61 62 65 6c 29 3b 0a 20 20 73 71 6c  IdxLabel);.  sql
16850 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
16860 2c 20 4f 50 5f 4e 65 78 74 2c 20 69 54 61 62 2c  , OP_Next, iTab,
16870 20 61 64 64 72 31 2b 31 29 3b 20 56 64 62 65 43   addr1+1); VdbeC
16880 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 73 71  overage(v);.  sq
16890 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
168a0 65 28 76 2c 20 61 64 64 72 31 29 3b 0a 20 20 69  e(v, addr1);.  i
168b0 66 28 20 6d 65 6d 52 6f 6f 74 50 61 67 65 3c 30  f( memRootPage<0
168c0 20 29 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   ) sqlite3VdbeAd
168d0 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6c 65 61 72  dOp2(v, OP_Clear
168e0 2c 20 74 6e 75 6d 2c 20 69 44 62 29 3b 0a 20 20  , tnum, iDb);.  
168f0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
16900 34 28 76 2c 20 4f 50 5f 4f 70 65 6e 57 72 69 74  4(v, OP_OpenWrit
16910 65 2c 20 69 49 64 78 2c 20 74 6e 75 6d 2c 20 69  e, iIdx, tnum, i
16920 44 62 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  Db, .           
16930 20 20 20 20 20 20 20 20 20 28 63 68 61 72 20 2a           (char *
16940 29 70 4b 65 79 2c 20 50 34 5f 4b 45 59 49 4e 46  )pKey, P4_KEYINF
16950 4f 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  O);.  sqlite3Vdb
16960 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46  eChangeP5(v, OPF
16970 4c 41 47 5f 42 55 4c 4b 43 53 52 7c 28 28 6d 65  LAG_BULKCSR|((me
16980 6d 52 6f 6f 74 50 61 67 65 3e 3d 30 29 3f 4f 50  mRootPage>=0)?OP
16990 46 4c 41 47 5f 50 32 49 53 52 45 47 3a 30 29 29  FLAG_P2ISREG:0))
169a0 3b 0a 0a 20 20 61 64 64 72 31 20 3d 20 73 71 6c  ;..  addr1 = sql
169b0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
169c0 2c 20 4f 50 5f 53 6f 72 74 65 72 53 6f 72 74 2c  , OP_SorterSort,
169d0 20 69 53 6f 72 74 65 72 2c 20 30 29 3b 20 56 64   iSorter, 0); Vd
169e0 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
169f0 20 69 66 28 20 49 73 55 6e 69 71 75 65 49 6e 64   if( IsUniqueInd
16a00 65 78 28 70 49 6e 64 65 78 29 20 29 7b 0a 20 20  ex(pIndex) ){.  
16a10 20 20 69 6e 74 20 6a 32 20 3d 20 73 71 6c 69 74    int j2 = sqlit
16a20 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
16a30 72 28 76 29 20 2b 20 33 3b 0a 20 20 20 20 73 71  r(v) + 3;.    sq
16a40 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c  lite3VdbeGoto(v,
16a50 20 6a 32 29 3b 0a 20 20 20 20 61 64 64 72 32 20   j2);.    addr2 
16a60 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
16a70 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20  rentAddr(v);.   
16a80 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
16a90 70 34 49 6e 74 28 76 2c 20 4f 50 5f 53 6f 72 74  p4Int(v, OP_Sort
16aa0 65 72 43 6f 6d 70 61 72 65 2c 20 69 53 6f 72 74  erCompare, iSort
16ab0 65 72 2c 20 6a 32 2c 20 72 65 67 52 65 63 6f 72  er, j2, regRecor
16ac0 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  d,.             
16ad0 20 20 20 20 20 20 20 20 20 20 20 20 70 49 6e 64              pInd
16ae0 65 78 2d 3e 6e 4b 65 79 43 6f 6c 29 3b 20 56 64  ex->nKeyCol); Vd
16af0 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
16b00 20 20 20 73 71 6c 69 74 65 33 55 6e 69 71 75 65     sqlite3Unique
16b10 43 6f 6e 73 74 72 61 69 6e 74 28 70 50 61 72 73  Constraint(pPars
16b20 65 2c 20 4f 45 5f 41 62 6f 72 74 2c 20 70 49 6e  e, OE_Abort, pIn
16b30 64 65 78 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  dex);.  }else{. 
16b40 20 20 20 61 64 64 72 32 20 3d 20 73 71 6c 69 74     addr2 = sqlit
16b50 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
16b60 72 28 76 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  r(v);.  }.  sqli
16b70 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
16b80 20 4f 50 5f 53 6f 72 74 65 72 44 61 74 61 2c 20   OP_SorterData, 
16b90 69 53 6f 72 74 65 72 2c 20 72 65 67 52 65 63 6f  iSorter, regReco
16ba0 72 64 2c 20 69 49 64 78 29 3b 0a 20 20 73 71 6c  rd, iIdx);.  sql
16bb0 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
16bc0 2c 20 4f 50 5f 4c 61 73 74 2c 20 69 49 64 78 2c  , OP_Last, iIdx,
16bd0 20 30 2c 20 2d 31 29 3b 0a 20 20 73 71 6c 69 74   0, -1);.  sqlit
16be0 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
16bf0 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 69 49  OP_IdxInsert, iI
16c00 64 78 2c 20 72 65 67 52 65 63 6f 72 64 2c 20 30  dx, regRecord, 0
16c10 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
16c20 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c  ChangeP5(v, OPFL
16c30 41 47 5f 55 53 45 53 45 45 4b 52 45 53 55 4c 54  AG_USESEEKRESULT
16c40 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65  );.  sqlite3Rele
16c50 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
16c60 65 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20  e, regRecord);. 
16c70 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
16c80 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 4e  p2(v, OP_SorterN
16c90 65 78 74 2c 20 69 53 6f 72 74 65 72 2c 20 61 64  ext, iSorter, ad
16ca0 64 72 32 29 3b 20 56 64 62 65 43 6f 76 65 72 61  dr2); VdbeCovera
16cb0 67 65 28 76 29 3b 0a 20 20 73 71 6c 69 74 65 33  ge(v);.  sqlite3
16cc0 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
16cd0 61 64 64 72 31 29 3b 0a 0a 20 20 73 71 6c 69 74  addr1);..  sqlit
16ce0 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
16cf0 4f 50 5f 43 6c 6f 73 65 2c 20 69 54 61 62 29 3b  OP_Close, iTab);
16d00 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
16d10 64 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65  dOp1(v, OP_Close
16d20 2c 20 69 49 64 78 29 3b 0a 20 20 73 71 6c 69 74  , iIdx);.  sqlit
16d30 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
16d40 4f 50 5f 43 6c 6f 73 65 2c 20 69 53 6f 72 74 65  OP_Close, iSorte
16d50 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c  r);.}../*.** All
16d60 6f 63 61 74 65 20 68 65 61 70 20 73 70 61 63 65  ocate heap space
16d70 20 74 6f 20 68 6f 6c 64 20 61 6e 20 49 6e 64 65   to hold an Inde
16d80 78 20 6f 62 6a 65 63 74 20 77 69 74 68 20 6e 43  x object with nC
16d90 6f 6c 20 63 6f 6c 75 6d 6e 73 2e 0a 2a 2a 0a 2a  ol columns..**.*
16da0 2a 20 49 6e 63 72 65 61 73 65 20 74 68 65 20 61  * Increase the a
16db0 6c 6c 6f 63 61 74 69 6f 6e 20 73 69 7a 65 20 74  llocation size t
16dc0 6f 20 70 72 6f 76 69 64 65 20 61 6e 20 65 78 74  o provide an ext
16dd0 72 61 20 6e 45 78 74 72 61 20 62 79 74 65 73 0a  ra nExtra bytes.
16de0 2a 2a 20 6f 66 20 38 2d 62 79 74 65 20 61 6c 69  ** of 8-byte ali
16df0 67 6e 65 64 20 73 70 61 63 65 20 61 66 74 65 72  gned space after
16e00 20 74 68 65 20 49 6e 64 65 78 20 6f 62 6a 65 63   the Index objec
16e10 74 20 61 6e 64 20 72 65 74 75 72 6e 20 61 0a 2a  t and return a.*
16e20 2a 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 69  * pointer to thi
16e30 73 20 65 78 74 72 61 20 73 70 61 63 65 20 69 6e  s extra space in
16e40 20 2a 70 70 45 78 74 72 61 2e 0a 2a 2f 0a 49 6e   *ppExtra..*/.In
16e50 64 65 78 20 2a 73 71 6c 69 74 65 33 41 6c 6c 6f  dex *sqlite3Allo
16e60 63 61 74 65 49 6e 64 65 78 4f 62 6a 65 63 74 28  cateIndexObject(
16e70 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  .  sqlite3 *db, 
16e80 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
16e90 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a  ase connection *
16ea0 2f 0a 20 20 69 31 36 20 6e 43 6f 6c 2c 20 20 20  /.  i16 nCol,   
16eb0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61           /* Tota
16ec0 6c 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75  l number of colu
16ed0 6d 6e 73 20 69 6e 20 74 68 65 20 69 6e 64 65 78  mns in the index
16ee0 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72 61   */.  int nExtra
16ef0 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75  ,          /* Nu
16f00 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66  mber of bytes of
16f10 20 65 78 74 72 61 20 73 70 61 63 65 20 74 6f 20   extra space to 
16f20 61 6c 6c 6f 63 20 2a 2f 0a 20 20 63 68 61 72 20  alloc */.  char 
16f30 2a 2a 70 70 45 78 74 72 61 20 20 20 20 20 20 20  **ppExtra       
16f40 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68  /* Pointer to th
16f50 65 20 22 65 78 74 72 61 22 20 73 70 61 63 65 20  e "extra" space 
16f60 2a 2f 0a 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70  */.){.  Index *p
16f70 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
16f80 41 6c 6c 6f 63 61 74 65 64 20 69 6e 64 65 78 20  Allocated index 
16f90 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20  object */.  int 
16fa0 6e 42 79 74 65 3b 20 20 20 20 20 20 20 20 20 20  nByte;          
16fb0 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 73 70 61   /* Bytes of spa
16fc0 63 65 20 66 6f 72 20 49 6e 64 65 78 20 6f 62 6a  ce for Index obj
16fd0 65 63 74 20 2b 20 61 72 72 61 79 73 20 2a 2f 0a  ect + arrays */.
16fe0 0a 20 20 6e 42 79 74 65 20 3d 20 52 4f 55 4e 44  .  nByte = ROUND
16ff0 38 28 73 69 7a 65 6f 66 28 49 6e 64 65 78 29 29  8(sizeof(Index))
17000 20 2b 20 20 20 20 20 20 20 20 20 20 20 20 20 20   +              
17010 2f 2a 20 49 6e 64 65 78 20 73 74 72 75 63 74 75  /* Index structu
17020 72 65 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  re  */.         
17030 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 63   ROUND8(sizeof(c
17040 68 61 72 2a 29 2a 6e 43 6f 6c 29 20 2b 20 20 20  har*)*nCol) +   
17050 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 2e 61        /* Index.a
17060 7a 43 6f 6c 6c 20 20 20 20 20 2a 2f 0a 20 20 20  zColl     */.   
17070 20 20 20 20 20 20 20 52 4f 55 4e 44 38 28 73 69         ROUND8(si
17080 7a 65 6f 66 28 4c 6f 67 45 73 74 29 2a 28 6e 43  zeof(LogEst)*(nC
17090 6f 6c 2b 31 29 20 2b 20 20 20 20 20 2f 2a 20 49  ol+1) +     /* I
170a0 6e 64 65 78 2e 61 69 52 6f 77 4c 6f 67 45 73 74  ndex.aiRowLogEst
170b0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20     */.          
170c0 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28 69 31         sizeof(i1
170d0 36 29 2a 6e 43 6f 6c 20 2b 20 20 20 20 20 20 20  6)*nCol +       
170e0 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 2e 61 69       /* Index.ai
170f0 43 6f 6c 75 6d 6e 20 20 20 2a 2f 0a 20 20 20 20  Column   */.    
17100 20 20 20 20 20 20 20 20 20 20 20 20 20 73 69 7a               siz
17110 65 6f 66 28 75 38 29 2a 6e 43 6f 6c 29 3b 20 20  eof(u8)*nCol);  
17120 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
17130 64 65 78 2e 61 53 6f 72 74 4f 72 64 65 72 20 2a  dex.aSortOrder *
17140 2f 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 44  /.  p = sqlite3D
17150 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20  bMallocZero(db, 
17160 6e 42 79 74 65 20 2b 20 6e 45 78 74 72 61 29 3b  nByte + nExtra);
17170 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20  .  if( p ){.    
17180 63 68 61 72 20 2a 70 45 78 74 72 61 20 3d 20 28  char *pExtra = (
17190 28 63 68 61 72 2a 29 70 29 2b 52 4f 55 4e 44 38  (char*)p)+ROUND8
171a0 28 73 69 7a 65 6f 66 28 49 6e 64 65 78 29 29 3b  (sizeof(Index));
171b0 0a 20 20 20 20 70 2d 3e 61 7a 43 6f 6c 6c 20 3d  .    p->azColl =
171c0 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 2a 29 70   (const char**)p
171d0 45 78 74 72 61 3b 20 70 45 78 74 72 61 20 2b 3d  Extra; pExtra +=
171e0 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 63   ROUND8(sizeof(c
171f0 68 61 72 2a 29 2a 6e 43 6f 6c 29 3b 0a 20 20 20  har*)*nCol);.   
17200 20 70 2d 3e 61 69 52 6f 77 4c 6f 67 45 73 74 20   p->aiRowLogEst 
17210 3d 20 28 4c 6f 67 45 73 74 2a 29 70 45 78 74 72  = (LogEst*)pExtr
17220 61 3b 20 70 45 78 74 72 61 20 2b 3d 20 73 69 7a  a; pExtra += siz
17230 65 6f 66 28 4c 6f 67 45 73 74 29 2a 28 6e 43 6f  eof(LogEst)*(nCo
17240 6c 2b 31 29 3b 0a 20 20 20 20 70 2d 3e 61 69 43  l+1);.    p->aiC
17250 6f 6c 75 6d 6e 20 3d 20 28 69 31 36 2a 29 70 45  olumn = (i16*)pE
17260 78 74 72 61 3b 20 20 20 20 20 20 20 70 45 78 74  xtra;       pExt
17270 72 61 20 2b 3d 20 73 69 7a 65 6f 66 28 69 31 36  ra += sizeof(i16
17280 29 2a 6e 43 6f 6c 3b 0a 20 20 20 20 70 2d 3e 61  )*nCol;.    p->a
17290 53 6f 72 74 4f 72 64 65 72 20 3d 20 28 75 38 2a  SortOrder = (u8*
172a0 29 70 45 78 74 72 61 3b 0a 20 20 20 20 70 2d 3e  )pExtra;.    p->
172b0 6e 43 6f 6c 75 6d 6e 20 3d 20 6e 43 6f 6c 3b 0a  nColumn = nCol;.
172c0 20 20 20 20 70 2d 3e 6e 4b 65 79 43 6f 6c 20 3d      p->nKeyCol =
172d0 20 6e 43 6f 6c 20 2d 20 31 3b 0a 20 20 20 20 2a   nCol - 1;.    *
172e0 70 70 45 78 74 72 61 20 3d 20 28 28 63 68 61 72  ppExtra = ((char
172f0 2a 29 70 29 20 2b 20 6e 42 79 74 65 3b 0a 20 20  *)p) + nByte;.  
17300 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a  }.  return p;.}.
17310 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20  ./*.** Create a 
17320 6e 65 77 20 69 6e 64 65 78 20 66 6f 72 20 61 6e  new index for an
17330 20 53 51 4c 20 74 61 62 6c 65 2e 20 20 70 4e 61   SQL table.  pNa
17340 6d 65 31 2e 70 4e 61 6d 65 32 20 69 73 20 74 68  me1.pName2 is th
17350 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 69 6e  e name of the in
17360 64 65 78 20 0a 2a 2a 20 61 6e 64 20 70 54 62 6c  dex .** and pTbl
17370 4c 69 73 74 20 69 73 20 74 68 65 20 6e 61 6d 65  List is the name
17380 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74 68   of the table th
17390 61 74 20 69 73 20 74 6f 20 62 65 20 69 6e 64 65  at is to be inde
173a0 78 65 64 2e 20 20 42 6f 74 68 20 77 69 6c 6c 20  xed.  Both will 
173b0 0a 2a 2a 20 62 65 20 4e 55 4c 4c 20 66 6f 72 20  .** be NULL for 
173c0 61 20 70 72 69 6d 61 72 79 20 6b 65 79 20 6f 72  a primary key or
173d0 20 61 6e 20 69 6e 64 65 78 20 74 68 61 74 20 69   an index that i
173e0 73 20 63 72 65 61 74 65 64 20 74 6f 20 73 61 74  s created to sat
173f0 69 73 66 79 20 61 0a 2a 2a 20 55 4e 49 51 55 45  isfy a.** UNIQUE
17400 20 63 6f 6e 73 74 72 61 69 6e 74 2e 20 20 49 66   constraint.  If
17410 20 70 54 61 62 6c 65 20 61 6e 64 20 70 49 6e 64   pTable and pInd
17420 65 78 20 61 72 65 20 4e 55 4c 4c 2c 20 75 73 65  ex are NULL, use
17430 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
17440 6c 65 0a 2a 2a 20 61 73 20 74 68 65 20 74 61 62  le.** as the tab
17450 6c 65 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64  le to be indexed
17460 2e 20 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54  .  pParse->pNewT
17470 61 62 6c 65 20 69 73 20 61 20 74 61 62 6c 65 20  able is a table 
17480 74 68 61 74 20 69 73 0a 2a 2a 20 63 75 72 72 65  that is.** curre
17490 6e 74 6c 79 20 62 65 69 6e 67 20 63 6f 6e 73 74  ntly being const
174a0 72 75 63 74 65 64 20 62 79 20 61 20 43 52 45 41  ructed by a CREA
174b0 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65  TE TABLE stateme
174c0 6e 74 2e 0a 2a 2a 0a 2a 2a 20 70 4c 69 73 74 20  nt..**.** pList 
174d0 69 73 20 61 20 6c 69 73 74 20 6f 66 20 63 6f 6c  is a list of col
174e0 75 6d 6e 73 20 74 6f 20 62 65 20 69 6e 64 65 78  umns to be index
174f0 65 64 2e 20 20 70 4c 69 73 74 20 77 69 6c 6c 20  ed.  pList will 
17500 62 65 20 4e 55 4c 4c 20 69 66 20 74 68 69 73 0a  be NULL if this.
17510 2a 2a 20 69 73 20 61 20 70 72 69 6d 61 72 79 20  ** is a primary 
17520 6b 65 79 20 6f 72 20 75 6e 69 71 75 65 2d 63 6f  key or unique-co
17530 6e 73 74 72 61 69 6e 74 20 6f 6e 20 74 68 65 20  nstraint on the 
17540 6d 6f 73 74 20 72 65 63 65 6e 74 20 63 6f 6c 75  most recent colu
17550 6d 6e 20 61 64 64 65 64 0a 2a 2a 20 74 6f 20 74  mn added.** to t
17560 68 65 20 74 61 62 6c 65 20 63 75 72 72 65 6e 74  he table current
17570 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75  ly under constru
17580 63 74 69 6f 6e 2e 20 20 0a 2a 2a 0a 2a 2a 20 49  ction.  .**.** I
17590 66 20 74 68 65 20 69 6e 64 65 78 20 69 73 20 63  f the index is c
175a0 72 65 61 74 65 64 20 73 75 63 63 65 73 73 66 75  reated successfu
175b0 6c 6c 79 2c 20 72 65 74 75 72 6e 20 61 20 70 6f  lly, return a po
175c0 69 6e 74 65 72 20 74 6f 20 74 68 65 20 6e 65 77  inter to the new
175d0 20 49 6e 64 65 78 0a 2a 2a 20 73 74 72 75 63 74   Index.** struct
175e0 75 72 65 2e 20 54 68 69 73 20 69 73 20 75 73 65  ure. This is use
175f0 64 20 62 79 20 73 71 6c 69 74 65 33 41 64 64 50  d by sqlite3AddP
17600 72 69 6d 61 72 79 4b 65 79 28 29 20 74 6f 20 6d  rimaryKey() to m
17610 61 72 6b 20 74 68 65 20 69 6e 64 65 78 0a 2a 2a  ark the index.**
17620 20 61 73 20 74 68 65 20 74 61 62 6c 65 73 20 70   as the tables p
17630 72 69 6d 61 72 79 20 6b 65 79 20 28 49 6e 64 65  rimary key (Inde
17640 78 2e 69 64 78 54 79 70 65 3d 3d 53 51 4c 49 54  x.idxType==SQLIT
17650 45 5f 49 44 58 54 59 50 45 5f 50 52 49 4d 41 52  E_IDXTYPE_PRIMAR
17660 59 4b 45 59 29 0a 2a 2f 0a 49 6e 64 65 78 20 2a  YKEY).*/.Index *
17670 73 71 6c 69 74 65 33 43 72 65 61 74 65 49 6e 64  sqlite3CreateInd
17680 65 78 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ex(.  Parse *pPa
17690 72 73 65 2c 20 20 20 20 20 2f 2a 20 41 6c 6c 20  rse,     /* All 
176a0 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75  information abou
176b0 74 20 74 68 69 73 20 70 61 72 73 65 20 2a 2f 0a  t this parse */.
176c0 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c    Token *pName1,
176d0 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 70 61       /* First pa
176e0 72 74 20 6f 66 20 69 6e 64 65 78 20 6e 61 6d 65  rt of index name
176f0 2e 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f  . May be NULL */
17700 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32  .  Token *pName2
17710 2c 20 20 20 20 20 2f 2a 20 53 65 63 6f 6e 64 20  ,     /* Second 
17720 70 61 72 74 20 6f 66 20 69 6e 64 65 78 20 6e 61  part of index na
17730 6d 65 2e 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20  me. May be NULL 
17740 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54  */.  SrcList *pT
17750 62 6c 4e 61 6d 65 2c 20 2f 2a 20 54 61 62 6c 65  blName, /* Table
17760 20 74 6f 20 69 6e 64 65 78 2e 20 55 73 65 20 70   to index. Use p
17770 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
17780 20 69 66 20 30 20 2a 2f 0a 20 20 45 78 70 72 4c   if 0 */.  ExprL
17790 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 2f 2a  ist *pList,   /*
177a0 20 41 20 6c 69 73 74 20 6f 66 20 63 6f 6c 75 6d   A list of colum
177b0 6e 73 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64  ns to be indexed
177c0 20 2a 2f 0a 20 20 69 6e 74 20 6f 6e 45 72 72 6f   */.  int onErro
177d0 72 2c 20 20 20 20 20 20 20 2f 2a 20 4f 45 5f 41  r,       /* OE_A
177e0 62 6f 72 74 2c 20 4f 45 5f 49 67 6e 6f 72 65 2c  bort, OE_Ignore,
177f0 20 4f 45 5f 52 65 70 6c 61 63 65 2c 20 6f 72 20   OE_Replace, or 
17800 4f 45 5f 4e 6f 6e 65 20 2a 2f 0a 20 20 54 6f 6b  OE_None */.  Tok
17810 65 6e 20 2a 70 53 74 61 72 74 2c 20 20 20 20 20  en *pStart,     
17820 2f 2a 20 54 68 65 20 43 52 45 41 54 45 20 74 6f  /* The CREATE to
17830 6b 65 6e 20 74 68 61 74 20 62 65 67 69 6e 73 20  ken that begins 
17840 74 68 69 73 20 73 74 61 74 65 6d 65 6e 74 20 2a  this statement *
17850 2f 0a 20 20 45 78 70 72 20 2a 70 50 49 57 68 65  /.  Expr *pPIWhe
17860 72 65 2c 20 20 20 20 2f 2a 20 57 48 45 52 45 20  re,    /* WHERE 
17870 63 6c 61 75 73 65 20 66 6f 72 20 70 61 72 74 69  clause for parti
17880 61 6c 20 69 6e 64 69 63 65 73 20 2a 2f 0a 20 20  al indices */.  
17890 69 6e 74 20 73 6f 72 74 4f 72 64 65 72 2c 20 20  int sortOrder,  
178a0 20 20 20 2f 2a 20 53 6f 72 74 20 6f 72 64 65 72     /* Sort order
178b0 20 6f 66 20 70 72 69 6d 61 72 79 20 6b 65 79 20   of primary key 
178c0 77 68 65 6e 20 70 4c 69 73 74 3d 3d 4e 55 4c 4c  when pList==NULL
178d0 20 2a 2f 0a 20 20 69 6e 74 20 69 66 4e 6f 74 45   */.  int ifNotE
178e0 78 69 73 74 20 20 20 20 20 2f 2a 20 4f 6d 69 74  xist     /* Omit
178f0 20 65 72 72 6f 72 20 69 66 20 69 6e 64 65 78 20   error if index 
17900 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 20 2a  already exists *
17910 2f 0a 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 52  /.){.  Index *pR
17920 65 74 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 50  et = 0;     /* P
17930 6f 69 6e 74 65 72 20 74 6f 20 72 65 74 75 72 6e  ointer to return
17940 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61   */.  Table *pTa
17950 62 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 54 61  b = 0;     /* Ta
17960 62 6c 65 20 74 6f 20 62 65 20 69 6e 64 65 78 65  ble to be indexe
17970 64 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49  d */.  Index *pI
17980 6e 64 65 78 20 3d 20 30 3b 20 20 20 2f 2a 20 54  ndex = 0;   /* T
17990 68 65 20 69 6e 64 65 78 20 74 6f 20 62 65 20 63  he index to be c
179a0 72 65 61 74 65 64 20 2a 2f 0a 20 20 63 68 61 72  reated */.  char
179b0 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b 20 20 20 20   *zName = 0;    
179c0 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
179d0 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 6e  index */.  int n
179e0 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20  Name;           
179f0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 68 61  /* Number of cha
17a00 72 61 63 74 65 72 73 20 69 6e 20 7a 4e 61 6d 65  racters in zName
17a10 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a   */.  int i, j;.
17a20 20 20 44 62 46 69 78 65 72 20 73 46 69 78 3b 20    DbFixer sFix; 
17a30 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 61 73         /* For as
17a40 73 69 67 6e 69 6e 67 20 64 61 74 61 62 61 73 65  signing database
17a50 20 6e 61 6d 65 73 20 74 6f 20 70 54 61 62 6c 65   names to pTable
17a60 20 2a 2f 0a 20 20 69 6e 74 20 73 6f 72 74 4f 72   */.  int sortOr
17a70 64 65 72 4d 61 73 6b 3b 20 20 20 2f 2a 20 31 20  derMask;   /* 1 
17a80 74 6f 20 68 6f 6e 6f 72 20 44 45 53 43 20 69 6e  to honor DESC in
17a90 20 69 6e 64 65 78 2e 20 20 30 20 74 6f 20 69 67   index.  0 to ig
17aa0 6e 6f 72 65 2e 20 2a 2f 0a 20 20 73 71 6c 69 74  nore. */.  sqlit
17ab0 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
17ac0 3e 64 62 3b 0a 20 20 44 62 20 2a 70 44 62 3b 20  >db;.  Db *pDb; 
17ad0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
17ae0 68 65 20 73 70 65 63 69 66 69 63 20 74 61 62 6c  he specific tabl
17af0 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  e containing the
17b00 20 69 6e 64 65 78 65 64 20 64 61 74 61 62 61 73   indexed databas
17b10 65 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62 3b 20  e */.  int iDb; 
17b20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
17b30 6e 64 65 78 20 6f 66 20 74 68 65 20 64 61 74 61  ndex of the data
17b40 62 61 73 65 20 74 68 61 74 20 69 73 20 62 65 69  base that is bei
17b50 6e 67 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20  ng written */.  
17b60 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 20 3d 20 30  Token *pName = 0
17b70 3b 20 20 20 20 2f 2a 20 55 6e 71 75 61 6c 69 66  ;    /* Unqualif
17b80 69 65 64 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  ied name of the 
17b90 69 6e 64 65 78 20 74 6f 20 63 72 65 61 74 65 20  index to create 
17ba0 2a 2f 0a 20 20 73 74 72 75 63 74 20 45 78 70 72  */.  struct Expr
17bb0 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4c 69 73 74  List_item *pList
17bc0 49 74 65 6d 3b 20 2f 2a 20 46 6f 72 20 6c 6f 6f  Item; /* For loo
17bd0 70 69 6e 67 20 6f 76 65 72 20 70 4c 69 73 74 20  ping over pList 
17be0 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 20  */.  int nExtra 
17bf0 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
17c00 20 20 20 20 20 20 2f 2a 20 53 70 61 63 65 20 61        /* Space a
17c10 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 7a 45 78  llocated for zEx
17c20 74 72 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e  tra[] */.  int n
17c30 45 78 74 72 61 43 6f 6c 3b 20 20 20 20 20 20 20  ExtraCol;       
17c40 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
17c50 75 6d 62 65 72 20 6f 66 20 65 78 74 72 61 20 63  umber of extra c
17c60 6f 6c 75 6d 6e 73 20 6e 65 65 64 65 64 20 2a 2f  olumns needed */
17c70 0a 20 20 63 68 61 72 20 2a 7a 45 78 74 72 61 20  .  char *zExtra 
17c80 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
17c90 20 20 20 20 2f 2a 20 45 78 74 72 61 20 73 70 61      /* Extra spa
17ca0 63 65 20 61 66 74 65 72 20 74 68 65 20 49 6e 64  ce after the Ind
17cb0 65 78 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 49  ex object */.  I
17cc0 6e 64 65 78 20 2a 70 50 6b 20 3d 20 30 3b 20 20  ndex *pPk = 0;  
17cd0 20 20 20 20 2f 2a 20 50 52 49 4d 41 52 59 20 4b      /* PRIMARY K
17ce0 45 59 20 69 6e 64 65 78 20 66 6f 72 20 57 49 54  EY index for WIT
17cf0 48 4f 55 54 20 52 4f 57 49 44 20 74 61 62 6c 65  HOUT ROWID table
17d00 73 20 2a 2f 0a 0a 20 20 69 66 28 20 64 62 2d 3e  s */..  if( db->
17d10 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20  mallocFailed || 
17d20 49 4e 5f 44 45 43 4c 41 52 45 5f 56 54 41 42 20  IN_DECLARE_VTAB 
17d30 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3e  || pParse->nErr>
17d40 30 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78  0 ){.    goto ex
17d50 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
17d60 0a 20 20 7d 0a 20 20 69 66 28 20 53 51 4c 49 54  .  }.  if( SQLIT
17d70 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65 61  E_OK!=sqlite3Rea
17d80 64 53 63 68 65 6d 61 28 70 50 61 72 73 65 29 20  dSchema(pParse) 
17d90 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74  ){.    goto exit
17da0 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
17db0 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46 69   }..  /*.  ** Fi
17dc0 6e 64 20 74 68 65 20 74 61 62 6c 65 20 74 68 61  nd the table tha
17dd0 74 20 69 73 20 74 6f 20 62 65 20 69 6e 64 65 78  t is to be index
17de0 65 64 2e 20 20 52 65 74 75 72 6e 20 65 61 72 6c  ed.  Return earl
17df0 79 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a  y if not found..
17e00 20 20 2a 2f 0a 20 20 69 66 28 20 70 54 62 6c 4e    */.  if( pTblN
17e10 61 6d 65 21 3d 30 20 29 7b 0a 0a 20 20 20 20 2f  ame!=0 ){..    /
17e20 2a 20 55 73 65 20 74 68 65 20 74 77 6f 2d 70 61  * Use the two-pa
17e30 72 74 20 69 6e 64 65 78 20 6e 61 6d 65 20 74 6f  rt index name to
17e40 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20 64   determine the d
17e50 61 74 61 62 61 73 65 20 0a 20 20 20 20 2a 2a 20  atabase .    ** 
17e60 74 6f 20 73 65 61 72 63 68 20 66 6f 72 20 74 68  to search for th
17e70 65 20 74 61 62 6c 65 2e 20 27 46 69 78 27 20 74  e table. 'Fix' t
17e80 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 74 6f  he table name to
17e90 20 74 68 69 73 20 64 62 0a 20 20 20 20 2a 2a 20   this db.    ** 
17ea0 62 65 66 6f 72 65 20 6c 6f 6f 6b 69 6e 67 20 75  before looking u
17eb0 70 20 74 68 65 20 74 61 62 6c 65 2e 0a 20 20 20  p the table..   
17ec0 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
17ed0 70 4e 61 6d 65 31 20 26 26 20 70 4e 61 6d 65 32  pName1 && pName2
17ee0 20 29 3b 0a 20 20 20 20 69 44 62 20 3d 20 73 71   );.    iDb = sq
17ef0 6c 69 74 65 33 54 77 6f 50 61 72 74 4e 61 6d 65  lite3TwoPartName
17f00 28 70 50 61 72 73 65 2c 20 70 4e 61 6d 65 31 2c  (pParse, pName1,
17f10 20 70 4e 61 6d 65 32 2c 20 26 70 4e 61 6d 65 29   pName2, &pName)
17f20 3b 0a 20 20 20 20 69 66 28 20 69 44 62 3c 30 20  ;.    if( iDb<0 
17f30 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61  ) goto exit_crea
17f40 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 61 73  te_index;.    as
17f50 73 65 72 74 28 20 70 4e 61 6d 65 20 26 26 20 70  sert( pName && p
17f60 4e 61 6d 65 2d 3e 7a 20 29 3b 0a 0a 23 69 66 6e  Name->z );..#ifn
17f70 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
17f80 54 45 4d 50 44 42 0a 20 20 20 20 2f 2a 20 49 66  TEMPDB.    /* If
17f90 20 74 68 65 20 69 6e 64 65 78 20 6e 61 6d 65 20   the index name 
17fa0 77 61 73 20 75 6e 71 75 61 6c 69 66 69 65 64 2c  was unqualified,
17fb0 20 63 68 65 63 6b 20 69 66 20 74 68 65 20 74 61   check if the ta
17fc0 62 6c 65 0a 20 20 20 20 2a 2a 20 69 73 20 61 20  ble.    ** is a 
17fd0 74 65 6d 70 20 74 61 62 6c 65 2e 20 49 66 20 73  temp table. If s
17fe0 6f 2c 20 73 65 74 20 74 68 65 20 64 61 74 61 62  o, set the datab
17ff0 61 73 65 20 74 6f 20 31 2e 20 44 6f 20 6e 6f 74  ase to 1. Do not
18000 20 64 6f 20 74 68 69 73 0a 20 20 20 20 2a 2a 20   do this.    ** 
18010 69 66 20 69 6e 69 74 69 61 6c 69 73 69 6e 67 20  if initialising 
18020 61 20 64 61 74 61 62 61 73 65 20 73 63 68 65 6d  a database schem
18030 61 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  a..    */.    if
18040 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  ( !db->init.busy
18050 20 29 7b 0a 20 20 20 20 20 20 70 54 61 62 20 3d   ){.      pTab =
18060 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 4c   sqlite3SrcListL
18070 6f 6f 6b 75 70 28 70 50 61 72 73 65 2c 20 70 54  ookup(pParse, pT
18080 62 6c 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 69  blName);.      i
18090 66 28 20 70 4e 61 6d 65 32 2d 3e 6e 3d 3d 30 20  f( pName2->n==0 
180a0 26 26 20 70 54 61 62 20 26 26 20 70 54 61 62 2d  && pTab && pTab-
180b0 3e 70 53 63 68 65 6d 61 3d 3d 64 62 2d 3e 61 44  >pSchema==db->aD
180c0 62 5b 31 5d 2e 70 53 63 68 65 6d 61 20 29 7b 0a  b[1].pSchema ){.
180d0 20 20 20 20 20 20 20 20 69 44 62 20 3d 20 31 3b          iDb = 1;
180e0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23  .      }.    }.#
180f0 65 6e 64 69 66 0a 0a 20 20 20 20 73 71 6c 69 74  endif..    sqlit
18100 65 33 46 69 78 49 6e 69 74 28 26 73 46 69 78 2c  e3FixInit(&sFix,
18110 20 70 50 61 72 73 65 2c 20 69 44 62 2c 20 22 69   pParse, iDb, "i
18120 6e 64 65 78 22 2c 20 70 4e 61 6d 65 29 3b 0a 20  ndex", pName);. 
18130 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 46 69     if( sqlite3Fi
18140 78 53 72 63 4c 69 73 74 28 26 73 46 69 78 2c 20  xSrcList(&sFix, 
18150 70 54 62 6c 4e 61 6d 65 29 20 29 7b 0a 20 20 20  pTblName) ){.   
18160 20 20 20 2f 2a 20 42 65 63 61 75 73 65 20 74 68     /* Because th
18170 65 20 70 61 72 73 65 72 20 63 6f 6e 73 74 72 75  e parser constru
18180 63 74 73 20 70 54 62 6c 4e 61 6d 65 20 66 72 6f  cts pTblName fro
18190 6d 20 61 20 73 69 6e 67 6c 65 20 69 64 65 6e 74  m a single ident
181a0 69 66 69 65 72 2c 0a 20 20 20 20 20 20 2a 2a 20  ifier,.      ** 
181b0 73 71 6c 69 74 65 33 46 69 78 53 72 63 4c 69 73  sqlite3FixSrcLis
181c0 74 20 63 61 6e 20 6e 65 76 65 72 20 66 61 69 6c  t can never fail
181d0 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72  . */.      asser
181e0 74 28 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  t(0);.    }.    
181f0 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33 4c 6f  pTab = sqlite3Lo
18200 63 61 74 65 54 61 62 6c 65 49 74 65 6d 28 70 50  cateTableItem(pP
18210 61 72 73 65 2c 20 30 2c 20 26 70 54 62 6c 4e 61  arse, 0, &pTblNa
18220 6d 65 2d 3e 61 5b 30 5d 29 3b 0a 20 20 20 20 61  me->a[0]);.    a
18230 73 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f  ssert( db->mallo
18240 63 46 61 69 6c 65 64 3d 3d 30 20 7c 7c 20 70 54  cFailed==0 || pT
18250 61 62 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28  ab==0 );.    if(
18260 20 70 54 61 62 3d 3d 30 20 29 20 67 6f 74 6f 20   pTab==0 ) goto 
18270 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
18280 78 3b 0a 20 20 20 20 69 66 28 20 69 44 62 3d 3d  x;.    if( iDb==
18290 31 20 26 26 20 64 62 2d 3e 61 44 62 5b 69 44 62  1 && db->aDb[iDb
182a0 5d 2e 70 53 63 68 65 6d 61 21 3d 70 54 61 62 2d  ].pSchema!=pTab-
182b0 3e 70 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20  >pSchema ){.    
182c0 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
182d0 67 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20  g(pParse, .     
182e0 20 20 20 20 20 20 22 63 61 6e 6e 6f 74 20 63 72        "cannot cr
182f0 65 61 74 65 20 61 20 54 45 4d 50 20 69 6e 64 65  eate a TEMP inde
18300 78 20 6f 6e 20 6e 6f 6e 2d 54 45 4d 50 20 74 61  x on non-TEMP ta
18310 62 6c 65 20 5c 22 25 73 5c 22 22 2c 0a 20 20 20  ble \"%s\"",.   
18320 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e 7a 4e          pTab->zN
18330 61 6d 65 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f  ame);.      goto
18340 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
18350 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ex;.    }.    if
18360 28 20 21 48 61 73 52 6f 77 69 64 28 70 54 61 62  ( !HasRowid(pTab
18370 29 20 29 20 70 50 6b 20 3d 20 73 71 6c 69 74 65  ) ) pPk = sqlite
18380 33 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65 78  3PrimaryKeyIndex
18390 28 70 54 61 62 29 3b 0a 20 20 7d 65 6c 73 65 7b  (pTab);.  }else{
183a0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 61  .    assert( pNa
183b0 6d 65 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73  me==0 );.    ass
183c0 65 72 74 28 20 70 53 74 61 72 74 3d 3d 30 20 29  ert( pStart==0 )
183d0 3b 0a 20 20 20 20 70 54 61 62 20 3d 20 70 50 61  ;.    pTab = pPa
183e0 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a  rse->pNewTable;.
183f0 20 20 20 20 69 66 28 20 21 70 54 61 62 20 29 20      if( !pTab ) 
18400 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
18410 5f 69 6e 64 65 78 3b 0a 20 20 20 20 69 44 62 20  _index;.    iDb 
18420 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54  = sqlite3SchemaT
18430 6f 49 6e 64 65 78 28 64 62 2c 20 70 54 61 62 2d  oIndex(db, pTab-
18440 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 7d 0a 20  >pSchema);.  }. 
18450 20 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b   pDb = &db->aDb[
18460 69 44 62 5d 3b 0a 0a 20 20 61 73 73 65 72 74 28  iDb];..  assert(
18470 20 70 54 61 62 21 3d 30 20 29 3b 0a 20 20 61 73   pTab!=0 );.  as
18480 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 6e 45  sert( pParse->nE
18490 72 72 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 73  rr==0 );.  if( s
184a0 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28 70  qlite3StrNICmp(p
184b0 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 22 73 71 6c  Tab->zName, "sql
184c0 69 74 65 5f 22 2c 20 37 29 3d 3d 30 20 0a 20 20  ite_", 7)==0 .  
184d0 20 20 20 20 20 26 26 20 64 62 2d 3e 69 6e 69 74       && db->init
184e0 2e 62 75 73 79 3d 3d 30 0a 23 69 66 20 53 51 4c  .busy==0.#if SQL
184f0 49 54 45 5f 55 53 45 52 5f 41 55 54 48 45 4e 54  ITE_USER_AUTHENT
18500 49 43 41 54 49 4f 4e 0a 20 20 20 20 20 20 20 26  ICATION.       &
18510 26 20 73 71 6c 69 74 65 33 55 73 65 72 41 75 74  & sqlite3UserAut
18520 68 54 61 62 6c 65 28 70 54 61 62 2d 3e 7a 4e 61  hTable(pTab->zNa
18530 6d 65 29 3d 3d 30 0a 23 65 6e 64 69 66 0a 20 20  me)==0.#endif.  
18540 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 53       && sqlite3S
18550 74 72 4e 49 43 6d 70 28 26 70 54 61 62 2d 3e 7a  trNICmp(&pTab->z
18560 4e 61 6d 65 5b 37 5d 2c 22 61 6c 74 65 72 74 61  Name[7],"alterta
18570 62 5f 22 2c 39 29 21 3d 30 20 29 7b 0a 20 20 20  b_",9)!=0 ){.   
18580 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
18590 28 70 50 61 72 73 65 2c 20 22 74 61 62 6c 65 20  (pParse, "table 
185a0 25 73 20 6d 61 79 20 6e 6f 74 20 62 65 20 69 6e  %s may not be in
185b0 64 65 78 65 64 22 2c 20 70 54 61 62 2d 3e 7a 4e  dexed", pTab->zN
185c0 61 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65  ame);.    goto e
185d0 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
185e0 3b 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51  ;.  }.#ifndef SQ
185f0 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 20  LITE_OMIT_VIEW. 
18600 20 69 66 28 20 70 54 61 62 2d 3e 70 53 65 6c 65   if( pTab->pSele
18610 63 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ct ){.    sqlite
18620 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
18630 2c 20 22 76 69 65 77 73 20 6d 61 79 20 6e 6f 74  , "views may not
18640 20 62 65 20 69 6e 64 65 78 65 64 22 29 3b 0a 20   be indexed");. 
18650 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65     goto exit_cre
18660 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 23  ate_index;.  }.#
18670 65 6e 64 69 66 0a 23 69 66 6e 64 65 66 20 53 51  endif.#ifndef SQ
18680 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
18690 4c 54 41 42 4c 45 0a 20 20 69 66 28 20 49 73 56  LTABLE.  if( IsV
186a0 69 72 74 75 61 6c 28 70 54 61 62 29 20 29 7b 0a  irtual(pTab) ){.
186b0 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
186c0 4d 73 67 28 70 50 61 72 73 65 2c 20 22 76 69 72  Msg(pParse, "vir
186d0 74 75 61 6c 20 74 61 62 6c 65 73 20 6d 61 79 20  tual tables may 
186e0 6e 6f 74 20 62 65 20 69 6e 64 65 78 65 64 22 29  not be indexed")
186f0 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f  ;.    goto exit_
18700 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
18710 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 0a 20  }.#endif..  /*. 
18720 20 2a 2a 20 46 69 6e 64 20 74 68 65 20 6e 61 6d   ** Find the nam
18730 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e 20  e of the index. 
18740 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 72 65   Make sure there
18750 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20   is not already 
18760 61 6e 6f 74 68 65 72 0a 20 20 2a 2a 20 69 6e 64  another.  ** ind
18770 65 78 20 6f 72 20 74 61 62 6c 65 20 77 69 74 68  ex or table with
18780 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 2e 20   the same name. 
18790 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 78 63 65   .  **.  ** Exce
187a0 70 74 69 6f 6e 3a 20 20 49 66 20 77 65 20 61 72  ption:  If we ar
187b0 65 20 72 65 61 64 69 6e 67 20 74 68 65 20 6e 61  e reading the na
187c0 6d 65 73 20 6f 66 20 70 65 72 6d 61 6e 65 6e 74  mes of permanent
187d0 20 69 6e 64 69 63 65 73 20 66 72 6f 6d 20 74 68   indices from th
187e0 65 0a 20 20 2a 2a 20 73 71 6c 69 74 65 5f 6d 61  e.  ** sqlite_ma
187f0 73 74 65 72 20 74 61 62 6c 65 20 28 62 65 63 61  ster table (beca
18800 75 73 65 20 73 6f 6d 65 20 6f 74 68 65 72 20 70  use some other p
18810 72 6f 63 65 73 73 20 63 68 61 6e 67 65 64 20 74  rocess changed t
18820 68 65 20 73 63 68 65 6d 61 29 20 61 6e 64 0a 20  he schema) and. 
18830 20 2a 2a 20 6f 6e 65 20 6f 66 20 74 68 65 20 69   ** one of the i
18840 6e 64 65 78 20 6e 61 6d 65 73 20 63 6f 6c 6c 69  ndex names colli
18850 64 65 73 20 77 69 74 68 20 74 68 65 20 6e 61 6d  des with the nam
18860 65 20 6f 66 20 61 20 74 65 6d 70 6f 72 61 72 79  e of a temporary
18870 20 74 61 62 6c 65 20 6f 72 0a 20 20 2a 2a 20 69   table or.  ** i
18880 6e 64 65 78 2c 20 74 68 65 6e 20 77 65 20 77 69  ndex, then we wi
18890 6c 6c 20 63 6f 6e 74 69 6e 75 65 20 74 6f 20 70  ll continue to p
188a0 72 6f 63 65 73 73 20 74 68 69 73 20 69 6e 64 65  rocess this inde
188b0 78 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20  x..  **.  ** If 
188c0 70 4e 61 6d 65 3d 3d 30 20 69 74 20 6d 65 61 6e  pName==0 it mean
188d0 73 20 74 68 61 74 20 77 65 20 61 72 65 0a 20 20  s that we are.  
188e0 2a 2a 20 64 65 61 6c 69 6e 67 20 77 69 74 68 20  ** dealing with 
188f0 61 20 70 72 69 6d 61 72 79 20 6b 65 79 20 6f 72  a primary key or
18900 20 55 4e 49 51 55 45 20 63 6f 6e 73 74 72 61 69   UNIQUE constrai
18910 6e 74 2e 20 20 57 65 20 68 61 76 65 20 74 6f 20  nt.  We have to 
18920 69 6e 76 65 6e 74 20 6f 75 72 0a 20 20 2a 2a 20  invent our.  ** 
18930 6f 77 6e 20 6e 61 6d 65 2e 0a 20 20 2a 2f 0a 20  own name..  */. 
18940 20 69 66 28 20 70 4e 61 6d 65 20 29 7b 0a 20 20   if( pName ){.  
18950 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65    zName = sqlite
18960 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64  3NameFromToken(d
18970 62 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 20 20 69  b, pName);.    i
18980 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 20 67 6f  f( zName==0 ) go
18990 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
189a0 6e 64 65 78 3b 0a 20 20 20 20 61 73 73 65 72 74  ndex;.    assert
189b0 28 20 70 4e 61 6d 65 2d 3e 7a 21 3d 30 20 29 3b  ( pName->z!=0 );
189c0 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f  .    if( SQLITE_
189d0 4f 4b 21 3d 73 71 6c 69 74 65 33 43 68 65 63 6b  OK!=sqlite3Check
189e0 4f 62 6a 65 63 74 4e 61 6d 65 28 70 50 61 72 73  ObjectName(pPars
189f0 65 2c 20 7a 4e 61 6d 65 29 20 29 7b 0a 20 20 20  e, zName) ){.   
18a00 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65     goto exit_cre
18a10 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d  ate_index;.    }
18a20 0a 20 20 20 20 69 66 28 20 21 64 62 2d 3e 69 6e  .    if( !db->in
18a30 69 74 2e 62 75 73 79 20 29 7b 0a 20 20 20 20 20  it.busy ){.     
18a40 20 69 66 28 20 73 71 6c 69 74 65 33 46 69 6e 64   if( sqlite3Find
18a50 54 61 62 6c 65 28 64 62 2c 20 7a 4e 61 6d 65 2c  Table(db, zName,
18a60 20 30 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20   0)!=0 ){.      
18a70 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
18a80 67 28 70 50 61 72 73 65 2c 20 22 74 68 65 72 65  g(pParse, "there
18a90 20 69 73 20 61 6c 72 65 61 64 79 20 61 20 74 61   is already a ta
18aa0 62 6c 65 20 6e 61 6d 65 64 20 25 73 22 2c 20 7a  ble named %s", z
18ab0 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 67  Name);.        g
18ac0 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
18ad0 69 6e 64 65 78 3b 0a 20 20 20 20 20 20 7d 0a 20  index;.      }. 
18ae0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 71 6c     }.    if( sql
18af0 69 74 65 33 46 69 6e 64 49 6e 64 65 78 28 64 62  ite3FindIndex(db
18b00 2c 20 7a 4e 61 6d 65 2c 20 70 44 62 2d 3e 7a 4e  , zName, pDb->zN
18b10 61 6d 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  ame)!=0 ){.     
18b20 20 69 66 28 20 21 69 66 4e 6f 74 45 78 69 73 74   if( !ifNotExist
18b30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
18b40 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
18b50 73 65 2c 20 22 69 6e 64 65 78 20 25 73 20 61 6c  se, "index %s al
18b60 72 65 61 64 79 20 65 78 69 73 74 73 22 2c 20 7a  ready exists", z
18b70 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c  Name);.      }el
18b80 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65  se{.        asse
18b90 72 74 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75  rt( !db->init.bu
18ba0 73 79 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71  sy );.        sq
18bb0 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66 79 53  lite3CodeVerifyS
18bc0 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20 69 44  chema(pParse, iD
18bd0 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  b);.      }.    
18be0 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61    goto exit_crea
18bf0 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a  te_index;.    }.
18c00 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74    }else{.    int
18c10 20 6e 3b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70   n;.    Index *p
18c20 4c 6f 6f 70 3b 0a 20 20 20 20 66 6f 72 28 70 4c  Loop;.    for(pL
18c30 6f 6f 70 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78  oop=pTab->pIndex
18c40 2c 20 6e 3d 31 3b 20 70 4c 6f 6f 70 3b 20 70 4c  , n=1; pLoop; pL
18c50 6f 6f 70 3d 70 4c 6f 6f 70 2d 3e 70 4e 65 78 74  oop=pLoop->pNext
18c60 2c 20 6e 2b 2b 29 7b 7d 0a 20 20 20 20 7a 4e 61  , n++){}.    zNa
18c70 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69  me = sqlite3MPri
18c80 6e 74 66 28 64 62 2c 20 22 73 71 6c 69 74 65 5f  ntf(db, "sqlite_
18c90 61 75 74 6f 69 6e 64 65 78 5f 25 73 5f 25 64 22  autoindex_%s_%d"
18ca0 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 6e  , pTab->zName, n
18cb0 29 3b 0a 20 20 20 20 69 66 28 20 7a 4e 61 6d 65  );.    if( zName
18cc0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  ==0 ){.      got
18cd0 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
18ce0 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  dex;.    }.  }..
18cf0 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 61    /* Check for a
18d00 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20 74 6f 20  uthorization to 
18d10 63 72 65 61 74 65 20 61 6e 20 69 6e 64 65 78 2e  create an index.
18d20 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  .  */.#ifndef SQ
18d30 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52  LITE_OMIT_AUTHOR
18d40 49 5a 41 54 49 4f 4e 0a 20 20 7b 0a 20 20 20 20  IZATION.  {.    
18d50 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 20  const char *zDb 
18d60 3d 20 70 44 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20  = pDb->zName;.  
18d70 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74    if( sqlite3Aut
18d80 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53  hCheck(pParse, S
18d90 51 4c 49 54 45 5f 49 4e 53 45 52 54 2c 20 53 43  QLITE_INSERT, SC
18da0 48 45 4d 41 5f 54 41 42 4c 45 28 69 44 62 29 2c  HEMA_TABLE(iDb),
18db0 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20   0, zDb) ){.    
18dc0 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61    goto exit_crea
18dd0 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a  te_index;.    }.
18de0 20 20 20 20 69 20 3d 20 53 51 4c 49 54 45 5f 43      i = SQLITE_C
18df0 52 45 41 54 45 5f 49 4e 44 45 58 3b 0a 20 20 20  REATE_INDEX;.   
18e00 20 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44   if( !OMIT_TEMPD
18e10 42 20 26 26 20 69 44 62 3d 3d 31 20 29 20 69 20  B && iDb==1 ) i 
18e20 3d 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f  = SQLITE_CREATE_
18e30 54 45 4d 50 5f 49 4e 44 45 58 3b 0a 20 20 20 20  TEMP_INDEX;.    
18e40 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43  if( sqlite3AuthC
18e50 68 65 63 6b 28 70 50 61 72 73 65 2c 20 69 2c 20  heck(pParse, i, 
18e60 7a 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 7a 4e 61  zName, pTab->zNa
18e70 6d 65 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20  me, zDb) ){.    
18e80 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61    goto exit_crea
18e90 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a  te_index;.    }.
18ea0 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a    }.#endif..  /*
18eb0 20 49 66 20 70 4c 69 73 74 3d 3d 30 2c 20 69 74   If pList==0, it
18ec0 20 6d 65 61 6e 73 20 74 68 69 73 20 72 6f 75 74   means this rout
18ed0 69 6e 65 20 77 61 73 20 63 61 6c 6c 65 64 20 74  ine was called t
18ee0 6f 20 6d 61 6b 65 20 61 20 70 72 69 6d 61 72 79  o make a primary
18ef0 0a 20 20 2a 2a 20 6b 65 79 20 6f 75 74 20 6f 66  .  ** key out of
18f00 20 74 68 65 20 6c 61 73 74 20 63 6f 6c 75 6d 6e   the last column
18f10 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 74 61   added to the ta
18f20 62 6c 65 20 75 6e 64 65 72 20 63 6f 6e 73 74 72  ble under constr
18f30 75 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 53 6f 20  uction..  ** So 
18f40 63 72 65 61 74 65 20 61 20 66 61 6b 65 20 6c 69  create a fake li
18f50 73 74 20 74 6f 20 73 69 6d 75 6c 61 74 65 20 74  st to simulate t
18f60 68 69 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  his..  */.  if( 
18f70 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20  pList==0 ){.    
18f80 54 6f 6b 65 6e 20 70 72 65 76 43 6f 6c 3b 0a 20  Token prevCol;. 
18f90 20 20 20 73 71 6c 69 74 65 33 54 6f 6b 65 6e 49     sqlite3TokenI
18fa0 6e 69 74 28 26 70 72 65 76 43 6f 6c 2c 20 70 54  nit(&prevCol, pT
18fb0 61 62 2d 3e 61 43 6f 6c 5b 70 54 61 62 2d 3e 6e  ab->aCol[pTab->n
18fc0 43 6f 6c 2d 31 5d 2e 7a 4e 61 6d 65 29 3b 0a 20  Col-1].zName);. 
18fd0 20 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74     pList = sqlit
18fe0 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64  e3ExprListAppend
18ff0 28 70 50 61 72 73 65 2c 20 30 2c 0a 20 20 20 20  (pParse, 0,.    
19000 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
19010 33 45 78 70 72 41 6c 6c 6f 63 28 64 62 2c 20 54  3ExprAlloc(db, T
19020 4b 5f 49 44 2c 20 26 70 72 65 76 43 6f 6c 2c 20  K_ID, &prevCol, 
19030 30 29 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69  0));.    if( pLi
19040 73 74 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78 69  st==0 ) goto exi
19050 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
19060 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 69 73      assert( pLis
19070 74 2d 3e 6e 45 78 70 72 3d 3d 31 20 29 3b 0a 20  t->nExpr==1 );. 
19080 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69     sqlite3ExprLi
19090 73 74 53 65 74 53 6f 72 74 4f 72 64 65 72 28 70  stSetSortOrder(p
190a0 4c 69 73 74 2c 20 73 6f 72 74 4f 72 64 65 72 29  List, sortOrder)
190b0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  ;.  }else{.    s
190c0 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 43 68  qlite3ExprListCh
190d0 65 63 6b 4c 65 6e 67 74 68 28 70 50 61 72 73 65  eckLength(pParse
190e0 2c 20 70 4c 69 73 74 2c 20 22 69 6e 64 65 78 22  , pList, "index"
190f0 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 67  );.  }..  /* Fig
19100 75 72 65 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79  ure out how many
19110 20 62 79 74 65 73 20 6f 66 20 73 70 61 63 65 20   bytes of space 
19120 61 72 65 20 72 65 71 75 69 72 65 64 20 74 6f 20  are required to 
19130 73 74 6f 72 65 20 65 78 70 6c 69 63 69 74 6c 79  store explicitly
19140 0a 20 20 2a 2a 20 73 70 65 63 69 66 69 65 64 20  .  ** specified 
19150 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
19160 63 65 20 6e 61 6d 65 73 2e 0a 20 20 2a 2f 0a 20  ce names..  */. 
19170 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73   for(i=0; i<pLis
19180 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  t->nExpr; i++){.
19190 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 20      Expr *pExpr 
191a0 3d 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45  = pList->a[i].pE
191b0 78 70 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28  xpr;.    assert(
191c0 20 70 45 78 70 72 21 3d 30 20 29 3b 0a 20 20 20   pExpr!=0 );.   
191d0 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d   if( pExpr->op==
191e0 54 4b 5f 43 4f 4c 4c 41 54 45 20 29 7b 0a 20 20  TK_COLLATE ){.  
191f0 20 20 20 20 6e 45 78 74 72 61 20 2b 3d 20 28 31      nExtra += (1
19200 20 2b 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   + sqlite3Strlen
19210 33 30 28 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b  30(pExpr->u.zTok
19220 65 6e 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  en));.    }.  }.
19230 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 41 6c 6c 6f  .  /* .  ** Allo
19240 63 61 74 65 20 74 68 65 20 69 6e 64 65 78 20 73  cate the index s
19250 74 72 75 63 74 75 72 65 2e 20 0a 20 20 2a 2f 0a  tructure. .  */.
19260 20 20 6e 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65    nName = sqlite
19270 33 53 74 72 6c 65 6e 33 30 28 7a 4e 61 6d 65 29  3Strlen30(zName)
19280 3b 0a 20 20 6e 45 78 74 72 61 43 6f 6c 20 3d 20  ;.  nExtraCol = 
19290 70 50 6b 20 3f 20 70 50 6b 2d 3e 6e 4b 65 79 43  pPk ? pPk->nKeyC
192a0 6f 6c 20 3a 20 31 3b 0a 20 20 70 49 6e 64 65 78  ol : 1;.  pIndex
192b0 20 3d 20 73 71 6c 69 74 65 33 41 6c 6c 6f 63 61   = sqlite3Alloca
192c0 74 65 49 6e 64 65 78 4f 62 6a 65 63 74 28 64 62  teIndexObject(db
192d0 2c 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 2b  , pList->nExpr +
192e0 20 6e 45 78 74 72 61 43 6f 6c 2c 0a 20 20 20 20   nExtraCol,.    
192f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19310 20 20 6e 4e 61 6d 65 20 2b 20 6e 45 78 74 72 61    nName + nExtra
19320 20 2b 20 31 2c 20 26 7a 45 78 74 72 61 29 3b 0a   + 1, &zExtra);.
19330 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
19340 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f  Failed ){.    go
19350 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
19360 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 61 73 73 65  ndex;.  }.  asse
19370 72 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41  rt( EIGHT_BYTE_A
19380 4c 49 47 4e 4d 45 4e 54 28 70 49 6e 64 65 78 2d  LIGNMENT(pIndex-
19390 3e 61 69 52 6f 77 4c 6f 67 45 73 74 29 20 29 3b  >aiRowLogEst) );
193a0 0a 20 20 61 73 73 65 72 74 28 20 45 49 47 48 54  .  assert( EIGHT
193b0 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28  _BYTE_ALIGNMENT(
193c0 70 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c 29 20  pIndex->azColl) 
193d0 29 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 7a 4e 61  );.  pIndex->zNa
193e0 6d 65 20 3d 20 7a 45 78 74 72 61 3b 0a 20 20 7a  me = zExtra;.  z
193f0 45 78 74 72 61 20 2b 3d 20 6e 4e 61 6d 65 20 2b  Extra += nName +
19400 20 31 3b 0a 20 20 6d 65 6d 63 70 79 28 70 49 6e   1;.  memcpy(pIn
19410 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d  dex->zName, zNam
19420 65 2c 20 6e 4e 61 6d 65 2b 31 29 3b 0a 20 20 70  e, nName+1);.  p
19430 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 20 3d 20  Index->pTable = 
19440 70 54 61 62 3b 0a 20 20 70 49 6e 64 65 78 2d 3e  pTab;.  pIndex->
19450 6f 6e 45 72 72 6f 72 20 3d 20 28 75 38 29 6f 6e  onError = (u8)on
19460 45 72 72 6f 72 3b 0a 20 20 70 49 6e 64 65 78 2d  Error;.  pIndex-
19470 3e 75 6e 69 71 4e 6f 74 4e 75 6c 6c 20 3d 20 6f  >uniqNotNull = o
19480 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 3b  nError!=OE_None;
19490 0a 20 20 70 49 6e 64 65 78 2d 3e 69 64 78 54 79  .  pIndex->idxTy
194a0 70 65 20 3d 20 70 4e 61 6d 65 20 3f 20 53 51 4c  pe = pName ? SQL
194b0 49 54 45 5f 49 44 58 54 59 50 45 5f 41 50 50 44  ITE_IDXTYPE_APPD
194c0 45 46 20 3a 20 53 51 4c 49 54 45 5f 49 44 58 54  EF : SQLITE_IDXT
194d0 59 50 45 5f 55 4e 49 51 55 45 3b 0a 20 20 70 49  YPE_UNIQUE;.  pI
194e0 6e 64 65 78 2d 3e 70 53 63 68 65 6d 61 20 3d 20  ndex->pSchema = 
194f0 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53 63  db->aDb[iDb].pSc
19500 68 65 6d 61 3b 0a 20 20 70 49 6e 64 65 78 2d 3e  hema;.  pIndex->
19510 6e 4b 65 79 43 6f 6c 20 3d 20 70 4c 69 73 74 2d  nKeyCol = pList-
19520 3e 6e 45 78 70 72 3b 0a 20 20 69 66 28 20 70 50  >nExpr;.  if( pP
19530 49 57 68 65 72 65 20 29 7b 0a 20 20 20 20 73 71  IWhere ){.    sq
19540 6c 69 74 65 33 52 65 73 6f 6c 76 65 53 65 6c 66  lite3ResolveSelf
19550 52 65 66 65 72 65 6e 63 65 28 70 50 61 72 73 65  Reference(pParse
19560 2c 20 70 54 61 62 2c 20 4e 43 5f 50 61 72 74 49  , pTab, NC_PartI
19570 64 78 2c 20 70 50 49 57 68 65 72 65 2c 20 30 29  dx, pPIWhere, 0)
19580 3b 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e 70 50  ;.    pIndex->pP
19590 61 72 74 49 64 78 57 68 65 72 65 20 3d 20 70 50  artIdxWhere = pP
195a0 49 57 68 65 72 65 3b 0a 20 20 20 20 70 50 49 57  IWhere;.    pPIW
195b0 68 65 72 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  here = 0;.  }.  
195c0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 53  assert( sqlite3S
195d0 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64  chemaMutexHeld(d
195e0 62 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a 0a 20  b, iDb, 0) );.. 
195f0 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65   /* Check to see
19600 20 69 66 20 77 65 20 73 68 6f 75 6c 64 20 68 6f   if we should ho
19610 6e 6f 72 20 44 45 53 43 20 72 65 71 75 65 73 74  nor DESC request
19620 73 20 6f 6e 20 69 6e 64 65 78 20 63 6f 6c 75 6d  s on index colum
19630 6e 73 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 44  ns.  */.  if( pD
19640 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 66 69 6c 65  b->pSchema->file
19650 5f 66 6f 72 6d 61 74 3e 3d 34 20 29 7b 0a 20 20  _format>=4 ){.  
19660 20 20 73 6f 72 74 4f 72 64 65 72 4d 61 73 6b 20    sortOrderMask 
19670 3d 20 2d 31 3b 20 20 20 2f 2a 20 48 6f 6e 6f 72  = -1;   /* Honor
19680 20 44 45 53 43 20 2a 2f 0a 20 20 7d 65 6c 73 65   DESC */.  }else
19690 7b 0a 20 20 20 20 73 6f 72 74 4f 72 64 65 72 4d  {.    sortOrderM
196a0 61 73 6b 20 3d 20 30 3b 20 20 20 20 2f 2a 20 49  ask = 0;    /* I
196b0 67 6e 6f 72 65 20 44 45 53 43 20 2a 2f 0a 20 20  gnore DESC */.  
196c0 7d 0a 0a 20 20 2f 2a 20 41 6e 61 6c 79 7a 65 20  }..  /* Analyze 
196d0 74 68 65 20 6c 69 73 74 20 6f 66 20 65 78 70 72  the list of expr
196e0 65 73 73 69 6f 6e 73 20 74 68 61 74 20 66 6f 72  essions that for
196f0 6d 20 74 68 65 20 74 65 72 6d 73 20 6f 66 20 74  m the terms of t
19700 68 65 20 69 6e 64 65 78 20 61 6e 64 0a 20 20 2a  he index and.  *
19710 2a 20 72 65 70 6f 72 74 20 61 6e 79 20 65 72 72  * report any err
19720 6f 72 73 2e 20 20 49 6e 20 74 68 65 20 63 6f 6d  ors.  In the com
19730 6d 6f 6e 20 63 61 73 65 20 77 68 65 72 65 20 74  mon case where t
19740 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
19750 20 65 78 61 63 74 6c 79 0a 20 20 2a 2a 20 61 20   exactly.  ** a 
19760 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 2c 20 73 74  table column, st
19770 6f 72 65 20 74 68 61 74 20 63 6f 6c 75 6d 6e 20  ore that column 
19780 69 6e 20 61 69 43 6f 6c 75 6d 6e 5b 5d 2e 20 20  in aiColumn[].  
19790 46 6f 72 20 67 65 6e 65 72 61 6c 20 65 78 70 72  For general expr
197a0 65 73 73 69 6f 6e 73 2c 0a 20 20 2a 2a 20 70 6f  essions,.  ** po
197b0 70 75 6c 61 74 65 20 70 49 6e 64 65 78 2d 3e 61  pulate pIndex->a
197c0 43 6f 6c 45 78 70 72 20 61 6e 64 20 73 74 6f 72  ColExpr and stor
197d0 65 20 58 4e 5f 45 58 50 52 20 28 2d 32 29 20 69  e XN_EXPR (-2) i
197e0 6e 20 61 69 43 6f 6c 75 6d 6e 5b 5d 2e 0a 20 20  n aiColumn[]..  
197f0 2a 2a 0a 20 20 2a 2a 20 54 4f 44 4f 3a 20 49 73  **.  ** TODO: Is
19800 73 75 65 20 61 20 77 61 72 6e 69 6e 67 20 69 66  sue a warning if
19810 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 63 6f 6c   two or more col
19820 75 6d 6e 73 20 6f 66 20 74 68 65 20 69 6e 64 65  umns of the inde
19830 78 20 61 72 65 20 69 64 65 6e 74 69 63 61 6c 2e  x are identical.
19840 0a 20 20 2a 2a 20 54 4f 44 4f 3a 20 49 73 73 75  .  ** TODO: Issu
19850 65 20 61 20 77 61 72 6e 69 6e 67 20 69 66 20 74  e a warning if t
19860 68 65 20 74 61 62 6c 65 20 70 72 69 6d 61 72 79  he table primary
19870 20 6b 65 79 20 69 73 20 75 73 65 64 20 61 73 20   key is used as 
19880 70 61 72 74 20 6f 66 20 74 68 65 0a 20 20 2a 2a  part of the.  **
19890 20 69 6e 64 65 78 20 6b 65 79 2e 0a 20 20 2a 2f   index key..  */
198a0 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 4c 69 73  .  for(i=0, pLis
198b0 74 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 3b 20  tItem=pList->a; 
198c0 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20  i<pList->nExpr; 
198d0 69 2b 2b 2c 20 70 4c 69 73 74 49 74 65 6d 2b 2b  i++, pListItem++
198e0 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 43 45  ){.    Expr *pCE
198f0 78 70 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  xpr;            
19900 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69 2d 74        /* The i-t
19910 68 20 69 6e 64 65 78 20 65 78 70 72 65 73 73 69  h index expressi
19920 6f 6e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 65  on */.    int re
19930 71 75 65 73 74 65 64 53 6f 72 74 4f 72 64 65 72  questedSortOrder
19940 3b 20 20 20 20 20 20 20 20 2f 2a 20 41 53 43 20  ;        /* ASC 
19950 6f 72 20 44 45 53 43 20 6f 6e 20 74 68 65 20 69  or DESC on the i
19960 2d 74 68 20 65 78 70 72 65 73 73 69 6f 6e 20 2a  -th expression *
19970 2f 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  /.    const char
19980 20 2a 7a 43 6f 6c 6c 3b 20 20 20 20 20 20 20 20   *zColl;        
19990 20 20 20 20 20 2f 2a 20 43 6f 6c 6c 61 74 69 6f       /* Collatio
199a0 6e 20 73 65 71 75 65 6e 63 65 20 6e 61 6d 65 20  n sequence name 
199b0 2a 2f 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 53  */..    sqlite3S
199c0 74 72 69 6e 67 54 6f 49 64 28 70 4c 69 73 74 49  tringToId(pListI
199d0 74 65 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20  tem->pExpr);.   
199e0 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 53   sqlite3ResolveS
199f0 65 6c 66 52 65 66 65 72 65 6e 63 65 28 70 50 61  elfReference(pPa
19a00 72 73 65 2c 20 70 54 61 62 2c 20 4e 43 5f 49 64  rse, pTab, NC_Id
19a10 78 45 78 70 72 2c 20 70 4c 69 73 74 49 74 65 6d  xExpr, pListItem
19a20 2d 3e 70 45 78 70 72 2c 20 30 29 3b 0a 20 20 20  ->pExpr, 0);.   
19a30 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72   if( pParse->nEr
19a40 72 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72  r ) goto exit_cr
19a50 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20  eate_index;.    
19a60 70 43 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33  pCExpr = sqlite3
19a70 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28  ExprSkipCollate(
19a80 70 4c 69 73 74 49 74 65 6d 2d 3e 70 45 78 70 72  pListItem->pExpr
19a90 29 3b 0a 20 20 20 20 69 66 28 20 70 43 45 78 70  );.    if( pCExp
19aa0 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e  r->op!=TK_COLUMN
19ab0 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 54   ){.      if( pT
19ac0 61 62 3d 3d 70 50 61 72 73 65 2d 3e 70 4e 65 77  ab==pParse->pNew
19ad0 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 20  Table ){.       
19ae0 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
19af0 28 70 50 61 72 73 65 2c 20 22 65 78 70 72 65 73  (pParse, "expres
19b00 73 69 6f 6e 73 20 70 72 6f 68 69 62 69 74 65 64  sions prohibited
19b10 20 69 6e 20 50 52 49 4d 41 52 59 20 4b 45 59 20   in PRIMARY KEY 
19b20 61 6e 64 20 22 0a 20 20 20 20 20 20 20 20 20 20  and ".          
19b30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19b40 20 20 20 20 20 20 22 55 4e 49 51 55 45 20 63 6f        "UNIQUE co
19b50 6e 73 74 72 61 69 6e 74 73 22 29 3b 0a 20 20 20  nstraints");.   
19b60 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63       goto exit_c
19b70 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20  reate_index;.   
19b80 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70     }.      if( p
19b90 49 6e 64 65 78 2d 3e 61 43 6f 6c 45 78 70 72 3d  Index->aColExpr=
19ba0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 45 78  =0 ){.        Ex
19bb0 70 72 4c 69 73 74 20 2a 70 43 6f 70 79 20 3d 20  prList *pCopy = 
19bc0 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
19bd0 75 70 28 64 62 2c 20 70 4c 69 73 74 2c 20 30 29  up(db, pList, 0)
19be0 3b 0a 20 20 20 20 20 20 20 20 70 49 6e 64 65 78  ;.        pIndex
19bf0 2d 3e 61 43 6f 6c 45 78 70 72 20 3d 20 70 43 6f  ->aColExpr = pCo
19c00 70 79 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  py;.        if( 
19c10 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  !db->mallocFaile
19c20 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61  d ){.          a
19c30 73 73 65 72 74 28 20 70 43 6f 70 79 21 3d 30 20  ssert( pCopy!=0 
19c40 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4c 69  );.          pLi
19c50 73 74 49 74 65 6d 20 3d 20 26 70 43 6f 70 79 2d  stItem = &pCopy-
19c60 3e 61 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 7d  >a[i];.        }
19c70 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6a  .      }.      j
19c80 20 3d 20 58 4e 5f 45 58 50 52 3b 0a 20 20 20 20   = XN_EXPR;.    
19c90 20 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75    pIndex->aiColu
19ca0 6d 6e 5b 69 5d 20 3d 20 58 4e 5f 45 58 50 52 3b  mn[i] = XN_EXPR;
19cb0 0a 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 75  .      pIndex->u
19cc0 6e 69 71 4e 6f 74 4e 75 6c 6c 20 3d 20 30 3b 0a  niqNotNull = 0;.
19cd0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
19ce0 20 6a 20 3d 20 70 43 45 78 70 72 2d 3e 69 43 6f   j = pCExpr->iCo
19cf0 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 61 73 73 65  lumn;.      asse
19d00 72 74 28 20 6a 3c 3d 30 78 37 66 66 66 20 29 3b  rt( j<=0x7fff );
19d10 0a 20 20 20 20 20 20 69 66 28 20 6a 3c 30 20 29  .      if( j<0 )
19d20 7b 0a 20 20 20 20 20 20 20 20 6a 20 3d 20 70 54  {.        j = pT
19d30 61 62 2d 3e 69 50 4b 65 79 3b 0a 20 20 20 20 20  ab->iPKey;.     
19d40 20 7d 65 6c 73 65 20 69 66 28 20 70 54 61 62 2d   }else if( pTab-
19d50 3e 61 43 6f 6c 5b 6a 5d 2e 6e 6f 74 4e 75 6c 6c  >aCol[j].notNull
19d60 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ==0 ){.        p
19d70 49 6e 64 65 78 2d 3e 75 6e 69 71 4e 6f 74 4e 75  Index->uniqNotNu
19d80 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  ll = 0;.      }.
19d90 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 61 69        pIndex->ai
19da0 43 6f 6c 75 6d 6e 5b 69 5d 20 3d 20 28 69 31 36  Column[i] = (i16
19db0 29 6a 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 43  )j;.    }.    zC
19dc0 6f 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 69 66 28  oll = 0;.    if(
19dd0 20 70 4c 69 73 74 49 74 65 6d 2d 3e 70 45 78 70   pListItem->pExp
19de0 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c 41 54  r->op==TK_COLLAT
19df0 45 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e  E ){.      int n
19e00 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 7a 43 6f 6c  Coll;.      zCol
19e10 6c 20 3d 20 70 4c 69 73 74 49 74 65 6d 2d 3e 70  l = pListItem->p
19e20 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a  Expr->u.zToken;.
19e30 20 20 20 20 20 20 6e 43 6f 6c 6c 20 3d 20 73 71        nColl = sq
19e40 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 43  lite3Strlen30(zC
19e50 6f 6c 6c 29 20 2b 20 31 3b 0a 20 20 20 20 20 20  oll) + 1;.      
19e60 61 73 73 65 72 74 28 20 6e 45 78 74 72 61 3e 3d  assert( nExtra>=
19e70 6e 43 6f 6c 6c 20 29 3b 0a 20 20 20 20 20 20 6d  nColl );.      m
19e80 65 6d 63 70 79 28 7a 45 78 74 72 61 2c 20 7a 43  emcpy(zExtra, zC
19e90 6f 6c 6c 2c 20 6e 43 6f 6c 6c 29 3b 0a 20 20 20  oll, nColl);.   
19ea0 20 20 20 7a 43 6f 6c 6c 20 3d 20 7a 45 78 74 72     zColl = zExtr
19eb0 61 3b 0a 20 20 20 20 20 20 7a 45 78 74 72 61 20  a;.      zExtra 
19ec0 2b 3d 20 6e 43 6f 6c 6c 3b 0a 20 20 20 20 20 20  += nColl;.      
19ed0 6e 45 78 74 72 61 20 2d 3d 20 6e 43 6f 6c 6c 3b  nExtra -= nColl;
19ee0 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6a  .    }else if( j
19ef0 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 7a 43 6f  >=0 ){.      zCo
19f00 6c 6c 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b  ll = pTab->aCol[
19f10 6a 5d 2e 7a 43 6f 6c 6c 3b 0a 20 20 20 20 7d 0a  j].zColl;.    }.
19f20 20 20 20 20 69 66 28 20 21 7a 43 6f 6c 6c 20 29      if( !zColl )
19f30 20 7a 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33   zColl = sqlite3
19f40 53 74 72 42 49 4e 41 52 59 3b 0a 20 20 20 20 69  StrBINARY;.    i
19f50 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73  f( !db->init.bus
19f60 79 20 26 26 20 21 73 71 6c 69 74 65 33 4c 6f 63  y && !sqlite3Loc
19f70 61 74 65 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  ateCollSeq(pPars
19f80 65 2c 20 7a 43 6f 6c 6c 29 20 29 7b 0a 20 20 20  e, zColl) ){.   
19f90 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65     goto exit_cre
19fa0 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d  ate_index;.    }
19fb0 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e 61 7a 43  .    pIndex->azC
19fc0 6f 6c 6c 5b 69 5d 20 3d 20 7a 43 6f 6c 6c 3b 0a  oll[i] = zColl;.
19fd0 20 20 20 20 72 65 71 75 65 73 74 65 64 53 6f 72      requestedSor
19fe0 74 4f 72 64 65 72 20 3d 20 70 4c 69 73 74 49 74  tOrder = pListIt
19ff0 65 6d 2d 3e 73 6f 72 74 4f 72 64 65 72 20 26 20  em->sortOrder & 
1a000 73 6f 72 74 4f 72 64 65 72 4d 61 73 6b 3b 0a 20  sortOrderMask;. 
1a010 20 20 20 70 49 6e 64 65 78 2d 3e 61 53 6f 72 74     pIndex->aSort
1a020 4f 72 64 65 72 5b 69 5d 20 3d 20 28 75 38 29 72  Order[i] = (u8)r
1a030 65 71 75 65 73 74 65 64 53 6f 72 74 4f 72 64 65  equestedSortOrde
1a040 72 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 70 70  r;.  }..  /* App
1a050 65 6e 64 20 74 68 65 20 74 61 62 6c 65 20 6b 65  end the table ke
1a060 79 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20  y to the end of 
1a070 74 68 65 20 69 6e 64 65 78 2e 20 20 46 6f 72 20  the index.  For 
1a080 57 49 54 48 4f 55 54 20 52 4f 57 49 44 0a 20 20  WITHOUT ROWID.  
1a090 2a 2a 20 74 61 62 6c 65 73 20 28 77 68 65 6e 20  ** tables (when 
1a0a0 70 50 6b 21 3d 30 29 20 74 68 69 73 20 77 69 6c  pPk!=0) this wil
1a0b0 6c 20 62 65 20 74 68 65 20 64 65 63 6c 61 72 65  l be the declare
1a0c0 64 20 50 52 49 4d 41 52 59 20 4b 45 59 2e 20 20  d PRIMARY KEY.  
1a0d0 46 6f 72 0a 20 20 2a 2a 20 6e 6f 72 6d 61 6c 20  For.  ** normal 
1a0e0 74 61 62 6c 65 73 20 28 77 68 65 6e 20 70 50 6b  tables (when pPk
1a0f0 3d 3d 30 29 20 74 68 69 73 20 77 69 6c 6c 20 62  ==0) this will b
1a100 65 20 74 68 65 20 72 6f 77 69 64 2e 0a 20 20 2a  e the rowid..  *
1a110 2f 0a 20 20 69 66 28 20 70 50 6b 20 29 7b 0a 20  /.  if( pPk ){. 
1a120 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 50     for(j=0; j<pP
1a130 6b 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 6a 2b 2b 29  k->nKeyCol; j++)
1a140 7b 0a 20 20 20 20 20 20 69 6e 74 20 78 20 3d 20  {.      int x = 
1a150 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d  pPk->aiColumn[j]
1a160 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1a170 78 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66  x>=0 );.      if
1a180 28 20 68 61 73 43 6f 6c 75 6d 6e 28 70 49 6e 64  ( hasColumn(pInd
1a190 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 2c 20 70 49  ex->aiColumn, pI
1a1a0 6e 64 65 78 2d 3e 6e 4b 65 79 43 6f 6c 2c 20 78  ndex->nKeyCol, x
1a1b0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 49 6e  ) ){.        pIn
1a1c0 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 2d 2d 3b 20  dex->nColumn--; 
1a1d0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
1a1e0 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 61 69        pIndex->ai
1a1f0 43 6f 6c 75 6d 6e 5b 69 5d 20 3d 20 78 3b 0a 20  Column[i] = x;. 
1a200 20 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 61         pIndex->a
1a210 7a 43 6f 6c 6c 5b 69 5d 20 3d 20 70 50 6b 2d 3e  zColl[i] = pPk->
1a220 61 7a 43 6f 6c 6c 5b 6a 5d 3b 0a 20 20 20 20 20  azColl[j];.     
1a230 20 20 20 70 49 6e 64 65 78 2d 3e 61 53 6f 72 74     pIndex->aSort
1a240 4f 72 64 65 72 5b 69 5d 20 3d 20 70 50 6b 2d 3e  Order[i] = pPk->
1a250 61 53 6f 72 74 4f 72 64 65 72 5b 6a 5d 3b 0a 20  aSortOrder[j];. 
1a260 20 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20         i++;.    
1a270 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61 73    }.    }.    as
1a280 73 65 72 74 28 20 69 3d 3d 70 49 6e 64 65 78 2d  sert( i==pIndex-
1a290 3e 6e 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20 7d 65  >nColumn );.  }e
1a2a0 6c 73 65 7b 0a 20 20 20 20 70 49 6e 64 65 78 2d  lse{.    pIndex-
1a2b0 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 20 3d 20 58  >aiColumn[i] = X
1a2c0 4e 5f 52 4f 57 49 44 3b 0a 20 20 20 20 70 49 6e  N_ROWID;.    pIn
1a2d0 64 65 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 20 3d  dex->azColl[i] =
1a2e0 20 73 71 6c 69 74 65 33 53 74 72 42 49 4e 41 52   sqlite3StrBINAR
1a2f0 59 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  Y;.  }.  sqlite3
1a300 44 65 66 61 75 6c 74 52 6f 77 45 73 74 28 70 49  DefaultRowEst(pI
1a310 6e 64 65 78 29 3b 0a 20 20 69 66 28 20 70 50 61  ndex);.  if( pPa
1a320 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3d 3d  rse->pNewTable==
1a330 30 20 29 20 65 73 74 69 6d 61 74 65 49 6e 64 65  0 ) estimateInde
1a340 78 57 69 64 74 68 28 70 49 6e 64 65 78 29 3b 0a  xWidth(pIndex);.
1a350 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 6e  .  /* If this in
1a360 64 65 78 20 63 6f 6e 74 61 69 6e 73 20 65 76 65  dex contains eve
1a370 72 79 20 63 6f 6c 75 6d 6e 20 6f 66 20 69 74 73  ry column of its
1a380 20 74 61 62 6c 65 2c 20 74 68 65 6e 20 6d 61 72   table, then mar
1a390 6b 0a 20 20 2a 2a 20 69 74 20 61 73 20 61 20 63  k.  ** it as a c
1a3a0 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 20 2a 2f  overing index */
1a3b0 0a 20 20 61 73 73 65 72 74 28 20 48 61 73 52 6f  .  assert( HasRo
1a3c0 77 69 64 28 70 54 61 62 29 20 0a 20 20 20 20 20  wid(pTab) .     
1a3d0 20 7c 7c 20 70 54 61 62 2d 3e 69 50 4b 65 79 3c   || pTab->iPKey<
1a3e0 30 20 7c 7c 20 73 71 6c 69 74 65 33 43 6f 6c 75  0 || sqlite3Colu
1a3f0 6d 6e 4f 66 49 6e 64 65 78 28 70 49 6e 64 65 78  mnOfIndex(pIndex
1a400 2c 20 70 54 61 62 2d 3e 69 50 4b 65 79 29 3e 3d  , pTab->iPKey)>=
1a410 30 20 29 3b 0a 20 20 69 66 28 20 70 54 62 6c 4e  0 );.  if( pTblN
1a420 61 6d 65 21 3d 30 20 26 26 20 70 49 6e 64 65 78  ame!=0 && pIndex
1a430 2d 3e 6e 43 6f 6c 75 6d 6e 3e 3d 70 54 61 62 2d  ->nColumn>=pTab-
1a440 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 70 49 6e  >nCol ){.    pIn
1a450 64 65 78 2d 3e 69 73 43 6f 76 65 72 69 6e 67 20  dex->isCovering 
1a460 3d 20 31 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 30  = 1;.    for(j=0
1a470 3b 20 6a 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20  ; j<pTab->nCol; 
1a480 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  j++){.      if( 
1a490 6a 3d 3d 70 54 61 62 2d 3e 69 50 4b 65 79 20 29  j==pTab->iPKey )
1a4a0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
1a4b0 20 69 66 28 20 73 71 6c 69 74 65 33 43 6f 6c 75   if( sqlite3Colu
1a4c0 6d 6e 4f 66 49 6e 64 65 78 28 70 49 6e 64 65 78  mnOfIndex(pIndex
1a4d0 2c 6a 29 3e 3d 30 20 29 20 63 6f 6e 74 69 6e 75  ,j)>=0 ) continu
1a4e0 65 3b 0a 20 20 20 20 20 20 70 49 6e 64 65 78 2d  e;.      pIndex-
1a4f0 3e 69 73 43 6f 76 65 72 69 6e 67 20 3d 20 30 3b  >isCovering = 0;
1a500 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1a510 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70    }.  }..  if( p
1a520 54 61 62 3d 3d 70 50 61 72 73 65 2d 3e 70 4e 65  Tab==pParse->pNe
1a530 77 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 2f 2a  wTable ){.    /*
1a540 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 68 61   This routine ha
1a550 73 20 62 65 65 6e 20 63 61 6c 6c 65 64 20 74 6f  s been called to
1a560 20 63 72 65 61 74 65 20 61 6e 20 61 75 74 6f 6d   create an autom
1a570 61 74 69 63 20 69 6e 64 65 78 20 61 73 20 61 0a  atic index as a.
1a580 20 20 20 20 2a 2a 20 72 65 73 75 6c 74 20 6f 66      ** result of
1a590 20 61 20 50 52 49 4d 41 52 59 20 4b 45 59 20 6f   a PRIMARY KEY o
1a5a0 72 20 55 4e 49 51 55 45 20 63 6c 61 75 73 65 20  r UNIQUE clause 
1a5b0 6f 6e 20 61 20 63 6f 6c 75 6d 6e 20 64 65 66 69  on a column defi
1a5c0 6e 69 74 69 6f 6e 2c 20 6f 72 0a 20 20 20 20 2a  nition, or.    *
1a5d0 2a 20 61 20 50 52 49 4d 41 52 59 20 4b 45 59 20  * a PRIMARY KEY 
1a5e0 6f 72 20 55 4e 49 51 55 45 20 63 6c 61 75 73 65  or UNIQUE clause
1a5f0 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 63   following the c
1a600 6f 6c 75 6d 6e 20 64 65 66 69 6e 69 74 69 6f 6e  olumn definition
1a610 73 2e 0a 20 20 20 20 2a 2a 20 69 2e 65 2e 20 6f  s..    ** i.e. o
1a620 6e 65 20 6f 66 3a 0a 20 20 20 20 2a 2a 0a 20 20  ne of:.    **.  
1a630 20 20 2a 2a 20 43 52 45 41 54 45 20 54 41 42 4c    ** CREATE TABL
1a640 45 20 74 28 78 20 50 52 49 4d 41 52 59 20 4b 45  E t(x PRIMARY KE
1a650 59 2c 20 79 29 3b 0a 20 20 20 20 2a 2a 20 43 52  Y, y);.    ** CR
1a660 45 41 54 45 20 54 41 42 4c 45 20 74 28 78 2c 20  EATE TABLE t(x, 
1a670 79 2c 20 55 4e 49 51 55 45 28 78 2c 20 79 29 29  y, UNIQUE(x, y))
1a680 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ;.    **.    ** 
1a690 45 69 74 68 65 72 20 77 61 79 2c 20 63 68 65 63  Either way, chec
1a6a0 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 20  k to see if the 
1a6b0 74 61 62 6c 65 20 61 6c 72 65 61 64 79 20 68 61  table already ha
1a6c0 73 20 73 75 63 68 20 61 6e 20 69 6e 64 65 78 2e  s such an index.
1a6d0 20 49 66 0a 20 20 20 20 2a 2a 20 73 6f 2c 20 64   If.    ** so, d
1a6e0 6f 6e 27 74 20 62 6f 74 68 65 72 20 63 72 65 61  on't bother crea
1a6f0 74 69 6e 67 20 74 68 69 73 20 6f 6e 65 2e 20 54  ting this one. T
1a700 68 69 73 20 6f 6e 6c 79 20 61 70 70 6c 69 65 73  his only applies
1a710 20 74 6f 0a 20 20 20 20 2a 2a 20 61 75 74 6f 6d   to.    ** autom
1a720 61 74 69 63 61 6c 6c 79 20 63 72 65 61 74 65 64  atically created
1a730 20 69 6e 64 69 63 65 73 2e 20 55 73 65 72 73 20   indices. Users 
1a740 63 61 6e 20 64 6f 20 61 73 20 74 68 65 79 20 77  can do as they w
1a750 69 73 68 20 77 69 74 68 0a 20 20 20 20 2a 2a 20  ish with.    ** 
1a760 65 78 70 6c 69 63 69 74 20 69 6e 64 69 63 65 73  explicit indices
1a770 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
1a780 54 77 6f 20 55 4e 49 51 55 45 20 6f 72 20 50 52  Two UNIQUE or PR
1a790 49 4d 41 52 59 20 4b 45 59 20 63 6f 6e 73 74 72  IMARY KEY constr
1a7a0 61 69 6e 74 73 20 61 72 65 20 63 6f 6e 73 69 64  aints are consid
1a7b0 65 72 65 64 20 65 71 75 69 76 61 6c 65 6e 74 0a  ered equivalent.
1a7c0 20 20 20 20 2a 2a 20 28 61 6e 64 20 74 68 75 73      ** (and thus
1a7d0 20 73 75 70 70 72 65 73 73 69 6e 67 20 74 68 65   suppressing the
1a7e0 20 73 65 63 6f 6e 64 20 6f 6e 65 29 20 65 76 65   second one) eve
1a7f0 6e 20 69 66 20 74 68 65 79 20 68 61 76 65 20 64  n if they have d
1a800 69 66 66 65 72 65 6e 74 0a 20 20 20 20 2a 2a 20  ifferent.    ** 
1a810 73 6f 72 74 20 6f 72 64 65 72 73 2e 0a 20 20 20  sort orders..   
1a820 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 74 68   **.    ** If th
1a830 65 72 65 20 61 72 65 20 64 69 66 66 65 72 65 6e  ere are differen
1a840 74 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  t collating sequ
1a850 65 6e 63 65 73 20 6f 72 20 69 66 20 74 68 65 20  ences or if the 
1a860 63 6f 6c 75 6d 6e 73 20 6f 66 0a 20 20 20 20 2a  columns of.    *
1a870 2a 20 74 68 65 20 63 6f 6e 73 74 72 61 69 6e 74  * the constraint
1a880 20 6f 63 63 75 72 20 69 6e 20 64 69 66 66 65 72   occur in differ
1a890 65 6e 74 20 6f 72 64 65 72 73 2c 20 74 68 65 6e  ent orders, then
1a8a0 20 74 68 65 20 63 6f 6e 73 74 72 61 69 6e 74 73   the constraints
1a8b0 20 61 72 65 0a 20 20 20 20 2a 2a 20 63 6f 6e 73   are.    ** cons
1a8c0 69 64 65 72 65 64 20 64 69 73 74 69 6e 63 74 20  idered distinct 
1a8d0 61 6e 64 20 62 6f 74 68 20 72 65 73 75 6c 74 20  and both result 
1a8e0 69 6e 20 73 65 70 61 72 61 74 65 20 69 6e 64 69  in separate indi
1a8f0 63 65 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ces..    */.    
1a900 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 20  Index *pIdx;.   
1a910 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e   for(pIdx=pTab->
1a920 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49  pIndex; pIdx; pI
1a930 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b  dx=pIdx->pNext){
1a940 0a 20 20 20 20 20 20 69 6e 74 20 6b 3b 0a 20 20  .      int k;.  
1a950 20 20 20 20 61 73 73 65 72 74 28 20 49 73 55 6e      assert( IsUn
1a960 69 71 75 65 49 6e 64 65 78 28 70 49 64 78 29 20  iqueIndex(pIdx) 
1a970 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
1a980 20 70 49 64 78 2d 3e 69 64 78 54 79 70 65 21 3d   pIdx->idxType!=
1a990 53 51 4c 49 54 45 5f 49 44 58 54 59 50 45 5f 41  SQLITE_IDXTYPE_A
1a9a0 50 50 44 45 46 20 29 3b 0a 20 20 20 20 20 20 61  PPDEF );.      a
1a9b0 73 73 65 72 74 28 20 49 73 55 6e 69 71 75 65 49  ssert( IsUniqueI
1a9c0 6e 64 65 78 28 70 49 6e 64 65 78 29 20 29 3b 0a  ndex(pIndex) );.
1a9d0 0a 20 20 20 20 20 20 69 66 28 20 70 49 64 78 2d  .      if( pIdx-
1a9e0 3e 6e 4b 65 79 43 6f 6c 21 3d 70 49 6e 64 65 78  >nKeyCol!=pIndex
1a9f0 2d 3e 6e 4b 65 79 43 6f 6c 20 29 20 63 6f 6e 74  ->nKeyCol ) cont
1aa00 69 6e 75 65 3b 0a 20 20 20 20 20 20 66 6f 72 28  inue;.      for(
1aa10 6b 3d 30 3b 20 6b 3c 70 49 64 78 2d 3e 6e 4b 65  k=0; k<pIdx->nKe
1aa20 79 43 6f 6c 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20  yCol; k++){.    
1aa30 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
1aa40 7a 31 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73  z1;.        cons
1aa50 74 20 63 68 61 72 20 2a 7a 32 3b 0a 20 20 20 20  t char *z2;.    
1aa60 20 20 20 20 61 73 73 65 72 74 28 20 70 49 64 78      assert( pIdx
1aa70 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6b 5d 3e 3d 30  ->aiColumn[k]>=0
1aa80 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
1aa90 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6b  pIdx->aiColumn[k
1aaa0 5d 21 3d 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c  ]!=pIndex->aiCol
1aab0 75 6d 6e 5b 6b 5d 20 29 20 62 72 65 61 6b 3b 0a  umn[k] ) break;.
1aac0 20 20 20 20 20 20 20 20 7a 31 20 3d 20 70 49 64          z1 = pId
1aad0 78 2d 3e 61 7a 43 6f 6c 6c 5b 6b 5d 3b 0a 20 20  x->azColl[k];.  
1aae0 20 20 20 20 20 20 7a 32 20 3d 20 70 49 6e 64 65        z2 = pInde
1aaf0 78 2d 3e 61 7a 43 6f 6c 6c 5b 6b 5d 3b 0a 20 20  x->azColl[k];.  
1ab00 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
1ab10 33 53 74 72 49 43 6d 70 28 7a 31 2c 20 7a 32 29  3StrICmp(z1, z2)
1ab20 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
1ab30 7d 0a 20 20 20 20 20 20 69 66 28 20 6b 3d 3d 70  }.      if( k==p
1ab40 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 20 29 7b 0a  Idx->nKeyCol ){.
1ab50 20 20 20 20 20 20 20 20 69 66 28 20 70 49 64 78          if( pIdx
1ab60 2d 3e 6f 6e 45 72 72 6f 72 21 3d 70 49 6e 64 65  ->onError!=pInde
1ab70 78 2d 3e 6f 6e 45 72 72 6f 72 20 29 7b 0a 20 20  x->onError ){.  
1ab80 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20          /* This 
1ab90 63 6f 6e 73 74 72 61 69 6e 74 20 63 72 65 61 74  constraint creat
1aba0 65 73 20 74 68 65 20 73 61 6d 65 20 69 6e 64 65  es the same inde
1abb0 78 20 61 73 20 61 20 70 72 65 76 69 6f 75 73 0a  x as a previous.
1abc0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e            ** con
1abd0 73 74 72 61 69 6e 74 20 73 70 65 63 69 66 69 65  straint specifie
1abe0 64 20 73 6f 6d 65 77 68 65 72 65 20 69 6e 20 74  d somewhere in t
1abf0 68 65 20 43 52 45 41 54 45 20 54 41 42 4c 45 20  he CREATE TABLE 
1ac00 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20 20 20 20  statement..     
1ac10 20 20 20 20 20 2a 2a 20 48 6f 77 65 76 65 72 20       ** However 
1ac20 74 68 65 20 4f 4e 20 43 4f 4e 46 4c 49 43 54 20  the ON CONFLICT 
1ac30 63 6c 61 75 73 65 73 20 61 72 65 20 64 69 66 66  clauses are diff
1ac40 65 72 65 6e 74 2e 20 49 66 20 62 6f 74 68 20 74  erent. If both t
1ac50 68 69 73 20 0a 20 20 20 20 20 20 20 20 20 20 2a  his .          *
1ac60 2a 20 63 6f 6e 73 74 72 61 69 6e 74 20 61 6e 64  * constraint and
1ac70 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 65 71   the previous eq
1ac80 75 69 76 61 6c 65 6e 74 20 63 6f 6e 73 74 72 61  uivalent constra
1ac90 69 6e 74 20 68 61 76 65 20 65 78 70 6c 69 63 69  int have explici
1aca0 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 4f  t.          ** O
1acb0 4e 20 43 4f 4e 46 4c 49 43 54 20 63 6c 61 75 73  N CONFLICT claus
1acc0 65 73 20 74 68 69 73 20 69 73 20 61 6e 20 65 72  es this is an er
1acd0 72 6f 72 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ror. Otherwise, 
1ace0 75 73 65 20 74 68 65 0a 20 20 20 20 20 20 20 20  use the.        
1acf0 20 20 2a 2a 20 65 78 70 6c 69 63 69 74 6c 79 20    ** explicitly 
1ad00 73 70 65 63 69 66 69 65 64 20 62 65 68 61 76 69  specified behavi
1ad10 6f 72 20 66 6f 72 20 74 68 65 20 69 6e 64 65 78  or for the index
1ad20 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20  ..          */. 
1ad30 20 20 20 20 20 20 20 20 20 69 66 28 20 21 28 70           if( !(p
1ad40 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45  Idx->onError==OE
1ad50 5f 44 65 66 61 75 6c 74 20 7c 7c 20 70 49 6e 64  _Default || pInd
1ad60 65 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f  ex->onError==OE_
1ad70 44 65 66 61 75 6c 74 29 20 29 7b 0a 20 20 20 20  Default) ){.    
1ad80 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
1ad90 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
1ada0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1adb0 20 22 63 6f 6e 66 6c 69 63 74 69 6e 67 20 4f 4e   "conflicting ON
1adc0 20 43 4f 4e 46 4c 49 43 54 20 63 6c 61 75 73 65   CONFLICT clause
1add0 73 20 73 70 65 63 69 66 69 65 64 22 2c 20 30 29  s specified", 0)
1ade0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
1adf0 20 20 20 20 20 20 20 20 69 66 28 20 70 49 64 78          if( pIdx
1ae00 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 44 65  ->onError==OE_De
1ae10 66 61 75 6c 74 20 29 7b 0a 20 20 20 20 20 20 20  fault ){.       
1ae20 20 20 20 20 20 70 49 64 78 2d 3e 6f 6e 45 72 72       pIdx->onErr
1ae30 6f 72 20 3d 20 70 49 6e 64 65 78 2d 3e 6f 6e 45  or = pIndex->onE
1ae40 72 72 6f 72 3b 0a 20 20 20 20 20 20 20 20 20 20  rror;.          
1ae50 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
1ae60 20 20 20 20 70 52 65 74 20 3d 20 70 49 64 78 3b      pRet = pIdx;
1ae70 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 78  .        goto ex
1ae80 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
1ae90 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1aea0 20 7d 0a 0a 20 20 2f 2a 20 4c 69 6e 6b 20 74 68   }..  /* Link th
1aeb0 65 20 6e 65 77 20 49 6e 64 65 78 20 73 74 72 75  e new Index stru
1aec0 63 74 75 72 65 20 74 6f 20 69 74 73 20 74 61 62  cture to its tab
1aed0 6c 65 20 61 6e 64 20 74 6f 20 74 68 65 20 6f 74  le and to the ot
1aee0 68 65 72 0a 20 20 2a 2a 20 69 6e 2d 6d 65 6d 6f  her.  ** in-memo
1aef0 72 79 20 64 61 74 61 62 61 73 65 20 73 74 72 75  ry database stru
1af00 63 74 75 72 65 73 2e 20 0a 20 20 2a 2f 0a 20 20  ctures. .  */.  
1af10 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e  assert( pParse->
1af20 6e 45 72 72 3d 3d 30 20 29 3b 0a 20 20 69 66 28  nErr==0 );.  if(
1af30 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29   db->init.busy )
1af40 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 3b 0a  {.    Index *p;.
1af50 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
1af60 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65  te3SchemaMutexHe
1af70 6c 64 28 64 62 2c 20 30 2c 20 70 49 6e 64 65 78  ld(db, 0, pIndex
1af80 2d 3e 70 53 63 68 65 6d 61 29 20 29 3b 0a 20 20  ->pSchema) );.  
1af90 20 20 70 20 3d 20 73 71 6c 69 74 65 33 48 61 73    p = sqlite3Has
1afa0 68 49 6e 73 65 72 74 28 26 70 49 6e 64 65 78 2d  hInsert(&pIndex-
1afb0 3e 70 53 63 68 65 6d 61 2d 3e 69 64 78 48 61 73  >pSchema->idxHas
1afc0 68 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  h, .            
1afd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 49                pI
1afe0 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 70 49 6e  ndex->zName, pIn
1aff0 64 65 78 29 3b 0a 20 20 20 20 69 66 28 20 70 20  dex);.    if( p 
1b000 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
1b010 20 70 3d 3d 70 49 6e 64 65 78 20 29 3b 20 20 2f   p==pIndex );  /
1b020 2a 20 4d 61 6c 6c 6f 63 20 6d 75 73 74 20 68 61  * Malloc must ha
1b030 76 65 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20 20  ve failed */.   
1b040 20 20 20 73 71 6c 69 74 65 33 4f 6f 6d 46 61 75     sqlite3OomFau
1b050 6c 74 28 64 62 29 3b 0a 20 20 20 20 20 20 67 6f  lt(db);.      go
1b060 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
1b070 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ndex;.    }.    
1b080 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c  db->flags |= SQL
1b090 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65  ITE_InternChange
1b0a0 73 3b 0a 20 20 20 20 69 66 28 20 70 54 62 6c 4e  s;.    if( pTblN
1b0b0 61 6d 65 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  ame!=0 ){.      
1b0c0 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 20 3d 20 64  pIndex->tnum = d
1b0d0 62 2d 3e 69 6e 69 74 2e 6e 65 77 54 6e 75 6d 3b  b->init.newTnum;
1b0e0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
1b0f0 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20   If this is the 
1b100 69 6e 69 74 69 61 6c 20 43 52 45 41 54 45 20 49  initial CREATE I
1b110 4e 44 45 58 20 73 74 61 74 65 6d 65 6e 74 20 28  NDEX statement (
1b120 6f 72 20 43 52 45 41 54 45 20 54 41 42 4c 45 20  or CREATE TABLE 
1b130 69 66 20 74 68 65 0a 20 20 2a 2a 20 69 6e 64 65  if the.  ** inde
1b140 78 20 69 73 20 61 6e 20 69 6d 70 6c 69 65 64 20  x is an implied 
1b150 69 6e 64 65 78 20 66 6f 72 20 61 20 55 4e 49 51  index for a UNIQ
1b160 55 45 20 6f 72 20 50 52 49 4d 41 52 59 20 4b 45  UE or PRIMARY KE
1b170 59 20 63 6f 6e 73 74 72 61 69 6e 74 29 20 74 68  Y constraint) th
1b180 65 6e 0a 20 20 2a 2a 20 65 6d 69 74 20 63 6f 64  en.  ** emit cod
1b190 65 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 74 68  e to allocate th
1b1a0 65 20 69 6e 64 65 78 20 72 6f 6f 74 70 61 67 65  e index rootpage
1b1b0 20 6f 6e 20 64 69 73 6b 20 61 6e 64 20 6d 61 6b   on disk and mak
1b1c0 65 20 61 6e 20 65 6e 74 72 79 20 66 6f 72 0a 20  e an entry for. 
1b1d0 20 2a 2a 20 74 68 65 20 69 6e 64 65 78 20 69 6e   ** the index in
1b1e0 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74   the sqlite_mast
1b1f0 65 72 20 74 61 62 6c 65 20 61 6e 64 20 70 6f 70  er table and pop
1b200 75 6c 61 74 65 20 74 68 65 20 69 6e 64 65 78 20  ulate the index 
1b210 77 69 74 68 0a 20 20 2a 2a 20 63 6f 6e 74 65 6e  with.  ** conten
1b220 74 2e 20 20 42 75 74 2c 20 64 6f 20 6e 6f 74 20  t.  But, do not 
1b230 64 6f 20 74 68 69 73 20 69 66 20 77 65 20 61 72  do this if we ar
1b240 65 20 73 69 6d 70 6c 79 20 72 65 61 64 69 6e 67  e simply reading
1b250 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74   the sqlite_mast
1b260 65 72 0a 20 20 2a 2a 20 74 61 62 6c 65 20 74 6f  er.  ** table to
1b270 20 70 61 72 73 65 20 74 68 65 20 73 63 68 65 6d   parse the schem
1b280 61 2c 20 6f 72 20 69 66 20 74 68 69 73 20 69 6e  a, or if this in
1b290 64 65 78 20 69 73 20 74 68 65 20 50 52 49 4d 41  dex is the PRIMA
1b2a0 52 59 20 4b 45 59 20 69 6e 64 65 78 0a 20 20 2a  RY KEY index.  *
1b2b0 2a 20 6f 66 20 61 20 57 49 54 48 4f 55 54 20 52  * of a WITHOUT R
1b2c0 4f 57 49 44 20 74 61 62 6c 65 2e 0a 20 20 2a 2a  OWID table..  **
1b2d0 0a 20 20 2a 2a 20 49 66 20 70 54 62 6c 4e 61 6d  .  ** If pTblNam
1b2e0 65 3d 3d 30 20 69 74 20 6d 65 61 6e 73 20 74 68  e==0 it means th
1b2f0 69 73 20 69 6e 64 65 78 20 69 73 20 67 65 6e 65  is index is gene
1b300 72 61 74 65 64 20 61 73 20 61 6e 20 69 6d 70 6c  rated as an impl
1b310 69 65 64 20 50 52 49 4d 41 52 59 20 4b 45 59 0a  ied PRIMARY KEY.
1b320 20 20 2a 2a 20 6f 72 20 55 4e 49 51 55 45 20 69    ** or UNIQUE i
1b330 6e 64 65 78 20 69 6e 20 61 20 43 52 45 41 54 45  ndex in a CREATE
1b340 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74   TABLE statement
1b350 2e 20 20 53 69 6e 63 65 20 74 68 65 20 74 61 62  .  Since the tab
1b360 6c 65 0a 20 20 2a 2a 20 68 61 73 20 6a 75 73 74  le.  ** has just
1b370 20 62 65 65 6e 20 63 72 65 61 74 65 64 2c 20 69   been created, i
1b380 74 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 64 61  t contains no da
1b390 74 61 20 61 6e 64 20 74 68 65 20 69 6e 64 65 78  ta and the index
1b3a0 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 0a   initialization.
1b3b0 20 20 2a 2a 20 73 74 65 70 20 63 61 6e 20 62 65    ** step can be
1b3c0 20 73 6b 69 70 70 65 64 2e 0a 20 20 2a 2f 0a 20   skipped..  */. 
1b3d0 20 65 6c 73 65 20 69 66 28 20 48 61 73 52 6f 77   else if( HasRow
1b3e0 69 64 28 70 54 61 62 29 20 7c 7c 20 70 54 62 6c  id(pTab) || pTbl
1b3f0 4e 61 6d 65 21 3d 30 20 29 7b 0a 20 20 20 20 56  Name!=0 ){.    V
1b400 64 62 65 20 2a 76 3b 0a 20 20 20 20 63 68 61 72  dbe *v;.    char
1b410 20 2a 7a 53 74 6d 74 3b 0a 20 20 20 20 69 6e 74   *zStmt;.    int
1b420 20 69 4d 65 6d 20 3d 20 2b 2b 70 50 61 72 73 65   iMem = ++pParse
1b430 2d 3e 6e 4d 65 6d 3b 0a 0a 20 20 20 20 76 20 3d  ->nMem;..    v =
1b440 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
1b450 70 50 61 72 73 65 29 3b 0a 20 20 20 20 69 66 28  pParse);.    if(
1b460 20 76 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78 69   v==0 ) goto exi
1b470 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
1b480 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69  .    sqlite3Begi
1b490 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28  nWriteOperation(
1b4a0 70 50 61 72 73 65 2c 20 31 2c 20 69 44 62 29 3b  pParse, 1, iDb);
1b4b0 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20  ..    /* Create 
1b4c0 74 68 65 20 72 6f 6f 74 70 61 67 65 20 66 6f 72  the rootpage for
1b4d0 20 74 68 65 20 69 6e 64 65 78 20 75 73 69 6e 67   the index using
1b4e0 20 43 72 65 61 74 65 49 6e 64 65 78 2e 20 42 75   CreateIndex. Bu
1b4f0 74 20 62 65 66 6f 72 65 0a 20 20 20 20 2a 2a 20  t before.    ** 
1b500 64 6f 69 6e 67 20 73 6f 2c 20 63 6f 64 65 20 61  doing so, code a
1b510 20 4e 6f 6f 70 20 69 6e 73 74 72 75 63 74 69 6f   Noop instructio
1b520 6e 20 61 6e 64 20 73 74 6f 72 65 20 69 74 73 20  n and store its 
1b530 61 64 64 72 65 73 73 20 69 6e 20 0a 20 20 20 20  address in .    
1b540 2a 2a 20 49 6e 64 65 78 2e 74 6e 75 6d 2e 20 54  ** Index.tnum. T
1b550 68 69 73 20 69 73 20 72 65 71 75 69 72 65 64 20  his is required 
1b560 69 6e 20 63 61 73 65 20 74 68 69 73 20 69 6e 64  in case this ind
1b570 65 78 20 69 73 20 61 63 74 75 61 6c 6c 79 20 61  ex is actually a
1b580 20 0a 20 20 20 20 2a 2a 20 50 52 49 4d 41 52 59   .    ** PRIMARY
1b590 20 4b 45 59 20 61 6e 64 20 74 68 65 20 74 61 62   KEY and the tab
1b5a0 6c 65 20 69 73 20 61 63 74 75 61 6c 6c 79 20 61  le is actually a
1b5b0 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 20 74   WITHOUT ROWID t
1b5c0 61 62 6c 65 2e 20 49 6e 20 0a 20 20 20 20 2a 2a  able. In .    **
1b5d0 20 74 68 61 74 20 63 61 73 65 20 74 68 65 20 63   that case the c
1b5e0 6f 6e 76 65 72 74 54 6f 57 69 74 68 6f 75 74 52  onvertToWithoutR
1b5f0 6f 77 69 64 54 61 62 6c 65 28 29 20 72 6f 75 74  owidTable() rout
1b600 69 6e 65 20 77 69 6c 6c 20 72 65 70 6c 61 63 65  ine will replace
1b610 0a 20 20 20 20 2a 2a 20 74 68 65 20 4e 6f 6f 70  .    ** the Noop
1b620 20 77 69 74 68 20 61 20 47 6f 74 6f 20 74 6f 20   with a Goto to 
1b630 6a 75 6d 70 20 6f 76 65 72 20 74 68 65 20 56 44  jump over the VD
1b640 42 45 20 63 6f 64 65 20 67 65 6e 65 72 61 74 65  BE code generate
1b650 64 20 62 65 6c 6f 77 2e 20 2a 2f 0a 20 20 20 20  d below. */.    
1b660 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 20 3d 20 73  pIndex->tnum = s
1b670 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30  qlite3VdbeAddOp0
1b680 28 76 2c 20 4f 50 5f 4e 6f 6f 70 29 3b 0a 20 20  (v, OP_Noop);.  
1b690 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1b6a0 4f 70 32 28 76 2c 20 4f 50 5f 43 72 65 61 74 65  Op2(v, OP_Create
1b6b0 49 6e 64 65 78 2c 20 69 44 62 2c 20 69 4d 65 6d  Index, iDb, iMem
1b6c0 29 3b 0a 0a 20 20 20 20 2f 2a 20 47 61 74 68 65  );..    /* Gathe
1b6d0 72 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 74  r the complete t
1b6e0 65 78 74 20 6f 66 20 74 68 65 20 43 52 45 41 54  ext of the CREAT
1b6f0 45 20 49 4e 44 45 58 20 73 74 61 74 65 6d 65 6e  E INDEX statemen
1b700 74 20 69 6e 74 6f 0a 20 20 20 20 2a 2a 20 74 68  t into.    ** th
1b710 65 20 7a 53 74 6d 74 20 76 61 72 69 61 62 6c 65  e zStmt variable
1b720 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
1b730 70 53 74 61 72 74 20 29 7b 0a 20 20 20 20 20 20  pStart ){.      
1b740 69 6e 74 20 6e 20 3d 20 28 69 6e 74 29 28 70 50  int n = (int)(pP
1b750 61 72 73 65 2d 3e 73 4c 61 73 74 54 6f 6b 65 6e  arse->sLastToken
1b760 2e 7a 20 2d 20 70 4e 61 6d 65 2d 3e 7a 29 20 2b  .z - pName->z) +
1b770 20 70 50 61 72 73 65 2d 3e 73 4c 61 73 74 54 6f   pParse->sLastTo
1b780 6b 65 6e 2e 6e 3b 0a 20 20 20 20 20 20 69 66 28  ken.n;.      if(
1b790 20 70 4e 61 6d 65 2d 3e 7a 5b 6e 2d 31 5d 3d 3d   pName->z[n-1]==
1b7a0 27 3b 27 20 29 20 6e 2d 2d 3b 0a 20 20 20 20 20  ';' ) n--;.     
1b7b0 20 2f 2a 20 41 20 6e 61 6d 65 64 20 69 6e 64 65   /* A named inde
1b7c0 78 20 77 69 74 68 20 61 6e 20 65 78 70 6c 69 63  x with an explic
1b7d0 69 74 20 43 52 45 41 54 45 20 49 4e 44 45 58 20  it CREATE INDEX 
1b7e0 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20  statement */.   
1b7f0 20 20 20 7a 53 74 6d 74 20 3d 20 73 71 6c 69 74     zStmt = sqlit
1b800 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 43  e3MPrintf(db, "C
1b810 52 45 41 54 45 25 73 20 49 4e 44 45 58 20 25 2e  REATE%s INDEX %.
1b820 2a 73 22 2c 0a 20 20 20 20 20 20 20 20 6f 6e 45  *s",.        onE
1b830 72 72 6f 72 3d 3d 4f 45 5f 4e 6f 6e 65 20 3f 20  rror==OE_None ? 
1b840 22 22 20 3a 20 22 20 55 4e 49 51 55 45 22 2c 20  "" : " UNIQUE", 
1b850 6e 2c 20 70 4e 61 6d 65 2d 3e 7a 29 3b 0a 20 20  n, pName->z);.  
1b860 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f    }else{.      /
1b870 2a 20 41 6e 20 61 75 74 6f 6d 61 74 69 63 20 69  * An automatic i
1b880 6e 64 65 78 20 63 72 65 61 74 65 64 20 62 79 20  ndex created by 
1b890 61 20 50 52 49 4d 41 52 59 20 4b 45 59 20 6f 72  a PRIMARY KEY or
1b8a0 20 55 4e 49 51 55 45 20 63 6f 6e 73 74 72 61 69   UNIQUE constrai
1b8b0 6e 74 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 7a  nt */.      /* z
1b8c0 53 74 6d 74 20 3d 20 73 71 6c 69 74 65 33 4d 50  Stmt = sqlite3MP
1b8d0 72 69 6e 74 66 28 22 22 29 3b 20 2a 2f 0a 20 20  rintf(""); */.  
1b8e0 20 20 20 20 7a 53 74 6d 74 20 3d 20 30 3b 0a 20      zStmt = 0;. 
1b8f0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 64 64     }..    /* Add
1b900 20 61 6e 20 65 6e 74 72 79 20 69 6e 20 73 71 6c   an entry in sql
1b910 69 74 65 5f 6d 61 73 74 65 72 20 66 6f 72 20 74  ite_master for t
1b920 68 69 73 20 69 6e 64 65 78 0a 20 20 20 20 2a 2f  his index.    */
1b930 0a 20 20 20 20 73 71 6c 69 74 65 33 4e 65 73 74  .    sqlite3Nest
1b940 65 64 50 61 72 73 65 28 70 50 61 72 73 65 2c 20  edParse(pParse, 
1b950 0a 20 20 20 20 20 20 20 20 22 49 4e 53 45 52 54  .        "INSERT
1b960 20 49 4e 54 4f 20 25 51 2e 25 73 20 56 41 4c 55   INTO %Q.%s VALU
1b970 45 53 28 27 69 6e 64 65 78 27 2c 25 51 2c 25 51  ES('index',%Q,%Q
1b980 2c 23 25 64 2c 25 51 29 3b 22 2c 0a 20 20 20 20  ,#%d,%Q);",.    
1b990 20 20 20 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d      db->aDb[iDb]
1b9a0 2e 7a 4e 61 6d 65 2c 20 53 43 48 45 4d 41 5f 54  .zName, SCHEMA_T
1b9b0 41 42 4c 45 28 69 44 62 29 2c 0a 20 20 20 20 20  ABLE(iDb),.     
1b9c0 20 20 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65     pIndex->zName
1b9d0 2c 0a 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e  ,.        pTab->
1b9e0 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 69  zName,.        i
1b9f0 4d 65 6d 2c 0a 20 20 20 20 20 20 20 20 7a 53 74  Mem,.        zSt
1ba00 6d 74 0a 20 20 20 20 29 3b 0a 20 20 20 20 73 71  mt.    );.    sq
1ba10 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
1ba20 7a 53 74 6d 74 29 3b 0a 0a 20 20 20 20 2f 2a 20  zStmt);..    /* 
1ba30 46 69 6c 6c 20 74 68 65 20 69 6e 64 65 78 20 77  Fill the index w
1ba40 69 74 68 20 64 61 74 61 20 61 6e 64 20 72 65 70  ith data and rep
1ba50 61 72 73 65 20 74 68 65 20 73 63 68 65 6d 61 2e  arse the schema.
1ba60 20 43 6f 64 65 20 61 6e 20 4f 50 5f 45 78 70 69   Code an OP_Expi
1ba70 72 65 0a 20 20 20 20 2a 2a 20 74 6f 20 69 6e 76  re.    ** to inv
1ba80 61 6c 69 64 61 74 65 20 61 6c 6c 20 70 72 65 2d  alidate all pre-
1ba90 63 6f 6d 70 69 6c 65 64 20 73 74 61 74 65 6d 65  compiled stateme
1baa0 6e 74 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  nts..    */.    
1bab0 69 66 28 20 70 54 62 6c 4e 61 6d 65 20 29 7b 0a  if( pTblName ){.
1bac0 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 66        sqlite3Ref
1bad0 69 6c 6c 49 6e 64 65 78 28 70 50 61 72 73 65 2c  illIndex(pParse,
1bae0 20 70 49 6e 64 65 78 2c 20 69 4d 65 6d 29 3b 0a   pIndex, iMem);.
1baf0 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 68 61        sqlite3Cha
1bb00 6e 67 65 43 6f 6f 6b 69 65 28 70 50 61 72 73 65  ngeCookie(pParse
1bb10 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20 73 71  , iDb);.      sq
1bb20 6c 69 74 65 33 56 64 62 65 41 64 64 50 61 72 73  lite3VdbeAddPars
1bb30 65 53 63 68 65 6d 61 4f 70 28 76 2c 20 69 44 62  eSchemaOp(v, iDb
1bb40 2c 0a 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  ,.         sqlit
1bb50 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 6e  e3MPrintf(db, "n
1bb60 61 6d 65 3d 27 25 71 27 20 41 4e 44 20 74 79 70  ame='%q' AND typ
1bb70 65 3d 27 69 6e 64 65 78 27 22 2c 20 70 49 6e 64  e='index'", pInd
1bb80 65 78 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20  ex->zName));.   
1bb90 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1bba0 64 4f 70 31 28 76 2c 20 4f 50 5f 45 78 70 69 72  dOp1(v, OP_Expir
1bbb0 65 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  e, 0);.    }..  
1bbc0 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
1bbd0 70 48 65 72 65 28 76 2c 20 70 49 6e 64 65 78 2d  pHere(v, pIndex-
1bbe0 3e 74 6e 75 6d 29 3b 0a 20 20 7d 0a 0a 20 20 2f  >tnum);.  }..  /
1bbf0 2a 20 57 68 65 6e 20 61 64 64 69 6e 67 20 61 6e  * When adding an
1bc00 20 69 6e 64 65 78 20 74 6f 20 74 68 65 20 6c 69   index to the li
1bc10 73 74 20 6f 66 20 69 6e 64 69 63 65 73 20 66 6f  st of indices fo
1bc20 72 20 61 20 74 61 62 6c 65 2c 20 6d 61 6b 65 0a  r a table, make.
1bc30 20 20 2a 2a 20 73 75 72 65 20 61 6c 6c 20 69 6e    ** sure all in
1bc40 64 69 63 65 73 20 6c 61 62 65 6c 65 64 20 4f 45  dices labeled OE
1bc50 5f 52 65 70 6c 61 63 65 20 63 6f 6d 65 20 61 66  _Replace come af
1bc60 74 65 72 20 61 6c 6c 20 74 68 6f 73 65 20 6c 61  ter all those la
1bc70 62 65 6c 65 64 0a 20 20 2a 2a 20 4f 45 5f 49 67  beled.  ** OE_Ig
1bc80 6e 6f 72 65 2e 20 20 54 68 69 73 20 69 73 20 6e  nore.  This is n
1bc90 65 63 65 73 73 61 72 79 20 66 6f 72 20 74 68 65  ecessary for the
1bca0 20 63 6f 72 72 65 63 74 20 63 6f 6e 73 74 72 61   correct constra
1bcb0 69 6e 74 20 63 68 65 63 6b 0a 20 20 2a 2a 20 70  int check.  ** p
1bcc0 72 6f 63 65 73 73 69 6e 67 20 28 69 6e 20 73 71  rocessing (in sq
1bcd0 6c 69 74 65 33 47 65 6e 65 72 61 74 65 43 6f 6e  lite3GenerateCon
1bce0 73 74 72 61 69 6e 74 43 68 65 63 6b 73 28 29 29  straintChecks())
1bcf0 20 61 73 20 70 61 72 74 20 6f 66 0a 20 20 2a 2a   as part of.  **
1bd00 20 55 50 44 41 54 45 20 61 6e 64 20 49 4e 53 45   UPDATE and INSE
1bd10 52 54 20 73 74 61 74 65 6d 65 6e 74 73 2e 20 20  RT statements.  
1bd20 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e  .  */.  if( db->
1bd30 69 6e 69 74 2e 62 75 73 79 20 7c 7c 20 70 54 62  init.busy || pTb
1bd40 6c 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20  lName==0 ){.    
1bd50 69 66 28 20 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f  if( onError!=OE_
1bd60 52 65 70 6c 61 63 65 20 7c 7c 20 70 54 61 62 2d  Replace || pTab-
1bd70 3e 70 49 6e 64 65 78 3d 3d 30 0a 20 20 20 20 20  >pIndex==0.     
1bd80 20 20 20 20 7c 7c 20 70 54 61 62 2d 3e 70 49 6e      || pTab->pIn
1bd90 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45  dex->onError==OE
1bda0 5f 52 65 70 6c 61 63 65 29 7b 0a 20 20 20 20 20  _Replace){.     
1bdb0 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74 20 3d   pIndex->pNext =
1bdc0 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 0a 20   pTab->pIndex;. 
1bdd0 20 20 20 20 20 70 54 61 62 2d 3e 70 49 6e 64 65       pTab->pInde
1bde0 78 20 3d 20 70 49 6e 64 65 78 3b 0a 20 20 20 20  x = pIndex;.    
1bdf0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 49 6e 64  }else{.      Ind
1be00 65 78 20 2a 70 4f 74 68 65 72 20 3d 20 70 54 61  ex *pOther = pTa
1be10 62 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20 20 20  b->pIndex;.     
1be20 20 77 68 69 6c 65 28 20 70 4f 74 68 65 72 2d 3e   while( pOther->
1be30 70 4e 65 78 74 20 26 26 20 70 4f 74 68 65 72 2d  pNext && pOther-
1be40 3e 70 4e 65 78 74 2d 3e 6f 6e 45 72 72 6f 72 21  >pNext->onError!
1be50 3d 4f 45 5f 52 65 70 6c 61 63 65 20 29 7b 0a 20  =OE_Replace ){. 
1be60 20 20 20 20 20 20 20 70 4f 74 68 65 72 20 3d 20         pOther = 
1be70 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74 3b 0a 20  pOther->pNext;. 
1be80 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 49 6e       }.      pIn
1be90 64 65 78 2d 3e 70 4e 65 78 74 20 3d 20 70 4f 74  dex->pNext = pOt
1bea0 68 65 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  her->pNext;.    
1beb0 20 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74 20    pOther->pNext 
1bec0 3d 20 70 49 6e 64 65 78 3b 0a 20 20 20 20 7d 0a  = pIndex;.    }.
1bed0 20 20 20 20 70 52 65 74 20 3d 20 70 49 6e 64 65      pRet = pInde
1bee0 78 3b 0a 20 20 20 20 70 49 6e 64 65 78 20 3d 20  x;.    pIndex = 
1bef0 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6c 65  0;.  }..  /* Cle
1bf00 61 6e 20 75 70 20 62 65 66 6f 72 65 20 65 78 69  an up before exi
1bf10 74 69 6e 67 20 2a 2f 0a 65 78 69 74 5f 63 72 65  ting */.exit_cre
1bf20 61 74 65 5f 69 6e 64 65 78 3a 0a 20 20 69 66 28  ate_index:.  if(
1bf30 20 70 49 6e 64 65 78 20 29 20 66 72 65 65 49 6e   pIndex ) freeIn
1bf40 64 65 78 28 64 62 2c 20 70 49 6e 64 65 78 29 3b  dex(db, pIndex);
1bf50 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65  .  sqlite3ExprDe
1bf60 6c 65 74 65 28 64 62 2c 20 70 50 49 57 68 65 72  lete(db, pPIWher
1bf70 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70  e);.  sqlite3Exp
1bf80 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20  rListDelete(db, 
1bf90 70 4c 69 73 74 29 3b 0a 20 20 73 71 6c 69 74 65  pList);.  sqlite
1bfa0 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28 64  3SrcListDelete(d
1bfb0 62 2c 20 70 54 62 6c 4e 61 6d 65 29 3b 0a 20 20  b, pTblName);.  
1bfc0 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
1bfd0 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 72 65 74 75  , zName);.  retu
1bfe0 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn pRet;.}../*.*
1bff0 2a 20 46 69 6c 6c 20 74 68 65 20 49 6e 64 65 78  * Fill the Index
1c000 2e 61 69 52 6f 77 45 73 74 5b 5d 20 61 72 72 61  .aiRowEst[] arra
1c010 79 20 77 69 74 68 20 64 65 66 61 75 6c 74 20 69  y with default i
1c020 6e 66 6f 72 6d 61 74 69 6f 6e 20 2d 20 69 6e 66  nformation - inf
1c030 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20 74 6f 20 62  ormation.** to b
1c040 65 20 75 73 65 64 20 77 68 65 6e 20 77 65 20 68  e used when we h
1c050 61 76 65 20 6e 6f 74 20 72 75 6e 20 74 68 65 20  ave not run the 
1c060 41 4e 41 4c 59 5a 45 20 63 6f 6d 6d 61 6e 64 2e  ANALYZE command.
1c070 0a 2a 2a 0a 2a 2a 20 61 69 52 6f 77 45 73 74 5b  .**.** aiRowEst[
1c080 30 5d 20 69 73 20 73 75 70 70 6f 73 65 64 20 74  0] is supposed t
1c090 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 6e 75  o contain the nu
1c0a0 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73  mber of elements
1c0b0 20 69 6e 20 74 68 65 20 69 6e 64 65 78 2e 0a 2a   in the index..*
1c0c0 2a 20 53 69 6e 63 65 20 77 65 20 64 6f 20 6e 6f  * Since we do no
1c0d0 74 20 6b 6e 6f 77 2c 20 67 75 65 73 73 20 31 20  t know, guess 1 
1c0e0 6d 69 6c 6c 69 6f 6e 2e 20 20 61 69 52 6f 77 45  million.  aiRowE
1c0f0 73 74 5b 31 5d 20 69 73 20 61 6e 20 65 73 74 69  st[1] is an esti
1c100 6d 61 74 65 20 6f 66 20 74 68 65 0a 2a 2a 20 6e  mate of the.** n
1c110 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e  umber of rows in
1c120 20 74 68 65 20 74 61 62 6c 65 20 74 68 61 74 20   the table that 
1c130 6d 61 74 63 68 20 61 6e 79 20 70 61 72 74 69 63  match any partic
1c140 75 6c 61 72 20 76 61 6c 75 65 20 6f 66 20 74 68  ular value of th
1c150 65 0a 2a 2a 20 66 69 72 73 74 20 63 6f 6c 75 6d  e.** first colum
1c160 6e 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e 20  n of the index. 
1c170 20 61 69 52 6f 77 45 73 74 5b 32 5d 20 69 73 20   aiRowEst[2] is 
1c180 61 6e 20 65 73 74 69 6d 61 74 65 20 6f 66 20 74  an estimate of t
1c190 68 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66 20  he number.** of 
1c1a0 72 6f 77 73 20 74 68 61 74 20 6d 61 74 63 68 20  rows that match 
1c1b0 61 6e 79 20 70 61 72 74 69 63 75 6c 61 72 20 63  any particular c
1c1c0 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f 66 20 74 68  ombination of th
1c1d0 65 20 66 69 72 73 74 20 32 20 63 6f 6c 75 6d 6e  e first 2 column
1c1e0 73 0a 2a 2a 20 6f 66 20 74 68 65 20 69 6e 64 65  s.** of the inde
1c1f0 78 2e 20 20 41 6e 64 20 73 6f 20 66 6f 72 74 68  x.  And so forth
1c200 2e 20 20 49 74 20 6d 75 73 74 20 61 6c 77 61 79  .  It must alway
1c210 73 20 62 65 20 74 68 65 20 63 61 73 65 20 74 68  s be the case th
1c220 61 74 0a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20  at.*.**         
1c230 20 20 61 69 52 6f 77 45 73 74 5b 4e 5d 3c 3d 61    aiRowEst[N]<=a
1c240 69 52 6f 77 45 73 74 5b 4e 2d 31 5d 0a 2a 2a 20  iRowEst[N-1].** 
1c250 20 20 20 20 20 20 20 20 20 20 61 69 52 6f 77 45            aiRowE
1c260 73 74 5b 4e 5d 3e 3d 31 0a 2a 2a 0a 2a 2a 20 41  st[N]>=1.**.** A
1c270 70 61 72 74 20 66 72 6f 6d 20 74 68 61 74 2c 20  part from that, 
1c280 77 65 20 68 61 76 65 20 6c 69 74 74 6c 65 20 74  we have little t
1c290 6f 20 67 6f 20 6f 6e 20 62 65 73 69 64 65 73 20  o go on besides 
1c2a0 69 6e 74 75 69 74 69 6f 6e 20 61 73 20 74 6f 0a  intuition as to.
1c2b0 2a 2a 20 68 6f 77 20 61 69 52 6f 77 45 73 74 5b  ** how aiRowEst[
1c2c0 5d 20 73 68 6f 75 6c 64 20 62 65 20 69 6e 69 74  ] should be init
1c2d0 69 61 6c 69 7a 65 64 2e 20 20 54 68 65 20 6e 75  ialized.  The nu
1c2e0 6d 62 65 72 73 20 67 65 6e 65 72 61 74 65 64 20  mbers generated 
1c2f0 68 65 72 65 0a 2a 2a 20 61 72 65 20 62 61 73 65  here.** are base
1c300 64 20 6f 6e 20 74 79 70 69 63 61 6c 20 76 61 6c  d on typical val
1c310 75 65 73 20 66 6f 75 6e 64 20 69 6e 20 61 63 74  ues found in act
1c320 75 61 6c 20 69 6e 64 69 63 65 73 2e 0a 2a 2f 0a  ual indices..*/.
1c330 76 6f 69 64 20 73 71 6c 69 74 65 33 44 65 66 61  void sqlite3Defa
1c340 75 6c 74 52 6f 77 45 73 74 28 49 6e 64 65 78 20  ultRowEst(Index 
1c350 2a 70 49 64 78 29 7b 0a 20 20 2f 2a 20 20 20 20  *pIdx){.  /*    
1c360 20 20 20 20 20 20 20 20 20 20 20 20 31 30 2c 20              10, 
1c370 20 39 2c 20 20 38 2c 20 20 37 2c 20 20 36 20 2a   9,  8,  7,  6 *
1c380 2f 0a 20 20 4c 6f 67 45 73 74 20 61 56 61 6c 5b  /.  LogEst aVal[
1c390 5d 20 3d 20 7b 20 33 33 2c 20 33 32 2c 20 33 30  ] = { 33, 32, 30
1c3a0 2c 20 32 38 2c 20 32 36 20 7d 3b 0a 20 20 4c 6f  , 28, 26 };.  Lo
1c3b0 67 45 73 74 20 2a 61 20 3d 20 70 49 64 78 2d 3e  gEst *a = pIdx->
1c3c0 61 69 52 6f 77 4c 6f 67 45 73 74 3b 0a 20 20 69  aiRowLogEst;.  i
1c3d0 6e 74 20 6e 43 6f 70 79 20 3d 20 4d 49 4e 28 41  nt nCopy = MIN(A
1c3e0 72 72 61 79 53 69 7a 65 28 61 56 61 6c 29 2c 20  rraySize(aVal), 
1c3f0 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 29 3b 0a  pIdx->nKeyCol);.
1c400 20 20 69 6e 74 20 69 3b 0a 0a 20 20 2f 2a 20 53    int i;..  /* S
1c410 65 74 20 74 68 65 20 66 69 72 73 74 20 65 6e 74  et the first ent
1c420 72 79 20 28 6e 75 6d 62 65 72 20 6f 66 20 72 6f  ry (number of ro
1c430 77 73 20 69 6e 20 74 68 65 20 69 6e 64 65 78 29  ws in the index)
1c440 20 74 6f 20 74 68 65 20 65 73 74 69 6d 61 74 65   to the estimate
1c450 64 20 0a 20 20 2a 2a 20 6e 75 6d 62 65 72 20 6f  d .  ** number o
1c460 66 20 72 6f 77 73 20 69 6e 20 74 68 65 20 74 61  f rows in the ta
1c470 62 6c 65 2e 20 4f 72 20 31 30 2c 20 69 66 20 74  ble. Or 10, if t
1c480 68 65 20 65 73 74 69 6d 61 74 65 64 20 6e 75 6d  he estimated num
1c490 62 65 72 20 6f 66 20 72 6f 77 73 20 0a 20 20 2a  ber of rows .  *
1c4a0 2a 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 69  * in the table i
1c4b0 73 20 6c 65 73 73 20 74 68 61 6e 20 74 68 61 74  s less than that
1c4c0 2e 20 20 2a 2f 0a 20 20 61 5b 30 5d 20 3d 20 70  .  */.  a[0] = p
1c4d0 49 64 78 2d 3e 70 54 61 62 6c 65 2d 3e 6e 52 6f  Idx->pTable->nRo
1c4e0 77 4c 6f 67 45 73 74 3b 0a 20 20 69 66 28 20 61  wLogEst;.  if( a
1c4f0 5b 30 5d 3c 33 33 20 29 20 61 5b 30 5d 20 3d 20  [0]<33 ) a[0] = 
1c500 33 33 3b 20 20 20 20 20 20 20 20 61 73 73 65 72  33;        asser
1c510 74 28 20 33 33 3d 3d 73 71 6c 69 74 65 33 4c 6f  t( 33==sqlite3Lo
1c520 67 45 73 74 28 31 30 29 20 29 3b 0a 0a 20 20 2f  gEst(10) );..  /
1c530 2a 20 45 73 74 69 6d 61 74 65 20 74 68 61 74 20  * Estimate that 
1c540 61 5b 31 5d 20 69 73 20 31 30 2c 20 61 5b 32 5d  a[1] is 10, a[2]
1c550 20 69 73 20 39 2c 20 61 5b 33 5d 20 69 73 20 38   is 9, a[3] is 8
1c560 2c 20 61 5b 34 5d 20 69 73 20 37 2c 20 61 5b 35  , a[4] is 7, a[5
1c570 5d 20 69 73 0a 20 20 2a 2a 20 36 20 61 6e 64 20  ] is.  ** 6 and 
1c580 65 61 63 68 20 73 75 62 73 65 71 75 65 6e 74 20  each subsequent 
1c590 76 61 6c 75 65 20 28 69 66 20 61 6e 79 29 20 69  value (if any) i
1c5a0 73 20 35 2e 20 20 2a 2f 0a 20 20 6d 65 6d 63 70  s 5.  */.  memcp
1c5b0 79 28 26 61 5b 31 5d 2c 20 61 56 61 6c 2c 20 6e  y(&a[1], aVal, n
1c5c0 43 6f 70 79 2a 73 69 7a 65 6f 66 28 4c 6f 67 45  Copy*sizeof(LogE
1c5d0 73 74 29 29 3b 0a 20 20 66 6f 72 28 69 3d 6e 43  st));.  for(i=nC
1c5e0 6f 70 79 2b 31 3b 20 69 3c 3d 70 49 64 78 2d 3e  opy+1; i<=pIdx->
1c5f0 6e 4b 65 79 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20  nKeyCol; i++){. 
1c600 20 20 20 61 5b 69 5d 20 3d 20 32 33 3b 20 20 20     a[i] = 23;   
1c610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c620 20 61 73 73 65 72 74 28 20 32 33 3d 3d 73 71 6c   assert( 23==sql
1c630 69 74 65 33 4c 6f 67 45 73 74 28 35 29 20 29 3b  ite3LogEst(5) );
1c640 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20  .  }..  assert( 
1c650 30 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74  0==sqlite3LogEst
1c660 28 31 29 20 29 3b 0a 20 20 69 66 28 20 49 73 55  (1) );.  if( IsU
1c670 6e 69 71 75 65 49 6e 64 65 78 28 70 49 64 78 29  niqueIndex(pIdx)
1c680 20 29 20 61 5b 70 49 64 78 2d 3e 6e 4b 65 79 43   ) a[pIdx->nKeyC
1c690 6f 6c 5d 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  ol] = 0;.}../*.*
1c6a0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77  * This routine w
1c6b0 69 6c 6c 20 64 72 6f 70 20 61 6e 20 65 78 69 73  ill drop an exis
1c6c0 74 69 6e 67 20 6e 61 6d 65 64 20 69 6e 64 65 78  ting named index
1c6d0 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a  .  This routine.
1c6e0 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68  ** implements th
1c6f0 65 20 44 52 4f 50 20 49 4e 44 45 58 20 73 74 61  e DROP INDEX sta
1c700 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20  tement..*/.void 
1c710 73 71 6c 69 74 65 33 44 72 6f 70 49 6e 64 65 78  sqlite3DropIndex
1c720 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
1c730 53 72 63 4c 69 73 74 20 2a 70 4e 61 6d 65 2c 20  SrcList *pName, 
1c740 69 6e 74 20 69 66 45 78 69 73 74 73 29 7b 0a 20  int ifExists){. 
1c750 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b 0a   Index *pIndex;.
1c760 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 73 71 6c    Vdbe *v;.  sql
1c770 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
1c780 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 69 44 62  e->db;.  int iDb
1c790 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  ;..  assert( pPa
1c7a0 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 29 3b 20  rse->nErr==0 ); 
1c7b0 20 20 2f 2a 20 4e 65 76 65 72 20 63 61 6c 6c 65    /* Never calle
1c7c0 64 20 77 69 74 68 20 70 72 69 6f 72 20 65 72 72  d with prior err
1c7d0 6f 72 73 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d  ors */.  if( db-
1c7e0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
1c7f0 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64  .    goto exit_d
1c800 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20  rop_index;.  }. 
1c810 20 61 73 73 65 72 74 28 20 70 4e 61 6d 65 2d 3e   assert( pName->
1c820 6e 53 72 63 3d 3d 31 20 29 3b 0a 20 20 69 66 28  nSrc==1 );.  if(
1c830 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69   SQLITE_OK!=sqli
1c840 74 65 33 52 65 61 64 53 63 68 65 6d 61 28 70 50  te3ReadSchema(pP
1c850 61 72 73 65 29 20 29 7b 0a 20 20 20 20 67 6f 74  arse) ){.    got
1c860 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65  o exit_drop_inde
1c870 78 3b 0a 20 20 7d 0a 20 20 70 49 6e 64 65 78 20  x;.  }.  pIndex 
1c880 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 64  = sqlite3FindInd
1c890 65 78 28 64 62 2c 20 70 4e 61 6d 65 2d 3e 61 5b  ex(db, pName->a[
1c8a0 30 5d 2e 7a 4e 61 6d 65 2c 20 70 4e 61 6d 65 2d  0].zName, pName-
1c8b0 3e 61 5b 30 5d 2e 7a 44 61 74 61 62 61 73 65 29  >a[0].zDatabase)
1c8c0 3b 0a 20 20 69 66 28 20 70 49 6e 64 65 78 3d 3d  ;.  if( pIndex==
1c8d0 30 20 29 7b 0a 20 20 20 20 69 66 28 20 21 69 66  0 ){.    if( !if
1c8e0 45 78 69 73 74 73 20 29 7b 0a 20 20 20 20 20 20  Exists ){.      
1c8f0 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
1c900 70 50 61 72 73 65 2c 20 22 6e 6f 20 73 75 63 68  pParse, "no such
1c910 20 69 6e 64 65 78 3a 20 25 53 22 2c 20 70 4e 61   index: %S", pNa
1c920 6d 65 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73  me, 0);.    }els
1c930 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e{.      sqlite3
1c940 43 6f 64 65 56 65 72 69 66 79 4e 61 6d 65 64 53  CodeVerifyNamedS
1c950 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20 70 4e  chema(pParse, pN
1c960 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 44 61 74 61 62  ame->a[0].zDatab
1c970 61 73 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ase);.    }.    
1c980 70 50 61 72 73 65 2d 3e 63 68 65 63 6b 53 63 68  pParse->checkSch
1c990 65 6d 61 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74  ema = 1;.    got
1c9a0 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65  o exit_drop_inde
1c9b0 78 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 49 6e  x;.  }.  if( pIn
1c9c0 64 65 78 2d 3e 69 64 78 54 79 70 65 21 3d 53 51  dex->idxType!=SQ
1c9d0 4c 49 54 45 5f 49 44 58 54 59 50 45 5f 41 50 50  LITE_IDXTYPE_APP
1c9e0 44 45 46 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  DEF ){.    sqlit
1c9f0 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
1ca00 65 2c 20 22 69 6e 64 65 78 20 61 73 73 6f 63 69  e, "index associ
1ca10 61 74 65 64 20 77 69 74 68 20 55 4e 49 51 55 45  ated with UNIQUE
1ca20 20 22 0a 20 20 20 20 20 20 22 6f 72 20 50 52 49   ".      "or PRI
1ca30 4d 41 52 59 20 4b 45 59 20 63 6f 6e 73 74 72 61  MARY KEY constra
1ca40 69 6e 74 20 63 61 6e 6e 6f 74 20 62 65 20 64 72  int cannot be dr
1ca50 6f 70 70 65 64 22 2c 20 30 29 3b 0a 20 20 20 20  opped", 0);.    
1ca60 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69  goto exit_drop_i
1ca70 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 69 44 62 20  ndex;.  }.  iDb 
1ca80 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54  = sqlite3SchemaT
1ca90 6f 49 6e 64 65 78 28 64 62 2c 20 70 49 6e 64 65  oIndex(db, pInde
1caa0 78 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 23 69 66  x->pSchema);.#if
1cab0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1cac0 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20  _AUTHORIZATION. 
1cad0 20 7b 0a 20 20 20 20 69 6e 74 20 63 6f 64 65 20   {.    int code 
1cae0 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 49 4e  = SQLITE_DROP_IN
1caf0 44 45 58 3b 0a 20 20 20 20 54 61 62 6c 65 20 2a  DEX;.    Table *
1cb00 70 54 61 62 20 3d 20 70 49 6e 64 65 78 2d 3e 70  pTab = pIndex->p
1cb10 54 61 62 6c 65 3b 0a 20 20 20 20 63 6f 6e 73 74  Table;.    const
1cb20 20 63 68 61 72 20 2a 7a 44 62 20 3d 20 64 62 2d   char *zDb = db-
1cb30 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 3b  >aDb[iDb].zName;
1cb40 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
1cb50 2a 7a 54 61 62 20 3d 20 53 43 48 45 4d 41 5f 54  *zTab = SCHEMA_T
1cb60 41 42 4c 45 28 69 44 62 29 3b 0a 20 20 20 20 69  ABLE(iDb);.    i
1cb70 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68  f( sqlite3AuthCh
1cb80 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49  eck(pParse, SQLI
1cb90 54 45 5f 44 45 4c 45 54 45 2c 20 7a 54 61 62 2c  TE_DELETE, zTab,
1cba0 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20   0, zDb) ){.    
1cbb0 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70    goto exit_drop
1cbc0 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20  _index;.    }.  
1cbd0 20 20 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50    if( !OMIT_TEMP
1cbe0 44 42 20 26 26 20 69 44 62 20 29 20 63 6f 64 65  DB && iDb ) code
1cbf0 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54   = SQLITE_DROP_T
1cc00 45 4d 50 5f 49 4e 44 45 58 3b 0a 20 20 20 20 69  EMP_INDEX;.    i
1cc10 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68  f( sqlite3AuthCh
1cc20 65 63 6b 28 70 50 61 72 73 65 2c 20 63 6f 64 65  eck(pParse, code
1cc30 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c  , pIndex->zName,
1cc40 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 44   pTab->zName, zD
1cc50 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  b) ){.      goto
1cc60 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78   exit_drop_index
1cc70 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  ;.    }.  }.#end
1cc80 69 66 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74  if..  /* Generat
1cc90 65 20 63 6f 64 65 20 74 6f 20 72 65 6d 6f 76 65  e code to remove
1cca0 20 74 68 65 20 69 6e 64 65 78 20 61 6e 64 20 66   the index and f
1ccb0 72 6f 6d 20 74 68 65 20 6d 61 73 74 65 72 20 74  rom the master t
1ccc0 61 62 6c 65 20 2a 2f 0a 20 20 76 20 3d 20 73 71  able */.  v = sq
1ccd0 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
1cce0 72 73 65 29 3b 0a 20 20 69 66 28 20 76 20 29 7b  rse);.  if( v ){
1ccf0 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69  .    sqlite3Begi
1cd00 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28  nWriteOperation(
1cd10 70 50 61 72 73 65 2c 20 31 2c 20 69 44 62 29 3b  pParse, 1, iDb);
1cd20 0a 20 20 20 20 73 71 6c 69 74 65 33 4e 65 73 74  .    sqlite3Nest
1cd30 65 64 50 61 72 73 65 28 70 50 61 72 73 65 2c 0a  edParse(pParse,.
1cd40 20 20 20 20 20 20 20 22 44 45 4c 45 54 45 20 46         "DELETE F
1cd50 52 4f 4d 20 25 51 2e 25 73 20 57 48 45 52 45 20  ROM %Q.%s WHERE 
1cd60 6e 61 6d 65 3d 25 51 20 41 4e 44 20 74 79 70 65  name=%Q AND type
1cd70 3d 27 69 6e 64 65 78 27 22 2c 0a 20 20 20 20 20  ='index'",.     
1cd80 20 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a    db->aDb[iDb].z
1cd90 4e 61 6d 65 2c 20 53 43 48 45 4d 41 5f 54 41 42  Name, SCHEMA_TAB
1cda0 4c 45 28 69 44 62 29 2c 20 70 49 6e 64 65 78 2d  LE(iDb), pIndex-
1cdb0 3e 7a 4e 61 6d 65 0a 20 20 20 20 29 3b 0a 20 20  >zName.    );.  
1cdc0 20 20 73 71 6c 69 74 65 33 43 6c 65 61 72 53 74    sqlite3ClearSt
1cdd0 61 74 54 61 62 6c 65 73 28 70 50 61 72 73 65 2c  atTables(pParse,
1cde0 20 69 44 62 2c 20 22 69 64 78 22 2c 20 70 49 6e   iDb, "idx", pIn
1cdf0 64 65 78 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  dex->zName);.   
1ce00 20 73 71 6c 69 74 65 33 43 68 61 6e 67 65 43 6f   sqlite3ChangeCo
1ce10 6f 6b 69 65 28 70 50 61 72 73 65 2c 20 69 44 62  okie(pParse, iDb
1ce20 29 3b 0a 20 20 20 20 64 65 73 74 72 6f 79 52 6f  );.    destroyRo
1ce30 6f 74 50 61 67 65 28 70 50 61 72 73 65 2c 20 70  otPage(pParse, p
1ce40 49 6e 64 65 78 2d 3e 74 6e 75 6d 2c 20 69 44 62  Index->tnum, iDb
1ce50 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
1ce60 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 44  beAddOp4(v, OP_D
1ce70 72 6f 70 49 6e 64 65 78 2c 20 69 44 62 2c 20 30  ropIndex, iDb, 0
1ce80 2c 20 30 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61  , 0, pIndex->zNa
1ce90 6d 65 2c 20 30 29 3b 0a 20 20 7d 0a 0a 65 78 69  me, 0);.  }..exi
1cea0 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3a 0a 20 20  t_drop_index:.  
1ceb0 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44 65  sqlite3SrcListDe
1cec0 6c 65 74 65 28 64 62 2c 20 70 4e 61 6d 65 29 3b  lete(db, pName);
1ced0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 41 72 72 61 79  .}../*.** pArray
1cee0 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   is a pointer to
1cef0 20 61 6e 20 61 72 72 61 79 20 6f 66 20 6f 62 6a   an array of obj
1cf00 65 63 74 73 2e 20 45 61 63 68 20 6f 62 6a 65 63  ects. Each objec
1cf10 74 20 69 6e 20 74 68 65 0a 2a 2a 20 61 72 72 61  t in the.** arra
1cf20 79 20 69 73 20 73 7a 45 6e 74 72 79 20 62 79 74  y is szEntry byt
1cf30 65 73 20 69 6e 20 73 69 7a 65 2e 20 54 68 69 73  es in size. This
1cf40 20 72 6f 75 74 69 6e 65 20 75 73 65 73 20 73 71   routine uses sq
1cf50 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 28 29  lite3DbRealloc()
1cf60 0a 2a 2a 20 74 6f 20 65 78 74 65 6e 64 20 74 68  .** to extend th
1cf70 65 20 61 72 72 61 79 20 73 6f 20 74 68 61 74 20  e array so that 
1cf80 74 68 65 72 65 20 69 73 20 73 70 61 63 65 20 66  there is space f
1cf90 6f 72 20 61 20 6e 65 77 20 6f 62 6a 65 63 74 20  or a new object 
1cfa0 61 74 20 74 68 65 20 65 6e 64 2e 0a 2a 2a 0a 2a  at the end..**.*
1cfb0 2a 20 57 68 65 6e 20 74 68 69 73 20 66 75 6e 63  * When this func
1cfc0 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20  tion is called, 
1cfd0 2a 70 6e 45 6e 74 72 79 20 63 6f 6e 74 61 69 6e  *pnEntry contain
1cfe0 73 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 69  s the current si
1cff0 7a 65 20 6f 66 0a 2a 2a 20 74 68 65 20 61 72 72  ze of.** the arr
1d000 61 79 20 28 69 6e 20 65 6e 74 72 69 65 73 20 2d  ay (in entries -
1d010 20 73 6f 20 74 68 65 20 61 6c 6c 6f 63 61 74 69   so the allocati
1d020 6f 6e 20 69 73 20 28 28 2a 70 6e 45 6e 74 72 79  on is ((*pnEntry
1d030 29 20 2a 20 73 7a 45 6e 74 72 79 29 20 62 79 74  ) * szEntry) byt
1d040 65 73 0a 2a 2a 20 69 6e 20 74 6f 74 61 6c 29 2e  es.** in total).
1d050 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 72 65  .**.** If the re
1d060 61 6c 6c 6f 63 28 29 20 69 73 20 73 75 63 63 65  alloc() is succe
1d070 73 73 66 75 6c 20 28 69 2e 65 2e 20 69 66 20 6e  ssful (i.e. if n
1d080 6f 20 4f 4f 4d 20 63 6f 6e 64 69 74 69 6f 6e 20  o OOM condition 
1d090 6f 63 63 75 72 73 29 2c 20 74 68 65 0a 2a 2a 20  occurs), the.** 
1d0a0 73 70 61 63 65 20 61 6c 6c 6f 63 61 74 65 64 20  space allocated 
1d0b0 66 6f 72 20 74 68 65 20 6e 65 77 20 6f 62 6a 65  for the new obje
1d0c0 63 74 20 69 73 20 7a 65 72 6f 65 64 2c 20 2a 70  ct is zeroed, *p
1d0d0 6e 45 6e 74 72 79 20 75 70 64 61 74 65 64 20 74  nEntry updated t
1d0e0 6f 0a 2a 2a 20 72 65 66 6c 65 63 74 20 74 68 65  o.** reflect the
1d0f0 20 6e 65 77 20 73 69 7a 65 20 6f 66 20 74 68 65   new size of the
1d100 20 61 72 72 61 79 20 61 6e 64 20 61 20 70 6f 69   array and a poi
1d110 6e 74 65 72 20 74 6f 20 74 68 65 20 6e 65 77 20  nter to the new 
1d120 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2a 20 72 65  allocation.** re
1d130 74 75 72 6e 65 64 2e 20 2a 70 49 64 78 20 69 73  turned. *pIdx is
1d140 20 73 65 74 20 74 6f 20 74 68 65 20 69 6e 64 65   set to the inde
1d150 78 20 6f 66 20 74 68 65 20 6e 65 77 20 61 72 72  x of the new arr
1d160 61 79 20 65 6e 74 72 79 20 69 6e 20 74 68 69 73  ay entry in this
1d170 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68   case..**.** Oth
1d180 65 72 77 69 73 65 2c 20 69 66 20 74 68 65 20 72  erwise, if the r
1d190 65 61 6c 6c 6f 63 28 29 20 66 61 69 6c 73 2c 20  ealloc() fails, 
1d1a0 2a 70 49 64 78 20 69 73 20 73 65 74 20 74 6f 20  *pIdx is set to 
1d1b0 2d 31 2c 20 2a 70 6e 45 6e 74 72 79 20 72 65 6d  -1, *pnEntry rem
1d1c0 61 69 6e 73 0a 2a 2a 20 75 6e 63 68 61 6e 67 65  ains.** unchange
1d1d0 64 20 61 6e 64 20 61 20 63 6f 70 79 20 6f 66 20  d and a copy of 
1d1e0 70 41 72 72 61 79 20 72 65 74 75 72 6e 65 64 2e  pArray returned.
1d1f0 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65  .*/.void *sqlite
1d200 33 41 72 72 61 79 41 6c 6c 6f 63 61 74 65 28 0a  3ArrayAllocate(.
1d210 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20    sqlite3 *db,  
1d220 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f      /* Connectio
1d230 6e 20 74 6f 20 6e 6f 74 69 66 79 20 6f 66 20 6d  n to notify of m
1d240 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65 73 20 2a  alloc failures *
1d250 2f 0a 20 20 76 6f 69 64 20 2a 70 41 72 72 61 79  /.  void *pArray
1d260 2c 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f  ,     /* Array o
1d270 66 20 6f 62 6a 65 63 74 73 2e 20 20 4d 69 67 68  f objects.  Migh
1d280 74 20 62 65 20 72 65 61 6c 6c 6f 63 61 74 65 64  t be reallocated
1d290 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 45 6e 74 72   */.  int szEntr
1d2a0 79 2c 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20  y,      /* Size 
1d2b0 6f 66 20 65 61 63 68 20 6f 62 6a 65 63 74 20 69  of each object i
1d2c0 6e 20 74 68 65 20 61 72 72 61 79 20 2a 2f 0a 20  n the array */. 
1d2d0 20 69 6e 74 20 2a 70 6e 45 6e 74 72 79 2c 20 20   int *pnEntry,  
1d2e0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
1d2f0 6f 62 6a 65 63 74 73 20 63 75 72 72 65 6e 74 6c  objects currentl
1d300 79 20 69 6e 20 75 73 65 20 2a 2f 0a 20 20 69 6e  y in use */.  in
1d310 74 20 2a 70 49 64 78 20 20 20 20 20 20 20 20 20  t *pIdx         
1d320 2f 2a 20 57 72 69 74 65 20 74 68 65 20 69 6e 64  /* Write the ind
1d330 65 78 20 6f 66 20 61 20 6e 65 77 20 73 6c 6f 74  ex of a new slot
1d340 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 63 68   here */.){.  ch
1d350 61 72 20 2a 7a 3b 0a 20 20 69 6e 74 20 6e 20 3d  ar *z;.  int n =
1d360 20 2a 70 6e 45 6e 74 72 79 3b 0a 20 20 69 66 28   *pnEntry;.  if(
1d370 20 28 6e 20 26 20 28 6e 2d 31 29 29 3d 3d 30 20   (n & (n-1))==0 
1d380 29 7b 0a 20 20 20 20 69 6e 74 20 73 7a 20 3d 20  ){.    int sz = 
1d390 28 6e 3d 3d 30 29 20 3f 20 31 20 3a 20 32 2a 6e  (n==0) ? 1 : 2*n
1d3a0 3b 0a 20 20 20 20 76 6f 69 64 20 2a 70 4e 65 77  ;.    void *pNew
1d3b0 20 3d 20 73 71 6c 69 74 65 33 44 62 52 65 61 6c   = sqlite3DbReal
1d3c0 6c 6f 63 28 64 62 2c 20 70 41 72 72 61 79 2c 20  loc(db, pArray, 
1d3d0 73 7a 2a 73 7a 45 6e 74 72 79 29 3b 0a 20 20 20  sz*szEntry);.   
1d3e0 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a   if( pNew==0 ){.
1d3f0 20 20 20 20 20 20 2a 70 49 64 78 20 3d 20 2d 31        *pIdx = -1
1d400 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70  ;.      return p
1d410 41 72 72 61 79 3b 0a 20 20 20 20 7d 0a 20 20 20  Array;.    }.   
1d420 20 70 41 72 72 61 79 20 3d 20 70 4e 65 77 3b 0a   pArray = pNew;.
1d430 20 20 7d 0a 20 20 7a 20 3d 20 28 63 68 61 72 2a    }.  z = (char*
1d440 29 70 41 72 72 61 79 3b 0a 20 20 6d 65 6d 73 65  )pArray;.  memse
1d450 74 28 26 7a 5b 6e 20 2a 20 73 7a 45 6e 74 72 79  t(&z[n * szEntry
1d460 5d 2c 20 30 2c 20 73 7a 45 6e 74 72 79 29 3b 0a  ], 0, szEntry);.
1d470 20 20 2a 70 49 64 78 20 3d 20 6e 3b 0a 20 20 2b    *pIdx = n;.  +
1d480 2b 2a 70 6e 45 6e 74 72 79 3b 0a 20 20 72 65 74  +*pnEntry;.  ret
1d490 75 72 6e 20 70 41 72 72 61 79 3b 0a 7d 0a 0a 2f  urn pArray;.}../
1d4a0 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 61 20 6e 65  *.** Append a ne
1d4b0 77 20 65 6c 65 6d 65 6e 74 20 74 6f 20 74 68 65  w element to the
1d4c0 20 67 69 76 65 6e 20 49 64 4c 69 73 74 2e 20 20   given IdList.  
1d4d0 43 72 65 61 74 65 20 61 20 6e 65 77 20 49 64 4c  Create a new IdL
1d4e0 69 73 74 20 69 66 0a 2a 2a 20 6e 65 65 64 20 62  ist if.** need b
1d4f0 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 6e 65 77 20 49  e..**.** A new I
1d500 64 4c 69 73 74 20 69 73 20 72 65 74 75 72 6e 65  dList is returne
1d510 64 2c 20 6f 72 20 4e 55 4c 4c 20 69 66 20 6d 61  d, or NULL if ma
1d520 6c 6c 6f 63 28 29 20 66 61 69 6c 73 2e 0a 2a 2f  lloc() fails..*/
1d530 0a 49 64 4c 69 73 74 20 2a 73 71 6c 69 74 65 33  .IdList *sqlite3
1d540 49 64 4c 69 73 74 41 70 70 65 6e 64 28 73 71 6c  IdListAppend(sql
1d550 69 74 65 33 20 2a 64 62 2c 20 49 64 4c 69 73 74  ite3 *db, IdList
1d560 20 2a 70 4c 69 73 74 2c 20 54 6f 6b 65 6e 20 2a   *pList, Token *
1d570 70 54 6f 6b 65 6e 29 7b 0a 20 20 69 6e 74 20 69  pToken){.  int i
1d580 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30  ;.  if( pList==0
1d590 20 29 7b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20   ){.    pList = 
1d5a0 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a  sqlite3DbMallocZ
1d5b0 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 49  ero(db, sizeof(I
1d5c0 64 4c 69 73 74 29 20 29 3b 0a 20 20 20 20 69 66  dList) );.    if
1d5d0 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74  ( pList==0 ) ret
1d5e0 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 4c 69  urn 0;.  }.  pLi
1d5f0 73 74 2d 3e 61 20 3d 20 73 71 6c 69 74 65 33 41  st->a = sqlite3A
1d600 72 72 61 79 41 6c 6c 6f 63 61 74 65 28 0a 20 20  rrayAllocate(.  
1d610 20 20 20 20 64 62 2c 0a 20 20 20 20 20 20 70 4c      db,.      pL
1d620 69 73 74 2d 3e 61 2c 0a 20 20 20 20 20 20 73 69  ist->a,.      si
1d630 7a 65 6f 66 28 70 4c 69 73 74 2d 3e 61 5b 30 5d  zeof(pList->a[0]
1d640 29 2c 0a 20 20 20 20 20 20 26 70 4c 69 73 74 2d  ),.      &pList-
1d650 3e 6e 49 64 2c 0a 20 20 20 20 20 20 26 69 0a 20  >nId,.      &i. 
1d660 20 29 3b 0a 20 20 69 66 28 20 69 3c 30 20 29 7b   );.  if( i<0 ){
1d670 0a 20 20 20 20 73 71 6c 69 74 65 33 49 64 4c 69  .    sqlite3IdLi
1d680 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 4c 69  stDelete(db, pLi
1d690 73 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  st);.    return 
1d6a0 30 3b 0a 20 20 7d 0a 20 20 70 4c 69 73 74 2d 3e  0;.  }.  pList->
1d6b0 61 5b 69 5d 2e 7a 4e 61 6d 65 20 3d 20 73 71 6c  a[i].zName = sql
1d6c0 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65  ite3NameFromToke
1d6d0 6e 28 64 62 2c 20 70 54 6f 6b 65 6e 29 3b 0a 20  n(db, pToken);. 
1d6e0 20 72 65 74 75 72 6e 20 70 4c 69 73 74 3b 0a 7d   return pList;.}
1d6f0 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61  ../*.** Delete a
1d700 6e 20 49 64 4c 69 73 74 2e 0a 2a 2f 0a 76 6f 69  n IdList..*/.voi
1d710 64 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44  d sqlite3IdListD
1d720 65 6c 65 74 65 28 73 71 6c 69 74 65 33 20 2a 64  elete(sqlite3 *d
1d730 62 2c 20 49 64 4c 69 73 74 20 2a 70 4c 69 73 74  b, IdList *pList
1d740 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66  ){.  int i;.  if
1d750 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74  ( pList==0 ) ret
1d760 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  urn;.  for(i=0; 
1d770 69 3c 70 4c 69 73 74 2d 3e 6e 49 64 3b 20 69 2b  i<pList->nId; i+
1d780 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  +){.    sqlite3D
1d790 62 46 72 65 65 28 64 62 2c 20 70 4c 69 73 74 2d  bFree(db, pList-
1d7a0 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20  >a[i].zName);.  
1d7b0 7d 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  }.  sqlite3DbFre
1d7c0 65 28 64 62 2c 20 70 4c 69 73 74 2d 3e 61 29 3b  e(db, pList->a);
1d7d0 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
1d7e0 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a 7d 0a 0a  (db, pList);.}..
1d7f0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
1d800 20 69 6e 64 65 78 20 69 6e 20 70 4c 69 73 74 20   index in pList 
1d810 6f 66 20 74 68 65 20 69 64 65 6e 74 69 66 69 65  of the identifie
1d820 72 20 6e 61 6d 65 64 20 7a 49 64 2e 20 20 52 65  r named zId.  Re
1d830 74 75 72 6e 20 2d 31 0a 2a 2a 20 69 66 20 6e 6f  turn -1.** if no
1d840 74 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 69 6e 74 20  t found..*/.int 
1d850 73 71 6c 69 74 65 33 49 64 4c 69 73 74 49 6e 64  sqlite3IdListInd
1d860 65 78 28 49 64 4c 69 73 74 20 2a 70 4c 69 73 74  ex(IdList *pList
1d870 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e  , const char *zN
1d880 61 6d 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  ame){.  int i;. 
1d890 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20   if( pList==0 ) 
1d8a0 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 66 6f 72  return -1;.  for
1d8b0 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e  (i=0; i<pList->n
1d8c0 49 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  Id; i++){.    if
1d8d0 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ( sqlite3StrICmp
1d8e0 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61  (pList->a[i].zNa
1d8f0 6d 65 2c 20 7a 4e 61 6d 65 29 3d 3d 30 20 29 20  me, zName)==0 ) 
1d900 72 65 74 75 72 6e 20 69 3b 0a 20 20 7d 0a 20 20  return i;.  }.  
1d910 72 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 2f 2a  return -1;.}../*
1d920 0a 2a 2a 20 45 78 70 61 6e 64 20 74 68 65 20 73  .** Expand the s
1d930 70 61 63 65 20 61 6c 6c 6f 63 61 74 65 64 20 66  pace allocated f
1d940 6f 72 20 74 68 65 20 67 69 76 65 6e 20 53 72 63  or the given Src
1d950 4c 69 73 74 20 6f 62 6a 65 63 74 20 62 79 0a 2a  List object by.*
1d960 2a 20 63 72 65 61 74 69 6e 67 20 6e 45 78 74 72  * creating nExtr
1d970 61 20 6e 65 77 20 73 6c 6f 74 73 20 62 65 67 69  a new slots begi
1d980 6e 6e 69 6e 67 20 61 74 20 69 53 74 61 72 74 2e  nning at iStart.
1d990 20 20 69 53 74 61 72 74 20 69 73 20 7a 65 72 6f    iStart is zero
1d9a0 20 62 61 73 65 64 2e 0a 2a 2a 20 4e 65 77 20 73   based..** New s
1d9b0 6c 6f 74 73 20 61 72 65 20 7a 65 72 6f 65 64 2e  lots are zeroed.
1d9c0 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78 61 6d 70  .**.** For examp
1d9d0 6c 65 2c 20 73 75 70 70 6f 73 65 20 61 20 53 72  le, suppose a Sr
1d9e0 63 4c 69 73 74 20 69 6e 69 74 69 61 6c 6c 79 20  cList initially 
1d9f0 63 6f 6e 74 61 69 6e 73 20 74 77 6f 20 65 6e 74  contains two ent
1da00 72 69 65 73 3a 20 41 2c 42 2e 0a 2a 2a 20 54 6f  ries: A,B..** To
1da10 20 61 70 70 65 6e 64 20 33 20 6e 65 77 20 65 6e   append 3 new en
1da20 74 72 69 65 73 20 6f 6e 74 6f 20 74 68 65 20 65  tries onto the e
1da30 6e 64 2c 20 64 6f 20 74 68 69 73 3a 0a 2a 2a 0a  nd, do this:.**.
1da40 2a 2a 20 20 20 20 73 71 6c 69 74 65 33 53 72 63  **    sqlite3Src
1da50 4c 69 73 74 45 6e 6c 61 72 67 65 28 64 62 2c 20  ListEnlarge(db, 
1da60 70 53 72 63 6c 69 73 74 2c 20 33 2c 20 32 29 3b  pSrclist, 3, 2);
1da70 0a 2a 2a 0a 2a 2a 20 41 66 74 65 72 20 74 68 65  .**.** After the
1da80 20 63 61 6c 6c 20 61 62 6f 76 65 20 69 74 20 77   call above it w
1da90 6f 75 6c 64 20 63 6f 6e 74 61 69 6e 3a 20 20 41  ould contain:  A
1daa0 2c 20 42 2c 20 6e 69 6c 2c 20 6e 69 6c 2c 20 6e  , B, nil, nil, n
1dab0 69 6c 2e 0a 2a 2a 20 49 66 20 74 68 65 20 69 53  il..** If the iS
1dac0 74 61 72 74 20 61 72 67 75 6d 65 6e 74 20 68 61  tart argument ha
1dad0 64 20 62 65 65 6e 20 31 20 69 6e 73 74 65 61 64  d been 1 instead
1dae0 20 6f 66 20 32 2c 20 74 68 65 6e 20 74 68 65 20   of 2, then the 
1daf0 72 65 73 75 6c 74 0a 2a 2a 20 77 6f 75 6c 64 20  result.** would 
1db00 68 61 76 65 20 62 65 65 6e 3a 20 20 41 2c 20 6e  have been:  A, n
1db10 69 6c 2c 20 6e 69 6c 2c 20 6e 69 6c 2c 20 42 2e  il, nil, nil, B.
1db20 20 20 54 6f 20 70 72 65 70 65 6e 64 20 74 68 65    To prepend the
1db30 20 6e 65 77 20 73 6c 6f 74 73 2c 0a 2a 2a 20 74   new slots,.** t
1db40 68 65 20 69 53 74 61 72 74 20 76 61 6c 75 65 20  he iStart value 
1db50 77 6f 75 6c 64 20 62 65 20 30 2e 20 20 54 68 65  would be 0.  The
1db60 20 72 65 73 75 6c 74 20 74 68 65 6e 20 77 6f 75   result then wou
1db70 6c 64 0a 2a 2a 20 62 65 3a 20 6e 69 6c 2c 20 6e  ld.** be: nil, n
1db80 69 6c 2c 20 6e 69 6c 2c 20 41 2c 20 42 2e 0a 2a  il, nil, A, B..*
1db90 2a 0a 2a 2a 20 49 66 20 61 20 6d 65 6d 6f 72 79  *.** If a memory
1dba0 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c   allocation fail
1dbb0 73 20 74 68 65 20 53 72 63 4c 69 73 74 20 69 73  s the SrcList is
1dbc0 20 75 6e 63 68 61 6e 67 65 64 2e 20 20 54 68 65   unchanged.  The
1dbd0 0a 2a 2a 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  .** db->mallocFa
1dbe0 69 6c 65 64 20 66 6c 61 67 20 77 69 6c 6c 20 62  iled flag will b
1dbf0 65 20 73 65 74 20 74 6f 20 74 72 75 65 2e 0a 2a  e set to true..*
1dc00 2f 0a 53 72 63 4c 69 73 74 20 2a 73 71 6c 69 74  /.SrcList *sqlit
1dc10 65 33 53 72 63 4c 69 73 74 45 6e 6c 61 72 67 65  e3SrcListEnlarge
1dc20 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
1dc30 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
1dc40 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f  se connection to
1dc50 20 6e 6f 74 69 66 79 20 6f 66 20 4f 4f 4d 20 65   notify of OOM e
1dc60 72 72 6f 72 73 20 2a 2f 0a 20 20 53 72 63 4c 69  rrors */.  SrcLi
1dc70 73 74 20 2a 70 53 72 63 2c 20 20 20 20 20 2f 2a  st *pSrc,     /*
1dc80 20 54 68 65 20 53 72 63 4c 69 73 74 20 74 6f 20   The SrcList to 
1dc90 62 65 20 65 6e 6c 61 72 67 65 64 20 2a 2f 0a 20  be enlarged */. 
1dca0 20 69 6e 74 20 6e 45 78 74 72 61 2c 20 20 20 20   int nExtra,    
1dcb0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1dcc0 20 6e 65 77 20 73 6c 6f 74 73 20 74 6f 20 61 64   new slots to ad
1dcd0 64 20 74 6f 20 70 53 72 63 2d 3e 61 5b 5d 20 2a  d to pSrc->a[] *
1dce0 2f 0a 20 20 69 6e 74 20 69 53 74 61 72 74 20 20  /.  int iStart  
1dcf0 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
1dd00 69 6e 20 70 53 72 63 2d 3e 61 5b 5d 20 6f 66 20  in pSrc->a[] of 
1dd10 66 69 72 73 74 20 6e 65 77 20 73 6c 6f 74 20 2a  first new slot *
1dd20 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20  /.){.  int i;.. 
1dd30 20 2f 2a 20 53 61 6e 69 74 79 20 63 68 65 63 6b   /* Sanity check
1dd40 69 6e 67 20 6f 6e 20 63 61 6c 6c 69 6e 67 20 70  ing on calling p
1dd50 61 72 61 6d 65 74 65 72 73 20 2a 2f 0a 20 20 61  arameters */.  a
1dd60 73 73 65 72 74 28 20 69 53 74 61 72 74 3e 3d 30  ssert( iStart>=0
1dd70 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 45   );.  assert( nE
1dd80 78 74 72 61 3e 3d 31 20 29 3b 0a 20 20 61 73 73  xtra>=1 );.  ass
1dd90 65 72 74 28 20 70 53 72 63 21 3d 30 20 29 3b 0a  ert( pSrc!=0 );.
1dda0 20 20 61 73 73 65 72 74 28 20 69 53 74 61 72 74    assert( iStart
1ddb0 3c 3d 70 53 72 63 2d 3e 6e 53 72 63 20 29 3b 0a  <=pSrc->nSrc );.
1ddc0 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61  .  /* Allocate a
1ddd0 64 64 69 74 69 6f 6e 61 6c 20 73 70 61 63 65 20  dditional space 
1dde0 69 66 20 6e 65 65 64 65 64 20 2a 2f 0a 20 20 69  if needed */.  i
1ddf0 66 28 20 28 75 33 32 29 70 53 72 63 2d 3e 6e 53  f( (u32)pSrc->nS
1de00 72 63 2b 6e 45 78 74 72 61 3e 70 53 72 63 2d 3e  rc+nExtra>pSrc->
1de10 6e 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 53 72  nAlloc ){.    Sr
1de20 63 4c 69 73 74 20 2a 70 4e 65 77 3b 0a 20 20 20  cList *pNew;.   
1de30 20 69 6e 74 20 6e 41 6c 6c 6f 63 20 3d 20 70 53   int nAlloc = pS
1de40 72 63 2d 3e 6e 53 72 63 2b 6e 45 78 74 72 61 3b  rc->nSrc+nExtra;
1de50 0a 20 20 20 20 69 6e 74 20 6e 47 6f 74 3b 0a 20  .    int nGot;. 
1de60 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65     pNew = sqlite
1de70 33 44 62 52 65 61 6c 6c 6f 63 28 64 62 2c 20 70  3DbRealloc(db, p
1de80 53 72 63 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Src,.           
1de90 20 20 20 20 73 69 7a 65 6f 66 28 2a 70 53 72 63      sizeof(*pSrc
1dea0 29 20 2b 20 28 6e 41 6c 6c 6f 63 2d 31 29 2a 73  ) + (nAlloc-1)*s
1deb0 69 7a 65 6f 66 28 70 53 72 63 2d 3e 61 5b 30 5d  izeof(pSrc->a[0]
1dec0 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4e 65  ) );.    if( pNe
1ded0 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 73  w==0 ){.      as
1dee0 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63  sert( db->malloc
1def0 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20 20  Failed );.      
1df00 72 65 74 75 72 6e 20 70 53 72 63 3b 0a 20 20 20  return pSrc;.   
1df10 20 7d 0a 20 20 20 20 70 53 72 63 20 3d 20 70 4e   }.    pSrc = pN
1df20 65 77 3b 0a 20 20 20 20 6e 47 6f 74 20 3d 20 28  ew;.    nGot = (
1df30 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 53  sqlite3DbMallocS
1df40 69 7a 65 28 64 62 2c 20 70 4e 65 77 29 20 2d 20  ize(db, pNew) - 
1df50 73 69 7a 65 6f 66 28 2a 70 53 72 63 29 29 2f 73  sizeof(*pSrc))/s
1df60 69 7a 65 6f 66 28 70 53 72 63 2d 3e 61 5b 30 5d  izeof(pSrc->a[0]
1df70 29 2b 31 3b 0a 20 20 20 20 70 53 72 63 2d 3e 6e  )+1;.    pSrc->n
1df80 41 6c 6c 6f 63 20 3d 20 6e 47 6f 74 3b 0a 20 20  Alloc = nGot;.  
1df90 7d 0a 0a 20 20 2f 2a 20 4d 6f 76 65 20 65 78 69  }..  /* Move exi
1dfa0 73 74 69 6e 67 20 73 6c 6f 74 73 20 74 68 61 74  sting slots that
1dfb0 20 63 6f 6d 65 20 61 66 74 65 72 20 74 68 65 20   come after the 
1dfc0 6e 65 77 6c 79 20 69 6e 73 65 72 74 65 64 20 73  newly inserted s
1dfd0 6c 6f 74 73 0a 20 20 2a 2a 20 6f 75 74 20 6f 66  lots.  ** out of
1dfe0 20 74 68 65 20 77 61 79 20 2a 2f 0a 20 20 66 6f   the way */.  fo
1dff0 72 28 69 3d 70 53 72 63 2d 3e 6e 53 72 63 2d 31  r(i=pSrc->nSrc-1
1e000 3b 20 69 3e 3d 69 53 74 61 72 74 3b 20 69 2d 2d  ; i>=iStart; i--
1e010 29 7b 0a 20 20 20 20 70 53 72 63 2d 3e 61 5b 69  ){.    pSrc->a[i
1e020 2b 6e 45 78 74 72 61 5d 20 3d 20 70 53 72 63 2d  +nExtra] = pSrc-
1e030 3e 61 5b 69 5d 3b 0a 20 20 7d 0a 20 20 70 53 72  >a[i];.  }.  pSr
1e040 63 2d 3e 6e 53 72 63 20 2b 3d 20 6e 45 78 74 72  c->nSrc += nExtr
1e050 61 3b 0a 0a 20 20 2f 2a 20 5a 65 72 6f 20 74 68  a;..  /* Zero th
1e060 65 20 6e 65 77 6c 79 20 61 6c 6c 6f 63 61 74 65  e newly allocate
1e070 64 20 73 6c 6f 74 73 20 2a 2f 0a 20 20 6d 65 6d  d slots */.  mem
1e080 73 65 74 28 26 70 53 72 63 2d 3e 61 5b 69 53 74  set(&pSrc->a[iSt
1e090 61 72 74 5d 2c 20 30 2c 20 73 69 7a 65 6f 66 28  art], 0, sizeof(
1e0a0 70 53 72 63 2d 3e 61 5b 30 5d 29 2a 6e 45 78 74  pSrc->a[0])*nExt
1e0b0 72 61 29 3b 0a 20 20 66 6f 72 28 69 3d 69 53 74  ra);.  for(i=iSt
1e0c0 61 72 74 3b 20 69 3c 69 53 74 61 72 74 2b 6e 45  art; i<iStart+nE
1e0d0 78 74 72 61 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  xtra; i++){.    
1e0e0 70 53 72 63 2d 3e 61 5b 69 5d 2e 69 43 75 72 73  pSrc->a[i].iCurs
1e0f0 6f 72 20 3d 20 2d 31 3b 0a 20 20 7d 0a 0a 20 20  or = -1;.  }..  
1e100 2f 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e  /* Return a poin
1e110 74 65 72 20 74 6f 20 74 68 65 20 65 6e 6c 61 72  ter to the enlar
1e120 67 65 64 20 53 72 63 4c 69 73 74 20 2a 2f 0a 20  ged SrcList */. 
1e130 20 72 65 74 75 72 6e 20 70 53 72 63 3b 0a 7d 0a   return pSrc;.}.
1e140 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 61  ../*.** Append a
1e150 20 6e 65 77 20 74 61 62 6c 65 20 6e 61 6d 65 20   new table name 
1e160 74 6f 20 74 68 65 20 67 69 76 65 6e 20 53 72 63  to the given Src
1e170 4c 69 73 74 2e 20 20 43 72 65 61 74 65 20 61 20  List.  Create a 
1e180 6e 65 77 20 53 72 63 4c 69 73 74 20 69 66 0a 2a  new SrcList if.*
1e190 2a 20 6e 65 65 64 20 62 65 2e 20 20 41 20 6e 65  * need be.  A ne
1e1a0 77 20 65 6e 74 72 79 20 69 73 20 63 72 65 61 74  w entry is creat
1e1b0 65 64 20 69 6e 20 74 68 65 20 53 72 63 4c 69 73  ed in the SrcLis
1e1c0 74 20 65 76 65 6e 20 69 66 20 70 54 61 62 6c 65  t even if pTable
1e1d0 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20   is NULL..**.** 
1e1e0 41 20 53 72 63 4c 69 73 74 20 69 73 20 72 65 74  A SrcList is ret
1e1f0 75 72 6e 65 64 2c 20 6f 72 20 4e 55 4c 4c 20 69  urned, or NULL i
1e200 66 20 74 68 65 72 65 20 69 73 20 61 6e 20 4f 4f  f there is an OO
1e210 4d 20 65 72 72 6f 72 2e 20 20 54 68 65 20 72 65  M error.  The re
1e220 74 75 72 6e 65 64 0a 2a 2a 20 53 72 63 4c 69 73  turned.** SrcLis
1e230 74 20 6d 69 67 68 74 20 62 65 20 74 68 65 20 73  t might be the s
1e240 61 6d 65 20 61 73 20 74 68 65 20 53 72 63 4c 69  ame as the SrcLi
1e250 73 74 20 74 68 61 74 20 77 61 73 20 69 6e 70 75  st that was inpu
1e260 74 20 6f 72 20 69 74 20 6d 69 67 68 74 20 62 65  t or it might be
1e270 0a 2a 2a 20 61 20 6e 65 77 20 6f 6e 65 2e 20 20  .** a new one.  
1e280 49 66 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 20  If an OOM error 
1e290 64 6f 65 73 20 6f 63 63 75 72 73 2c 20 74 68 65  does occurs, the
1e2a0 6e 20 74 68 65 20 70 72 69 6f 72 20 76 61 6c 75  n the prior valu
1e2b0 65 20 6f 66 20 70 4c 69 73 74 0a 2a 2a 20 74 68  e of pList.** th
1e2c0 61 74 20 69 73 20 69 6e 70 75 74 20 74 6f 20 74  at is input to t
1e2d0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
1e2e0 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 66 72 65  utomatically fre
1e2f0 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 44 61  ed..**.** If pDa
1e300 74 61 62 61 73 65 20 69 73 20 6e 6f 74 20 6e 75  tabase is not nu
1e310 6c 6c 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61  ll, it means tha
1e320 74 20 74 68 65 20 74 61 62 6c 65 20 68 61 73 20  t the table has 
1e330 61 6e 20 6f 70 74 69 6f 6e 61 6c 0a 2a 2a 20 64  an optional.** d
1e340 61 74 61 62 61 73 65 20 6e 61 6d 65 20 70 72 65  atabase name pre
1e350 66 69 78 2e 20 20 4c 69 6b 65 20 74 68 69 73 3a  fix.  Like this:
1e360 20 20 22 64 61 74 61 62 61 73 65 2e 74 61 62 6c    "database.tabl
1e370 65 22 2e 20 20 54 68 65 20 70 44 61 74 61 62 61  e".  The pDataba
1e380 73 65 0a 2a 2a 20 70 6f 69 6e 74 73 20 74 6f 20  se.** points to 
1e390 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 61  the table name a
1e3a0 6e 64 20 74 68 65 20 70 54 61 62 6c 65 20 70 6f  nd the pTable po
1e3b0 69 6e 74 73 20 74 6f 20 74 68 65 20 64 61 74 61  ints to the data
1e3c0 62 61 73 65 20 6e 61 6d 65 2e 0a 2a 2a 20 54 68  base name..** Th
1e3d0 65 20 53 72 63 4c 69 73 74 2e 61 5b 5d 2e 7a 4e  e SrcList.a[].zN
1e3e0 61 6d 65 20 66 69 65 6c 64 20 69 73 20 66 69 6c  ame field is fil
1e3f0 6c 65 64 20 77 69 74 68 20 74 68 65 20 74 61 62  led with the tab
1e400 6c 65 20 6e 61 6d 65 20 77 68 69 63 68 20 6d 69  le name which mi
1e410 67 68 74 0a 2a 2a 20 63 6f 6d 65 20 66 72 6f 6d  ght.** come from
1e420 20 70 54 61 62 6c 65 20 28 69 66 20 70 44 61 74   pTable (if pDat
1e430 61 62 61 73 65 20 69 73 20 4e 55 4c 4c 29 20 6f  abase is NULL) o
1e440 72 20 66 72 6f 6d 20 70 44 61 74 61 62 61 73 65  r from pDatabase
1e450 2e 20 20 0a 2a 2a 20 53 72 63 4c 69 73 74 2e 61  .  .** SrcList.a
1e460 5b 5d 2e 7a 44 61 74 61 62 61 73 65 20 69 73 20  [].zDatabase is 
1e470 66 69 6c 6c 65 64 20 77 69 74 68 20 74 68 65 20  filled with the 
1e480 64 61 74 61 62 61 73 65 20 6e 61 6d 65 20 66 72  database name fr
1e490 6f 6d 20 70 54 61 62 6c 65 2c 0a 2a 2a 20 6f 72  om pTable,.** or
1e4a0 20 77 69 74 68 20 4e 55 4c 4c 20 69 66 20 6e 6f   with NULL if no
1e4b0 20 64 61 74 61 62 61 73 65 20 69 73 20 73 70 65   database is spe
1e4c0 63 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 6e  cified..**.** In
1e4d0 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 69 66   other words, if
1e4e0 20 63 61 6c 6c 20 6c 69 6b 65 20 74 68 69 73 3a   call like this:
1e4f0 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 73  .**.**         s
1e500 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70 70  qlite3SrcListApp
1e510 65 6e 64 28 44 2c 41 2c 42 2c 30 29 3b 0a 2a 2a  end(D,A,B,0);.**
1e520 0a 2a 2a 20 54 68 65 6e 20 42 20 69 73 20 61 20  .** Then B is a 
1e530 74 61 62 6c 65 20 6e 61 6d 65 20 61 6e 64 20 74  table name and t
1e540 68 65 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65  he database name
1e550 20 69 73 20 75 6e 73 70 65 63 69 66 69 65 64 2e   is unspecified.
1e560 20 20 49 66 20 63 61 6c 6c 65 64 0a 2a 2a 20 6c    If called.** l
1e570 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20  ike this:.**.** 
1e580 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53          sqlite3S
1e590 72 63 4c 69 73 74 41 70 70 65 6e 64 28 44 2c 41  rcListAppend(D,A
1e5a0 2c 42 2c 43 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 65  ,B,C);.**.** The
1e5b0 6e 20 43 20 69 73 20 74 68 65 20 74 61 62 6c 65  n C is the table
1e5c0 20 6e 61 6d 65 20 61 6e 64 20 42 20 69 73 20 74   name and B is t
1e5d0 68 65 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65  he database name
1e5e0 2e 20 20 49 66 20 43 20 69 73 20 64 65 66 69 6e  .  If C is defin
1e5f0 65 64 0a 2a 2a 20 74 68 65 6e 20 73 6f 20 69 73  ed.** then so is
1e600 20 42 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f   B.  In other wo
1e610 72 64 73 2c 20 77 65 20 6e 65 76 65 72 20 68 61  rds, we never ha
1e620 76 65 20 61 20 63 61 73 65 20 77 68 65 72 65 3a  ve a case where:
1e630 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 73  .**.**         s
1e640 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70 70  qlite3SrcListApp
1e650 65 6e 64 28 44 2c 41 2c 30 2c 43 29 3b 0a 2a 2a  end(D,A,0,C);.**
1e660 0a 2a 2a 20 42 6f 74 68 20 70 54 61 62 6c 65 20  .** Both pTable 
1e670 61 6e 64 20 70 44 61 74 61 62 61 73 65 20 61 72  and pDatabase ar
1e680 65 20 61 73 73 75 6d 65 64 20 74 6f 20 62 65 20  e assumed to be 
1e690 71 75 6f 74 65 64 2e 20 20 54 68 65 79 20 61 72  quoted.  They ar
1e6a0 65 20 64 65 71 75 6f 74 65 64 0a 2a 2a 20 62 65  e dequoted.** be
1e6b0 66 6f 72 65 20 62 65 69 6e 67 20 61 64 64 65 64  fore being added
1e6c0 20 74 6f 20 74 68 65 20 53 72 63 4c 69 73 74 2e   to the SrcList.
1e6d0 0a 2a 2f 0a 53 72 63 4c 69 73 74 20 2a 73 71 6c  .*/.SrcList *sql
1e6e0 69 74 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e  ite3SrcListAppen
1e6f0 64 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  d(.  sqlite3 *db
1e700 2c 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 6e  ,        /* Conn
1e710 65 63 74 69 6f 6e 20 74 6f 20 6e 6f 74 69 66 79  ection to notify
1e720 20 6f 66 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75   of malloc failu
1e730 72 65 73 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74  res */.  SrcList
1e740 20 2a 70 4c 69 73 74 2c 20 20 20 20 20 2f 2a 20   *pList,     /* 
1e750 41 70 70 65 6e 64 20 74 6f 20 74 68 69 73 20 53  Append to this S
1e760 72 63 4c 69 73 74 2e 20 4e 55 4c 4c 20 63 72 65  rcList. NULL cre
1e770 61 74 65 73 20 61 20 6e 65 77 20 53 72 63 4c 69  ates a new SrcLi
1e780 73 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  st */.  Token *p
1e790 54 61 62 6c 65 2c 20 20 20 20 20 20 2f 2a 20 54  Table,      /* T
1e7a0 61 62 6c 65 20 74 6f 20 61 70 70 65 6e 64 20 2a  able to append *
1e7b0 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 44 61 74 61  /.  Token *pData
1e7c0 62 61 73 65 20 20 20 20 2f 2a 20 44 61 74 61 62  base    /* Datab
1e7d0 61 73 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65  ase of the table
1e7e0 20 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74 20   */.){.  struct 
1e7f0 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  SrcList_item *pI
1e800 74 65 6d 3b 0a 20 20 61 73 73 65 72 74 28 20 70  tem;.  assert( p
1e810 44 61 74 61 62 61 73 65 3d 3d 30 20 7c 7c 20 70  Database==0 || p
1e820 54 61 62 6c 65 21 3d 30 20 29 3b 20 20 2f 2a 20  Table!=0 );  /* 
1e830 43 61 6e 6e 6f 74 20 68 61 76 65 20 43 20 77 69  Cannot have C wi
1e840 74 68 6f 75 74 20 42 20 2a 2f 0a 20 20 61 73 73  thout B */.  ass
1e850 65 72 74 28 20 64 62 21 3d 30 20 29 3b 0a 20 20  ert( db!=0 );.  
1e860 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a  if( pList==0 ){.
1e870 20 20 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69      pList = sqli
1e880 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e  te3DbMallocRawNN
1e890 28 64 62 2c 20 73 69 7a 65 6f 66 28 53 72 63 4c  (db, sizeof(SrcL
1e8a0 69 73 74 29 20 29 3b 0a 20 20 20 20 69 66 28 20  ist) );.    if( 
1e8b0 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72  pList==0 ) retur
1e8c0 6e 20 30 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e  n 0;.    pList->
1e8d0 6e 41 6c 6c 6f 63 20 3d 20 31 3b 0a 20 20 20 20  nAlloc = 1;.    
1e8e0 70 4c 69 73 74 2d 3e 6e 53 72 63 20 3d 20 30 3b  pList->nSrc = 0;
1e8f0 0a 20 20 7d 0a 20 20 70 4c 69 73 74 20 3d 20 73  .  }.  pList = s
1e900 71 6c 69 74 65 33 53 72 63 4c 69 73 74 45 6e 6c  qlite3SrcListEnl
1e910 61 72 67 65 28 64 62 2c 20 70 4c 69 73 74 2c 20  arge(db, pList, 
1e920 31 2c 20 70 4c 69 73 74 2d 3e 6e 53 72 63 29 3b  1, pList->nSrc);
1e930 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f  .  if( db->mallo
1e940 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 73  cFailed ){.    s
1e950 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c  qlite3SrcListDel
1e960 65 74 65 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a  ete(db, pList);.
1e970 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
1e980 7d 0a 20 20 70 49 74 65 6d 20 3d 20 26 70 4c 69  }.  pItem = &pLi
1e990 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 53 72  st->a[pList->nSr
1e9a0 63 2d 31 5d 3b 0a 20 20 69 66 28 20 70 44 61 74  c-1];.  if( pDat
1e9b0 61 62 61 73 65 20 26 26 20 70 44 61 74 61 62 61  abase && pDataba
1e9c0 73 65 2d 3e 7a 3d 3d 30 20 29 7b 0a 20 20 20 20  se->z==0 ){.    
1e9d0 70 44 61 74 61 62 61 73 65 20 3d 20 30 3b 0a 20  pDatabase = 0;. 
1e9e0 20 7d 0a 20 20 69 66 28 20 70 44 61 74 61 62 61   }.  if( pDataba
1e9f0 73 65 20 29 7b 0a 20 20 20 20 54 6f 6b 65 6e 20  se ){.    Token 
1ea00 2a 70 54 65 6d 70 20 3d 20 70 44 61 74 61 62 61  *pTemp = pDataba
1ea10 73 65 3b 0a 20 20 20 20 70 44 61 74 61 62 61 73  se;.    pDatabas
1ea20 65 20 3d 20 70 54 61 62 6c 65 3b 0a 20 20 20 20  e = pTable;.    
1ea30 70 54 61 62 6c 65 20 3d 20 70 54 65 6d 70 3b 0a  pTable = pTemp;.
1ea40 20 20 7d 0a 20 20 70 49 74 65 6d 2d 3e 7a 4e 61    }.  pItem->zNa
1ea50 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65  me = sqlite3Name
1ea60 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 54  FromToken(db, pT
1ea70 61 62 6c 65 29 3b 0a 20 20 70 49 74 65 6d 2d 3e  able);.  pItem->
1ea80 7a 44 61 74 61 62 61 73 65 20 3d 20 73 71 6c 69  zDatabase = sqli
1ea90 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e  te3NameFromToken
1eaa0 28 64 62 2c 20 70 44 61 74 61 62 61 73 65 29 3b  (db, pDatabase);
1eab0 0a 20 20 72 65 74 75 72 6e 20 70 4c 69 73 74 3b  .  return pList;
1eac0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 73 73 69 67 6e  .}../*.** Assign
1ead0 20 56 64 62 65 43 75 72 73 6f 72 20 69 6e 64 65   VdbeCursor inde
1eae0 78 20 6e 75 6d 62 65 72 73 20 74 6f 20 61 6c 6c  x numbers to all
1eaf0 20 74 61 62 6c 65 73 20 69 6e 20 61 20 53 72 63   tables in a Src
1eb00 4c 69 73 74 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  List.*/.void sql
1eb10 69 74 65 33 53 72 63 4c 69 73 74 41 73 73 69 67  ite3SrcListAssig
1eb20 6e 43 75 72 73 6f 72 73 28 50 61 72 73 65 20 2a  nCursors(Parse *
1eb30 70 50 61 72 73 65 2c 20 53 72 63 4c 69 73 74 20  pParse, SrcList 
1eb40 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 69  *pList){.  int i
1eb50 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69  ;.  struct SrcLi
1eb60 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a  st_item *pItem;.
1eb70 20 20 61 73 73 65 72 74 28 70 4c 69 73 74 20 7c    assert(pList |
1eb80 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61  | pParse->db->ma
1eb90 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20  llocFailed );.  
1eba0 69 66 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20  if( pList ){.   
1ebb0 20 66 6f 72 28 69 3d 30 2c 20 70 49 74 65 6d 3d   for(i=0, pItem=
1ebc0 70 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 4c 69 73  pList->a; i<pLis
1ebd0 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 49  t->nSrc; i++, pI
1ebe0 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  tem++){.      if
1ebf0 28 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72  ( pItem->iCursor
1ec00 3e 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  >=0 ) break;.   
1ec10 20 20 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f     pItem->iCurso
1ec20 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  r = pParse->nTab
1ec30 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49  ++;.      if( pI
1ec40 74 65 6d 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a  tem->pSelect ){.
1ec50 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53          sqlite3S
1ec60 72 63 4c 69 73 74 41 73 73 69 67 6e 43 75 72 73  rcListAssignCurs
1ec70 6f 72 73 28 70 50 61 72 73 65 2c 20 70 49 74 65  ors(pParse, pIte
1ec80 6d 2d 3e 70 53 65 6c 65 63 74 2d 3e 70 53 72 63  m->pSelect->pSrc
1ec90 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
1eca0 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65  .  }.}../*.** De
1ecb0 6c 65 74 65 20 61 6e 20 65 6e 74 69 72 65 20 53  lete an entire S
1ecc0 72 63 4c 69 73 74 20 69 6e 63 6c 75 64 69 6e 67  rcList including
1ecd0 20 61 6c 6c 20 69 74 73 20 73 75 62 73 74 72 75   all its substru
1ece0 63 74 75 72 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73  cture..*/.void s
1ecf0 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c  qlite3SrcListDel
1ed00 65 74 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  ete(sqlite3 *db,
1ed10 20 53 72 63 4c 69 73 74 20 2a 70 4c 69 73 74 29   SrcList *pList)
1ed20 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72  {.  int i;.  str
1ed30 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
1ed40 20 2a 70 49 74 65 6d 3b 0a 20 20 69 66 28 20 70   *pItem;.  if( p
1ed50 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e  List==0 ) return
1ed60 3b 0a 20 20 66 6f 72 28 70 49 74 65 6d 3d 70 4c  ;.  for(pItem=pL
1ed70 69 73 74 2d 3e 61 2c 20 69 3d 30 3b 20 69 3c 70  ist->a, i=0; i<p
1ed80 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c  List->nSrc; i++,
1ed90 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 73   pItem++){.    s
1eda0 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
1edb0 20 70 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73   pItem->zDatabas
1edc0 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  e);.    sqlite3D
1edd0 62 46 72 65 65 28 64 62 2c 20 70 49 74 65 6d 2d  bFree(db, pItem-
1ede0 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c  >zName);.    sql
1edf0 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
1ee00 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20  Item->zAlias);. 
1ee10 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 66 67     if( pItem->fg
1ee20 2e 69 73 49 6e 64 65 78 65 64 42 79 20 29 20 73  .isIndexedBy ) s
1ee30 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
1ee40 20 70 49 74 65 6d 2d 3e 75 31 2e 7a 49 6e 64 65   pItem->u1.zInde
1ee50 78 65 64 42 79 29 3b 0a 20 20 20 20 69 66 28 20  xedBy);.    if( 
1ee60 70 49 74 65 6d 2d 3e 66 67 2e 69 73 54 61 62 46  pItem->fg.isTabF
1ee70 75 6e 63 20 29 20 73 71 6c 69 74 65 33 45 78 70  unc ) sqlite3Exp
1ee80 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20  rListDelete(db, 
1ee90 70 49 74 65 6d 2d 3e 75 31 2e 70 46 75 6e 63 41  pItem->u1.pFuncA
1eea0 72 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  rg);.    sqlite3
1eeb0 44 65 6c 65 74 65 54 61 62 6c 65 28 64 62 2c 20  DeleteTable(db, 
1eec0 70 49 74 65 6d 2d 3e 70 54 61 62 29 3b 0a 20 20  pItem->pTab);.  
1eed0 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44    sqlite3SelectD
1eee0 65 6c 65 74 65 28 64 62 2c 20 70 49 74 65 6d 2d  elete(db, pItem-
1eef0 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 73  >pSelect);.    s
1ef00 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
1ef10 28 64 62 2c 20 70 49 74 65 6d 2d 3e 70 4f 6e 29  (db, pItem->pOn)
1ef20 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 49 64 4c  ;.    sqlite3IdL
1ef30 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 49  istDelete(db, pI
1ef40 74 65 6d 2d 3e 70 55 73 69 6e 67 29 3b 0a 20 20  tem->pUsing);.  
1ef50 7d 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  }.  sqlite3DbFre
1ef60 65 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a 7d 0a  e(db, pList);.}.
1ef70 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
1ef80 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 62 79  ine is called by
1ef90 20 74 68 65 20 70 61 72 73 65 72 20 74 6f 20 61   the parser to a
1efa0 64 64 20 61 20 6e 65 77 20 74 65 72 6d 20 74 6f  dd a new term to
1efb0 20 74 68 65 0a 2a 2a 20 65 6e 64 20 6f 66 20 61   the.** end of a
1efc0 20 67 72 6f 77 69 6e 67 20 46 52 4f 4d 20 63 6c   growing FROM cl
1efd0 61 75 73 65 2e 20 20 54 68 65 20 22 70 22 20 70  ause.  The "p" p
1efe0 61 72 61 6d 65 74 65 72 20 69 73 20 74 68 65 20  arameter is the 
1eff0 70 61 72 74 20 6f 66 0a 2a 2a 20 74 68 65 20 46  part of.** the F
1f000 52 4f 4d 20 63 6c 61 75 73 65 20 74 68 61 74 20  ROM clause that 
1f010 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
1f020 20 63 6f 6e 73 74 72 75 63 74 65 64 2e 20 20 22   constructed.  "
1f030 70 22 20 69 73 20 4e 55 4c 4c 0a 2a 2a 20 69 66  p" is NULL.** if
1f040 20 74 68 69 73 20 69 73 20 74 68 65 20 66 69 72   this is the fir
1f050 73 74 20 74 65 72 6d 20 6f 66 20 74 68 65 20 46  st term of the F
1f060 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20 70 54 61  ROM clause.  pTa
1f070 62 6c 65 20 61 6e 64 20 70 44 61 74 61 62 61 73  ble and pDatabas
1f080 65 0a 2a 2a 20 61 72 65 20 74 68 65 20 6e 61 6d  e.** are the nam
1f090 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 61  e of the table a
1f0a0 6e 64 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65  nd database name
1f0b0 64 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  d in the FROM cl
1f0c0 61 75 73 65 20 74 65 72 6d 2e 0a 2a 2a 20 70 44  ause term..** pD
1f0d0 61 74 61 62 61 73 65 20 69 73 20 4e 55 4c 4c 20  atabase is NULL 
1f0e0 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  if the database 
1f0f0 6e 61 6d 65 20 71 75 61 6c 69 66 69 65 72 20 69  name qualifier i
1f100 73 20 6d 69 73 73 69 6e 67 20 2d 20 74 68 65 0a  s missing - the.
1f110 2a 2a 20 75 73 75 61 6c 20 63 61 73 65 2e 20 20  ** usual case.  
1f120 49 66 20 74 68 65 20 74 65 72 6d 20 68 61 73 20  If the term has 
1f130 61 6e 20 61 6c 69 61 73 2c 20 74 68 65 6e 20 70  an alias, then p
1f140 41 6c 69 61 73 20 70 6f 69 6e 74 73 20 74 6f 20  Alias points to 
1f150 74 68 65 0a 2a 2a 20 61 6c 69 61 73 20 74 6f 6b  the.** alias tok
1f160 65 6e 2e 20 20 49 66 20 74 68 65 20 74 65 72 6d  en.  If the term
1f170 20 69 73 20 61 20 73 75 62 71 75 65 72 79 2c 20   is a subquery, 
1f180 74 68 65 6e 20 70 53 75 62 71 75 65 72 79 20 69  then pSubquery i
1f190 73 20 74 68 65 0a 2a 2a 20 53 45 4c 45 43 54 20  s the.** SELECT 
1f1a0 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20 74  statement that t
1f1b0 68 65 20 73 75 62 71 75 65 72 79 20 65 6e 63 6f  he subquery enco
1f1c0 64 65 73 2e 20 20 54 68 65 20 70 54 61 62 6c 65  des.  The pTable
1f1d0 20 61 6e 64 0a 2a 2a 20 70 44 61 74 61 62 61 73   and.** pDatabas
1f1e0 65 20 70 61 72 61 6d 65 74 65 72 73 20 61 72 65  e parameters are
1f1f0 20 4e 55 4c 4c 20 66 6f 72 20 73 75 62 71 75 65   NULL for subque
1f200 72 69 65 73 2e 20 20 54 68 65 20 70 4f 6e 20 61  ries.  The pOn a
1f210 6e 64 20 70 55 73 69 6e 67 0a 2a 2a 20 70 61 72  nd pUsing.** par
1f220 61 6d 65 74 65 72 73 20 61 72 65 20 74 68 65 20  ameters are the 
1f230 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 4f  content of the O
1f240 4e 20 61 6e 64 20 55 53 49 4e 47 20 63 6c 61 75  N and USING clau
1f250 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  ses..**.** Retur
1f260 6e 20 61 20 6e 65 77 20 53 72 63 4c 69 73 74 20  n a new SrcList 
1f270 77 68 69 63 68 20 65 6e 63 6f 64 65 73 20 69 73  which encodes is
1f280 20 74 68 65 20 46 52 4f 4d 20 77 69 74 68 20 74   the FROM with t
1f290 68 65 20 6e 65 77 0a 2a 2a 20 74 65 72 6d 20 61  he new.** term a
1f2a0 64 64 65 64 2e 0a 2a 2f 0a 53 72 63 4c 69 73 74  dded..*/.SrcList
1f2b0 20 2a 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74   *sqlite3SrcList
1f2c0 41 70 70 65 6e 64 46 72 6f 6d 54 65 72 6d 28 0a  AppendFromTerm(.
1f2d0 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
1f2e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72            /* Par
1f2f0 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
1f300 20 20 53 72 63 4c 69 73 74 20 2a 70 2c 20 20 20    SrcList *p,   
1f310 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1f320 20 6c 65 66 74 20 70 61 72 74 20 6f 66 20 74 68   left part of th
1f330 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 61 6c  e FROM clause al
1f340 72 65 61 64 79 20 73 65 65 6e 20 2a 2f 0a 20 20  ready seen */.  
1f350 54 6f 6b 65 6e 20 2a 70 54 61 62 6c 65 2c 20 20  Token *pTable,  
1f360 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
1f370 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20  of the table to 
1f380 61 64 64 20 74 6f 20 74 68 65 20 46 52 4f 4d 20  add to the FROM 
1f390 63 6c 61 75 73 65 20 2a 2f 0a 20 20 54 6f 6b 65  clause */.  Toke
1f3a0 6e 20 2a 70 44 61 74 61 62 61 73 65 2c 20 20 20  n *pDatabase,   
1f3b0 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
1f3c0 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74  he database cont
1f3d0 61 69 6e 69 6e 67 20 70 54 61 62 6c 65 20 2a 2f  aining pTable */
1f3e0 0a 20 20 54 6f 6b 65 6e 20 2a 70 41 6c 69 61 73  .  Token *pAlias
1f3f0 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ,          /* Th
1f400 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64  e right-hand sid
1f410 65 20 6f 66 20 74 68 65 20 41 53 20 73 75 62 65  e of the AS sube
1f420 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 53  xpression */.  S
1f430 65 6c 65 63 74 20 2a 70 53 75 62 71 75 65 72 79  elect *pSubquery
1f440 2c 20 20 20 20 20 20 2f 2a 20 41 20 73 75 62 71  ,      /* A subq
1f450 75 65 72 79 20 75 73 65 64 20 69 6e 20 70 6c 61  uery used in pla
1f460 63 65 20 6f 66 20 61 20 74 61 62 6c 65 20 6e 61  ce of a table na
1f470 6d 65 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4f  me */.  Expr *pO
1f480 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n,              
1f490 2f 2a 20 54 68 65 20 4f 4e 20 63 6c 61 75 73 65  /* The ON clause
1f4a0 20 6f 66 20 61 20 6a 6f 69 6e 20 2a 2f 0a 20 20   of a join */.  
1f4b0 49 64 4c 69 73 74 20 2a 70 55 73 69 6e 67 20 20  IdList *pUsing  
1f4c0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 55          /* The U
1f4d0 53 49 4e 47 20 63 6c 61 75 73 65 20 6f 66 20 61  SING clause of a
1f4e0 20 6a 6f 69 6e 20 2a 2f 0a 29 7b 0a 20 20 73 74   join */.){.  st
1f4f0 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
1f500 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 73 71 6c 69  m *pItem;.  sqli
1f510 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
1f520 2d 3e 64 62 3b 0a 20 20 69 66 28 20 21 70 20 26  ->db;.  if( !p &
1f530 26 20 28 70 4f 6e 20 7c 7c 20 70 55 73 69 6e 67  & (pOn || pUsing
1f540 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) ){.    sqlite3
1f550 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
1f560 20 22 61 20 4a 4f 49 4e 20 63 6c 61 75 73 65 20   "a JOIN clause 
1f570 69 73 20 72 65 71 75 69 72 65 64 20 62 65 66 6f  is required befo
1f580 72 65 20 25 73 22 2c 20 0a 20 20 20 20 20 20 28  re %s", .      (
1f590 70 4f 6e 20 3f 20 22 4f 4e 22 20 3a 20 22 55 53  pOn ? "ON" : "US
1f5a0 49 4e 47 22 29 0a 20 20 20 20 29 3b 0a 20 20 20  ING").    );.   
1f5b0 20 67 6f 74 6f 20 61 70 70 65 6e 64 5f 66 72 6f   goto append_fro
1f5c0 6d 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 70  m_error;.  }.  p
1f5d0 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73   = sqlite3SrcLis
1f5e0 74 41 70 70 65 6e 64 28 64 62 2c 20 70 2c 20 70  tAppend(db, p, p
1f5f0 54 61 62 6c 65 2c 20 70 44 61 74 61 62 61 73 65  Table, pDatabase
1f600 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c  );.  if( p==0 ||
1f610 20 4e 45 56 45 52 28 70 2d 3e 6e 53 72 63 3d 3d   NEVER(p->nSrc==
1f620 30 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 61  0) ){.    goto a
1f630 70 70 65 6e 64 5f 66 72 6f 6d 5f 65 72 72 6f 72  ppend_from_error
1f640 3b 0a 20 20 7d 0a 20 20 70 49 74 65 6d 20 3d 20  ;.  }.  pItem = 
1f650 26 70 2d 3e 61 5b 70 2d 3e 6e 53 72 63 2d 31 5d  &p->a[p->nSrc-1]
1f660 3b 0a 20 20 61 73 73 65 72 74 28 20 70 41 6c 69  ;.  assert( pAli
1f670 61 73 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  as!=0 );.  if( p
1f680 41 6c 69 61 73 2d 3e 6e 20 29 7b 0a 20 20 20 20  Alias->n ){.    
1f690 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 3d 20  pItem->zAlias = 
1f6a0 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54  sqlite3NameFromT
1f6b0 6f 6b 65 6e 28 64 62 2c 20 70 41 6c 69 61 73 29  oken(db, pAlias)
1f6c0 3b 0a 20 20 7d 0a 20 20 70 49 74 65 6d 2d 3e 70  ;.  }.  pItem->p
1f6d0 53 65 6c 65 63 74 20 3d 20 70 53 75 62 71 75 65  Select = pSubque
1f6e0 72 79 3b 0a 20 20 70 49 74 65 6d 2d 3e 70 4f 6e  ry;.  pItem->pOn
1f6f0 20 3d 20 70 4f 6e 3b 0a 20 20 70 49 74 65 6d 2d   = pOn;.  pItem-
1f700 3e 70 55 73 69 6e 67 20 3d 20 70 55 73 69 6e 67  >pUsing = pUsing
1f710 3b 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 0a 20  ;.  return p;.. 
1f720 61 70 70 65 6e 64 5f 66 72 6f 6d 5f 65 72 72 6f  append_from_erro
1f730 72 3a 0a 20 20 61 73 73 65 72 74 28 20 70 3d 3d  r:.  assert( p==
1f740 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78  0 );.  sqlite3Ex
1f750 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 4f 6e  prDelete(db, pOn
1f760 29 3b 0a 20 20 73 71 6c 69 74 65 33 49 64 4c 69  );.  sqlite3IdLi
1f770 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 55 73  stDelete(db, pUs
1f780 69 6e 67 29 3b 0a 20 20 73 71 6c 69 74 65 33 53  ing);.  sqlite3S
1f790 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20  electDelete(db, 
1f7a0 70 53 75 62 71 75 65 72 79 29 3b 0a 20 20 72 65  pSubquery);.  re
1f7b0 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
1f7c0 20 41 64 64 20 61 6e 20 49 4e 44 45 58 45 44 20   Add an INDEXED 
1f7d0 42 59 20 6f 72 20 4e 4f 54 20 49 4e 44 45 58 45  BY or NOT INDEXE
1f7e0 44 20 63 6c 61 75 73 65 20 74 6f 20 74 68 65 20  D clause to the 
1f7f0 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 61 64  most recently ad
1f800 64 65 64 20 0a 2a 2a 20 65 6c 65 6d 65 6e 74 20  ded .** element 
1f810 6f 66 20 74 68 65 20 73 6f 75 72 63 65 2d 6c 69  of the source-li
1f820 73 74 20 70 61 73 73 65 64 20 61 73 20 74 68 65  st passed as the
1f830 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
1f840 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
1f850 33 53 72 63 4c 69 73 74 49 6e 64 65 78 65 64 42  3SrcListIndexedB
1f860 79 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  y(Parse *pParse,
1f870 20 53 72 63 4c 69 73 74 20 2a 70 2c 20 54 6f 6b   SrcList *p, Tok
1f880 65 6e 20 2a 70 49 6e 64 65 78 65 64 42 79 29 7b  en *pIndexedBy){
1f890 0a 20 20 61 73 73 65 72 74 28 20 70 49 6e 64 65  .  assert( pInde
1f8a0 78 65 64 42 79 21 3d 30 20 29 3b 0a 20 20 69 66  xedBy!=0 );.  if
1f8b0 28 20 70 20 26 26 20 41 4c 57 41 59 53 28 70 2d  ( p && ALWAYS(p-
1f8c0 3e 6e 53 72 63 3e 30 29 20 29 7b 0a 20 20 20 20  >nSrc>0) ){.    
1f8d0 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
1f8e0 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70 2d  tem *pItem = &p-
1f8f0 3e 61 5b 70 2d 3e 6e 53 72 63 2d 31 5d 3b 0a 20  >a[p->nSrc-1];. 
1f900 20 20 20 61 73 73 65 72 74 28 20 70 49 74 65 6d     assert( pItem
1f910 2d 3e 66 67 2e 6e 6f 74 49 6e 64 65 78 65 64 3d  ->fg.notIndexed=
1f920 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
1f930 28 20 70 49 74 65 6d 2d 3e 66 67 2e 69 73 49 6e  ( pItem->fg.isIn
1f940 64 65 78 65 64 42 79 3d 3d 30 20 29 3b 0a 20 20  dexedBy==0 );.  
1f950 20 20 61 73 73 65 72 74 28 20 70 49 74 65 6d 2d    assert( pItem-
1f960 3e 66 67 2e 69 73 54 61 62 46 75 6e 63 3d 3d 30  >fg.isTabFunc==0
1f970 20 29 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 64   );.    if( pInd
1f980 65 78 65 64 42 79 2d 3e 6e 3d 3d 31 20 26 26 20  exedBy->n==1 && 
1f990 21 70 49 6e 64 65 78 65 64 42 79 2d 3e 7a 20 29  !pIndexedBy->z )
1f9a0 7b 0a 20 20 20 20 20 20 2f 2a 20 41 20 22 4e 4f  {.      /* A "NO
1f9b0 54 20 49 4e 44 45 58 45 44 22 20 63 6c 61 75 73  T INDEXED" claus
1f9c0 65 20 77 61 73 20 73 75 70 70 6c 69 65 64 2e 20  e was supplied. 
1f9d0 53 65 65 20 70 61 72 73 65 2e 79 20 0a 20 20 20  See parse.y .   
1f9e0 20 20 20 2a 2a 20 63 6f 6e 73 74 72 75 63 74 20     ** construct 
1f9f0 22 69 6e 64 65 78 65 64 5f 6f 70 74 22 20 66 6f  "indexed_opt" fo
1fa00 72 20 64 65 74 61 69 6c 73 2e 20 2a 2f 0a 20 20  r details. */.  
1fa10 20 20 20 20 70 49 74 65 6d 2d 3e 66 67 2e 6e 6f      pItem->fg.no
1fa20 74 49 6e 64 65 78 65 64 20 3d 20 31 3b 0a 20 20  tIndexed = 1;.  
1fa30 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
1fa40 49 74 65 6d 2d 3e 75 31 2e 7a 49 6e 64 65 78 65  Item->u1.zIndexe
1fa50 64 42 79 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d  dBy = sqlite3Nam
1fa60 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 50 61 72 73  eFromToken(pPars
1fa70 65 2d 3e 64 62 2c 20 70 49 6e 64 65 78 65 64 42  e->db, pIndexedB
1fa80 79 29 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d  y);.      pItem-
1fa90 3e 66 67 2e 69 73 49 6e 64 65 78 65 64 42 79 20  >fg.isIndexedBy 
1faa0 3d 20 28 70 49 74 65 6d 2d 3e 75 31 2e 7a 49 6e  = (pItem->u1.zIn
1fab0 64 65 78 65 64 42 79 21 3d 30 29 3b 0a 20 20 20  dexedBy!=0);.   
1fac0 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
1fad0 41 64 64 20 74 68 65 20 6c 69 73 74 20 6f 66 20  Add the list of 
1fae0 66 75 6e 63 74 69 6f 6e 20 61 72 67 75 6d 65 6e  function argumen
1faf0 74 73 20 74 6f 20 74 68 65 20 53 72 63 4c 69 73  ts to the SrcLis
1fb00 74 20 65 6e 74 72 79 20 66 6f 72 20 61 0a 2a 2a  t entry for a.**
1fb10 20 74 61 62 6c 65 2d 76 61 6c 75 65 64 2d 66 75   table-valued-fu
1fb20 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20  nction..*/.void 
1fb30 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 46 75  sqlite3SrcListFu
1fb40 6e 63 41 72 67 73 28 50 61 72 73 65 20 2a 70 50  ncArgs(Parse *pP
1fb50 61 72 73 65 2c 20 53 72 63 4c 69 73 74 20 2a 70  arse, SrcList *p
1fb60 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73  , ExprList *pLis
1fb70 74 29 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20  t){.  if( p ){. 
1fb80 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73     struct SrcLis
1fb90 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20  t_item *pItem = 
1fba0 26 70 2d 3e 61 5b 70 2d 3e 6e 53 72 63 2d 31 5d  &p->a[p->nSrc-1]
1fbb0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49  ;.    assert( pI
1fbc0 74 65 6d 2d 3e 66 67 2e 6e 6f 74 49 6e 64 65 78  tem->fg.notIndex
1fbd0 65 64 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73  ed==0 );.    ass
1fbe0 65 72 74 28 20 70 49 74 65 6d 2d 3e 66 67 2e 69  ert( pItem->fg.i
1fbf0 73 49 6e 64 65 78 65 64 42 79 3d 3d 30 20 29 3b  sIndexedBy==0 );
1fc00 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49 74  .    assert( pIt
1fc10 65 6d 2d 3e 66 67 2e 69 73 54 61 62 46 75 6e 63  em->fg.isTabFunc
1fc20 3d 3d 30 20 29 3b 0a 20 20 20 20 70 49 74 65 6d  ==0 );.    pItem
1fc30 2d 3e 75 31 2e 70 46 75 6e 63 41 72 67 20 3d 20  ->u1.pFuncArg = 
1fc40 70 4c 69 73 74 3b 0a 20 20 20 20 70 49 74 65 6d  pList;.    pItem
1fc50 2d 3e 66 67 2e 69 73 54 61 62 46 75 6e 63 20 3d  ->fg.isTabFunc =
1fc60 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   1;.  }else{.   
1fc70 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
1fc80 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64  Delete(pParse->d
1fc90 62 2c 20 70 4c 69 73 74 29 3b 0a 20 20 7d 0a 7d  b, pList);.  }.}
1fca0 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 62 75 69  ../*.** When bui
1fcb0 6c 64 69 6e 67 20 75 70 20 61 20 46 52 4f 4d 20  lding up a FROM 
1fcc0 63 6c 61 75 73 65 20 69 6e 20 74 68 65 20 70 61  clause in the pa
1fcd0 72 73 65 72 2c 20 74 68 65 20 6a 6f 69 6e 20 6f  rser, the join o
1fce0 70 65 72 61 74 6f 72 0a 2a 2a 20 69 73 20 69 6e  perator.** is in
1fcf0 69 74 69 61 6c 6c 79 20 61 74 74 61 63 68 65 64  itially attached
1fd00 20 74 6f 20 74 68 65 20 6c 65 66 74 20 6f 70 65   to the left ope
1fd10 72 61 6e 64 2e 20 20 42 75 74 20 74 68 65 20 63  rand.  But the c
1fd20 6f 64 65 20 67 65 6e 65 72 61 74 6f 72 0a 2a 2a  ode generator.**
1fd30 20 65 78 70 65 63 74 73 20 74 68 65 20 6a 6f 69   expects the joi
1fd40 6e 20 6f 70 65 72 61 74 6f 72 20 74 6f 20 62 65  n operator to be
1fd50 20 6f 6e 20 74 68 65 20 72 69 67 68 74 20 6f 70   on the right op
1fd60 65 72 61 6e 64 2e 20 20 54 68 69 73 20 72 6f 75  erand.  This rou
1fd70 74 69 6e 65 0a 2a 2a 20 53 68 69 66 74 73 20 61  tine.** Shifts a
1fd80 6c 6c 20 6a 6f 69 6e 20 6f 70 65 72 61 74 6f 72  ll join operator
1fd90 73 20 66 72 6f 6d 20 6c 65 66 74 20 74 6f 20 72  s from left to r
1fda0 69 67 68 74 20 66 6f 72 20 61 6e 20 65 6e 74 69  ight for an enti
1fdb0 72 65 20 46 52 4f 4d 0a 2a 2a 20 63 6c 61 75 73  re FROM.** claus
1fdc0 65 2e 0a 2a 2a 0a 2a 2a 20 45 78 61 6d 70 6c 65  e..**.** Example
1fdd0 3a 20 53 75 70 70 6f 73 65 20 74 68 65 20 6a 6f  : Suppose the jo
1fde0 69 6e 20 69 73 20 6c 69 6b 65 20 74 68 69 73 3a  in is like this:
1fdf0 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  .**.**          
1fe00 20 41 20 6e 61 74 75 72 61 6c 20 63 72 6f 73 73   A natural cross
1fe10 20 6a 6f 69 6e 20 42 0a 2a 2a 0a 2a 2a 20 54 68   join B.**.** Th
1fe20 65 20 6f 70 65 72 61 74 6f 72 20 69 73 20 22 6e  e operator is "n
1fe30 61 74 75 72 61 6c 20 63 72 6f 73 73 20 6a 6f 69  atural cross joi
1fe40 6e 22 2e 20 20 54 68 65 20 41 20 61 6e 64 20 42  n".  The A and B
1fe50 20 6f 70 65 72 61 6e 64 73 20 61 72 65 20 73 74   operands are st
1fe60 6f 72 65 64 0a 2a 2a 20 69 6e 20 70 2d 3e 61 5b  ored.** in p->a[
1fe70 30 5d 20 61 6e 64 20 70 2d 3e 61 5b 31 5d 2c 20  0] and p->a[1], 
1fe80 72 65 73 70 65 63 74 69 76 65 6c 79 2e 20 20 54  respectively.  T
1fe90 68 65 20 70 61 72 73 65 72 20 69 6e 69 74 69 61  he parser initia
1fea0 6c 6c 79 20 73 74 6f 72 65 73 20 74 68 65 0a 2a  lly stores the.*
1feb0 2a 20 6f 70 65 72 61 74 6f 72 20 77 69 74 68 20  * operator with 
1fec0 41 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  A.  This routine
1fed0 20 73 68 69 66 74 73 20 74 68 61 74 20 6f 70 65   shifts that ope
1fee0 72 61 74 6f 72 20 6f 76 65 72 20 74 6f 20 42 2e  rator over to B.
1fef0 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
1ff00 53 72 63 4c 69 73 74 53 68 69 66 74 4a 6f 69 6e  SrcListShiftJoin
1ff10 54 79 70 65 28 53 72 63 4c 69 73 74 20 2a 70 29  Type(SrcList *p)
1ff20 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20  {.  if( p ){.   
1ff30 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28   int i;.    for(
1ff40 69 3d 70 2d 3e 6e 53 72 63 2d 31 3b 20 69 3e 30  i=p->nSrc-1; i>0
1ff50 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 20 20 70 2d  ; i--){.      p-
1ff60 3e 61 5b 69 5d 2e 66 67 2e 6a 6f 69 6e 74 79 70  >a[i].fg.jointyp
1ff70 65 20 3d 20 70 2d 3e 61 5b 69 2d 31 5d 2e 66 67  e = p->a[i-1].fg
1ff80 2e 6a 6f 69 6e 74 79 70 65 3b 0a 20 20 20 20 7d  .jointype;.    }
1ff90 0a 20 20 20 20 70 2d 3e 61 5b 30 5d 2e 66 67 2e  .    p->a[0].fg.
1ffa0 6a 6f 69 6e 74 79 70 65 20 3d 20 30 3b 0a 20 20  jointype = 0;.  
1ffb0 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  }.}../*.** Gener
1ffc0 61 74 65 20 56 44 42 45 20 63 6f 64 65 20 66 6f  ate VDBE code fo
1ffd0 72 20 61 20 42 45 47 49 4e 20 73 74 61 74 65 6d  r a BEGIN statem
1ffe0 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ent..*/.void sql
1fff0 69 74 65 33 42 65 67 69 6e 54 72 61 6e 73 61 63  ite3BeginTransac
20000 74 69 6f 6e 28 50 61 72 73 65 20 2a 70 50 61 72  tion(Parse *pPar
20010 73 65 2c 20 69 6e 74 20 74 79 70 65 29 7b 0a 20  se, int type){. 
20020 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
20030 56 64 62 65 20 2a 76 3b 0a 20 20 69 6e 74 20 69  Vdbe *v;.  int i
20040 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  ;..  assert( pPa
20050 72 73 65 21 3d 30 20 29 3b 0a 20 20 64 62 20 3d  rse!=0 );.  db =
20060 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 61   pParse->db;.  a
20070 73 73 65 72 74 28 20 64 62 21 3d 30 20 29 3b 0a  ssert( db!=0 );.
20080 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74    if( sqlite3Aut
20090 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53  hCheck(pParse, S
200a0 51 4c 49 54 45 5f 54 52 41 4e 53 41 43 54 49 4f  QLITE_TRANSACTIO
200b0 4e 2c 20 22 42 45 47 49 4e 22 2c 20 30 2c 20 30  N, "BEGIN", 0, 0
200c0 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b  ) ){.    return;
200d0 0a 20 20 7d 0a 20 20 76 20 3d 20 73 71 6c 69 74  .  }.  v = sqlit
200e0 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
200f0 29 3b 0a 20 20 69 66 28 20 21 76 20 29 20 72 65  );.  if( !v ) re
20100 74 75 72 6e 3b 0a 20 20 69 66 28 20 74 79 70 65  turn;.  if( type
20110 21 3d 54 4b 5f 44 45 46 45 52 52 45 44 20 29 7b  !=TK_DEFERRED ){
20120 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
20130 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20  db->nDb; i++){. 
20140 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
20150 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 54 72 61  AddOp2(v, OP_Tra
20160 6e 73 61 63 74 69 6f 6e 2c 20 69 2c 20 28 74 79  nsaction, i, (ty
20170 70 65 3d 3d 54 4b 5f 45 58 43 4c 55 53 49 56 45  pe==TK_EXCLUSIVE
20180 29 2b 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  )+1);.      sqli
20190 74 65 33 56 64 62 65 55 73 65 73 42 74 72 65 65  te3VdbeUsesBtree
201a0 28 76 2c 20 69 29 3b 0a 20 20 20 20 7d 0a 20 20  (v, i);.    }.  
201b0 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  }.  sqlite3VdbeA
201c0 64 64 4f 70 30 28 76 2c 20 4f 50 5f 41 75 74 6f  ddOp0(v, OP_Auto
201d0 43 6f 6d 6d 69 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  Commit);.}../*.*
201e0 2a 20 47 65 6e 65 72 61 74 65 20 56 44 42 45 20  * Generate VDBE 
201f0 63 6f 64 65 20 66 6f 72 20 61 20 43 4f 4d 4d 49  code for a COMMI
20200 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a  T statement..*/.
20210 76 6f 69 64 20 73 71 6c 69 74 65 33 43 6f 6d 6d  void sqlite3Comm
20220 69 74 54 72 61 6e 73 61 63 74 69 6f 6e 28 50 61  itTransaction(Pa
20230 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20  rse *pParse){.  
20240 56 64 62 65 20 2a 76 3b 0a 0a 20 20 61 73 73 65  Vdbe *v;..  asse
20250 72 74 28 20 70 50 61 72 73 65 21 3d 30 20 29 3b  rt( pParse!=0 );
20260 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73  .  assert( pPars
20270 65 2d 3e 64 62 21 3d 30 20 29 3b 0a 20 20 69 66  e->db!=0 );.  if
20280 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65  ( sqlite3AuthChe
20290 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54  ck(pParse, SQLIT
202a0 45 5f 54 52 41 4e 53 41 43 54 49 4f 4e 2c 20 22  E_TRANSACTION, "
202b0 43 4f 4d 4d 49 54 22 2c 20 30 2c 20 30 29 20 29  COMMIT", 0, 0) )
202c0 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  {.    return;.  
202d0 7d 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47  }.  v = sqlite3G
202e0 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
202f0 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20 73    if( v ){.    s
20300 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
20310 28 76 2c 20 4f 50 5f 41 75 74 6f 43 6f 6d 6d 69  (v, OP_AutoCommi
20320 74 2c 20 31 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  t, 1);.  }.}../*
20330 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 56 44 42  .** Generate VDB
20340 45 20 63 6f 64 65 20 66 6f 72 20 61 20 52 4f 4c  E code for a ROL
20350 4c 42 41 43 4b 20 73 74 61 74 65 6d 65 6e 74 2e  LBACK statement.
20360 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
20370 52 6f 6c 6c 62 61 63 6b 54 72 61 6e 73 61 63 74  RollbackTransact
20380 69 6f 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73  ion(Parse *pPars
20390 65 29 7b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 0a  e){.  Vdbe *v;..
203a0 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65    assert( pParse
203b0 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
203c0 20 70 50 61 72 73 65 2d 3e 64 62 21 3d 30 20 29   pParse->db!=0 )
203d0 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 41  ;.  if( sqlite3A
203e0 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c  uthCheck(pParse,
203f0 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 41 43 54   SQLITE_TRANSACT
20400 49 4f 4e 2c 20 22 52 4f 4c 4c 42 41 43 4b 22 2c  ION, "ROLLBACK",
20410 20 30 2c 20 30 29 20 29 7b 0a 20 20 20 20 72 65   0, 0) ){.    re
20420 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 76 20 3d 20  turn;.  }.  v = 
20430 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
20440 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76 20  Parse);.  if( v 
20450 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
20460 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41  beAddOp2(v, OP_A
20470 75 74 6f 43 6f 6d 6d 69 74 2c 20 31 2c 20 31 29  utoCommit, 1, 1)
20480 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ;.  }.}../*.** T
20490 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
204a0 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20 70 61  called by the pa
204b0 72 73 65 72 20 77 68 65 6e 20 69 74 20 70 61 72  rser when it par
204c0 73 65 73 20 61 20 63 6f 6d 6d 61 6e 64 20 74 6f  ses a command to
204d0 20 63 72 65 61 74 65 2c 0a 2a 2a 20 72 65 6c 65   create,.** rele
204e0 61 73 65 20 6f 72 20 72 6f 6c 6c 62 61 63 6b 20  ase or rollback 
204f0 61 6e 20 53 51 4c 20 73 61 76 65 70 6f 69 6e 74  an SQL savepoint
20500 2e 20 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  . .*/.void sqlit
20510 65 33 53 61 76 65 70 6f 69 6e 74 28 50 61 72 73  e3Savepoint(Pars
20520 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 6f  e *pParse, int o
20530 70 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 29  p, Token *pName)
20540 7b 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20  {.  char *zName 
20550 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f  = sqlite3NameFro
20560 6d 54 6f 6b 65 6e 28 70 50 61 72 73 65 2d 3e 64  mToken(pParse->d
20570 62 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28  b, pName);.  if(
20580 20 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 56 64   zName ){.    Vd
20590 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47  be *v = sqlite3G
205a0 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
205b0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
205c0 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f  MIT_AUTHORIZATIO
205d0 4e 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e  N.    static con
205e0 73 74 20 63 68 61 72 20 2a 20 63 6f 6e 73 74 20  st char * const 
205f0 61 7a 5b 5d 20 3d 20 7b 20 22 42 45 47 49 4e 22  az[] = { "BEGIN"
20600 2c 20 22 52 45 4c 45 41 53 45 22 2c 20 22 52 4f  , "RELEASE", "RO
20610 4c 4c 42 41 43 4b 22 20 7d 3b 0a 20 20 20 20 61  LLBACK" };.    a
20620 73 73 65 72 74 28 20 21 53 41 56 45 50 4f 49 4e  ssert( !SAVEPOIN
20630 54 5f 42 45 47 49 4e 20 26 26 20 53 41 56 45 50  T_BEGIN && SAVEP
20640 4f 49 4e 54 5f 52 45 4c 45 41 53 45 3d 3d 31 20  OINT_RELEASE==1 
20650 26 26 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c  && SAVEPOINT_ROL
20660 4c 42 41 43 4b 3d 3d 32 20 29 3b 0a 23 65 6e 64  LBACK==2 );.#end
20670 69 66 0a 20 20 20 20 69 66 28 20 21 76 20 7c 7c  if.    if( !v ||
20680 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63   sqlite3AuthChec
20690 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45  k(pParse, SQLITE
206a0 5f 53 41 56 45 50 4f 49 4e 54 2c 20 61 7a 5b 6f  _SAVEPOINT, az[o
206b0 70 5d 2c 20 7a 4e 61 6d 65 2c 20 30 29 20 29 7b  p], zName, 0) ){
206c0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62  .      sqlite3Db
206d0 46 72 65 65 28 70 50 61 72 73 65 2d 3e 64 62 2c  Free(pParse->db,
206e0 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 72   zName);.      r
206f0 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20  eturn;.    }.   
20700 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
20710 70 34 28 76 2c 20 4f 50 5f 53 61 76 65 70 6f 69  p4(v, OP_Savepoi
20720 6e 74 2c 20 6f 70 2c 20 30 2c 20 30 2c 20 7a 4e  nt, op, 0, 0, zN
20730 61 6d 65 2c 20 50 34 5f 44 59 4e 41 4d 49 43 29  ame, P4_DYNAMIC)
20740 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d  ;.  }.}../*.** M
20750 61 6b 65 20 73 75 72 65 20 74 68 65 20 54 45 4d  ake sure the TEM
20760 50 20 64 61 74 61 62 61 73 65 20 69 73 20 6f 70  P database is op
20770 65 6e 20 61 6e 64 20 61 76 61 69 6c 61 62 6c 65  en and available
20780 20 66 6f 72 20 75 73 65 2e 20 20 52 65 74 75 72   for use.  Retur
20790 6e 0a 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72 20  n.** the number 
207a0 6f 66 20 65 72 72 6f 72 73 2e 20 20 4c 65 61 76  of errors.  Leav
207b0 65 20 61 6e 79 20 65 72 72 6f 72 20 6d 65 73 73  e any error mess
207c0 61 67 65 73 20 69 6e 20 74 68 65 20 70 50 61 72  ages in the pPar
207d0 73 65 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f  se structure..*/
207e0 0a 69 6e 74 20 73 71 6c 69 74 65 33 4f 70 65 6e  .int sqlite3Open
207f0 54 65 6d 70 44 61 74 61 62 61 73 65 28 50 61 72  TempDatabase(Par
20800 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 73  se *pParse){.  s
20810 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
20820 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20 64  rse->db;.  if( d
20830 62 2d 3e 61 44 62 5b 31 5d 2e 70 42 74 3d 3d 30  b->aDb[1].pBt==0
20840 20 26 26 20 21 70 50 61 72 73 65 2d 3e 65 78 70   && !pParse->exp
20850 6c 61 69 6e 20 29 7b 0a 20 20 20 20 69 6e 74 20  lain ){.    int 
20860 72 63 3b 0a 20 20 20 20 42 74 72 65 65 20 2a 70  rc;.    Btree *p
20870 42 74 3b 0a 20 20 20 20 73 74 61 74 69 63 20 63  Bt;.    static c
20880 6f 6e 73 74 20 69 6e 74 20 66 6c 61 67 73 20 3d  onst int flags =
20890 20 0a 20 20 20 20 20 20 20 20 20 20 53 51 4c 49   .          SQLI
208a0 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54  TE_OPEN_READWRIT
208b0 45 20 7c 0a 20 20 20 20 20 20 20 20 20 20 53 51  E |.          SQ
208c0 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45  LITE_OPEN_CREATE
208d0 20 7c 0a 20 20 20 20 20 20 20 20 20 20 53 51 4c   |.          SQL
208e0 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49  ITE_OPEN_EXCLUSI
208f0 56 45 20 7c 0a 20 20 20 20 20 20 20 20 20 20 53  VE |.          S
20900 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54  QLITE_OPEN_DELET
20910 45 4f 4e 43 4c 4f 53 45 20 7c 0a 20 20 20 20 20  EONCLOSE |.     
20920 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e       SQLITE_OPEN
20930 5f 54 45 4d 50 5f 44 42 3b 0a 0a 20 20 20 20 72  _TEMP_DB;..    r
20940 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
20950 4f 70 65 6e 28 64 62 2d 3e 70 56 66 73 2c 20 30  Open(db->pVfs, 0
20960 2c 20 64 62 2c 20 26 70 42 74 2c 20 30 2c 20 66  , db, &pBt, 0, f
20970 6c 61 67 73 29 3b 0a 20 20 20 20 69 66 28 20 72  lags);.    if( r
20980 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
20990 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
209a0 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 75  orMsg(pParse, "u
209b0 6e 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 61 20  nable to open a 
209c0 74 65 6d 70 6f 72 61 72 79 20 64 61 74 61 62 61  temporary databa
209d0 73 65 20 22 0a 20 20 20 20 20 20 20 20 22 66 69  se ".        "fi
209e0 6c 65 20 66 6f 72 20 73 74 6f 72 69 6e 67 20 74  le for storing t
209f0 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 73 22  emporary tables"
20a00 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d  );.      pParse-
20a10 3e 72 63 20 3d 20 72 63 3b 0a 20 20 20 20 20 20  >rc = rc;.      
20a20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a  return 1;.    }.
20a30 20 20 20 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 70      db->aDb[1].p
20a40 42 74 20 3d 20 70 42 74 3b 0a 20 20 20 20 61 73  Bt = pBt;.    as
20a50 73 65 72 74 28 20 64 62 2d 3e 61 44 62 5b 31 5d  sert( db->aDb[1]
20a60 2e 70 53 63 68 65 6d 61 20 29 3b 0a 20 20 20 20  .pSchema );.    
20a70 69 66 28 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  if( SQLITE_NOMEM
20a80 3d 3d 73 71 6c 69 74 65 33 42 74 72 65 65 53 65  ==sqlite3BtreeSe
20a90 74 50 61 67 65 53 69 7a 65 28 70 42 74 2c 20 64  tPageSize(pBt, d
20aa0 62 2d 3e 6e 65 78 74 50 61 67 65 73 69 7a 65 2c  b->nextPagesize,
20ab0 20 2d 31 2c 20 30 29 20 29 7b 0a 20 20 20 20 20   -1, 0) ){.     
20ac0 20 73 71 6c 69 74 65 33 4f 6f 6d 46 61 75 6c 74   sqlite3OomFault
20ad0 28 64 62 29 3b 0a 20 20 20 20 20 20 72 65 74 75  (db);.      retu
20ae0 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rn 1;.    }.  }.
20af0 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
20b00 2a 0a 2a 2a 20 52 65 63 6f 72 64 20 74 68 65 20  *.** Record the 
20b10 66 61 63 74 20 74 68 61 74 20 74 68 65 20 73 63  fact that the sc
20b20 68 65 6d 61 20 63 6f 6f 6b 69 65 20 77 69 6c 6c  hema cookie will
20b30 20 6e 65 65 64 20 74 6f 20 62 65 20 76 65 72 69   need to be veri
20b40 66 69 65 64 0a 2a 2a 20 66 6f 72 20 64 61 74 61  fied.** for data
20b50 62 61 73 65 20 69 44 62 2e 20 20 54 68 65 20 63  base iDb.  The c
20b60 6f 64 65 20 74 6f 20 61 63 74 75 61 6c 6c 79 20  ode to actually 
20b70 76 65 72 69 66 79 20 74 68 65 20 73 63 68 65 6d  verify the schem
20b80 61 20 63 6f 6f 6b 69 65 0a 2a 2a 20 77 69 6c 6c  a cookie.** will
20b90 20 6f 63 63 75 72 20 61 74 20 74 68 65 20 65 6e   occur at the en
20ba0 64 20 6f 66 20 74 68 65 20 74 6f 70 2d 6c 65 76  d of the top-lev
20bb0 65 6c 20 56 44 42 45 20 61 6e 64 20 77 69 6c 6c  el VDBE and will
20bc0 20 62 65 20 67 65 6e 65 72 61 74 65 64 0a 2a 2a   be generated.**
20bd0 20 6c 61 74 65 72 2c 20 62 79 20 73 71 6c 69 74   later, by sqlit
20be0 65 33 46 69 6e 69 73 68 43 6f 64 69 6e 67 28 29  e3FinishCoding()
20bf0 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
20c00 33 43 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d  3CodeVerifySchem
20c10 61 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  a(Parse *pParse,
20c20 20 69 6e 74 20 69 44 62 29 7b 0a 20 20 50 61 72   int iDb){.  Par
20c30 73 65 20 2a 70 54 6f 70 6c 65 76 65 6c 20 3d 20  se *pToplevel = 
20c40 73 71 6c 69 74 65 33 50 61 72 73 65 54 6f 70 6c  sqlite3ParseTopl
20c50 65 76 65 6c 28 70 50 61 72 73 65 29 3b 0a 20 20  evel(pParse);.  
20c60 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 54  sqlite3 *db = pT
20c70 6f 70 6c 65 76 65 6c 2d 3e 64 62 3b 0a 0a 20 20  oplevel->db;..  
20c80 61 73 73 65 72 74 28 20 69 44 62 3e 3d 30 20 26  assert( iDb>=0 &
20c90 26 20 69 44 62 3c 64 62 2d 3e 6e 44 62 20 29 3b  & iDb<db->nDb );
20ca0 0a 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 61  .  assert( db->a
20cb0 44 62 5b 69 44 62 5d 2e 70 42 74 21 3d 30 20 7c  Db[iDb].pBt!=0 |
20cc0 7c 20 69 44 62 3d 3d 31 20 29 3b 0a 20 20 61 73  | iDb==1 );.  as
20cd0 73 65 72 74 28 20 69 44 62 3c 53 51 4c 49 54 45  sert( iDb<SQLITE
20ce0 5f 4d 41 58 5f 41 54 54 41 43 48 45 44 2b 32 20  _MAX_ATTACHED+2 
20cf0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
20d00 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48  ite3SchemaMutexH
20d10 65 6c 64 28 64 62 2c 20 69 44 62 2c 20 30 29 20  eld(db, iDb, 0) 
20d20 29 3b 0a 20 20 69 66 28 20 44 62 4d 61 73 6b 54  );.  if( DbMaskT
20d30 65 73 74 28 70 54 6f 70 6c 65 76 65 6c 2d 3e 63  est(pToplevel->c
20d40 6f 6f 6b 69 65 4d 61 73 6b 2c 20 69 44 62 29 3d  ookieMask, iDb)=
20d50 3d 30 20 29 7b 0a 20 20 20 20 44 62 4d 61 73 6b  =0 ){.    DbMask
20d60 53 65 74 28 70 54 6f 70 6c 65 76 65 6c 2d 3e 63  Set(pToplevel->c
20d70 6f 6f 6b 69 65 4d 61 73 6b 2c 20 69 44 62 29 3b  ookieMask, iDb);
20d80 0a 20 20 20 20 70 54 6f 70 6c 65 76 65 6c 2d 3e  .    pToplevel->
20d90 63 6f 6f 6b 69 65 56 61 6c 75 65 5b 69 44 62 5d  cookieValue[iDb]
20da0 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e   = db->aDb[iDb].
20db0 70 53 63 68 65 6d 61 2d 3e 73 63 68 65 6d 61 5f  pSchema->schema_
20dc0 63 6f 6f 6b 69 65 3b 0a 20 20 20 20 69 66 28 20  cookie;.    if( 
20dd0 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26 26 20  !OMIT_TEMPDB && 
20de0 69 44 62 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20  iDb==1 ){.      
20df0 73 71 6c 69 74 65 33 4f 70 65 6e 54 65 6d 70 44  sqlite3OpenTempD
20e00 61 74 61 62 61 73 65 28 70 54 6f 70 6c 65 76 65  atabase(pTopleve
20e10 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  l);.    }.  }.}.
20e20 0a 2f 2a 0a 2a 2a 20 49 66 20 61 72 67 75 6d 65  ./*.** If argume
20e30 6e 74 20 7a 44 62 20 69 73 20 4e 55 4c 4c 2c 20  nt zDb is NULL, 
20e40 74 68 65 6e 20 63 61 6c 6c 20 73 71 6c 69 74 65  then call sqlite
20e50 33 43 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d  3CodeVerifySchem
20e60 61 28 29 20 66 6f 72 20 65 61 63 68 20 0a 2a 2a  a() for each .**
20e70 20 61 74 74 61 63 68 65 64 20 64 61 74 61 62 61   attached databa
20e80 73 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69  se. Otherwise, i
20e90 6e 76 6f 6b 65 20 69 74 20 66 6f 72 20 74 68 65  nvoke it for the
20ea0 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 64 20   database named 
20eb0 7a 44 62 20 6f 6e 6c 79 2e 0a 2a 2f 0a 76 6f 69  zDb only..*/.voi
20ec0 64 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72  d sqlite3CodeVer
20ed0 69 66 79 4e 61 6d 65 64 53 63 68 65 6d 61 28 50  ifyNamedSchema(P
20ee0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 63 6f  arse *pParse, co
20ef0 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 29 7b 0a  nst char *zDb){.
20f00 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
20f10 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e  pParse->db;.  in
20f20 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  t i;.  for(i=0; 
20f30 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b  i<db->nDb; i++){
20f40 0a 20 20 20 20 44 62 20 2a 70 44 62 20 3d 20 26  .    Db *pDb = &
20f50 64 62 2d 3e 61 44 62 5b 69 5d 3b 0a 20 20 20 20  db->aDb[i];.    
20f60 69 66 28 20 70 44 62 2d 3e 70 42 74 20 26 26 20  if( pDb->pBt && 
20f70 28 21 7a 44 62 20 7c 7c 20 30 3d 3d 73 71 6c 69  (!zDb || 0==sqli
20f80 74 65 33 53 74 72 49 43 6d 70 28 7a 44 62 2c 20  te3StrICmp(zDb, 
20f90 70 44 62 2d 3e 7a 4e 61 6d 65 29 29 20 29 7b 0a  pDb->zName)) ){.
20fa0 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64        sqlite3Cod
20fb0 65 56 65 72 69 66 79 53 63 68 65 6d 61 28 70 50  eVerifySchema(pP
20fc0 61 72 73 65 2c 20 69 29 3b 0a 20 20 20 20 7d 0a  arse, i);.    }.
20fd0 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e    }.}../*.** Gen
20fe0 65 72 61 74 65 20 56 44 42 45 20 63 6f 64 65 20  erate VDBE code 
20ff0 74 68 61 74 20 70 72 65 70 61 72 65 73 20 66 6f  that prepares fo
21000 72 20 64 6f 69 6e 67 20 61 6e 20 6f 70 65 72 61  r doing an opera
21010 74 69 6f 6e 20 74 68 61 74 0a 2a 2a 20 6d 69 67  tion that.** mig
21020 68 74 20 63 68 61 6e 67 65 20 74 68 65 20 64 61  ht change the da
21030 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  tabase..**.** Th
21040 69 73 20 72 6f 75 74 69 6e 65 20 73 74 61 72 74  is routine start
21050 73 20 61 20 6e 65 77 20 74 72 61 6e 73 61 63 74  s a new transact
21060 69 6f 6e 20 69 66 20 77 65 20 61 72 65 20 6e 6f  ion if we are no
21070 74 20 61 6c 72 65 61 64 79 20 77 69 74 68 69 6e  t already within
21080 0a 2a 2a 20 61 20 74 72 61 6e 73 61 63 74 69 6f  .** a transactio
21090 6e 2e 20 20 49 66 20 77 65 20 61 72 65 20 61 6c  n.  If we are al
210a0 72 65 61 64 79 20 77 69 74 68 69 6e 20 61 20 74  ready within a t
210b0 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68 65 6e  ransaction, then
210c0 20 61 20 63 68 65 63 6b 70 6f 69 6e 74 0a 2a 2a   a checkpoint.**
210d0 20 69 73 20 73 65 74 20 69 66 20 74 68 65 20 73   is set if the s
210e0 65 74 53 74 61 74 65 6d 65 6e 74 20 70 61 72 61  etStatement para
210f0 6d 65 74 65 72 20 69 73 20 74 72 75 65 2e 20 20  meter is true.  
21100 41 20 63 68 65 63 6b 70 6f 69 6e 74 20 73 68 6f  A checkpoint sho
21110 75 6c 64 0a 2a 2a 20 62 65 20 73 65 74 20 66 6f  uld.** be set fo
21120 72 20 6f 70 65 72 61 74 69 6f 6e 73 20 74 68 61  r operations tha
21130 74 20 6d 69 67 68 74 20 66 61 69 6c 20 28 64 75  t might fail (du
21140 65 20 74 6f 20 61 20 63 6f 6e 73 74 72 61 69 6e  e to a constrain
21150 74 29 20 70 61 72 74 20 6f 66 0a 2a 2a 20 74 68  t) part of.** th
21160 65 20 77 61 79 20 74 68 72 6f 75 67 68 20 61 6e  e way through an
21170 64 20 77 68 69 63 68 20 77 69 6c 6c 20 6e 65 65  d which will nee
21180 64 20 74 6f 20 75 6e 64 6f 20 73 6f 6d 65 20 77  d to undo some w
21190 72 69 74 65 73 20 77 69 74 68 6f 75 74 20 68 61  rites without ha
211a0 76 69 6e 67 20 74 6f 0a 2a 2a 20 72 6f 6c 6c 62  ving to.** rollb
211b0 61 63 6b 20 74 68 65 20 77 68 6f 6c 65 20 74 72  ack the whole tr
211c0 61 6e 73 61 63 74 69 6f 6e 2e 20 20 46 6f 72 20  ansaction.  For 
211d0 6f 70 65 72 61 74 69 6f 6e 73 20 77 68 65 72 65  operations where
211e0 20 61 6c 6c 20 63 6f 6e 73 74 72 61 69 6e 74 73   all constraints
211f0 0a 2a 2a 20 63 61 6e 20 62 65 20 63 68 65 63 6b  .** can be check
21200 65 64 20 62 65 66 6f 72 65 20 61 6e 79 20 63 68  ed before any ch
21210 61 6e 67 65 73 20 61 72 65 20 6d 61 64 65 20 74  anges are made t
21220 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 20  o the database, 
21230 69 74 20 69 73 20 6e 65 76 65 72 0a 2a 2a 20 6e  it is never.** n
21240 65 63 65 73 73 61 72 79 20 74 6f 20 75 6e 64 6f  ecessary to undo
21250 20 61 20 77 72 69 74 65 20 61 6e 64 20 74 68 65   a write and the
21260 20 63 68 65 63 6b 70 6f 69 6e 74 20 73 68 6f 75   checkpoint shou
21270 6c 64 20 6e 6f 74 20 62 65 20 73 65 74 2e 0a 2a  ld not be set..*
21280 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42 65  /.void sqlite3Be
21290 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f  ginWriteOperatio
212a0 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  n(Parse *pParse,
212b0 20 69 6e 74 20 73 65 74 53 74 61 74 65 6d 65 6e   int setStatemen
212c0 74 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20 20 50  t, int iDb){.  P
212d0 61 72 73 65 20 2a 70 54 6f 70 6c 65 76 65 6c 20  arse *pToplevel 
212e0 3d 20 73 71 6c 69 74 65 33 50 61 72 73 65 54 6f  = sqlite3ParseTo
212f0 70 6c 65 76 65 6c 28 70 50 61 72 73 65 29 3b 0a  plevel(pParse);.
21300 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72    sqlite3CodeVer
21310 69 66 79 53 63 68 65 6d 61 28 70 50 61 72 73 65  ifySchema(pParse
21320 2c 20 69 44 62 29 3b 0a 20 20 44 62 4d 61 73 6b  , iDb);.  DbMask
21330 53 65 74 28 70 54 6f 70 6c 65 76 65 6c 2d 3e 77  Set(pToplevel->w
21340 72 69 74 65 4d 61 73 6b 2c 20 69 44 62 29 3b 0a  riteMask, iDb);.
21350 20 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 69 73 4d    pToplevel->isM
21360 75 6c 74 69 57 72 69 74 65 20 7c 3d 20 73 65 74  ultiWrite |= set
21370 53 74 61 74 65 6d 65 6e 74 3b 0a 7d 0a 0a 2f 2a  Statement;.}../*
21380 0a 2a 2a 20 49 6e 64 69 63 61 74 65 20 74 68 61  .** Indicate tha
21390 74 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  t the statement 
213a0 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72 20  currently under 
213b0 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 6d 69 67  construction mig
213c0 68 74 20 77 72 69 74 65 0a 2a 2a 20 6d 6f 72 65  ht write.** more
213d0 20 74 68 61 6e 20 6f 6e 65 20 65 6e 74 72 79 20   than one entry 
213e0 28 65 78 61 6d 70 6c 65 3a 20 64 65 6c 65 74 69  (example: deleti
213f0 6e 67 20 6f 6e 65 20 72 6f 77 20 74 68 65 6e 20  ng one row then 
21400 69 6e 73 65 72 74 69 6e 67 20 61 6e 6f 74 68 65  inserting anothe
21410 72 2c 0a 2a 2a 20 69 6e 73 65 72 74 69 6e 67 20  r,.** inserting 
21420 6d 75 6c 74 69 70 6c 65 20 72 6f 77 73 20 69 6e  multiple rows in
21430 20 61 20 74 61 62 6c 65 2c 20 6f 72 20 69 6e 73   a table, or ins
21440 65 72 74 69 6e 67 20 61 20 72 6f 77 20 61 6e 64  erting a row and
21450 20 69 6e 64 65 78 20 65 6e 74 72 69 65 73 2e 29   index entries.)
21460 0a 2a 2a 20 49 66 20 61 6e 20 61 62 6f 72 74 20  .** If an abort 
21470 6f 63 63 75 72 73 20 61 66 74 65 72 20 73 6f 6d  occurs after som
21480 65 20 6f 66 20 74 68 65 73 65 20 77 72 69 74 65  e of these write
21490 73 20 68 61 76 65 20 63 6f 6d 70 6c 65 74 65 64  s have completed
214a0 2c 20 74 68 65 6e 20 69 74 20 77 69 6c 6c 0a 2a  , then it will.*
214b0 2a 20 62 65 20 6e 65 63 65 73 73 61 72 79 20 74  * be necessary t
214c0 6f 20 75 6e 64 6f 20 74 68 65 20 63 6f 6d 70 6c  o undo the compl
214d0 65 74 65 64 20 77 72 69 74 65 73 2e 0a 2a 2f 0a  eted writes..*/.
214e0 76 6f 69 64 20 73 71 6c 69 74 65 33 4d 75 6c 74  void sqlite3Mult
214f0 69 57 72 69 74 65 28 50 61 72 73 65 20 2a 70 50  iWrite(Parse *pP
21500 61 72 73 65 29 7b 0a 20 20 50 61 72 73 65 20 2a  arse){.  Parse *
21510 70 54 6f 70 6c 65 76 65 6c 20 3d 20 73 71 6c 69  pToplevel = sqli
21520 74 65 33 50 61 72 73 65 54 6f 70 6c 65 76 65 6c  te3ParseToplevel
21530 28 70 50 61 72 73 65 29 3b 0a 20 20 70 54 6f 70  (pParse);.  pTop
21540 6c 65 76 65 6c 2d 3e 69 73 4d 75 6c 74 69 57 72  level->isMultiWr
21550 69 74 65 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a 20 0a  ite = 1;.}../* .
21560 2a 2a 20 54 68 65 20 63 6f 64 65 20 67 65 6e 65  ** The code gene
21570 72 61 74 6f 72 20 63 61 6c 6c 73 20 74 68 69 73  rator calls this
21580 20 72 6f 75 74 69 6e 65 20 69 66 20 69 73 20 64   routine if is d
21590 69 73 63 6f 76 65 72 73 20 74 68 61 74 20 69 74  iscovers that it
215a0 20 69 73 0a 2a 2a 20 70 6f 73 73 69 62 6c 65 20   is.** possible 
215b0 74 6f 20 61 62 6f 72 74 20 61 20 73 74 61 74 65  to abort a state
215c0 6d 65 6e 74 20 70 72 69 6f 72 20 74 6f 20 63 6f  ment prior to co
215d0 6d 70 6c 65 74 69 6f 6e 2e 20 20 49 6e 20 6f 72  mpletion.  In or
215e0 64 65 72 20 74 6f 20 0a 2a 2a 20 70 65 72 66 6f  der to .** perfo
215f0 72 6d 20 74 68 69 73 20 61 62 6f 72 74 20 77 69  rm this abort wi
21600 74 68 6f 75 74 20 63 6f 72 72 75 70 74 69 6e 67  thout corrupting
21610 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 20 77   the database, w
21620 65 20 6e 65 65 64 20 74 6f 20 6d 61 6b 65 0a 2a  e need to make.*
21630 2a 20 73 75 72 65 20 74 68 61 74 20 74 68 65 20  * sure that the 
21640 73 74 61 74 65 6d 65 6e 74 20 69 73 20 70 72 6f  statement is pro
21650 74 65 63 74 65 64 20 62 79 20 61 20 73 74 61 74  tected by a stat
21660 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  ement transactio
21670 6e 2e 0a 2a 2a 0a 2a 2a 20 54 65 63 68 6e 69 63  n..**.** Technic
21680 61 6c 6c 79 2c 20 77 65 20 6f 6e 6c 79 20 6e 65  ally, we only ne
21690 65 64 20 74 6f 20 73 65 74 20 74 68 65 20 6d 61  ed to set the ma
216a0 79 41 62 6f 72 74 20 66 6c 61 67 20 69 66 20 74  yAbort flag if t
216b0 68 65 0a 2a 2a 20 69 73 4d 75 6c 74 69 57 72 69  he.** isMultiWri
216c0 74 65 20 66 6c 61 67 20 77 61 73 20 70 72 65 76  te flag was prev
216d0 69 6f 75 73 6c 79 20 73 65 74 2e 20 20 54 68 65  iously set.  The
216e0 72 65 20 69 73 20 61 20 74 69 6d 65 20 64 65 70  re is a time dep
216f0 65 6e 64 65 6e 63 79 0a 2a 2a 20 73 75 63 68 20  endency.** such 
21700 74 68 61 74 20 74 68 65 20 61 62 6f 72 74 20 6d  that the abort m
21710 75 73 74 20 6f 63 63 75 72 20 61 66 74 65 72 20  ust occur after 
21720 74 68 65 20 6d 75 6c 74 69 77 72 69 74 65 2e 20  the multiwrite. 
21730 20 54 68 69 73 20 6d 61 6b 65 73 0a 2a 2a 20 73   This makes.** s
21740 6f 6d 65 20 73 74 61 74 65 6d 65 6e 74 73 20 69  ome statements i
21750 6e 76 6f 6c 76 69 6e 67 20 74 68 65 20 52 45 50  nvolving the REP
21760 4c 41 43 45 20 63 6f 6e 66 6c 69 63 74 20 72 65  LACE conflict re
21770 73 6f 6c 75 74 69 6f 6e 20 61 6c 67 6f 72 69 74  solution algorit
21780 68 6d 0a 2a 2a 20 67 6f 20 61 20 6c 69 74 74 6c  hm.** go a littl
21790 65 20 66 61 73 74 65 72 2e 20 20 42 75 74 20 74  e faster.  But t
217a0 61 6b 69 6e 67 20 61 64 76 61 6e 74 61 67 65 20  aking advantage 
217b0 6f 66 20 74 68 69 73 20 74 69 6d 65 20 64 65 70  of this time dep
217c0 65 6e 64 65 6e 63 79 0a 2a 2a 20 6d 61 6b 65 73  endency.** makes
217d0 20 69 74 20 6d 6f 72 65 20 64 69 66 66 69 63 75   it more difficu
217e0 6c 74 20 74 6f 20 70 72 6f 76 65 20 74 68 61 74  lt to prove that
217f0 20 74 68 65 20 63 6f 64 65 20 69 73 20 63 6f 72   the code is cor
21800 72 65 63 74 20 28 69 6e 20 0a 2a 2a 20 70 61 72  rect (in .** par
21810 74 69 63 75 6c 61 72 2c 20 69 74 20 70 72 65 76  ticular, it prev
21820 65 6e 74 73 20 75 73 20 66 72 6f 6d 20 77 72 69  ents us from wri
21830 74 69 6e 67 20 61 6e 20 65 66 66 65 63 74 69 76  ting an effectiv
21840 65 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74  e.** implementat
21850 69 6f 6e 20 6f 66 20 73 71 6c 69 74 65 33 41 73  ion of sqlite3As
21860 73 65 72 74 4d 61 79 41 62 6f 72 74 28 29 29 20  sertMayAbort()) 
21870 61 6e 64 20 73 6f 20 77 65 20 68 61 76 65 20 63  and so we have c
21880 68 6f 73 65 6e 0a 2a 2a 20 74 6f 20 74 61 6b 65  hosen.** to take
21890 20 74 68 65 20 73 61 66 65 20 72 6f 75 74 65 20   the safe route 
218a0 61 6e 64 20 73 6b 69 70 20 74 68 65 20 6f 70 74  and skip the opt
218b0 69 6d 69 7a 61 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f  imization..*/.vo
218c0 69 64 20 73 71 6c 69 74 65 33 4d 61 79 41 62 6f  id sqlite3MayAbo
218d0 72 74 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  rt(Parse *pParse
218e0 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 54 6f 70  ){.  Parse *pTop
218f0 6c 65 76 65 6c 20 3d 20 73 71 6c 69 74 65 33 50  level = sqlite3P
21900 61 72 73 65 54 6f 70 6c 65 76 65 6c 28 70 50 61  arseToplevel(pPa
21910 72 73 65 29 3b 0a 20 20 70 54 6f 70 6c 65 76 65  rse);.  pTopleve
21920 6c 2d 3e 6d 61 79 41 62 6f 72 74 20 3d 20 31 3b  l->mayAbort = 1;
21930 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20 61  .}../*.** Code a
21940 6e 20 4f 50 5f 48 61 6c 74 20 74 68 61 74 20 63  n OP_Halt that c
21950 61 75 73 65 73 20 74 68 65 20 76 64 62 65 20 74  auses the vdbe t
21960 6f 20 72 65 74 75 72 6e 20 61 6e 20 53 51 4c 49  o return an SQLI
21970 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 0a 2a 2a  TE_CONSTRAINT.**
21980 20 65 72 72 6f 72 2e 20 54 68 65 20 6f 6e 45 72   error. The onEr
21990 72 6f 72 20 70 61 72 61 6d 65 74 65 72 20 64 65  ror parameter de
219a0 74 65 72 6d 69 6e 65 73 20 77 68 69 63 68 20 28  termines which (
219b0 69 66 20 61 6e 79 29 20 6f 66 20 74 68 65 20 73  if any) of the s
219c0 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 61 6e 64 2f  tatement.** and/
219d0 6f 72 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73  or current trans
219e0 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64  action is rolled
219f0 20 62 61 63 6b 2e 0a 2a 2f 0a 76 6f 69 64 20 73   back..*/.void s
21a00 71 6c 69 74 65 33 48 61 6c 74 43 6f 6e 73 74 72  qlite3HaltConstr
21a10 61 69 6e 74 28 0a 20 20 50 61 72 73 65 20 2a 70  aint(.  Parse *p
21a20 50 61 72 73 65 2c 20 20 20 20 2f 2a 20 50 61 72  Parse,    /* Par
21a30 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
21a40 20 20 69 6e 74 20 65 72 72 43 6f 64 65 2c 20 20    int errCode,  
21a50 20 20 20 20 2f 2a 20 65 78 74 65 6e 64 65 64 20      /* extended 
21a60 65 72 72 6f 72 20 63 6f 64 65 20 2a 2f 0a 20 20  error code */.  
21a70 69 6e 74 20 6f 6e 45 72 72 6f 72 2c 20 20 20 20  int onError,    
21a80 20 20 2f 2a 20 43 6f 6e 73 74 72 61 69 6e 74 20    /* Constraint 
21a90 74 79 70 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a  type */.  char *
21aa0 70 34 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 45  p4,         /* E
21ab0 72 72 6f 72 20 6d 65 73 73 61 67 65 20 2a 2f 0a  rror message */.
21ac0 20 20 69 38 20 70 34 74 79 70 65 2c 20 20 20 20    i8 p4type,    
21ad0 20 20 20 20 2f 2a 20 50 34 5f 53 54 41 54 49 43      /* P4_STATIC
21ae0 20 6f 72 20 50 34 5f 54 52 41 4e 53 49 45 4e 54   or P4_TRANSIENT
21af0 20 2a 2f 0a 20 20 75 38 20 70 35 45 72 72 6d 73   */.  u8 p5Errms
21b00 67 20 20 20 20 20 20 20 2f 2a 20 50 35 5f 45 72  g       /* P5_Er
21b10 72 4d 73 67 20 74 79 70 65 20 2a 2f 0a 29 7b 0a  rMsg type */.){.
21b20 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69    Vdbe *v = sqli
21b30 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
21b40 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 65  e);.  assert( (e
21b50 72 72 43 6f 64 65 26 30 78 66 66 29 3d 3d 53 51  rrCode&0xff)==SQ
21b60 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20  LITE_CONSTRAINT 
21b70 29 3b 0a 20 20 69 66 28 20 6f 6e 45 72 72 6f 72  );.  if( onError
21b80 3d 3d 4f 45 5f 41 62 6f 72 74 20 29 7b 0a 20 20  ==OE_Abort ){.  
21b90 20 20 73 71 6c 69 74 65 33 4d 61 79 41 62 6f 72    sqlite3MayAbor
21ba0 74 28 70 50 61 72 73 65 29 3b 0a 20 20 7d 0a 20  t(pParse);.  }. 
21bb0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
21bc0 70 34 28 76 2c 20 4f 50 5f 48 61 6c 74 2c 20 65  p4(v, OP_Halt, e
21bd0 72 72 43 6f 64 65 2c 20 6f 6e 45 72 72 6f 72 2c  rrCode, onError,
21be0 20 30 2c 20 70 34 2c 20 70 34 74 79 70 65 29 3b   0, p4, p4type);
21bf0 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68  .  sqlite3VdbeCh
21c00 61 6e 67 65 50 35 28 76 2c 20 70 35 45 72 72 6d  angeP5(v, p5Errm
21c10 73 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  sg);.}../*.** Co
21c20 64 65 20 61 6e 20 4f 50 5f 48 61 6c 74 20 64 75  de an OP_Halt du
21c30 65 20 74 6f 20 55 4e 49 51 55 45 20 6f 72 20 50  e to UNIQUE or P
21c40 52 49 4d 41 52 59 20 4b 45 59 20 63 6f 6e 73 74  RIMARY KEY const
21c50 72 61 69 6e 74 20 76 69 6f 6c 61 74 69 6f 6e 2e  raint violation.
21c60 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
21c70 55 6e 69 71 75 65 43 6f 6e 73 74 72 61 69 6e 74  UniqueConstraint
21c80 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
21c90 65 2c 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67  e,    /* Parsing
21ca0 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e   context */.  in
21cb0 74 20 6f 6e 45 72 72 6f 72 2c 20 20 20 20 20 20  t onError,      
21cc0 2f 2a 20 43 6f 6e 73 74 72 61 69 6e 74 20 74 79  /* Constraint ty
21cd0 70 65 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70  pe */.  Index *p
21ce0 49 64 78 20 20 20 20 20 20 20 2f 2a 20 54 68 65  Idx       /* The
21cf0 20 69 6e 64 65 78 20 74 68 61 74 20 74 72 69 67   index that trig
21d00 67 65 72 73 20 74 68 65 20 63 6f 6e 73 74 72 61  gers the constra
21d10 69 6e 74 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72  int */.){.  char
21d20 20 2a 7a 45 72 72 3b 0a 20 20 69 6e 74 20 6a 3b   *zErr;.  int j;
21d30 0a 20 20 53 74 72 41 63 63 75 6d 20 65 72 72 4d  .  StrAccum errM
21d40 73 67 3b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61  sg;.  Table *pTa
21d50 62 20 3d 20 70 49 64 78 2d 3e 70 54 61 62 6c 65  b = pIdx->pTable
21d60 3b 0a 0a 20 20 73 71 6c 69 74 65 33 53 74 72 41  ;..  sqlite3StrA
21d70 63 63 75 6d 49 6e 69 74 28 26 65 72 72 4d 73 67  ccumInit(&errMsg
21d80 2c 20 70 50 61 72 73 65 2d 3e 64 62 2c 20 30 2c  , pParse->db, 0,
21d90 20 30 2c 20 32 30 30 29 3b 0a 20 20 69 66 28 20   0, 200);.  if( 
21da0 70 49 64 78 2d 3e 61 43 6f 6c 45 78 70 72 20 29  pIdx->aColExpr )
21db0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 58 50 72  {.    sqlite3XPr
21dc0 69 6e 74 66 28 26 65 72 72 4d 73 67 2c 20 22 69  intf(&errMsg, "i
21dd0 6e 64 65 78 20 27 25 71 27 22 2c 20 70 49 64 78  ndex '%q'", pIdx
21de0 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 7d 65 6c 73  ->zName);.  }els
21df0 65 7b 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20  e{.    for(j=0; 
21e00 6a 3c 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3b  j<pIdx->nKeyCol;
21e10 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 63 68 61   j++){.      cha
21e20 72 20 2a 7a 43 6f 6c 3b 0a 20 20 20 20 20 20 61  r *zCol;.      a
21e30 73 73 65 72 74 28 20 70 49 64 78 2d 3e 61 69 43  ssert( pIdx->aiC
21e40 6f 6c 75 6d 6e 5b 6a 5d 3e 3d 30 20 29 3b 0a 20  olumn[j]>=0 );. 
21e50 20 20 20 20 20 7a 43 6f 6c 20 3d 20 70 54 61 62       zCol = pTab
21e60 2d 3e 61 43 6f 6c 5b 70 49 64 78 2d 3e 61 69 43  ->aCol[pIdx->aiC
21e70 6f 6c 75 6d 6e 5b 6a 5d 5d 2e 7a 4e 61 6d 65 3b  olumn[j]].zName;
21e80 0a 20 20 20 20 20 20 69 66 28 20 6a 20 29 20 73  .      if( j ) s
21e90 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d 41 70  qlite3StrAccumAp
21ea0 70 65 6e 64 28 26 65 72 72 4d 73 67 2c 20 22 2c  pend(&errMsg, ",
21eb0 20 22 2c 20 32 29 3b 0a 20 20 20 20 20 20 73 71   ", 2);.      sq
21ec0 6c 69 74 65 33 58 50 72 69 6e 74 66 28 26 65 72  lite3XPrintf(&er
21ed0 72 4d 73 67 2c 20 22 25 73 2e 25 73 22 2c 20 70  rMsg, "%s.%s", p
21ee0 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c  Tab->zName, zCol
21ef0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 7a  );.    }.  }.  z
21f00 45 72 72 20 3d 20 73 71 6c 69 74 65 33 53 74 72  Err = sqlite3Str
21f10 41 63 63 75 6d 46 69 6e 69 73 68 28 26 65 72 72  AccumFinish(&err
21f20 4d 73 67 29 3b 0a 20 20 73 71 6c 69 74 65 33 48  Msg);.  sqlite3H
21f30 61 6c 74 43 6f 6e 73 74 72 61 69 6e 74 28 70 50  altConstraint(pP
21f40 61 72 73 65 2c 20 0a 20 20 20 20 49 73 50 72 69  arse, .    IsPri
21f50 6d 61 72 79 4b 65 79 49 6e 64 65 78 28 70 49 64  maryKeyIndex(pId
21f60 78 29 20 3f 20 53 51 4c 49 54 45 5f 43 4f 4e 53  x) ? SQLITE_CONS
21f70 54 52 41 49 4e 54 5f 50 52 49 4d 41 52 59 4b 45  TRAINT_PRIMARYKE
21f80 59 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  Y .             
21f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 3a                 :
21fa0 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49   SQLITE_CONSTRAI
21fb0 4e 54 5f 55 4e 49 51 55 45 2c 0a 20 20 20 20 6f  NT_UNIQUE,.    o
21fc0 6e 45 72 72 6f 72 2c 20 7a 45 72 72 2c 20 50 34  nError, zErr, P4
21fd0 5f 44 59 4e 41 4d 49 43 2c 20 50 35 5f 43 6f 6e  _DYNAMIC, P5_Con
21fe0 73 74 72 61 69 6e 74 55 6e 69 71 75 65 29 3b 0a  straintUnique);.
21ff0 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20 61  }.../*.** Code a
22000 6e 20 4f 50 5f 48 61 6c 74 20 64 75 65 20 74 6f  n OP_Halt due to
22010 20 6e 6f 6e 2d 75 6e 69 71 75 65 20 72 6f 77 69   non-unique rowi
22020 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  d..*/.void sqlit
22030 65 33 52 6f 77 69 64 43 6f 6e 73 74 72 61 69 6e  e3RowidConstrain
22040 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  t(.  Parse *pPar
22050 73 65 2c 20 20 20 20 2f 2a 20 50 61 72 73 69 6e  se,    /* Parsin
22060 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69  g context */.  i
22070 6e 74 20 6f 6e 45 72 72 6f 72 2c 20 20 20 20 20  nt onError,     
22080 20 2f 2a 20 43 6f 6e 66 6c 69 63 74 20 72 65 73   /* Conflict res
22090 6f 6c 75 74 69 6f 6e 20 61 6c 67 6f 72 69 74 68  olution algorith
220a0 6d 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54  m */.  Table *pT
220b0 61 62 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ab       /* The 
220c0 74 61 62 6c 65 20 77 69 74 68 20 74 68 65 20 6e  table with the n
220d0 6f 6e 2d 75 6e 69 71 75 65 20 72 6f 77 69 64 20  on-unique rowid 
220e0 2a 2f 20 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a  */ .){.  char *z
220f0 4d 73 67 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  Msg;.  int rc;. 
22100 20 69 66 28 20 70 54 61 62 2d 3e 69 50 4b 65 79   if( pTab->iPKey
22110 3e 3d 30 20 29 7b 0a 20 20 20 20 7a 4d 73 67 20  >=0 ){.    zMsg 
22120 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66  = sqlite3MPrintf
22130 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 22 25 73  (pParse->db, "%s
22140 2e 25 73 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  .%s", pTab->zNam
22150 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e,.             
22160 20 20 20 20 20 20 20 20 20 20 20 20 20 70 54 61               pTa
22170 62 2d 3e 61 43 6f 6c 5b 70 54 61 62 2d 3e 69 50  b->aCol[pTab->iP
22180 4b 65 79 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20  Key].zName);.   
22190 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 4e   rc = SQLITE_CON
221a0 53 54 52 41 49 4e 54 5f 50 52 49 4d 41 52 59 4b  STRAINT_PRIMARYK
221b0 45 59 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  EY;.  }else{.   
221c0 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d   zMsg = sqlite3M
221d0 50 72 69 6e 74 66 28 70 50 61 72 73 65 2d 3e 64  Printf(pParse->d
221e0 62 2c 20 22 25 73 2e 72 6f 77 69 64 22 2c 20 70  b, "%s.rowid", p
221f0 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  Tab->zName);.   
22200 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 4e   rc = SQLITE_CON
22210 53 54 52 41 49 4e 54 5f 52 4f 57 49 44 3b 0a 20  STRAINT_ROWID;. 
22220 20 7d 0a 20 20 73 71 6c 69 74 65 33 48 61 6c 74   }.  sqlite3Halt
22230 43 6f 6e 73 74 72 61 69 6e 74 28 70 50 61 72 73  Constraint(pPars
22240 65 2c 20 72 63 2c 20 6f 6e 45 72 72 6f 72 2c 20  e, rc, onError, 
22250 7a 4d 73 67 2c 20 50 34 5f 44 59 4e 41 4d 49 43  zMsg, P4_DYNAMIC
22260 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
22270 20 20 20 20 20 20 20 20 20 20 50 35 5f 43 6f 6e            P5_Con
22280 73 74 72 61 69 6e 74 55 6e 69 71 75 65 29 3b 0a  straintUnique);.
22290 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74  }../*.** Check t
222a0 6f 20 73 65 65 20 69 66 20 70 49 6e 64 65 78 20  o see if pIndex 
222b0 75 73 65 73 20 74 68 65 20 63 6f 6c 6c 61 74 69  uses the collati
222c0 6e 67 20 73 65 71 75 65 6e 63 65 20 70 43 6f 6c  ng sequence pCol
222d0 6c 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20 74 72  l.  Return.** tr
222e0 75 65 20 69 66 20 69 74 20 64 6f 65 73 20 61 6e  ue if it does an
222f0 64 20 66 61 6c 73 65 20 69 66 20 69 74 20 64 6f  d false if it do
22300 65 73 20 6e 6f 74 2e 0a 2a 2f 0a 23 69 66 6e 64  es not..*/.#ifnd
22310 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 52  ef SQLITE_OMIT_R
22320 45 49 4e 44 45 58 0a 73 74 61 74 69 63 20 69 6e  EINDEX.static in
22330 74 20 63 6f 6c 6c 61 74 69 6f 6e 4d 61 74 63 68  t collationMatch
22340 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f  (const char *zCo
22350 6c 6c 2c 20 49 6e 64 65 78 20 2a 70 49 6e 64 65  ll, Index *pInde
22360 78 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 61  x){.  int i;.  a
22370 73 73 65 72 74 28 20 7a 43 6f 6c 6c 21 3d 30 20  ssert( zColl!=0 
22380 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
22390 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b  pIndex->nColumn;
223a0 20 69 2b 2b 29 7b 0a 20 20 20 20 63 6f 6e 73 74   i++){.    const
223b0 20 63 68 61 72 20 2a 7a 20 3d 20 70 49 6e 64 65   char *z = pInde
223c0 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 3b 0a 20 20  x->azColl[i];.  
223d0 20 20 61 73 73 65 72 74 28 20 7a 21 3d 30 20 7c    assert( z!=0 |
223e0 7c 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75  | pIndex->aiColu
223f0 6d 6e 5b 69 5d 3c 30 20 29 3b 0a 20 20 20 20 69  mn[i]<0 );.    i
22400 66 28 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c  f( pIndex->aiCol
22410 75 6d 6e 5b 69 5d 3e 3d 30 20 26 26 20 30 3d 3d  umn[i]>=0 && 0==
22420 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a  sqlite3StrICmp(z
22430 2c 20 7a 43 6f 6c 6c 29 20 29 7b 0a 20 20 20 20  , zColl) ){.    
22440 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
22450 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  }.  }.  return 0
22460 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
22470 2a 20 52 65 63 6f 6d 70 75 74 65 20 61 6c 6c 20  * Recompute all 
22480 69 6e 64 69 63 65 73 20 6f 66 20 70 54 61 62 20  indices of pTab 
22490 74 68 61 74 20 75 73 65 20 74 68 65 20 63 6f 6c  that use the col
224a0 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20  lating sequence 
224b0 70 43 6f 6c 6c 2e 0a 2a 2a 20 49 66 20 70 43 6f  pColl..** If pCo
224c0 6c 6c 3d 3d 30 20 74 68 65 6e 20 72 65 63 6f 6d  ll==0 then recom
224d0 70 75 74 65 20 61 6c 6c 20 69 6e 64 69 63 65 73  pute all indices
224e0 20 6f 66 20 70 54 61 62 2e 0a 2a 2f 0a 23 69 66   of pTab..*/.#if
224f0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
22500 5f 52 45 49 4e 44 45 58 0a 73 74 61 74 69 63 20  _REINDEX.static 
22510 76 6f 69 64 20 72 65 69 6e 64 65 78 54 61 62 6c  void reindexTabl
22520 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
22530 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 63 68   Table *pTab, ch
22540 61 72 20 63 6f 6e 73 74 20 2a 7a 43 6f 6c 6c 29  ar const *zColl)
22550 7b 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65  {.  Index *pInde
22560 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x;              
22570 2f 2a 20 41 6e 20 69 6e 64 65 78 20 61 73 73 6f  /* An index asso
22580 63 69 61 74 65 64 20 77 69 74 68 20 70 54 61 62  ciated with pTab
22590 20 2a 2f 0a 0a 20 20 66 6f 72 28 70 49 6e 64 65   */..  for(pInde
225a0 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20  x=pTab->pIndex; 
225b0 70 49 6e 64 65 78 3b 20 70 49 6e 64 65 78 3d 70  pIndex; pIndex=p
225c0 49 6e 64 65 78 2d 3e 70 4e 65 78 74 29 7b 0a 20  Index->pNext){. 
225d0 20 20 20 69 66 28 20 7a 43 6f 6c 6c 3d 3d 30 20     if( zColl==0 
225e0 7c 7c 20 63 6f 6c 6c 61 74 69 6f 6e 4d 61 74 63  || collationMatc
225f0 68 28 7a 43 6f 6c 6c 2c 20 70 49 6e 64 65 78 29  h(zColl, pIndex)
22600 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 44   ){.      int iD
22610 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d  b = sqlite3Schem
22620 61 54 6f 49 6e 64 65 78 28 70 50 61 72 73 65 2d  aToIndex(pParse-
22630 3e 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65  >db, pTab->pSche
22640 6d 61 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ma);.      sqlit
22650 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72  e3BeginWriteOper
22660 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 30 2c  ation(pParse, 0,
22670 20 69 44 62 29 3b 0a 20 20 20 20 20 20 73 71 6c   iDb);.      sql
22680 69 74 65 33 52 65 66 69 6c 6c 49 6e 64 65 78 28  ite3RefillIndex(
22690 70 50 61 72 73 65 2c 20 70 49 6e 64 65 78 2c 20  pParse, pIndex, 
226a0 2d 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  -1);.    }.  }.}
226b0 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52  .#endif../*.** R
226c0 65 63 6f 6d 70 75 74 65 20 61 6c 6c 20 69 6e 64  ecompute all ind
226d0 69 63 65 73 20 6f 66 20 61 6c 6c 20 74 61 62 6c  ices of all tabl
226e0 65 73 20 69 6e 20 61 6c 6c 20 64 61 74 61 62 61  es in all databa
226f0 73 65 73 20 77 68 65 72 65 20 74 68 65 0a 2a 2a  ses where the.**
22700 20 69 6e 64 69 63 65 73 20 75 73 65 20 74 68 65   indices use the
22710 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
22720 6e 63 65 20 70 43 6f 6c 6c 2e 20 20 49 66 20 70  nce pColl.  If p
22730 43 6f 6c 6c 3d 3d 30 20 74 68 65 6e 20 72 65 63  Coll==0 then rec
22740 6f 6d 70 75 74 65 0a 2a 2a 20 61 6c 6c 20 69 6e  ompute.** all in
22750 64 69 63 65 73 20 65 76 65 72 79 77 68 65 72 65  dices everywhere
22760 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
22770 49 54 45 5f 4f 4d 49 54 5f 52 45 49 4e 44 45 58  ITE_OMIT_REINDEX
22780 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 69  .static void rei
22790 6e 64 65 78 44 61 74 61 62 61 73 65 73 28 50 61  ndexDatabases(Pa
227a0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 63 68 61  rse *pParse, cha
227b0 72 20 63 6f 6e 73 74 20 2a 7a 43 6f 6c 6c 29 7b  r const *zColl){
227c0 0a 20 20 44 62 20 2a 70 44 62 3b 20 20 20 20 20  .  Db *pDb;     
227d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
227e0 2a 20 41 20 73 69 6e 67 6c 65 20 64 61 74 61 62  * A single datab
227f0 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62  ase */.  int iDb
22800 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
22810 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61       /* The data
22820 62 61 73 65 20 69 6e 64 65 78 20 6e 75 6d 62 65  base index numbe
22830 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a  r */.  sqlite3 *
22840 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
22850 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61     /* The databa
22860 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f  se connection */
22870 0a 20 20 48 61 73 68 45 6c 65 6d 20 2a 6b 3b 20  .  HashElem *k; 
22880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
22890 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76  * For looping ov
228a0 65 72 20 74 61 62 6c 65 73 20 69 6e 20 70 44 62  er tables in pDb
228b0 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61   */.  Table *pTa
228c0 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
228d0 20 20 2f 2a 20 41 20 74 61 62 6c 65 20 69 6e 20    /* A table in 
228e0 74 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  the database */.
228f0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
22900 65 33 42 74 72 65 65 48 6f 6c 64 73 41 6c 6c 4d  e3BtreeHoldsAllM
22910 75 74 65 78 65 73 28 64 62 29 20 29 3b 20 20 2f  utexes(db) );  /
22920 2a 20 4e 65 65 64 65 64 20 66 6f 72 20 73 63 68  * Needed for sch
22930 65 6d 61 20 61 63 63 65 73 73 20 2a 2f 0a 20 20  ema access */.  
22940 66 6f 72 28 69 44 62 3d 30 2c 20 70 44 62 3d 64  for(iDb=0, pDb=d
22950 62 2d 3e 61 44 62 3b 20 69 44 62 3c 64 62 2d 3e  b->aDb; iDb<db->
22960 6e 44 62 3b 20 69 44 62 2b 2b 2c 20 70 44 62 2b  nDb; iDb++, pDb+
22970 2b 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  +){.    assert( 
22980 70 44 62 21 3d 30 20 29 3b 0a 20 20 20 20 66 6f  pDb!=0 );.    fo
22990 72 28 6b 3d 73 71 6c 69 74 65 48 61 73 68 46 69  r(k=sqliteHashFi
229a0 72 73 74 28 26 70 44 62 2d 3e 70 53 63 68 65 6d  rst(&pDb->pSchem
229b0 61 2d 3e 74 62 6c 48 61 73 68 29 3b 20 20 6b 3b  a->tblHash);  k;
229c0 20 6b 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78   k=sqliteHashNex
229d0 74 28 6b 29 29 7b 0a 20 20 20 20 20 20 70 54 61  t(k)){.      pTa
229e0 62 20 3d 20 28 54 61 62 6c 65 2a 29 73 71 6c 69  b = (Table*)sqli
229f0 74 65 48 61 73 68 44 61 74 61 28 6b 29 3b 0a 20  teHashData(k);. 
22a00 20 20 20 20 20 72 65 69 6e 64 65 78 54 61 62 6c       reindexTabl
22a10 65 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20  e(pParse, pTab, 
22a20 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20 7d 0a 20 20  zColl);.    }.  
22a30 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  }.}.#endif../*.*
22a40 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
22a50 66 6f 72 20 74 68 65 20 52 45 49 4e 44 45 58 20  for the REINDEX 
22a60 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 20  command..**.**  
22a70 20 20 20 20 20 20 52 45 49 4e 44 45 58 20 20 20        REINDEX   
22a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22a90 20 20 20 20 20 20 20 20 20 2d 2d 20 31 0a 2a 2a           -- 1.**
22aa0 20 20 20 20 20 20 20 20 52 45 49 4e 44 45 58 20          REINDEX 
22ab0 20 3c 63 6f 6c 6c 61 74 69 6f 6e 3e 20 20 20 20   <collation>    
22ac0 20 20 20 20 20 20 20 20 20 20 20 2d 2d 20 32 0a             -- 2.
22ad0 2a 2a 20 20 20 20 20 20 20 20 52 45 49 4e 44 45  **        REINDE
22ae0 58 20 20 3f 3c 64 61 74 61 62 61 73 65 3e 2e 3f  X  ?<database>.?
22af0 3c 74 61 62 6c 65 6e 61 6d 65 3e 20 20 2d 2d 20  <tablename>  -- 
22b00 33 0a 2a 2a 20 20 20 20 20 20 20 20 52 45 49 4e  3.**        REIN
22b10 44 45 58 20 20 3f 3c 64 61 74 61 62 61 73 65 3e  DEX  ?<database>
22b20 2e 3f 3c 69 6e 64 65 78 6e 61 6d 65 3e 20 20 2d  .?<indexname>  -
22b30 2d 20 34 0a 2a 2a 0a 2a 2a 20 46 6f 72 6d 20 31  - 4.**.** Form 1
22b40 20 63 61 75 73 65 73 20 61 6c 6c 20 69 6e 64 69   causes all indi
22b50 63 65 73 20 69 6e 20 61 6c 6c 20 61 74 74 61 63  ces in all attac
22b60 68 65 64 20 64 61 74 61 62 61 73 65 73 20 74 6f  hed databases to
22b70 20 62 65 20 72 65 62 75 69 6c 74 2e 0a 2a 2a 20   be rebuilt..** 
22b80 46 6f 72 6d 20 32 20 72 65 62 75 69 6c 64 73 20  Form 2 rebuilds 
22b90 61 6c 6c 20 69 6e 64 69 63 65 73 20 69 6e 20 61  all indices in a
22ba0 6c 6c 20 64 61 74 61 62 61 73 65 73 20 74 68 61  ll databases tha
22bb0 74 20 75 73 65 20 74 68 65 20 6e 61 6d 65 64 0a  t use the named.
22bc0 2a 2a 20 63 6f 6c 6c 61 74 69 6e 67 20 66 75 6e  ** collating fun
22bd0 63 74 69 6f 6e 2e 20 20 46 6f 72 6d 73 20 33 20  ction.  Forms 3 
22be0 61 6e 64 20 34 20 72 65 62 75 69 6c 64 20 74 68  and 4 rebuild th
22bf0 65 20 6e 61 6d 65 64 20 69 6e 64 65 78 20 6f 72  e named index or
22c00 20 61 6c 6c 0a 2a 2a 20 69 6e 64 69 63 65 73 20   all.** indices 
22c10 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
22c20 74 68 65 20 6e 61 6d 65 64 20 74 61 62 6c 65 2e  the named table.
22c30 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .*/.#ifndef SQLI
22c40 54 45 5f 4f 4d 49 54 5f 52 45 49 4e 44 45 58 0a  TE_OMIT_REINDEX.
22c50 76 6f 69 64 20 73 71 6c 69 74 65 33 52 65 69 6e  void sqlite3Rein
22c60 64 65 78 28 50 61 72 73 65 20 2a 70 50 61 72 73  dex(Parse *pPars
22c70 65 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31  e, Token *pName1
22c80 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32 29  , Token *pName2)
22c90 7b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f  {.  CollSeq *pCo
22ca0 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ll;             
22cb0 2f 2a 20 43 6f 6c 6c 61 74 69 6e 67 20 73 65 71  /* Collating seq
22cc0 75 65 6e 63 65 20 74 6f 20 62 65 20 72 65 69 6e  uence to be rein
22cd0 64 65 78 65 64 2c 20 6f 72 20 4e 55 4c 4c 20 2a  dexed, or NULL *
22ce0 2f 0a 20 20 63 68 61 72 20 2a 7a 3b 20 20 20 20  /.  char *z;    
22cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22d00 2f 2a 20 4e 61 6d 65 20 6f 66 20 61 20 74 61 62  /* Name of a tab
22d10 6c 65 20 6f 72 20 69 6e 64 65 78 20 2a 2f 0a 20  le or index */. 
22d20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62   const char *zDb
22d30 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
22d40 4e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61  Name of the data
22d50 62 61 73 65 20 2a 2f 0a 20 20 54 61 62 6c 65 20  base */.  Table 
22d60 2a 70 54 61 62 3b 20 20 20 20 20 20 20 20 20 20  *pTab;          
22d70 20 20 20 20 20 20 2f 2a 20 41 20 74 61 62 6c 65        /* A table
22d80 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
22d90 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e   */.  Index *pIn
22da0 64 65 78 3b 20 20 20 20 20 20 20 20 20 20 20 20  dex;            
22db0 20 20 2f 2a 20 41 6e 20 69 6e 64 65 78 20 61 73    /* An index as
22dc0 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 70 54  sociated with pT
22dd0 61 62 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62 3b  ab */.  int iDb;
22de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22df0 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62      /* The datab
22e00 61 73 65 20 69 6e 64 65 78 20 6e 75 6d 62 65 72  ase index number
22e10 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
22e20 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20  b = pParse->db; 
22e30 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73    /* The databas
22e40 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a  e connection */.
22e50 20 20 54 6f 6b 65 6e 20 2a 70 4f 62 6a 4e 61 6d    Token *pObjNam
22e60 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e;            /*
22e70 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62   Name of the tab
22e80 6c 65 20 6f 72 20 69 6e 64 65 78 20 74 6f 20 62  le or index to b
22e90 65 20 72 65 69 6e 64 65 78 65 64 20 2a 2f 0a 0a  e reindexed */..
22ea0 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 64 61    /* Read the da
22eb0 74 61 62 61 73 65 20 73 63 68 65 6d 61 2e 20 49  tabase schema. I
22ec0 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
22ed0 73 2c 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f  s, leave an erro
22ee0 72 20 6d 65 73 73 61 67 65 0a 20 20 2a 2a 20 61  r message.  ** a
22ef0 6e 64 20 63 6f 64 65 20 69 6e 20 70 50 61 72 73  nd code in pPars
22f00 65 20 61 6e 64 20 72 65 74 75 72 6e 20 4e 55 4c  e and return NUL
22f10 4c 2e 20 2a 2f 0a 20 20 69 66 28 20 53 51 4c 49  L. */.  if( SQLI
22f20 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65  TE_OK!=sqlite3Re
22f30 61 64 53 63 68 65 6d 61 28 70 50 61 72 73 65 29  adSchema(pParse)
22f40 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a   ){.    return;.
22f50 20 20 7d 0a 0a 20 20 69 66 28 20 70 4e 61 6d 65    }..  if( pName
22f60 31 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 69 6e  1==0 ){.    rein
22f70 64 65 78 44 61 74 61 62 61 73 65 73 28 70 50 61  dexDatabases(pPa
22f80 72 73 65 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  rse, 0);.    ret
22f90 75 72 6e 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  urn;.  }else if(
22fa0 20 4e 45 56 45 52 28 70 4e 61 6d 65 32 3d 3d 30   NEVER(pName2==0
22fb0 29 20 7c 7c 20 70 4e 61 6d 65 32 2d 3e 7a 3d 3d  ) || pName2->z==
22fc0 30 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a  0 ){.    char *z
22fd0 43 6f 6c 6c 3b 0a 20 20 20 20 61 73 73 65 72 74  Coll;.    assert
22fe0 28 20 70 4e 61 6d 65 31 2d 3e 7a 20 29 3b 0a 20  ( pName1->z );. 
22ff0 20 20 20 7a 43 6f 6c 6c 20 3d 20 73 71 6c 69 74     zColl = sqlit
23000 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28  e3NameFromToken(
23010 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 4e 61 6d  pParse->db, pNam
23020 65 31 29 3b 0a 20 20 20 20 69 66 28 20 21 7a 43  e1);.    if( !zC
23030 6f 6c 6c 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  oll ) return;.  
23040 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65    pColl = sqlite
23050 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28 64 62 2c  3FindCollSeq(db,
23060 20 45 4e 43 28 64 62 29 2c 20 7a 43 6f 6c 6c 2c   ENC(db), zColl,
23070 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70 43 6f   0);.    if( pCo
23080 6c 6c 20 29 7b 0a 20 20 20 20 20 20 72 65 69 6e  ll ){.      rein
23090 64 65 78 44 61 74 61 62 61 73 65 73 28 70 50 61  dexDatabases(pPa
230a0 72 73 65 2c 20 7a 43 6f 6c 6c 29 3b 0a 20 20 20  rse, zColl);.   
230b0 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
230c0 28 64 62 2c 20 7a 43 6f 6c 6c 29 3b 0a 20 20 20  (db, zColl);.   
230d0 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d     return;.    }
230e0 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
230f0 65 65 28 64 62 2c 20 7a 43 6f 6c 6c 29 3b 0a 20  ee(db, zColl);. 
23100 20 7d 0a 20 20 69 44 62 20 3d 20 73 71 6c 69 74   }.  iDb = sqlit
23110 65 33 54 77 6f 50 61 72 74 4e 61 6d 65 28 70 50  e3TwoPartName(pP
23120 61 72 73 65 2c 20 70 4e 61 6d 65 31 2c 20 70 4e  arse, pName1, pN
23130 61 6d 65 32 2c 20 26 70 4f 62 6a 4e 61 6d 65 29  ame2, &pObjName)
23140 3b 0a 20 20 69 66 28 20 69 44 62 3c 30 20 29 20  ;.  if( iDb<0 ) 
23150 72 65 74 75 72 6e 3b 0a 20 20 7a 20 3d 20 73 71  return;.  z = sq
23160 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b  lite3NameFromTok
23170 65 6e 28 64 62 2c 20 70 4f 62 6a 4e 61 6d 65 29  en(db, pObjName)
23180 3b 0a 20 20 69 66 28 20 7a 3d 3d 30 20 29 20 72  ;.  if( z==0 ) r
23190 65 74 75 72 6e 3b 0a 20 20 7a 44 62 20 3d 20 64  eturn;.  zDb = d
231a0 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d  b->aDb[iDb].zNam
231b0 65 3b 0a 20 20 70 54 61 62 20 3d 20 73 71 6c 69  e;.  pTab = sqli
231c0 74 65 33 46 69 6e 64 54 61 62 6c 65 28 64 62 2c  te3FindTable(db,
231d0 20 7a 2c 20 7a 44 62 29 3b 0a 20 20 69 66 28 20   z, zDb);.  if( 
231e0 70 54 61 62 20 29 7b 0a 20 20 20 20 72 65 69 6e  pTab ){.    rein
231f0 64 65 78 54 61 62 6c 65 28 70 50 61 72 73 65 2c  dexTable(pParse,
23200 20 70 54 61 62 2c 20 30 29 3b 0a 20 20 20 20 73   pTab, 0);.    s
23210 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
23220 20 7a 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b   z);.    return;
23230 0a 20 20 7d 0a 20 20 70 49 6e 64 65 78 20 3d 20  .  }.  pIndex = 
23240 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 64 65 78  sqlite3FindIndex
23250 28 64 62 2c 20 7a 2c 20 7a 44 62 29 3b 0a 20 20  (db, z, zDb);.  
23260 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
23270 2c 20 7a 29 3b 0a 20 20 69 66 28 20 70 49 6e 64  , z);.  if( pInd
23280 65 78 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ex ){.    sqlite
23290 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61  3BeginWriteOpera
232a0 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 30 2c 20  tion(pParse, 0, 
232b0 69 44 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  iDb);.    sqlite
232c0 33 52 65 66 69 6c 6c 49 6e 64 65 78 28 70 50 61  3RefillIndex(pPa
232d0 72 73 65 2c 20 70 49 6e 64 65 78 2c 20 2d 31 29  rse, pIndex, -1)
232e0 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
232f0 7d 0a 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72  }.  sqlite3Error
23300 4d 73 67 28 70 50 61 72 73 65 2c 20 22 75 6e 61  Msg(pParse, "una
23310 62 6c 65 20 74 6f 20 69 64 65 6e 74 69 66 79 20  ble to identify 
23320 74 68 65 20 6f 62 6a 65 63 74 20 74 6f 20 62 65  the object to be
23330 20 72 65 69 6e 64 65 78 65 64 22 29 3b 0a 7d 0a   reindexed");.}.
23340 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65  #endif../*.** Re
23350 74 75 72 6e 20 61 20 4b 65 79 49 6e 66 6f 20 73  turn a KeyInfo s
23360 74 72 75 63 74 75 72 65 20 74 68 61 74 20 69 73  tructure that is
23370 20 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72   appropriate for
23380 20 74 68 65 20 67 69 76 65 6e 20 49 6e 64 65 78   the given Index
23390 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 4b 65 79 49  ..**.** The KeyI
233a0 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 66 6f  nfo structure fo
233b0 72 20 61 6e 20 69 6e 64 65 78 20 69 73 20 63 61  r an index is ca
233c0 63 68 65 64 20 69 6e 20 74 68 65 20 49 6e 64 65  ched in the Inde
233d0 78 20 6f 62 6a 65 63 74 2e 0a 2a 2a 20 53 6f 20  x object..** So 
233e0 74 68 65 72 65 20 6d 69 67 68 74 20 62 65 20 6d  there might be m
233f0 75 6c 74 69 70 6c 65 20 72 65 66 65 72 65 6e 63  ultiple referenc
23400 65 73 20 74 6f 20 74 68 65 20 72 65 74 75 72 6e  es to the return
23410 65 64 20 70 6f 69 6e 74 65 72 2e 20 20 54 68 65  ed pointer.  The
23420 0a 2a 2a 20 63 61 6c 6c 65 72 20 73 68 6f 75 6c  .** caller shoul
23430 64 20 6e 6f 74 20 74 72 79 20 74 6f 20 6d 6f 64  d not try to mod
23440 69 66 79 20 74 68 65 20 4b 65 79 49 6e 66 6f 20  ify the KeyInfo 
23450 6f 62 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 54 68  object..**.** Th
23460 65 20 63 61 6c 6c 65 72 20 73 68 6f 75 6c 64 20  e caller should 
23470 69 6e 76 6f 6b 65 20 73 71 6c 69 74 65 33 4b 65  invoke sqlite3Ke
23480 79 49 6e 66 6f 55 6e 72 65 66 28 29 20 6f 6e 20  yInfoUnref() on 
23490 74 68 65 20 72 65 74 75 72 6e 65 64 20 6f 62 6a  the returned obj
234a0 65 63 74 0a 2a 2a 20 77 68 65 6e 20 69 74 20 68  ect.** when it h
234b0 61 73 20 66 69 6e 69 73 68 65 64 20 75 73 69 6e  as finished usin
234c0 67 20 69 74 2e 0a 2a 2f 0a 4b 65 79 49 6e 66 6f  g it..*/.KeyInfo
234d0 20 2a 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f   *sqlite3KeyInfo
234e0 4f 66 49 6e 64 65 78 28 50 61 72 73 65 20 2a 70  OfIndex(Parse *p
234f0 50 61 72 73 65 2c 20 49 6e 64 65 78 20 2a 70 49  Parse, Index *pI
23500 64 78 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  dx){.  int i;.  
23510 69 6e 74 20 6e 43 6f 6c 20 3d 20 70 49 64 78 2d  int nCol = pIdx-
23520 3e 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 69 6e 74 20  >nColumn;.  int 
23530 6e 4b 65 79 20 3d 20 70 49 64 78 2d 3e 6e 4b 65  nKey = pIdx->nKe
23540 79 43 6f 6c 3b 0a 20 20 4b 65 79 49 6e 66 6f 20  yCol;.  KeyInfo 
23550 2a 70 4b 65 79 3b 0a 20 20 69 66 28 20 70 50 61  *pKey;.  if( pPa
23560 72 73 65 2d 3e 6e 45 72 72 20 29 20 72 65 74 75  rse->nErr ) retu
23570 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 49 64 78  rn 0;.  if( pIdx
23580 2d 3e 75 6e 69 71 4e 6f 74 4e 75 6c 6c 20 29 7b  ->uniqNotNull ){
23590 0a 20 20 20 20 70 4b 65 79 20 3d 20 73 71 6c 69  .    pKey = sqli
235a0 74 65 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28  te3KeyInfoAlloc(
235b0 70 50 61 72 73 65 2d 3e 64 62 2c 20 6e 4b 65 79  pParse->db, nKey
235c0 2c 20 6e 43 6f 6c 2d 6e 4b 65 79 29 3b 0a 20 20  , nCol-nKey);.  
235d0 7d 65 6c 73 65 7b 0a 20 20 20 20 70 4b 65 79 20  }else{.    pKey 
235e0 3d 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f  = sqlite3KeyInfo
235f0 41 6c 6c 6f 63 28 70 50 61 72 73 65 2d 3e 64 62  Alloc(pParse->db
23600 2c 20 6e 43 6f 6c 2c 20 30 29 3b 0a 20 20 7d 0a  , nCol, 0);.  }.
23610 20 20 69 66 28 20 70 4b 65 79 20 29 7b 0a 20 20    if( pKey ){.  
23620 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
23630 33 4b 65 79 49 6e 66 6f 49 73 57 72 69 74 65 61  3KeyInfoIsWritea
23640 62 6c 65 28 70 4b 65 79 29 20 29 3b 0a 20 20 20  ble(pKey) );.   
23650 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c   for(i=0; i<nCol
23660 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 63 6f  ; i++){.      co
23670 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 20  nst char *zColl 
23680 3d 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 69  = pIdx->azColl[i
23690 5d 3b 0a 20 20 20 20 20 20 70 4b 65 79 2d 3e 61  ];.      pKey->a
236a0 43 6f 6c 6c 5b 69 5d 20 3d 20 7a 43 6f 6c 6c 3d  Coll[i] = zColl=
236b0 3d 73 71 6c 69 74 65 33 53 74 72 42 49 4e 41 52  =sqlite3StrBINAR
236c0 59 20 3f 20 30 20 3a 0a 20 20 20 20 20 20 20 20  Y ? 0 :.        
236d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
236e0 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 43 6f 6c  sqlite3LocateCol
236f0 6c 53 65 71 28 70 50 61 72 73 65 2c 20 7a 43 6f  lSeq(pParse, zCo
23700 6c 6c 29 3b 0a 20 20 20 20 20 20 70 4b 65 79 2d  ll);.      pKey-
23710 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20 3d  >aSortOrder[i] =
23720 20 70 49 64 78 2d 3e 61 53 6f 72 74 4f 72 64 65   pIdx->aSortOrde
23730 72 5b 69 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20  r[i];.    }.    
23740 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  if( pParse->nErr
23750 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
23760 33 4b 65 79 49 6e 66 6f 55 6e 72 65 66 28 70 4b  3KeyInfoUnref(pK
23770 65 79 29 3b 0a 20 20 20 20 20 20 70 4b 65 79 20  ey);.      pKey 
23780 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  = 0;.    }.  }. 
23790 20 72 65 74 75 72 6e 20 70 4b 65 79 3b 0a 7d 0a   return pKey;.}.
237a0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
237b0 4f 4d 49 54 5f 43 54 45 0a 2f 2a 20 0a 2a 2a 20  OMIT_CTE./* .** 
237c0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
237d0 69 6e 76 6f 6b 65 64 20 6f 6e 63 65 20 70 65 72  invoked once per
237e0 20 43 54 45 20 62 79 20 74 68 65 20 70 61 72 73   CTE by the pars
237f0 65 72 20 77 68 69 6c 65 20 70 61 72 73 69 6e 67  er while parsing
23800 20 61 20 0a 2a 2a 20 57 49 54 48 20 63 6c 61 75   a .** WITH clau
23810 73 65 2e 20 0a 2a 2f 0a 57 69 74 68 20 2a 73 71  se. .*/.With *sq
23820 6c 69 74 65 33 57 69 74 68 41 64 64 28 0a 20 20  lite3WithAdd(.  
23830 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
23840 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69          /* Parsi
23850 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
23860 57 69 74 68 20 2a 70 57 69 74 68 2c 20 20 20 20  With *pWith,    
23870 20 20 20 20 20 20 20 20 2f 2a 20 45 78 69 73 74          /* Exist
23880 69 6e 67 20 57 49 54 48 20 63 6c 61 75 73 65 2c  ing WITH clause,
23890 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 54 6f   or NULL */.  To
238a0 6b 65 6e 20 2a 70 4e 61 6d 65 2c 20 20 20 20 20  ken *pName,     
238b0 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
238c0 20 74 68 65 20 63 6f 6d 6d 6f 6e 2d 74 61 62 6c   the common-tabl
238d0 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  e */.  ExprList 
238e0 2a 70 41 72 67 6c 69 73 74 2c 20 20 20 20 20 2f  *pArglist,     /
238f0 2a 20 4f 70 74 69 6f 6e 61 6c 20 63 6f 6c 75 6d  * Optional colum
23900 6e 20 6e 61 6d 65 20 6c 69 73 74 20 66 6f 72 20  n name list for 
23910 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 53  the table */.  S
23920 65 6c 65 63 74 20 2a 70 51 75 65 72 79 20 20 20  elect *pQuery   
23930 20 20 20 20 20 20 20 2f 2a 20 51 75 65 72 79 20         /* Query 
23940 75 73 65 64 20 74 6f 20 69 6e 69 74 69 61 6c 69  used to initiali
23950 7a 65 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a  ze the table */.
23960 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
23970 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
23980 20 57 69 74 68 20 2a 70 4e 65 77 3b 0a 20 20 63   With *pNew;.  c
23990 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 0a 20 20 2f  har *zName;..  /
239a0 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74 68 65  * Check that the
239b0 20 43 54 45 20 6e 61 6d 65 20 69 73 20 75 6e 69   CTE name is uni
239c0 71 75 65 20 77 69 74 68 69 6e 20 74 68 69 73 20  que within this 
239d0 57 49 54 48 20 63 6c 61 75 73 65 2e 20 49 66 0a  WITH clause. If.
239e0 20 20 2a 2a 20 6e 6f 74 2c 20 73 74 6f 72 65 20    ** not, store 
239f0 61 6e 20 65 72 72 6f 72 20 69 6e 20 74 68 65 20  an error in the 
23a00 50 61 72 73 65 20 73 74 72 75 63 74 75 72 65 2e  Parse structure.
23a10 20 2a 2f 0a 20 20 7a 4e 61 6d 65 20 3d 20 73 71   */.  zName = sq
23a20 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b  lite3NameFromTok
23a30 65 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  en(pParse->db, p
23a40 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a 4e 61  Name);.  if( zNa
23a50 6d 65 20 26 26 20 70 57 69 74 68 20 29 7b 0a 20  me && pWith ){. 
23a60 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f     int i;.    fo
23a70 72 28 69 3d 30 3b 20 69 3c 70 57 69 74 68 2d 3e  r(i=0; i<pWith->
23a80 6e 43 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nCte; i++){.    
23a90 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72    if( sqlite3Str
23aa0 49 43 6d 70 28 7a 4e 61 6d 65 2c 20 70 57 69 74  ICmp(zName, pWit
23ab0 68 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d  h->a[i].zName)==
23ac0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  0 ){.        sql
23ad0 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
23ae0 72 73 65 2c 20 22 64 75 70 6c 69 63 61 74 65 20  rse, "duplicate 
23af0 57 49 54 48 20 74 61 62 6c 65 20 6e 61 6d 65 3a  WITH table name:
23b00 20 25 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20   %s", zName);.  
23b10 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
23b20 0a 20 20 69 66 28 20 70 57 69 74 68 20 29 7b 0a  .  if( pWith ){.
23b30 20 20 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20      int nByte = 
23b40 73 69 7a 65 6f 66 28 2a 70 57 69 74 68 29 20 2b  sizeof(*pWith) +
23b50 20 28 73 69 7a 65 6f 66 28 70 57 69 74 68 2d 3e   (sizeof(pWith->
23b60 61 5b 31 5d 29 20 2a 20 70 57 69 74 68 2d 3e 6e  a[1]) * pWith->n
23b70 43 74 65 29 3b 0a 20 20 20 20 70 4e 65 77 20 3d  Cte);.    pNew =
23b80 20 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f   sqlite3DbReallo
23b90 63 28 64 62 2c 20 70 57 69 74 68 2c 20 6e 42 79  c(db, pWith, nBy
23ba0 74 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  te);.  }else{.  
23bb0 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33    pNew = sqlite3
23bc0 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c  DbMallocZero(db,
23bd0 20 73 69 7a 65 6f 66 28 2a 70 57 69 74 68 29 29   sizeof(*pWith))
23be0 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
23bf0 28 70 4e 65 77 21 3d 30 20 26 26 20 7a 4e 61 6d  (pNew!=0 && zNam
23c00 65 21 3d 30 29 20 7c 7c 20 64 62 2d 3e 6d 61 6c  e!=0) || db->mal
23c10 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 0a 20 20  locFailed );..  
23c20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
23c30 69 6c 65 64 20 29 7b 0a 20 20 20 20 73 71 6c 69  iled ){.    sqli
23c40 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
23c50 65 28 64 62 2c 20 70 41 72 67 6c 69 73 74 29 3b  e(db, pArglist);
23c60 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65  .    sqlite3Sele
23c70 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70 51 75  ctDelete(db, pQu
23c80 65 72 79 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ery);.    sqlite
23c90 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4e 61 6d  3DbFree(db, zNam
23ca0 65 29 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20 70  e);.    pNew = p
23cb0 57 69 74 68 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  With;.  }else{. 
23cc0 20 20 20 70 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d     pNew->a[pNew-
23cd0 3e 6e 43 74 65 5d 2e 70 53 65 6c 65 63 74 20 3d  >nCte].pSelect =
23ce0 20 70 51 75 65 72 79 3b 0a 20 20 20 20 70 4e 65   pQuery;.    pNe
23cf0 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e 43 74 65 5d  w->a[pNew->nCte]
23d00 2e 70 43 6f 6c 73 20 3d 20 70 41 72 67 6c 69 73  .pCols = pArglis
23d10 74 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 61 5b 70  t;.    pNew->a[p
23d20 4e 65 77 2d 3e 6e 43 74 65 5d 2e 7a 4e 61 6d 65  New->nCte].zName
23d30 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20 20 20 70 4e   = zName;.    pN
23d40 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e 43 74 65  ew->a[pNew->nCte
23d50 5d 2e 7a 43 74 65 45 72 72 20 3d 20 30 3b 0a 20  ].zCteErr = 0;. 
23d60 20 20 20 70 4e 65 77 2d 3e 6e 43 74 65 2b 2b 3b     pNew->nCte++;
23d70 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70  .  }..  return p
23d80 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72  New;.}../*.** Fr
23d90 65 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  ee the contents 
23da0 6f 66 20 74 68 65 20 57 69 74 68 20 6f 62 6a 65  of the With obje
23db0 63 74 20 70 61 73 73 65 64 20 61 73 20 74 68 65  ct passed as the
23dc0 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
23dd0 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
23de0 33 57 69 74 68 44 65 6c 65 74 65 28 73 71 6c 69  3WithDelete(sqli
23df0 74 65 33 20 2a 64 62 2c 20 57 69 74 68 20 2a 70  te3 *db, With *p
23e00 57 69 74 68 29 7b 0a 20 20 69 66 28 20 70 57 69  With){.  if( pWi
23e10 74 68 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b  th ){.    int i;
23e20 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
23e30 70 57 69 74 68 2d 3e 6e 43 74 65 3b 20 69 2b 2b  pWith->nCte; i++
23e40 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20  ){.      struct 
23e50 43 74 65 20 2a 70 43 74 65 20 3d 20 26 70 57 69  Cte *pCte = &pWi
23e60 74 68 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 20 20  th->a[i];.      
23e70 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
23e80 65 6c 65 74 65 28 64 62 2c 20 70 43 74 65 2d 3e  elete(db, pCte->
23e90 70 43 6f 6c 73 29 3b 0a 20 20 20 20 20 20 73 71  pCols);.      sq
23ea0 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74  lite3SelectDelet
23eb0 65 28 64 62 2c 20 70 43 74 65 2d 3e 70 53 65 6c  e(db, pCte->pSel
23ec0 65 63 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ect);.      sqli
23ed0 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 43  te3DbFree(db, pC
23ee0 74 65 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  te->zName);.    
23ef0 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  }.    sqlite3DbF
23f00 72 65 65 28 64 62 2c 20 70 57 69 74 68 29 3b 0a  ree(db, pWith);.
23f10 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20    }.}.#endif /* 
23f20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
23f30 4f 4d 49 54 5f 43 54 45 29 20 2a 2f 0a           OMIT_CTE) */.