/ Hex Artifact Content
Login

Artifact d32cacbb59a403b68e1c2ec962ca31b6f3aad4fc:


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 3d 3d 30 20 7c 7c 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 44 62 53 4e 61 6d 65 29 3d 3d 30  [j].zDbSName)==0
28e0: 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
28f0: 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d  ( sqlite3SchemaM
2900: 75 74 65 78 48 65 6c 64 28 64 62 2c 20 6a 2c 20  utexHeld(db, j, 
2910: 30 29 20 29 3b 0a 20 20 20 20 20 20 70 20 3d 20  0) );.      p = 
2920: 73 71 6c 69 74 65 33 48 61 73 68 46 69 6e 64 28  sqlite3HashFind(
2930: 26 64 62 2d 3e 61 44 62 5b 6a 5d 2e 70 53 63 68  &db->aDb[j].pSch
2940: 65 6d 61 2d 3e 74 62 6c 48 61 73 68 2c 20 7a 4e  ema->tblHash, zN
2950: 61 6d 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ame);.      if( 
2960: 70 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d  p ) break;.    }
2970: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b  .  }.  return p;
2980: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61 74 65  .}../*.** Locate
2990: 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 73   the in-memory s
29a0: 74 72 75 63 74 75 72 65 20 74 68 61 74 20 64 65  tructure that de
29b0: 73 63 72 69 62 65 73 20 61 20 70 61 72 74 69 63  scribes a partic
29c0: 75 6c 61 72 20 64 61 74 61 62 61 73 65 0a 2a 2a  ular database.**
29d0: 20 74 61 62 6c 65 20 67 69 76 65 6e 20 74 68 65   table given the
29e0: 20 6e 61 6d 65 20 6f 66 20 74 68 61 74 20 74 61   name of that ta
29f0: 62 6c 65 20 61 6e 64 20 28 6f 70 74 69 6f 6e 61  ble and (optiona
2a00: 6c 6c 79 29 20 74 68 65 20 6e 61 6d 65 20 6f 66  lly) the name of
2a10: 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65   the.** database
2a20: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
2a30: 74 61 62 6c 65 2e 20 20 52 65 74 75 72 6e 20 4e  table.  Return N
2a40: 55 4c 4c 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64  ULL if not found
2a50: 2e 20 20 41 6c 73 6f 20 6c 65 61 76 65 20 61 6e  .  Also leave an
2a60: 0a 2a 2a 20 65 72 72 6f 72 20 6d 65 73 73 61 67  .** error messag
2a70: 65 20 69 6e 20 70 50 61 72 73 65 2d 3e 7a 45 72  e in pParse->zEr
2a80: 72 4d 73 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  rMsg..**.** The 
2a90: 64 69 66 66 65 72 65 6e 63 65 20 62 65 74 77 65  difference betwe
2aa0: 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
2ab0: 61 6e 64 20 73 71 6c 69 74 65 33 46 69 6e 64 54  and sqlite3FindT
2ac0: 61 62 6c 65 28 29 20 69 73 20 74 68 61 74 20 74  able() is that t
2ad0: 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 6c  his.** routine l
2ae0: 65 61 76 65 73 20 61 6e 20 65 72 72 6f 72 20 6d  eaves an error m
2af0: 65 73 73 61 67 65 20 69 6e 20 70 50 61 72 73 65  essage in pParse
2b00: 2d 3e 7a 45 72 72 4d 73 67 20 77 68 65 72 65 0a  ->zErrMsg where.
2b10: 2a 2a 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61  ** sqlite3FindTa
2b20: 62 6c 65 28 29 20 64 6f 65 73 20 6e 6f 74 2e 0a  ble() does not..
2b30: 2a 2f 0a 54 61 62 6c 65 20 2a 73 71 6c 69 74 65  */.Table *sqlite
2b40: 33 4c 6f 63 61 74 65 54 61 62 6c 65 28 0a 20 20  3LocateTable(.  
2b50: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
2b60: 20 20 20 20 20 20 20 2f 2a 20 63 6f 6e 74 65 78         /* contex
2b70: 74 20 69 6e 20 77 68 69 63 68 20 74 6f 20 72 65  t in which to re
2b80: 70 6f 72 74 20 65 72 72 6f 72 73 20 2a 2f 0a 20  port errors */. 
2b90: 20 75 33 32 20 66 6c 61 67 73 2c 20 20 20 20 20   u32 flags,     
2ba0: 20 20 20 20 20 20 20 20 2f 2a 20 4c 4f 43 41 54          /* LOCAT
2bb0: 45 5f 56 49 45 57 20 6f 72 20 4c 4f 43 41 54 45  E_VIEW or LOCATE
2bc0: 5f 4e 4f 45 52 52 20 2a 2f 0a 20 20 63 6f 6e 73  _NOERR */.  cons
2bd0: 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 20  t char *zName,  
2be0: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
2bf0: 65 20 74 61 62 6c 65 20 77 65 20 61 72 65 20 6c  e table we are l
2c00: 6f 6f 6b 69 6e 67 20 66 6f 72 20 2a 2f 0a 20 20  ooking for */.  
2c10: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 61  const char *zDba
2c20: 73 65 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f  se     /* Name o
2c30: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  f the database. 
2c40: 20 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a   Might be NULL *
2c50: 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b  /.){.  Table *p;
2c60: 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20  ..  /* Read the 
2c70: 64 61 74 61 62 61 73 65 20 73 63 68 65 6d 61 2e  database schema.
2c80: 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
2c90: 75 72 73 2c 20 6c 65 61 76 65 20 61 6e 20 65 72  urs, leave an er
2ca0: 72 6f 72 20 6d 65 73 73 61 67 65 0a 20 20 2a 2a  ror message.  **
2cb0: 20 61 6e 64 20 63 6f 64 65 20 69 6e 20 70 50 61   and code in pPa
2cc0: 72 73 65 20 61 6e 64 20 72 65 74 75 72 6e 20 4e  rse and return N
2cd0: 55 4c 4c 2e 20 2a 2f 0a 20 20 69 66 28 20 53 51  ULL. */.  if( SQ
2ce0: 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33  LITE_OK!=sqlite3
2cf0: 52 65 61 64 53 63 68 65 6d 61 28 70 50 61 72 73  ReadSchema(pPars
2d00: 65 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  e) ){.    return
2d10: 20 30 3b 0a 20 20 7d 0a 0a 20 20 70 20 3d 20 73   0;.  }..  p = s
2d20: 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28  qlite3FindTable(
2d30: 70 50 61 72 73 65 2d 3e 64 62 2c 20 7a 4e 61 6d  pParse->db, zNam
2d40: 65 2c 20 7a 44 62 61 73 65 29 3b 0a 20 20 69 66  e, zDbase);.  if
2d50: 28 20 70 3d 3d 30 20 29 7b 0a 20 20 20 20 63 6f  ( p==0 ){.    co
2d60: 6e 73 74 20 63 68 61 72 20 2a 7a 4d 73 67 20 3d  nst char *zMsg =
2d70: 20 66 6c 61 67 73 20 26 20 4c 4f 43 41 54 45 5f   flags & LOCATE_
2d80: 56 49 45 57 20 3f 20 22 6e 6f 20 73 75 63 68 20  VIEW ? "no such 
2d90: 76 69 65 77 22 20 3a 20 22 6e 6f 20 73 75 63 68  view" : "no such
2da0: 20 74 61 62 6c 65 22 3b 0a 23 69 66 6e 64 65 66   table";.#ifndef
2db0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
2dc0: 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 69 66  TUALTABLE.    if
2dd0: 28 20 73 71 6c 69 74 65 33 46 69 6e 64 44 62 4e  ( sqlite3FindDbN
2de0: 61 6d 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ame(pParse->db, 
2df0: 7a 44 62 61 73 65 29 3c 31 20 29 7b 0a 20 20 20  zDbase)<1 ){.   
2e00: 20 20 20 2f 2a 20 49 66 20 7a 4e 61 6d 65 20 69     /* If zName i
2e10: 73 20 74 68 65 20 6e 6f 74 20 74 68 65 20 6e 61  s the not the na
2e20: 6d 65 20 6f 66 20 61 20 74 61 62 6c 65 20 69 6e  me of a table in
2e30: 20 74 68 65 20 73 63 68 65 6d 61 20 63 72 65 61   the schema crea
2e40: 74 65 64 20 75 73 69 6e 67 0a 20 20 20 20 20 20  ted using.      
2e50: 2a 2a 20 43 52 45 41 54 45 2c 20 74 68 65 6e 20  ** CREATE, then 
2e60: 63 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  check to see if 
2e70: 69 74 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f  it is the name o
2e80: 66 20 61 6e 20 76 69 72 74 75 61 6c 20 74 61 62  f an virtual tab
2e90: 6c 65 20 74 68 61 74 0a 20 20 20 20 20 20 2a 2a  le that.      **
2ea0: 20 63 61 6e 20 62 65 20 61 6e 20 65 70 6f 6e 79   can be an epony
2eb0: 6d 6f 75 73 20 76 69 72 74 75 61 6c 20 74 61 62  mous virtual tab
2ec0: 6c 65 2e 20 2a 2f 0a 20 20 20 20 20 20 4d 6f 64  le. */.      Mod
2ed0: 75 6c 65 20 2a 70 4d 6f 64 20 3d 20 28 4d 6f 64  ule *pMod = (Mod
2ee0: 75 6c 65 2a 29 73 71 6c 69 74 65 33 48 61 73 68  ule*)sqlite3Hash
2ef0: 46 69 6e 64 28 26 70 50 61 72 73 65 2d 3e 64 62  Find(&pParse->db
2f00: 2d 3e 61 4d 6f 64 75 6c 65 2c 20 7a 4e 61 6d 65  ->aModule, zName
2f10: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4d 6f  );.      if( pMo
2f20: 64 20 26 26 20 73 71 6c 69 74 65 33 56 74 61 62  d && sqlite3Vtab
2f30: 45 70 6f 6e 79 6d 6f 75 73 54 61 62 6c 65 49 6e  EponymousTableIn
2f40: 69 74 28 70 50 61 72 73 65 2c 20 70 4d 6f 64 29  it(pParse, pMod)
2f50: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
2f60: 72 6e 20 70 4d 6f 64 2d 3e 70 45 70 6f 54 61 62  rn pMod->pEpoTab
2f70: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
2f80: 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20 28  #endif.    if( (
2f90: 66 6c 61 67 73 20 26 20 4c 4f 43 41 54 45 5f 4e  flags & LOCATE_N
2fa0: 4f 45 52 52 29 3d 3d 30 20 29 7b 0a 20 20 20 20  OERR)==0 ){.    
2fb0: 20 20 69 66 28 20 7a 44 62 61 73 65 20 29 7b 0a    if( zDbase ){.
2fc0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
2fd0: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
2fe0: 22 25 73 3a 20 25 73 2e 25 73 22 2c 20 7a 4d 73  "%s: %s.%s", zMs
2ff0: 67 2c 20 7a 44 62 61 73 65 2c 20 7a 4e 61 6d 65  g, zDbase, zName
3000: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
3010: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
3020: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
3030: 22 25 73 3a 20 25 73 22 2c 20 7a 4d 73 67 2c 20  "%s: %s", zMsg, 
3040: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a  zName);.      }.
3050: 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 63 68        pParse->ch
3060: 65 63 6b 53 63 68 65 6d 61 20 3d 20 31 3b 0a 20  eckSchema = 1;. 
3070: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75     }.  }..  retu
3080: 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c  rn p;.}../*.** L
3090: 6f 63 61 74 65 20 74 68 65 20 74 61 62 6c 65 20  ocate the table 
30a0: 69 64 65 6e 74 69 66 69 65 64 20 62 79 20 2a 70  identified by *p
30b0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20  ..**.** This is 
30c0: 61 20 77 72 61 70 70 65 72 20 61 72 6f 75 6e 64  a wrapper around
30d0: 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61   sqlite3LocateTa
30e0: 62 6c 65 28 29 2e 20 54 68 65 20 64 69 66 66 65  ble(). The diffe
30f0: 72 65 6e 63 65 20 62 65 74 77 65 65 6e 0a 2a 2a  rence between.**
3100: 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61   sqlite3LocateTa
3110: 62 6c 65 28 29 20 61 6e 64 20 74 68 69 73 20 66  ble() and this f
3120: 75 6e 63 74 69 6f 6e 20 69 73 20 74 68 61 74 20  unction is that 
3130: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  this function re
3140: 73 74 72 69 63 74 73 0a 2a 2a 20 74 68 65 20 73  stricts.** the s
3150: 65 61 72 63 68 20 74 6f 20 73 63 68 65 6d 61 20  earch to schema 
3160: 28 70 2d 3e 70 53 63 68 65 6d 61 29 20 69 66 20  (p->pSchema) if 
3170: 69 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2e 20  it is not NULL. 
3180: 70 2d 3e 70 53 63 68 65 6d 61 20 6d 61 79 20 62  p->pSchema may b
3190: 65 0a 2a 2a 20 6e 6f 6e 2d 4e 55 4c 4c 20 69 66  e.** non-NULL if
31a0: 20 69 74 20 69 73 20 70 61 72 74 20 6f 66 20 61   it is part of a
31b0: 20 76 69 65 77 20 6f 72 20 74 72 69 67 67 65 72   view or trigger
31c0: 20 70 72 6f 67 72 61 6d 20 64 65 66 69 6e 69 74   program definit
31d0: 69 6f 6e 2e 20 53 65 65 0a 2a 2a 20 73 71 6c 69  ion. See.** sqli
31e0: 74 65 33 46 69 78 53 72 63 4c 69 73 74 28 29 20  te3FixSrcList() 
31f0: 66 6f 72 20 64 65 74 61 69 6c 73 2e 0a 2a 2f 0a  for details..*/.
3200: 54 61 62 6c 65 20 2a 73 71 6c 69 74 65 33 4c 6f  Table *sqlite3Lo
3210: 63 61 74 65 54 61 62 6c 65 49 74 65 6d 28 0a 20  cateTableItem(. 
3220: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
3230: 0a 20 20 75 33 32 20 66 6c 61 67 73 2c 0a 20 20  .  u32 flags,.  
3240: 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
3250: 74 65 6d 20 2a 70 0a 29 7b 0a 20 20 63 6f 6e 73  tem *p.){.  cons
3260: 74 20 63 68 61 72 20 2a 7a 44 62 3b 0a 20 20 61  t char *zDb;.  a
3270: 73 73 65 72 74 28 20 70 2d 3e 70 53 63 68 65 6d  ssert( p->pSchem
3280: 61 3d 3d 30 20 7c 7c 20 70 2d 3e 7a 44 61 74 61  a==0 || p->zData
3290: 62 61 73 65 3d 3d 30 20 29 3b 0a 20 20 69 66 28  base==0 );.  if(
32a0: 20 70 2d 3e 70 53 63 68 65 6d 61 20 29 7b 0a 20   p->pSchema ){. 
32b0: 20 20 20 69 6e 74 20 69 44 62 20 3d 20 73 71 6c     int iDb = sql
32c0: 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65  ite3SchemaToInde
32d0: 78 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 2d  x(pParse->db, p-
32e0: 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 7a  >pSchema);.    z
32f0: 44 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d  Db = pParse->db-
3300: 3e 61 44 62 5b 69 44 62 5d 2e 7a 44 62 53 4e 61  >aDb[iDb].zDbSNa
3310: 6d 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  me;.  }else{.   
3320: 20 7a 44 62 20 3d 20 70 2d 3e 7a 44 61 74 61 62   zDb = p->zDatab
3330: 61 73 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ase;.  }.  retur
3340: 6e 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54  n sqlite3LocateT
3350: 61 62 6c 65 28 70 50 61 72 73 65 2c 20 66 6c 61  able(pParse, fla
3360: 67 73 2c 20 70 2d 3e 7a 4e 61 6d 65 2c 20 7a 44  gs, p->zName, zD
3370: 62 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63  b);.}../*.** Loc
3380: 61 74 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72  ate the in-memor
3390: 79 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74  y structure that
33a0: 20 64 65 73 63 72 69 62 65 73 20 0a 2a 2a 20 61   describes .** a
33b0: 20 70 61 72 74 69 63 75 6c 61 72 20 69 6e 64 65   particular inde
33c0: 78 20 67 69 76 65 6e 20 74 68 65 20 6e 61 6d 65  x given the name
33d0: 20 6f 66 20 74 68 61 74 20 69 6e 64 65 78 0a 2a   of that index.*
33e0: 2a 20 61 6e 64 20 74 68 65 20 6e 61 6d 65 20 6f  * and the name o
33f0: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74  f the database t
3400: 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  hat contains the
3410: 20 69 6e 64 65 78 2e 0a 2a 2a 20 52 65 74 75 72   index..** Retur
3420: 6e 20 4e 55 4c 4c 20 69 66 20 6e 6f 74 20 66 6f  n NULL if not fo
3430: 75 6e 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 44  und..**.** If zD
3440: 61 74 61 62 61 73 65 20 69 73 20 30 2c 20 61 6c  atabase is 0, al
3450: 6c 20 64 61 74 61 62 61 73 65 73 20 61 72 65 20  l databases are 
3460: 73 65 61 72 63 68 65 64 20 66 6f 72 20 74 68 65  searched for the
3470: 0a 2a 2a 20 74 61 62 6c 65 20 61 6e 64 20 74 68  .** table and th
3480: 65 20 66 69 72 73 74 20 6d 61 74 63 68 69 6e 67  e first matching
3490: 20 69 6e 64 65 78 20 69 73 20 72 65 74 75 72 6e   index is return
34a0: 65 64 2e 20 20 28 4e 6f 20 63 68 65 63 6b 69 6e  ed.  (No checkin
34b0: 67 0a 2a 2a 20 66 6f 72 20 64 75 70 6c 69 63 61  g.** for duplica
34c0: 74 65 20 69 6e 64 65 78 20 6e 61 6d 65 73 20 69  te index names i
34d0: 73 20 64 6f 6e 65 2e 29 20 20 54 68 65 20 73 65  s done.)  The se
34e0: 61 72 63 68 20 6f 72 64 65 72 20 69 73 0a 2a 2a  arch order is.**
34f0: 20 54 45 4d 50 20 66 69 72 73 74 2c 20 74 68 65   TEMP first, the
3500: 6e 20 4d 41 49 4e 2c 20 74 68 65 6e 20 61 6e 79  n MAIN, then any
3510: 20 61 75 78 69 6c 69 61 72 79 20 64 61 74 61 62   auxiliary datab
3520: 61 73 65 73 20 61 64 64 65 64 0a 2a 2a 20 75 73  ases added.** us
3530: 69 6e 67 20 74 68 65 20 41 54 54 41 43 48 20 63  ing the ATTACH c
3540: 6f 6d 6d 61 6e 64 2e 0a 2a 2f 0a 49 6e 64 65 78  ommand..*/.Index
3550: 20 2a 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 64   *sqlite3FindInd
3560: 65 78 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  ex(sqlite3 *db, 
3570: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
3580: 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  e, const char *z
3590: 44 62 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 20  Db){.  Index *p 
35a0: 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  = 0;.  int i;.  
35b0: 2f 2a 20 41 6c 6c 20 6d 75 74 65 78 65 73 20 61  /* All mutexes a
35c0: 72 65 20 72 65 71 75 69 72 65 64 20 66 6f 72 20  re required for 
35d0: 73 63 68 65 6d 61 20 61 63 63 65 73 73 2e 20 20  schema access.  
35e0: 4d 61 6b 65 20 73 75 72 65 20 77 65 20 68 6f 6c  Make sure we hol
35f0: 64 20 74 68 65 6d 2e 20 2a 2f 0a 20 20 61 73 73  d them. */.  ass
3600: 65 72 74 28 20 7a 44 62 21 3d 30 20 7c 7c 20 73  ert( zDb!=0 || s
3610: 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73  qlite3BtreeHolds
3620: 41 6c 6c 4d 75 74 65 78 65 73 28 64 62 29 20 29  AllMutexes(db) )
3630: 3b 0a 20 20 66 6f 72 28 69 3d 4f 4d 49 54 5f 54  ;.  for(i=OMIT_T
3640: 45 4d 50 44 42 3b 20 69 3c 64 62 2d 3e 6e 44 62  EMPDB; i<db->nDb
3650: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20  ; i++){.    int 
3660: 6a 20 3d 20 28 69 3c 32 29 20 3f 20 69 5e 31 20  j = (i<2) ? i^1 
3670: 3a 20 69 3b 20 20 2f 2a 20 53 65 61 72 63 68 20  : i;  /* Search 
3680: 54 45 4d 50 20 62 65 66 6f 72 65 20 4d 41 49 4e  TEMP before MAIN
3690: 20 2a 2f 0a 20 20 20 20 53 63 68 65 6d 61 20 2a   */.    Schema *
36a0: 70 53 63 68 65 6d 61 20 3d 20 64 62 2d 3e 61 44  pSchema = db->aD
36b0: 62 5b 6a 5d 2e 70 53 63 68 65 6d 61 3b 0a 20 20  b[j].pSchema;.  
36c0: 20 20 61 73 73 65 72 74 28 20 70 53 63 68 65 6d    assert( pSchem
36d0: 61 20 29 3b 0a 20 20 20 20 69 66 28 20 7a 44 62  a );.    if( zDb
36e0: 20 26 26 20 73 71 6c 69 74 65 33 53 74 72 49 43   && sqlite3StrIC
36f0: 6d 70 28 7a 44 62 2c 20 64 62 2d 3e 61 44 62 5b  mp(zDb, db->aDb[
3700: 6a 5d 2e 7a 44 62 53 4e 61 6d 65 29 20 29 20 63  j].zDbSName) ) c
3710: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 61 73 73  ontinue;.    ass
3720: 65 72 74 28 20 73 71 6c 69 74 65 33 53 63 68 65  ert( sqlite3Sche
3730: 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20  maMutexHeld(db, 
3740: 6a 2c 20 30 29 20 29 3b 0a 20 20 20 20 70 20 3d  j, 0) );.    p =
3750: 20 73 71 6c 69 74 65 33 48 61 73 68 46 69 6e 64   sqlite3HashFind
3760: 28 26 70 53 63 68 65 6d 61 2d 3e 69 64 78 48 61  (&pSchema->idxHa
3770: 73 68 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  sh, zName);.    
3780: 69 66 28 20 70 20 29 20 62 72 65 61 6b 3b 0a 20  if( p ) break;. 
3790: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d   }.  return p;.}
37a0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6c 61 69 6d 20  ../*.** Reclaim 
37b0: 74 68 65 20 6d 65 6d 6f 72 79 20 75 73 65 64 20  the memory used 
37c0: 62 79 20 61 6e 20 69 6e 64 65 78 0a 2a 2f 0a 73  by an index.*/.s
37d0: 74 61 74 69 63 20 76 6f 69 64 20 66 72 65 65 49  tatic void freeI
37e0: 6e 64 65 78 28 73 71 6c 69 74 65 33 20 2a 64 62  ndex(sqlite3 *db
37f0: 2c 20 49 6e 64 65 78 20 2a 70 29 7b 0a 23 69 66  , Index *p){.#if
3800: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
3810: 5f 41 4e 41 4c 59 5a 45 0a 20 20 73 71 6c 69 74  _ANALYZE.  sqlit
3820: 65 33 44 65 6c 65 74 65 49 6e 64 65 78 53 61 6d  e3DeleteIndexSam
3830: 70 6c 65 73 28 64 62 2c 20 70 29 3b 0a 23 65 6e  ples(db, p);.#en
3840: 64 69 66 0a 20 20 73 71 6c 69 74 65 33 45 78 70  dif.  sqlite3Exp
3850: 72 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70  rDelete(db, p->p
3860: 50 61 72 74 49 64 78 57 68 65 72 65 29 3b 0a 20  PartIdxWhere);. 
3870: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
3880: 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 61 43  Delete(db, p->aC
3890: 6f 6c 45 78 70 72 29 3b 0a 20 20 73 71 6c 69 74  olExpr);.  sqlit
38a0: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e  e3DbFree(db, p->
38b0: 7a 43 6f 6c 41 66 66 29 3b 0a 20 20 69 66 28 20  zColAff);.  if( 
38c0: 70 2d 3e 69 73 52 65 73 69 7a 65 64 20 29 20 73  p->isResized ) s
38d0: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
38e0: 20 28 76 6f 69 64 20 2a 29 70 2d 3e 61 7a 43 6f   (void *)p->azCo
38f0: 6c 6c 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  ll);.#ifdef SQLI
3900: 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f  TE_ENABLE_STAT3_
3910: 4f 52 5f 53 54 41 54 34 0a 20 20 73 71 6c 69 74  OR_STAT4.  sqlit
3920: 65 33 5f 66 72 65 65 28 70 2d 3e 61 69 52 6f 77  e3_free(p->aiRow
3930: 45 73 74 29 3b 0a 23 65 6e 64 69 66 0a 20 20 73  Est);.#endif.  s
3940: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
3950: 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6f   p);.}../*.** Fo
3960: 72 20 74 68 65 20 69 6e 64 65 78 20 63 61 6c 6c  r the index call
3970: 65 64 20 7a 49 64 78 4e 61 6d 65 20 77 68 69 63  ed zIdxName whic
3980: 68 20 69 73 20 66 6f 75 6e 64 20 69 6e 20 74 68  h is found in th
3990: 65 20 64 61 74 61 62 61 73 65 20 69 44 62 2c 0a  e database iDb,.
39a0: 2a 2a 20 75 6e 6c 69 6b 65 20 74 68 61 74 20 69  ** unlike that i
39b0: 6e 64 65 78 20 66 72 6f 6d 20 69 74 73 20 54 61  ndex from its Ta
39c0: 62 6c 65 20 74 68 65 6e 20 72 65 6d 6f 76 65 20  ble then remove 
39d0: 74 68 65 20 69 6e 64 65 78 20 66 72 6f 6d 0a 2a  the index from.*
39e0: 2a 20 74 68 65 20 69 6e 64 65 78 20 68 61 73 68  * the index hash
39f0: 20 74 61 62 6c 65 20 61 6e 64 20 66 72 65 65 20   table and free 
3a00: 61 6c 6c 20 6d 65 6d 6f 72 79 20 73 74 72 75 63  all memory struc
3a10: 74 75 72 65 73 20 61 73 73 6f 63 69 61 74 65 64  tures associated
3a20: 0a 2a 2a 20 77 69 74 68 20 74 68 65 20 69 6e 64  .** with the ind
3a30: 65 78 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ex..*/.void sqli
3a40: 74 65 33 55 6e 6c 69 6e 6b 41 6e 64 44 65 6c 65  te3UnlinkAndDele
3a50: 74 65 49 6e 64 65 78 28 73 71 6c 69 74 65 33 20  teIndex(sqlite3 
3a60: 2a 64 62 2c 20 69 6e 74 20 69 44 62 2c 20 63 6f  *db, int iDb, co
3a70: 6e 73 74 20 63 68 61 72 20 2a 7a 49 64 78 4e 61  nst char *zIdxNa
3a80: 6d 65 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 49  me){.  Index *pI
3a90: 6e 64 65 78 3b 0a 20 20 48 61 73 68 20 2a 70 48  ndex;.  Hash *pH
3aa0: 61 73 68 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  ash;..  assert( 
3ab0: 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74  sqlite3SchemaMut
3ac0: 65 78 48 65 6c 64 28 64 62 2c 20 69 44 62 2c 20  exHeld(db, iDb, 
3ad0: 30 29 20 29 3b 0a 20 20 70 48 61 73 68 20 3d 20  0) );.  pHash = 
3ae0: 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53  &db->aDb[iDb].pS
3af0: 63 68 65 6d 61 2d 3e 69 64 78 48 61 73 68 3b 0a  chema->idxHash;.
3b00: 20 20 70 49 6e 64 65 78 20 3d 20 73 71 6c 69 74    pIndex = sqlit
3b10: 65 33 48 61 73 68 49 6e 73 65 72 74 28 70 48 61  e3HashInsert(pHa
3b20: 73 68 2c 20 7a 49 64 78 4e 61 6d 65 2c 20 30 29  sh, zIdxName, 0)
3b30: 3b 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28 70  ;.  if( ALWAYS(p
3b40: 49 6e 64 65 78 29 20 29 7b 0a 20 20 20 20 69 66  Index) ){.    if
3b50: 28 20 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65  ( pIndex->pTable
3b60: 2d 3e 70 49 6e 64 65 78 3d 3d 70 49 6e 64 65 78  ->pIndex==pIndex
3b70: 20 29 7b 0a 20 20 20 20 20 20 70 49 6e 64 65 78   ){.      pIndex
3b80: 2d 3e 70 54 61 62 6c 65 2d 3e 70 49 6e 64 65 78  ->pTable->pIndex
3b90: 20 3d 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74   = pIndex->pNext
3ba0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
3bb0: 20 20 20 49 6e 64 65 78 20 2a 70 3b 0a 20 20 20     Index *p;.   
3bc0: 20 20 20 2f 2a 20 4a 75 73 74 69 66 69 63 61 74     /* Justificat
3bd0: 69 6f 6e 20 6f 66 20 41 4c 57 41 59 53 28 29 3b  ion of ALWAYS();
3be0: 20 20 54 68 65 20 69 6e 64 65 78 20 6d 75 73 74    The index must
3bf0: 20 62 65 20 6f 6e 20 74 68 65 20 6c 69 73 74 20   be on the list 
3c00: 6f 66 0a 20 20 20 20 20 20 2a 2a 20 69 6e 64 69  of.      ** indi
3c10: 63 65 73 2e 20 2a 2f 0a 20 20 20 20 20 20 70 20  ces. */.      p 
3c20: 3d 20 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65  = pIndex->pTable
3c30: 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20 20 20 20  ->pIndex;.      
3c40: 77 68 69 6c 65 28 20 41 4c 57 41 59 53 28 70 29  while( ALWAYS(p)
3c50: 20 26 26 20 70 2d 3e 70 4e 65 78 74 21 3d 70 49   && p->pNext!=pI
3c60: 6e 64 65 78 20 29 7b 20 70 20 3d 20 70 2d 3e 70  ndex ){ p = p->p
3c70: 4e 65 78 74 3b 20 7d 0a 20 20 20 20 20 20 69 66  Next; }.      if
3c80: 28 20 41 4c 57 41 59 53 28 70 20 26 26 20 70 2d  ( ALWAYS(p && p-
3c90: 3e 70 4e 65 78 74 3d 3d 70 49 6e 64 65 78 29 20  >pNext==pIndex) 
3ca0: 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 70 4e  ){.        p->pN
3cb0: 65 78 74 20 3d 20 70 49 6e 64 65 78 2d 3e 70 4e  ext = pIndex->pN
3cc0: 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ext;.      }.   
3cd0: 20 7d 0a 20 20 20 20 66 72 65 65 49 6e 64 65 78   }.    freeIndex
3ce0: 28 64 62 2c 20 70 49 6e 64 65 78 29 3b 0a 20 20  (db, pIndex);.  
3cf0: 7d 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d  }.  db->flags |=
3d00: 20 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68   SQLITE_InternCh
3d10: 61 6e 67 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  anges;.}../*.** 
3d20: 4c 6f 6f 6b 20 74 68 72 6f 75 67 68 20 74 68 65  Look through the
3d30: 20 6c 69 73 74 20 6f 66 20 6f 70 65 6e 20 64 61   list of open da
3d40: 74 61 62 61 73 65 20 66 69 6c 65 73 20 69 6e 20  tabase files in 
3d50: 64 62 2d 3e 61 44 62 5b 5d 20 61 6e 64 20 69 66  db->aDb[] and if
3d60: 0a 2a 2a 20 61 6e 79 20 68 61 76 65 20 62 65 65  .** any have bee
3d70: 6e 20 63 6c 6f 73 65 64 2c 20 72 65 6d 6f 76 65  n closed, remove
3d80: 20 74 68 65 6d 20 66 72 6f 6d 20 74 68 65 20 6c   them from the l
3d90: 69 73 74 2e 20 20 52 65 61 6c 6c 6f 63 61 74 65  ist.  Reallocate
3da0: 20 74 68 65 0a 2a 2a 20 64 62 2d 3e 61 44 62 5b   the.** db->aDb[
3db0: 5d 20 73 74 72 75 63 74 75 72 65 20 74 6f 20 61  ] structure to a
3dc0: 20 73 6d 61 6c 6c 65 72 20 73 69 7a 65 2c 20 69   smaller size, i
3dd0: 66 20 70 6f 73 73 69 62 6c 65 2e 0a 2a 2a 0a 2a  f possible..**.*
3de0: 2a 20 45 6e 74 72 79 20 30 20 28 74 68 65 20 22  * Entry 0 (the "
3df0: 6d 61 69 6e 22 20 64 61 74 61 62 61 73 65 29 20  main" database) 
3e00: 61 6e 64 20 65 6e 74 72 79 20 31 20 28 74 68 65  and entry 1 (the
3e10: 20 22 74 65 6d 70 22 20 64 61 74 61 62 61 73 65   "temp" database
3e20: 29 0a 2a 2a 20 61 72 65 20 6e 65 76 65 72 20 63  ).** are never c
3e30: 61 6e 64 69 64 61 74 65 73 20 66 6f 72 20 62 65  andidates for be
3e40: 69 6e 67 20 63 6f 6c 6c 61 70 73 65 64 2e 0a 2a  ing collapsed..*
3e50: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 6f  /.void sqlite3Co
3e60: 6c 6c 61 70 73 65 44 61 74 61 62 61 73 65 41 72  llapseDatabaseAr
3e70: 72 61 79 28 73 71 6c 69 74 65 33 20 2a 64 62 29  ray(sqlite3 *db)
3e80: 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20  {.  int i, j;.  
3e90: 66 6f 72 28 69 3d 6a 3d 32 3b 20 69 3c 64 62 2d  for(i=j=2; i<db-
3ea0: 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nDb; i++){.    
3eb0: 73 74 72 75 63 74 20 44 62 20 2a 70 44 62 20 3d  struct Db *pDb =
3ec0: 20 26 64 62 2d 3e 61 44 62 5b 69 5d 3b 0a 20 20   &db->aDb[i];.  
3ed0: 20 20 69 66 28 20 70 44 62 2d 3e 70 42 74 3d 3d    if( pDb->pBt==
3ee0: 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
3ef0: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 44 62  e3DbFree(db, pDb
3f00: 2d 3e 7a 44 62 53 4e 61 6d 65 29 3b 0a 20 20 20  ->zDbSName);.   
3f10: 20 20 20 70 44 62 2d 3e 7a 44 62 53 4e 61 6d 65     pDb->zDbSName
3f20: 20 3d 20 30 3b 0a 20 20 20 20 20 20 63 6f 6e 74   = 0;.      cont
3f30: 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20  inue;.    }.    
3f40: 69 66 28 20 6a 3c 69 20 29 7b 0a 20 20 20 20 20  if( j<i ){.     
3f50: 20 64 62 2d 3e 61 44 62 5b 6a 5d 20 3d 20 64 62   db->aDb[j] = db
3f60: 2d 3e 61 44 62 5b 69 5d 3b 0a 20 20 20 20 7d 0a  ->aDb[i];.    }.
3f70: 20 20 20 20 6a 2b 2b 3b 0a 20 20 7d 0a 20 20 64      j++;.  }.  d
3f80: 62 2d 3e 6e 44 62 20 3d 20 6a 3b 0a 20 20 69 66  b->nDb = j;.  if
3f90: 28 20 64 62 2d 3e 6e 44 62 3c 3d 32 20 26 26 20  ( db->nDb<=2 && 
3fa0: 64 62 2d 3e 61 44 62 21 3d 64 62 2d 3e 61 44 62  db->aDb!=db->aDb
3fb0: 53 74 61 74 69 63 20 29 7b 0a 20 20 20 20 6d 65  Static ){.    me
3fc0: 6d 63 70 79 28 64 62 2d 3e 61 44 62 53 74 61 74  mcpy(db->aDbStat
3fd0: 69 63 2c 20 64 62 2d 3e 61 44 62 2c 20 32 2a 73  ic, db->aDb, 2*s
3fe0: 69 7a 65 6f 66 28 64 62 2d 3e 61 44 62 5b 30 5d  izeof(db->aDb[0]
3ff0: 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  ));.    sqlite3D
4000: 62 46 72 65 65 28 64 62 2c 20 64 62 2d 3e 61 44  bFree(db, db->aD
4010: 62 29 3b 0a 20 20 20 20 64 62 2d 3e 61 44 62 20  b);.    db->aDb 
4020: 3d 20 64 62 2d 3e 61 44 62 53 74 61 74 69 63 3b  = db->aDbStatic;
4030: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  .  }.}../*.** Re
4040: 73 65 74 20 74 68 65 20 73 63 68 65 6d 61 20 66  set the schema f
4050: 6f 72 20 74 68 65 20 64 61 74 61 62 61 73 65 20  or the database 
4060: 61 74 20 69 6e 64 65 78 20 69 44 62 2e 20 20 41  at index iDb.  A
4070: 6c 73 6f 20 72 65 73 65 74 20 74 68 65 0a 2a 2a  lso reset the.**
4080: 20 54 45 4d 50 20 73 63 68 65 6d 61 2e 0a 2a 2f   TEMP schema..*/
4090: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52 65 73  .void sqlite3Res
40a0: 65 74 4f 6e 65 53 63 68 65 6d 61 28 73 71 6c 69  etOneSchema(sqli
40b0: 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 69 44 62  te3 *db, int iDb
40c0: 29 7b 0a 20 20 44 62 20 2a 70 44 62 3b 0a 20 20  ){.  Db *pDb;.  
40d0: 61 73 73 65 72 74 28 20 69 44 62 3c 64 62 2d 3e  assert( iDb<db->
40e0: 6e 44 62 20 29 3b 0a 0a 20 20 2f 2a 20 43 61 73  nDb );..  /* Cas
40f0: 65 20 31 3a 20 20 52 65 73 65 74 20 74 68 65 20  e 1:  Reset the 
4100: 73 69 6e 67 6c 65 20 73 63 68 65 6d 61 20 69 64  single schema id
4110: 65 6e 74 69 66 69 65 64 20 62 79 20 69 44 62 20  entified by iDb 
4120: 2a 2f 0a 20 20 70 44 62 20 3d 20 26 64 62 2d 3e  */.  pDb = &db->
4130: 61 44 62 5b 69 44 62 5d 3b 0a 20 20 61 73 73 65  aDb[iDb];.  asse
4140: 72 74 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d  rt( sqlite3Schem
4150: 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20 69  aMutexHeld(db, i
4160: 44 62 2c 20 30 29 20 29 3b 0a 20 20 61 73 73 65  Db, 0) );.  asse
4170: 72 74 28 20 70 44 62 2d 3e 70 53 63 68 65 6d 61  rt( pDb->pSchema
4180: 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  !=0 );.  sqlite3
4190: 53 63 68 65 6d 61 43 6c 65 61 72 28 70 44 62 2d  SchemaClear(pDb-
41a0: 3e 70 53 63 68 65 6d 61 29 3b 0a 0a 20 20 2f 2a  >pSchema);..  /*
41b0: 20 49 66 20 61 6e 79 20 64 61 74 61 62 61 73 65   If any database
41c0: 20 6f 74 68 65 72 20 74 68 61 6e 20 54 45 4d 50   other than TEMP
41d0: 20 69 73 20 72 65 73 65 74 2c 20 74 68 65 6e 20   is reset, then 
41e0: 61 6c 73 6f 20 72 65 73 65 74 20 54 45 4d 50 0a  also reset TEMP.
41f0: 20 20 2a 2a 20 73 69 6e 63 65 20 54 45 4d 50 20    ** since TEMP 
4200: 6d 69 67 68 74 20 62 65 20 68 6f 6c 64 69 6e 67  might be holding
4210: 20 74 72 69 67 67 65 72 73 20 74 68 61 74 20 72   triggers that r
4220: 65 66 65 72 65 6e 63 65 20 74 61 62 6c 65 73 20  eference tables 
4230: 69 6e 20 74 68 65 0a 20 20 2a 2a 20 6f 74 68 65  in the.  ** othe
4240: 72 20 64 61 74 61 62 61 73 65 2e 0a 20 20 2a 2f  r database..  */
4250: 0a 20 20 69 66 28 20 69 44 62 21 3d 31 20 29 7b  .  if( iDb!=1 ){
4260: 0a 20 20 20 20 70 44 62 20 3d 20 26 64 62 2d 3e  .    pDb = &db->
4270: 61 44 62 5b 31 5d 3b 0a 20 20 20 20 61 73 73 65  aDb[1];.    asse
4280: 72 74 28 20 70 44 62 2d 3e 70 53 63 68 65 6d 61  rt( pDb->pSchema
4290: 21 3d 30 20 29 3b 0a 20 20 20 20 73 71 6c 69 74  !=0 );.    sqlit
42a0: 65 33 53 63 68 65 6d 61 43 6c 65 61 72 28 70 44  e3SchemaClear(pD
42b0: 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 7d  b->pSchema);.  }
42c0: 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a  .  return;.}../*
42d0: 0a 2a 2a 20 45 72 61 73 65 20 61 6c 6c 20 73 63  .** Erase all sc
42e0: 68 65 6d 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  hema information
42f0: 20 66 72 6f 6d 20 61 6c 6c 20 61 74 74 61 63 68   from all attach
4300: 65 64 20 64 61 74 61 62 61 73 65 73 20 28 69 6e  ed databases (in
4310: 63 6c 75 64 69 6e 67 0a 2a 2a 20 22 6d 61 69 6e  cluding.** "main
4320: 22 20 61 6e 64 20 22 74 65 6d 70 22 29 20 66 6f  " and "temp") fo
4330: 72 20 61 20 73 69 6e 67 6c 65 20 64 61 74 61 62  r a single datab
4340: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a  ase connection..
4350: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52  */.void sqlite3R
4360: 65 73 65 74 41 6c 6c 53 63 68 65 6d 61 73 4f 66  esetAllSchemasOf
4370: 43 6f 6e 6e 65 63 74 69 6f 6e 28 73 71 6c 69 74  Connection(sqlit
4380: 65 33 20 2a 64 62 29 7b 0a 20 20 69 6e 74 20 69  e3 *db){.  int i
4390: 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
43a0: 45 6e 74 65 72 41 6c 6c 28 64 62 29 3b 0a 20 20  EnterAll(db);.  
43b0: 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e  for(i=0; i<db->n
43c0: 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 44 62  Db; i++){.    Db
43d0: 20 2a 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62   *pDb = &db->aDb
43e0: 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 70 44 62  [i];.    if( pDb
43f0: 2d 3e 70 53 63 68 65 6d 61 20 29 7b 0a 20 20 20  ->pSchema ){.   
4400: 20 20 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61     sqlite3Schema
4410: 43 6c 65 61 72 28 70 44 62 2d 3e 70 53 63 68 65  Clear(pDb->pSche
4420: 6d 61 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ma);.    }.  }. 
4430: 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53   db->flags &= ~S
4440: 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e  QLITE_InternChan
4450: 67 65 73 3b 0a 20 20 73 71 6c 69 74 65 33 56 74  ges;.  sqlite3Vt
4460: 61 62 55 6e 6c 6f 63 6b 4c 69 73 74 28 64 62 29  abUnlockList(db)
4470: 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
4480: 4c 65 61 76 65 41 6c 6c 28 64 62 29 3b 0a 20 20  LeaveAll(db);.  
4490: 73 71 6c 69 74 65 33 43 6f 6c 6c 61 70 73 65 44  sqlite3CollapseD
44a0: 61 74 61 62 61 73 65 41 72 72 61 79 28 64 62 29  atabaseArray(db)
44b0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
44c0: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
44d0: 64 20 77 68 65 6e 20 61 20 63 6f 6d 6d 69 74 20  d when a commit 
44e0: 6f 63 63 75 72 73 2e 0a 2a 2f 0a 76 6f 69 64 20  occurs..*/.void 
44f0: 73 71 6c 69 74 65 33 43 6f 6d 6d 69 74 49 6e 74  sqlite3CommitInt
4500: 65 72 6e 61 6c 43 68 61 6e 67 65 73 28 73 71 6c  ernalChanges(sql
4510: 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 64 62 2d  ite3 *db){.  db-
4520: 3e 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54  >flags &= ~SQLIT
4530: 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b  E_InternChanges;
4540: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65  .}../*.** Delete
4550: 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 65   memory allocate
4560: 64 20 66 6f 72 20 74 68 65 20 63 6f 6c 75 6d 6e  d for the column
4570: 20 6e 61 6d 65 73 20 6f 66 20 61 20 74 61 62 6c   names of a tabl
4580: 65 20 6f 72 20 76 69 65 77 20 28 74 68 65 0a 2a  e or view (the.*
4590: 2a 20 54 61 62 6c 65 2e 61 43 6f 6c 5b 5d 20 61  * Table.aCol[] a
45a0: 72 72 61 79 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73  rray)..*/.void s
45b0: 71 6c 69 74 65 33 44 65 6c 65 74 65 43 6f 6c 75  qlite3DeleteColu
45c0: 6d 6e 4e 61 6d 65 73 28 73 71 6c 69 74 65 33 20  mnNames(sqlite3 
45d0: 2a 64 62 2c 20 54 61 62 6c 65 20 2a 70 54 61 62  *db, Table *pTab
45e0: 6c 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  le){.  int i;.  
45f0: 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20  Column *pCol;.  
4600: 61 73 73 65 72 74 28 20 70 54 61 62 6c 65 21 3d  assert( pTable!=
4610: 30 20 29 3b 0a 20 20 69 66 28 20 28 70 43 6f 6c  0 );.  if( (pCol
4620: 20 3d 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 29   = pTable->aCol)
4630: 21 3d 30 20 29 7b 0a 20 20 20 20 66 6f 72 28 69  !=0 ){.    for(i
4640: 3d 30 3b 20 69 3c 70 54 61 62 6c 65 2d 3e 6e 43  =0; i<pTable->nC
4650: 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29  ol; i++, pCol++)
4660: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  {.      sqlite3D
4670: 62 46 72 65 65 28 64 62 2c 20 70 43 6f 6c 2d 3e  bFree(db, pCol->
4680: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 73 71  zName);.      sq
4690: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
46a0: 64 62 2c 20 70 43 6f 6c 2d 3e 70 44 66 6c 74 29  db, pCol->pDflt)
46b0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  ;.      sqlite3D
46c0: 62 46 72 65 65 28 64 62 2c 20 70 43 6f 6c 2d 3e  bFree(db, pCol->
46d0: 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20 7d 0a 20 20  zColl);.    }.  
46e0: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
46f0: 64 62 2c 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c  db, pTable->aCol
4700: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
4710: 52 65 6d 6f 76 65 20 74 68 65 20 6d 65 6d 6f 72  Remove the memor
4720: 79 20 64 61 74 61 20 73 74 72 75 63 74 75 72 65  y data structure
4730: 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
4740: 68 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20 54  h the given.** T
4750: 61 62 6c 65 2e 20 20 4e 6f 20 63 68 61 6e 67 65  able.  No change
4760: 73 20 61 72 65 20 6d 61 64 65 20 74 6f 20 64 69  s are made to di
4770: 73 6b 20 62 79 20 74 68 69 73 20 72 6f 75 74 69  sk by this routi
4780: 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ne..**.** This r
4790: 6f 75 74 69 6e 65 20 6a 75 73 74 20 64 65 6c 65  outine just dele
47a0: 74 65 73 20 74 68 65 20 64 61 74 61 20 73 74 72  tes the data str
47b0: 75 63 74 75 72 65 2e 20 20 49 74 20 64 6f 65 73  ucture.  It does
47c0: 20 6e 6f 74 20 75 6e 6c 69 6e 6b 0a 2a 2a 20 74   not unlink.** t
47d0: 68 65 20 74 61 62 6c 65 20 64 61 74 61 20 73 74  he table data st
47e0: 72 75 63 74 75 72 65 20 66 72 6f 6d 20 74 68 65  ructure from the
47f0: 20 68 61 73 68 20 74 61 62 6c 65 2e 20 20 42 75   hash table.  Bu
4800: 74 20 69 74 20 64 6f 65 73 20 64 65 73 74 72 6f  t it does destro
4810: 79 0a 2a 2a 20 6d 65 6d 6f 72 79 20 73 74 72 75  y.** memory stru
4820: 63 74 75 72 65 73 20 6f 66 20 74 68 65 20 69 6e  ctures of the in
4830: 64 69 63 65 73 20 61 6e 64 20 66 6f 72 65 69 67  dices and foreig
4840: 6e 20 6b 65 79 73 20 61 73 73 6f 63 69 61 74 65  n keys associate
4850: 64 20 77 69 74 68 20 0a 2a 2a 20 74 68 65 20 74  d with .** the t
4860: 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  able..**.** The 
4870: 64 62 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  db parameter is 
4880: 6f 70 74 69 6f 6e 61 6c 2e 20 20 49 74 20 69 73  optional.  It is
4890: 20 6e 65 65 64 65 64 20 69 66 20 74 68 65 20 54   needed if the T
48a0: 61 62 6c 65 20 6f 62 6a 65 63 74 20 0a 2a 2a 20  able object .** 
48b0: 63 6f 6e 74 61 69 6e 73 20 6c 6f 6f 6b 61 73 69  contains lookasi
48c0: 64 65 20 6d 65 6d 6f 72 79 2e 20 20 28 54 61 62  de memory.  (Tab
48d0: 6c 65 20 6f 62 6a 65 63 74 73 20 69 6e 20 74 68  le objects in th
48e0: 65 20 73 63 68 65 6d 61 20 64 6f 20 6e 6f 74 20  e schema do not 
48f0: 75 73 65 0a 2a 2a 20 6c 6f 6f 6b 61 73 69 64 65  use.** lookaside
4900: 20 6d 65 6d 6f 72 79 2c 20 62 75 74 20 73 6f 6d   memory, but som
4910: 65 20 65 70 68 65 6d 65 72 61 6c 20 54 61 62 6c  e ephemeral Tabl
4920: 65 20 6f 62 6a 65 63 74 73 20 64 6f 2e 29 20 20  e objects do.)  
4930: 4f 72 20 74 68 65 0a 2a 2a 20 64 62 20 70 61 72  Or the.** db par
4940: 61 6d 65 74 65 72 20 63 61 6e 20 62 65 20 75 73  ameter can be us
4950: 65 64 20 77 69 74 68 20 64 62 2d 3e 70 6e 42 79  ed with db->pnBy
4960: 74 65 73 46 72 65 65 64 20 74 6f 20 6d 65 61 73  tesFreed to meas
4970: 75 72 65 20 74 68 65 20 6d 65 6d 6f 72 79 0a 2a  ure the memory.*
4980: 2a 20 75 73 65 64 20 62 79 20 74 68 65 20 54 61  * used by the Ta
4990: 62 6c 65 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 73  ble object..*/.s
49a0: 74 61 74 69 63 20 76 6f 69 64 20 53 51 4c 49 54  tatic void SQLIT
49b0: 45 5f 4e 4f 49 4e 4c 49 4e 45 20 64 65 6c 65 74  E_NOINLINE delet
49c0: 65 54 61 62 6c 65 28 73 71 6c 69 74 65 33 20 2a  eTable(sqlite3 *
49d0: 64 62 2c 20 54 61 62 6c 65 20 2a 70 54 61 62 6c  db, Table *pTabl
49e0: 65 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e  e){.  Index *pIn
49f0: 64 65 78 2c 20 2a 70 4e 65 78 74 3b 0a 20 20 54  dex, *pNext;.  T
4a00: 45 53 54 4f 4e 4c 59 28 20 69 6e 74 20 6e 4c 6f  ESTONLY( int nLo
4a10: 6f 6b 61 73 69 64 65 3b 20 29 20 2f 2a 20 55 73  okaside; ) /* Us
4a20: 65 64 20 74 6f 20 76 65 72 69 66 79 20 6c 6f 6f  ed to verify loo
4a30: 6b 61 73 69 64 65 20 6e 6f 74 20 75 73 65 64 20  kaside not used 
4a40: 66 6f 72 20 73 63 68 65 6d 61 20 2a 2f 0a 0a 20  for schema */.. 
4a50: 20 2f 2a 20 52 65 63 6f 72 64 20 74 68 65 20 6e   /* Record the n
4a60: 75 6d 62 65 72 20 6f 66 20 6f 75 74 73 74 61 6e  umber of outstan
4a70: 64 69 6e 67 20 6c 6f 6f 6b 61 73 69 64 65 20 61  ding lookaside a
4a80: 6c 6c 6f 63 61 74 69 6f 6e 73 20 69 6e 20 73 63  llocations in sc
4a90: 68 65 6d 61 20 54 61 62 6c 65 73 0a 20 20 2a 2a  hema Tables.  **
4aa0: 20 70 72 69 6f 72 20 74 6f 20 64 6f 69 6e 67 20   prior to doing 
4ab0: 61 6e 79 20 66 72 65 65 28 29 20 6f 70 65 72 61  any free() opera
4ac0: 74 69 6f 6e 73 2e 20 20 53 69 6e 63 65 20 73 63  tions.  Since sc
4ad0: 68 65 6d 61 20 54 61 62 6c 65 73 20 64 6f 20 6e  hema Tables do n
4ae0: 6f 74 20 75 73 65 0a 20 20 2a 2a 20 6c 6f 6f 6b  ot use.  ** look
4af0: 61 73 69 64 65 2c 20 74 68 69 73 20 6e 75 6d 62  aside, this numb
4b00: 65 72 20 73 68 6f 75 6c 64 20 6e 6f 74 20 63 68  er should not ch
4b10: 61 6e 67 65 2e 20 2a 2f 0a 20 20 54 45 53 54 4f  ange. */.  TESTO
4b20: 4e 4c 59 28 20 6e 4c 6f 6f 6b 61 73 69 64 65 20  NLY( nLookaside 
4b30: 3d 20 28 64 62 20 26 26 20 28 70 54 61 62 6c 65  = (db && (pTable
4b40: 2d 3e 74 61 62 46 6c 61 67 73 20 26 20 54 46 5f  ->tabFlags & TF_
4b50: 45 70 68 65 6d 65 72 61 6c 29 3d 3d 30 29 20 3f  Ephemeral)==0) ?
4b60: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
4b70: 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e 6c 6f            db->lo
4b80: 6f 6b 61 73 69 64 65 2e 6e 4f 75 74 20 3a 20 30  okaside.nOut : 0
4b90: 20 29 3b 0a 0a 20 20 2f 2a 20 44 65 6c 65 74 65   );..  /* Delete
4ba0: 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 61 73 73   all indices ass
4bb0: 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 69  ociated with thi
4bc0: 73 20 74 61 62 6c 65 2e 20 2a 2f 0a 20 20 66 6f  s table. */.  fo
4bd0: 72 28 70 49 6e 64 65 78 20 3d 20 70 54 61 62 6c  r(pIndex = pTabl
4be0: 65 2d 3e 70 49 6e 64 65 78 3b 20 70 49 6e 64 65  e->pIndex; pInde
4bf0: 78 3b 20 70 49 6e 64 65 78 3d 70 4e 65 78 74 29  x; pIndex=pNext)
4c00: 7b 0a 20 20 20 20 70 4e 65 78 74 20 3d 20 70 49  {.    pNext = pI
4c10: 6e 64 65 78 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  ndex->pNext;.   
4c20: 20 61 73 73 65 72 74 28 20 70 49 6e 64 65 78 2d   assert( pIndex-
4c30: 3e 70 53 63 68 65 6d 61 3d 3d 70 54 61 62 6c 65  >pSchema==pTable
4c40: 2d 3e 70 53 63 68 65 6d 61 0a 20 20 20 20 20 20  ->pSchema.      
4c50: 20 20 20 7c 7c 20 28 49 73 56 69 72 74 75 61 6c     || (IsVirtual
4c60: 28 70 54 61 62 6c 65 29 20 26 26 20 70 49 6e 64  (pTable) && pInd
4c70: 65 78 2d 3e 69 64 78 54 79 70 65 21 3d 53 51 4c  ex->idxType!=SQL
4c80: 49 54 45 5f 49 44 58 54 59 50 45 5f 41 50 50 44  ITE_IDXTYPE_APPD
4c90: 45 46 29 20 29 3b 0a 20 20 20 20 69 66 28 20 28  EF) );.    if( (
4ca0: 64 62 3d 3d 30 20 7c 7c 20 64 62 2d 3e 70 6e 42  db==0 || db->pnB
4cb0: 79 74 65 73 46 72 65 65 64 3d 3d 30 29 20 26 26  ytesFreed==0) &&
4cc0: 20 21 49 73 56 69 72 74 75 61 6c 28 70 54 61 62   !IsVirtual(pTab
4cd0: 6c 65 29 20 29 7b 0a 20 20 20 20 20 20 63 68 61  le) ){.      cha
4ce0: 72 20 2a 7a 4e 61 6d 65 20 3d 20 70 49 6e 64 65  r *zName = pInde
4cf0: 78 2d 3e 7a 4e 61 6d 65 3b 20 0a 20 20 20 20 20  x->zName; .     
4d00: 20 54 45 53 54 4f 4e 4c 59 20 28 20 49 6e 64 65   TESTONLY ( Inde
4d10: 78 20 2a 70 4f 6c 64 20 3d 20 29 20 73 71 6c 69  x *pOld = ) sqli
4d20: 74 65 33 48 61 73 68 49 6e 73 65 72 74 28 0a 20  te3HashInsert(. 
4d30: 20 20 20 20 20 20 20 20 26 70 49 6e 64 65 78 2d          &pIndex-
4d40: 3e 70 53 63 68 65 6d 61 2d 3e 69 64 78 48 61 73  >pSchema->idxHas
4d50: 68 2c 20 7a 4e 61 6d 65 2c 20 30 0a 20 20 20 20  h, zName, 0.    
4d60: 20 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72    );.      asser
4d70: 74 28 20 64 62 3d 3d 30 20 7c 7c 20 73 71 6c 69  t( db==0 || sqli
4d80: 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65  te3SchemaMutexHe
4d90: 6c 64 28 64 62 2c 20 30 2c 20 70 49 6e 64 65 78  ld(db, 0, pIndex
4da0: 2d 3e 70 53 63 68 65 6d 61 29 20 29 3b 0a 20 20  ->pSchema) );.  
4db0: 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 6c 64      assert( pOld
4dc0: 3d 3d 70 49 6e 64 65 78 20 7c 7c 20 70 4f 6c 64  ==pIndex || pOld
4dd0: 3d 3d 30 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ==0 );.    }.   
4de0: 20 66 72 65 65 49 6e 64 65 78 28 64 62 2c 20 70   freeIndex(db, p
4df0: 49 6e 64 65 78 29 3b 0a 20 20 7d 0a 0a 20 20 2f  Index);.  }..  /
4e00: 2a 20 44 65 6c 65 74 65 20 61 6e 79 20 66 6f 72  * Delete any for
4e10: 65 69 67 6e 20 6b 65 79 73 20 61 74 74 61 63 68  eign keys attach
4e20: 65 64 20 74 6f 20 74 68 69 73 20 74 61 62 6c 65  ed to this table
4e30: 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 46 6b  . */.  sqlite3Fk
4e40: 44 65 6c 65 74 65 28 64 62 2c 20 70 54 61 62 6c  Delete(db, pTabl
4e50: 65 29 3b 0a 0a 20 20 2f 2a 20 44 65 6c 65 74 65  e);..  /* Delete
4e60: 20 74 68 65 20 54 61 62 6c 65 20 73 74 72 75 63   the Table struc
4e70: 74 75 72 65 20 69 74 73 65 6c 66 2e 0a 20 20 2a  ture itself..  *
4e80: 2f 0a 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74  /.  sqlite3Delet
4e90: 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 64 62 2c  eColumnNames(db,
4ea0: 20 70 54 61 62 6c 65 29 3b 0a 20 20 73 71 6c 69   pTable);.  sqli
4eb0: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 54  te3DbFree(db, pT
4ec0: 61 62 6c 65 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  able->zName);.  
4ed0: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
4ee0: 2c 20 70 54 61 62 6c 65 2d 3e 7a 43 6f 6c 41 66  , pTable->zColAf
4ef0: 66 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c  f);.  sqlite3Sel
4f00: 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70 54  ectDelete(db, pT
4f10: 61 62 6c 65 2d 3e 70 53 65 6c 65 63 74 29 3b 0a  able->pSelect);.
4f20: 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
4f30: 74 44 65 6c 65 74 65 28 64 62 2c 20 70 54 61 62  tDelete(db, pTab
4f40: 6c 65 2d 3e 70 43 68 65 63 6b 29 3b 0a 23 69 66  le->pCheck);.#if
4f50: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
4f60: 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20  _VIRTUALTABLE.  
4f70: 73 71 6c 69 74 65 33 56 74 61 62 43 6c 65 61 72  sqlite3VtabClear
4f80: 28 64 62 2c 20 70 54 61 62 6c 65 29 3b 0a 23 65  (db, pTable);.#e
4f90: 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33 44 62  ndif.  sqlite3Db
4fa0: 46 72 65 65 28 64 62 2c 20 70 54 61 62 6c 65 29  Free(db, pTable)
4fb0: 3b 0a 0a 20 20 2f 2a 20 56 65 72 69 66 79 20 74  ;..  /* Verify t
4fc0: 68 61 74 20 6e 6f 20 6c 6f 6f 6b 61 73 69 64 65  hat no lookaside
4fd0: 20 6d 65 6d 6f 72 79 20 77 61 73 20 75 73 65 64   memory was used
4fe0: 20 62 79 20 73 63 68 65 6d 61 20 74 61 62 6c 65   by schema table
4ff0: 73 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 6e  s */.  assert( n
5000: 4c 6f 6f 6b 61 73 69 64 65 3d 3d 30 20 7c 7c 20  Lookaside==0 || 
5010: 6e 4c 6f 6f 6b 61 73 69 64 65 3d 3d 64 62 2d 3e  nLookaside==db->
5020: 6c 6f 6f 6b 61 73 69 64 65 2e 6e 4f 75 74 20 29  lookaside.nOut )
5030: 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  ;.}.void sqlite3
5040: 44 65 6c 65 74 65 54 61 62 6c 65 28 73 71 6c 69  DeleteTable(sqli
5050: 74 65 33 20 2a 64 62 2c 20 54 61 62 6c 65 20 2a  te3 *db, Table *
5060: 70 54 61 62 6c 65 29 7b 0a 20 20 2f 2a 20 44 6f  pTable){.  /* Do
5070: 20 6e 6f 74 20 64 65 6c 65 74 65 20 74 68 65 20   not delete the 
5080: 74 61 62 6c 65 20 75 6e 74 69 6c 20 74 68 65 20  table until the 
5090: 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20  reference count 
50a0: 72 65 61 63 68 65 73 20 7a 65 72 6f 2e 20 2a 2f  reaches zero. */
50b0: 0a 20 20 69 66 28 20 21 70 54 61 62 6c 65 20 29  .  if( !pTable )
50c0: 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 28   return;.  if( (
50d0: 28 21 64 62 20 7c 7c 20 64 62 2d 3e 70 6e 42 79  (!db || db->pnBy
50e0: 74 65 73 46 72 65 65 64 3d 3d 30 29 20 26 26 20  tesFreed==0) && 
50f0: 28 2d 2d 70 54 61 62 6c 65 2d 3e 6e 52 65 66 29  (--pTable->nRef)
5100: 3e 30 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  >0) ) return;.  
5110: 64 65 6c 65 74 65 54 61 62 6c 65 28 64 62 2c 20  deleteTable(db, 
5120: 70 54 61 62 6c 65 29 3b 0a 7d 0a 0a 0a 2f 2a 0a  pTable);.}.../*.
5130: 2a 2a 20 55 6e 6c 69 6e 6b 20 74 68 65 20 67 69  ** Unlink the gi
5140: 76 65 6e 20 74 61 62 6c 65 20 66 72 6f 6d 20 74  ven table from t
5150: 68 65 20 68 61 73 68 20 74 61 62 6c 65 73 20 61  he hash tables a
5160: 6e 64 20 74 68 65 20 64 65 6c 65 74 65 20 74 68  nd the delete th
5170: 65 0a 2a 2a 20 74 61 62 6c 65 20 73 74 72 75 63  e.** table struc
5180: 74 75 72 65 20 77 69 74 68 20 61 6c 6c 20 69 74  ture with all it
5190: 73 20 69 6e 64 69 63 65 73 20 61 6e 64 20 66 6f  s indices and fo
51a0: 72 65 69 67 6e 20 6b 65 79 73 2e 0a 2a 2f 0a 76  reign keys..*/.v
51b0: 6f 69 64 20 73 71 6c 69 74 65 33 55 6e 6c 69 6e  oid sqlite3Unlin
51c0: 6b 41 6e 64 44 65 6c 65 74 65 54 61 62 6c 65 28  kAndDeleteTable(
51d0: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74  sqlite3 *db, int
51e0: 20 69 44 62 2c 20 63 6f 6e 73 74 20 63 68 61 72   iDb, const char
51f0: 20 2a 7a 54 61 62 4e 61 6d 65 29 7b 0a 20 20 54   *zTabName){.  T
5200: 61 62 6c 65 20 2a 70 3b 0a 20 20 44 62 20 2a 70  able *p;.  Db *p
5210: 44 62 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 64  Db;..  assert( d
5220: 62 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  b!=0 );.  assert
5230: 28 20 69 44 62 3e 3d 30 20 26 26 20 69 44 62 3c  ( iDb>=0 && iDb<
5240: 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 61 73 73  db->nDb );.  ass
5250: 65 72 74 28 20 7a 54 61 62 4e 61 6d 65 20 29 3b  ert( zTabName );
5260: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
5270: 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c  e3SchemaMutexHel
5280: 64 28 64 62 2c 20 69 44 62 2c 20 30 29 20 29 3b  d(db, iDb, 0) );
5290: 0a 20 20 74 65 73 74 63 61 73 65 28 20 7a 54 61  .  testcase( zTa
52a0: 62 4e 61 6d 65 5b 30 5d 3d 3d 30 20 29 3b 20 20  bName[0]==0 );  
52b0: 2f 2a 20 5a 65 72 6f 2d 6c 65 6e 67 74 68 20 74  /* Zero-length t
52c0: 61 62 6c 65 20 6e 61 6d 65 73 20 61 72 65 20 61  able names are a
52d0: 6c 6c 6f 77 65 64 20 2a 2f 0a 20 20 70 44 62 20  llowed */.  pDb 
52e0: 3d 20 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d 3b  = &db->aDb[iDb];
52f0: 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 48 61  .  p = sqlite3Ha
5300: 73 68 49 6e 73 65 72 74 28 26 70 44 62 2d 3e 70  shInsert(&pDb->p
5310: 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68 2c  Schema->tblHash,
5320: 20 7a 54 61 62 4e 61 6d 65 2c 20 30 29 3b 0a 20   zTabName, 0);. 
5330: 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61   sqlite3DeleteTa
5340: 62 6c 65 28 64 62 2c 20 70 29 3b 0a 20 20 64 62  ble(db, p);.  db
5350: 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54  ->flags |= SQLIT
5360: 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b  E_InternChanges;
5370: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20  .}../*.** Given 
5380: 61 20 74 6f 6b 65 6e 2c 20 72 65 74 75 72 6e 20  a token, return 
5390: 61 20 73 74 72 69 6e 67 20 74 68 61 74 20 63 6f  a string that co
53a0: 6e 73 69 73 74 73 20 6f 66 20 74 68 65 20 74 65  nsists of the te
53b0: 78 74 20 6f 66 20 74 68 61 74 0a 2a 2a 20 74 6f  xt of that.** to
53c0: 6b 65 6e 2e 20 20 53 70 61 63 65 20 74 6f 20 68  ken.  Space to h
53d0: 6f 6c 64 20 74 68 65 20 72 65 74 75 72 6e 65 64  old the returned
53e0: 20 73 74 72 69 6e 67 0a 2a 2a 20 69 73 20 6f 62   string.** is ob
53f0: 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69  tained from sqli
5400: 74 65 4d 61 6c 6c 6f 63 28 29 20 61 6e 64 20 6d  teMalloc() and m
5410: 75 73 74 20 62 65 20 66 72 65 65 64 20 62 79 20  ust be freed by 
5420: 74 68 65 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 66  the calling.** f
5430: 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 41  unction..**.** A
5440: 6e 79 20 71 75 6f 74 61 74 69 6f 6e 20 6d 61 72  ny quotation mar
5450: 6b 73 20 28 65 78 3a 20 20 22 6e 61 6d 65 22 2c  ks (ex:  "name",
5460: 20 27 6e 61 6d 65 27 2c 20 5b 6e 61 6d 65 5d 2c   'name', [name],
5470: 20 6f 72 20 60 6e 61 6d 65 60 29 20 74 68 61 74   or `name`) that
5480: 0a 2a 2a 20 73 75 72 72 6f 75 6e 64 20 74 68 65  .** surround the
5490: 20 62 6f 64 79 20 6f 66 20 74 68 65 20 74 6f 6b   body of the tok
54a0: 65 6e 20 61 72 65 20 72 65 6d 6f 76 65 64 2e 0a  en are removed..
54b0: 2a 2a 0a 2a 2a 20 54 6f 6b 65 6e 73 20 61 72 65  **.** Tokens are
54c0: 20 6f 66 74 65 6e 20 6a 75 73 74 20 70 6f 69 6e   often just poin
54d0: 74 65 72 73 20 69 6e 74 6f 20 74 68 65 20 6f 72  ters into the or
54e0: 69 67 69 6e 61 6c 20 53 51 4c 20 74 65 78 74 20  iginal SQL text 
54f0: 61 6e 64 20 73 6f 0a 2a 2a 20 61 72 65 20 6e 6f  and so.** are no
5500: 74 20 5c 30 30 30 20 74 65 72 6d 69 6e 61 74 65  t \000 terminate
5510: 64 20 61 6e 64 20 61 72 65 20 6e 6f 74 20 70 65  d and are not pe
5520: 72 73 69 73 74 65 6e 74 2e 20 20 54 68 65 20 72  rsistent.  The r
5530: 65 74 75 72 6e 65 64 20 73 74 72 69 6e 67 0a 2a  eturned string.*
5540: 2a 20 69 73 20 5c 30 30 30 20 74 65 72 6d 69 6e  * is \000 termin
5550: 61 74 65 64 20 61 6e 64 20 69 73 20 70 65 72 73  ated and is pers
5560: 69 73 74 65 6e 74 2e 0a 2a 2f 0a 63 68 61 72 20  istent..*/.char 
5570: 2a 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d  *sqlite3NameFrom
5580: 54 6f 6b 65 6e 28 73 71 6c 69 74 65 33 20 2a 64  Token(sqlite3 *d
5590: 62 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 29  b, Token *pName)
55a0: 7b 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b  {.  char *zName;
55b0: 0a 20 20 69 66 28 20 70 4e 61 6d 65 20 29 7b 0a  .  if( pName ){.
55c0: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69      zName = sqli
55d0: 74 65 33 44 62 53 74 72 4e 44 75 70 28 64 62 2c  te3DbStrNDup(db,
55e0: 20 28 63 68 61 72 2a 29 70 4e 61 6d 65 2d 3e 7a   (char*)pName->z
55f0: 2c 20 70 4e 61 6d 65 2d 3e 6e 29 3b 0a 20 20 20  , pName->n);.   
5600: 20 73 71 6c 69 74 65 33 44 65 71 75 6f 74 65 28   sqlite3Dequote(
5610: 7a 4e 61 6d 65 29 3b 0a 20 20 7d 65 6c 73 65 7b  zName);.  }else{
5620: 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 30 3b 0a  .    zName = 0;.
5630: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 4e 61    }.  return zNa
5640: 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65  me;.}../*.** Ope
5650: 6e 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73  n the sqlite_mas
5660: 74 65 72 20 74 61 62 6c 65 20 73 74 6f 72 65 64  ter table stored
5670: 20 69 6e 20 64 61 74 61 62 61 73 65 20 6e 75 6d   in database num
5680: 62 65 72 20 69 44 62 20 66 6f 72 0a 2a 2a 20 77  ber iDb for.** w
5690: 72 69 74 69 6e 67 2e 20 54 68 65 20 74 61 62 6c  riting. The tabl
56a0: 65 20 69 73 20 6f 70 65 6e 65 64 20 75 73 69 6e  e is opened usin
56b0: 67 20 63 75 72 73 6f 72 20 30 2e 0a 2a 2f 0a 76  g cursor 0..*/.v
56c0: 6f 69 64 20 73 71 6c 69 74 65 33 4f 70 65 6e 4d  oid sqlite3OpenM
56d0: 61 73 74 65 72 54 61 62 6c 65 28 50 61 72 73 65  asterTable(Parse
56e0: 20 2a 70 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20   *p, int iDb){. 
56f0: 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74   Vdbe *v = sqlit
5700: 65 33 47 65 74 56 64 62 65 28 70 29 3b 0a 20 20  e3GetVdbe(p);.  
5710: 73 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b  sqlite3TableLock
5720: 28 70 2c 20 69 44 62 2c 20 4d 41 53 54 45 52 5f  (p, iDb, MASTER_
5730: 52 4f 4f 54 2c 20 31 2c 20 53 43 48 45 4d 41 5f  ROOT, 1, SCHEMA_
5740: 54 41 42 4c 45 28 69 44 62 29 29 3b 0a 20 20 73  TABLE(iDb));.  s
5750: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
5760: 49 6e 74 28 76 2c 20 4f 50 5f 4f 70 65 6e 57 72  Int(v, OP_OpenWr
5770: 69 74 65 2c 20 30 2c 20 4d 41 53 54 45 52 5f 52  ite, 0, MASTER_R
5780: 4f 4f 54 2c 20 69 44 62 2c 20 35 29 3b 0a 20 20  OOT, iDb, 5);.  
5790: 69 66 28 20 70 2d 3e 6e 54 61 62 3d 3d 30 20 29  if( p->nTab==0 )
57a0: 7b 0a 20 20 20 20 70 2d 3e 6e 54 61 62 20 3d 20  {.    p->nTab = 
57b0: 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  1;.  }.}../*.** 
57c0: 50 61 72 61 6d 65 74 65 72 20 7a 4e 61 6d 65 20  Parameter zName 
57d0: 70 6f 69 6e 74 73 20 74 6f 20 61 20 6e 75 6c 2d  points to a nul-
57e0: 74 65 72 6d 69 6e 61 74 65 64 20 62 75 66 66 65  terminated buffe
57f0: 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  r containing the
5800: 20 6e 61 6d 65 0a 2a 2a 20 6f 66 20 61 20 64 61   name.** of a da
5810: 74 61 62 61 73 65 20 28 22 6d 61 69 6e 22 2c 20  tabase ("main", 
5820: 22 74 65 6d 70 22 20 6f 72 20 74 68 65 20 6e 61  "temp" or the na
5830: 6d 65 20 6f 66 20 61 6e 20 61 74 74 61 63 68 65  me of an attache
5840: 64 20 64 62 29 2e 20 54 68 69 73 0a 2a 2a 20 66  d db). This.** f
5850: 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20  unction returns 
5860: 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65  the index of the
5870: 20 6e 61 6d 65 64 20 64 61 74 61 62 61 73 65 20   named database 
5880: 69 6e 20 64 62 2d 3e 61 44 62 5b 5d 2c 20 6f 72  in db->aDb[], or
5890: 0a 2a 2a 20 2d 31 20 69 66 20 74 68 65 20 6e 61  .** -1 if the na
58a0: 6d 65 64 20 64 62 20 63 61 6e 6e 6f 74 20 62 65  med db cannot be
58b0: 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 69 6e 74 20 73   found..*/.int s
58c0: 71 6c 69 74 65 33 46 69 6e 64 44 62 4e 61 6d 65  qlite3FindDbName
58d0: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f  (sqlite3 *db, co
58e0: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29  nst char *zName)
58f0: 7b 0a 20 20 69 6e 74 20 69 20 3d 20 2d 31 3b 20  {.  int i = -1; 
5900: 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
5910: 61 73 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20  ase number */.  
5920: 69 66 28 20 7a 4e 61 6d 65 20 29 7b 0a 20 20 20  if( zName ){.   
5930: 20 44 62 20 2a 70 44 62 3b 0a 20 20 20 20 66 6f   Db *pDb;.    fo
5940: 72 28 69 3d 28 64 62 2d 3e 6e 44 62 2d 31 29 2c  r(i=(db->nDb-1),
5950: 20 70 44 62 3d 26 64 62 2d 3e 61 44 62 5b 69 5d   pDb=&db->aDb[i]
5960: 3b 20 69 3e 3d 30 3b 20 69 2d 2d 2c 20 70 44 62  ; i>=0; i--, pDb
5970: 2d 2d 29 7b 0a 20 20 20 20 20 20 69 66 28 20 30  --){.      if( 0
5980: 3d 3d 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ==sqlite3StrICmp
5990: 28 70 44 62 2d 3e 7a 44 62 53 4e 61 6d 65 2c 20  (pDb->zDbSName, 
59a0: 7a 4e 61 6d 65 29 20 29 20 62 72 65 61 6b 3b 0a  zName) ) break;.
59b0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
59c0: 72 6e 20 69 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  rn i;.}../*.** T
59d0: 68 65 20 74 6f 6b 65 6e 20 2a 70 4e 61 6d 65 20  he token *pName 
59e0: 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 6e 61 6d  contains the nam
59f0: 65 20 6f 66 20 61 20 64 61 74 61 62 61 73 65 20  e of a database 
5a00: 28 65 69 74 68 65 72 20 22 6d 61 69 6e 22 20 6f  (either "main" o
5a10: 72 0a 2a 2a 20 22 74 65 6d 70 22 20 6f 72 20 74  r.** "temp" or t
5a20: 68 65 20 6e 61 6d 65 20 6f 66 20 61 6e 20 61 74  he name of an at
5a30: 74 61 63 68 65 64 20 64 62 29 2e 20 54 68 69 73  tached db). This
5a40: 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73   routine returns
5a50: 20 74 68 65 0a 2a 2a 20 69 6e 64 65 78 20 6f 66   the.** index of
5a60: 20 74 68 65 20 6e 61 6d 65 64 20 64 61 74 61 62   the named datab
5a70: 61 73 65 20 69 6e 20 64 62 2d 3e 61 44 62 5b 5d  ase in db->aDb[]
5a80: 2c 20 6f 72 20 2d 31 20 69 66 20 74 68 65 20 6e  , or -1 if the n
5a90: 61 6d 65 64 20 64 62 20 0a 2a 2a 20 64 6f 65 73  amed db .** does
5aa0: 20 6e 6f 74 20 65 78 69 73 74 2e 0a 2a 2f 0a 69   not exist..*/.i
5ab0: 6e 74 20 73 71 6c 69 74 65 33 46 69 6e 64 44 62  nt sqlite3FindDb
5ac0: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 54 6f  (sqlite3 *db, To
5ad0: 6b 65 6e 20 2a 70 4e 61 6d 65 29 7b 0a 20 20 69  ken *pName){.  i
5ae0: 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
5af0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5b00: 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
5b10: 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 63 68 61 72  number */.  char
5b20: 20 2a 7a 4e 61 6d 65 3b 20 20 20 20 20 20 20 20   *zName;        
5b30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5b40: 20 2f 2a 20 4e 61 6d 65 20 77 65 20 61 72 65 20   /* Name we are 
5b50: 73 65 61 72 63 68 69 6e 67 20 66 6f 72 20 2a 2f  searching for */
5b60: 0a 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74  .  zName = sqlit
5b70: 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28  e3NameFromToken(
5b80: 64 62 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 69 20  db, pName);.  i 
5b90: 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 44 62 4e  = sqlite3FindDbN
5ba0: 61 6d 65 28 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a  ame(db, zName);.
5bb0: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
5bc0: 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 72 65  db, zName);.  re
5bd0: 74 75 72 6e 20 69 3b 0a 7d 0a 0a 2f 2a 20 54 68  turn i;.}../* Th
5be0: 65 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77 20  e table or view 
5bf0: 6f 72 20 74 72 69 67 67 65 72 20 6e 61 6d 65 20  or trigger name 
5c00: 69 73 20 70 61 73 73 65 64 20 74 6f 20 74 68 69  is passed to thi
5c10: 73 20 72 6f 75 74 69 6e 65 20 76 69 61 20 74 6f  s routine via to
5c20: 6b 65 6e 73 0a 2a 2a 20 70 4e 61 6d 65 31 20 61  kens.** pName1 a
5c30: 6e 64 20 70 4e 61 6d 65 32 2e 20 49 66 20 74 68  nd pName2. If th
5c40: 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 77 61 73  e table name was
5c50: 20 66 75 6c 6c 79 20 71 75 61 6c 69 66 69 65 64   fully qualified
5c60: 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 2a  , for example:.*
5c70: 2a 0a 2a 2a 20 43 52 45 41 54 45 20 54 41 42 4c  *.** CREATE TABL
5c80: 45 20 78 78 78 2e 79 79 79 20 28 2e 2e 2e 29 3b  E xxx.yyy (...);
5c90: 0a 2a 2a 20 0a 2a 2a 20 54 68 65 6e 20 70 4e 61  .** .** Then pNa
5ca0: 6d 65 31 20 69 73 20 73 65 74 20 74 6f 20 22 78  me1 is set to "x
5cb0: 78 78 22 20 61 6e 64 20 70 4e 61 6d 65 32 20 22  xx" and pName2 "
5cc0: 79 79 79 22 2e 20 4f 6e 20 74 68 65 20 6f 74 68  yyy". On the oth
5cd0: 65 72 20 68 61 6e 64 20 69 66 0a 2a 2a 20 74 68  er hand if.** th
5ce0: 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 69 73 20  e table name is 
5cf0: 6e 6f 74 20 66 75 6c 6c 79 20 71 75 61 6c 69 66  not fully qualif
5d00: 69 65 64 2c 20 69 2e 65 2e 3a 0a 2a 2a 0a 2a 2a  ied, i.e.:.**.**
5d10: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 79 79   CREATE TABLE yy
5d20: 79 28 2e 2e 2e 29 3b 0a 2a 2a 0a 2a 2a 20 54 68  y(...);.**.** Th
5d30: 65 6e 20 70 4e 61 6d 65 31 20 69 73 20 73 65 74  en pName1 is set
5d40: 20 74 6f 20 22 79 79 79 22 20 61 6e 64 20 70 4e   to "yyy" and pN
5d50: 61 6d 65 32 20 69 73 20 22 22 2e 0a 2a 2a 0a 2a  ame2 is ""..**.*
5d60: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73  * This routine s
5d70: 65 74 73 20 74 68 65 20 2a 70 70 55 6e 71 75 61  ets the *ppUnqua
5d80: 6c 20 70 6f 69 6e 74 65 72 20 74 6f 20 70 6f 69  l pointer to poi
5d90: 6e 74 20 61 74 20 74 68 65 20 74 6f 6b 65 6e 20  nt at the token 
5da0: 28 70 4e 61 6d 65 31 20 6f 72 0a 2a 2a 20 70 4e  (pName1 or.** pN
5db0: 61 6d 65 32 29 20 74 68 61 74 20 73 74 6f 72 65  ame2) that store
5dc0: 73 20 74 68 65 20 75 6e 71 75 61 6c 69 66 69 65  s the unqualifie
5dd0: 64 20 74 61 62 6c 65 20 6e 61 6d 65 2e 20 20 54  d table name.  T
5de0: 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 0a  he index of the.
5df0: 2a 2a 20 64 61 74 61 62 61 73 65 20 22 78 78 78  ** database "xxx
5e00: 22 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  " is returned..*
5e10: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 54 77 6f  /.int sqlite3Two
5e20: 50 61 72 74 4e 61 6d 65 28 0a 20 20 50 61 72 73  PartName(.  Pars
5e30: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
5e40: 2f 2a 20 50 61 72 73 69 6e 67 20 61 6e 64 20 63  /* Parsing and c
5e50: 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63  ode generating c
5e60: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 6f 6b 65  ontext */.  Toke
5e70: 6e 20 2a 70 4e 61 6d 65 31 2c 20 20 20 20 20 20  n *pName1,      
5e80: 2f 2a 20 54 68 65 20 22 78 78 78 22 20 69 6e 20  /* The "xxx" in 
5e90: 74 68 65 20 6e 61 6d 65 20 22 78 78 78 2e 79 79  the name "xxx.yy
5ea0: 79 22 20 6f 72 20 22 78 78 78 22 20 2a 2f 0a 20  y" or "xxx" */. 
5eb0: 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32 2c 20   Token *pName2, 
5ec0: 20 20 20 20 20 2f 2a 20 54 68 65 20 22 79 79 79       /* The "yyy
5ed0: 22 20 69 6e 20 74 68 65 20 6e 61 6d 65 20 22 78  " in the name "x
5ee0: 78 78 2e 79 79 79 22 20 2a 2f 0a 20 20 54 6f 6b  xx.yyy" */.  Tok
5ef0: 65 6e 20 2a 2a 70 55 6e 71 75 61 6c 20 20 20 20  en **pUnqual    
5f00: 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 75 6e   /* Write the un
5f10: 71 75 61 6c 69 66 69 65 64 20 6f 62 6a 65 63 74  qualified object
5f20: 20 6e 61 6d 65 20 68 65 72 65 20 2a 2f 0a 29 7b   name here */.){
5f30: 0a 20 20 69 6e 74 20 69 44 62 3b 20 20 20 20 20  .  int iDb;     
5f40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
5f50: 2a 20 44 61 74 61 62 61 73 65 20 68 6f 6c 64 69  * Database holdi
5f60: 6e 67 20 74 68 65 20 6f 62 6a 65 63 74 20 2a 2f  ng the object */
5f70: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
5f80: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20   pParse->db;..  
5f90: 61 73 73 65 72 74 28 20 70 4e 61 6d 65 32 21 3d  assert( pName2!=
5fa0: 30 20 29 3b 0a 20 20 69 66 28 20 70 4e 61 6d 65  0 );.  if( pName
5fb0: 32 2d 3e 6e 3e 30 20 29 7b 0a 20 20 20 20 69 66  2->n>0 ){.    if
5fc0: 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20  ( db->init.busy 
5fd0: 29 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ) {.      sqlite
5fe0: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
5ff0: 2c 20 22 63 6f 72 72 75 70 74 20 64 61 74 61 62  , "corrupt datab
6000: 61 73 65 22 29 3b 0a 20 20 20 20 20 20 72 65 74  ase");.      ret
6010: 75 72 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20  urn -1;.    }.  
6020: 20 20 2a 70 55 6e 71 75 61 6c 20 3d 20 70 4e 61    *pUnqual = pNa
6030: 6d 65 32 3b 0a 20 20 20 20 69 44 62 20 3d 20 73  me2;.    iDb = s
6040: 71 6c 69 74 65 33 46 69 6e 64 44 62 28 64 62 2c  qlite3FindDb(db,
6050: 20 70 4e 61 6d 65 31 29 3b 0a 20 20 20 20 69 66   pName1);.    if
6060: 28 20 69 44 62 3c 30 20 29 7b 0a 20 20 20 20 20  ( iDb<0 ){.     
6070: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
6080: 28 70 50 61 72 73 65 2c 20 22 75 6e 6b 6e 6f 77  (pParse, "unknow
6090: 6e 20 64 61 74 61 62 61 73 65 20 25 54 22 2c 20  n database %T", 
60a0: 70 4e 61 6d 65 31 29 3b 0a 20 20 20 20 20 20 72  pName1);.      r
60b0: 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a  eturn -1;.    }.
60c0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73    }else{.    ass
60d0: 65 72 74 28 20 64 62 2d 3e 69 6e 69 74 2e 69 44  ert( db->init.iD
60e0: 62 3d 3d 30 20 7c 7c 20 64 62 2d 3e 69 6e 69 74  b==0 || db->init
60f0: 2e 62 75 73 79 20 7c 7c 20 28 64 62 2d 3e 66 6c  .busy || (db->fl
6100: 61 67 73 20 26 20 53 51 4c 49 54 45 5f 56 61 63  ags & SQLITE_Vac
6110: 75 75 6d 29 21 3d 30 29 3b 0a 20 20 20 20 69 44  uum)!=0);.    iD
6120: 62 20 3d 20 64 62 2d 3e 69 6e 69 74 2e 69 44 62  b = db->init.iDb
6130: 3b 0a 20 20 20 20 2a 70 55 6e 71 75 61 6c 20 3d  ;.    *pUnqual =
6140: 20 70 4e 61 6d 65 31 3b 0a 20 20 7d 0a 20 20 72   pName1;.  }.  r
6150: 65 74 75 72 6e 20 69 44 62 3b 0a 7d 0a 0a 2f 2a  eturn iDb;.}../*
6160: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
6170: 20 69 73 20 75 73 65 64 20 74 6f 20 63 68 65 63   is used to chec
6180: 6b 20 69 66 20 74 68 65 20 55 54 46 2d 38 20 73  k if the UTF-8 s
6190: 74 72 69 6e 67 20 7a 4e 61 6d 65 20 69 73 20 61  tring zName is a
61a0: 20 6c 65 67 61 6c 0a 2a 2a 20 75 6e 71 75 61 6c   legal.** unqual
61b0: 69 66 69 65 64 20 6e 61 6d 65 20 66 6f 72 20 61  ified name for a
61c0: 20 6e 65 77 20 73 63 68 65 6d 61 20 6f 62 6a 65   new schema obje
61d0: 63 74 20 28 74 61 62 6c 65 2c 20 69 6e 64 65 78  ct (table, index
61e0: 2c 20 76 69 65 77 20 6f 72 0a 2a 2a 20 74 72 69  , view or.** tri
61f0: 67 67 65 72 29 2e 20 41 6c 6c 20 6e 61 6d 65 73  gger). All names
6200: 20 61 72 65 20 6c 65 67 61 6c 20 65 78 63 65 70   are legal excep
6210: 74 20 74 68 6f 73 65 20 74 68 61 74 20 62 65 67  t those that beg
6220: 69 6e 20 77 69 74 68 20 74 68 65 20 73 74 72 69  in with the stri
6230: 6e 67 0a 2a 2a 20 22 73 71 6c 69 74 65 5f 22 20  ng.** "sqlite_" 
6240: 28 69 6e 20 75 70 70 65 72 2c 20 6c 6f 77 65 72  (in upper, lower
6250: 20 6f 72 20 6d 69 78 65 64 20 63 61 73 65 29 2e   or mixed case).
6260: 20 54 68 69 73 20 70 6f 72 74 69 6f 6e 20 6f 66   This portion of
6270: 20 74 68 65 20 6e 61 6d 65 73 70 61 63 65 0a 2a   the namespace.*
6280: 2a 20 69 73 20 72 65 73 65 72 76 65 64 20 66 6f  * is reserved fo
6290: 72 20 69 6e 74 65 72 6e 61 6c 20 75 73 65 2e 0a  r internal use..
62a0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 43 68  */.int sqlite3Ch
62b0: 65 63 6b 4f 62 6a 65 63 74 4e 61 6d 65 28 50 61  eckObjectName(Pa
62c0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 63 6f 6e  rse *pParse, con
62d0: 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b  st char *zName){
62e0: 0a 20 20 69 66 28 20 21 70 50 61 72 73 65 2d 3e  .  if( !pParse->
62f0: 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 26 26  db->init.busy &&
6300: 20 70 50 61 72 73 65 2d 3e 6e 65 73 74 65 64 3d   pParse->nested=
6310: 3d 30 20 0a 20 20 20 20 20 20 20 20 20 20 26 26  =0 .          &&
6320: 20 28 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66 6c   (pParse->db->fl
6330: 61 67 73 20 26 20 53 51 4c 49 54 45 5f 57 72 69  ags & SQLITE_Wri
6340: 74 65 53 63 68 65 6d 61 29 3d 3d 30 0a 20 20 20  teSchema)==0.   
6350: 20 20 20 20 20 20 20 26 26 20 30 3d 3d 73 71 6c         && 0==sql
6360: 69 74 65 33 53 74 72 4e 49 43 6d 70 28 7a 4e 61  ite3StrNICmp(zNa
6370: 6d 65 2c 20 22 73 71 6c 69 74 65 5f 22 2c 20 37  me, "sqlite_", 7
6380: 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) ){.    sqlite3
6390: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
63a0: 20 22 6f 62 6a 65 63 74 20 6e 61 6d 65 20 72 65   "object name re
63b0: 73 65 72 76 65 64 20 66 6f 72 20 69 6e 74 65 72  served for inter
63c0: 6e 61 6c 20 75 73 65 3a 20 25 73 22 2c 20 7a 4e  nal use: %s", zN
63d0: 61 6d 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ame);.    return
63e0: 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
63f0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
6400: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
6410: 52 65 74 75 72 6e 20 74 68 65 20 50 52 49 4d 41  Return the PRIMA
6420: 52 59 20 4b 45 59 20 69 6e 64 65 78 20 6f 66 20  RY KEY index of 
6430: 61 20 74 61 62 6c 65 0a 2a 2f 0a 49 6e 64 65 78  a table.*/.Index
6440: 20 2a 73 71 6c 69 74 65 33 50 72 69 6d 61 72 79   *sqlite3Primary
6450: 4b 65 79 49 6e 64 65 78 28 54 61 62 6c 65 20 2a  KeyIndex(Table *
6460: 70 54 61 62 29 7b 0a 20 20 49 6e 64 65 78 20 2a  pTab){.  Index *
6470: 70 3b 0a 20 20 66 6f 72 28 70 3d 70 54 61 62 2d  p;.  for(p=pTab-
6480: 3e 70 49 6e 64 65 78 3b 20 70 20 26 26 20 21 49  >pIndex; p && !I
6490: 73 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65 78  sPrimaryKeyIndex
64a0: 28 70 29 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29  (p); p=p->pNext)
64b0: 7b 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d  {}.  return p;.}
64c0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
64d0: 68 65 20 63 6f 6c 75 6d 6e 20 6f 66 20 69 6e 64  he column of ind
64e0: 65 78 20 70 49 64 78 20 74 68 61 74 20 63 6f 72  ex pIdx that cor
64f0: 72 65 73 70 6f 6e 64 73 20 74 6f 20 74 61 62 6c  responds to tabl
6500: 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 69 43 6f 6c  e.** column iCol
6510: 2e 20 20 52 65 74 75 72 6e 20 2d 31 20 69 66 20  .  Return -1 if 
6520: 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 69 31  not found..*/.i1
6530: 36 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 4f  6 sqlite3ColumnO
6540: 66 49 6e 64 65 78 28 49 6e 64 65 78 20 2a 70 49  fIndex(Index *pI
6550: 64 78 2c 20 69 31 36 20 69 43 6f 6c 29 7b 0a 20  dx, i16 iCol){. 
6560: 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d   int i;.  for(i=
6570: 30 3b 20 69 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75  0; i<pIdx->nColu
6580: 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  mn; i++){.    if
6590: 28 20 69 43 6f 6c 3d 3d 70 49 64 78 2d 3e 61 69  ( iCol==pIdx->ai
65a0: 43 6f 6c 75 6d 6e 5b 69 5d 20 29 20 72 65 74 75  Column[i] ) retu
65b0: 72 6e 20 69 3b 0a 20 20 7d 0a 20 20 72 65 74 75  rn i;.  }.  retu
65c0: 72 6e 20 2d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn -1;.}../*.** 
65d0: 42 65 67 69 6e 20 63 6f 6e 73 74 72 75 63 74 69  Begin constructi
65e0: 6e 67 20 61 20 6e 65 77 20 74 61 62 6c 65 20 72  ng a new table r
65f0: 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 69 6e  epresentation in
6600: 20 6d 65 6d 6f 72 79 2e 20 20 54 68 69 73 20 69   memory.  This i
6610: 73 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20 6f  s.** the first o
6620: 66 20 73 65 76 65 72 61 6c 20 61 63 74 69 6f 6e  f several action
6630: 20 72 6f 75 74 69 6e 65 73 20 74 68 61 74 20 67   routines that g
6640: 65 74 20 63 61 6c 6c 65 64 20 69 6e 20 72 65 73  et called in res
6650: 70 6f 6e 73 65 0a 2a 2a 20 74 6f 20 61 20 43 52  ponse.** to a CR
6660: 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65  EATE TABLE state
6670: 6d 65 6e 74 2e 20 20 49 6e 20 70 61 72 74 69 63  ment.  In partic
6680: 75 6c 61 72 2c 20 74 68 69 73 20 72 6f 75 74 69  ular, this routi
6690: 6e 65 20 69 73 20 63 61 6c 6c 65 64 0a 2a 2a 20  ne is called.** 
66a0: 61 66 74 65 72 20 73 65 65 69 6e 67 20 74 6f 6b  after seeing tok
66b0: 65 6e 73 20 22 43 52 45 41 54 45 22 20 61 6e 64  ens "CREATE" and
66c0: 20 22 54 41 42 4c 45 22 20 61 6e 64 20 74 68 65   "TABLE" and the
66d0: 20 74 61 62 6c 65 20 6e 61 6d 65 2e 20 54 68 65   table name. The
66e0: 20 69 73 54 65 6d 70 0a 2a 2a 20 66 6c 61 67 20   isTemp.** flag 
66f0: 69 73 20 74 72 75 65 20 69 66 20 74 68 65 20 74  is true if the t
6700: 61 62 6c 65 20 73 68 6f 75 6c 64 20 62 65 20 73  able should be s
6710: 74 6f 72 65 64 20 69 6e 20 74 68 65 20 61 75 78  tored in the aux
6720: 69 6c 69 61 72 79 20 64 61 74 61 62 61 73 65 0a  iliary database.
6730: 2a 2a 20 66 69 6c 65 20 69 6e 73 74 65 61 64 20  ** file instead 
6740: 6f 66 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 64  of in the main d
6750: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 54  atabase file.  T
6760: 68 69 73 20 69 73 20 6e 6f 72 6d 61 6c 6c 79 20  his is normally 
6770: 74 68 65 20 63 61 73 65 0a 2a 2a 20 77 68 65 6e  the case.** when
6780: 20 74 68 65 20 22 54 45 4d 50 22 20 6f 72 20 22   the "TEMP" or "
6790: 54 45 4d 50 4f 52 41 52 59 22 20 6b 65 79 77 6f  TEMPORARY" keywo
67a0: 72 64 20 6f 63 63 75 72 73 20 69 6e 20 62 65 74  rd occurs in bet
67b0: 77 65 65 6e 0a 2a 2a 20 43 52 45 41 54 45 20 61  ween.** CREATE a
67c0: 6e 64 20 54 41 42 4c 45 2e 0a 2a 2a 0a 2a 2a 20  nd TABLE..**.** 
67d0: 54 68 65 20 6e 65 77 20 74 61 62 6c 65 20 72 65  The new table re
67e0: 63 6f 72 64 20 69 73 20 69 6e 69 74 69 61 6c 69  cord is initiali
67f0: 7a 65 64 20 61 6e 64 20 70 75 74 20 69 6e 20 70  zed and put in p
6800: 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
6810: 2e 0a 2a 2a 20 41 73 20 6d 6f 72 65 20 6f 66 20  ..** As more of 
6820: 74 68 65 20 43 52 45 41 54 45 20 54 41 42 4c 45  the CREATE TABLE
6830: 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 70 61   statement is pa
6840: 72 73 65 64 2c 20 61 64 64 69 74 69 6f 6e 61 6c  rsed, additional
6850: 20 61 63 74 69 6f 6e 0a 2a 2a 20 72 6f 75 74 69   action.** routi
6860: 6e 65 73 20 77 69 6c 6c 20 62 65 20 63 61 6c 6c  nes will be call
6870: 65 64 20 74 6f 20 61 64 64 20 6d 6f 72 65 20 69  ed to add more i
6880: 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20 74 68  nformation to th
6890: 69 73 20 72 65 63 6f 72 64 2e 0a 2a 2a 20 41 74  is record..** At
68a0: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
68b0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61  CREATE TABLE sta
68c0: 74 65 6d 65 6e 74 2c 20 74 68 65 20 73 71 6c 69  tement, the sqli
68d0: 74 65 33 45 6e 64 54 61 62 6c 65 28 29 20 72 6f  te3EndTable() ro
68e0: 75 74 69 6e 65 0a 2a 2a 20 69 73 20 63 61 6c 6c  utine.** is call
68f0: 65 64 20 74 6f 20 63 6f 6d 70 6c 65 74 65 20 74  ed to complete t
6900: 68 65 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20  he construction 
6910: 6f 66 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65  of the new table
6920: 20 72 65 63 6f 72 64 2e 0a 2a 2f 0a 76 6f 69 64   record..*/.void
6930: 20 73 71 6c 69 74 65 33 53 74 61 72 74 54 61 62   sqlite3StartTab
6940: 6c 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  le(.  Parse *pPa
6950: 72 73 65 2c 20 20 20 2f 2a 20 50 61 72 73 65 72  rse,   /* Parser
6960: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 6f   context */.  To
6970: 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c 20 20 20 2f  ken *pName1,   /
6980: 2a 20 46 69 72 73 74 20 70 61 72 74 20 6f 66 20  * First part of 
6990: 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
69a0: 74 61 62 6c 65 20 6f 72 20 76 69 65 77 20 2a 2f  table or view */
69b0: 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32  .  Token *pName2
69c0: 2c 20 20 20 2f 2a 20 53 65 63 6f 6e 64 20 70 61  ,   /* Second pa
69d0: 72 74 20 6f 66 20 74 68 65 20 6e 61 6d 65 20 6f  rt of the name o
69e0: 66 20 74 68 65 20 74 61 62 6c 65 20 6f 72 20 76  f the table or v
69f0: 69 65 77 20 2a 2f 0a 20 20 69 6e 74 20 69 73 54  iew */.  int isT
6a00: 65 6d 70 2c 20 20 20 20 20 20 2f 2a 20 54 72 75  emp,      /* Tru
6a10: 65 20 69 66 20 74 68 69 73 20 69 73 20 61 20 54  e if this is a T
6a20: 45 4d 50 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69  EMP table */.  i
6a30: 6e 74 20 69 73 56 69 65 77 2c 20 20 20 20 20 20  nt isView,      
6a40: 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69 73 20  /* True if this 
6a50: 69 73 20 61 20 56 49 45 57 20 2a 2f 0a 20 20 69  is a VIEW */.  i
6a60: 6e 74 20 69 73 56 69 72 74 75 61 6c 2c 20 20 20  nt isVirtual,   
6a70: 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69 73 20  /* True if this 
6a80: 69 73 20 61 20 56 49 52 54 55 41 4c 20 74 61 62  is a VIRTUAL tab
6a90: 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 45 72  le */.  int noEr
6aa0: 72 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e  r        /* Do n
6ab0: 6f 74 68 69 6e 67 20 69 66 20 74 61 62 6c 65 20  othing if table 
6ac0: 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 20 2a  already exists *
6ad0: 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54  /.){.  Table *pT
6ae0: 61 62 6c 65 3b 0a 20 20 63 68 61 72 20 2a 7a 4e  able;.  char *zN
6af0: 61 6d 65 20 3d 20 30 3b 20 2f 2a 20 54 68 65 20  ame = 0; /* The 
6b00: 6e 61 6d 65 20 6f 66 20 74 68 65 20 6e 65 77 20  name of the new 
6b10: 74 61 62 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74  table */.  sqlit
6b20: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
6b30: 3e 64 62 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a  >db;.  Vdbe *v;.
6b40: 20 20 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20    int iDb;      
6b50: 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 6e     /* Database n
6b60: 75 6d 62 65 72 20 74 6f 20 63 72 65 61 74 65 20  umber to create 
6b70: 74 68 65 20 74 61 62 6c 65 20 69 6e 20 2a 2f 0a  the table in */.
6b80: 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 3b 20    Token *pName; 
6b90: 20 20 20 2f 2a 20 55 6e 71 75 61 6c 69 66 69 65     /* Unqualifie
6ba0: 64 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61  d name of the ta
6bb0: 62 6c 65 20 74 6f 20 63 72 65 61 74 65 20 2a 2f  ble to create */
6bc0: 0a 0a 20 20 69 66 28 20 64 62 2d 3e 69 6e 69 74  ..  if( db->init
6bd0: 2e 62 75 73 79 20 26 26 20 64 62 2d 3e 69 6e 69  .busy && db->ini
6be0: 74 2e 6e 65 77 54 6e 75 6d 3d 3d 31 20 29 7b 0a  t.newTnum==1 ){.
6bf0: 20 20 20 20 2f 2a 20 53 70 65 63 69 61 6c 20 63      /* Special c
6c00: 61 73 65 3a 20 20 50 61 72 73 69 6e 67 20 74 68  ase:  Parsing th
6c10: 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  e sqlite_master 
6c20: 6f 72 20 73 71 6c 69 74 65 5f 74 65 6d 70 5f 6d  or sqlite_temp_m
6c30: 61 73 74 65 72 20 73 63 68 65 6d 61 20 2a 2f 0a  aster schema */.
6c40: 20 20 20 20 69 44 62 20 3d 20 64 62 2d 3e 69 6e      iDb = db->in
6c50: 69 74 2e 69 44 62 3b 0a 20 20 20 20 7a 4e 61 6d  it.iDb;.    zNam
6c60: 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72  e = sqlite3DbStr
6c70: 44 75 70 28 64 62 2c 20 53 43 48 45 4d 41 5f 54  Dup(db, SCHEMA_T
6c80: 41 42 4c 45 28 69 44 62 29 29 3b 0a 20 20 20 20  ABLE(iDb));.    
6c90: 70 4e 61 6d 65 20 3d 20 70 4e 61 6d 65 31 3b 0a  pName = pName1;.
6ca0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
6cb0: 54 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20  The common case 
6cc0: 2a 2f 0a 20 20 20 20 69 44 62 20 3d 20 73 71 6c  */.    iDb = sql
6cd0: 69 74 65 33 54 77 6f 50 61 72 74 4e 61 6d 65 28  ite3TwoPartName(
6ce0: 70 50 61 72 73 65 2c 20 70 4e 61 6d 65 31 2c 20  pParse, pName1, 
6cf0: 70 4e 61 6d 65 32 2c 20 26 70 4e 61 6d 65 29 3b  pName2, &pName);
6d00: 0a 20 20 20 20 69 66 28 20 69 44 62 3c 30 20 29  .    if( iDb<0 )
6d10: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 69 66 28   return;.    if(
6d20: 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26 26   !OMIT_TEMPDB &&
6d30: 20 69 73 54 65 6d 70 20 26 26 20 70 4e 61 6d 65   isTemp && pName
6d40: 32 2d 3e 6e 3e 30 20 26 26 20 69 44 62 21 3d 31  2->n>0 && iDb!=1
6d50: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20   ){.      /* If 
6d60: 63 72 65 61 74 69 6e 67 20 61 20 74 65 6d 70 20  creating a temp 
6d70: 74 61 62 6c 65 2c 20 74 68 65 20 6e 61 6d 65 20  table, the name 
6d80: 6d 61 79 20 6e 6f 74 20 62 65 20 71 75 61 6c 69  may not be quali
6d90: 66 69 65 64 2e 20 55 6e 6c 65 73 73 20 0a 20 20  fied. Unless .  
6da0: 20 20 20 20 2a 2a 20 74 68 65 20 64 61 74 61 62      ** the datab
6db0: 61 73 65 20 6e 61 6d 65 20 69 73 20 22 74 65 6d  ase name is "tem
6dc0: 70 22 20 61 6e 79 77 61 79 2e 20 20 2a 2f 0a 20  p" anyway.  */. 
6dd0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
6de0: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 65  rMsg(pParse, "te
6df0: 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 6e 61  mporary table na
6e00: 6d 65 20 6d 75 73 74 20 62 65 20 75 6e 71 75 61  me must be unqua
6e10: 6c 69 66 69 65 64 22 29 3b 0a 20 20 20 20 20 20  lified");.      
6e20: 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20  return;.    }.  
6e30: 20 20 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50    if( !OMIT_TEMP
6e40: 44 42 20 26 26 20 69 73 54 65 6d 70 20 29 20 69  DB && isTemp ) i
6e50: 44 62 20 3d 20 31 3b 0a 20 20 20 20 7a 4e 61 6d  Db = 1;.    zNam
6e60: 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46  e = sqlite3NameF
6e70: 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 4e 61  romToken(db, pNa
6e80: 6d 65 29 3b 0a 20 20 7d 0a 20 20 70 50 61 72 73  me);.  }.  pPars
6e90: 65 2d 3e 73 4e 61 6d 65 54 6f 6b 65 6e 20 3d 20  e->sNameToken = 
6ea0: 2a 70 4e 61 6d 65 3b 0a 20 20 69 66 28 20 7a 4e  *pName;.  if( zN
6eb0: 61 6d 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ame==0 ) return;
6ec0: 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b  .  if( SQLITE_OK
6ed0: 21 3d 73 71 6c 69 74 65 33 43 68 65 63 6b 4f 62  !=sqlite3CheckOb
6ee0: 6a 65 63 74 4e 61 6d 65 28 70 50 61 72 73 65 2c  jectName(pParse,
6ef0: 20 7a 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 67   zName) ){.    g
6f00: 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f  oto begin_table_
6f10: 65 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 69 66 28  error;.  }.  if(
6f20: 20 64 62 2d 3e 69 6e 69 74 2e 69 44 62 3d 3d 31   db->init.iDb==1
6f30: 20 29 20 69 73 54 65 6d 70 20 3d 20 31 3b 0a 23   ) isTemp = 1;.#
6f40: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
6f50: 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e  IT_AUTHORIZATION
6f60: 0a 20 20 61 73 73 65 72 74 28 20 69 73 54 65 6d  .  assert( isTem
6f70: 70 3d 3d 30 20 7c 7c 20 69 73 54 65 6d 70 3d 3d  p==0 || isTemp==
6f80: 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69  1 );.  assert( i
6f90: 73 56 69 65 77 3d 3d 30 20 7c 7c 20 69 73 56 69  sView==0 || isVi
6fa0: 65 77 3d 3d 31 20 29 3b 0a 20 20 7b 0a 20 20 20  ew==1 );.  {.   
6fb0: 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38   static const u8
6fc0: 20 61 43 6f 64 65 5b 5d 20 3d 20 7b 0a 20 20 20   aCode[] = {.   
6fd0: 20 20 20 20 53 51 4c 49 54 45 5f 43 52 45 41 54      SQLITE_CREAT
6fe0: 45 5f 54 41 42 4c 45 2c 0a 20 20 20 20 20 20 20  E_TABLE,.       
6ff0: 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 45  SQLITE_CREATE_TE
7000: 4d 50 5f 54 41 42 4c 45 2c 0a 20 20 20 20 20 20  MP_TABLE,.      
7010: 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 56   SQLITE_CREATE_V
7020: 49 45 57 2c 0a 20 20 20 20 20 20 20 53 51 4c 49  IEW,.       SQLI
7030: 54 45 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f 56  TE_CREATE_TEMP_V
7040: 49 45 57 0a 20 20 20 20 7d 3b 0a 20 20 20 20 63  IEW.    };.    c
7050: 68 61 72 20 2a 7a 44 62 20 3d 20 64 62 2d 3e 61  har *zDb = db->a
7060: 44 62 5b 69 44 62 5d 2e 7a 44 62 53 4e 61 6d 65  Db[iDb].zDbSName
7070: 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
7080: 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73  3AuthCheck(pPars
7090: 65 2c 20 53 51 4c 49 54 45 5f 49 4e 53 45 52 54  e, SQLITE_INSERT
70a0: 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69  , SCHEMA_TABLE(i
70b0: 73 54 65 6d 70 29 2c 20 30 2c 20 7a 44 62 29 20  sTemp), 0, zDb) 
70c0: 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 62 65  ){.      goto be
70d0: 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b  gin_table_error;
70e0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21  .    }.    if( !
70f0: 69 73 56 69 72 74 75 61 6c 20 26 26 20 73 71 6c  isVirtual && sql
7100: 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50  ite3AuthCheck(pP
7110: 61 72 73 65 2c 20 28 69 6e 74 29 61 43 6f 64 65  arse, (int)aCode
7120: 5b 69 73 54 65 6d 70 2b 32 2a 69 73 56 69 65 77  [isTemp+2*isView
7130: 5d 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ],.             
7140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7150: 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 2c            zName,
7160: 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20   0, zDb) ){.    
7170: 20 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62    goto begin_tab
7180: 6c 65 5f 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a  le_error;.    }.
7190: 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a    }.#endif..  /*
71a0: 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 6e   Make sure the n
71b0: 65 77 20 74 61 62 6c 65 20 6e 61 6d 65 20 64 6f  ew table name do
71c0: 65 73 20 6e 6f 74 20 63 6f 6c 6c 69 64 65 20 77  es not collide w
71d0: 69 74 68 20 61 6e 20 65 78 69 73 74 69 6e 67 0a  ith an existing.
71e0: 20 20 2a 2a 20 69 6e 64 65 78 20 6f 72 20 74 61    ** index or ta
71f0: 62 6c 65 20 6e 61 6d 65 20 69 6e 20 74 68 65 20  ble name in the 
7200: 73 61 6d 65 20 64 61 74 61 62 61 73 65 2e 20 20  same database.  
7210: 49 73 73 75 65 20 61 6e 20 65 72 72 6f 72 20 6d  Issue an error m
7220: 65 73 73 61 67 65 20 69 66 0a 20 20 2a 2a 20 69  essage if.  ** i
7230: 74 20 64 6f 65 73 2e 20 54 68 65 20 65 78 63 65  t does. The exce
7240: 70 74 69 6f 6e 20 69 73 20 69 66 20 74 68 65 20  ption is if the 
7250: 73 74 61 74 65 6d 65 6e 74 20 62 65 69 6e 67 20  statement being 
7260: 70 61 72 73 65 64 20 77 61 73 20 70 61 73 73 65  parsed was passe
7270: 64 0a 20 20 2a 2a 20 74 6f 20 61 6e 20 73 71 6c  d.  ** to an sql
7280: 69 74 65 33 5f 64 65 63 6c 61 72 65 5f 76 74 61  ite3_declare_vta
7290: 62 28 29 20 63 61 6c 6c 2e 20 49 6e 20 74 68 61  b() call. In tha
72a0: 74 20 63 61 73 65 20 6f 6e 6c 79 20 74 68 65 20  t case only the 
72b0: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 0a 20 20 2a  column names.  *
72c0: 2a 20 61 6e 64 20 74 79 70 65 73 20 77 69 6c 6c  * and types will
72d0: 20 62 65 20 75 73 65 64 2c 20 73 6f 20 74 68 65   be used, so the
72e0: 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 20 74 6f  re is no need to
72f0: 20 74 65 73 74 20 66 6f 72 20 6e 61 6d 65 73 70   test for namesp
7300: 61 63 65 0a 20 20 2a 2a 20 63 6f 6c 6c 69 73 69  ace.  ** collisi
7310: 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ons..  */.  if( 
7320: 21 49 4e 5f 44 45 43 4c 41 52 45 5f 56 54 41 42  !IN_DECLARE_VTAB
7330: 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 44   ){.    char *zD
7340: 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d  b = db->aDb[iDb]
7350: 2e 7a 44 62 53 4e 61 6d 65 3b 0a 20 20 20 20 69  .zDbSName;.    i
7360: 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71  f( SQLITE_OK!=sq
7370: 6c 69 74 65 33 52 65 61 64 53 63 68 65 6d 61 28  lite3ReadSchema(
7380: 70 50 61 72 73 65 29 20 29 7b 0a 20 20 20 20 20  pParse) ){.     
7390: 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c   goto begin_tabl
73a0: 65 5f 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20  e_error;.    }. 
73b0: 20 20 20 70 54 61 62 6c 65 20 3d 20 73 71 6c 69     pTable = sqli
73c0: 74 65 33 46 69 6e 64 54 61 62 6c 65 28 64 62 2c  te3FindTable(db,
73d0: 20 7a 4e 61 6d 65 2c 20 7a 44 62 29 3b 0a 20 20   zName, zDb);.  
73e0: 20 20 69 66 28 20 70 54 61 62 6c 65 20 29 7b 0a    if( pTable ){.
73f0: 20 20 20 20 20 20 69 66 28 20 21 6e 6f 45 72 72        if( !noErr
7400: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
7410: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
7420: 73 65 2c 20 22 74 61 62 6c 65 20 25 54 20 61 6c  se, "table %T al
7430: 72 65 61 64 79 20 65 78 69 73 74 73 22 2c 20 70  ready exists", p
7440: 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c  Name);.      }el
7450: 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65  se{.        asse
7460: 72 74 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75  rt( !db->init.bu
7470: 73 79 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42  sy || CORRUPT_DB
7480: 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   );.        sqli
7490: 74 65 33 43 6f 64 65 56 65 72 69 66 79 53 63 68  te3CodeVerifySch
74a0: 65 6d 61 28 70 50 61 72 73 65 2c 20 69 44 62 29  ema(pParse, iDb)
74b0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
74c0: 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65  goto begin_table
74d0: 5f 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20  _error;.    }.  
74e0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 46 69 6e    if( sqlite3Fin
74f0: 64 49 6e 64 65 78 28 64 62 2c 20 7a 4e 61 6d 65  dIndex(db, zName
7500: 2c 20 7a 44 62 29 21 3d 30 20 29 7b 0a 20 20 20  , zDb)!=0 ){.   
7510: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
7520: 73 67 28 70 50 61 72 73 65 2c 20 22 74 68 65 72  sg(pParse, "ther
7530: 65 20 69 73 20 61 6c 72 65 61 64 79 20 61 6e 20  e is already an 
7540: 69 6e 64 65 78 20 6e 61 6d 65 64 20 25 73 22 2c  index named %s",
7550: 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 67   zName);.      g
7560: 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f  oto begin_table_
7570: 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 7d  error;.    }.  }
7580: 0a 0a 20 20 70 54 61 62 6c 65 20 3d 20 73 71 6c  ..  pTable = sql
7590: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f  ite3DbMallocZero
75a0: 28 64 62 2c 20 73 69 7a 65 6f 66 28 54 61 62 6c  (db, sizeof(Tabl
75b0: 65 29 29 3b 0a 20 20 69 66 28 20 70 54 61 62 6c  e));.  if( pTabl
75c0: 65 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65  e==0 ){.    asse
75d0: 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  rt( db->mallocFa
75e0: 69 6c 65 64 20 29 3b 0a 20 20 20 20 70 50 61 72  iled );.    pPar
75f0: 73 65 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f  se->rc = SQLITE_
7600: 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20  NOMEM_BKPT;.    
7610: 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a  pParse->nErr++;.
7620: 20 20 20 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74      goto begin_t
7630: 61 62 6c 65 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a  able_error;.  }.
7640: 20 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 20    pTable->zName 
7650: 3d 20 7a 4e 61 6d 65 3b 0a 20 20 70 54 61 62 6c  = zName;.  pTabl
7660: 65 2d 3e 69 50 4b 65 79 20 3d 20 2d 31 3b 0a 20  e->iPKey = -1;. 
7670: 20 70 54 61 62 6c 65 2d 3e 70 53 63 68 65 6d 61   pTable->pSchema
7680: 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e   = db->aDb[iDb].
7690: 70 53 63 68 65 6d 61 3b 0a 20 20 70 54 61 62 6c  pSchema;.  pTabl
76a0: 65 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20 70  e->nRef = 1;.  p
76b0: 54 61 62 6c 65 2d 3e 6e 52 6f 77 4c 6f 67 45 73  Table->nRowLogEs
76c0: 74 20 3d 20 32 30 30 3b 20 61 73 73 65 72 74 28  t = 200; assert(
76d0: 20 32 30 30 3d 3d 73 71 6c 69 74 65 33 4c 6f 67   200==sqlite3Log
76e0: 45 73 74 28 31 30 34 38 35 37 36 29 20 29 3b 0a  Est(1048576) );.
76f0: 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65    assert( pParse
7700: 2d 3e 70 4e 65 77 54 61 62 6c 65 3d 3d 30 20 29  ->pNewTable==0 )
7710: 3b 0a 20 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  ;.  pParse->pNew
7720: 54 61 62 6c 65 20 3d 20 70 54 61 62 6c 65 3b 0a  Table = pTable;.
7730: 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73  .  /* If this is
7740: 20 74 68 65 20 6d 61 67 69 63 20 73 71 6c 69 74   the magic sqlit
7750: 65 5f 73 65 71 75 65 6e 63 65 20 74 61 62 6c 65  e_sequence table
7760: 20 75 73 65 64 20 62 79 20 61 75 74 6f 69 6e 63   used by autoinc
7770: 72 65 6d 65 6e 74 2c 0a 20 20 2a 2a 20 74 68 65  rement,.  ** the
7780: 6e 20 72 65 63 6f 72 64 20 61 20 70 6f 69 6e 74  n record a point
7790: 65 72 20 74 6f 20 74 68 69 73 20 74 61 62 6c 65  er to this table
77a0: 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 64 61 74   in the main dat
77b0: 61 62 61 73 65 20 73 74 72 75 63 74 75 72 65 0a  abase structure.
77c0: 20 20 2a 2a 20 73 6f 20 74 68 61 74 20 49 4e 53    ** so that INS
77d0: 45 52 54 20 63 61 6e 20 66 69 6e 64 20 74 68 65  ERT can find the
77e0: 20 74 61 62 6c 65 20 65 61 73 69 6c 79 2e 0a 20   table easily.. 
77f0: 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   */.#ifndef SQLI
7800: 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 43 52  TE_OMIT_AUTOINCR
7810: 45 4d 45 4e 54 0a 20 20 69 66 28 20 21 70 50 61  EMENT.  if( !pPa
7820: 72 73 65 2d 3e 6e 65 73 74 65 64 20 26 26 20 73  rse->nested && s
7830: 74 72 63 6d 70 28 7a 4e 61 6d 65 2c 20 22 73 71  trcmp(zName, "sq
7840: 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 22 29 3d  lite_sequence")=
7850: 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  =0 ){.    assert
7860: 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d  ( sqlite3SchemaM
7870: 75 74 65 78 48 65 6c 64 28 64 62 2c 20 69 44 62  utexHeld(db, iDb
7880: 2c 20 30 29 20 29 3b 0a 20 20 20 20 70 54 61 62  , 0) );.    pTab
7890: 6c 65 2d 3e 70 53 63 68 65 6d 61 2d 3e 70 53 65  le->pSchema->pSe
78a0: 71 54 61 62 20 3d 20 70 54 61 62 6c 65 3b 0a 20  qTab = pTable;. 
78b0: 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
78c0: 42 65 67 69 6e 20 67 65 6e 65 72 61 74 69 6e 67  Begin generating
78d0: 20 74 68 65 20 63 6f 64 65 20 74 68 61 74 20 77   the code that w
78e0: 69 6c 6c 20 69 6e 73 65 72 74 20 74 68 65 20 74  ill insert the t
78f0: 61 62 6c 65 20 72 65 63 6f 72 64 20 69 6e 74 6f  able record into
7900: 0a 20 20 2a 2a 20 74 68 65 20 53 51 4c 49 54 45  .  ** the SQLITE
7910: 5f 4d 41 53 54 45 52 20 74 61 62 6c 65 2e 20 20  _MASTER table.  
7920: 4e 6f 74 65 20 69 6e 20 70 61 72 74 69 63 75 6c  Note in particul
7930: 61 72 20 74 68 61 74 20 77 65 20 6d 75 73 74 20  ar that we must 
7940: 67 6f 20 61 68 65 61 64 0a 20 20 2a 2a 20 61 6e  go ahead.  ** an
7950: 64 20 61 6c 6c 6f 63 61 74 65 20 74 68 65 20 72  d allocate the r
7960: 65 63 6f 72 64 20 6e 75 6d 62 65 72 20 66 6f 72  ecord number for
7970: 20 74 68 65 20 74 61 62 6c 65 20 65 6e 74 72 79   the table entry
7980: 20 6e 6f 77 2e 20 20 42 65 66 6f 72 65 20 61 6e   now.  Before an
7990: 79 0a 20 20 2a 2a 20 50 52 49 4d 41 52 59 20 4b  y.  ** PRIMARY K
79a0: 45 59 20 6f 72 20 55 4e 49 51 55 45 20 6b 65 79  EY or UNIQUE key
79b0: 77 6f 72 64 73 20 61 72 65 20 70 61 72 73 65 64  words are parsed
79c0: 2e 20 20 54 68 6f 73 65 20 6b 65 79 77 6f 72 64  .  Those keyword
79d0: 73 20 77 69 6c 6c 20 63 61 75 73 65 0a 20 20 2a  s will cause.  *
79e0: 2a 20 69 6e 64 69 63 65 73 20 74 6f 20 62 65 20  * indices to be 
79f0: 63 72 65 61 74 65 64 20 61 6e 64 20 74 68 65 20  created and the 
7a00: 74 61 62 6c 65 20 72 65 63 6f 72 64 20 6d 75 73  table record mus
7a10: 74 20 63 6f 6d 65 20 62 65 66 6f 72 65 20 74 68  t come before th
7a20: 65 20 0a 20 20 2a 2a 20 69 6e 64 69 63 65 73 2e  e .  ** indices.
7a30: 20 20 48 65 6e 63 65 2c 20 74 68 65 20 72 65 63    Hence, the rec
7a40: 6f 72 64 20 6e 75 6d 62 65 72 20 66 6f 72 20 74  ord number for t
7a50: 68 65 20 74 61 62 6c 65 20 6d 75 73 74 20 62 65  he table must be
7a60: 20 61 6c 6c 6f 63 61 74 65 64 0a 20 20 2a 2a 20   allocated.  ** 
7a70: 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  now..  */.  if( 
7a80: 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 26  !db->init.busy &
7a90: 26 20 28 76 20 3d 20 73 71 6c 69 74 65 33 47 65  & (v = sqlite3Ge
7aa0: 74 56 64 62 65 28 70 50 61 72 73 65 29 29 21 3d  tVdbe(pParse))!=
7ab0: 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 61 64 64  0 ){.    int add
7ac0: 72 31 3b 0a 20 20 20 20 69 6e 74 20 66 69 6c 65  r1;.    int file
7ad0: 46 6f 72 6d 61 74 3b 0a 20 20 20 20 69 6e 74 20  Format;.    int 
7ae0: 72 65 67 31 2c 20 72 65 67 32 2c 20 72 65 67 33  reg1, reg2, reg3
7af0: 3b 0a 20 20 20 20 2f 2a 20 6e 75 6c 6c 52 6f 77  ;.    /* nullRow
7b00: 5b 5d 20 69 73 20 61 6e 20 4f 50 5f 52 65 63 6f  [] is an OP_Reco
7b10: 72 64 20 65 6e 63 6f 64 69 6e 67 20 6f 66 20 61  rd encoding of a
7b20: 20 72 6f 77 20 63 6f 6e 74 61 69 6e 69 6e 67 20   row containing 
7b30: 35 20 4e 55 4c 4c 73 20 2a 2f 0a 20 20 20 20 73  5 NULLs */.    s
7b40: 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72  tatic const char
7b50: 20 6e 75 6c 6c 52 6f 77 5b 5d 20 3d 20 7b 20 36   nullRow[] = { 6
7b60: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 20  , 0, 0, 0, 0, 0 
7b70: 7d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65  };.    sqlite3Be
7b80: 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f  ginWriteOperatio
7b90: 6e 28 70 50 61 72 73 65 2c 20 31 2c 20 69 44 62  n(pParse, 1, iDb
7ba0: 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  );..#ifndef SQLI
7bb0: 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
7bc0: 41 42 4c 45 0a 20 20 20 20 69 66 28 20 69 73 56  ABLE.    if( isV
7bd0: 69 72 74 75 61 6c 20 29 7b 0a 20 20 20 20 20 20  irtual ){.      
7be0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
7bf0: 30 28 76 2c 20 4f 50 5f 56 42 65 67 69 6e 29 3b  0(v, OP_VBegin);
7c00: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  .    }.#endif.. 
7c10: 20 20 20 2f 2a 20 49 66 20 74 68 65 20 66 69 6c     /* If the fil
7c20: 65 20 66 6f 72 6d 61 74 20 61 6e 64 20 65 6e 63  e format and enc
7c30: 6f 64 69 6e 67 20 69 6e 20 74 68 65 20 64 61 74  oding in the dat
7c40: 61 62 61 73 65 20 68 61 76 65 20 6e 6f 74 20 62  abase have not b
7c50: 65 65 6e 20 73 65 74 2c 20 0a 20 20 20 20 2a 2a  een set, .    **
7c60: 20 73 65 74 20 74 68 65 6d 20 6e 6f 77 2e 0a 20   set them now.. 
7c70: 20 20 20 2a 2f 0a 20 20 20 20 72 65 67 31 20 3d     */.    reg1 =
7c80: 20 70 50 61 72 73 65 2d 3e 72 65 67 52 6f 77 69   pParse->regRowi
7c90: 64 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  d = ++pParse->nM
7ca0: 65 6d 3b 0a 20 20 20 20 72 65 67 32 20 3d 20 70  em;.    reg2 = p
7cb0: 50 61 72 73 65 2d 3e 72 65 67 52 6f 6f 74 20 3d  Parse->regRoot =
7cc0: 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
7cd0: 0a 20 20 20 20 72 65 67 33 20 3d 20 2b 2b 70 50  .    reg3 = ++pP
7ce0: 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
7cf0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
7d00: 33 28 76 2c 20 4f 50 5f 52 65 61 64 43 6f 6f 6b  3(v, OP_ReadCook
7d10: 69 65 2c 20 69 44 62 2c 20 72 65 67 33 2c 20 42  ie, iDb, reg3, B
7d20: 54 52 45 45 5f 46 49 4c 45 5f 46 4f 52 4d 41 54  TREE_FILE_FORMAT
7d30: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
7d40: 62 65 55 73 65 73 42 74 72 65 65 28 76 2c 20 69  beUsesBtree(v, i
7d50: 44 62 29 3b 0a 20 20 20 20 61 64 64 72 31 20 3d  Db);.    addr1 =
7d60: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
7d70: 70 31 28 76 2c 20 4f 50 5f 49 66 2c 20 72 65 67  p1(v, OP_If, reg
7d80: 33 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  3); VdbeCoverage
7d90: 28 76 29 3b 0a 20 20 20 20 66 69 6c 65 46 6f 72  (v);.    fileFor
7da0: 6d 61 74 20 3d 20 28 64 62 2d 3e 66 6c 61 67 73  mat = (db->flags
7db0: 20 26 20 53 51 4c 49 54 45 5f 4c 65 67 61 63 79   & SQLITE_Legacy
7dc0: 46 69 6c 65 46 6d 74 29 21 3d 30 20 3f 0a 20 20  FileFmt)!=0 ?.  
7dd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7de0: 31 20 3a 20 53 51 4c 49 54 45 5f 4d 41 58 5f 46  1 : SQLITE_MAX_F
7df0: 49 4c 45 5f 46 4f 52 4d 41 54 3b 0a 20 20 20 20  ILE_FORMAT;.    
7e00: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
7e10: 33 28 76 2c 20 4f 50 5f 53 65 74 43 6f 6f 6b 69  3(v, OP_SetCooki
7e20: 65 2c 20 69 44 62 2c 20 42 54 52 45 45 5f 46 49  e, iDb, BTREE_FI
7e30: 4c 45 5f 46 4f 52 4d 41 54 2c 20 66 69 6c 65 46  LE_FORMAT, fileF
7e40: 6f 72 6d 61 74 29 3b 0a 20 20 20 20 73 71 6c 69  ormat);.    sqli
7e50: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
7e60: 20 4f 50 5f 53 65 74 43 6f 6f 6b 69 65 2c 20 69   OP_SetCookie, i
7e70: 44 62 2c 20 42 54 52 45 45 5f 54 45 58 54 5f 45  Db, BTREE_TEXT_E
7e80: 4e 43 4f 44 49 4e 47 2c 20 45 4e 43 28 64 62 29  NCODING, ENC(db)
7e90: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
7ea0: 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
7eb0: 64 72 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68  dr1);..    /* Th
7ec0: 69 73 20 6a 75 73 74 20 63 72 65 61 74 65 73 20  is just creates 
7ed0: 61 20 70 6c 61 63 65 2d 68 6f 6c 64 65 72 20 72  a place-holder r
7ee0: 65 63 6f 72 64 20 69 6e 20 74 68 65 20 73 71 6c  ecord in the sql
7ef0: 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65  ite_master table
7f00: 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 72 65 63  ..    ** The rec
7f10: 6f 72 64 20 63 72 65 61 74 65 64 20 64 6f 65 73  ord created does
7f20: 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61 6e 79   not contain any
7f30: 74 68 69 6e 67 20 79 65 74 2e 20 20 49 74 20 77  thing yet.  It w
7f40: 69 6c 6c 20 62 65 20 72 65 70 6c 61 63 65 64 0a  ill be replaced.
7f50: 20 20 20 20 2a 2a 20 62 79 20 74 68 65 20 72 65      ** by the re
7f60: 61 6c 20 65 6e 74 72 79 20 69 6e 20 63 6f 64 65  al entry in code
7f70: 20 67 65 6e 65 72 61 74 65 64 20 61 74 20 73 71   generated at sq
7f80: 6c 69 74 65 33 45 6e 64 54 61 62 6c 65 28 29 2e  lite3EndTable().
7f90: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
7fa0: 68 65 20 72 6f 77 69 64 20 66 6f 72 20 74 68 65  he rowid for the
7fb0: 20 6e 65 77 20 65 6e 74 72 79 20 69 73 20 6c 65   new entry is le
7fc0: 66 74 20 69 6e 20 72 65 67 69 73 74 65 72 20 70  ft in register p
7fd0: 50 61 72 73 65 2d 3e 72 65 67 52 6f 77 69 64 2e  Parse->regRowid.
7fe0: 0a 20 20 20 20 2a 2a 20 54 68 65 20 72 6f 6f 74  .    ** The root
7ff0: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
8000: 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20 69 73  the new table is
8010: 20 6c 65 66 74 20 69 6e 20 72 65 67 20 70 50 61   left in reg pPa
8020: 72 73 65 2d 3e 72 65 67 52 6f 6f 74 2e 0a 20 20  rse->regRoot..  
8030: 20 20 2a 2a 20 54 68 65 20 72 6f 77 69 64 20 61    ** The rowid a
8040: 6e 64 20 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d  nd root page num
8050: 62 65 72 20 76 61 6c 75 65 73 20 61 72 65 20 6e  ber values are n
8060: 65 65 64 65 64 20 62 79 20 74 68 65 20 63 6f 64  eeded by the cod
8070: 65 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 73 71  e that.    ** sq
8080: 6c 69 74 65 33 45 6e 64 54 61 62 6c 65 20 77 69  lite3EndTable wi
8090: 6c 6c 20 67 65 6e 65 72 61 74 65 2e 0a 20 20 20  ll generate..   
80a0: 20 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64   */.#if !defined
80b0: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45  (SQLITE_OMIT_VIE
80c0: 57 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53  W) || !defined(S
80d0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
80e0: 41 4c 54 41 42 4c 45 29 0a 20 20 20 20 69 66 28  ALTABLE).    if(
80f0: 20 69 73 56 69 65 77 20 7c 7c 20 69 73 56 69 72   isView || isVir
8100: 74 75 61 6c 20 29 7b 0a 20 20 20 20 20 20 73 71  tual ){.      sq
8110: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
8120: 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30  v, OP_Integer, 0
8130: 2c 20 72 65 67 32 29 3b 0a 20 20 20 20 7d 65 6c  , reg2);.    }el
8140: 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 7b 0a  se.#endif.    {.
8150: 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 61 64        pParse->ad
8160: 64 72 43 72 54 61 62 20 3d 20 73 71 6c 69 74 65  drCrTab = sqlite
8170: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
8180: 50 5f 43 72 65 61 74 65 54 61 62 6c 65 2c 20 69  P_CreateTable, i
8190: 44 62 2c 20 72 65 67 32 29 3b 0a 20 20 20 20 7d  Db, reg2);.    }
81a0: 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 70 65 6e  .    sqlite3Open
81b0: 4d 61 73 74 65 72 54 61 62 6c 65 28 70 50 61 72  MasterTable(pPar
81c0: 73 65 2c 20 69 44 62 29 3b 0a 20 20 20 20 73 71  se, iDb);.    sq
81d0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
81e0: 76 2c 20 4f 50 5f 4e 65 77 52 6f 77 69 64 2c 20  v, OP_NewRowid, 
81f0: 30 2c 20 72 65 67 31 29 3b 0a 20 20 20 20 73 71  0, reg1);.    sq
8200: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
8210: 76 2c 20 4f 50 5f 42 6c 6f 62 2c 20 36 2c 20 72  v, OP_Blob, 6, r
8220: 65 67 33 2c 20 30 2c 20 6e 75 6c 6c 52 6f 77 2c  eg3, 0, nullRow,
8230: 20 50 34 5f 53 54 41 54 49 43 29 3b 0a 20 20 20   P4_STATIC);.   
8240: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
8250: 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c  p3(v, OP_Insert,
8260: 20 30 2c 20 72 65 67 33 2c 20 72 65 67 31 29 3b   0, reg3, reg1);
8270: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
8280: 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c  ChangeP5(v, OPFL
8290: 41 47 5f 41 50 50 45 4e 44 29 3b 0a 20 20 20 20  AG_APPEND);.    
82a0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
82b0: 30 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 29 3b 0a  0(v, OP_Close);.
82c0: 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 72 6d 61 6c    }..  /* Normal
82d0: 20 28 6e 6f 6e 2d 65 72 72 6f 72 29 20 72 65 74   (non-error) ret
82e0: 75 72 6e 2e 20 2a 2f 0a 20 20 72 65 74 75 72 6e  urn. */.  return
82f0: 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 20 65 72  ;..  /* If an er
8300: 72 6f 72 20 6f 63 63 75 72 73 2c 20 77 65 20 6a  ror occurs, we j
8310: 75 6d 70 20 68 65 72 65 20 2a 2f 0a 62 65 67 69  ump here */.begi
8320: 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3a 0a 20  n_table_error:. 
8330: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
8340: 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 72 65 74  b, zName);.  ret
8350: 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20 53 65 74 20 70  urn;.}../* Set p
8360: 72 6f 70 65 72 74 69 65 73 20 6f 66 20 61 20 74  roperties of a t
8370: 61 62 6c 65 20 63 6f 6c 75 6d 6e 20 62 61 73 65  able column base
8380: 64 20 6f 6e 20 74 68 65 20 28 6d 61 67 69 63 61  d on the (magica
8390: 6c 29 0a 2a 2a 20 6e 61 6d 65 20 6f 66 20 74 68  l).** name of th
83a0: 65 20 63 6f 6c 75 6d 6e 2e 0a 2a 2f 0a 23 69 66  e column..*/.#if
83b0: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 48   SQLITE_ENABLE_H
83c0: 49 44 44 45 4e 5f 43 4f 4c 55 4d 4e 53 0a 76 6f  IDDEN_COLUMNS.vo
83d0: 69 64 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e  id sqlite3Column
83e0: 50 72 6f 70 65 72 74 69 65 73 46 72 6f 6d 4e 61  PropertiesFromNa
83f0: 6d 65 28 54 61 62 6c 65 20 2a 70 54 61 62 2c 20  me(Table *pTab, 
8400: 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 29 7b 0a 20  Column *pCol){. 
8410: 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74 72   if( sqlite3_str
8420: 6e 69 63 6d 70 28 70 43 6f 6c 2d 3e 7a 4e 61 6d  nicmp(pCol->zNam
8430: 65 2c 20 22 5f 5f 68 69 64 64 65 6e 5f 5f 22 2c  e, "__hidden__",
8440: 20 31 30 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70   10)==0 ){.    p
8450: 43 6f 6c 2d 3e 63 6f 6c 46 6c 61 67 73 20 7c 3d  Col->colFlags |=
8460: 20 43 4f 4c 46 4c 41 47 5f 48 49 44 44 45 4e 3b   COLFLAG_HIDDEN;
8470: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 54 61  .  }else if( pTa
8480: 62 20 26 26 20 70 43 6f 6c 21 3d 70 54 61 62 2d  b && pCol!=pTab-
8490: 3e 61 43 6f 6c 20 26 26 20 28 70 43 6f 6c 5b 2d  >aCol && (pCol[-
84a0: 31 5d 2e 63 6f 6c 46 6c 61 67 73 20 26 20 43 4f  1].colFlags & CO
84b0: 4c 46 4c 41 47 5f 48 49 44 44 45 4e 29 20 29 7b  LFLAG_HIDDEN) ){
84c0: 0a 20 20 20 20 70 54 61 62 2d 3e 74 61 62 46 6c  .    pTab->tabFl
84d0: 61 67 73 20 7c 3d 20 54 46 5f 4f 4f 4f 48 69 64  ags |= TF_OOOHid
84e0: 64 65 6e 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69  den;.  }.}.#endi
84f0: 66 0a 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20  f.../*.** Add a 
8500: 6e 65 77 20 63 6f 6c 75 6d 6e 20 74 6f 20 74 68  new column to th
8510: 65 20 74 61 62 6c 65 20 63 75 72 72 65 6e 74 6c  e table currentl
8520: 79 20 62 65 69 6e 67 20 63 6f 6e 73 74 72 75 63  y being construc
8530: 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70  ted..**.** The p
8540: 61 72 73 65 72 20 63 61 6c 6c 73 20 74 68 69 73  arser calls this
8550: 20 72 6f 75 74 69 6e 65 20 6f 6e 63 65 20 66 6f   routine once fo
8560: 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e 20 64 65  r each column de
8570: 63 6c 61 72 61 74 69 6f 6e 0a 2a 2a 20 69 6e 20  claration.** in 
8580: 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73  a CREATE TABLE s
8590: 74 61 74 65 6d 65 6e 74 2e 20 20 73 71 6c 69 74  tatement.  sqlit
85a0: 65 33 53 74 61 72 74 54 61 62 6c 65 28 29 20 67  e3StartTable() g
85b0: 65 74 73 20 63 61 6c 6c 65 64 0a 2a 2a 20 66 69  ets called.** fi
85c0: 72 73 74 20 74 6f 20 67 65 74 20 74 68 69 6e 67  rst to get thing
85d0: 73 20 67 6f 69 6e 67 2e 20 20 54 68 65 6e 20 74  s going.  Then t
85e0: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
85f0: 61 6c 6c 65 64 20 66 6f 72 20 65 61 63 68 0a 2a  alled for each.*
8600: 2a 20 63 6f 6c 75 6d 6e 2e 0a 2a 2f 0a 76 6f 69  * column..*/.voi
8610: 64 20 73 71 6c 69 74 65 33 41 64 64 43 6f 6c 75  d sqlite3AddColu
8620: 6d 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  mn(Parse *pParse
8630: 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 2c 20  , Token *pName, 
8640: 54 6f 6b 65 6e 20 2a 70 54 79 70 65 29 7b 0a 20  Token *pType){. 
8650: 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 69 6e 74   Table *p;.  int
8660: 20 69 3b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20   i;.  char *z;. 
8670: 20 63 68 61 72 20 2a 7a 54 79 70 65 3b 0a 20 20   char *zType;.  
8680: 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20  Column *pCol;.  
8690: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
86a0: 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20  arse->db;.  if( 
86b0: 28 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65  (p = pParse->pNe
86c0: 77 54 61 62 6c 65 29 3d 3d 30 20 29 20 72 65 74  wTable)==0 ) ret
86d0: 75 72 6e 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f  urn;.#if SQLITE_
86e0: 4d 41 58 5f 43 4f 4c 55 4d 4e 0a 20 20 69 66 28  MAX_COLUMN.  if(
86f0: 20 70 2d 3e 6e 43 6f 6c 2b 31 3e 64 62 2d 3e 61   p->nCol+1>db->a
8700: 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d  Limit[SQLITE_LIM
8710: 49 54 5f 43 4f 4c 55 4d 4e 5d 20 29 7b 0a 20 20  IT_COLUMN] ){.  
8720: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
8730: 67 28 70 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d  g(pParse, "too m
8740: 61 6e 79 20 63 6f 6c 75 6d 6e 73 20 6f 6e 20 25  any columns on %
8750: 73 22 2c 20 70 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  s", p->zName);. 
8760: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 23     return;.  }.#
8770: 65 6e 64 69 66 0a 20 20 7a 20 3d 20 73 71 6c 69  endif.  z = sqli
8780: 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64  te3DbMallocRaw(d
8790: 62 2c 20 70 4e 61 6d 65 2d 3e 6e 20 2b 20 70 54  b, pName->n + pT
87a0: 79 70 65 2d 3e 6e 20 2b 20 32 29 3b 0a 20 20 69  ype->n + 2);.  i
87b0: 66 28 20 7a 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( z==0 ) return
87c0: 3b 0a 20 20 6d 65 6d 63 70 79 28 7a 2c 20 70 4e  ;.  memcpy(z, pN
87d0: 61 6d 65 2d 3e 7a 2c 20 70 4e 61 6d 65 2d 3e 6e  ame->z, pName->n
87e0: 29 3b 0a 20 20 7a 5b 70 4e 61 6d 65 2d 3e 6e 5d  );.  z[pName->n]
87f0: 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 44   = 0;.  sqlite3D
8800: 65 71 75 6f 74 65 28 7a 29 3b 0a 20 20 66 6f 72  equote(z);.  for
8810: 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 3b  (i=0; i<p->nCol;
8820: 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73   i++){.    if( s
8830: 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28 7a  qlite3_stricmp(z
8840: 2c 20 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e 61  , p->aCol[i].zNa
8850: 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  me)==0 ){.      
8860: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
8870: 70 50 61 72 73 65 2c 20 22 64 75 70 6c 69 63 61  pParse, "duplica
8880: 74 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 3a 20  te column name: 
8890: 25 73 22 2c 20 7a 29 3b 0a 20 20 20 20 20 20 73  %s", z);.      s
88a0: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
88b0: 20 7a 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72   z);.      retur
88c0: 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  n;.    }.  }.  i
88d0: 66 28 20 28 70 2d 3e 6e 43 6f 6c 20 26 20 30 78  f( (p->nCol & 0x
88e0: 37 29 3d 3d 30 20 29 7b 0a 20 20 20 20 43 6f 6c  7)==0 ){.    Col
88f0: 75 6d 6e 20 2a 61 4e 65 77 3b 0a 20 20 20 20 61  umn *aNew;.    a
8900: 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62 52  New = sqlite3DbR
8910: 65 61 6c 6c 6f 63 28 64 62 2c 70 2d 3e 61 43 6f  ealloc(db,p->aCo
8920: 6c 2c 28 70 2d 3e 6e 43 6f 6c 2b 38 29 2a 73 69  l,(p->nCol+8)*si
8930: 7a 65 6f 66 28 70 2d 3e 61 43 6f 6c 5b 30 5d 29  zeof(p->aCol[0])
8940: 29 3b 0a 20 20 20 20 69 66 28 20 61 4e 65 77 3d  );.    if( aNew=
8950: 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
8960: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 29  te3DbFree(db, z)
8970: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a  ;.      return;.
8980: 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 61 43 6f      }.    p->aCo
8990: 6c 20 3d 20 61 4e 65 77 3b 0a 20 20 7d 0a 20 20  l = aNew;.  }.  
89a0: 70 43 6f 6c 20 3d 20 26 70 2d 3e 61 43 6f 6c 5b  pCol = &p->aCol[
89b0: 70 2d 3e 6e 43 6f 6c 5d 3b 0a 20 20 6d 65 6d 73  p->nCol];.  mems
89c0: 65 74 28 70 43 6f 6c 2c 20 30 2c 20 73 69 7a 65  et(pCol, 0, size
89d0: 6f 66 28 70 2d 3e 61 43 6f 6c 5b 30 5d 29 29 3b  of(p->aCol[0]));
89e0: 0a 20 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 20 3d  .  pCol->zName =
89f0: 20 7a 3b 0a 20 20 73 71 6c 69 74 65 33 43 6f 6c   z;.  sqlite3Col
8a00: 75 6d 6e 50 72 6f 70 65 72 74 69 65 73 46 72 6f  umnPropertiesFro
8a10: 6d 4e 61 6d 65 28 70 2c 20 70 43 6f 6c 29 3b 0a  mName(p, pCol);.
8a20: 20 0a 20 20 69 66 28 20 70 54 79 70 65 2d 3e 6e   .  if( pType->n
8a30: 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66  ==0 ){.    /* If
8a40: 20 74 68 65 72 65 20 69 73 20 6e 6f 20 74 79 70   there is no typ
8a50: 65 20 73 70 65 63 69 66 69 65 64 2c 20 63 6f 6c  e specified, col
8a60: 75 6d 6e 73 20 68 61 76 65 20 74 68 65 20 64 65  umns have the de
8a70: 66 61 75 6c 74 20 61 66 66 69 6e 69 74 79 0a 20  fault affinity. 
8a80: 20 20 20 2a 2a 20 27 42 4c 4f 42 27 2e 20 2a 2f     ** 'BLOB'. */
8a90: 0a 20 20 20 20 70 43 6f 6c 2d 3e 61 66 66 69 6e  .    pCol->affin
8aa0: 69 74 79 20 3d 20 53 51 4c 49 54 45 5f 41 46 46  ity = SQLITE_AFF
8ab0: 5f 42 4c 4f 42 3b 0a 20 20 20 20 70 43 6f 6c 2d  _BLOB;.    pCol-
8ac0: 3e 73 7a 45 73 74 20 3d 20 31 3b 0a 20 20 7d 65  >szEst = 1;.  }e
8ad0: 6c 73 65 7b 0a 20 20 20 20 7a 54 79 70 65 20 3d  lse{.    zType =
8ae0: 20 7a 20 2b 20 73 71 6c 69 74 65 33 53 74 72 6c   z + sqlite3Strl
8af0: 65 6e 33 30 28 7a 29 20 2b 20 31 3b 0a 20 20 20  en30(z) + 1;.   
8b00: 20 6d 65 6d 63 70 79 28 7a 54 79 70 65 2c 20 70   memcpy(zType, p
8b10: 54 79 70 65 2d 3e 7a 2c 20 70 54 79 70 65 2d 3e  Type->z, pType->
8b20: 6e 29 3b 0a 20 20 20 20 7a 54 79 70 65 5b 70 54  n);.    zType[pT
8b30: 79 70 65 2d 3e 6e 5d 20 3d 20 30 3b 0a 20 20 20  ype->n] = 0;.   
8b40: 20 73 71 6c 69 74 65 33 44 65 71 75 6f 74 65 28   sqlite3Dequote(
8b50: 7a 54 79 70 65 29 3b 0a 20 20 20 20 70 43 6f 6c  zType);.    pCol
8b60: 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20 73 71 6c  ->affinity = sql
8b70: 69 74 65 33 41 66 66 69 6e 69 74 79 54 79 70 65  ite3AffinityType
8b80: 28 7a 54 79 70 65 2c 20 26 70 43 6f 6c 2d 3e 73  (zType, &pCol->s
8b90: 7a 45 73 74 29 3b 0a 20 20 20 20 70 43 6f 6c 2d  zEst);.    pCol-
8ba0: 3e 63 6f 6c 46 6c 61 67 73 20 7c 3d 20 43 4f 4c  >colFlags |= COL
8bb0: 46 4c 41 47 5f 48 41 53 54 59 50 45 3b 0a 20 20  FLAG_HASTYPE;.  
8bc0: 7d 0a 20 20 70 2d 3e 6e 43 6f 6c 2b 2b 3b 0a 20  }.  p->nCol++;. 
8bd0: 20 70 50 61 72 73 65 2d 3e 63 6f 6e 73 74 72 61   pParse->constra
8be0: 69 6e 74 4e 61 6d 65 2e 6e 20 3d 20 30 3b 0a 7d  intName.n = 0;.}
8bf0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
8c00: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 62  tine is called b
8c10: 79 20 74 68 65 20 70 61 72 73 65 72 20 77 68 69  y the parser whi
8c20: 6c 65 20 69 6e 20 74 68 65 20 6d 69 64 64 6c 65  le in the middle
8c30: 20 6f 66 0a 2a 2a 20 70 61 72 73 69 6e 67 20 61   of.** parsing a
8c40: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74   CREATE TABLE st
8c50: 61 74 65 6d 65 6e 74 2e 20 20 41 20 22 4e 4f 54  atement.  A "NOT
8c60: 20 4e 55 4c 4c 22 20 63 6f 6e 73 74 72 61 69 6e   NULL" constrain
8c70: 74 20 68 61 73 0a 2a 2a 20 62 65 65 6e 20 73 65  t has.** been se
8c80: 65 6e 20 6f 6e 20 61 20 63 6f 6c 75 6d 6e 2e 20  en on a column. 
8c90: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65   This routine se
8ca0: 74 73 20 74 68 65 20 6e 6f 74 4e 75 6c 6c 20 66  ts the notNull f
8cb0: 6c 61 67 20 6f 6e 0a 2a 2a 20 74 68 65 20 63 6f  lag on.** the co
8cc0: 6c 75 6d 6e 20 63 75 72 72 65 6e 74 6c 79 20 75  lumn currently u
8cd0: 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f  nder constructio
8ce0: 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  n..*/.void sqlit
8cf0: 65 33 41 64 64 4e 6f 74 4e 75 6c 6c 28 50 61 72  e3AddNotNull(Par
8d00: 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20  se *pParse, int 
8d10: 6f 6e 45 72 72 6f 72 29 7b 0a 20 20 54 61 62 6c  onError){.  Tabl
8d20: 65 20 2a 70 3b 0a 20 20 70 20 3d 20 70 50 61 72  e *p;.  p = pPar
8d30: 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20  se->pNewTable;. 
8d40: 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20 4e 45 56   if( p==0 || NEV
8d50: 45 52 28 70 2d 3e 6e 43 6f 6c 3c 31 29 20 29 20  ER(p->nCol<1) ) 
8d60: 72 65 74 75 72 6e 3b 0a 20 20 70 2d 3e 61 43 6f  return;.  p->aCo
8d70: 6c 5b 70 2d 3e 6e 43 6f 6c 2d 31 5d 2e 6e 6f 74  l[p->nCol-1].not
8d80: 4e 75 6c 6c 20 3d 20 28 75 38 29 6f 6e 45 72 72  Null = (u8)onErr
8d90: 6f 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 63 61  or;.}../*.** Sca
8da0: 6e 20 74 68 65 20 63 6f 6c 75 6d 6e 20 74 79 70  n the column typ
8db0: 65 20 6e 61 6d 65 20 7a 54 79 70 65 20 28 6c 65  e name zType (le
8dc0: 6e 67 74 68 20 6e 54 79 70 65 29 20 61 6e 64 20  ngth nType) and 
8dd0: 72 65 74 75 72 6e 20 74 68 65 0a 2a 2a 20 61 73  return the.** as
8de0: 73 6f 63 69 61 74 65 64 20 61 66 66 69 6e 69 74  sociated affinit
8df0: 79 20 74 79 70 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  y type..**.** Th
8e00: 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20  is routine does 
8e10: 61 20 63 61 73 65 2d 69 6e 64 65 70 65 6e 64 65  a case-independe
8e20: 6e 74 20 73 65 61 72 63 68 20 6f 66 20 7a 54 79  nt search of zTy
8e30: 70 65 20 66 6f 72 20 74 68 65 20 0a 2a 2a 20 73  pe for the .** s
8e40: 75 62 73 74 72 69 6e 67 73 20 69 6e 20 74 68 65  ubstrings in the
8e50: 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 61 62 6c 65   following table
8e60: 2e 20 49 66 20 6f 6e 65 20 6f 66 20 74 68 65 20  . If one of the 
8e70: 73 75 62 73 74 72 69 6e 67 73 20 69 73 0a 2a 2a  substrings is.**
8e80: 20 66 6f 75 6e 64 2c 20 74 68 65 20 63 6f 72 72   found, the corr
8e90: 65 73 70 6f 6e 64 69 6e 67 20 61 66 66 69 6e 69  esponding affini
8ea0: 74 79 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  ty is returned. 
8eb0: 49 66 20 7a 54 79 70 65 20 63 6f 6e 74 61 69 6e  If zType contain
8ec0: 73 0a 2a 2a 20 6d 6f 72 65 20 74 68 61 6e 20 6f  s.** more than o
8ed0: 6e 65 20 6f 66 20 74 68 65 20 73 75 62 73 74 72  ne of the substr
8ee0: 69 6e 67 73 2c 20 65 6e 74 72 69 65 73 20 74 6f  ings, entries to
8ef0: 77 61 72 64 20 74 68 65 20 74 6f 70 20 6f 66 20  ward the top of 
8f00: 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 74 61  .** the table ta
8f10: 6b 65 20 70 72 69 6f 72 69 74 79 2e 20 46 6f 72  ke priority. For
8f20: 20 65 78 61 6d 70 6c 65 2c 20 69 66 20 7a 54 79   example, if zTy
8f30: 70 65 20 69 73 20 27 42 4c 4f 42 49 4e 54 27 2c  pe is 'BLOBINT',
8f40: 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f   .** SQLITE_AFF_
8f50: 49 4e 54 45 47 45 52 20 69 73 20 72 65 74 75 72  INTEGER is retur
8f60: 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 53 75 62 73 74  ned..**.** Subst
8f70: 72 69 6e 67 20 20 20 20 20 7c 20 41 66 66 69 6e  ring     | Affin
8f80: 69 74 79 0a 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d  ity.** ---------
8f90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8fa0: 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 27 49 4e 54 27  -------.** 'INT'
8fb0: 20 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54           | SQLIT
8fc0: 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 0a 2a 2a  E_AFF_INTEGER.**
8fd0: 20 27 43 48 41 52 27 20 20 20 20 20 20 20 20 7c   'CHAR'        |
8fe0: 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54   SQLITE_AFF_TEXT
8ff0: 0a 2a 2a 20 27 43 4c 4f 42 27 20 20 20 20 20 20  .** 'CLOB'      
9000: 20 20 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f 54    | SQLITE_AFF_T
9010: 45 58 54 0a 2a 2a 20 27 54 45 58 54 27 20 20 20  EXT.** 'TEXT'   
9020: 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 41 46       | SQLITE_AF
9030: 46 5f 54 45 58 54 0a 2a 2a 20 27 42 4c 4f 42 27  F_TEXT.** 'BLOB'
9040: 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45          | SQLITE
9050: 5f 41 46 46 5f 42 4c 4f 42 0a 2a 2a 20 27 52 45  _AFF_BLOB.** 'RE
9060: 41 4c 27 20 20 20 20 20 20 20 20 7c 20 53 51 4c  AL'        | SQL
9070: 49 54 45 5f 41 46 46 5f 52 45 41 4c 0a 2a 2a 20  ITE_AFF_REAL.** 
9080: 27 46 4c 4f 41 27 20 20 20 20 20 20 20 20 7c 20  'FLOA'        | 
9090: 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 0a  SQLITE_AFF_REAL.
90a0: 2a 2a 20 27 44 4f 55 42 27 20 20 20 20 20 20 20  ** 'DOUB'       
90b0: 20 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f 52 45   | SQLITE_AFF_RE
90c0: 41 4c 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 6e 65  AL.**.** If none
90d0: 20 6f 66 20 74 68 65 20 73 75 62 73 74 72 69 6e   of the substrin
90e0: 67 73 20 69 6e 20 74 68 65 20 61 62 6f 76 65 20  gs in the above 
90f0: 74 61 62 6c 65 20 61 72 65 20 66 6f 75 6e 64 2c  table are found,
9100: 0a 2a 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e  .** SQLITE_AFF_N
9110: 55 4d 45 52 49 43 20 69 73 20 72 65 74 75 72 6e  UMERIC is return
9120: 65 64 2e 0a 2a 2f 0a 63 68 61 72 20 73 71 6c 69  ed..*/.char sqli
9130: 74 65 33 41 66 66 69 6e 69 74 79 54 79 70 65 28  te3AffinityType(
9140: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 6e 2c  const char *zIn,
9150: 20 75 38 20 2a 70 73 7a 45 73 74 29 7b 0a 20 20   u8 *pszEst){.  
9160: 75 33 32 20 68 20 3d 20 30 3b 0a 20 20 63 68 61  u32 h = 0;.  cha
9170: 72 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41  r aff = SQLITE_A
9180: 46 46 5f 4e 55 4d 45 52 49 43 3b 0a 20 20 63 6f  FF_NUMERIC;.  co
9190: 6e 73 74 20 63 68 61 72 20 2a 7a 43 68 61 72 20  nst char *zChar 
91a0: 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  = 0;..  assert( 
91b0: 7a 49 6e 21 3d 30 20 29 3b 0a 20 20 77 68 69 6c  zIn!=0 );.  whil
91c0: 65 28 20 7a 49 6e 5b 30 5d 20 29 7b 0a 20 20 20  e( zIn[0] ){.   
91d0: 20 68 20 3d 20 28 68 3c 3c 38 29 20 2b 20 73 71   h = (h<<8) + sq
91e0: 6c 69 74 65 33 55 70 70 65 72 54 6f 4c 6f 77 65  lite3UpperToLowe
91f0: 72 5b 28 2a 7a 49 6e 29 26 30 78 66 66 5d 3b 0a  r[(*zIn)&0xff];.
9200: 20 20 20 20 7a 49 6e 2b 2b 3b 0a 20 20 20 20 69      zIn++;.    i
9210: 66 28 20 68 3d 3d 28 28 27 63 27 3c 3c 32 34 29  f( h==(('c'<<24)
9220: 2b 28 27 68 27 3c 3c 31 36 29 2b 28 27 61 27 3c  +('h'<<16)+('a'<
9230: 3c 38 29 2b 27 72 27 29 20 29 7b 20 20 20 20 20  <8)+'r') ){     
9240: 20 20 20 20 20 20 20 20 2f 2a 20 43 48 41 52 20          /* CHAR 
9250: 2a 2f 0a 20 20 20 20 20 20 61 66 66 20 3d 20 53  */.      aff = S
9260: 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 3b 0a  QLITE_AFF_TEXT;.
9270: 20 20 20 20 20 20 7a 43 68 61 72 20 3d 20 7a 49        zChar = zI
9280: 6e 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  n;.    }else if(
9290: 20 68 3d 3d 28 28 27 63 27 3c 3c 32 34 29 2b 28   h==(('c'<<24)+(
92a0: 27 6c 27 3c 3c 31 36 29 2b 28 27 6f 27 3c 3c 38  'l'<<16)+('o'<<8
92b0: 29 2b 27 62 27 29 20 29 7b 20 20 20 20 20 20 20  )+'b') ){       
92c0: 2f 2a 20 43 4c 4f 42 20 2a 2f 0a 20 20 20 20 20  /* CLOB */.     
92d0: 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46   aff = SQLITE_AF
92e0: 46 5f 54 45 58 54 3b 0a 20 20 20 20 7d 65 6c 73  F_TEXT;.    }els
92f0: 65 20 69 66 28 20 68 3d 3d 28 28 27 74 27 3c 3c  e if( h==(('t'<<
9300: 32 34 29 2b 28 27 65 27 3c 3c 31 36 29 2b 28 27  24)+('e'<<16)+('
9310: 78 27 3c 3c 38 29 2b 27 74 27 29 20 29 7b 20 20  x'<<8)+'t') ){  
9320: 20 20 20 20 20 2f 2a 20 54 45 58 54 20 2a 2f 0a       /* TEXT */.
9330: 20 20 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49        aff = SQLI
9340: 54 45 5f 41 46 46 5f 54 45 58 54 3b 0a 20 20 20  TE_AFF_TEXT;.   
9350: 20 7d 65 6c 73 65 20 69 66 28 20 68 3d 3d 28 28   }else if( h==((
9360: 27 62 27 3c 3c 32 34 29 2b 28 27 6c 27 3c 3c 31  'b'<<24)+('l'<<1
9370: 36 29 2b 28 27 6f 27 3c 3c 38 29 2b 27 62 27 29  6)+('o'<<8)+'b')
9380: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 4c 4f            /* BLO
9390: 42 20 2a 2f 0a 20 20 20 20 20 20 20 20 26 26 20  B */.        && 
93a0: 28 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46  (aff==SQLITE_AFF
93b0: 5f 4e 55 4d 45 52 49 43 20 7c 7c 20 61 66 66 3d  _NUMERIC || aff=
93c0: 3d 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c  =SQLITE_AFF_REAL
93d0: 29 20 29 7b 0a 20 20 20 20 20 20 61 66 66 20 3d  ) ){.      aff =
93e0: 20 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42   SQLITE_AFF_BLOB
93f0: 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 49 6e 5b  ;.      if( zIn[
9400: 30 5d 3d 3d 27 28 27 20 29 20 7a 43 68 61 72 20  0]=='(' ) zChar 
9410: 3d 20 7a 49 6e 3b 0a 23 69 66 6e 64 65 66 20 53  = zIn;.#ifndef S
9420: 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54  QLITE_OMIT_FLOAT
9430: 49 4e 47 5f 50 4f 49 4e 54 0a 20 20 20 20 7d 65  ING_POINT.    }e
9440: 6c 73 65 20 69 66 28 20 68 3d 3d 28 28 27 72 27  lse if( h==(('r'
9450: 3c 3c 32 34 29 2b 28 27 65 27 3c 3c 31 36 29 2b  <<24)+('e'<<16)+
9460: 28 27 61 27 3c 3c 38 29 2b 27 6c 27 29 20 20 20  ('a'<<8)+'l')   
9470: 20 20 20 20 20 20 20 2f 2a 20 52 45 41 4c 20 2a         /* REAL *
9480: 2f 0a 20 20 20 20 20 20 20 20 26 26 20 61 66 66  /.        && aff
9490: 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d  ==SQLITE_AFF_NUM
94a0: 45 52 49 43 20 29 7b 0a 20 20 20 20 20 20 61 66  ERIC ){.      af
94b0: 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 52  f = SQLITE_AFF_R
94c0: 45 41 4c 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  EAL;.    }else i
94d0: 66 28 20 68 3d 3d 28 28 27 66 27 3c 3c 32 34 29  f( h==(('f'<<24)
94e0: 2b 28 27 6c 27 3c 3c 31 36 29 2b 28 27 6f 27 3c  +('l'<<16)+('o'<
94f0: 3c 38 29 2b 27 61 27 29 20 20 20 20 20 20 20 20  <8)+'a')        
9500: 20 20 2f 2a 20 46 4c 4f 41 20 2a 2f 0a 20 20 20    /* FLOA */.   
9510: 20 20 20 20 20 26 26 20 61 66 66 3d 3d 53 51 4c       && aff==SQL
9520: 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20  ITE_AFF_NUMERIC 
9530: 29 7b 0a 20 20 20 20 20 20 61 66 66 20 3d 20 53  ){.      aff = S
9540: 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 3b 0a  QLITE_AFF_REAL;.
9550: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 68 3d      }else if( h=
9560: 3d 28 28 27 64 27 3c 3c 32 34 29 2b 28 27 6f 27  =(('d'<<24)+('o'
9570: 3c 3c 31 36 29 2b 28 27 75 27 3c 3c 38 29 2b 27  <<16)+('u'<<8)+'
9580: 62 27 29 20 20 20 20 20 20 20 20 20 20 2f 2a 20  b')          /* 
9590: 44 4f 55 42 20 2a 2f 0a 20 20 20 20 20 20 20 20  DOUB */.        
95a0: 26 26 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41  && aff==SQLITE_A
95b0: 46 46 5f 4e 55 4d 45 52 49 43 20 29 7b 0a 20 20  FF_NUMERIC ){.  
95c0: 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49 54 45      aff = SQLITE
95d0: 5f 41 46 46 5f 52 45 41 4c 3b 0a 23 65 6e 64 69  _AFF_REAL;.#endi
95e0: 66 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  f.    }else if( 
95f0: 28 68 26 30 78 30 30 46 46 46 46 46 46 29 3d 3d  (h&0x00FFFFFF)==
9600: 28 28 27 69 27 3c 3c 31 36 29 2b 28 27 6e 27 3c  (('i'<<16)+('n'<
9610: 3c 38 29 2b 27 74 27 29 20 29 7b 20 20 20 20 2f  <8)+'t') ){    /
9620: 2a 20 49 4e 54 20 2a 2f 0a 20 20 20 20 20 20 61  * INT */.      a
9630: 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f  ff = SQLITE_AFF_
9640: 49 4e 54 45 47 45 52 3b 0a 20 20 20 20 20 20 62  INTEGER;.      b
9650: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
9660: 0a 20 20 2f 2a 20 49 66 20 70 73 7a 45 73 74 20  .  /* If pszEst 
9670: 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 73 74 6f  is not NULL, sto
9680: 72 65 20 61 6e 20 65 73 74 69 6d 61 74 65 20 6f  re an estimate o
9690: 66 20 74 68 65 20 66 69 65 6c 64 20 73 69 7a 65  f the field size
96a0: 2e 20 20 54 68 65 0a 20 20 2a 2a 20 65 73 74 69  .  The.  ** esti
96b0: 6d 61 74 65 20 69 73 20 73 63 61 6c 65 64 20 73  mate is scaled s
96c0: 6f 20 74 68 61 74 20 74 68 65 20 73 69 7a 65 20  o that the size 
96d0: 6f 66 20 61 6e 20 69 6e 74 65 67 65 72 20 69 73  of an integer is
96e0: 20 31 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70 73   1.  */.  if( ps
96f0: 7a 45 73 74 20 29 7b 0a 20 20 20 20 2a 70 73 7a  zEst ){.    *psz
9700: 45 73 74 20 3d 20 31 3b 20 20 20 2f 2a 20 64 65  Est = 1;   /* de
9710: 66 61 75 6c 74 20 73 69 7a 65 20 69 73 20 61 70  fault size is ap
9720: 70 72 6f 78 20 34 20 62 79 74 65 73 20 2a 2f 0a  prox 4 bytes */.
9730: 20 20 20 20 69 66 28 20 61 66 66 3c 53 51 4c 49      if( aff<SQLI
9740: 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20 29  TE_AFF_NUMERIC )
9750: 7b 0a 20 20 20 20 20 20 69 66 28 20 7a 43 68 61  {.      if( zCha
9760: 72 20 29 7b 0a 20 20 20 20 20 20 20 20 77 68 69  r ){.        whi
9770: 6c 65 28 20 7a 43 68 61 72 5b 30 5d 20 29 7b 0a  le( zChar[0] ){.
9780: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71            if( sq
9790: 6c 69 74 65 33 49 73 64 69 67 69 74 28 7a 43 68  lite3Isdigit(zCh
97a0: 61 72 5b 30 5d 29 20 29 7b 0a 20 20 20 20 20 20  ar[0]) ){.      
97b0: 20 20 20 20 20 20 69 6e 74 20 76 20 3d 20 30 3b        int v = 0;
97c0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
97d0: 69 74 65 33 47 65 74 49 6e 74 33 32 28 7a 43 68  ite3GetInt32(zCh
97e0: 61 72 2c 20 26 76 29 3b 0a 20 20 20 20 20 20 20  ar, &v);.       
97f0: 20 20 20 20 20 76 20 3d 20 76 2f 34 20 2b 20 31       v = v/4 + 1
9800: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
9810: 28 20 76 3e 32 35 35 20 29 20 76 20 3d 20 32 35  ( v>255 ) v = 25
9820: 35 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  5;.            *
9830: 70 73 7a 45 73 74 20 3d 20 76 3b 20 2f 2a 20 42  pszEst = v; /* B
9840: 4c 4f 42 28 6b 29 2c 20 56 41 52 43 48 41 52 28  LOB(k), VARCHAR(
9850: 6b 29 2c 20 43 48 41 52 28 6b 29 20 2d 3e 20 72  k), CHAR(k) -> r
9860: 3d 28 6b 2f 34 2b 31 29 20 2a 2f 0a 20 20 20 20  =(k/4+1) */.    
9870: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
9880: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
9890: 20 20 20 20 20 7a 43 68 61 72 2b 2b 3b 0a 20 20       zChar++;.  
98a0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
98b0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2a 70 73  lse{.        *ps
98c0: 7a 45 73 74 20 3d 20 35 3b 20 20 20 2f 2a 20 42  zEst = 5;   /* B
98d0: 4c 4f 42 2c 20 54 45 58 54 2c 20 43 4c 4f 42 20  LOB, TEXT, CLOB 
98e0: 2d 3e 20 72 3d 35 20 20 28 61 70 70 72 6f 78 20  -> r=5  (approx 
98f0: 32 30 20 62 79 74 65 73 29 2a 2f 0a 20 20 20 20  20 bytes)*/.    
9900: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
9910: 72 65 74 75 72 6e 20 61 66 66 3b 0a 7d 0a 0a 2f  return aff;.}../
9920: 2a 0a 2a 2a 20 54 68 65 20 65 78 70 72 65 73 73  *.** The express
9930: 69 6f 6e 20 69 73 20 74 68 65 20 64 65 66 61 75  ion is the defau
9940: 6c 74 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65  lt value for the
9950: 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 61   most recently a
9960: 64 64 65 64 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 6f  dded column.** o
9970: 66 20 74 68 65 20 74 61 62 6c 65 20 63 75 72 72  f the table curr
9980: 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73  ently under cons
9990: 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  truction..**.** 
99a0: 44 65 66 61 75 6c 74 20 76 61 6c 75 65 20 65 78  Default value ex
99b0: 70 72 65 73 73 69 6f 6e 73 20 6d 75 73 74 20 62  pressions must b
99c0: 65 20 63 6f 6e 73 74 61 6e 74 2e 20 20 52 61 69  e constant.  Rai
99d0: 73 65 20 61 6e 20 65 78 63 65 70 74 69 6f 6e 20  se an exception 
99e0: 69 66 20 74 68 69 73 0a 2a 2a 20 69 73 20 6e 6f  if this.** is no
99f0: 74 20 74 68 65 20 63 61 73 65 2e 0a 2a 2a 0a 2a  t the case..**.*
9a00: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
9a10: 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20  s called by the 
9a20: 70 61 72 73 65 72 20 77 68 69 6c 65 20 69 6e 20  parser while in 
9a30: 74 68 65 20 6d 69 64 64 6c 65 20 6f 66 0a 2a 2a  the middle of.**
9a40: 20 70 61 72 73 69 6e 67 20 61 20 43 52 45 41 54   parsing a CREAT
9a50: 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e  E TABLE statemen
9a60: 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  t..*/.void sqlit
9a70: 65 33 41 64 64 44 65 66 61 75 6c 74 56 61 6c 75  e3AddDefaultValu
9a80: 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
9a90: 20 45 78 70 72 53 70 61 6e 20 2a 70 53 70 61 6e   ExprSpan *pSpan
9aa0: 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20  ){.  Table *p;. 
9ab0: 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20   Column *pCol;. 
9ac0: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
9ad0: 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 70 20 3d  Parse->db;.  p =
9ae0: 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
9af0: 6c 65 3b 0a 20 20 69 66 28 20 70 21 3d 30 20 29  le;.  if( p!=0 )
9b00: 7b 0a 20 20 20 20 70 43 6f 6c 20 3d 20 26 28 70  {.    pCol = &(p
9b10: 2d 3e 61 43 6f 6c 5b 70 2d 3e 6e 43 6f 6c 2d 31  ->aCol[p->nCol-1
9b20: 5d 29 3b 0a 20 20 20 20 69 66 28 20 21 73 71 6c  ]);.    if( !sql
9b30: 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61  ite3ExprIsConsta
9b40: 6e 74 4f 72 46 75 6e 63 74 69 6f 6e 28 70 53 70  ntOrFunction(pSp
9b50: 61 6e 2d 3e 70 45 78 70 72 2c 20 64 62 2d 3e 69  an->pExpr, db->i
9b60: 6e 69 74 2e 62 75 73 79 29 20 29 7b 0a 20 20 20  nit.busy) ){.   
9b70: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
9b80: 73 67 28 70 50 61 72 73 65 2c 20 22 64 65 66 61  sg(pParse, "defa
9b90: 75 6c 74 20 76 61 6c 75 65 20 6f 66 20 63 6f 6c  ult value of col
9ba0: 75 6d 6e 20 5b 25 73 5d 20 69 73 20 6e 6f 74 20  umn [%s] is not 
9bb0: 63 6f 6e 73 74 61 6e 74 22 2c 0a 20 20 20 20 20  constant",.     
9bc0: 20 20 20 20 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65       pCol->zName
9bd0: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
9be0: 20 20 20 20 2f 2a 20 41 20 63 6f 70 79 20 6f 66      /* A copy of
9bf0: 20 70 45 78 70 72 20 69 73 20 75 73 65 64 20 69   pExpr is used i
9c00: 6e 73 74 65 61 64 20 6f 66 20 74 68 65 20 6f 72  nstead of the or
9c10: 69 67 69 6e 61 6c 2c 20 61 73 20 70 45 78 70 72  iginal, as pExpr
9c20: 20 63 6f 6e 74 61 69 6e 73 0a 20 20 20 20 20 20   contains.      
9c30: 2a 2a 20 74 6f 6b 65 6e 73 20 74 68 61 74 20 70  ** tokens that p
9c40: 6f 69 6e 74 20 74 6f 20 76 6f 6c 61 74 69 6c 65  oint to volatile
9c50: 20 6d 65 6d 6f 72 79 2e 20 54 68 65 20 27 73 70   memory. The 'sp
9c60: 61 6e 27 20 6f 66 20 74 68 65 20 65 78 70 72 65  an' of the expre
9c70: 73 73 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 69  ssion.      ** i
9c80: 73 20 72 65 71 75 69 72 65 64 20 62 79 20 70 72  s required by pr
9c90: 61 67 6d 61 20 74 61 62 6c 65 5f 69 6e 66 6f 2e  agma table_info.
9ca0: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
9cb0: 45 78 70 72 20 78 3b 0a 20 20 20 20 20 20 73 71  Expr x;.      sq
9cc0: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
9cd0: 64 62 2c 20 70 43 6f 6c 2d 3e 70 44 66 6c 74 29  db, pCol->pDflt)
9ce0: 3b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26  ;.      memset(&
9cf0: 78 2c 20 30 2c 20 73 69 7a 65 6f 66 28 78 29 29  x, 0, sizeof(x))
9d00: 3b 0a 20 20 20 20 20 20 78 2e 6f 70 20 3d 20 54  ;.      x.op = T
9d10: 4b 5f 53 50 41 4e 3b 0a 20 20 20 20 20 20 78 2e  K_SPAN;.      x.
9d20: 75 2e 7a 54 6f 6b 65 6e 20 3d 20 73 71 6c 69 74  u.zToken = sqlit
9d30: 65 33 44 62 53 74 72 4e 44 75 70 28 64 62 2c 20  e3DbStrNDup(db, 
9d40: 28 63 68 61 72 2a 29 70 53 70 61 6e 2d 3e 7a 53  (char*)pSpan->zS
9d50: 74 61 72 74 2c 0a 20 20 20 20 20 20 20 20 20 20  tart,.          
9d60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9d70: 20 20 20 20 20 20 20 20 20 20 28 69 6e 74 29 28            (int)(
9d80: 70 53 70 61 6e 2d 3e 7a 45 6e 64 20 2d 20 70 53  pSpan->zEnd - pS
9d90: 70 61 6e 2d 3e 7a 53 74 61 72 74 29 29 3b 0a 20  pan->zStart));. 
9da0: 20 20 20 20 20 78 2e 70 4c 65 66 74 20 3d 20 70       x.pLeft = p
9db0: 53 70 61 6e 2d 3e 70 45 78 70 72 3b 0a 20 20 20  Span->pExpr;.   
9dc0: 20 20 20 78 2e 66 6c 61 67 73 20 3d 20 45 50 5f     x.flags = EP_
9dd0: 53 6b 69 70 3b 0a 20 20 20 20 20 20 70 43 6f 6c  Skip;.      pCol
9de0: 2d 3e 70 44 66 6c 74 20 3d 20 73 71 6c 69 74 65  ->pDflt = sqlite
9df0: 33 45 78 70 72 44 75 70 28 64 62 2c 20 26 78 2c  3ExprDup(db, &x,
9e00: 20 45 58 50 52 44 55 50 5f 52 45 44 55 43 45 29   EXPRDUP_REDUCE)
9e10: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  ;.      sqlite3D
9e20: 62 46 72 65 65 28 64 62 2c 20 78 2e 75 2e 7a 54  bFree(db, x.u.zT
9e30: 6f 6b 65 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  oken);.    }.  }
9e40: 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65  .  sqlite3ExprDe
9e50: 6c 65 74 65 28 64 62 2c 20 70 53 70 61 6e 2d 3e  lete(db, pSpan->
9e60: 70 45 78 70 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pExpr);.}../*.**
9e70: 20 42 61 63 6b 77 61 72 64 73 20 43 6f 6d 70 61   Backwards Compa
9e80: 74 69 62 69 6c 69 74 79 20 48 61 63 6b 3a 0a 2a  tibility Hack:.*
9e90: 2a 20 0a 2a 2a 20 48 69 73 74 6f 72 69 63 61 6c  * .** Historical
9ea0: 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c   versions of SQL
9eb0: 69 74 65 20 61 63 63 65 70 74 65 64 20 73 74 72  ite accepted str
9ec0: 69 6e 67 73 20 61 73 20 63 6f 6c 75 6d 6e 20 6e  ings as column n
9ed0: 61 6d 65 73 20 69 6e 0a 2a 2a 20 69 6e 64 65 78  ames in.** index
9ee0: 65 73 20 61 6e 64 20 50 52 49 4d 41 52 59 20 4b  es and PRIMARY K
9ef0: 45 59 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 61  EY constraints a
9f00: 6e 64 20 69 6e 20 55 4e 49 51 55 45 20 63 6f 6e  nd in UNIQUE con
9f10: 73 74 72 61 69 6e 74 73 2e 20 20 45 78 61 6d 70  straints.  Examp
9f20: 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 43 52  le:.**.**     CR
9f30: 45 41 54 45 20 54 41 42 4c 45 20 78 79 7a 28 61  EATE TABLE xyz(a
9f40: 2c 62 2c 63 2c 64 2c 65 2c 50 52 49 4d 41 52 59  ,b,c,d,e,PRIMARY
9f50: 20 4b 45 59 28 27 61 27 29 2c 55 4e 49 51 55 45   KEY('a'),UNIQUE
9f60: 28 27 62 27 2c 27 63 27 20 43 4f 4c 4c 41 54 45  ('b','c' COLLATE
9f70: 20 74 72 69 6d 29 0a 2a 2a 20 20 20 20 20 43 52   trim).**     CR
9f80: 45 41 54 45 20 49 4e 44 45 58 20 61 62 63 20 4f  EATE INDEX abc O
9f90: 4e 20 78 79 7a 28 27 63 27 2c 27 64 27 20 44 45  N xyz('c','d' DE
9fa0: 53 43 2c 27 65 27 20 43 4f 4c 4c 41 54 45 20 6e  SC,'e' COLLATE n
9fb0: 6f 63 61 73 65 20 44 45 53 43 29 3b 0a 2a 2a 0a  ocase DESC);.**.
9fc0: 2a 2a 20 54 68 69 73 20 69 73 20 67 6f 6f 66 79  ** This is goofy
9fd0: 2e 20 20 42 75 74 20 74 6f 20 70 72 65 73 65 72  .  But to preser
9fe0: 76 65 20 62 61 63 6b 77 61 72 64 73 20 63 6f 6d  ve backwards com
9ff0: 70 61 74 69 62 69 6c 69 74 79 20 77 65 20 63 6f  patibility we co
a000: 6e 74 69 6e 75 65 20 74 6f 0a 2a 2a 20 61 63 63  ntinue to.** acc
a010: 65 70 74 20 69 74 2e 20 20 54 68 69 73 20 72 6f  ept it.  This ro
a020: 75 74 69 6e 65 20 64 6f 65 73 20 74 68 65 20 6e  utine does the n
a030: 65 63 65 73 73 61 72 79 20 63 6f 6e 76 65 72 73  ecessary convers
a040: 69 6f 6e 2e 20 20 49 74 20 63 6f 6e 76 65 72 74  ion.  It convert
a050: 73 0a 2a 2a 20 74 68 65 20 65 78 70 72 65 73 73  s.** the express
a060: 69 6f 6e 20 67 69 76 65 6e 20 69 6e 20 69 74 73  ion given in its
a070: 20 61 72 67 75 6d 65 6e 74 20 66 72 6f 6d 20 61   argument from a
a080: 20 54 4b 5f 53 54 52 49 4e 47 20 69 6e 74 6f 20   TK_STRING into 
a090: 61 20 54 4b 5f 49 44 0a 2a 2a 20 69 66 20 74 68  a TK_ID.** if th
a0a0: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
a0b0: 6a 75 73 74 20 61 20 54 4b 5f 53 54 52 49 4e 47  just a TK_STRING
a0c0: 20 77 69 74 68 20 61 6e 20 6f 70 74 69 6f 6e 61   with an optiona
a0d0: 6c 20 43 4f 4c 4c 41 54 45 20 63 6c 61 75 73 65  l COLLATE clause
a0e0: 2e 0a 2a 2a 20 49 66 20 74 68 65 20 65 70 78 72  ..** If the epxr
a0f0: 65 73 73 69 6f 6e 20 69 73 20 61 6e 79 74 68 69  ession is anythi
a100: 6e 67 20 6f 74 68 65 72 20 74 68 61 6e 20 54 4b  ng other than TK
a110: 5f 53 54 52 49 4e 47 2c 20 74 68 65 20 65 78 70  _STRING, the exp
a120: 72 65 73 73 69 6f 6e 20 69 73 0a 2a 2a 20 75 6e  ression is.** un
a130: 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 73 74 61 74  changed..*/.stat
a140: 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65 33 53  ic void sqlite3S
a150: 74 72 69 6e 67 54 6f 49 64 28 45 78 70 72 20 2a  tringToId(Expr *
a160: 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 6f 70 3d  p){.  if( p->op=
a170: 3d 54 4b 5f 53 54 52 49 4e 47 20 29 7b 0a 20 20  =TK_STRING ){.  
a180: 20 20 70 2d 3e 6f 70 20 3d 20 54 4b 5f 49 44 3b    p->op = TK_ID;
a190: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e  .  }else if( p->
a1a0: 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45 20 26  op==TK_COLLATE &
a1b0: 26 20 70 2d 3e 70 4c 65 66 74 2d 3e 6f 70 3d 3d  & p->pLeft->op==
a1c0: 54 4b 5f 53 54 52 49 4e 47 20 29 7b 0a 20 20 20  TK_STRING ){.   
a1d0: 20 70 2d 3e 70 4c 65 66 74 2d 3e 6f 70 20 3d 20   p->pLeft->op = 
a1e0: 54 4b 5f 49 44 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  TK_ID;.  }.}../*
a1f0: 0a 2a 2a 20 44 65 73 69 67 6e 61 74 65 20 74 68  .** Designate th
a200: 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 66 6f  e PRIMARY KEY fo
a210: 72 20 74 68 65 20 74 61 62 6c 65 2e 20 20 70 4c  r the table.  pL
a220: 69 73 74 20 69 73 20 61 20 6c 69 73 74 20 6f 66  ist is a list of
a230: 20 6e 61 6d 65 73 20 0a 2a 2a 20 6f 66 20 63 6f   names .** of co
a240: 6c 75 6d 6e 73 20 74 68 61 74 20 66 6f 72 6d 20  lumns that form 
a250: 74 68 65 20 70 72 69 6d 61 72 79 20 6b 65 79 2e  the primary key.
a260: 20 20 49 66 20 70 4c 69 73 74 20 69 73 20 4e 55    If pList is NU
a270: 4c 4c 2c 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20  LL, then the.** 
a280: 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 61 64  most recently ad
a290: 64 65 64 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68  ded column of th
a2a0: 65 20 74 61 62 6c 65 20 69 73 20 74 68 65 20 70  e table is the p
a2b0: 72 69 6d 61 72 79 20 6b 65 79 2e 0a 2a 2a 0a 2a  rimary key..**.*
a2c0: 2a 20 41 20 74 61 62 6c 65 20 63 61 6e 20 68 61  * A table can ha
a2d0: 76 65 20 61 74 20 6d 6f 73 74 20 6f 6e 65 20 70  ve at most one p
a2e0: 72 69 6d 61 72 79 20 6b 65 79 2e 20 20 49 66 20  rimary key.  If 
a2f0: 74 68 65 20 74 61 62 6c 65 20 61 6c 72 65 61 64  the table alread
a300: 79 20 68 61 73 0a 2a 2a 20 61 20 70 72 69 6d 61  y has.** a prima
a310: 72 79 20 6b 65 79 20 28 61 6e 64 20 74 68 69 73  ry key (and this
a320: 20 69 73 20 74 68 65 20 73 65 63 6f 6e 64 20 70   is the second p
a330: 72 69 6d 61 72 79 20 6b 65 79 29 20 74 68 65 6e  rimary key) then
a340: 20 63 72 65 61 74 65 20 61 6e 0a 2a 2a 20 65 72   create an.** er
a350: 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ror..**.** If th
a360: 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 69 73  e PRIMARY KEY is
a370: 20 6f 6e 20 61 20 73 69 6e 67 6c 65 20 63 6f 6c   on a single col
a380: 75 6d 6e 20 77 68 6f 73 65 20 64 61 74 61 74 79  umn whose dataty
a390: 70 65 20 69 73 20 49 4e 54 45 47 45 52 2c 0a 2a  pe is INTEGER,.*
a3a0: 2a 20 74 68 65 6e 20 77 65 20 77 69 6c 6c 20 74  * then we will t
a3b0: 72 79 20 74 6f 20 75 73 65 20 74 68 61 74 20 63  ry to use that c
a3c0: 6f 6c 75 6d 6e 20 61 73 20 74 68 65 20 72 6f 77  olumn as the row
a3d0: 69 64 2e 20 20 53 65 74 20 74 68 65 20 54 61 62  id.  Set the Tab
a3e0: 6c 65 2e 69 50 4b 65 79 0a 2a 2a 20 66 69 65 6c  le.iPKey.** fiel
a3f0: 64 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 75  d of the table u
a400: 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f  nder constructio
a410: 6e 20 74 6f 20 62 65 20 74 68 65 20 69 6e 64 65  n to be the inde
a420: 78 20 6f 66 20 74 68 65 0a 2a 2a 20 49 4e 54 45  x of the.** INTE
a430: 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 20  GER PRIMARY KEY 
a440: 63 6f 6c 75 6d 6e 2e 20 20 54 61 62 6c 65 2e 69  column.  Table.i
a450: 50 4b 65 79 20 69 73 20 73 65 74 20 74 6f 20 2d  PKey is set to -
a460: 31 20 69 66 20 74 68 65 72 65 20 69 73 0a 2a 2a  1 if there is.**
a470: 20 6e 6f 20 49 4e 54 45 47 45 52 20 50 52 49 4d   no INTEGER PRIM
a480: 41 52 59 20 4b 45 59 2e 0a 2a 2a 0a 2a 2a 20 49  ARY KEY..**.** I
a490: 66 20 74 68 65 20 6b 65 79 20 69 73 20 6e 6f 74  f the key is not
a4a0: 20 61 6e 20 49 4e 54 45 47 45 52 20 50 52 49 4d   an INTEGER PRIM
a4b0: 41 52 59 20 4b 45 59 2c 20 74 68 65 6e 20 63 72  ARY KEY, then cr
a4c0: 65 61 74 65 20 61 20 75 6e 69 71 75 65 0a 2a 2a  eate a unique.**
a4d0: 20 69 6e 64 65 78 20 66 6f 72 20 74 68 65 20 6b   index for the k
a4e0: 65 79 2e 20 20 4e 6f 20 69 6e 64 65 78 20 69 73  ey.  No index is
a4f0: 20 63 72 65 61 74 65 64 20 66 6f 72 20 49 4e 54   created for INT
a500: 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59  EGER PRIMARY KEY
a510: 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  s..*/.void sqlit
a520: 65 33 41 64 64 50 72 69 6d 61 72 79 4b 65 79 28  e3AddPrimaryKey(
a530: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
a540: 2c 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20  ,    /* Parsing 
a550: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70  context */.  Exp
a560: 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 2f  rList *pList,  /
a570: 2a 20 4c 69 73 74 20 6f 66 20 66 69 65 6c 64 20  * List of field 
a580: 6e 61 6d 65 73 20 74 6f 20 62 65 20 69 6e 64 65  names to be inde
a590: 78 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 6e 45  xed */.  int onE
a5a0: 72 72 6f 72 2c 20 20 20 20 20 20 2f 2a 20 57 68  rror,      /* Wh
a5b0: 61 74 20 74 6f 20 64 6f 20 77 69 74 68 20 61 20  at to do with a 
a5c0: 75 6e 69 71 75 65 6e 65 73 73 20 63 6f 6e 66 6c  uniqueness confl
a5d0: 69 63 74 20 2a 2f 0a 20 20 69 6e 74 20 61 75 74  ict */.  int aut
a5e0: 6f 49 6e 63 2c 20 20 20 20 20 20 2f 2a 20 54 72  oInc,      /* Tr
a5f0: 75 65 20 69 66 20 74 68 65 20 41 55 54 4f 49 4e  ue if the AUTOIN
a600: 43 52 45 4d 45 4e 54 20 6b 65 79 77 6f 72 64 20  CREMENT keyword 
a610: 69 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a 20 20  is present */.  
a620: 69 6e 74 20 73 6f 72 74 4f 72 64 65 72 20 20 20  int sortOrder   
a630: 20 20 2f 2a 20 53 51 4c 49 54 45 5f 53 4f 5f 41    /* SQLITE_SO_A
a640: 53 43 20 6f 72 20 53 51 4c 49 54 45 5f 53 4f 5f  SC or SQLITE_SO_
a650: 44 45 53 43 20 2a 2f 0a 29 7b 0a 20 20 54 61 62  DESC */.){.  Tab
a660: 6c 65 20 2a 70 54 61 62 20 3d 20 70 50 61 72 73  le *pTab = pPars
a670: 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20  e->pNewTable;.  
a680: 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 20 3d 20 30  Column *pCol = 0
a690: 3b 0a 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 2d  ;.  int iCol = -
a6a0: 31 2c 20 69 3b 0a 20 20 69 6e 74 20 6e 54 65 72  1, i;.  int nTer
a6b0: 6d 3b 0a 20 20 69 66 28 20 70 54 61 62 3d 3d 30  m;.  if( pTab==0
a6c0: 20 29 20 67 6f 74 6f 20 70 72 69 6d 61 72 79 5f   ) goto primary_
a6d0: 6b 65 79 5f 65 78 69 74 3b 0a 20 20 69 66 28 20  key_exit;.  if( 
a6e0: 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 26  pTab->tabFlags &
a6f0: 20 54 46 5f 48 61 73 50 72 69 6d 61 72 79 4b 65   TF_HasPrimaryKe
a700: 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  y ){.    sqlite3
a710: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
a720: 20 0a 20 20 20 20 20 20 22 74 61 62 6c 65 20 5c   .      "table \
a730: 22 25 73 5c 22 20 68 61 73 20 6d 6f 72 65 20 74  "%s\" has more t
a740: 68 61 6e 20 6f 6e 65 20 70 72 69 6d 61 72 79 20  han one primary 
a750: 6b 65 79 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  key", pTab->zNam
a760: 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20 70 72 69  e);.    goto pri
a770: 6d 61 72 79 5f 6b 65 79 5f 65 78 69 74 3b 0a 20  mary_key_exit;. 
a780: 20 7d 0a 20 20 70 54 61 62 2d 3e 74 61 62 46 6c   }.  pTab->tabFl
a790: 61 67 73 20 7c 3d 20 54 46 5f 48 61 73 50 72 69  ags |= TF_HasPri
a7a0: 6d 61 72 79 4b 65 79 3b 0a 20 20 69 66 28 20 70  maryKey;.  if( p
a7b0: 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 69  List==0 ){.    i
a7c0: 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 6e 43 6f 6c  Col = pTab->nCol
a7d0: 20 2d 20 31 3b 0a 20 20 20 20 70 43 6f 6c 20 3d   - 1;.    pCol =
a7e0: 20 26 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f   &pTab->aCol[iCo
a7f0: 6c 5d 3b 0a 20 20 20 20 70 43 6f 6c 2d 3e 63 6f  l];.    pCol->co
a800: 6c 46 6c 61 67 73 20 7c 3d 20 43 4f 4c 46 4c 41  lFlags |= COLFLA
a810: 47 5f 50 52 49 4d 4b 45 59 3b 0a 20 20 20 20 6e  G_PRIMKEY;.    n
a820: 54 65 72 6d 20 3d 20 31 3b 0a 20 20 7d 65 6c 73  Term = 1;.  }els
a830: 65 7b 0a 20 20 20 20 6e 54 65 72 6d 20 3d 20 70  e{.    nTerm = p
a840: 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20  List->nExpr;.   
a850: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 54 65 72   for(i=0; i<nTer
a860: 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 45  m; i++){.      E
a870: 78 70 72 20 2a 70 43 45 78 70 72 20 3d 20 73 71  xpr *pCExpr = sq
a880: 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c  lite3ExprSkipCol
a890: 6c 61 74 65 28 70 4c 69 73 74 2d 3e 61 5b 69 5d  late(pList->a[i]
a8a0: 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 61  .pExpr);.      a
a8b0: 73 73 65 72 74 28 20 70 43 45 78 70 72 21 3d 30  ssert( pCExpr!=0
a8c0: 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
a8d0: 33 53 74 72 69 6e 67 54 6f 49 64 28 70 43 45 78  3StringToId(pCEx
a8e0: 70 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  pr);.      if( p
a8f0: 43 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 44  CExpr->op==TK_ID
a900: 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73   ){.        cons
a910: 74 20 63 68 61 72 20 2a 7a 43 4e 61 6d 65 20 3d  t char *zCName =
a920: 20 70 43 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65   pCExpr->u.zToke
a930: 6e 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  n;.        for(i
a940: 43 6f 6c 3d 30 3b 20 69 43 6f 6c 3c 70 54 61 62  Col=0; iCol<pTab
a950: 2d 3e 6e 43 6f 6c 3b 20 69 43 6f 6c 2b 2b 29 7b  ->nCol; iCol++){
a960: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73  .          if( s
a970: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 43  qlite3StrICmp(zC
a980: 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 61 43 6f 6c  Name, pTab->aCol
a990: 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 29 3d 3d 30  [iCol].zName)==0
a9a0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
a9b0: 70 43 6f 6c 20 3d 20 26 70 54 61 62 2d 3e 61 43  pCol = &pTab->aC
a9c0: 6f 6c 5b 69 43 6f 6c 5d 3b 0a 20 20 20 20 20 20  ol[iCol];.      
a9d0: 20 20 20 20 20 20 70 43 6f 6c 2d 3e 63 6f 6c 46        pCol->colF
a9e0: 6c 61 67 73 20 7c 3d 20 43 4f 4c 46 4c 41 47 5f  lags |= COLFLAG_
a9f0: 50 52 49 4d 4b 45 59 3b 0a 20 20 20 20 20 20 20  PRIMKEY;.       
aa00: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
aa10: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
aa20: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
aa30: 20 20 7d 0a 20 20 69 66 28 20 6e 54 65 72 6d 3d    }.  if( nTerm=
aa40: 3d 31 0a 20 20 20 26 26 20 70 43 6f 6c 0a 20 20  =1.   && pCol.  
aa50: 20 26 26 20 73 71 6c 69 74 65 33 53 74 72 49 43   && sqlite3StrIC
aa60: 6d 70 28 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e  mp(sqlite3Column
aa70: 54 79 70 65 28 70 43 6f 6c 2c 22 22 29 2c 20 22  Type(pCol,""), "
aa80: 49 4e 54 45 47 45 52 22 29 3d 3d 30 0a 20 20 20  INTEGER")==0.   
aa90: 26 26 20 73 6f 72 74 4f 72 64 65 72 21 3d 53 51  && sortOrder!=SQ
aaa0: 4c 49 54 45 5f 53 4f 5f 44 45 53 43 0a 20 20 29  LITE_SO_DESC.  )
aab0: 7b 0a 20 20 20 20 70 54 61 62 2d 3e 69 50 4b 65  {.    pTab->iPKe
aac0: 79 20 3d 20 69 43 6f 6c 3b 0a 20 20 20 20 70 54  y = iCol;.    pT
aad0: 61 62 2d 3e 6b 65 79 43 6f 6e 66 20 3d 20 28 75  ab->keyConf = (u
aae0: 38 29 6f 6e 45 72 72 6f 72 3b 0a 20 20 20 20 61  8)onError;.    a
aaf0: 73 73 65 72 74 28 20 61 75 74 6f 49 6e 63 3d 3d  ssert( autoInc==
ab00: 30 20 7c 7c 20 61 75 74 6f 49 6e 63 3d 3d 31 20  0 || autoInc==1 
ab10: 29 3b 0a 20 20 20 20 70 54 61 62 2d 3e 74 61 62  );.    pTab->tab
ab20: 46 6c 61 67 73 20 7c 3d 20 61 75 74 6f 49 6e 63  Flags |= autoInc
ab30: 2a 54 46 5f 41 75 74 6f 69 6e 63 72 65 6d 65 6e  *TF_Autoincremen
ab40: 74 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74  t;.    if( pList
ab50: 20 29 20 70 50 61 72 73 65 2d 3e 69 50 6b 53 6f   ) pParse->iPkSo
ab60: 72 74 4f 72 64 65 72 20 3d 20 70 4c 69 73 74 2d  rtOrder = pList-
ab70: 3e 61 5b 30 5d 2e 73 6f 72 74 4f 72 64 65 72 3b  >a[0].sortOrder;
ab80: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 61 75 74  .  }else if( aut
ab90: 6f 49 6e 63 20 29 7b 0a 23 69 66 6e 64 65 66 20  oInc ){.#ifndef 
aba0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
abb0: 49 4e 43 52 45 4d 45 4e 54 0a 20 20 20 20 73 71  INCREMENT.    sq
abc0: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
abd0: 61 72 73 65 2c 20 22 41 55 54 4f 49 4e 43 52 45  arse, "AUTOINCRE
abe0: 4d 45 4e 54 20 69 73 20 6f 6e 6c 79 20 61 6c 6c  MENT is only all
abf0: 6f 77 65 64 20 6f 6e 20 61 6e 20 22 0a 20 20 20  owed on an ".   
ac00: 20 20 20 20 22 49 4e 54 45 47 45 52 20 50 52 49      "INTEGER PRI
ac10: 4d 41 52 59 20 4b 45 59 22 29 3b 0a 23 65 6e 64  MARY KEY");.#end
ac20: 69 66 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  if.  }else{.    
ac30: 73 71 6c 69 74 65 33 43 72 65 61 74 65 49 6e 64  sqlite3CreateInd
ac40: 65 78 28 70 50 61 72 73 65 2c 20 30 2c 20 30 2c  ex(pParse, 0, 0,
ac50: 20 30 2c 20 70 4c 69 73 74 2c 20 6f 6e 45 72 72   0, pList, onErr
ac60: 6f 72 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20  or, 0,.         
ac70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ac80: 20 20 30 2c 20 73 6f 72 74 4f 72 64 65 72 2c 20    0, sortOrder, 
ac90: 30 2c 20 53 51 4c 49 54 45 5f 49 44 58 54 59 50  0, SQLITE_IDXTYP
aca0: 45 5f 50 52 49 4d 41 52 59 4b 45 59 29 3b 0a 20  E_PRIMARYKEY);. 
acb0: 20 20 20 70 4c 69 73 74 20 3d 20 30 3b 0a 20 20     pList = 0;.  
acc0: 7d 0a 0a 70 72 69 6d 61 72 79 5f 6b 65 79 5f 65  }..primary_key_e
acd0: 78 69 74 3a 0a 20 20 73 71 6c 69 74 65 33 45 78  xit:.  sqlite3Ex
ace0: 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70 50 61  prListDelete(pPa
acf0: 72 73 65 2d 3e 64 62 2c 20 70 4c 69 73 74 29 3b  rse->db, pList);
ad00: 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a  .  return;.}../*
ad10: 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77 20 43 48  .** Add a new CH
ad20: 45 43 4b 20 63 6f 6e 73 74 72 61 69 6e 74 20 74  ECK constraint t
ad30: 6f 20 74 68 65 20 74 61 62 6c 65 20 63 75 72 72  o the table curr
ad40: 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73  ently under cons
ad50: 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69  truction..*/.voi
ad60: 64 20 73 71 6c 69 74 65 33 41 64 64 43 68 65 63  d sqlite3AddChec
ad70: 6b 43 6f 6e 73 74 72 61 69 6e 74 28 0a 20 20 50  kConstraint(.  P
ad80: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
ad90: 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
ada0: 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  ext */.  Expr *p
adb0: 43 68 65 63 6b 45 78 70 72 20 20 2f 2a 20 54 68  CheckExpr  /* Th
adc0: 65 20 63 68 65 63 6b 20 65 78 70 72 65 73 73 69  e check expressi
add0: 6f 6e 20 2a 2f 0a 29 7b 0a 23 69 66 6e 64 65 66  on */.){.#ifndef
ade0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 48 45   SQLITE_OMIT_CHE
adf0: 43 4b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  CK.  Table *pTab
ae00: 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54   = pParse->pNewT
ae10: 61 62 6c 65 3b 0a 20 20 73 71 6c 69 74 65 33 20  able;.  sqlite3 
ae20: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
ae30: 3b 0a 20 20 69 66 28 20 70 54 61 62 20 26 26 20  ;.  if( pTab && 
ae40: 21 49 4e 5f 44 45 43 4c 41 52 45 5f 56 54 41 42  !IN_DECLARE_VTAB
ae50: 0a 20 20 20 26 26 20 21 73 71 6c 69 74 65 33 42  .   && !sqlite3B
ae60: 74 72 65 65 49 73 52 65 61 64 6f 6e 6c 79 28 64  treeIsReadonly(d
ae70: 62 2d 3e 61 44 62 5b 64 62 2d 3e 69 6e 69 74 2e  b->aDb[db->init.
ae80: 69 44 62 5d 2e 70 42 74 29 0a 20 20 29 7b 0a 20  iDb].pBt).  ){. 
ae90: 20 20 20 70 54 61 62 2d 3e 70 43 68 65 63 6b 20     pTab->pCheck 
aea0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
aeb0: 74 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20  tAppend(pParse, 
aec0: 70 54 61 62 2d 3e 70 43 68 65 63 6b 2c 20 70 43  pTab->pCheck, pC
aed0: 68 65 63 6b 45 78 70 72 29 3b 0a 20 20 20 20 69  heckExpr);.    i
aee0: 66 28 20 70 50 61 72 73 65 2d 3e 63 6f 6e 73 74  f( pParse->const
aef0: 72 61 69 6e 74 4e 61 6d 65 2e 6e 20 29 7b 0a 20  raintName.n ){. 
af00: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
af10: 4c 69 73 74 53 65 74 4e 61 6d 65 28 70 50 61 72  ListSetName(pPar
af20: 73 65 2c 20 70 54 61 62 2d 3e 70 43 68 65 63 6b  se, pTab->pCheck
af30: 2c 20 26 70 50 61 72 73 65 2d 3e 63 6f 6e 73 74  , &pParse->const
af40: 72 61 69 6e 74 4e 61 6d 65 2c 20 31 29 3b 0a 20  raintName, 1);. 
af50: 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 23 65 6e     }.  }else.#en
af60: 64 69 66 0a 20 20 7b 0a 20 20 20 20 73 71 6c 69  dif.  {.    sqli
af70: 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 70 50  te3ExprDelete(pP
af80: 61 72 73 65 2d 3e 64 62 2c 20 70 43 68 65 63 6b  arse->db, pCheck
af90: 45 78 70 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  Expr);.  }.}../*
afa0: 0a 2a 2a 20 53 65 74 20 74 68 65 20 63 6f 6c 6c  .** Set the coll
afb0: 61 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 6f  ation function o
afc0: 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e  f the most recen
afd0: 74 6c 79 20 70 61 72 73 65 64 20 74 61 62 6c 65  tly parsed table
afe0: 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 74 6f 20 74 68   column.** to th
aff0: 65 20 43 6f 6c 6c 53 65 71 20 67 69 76 65 6e 2e  e CollSeq given.
b000: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
b010: 41 64 64 43 6f 6c 6c 61 74 65 54 79 70 65 28 50  AddCollateType(P
b020: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 6f  arse *pParse, To
b030: 6b 65 6e 20 2a 70 54 6f 6b 65 6e 29 7b 0a 20 20  ken *pToken){.  
b040: 54 61 62 6c 65 20 2a 70 3b 0a 20 20 69 6e 74 20  Table *p;.  int 
b050: 69 3b 0a 20 20 63 68 61 72 20 2a 7a 43 6f 6c 6c  i;.  char *zColl
b060: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
b070: 2a 20 44 65 71 75 6f 74 65 64 20 6e 61 6d 65 20  * Dequoted name 
b080: 6f 66 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  of collation seq
b090: 75 65 6e 63 65 20 2a 2f 0a 20 20 73 71 6c 69 74  uence */.  sqlit
b0a0: 65 33 20 2a 64 62 3b 0a 0a 20 20 69 66 28 20 28  e3 *db;..  if( (
b0b0: 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  p = pParse->pNew
b0c0: 54 61 62 6c 65 29 3d 3d 30 20 29 20 72 65 74 75  Table)==0 ) retu
b0d0: 72 6e 3b 0a 20 20 69 20 3d 20 70 2d 3e 6e 43 6f  rn;.  i = p->nCo
b0e0: 6c 2d 31 3b 0a 20 20 64 62 20 3d 20 70 50 61 72  l-1;.  db = pPar
b0f0: 73 65 2d 3e 64 62 3b 0a 20 20 7a 43 6f 6c 6c 20  se->db;.  zColl 
b100: 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f  = sqlite3NameFro
b110: 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 54 6f 6b 65  mToken(db, pToke
b120: 6e 29 3b 0a 20 20 69 66 28 20 21 7a 43 6f 6c 6c  n);.  if( !zColl
b130: 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 69 66   ) return;..  if
b140: 28 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 43  ( sqlite3LocateC
b150: 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 7a  ollSeq(pParse, z
b160: 43 6f 6c 6c 29 20 29 7b 0a 20 20 20 20 49 6e 64  Coll) ){.    Ind
b170: 65 78 20 2a 70 49 64 78 3b 0a 20 20 20 20 73 71  ex *pIdx;.    sq
b180: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
b190: 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 43 6f 6c 6c  p->aCol[i].zColl
b1a0: 29 3b 0a 20 20 20 20 70 2d 3e 61 43 6f 6c 5b 69  );.    p->aCol[i
b1b0: 5d 2e 7a 43 6f 6c 6c 20 3d 20 7a 43 6f 6c 6c 3b  ].zColl = zColl;
b1c0: 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  .  .    /* If th
b1d0: 65 20 63 6f 6c 75 6d 6e 20 69 73 20 64 65 63 6c  e column is decl
b1e0: 61 72 65 64 20 61 73 20 22 3c 6e 61 6d 65 3e 20  ared as "<name> 
b1f0: 50 52 49 4d 41 52 59 20 4b 45 59 20 43 4f 4c 4c  PRIMARY KEY COLL
b200: 41 54 45 20 3c 74 79 70 65 3e 22 2c 0a 20 20 20  ATE <type>",.   
b210: 20 2a 2a 20 74 68 65 6e 20 61 6e 20 69 6e 64 65   ** then an inde
b220: 78 20 6d 61 79 20 68 61 76 65 20 62 65 65 6e 20  x may have been 
b230: 63 72 65 61 74 65 64 20 6f 6e 20 74 68 69 73 20  created on this 
b240: 63 6f 6c 75 6d 6e 20 62 65 66 6f 72 65 20 74 68  column before th
b250: 65 0a 20 20 20 20 2a 2a 20 63 6f 6c 6c 61 74 69  e.    ** collati
b260: 6f 6e 20 74 79 70 65 20 77 61 73 20 61 64 64 65  on type was adde
b270: 64 2e 20 43 6f 72 72 65 63 74 20 74 68 69 73 20  d. Correct this 
b280: 69 66 20 69 74 20 69 73 20 74 68 65 20 63 61 73  if it is the cas
b290: 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f  e..    */.    fo
b2a0: 72 28 70 49 64 78 3d 70 2d 3e 70 49 6e 64 65 78  r(pIdx=p->pIndex
b2b0: 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64  ; pIdx; pIdx=pId
b2c0: 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20  x->pNext){.     
b2d0: 20 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e 6e   assert( pIdx->n
b2e0: 4b 65 79 43 6f 6c 3d 3d 31 20 29 3b 0a 20 20 20  KeyCol==1 );.   
b2f0: 20 20 20 69 66 28 20 70 49 64 78 2d 3e 61 69 43     if( pIdx->aiC
b300: 6f 6c 75 6d 6e 5b 30 5d 3d 3d 69 20 29 7b 0a 20  olumn[0]==i ){. 
b310: 20 20 20 20 20 20 20 70 49 64 78 2d 3e 61 7a 43         pIdx->azC
b320: 6f 6c 6c 5b 30 5d 20 3d 20 70 2d 3e 61 43 6f 6c  oll[0] = p->aCol
b330: 5b 69 5d 2e 7a 43 6f 6c 6c 3b 0a 20 20 20 20 20  [i].zColl;.     
b340: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65   }.    }.  }else
b350: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  {.    sqlite3DbF
b360: 72 65 65 28 64 62 2c 20 7a 43 6f 6c 6c 29 3b 0a  ree(db, zColl);.
b370: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69    }.}../*.** Thi
b380: 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  s function retur
b390: 6e 73 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e  ns the collation
b3a0: 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20 64 61   sequence for da
b3b0: 74 61 62 61 73 65 20 6e 61 74 69 76 65 20 74 65  tabase native te
b3c0: 78 74 0a 2a 2a 20 65 6e 63 6f 64 69 6e 67 20 69  xt.** encoding i
b3d0: 64 65 6e 74 69 66 69 65 64 20 62 79 20 74 68 65  dentified by the
b3e0: 20 73 74 72 69 6e 67 20 7a 4e 61 6d 65 2c 20 6c   string zName, l
b3f0: 65 6e 67 74 68 20 6e 4e 61 6d 65 2e 0a 2a 2a 0a  ength nName..**.
b400: 2a 2a 20 49 66 20 74 68 65 20 72 65 71 75 65 73  ** If the reques
b410: 74 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  ted collation se
b420: 71 75 65 6e 63 65 20 69 73 20 6e 6f 74 20 61 76  quence is not av
b430: 61 69 6c 61 62 6c 65 2c 20 6f 72 20 6e 6f 74 20  ailable, or not 
b440: 61 76 61 69 6c 61 62 6c 65 0a 2a 2a 20 69 6e 20  available.** in 
b450: 74 68 65 20 64 61 74 61 62 61 73 65 20 6e 61 74  the database nat
b460: 69 76 65 20 65 6e 63 6f 64 69 6e 67 2c 20 74 68  ive encoding, th
b470: 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 61 63 74  e collation fact
b480: 6f 72 79 20 69 73 20 69 6e 76 6f 6b 65 64 20 74  ory is invoked t
b490: 6f 0a 2a 2a 20 72 65 71 75 65 73 74 20 69 74 2e  o.** request it.
b4a0: 20 49 66 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f   If the collatio
b4b0: 6e 20 66 61 63 74 6f 72 79 20 64 6f 65 73 20 6e  n factory does n
b4c0: 6f 74 20 73 75 70 70 6c 79 20 73 75 63 68 20 61  ot supply such a
b4d0: 20 73 65 71 75 65 6e 63 65 2c 0a 2a 2a 20 61 6e   sequence,.** an
b4e0: 64 20 74 68 65 20 73 65 71 75 65 6e 63 65 20 69  d the sequence i
b4f0: 73 20 61 76 61 69 6c 61 62 6c 65 20 69 6e 20 61  s available in a
b500: 6e 6f 74 68 65 72 20 74 65 78 74 20 65 6e 63 6f  nother text enco
b510: 64 69 6e 67 2c 20 74 68 65 6e 20 74 68 61 74 20  ding, then that 
b520: 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 69  is.** returned i
b530: 6e 73 74 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  nstead..**.** If
b540: 20 6e 6f 20 76 65 72 73 69 6f 6e 73 20 6f 66 20   no versions of 
b550: 74 68 65 20 72 65 71 75 65 73 74 65 64 20 63 6f  the requested co
b560: 6c 6c 61 74 69 6f 6e 73 20 73 65 71 75 65 6e 63  llations sequenc
b570: 65 20 61 72 65 20 61 76 61 69 6c 61 62 6c 65 2c  e are available,
b580: 20 6f 72 0a 2a 2a 20 61 6e 6f 74 68 65 72 20 65   or.** another e
b590: 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 4e 55 4c  rror occurs, NUL
b5a0: 4c 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e  L is returned an
b5b0: 64 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61  d an error messa
b5c0: 67 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 0a  ge written into.
b5d0: 2a 2a 20 70 50 61 72 73 65 2e 0a 2a 2a 0a 2a 2a  ** pParse..**.**
b5e0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
b5f0: 20 61 20 77 72 61 70 70 65 72 20 61 72 6f 75 6e   a wrapper aroun
b600: 64 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c  d sqlite3FindCol
b610: 6c 53 65 71 28 29 2e 20 20 54 68 69 73 20 72 6f  lSeq().  This ro
b620: 75 74 69 6e 65 0a 2a 2a 20 69 6e 76 6f 6b 65 73  utine.** invokes
b630: 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 66   the collation f
b640: 61 63 74 6f 72 79 20 69 66 20 74 68 65 20 6e 61  actory if the na
b650: 6d 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 63 61  med collation ca
b660: 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64 0a 2a 2a  nnot be found.**
b670: 20 61 6e 64 20 67 65 6e 65 72 61 74 65 73 20 61   and generates a
b680: 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 2e  n error message.
b690: 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 3a  .**.** See also:
b6a0: 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c   sqlite3FindColl
b6b0: 53 65 71 28 29 2c 20 73 71 6c 69 74 65 33 47 65  Seq(), sqlite3Ge
b6c0: 74 43 6f 6c 6c 53 65 71 28 29 0a 2a 2f 0a 43 6f  tCollSeq().*/.Co
b6d0: 6c 6c 53 65 71 20 2a 73 71 6c 69 74 65 33 4c 6f  llSeq *sqlite3Lo
b6e0: 63 61 74 65 43 6f 6c 6c 53 65 71 28 50 61 72 73  cateCollSeq(Pars
b6f0: 65 20 2a 70 50 61 72 73 65 2c 20 63 6f 6e 73 74  e *pParse, const
b700: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20   char *zName){. 
b710: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
b720: 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 75 38 20  Parse->db;.  u8 
b730: 65 6e 63 20 3d 20 45 4e 43 28 64 62 29 3b 0a 20  enc = ENC(db);. 
b740: 20 75 38 20 69 6e 69 74 62 75 73 79 20 3d 20 64   u8 initbusy = d
b750: 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3b 0a 20 20  b->init.busy;.  
b760: 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a  CollSeq *pColl;.
b770: 0a 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74  .  pColl = sqlit
b780: 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28 64 62  e3FindCollSeq(db
b790: 2c 20 65 6e 63 2c 20 7a 4e 61 6d 65 2c 20 69 6e  , enc, zName, in
b7a0: 69 74 62 75 73 79 29 3b 0a 20 20 69 66 28 20 21  itbusy);.  if( !
b7b0: 69 6e 69 74 62 75 73 79 20 26 26 20 28 21 70 43  initbusy && (!pC
b7c0: 6f 6c 6c 20 7c 7c 20 21 70 43 6f 6c 6c 2d 3e 78  oll || !pColl->x
b7d0: 43 6d 70 29 20 29 7b 0a 20 20 20 20 70 43 6f 6c  Cmp) ){.    pCol
b7e0: 6c 20 3d 20 73 71 6c 69 74 65 33 47 65 74 43 6f  l = sqlite3GetCo
b7f0: 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 65 6e  llSeq(pParse, en
b800: 63 2c 20 70 43 6f 6c 6c 2c 20 7a 4e 61 6d 65 29  c, pColl, zName)
b810: 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
b820: 70 43 6f 6c 6c 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  pColl;.}.../*.**
b830: 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
b840: 68 61 74 20 77 69 6c 6c 20 69 6e 63 72 65 6d 65  hat will increme
b850: 6e 74 20 74 68 65 20 73 63 68 65 6d 61 20 63 6f  nt the schema co
b860: 6f 6b 69 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  okie..**.** The 
b870: 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 20 69 73  schema cookie is
b880: 20 75 73 65 64 20 74 6f 20 64 65 74 65 72 6d 69   used to determi
b890: 6e 65 20 77 68 65 6e 20 74 68 65 20 73 63 68 65  ne when the sche
b8a0: 6d 61 20 66 6f 72 20 74 68 65 0a 2a 2a 20 64 61  ma for the.** da
b8b0: 74 61 62 61 73 65 20 63 68 61 6e 67 65 73 2e 20  tabase changes. 
b8c0: 20 41 66 74 65 72 20 65 61 63 68 20 73 63 68 65   After each sche
b8d0: 6d 61 20 63 68 61 6e 67 65 2c 20 74 68 65 20 63  ma change, the c
b8e0: 6f 6f 6b 69 65 20 76 61 6c 75 65 0a 2a 2a 20 63  ookie value.** c
b8f0: 68 61 6e 67 65 73 2e 20 20 57 68 65 6e 20 61 20  hanges.  When a 
b900: 70 72 6f 63 65 73 73 20 66 69 72 73 74 20 72 65  process first re
b910: 61 64 73 20 74 68 65 20 73 63 68 65 6d 61 20 69  ads the schema i
b920: 74 20 72 65 63 6f 72 64 73 20 74 68 65 0a 2a 2a  t records the.**
b930: 20 63 6f 6f 6b 69 65 2e 20 20 54 68 65 72 65 61   cookie.  Therea
b940: 66 74 65 72 2c 20 77 68 65 6e 65 76 65 72 20 69  fter, whenever i
b950: 74 20 67 6f 65 73 20 74 6f 20 61 63 63 65 73 73  t goes to access
b960: 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 0a 2a   the database,.*
b970: 2a 20 69 74 20 63 68 65 63 6b 73 20 74 68 65 20  * it checks the 
b980: 63 6f 6f 6b 69 65 20 74 6f 20 6d 61 6b 65 20 73  cookie to make s
b990: 75 72 65 20 74 68 65 20 73 63 68 65 6d 61 20 68  ure the schema h
b9a0: 61 73 20 6e 6f 74 20 63 68 61 6e 67 65 64 0a 2a  as not changed.*
b9b0: 2a 20 73 69 6e 63 65 20 69 74 20 77 61 73 20 6c  * since it was l
b9c0: 61 73 74 20 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20  ast read..**.** 
b9d0: 54 68 69 73 20 70 6c 61 6e 20 69 73 20 6e 6f 74  This plan is not
b9e0: 20 63 6f 6d 70 6c 65 74 65 6c 79 20 62 75 6c 6c   completely bull
b9f0: 65 74 2d 70 72 6f 6f 66 2e 20 20 49 74 20 69 73  et-proof.  It is
ba00: 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 0a 2a 2a   possible for.**
ba10: 20 74 68 65 20 73 63 68 65 6d 61 20 74 6f 20 63   the schema to c
ba20: 68 61 6e 67 65 20 6d 75 6c 74 69 70 6c 65 20 74  hange multiple t
ba30: 69 6d 65 73 20 61 6e 64 20 66 6f 72 20 74 68 65  imes and for the
ba40: 20 63 6f 6f 6b 69 65 20 74 6f 20 62 65 0a 2a 2a   cookie to be.**
ba50: 20 73 65 74 20 62 61 63 6b 20 74 6f 20 70 72 69   set back to pri
ba60: 6f 72 20 76 61 6c 75 65 2e 20 20 42 75 74 20 73  or value.  But s
ba70: 63 68 65 6d 61 20 63 68 61 6e 67 65 73 20 61 72  chema changes ar
ba80: 65 20 69 6e 66 72 65 71 75 65 6e 74 0a 2a 2a 20  e infrequent.** 
ba90: 61 6e 64 20 74 68 65 20 70 72 6f 62 61 62 69 6c  and the probabil
baa0: 69 74 79 20 6f 66 20 68 69 74 74 69 6e 67 20 74  ity of hitting t
bab0: 68 65 20 73 61 6d 65 20 63 6f 6f 6b 69 65 20 76  he same cookie v
bac0: 61 6c 75 65 20 69 73 20 6f 6e 6c 79 0a 2a 2a 20  alue is only.** 
bad0: 31 20 63 68 61 6e 63 65 20 69 6e 20 32 5e 33 32  1 chance in 2^32
bae0: 2e 20 20 53 6f 20 77 65 27 72 65 20 73 61 66 65  .  So we're safe
baf0: 20 65 6e 6f 75 67 68 2e 0a 2a 2f 0a 76 6f 69 64   enough..*/.void
bb00: 20 73 71 6c 69 74 65 33 43 68 61 6e 67 65 43 6f   sqlite3ChangeCo
bb10: 6f 6b 69 65 28 50 61 72 73 65 20 2a 70 50 61 72  okie(Parse *pPar
bb20: 73 65 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20 20  se, int iDb){.  
bb30: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
bb40: 61 72 73 65 2d 3e 64 62 3b 0a 20 20 56 64 62 65  arse->db;.  Vdbe
bb50: 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
bb60: 64 62 65 3b 0a 20 20 61 73 73 65 72 74 28 20 73  dbe;.  assert( s
bb70: 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65  qlite3SchemaMute
bb80: 78 48 65 6c 64 28 64 62 2c 20 69 44 62 2c 20 30  xHeld(db, iDb, 0
bb90: 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  ) );.  sqlite3Vd
bba0: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53  beAddOp3(v, OP_S
bbb0: 65 74 43 6f 6f 6b 69 65 2c 20 69 44 62 2c 20 42  etCookie, iDb, B
bbc0: 54 52 45 45 5f 53 43 48 45 4d 41 5f 56 45 52 53  TREE_SCHEMA_VERS
bbd0: 49 4f 4e 2c 20 0a 20 20 20 20 20 20 20 20 20 20  ION, .          
bbe0: 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e 61 44            db->aD
bbf0: 62 5b 69 44 62 5d 2e 70 53 63 68 65 6d 61 2d 3e  b[iDb].pSchema->
bc00: 73 63 68 65 6d 61 5f 63 6f 6f 6b 69 65 2b 31 29  schema_cookie+1)
bc10: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 65 61 73 75  ;.}../*.** Measu
bc20: 72 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  re the number of
bc30: 20 63 68 61 72 61 63 74 65 72 73 20 6e 65 65 64   characters need
bc40: 65 64 20 74 6f 20 6f 75 74 70 75 74 20 74 68 65  ed to output the
bc50: 20 67 69 76 65 6e 0a 2a 2a 20 69 64 65 6e 74 69   given.** identi
bc60: 66 69 65 72 2e 20 20 54 68 65 20 6e 75 6d 62 65  fier.  The numbe
bc70: 72 20 72 65 74 75 72 6e 65 64 20 69 6e 63 6c 75  r returned inclu
bc80: 64 65 73 20 61 6e 79 20 71 75 6f 74 65 73 20 75  des any quotes u
bc90: 73 65 64 0a 2a 2a 20 62 75 74 20 64 6f 65 73 20  sed.** but does 
bca0: 6e 6f 74 20 69 6e 63 6c 75 64 65 20 74 68 65 20  not include the 
bcb0: 6e 75 6c 6c 20 74 65 72 6d 69 6e 61 74 6f 72 2e  null terminator.
bcc0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 65 73 74 69 6d  .**.** The estim
bcd0: 61 74 65 20 69 73 20 63 6f 6e 73 65 72 76 61 74  ate is conservat
bce0: 69 76 65 2e 20 20 49 74 20 6d 69 67 68 74 20 62  ive.  It might b
bcf0: 65 20 6c 61 72 67 65 72 20 74 68 61 74 20 77 68  e larger that wh
bd00: 61 74 20 69 73 0a 2a 2a 20 72 65 61 6c 6c 79 20  at is.** really 
bd10: 6e 65 65 64 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  needed..*/.stati
bd20: 63 20 69 6e 74 20 69 64 65 6e 74 4c 65 6e 67 74  c int identLengt
bd30: 68 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29  h(const char *z)
bd40: 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 66 6f 72  {.  int n;.  for
bd50: 28 6e 3d 30 3b 20 2a 7a 3b 20 6e 2b 2b 2c 20 7a  (n=0; *z; n++, z
bd60: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 2a 7a 3d  ++){.    if( *z=
bd70: 3d 27 22 27 20 29 7b 20 6e 2b 2b 3b 20 7d 0a 20  ='"' ){ n++; }. 
bd80: 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 20 2b 20   }.  return n + 
bd90: 32 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  2;.}../*.** The 
bda0: 66 69 72 73 74 20 70 61 72 61 6d 65 74 65 72 20  first parameter 
bdb0: 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  is a pointer to 
bdc0: 61 6e 20 6f 75 74 70 75 74 20 62 75 66 66 65 72  an output buffer
bdd0: 2e 20 54 68 65 20 73 65 63 6f 6e 64 20 0a 2a 2a  . The second .**
bde0: 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 61 20   parameter is a 
bdf0: 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 69 6e  pointer to an in
be00: 74 65 67 65 72 20 74 68 61 74 20 63 6f 6e 74 61  teger that conta
be10: 69 6e 73 20 74 68 65 20 6f 66 66 73 65 74 20 61  ins the offset a
be20: 74 0a 2a 2a 20 77 68 69 63 68 20 74 6f 20 77 72  t.** which to wr
be30: 69 74 65 20 69 6e 74 6f 20 74 68 65 20 6f 75 74  ite into the out
be40: 70 75 74 20 62 75 66 66 65 72 2e 20 54 68 69 73  put buffer. This
be50: 20 66 75 6e 63 74 69 6f 6e 20 63 6f 70 69 65 73   function copies
be60: 20 74 68 65 0a 2a 2a 20 6e 75 6c 2d 74 65 72 6d   the.** nul-term
be70: 69 6e 61 74 65 64 20 73 74 72 69 6e 67 20 70 6f  inated string po
be80: 69 6e 74 65 64 20 74 6f 20 62 79 20 74 68 65 20  inted to by the 
be90: 74 68 69 72 64 20 70 61 72 61 6d 65 74 65 72 2c  third parameter,
bea0: 20 7a 53 69 67 6e 65 64 49 64 65 6e 74 2c 0a 2a   zSignedIdent,.*
beb0: 2a 20 74 6f 20 74 68 65 20 73 70 65 63 69 66 69  * to the specifi
bec0: 65 64 20 6f 66 66 73 65 74 20 69 6e 20 74 68 65  ed offset in the
bed0: 20 62 75 66 66 65 72 20 61 6e 64 20 75 70 64 61   buffer and upda
bee0: 74 65 73 20 2a 70 49 64 78 20 74 6f 20 72 65 66  tes *pIdx to ref
bef0: 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20 66 69 72  er.** to the fir
bf00: 73 74 20 62 79 74 65 20 61 66 74 65 72 20 74 68  st byte after th
bf10: 65 20 6c 61 73 74 20 62 79 74 65 20 77 72 69 74  e last byte writ
bf20: 74 65 6e 20 62 65 66 6f 72 65 20 72 65 74 75 72  ten before retur
bf30: 6e 69 6e 67 2e 0a 2a 2a 20 0a 2a 2a 20 49 66 20  ning..** .** If 
bf40: 74 68 65 20 73 74 72 69 6e 67 20 7a 53 69 67 6e  the string zSign
bf50: 65 64 49 64 65 6e 74 20 63 6f 6e 73 69 73 74 73  edIdent consists
bf60: 20 65 6e 74 69 72 65 6c 79 20 6f 66 20 61 6c 70   entirely of alp
bf70: 68 61 2d 6e 75 6d 65 72 69 63 0a 2a 2a 20 63 68  ha-numeric.** ch
bf80: 61 72 61 63 74 65 72 73 2c 20 64 6f 65 73 20 6e  aracters, does n
bf90: 6f 74 20 62 65 67 69 6e 20 77 69 74 68 20 61 20  ot begin with a 
bfa0: 64 69 67 69 74 20 61 6e 64 20 69 73 20 6e 6f 74  digit and is not
bfb0: 20 61 6e 20 53 51 4c 20 6b 65 79 77 6f 72 64 2c   an SQL keyword,
bfc0: 0a 2a 2a 20 74 68 65 6e 20 69 74 20 69 73 20 63  .** then it is c
bfd0: 6f 70 69 65 64 20 74 6f 20 74 68 65 20 6f 75 74  opied to the out
bfe0: 70 75 74 20 62 75 66 66 65 72 20 65 78 61 63 74  put buffer exact
bff0: 6c 79 20 61 73 20 69 74 20 69 73 2e 20 4f 74 68  ly as it is. Oth
c000: 65 72 77 69 73 65 2c 0a 2a 2a 20 69 74 20 69 73  erwise,.** it is
c010: 20 71 75 6f 74 65 64 20 75 73 69 6e 67 20 64 6f   quoted using do
c020: 75 62 6c 65 2d 71 75 6f 74 65 73 2e 0a 2a 2f 0a  uble-quotes..*/.
c030: 73 74 61 74 69 63 20 76 6f 69 64 20 69 64 65 6e  static void iden
c040: 74 50 75 74 28 63 68 61 72 20 2a 7a 2c 20 69 6e  tPut(char *z, in
c050: 74 20 2a 70 49 64 78 2c 20 63 68 61 72 20 2a 7a  t *pIdx, char *z
c060: 53 69 67 6e 65 64 49 64 65 6e 74 29 7b 0a 20 20  SignedIdent){.  
c070: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a  unsigned char *z
c080: 49 64 65 6e 74 20 3d 20 28 75 6e 73 69 67 6e 65  Ident = (unsigne
c090: 64 20 63 68 61 72 2a 29 7a 53 69 67 6e 65 64 49  d char*)zSignedI
c0a0: 64 65 6e 74 3b 0a 20 20 69 6e 74 20 69 2c 20 6a  dent;.  int i, j
c0b0: 2c 20 6e 65 65 64 51 75 6f 74 65 3b 0a 20 20 69  , needQuote;.  i
c0c0: 20 3d 20 2a 70 49 64 78 3b 0a 0a 20 20 66 6f 72   = *pIdx;..  for
c0d0: 28 6a 3d 30 3b 20 7a 49 64 65 6e 74 5b 6a 5d 3b  (j=0; zIdent[j];
c0e0: 20 6a 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 21   j++){.    if( !
c0f0: 73 71 6c 69 74 65 33 49 73 61 6c 6e 75 6d 28 7a  sqlite3Isalnum(z
c100: 49 64 65 6e 74 5b 6a 5d 29 20 26 26 20 7a 49 64  Ident[j]) && zId
c110: 65 6e 74 5b 6a 5d 21 3d 27 5f 27 20 29 20 62 72  ent[j]!='_' ) br
c120: 65 61 6b 3b 0a 20 20 7d 0a 20 20 6e 65 65 64 51  eak;.  }.  needQ
c130: 75 6f 74 65 20 3d 20 73 71 6c 69 74 65 33 49 73  uote = sqlite3Is
c140: 64 69 67 69 74 28 7a 49 64 65 6e 74 5b 30 5d 29  digit(zIdent[0])
c150: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20  .            || 
c160: 73 71 6c 69 74 65 33 4b 65 79 77 6f 72 64 43 6f  sqlite3KeywordCo
c170: 64 65 28 7a 49 64 65 6e 74 2c 20 6a 29 21 3d 54  de(zIdent, j)!=T
c180: 4b 5f 49 44 0a 20 20 20 20 20 20 20 20 20 20 20  K_ID.           
c190: 20 7c 7c 20 7a 49 64 65 6e 74 5b 6a 5d 21 3d 30   || zIdent[j]!=0
c1a0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20  .            || 
c1b0: 6a 3d 3d 30 3b 0a 0a 20 20 69 66 28 20 6e 65 65  j==0;..  if( nee
c1c0: 64 51 75 6f 74 65 20 29 20 7a 5b 69 2b 2b 5d 20  dQuote ) z[i++] 
c1d0: 3d 20 27 22 27 3b 0a 20 20 66 6f 72 28 6a 3d 30  = '"';.  for(j=0
c1e0: 3b 20 7a 49 64 65 6e 74 5b 6a 5d 3b 20 6a 2b 2b  ; zIdent[j]; j++
c1f0: 29 7b 0a 20 20 20 20 7a 5b 69 2b 2b 5d 20 3d 20  ){.    z[i++] = 
c200: 7a 49 64 65 6e 74 5b 6a 5d 3b 0a 20 20 20 20 69  zIdent[j];.    i
c210: 66 28 20 7a 49 64 65 6e 74 5b 6a 5d 3d 3d 27 22  f( zIdent[j]=='"
c220: 27 20 29 20 7a 5b 69 2b 2b 5d 20 3d 20 27 22 27  ' ) z[i++] = '"'
c230: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 65 65 64  ;.  }.  if( need
c240: 51 75 6f 74 65 20 29 20 7a 5b 69 2b 2b 5d 20 3d  Quote ) z[i++] =
c250: 20 27 22 27 3b 0a 20 20 7a 5b 69 5d 20 3d 20 30   '"';.  z[i] = 0
c260: 3b 0a 20 20 2a 70 49 64 78 20 3d 20 69 3b 0a 7d  ;.  *pIdx = i;.}
c270: 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
c280: 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20   a CREATE TABLE 
c290: 73 74 61 74 65 6d 65 6e 74 20 61 70 70 72 6f 70  statement approp
c2a0: 72 69 61 74 65 20 66 6f 72 20 74 68 65 20 67 69  riate for the gi
c2b0: 76 65 6e 0a 2a 2a 20 74 61 62 6c 65 2e 20 20 4d  ven.** table.  M
c2c0: 65 6d 6f 72 79 20 74 6f 20 68 6f 6c 64 20 74 68  emory to hold th
c2d0: 65 20 74 65 78 74 20 6f 66 20 74 68 65 20 73 74  e text of the st
c2e0: 61 74 65 6d 65 6e 74 20 69 73 20 6f 62 74 61 69  atement is obtai
c2f0: 6e 65 64 0a 2a 2a 20 66 72 6f 6d 20 73 71 6c 69  ned.** from sqli
c300: 74 65 4d 61 6c 6c 6f 63 28 29 20 61 6e 64 20 6d  teMalloc() and m
c310: 75 73 74 20 62 65 20 66 72 65 65 64 20 62 79 20  ust be freed by 
c320: 74 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63  the calling func
c330: 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
c340: 63 68 61 72 20 2a 63 72 65 61 74 65 54 61 62 6c  char *createTabl
c350: 65 53 74 6d 74 28 73 71 6c 69 74 65 33 20 2a 64  eStmt(sqlite3 *d
c360: 62 2c 20 54 61 62 6c 65 20 2a 70 29 7b 0a 20 20  b, Table *p){.  
c370: 69 6e 74 20 69 2c 20 6b 2c 20 6e 3b 0a 20 20 63  int i, k, n;.  c
c380: 68 61 72 20 2a 7a 53 74 6d 74 3b 0a 20 20 63 68  har *zStmt;.  ch
c390: 61 72 20 2a 7a 53 65 70 2c 20 2a 7a 53 65 70 32  ar *zSep, *zSep2
c3a0: 2c 20 2a 7a 45 6e 64 3b 0a 20 20 43 6f 6c 75 6d  , *zEnd;.  Colum
c3b0: 6e 20 2a 70 43 6f 6c 3b 0a 20 20 6e 20 3d 20 30  n *pCol;.  n = 0
c3c0: 3b 0a 20 20 66 6f 72 28 70 43 6f 6c 20 3d 20 70  ;.  for(pCol = p
c3d0: 2d 3e 61 43 6f 6c 2c 20 69 3d 30 3b 20 69 3c 70  ->aCol, i=0; i<p
c3e0: 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f  ->nCol; i++, pCo
c3f0: 6c 2b 2b 29 7b 0a 20 20 20 20 6e 20 2b 3d 20 69  l++){.    n += i
c400: 64 65 6e 74 4c 65 6e 67 74 68 28 70 43 6f 6c 2d  dentLength(pCol-
c410: 3e 7a 4e 61 6d 65 29 20 2b 20 35 3b 0a 20 20 7d  >zName) + 5;.  }
c420: 0a 20 20 6e 20 2b 3d 20 69 64 65 6e 74 4c 65 6e  .  n += identLen
c430: 67 74 68 28 70 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  gth(p->zName);. 
c440: 20 69 66 28 20 6e 3c 35 30 20 29 7b 20 0a 20 20   if( n<50 ){ .  
c450: 20 20 7a 53 65 70 20 3d 20 22 22 3b 0a 20 20 20    zSep = "";.   
c460: 20 7a 53 65 70 32 20 3d 20 22 2c 22 3b 0a 20 20   zSep2 = ",";.  
c470: 20 20 7a 45 6e 64 20 3d 20 22 29 22 3b 0a 20 20    zEnd = ")";.  
c480: 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 53 65 70 20  }else{.    zSep 
c490: 3d 20 22 5c 6e 20 20 22 3b 0a 20 20 20 20 7a 53  = "\n  ";.    zS
c4a0: 65 70 32 20 3d 20 22 2c 5c 6e 20 20 22 3b 0a 20  ep2 = ",\n  ";. 
c4b0: 20 20 20 7a 45 6e 64 20 3d 20 22 5c 6e 29 22 3b     zEnd = "\n)";
c4c0: 0a 20 20 7d 0a 20 20 6e 20 2b 3d 20 33 35 20 2b  .  }.  n += 35 +
c4d0: 20 36 2a 70 2d 3e 6e 43 6f 6c 3b 0a 20 20 7a 53   6*p->nCol;.  zS
c4e0: 74 6d 74 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  tmt = sqlite3DbM
c4f0: 61 6c 6c 6f 63 52 61 77 28 30 2c 20 6e 29 3b 0a  allocRaw(0, n);.
c500: 20 20 69 66 28 20 7a 53 74 6d 74 3d 3d 30 20 29    if( zStmt==0 )
c510: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 6f 6d  {.    sqlite3Oom
c520: 46 61 75 6c 74 28 64 62 29 3b 0a 20 20 20 20 72  Fault(db);.    r
c530: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 73  eturn 0;.  }.  s
c540: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
c550: 6e 2c 20 7a 53 74 6d 74 2c 20 22 43 52 45 41 54  n, zStmt, "CREAT
c560: 45 20 54 41 42 4c 45 20 22 29 3b 0a 20 20 6b 20  E TABLE ");.  k 
c570: 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
c580: 30 28 7a 53 74 6d 74 29 3b 0a 20 20 69 64 65 6e  0(zStmt);.  iden
c590: 74 50 75 74 28 7a 53 74 6d 74 2c 20 26 6b 2c 20  tPut(zStmt, &k, 
c5a0: 70 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 7a 53 74  p->zName);.  zSt
c5b0: 6d 74 5b 6b 2b 2b 5d 20 3d 20 27 28 27 3b 0a 20  mt[k++] = '(';. 
c5c0: 20 66 6f 72 28 70 43 6f 6c 3d 70 2d 3e 61 43 6f   for(pCol=p->aCo
c5d0: 6c 2c 20 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f  l, i=0; i<p->nCo
c5e0: 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b  l; i++, pCol++){
c5f0: 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73  .    static cons
c600: 74 20 63 68 61 72 20 2a 20 63 6f 6e 73 74 20 61  t char * const a
c610: 7a 54 79 70 65 5b 5d 20 3d 20 7b 0a 20 20 20 20  zType[] = {.    
c620: 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 41 46      /* SQLITE_AF
c630: 46 5f 42 4c 4f 42 20 20 20 20 2a 2f 20 22 22 2c  F_BLOB    */ "",
c640: 0a 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 49  .        /* SQLI
c650: 54 45 5f 41 46 46 5f 54 45 58 54 20 20 20 20 2a  TE_AFF_TEXT    *
c660: 2f 20 22 20 54 45 58 54 22 2c 0a 20 20 20 20 20  / " TEXT",.     
c670: 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 41 46 46     /* SQLITE_AFF
c680: 5f 4e 55 4d 45 52 49 43 20 2a 2f 20 22 20 4e 55  _NUMERIC */ " NU
c690: 4d 22 2c 0a 20 20 20 20 20 20 20 20 2f 2a 20 53  M",.        /* S
c6a0: 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45  QLITE_AFF_INTEGE
c6b0: 52 20 2a 2f 20 22 20 49 4e 54 22 2c 0a 20 20 20  R */ " INT",.   
c6c0: 20 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 41       /* SQLITE_A
c6d0: 46 46 5f 52 45 41 4c 20 20 20 20 2a 2f 20 22 20  FF_REAL    */ " 
c6e0: 52 45 41 4c 22 0a 20 20 20 20 7d 3b 0a 20 20 20  REAL".    };.   
c6f0: 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20 20 63 6f   int len;.    co
c700: 6e 73 74 20 63 68 61 72 20 2a 7a 54 79 70 65 3b  nst char *zType;
c710: 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e  ..    sqlite3_sn
c720: 70 72 69 6e 74 66 28 6e 2d 6b 2c 20 26 7a 53 74  printf(n-k, &zSt
c730: 6d 74 5b 6b 5d 2c 20 7a 53 65 70 29 3b 0a 20 20  mt[k], zSep);.  
c740: 20 20 6b 20 2b 3d 20 73 71 6c 69 74 65 33 53 74    k += sqlite3St
c750: 72 6c 65 6e 33 30 28 26 7a 53 74 6d 74 5b 6b 5d  rlen30(&zStmt[k]
c760: 29 3b 0a 20 20 20 20 7a 53 65 70 20 3d 20 7a 53  );.    zSep = zS
c770: 65 70 32 3b 0a 20 20 20 20 69 64 65 6e 74 50 75  ep2;.    identPu
c780: 74 28 7a 53 74 6d 74 2c 20 26 6b 2c 20 70 43 6f  t(zStmt, &k, pCo
c790: 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 61  l->zName);.    a
c7a0: 73 73 65 72 74 28 20 70 43 6f 6c 2d 3e 61 66 66  ssert( pCol->aff
c7b0: 69 6e 69 74 79 2d 53 51 4c 49 54 45 5f 41 46 46  inity-SQLITE_AFF
c7c0: 5f 42 4c 4f 42 20 3e 3d 20 30 20 29 3b 0a 20 20  _BLOB >= 0 );.  
c7d0: 20 20 61 73 73 65 72 74 28 20 70 43 6f 6c 2d 3e    assert( pCol->
c7e0: 61 66 66 69 6e 69 74 79 2d 53 51 4c 49 54 45 5f  affinity-SQLITE_
c7f0: 41 46 46 5f 42 4c 4f 42 20 3c 20 41 72 72 61 79  AFF_BLOB < Array
c800: 53 69 7a 65 28 61 7a 54 79 70 65 29 20 29 3b 0a  Size(azType) );.
c810: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 43      testcase( pC
c820: 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 53 51  ol->affinity==SQ
c830: 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 20 29 3b  LITE_AFF_BLOB );
c840: 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70  .    testcase( p
c850: 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 53  Col->affinity==S
c860: 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 20 29  QLITE_AFF_TEXT )
c870: 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
c880: 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 3d 3d  pCol->affinity==
c890: 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52  SQLITE_AFF_NUMER
c8a0: 49 43 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61  IC );.    testca
c8b0: 73 65 28 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69  se( pCol->affini
c8c0: 74 79 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 49  ty==SQLITE_AFF_I
c8d0: 4e 54 45 47 45 52 20 29 3b 0a 20 20 20 20 74 65  NTEGER );.    te
c8e0: 73 74 63 61 73 65 28 20 70 43 6f 6c 2d 3e 61 66  stcase( pCol->af
c8f0: 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41  finity==SQLITE_A
c900: 46 46 5f 52 45 41 4c 20 29 3b 0a 20 20 20 20 0a  FF_REAL );.    .
c910: 20 20 20 20 7a 54 79 70 65 20 3d 20 61 7a 54 79      zType = azTy
c920: 70 65 5b 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74  pe[pCol->affinit
c930: 79 20 2d 20 53 51 4c 49 54 45 5f 41 46 46 5f 42  y - SQLITE_AFF_B
c940: 4c 4f 42 5d 3b 0a 20 20 20 20 6c 65 6e 20 3d 20  LOB];.    len = 
c950: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
c960: 7a 54 79 70 65 29 3b 0a 20 20 20 20 61 73 73 65  zType);.    asse
c970: 72 74 28 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69  rt( pCol->affini
c980: 74 79 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 42  ty==SQLITE_AFF_B
c990: 4c 4f 42 20 0a 20 20 20 20 20 20 20 20 20 20 20  LOB .           
c9a0: 20 7c 7c 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69   || pCol->affini
c9b0: 74 79 3d 3d 73 71 6c 69 74 65 33 41 66 66 69 6e  ty==sqlite3Affin
c9c0: 69 74 79 54 79 70 65 28 7a 54 79 70 65 2c 20 30  ityType(zType, 0
c9d0: 29 20 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  ) );.    memcpy(
c9e0: 26 7a 53 74 6d 74 5b 6b 5d 2c 20 7a 54 79 70 65  &zStmt[k], zType
c9f0: 2c 20 6c 65 6e 29 3b 0a 20 20 20 20 6b 20 2b 3d  , len);.    k +=
ca00: 20 6c 65 6e 3b 0a 20 20 20 20 61 73 73 65 72 74   len;.    assert
ca10: 28 20 6b 3c 3d 6e 20 29 3b 0a 20 20 7d 0a 20 20  ( k<=n );.  }.  
ca20: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
ca30: 28 6e 2d 6b 2c 20 26 7a 53 74 6d 74 5b 6b 5d 2c  (n-k, &zStmt[k],
ca40: 20 22 25 73 22 2c 20 7a 45 6e 64 29 3b 0a 20 20   "%s", zEnd);.  
ca50: 72 65 74 75 72 6e 20 7a 53 74 6d 74 3b 0a 7d 0a  return zStmt;.}.
ca60: 0a 2f 2a 0a 2a 2a 20 52 65 73 69 7a 65 20 61 6e  ./*.** Resize an
ca70: 20 49 6e 64 65 78 20 6f 62 6a 65 63 74 20 74 6f   Index object to
ca80: 20 68 6f 6c 64 20 4e 20 63 6f 6c 75 6d 6e 73 20   hold N columns 
ca90: 74 6f 74 61 6c 2e 20 20 52 65 74 75 72 6e 20 53  total.  Return S
caa0: 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73  QLITE_OK.** on s
cab0: 75 63 63 65 73 73 20 61 6e 64 20 53 51 4c 49 54  uccess and SQLIT
cac0: 45 5f 4e 4f 4d 45 4d 20 6f 6e 20 61 6e 20 4f 4f  E_NOMEM on an OO
cad0: 4d 20 65 72 72 6f 72 2e 0a 2a 2f 0a 73 74 61 74  M error..*/.stat
cae0: 69 63 20 69 6e 74 20 72 65 73 69 7a 65 49 6e 64  ic int resizeInd
caf0: 65 78 4f 62 6a 65 63 74 28 73 71 6c 69 74 65 33  exObject(sqlite3
cb00: 20 2a 64 62 2c 20 49 6e 64 65 78 20 2a 70 49 64   *db, Index *pId
cb10: 78 2c 20 69 6e 74 20 4e 29 7b 0a 20 20 63 68 61  x, int N){.  cha
cb20: 72 20 2a 7a 45 78 74 72 61 3b 0a 20 20 69 6e 74  r *zExtra;.  int
cb30: 20 6e 42 79 74 65 3b 0a 20 20 69 66 28 20 70 49   nByte;.  if( pI
cb40: 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3e 3d 4e 20 29  dx->nColumn>=N )
cb50: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
cb60: 4b 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49 64  K;.  assert( pId
cb70: 78 2d 3e 69 73 52 65 73 69 7a 65 64 3d 3d 30 20  x->isResized==0 
cb80: 29 3b 0a 20 20 6e 42 79 74 65 20 3d 20 28 73 69  );.  nByte = (si
cb90: 7a 65 6f 66 28 63 68 61 72 2a 29 20 2b 20 73 69  zeof(char*) + si
cba0: 7a 65 6f 66 28 69 31 36 29 20 2b 20 31 29 2a 4e  zeof(i16) + 1)*N
cbb0: 3b 0a 20 20 7a 45 78 74 72 61 20 3d 20 73 71 6c  ;.  zExtra = sql
cbc0: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f  ite3DbMallocZero
cbd0: 28 64 62 2c 20 6e 42 79 74 65 29 3b 0a 20 20 69  (db, nByte);.  i
cbe0: 66 28 20 7a 45 78 74 72 61 3d 3d 30 20 29 20 72  f( zExtra==0 ) r
cbf0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
cc00: 45 4d 5f 42 4b 50 54 3b 0a 20 20 6d 65 6d 63 70  EM_BKPT;.  memcp
cc10: 79 28 7a 45 78 74 72 61 2c 20 70 49 64 78 2d 3e  y(zExtra, pIdx->
cc20: 61 7a 43 6f 6c 6c 2c 20 73 69 7a 65 6f 66 28 63  azColl, sizeof(c
cc30: 68 61 72 2a 29 2a 70 49 64 78 2d 3e 6e 43 6f 6c  har*)*pIdx->nCol
cc40: 75 6d 6e 29 3b 0a 20 20 70 49 64 78 2d 3e 61 7a  umn);.  pIdx->az
cc50: 43 6f 6c 6c 20 3d 20 28 63 6f 6e 73 74 20 63 68  Coll = (const ch
cc60: 61 72 2a 2a 29 7a 45 78 74 72 61 3b 0a 20 20 7a  ar**)zExtra;.  z
cc70: 45 78 74 72 61 20 2b 3d 20 73 69 7a 65 6f 66 28  Extra += sizeof(
cc80: 63 68 61 72 2a 29 2a 4e 3b 0a 20 20 6d 65 6d 63  char*)*N;.  memc
cc90: 70 79 28 7a 45 78 74 72 61 2c 20 70 49 64 78 2d  py(zExtra, pIdx-
cca0: 3e 61 69 43 6f 6c 75 6d 6e 2c 20 73 69 7a 65 6f  >aiColumn, sizeo
ccb0: 66 28 69 31 36 29 2a 70 49 64 78 2d 3e 6e 43 6f  f(i16)*pIdx->nCo
ccc0: 6c 75 6d 6e 29 3b 0a 20 20 70 49 64 78 2d 3e 61  lumn);.  pIdx->a
ccd0: 69 43 6f 6c 75 6d 6e 20 3d 20 28 69 31 36 2a 29  iColumn = (i16*)
cce0: 7a 45 78 74 72 61 3b 0a 20 20 7a 45 78 74 72 61  zExtra;.  zExtra
ccf0: 20 2b 3d 20 73 69 7a 65 6f 66 28 69 31 36 29 2a   += sizeof(i16)*
cd00: 4e 3b 0a 20 20 6d 65 6d 63 70 79 28 7a 45 78 74  N;.  memcpy(zExt
cd10: 72 61 2c 20 70 49 64 78 2d 3e 61 53 6f 72 74 4f  ra, pIdx->aSortO
cd20: 72 64 65 72 2c 20 70 49 64 78 2d 3e 6e 43 6f 6c  rder, pIdx->nCol
cd30: 75 6d 6e 29 3b 0a 20 20 70 49 64 78 2d 3e 61 53  umn);.  pIdx->aS
cd40: 6f 72 74 4f 72 64 65 72 20 3d 20 28 75 38 2a 29  ortOrder = (u8*)
cd50: 7a 45 78 74 72 61 3b 0a 20 20 70 49 64 78 2d 3e  zExtra;.  pIdx->
cd60: 6e 43 6f 6c 75 6d 6e 20 3d 20 4e 3b 0a 20 20 70  nColumn = N;.  p
cd70: 49 64 78 2d 3e 69 73 52 65 73 69 7a 65 64 20 3d  Idx->isResized =
cd80: 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c   1;.  return SQL
cd90: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
cda0: 20 45 73 74 69 6d 61 74 65 20 74 68 65 20 74 6f   Estimate the to
cdb0: 74 61 6c 20 72 6f 77 20 77 69 64 74 68 20 66 6f  tal row width fo
cdc0: 72 20 61 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74  r a table..*/.st
cdd0: 61 74 69 63 20 76 6f 69 64 20 65 73 74 69 6d 61  atic void estima
cde0: 74 65 54 61 62 6c 65 57 69 64 74 68 28 54 61 62  teTableWidth(Tab
cdf0: 6c 65 20 2a 70 54 61 62 29 7b 0a 20 20 75 6e 73  le *pTab){.  uns
ce00: 69 67 6e 65 64 20 77 54 61 62 6c 65 20 3d 20 30  igned wTable = 0
ce10: 3b 0a 20 20 63 6f 6e 73 74 20 43 6f 6c 75 6d 6e  ;.  const Column
ce20: 20 2a 70 54 61 62 43 6f 6c 3b 0a 20 20 69 6e 74   *pTabCol;.  int
ce30: 20 69 3b 0a 20 20 66 6f 72 28 69 3d 70 54 61 62   i;.  for(i=pTab
ce40: 2d 3e 6e 43 6f 6c 2c 20 70 54 61 62 43 6f 6c 3d  ->nCol, pTabCol=
ce50: 70 54 61 62 2d 3e 61 43 6f 6c 3b 20 69 3e 30 3b  pTab->aCol; i>0;
ce60: 20 69 2d 2d 2c 20 70 54 61 62 43 6f 6c 2b 2b 29   i--, pTabCol++)
ce70: 7b 0a 20 20 20 20 77 54 61 62 6c 65 20 2b 3d 20  {.    wTable += 
ce80: 70 54 61 62 43 6f 6c 2d 3e 73 7a 45 73 74 3b 0a  pTabCol->szEst;.
ce90: 20 20 7d 0a 20 20 69 66 28 20 70 54 61 62 2d 3e    }.  if( pTab->
cea0: 69 50 4b 65 79 3c 30 20 29 20 77 54 61 62 6c 65  iPKey<0 ) wTable
ceb0: 2b 2b 3b 0a 20 20 70 54 61 62 2d 3e 73 7a 54 61  ++;.  pTab->szTa
cec0: 62 52 6f 77 20 3d 20 73 71 6c 69 74 65 33 4c 6f  bRow = sqlite3Lo
ced0: 67 45 73 74 28 77 54 61 62 6c 65 2a 34 29 3b 0a  gEst(wTable*4);.
cee0: 7d 0a 0a 2f 2a 0a 2a 2a 20 45 73 74 69 6d 61 74  }../*.** Estimat
cef0: 65 20 74 68 65 20 61 76 65 72 61 67 65 20 73 69  e the average si
cf00: 7a 65 20 6f 66 20 61 20 72 6f 77 20 66 6f 72 20  ze of a row for 
cf10: 61 6e 20 69 6e 64 65 78 2e 0a 2a 2f 0a 73 74 61  an index..*/.sta
cf20: 74 69 63 20 76 6f 69 64 20 65 73 74 69 6d 61 74  tic void estimat
cf30: 65 49 6e 64 65 78 57 69 64 74 68 28 49 6e 64 65  eIndexWidth(Inde
cf40: 78 20 2a 70 49 64 78 29 7b 0a 20 20 75 6e 73 69  x *pIdx){.  unsi
cf50: 67 6e 65 64 20 77 49 6e 64 65 78 20 3d 20 30 3b  gned wIndex = 0;
cf60: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 6f 6e 73  .  int i;.  cons
cf70: 74 20 43 6f 6c 75 6d 6e 20 2a 61 43 6f 6c 20 3d  t Column *aCol =
cf80: 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 2d 3e 61   pIdx->pTable->a
cf90: 43 6f 6c 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  Col;.  for(i=0; 
cfa0: 69 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b  i<pIdx->nColumn;
cfb0: 20 69 2b 2b 29 7b 0a 20 20 20 20 69 31 36 20 78   i++){.    i16 x
cfc0: 20 3d 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d   = pIdx->aiColum
cfd0: 6e 5b 69 5d 3b 0a 20 20 20 20 61 73 73 65 72 74  n[i];.    assert
cfe0: 28 20 78 3c 70 49 64 78 2d 3e 70 54 61 62 6c 65  ( x<pIdx->pTable
cff0: 2d 3e 6e 43 6f 6c 20 29 3b 0a 20 20 20 20 77 49  ->nCol );.    wI
d000: 6e 64 65 78 20 2b 3d 20 78 3c 30 20 3f 20 31 20  ndex += x<0 ? 1 
d010: 3a 20 61 43 6f 6c 5b 70 49 64 78 2d 3e 61 69 43  : aCol[pIdx->aiC
d020: 6f 6c 75 6d 6e 5b 69 5d 5d 2e 73 7a 45 73 74 3b  olumn[i]].szEst;
d030: 0a 20 20 7d 0a 20 20 70 49 64 78 2d 3e 73 7a 49  .  }.  pIdx->szI
d040: 64 78 52 6f 77 20 3d 20 73 71 6c 69 74 65 33 4c  dxRow = sqlite3L
d050: 6f 67 45 73 74 28 77 49 6e 64 65 78 2a 34 29 3b  ogEst(wIndex*4);
d060: 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 20 74 72  .}../* Return tr
d070: 75 65 20 69 66 20 76 61 6c 75 65 20 78 20 69 73  ue if value x is
d080: 20 66 6f 75 6e 64 20 61 6e 79 20 6f 66 20 74 68   found any of th
d090: 65 20 66 69 72 73 74 20 6e 43 6f 6c 20 65 6e 74  e first nCol ent
d0a0: 72 69 65 73 20 6f 66 20 61 69 43 6f 6c 5b 5d 0a  ries of aiCol[].
d0b0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 68 61  */.static int ha
d0c0: 73 43 6f 6c 75 6d 6e 28 63 6f 6e 73 74 20 69 31  sColumn(const i1
d0d0: 36 20 2a 61 69 43 6f 6c 2c 20 69 6e 74 20 6e 43  6 *aiCol, int nC
d0e0: 6f 6c 2c 20 69 6e 74 20 78 29 7b 0a 20 20 77 68  ol, int x){.  wh
d0f0: 69 6c 65 28 20 6e 43 6f 6c 2d 2d 20 3e 20 30 20  ile( nCol-- > 0 
d100: 29 20 69 66 28 20 78 3d 3d 2a 28 61 69 43 6f 6c  ) if( x==*(aiCol
d110: 2b 2b 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  ++) ) return 1;.
d120: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
d130: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
d140: 65 20 72 75 6e 73 20 61 74 20 74 68 65 20 65 6e  e runs at the en
d150: 64 20 6f 66 20 70 61 72 73 69 6e 67 20 61 20 43  d of parsing a C
d160: 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74  REATE TABLE stat
d170: 65 6d 65 6e 74 20 74 68 61 74 0a 2a 2a 20 68 61  ement that.** ha
d180: 73 20 61 20 57 49 54 48 4f 55 54 20 52 4f 57 49  s a WITHOUT ROWI
d190: 44 20 63 6c 61 75 73 65 2e 20 20 54 68 65 20 6a  D clause.  The j
d1a0: 6f 62 20 6f 66 20 74 68 69 73 20 72 6f 75 74 69  ob of this routi
d1b0: 6e 65 20 69 73 20 74 6f 20 63 6f 6e 76 65 72 74  ne is to convert
d1c0: 20 62 6f 74 68 0a 2a 2a 20 69 6e 74 65 72 6e 61   both.** interna
d1d0: 6c 20 73 63 68 65 6d 61 20 64 61 74 61 20 73 74  l schema data st
d1e0: 72 75 63 74 75 72 65 73 20 61 6e 64 20 74 68 65  ructures and the
d1f0: 20 67 65 6e 65 72 61 74 65 64 20 56 44 42 45 20   generated VDBE 
d200: 63 6f 64 65 20 73 6f 20 74 68 61 74 20 74 68 65  code so that the
d210: 79 0a 2a 2a 20 61 72 65 20 61 70 70 72 6f 70 72  y.** are appropr
d220: 69 61 74 65 20 66 6f 72 20 61 20 57 49 54 48 4f  iate for a WITHO
d230: 55 54 20 52 4f 57 49 44 20 74 61 62 6c 65 20 69  UT ROWID table i
d240: 6e 73 74 65 61 64 20 6f 66 20 61 20 72 6f 77 69  nstead of a rowi
d250: 64 20 74 61 62 6c 65 2e 0a 2a 2a 20 43 68 61 6e  d table..** Chan
d260: 67 65 73 20 69 6e 63 6c 75 64 65 3a 0a 2a 2a 0a  ges include:.**.
d270: 2a 2a 20 20 20 20 20 28 31 29 20 20 53 65 74 20  **     (1)  Set 
d280: 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74  all columns of t
d290: 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 73  he PRIMARY KEY s
d2a0: 63 68 65 6d 61 20 6f 62 6a 65 63 74 20 74 6f 20  chema object to 
d2b0: 62 65 20 4e 4f 54 20 4e 55 4c 4c 2e 0a 2a 2a 20  be NOT NULL..** 
d2c0: 20 20 20 20 28 32 29 20 20 43 6f 6e 76 65 72 74      (2)  Convert
d2d0: 20 74 68 65 20 4f 50 5f 43 72 65 61 74 65 54 61   the OP_CreateTa
d2e0: 62 6c 65 20 69 6e 74 6f 20 61 6e 20 4f 50 5f 43  ble into an OP_C
d2f0: 72 65 61 74 65 49 6e 64 65 78 2e 20 20 54 68 65  reateIndex.  The
d300: 72 65 20 69 73 0a 2a 2a 20 20 20 20 20 20 20 20  re is.**        
d310: 20 20 6e 6f 20 72 6f 77 69 64 20 62 74 72 65 65    no rowid btree
d320: 20 66 6f 72 20 61 20 57 49 54 48 4f 55 54 20 52   for a WITHOUT R
d330: 4f 57 49 44 2e 20 20 49 6e 73 74 65 61 64 2c 20  OWID.  Instead, 
d340: 74 68 65 20 63 61 6e 6f 6e 69 63 61 6c 0a 2a 2a  the canonical.**
d350: 20 20 20 20 20 20 20 20 20 20 64 61 74 61 20 73            data s
d360: 74 6f 72 61 67 65 20 69 73 20 61 20 63 6f 76 65  torage is a cove
d370: 72 69 6e 67 20 69 6e 64 65 78 20 62 74 72 65 65  ring index btree
d380: 2e 0a 2a 2a 20 20 20 20 20 28 33 29 20 20 42 79  ..**     (3)  By
d390: 70 61 73 73 20 74 68 65 20 63 72 65 61 74 69 6f  pass the creatio
d3a0: 6e 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65 5f  n of the sqlite_
d3b0: 6d 61 73 74 65 72 20 74 61 62 6c 65 20 65 6e 74  master table ent
d3c0: 72 79 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 66  ry.**          f
d3d0: 6f 72 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b  or the PRIMARY K
d3e0: 45 59 20 61 73 20 74 68 65 20 70 72 69 6d 61 72  EY as the primar
d3f0: 79 20 6b 65 79 20 69 6e 64 65 78 20 69 73 20 6e  y key index is n
d400: 6f 77 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 69  ow.**          i
d410: 64 65 6e 74 69 66 69 65 64 20 62 79 20 74 68 65  dentified by the
d420: 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74   sqlite_master t
d430: 61 62 6c 65 20 65 6e 74 72 79 20 6f 66 20 74 68  able entry of th
d440: 65 20 74 61 62 6c 65 20 69 74 73 65 6c 66 2e 0a  e table itself..
d450: 2a 2a 20 20 20 20 20 28 34 29 20 20 53 65 74 20  **     (4)  Set 
d460: 74 68 65 20 49 6e 64 65 78 2e 74 6e 75 6d 20 6f  the Index.tnum o
d470: 66 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45  f the PRIMARY KE
d480: 59 20 49 6e 64 65 78 20 6f 62 6a 65 63 74 20 69  Y Index object i
d490: 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20  n the.**        
d4a0: 20 20 73 63 68 65 6d 61 20 74 6f 20 74 68 65 20    schema to the 
d4b0: 72 6f 6f 74 70 61 67 65 20 66 72 6f 6d 20 74 68  rootpage from th
d4c0: 65 20 6d 61 69 6e 20 74 61 62 6c 65 2e 0a 2a 2a  e main table..**
d4d0: 20 20 20 20 20 28 35 29 20 20 41 64 64 20 61 6c       (5)  Add al
d4e0: 6c 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 73 20  l table columns 
d4f0: 74 6f 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b  to the PRIMARY K
d500: 45 59 20 49 6e 64 65 78 20 6f 62 6a 65 63 74 0a  EY Index object.
d510: 2a 2a 20 20 20 20 20 20 20 20 20 20 73 6f 20 74  **          so t
d520: 68 61 74 20 74 68 65 20 50 52 49 4d 41 52 59 20  hat the PRIMARY 
d530: 4b 45 59 20 69 73 20 61 20 63 6f 76 65 72 69 6e  KEY is a coverin
d540: 67 20 69 6e 64 65 78 2e 20 20 54 68 65 20 73 75  g index.  The su
d550: 72 70 6c 75 73 0a 2a 2a 20 20 20 20 20 20 20 20  rplus.**        
d560: 20 20 63 6f 6c 75 6d 6e 73 20 61 72 65 20 70 61    columns are pa
d570: 72 74 20 6f 66 20 4b 65 79 49 6e 66 6f 2e 6e 58  rt of KeyInfo.nX
d580: 46 69 65 6c 64 20 61 6e 64 20 61 72 65 20 6e 6f  Field and are no
d590: 74 20 75 73 65 64 20 66 6f 72 0a 2a 2a 20 20 20  t used for.**   
d5a0: 20 20 20 20 20 20 20 73 6f 72 74 69 6e 67 20 6f         sorting o
d5b0: 72 20 6c 6f 6f 6b 75 70 20 6f 72 20 75 6e 69 71  r lookup or uniq
d5c0: 75 65 6e 65 73 73 20 63 68 65 63 6b 73 2e 0a 2a  ueness checks..*
d5d0: 2a 20 20 20 20 20 28 36 29 20 20 52 65 70 6c 61  *     (6)  Repla
d5e0: 63 65 20 74 68 65 20 72 6f 77 69 64 20 74 61 69  ce the rowid tai
d5f0: 6c 20 6f 6e 20 61 6c 6c 20 61 75 74 6f 6d 61 74  l on all automat
d600: 69 63 61 6c 6c 79 20 67 65 6e 65 72 61 74 65 64  ically generated
d610: 20 55 4e 49 51 55 45 0a 2a 2a 20 20 20 20 20 20   UNIQUE.**      
d620: 20 20 20 20 69 6e 64 69 63 65 73 20 77 69 74 68      indices with
d630: 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59   the PRIMARY KEY
d640: 20 63 6f 6c 75 6d 6e 73 2e 0a 2a 2a 0a 2a 2a 20   columns..**.** 
d650: 46 6f 72 20 76 69 72 74 75 61 6c 20 74 61 62 6c  For virtual tabl
d660: 65 73 2c 20 6f 6e 6c 79 20 28 31 29 20 69 73 20  es, only (1) is 
d670: 70 65 72 66 6f 72 6d 65 64 2e 0a 2a 2f 0a 73 74  performed..*/.st
d680: 61 74 69 63 20 76 6f 69 64 20 63 6f 6e 76 65 72  atic void conver
d690: 74 54 6f 57 69 74 68 6f 75 74 52 6f 77 69 64 54  tToWithoutRowidT
d6a0: 61 62 6c 65 28 50 61 72 73 65 20 2a 70 50 61 72  able(Parse *pPar
d6b0: 73 65 2c 20 54 61 62 6c 65 20 2a 70 54 61 62 29  se, Table *pTab)
d6c0: 7b 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b  {.  Index *pIdx;
d6d0: 0a 20 20 49 6e 64 65 78 20 2a 70 50 6b 3b 0a 20  .  Index *pPk;. 
d6e0: 20 69 6e 74 20 6e 50 6b 3b 0a 20 20 69 6e 74 20   int nPk;.  int 
d6f0: 69 2c 20 6a 3b 0a 20 20 73 71 6c 69 74 65 33 20  i, j;.  sqlite3 
d700: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
d710: 3b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  ;.  Vdbe *v = pP
d720: 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 0a 20 20  arse->pVdbe;..  
d730: 2f 2a 20 4d 61 72 6b 20 65 76 65 72 79 20 50 52  /* Mark every PR
d740: 49 4d 41 52 59 20 4b 45 59 20 63 6f 6c 75 6d 6e  IMARY KEY column
d750: 20 61 73 20 4e 4f 54 20 4e 55 4c 4c 20 28 65 78   as NOT NULL (ex
d760: 63 65 70 74 20 66 6f 72 20 69 6d 70 6f 73 74 65  cept for imposte
d770: 72 20 74 61 62 6c 65 73 29 0a 20 20 2a 2f 0a 20  r tables).  */. 
d780: 20 69 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e 69   if( !db->init.i
d790: 6d 70 6f 73 74 65 72 54 61 62 6c 65 20 29 7b 0a  mposterTable ){.
d7a0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
d7b0: 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b  Tab->nCol; i++){
d7c0: 0a 20 20 20 20 20 20 69 66 28 20 28 70 54 61 62  .      if( (pTab
d7d0: 2d 3e 61 43 6f 6c 5b 69 5d 2e 63 6f 6c 46 6c 61  ->aCol[i].colFla
d7e0: 67 73 20 26 20 43 4f 4c 46 4c 41 47 5f 50 52 49  gs & COLFLAG_PRI
d7f0: 4d 4b 45 59 29 21 3d 30 20 29 7b 0a 20 20 20 20  MKEY)!=0 ){.    
d800: 20 20 20 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69      pTab->aCol[i
d810: 5d 2e 6e 6f 74 4e 75 6c 6c 20 3d 20 4f 45 5f 41  ].notNull = OE_A
d820: 62 6f 72 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  bort;.      }.  
d830: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68    }.  }..  /* Th
d840: 65 20 72 65 6d 61 69 6e 69 6e 67 20 74 72 61 6e  e remaining tran
d850: 73 66 6f 72 6d 61 74 69 6f 6e 73 20 6f 6e 6c 79  sformations only
d860: 20 61 70 70 6c 79 20 74 6f 20 62 2d 74 72 65 65   apply to b-tree
d870: 20 74 61 62 6c 65 73 2c 20 6e 6f 74 20 74 6f 0a   tables, not to.
d880: 20 20 2a 2a 20 76 69 72 74 75 61 6c 20 74 61 62    ** virtual tab
d890: 6c 65 73 20 2a 2f 0a 20 20 69 66 28 20 49 4e 5f  les */.  if( IN_
d8a0: 44 45 43 4c 41 52 45 5f 56 54 41 42 20 29 20 72  DECLARE_VTAB ) r
d8b0: 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 43 6f 6e  eturn;..  /* Con
d8c0: 76 65 72 74 20 74 68 65 20 4f 50 5f 43 72 65 61  vert the OP_Crea
d8d0: 74 65 54 61 62 6c 65 20 6f 70 63 6f 64 65 20 74  teTable opcode t
d8e0: 68 61 74 20 77 6f 75 6c 64 20 6e 6f 72 6d 61 6c  hat would normal
d8f0: 6c 79 20 63 72 65 61 74 65 20 74 68 65 0a 20 20  ly create the.  
d900: 2a 2a 20 72 6f 6f 74 2d 70 61 67 65 20 66 6f 72  ** root-page for
d910: 20 74 68 65 20 74 61 62 6c 65 20 69 6e 74 6f 20   the table into 
d920: 61 6e 20 4f 50 5f 43 72 65 61 74 65 49 6e 64 65  an OP_CreateInde
d930: 78 20 6f 70 63 6f 64 65 2e 20 20 54 68 65 20 69  x opcode.  The i
d940: 6e 64 65 78 0a 20 20 2a 2a 20 63 72 65 61 74 65  ndex.  ** create
d950: 64 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68  d will become th
d960: 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 69 6e  e PRIMARY KEY in
d970: 64 65 78 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  dex..  */.  if( 
d980: 70 50 61 72 73 65 2d 3e 61 64 64 72 43 72 54 61  pParse->addrCrTa
d990: 62 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  b ){.    assert(
d9a0: 20 76 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65   v );.    sqlite
d9b0: 33 56 64 62 65 43 68 61 6e 67 65 4f 70 63 6f 64  3VdbeChangeOpcod
d9c0: 65 28 76 2c 20 70 50 61 72 73 65 2d 3e 61 64 64  e(v, pParse->add
d9d0: 72 43 72 54 61 62 2c 20 4f 50 5f 43 72 65 61 74  rCrTab, OP_Creat
d9e0: 65 49 6e 64 65 78 29 3b 0a 20 20 7d 0a 0a 20 20  eIndex);.  }..  
d9f0: 2f 2a 20 4c 6f 63 61 74 65 20 74 68 65 20 50 52  /* Locate the PR
da00: 49 4d 41 52 59 20 4b 45 59 20 69 6e 64 65 78 2e  IMARY KEY index.
da10: 20 20 4f 72 2c 20 69 66 20 74 68 69 73 20 74 61    Or, if this ta
da20: 62 6c 65 20 77 61 73 20 6f 72 69 67 69 6e 61 6c  ble was original
da30: 6c 79 0a 20 20 2a 2a 20 61 6e 20 49 4e 54 45 47  ly.  ** an INTEG
da40: 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 20 74  ER PRIMARY KEY t
da50: 61 62 6c 65 2c 20 63 72 65 61 74 65 20 61 20 6e  able, create a n
da60: 65 77 20 50 52 49 4d 41 52 59 20 4b 45 59 20 69  ew PRIMARY KEY i
da70: 6e 64 65 78 2e 20 0a 20 20 2a 2f 0a 20 20 69 66  ndex. .  */.  if
da80: 28 20 70 54 61 62 2d 3e 69 50 4b 65 79 3e 3d 30  ( pTab->iPKey>=0
da90: 20 29 7b 0a 20 20 20 20 45 78 70 72 4c 69 73 74   ){.    ExprList
daa0: 20 2a 70 4c 69 73 74 3b 0a 20 20 20 20 54 6f 6b   *pList;.    Tok
dab0: 65 6e 20 69 70 6b 54 6f 6b 65 6e 3b 0a 20 20 20  en ipkToken;.   
dac0: 20 73 71 6c 69 74 65 33 54 6f 6b 65 6e 49 6e 69   sqlite3TokenIni
dad0: 74 28 26 69 70 6b 54 6f 6b 65 6e 2c 20 70 54 61  t(&ipkToken, pTa
dae0: 62 2d 3e 61 43 6f 6c 5b 70 54 61 62 2d 3e 69 50  b->aCol[pTab->iP
daf0: 4b 65 79 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20  Key].zName);.   
db00: 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33   pList = sqlite3
db10: 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70  ExprListAppend(p
db20: 50 61 72 73 65 2c 20 30 2c 20 0a 20 20 20 20 20  Parse, 0, .     
db30: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
db40: 69 74 65 33 45 78 70 72 41 6c 6c 6f 63 28 64 62  ite3ExprAlloc(db
db50: 2c 20 54 4b 5f 49 44 2c 20 26 69 70 6b 54 6f 6b  , TK_ID, &ipkTok
db60: 65 6e 2c 20 30 29 29 3b 0a 20 20 20 20 69 66 28  en, 0));.    if(
db70: 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75   pList==0 ) retu
db80: 72 6e 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 61  rn;.    pList->a
db90: 5b 30 5d 2e 73 6f 72 74 4f 72 64 65 72 20 3d 20  [0].sortOrder = 
dba0: 70 50 61 72 73 65 2d 3e 69 50 6b 53 6f 72 74 4f  pParse->iPkSortO
dbb0: 72 64 65 72 3b 0a 20 20 20 20 61 73 73 65 72 74  rder;.    assert
dbc0: 28 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  ( pParse->pNewTa
dbd0: 62 6c 65 3d 3d 70 54 61 62 20 29 3b 0a 20 20 20  ble==pTab );.   
dbe0: 20 73 71 6c 69 74 65 33 43 72 65 61 74 65 49 6e   sqlite3CreateIn
dbf0: 64 65 78 28 70 50 61 72 73 65 2c 20 30 2c 20 30  dex(pParse, 0, 0
dc00: 2c 20 30 2c 20 70 4c 69 73 74 2c 20 70 54 61 62  , 0, pList, pTab
dc10: 2d 3e 6b 65 79 43 6f 6e 66 2c 20 30 2c 20 30 2c  ->keyConf, 0, 0,
dc20: 20 30 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20   0, 0,.         
dc30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51                SQ
dc40: 4c 49 54 45 5f 49 44 58 54 59 50 45 5f 50 52 49  LITE_IDXTYPE_PRI
dc50: 4d 41 52 59 4b 45 59 29 3b 0a 20 20 20 20 69 66  MARYKEY);.    if
dc60: 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
dc70: 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20  ed ) return;.   
dc80: 20 70 50 6b 20 3d 20 73 71 6c 69 74 65 33 50 72   pPk = sqlite3Pr
dc90: 69 6d 61 72 79 4b 65 79 49 6e 64 65 78 28 70 54  imaryKeyIndex(pT
dca0: 61 62 29 3b 0a 20 20 20 20 70 54 61 62 2d 3e 69  ab);.    pTab->i
dcb0: 50 4b 65 79 20 3d 20 2d 31 3b 0a 20 20 7d 65 6c  PKey = -1;.  }el
dcc0: 73 65 7b 0a 20 20 20 20 70 50 6b 20 3d 20 73 71  se{.    pPk = sq
dcd0: 6c 69 74 65 33 50 72 69 6d 61 72 79 4b 65 79 49  lite3PrimaryKeyI
dce0: 6e 64 65 78 28 70 54 61 62 29 3b 0a 0a 20 20 20  ndex(pTab);..   
dcf0: 20 2f 2a 20 42 79 70 61 73 73 20 74 68 65 20 63   /* Bypass the c
dd00: 72 65 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 50  reation of the P
dd10: 52 49 4d 41 52 59 20 4b 45 59 20 62 74 72 65 65  RIMARY KEY btree
dd20: 20 61 6e 64 20 74 68 65 20 73 71 6c 69 74 65 5f   and the sqlite_
dd30: 6d 61 73 74 65 72 0a 20 20 20 20 2a 2a 20 74 61  master.    ** ta
dd40: 62 6c 65 20 65 6e 74 72 79 2e 20 54 68 69 73 20  ble entry. This 
dd50: 69 73 20 6f 6e 6c 79 20 72 65 71 75 69 72 65 64  is only required
dd60: 20 69 66 20 63 75 72 72 65 6e 74 6c 79 20 67 65   if currently ge
dd70: 6e 65 72 61 74 69 6e 67 20 56 44 42 45 0a 20 20  nerating VDBE.  
dd80: 20 20 2a 2a 20 63 6f 64 65 20 66 6f 72 20 61 20    ** code for a 
dd90: 43 52 45 41 54 45 20 54 41 42 4c 45 20 28 6e 6f  CREATE TABLE (no
dda0: 74 20 77 68 65 6e 20 70 61 72 73 69 6e 67 20 6f  t when parsing o
ddb0: 6e 65 20 61 73 20 70 61 72 74 20 6f 66 20 72 65  ne as part of re
ddc0: 61 64 69 6e 67 0a 20 20 20 20 2a 2a 20 61 20 64  ading.    ** a d
ddd0: 61 74 61 62 61 73 65 20 73 63 68 65 6d 61 29 2e  atabase schema).
dde0: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 76 20 29    */.    if( v )
ddf0: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
de00: 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d 30  db->init.busy==0
de10: 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
de20: 33 56 64 62 65 43 68 61 6e 67 65 4f 70 63 6f 64  3VdbeChangeOpcod
de30: 65 28 76 2c 20 70 50 6b 2d 3e 74 6e 75 6d 2c 20  e(v, pPk->tnum, 
de40: 4f 50 5f 47 6f 74 6f 29 3b 0a 20 20 20 20 7d 0a  OP_Goto);.    }.
de50: 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 52  .    /*.    ** R
de60: 65 6d 6f 76 65 20 61 6c 6c 20 72 65 64 75 6e 64  emove all redund
de70: 61 6e 74 20 63 6f 6c 75 6d 6e 73 20 66 72 6f 6d  ant columns from
de80: 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59   the PRIMARY KEY
de90: 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20  .  For example, 
dea0: 63 68 61 6e 67 65 0a 20 20 20 20 2a 2a 20 22 50  change.    ** "P
deb0: 52 49 4d 41 52 59 20 4b 45 59 28 61 2c 62 2c 61  RIMARY KEY(a,b,a
dec0: 2c 62 2c 63 2c 62 2c 63 2c 64 29 22 20 69 6e 74  ,b,c,b,c,d)" int
ded0: 6f 20 6a 75 73 74 20 22 50 52 49 4d 41 52 59 20  o just "PRIMARY 
dee0: 4b 45 59 28 61 2c 62 2c 63 2c 64 29 22 2e 20 20  KEY(a,b,c,d)".  
def0: 4c 61 74 65 72 0a 20 20 20 20 2a 2a 20 63 6f 64  Later.    ** cod
df00: 65 20 61 73 73 75 6d 65 73 20 74 68 65 20 50 52  e assumes the PR
df10: 49 4d 41 52 59 20 4b 45 59 20 63 6f 6e 74 61 69  IMARY KEY contai
df20: 6e 73 20 6e 6f 20 72 65 70 65 61 74 65 64 20 63  ns no repeated c
df30: 6f 6c 75 6d 6e 73 2e 0a 20 20 20 20 2a 2f 0a 20  olumns..    */. 
df40: 20 20 20 66 6f 72 28 69 3d 6a 3d 31 3b 20 69 3c     for(i=j=1; i<
df50: 70 50 6b 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 69 2b  pPk->nKeyCol; i+
df60: 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 68 61  +){.      if( ha
df70: 73 43 6f 6c 75 6d 6e 28 70 50 6b 2d 3e 61 69 43  sColumn(pPk->aiC
df80: 6f 6c 75 6d 6e 2c 20 6a 2c 20 70 50 6b 2d 3e 61  olumn, j, pPk->a
df90: 69 43 6f 6c 75 6d 6e 5b 69 5d 29 20 29 7b 0a 20  iColumn[i]) ){. 
dfa0: 20 20 20 20 20 20 20 70 50 6b 2d 3e 6e 43 6f 6c         pPk->nCol
dfb0: 75 6d 6e 2d 2d 3b 0a 20 20 20 20 20 20 7d 65 6c  umn--;.      }el
dfc0: 73 65 7b 0a 20 20 20 20 20 20 20 20 70 50 6b 2d  se{.        pPk-
dfd0: 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 2b 2b 5d 20 3d  >aiColumn[j++] =
dfe0: 20 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69   pPk->aiColumn[i
dff0: 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  ];.      }.    }
e000: 0a 20 20 20 20 70 50 6b 2d 3e 6e 4b 65 79 43 6f  .    pPk->nKeyCo
e010: 6c 20 3d 20 6a 3b 0a 20 20 7d 0a 20 20 61 73 73  l = j;.  }.  ass
e020: 65 72 74 28 20 70 50 6b 21 3d 30 20 29 3b 0a 20  ert( pPk!=0 );. 
e030: 20 70 50 6b 2d 3e 69 73 43 6f 76 65 72 69 6e 67   pPk->isCovering
e040: 20 3d 20 31 3b 0a 20 20 69 66 28 20 21 64 62 2d   = 1;.  if( !db-
e050: 3e 69 6e 69 74 2e 69 6d 70 6f 73 74 65 72 54 61  >init.imposterTa
e060: 62 6c 65 20 29 20 70 50 6b 2d 3e 75 6e 69 71 4e  ble ) pPk->uniqN
e070: 6f 74 4e 75 6c 6c 20 3d 20 31 3b 0a 20 20 6e 50  otNull = 1;.  nP
e080: 6b 20 3d 20 70 50 6b 2d 3e 6e 4b 65 79 43 6f 6c  k = pPk->nKeyCol
e090: 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 72 6f 6f 74  ;..  /* The root
e0a0: 20 70 61 67 65 20 6f 66 20 74 68 65 20 50 52 49   page of the PRI
e0b0: 4d 41 52 59 20 4b 45 59 20 69 73 20 74 68 65 20  MARY KEY is the 
e0c0: 74 61 62 6c 65 20 72 6f 6f 74 20 70 61 67 65 20  table root page 
e0d0: 2a 2f 0a 20 20 70 50 6b 2d 3e 74 6e 75 6d 20 3d  */.  pPk->tnum =
e0e0: 20 70 54 61 62 2d 3e 74 6e 75 6d 3b 0a 0a 20 20   pTab->tnum;..  
e0f0: 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20 69 6e  /* Update the in
e100: 2d 6d 65 6d 6f 72 79 20 72 65 70 72 65 73 65 6e  -memory represen
e110: 74 61 74 69 6f 6e 20 6f 66 20 61 6c 6c 20 55 4e  tation of all UN
e120: 49 51 55 45 20 69 6e 64 69 63 65 73 20 62 79 20  IQUE indices by 
e130: 63 6f 6e 76 65 72 74 69 6e 67 0a 20 20 2a 2a 20  converting.  ** 
e140: 74 68 65 20 66 69 6e 61 6c 20 72 6f 77 69 64 20  the final rowid 
e150: 63 6f 6c 75 6d 6e 20 69 6e 74 6f 20 6f 6e 65 20  column into one 
e160: 6f 72 20 6d 6f 72 65 20 63 6f 6c 75 6d 6e 73 20  or more columns 
e170: 6f 66 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b  of the PRIMARY K
e180: 45 59 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 70  EY..  */.  for(p
e190: 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78  Idx=pTab->pIndex
e1a0: 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64  ; pIdx; pIdx=pId
e1b0: 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69  x->pNext){.    i
e1c0: 6e 74 20 6e 3b 0a 20 20 20 20 69 66 28 20 49 73  nt n;.    if( Is
e1d0: 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65 78 28  PrimaryKeyIndex(
e1e0: 70 49 64 78 29 20 29 20 63 6f 6e 74 69 6e 75 65  pIdx) ) continue
e1f0: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 6e 3d 30 3b  ;.    for(i=n=0;
e200: 20 69 3c 6e 50 6b 3b 20 69 2b 2b 29 7b 0a 20 20   i<nPk; i++){.  
e210: 20 20 20 20 69 66 28 20 21 68 61 73 43 6f 6c 75      if( !hasColu
e220: 6d 6e 28 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d  mn(pIdx->aiColum
e230: 6e 2c 20 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c  n, pIdx->nKeyCol
e240: 2c 20 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b  , pPk->aiColumn[
e250: 69 5d 29 20 29 20 6e 2b 2b 3b 0a 20 20 20 20 7d  i]) ) n++;.    }
e260: 0a 20 20 20 20 69 66 28 20 6e 3d 3d 30 20 29 7b  .    if( n==0 ){
e270: 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 69  .      /* This i
e280: 6e 64 65 78 20 69 73 20 61 20 73 75 70 65 72 73  ndex is a supers
e290: 65 74 20 6f 66 20 74 68 65 20 70 72 69 6d 61 72  et of the primar
e2a0: 79 20 6b 65 79 20 2a 2f 0a 20 20 20 20 20 20 70  y key */.      p
e2b0: 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 3d 20 70  Idx->nColumn = p
e2c0: 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 0a 20 20  Idx->nKeyCol;.  
e2d0: 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
e2e0: 20 20 7d 0a 20 20 20 20 69 66 28 20 72 65 73 69    }.    if( resi
e2f0: 7a 65 49 6e 64 65 78 4f 62 6a 65 63 74 28 64 62  zeIndexObject(db
e300: 2c 20 70 49 64 78 2c 20 70 49 64 78 2d 3e 6e 4b  , pIdx, pIdx->nK
e310: 65 79 43 6f 6c 2b 6e 29 20 29 20 72 65 74 75 72  eyCol+n) ) retur
e320: 6e 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 2c 20  n;.    for(i=0, 
e330: 6a 3d 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3b  j=pIdx->nKeyCol;
e340: 20 69 3c 6e 50 6b 3b 20 69 2b 2b 29 7b 0a 20 20   i<nPk; i++){.  
e350: 20 20 20 20 69 66 28 20 21 68 61 73 43 6f 6c 75      if( !hasColu
e360: 6d 6e 28 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d  mn(pIdx->aiColum
e370: 6e 2c 20 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c  n, pIdx->nKeyCol
e380: 2c 20 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b  , pPk->aiColumn[
e390: 69 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70  i]) ){.        p
e3a0: 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d  Idx->aiColumn[j]
e3b0: 20 3d 20 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e   = pPk->aiColumn
e3c0: 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 70 49 64  [i];.        pId
e3d0: 78 2d 3e 61 7a 43 6f 6c 6c 5b 6a 5d 20 3d 20 70  x->azColl[j] = p
e3e0: 50 6b 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 3b 0a 20  Pk->azColl[i];. 
e3f0: 20 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20         j++;.    
e400: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61 73    }.    }.    as
e410: 73 65 72 74 28 20 70 49 64 78 2d 3e 6e 43 6f 6c  sert( pIdx->nCol
e420: 75 6d 6e 3e 3d 70 49 64 78 2d 3e 6e 4b 65 79 43  umn>=pIdx->nKeyC
e430: 6f 6c 2b 6e 20 29 3b 0a 20 20 20 20 61 73 73 65  ol+n );.    asse
e440: 72 74 28 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d  rt( pIdx->nColum
e450: 6e 3e 3d 6a 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f  n>=j );.  }..  /
e460: 2a 20 41 64 64 20 61 6c 6c 20 74 61 62 6c 65 20  * Add all table 
e470: 63 6f 6c 75 6d 6e 73 20 74 6f 20 74 68 65 20 50  columns to the P
e480: 52 49 4d 41 52 59 20 4b 45 59 20 69 6e 64 65 78  RIMARY KEY index
e490: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6e 50 6b 3c  .  */.  if( nPk<
e4a0: 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20  pTab->nCol ){.  
e4b0: 20 20 69 66 28 20 72 65 73 69 7a 65 49 6e 64 65    if( resizeInde
e4c0: 78 4f 62 6a 65 63 74 28 64 62 2c 20 70 50 6b 2c  xObject(db, pPk,
e4d0: 20 70 54 61 62 2d 3e 6e 43 6f 6c 29 20 29 20 72   pTab->nCol) ) r
e4e0: 65 74 75 72 6e 3b 0a 20 20 20 20 66 6f 72 28 69  eturn;.    for(i
e4f0: 3d 30 2c 20 6a 3d 6e 50 6b 3b 20 69 3c 70 54 61  =0, j=nPk; i<pTa
e500: 62 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20  b->nCol; i++){. 
e510: 20 20 20 20 20 69 66 28 20 21 68 61 73 43 6f 6c       if( !hasCol
e520: 75 6d 6e 28 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d  umn(pPk->aiColum
e530: 6e 2c 20 6a 2c 20 69 29 20 29 7b 0a 20 20 20 20  n, j, i) ){.    
e540: 20 20 20 20 61 73 73 65 72 74 28 20 6a 3c 70 50      assert( j<pP
e550: 6b 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20  k->nColumn );.  
e560: 20 20 20 20 20 20 70 50 6b 2d 3e 61 69 43 6f 6c        pPk->aiCol
e570: 75 6d 6e 5b 6a 5d 20 3d 20 69 3b 0a 20 20 20 20  umn[j] = i;.    
e580: 20 20 20 20 70 50 6b 2d 3e 61 7a 43 6f 6c 6c 5b      pPk->azColl[
e590: 6a 5d 20 3d 20 73 71 6c 69 74 65 33 53 74 72 42  j] = sqlite3StrB
e5a0: 49 4e 41 52 59 3b 0a 20 20 20 20 20 20 20 20 6a  INARY;.        j
e5b0: 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ++;.      }.    
e5c0: 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  }.    assert( pP
e5d0: 6b 2d 3e 6e 43 6f 6c 75 6d 6e 3d 3d 6a 20 29 3b  k->nColumn==j );
e5e0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 54 61  .    assert( pTa
e5f0: 62 2d 3e 6e 43 6f 6c 3d 3d 6a 20 29 3b 0a 20 20  b->nCol==j );.  
e600: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 6b 2d 3e  }else{.    pPk->
e610: 6e 43 6f 6c 75 6d 6e 20 3d 20 70 54 61 62 2d 3e  nColumn = pTab->
e620: 6e 43 6f 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  nCol;.  }.}../*.
e630: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
e640: 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 72 65 70  is called to rep
e650: 6f 72 74 20 74 68 65 20 66 69 6e 61 6c 20 22 29  ort the final ")
e660: 22 20 74 68 61 74 20 74 65 72 6d 69 6e 61 74 65  " that terminate
e670: 73 0a 2a 2a 20 61 20 43 52 45 41 54 45 20 54 41  s.** a CREATE TA
e680: 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a  BLE statement..*
e690: 2a 0a 2a 2a 20 54 68 65 20 74 61 62 6c 65 20 73  *.** The table s
e6a0: 74 72 75 63 74 75 72 65 20 74 68 61 74 20 6f 74  tructure that ot
e6b0: 68 65 72 20 61 63 74 69 6f 6e 20 72 6f 75 74 69  her action routi
e6c0: 6e 65 73 20 68 61 76 65 20 62 65 65 6e 20 62 75  nes have been bu
e6d0: 69 6c 64 69 6e 67 0a 2a 2a 20 69 73 20 61 64 64  ilding.** is add
e6e0: 65 64 20 74 6f 20 74 68 65 20 69 6e 74 65 72 6e  ed to the intern
e6f0: 61 6c 20 68 61 73 68 20 74 61 62 6c 65 73 2c 20  al hash tables, 
e700: 61 73 73 75 6d 69 6e 67 20 6e 6f 20 65 72 72 6f  assuming no erro
e710: 72 73 20 68 61 76 65 0a 2a 2a 20 6f 63 63 75 72  rs have.** occur
e720: 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 6e  red..**.** An en
e730: 74 72 79 20 66 6f 72 20 74 68 65 20 74 61 62 6c  try for the tabl
e740: 65 20 69 73 20 6d 61 64 65 20 69 6e 20 74 68 65  e is made in the
e750: 20 6d 61 73 74 65 72 20 74 61 62 6c 65 20 6f 6e   master table on
e760: 20 64 69 73 6b 2c 20 75 6e 6c 65 73 73 0a 2a 2a   disk, unless.**
e770: 20 74 68 69 73 20 69 73 20 61 20 74 65 6d 70 6f   this is a tempo
e780: 72 61 72 79 20 74 61 62 6c 65 20 6f 72 20 64 62  rary table or db
e790: 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d 31 2e 20  ->init.busy==1. 
e7a0: 20 57 68 65 6e 20 64 62 2d 3e 69 6e 69 74 2e 62   When db->init.b
e7b0: 75 73 79 3d 3d 31 0a 2a 2a 20 69 74 20 6d 65 61  usy==1.** it mea
e7c0: 6e 73 20 77 65 20 61 72 65 20 72 65 61 64 69 6e  ns we are readin
e7d0: 67 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73  g the sqlite_mas
e7e0: 74 65 72 20 74 61 62 6c 65 20 62 65 63 61 75 73  ter table becaus
e7f0: 65 20 77 65 20 6a 75 73 74 0a 2a 2a 20 63 6f 6e  e we just.** con
e800: 6e 65 63 74 65 64 20 74 6f 20 74 68 65 20 64 61  nected to the da
e810: 74 61 62 61 73 65 20 6f 72 20 62 65 63 61 75 73  tabase or becaus
e820: 65 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73  e the sqlite_mas
e830: 74 65 72 20 74 61 62 6c 65 20 68 61 73 0a 2a 2a  ter table has.**
e840: 20 72 65 63 65 6e 74 6c 79 20 63 68 61 6e 67 65   recently change
e850: 64 2c 20 73 6f 20 74 68 65 20 65 6e 74 72 79 20  d, so the entry 
e860: 66 6f 72 20 74 68 69 73 20 74 61 62 6c 65 20 61  for this table a
e870: 6c 72 65 61 64 79 20 65 78 69 73 74 73 20 69 6e  lready exists in
e880: 0a 2a 2a 20 74 68 65 20 73 71 6c 69 74 65 5f 6d  .** the sqlite_m
e890: 61 73 74 65 72 20 74 61 62 6c 65 2e 20 20 57 65  aster table.  We
e8a0: 20 64 6f 20 6e 6f 74 20 77 61 6e 74 20 74 6f 20   do not want to 
e8b0: 63 72 65 61 74 65 20 69 74 20 61 67 61 69 6e 2e  create it again.
e8c0: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 53  .**.** If the pS
e8d0: 65 6c 65 63 74 20 61 72 67 75 6d 65 6e 74 20 69  elect argument i
e8e0: 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 69 74 20 6d  s not NULL, it m
e8f0: 65 61 6e 73 20 74 68 61 74 20 74 68 69 73 20 72  eans that this r
e900: 6f 75 74 69 6e 65 0a 2a 2a 20 77 61 73 20 63 61  outine.** was ca
e910: 6c 6c 65 64 20 74 6f 20 63 72 65 61 74 65 20 61  lled to create a
e920: 20 74 61 62 6c 65 20 67 65 6e 65 72 61 74 65 64   table generated
e930: 20 66 72 6f 6d 20 61 20 0a 2a 2a 20 22 43 52 45   from a .** "CRE
e940: 41 54 45 20 54 41 42 4c 45 20 2e 2e 2e 20 41 53  ATE TABLE ... AS
e950: 20 53 45 4c 45 43 54 20 2e 2e 2e 22 20 73 74 61   SELECT ..." sta
e960: 74 65 6d 65 6e 74 2e 20 20 54 68 65 20 63 6f 6c  tement.  The col
e970: 75 6d 6e 20 6e 61 6d 65 73 20 6f 66 0a 2a 2a 20  umn names of.** 
e980: 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20 77 69  the new table wi
e990: 6c 6c 20 6d 61 74 63 68 20 74 68 65 20 72 65 73  ll match the res
e9a0: 75 6c 74 20 73 65 74 20 6f 66 20 74 68 65 20 53  ult set of the S
e9b0: 45 4c 45 43 54 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ELECT..*/.void s
e9c0: 71 6c 69 74 65 33 45 6e 64 54 61 62 6c 65 28 0a  qlite3EndTable(.
e9d0: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
e9e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72            /* Par
e9f0: 73 65 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  se context */.  
ea00: 54 6f 6b 65 6e 20 2a 70 43 6f 6e 73 2c 20 20 20  Token *pCons,   
ea10: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 27          /* The '
ea20: 2c 27 20 74 6f 6b 65 6e 20 61 66 74 65 72 20 74  ,' token after t
ea30: 68 65 20 6c 61 73 74 20 63 6f 6c 75 6d 6e 20 64  he last column d
ea40: 65 66 6e 2e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  efn. */.  Token 
ea50: 2a 70 45 6e 64 2c 20 20 20 20 20 20 20 20 20 20  *pEnd,          
ea60: 20 20 2f 2a 20 54 68 65 20 27 29 27 20 62 65 66    /* The ')' bef
ea70: 6f 72 65 20 6f 70 74 69 6f 6e 73 20 69 6e 20 74  ore options in t
ea80: 68 65 20 43 52 45 41 54 45 20 54 41 42 4c 45 20  he CREATE TABLE 
ea90: 2a 2f 0a 20 20 75 38 20 74 61 62 4f 70 74 73 2c  */.  u8 tabOpts,
eaa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
eab0: 45 78 74 72 61 20 74 61 62 6c 65 20 6f 70 74 69  Extra table opti
eac0: 6f 6e 73 2e 20 55 73 75 61 6c 6c 79 20 30 2e 20  ons. Usually 0. 
ead0: 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65  */.  Select *pSe
eae0: 6c 65 63 74 20 20 20 20 20 20 20 20 20 2f 2a 20  lect         /* 
eaf0: 53 65 6c 65 63 74 20 66 72 6f 6d 20 61 20 22 43  Select from a "C
eb00: 52 45 41 54 45 20 2e 2e 2e 20 41 53 20 53 45 4c  REATE ... AS SEL
eb10: 45 43 54 22 20 2a 2f 0a 29 7b 0a 20 20 54 61 62  ECT" */.){.  Tab
eb20: 6c 65 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20  le *p;          
eb30: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 65         /* The ne
eb40: 77 20 74 61 62 6c 65 20 2a 2f 0a 20 20 73 71 6c  w table */.  sql
eb50: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
eb60: 65 2d 3e 64 62 3b 20 2f 2a 20 54 68 65 20 64 61  e->db; /* The da
eb70: 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
eb80: 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62 3b 20  n */.  int iDb; 
eb90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
eba0: 20 2f 2a 20 44 61 74 61 62 61 73 65 20 69 6e 20   /* Database in 
ebb0: 77 68 69 63 68 20 74 68 65 20 74 61 62 6c 65 20  which the table 
ebc0: 6c 69 76 65 73 20 2a 2f 0a 20 20 49 6e 64 65 78  lives */.  Index
ebd0: 20 2a 70 49 64 78 3b 20 20 20 20 20 20 20 20 20   *pIdx;         
ebe0: 20 20 20 20 20 2f 2a 20 41 6e 20 69 6d 70 6c 69       /* An impli
ebf0: 65 64 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20  ed index of the 
ec00: 74 61 62 6c 65 20 2a 2f 0a 0a 20 20 69 66 28 20  table */..  if( 
ec10: 70 45 6e 64 3d 3d 30 20 26 26 20 70 53 65 6c 65  pEnd==0 && pSele
ec20: 63 74 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  ct==0 ){.    ret
ec30: 75 72 6e 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  urn;.  }.  asser
ec40: 74 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  t( !db->mallocFa
ec50: 69 6c 65 64 20 29 3b 0a 20 20 70 20 3d 20 70 50  iled );.  p = pP
ec60: 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b  arse->pNewTable;
ec70: 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65  .  if( p==0 ) re
ec80: 74 75 72 6e 3b 0a 0a 20 20 61 73 73 65 72 74 28  turn;..  assert(
ec90: 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20   !db->init.busy 
eca0: 7c 7c 20 21 70 53 65 6c 65 63 74 20 29 3b 0a 0a  || !pSelect );..
ecb0: 20 20 2f 2a 20 49 66 20 74 68 65 20 64 62 2d 3e    /* If the db->
ecc0: 69 6e 69 74 2e 62 75 73 79 20 69 73 20 31 20 69  init.busy is 1 i
ecd0: 74 20 6d 65 61 6e 73 20 77 65 20 61 72 65 20 72  t means we are r
ece0: 65 61 64 69 6e 67 20 74 68 65 20 53 51 4c 20 6f  eading the SQL o
ecf0: 66 66 20 74 68 65 0a 20 20 2a 2a 20 22 73 71 6c  ff the.  ** "sql
ed00: 69 74 65 5f 6d 61 73 74 65 72 22 20 6f 72 20 22  ite_master" or "
ed10: 73 71 6c 69 74 65 5f 74 65 6d 70 5f 6d 61 73 74  sqlite_temp_mast
ed20: 65 72 22 20 74 61 62 6c 65 20 6f 6e 20 74 68 65  er" table on the
ed30: 20 64 69 73 6b 2e 0a 20 20 2a 2a 20 53 6f 20 64   disk..  ** So d
ed40: 6f 20 6e 6f 74 20 77 72 69 74 65 20 74 6f 20 74  o not write to t
ed50: 68 65 20 64 69 73 6b 20 61 67 61 69 6e 2e 20 20  he disk again.  
ed60: 45 78 74 72 61 63 74 20 74 68 65 20 72 6f 6f 74  Extract the root
ed70: 20 70 61 67 65 20 6e 75 6d 62 65 72 0a 20 20 2a   page number.  *
ed80: 2a 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20  * for the table 
ed90: 66 72 6f 6d 20 74 68 65 20 64 62 2d 3e 69 6e 69  from the db->ini
eda0: 74 2e 6e 65 77 54 6e 75 6d 20 66 69 65 6c 64 2e  t.newTnum field.
edb0: 20 20 28 54 68 65 20 70 61 67 65 20 6e 75 6d 62    (The page numb
edc0: 65 72 0a 20 20 2a 2a 20 73 68 6f 75 6c 64 20 68  er.  ** should h
edd0: 61 76 65 20 62 65 65 6e 20 70 75 74 20 74 68 65  ave been put the
ede0: 72 65 20 62 79 20 74 68 65 20 73 71 6c 69 74 65  re by the sqlite
edf0: 4f 70 65 6e 43 62 20 72 6f 75 74 69 6e 65 2e 29  OpenCb routine.)
ee00: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68  .  **.  ** If th
ee10: 65 20 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62  e root page numb
ee20: 65 72 20 69 73 20 31 2c 20 74 68 61 74 20 6d 65  er is 1, that me
ee30: 61 6e 73 20 74 68 69 73 20 69 73 20 74 68 65 20  ans this is the 
ee40: 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 0a 20 20  sqlite_master.  
ee50: 2a 2a 20 74 61 62 6c 65 20 69 74 73 65 6c 66 2e  ** table itself.
ee60: 20 20 53 6f 20 6d 61 72 6b 20 69 74 20 72 65 61    So mark it rea
ee70: 64 2d 6f 6e 6c 79 2e 0a 20 20 2a 2f 0a 20 20 69  d-only..  */.  i
ee80: 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  f( db->init.busy
ee90: 20 29 7b 0a 20 20 20 20 70 2d 3e 74 6e 75 6d 20   ){.    p->tnum 
eea0: 3d 20 64 62 2d 3e 69 6e 69 74 2e 6e 65 77 54 6e  = db->init.newTn
eeb0: 75 6d 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 74  um;.    if( p->t
eec0: 6e 75 6d 3d 3d 31 20 29 20 70 2d 3e 74 61 62 46  num==1 ) p->tabF
eed0: 6c 61 67 73 20 7c 3d 20 54 46 5f 52 65 61 64 6f  lags |= TF_Reado
eee0: 6e 6c 79 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53  nly;.  }..  /* S
eef0: 70 65 63 69 61 6c 20 70 72 6f 63 65 73 73 69 6e  pecial processin
ef00: 67 20 66 6f 72 20 57 49 54 48 4f 55 54 20 52 4f  g for WITHOUT RO
ef10: 57 49 44 20 54 61 62 6c 65 73 20 2a 2f 0a 20 20  WID Tables */.  
ef20: 69 66 28 20 74 61 62 4f 70 74 73 20 26 20 54 46  if( tabOpts & TF
ef30: 5f 57 69 74 68 6f 75 74 52 6f 77 69 64 20 29 7b  _WithoutRowid ){
ef40: 0a 20 20 20 20 69 66 28 20 28 70 2d 3e 74 61 62  .    if( (p->tab
ef50: 46 6c 61 67 73 20 26 20 54 46 5f 41 75 74 6f 69  Flags & TF_Autoi
ef60: 6e 63 72 65 6d 65 6e 74 29 20 29 7b 0a 20 20 20  ncrement) ){.   
ef70: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
ef80: 73 67 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20  sg(pParse,.     
ef90: 20 20 20 20 20 22 41 55 54 4f 49 4e 43 52 45 4d       "AUTOINCREM
efa0: 45 4e 54 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 20  ENT not allowed 
efb0: 6f 6e 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44  on WITHOUT ROWID
efc0: 20 74 61 62 6c 65 73 22 29 3b 0a 20 20 20 20 20   tables");.     
efd0: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20   return;.    }. 
efe0: 20 20 20 69 66 28 20 28 70 2d 3e 74 61 62 46 6c     if( (p->tabFl
eff0: 61 67 73 20 26 20 54 46 5f 48 61 73 50 72 69 6d  ags & TF_HasPrim
f000: 61 72 79 4b 65 79 29 3d 3d 30 20 29 7b 0a 20 20  aryKey)==0 ){.  
f010: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
f020: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 50 52 49  Msg(pParse, "PRI
f030: 4d 41 52 59 20 4b 45 59 20 6d 69 73 73 69 6e 67  MARY KEY missing
f040: 20 6f 6e 20 74 61 62 6c 65 20 25 73 22 2c 20 70   on table %s", p
f050: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 65  ->zName);.    }e
f060: 6c 73 65 7b 0a 20 20 20 20 20 20 70 2d 3e 74 61  lse{.      p->ta
f070: 62 46 6c 61 67 73 20 7c 3d 20 54 46 5f 57 69 74  bFlags |= TF_Wit
f080: 68 6f 75 74 52 6f 77 69 64 20 7c 20 54 46 5f 4e  houtRowid | TF_N
f090: 6f 56 69 73 69 62 6c 65 52 6f 77 69 64 3b 0a 20  oVisibleRowid;. 
f0a0: 20 20 20 20 20 63 6f 6e 76 65 72 74 54 6f 57 69       convertToWi
f0b0: 74 68 6f 75 74 52 6f 77 69 64 54 61 62 6c 65 28  thoutRowidTable(
f0c0: 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 20 20  pParse, p);.    
f0d0: 7d 0a 20 20 7d 0a 0a 20 20 69 44 62 20 3d 20 73  }.  }..  iDb = s
f0e0: 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e  qlite3SchemaToIn
f0f0: 64 65 78 28 64 62 2c 20 70 2d 3e 70 53 63 68 65  dex(db, p->pSche
f100: 6d 61 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51  ma);..#ifndef SQ
f110: 4c 49 54 45 5f 4f 4d 49 54 5f 43 48 45 43 4b 0a  LITE_OMIT_CHECK.
f120: 20 20 2f 2a 20 52 65 73 6f 6c 76 65 20 6e 61 6d    /* Resolve nam
f130: 65 73 20 69 6e 20 61 6c 6c 20 43 48 45 43 4b 20  es in all CHECK 
f140: 63 6f 6e 73 74 72 61 69 6e 74 20 65 78 70 72 65  constraint expre
f150: 73 73 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69  ssions..  */.  i
f160: 66 28 20 70 2d 3e 70 43 68 65 63 6b 20 29 7b 0a  f( p->pCheck ){.
f170: 20 20 20 20 73 71 6c 69 74 65 33 52 65 73 6f 6c      sqlite3Resol
f180: 76 65 53 65 6c 66 52 65 66 65 72 65 6e 63 65 28  veSelfReference(
f190: 70 50 61 72 73 65 2c 20 70 2c 20 4e 43 5f 49 73  pParse, p, NC_Is
f1a0: 43 68 65 63 6b 2c 20 30 2c 20 70 2d 3e 70 43 68  Check, 0, p->pCh
f1b0: 65 63 6b 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  eck);.  }.#endif
f1c0: 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c   /* !defined(SQL
f1d0: 49 54 45 5f 4f 4d 49 54 5f 43 48 45 43 4b 29 20  ITE_OMIT_CHECK) 
f1e0: 2a 2f 0a 0a 20 20 2f 2a 20 45 73 74 69 6d 61 74  */..  /* Estimat
f1f0: 65 20 74 68 65 20 61 76 65 72 61 67 65 20 72 6f  e the average ro
f200: 77 20 73 69 7a 65 20 66 6f 72 20 74 68 65 20 74  w size for the t
f210: 61 62 6c 65 20 61 6e 64 20 66 6f 72 20 61 6c 6c  able and for all
f220: 20 69 6d 70 6c 69 65 64 20 69 6e 64 69 63 65 73   implied indices
f230: 20 2a 2f 0a 20 20 65 73 74 69 6d 61 74 65 54 61   */.  estimateTa
f240: 62 6c 65 57 69 64 74 68 28 70 29 3b 0a 20 20 66  bleWidth(p);.  f
f250: 6f 72 28 70 49 64 78 3d 70 2d 3e 70 49 6e 64 65  or(pIdx=p->pInde
f260: 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49  x; pIdx; pIdx=pI
f270: 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  dx->pNext){.    
f280: 65 73 74 69 6d 61 74 65 49 6e 64 65 78 57 69 64  estimateIndexWid
f290: 74 68 28 70 49 64 78 29 3b 0a 20 20 7d 0a 0a 20  th(pIdx);.  }.. 
f2a0: 20 2f 2a 20 49 66 20 6e 6f 74 20 69 6e 69 74 69   /* If not initi
f2b0: 61 6c 69 7a 69 6e 67 2c 20 74 68 65 6e 20 63 72  alizing, then cr
f2c0: 65 61 74 65 20 61 20 72 65 63 6f 72 64 20 66 6f  eate a record fo
f2d0: 72 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 0a  r the new table.
f2e0: 20 20 2a 2a 20 69 6e 20 74 68 65 20 53 51 4c 49    ** in the SQLI
f2f0: 54 45 5f 4d 41 53 54 45 52 20 74 61 62 6c 65 20  TE_MASTER table 
f300: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  of the database.
f310: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68  .  **.  ** If th
f320: 69 73 20 69 73 20 61 20 54 45 4d 50 4f 52 41 52  is is a TEMPORAR
f330: 59 20 74 61 62 6c 65 2c 20 77 72 69 74 65 20 74  Y table, write t
f340: 68 65 20 65 6e 74 72 79 20 69 6e 74 6f 20 74 68  he entry into th
f350: 65 20 61 75 78 69 6c 69 61 72 79 0a 20 20 2a 2a  e auxiliary.  **
f360: 20 66 69 6c 65 20 69 6e 73 74 65 61 64 20 6f 66   file instead of
f370: 20 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20 64   into the main d
f380: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20  atabase file..  
f390: 2a 2f 0a 20 20 69 66 28 20 21 64 62 2d 3e 69 6e  */.  if( !db->in
f3a0: 69 74 2e 62 75 73 79 20 29 7b 0a 20 20 20 20 69  it.busy ){.    i
f3b0: 6e 74 20 6e 3b 0a 20 20 20 20 56 64 62 65 20 2a  nt n;.    Vdbe *
f3c0: 76 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 54 79  v;.    char *zTy
f3d0: 70 65 3b 20 20 20 20 2f 2a 20 22 76 69 65 77 22  pe;    /* "view"
f3e0: 20 6f 72 20 22 74 61 62 6c 65 22 20 2a 2f 0a 20   or "table" */. 
f3f0: 20 20 20 63 68 61 72 20 2a 7a 54 79 70 65 32 3b     char *zType2;
f400: 20 20 20 2f 2a 20 22 56 49 45 57 22 20 6f 72 20     /* "VIEW" or 
f410: 22 54 41 42 4c 45 22 20 2a 2f 0a 20 20 20 20 63  "TABLE" */.    c
f420: 68 61 72 20 2a 7a 53 74 6d 74 3b 20 20 20 20 2f  har *zStmt;    /
f430: 2a 20 54 65 78 74 20 6f 66 20 74 68 65 20 43 52  * Text of the CR
f440: 45 41 54 45 20 54 41 42 4c 45 20 6f 72 20 43 52  EATE TABLE or CR
f450: 45 41 54 45 20 56 49 45 57 20 73 74 61 74 65 6d  EATE VIEW statem
f460: 65 6e 74 20 2a 2f 0a 0a 20 20 20 20 76 20 3d 20  ent */..    v = 
f470: 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
f480: 50 61 72 73 65 29 3b 0a 20 20 20 20 69 66 28 20  Parse);.    if( 
f490: 4e 45 56 45 52 28 76 3d 3d 30 29 20 29 20 72 65  NEVER(v==0) ) re
f4a0: 74 75 72 6e 3b 0a 0a 20 20 20 20 73 71 6c 69 74  turn;..    sqlit
f4b0: 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
f4c0: 4f 50 5f 43 6c 6f 73 65 2c 20 30 29 3b 0a 0a 20  OP_Close, 0);.. 
f4d0: 20 20 20 2f 2a 20 0a 20 20 20 20 2a 2a 20 49 6e     /* .    ** In
f4e0: 69 74 69 61 6c 69 7a 65 20 7a 54 79 70 65 20 66  itialize zType f
f4f0: 6f 72 20 74 68 65 20 6e 65 77 20 76 69 65 77 20  or the new view 
f500: 6f 72 20 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2f  or table..    */
f510: 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 53 65 6c  .    if( p->pSel
f520: 65 63 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ect==0 ){.      
f530: 2f 2a 20 41 20 72 65 67 75 6c 61 72 20 74 61 62  /* A regular tab
f540: 6c 65 20 2a 2f 0a 20 20 20 20 20 20 7a 54 79 70  le */.      zTyp
f550: 65 20 3d 20 22 74 61 62 6c 65 22 3b 0a 20 20 20  e = "table";.   
f560: 20 20 20 7a 54 79 70 65 32 20 3d 20 22 54 41 42     zType2 = "TAB
f570: 4c 45 22 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  LE";.#ifndef SQL
f580: 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 20 20  ITE_OMIT_VIEW.  
f590: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f    }else{.      /
f5a0: 2a 20 41 20 76 69 65 77 20 2a 2f 0a 20 20 20 20  * A view */.    
f5b0: 20 20 7a 54 79 70 65 20 3d 20 22 76 69 65 77 22    zType = "view"
f5c0: 3b 0a 20 20 20 20 20 20 7a 54 79 70 65 32 20 3d  ;.      zType2 =
f5d0: 20 22 56 49 45 57 22 3b 0a 23 65 6e 64 69 66 0a   "VIEW";.#endif.
f5e0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66      }..    /* If
f5f0: 20 74 68 69 73 20 69 73 20 61 20 43 52 45 41 54   this is a CREAT
f600: 45 20 54 41 42 4c 45 20 78 78 20 41 53 20 53 45  E TABLE xx AS SE
f610: 4c 45 43 54 20 2e 2e 2e 2c 20 65 78 65 63 75 74  LECT ..., execut
f620: 65 20 74 68 65 20 53 45 4c 45 43 54 0a 20 20 20  e the SELECT.   
f630: 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 74 6f   ** statement to
f640: 20 70 6f 70 75 6c 61 74 65 20 74 68 65 20 6e 65   populate the ne
f650: 77 20 74 61 62 6c 65 2e 20 54 68 65 20 72 6f 6f  w table. The roo
f660: 74 2d 70 61 67 65 20 6e 75 6d 62 65 72 20 66 6f  t-page number fo
f670: 72 20 74 68 65 0a 20 20 20 20 2a 2a 20 6e 65 77  r the.    ** new
f680: 20 74 61 62 6c 65 20 69 73 20 69 6e 20 72 65 67   table is in reg
f690: 69 73 74 65 72 20 70 50 61 72 73 65 2d 3e 72 65  ister pParse->re
f6a0: 67 52 6f 6f 74 2e 0a 20 20 20 20 2a 2a 0a 20 20  gRoot..    **.  
f6b0: 20 20 2a 2a 20 4f 6e 63 65 20 74 68 65 20 53 45    ** Once the SE
f6c0: 4c 45 43 54 20 68 61 73 20 62 65 65 6e 20 63 6f  LECT has been co
f6d0: 64 65 64 20 62 79 20 73 71 6c 69 74 65 33 53 65  ded by sqlite3Se
f6e0: 6c 65 63 74 28 29 2c 20 69 74 20 69 73 20 69 6e  lect(), it is in
f6f0: 20 61 0a 20 20 20 20 2a 2a 20 73 75 69 74 61 62   a.    ** suitab
f700: 6c 65 20 73 74 61 74 65 20 74 6f 20 71 75 65 72  le state to quer
f710: 79 20 66 6f 72 20 74 68 65 20 63 6f 6c 75 6d 6e  y for the column
f720: 20 6e 61 6d 65 73 20 61 6e 64 20 74 79 70 65 73   names and types
f730: 20 74 6f 20 62 65 20 75 73 65 64 0a 20 20 20 20   to be used.    
f740: 2a 2a 20 62 79 20 74 68 65 20 6e 65 77 20 74 61  ** by the new ta
f750: 62 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ble..    **.    
f760: 2a 2a 20 41 20 73 68 61 72 65 64 2d 63 61 63 68  ** A shared-cach
f770: 65 20 77 72 69 74 65 2d 6c 6f 63 6b 20 69 73 20  e write-lock is 
f780: 6e 6f 74 20 72 65 71 75 69 72 65 64 20 74 6f 20  not required to 
f790: 77 72 69 74 65 20 74 6f 20 74 68 65 20 6e 65 77  write to the new
f7a0: 20 74 61 62 6c 65 2c 0a 20 20 20 20 2a 2a 20 61   table,.    ** a
f7b0: 73 20 61 20 73 63 68 65 6d 61 2d 6c 6f 63 6b 20  s a schema-lock 
f7c0: 6d 75 73 74 20 68 61 76 65 20 61 6c 72 65 61 64  must have alread
f7d0: 79 20 62 65 65 6e 20 6f 62 74 61 69 6e 65 64 20  y been obtained 
f7e0: 74 6f 20 63 72 65 61 74 65 20 69 74 2e 20 53 69  to create it. Si
f7f0: 6e 63 65 0a 20 20 20 20 2a 2a 20 61 20 73 63 68  nce.    ** a sch
f800: 65 6d 61 2d 6c 6f 63 6b 20 65 78 63 6c 75 64 65  ema-lock exclude
f810: 73 20 61 6c 6c 20 6f 74 68 65 72 20 64 61 74 61  s all other data
f820: 62 61 73 65 20 75 73 65 72 73 2c 20 74 68 65 20  base users, the 
f830: 77 72 69 74 65 2d 6c 6f 63 6b 20 77 6f 75 6c 64  write-lock would
f840: 0a 20 20 20 20 2a 2a 20 62 65 20 72 65 64 75 6e  .    ** be redun
f850: 64 61 6e 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  dant..    */.   
f860: 20 69 66 28 20 70 53 65 6c 65 63 74 20 29 7b 0a   if( pSelect ){.
f870: 20 20 20 20 20 20 53 65 6c 65 63 74 44 65 73 74        SelectDest
f880: 20 64 65 73 74 3b 20 20 20 20 2f 2a 20 57 68 65   dest;    /* Whe
f890: 72 65 20 74 68 65 20 53 45 4c 45 43 54 20 73 68  re the SELECT sh
f8a0: 6f 75 6c 64 20 73 74 6f 72 65 20 72 65 73 75 6c  ould store resul
f8b0: 74 73 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  ts */.      int 
f8c0: 72 65 67 59 69 65 6c 64 3b 20 20 20 20 20 20 20  regYield;       
f8d0: 2f 2a 20 52 65 67 69 73 74 65 72 20 68 6f 6c 64  /* Register hold
f8e0: 69 6e 67 20 63 6f 2d 72 6f 75 74 69 6e 65 20 65  ing co-routine e
f8f0: 6e 74 72 79 2d 70 6f 69 6e 74 20 2a 2f 0a 20 20  ntry-point */.  
f900: 20 20 20 20 69 6e 74 20 61 64 64 72 54 6f 70 3b      int addrTop;
f910: 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 70 20 6f          /* Top o
f920: 66 20 74 68 65 20 63 6f 2d 72 6f 75 74 69 6e 65  f the co-routine
f930: 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 72 65   */.      int re
f940: 67 52 65 63 3b 20 20 20 20 20 20 20 20 20 2f 2a  gRec;         /*
f950: 20 41 20 72 65 63 6f 72 64 20 74 6f 20 62 65 20   A record to be 
f960: 69 6e 73 65 72 74 20 69 6e 74 6f 20 74 68 65 20  insert into the 
f970: 6e 65 77 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20  new table */.   
f980: 20 20 20 69 6e 74 20 72 65 67 52 6f 77 69 64 3b     int regRowid;
f990: 20 20 20 20 20 20 20 2f 2a 20 52 6f 77 69 64 20         /* Rowid 
f9a0: 6f 66 20 74 68 65 20 6e 65 78 74 20 72 6f 77 20  of the next row 
f9b0: 74 6f 20 69 6e 73 65 72 74 20 2a 2f 0a 20 20 20  to insert */.   
f9c0: 20 20 20 69 6e 74 20 61 64 64 72 49 6e 73 4c 6f     int addrInsLo
f9d0: 6f 70 3b 20 20 20 20 2f 2a 20 54 6f 70 20 6f 66  op;    /* Top of
f9e0: 20 74 68 65 20 6c 6f 6f 70 20 66 6f 72 20 69 6e   the loop for in
f9f0: 73 65 72 74 69 6e 67 20 72 6f 77 73 20 2a 2f 0a  serting rows */.
fa00: 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70 53 65        Table *pSe
fa10: 6c 54 61 62 3b 20 20 20 20 20 2f 2a 20 41 20 74  lTab;     /* A t
fa20: 61 62 6c 65 20 74 68 61 74 20 64 65 73 63 72 69  able that descri
fa30: 62 65 73 20 74 68 65 20 53 45 4c 45 43 54 20 72  bes the SELECT r
fa40: 65 73 75 6c 74 73 20 2a 2f 0a 0a 20 20 20 20 20  esults */..     
fa50: 20 72 65 67 59 69 65 6c 64 20 3d 20 2b 2b 70 50   regYield = ++pP
fa60: 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
fa70: 20 20 72 65 67 52 65 63 20 3d 20 2b 2b 70 50 61    regRec = ++pPa
fa80: 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20  rse->nMem;.     
fa90: 20 72 65 67 52 6f 77 69 64 20 3d 20 2b 2b 70 50   regRowid = ++pP
faa0: 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
fab0: 20 20 61 73 73 65 72 74 28 70 50 61 72 73 65 2d    assert(pParse-
fac0: 3e 6e 54 61 62 3d 3d 31 29 3b 0a 20 20 20 20 20  >nTab==1);.     
fad0: 20 73 71 6c 69 74 65 33 4d 61 79 41 62 6f 72 74   sqlite3MayAbort
fae0: 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
faf0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
fb00: 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 57 72 69 74  3(v, OP_OpenWrit
fb10: 65 2c 20 31 2c 20 70 50 61 72 73 65 2d 3e 72 65  e, 1, pParse->re
fb20: 67 52 6f 6f 74 2c 20 69 44 62 29 3b 0a 20 20 20  gRoot, iDb);.   
fb30: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
fb40: 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47  angeP5(v, OPFLAG
fb50: 5f 50 32 49 53 52 45 47 29 3b 0a 20 20 20 20 20  _P2ISREG);.     
fb60: 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 20 3d 20   pParse->nTab = 
fb70: 32 3b 0a 20 20 20 20 20 20 61 64 64 72 54 6f 70  2;.      addrTop
fb80: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75   = sqlite3VdbeCu
fb90: 72 72 65 6e 74 41 64 64 72 28 76 29 20 2b 20 31  rrentAddr(v) + 1
fba0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
fbb0: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
fbc0: 49 6e 69 74 43 6f 72 6f 75 74 69 6e 65 2c 20 72  InitCoroutine, r
fbd0: 65 67 59 69 65 6c 64 2c 20 30 2c 20 61 64 64 72  egYield, 0, addr
fbe0: 54 6f 70 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  Top);.      sqli
fbf0: 74 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69  te3SelectDestIni
fc00: 74 28 26 64 65 73 74 2c 20 53 52 54 5f 43 6f 72  t(&dest, SRT_Cor
fc10: 6f 75 74 69 6e 65 2c 20 72 65 67 59 69 65 6c 64  outine, regYield
fc20: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
fc30: 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  Select(pParse, p
fc40: 53 65 6c 65 63 74 2c 20 26 64 65 73 74 29 3b 0a  Select, &dest);.
fc50: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
fc60: 65 45 6e 64 43 6f 72 6f 75 74 69 6e 65 28 76 2c  eEndCoroutine(v,
fc70: 20 72 65 67 59 69 65 6c 64 29 3b 0a 20 20 20 20   regYield);.    
fc80: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
fc90: 70 48 65 72 65 28 76 2c 20 61 64 64 72 54 6f 70  pHere(v, addrTop
fca0: 20 2d 20 31 29 3b 0a 20 20 20 20 20 20 69 66 28   - 1);.      if(
fcb0: 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 20   pParse->nErr ) 
fcc0: 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 70 53  return;.      pS
fcd0: 65 6c 54 61 62 20 3d 20 73 71 6c 69 74 65 33 52  elTab = sqlite3R
fce0: 65 73 75 6c 74 53 65 74 4f 66 53 65 6c 65 63 74  esultSetOfSelect
fcf0: 28 70 50 61 72 73 65 2c 20 70 53 65 6c 65 63 74  (pParse, pSelect
fd00: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53 65  );.      if( pSe
fd10: 6c 54 61 62 3d 3d 30 20 29 20 72 65 74 75 72 6e  lTab==0 ) return
fd20: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
fd30: 70 2d 3e 61 43 6f 6c 3d 3d 30 20 29 3b 0a 20 20  p->aCol==0 );.  
fd40: 20 20 20 20 70 2d 3e 6e 43 6f 6c 20 3d 20 70 53      p->nCol = pS
fd50: 65 6c 54 61 62 2d 3e 6e 43 6f 6c 3b 0a 20 20 20  elTab->nCol;.   
fd60: 20 20 20 70 2d 3e 61 43 6f 6c 20 3d 20 70 53 65     p->aCol = pSe
fd70: 6c 54 61 62 2d 3e 61 43 6f 6c 3b 0a 20 20 20 20  lTab->aCol;.    
fd80: 20 20 70 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c 20    pSelTab->nCol 
fd90: 3d 20 30 3b 0a 20 20 20 20 20 20 70 53 65 6c 54  = 0;.      pSelT
fda0: 61 62 2d 3e 61 43 6f 6c 20 3d 20 30 3b 0a 20 20  ab->aCol = 0;.  
fdb0: 20 20 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74      sqlite3Delet
fdc0: 65 54 61 62 6c 65 28 64 62 2c 20 70 53 65 6c 54  eTable(db, pSelT
fdd0: 61 62 29 3b 0a 20 20 20 20 20 20 61 64 64 72 49  ab);.      addrI
fde0: 6e 73 4c 6f 6f 70 20 3d 20 73 71 6c 69 74 65 33  nsLoop = sqlite3
fdf0: 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
fe00: 5f 59 69 65 6c 64 2c 20 64 65 73 74 2e 69 53 44  _Yield, dest.iSD
fe10: 50 61 72 6d 29 3b 0a 20 20 20 20 20 20 56 64 62  Parm);.      Vdb
fe20: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
fe30: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
fe40: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65  ddOp3(v, OP_Make
fe50: 52 65 63 6f 72 64 2c 20 64 65 73 74 2e 69 53 64  Record, dest.iSd
fe60: 73 74 2c 20 64 65 73 74 2e 6e 53 64 73 74 2c 20  st, dest.nSdst, 
fe70: 72 65 67 52 65 63 29 3b 0a 20 20 20 20 20 20 73  regRec);.      s
fe80: 71 6c 69 74 65 33 54 61 62 6c 65 41 66 66 69 6e  qlite3TableAffin
fe90: 69 74 79 28 76 2c 20 70 2c 20 30 29 3b 0a 20 20  ity(v, p, 0);.  
fea0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
feb0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 77 52  ddOp2(v, OP_NewR
fec0: 6f 77 69 64 2c 20 31 2c 20 72 65 67 52 6f 77 69  owid, 1, regRowi
fed0: 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  d);.      sqlite
fee0: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
fef0: 50 5f 49 6e 73 65 72 74 2c 20 31 2c 20 72 65 67  P_Insert, 1, reg
ff00: 52 65 63 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a  Rec, regRowid);.
ff10: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
ff20: 65 47 6f 74 6f 28 76 2c 20 61 64 64 72 49 6e 73  eGoto(v, addrIns
ff30: 4c 6f 6f 70 29 3b 0a 20 20 20 20 20 20 73 71 6c  Loop);.      sql
ff40: 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
ff50: 28 76 2c 20 61 64 64 72 49 6e 73 4c 6f 6f 70 29  (v, addrInsLoop)
ff60: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
ff70: 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
ff80: 43 6c 6f 73 65 2c 20 31 29 3b 0a 20 20 20 20 7d  Close, 1);.    }
ff90: 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d 70 75 74 65  ..    /* Compute
ffa0: 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 74 65   the complete te
ffb0: 78 74 20 6f 66 20 74 68 65 20 43 52 45 41 54 45  xt of the CREATE
ffc0: 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20   statement */.  
ffd0: 20 20 69 66 28 20 70 53 65 6c 65 63 74 20 29 7b    if( pSelect ){
ffe0: 0a 20 20 20 20 20 20 7a 53 74 6d 74 20 3d 20 63  .      zStmt = c
fff0: 72 65 61 74 65 54 61 62 6c 65 53 74 6d 74 28 64  reateTableStmt(d
10000 62 2c 20 70 29 3b 0a 20 20 20 20 7d 65 6c 73 65  b, p);.    }else
10010 7b 0a 20 20 20 20 20 20 54 6f 6b 65 6e 20 2a 70  {.      Token *p
10020 45 6e 64 32 20 3d 20 74 61 62 4f 70 74 73 20 3f  End2 = tabOpts ?
10030 20 26 70 50 61 72 73 65 2d 3e 73 4c 61 73 74 54   &pParse->sLastT
10040 6f 6b 65 6e 20 3a 20 70 45 6e 64 3b 0a 20 20 20  oken : pEnd;.   
10050 20 20 20 6e 20 3d 20 28 69 6e 74 29 28 70 45 6e     n = (int)(pEn
10060 64 32 2d 3e 7a 20 2d 20 70 50 61 72 73 65 2d 3e  d2->z - pParse->
10070 73 4e 61 6d 65 54 6f 6b 65 6e 2e 7a 29 3b 0a 20  sNameToken.z);. 
10080 20 20 20 20 20 69 66 28 20 70 45 6e 64 32 2d 3e       if( pEnd2->
10090 7a 5b 30 5d 21 3d 27 3b 27 20 29 20 6e 20 2b 3d  z[0]!=';' ) n +=
100a0 20 70 45 6e 64 32 2d 3e 6e 3b 0a 20 20 20 20 20   pEnd2->n;.     
100b0 20 7a 53 74 6d 74 20 3d 20 73 71 6c 69 74 65 33   zStmt = sqlite3
100c0 4d 50 72 69 6e 74 66 28 64 62 2c 20 0a 20 20 20  MPrintf(db, .   
100d0 20 20 20 20 20 20 20 22 43 52 45 41 54 45 20 25         "CREATE %
100e0 73 20 25 2e 2a 73 22 2c 20 7a 54 79 70 65 32 2c  s %.*s", zType2,
100f0 20 6e 2c 20 70 50 61 72 73 65 2d 3e 73 4e 61 6d   n, pParse->sNam
10100 65 54 6f 6b 65 6e 2e 7a 0a 20 20 20 20 20 20 29  eToken.z.      )
10110 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
10120 41 20 73 6c 6f 74 20 66 6f 72 20 74 68 65 20 72  A slot for the r
10130 65 63 6f 72 64 20 68 61 73 20 61 6c 72 65 61 64  ecord has alread
10140 79 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64  y been allocated
10150 20 69 6e 20 74 68 65 20 0a 20 20 20 20 2a 2a 20   in the .    ** 
10160 53 51 4c 49 54 45 5f 4d 41 53 54 45 52 20 74 61  SQLITE_MASTER ta
10170 62 6c 65 2e 20 20 57 65 20 6a 75 73 74 20 6e 65  ble.  We just ne
10180 65 64 20 74 6f 20 75 70 64 61 74 65 20 74 68 61  ed to update tha
10190 74 20 73 6c 6f 74 20 77 69 74 68 20 61 6c 6c 0a  t slot with all.
101a0 20 20 20 20 2a 2a 20 74 68 65 20 69 6e 66 6f 72      ** the infor
101b0 6d 61 74 69 6f 6e 20 77 65 27 76 65 20 63 6f 6c  mation we've col
101c0 6c 65 63 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  lected..    */. 
101d0 20 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64     sqlite3Nested
101e0 50 61 72 73 65 28 70 50 61 72 73 65 2c 0a 20 20  Parse(pParse,.  
101f0 20 20 20 20 22 55 50 44 41 54 45 20 25 51 2e 25      "UPDATE %Q.%
10200 73 20 22 0a 20 20 20 20 20 20 20 20 20 22 53 45  s ".         "SE
10210 54 20 74 79 70 65 3d 27 25 73 27 2c 20 6e 61 6d  T type='%s', nam
10220 65 3d 25 51 2c 20 74 62 6c 5f 6e 61 6d 65 3d 25  e=%Q, tbl_name=%
10230 51 2c 20 72 6f 6f 74 70 61 67 65 3d 23 25 64 2c  Q, rootpage=#%d,
10240 20 73 71 6c 3d 25 51 20 22 0a 20 20 20 20 20 20   sql=%Q ".      
10250 20 22 57 48 45 52 45 20 72 6f 77 69 64 3d 23 25   "WHERE rowid=#%
10260 64 22 2c 0a 20 20 20 20 20 20 64 62 2d 3e 61 44  d",.      db->aD
10270 62 5b 69 44 62 5d 2e 7a 44 62 53 4e 61 6d 65 2c  b[iDb].zDbSName,
10280 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 44   SCHEMA_TABLE(iD
10290 62 29 2c 0a 20 20 20 20 20 20 7a 54 79 70 65 2c  b),.      zType,
102a0 0a 20 20 20 20 20 20 70 2d 3e 7a 4e 61 6d 65 2c  .      p->zName,
102b0 0a 20 20 20 20 20 20 70 2d 3e 7a 4e 61 6d 65 2c  .      p->zName,
102c0 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 72  .      pParse->r
102d0 65 67 52 6f 6f 74 2c 0a 20 20 20 20 20 20 7a 53  egRoot,.      zS
102e0 74 6d 74 2c 0a 20 20 20 20 20 20 70 50 61 72 73  tmt,.      pPars
102f0 65 2d 3e 72 65 67 52 6f 77 69 64 0a 20 20 20 20  e->regRowid.    
10300 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  );.    sqlite3Db
10310 46 72 65 65 28 64 62 2c 20 7a 53 74 6d 74 29 3b  Free(db, zStmt);
10320 0a 20 20 20 20 73 71 6c 69 74 65 33 43 68 61 6e  .    sqlite3Chan
10330 67 65 43 6f 6f 6b 69 65 28 70 50 61 72 73 65 2c  geCookie(pParse,
10340 20 69 44 62 29 3b 0a 0a 23 69 66 6e 64 65 66 20   iDb);..#ifndef 
10350 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
10360 49 4e 43 52 45 4d 45 4e 54 0a 20 20 20 20 2f 2a  INCREMENT.    /*
10370 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   Check to see if
10380 20 77 65 20 6e 65 65 64 20 74 6f 20 63 72 65 61   we need to crea
10390 74 65 20 61 6e 20 73 71 6c 69 74 65 5f 73 65 71  te an sqlite_seq
103a0 75 65 6e 63 65 20 74 61 62 6c 65 20 66 6f 72 0a  uence table for.
103b0 20 20 20 20 2a 2a 20 6b 65 65 70 69 6e 67 20 74      ** keeping t
103c0 72 61 63 6b 20 6f 66 20 61 75 74 6f 69 6e 63 72  rack of autoincr
103d0 65 6d 65 6e 74 20 6b 65 79 73 2e 0a 20 20 20 20  ement keys..    
103e0 2a 2f 0a 20 20 20 20 69 66 28 20 28 70 2d 3e 74  */.    if( (p->t
103f0 61 62 46 6c 61 67 73 20 26 20 54 46 5f 41 75 74  abFlags & TF_Aut
10400 6f 69 6e 63 72 65 6d 65 6e 74 29 21 3d 30 20 29  oincrement)!=0 )
10410 7b 0a 20 20 20 20 20 20 44 62 20 2a 70 44 62 20  {.      Db *pDb 
10420 3d 20 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d 3b  = &db->aDb[iDb];
10430 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73  .      assert( s
10440 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65  qlite3SchemaMute
10450 78 48 65 6c 64 28 64 62 2c 20 69 44 62 2c 20 30  xHeld(db, iDb, 0
10460 29 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  ) );.      if( p
10470 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 70 53 65  Db->pSchema->pSe
10480 71 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 20  qTab==0 ){.     
10490 20 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64     sqlite3Nested
104a0 50 61 72 73 65 28 70 50 61 72 73 65 2c 0a 20 20  Parse(pParse,.  
104b0 20 20 20 20 20 20 20 20 22 43 52 45 41 54 45 20          "CREATE 
104c0 54 41 42 4c 45 20 25 51 2e 73 71 6c 69 74 65 5f  TABLE %Q.sqlite_
104d0 73 65 71 75 65 6e 63 65 28 6e 61 6d 65 2c 73 65  sequence(name,se
104e0 71 29 22 2c 0a 20 20 20 20 20 20 20 20 20 20 70  q)",.          p
104f0 44 62 2d 3e 7a 44 62 53 4e 61 6d 65 0a 20 20 20  Db->zDbSName.   
10500 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 7d 0a       );.      }.
10510 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20      }.#endif..  
10520 20 20 2f 2a 20 52 65 70 61 72 73 65 20 65 76 65    /* Reparse eve
10530 72 79 74 68 69 6e 67 20 74 6f 20 75 70 64 61 74  rything to updat
10540 65 20 6f 75 72 20 69 6e 74 65 72 6e 61 6c 20 64  e our internal d
10550 61 74 61 20 73 74 72 75 63 74 75 72 65 73 20 2a  ata structures *
10560 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  /.    sqlite3Vdb
10570 65 41 64 64 50 61 72 73 65 53 63 68 65 6d 61 4f  eAddParseSchemaO
10580 70 28 76 2c 20 69 44 62 2c 0a 20 20 20 20 20 20  p(v, iDb,.      
10590 20 20 20 20 20 73 71 6c 69 74 65 33 4d 50 72 69       sqlite3MPri
105a0 6e 74 66 28 64 62 2c 20 22 74 62 6c 5f 6e 61 6d  ntf(db, "tbl_nam
105b0 65 3d 27 25 71 27 20 41 4e 44 20 74 79 70 65 21  e='%q' AND type!
105c0 3d 27 74 72 69 67 67 65 72 27 22 2c 20 70 2d 3e  ='trigger'", p->
105d0 7a 4e 61 6d 65 29 29 3b 0a 20 20 7d 0a 0a 0a 20  zName));.  }... 
105e0 20 2f 2a 20 41 64 64 20 74 68 65 20 74 61 62 6c   /* Add the tabl
105f0 65 20 74 6f 20 74 68 65 20 69 6e 2d 6d 65 6d 6f  e to the in-memo
10600 72 79 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f  ry representatio
10610 6e 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  n of the databas
10620 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62  e..  */.  if( db
10630 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20  ->init.busy ){. 
10640 20 20 20 54 61 62 6c 65 20 2a 70 4f 6c 64 3b 0a     Table *pOld;.
10650 20 20 20 20 53 63 68 65 6d 61 20 2a 70 53 63 68      Schema *pSch
10660 65 6d 61 20 3d 20 70 2d 3e 70 53 63 68 65 6d 61  ema = p->pSchema
10670 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71  ;.    assert( sq
10680 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78  lite3SchemaMutex
10690 48 65 6c 64 28 64 62 2c 20 69 44 62 2c 20 30 29  Held(db, iDb, 0)
106a0 20 29 3b 0a 20 20 20 20 70 4f 6c 64 20 3d 20 73   );.    pOld = s
106b0 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72 74  qlite3HashInsert
106c0 28 26 70 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61  (&pSchema->tblHa
106d0 73 68 2c 20 70 2d 3e 7a 4e 61 6d 65 2c 20 70 29  sh, p->zName, p)
106e0 3b 0a 20 20 20 20 69 66 28 20 70 4f 6c 64 20 29  ;.    if( pOld )
106f0 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
10700 70 3d 3d 70 4f 6c 64 20 29 3b 20 20 2f 2a 20 4d  p==pOld );  /* M
10710 61 6c 6c 6f 63 20 6d 75 73 74 20 68 61 76 65 20  alloc must have 
10720 66 61 69 6c 65 64 20 69 6e 73 69 64 65 20 48 61  failed inside Ha
10730 73 68 49 6e 73 65 72 74 28 29 20 2a 2f 0a 20 20  shInsert() */.  
10740 20 20 20 20 73 71 6c 69 74 65 33 4f 6f 6d 46 61      sqlite3OomFa
10750 75 6c 74 28 64 62 29 3b 0a 20 20 20 20 20 20 72  ult(db);.      r
10760 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20  eturn;.    }.   
10770 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
10780 6c 65 20 3d 20 30 3b 0a 20 20 20 20 64 62 2d 3e  le = 0;.    db->
10790 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f  flags |= SQLITE_
107a0 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a 0a  InternChanges;..
107b0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
107c0 4d 49 54 5f 41 4c 54 45 52 54 41 42 4c 45 0a 20  MIT_ALTERTABLE. 
107d0 20 20 20 69 66 28 20 21 70 2d 3e 70 53 65 6c 65     if( !p->pSele
107e0 63 74 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73  ct ){.      cons
107f0 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20  t char *zName = 
10800 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 70 50  (const char *)pP
10810 61 72 73 65 2d 3e 73 4e 61 6d 65 54 6f 6b 65 6e  arse->sNameToken
10820 2e 7a 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4e  .z;.      int nN
10830 61 6d 65 3b 0a 20 20 20 20 20 20 61 73 73 65 72  ame;.      asser
10840 74 28 20 21 70 53 65 6c 65 63 74 20 26 26 20 70  t( !pSelect && p
10850 43 6f 6e 73 20 26 26 20 70 45 6e 64 20 29 3b 0a  Cons && pEnd );.
10860 20 20 20 20 20 20 69 66 28 20 70 43 6f 6e 73 2d        if( pCons-
10870 3e 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  >z==0 ){.       
10880 20 70 43 6f 6e 73 20 3d 20 70 45 6e 64 3b 0a 20   pCons = pEnd;. 
10890 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6e 4e 61       }.      nNa
108a0 6d 65 20 3d 20 28 69 6e 74 29 28 28 63 6f 6e 73  me = (int)((cons
108b0 74 20 63 68 61 72 20 2a 29 70 43 6f 6e 73 2d 3e  t char *)pCons->
108c0 7a 20 2d 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  z - zName);.    
108d0 20 20 70 2d 3e 61 64 64 43 6f 6c 4f 66 66 73 65    p->addColOffse
108e0 74 20 3d 20 31 33 20 2b 20 73 71 6c 69 74 65 33  t = 13 + sqlite3
108f0 55 74 66 38 43 68 61 72 4c 65 6e 28 7a 4e 61 6d  Utf8CharLen(zNam
10900 65 2c 20 6e 4e 61 6d 65 29 3b 0a 20 20 20 20 7d  e, nName);.    }
10910 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 7d 0a 0a 23  .#endif.  }.}..#
10920 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
10930 49 54 5f 56 49 45 57 0a 2f 2a 0a 2a 2a 20 54 68  IT_VIEW./*.** Th
10940 65 20 70 61 72 73 65 72 20 63 61 6c 6c 73 20 74  e parser calls t
10950 68 69 73 20 72 6f 75 74 69 6e 65 20 69 6e 20 6f  his routine in o
10960 72 64 65 72 20 74 6f 20 63 72 65 61 74 65 20 61  rder to create a
10970 20 6e 65 77 20 56 49 45 57 0a 2a 2f 0a 76 6f 69   new VIEW.*/.voi
10980 64 20 73 71 6c 69 74 65 33 43 72 65 61 74 65 56  d sqlite3CreateV
10990 69 65 77 28 0a 20 20 50 61 72 73 65 20 2a 70 50  iew(.  Parse *pP
109a0 61 72 73 65 2c 20 20 20 20 20 2f 2a 20 54 68 65  arse,     /* The
109b0 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   parsing context
109c0 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 42 65   */.  Token *pBe
109d0 67 69 6e 2c 20 20 20 20 20 2f 2a 20 54 68 65 20  gin,     /* The 
109e0 43 52 45 41 54 45 20 74 6f 6b 65 6e 20 74 68 61  CREATE token tha
109f0 74 20 62 65 67 69 6e 73 20 74 68 65 20 73 74 61  t begins the sta
10a00 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 54 6f 6b 65  tement */.  Toke
10a10 6e 20 2a 70 4e 61 6d 65 31 2c 20 20 20 20 20 2f  n *pName1,     /
10a20 2a 20 54 68 65 20 74 6f 6b 65 6e 20 74 68 61 74  * The token that
10a30 20 68 6f 6c 64 73 20 74 68 65 20 6e 61 6d 65 20   holds the name 
10a40 6f 66 20 74 68 65 20 76 69 65 77 20 2a 2f 0a 20  of the view */. 
10a50 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32 2c 20   Token *pName2, 
10a60 20 20 20 20 2f 2a 20 54 68 65 20 74 6f 6b 65 6e      /* The token
10a70 20 74 68 61 74 20 68 6f 6c 64 73 20 74 68 65 20   that holds the 
10a80 6e 61 6d 65 20 6f 66 20 74 68 65 20 76 69 65 77  name of the view
10a90 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
10aa0 70 43 4e 61 6d 65 73 2c 20 2f 2a 20 4f 70 74 69  pCNames, /* Opti
10ab0 6f 6e 61 6c 20 6c 69 73 74 20 6f 66 20 76 69 65  onal list of vie
10ac0 77 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 2a  w column names *
10ad0 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c  /.  Select *pSel
10ae0 65 63 74 2c 20 20 20 2f 2a 20 41 20 53 45 4c 45  ect,   /* A SELE
10af0 43 54 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61  CT statement tha
10b00 74 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68  t will become th
10b10 65 20 6e 65 77 20 76 69 65 77 20 2a 2f 0a 20 20  e new view */.  
10b20 69 6e 74 20 69 73 54 65 6d 70 2c 20 20 20 20 20  int isTemp,     
10b30 20 20 20 2f 2a 20 54 52 55 45 20 66 6f 72 20 61     /* TRUE for a
10b40 20 54 45 4d 50 4f 52 41 52 59 20 76 69 65 77 20   TEMPORARY view 
10b50 2a 2f 0a 20 20 69 6e 74 20 6e 6f 45 72 72 20 20  */.  int noErr  
10b60 20 20 20 20 20 20 20 20 2f 2a 20 53 75 70 70 72          /* Suppr
10b70 65 73 73 20 65 72 72 6f 72 20 6d 65 73 73 61 67  ess error messag
10b80 65 73 20 69 66 20 56 49 45 57 20 61 6c 72 65 61  es if VIEW alrea
10b90 64 79 20 65 78 69 73 74 73 20 2a 2f 0a 29 7b 0a  dy exists */.){.
10ba0 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 69 6e    Table *p;.  in
10bb0 74 20 6e 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  t n;.  const cha
10bc0 72 20 2a 7a 3b 0a 20 20 54 6f 6b 65 6e 20 73 45  r *z;.  Token sE
10bd0 6e 64 3b 0a 20 20 44 62 46 69 78 65 72 20 73 46  nd;.  DbFixer sF
10be0 69 78 3b 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61  ix;.  Token *pNa
10bf0 6d 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 44  me = 0;.  int iD
10c00 62 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  b;.  sqlite3 *db
10c10 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a   = pParse->db;..
10c20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 56    if( pParse->nV
10c30 61 72 3e 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  ar>0 ){.    sqli
10c40 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
10c50 73 65 2c 20 22 70 61 72 61 6d 65 74 65 72 73 20  se, "parameters 
10c60 61 72 65 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 20  are not allowed 
10c70 69 6e 20 76 69 65 77 73 22 29 3b 0a 20 20 20 20  in views");.    
10c80 67 6f 74 6f 20 63 72 65 61 74 65 5f 76 69 65 77  goto create_view
10c90 5f 66 61 69 6c 3b 0a 20 20 7d 0a 20 20 73 71 6c  _fail;.  }.  sql
10ca0 69 74 65 33 53 74 61 72 74 54 61 62 6c 65 28 70  ite3StartTable(p
10cb0 50 61 72 73 65 2c 20 70 4e 61 6d 65 31 2c 20 70  Parse, pName1, p
10cc0 4e 61 6d 65 32 2c 20 69 73 54 65 6d 70 2c 20 31  Name2, isTemp, 1
10cd0 2c 20 30 2c 20 6e 6f 45 72 72 29 3b 0a 20 20 70  , 0, noErr);.  p
10ce0 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54   = pParse->pNewT
10cf0 61 62 6c 65 3b 0a 20 20 69 66 28 20 70 3d 3d 30  able;.  if( p==0
10d00 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72   || pParse->nErr
10d10 20 29 20 67 6f 74 6f 20 63 72 65 61 74 65 5f 76   ) goto create_v
10d20 69 65 77 5f 66 61 69 6c 3b 0a 20 20 73 71 6c 69  iew_fail;.  sqli
10d30 74 65 33 54 77 6f 50 61 72 74 4e 61 6d 65 28 70  te3TwoPartName(p
10d40 50 61 72 73 65 2c 20 70 4e 61 6d 65 31 2c 20 70  Parse, pName1, p
10d50 4e 61 6d 65 32 2c 20 26 70 4e 61 6d 65 29 3b 0a  Name2, &pName);.
10d60 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53    iDb = sqlite3S
10d70 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c  chemaToIndex(db,
10d80 20 70 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20   p->pSchema);.  
10d90 73 71 6c 69 74 65 33 46 69 78 49 6e 69 74 28 26  sqlite3FixInit(&
10da0 73 46 69 78 2c 20 70 50 61 72 73 65 2c 20 69 44  sFix, pParse, iD
10db0 62 2c 20 22 76 69 65 77 22 2c 20 70 4e 61 6d 65  b, "view", pName
10dc0 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  );.  if( sqlite3
10dd0 46 69 78 53 65 6c 65 63 74 28 26 73 46 69 78 2c  FixSelect(&sFix,
10de0 20 70 53 65 6c 65 63 74 29 20 29 20 67 6f 74 6f   pSelect) ) goto
10df0 20 63 72 65 61 74 65 5f 76 69 65 77 5f 66 61 69   create_view_fai
10e00 6c 3b 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 61 20  l;..  /* Make a 
10e10 63 6f 70 79 20 6f 66 20 74 68 65 20 65 6e 74 69  copy of the enti
10e20 72 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  re SELECT statem
10e30 65 6e 74 20 74 68 61 74 20 64 65 66 69 6e 65 73  ent that defines
10e40 20 74 68 65 20 76 69 65 77 2e 0a 20 20 2a 2a 20   the view..  ** 
10e50 54 68 69 73 20 77 69 6c 6c 20 66 6f 72 63 65 20  This will force 
10e60 61 6c 6c 20 74 68 65 20 45 78 70 72 2e 74 6f 6b  all the Expr.tok
10e70 65 6e 2e 7a 20 76 61 6c 75 65 73 20 74 6f 20 62  en.z values to b
10e80 65 20 64 79 6e 61 6d 69 63 61 6c 6c 79 0a 20 20  e dynamically.  
10e90 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 72 61 74  ** allocated rat
10ea0 68 65 72 20 74 68 61 6e 20 70 6f 69 6e 74 20 74  her than point t
10eb0 6f 20 74 68 65 20 69 6e 70 75 74 20 73 74 72 69  o the input stri
10ec0 6e 67 20 2d 20 77 68 69 63 68 20 6d 65 61 6e 73  ng - which means
10ed0 20 74 68 61 74 0a 20 20 2a 2a 20 74 68 65 79 20   that.  ** they 
10ee0 77 69 6c 6c 20 70 65 72 73 69 73 74 20 61 66 74  will persist aft
10ef0 65 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 73  er the current s
10f00 71 6c 69 74 65 33 5f 65 78 65 63 28 29 20 63 61  qlite3_exec() ca
10f10 6c 6c 20 72 65 74 75 72 6e 73 2e 0a 20 20 2a 2f  ll returns..  */
10f20 0a 20 20 70 2d 3e 70 53 65 6c 65 63 74 20 3d 20  .  p->pSelect = 
10f30 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70  sqlite3SelectDup
10f40 28 64 62 2c 20 70 53 65 6c 65 63 74 2c 20 45 58  (db, pSelect, EX
10f50 50 52 44 55 50 5f 52 45 44 55 43 45 29 3b 0a 20  PRDUP_REDUCE);. 
10f60 20 70 2d 3e 70 43 68 65 63 6b 20 3d 20 73 71 6c   p->pCheck = sql
10f70 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28  ite3ExprListDup(
10f80 64 62 2c 20 70 43 4e 61 6d 65 73 2c 20 45 58 50  db, pCNames, EXP
10f90 52 44 55 50 5f 52 45 44 55 43 45 29 3b 0a 20 20  RDUP_REDUCE);.  
10fa0 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
10fb0 69 6c 65 64 20 29 20 67 6f 74 6f 20 63 72 65 61  iled ) goto crea
10fc0 74 65 5f 76 69 65 77 5f 66 61 69 6c 3b 0a 0a 20  te_view_fail;.. 
10fd0 20 2f 2a 20 4c 6f 63 61 74 65 20 74 68 65 20 65   /* Locate the e
10fe0 6e 64 20 6f 66 20 74 68 65 20 43 52 45 41 54 45  nd of the CREATE
10ff0 20 56 49 45 57 20 73 74 61 74 65 6d 65 6e 74 2e   VIEW statement.
11000 20 20 4d 61 6b 65 20 73 45 6e 64 20 70 6f 69 6e    Make sEnd poin
11010 74 20 74 6f 0a 20 20 2a 2a 20 74 68 65 20 65 6e  t to.  ** the en
11020 64 2e 0a 20 20 2a 2f 0a 20 20 73 45 6e 64 20 3d  d..  */.  sEnd =
11030 20 70 50 61 72 73 65 2d 3e 73 4c 61 73 74 54 6f   pParse->sLastTo
11040 6b 65 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ken;.  assert( s
11050 45 6e 64 2e 7a 5b 30 5d 21 3d 30 20 29 3b 0a 20  End.z[0]!=0 );. 
11060 20 69 66 28 20 73 45 6e 64 2e 7a 5b 30 5d 21 3d   if( sEnd.z[0]!=
11070 27 3b 27 20 29 7b 0a 20 20 20 20 73 45 6e 64 2e  ';' ){.    sEnd.
11080 7a 20 2b 3d 20 73 45 6e 64 2e 6e 3b 0a 20 20 7d  z += sEnd.n;.  }
11090 0a 20 20 73 45 6e 64 2e 6e 20 3d 20 30 3b 0a 20  .  sEnd.n = 0;. 
110a0 20 6e 20 3d 20 28 69 6e 74 29 28 73 45 6e 64 2e   n = (int)(sEnd.
110b0 7a 20 2d 20 70 42 65 67 69 6e 2d 3e 7a 29 3b 0a  z - pBegin->z);.
110c0 20 20 61 73 73 65 72 74 28 20 6e 3e 30 20 29 3b    assert( n>0 );
110d0 0a 20 20 7a 20 3d 20 70 42 65 67 69 6e 2d 3e 7a  .  z = pBegin->z
110e0 3b 0a 20 20 77 68 69 6c 65 28 20 73 71 6c 69 74  ;.  while( sqlit
110f0 65 33 49 73 73 70 61 63 65 28 7a 5b 6e 2d 31 5d  e3Isspace(z[n-1]
11100 29 20 29 7b 20 6e 2d 2d 3b 20 7d 0a 20 20 73 45  ) ){ n--; }.  sE
11110 6e 64 2e 7a 20 3d 20 26 7a 5b 6e 2d 31 5d 3b 0a  nd.z = &z[n-1];.
11120 20 20 73 45 6e 64 2e 6e 20 3d 20 31 3b 0a 0a 20    sEnd.n = 1;.. 
11130 20 2f 2a 20 55 73 65 20 73 71 6c 69 74 65 33 45   /* Use sqlite3E
11140 6e 64 54 61 62 6c 65 28 29 20 74 6f 20 61 64 64  ndTable() to add
11150 20 74 68 65 20 76 69 65 77 20 74 6f 20 74 68 65   the view to the
11160 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52 20 74   SQLITE_MASTER t
11170 61 62 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65  able */.  sqlite
11180 33 45 6e 64 54 61 62 6c 65 28 70 50 61 72 73 65  3EndTable(pParse
11190 2c 20 30 2c 20 26 73 45 6e 64 2c 20 30 2c 20 30  , 0, &sEnd, 0, 0
111a0 29 3b 0a 0a 63 72 65 61 74 65 5f 76 69 65 77 5f  );..create_view_
111b0 66 61 69 6c 3a 0a 20 20 73 71 6c 69 74 65 33 53  fail:.  sqlite3S
111c0 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20  electDelete(db, 
111d0 70 53 65 6c 65 63 74 29 3b 0a 20 20 73 71 6c 69  pSelect);.  sqli
111e0 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
111f0 65 28 64 62 2c 20 70 43 4e 61 6d 65 73 29 3b 0a  e(db, pCNames);.
11200 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 23 65 6e 64    return;.}.#end
11210 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
11220 54 5f 56 49 45 57 20 2a 2f 0a 0a 23 69 66 20 21  T_VIEW */..#if !
11230 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
11240 4d 49 54 5f 56 49 45 57 29 20 7c 7c 20 21 64 65  MIT_VIEW) || !de
11250 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
11260 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 0a  T_VIRTUALTABLE).
11270 2f 2a 0a 2a 2a 20 54 68 65 20 54 61 62 6c 65 20  /*.** The Table 
11280 73 74 72 75 63 74 75 72 65 20 70 54 61 62 6c 65  structure pTable
11290 20 69 73 20 72 65 61 6c 6c 79 20 61 20 56 49 45   is really a VIE
112a0 57 2e 20 20 46 69 6c 6c 20 69 6e 20 74 68 65 20  W.  Fill in the 
112b0 6e 61 6d 65 73 20 6f 66 0a 2a 2a 20 74 68 65 20  names of.** the 
112c0 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 76  columns of the v
112d0 69 65 77 20 69 6e 20 74 68 65 20 70 54 61 62 6c  iew in the pTabl
112e0 65 20 73 74 72 75 63 74 75 72 65 2e 20 20 52 65  e structure.  Re
112f0 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 0a  turn the number.
11300 2a 2a 20 6f 66 20 65 72 72 6f 72 73 2e 20 20 49  ** of errors.  I
11310 66 20 61 6e 20 65 72 72 6f 72 20 69 73 20 73 65  f an error is se
11320 65 6e 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f  en leave an erro
11330 72 20 6d 65 73 73 61 67 65 20 69 6e 20 70 50 61  r message in pPa
11340 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2e 0a 2a 2f  rse->zErrMsg..*/
11350 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 69 65 77  .int sqlite3View
11360 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 50  GetColumnNames(P
11370 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 61  arse *pParse, Ta
11380 62 6c 65 20 2a 70 54 61 62 6c 65 29 7b 0a 20 20  ble *pTable){.  
11390 54 61 62 6c 65 20 2a 70 53 65 6c 54 61 62 3b 20  Table *pSelTab; 
113a0 20 20 2f 2a 20 41 20 66 61 6b 65 20 74 61 62 6c    /* A fake tabl
113b0 65 20 66 72 6f 6d 20 77 68 69 63 68 20 77 65 20  e from which we 
113c0 67 65 74 20 74 68 65 20 72 65 73 75 6c 74 20 73  get the result s
113d0 65 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  et */.  Select *
113e0 70 53 65 6c 3b 20 20 20 20 20 2f 2a 20 43 6f 70  pSel;     /* Cop
113f0 79 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20  y of the SELECT 
11400 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20  that implements 
11410 74 68 65 20 76 69 65 77 20 2a 2f 0a 20 20 69 6e  the view */.  in
11420 74 20 6e 45 72 72 20 3d 20 30 3b 20 20 20 20 20  t nErr = 0;     
11430 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 72 72  /* Number of err
11440 6f 72 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 20  ors encountered 
11450 2a 2f 0a 20 20 69 6e 74 20 6e 3b 20 20 20 20 20  */.  int n;     
11460 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 6f 72         /* Tempor
11470 61 72 69 6c 79 20 68 6f 6c 64 73 20 74 68 65 20  arily holds the 
11480 6e 75 6d 62 65 72 20 6f 66 20 63 75 72 73 6f 72  number of cursor
11490 73 20 61 73 73 69 67 6e 65 64 20 2a 2f 0a 20 20  s assigned */.  
114a0 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
114b0 61 72 73 65 2d 3e 64 62 3b 20 20 2f 2a 20 44 61  arse->db;  /* Da
114c0 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
114d0 6e 20 66 6f 72 20 6d 61 6c 6c 6f 63 20 65 72 72  n for malloc err
114e0 6f 72 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ors */.  sqlite3
114f0 5f 78 61 75 74 68 20 78 41 75 74 68 3b 20 20 20  _xauth xAuth;   
11500 20 20 20 20 2f 2a 20 53 61 76 65 64 20 78 41 75      /* Saved xAu
11510 74 68 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 0a 20  th pointer */.. 
11520 20 61 73 73 65 72 74 28 20 70 54 61 62 6c 65 20   assert( pTable 
11530 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  );..#ifndef SQLI
11540 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
11550 41 42 4c 45 0a 20 20 69 66 28 20 73 71 6c 69 74  ABLE.  if( sqlit
11560 65 33 56 74 61 62 43 61 6c 6c 43 6f 6e 6e 65 63  e3VtabCallConnec
11570 74 28 70 50 61 72 73 65 2c 20 70 54 61 62 6c 65  t(pParse, pTable
11580 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
11590 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
115a0 7d 0a 20 20 69 66 28 20 49 73 56 69 72 74 75 61  }.  if( IsVirtua
115b0 6c 28 70 54 61 62 6c 65 29 20 29 20 72 65 74 75  l(pTable) ) retu
115c0 72 6e 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 23 69  rn 0;.#endif..#i
115d0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
115e0 54 5f 56 49 45 57 0a 20 20 2f 2a 20 41 20 70 6f  T_VIEW.  /* A po
115f0 73 69 74 69 76 65 20 6e 43 6f 6c 20 6d 65 61 6e  sitive nCol mean
11600 73 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 6e 61  s the columns na
11610 6d 65 73 20 66 6f 72 20 74 68 69 73 20 76 69 65  mes for this vie
11620 77 20 61 72 65 0a 20 20 2a 2a 20 61 6c 72 65 61  w are.  ** alrea
11630 64 79 20 6b 6e 6f 77 6e 2e 0a 20 20 2a 2f 0a 20  dy known..  */. 
11640 20 69 66 28 20 70 54 61 62 6c 65 2d 3e 6e 43 6f   if( pTable->nCo
11650 6c 3e 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  l>0 ) return 0;.
11660 0a 20 20 2f 2a 20 41 20 6e 65 67 61 74 69 76 65  .  /* A negative
11670 20 6e 43 6f 6c 20 69 73 20 61 20 73 70 65 63 69   nCol is a speci
11680 61 6c 20 6d 61 72 6b 65 72 20 6d 65 61 6e 69 6e  al marker meanin
11690 67 20 74 68 61 74 20 77 65 20 61 72 65 20 63 75  g that we are cu
116a0 72 72 65 6e 74 6c 79 0a 20 20 2a 2a 20 74 72 79  rrently.  ** try
116b0 69 6e 67 20 74 6f 20 63 6f 6d 70 75 74 65 20 74  ing to compute t
116c0 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 2e  he column names.
116d0 20 20 49 66 20 77 65 20 65 6e 74 65 72 20 74 68    If we enter th
116e0 69 73 20 72 6f 75 74 69 6e 65 20 77 69 74 68 0a  is routine with.
116f0 20 20 2a 2a 20 61 20 6e 65 67 61 74 69 76 65 20    ** a negative 
11700 6e 43 6f 6c 2c 20 69 74 20 6d 65 61 6e 73 20 74  nCol, it means t
11710 77 6f 20 6f 72 20 6d 6f 72 65 20 76 69 65 77 73  wo or more views
11720 20 66 6f 72 6d 20 61 20 6c 6f 6f 70 2c 20 6c 69   form a loop, li
11730 6b 65 20 74 68 69 73 3a 0a 20 20 2a 2a 0a 20 20  ke this:.  **.  
11740 2a 2a 20 20 20 20 20 43 52 45 41 54 45 20 56 49  **     CREATE VI
11750 45 57 20 6f 6e 65 20 41 53 20 53 45 4c 45 43 54  EW one AS SELECT
11760 20 2a 20 46 52 4f 4d 20 74 77 6f 3b 0a 20 20 2a   * FROM two;.  *
11770 2a 20 20 20 20 20 43 52 45 41 54 45 20 56 49 45  *     CREATE VIE
11780 57 20 74 77 6f 20 41 53 20 53 45 4c 45 43 54 20  W two AS SELECT 
11790 2a 20 46 52 4f 4d 20 6f 6e 65 3b 0a 20 20 2a 2a  * FROM one;.  **
117a0 0a 20 20 2a 2a 20 41 63 74 75 61 6c 6c 79 2c 20  .  ** Actually, 
117b0 74 68 65 20 65 72 72 6f 72 20 61 62 6f 76 65 20  the error above 
117c0 69 73 20 6e 6f 77 20 63 61 75 67 68 74 20 70 72  is now caught pr
117d0 69 6f 72 20 74 6f 20 72 65 61 63 68 69 6e 67 20  ior to reaching 
117e0 74 68 69 73 20 70 6f 69 6e 74 2e 0a 20 20 2a 2a  this point..  **
117f0 20 42 75 74 20 74 68 65 20 66 6f 6c 6c 6f 77 69   But the followi
11800 6e 67 20 74 65 73 74 20 69 73 20 73 74 69 6c 6c  ng test is still
11810 20 69 6d 70 6f 72 74 61 6e 74 20 61 73 20 69 74   important as it
11820 20 64 6f 65 73 20 63 6f 6d 65 20 75 70 0a 20 20   does come up.  
11830 2a 2a 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77  ** in the follow
11840 69 6e 67 3a 0a 20 20 2a 2a 20 0a 20 20 2a 2a 20  ing:.  ** .  ** 
11850 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
11860 20 6d 61 69 6e 2e 65 78 31 28 61 29 3b 0a 20 20   main.ex1(a);.  
11870 2a 2a 20 20 20 20 20 43 52 45 41 54 45 20 54 45  **     CREATE TE
11880 4d 50 20 56 49 45 57 20 65 78 31 20 41 53 20 53  MP VIEW ex1 AS S
11890 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 65 78 31  ELECT a FROM ex1
118a0 3b 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43  ;.  **     SELEC
118b0 54 20 2a 20 46 52 4f 4d 20 74 65 6d 70 2e 65 78  T * FROM temp.ex
118c0 31 3b 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 54  1;.  */.  if( pT
118d0 61 62 6c 65 2d 3e 6e 43 6f 6c 3c 30 20 29 7b 0a  able->nCol<0 ){.
118e0 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
118f0 4d 73 67 28 70 50 61 72 73 65 2c 20 22 76 69 65  Msg(pParse, "vie
11900 77 20 25 73 20 69 73 20 63 69 72 63 75 6c 61 72  w %s is circular
11910 6c 79 20 64 65 66 69 6e 65 64 22 2c 20 70 54 61  ly defined", pTa
11920 62 6c 65 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  ble->zName);.   
11930 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20   return 1;.  }. 
11940 20 61 73 73 65 72 74 28 20 70 54 61 62 6c 65 2d   assert( pTable-
11950 3e 6e 43 6f 6c 3e 3d 30 20 29 3b 0a 0a 20 20 2f  >nCol>=0 );..  /
11960 2a 20 49 66 20 77 65 20 67 65 74 20 74 68 69 73  * If we get this
11970 20 66 61 72 2c 20 69 74 20 6d 65 61 6e 73 20 77   far, it means w
11980 65 20 6e 65 65 64 20 74 6f 20 63 6f 6d 70 75 74  e need to comput
11990 65 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65  e the table name
119a0 73 2e 0a 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61  s..  ** Note tha
119b0 74 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 73 71  t the call to sq
119c0 6c 69 74 65 33 52 65 73 75 6c 74 53 65 74 4f 66  lite3ResultSetOf
119d0 53 65 6c 65 63 74 28 29 20 77 69 6c 6c 20 65 78  Select() will ex
119e0 70 61 6e 64 20 61 6e 79 0a 20 20 2a 2a 20 22 2a  pand any.  ** "*
119f0 22 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 74 68  " elements in th
11a00 65 20 72 65 73 75 6c 74 73 20 73 65 74 20 6f 66  e results set of
11a10 20 74 68 65 20 76 69 65 77 20 61 6e 64 20 77 69   the view and wi
11a20 6c 6c 20 61 73 73 69 67 6e 20 63 75 72 73 6f 72  ll assign cursor
11a30 73 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 65 6c  s.  ** to the el
11a40 65 6d 65 6e 74 73 20 6f 66 20 74 68 65 20 46 52  ements of the FR
11a50 4f 4d 20 63 6c 61 75 73 65 2e 20 20 42 75 74 20  OM clause.  But 
11a60 77 65 20 64 6f 20 6e 6f 74 20 77 61 6e 74 20 74  we do not want t
11a70 68 65 73 65 20 63 68 61 6e 67 65 73 0a 20 20 2a  hese changes.  *
11a80 2a 20 74 6f 20 62 65 20 70 65 72 6d 61 6e 65 6e  * to be permanen
11a90 74 2e 20 20 53 6f 20 74 68 65 20 63 6f 6d 70 75  t.  So the compu
11aa0 74 61 74 69 6f 6e 20 69 73 20 64 6f 6e 65 20 6f  tation is done o
11ab0 6e 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20  n a copy of the 
11ac0 53 45 4c 45 43 54 0a 20 20 2a 2a 20 73 74 61 74  SELECT.  ** stat
11ad0 65 6d 65 6e 74 20 74 68 61 74 20 64 65 66 69 6e  ement that defin
11ae0 65 73 20 74 68 65 20 76 69 65 77 2e 0a 20 20 2a  es the view..  *
11af0 2f 0a 20 20 61 73 73 65 72 74 28 20 70 54 61 62  /.  assert( pTab
11b00 6c 65 2d 3e 70 53 65 6c 65 63 74 20 29 3b 0a 20  le->pSelect );. 
11b10 20 70 53 65 6c 20 3d 20 73 71 6c 69 74 65 33 53   pSel = sqlite3S
11b20 65 6c 65 63 74 44 75 70 28 64 62 2c 20 70 54 61  electDup(db, pTa
11b30 62 6c 65 2d 3e 70 53 65 6c 65 63 74 2c 20 30 29  ble->pSelect, 0)
11b40 3b 0a 20 20 69 66 28 20 70 53 65 6c 20 29 7b 0a  ;.  if( pSel ){.
11b50 20 20 20 20 6e 20 3d 20 70 50 61 72 73 65 2d 3e      n = pParse->
11b60 6e 54 61 62 3b 0a 20 20 20 20 73 71 6c 69 74 65  nTab;.    sqlite
11b70 33 53 72 63 4c 69 73 74 41 73 73 69 67 6e 43 75  3SrcListAssignCu
11b80 72 73 6f 72 73 28 70 50 61 72 73 65 2c 20 70 53  rsors(pParse, pS
11b90 65 6c 2d 3e 70 53 72 63 29 3b 0a 20 20 20 20 70  el->pSrc);.    p
11ba0 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 2d 31  Table->nCol = -1
11bb0 3b 0a 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73  ;.    db->lookas
11bc0 69 64 65 2e 62 44 69 73 61 62 6c 65 2b 2b 3b 0a  ide.bDisable++;.
11bd0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
11be0 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f  MIT_AUTHORIZATIO
11bf0 4e 0a 20 20 20 20 78 41 75 74 68 20 3d 20 64 62  N.    xAuth = db
11c00 2d 3e 78 41 75 74 68 3b 0a 20 20 20 20 64 62 2d  ->xAuth;.    db-
11c10 3e 78 41 75 74 68 20 3d 20 30 3b 0a 20 20 20 20  >xAuth = 0;.    
11c20 70 53 65 6c 54 61 62 20 3d 20 73 71 6c 69 74 65  pSelTab = sqlite
11c30 33 52 65 73 75 6c 74 53 65 74 4f 66 53 65 6c 65  3ResultSetOfSele
11c40 63 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c 29  ct(pParse, pSel)
11c50 3b 0a 20 20 20 20 64 62 2d 3e 78 41 75 74 68 20  ;.    db->xAuth 
11c60 3d 20 78 41 75 74 68 3b 0a 23 65 6c 73 65 0a 20  = xAuth;.#else. 
11c70 20 20 20 70 53 65 6c 54 61 62 20 3d 20 73 71 6c     pSelTab = sql
11c80 69 74 65 33 52 65 73 75 6c 74 53 65 74 4f 66 53  ite3ResultSetOfS
11c90 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 53  elect(pParse, pS
11ca0 65 6c 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  el);.#endif.    
11cb0 70 50 61 72 73 65 2d 3e 6e 54 61 62 20 3d 20 6e  pParse->nTab = n
11cc0 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62 6c 65  ;.    if( pTable
11cd0 2d 3e 70 43 68 65 63 6b 20 29 7b 0a 20 20 20 20  ->pCheck ){.    
11ce0 20 20 2f 2a 20 43 52 45 41 54 45 20 56 49 45 57    /* CREATE VIEW
11cf0 20 6e 61 6d 65 28 61 72 67 6c 69 73 74 29 20 41   name(arglist) A
11d00 53 20 2e 2e 2e 0a 20 20 20 20 20 20 2a 2a 20 54  S ....      ** T
11d10 68 65 20 6e 61 6d 65 73 20 6f 66 20 74 68 65 20  he names of the 
11d20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 74  columns in the t
11d30 61 62 6c 65 20 61 72 65 20 74 61 6b 65 6e 20 66  able are taken f
11d40 72 6f 6d 0a 20 20 20 20 20 20 2a 2a 20 61 72 67  rom.      ** arg
11d50 6c 69 73 74 20 77 68 69 63 68 20 69 73 20 73 74  list which is st
11d60 6f 72 65 64 20 69 6e 20 70 54 61 62 6c 65 2d 3e  ored in pTable->
11d70 70 43 68 65 63 6b 2e 20 20 54 68 65 20 70 43 68  pCheck.  The pCh
11d80 65 63 6b 20 66 69 65 6c 64 0a 20 20 20 20 20 20  eck field.      
11d90 2a 2a 20 6e 6f 72 6d 61 6c 6c 79 20 68 6f 6c 64  ** normally hold
11da0 73 20 43 48 45 43 4b 20 63 6f 6e 73 74 72 61 69  s CHECK constrai
11db0 6e 74 73 20 6f 6e 20 61 6e 20 6f 72 64 69 6e 61  nts on an ordina
11dc0 72 79 20 74 61 62 6c 65 2c 20 62 75 74 20 66 6f  ry table, but fo
11dd0 72 0a 20 20 20 20 20 20 2a 2a 20 61 20 56 49 45  r.      ** a VIE
11de0 57 20 69 74 20 68 6f 6c 64 73 20 74 68 65 20 6c  W it holds the l
11df0 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 20 6e 61  ist of column na
11e00 6d 65 73 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  mes..      */.  
11e10 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d      sqlite3Colum
11e20 6e 73 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70  nsFromExprList(p
11e30 50 61 72 73 65 2c 20 70 54 61 62 6c 65 2d 3e 70  Parse, pTable->p
11e40 43 68 65 63 6b 2c 20 0a 20 20 20 20 20 20 20 20  Check, .        
11e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11e60 20 20 20 20 20 20 20 20 20 26 70 54 61 62 6c 65           &pTable
11e70 2d 3e 6e 43 6f 6c 2c 20 26 70 54 61 62 6c 65 2d  ->nCol, &pTable-
11e80 3e 61 43 6f 6c 29 3b 0a 20 20 20 20 20 20 69 66  >aCol);.      if
11e90 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
11ea0 65 64 3d 3d 30 20 0a 20 20 20 20 20 20 20 26 26  ed==0 .       &&
11eb0 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30   pParse->nErr==0
11ec0 0a 20 20 20 20 20 20 20 26 26 20 70 54 61 62 6c  .       && pTabl
11ed0 65 2d 3e 6e 43 6f 6c 3d 3d 70 53 65 6c 2d 3e 70  e->nCol==pSel->p
11ee0 45 4c 69 73 74 2d 3e 6e 45 78 70 72 0a 20 20 20  EList->nExpr.   
11ef0 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71     ){.        sq
11f00 6c 69 74 65 33 53 65 6c 65 63 74 41 64 64 43 6f  lite3SelectAddCo
11f10 6c 75 6d 6e 54 79 70 65 41 6e 64 43 6f 6c 6c 61  lumnTypeAndColla
11f20 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 70 54 61  tion(pParse, pTa
11f30 62 6c 65 2c 20 70 53 65 6c 29 3b 0a 20 20 20 20  ble, pSel);.    
11f40 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66    }.    }else if
11f50 28 20 70 53 65 6c 54 61 62 20 29 7b 0a 20 20 20  ( pSelTab ){.   
11f60 20 20 20 2f 2a 20 43 52 45 41 54 45 20 56 49 45     /* CREATE VIE
11f70 57 20 6e 61 6d 65 20 41 53 2e 2e 2e 20 20 77 69  W name AS...  wi
11f80 74 68 6f 75 74 20 61 6e 20 61 72 67 75 6d 65 6e  thout an argumen
11f90 74 20 6c 69 73 74 2e 20 20 43 6f 6e 73 74 72 75  t list.  Constru
11fa0 63 74 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  ct.      ** the 
11fb0 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 66 72 6f  column names fro
11fc0 6d 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61  m the SELECT sta
11fd0 74 65 6d 65 6e 74 20 74 68 61 74 20 64 65 66 69  tement that defi
11fe0 6e 65 73 20 74 68 65 20 76 69 65 77 2e 0a 20 20  nes the view..  
11ff0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 73 73      */.      ass
12000 65 72 74 28 20 70 54 61 62 6c 65 2d 3e 61 43 6f  ert( pTable->aCo
12010 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 54  l==0 );.      pT
12020 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 70 53 65  able->nCol = pSe
12030 6c 54 61 62 2d 3e 6e 43 6f 6c 3b 0a 20 20 20 20  lTab->nCol;.    
12040 20 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 20 3d    pTable->aCol =
12050 20 70 53 65 6c 54 61 62 2d 3e 61 43 6f 6c 3b 0a   pSelTab->aCol;.
12060 20 20 20 20 20 20 70 53 65 6c 54 61 62 2d 3e 6e        pSelTab->n
12070 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  Col = 0;.      p
12080 53 65 6c 54 61 62 2d 3e 61 43 6f 6c 20 3d 20 30  SelTab->aCol = 0
12090 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
120a0 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74  sqlite3SchemaMut
120b0 65 78 48 65 6c 64 28 64 62 2c 20 30 2c 20 70 54  exHeld(db, 0, pT
120c0 61 62 6c 65 2d 3e 70 53 63 68 65 6d 61 29 20 29  able->pSchema) )
120d0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
120e0 20 20 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20     pTable->nCol 
120f0 3d 20 30 3b 0a 20 20 20 20 20 20 6e 45 72 72 2b  = 0;.      nErr+
12100 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  +;.    }.    sql
12110 69 74 65 33 44 65 6c 65 74 65 54 61 62 6c 65 28  ite3DeleteTable(
12120 64 62 2c 20 70 53 65 6c 54 61 62 29 3b 0a 20 20  db, pSelTab);.  
12130 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44    sqlite3SelectD
12140 65 6c 65 74 65 28 64 62 2c 20 70 53 65 6c 29 3b  elete(db, pSel);
12150 0a 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69  .    db->lookasi
12160 64 65 2e 62 44 69 73 61 62 6c 65 2d 2d 3b 0a 20  de.bDisable--;. 
12170 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 6e 45   } else {.    nE
12180 72 72 2b 2b 3b 0a 20 20 7d 0a 20 20 70 54 61 62  rr++;.  }.  pTab
12190 6c 65 2d 3e 70 53 63 68 65 6d 61 2d 3e 73 63 68  le->pSchema->sch
121a0 65 6d 61 46 6c 61 67 73 20 7c 3d 20 44 42 5f 55  emaFlags |= DB_U
121b0 6e 72 65 73 65 74 56 69 65 77 73 3b 0a 23 65 6e  nresetViews;.#en
121c0 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
121d0 49 54 5f 56 49 45 57 20 2a 2f 0a 20 20 72 65 74  IT_VIEW */.  ret
121e0 75 72 6e 20 6e 45 72 72 3b 20 20 0a 7d 0a 23 65  urn nErr;  .}.#e
121f0 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64  ndif /* !defined
12200 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45  (SQLITE_OMIT_VIE
12210 57 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53  W) || !defined(S
12220 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
12230 41 4c 54 41 42 4c 45 29 20 2a 2f 0a 0a 23 69 66  ALTABLE) */..#if
12240 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
12250 5f 56 49 45 57 0a 2f 2a 0a 2a 2a 20 43 6c 65 61  _VIEW./*.** Clea
12260 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d  r the column nam
12270 65 73 20 66 72 6f 6d 20 65 76 65 72 79 20 56 49  es from every VI
12280 45 57 20 69 6e 20 64 61 74 61 62 61 73 65 20 69  EW in database i
12290 64 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  dx..*/.static vo
122a0 69 64 20 73 71 6c 69 74 65 56 69 65 77 52 65 73  id sqliteViewRes
122b0 65 74 41 6c 6c 28 73 71 6c 69 74 65 33 20 2a 64  etAll(sqlite3 *d
122c0 62 2c 20 69 6e 74 20 69 64 78 29 7b 0a 20 20 48  b, int idx){.  H
122d0 61 73 68 45 6c 65 6d 20 2a 69 3b 0a 20 20 61 73  ashElem *i;.  as
122e0 73 65 72 74 28 20 73 71 6c 69 74 65 33 53 63 68  sert( sqlite3Sch
122f0 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c  emaMutexHeld(db,
12300 20 69 64 78 2c 20 30 29 20 29 3b 0a 20 20 69 66   idx, 0) );.  if
12310 28 20 21 44 62 48 61 73 50 72 6f 70 65 72 74 79  ( !DbHasProperty
12320 28 64 62 2c 20 69 64 78 2c 20 44 42 5f 55 6e 72  (db, idx, DB_Unr
12330 65 73 65 74 56 69 65 77 73 29 20 29 20 72 65 74  esetViews) ) ret
12340 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 73 71 6c  urn;.  for(i=sql
12350 69 74 65 48 61 73 68 46 69 72 73 74 28 26 64 62  iteHashFirst(&db
12360 2d 3e 61 44 62 5b 69 64 78 5d 2e 70 53 63 68 65  ->aDb[idx].pSche
12370 6d 61 2d 3e 74 62 6c 48 61 73 68 29 3b 20 69 3b  ma->tblHash); i;
12380 69 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74  i=sqliteHashNext
12390 28 69 29 29 7b 0a 20 20 20 20 54 61 62 6c 65 20  (i)){.    Table 
123a0 2a 70 54 61 62 20 3d 20 73 71 6c 69 74 65 48 61  *pTab = sqliteHa
123b0 73 68 44 61 74 61 28 69 29 3b 0a 20 20 20 20 69  shData(i);.    i
123c0 66 28 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74  f( pTab->pSelect
123d0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
123e0 33 44 65 6c 65 74 65 43 6f 6c 75 6d 6e 4e 61 6d  3DeleteColumnNam
123f0 65 73 28 64 62 2c 20 70 54 61 62 29 3b 0a 20 20  es(db, pTab);.  
12400 20 20 20 20 70 54 61 62 2d 3e 61 43 6f 6c 20 3d      pTab->aCol =
12410 20 30 3b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e   0;.      pTab->
12420 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  nCol = 0;.    }.
12430 20 20 7d 0a 20 20 44 62 43 6c 65 61 72 50 72 6f    }.  DbClearPro
12440 70 65 72 74 79 28 64 62 2c 20 69 64 78 2c 20 44  perty(db, idx, D
12450 42 5f 55 6e 72 65 73 65 74 56 69 65 77 73 29 3b  B_UnresetViews);
12460 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  .}.#else.# defin
12470 65 20 73 71 6c 69 74 65 56 69 65 77 52 65 73 65  e sqliteViewRese
12480 74 41 6c 6c 28 41 2c 42 29 0a 23 65 6e 64 69 66  tAll(A,B).#endif
12490 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
124a0 56 49 45 57 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54  VIEW */../*.** T
124b0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
124c0 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20 56 44  called by the VD
124d0 42 45 20 74 6f 20 61 64 6a 75 73 74 20 74 68 65  BE to adjust the
124e0 20 69 6e 74 65 72 6e 61 6c 20 73 63 68 65 6d 61   internal schema
124f0 0a 2a 2a 20 75 73 65 64 20 62 79 20 53 51 4c 69  .** used by SQLi
12500 74 65 20 77 68 65 6e 20 74 68 65 20 62 74 72 65  te when the btre
12510 65 20 6c 61 79 65 72 20 6d 6f 76 65 73 20 61 20  e layer moves a 
12520 74 61 62 6c 65 20 72 6f 6f 74 20 70 61 67 65 2e  table root page.
12530 20 54 68 65 0a 2a 2a 20 72 6f 6f 74 2d 70 61 67   The.** root-pag
12540 65 20 6f 66 20 61 20 74 61 62 6c 65 20 6f 72 20  e of a table or 
12550 69 6e 64 65 78 20 69 6e 20 64 61 74 61 62 61 73  index in databas
12560 65 20 69 44 62 20 68 61 73 20 63 68 61 6e 67 65  e iDb has change
12570 64 20 66 72 6f 6d 20 69 46 72 6f 6d 0a 2a 2a 20  d from iFrom.** 
12580 74 6f 20 69 54 6f 2e 0a 2a 2a 0a 2a 2a 20 54 69  to iTo..**.** Ti
12590 63 6b 65 74 20 23 31 37 32 38 3a 20 20 54 68 65  cket #1728:  The
125a0 20 73 79 6d 62 6f 6c 20 74 61 62 6c 65 20 6d 69   symbol table mi
125b0 67 68 74 20 73 74 69 6c 6c 20 63 6f 6e 74 61 69  ght still contai
125c0 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a  n information.**
125d0 20 6f 6e 20 74 61 62 6c 65 73 20 61 6e 64 2f 6f   on tables and/o
125e0 72 20 69 6e 64 69 63 65 73 20 74 68 61 74 20 61  r indices that a
125f0 72 65 20 74 68 65 20 70 72 6f 63 65 73 73 20 6f  re the process o
12600 66 20 62 65 69 6e 67 20 64 65 6c 65 74 65 64 2e  f being deleted.
12610 0a 2a 2a 20 49 66 20 79 6f 75 20 61 72 65 20 75  .** If you are u
12620 6e 6c 75 63 6b 79 2c 20 6f 6e 65 20 6f 66 20 74  nlucky, one of t
12630 68 6f 73 65 20 64 65 6c 65 74 65 64 20 69 6e 64  hose deleted ind
12640 69 63 65 73 20 6f 72 20 74 61 62 6c 65 73 20 6d  ices or tables m
12650 69 67 68 74 0a 2a 2a 20 68 61 76 65 20 74 68 65  ight.** have the
12660 20 73 61 6d 65 20 72 6f 6f 74 70 61 67 65 20 6e   same rootpage n
12670 75 6d 62 65 72 20 61 73 20 74 68 65 20 72 65 61  umber as the rea
12680 6c 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78  l table or index
12690 20 74 68 61 74 20 69 73 0a 2a 2a 20 62 65 69 6e   that is.** bein
126a0 67 20 6d 6f 76 65 64 2e 20 20 53 6f 20 77 65 20  g moved.  So we 
126b0 63 61 6e 6e 6f 74 20 73 74 6f 70 20 73 65 61 72  cannot stop sear
126c0 63 68 69 6e 67 20 61 66 74 65 72 20 74 68 65 20  ching after the 
126d0 66 69 72 73 74 20 6d 61 74 63 68 20 0a 2a 2a 20  first match .** 
126e0 62 65 63 61 75 73 65 20 74 68 65 20 66 69 72 73  because the firs
126f0 74 20 6d 61 74 63 68 20 6d 69 67 68 74 20 62 65  t match might be
12700 20 66 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65 20   for one of the 
12710 64 65 6c 65 74 65 64 20 69 6e 64 69 63 65 73 0a  deleted indices.
12720 2a 2a 20 6f 72 20 74 61 62 6c 65 73 20 61 6e 64  ** or tables and
12730 20 6e 6f 74 20 74 68 65 20 74 61 62 6c 65 2f 69   not the table/i
12740 6e 64 65 78 20 74 68 61 74 20 69 73 20 61 63 74  ndex that is act
12750 75 61 6c 6c 79 20 62 65 69 6e 67 20 6d 6f 76 65  ually being move
12760 64 2e 0a 2a 2a 20 57 65 20 6d 75 73 74 20 63 6f  d..** We must co
12770 6e 74 69 6e 75 65 20 6c 6f 6f 70 69 6e 67 20 75  ntinue looping u
12780 6e 74 69 6c 20 61 6c 6c 20 74 61 62 6c 65 73 20  ntil all tables 
12790 61 6e 64 20 69 6e 64 69 63 65 73 20 77 69 74 68  and indices with
127a0 0a 2a 2a 20 72 6f 6f 74 70 61 67 65 3d 3d 69 46  .** rootpage==iF
127b0 72 6f 6d 20 68 61 76 65 20 62 65 65 6e 20 63 6f  rom have been co
127c0 6e 76 65 72 74 65 64 20 74 6f 20 68 61 76 65 20  nverted to have 
127d0 61 20 72 6f 6f 74 70 61 67 65 20 6f 66 20 69 54  a rootpage of iT
127e0 6f 0a 2a 2a 20 69 6e 20 6f 72 64 65 72 20 74 6f  o.** in order to
127f0 20 62 65 20 63 65 72 74 61 69 6e 20 74 68 61 74   be certain that
12800 20 77 65 20 67 6f 74 20 74 68 65 20 72 69 67 68   we got the righ
12810 74 20 6f 6e 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65  t one..*/.#ifnde
12820 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
12830 54 4f 56 41 43 55 55 4d 0a 76 6f 69 64 20 73 71  TOVACUUM.void sq
12840 6c 69 74 65 33 52 6f 6f 74 50 61 67 65 4d 6f 76  lite3RootPageMov
12850 65 64 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  ed(sqlite3 *db, 
12860 69 6e 74 20 69 44 62 2c 20 69 6e 74 20 69 46 72  int iDb, int iFr
12870 6f 6d 2c 20 69 6e 74 20 69 54 6f 29 7b 0a 20 20  om, int iTo){.  
12880 48 61 73 68 45 6c 65 6d 20 2a 70 45 6c 65 6d 3b  HashElem *pElem;
12890 0a 20 20 48 61 73 68 20 2a 70 48 61 73 68 3b 0a  .  Hash *pHash;.
128a0 20 20 44 62 20 2a 70 44 62 3b 0a 0a 20 20 61 73    Db *pDb;..  as
128b0 73 65 72 74 28 20 73 71 6c 69 74 65 33 53 63 68  sert( sqlite3Sch
128c0 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c  emaMutexHeld(db,
128d0 20 69 44 62 2c 20 30 29 20 29 3b 0a 20 20 70 44   iDb, 0) );.  pD
128e0 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 44 62  b = &db->aDb[iDb
128f0 5d 3b 0a 20 20 70 48 61 73 68 20 3d 20 26 70 44  ];.  pHash = &pD
12900 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 74 62 6c 48  b->pSchema->tblH
12910 61 73 68 3b 0a 20 20 66 6f 72 28 70 45 6c 65 6d  ash;.  for(pElem
12920 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72 73 74  =sqliteHashFirst
12930 28 70 48 61 73 68 29 3b 20 70 45 6c 65 6d 3b 20  (pHash); pElem; 
12940 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73 68  pElem=sqliteHash
12950 4e 65 78 74 28 70 45 6c 65 6d 29 29 7b 0a 20 20  Next(pElem)){.  
12960 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20    Table *pTab = 
12970 73 71 6c 69 74 65 48 61 73 68 44 61 74 61 28 70  sqliteHashData(p
12980 45 6c 65 6d 29 3b 0a 20 20 20 20 69 66 28 20 70  Elem);.    if( p
12990 54 61 62 2d 3e 74 6e 75 6d 3d 3d 69 46 72 6f 6d  Tab->tnum==iFrom
129a0 20 29 7b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e   ){.      pTab->
129b0 74 6e 75 6d 20 3d 20 69 54 6f 3b 0a 20 20 20 20  tnum = iTo;.    
129c0 7d 0a 20 20 7d 0a 20 20 70 48 61 73 68 20 3d 20  }.  }.  pHash = 
129d0 26 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 69  &pDb->pSchema->i
129e0 64 78 48 61 73 68 3b 0a 20 20 66 6f 72 28 70 45  dxHash;.  for(pE
129f0 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73 68 46 69  lem=sqliteHashFi
12a00 72 73 74 28 70 48 61 73 68 29 3b 20 70 45 6c 65  rst(pHash); pEle
12a10 6d 3b 20 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48  m; pElem=sqliteH
12a20 61 73 68 4e 65 78 74 28 70 45 6c 65 6d 29 29 7b  ashNext(pElem)){
12a30 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78  .    Index *pIdx
12a40 20 3d 20 73 71 6c 69 74 65 48 61 73 68 44 61 74   = sqliteHashDat
12a50 61 28 70 45 6c 65 6d 29 3b 0a 20 20 20 20 69 66  a(pElem);.    if
12a60 28 20 70 49 64 78 2d 3e 74 6e 75 6d 3d 3d 69 46  ( pIdx->tnum==iF
12a70 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20 70 49 64  rom ){.      pId
12a80 78 2d 3e 74 6e 75 6d 20 3d 20 69 54 6f 3b 0a 20  x->tnum = iTo;. 
12a90 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69     }.  }.}.#endi
12aa0 66 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 63  f../*.** Write c
12ab0 6f 64 65 20 74 6f 20 65 72 61 73 65 20 74 68 65  ode to erase the
12ac0 20 74 61 62 6c 65 20 77 69 74 68 20 72 6f 6f 74   table with root
12ad0 2d 70 61 67 65 20 69 54 61 62 6c 65 20 66 72 6f  -page iTable fro
12ae0 6d 20 64 61 74 61 62 61 73 65 20 69 44 62 2e 0a  m database iDb..
12af0 2a 2a 20 41 6c 73 6f 20 77 72 69 74 65 20 63 6f  ** Also write co
12b00 64 65 20 74 6f 20 6d 6f 64 69 66 79 20 74 68 65  de to modify the
12b10 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74   sqlite_master t
12b20 61 62 6c 65 20 61 6e 64 20 69 6e 74 65 72 6e 61  able and interna
12b30 6c 20 73 63 68 65 6d 61 0a 2a 2a 20 69 66 20 61  l schema.** if a
12b40 20 72 6f 6f 74 2d 70 61 67 65 20 6f 66 20 61 6e   root-page of an
12b50 6f 74 68 65 72 20 74 61 62 6c 65 20 69 73 20 6d  other table is m
12b60 6f 76 65 64 20 62 79 20 74 68 65 20 62 74 72 65  oved by the btre
12b70 65 2d 6c 61 79 65 72 20 77 68 69 6c 73 74 0a 2a  e-layer whilst.*
12b80 2a 20 65 72 61 73 69 6e 67 20 69 54 61 62 6c 65  * erasing iTable
12b90 20 28 74 68 69 73 20 63 61 6e 20 68 61 70 70 65   (this can happe
12ba0 6e 20 77 69 74 68 20 61 6e 20 61 75 74 6f 2d 76  n with an auto-v
12bb0 61 63 75 75 6d 20 64 61 74 61 62 61 73 65 29 2e  acuum database).
12bc0 0a 2a 2f 20 0a 73 74 61 74 69 63 20 76 6f 69 64  .*/ .static void
12bd0 20 64 65 73 74 72 6f 79 52 6f 6f 74 50 61 67 65   destroyRootPage
12be0 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
12bf0 69 6e 74 20 69 54 61 62 6c 65 2c 20 69 6e 74 20  int iTable, int 
12c00 69 44 62 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  iDb){.  Vdbe *v 
12c10 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
12c20 28 70 50 61 72 73 65 29 3b 0a 20 20 69 6e 74 20  (pParse);.  int 
12c30 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  r1 = sqlite3GetT
12c40 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a  empReg(pParse);.
12c50 20 20 61 73 73 65 72 74 28 20 69 54 61 62 6c 65    assert( iTable
12c60 3e 31 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  >1 );.  sqlite3V
12c70 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
12c80 44 65 73 74 72 6f 79 2c 20 69 54 61 62 6c 65 2c  Destroy, iTable,
12c90 20 72 31 2c 20 69 44 62 29 3b 0a 20 20 73 71 6c   r1, iDb);.  sql
12ca0 69 74 65 33 4d 61 79 41 62 6f 72 74 28 70 50 61  ite3MayAbort(pPa
12cb0 72 73 65 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  rse);.#ifndef SQ
12cc0 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
12cd0 43 55 55 4d 0a 20 20 2f 2a 20 4f 50 5f 44 65 73  CUUM.  /* OP_Des
12ce0 74 72 6f 79 20 73 74 6f 72 65 73 20 61 6e 20 69  troy stores an i
12cf0 6e 20 69 6e 74 65 67 65 72 20 72 31 2e 20 49 66  n integer r1. If
12d00 20 74 68 69 73 20 69 6e 74 65 67 65 72 0a 20 20   this integer.  
12d10 2a 2a 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  ** is non-zero, 
12d20 74 68 65 6e 20 69 74 20 69 73 20 74 68 65 20 72  then it is the r
12d30 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20  oot page number 
12d40 6f 66 20 61 20 74 61 62 6c 65 20 6d 6f 76 65 64  of a table moved
12d50 20 74 6f 0a 20 20 2a 2a 20 6c 6f 63 61 74 69 6f   to.  ** locatio
12d60 6e 20 69 54 61 62 6c 65 2e 20 54 68 65 20 66 6f  n iTable. The fo
12d70 6c 6c 6f 77 69 6e 67 20 63 6f 64 65 20 6d 6f 64  llowing code mod
12d80 69 66 69 65 73 20 74 68 65 20 73 71 6c 69 74 65  ifies the sqlite
12d90 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20 74 6f  _master table to
12da0 0a 20 20 2a 2a 20 72 65 66 6c 65 63 74 20 74 68  .  ** reflect th
12db0 69 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  is..  **.  ** Th
12dc0 65 20 22 23 4e 4e 4e 22 20 69 6e 20 74 68 65 20  e "#NNN" in the 
12dd0 53 51 4c 20 69 73 20 61 20 73 70 65 63 69 61 6c  SQL is a special
12de0 20 63 6f 6e 73 74 61 6e 74 20 74 68 61 74 20 6d   constant that m
12df0 65 61 6e 73 20 77 68 61 74 65 76 65 72 20 76 61  eans whatever va
12e00 6c 75 65 0a 20 20 2a 2a 20 69 73 20 69 6e 20 72  lue.  ** is in r
12e10 65 67 69 73 74 65 72 20 4e 4e 4e 2e 20 20 53 65  egister NNN.  Se
12e20 65 20 67 72 61 6d 6d 61 72 20 72 75 6c 65 73 20  e grammar rules 
12e30 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
12e40 74 68 65 20 54 4b 5f 52 45 47 49 53 54 45 52 0a  the TK_REGISTER.
12e50 20 20 2a 2a 20 74 6f 6b 65 6e 20 66 6f 72 20 61    ** token for a
12e60 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d  dditional inform
12e70 61 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 73 71  ation..  */.  sq
12e80 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72 73 65  lite3NestedParse
12e90 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 22  (pParse, .     "
12ea0 55 50 44 41 54 45 20 25 51 2e 25 73 20 53 45 54  UPDATE %Q.%s SET
12eb0 20 72 6f 6f 74 70 61 67 65 3d 25 64 20 57 48 45   rootpage=%d WHE
12ec0 52 45 20 23 25 64 20 41 4e 44 20 72 6f 6f 74 70  RE #%d AND rootp
12ed0 61 67 65 3d 23 25 64 22 2c 0a 20 20 20 20 20 70  age=#%d",.     p
12ee0 50 61 72 73 65 2d 3e 64 62 2d 3e 61 44 62 5b 69  Parse->db->aDb[i
12ef0 44 62 5d 2e 7a 44 62 53 4e 61 6d 65 2c 20 53 43  Db].zDbSName, SC
12f00 48 45 4d 41 5f 54 41 42 4c 45 28 69 44 62 29 2c  HEMA_TABLE(iDb),
12f10 20 69 54 61 62 6c 65 2c 20 72 31 2c 20 72 31 29   iTable, r1, r1)
12f20 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74  ;.#endif.  sqlit
12f30 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
12f40 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 7d 0a  (pParse, r1);.}.
12f50 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 56 44 42  ./*.** Write VDB
12f60 45 20 63 6f 64 65 20 74 6f 20 65 72 61 73 65 20  E code to erase 
12f70 74 61 62 6c 65 20 70 54 61 62 20 61 6e 64 20 61  table pTab and a
12f80 6c 6c 20 61 73 73 6f 63 69 61 74 65 64 20 69 6e  ll associated in
12f90 64 69 63 65 73 20 6f 6e 20 64 69 73 6b 2e 0a 2a  dices on disk..*
12fa0 2a 20 43 6f 64 65 20 74 6f 20 75 70 64 61 74 65  * Code to update
12fb0 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74   the sqlite_mast
12fc0 65 72 20 74 61 62 6c 65 73 20 61 6e 64 20 69 6e  er tables and in
12fd0 74 65 72 6e 61 6c 20 73 63 68 65 6d 61 20 64 65  ternal schema de
12fe0 66 69 6e 69 74 69 6f 6e 73 0a 2a 2a 20 69 6e 20  finitions.** in 
12ff0 63 61 73 65 20 61 20 72 6f 6f 74 2d 70 61 67 65  case a root-page
13000 20 62 65 6c 6f 6e 67 69 6e 67 20 74 6f 20 61 6e   belonging to an
13010 6f 74 68 65 72 20 74 61 62 6c 65 20 69 73 20 6d  other table is m
13020 6f 76 65 64 20 62 79 20 74 68 65 20 62 74 72 65  oved by the btre
13030 65 20 6c 61 79 65 72 0a 2a 2a 20 69 73 20 61 6c  e layer.** is al
13040 73 6f 20 61 64 64 65 64 20 28 74 68 69 73 20 63  so added (this c
13050 61 6e 20 68 61 70 70 65 6e 20 77 69 74 68 20 61  an happen with a
13060 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61  n auto-vacuum da
13070 74 61 62 61 73 65 29 2e 0a 2a 2f 0a 73 74 61 74  tabase)..*/.stat
13080 69 63 20 76 6f 69 64 20 64 65 73 74 72 6f 79 54  ic void destroyT
13090 61 62 6c 65 28 50 61 72 73 65 20 2a 70 50 61 72  able(Parse *pPar
130a0 73 65 2c 20 54 61 62 6c 65 20 2a 70 54 61 62 29  se, Table *pTab)
130b0 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  {.#ifdef SQLITE_
130c0 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
130d0 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20    Index *pIdx;. 
130e0 20 69 6e 74 20 69 44 62 20 3d 20 73 71 6c 69 74   int iDb = sqlit
130f0 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28  e3SchemaToIndex(
13100 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 54 61 62  pParse->db, pTab
13110 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 64 65  ->pSchema);.  de
13120 73 74 72 6f 79 52 6f 6f 74 50 61 67 65 28 70 50  stroyRootPage(pP
13130 61 72 73 65 2c 20 70 54 61 62 2d 3e 74 6e 75 6d  arse, pTab->tnum
13140 2c 20 69 44 62 29 3b 0a 20 20 66 6f 72 28 70 49  , iDb);.  for(pI
13150 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b  dx=pTab->pIndex;
13160 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78   pIdx; pIdx=pIdx
13170 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 64 65  ->pNext){.    de
13180 73 74 72 6f 79 52 6f 6f 74 50 61 67 65 28 70 50  stroyRootPage(pP
13190 61 72 73 65 2c 20 70 49 64 78 2d 3e 74 6e 75 6d  arse, pIdx->tnum
131a0 2c 20 69 44 62 29 3b 0a 20 20 7d 0a 23 65 6c 73  , iDb);.  }.#els
131b0 65 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 64 61  e.  /* If the da
131c0 74 61 62 61 73 65 20 6d 61 79 20 62 65 20 61 75  tabase may be au
131d0 74 6f 2d 76 61 63 75 75 6d 20 63 61 70 61 62 6c  to-vacuum capabl
131e0 65 20 28 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49  e (if SQLITE_OMI
131f0 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 2a  T_AUTOVACUUM.  *
13200 2a 20 69 73 20 6e 6f 74 20 64 65 66 69 6e 65 64  * is not defined
13210 29 2c 20 74 68 65 6e 20 69 74 20 69 73 20 69 6d  ), then it is im
13220 70 6f 72 74 61 6e 74 20 74 6f 20 63 61 6c 6c 20  portant to call 
13230 4f 50 5f 44 65 73 74 72 6f 79 20 6f 6e 20 74 68  OP_Destroy on th
13240 65 0a 20 20 2a 2a 20 74 61 62 6c 65 20 61 6e 64  e.  ** table and
13250 20 69 6e 64 65 78 20 72 6f 6f 74 2d 70 61 67 65   index root-page
13260 73 20 69 6e 20 6f 72 64 65 72 2c 20 73 74 61 72  s in order, star
13270 74 69 6e 67 20 77 69 74 68 20 74 68 65 20 6e 75  ting with the nu
13280 6d 65 72 69 63 61 6c 6c 79 20 0a 20 20 2a 2a 20  merically .  ** 
13290 6c 61 72 67 65 73 74 20 72 6f 6f 74 2d 70 61 67  largest root-pag
132a0 65 20 6e 75 6d 62 65 72 2e 20 54 68 69 73 20 67  e number. This g
132b0 75 61 72 61 6e 74 65 65 73 20 74 68 61 74 20 6e  uarantees that n
132c0 6f 6e 65 20 6f 66 20 74 68 65 20 72 6f 6f 74 2d  one of the root-
132d0 70 61 67 65 73 0a 20 20 2a 2a 20 74 6f 20 62 65  pages.  ** to be
132e0 20 64 65 73 74 72 6f 79 65 64 20 69 73 20 72 65   destroyed is re
132f0 6c 6f 63 61 74 65 64 20 62 79 20 61 6e 20 65 61  located by an ea
13300 72 6c 69 65 72 20 4f 50 5f 44 65 73 74 72 6f 79  rlier OP_Destroy
13310 2e 20 69 2e 65 2e 20 69 66 20 74 68 65 0a 20 20  . i.e. if the.  
13320 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 77 65 72  ** following wer
13330 65 20 63 6f 64 65 64 3a 0a 20 20 2a 2a 0a 20 20  e coded:.  **.  
13340 2a 2a 20 4f 50 5f 44 65 73 74 72 6f 79 20 34 20  ** OP_Destroy 4 
13350 30 0a 20 20 2a 2a 20 2e 2e 2e 0a 20 20 2a 2a 20  0.  ** ....  ** 
13360 4f 50 5f 44 65 73 74 72 6f 79 20 35 20 30 0a 20  OP_Destroy 5 0. 
13370 20 2a 2a 0a 20 20 2a 2a 20 61 6e 64 20 72 6f 6f   **.  ** and roo
13380 74 20 70 61 67 65 20 35 20 68 61 70 70 65 6e 65  t page 5 happene
13390 64 20 74 6f 20 62 65 20 74 68 65 20 6c 61 72 67  d to be the larg
133a0 65 73 74 20 72 6f 6f 74 2d 70 61 67 65 20 6e 75  est root-page nu
133b0 6d 62 65 72 20 69 6e 20 74 68 65 0a 20 20 2a 2a  mber in the.  **
133c0 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 6e 20   database, then 
133d0 72 6f 6f 74 20 70 61 67 65 20 35 20 77 6f 75 6c  root page 5 woul
133e0 64 20 62 65 20 6d 6f 76 65 64 20 74 6f 20 70 61  d be moved to pa
133f0 67 65 20 34 20 62 79 20 74 68 65 20 0a 20 20 2a  ge 4 by the .  *
13400 2a 20 22 4f 50 5f 44 65 73 74 72 6f 79 20 34 20  * "OP_Destroy 4 
13410 30 22 20 6f 70 63 6f 64 65 2e 20 54 68 65 20 73  0" opcode. The s
13420 75 62 73 65 71 75 65 6e 74 20 22 4f 50 5f 44 65  ubsequent "OP_De
13430 73 74 72 6f 79 20 35 20 30 22 20 77 6f 75 6c 64  stroy 5 0" would
13440 20 68 69 74 0a 20 20 2a 2a 20 61 20 66 72 65 65   hit.  ** a free
13450 2d 6c 69 73 74 20 70 61 67 65 2e 0a 20 20 2a 2f  -list page..  */
13460 0a 20 20 69 6e 74 20 69 54 61 62 20 3d 20 70 54  .  int iTab = pT
13470 61 62 2d 3e 74 6e 75 6d 3b 0a 20 20 69 6e 74 20  ab->tnum;.  int 
13480 69 44 65 73 74 72 6f 79 65 64 20 3d 20 30 3b 0a  iDestroyed = 0;.
13490 0a 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 20  .  while( 1 ){. 
134a0 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a     Index *pIdx;.
134b0 20 20 20 20 69 6e 74 20 69 4c 61 72 67 65 73 74      int iLargest
134c0 20 3d 20 30 3b 0a 0a 20 20 20 20 69 66 28 20 69   = 0;..    if( i
134d0 44 65 73 74 72 6f 79 65 64 3d 3d 30 20 7c 7c 20  Destroyed==0 || 
134e0 69 54 61 62 3c 69 44 65 73 74 72 6f 79 65 64 20  iTab<iDestroyed 
134f0 29 7b 0a 20 20 20 20 20 20 69 4c 61 72 67 65 73  ){.      iLarges
13500 74 20 3d 20 69 54 61 62 3b 0a 20 20 20 20 7d 0a  t = iTab;.    }.
13510 20 20 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61      for(pIdx=pTa
13520 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b  b->pIndex; pIdx;
13530 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78   pIdx=pIdx->pNex
13540 74 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 49  t){.      int iI
13550 64 78 20 3d 20 70 49 64 78 2d 3e 74 6e 75 6d 3b  dx = pIdx->tnum;
13560 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
13570 49 64 78 2d 3e 70 53 63 68 65 6d 61 3d 3d 70 54  Idx->pSchema==pT
13580 61 62 2d 3e 70 53 63 68 65 6d 61 20 29 3b 0a 20  ab->pSchema );. 
13590 20 20 20 20 20 69 66 28 20 28 69 44 65 73 74 72       if( (iDestr
135a0 6f 79 65 64 3d 3d 30 20 7c 7c 20 28 69 49 64 78  oyed==0 || (iIdx
135b0 3c 69 44 65 73 74 72 6f 79 65 64 29 29 20 26 26  <iDestroyed)) &&
135c0 20 69 49 64 78 3e 69 4c 61 72 67 65 73 74 20 29   iIdx>iLargest )
135d0 7b 0a 20 20 20 20 20 20 20 20 69 4c 61 72 67 65  {.        iLarge
135e0 73 74 20 3d 20 69 49 64 78 3b 0a 20 20 20 20 20  st = iIdx;.     
135f0 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
13600 20 69 4c 61 72 67 65 73 74 3d 3d 30 20 29 7b 0a   iLargest==0 ){.
13610 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20        return;.  
13620 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
13630 6e 74 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33  nt iDb = sqlite3
13640 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 70 50  SchemaToIndex(pP
13650 61 72 73 65 2d 3e 64 62 2c 20 70 54 61 62 2d 3e  arse->db, pTab->
13660 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 20 20  pSchema);.      
13670 61 73 73 65 72 74 28 20 69 44 62 3e 3d 30 20 26  assert( iDb>=0 &
13680 26 20 69 44 62 3c 70 50 61 72 73 65 2d 3e 64 62  & iDb<pParse->db
13690 2d 3e 6e 44 62 20 29 3b 0a 20 20 20 20 20 20 64  ->nDb );.      d
136a0 65 73 74 72 6f 79 52 6f 6f 74 50 61 67 65 28 70  estroyRootPage(p
136b0 50 61 72 73 65 2c 20 69 4c 61 72 67 65 73 74 2c  Parse, iLargest,
136c0 20 69 44 62 29 3b 0a 20 20 20 20 20 20 69 44 65   iDb);.      iDe
136d0 73 74 72 6f 79 65 64 20 3d 20 69 4c 61 72 67 65  stroyed = iLarge
136e0 73 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65  st;.    }.  }.#e
136f0 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  ndif.}../*.** Re
13700 6d 6f 76 65 20 65 6e 74 72 69 65 73 20 66 72 6f  move entries fro
13710 6d 20 74 68 65 20 73 71 6c 69 74 65 5f 73 74 61  m the sqlite_sta
13720 74 4e 20 74 61 62 6c 65 73 20 28 66 6f 72 20 4e  tN tables (for N
13730 20 69 6e 20 28 31 2c 32 2c 33 29 29 0a 2a 2a 20   in (1,2,3)).** 
13740 61 66 74 65 72 20 61 20 44 52 4f 50 20 49 4e 44  after a DROP IND
13750 45 58 20 6f 72 20 44 52 4f 50 20 54 41 42 4c 45  EX or DROP TABLE
13760 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2f 0a 73 74 61   command..*/.sta
13770 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65 33  tic void sqlite3
13780 43 6c 65 61 72 53 74 61 74 54 61 62 6c 65 73 28  ClearStatTables(
13790 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
137a0 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ,         /* The
137b0 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   parsing context
137c0 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62 2c 20 20   */.  int iDb,  
137d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
137e0 54 68 65 20 64 61 74 61 62 61 73 65 20 6e 75 6d  The database num
137f0 62 65 72 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ber */.  const c
13800 68 61 72 20 2a 7a 54 79 70 65 2c 20 20 20 20 20  har *zType,     
13810 2f 2a 20 22 69 64 78 22 20 6f 72 20 22 74 62 6c  /* "idx" or "tbl
13820 22 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  " */.  const cha
13830 72 20 2a 7a 4e 61 6d 65 20 20 20 20 20 20 2f 2a  r *zName      /*
13840 20 4e 61 6d 65 20 6f 66 20 69 6e 64 65 78 20 6f   Name of index o
13850 72 20 74 61 62 6c 65 20 2a 2f 0a 29 7b 0a 20 20  r table */.){.  
13860 69 6e 74 20 69 3b 0a 20 20 63 6f 6e 73 74 20 63  int i;.  const c
13870 68 61 72 20 2a 7a 44 62 4e 61 6d 65 20 3d 20 70  har *zDbName = p
13880 50 61 72 73 65 2d 3e 64 62 2d 3e 61 44 62 5b 69  Parse->db->aDb[i
13890 44 62 5d 2e 7a 44 62 53 4e 61 6d 65 3b 0a 20 20  Db].zDbSName;.  
138a0 66 6f 72 28 69 3d 31 3b 20 69 3c 3d 34 3b 20 69  for(i=1; i<=4; i
138b0 2b 2b 29 7b 0a 20 20 20 20 63 68 61 72 20 7a 54  ++){.    char zT
138c0 61 62 5b 32 34 5d 3b 0a 20 20 20 20 73 71 6c 69  ab[24];.    sqli
138d0 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a  te3_snprintf(siz
138e0 65 6f 66 28 7a 54 61 62 29 2c 7a 54 61 62 2c 22  eof(zTab),zTab,"
138f0 73 71 6c 69 74 65 5f 73 74 61 74 25 64 22 2c 69  sqlite_stat%d",i
13900 29 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  );.    if( sqlit
13910 65 33 46 69 6e 64 54 61 62 6c 65 28 70 50 61 72  e3FindTable(pPar
13920 73 65 2d 3e 64 62 2c 20 7a 54 61 62 2c 20 7a 44  se->db, zTab, zD
13930 62 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 20 20  bName) ){.      
13940 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72  sqlite3NestedPar
13950 73 65 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20  se(pParse,.     
13960 20 20 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20     "DELETE FROM 
13970 25 51 2e 25 73 20 57 48 45 52 45 20 25 73 3d 25  %Q.%s WHERE %s=%
13980 51 22 2c 0a 20 20 20 20 20 20 20 20 7a 44 62 4e  Q",.        zDbN
13990 61 6d 65 2c 20 7a 54 61 62 2c 20 7a 54 79 70 65  ame, zTab, zType
139a0 2c 20 7a 4e 61 6d 65 0a 20 20 20 20 20 20 29 3b  , zName.      );
139b0 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
139c0 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
139d0 65 20 74 6f 20 64 72 6f 70 20 61 20 74 61 62 6c  e to drop a tabl
139e0 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  e..*/.void sqlit
139f0 65 33 43 6f 64 65 44 72 6f 70 54 61 62 6c 65 28  e3CodeDropTable(
13a00 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54  Parse *pParse, T
13a10 61 62 6c 65 20 2a 70 54 61 62 2c 20 69 6e 74 20  able *pTab, int 
13a20 69 44 62 2c 20 69 6e 74 20 69 73 56 69 65 77 29  iDb, int isView)
13a30 7b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 73  {.  Vdbe *v;.  s
13a40 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
13a50 72 73 65 2d 3e 64 62 3b 0a 20 20 54 72 69 67 67  rse->db;.  Trigg
13a60 65 72 20 2a 70 54 72 69 67 67 65 72 3b 0a 20 20  er *pTrigger;.  
13a70 44 62 20 2a 70 44 62 20 3d 20 26 64 62 2d 3e 61  Db *pDb = &db->a
13a80 44 62 5b 69 44 62 5d 3b 0a 0a 20 20 76 20 3d 20  Db[iDb];..  v = 
13a90 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
13aa0 50 61 72 73 65 29 3b 0a 20 20 61 73 73 65 72 74  Parse);.  assert
13ab0 28 20 76 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69  ( v!=0 );.  sqli
13ac0 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65  te3BeginWriteOpe
13ad0 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 31  ration(pParse, 1
13ae0 2c 20 69 44 62 29 3b 0a 0a 23 69 66 6e 64 65 66  , iDb);..#ifndef
13af0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
13b00 54 55 41 4c 54 41 42 4c 45 0a 20 20 69 66 28 20  TUALTABLE.  if( 
13b10 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20  IsVirtual(pTab) 
13b20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
13b30 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 56  beAddOp0(v, OP_V
13b40 42 65 67 69 6e 29 3b 0a 20 20 7d 0a 23 65 6e 64  Begin);.  }.#end
13b50 69 66 0a 0a 20 20 2f 2a 20 44 72 6f 70 20 61 6c  if..  /* Drop al
13b60 6c 20 74 72 69 67 67 65 72 73 20 61 73 73 6f 63  l triggers assoc
13b70 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20 74  iated with the t
13b80 61 62 6c 65 20 62 65 69 6e 67 20 64 72 6f 70 70  able being dropp
13b90 65 64 2e 20 43 6f 64 65 0a 20 20 2a 2a 20 69 73  ed. Code.  ** is
13ba0 20 67 65 6e 65 72 61 74 65 64 20 74 6f 20 72 65   generated to re
13bb0 6d 6f 76 65 20 65 6e 74 72 69 65 73 20 66 72 6f  move entries fro
13bc0 6d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  m sqlite_master 
13bd0 61 6e 64 2f 6f 72 0a 20 20 2a 2a 20 73 71 6c 69  and/or.  ** sqli
13be0 74 65 5f 74 65 6d 70 5f 6d 61 73 74 65 72 20 69  te_temp_master i
13bf0 66 20 72 65 71 75 69 72 65 64 2e 0a 20 20 2a 2f  f required..  */
13c00 0a 20 20 70 54 72 69 67 67 65 72 20 3d 20 73 71  .  pTrigger = sq
13c10 6c 69 74 65 33 54 72 69 67 67 65 72 4c 69 73 74  lite3TriggerList
13c20 28 70 50 61 72 73 65 2c 20 70 54 61 62 29 3b 0a  (pParse, pTab);.
13c30 20 20 77 68 69 6c 65 28 20 70 54 72 69 67 67 65    while( pTrigge
13c40 72 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  r ){.    assert(
13c50 20 70 54 72 69 67 67 65 72 2d 3e 70 53 63 68 65   pTrigger->pSche
13c60 6d 61 3d 3d 70 54 61 62 2d 3e 70 53 63 68 65 6d  ma==pTab->pSchem
13c70 61 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 70 54  a || .        pT
13c80 72 69 67 67 65 72 2d 3e 70 53 63 68 65 6d 61 3d  rigger->pSchema=
13c90 3d 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 53 63 68  =db->aDb[1].pSch
13ca0 65 6d 61 20 29 3b 0a 20 20 20 20 73 71 6c 69 74  ema );.    sqlit
13cb0 65 33 44 72 6f 70 54 72 69 67 67 65 72 50 74 72  e3DropTriggerPtr
13cc0 28 70 50 61 72 73 65 2c 20 70 54 72 69 67 67 65  (pParse, pTrigge
13cd0 72 29 3b 0a 20 20 20 20 70 54 72 69 67 67 65 72  r);.    pTrigger
13ce0 20 3d 20 70 54 72 69 67 67 65 72 2d 3e 70 4e 65   = pTrigger->pNe
13cf0 78 74 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66  xt;.  }..#ifndef
13d00 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
13d10 4f 49 4e 43 52 45 4d 45 4e 54 0a 20 20 2f 2a 20  OINCREMENT.  /* 
13d20 52 65 6d 6f 76 65 20 61 6e 79 20 65 6e 74 72 69  Remove any entri
13d30 65 73 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65  es of the sqlite
13d40 5f 73 65 71 75 65 6e 63 65 20 74 61 62 6c 65 20  _sequence table 
13d50 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 0a  associated with.
13d60 20 20 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 62    ** the table b
13d70 65 69 6e 67 20 64 72 6f 70 70 65 64 2e 20 54 68  eing dropped. Th
13d80 69 73 20 69 73 20 64 6f 6e 65 20 62 65 66 6f 72  is is done befor
13d90 65 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 64  e the table is d
13da0 72 6f 70 70 65 64 0a 20 20 2a 2a 20 61 74 20 74  ropped.  ** at t
13db0 68 65 20 62 74 72 65 65 20 6c 65 76 65 6c 2c 20  he btree level, 
13dc0 69 6e 20 63 61 73 65 20 74 68 65 20 73 71 6c 69  in case the sqli
13dd0 74 65 5f 73 65 71 75 65 6e 63 65 20 74 61 62 6c  te_sequence tabl
13de0 65 20 6e 65 65 64 73 20 74 6f 0a 20 20 2a 2a 20  e needs to.  ** 
13df0 6d 6f 76 65 20 61 73 20 61 20 72 65 73 75 6c 74  move as a result
13e00 20 6f 66 20 74 68 65 20 64 72 6f 70 20 28 63 61   of the drop (ca
13e10 6e 20 68 61 70 70 65 6e 20 69 6e 20 61 75 74 6f  n happen in auto
13e20 2d 76 61 63 75 75 6d 20 6d 6f 64 65 29 2e 0a 20  -vacuum mode).. 
13e30 20 2a 2f 0a 20 20 69 66 28 20 70 54 61 62 2d 3e   */.  if( pTab->
13e40 74 61 62 46 6c 61 67 73 20 26 20 54 46 5f 41 75  tabFlags & TF_Au
13e50 74 6f 69 6e 63 72 65 6d 65 6e 74 20 29 7b 0a 20  toincrement ){. 
13e60 20 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64     sqlite3Nested
13e70 50 61 72 73 65 28 70 50 61 72 73 65 2c 0a 20 20  Parse(pParse,.  
13e80 20 20 20 20 22 44 45 4c 45 54 45 20 46 52 4f 4d      "DELETE FROM
13e90 20 25 51 2e 73 71 6c 69 74 65 5f 73 65 71 75 65   %Q.sqlite_seque
13ea0 6e 63 65 20 57 48 45 52 45 20 6e 61 6d 65 3d 25  nce WHERE name=%
13eb0 51 22 2c 0a 20 20 20 20 20 20 70 44 62 2d 3e 7a  Q",.      pDb->z
13ec0 44 62 53 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 7a  DbSName, pTab->z
13ed0 4e 61 6d 65 0a 20 20 20 20 29 3b 0a 20 20 7d 0a  Name.    );.  }.
13ee0 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 44 72 6f  #endif..  /* Dro
13ef0 70 20 61 6c 6c 20 53 51 4c 49 54 45 5f 4d 41 53  p all SQLITE_MAS
13f00 54 45 52 20 74 61 62 6c 65 20 61 6e 64 20 69 6e  TER table and in
13f10 64 65 78 20 65 6e 74 72 69 65 73 20 74 68 61 74  dex entries that
13f20 20 72 65 66 65 72 20 74 6f 20 74 68 65 0a 20 20   refer to the.  
13f30 2a 2a 20 74 61 62 6c 65 2e 20 54 68 65 20 70 72  ** table. The pr
13f40 6f 67 72 61 6d 20 6e 61 6d 65 20 6c 6f 6f 70 73  ogram name loops
13f50 20 74 68 72 6f 75 67 68 20 74 68 65 20 6d 61 73   through the mas
13f60 74 65 72 20 74 61 62 6c 65 20 61 6e 64 20 64 65  ter table and de
13f70 6c 65 74 65 73 0a 20 20 2a 2a 20 65 76 65 72 79  letes.  ** every
13f80 20 72 6f 77 20 74 68 61 74 20 72 65 66 65 72 73   row that refers
13f90 20 74 6f 20 61 20 74 61 62 6c 65 20 6f 66 20 74   to a table of t
13fa0 68 65 20 73 61 6d 65 20 6e 61 6d 65 20 61 73 20  he same name as 
13fb0 74 68 65 20 6f 6e 65 20 62 65 69 6e 67 0a 20 20  the one being.  
13fc0 2a 2a 20 64 72 6f 70 70 65 64 2e 20 54 72 69 67  ** dropped. Trig
13fd0 67 65 72 73 20 61 72 65 20 68 61 6e 64 6c 65 64  gers are handled
13fe0 20 73 65 70 61 72 61 74 65 6c 79 20 62 65 63 61   separately beca
13ff0 75 73 65 20 61 20 74 72 69 67 67 65 72 20 63 61  use a trigger ca
14000 6e 20 62 65 0a 20 20 2a 2a 20 63 72 65 61 74 65  n be.  ** create
14010 64 20 69 6e 20 74 68 65 20 74 65 6d 70 20 64 61  d in the temp da
14020 74 61 62 61 73 65 20 74 68 61 74 20 72 65 66 65  tabase that refe
14030 72 73 20 74 6f 20 61 20 74 61 62 6c 65 20 69 6e  rs to a table in
14040 20 61 6e 6f 74 68 65 72 0a 20 20 2a 2a 20 64 61   another.  ** da
14050 74 61 62 61 73 65 2e 0a 20 20 2a 2f 0a 20 20 73  tabase..  */.  s
14060 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72 73  qlite3NestedPars
14070 65 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20  e(pParse, .     
14080 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 25 51   "DELETE FROM %Q
14090 2e 25 73 20 57 48 45 52 45 20 74 62 6c 5f 6e 61  .%s WHERE tbl_na
140a0 6d 65 3d 25 51 20 61 6e 64 20 74 79 70 65 21 3d  me=%Q and type!=
140b0 27 74 72 69 67 67 65 72 27 22 2c 0a 20 20 20 20  'trigger'",.    
140c0 20 20 70 44 62 2d 3e 7a 44 62 53 4e 61 6d 65 2c    pDb->zDbSName,
140d0 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 44   SCHEMA_TABLE(iD
140e0 62 29 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29  b), pTab->zName)
140f0 3b 0a 20 20 69 66 28 20 21 69 73 56 69 65 77 20  ;.  if( !isView 
14100 26 26 20 21 49 73 56 69 72 74 75 61 6c 28 70 54  && !IsVirtual(pT
14110 61 62 29 20 29 7b 0a 20 20 20 20 64 65 73 74 72  ab) ){.    destr
14120 6f 79 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20  oyTable(pParse, 
14130 70 54 61 62 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  pTab);.  }..  /*
14140 20 52 65 6d 6f 76 65 20 74 68 65 20 74 61 62 6c   Remove the tabl
14150 65 20 65 6e 74 72 79 20 66 72 6f 6d 20 53 51 4c  e entry from SQL
14160 69 74 65 27 73 20 69 6e 74 65 72 6e 61 6c 20 73  ite's internal s
14170 63 68 65 6d 61 20 61 6e 64 20 6d 6f 64 69 66 79  chema and modify
14180 0a 20 20 2a 2a 20 74 68 65 20 73 63 68 65 6d 61  .  ** the schema
14190 20 63 6f 6f 6b 69 65 2e 0a 20 20 2a 2f 0a 20 20   cookie..  */.  
141a0 69 66 28 20 49 73 56 69 72 74 75 61 6c 28 70 54  if( IsVirtual(pT
141b0 61 62 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ab) ){.    sqlit
141c0 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
141d0 4f 50 5f 56 44 65 73 74 72 6f 79 2c 20 69 44 62  OP_VDestroy, iDb
141e0 2c 20 30 2c 20 30 2c 20 70 54 61 62 2d 3e 7a 4e  , 0, 0, pTab->zN
141f0 61 6d 65 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 73  ame, 0);.  }.  s
14200 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
14210 28 76 2c 20 4f 50 5f 44 72 6f 70 54 61 62 6c 65  (v, OP_DropTable
14220 2c 20 69 44 62 2c 20 30 2c 20 30 2c 20 70 54 61  , iDb, 0, 0, pTa
14230 62 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20  b->zName, 0);.  
14240 73 71 6c 69 74 65 33 43 68 61 6e 67 65 43 6f 6f  sqlite3ChangeCoo
14250 6b 69 65 28 70 50 61 72 73 65 2c 20 69 44 62 29  kie(pParse, iDb)
14260 3b 0a 20 20 73 71 6c 69 74 65 56 69 65 77 52 65  ;.  sqliteViewRe
14270 73 65 74 41 6c 6c 28 64 62 2c 20 69 44 62 29 3b  setAll(db, iDb);
14280 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
14290 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
142a0 20 74 6f 20 64 6f 20 74 68 65 20 77 6f 72 6b 20   to do the work 
142b0 6f 66 20 61 20 44 52 4f 50 20 54 41 42 4c 45 20  of a DROP TABLE 
142c0 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 70 4e  statement..** pN
142d0 61 6d 65 20 69 73 20 74 68 65 20 6e 61 6d 65 20  ame is the name 
142e0 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20  of the table to 
142f0 62 65 20 64 72 6f 70 70 65 64 2e 0a 2a 2f 0a 76  be dropped..*/.v
14300 6f 69 64 20 73 71 6c 69 74 65 33 44 72 6f 70 54  oid sqlite3DropT
14310 61 62 6c 65 28 50 61 72 73 65 20 2a 70 50 61 72  able(Parse *pPar
14320 73 65 2c 20 53 72 63 4c 69 73 74 20 2a 70 4e 61  se, SrcList *pNa
14330 6d 65 2c 20 69 6e 74 20 69 73 56 69 65 77 2c 20  me, int isView, 
14340 69 6e 74 20 6e 6f 45 72 72 29 7b 0a 20 20 54 61  int noErr){.  Ta
14350 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 56 64 62  ble *pTab;.  Vdb
14360 65 20 2a 76 3b 0a 20 20 73 71 6c 69 74 65 33 20  e *v;.  sqlite3 
14370 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
14380 3b 0a 20 20 69 6e 74 20 69 44 62 3b 0a 0a 20 20  ;.  int iDb;..  
14390 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
143a0 69 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f  iled ){.    goto
143b0 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65   exit_drop_table
143c0 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
143d0 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 20  pParse->nErr==0 
143e0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4e 61  );.  assert( pNa
143f0 6d 65 2d 3e 6e 53 72 63 3d 3d 31 20 29 3b 0a 20  me->nSrc==1 );. 
14400 20 69 66 28 20 73 71 6c 69 74 65 33 52 65 61 64   if( sqlite3Read
14410 53 63 68 65 6d 61 28 70 50 61 72 73 65 29 20 29  Schema(pParse) )
14420 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f   goto exit_drop_
14430 74 61 62 6c 65 3b 0a 20 20 69 66 28 20 6e 6f 45  table;.  if( noE
14440 72 72 20 29 20 64 62 2d 3e 73 75 70 70 72 65 73  rr ) db->suppres
14450 73 45 72 72 2b 2b 3b 0a 20 20 61 73 73 65 72 74  sErr++;.  assert
14460 28 20 69 73 56 69 65 77 3d 3d 30 20 7c 7c 20 69  ( isView==0 || i
14470 73 56 69 65 77 3d 3d 4c 4f 43 41 54 45 5f 56 49  sView==LOCATE_VI
14480 45 57 20 29 3b 0a 20 20 70 54 61 62 20 3d 20 73  EW );.  pTab = s
14490 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62 6c  qlite3LocateTabl
144a0 65 49 74 65 6d 28 70 50 61 72 73 65 2c 20 69 73  eItem(pParse, is
144b0 56 69 65 77 2c 20 26 70 4e 61 6d 65 2d 3e 61 5b  View, &pName->a[
144c0 30 5d 29 3b 0a 20 20 69 66 28 20 6e 6f 45 72 72  0]);.  if( noErr
144d0 20 29 20 64 62 2d 3e 73 75 70 70 72 65 73 73 45   ) db->suppressE
144e0 72 72 2d 2d 3b 0a 0a 20 20 69 66 28 20 70 54 61  rr--;..  if( pTa
144f0 62 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  b==0 ){.    if( 
14500 6e 6f 45 72 72 20 29 20 73 71 6c 69 74 65 33 43  noErr ) sqlite3C
14510 6f 64 65 56 65 72 69 66 79 4e 61 6d 65 64 53 63  odeVerifyNamedSc
14520 68 65 6d 61 28 70 50 61 72 73 65 2c 20 70 4e 61  hema(pParse, pNa
14530 6d 65 2d 3e 61 5b 30 5d 2e 7a 44 61 74 61 62 61  me->a[0].zDataba
14540 73 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78  se);.    goto ex
14550 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20  it_drop_table;. 
14560 20 7d 0a 20 20 69 44 62 20 3d 20 73 71 6c 69 74   }.  iDb = sqlit
14570 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28  e3SchemaToIndex(
14580 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d  db, pTab->pSchem
14590 61 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 44  a);.  assert( iD
145a0 62 3e 3d 30 20 26 26 20 69 44 62 3c 64 62 2d 3e  b>=0 && iDb<db->
145b0 6e 44 62 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  nDb );..  /* If 
145c0 70 54 61 62 20 69 73 20 61 20 76 69 72 74 75 61  pTab is a virtua
145d0 6c 20 74 61 62 6c 65 2c 20 63 61 6c 6c 20 56 69  l table, call Vi
145e0 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73  ewGetColumnNames
145f0 28 29 20 74 6f 20 65 6e 73 75 72 65 0a 20 20 2a  () to ensure.  *
14600 2a 20 69 74 20 69 73 20 69 6e 69 74 69 61 6c 69  * it is initiali
14610 7a 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  zed..  */.  if( 
14620 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20  IsVirtual(pTab) 
14630 26 26 20 73 71 6c 69 74 65 33 56 69 65 77 47 65  && sqlite3ViewGe
14640 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61  tColumnNames(pPa
14650 72 73 65 2c 20 70 54 61 62 29 20 29 7b 0a 20 20  rse, pTab) ){.  
14660 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70    goto exit_drop
14670 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 23 69 66 6e  _table;.  }.#ifn
14680 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
14690 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20  AUTHORIZATION.  
146a0 7b 0a 20 20 20 20 69 6e 74 20 63 6f 64 65 3b 0a  {.    int code;.
146b0 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
146c0 7a 54 61 62 20 3d 20 53 43 48 45 4d 41 5f 54 41  zTab = SCHEMA_TA
146d0 42 4c 45 28 69 44 62 29 3b 0a 20 20 20 20 63 6f  BLE(iDb);.    co
146e0 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 20 3d 20  nst char *zDb = 
146f0 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 44 62  db->aDb[iDb].zDb
14700 53 4e 61 6d 65 3b 0a 20 20 20 20 63 6f 6e 73 74  SName;.    const
14710 20 63 68 61 72 20 2a 7a 41 72 67 32 20 3d 20 30   char *zArg2 = 0
14720 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
14730 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73  3AuthCheck(pPars
14740 65 2c 20 53 51 4c 49 54 45 5f 44 45 4c 45 54 45  e, SQLITE_DELETE
14750 2c 20 7a 54 61 62 2c 20 30 2c 20 7a 44 62 29 29  , zTab, 0, zDb))
14760 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69  {.      goto exi
14770 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20  t_drop_table;.  
14780 20 20 7d 0a 20 20 20 20 69 66 28 20 69 73 56 69    }.    if( isVi
14790 65 77 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ew ){.      if( 
147a0 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26 26 20  !OMIT_TEMPDB && 
147b0 69 44 62 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20  iDb==1 ){.      
147c0 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f    code = SQLITE_
147d0 44 52 4f 50 5f 54 45 4d 50 5f 56 49 45 57 3b 0a  DROP_TEMP_VIEW;.
147e0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
147f0 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49       code = SQLI
14800 54 45 5f 44 52 4f 50 5f 56 49 45 57 3b 0a 20 20  TE_DROP_VIEW;.  
14810 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51      }.#ifndef SQ
14820 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
14830 4c 54 41 42 4c 45 0a 20 20 20 20 7d 65 6c 73 65  LTABLE.    }else
14840 20 69 66 28 20 49 73 56 69 72 74 75 61 6c 28 70   if( IsVirtual(p
14850 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20 63 6f  Tab) ){.      co
14860 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50  de = SQLITE_DROP
14870 5f 56 54 41 42 4c 45 3b 0a 20 20 20 20 20 20 7a  _VTABLE;.      z
14880 41 72 67 32 20 3d 20 73 71 6c 69 74 65 33 47 65  Arg2 = sqlite3Ge
14890 74 56 54 61 62 6c 65 28 64 62 2c 20 70 54 61 62  tVTable(db, pTab
148a0 29 2d 3e 70 4d 6f 64 2d 3e 7a 4e 61 6d 65 3b 0a  )->pMod->zName;.
148b0 23 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c 73 65  #endif.    }else
148c0 7b 0a 20 20 20 20 20 20 69 66 28 20 21 4f 4d 49  {.      if( !OMI
148d0 54 5f 54 45 4d 50 44 42 20 26 26 20 69 44 62 3d  T_TEMPDB && iDb=
148e0 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f  =1 ){.        co
148f0 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50  de = SQLITE_DROP
14900 5f 54 45 4d 50 5f 54 41 42 4c 45 3b 0a 20 20 20  _TEMP_TABLE;.   
14910 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
14920 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f    code = SQLITE_
14930 44 52 4f 50 5f 54 41 42 4c 45 3b 0a 20 20 20 20  DROP_TABLE;.    
14940 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
14950 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65  ( sqlite3AuthChe
14960 63 6b 28 70 50 61 72 73 65 2c 20 63 6f 64 65 2c  ck(pParse, code,
14970 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 41   pTab->zName, zA
14980 72 67 32 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20  rg2, zDb) ){.   
14990 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f     goto exit_dro
149a0 70 5f 74 61 62 6c 65 3b 0a 20 20 20 20 7d 0a 20  p_table;.    }. 
149b0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75     if( sqlite3Au
149c0 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  thCheck(pParse, 
149d0 53 51 4c 49 54 45 5f 44 45 4c 45 54 45 2c 20 70  SQLITE_DELETE, p
149e0 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 30 2c 20 7a  Tab->zName, 0, z
149f0 44 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  Db) ){.      got
14a00 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c  o exit_drop_tabl
14a10 65 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  e;.    }.  }.#en
14a20 64 69 66 0a 20 20 69 66 28 20 73 71 6c 69 74 65  dif.  if( sqlite
14a30 33 53 74 72 4e 49 43 6d 70 28 70 54 61 62 2d 3e  3StrNICmp(pTab->
14a40 7a 4e 61 6d 65 2c 20 22 73 71 6c 69 74 65 5f 22  zName, "sqlite_"
14a50 2c 20 37 29 3d 3d 30 20 0a 20 20 20 20 26 26 20  , 7)==0 .    && 
14a60 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28  sqlite3StrNICmp(
14a70 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 22 73 71  pTab->zName, "sq
14a80 6c 69 74 65 5f 73 74 61 74 22 2c 20 31 31 29 21  lite_stat", 11)!
14a90 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
14aa0 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
14ab0 2c 20 22 74 61 62 6c 65 20 25 73 20 6d 61 79 20  , "table %s may 
14ac0 6e 6f 74 20 62 65 20 64 72 6f 70 70 65 64 22 2c  not be dropped",
14ad0 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20   pTab->zName);. 
14ae0 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f     goto exit_dro
14af0 70 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 0a 23 69  p_table;.  }..#i
14b00 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
14b10 54 5f 56 49 45 57 0a 20 20 2f 2a 20 45 6e 73 75  T_VIEW.  /* Ensu
14b20 72 65 20 44 52 4f 50 20 54 41 42 4c 45 20 69 73  re DROP TABLE is
14b30 20 6e 6f 74 20 75 73 65 64 20 6f 6e 20 61 20 76   not used on a v
14b40 69 65 77 2c 20 61 6e 64 20 44 52 4f 50 20 56 49  iew, and DROP VI
14b50 45 57 20 69 73 20 6e 6f 74 20 75 73 65 64 0a 20  EW is not used. 
14b60 20 2a 2a 20 6f 6e 20 61 20 74 61 62 6c 65 2e 0a   ** on a table..
14b70 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 56 69 65    */.  if( isVie
14b80 77 20 26 26 20 70 54 61 62 2d 3e 70 53 65 6c 65  w && pTab->pSele
14b90 63 74 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  ct==0 ){.    sql
14ba0 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
14bb0 72 73 65 2c 20 22 75 73 65 20 44 52 4f 50 20 54  rse, "use DROP T
14bc0 41 42 4c 45 20 74 6f 20 64 65 6c 65 74 65 20 74  ABLE to delete t
14bd0 61 62 6c 65 20 25 73 22 2c 20 70 54 61 62 2d 3e  able %s", pTab->
14be0 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f  zName);.    goto
14bf0 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65   exit_drop_table
14c00 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 69 73 56  ;.  }.  if( !isV
14c10 69 65 77 20 26 26 20 70 54 61 62 2d 3e 70 53 65  iew && pTab->pSe
14c20 6c 65 63 74 20 29 7b 0a 20 20 20 20 73 71 6c 69  lect ){.    sqli
14c30 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
14c40 73 65 2c 20 22 75 73 65 20 44 52 4f 50 20 56 49  se, "use DROP VI
14c50 45 57 20 74 6f 20 64 65 6c 65 74 65 20 76 69 65  EW to delete vie
14c60 77 20 25 73 22 2c 20 70 54 61 62 2d 3e 7a 4e 61  w %s", pTab->zNa
14c70 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78  me);.    goto ex
14c80 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20  it_drop_table;. 
14c90 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
14ca0 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  Generate code to
14cb0 20 72 65 6d 6f 76 65 20 74 68 65 20 74 61 62 6c   remove the tabl
14cc0 65 20 66 72 6f 6d 20 74 68 65 20 6d 61 73 74 65  e from the maste
14cd0 72 20 74 61 62 6c 65 0a 20 20 2a 2a 20 6f 6e 20  r table.  ** on 
14ce0 64 69 73 6b 2e 0a 20 20 2a 2f 0a 20 20 76 20 3d  disk..  */.  v =
14cf0 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
14d00 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76  pParse);.  if( v
14d10 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42   ){.    sqlite3B
14d20 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69  eginWriteOperati
14d30 6f 6e 28 70 50 61 72 73 65 2c 20 31 2c 20 69 44  on(pParse, 1, iD
14d40 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 43  b);.    sqlite3C
14d50 6c 65 61 72 53 74 61 74 54 61 62 6c 65 73 28 70  learStatTables(p
14d60 50 61 72 73 65 2c 20 69 44 62 2c 20 22 74 62 6c  Parse, iDb, "tbl
14d70 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b  ", pTab->zName);
14d80 0a 20 20 20 20 73 71 6c 69 74 65 33 46 6b 44 72  .    sqlite3FkDr
14d90 6f 70 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20  opTable(pParse, 
14da0 70 4e 61 6d 65 2c 20 70 54 61 62 29 3b 0a 20 20  pName, pTab);.  
14db0 20 20 73 71 6c 69 74 65 33 43 6f 64 65 44 72 6f    sqlite3CodeDro
14dc0 70 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70  pTable(pParse, p
14dd0 54 61 62 2c 20 69 44 62 2c 20 69 73 56 69 65 77  Tab, iDb, isView
14de0 29 3b 0a 20 20 7d 0a 0a 65 78 69 74 5f 64 72 6f  );.  }..exit_dro
14df0 70 5f 74 61 62 6c 65 3a 0a 20 20 73 71 6c 69 74  p_table:.  sqlit
14e00 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28  e3SrcListDelete(
14e10 64 62 2c 20 70 4e 61 6d 65 29 3b 0a 7d 0a 0a 2f  db, pName);.}../
14e20 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
14e30 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 63  e is called to c
14e40 72 65 61 74 65 20 61 20 6e 65 77 20 66 6f 72 65  reate a new fore
14e50 69 67 6e 20 6b 65 79 20 6f 6e 20 74 68 65 20 74  ign key on the t
14e60 61 62 6c 65 0a 2a 2a 20 63 75 72 72 65 6e 74 6c  able.** currentl
14e70 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63  y under construc
14e80 74 69 6f 6e 2e 20 20 70 46 72 6f 6d 43 6f 6c 20  tion.  pFromCol 
14e90 64 65 74 65 72 6d 69 6e 65 73 20 77 68 69 63 68  determines which
14ea0 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 69 6e 20 74   columns.** in t
14eb0 68 65 20 63 75 72 72 65 6e 74 20 74 61 62 6c 65  he current table
14ec0 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 66 6f   point to the fo
14ed0 72 65 69 67 6e 20 6b 65 79 2e 20 20 49 66 20 70  reign key.  If p
14ee0 46 72 6f 6d 43 6f 6c 3d 3d 30 20 74 68 65 6e 0a  FromCol==0 then.
14ef0 2a 2a 20 63 6f 6e 6e 65 63 74 20 74 68 65 20 6b  ** connect the k
14f00 65 79 20 74 6f 20 74 68 65 20 6c 61 73 74 20 63  ey to the last c
14f10 6f 6c 75 6d 6e 20 69 6e 73 65 72 74 65 64 2e 20  olumn inserted. 
14f20 20 70 54 6f 20 69 73 20 74 68 65 20 6e 61 6d 65   pTo is the name
14f30 20 6f 66 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65   of.** the table
14f40 20 72 65 66 65 72 72 65 64 20 74 6f 20 28 61 2e   referred to (a.
14f50 6b 2e 61 20 74 68 65 20 22 70 61 72 65 6e 74 22  k.a the "parent"
14f60 20 74 61 62 6c 65 29 2e 20 20 70 54 6f 43 6f 6c   table).  pToCol
14f70 20 69 73 20 61 20 6c 69 73 74 0a 2a 2a 20 6f 66   is a list.** of
14f80 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20 70   tables in the p
14f90 61 72 65 6e 74 20 70 54 6f 20 74 61 62 6c 65 2e  arent pTo table.
14fa0 20 20 66 6c 61 67 73 20 63 6f 6e 74 61 69 6e 73    flags contains
14fb0 20 61 6c 6c 0a 2a 2a 20 69 6e 66 6f 72 6d 61 74   all.** informat
14fc0 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 63 6f  ion about the co
14fd0 6e 66 6c 69 63 74 20 72 65 73 6f 6c 75 74 69 6f  nflict resolutio
14fe0 6e 20 61 6c 67 6f 72 69 74 68 6d 73 20 73 70 65  n algorithms spe
14ff0 63 69 66 69 65 64 0a 2a 2a 20 69 6e 20 74 68 65  cified.** in the
15000 20 4f 4e 20 44 45 4c 45 54 45 2c 20 4f 4e 20 55   ON DELETE, ON U
15010 50 44 41 54 45 20 61 6e 64 20 4f 4e 20 49 4e 53  PDATE and ON INS
15020 45 52 54 20 63 6c 61 75 73 65 73 2e 0a 2a 2a 0a  ERT clauses..**.
15030 2a 2a 20 41 6e 20 46 4b 65 79 20 73 74 72 75 63  ** An FKey struc
15040 74 75 72 65 20 69 73 20 63 72 65 61 74 65 64 20  ture is created 
15050 61 6e 64 20 61 64 64 65 64 20 74 6f 20 74 68 65  and added to the
15060 20 74 61 62 6c 65 20 63 75 72 72 65 6e 74 6c 79   table currently
15070 0a 2a 2a 20 75 6e 64 65 72 20 63 6f 6e 73 74 72  .** under constr
15080 75 63 74 69 6f 6e 20 69 6e 20 74 68 65 20 70 50  uction in the pP
15090 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20  arse->pNewTable 
150a0 66 69 65 6c 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  field..**.** The
150b0 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 69 73 20   foreign key is 
150c0 73 65 74 20 66 6f 72 20 49 4d 4d 45 44 49 41 54  set for IMMEDIAT
150d0 45 20 70 72 6f 63 65 73 73 69 6e 67 2e 20 20 41  E processing.  A
150e0 20 73 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c   subsequent call
150f0 0a 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33 44 65  .** to sqlite3De
15100 66 65 72 46 6f 72 65 69 67 6e 4b 65 79 28 29 20  ferForeignKey() 
15110 6d 69 67 68 74 20 63 68 61 6e 67 65 20 74 68 69  might change thi
15120 73 20 74 6f 20 44 45 46 45 52 52 45 44 2e 0a 2a  s to DEFERRED..*
15130 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 72  /.void sqlite3Cr
15140 65 61 74 65 46 6f 72 65 69 67 6e 4b 65 79 28 0a  eateForeignKey(.
15150 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
15160 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
15170 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45  g context */.  E
15180 78 70 72 4c 69 73 74 20 2a 70 46 72 6f 6d 43 6f  xprList *pFromCo
15190 6c 2c 20 20 2f 2a 20 43 6f 6c 75 6d 6e 73 20 69  l,  /* Columns i
151a0 6e 20 74 68 69 73 20 74 61 62 6c 65 20 74 68 61  n this table tha
151b0 74 20 70 6f 69 6e 74 20 74 6f 20 6f 74 68 65 72  t point to other
151c0 20 74 61 62 6c 65 20 2a 2f 0a 20 20 54 6f 6b 65   table */.  Toke
151d0 6e 20 2a 70 54 6f 2c 20 20 20 20 20 20 20 20 20  n *pTo,         
151e0 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
151f0 6f 74 68 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20  other table */. 
15200 20 45 78 70 72 4c 69 73 74 20 2a 70 54 6f 43 6f   ExprList *pToCo
15210 6c 2c 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 73  l,    /* Columns
15220 20 69 6e 20 74 68 65 20 6f 74 68 65 72 20 74 61   in the other ta
15230 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61  ble */.  int fla
15240 67 73 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  gs            /*
15250 20 43 6f 6e 66 6c 69 63 74 20 72 65 73 6f 6c 75   Conflict resolu
15260 74 69 6f 6e 20 61 6c 67 6f 72 69 74 68 6d 73 2e  tion algorithms.
15270 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33   */.){.  sqlite3
15280 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
15290 62 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  b;.#ifndef SQLIT
152a0 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b  E_OMIT_FOREIGN_K
152b0 45 59 0a 20 20 46 4b 65 79 20 2a 70 46 4b 65 79  EY.  FKey *pFKey
152c0 20 3d 20 30 3b 0a 20 20 46 4b 65 79 20 2a 70 4e   = 0;.  FKey *pN
152d0 65 78 74 54 6f 3b 0a 20 20 54 61 62 6c 65 20 2a  extTo;.  Table *
152e0 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  p = pParse->pNew
152f0 54 61 62 6c 65 3b 0a 20 20 69 6e 74 20 6e 42 79  Table;.  int nBy
15300 74 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  te;.  int i;.  i
15310 6e 74 20 6e 43 6f 6c 3b 0a 20 20 63 68 61 72 20  nt nCol;.  char 
15320 2a 7a 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  *z;..  assert( p
15330 54 6f 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  To!=0 );.  if( p
15340 3d 3d 30 20 7c 7c 20 49 4e 5f 44 45 43 4c 41 52  ==0 || IN_DECLAR
15350 45 5f 56 54 41 42 20 29 20 67 6f 74 6f 20 66 6b  E_VTAB ) goto fk
15360 5f 65 6e 64 3b 0a 20 20 69 66 28 20 70 46 72 6f  _end;.  if( pFro
15370 6d 43 6f 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 69  mCol==0 ){.    i
15380 6e 74 20 69 43 6f 6c 20 3d 20 70 2d 3e 6e 43 6f  nt iCol = p->nCo
15390 6c 2d 31 3b 0a 20 20 20 20 69 66 28 20 4e 45 56  l-1;.    if( NEV
153a0 45 52 28 69 43 6f 6c 3c 30 29 20 29 20 67 6f 74  ER(iCol<0) ) got
153b0 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 20 20 69 66  o fk_end;.    if
153c0 28 20 70 54 6f 43 6f 6c 20 26 26 20 70 54 6f 43  ( pToCol && pToC
153d0 6f 6c 2d 3e 6e 45 78 70 72 21 3d 31 20 29 7b 0a  ol->nExpr!=1 ){.
153e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
153f0 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 66  orMsg(pParse, "f
15400 6f 72 65 69 67 6e 20 6b 65 79 20 6f 6e 20 25 73  oreign key on %s
15410 22 0a 20 20 20 20 20 20 20 20 20 22 20 73 68 6f  ".         " sho
15420 75 6c 64 20 72 65 66 65 72 65 6e 63 65 20 6f 6e  uld reference on
15430 6c 79 20 6f 6e 65 20 63 6f 6c 75 6d 6e 20 6f 66  ly one column of
15440 20 74 61 62 6c 65 20 25 54 22 2c 0a 20 20 20 20   table %T",.    
15450 20 20 20 20 20 70 2d 3e 61 43 6f 6c 5b 69 43 6f       p->aCol[iCo
15460 6c 5d 2e 7a 4e 61 6d 65 2c 20 70 54 6f 29 3b 0a  l].zName, pTo);.
15470 20 20 20 20 20 20 67 6f 74 6f 20 66 6b 5f 65 6e        goto fk_en
15480 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 43 6f  d;.    }.    nCo
15490 6c 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 20 69  l = 1;.  }else i
154a0 66 28 20 70 54 6f 43 6f 6c 20 26 26 20 70 54 6f  f( pToCol && pTo
154b0 43 6f 6c 2d 3e 6e 45 78 70 72 21 3d 70 46 72 6f  Col->nExpr!=pFro
154c0 6d 43 6f 6c 2d 3e 6e 45 78 70 72 20 29 7b 0a 20  mCol->nExpr ){. 
154d0 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
154e0 73 67 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20  sg(pParse,.     
154f0 20 20 20 22 6e 75 6d 62 65 72 20 6f 66 20 63 6f     "number of co
15500 6c 75 6d 6e 73 20 69 6e 20 66 6f 72 65 69 67 6e  lumns in foreign
15510 20 6b 65 79 20 64 6f 65 73 20 6e 6f 74 20 6d 61   key does not ma
15520 74 63 68 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  tch the number o
15530 66 20 22 0a 20 20 20 20 20 20 20 20 22 63 6f 6c  f ".        "col
15540 75 6d 6e 73 20 69 6e 20 74 68 65 20 72 65 66 65  umns in the refe
15550 72 65 6e 63 65 64 20 74 61 62 6c 65 22 29 3b 0a  renced table");.
15560 20 20 20 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b      goto fk_end;
15570 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 43  .  }else{.    nC
15580 6f 6c 20 3d 20 70 46 72 6f 6d 43 6f 6c 2d 3e 6e  ol = pFromCol->n
15590 45 78 70 72 3b 0a 20 20 7d 0a 20 20 6e 42 79 74  Expr;.  }.  nByt
155a0 65 20 3d 20 73 69 7a 65 6f 66 28 2a 70 46 4b 65  e = sizeof(*pFKe
155b0 79 29 20 2b 20 28 6e 43 6f 6c 2d 31 29 2a 73 69  y) + (nCol-1)*si
155c0 7a 65 6f 66 28 70 46 4b 65 79 2d 3e 61 43 6f 6c  zeof(pFKey->aCol
155d0 5b 30 5d 29 20 2b 20 70 54 6f 2d 3e 6e 20 2b 20  [0]) + pTo->n + 
155e0 31 3b 0a 20 20 69 66 28 20 70 54 6f 43 6f 6c 20  1;.  if( pToCol 
155f0 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  ){.    for(i=0; 
15600 69 3c 70 54 6f 43 6f 6c 2d 3e 6e 45 78 70 72 3b  i<pToCol->nExpr;
15610 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 6e 42 79   i++){.      nBy
15620 74 65 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72  te += sqlite3Str
15630 6c 65 6e 33 30 28 70 54 6f 43 6f 6c 2d 3e 61 5b  len30(pToCol->a[
15640 69 5d 2e 7a 4e 61 6d 65 29 20 2b 20 31 3b 0a 20  i].zName) + 1;. 
15650 20 20 20 7d 0a 20 20 7d 0a 20 20 70 46 4b 65 79     }.  }.  pFKey
15660 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
15670 6f 63 5a 65 72 6f 28 64 62 2c 20 6e 42 79 74 65  ocZero(db, nByte
15680 20 29 3b 0a 20 20 69 66 28 20 70 46 4b 65 79 3d   );.  if( pFKey=
15690 3d 30 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 66  =0 ){.    goto f
156a0 6b 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 70 46 4b  k_end;.  }.  pFK
156b0 65 79 2d 3e 70 46 72 6f 6d 20 3d 20 70 3b 0a 20  ey->pFrom = p;. 
156c0 20 70 46 4b 65 79 2d 3e 70 4e 65 78 74 46 72 6f   pFKey->pNextFro
156d0 6d 20 3d 20 70 2d 3e 70 46 4b 65 79 3b 0a 20 20  m = p->pFKey;.  
156e0 7a 20 3d 20 28 63 68 61 72 2a 29 26 70 46 4b 65  z = (char*)&pFKe
156f0 79 2d 3e 61 43 6f 6c 5b 6e 43 6f 6c 5d 3b 0a 20  y->aCol[nCol];. 
15700 20 70 46 4b 65 79 2d 3e 7a 54 6f 20 3d 20 7a 3b   pFKey->zTo = z;
15710 0a 20 20 6d 65 6d 63 70 79 28 7a 2c 20 70 54 6f  .  memcpy(z, pTo
15720 2d 3e 7a 2c 20 70 54 6f 2d 3e 6e 29 3b 0a 20 20  ->z, pTo->n);.  
15730 7a 5b 70 54 6f 2d 3e 6e 5d 20 3d 20 30 3b 0a 20  z[pTo->n] = 0;. 
15740 20 73 71 6c 69 74 65 33 44 65 71 75 6f 74 65 28   sqlite3Dequote(
15750 7a 29 3b 0a 20 20 7a 20 2b 3d 20 70 54 6f 2d 3e  z);.  z += pTo->
15760 6e 2b 31 3b 0a 20 20 70 46 4b 65 79 2d 3e 6e 43  n+1;.  pFKey->nC
15770 6f 6c 20 3d 20 6e 43 6f 6c 3b 0a 20 20 69 66 28  ol = nCol;.  if(
15780 20 70 46 72 6f 6d 43 6f 6c 3d 3d 30 20 29 7b 0a   pFromCol==0 ){.
15790 20 20 20 20 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b      pFKey->aCol[
157a0 30 5d 2e 69 46 72 6f 6d 20 3d 20 70 2d 3e 6e 43  0].iFrom = p->nC
157b0 6f 6c 2d 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ol-1;.  }else{. 
157c0 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43     for(i=0; i<nC
157d0 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ol; i++){.      
157e0 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 66 6f 72  int j;.      for
157f0 28 6a 3d 30 3b 20 6a 3c 70 2d 3e 6e 43 6f 6c 3b  (j=0; j<p->nCol;
15800 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69   j++){.        i
15810 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  f( sqlite3StrICm
15820 70 28 70 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61  p(p->aCol[j].zNa
15830 6d 65 2c 20 70 46 72 6f 6d 43 6f 6c 2d 3e 61 5b  me, pFromCol->a[
15840 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a  i].zName)==0 ){.
15850 20 20 20 20 20 20 20 20 20 20 70 46 4b 65 79 2d            pFKey-
15860 3e 61 43 6f 6c 5b 69 5d 2e 69 46 72 6f 6d 20 3d  >aCol[i].iFrom =
15870 20 6a 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72   j;.          br
15880 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
15890 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
158a0 20 6a 3e 3d 70 2d 3e 6e 43 6f 6c 20 29 7b 0a 20   j>=p->nCol ){. 
158b0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
158c0 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 0a  rorMsg(pParse, .
158d0 20 20 20 20 20 20 20 20 20 20 22 75 6e 6b 6e 6f            "unkno
158e0 77 6e 20 63 6f 6c 75 6d 6e 20 5c 22 25 73 5c 22  wn column \"%s\"
158f0 20 69 6e 20 66 6f 72 65 69 67 6e 20 6b 65 79 20   in foreign key 
15900 64 65 66 69 6e 69 74 69 6f 6e 22 2c 20 0a 20 20  definition", .  
15910 20 20 20 20 20 20 20 20 70 46 72 6f 6d 43 6f 6c          pFromCol
15920 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20  ->a[i].zName);. 
15930 20 20 20 20 20 20 20 67 6f 74 6f 20 66 6b 5f 65         goto fk_e
15940 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  nd;.      }.    
15950 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 54 6f 43  }.  }.  if( pToC
15960 6f 6c 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d  ol ){.    for(i=
15970 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b  0; i<nCol; i++){
15980 0a 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 73  .      int n = s
15990 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70  qlite3Strlen30(p
159a0 54 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  ToCol->a[i].zNam
159b0 65 29 3b 0a 20 20 20 20 20 20 70 46 4b 65 79 2d  e);.      pFKey-
159c0 3e 61 43 6f 6c 5b 69 5d 2e 7a 43 6f 6c 20 3d 20  >aCol[i].zCol = 
159d0 7a 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  z;.      memcpy(
159e0 7a 2c 20 70 54 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e  z, pToCol->a[i].
159f0 7a 4e 61 6d 65 2c 20 6e 29 3b 0a 20 20 20 20 20  zName, n);.     
15a00 20 7a 5b 6e 5d 20 3d 20 30 3b 0a 20 20 20 20 20   z[n] = 0;.     
15a10 20 7a 20 2b 3d 20 6e 2b 31 3b 0a 20 20 20 20 7d   z += n+1;.    }
15a20 0a 20 20 7d 0a 20 20 70 46 4b 65 79 2d 3e 69 73  .  }.  pFKey->is
15a30 44 65 66 65 72 72 65 64 20 3d 20 30 3b 0a 20 20  Deferred = 0;.  
15a40 70 46 4b 65 79 2d 3e 61 41 63 74 69 6f 6e 5b 30  pFKey->aAction[0
15a50 5d 20 3d 20 28 75 38 29 28 66 6c 61 67 73 20 26  ] = (u8)(flags &
15a60 20 30 78 66 66 29 3b 20 20 20 20 20 20 20 20 20   0xff);         
15a70 20 20 20 2f 2a 20 4f 4e 20 44 45 4c 45 54 45 20     /* ON DELETE 
15a80 61 63 74 69 6f 6e 20 2a 2f 0a 20 20 70 46 4b 65  action */.  pFKe
15a90 79 2d 3e 61 41 63 74 69 6f 6e 5b 31 5d 20 3d 20  y->aAction[1] = 
15aa0 28 75 38 29 28 28 66 6c 61 67 73 20 3e 3e 20 38  (u8)((flags >> 8
15ab0 20 29 20 26 20 30 78 66 66 29 3b 20 20 20 20 2f   ) & 0xff);    /
15ac0 2a 20 4f 4e 20 55 50 44 41 54 45 20 61 63 74 69  * ON UPDATE acti
15ad0 6f 6e 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  on */..  assert(
15ae0 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75   sqlite3SchemaMu
15af0 74 65 78 48 65 6c 64 28 64 62 2c 20 30 2c 20 70  texHeld(db, 0, p
15b00 2d 3e 70 53 63 68 65 6d 61 29 20 29 3b 0a 20 20  ->pSchema) );.  
15b10 70 4e 65 78 74 54 6f 20 3d 20 28 46 4b 65 79 20  pNextTo = (FKey 
15b20 2a 29 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73  *)sqlite3HashIns
15b30 65 72 74 28 26 70 2d 3e 70 53 63 68 65 6d 61 2d  ert(&p->pSchema-
15b40 3e 66 6b 65 79 48 61 73 68 2c 20 0a 20 20 20 20  >fkeyHash, .    
15b50 20 20 70 46 4b 65 79 2d 3e 7a 54 6f 2c 20 28 76    pFKey->zTo, (v
15b60 6f 69 64 20 2a 29 70 46 4b 65 79 0a 20 20 29 3b  oid *)pFKey.  );
15b70 0a 20 20 69 66 28 20 70 4e 65 78 74 54 6f 3d 3d  .  if( pNextTo==
15b80 70 46 4b 65 79 20 29 7b 0a 20 20 20 20 73 71 6c  pFKey ){.    sql
15b90 69 74 65 33 4f 6f 6d 46 61 75 6c 74 28 64 62 29  ite3OomFault(db)
15ba0 3b 0a 20 20 20 20 67 6f 74 6f 20 66 6b 5f 65 6e  ;.    goto fk_en
15bb0 64 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 4e 65  d;.  }.  if( pNe
15bc0 78 74 54 6f 20 29 7b 0a 20 20 20 20 61 73 73 65  xtTo ){.    asse
15bd0 72 74 28 20 70 4e 65 78 74 54 6f 2d 3e 70 50 72  rt( pNextTo->pPr
15be0 65 76 54 6f 3d 3d 30 20 29 3b 0a 20 20 20 20 70  evTo==0 );.    p
15bf0 46 4b 65 79 2d 3e 70 4e 65 78 74 54 6f 20 3d 20  FKey->pNextTo = 
15c00 70 4e 65 78 74 54 6f 3b 0a 20 20 20 20 70 4e 65  pNextTo;.    pNe
15c10 78 74 54 6f 2d 3e 70 50 72 65 76 54 6f 20 3d 20  xtTo->pPrevTo = 
15c20 70 46 4b 65 79 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  pFKey;.  }..  /*
15c30 20 4c 69 6e 6b 20 74 68 65 20 66 6f 72 65 69 67   Link the foreig
15c40 6e 20 6b 65 79 20 74 6f 20 74 68 65 20 74 61 62  n key to the tab
15c50 6c 65 20 61 73 20 74 68 65 20 6c 61 73 74 20 73  le as the last s
15c60 74 65 70 2e 0a 20 20 2a 2f 0a 20 20 70 2d 3e 70  tep..  */.  p->p
15c70 46 4b 65 79 20 3d 20 70 46 4b 65 79 3b 0a 20 20  FKey = pFKey;.  
15c80 70 46 4b 65 79 20 3d 20 30 3b 0a 0a 66 6b 5f 65  pFKey = 0;..fk_e
15c90 6e 64 3a 0a 20 20 73 71 6c 69 74 65 33 44 62 46  nd:.  sqlite3DbF
15ca0 72 65 65 28 64 62 2c 20 70 46 4b 65 79 29 3b 0a  ree(db, pFKey);.
15cb0 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e  #endif /* !defin
15cc0 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46  ed(SQLITE_OMIT_F
15cd0 4f 52 45 49 47 4e 5f 4b 45 59 29 20 2a 2f 0a 20  OREIGN_KEY) */. 
15ce0 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
15cf0 44 65 6c 65 74 65 28 64 62 2c 20 70 46 72 6f 6d  Delete(db, pFrom
15d00 43 6f 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33 45  Col);.  sqlite3E
15d10 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62  xprListDelete(db
15d20 2c 20 70 54 6f 43 6f 6c 29 3b 0a 7d 0a 0a 2f 2a  , pToCol);.}../*
15d30 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
15d40 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20   is called when 
15d50 61 6e 20 49 4e 49 54 49 41 4c 4c 59 20 49 4d 4d  an INITIALLY IMM
15d60 45 44 49 41 54 45 20 6f 72 20 49 4e 49 54 49 41  EDIATE or INITIA
15d70 4c 4c 59 20 44 45 46 45 52 52 45 44 0a 2a 2a 20  LLY DEFERRED.** 
15d80 63 6c 61 75 73 65 20 69 73 20 73 65 65 6e 20 61  clause is seen a
15d90 73 20 70 61 72 74 20 6f 66 20 61 20 66 6f 72 65  s part of a fore
15da0 69 67 6e 20 6b 65 79 20 64 65 66 69 6e 69 74 69  ign key definiti
15db0 6f 6e 2e 20 20 54 68 65 20 69 73 44 65 66 65 72  on.  The isDefer
15dc0 72 65 64 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72  red.** parameter
15dd0 20 69 73 20 31 20 66 6f 72 20 49 4e 49 54 49 41   is 1 for INITIA
15de0 4c 4c 59 20 44 45 46 45 52 52 45 44 20 61 6e 64  LLY DEFERRED and
15df0 20 30 20 66 6f 72 20 49 4e 49 54 49 41 4c 4c 59   0 for INITIALLY
15e00 20 49 4d 4d 45 44 49 41 54 45 2e 0a 2a 2a 20 54   IMMEDIATE..** T
15e10 68 65 20 62 65 68 61 76 69 6f 72 20 6f 66 20 74  he behavior of t
15e20 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79  he most recently
15e30 20 63 72 65 61 74 65 64 20 66 6f 72 65 69 67 6e   created foreign
15e40 20 6b 65 79 20 69 73 20 61 64 6a 75 73 74 65 64   key is adjusted
15e50 0a 2a 2a 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e  .** accordingly.
15e60 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
15e70 44 65 66 65 72 46 6f 72 65 69 67 6e 4b 65 79 28  DeferForeignKey(
15e80 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69  Parse *pParse, i
15e90 6e 74 20 69 73 44 65 66 65 72 72 65 64 29 7b 0a  nt isDeferred){.
15ea0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
15eb0 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 0a  MIT_FOREIGN_KEY.
15ec0 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20    Table *pTab;. 
15ed0 20 46 4b 65 79 20 2a 70 46 4b 65 79 3b 0a 20 20   FKey *pFKey;.  
15ee0 69 66 28 20 28 70 54 61 62 20 3d 20 70 50 61 72  if( (pTab = pPar
15ef0 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3d 3d  se->pNewTable)==
15f00 30 20 7c 7c 20 28 70 46 4b 65 79 20 3d 20 70 54  0 || (pFKey = pT
15f10 61 62 2d 3e 70 46 4b 65 79 29 3d 3d 30 20 29 20  ab->pFKey)==0 ) 
15f20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74  return;.  assert
15f30 28 20 69 73 44 65 66 65 72 72 65 64 3d 3d 30 20  ( isDeferred==0 
15f40 7c 7c 20 69 73 44 65 66 65 72 72 65 64 3d 3d 31  || isDeferred==1
15f50 20 29 3b 20 2f 2a 20 45 56 3a 20 52 2d 33 30 33   ); /* EV: R-303
15f60 32 33 2d 32 31 39 31 37 20 2a 2f 0a 20 20 70 46  23-21917 */.  pF
15f70 4b 65 79 2d 3e 69 73 44 65 66 65 72 72 65 64 20  Key->isDeferred 
15f80 3d 20 28 75 38 29 69 73 44 65 66 65 72 72 65 64  = (u8)isDeferred
15f90 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a  ;.#endif.}../*.*
15fa0 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
15fb0 74 68 61 74 20 77 69 6c 6c 20 65 72 61 73 65 20  that will erase 
15fc0 61 6e 64 20 72 65 66 69 6c 6c 20 69 6e 64 65 78  and refill index
15fd0 20 2a 70 49 64 78 2e 20 20 54 68 69 73 20 69 73   *pIdx.  This is
15fe0 0a 2a 2a 20 75 73 65 64 20 74 6f 20 69 6e 69 74  .** used to init
15ff0 69 61 6c 69 7a 65 20 61 20 6e 65 77 6c 79 20 63  ialize a newly c
16000 72 65 61 74 65 64 20 69 6e 64 65 78 20 6f 72 20  reated index or 
16010 74 6f 20 72 65 63 6f 6d 70 75 74 65 20 74 68 65  to recompute the
16020 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61  .** content of a
16030 6e 20 69 6e 64 65 78 20 69 6e 20 72 65 73 70 6f  n index in respo
16040 6e 73 65 20 74 6f 20 61 20 52 45 49 4e 44 45 58  nse to a REINDEX
16050 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20   command..**.** 
16060 69 66 20 6d 65 6d 52 6f 6f 74 50 61 67 65 20 69  if memRootPage i
16070 73 20 6e 6f 74 20 6e 65 67 61 74 69 76 65 2c 20  s not negative, 
16080 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68  it means that th
16090 65 20 69 6e 64 65 78 20 69 73 20 6e 65 77 6c 79  e index is newly
160a0 0a 2a 2a 20 63 72 65 61 74 65 64 2e 20 20 54 68  .** created.  Th
160b0 65 20 72 65 67 69 73 74 65 72 20 73 70 65 63 69  e register speci
160c0 66 69 65 64 20 62 79 20 6d 65 6d 52 6f 6f 74 50  fied by memRootP
160d0 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  age contains the
160e0 0a 2a 2a 20 72 6f 6f 74 20 70 61 67 65 20 6e 75  .** root page nu
160f0 6d 62 65 72 20 6f 66 20 74 68 65 20 69 6e 64 65  mber of the inde
16100 78 2e 20 20 49 66 20 6d 65 6d 52 6f 6f 74 50 61  x.  If memRootPa
16110 67 65 20 69 73 20 6e 65 67 61 74 69 76 65 2c 20  ge is negative, 
16120 74 68 65 6e 0a 2a 2a 20 74 68 65 20 69 6e 64 65  then.** the inde
16130 78 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73  x already exists
16140 20 61 6e 64 20 6d 75 73 74 20 62 65 20 63 6c 65   and must be cle
16150 61 72 65 64 20 62 65 66 6f 72 65 20 62 65 69 6e  ared before bein
16160 67 20 72 65 66 69 6c 6c 65 64 20 61 6e 64 0a 2a  g refilled and.*
16170 2a 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20  * the root page 
16180 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 69 6e  number of the in
16190 64 65 78 20 69 73 20 74 61 6b 65 6e 20 66 72 6f  dex is taken fro
161a0 6d 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 2e 0a  m pIndex->tnum..
161b0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
161c0 71 6c 69 74 65 33 52 65 66 69 6c 6c 49 6e 64 65  qlite3RefillInde
161d0 78 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  x(Parse *pParse,
161e0 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 2c 20   Index *pIndex, 
161f0 69 6e 74 20 6d 65 6d 52 6f 6f 74 50 61 67 65 29  int memRootPage)
16200 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20  {.  Table *pTab 
16210 3d 20 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65  = pIndex->pTable
16220 3b 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20  ;  /* The table 
16230 74 68 61 74 20 69 73 20 69 6e 64 65 78 65 64 20  that is indexed 
16240 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 20 3d 20  */.  int iTab = 
16250 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 20  pParse->nTab++; 
16260 20 20 20 20 2f 2a 20 42 74 72 65 65 20 63 75 72      /* Btree cur
16270 73 6f 72 20 75 73 65 64 20 66 6f 72 20 70 54 61  sor used for pTa
16280 62 20 2a 2f 0a 20 20 69 6e 74 20 69 49 64 78 20  b */.  int iIdx 
16290 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b  = pParse->nTab++
162a0 3b 20 20 20 20 20 2f 2a 20 42 74 72 65 65 20 63  ;     /* Btree c
162b0 75 72 73 6f 72 20 75 73 65 64 20 66 6f 72 20 70  ursor used for p
162c0 49 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 69  Index */.  int i
162d0 53 6f 72 74 65 72 3b 20 20 20 20 20 20 20 20 20  Sorter;         
162e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
162f0 73 6f 72 20 6f 70 65 6e 65 64 20 62 79 20 4f 70  sor opened by Op
16300 65 6e 53 6f 72 74 65 72 20 28 69 66 20 69 6e 20  enSorter (if in 
16310 75 73 65 29 20 2a 2f 0a 20 20 69 6e 74 20 61 64  use) */.  int ad
16320 64 72 31 3b 20 20 20 20 20 20 20 20 20 20 20 20  dr1;            
16330 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72           /* Addr
16340 65 73 73 20 6f 66 20 74 6f 70 20 6f 66 20 6c 6f  ess of top of lo
16350 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72  op */.  int addr
16360 32 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  2;              
16370 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
16380 73 20 74 6f 20 6a 75 6d 70 20 74 6f 20 66 6f 72  s to jump to for
16390 20 6e 65 78 74 20 69 74 65 72 61 74 69 6f 6e 20   next iteration 
163a0 2a 2f 0a 20 20 69 6e 74 20 74 6e 75 6d 3b 20 20  */.  int tnum;  
163b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
163c0 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65      /* Root page
163d0 20 6f 66 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69   of index */.  i
163e0 6e 74 20 69 50 61 72 74 49 64 78 4c 61 62 65 6c  nt iPartIdxLabel
163f0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
16400 20 4a 75 6d 70 20 74 6f 20 74 68 69 73 20 6c 61   Jump to this la
16410 62 65 6c 20 74 6f 20 73 6b 69 70 20 61 20 72 6f  bel to skip a ro
16420 77 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20  w */.  Vdbe *v; 
16430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16440 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74        /* Generat
16450 65 20 63 6f 64 65 20 69 6e 74 6f 20 74 68 69 73  e code into this
16460 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65   virtual machine
16470 20 2a 2f 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70   */.  KeyInfo *p
16480 4b 65 79 3b 20 20 20 20 20 20 20 20 20 20 20 20  Key;            
16490 20 20 20 20 20 2f 2a 20 4b 65 79 49 6e 66 6f 20       /* KeyInfo 
164a0 66 6f 72 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69  for index */.  i
164b0 6e 74 20 72 65 67 52 65 63 6f 72 64 3b 20 20 20  nt regRecord;   
164c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
164d0 20 52 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e   Register holdin
164e0 67 20 61 73 73 65 6d 62 6c 65 64 20 69 6e 64 65  g assembled inde
164f0 78 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 73 71  x record */.  sq
16500 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
16510 73 65 2d 3e 64 62 3b 20 20 20 20 20 20 2f 2a 20  se->db;      /* 
16520 54 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e  The database con
16530 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74  nection */.  int
16540 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63   iDb = sqlite3Sc
16550 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20  hemaToIndex(db, 
16560 70 49 6e 64 65 78 2d 3e 70 53 63 68 65 6d 61 29  pIndex->pSchema)
16570 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ;..#ifndef SQLIT
16580 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41  E_OMIT_AUTHORIZA
16590 54 49 4f 4e 0a 20 20 69 66 28 20 73 71 6c 69 74  TION.  if( sqlit
165a0 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72  e3AuthCheck(pPar
165b0 73 65 2c 20 53 51 4c 49 54 45 5f 52 45 49 4e 44  se, SQLITE_REIND
165c0 45 58 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d  EX, pIndex->zNam
165d0 65 2c 20 30 2c 0a 20 20 20 20 20 20 64 62 2d 3e  e, 0,.      db->
165e0 61 44 62 5b 69 44 62 5d 2e 7a 44 62 53 4e 61 6d  aDb[iDb].zDbSNam
165f0 65 20 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  e ) ){.    retur
16600 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  n;.  }.#endif.. 
16610 20 2f 2a 20 52 65 71 75 69 72 65 20 61 20 77 72   /* Require a wr
16620 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  ite-lock on the 
16630 74 61 62 6c 65 20 74 6f 20 70 65 72 66 6f 72 6d  table to perform
16640 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 20   this operation 
16650 2a 2f 0a 20 20 73 71 6c 69 74 65 33 54 61 62 6c  */.  sqlite3Tabl
16660 65 4c 6f 63 6b 28 70 50 61 72 73 65 2c 20 69 44  eLock(pParse, iD
16670 62 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 2c 20 31  b, pTab->tnum, 1
16680 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a  , pTab->zName);.
16690 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65  .  v = sqlite3Ge
166a0 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
166b0 20 69 66 28 20 76 3d 3d 30 20 29 20 72 65 74 75   if( v==0 ) retu
166c0 72 6e 3b 0a 20 20 69 66 28 20 6d 65 6d 52 6f 6f  rn;.  if( memRoo
166d0 74 50 61 67 65 3e 3d 30 20 29 7b 0a 20 20 20 20  tPage>=0 ){.    
166e0 74 6e 75 6d 20 3d 20 6d 65 6d 52 6f 6f 74 50 61  tnum = memRootPa
166f0 67 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ge;.  }else{.   
16700 20 74 6e 75 6d 20 3d 20 70 49 6e 64 65 78 2d 3e   tnum = pIndex->
16710 74 6e 75 6d 3b 0a 20 20 7d 0a 20 20 70 4b 65 79  tnum;.  }.  pKey
16720 20 3d 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66   = sqlite3KeyInf
16730 6f 4f 66 49 6e 64 65 78 28 70 50 61 72 73 65 2c  oOfIndex(pParse,
16740 20 70 49 6e 64 65 78 29 3b 0a 20 20 61 73 73 65   pIndex);.  asse
16750 72 74 28 20 70 4b 65 79 21 3d 30 20 7c 7c 20 64  rt( pKey!=0 || d
16760 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
16770 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20  || pParse->nErr 
16780 29 3b 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 74 68  );..  /* Open th
16790 65 20 73 6f 72 74 65 72 20 63 75 72 73 6f 72 20  e sorter cursor 
167a0 69 66 20 77 65 20 61 72 65 20 74 6f 20 75 73 65  if we are to use
167b0 20 6f 6e 65 2e 20 2a 2f 0a 20 20 69 53 6f 72 74   one. */.  iSort
167c0 65 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  er = pParse->nTa
167d0 62 2b 2b 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  b++;.  sqlite3Vd
167e0 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 53  beAddOp4(v, OP_S
167f0 6f 72 74 65 72 4f 70 65 6e 2c 20 69 53 6f 72 74  orterOpen, iSort
16800 65 72 2c 20 30 2c 20 70 49 6e 64 65 78 2d 3e 6e  er, 0, pIndex->n
16810 4b 65 79 43 6f 6c 2c 20 28 63 68 61 72 2a 29 0a  KeyCol, (char*).
16820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16830 20 20 20 20 73 71 6c 69 74 65 33 4b 65 79 49 6e      sqlite3KeyIn
16840 66 6f 52 65 66 28 70 4b 65 79 29 2c 20 50 34 5f  foRef(pKey), P4_
16850 4b 45 59 49 4e 46 4f 29 3b 0a 0a 20 20 2f 2a 20  KEYINFO);..  /* 
16860 4f 70 65 6e 20 74 68 65 20 74 61 62 6c 65 2e 20  Open the table. 
16870 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20 61 6c 6c  Loop through all
16880 20 72 6f 77 73 20 6f 66 20 74 68 65 20 74 61 62   rows of the tab
16890 6c 65 2c 20 69 6e 73 65 72 74 69 6e 67 20 69 6e  le, inserting in
168a0 64 65 78 0a 20 20 2a 2a 20 72 65 63 6f 72 64 73  dex.  ** records
168b0 20 69 6e 74 6f 20 74 68 65 20 73 6f 72 74 65 72   into the sorter
168c0 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 4f 70  . */.  sqlite3Op
168d0 65 6e 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20  enTable(pParse, 
168e0 69 54 61 62 2c 20 69 44 62 2c 20 70 54 61 62 2c  iTab, iDb, pTab,
168f0 20 4f 50 5f 4f 70 65 6e 52 65 61 64 29 3b 0a 20   OP_OpenRead);. 
16900 20 61 64 64 72 31 20 3d 20 73 71 6c 69 74 65 33   addr1 = sqlite3
16910 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
16920 5f 52 65 77 69 6e 64 2c 20 69 54 61 62 2c 20 30  _Rewind, iTab, 0
16930 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
16940 76 29 3b 0a 20 20 72 65 67 52 65 63 6f 72 64 20  v);.  regRecord 
16950 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
16960 52 65 67 28 70 50 61 72 73 65 29 3b 0a 0a 20 20  Reg(pParse);..  
16970 73 71 6c 69 74 65 33 47 65 6e 65 72 61 74 65 49  sqlite3GenerateI
16980 6e 64 65 78 4b 65 79 28 70 50 61 72 73 65 2c 70  ndexKey(pParse,p
16990 49 6e 64 65 78 2c 69 54 61 62 2c 72 65 67 52 65  Index,iTab,regRe
169a0 63 6f 72 64 2c 30 2c 26 69 50 61 72 74 49 64 78  cord,0,&iPartIdx
169b0 4c 61 62 65 6c 2c 30 2c 30 29 3b 0a 20 20 73 71  Label,0,0);.  sq
169c0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
169d0 76 2c 20 4f 50 5f 53 6f 72 74 65 72 49 6e 73 65  v, OP_SorterInse
169e0 72 74 2c 20 69 53 6f 72 74 65 72 2c 20 72 65 67  rt, iSorter, reg
169f0 52 65 63 6f 72 64 29 3b 0a 20 20 73 71 6c 69 74  Record);.  sqlit
16a00 65 33 52 65 73 6f 6c 76 65 50 61 72 74 49 64 78  e3ResolvePartIdx
16a10 4c 61 62 65 6c 28 70 50 61 72 73 65 2c 20 69 50  Label(pParse, iP
16a20 61 72 74 49 64 78 4c 61 62 65 6c 29 3b 0a 20 20  artIdxLabel);.  
16a30 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
16a40 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 69 54  2(v, OP_Next, iT
16a50 61 62 2c 20 61 64 64 72 31 2b 31 29 3b 20 56 64  ab, addr1+1); Vd
16a60 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
16a70 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
16a80 48 65 72 65 28 76 2c 20 61 64 64 72 31 29 3b 0a  Here(v, addr1);.
16a90 20 20 69 66 28 20 6d 65 6d 52 6f 6f 74 50 61 67    if( memRootPag
16aa0 65 3c 30 20 29 20 73 71 6c 69 74 65 33 56 64 62  e<0 ) sqlite3Vdb
16ab0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6c  eAddOp2(v, OP_Cl
16ac0 65 61 72 2c 20 74 6e 75 6d 2c 20 69 44 62 29 3b  ear, tnum, iDb);
16ad0 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
16ae0 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70 65 6e 57  dOp4(v, OP_OpenW
16af0 72 69 74 65 2c 20 69 49 64 78 2c 20 74 6e 75 6d  rite, iIdx, tnum
16b00 2c 20 69 44 62 2c 20 0a 20 20 20 20 20 20 20 20  , iDb, .        
16b10 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61              (cha
16b20 72 20 2a 29 70 4b 65 79 2c 20 50 34 5f 4b 45 59  r *)pKey, P4_KEY
16b30 49 4e 46 4f 29 3b 0a 20 20 73 71 6c 69 74 65 33  INFO);.  sqlite3
16b40 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
16b50 4f 50 46 4c 41 47 5f 42 55 4c 4b 43 53 52 7c 28  OPFLAG_BULKCSR|(
16b60 28 6d 65 6d 52 6f 6f 74 50 61 67 65 3e 3d 30 29  (memRootPage>=0)
16b70 3f 4f 50 46 4c 41 47 5f 50 32 49 53 52 45 47 3a  ?OPFLAG_P2ISREG:
16b80 30 29 29 3b 0a 0a 20 20 61 64 64 72 31 20 3d 20  0));..  addr1 = 
16b90 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
16ba0 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 53 6f  2(v, OP_SorterSo
16bb0 72 74 2c 20 69 53 6f 72 74 65 72 2c 20 30 29 3b  rt, iSorter, 0);
16bc0 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
16bd0 3b 0a 20 20 69 66 28 20 49 73 55 6e 69 71 75 65  ;.  if( IsUnique
16be0 49 6e 64 65 78 28 70 49 6e 64 65 78 29 20 29 7b  Index(pIndex) ){
16bf0 0a 20 20 20 20 69 6e 74 20 6a 32 20 3d 20 73 71  .    int j2 = sq
16c00 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
16c10 41 64 64 72 28 76 29 20 2b 20 33 3b 0a 20 20 20  Addr(v) + 3;.   
16c20 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f   sqlite3VdbeGoto
16c30 28 76 2c 20 6a 32 29 3b 0a 20 20 20 20 61 64 64  (v, j2);.    add
16c40 72 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  r2 = sqlite3Vdbe
16c50 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a  CurrentAddr(v);.
16c60 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
16c70 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 53  ddOp4Int(v, OP_S
16c80 6f 72 74 65 72 43 6f 6d 70 61 72 65 2c 20 69 53  orterCompare, iS
16c90 6f 72 74 65 72 2c 20 6a 32 2c 20 72 65 67 52 65  orter, j2, regRe
16ca0 63 6f 72 64 2c 0a 20 20 20 20 20 20 20 20 20 20  cord,.          
16cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
16cc0 49 6e 64 65 78 2d 3e 6e 4b 65 79 43 6f 6c 29 3b  Index->nKeyCol);
16cd0 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
16ce0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 55 6e 69  ;.    sqlite3Uni
16cf0 71 75 65 43 6f 6e 73 74 72 61 69 6e 74 28 70 50  queConstraint(pP
16d00 61 72 73 65 2c 20 4f 45 5f 41 62 6f 72 74 2c 20  arse, OE_Abort, 
16d10 70 49 6e 64 65 78 29 3b 0a 20 20 7d 65 6c 73 65  pIndex);.  }else
16d20 7b 0a 20 20 20 20 61 64 64 72 32 20 3d 20 73 71  {.    addr2 = sq
16d30 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
16d40 41 64 64 72 28 76 29 3b 0a 20 20 7d 0a 20 20 73  Addr(v);.  }.  s
16d50 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
16d60 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 44 61 74  (v, OP_SorterDat
16d70 61 2c 20 69 53 6f 72 74 65 72 2c 20 72 65 67 52  a, iSorter, regR
16d80 65 63 6f 72 64 2c 20 69 49 64 78 29 3b 0a 20 20  ecord, iIdx);.  
16d90 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
16da0 33 28 76 2c 20 4f 50 5f 4c 61 73 74 2c 20 69 49  3(v, OP_Last, iI
16db0 64 78 2c 20 30 2c 20 2d 31 29 3b 0a 20 20 73 71  dx, 0, -1);.  sq
16dc0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
16dd0 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c  v, OP_IdxInsert,
16de0 20 69 49 64 78 2c 20 72 65 67 52 65 63 6f 72 64   iIdx, regRecord
16df0 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  , 0);.  sqlite3V
16e00 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f  dbeChangeP5(v, O
16e10 50 46 4c 41 47 5f 55 53 45 53 45 45 4b 52 45 53  PFLAG_USESEEKRES
16e20 55 4c 54 29 3b 0a 20 20 73 71 6c 69 74 65 33 52  ULT);.  sqlite3R
16e30 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
16e40 61 72 73 65 2c 20 72 65 67 52 65 63 6f 72 64 29  arse, regRecord)
16e50 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
16e60 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74  ddOp2(v, OP_Sort
16e70 65 72 4e 65 78 74 2c 20 69 53 6f 72 74 65 72 2c  erNext, iSorter,
16e80 20 61 64 64 72 32 29 3b 20 56 64 62 65 43 6f 76   addr2); VdbeCov
16e90 65 72 61 67 65 28 76 29 3b 0a 20 20 73 71 6c 69  erage(v);.  sqli
16ea0 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
16eb0 76 2c 20 61 64 64 72 31 29 3b 0a 0a 20 20 73 71  v, addr1);..  sq
16ec0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
16ed0 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 69 54 61  v, OP_Close, iTa
16ee0 62 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  b);.  sqlite3Vdb
16ef0 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 43 6c  eAddOp1(v, OP_Cl
16f00 6f 73 65 2c 20 69 49 64 78 29 3b 0a 20 20 73 71  ose, iIdx);.  sq
16f10 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
16f20 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 69 53 6f  v, OP_Close, iSo
16f30 72 74 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rter);.}../*.** 
16f40 41 6c 6c 6f 63 61 74 65 20 68 65 61 70 20 73 70  Allocate heap sp
16f50 61 63 65 20 74 6f 20 68 6f 6c 64 20 61 6e 20 49  ace to hold an I
16f60 6e 64 65 78 20 6f 62 6a 65 63 74 20 77 69 74 68  ndex object with
16f70 20 6e 43 6f 6c 20 63 6f 6c 75 6d 6e 73 2e 0a 2a   nCol columns..*
16f80 2a 0a 2a 2a 20 49 6e 63 72 65 61 73 65 20 74 68  *.** Increase th
16f90 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 73 69 7a  e allocation siz
16fa0 65 20 74 6f 20 70 72 6f 76 69 64 65 20 61 6e 20  e to provide an 
16fb0 65 78 74 72 61 20 6e 45 78 74 72 61 20 62 79 74  extra nExtra byt
16fc0 65 73 0a 2a 2a 20 6f 66 20 38 2d 62 79 74 65 20  es.** of 8-byte 
16fd0 61 6c 69 67 6e 65 64 20 73 70 61 63 65 20 61 66  aligned space af
16fe0 74 65 72 20 74 68 65 20 49 6e 64 65 78 20 6f 62  ter the Index ob
16ff0 6a 65 63 74 20 61 6e 64 20 72 65 74 75 72 6e 20  ject and return 
17000 61 0a 2a 2a 20 70 6f 69 6e 74 65 72 20 74 6f 20  a.** pointer to 
17010 74 68 69 73 20 65 78 74 72 61 20 73 70 61 63 65  this extra space
17020 20 69 6e 20 2a 70 70 45 78 74 72 61 2e 0a 2a 2f   in *ppExtra..*/
17030 0a 49 6e 64 65 78 20 2a 73 71 6c 69 74 65 33 41  .Index *sqlite3A
17040 6c 6c 6f 63 61 74 65 49 6e 64 65 78 4f 62 6a 65  llocateIndexObje
17050 63 74 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  ct(.  sqlite3 *d
17060 62 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61  b,         /* Da
17070 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
17080 6e 20 2a 2f 0a 20 20 69 31 36 20 6e 43 6f 6c 2c  n */.  i16 nCol,
17090 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
170a0 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 63  otal number of c
170b0 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 69 6e  olumns in the in
170c0 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78  dex */.  int nEx
170d0 74 72 61 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  tra,          /*
170e0 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
170f0 20 6f 66 20 65 78 74 72 61 20 73 70 61 63 65 20   of extra space 
17100 74 6f 20 61 6c 6c 6f 63 20 2a 2f 0a 20 20 63 68  to alloc */.  ch
17110 61 72 20 2a 2a 70 70 45 78 74 72 61 20 20 20 20  ar **ppExtra    
17120 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
17130 20 74 68 65 20 22 65 78 74 72 61 22 20 73 70 61   the "extra" spa
17140 63 65 20 2a 2f 0a 29 7b 0a 20 20 49 6e 64 65 78  ce */.){.  Index
17150 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20 20   *p;            
17160 2f 2a 20 41 6c 6c 6f 63 61 74 65 64 20 69 6e 64  /* Allocated ind
17170 65 78 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69  ex object */.  i
17180 6e 74 20 6e 42 79 74 65 3b 20 20 20 20 20 20 20  nt nByte;       
17190 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20      /* Bytes of 
171a0 73 70 61 63 65 20 66 6f 72 20 49 6e 64 65 78 20  space for Index 
171b0 6f 62 6a 65 63 74 20 2b 20 61 72 72 61 79 73 20  object + arrays 
171c0 2a 2f 0a 0a 20 20 6e 42 79 74 65 20 3d 20 52 4f  */..  nByte = RO
171d0 55 4e 44 38 28 73 69 7a 65 6f 66 28 49 6e 64 65  UND8(sizeof(Inde
171e0 78 29 29 20 2b 20 20 20 20 20 20 20 20 20 20 20  x)) +           
171f0 20 20 20 2f 2a 20 49 6e 64 65 78 20 73 74 72 75     /* Index stru
17200 63 74 75 72 65 20 20 2a 2f 0a 20 20 20 20 20 20  cture  */.      
17210 20 20 20 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f      ROUND8(sizeo
17220 66 28 63 68 61 72 2a 29 2a 6e 43 6f 6c 29 20 2b  f(char*)*nCol) +
17230 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
17240 78 2e 61 7a 43 6f 6c 6c 20 20 20 20 20 2a 2f 0a  x.azColl     */.
17250 20 20 20 20 20 20 20 20 20 20 52 4f 55 4e 44 38            ROUND8
17260 28 73 69 7a 65 6f 66 28 4c 6f 67 45 73 74 29 2a  (sizeof(LogEst)*
17270 28 6e 43 6f 6c 2b 31 29 20 2b 20 20 20 20 20 2f  (nCol+1) +     /
17280 2a 20 49 6e 64 65 78 2e 61 69 52 6f 77 4c 6f 67  * Index.aiRowLog
17290 45 73 74 20 20 20 2a 2f 0a 20 20 20 20 20 20 20  Est   */.       
172a0 20 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66            sizeof
172b0 28 69 31 36 29 2a 6e 43 6f 6c 20 2b 20 20 20 20  (i16)*nCol +    
172c0 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
172d0 2e 61 69 43 6f 6c 75 6d 6e 20 20 20 2a 2f 0a 20  .aiColumn   */. 
172e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
172f0 73 69 7a 65 6f 66 28 75 38 29 2a 6e 43 6f 6c 29  sizeof(u8)*nCol)
17300 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
17310 20 49 6e 64 65 78 2e 61 53 6f 72 74 4f 72 64 65   Index.aSortOrde
17320 72 20 2a 2f 0a 20 20 70 20 3d 20 73 71 6c 69 74  r */.  p = sqlit
17330 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64  e3DbMallocZero(d
17340 62 2c 20 6e 42 79 74 65 20 2b 20 6e 45 78 74 72  b, nByte + nExtr
17350 61 29 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20  a);.  if( p ){. 
17360 20 20 20 63 68 61 72 20 2a 70 45 78 74 72 61 20     char *pExtra 
17370 3d 20 28 28 63 68 61 72 2a 29 70 29 2b 52 4f 55  = ((char*)p)+ROU
17380 4e 44 38 28 73 69 7a 65 6f 66 28 49 6e 64 65 78  ND8(sizeof(Index
17390 29 29 3b 0a 20 20 20 20 70 2d 3e 61 7a 43 6f 6c  ));.    p->azCol
173a0 6c 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a  l = (const char*
173b0 2a 29 70 45 78 74 72 61 3b 20 70 45 78 74 72 61  *)pExtra; pExtra
173c0 20 2b 3d 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f   += ROUND8(sizeo
173d0 66 28 63 68 61 72 2a 29 2a 6e 43 6f 6c 29 3b 0a  f(char*)*nCol);.
173e0 20 20 20 20 70 2d 3e 61 69 52 6f 77 4c 6f 67 45      p->aiRowLogE
173f0 73 74 20 3d 20 28 4c 6f 67 45 73 74 2a 29 70 45  st = (LogEst*)pE
17400 78 74 72 61 3b 20 70 45 78 74 72 61 20 2b 3d 20  xtra; pExtra += 
17410 73 69 7a 65 6f 66 28 4c 6f 67 45 73 74 29 2a 28  sizeof(LogEst)*(
17420 6e 43 6f 6c 2b 31 29 3b 0a 20 20 20 20 70 2d 3e  nCol+1);.    p->
17430 61 69 43 6f 6c 75 6d 6e 20 3d 20 28 69 31 36 2a  aiColumn = (i16*
17440 29 70 45 78 74 72 61 3b 20 20 20 20 20 20 20 70  )pExtra;       p
17450 45 78 74 72 61 20 2b 3d 20 73 69 7a 65 6f 66 28  Extra += sizeof(
17460 69 31 36 29 2a 6e 43 6f 6c 3b 0a 20 20 20 20 70  i16)*nCol;.    p
17470 2d 3e 61 53 6f 72 74 4f 72 64 65 72 20 3d 20 28  ->aSortOrder = (
17480 75 38 2a 29 70 45 78 74 72 61 3b 0a 20 20 20 20  u8*)pExtra;.    
17490 70 2d 3e 6e 43 6f 6c 75 6d 6e 20 3d 20 6e 43 6f  p->nColumn = nCo
174a0 6c 3b 0a 20 20 20 20 70 2d 3e 6e 4b 65 79 43 6f  l;.    p->nKeyCo
174b0 6c 20 3d 20 6e 43 6f 6c 20 2d 20 31 3b 0a 20 20  l = nCol - 1;.  
174c0 20 20 2a 70 70 45 78 74 72 61 20 3d 20 28 28 63    *ppExtra = ((c
174d0 68 61 72 2a 29 70 29 20 2b 20 6e 42 79 74 65 3b  har*)p) + nByte;
174e0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b  .  }.  return p;
174f0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65  .}../*.** Create
17500 20 61 20 6e 65 77 20 69 6e 64 65 78 20 66 6f 72   a new index for
17510 20 61 6e 20 53 51 4c 20 74 61 62 6c 65 2e 20 20   an SQL table.  
17520 70 4e 61 6d 65 31 2e 70 4e 61 6d 65 32 20 69 73  pName1.pName2 is
17530 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
17540 20 69 6e 64 65 78 20 0a 2a 2a 20 61 6e 64 20 70   index .** and p
17550 54 62 6c 4c 69 73 74 20 69 73 20 74 68 65 20 6e  TblList is the n
17560 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65  ame of the table
17570 20 74 68 61 74 20 69 73 20 74 6f 20 62 65 20 69   that is to be i
17580 6e 64 65 78 65 64 2e 20 20 42 6f 74 68 20 77 69  ndexed.  Both wi
17590 6c 6c 20 0a 2a 2a 20 62 65 20 4e 55 4c 4c 20 66  ll .** be NULL f
175a0 6f 72 20 61 20 70 72 69 6d 61 72 79 20 6b 65 79  or a primary key
175b0 20 6f 72 20 61 6e 20 69 6e 64 65 78 20 74 68 61   or an index tha
175c0 74 20 69 73 20 63 72 65 61 74 65 64 20 74 6f 20  t is created to 
175d0 73 61 74 69 73 66 79 20 61 0a 2a 2a 20 55 4e 49  satisfy a.** UNI
175e0 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 2e 20  QUE constraint. 
175f0 20 49 66 20 70 54 61 62 6c 65 20 61 6e 64 20 70   If pTable and p
17600 49 6e 64 65 78 20 61 72 65 20 4e 55 4c 4c 2c 20  Index are NULL, 
17610 75 73 65 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  use pParse->pNew
17620 54 61 62 6c 65 0a 2a 2a 20 61 73 20 74 68 65 20  Table.** as the 
17630 74 61 62 6c 65 20 74 6f 20 62 65 20 69 6e 64 65  table to be inde
17640 78 65 64 2e 20 20 70 50 61 72 73 65 2d 3e 70 4e  xed.  pParse->pN
17650 65 77 54 61 62 6c 65 20 69 73 20 61 20 74 61 62  ewTable is a tab
17660 6c 65 20 74 68 61 74 20 69 73 0a 2a 2a 20 63 75  le that is.** cu
17670 72 72 65 6e 74 6c 79 20 62 65 69 6e 67 20 63 6f  rrently being co
17680 6e 73 74 72 75 63 74 65 64 20 62 79 20 61 20 43  nstructed by a C
17690 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74  REATE TABLE stat
176a0 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 70 4c 69  ement..**.** pLi
176b0 73 74 20 69 73 20 61 20 6c 69 73 74 20 6f 66 20  st is a list of 
176c0 63 6f 6c 75 6d 6e 73 20 74 6f 20 62 65 20 69 6e  columns to be in
176d0 64 65 78 65 64 2e 20 20 70 4c 69 73 74 20 77 69  dexed.  pList wi
176e0 6c 6c 20 62 65 20 4e 55 4c 4c 20 69 66 20 74 68  ll be NULL if th
176f0 69 73 0a 2a 2a 20 69 73 20 61 20 70 72 69 6d 61  is.** is a prima
17700 72 79 20 6b 65 79 20 6f 72 20 75 6e 69 71 75 65  ry key or unique
17710 2d 63 6f 6e 73 74 72 61 69 6e 74 20 6f 6e 20 74  -constraint on t
17720 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 63  he most recent c
17730 6f 6c 75 6d 6e 20 61 64 64 65 64 0a 2a 2a 20 74  olumn added.** t
17740 6f 20 74 68 65 20 74 61 62 6c 65 20 63 75 72 72  o the table curr
17750 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73  ently under cons
17760 74 72 75 63 74 69 6f 6e 2e 20 20 0a 2a 2f 0a 76  truction.  .*/.v
17770 6f 69 64 20 73 71 6c 69 74 65 33 43 72 65 61 74  oid sqlite3Creat
17780 65 49 6e 64 65 78 28 0a 20 20 50 61 72 73 65 20  eIndex(.  Parse 
17790 2a 70 50 61 72 73 65 2c 20 20 20 20 20 2f 2a 20  *pParse,     /* 
177a0 41 6c 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  All information 
177b0 61 62 6f 75 74 20 74 68 69 73 20 70 61 72 73 65  about this parse
177c0 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61   */.  Token *pNa
177d0 6d 65 31 2c 20 20 20 20 20 2f 2a 20 46 69 72 73  me1,     /* Firs
177e0 74 20 70 61 72 74 20 6f 66 20 69 6e 64 65 78 20  t part of index 
177f0 6e 61 6d 65 2e 20 4d 61 79 20 62 65 20 4e 55 4c  name. May be NUL
17800 4c 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e  L */.  Token *pN
17810 61 6d 65 32 2c 20 20 20 20 20 2f 2a 20 53 65 63  ame2,     /* Sec
17820 6f 6e 64 20 70 61 72 74 20 6f 66 20 69 6e 64 65  ond part of inde
17830 78 20 6e 61 6d 65 2e 20 4d 61 79 20 62 65 20 4e  x name. May be N
17840 55 4c 4c 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74  ULL */.  SrcList
17850 20 2a 70 54 62 6c 4e 61 6d 65 2c 20 2f 2a 20 54   *pTblName, /* T
17860 61 62 6c 65 20 74 6f 20 69 6e 64 65 78 2e 20 55  able to index. U
17870 73 65 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54  se pParse->pNewT
17880 61 62 6c 65 20 69 66 20 30 20 2a 2f 0a 20 20 45  able if 0 */.  E
17890 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20  xprList *pList, 
178a0 20 20 2f 2a 20 41 20 6c 69 73 74 20 6f 66 20 63    /* A list of c
178b0 6f 6c 75 6d 6e 73 20 74 6f 20 62 65 20 69 6e 64  olumns to be ind
178c0 65 78 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 6e  exed */.  int on
178d0 45 72 72 6f 72 2c 20 20 20 20 20 20 20 2f 2a 20  Error,       /* 
178e0 4f 45 5f 41 62 6f 72 74 2c 20 4f 45 5f 49 67 6e  OE_Abort, OE_Ign
178f0 6f 72 65 2c 20 4f 45 5f 52 65 70 6c 61 63 65 2c  ore, OE_Replace,
17900 20 6f 72 20 4f 45 5f 4e 6f 6e 65 20 2a 2f 0a 20   or OE_None */. 
17910 20 54 6f 6b 65 6e 20 2a 70 53 74 61 72 74 2c 20   Token *pStart, 
17920 20 20 20 20 2f 2a 20 54 68 65 20 43 52 45 41 54      /* The CREAT
17930 45 20 74 6f 6b 65 6e 20 74 68 61 74 20 62 65 67  E token that beg
17940 69 6e 73 20 74 68 69 73 20 73 74 61 74 65 6d 65  ins this stateme
17950 6e 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 50  nt */.  Expr *pP
17960 49 57 68 65 72 65 2c 20 20 20 20 2f 2a 20 57 48  IWhere,    /* WH
17970 45 52 45 20 63 6c 61 75 73 65 20 66 6f 72 20 70  ERE clause for p
17980 61 72 74 69 61 6c 20 69 6e 64 69 63 65 73 20 2a  artial indices *
17990 2f 0a 20 20 69 6e 74 20 73 6f 72 74 4f 72 64 65  /.  int sortOrde
179a0 72 2c 20 20 20 20 20 2f 2a 20 53 6f 72 74 20 6f  r,     /* Sort o
179b0 72 64 65 72 20 6f 66 20 70 72 69 6d 61 72 79 20  rder of primary 
179c0 6b 65 79 20 77 68 65 6e 20 70 4c 69 73 74 3d 3d  key when pList==
179d0 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20 69 66  NULL */.  int if
179e0 4e 6f 74 45 78 69 73 74 2c 20 20 20 20 2f 2a 20  NotExist,    /* 
179f0 4f 6d 69 74 20 65 72 72 6f 72 20 69 66 20 69 6e  Omit error if in
17a00 64 65 78 20 61 6c 72 65 61 64 79 20 65 78 69 73  dex already exis
17a10 74 73 20 2a 2f 0a 20 20 75 38 20 69 64 78 54 79  ts */.  u8 idxTy
17a20 70 65 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  pe         /* Th
17a30 65 20 69 6e 64 65 78 20 74 79 70 65 20 2a 2f 0a  e index type */.
17a40 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  ){.  Table *pTab
17a50 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 54 61 62   = 0;     /* Tab
17a60 6c 65 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64  le to be indexed
17a70 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e   */.  Index *pIn
17a80 64 65 78 20 3d 20 30 3b 20 20 20 2f 2a 20 54 68  dex = 0;   /* Th
17a90 65 20 69 6e 64 65 78 20 74 6f 20 62 65 20 63 72  e index to be cr
17aa0 65 61 74 65 64 20 2a 2f 0a 20 20 63 68 61 72 20  eated */.  char 
17ab0 2a 7a 4e 61 6d 65 20 3d 20 30 3b 20 20 20 20 20  *zName = 0;     
17ac0 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 69  /* Name of the i
17ad0 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e  ndex */.  int nN
17ae0 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f  ame;           /
17af0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 68 61 72  * Number of char
17b00 61 63 74 65 72 73 20 69 6e 20 7a 4e 61 6d 65 20  acters in zName 
17b10 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20  */.  int i, j;. 
17b20 20 44 62 46 69 78 65 72 20 73 46 69 78 3b 20 20   DbFixer sFix;  
17b30 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 61 73 73        /* For ass
17b40 69 67 6e 69 6e 67 20 64 61 74 61 62 61 73 65 20  igning database 
17b50 6e 61 6d 65 73 20 74 6f 20 70 54 61 62 6c 65 20  names to pTable 
17b60 2a 2f 0a 20 20 69 6e 74 20 73 6f 72 74 4f 72 64  */.  int sortOrd
17b70 65 72 4d 61 73 6b 3b 20 20 20 2f 2a 20 31 20 74  erMask;   /* 1 t
17b80 6f 20 68 6f 6e 6f 72 20 44 45 53 43 20 69 6e 20  o honor DESC in 
17b90 69 6e 64 65 78 2e 20 20 30 20 74 6f 20 69 67 6e  index.  0 to ign
17ba0 6f 72 65 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ore. */.  sqlite
17bb0 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
17bc0 64 62 3b 0a 20 20 44 62 20 2a 70 44 62 3b 20 20  db;.  Db *pDb;  
17bd0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
17be0 65 20 73 70 65 63 69 66 69 63 20 74 61 62 6c 65  e specific table
17bf0 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
17c00 69 6e 64 65 78 65 64 20 64 61 74 61 62 61 73 65  indexed database
17c10 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62 3b 20 20   */.  int iDb;  
17c20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
17c30 64 65 78 20 6f 66 20 74 68 65 20 64 61 74 61 62  dex of the datab
17c40 61 73 65 20 74 68 61 74 20 69 73 20 62 65 69 6e  ase that is bein
17c50 67 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20 54  g written */.  T
17c60 6f 6b 65 6e 20 2a 70 4e 61 6d 65 20 3d 20 30 3b  oken *pName = 0;
17c70 20 20 20 20 2f 2a 20 55 6e 71 75 61 6c 69 66 69      /* Unqualifi
17c80 65 64 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 69  ed name of the i
17c90 6e 64 65 78 20 74 6f 20 63 72 65 61 74 65 20 2a  ndex to create *
17ca0 2f 0a 20 20 73 74 72 75 63 74 20 45 78 70 72 4c  /.  struct ExprL
17cb0 69 73 74 5f 69 74 65 6d 20 2a 70 4c 69 73 74 49  ist_item *pListI
17cc0 74 65 6d 3b 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70  tem; /* For loop
17cd0 69 6e 67 20 6f 76 65 72 20 70 4c 69 73 74 20 2a  ing over pList *
17ce0 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 20 3d  /.  int nExtra =
17cf0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
17d00 20 20 20 20 20 2f 2a 20 53 70 61 63 65 20 61 6c       /* Space al
17d10 6c 6f 63 61 74 65 64 20 66 6f 72 20 7a 45 78 74  located for zExt
17d20 72 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e 45  ra[] */.  int nE
17d30 78 74 72 61 43 6f 6c 3b 20 20 20 20 20 20 20 20  xtraCol;        
17d40 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
17d50 6d 62 65 72 20 6f 66 20 65 78 74 72 61 20 63 6f  mber of extra co
17d60 6c 75 6d 6e 73 20 6e 65 65 64 65 64 20 2a 2f 0a  lumns needed */.
17d70 20 20 63 68 61 72 20 2a 7a 45 78 74 72 61 20 3d    char *zExtra =
17d80 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
17d90 20 20 20 2f 2a 20 45 78 74 72 61 20 73 70 61 63     /* Extra spac
17da0 65 20 61 66 74 65 72 20 74 68 65 20 49 6e 64 65  e after the Inde
17db0 78 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 49 6e  x object */.  In
17dc0 64 65 78 20 2a 70 50 6b 20 3d 20 30 3b 20 20 20  dex *pPk = 0;   
17dd0 20 20 20 2f 2a 20 50 52 49 4d 41 52 59 20 4b 45     /* PRIMARY KE
17de0 59 20 69 6e 64 65 78 20 66 6f 72 20 57 49 54 48  Y index for WITH
17df0 4f 55 54 20 52 4f 57 49 44 20 74 61 62 6c 65 73  OUT ROWID tables
17e00 20 2a 2f 0a 0a 20 20 69 66 28 20 64 62 2d 3e 6d   */..  if( db->m
17e10 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20 70  allocFailed || p
17e20 50 61 72 73 65 2d 3e 6e 45 72 72 3e 30 20 29 7b  Parse->nErr>0 ){
17e30 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63  .    goto exit_c
17e40 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d  reate_index;.  }
17e50 0a 20 20 69 66 28 20 49 4e 5f 44 45 43 4c 41 52  .  if( IN_DECLAR
17e60 45 5f 56 54 41 42 20 26 26 20 69 64 78 54 79 70  E_VTAB && idxTyp
17e70 65 21 3d 53 51 4c 49 54 45 5f 49 44 58 54 59 50  e!=SQLITE_IDXTYP
17e80 45 5f 50 52 49 4d 41 52 59 4b 45 59 20 29 7b 0a  E_PRIMARYKEY ){.
17e90 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72      goto exit_cr
17ea0 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a  eate_index;.  }.
17eb0 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21    if( SQLITE_OK!
17ec0 3d 73 71 6c 69 74 65 33 52 65 61 64 53 63 68 65  =sqlite3ReadSche
17ed0 6d 61 28 70 50 61 72 73 65 29 20 29 7b 0a 20 20  ma(pParse) ){.  
17ee0 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61    goto exit_crea
17ef0 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 0a 20  te_index;.  }.. 
17f00 20 2f 2a 0a 20 20 2a 2a 20 46 69 6e 64 20 74 68   /*.  ** Find th
17f10 65 20 74 61 62 6c 65 20 74 68 61 74 20 69 73 20  e table that is 
17f20 74 6f 20 62 65 20 69 6e 64 65 78 65 64 2e 20 20  to be indexed.  
17f30 52 65 74 75 72 6e 20 65 61 72 6c 79 20 69 66 20  Return early if 
17f40 6e 6f 74 20 66 6f 75 6e 64 2e 0a 20 20 2a 2f 0a  not found..  */.
17f50 20 20 69 66 28 20 70 54 62 6c 4e 61 6d 65 21 3d    if( pTblName!=
17f60 30 20 29 7b 0a 0a 20 20 20 20 2f 2a 20 55 73 65  0 ){..    /* Use
17f70 20 74 68 65 20 74 77 6f 2d 70 61 72 74 20 69 6e   the two-part in
17f80 64 65 78 20 6e 61 6d 65 20 74 6f 20 64 65 74 65  dex name to dete
17f90 72 6d 69 6e 65 20 74 68 65 20 64 61 74 61 62 61  rmine the databa
17fa0 73 65 20 0a 20 20 20 20 2a 2a 20 74 6f 20 73 65  se .    ** to se
17fb0 61 72 63 68 20 66 6f 72 20 74 68 65 20 74 61 62  arch for the tab
17fc0 6c 65 2e 20 27 46 69 78 27 20 74 68 65 20 74 61  le. 'Fix' the ta
17fd0 62 6c 65 20 6e 61 6d 65 20 74 6f 20 74 68 69 73  ble name to this
17fe0 20 64 62 0a 20 20 20 20 2a 2a 20 62 65 66 6f 72   db.    ** befor
17ff0 65 20 6c 6f 6f 6b 69 6e 67 20 75 70 20 74 68 65  e looking up the
18000 20 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20   table..    */. 
18010 20 20 20 61 73 73 65 72 74 28 20 70 4e 61 6d 65     assert( pName
18020 31 20 26 26 20 70 4e 61 6d 65 32 20 29 3b 0a 20  1 && pName2 );. 
18030 20 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33     iDb = sqlite3
18040 54 77 6f 50 61 72 74 4e 61 6d 65 28 70 50 61 72  TwoPartName(pPar
18050 73 65 2c 20 70 4e 61 6d 65 31 2c 20 70 4e 61 6d  se, pName1, pNam
18060 65 32 2c 20 26 70 4e 61 6d 65 29 3b 0a 20 20 20  e2, &pName);.   
18070 20 69 66 28 20 69 44 62 3c 30 20 29 20 67 6f 74   if( iDb<0 ) got
18080 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
18090 64 65 78 3b 0a 20 20 20 20 61 73 73 65 72 74 28  dex;.    assert(
180a0 20 70 4e 61 6d 65 20 26 26 20 70 4e 61 6d 65 2d   pName && pName-
180b0 3e 7a 20 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53  >z );..#ifndef S
180c0 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 45 4d 50 44  QLITE_OMIT_TEMPD
180d0 42 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20  B.    /* If the 
180e0 69 6e 64 65 78 20 6e 61 6d 65 20 77 61 73 20 75  index name was u
180f0 6e 71 75 61 6c 69 66 69 65 64 2c 20 63 68 65 63  nqualified, chec
18100 6b 20 69 66 20 74 68 65 20 74 61 62 6c 65 0a 20  k if the table. 
18110 20 20 20 2a 2a 20 69 73 20 61 20 74 65 6d 70 20     ** is a temp 
18120 74 61 62 6c 65 2e 20 49 66 20 73 6f 2c 20 73 65  table. If so, se
18130 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74  t the database t
18140 6f 20 31 2e 20 44 6f 20 6e 6f 74 20 64 6f 20 74  o 1. Do not do t
18150 68 69 73 0a 20 20 20 20 2a 2a 20 69 66 20 69 6e  his.    ** if in
18160 69 74 69 61 6c 69 73 69 6e 67 20 61 20 64 61 74  itialising a dat
18170 61 62 61 73 65 20 73 63 68 65 6d 61 2e 0a 20 20  abase schema..  
18180 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 64 62    */.    if( !db
18190 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20  ->init.busy ){. 
181a0 20 20 20 20 20 70 54 61 62 20 3d 20 73 71 6c 69       pTab = sqli
181b0 74 65 33 53 72 63 4c 69 73 74 4c 6f 6f 6b 75 70  te3SrcListLookup
181c0 28 70 50 61 72 73 65 2c 20 70 54 62 6c 4e 61 6d  (pParse, pTblNam
181d0 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4e  e);.      if( pN
181e0 61 6d 65 32 2d 3e 6e 3d 3d 30 20 26 26 20 70 54  ame2->n==0 && pT
181f0 61 62 20 26 26 20 70 54 61 62 2d 3e 70 53 63 68  ab && pTab->pSch
18200 65 6d 61 3d 3d 64 62 2d 3e 61 44 62 5b 31 5d 2e  ema==db->aDb[1].
18210 70 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 20  pSchema ){.     
18220 20 20 20 69 44 62 20 3d 20 31 3b 0a 20 20 20 20     iDb = 1;.    
18230 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66    }.    }.#endif
18240 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 46 69 78  ..    sqlite3Fix
18250 49 6e 69 74 28 26 73 46 69 78 2c 20 70 50 61 72  Init(&sFix, pPar
18260 73 65 2c 20 69 44 62 2c 20 22 69 6e 64 65 78 22  se, iDb, "index"
18270 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66  , pName);.    if
18280 28 20 73 71 6c 69 74 65 33 46 69 78 53 72 63 4c  ( sqlite3FixSrcL
18290 69 73 74 28 26 73 46 69 78 2c 20 70 54 62 6c 4e  ist(&sFix, pTblN
182a0 61 6d 65 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a  ame) ){.      /*
182b0 20 42 65 63 61 75 73 65 20 74 68 65 20 70 61 72   Because the par
182c0 73 65 72 20 63 6f 6e 73 74 72 75 63 74 73 20 70  ser constructs p
182d0 54 62 6c 4e 61 6d 65 20 66 72 6f 6d 20 61 20 73  TblName from a s
182e0 69 6e 67 6c 65 20 69 64 65 6e 74 69 66 69 65 72  ingle identifier
182f0 2c 0a 20 20 20 20 20 20 2a 2a 20 73 71 6c 69 74  ,.      ** sqlit
18300 65 33 46 69 78 53 72 63 4c 69 73 74 20 63 61 6e  e3FixSrcList can
18310 20 6e 65 76 65 72 20 66 61 69 6c 2e 20 2a 2f 0a   never fail. */.
18320 20 20 20 20 20 20 61 73 73 65 72 74 28 30 29 3b        assert(0);
18330 0a 20 20 20 20 7d 0a 20 20 20 20 70 54 61 62 20  .    }.    pTab 
18340 3d 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54  = sqlite3LocateT
18350 61 62 6c 65 49 74 65 6d 28 70 50 61 72 73 65 2c  ableItem(pParse,
18360 20 30 2c 20 26 70 54 62 6c 4e 61 6d 65 2d 3e 61   0, &pTblName->a
18370 5b 30 5d 29 3b 0a 20 20 20 20 61 73 73 65 72 74  [0]);.    assert
18380 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
18390 65 64 3d 3d 30 20 7c 7c 20 70 54 61 62 3d 3d 30  ed==0 || pTab==0
183a0 20 29 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62   );.    if( pTab
183b0 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78 69 74 5f  ==0 ) goto exit_
183c0 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
183d0 20 20 69 66 28 20 69 44 62 3d 3d 31 20 26 26 20    if( iDb==1 && 
183e0 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53 63  db->aDb[iDb].pSc
183f0 68 65 6d 61 21 3d 70 54 61 62 2d 3e 70 53 63 68  hema!=pTab->pSch
18400 65 6d 61 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ema ){.      sql
18410 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
18420 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20  rse, .          
18430 20 22 63 61 6e 6e 6f 74 20 63 72 65 61 74 65 20   "cannot create 
18440 61 20 54 45 4d 50 20 69 6e 64 65 78 20 6f 6e 20  a TEMP index on 
18450 6e 6f 6e 2d 54 45 4d 50 20 74 61 62 6c 65 20 5c  non-TEMP table \
18460 22 25 73 5c 22 22 2c 0a 20 20 20 20 20 20 20 20  "%s\"",.        
18470 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b     pTab->zName);
18480 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74  .      goto exit
18490 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
184a0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21 48 61     }.    if( !Ha
184b0 73 52 6f 77 69 64 28 70 54 61 62 29 20 29 20 70  sRowid(pTab) ) p
184c0 50 6b 20 3d 20 73 71 6c 69 74 65 33 50 72 69 6d  Pk = sqlite3Prim
184d0 61 72 79 4b 65 79 49 6e 64 65 78 28 70 54 61 62  aryKeyIndex(pTab
184e0 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
184f0 61 73 73 65 72 74 28 20 70 4e 61 6d 65 3d 3d 30  assert( pName==0
18500 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
18510 70 53 74 61 72 74 3d 3d 30 20 29 3b 0a 20 20 20  pStart==0 );.   
18520 20 70 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e   pTab = pParse->
18530 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 20 20 69  pNewTable;.    i
18540 66 28 20 21 70 54 61 62 20 29 20 67 6f 74 6f 20  f( !pTab ) goto 
18550 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
18560 78 3b 0a 20 20 20 20 69 44 62 20 3d 20 73 71 6c  x;.    iDb = sql
18570 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65  ite3SchemaToInde
18580 78 28 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68  x(db, pTab->pSch
18590 65 6d 61 29 3b 0a 20 20 7d 0a 20 20 70 44 62 20  ema);.  }.  pDb 
185a0 3d 20 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d 3b  = &db->aDb[iDb];
185b0 0a 0a 20 20 61 73 73 65 72 74 28 20 70 54 61 62  ..  assert( pTab
185c0 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
185d0 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30   pParse->nErr==0
185e0 20 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65   );.  if( sqlite
185f0 33 53 74 72 4e 49 43 6d 70 28 70 54 61 62 2d 3e  3StrNICmp(pTab->
18600 7a 4e 61 6d 65 2c 20 22 73 71 6c 69 74 65 5f 22  zName, "sqlite_"
18610 2c 20 37 29 3d 3d 30 20 0a 20 20 20 20 20 20 20  , 7)==0 .       
18620 26 26 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  && db->init.busy
18630 3d 3d 30 0a 23 69 66 20 53 51 4c 49 54 45 5f 55  ==0.#if SQLITE_U
18640 53 45 52 5f 41 55 54 48 45 4e 54 49 43 41 54 49  SER_AUTHENTICATI
18650 4f 4e 0a 20 20 20 20 20 20 20 26 26 20 73 71 6c  ON.       && sql
18660 69 74 65 33 55 73 65 72 41 75 74 68 54 61 62 6c  ite3UserAuthTabl
18670 65 28 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3d 3d  e(pTab->zName)==
18680 30 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20  0.#endif.       
18690 26 26 20 73 71 6c 69 74 65 33 53 74 72 4e 49 43  && sqlite3StrNIC
186a0 6d 70 28 26 70 54 61 62 2d 3e 7a 4e 61 6d 65 5b  mp(&pTab->zName[
186b0 37 5d 2c 22 61 6c 74 65 72 74 61 62 5f 22 2c 39  7],"altertab_",9
186c0 29 21 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  )!=0 ){.    sqli
186d0 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
186e0 73 65 2c 20 22 74 61 62 6c 65 20 25 73 20 6d 61  se, "table %s ma
186f0 79 20 6e 6f 74 20 62 65 20 69 6e 64 65 78 65 64  y not be indexed
18700 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b  ", pTab->zName);
18710 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63  .    goto exit_c
18720 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d  reate_index;.  }
18730 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
18740 4f 4d 49 54 5f 56 49 45 57 0a 20 20 69 66 28 20  OMIT_VIEW.  if( 
18750 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 29 7b  pTab->pSelect ){
18760 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
18770 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 76 69  rMsg(pParse, "vi
18780 65 77 73 20 6d 61 79 20 6e 6f 74 20 62 65 20 69  ews may not be i
18790 6e 64 65 78 65 64 22 29 3b 0a 20 20 20 20 67 6f  ndexed");.    go
187a0 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
187b0 6e 64 65 78 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  ndex;.  }.#endif
187c0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
187d0 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
187e0 45 0a 20 20 69 66 28 20 49 73 56 69 72 74 75 61  E.  if( IsVirtua
187f0 6c 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20 73  l(pTab) ){.    s
18800 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
18810 50 61 72 73 65 2c 20 22 76 69 72 74 75 61 6c 20  Parse, "virtual 
18820 74 61 62 6c 65 73 20 6d 61 79 20 6e 6f 74 20 62  tables may not b
18830 65 20 69 6e 64 65 78 65 64 22 29 3b 0a 20 20 20  e indexed");.   
18840 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
18850 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 23 65 6e  e_index;.  }.#en
18860 64 69 66 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46  dif..  /*.  ** F
18870 69 6e 64 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  ind the name of 
18880 74 68 65 20 69 6e 64 65 78 2e 20 20 4d 61 6b 65  the index.  Make
18890 20 73 75 72 65 20 74 68 65 72 65 20 69 73 20 6e   sure there is n
188a0 6f 74 20 61 6c 72 65 61 64 79 20 61 6e 6f 74 68  ot already anoth
188b0 65 72 0a 20 20 2a 2a 20 69 6e 64 65 78 20 6f 72  er.  ** index or
188c0 20 74 61 62 6c 65 20 77 69 74 68 20 74 68 65 20   table with the 
188d0 73 61 6d 65 20 6e 61 6d 65 2e 20 20 0a 20 20 2a  same name.  .  *
188e0 2a 0a 20 20 2a 2a 20 45 78 63 65 70 74 69 6f 6e  *.  ** Exception
188f0 3a 20 20 49 66 20 77 65 20 61 72 65 20 72 65 61  :  If we are rea
18900 64 69 6e 67 20 74 68 65 20 6e 61 6d 65 73 20 6f  ding the names o
18910 66 20 70 65 72 6d 61 6e 65 6e 74 20 69 6e 64 69  f permanent indi
18920 63 65 73 20 66 72 6f 6d 20 74 68 65 0a 20 20 2a  ces from the.  *
18930 2a 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  * sqlite_master 
18940 74 61 62 6c 65 20 28 62 65 63 61 75 73 65 20 73  table (because s
18950 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73  ome other proces
18960 73 20 63 68 61 6e 67 65 64 20 74 68 65 20 73 63  s changed the sc
18970 68 65 6d 61 29 20 61 6e 64 0a 20 20 2a 2a 20 6f  hema) and.  ** o
18980 6e 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20  ne of the index 
18990 6e 61 6d 65 73 20 63 6f 6c 6c 69 64 65 73 20 77  names collides w
189a0 69 74 68 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  ith the name of 
189b0 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  a temporary tabl
189c0 65 20 6f 72 0a 20 20 2a 2a 20 69 6e 64 65 78 2c  e or.  ** index,
189d0 20 74 68 65 6e 20 77 65 20 77 69 6c 6c 20 63 6f   then we will co
189e0 6e 74 69 6e 75 65 20 74 6f 20 70 72 6f 63 65 73  ntinue to proces
189f0 73 20 74 68 69 73 20 69 6e 64 65 78 2e 0a 20 20  s this index..  
18a00 2a 2a 0a 20 20 2a 2a 20 49 66 20 70 4e 61 6d 65  **.  ** If pName
18a10 3d 3d 30 20 69 74 20 6d 65 61 6e 73 20 74 68 61  ==0 it means tha
18a20 74 20 77 65 20 61 72 65 0a 20 20 2a 2a 20 64 65  t we are.  ** de
18a30 61 6c 69 6e 67 20 77 69 74 68 20 61 20 70 72 69  aling with a pri
18a40 6d 61 72 79 20 6b 65 79 20 6f 72 20 55 4e 49 51  mary key or UNIQ
18a50 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 2e 20 20  UE constraint.  
18a60 57 65 20 68 61 76 65 20 74 6f 20 69 6e 76 65 6e  We have to inven
18a70 74 20 6f 75 72 0a 20 20 2a 2a 20 6f 77 6e 20 6e  t our.  ** own n
18a80 61 6d 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ame..  */.  if( 
18a90 70 4e 61 6d 65 20 29 7b 0a 20 20 20 20 7a 4e 61  pName ){.    zNa
18aa0 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65  me = sqlite3Name
18ab0 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 4e  FromToken(db, pN
18ac0 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 7a 4e  ame);.    if( zN
18ad0 61 6d 65 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78  ame==0 ) goto ex
18ae0 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
18af0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 61  .    assert( pNa
18b00 6d 65 2d 3e 7a 21 3d 30 20 29 3b 0a 20 20 20 20  me->z!=0 );.    
18b10 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73  if( SQLITE_OK!=s
18b20 71 6c 69 74 65 33 43 68 65 63 6b 4f 62 6a 65 63  qlite3CheckObjec
18b30 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 7a 4e  tName(pParse, zN
18b40 61 6d 65 29 20 29 7b 0a 20 20 20 20 20 20 67 6f  ame) ){.      go
18b50 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
18b60 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ndex;.    }.    
18b70 69 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75  if( !db->init.bu
18b80 73 79 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  sy ){.      if( 
18b90 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65  sqlite3FindTable
18ba0 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 30 29 21 3d  (db, zName, 0)!=
18bb0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  0 ){.        sql
18bc0 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
18bd0 72 73 65 2c 20 22 74 68 65 72 65 20 69 73 20 61  rse, "there is a
18be0 6c 72 65 61 64 79 20 61 20 74 61 62 6c 65 20 6e  lready a table n
18bf0 61 6d 65 64 20 25 73 22 2c 20 7a 4e 61 6d 65 29  amed %s", zName)
18c00 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65  ;.        goto e
18c10 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
18c20 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
18c30 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 46      if( sqlite3F
18c40 69 6e 64 49 6e 64 65 78 28 64 62 2c 20 7a 4e 61  indIndex(db, zNa
18c50 6d 65 2c 20 70 44 62 2d 3e 7a 44 62 53 4e 61 6d  me, pDb->zDbSNam
18c60 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  e)!=0 ){.      i
18c70 66 28 20 21 69 66 4e 6f 74 45 78 69 73 74 20 29  f( !ifNotExist )
18c80 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
18c90 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
18ca0 2c 20 22 69 6e 64 65 78 20 25 73 20 61 6c 72 65  , "index %s alre
18cb0 61 64 79 20 65 78 69 73 74 73 22 2c 20 7a 4e 61  ady exists", zNa
18cc0 6d 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  me);.      }else
18cd0 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
18ce0 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  ( !db->init.busy
18cf0 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   );.        sqli
18d00 74 65 33 43 6f 64 65 56 65 72 69 66 79 53 63 68  te3CodeVerifySch
18d10 65 6d 61 28 70 50 61 72 73 65 2c 20 69 44 62 29  ema(pParse, iDb)
18d20 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
18d30 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
18d40 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20  _index;.    }.  
18d50 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 6e  }else{.    int n
18d60 3b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 4c 6f  ;.    Index *pLo
18d70 6f 70 3b 0a 20 20 20 20 66 6f 72 28 70 4c 6f 6f  op;.    for(pLoo
18d80 70 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 2c 20  p=pTab->pIndex, 
18d90 6e 3d 31 3b 20 70 4c 6f 6f 70 3b 20 70 4c 6f 6f  n=1; pLoop; pLoo
18da0 70 3d 70 4c 6f 6f 70 2d 3e 70 4e 65 78 74 2c 20  p=pLoop->pNext, 
18db0 6e 2b 2b 29 7b 7d 0a 20 20 20 20 7a 4e 61 6d 65  n++){}.    zName
18dc0 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74   = sqlite3MPrint
18dd0 66 28 64 62 2c 20 22 73 71 6c 69 74 65 5f 61 75  f(db, "sqlite_au
18de0 74 6f 69 6e 64 65 78 5f 25 73 5f 25 64 22 2c 20  toindex_%s_%d", 
18df0 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 6e 29 3b  pTab->zName, n);
18e00 0a 20 20 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d  .    if( zName==
18e10 30 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  0 ){.      goto 
18e20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
18e30 78 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  x;.    }..    /*
18e40 20 41 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78   Automatic index
18e50 20 6e 61 6d 65 73 20 67 65 6e 65 72 61 74 65 64   names generated
18e60 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 73 71 6c   from within sql
18e70 69 74 65 33 5f 64 65 63 6c 61 72 65 5f 76 74 61  ite3_declare_vta
18e80 62 28 29 0a 20 20 20 20 2a 2a 20 6d 75 73 74 20  b().    ** must 
18e90 68 61 76 65 20 6e 61 6d 65 73 20 74 68 61 74 20  have names that 
18ea0 61 72 65 20 64 69 73 74 69 6e 63 74 20 66 72 6f  are distinct fro
18eb0 6d 20 6e 6f 72 6d 61 6c 20 61 75 74 6f 6d 61 74  m normal automat
18ec0 69 63 20 69 6e 64 65 78 20 6e 61 6d 65 73 2e 0a  ic index names..
18ed0 20 20 20 20 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f      ** The follo
18ee0 77 69 6e 67 20 73 74 61 74 65 6d 65 6e 74 20 63  wing statement c
18ef0 6f 6e 76 65 72 74 73 20 22 73 71 6c 69 74 65 33  onverts "sqlite3
18f00 5f 61 75 74 6f 69 6e 64 65 78 2e 2e 2e 22 20 69  _autoindex..." i
18f10 6e 74 6f 0a 20 20 20 20 2a 2a 20 22 73 71 6c 69  nto.    ** "sqli
18f20 74 65 33 5f 62 75 74 6f 69 6e 64 65 78 2e 2e 2e  te3_butoindex...
18f30 22 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 6d 61  " in order to ma
18f40 6b 65 20 74 68 65 20 6e 61 6d 65 73 20 64 69 73  ke the names dis
18f50 74 69 6e 63 74 2e 0a 20 20 20 20 2a 2a 20 54 68  tinct..    ** Th
18f60 65 20 22 76 74 61 62 5f 65 72 72 2e 74 65 73 74  e "vtab_err.test
18f70 22 20 74 65 73 74 20 64 65 6d 6f 6e 73 74 72 61  " test demonstra
18f80 74 65 73 20 74 68 65 20 6e 65 65 64 20 6f 66 20  tes the need of 
18f90 74 68 69 73 20 73 74 61 74 65 6d 65 6e 74 2e 20  this statement. 
18fa0 2a 2f 0a 20 20 20 20 69 66 28 20 49 4e 5f 44 45  */.    if( IN_DE
18fb0 43 4c 41 52 45 5f 56 54 41 42 20 29 20 7a 4e 61  CLARE_VTAB ) zNa
18fc0 6d 65 5b 37 5d 2b 2b 3b 0a 20 20 7d 0a 0a 20 20  me[7]++;.  }..  
18fd0 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 61 75 74  /* Check for aut
18fe0 68 6f 72 69 7a 61 74 69 6f 6e 20 74 6f 20 63 72  horization to cr
18ff0 65 61 74 65 20 61 6e 20 69 6e 64 65 78 2e 0a 20  eate an index.. 
19000 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   */.#ifndef SQLI
19010 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a  TE_OMIT_AUTHORIZ
19020 41 54 49 4f 4e 0a 20 20 7b 0a 20 20 20 20 63 6f  ATION.  {.    co
19030 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 20 3d 20  nst char *zDb = 
19040 70 44 62 2d 3e 7a 44 62 53 4e 61 6d 65 3b 0a 20  pDb->zDbSName;. 
19050 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75     if( sqlite3Au
19060 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  thCheck(pParse, 
19070 53 51 4c 49 54 45 5f 49 4e 53 45 52 54 2c 20 53  SQLITE_INSERT, S
19080 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 44 62 29  CHEMA_TABLE(iDb)
19090 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20  , 0, zDb) ){.   
190a0 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65     goto exit_cre
190b0 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d  ate_index;.    }
190c0 0a 20 20 20 20 69 20 3d 20 53 51 4c 49 54 45 5f  .    i = SQLITE_
190d0 43 52 45 41 54 45 5f 49 4e 44 45 58 3b 0a 20 20  CREATE_INDEX;.  
190e0 20 20 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50    if( !OMIT_TEMP
190f0 44 42 20 26 26 20 69 44 62 3d 3d 31 20 29 20 69  DB && iDb==1 ) i
19100 20 3d 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45   = SQLITE_CREATE
19110 5f 54 45 4d 50 5f 49 4e 44 45 58 3b 0a 20 20 20  _TEMP_INDEX;.   
19120 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68   if( sqlite3Auth
19130 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 69 2c  Check(pParse, i,
19140 20 7a 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 7a 4e   zName, pTab->zN
19150 61 6d 65 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20  ame, zDb) ){.   
19160 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65     goto exit_cre
19170 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d  ate_index;.    }
19180 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  .  }.#endif..  /
19190 2a 20 49 66 20 70 4c 69 73 74 3d 3d 30 2c 20 69  * If pList==0, i
191a0 74 20 6d 65 61 6e 73 20 74 68 69 73 20 72 6f 75  t means this rou
191b0 74 69 6e 65 20 77 61 73 20 63 61 6c 6c 65 64 20  tine was called 
191c0 74 6f 20 6d 61 6b 65 20 61 20 70 72 69 6d 61 72  to make a primar
191d0 79 0a 20 20 2a 2a 20 6b 65 79 20 6f 75 74 20 6f  y.  ** key out o
191e0 66 20 74 68 65 20 6c 61 73 74 20 63 6f 6c 75 6d  f the last colum
191f0 6e 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 74  n added to the t
19200 61 62 6c 65 20 75 6e 64 65 72 20 63 6f 6e 73 74  able under const
19210 72 75 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 53 6f  ruction..  ** So
19220 20 63 72 65 61 74 65 20 61 20 66 61 6b 65 20 6c   create a fake l
19230 69 73 74 20 74 6f 20 73 69 6d 75 6c 61 74 65 20  ist to simulate 
19240 74 68 69 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  this..  */.  if(
19250 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20   pList==0 ){.   
19260 20 54 6f 6b 65 6e 20 70 72 65 76 43 6f 6c 3b 0a   Token prevCol;.
19270 20 20 20 20 73 71 6c 69 74 65 33 54 6f 6b 65 6e      sqlite3Token
19280 49 6e 69 74 28 26 70 72 65 76 43 6f 6c 2c 20 70  Init(&prevCol, p
19290 54 61 62 2d 3e 61 43 6f 6c 5b 70 54 61 62 2d 3e  Tab->aCol[pTab->
192a0 6e 43 6f 6c 2d 31 5d 2e 7a 4e 61 6d 65 29 3b 0a  nCol-1].zName);.
192b0 20 20 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69      pList = sqli
192c0 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e  te3ExprListAppen
192d0 64 28 70 50 61 72 73 65 2c 20 30 2c 0a 20 20 20  d(pParse, 0,.   
192e0 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
192f0 65 33 45 78 70 72 41 6c 6c 6f 63 28 64 62 2c 20  e3ExprAlloc(db, 
19300 54 4b 5f 49 44 2c 20 26 70 72 65 76 43 6f 6c 2c  TK_ID, &prevCol,
19310 20 30 29 29 3b 0a 20 20 20 20 69 66 28 20 70 4c   0));.    if( pL
19320 69 73 74 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78  ist==0 ) goto ex
19330 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
19340 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 69  .    assert( pLi
19350 73 74 2d 3e 6e 45 78 70 72 3d 3d 31 20 29 3b 0a  st->nExpr==1 );.
19360 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c      sqlite3ExprL
19370 69 73 74 53 65 74 53 6f 72 74 4f 72 64 65 72 28  istSetSortOrder(
19380 70 4c 69 73 74 2c 20 73 6f 72 74 4f 72 64 65 72  pList, sortOrder
19390 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
193a0 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 43  sqlite3ExprListC
193b0 68 65 63 6b 4c 65 6e 67 74 68 28 70 50 61 72 73  heckLength(pPars
193c0 65 2c 20 70 4c 69 73 74 2c 20 22 69 6e 64 65 78  e, pList, "index
193d0 22 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69  ");.  }..  /* Fi
193e0 67 75 72 65 20 6f 75 74 20 68 6f 77 20 6d 61 6e  gure out how man
193f0 79 20 62 79 74 65 73 20 6f 66 20 73 70 61 63 65  y bytes of space
19400 20 61 72 65 20 72 65 71 75 69 72 65 64 20 74 6f   are required to
19410 20 73 74 6f 72 65 20 65 78 70 6c 69 63 69 74 6c   store explicitl
19420 79 0a 20 20 2a 2a 20 73 70 65 63 69 66 69 65 64  y.  ** specified
19430 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
19440 6e 63 65 20 6e 61 6d 65 73 2e 0a 20 20 2a 2f 0a  nce names..  */.
19450 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69    for(i=0; i<pLi
19460 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  st->nExpr; i++){
19470 0a 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72  .    Expr *pExpr
19480 20 3d 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70   = pList->a[i].p
19490 45 78 70 72 3b 0a 20 20 20 20 61 73 73 65 72 74  Expr;.    assert
194a0 28 20 70 45 78 70 72 21 3d 30 20 29 3b 0a 20 20  ( pExpr!=0 );.  
194b0 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d    if( pExpr->op=
194c0 3d 54 4b 5f 43 4f 4c 4c 41 54 45 20 29 7b 0a 20  =TK_COLLATE ){. 
194d0 20 20 20 20 20 6e 45 78 74 72 61 20 2b 3d 20 28       nExtra += (
194e0 31 20 2b 20 73 71 6c 69 74 65 33 53 74 72 6c 65  1 + sqlite3Strle
194f0 6e 33 30 28 70 45 78 70 72 2d 3e 75 2e 7a 54 6f  n30(pExpr->u.zTo
19500 6b 65 6e 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ken));.    }.  }
19510 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 41 6c 6c  ..  /* .  ** All
19520 6f 63 61 74 65 20 74 68 65 20 69 6e 64 65 78 20  ocate the index 
19530 73 74 72 75 63 74 75 72 65 2e 20 0a 20 20 2a 2f  structure. .  */
19540 0a 20 20 6e 4e 61 6d 65 20 3d 20 73 71 6c 69 74  .  nName = sqlit
19550 65 33 53 74 72 6c 65 6e 33 30 28 7a 4e 61 6d 65  e3Strlen30(zName
19560 29 3b 0a 20 20 6e 45 78 74 72 61 43 6f 6c 20 3d  );.  nExtraCol =
19570 20 70 50 6b 20 3f 20 70 50 6b 2d 3e 6e 4b 65 79   pPk ? pPk->nKey
19580 43 6f 6c 20 3a 20 31 3b 0a 20 20 70 49 6e 64 65  Col : 1;.  pInde
19590 78 20 3d 20 73 71 6c 69 74 65 33 41 6c 6c 6f 63  x = sqlite3Alloc
195a0 61 74 65 49 6e 64 65 78 4f 62 6a 65 63 74 28 64  ateIndexObject(d
195b0 62 2c 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20  b, pList->nExpr 
195c0 2b 20 6e 45 78 74 72 61 43 6f 6c 2c 0a 20 20 20  + nExtraCol,.   
195d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
195e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
195f0 20 20 20 6e 4e 61 6d 65 20 2b 20 6e 45 78 74 72     nName + nExtr
19600 61 20 2b 20 31 2c 20 26 7a 45 78 74 72 61 29 3b  a + 1, &zExtra);
19610 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f  .  if( db->mallo
19620 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 67  cFailed ){.    g
19630 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
19640 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 61 73 73  index;.  }.  ass
19650 65 72 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f  ert( EIGHT_BYTE_
19660 41 4c 49 47 4e 4d 45 4e 54 28 70 49 6e 64 65 78  ALIGNMENT(pIndex
19670 2d 3e 61 69 52 6f 77 4c 6f 67 45 73 74 29 20 29  ->aiRowLogEst) )
19680 3b 0a 20 20 61 73 73 65 72 74 28 20 45 49 47 48  ;.  assert( EIGH
19690 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54  T_BYTE_ALIGNMENT
196a0 28 70 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c 29  (pIndex->azColl)
196b0 20 29 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 7a 4e   );.  pIndex->zN
196c0 61 6d 65 20 3d 20 7a 45 78 74 72 61 3b 0a 20 20  ame = zExtra;.  
196d0 7a 45 78 74 72 61 20 2b 3d 20 6e 4e 61 6d 65 20  zExtra += nName 
196e0 2b 20 31 3b 0a 20 20 6d 65 6d 63 70 79 28 70 49  + 1;.  memcpy(pI
196f0 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 7a 4e 61  ndex->zName, zNa
19700 6d 65 2c 20 6e 4e 61 6d 65 2b 31 29 3b 0a 20 20  me, nName+1);.  
19710 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 20 3d  pIndex->pTable =
19720 20 70 54 61 62 3b 0a 20 20 70 49 6e 64 65 78 2d   pTab;.  pIndex-
19730 3e 6f 6e 45 72 72 6f 72 20 3d 20 28 75 38 29 6f  >onError = (u8)o
19740 6e 45 72 72 6f 72 3b 0a 20 20 70 49 6e 64 65 78  nError;.  pIndex
19750 2d 3e 75 6e 69 71 4e 6f 74 4e 75 6c 6c 20 3d 20  ->uniqNotNull = 
19760 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65  onError!=OE_None
19770 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 69 64 78 54  ;.  pIndex->idxT
19780 79 70 65 20 3d 20 69 64 78 54 79 70 65 3b 0a 20  ype = idxType;. 
19790 20 70 49 6e 64 65 78 2d 3e 70 53 63 68 65 6d 61   pIndex->pSchema
197a0 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e   = db->aDb[iDb].
197b0 70 53 63 68 65 6d 61 3b 0a 20 20 70 49 6e 64 65  pSchema;.  pInde
197c0 78 2d 3e 6e 4b 65 79 43 6f 6c 20 3d 20 70 4c 69  x->nKeyCol = pLi
197d0 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 69 66 28  st->nExpr;.  if(
197e0 20 70 50 49 57 68 65 72 65 20 29 7b 0a 20 20 20   pPIWhere ){.   
197f0 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 53   sqlite3ResolveS
19800 65 6c 66 52 65 66 65 72 65 6e 63 65 28 70 50 61  elfReference(pPa
19810 72 73 65 2c 20 70 54 61 62 2c 20 4e 43 5f 50 61  rse, pTab, NC_Pa
19820 72 74 49 64 78 2c 20 70 50 49 57 68 65 72 65 2c  rtIdx, pPIWhere,
19830 20 30 29 3b 0a 20 20 20 20 70 49 6e 64 65 78 2d   0);.    pIndex-
19840 3e 70 50 61 72 74 49 64 78 57 68 65 72 65 20 3d  >pPartIdxWhere =
19850 20 70 50 49 57 68 65 72 65 3b 0a 20 20 20 20 70   pPIWhere;.    p
19860 50 49 57 68 65 72 65 20 3d 20 30 3b 0a 20 20 7d  PIWhere = 0;.  }
19870 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
19880 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c  e3SchemaMutexHel
19890 64 28 64 62 2c 20 69 44 62 2c 20 30 29 20 29 3b  d(db, iDb, 0) );
198a0 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20  ..  /* Check to 
198b0 73 65 65 20 69 66 20 77 65 20 73 68 6f 75 6c 64  see if we should
198c0 20 68 6f 6e 6f 72 20 44 45 53 43 20 72 65 71 75   honor DESC requ
198d0 65 73 74 73 20 6f 6e 20 69 6e 64 65 78 20 63 6f  ests on index co
198e0 6c 75 6d 6e 73 0a 20 20 2a 2f 0a 20 20 69 66 28  lumns.  */.  if(
198f0 20 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 66   pDb->pSchema->f
19900 69 6c 65 5f 66 6f 72 6d 61 74 3e 3d 34 20 29 7b  ile_format>=4 ){
19910 0a 20 20 20 20 73 6f 72 74 4f 72 64 65 72 4d 61  .    sortOrderMa
19920 73 6b 20 3d 20 2d 31 3b 20 20 20 2f 2a 20 48 6f  sk = -1;   /* Ho
19930 6e 6f 72 20 44 45 53 43 20 2a 2f 0a 20 20 7d 65  nor DESC */.  }e
19940 6c 73 65 7b 0a 20 20 20 20 73 6f 72 74 4f 72 64  lse{.    sortOrd
19950 65 72 4d 61 73 6b 20 3d 20 30 3b 20 20 20 20 2f  erMask = 0;    /
19960 2a 20 49 67 6e 6f 72 65 20 44 45 53 43 20 2a 2f  * Ignore DESC */
19970 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6e 61 6c 79  .  }..  /* Analy
19980 7a 65 20 74 68 65 20 6c 69 73 74 20 6f 66 20 65  ze the list of e
19990 78 70 72 65 73 73 69 6f 6e 73 20 74 68 61 74 20  xpressions that 
199a0 66 6f 72 6d 20 74 68 65 20 74 65 72 6d 73 20 6f  form the terms o
199b0 66 20 74 68 65 20 69 6e 64 65 78 20 61 6e 64 0a  f the index and.
199c0 20 20 2a 2a 20 72 65 70 6f 72 74 20 61 6e 79 20    ** report any 
199d0 65 72 72 6f 72 73 2e 20 20 49 6e 20 74 68 65 20  errors.  In the 
199e0 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65 72  common case wher
199f0 65 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  e the expression
19a00 20 69 73 20 65 78 61 63 74 6c 79 0a 20 20 2a 2a   is exactly.  **
19a10 20 61 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 2c   a table column,
19a20 20 73 74 6f 72 65 20 74 68 61 74 20 63 6f 6c 75   store that colu
19a30 6d 6e 20 69 6e 20 61 69 43 6f 6c 75 6d 6e 5b 5d  mn in aiColumn[]
19a40 2e 20 20 46 6f 72 20 67 65 6e 65 72 61 6c 20 65  .  For general e
19a50 78 70 72 65 73 73 69 6f 6e 73 2c 0a 20 20 2a 2a  xpressions,.  **
19a60 20 70 6f 70 75 6c 61 74 65 20 70 49 6e 64 65 78   populate pIndex
19a70 2d 3e 61 43 6f 6c 45 78 70 72 20 61 6e 64 20 73  ->aColExpr and s
19a80 74 6f 72 65 20 58 4e 5f 45 58 50 52 20 28 2d 32  tore XN_EXPR (-2
19a90 29 20 69 6e 20 61 69 43 6f 6c 75 6d 6e 5b 5d 2e  ) in aiColumn[].
19aa0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 4f 44 4f 3a  .  **.  ** TODO:
19ab0 20 49 73 73 75 65 20 61 20 77 61 72 6e 69 6e 67   Issue a warning
19ac0 20 69 66 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20   if two or more 
19ad0 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 69  columns of the i
19ae0 6e 64 65 78 20 61 72 65 20 69 64 65 6e 74 69 63  ndex are identic
19af0 61 6c 2e 0a 20 20 2a 2a 20 54 4f 44 4f 3a 20 49  al..  ** TODO: I
19b00 73 73 75 65 20 61 20 77 61 72 6e 69 6e 67 20 69  ssue a warning i
19b10 66 20 74 68 65 20 74 61 62 6c 65 20 70 72 69 6d  f the table prim
19b20 61 72 79 20 6b 65 79 20 69 73 20 75 73 65 64 20  ary key is used 
19b30 61 73 20 70 61 72 74 20 6f 66 20 74 68 65 0a 20  as part of the. 
19b40 20 2a 2a 20 69 6e 64 65 78 20 6b 65 79 2e 0a 20   ** index key.. 
19b50 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70   */.  for(i=0, p
19b60 4c 69 73 74 49 74 65 6d 3d 70 4c 69 73 74 2d 3e  ListItem=pList->
19b70 61 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70  a; i<pList->nExp
19b80 72 3b 20 69 2b 2b 2c 20 70 4c 69 73 74 49 74 65  r; i++, pListIte
19b90 6d 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a  m++){.    Expr *
19ba0 70 43 45 78 70 72 3b 20 20 20 20 20 20 20 20 20  pCExpr;         
19bb0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
19bc0 69 2d 74 68 20 69 6e 64 65 78 20 65 78 70 72 65  i-th index expre
19bd0 73 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 69 6e 74  ssion */.    int
19be0 20 72 65 71 75 65 73 74 65 64 53 6f 72 74 4f 72   requestedSortOr
19bf0 64 65 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 41  der;        /* A
19c00 53 43 20 6f 72 20 44 45 53 43 20 6f 6e 20 74 68  SC or DESC on th
19c10 65 20 69 2d 74 68 20 65 78 70 72 65 73 73 69 6f  e i-th expressio
19c20 6e 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20 63  n */.    const c
19c30 68 61 72 20 2a 7a 43 6f 6c 6c 3b 20 20 20 20 20  har *zColl;     
19c40 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 6c 61          /* Colla
19c50 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 6e 61  tion sequence na
19c60 6d 65 20 2a 2f 0a 0a 20 20 20 20 73 71 6c 69 74  me */..    sqlit
19c70 65 33 53 74 72 69 6e 67 54 6f 49 64 28 70 4c 69  e3StringToId(pLi
19c80 73 74 49 74 65 6d 2d 3e 70 45 78 70 72 29 3b 0a  stItem->pExpr);.
19c90 20 20 20 20 73 71 6c 69 74 65 33 52 65 73 6f 6c      sqlite3Resol
19ca0 76 65 53 65 6c 66 52 65 66 65 72 65 6e 63 65 28  veSelfReference(
19cb0 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20 4e 43  pParse, pTab, NC
19cc0 5f 49 64 78 45 78 70 72 2c 20 70 4c 69 73 74 49  _IdxExpr, pListI
19cd0 74 65 6d 2d 3e 70 45 78 70 72 2c 20 30 29 3b 0a  tem->pExpr, 0);.
19ce0 20 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e      if( pParse->
19cf0 6e 45 72 72 20 29 20 67 6f 74 6f 20 65 78 69 74  nErr ) goto exit
19d00 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
19d10 20 20 20 70 43 45 78 70 72 20 3d 20 73 71 6c 69     pCExpr = sqli
19d20 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61  te3ExprSkipColla
19d30 74 65 28 70 4c 69 73 74 49 74 65 6d 2d 3e 70 45  te(pListItem->pE
19d40 78 70 72 29 3b 0a 20 20 20 20 69 66 28 20 70 43  xpr);.    if( pC
19d50 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c  Expr->op!=TK_COL
19d60 55 4d 4e 20 29 7b 0a 20 20 20 20 20 20 69 66 28  UMN ){.      if(
19d70 20 70 54 61 62 3d 3d 70 50 61 72 73 65 2d 3e 70   pTab==pParse->p
19d80 4e 65 77 54 61 62 6c 65 20 29 7b 0a 20 20 20 20  NewTable ){.    
19d90 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
19da0 4d 73 67 28 70 50 61 72 73 65 2c 20 22 65 78 70  Msg(pParse, "exp
19db0 72 65 73 73 69 6f 6e 73 20 70 72 6f 68 69 62 69  ressions prohibi
19dc0 74 65 64 20 69 6e 20 50 52 49 4d 41 52 59 20 4b  ted in PRIMARY K
19dd0 45 59 20 61 6e 64 20 22 0a 20 20 20 20 20 20 20  EY and ".       
19de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19df0 20 20 20 20 20 20 20 20 20 22 55 4e 49 51 55 45           "UNIQUE
19e00 20 63 6f 6e 73 74 72 61 69 6e 74 73 22 29 3b 0a   constraints");.
19e10 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69          goto exi
19e20 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
19e30 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
19e40 28 20 70 49 6e 64 65 78 2d 3e 61 43 6f 6c 45 78  ( pIndex->aColEx
19e50 70 72 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  pr==0 ){.       
19e60 20 45 78 70 72 4c 69 73 74 20 2a 70 43 6f 70 79   ExprList *pCopy
19e70 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69   = sqlite3ExprLi
19e80 73 74 44 75 70 28 64 62 2c 20 70 4c 69 73 74 2c  stDup(db, pList,
19e90 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70 49 6e   0);.        pIn
19ea0 64 65 78 2d 3e 61 43 6f 6c 45 78 70 72 20 3d 20  dex->aColExpr = 
19eb0 70 43 6f 70 79 3b 0a 20 20 20 20 20 20 20 20 69  pCopy;.        i
19ec0 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  f( !db->mallocFa
19ed0 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20  iled ){.        
19ee0 20 20 61 73 73 65 72 74 28 20 70 43 6f 70 79 21    assert( pCopy!
19ef0 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  =0 );.          
19f00 70 4c 69 73 74 49 74 65 6d 20 3d 20 26 70 43 6f  pListItem = &pCo
19f10 70 79 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 20 20  py->a[i];.      
19f20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
19f30 20 20 6a 20 3d 20 58 4e 5f 45 58 50 52 3b 0a 20    j = XN_EXPR;. 
19f40 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 61 69 43       pIndex->aiC
19f50 6f 6c 75 6d 6e 5b 69 5d 20 3d 20 58 4e 5f 45 58  olumn[i] = XN_EX
19f60 50 52 3b 0a 20 20 20 20 20 20 70 49 6e 64 65 78  PR;.      pIndex
19f70 2d 3e 75 6e 69 71 4e 6f 74 4e 75 6c 6c 20 3d 20  ->uniqNotNull = 
19f80 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  0;.    }else{.  
19f90 20 20 20 20 6a 20 3d 20 70 43 45 78 70 72 2d 3e      j = pCExpr->
19fa0 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 61  iColumn;.      a
19fb0 73 73 65 72 74 28 20 6a 3c 3d 30 78 37 66 66 66  ssert( j<=0x7fff
19fc0 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6a 3c   );.      if( j<
19fd0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 6a 20 3d  0 ){.        j =
19fe0 20 70 54 61 62 2d 3e 69 50 4b 65 79 3b 0a 20 20   pTab->iPKey;.  
19ff0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 54      }else if( pT
1a000 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 6e 6f 74 4e  ab->aCol[j].notN
1a010 75 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ull==0 ){.      
1a020 20 20 70 49 6e 64 65 78 2d 3e 75 6e 69 71 4e 6f    pIndex->uniqNo
1a030 74 4e 75 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 20  tNull = 0;.     
1a040 20 7d 0a 20 20 20 20 20 20 70 49 6e 64 65 78 2d   }.      pIndex-
1a050 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 20 3d 20 28  >aiColumn[i] = (
1a060 69 31 36 29 6a 3b 0a 20 20 20 20 7d 0a 20 20 20  i16)j;.    }.   
1a070 20 7a 43 6f 6c 6c 20 3d 20 30 3b 0a 20 20 20 20   zColl = 0;.    
1a080 69 66 28 20 70 4c 69 73 74 49 74 65 6d 2d 3e 70  if( pListItem->p
1a090 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c  Expr->op==TK_COL
1a0a0 4c 41 54 45 20 29 7b 0a 20 20 20 20 20 20 69 6e  LATE ){.      in
1a0b0 74 20 6e 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 7a  t nColl;.      z
1a0c0 43 6f 6c 6c 20 3d 20 70 4c 69 73 74 49 74 65 6d  Coll = pListItem
1a0d0 2d 3e 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65  ->pExpr->u.zToke
1a0e0 6e 3b 0a 20 20 20 20 20 20 6e 43 6f 6c 6c 20 3d  n;.      nColl =
1a0f0 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
1a100 28 7a 43 6f 6c 6c 29 20 2b 20 31 3b 0a 20 20 20  (zColl) + 1;.   
1a110 20 20 20 61 73 73 65 72 74 28 20 6e 45 78 74 72     assert( nExtr
1a120 61 3e 3d 6e 43 6f 6c 6c 20 29 3b 0a 20 20 20 20  a>=nColl );.    
1a130 20 20 6d 65 6d 63 70 79 28 7a 45 78 74 72 61 2c    memcpy(zExtra,
1a140 20 7a 43 6f 6c 6c 2c 20 6e 43 6f 6c 6c 29 3b 0a   zColl, nColl);.
1a150 20 20 20 20 20 20 7a 43 6f 6c 6c 20 3d 20 7a 45        zColl = zE
1a160 78 74 72 61 3b 0a 20 20 20 20 20 20 7a 45 78 74  xtra;.      zExt
1a170 72 61 20 2b 3d 20 6e 43 6f 6c 6c 3b 0a 20 20 20  ra += nColl;.   
1a180 20 20 20 6e 45 78 74 72 61 20 2d 3d 20 6e 43 6f     nExtra -= nCo
1a190 6c 6c 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  ll;.    }else if
1a1a0 28 20 6a 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  ( j>=0 ){.      
1a1b0 7a 43 6f 6c 6c 20 3d 20 70 54 61 62 2d 3e 61 43  zColl = pTab->aC
1a1c0 6f 6c 5b 6a 5d 2e 7a 43 6f 6c 6c 3b 0a 20 20 20  ol[j].zColl;.   
1a1d0 20 7d 0a 20 20 20 20 69 66 28 20 21 7a 43 6f 6c   }.    if( !zCol
1a1e0 6c 20 29 20 7a 43 6f 6c 6c 20 3d 20 73 71 6c 69  l ) zColl = sqli
1a1f0 74 65 33 53 74 72 42 49 4e 41 52 59 3b 0a 20 20  te3StrBINARY;.  
1a200 20 20 69 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e    if( !db->init.
1a210 62 75 73 79 20 26 26 20 21 73 71 6c 69 74 65 33  busy && !sqlite3
1a220 4c 6f 63 61 74 65 43 6f 6c 6c 53 65 71 28 70 50  LocateCollSeq(pP
1a230 61 72 73 65 2c 20 7a 43 6f 6c 6c 29 20 29 7b 0a  arse, zColl) ){.
1a240 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f        goto exit_
1a250 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
1a260 20 20 7d 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e    }.    pIndex->
1a270 61 7a 43 6f 6c 6c 5b 69 5d 20 3d 20 7a 43 6f 6c  azColl[i] = zCol
1a280 6c 3b 0a 20 20 20 20 72 65 71 75 65 73 74 65 64  l;.    requested
1a290 53 6f 72 74 4f 72 64 65 72 20 3d 20 70 4c 69 73  SortOrder = pLis
1a2a0 74 49 74 65 6d 2d 3e 73 6f 72 74 4f 72 64 65 72  tItem->sortOrder
1a2b0 20 26 20 73 6f 72 74 4f 72 64 65 72 4d 61 73 6b   & sortOrderMask
1a2c0 3b 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e 61 53  ;.    pIndex->aS
1a2d0 6f 72 74 4f 72 64 65 72 5b 69 5d 20 3d 20 28 75  ortOrder[i] = (u
1a2e0 38 29 72 65 71 75 65 73 74 65 64 53 6f 72 74 4f  8)requestedSortO
1a2f0 72 64 65 72 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  rder;.  }..  /* 
1a300 41 70 70 65 6e 64 20 74 68 65 20 74 61 62 6c 65  Append the table
1a310 20 6b 65 79 20 74 6f 20 74 68 65 20 65 6e 64 20   key to the end 
1a320 6f 66 20 74 68 65 20 69 6e 64 65 78 2e 20 20 46  of the index.  F
1a330 6f 72 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44  or WITHOUT ROWID
1a340 0a 20 20 2a 2a 20 74 61 62 6c 65 73 20 28 77 68  .  ** tables (wh
1a350 65 6e 20 70 50 6b 21 3d 30 29 20 74 68 69 73 20  en pPk!=0) this 
1a360 77 69 6c 6c 20 62 65 20 74 68 65 20 64 65 63 6c  will be the decl
1a370 61 72 65 64 20 50 52 49 4d 41 52 59 20 4b 45 59  ared PRIMARY KEY
1a380 2e 20 20 46 6f 72 0a 20 20 2a 2a 20 6e 6f 72 6d  .  For.  ** norm
1a390 61 6c 20 74 61 62 6c 65 73 20 28 77 68 65 6e 20  al tables (when 
1a3a0 70 50 6b 3d 3d 30 29 20 74 68 69 73 20 77 69 6c  pPk==0) this wil
1a3b0 6c 20 62 65 20 74 68 65 20 72 6f 77 69 64 2e 0a  l be the rowid..
1a3c0 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 6b 20 29    */.  if( pPk )
1a3d0 7b 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a  {.    for(j=0; j
1a3e0 3c 70 50 6b 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 6a  <pPk->nKeyCol; j
1a3f0 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 78  ++){.      int x
1a400 20 3d 20 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e   = pPk->aiColumn
1a410 5b 6a 5d 3b 0a 20 20 20 20 20 20 61 73 73 65 72  [j];.      asser
1a420 74 28 20 78 3e 3d 30 20 29 3b 0a 20 20 20 20 20  t( x>=0 );.     
1a430 20 69 66 28 20 68 61 73 43 6f 6c 75 6d 6e 28 70   if( hasColumn(p
1a440 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 2c  Index->aiColumn,
1a450 20 70 49 6e 64 65 78 2d 3e 6e 4b 65 79 43 6f 6c   pIndex->nKeyCol
1a460 2c 20 78 29 20 29 7b 0a 20 20 20 20 20 20 20 20  , x) ){.        
1a470 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 2d  pIndex->nColumn-
1a480 2d 3b 20 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  -; .      }else{
1a490 0a 20 20 20 20 20 20 20 20 70 49 6e 64 65 78 2d  .        pIndex-
1a4a0 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 20 3d 20 78  >aiColumn[i] = x
1a4b0 3b 0a 20 20 20 20 20 20 20 20 70 49 6e 64 65 78  ;.        pIndex
1a4c0 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 20 3d 20 70 50  ->azColl[i] = pP
1a4d0 6b 2d 3e 61 7a 43 6f 6c 6c 5b 6a 5d 3b 0a 20 20  k->azColl[j];.  
1a4e0 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 61 53        pIndex->aS
1a4f0 6f 72 74 4f 72 64 65 72 5b 69 5d 20 3d 20 70 50  ortOrder[i] = pP
1a500 6b 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 6a 5d  k->aSortOrder[j]
1a510 3b 0a 20 20 20 20 20 20 20 20 69 2b 2b 3b 0a 20  ;.        i++;. 
1a520 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
1a530 20 61 73 73 65 72 74 28 20 69 3d 3d 70 49 6e 64   assert( i==pInd
1a540 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 3b 0a 20  ex->nColumn );. 
1a550 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49 6e 64   }else{.    pInd
1a560 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 20  ex->aiColumn[i] 
1a570 3d 20 58 4e 5f 52 4f 57 49 44 3b 0a 20 20 20 20  = XN_ROWID;.    
1a580 70 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c 5b 69  pIndex->azColl[i
1a590 5d 20 3d 20 73 71 6c 69 74 65 33 53 74 72 42 49  ] = sqlite3StrBI
1a5a0 4e 41 52 59 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  NARY;.  }.  sqli
1a5b0 74 65 33 44 65 66 61 75 6c 74 52 6f 77 45 73 74  te3DefaultRowEst
1a5c0 28 70 49 6e 64 65 78 29 3b 0a 20 20 69 66 28 20  (pIndex);.  if( 
1a5d0 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
1a5e0 65 3d 3d 30 20 29 20 65 73 74 69 6d 61 74 65 49  e==0 ) estimateI
1a5f0 6e 64 65 78 57 69 64 74 68 28 70 49 6e 64 65 78  ndexWidth(pIndex
1a600 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73  );..  /* If this
1a610 20 69 6e 64 65 78 20 63 6f 6e 74 61 69 6e 73 20   index contains 
1a620 65 76 65 72 79 20 63 6f 6c 75 6d 6e 20 6f 66 20  every column of 
1a630 69 74 73 20 74 61 62 6c 65 2c 20 74 68 65 6e 20  its table, then 
1a640 6d 61 72 6b 0a 20 20 2a 2a 20 69 74 20 61 73 20  mark.  ** it as 
1a650 61 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78  a covering index
1a660 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 48 61   */.  assert( Ha
1a670 73 52 6f 77 69 64 28 70 54 61 62 29 20 0a 20 20  sRowid(pTab) .  
1a680 20 20 20 20 7c 7c 20 70 54 61 62 2d 3e 69 50 4b      || pTab->iPK
1a690 65 79 3c 30 20 7c 7c 20 73 71 6c 69 74 65 33 43  ey<0 || sqlite3C
1a6a0 6f 6c 75 6d 6e 4f 66 49 6e 64 65 78 28 70 49 6e  olumnOfIndex(pIn
1a6b0 64 65 78 2c 20 70 54 61 62 2d 3e 69 50 4b 65 79  dex, pTab->iPKey
1a6c0 29 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 54  )>=0 );.  if( pT
1a6d0 62 6c 4e 61 6d 65 21 3d 30 20 26 26 20 70 49 6e  blName!=0 && pIn
1a6e0 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 3e 3d 70 54  dex->nColumn>=pT
1a6f0 61 62 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20  ab->nCol ){.    
1a700 70 49 6e 64 65 78 2d 3e 69 73 43 6f 76 65 72 69  pIndex->isCoveri
1a710 6e 67 20 3d 20 31 3b 0a 20 20 20 20 66 6f 72 28  ng = 1;.    for(
1a720 6a 3d 30 3b 20 6a 3c 70 54 61 62 2d 3e 6e 43 6f  j=0; j<pTab->nCo
1a730 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69  l; j++){.      i
1a740 66 28 20 6a 3d 3d 70 54 61 62 2d 3e 69 50 4b 65  f( j==pTab->iPKe
1a750 79 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  y ) continue;.  
1a760 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 43      if( sqlite3C
1a770 6f 6c 75 6d 6e 4f 66 49 6e 64 65 78 28 70 49 6e  olumnOfIndex(pIn
1a780 64 65 78 2c 6a 29 3e 3d 30 20 29 20 63 6f 6e 74  dex,j)>=0 ) cont
1a790 69 6e 75 65 3b 0a 20 20 20 20 20 20 70 49 6e 64  inue;.      pInd
1a7a0 65 78 2d 3e 69 73 43 6f 76 65 72 69 6e 67 20 3d  ex->isCovering =
1a7b0 20 30 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   0;.      break;
1a7c0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66  .    }.  }..  if
1a7d0 28 20 70 54 61 62 3d 3d 70 50 61 72 73 65 2d 3e  ( pTab==pParse->
1a7e0 70 4e 65 77 54 61 62 6c 65 20 29 7b 0a 20 20 20  pNewTable ){.   
1a7f0 20 2f 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65   /* This routine
1a800 20 68 61 73 20 62 65 65 6e 20 63 61 6c 6c 65 64   has been called
1a810 20 74 6f 20 63 72 65 61 74 65 20 61 6e 20 61 75   to create an au
1a820 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 61 73  tomatic index as
1a830 20 61 0a 20 20 20 20 2a 2a 20 72 65 73 75 6c 74   a.    ** result
1a840 20 6f 66 20 61 20 50 52 49 4d 41 52 59 20 4b 45   of a PRIMARY KE
1a850 59 20 6f 72 20 55 4e 49 51 55 45 20 63 6c 61 75  Y or UNIQUE clau
1a860 73 65 20 6f 6e 20 61 20 63 6f 6c 75 6d 6e 20 64  se on a column d
1a870 65 66 69 6e 69 74 69 6f 6e 2c 20 6f 72 0a 20 20  efinition, or.  
1a880 20 20 2a 2a 20 61 20 50 52 49 4d 41 52 59 20 4b    ** a PRIMARY K
1a890 45 59 20 6f 72 20 55 4e 49 51 55 45 20 63 6c 61  EY or UNIQUE cla
1a8a0 75 73 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68  use following th
1a8b0 65 20 63 6f 6c 75 6d 6e 20 64 65 66 69 6e 69 74  e column definit
1a8c0 69 6f 6e 73 2e 0a 20 20 20 20 2a 2a 20 69 2e 65  ions..    ** i.e
1a8d0 2e 20 6f 6e 65 20 6f 66 3a 0a 20 20 20 20 2a 2a  . one of:.    **
1a8e0 0a 20 20 20 20 2a 2a 20 43 52 45 41 54 45 20 54  .    ** CREATE T
1a8f0 41 42 4c 45 20 74 28 78 20 50 52 49 4d 41 52 59  ABLE t(x PRIMARY
1a900 20 4b 45 59 2c 20 79 29 3b 0a 20 20 20 20 2a 2a   KEY, y);.    **
1a910 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 28   CREATE TABLE t(
1a920 78 2c 20 79 2c 20 55 4e 49 51 55 45 28 78 2c 20  x, y, UNIQUE(x, 
1a930 79 29 29 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20  y));.    **.    
1a940 2a 2a 20 45 69 74 68 65 72 20 77 61 79 2c 20 63  ** Either way, c
1a950 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74  heck to see if t
1a960 68 65 20 74 61 62 6c 65 20 61 6c 72 65 61 64 79  he table already
1a970 20 68 61 73 20 73 75 63 68 20 61 6e 20 69 6e 64   has such an ind
1a980 65 78 2e 20 49 66 0a 20 20 20 20 2a 2a 20 73 6f  ex. If.    ** so
1a990 2c 20 64 6f 6e 27 74 20 62 6f 74 68 65 72 20 63  , don't bother c
1a9a0 72 65 61 74 69 6e 67 20 74 68 69 73 20 6f 6e 65  reating this one
1a9b0 2e 20 54 68 69 73 20 6f 6e 6c 79 20 61 70 70 6c  . This only appl
1a9c0 69 65 73 20 74 6f 0a 20 20 20 20 2a 2a 20 61 75  ies to.    ** au
1a9d0 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63 72 65 61  tomatically crea
1a9e0 74 65 64 20 69 6e 64 69 63 65 73 2e 20 55 73 65  ted indices. Use
1a9f0 72 73 20 63 61 6e 20 64 6f 20 61 73 20 74 68 65  rs can do as the
1aa00 79 20 77 69 73 68 20 77 69 74 68 0a 20 20 20 20  y wish with.    
1aa10 2a 2a 20 65 78 70 6c 69 63 69 74 20 69 6e 64 69  ** explicit indi
1aa20 63 65 73 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ces..    **.    
1aa30 2a 2a 20 54 77 6f 20 55 4e 49 51 55 45 20 6f 72  ** Two UNIQUE or
1aa40 20 50 52 49 4d 41 52 59 20 4b 45 59 20 63 6f 6e   PRIMARY KEY con
1aa50 73 74 72 61 69 6e 74 73 20 61 72 65 20 63 6f 6e  straints are con
1aa60 73 69 64 65 72 65 64 20 65 71 75 69 76 61 6c 65  sidered equivale
1aa70 6e 74 0a 20 20 20 20 2a 2a 20 28 61 6e 64 20 74  nt.    ** (and t
1aa80 68 75 73 20 73 75 70 70 72 65 73 73 69 6e 67 20  hus suppressing 
1aa90 74 68 65 20 73 65 63 6f 6e 64 20 6f 6e 65 29 20  the second one) 
1aaa0 65 76 65 6e 20 69 66 20 74 68 65 79 20 68 61 76  even if they hav
1aab0 65 20 64 69 66 66 65 72 65 6e 74 0a 20 20 20 20  e different.    
1aac0 2a 2a 20 73 6f 72 74 20 6f 72 64 65 72 73 2e 0a  ** sort orders..
1aad0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66      **.    ** If
1aae0 20 74 68 65 72 65 20 61 72 65 20 64 69 66 66 65   there are diffe
1aaf0 72 65 6e 74 20 63 6f 6c 6c 61 74 69 6e 67 20 73  rent collating s
1ab00 65 71 75 65 6e 63 65 73 20 6f 72 20 69 66 20 74  equences or if t
1ab10 68 65 20 63 6f 6c 75 6d 6e 73 20 6f 66 0a 20 20  he columns of.  
1ab20 20 20 2a 2a 20 74 68 65 20 63 6f 6e 73 74 72 61    ** the constra
1ab30 69 6e 74 20 6f 63 63 75 72 20 69 6e 20 64 69 66  int occur in dif
1ab40 66 65 72 65 6e 74 20 6f 72 64 65 72 73 2c 20 74  ferent orders, t
1ab50 68 65 6e 20 74 68 65 20 63 6f 6e 73 74 72 61 69  hen the constrai
1ab60 6e 74 73 20 61 72 65 0a 20 20 20 20 2a 2a 20 63  nts are.    ** c
1ab70 6f 6e 73 69 64 65 72 65 64 20 64 69 73 74 69 6e  onsidered distin
1ab80 63 74 20 61 6e 64 20 62 6f 74 68 20 72 65 73 75  ct and both resu
1ab90 6c 74 20 69 6e 20 73 65 70 61 72 61 74 65 20 69  lt in separate i
1aba0 6e 64 69 63 65 73 2e 0a 20 20 20 20 2a 2f 0a 20  ndices..    */. 
1abb0 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a     Index *pIdx;.
1abc0 20 20 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61      for(pIdx=pTa
1abd0 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b  b->pIndex; pIdx;
1abe0 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78   pIdx=pIdx->pNex
1abf0 74 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6b 3b  t){.      int k;
1ac00 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 49  .      assert( I
1ac10 73 55 6e 69 71 75 65 49 6e 64 65 78 28 70 49 64  sUniqueIndex(pId
1ac20 78 29 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  x) );.      asse
1ac30 72 74 28 20 70 49 64 78 2d 3e 69 64 78 54 79 70  rt( pIdx->idxTyp
1ac40 65 21 3d 53 51 4c 49 54 45 5f 49 44 58 54 59 50  e!=SQLITE_IDXTYP
1ac50 45 5f 41 50 50 44 45 46 20 29 3b 0a 20 20 20 20  E_APPDEF );.    
1ac60 20 20 61 73 73 65 72 74 28 20 49 73 55 6e 69 71    assert( IsUniq
1ac70 75 65 49 6e 64 65 78 28 70 49 6e 64 65 78 29 20  ueIndex(pIndex) 
1ac80 29 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 70 49  );..      if( pI
1ac90 64 78 2d 3e 6e 4b 65 79 43 6f 6c 21 3d 70 49 6e  dx->nKeyCol!=pIn
1aca0 64 65 78 2d 3e 6e 4b 65 79 43 6f 6c 20 29 20 63  dex->nKeyCol ) c
1acb0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 66  ontinue;.      f
1acc0 6f 72 28 6b 3d 30 3b 20 6b 3c 70 49 64 78 2d 3e  or(k=0; k<pIdx->
1acd0 6e 4b 65 79 43 6f 6c 3b 20 6b 2b 2b 29 7b 0a 20  nKeyCol; k++){. 
1ace0 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61         const cha
1acf0 72 20 2a 7a 31 3b 0a 20 20 20 20 20 20 20 20 63  r *z1;.        c
1ad00 6f 6e 73 74 20 63 68 61 72 20 2a 7a 32 3b 0a 20  onst char *z2;. 
1ad10 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
1ad20 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6b 5d  Idx->aiColumn[k]
1ad30 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69  >=0 );.        i
1ad40 66 28 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d  f( pIdx->aiColum
1ad50 6e 5b 6b 5d 21 3d 70 49 6e 64 65 78 2d 3e 61 69  n[k]!=pIndex->ai
1ad60 43 6f 6c 75 6d 6e 5b 6b 5d 20 29 20 62 72 65 61  Column[k] ) brea
1ad70 6b 3b 0a 20 20 20 20 20 20 20 20 7a 31 20 3d 20  k;.        z1 = 
1ad80 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6b 5d 3b  pIdx->azColl[k];
1ad90 0a 20 20 20 20 20 20 20 20 7a 32 20 3d 20 70 49  .        z2 = pI
1ada0 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c 5b 6b 5d 3b  ndex->azColl[k];
1adb0 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c  .        if( sql
1adc0 69 74 65 33 53 74 72 49 43 6d 70 28 7a 31 2c 20  ite3StrICmp(z1, 
1add0 7a 32 29 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  z2) ) break;.   
1ade0 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6b     }.      if( k
1adf0 3d 3d 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 20  ==pIdx->nKeyCol 
1ae00 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ){.        if( p
1ae10 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d 70 49  Idx->onError!=pI
1ae20 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 20 29 7b  ndex->onError ){
1ae30 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  .          /* Th
1ae40 69 73 20 63 6f 6e 73 74 72 61 69 6e 74 20 63 72  is constraint cr
1ae50 65 61 74 65 73 20 74 68 65 20 73 61 6d 65 20 69  eates the same i
1ae60 6e 64 65 78 20 61 73 20 61 20 70 72 65 76 69 6f  ndex as a previo
1ae70 75 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  us.          ** 
1ae80 63 6f 6e 73 74 72 61 69 6e 74 20 73 70 65 63 69  constraint speci
1ae90 66 69 65 64 20 73 6f 6d 65 77 68 65 72 65 20 69  fied somewhere i
1aea0 6e 20 74 68 65 20 43 52 45 41 54 45 20 54 41 42  n the CREATE TAB
1aeb0 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20  LE statement..  
1aec0 20 20 20 20 20 20 20 20 2a 2a 20 48 6f 77 65 76          ** Howev
1aed0 65 72 20 74 68 65 20 4f 4e 20 43 4f 4e 46 4c 49  er the ON CONFLI
1aee0 43 54 20 63 6c 61 75 73 65 73 20 61 72 65 20 64  CT clauses are d
1aef0 69 66 66 65 72 65 6e 74 2e 20 49 66 20 62 6f 74  ifferent. If bot
1af00 68 20 74 68 69 73 20 0a 20 20 20 20 20 20 20 20  h this .        
1af10 20 20 2a 2a 20 63 6f 6e 73 74 72 61 69 6e 74 20    ** constraint 
1af20 61 6e 64 20 74 68 65 20 70 72 65 76 69 6f 75 73  and the previous
1af30 20 65 71 75 69 76 61 6c 65 6e 74 20 63 6f 6e 73   equivalent cons
1af40 74 72 61 69 6e 74 20 68 61 76 65 20 65 78 70 6c  traint have expl
1af50 69 63 69 74 0a 20 20 20 20 20 20 20 20 20 20 2a  icit.          *
1af60 2a 20 4f 4e 20 43 4f 4e 46 4c 49 43 54 20 63 6c  * ON CONFLICT cl
1af70 61 75 73 65 73 20 74 68 69 73 20 69 73 20 61 6e  auses this is an
1af80 20 65 72 72 6f 72 2e 20 4f 74 68 65 72 77 69 73   error. Otherwis
1af90 65 2c 20 75 73 65 20 74 68 65 0a 20 20 20 20 20  e, use the.     
1afa0 20 20 20 20 20 2a 2a 20 65 78 70 6c 69 63 69 74       ** explicit
1afb0 6c 79 20 73 70 65 63 69 66 69 65 64 20 62 65 68  ly specified beh
1afc0 61 76 69 6f 72 20 66 6f 72 20 74 68 65 20 69 6e  avior for the in
1afd0 64 65 78 2e 0a 20 20 20 20 20 20 20 20 20 20 2a  dex..          *
1afe0 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  /.          if( 
1aff0 21 28 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 3d  !(pIdx->onError=
1b000 3d 4f 45 5f 44 65 66 61 75 6c 74 20 7c 7c 20 70  =OE_Default || p
1b010 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d  Index->onError==
1b020 4f 45 5f 44 65 66 61 75 6c 74 29 20 29 7b 0a 20  OE_Default) ){. 
1b030 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
1b040 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
1b050 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  e, .            
1b060 20 20 20 20 22 63 6f 6e 66 6c 69 63 74 69 6e 67      "conflicting
1b070 20 4f 4e 20 43 4f 4e 46 4c 49 43 54 20 63 6c 61   ON CONFLICT cla
1b080 75 73 65 73 20 73 70 65 63 69 66 69 65 64 22 2c  uses specified",
1b090 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d   0);.          }
1b0a0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
1b0b0 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45  Idx->onError==OE
1b0c0 5f 44 65 66 61 75 6c 74 20 29 7b 0a 20 20 20 20  _Default ){.    
1b0d0 20 20 20 20 20 20 20 20 70 49 64 78 2d 3e 6f 6e          pIdx->on
1b0e0 45 72 72 6f 72 20 3d 20 70 49 6e 64 65 78 2d 3e  Error = pIndex->
1b0f0 6f 6e 45 72 72 6f 72 3b 0a 20 20 20 20 20 20 20  onError;.       
1b100 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
1b110 20 20 20 20 20 20 20 69 66 28 20 69 64 78 54 79         if( idxTy
1b120 70 65 3d 3d 53 51 4c 49 54 45 5f 49 44 58 54 59  pe==SQLITE_IDXTY
1b130 50 45 5f 50 52 49 4d 41 52 59 4b 45 59 20 29 20  PE_PRIMARYKEY ) 
1b140 70 49 64 78 2d 3e 69 64 78 54 79 70 65 20 3d 20  pIdx->idxType = 
1b150 69 64 78 54 79 70 65 3b 0a 20 20 20 20 20 20 20  idxType;.       
1b160 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
1b170 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 20 20 7d  e_index;.      }
1b180 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
1b190 20 4c 69 6e 6b 20 74 68 65 20 6e 65 77 20 49 6e   Link the new In
1b1a0 64 65 78 20 73 74 72 75 63 74 75 72 65 20 74 6f  dex structure to
1b1b0 20 69 74 73 20 74 61 62 6c 65 20 61 6e 64 20 74   its table and t
1b1c0 6f 20 74 68 65 20 6f 74 68 65 72 0a 20 20 2a 2a  o the other.  **
1b1d0 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62   in-memory datab
1b1e0 61 73 65 20 73 74 72 75 63 74 75 72 65 73 2e 20  ase structures. 
1b1f0 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
1b200 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 20  pParse->nErr==0 
1b210 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 69 6e 69  );.  if( db->ini
1b220 74 2e 62 75 73 79 20 29 7b 0a 20 20 20 20 49 6e  t.busy ){.    In
1b230 64 65 78 20 2a 70 3b 0a 20 20 20 20 61 73 73 65  dex *p;.    asse
1b240 72 74 28 20 21 49 4e 5f 44 45 43 4c 41 52 45 5f  rt( !IN_DECLARE_
1b250 56 54 41 42 20 29 3b 0a 20 20 20 20 61 73 73 65  VTAB );.    asse
1b260 72 74 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d  rt( sqlite3Schem
1b270 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20 30  aMutexHeld(db, 0
1b280 2c 20 70 49 6e 64 65 78 2d 3e 70 53 63 68 65 6d  , pIndex->pSchem
1b290 61 29 20 29 3b 0a 20 20 20 20 70 20 3d 20 73 71  a) );.    p = sq
1b2a0 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72 74 28  lite3HashInsert(
1b2b0 26 70 49 6e 64 65 78 2d 3e 70 53 63 68 65 6d 61  &pIndex->pSchema
1b2c0 2d 3e 69 64 78 48 61 73 68 2c 20 0a 20 20 20 20  ->idxHash, .    
1b2d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b2e0 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 7a 4e        pIndex->zN
1b2f0 61 6d 65 2c 20 70 49 6e 64 65 78 29 3b 0a 20 20  ame, pIndex);.  
1b300 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 20    if( p ){.     
1b310 20 61 73 73 65 72 74 28 20 70 3d 3d 70 49 6e 64   assert( p==pInd
1b320 65 78 20 29 3b 20 20 2f 2a 20 4d 61 6c 6c 6f 63  ex );  /* Malloc
1b330 20 6d 75 73 74 20 68 61 76 65 20 66 61 69 6c 65   must have faile
1b340 64 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74  d */.      sqlit
1b350 65 33 4f 6f 6d 46 61 75 6c 74 28 64 62 29 3b 0a  e3OomFault(db);.
1b360 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f        goto exit_
1b370 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
1b380 20 20 7d 0a 20 20 20 20 64 62 2d 3e 66 6c 61 67    }.    db->flag
1b390 73 20 7c 3d 20 53 51 4c 49 54 45 5f 49 6e 74 65  s |= SQLITE_Inte
1b3a0 72 6e 43 68 61 6e 67 65 73 3b 0a 20 20 20 20 69  rnChanges;.    i
1b3b0 66 28 20 70 54 62 6c 4e 61 6d 65 21 3d 30 20 29  f( pTblName!=0 )
1b3c0 7b 0a 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e  {.      pIndex->
1b3d0 74 6e 75 6d 20 3d 20 64 62 2d 3e 69 6e 69 74 2e  tnum = db->init.
1b3e0 6e 65 77 54 6e 75 6d 3b 0a 20 20 20 20 7d 0a 20  newTnum;.    }. 
1b3f0 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73   }..  /* If this
1b400 20 69 73 20 74 68 65 20 69 6e 69 74 69 61 6c 20   is the initial 
1b410 43 52 45 41 54 45 20 49 4e 44 45 58 20 73 74 61  CREATE INDEX sta
1b420 74 65 6d 65 6e 74 20 28 6f 72 20 43 52 45 41 54  tement (or CREAT
1b430 45 20 54 41 42 4c 45 20 69 66 20 74 68 65 0a 20  E TABLE if the. 
1b440 20 2a 2a 20 69 6e 64 65 78 20 69 73 20 61 6e 20   ** index is an 
1b450 69 6d 70 6c 69 65 64 20 69 6e 64 65 78 20 66 6f  implied index fo
1b460 72 20 61 20 55 4e 49 51 55 45 20 6f 72 20 50 52  r a UNIQUE or PR
1b470 49 4d 41 52 59 20 4b 45 59 20 63 6f 6e 73 74 72  IMARY KEY constr
1b480 61 69 6e 74 29 20 74 68 65 6e 0a 20 20 2a 2a 20  aint) then.  ** 
1b490 65 6d 69 74 20 63 6f 64 65 20 74 6f 20 61 6c 6c  emit code to all
1b4a0 6f 63 61 74 65 20 74 68 65 20 69 6e 64 65 78 20  ocate the index 
1b4b0 72 6f 6f 74 70 61 67 65 20 6f 6e 20 64 69 73 6b  rootpage on disk
1b4c0 20 61 6e 64 20 6d 61 6b 65 20 61 6e 20 65 6e 74   and make an ent
1b4d0 72 79 20 66 6f 72 0a 20 20 2a 2a 20 74 68 65 20  ry for.  ** the 
1b4e0 69 6e 64 65 78 20 69 6e 20 74 68 65 20 73 71 6c  index in the sql
1b4f0 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65  ite_master table
1b500 20 61 6e 64 20 70 6f 70 75 6c 61 74 65 20 74 68   and populate th
1b510 65 20 69 6e 64 65 78 20 77 69 74 68 0a 20 20 2a  e index with.  *
1b520 2a 20 63 6f 6e 74 65 6e 74 2e 20 20 42 75 74 2c  * content.  But,
1b530 20 64 6f 20 6e 6f 74 20 64 6f 20 74 68 69 73 20   do not do this 
1b540 69 66 20 77 65 20 61 72 65 20 73 69 6d 70 6c 79  if we are simply
1b550 20 72 65 61 64 69 6e 67 20 74 68 65 20 73 71 6c   reading the sql
1b560 69 74 65 5f 6d 61 73 74 65 72 0a 20 20 2a 2a 20  ite_master.  ** 
1b570 74 61 62 6c 65 20 74 6f 20 70 61 72 73 65 20 74  table to parse t
1b580 68 65 20 73 63 68 65 6d 61 2c 20 6f 72 20 69 66  he schema, or if
1b590 20 74 68 69 73 20 69 6e 64 65 78 20 69 73 20 74   this index is t
1b5a0 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 69  he PRIMARY KEY i
1b5b0 6e 64 65 78 0a 20 20 2a 2a 20 6f 66 20 61 20 57  ndex.  ** of a W
1b5c0 49 54 48 4f 55 54 20 52 4f 57 49 44 20 74 61 62  ITHOUT ROWID tab
1b5d0 6c 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66  le..  **.  ** If
1b5e0 20 70 54 62 6c 4e 61 6d 65 3d 3d 30 20 69 74 20   pTblName==0 it 
1b5f0 6d 65 61 6e 73 20 74 68 69 73 20 69 6e 64 65 78  means this index
1b600 20 69 73 20 67 65 6e 65 72 61 74 65 64 20 61 73   is generated as
1b610 20 61 6e 20 69 6d 70 6c 69 65 64 20 50 52 49 4d   an implied PRIM
1b620 41 52 59 20 4b 45 59 0a 20 20 2a 2a 20 6f 72 20  ARY KEY.  ** or 
1b630 55 4e 49 51 55 45 20 69 6e 64 65 78 20 69 6e 20  UNIQUE index in 
1b640 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73  a CREATE TABLE s
1b650 74 61 74 65 6d 65 6e 74 2e 20 20 53 69 6e 63 65  tatement.  Since
1b660 20 74 68 65 20 74 61 62 6c 65 0a 20 20 2a 2a 20   the table.  ** 
1b670 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20 63 72  has just been cr
1b680 65 61 74 65 64 2c 20 69 74 20 63 6f 6e 74 61 69  eated, it contai
1b690 6e 73 20 6e 6f 20 64 61 74 61 20 61 6e 64 20 74  ns no data and t
1b6a0 68 65 20 69 6e 64 65 78 20 69 6e 69 74 69 61 6c  he index initial
1b6b0 69 7a 61 74 69 6f 6e 0a 20 20 2a 2a 20 73 74 65  ization.  ** ste
1b6c0 70 20 63 61 6e 20 62 65 20 73 6b 69 70 70 65 64  p can be skipped
1b6d0 2e 0a 20 20 2a 2f 0a 20 20 65 6c 73 65 20 69 66  ..  */.  else if
1b6e0 28 20 48 61 73 52 6f 77 69 64 28 70 54 61 62 29  ( HasRowid(pTab)
1b6f0 20 7c 7c 20 70 54 62 6c 4e 61 6d 65 21 3d 30 20   || pTblName!=0 
1b700 29 7b 0a 20 20 20 20 56 64 62 65 20 2a 76 3b 0a  ){.    Vdbe *v;.
1b710 20 20 20 20 63 68 61 72 20 2a 7a 53 74 6d 74 3b      char *zStmt;
1b720 0a 20 20 20 20 69 6e 74 20 69 4d 65 6d 20 3d 20  .    int iMem = 
1b730 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
1b740 0a 20 20 20 20 76 20 3d 20 73 71 6c 69 74 65 33  .    v = sqlite3
1b750 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
1b760 0a 20 20 20 20 69 66 28 20 76 3d 3d 30 20 29 20  .    if( v==0 ) 
1b770 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
1b780 5f 69 6e 64 65 78 3b 0a 0a 20 20 20 20 73 71 6c  _index;..    sql
1b790 69 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70  ite3BeginWriteOp
1b7a0 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20  eration(pParse, 
1b7b0 31 2c 20 69 44 62 29 3b 0a 0a 20 20 20 20 2f 2a  1, iDb);..    /*
1b7c0 20 43 72 65 61 74 65 20 74 68 65 20 72 6f 6f 74   Create the root
1b7d0 70 61 67 65 20 66 6f 72 20 74 68 65 20 69 6e 64  page for the ind
1b7e0 65 78 20 75 73 69 6e 67 20 43 72 65 61 74 65 49  ex using CreateI
1b7f0 6e 64 65 78 2e 20 42 75 74 20 62 65 66 6f 72 65  ndex. But before
1b800 0a 20 20 20 20 2a 2a 20 64 6f 69 6e 67 20 73 6f  .    ** doing so
1b810 2c 20 63 6f 64 65 20 61 20 4e 6f 6f 70 20 69 6e  , code a Noop in
1b820 73 74 72 75 63 74 69 6f 6e 20 61 6e 64 20 73 74  struction and st
1b830 6f 72 65 20 69 74 73 20 61 64 64 72 65 73 73 20  ore its address 
1b840 69 6e 20 0a 20 20 20 20 2a 2a 20 49 6e 64 65 78  in .    ** Index
1b850 2e 74 6e 75 6d 2e 20 54 68 69 73 20 69 73 20 72  .tnum. This is r
1b860 65 71 75 69 72 65 64 20 69 6e 20 63 61 73 65 20  equired in case 
1b870 74 68 69 73 20 69 6e 64 65 78 20 69 73 20 61 63  this index is ac
1b880 74 75 61 6c 6c 79 20 61 20 0a 20 20 20 20 2a 2a  tually a .    **
1b890 20 50 52 49 4d 41 52 59 20 4b 45 59 20 61 6e 64   PRIMARY KEY and
1b8a0 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 61 63   the table is ac
1b8b0 74 75 61 6c 6c 79 20 61 20 57 49 54 48 4f 55 54  tually a WITHOUT
1b8c0 20 52 4f 57 49 44 20 74 61 62 6c 65 2e 20 49 6e   ROWID table. In
1b8d0 20 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 63 61   .    ** that ca
1b8e0 73 65 20 74 68 65 20 63 6f 6e 76 65 72 74 54 6f  se the convertTo
1b8f0 57 69 74 68 6f 75 74 52 6f 77 69 64 54 61 62 6c  WithoutRowidTabl
1b900 65 28 29 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  e() routine will
1b910 20 72 65 70 6c 61 63 65 0a 20 20 20 20 2a 2a 20   replace.    ** 
1b920 74 68 65 20 4e 6f 6f 70 20 77 69 74 68 20 61 20  the Noop with a 
1b930 47 6f 74 6f 20 74 6f 20 6a 75 6d 70 20 6f 76 65  Goto to jump ove
1b940 72 20 74 68 65 20 56 44 42 45 20 63 6f 64 65 20  r the VDBE code 
1b950 67 65 6e 65 72 61 74 65 64 20 62 65 6c 6f 77 2e  generated below.
1b960 20 2a 2f 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e   */.    pIndex->
1b970 74 6e 75 6d 20 3d 20 73 71 6c 69 74 65 33 56 64  tnum = sqlite3Vd
1b980 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 4e  beAddOp0(v, OP_N
1b990 6f 6f 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  oop);.    sqlite
1b9a0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1b9b0 50 5f 43 72 65 61 74 65 49 6e 64 65 78 2c 20 69  P_CreateIndex, i
1b9c0 44 62 2c 20 69 4d 65 6d 29 3b 0a 0a 20 20 20 20  Db, iMem);..    
1b9d0 2f 2a 20 47 61 74 68 65 72 20 74 68 65 20 63 6f  /* Gather the co
1b9e0 6d 70 6c 65 74 65 20 74 65 78 74 20 6f 66 20 74  mplete text of t
1b9f0 68 65 20 43 52 45 41 54 45 20 49 4e 44 45 58 20  he CREATE INDEX 
1ba00 73 74 61 74 65 6d 65 6e 74 20 69 6e 74 6f 0a 20  statement into. 
1ba10 20 20 20 2a 2a 20 74 68 65 20 7a 53 74 6d 74 20     ** the zStmt 
1ba20 76 61 72 69 61 62 6c 65 0a 20 20 20 20 2a 2f 0a  variable.    */.
1ba30 20 20 20 20 69 66 28 20 70 53 74 61 72 74 20 29      if( pStart )
1ba40 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20  {.      int n = 
1ba50 28 69 6e 74 29 28 70 50 61 72 73 65 2d 3e 73 4c  (int)(pParse->sL
1ba60 61 73 74 54 6f 6b 65 6e 2e 7a 20 2d 20 70 4e 61  astToken.z - pNa
1ba70 6d 65 2d 3e 7a 29 20 2b 20 70 50 61 72 73 65 2d  me->z) + pParse-
1ba80 3e 73 4c 61 73 74 54 6f 6b 65 6e 2e 6e 3b 0a 20  >sLastToken.n;. 
1ba90 20 20 20 20 20 69 66 28 20 70 4e 61 6d 65 2d 3e       if( pName->
1baa0 7a 5b 6e 2d 31 5d 3d 3d 27 3b 27 20 29 20 6e 2d  z[n-1]==';' ) n-
1bab0 2d 3b 0a 20 20 20 20 20 20 2f 2a 20 41 20 6e 61  -;.      /* A na
1bac0 6d 65 64 20 69 6e 64 65 78 20 77 69 74 68 20 61  med index with a
1bad0 6e 20 65 78 70 6c 69 63 69 74 20 43 52 45 41 54  n explicit CREAT
1bae0 45 20 49 4e 44 45 58 20 73 74 61 74 65 6d 65 6e  E INDEX statemen
1baf0 74 20 2a 2f 0a 20 20 20 20 20 20 7a 53 74 6d 74  t */.      zStmt
1bb00 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74   = sqlite3MPrint
1bb10 66 28 64 62 2c 20 22 43 52 45 41 54 45 25 73 20  f(db, "CREATE%s 
1bb20 49 4e 44 45 58 20 25 2e 2a 73 22 2c 0a 20 20 20  INDEX %.*s",.   
1bb30 20 20 20 20 20 6f 6e 45 72 72 6f 72 3d 3d 4f 45       onError==OE
1bb40 5f 4e 6f 6e 65 20 3f 20 22 22 20 3a 20 22 20 55  _None ? "" : " U
1bb50 4e 49 51 55 45 22 2c 20 6e 2c 20 70 4e 61 6d 65  NIQUE", n, pName
1bb60 2d 3e 7a 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ->z);.    }else{
1bb70 0a 20 20 20 20 20 20 2f 2a 20 41 6e 20 61 75 74  .      /* An aut
1bb80 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 63 72 65  omatic index cre
1bb90 61 74 65 64 20 62 79 20 61 20 50 52 49 4d 41 52  ated by a PRIMAR
1bba0 59 20 4b 45 59 20 6f 72 20 55 4e 49 51 55 45 20  Y KEY or UNIQUE 
1bbb0 63 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 20 20  constraint */.  
1bbc0 20 20 20 20 2f 2a 20 7a 53 74 6d 74 20 3d 20 73      /* zStmt = s
1bbd0 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 22 22  qlite3MPrintf(""
1bbe0 29 3b 20 2a 2f 0a 20 20 20 20 20 20 7a 53 74 6d  ); */.      zStm
1bbf0 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20  t = 0;.    }..  
1bc00 20 20 2f 2a 20 41 64 64 20 61 6e 20 65 6e 74 72    /* Add an entr
1bc10 79 20 69 6e 20 73 71 6c 69 74 65 5f 6d 61 73 74  y in sqlite_mast
1bc20 65 72 20 66 6f 72 20 74 68 69 73 20 69 6e 64 65  er for this inde
1bc30 78 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c  x.    */.    sql
1bc40 69 74 65 33 4e 65 73 74 65 64 50 61 72 73 65 28  ite3NestedParse(
1bc50 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20  pParse, .       
1bc60 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 25 51   "INSERT INTO %Q
1bc70 2e 25 73 20 56 41 4c 55 45 53 28 27 69 6e 64 65  .%s VALUES('inde
1bc80 78 27 2c 25 51 2c 25 51 2c 23 25 64 2c 25 51 29  x',%Q,%Q,#%d,%Q)
1bc90 3b 22 2c 0a 20 20 20 20 20 20 20 20 64 62 2d 3e  ;",.        db->
1bca0 61 44 62 5b 69 44 62 5d 2e 7a 44 62 53 4e 61 6d  aDb[iDb].zDbSNam
1bcb0 65 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28  e, SCHEMA_TABLE(
1bcc0 69 44 62 29 2c 0a 20 20 20 20 20 20 20 20 70 49  iDb),.        pI
1bcd0 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20  ndex->zName,.   
1bce0 20 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65       pTab->zName
1bcf0 2c 0a 20 20 20 20 20 20 20 20 69 4d 65 6d 2c 0a  ,.        iMem,.
1bd00 20 20 20 20 20 20 20 20 7a 53 74 6d 74 0a 20 20          zStmt.  
1bd10 20 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33    );.    sqlite3
1bd20 44 62 46 72 65 65 28 64 62 2c 20 7a 53 74 6d 74  DbFree(db, zStmt
1bd30 29 3b 0a 0a 20 20 20 20 2f 2a 20 46 69 6c 6c 20  );..    /* Fill 
1bd40 74 68 65 20 69 6e 64 65 78 20 77 69 74 68 20 64  the index with d
1bd50 61 74 61 20 61 6e 64 20 72 65 70 61 72 73 65 20  ata and reparse 
1bd60 74 68 65 20 73 63 68 65 6d 61 2e 20 43 6f 64 65  the schema. Code
1bd70 20 61 6e 20 4f 50 5f 45 78 70 69 72 65 0a 20 20   an OP_Expire.  
1bd80 20 20 2a 2a 20 74 6f 20 69 6e 76 61 6c 69 64 61    ** to invalida
1bd90 74 65 20 61 6c 6c 20 70 72 65 2d 63 6f 6d 70 69  te all pre-compi
1bda0 6c 65 64 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a  led statements..
1bdb0 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
1bdc0 54 62 6c 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20  TblName ){.     
1bdd0 20 73 71 6c 69 74 65 33 52 65 66 69 6c 6c 49 6e   sqlite3RefillIn
1bde0 64 65 78 28 70 50 61 72 73 65 2c 20 70 49 6e 64  dex(pParse, pInd
1bdf0 65 78 2c 20 69 4d 65 6d 29 3b 0a 20 20 20 20 20  ex, iMem);.     
1be00 20 73 71 6c 69 74 65 33 43 68 61 6e 67 65 43 6f   sqlite3ChangeCo
1be10 6f 6b 69 65 28 70 50 61 72 73 65 2c 20 69 44 62  okie(pParse, iDb
1be20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1be30 56 64 62 65 41 64 64 50 61 72 73 65 53 63 68 65  VdbeAddParseSche
1be40 6d 61 4f 70 28 76 2c 20 69 44 62 2c 0a 20 20 20  maOp(v, iDb,.   
1be50 20 20 20 20 20 20 73 71 6c 69 74 65 33 4d 50 72        sqlite3MPr
1be60 69 6e 74 66 28 64 62 2c 20 22 6e 61 6d 65 3d 27  intf(db, "name='
1be70 25 71 27 20 41 4e 44 20 74 79 70 65 3d 27 69 6e  %q' AND type='in
1be80 64 65 78 27 22 2c 20 70 49 6e 64 65 78 2d 3e 7a  dex'", pIndex->z
1be90 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20 20 73 71  Name));.      sq
1bea0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 28  lite3VdbeAddOp0(
1beb0 76 2c 20 4f 50 5f 45 78 70 69 72 65 29 3b 0a 20  v, OP_Expire);. 
1bec0 20 20 20 7d 0a 0a 20 20 20 20 73 71 6c 69 74 65     }..    sqlite
1bed0 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
1bee0 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 29 3b 0a   pIndex->tnum);.
1bef0 20 20 7d 0a 0a 20 20 2f 2a 20 57 68 65 6e 20 61    }..  /* When a
1bf00 64 64 69 6e 67 20 61 6e 20 69 6e 64 65 78 20 74  dding an index t
1bf10 6f 20 74 68 65 20 6c 69 73 74 20 6f 66 20 69 6e  o the list of in
1bf20 64 69 63 65 73 20 66 6f 72 20 61 20 74 61 62 6c  dices for a tabl
1bf30 65 2c 20 6d 61 6b 65 0a 20 20 2a 2a 20 73 75 72  e, make.  ** sur
1bf40 65 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 6c 61  e all indices la
1bf50 62 65 6c 65 64 20 4f 45 5f 52 65 70 6c 61 63 65  beled OE_Replace
1bf60 20 63 6f 6d 65 20 61 66 74 65 72 20 61 6c 6c 20   come after all 
1bf70 74 68 6f 73 65 20 6c 61 62 65 6c 65 64 0a 20 20  those labeled.  
1bf80 2a 2a 20 4f 45 5f 49 67 6e 6f 72 65 2e 20 20 54  ** OE_Ignore.  T
1bf90 68 69 73 20 69 73 20 6e 65 63 65 73 73 61 72 79  his is necessary
1bfa0 20 66 6f 72 20 74 68 65 20 63 6f 72 72 65 63 74   for the correct
1bfb0 20 63 6f 6e 73 74 72 61 69 6e 74 20 63 68 65 63   constraint chec
1bfc0 6b 0a 20 20 2a 2a 20 70 72 6f 63 65 73 73 69 6e  k.  ** processin
1bfd0 67 20 28 69 6e 20 73 71 6c 69 74 65 33 47 65 6e  g (in sqlite3Gen
1bfe0 65 72 61 74 65 43 6f 6e 73 74 72 61 69 6e 74 43  erateConstraintC
1bff0 68 65 63 6b 73 28 29 29 20 61 73 20 70 61 72 74  hecks()) as part
1c000 20 6f 66 0a 20 20 2a 2a 20 55 50 44 41 54 45 20   of.  ** UPDATE 
1c010 61 6e 64 20 49 4e 53 45 52 54 20 73 74 61 74 65  and INSERT state
1c020 6d 65 6e 74 73 2e 20 20 0a 20 20 2a 2f 0a 20 20  ments.  .  */.  
1c030 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73  if( db->init.bus
1c040 79 20 7c 7c 20 70 54 62 6c 4e 61 6d 65 3d 3d 30  y || pTblName==0
1c050 20 29 7b 0a 20 20 20 20 69 66 28 20 6f 6e 45 72   ){.    if( onEr
1c060 72 6f 72 21 3d 4f 45 5f 52 65 70 6c 61 63 65 20  ror!=OE_Replace 
1c070 7c 7c 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 3d  || pTab->pIndex=
1c080 3d 30 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70  =0.         || p
1c090 54 61 62 2d 3e 70 49 6e 64 65 78 2d 3e 6f 6e 45  Tab->pIndex->onE
1c0a0 72 72 6f 72 3d 3d 4f 45 5f 52 65 70 6c 61 63 65  rror==OE_Replace
1c0b0 29 7b 0a 20 20 20 20 20 20 70 49 6e 64 65 78 2d  ){.      pIndex-
1c0c0 3e 70 4e 65 78 74 20 3d 20 70 54 61 62 2d 3e 70  >pNext = pTab->p
1c0d0 49 6e 64 65 78 3b 0a 20 20 20 20 20 20 70 54 61  Index;.      pTa
1c0e0 62 2d 3e 70 49 6e 64 65 78 20 3d 20 70 49 6e 64  b->pIndex = pInd
1c0f0 65 78 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ex;.    }else{. 
1c100 20 20 20 20 20 49 6e 64 65 78 20 2a 70 4f 74 68       Index *pOth
1c110 65 72 20 3d 20 70 54 61 62 2d 3e 70 49 6e 64 65  er = pTab->pInde
1c120 78 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20  x;.      while( 
1c130 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74 20 26 26  pOther->pNext &&
1c140 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74 2d 3e   pOther->pNext->
1c150 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 52 65 70 6c  onError!=OE_Repl
1c160 61 63 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ace ){.        p
1c170 4f 74 68 65 72 20 3d 20 70 4f 74 68 65 72 2d 3e  Other = pOther->
1c180 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20  pNext;.      }. 
1c190 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 70 4e 65       pIndex->pNe
1c1a0 78 74 20 3d 20 70 4f 74 68 65 72 2d 3e 70 4e 65  xt = pOther->pNe
1c1b0 78 74 3b 0a 20 20 20 20 20 20 70 4f 74 68 65 72  xt;.      pOther
1c1c0 2d 3e 70 4e 65 78 74 20 3d 20 70 49 6e 64 65 78  ->pNext = pIndex
1c1d0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 49 6e 64  ;.    }.    pInd
1c1e0 65 78 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f  ex = 0;.  }..  /
1c1f0 2a 20 43 6c 65 61 6e 20 75 70 20 62 65 66 6f 72  * Clean up befor
1c200 65 20 65 78 69 74 69 6e 67 20 2a 2f 0a 65 78 69  e exiting */.exi
1c210 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3a 0a  t_create_index:.
1c220 20 20 69 66 28 20 70 49 6e 64 65 78 20 29 20 66    if( pIndex ) f
1c230 72 65 65 49 6e 64 65 78 28 64 62 2c 20 70 49 6e  reeIndex(db, pIn
1c240 64 65 78 29 3b 0a 20 20 73 71 6c 69 74 65 33 45  dex);.  sqlite3E
1c250 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 50  xprDelete(db, pP
1c260 49 57 68 65 72 65 29 3b 0a 20 20 73 71 6c 69 74  IWhere);.  sqlit
1c270 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65  e3ExprListDelete
1c280 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a 20 20 73  (db, pList);.  s
1c290 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c  qlite3SrcListDel
1c2a0 65 74 65 28 64 62 2c 20 70 54 62 6c 4e 61 6d 65  ete(db, pTblName
1c2b0 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  );.  sqlite3DbFr
1c2c0 65 65 28 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 7d  ee(db, zName);.}
1c2d0 0a 0a 2f 2a 0a 2a 2a 20 46 69 6c 6c 20 74 68 65  ../*.** Fill the
1c2e0 20 49 6e 64 65 78 2e 61 69 52 6f 77 45 73 74 5b   Index.aiRowEst[
1c2f0 5d 20 61 72 72 61 79 20 77 69 74 68 20 64 65 66  ] array with def
1c300 61 75 6c 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  ault information
1c310 20 2d 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 2a   - information.*
1c320 2a 20 74 6f 20 62 65 20 75 73 65 64 20 77 68 65  * to be used whe
1c330 6e 20 77 65 20 68 61 76 65 20 6e 6f 74 20 72 75  n we have not ru
1c340 6e 20 74 68 65 20 41 4e 41 4c 59 5a 45 20 63 6f  n the ANALYZE co
1c350 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 61 69 52  mmand..**.** aiR
1c360 6f 77 45 73 74 5b 30 5d 20 69 73 20 73 75 70 70  owEst[0] is supp
1c370 6f 73 65 64 20 74 6f 20 63 6f 6e 74 61 69 6e 20  osed to contain 
1c380 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6c  the number of el
1c390 65 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 69 6e  ements in the in
1c3a0 64 65 78 2e 0a 2a 2a 20 53 69 6e 63 65 20 77 65  dex..** Since we
1c3b0 20 64 6f 20 6e 6f 74 20 6b 6e 6f 77 2c 20 67 75   do not know, gu
1c3c0 65 73 73 20 31 20 6d 69 6c 6c 69 6f 6e 2e 20 20  ess 1 million.  
1c3d0 61 69 52 6f 77 45 73 74 5b 31 5d 20 69 73 20 61  aiRowEst[1] is a
1c3e0 6e 20 65 73 74 69 6d 61 74 65 20 6f 66 20 74 68  n estimate of th
1c3f0 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 72  e.** number of r
1c400 6f 77 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65  ows in the table
1c410 20 74 68 61 74 20 6d 61 74 63 68 20 61 6e 79 20   that match any 
1c420 70 61 72 74 69 63 75 6c 61 72 20 76 61 6c 75 65  particular value
1c430 20 6f 66 20 74 68 65 0a 2a 2a 20 66 69 72 73 74   of the.** first
1c440 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 69   column of the i
1c450 6e 64 65 78 2e 20 20 61 69 52 6f 77 45 73 74 5b  ndex.  aiRowEst[
1c460 32 5d 20 69 73 20 61 6e 20 65 73 74 69 6d 61 74  2] is an estimat
1c470 65 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 0a  e of the number.
1c480 2a 2a 20 6f 66 20 72 6f 77 73 20 74 68 61 74 20  ** of rows that 
1c490 6d 61 74 63 68 20 61 6e 79 20 70 61 72 74 69 63  match any partic
1c4a0 75 6c 61 72 20 63 6f 6d 62 69 6e 61 74 69 6f 6e  ular combination
1c4b0 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 32 20   of the first 2 
1c4c0 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 6f 66 20 74 68  columns.** of th
1c4d0 65 20 69 6e 64 65 78 2e 20 20 41 6e 64 20 73 6f  e index.  And so
1c4e0 20 66 6f 72 74 68 2e 20 20 49 74 20 6d 75 73 74   forth.  It must
1c4f0 20 61 6c 77 61 79 73 20 62 65 20 74 68 65 20 63   always be the c
1c500 61 73 65 20 74 68 61 74 0a 2a 0a 2a 2a 20 20 20  ase that.*.**   
1c510 20 20 20 20 20 20 20 20 61 69 52 6f 77 45 73 74          aiRowEst
1c520 5b 4e 5d 3c 3d 61 69 52 6f 77 45 73 74 5b 4e 2d  [N]<=aiRowEst[N-
1c530 31 5d 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  1].**           
1c540 61 69 52 6f 77 45 73 74 5b 4e 5d 3e 3d 31 0a 2a  aiRowEst[N]>=1.*
1c550 2a 0a 2a 2a 20 41 70 61 72 74 20 66 72 6f 6d 20  *.** Apart from 
1c560 74 68 61 74 2c 20 77 65 20 68 61 76 65 20 6c 69  that, we have li
1c570 74 74 6c 65 20 74 6f 20 67 6f 20 6f 6e 20 62 65  ttle to go on be
1c580 73 69 64 65 73 20 69 6e 74 75 69 74 69 6f 6e 20  sides intuition 
1c590 61 73 20 74 6f 0a 2a 2a 20 68 6f 77 20 61 69 52  as to.** how aiR
1c5a0 6f 77 45 73 74 5b 5d 20 73 68 6f 75 6c 64 20 62  owEst[] should b
1c5b0 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 20 20  e initialized.  
1c5c0 54 68 65 20 6e 75 6d 62 65 72 73 20 67 65 6e 65  The numbers gene
1c5d0 72 61 74 65 64 20 68 65 72 65 0a 2a 2a 20 61 72  rated here.** ar
1c5e0 65 20 62 61 73 65 64 20 6f 6e 20 74 79 70 69 63  e based on typic
1c5f0 61 6c 20 76 61 6c 75 65 73 20 66 6f 75 6e 64 20  al values found 
1c600 69 6e 20 61 63 74 75 61 6c 20 69 6e 64 69 63 65  in actual indice
1c610 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  s..*/.void sqlit
1c620 65 33 44 65 66 61 75 6c 74 52 6f 77 45 73 74 28  e3DefaultRowEst(
1c630 49 6e 64 65 78 20 2a 70 49 64 78 29 7b 0a 20 20  Index *pIdx){.  
1c640 2f 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /*              
1c650 20 20 31 30 2c 20 20 39 2c 20 20 38 2c 20 20 37    10,  9,  8,  7
1c660 2c 20 20 36 20 2a 2f 0a 20 20 4c 6f 67 45 73 74  ,  6 */.  LogEst
1c670 20 61 56 61 6c 5b 5d 20 3d 20 7b 20 33 33 2c 20   aVal[] = { 33, 
1c680 33 32 2c 20 33 30 2c 20 32 38 2c 20 32 36 20 7d  32, 30, 28, 26 }
1c690 3b 0a 20 20 4c 6f 67 45 73 74 20 2a 61 20 3d 20  ;.  LogEst *a = 
1c6a0 70 49 64 78 2d 3e 61 69 52 6f 77 4c 6f 67 45 73  pIdx->aiRowLogEs
1c6b0 74 3b 0a 20 20 69 6e 74 20 6e 43 6f 70 79 20 3d  t;.  int nCopy =
1c6c0 20 4d 49 4e 28 41 72 72 61 79 53 69 7a 65 28 61   MIN(ArraySize(a
1c6d0 56 61 6c 29 2c 20 70 49 64 78 2d 3e 6e 4b 65 79  Val), pIdx->nKey
1c6e0 43 6f 6c 29 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a  Col);.  int i;..
1c6f0 20 20 2f 2a 20 53 65 74 20 74 68 65 20 66 69 72    /* Set the fir
1c700 73 74 20 65 6e 74 72 79 20 28 6e 75 6d 62 65 72  st entry (number
1c710 20 6f 66 20 72 6f 77 73 20 69 6e 20 74 68 65 20   of rows in the 
1c720 69 6e 64 65 78 29 20 74 6f 20 74 68 65 20 65 73  index) to the es
1c730 74 69 6d 61 74 65 64 20 0a 20 20 2a 2a 20 6e 75  timated .  ** nu
1c740 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20  mber of rows in 
1c750 74 68 65 20 74 61 62 6c 65 2c 20 6f 72 20 68 61  the table, or ha
1c760 6c 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  lf the number of
1c770 20 72 6f 77 73 20 69 6e 20 74 68 65 20 74 61 62   rows in the tab
1c780 6c 65 0a 20 20 2a 2a 20 66 6f 72 20 61 20 70 61  le.  ** for a pa
1c790 72 74 69 61 6c 20 69 6e 64 65 78 2e 20 20 20 42  rtial index.   B
1c7a0 75 74 20 64 6f 20 6e 6f 74 20 6c 65 74 20 74 68  ut do not let th
1c7b0 65 20 65 73 74 69 6d 61 74 65 20 64 72 6f 70 20  e estimate drop 
1c7c0 62 65 6c 6f 77 20 31 30 2e 20 2a 2f 0a 20 20 61  below 10. */.  a
1c7d0 5b 30 5d 20 3d 20 70 49 64 78 2d 3e 70 54 61 62  [0] = pIdx->pTab
1c7e0 6c 65 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74 3b 0a  le->nRowLogEst;.
1c7f0 20 20 69 66 28 20 70 49 64 78 2d 3e 70 50 61 72    if( pIdx->pPar
1c800 74 49 64 78 57 68 65 72 65 21 3d 30 20 29 20 61  tIdxWhere!=0 ) a
1c810 5b 30 5d 20 2d 3d 20 31 30 3b 20 20 61 73 73 65  [0] -= 10;  asse
1c820 72 74 28 20 31 30 3d 3d 73 71 6c 69 74 65 33 4c  rt( 10==sqlite3L
1c830 6f 67 45 73 74 28 32 29 20 29 3b 0a 20 20 69 66  ogEst(2) );.  if
1c840 28 20 61 5b 30 5d 3c 33 33 20 29 20 61 5b 30 5d  ( a[0]<33 ) a[0]
1c850 20 3d 20 33 33 3b 20 20 20 20 20 20 20 20 20 20   = 33;          
1c860 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
1c870 33 33 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73  33==sqlite3LogEs
1c880 74 28 31 30 29 20 29 3b 0a 0a 20 20 2f 2a 20 45  t(10) );..  /* E
1c890 73 74 69 6d 61 74 65 20 74 68 61 74 20 61 5b 31  stimate that a[1
1c8a0 5d 20 69 73 20 31 30 2c 20 61 5b 32 5d 20 69 73  ] is 10, a[2] is
1c8b0 20 39 2c 20 61 5b 33 5d 20 69 73 20 38 2c 20 61   9, a[3] is 8, a
1c8c0 5b 34 5d 20 69 73 20 37 2c 20 61 5b 35 5d 20 69  [4] is 7, a[5] i
1c8d0 73 0a 20 20 2a 2a 20 36 20 61 6e 64 20 65 61 63  s.  ** 6 and eac
1c8e0 68 20 73 75 62 73 65 71 75 65 6e 74 20 76 61 6c  h subsequent val
1c8f0 75 65 20 28 69 66 20 61 6e 79 29 20 69 73 20 35  ue (if any) is 5
1c900 2e 20 20 2a 2f 0a 20 20 6d 65 6d 63 70 79 28 26  .  */.  memcpy(&
1c910 61 5b 31 5d 2c 20 61 56 61 6c 2c 20 6e 43 6f 70  a[1], aVal, nCop
1c920 79 2a 73 69 7a 65 6f 66 28 4c 6f 67 45 73 74 29  y*sizeof(LogEst)
1c930 29 3b 0a 20 20 66 6f 72 28 69 3d 6e 43 6f 70 79  );.  for(i=nCopy
1c940 2b 31 3b 20 69 3c 3d 70 49 64 78 2d 3e 6e 4b 65  +1; i<=pIdx->nKe
1c950 79 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  yCol; i++){.    
1c960 61 5b 69 5d 20 3d 20 32 33 3b 20 20 20 20 20 20  a[i] = 23;      
1c970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 73                as
1c980 73 65 72 74 28 20 32 33 3d 3d 73 71 6c 69 74 65  sert( 23==sqlite
1c990 33 4c 6f 67 45 73 74 28 35 29 20 29 3b 0a 20 20  3LogEst(5) );.  
1c9a0 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 30 3d 3d  }..  assert( 0==
1c9b0 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 31 29  sqlite3LogEst(1)
1c9c0 20 29 3b 0a 20 20 69 66 28 20 49 73 55 6e 69 71   );.  if( IsUniq
1c9d0 75 65 49 6e 64 65 78 28 70 49 64 78 29 20 29 20  ueIndex(pIdx) ) 
1c9e0 61 5b 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 5d  a[pIdx->nKeyCol]
1c9f0 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54   = 0;.}../*.** T
1ca00 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  his routine will
1ca10 20 64 72 6f 70 20 61 6e 20 65 78 69 73 74 69 6e   drop an existin
1ca20 67 20 6e 61 6d 65 64 20 69 6e 64 65 78 2e 20 20  g named index.  
1ca30 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  This routine.** 
1ca40 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 44  implements the D
1ca50 52 4f 50 20 49 4e 44 45 58 20 73 74 61 74 65 6d  ROP INDEX statem
1ca60 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ent..*/.void sql
1ca70 69 74 65 33 44 72 6f 70 49 6e 64 65 78 28 50 61  ite3DropIndex(Pa
1ca80 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 72 63  rse *pParse, Src
1ca90 4c 69 73 74 20 2a 70 4e 61 6d 65 2c 20 69 6e 74  List *pName, int
1caa0 20 69 66 45 78 69 73 74 73 29 7b 0a 20 20 49 6e   ifExists){.  In
1cab0 64 65 78 20 2a 70 49 6e 64 65 78 3b 0a 20 20 56  dex *pIndex;.  V
1cac0 64 62 65 20 2a 76 3b 0a 20 20 73 71 6c 69 74 65  dbe *v;.  sqlite
1cad0 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
1cae0 64 62 3b 0a 20 20 69 6e 74 20 69 44 62 3b 0a 0a  db;.  int iDb;..
1caf0 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65    assert( pParse
1cb00 2d 3e 6e 45 72 72 3d 3d 30 20 29 3b 20 20 20 2f  ->nErr==0 );   /
1cb10 2a 20 4e 65 76 65 72 20 63 61 6c 6c 65 64 20 77  * Never called w
1cb20 69 74 68 20 70 72 69 6f 72 20 65 72 72 6f 72 73  ith prior errors
1cb30 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61   */.  if( db->ma
1cb40 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
1cb50 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70    goto exit_drop
1cb60 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 61 73  _index;.  }.  as
1cb70 73 65 72 74 28 20 70 4e 61 6d 65 2d 3e 6e 53 72  sert( pName->nSr
1cb80 63 3d 3d 31 20 29 3b 0a 20 20 69 66 28 20 53 51  c==1 );.  if( SQ
1cb90 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33  LITE_OK!=sqlite3
1cba0 52 65 61 64 53 63 68 65 6d 61 28 70 50 61 72 73  ReadSchema(pPars
1cbb0 65 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65  e) ){.    goto e
1cbc0 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a  xit_drop_index;.
1cbd0 20 20 7d 0a 20 20 70 49 6e 64 65 78 20 3d 20 73    }.  pIndex = s
1cbe0 71 6c 69 74 65 33 46 69 6e 64 49 6e 64 65 78 28  qlite3FindIndex(
1cbf0 64 62 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e  db, pName->a[0].
1cc00 7a 4e 61 6d 65 2c 20 70 4e 61 6d 65 2d 3e 61 5b  zName, pName->a[
1cc10 30 5d 2e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20  0].zDatabase);. 
1cc20 20 69 66 28 20 70 49 6e 64 65 78 3d 3d 30 20 29   if( pIndex==0 )
1cc30 7b 0a 20 20 20 20 69 66 28 20 21 69 66 45 78 69  {.    if( !ifExi
1cc40 73 74 73 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  sts ){.      sql
1cc50 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
1cc60 72 73 65 2c 20 22 6e 6f 20 73 75 63 68 20 69 6e  rse, "no such in
1cc70 64 65 78 3a 20 25 53 22 2c 20 70 4e 61 6d 65 2c  dex: %S", pName,
1cc80 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   0);.    }else{.
1cc90 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64        sqlite3Cod
1cca0 65 56 65 72 69 66 79 4e 61 6d 65 64 53 63 68 65  eVerifyNamedSche
1ccb0 6d 61 28 70 50 61 72 73 65 2c 20 70 4e 61 6d 65  ma(pParse, pName
1ccc0 2d 3e 61 5b 30 5d 2e 7a 44 61 74 61 62 61 73 65  ->a[0].zDatabase
1ccd0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61  );.    }.    pPa
1cce0 72 73 65 2d 3e 63 68 65 63 6b 53 63 68 65 6d 61  rse->checkSchema
1ccf0 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f 20 65   = 1;.    goto e
1cd00 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a  xit_drop_index;.
1cd10 20 20 7d 0a 20 20 69 66 28 20 70 49 6e 64 65 78    }.  if( pIndex
1cd20 2d 3e 69 64 78 54 79 70 65 21 3d 53 51 4c 49 54  ->idxType!=SQLIT
1cd30 45 5f 49 44 58 54 59 50 45 5f 41 50 50 44 45 46  E_IDXTYPE_APPDEF
1cd40 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
1cd50 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
1cd60 22 69 6e 64 65 78 20 61 73 73 6f 63 69 61 74 65  "index associate
1cd70 64 20 77 69 74 68 20 55 4e 49 51 55 45 20 22 0a  d with UNIQUE ".
1cd80 20 20 20 20 20 20 22 6f 72 20 50 52 49 4d 41 52        "or PRIMAR
1cd90 59 20 4b 45 59 20 63 6f 6e 73 74 72 61 69 6e 74  Y KEY constraint
1cda0 20 63 61 6e 6e 6f 74 20 62 65 20 64 72 6f 70 70   cannot be dropp
1cdb0 65 64 22 2c 20 30 29 3b 0a 20 20 20 20 67 6f 74  ed", 0);.    got
1cdc0 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65  o exit_drop_inde
1cdd0 78 3b 0a 20 20 7d 0a 20 20 69 44 62 20 3d 20 73  x;.  }.  iDb = s
1cde0 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e  qlite3SchemaToIn
1cdf0 64 65 78 28 64 62 2c 20 70 49 6e 64 65 78 2d 3e  dex(db, pIndex->
1ce00 70 53 63 68 65 6d 61 29 3b 0a 23 69 66 6e 64 65  pSchema);.#ifnde
1ce10 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
1ce20 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 7b 0a  THORIZATION.  {.
1ce30 20 20 20 20 69 6e 74 20 63 6f 64 65 20 3d 20 53      int code = S
1ce40 51 4c 49 54 45 5f 44 52 4f 50 5f 49 4e 44 45 58  QLITE_DROP_INDEX
1ce50 3b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61  ;.    Table *pTa
1ce60 62 20 3d 20 70 49 6e 64 65 78 2d 3e 70 54 61 62  b = pIndex->pTab
1ce70 6c 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  le;.    const ch
1ce80 61 72 20 2a 7a 44 62 20 3d 20 64 62 2d 3e 61 44  ar *zDb = db->aD
1ce90 62 5b 69 44 62 5d 2e 7a 44 62 53 4e 61 6d 65 3b  b[iDb].zDbSName;
1cea0 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
1ceb0 2a 7a 54 61 62 20 3d 20 53 43 48 45 4d 41 5f 54  *zTab = SCHEMA_T
1cec0 41 42 4c 45 28 69 44 62 29 3b 0a 20 20 20 20 69  ABLE(iDb);.    i
1ced0 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68  f( sqlite3AuthCh
1cee0 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49  eck(pParse, SQLI
1cef0 54 45 5f 44 45 4c 45 54 45 2c 20 7a 54 61 62 2c  TE_DELETE, zTab,
1cf00 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20   0, zDb) ){.    
1cf10 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70    goto exit_drop
1cf20 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20  _index;.    }.  
1cf30 20 20 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50    if( !OMIT_TEMP
1cf40 44 42 20 26 26 20 69 44 62 20 29 20 63 6f 64 65  DB && iDb ) code
1cf50 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54   = SQLITE_DROP_T
1cf60 45 4d 50 5f 49 4e 44 45 58 3b 0a 20 20 20 20 69  EMP_INDEX;.    i
1cf70 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68  f( sqlite3AuthCh
1cf80 65 63 6b 28 70 50 61 72 73 65 2c 20 63 6f 64 65  eck(pParse, code
1cf90 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c  , pIndex->zName,
1cfa0 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 44   pTab->zName, zD
1cfb0 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  b) ){.      goto
1cfc0 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78   exit_drop_index
1cfd0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  ;.    }.  }.#end
1cfe0 69 66 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74  if..  /* Generat
1cff0 65 20 63 6f 64 65 20 74 6f 20 72 65 6d 6f 76 65  e code to remove
1d000 20 74 68 65 20 69 6e 64 65 78 20 61 6e 64 20 66   the index and f
1d010 72 6f 6d 20 74 68 65 20 6d 61 73 74 65 72 20 74  rom the master t
1d020 61 62 6c 65 20 2a 2f 0a 20 20 76 20 3d 20 73 71  able */.  v = sq
1d030 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
1d040 72 73 65 29 3b 0a 20 20 69 66 28 20 76 20 29 7b  rse);.  if( v ){
1d050 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69  .    sqlite3Begi
1d060 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28  nWriteOperation(
1d070 70 50 61 72 73 65 2c 20 31 2c 20 69 44 62 29 3b  pParse, 1, iDb);
1d080 0a 20 20 20 20 73 71 6c 69 74 65 33 4e 65 73 74  .    sqlite3Nest
1d090 65 64 50 61 72 73 65 28 70 50 61 72 73 65 2c 0a  edParse(pParse,.
1d0a0 20 20 20 20 20 20 20 22 44 45 4c 45 54 45 20 46         "DELETE F
1d0b0 52 4f 4d 20 25 51 2e 25 73 20 57 48 45 52 45 20  ROM %Q.%s WHERE 
1d0c0 6e 61 6d 65 3d 25 51 20 41 4e 44 20 74 79 70 65  name=%Q AND type
1d0d0 3d 27 69 6e 64 65 78 27 22 2c 0a 20 20 20 20 20  ='index'",.     
1d0e0 20 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a    db->aDb[iDb].z
1d0f0 44 62 53 4e 61 6d 65 2c 20 53 43 48 45 4d 41 5f  DbSName, SCHEMA_
1d100 54 41 42 4c 45 28 69 44 62 29 2c 20 70 49 6e 64  TABLE(iDb), pInd
1d110 65 78 2d 3e 7a 4e 61 6d 65 0a 20 20 20 20 29 3b  ex->zName.    );
1d120 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6c 65 61  .    sqlite3Clea
1d130 72 53 74 61 74 54 61 62 6c 65 73 28 70 50 61 72  rStatTables(pPar
1d140 73 65 2c 20 69 44 62 2c 20 22 69 64 78 22 2c 20  se, iDb, "idx", 
1d150 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 29 3b 0a  pIndex->zName);.
1d160 20 20 20 20 73 71 6c 69 74 65 33 43 68 61 6e 67      sqlite3Chang
1d170 65 43 6f 6f 6b 69 65 28 70 50 61 72 73 65 2c 20  eCookie(pParse, 
1d180 69 44 62 29 3b 0a 20 20 20 20 64 65 73 74 72 6f  iDb);.    destro
1d190 79 52 6f 6f 74 50 61 67 65 28 70 50 61 72 73 65  yRootPage(pParse
1d1a0 2c 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 2c 20  , pIndex->tnum, 
1d1b0 69 44 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  iDb);.    sqlite
1d1c0 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
1d1d0 50 5f 44 72 6f 70 49 6e 64 65 78 2c 20 69 44 62  P_DropIndex, iDb
1d1e0 2c 20 30 2c 20 30 2c 20 70 49 6e 64 65 78 2d 3e  , 0, 0, pIndex->
1d1f0 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 7d 0a 0a  zName, 0);.  }..
1d200 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3a  exit_drop_index:
1d210 0a 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73  .  sqlite3SrcLis
1d220 74 44 65 6c 65 74 65 28 64 62 2c 20 70 4e 61 6d  tDelete(db, pNam
1d230 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 41 72  e);.}../*.** pAr
1d240 72 61 79 20 69 73 20 61 20 70 6f 69 6e 74 65 72  ray is a pointer
1d250 20 74 6f 20 61 6e 20 61 72 72 61 79 20 6f 66 20   to an array of 
1d260 6f 62 6a 65 63 74 73 2e 20 45 61 63 68 20 6f 62  objects. Each ob
1d270 6a 65 63 74 20 69 6e 20 74 68 65 0a 2a 2a 20 61  ject in the.** a
1d280 72 72 61 79 20 69 73 20 73 7a 45 6e 74 72 79 20  rray is szEntry 
1d290 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 20 54  bytes in size. T
1d2a0 68 69 73 20 72 6f 75 74 69 6e 65 20 75 73 65 73  his routine uses
1d2b0 20 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f   sqlite3DbReallo
1d2c0 63 28 29 0a 2a 2a 20 74 6f 20 65 78 74 65 6e 64  c().** to extend
1d2d0 20 74 68 65 20 61 72 72 61 79 20 73 6f 20 74 68   the array so th
1d2e0 61 74 20 74 68 65 72 65 20 69 73 20 73 70 61 63  at there is spac
1d2f0 65 20 66 6f 72 20 61 20 6e 65 77 20 6f 62 6a 65  e for a new obje
1d300 63 74 20 61 74 20 74 68 65 20 65 6e 64 2e 0a 2a  ct at the end..*
1d310 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 66  *.** When this f
1d320 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
1d330 64 2c 20 2a 70 6e 45 6e 74 72 79 20 63 6f 6e 74  d, *pnEntry cont
1d340 61 69 6e 73 20 74 68 65 20 63 75 72 72 65 6e 74  ains the current
1d350 20 73 69 7a 65 20 6f 66 0a 2a 2a 20 74 68 65 20   size of.** the 
1d360 61 72 72 61 79 20 28 69 6e 20 65 6e 74 72 69 65  array (in entrie
1d370 73 20 2d 20 73 6f 20 74 68 65 20 61 6c 6c 6f 63  s - so the alloc
1d380 61 74 69 6f 6e 20 69 73 20 28 28 2a 70 6e 45 6e  ation is ((*pnEn
1d390 74 72 79 29 20 2a 20 73 7a 45 6e 74 72 79 29 20  try) * szEntry) 
1d3a0 62 79 74 65 73 0a 2a 2a 20 69 6e 20 74 6f 74 61  bytes.** in tota
1d3b0 6c 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  l)..**.** If the
1d3c0 20 72 65 61 6c 6c 6f 63 28 29 20 69 73 20 73 75   realloc() is su
1d3d0 63 63 65 73 73 66 75 6c 20 28 69 2e 65 2e 20 69  ccessful (i.e. i
1d3e0 66 20 6e 6f 20 4f 4f 4d 20 63 6f 6e 64 69 74 69  f no OOM conditi
1d3f0 6f 6e 20 6f 63 63 75 72 73 29 2c 20 74 68 65 0a  on occurs), the.
1d400 2a 2a 20 73 70 61 63 65 20 61 6c 6c 6f 63 61 74  ** space allocat
1d410 65 64 20 66 6f 72 20 74 68 65 20 6e 65 77 20 6f  ed for the new o
1d420 62 6a 65 63 74 20 69 73 20 7a 65 72 6f 65 64 2c  bject is zeroed,
1d430 20 2a 70 6e 45 6e 74 72 79 20 75 70 64 61 74 65   *pnEntry update
1d440 64 20 74 6f 0a 2a 2a 20 72 65 66 6c 65 63 74 20  d to.** reflect 
1d450 74 68 65 20 6e 65 77 20 73 69 7a 65 20 6f 66 20  the new size of 
1d460 74 68 65 20 61 72 72 61 79 20 61 6e 64 20 61 20  the array and a 
1d470 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 6e  pointer to the n
1d480 65 77 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2a  ew allocation.**
1d490 20 72 65 74 75 72 6e 65 64 2e 20 2a 70 49 64 78   returned. *pIdx
1d4a0 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 69   is set to the i
1d4b0 6e 64 65 78 20 6f 66 20 74 68 65 20 6e 65 77 20  ndex of the new 
1d4c0 61 72 72 61 79 20 65 6e 74 72 79 20 69 6e 20 74  array entry in t
1d4d0 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20  his case..**.** 
1d4e0 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 74 68  Otherwise, if th
1d4f0 65 20 72 65 61 6c 6c 6f 63 28 29 20 66 61 69 6c  e realloc() fail
1d500 73 2c 20 2a 70 49 64 78 20 69 73 20 73 65 74 20  s, *pIdx is set 
1d510 74 6f 20 2d 31 2c 20 2a 70 6e 45 6e 74 72 79 20  to -1, *pnEntry 
1d520 72 65 6d 61 69 6e 73 0a 2a 2a 20 75 6e 63 68 61  remains.** uncha
1d530 6e 67 65 64 20 61 6e 64 20 61 20 63 6f 70 79 20  nged and a copy 
1d540 6f 66 20 70 41 72 72 61 79 20 72 65 74 75 72 6e  of pArray return
1d550 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c  ed..*/.void *sql
1d560 69 74 65 33 41 72 72 61 79 41 6c 6c 6f 63 61 74  ite3ArrayAllocat
1d570 65 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  e(.  sqlite3 *db
1d580 2c 20 20 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63  ,      /* Connec
1d590 74 69 6f 6e 20 74 6f 20 6e 6f 74 69 66 79 20 6f  tion to notify o
1d5a0 66 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65  f malloc failure
1d5b0 73 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 41 72  s */.  void *pAr
1d5c0 72 61 79 2c 20 20 20 20 20 2f 2a 20 41 72 72 61  ray,     /* Arra
1d5d0 79 20 6f 66 20 6f 62 6a 65 63 74 73 2e 20 20 4d  y of objects.  M
1d5e0 69 67 68 74 20 62 65 20 72 65 61 6c 6c 6f 63 61  ight be realloca
1d5f0 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 45  ted */.  int szE
1d600 6e 74 72 79 2c 20 20 20 20 20 20 2f 2a 20 53 69  ntry,      /* Si
1d610 7a 65 20 6f 66 20 65 61 63 68 20 6f 62 6a 65 63  ze of each objec
1d620 74 20 69 6e 20 74 68 65 20 61 72 72 61 79 20 2a  t in the array *
1d630 2f 0a 20 20 69 6e 74 20 2a 70 6e 45 6e 74 72 79  /.  int *pnEntry
1d640 2c 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20  ,     /* Number 
1d650 6f 66 20 6f 62 6a 65 63 74 73 20 63 75 72 72 65  of objects curre
1d660 6e 74 6c 79 20 69 6e 20 75 73 65 20 2a 2f 0a 20  ntly in use */. 
1d670 20 69 6e 74 20 2a 70 49 64 78 20 20 20 20 20 20   int *pIdx      
1d680 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20     /* Write the 
1d690 69 6e 64 65 78 20 6f 66 20 61 20 6e 65 77 20 73  index of a new s
1d6a0 6c 6f 74 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20  lot here */.){. 
1d6b0 20 63 68 61 72 20 2a 7a 3b 0a 20 20 69 6e 74 20   char *z;.  int 
1d6c0 6e 20 3d 20 2a 70 6e 45 6e 74 72 79 3b 0a 20 20  n = *pnEntry;.  
1d6d0 69 66 28 20 28 6e 20 26 20 28 6e 2d 31 29 29 3d  if( (n & (n-1))=
1d6e0 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 73 7a  =0 ){.    int sz
1d6f0 20 3d 20 28 6e 3d 3d 30 29 20 3f 20 31 20 3a 20   = (n==0) ? 1 : 
1d700 32 2a 6e 3b 0a 20 20 20 20 76 6f 69 64 20 2a 70  2*n;.    void *p
1d710 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62 52  New = sqlite3DbR
1d720 65 61 6c 6c 6f 63 28 64 62 2c 20 70 41 72 72 61  ealloc(db, pArra
1d730 79 2c 20 73 7a 2a 73 7a 45 6e 74 72 79 29 3b 0a  y, sz*szEntry);.
1d740 20 20 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20      if( pNew==0 
1d750 29 7b 0a 20 20 20 20 20 20 2a 70 49 64 78 20 3d  ){.      *pIdx =
1d760 20 2d 31 3b 0a 20 20 20 20 20 20 72 65 74 75 72   -1;.      retur
1d770 6e 20 70 41 72 72 61 79 3b 0a 20 20 20 20 7d 0a  n pArray;.    }.
1d780 20 20 20 20 70 41 72 72 61 79 20 3d 20 70 4e 65      pArray = pNe
1d790 77 3b 0a 20 20 7d 0a 20 20 7a 20 3d 20 28 63 68  w;.  }.  z = (ch
1d7a0 61 72 2a 29 70 41 72 72 61 79 3b 0a 20 20 6d 65  ar*)pArray;.  me
1d7b0 6d 73 65 74 28 26 7a 5b 6e 20 2a 20 73 7a 45 6e  mset(&z[n * szEn
1d7c0 74 72 79 5d 2c 20 30 2c 20 73 7a 45 6e 74 72 79  try], 0, szEntry
1d7d0 29 3b 0a 20 20 2a 70 49 64 78 20 3d 20 6e 3b 0a  );.  *pIdx = n;.
1d7e0 20 20 2b 2b 2a 70 6e 45 6e 74 72 79 3b 0a 20 20    ++*pnEntry;.  
1d7f0 72 65 74 75 72 6e 20 70 41 72 72 61 79 3b 0a 7d  return pArray;.}
1d800 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 61  ../*.** Append a
1d810 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20 74 6f 20   new element to 
1d820 74 68 65 20 67 69 76 65 6e 20 49 64 4c 69 73 74  the given IdList
1d830 2e 20 20 43 72 65 61 74 65 20 61 20 6e 65 77 20  .  Create a new 
1d840 49 64 4c 69 73 74 20 69 66 0a 2a 2a 20 6e 65 65  IdList if.** nee
1d850 64 20 62 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 6e 65  d be..**.** A ne
1d860 77 20 49 64 4c 69 73 74 20 69 73 20 72 65 74 75  w IdList is retu
1d870 72 6e 65 64 2c 20 6f 72 20 4e 55 4c 4c 20 69 66  rned, or NULL if
1d880 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 73 2e   malloc() fails.
1d890 0a 2a 2f 0a 49 64 4c 69 73 74 20 2a 73 71 6c 69  .*/.IdList *sqli
1d8a0 74 65 33 49 64 4c 69 73 74 41 70 70 65 6e 64 28  te3IdListAppend(
1d8b0 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 49 64 4c  sqlite3 *db, IdL
1d8c0 69 73 74 20 2a 70 4c 69 73 74 2c 20 54 6f 6b 65  ist *pList, Toke
1d8d0 6e 20 2a 70 54 6f 6b 65 6e 29 7b 0a 20 20 69 6e  n *pToken){.  in
1d8e0 74 20 69 3b 0a 20 20 69 66 28 20 70 4c 69 73 74  t i;.  if( pList
1d8f0 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4c 69 73 74  ==0 ){.    pList
1d900 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
1d910 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f  ocZero(db, sizeo
1d920 66 28 49 64 4c 69 73 74 29 20 29 3b 0a 20 20 20  f(IdList) );.   
1d930 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20   if( pList==0 ) 
1d940 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
1d950 70 4c 69 73 74 2d 3e 61 20 3d 20 73 71 6c 69 74  pList->a = sqlit
1d960 65 33 41 72 72 61 79 41 6c 6c 6f 63 61 74 65 28  e3ArrayAllocate(
1d970 0a 20 20 20 20 20 20 64 62 2c 0a 20 20 20 20 20  .      db,.     
1d980 20 70 4c 69 73 74 2d 3e 61 2c 0a 20 20 20 20 20   pList->a,.     
1d990 20 73 69 7a 65 6f 66 28 70 4c 69 73 74 2d 3e 61   sizeof(pList->a
1d9a0 5b 30 5d 29 2c 0a 20 20 20 20 20 20 26 70 4c 69  [0]),.      &pLi
1d9b0 73 74 2d 3e 6e 49 64 2c 0a 20 20 20 20 20 20 26  st->nId,.      &
1d9c0 69 0a 20 20 29 3b 0a 20 20 69 66 28 20 69 3c 30  i.  );.  if( i<0
1d9d0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 49   ){.    sqlite3I
1d9e0 64 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20  dListDelete(db, 
1d9f0 70 4c 69 73 74 29 3b 0a 20 20 20 20 72 65 74 75  pList);.    retu
1da00 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 4c 69 73  rn 0;.  }.  pLis
1da10 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20 3d 20  t->a[i].zName = 
1da20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54  sqlite3NameFromT
1da30 6f 6b 65 6e 28 64 62 2c 20 70 54 6f 6b 65 6e 29  oken(db, pToken)
1da40 3b 0a 20 20 72 65 74 75 72 6e 20 70 4c 69 73 74  ;.  return pList
1da50 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74  ;.}../*.** Delet
1da60 65 20 61 6e 20 49 64 4c 69 73 74 2e 0a 2a 2f 0a  e an IdList..*/.
1da70 76 6f 69 64 20 73 71 6c 69 74 65 33 49 64 4c 69  void sqlite3IdLi
1da80 73 74 44 65 6c 65 74 65 28 73 71 6c 69 74 65 33  stDelete(sqlite3
1da90 20 2a 64 62 2c 20 49 64 4c 69 73 74 20 2a 70 4c   *db, IdList *pL
1daa0 69 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  ist){.  int i;. 
1dab0 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20   if( pList==0 ) 
1dac0 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d  return;.  for(i=
1dad0 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 49 64 3b  0; i<pList->nId;
1dae0 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74   i++){.    sqlit
1daf0 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 4c 69  e3DbFree(db, pLi
1db00 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b  st->a[i].zName);
1db10 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44 62  .  }.  sqlite3Db
1db20 46 72 65 65 28 64 62 2c 20 70 4c 69 73 74 2d 3e  Free(db, pList->
1db30 61 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46  a);.  sqlite3DbF
1db40 72 65 65 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a  ree(db, pList);.
1db50 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
1db60 74 68 65 20 69 6e 64 65 78 20 69 6e 20 70 4c 69  the index in pLi
1db70 73 74 20 6f 66 20 74 68 65 20 69 64 65 6e 74 69  st of the identi
1db80 66 69 65 72 20 6e 61 6d 65 64 20 7a 49 64 2e 20  fier named zId. 
1db90 20 52 65 74 75 72 6e 20 2d 31 0a 2a 2a 20 69 66   Return -1.** if
1dba0 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 69   not found..*/.i
1dbb0 6e 74 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74  nt sqlite3IdList
1dbc0 49 6e 64 65 78 28 49 64 4c 69 73 74 20 2a 70 4c  Index(IdList *pL
1dbd0 69 73 74 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  ist, const char 
1dbe0 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 69  *zName){.  int i
1dbf0 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30  ;.  if( pList==0
1dc00 20 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20   ) return -1;.  
1dc10 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74  for(i=0; i<pList
1dc20 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nId; i++){.   
1dc30 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49   if( sqlite3StrI
1dc40 43 6d 70 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  Cmp(pList->a[i].
1dc50 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29 3d 3d 30  zName, zName)==0
1dc60 20 29 20 72 65 74 75 72 6e 20 69 3b 0a 20 20 7d   ) return i;.  }
1dc70 0a 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a  .  return -1;.}.
1dc80 0a 2f 2a 0a 2a 2a 20 45 78 70 61 6e 64 20 74 68  ./*.** Expand th
1dc90 65 20 73 70 61 63 65 20 61 6c 6c 6f 63 61 74 65  e space allocate
1dca0 64 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20  d for the given 
1dcb0 53 72 63 4c 69 73 74 20 6f 62 6a 65 63 74 20 62  SrcList object b
1dcc0 79 0a 2a 2a 20 63 72 65 61 74 69 6e 67 20 6e 45  y.** creating nE
1dcd0 78 74 72 61 20 6e 65 77 20 73 6c 6f 74 73 20 62  xtra new slots b
1dce0 65 67 69 6e 6e 69 6e 67 20 61 74 20 69 53 74 61  eginning at iSta
1dcf0 72 74 2e 20 20 69 53 74 61 72 74 20 69 73 20 7a  rt.  iStart is z
1dd00 65 72 6f 20 62 61 73 65 64 2e 0a 2a 2a 20 4e 65  ero based..** Ne
1dd10 77 20 73 6c 6f 74 73 20 61 72 65 20 7a 65 72 6f  w slots are zero
1dd20 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78  ed..**.** For ex
1dd30 61 6d 70 6c 65 2c 20 73 75 70 70 6f 73 65 20 61  ample, suppose a
1dd40 20 53 72 63 4c 69 73 74 20 69 6e 69 74 69 61 6c   SrcList initial
1dd50 6c 79 20 63 6f 6e 74 61 69 6e 73 20 74 77 6f 20  ly contains two 
1dd60 65 6e 74 72 69 65 73 3a 20 41 2c 42 2e 0a 2a 2a  entries: A,B..**
1dd70 20 54 6f 20 61 70 70 65 6e 64 20 33 20 6e 65 77   To append 3 new
1dd80 20 65 6e 74 72 69 65 73 20 6f 6e 74 6f 20 74 68   entries onto th
1dd90 65 20 65 6e 64 2c 20 64 6f 20 74 68 69 73 3a 0a  e end, do this:.
1dda0 2a 2a 0a 2a 2a 20 20 20 20 73 71 6c 69 74 65 33  **.**    sqlite3
1ddb0 53 72 63 4c 69 73 74 45 6e 6c 61 72 67 65 28 64  SrcListEnlarge(d
1ddc0 62 2c 20 70 53 72 63 6c 69 73 74 2c 20 33 2c 20  b, pSrclist, 3, 
1ddd0 32 29 3b 0a 2a 2a 0a 2a 2a 20 41 66 74 65 72 20  2);.**.** After 
1dde0 74 68 65 20 63 61 6c 6c 20 61 62 6f 76 65 20 69  the call above i
1ddf0 74 20 77 6f 75 6c 64 20 63 6f 6e 74 61 69 6e 3a  t would contain:
1de00 20 20 41 2c 20 42 2c 20 6e 69 6c 2c 20 6e 69 6c    A, B, nil, nil
1de10 2c 20 6e 69 6c 2e 0a 2a 2a 20 49 66 20 74 68 65  , nil..** If the
1de20 20 69 53 74 61 72 74 20 61 72 67 75 6d 65 6e 74   iStart argument
1de30 20 68 61 64 20 62 65 65 6e 20 31 20 69 6e 73 74   had been 1 inst
1de40 65 61 64 20 6f 66 20 32 2c 20 74 68 65 6e 20 74  ead of 2, then t
1de50 68 65 20 72 65 73 75 6c 74 0a 2a 2a 20 77 6f 75  he result.** wou
1de60 6c 64 20 68 61 76 65 20 62 65 65 6e 3a 20 20 41  ld have been:  A
1de70 2c 20 6e 69 6c 2c 20 6e 69 6c 2c 20 6e 69 6c 2c  , nil, nil, nil,
1de80 20 42 2e 20 20 54 6f 20 70 72 65 70 65 6e 64 20   B.  To prepend 
1de90 74 68 65 20 6e 65 77 20 73 6c 6f 74 73 2c 0a 2a  the new slots,.*
1dea0 2a 20 74 68 65 20 69 53 74 61 72 74 20 76 61 6c  * the iStart val
1deb0 75 65 20 77 6f 75 6c 64 20 62 65 20 30 2e 20 20  ue would be 0.  
1dec0 54 68 65 20 72 65 73 75 6c 74 20 74 68 65 6e 20  The result then 
1ded0 77 6f 75 6c 64 0a 2a 2a 20 62 65 3a 20 6e 69 6c  would.** be: nil
1dee0 2c 20 6e 69 6c 2c 20 6e 69 6c 2c 20 41 2c 20 42  , nil, nil, A, B
1def0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d 65 6d  ..**.** If a mem
1df00 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66  ory allocation f
1df10 61 69 6c 73 20 74 68 65 20 53 72 63 4c 69 73 74  ails the SrcList
1df20 20 69 73 20 75 6e 63 68 61 6e 67 65 64 2e 20 20   is unchanged.  
1df30 54 68 65 0a 2a 2a 20 64 62 2d 3e 6d 61 6c 6c 6f  The.** db->mallo
1df40 63 46 61 69 6c 65 64 20 66 6c 61 67 20 77 69 6c  cFailed flag wil
1df50 6c 20 62 65 20 73 65 74 20 74 6f 20 74 72 75 65  l be set to true
1df60 2e 0a 2a 2f 0a 53 72 63 4c 69 73 74 20 2a 73 71  ..*/.SrcList *sq
1df70 6c 69 74 65 33 53 72 63 4c 69 73 74 45 6e 6c 61  lite3SrcListEnla
1df80 72 67 65 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  rge(.  sqlite3 *
1df90 64 62 2c 20 20 20 20 20 20 20 2f 2a 20 44 61 74  db,       /* Dat
1dfa0 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
1dfb0 20 74 6f 20 6e 6f 74 69 66 79 20 6f 66 20 4f 4f   to notify of OO
1dfc0 4d 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20 53 72  M errors */.  Sr
1dfd0 63 4c 69 73 74 20 2a 70 53 72 63 2c 20 20 20 20  cList *pSrc,    
1dfe0 20 2f 2a 20 54 68 65 20 53 72 63 4c 69 73 74 20   /* The SrcList 
1dff0 74 6f 20 62 65 20 65 6e 6c 61 72 67 65 64 20 2a  to be enlarged *
1e000 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 2c 20  /.  int nExtra, 
1e010 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
1e020 20 6f 66 20 6e 65 77 20 73 6c 6f 74 73 20 74 6f   of new slots to
1e030 20 61 64 64 20 74 6f 20 70 53 72 63 2d 3e 61 5b   add to pSrc->a[
1e040 5d 20 2a 2f 0a 20 20 69 6e 74 20 69 53 74 61 72  ] */.  int iStar
1e050 74 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64  t         /* Ind
1e060 65 78 20 69 6e 20 70 53 72 63 2d 3e 61 5b 5d 20  ex in pSrc->a[] 
1e070 6f 66 20 66 69 72 73 74 20 6e 65 77 20 73 6c 6f  of first new slo
1e080 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b  t */.){.  int i;
1e090 0a 0a 20 20 2f 2a 20 53 61 6e 69 74 79 20 63 68  ..  /* Sanity ch
1e0a0 65 63 6b 69 6e 67 20 6f 6e 20 63 61 6c 6c 69 6e  ecking on callin
1e0b0 67 20 70 61 72 61 6d 65 74 65 72 73 20 2a 2f 0a  g parameters */.
1e0c0 20 20 61 73 73 65 72 74 28 20 69 53 74 61 72 74    assert( iStart
1e0d0 3e 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  >=0 );.  assert(
1e0e0 20 6e 45 78 74 72 61 3e 3d 31 20 29 3b 0a 20 20   nExtra>=1 );.  
1e0f0 61 73 73 65 72 74 28 20 70 53 72 63 21 3d 30 20  assert( pSrc!=0 
1e100 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 53 74  );.  assert( iSt
1e110 61 72 74 3c 3d 70 53 72 63 2d 3e 6e 53 72 63 20  art<=pSrc->nSrc 
1e120 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74  );..  /* Allocat
1e130 65 20 61 64 64 69 74 69 6f 6e 61 6c 20 73 70 61  e additional spa
1e140 63 65 20 69 66 20 6e 65 65 64 65 64 20 2a 2f 0a  ce if needed */.
1e150 20 20 69 66 28 20 28 75 33 32 29 70 53 72 63 2d    if( (u32)pSrc-
1e160 3e 6e 53 72 63 2b 6e 45 78 74 72 61 3e 70 53 72  >nSrc+nExtra>pSr
1e170 63 2d 3e 6e 41 6c 6c 6f 63 20 29 7b 0a 20 20 20  c->nAlloc ){.   
1e180 20 53 72 63 4c 69 73 74 20 2a 70 4e 65 77 3b 0a   SrcList *pNew;.
1e190 20 20 20 20 69 6e 74 20 6e 41 6c 6c 6f 63 20 3d      int nAlloc =
1e1a0 20 70 53 72 63 2d 3e 6e 53 72 63 2b 6e 45 78 74   pSrc->nSrc+nExt
1e1b0 72 61 3b 0a 20 20 20 20 69 6e 74 20 6e 47 6f 74  ra;.    int nGot
1e1c0 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c  ;.    pNew = sql
1e1d0 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 28 64 62  ite3DbRealloc(db
1e1e0 2c 20 70 53 72 63 2c 0a 20 20 20 20 20 20 20 20  , pSrc,.        
1e1f0 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28 2a 70         sizeof(*p
1e200 53 72 63 29 20 2b 20 28 6e 41 6c 6c 6f 63 2d 31  Src) + (nAlloc-1
1e210 29 2a 73 69 7a 65 6f 66 28 70 53 72 63 2d 3e 61  )*sizeof(pSrc->a
1e220 5b 30 5d 29 20 29 3b 0a 20 20 20 20 69 66 28 20  [0]) );.    if( 
1e230 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20  pNew==0 ){.     
1e240 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c   assert( db->mal
1e250 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20  locFailed );.   
1e260 20 20 20 72 65 74 75 72 6e 20 70 53 72 63 3b 0a     return pSrc;.
1e270 20 20 20 20 7d 0a 20 20 20 20 70 53 72 63 20 3d      }.    pSrc =
1e280 20 70 4e 65 77 3b 0a 20 20 20 20 6e 47 6f 74 20   pNew;.    nGot 
1e290 3d 20 28 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c  = (sqlite3DbMall
1e2a0 6f 63 53 69 7a 65 28 64 62 2c 20 70 4e 65 77 29  ocSize(db, pNew)
1e2b0 20 2d 20 73 69 7a 65 6f 66 28 2a 70 53 72 63 29   - sizeof(*pSrc)
1e2c0 29 2f 73 69 7a 65 6f 66 28 70 53 72 63 2d 3e 61  )/sizeof(pSrc->a
1e2d0 5b 30 5d 29 2b 31 3b 0a 20 20 20 20 70 53 72 63  [0])+1;.    pSrc
1e2e0 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 6e 47 6f 74 3b  ->nAlloc = nGot;
1e2f0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 6f 76 65 20  .  }..  /* Move 
1e300 65 78 69 73 74 69 6e 67 20 73 6c 6f 74 73 20 74  existing slots t
1e310 68 61 74 20 63 6f 6d 65 20 61 66 74 65 72 20 74  hat come after t
1e320 68 65 20 6e 65 77 6c 79 20 69 6e 73 65 72 74 65  he newly inserte
1e330 64 20 73 6c 6f 74 73 0a 20 20 2a 2a 20 6f 75 74  d slots.  ** out
1e340 20 6f 66 20 74 68 65 20 77 61 79 20 2a 2f 0a 20   of the way */. 
1e350 20 66 6f 72 28 69 3d 70 53 72 63 2d 3e 6e 53 72   for(i=pSrc->nSr
1e360 63 2d 31 3b 20 69 3e 3d 69 53 74 61 72 74 3b 20  c-1; i>=iStart; 
1e370 69 2d 2d 29 7b 0a 20 20 20 20 70 53 72 63 2d 3e  i--){.    pSrc->
1e380 61 5b 69 2b 6e 45 78 74 72 61 5d 20 3d 20 70 53  a[i+nExtra] = pS
1e390 72 63 2d 3e 61 5b 69 5d 3b 0a 20 20 7d 0a 20 20  rc->a[i];.  }.  
1e3a0 70 53 72 63 2d 3e 6e 53 72 63 20 2b 3d 20 6e 45  pSrc->nSrc += nE
1e3b0 78 74 72 61 3b 0a 0a 20 20 2f 2a 20 5a 65 72 6f  xtra;..  /* Zero
1e3c0 20 74 68 65 20 6e 65 77 6c 79 20 61 6c 6c 6f 63   the newly alloc
1e3d0 61 74 65 64 20 73 6c 6f 74 73 20 2a 2f 0a 20 20  ated slots */.  
1e3e0 6d 65 6d 73 65 74 28 26 70 53 72 63 2d 3e 61 5b  memset(&pSrc->a[
1e3f0 69 53 74 61 72 74 5d 2c 20 30 2c 20 73 69 7a 65  iStart], 0, size
1e400 6f 66 28 70 53 72 63 2d 3e 61 5b 30 5d 29 2a 6e  of(pSrc->a[0])*n
1e410 45 78 74 72 61 29 3b 0a 20 20 66 6f 72 28 69 3d  Extra);.  for(i=
1e420 69 53 74 61 72 74 3b 20 69 3c 69 53 74 61 72 74  iStart; i<iStart
1e430 2b 6e 45 78 74 72 61 3b 20 69 2b 2b 29 7b 0a 20  +nExtra; i++){. 
1e440 20 20 20 70 53 72 63 2d 3e 61 5b 69 5d 2e 69 43     pSrc->a[i].iC
1e450 75 72 73 6f 72 20 3d 20 2d 31 3b 0a 20 20 7d 0a  ursor = -1;.  }.
1e460 0a 20 20 2f 2a 20 52 65 74 75 72 6e 20 61 20 70  .  /* Return a p
1e470 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 65 6e  ointer to the en
1e480 6c 61 72 67 65 64 20 53 72 63 4c 69 73 74 20 2a  larged SrcList *
1e490 2f 0a 20 20 72 65 74 75 72 6e 20 70 53 72 63 3b  /.  return pSrc;
1e4a0 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e  .}.../*.** Appen
1e4b0 64 20 61 20 6e 65 77 20 74 61 62 6c 65 20 6e 61  d a new table na
1e4c0 6d 65 20 74 6f 20 74 68 65 20 67 69 76 65 6e 20  me to the given 
1e4d0 53 72 63 4c 69 73 74 2e 20 20 43 72 65 61 74 65  SrcList.  Create
1e4e0 20 61 20 6e 65 77 20 53 72 63 4c 69 73 74 20 69   a new SrcList i
1e4f0 66 0a 2a 2a 20 6e 65 65 64 20 62 65 2e 20 20 41  f.** need be.  A
1e500 20 6e 65 77 20 65 6e 74 72 79 20 69 73 20 63 72   new entry is cr
1e510 65 61 74 65 64 20 69 6e 20 74 68 65 20 53 72 63  eated in the Src
1e520 4c 69 73 74 20 65 76 65 6e 20 69 66 20 70 54 61  List even if pTa
1e530 62 6c 65 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a  ble is NULL..**.
1e540 2a 2a 20 41 20 53 72 63 4c 69 73 74 20 69 73 20  ** A SrcList is 
1e550 72 65 74 75 72 6e 65 64 2c 20 6f 72 20 4e 55 4c  returned, or NUL
1e560 4c 20 69 66 20 74 68 65 72 65 20 69 73 20 61 6e  L if there is an
1e570 20 4f 4f 4d 20 65 72 72 6f 72 2e 20 20 54 68 65   OOM error.  The
1e580 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 53 72 63   returned.** Src
1e590 4c 69 73 74 20 6d 69 67 68 74 20 62 65 20 74 68  List might be th
1e5a0 65 20 73 61 6d 65 20 61 73 20 74 68 65 20 53 72  e same as the Sr
1e5b0 63 4c 69 73 74 20 74 68 61 74 20 77 61 73 20 69  cList that was i
1e5c0 6e 70 75 74 20 6f 72 20 69 74 20 6d 69 67 68 74  nput or it might
1e5d0 20 62 65 0a 2a 2a 20 61 20 6e 65 77 20 6f 6e 65   be.** a new one
1e5e0 2e 20 20 49 66 20 61 6e 20 4f 4f 4d 20 65 72 72  .  If an OOM err
1e5f0 6f 72 20 64 6f 65 73 20 6f 63 63 75 72 73 2c 20  or does occurs, 
1e600 74 68 65 6e 20 74 68 65 20 70 72 69 6f 72 20 76  then the prior v
1e610 61 6c 75 65 20 6f 66 20 70 4c 69 73 74 0a 2a 2a  alue of pList.**
1e620 20 74 68 61 74 20 69 73 20 69 6e 70 75 74 20 74   that is input t
1e630 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  o this routine i
1e640 73 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  s automatically 
1e650 66 72 65 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  freed..**.** If 
1e660 70 44 61 74 61 62 61 73 65 20 69 73 20 6e 6f 74  pDatabase is not
1e670 20 6e 75 6c 6c 2c 20 69 74 20 6d 65 61 6e 73 20   null, it means 
1e680 74 68 61 74 20 74 68 65 20 74 61 62 6c 65 20 68  that the table h
1e690 61 73 20 61 6e 20 6f 70 74 69 6f 6e 61 6c 0a 2a  as an optional.*
1e6a0 2a 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 20  * database name 
1e6b0 70 72 65 66 69 78 2e 20 20 4c 69 6b 65 20 74 68  prefix.  Like th
1e6c0 69 73 3a 20 20 22 64 61 74 61 62 61 73 65 2e 74  is:  "database.t
1e6d0 61 62 6c 65 22 2e 20 20 54 68 65 20 70 44 61 74  able".  The pDat
1e6e0 61 62 61 73 65 0a 2a 2a 20 70 6f 69 6e 74 73 20  abase.** points 
1e6f0 74 6f 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d  to the table nam
1e700 65 20 61 6e 64 20 74 68 65 20 70 54 61 62 6c 65  e and the pTable
1e710 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 64   points to the d
1e720 61 74 61 62 61 73 65 20 6e 61 6d 65 2e 0a 2a 2a  atabase name..**
1e730 20 54 68 65 20 53 72 63 4c 69 73 74 2e 61 5b 5d   The SrcList.a[]
1e740 2e 7a 4e 61 6d 65 20 66 69 65 6c 64 20 69 73 20  .zName field is 
1e750 66 69 6c 6c 65 64 20 77 69 74 68 20 74 68 65 20  filled with the 
1e760 74 61 62 6c 65 20 6e 61 6d 65 20 77 68 69 63 68  table name which
1e770 20 6d 69 67 68 74 0a 2a 2a 20 63 6f 6d 65 20 66   might.** come f
1e780 72 6f 6d 20 70 54 61 62 6c 65 20 28 69 66 20 70  rom pTable (if p
1e790 44 61 74 61 62 61 73 65 20 69 73 20 4e 55 4c 4c  Database is NULL
1e7a0 29 20 6f 72 20 66 72 6f 6d 20 70 44 61 74 61 62  ) or from pDatab
1e7b0 61 73 65 2e 20 20 0a 2a 2a 20 53 72 63 4c 69 73  ase.  .** SrcLis
1e7c0 74 2e 61 5b 5d 2e 7a 44 61 74 61 62 61 73 65 20  t.a[].zDatabase 
1e7d0 69 73 20 66 69 6c 6c 65 64 20 77 69 74 68 20 74  is filled with t
1e7e0 68 65 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65  he database name
1e7f0 20 66 72 6f 6d 20 70 54 61 62 6c 65 2c 0a 2a 2a   from pTable,.**
1e800 20 6f 72 20 77 69 74 68 20 4e 55 4c 4c 20 69 66   or with NULL if
1e810 20 6e 6f 20 64 61 74 61 62 61 73 65 20 69 73 20   no database is 
1e820 73 70 65 63 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a  specified..**.**
1e830 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c   In other words,
1e840 20 69 66 20 63 61 6c 6c 20 6c 69 6b 65 20 74 68   if call like th
1e850 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  is:.**.**       
1e860 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74    sqlite3SrcList
1e870 41 70 70 65 6e 64 28 44 2c 41 2c 42 2c 30 29 3b  Append(D,A,B,0);
1e880 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 42 20 69 73  .**.** Then B is
1e890 20 61 20 74 61 62 6c 65 20 6e 61 6d 65 20 61 6e   a table name an
1e8a0 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6e  d the database n
1e8b0 61 6d 65 20 69 73 20 75 6e 73 70 65 63 69 66 69  ame is unspecifi
1e8c0 65 64 2e 20 20 49 66 20 63 61 6c 6c 65 64 0a 2a  ed.  If called.*
1e8d0 2a 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a  * like this:.**.
1e8e0 2a 2a 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  **         sqlit
1e8f0 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64 28  e3SrcListAppend(
1e900 44 2c 41 2c 42 2c 43 29 3b 0a 2a 2a 0a 2a 2a 20  D,A,B,C);.**.** 
1e910 54 68 65 6e 20 43 20 69 73 20 74 68 65 20 74 61  Then C is the ta
1e920 62 6c 65 20 6e 61 6d 65 20 61 6e 64 20 42 20 69  ble name and B i
1e930 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6e  s the database n
1e940 61 6d 65 2e 20 20 49 66 20 43 20 69 73 20 64 65  ame.  If C is de
1e950 66 69 6e 65 64 0a 2a 2a 20 74 68 65 6e 20 73 6f  fined.** then so
1e960 20 69 73 20 42 2e 20 20 49 6e 20 6f 74 68 65 72   is B.  In other
1e970 20 77 6f 72 64 73 2c 20 77 65 20 6e 65 76 65 72   words, we never
1e980 20 68 61 76 65 20 61 20 63 61 73 65 20 77 68 65   have a case whe
1e990 72 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  re:.**.**       
1e9a0 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74    sqlite3SrcList
1e9b0 41 70 70 65 6e 64 28 44 2c 41 2c 30 2c 43 29 3b  Append(D,A,0,C);
1e9c0 0a 2a 2a 0a 2a 2a 20 42 6f 74 68 20 70 54 61 62  .**.** Both pTab
1e9d0 6c 65 20 61 6e 64 20 70 44 61 74 61 62 61 73 65  le and pDatabase
1e9e0 20 61 72 65 20 61 73 73 75 6d 65 64 20 74 6f 20   are assumed to 
1e9f0 62 65 20 71 75 6f 74 65 64 2e 20 20 54 68 65 79  be quoted.  They
1ea00 20 61 72 65 20 64 65 71 75 6f 74 65 64 0a 2a 2a   are dequoted.**
1ea10 20 62 65 66 6f 72 65 20 62 65 69 6e 67 20 61 64   before being ad
1ea20 64 65 64 20 74 6f 20 74 68 65 20 53 72 63 4c 69  ded to the SrcLi
1ea30 73 74 2e 0a 2a 2f 0a 53 72 63 4c 69 73 74 20 2a  st..*/.SrcList *
1ea40 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70  sqlite3SrcListAp
1ea50 70 65 6e 64 28 0a 20 20 73 71 6c 69 74 65 33 20  pend(.  sqlite3 
1ea60 2a 64 62 2c 20 20 20 20 20 20 20 20 2f 2a 20 43  *db,        /* C
1ea70 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 6e 6f 74  onnection to not
1ea80 69 66 79 20 6f 66 20 6d 61 6c 6c 6f 63 20 66 61  ify of malloc fa
1ea90 69 6c 75 72 65 73 20 2a 2f 0a 20 20 53 72 63 4c  ilures */.  SrcL
1eaa0 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 20 20  ist *pList,     
1eab0 2f 2a 20 41 70 70 65 6e 64 20 74 6f 20 74 68 69  /* Append to thi
1eac0 73 20 53 72 63 4c 69 73 74 2e 20 4e 55 4c 4c 20  s SrcList. NULL 
1ead0 63 72 65 61 74 65 73 20 61 20 6e 65 77 20 53 72  creates a new Sr
1eae0 63 4c 69 73 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e  cList */.  Token
1eaf0 20 2a 70 54 61 62 6c 65 2c 20 20 20 20 20 20 2f   *pTable,      /
1eb00 2a 20 54 61 62 6c 65 20 74 6f 20 61 70 70 65 6e  * Table to appen
1eb10 64 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 44  d */.  Token *pD
1eb20 61 74 61 62 61 73 65 20 20 20 20 2f 2a 20 44 61  atabase    /* Da
1eb30 74 61 62 61 73 65 20 6f 66 20 74 68 65 20 74 61  tabase of the ta
1eb40 62 6c 65 20 2a 2f 0a 29 7b 0a 20 20 73 74 72 75  ble */.){.  stru
1eb50 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
1eb60 2a 70 49 74 65 6d 3b 0a 20 20 61 73 73 65 72 74  *pItem;.  assert
1eb70 28 20 70 44 61 74 61 62 61 73 65 3d 3d 30 20 7c  ( pDatabase==0 |
1eb80 7c 20 70 54 61 62 6c 65 21 3d 30 20 29 3b 20 20  | pTable!=0 );  
1eb90 2f 2a 20 43 61 6e 6e 6f 74 20 68 61 76 65 20 43  /* Cannot have C
1eba0 20 77 69 74 68 6f 75 74 20 42 20 2a 2f 0a 20 20   without B */.  
1ebb0 61 73 73 65 72 74 28 20 64 62 21 3d 30 20 29 3b  assert( db!=0 );
1ebc0 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20  .  if( pList==0 
1ebd0 29 7b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 73  ){.    pList = s
1ebe0 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61  qlite3DbMallocRa
1ebf0 77 4e 4e 28 64 62 2c 20 73 69 7a 65 6f 66 28 53  wNN(db, sizeof(S
1ec00 72 63 4c 69 73 74 29 20 29 3b 0a 20 20 20 20 69  rcList) );.    i
1ec10 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65  f( pList==0 ) re
1ec20 74 75 72 6e 20 30 3b 0a 20 20 20 20 70 4c 69 73  turn 0;.    pLis
1ec30 74 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 31 3b 0a 20  t->nAlloc = 1;. 
1ec40 20 20 20 70 4c 69 73 74 2d 3e 6e 53 72 63 20 3d     pList->nSrc =
1ec50 20 30 3b 0a 20 20 7d 0a 20 20 70 4c 69 73 74 20   0;.  }.  pList 
1ec60 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74  = sqlite3SrcList
1ec70 45 6e 6c 61 72 67 65 28 64 62 2c 20 70 4c 69 73  Enlarge(db, pLis
1ec80 74 2c 20 31 2c 20 70 4c 69 73 74 2d 3e 6e 53 72  t, 1, pList->nSr
1ec90 63 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61  c);.  if( db->ma
1eca0 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
1ecb0 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74    sqlite3SrcList
1ecc0 44 65 6c 65 74 65 28 64 62 2c 20 70 4c 69 73 74  Delete(db, pList
1ecd0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  );.    return 0;
1ece0 0a 20 20 7d 0a 20 20 70 49 74 65 6d 20 3d 20 26  .  }.  pItem = &
1ecf0 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e  pList->a[pList->
1ed00 6e 53 72 63 2d 31 5d 3b 0a 20 20 69 66 28 20 70  nSrc-1];.  if( p
1ed10 44 61 74 61 62 61 73 65 20 26 26 20 70 44 61 74  Database && pDat
1ed20 61 62 61 73 65 2d 3e 7a 3d 3d 30 20 29 7b 0a 20  abase->z==0 ){. 
1ed30 20 20 20 70 44 61 74 61 62 61 73 65 20 3d 20 30     pDatabase = 0
1ed40 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 44 61 74  ;.  }.  if( pDat
1ed50 61 62 61 73 65 20 29 7b 0a 20 20 20 20 54 6f 6b  abase ){.    Tok
1ed60 65 6e 20 2a 70 54 65 6d 70 20 3d 20 70 44 61 74  en *pTemp = pDat
1ed70 61 62 61 73 65 3b 0a 20 20 20 20 70 44 61 74 61  abase;.    pData
1ed80 62 61 73 65 20 3d 20 70 54 61 62 6c 65 3b 0a 20  base = pTable;. 
1ed90 20 20 20 70 54 61 62 6c 65 20 3d 20 70 54 65 6d     pTable = pTem
1eda0 70 3b 0a 20 20 7d 0a 20 20 70 49 74 65 6d 2d 3e  p;.  }.  pItem->
1edb0 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e  zName = sqlite3N
1edc0 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c  ameFromToken(db,
1edd0 20 70 54 61 62 6c 65 29 3b 0a 20 20 70 49 74 65   pTable);.  pIte
1ede0 6d 2d 3e 7a 44 61 74 61 62 61 73 65 20 3d 20 73  m->zDatabase = s
1edf0 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f  qlite3NameFromTo
1ee00 6b 65 6e 28 64 62 2c 20 70 44 61 74 61 62 61 73  ken(db, pDatabas
1ee10 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 4c 69  e);.  return pLi
1ee20 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 73 73  st;.}../*.** Ass
1ee30 69 67 6e 20 56 64 62 65 43 75 72 73 6f 72 20 69  ign VdbeCursor i
1ee40 6e 64 65 78 20 6e 75 6d 62 65 72 73 20 74 6f 20  ndex numbers to 
1ee50 61 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20 61 20  all tables in a 
1ee60 53 72 63 4c 69 73 74 0a 2a 2f 0a 76 6f 69 64 20  SrcList.*/.void 
1ee70 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 73  sqlite3SrcListAs
1ee80 73 69 67 6e 43 75 72 73 6f 72 73 28 50 61 72 73  signCursors(Pars
1ee90 65 20 2a 70 50 61 72 73 65 2c 20 53 72 63 4c 69  e *pParse, SrcLi
1eea0 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e  st *pList){.  in
1eeb0 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 53 72  t i;.  struct Sr
1eec0 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  cList_item *pIte
1eed0 6d 3b 0a 20 20 61 73 73 65 72 74 28 70 4c 69 73  m;.  assert(pLis
1eee0 74 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d  t || pParse->db-
1eef0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
1ef00 0a 20 20 69 66 28 20 70 4c 69 73 74 20 29 7b 0a  .  if( pList ){.
1ef10 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 70 49 74      for(i=0, pIt
1ef20 65 6d 3d 70 4c 69 73 74 2d 3e 61 3b 20 69 3c 70  em=pList->a; i<p
1ef30 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c  List->nSrc; i++,
1ef40 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20   pItem++){.     
1ef50 20 69 66 28 20 70 49 74 65 6d 2d 3e 69 43 75 72   if( pItem->iCur
1ef60 73 6f 72 3e 3d 30 20 29 20 62 72 65 61 6b 3b 0a  sor>=0 ) break;.
1ef70 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 69 43 75        pItem->iCu
1ef80 72 73 6f 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e  rsor = pParse->n
1ef90 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28  Tab++;.      if(
1efa0 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 20   pItem->pSelect 
1efb0 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
1efc0 65 33 53 72 63 4c 69 73 74 41 73 73 69 67 6e 43  e3SrcListAssignC
1efd0 75 72 73 6f 72 73 28 70 50 61 72 73 65 2c 20 70  ursors(pParse, p
1efe0 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 2d 3e 70  Item->pSelect->p
1eff0 53 72 63 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Src);.      }.  
1f000 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
1f010 20 44 65 6c 65 74 65 20 61 6e 20 65 6e 74 69 72   Delete an entir
1f020 65 20 53 72 63 4c 69 73 74 20 69 6e 63 6c 75 64  e SrcList includ
1f030 69 6e 67 20 61 6c 6c 20 69 74 73 20 73 75 62 73  ing all its subs
1f040 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 76 6f 69  tructure..*/.voi
1f050 64 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74  d sqlite3SrcList
1f060 44 65 6c 65 74 65 28 73 71 6c 69 74 65 33 20 2a  Delete(sqlite3 *
1f070 64 62 2c 20 53 72 63 4c 69 73 74 20 2a 70 4c 69  db, SrcList *pLi
1f080 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  st){.  int i;.  
1f090 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
1f0a0 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69 66  tem *pItem;.  if
1f0b0 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74  ( pList==0 ) ret
1f0c0 75 72 6e 3b 0a 20 20 66 6f 72 28 70 49 74 65 6d  urn;.  for(pItem
1f0d0 3d 70 4c 69 73 74 2d 3e 61 2c 20 69 3d 30 3b 20  =pList->a, i=0; 
1f0e0 69 3c 70 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69  i<pList->nSrc; i
1f0f0 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20  ++, pItem++){.  
1f100 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
1f110 64 62 2c 20 70 49 74 65 6d 2d 3e 7a 44 61 74 61  db, pItem->zData
1f120 62 61 73 65 29 3b 0a 20 20 20 20 73 71 6c 69 74  base);.    sqlit
1f130 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 49 74  e3DbFree(db, pIt
1f140 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  em->zName);.    
1f150 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
1f160 2c 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 29  , pItem->zAlias)
1f170 3b 0a 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d  ;.    if( pItem-
1f180 3e 66 67 2e 69 73 49 6e 64 65 78 65 64 42 79 20  >fg.isIndexedBy 
1f190 29 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28  ) sqlite3DbFree(
1f1a0 64 62 2c 20 70 49 74 65 6d 2d 3e 75 31 2e 7a 49  db, pItem->u1.zI
1f1b0 6e 64 65 78 65 64 42 79 29 3b 0a 20 20 20 20 69  ndexedBy);.    i
1f1c0 66 28 20 70 49 74 65 6d 2d 3e 66 67 2e 69 73 54  f( pItem->fg.isT
1f1d0 61 62 46 75 6e 63 20 29 20 73 71 6c 69 74 65 33  abFunc ) sqlite3
1f1e0 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64  ExprListDelete(d
1f1f0 62 2c 20 70 49 74 65 6d 2d 3e 75 31 2e 70 46 75  b, pItem->u1.pFu
1f200 6e 63 41 72 67 29 3b 0a 20 20 20 20 73 71 6c 69  ncArg);.    sqli
1f210 74 65 33 44 65 6c 65 74 65 54 61 62 6c 65 28 64  te3DeleteTable(d
1f220 62 2c 20 70 49 74 65 6d 2d 3e 70 54 61 62 29 3b  b, pItem->pTab);
1f230 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65  .    sqlite3Sele
1f240 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70 49 74  ctDelete(db, pIt
1f250 65 6d 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20  em->pSelect);.  
1f260 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
1f270 65 74 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 70  ete(db, pItem->p
1f280 4f 6e 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  On);.    sqlite3
1f290 49 64 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c  IdListDelete(db,
1f2a0 20 70 49 74 65 6d 2d 3e 70 55 73 69 6e 67 29 3b   pItem->pUsing);
1f2b0 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44 62  .  }.  sqlite3Db
1f2c0 46 72 65 65 28 64 62 2c 20 70 4c 69 73 74 29 3b  Free(db, pList);
1f2d0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
1f2e0 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
1f2f0 20 62 79 20 74 68 65 20 70 61 72 73 65 72 20 74   by the parser t
1f300 6f 20 61 64 64 20 61 20 6e 65 77 20 74 65 72 6d  o add a new term
1f310 20 74 6f 20 74 68 65 0a 2a 2a 20 65 6e 64 20 6f   to the.** end o
1f320 66 20 61 20 67 72 6f 77 69 6e 67 20 46 52 4f 4d  f a growing FROM
1f330 20 63 6c 61 75 73 65 2e 20 20 54 68 65 20 22 70   clause.  The "p
1f340 22 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 74  " parameter is t
1f350 68 65 20 70 61 72 74 20 6f 66 0a 2a 2a 20 74 68  he part of.** th
1f360 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 68  e FROM clause th
1f370 61 74 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  at has already b
1f380 65 65 6e 20 63 6f 6e 73 74 72 75 63 74 65 64 2e  een constructed.
1f390 20 20 22 70 22 20 69 73 20 4e 55 4c 4c 0a 2a 2a    "p" is NULL.**
1f3a0 20 69 66 20 74 68 69 73 20 69 73 20 74 68 65 20   if this is the 
1f3b0 66 69 72 73 74 20 74 65 72 6d 20 6f 66 20 74 68  first term of th
1f3c0 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20  e FROM clause.  
1f3d0 70 54 61 62 6c 65 20 61 6e 64 20 70 44 61 74 61  pTable and pData
1f3e0 62 61 73 65 0a 2a 2a 20 61 72 65 20 74 68 65 20  base.** are the 
1f3f0 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c  name of the tabl
1f400 65 20 61 6e 64 20 64 61 74 61 62 61 73 65 20 6e  e and database n
1f410 61 6d 65 64 20 69 6e 20 74 68 65 20 46 52 4f 4d  amed in the FROM
1f420 20 63 6c 61 75 73 65 20 74 65 72 6d 2e 0a 2a 2a   clause term..**
1f430 20 70 44 61 74 61 62 61 73 65 20 69 73 20 4e 55   pDatabase is NU
1f440 4c 4c 20 69 66 20 74 68 65 20 64 61 74 61 62 61  LL if the databa
1f450 73 65 20 6e 61 6d 65 20 71 75 61 6c 69 66 69 65  se name qualifie
1f460 72 20 69 73 20 6d 69 73 73 69 6e 67 20 2d 20 74  r is missing - t
1f470 68 65 0a 2a 2a 20 75 73 75 61 6c 20 63 61 73 65  he.** usual case
1f480 2e 20 20 49 66 20 74 68 65 20 74 65 72 6d 20 68  .  If the term h
1f490 61 73 20 61 6e 20 61 6c 69 61 73 2c 20 74 68 65  as an alias, the
1f4a0 6e 20 70 41 6c 69 61 73 20 70 6f 69 6e 74 73 20  n pAlias points 
1f4b0 74 6f 20 74 68 65 0a 2a 2a 20 61 6c 69 61 73 20  to the.** alias 
1f4c0 74 6f 6b 65 6e 2e 20 20 49 66 20 74 68 65 20 74  token.  If the t
1f4d0 65 72 6d 20 69 73 20 61 20 73 75 62 71 75 65 72  erm is a subquer
1f4e0 79 2c 20 74 68 65 6e 20 70 53 75 62 71 75 65 72  y, then pSubquer
1f4f0 79 20 69 73 20 74 68 65 0a 2a 2a 20 53 45 4c 45  y is the.** SELE
1f500 43 54 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61  CT statement tha
1f510 74 20 74 68 65 20 73 75 62 71 75 65 72 79 20 65  t the subquery e
1f520 6e 63 6f 64 65 73 2e 20 20 54 68 65 20 70 54 61  ncodes.  The pTa
1f530 62 6c 65 20 61 6e 64 0a 2a 2a 20 70 44 61 74 61  ble and.** pData
1f540 62 61 73 65 20 70 61 72 61 6d 65 74 65 72 73 20  base parameters 
1f550 61 72 65 20 4e 55 4c 4c 20 66 6f 72 20 73 75 62  are NULL for sub
1f560 71 75 65 72 69 65 73 2e 20 20 54 68 65 20 70 4f  queries.  The pO
1f570 6e 20 61 6e 64 20 70 55 73 69 6e 67 0a 2a 2a 20  n and pUsing.** 
1f580 70 61 72 61 6d 65 74 65 72 73 20 61 72 65 20 74  parameters are t
1f590 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68  he content of th
1f5a0 65 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 63  e ON and USING c
1f5b0 6c 61 75 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 52 65  lauses..**.** Re
1f5c0 74 75 72 6e 20 61 20 6e 65 77 20 53 72 63 4c 69  turn a new SrcLi
1f5d0 73 74 20 77 68 69 63 68 20 65 6e 63 6f 64 65 73  st which encodes
1f5e0 20 69 73 20 74 68 65 20 46 52 4f 4d 20 77 69 74   is the FROM wit
1f5f0 68 20 74 68 65 20 6e 65 77 0a 2a 2a 20 74 65 72  h the new.** ter
1f600 6d 20 61 64 64 65 64 2e 0a 2a 2f 0a 53 72 63 4c  m added..*/.SrcL
1f610 69 73 74 20 2a 73 71 6c 69 74 65 33 53 72 63 4c  ist *sqlite3SrcL
1f620 69 73 74 41 70 70 65 6e 64 46 72 6f 6d 54 65 72  istAppendFromTer
1f630 6d 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  m(.  Parse *pPar
1f640 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  se,          /* 
1f650 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
1f660 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 2c  */.  SrcList *p,
1f670 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1f680 54 68 65 20 6c 65 66 74 20 70 61 72 74 20 6f 66  The left part of
1f690 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
1f6a0 20 61 6c 72 65 61 64 79 20 73 65 65 6e 20 2a 2f   already seen */
1f6b0 0a 20 20 54 6f 6b 65 6e 20 2a 70 54 61 62 6c 65  .  Token *pTable
1f6c0 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61  ,          /* Na
1f6d0 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  me of the table 
1f6e0 74 6f 20 61 64 64 20 74 6f 20 74 68 65 20 46 52  to add to the FR
1f6f0 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 54  OM clause */.  T
1f700 6f 6b 65 6e 20 2a 70 44 61 74 61 62 61 73 65 2c  oken *pDatabase,
1f710 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
1f720 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63  f the database c
1f730 6f 6e 74 61 69 6e 69 6e 67 20 70 54 61 62 6c 65  ontaining pTable
1f740 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 41 6c   */.  Token *pAl
1f750 69 61 73 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  ias,          /*
1f760 20 54 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20   The right-hand 
1f770 73 69 64 65 20 6f 66 20 74 68 65 20 41 53 20 73  side of the AS s
1f780 75 62 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a  ubexpression */.
1f790 20 20 53 65 6c 65 63 74 20 2a 70 53 75 62 71 75    Select *pSubqu
1f7a0 65 72 79 2c 20 20 20 20 20 20 2f 2a 20 41 20 73  ery,      /* A s
1f7b0 75 62 71 75 65 72 79 20 75 73 65 64 20 69 6e 20  ubquery used in 
1f7c0 70 6c 61 63 65 20 6f 66 20 61 20 74 61 62 6c 65  place of a table
1f7d0 20 6e 61 6d 65 20 2a 2f 0a 20 20 45 78 70 72 20   name */.  Expr 
1f7e0 2a 70 4f 6e 2c 20 20 20 20 20 20 20 20 20 20 20  *pOn,           
1f7f0 20 20 20 2f 2a 20 54 68 65 20 4f 4e 20 63 6c 61     /* The ON cla
1f800 75 73 65 20 6f 66 20 61 20 6a 6f 69 6e 20 2a 2f  use of a join */
1f810 0a 20 20 49 64 4c 69 73 74 20 2a 70 55 73 69 6e  .  IdList *pUsin
1f820 67 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  g          /* Th
1f830 65 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20 6f  e USING clause o
1f840 66 20 61 20 6a 6f 69 6e 20 2a 2f 0a 29 7b 0a 20  f a join */.){. 
1f850 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
1f860 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 73  item *pItem;.  s
1f870 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
1f880 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20 21  rse->db;.  if( !
1f890 70 20 26 26 20 28 70 4f 6e 20 7c 7c 20 70 55 73  p && (pOn || pUs
1f8a0 69 6e 67 29 20 29 7b 0a 20 20 20 20 73 71 6c 69  ing) ){.    sqli
1f8b0 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
1f8c0 73 65 2c 20 22 61 20 4a 4f 49 4e 20 63 6c 61 75  se, "a JOIN clau
1f8d0 73 65 20 69 73 20 72 65 71 75 69 72 65 64 20 62  se is required b
1f8e0 65 66 6f 72 65 20 25 73 22 2c 20 0a 20 20 20 20  efore %s", .    
1f8f0 20 20 28 70 4f 6e 20 3f 20 22 4f 4e 22 20 3a 20    (pOn ? "ON" : 
1f900 22 55 53 49 4e 47 22 29 0a 20 20 20 20 29 3b 0a  "USING").    );.
1f910 20 20 20 20 67 6f 74 6f 20 61 70 70 65 6e 64 5f      goto append_
1f920 66 72 6f 6d 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a  from_error;.  }.
1f930 20 20 70 20 3d 20 73 71 6c 69 74 65 33 53 72 63    p = sqlite3Src
1f940 4c 69 73 74 41 70 70 65 6e 64 28 64 62 2c 20 70  ListAppend(db, p
1f950 2c 20 70 54 61 62 6c 65 2c 20 70 44 61 74 61 62  , pTable, pDatab
1f960 61 73 65 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30  ase);.  if( p==0
1f970 20 7c 7c 20 4e 45 56 45 52 28 70 2d 3e 6e 53 72   || NEVER(p->nSr
1f980 63 3d 3d 30 29 20 29 7b 0a 20 20 20 20 67 6f 74  c==0) ){.    got
1f990 6f 20 61 70 70 65 6e 64 5f 66 72 6f 6d 5f 65 72  o append_from_er
1f9a0 72 6f 72 3b 0a 20 20 7d 0a 20 20 70 49 74 65 6d  ror;.  }.  pItem
1f9b0 20 3d 20 26 70 2d 3e 61 5b 70 2d 3e 6e 53 72 63   = &p->a[p->nSrc
1f9c0 2d 31 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70  -1];.  assert( p
1f9d0 41 6c 69 61 73 21 3d 30 20 29 3b 0a 20 20 69 66  Alias!=0 );.  if
1f9e0 28 20 70 41 6c 69 61 73 2d 3e 6e 20 29 7b 0a 20  ( pAlias->n ){. 
1f9f0 20 20 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73     pItem->zAlias
1fa00 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72   = sqlite3NameFr
1fa10 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 41 6c 69  omToken(db, pAli
1fa20 61 73 29 3b 0a 20 20 7d 0a 20 20 70 49 74 65 6d  as);.  }.  pItem
1fa30 2d 3e 70 53 65 6c 65 63 74 20 3d 20 70 53 75 62  ->pSelect = pSub
1fa40 71 75 65 72 79 3b 0a 20 20 70 49 74 65 6d 2d 3e  query;.  pItem->
1fa50 70 4f 6e 20 3d 20 70 4f 6e 3b 0a 20 20 70 49 74  pOn = pOn;.  pIt
1fa60 65 6d 2d 3e 70 55 73 69 6e 67 20 3d 20 70 55 73  em->pUsing = pUs
1fa70 69 6e 67 3b 0a 20 20 72 65 74 75 72 6e 20 70 3b  ing;.  return p;
1fa80 0a 0a 20 61 70 70 65 6e 64 5f 66 72 6f 6d 5f 65  .. append_from_e
1fa90 72 72 6f 72 3a 0a 20 20 61 73 73 65 72 74 28 20  rror:.  assert( 
1faa0 70 3d 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65  p==0 );.  sqlite
1fab0 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20  3ExprDelete(db, 
1fac0 70 4f 6e 29 3b 0a 20 20 73 71 6c 69 74 65 33 49  pOn);.  sqlite3I
1fad0 64 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20  dListDelete(db, 
1fae0 70 55 73 69 6e 67 29 3b 0a 20 20 73 71 6c 69 74  pUsing);.  sqlit
1faf0 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64  e3SelectDelete(d
1fb00 62 2c 20 70 53 75 62 71 75 65 72 79 29 3b 0a 20  b, pSubquery);. 
1fb10 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
1fb20 0a 2a 2a 20 41 64 64 20 61 6e 20 49 4e 44 45 58  .** Add an INDEX
1fb30 45 44 20 42 59 20 6f 72 20 4e 4f 54 20 49 4e 44  ED BY or NOT IND
1fb40 45 58 45 44 20 63 6c 61 75 73 65 20 74 6f 20 74  EXED clause to t
1fb50 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79  he most recently
1fb60 20 61 64 64 65 64 20 0a 2a 2a 20 65 6c 65 6d 65   added .** eleme
1fb70 6e 74 20 6f 66 20 74 68 65 20 73 6f 75 72 63 65  nt of the source
1fb80 2d 6c 69 73 74 20 70 61 73 73 65 64 20 61 73 20  -list passed as 
1fb90 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
1fba0 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ent..*/.void sql
1fbb0 69 74 65 33 53 72 63 4c 69 73 74 49 6e 64 65 78  ite3SrcListIndex
1fbc0 65 64 42 79 28 50 61 72 73 65 20 2a 70 50 61 72  edBy(Parse *pPar
1fbd0 73 65 2c 20 53 72 63 4c 69 73 74 20 2a 70 2c 20  se, SrcList *p, 
1fbe0 54 6f 6b 65 6e 20 2a 70 49 6e 64 65 78 65 64 42  Token *pIndexedB
1fbf0 79 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 49  y){.  assert( pI
1fc00 6e 64 65 78 65 64 42 79 21 3d 30 20 29 3b 0a 20  ndexedBy!=0 );. 
1fc10 20 69 66 28 20 70 20 26 26 20 41 4c 57 41 59 53   if( p && ALWAYS
1fc20 28 70 2d 3e 6e 53 72 63 3e 30 29 20 29 7b 0a 20  (p->nSrc>0) ){. 
1fc30 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73     struct SrcLis
1fc40 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20  t_item *pItem = 
1fc50 26 70 2d 3e 61 5b 70 2d 3e 6e 53 72 63 2d 31 5d  &p->a[p->nSrc-1]
1fc60 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49  ;.    assert( pI
1fc70 74 65 6d 2d 3e 66 67 2e 6e 6f 74 49 6e 64 65 78  tem->fg.notIndex
1fc80 65 64 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73  ed==0 );.    ass
1fc90 65 72 74 28 20 70 49 74 65 6d 2d 3e 66 67 2e 69  ert( pItem->fg.i
1fca0 73 49 6e 64 65 78 65 64 42 79 3d 3d 30 20 29 3b  sIndexedBy==0 );
1fcb0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49 74  .    assert( pIt
1fcc0 65 6d 2d 3e 66 67 2e 69 73 54 61 62 46 75 6e 63  em->fg.isTabFunc
1fcd0 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70  ==0 );.    if( p
1fce0 49 6e 64 65 78 65 64 42 79 2d 3e 6e 3d 3d 31 20  IndexedBy->n==1 
1fcf0 26 26 20 21 70 49 6e 64 65 78 65 64 42 79 2d 3e  && !pIndexedBy->
1fd00 7a 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 20  z ){.      /* A 
1fd10 22 4e 4f 54 20 49 4e 44 45 58 45 44 22 20 63 6c  "NOT INDEXED" cl
1fd20 61 75 73 65 20 77 61 73 20 73 75 70 70 6c 69 65  ause was supplie
1fd30 64 2e 20 53 65 65 20 70 61 72 73 65 2e 79 20 0a  d. See parse.y .
1fd40 20 20 20 20 20 20 2a 2a 20 63 6f 6e 73 74 72 75        ** constru
1fd50 63 74 20 22 69 6e 64 65 78 65 64 5f 6f 70 74 22  ct "indexed_opt"
1fd60 20 66 6f 72 20 64 65 74 61 69 6c 73 2e 20 2a 2f   for details. */
1fd70 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 66 67  .      pItem->fg
1fd80 2e 6e 6f 74 49 6e 64 65 78 65 64 20 3d 20 31 3b  .notIndexed = 1;
1fd90 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1fda0 20 20 70 49 74 65 6d 2d 3e 75 31 2e 7a 49 6e 64    pItem->u1.zInd
1fdb0 65 78 65 64 42 79 20 3d 20 73 71 6c 69 74 65 33  exedBy = sqlite3
1fdc0 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 50  NameFromToken(pP
1fdd0 61 72 73 65 2d 3e 64 62 2c 20 70 49 6e 64 65 78  arse->db, pIndex
1fde0 65 64 42 79 29 3b 0a 20 20 20 20 20 20 70 49 74  edBy);.      pIt
1fdf0 65 6d 2d 3e 66 67 2e 69 73 49 6e 64 65 78 65 64  em->fg.isIndexed
1fe00 42 79 20 3d 20 28 70 49 74 65 6d 2d 3e 75 31 2e  By = (pItem->u1.
1fe10 7a 49 6e 64 65 78 65 64 42 79 21 3d 30 29 3b 0a  zIndexedBy!=0);.
1fe20 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
1fe30 2a 2a 20 41 64 64 20 74 68 65 20 6c 69 73 74 20  ** Add the list 
1fe40 6f 66 20 66 75 6e 63 74 69 6f 6e 20 61 72 67 75  of function argu
1fe50 6d 65 6e 74 73 20 74 6f 20 74 68 65 20 53 72 63  ments to the Src
1fe60 4c 69 73 74 20 65 6e 74 72 79 20 66 6f 72 20 61  List entry for a
1fe70 0a 2a 2a 20 74 61 62 6c 65 2d 76 61 6c 75 65 64  .** table-valued
1fe80 2d 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f  -function..*/.vo
1fe90 69 64 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73  id sqlite3SrcLis
1fea0 74 46 75 6e 63 41 72 67 73 28 50 61 72 73 65 20  tFuncArgs(Parse 
1feb0 2a 70 50 61 72 73 65 2c 20 53 72 63 4c 69 73 74  *pParse, SrcList
1fec0 20 2a 70 2c 20 45 78 70 72 4c 69 73 74 20 2a 70   *p, ExprList *p
1fed0 4c 69 73 74 29 7b 0a 20 20 69 66 28 20 70 20 29  List){.  if( p )
1fee0 7b 0a 20 20 20 20 73 74 72 75 63 74 20 53 72 63  {.    struct Src
1fef0 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
1ff00 20 3d 20 26 70 2d 3e 61 5b 70 2d 3e 6e 53 72 63   = &p->a[p->nSrc
1ff10 2d 31 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28  -1];.    assert(
1ff20 20 70 49 74 65 6d 2d 3e 66 67 2e 6e 6f 74 49 6e   pItem->fg.notIn
1ff30 64 65 78 65 64 3d 3d 30 20 29 3b 0a 20 20 20 20  dexed==0 );.    
1ff40 61 73 73 65 72 74 28 20 70 49 74 65 6d 2d 3e 66  assert( pItem->f
1ff50 67 2e 69 73 49 6e 64 65 78 65 64 42 79 3d 3d 30  g.isIndexedBy==0
1ff60 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
1ff70 70 49 74 65 6d 2d 3e 66 67 2e 69 73 54 61 62 46  pItem->fg.isTabF
1ff80 75 6e 63 3d 3d 30 20 29 3b 0a 20 20 20 20 70 49  unc==0 );.    pI
1ff90 74 65 6d 2d 3e 75 31 2e 70 46 75 6e 63 41 72 67  tem->u1.pFuncArg
1ffa0 20 3d 20 70 4c 69 73 74 3b 0a 20 20 20 20 70 49   = pList;.    pI
1ffb0 74 65 6d 2d 3e 66 67 2e 69 73 54 61 62 46 75 6e  tem->fg.isTabFun
1ffc0 63 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a  c = 1;.  }else{.
1ffd0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c      sqlite3ExprL
1ffe0 69 73 74 44 65 6c 65 74 65 28 70 50 61 72 73 65  istDelete(pParse
1fff0 2d 3e 64 62 2c 20 70 4c 69 73 74 29 3b 0a 20 20  ->db, pList);.  
20000 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20  }.}../*.** When 
20010 62 75 69 6c 64 69 6e 67 20 75 70 20 61 20 46 52  building up a FR
20020 4f 4d 20 63 6c 61 75 73 65 20 69 6e 20 74 68 65  OM clause in the
20030 20 70 61 72 73 65 72 2c 20 74 68 65 20 6a 6f 69   parser, the joi
20040 6e 20 6f 70 65 72 61 74 6f 72 0a 2a 2a 20 69 73  n operator.** is
20050 20 69 6e 69 74 69 61 6c 6c 79 20 61 74 74 61 63   initially attac
20060 68 65 64 20 74 6f 20 74 68 65 20 6c 65 66 74 20  hed to the left 
20070 6f 70 65 72 61 6e 64 2e 20 20 42 75 74 20 74 68  operand.  But th
20080 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74 6f 72  e code generator
20090 0a 2a 2a 20 65 78 70 65 63 74 73 20 74 68 65 20  .** expects the 
200a0 6a 6f 69 6e 20 6f 70 65 72 61 74 6f 72 20 74 6f  join operator to
200b0 20 62 65 20 6f 6e 20 74 68 65 20 72 69 67 68 74   be on the right
200c0 20 6f 70 65 72 61 6e 64 2e 20 20 54 68 69 73 20   operand.  This 
200d0 72 6f 75 74 69 6e 65 0a 2a 2a 20 53 68 69 66 74  routine.** Shift
200e0 73 20 61 6c 6c 20 6a 6f 69 6e 20 6f 70 65 72 61  s all join opera
200f0 74 6f 72 73 20 66 72 6f 6d 20 6c 65 66 74 20 74  tors from left t
20100 6f 20 72 69 67 68 74 20 66 6f 72 20 61 6e 20 65  o right for an e
20110 6e 74 69 72 65 20 46 52 4f 4d 0a 2a 2a 20 63 6c  ntire FROM.** cl
20120 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 45 78 61 6d  ause..**.** Exam
20130 70 6c 65 3a 20 53 75 70 70 6f 73 65 20 74 68 65  ple: Suppose the
20140 20 6a 6f 69 6e 20 69 73 20 6c 69 6b 65 20 74 68   join is like th
20150 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  is:.**.**       
20160 20 20 20 20 41 20 6e 61 74 75 72 61 6c 20 63 72      A natural cr
20170 6f 73 73 20 6a 6f 69 6e 20 42 0a 2a 2a 0a 2a 2a  oss join B.**.**
20180 20 54 68 65 20 6f 70 65 72 61 74 6f 72 20 69 73   The operator is
20190 20 22 6e 61 74 75 72 61 6c 20 63 72 6f 73 73 20   "natural cross 
201a0 6a 6f 69 6e 22 2e 20 20 54 68 65 20 41 20 61 6e  join".  The A an
201b0 64 20 42 20 6f 70 65 72 61 6e 64 73 20 61 72 65  d B operands are
201c0 20 73 74 6f 72 65 64 0a 2a 2a 20 69 6e 20 70 2d   stored.** in p-
201d0 3e 61 5b 30 5d 20 61 6e 64 20 70 2d 3e 61 5b 31  >a[0] and p->a[1
201e0 5d 2c 20 72 65 73 70 65 63 74 69 76 65 6c 79 2e  ], respectively.
201f0 20 20 54 68 65 20 70 61 72 73 65 72 20 69 6e 69    The parser ini
20200 74 69 61 6c 6c 79 20 73 74 6f 72 65 73 20 74 68  tially stores th
20210 65 0a 2a 2a 20 6f 70 65 72 61 74 6f 72 20 77 69  e.** operator wi
20220 74 68 20 41 2e 20 20 54 68 69 73 20 72 6f 75 74  th A.  This rout
20230 69 6e 65 20 73 68 69 66 74 73 20 74 68 61 74 20  ine shifts that 
20240 6f 70 65 72 61 74 6f 72 20 6f 76 65 72 20 74 6f  operator over to
20250 20 42 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69   B..*/.void sqli
20260 74 65 33 53 72 63 4c 69 73 74 53 68 69 66 74 4a  te3SrcListShiftJ
20270 6f 69 6e 54 79 70 65 28 53 72 63 4c 69 73 74 20  oinType(SrcList 
20280 2a 70 29 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a  *p){.  if( p ){.
20290 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66      int i;.    f
202a0 6f 72 28 69 3d 70 2d 3e 6e 53 72 63 2d 31 3b 20  or(i=p->nSrc-1; 
202b0 69 3e 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 20  i>0; i--){.     
202c0 20 70 2d 3e 61 5b 69 5d 2e 66 67 2e 6a 6f 69 6e   p->a[i].fg.join
202d0 74 79 70 65 20 3d 20 70 2d 3e 61 5b 69 2d 31 5d  type = p->a[i-1]
202e0 2e 66 67 2e 6a 6f 69 6e 74 79 70 65 3b 0a 20 20  .fg.jointype;.  
202f0 20 20 7d 0a 20 20 20 20 70 2d 3e 61 5b 30 5d 2e    }.    p->a[0].
20300 66 67 2e 6a 6f 69 6e 74 79 70 65 20 3d 20 30 3b  fg.jointype = 0;
20310 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  .  }.}../*.** Ge
20320 6e 65 72 61 74 65 20 56 44 42 45 20 63 6f 64 65  nerate VDBE code
20330 20 66 6f 72 20 61 20 42 45 47 49 4e 20 73 74 61   for a BEGIN sta
20340 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20  tement..*/.void 
20350 73 71 6c 69 74 65 33 42 65 67 69 6e 54 72 61 6e  sqlite3BeginTran
20360 73 61 63 74 69 6f 6e 28 50 61 72 73 65 20 2a 70  saction(Parse *p
20370 50 61 72 73 65 2c 20 69 6e 74 20 74 79 70 65 29  Parse, int type)
20380 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  {.  sqlite3 *db;
20390 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 69 6e  .  Vdbe *v;.  in
203a0 74 20 69 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  t i;..  assert( 
203b0 70 50 61 72 73 65 21 3d 30 20 29 3b 0a 20 20 64  pParse!=0 );.  d
203c0 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
203d0 20 20 61 73 73 65 72 74 28 20 64 62 21 3d 30 20    assert( db!=0 
203e0 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  );.  if( sqlite3
203f0 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65  AuthCheck(pParse
20400 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 41 43  , SQLITE_TRANSAC
20410 54 49 4f 4e 2c 20 22 42 45 47 49 4e 22 2c 20 30  TION, "BEGIN", 0
20420 2c 20 30 29 20 29 7b 0a 20 20 20 20 72 65 74 75  , 0) ){.    retu
20430 72 6e 3b 0a 20 20 7d 0a 20 20 76 20 3d 20 73 71  rn;.  }.  v = sq
20440 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
20450 72 73 65 29 3b 0a 20 20 69 66 28 20 21 76 20 29  rse);.  if( !v )
20460 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 74   return;.  if( t
20470 79 70 65 21 3d 54 4b 5f 44 45 46 45 52 52 45 44  ype!=TK_DEFERRED
20480 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   ){.    for(i=0;
20490 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29   i<db->nDb; i++)
204a0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
204b0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
204c0 54 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69 2c 20  Transaction, i, 
204d0 28 74 79 70 65 3d 3d 54 4b 5f 45 58 43 4c 55 53  (type==TK_EXCLUS
204e0 49 56 45 29 2b 31 29 3b 0a 20 20 20 20 20 20 73  IVE)+1);.      s
204f0 71 6c 69 74 65 33 56 64 62 65 55 73 65 73 42 74  qlite3VdbeUsesBt
20500 72 65 65 28 76 2c 20 69 29 3b 0a 20 20 20 20 7d  ree(v, i);.    }
20510 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64  .  }.  sqlite3Vd
20520 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 41  beAddOp0(v, OP_A
20530 75 74 6f 43 6f 6d 6d 69 74 29 3b 0a 7d 0a 0a 2f  utoCommit);.}../
20540 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 56 44  *.** Generate VD
20550 42 45 20 63 6f 64 65 20 66 6f 72 20 61 20 43 4f  BE code for a CO
20560 4d 4d 49 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a  MMIT statement..
20570 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43  */.void sqlite3C
20580 6f 6d 6d 69 74 54 72 61 6e 73 61 63 74 69 6f 6e  ommitTransaction
20590 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b  (Parse *pParse){
205a0 0a 20 20 56 64 62 65 20 2a 76 3b 0a 0a 20 20 61  .  Vdbe *v;..  a
205b0 73 73 65 72 74 28 20 70 50 61 72 73 65 21 3d 30  ssert( pParse!=0
205c0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
205d0 61 72 73 65 2d 3e 64 62 21 3d 30 20 29 3b 0a 20  arse->db!=0 );. 
205e0 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68   if( sqlite3Auth
205f0 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51  Check(pParse, SQ
20600 4c 49 54 45 5f 54 52 41 4e 53 41 43 54 49 4f 4e  LITE_TRANSACTION
20610 2c 20 22 43 4f 4d 4d 49 54 22 2c 20 30 2c 20 30  , "COMMIT", 0, 0
20620 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b  ) ){.    return;
20630 0a 20 20 7d 0a 20 20 76 20 3d 20 73 71 6c 69 74  .  }.  v = sqlit
20640 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
20650 29 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a 20 20  );.  if( v ){.  
20660 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
20670 4f 70 31 28 76 2c 20 4f 50 5f 41 75 74 6f 43 6f  Op1(v, OP_AutoCo
20680 6d 6d 69 74 2c 20 31 29 3b 0a 20 20 7d 0a 7d 0a  mmit, 1);.  }.}.
20690 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
206a0 56 44 42 45 20 63 6f 64 65 20 66 6f 72 20 61 20  VDBE code for a 
206b0 52 4f 4c 4c 42 41 43 4b 20 73 74 61 74 65 6d 65  ROLLBACK stateme
206c0 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  nt..*/.void sqli
206d0 74 65 33 52 6f 6c 6c 62 61 63 6b 54 72 61 6e 73  te3RollbackTrans
206e0 61 63 74 69 6f 6e 28 50 61 72 73 65 20 2a 70 50  action(Parse *pP
206f0 61 72 73 65 29 7b 0a 20 20 56 64 62 65 20 2a 76  arse){.  Vdbe *v
20700 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  ;..  assert( pPa
20710 72 73 65 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  rse!=0 );.  asse
20720 72 74 28 20 70 50 61 72 73 65 2d 3e 64 62 21 3d  rt( pParse->db!=
20730 30 20 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  0 );.  if( sqlit
20740 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72  e3AuthCheck(pPar
20750 73 65 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53  se, SQLITE_TRANS
20760 41 43 54 49 4f 4e 2c 20 22 52 4f 4c 4c 42 41 43  ACTION, "ROLLBAC
20770 4b 22 2c 20 30 2c 20 30 29 20 29 7b 0a 20 20 20  K", 0, 0) ){.   
20780 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 76   return;.  }.  v
20790 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
207a0 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28  e(pParse);.  if(
207b0 20 76 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65   v ){.    sqlite
207c0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
207d0 50 5f 41 75 74 6f 43 6f 6d 6d 69 74 2c 20 31 2c  P_AutoCommit, 1,
207e0 20 31 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a   1);.  }.}../*.*
207f0 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
20800 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65  is called by the
20810 20 70 61 72 73 65 72 20 77 68 65 6e 20 69 74 20   parser when it 
20820 70 61 72 73 65 73 20 61 20 63 6f 6d 6d 61 6e 64  parses a command
20830 20 74 6f 20 63 72 65 61 74 65 2c 0a 2a 2a 20 72   to create,.** r
20840 65 6c 65 61 73 65 20 6f 72 20 72 6f 6c 6c 62 61  elease or rollba
20850 63 6b 20 61 6e 20 53 51 4c 20 73 61 76 65 70 6f  ck an SQL savepo
20860 69 6e 74 2e 20 0a 2a 2f 0a 76 6f 69 64 20 73 71  int. .*/.void sq
20870 6c 69 74 65 33 53 61 76 65 70 6f 69 6e 74 28 50  lite3Savepoint(P
20880 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e  arse *pParse, in
20890 74 20 6f 70 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61  t op, Token *pNa
208a0 6d 65 29 7b 0a 20 20 63 68 61 72 20 2a 7a 4e 61  me){.  char *zNa
208b0 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65  me = sqlite3Name
208c0 46 72 6f 6d 54 6f 6b 65 6e 28 70 50 61 72 73 65  FromToken(pParse
208d0 2d 3e 64 62 2c 20 70 4e 61 6d 65 29 3b 0a 20 20  ->db, pName);.  
208e0 69 66 28 20 7a 4e 61 6d 65 20 29 7b 0a 20 20 20  if( zName ){.   
208f0 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74   Vdbe *v = sqlit
20900 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
20910 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  );.#ifndef SQLIT
20920 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41  E_OMIT_AUTHORIZA
20930 54 49 4f 4e 0a 20 20 20 20 73 74 61 74 69 63 20  TION.    static 
20940 63 6f 6e 73 74 20 63 68 61 72 20 2a 20 63 6f 6e  const char * con
20950 73 74 20 61 7a 5b 5d 20 3d 20 7b 20 22 42 45 47  st az[] = { "BEG
20960 49 4e 22 2c 20 22 52 45 4c 45 41 53 45 22 2c 20  IN", "RELEASE", 
20970 22 52 4f 4c 4c 42 41 43 4b 22 20 7d 3b 0a 20 20  "ROLLBACK" };.  
20980 20 20 61 73 73 65 72 74 28 20 21 53 41 56 45 50    assert( !SAVEP
20990 4f 49 4e 54 5f 42 45 47 49 4e 20 26 26 20 53 41  OINT_BEGIN && SA
209a0 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 3d  VEPOINT_RELEASE=
209b0 3d 31 20 26 26 20 53 41 56 45 50 4f 49 4e 54 5f  =1 && SAVEPOINT_
209c0 52 4f 4c 4c 42 41 43 4b 3d 3d 32 20 29 3b 0a 23  ROLLBACK==2 );.#
209d0 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20 21 76  endif.    if( !v
209e0 20 7c 7c 20 73 71 6c 69 74 65 33 41 75 74 68 43   || sqlite3AuthC
209f0 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c  heck(pParse, SQL
20a00 49 54 45 5f 53 41 56 45 50 4f 49 4e 54 2c 20 61  ITE_SAVEPOINT, a
20a10 7a 5b 6f 70 5d 2c 20 7a 4e 61 6d 65 2c 20 30 29  z[op], zName, 0)
20a20 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
20a30 33 44 62 46 72 65 65 28 70 50 61 72 73 65 2d 3e  3DbFree(pParse->
20a40 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  db, zName);.    
20a50 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a    return;.    }.
20a60 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
20a70 64 64 4f 70 34 28 76 2c 20 4f 50 5f 53 61 76 65  ddOp4(v, OP_Save
20a80 70 6f 69 6e 74 2c 20 6f 70 2c 20 30 2c 20 30 2c  point, op, 0, 0,
20a90 20 7a 4e 61 6d 65 2c 20 50 34 5f 44 59 4e 41 4d   zName, P4_DYNAM
20aa0 49 43 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  IC);.  }.}../*.*
20ab0 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20  * Make sure the 
20ac0 54 45 4d 50 20 64 61 74 61 62 61 73 65 20 69 73  TEMP database is
20ad0 20 6f 70 65 6e 20 61 6e 64 20 61 76 61 69 6c 61   open and availa
20ae0 62 6c 65 20 66 6f 72 20 75 73 65 2e 20 20 52 65  ble for use.  Re
20af0 74 75 72 6e 0a 2a 2a 20 74 68 65 20 6e 75 6d 62  turn.** the numb
20b00 65 72 20 6f 66 20 65 72 72 6f 72 73 2e 20 20 4c  er of errors.  L
20b10 65 61 76 65 20 61 6e 79 20 65 72 72 6f 72 20 6d  eave any error m
20b20 65 73 73 61 67 65 73 20 69 6e 20 74 68 65 20 70  essages in the p
20b30 50 61 72 73 65 20 73 74 72 75 63 74 75 72 65 2e  Parse structure.
20b40 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 4f  .*/.int sqlite3O
20b50 70 65 6e 54 65 6d 70 44 61 74 61 62 61 73 65 28  penTempDatabase(
20b60 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a  Parse *pParse){.
20b70 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
20b80 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66  pParse->db;.  if
20b90 28 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 42 74  ( db->aDb[1].pBt
20ba0 3d 3d 30 20 26 26 20 21 70 50 61 72 73 65 2d 3e  ==0 && !pParse->
20bb0 65 78 70 6c 61 69 6e 20 29 7b 0a 20 20 20 20 69  explain ){.    i
20bc0 6e 74 20 72 63 3b 0a 20 20 20 20 42 74 72 65 65  nt rc;.    Btree
20bd0 20 2a 70 42 74 3b 0a 20 20 20 20 73 74 61 74 69   *pBt;.    stati
20be0 63 20 63 6f 6e 73 74 20 69 6e 74 20 66 6c 61 67  c const int flag
20bf0 73 20 3d 20 0a 20 20 20 20 20 20 20 20 20 20 53  s = .          S
20c00 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57  QLITE_OPEN_READW
20c10 52 49 54 45 20 7c 0a 20 20 20 20 20 20 20 20 20  RITE |.         
20c20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45   SQLITE_OPEN_CRE
20c30 41 54 45 20 7c 0a 20 20 20 20 20 20 20 20 20 20  ATE |.          
20c40 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c  SQLITE_OPEN_EXCL
20c50 55 53 49 56 45 20 7c 0a 20 20 20 20 20 20 20 20  USIVE |.        
20c60 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45    SQLITE_OPEN_DE
20c70 4c 45 54 45 4f 4e 43 4c 4f 53 45 20 7c 0a 20 20  LETEONCLOSE |.  
20c80 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f          SQLITE_O
20c90 50 45 4e 5f 54 45 4d 50 5f 44 42 3b 0a 0a 20 20  PEN_TEMP_DB;..  
20ca0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
20cb0 72 65 65 4f 70 65 6e 28 64 62 2d 3e 70 56 66 73  reeOpen(db->pVfs
20cc0 2c 20 30 2c 20 64 62 2c 20 26 70 42 74 2c 20 30  , 0, db, &pBt, 0
20cd0 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 69 66  , flags);.    if
20ce0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
20cf0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
20d00 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
20d10 20 22 75 6e 61 62 6c 65 20 74 6f 20 6f 70 65 6e   "unable to open
20d20 20 61 20 74 65 6d 70 6f 72 61 72 79 20 64 61 74   a temporary dat
20d30 61 62 61 73 65 20 22 0a 20 20 20 20 20 20 20 20  abase ".        
20d40 22 66 69 6c 65 20 66 6f 72 20 73 74 6f 72 69 6e  "file for storin
20d50 67 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  g temporary tabl
20d60 65 73 22 29 3b 0a 20 20 20 20 20 20 70 50 61 72  es");.      pPar
20d70 73 65 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20 20  se->rc = rc;.   
20d80 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
20d90 20 7d 0a 20 20 20 20 64 62 2d 3e 61 44 62 5b 31   }.    db->aDb[1
20da0 5d 2e 70 42 74 20 3d 20 70 42 74 3b 0a 20 20 20  ].pBt = pBt;.   
20db0 20 61 73 73 65 72 74 28 20 64 62 2d 3e 61 44 62   assert( db->aDb
20dc0 5b 31 5d 2e 70 53 63 68 65 6d 61 20 29 3b 0a 20  [1].pSchema );. 
20dd0 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4e 4f     if( SQLITE_NO
20de0 4d 45 4d 3d 3d 73 71 6c 69 74 65 33 42 74 72 65  MEM==sqlite3Btre
20df0 65 53 65 74 50 61 67 65 53 69 7a 65 28 70 42 74  eSetPageSize(pBt
20e00 2c 20 64 62 2d 3e 6e 65 78 74 50 61 67 65 73 69  , db->nextPagesi
20e10 7a 65 2c 20 2d 31 2c 20 30 29 20 29 7b 0a 20 20  ze, -1, 0) ){.  
20e20 20 20 20 20 73 71 6c 69 74 65 33 4f 6f 6d 46 61      sqlite3OomFa
20e30 75 6c 74 28 64 62 29 3b 0a 20 20 20 20 20 20 72  ult(db);.      r
20e40 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20  eturn 1;.    }. 
20e50 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
20e60 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6f 72 64 20 74  ../*.** Record t
20e70 68 65 20 66 61 63 74 20 74 68 61 74 20 74 68 65  he fact that the
20e80 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 20 77   schema cookie w
20e90 69 6c 6c 20 6e 65 65 64 20 74 6f 20 62 65 20 76  ill need to be v
20ea0 65 72 69 66 69 65 64 0a 2a 2a 20 66 6f 72 20 64  erified.** for d
20eb0 61 74 61 62 61 73 65 20 69 44 62 2e 20 20 54 68  atabase iDb.  Th
20ec0 65 20 63 6f 64 65 20 74 6f 20 61 63 74 75 61 6c  e code to actual
20ed0 6c 79 20 76 65 72 69 66 79 20 74 68 65 20 73 63  ly verify the sc
20ee0 68 65 6d 61 20 63 6f 6f 6b 69 65 0a 2a 2a 20 77  hema cookie.** w
20ef0 69 6c 6c 20 6f 63 63 75 72 20 61 74 20 74 68 65  ill occur at the
20f00 20 65 6e 64 20 6f 66 20 74 68 65 20 74 6f 70 2d   end of the top-
20f10 6c 65 76 65 6c 20 56 44 42 45 20 61 6e 64 20 77  level VDBE and w
20f20 69 6c 6c 20 62 65 20 67 65 6e 65 72 61 74 65 64  ill be generated
20f30 0a 2a 2a 20 6c 61 74 65 72 2c 20 62 79 20 73 71  .** later, by sq
20f40 6c 69 74 65 33 46 69 6e 69 73 68 43 6f 64 69 6e  lite3FinishCodin
20f50 67 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  g()..*/.void sql
20f60 69 74 65 33 43 6f 64 65 56 65 72 69 66 79 53 63  ite3CodeVerifySc
20f70 68 65 6d 61 28 50 61 72 73 65 20 2a 70 50 61 72  hema(Parse *pPar
20f80 73 65 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20 20  se, int iDb){.  
20f90 50 61 72 73 65 20 2a 70 54 6f 70 6c 65 76 65 6c  Parse *pToplevel
20fa0 20 3d 20 73 71 6c 69 74 65 33 50 61 72 73 65 54   = sqlite3ParseT
20fb0 6f 70 6c 65 76 65 6c 28 70 50 61 72 73 65 29 3b  oplevel(pParse);
20fc0 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
20fd0 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 64 62 3b 0a   pToplevel->db;.
20fe0 0a 20 20 61 73 73 65 72 74 28 20 69 44 62 3e 3d  .  assert( iDb>=
20ff0 30 20 26 26 20 69 44 62 3c 64 62 2d 3e 6e 44 62  0 && iDb<db->nDb
21000 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62   );.  assert( db
21010 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 42 74 21 3d  ->aDb[iDb].pBt!=
21020 30 20 7c 7c 20 69 44 62 3d 3d 31 20 29 3b 0a 20  0 || iDb==1 );. 
21030 20 61 73 73 65 72 74 28 20 69 44 62 3c 53 51 4c   assert( iDb<SQL
21040 49 54 45 5f 4d 41 58 5f 41 54 54 41 43 48 45 44  ITE_MAX_ATTACHED
21050 2b 32 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  +2 );.  assert( 
21060 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74  sqlite3SchemaMut
21070 65 78 48 65 6c 64 28 64 62 2c 20 69 44 62 2c 20  exHeld(db, iDb, 
21080 30 29 20 29 3b 0a 20 20 69 66 28 20 44 62 4d 61  0) );.  if( DbMa
21090 73 6b 54 65 73 74 28 70 54 6f 70 6c 65 76 65 6c  skTest(pToplevel
210a0 2d 3e 63 6f 6f 6b 69 65 4d 61 73 6b 2c 20 69 44  ->cookieMask, iD
210b0 62 29 3d 3d 30 20 29 7b 0a 20 20 20 20 44 62 4d  b)==0 ){.    DbM
210c0 61 73 6b 53 65 74 28 70 54 6f 70 6c 65 76 65 6c  askSet(pToplevel
210d0 2d 3e 63 6f 6f 6b 69 65 4d 61 73 6b 2c 20 69 44  ->cookieMask, iD
210e0 62 29 3b 0a 20 20 20 20 70 54 6f 70 6c 65 76 65  b);.    pTopleve
210f0 6c 2d 3e 63 6f 6f 6b 69 65 56 61 6c 75 65 5b 69  l->cookieValue[i
21100 44 62 5d 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44  Db] = db->aDb[iD
21110 62 5d 2e 70 53 63 68 65 6d 61 2d 3e 73 63 68 65  b].pSchema->sche
21120 6d 61 5f 63 6f 6f 6b 69 65 3b 0a 20 20 20 20 69  ma_cookie;.    i
21130 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20  f( !OMIT_TEMPDB 
21140 26 26 20 69 44 62 3d 3d 31 20 29 7b 0a 20 20 20  && iDb==1 ){.   
21150 20 20 20 73 71 6c 69 74 65 33 4f 70 65 6e 54 65     sqlite3OpenTe
21160 6d 70 44 61 74 61 62 61 73 65 28 70 54 6f 70 6c  mpDatabase(pTopl
21170 65 76 65 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  evel);.    }.  }
21180 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 61 72 67  .}../*.** If arg
21190 75 6d 65 6e 74 20 7a 44 62 20 69 73 20 4e 55 4c  ument zDb is NUL
211a0 4c 2c 20 74 68 65 6e 20 63 61 6c 6c 20 73 71 6c  L, then call sql
211b0 69 74 65 33 43 6f 64 65 56 65 72 69 66 79 53 63  ite3CodeVerifySc
211c0 68 65 6d 61 28 29 20 66 6f 72 20 65 61 63 68 20  hema() for each 
211d0 0a 2a 2a 20 61 74 74 61 63 68 65 64 20 64 61 74  .** attached dat
211e0 61 62 61 73 65 2e 20 4f 74 68 65 72 77 69 73 65  abase. Otherwise
211f0 2c 20 69 6e 76 6f 6b 65 20 69 74 20 66 6f 72 20  , invoke it for 
21200 74 68 65 20 64 61 74 61 62 61 73 65 20 6e 61 6d  the database nam
21210 65 64 20 7a 44 62 20 6f 6e 6c 79 2e 0a 2a 2f 0a  ed zDb only..*/.
21220 76 6f 69 64 20 73 71 6c 69 74 65 33 43 6f 64 65  void sqlite3Code
21230 56 65 72 69 66 79 4e 61 6d 65 64 53 63 68 65 6d  VerifyNamedSchem
21240 61 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  a(Parse *pParse,
21250 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62   const char *zDb
21260 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
21270 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
21280 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d   int i;.  for(i=
21290 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b  0; i<db->nDb; i+
212a0 2b 29 7b 0a 20 20 20 20 44 62 20 2a 70 44 62 20  +){.    Db *pDb 
212b0 3d 20 26 64 62 2d 3e 61 44 62 5b 69 5d 3b 0a 20  = &db->aDb[i];. 
212c0 20 20 20 69 66 28 20 70 44 62 2d 3e 70 42 74 20     if( pDb->pBt 
212d0 26 26 20 28 21 7a 44 62 20 7c 7c 20 30 3d 3d 73  && (!zDb || 0==s
212e0 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 44  qlite3StrICmp(zD
212f0 62 2c 20 70 44 62 2d 3e 7a 44 62 53 4e 61 6d 65  b, pDb->zDbSName
21300 29 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  )) ){.      sqli
21310 74 65 33 43 6f 64 65 56 65 72 69 66 79 53 63 68  te3CodeVerifySch
21320 65 6d 61 28 70 50 61 72 73 65 2c 20 69 29 3b 0a  ema(pParse, i);.
21330 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
21340 2a 2a 20 47 65 6e 65 72 61 74 65 20 56 44 42 45  ** Generate VDBE
21350 20 63 6f 64 65 20 74 68 61 74 20 70 72 65 70 61   code that prepa
21360 72 65 73 20 66 6f 72 20 64 6f 69 6e 67 20 61 6e  res for doing an
21370 20 6f 70 65 72 61 74 69 6f 6e 20 74 68 61 74 0a   operation that.
21380 2a 2a 20 6d 69 67 68 74 20 63 68 61 6e 67 65 20  ** might change 
21390 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a  the database..**
213a0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
213b0 20 73 74 61 72 74 73 20 61 20 6e 65 77 20 74 72   starts a new tr
213c0 61 6e 73 61 63 74 69 6f 6e 20 69 66 20 77 65 20  ansaction if we 
213d0 61 72 65 20 6e 6f 74 20 61 6c 72 65 61 64 79 20  are not already 
213e0 77 69 74 68 69 6e 0a 2a 2a 20 61 20 74 72 61 6e  within.** a tran
213f0 73 61 63 74 69 6f 6e 2e 20 20 49 66 20 77 65 20  saction.  If we 
21400 61 72 65 20 61 6c 72 65 61 64 79 20 77 69 74 68  are already with
21410 69 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  in a transaction
21420 2c 20 74 68 65 6e 20 61 20 63 68 65 63 6b 70 6f  , then a checkpo
21430 69 6e 74 0a 2a 2a 20 69 73 20 73 65 74 20 69 66  int.** is set if
21440 20 74 68 65 20 73 65 74 53 74 61 74 65 6d 65 6e   the setStatemen
21450 74 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 74  t parameter is t
21460 72 75 65 2e 20 20 41 20 63 68 65 63 6b 70 6f 69  rue.  A checkpoi
21470 6e 74 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20  nt should.** be 
21480 73 65 74 20 66 6f 72 20 6f 70 65 72 61 74 69 6f  set for operatio
21490 6e 73 20 74 68 61 74 20 6d 69 67 68 74 20 66 61  ns that might fa
214a0 69 6c 20 28 64 75 65 20 74 6f 20 61 20 63 6f 6e  il (due to a con
214b0 73 74 72 61 69 6e 74 29 20 70 61 72 74 20 6f 66  straint) part of
214c0 0a 2a 2a 20 74 68 65 20 77 61 79 20 74 68 72 6f  .** the way thro
214d0 75 67 68 20 61 6e 64 20 77 68 69 63 68 20 77 69  ugh and which wi
214e0 6c 6c 20 6e 65 65 64 20 74 6f 20 75 6e 64 6f 20  ll need to undo 
214f0 73 6f 6d 65 20 77 72 69 74 65 73 20 77 69 74 68  some writes with
21500 6f 75 74 20 68 61 76 69 6e 67 20 74 6f 0a 2a 2a  out having to.**
21510 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20 77 68   rollback the wh
21520 6f 6c 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ole transaction.
21530 20 20 46 6f 72 20 6f 70 65 72 61 74 69 6f 6e 73    For operations
21540 20 77 68 65 72 65 20 61 6c 6c 20 63 6f 6e 73 74   where all const
21550 72 61 69 6e 74 73 0a 2a 2a 20 63 61 6e 20 62 65  raints.** can be
21560 20 63 68 65 63 6b 65 64 20 62 65 66 6f 72 65 20   checked before 
21570 61 6e 79 20 63 68 61 6e 67 65 73 20 61 72 65 20  any changes are 
21580 6d 61 64 65 20 74 6f 20 74 68 65 20 64 61 74 61  made to the data
21590 62 61 73 65 2c 20 69 74 20 69 73 20 6e 65 76 65  base, it is neve
215a0 72 0a 2a 2a 20 6e 65 63 65 73 73 61 72 79 20 74  r.** necessary t
215b0 6f 20 75 6e 64 6f 20 61 20 77 72 69 74 65 20 61  o undo a write a
215c0 6e 64 20 74 68 65 20 63 68 65 63 6b 70 6f 69 6e  nd the checkpoin
215d0 74 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20  t should not be 
215e0 73 65 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  set..*/.void sql
215f0 69 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70  ite3BeginWriteOp
21600 65 72 61 74 69 6f 6e 28 50 61 72 73 65 20 2a 70  eration(Parse *p
21610 50 61 72 73 65 2c 20 69 6e 74 20 73 65 74 53 74  Parse, int setSt
21620 61 74 65 6d 65 6e 74 2c 20 69 6e 74 20 69 44 62  atement, int iDb
21630 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 54 6f 70  ){.  Parse *pTop
21640 6c 65 76 65 6c 20 3d 20 73 71 6c 69 74 65 33 50  level = sqlite3P
21650 61 72 73 65 54 6f 70 6c 65 76 65 6c 28 70 50 61  arseToplevel(pPa
21660 72 73 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 43  rse);.  sqlite3C
21670 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d 61 28  odeVerifySchema(
21680 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20  pParse, iDb);.  
21690 44 62 4d 61 73 6b 53 65 74 28 70 54 6f 70 6c 65  DbMaskSet(pTople
216a0 76 65 6c 2d 3e 77 72 69 74 65 4d 61 73 6b 2c 20  vel->writeMask, 
216b0 69 44 62 29 3b 0a 20 20 70 54 6f 70 6c 65 76 65  iDb);.  pTopleve
216c0 6c 2d 3e 69 73 4d 75 6c 74 69 57 72 69 74 65 20  l->isMultiWrite 
216d0 7c 3d 20 73 65 74 53 74 61 74 65 6d 65 6e 74 3b  |= setStatement;
216e0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 64 69 63 61  .}../*.** Indica
216f0 74 65 20 74 68 61 74 20 74 68 65 20 73 74 61 74  te that the stat
21700 65 6d 65 6e 74 20 63 75 72 72 65 6e 74 6c 79 20  ement currently 
21710 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69  under constructi
21720 6f 6e 20 6d 69 67 68 74 20 77 72 69 74 65 0a 2a  on might write.*
21730 2a 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20  * more than one 
21740 65 6e 74 72 79 20 28 65 78 61 6d 70 6c 65 3a 20  entry (example: 
21750 64 65 6c 65 74 69 6e 67 20 6f 6e 65 20 72 6f 77  deleting one row
21760 20 74 68 65 6e 20 69 6e 73 65 72 74 69 6e 67 20   then inserting 
21770 61 6e 6f 74 68 65 72 2c 0a 2a 2a 20 69 6e 73 65  another,.** inse
21780 72 74 69 6e 67 20 6d 75 6c 74 69 70 6c 65 20 72  rting multiple r
21790 6f 77 73 20 69 6e 20 61 20 74 61 62 6c 65 2c 20  ows in a table, 
217a0 6f 72 20 69 6e 73 65 72 74 69 6e 67 20 61 20 72  or inserting a r
217b0 6f 77 20 61 6e 64 20 69 6e 64 65 78 20 65 6e 74  ow and index ent
217c0 72 69 65 73 2e 29 0a 2a 2a 20 49 66 20 61 6e 20  ries.).** If an 
217d0 61 62 6f 72 74 20 6f 63 63 75 72 73 20 61 66 74  abort occurs aft
217e0 65 72 20 73 6f 6d 65 20 6f 66 20 74 68 65 73 65  er some of these
217f0 20 77 72 69 74 65 73 20 68 61 76 65 20 63 6f 6d   writes have com
21800 70 6c 65 74 65 64 2c 20 74 68 65 6e 20 69 74 20  pleted, then it 
21810 77 69 6c 6c 0a 2a 2a 20 62 65 20 6e 65 63 65 73  will.** be neces
21820 73 61 72 79 20 74 6f 20 75 6e 64 6f 20 74 68 65  sary to undo the
21830 20 63 6f 6d 70 6c 65 74 65 64 20 77 72 69 74 65   completed write
21840 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  s..*/.void sqlit
21850 65 33 4d 75 6c 74 69 57 72 69 74 65 28 50 61 72  e3MultiWrite(Par
21860 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 50  se *pParse){.  P
21870 61 72 73 65 20 2a 70 54 6f 70 6c 65 76 65 6c 20  arse *pToplevel 
21880 3d 20 73 71 6c 69 74 65 33 50 61 72 73 65 54 6f  = sqlite3ParseTo
21890 70 6c 65 76 65 6c 28 70 50 61 72 73 65 29 3b 0a  plevel(pParse);.
218a0 20 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 69 73 4d    pToplevel->isM
218b0 75 6c 74 69 57 72 69 74 65 20 3d 20 31 3b 0a 7d  ultiWrite = 1;.}
218c0 0a 0a 2f 2a 20 0a 2a 2a 20 54 68 65 20 63 6f 64  ../* .** The cod
218d0 65 20 67 65 6e 65 72 61 74 6f 72 20 63 61 6c 6c  e generator call
218e0 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  s this routine i
218f0 66 20 69 73 20 64 69 73 63 6f 76 65 72 73 20 74  f is discovers t
21900 68 61 74 20 69 74 20 69 73 0a 2a 2a 20 70 6f 73  hat it is.** pos
21910 73 69 62 6c 65 20 74 6f 20 61 62 6f 72 74 20 61  sible to abort a
21920 20 73 74 61 74 65 6d 65 6e 74 20 70 72 69 6f 72   statement prior
21930 20 74 6f 20 63 6f 6d 70 6c 65 74 69 6f 6e 2e 20   to completion. 
21940 20 49 6e 20 6f 72 64 65 72 20 74 6f 20 0a 2a 2a   In order to .**
21950 20 70 65 72 66 6f 72 6d 20 74 68 69 73 20 61 62   perform this ab
21960 6f 72 74 20 77 69 74 68 6f 75 74 20 63 6f 72 72  ort without corr
21970 75 70 74 69 6e 67 20 74 68 65 20 64 61 74 61 62  upting the datab
21980 61 73 65 2c 20 77 65 20 6e 65 65 64 20 74 6f 20  ase, we need to 
21990 6d 61 6b 65 0a 2a 2a 20 73 75 72 65 20 74 68 61  make.** sure tha
219a0 74 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  t the statement 
219b0 69 73 20 70 72 6f 74 65 63 74 65 64 20 62 79 20  is protected by 
219c0 61 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e  a statement tran
219d0 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54  saction..**.** T
219e0 65 63 68 6e 69 63 61 6c 6c 79 2c 20 77 65 20 6f  echnically, we o
219f0 6e 6c 79 20 6e 65 65 64 20 74 6f 20 73 65 74 20  nly need to set 
21a00 74 68 65 20 6d 61 79 41 62 6f 72 74 20 66 6c 61  the mayAbort fla
21a10 67 20 69 66 20 74 68 65 0a 2a 2a 20 69 73 4d 75  g if the.** isMu
21a20 6c 74 69 57 72 69 74 65 20 66 6c 61 67 20 77 61  ltiWrite flag wa
21a30 73 20 70 72 65 76 69 6f 75 73 6c 79 20 73 65 74  s previously set
21a40 2e 20 20 54 68 65 72 65 20 69 73 20 61 20 74 69  .  There is a ti
21a50 6d 65 20 64 65 70 65 6e 64 65 6e 63 79 0a 2a 2a  me dependency.**
21a60 20 73 75 63 68 20 74 68 61 74 20 74 68 65 20 61   such that the a
21a70 62 6f 72 74 20 6d 75 73 74 20 6f 63 63 75 72 20  bort must occur 
21a80 61 66 74 65 72 20 74 68 65 20 6d 75 6c 74 69 77  after the multiw
21a90 72 69 74 65 2e 20 20 54 68 69 73 20 6d 61 6b 65  rite.  This make
21aa0 73 0a 2a 2a 20 73 6f 6d 65 20 73 74 61 74 65 6d  s.** some statem
21ab0 65 6e 74 73 20 69 6e 76 6f 6c 76 69 6e 67 20 74  ents involving t
21ac0 68 65 20 52 45 50 4c 41 43 45 20 63 6f 6e 66 6c  he REPLACE confl
21ad0 69 63 74 20 72 65 73 6f 6c 75 74 69 6f 6e 20 61  ict resolution a
21ae0 6c 67 6f 72 69 74 68 6d 0a 2a 2a 20 67 6f 20 61  lgorithm.** go a
21af0 20 6c 69 74 74 6c 65 20 66 61 73 74 65 72 2e 20   little faster. 
21b00 20 42 75 74 20 74 61 6b 69 6e 67 20 61 64 76 61   But taking adva
21b10 6e 74 61 67 65 20 6f 66 20 74 68 69 73 20 74 69  ntage of this ti
21b20 6d 65 20 64 65 70 65 6e 64 65 6e 63 79 0a 2a 2a  me dependency.**
21b30 20 6d 61 6b 65 73 20 69 74 20 6d 6f 72 65 20 64   makes it more d
21b40 69 66 66 69 63 75 6c 74 20 74 6f 20 70 72 6f 76  ifficult to prov
21b50 65 20 74 68 61 74 20 74 68 65 20 63 6f 64 65 20  e that the code 
21b60 69 73 20 63 6f 72 72 65 63 74 20 28 69 6e 20 0a  is correct (in .
21b70 2a 2a 20 70 61 72 74 69 63 75 6c 61 72 2c 20 69  ** particular, i
21b80 74 20 70 72 65 76 65 6e 74 73 20 75 73 20 66 72  t prevents us fr
21b90 6f 6d 20 77 72 69 74 69 6e 67 20 61 6e 20 65 66  om writing an ef
21ba0 66 65 63 74 69 76 65 0a 2a 2a 20 69 6d 70 6c 65  fective.** imple
21bb0 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 73 71 6c  mentation of sql
21bc0 69 74 65 33 41 73 73 65 72 74 4d 61 79 41 62 6f  ite3AssertMayAbo
21bd0 72 74 28 29 29 20 61 6e 64 20 73 6f 20 77 65 20  rt()) and so we 
21be0 68 61 76 65 20 63 68 6f 73 65 6e 0a 2a 2a 20 74  have chosen.** t
21bf0 6f 20 74 61 6b 65 20 74 68 65 20 73 61 66 65 20  o take the safe 
21c00 72 6f 75 74 65 20 61 6e 64 20 73 6b 69 70 20 74  route and skip t
21c10 68 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e  he optimization.
21c20 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
21c30 4d 61 79 41 62 6f 72 74 28 50 61 72 73 65 20 2a  MayAbort(Parse *
21c40 70 50 61 72 73 65 29 7b 0a 20 20 50 61 72 73 65  pParse){.  Parse
21c50 20 2a 70 54 6f 70 6c 65 76 65 6c 20 3d 20 73 71   *pToplevel = sq
21c60 6c 69 74 65 33 50 61 72 73 65 54 6f 70 6c 65 76  lite3ParseToplev
21c70 65 6c 28 70 50 61 72 73 65 29 3b 0a 20 20 70 54  el(pParse);.  pT
21c80 6f 70 6c 65 76 65 6c 2d 3e 6d 61 79 41 62 6f 72  oplevel->mayAbor
21c90 74 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  t = 1;.}../*.** 
21ca0 43 6f 64 65 20 61 6e 20 4f 50 5f 48 61 6c 74 20  Code an OP_Halt 
21cb0 74 68 61 74 20 63 61 75 73 65 73 20 74 68 65 20  that causes the 
21cc0 76 64 62 65 20 74 6f 20 72 65 74 75 72 6e 20 61  vdbe to return a
21cd0 6e 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41  n SQLITE_CONSTRA
21ce0 49 4e 54 0a 2a 2a 20 65 72 72 6f 72 2e 20 54 68  INT.** error. Th
21cf0 65 20 6f 6e 45 72 72 6f 72 20 70 61 72 61 6d 65  e onError parame
21d00 74 65 72 20 64 65 74 65 72 6d 69 6e 65 73 20 77  ter determines w
21d10 68 69 63 68 20 28 69 66 20 61 6e 79 29 20 6f 66  hich (if any) of
21d20 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 0a 2a   the statement.*
21d30 2a 20 61 6e 64 2f 6f 72 20 63 75 72 72 65 6e 74  * and/or current
21d40 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
21d50 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2f 0a  rolled back..*/.
21d60 76 6f 69 64 20 73 71 6c 69 74 65 33 48 61 6c 74  void sqlite3Halt
21d70 43 6f 6e 73 74 72 61 69 6e 74 28 0a 20 20 50 61  Constraint(.  Pa
21d80 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
21d90 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
21da0 78 74 20 2a 2f 0a 20 20 69 6e 74 20 65 72 72 43  xt */.  int errC
21db0 6f 64 65 2c 20 20 20 20 20 20 2f 2a 20 65 78 74  ode,      /* ext
21dc0 65 6e 64 65 64 20 65 72 72 6f 72 20 63 6f 64 65  ended error code
21dd0 20 2a 2f 0a 20 20 69 6e 74 20 6f 6e 45 72 72 6f   */.  int onErro
21de0 72 2c 20 20 20 20 20 20 2f 2a 20 43 6f 6e 73 74  r,      /* Const
21df0 72 61 69 6e 74 20 74 79 70 65 20 2a 2f 0a 20 20  raint type */.  
21e00 63 68 61 72 20 2a 70 34 2c 20 20 20 20 20 20 20  char *p4,       
21e10 20 20 2f 2a 20 45 72 72 6f 72 20 6d 65 73 73 61    /* Error messa
21e20 67 65 20 2a 2f 0a 20 20 69 38 20 70 34 74 79 70  ge */.  i8 p4typ
21e30 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 34 5f  e,        /* P4_
21e40 53 54 41 54 49 43 20 6f 72 20 50 34 5f 54 52 41  STATIC or P4_TRA
21e50 4e 53 49 45 4e 54 20 2a 2f 0a 20 20 75 38 20 70  NSIENT */.  u8 p
21e60 35 45 72 72 6d 73 67 20 20 20 20 20 20 20 2f 2a  5Errmsg       /*
21e70 20 50 35 5f 45 72 72 4d 73 67 20 74 79 70 65 20   P5_ErrMsg type 
21e80 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  */.){.  Vdbe *v 
21e90 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
21ea0 28 70 50 61 72 73 65 29 3b 0a 20 20 61 73 73 65  (pParse);.  asse
21eb0 72 74 28 20 28 65 72 72 43 6f 64 65 26 30 78 66  rt( (errCode&0xf
21ec0 66 29 3d 3d 53 51 4c 49 54 45 5f 43 4f 4e 53 54  f)==SQLITE_CONST
21ed0 52 41 49 4e 54 20 29 3b 0a 20 20 69 66 28 20 6f  RAINT );.  if( o
21ee0 6e 45 72 72 6f 72 3d 3d 4f 45 5f 41 62 6f 72 74  nError==OE_Abort
21ef0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4d   ){.    sqlite3M
21f00 61 79 41 62 6f 72 74 28 70 50 61 72 73 65 29 3b  ayAbort(pParse);
21f10 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64  .  }.  sqlite3Vd
21f20 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 48  beAddOp4(v, OP_H
21f30 61 6c 74 2c 20 65 72 72 43 6f 64 65 2c 20 6f 6e  alt, errCode, on
21f40 45 72 72 6f 72 2c 20 30 2c 20 70 34 2c 20 70 34  Error, 0, p4, p4
21f50 74 79 70 65 29 3b 0a 20 20 73 71 6c 69 74 65 33  type);.  sqlite3
21f60 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
21f70 70 35 45 72 72 6d 73 67 29 3b 0a 7d 0a 0a 2f 2a  p5Errmsg);.}../*
21f80 0a 2a 2a 20 43 6f 64 65 20 61 6e 20 4f 50 5f 48  .** Code an OP_H
21f90 61 6c 74 20 64 75 65 20 74 6f 20 55 4e 49 51 55  alt due to UNIQU
21fa0 45 20 6f 72 20 50 52 49 4d 41 52 59 20 4b 45 59  E or PRIMARY KEY
21fb0 20 63 6f 6e 73 74 72 61 69 6e 74 20 76 69 6f 6c   constraint viol
21fc0 61 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ation..*/.void s
21fd0 71 6c 69 74 65 33 55 6e 69 71 75 65 43 6f 6e 73  qlite3UniqueCons
21fe0 74 72 61 69 6e 74 28 0a 20 20 50 61 72 73 65 20  traint(.  Parse 
21ff0 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a 20 50  *pParse,    /* P
22000 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
22010 2f 0a 20 20 69 6e 74 20 6f 6e 45 72 72 6f 72 2c  /.  int onError,
22020 20 20 20 20 20 20 2f 2a 20 43 6f 6e 73 74 72 61        /* Constra
22030 69 6e 74 20 74 79 70 65 20 2a 2f 0a 20 20 49 6e  int type */.  In
22040 64 65 78 20 2a 70 49 64 78 20 20 20 20 20 20 20  dex *pIdx       
22050 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 74 68 61  /* The index tha
22060 74 20 74 72 69 67 67 65 72 73 20 74 68 65 20 63  t triggers the c
22070 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 29 7b 0a  onstraint */.){.
22080 20 20 63 68 61 72 20 2a 7a 45 72 72 3b 0a 20 20    char *zErr;.  
22090 69 6e 74 20 6a 3b 0a 20 20 53 74 72 41 63 63 75  int j;.  StrAccu
220a0 6d 20 65 72 72 4d 73 67 3b 0a 20 20 54 61 62 6c  m errMsg;.  Tabl
220b0 65 20 2a 70 54 61 62 20 3d 20 70 49 64 78 2d 3e  e *pTab = pIdx->
220c0 70 54 61 62 6c 65 3b 0a 0a 20 20 73 71 6c 69 74  pTable;..  sqlit
220d0 65 33 53 74 72 41 63 63 75 6d 49 6e 69 74 28 26  e3StrAccumInit(&
220e0 65 72 72 4d 73 67 2c 20 70 50 61 72 73 65 2d 3e  errMsg, pParse->
220f0 64 62 2c 20 30 2c 20 30 2c 20 32 30 30 29 3b 0a  db, 0, 0, 200);.
22100 20 20 69 66 28 20 70 49 64 78 2d 3e 61 43 6f 6c    if( pIdx->aCol
22110 45 78 70 72 20 29 7b 0a 20 20 20 20 73 71 6c 69  Expr ){.    sqli
22120 74 65 33 58 50 72 69 6e 74 66 28 26 65 72 72 4d  te3XPrintf(&errM
22130 73 67 2c 20 22 69 6e 64 65 78 20 27 25 71 27 22  sg, "index '%q'"
22140 2c 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 29 3b 0a  , pIdx->zName);.
22150 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 6f 72    }else{.    for
22160 28 6a 3d 30 3b 20 6a 3c 70 49 64 78 2d 3e 6e 4b  (j=0; j<pIdx->nK
22170 65 79 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20  eyCol; j++){.   
22180 20 20 20 63 68 61 72 20 2a 7a 43 6f 6c 3b 0a 20     char *zCol;. 
22190 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49 64       assert( pId
221a0 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 3e 3d  x->aiColumn[j]>=
221b0 30 20 29 3b 0a 20 20 20 20 20 20 7a 43 6f 6c 20  0 );.      zCol 
221c0 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 49 64  = pTab->aCol[pId
221d0 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 5d 2e  x->aiColumn[j]].
221e0 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 69 66 28  zName;.      if(
221f0 20 6a 20 29 20 73 71 6c 69 74 65 33 53 74 72 41   j ) sqlite3StrA
22200 63 63 75 6d 41 70 70 65 6e 64 28 26 65 72 72 4d  ccumAppend(&errM
22210 73 67 2c 20 22 2c 20 22 2c 20 32 29 3b 0a 20 20  sg, ", ", 2);.  
22220 20 20 20 20 73 71 6c 69 74 65 33 58 50 72 69 6e      sqlite3XPrin
22230 74 66 28 26 65 72 72 4d 73 67 2c 20 22 25 73 2e  tf(&errMsg, "%s.
22240 25 73 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  %s", pTab->zName
22250 2c 20 7a 43 6f 6c 29 3b 0a 20 20 20 20 7d 0a 20  , zCol);.    }. 
22260 20 7d 0a 20 20 7a 45 72 72 20 3d 20 73 71 6c 69   }.  zErr = sqli
22270 74 65 33 53 74 72 41 63 63 75 6d 46 69 6e 69 73  te3StrAccumFinis
22280 68 28 26 65 72 72 4d 73 67 29 3b 0a 20 20 73 71  h(&errMsg);.  sq
22290 6c 69 74 65 33 48 61 6c 74 43 6f 6e 73 74 72 61  lite3HaltConstra
222a0 69 6e 74 28 70 50 61 72 73 65 2c 20 0a 20 20 20  int(pParse, .   
222b0 20 49 73 50 72 69 6d 61 72 79 4b 65 79 49 6e 64   IsPrimaryKeyInd
222c0 65 78 28 70 49 64 78 29 20 3f 20 53 51 4c 49 54  ex(pIdx) ? SQLIT
222d0 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 50 52 49  E_CONSTRAINT_PRI
222e0 4d 41 52 59 4b 45 59 20 0a 20 20 20 20 20 20 20  MARYKEY .       
222f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22300 20 20 20 20 20 3a 20 53 51 4c 49 54 45 5f 43 4f       : SQLITE_CO
22310 4e 53 54 52 41 49 4e 54 5f 55 4e 49 51 55 45 2c  NSTRAINT_UNIQUE,
22320 0a 20 20 20 20 6f 6e 45 72 72 6f 72 2c 20 7a 45  .    onError, zE
22330 72 72 2c 20 50 34 5f 44 59 4e 41 4d 49 43 2c 20  rr, P4_DYNAMIC, 
22340 50 35 5f 43 6f 6e 73 74 72 61 69 6e 74 55 6e 69  P5_ConstraintUni
22350 71 75 65 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  que);.}.../*.** 
22360 43 6f 64 65 20 61 6e 20 4f 50 5f 48 61 6c 74 20  Code an OP_Halt 
22370 64 75 65 20 74 6f 20 6e 6f 6e 2d 75 6e 69 71 75  due to non-uniqu
22380 65 20 72 6f 77 69 64 2e 0a 2a 2f 0a 76 6f 69 64  e rowid..*/.void
22390 20 73 71 6c 69 74 65 33 52 6f 77 69 64 43 6f 6e   sqlite3RowidCon
223a0 73 74 72 61 69 6e 74 28 0a 20 20 50 61 72 73 65  straint(.  Parse
223b0 20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a 20   *pParse,    /* 
223c0 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
223d0 2a 2f 0a 20 20 69 6e 74 20 6f 6e 45 72 72 6f 72  */.  int onError
223e0 2c 20 20 20 20 20 20 2f 2a 20 43 6f 6e 66 6c 69  ,      /* Confli
223f0 63 74 20 72 65 73 6f 6c 75 74 69 6f 6e 20 61 6c  ct resolution al
22400 67 6f 72 69 74 68 6d 20 2a 2f 0a 20 20 54 61 62  gorithm */.  Tab
22410 6c 65 20 2a 70 54 61 62 20 20 20 20 20 20 20 2f  le *pTab       /
22420 2a 20 54 68 65 20 74 61 62 6c 65 20 77 69 74 68  * The table with
22430 20 74 68 65 20 6e 6f 6e 2d 75 6e 69 71 75 65 20   the non-unique 
22440 72 6f 77 69 64 20 2a 2f 20 0a 29 7b 0a 20 20 63  rowid */ .){.  c
22450 68 61 72 20 2a 7a 4d 73 67 3b 0a 20 20 69 6e 74  har *zMsg;.  int
22460 20 72 63 3b 0a 20 20 69 66 28 20 70 54 61 62 2d   rc;.  if( pTab-
22470 3e 69 50 4b 65 79 3e 3d 30 20 29 7b 0a 20 20 20  >iPKey>=0 ){.   
22480 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d   zMsg = sqlite3M
22490 50 72 69 6e 74 66 28 70 50 61 72 73 65 2d 3e 64  Printf(pParse->d
224a0 62 2c 20 22 25 73 2e 25 73 22 2c 20 70 54 61 62  b, "%s.%s", pTab
224b0 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20  ->zName,.       
224c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
224d0 20 20 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 54     pTab->aCol[pT
224e0 61 62 2d 3e 69 50 4b 65 79 5d 2e 7a 4e 61 6d 65  ab->iPKey].zName
224f0 29 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  );.    rc = SQLI
22500 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 50 52  TE_CONSTRAINT_PR
22510 49 4d 41 52 59 4b 45 59 3b 0a 20 20 7d 65 6c 73  IMARYKEY;.  }els
22520 65 7b 0a 20 20 20 20 7a 4d 73 67 20 3d 20 73 71  e{.    zMsg = sq
22530 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 70 50 61  lite3MPrintf(pPa
22540 72 73 65 2d 3e 64 62 2c 20 22 25 73 2e 72 6f 77  rse->db, "%s.row
22550 69 64 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  id", pTab->zName
22560 29 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  );.    rc = SQLI
22570 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 52 4f  TE_CONSTRAINT_RO
22580 57 49 44 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  WID;.  }.  sqlit
22590 65 33 48 61 6c 74 43 6f 6e 73 74 72 61 69 6e 74  e3HaltConstraint
225a0 28 70 50 61 72 73 65 2c 20 72 63 2c 20 6f 6e 45  (pParse, rc, onE
225b0 72 72 6f 72 2c 20 7a 4d 73 67 2c 20 50 34 5f 44  rror, zMsg, P4_D
225c0 59 4e 41 4d 49 43 2c 0a 20 20 20 20 20 20 20 20  YNAMIC,.        
225d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
225e0 50 35 5f 43 6f 6e 73 74 72 61 69 6e 74 55 6e 69  P5_ConstraintUni
225f0 71 75 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  que);.}../*.** C
22600 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 70  heck to see if p
22610 49 6e 64 65 78 20 75 73 65 73 20 74 68 65 20 63  Index uses the c
22620 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
22630 65 20 70 43 6f 6c 6c 2e 20 20 52 65 74 75 72 6e  e pColl.  Return
22640 0a 2a 2a 20 74 72 75 65 20 69 66 20 69 74 20 64  .** true if it d
22650 6f 65 73 20 61 6e 64 20 66 61 6c 73 65 20 69 66  oes and false if
22660 20 69 74 20 64 6f 65 73 20 6e 6f 74 2e 0a 2a 2f   it does not..*/
22670 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
22680 4f 4d 49 54 5f 52 45 49 4e 44 45 58 0a 73 74 61  OMIT_REINDEX.sta
22690 74 69 63 20 69 6e 74 20 63 6f 6c 6c 61 74 69 6f  tic int collatio
226a0 6e 4d 61 74 63 68 28 63 6f 6e 73 74 20 63 68 61  nMatch(const cha
226b0 72 20 2a 7a 43 6f 6c 6c 2c 20 49 6e 64 65 78 20  r *zColl, Index 
226c0 2a 70 49 6e 64 65 78 29 7b 0a 20 20 69 6e 74 20  *pIndex){.  int 
226d0 69 3b 0a 20 20 61 73 73 65 72 74 28 20 7a 43 6f  i;.  assert( zCo
226e0 6c 6c 21 3d 30 20 29 3b 0a 20 20 66 6f 72 28 69  ll!=0 );.  for(i
226f0 3d 30 3b 20 69 3c 70 49 6e 64 65 78 2d 3e 6e 43  =0; i<pIndex->nC
22700 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  olumn; i++){.   
22710 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d   const char *z =
22720 20 70 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c 5b   pIndex->azColl[
22730 69 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  i];.    assert( 
22740 7a 21 3d 30 20 7c 7c 20 70 49 6e 64 65 78 2d 3e  z!=0 || pIndex->
22750 61 69 43 6f 6c 75 6d 6e 5b 69 5d 3c 30 20 29 3b  aiColumn[i]<0 );
22760 0a 20 20 20 20 69 66 28 20 70 49 6e 64 65 78 2d  .    if( pIndex-
22770 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 3e 3d 30 20  >aiColumn[i]>=0 
22780 26 26 20 30 3d 3d 73 71 6c 69 74 65 33 53 74 72  && 0==sqlite3Str
22790 49 43 6d 70 28 7a 2c 20 7a 43 6f 6c 6c 29 20 29  ICmp(z, zColl) )
227a0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31  {.      return 1
227b0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
227c0 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66  turn 0;.}.#endif
227d0 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6f 6d 70 75 74  ../*.** Recomput
227e0 65 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 6f 66  e all indices of
227f0 20 70 54 61 62 20 74 68 61 74 20 75 73 65 20 74   pTab that use t
22800 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71  he collating seq
22810 75 65 6e 63 65 20 70 43 6f 6c 6c 2e 0a 2a 2a 20  uence pColl..** 
22820 49 66 20 70 43 6f 6c 6c 3d 3d 30 20 74 68 65 6e  If pColl==0 then
22830 20 72 65 63 6f 6d 70 75 74 65 20 61 6c 6c 20 69   recompute all i
22840 6e 64 69 63 65 73 20 6f 66 20 70 54 61 62 2e 0a  ndices of pTab..
22850 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
22860 45 5f 4f 4d 49 54 5f 52 45 49 4e 44 45 58 0a 73  E_OMIT_REINDEX.s
22870 74 61 74 69 63 20 76 6f 69 64 20 72 65 69 6e 64  tatic void reind
22880 65 78 54 61 62 6c 65 28 50 61 72 73 65 20 2a 70  exTable(Parse *p
22890 50 61 72 73 65 2c 20 54 61 62 6c 65 20 2a 70 54  Parse, Table *pT
228a0 61 62 2c 20 63 68 61 72 20 63 6f 6e 73 74 20 2a  ab, char const *
228b0 7a 43 6f 6c 6c 29 7b 0a 20 20 49 6e 64 65 78 20  zColl){.  Index 
228c0 2a 70 49 6e 64 65 78 3b 20 20 20 20 20 20 20 20  *pIndex;        
228d0 20 20 20 20 20 20 2f 2a 20 41 6e 20 69 6e 64 65        /* An inde
228e0 78 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  x associated wit
228f0 68 20 70 54 61 62 20 2a 2f 0a 0a 20 20 66 6f 72  h pTab */..  for
22900 28 70 49 6e 64 65 78 3d 70 54 61 62 2d 3e 70 49  (pIndex=pTab->pI
22910 6e 64 65 78 3b 20 70 49 6e 64 65 78 3b 20 70 49  ndex; pIndex; pI
22920 6e 64 65 78 3d 70 49 6e 64 65 78 2d 3e 70 4e 65  ndex=pIndex->pNe
22930 78 74 29 7b 0a 20 20 20 20 69 66 28 20 7a 43 6f  xt){.    if( zCo
22940 6c 6c 3d 3d 30 20 7c 7c 20 63 6f 6c 6c 61 74 69  ll==0 || collati
22950 6f 6e 4d 61 74 63 68 28 7a 43 6f 6c 6c 2c 20 70  onMatch(zColl, p
22960 49 6e 64 65 78 29 20 29 7b 0a 20 20 20 20 20 20  Index) ){.      
22970 69 6e 74 20 69 44 62 20 3d 20 73 71 6c 69 74 65  int iDb = sqlite
22980 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 70  3SchemaToIndex(p
22990 50 61 72 73 65 2d 3e 64 62 2c 20 70 54 61 62 2d  Parse->db, pTab-
229a0 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 20  >pSchema);.     
229b0 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69   sqlite3BeginWri
229c0 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72  teOperation(pPar
229d0 73 65 2c 20 30 2c 20 69 44 62 29 3b 0a 20 20 20  se, 0, iDb);.   
229e0 20 20 20 73 71 6c 69 74 65 33 52 65 66 69 6c 6c     sqlite3Refill
229f0 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70 49  Index(pParse, pI
22a00 6e 64 65 78 2c 20 2d 31 29 3b 0a 20 20 20 20 7d  ndex, -1);.    }
22a10 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  .  }.}.#endif../
22a20 2a 0a 2a 2a 20 52 65 63 6f 6d 70 75 74 65 20 61  *.** Recompute a
22a30 6c 6c 20 69 6e 64 69 63 65 73 20 6f 66 20 61 6c  ll indices of al
22a40 6c 20 74 61 62 6c 65 73 20 69 6e 20 61 6c 6c 20  l tables in all 
22a50 64 61 74 61 62 61 73 65 73 20 77 68 65 72 65 20  databases where 
22a60 74 68 65 0a 2a 2a 20 69 6e 64 69 63 65 73 20 75  the.** indices u
22a70 73 65 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67  se the collating
22a80 20 73 65 71 75 65 6e 63 65 20 70 43 6f 6c 6c 2e   sequence pColl.
22a90 20 20 49 66 20 70 43 6f 6c 6c 3d 3d 30 20 74 68    If pColl==0 th
22aa0 65 6e 20 72 65 63 6f 6d 70 75 74 65 0a 2a 2a 20  en recompute.** 
22ab0 61 6c 6c 20 69 6e 64 69 63 65 73 20 65 76 65 72  all indices ever
22ac0 79 77 68 65 72 65 2e 0a 2a 2f 0a 23 69 66 6e 64  ywhere..*/.#ifnd
22ad0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 52  ef SQLITE_OMIT_R
22ae0 45 49 4e 44 45 58 0a 73 74 61 74 69 63 20 76 6f  EINDEX.static vo
22af0 69 64 20 72 65 69 6e 64 65 78 44 61 74 61 62 61  id reindexDataba
22b00 73 65 73 28 50 61 72 73 65 20 2a 70 50 61 72 73  ses(Parse *pPars
22b10 65 2c 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a  e, char const *z
22b20 43 6f 6c 6c 29 7b 0a 20 20 44 62 20 2a 70 44 62  Coll){.  Db *pDb
22b30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
22b40 20 20 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65       /* A single
22b50 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 69   database */.  i
22b60 6e 74 20 69 44 62 3b 20 20 20 20 20 20 20 20 20  nt iDb;         
22b70 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
22b80 65 20 64 61 74 61 62 61 73 65 20 69 6e 64 65 78  e database index
22b90 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 73 71 6c   number */.  sql
22ba0 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
22bb0 65 2d 3e 64 62 3b 20 20 20 2f 2a 20 54 68 65 20  e->db;   /* The 
22bc0 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
22bd0 69 6f 6e 20 2a 2f 0a 20 20 48 61 73 68 45 6c 65  ion */.  HashEle
22be0 6d 20 2a 6b 3b 20 20 20 20 20 20 20 20 20 20 20  m *k;           
22bf0 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70       /* For loop
22c00 69 6e 67 20 6f 76 65 72 20 74 61 62 6c 65 73 20  ing over tables 
22c10 69 6e 20 70 44 62 20 2a 2f 0a 20 20 54 61 62 6c  in pDb */.  Tabl
22c20 65 20 2a 70 54 61 62 3b 20 20 20 20 20 20 20 20  e *pTab;        
22c30 20 20 20 20 20 20 20 20 2f 2a 20 41 20 74 61 62          /* A tab
22c40 6c 65 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  le in the databa
22c50 73 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  se */..  assert(
22c60 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c   sqlite3BtreeHol
22c70 64 73 41 6c 6c 4d 75 74 65 78 65 73 28 64 62 29  dsAllMutexes(db)
22c80 20 29 3b 20 20 2f 2a 20 4e 65 65 64 65 64 20 66   );  /* Needed f
22c90 6f 72 20 73 63 68 65 6d 61 20 61 63 63 65 73 73  or schema access
22ca0 20 2a 2f 0a 20 20 66 6f 72 28 69 44 62 3d 30 2c   */.  for(iDb=0,
22cb0 20 70 44 62 3d 64 62 2d 3e 61 44 62 3b 20 69 44   pDb=db->aDb; iD
22cc0 62 3c 64 62 2d 3e 6e 44 62 3b 20 69 44 62 2b 2b  b<db->nDb; iDb++
22cd0 2c 20 70 44 62 2b 2b 29 7b 0a 20 20 20 20 61 73  , pDb++){.    as
22ce0 73 65 72 74 28 20 70 44 62 21 3d 30 20 29 3b 0a  sert( pDb!=0 );.
22cf0 20 20 20 20 66 6f 72 28 6b 3d 73 71 6c 69 74 65      for(k=sqlite
22d00 48 61 73 68 46 69 72 73 74 28 26 70 44 62 2d 3e  HashFirst(&pDb->
22d10 70 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68  pSchema->tblHash
22d20 29 3b 20 20 6b 3b 20 6b 3d 73 71 6c 69 74 65 48  );  k; k=sqliteH
22d30 61 73 68 4e 65 78 74 28 6b 29 29 7b 0a 20 20 20  ashNext(k)){.   
22d40 20 20 20 70 54 61 62 20 3d 20 28 54 61 62 6c 65     pTab = (Table
22d50 2a 29 73 71 6c 69 74 65 48 61 73 68 44 61 74 61  *)sqliteHashData
22d60 28 6b 29 3b 0a 20 20 20 20 20 20 72 65 69 6e 64  (k);.      reind
22d70 65 78 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20  exTable(pParse, 
22d80 70 54 61 62 2c 20 7a 43 6f 6c 6c 29 3b 0a 20 20  pTab, zColl);.  
22d90 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66    }.  }.}.#endif
22da0 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
22db0 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20 52 45   code for the RE
22dc0 49 4e 44 45 58 20 63 6f 6d 6d 61 6e 64 2e 0a 2a  INDEX command..*
22dd0 2a 0a 2a 2a 20 20 20 20 20 20 20 20 52 45 49 4e  *.**        REIN
22de0 44 45 58 20 20 20 20 20 20 20 20 20 20 20 20 20  DEX             
22df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2d                 -
22e00 2d 20 31 0a 2a 2a 20 20 20 20 20 20 20 20 52 45  - 1.**        RE
22e10 49 4e 44 45 58 20 20 3c 63 6f 6c 6c 61 74 69 6f  INDEX  <collatio
22e20 6e 3e 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n>              
22e30 20 2d 2d 20 32 0a 2a 2a 20 20 20 20 20 20 20 20   -- 2.**        
22e40 52 45 49 4e 44 45 58 20 20 3f 3c 64 61 74 61 62  REINDEX  ?<datab
22e50 61 73 65 3e 2e 3f 3c 74 61 62 6c 65 6e 61 6d 65  ase>.?<tablename
22e60 3e 20 20 2d 2d 20 33 0a 2a 2a 20 20 20 20 20 20  >  -- 3.**      
22e70 20 20 52 45 49 4e 44 45 58 20 20 3f 3c 64 61 74    REINDEX  ?<dat
22e80 61 62 61 73 65 3e 2e 3f 3c 69 6e 64 65 78 6e 61  abase>.?<indexna
22e90 6d 65 3e 20 20 2d 2d 20 34 0a 2a 2a 0a 2a 2a 20  me>  -- 4.**.** 
22ea0 46 6f 72 6d 20 31 20 63 61 75 73 65 73 20 61 6c  Form 1 causes al
22eb0 6c 20 69 6e 64 69 63 65 73 20 69 6e 20 61 6c 6c  l indices in all
22ec0 20 61 74 74 61 63 68 65 64 20 64 61 74 61 62 61   attached databa
22ed0 73 65 73 20 74 6f 20 62 65 20 72 65 62 75 69 6c  ses to be rebuil
22ee0 74 2e 0a 2a 2a 20 46 6f 72 6d 20 32 20 72 65 62  t..** Form 2 reb
22ef0 75 69 6c 64 73 20 61 6c 6c 20 69 6e 64 69 63 65  uilds all indice
22f00 73 20 69 6e 20 61 6c 6c 20 64 61 74 61 62 61 73  s in all databas
22f10 65 73 20 74 68 61 74 20 75 73 65 20 74 68 65 20  es that use the 
22f20 6e 61 6d 65 64 0a 2a 2a 20 63 6f 6c 6c 61 74 69  named.** collati
22f30 6e 67 20 66 75 6e 63 74 69 6f 6e 2e 20 20 46 6f  ng function.  Fo
22f40 72 6d 73 20 33 20 61 6e 64 20 34 20 72 65 62 75  rms 3 and 4 rebu
22f50 69 6c 64 20 74 68 65 20 6e 61 6d 65 64 20 69 6e  ild the named in
22f60 64 65 78 20 6f 72 20 61 6c 6c 0a 2a 2a 20 69 6e  dex or all.** in
22f70 64 69 63 65 73 20 61 73 73 6f 63 69 61 74 65 64  dices associated
22f80 20 77 69 74 68 20 74 68 65 20 6e 61 6d 65 64 20   with the named 
22f90 74 61 62 6c 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65  table..*/.#ifnde
22fa0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 52 45  f SQLITE_OMIT_RE
22fb0 49 4e 44 45 58 0a 76 6f 69 64 20 73 71 6c 69 74  INDEX.void sqlit
22fc0 65 33 52 65 69 6e 64 65 78 28 50 61 72 73 65 20  e3Reindex(Parse 
22fd0 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a  *pParse, Token *
22fe0 70 4e 61 6d 65 31 2c 20 54 6f 6b 65 6e 20 2a 70  pName1, Token *p
22ff0 4e 61 6d 65 32 29 7b 0a 20 20 43 6f 6c 6c 53 65  Name2){.  CollSe
23000 71 20 2a 70 43 6f 6c 6c 3b 20 20 20 20 20 20 20  q *pColl;       
23010 20 20 20 20 20 20 2f 2a 20 43 6f 6c 6c 61 74 69        /* Collati
23020 6e 67 20 73 65 71 75 65 6e 63 65 20 74 6f 20 62  ng sequence to b
23030 65 20 72 65 69 6e 64 65 78 65 64 2c 20 6f 72 20  e reindexed, or 
23040 4e 55 4c 4c 20 2a 2f 0a 20 20 63 68 61 72 20 2a  NULL */.  char *
23050 7a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  z;              
23060 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
23070 20 61 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65   a table or inde
23080 78 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  x */.  const cha
23090 72 20 2a 7a 44 62 3b 20 20 20 20 20 20 20 20 20  r *zDb;         
230a0 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
230b0 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20  e database */.  
230c0 54 61 62 6c 65 20 2a 70 54 61 62 3b 20 20 20 20  Table *pTab;    
230d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
230e0 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20 64 61   table in the da
230f0 74 61 62 61 73 65 20 2a 2f 0a 20 20 49 6e 64 65  tabase */.  Inde
23100 78 20 2a 70 49 6e 64 65 78 3b 20 20 20 20 20 20  x *pIndex;      
23110 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 69 6e          /* An in
23120 64 65 78 20 61 73 73 6f 63 69 61 74 65 64 20 77  dex associated w
23130 69 74 68 20 70 54 61 62 20 2a 2f 0a 20 20 69 6e  ith pTab */.  in
23140 74 20 69 44 62 3b 20 20 20 20 20 20 20 20 20 20  t iDb;          
23150 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
23160 20 64 61 74 61 62 61 73 65 20 69 6e 64 65 78 20   database index 
23170 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 73 71 6c 69  number */.  sqli
23180 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
23190 2d 3e 64 62 3b 20 20 20 2f 2a 20 54 68 65 20 64  ->db;   /* The d
231a0 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
231b0 6f 6e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  on */.  Token *p
231c0 4f 62 6a 4e 61 6d 65 3b 20 20 20 20 20 20 20 20  ObjName;        
231d0 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
231e0 68 65 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65  he table or inde
231f0 78 20 74 6f 20 62 65 20 72 65 69 6e 64 65 78 65  x to be reindexe
23200 64 20 2a 2f 0a 0a 20 20 2f 2a 20 52 65 61 64 20  d */..  /* Read 
23210 74 68 65 20 64 61 74 61 62 61 73 65 20 73 63 68  the database sch
23220 65 6d 61 2e 20 49 66 20 61 6e 20 65 72 72 6f 72  ema. If an error
23230 20 6f 63 63 75 72 73 2c 20 6c 65 61 76 65 20 61   occurs, leave a
23240 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 0a  n error message.
23250 20 20 2a 2a 20 61 6e 64 20 63 6f 64 65 20 69 6e    ** and code in
23260 20 70 50 61 72 73 65 20 61 6e 64 20 72 65 74 75   pParse and retu
23270 72 6e 20 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 69 66  rn NULL. */.  if
23280 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c  ( SQLITE_OK!=sql
23290 69 74 65 33 52 65 61 64 53 63 68 65 6d 61 28 70  ite3ReadSchema(p
232a0 50 61 72 73 65 29 20 29 7b 0a 20 20 20 20 72 65  Parse) ){.    re
232b0 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  turn;.  }..  if(
232c0 20 70 4e 61 6d 65 31 3d 3d 30 20 29 7b 0a 20 20   pName1==0 ){.  
232d0 20 20 72 65 69 6e 64 65 78 44 61 74 61 62 61 73    reindexDatabas
232e0 65 73 28 70 50 61 72 73 65 2c 20 30 29 3b 0a 20  es(pParse, 0);. 
232f0 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 65 6c     return;.  }el
23300 73 65 20 69 66 28 20 4e 45 56 45 52 28 70 4e 61  se if( NEVER(pNa
23310 6d 65 32 3d 3d 30 29 20 7c 7c 20 70 4e 61 6d 65  me2==0) || pName
23320 32 2d 3e 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 63  2->z==0 ){.    c
23330 68 61 72 20 2a 7a 43 6f 6c 6c 3b 0a 20 20 20 20  har *zColl;.    
23340 61 73 73 65 72 74 28 20 70 4e 61 6d 65 31 2d 3e  assert( pName1->
23350 7a 20 29 3b 0a 20 20 20 20 7a 43 6f 6c 6c 20 3d  z );.    zColl =
23360 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d   sqlite3NameFrom
23370 54 6f 6b 65 6e 28 70 50 61 72 73 65 2d 3e 64 62  Token(pParse->db
23380 2c 20 70 4e 61 6d 65 31 29 3b 0a 20 20 20 20 69  , pName1);.    i
23390 66 28 20 21 7a 43 6f 6c 6c 20 29 20 72 65 74 75  f( !zColl ) retu
233a0 72 6e 3b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20  rn;.    pColl = 
233b0 73 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53  sqlite3FindCollS
233c0 65 71 28 64 62 2c 20 45 4e 43 28 64 62 29 2c 20  eq(db, ENC(db), 
233d0 7a 43 6f 6c 6c 2c 20 30 29 3b 0a 20 20 20 20 69  zColl, 0);.    i
233e0 66 28 20 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20  f( pColl ){.    
233f0 20 20 72 65 69 6e 64 65 78 44 61 74 61 62 61 73    reindexDatabas
23400 65 73 28 70 50 61 72 73 65 2c 20 7a 43 6f 6c 6c  es(pParse, zColl
23410 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
23420 44 62 46 72 65 65 28 64 62 2c 20 7a 43 6f 6c 6c  DbFree(db, zColl
23430 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b  );.      return;
23440 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
23450 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 43 6f  e3DbFree(db, zCo
23460 6c 6c 29 3b 0a 20 20 7d 0a 20 20 69 44 62 20 3d  ll);.  }.  iDb =
23470 20 73 71 6c 69 74 65 33 54 77 6f 50 61 72 74 4e   sqlite3TwoPartN
23480 61 6d 65 28 70 50 61 72 73 65 2c 20 70 4e 61 6d  ame(pParse, pNam
23490 65 31 2c 20 70 4e 61 6d 65 32 2c 20 26 70 4f 62  e1, pName2, &pOb
234a0 6a 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 69 44  jName);.  if( iD
234b0 62 3c 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  b<0 ) return;.  
234c0 7a 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46  z = sqlite3NameF
234d0 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 4f 62  romToken(db, pOb
234e0 6a 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a 3d  jName);.  if( z=
234f0 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 7a  =0 ) return;.  z
23500 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62  Db = db->aDb[iDb
23510 5d 2e 7a 44 62 53 4e 61 6d 65 3b 0a 20 20 70 54  ].zDbSName;.  pT
23520 61 62 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64  ab = sqlite3Find
23530 54 61 62 6c 65 28 64 62 2c 20 7a 2c 20 7a 44 62  Table(db, z, zDb
23540 29 3b 0a 20 20 69 66 28 20 70 54 61 62 20 29 7b  );.  if( pTab ){
23550 0a 20 20 20 20 72 65 69 6e 64 65 78 54 61 62 6c  .    reindexTabl
23560 65 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20  e(pParse, pTab, 
23570 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  0);.    sqlite3D
23580 62 46 72 65 65 28 64 62 2c 20 7a 29 3b 0a 20 20  bFree(db, z);.  
23590 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
235a0 70 49 6e 64 65 78 20 3d 20 73 71 6c 69 74 65 33  pIndex = sqlite3
235b0 46 69 6e 64 49 6e 64 65 78 28 64 62 2c 20 7a 2c  FindIndex(db, z,
235c0 20 7a 44 62 29 3b 0a 20 20 73 71 6c 69 74 65 33   zDb);.  sqlite3
235d0 44 62 46 72 65 65 28 64 62 2c 20 7a 29 3b 0a 20  DbFree(db, z);. 
235e0 20 69 66 28 20 70 49 6e 64 65 78 20 29 7b 0a 20   if( pIndex ){. 
235f0 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57     sqlite3BeginW
23600 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50  riteOperation(pP
23610 61 72 73 65 2c 20 30 2c 20 69 44 62 29 3b 0a 20  arse, 0, iDb);. 
23620 20 20 20 73 71 6c 69 74 65 33 52 65 66 69 6c 6c     sqlite3Refill
23630 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70 49  Index(pParse, pI
23640 6e 64 65 78 2c 20 2d 31 29 3b 0a 20 20 20 20 72  ndex, -1);.    r
23650 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 73 71 6c  eturn;.  }.  sql
23660 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
23670 72 73 65 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20  rse, "unable to 
23680 69 64 65 6e 74 69 66 79 20 74 68 65 20 6f 62 6a  identify the obj
23690 65 63 74 20 74 6f 20 62 65 20 72 65 69 6e 64 65  ect to be reinde
236a0 78 65 64 22 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a  xed");.}.#endif.
236b0 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
236c0 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72  KeyInfo structur
236d0 65 20 74 68 61 74 20 69 73 20 61 70 70 72 6f 70  e that is approp
236e0 72 69 61 74 65 20 66 6f 72 20 74 68 65 20 67 69  riate for the gi
236f0 76 65 6e 20 49 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a  ven Index..**.**
23700 20 54 68 65 20 63 61 6c 6c 65 72 20 73 68 6f 75   The caller shou
23710 6c 64 20 69 6e 76 6f 6b 65 20 73 71 6c 69 74 65  ld invoke sqlite
23720 33 4b 65 79 49 6e 66 6f 55 6e 72 65 66 28 29 20  3KeyInfoUnref() 
23730 6f 6e 20 74 68 65 20 72 65 74 75 72 6e 65 64 20  on the returned 
23740 6f 62 6a 65 63 74 0a 2a 2a 20 77 68 65 6e 20 69  object.** when i
23750 74 20 68 61 73 20 66 69 6e 69 73 68 65 64 20 75  t has finished u
23760 73 69 6e 67 20 69 74 2e 0a 2a 2f 0a 4b 65 79 49  sing it..*/.KeyI
23770 6e 66 6f 20 2a 73 71 6c 69 74 65 33 4b 65 79 49  nfo *sqlite3KeyI
23780 6e 66 6f 4f 66 49 6e 64 65 78 28 50 61 72 73 65  nfoOfIndex(Parse
23790 20 2a 70 50 61 72 73 65 2c 20 49 6e 64 65 78 20   *pParse, Index 
237a0 2a 70 49 64 78 29 7b 0a 20 20 69 6e 74 20 69 3b  *pIdx){.  int i;
237b0 0a 20 20 69 6e 74 20 6e 43 6f 6c 20 3d 20 70 49  .  int nCol = pI
237c0 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 69  dx->nColumn;.  i
237d0 6e 74 20 6e 4b 65 79 20 3d 20 70 49 64 78 2d 3e  nt nKey = pIdx->
237e0 6e 4b 65 79 43 6f 6c 3b 0a 20 20 4b 65 79 49 6e  nKeyCol;.  KeyIn
237f0 66 6f 20 2a 70 4b 65 79 3b 0a 20 20 69 66 28 20  fo *pKey;.  if( 
23800 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 20 72  pParse->nErr ) r
23810 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70  eturn 0;.  if( p
23820 49 64 78 2d 3e 75 6e 69 71 4e 6f 74 4e 75 6c 6c  Idx->uniqNotNull
23830 20 29 7b 0a 20 20 20 20 70 4b 65 79 20 3d 20 73   ){.    pKey = s
23840 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 41 6c 6c  qlite3KeyInfoAll
23850 6f 63 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 6e  oc(pParse->db, n
23860 4b 65 79 2c 20 6e 43 6f 6c 2d 6e 4b 65 79 29 3b  Key, nCol-nKey);
23870 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 4b  .  }else{.    pK
23880 65 79 20 3d 20 73 71 6c 69 74 65 33 4b 65 79 49  ey = sqlite3KeyI
23890 6e 66 6f 41 6c 6c 6f 63 28 70 50 61 72 73 65 2d  nfoAlloc(pParse-
238a0 3e 64 62 2c 20 6e 43 6f 6c 2c 20 30 29 3b 0a 20  >db, nCol, 0);. 
238b0 20 7d 0a 20 20 69 66 28 20 70 4b 65 79 20 29 7b   }.  if( pKey ){
238c0 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c  .    assert( sql
238d0 69 74 65 33 4b 65 79 49 6e 66 6f 49 73 57 72 69  ite3KeyInfoIsWri
238e0 74 65 61 62 6c 65 28 70 4b 65 79 29 20 29 3b 0a  teable(pKey) );.
238f0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
23900 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Col; i++){.     
23910 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f   const char *zCo
23920 6c 6c 20 3d 20 70 49 64 78 2d 3e 61 7a 43 6f 6c  ll = pIdx->azCol
23930 6c 5b 69 5d 3b 0a 20 20 20 20 20 20 70 4b 65 79  l[i];.      pKey
23940 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d 20 7a 43 6f  ->aColl[i] = zCo
23950 6c 6c 3d 3d 73 71 6c 69 74 65 33 53 74 72 42 49  ll==sqlite3StrBI
23960 4e 41 52 59 20 3f 20 30 20 3a 0a 20 20 20 20 20  NARY ? 0 :.     
23970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23980 20 20 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65     sqlite3Locate
23990 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
239a0 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20 20 20 70 4b  zColl);.      pK
239b0 65 79 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69  ey->aSortOrder[i
239c0 5d 20 3d 20 70 49 64 78 2d 3e 61 53 6f 72 74 4f  ] = pIdx->aSortO
239d0 72 64 65 72 5b 69 5d 3b 0a 20 20 20 20 7d 0a 20  rder[i];.    }. 
239e0 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e     if( pParse->n
239f0 45 72 72 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  Err ){.      sql
23a00 69 74 65 33 4b 65 79 49 6e 66 6f 55 6e 72 65 66  ite3KeyInfoUnref
23a10 28 70 4b 65 79 29 3b 0a 20 20 20 20 20 20 70 4b  (pKey);.      pK
23a20 65 79 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  ey = 0;.    }.  
23a30 7d 0a 20 20 72 65 74 75 72 6e 20 70 4b 65 79 3b  }.  return pKey;
23a40 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
23a50 54 45 5f 4f 4d 49 54 5f 43 54 45 0a 2f 2a 20 0a  TE_OMIT_CTE./* .
23a60 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
23a70 69 73 20 69 6e 76 6f 6b 65 64 20 6f 6e 63 65 20  is invoked once 
23a80 70 65 72 20 43 54 45 20 62 79 20 74 68 65 20 70  per CTE by the p
23a90 61 72 73 65 72 20 77 68 69 6c 65 20 70 61 72 73  arser while pars
23aa0 69 6e 67 20 61 20 0a 2a 2a 20 57 49 54 48 20 63  ing a .** WITH c
23ab0 6c 61 75 73 65 2e 20 0a 2a 2f 0a 57 69 74 68 20  lause. .*/.With 
23ac0 2a 73 71 6c 69 74 65 33 57 69 74 68 41 64 64 28  *sqlite3WithAdd(
23ad0 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
23ae0 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61  ,          /* Pa
23af0 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
23b00 0a 20 20 57 69 74 68 20 2a 70 57 69 74 68 2c 20  .  With *pWith, 
23b10 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78             /* Ex
23b20 69 73 74 69 6e 67 20 57 49 54 48 20 63 6c 61 75  isting WITH clau
23b30 73 65 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20  se, or NULL */. 
23b40 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 2c 20 20   Token *pName,  
23b50 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
23b60 20 6f 66 20 74 68 65 20 63 6f 6d 6d 6f 6e 2d 74   of the common-t
23b70 61 62 6c 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69  able */.  ExprLi
23b80 73 74 20 2a 70 41 72 67 6c 69 73 74 2c 20 20 20  st *pArglist,   
23b90 20 20 2f 2a 20 4f 70 74 69 6f 6e 61 6c 20 63 6f    /* Optional co
23ba0 6c 75 6d 6e 20 6e 61 6d 65 20 6c 69 73 74 20 66  lumn name list f
23bb0 6f 72 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a  or the table */.
23bc0 20 20 53 65 6c 65 63 74 20 2a 70 51 75 65 72 79    Select *pQuery
23bd0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 51 75 65            /* Que
23be0 72 79 20 75 73 65 64 20 74 6f 20 69 6e 69 74 69  ry used to initi
23bf0 61 6c 69 7a 65 20 74 68 65 20 74 61 62 6c 65 20  alize the table 
23c00 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  */.){.  sqlite3 
23c10 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
23c20 3b 0a 20 20 57 69 74 68 20 2a 70 4e 65 77 3b 0a  ;.  With *pNew;.
23c30 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 0a    char *zName;..
23c40 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20    /* Check that 
23c50 74 68 65 20 43 54 45 20 6e 61 6d 65 20 69 73 20  the CTE name is 
23c60 75 6e 69 71 75 65 20 77 69 74 68 69 6e 20 74 68  unique within th
23c70 69 73 20 57 49 54 48 20 63 6c 61 75 73 65 2e 20  is WITH clause. 
23c80 49 66 0a 20 20 2a 2a 20 6e 6f 74 2c 20 73 74 6f  If.  ** not, sto
23c90 72 65 20 61 6e 20 65 72 72 6f 72 20 69 6e 20 74  re an error in t
23ca0 68 65 20 50 61 72 73 65 20 73 74 72 75 63 74 75  he Parse structu
23cb0 72 65 2e 20 2a 2f 0a 20 20 7a 4e 61 6d 65 20 3d  re. */.  zName =
23cc0 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d   sqlite3NameFrom
23cd0 54 6f 6b 65 6e 28 70 50 61 72 73 65 2d 3e 64 62  Token(pParse->db
23ce0 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20  , pName);.  if( 
23cf0 7a 4e 61 6d 65 20 26 26 20 70 57 69 74 68 20 29  zName && pWith )
23d00 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  {.    int i;.   
23d10 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 57 69 74   for(i=0; i<pWit
23d20 68 2d 3e 6e 43 74 65 3b 20 69 2b 2b 29 7b 0a 20  h->nCte; i++){. 
23d30 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
23d40 53 74 72 49 43 6d 70 28 7a 4e 61 6d 65 2c 20 70  StrICmp(zName, p
23d50 57 69 74 68 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  With->a[i].zName
23d60 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
23d70 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
23d80 70 50 61 72 73 65 2c 20 22 64 75 70 6c 69 63 61  pParse, "duplica
23d90 74 65 20 57 49 54 48 20 74 61 62 6c 65 20 6e 61  te WITH table na
23da0 6d 65 3a 20 25 73 22 2c 20 7a 4e 61 6d 65 29 3b  me: %s", zName);
23db0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
23dc0 20 7d 0a 0a 20 20 69 66 28 20 70 57 69 74 68 20   }..  if( pWith 
23dd0 29 7b 0a 20 20 20 20 69 6e 74 20 6e 42 79 74 65  ){.    int nByte
23de0 20 3d 20 73 69 7a 65 6f 66 28 2a 70 57 69 74 68   = sizeof(*pWith
23df0 29 20 2b 20 28 73 69 7a 65 6f 66 28 70 57 69 74  ) + (sizeof(pWit
23e00 68 2d 3e 61 5b 31 5d 29 20 2a 20 70 57 69 74 68  h->a[1]) * pWith
23e10 2d 3e 6e 43 74 65 29 3b 0a 20 20 20 20 70 4e 65  ->nCte);.    pNe
23e20 77 20 3d 20 73 71 6c 69 74 65 33 44 62 52 65 61  w = sqlite3DbRea
23e30 6c 6c 6f 63 28 64 62 2c 20 70 57 69 74 68 2c 20  lloc(db, pWith, 
23e40 6e 42 79 74 65 29 3b 0a 20 20 7d 65 6c 73 65 7b  nByte);.  }else{
23e50 0a 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69  .    pNew = sqli
23e60 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28  te3DbMallocZero(
23e70 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 57 69 74  db, sizeof(*pWit
23e80 68 29 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  h));.  }.  asser
23e90 74 28 20 28 70 4e 65 77 21 3d 30 20 26 26 20 7a  t( (pNew!=0 && z
23ea0 4e 61 6d 65 21 3d 30 29 20 7c 7c 20 64 62 2d 3e  Name!=0) || db->
23eb0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
23ec0 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f  .  if( db->mallo
23ed0 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 73  cFailed ){.    s
23ee0 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65  qlite3ExprListDe
23ef0 6c 65 74 65 28 64 62 2c 20 70 41 72 67 6c 69 73  lete(db, pArglis
23f00 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53  t);.    sqlite3S
23f10 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20  electDelete(db, 
23f20 70 51 75 65 72 79 29 3b 0a 20 20 20 20 73 71 6c  pQuery);.    sql
23f30 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a  ite3DbFree(db, z
23f40 4e 61 6d 65 29 3b 0a 20 20 20 20 70 4e 65 77 20  Name);.    pNew 
23f50 3d 20 70 57 69 74 68 3b 0a 20 20 7d 65 6c 73 65  = pWith;.  }else
23f60 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 61 5b 70 4e  {.    pNew->a[pN
23f70 65 77 2d 3e 6e 43 74 65 5d 2e 70 53 65 6c 65 63  ew->nCte].pSelec
23f80 74 20 3d 20 70 51 75 65 72 79 3b 0a 20 20 20 20  t = pQuery;.    
23f90 70 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e 43  pNew->a[pNew->nC
23fa0 74 65 5d 2e 70 43 6f 6c 73 20 3d 20 70 41 72 67  te].pCols = pArg
23fb0 6c 69 73 74 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  list;.    pNew->
23fc0 61 5b 70 4e 65 77 2d 3e 6e 43 74 65 5d 2e 7a 4e  a[pNew->nCte].zN
23fd0 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20 20  ame = zName;.   
23fe0 20 70 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e   pNew->a[pNew->n
23ff0 43 74 65 5d 2e 7a 43 74 65 45 72 72 20 3d 20 30  Cte].zCteErr = 0
24000 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 43 74 65  ;.    pNew->nCte
24010 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  ++;.  }..  retur
24020 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n pNew;.}../*.**
24030 20 46 72 65 65 20 74 68 65 20 63 6f 6e 74 65 6e   Free the conten
24040 74 73 20 6f 66 20 74 68 65 20 57 69 74 68 20 6f  ts of the With o
24050 62 6a 65 63 74 20 70 61 73 73 65 64 20 61 73 20  bject passed as 
24060 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
24070 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ent..*/.void sql
24080 69 74 65 33 57 69 74 68 44 65 6c 65 74 65 28 73  ite3WithDelete(s
24090 71 6c 69 74 65 33 20 2a 64 62 2c 20 57 69 74 68  qlite3 *db, With
240a0 20 2a 70 57 69 74 68 29 7b 0a 20 20 69 66 28 20   *pWith){.  if( 
240b0 70 57 69 74 68 20 29 7b 0a 20 20 20 20 69 6e 74  pWith ){.    int
240c0 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   i;.    for(i=0;
240d0 20 69 3c 70 57 69 74 68 2d 3e 6e 43 74 65 3b 20   i<pWith->nCte; 
240e0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 74 72 75  i++){.      stru
240f0 63 74 20 43 74 65 20 2a 70 43 74 65 20 3d 20 26  ct Cte *pCte = &
24100 70 57 69 74 68 2d 3e 61 5b 69 5d 3b 0a 20 20 20  pWith->a[i];.   
24110 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69     sqlite3ExprLi
24120 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 43 74  stDelete(db, pCt
24130 65 2d 3e 70 43 6f 6c 73 29 3b 0a 20 20 20 20 20  e->pCols);.     
24140 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
24150 6c 65 74 65 28 64 62 2c 20 70 43 74 65 2d 3e 70  lete(db, pCte->p
24160 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 73  Select);.      s
24170 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
24180 20 70 43 74 65 2d 3e 7a 4e 61 6d 65 29 3b 0a 20   pCte->zName);. 
24190 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
241a0 44 62 46 72 65 65 28 64 62 2c 20 70 57 69 74 68  DbFree(db, pWith
241b0 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20  );.  }.}.#endif 
241c0 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  /* !defined(SQLI
241d0 54 45 5f 4f 4d 49 54 5f 43 54 45 29 20 2a 2f 0a  TE_OMIT_CTE) */.