/ Hex Artifact Content
Login

Artifact f1c304326b0cd95ac556dd541ad16284face4f99:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43 20 63  ile contains C c
0190: 6f 64 65 20 72 6f 75 74 69 6e 65 73 20 74 68 61  ode routines tha
01a0: 74 20 61 72 65 20 63 61 6c 6c 65 64 20 62 79 20  t are called by 
01b0: 74 68 65 20 53 51 4c 69 74 65 20 70 61 72 73 65  the SQLite parse
01c0: 72 0a 2a 2a 20 77 68 65 6e 20 73 79 6e 74 61 78  r.** when syntax
01d0: 20 72 75 6c 65 73 20 61 72 65 20 72 65 64 75 63   rules are reduc
01e0: 65 64 2e 20 20 54 68 65 20 72 6f 75 74 69 6e 65  ed.  The routine
01f0: 73 20 69 6e 20 74 68 69 73 20 66 69 6c 65 20 68  s in this file h
0200: 61 6e 64 6c 65 20 74 68 65 0a 2a 2a 20 66 6f 6c  andle the.** fol
0210: 6c 6f 77 69 6e 67 20 6b 69 6e 64 73 20 6f 66 20  lowing kinds of 
0220: 53 51 4c 20 73 79 6e 74 61 78 3a 0a 2a 2a 0a 2a  SQL syntax:.**.*
0230: 2a 20 20 20 20 20 43 52 45 41 54 45 20 54 41 42  *     CREATE TAB
0240: 4c 45 0a 2a 2a 20 20 20 20 20 44 52 4f 50 20 54  LE.**     DROP T
0250: 41 42 4c 45 0a 2a 2a 20 20 20 20 20 43 52 45 41  ABLE.**     CREA
0260: 54 45 20 49 4e 44 45 58 0a 2a 2a 20 20 20 20 20  TE INDEX.**     
0270: 44 52 4f 50 20 49 4e 44 45 58 0a 2a 2a 20 20 20  DROP INDEX.**   
0280: 20 20 63 72 65 61 74 69 6e 67 20 49 44 20 6c 69    creating ID li
0290: 73 74 73 0a 2a 2a 20 20 20 20 20 42 45 47 49 4e  sts.**     BEGIN
02a0: 20 54 52 41 4e 53 41 43 54 49 4f 4e 0a 2a 2a 20   TRANSACTION.** 
02b0: 20 20 20 20 43 4f 4d 4d 49 54 0a 2a 2a 20 20 20      COMMIT.**   
02c0: 20 20 52 4f 4c 4c 42 41 43 4b 0a 2a 2f 0a 23 69    ROLLBACK.*/.#i
02d0: 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 49 6e  nclude "sqliteIn
02e0: 74 2e 68 22 0a 0a 23 69 66 6e 64 65 66 20 53 51  t.h"..#ifndef SQ
02f0: 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
0300: 5f 43 41 43 48 45 0a 2f 2a 0a 2a 2a 20 54 68 65  _CACHE./*.** The
0310: 20 54 61 62 6c 65 4c 6f 63 6b 20 73 74 72 75 63   TableLock struc
0320: 74 75 72 65 20 69 73 20 6f 6e 6c 79 20 75 73 65  ture is only use
0330: 64 20 62 79 20 74 68 65 20 73 71 6c 69 74 65 33  d by the sqlite3
0340: 54 61 62 6c 65 4c 6f 63 6b 28 29 20 61 6e 64 0a  TableLock() and.
0350: 2a 2a 20 63 6f 64 65 54 61 62 6c 65 4c 6f 63 6b  ** codeTableLock
0360: 73 28 29 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 2a  s() functions..*
0370: 2f 0a 73 74 72 75 63 74 20 54 61 62 6c 65 4c 6f  /.struct TableLo
0380: 63 6b 20 7b 0a 20 20 69 6e 74 20 69 44 62 3b 20  ck {.  int iDb; 
0390: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
03a0: 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74  he database cont
03b0: 61 69 6e 69 6e 67 20 74 68 65 20 74 61 62 6c 65  aining the table
03c0: 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64 20 2a 2f   to be locked */
03d0: 0a 20 20 69 6e 74 20 69 54 61 62 3b 20 20 20 20  .  int iTab;    
03e0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72          /* The r
03f0: 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 68 65 20  oot page of the 
0400: 74 61 62 6c 65 20 74 6f 20 62 65 20 6c 6f 63 6b  table to be lock
0410: 65 64 20 2a 2f 0a 20 20 75 38 20 69 73 57 72 69  ed */.  u8 isWri
0420: 74 65 4c 6f 63 6b 3b 20 20 20 20 20 20 2f 2a 20  teLock;      /* 
0430: 54 72 75 65 20 66 6f 72 20 77 72 69 74 65 20 6c  True for write l
0440: 6f 63 6b 2e 20 20 46 61 6c 73 65 20 66 6f 72 20  ock.  False for 
0450: 61 20 72 65 61 64 20 6c 6f 63 6b 20 2a 2f 0a 20  a read lock */. 
0460: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
0470: 6d 65 3b 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66  me;   /* Name of
0480: 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 7d 3b   the table */.};
0490: 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6f 72 64 20 74  ../*.** Record t
04a0: 68 65 20 66 61 63 74 20 74 68 61 74 20 77 65 20  he fact that we 
04b0: 77 61 6e 74 20 74 6f 20 6c 6f 63 6b 20 61 20 74  want to lock a t
04c0: 61 62 6c 65 20 61 74 20 72 75 6e 2d 74 69 6d 65  able at run-time
04d0: 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 61  .  .**.** The ta
04e0: 62 6c 65 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64  ble to be locked
04f0: 20 68 61 73 20 72 6f 6f 74 20 70 61 67 65 20 69   has root page i
0500: 54 61 62 20 61 6e 64 20 69 73 20 66 6f 75 6e 64  Tab and is found
0510: 20 69 6e 20 64 61 74 61 62 61 73 65 20 69 44 62   in database iDb
0520: 2e 0a 2a 2a 20 41 20 72 65 61 64 20 6f 72 20 61  ..** A read or a
0530: 20 77 72 69 74 65 20 6c 6f 63 6b 20 63 61 6e 20   write lock can 
0540: 62 65 20 74 61 6b 65 6e 20 64 65 70 65 6e 64 69  be taken dependi
0550: 6e 67 20 6f 6e 20 69 73 57 72 69 74 65 6c 6f 63  ng on isWriteloc
0560: 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  k..**.** This ro
0570: 75 74 69 6e 65 20 6a 75 73 74 20 72 65 63 6f 72  utine just recor
0580: 64 73 20 74 68 65 20 66 61 63 74 20 74 68 61 74  ds the fact that
0590: 20 74 68 65 20 6c 6f 63 6b 20 69 73 20 64 65 73   the lock is des
05a0: 69 72 65 64 2e 20 20 54 68 65 0a 2a 2a 20 63 6f  ired.  The.** co
05b0: 64 65 20 74 6f 20 6d 61 6b 65 20 74 68 65 20 6c  de to make the l
05c0: 6f 63 6b 20 6f 63 63 75 72 20 69 73 20 67 65 6e  ock occur is gen
05d0: 65 72 61 74 65 64 20 62 79 20 61 20 6c 61 74 65  erated by a late
05e0: 72 20 63 61 6c 6c 20 74 6f 0a 2a 2a 20 63 6f 64  r call to.** cod
05f0: 65 54 61 62 6c 65 4c 6f 63 6b 73 28 29 20 77 68  eTableLocks() wh
0600: 69 63 68 20 6f 63 63 75 72 73 20 64 75 72 69 6e  ich occurs durin
0610: 67 20 73 71 6c 69 74 65 33 46 69 6e 69 73 68 43  g sqlite3FinishC
0620: 6f 64 69 6e 67 28 29 2e 0a 2a 2f 0a 76 6f 69 64  oding()..*/.void
0630: 20 73 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63   sqlite3TableLoc
0640: 6b 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  k(.  Parse *pPar
0650: 73 65 2c 20 20 20 20 20 2f 2a 20 50 61 72 73 69  se,     /* Parsi
0660: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
0670: 69 6e 74 20 69 44 62 2c 20 20 20 20 20 20 20 20  int iDb,        
0680: 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74     /* Index of t
0690: 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74  he database cont
06a0: 61 69 6e 69 6e 67 20 74 68 65 20 74 61 62 6c 65  aining the table
06b0: 20 74 6f 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 6e   to lock */.  in
06c0: 74 20 69 54 61 62 2c 20 20 20 20 20 20 20 20 20  t iTab,         
06d0: 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20 6e 75   /* Root page nu
06e0: 6d 62 65 72 20 6f 66 20 74 68 65 20 74 61 62 6c  mber of the tabl
06f0: 65 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64 20 2a  e to be locked *
0700: 2f 0a 20 20 75 38 20 69 73 57 72 69 74 65 4c 6f  /.  u8 isWriteLo
0710: 63 6b 2c 20 20 20 20 2f 2a 20 54 72 75 65 20 66  ck,    /* True f
0720: 6f 72 20 61 20 77 72 69 74 65 20 6c 6f 63 6b 20  or a write lock 
0730: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
0740: 2a 7a 4e 61 6d 65 20 20 2f 2a 20 4e 61 6d 65 20  *zName  /* Name 
0750: 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20  of the table to 
0760: 62 65 20 6c 6f 63 6b 65 64 20 2a 2f 0a 29 7b 0a  be locked */.){.
0770: 20 20 50 61 72 73 65 20 2a 70 54 6f 70 6c 65 76    Parse *pToplev
0780: 65 6c 20 3d 20 73 71 6c 69 74 65 33 50 61 72 73  el = sqlite3Pars
0790: 65 54 6f 70 6c 65 76 65 6c 28 70 50 61 72 73 65  eToplevel(pParse
07a0: 29 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e  );.  int i;.  in
07b0: 74 20 6e 42 79 74 65 73 3b 0a 20 20 54 61 62 6c  t nBytes;.  Tabl
07c0: 65 4c 6f 63 6b 20 2a 70 3b 0a 20 20 61 73 73 65  eLock *p;.  asse
07d0: 72 74 28 20 69 44 62 3e 3d 30 20 29 3b 0a 0a 20  rt( iDb>=0 );.. 
07e0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 6f 70   for(i=0; i<pTop
07f0: 6c 65 76 65 6c 2d 3e 6e 54 61 62 6c 65 4c 6f 63  level->nTableLoc
0800: 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70 20 3d  k; i++){.    p =
0810: 20 26 70 54 6f 70 6c 65 76 65 6c 2d 3e 61 54 61   &pToplevel->aTa
0820: 62 6c 65 4c 6f 63 6b 5b 69 5d 3b 0a 20 20 20 20  bleLock[i];.    
0830: 69 66 28 20 70 2d 3e 69 44 62 3d 3d 69 44 62 20  if( p->iDb==iDb 
0840: 26 26 20 70 2d 3e 69 54 61 62 3d 3d 69 54 61 62  && p->iTab==iTab
0850: 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 69 73 57   ){.      p->isW
0860: 72 69 74 65 4c 6f 63 6b 20 3d 20 28 70 2d 3e 69  riteLock = (p->i
0870: 73 57 72 69 74 65 4c 6f 63 6b 20 7c 7c 20 69 73  sWriteLock || is
0880: 57 72 69 74 65 4c 6f 63 6b 29 3b 0a 20 20 20 20  WriteLock);.    
0890: 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a    return;.    }.
08a0: 20 20 7d 0a 0a 20 20 6e 42 79 74 65 73 20 3d 20    }..  nBytes = 
08b0: 73 69 7a 65 6f 66 28 54 61 62 6c 65 4c 6f 63 6b  sizeof(TableLock
08c0: 29 20 2a 20 28 70 54 6f 70 6c 65 76 65 6c 2d 3e  ) * (pToplevel->
08d0: 6e 54 61 62 6c 65 4c 6f 63 6b 2b 31 29 3b 0a 20  nTableLock+1);. 
08e0: 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 61 54 61 62   pToplevel->aTab
08f0: 6c 65 4c 6f 63 6b 20 3d 0a 20 20 20 20 20 20 73  leLock =.      s
0900: 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 4f  qlite3DbReallocO
0910: 72 46 72 65 65 28 70 54 6f 70 6c 65 76 65 6c 2d  rFree(pToplevel-
0920: 3e 64 62 2c 20 70 54 6f 70 6c 65 76 65 6c 2d 3e  >db, pToplevel->
0930: 61 54 61 62 6c 65 4c 6f 63 6b 2c 20 6e 42 79 74  aTableLock, nByt
0940: 65 73 29 3b 0a 20 20 69 66 28 20 70 54 6f 70 6c  es);.  if( pTopl
0950: 65 76 65 6c 2d 3e 61 54 61 62 6c 65 4c 6f 63 6b  evel->aTableLock
0960: 20 29 7b 0a 20 20 20 20 70 20 3d 20 26 70 54 6f   ){.    p = &pTo
0970: 70 6c 65 76 65 6c 2d 3e 61 54 61 62 6c 65 4c 6f  plevel->aTableLo
0980: 63 6b 5b 70 54 6f 70 6c 65 76 65 6c 2d 3e 6e 54  ck[pToplevel->nT
0990: 61 62 6c 65 4c 6f 63 6b 2b 2b 5d 3b 0a 20 20 20  ableLock++];.   
09a0: 20 70 2d 3e 69 44 62 20 3d 20 69 44 62 3b 0a 20   p->iDb = iDb;. 
09b0: 20 20 20 70 2d 3e 69 54 61 62 20 3d 20 69 54 61     p->iTab = iTa
09c0: 62 3b 0a 20 20 20 20 70 2d 3e 69 73 57 72 69 74  b;.    p->isWrit
09d0: 65 4c 6f 63 6b 20 3d 20 69 73 57 72 69 74 65 4c  eLock = isWriteL
09e0: 6f 63 6b 3b 0a 20 20 20 20 70 2d 3e 7a 4e 61 6d  ock;.    p->zNam
09f0: 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20 7d 65 6c  e = zName;.  }el
0a00: 73 65 7b 0a 20 20 20 20 70 54 6f 70 6c 65 76 65  se{.    pTopleve
0a10: 6c 2d 3e 6e 54 61 62 6c 65 4c 6f 63 6b 20 3d 20  l->nTableLock = 
0a20: 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 6f  0;.    sqlite3Oo
0a30: 6d 46 61 75 6c 74 28 70 54 6f 70 6c 65 76 65 6c  mFault(pToplevel
0a40: 2d 3e 64 62 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  ->db);.  }.}../*
0a50: 0a 2a 2a 20 43 6f 64 65 20 61 6e 20 4f 50 5f 54  .** Code an OP_T
0a60: 61 62 6c 65 4c 6f 63 6b 20 69 6e 73 74 72 75 63  ableLock instruc
0a70: 74 69 6f 6e 20 66 6f 72 20 65 61 63 68 20 74 61  tion for each ta
0a80: 62 6c 65 20 6c 6f 63 6b 65 64 20 62 79 20 74 68  ble locked by th
0a90: 65 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 28  e.** statement (
0aa0: 63 6f 6e 66 69 67 75 72 65 64 20 62 79 20 63 61  configured by ca
0ab0: 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 54 61  lls to sqlite3Ta
0ac0: 62 6c 65 4c 6f 63 6b 28 29 29 2e 0a 2a 2f 0a 73  bleLock())..*/.s
0ad0: 74 61 74 69 63 20 76 6f 69 64 20 63 6f 64 65 54  tatic void codeT
0ae0: 61 62 6c 65 4c 6f 63 6b 73 28 50 61 72 73 65 20  ableLocks(Parse 
0af0: 2a 70 50 61 72 73 65 29 7b 0a 20 20 69 6e 74 20  *pParse){.  int 
0b00: 69 3b 0a 20 20 56 64 62 65 20 2a 70 56 64 62 65  i;.  Vdbe *pVdbe
0b10: 3b 20 0a 0a 20 20 70 56 64 62 65 20 3d 20 73 71  ; ..  pVdbe = sq
0b20: 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
0b30: 72 73 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20  rse);.  assert( 
0b40: 70 56 64 62 65 21 3d 30 20 29 3b 20 2f 2a 20 73  pVdbe!=0 ); /* s
0b50: 71 6c 69 74 65 33 47 65 74 56 64 62 65 20 63 61  qlite3GetVdbe ca
0b60: 6e 6e 6f 74 20 66 61 69 6c 3a 20 56 44 42 45 20  nnot fail: VDBE 
0b70: 61 6c 72 65 61 64 79 20 61 6c 6c 6f 63 61 74 65  already allocate
0b80: 64 20 2a 2f 0a 0a 20 20 66 6f 72 28 69 3d 30 3b  d */..  for(i=0;
0b90: 20 69 3c 70 50 61 72 73 65 2d 3e 6e 54 61 62 6c   i<pParse->nTabl
0ba0: 65 4c 6f 63 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20  eLock; i++){.   
0bb0: 20 54 61 62 6c 65 4c 6f 63 6b 20 2a 70 20 3d 20   TableLock *p = 
0bc0: 26 70 50 61 72 73 65 2d 3e 61 54 61 62 6c 65 4c  &pParse->aTableL
0bd0: 6f 63 6b 5b 69 5d 3b 0a 20 20 20 20 69 6e 74 20  ock[i];.    int 
0be0: 70 31 20 3d 20 70 2d 3e 69 44 62 3b 0a 20 20 20  p1 = p->iDb;.   
0bf0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
0c00: 70 34 28 70 56 64 62 65 2c 20 4f 50 5f 54 61 62  p4(pVdbe, OP_Tab
0c10: 6c 65 4c 6f 63 6b 2c 20 70 31 2c 20 70 2d 3e 69  leLock, p1, p->i
0c20: 54 61 62 2c 20 70 2d 3e 69 73 57 72 69 74 65 4c  Tab, p->isWriteL
0c30: 6f 63 6b 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ock,.           
0c40: 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 7a 4e             p->zN
0c50: 61 6d 65 2c 20 50 34 5f 53 54 41 54 49 43 29 3b  ame, P4_STATIC);
0c60: 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 20 20 23  .  }.}.#else.  #
0c70: 64 65 66 69 6e 65 20 63 6f 64 65 54 61 62 6c 65  define codeTable
0c80: 4c 6f 63 6b 73 28 78 29 0a 23 65 6e 64 69 66 0a  Locks(x).#endif.
0c90: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52  ./*.** Return TR
0ca0: 55 45 20 69 66 20 74 68 65 20 67 69 76 65 6e 20  UE if the given 
0cb0: 79 44 62 4d 61 73 6b 20 6f 62 6a 65 63 74 20 69  yDbMask object i
0cc0: 73 20 65 6d 70 74 79 20 2d 20 69 66 20 69 74 20  s empty - if it 
0cd0: 63 6f 6e 74 61 69 6e 73 20 6e 6f 0a 2a 2a 20 31  contains no.** 1
0ce0: 20 62 69 74 73 2e 20 20 54 68 69 73 20 72 6f 75   bits.  This rou
0cf0: 74 69 6e 65 20 69 73 20 75 73 65 64 20 62 79 20  tine is used by 
0d00: 74 68 65 20 44 62 4d 61 73 6b 41 6c 6c 5a 65 72  the DbMaskAllZer
0d10: 6f 28 29 20 61 6e 64 20 44 62 4d 61 73 6b 4e 6f  o() and DbMaskNo
0d20: 74 5a 65 72 6f 28 29 0a 2a 2a 20 6d 61 63 72 6f  tZero().** macro
0d30: 73 20 77 68 65 6e 20 53 51 4c 49 54 45 5f 4d 41  s when SQLITE_MA
0d40: 58 5f 41 54 54 41 43 48 45 44 20 69 73 20 67 72  X_ATTACHED is gr
0d50: 65 61 74 65 72 20 74 68 61 6e 20 33 30 2e 0a 2a  eater than 30..*
0d60: 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  /.#if SQLITE_MAX
0d70: 5f 41 54 54 41 43 48 45 44 3e 33 30 0a 69 6e 74  _ATTACHED>30.int
0d80: 20 73 71 6c 69 74 65 33 44 62 4d 61 73 6b 41 6c   sqlite3DbMaskAl
0d90: 6c 5a 65 72 6f 28 79 44 62 4d 61 73 6b 20 6d 29  lZero(yDbMask m)
0da0: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72  {.  int i;.  for
0db0: 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 79  (i=0; i<sizeof(y
0dc0: 44 62 4d 61 73 6b 29 3b 20 69 2b 2b 29 20 69 66  DbMask); i++) if
0dd0: 28 20 6d 5b 69 5d 20 29 20 72 65 74 75 72 6e 20  ( m[i] ) return 
0de0: 30 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d  0;.  return 1;.}
0df0: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54  .#endif../*.** T
0e00: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
0e10: 61 6c 6c 65 64 20 61 66 74 65 72 20 61 20 73 69  alled after a si
0e20: 6e 67 6c 65 20 53 51 4c 20 73 74 61 74 65 6d 65  ngle SQL stateme
0e30: 6e 74 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20 70  nt has been.** p
0e40: 61 72 73 65 64 20 61 6e 64 20 61 20 56 44 42 45  arsed and a VDBE
0e50: 20 70 72 6f 67 72 61 6d 20 74 6f 20 65 78 65 63   program to exec
0e60: 75 74 65 20 74 68 61 74 20 73 74 61 74 65 6d 65  ute that stateme
0e70: 6e 74 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20 70  nt has been.** p
0e80: 72 65 70 61 72 65 64 2e 20 20 54 68 69 73 20 72  repared.  This r
0e90: 6f 75 74 69 6e 65 20 70 75 74 73 20 74 68 65 20  outine puts the 
0ea0: 66 69 6e 69 73 68 69 6e 67 20 74 6f 75 63 68 65  finishing touche
0eb0: 73 20 6f 6e 20 74 68 65 0a 2a 2a 20 56 44 42 45  s on the.** VDBE
0ec0: 20 70 72 6f 67 72 61 6d 20 61 6e 64 20 72 65 73   program and res
0ed0: 65 74 73 20 74 68 65 20 70 50 61 72 73 65 20 73  ets the pParse s
0ee0: 74 72 75 63 74 75 72 65 20 66 6f 72 20 74 68 65  tructure for the
0ef0: 20 6e 65 78 74 0a 2a 2a 20 70 61 72 73 65 2e 0a   next.** parse..
0f00: 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20  **.** Note that 
0f10: 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  if an error occu
0f20: 72 72 65 64 2c 20 69 74 20 6d 69 67 68 74 20 62  rred, it might b
0f30: 65 20 74 68 65 20 63 61 73 65 20 74 68 61 74 0a  e the case that.
0f40: 2a 2a 20 6e 6f 20 56 44 42 45 20 63 6f 64 65 20  ** no VDBE code 
0f50: 77 61 73 20 67 65 6e 65 72 61 74 65 64 2e 0a 2a  was generated..*
0f60: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 46 69  /.void sqlite3Fi
0f70: 6e 69 73 68 43 6f 64 69 6e 67 28 50 61 72 73 65  nishCoding(Parse
0f80: 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 73 71 6c   *pParse){.  sql
0f90: 69 74 65 33 20 2a 64 62 3b 0a 20 20 56 64 62 65  ite3 *db;.  Vdbe
0fa0: 20 2a 76 3b 0a 0a 20 20 61 73 73 65 72 74 28 20   *v;..  assert( 
0fb0: 70 50 61 72 73 65 2d 3e 70 54 6f 70 6c 65 76 65  pParse->pTopleve
0fc0: 6c 3d 3d 30 20 29 3b 0a 20 20 64 62 20 3d 20 70  l==0 );.  db = p
0fd0: 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28  Parse->db;.  if(
0fe0: 20 70 50 61 72 73 65 2d 3e 6e 65 73 74 65 64 20   pParse->nested 
0ff0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
1000: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
1010: 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72   || pParse->nErr
1020: 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61 72   ){.    if( pPar
1030: 73 65 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  se->rc==SQLITE_O
1040: 4b 20 29 20 70 50 61 72 73 65 2d 3e 72 63 20 3d  K ) pParse->rc =
1050: 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
1060: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a     return;.  }..
1070: 20 20 2f 2a 20 42 65 67 69 6e 20 62 79 20 67 65    /* Begin by ge
1080: 6e 65 72 61 74 69 6e 67 20 73 6f 6d 65 20 74 65  nerating some te
1090: 72 6d 69 6e 61 74 69 6f 6e 20 63 6f 64 65 20 61  rmination code a
10a0: 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
10b0: 0a 20 20 2a 2a 20 76 64 62 65 20 70 72 6f 67 72  .  ** vdbe progr
10c0: 61 6d 0a 20 20 2a 2f 0a 20 20 76 20 3d 20 73 71  am.  */.  v = sq
10d0: 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
10e0: 72 73 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20  rse);.  assert( 
10f0: 21 70 50 61 72 73 65 2d 3e 69 73 4d 75 6c 74 69  !pParse->isMulti
1100: 57 72 69 74 65 20 0a 20 20 20 20 20 20 20 7c 7c  Write .       ||
1110: 20 73 71 6c 69 74 65 33 56 64 62 65 41 73 73 65   sqlite3VdbeAsse
1120: 72 74 4d 61 79 41 62 6f 72 74 28 76 2c 20 70 50  rtMayAbort(v, pP
1130: 61 72 73 65 2d 3e 6d 61 79 41 62 6f 72 74 29 29  arse->mayAbort))
1140: 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20  ;.  if( v ){.   
1150: 20 77 68 69 6c 65 28 20 73 71 6c 69 74 65 33 56   while( sqlite3V
1160: 64 62 65 44 65 6c 65 74 65 50 72 69 6f 72 4f 70  dbeDeletePriorOp
1170: 63 6f 64 65 28 76 2c 20 4f 50 5f 43 6c 6f 73 65  code(v, OP_Close
1180: 29 20 29 7b 7d 0a 20 20 20 20 73 71 6c 69 74 65  ) ){}.    sqlite
1190: 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f  3VdbeAddOp0(v, O
11a0: 50 5f 48 61 6c 74 29 3b 0a 0a 23 69 66 20 53 51  P_Halt);..#if SQ
11b0: 4c 49 54 45 5f 55 53 45 52 5f 41 55 54 48 45 4e  LITE_USER_AUTHEN
11c0: 54 49 43 41 54 49 4f 4e 0a 20 20 20 20 69 66 28  TICATION.    if(
11d0: 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 6c 65 4c   pParse->nTableL
11e0: 6f 63 6b 3e 30 20 26 26 20 64 62 2d 3e 69 6e 69  ock>0 && db->ini
11f0: 74 2e 62 75 73 79 3d 3d 30 20 29 7b 0a 20 20 20  t.busy==0 ){.   
1200: 20 20 20 73 71 6c 69 74 65 33 55 73 65 72 41 75     sqlite3UserAu
1210: 74 68 49 6e 69 74 28 64 62 29 3b 0a 20 20 20 20  thInit(db);.    
1220: 20 20 69 66 28 20 64 62 2d 3e 61 75 74 68 2e 61    if( db->auth.a
1230: 75 74 68 4c 65 76 65 6c 3c 55 41 55 54 48 5f 55  uthLevel<UAUTH_U
1240: 73 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ser ){.        p
1250: 50 61 72 73 65 2d 3e 72 63 20 3d 20 53 51 4c 49  Parse->rc = SQLI
1260: 54 45 5f 41 55 54 48 5f 55 53 45 52 3b 0a 20 20  TE_AUTH_USER;.  
1270: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
1280: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 75  orMsg(pParse, "u
1290: 73 65 72 20 6e 6f 74 20 61 75 74 68 65 6e 74 69  ser not authenti
12a0: 63 61 74 65 64 22 29 3b 0a 20 20 20 20 20 20 20  cated");.       
12b0: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d   return;.      }
12c0: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  .    }.#endif.. 
12d0: 20 20 20 2f 2a 20 54 68 65 20 63 6f 6f 6b 69 65     /* The cookie
12e0: 20 6d 61 73 6b 20 63 6f 6e 74 61 69 6e 73 20 6f   mask contains o
12f0: 6e 65 20 62 69 74 20 66 6f 72 20 65 61 63 68 20  ne bit for each 
1300: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6f 70  database file op
1310: 65 6e 2e 0a 20 20 20 20 2a 2a 20 28 42 69 74 20  en..    ** (Bit 
1320: 30 20 69 73 20 66 6f 72 20 6d 61 69 6e 2c 20 62  0 is for main, b
1330: 69 74 20 31 20 69 73 20 66 6f 72 20 74 65 6d 70  it 1 is for temp
1340: 2c 20 61 6e 64 20 73 6f 20 66 6f 72 74 68 2e 29  , and so forth.)
1350: 20 20 42 69 74 73 20 61 72 65 0a 20 20 20 20 2a    Bits are.    *
1360: 2a 20 73 65 74 20 66 6f 72 20 65 61 63 68 20 64  * set for each d
1370: 61 74 61 62 61 73 65 20 74 68 61 74 20 69 73 20  atabase that is 
1380: 75 73 65 64 2e 20 20 47 65 6e 65 72 61 74 65 20  used.  Generate 
1390: 63 6f 64 65 20 74 6f 20 73 74 61 72 74 20 61 0a  code to start a.
13a0: 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69      ** transacti
13b0: 6f 6e 20 6f 6e 20 65 61 63 68 20 75 73 65 64 20  on on each used 
13c0: 64 61 74 61 62 61 73 65 20 61 6e 64 20 74 6f 20  database and to 
13d0: 76 65 72 69 66 79 20 74 68 65 20 73 63 68 65 6d  verify the schem
13e0: 61 20 63 6f 6f 6b 69 65 0a 20 20 20 20 2a 2a 20  a cookie.    ** 
13f0: 6f 6e 20 65 61 63 68 20 75 73 65 64 20 64 61 74  on each used dat
1400: 61 62 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20  abase..    */.  
1410: 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
1420: 46 61 69 6c 65 64 3d 3d 30 20 0a 20 20 20 20 20  Failed==0 .     
1430: 26 26 20 28 44 62 4d 61 73 6b 4e 6f 6e 5a 65 72  && (DbMaskNonZer
1440: 6f 28 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65  o(pParse->cookie
1450: 4d 61 73 6b 29 20 7c 7c 20 70 50 61 72 73 65 2d  Mask) || pParse-
1460: 3e 70 43 6f 6e 73 74 45 78 70 72 29 0a 20 20 20  >pConstExpr).   
1470: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 44   ){.      int iD
1480: 62 2c 20 69 3b 0a 20 20 20 20 20 20 61 73 73 65  b, i;.      asse
1490: 72 74 28 20 73 71 6c 69 74 65 33 56 64 62 65 47  rt( sqlite3VdbeG
14a0: 65 74 4f 70 28 76 2c 20 30 29 2d 3e 6f 70 63 6f  etOp(v, 0)->opco
14b0: 64 65 3d 3d 4f 50 5f 49 6e 69 74 20 29 3b 0a 20  de==OP_Init );. 
14c0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
14d0: 4a 75 6d 70 48 65 72 65 28 76 2c 20 30 29 3b 0a  JumpHere(v, 0);.
14e0: 20 20 20 20 20 20 66 6f 72 28 69 44 62 3d 30 3b        for(iDb=0;
14f0: 20 69 44 62 3c 64 62 2d 3e 6e 44 62 3b 20 69 44   iDb<db->nDb; iD
1500: 62 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66  b++){.        if
1510: 28 20 44 62 4d 61 73 6b 54 65 73 74 28 70 50 61  ( DbMaskTest(pPa
1520: 72 73 65 2d 3e 63 6f 6f 6b 69 65 4d 61 73 6b 2c  rse->cookieMask,
1530: 20 69 44 62 29 3d 3d 30 20 29 20 63 6f 6e 74 69   iDb)==0 ) conti
1540: 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  nue;.        sql
1550: 69 74 65 33 56 64 62 65 55 73 65 73 42 74 72 65  ite3VdbeUsesBtre
1560: 65 28 76 2c 20 69 44 62 29 3b 0a 20 20 20 20 20  e(v, iDb);.     
1570: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1580: 64 4f 70 34 49 6e 74 28 76 2c 0a 20 20 20 20 20  dOp4Int(v,.     
1590: 20 20 20 20 20 4f 50 5f 54 72 61 6e 73 61 63 74       OP_Transact
15a0: 69 6f 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20  ion,            
15b0: 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 63 6f 64          /* Opcod
15c0: 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69  e */.          i
15d0: 44 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  Db,             
15e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15f0: 20 20 2f 2a 20 50 31 20 2a 2f 0a 20 20 20 20 20    /* P1 */.     
1600: 20 20 20 20 20 44 62 4d 61 73 6b 54 65 73 74 28       DbMaskTest(
1610: 70 50 61 72 73 65 2d 3e 77 72 69 74 65 4d 61 73  pParse->writeMas
1620: 6b 2c 69 44 62 29 2c 20 2f 2a 20 50 32 20 2a 2f  k,iDb), /* P2 */
1630: 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 72 73  .          pPars
1640: 65 2d 3e 63 6f 6f 6b 69 65 56 61 6c 75 65 5b 69  e->cookieValue[i
1650: 44 62 5d 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  Db],          /*
1660: 20 50 33 20 2a 2f 0a 20 20 20 20 20 20 20 20 20   P3 */.         
1670: 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53   db->aDb[iDb].pS
1680: 63 68 65 6d 61 2d 3e 69 47 65 6e 65 72 61 74 69  chema->iGenerati
1690: 6f 6e 20 20 2f 2a 20 50 34 20 2a 2f 0a 20 20 20  on  /* P4 */.   
16a0: 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20       );.        
16b0: 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73  if( db->init.bus
16c0: 79 3d 3d 30 20 29 20 73 71 6c 69 74 65 33 56 64  y==0 ) sqlite3Vd
16d0: 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 31 29  beChangeP5(v, 1)
16e0: 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f  ;.        VdbeCo
16f0: 6d 6d 65 6e 74 28 28 76 2c 0a 20 20 20 20 20 20  mment((v,.      
1700: 20 20 20 20 20 20 20 20 22 75 73 65 73 53 74 6d          "usesStm
1710: 74 4a 6f 75 72 6e 61 6c 3d 25 64 22 2c 20 70 50  tJournal=%d", pP
1720: 61 72 73 65 2d 3e 6d 61 79 41 62 6f 72 74 20 26  arse->mayAbort &
1730: 26 20 70 50 61 72 73 65 2d 3e 69 73 4d 75 6c 74  & pParse->isMult
1740: 69 57 72 69 74 65 29 29 3b 0a 20 20 20 20 20 20  iWrite));.      
1750: 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
1760: 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
1770: 4c 45 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  LE.      for(i=0
1780: 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e 56 74 61  ; i<pParse->nVta
1790: 62 4c 6f 63 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20  bLock; i++){.   
17a0: 20 20 20 20 20 63 68 61 72 20 2a 76 74 61 62 20       char *vtab 
17b0: 3d 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65  = (char *)sqlite
17c0: 33 47 65 74 56 54 61 62 6c 65 28 64 62 2c 20 70  3GetVTable(db, p
17d0: 50 61 72 73 65 2d 3e 61 70 56 74 61 62 4c 6f 63  Parse->apVtabLoc
17e0: 6b 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 73  k[i]);.        s
17f0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
1800: 28 76 2c 20 4f 50 5f 56 42 65 67 69 6e 2c 20 30  (v, OP_VBegin, 0
1810: 2c 20 30 2c 20 30 2c 20 76 74 61 62 2c 20 50 34  , 0, 0, vtab, P4
1820: 5f 56 54 41 42 29 3b 0a 20 20 20 20 20 20 7d 0a  _VTAB);.      }.
1830: 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 56        pParse->nV
1840: 74 61 62 4c 6f 63 6b 20 3d 20 30 3b 0a 23 65 6e  tabLock = 0;.#en
1850: 64 69 66 0a 0a 20 20 20 20 20 20 2f 2a 20 4f 6e  dif..      /* On
1860: 63 65 20 61 6c 6c 20 74 68 65 20 63 6f 6f 6b 69  ce all the cooki
1870: 65 73 20 68 61 76 65 20 62 65 65 6e 20 76 65 72  es have been ver
1880: 69 66 69 65 64 20 61 6e 64 20 74 72 61 6e 73 61  ified and transa
1890: 63 74 69 6f 6e 73 20 6f 70 65 6e 65 64 2c 20 0a  ctions opened, .
18a0: 20 20 20 20 20 20 2a 2a 20 6f 62 74 61 69 6e 20        ** obtain 
18b0: 74 68 65 20 72 65 71 75 69 72 65 64 20 74 61 62  the required tab
18c0: 6c 65 2d 6c 6f 63 6b 73 2e 20 54 68 69 73 20 69  le-locks. This i
18d0: 73 20 61 20 6e 6f 2d 6f 70 20 75 6e 6c 65 73 73  s a no-op unless
18e0: 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 73   the .      ** s
18f0: 68 61 72 65 64 2d 63 61 63 68 65 20 66 65 61 74  hared-cache feat
1900: 75 72 65 20 69 73 20 65 6e 61 62 6c 65 64 2e 0a  ure is enabled..
1910: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 63        */.      c
1920: 6f 64 65 54 61 62 6c 65 4c 6f 63 6b 73 28 70 50  odeTableLocks(pP
1930: 61 72 73 65 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  arse);..      /*
1940: 20 49 6e 69 74 69 61 6c 69 7a 65 20 61 6e 79 20   Initialize any 
1950: 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 20 64 61  AUTOINCREMENT da
1960: 74 61 20 73 74 72 75 63 74 75 72 65 73 20 72 65  ta structures re
1970: 71 75 69 72 65 64 2e 0a 20 20 20 20 20 20 2a 2f  quired..      */
1980: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 41 75  .      sqlite3Au
1990: 74 6f 69 6e 63 72 65 6d 65 6e 74 42 65 67 69 6e  toincrementBegin
19a0: 28 70 50 61 72 73 65 29 3b 0a 0a 20 20 20 20 20  (pParse);..     
19b0: 20 2f 2a 20 43 6f 64 65 20 63 6f 6e 73 74 61 6e   /* Code constan
19c0: 74 20 65 78 70 72 65 73 73 69 6f 6e 73 20 74 68  t expressions th
19d0: 61 74 20 77 68 65 72 65 20 66 61 63 74 6f 72 65  at where factore
19e0: 64 20 6f 75 74 20 6f 66 20 69 6e 6e 65 72 20 6c  d out of inner l
19f0: 6f 6f 70 73 20 2a 2f 0a 20 20 20 20 20 20 69 66  oops */.      if
1a00: 28 20 70 50 61 72 73 65 2d 3e 70 43 6f 6e 73 74  ( pParse->pConst
1a10: 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20  Expr ){.        
1a20: 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 20 3d 20  ExprList *pEL = 
1a30: 70 50 61 72 73 65 2d 3e 70 43 6f 6e 73 74 45 78  pParse->pConstEx
1a40: 70 72 3b 0a 20 20 20 20 20 20 20 20 70 50 61 72  pr;.        pPar
1a50: 73 65 2d 3e 6f 6b 43 6f 6e 73 74 46 61 63 74 6f  se->okConstFacto
1a60: 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 66  r = 0;.        f
1a70: 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c 2d 3e 6e  or(i=0; i<pEL->n
1a80: 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
1a90: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
1aa0: 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45  rCode(pParse, pE
1ab0: 4c 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 70  L->a[i].pExpr, p
1ac0: 45 4c 2d 3e 61 5b 69 5d 2e 75 2e 69 43 6f 6e 73  EL->a[i].u.iCons
1ad0: 74 45 78 70 72 52 65 67 29 3b 0a 20 20 20 20 20  tExprReg);.     
1ae0: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20     }.      }..  
1af0: 20 20 20 20 2f 2a 20 46 69 6e 61 6c 6c 79 2c 20      /* Finally, 
1b00: 6a 75 6d 70 20 62 61 63 6b 20 74 6f 20 74 68 65  jump back to the
1b10: 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68   beginning of th
1b20: 65 20 65 78 65 63 75 74 61 62 6c 65 20 63 6f 64  e executable cod
1b30: 65 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69  e. */.      sqli
1b40: 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 31  te3VdbeGoto(v, 1
1b50: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 0a 20  );.    }.  }... 
1b60: 20 2f 2a 20 47 65 74 20 74 68 65 20 56 44 42 45   /* Get the VDBE
1b70: 20 70 72 6f 67 72 61 6d 20 72 65 61 64 79 20 66   program ready f
1b80: 6f 72 20 65 78 65 63 75 74 69 6f 6e 0a 20 20 2a  or execution.  *
1b90: 2f 0a 20 20 69 66 28 20 76 20 26 26 20 70 50 61  /.  if( v && pPa
1ba0: 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 26 26 20  rse->nErr==0 && 
1bb0: 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  !db->mallocFaile
1bc0: 64 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  d ){.    assert(
1bd0: 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65 4c   pParse->iCacheL
1be0: 65 76 65 6c 3d 3d 30 20 29 3b 20 20 2f 2a 20 44  evel==0 );  /* D
1bf0: 69 73 61 62 6c 65 73 20 61 6e 64 20 72 65 2d 65  isables and re-e
1c00: 6e 61 62 6c 65 73 20 6d 61 74 63 68 20 2a 2f 0a  nables match */.
1c10: 20 20 20 20 2f 2a 20 41 20 6d 69 6e 69 6d 75 6d      /* A minimum
1c20: 20 6f 66 20 6f 6e 65 20 63 75 72 73 6f 72 20 69   of one cursor i
1c30: 73 20 72 65 71 75 69 72 65 64 20 69 66 20 61 75  s required if au
1c40: 74 6f 69 6e 63 72 65 6d 65 6e 74 20 69 73 20 75  toincrement is u
1c50: 73 65 64 0a 20 20 20 20 2a 20 20 53 65 65 20 74  sed.    *  See t
1c60: 69 63 6b 65 74 20 5b 61 36 39 36 33 37 39 63 31  icket [a696379c1
1c70: 66 30 38 38 36 36 5d 20 2a 2f 0a 20 20 20 20 69  f08866] */.    i
1c80: 66 28 20 70 50 61 72 73 65 2d 3e 70 41 69 6e 63  f( pParse->pAinc
1c90: 21 3d 30 20 26 26 20 70 50 61 72 73 65 2d 3e 6e  !=0 && pParse->n
1ca0: 54 61 62 3d 3d 30 20 29 20 70 50 61 72 73 65 2d  Tab==0 ) pParse-
1cb0: 3e 6e 54 61 62 20 3d 20 31 3b 0a 20 20 20 20 73  >nTab = 1;.    s
1cc0: 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 52 65  qlite3VdbeMakeRe
1cd0: 61 64 79 28 76 2c 20 70 50 61 72 73 65 29 3b 0a  ady(v, pParse);.
1ce0: 20 20 20 20 70 50 61 72 73 65 2d 3e 72 63 20 3d      pParse->rc =
1cf0: 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20   SQLITE_DONE;.  
1d00: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 72 73  }else{.    pPars
1d10: 65 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 45  e->rc = SQLITE_E
1d20: 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  RROR;.  }..  /* 
1d30: 57 65 20 61 72 65 20 64 6f 6e 65 20 77 69 74 68  We are done with
1d40: 20 74 68 69 73 20 50 61 72 73 65 20 6f 62 6a 65   this Parse obje
1d50: 63 74 2e 20 54 68 65 72 65 20 69 73 20 6e 6f 20  ct. There is no 
1d60: 6e 65 65 64 20 74 6f 20 64 65 2d 69 6e 69 74 69  need to de-initi
1d70: 61 6c 69 7a 65 20 69 74 20 2a 2f 0a 23 69 66 20  alize it */.#if 
1d80: 30 0a 20 20 70 50 61 72 73 65 2d 3e 63 6f 6c 4e  0.  pParse->colN
1d90: 61 6d 65 73 53 65 74 20 3d 20 30 3b 0a 20 20 70  amesSet = 0;.  p
1da0: 50 61 72 73 65 2d 3e 6e 54 61 62 20 3d 20 30 3b  Parse->nTab = 0;
1db0: 0a 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20  .  pParse->nMem 
1dc0: 3d 20 30 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e  = 0;.  pParse->n
1dd0: 53 65 74 20 3d 20 30 3b 0a 20 20 70 50 61 72 73  Set = 0;.  pPars
1de0: 65 2d 3e 6e 56 61 72 20 3d 20 30 3b 0a 20 20 44  e->nVar = 0;.  D
1df0: 62 4d 61 73 6b 5a 65 72 6f 28 70 50 61 72 73 65  bMaskZero(pParse
1e00: 2d 3e 63 6f 6f 6b 69 65 4d 61 73 6b 29 3b 0a 23  ->cookieMask);.#
1e10: 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  endif.}../*.** R
1e20: 75 6e 20 74 68 65 20 70 61 72 73 65 72 20 61 6e  un the parser an
1e30: 64 20 63 6f 64 65 20 67 65 6e 65 72 61 74 6f 72  d code generator
1e40: 20 72 65 63 75 72 73 69 76 65 6c 79 20 69 6e 20   recursively in 
1e50: 6f 72 64 65 72 20 74 6f 20 67 65 6e 65 72 61 74  order to generat
1e60: 65 0a 2a 2a 20 63 6f 64 65 20 66 6f 72 20 74 68  e.** code for th
1e70: 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20  e SQL statement 
1e80: 67 69 76 65 6e 20 6f 6e 74 6f 20 74 68 65 20 65  given onto the e
1e90: 6e 64 20 6f 66 20 74 68 65 20 70 50 61 72 73 65  nd of the pParse
1ea0: 20 63 6f 6e 74 65 78 74 0a 2a 2a 20 63 75 72 72   context.** curr
1eb0: 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73  ently under cons
1ec0: 74 72 75 63 74 69 6f 6e 2e 20 20 57 68 65 6e 20  truction.  When 
1ed0: 74 68 65 20 70 61 72 73 65 72 20 69 73 20 72 75  the parser is ru
1ee0: 6e 20 72 65 63 75 72 73 69 76 65 6c 79 0a 2a 2a  n recursively.**
1ef0: 20 74 68 69 73 20 77 61 79 2c 20 74 68 65 20 66   this way, the f
1f00: 69 6e 61 6c 20 4f 50 5f 48 61 6c 74 20 69 73 20  inal OP_Halt is 
1f10: 6e 6f 74 20 61 70 70 65 6e 64 65 64 20 61 6e 64  not appended and
1f20: 20 6f 74 68 65 72 20 69 6e 69 74 69 61 6c 69 7a   other initializ
1f30: 61 74 69 6f 6e 0a 2a 2a 20 61 6e 64 20 66 69 6e  ation.** and fin
1f40: 61 6c 69 7a 61 74 69 6f 6e 20 73 74 65 70 73 20  alization steps 
1f50: 61 72 65 20 6f 6d 69 74 74 65 64 20 62 65 63 61  are omitted beca
1f60: 75 73 65 20 74 68 6f 73 65 20 61 72 65 20 68 61  use those are ha
1f70: 6e 64 6c 69 6e 67 20 62 79 20 74 68 65 0a 2a 2a  ndling by the.**
1f80: 20 6f 75 74 65 72 6d 6f 73 74 20 70 61 72 73 65   outermost parse
1f90: 72 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 20 65 76 65  r..**.** Not eve
1fa0: 72 79 74 68 69 6e 67 20 69 73 20 6e 65 73 74 61  rything is nesta
1fb0: 62 6c 65 2e 20 20 54 68 69 73 20 66 61 63 69 6c  ble.  This facil
1fc0: 69 74 79 20 69 73 20 64 65 73 69 67 6e 65 64 20  ity is designed 
1fd0: 74 6f 20 70 65 72 6d 69 74 0a 2a 2a 20 49 4e 53  to permit.** INS
1fe0: 45 52 54 2c 20 55 50 44 41 54 45 2c 20 61 6e 64  ERT, UPDATE, and
1ff0: 20 44 45 4c 45 54 45 20 6f 70 65 72 61 74 69 6f   DELETE operatio
2000: 6e 73 20 61 67 61 69 6e 73 74 20 53 51 4c 49 54  ns against SQLIT
2010: 45 5f 4d 41 53 54 45 52 2e 20 20 55 73 65 0a 2a  E_MASTER.  Use.*
2020: 2a 20 63 61 72 65 20 69 66 20 79 6f 75 20 64 65  * care if you de
2030: 63 69 64 65 20 74 6f 20 74 72 79 20 74 6f 20 75  cide to try to u
2040: 73 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  se this routine 
2050: 66 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 20 70  for some other p
2060: 75 72 70 6f 73 65 73 2e 0a 2a 2f 0a 76 6f 69 64  urposes..*/.void
2070: 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61   sqlite3NestedPa
2080: 72 73 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  rse(Parse *pPars
2090: 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  e, const char *z
20a0: 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20  Format, ...){.  
20b0: 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 63 68  va_list ap;.  ch
20c0: 61 72 20 2a 7a 53 71 6c 3b 0a 20 20 63 68 61 72  ar *zSql;.  char
20d0: 20 2a 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20   *zErrMsg = 0;. 
20e0: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
20f0: 50 61 72 73 65 2d 3e 64 62 3b 0a 23 20 64 65 66  Parse->db;.# def
2100: 69 6e 65 20 53 41 56 45 5f 53 5a 20 20 28 73 69  ine SAVE_SZ  (si
2110: 7a 65 6f 66 28 50 61 72 73 65 29 20 2d 20 6f 66  zeof(Parse) - of
2120: 66 73 65 74 6f 66 28 50 61 72 73 65 2c 6e 56 61  fsetof(Parse,nVa
2130: 72 29 29 0a 20 20 63 68 61 72 20 73 61 76 65 42  r)).  char saveB
2140: 75 66 5b 53 41 56 45 5f 53 5a 5d 3b 0a 0a 20 20  uf[SAVE_SZ];..  
2150: 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  if( pParse->nErr
2160: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73   ) return;.  ass
2170: 65 72 74 28 20 70 50 61 72 73 65 2d 3e 6e 65 73  ert( pParse->nes
2180: 74 65 64 3c 31 30 20 29 3b 20 20 2f 2a 20 4e 65  ted<10 );  /* Ne
2190: 73 74 69 6e 67 20 73 68 6f 75 6c 64 20 6f 6e 6c  sting should onl
21a0: 79 20 62 65 20 6f 66 20 6c 69 6d 69 74 65 64 20  y be of limited 
21b0: 64 65 70 74 68 20 2a 2f 0a 20 20 76 61 5f 73 74  depth */.  va_st
21c0: 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61 74 29  art(ap, zFormat)
21d0: 3b 0a 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74  ;.  zSql = sqlit
21e0: 65 33 56 4d 50 72 69 6e 74 66 28 64 62 2c 20 7a  e3VMPrintf(db, z
21f0: 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20 76  Format, ap);.  v
2200: 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 69 66 28  a_end(ap);.  if(
2210: 20 7a 53 71 6c 3d 3d 30 20 29 7b 0a 20 20 20 20   zSql==0 ){.    
2220: 72 65 74 75 72 6e 3b 20 20 20 2f 2a 20 41 20 6d  return;   /* A m
2230: 61 6c 6c 6f 63 20 6d 75 73 74 20 68 61 76 65 20  alloc must have 
2240: 66 61 69 6c 65 64 20 2a 2f 0a 20 20 7d 0a 20 20  failed */.  }.  
2250: 70 50 61 72 73 65 2d 3e 6e 65 73 74 65 64 2b 2b  pParse->nested++
2260: 3b 0a 20 20 6d 65 6d 63 70 79 28 73 61 76 65 42  ;.  memcpy(saveB
2270: 75 66 2c 20 26 70 50 61 72 73 65 2d 3e 6e 56 61  uf, &pParse->nVa
2280: 72 2c 20 53 41 56 45 5f 53 5a 29 3b 0a 20 20 6d  r, SAVE_SZ);.  m
2290: 65 6d 73 65 74 28 26 70 50 61 72 73 65 2d 3e 6e  emset(&pParse->n
22a0: 56 61 72 2c 20 30 2c 20 53 41 56 45 5f 53 5a 29  Var, 0, SAVE_SZ)
22b0: 3b 0a 20 20 73 71 6c 69 74 65 33 52 75 6e 50 61  ;.  sqlite3RunPa
22c0: 72 73 65 72 28 70 50 61 72 73 65 2c 20 7a 53 71  rser(pParse, zSq
22d0: 6c 2c 20 26 7a 45 72 72 4d 73 67 29 3b 0a 20 20  l, &zErrMsg);.  
22e0: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
22f0: 2c 20 7a 45 72 72 4d 73 67 29 3b 0a 20 20 73 71  , zErrMsg);.  sq
2300: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
2310: 7a 53 71 6c 29 3b 0a 20 20 6d 65 6d 63 70 79 28  zSql);.  memcpy(
2320: 26 70 50 61 72 73 65 2d 3e 6e 56 61 72 2c 20 73  &pParse->nVar, s
2330: 61 76 65 42 75 66 2c 20 53 41 56 45 5f 53 5a 29  aveBuf, SAVE_SZ)
2340: 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 65 73 74  ;.  pParse->nest
2350: 65 64 2d 2d 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c  ed--;.}..#if SQL
2360: 49 54 45 5f 55 53 45 52 5f 41 55 54 48 45 4e 54  ITE_USER_AUTHENT
2370: 49 43 41 54 49 4f 4e 0a 2f 2a 0a 2a 2a 20 52 65  ICATION./*.** Re
2380: 74 75 72 6e 20 54 52 55 45 20 69 66 20 7a 54 61  turn TRUE if zTa
2390: 62 6c 65 20 69 73 20 74 68 65 20 6e 61 6d 65 20  ble is the name 
23a0: 6f 66 20 74 68 65 20 73 79 73 74 65 6d 20 74 61  of the system ta
23b0: 62 6c 65 20 74 68 61 74 20 73 74 6f 72 65 73 20  ble that stores 
23c0: 74 68 65 0a 2a 2a 20 6c 69 73 74 20 6f 66 20 75  the.** list of u
23d0: 73 65 72 73 20 61 6e 64 20 74 68 65 69 72 20 61  sers and their a
23e0: 63 63 65 73 73 20 63 72 65 64 65 6e 74 69 61 6c  ccess credential
23f0: 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  s..*/.int sqlite
2400: 33 55 73 65 72 41 75 74 68 54 61 62 6c 65 28 63  3UserAuthTable(c
2410: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62 6c  onst char *zTabl
2420: 65 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c  e){.  return sql
2430: 69 74 65 33 5f 73 74 72 69 63 6d 70 28 7a 54 61  ite3_stricmp(zTa
2440: 62 6c 65 2c 20 22 73 71 6c 69 74 65 5f 75 73 65  ble, "sqlite_use
2450: 72 22 29 3d 3d 30 3b 0a 7d 0a 23 65 6e 64 69 66  r")==0;.}.#endif
2460: 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61 74 65 20 74  ../*.** Locate t
2470: 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 73 74 72  he in-memory str
2480: 75 63 74 75 72 65 20 74 68 61 74 20 64 65 73 63  ucture that desc
2490: 72 69 62 65 73 20 61 20 70 61 72 74 69 63 75 6c  ribes a particul
24a0: 61 72 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 74  ar database.** t
24b0: 61 62 6c 65 20 67 69 76 65 6e 20 74 68 65 20 6e  able given the n
24c0: 61 6d 65 20 6f 66 20 74 68 61 74 20 74 61 62 6c  ame of that tabl
24d0: 65 20 61 6e 64 20 28 6f 70 74 69 6f 6e 61 6c 6c  e and (optionall
24e0: 79 29 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  y) the name of t
24f0: 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 63  he.** database c
2500: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 74 61  ontaining the ta
2510: 62 6c 65 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c  ble.  Return NUL
2520: 4c 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a  L if not found..
2530: 2a 2a 0a 2a 2a 20 49 66 20 7a 44 61 74 61 62 61  **.** If zDataba
2540: 73 65 20 69 73 20 30 2c 20 61 6c 6c 20 64 61 74  se is 0, all dat
2550: 61 62 61 73 65 73 20 61 72 65 20 73 65 61 72 63  abases are searc
2560: 68 65 64 20 66 6f 72 20 74 68 65 20 74 61 62 6c  hed for the tabl
2570: 65 20 61 6e 64 20 74 68 65 0a 2a 2a 20 66 69 72  e and the.** fir
2580: 73 74 20 6d 61 74 63 68 69 6e 67 20 74 61 62 6c  st matching tabl
2590: 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 20  e is returned.  
25a0: 28 4e 6f 20 63 68 65 63 6b 69 6e 67 20 66 6f 72  (No checking for
25b0: 20 64 75 70 6c 69 63 61 74 65 20 74 61 62 6c 65   duplicate table
25c0: 0a 2a 2a 20 6e 61 6d 65 73 20 69 73 20 64 6f 6e  .** names is don
25d0: 65 2e 29 20 20 54 68 65 20 73 65 61 72 63 68 20  e.)  The search 
25e0: 6f 72 64 65 72 20 69 73 20 54 45 4d 50 20 66 69  order is TEMP fi
25f0: 72 73 74 2c 20 74 68 65 6e 20 4d 41 49 4e 2c 20  rst, then MAIN, 
2600: 74 68 65 6e 20 61 6e 79 0a 2a 2a 20 61 75 78 69  then any.** auxi
2610: 6c 69 61 72 79 20 64 61 74 61 62 61 73 65 73 20  liary databases 
2620: 61 64 64 65 64 20 75 73 69 6e 67 20 74 68 65 20  added using the 
2630: 41 54 54 41 43 48 20 63 6f 6d 6d 61 6e 64 2e 0a  ATTACH command..
2640: 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20 73  **.** See also s
2650: 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62 6c  qlite3LocateTabl
2660: 65 28 29 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a 73  e()..*/.Table *s
2670: 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28  qlite3FindTable(
2680: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e  sqlite3 *db, con
2690: 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20  st char *zName, 
26a0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 61 74  const char *zDat
26b0: 61 62 61 73 65 29 7b 0a 20 20 54 61 62 6c 65 20  abase){.  Table 
26c0: 2a 70 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b  *p = 0;.  int i;
26d0: 0a 0a 20 20 2f 2a 20 41 6c 6c 20 6d 75 74 65 78  ..  /* All mutex
26e0: 65 73 20 61 72 65 20 72 65 71 75 69 72 65 64 20  es are required 
26f0: 66 6f 72 20 73 63 68 65 6d 61 20 61 63 63 65 73  for schema acces
2700: 73 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 77 65  s.  Make sure we
2710: 20 68 6f 6c 64 20 74 68 65 6d 2e 20 2a 2f 0a 20   hold them. */. 
2720: 20 61 73 73 65 72 74 28 20 7a 44 61 74 61 62 61   assert( zDataba
2730: 73 65 21 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33  se!=0 || sqlite3
2740: 42 74 72 65 65 48 6f 6c 64 73 41 6c 6c 4d 75 74  BtreeHoldsAllMut
2750: 65 78 65 73 28 64 62 29 20 29 3b 0a 23 69 66 20  exes(db) );.#if 
2760: 53 51 4c 49 54 45 5f 55 53 45 52 5f 41 55 54 48  SQLITE_USER_AUTH
2770: 45 4e 54 49 43 41 54 49 4f 4e 0a 20 20 2f 2a 20  ENTICATION.  /* 
2780: 4f 6e 6c 79 20 74 68 65 20 61 64 6d 69 6e 20 75  Only the admin u
2790: 73 65 72 20 69 73 20 61 6c 6c 6f 77 65 64 20 74  ser is allowed t
27a0: 6f 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65 20  o know that the 
27b0: 73 71 6c 69 74 65 5f 75 73 65 72 20 74 61 62 6c  sqlite_user tabl
27c0: 65 0a 20 20 2a 2a 20 65 78 69 73 74 73 20 2a 2f  e.  ** exists */
27d0: 0a 20 20 69 66 28 20 64 62 2d 3e 61 75 74 68 2e  .  if( db->auth.
27e0: 61 75 74 68 4c 65 76 65 6c 3c 55 41 55 54 48 5f  authLevel<UAUTH_
27f0: 41 64 6d 69 6e 20 26 26 20 73 71 6c 69 74 65 33  Admin && sqlite3
2800: 55 73 65 72 41 75 74 68 54 61 62 6c 65 28 7a 4e  UserAuthTable(zN
2810: 61 6d 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 72  ame)!=0 ){.    r
2820: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 23 65 6e  eturn 0;.  }.#en
2830: 64 69 66 0a 20 20 66 6f 72 28 69 3d 4f 4d 49 54  dif.  for(i=OMIT
2840: 5f 54 45 4d 50 44 42 3b 20 69 3c 64 62 2d 3e 6e  _TEMPDB; i<db->n
2850: 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e  Db; i++){.    in
2860: 74 20 6a 20 3d 20 28 69 3c 32 29 20 3f 20 69 5e  t j = (i<2) ? i^
2870: 31 20 3a 20 69 3b 20 20 20 2f 2a 20 53 65 61 72  1 : i;   /* Sear
2880: 63 68 20 54 45 4d 50 20 62 65 66 6f 72 65 20 4d  ch TEMP before M
2890: 41 49 4e 20 2a 2f 0a 20 20 20 20 69 66 28 20 7a  AIN */.    if( z
28a0: 44 61 74 61 62 61 73 65 21 3d 30 20 26 26 20 73  Database!=0 && s
28b0: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 44  qlite3StrICmp(zD
28c0: 61 74 61 62 61 73 65 2c 20 64 62 2d 3e 61 44 62  atabase, db->aDb
28d0: 5b 6a 5d 2e 7a 4e 61 6d 65 29 20 29 20 63 6f 6e  [j].zName) ) con
28e0: 74 69 6e 75 65 3b 0a 20 20 20 20 61 73 73 65 72  tinue;.    asser
28f0: 74 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61  t( sqlite3Schema
2900: 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20 6a 2c  MutexHeld(db, j,
2910: 20 30 29 20 29 3b 0a 20 20 20 20 70 20 3d 20 73   0) );.    p = s
2920: 71 6c 69 74 65 33 48 61 73 68 46 69 6e 64 28 26  qlite3HashFind(&
2930: 64 62 2d 3e 61 44 62 5b 6a 5d 2e 70 53 63 68 65  db->aDb[j].pSche
2940: 6d 61 2d 3e 74 62 6c 48 61 73 68 2c 20 7a 4e 61  ma->tblHash, zNa
2950: 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 70 20 29  me);.    if( p )
2960: 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65   break;.  }.  re
2970: 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn p;.}../*.**
2980: 20 4c 6f 63 61 74 65 20 74 68 65 20 69 6e 2d 6d   Locate the in-m
2990: 65 6d 6f 72 79 20 73 74 72 75 63 74 75 72 65 20  emory structure 
29a0: 74 68 61 74 20 64 65 73 63 72 69 62 65 73 20 61  that describes a
29b0: 20 70 61 72 74 69 63 75 6c 61 72 20 64 61 74 61   particular data
29c0: 62 61 73 65 0a 2a 2a 20 74 61 62 6c 65 20 67 69  base.** table gi
29d0: 76 65 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  ven the name of 
29e0: 74 68 61 74 20 74 61 62 6c 65 20 61 6e 64 20 28  that table and (
29f0: 6f 70 74 69 6f 6e 61 6c 6c 79 29 20 74 68 65 20  optionally) the 
2a00: 6e 61 6d 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64  name of the.** d
2a10: 61 74 61 62 61 73 65 20 63 6f 6e 74 61 69 6e 69  atabase containi
2a20: 6e 67 20 74 68 65 20 74 61 62 6c 65 2e 20 20 52  ng the table.  R
2a30: 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 6e 6f  eturn NULL if no
2a40: 74 20 66 6f 75 6e 64 2e 20 20 41 6c 73 6f 20 6c  t found.  Also l
2a50: 65 61 76 65 20 61 6e 0a 2a 2a 20 65 72 72 6f 72  eave an.** error
2a60: 20 6d 65 73 73 61 67 65 20 69 6e 20 70 50 61 72   message in pPar
2a70: 73 65 2d 3e 7a 45 72 72 4d 73 67 2e 0a 2a 2a 0a  se->zErrMsg..**.
2a80: 2a 2a 20 54 68 65 20 64 69 66 66 65 72 65 6e 63  ** The differenc
2a90: 65 20 62 65 74 77 65 65 6e 20 74 68 69 73 20 72  e between this r
2aa0: 6f 75 74 69 6e 65 20 61 6e 64 20 73 71 6c 69 74  outine and sqlit
2ab0: 65 33 46 69 6e 64 54 61 62 6c 65 28 29 20 69 73  e3FindTable() is
2ac0: 20 74 68 61 74 20 74 68 69 73 0a 2a 2a 20 72 6f   that this.** ro
2ad0: 75 74 69 6e 65 20 6c 65 61 76 65 73 20 61 6e 20  utine leaves an 
2ae0: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e  error message in
2af0: 20 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67   pParse->zErrMsg
2b00: 20 77 68 65 72 65 0a 2a 2a 20 73 71 6c 69 74 65   where.** sqlite
2b10: 33 46 69 6e 64 54 61 62 6c 65 28 29 20 64 6f 65  3FindTable() doe
2b20: 73 20 6e 6f 74 2e 0a 2a 2f 0a 54 61 62 6c 65 20  s not..*/.Table 
2b30: 2a 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61  *sqlite3LocateTa
2b40: 62 6c 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ble(.  Parse *pP
2b50: 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 2f 2a  arse,         /*
2b60: 20 63 6f 6e 74 65 78 74 20 69 6e 20 77 68 69 63   context in whic
2b70: 68 20 74 6f 20 72 65 70 6f 72 74 20 65 72 72 6f  h to report erro
2b80: 72 73 20 2a 2f 0a 20 20 69 6e 74 20 69 73 56 69  rs */.  int isVi
2b90: 65 77 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  ew,            /
2ba0: 2a 20 54 72 75 65 20 69 66 20 6c 6f 6f 6b 69 6e  * True if lookin
2bb0: 67 20 66 6f 72 20 61 20 56 49 45 57 20 72 61 74  g for a VIEW rat
2bc0: 68 65 72 20 74 68 61 6e 20 61 20 54 41 42 4c 45  her than a TABLE
2bd0: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
2be0: 20 2a 7a 4e 61 6d 65 2c 20 20 20 20 20 2f 2a 20   *zName,     /* 
2bf0: 4e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c  Name of the tabl
2c00: 65 20 77 65 20 61 72 65 20 6c 6f 6f 6b 69 6e 67  e we are looking
2c10: 20 66 6f 72 20 2a 2f 0a 20 20 63 6f 6e 73 74 20   for */.  const 
2c20: 63 68 61 72 20 2a 7a 44 62 61 73 65 20 20 20 20  char *zDbase    
2c30: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
2c40: 64 61 74 61 62 61 73 65 2e 20 20 4d 69 67 68 74  database.  Might
2c50: 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20   be NULL */.){. 
2c60: 20 54 61 62 6c 65 20 2a 70 3b 0a 0a 20 20 2f 2a   Table *p;..  /*
2c70: 20 52 65 61 64 20 74 68 65 20 64 61 74 61 62 61   Read the databa
2c80: 73 65 20 73 63 68 65 6d 61 2e 20 49 66 20 61 6e  se schema. If an
2c90: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 6c   error occurs, l
2ca0: 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65  eave an error me
2cb0: 73 73 61 67 65 0a 20 20 2a 2a 20 61 6e 64 20 63  ssage.  ** and c
2cc0: 6f 64 65 20 69 6e 20 70 50 61 72 73 65 20 61 6e  ode in pParse an
2cd0: 64 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 20 2a  d return NULL. *
2ce0: 2f 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f  /.  if( SQLITE_O
2cf0: 4b 21 3d 73 71 6c 69 74 65 33 52 65 61 64 53 63  K!=sqlite3ReadSc
2d00: 68 65 6d 61 28 70 50 61 72 73 65 29 20 29 7b 0a  hema(pParse) ){.
2d10: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
2d20: 7d 0a 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33  }..  p = sqlite3
2d30: 46 69 6e 64 54 61 62 6c 65 28 70 50 61 72 73 65  FindTable(pParse
2d40: 2d 3e 64 62 2c 20 7a 4e 61 6d 65 2c 20 7a 44 62  ->db, zName, zDb
2d50: 61 73 65 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30  ase);.  if( p==0
2d60: 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68   ){.    const ch
2d70: 61 72 20 2a 7a 4d 73 67 20 3d 20 69 73 56 69 65  ar *zMsg = isVie
2d80: 77 20 3f 20 22 6e 6f 20 73 75 63 68 20 76 69 65  w ? "no such vie
2d90: 77 22 20 3a 20 22 6e 6f 20 73 75 63 68 20 74 61  w" : "no such ta
2da0: 62 6c 65 22 3b 0a 23 69 66 6e 64 65 66 20 53 51  ble";.#ifndef SQ
2db0: 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
2dc0: 4c 54 41 42 4c 45 0a 20 20 20 20 69 66 28 20 73  LTABLE.    if( s
2dd0: 71 6c 69 74 65 33 46 69 6e 64 44 62 4e 61 6d 65  qlite3FindDbName
2de0: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 7a 44 62  (pParse->db, zDb
2df0: 61 73 65 29 3c 31 20 29 7b 0a 20 20 20 20 20 20  ase)<1 ){.      
2e00: 2f 2a 20 49 66 20 7a 4e 61 6d 65 20 69 73 20 74  /* If zName is t
2e10: 68 65 20 6e 6f 74 20 74 68 65 20 6e 61 6d 65 20  he not the name 
2e20: 6f 66 20 61 20 74 61 62 6c 65 20 69 6e 20 74 68  of a table in th
2e30: 65 20 73 63 68 65 6d 61 20 63 72 65 61 74 65 64  e schema created
2e40: 20 75 73 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20   using.      ** 
2e50: 43 52 45 41 54 45 2c 20 74 68 65 6e 20 63 68 65  CREATE, then che
2e60: 63 6b 20 74 6f 20 73 65 65 20 69 66 20 69 74 20  ck to see if it 
2e70: 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61  is the name of a
2e80: 6e 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20  n virtual table 
2e90: 74 68 61 74 0a 20 20 20 20 20 20 2a 2a 20 63 61  that.      ** ca
2ea0: 6e 20 62 65 20 61 6e 20 65 70 6f 6e 79 6d 6f 75  n be an eponymou
2eb0: 73 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e  s virtual table.
2ec0: 20 2a 2f 0a 20 20 20 20 20 20 4d 6f 64 75 6c 65   */.      Module
2ed0: 20 2a 70 4d 6f 64 20 3d 20 28 4d 6f 64 75 6c 65   *pMod = (Module
2ee0: 2a 29 73 71 6c 69 74 65 33 48 61 73 68 46 69 6e  *)sqlite3HashFin
2ef0: 64 28 26 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61  d(&pParse->db->a
2f00: 4d 6f 64 75 6c 65 2c 20 7a 4e 61 6d 65 29 3b 0a  Module, zName);.
2f10: 20 20 20 20 20 20 69 66 28 20 70 4d 6f 64 20 26        if( pMod &
2f20: 26 20 73 71 6c 69 74 65 33 56 74 61 62 45 70 6f  & sqlite3VtabEpo
2f30: 6e 79 6d 6f 75 73 54 61 62 6c 65 49 6e 69 74 28  nymousTableInit(
2f40: 70 50 61 72 73 65 2c 20 70 4d 6f 64 29 20 29 7b  pParse, pMod) ){
2f50: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
2f60: 70 4d 6f 64 2d 3e 70 45 70 6f 54 61 62 3b 0a 20  pMod->pEpoTab;. 
2f70: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e       }.    }.#en
2f80: 64 69 66 0a 20 20 20 20 69 66 28 20 7a 44 62 61  dif.    if( zDba
2f90: 73 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  se ){.      sqli
2fa0: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
2fb0: 73 65 2c 20 22 25 73 3a 20 25 73 2e 25 73 22 2c  se, "%s: %s.%s",
2fc0: 20 7a 4d 73 67 2c 20 7a 44 62 61 73 65 2c 20 7a   zMsg, zDbase, z
2fd0: 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65  Name);.    }else
2fe0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
2ff0: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
3000: 22 25 73 3a 20 25 73 22 2c 20 7a 4d 73 67 2c 20  "%s: %s", zMsg, 
3010: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20  zName);.    }.  
3020: 20 20 70 50 61 72 73 65 2d 3e 63 68 65 63 6b 53    pParse->checkS
3030: 63 68 65 6d 61 20 3d 20 31 3b 0a 20 20 7d 0a 0a  chema = 1;.  }..
3040: 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f    return p;.}../
3050: 2a 0a 2a 2a 20 4c 6f 63 61 74 65 20 74 68 65 20  *.** Locate the 
3060: 74 61 62 6c 65 20 69 64 65 6e 74 69 66 69 65 64  table identified
3070: 20 62 79 20 2a 70 2e 0a 2a 2a 0a 2a 2a 20 54 68   by *p..**.** Th
3080: 69 73 20 69 73 20 61 20 77 72 61 70 70 65 72 20  is is a wrapper 
3090: 61 72 6f 75 6e 64 20 73 71 6c 69 74 65 33 4c 6f  around sqlite3Lo
30a0: 63 61 74 65 54 61 62 6c 65 28 29 2e 20 54 68 65  cateTable(). The
30b0: 20 64 69 66 66 65 72 65 6e 63 65 20 62 65 74 77   difference betw
30c0: 65 65 6e 0a 2a 2a 20 73 71 6c 69 74 65 33 4c 6f  een.** sqlite3Lo
30d0: 63 61 74 65 54 61 62 6c 65 28 29 20 61 6e 64 20  cateTable() and 
30e0: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
30f0: 20 74 68 61 74 20 74 68 69 73 20 66 75 6e 63 74   that this funct
3100: 69 6f 6e 20 72 65 73 74 72 69 63 74 73 0a 2a 2a  ion restricts.**
3110: 20 74 68 65 20 73 65 61 72 63 68 20 74 6f 20 73   the search to s
3120: 63 68 65 6d 61 20 28 70 2d 3e 70 53 63 68 65 6d  chema (p->pSchem
3130: 61 29 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20  a) if it is not 
3140: 4e 55 4c 4c 2e 20 70 2d 3e 70 53 63 68 65 6d 61  NULL. p->pSchema
3150: 20 6d 61 79 20 62 65 0a 2a 2a 20 6e 6f 6e 2d 4e   may be.** non-N
3160: 55 4c 4c 20 69 66 20 69 74 20 69 73 20 70 61 72  ULL if it is par
3170: 74 20 6f 66 20 61 20 76 69 65 77 20 6f 72 20 74  t of a view or t
3180: 72 69 67 67 65 72 20 70 72 6f 67 72 61 6d 20 64  rigger program d
3190: 65 66 69 6e 69 74 69 6f 6e 2e 20 53 65 65 0a 2a  efinition. See.*
31a0: 2a 20 73 71 6c 69 74 65 33 46 69 78 53 72 63 4c  * sqlite3FixSrcL
31b0: 69 73 74 28 29 20 66 6f 72 20 64 65 74 61 69 6c  ist() for detail
31c0: 73 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a 73 71 6c  s..*/.Table *sql
31d0: 69 74 65 33 4c 6f 63 61 74 65 54 61 62 6c 65 49  ite3LocateTableI
31e0: 74 65 6d 28 0a 20 20 50 61 72 73 65 20 2a 70 50  tem(.  Parse *pP
31f0: 61 72 73 65 2c 20 0a 20 20 69 6e 74 20 69 73 56  arse, .  int isV
3200: 69 65 77 2c 20 0a 20 20 73 74 72 75 63 74 20 53  iew, .  struct S
3210: 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 0a 29  rcList_item *p.)
3220: 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  {.  const char *
3230: 7a 44 62 3b 0a 20 20 61 73 73 65 72 74 28 20 70  zDb;.  assert( p
3240: 2d 3e 70 53 63 68 65 6d 61 3d 3d 30 20 7c 7c 20  ->pSchema==0 || 
3250: 70 2d 3e 7a 44 61 74 61 62 61 73 65 3d 3d 30 20  p->zDatabase==0 
3260: 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 53 63 68  );.  if( p->pSch
3270: 65 6d 61 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  ema ){.    int i
3280: 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65  Db = sqlite3Sche
3290: 6d 61 54 6f 49 6e 64 65 78 28 70 50 61 72 73 65  maToIndex(pParse
32a0: 2d 3e 64 62 2c 20 70 2d 3e 70 53 63 68 65 6d 61  ->db, p->pSchema
32b0: 29 3b 0a 20 20 20 20 7a 44 62 20 3d 20 70 50 61  );.    zDb = pPa
32c0: 72 73 65 2d 3e 64 62 2d 3e 61 44 62 5b 69 44 62  rse->db->aDb[iDb
32d0: 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 7d 65 6c 73 65  ].zName;.  }else
32e0: 7b 0a 20 20 20 20 7a 44 62 20 3d 20 70 2d 3e 7a  {.    zDb = p->z
32f0: 44 61 74 61 62 61 73 65 3b 0a 20 20 7d 0a 20 20  Database;.  }.  
3300: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 4c 6f  return sqlite3Lo
3310: 63 61 74 65 54 61 62 6c 65 28 70 50 61 72 73 65  cateTable(pParse
3320: 2c 20 69 73 56 69 65 77 2c 20 70 2d 3e 7a 4e 61  , isView, p->zNa
3330: 6d 65 2c 20 7a 44 62 29 3b 0a 7d 0a 0a 2f 2a 0a  me, zDb);.}../*.
3340: 2a 2a 20 4c 6f 63 61 74 65 20 74 68 65 20 69 6e  ** Locate the in
3350: 2d 6d 65 6d 6f 72 79 20 73 74 72 75 63 74 75 72  -memory structur
3360: 65 20 74 68 61 74 20 64 65 73 63 72 69 62 65 73  e that describes
3370: 20 0a 2a 2a 20 61 20 70 61 72 74 69 63 75 6c 61   .** a particula
3380: 72 20 69 6e 64 65 78 20 67 69 76 65 6e 20 74 68  r index given th
3390: 65 20 6e 61 6d 65 20 6f 66 20 74 68 61 74 20 69  e name of that i
33a0: 6e 64 65 78 0a 2a 2a 20 61 6e 64 20 74 68 65 20  ndex.** and the 
33b0: 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61  name of the data
33c0: 62 61 73 65 20 74 68 61 74 20 63 6f 6e 74 61 69  base that contai
33d0: 6e 73 20 74 68 65 20 69 6e 64 65 78 2e 0a 2a 2a  ns the index..**
33e0: 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20   Return NULL if 
33f0: 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2a 0a 2a 2a  not found..**.**
3400: 20 49 66 20 7a 44 61 74 61 62 61 73 65 20 69 73   If zDatabase is
3410: 20 30 2c 20 61 6c 6c 20 64 61 74 61 62 61 73 65   0, all database
3420: 73 20 61 72 65 20 73 65 61 72 63 68 65 64 20 66  s are searched f
3430: 6f 72 20 74 68 65 0a 2a 2a 20 74 61 62 6c 65 20  or the.** table 
3440: 61 6e 64 20 74 68 65 20 66 69 72 73 74 20 6d 61  and the first ma
3450: 74 63 68 69 6e 67 20 69 6e 64 65 78 20 69 73 20  tching index is 
3460: 72 65 74 75 72 6e 65 64 2e 20 20 28 4e 6f 20 63  returned.  (No c
3470: 68 65 63 6b 69 6e 67 0a 2a 2a 20 66 6f 72 20 64  hecking.** for d
3480: 75 70 6c 69 63 61 74 65 20 69 6e 64 65 78 20 6e  uplicate index n
3490: 61 6d 65 73 20 69 73 20 64 6f 6e 65 2e 29 20 20  ames is done.)  
34a0: 54 68 65 20 73 65 61 72 63 68 20 6f 72 64 65 72  The search order
34b0: 20 69 73 0a 2a 2a 20 54 45 4d 50 20 66 69 72 73   is.** TEMP firs
34c0: 74 2c 20 74 68 65 6e 20 4d 41 49 4e 2c 20 74 68  t, then MAIN, th
34d0: 65 6e 20 61 6e 79 20 61 75 78 69 6c 69 61 72 79  en any auxiliary
34e0: 20 64 61 74 61 62 61 73 65 73 20 61 64 64 65 64   databases added
34f0: 0a 2a 2a 20 75 73 69 6e 67 20 74 68 65 20 41 54  .** using the AT
3500: 54 41 43 48 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2f  TACH command..*/
3510: 0a 49 6e 64 65 78 20 2a 73 71 6c 69 74 65 33 46  .Index *sqlite3F
3520: 69 6e 64 49 6e 64 65 78 28 73 71 6c 69 74 65 33  indIndex(sqlite3
3530: 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68 61 72   *db, const char
3540: 20 2a 7a 4e 61 6d 65 2c 20 63 6f 6e 73 74 20 63   *zName, const c
3550: 68 61 72 20 2a 7a 44 62 29 7b 0a 20 20 49 6e 64  har *zDb){.  Ind
3560: 65 78 20 2a 70 20 3d 20 30 3b 0a 20 20 69 6e 74  ex *p = 0;.  int
3570: 20 69 3b 0a 20 20 2f 2a 20 41 6c 6c 20 6d 75 74   i;.  /* All mut
3580: 65 78 65 73 20 61 72 65 20 72 65 71 75 69 72 65  exes are require
3590: 64 20 66 6f 72 20 73 63 68 65 6d 61 20 61 63 63  d for schema acc
35a0: 65 73 73 2e 20 20 4d 61 6b 65 20 73 75 72 65 20  ess.  Make sure 
35b0: 77 65 20 68 6f 6c 64 20 74 68 65 6d 2e 20 2a 2f  we hold them. */
35c0: 0a 20 20 61 73 73 65 72 74 28 20 7a 44 62 21 3d  .  assert( zDb!=
35d0: 30 20 7c 7c 20 73 71 6c 69 74 65 33 42 74 72 65  0 || sqlite3Btre
35e0: 65 48 6f 6c 64 73 41 6c 6c 4d 75 74 65 78 65 73  eHoldsAllMutexes
35f0: 28 64 62 29 20 29 3b 0a 20 20 66 6f 72 28 69 3d  (db) );.  for(i=
3600: 4f 4d 49 54 5f 54 45 4d 50 44 42 3b 20 69 3c 64  OMIT_TEMPDB; i<d
3610: 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20  b->nDb; i++){.  
3620: 20 20 69 6e 74 20 6a 20 3d 20 28 69 3c 32 29 20    int j = (i<2) 
3630: 3f 20 69 5e 31 20 3a 20 69 3b 20 20 2f 2a 20 53  ? i^1 : i;  /* S
3640: 65 61 72 63 68 20 54 45 4d 50 20 62 65 66 6f 72  earch TEMP befor
3650: 65 20 4d 41 49 4e 20 2a 2f 0a 20 20 20 20 53 63  e MAIN */.    Sc
3660: 68 65 6d 61 20 2a 70 53 63 68 65 6d 61 20 3d 20  hema *pSchema = 
3670: 64 62 2d 3e 61 44 62 5b 6a 5d 2e 70 53 63 68 65  db->aDb[j].pSche
3680: 6d 61 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ma;.    assert( 
3690: 70 53 63 68 65 6d 61 20 29 3b 0a 20 20 20 20 69  pSchema );.    i
36a0: 66 28 20 7a 44 62 20 26 26 20 73 71 6c 69 74 65  f( zDb && sqlite
36b0: 33 53 74 72 49 43 6d 70 28 7a 44 62 2c 20 64 62  3StrICmp(zDb, db
36c0: 2d 3e 61 44 62 5b 6a 5d 2e 7a 4e 61 6d 65 29 20  ->aDb[j].zName) 
36d0: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
36e0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 53  assert( sqlite3S
36f0: 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64  chemaMutexHeld(d
3700: 62 2c 20 6a 2c 20 30 29 20 29 3b 0a 20 20 20 20  b, j, 0) );.    
3710: 70 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68 46  p = sqlite3HashF
3720: 69 6e 64 28 26 70 53 63 68 65 6d 61 2d 3e 69 64  ind(&pSchema->id
3730: 78 48 61 73 68 2c 20 7a 4e 61 6d 65 29 3b 0a 20  xHash, zName);. 
3740: 20 20 20 69 66 28 20 70 20 29 20 62 72 65 61 6b     if( p ) break
3750: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
3760: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6c 61  ;.}../*.** Recla
3770: 69 6d 20 74 68 65 20 6d 65 6d 6f 72 79 20 75 73  im the memory us
3780: 65 64 20 62 79 20 61 6e 20 69 6e 64 65 78 0a 2a  ed by an index.*
3790: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 72  /.static void fr
37a0: 65 65 49 6e 64 65 78 28 73 71 6c 69 74 65 33 20  eeIndex(sqlite3 
37b0: 2a 64 62 2c 20 49 6e 64 65 78 20 2a 70 29 7b 0a  *db, Index *p){.
37c0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
37d0: 4d 49 54 5f 41 4e 41 4c 59 5a 45 0a 20 20 73 71  MIT_ANALYZE.  sq
37e0: 6c 69 74 65 33 44 65 6c 65 74 65 49 6e 64 65 78  lite3DeleteIndex
37f0: 53 61 6d 70 6c 65 73 28 64 62 2c 20 70 29 3b 0a  Samples(db, p);.
3800: 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33  #endif.  sqlite3
3810: 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70  ExprDelete(db, p
3820: 2d 3e 70 50 61 72 74 49 64 78 57 68 65 72 65 29  ->pPartIdxWhere)
3830: 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c  ;.  sqlite3ExprL
3840: 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d  istDelete(db, p-
3850: 3e 61 43 6f 6c 45 78 70 72 29 3b 0a 20 20 73 71  >aColExpr);.  sq
3860: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
3870: 70 2d 3e 7a 43 6f 6c 41 66 66 29 3b 0a 20 20 69  p->zColAff);.  i
3880: 66 28 20 70 2d 3e 69 73 52 65 73 69 7a 65 64 20  f( p->isResized 
3890: 29 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28  ) sqlite3DbFree(
38a0: 64 62 2c 20 28 76 6f 69 64 20 2a 29 70 2d 3e 61  db, (void *)p->a
38b0: 7a 43 6f 6c 6c 29 3b 0a 23 69 66 64 65 66 20 53  zColl);.#ifdef S
38c0: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41  QLITE_ENABLE_STA
38d0: 54 33 5f 4f 52 5f 53 54 41 54 34 0a 20 20 73 71  T3_OR_STAT4.  sq
38e0: 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 61 69  lite3_free(p->ai
38f0: 52 6f 77 45 73 74 29 3b 0a 23 65 6e 64 69 66 0a  RowEst);.#endif.
3900: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
3910: 64 62 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  db, p);.}../*.**
3920: 20 46 6f 72 20 74 68 65 20 69 6e 64 65 78 20 63   For the index c
3930: 61 6c 6c 65 64 20 7a 49 64 78 4e 61 6d 65 20 77  alled zIdxName w
3940: 68 69 63 68 20 69 73 20 66 6f 75 6e 64 20 69 6e  hich is found in
3950: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 44   the database iD
3960: 62 2c 0a 2a 2a 20 75 6e 6c 69 6b 65 20 74 68 61  b,.** unlike tha
3970: 74 20 69 6e 64 65 78 20 66 72 6f 6d 20 69 74 73  t index from its
3980: 20 54 61 62 6c 65 20 74 68 65 6e 20 72 65 6d 6f   Table then remo
3990: 76 65 20 74 68 65 20 69 6e 64 65 78 20 66 72 6f  ve the index fro
39a0: 6d 0a 2a 2a 20 74 68 65 20 69 6e 64 65 78 20 68  m.** the index h
39b0: 61 73 68 20 74 61 62 6c 65 20 61 6e 64 20 66 72  ash table and fr
39c0: 65 65 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 73 74  ee all memory st
39d0: 72 75 63 74 75 72 65 73 20 61 73 73 6f 63 69 61  ructures associa
39e0: 74 65 64 0a 2a 2a 20 77 69 74 68 20 74 68 65 20  ted.** with the 
39f0: 69 6e 64 65 78 2e 0a 2a 2f 0a 76 6f 69 64 20 73  index..*/.void s
3a00: 71 6c 69 74 65 33 55 6e 6c 69 6e 6b 41 6e 64 44  qlite3UnlinkAndD
3a10: 65 6c 65 74 65 49 6e 64 65 78 28 73 71 6c 69 74  eleteIndex(sqlit
3a20: 65 33 20 2a 64 62 2c 20 69 6e 74 20 69 44 62 2c  e3 *db, int iDb,
3a30: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 64   const char *zId
3a40: 78 4e 61 6d 65 29 7b 0a 20 20 49 6e 64 65 78 20  xName){.  Index 
3a50: 2a 70 49 6e 64 65 78 3b 0a 20 20 48 61 73 68 20  *pIndex;.  Hash 
3a60: 2a 70 48 61 73 68 3b 0a 0a 20 20 61 73 73 65 72  *pHash;..  asser
3a70: 74 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61  t( sqlite3Schema
3a80: 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20 69 44  MutexHeld(db, iD
3a90: 62 2c 20 30 29 20 29 3b 0a 20 20 70 48 61 73 68  b, 0) );.  pHash
3aa0: 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d   = &db->aDb[iDb]
3ab0: 2e 70 53 63 68 65 6d 61 2d 3e 69 64 78 48 61 73  .pSchema->idxHas
3ac0: 68 3b 0a 20 20 70 49 6e 64 65 78 20 3d 20 73 71  h;.  pIndex = sq
3ad0: 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72 74 28  lite3HashInsert(
3ae0: 70 48 61 73 68 2c 20 7a 49 64 78 4e 61 6d 65 2c  pHash, zIdxName,
3af0: 20 30 29 3b 0a 20 20 69 66 28 20 41 4c 57 41 59   0);.  if( ALWAY
3b00: 53 28 70 49 6e 64 65 78 29 20 29 7b 0a 20 20 20  S(pIndex) ){.   
3b10: 20 69 66 28 20 70 49 6e 64 65 78 2d 3e 70 54 61   if( pIndex->pTa
3b20: 62 6c 65 2d 3e 70 49 6e 64 65 78 3d 3d 70 49 6e  ble->pIndex==pIn
3b30: 64 65 78 20 29 7b 0a 20 20 20 20 20 20 70 49 6e  dex ){.      pIn
3b40: 64 65 78 2d 3e 70 54 61 62 6c 65 2d 3e 70 49 6e  dex->pTable->pIn
3b50: 64 65 78 20 3d 20 70 49 6e 64 65 78 2d 3e 70 4e  dex = pIndex->pN
3b60: 65 78 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ext;.    }else{.
3b70: 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70 3b 0a        Index *p;.
3b80: 20 20 20 20 20 20 2f 2a 20 4a 75 73 74 69 66 69        /* Justifi
3b90: 63 61 74 69 6f 6e 20 6f 66 20 41 4c 57 41 59 53  cation of ALWAYS
3ba0: 28 29 3b 20 20 54 68 65 20 69 6e 64 65 78 20 6d  ();  The index m
3bb0: 75 73 74 20 62 65 20 6f 6e 20 74 68 65 20 6c 69  ust be on the li
3bc0: 73 74 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20 69  st of.      ** i
3bd0: 6e 64 69 63 65 73 2e 20 2a 2f 0a 20 20 20 20 20  ndices. */.     
3be0: 20 70 20 3d 20 70 49 6e 64 65 78 2d 3e 70 54 61   p = pIndex->pTa
3bf0: 62 6c 65 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20  ble->pIndex;.   
3c00: 20 20 20 77 68 69 6c 65 28 20 41 4c 57 41 59 53     while( ALWAYS
3c10: 28 70 29 20 26 26 20 70 2d 3e 70 4e 65 78 74 21  (p) && p->pNext!
3c20: 3d 70 49 6e 64 65 78 20 29 7b 20 70 20 3d 20 70  =pIndex ){ p = p
3c30: 2d 3e 70 4e 65 78 74 3b 20 7d 0a 20 20 20 20 20  ->pNext; }.     
3c40: 20 69 66 28 20 41 4c 57 41 59 53 28 70 20 26 26   if( ALWAYS(p &&
3c50: 20 70 2d 3e 70 4e 65 78 74 3d 3d 70 49 6e 64 65   p->pNext==pInde
3c60: 78 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d  x) ){.        p-
3c70: 3e 70 4e 65 78 74 20 3d 20 70 49 6e 64 65 78 2d  >pNext = pIndex-
3c80: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a  >pNext;.      }.
3c90: 20 20 20 20 7d 0a 20 20 20 20 66 72 65 65 49 6e      }.    freeIn
3ca0: 64 65 78 28 64 62 2c 20 70 49 6e 64 65 78 29 3b  dex(db, pIndex);
3cb0: 0a 20 20 7d 0a 20 20 64 62 2d 3e 66 6c 61 67 73  .  }.  db->flags
3cc0: 20 7c 3d 20 53 51 4c 49 54 45 5f 49 6e 74 65 72   |= SQLITE_Inter
3cd0: 6e 43 68 61 6e 67 65 73 3b 0a 7d 0a 0a 2f 2a 0a  nChanges;.}../*.
3ce0: 2a 2a 20 4c 6f 6f 6b 20 74 68 72 6f 75 67 68 20  ** Look through 
3cf0: 74 68 65 20 6c 69 73 74 20 6f 66 20 6f 70 65 6e  the list of open
3d00: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73 20   database files 
3d10: 69 6e 20 64 62 2d 3e 61 44 62 5b 5d 20 61 6e 64  in db->aDb[] and
3d20: 20 69 66 0a 2a 2a 20 61 6e 79 20 68 61 76 65 20   if.** any have 
3d30: 62 65 65 6e 20 63 6c 6f 73 65 64 2c 20 72 65 6d  been closed, rem
3d40: 6f 76 65 20 74 68 65 6d 20 66 72 6f 6d 20 74 68  ove them from th
3d50: 65 20 6c 69 73 74 2e 20 20 52 65 61 6c 6c 6f 63  e list.  Realloc
3d60: 61 74 65 20 74 68 65 0a 2a 2a 20 64 62 2d 3e 61  ate the.** db->a
3d70: 44 62 5b 5d 20 73 74 72 75 63 74 75 72 65 20 74  Db[] structure t
3d80: 6f 20 61 20 73 6d 61 6c 6c 65 72 20 73 69 7a 65  o a smaller size
3d90: 2c 20 69 66 20 70 6f 73 73 69 62 6c 65 2e 0a 2a  , if possible..*
3da0: 2a 0a 2a 2a 20 45 6e 74 72 79 20 30 20 28 74 68  *.** Entry 0 (th
3db0: 65 20 22 6d 61 69 6e 22 20 64 61 74 61 62 61 73  e "main" databas
3dc0: 65 29 20 61 6e 64 20 65 6e 74 72 79 20 31 20 28  e) and entry 1 (
3dd0: 74 68 65 20 22 74 65 6d 70 22 20 64 61 74 61 62  the "temp" datab
3de0: 61 73 65 29 0a 2a 2a 20 61 72 65 20 6e 65 76 65  ase).** are neve
3df0: 72 20 63 61 6e 64 69 64 61 74 65 73 20 66 6f 72  r candidates for
3e00: 20 62 65 69 6e 67 20 63 6f 6c 6c 61 70 73 65 64   being collapsed
3e10: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
3e20: 33 43 6f 6c 6c 61 70 73 65 44 61 74 61 62 61 73  3CollapseDatabas
3e30: 65 41 72 72 61 79 28 73 71 6c 69 74 65 33 20 2a  eArray(sqlite3 *
3e40: 64 62 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b  db){.  int i, j;
3e50: 0a 20 20 66 6f 72 28 69 3d 6a 3d 32 3b 20 69 3c  .  for(i=j=2; i<
3e60: 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20  db->nDb; i++){. 
3e70: 20 20 20 73 74 72 75 63 74 20 44 62 20 2a 70 44     struct Db *pD
3e80: 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 5d 3b  b = &db->aDb[i];
3e90: 0a 20 20 20 20 69 66 28 20 70 44 62 2d 3e 70 42  .    if( pDb->pB
3ea0: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  t==0 ){.      sq
3eb0: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
3ec0: 70 44 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  pDb->zName);.   
3ed0: 20 20 20 70 44 62 2d 3e 7a 4e 61 6d 65 20 3d 20     pDb->zName = 
3ee0: 30 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75  0;.      continu
3ef0: 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  e;.    }.    if(
3f00: 20 6a 3c 69 20 29 7b 0a 20 20 20 20 20 20 64 62   j<i ){.      db
3f10: 2d 3e 61 44 62 5b 6a 5d 20 3d 20 64 62 2d 3e 61  ->aDb[j] = db->a
3f20: 44 62 5b 69 5d 3b 0a 20 20 20 20 7d 0a 20 20 20  Db[i];.    }.   
3f30: 20 6a 2b 2b 3b 0a 20 20 7d 0a 20 20 64 62 2d 3e   j++;.  }.  db->
3f40: 6e 44 62 20 3d 20 6a 3b 0a 20 20 69 66 28 20 64  nDb = j;.  if( d
3f50: 62 2d 3e 6e 44 62 3c 3d 32 20 26 26 20 64 62 2d  b->nDb<=2 && db-
3f60: 3e 61 44 62 21 3d 64 62 2d 3e 61 44 62 53 74 61  >aDb!=db->aDbSta
3f70: 74 69 63 20 29 7b 0a 20 20 20 20 6d 65 6d 63 70  tic ){.    memcp
3f80: 79 28 64 62 2d 3e 61 44 62 53 74 61 74 69 63 2c  y(db->aDbStatic,
3f90: 20 64 62 2d 3e 61 44 62 2c 20 32 2a 73 69 7a 65   db->aDb, 2*size
3fa0: 6f 66 28 64 62 2d 3e 61 44 62 5b 30 5d 29 29 3b  of(db->aDb[0]));
3fb0: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
3fc0: 65 65 28 64 62 2c 20 64 62 2d 3e 61 44 62 29 3b  ee(db, db->aDb);
3fd0: 0a 20 20 20 20 64 62 2d 3e 61 44 62 20 3d 20 64  .    db->aDb = d
3fe0: 62 2d 3e 61 44 62 53 74 61 74 69 63 3b 0a 20 20  b->aDbStatic;.  
3ff0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 65 74  }.}../*.** Reset
4000: 20 74 68 65 20 73 63 68 65 6d 61 20 66 6f 72 20   the schema for 
4010: 74 68 65 20 64 61 74 61 62 61 73 65 20 61 74 20  the database at 
4020: 69 6e 64 65 78 20 69 44 62 2e 20 20 41 6c 73 6f  index iDb.  Also
4030: 20 72 65 73 65 74 20 74 68 65 0a 2a 2a 20 54 45   reset the.** TE
4040: 4d 50 20 73 63 68 65 6d 61 2e 0a 2a 2f 0a 76 6f  MP schema..*/.vo
4050: 69 64 20 73 71 6c 69 74 65 33 52 65 73 65 74 4f  id sqlite3ResetO
4060: 6e 65 53 63 68 65 6d 61 28 73 71 6c 69 74 65 33  neSchema(sqlite3
4070: 20 2a 64 62 2c 20 69 6e 74 20 69 44 62 29 7b 0a   *db, int iDb){.
4080: 20 20 44 62 20 2a 70 44 62 3b 0a 20 20 61 73 73    Db *pDb;.  ass
4090: 65 72 74 28 20 69 44 62 3c 64 62 2d 3e 6e 44 62  ert( iDb<db->nDb
40a0: 20 29 3b 0a 0a 20 20 2f 2a 20 43 61 73 65 20 31   );..  /* Case 1
40b0: 3a 20 20 52 65 73 65 74 20 74 68 65 20 73 69 6e  :  Reset the sin
40c0: 67 6c 65 20 73 63 68 65 6d 61 20 69 64 65 6e 74  gle schema ident
40d0: 69 66 69 65 64 20 62 79 20 69 44 62 20 2a 2f 0a  ified by iDb */.
40e0: 20 20 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62    pDb = &db->aDb
40f0: 5b 69 44 62 5d 3b 0a 20 20 61 73 73 65 72 74 28  [iDb];.  assert(
4100: 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75   sqlite3SchemaMu
4110: 74 65 78 48 65 6c 64 28 64 62 2c 20 69 44 62 2c  texHeld(db, iDb,
4120: 20 30 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28   0) );.  assert(
4130: 20 70 44 62 2d 3e 70 53 63 68 65 6d 61 21 3d 30   pDb->pSchema!=0
4140: 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 63 68   );.  sqlite3Sch
4150: 65 6d 61 43 6c 65 61 72 28 70 44 62 2d 3e 70 53  emaClear(pDb->pS
4160: 63 68 65 6d 61 29 3b 0a 0a 20 20 2f 2a 20 49 66  chema);..  /* If
4170: 20 61 6e 79 20 64 61 74 61 62 61 73 65 20 6f 74   any database ot
4180: 68 65 72 20 74 68 61 6e 20 54 45 4d 50 20 69 73  her than TEMP is
4190: 20 72 65 73 65 74 2c 20 74 68 65 6e 20 61 6c 73   reset, then als
41a0: 6f 20 72 65 73 65 74 20 54 45 4d 50 0a 20 20 2a  o reset TEMP.  *
41b0: 2a 20 73 69 6e 63 65 20 54 45 4d 50 20 6d 69 67  * since TEMP mig
41c0: 68 74 20 62 65 20 68 6f 6c 64 69 6e 67 20 74 72  ht be holding tr
41d0: 69 67 67 65 72 73 20 74 68 61 74 20 72 65 66 65  iggers that refe
41e0: 72 65 6e 63 65 20 74 61 62 6c 65 73 20 69 6e 20  rence tables in 
41f0: 74 68 65 0a 20 20 2a 2a 20 6f 74 68 65 72 20 64  the.  ** other d
4200: 61 74 61 62 61 73 65 2e 0a 20 20 2a 2f 0a 20 20  atabase..  */.  
4210: 69 66 28 20 69 44 62 21 3d 31 20 29 7b 0a 20 20  if( iDb!=1 ){.  
4220: 20 20 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62    pDb = &db->aDb
4230: 5b 31 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28  [1];.    assert(
4240: 20 70 44 62 2d 3e 70 53 63 68 65 6d 61 21 3d 30   pDb->pSchema!=0
4250: 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53   );.    sqlite3S
4260: 63 68 65 6d 61 43 6c 65 61 72 28 70 44 62 2d 3e  chemaClear(pDb->
4270: 70 53 63 68 65 6d 61 29 3b 0a 20 20 7d 0a 20 20  pSchema);.  }.  
4280: 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  return;.}../*.**
4290: 20 45 72 61 73 65 20 61 6c 6c 20 73 63 68 65 6d   Erase all schem
42a0: 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72  a information fr
42b0: 6f 6d 20 61 6c 6c 20 61 74 74 61 63 68 65 64 20  om all attached 
42c0: 64 61 74 61 62 61 73 65 73 20 28 69 6e 63 6c 75  databases (inclu
42d0: 64 69 6e 67 0a 2a 2a 20 22 6d 61 69 6e 22 20 61  ding.** "main" a
42e0: 6e 64 20 22 74 65 6d 70 22 29 20 66 6f 72 20 61  nd "temp") for a
42f0: 20 73 69 6e 67 6c 65 20 64 61 74 61 62 61 73 65   single database
4300: 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a   connection..*/.
4310: 76 6f 69 64 20 73 71 6c 69 74 65 33 52 65 73 65  void sqlite3Rese
4320: 74 41 6c 6c 53 63 68 65 6d 61 73 4f 66 43 6f 6e  tAllSchemasOfCon
4330: 6e 65 63 74 69 6f 6e 28 73 71 6c 69 74 65 33 20  nection(sqlite3 
4340: 2a 64 62 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  *db){.  int i;. 
4350: 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
4360: 65 72 41 6c 6c 28 64 62 29 3b 0a 20 20 66 6f 72  erAll(db);.  for
4370: 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b  (i=0; i<db->nDb;
4380: 20 69 2b 2b 29 7b 0a 20 20 20 20 44 62 20 2a 70   i++){.    Db *p
4390: 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 5d  Db = &db->aDb[i]
43a0: 3b 0a 20 20 20 20 69 66 28 20 70 44 62 2d 3e 70  ;.    if( pDb->p
43b0: 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 20 20  Schema ){.      
43c0: 73 71 6c 69 74 65 33 53 63 68 65 6d 61 43 6c 65  sqlite3SchemaCle
43d0: 61 72 28 70 44 62 2d 3e 70 53 63 68 65 6d 61 29  ar(pDb->pSchema)
43e0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 64 62  ;.    }.  }.  db
43f0: 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49  ->flags &= ~SQLI
4400: 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73  TE_InternChanges
4410: 3b 0a 20 20 73 71 6c 69 74 65 33 56 74 61 62 55  ;.  sqlite3VtabU
4420: 6e 6c 6f 63 6b 4c 69 73 74 28 64 62 29 3b 0a 20  nlockList(db);. 
4430: 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
4440: 76 65 41 6c 6c 28 64 62 29 3b 0a 20 20 73 71 6c  veAll(db);.  sql
4450: 69 74 65 33 43 6f 6c 6c 61 70 73 65 44 61 74 61  ite3CollapseData
4460: 62 61 73 65 41 72 72 61 79 28 64 62 29 3b 0a 7d  baseArray(db);.}
4470: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
4480: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77  tine is called w
4490: 68 65 6e 20 61 20 63 6f 6d 6d 69 74 20 6f 63 63  hen a commit occ
44a0: 75 72 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  urs..*/.void sql
44b0: 69 74 65 33 43 6f 6d 6d 69 74 49 6e 74 65 72 6e  ite3CommitIntern
44c0: 61 6c 43 68 61 6e 67 65 73 28 73 71 6c 69 74 65  alChanges(sqlite
44d0: 33 20 2a 64 62 29 7b 0a 20 20 64 62 2d 3e 66 6c  3 *db){.  db->fl
44e0: 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 49  ags &= ~SQLITE_I
44f0: 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a 7d 0a  nternChanges;.}.
4500: 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 6d 65  ./*.** Delete me
4510: 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 65 64 20 66  mory allocated f
4520: 6f 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61  or the column na
4530: 6d 65 73 20 6f 66 20 61 20 74 61 62 6c 65 20 6f  mes of a table o
4540: 72 20 76 69 65 77 20 28 74 68 65 0a 2a 2a 20 54  r view (the.** T
4550: 61 62 6c 65 2e 61 43 6f 6c 5b 5d 20 61 72 72 61  able.aCol[] arra
4560: 79 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  y)..*/.void sqli
4570: 74 65 33 44 65 6c 65 74 65 43 6f 6c 75 6d 6e 4e  te3DeleteColumnN
4580: 61 6d 65 73 28 73 71 6c 69 74 65 33 20 2a 64 62  ames(sqlite3 *db
4590: 2c 20 54 61 62 6c 65 20 2a 70 54 61 62 6c 65 29  , Table *pTable)
45a0: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 43 6f 6c  {.  int i;.  Col
45b0: 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 61 73 73  umn *pCol;.  ass
45c0: 65 72 74 28 20 70 54 61 62 6c 65 21 3d 30 20 29  ert( pTable!=0 )
45d0: 3b 0a 20 20 69 66 28 20 28 70 43 6f 6c 20 3d 20  ;.  if( (pCol = 
45e0: 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 29 21 3d 30  pTable->aCol)!=0
45f0: 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   ){.    for(i=0;
4600: 20 69 3c 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3b   i<pTable->nCol;
4610: 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20   i++, pCol++){. 
4620: 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
4630: 65 65 28 64 62 2c 20 70 43 6f 6c 2d 3e 7a 4e 61  ee(db, pCol->zNa
4640: 6d 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  me);.      sqlit
4650: 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c  e3ExprDelete(db,
4660: 20 70 43 6f 6c 2d 3e 70 44 66 6c 74 29 3b 0a 20   pCol->pDflt);. 
4670: 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
4680: 65 65 28 64 62 2c 20 70 43 6f 6c 2d 3e 7a 44 66  ee(db, pCol->zDf
4690: 6c 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  lt);.      sqlit
46a0: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 43 6f  e3DbFree(db, pCo
46b0: 6c 2d 3e 7a 54 79 70 65 29 3b 0a 20 20 20 20 20  l->zType);.     
46c0: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
46d0: 62 2c 20 70 43 6f 6c 2d 3e 7a 43 6f 6c 6c 29 3b  b, pCol->zColl);
46e0: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
46f0: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 54 61  e3DbFree(db, pTa
4700: 62 6c 65 2d 3e 61 43 6f 6c 29 3b 0a 20 20 7d 0a  ble->aCol);.  }.
4710: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20  }../*.** Remove 
4720: 74 68 65 20 6d 65 6d 6f 72 79 20 64 61 74 61 20  the memory data 
4730: 73 74 72 75 63 74 75 72 65 73 20 61 73 73 6f 63  structures assoc
4740: 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20 67  iated with the g
4750: 69 76 65 6e 0a 2a 2a 20 54 61 62 6c 65 2e 20 20  iven.** Table.  
4760: 4e 6f 20 63 68 61 6e 67 65 73 20 61 72 65 20 6d  No changes are m
4770: 61 64 65 20 74 6f 20 64 69 73 6b 20 62 79 20 74  ade to disk by t
4780: 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a  his routine..**.
4790: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
47a0: 6a 75 73 74 20 64 65 6c 65 74 65 73 20 74 68 65  just deletes the
47b0: 20 64 61 74 61 20 73 74 72 75 63 74 75 72 65 2e   data structure.
47c0: 20 20 49 74 20 64 6f 65 73 20 6e 6f 74 20 75 6e    It does not un
47d0: 6c 69 6e 6b 0a 2a 2a 20 74 68 65 20 74 61 62 6c  link.** the tabl
47e0: 65 20 64 61 74 61 20 73 74 72 75 63 74 75 72 65  e data structure
47f0: 20 66 72 6f 6d 20 74 68 65 20 68 61 73 68 20 74   from the hash t
4800: 61 62 6c 65 2e 20 20 42 75 74 20 69 74 20 64 6f  able.  But it do
4810: 65 73 20 64 65 73 74 72 6f 79 0a 2a 2a 20 6d 65  es destroy.** me
4820: 6d 6f 72 79 20 73 74 72 75 63 74 75 72 65 73 20  mory structures 
4830: 6f 66 20 74 68 65 20 69 6e 64 69 63 65 73 20 61  of the indices a
4840: 6e 64 20 66 6f 72 65 69 67 6e 20 6b 65 79 73 20  nd foreign keys 
4850: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
4860: 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a  .** the table..*
4870: 2a 0a 2a 2a 20 54 68 65 20 64 62 20 70 61 72 61  *.** The db para
4880: 6d 65 74 65 72 20 69 73 20 6f 70 74 69 6f 6e 61  meter is optiona
4890: 6c 2e 20 20 49 74 20 69 73 20 6e 65 65 64 65 64  l.  It is needed
48a0: 20 69 66 20 74 68 65 20 54 61 62 6c 65 20 6f 62   if the Table ob
48b0: 6a 65 63 74 20 0a 2a 2a 20 63 6f 6e 74 61 69 6e  ject .** contain
48c0: 73 20 6c 6f 6f 6b 61 73 69 64 65 20 6d 65 6d 6f  s lookaside memo
48d0: 72 79 2e 20 20 28 54 61 62 6c 65 20 6f 62 6a 65  ry.  (Table obje
48e0: 63 74 73 20 69 6e 20 74 68 65 20 73 63 68 65 6d  cts in the schem
48f0: 61 20 64 6f 20 6e 6f 74 20 75 73 65 0a 2a 2a 20  a do not use.** 
4900: 6c 6f 6f 6b 61 73 69 64 65 20 6d 65 6d 6f 72 79  lookaside memory
4910: 2c 20 62 75 74 20 73 6f 6d 65 20 65 70 68 65 6d  , but some ephem
4920: 65 72 61 6c 20 54 61 62 6c 65 20 6f 62 6a 65 63  eral Table objec
4930: 74 73 20 64 6f 2e 29 20 20 4f 72 20 74 68 65 0a  ts do.)  Or the.
4940: 2a 2a 20 64 62 20 70 61 72 61 6d 65 74 65 72 20  ** db parameter 
4950: 63 61 6e 20 62 65 20 75 73 65 64 20 77 69 74 68  can be used with
4960: 20 64 62 2d 3e 70 6e 42 79 74 65 73 46 72 65 65   db->pnBytesFree
4970: 64 20 74 6f 20 6d 65 61 73 75 72 65 20 74 68 65  d to measure the
4980: 20 6d 65 6d 6f 72 79 0a 2a 2a 20 75 73 65 64 20   memory.** used 
4990: 62 79 20 74 68 65 20 54 61 62 6c 65 20 6f 62 6a  by the Table obj
49a0: 65 63 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ect..*/.void sql
49b0: 69 74 65 33 44 65 6c 65 74 65 54 61 62 6c 65 28  ite3DeleteTable(
49c0: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 54 61 62  sqlite3 *db, Tab
49d0: 6c 65 20 2a 70 54 61 62 6c 65 29 7b 0a 20 20 49  le *pTable){.  I
49e0: 6e 64 65 78 20 2a 70 49 6e 64 65 78 2c 20 2a 70  ndex *pIndex, *p
49f0: 4e 65 78 74 3b 0a 20 20 54 45 53 54 4f 4e 4c 59  Next;.  TESTONLY
4a00: 28 20 69 6e 74 20 6e 4c 6f 6f 6b 61 73 69 64 65  ( int nLookaside
4a10: 3b 20 29 20 2f 2a 20 55 73 65 64 20 74 6f 20 76  ; ) /* Used to v
4a20: 65 72 69 66 79 20 6c 6f 6f 6b 61 73 69 64 65 20  erify lookaside 
4a30: 6e 6f 74 20 75 73 65 64 20 66 6f 72 20 73 63 68  not used for sch
4a40: 65 6d 61 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  ema */..  assert
4a50: 28 20 21 70 54 61 62 6c 65 20 7c 7c 20 70 54 61  ( !pTable || pTa
4a60: 62 6c 65 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 0a  ble->nRef>0 );..
4a70: 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 64 65 6c 65    /* Do not dele
4a80: 74 65 20 74 68 65 20 74 61 62 6c 65 20 75 6e 74  te the table unt
4a90: 69 6c 20 74 68 65 20 72 65 66 65 72 65 6e 63 65  il the reference
4aa0: 20 63 6f 75 6e 74 20 72 65 61 63 68 65 73 20 7a   count reaches z
4ab0: 65 72 6f 2e 20 2a 2f 0a 20 20 69 66 28 20 21 70  ero. */.  if( !p
4ac0: 54 61 62 6c 65 20 29 20 72 65 74 75 72 6e 3b 0a  Table ) return;.
4ad0: 20 20 69 66 28 20 28 28 21 64 62 20 7c 7c 20 64    if( ((!db || d
4ae0: 62 2d 3e 70 6e 42 79 74 65 73 46 72 65 65 64 3d  b->pnBytesFreed=
4af0: 3d 30 29 20 26 26 20 28 2d 2d 70 54 61 62 6c 65  =0) && (--pTable
4b00: 2d 3e 6e 52 65 66 29 3e 30 29 20 29 20 72 65 74  ->nRef)>0) ) ret
4b10: 75 72 6e 3b 0a 0a 20 20 2f 2a 20 52 65 63 6f 72  urn;..  /* Recor
4b20: 64 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  d the number of 
4b30: 6f 75 74 73 74 61 6e 64 69 6e 67 20 6c 6f 6f 6b  outstanding look
4b40: 61 73 69 64 65 20 61 6c 6c 6f 63 61 74 69 6f 6e  aside allocation
4b50: 73 20 69 6e 20 73 63 68 65 6d 61 20 54 61 62 6c  s in schema Tabl
4b60: 65 73 0a 20 20 2a 2a 20 70 72 69 6f 72 20 74 6f  es.  ** prior to
4b70: 20 64 6f 69 6e 67 20 61 6e 79 20 66 72 65 65 28   doing any free(
4b80: 29 20 6f 70 65 72 61 74 69 6f 6e 73 2e 20 20 53  ) operations.  S
4b90: 69 6e 63 65 20 73 63 68 65 6d 61 20 54 61 62 6c  ince schema Tabl
4ba0: 65 73 20 64 6f 20 6e 6f 74 20 75 73 65 0a 20 20  es do not use.  
4bb0: 2a 2a 20 6c 6f 6f 6b 61 73 69 64 65 2c 20 74 68  ** lookaside, th
4bc0: 69 73 20 6e 75 6d 62 65 72 20 73 68 6f 75 6c 64  is number should
4bd0: 20 6e 6f 74 20 63 68 61 6e 67 65 2e 20 2a 2f 0a   not change. */.
4be0: 20 20 54 45 53 54 4f 4e 4c 59 28 20 6e 4c 6f 6f    TESTONLY( nLoo
4bf0: 6b 61 73 69 64 65 20 3d 20 28 64 62 20 26 26 20  kaside = (db && 
4c00: 28 70 54 61 62 6c 65 2d 3e 74 61 62 46 6c 61 67  (pTable->tabFlag
4c10: 73 20 26 20 54 46 5f 45 70 68 65 6d 65 72 61 6c  s & TF_Ephemeral
4c20: 29 3d 3d 30 29 20 3f 0a 20 20 20 20 20 20 20 20  )==0) ?.        
4c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4c40: 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 6e   db->lookaside.n
4c50: 4f 75 74 20 3a 20 30 20 29 3b 0a 0a 20 20 2f 2a  Out : 0 );..  /*
4c60: 20 44 65 6c 65 74 65 20 61 6c 6c 20 69 6e 64 69   Delete all indi
4c70: 63 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  ces associated w
4c80: 69 74 68 20 74 68 69 73 20 74 61 62 6c 65 2e 20  ith this table. 
4c90: 2a 2f 0a 20 20 66 6f 72 28 70 49 6e 64 65 78 20  */.  for(pIndex 
4ca0: 3d 20 70 54 61 62 6c 65 2d 3e 70 49 6e 64 65 78  = pTable->pIndex
4cb0: 3b 20 70 49 6e 64 65 78 3b 20 70 49 6e 64 65 78  ; pIndex; pIndex
4cc0: 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20 70 4e 65  =pNext){.    pNe
4cd0: 78 74 20 3d 20 70 49 6e 64 65 78 2d 3e 70 4e 65  xt = pIndex->pNe
4ce0: 78 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  xt;.    assert( 
4cf0: 70 49 6e 64 65 78 2d 3e 70 53 63 68 65 6d 61 3d  pIndex->pSchema=
4d00: 3d 70 54 61 62 6c 65 2d 3e 70 53 63 68 65 6d 61  =pTable->pSchema
4d10: 20 29 3b 0a 20 20 20 20 69 66 28 20 21 64 62 20   );.    if( !db 
4d20: 7c 7c 20 64 62 2d 3e 70 6e 42 79 74 65 73 46 72  || db->pnBytesFr
4d30: 65 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  eed==0 ){.      
4d40: 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 70 49  char *zName = pI
4d50: 6e 64 65 78 2d 3e 7a 4e 61 6d 65 3b 20 0a 20 20  ndex->zName; .  
4d60: 20 20 20 20 54 45 53 54 4f 4e 4c 59 20 28 20 49      TESTONLY ( I
4d70: 6e 64 65 78 20 2a 70 4f 6c 64 20 3d 20 29 20 73  ndex *pOld = ) s
4d80: 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72 74  qlite3HashInsert
4d90: 28 0a 20 20 20 20 20 20 20 20 20 26 70 49 6e 64  (.         &pInd
4da0: 65 78 2d 3e 70 53 63 68 65 6d 61 2d 3e 69 64 78  ex->pSchema->idx
4db0: 48 61 73 68 2c 20 7a 4e 61 6d 65 2c 20 30 0a 20  Hash, zName, 0. 
4dc0: 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 61 73       );.      as
4dd0: 73 65 72 74 28 20 64 62 3d 3d 30 20 7c 7c 20 73  sert( db==0 || s
4de0: 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65  qlite3SchemaMute
4df0: 78 48 65 6c 64 28 64 62 2c 20 30 2c 20 70 49 6e  xHeld(db, 0, pIn
4e00: 64 65 78 2d 3e 70 53 63 68 65 6d 61 29 20 29 3b  dex->pSchema) );
4e10: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
4e20: 4f 6c 64 3d 3d 70 49 6e 64 65 78 20 7c 7c 20 70  Old==pIndex || p
4e30: 4f 6c 64 3d 3d 30 20 29 3b 0a 20 20 20 20 7d 0a  Old==0 );.    }.
4e40: 20 20 20 20 66 72 65 65 49 6e 64 65 78 28 64 62      freeIndex(db
4e50: 2c 20 70 49 6e 64 65 78 29 3b 0a 20 20 7d 0a 0a  , pIndex);.  }..
4e60: 20 20 2f 2a 20 44 65 6c 65 74 65 20 61 6e 79 20    /* Delete any 
4e70: 66 6f 72 65 69 67 6e 20 6b 65 79 73 20 61 74 74  foreign keys att
4e80: 61 63 68 65 64 20 74 6f 20 74 68 69 73 20 74 61  ached to this ta
4e90: 62 6c 65 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ble. */.  sqlite
4ea0: 33 46 6b 44 65 6c 65 74 65 28 64 62 2c 20 70 54  3FkDelete(db, pT
4eb0: 61 62 6c 65 29 3b 0a 0a 20 20 2f 2a 20 44 65 6c  able);..  /* Del
4ec0: 65 74 65 20 74 68 65 20 54 61 62 6c 65 20 73 74  ete the Table st
4ed0: 72 75 63 74 75 72 65 20 69 74 73 65 6c 66 2e 0a  ructure itself..
4ee0: 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 44 65    */.  sqlite3De
4ef0: 6c 65 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28  leteColumnNames(
4f00: 64 62 2c 20 70 54 61 62 6c 65 29 3b 0a 20 20 73  db, pTable);.  s
4f10: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
4f20: 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 29 3b   pTable->zName);
4f30: 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
4f40: 28 64 62 2c 20 70 54 61 62 6c 65 2d 3e 7a 43 6f  (db, pTable->zCo
4f50: 6c 41 66 66 29 3b 0a 20 20 73 71 6c 69 74 65 33  lAff);.  sqlite3
4f60: 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c  SelectDelete(db,
4f70: 20 70 54 61 62 6c 65 2d 3e 70 53 65 6c 65 63 74   pTable->pSelect
4f80: 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  );.  sqlite3Expr
4f90: 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70  ListDelete(db, p
4fa0: 54 61 62 6c 65 2d 3e 70 43 68 65 63 6b 29 3b 0a  Table->pCheck);.
4fb0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
4fc0: 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
4fd0: 0a 20 20 73 71 6c 69 74 65 33 56 74 61 62 43 6c  .  sqlite3VtabCl
4fe0: 65 61 72 28 64 62 2c 20 70 54 61 62 6c 65 29 3b  ear(db, pTable);
4ff0: 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65  .#endif.  sqlite
5000: 33 44 62 46 72 65 65 28 64 62 2c 20 70 54 61 62  3DbFree(db, pTab
5010: 6c 65 29 3b 0a 0a 20 20 2f 2a 20 56 65 72 69 66  le);..  /* Verif
5020: 79 20 74 68 61 74 20 6e 6f 20 6c 6f 6f 6b 61 73  y that no lookas
5030: 69 64 65 20 6d 65 6d 6f 72 79 20 77 61 73 20 75  ide memory was u
5040: 73 65 64 20 62 79 20 73 63 68 65 6d 61 20 74 61  sed by schema ta
5050: 62 6c 65 73 20 2a 2f 0a 20 20 61 73 73 65 72 74  bles */.  assert
5060: 28 20 6e 4c 6f 6f 6b 61 73 69 64 65 3d 3d 30 20  ( nLookaside==0 
5070: 7c 7c 20 6e 4c 6f 6f 6b 61 73 69 64 65 3d 3d 64  || nLookaside==d
5080: 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 6e 4f 75  b->lookaside.nOu
5090: 74 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e  t );.}../*.** Un
50a0: 6c 69 6e 6b 20 74 68 65 20 67 69 76 65 6e 20 74  link the given t
50b0: 61 62 6c 65 20 66 72 6f 6d 20 74 68 65 20 68 61  able from the ha
50c0: 73 68 20 74 61 62 6c 65 73 20 61 6e 64 20 74 68  sh tables and th
50d0: 65 20 64 65 6c 65 74 65 20 74 68 65 0a 2a 2a 20  e delete the.** 
50e0: 74 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20  table structure 
50f0: 77 69 74 68 20 61 6c 6c 20 69 74 73 20 69 6e 64  with all its ind
5100: 69 63 65 73 20 61 6e 64 20 66 6f 72 65 69 67 6e  ices and foreign
5110: 20 6b 65 79 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73   keys..*/.void s
5120: 71 6c 69 74 65 33 55 6e 6c 69 6e 6b 41 6e 64 44  qlite3UnlinkAndD
5130: 65 6c 65 74 65 54 61 62 6c 65 28 73 71 6c 69 74  eleteTable(sqlit
5140: 65 33 20 2a 64 62 2c 20 69 6e 74 20 69 44 62 2c  e3 *db, int iDb,
5150: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61   const char *zTa
5160: 62 4e 61 6d 65 29 7b 0a 20 20 54 61 62 6c 65 20  bName){.  Table 
5170: 2a 70 3b 0a 20 20 44 62 20 2a 70 44 62 3b 0a 0a  *p;.  Db *pDb;..
5180: 20 20 61 73 73 65 72 74 28 20 64 62 21 3d 30 20    assert( db!=0 
5190: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 44 62  );.  assert( iDb
51a0: 3e 3d 30 20 26 26 20 69 44 62 3c 64 62 2d 3e 6e  >=0 && iDb<db->n
51b0: 44 62 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  Db );.  assert( 
51c0: 7a 54 61 62 4e 61 6d 65 20 29 3b 0a 20 20 61 73  zTabName );.  as
51d0: 73 65 72 74 28 20 73 71 6c 69 74 65 33 53 63 68  sert( sqlite3Sch
51e0: 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c  emaMutexHeld(db,
51f0: 20 69 44 62 2c 20 30 29 20 29 3b 0a 20 20 74 65   iDb, 0) );.  te
5200: 73 74 63 61 73 65 28 20 7a 54 61 62 4e 61 6d 65  stcase( zTabName
5210: 5b 30 5d 3d 3d 30 20 29 3b 20 20 2f 2a 20 5a 65  [0]==0 );  /* Ze
5220: 72 6f 2d 6c 65 6e 67 74 68 20 74 61 62 6c 65 20  ro-length table 
5230: 6e 61 6d 65 73 20 61 72 65 20 61 6c 6c 6f 77 65  names are allowe
5240: 64 20 2a 2f 0a 20 20 70 44 62 20 3d 20 26 64 62  d */.  pDb = &db
5250: 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a 20 20 70 20  ->aDb[iDb];.  p 
5260: 3d 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73  = sqlite3HashIns
5270: 65 72 74 28 26 70 44 62 2d 3e 70 53 63 68 65 6d  ert(&pDb->pSchem
5280: 61 2d 3e 74 62 6c 48 61 73 68 2c 20 7a 54 61 62  a->tblHash, zTab
5290: 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 73 71 6c 69  Name, 0);.  sqli
52a0: 74 65 33 44 65 6c 65 74 65 54 61 62 6c 65 28 64  te3DeleteTable(d
52b0: 62 2c 20 70 29 3b 0a 20 20 64 62 2d 3e 66 6c 61  b, p);.  db->fla
52c0: 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 49 6e 74  gs |= SQLITE_Int
52d0: 65 72 6e 43 68 61 6e 67 65 73 3b 0a 7d 0a 0a 2f  ernChanges;.}../
52e0: 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20 74 6f 6b  *.** Given a tok
52f0: 65 6e 2c 20 72 65 74 75 72 6e 20 61 20 73 74 72  en, return a str
5300: 69 6e 67 20 74 68 61 74 20 63 6f 6e 73 69 73 74  ing that consist
5310: 73 20 6f 66 20 74 68 65 20 74 65 78 74 20 6f 66  s of the text of
5320: 20 74 68 61 74 0a 2a 2a 20 74 6f 6b 65 6e 2e 20   that.** token. 
5330: 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74   Space to hold t
5340: 68 65 20 72 65 74 75 72 6e 65 64 20 73 74 72 69  he returned stri
5350: 6e 67 0a 2a 2a 20 69 73 20 6f 62 74 61 69 6e 65  ng.** is obtaine
5360: 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 4d 61 6c  d from sqliteMal
5370: 6c 6f 63 28 29 20 61 6e 64 20 6d 75 73 74 20 62  loc() and must b
5380: 65 20 66 72 65 65 64 20 62 79 20 74 68 65 20 63  e freed by the c
5390: 61 6c 6c 69 6e 67 0a 2a 2a 20 66 75 6e 63 74 69  alling.** functi
53a0: 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 41 6e 79 20 71 75  on..**.** Any qu
53b0: 6f 74 61 74 69 6f 6e 20 6d 61 72 6b 73 20 28 65  otation marks (e
53c0: 78 3a 20 20 22 6e 61 6d 65 22 2c 20 27 6e 61 6d  x:  "name", 'nam
53d0: 65 27 2c 20 5b 6e 61 6d 65 5d 2c 20 6f 72 20 60  e', [name], or `
53e0: 6e 61 6d 65 60 29 20 74 68 61 74 0a 2a 2a 20 73  name`) that.** s
53f0: 75 72 72 6f 75 6e 64 20 74 68 65 20 62 6f 64 79  urround the body
5400: 20 6f 66 20 74 68 65 20 74 6f 6b 65 6e 20 61 72   of the token ar
5410: 65 20 72 65 6d 6f 76 65 64 2e 0a 2a 2a 0a 2a 2a  e removed..**.**
5420: 20 54 6f 6b 65 6e 73 20 61 72 65 20 6f 66 74 65   Tokens are ofte
5430: 6e 20 6a 75 73 74 20 70 6f 69 6e 74 65 72 73 20  n just pointers 
5440: 69 6e 74 6f 20 74 68 65 20 6f 72 69 67 69 6e 61  into the origina
5450: 6c 20 53 51 4c 20 74 65 78 74 20 61 6e 64 20 73  l SQL text and s
5460: 6f 0a 2a 2a 20 61 72 65 20 6e 6f 74 20 5c 30 30  o.** are not \00
5470: 30 20 74 65 72 6d 69 6e 61 74 65 64 20 61 6e 64  0 terminated and
5480: 20 61 72 65 20 6e 6f 74 20 70 65 72 73 69 73 74   are not persist
5490: 65 6e 74 2e 20 20 54 68 65 20 72 65 74 75 72 6e  ent.  The return
54a0: 65 64 20 73 74 72 69 6e 67 0a 2a 2a 20 69 73 20  ed string.** is 
54b0: 5c 30 30 30 20 74 65 72 6d 69 6e 61 74 65 64 20  \000 terminated 
54c0: 61 6e 64 20 69 73 20 70 65 72 73 69 73 74 65 6e  and is persisten
54d0: 74 2e 0a 2a 2f 0a 63 68 61 72 20 2a 73 71 6c 69  t..*/.char *sqli
54e0: 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e  te3NameFromToken
54f0: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 54 6f  (sqlite3 *db, To
5500: 6b 65 6e 20 2a 70 4e 61 6d 65 29 7b 0a 20 20 63  ken *pName){.  c
5510: 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 69 66  har *zName;.  if
5520: 28 20 70 4e 61 6d 65 20 29 7b 0a 20 20 20 20 7a  ( pName ){.    z
5530: 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62  Name = sqlite3Db
5540: 53 74 72 4e 44 75 70 28 64 62 2c 20 28 63 68 61  StrNDup(db, (cha
5550: 72 2a 29 70 4e 61 6d 65 2d 3e 7a 2c 20 70 4e 61  r*)pName->z, pNa
5560: 6d 65 2d 3e 6e 29 3b 0a 20 20 20 20 73 71 6c 69  me->n);.    sqli
5570: 74 65 33 44 65 71 75 6f 74 65 28 7a 4e 61 6d 65  te3Dequote(zName
5580: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
5590: 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 7d 0a 20  zName = 0;.  }. 
55a0: 20 72 65 74 75 72 6e 20 7a 4e 61 6d 65 3b 0a 7d   return zName;.}
55b0: 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 74 68 65  ../*.** Open the
55c0: 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74   sqlite_master t
55d0: 61 62 6c 65 20 73 74 6f 72 65 64 20 69 6e 20 64  able stored in d
55e0: 61 74 61 62 61 73 65 20 6e 75 6d 62 65 72 20 69  atabase number i
55f0: 44 62 20 66 6f 72 0a 2a 2a 20 77 72 69 74 69 6e  Db for.** writin
5600: 67 2e 20 54 68 65 20 74 61 62 6c 65 20 69 73 20  g. The table is 
5610: 6f 70 65 6e 65 64 20 75 73 69 6e 67 20 63 75 72  opened using cur
5620: 73 6f 72 20 30 2e 0a 2a 2f 0a 76 6f 69 64 20 73  sor 0..*/.void s
5630: 71 6c 69 74 65 33 4f 70 65 6e 4d 61 73 74 65 72  qlite3OpenMaster
5640: 54 61 62 6c 65 28 50 61 72 73 65 20 2a 70 2c 20  Table(Parse *p, 
5650: 69 6e 74 20 69 44 62 29 7b 0a 20 20 56 64 62 65  int iDb){.  Vdbe
5660: 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74   *v = sqlite3Get
5670: 56 64 62 65 28 70 29 3b 0a 20 20 73 71 6c 69 74  Vdbe(p);.  sqlit
5680: 65 33 54 61 62 6c 65 4c 6f 63 6b 28 70 2c 20 69  e3TableLock(p, i
5690: 44 62 2c 20 4d 41 53 54 45 52 5f 52 4f 4f 54 2c  Db, MASTER_ROOT,
56a0: 20 31 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c 45   1, SCHEMA_TABLE
56b0: 28 69 44 62 29 29 3b 0a 20 20 73 71 6c 69 74 65  (iDb));.  sqlite
56c0: 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76  3VdbeAddOp4Int(v
56d0: 2c 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65 2c 20  , OP_OpenWrite, 
56e0: 30 2c 20 4d 41 53 54 45 52 5f 52 4f 4f 54 2c 20  0, MASTER_ROOT, 
56f0: 69 44 62 2c 20 35 29 3b 0a 20 20 69 66 28 20 70  iDb, 5);.  if( p
5700: 2d 3e 6e 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20  ->nTab==0 ){.   
5710: 20 70 2d 3e 6e 54 61 62 20 3d 20 31 3b 0a 20 20   p->nTab = 1;.  
5720: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 61 6d  }.}../*.** Param
5730: 65 74 65 72 20 7a 4e 61 6d 65 20 70 6f 69 6e 74  eter zName point
5740: 73 20 74 6f 20 61 20 6e 75 6c 2d 74 65 72 6d 69  s to a nul-termi
5750: 6e 61 74 65 64 20 62 75 66 66 65 72 20 63 6f 6e  nated buffer con
5760: 74 61 69 6e 69 6e 67 20 74 68 65 20 6e 61 6d 65  taining the name
5770: 0a 2a 2a 20 6f 66 20 61 20 64 61 74 61 62 61 73  .** of a databas
5780: 65 20 28 22 6d 61 69 6e 22 2c 20 22 74 65 6d 70  e ("main", "temp
5790: 22 20 6f 72 20 74 68 65 20 6e 61 6d 65 20 6f 66  " or the name of
57a0: 20 61 6e 20 61 74 74 61 63 68 65 64 20 64 62 29   an attached db)
57b0: 2e 20 54 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69  . This.** functi
57c0: 6f 6e 20 72 65 74 75 72 6e 73 20 74 68 65 20 69  on returns the i
57d0: 6e 64 65 78 20 6f 66 20 74 68 65 20 6e 61 6d 65  ndex of the name
57e0: 64 20 64 61 74 61 62 61 73 65 20 69 6e 20 64 62  d database in db
57f0: 2d 3e 61 44 62 5b 5d 2c 20 6f 72 0a 2a 2a 20 2d  ->aDb[], or.** -
5800: 31 20 69 66 20 74 68 65 20 6e 61 6d 65 64 20 64  1 if the named d
5810: 62 20 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e  b cannot be foun
5820: 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
5830: 33 46 69 6e 64 44 62 4e 61 6d 65 28 73 71 6c 69  3FindDbName(sqli
5840: 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63  te3 *db, const c
5850: 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69  har *zName){.  i
5860: 6e 74 20 69 20 3d 20 2d 31 3b 20 20 20 20 20 20  nt i = -1;      
5870: 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 6e     /* Database n
5880: 75 6d 62 65 72 20 2a 2f 0a 20 20 69 66 28 20 7a  umber */.  if( z
5890: 4e 61 6d 65 20 29 7b 0a 20 20 20 20 44 62 20 2a  Name ){.    Db *
58a0: 70 44 62 3b 0a 20 20 20 20 69 6e 74 20 6e 20 3d  pDb;.    int n =
58b0: 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
58c0: 28 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 66 6f 72  (zName);.    for
58d0: 28 69 3d 28 64 62 2d 3e 6e 44 62 2d 31 29 2c 20  (i=(db->nDb-1), 
58e0: 70 44 62 3d 26 64 62 2d 3e 61 44 62 5b 69 5d 3b  pDb=&db->aDb[i];
58f0: 20 69 3e 3d 30 3b 20 69 2d 2d 2c 20 70 44 62 2d   i>=0; i--, pDb-
5900: 2d 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 21  -){.      if( (!
5910: 4f 4d 49 54 5f 54 45 4d 50 44 42 20 7c 7c 20 69  OMIT_TEMPDB || i
5920: 21 3d 31 20 29 20 26 26 20 6e 3d 3d 73 71 6c 69  !=1 ) && n==sqli
5930: 74 65 33 53 74 72 6c 65 6e 33 30 28 70 44 62 2d  te3Strlen30(pDb-
5940: 3e 7a 4e 61 6d 65 29 20 26 26 20 0a 20 20 20 20  >zName) && .    
5950: 20 20 20 20 20 20 30 3d 3d 73 71 6c 69 74 65 33        0==sqlite3
5960: 53 74 72 49 43 6d 70 28 70 44 62 2d 3e 7a 4e 61  StrICmp(pDb->zNa
5970: 6d 65 2c 20 7a 4e 61 6d 65 29 20 29 7b 0a 20 20  me, zName) ){.  
5980: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
5990: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
59a0: 20 72 65 74 75 72 6e 20 69 3b 0a 7d 0a 0a 2f 2a   return i;.}../*
59b0: 0a 2a 2a 20 54 68 65 20 74 6f 6b 65 6e 20 2a 70  .** The token *p
59c0: 4e 61 6d 65 20 63 6f 6e 74 61 69 6e 73 20 74 68  Name contains th
59d0: 65 20 6e 61 6d 65 20 6f 66 20 61 20 64 61 74 61  e name of a data
59e0: 62 61 73 65 20 28 65 69 74 68 65 72 20 22 6d 61  base (either "ma
59f0: 69 6e 22 20 6f 72 0a 2a 2a 20 22 74 65 6d 70 22  in" or.** "temp"
5a00: 20 6f 72 20 74 68 65 20 6e 61 6d 65 20 6f 66 20   or the name of 
5a10: 61 6e 20 61 74 74 61 63 68 65 64 20 64 62 29 2e  an attached db).
5a20: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   This routine re
5a30: 74 75 72 6e 73 20 74 68 65 0a 2a 2a 20 69 6e 64  turns the.** ind
5a40: 65 78 20 6f 66 20 74 68 65 20 6e 61 6d 65 64 20  ex of the named 
5a50: 64 61 74 61 62 61 73 65 20 69 6e 20 64 62 2d 3e  database in db->
5a60: 61 44 62 5b 5d 2c 20 6f 72 20 2d 31 20 69 66 20  aDb[], or -1 if 
5a70: 74 68 65 20 6e 61 6d 65 64 20 64 62 20 0a 2a 2a  the named db .**
5a80: 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2e   does not exist.
5a90: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46  .*/.int sqlite3F
5aa0: 69 6e 64 44 62 28 73 71 6c 69 74 65 33 20 2a 64  indDb(sqlite3 *d
5ab0: 62 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 29  b, Token *pName)
5ac0: 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20  {.  int i;      
5ad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5ae0: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
5af0: 62 61 73 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20  base number */. 
5b00: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 20 20 20   char *zName;   
5b10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5b20: 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 77 65        /* Name we
5b30: 20 61 72 65 20 73 65 61 72 63 68 69 6e 67 20 66   are searching f
5b40: 6f 72 20 2a 2f 0a 20 20 7a 4e 61 6d 65 20 3d 20  or */.  zName = 
5b50: 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54  sqlite3NameFromT
5b60: 6f 6b 65 6e 28 64 62 2c 20 70 4e 61 6d 65 29 3b  oken(db, pName);
5b70: 0a 20 20 69 20 3d 20 73 71 6c 69 74 65 33 46 69  .  i = sqlite3Fi
5b80: 6e 64 44 62 4e 61 6d 65 28 64 62 2c 20 7a 4e 61  ndDbName(db, zNa
5b90: 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62  me);.  sqlite3Db
5ba0: 46 72 65 65 28 64 62 2c 20 7a 4e 61 6d 65 29 3b  Free(db, zName);
5bb0: 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d 0a 0a  .  return i;.}..
5bc0: 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 6f 72 20  /* The table or 
5bd0: 76 69 65 77 20 6f 72 20 74 72 69 67 67 65 72 20  view or trigger 
5be0: 6e 61 6d 65 20 69 73 20 70 61 73 73 65 64 20 74  name is passed t
5bf0: 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 76  o this routine v
5c00: 69 61 20 74 6f 6b 65 6e 73 0a 2a 2a 20 70 4e 61  ia tokens.** pNa
5c10: 6d 65 31 20 61 6e 64 20 70 4e 61 6d 65 32 2e 20  me1 and pName2. 
5c20: 49 66 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d  If the table nam
5c30: 65 20 77 61 73 20 66 75 6c 6c 79 20 71 75 61 6c  e was fully qual
5c40: 69 66 69 65 64 2c 20 66 6f 72 20 65 78 61 6d 70  ified, for examp
5c50: 6c 65 3a 0a 2a 2a 0a 2a 2a 20 43 52 45 41 54 45  le:.**.** CREATE
5c60: 20 54 41 42 4c 45 20 78 78 78 2e 79 79 79 20 28   TABLE xxx.yyy (
5c70: 2e 2e 2e 29 3b 0a 2a 2a 20 0a 2a 2a 20 54 68 65  ...);.** .** The
5c80: 6e 20 70 4e 61 6d 65 31 20 69 73 20 73 65 74 20  n pName1 is set 
5c90: 74 6f 20 22 78 78 78 22 20 61 6e 64 20 70 4e 61  to "xxx" and pNa
5ca0: 6d 65 32 20 22 79 79 79 22 2e 20 4f 6e 20 74 68  me2 "yyy". On th
5cb0: 65 20 6f 74 68 65 72 20 68 61 6e 64 20 69 66 0a  e other hand if.
5cc0: 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d  ** the table nam
5cd0: 65 20 69 73 20 6e 6f 74 20 66 75 6c 6c 79 20 71  e is not fully q
5ce0: 75 61 6c 69 66 69 65 64 2c 20 69 2e 65 2e 3a 0a  ualified, i.e.:.
5cf0: 2a 2a 0a 2a 2a 20 43 52 45 41 54 45 20 54 41 42  **.** CREATE TAB
5d00: 4c 45 20 79 79 79 28 2e 2e 2e 29 3b 0a 2a 2a 0a  LE yyy(...);.**.
5d10: 2a 2a 20 54 68 65 6e 20 70 4e 61 6d 65 31 20 69  ** Then pName1 i
5d20: 73 20 73 65 74 20 74 6f 20 22 79 79 79 22 20 61  s set to "yyy" a
5d30: 6e 64 20 70 4e 61 6d 65 32 20 69 73 20 22 22 2e  nd pName2 is "".
5d40: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
5d50: 69 6e 65 20 73 65 74 73 20 74 68 65 20 2a 70 70  ine sets the *pp
5d60: 55 6e 71 75 61 6c 20 70 6f 69 6e 74 65 72 20 74  Unqual pointer t
5d70: 6f 20 70 6f 69 6e 74 20 61 74 20 74 68 65 20 74  o point at the t
5d80: 6f 6b 65 6e 20 28 70 4e 61 6d 65 31 20 6f 72 0a  oken (pName1 or.
5d90: 2a 2a 20 70 4e 61 6d 65 32 29 20 74 68 61 74 20  ** pName2) that 
5da0: 73 74 6f 72 65 73 20 74 68 65 20 75 6e 71 75 61  stores the unqua
5db0: 6c 69 66 69 65 64 20 74 61 62 6c 65 20 6e 61 6d  lified table nam
5dc0: 65 2e 20 20 54 68 65 20 69 6e 64 65 78 20 6f 66  e.  The index of
5dd0: 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65   the.** database
5de0: 20 22 78 78 78 22 20 69 73 20 72 65 74 75 72 6e   "xxx" is return
5df0: 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
5e00: 65 33 54 77 6f 50 61 72 74 4e 61 6d 65 28 0a 20  e3TwoPartName(. 
5e10: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
5e20: 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
5e30: 61 6e 64 20 63 6f 64 65 20 67 65 6e 65 72 61 74  and code generat
5e40: 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
5e50: 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c 20   Token *pName1, 
5e60: 20 20 20 20 20 2f 2a 20 54 68 65 20 22 78 78 78       /* The "xxx
5e70: 22 20 69 6e 20 74 68 65 20 6e 61 6d 65 20 22 78  " in the name "x
5e80: 78 78 2e 79 79 79 22 20 6f 72 20 22 78 78 78 22  xx.yyy" or "xxx"
5e90: 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61   */.  Token *pNa
5ea0: 6d 65 32 2c 20 20 20 20 20 20 2f 2a 20 54 68 65  me2,      /* The
5eb0: 20 22 79 79 79 22 20 69 6e 20 74 68 65 20 6e 61   "yyy" in the na
5ec0: 6d 65 20 22 78 78 78 2e 79 79 79 22 20 2a 2f 0a  me "xxx.yyy" */.
5ed0: 20 20 54 6f 6b 65 6e 20 2a 2a 70 55 6e 71 75 61    Token **pUnqua
5ee0: 6c 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74  l     /* Write t
5ef0: 68 65 20 75 6e 71 75 61 6c 69 66 69 65 64 20 6f  he unqualified o
5f00: 62 6a 65 63 74 20 6e 61 6d 65 20 68 65 72 65 20  bject name here 
5f10: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 44 62 3b  */.){.  int iDb;
5f20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5f30: 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
5f40: 68 6f 6c 64 69 6e 67 20 74 68 65 20 6f 62 6a 65  holding the obje
5f50: 63 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  ct */.  sqlite3 
5f60: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
5f70: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4e 61  ;..  assert( pNa
5f80: 6d 65 32 21 3d 30 20 29 3b 0a 20 20 69 66 28 20  me2!=0 );.  if( 
5f90: 70 4e 61 6d 65 32 2d 3e 6e 3e 30 20 29 7b 0a 20  pName2->n>0 ){. 
5fa0: 20 20 20 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e     if( db->init.
5fb0: 62 75 73 79 20 29 20 7b 0a 20 20 20 20 20 20 73  busy ) {.      s
5fc0: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
5fd0: 50 61 72 73 65 2c 20 22 63 6f 72 72 75 70 74 20  Parse, "corrupt 
5fe0: 64 61 74 61 62 61 73 65 22 29 3b 0a 20 20 20 20  database");.    
5ff0: 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20    return -1;.   
6000: 20 7d 0a 20 20 20 20 2a 70 55 6e 71 75 61 6c 20   }.    *pUnqual 
6010: 3d 20 70 4e 61 6d 65 32 3b 0a 20 20 20 20 69 44  = pName2;.    iD
6020: 62 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 44  b = sqlite3FindD
6030: 62 28 64 62 2c 20 70 4e 61 6d 65 31 29 3b 0a 20  b(db, pName1);. 
6040: 20 20 20 69 66 28 20 69 44 62 3c 30 20 29 7b 0a     if( iDb<0 ){.
6050: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
6060: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 75  orMsg(pParse, "u
6070: 6e 6b 6e 6f 77 6e 20 64 61 74 61 62 61 73 65 20  nknown database 
6080: 25 54 22 2c 20 70 4e 61 6d 65 31 29 3b 0a 20 20  %T", pName1);.  
6090: 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20      return -1;. 
60a0: 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
60b0: 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 69 6e    assert( db->in
60c0: 69 74 2e 69 44 62 3d 3d 30 20 7c 7c 20 64 62 2d  it.iDb==0 || db-
60d0: 3e 69 6e 69 74 2e 62 75 73 79 20 29 3b 0a 20 20  >init.busy );.  
60e0: 20 20 69 44 62 20 3d 20 64 62 2d 3e 69 6e 69 74    iDb = db->init
60f0: 2e 69 44 62 3b 0a 20 20 20 20 2a 70 55 6e 71 75  .iDb;.    *pUnqu
6100: 61 6c 20 3d 20 70 4e 61 6d 65 31 3b 0a 20 20 7d  al = pName1;.  }
6110: 0a 20 20 72 65 74 75 72 6e 20 69 44 62 3b 0a 7d  .  return iDb;.}
6120: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
6130: 74 69 6e 65 20 69 73 20 75 73 65 64 20 74 6f 20  tine is used to 
6140: 63 68 65 63 6b 20 69 66 20 74 68 65 20 55 54 46  check if the UTF
6150: 2d 38 20 73 74 72 69 6e 67 20 7a 4e 61 6d 65 20  -8 string zName 
6160: 69 73 20 61 20 6c 65 67 61 6c 0a 2a 2a 20 75 6e  is a legal.** un
6170: 71 75 61 6c 69 66 69 65 64 20 6e 61 6d 65 20 66  qualified name f
6180: 6f 72 20 61 20 6e 65 77 20 73 63 68 65 6d 61 20  or a new schema 
6190: 6f 62 6a 65 63 74 20 28 74 61 62 6c 65 2c 20 69  object (table, i
61a0: 6e 64 65 78 2c 20 76 69 65 77 20 6f 72 0a 2a 2a  ndex, view or.**
61b0: 20 74 72 69 67 67 65 72 29 2e 20 41 6c 6c 20 6e   trigger). All n
61c0: 61 6d 65 73 20 61 72 65 20 6c 65 67 61 6c 20 65  ames are legal e
61d0: 78 63 65 70 74 20 74 68 6f 73 65 20 74 68 61 74  xcept those that
61e0: 20 62 65 67 69 6e 20 77 69 74 68 20 74 68 65 20   begin with the 
61f0: 73 74 72 69 6e 67 0a 2a 2a 20 22 73 71 6c 69 74  string.** "sqlit
6200: 65 5f 22 20 28 69 6e 20 75 70 70 65 72 2c 20 6c  e_" (in upper, l
6210: 6f 77 65 72 20 6f 72 20 6d 69 78 65 64 20 63 61  ower or mixed ca
6220: 73 65 29 2e 20 54 68 69 73 20 70 6f 72 74 69 6f  se). This portio
6230: 6e 20 6f 66 20 74 68 65 20 6e 61 6d 65 73 70 61  n of the namespa
6240: 63 65 0a 2a 2a 20 69 73 20 72 65 73 65 72 76 65  ce.** is reserve
6250: 64 20 66 6f 72 20 69 6e 74 65 72 6e 61 6c 20 75  d for internal u
6260: 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  se..*/.int sqlit
6270: 65 33 43 68 65 63 6b 4f 62 6a 65 63 74 4e 61 6d  e3CheckObjectNam
6280: 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
6290: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
62a0: 6d 65 29 7b 0a 20 20 69 66 28 20 21 70 50 61 72  me){.  if( !pPar
62b0: 73 65 2d 3e 64 62 2d 3e 69 6e 69 74 2e 62 75 73  se->db->init.bus
62c0: 79 20 26 26 20 70 50 61 72 73 65 2d 3e 6e 65 73  y && pParse->nes
62d0: 74 65 64 3d 3d 30 20 0a 20 20 20 20 20 20 20 20  ted==0 .        
62e0: 20 20 26 26 20 28 70 50 61 72 73 65 2d 3e 64 62    && (pParse->db
62f0: 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ->flags & SQLITE
6300: 5f 57 72 69 74 65 53 63 68 65 6d 61 29 3d 3d 30  _WriteSchema)==0
6310: 0a 20 20 20 20 20 20 20 20 20 20 26 26 20 30 3d  .          && 0=
6320: 3d 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70  =sqlite3StrNICmp
6330: 28 7a 4e 61 6d 65 2c 20 22 73 71 6c 69 74 65 5f  (zName, "sqlite_
6340: 22 2c 20 37 29 20 29 7b 0a 20 20 20 20 73 71 6c  ", 7) ){.    sql
6350: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
6360: 72 73 65 2c 20 22 6f 62 6a 65 63 74 20 6e 61 6d  rse, "object nam
6370: 65 20 72 65 73 65 72 76 65 64 20 66 6f 72 20 69  e reserved for i
6380: 6e 74 65 72 6e 61 6c 20 75 73 65 3a 20 25 73 22  nternal use: %s"
6390: 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72 65  , zName);.    re
63a0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
63b0: 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  R;.  }.  return 
63c0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
63d0: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 50  .** Return the P
63e0: 52 49 4d 41 52 59 20 4b 45 59 20 69 6e 64 65 78  RIMARY KEY index
63f0: 20 6f 66 20 61 20 74 61 62 6c 65 0a 2a 2f 0a 49   of a table.*/.I
6400: 6e 64 65 78 20 2a 73 71 6c 69 74 65 33 50 72 69  ndex *sqlite3Pri
6410: 6d 61 72 79 4b 65 79 49 6e 64 65 78 28 54 61 62  maryKeyIndex(Tab
6420: 6c 65 20 2a 70 54 61 62 29 7b 0a 20 20 49 6e 64  le *pTab){.  Ind
6430: 65 78 20 2a 70 3b 0a 20 20 66 6f 72 28 70 3d 70  ex *p;.  for(p=p
6440: 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 20 26  Tab->pIndex; p &
6450: 26 20 21 49 73 50 72 69 6d 61 72 79 4b 65 79 49  & !IsPrimaryKeyI
6460: 6e 64 65 78 28 70 29 3b 20 70 3d 70 2d 3e 70 4e  ndex(p); p=p->pN
6470: 65 78 74 29 7b 7d 0a 20 20 72 65 74 75 72 6e 20  ext){}.  return 
6480: 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  p;.}../*.** Retu
6490: 72 6e 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6f 66  rn the column of
64a0: 20 69 6e 64 65 78 20 70 49 64 78 20 74 68 61 74   index pIdx that
64b0: 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 20   corresponds to 
64c0: 74 61 62 6c 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 20  table.** column 
64d0: 69 43 6f 6c 2e 20 20 52 65 74 75 72 6e 20 2d 31  iCol.  Return -1
64e0: 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a   if not found..*
64f0: 2f 0a 69 31 36 20 73 71 6c 69 74 65 33 43 6f 6c  /.i16 sqlite3Col
6500: 75 6d 6e 4f 66 49 6e 64 65 78 28 49 6e 64 65 78  umnOfIndex(Index
6510: 20 2a 70 49 64 78 2c 20 69 31 36 20 69 43 6f 6c   *pIdx, i16 iCol
6520: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f  ){.  int i;.  fo
6530: 72 28 69 3d 30 3b 20 69 3c 70 49 64 78 2d 3e 6e  r(i=0; i<pIdx->n
6540: 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20  Column; i++){.  
6550: 20 20 69 66 28 20 69 43 6f 6c 3d 3d 70 49 64 78    if( iCol==pIdx
6560: 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 20 29 20  ->aiColumn[i] ) 
6570: 72 65 74 75 72 6e 20 69 3b 0a 20 20 7d 0a 20 20  return i;.  }.  
6580: 72 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 2f 2a  return -1;.}../*
6590: 0a 2a 2a 20 42 65 67 69 6e 20 63 6f 6e 73 74 72  .** Begin constr
65a0: 75 63 74 69 6e 67 20 61 20 6e 65 77 20 74 61 62  ucting a new tab
65b0: 6c 65 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f  le representatio
65c0: 6e 20 69 6e 20 6d 65 6d 6f 72 79 2e 20 20 54 68  n in memory.  Th
65d0: 69 73 20 69 73 0a 2a 2a 20 74 68 65 20 66 69 72  is is.** the fir
65e0: 73 74 20 6f 66 20 73 65 76 65 72 61 6c 20 61 63  st of several ac
65f0: 74 69 6f 6e 20 72 6f 75 74 69 6e 65 73 20 74 68  tion routines th
6600: 61 74 20 67 65 74 20 63 61 6c 6c 65 64 20 69 6e  at get called in
6610: 20 72 65 73 70 6f 6e 73 65 0a 2a 2a 20 74 6f 20   response.** to 
6620: 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73  a CREATE TABLE s
6630: 74 61 74 65 6d 65 6e 74 2e 20 20 49 6e 20 70 61  tatement.  In pa
6640: 72 74 69 63 75 6c 61 72 2c 20 74 68 69 73 20 72  rticular, this r
6650: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
6660: 0a 2a 2a 20 61 66 74 65 72 20 73 65 65 69 6e 67  .** after seeing
6670: 20 74 6f 6b 65 6e 73 20 22 43 52 45 41 54 45 22   tokens "CREATE"
6680: 20 61 6e 64 20 22 54 41 42 4c 45 22 20 61 6e 64   and "TABLE" and
6690: 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 2e   the table name.
66a0: 20 54 68 65 20 69 73 54 65 6d 70 0a 2a 2a 20 66   The isTemp.** f
66b0: 6c 61 67 20 69 73 20 74 72 75 65 20 69 66 20 74  lag is true if t
66c0: 68 65 20 74 61 62 6c 65 20 73 68 6f 75 6c 64 20  he table should 
66d0: 62 65 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65  be stored in the
66e0: 20 61 75 78 69 6c 69 61 72 79 20 64 61 74 61 62   auxiliary datab
66f0: 61 73 65 0a 2a 2a 20 66 69 6c 65 20 69 6e 73 74  ase.** file inst
6700: 65 61 64 20 6f 66 20 69 6e 20 74 68 65 20 6d 61  ead of in the ma
6710: 69 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  in database file
6720: 2e 20 20 54 68 69 73 20 69 73 20 6e 6f 72 6d 61  .  This is norma
6730: 6c 6c 79 20 74 68 65 20 63 61 73 65 0a 2a 2a 20  lly the case.** 
6740: 77 68 65 6e 20 74 68 65 20 22 54 45 4d 50 22 20  when the "TEMP" 
6750: 6f 72 20 22 54 45 4d 50 4f 52 41 52 59 22 20 6b  or "TEMPORARY" k
6760: 65 79 77 6f 72 64 20 6f 63 63 75 72 73 20 69 6e  eyword occurs in
6770: 20 62 65 74 77 65 65 6e 0a 2a 2a 20 43 52 45 41   between.** CREA
6780: 54 45 20 61 6e 64 20 54 41 42 4c 45 2e 0a 2a 2a  TE and TABLE..**
6790: 0a 2a 2a 20 54 68 65 20 6e 65 77 20 74 61 62 6c  .** The new tabl
67a0: 65 20 72 65 63 6f 72 64 20 69 73 20 69 6e 69 74  e record is init
67b0: 69 61 6c 69 7a 65 64 20 61 6e 64 20 70 75 74 20  ialized and put 
67c0: 69 6e 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54  in pParse->pNewT
67d0: 61 62 6c 65 2e 0a 2a 2a 20 41 73 20 6d 6f 72 65  able..** As more
67e0: 20 6f 66 20 74 68 65 20 43 52 45 41 54 45 20 54   of the CREATE T
67f0: 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 20 69  ABLE statement i
6800: 73 20 70 61 72 73 65 64 2c 20 61 64 64 69 74 69  s parsed, additi
6810: 6f 6e 61 6c 20 61 63 74 69 6f 6e 0a 2a 2a 20 72  onal action.** r
6820: 6f 75 74 69 6e 65 73 20 77 69 6c 6c 20 62 65 20  outines will be 
6830: 63 61 6c 6c 65 64 20 74 6f 20 61 64 64 20 6d 6f  called to add mo
6840: 72 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74  re information t
6850: 6f 20 74 68 69 73 20 72 65 63 6f 72 64 2e 0a 2a  o this record..*
6860: 2a 20 41 74 20 74 68 65 20 65 6e 64 20 6f 66 20  * At the end of 
6870: 74 68 65 20 43 52 45 41 54 45 20 54 41 42 4c 45  the CREATE TABLE
6880: 20 73 74 61 74 65 6d 65 6e 74 2c 20 74 68 65 20   statement, the 
6890: 73 71 6c 69 74 65 33 45 6e 64 54 61 62 6c 65 28  sqlite3EndTable(
68a0: 29 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 73 20  ) routine.** is 
68b0: 63 61 6c 6c 65 64 20 74 6f 20 63 6f 6d 70 6c 65  called to comple
68c0: 74 65 20 74 68 65 20 63 6f 6e 73 74 72 75 63 74  te the construct
68d0: 69 6f 6e 20 6f 66 20 74 68 65 20 6e 65 77 20 74  ion of the new t
68e0: 61 62 6c 65 20 72 65 63 6f 72 64 2e 0a 2a 2f 0a  able record..*/.
68f0: 76 6f 69 64 20 73 71 6c 69 74 65 33 53 74 61 72  void sqlite3Star
6900: 74 54 61 62 6c 65 28 0a 20 20 50 61 72 73 65 20  tTable(.  Parse 
6910: 2a 70 50 61 72 73 65 2c 20 20 20 2f 2a 20 50 61  *pParse,   /* Pa
6920: 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  rser context */.
6930: 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c    Token *pName1,
6940: 20 20 20 2f 2a 20 46 69 72 73 74 20 70 61 72 74     /* First part
6950: 20 6f 66 20 74 68 65 20 6e 61 6d 65 20 6f 66 20   of the name of 
6960: 74 68 65 20 74 61 62 6c 65 20 6f 72 20 76 69 65  the table or vie
6970: 77 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e  w */.  Token *pN
6980: 61 6d 65 32 2c 20 20 20 2f 2a 20 53 65 63 6f 6e  ame2,   /* Secon
6990: 64 20 70 61 72 74 20 6f 66 20 74 68 65 20 6e 61  d part of the na
69a0: 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  me of the table 
69b0: 6f 72 20 76 69 65 77 20 2a 2f 0a 20 20 69 6e 74  or view */.  int
69c0: 20 69 73 54 65 6d 70 2c 20 20 20 20 20 20 2f 2a   isTemp,      /*
69d0: 20 54 72 75 65 20 69 66 20 74 68 69 73 20 69 73   True if this is
69e0: 20 61 20 54 45 4d 50 20 74 61 62 6c 65 20 2a 2f   a TEMP table */
69f0: 0a 20 20 69 6e 74 20 69 73 56 69 65 77 2c 20 20  .  int isView,  
6a00: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74      /* True if t
6a10: 68 69 73 20 69 73 20 61 20 56 49 45 57 20 2a 2f  his is a VIEW */
6a20: 0a 20 20 69 6e 74 20 69 73 56 69 72 74 75 61 6c  .  int isVirtual
6a30: 2c 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74  ,   /* True if t
6a40: 68 69 73 20 69 73 20 61 20 56 49 52 54 55 41 4c  his is a VIRTUAL
6a50: 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20   table */.  int 
6a60: 6e 6f 45 72 72 20 20 20 20 20 20 20 20 2f 2a 20  noErr        /* 
6a70: 44 6f 20 6e 6f 74 68 69 6e 67 20 69 66 20 74 61  Do nothing if ta
6a80: 62 6c 65 20 61 6c 72 65 61 64 79 20 65 78 69 73  ble already exis
6a90: 74 73 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65  ts */.){.  Table
6aa0: 20 2a 70 54 61 62 6c 65 3b 0a 20 20 63 68 61 72   *pTable;.  char
6ab0: 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b 20 2f 2a 20   *zName = 0; /* 
6ac0: 54 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  The name of the 
6ad0: 6e 65 77 20 74 61 62 6c 65 20 2a 2f 0a 20 20 73  new table */.  s
6ae0: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
6af0: 72 73 65 2d 3e 64 62 3b 0a 20 20 56 64 62 65 20  rse->db;.  Vdbe 
6b00: 2a 76 3b 0a 20 20 69 6e 74 20 69 44 62 3b 20 20  *v;.  int iDb;  
6b10: 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
6b20: 73 65 20 6e 75 6d 62 65 72 20 74 6f 20 63 72 65  se number to cre
6b30: 61 74 65 20 74 68 65 20 74 61 62 6c 65 20 69 6e  ate the table in
6b40: 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61   */.  Token *pNa
6b50: 6d 65 3b 20 20 20 20 2f 2a 20 55 6e 71 75 61 6c  me;    /* Unqual
6b60: 69 66 69 65 64 20 6e 61 6d 65 20 6f 66 20 74 68  ified name of th
6b70: 65 20 74 61 62 6c 65 20 74 6f 20 63 72 65 61 74  e table to creat
6b80: 65 20 2a 2f 0a 0a 20 20 69 66 28 20 64 62 2d 3e  e */..  if( db->
6b90: 69 6e 69 74 2e 62 75 73 79 20 26 26 20 64 62 2d  init.busy && db-
6ba0: 3e 69 6e 69 74 2e 6e 65 77 54 6e 75 6d 3d 3d 31  >init.newTnum==1
6bb0: 20 29 7b 0a 20 20 20 20 2f 2a 20 53 70 65 63 69   ){.    /* Speci
6bc0: 61 6c 20 63 61 73 65 3a 20 20 50 61 72 73 69 6e  al case:  Parsin
6bd0: 67 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73  g the sqlite_mas
6be0: 74 65 72 20 6f 72 20 73 71 6c 69 74 65 5f 74 65  ter or sqlite_te
6bf0: 6d 70 5f 6d 61 73 74 65 72 20 73 63 68 65 6d 61  mp_master schema
6c00: 20 2a 2f 0a 20 20 20 20 69 44 62 20 3d 20 64 62   */.    iDb = db
6c10: 2d 3e 69 6e 69 74 2e 69 44 62 3b 0a 20 20 20 20  ->init.iDb;.    
6c20: 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44  zName = sqlite3D
6c30: 62 53 74 72 44 75 70 28 64 62 2c 20 53 43 48 45  bStrDup(db, SCHE
6c40: 4d 41 5f 54 41 42 4c 45 28 69 44 62 29 29 3b 0a  MA_TABLE(iDb));.
6c50: 20 20 20 20 70 4e 61 6d 65 20 3d 20 70 4e 61 6d      pName = pNam
6c60: 65 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  e1;.  }else{.   
6c70: 20 2f 2a 20 54 68 65 20 63 6f 6d 6d 6f 6e 20 63   /* The common c
6c80: 61 73 65 20 2a 2f 0a 20 20 20 20 69 44 62 20 3d  ase */.    iDb =
6c90: 20 73 71 6c 69 74 65 33 54 77 6f 50 61 72 74 4e   sqlite3TwoPartN
6ca0: 61 6d 65 28 70 50 61 72 73 65 2c 20 70 4e 61 6d  ame(pParse, pNam
6cb0: 65 31 2c 20 70 4e 61 6d 65 32 2c 20 26 70 4e 61  e1, pName2, &pNa
6cc0: 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 69 44 62  me);.    if( iDb
6cd0: 3c 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20  <0 ) return;.   
6ce0: 20 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44   if( !OMIT_TEMPD
6cf0: 42 20 26 26 20 69 73 54 65 6d 70 20 26 26 20 70  B && isTemp && p
6d00: 4e 61 6d 65 32 2d 3e 6e 3e 30 20 26 26 20 69 44  Name2->n>0 && iD
6d10: 62 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 2f 2a  b!=1 ){.      /*
6d20: 20 49 66 20 63 72 65 61 74 69 6e 67 20 61 20 74   If creating a t
6d30: 65 6d 70 20 74 61 62 6c 65 2c 20 74 68 65 20 6e  emp table, the n
6d40: 61 6d 65 20 6d 61 79 20 6e 6f 74 20 62 65 20 71  ame may not be q
6d50: 75 61 6c 69 66 69 65 64 2e 20 55 6e 6c 65 73 73  ualified. Unless
6d60: 20 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 64   .      ** the d
6d70: 61 74 61 62 61 73 65 20 6e 61 6d 65 20 69 73 20  atabase name is 
6d80: 22 74 65 6d 70 22 20 61 6e 79 77 61 79 2e 20 20  "temp" anyway.  
6d90: 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
6da0: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
6db0: 20 22 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c   "temporary tabl
6dc0: 65 20 6e 61 6d 65 20 6d 75 73 74 20 62 65 20 75  e name must be u
6dd0: 6e 71 75 61 6c 69 66 69 65 64 22 29 3b 0a 20 20  nqualified");.  
6de0: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
6df0: 7d 0a 20 20 20 20 69 66 28 20 21 4f 4d 49 54 5f  }.    if( !OMIT_
6e00: 54 45 4d 50 44 42 20 26 26 20 69 73 54 65 6d 70  TEMPDB && isTemp
6e10: 20 29 20 69 44 62 20 3d 20 31 3b 0a 20 20 20 20   ) iDb = 1;.    
6e20: 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e  zName = sqlite3N
6e30: 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c  ameFromToken(db,
6e40: 20 70 4e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 70   pName);.  }.  p
6e50: 50 61 72 73 65 2d 3e 73 4e 61 6d 65 54 6f 6b 65  Parse->sNameToke
6e60: 6e 20 3d 20 2a 70 4e 61 6d 65 3b 0a 20 20 69 66  n = *pName;.  if
6e70: 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 20 72 65 74  ( zName==0 ) ret
6e80: 75 72 6e 3b 0a 20 20 69 66 28 20 53 51 4c 49 54  urn;.  if( SQLIT
6e90: 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 43 68 65  E_OK!=sqlite3Che
6ea0: 63 6b 4f 62 6a 65 63 74 4e 61 6d 65 28 70 50 61  ckObjectName(pPa
6eb0: 72 73 65 2c 20 7a 4e 61 6d 65 29 20 29 7b 0a 20  rse, zName) ){. 
6ec0: 20 20 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61     goto begin_ta
6ed0: 62 6c 65 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 20  ble_error;.  }. 
6ee0: 20 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 69 44   if( db->init.iD
6ef0: 62 3d 3d 31 20 29 20 69 73 54 65 6d 70 20 3d 20  b==1 ) isTemp = 
6f00: 31 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  1;.#ifndef SQLIT
6f10: 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41  E_OMIT_AUTHORIZA
6f20: 54 49 4f 4e 0a 20 20 61 73 73 65 72 74 28 20 69  TION.  assert( i
6f30: 73 54 65 6d 70 3d 3d 30 20 7c 7c 20 69 73 54 65  sTemp==0 || isTe
6f40: 6d 70 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65 72  mp==1 );.  asser
6f50: 74 28 20 69 73 56 69 65 77 3d 3d 30 20 7c 7c 20  t( isView==0 || 
6f60: 69 73 56 69 65 77 3d 3d 31 20 29 3b 0a 20 20 7b  isView==1 );.  {
6f70: 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73  .    static cons
6f80: 74 20 75 38 20 61 43 6f 64 65 5b 5d 20 3d 20 7b  t u8 aCode[] = {
6f90: 0a 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 43  .       SQLITE_C
6fa0: 52 45 41 54 45 5f 54 41 42 4c 45 2c 0a 20 20 20  REATE_TABLE,.   
6fb0: 20 20 20 20 53 51 4c 49 54 45 5f 43 52 45 41 54      SQLITE_CREAT
6fc0: 45 5f 54 45 4d 50 5f 54 41 42 4c 45 2c 0a 20 20  E_TEMP_TABLE,.  
6fd0: 20 20 20 20 20 53 51 4c 49 54 45 5f 43 52 45 41       SQLITE_CREA
6fe0: 54 45 5f 56 49 45 57 2c 0a 20 20 20 20 20 20 20  TE_VIEW,.       
6ff0: 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 45  SQLITE_CREATE_TE
7000: 4d 50 5f 56 49 45 57 0a 20 20 20 20 7d 3b 0a 20  MP_VIEW.    };. 
7010: 20 20 20 63 68 61 72 20 2a 7a 44 62 20 3d 20 64     char *zDb = d
7020: 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d  b->aDb[iDb].zNam
7030: 65 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  e;.    if( sqlit
7040: 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72  e3AuthCheck(pPar
7050: 73 65 2c 20 53 51 4c 49 54 45 5f 49 4e 53 45 52  se, SQLITE_INSER
7060: 54 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28  T, SCHEMA_TABLE(
7070: 69 73 54 65 6d 70 29 2c 20 30 2c 20 7a 44 62 29  isTemp), 0, zDb)
7080: 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 62   ){.      goto b
7090: 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72  egin_table_error
70a0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
70b0: 21 69 73 56 69 72 74 75 61 6c 20 26 26 20 73 71  !isVirtual && sq
70c0: 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70  lite3AuthCheck(p
70d0: 50 61 72 73 65 2c 20 28 69 6e 74 29 61 43 6f 64  Parse, (int)aCod
70e0: 65 5b 69 73 54 65 6d 70 2b 32 2a 69 73 56 69 65  e[isTemp+2*isVie
70f0: 77 5d 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  w],.            
7100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7110: 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65             zName
7120: 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20  , 0, zDb) ){.   
7130: 20 20 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61     goto begin_ta
7140: 62 6c 65 5f 65 72 72 6f 72 3b 0a 20 20 20 20 7d  ble_error;.    }
7150: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  .  }.#endif..  /
7160: 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20  * Make sure the 
7170: 6e 65 77 20 74 61 62 6c 65 20 6e 61 6d 65 20 64  new table name d
7180: 6f 65 73 20 6e 6f 74 20 63 6f 6c 6c 69 64 65 20  oes not collide 
7190: 77 69 74 68 20 61 6e 20 65 78 69 73 74 69 6e 67  with an existing
71a0: 0a 20 20 2a 2a 20 69 6e 64 65 78 20 6f 72 20 74  .  ** index or t
71b0: 61 62 6c 65 20 6e 61 6d 65 20 69 6e 20 74 68 65  able name in the
71c0: 20 73 61 6d 65 20 64 61 74 61 62 61 73 65 2e 20   same database. 
71d0: 20 49 73 73 75 65 20 61 6e 20 65 72 72 6f 72 20   Issue an error 
71e0: 6d 65 73 73 61 67 65 20 69 66 0a 20 20 2a 2a 20  message if.  ** 
71f0: 69 74 20 64 6f 65 73 2e 20 54 68 65 20 65 78 63  it does. The exc
7200: 65 70 74 69 6f 6e 20 69 73 20 69 66 20 74 68 65  eption is if the
7210: 20 73 74 61 74 65 6d 65 6e 74 20 62 65 69 6e 67   statement being
7220: 20 70 61 72 73 65 64 20 77 61 73 20 70 61 73 73   parsed was pass
7230: 65 64 0a 20 20 2a 2a 20 74 6f 20 61 6e 20 73 71  ed.  ** to an sq
7240: 6c 69 74 65 33 5f 64 65 63 6c 61 72 65 5f 76 74  lite3_declare_vt
7250: 61 62 28 29 20 63 61 6c 6c 2e 20 49 6e 20 74 68  ab() call. In th
7260: 61 74 20 63 61 73 65 20 6f 6e 6c 79 20 74 68 65  at case only the
7270: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 0a 20 20   column names.  
7280: 2a 2a 20 61 6e 64 20 74 79 70 65 73 20 77 69 6c  ** and types wil
7290: 6c 20 62 65 20 75 73 65 64 2c 20 73 6f 20 74 68  l be used, so th
72a0: 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 20 74  ere is no need t
72b0: 6f 20 74 65 73 74 20 66 6f 72 20 6e 61 6d 65 73  o test for names
72c0: 70 61 63 65 0a 20 20 2a 2a 20 63 6f 6c 6c 69 73  pace.  ** collis
72d0: 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ions..  */.  if(
72e0: 20 21 49 4e 5f 44 45 43 4c 41 52 45 5f 56 54 41   !IN_DECLARE_VTA
72f0: 42 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a  B ){.    char *z
7300: 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62  Db = db->aDb[iDb
7310: 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 69 66 28  ].zName;.    if(
7320: 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69   SQLITE_OK!=sqli
7330: 74 65 33 52 65 61 64 53 63 68 65 6d 61 28 70 50  te3ReadSchema(pP
7340: 61 72 73 65 29 20 29 7b 0a 20 20 20 20 20 20 67  arse) ){.      g
7350: 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f  oto begin_table_
7360: 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 20  error;.    }.   
7370: 20 70 54 61 62 6c 65 20 3d 20 73 71 6c 69 74 65   pTable = sqlite
7380: 33 46 69 6e 64 54 61 62 6c 65 28 64 62 2c 20 7a  3FindTable(db, z
7390: 4e 61 6d 65 2c 20 7a 44 62 29 3b 0a 20 20 20 20  Name, zDb);.    
73a0: 69 66 28 20 70 54 61 62 6c 65 20 29 7b 0a 20 20  if( pTable ){.  
73b0: 20 20 20 20 69 66 28 20 21 6e 6f 45 72 72 20 29      if( !noErr )
73c0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
73d0: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
73e0: 2c 20 22 74 61 62 6c 65 20 25 54 20 61 6c 72 65  , "table %T alre
73f0: 61 64 79 20 65 78 69 73 74 73 22 2c 20 70 4e 61  ady exists", pNa
7400: 6d 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  me);.      }else
7410: 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
7420: 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  ( !db->init.busy
7430: 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29   || CORRUPT_DB )
7440: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
7450: 33 43 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d  3CodeVerifySchem
7460: 61 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a  a(pParse, iDb);.
7470: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 67 6f        }.      go
7480: 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65  to begin_table_e
7490: 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rror;.    }.    
74a0: 69 66 28 20 73 71 6c 69 74 65 33 46 69 6e 64 49  if( sqlite3FindI
74b0: 6e 64 65 78 28 64 62 2c 20 7a 4e 61 6d 65 2c 20  ndex(db, zName, 
74c0: 7a 44 62 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  zDb)!=0 ){.     
74d0: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
74e0: 28 70 50 61 72 73 65 2c 20 22 74 68 65 72 65 20  (pParse, "there 
74f0: 69 73 20 61 6c 72 65 61 64 79 20 61 6e 20 69 6e  is already an in
7500: 64 65 78 20 6e 61 6d 65 64 20 25 73 22 2c 20 7a  dex named %s", z
7510: 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 67 6f 74  Name);.      got
7520: 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72  o begin_table_er
7530: 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ror;.    }.  }..
7540: 20 20 70 54 61 62 6c 65 20 3d 20 73 71 6c 69 74    pTable = sqlit
7550: 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64  e3DbMallocZero(d
7560: 62 2c 20 73 69 7a 65 6f 66 28 54 61 62 6c 65 29  b, sizeof(Table)
7570: 29 3b 0a 20 20 69 66 28 20 70 54 61 62 6c 65 3d  );.  if( pTable=
7580: 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  =0 ){.    assert
7590: 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
75a0: 65 64 20 29 3b 0a 20 20 20 20 70 50 61 72 73 65  ed );.    pParse
75b0: 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f  ->rc = SQLITE_NO
75c0: 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 70 50  MEM_BKPT;.    pP
75d0: 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20  arse->nErr++;.  
75e0: 20 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62    goto begin_tab
75f0: 6c 65 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 20 20  le_error;.  }.  
7600: 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 20 3d 20  pTable->zName = 
7610: 7a 4e 61 6d 65 3b 0a 20 20 70 54 61 62 6c 65 2d  zName;.  pTable-
7620: 3e 69 50 4b 65 79 20 3d 20 2d 31 3b 0a 20 20 70  >iPKey = -1;.  p
7630: 54 61 62 6c 65 2d 3e 70 53 63 68 65 6d 61 20 3d  Table->pSchema =
7640: 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53   db->aDb[iDb].pS
7650: 63 68 65 6d 61 3b 0a 20 20 70 54 61 62 6c 65 2d  chema;.  pTable-
7660: 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20 70 54 61  >nRef = 1;.  pTa
7670: 62 6c 65 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74 20  ble->nRowLogEst 
7680: 3d 20 32 30 30 3b 20 61 73 73 65 72 74 28 20 32  = 200; assert( 2
7690: 30 30 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73  00==sqlite3LogEs
76a0: 74 28 31 30 34 38 35 37 36 29 20 29 3b 0a 20 20  t(1048576) );.  
76b0: 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e  assert( pParse->
76c0: 70 4e 65 77 54 61 62 6c 65 3d 3d 30 20 29 3b 0a  pNewTable==0 );.
76d0: 20 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61    pParse->pNewTa
76e0: 62 6c 65 20 3d 20 70 54 61 62 6c 65 3b 0a 0a 20  ble = pTable;.. 
76f0: 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 74   /* If this is t
7700: 68 65 20 6d 61 67 69 63 20 73 71 6c 69 74 65 5f  he magic sqlite_
7710: 73 65 71 75 65 6e 63 65 20 74 61 62 6c 65 20 75  sequence table u
7720: 73 65 64 20 62 79 20 61 75 74 6f 69 6e 63 72 65  sed by autoincre
7730: 6d 65 6e 74 2c 0a 20 20 2a 2a 20 74 68 65 6e 20  ment,.  ** then 
7740: 72 65 63 6f 72 64 20 61 20 70 6f 69 6e 74 65 72  record a pointer
7750: 20 74 6f 20 74 68 69 73 20 74 61 62 6c 65 20 69   to this table i
7760: 6e 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62  n the main datab
7770: 61 73 65 20 73 74 72 75 63 74 75 72 65 0a 20 20  ase structure.  
7780: 2a 2a 20 73 6f 20 74 68 61 74 20 49 4e 53 45 52  ** so that INSER
7790: 54 20 63 61 6e 20 66 69 6e 64 20 74 68 65 20 74  T can find the t
77a0: 61 62 6c 65 20 65 61 73 69 6c 79 2e 0a 20 20 2a  able easily..  *
77b0: 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
77c0: 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 43 52 45 4d  _OMIT_AUTOINCREM
77d0: 45 4e 54 0a 20 20 69 66 28 20 21 70 50 61 72 73  ENT.  if( !pPars
77e0: 65 2d 3e 6e 65 73 74 65 64 20 26 26 20 73 74 72  e->nested && str
77f0: 63 6d 70 28 7a 4e 61 6d 65 2c 20 22 73 71 6c 69  cmp(zName, "sqli
7800: 74 65 5f 73 65 71 75 65 6e 63 65 22 29 3d 3d 30  te_sequence")==0
7810: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
7820: 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74  sqlite3SchemaMut
7830: 65 78 48 65 6c 64 28 64 62 2c 20 69 44 62 2c 20  exHeld(db, iDb, 
7840: 30 29 20 29 3b 0a 20 20 20 20 70 54 61 62 6c 65  0) );.    pTable
7850: 2d 3e 70 53 63 68 65 6d 61 2d 3e 70 53 65 71 54  ->pSchema->pSeqT
7860: 61 62 20 3d 20 70 54 61 62 6c 65 3b 0a 20 20 7d  ab = pTable;.  }
7870: 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 42 65  .#endif..  /* Be
7880: 67 69 6e 20 67 65 6e 65 72 61 74 69 6e 67 20 74  gin generating t
7890: 68 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c  he code that wil
78a0: 6c 20 69 6e 73 65 72 74 20 74 68 65 20 74 61 62  l insert the tab
78b0: 6c 65 20 72 65 63 6f 72 64 20 69 6e 74 6f 0a 20  le record into. 
78c0: 20 2a 2a 20 74 68 65 20 53 51 4c 49 54 45 5f 4d   ** the SQLITE_M
78d0: 41 53 54 45 52 20 74 61 62 6c 65 2e 20 20 4e 6f  ASTER table.  No
78e0: 74 65 20 69 6e 20 70 61 72 74 69 63 75 6c 61 72  te in particular
78f0: 20 74 68 61 74 20 77 65 20 6d 75 73 74 20 67 6f   that we must go
7900: 20 61 68 65 61 64 0a 20 20 2a 2a 20 61 6e 64 20   ahead.  ** and 
7910: 61 6c 6c 6f 63 61 74 65 20 74 68 65 20 72 65 63  allocate the rec
7920: 6f 72 64 20 6e 75 6d 62 65 72 20 66 6f 72 20 74  ord number for t
7930: 68 65 20 74 61 62 6c 65 20 65 6e 74 72 79 20 6e  he table entry n
7940: 6f 77 2e 20 20 42 65 66 6f 72 65 20 61 6e 79 0a  ow.  Before any.
7950: 20 20 2a 2a 20 50 52 49 4d 41 52 59 20 4b 45 59    ** PRIMARY KEY
7960: 20 6f 72 20 55 4e 49 51 55 45 20 6b 65 79 77 6f   or UNIQUE keywo
7970: 72 64 73 20 61 72 65 20 70 61 72 73 65 64 2e 20  rds are parsed. 
7980: 20 54 68 6f 73 65 20 6b 65 79 77 6f 72 64 73 20   Those keywords 
7990: 77 69 6c 6c 20 63 61 75 73 65 0a 20 20 2a 2a 20  will cause.  ** 
79a0: 69 6e 64 69 63 65 73 20 74 6f 20 62 65 20 63 72  indices to be cr
79b0: 65 61 74 65 64 20 61 6e 64 20 74 68 65 20 74 61  eated and the ta
79c0: 62 6c 65 20 72 65 63 6f 72 64 20 6d 75 73 74 20  ble record must 
79d0: 63 6f 6d 65 20 62 65 66 6f 72 65 20 74 68 65 20  come before the 
79e0: 0a 20 20 2a 2a 20 69 6e 64 69 63 65 73 2e 20 20  .  ** indices.  
79f0: 48 65 6e 63 65 2c 20 74 68 65 20 72 65 63 6f 72  Hence, the recor
7a00: 64 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65  d number for the
7a10: 20 74 61 62 6c 65 20 6d 75 73 74 20 62 65 20 61   table must be a
7a20: 6c 6c 6f 63 61 74 65 64 0a 20 20 2a 2a 20 6e 6f  llocated.  ** no
7a30: 77 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 64  w..  */.  if( !d
7a40: 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 26 26 20  b->init.busy && 
7a50: 28 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56  (v = sqlite3GetV
7a60: 64 62 65 28 70 50 61 72 73 65 29 29 21 3d 30 20  dbe(pParse))!=0 
7a70: 29 7b 0a 20 20 20 20 69 6e 74 20 61 64 64 72 31  ){.    int addr1
7a80: 3b 0a 20 20 20 20 69 6e 74 20 66 69 6c 65 46 6f  ;.    int fileFo
7a90: 72 6d 61 74 3b 0a 20 20 20 20 69 6e 74 20 72 65  rmat;.    int re
7aa0: 67 31 2c 20 72 65 67 32 2c 20 72 65 67 33 3b 0a  g1, reg2, reg3;.
7ab0: 20 20 20 20 2f 2a 20 6e 75 6c 6c 52 6f 77 5b 5d      /* nullRow[]
7ac0: 20 69 73 20 61 6e 20 4f 50 5f 52 65 63 6f 72 64   is an OP_Record
7ad0: 20 65 6e 63 6f 64 69 6e 67 20 6f 66 20 61 20 72   encoding of a r
7ae0: 6f 77 20 63 6f 6e 74 61 69 6e 69 6e 67 20 35 20  ow containing 5 
7af0: 4e 55 4c 4c 73 20 2a 2f 0a 20 20 20 20 73 74 61  NULLs */.    sta
7b00: 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 6e  tic const char n
7b10: 75 6c 6c 52 6f 77 5b 5d 20 3d 20 7b 20 36 2c 20  ullRow[] = { 6, 
7b20: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 20 7d 3b  0, 0, 0, 0, 0 };
7b30: 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69  .    sqlite3Begi
7b40: 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28  nWriteOperation(
7b50: 70 50 61 72 73 65 2c 20 31 2c 20 69 44 62 29 3b  pParse, 1, iDb);
7b60: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
7b70: 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
7b80: 4c 45 0a 20 20 20 20 69 66 28 20 69 73 56 69 72  LE.    if( isVir
7b90: 74 75 61 6c 20 29 7b 0a 20 20 20 20 20 20 73 71  tual ){.      sq
7ba0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 28  lite3VdbeAddOp0(
7bb0: 76 2c 20 4f 50 5f 56 42 65 67 69 6e 29 3b 0a 20  v, OP_VBegin);. 
7bc0: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20     }.#endif..   
7bd0: 20 2f 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20   /* If the file 
7be0: 66 6f 72 6d 61 74 20 61 6e 64 20 65 6e 63 6f 64  format and encod
7bf0: 69 6e 67 20 69 6e 20 74 68 65 20 64 61 74 61 62  ing in the datab
7c00: 61 73 65 20 68 61 76 65 20 6e 6f 74 20 62 65 65  ase have not bee
7c10: 6e 20 73 65 74 2c 20 0a 20 20 20 20 2a 2a 20 73  n set, .    ** s
7c20: 65 74 20 74 68 65 6d 20 6e 6f 77 2e 0a 20 20 20  et them now..   
7c30: 20 2a 2f 0a 20 20 20 20 72 65 67 31 20 3d 20 70   */.    reg1 = p
7c40: 50 61 72 73 65 2d 3e 72 65 67 52 6f 77 69 64 20  Parse->regRowid 
7c50: 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
7c60: 3b 0a 20 20 20 20 72 65 67 32 20 3d 20 70 50 61  ;.    reg2 = pPa
7c70: 72 73 65 2d 3e 72 65 67 52 6f 6f 74 20 3d 20 2b  rse->regRoot = +
7c80: 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
7c90: 20 20 20 72 65 67 33 20 3d 20 2b 2b 70 50 61 72     reg3 = ++pPar
7ca0: 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 73 71  se->nMem;.    sq
7cb0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
7cc0: 76 2c 20 4f 50 5f 52 65 61 64 43 6f 6f 6b 69 65  v, OP_ReadCookie
7cd0: 2c 20 69 44 62 2c 20 72 65 67 33 2c 20 42 54 52  , iDb, reg3, BTR
7ce0: 45 45 5f 46 49 4c 45 5f 46 4f 52 4d 41 54 29 3b  EE_FILE_FORMAT);
7cf0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
7d00: 55 73 65 73 42 74 72 65 65 28 76 2c 20 69 44 62  UsesBtree(v, iDb
7d10: 29 3b 0a 20 20 20 20 61 64 64 72 31 20 3d 20 73  );.    addr1 = s
7d20: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
7d30: 28 76 2c 20 4f 50 5f 49 66 2c 20 72 65 67 33 29  (v, OP_If, reg3)
7d40: 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
7d50: 29 3b 0a 20 20 20 20 66 69 6c 65 46 6f 72 6d 61  );.    fileForma
7d60: 74 20 3d 20 28 64 62 2d 3e 66 6c 61 67 73 20 26  t = (db->flags &
7d70: 20 53 51 4c 49 54 45 5f 4c 65 67 61 63 79 46 69   SQLITE_LegacyFi
7d80: 6c 65 46 6d 74 29 21 3d 30 20 3f 0a 20 20 20 20  leFmt)!=0 ?.    
7d90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 31 20                1 
7da0: 3a 20 53 51 4c 49 54 45 5f 4d 41 58 5f 46 49 4c  : SQLITE_MAX_FIL
7db0: 45 5f 46 4f 52 4d 41 54 3b 0a 20 20 20 20 73 71  E_FORMAT;.    sq
7dc0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
7dd0: 76 2c 20 4f 50 5f 53 65 74 43 6f 6f 6b 69 65 2c  v, OP_SetCookie,
7de0: 20 69 44 62 2c 20 42 54 52 45 45 5f 46 49 4c 45   iDb, BTREE_FILE
7df0: 5f 46 4f 52 4d 41 54 2c 20 66 69 6c 65 46 6f 72  _FORMAT, fileFor
7e00: 6d 61 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  mat);.    sqlite
7e10: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
7e20: 50 5f 53 65 74 43 6f 6f 6b 69 65 2c 20 69 44 62  P_SetCookie, iDb
7e30: 2c 20 42 54 52 45 45 5f 54 45 58 54 5f 45 4e 43  , BTREE_TEXT_ENC
7e40: 4f 44 49 4e 47 2c 20 45 4e 43 28 64 62 29 29 3b  ODING, ENC(db));
7e50: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
7e60: 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
7e70: 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 69 73  1);..    /* This
7e80: 20 6a 75 73 74 20 63 72 65 61 74 65 73 20 61 20   just creates a 
7e90: 70 6c 61 63 65 2d 68 6f 6c 64 65 72 20 72 65 63  place-holder rec
7ea0: 6f 72 64 20 69 6e 20 74 68 65 20 73 71 6c 69 74  ord in the sqlit
7eb0: 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 2e 0a  e_master table..
7ec0: 20 20 20 20 2a 2a 20 54 68 65 20 72 65 63 6f 72      ** The recor
7ed0: 64 20 63 72 65 61 74 65 64 20 64 6f 65 73 20 6e  d created does n
7ee0: 6f 74 20 63 6f 6e 74 61 69 6e 20 61 6e 79 74 68  ot contain anyth
7ef0: 69 6e 67 20 79 65 74 2e 20 20 49 74 20 77 69 6c  ing yet.  It wil
7f00: 6c 20 62 65 20 72 65 70 6c 61 63 65 64 0a 20 20  l be replaced.  
7f10: 20 20 2a 2a 20 62 79 20 74 68 65 20 72 65 61 6c    ** by the real
7f20: 20 65 6e 74 72 79 20 69 6e 20 63 6f 64 65 20 67   entry in code g
7f30: 65 6e 65 72 61 74 65 64 20 61 74 20 73 71 6c 69  enerated at sqli
7f40: 74 65 33 45 6e 64 54 61 62 6c 65 28 29 2e 0a 20  te3EndTable().. 
7f50: 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65     **.    ** The
7f60: 20 72 6f 77 69 64 20 66 6f 72 20 74 68 65 20 6e   rowid for the n
7f70: 65 77 20 65 6e 74 72 79 20 69 73 20 6c 65 66 74  ew entry is left
7f80: 20 69 6e 20 72 65 67 69 73 74 65 72 20 70 50 61   in register pPa
7f90: 72 73 65 2d 3e 72 65 67 52 6f 77 69 64 2e 0a 20  rse->regRowid.. 
7fa0: 20 20 20 2a 2a 20 54 68 65 20 72 6f 6f 74 20 70     ** The root p
7fb0: 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68  age number of th
7fc0: 65 20 6e 65 77 20 74 61 62 6c 65 20 69 73 20 6c  e new table is l
7fd0: 65 66 74 20 69 6e 20 72 65 67 20 70 50 61 72 73  eft in reg pPars
7fe0: 65 2d 3e 72 65 67 52 6f 6f 74 2e 0a 20 20 20 20  e->regRoot..    
7ff0: 2a 2a 20 54 68 65 20 72 6f 77 69 64 20 61 6e 64  ** The rowid and
8000: 20 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62 65   root page numbe
8010: 72 20 76 61 6c 75 65 73 20 61 72 65 20 6e 65 65  r values are nee
8020: 64 65 64 20 62 79 20 74 68 65 20 63 6f 64 65 20  ded by the code 
8030: 74 68 61 74 0a 20 20 20 20 2a 2a 20 73 71 6c 69  that.    ** sqli
8040: 74 65 33 45 6e 64 54 61 62 6c 65 20 77 69 6c 6c  te3EndTable will
8050: 20 67 65 6e 65 72 61 74 65 2e 0a 20 20 20 20 2a   generate..    *
8060: 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  /.#if !defined(S
8070: 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29  QLITE_OMIT_VIEW)
8080: 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c   || !defined(SQL
8090: 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
80a0: 54 41 42 4c 45 29 0a 20 20 20 20 69 66 28 20 69  TABLE).    if( i
80b0: 73 56 69 65 77 20 7c 7c 20 69 73 56 69 72 74 75  sView || isVirtu
80c0: 61 6c 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  al ){.      sqli
80d0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
80e0: 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20   OP_Integer, 0, 
80f0: 72 65 67 32 29 3b 0a 20 20 20 20 7d 65 6c 73 65  reg2);.    }else
8100: 0a 23 65 6e 64 69 66 0a 20 20 20 20 7b 0a 20 20  .#endif.    {.  
8110: 20 20 20 20 70 50 61 72 73 65 2d 3e 61 64 64 72      pParse->addr
8120: 43 72 54 61 62 20 3d 20 73 71 6c 69 74 65 33 56  CrTab = sqlite3V
8130: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
8140: 43 72 65 61 74 65 54 61 62 6c 65 2c 20 69 44 62  CreateTable, iDb
8150: 2c 20 72 65 67 32 29 3b 0a 20 20 20 20 7d 0a 20  , reg2);.    }. 
8160: 20 20 20 73 71 6c 69 74 65 33 4f 70 65 6e 4d 61     sqlite3OpenMa
8170: 73 74 65 72 54 61 62 6c 65 28 70 50 61 72 73 65  sterTable(pParse
8180: 2c 20 69 44 62 29 3b 0a 20 20 20 20 73 71 6c 69  , iDb);.    sqli
8190: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
81a0: 20 4f 50 5f 4e 65 77 52 6f 77 69 64 2c 20 30 2c   OP_NewRowid, 0,
81b0: 20 72 65 67 31 29 3b 0a 20 20 20 20 73 71 6c 69   reg1);.    sqli
81c0: 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
81d0: 20 4f 50 5f 42 6c 6f 62 2c 20 36 2c 20 72 65 67   OP_Blob, 6, reg
81e0: 33 2c 20 30 2c 20 6e 75 6c 6c 52 6f 77 2c 20 50  3, 0, nullRow, P
81f0: 34 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 73  4_STATIC);.    s
8200: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
8210: 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20 30  (v, OP_Insert, 0
8220: 2c 20 72 65 67 33 2c 20 72 65 67 31 29 3b 0a 20  , reg3, reg1);. 
8230: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
8240: 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47  angeP5(v, OPFLAG
8250: 5f 41 50 50 45 4e 44 29 3b 0a 20 20 20 20 73 71  _APPEND);.    sq
8260: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 28  lite3VdbeAddOp0(
8270: 76 2c 20 4f 50 5f 43 6c 6f 73 65 29 3b 0a 20 20  v, OP_Close);.  
8280: 7d 0a 0a 20 20 2f 2a 20 4e 6f 72 6d 61 6c 20 28  }..  /* Normal (
8290: 6e 6f 6e 2d 65 72 72 6f 72 29 20 72 65 74 75 72  non-error) retur
82a0: 6e 2e 20 2a 2f 0a 20 20 72 65 74 75 72 6e 3b 0a  n. */.  return;.
82b0: 0a 20 20 2f 2a 20 49 66 20 61 6e 20 65 72 72 6f  .  /* If an erro
82c0: 72 20 6f 63 63 75 72 73 2c 20 77 65 20 6a 75 6d  r occurs, we jum
82d0: 70 20 68 65 72 65 20 2a 2f 0a 62 65 67 69 6e 5f  p here */.begin_
82e0: 74 61 62 6c 65 5f 65 72 72 6f 72 3a 0a 20 20 73  table_error:.  s
82f0: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
8300: 20 7a 4e 61 6d 65 29 3b 0a 20 20 72 65 74 75 72   zName);.  retur
8310: 6e 3b 0a 7d 0a 0a 2f 2a 20 53 65 74 20 70 72 6f  n;.}../* Set pro
8320: 70 65 72 74 69 65 73 20 6f 66 20 61 20 74 61 62  perties of a tab
8330: 6c 65 20 63 6f 6c 75 6d 6e 20 62 61 73 65 64 20  le column based 
8340: 6f 6e 20 74 68 65 20 28 6d 61 67 69 63 61 6c 29  on the (magical)
8350: 0a 2a 2a 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  .** name of the 
8360: 63 6f 6c 75 6d 6e 2e 0a 2a 2f 0a 23 69 66 20 53  column..*/.#if S
8370: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 48 49 44  QLITE_ENABLE_HID
8380: 44 45 4e 5f 43 4f 4c 55 4d 4e 53 0a 76 6f 69 64  DEN_COLUMNS.void
8390: 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 50 72   sqlite3ColumnPr
83a0: 6f 70 65 72 74 69 65 73 46 72 6f 6d 4e 61 6d 65  opertiesFromName
83b0: 28 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 43 6f  (Table *pTab, Co
83c0: 6c 75 6d 6e 20 2a 70 43 6f 6c 29 7b 0a 20 20 69  lumn *pCol){.  i
83d0: 66 28 20 73 71 6c 69 74 65 33 5f 73 74 72 6e 69  f( sqlite3_strni
83e0: 63 6d 70 28 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 2c  cmp(pCol->zName,
83f0: 20 22 5f 5f 68 69 64 64 65 6e 5f 5f 22 2c 20 31   "__hidden__", 1
8400: 30 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70 43 6f  0)==0 ){.    pCo
8410: 6c 2d 3e 63 6f 6c 46 6c 61 67 73 20 7c 3d 20 43  l->colFlags |= C
8420: 4f 4c 46 4c 41 47 5f 48 49 44 44 45 4e 3b 0a 20  OLFLAG_HIDDEN;. 
8430: 20 7d 65 6c 73 65 20 69 66 28 20 70 54 61 62 20   }else if( pTab 
8440: 26 26 20 70 43 6f 6c 21 3d 70 54 61 62 2d 3e 61  && pCol!=pTab->a
8450: 43 6f 6c 20 26 26 20 28 70 43 6f 6c 5b 2d 31 5d  Col && (pCol[-1]
8460: 2e 63 6f 6c 46 6c 61 67 73 20 26 20 43 4f 4c 46  .colFlags & COLF
8470: 4c 41 47 5f 48 49 44 44 45 4e 29 20 29 7b 0a 20  LAG_HIDDEN) ){. 
8480: 20 20 20 70 54 61 62 2d 3e 74 61 62 46 6c 61 67     pTab->tabFlag
8490: 73 20 7c 3d 20 54 46 5f 4f 4f 4f 48 69 64 64 65  s |= TF_OOOHidde
84a0: 6e 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a  n;.  }.}.#endif.
84b0: 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65  ../*.** Add a ne
84c0: 77 20 63 6f 6c 75 6d 6e 20 74 6f 20 74 68 65 20  w column to the 
84d0: 74 61 62 6c 65 20 63 75 72 72 65 6e 74 6c 79 20  table currently 
84e0: 62 65 69 6e 67 20 63 6f 6e 73 74 72 75 63 74 65  being constructe
84f0: 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 72  d..**.** The par
8500: 73 65 72 20 63 61 6c 6c 73 20 74 68 69 73 20 72  ser calls this r
8510: 6f 75 74 69 6e 65 20 6f 6e 63 65 20 66 6f 72 20  outine once for 
8520: 65 61 63 68 20 63 6f 6c 75 6d 6e 20 64 65 63 6c  each column decl
8530: 61 72 61 74 69 6f 6e 0a 2a 2a 20 69 6e 20 61 20  aration.** in a 
8540: 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61  CREATE TABLE sta
8550: 74 65 6d 65 6e 74 2e 20 20 73 71 6c 69 74 65 33  tement.  sqlite3
8560: 53 74 61 72 74 54 61 62 6c 65 28 29 20 67 65 74  StartTable() get
8570: 73 20 63 61 6c 6c 65 64 0a 2a 2a 20 66 69 72 73  s called.** firs
8580: 74 20 74 6f 20 67 65 74 20 74 68 69 6e 67 73 20  t to get things 
8590: 67 6f 69 6e 67 2e 20 20 54 68 65 6e 20 74 68 69  going.  Then thi
85a0: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
85b0: 6c 65 64 20 66 6f 72 20 65 61 63 68 0a 2a 2a 20  led for each.** 
85c0: 63 6f 6c 75 6d 6e 2e 0a 2a 2f 0a 76 6f 69 64 20  column..*/.void 
85d0: 73 71 6c 69 74 65 33 41 64 64 43 6f 6c 75 6d 6e  sqlite3AddColumn
85e0: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
85f0: 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 29 7b 0a 20  Token *pName){. 
8600: 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 69 6e 74   Table *p;.  int
8610: 20 69 3b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20   i;.  char *z;. 
8620: 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20   Column *pCol;. 
8630: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
8640: 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28  Parse->db;.  if(
8650: 20 28 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e   (p = pParse->pN
8660: 65 77 54 61 62 6c 65 29 3d 3d 30 20 29 20 72 65  ewTable)==0 ) re
8670: 74 75 72 6e 3b 0a 23 69 66 20 53 51 4c 49 54 45  turn;.#if SQLITE
8680: 5f 4d 41 58 5f 43 4f 4c 55 4d 4e 0a 20 20 69 66  _MAX_COLUMN.  if
8690: 28 20 70 2d 3e 6e 43 6f 6c 2b 31 3e 64 62 2d 3e  ( p->nCol+1>db->
86a0: 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49  aLimit[SQLITE_LI
86b0: 4d 49 54 5f 43 4f 4c 55 4d 4e 5d 20 29 7b 0a 20  MIT_COLUMN] ){. 
86c0: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
86d0: 73 67 28 70 50 61 72 73 65 2c 20 22 74 6f 6f 20  sg(pParse, "too 
86e0: 6d 61 6e 79 20 63 6f 6c 75 6d 6e 73 20 6f 6e 20  many columns on 
86f0: 25 73 22 2c 20 70 2d 3e 7a 4e 61 6d 65 29 3b 0a  %s", p->zName);.
8700: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
8710: 23 65 6e 64 69 66 0a 20 20 7a 20 3d 20 73 71 6c  #endif.  z = sql
8720: 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65  ite3NameFromToke
8730: 6e 28 64 62 2c 20 70 4e 61 6d 65 29 3b 0a 20 20  n(db, pName);.  
8740: 69 66 28 20 7a 3d 3d 30 20 29 20 72 65 74 75 72  if( z==0 ) retur
8750: 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  n;.  for(i=0; i<
8760: 70 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20  p->nCol; i++){. 
8770: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73     if( sqlite3_s
8780: 74 72 69 63 6d 70 28 7a 2c 20 70 2d 3e 61 43 6f  tricmp(z, p->aCo
8790: 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29  l[i].zName)==0 )
87a0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
87b0: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
87c0: 22 64 75 70 6c 69 63 61 74 65 20 63 6f 6c 75 6d  "duplicate colum
87d0: 6e 20 6e 61 6d 65 3a 20 25 73 22 2c 20 7a 29 3b  n name: %s", z);
87e0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62  .      sqlite3Db
87f0: 46 72 65 65 28 64 62 2c 20 7a 29 3b 0a 20 20 20  Free(db, z);.   
8800: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d     return;.    }
8810: 0a 20 20 7d 0a 20 20 69 66 28 20 28 70 2d 3e 6e  .  }.  if( (p->n
8820: 43 6f 6c 20 26 20 30 78 37 29 3d 3d 30 20 29 7b  Col & 0x7)==0 ){
8830: 0a 20 20 20 20 43 6f 6c 75 6d 6e 20 2a 61 4e 65  .    Column *aNe
8840: 77 3b 0a 20 20 20 20 61 4e 65 77 20 3d 20 73 71  w;.    aNew = sq
8850: 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 28 64  lite3DbRealloc(d
8860: 62 2c 70 2d 3e 61 43 6f 6c 2c 28 70 2d 3e 6e 43  b,p->aCol,(p->nC
8870: 6f 6c 2b 38 29 2a 73 69 7a 65 6f 66 28 70 2d 3e  ol+8)*sizeof(p->
8880: 61 43 6f 6c 5b 30 5d 29 29 3b 0a 20 20 20 20 69  aCol[0]));.    i
8890: 66 28 20 61 4e 65 77 3d 3d 30 20 29 7b 0a 20 20  f( aNew==0 ){.  
88a0: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
88b0: 65 28 64 62 2c 20 7a 29 3b 0a 20 20 20 20 20 20  e(db, z);.      
88c0: 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20  return;.    }.  
88d0: 20 20 70 2d 3e 61 43 6f 6c 20 3d 20 61 4e 65 77    p->aCol = aNew
88e0: 3b 0a 20 20 7d 0a 20 20 70 43 6f 6c 20 3d 20 26  ;.  }.  pCol = &
88f0: 70 2d 3e 61 43 6f 6c 5b 70 2d 3e 6e 43 6f 6c 5d  p->aCol[p->nCol]
8900: 3b 0a 20 20 6d 65 6d 73 65 74 28 70 43 6f 6c 2c  ;.  memset(pCol,
8910: 20 30 2c 20 73 69 7a 65 6f 66 28 70 2d 3e 61 43   0, sizeof(p->aC
8920: 6f 6c 5b 30 5d 29 29 3b 0a 20 20 70 43 6f 6c 2d  ol[0]));.  pCol-
8930: 3e 7a 4e 61 6d 65 20 3d 20 7a 3b 0a 20 20 73 71  >zName = z;.  sq
8940: 6c 69 74 65 33 43 6f 6c 75 6d 6e 50 72 6f 70 65  lite3ColumnPrope
8950: 72 74 69 65 73 46 72 6f 6d 4e 61 6d 65 28 70 2c  rtiesFromName(p,
8960: 20 70 43 6f 6c 29 3b 0a 20 0a 20 20 2f 2a 20 49   pCol);. .  /* I
8970: 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 74 79  f there is no ty
8980: 70 65 20 73 70 65 63 69 66 69 65 64 2c 20 63 6f  pe specified, co
8990: 6c 75 6d 6e 73 20 68 61 76 65 20 74 68 65 20 64  lumns have the d
89a0: 65 66 61 75 6c 74 20 61 66 66 69 6e 69 74 79 0a  efault affinity.
89b0: 20 20 2a 2a 20 27 42 4c 4f 42 27 2e 20 49 66 20    ** 'BLOB'. If 
89c0: 74 68 65 72 65 20 69 73 20 61 20 74 79 70 65 20  there is a type 
89d0: 73 70 65 63 69 66 69 65 64 2c 20 74 68 65 6e 20  specified, then 
89e0: 73 71 6c 69 74 65 33 41 64 64 43 6f 6c 75 6d 6e  sqlite3AddColumn
89f0: 54 79 70 65 28 29 20 77 69 6c 6c 0a 20 20 2a 2a  Type() will.  **
8a00: 20 62 65 20 63 61 6c 6c 65 64 20 6e 65 78 74 20   be called next 
8a10: 74 6f 20 73 65 74 20 70 43 6f 6c 2d 3e 61 66 66  to set pCol->aff
8a20: 69 6e 69 74 79 20 63 6f 72 72 65 63 74 6c 79 2e  inity correctly.
8a30: 0a 20 20 2a 2f 0a 20 20 70 43 6f 6c 2d 3e 61 66  .  */.  pCol->af
8a40: 66 69 6e 69 74 79 20 3d 20 53 51 4c 49 54 45 5f  finity = SQLITE_
8a50: 41 46 46 5f 42 4c 4f 42 3b 0a 20 20 70 43 6f 6c  AFF_BLOB;.  pCol
8a60: 2d 3e 73 7a 45 73 74 20 3d 20 31 3b 0a 20 20 70  ->szEst = 1;.  p
8a70: 2d 3e 6e 43 6f 6c 2b 2b 3b 0a 7d 0a 0a 2f 2a 0a  ->nCol++;.}../*.
8a80: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
8a90: 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65  is called by the
8aa0: 20 70 61 72 73 65 72 20 77 68 69 6c 65 20 69 6e   parser while in
8ab0: 20 74 68 65 20 6d 69 64 64 6c 65 20 6f 66 0a 2a   the middle of.*
8ac0: 2a 20 70 61 72 73 69 6e 67 20 61 20 43 52 45 41  * parsing a CREA
8ad0: 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65  TE TABLE stateme
8ae0: 6e 74 2e 20 20 41 20 22 4e 4f 54 20 4e 55 4c 4c  nt.  A "NOT NULL
8af0: 22 20 63 6f 6e 73 74 72 61 69 6e 74 20 68 61 73  " constraint has
8b00: 0a 2a 2a 20 62 65 65 6e 20 73 65 65 6e 20 6f 6e  .** been seen on
8b10: 20 61 20 63 6f 6c 75 6d 6e 2e 20 20 54 68 69 73   a column.  This
8b20: 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20 74 68   routine sets th
8b30: 65 20 6e 6f 74 4e 75 6c 6c 20 66 6c 61 67 20 6f  e notNull flag o
8b40: 6e 0a 2a 2a 20 74 68 65 20 63 6f 6c 75 6d 6e 20  n.** the column 
8b50: 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72 20  currently under 
8b60: 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f  construction..*/
8b70: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 41 64 64  .void sqlite3Add
8b80: 4e 6f 74 4e 75 6c 6c 28 50 61 72 73 65 20 2a 70  NotNull(Parse *p
8b90: 50 61 72 73 65 2c 20 69 6e 74 20 6f 6e 45 72 72  Parse, int onErr
8ba0: 6f 72 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b  or){.  Table *p;
8bb0: 0a 20 20 70 20 3d 20 70 50 61 72 73 65 2d 3e 70  .  p = pParse->p
8bc0: 4e 65 77 54 61 62 6c 65 3b 0a 20 20 69 66 28 20  NewTable;.  if( 
8bd0: 70 3d 3d 30 20 7c 7c 20 4e 45 56 45 52 28 70 2d  p==0 || NEVER(p-
8be0: 3e 6e 43 6f 6c 3c 31 29 20 29 20 72 65 74 75 72  >nCol<1) ) retur
8bf0: 6e 3b 0a 20 20 70 2d 3e 61 43 6f 6c 5b 70 2d 3e  n;.  p->aCol[p->
8c00: 6e 43 6f 6c 2d 31 5d 2e 6e 6f 74 4e 75 6c 6c 20  nCol-1].notNull 
8c10: 3d 20 28 75 38 29 6f 6e 45 72 72 6f 72 3b 0a 7d  = (u8)onError;.}
8c20: 0a 0a 2f 2a 0a 2a 2a 20 53 63 61 6e 20 74 68 65  ../*.** Scan the
8c30: 20 63 6f 6c 75 6d 6e 20 74 79 70 65 20 6e 61 6d   column type nam
8c40: 65 20 7a 54 79 70 65 20 28 6c 65 6e 67 74 68 20  e zType (length 
8c50: 6e 54 79 70 65 29 20 61 6e 64 20 72 65 74 75 72  nType) and retur
8c60: 6e 20 74 68 65 0a 2a 2a 20 61 73 73 6f 63 69 61  n the.** associa
8c70: 74 65 64 20 61 66 66 69 6e 69 74 79 20 74 79 70  ted affinity typ
8c80: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  e..**.** This ro
8c90: 75 74 69 6e 65 20 64 6f 65 73 20 61 20 63 61 73  utine does a cas
8ca0: 65 2d 69 6e 64 65 70 65 6e 64 65 6e 74 20 73 65  e-independent se
8cb0: 61 72 63 68 20 6f 66 20 7a 54 79 70 65 20 66 6f  arch of zType fo
8cc0: 72 20 74 68 65 20 0a 2a 2a 20 73 75 62 73 74 72  r the .** substr
8cd0: 69 6e 67 73 20 69 6e 20 74 68 65 20 66 6f 6c 6c  ings in the foll
8ce0: 6f 77 69 6e 67 20 74 61 62 6c 65 2e 20 49 66 20  owing table. If 
8cf0: 6f 6e 65 20 6f 66 20 74 68 65 20 73 75 62 73 74  one of the subst
8d00: 72 69 6e 67 73 20 69 73 0a 2a 2a 20 66 6f 75 6e  rings is.** foun
8d10: 64 2c 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e  d, the correspon
8d20: 64 69 6e 67 20 61 66 66 69 6e 69 74 79 20 69 73  ding affinity is
8d30: 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 7a 54   returned. If zT
8d40: 79 70 65 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20  ype contains.** 
8d50: 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 6f 66  more than one of
8d60: 20 74 68 65 20 73 75 62 73 74 72 69 6e 67 73 2c   the substrings,
8d70: 20 65 6e 74 72 69 65 73 20 74 6f 77 61 72 64 20   entries toward 
8d80: 74 68 65 20 74 6f 70 20 6f 66 20 0a 2a 2a 20 74  the top of .** t
8d90: 68 65 20 74 61 62 6c 65 20 74 61 6b 65 20 70 72  he table take pr
8da0: 69 6f 72 69 74 79 2e 20 46 6f 72 20 65 78 61 6d  iority. For exam
8db0: 70 6c 65 2c 20 69 66 20 7a 54 79 70 65 20 69 73  ple, if zType is
8dc0: 20 27 42 4c 4f 42 49 4e 54 27 2c 20 0a 2a 2a 20   'BLOBINT', .** 
8dd0: 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47  SQLITE_AFF_INTEG
8de0: 45 52 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  ER is returned..
8df0: 2a 2a 0a 2a 2a 20 53 75 62 73 74 72 69 6e 67 20  **.** Substring 
8e00: 20 20 20 20 7c 20 41 66 66 69 6e 69 74 79 0a 2a      | Affinity.*
8e10: 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  * --------------
8e20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8e30: 2d 2d 0a 2a 2a 20 27 49 4e 54 27 20 20 20 20 20  --.** 'INT'     
8e40: 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 41 46 46      | SQLITE_AFF
8e50: 5f 49 4e 54 45 47 45 52 0a 2a 2a 20 27 43 48 41  _INTEGER.** 'CHA
8e60: 52 27 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49  R'        | SQLI
8e70: 54 45 5f 41 46 46 5f 54 45 58 54 0a 2a 2a 20 27  TE_AFF_TEXT.** '
8e80: 43 4c 4f 42 27 20 20 20 20 20 20 20 20 7c 20 53  CLOB'        | S
8e90: 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 0a 2a  QLITE_AFF_TEXT.*
8ea0: 2a 20 27 54 45 58 54 27 20 20 20 20 20 20 20 20  * 'TEXT'        
8eb0: 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58  | SQLITE_AFF_TEX
8ec0: 54 0a 2a 2a 20 27 42 4c 4f 42 27 20 20 20 20 20  T.** 'BLOB'     
8ed0: 20 20 20 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f     | SQLITE_AFF_
8ee0: 42 4c 4f 42 0a 2a 2a 20 27 52 45 41 4c 27 20 20  BLOB.** 'REAL'  
8ef0: 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 41        | SQLITE_A
8f00: 46 46 5f 52 45 41 4c 0a 2a 2a 20 27 46 4c 4f 41  FF_REAL.** 'FLOA
8f10: 27 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54  '        | SQLIT
8f20: 45 5f 41 46 46 5f 52 45 41 4c 0a 2a 2a 20 27 44  E_AFF_REAL.** 'D
8f30: 4f 55 42 27 20 20 20 20 20 20 20 20 7c 20 53 51  OUB'        | SQ
8f40: 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 0a 2a 2a  LITE_AFF_REAL.**
8f50: 0a 2a 2a 20 49 66 20 6e 6f 6e 65 20 6f 66 20 74  .** If none of t
8f60: 68 65 20 73 75 62 73 74 72 69 6e 67 73 20 69 6e  he substrings in
8f70: 20 74 68 65 20 61 62 6f 76 65 20 74 61 62 6c 65   the above table
8f80: 20 61 72 65 20 66 6f 75 6e 64 2c 0a 2a 2a 20 53   are found,.** S
8f90: 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49  QLITE_AFF_NUMERI
8fa0: 43 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  C is returned..*
8fb0: 2f 0a 63 68 61 72 20 73 71 6c 69 74 65 33 41 66  /.char sqlite3Af
8fc0: 66 69 6e 69 74 79 54 79 70 65 28 63 6f 6e 73 74  finityType(const
8fd0: 20 63 68 61 72 20 2a 7a 49 6e 2c 20 75 38 20 2a   char *zIn, u8 *
8fe0: 70 73 7a 45 73 74 29 7b 0a 20 20 75 33 32 20 68  pszEst){.  u32 h
8ff0: 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 61 66 66   = 0;.  char aff
9000: 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55   = SQLITE_AFF_NU
9010: 4d 45 52 49 43 3b 0a 20 20 63 6f 6e 73 74 20 63  MERIC;.  const c
9020: 68 61 72 20 2a 7a 43 68 61 72 20 3d 20 30 3b 0a  har *zChar = 0;.
9030: 0a 20 20 69 66 28 20 7a 49 6e 3d 3d 30 20 29 20  .  if( zIn==0 ) 
9040: 72 65 74 75 72 6e 20 61 66 66 3b 0a 20 20 77 68  return aff;.  wh
9050: 69 6c 65 28 20 7a 49 6e 5b 30 5d 20 29 7b 0a 20  ile( zIn[0] ){. 
9060: 20 20 20 68 20 3d 20 28 68 3c 3c 38 29 20 2b 20     h = (h<<8) + 
9070: 73 71 6c 69 74 65 33 55 70 70 65 72 54 6f 4c 6f  sqlite3UpperToLo
9080: 77 65 72 5b 28 2a 7a 49 6e 29 26 30 78 66 66 5d  wer[(*zIn)&0xff]
9090: 3b 0a 20 20 20 20 7a 49 6e 2b 2b 3b 0a 20 20 20  ;.    zIn++;.   
90a0: 20 69 66 28 20 68 3d 3d 28 28 27 63 27 3c 3c 32   if( h==(('c'<<2
90b0: 34 29 2b 28 27 68 27 3c 3c 31 36 29 2b 28 27 61  4)+('h'<<16)+('a
90c0: 27 3c 3c 38 29 2b 27 72 27 29 20 29 7b 20 20 20  '<<8)+'r') ){   
90d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 48 41            /* CHA
90e0: 52 20 2a 2f 0a 20 20 20 20 20 20 61 66 66 20 3d  R */.      aff =
90f0: 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54   SQLITE_AFF_TEXT
9100: 3b 0a 20 20 20 20 20 20 7a 43 68 61 72 20 3d 20  ;.      zChar = 
9110: 7a 49 6e 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  zIn;.    }else i
9120: 66 28 20 68 3d 3d 28 28 27 63 27 3c 3c 32 34 29  f( h==(('c'<<24)
9130: 2b 28 27 6c 27 3c 3c 31 36 29 2b 28 27 6f 27 3c  +('l'<<16)+('o'<
9140: 3c 38 29 2b 27 62 27 29 20 29 7b 20 20 20 20 20  <8)+'b') ){     
9150: 20 20 2f 2a 20 43 4c 4f 42 20 2a 2f 0a 20 20 20    /* CLOB */.   
9160: 20 20 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f     aff = SQLITE_
9170: 41 46 46 5f 54 45 58 54 3b 0a 20 20 20 20 7d 65  AFF_TEXT;.    }e
9180: 6c 73 65 20 69 66 28 20 68 3d 3d 28 28 27 74 27  lse if( h==(('t'
9190: 3c 3c 32 34 29 2b 28 27 65 27 3c 3c 31 36 29 2b  <<24)+('e'<<16)+
91a0: 28 27 78 27 3c 3c 38 29 2b 27 74 27 29 20 29 7b  ('x'<<8)+'t') ){
91b0: 20 20 20 20 20 20 20 2f 2a 20 54 45 58 54 20 2a         /* TEXT *
91c0: 2f 0a 20 20 20 20 20 20 61 66 66 20 3d 20 53 51  /.      aff = SQ
91d0: 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 3b 0a 20  LITE_AFF_TEXT;. 
91e0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 68 3d 3d     }else if( h==
91f0: 28 28 27 62 27 3c 3c 32 34 29 2b 28 27 6c 27 3c  (('b'<<24)+('l'<
9200: 3c 31 36 29 2b 28 27 6f 27 3c 3c 38 29 2b 27 62  <16)+('o'<<8)+'b
9210: 27 29 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42  ')          /* B
9220: 4c 4f 42 20 2a 2f 0a 20 20 20 20 20 20 20 20 26  LOB */.        &
9230: 26 20 28 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41  & (aff==SQLITE_A
9240: 46 46 5f 4e 55 4d 45 52 49 43 20 7c 7c 20 61 66  FF_NUMERIC || af
9250: 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 52 45  f==SQLITE_AFF_RE
9260: 41 4c 29 20 29 7b 0a 20 20 20 20 20 20 61 66 66  AL) ){.      aff
9270: 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c   = SQLITE_AFF_BL
9280: 4f 42 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 49  OB;.      if( zI
9290: 6e 5b 30 5d 3d 3d 27 28 27 20 29 20 7a 43 68 61  n[0]=='(' ) zCha
92a0: 72 20 3d 20 7a 49 6e 3b 0a 23 69 66 6e 64 65 66  r = zIn;.#ifndef
92b0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f   SQLITE_OMIT_FLO
92c0: 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 20 20 20 20  ATING_POINT.    
92d0: 7d 65 6c 73 65 20 69 66 28 20 68 3d 3d 28 28 27  }else if( h==(('
92e0: 72 27 3c 3c 32 34 29 2b 28 27 65 27 3c 3c 31 36  r'<<24)+('e'<<16
92f0: 29 2b 28 27 61 27 3c 3c 38 29 2b 27 6c 27 29 20  )+('a'<<8)+'l') 
9300: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 45 41 4c           /* REAL
9310: 20 2a 2f 0a 20 20 20 20 20 20 20 20 26 26 20 61   */.        && a
9320: 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e  ff==SQLITE_AFF_N
9330: 55 4d 45 52 49 43 20 29 7b 0a 20 20 20 20 20 20  UMERIC ){.      
9340: 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46  aff = SQLITE_AFF
9350: 5f 52 45 41 4c 3b 0a 20 20 20 20 7d 65 6c 73 65  _REAL;.    }else
9360: 20 69 66 28 20 68 3d 3d 28 28 27 66 27 3c 3c 32   if( h==(('f'<<2
9370: 34 29 2b 28 27 6c 27 3c 3c 31 36 29 2b 28 27 6f  4)+('l'<<16)+('o
9380: 27 3c 3c 38 29 2b 27 61 27 29 20 20 20 20 20 20  '<<8)+'a')      
9390: 20 20 20 20 2f 2a 20 46 4c 4f 41 20 2a 2f 0a 20      /* FLOA */. 
93a0: 20 20 20 20 20 20 20 26 26 20 61 66 66 3d 3d 53         && aff==S
93b0: 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49  QLITE_AFF_NUMERI
93c0: 43 20 29 7b 0a 20 20 20 20 20 20 61 66 66 20 3d  C ){.      aff =
93d0: 20 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c   SQLITE_AFF_REAL
93e0: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
93f0: 68 3d 3d 28 28 27 64 27 3c 3c 32 34 29 2b 28 27  h==(('d'<<24)+('
9400: 6f 27 3c 3c 31 36 29 2b 28 27 75 27 3c 3c 38 29  o'<<16)+('u'<<8)
9410: 2b 27 62 27 29 20 20 20 20 20 20 20 20 20 20 2f  +'b')          /
9420: 2a 20 44 4f 55 42 20 2a 2f 0a 20 20 20 20 20 20  * DOUB */.      
9430: 20 20 26 26 20 61 66 66 3d 3d 53 51 4c 49 54 45    && aff==SQLITE
9440: 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20 29 7b 0a  _AFF_NUMERIC ){.
9450: 20 20 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49        aff = SQLI
9460: 54 45 5f 41 46 46 5f 52 45 41 4c 3b 0a 23 65 6e  TE_AFF_REAL;.#en
9470: 64 69 66 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  dif.    }else if
9480: 28 20 28 68 26 30 78 30 30 46 46 46 46 46 46 29  ( (h&0x00FFFFFF)
9490: 3d 3d 28 28 27 69 27 3c 3c 31 36 29 2b 28 27 6e  ==(('i'<<16)+('n
94a0: 27 3c 3c 38 29 2b 27 74 27 29 20 29 7b 20 20 20  '<<8)+'t') ){   
94b0: 20 2f 2a 20 49 4e 54 20 2a 2f 0a 20 20 20 20 20   /* INT */.     
94c0: 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46   aff = SQLITE_AF
94d0: 46 5f 49 4e 54 45 47 45 52 3b 0a 20 20 20 20 20  F_INTEGER;.     
94e0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
94f0: 7d 0a 0a 20 20 2f 2a 20 49 66 20 70 73 7a 45 73  }..  /* If pszEs
9500: 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 73  t is not NULL, s
9510: 74 6f 72 65 20 61 6e 20 65 73 74 69 6d 61 74 65  tore an estimate
9520: 20 6f 66 20 74 68 65 20 66 69 65 6c 64 20 73 69   of the field si
9530: 7a 65 2e 20 20 54 68 65 0a 20 20 2a 2a 20 65 73  ze.  The.  ** es
9540: 74 69 6d 61 74 65 20 69 73 20 73 63 61 6c 65 64  timate is scaled
9550: 20 73 6f 20 74 68 61 74 20 74 68 65 20 73 69 7a   so that the siz
9560: 65 20 6f 66 20 61 6e 20 69 6e 74 65 67 65 72 20  e of an integer 
9570: 69 73 20 31 2e 20 20 2a 2f 0a 20 20 69 66 28 20  is 1.  */.  if( 
9580: 70 73 7a 45 73 74 20 29 7b 0a 20 20 20 20 2a 70  pszEst ){.    *p
9590: 73 7a 45 73 74 20 3d 20 31 3b 20 20 20 2f 2a 20  szEst = 1;   /* 
95a0: 64 65 66 61 75 6c 74 20 73 69 7a 65 20 69 73 20  default size is 
95b0: 61 70 70 72 6f 78 20 34 20 62 79 74 65 73 20 2a  approx 4 bytes *
95c0: 2f 0a 20 20 20 20 69 66 28 20 61 66 66 3c 53 51  /.    if( aff<SQ
95d0: 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43  LITE_AFF_NUMERIC
95e0: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 7a 43   ){.      if( zC
95f0: 68 61 72 20 29 7b 0a 20 20 20 20 20 20 20 20 77  har ){.        w
9600: 68 69 6c 65 28 20 7a 43 68 61 72 5b 30 5d 20 29  hile( zChar[0] )
9610: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
9620: 73 71 6c 69 74 65 33 49 73 64 69 67 69 74 28 7a  sqlite3Isdigit(z
9630: 43 68 61 72 5b 30 5d 29 20 29 7b 0a 20 20 20 20  Char[0]) ){.    
9640: 20 20 20 20 20 20 20 20 69 6e 74 20 76 20 3d 20          int v = 
9650: 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  0;.            s
9660: 71 6c 69 74 65 33 47 65 74 49 6e 74 33 32 28 7a  qlite3GetInt32(z
9670: 43 68 61 72 2c 20 26 76 29 3b 0a 20 20 20 20 20  Char, &v);.     
9680: 20 20 20 20 20 20 20 76 20 3d 20 76 2f 34 20 2b         v = v/4 +
9690: 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   1;.            
96a0: 69 66 28 20 76 3e 32 35 35 20 29 20 76 20 3d 20  if( v>255 ) v = 
96b0: 32 35 35 3b 0a 20 20 20 20 20 20 20 20 20 20 20  255;.           
96c0: 20 2a 70 73 7a 45 73 74 20 3d 20 76 3b 20 2f 2a   *pszEst = v; /*
96d0: 20 42 4c 4f 42 28 6b 29 2c 20 56 41 52 43 48 41   BLOB(k), VARCHA
96e0: 52 28 6b 29 2c 20 43 48 41 52 28 6b 29 20 2d 3e  R(k), CHAR(k) ->
96f0: 20 72 3d 28 6b 2f 34 2b 31 29 20 2a 2f 0a 20 20   r=(k/4+1) */.  
9700: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
9710: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
9720: 20 20 20 20 20 20 20 7a 43 68 61 72 2b 2b 3b 0a         zChar++;.
9730: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
9740: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2a  }else{.        *
9750: 70 73 7a 45 73 74 20 3d 20 35 3b 20 20 20 2f 2a  pszEst = 5;   /*
9760: 20 42 4c 4f 42 2c 20 54 45 58 54 2c 20 43 4c 4f   BLOB, TEXT, CLO
9770: 42 20 2d 3e 20 72 3d 35 20 20 28 61 70 70 72 6f  B -> r=5  (appro
9780: 78 20 32 30 20 62 79 74 65 73 29 2a 2f 0a 20 20  x 20 bytes)*/.  
9790: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
97a0: 20 20 72 65 74 75 72 6e 20 61 66 66 3b 0a 7d 0a    return aff;.}.
97b0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
97c0: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 62 79  ine is called by
97d0: 20 74 68 65 20 70 61 72 73 65 72 20 77 68 69 6c   the parser whil
97e0: 65 20 69 6e 20 74 68 65 20 6d 69 64 64 6c 65 20  e in the middle 
97f0: 6f 66 0a 2a 2a 20 70 61 72 73 69 6e 67 20 61 20  of.** parsing a 
9800: 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61  CREATE TABLE sta
9810: 74 65 6d 65 6e 74 2e 20 20 54 68 65 20 70 46 69  tement.  The pFi
9820: 72 73 74 20 74 6f 6b 65 6e 20 69 73 20 74 68 65  rst token is the
9830: 20 66 69 72 73 74 0a 2a 2a 20 74 6f 6b 65 6e 20   first.** token 
9840: 69 6e 20 74 68 65 20 73 65 71 75 65 6e 63 65 20  in the sequence 
9850: 6f 66 20 74 6f 6b 65 6e 73 20 74 68 61 74 20 64  of tokens that d
9860: 65 73 63 72 69 62 65 20 74 68 65 20 74 79 70 65  escribe the type
9870: 20 6f 66 20 74 68 65 0a 2a 2a 20 63 6f 6c 75 6d   of the.** colum
9880: 6e 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65  n currently unde
9890: 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 20  r construction. 
98a0: 20 20 70 4c 61 73 74 20 69 73 20 74 68 65 20 6c    pLast is the l
98b0: 61 73 74 20 74 6f 6b 65 6e 0a 2a 2a 20 69 6e 20  ast token.** in 
98c0: 74 68 65 20 73 65 71 75 65 6e 63 65 2e 20 20 55  the sequence.  U
98d0: 73 65 20 74 68 69 73 20 69 6e 66 6f 72 6d 61 74  se this informat
98e0: 69 6f 6e 20 74 6f 20 63 6f 6e 73 74 72 75 63 74  ion to construct
98f0: 20 61 20 73 74 72 69 6e 67 0a 2a 2a 20 74 68 61   a string.** tha
9900: 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 74  t contains the t
9910: 79 70 65 6e 61 6d 65 20 6f 66 20 74 68 65 20 63  ypename of the c
9920: 6f 6c 75 6d 6e 20 61 6e 64 20 73 74 6f 72 65 20  olumn and store 
9930: 74 68 61 74 20 73 74 72 69 6e 67 0a 2a 2a 20 69  that string.** i
9940: 6e 20 7a 54 79 70 65 2e 0a 2a 2f 20 0a 76 6f 69  n zType..*/ .voi
9950: 64 20 73 71 6c 69 74 65 33 41 64 64 43 6f 6c 75  d sqlite3AddColu
9960: 6d 6e 54 79 70 65 28 50 61 72 73 65 20 2a 70 50  mnType(Parse *pP
9970: 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 54 79  arse, Token *pTy
9980: 70 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b  pe){.  Table *p;
9990: 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b  .  Column *pCol;
99a0: 0a 0a 20 20 70 20 3d 20 70 50 61 72 73 65 2d 3e  ..  p = pParse->
99b0: 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 69 66 28  pNewTable;.  if(
99c0: 20 70 3d 3d 30 20 7c 7c 20 4e 45 56 45 52 28 70   p==0 || NEVER(p
99d0: 2d 3e 6e 43 6f 6c 3c 31 29 20 29 20 72 65 74 75  ->nCol<1) ) retu
99e0: 72 6e 3b 0a 20 20 70 43 6f 6c 20 3d 20 26 70 2d  rn;.  pCol = &p-
99f0: 3e 61 43 6f 6c 5b 70 2d 3e 6e 43 6f 6c 2d 31 5d  >aCol[p->nCol-1]
9a00: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 6f 6c  ;.  assert( pCol
9a10: 2d 3e 7a 54 79 70 65 3d 3d 30 20 7c 7c 20 43 4f  ->zType==0 || CO
9a20: 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 73 71  RRUPT_DB );.  sq
9a30: 6c 69 74 65 33 44 62 46 72 65 65 28 70 50 61 72  lite3DbFree(pPar
9a40: 73 65 2d 3e 64 62 2c 20 70 43 6f 6c 2d 3e 7a 54  se->db, pCol->zT
9a50: 79 70 65 29 3b 0a 20 20 70 43 6f 6c 2d 3e 7a 54  ype);.  pCol->zT
9a60: 79 70 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d  ype = sqlite3Nam
9a70: 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 50 61 72 73  eFromToken(pPars
9a80: 65 2d 3e 64 62 2c 20 70 54 79 70 65 29 3b 0a 20  e->db, pType);. 
9a90: 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 20   pCol->affinity 
9aa0: 3d 20 73 71 6c 69 74 65 33 41 66 66 69 6e 69 74  = sqlite3Affinit
9ab0: 79 54 79 70 65 28 70 43 6f 6c 2d 3e 7a 54 79 70  yType(pCol->zTyp
9ac0: 65 2c 20 26 70 43 6f 6c 2d 3e 73 7a 45 73 74 29  e, &pCol->szEst)
9ad0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 65  ;.}../*.** The e
9ae0: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 74 68 65  xpression is the
9af0: 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65 20 66   default value f
9b00: 6f 72 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  or the most rece
9b10: 6e 74 6c 79 20 61 64 64 65 64 20 63 6f 6c 75 6d  ntly added colum
9b20: 6e 0a 2a 2a 20 6f 66 20 74 68 65 20 74 61 62 6c  n.** of the tabl
9b30: 65 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65  e currently unde
9b40: 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 0a  r construction..
9b50: 2a 2a 0a 2a 2a 20 44 65 66 61 75 6c 74 20 76 61  **.** Default va
9b60: 6c 75 65 20 65 78 70 72 65 73 73 69 6f 6e 73 20  lue expressions 
9b70: 6d 75 73 74 20 62 65 20 63 6f 6e 73 74 61 6e 74  must be constant
9b80: 2e 20 20 52 61 69 73 65 20 61 6e 20 65 78 63 65  .  Raise an exce
9b90: 70 74 69 6f 6e 20 69 66 20 74 68 69 73 0a 2a 2a  ption if this.**
9ba0: 20 69 73 20 6e 6f 74 20 74 68 65 20 63 61 73 65   is not the case
9bb0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
9bc0: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 62  tine is called b
9bd0: 79 20 74 68 65 20 70 61 72 73 65 72 20 77 68 69  y the parser whi
9be0: 6c 65 20 69 6e 20 74 68 65 20 6d 69 64 64 6c 65  le in the middle
9bf0: 20 6f 66 0a 2a 2a 20 70 61 72 73 69 6e 67 20 61   of.** parsing a
9c00: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74   CREATE TABLE st
9c10: 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64  atement..*/.void
9c20: 20 73 71 6c 69 74 65 33 41 64 64 44 65 66 61 75   sqlite3AddDefau
9c30: 6c 74 56 61 6c 75 65 28 50 61 72 73 65 20 2a 70  ltValue(Parse *p
9c40: 50 61 72 73 65 2c 20 45 78 70 72 53 70 61 6e 20  Parse, ExprSpan 
9c50: 2a 70 53 70 61 6e 29 7b 0a 20 20 54 61 62 6c 65  *pSpan){.  Table
9c60: 20 2a 70 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70   *p;.  Column *p
9c70: 43 6f 6c 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  Col;.  sqlite3 *
9c80: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
9c90: 0a 20 20 70 20 3d 20 70 50 61 72 73 65 2d 3e 70  .  p = pParse->p
9ca0: 4e 65 77 54 61 62 6c 65 3b 0a 20 20 69 66 28 20  NewTable;.  if( 
9cb0: 70 21 3d 30 20 29 7b 0a 20 20 20 20 70 43 6f 6c  p!=0 ){.    pCol
9cc0: 20 3d 20 26 28 70 2d 3e 61 43 6f 6c 5b 70 2d 3e   = &(p->aCol[p->
9cd0: 6e 43 6f 6c 2d 31 5d 29 3b 0a 20 20 20 20 69 66  nCol-1]);.    if
9ce0: 28 20 21 73 71 6c 69 74 65 33 45 78 70 72 49 73  ( !sqlite3ExprIs
9cf0: 43 6f 6e 73 74 61 6e 74 4f 72 46 75 6e 63 74 69  ConstantOrFuncti
9d00: 6f 6e 28 70 53 70 61 6e 2d 3e 70 45 78 70 72 2c  on(pSpan->pExpr,
9d10: 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 29 20   db->init.busy) 
9d20: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
9d30: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
9d40: 20 22 64 65 66 61 75 6c 74 20 76 61 6c 75 65 20   "default value 
9d50: 6f 66 20 63 6f 6c 75 6d 6e 20 5b 25 73 5d 20 69  of column [%s] i
9d60: 73 20 6e 6f 74 20 63 6f 6e 73 74 61 6e 74 22 2c  s not constant",
9d70: 0a 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d  .          pCol-
9d80: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 65 6c  >zName);.    }el
9d90: 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 41 20 63  se{.      /* A c
9da0: 6f 70 79 20 6f 66 20 70 45 78 70 72 20 69 73 20  opy of pExpr is 
9db0: 75 73 65 64 20 69 6e 73 74 65 61 64 20 6f 66 20  used instead of 
9dc0: 74 68 65 20 6f 72 69 67 69 6e 61 6c 2c 20 61 73  the original, as
9dd0: 20 70 45 78 70 72 20 63 6f 6e 74 61 69 6e 73 0a   pExpr contains.
9de0: 20 20 20 20 20 20 2a 2a 20 74 6f 6b 65 6e 73 20        ** tokens 
9df0: 74 68 61 74 20 70 6f 69 6e 74 20 74 6f 20 76 6f  that point to vo
9e00: 6c 61 74 69 6c 65 20 6d 65 6d 6f 72 79 2e 20 54  latile memory. T
9e10: 68 65 20 27 73 70 61 6e 27 20 6f 66 20 74 68 65  he 'span' of the
9e20: 20 65 78 70 72 65 73 73 69 6f 6e 0a 20 20 20 20   expression.    
9e30: 20 20 2a 2a 20 69 73 20 72 65 71 75 69 72 65 64    ** is required
9e40: 20 62 79 20 70 72 61 67 6d 61 20 74 61 62 6c 65   by pragma table
9e50: 5f 69 6e 66 6f 2e 0a 20 20 20 20 20 20 2a 2f 0a  _info..      */.
9e60: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
9e70: 72 44 65 6c 65 74 65 28 64 62 2c 20 70 43 6f 6c  rDelete(db, pCol
9e80: 2d 3e 70 44 66 6c 74 29 3b 0a 20 20 20 20 20 20  ->pDflt);.      
9e90: 70 43 6f 6c 2d 3e 70 44 66 6c 74 20 3d 20 73 71  pCol->pDflt = sq
9ea0: 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c  lite3ExprDup(db,
9eb0: 20 70 53 70 61 6e 2d 3e 70 45 78 70 72 2c 20 45   pSpan->pExpr, E
9ec0: 58 50 52 44 55 50 5f 52 45 44 55 43 45 29 3b 0a  XPRDUP_REDUCE);.
9ed0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
9ee0: 72 65 65 28 64 62 2c 20 70 43 6f 6c 2d 3e 7a 44  ree(db, pCol->zD
9ef0: 66 6c 74 29 3b 0a 20 20 20 20 20 20 70 43 6f 6c  flt);.      pCol
9f00: 2d 3e 7a 44 66 6c 74 20 3d 20 73 71 6c 69 74 65  ->zDflt = sqlite
9f10: 33 44 62 53 74 72 4e 44 75 70 28 64 62 2c 20 28  3DbStrNDup(db, (
9f20: 63 68 61 72 2a 29 70 53 70 61 6e 2d 3e 7a 53 74  char*)pSpan->zSt
9f30: 61 72 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20  art,.           
9f40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9f50: 20 20 20 20 20 20 20 20 20 20 28 69 6e 74 29 28            (int)(
9f60: 70 53 70 61 6e 2d 3e 7a 45 6e 64 20 2d 20 70 53  pSpan->zEnd - pS
9f70: 70 61 6e 2d 3e 7a 53 74 61 72 74 29 29 3b 0a 20  pan->zStart));. 
9f80: 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74     }.  }.  sqlit
9f90: 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c  e3ExprDelete(db,
9fa0: 20 70 53 70 61 6e 2d 3e 70 45 78 70 72 29 3b 0a   pSpan->pExpr);.
9fb0: 7d 0a 0a 2f 2a 0a 2a 2a 20 42 61 63 6b 77 61 72  }../*.** Backwar
9fc0: 64 73 20 43 6f 6d 70 61 74 69 62 69 6c 69 74 79  ds Compatibility
9fd0: 20 48 61 63 6b 3a 0a 2a 2a 20 0a 2a 2a 20 48 69   Hack:.** .** Hi
9fe0: 73 74 6f 72 69 63 61 6c 20 76 65 72 73 69 6f 6e  storical version
9ff0: 73 20 6f 66 20 53 51 4c 69 74 65 20 61 63 63 65  s of SQLite acce
a000: 70 74 65 64 20 73 74 72 69 6e 67 73 20 61 73 20  pted strings as 
a010: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 69 6e 0a  column names in.
a020: 2a 2a 20 69 6e 64 65 78 65 73 20 61 6e 64 20 50  ** indexes and P
a030: 52 49 4d 41 52 59 20 4b 45 59 20 63 6f 6e 73 74  RIMARY KEY const
a040: 72 61 69 6e 74 73 20 61 6e 64 20 69 6e 20 55 4e  raints and in UN
a050: 49 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 73  IQUE constraints
a060: 2e 20 20 45 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a  .  Example:.**.*
a070: 2a 20 20 20 20 20 43 52 45 41 54 45 20 54 41 42  *     CREATE TAB
a080: 4c 45 20 78 79 7a 28 61 2c 62 2c 63 2c 64 2c 65  LE xyz(a,b,c,d,e
a090: 2c 50 52 49 4d 41 52 59 20 4b 45 59 28 27 61 27  ,PRIMARY KEY('a'
a0a0: 29 2c 55 4e 49 51 55 45 28 27 62 27 2c 27 63 27  ),UNIQUE('b','c'
a0b0: 20 43 4f 4c 4c 41 54 45 20 74 72 69 6d 29 0a 2a   COLLATE trim).*
a0c0: 2a 20 20 20 20 20 43 52 45 41 54 45 20 49 4e 44  *     CREATE IND
a0d0: 45 58 20 61 62 63 20 4f 4e 20 78 79 7a 28 27 63  EX abc ON xyz('c
a0e0: 27 2c 27 64 27 20 44 45 53 43 2c 27 65 27 20 43  ','d' DESC,'e' C
a0f0: 4f 4c 4c 41 54 45 20 6e 6f 63 61 73 65 20 44 45  OLLATE nocase DE
a100: 53 43 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  SC);.**.** This 
a110: 69 73 20 67 6f 6f 66 79 2e 20 20 42 75 74 20 74  is goofy.  But t
a120: 6f 20 70 72 65 73 65 72 76 65 20 62 61 63 6b 77  o preserve backw
a130: 61 72 64 73 20 63 6f 6d 70 61 74 69 62 69 6c 69  ards compatibili
a140: 74 79 20 77 65 20 63 6f 6e 74 69 6e 75 65 20 74  ty we continue t
a150: 6f 0a 2a 2a 20 61 63 63 65 70 74 20 69 74 2e 20  o.** accept it. 
a160: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f   This routine do
a170: 65 73 20 74 68 65 20 6e 65 63 65 73 73 61 72 79  es the necessary
a180: 20 63 6f 6e 76 65 72 73 69 6f 6e 2e 20 20 49 74   conversion.  It
a190: 20 63 6f 6e 76 65 72 74 73 0a 2a 2a 20 74 68 65   converts.** the
a1a0: 20 65 78 70 72 65 73 73 69 6f 6e 20 67 69 76 65   expression give
a1b0: 6e 20 69 6e 20 69 74 73 20 61 72 67 75 6d 65 6e  n in its argumen
a1c0: 74 20 66 72 6f 6d 20 61 20 54 4b 5f 53 54 52 49  t from a TK_STRI
a1d0: 4e 47 20 69 6e 74 6f 20 61 20 54 4b 5f 49 44 0a  NG into a TK_ID.
a1e0: 2a 2a 20 69 66 20 74 68 65 20 65 78 70 72 65 73  ** if the expres
a1f0: 73 69 6f 6e 20 69 73 20 6a 75 73 74 20 61 20 54  sion is just a T
a200: 4b 5f 53 54 52 49 4e 47 20 77 69 74 68 20 61 6e  K_STRING with an
a210: 20 6f 70 74 69 6f 6e 61 6c 20 43 4f 4c 4c 41 54   optional COLLAT
a220: 45 20 63 6c 61 75 73 65 2e 0a 2a 2a 20 49 66 20  E clause..** If 
a230: 74 68 65 20 65 70 78 72 65 73 73 69 6f 6e 20 69  the epxression i
a240: 73 20 61 6e 79 74 68 69 6e 67 20 6f 74 68 65 72  s anything other
a250: 20 74 68 61 6e 20 54 4b 5f 53 54 52 49 4e 47 2c   than TK_STRING,
a260: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
a270: 69 73 0a 2a 2a 20 75 6e 63 68 61 6e 67 65 64 2e  is.** unchanged.
a280: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
a290: 73 71 6c 69 74 65 33 53 74 72 69 6e 67 54 6f 49  sqlite3StringToI
a2a0: 64 28 45 78 70 72 20 2a 70 29 7b 0a 20 20 69 66  d(Expr *p){.  if
a2b0: 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 53 54 52 49  ( p->op==TK_STRI
a2c0: 4e 47 20 29 7b 0a 20 20 20 20 70 2d 3e 6f 70 20  NG ){.    p->op 
a2d0: 3d 20 54 4b 5f 49 44 3b 0a 20 20 7d 65 6c 73 65  = TK_ID;.  }else
a2e0: 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 43   if( p->op==TK_C
a2f0: 4f 4c 4c 41 54 45 20 26 26 20 70 2d 3e 70 4c 65  OLLATE && p->pLe
a300: 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 53 54 52 49 4e  ft->op==TK_STRIN
a310: 47 20 29 7b 0a 20 20 20 20 70 2d 3e 70 4c 65 66  G ){.    p->pLef
a320: 74 2d 3e 6f 70 20 3d 20 54 4b 5f 49 44 3b 0a 20  t->op = TK_ID;. 
a330: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 73 69   }.}../*.** Desi
a340: 67 6e 61 74 65 20 74 68 65 20 50 52 49 4d 41 52  gnate the PRIMAR
a350: 59 20 4b 45 59 20 66 6f 72 20 74 68 65 20 74 61  Y KEY for the ta
a360: 62 6c 65 2e 20 20 70 4c 69 73 74 20 69 73 20 61  ble.  pList is a
a370: 20 6c 69 73 74 20 6f 66 20 6e 61 6d 65 73 20 0a   list of names .
a380: 2a 2a 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 68  ** of columns th
a390: 61 74 20 66 6f 72 6d 20 74 68 65 20 70 72 69 6d  at form the prim
a3a0: 61 72 79 20 6b 65 79 2e 20 20 49 66 20 70 4c 69  ary key.  If pLi
a3b0: 73 74 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e  st is NULL, then
a3c0: 20 74 68 65 0a 2a 2a 20 6d 6f 73 74 20 72 65 63   the.** most rec
a3d0: 65 6e 74 6c 79 20 61 64 64 65 64 20 63 6f 6c 75  ently added colu
a3e0: 6d 6e 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  mn of the table 
a3f0: 69 73 20 74 68 65 20 70 72 69 6d 61 72 79 20 6b  is the primary k
a400: 65 79 2e 0a 2a 2a 0a 2a 2a 20 41 20 74 61 62 6c  ey..**.** A tabl
a410: 65 20 63 61 6e 20 68 61 76 65 20 61 74 20 6d 6f  e can have at mo
a420: 73 74 20 6f 6e 65 20 70 72 69 6d 61 72 79 20 6b  st one primary k
a430: 65 79 2e 20 20 49 66 20 74 68 65 20 74 61 62 6c  ey.  If the tabl
a440: 65 20 61 6c 72 65 61 64 79 20 68 61 73 0a 2a 2a  e already has.**
a450: 20 61 20 70 72 69 6d 61 72 79 20 6b 65 79 20 28   a primary key (
a460: 61 6e 64 20 74 68 69 73 20 69 73 20 74 68 65 20  and this is the 
a470: 73 65 63 6f 6e 64 20 70 72 69 6d 61 72 79 20 6b  second primary k
a480: 65 79 29 20 74 68 65 6e 20 63 72 65 61 74 65 20  ey) then create 
a490: 61 6e 0a 2a 2a 20 65 72 72 6f 72 2e 0a 2a 2a 0a  an.** error..**.
a4a0: 2a 2a 20 49 66 20 74 68 65 20 50 52 49 4d 41 52  ** If the PRIMAR
a4b0: 59 20 4b 45 59 20 69 73 20 6f 6e 20 61 20 73 69  Y KEY is on a si
a4c0: 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20 77 68 6f 73  ngle column whos
a4d0: 65 20 64 61 74 61 74 79 70 65 20 69 73 20 49 4e  e datatype is IN
a4e0: 54 45 47 45 52 2c 0a 2a 2a 20 74 68 65 6e 20 77  TEGER,.** then w
a4f0: 65 20 77 69 6c 6c 20 74 72 79 20 74 6f 20 75 73  e will try to us
a500: 65 20 74 68 61 74 20 63 6f 6c 75 6d 6e 20 61 73  e that column as
a510: 20 74 68 65 20 72 6f 77 69 64 2e 20 20 53 65 74   the rowid.  Set
a520: 20 74 68 65 20 54 61 62 6c 65 2e 69 50 4b 65 79   the Table.iPKey
a530: 0a 2a 2a 20 66 69 65 6c 64 20 6f 66 20 74 68 65  .** field of the
a540: 20 74 61 62 6c 65 20 75 6e 64 65 72 20 63 6f 6e   table under con
a550: 73 74 72 75 63 74 69 6f 6e 20 74 6f 20 62 65 20  struction to be 
a560: 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65  the index of the
a570: 0a 2a 2a 20 49 4e 54 45 47 45 52 20 50 52 49 4d  .** INTEGER PRIM
a580: 41 52 59 20 4b 45 59 20 63 6f 6c 75 6d 6e 2e 20  ARY KEY column. 
a590: 20 54 61 62 6c 65 2e 69 50 4b 65 79 20 69 73 20   Table.iPKey is 
a5a0: 73 65 74 20 74 6f 20 2d 31 20 69 66 20 74 68 65  set to -1 if the
a5b0: 72 65 20 69 73 0a 2a 2a 20 6e 6f 20 49 4e 54 45  re is.** no INTE
a5c0: 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2e  GER PRIMARY KEY.
a5d0: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6b 65  .**.** If the ke
a5e0: 79 20 69 73 20 6e 6f 74 20 61 6e 20 49 4e 54 45  y is not an INTE
a5f0: 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c  GER PRIMARY KEY,
a600: 20 74 68 65 6e 20 63 72 65 61 74 65 20 61 20 75   then create a u
a610: 6e 69 71 75 65 0a 2a 2a 20 69 6e 64 65 78 20 66  nique.** index f
a620: 6f 72 20 74 68 65 20 6b 65 79 2e 20 20 4e 6f 20  or the key.  No 
a630: 69 6e 64 65 78 20 69 73 20 63 72 65 61 74 65 64  index is created
a640: 20 66 6f 72 20 49 4e 54 45 47 45 52 20 50 52 49   for INTEGER PRI
a650: 4d 41 52 59 20 4b 45 59 73 2e 0a 2a 2f 0a 76 6f  MARY KEYs..*/.vo
a660: 69 64 20 73 71 6c 69 74 65 33 41 64 64 50 72 69  id sqlite3AddPri
a670: 6d 61 72 79 4b 65 79 28 0a 20 20 50 61 72 73 65  maryKey(.  Parse
a680: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a 20   *pParse,    /* 
a690: 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
a6a0: 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
a6b0: 4c 69 73 74 2c 20 20 2f 2a 20 4c 69 73 74 20 6f  List,  /* List o
a6c0: 66 20 66 69 65 6c 64 20 6e 61 6d 65 73 20 74 6f  f field names to
a6d0: 20 62 65 20 69 6e 64 65 78 65 64 20 2a 2f 0a 20   be indexed */. 
a6e0: 20 69 6e 74 20 6f 6e 45 72 72 6f 72 2c 20 20 20   int onError,   
a6f0: 20 20 20 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f     /* What to do
a700: 20 77 69 74 68 20 61 20 75 6e 69 71 75 65 6e 65   with a uniquene
a710: 73 73 20 63 6f 6e 66 6c 69 63 74 20 2a 2f 0a 20  ss conflict */. 
a720: 20 69 6e 74 20 61 75 74 6f 49 6e 63 2c 20 20 20   int autoInc,   
a730: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68     /* True if th
a740: 65 20 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 20  e AUTOINCREMENT 
a750: 6b 65 79 77 6f 72 64 20 69 73 20 70 72 65 73 65  keyword is prese
a760: 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 73 6f 72 74  nt */.  int sort
a770: 4f 72 64 65 72 20 20 20 20 20 2f 2a 20 53 51 4c  Order     /* SQL
a780: 49 54 45 5f 53 4f 5f 41 53 43 20 6f 72 20 53 51  ITE_SO_ASC or SQ
a790: 4c 49 54 45 5f 53 4f 5f 44 45 53 43 20 2a 2f 0a  LITE_SO_DESC */.
a7a0: 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  ){.  Table *pTab
a7b0: 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54   = pParse->pNewT
a7c0: 61 62 6c 65 3b 0a 20 20 63 68 61 72 20 2a 7a 54  able;.  char *zT
a7d0: 79 70 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69  ype = 0;.  int i
a7e0: 43 6f 6c 20 3d 20 2d 31 2c 20 69 3b 0a 20 20 69  Col = -1, i;.  i
a7f0: 6e 74 20 6e 54 65 72 6d 3b 0a 20 20 69 66 28 20  nt nTerm;.  if( 
a800: 70 54 61 62 3d 3d 30 20 7c 7c 20 49 4e 5f 44 45  pTab==0 || IN_DE
a810: 43 4c 41 52 45 5f 56 54 41 42 20 29 20 67 6f 74  CLARE_VTAB ) got
a820: 6f 20 70 72 69 6d 61 72 79 5f 6b 65 79 5f 65 78  o primary_key_ex
a830: 69 74 3b 0a 20 20 69 66 28 20 70 54 61 62 2d 3e  it;.  if( pTab->
a840: 74 61 62 46 6c 61 67 73 20 26 20 54 46 5f 48 61  tabFlags & TF_Ha
a850: 73 50 72 69 6d 61 72 79 4b 65 79 20 29 7b 0a 20  sPrimaryKey ){. 
a860: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
a870: 73 67 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20  sg(pParse, .    
a880: 20 20 22 74 61 62 6c 65 20 5c 22 25 73 5c 22 20    "table \"%s\" 
a890: 68 61 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e  has more than on
a8a0: 65 20 70 72 69 6d 61 72 79 20 6b 65 79 22 2c 20  e primary key", 
a8b0: 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pTab->zName);.  
a8c0: 20 20 67 6f 74 6f 20 70 72 69 6d 61 72 79 5f 6b    goto primary_k
a8d0: 65 79 5f 65 78 69 74 3b 0a 20 20 7d 0a 20 20 70  ey_exit;.  }.  p
a8e0: 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 7c 3d  Tab->tabFlags |=
a8f0: 20 54 46 5f 48 61 73 50 72 69 6d 61 72 79 4b 65   TF_HasPrimaryKe
a900: 79 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d  y;.  if( pList==
a910: 30 20 29 7b 0a 20 20 20 20 69 43 6f 6c 20 3d 20  0 ){.    iCol = 
a920: 70 54 61 62 2d 3e 6e 43 6f 6c 20 2d 20 31 3b 0a  pTab->nCol - 1;.
a930: 20 20 20 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69      pTab->aCol[i
a940: 43 6f 6c 5d 2e 63 6f 6c 46 6c 61 67 73 20 7c 3d  Col].colFlags |=
a950: 20 43 4f 4c 46 4c 41 47 5f 50 52 49 4d 4b 45 59   COLFLAG_PRIMKEY
a960: 3b 0a 20 20 20 20 7a 54 79 70 65 20 3d 20 70 54  ;.    zType = pT
a970: 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a  ab->aCol[iCol].z
a980: 54 79 70 65 3b 0a 20 20 20 20 6e 54 65 72 6d 20  Type;.    nTerm 
a990: 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 1;.  }else{.  
a9a0: 20 20 6e 54 65 72 6d 20 3d 20 70 4c 69 73 74 2d    nTerm = pList-
a9b0: 3e 6e 45 78 70 72 3b 0a 20 20 20 20 66 6f 72 28  >nExpr;.    for(
a9c0: 69 3d 30 3b 20 69 3c 6e 54 65 72 6d 3b 20 69 2b  i=0; i<nTerm; i+
a9d0: 2b 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a  +){.      Expr *
a9e0: 70 43 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33  pCExpr = sqlite3
a9f0: 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28  ExprSkipCollate(
aa00: 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  pList->a[i].pExp
aa10: 72 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  r);.      assert
aa20: 28 20 70 43 45 78 70 72 21 3d 30 20 29 3b 0a 20  ( pCExpr!=0 );. 
aa30: 20 20 20 20 20 73 71 6c 69 74 65 33 53 74 72 69       sqlite3Stri
aa40: 6e 67 54 6f 49 64 28 70 43 45 78 70 72 29 3b 0a  ngToId(pCExpr);.
aa50: 20 20 20 20 20 20 69 66 28 20 70 43 45 78 70 72        if( pCExpr
aa60: 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 20 29 7b 0a 20  ->op==TK_ID ){. 
aa70: 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61         const cha
aa80: 72 20 2a 7a 43 4e 61 6d 65 20 3d 20 70 43 45 78  r *zCName = pCEx
aa90: 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20  pr->u.zToken;.  
aaa0: 20 20 20 20 20 20 66 6f 72 28 69 43 6f 6c 3d 30        for(iCol=0
aab0: 3b 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f  ; iCol<pTab->nCo
aac0: 6c 3b 20 69 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20  l; iCol++){.    
aad0: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
aae0: 33 53 74 72 49 43 6d 70 28 7a 43 4e 61 6d 65 2c  3StrICmp(zCName,
aaf0: 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c   pTab->aCol[iCol
ab00: 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20  ].zName)==0 ){. 
ab10: 20 20 20 20 20 20 20 20 20 20 20 70 54 61 62 2d             pTab-
ab20: 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 63 6f 6c 46  >aCol[iCol].colF
ab30: 6c 61 67 73 20 7c 3d 20 43 4f 4c 46 4c 41 47 5f  lags |= COLFLAG_
ab40: 50 52 49 4d 4b 45 59 3b 0a 20 20 20 20 20 20 20  PRIMKEY;.       
ab50: 20 20 20 20 20 7a 54 79 70 65 20 3d 20 70 54 61       zType = pTa
ab60: 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 54  b->aCol[iCol].zT
ab70: 79 70 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ype;.           
ab80: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
ab90: 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
aba0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
abb0: 20 20 69 66 28 20 6e 54 65 72 6d 3d 3d 31 0a 20    if( nTerm==1. 
abc0: 20 20 26 26 20 7a 54 79 70 65 20 26 26 20 73 71    && zType && sq
abd0: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 54 79  lite3StrICmp(zTy
abe0: 70 65 2c 20 22 49 4e 54 45 47 45 52 22 29 3d 3d  pe, "INTEGER")==
abf0: 30 0a 20 20 20 26 26 20 73 6f 72 74 4f 72 64 65  0.   && sortOrde
ac00: 72 21 3d 53 51 4c 49 54 45 5f 53 4f 5f 44 45 53  r!=SQLITE_SO_DES
ac10: 43 0a 20 20 29 7b 0a 20 20 20 20 70 54 61 62 2d  C.  ){.    pTab-
ac20: 3e 69 50 4b 65 79 20 3d 20 69 43 6f 6c 3b 0a 20  >iPKey = iCol;. 
ac30: 20 20 20 70 54 61 62 2d 3e 6b 65 79 43 6f 6e 66     pTab->keyConf
ac40: 20 3d 20 28 75 38 29 6f 6e 45 72 72 6f 72 3b 0a   = (u8)onError;.
ac50: 20 20 20 20 61 73 73 65 72 74 28 20 61 75 74 6f      assert( auto
ac60: 49 6e 63 3d 3d 30 20 7c 7c 20 61 75 74 6f 49 6e  Inc==0 || autoIn
ac70: 63 3d 3d 31 20 29 3b 0a 20 20 20 20 70 54 61 62  c==1 );.    pTab
ac80: 2d 3e 74 61 62 46 6c 61 67 73 20 7c 3d 20 61 75  ->tabFlags |= au
ac90: 74 6f 49 6e 63 2a 54 46 5f 41 75 74 6f 69 6e 63  toInc*TF_Autoinc
aca0: 72 65 6d 65 6e 74 3b 0a 20 20 20 20 69 66 28 20  rement;.    if( 
acb0: 70 4c 69 73 74 20 29 20 70 50 61 72 73 65 2d 3e  pList ) pParse->
acc0: 69 50 6b 53 6f 72 74 4f 72 64 65 72 20 3d 20 70  iPkSortOrder = p
acd0: 4c 69 73 74 2d 3e 61 5b 30 5d 2e 73 6f 72 74 4f  List->a[0].sortO
ace0: 72 64 65 72 3b 0a 20 20 7d 65 6c 73 65 20 69 66  rder;.  }else if
acf0: 28 20 61 75 74 6f 49 6e 63 20 29 7b 0a 23 69 66  ( autoInc ){.#if
ad00: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
ad10: 5f 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 0a 20  _AUTOINCREMENT. 
ad20: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
ad30: 73 67 28 70 50 61 72 73 65 2c 20 22 41 55 54 4f  sg(pParse, "AUTO
ad40: 49 4e 43 52 45 4d 45 4e 54 20 69 73 20 6f 6e 6c  INCREMENT is onl
ad50: 79 20 61 6c 6c 6f 77 65 64 20 6f 6e 20 61 6e 20  y allowed on an 
ad60: 22 0a 20 20 20 20 20 20 20 22 49 4e 54 45 47 45  ".       "INTEGE
ad70: 52 20 50 52 49 4d 41 52 59 20 4b 45 59 22 29 3b  R PRIMARY KEY");
ad80: 0a 23 65 6e 64 69 66 0a 20 20 7d 65 6c 73 65 7b  .#endif.  }else{
ad90: 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 3b 0a 20  .    Index *p;. 
ada0: 20 20 20 70 20 3d 20 73 71 6c 69 74 65 33 43 72     p = sqlite3Cr
adb0: 65 61 74 65 49 6e 64 65 78 28 70 50 61 72 73 65  eateIndex(pParse
adc0: 2c 20 30 2c 20 30 2c 20 30 2c 20 70 4c 69 73 74  , 0, 0, 0, pList
add0: 2c 20 6f 6e 45 72 72 6f 72 2c 20 30 2c 0a 20 20  , onError, 0,.  
ade0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
adf0: 20 20 20 20 20 20 20 20 20 30 2c 20 73 6f 72 74           0, sort
ae00: 4f 72 64 65 72 2c 20 30 29 3b 0a 20 20 20 20 69  Order, 0);.    i
ae10: 66 28 20 70 20 29 7b 0a 20 20 20 20 20 20 70 2d  f( p ){.      p-
ae20: 3e 69 64 78 54 79 70 65 20 3d 20 53 51 4c 49 54  >idxType = SQLIT
ae30: 45 5f 49 44 58 54 59 50 45 5f 50 52 49 4d 41 52  E_IDXTYPE_PRIMAR
ae40: 59 4b 45 59 3b 0a 20 20 20 20 7d 0a 20 20 20 20  YKEY;.    }.    
ae50: 70 4c 69 73 74 20 3d 20 30 3b 0a 20 20 7d 0a 0a  pList = 0;.  }..
ae60: 70 72 69 6d 61 72 79 5f 6b 65 79 5f 65 78 69 74  primary_key_exit
ae70: 3a 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c  :.  sqlite3ExprL
ae80: 69 73 74 44 65 6c 65 74 65 28 70 50 61 72 73 65  istDelete(pParse
ae90: 2d 3e 64 62 2c 20 70 4c 69 73 74 29 3b 0a 20 20  ->db, pList);.  
aea0: 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  return;.}../*.**
aeb0: 20 41 64 64 20 61 20 6e 65 77 20 43 48 45 43 4b   Add a new CHECK
aec0: 20 63 6f 6e 73 74 72 61 69 6e 74 20 74 6f 20 74   constraint to t
aed0: 68 65 20 74 61 62 6c 65 20 63 75 72 72 65 6e 74  he table current
aee0: 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75  ly under constru
aef0: 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ction..*/.void s
af00: 71 6c 69 74 65 33 41 64 64 43 68 65 63 6b 43 6f  qlite3AddCheckCo
af10: 6e 73 74 72 61 69 6e 74 28 0a 20 20 50 61 72 73  nstraint(.  Pars
af20: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a  e *pParse,    /*
af30: 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
af40: 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 43 68 65   */.  Expr *pChe
af50: 63 6b 45 78 70 72 20 20 2f 2a 20 54 68 65 20 63  ckExpr  /* The c
af60: 68 65 63 6b 20 65 78 70 72 65 73 73 69 6f 6e 20  heck expression 
af70: 2a 2f 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53 51  */.){.#ifndef SQ
af80: 4c 49 54 45 5f 4f 4d 49 54 5f 43 48 45 43 4b 0a  LITE_OMIT_CHECK.
af90: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20    Table *pTab = 
afa0: 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
afb0: 65 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  e;.  sqlite3 *db
afc0: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
afd0: 20 69 66 28 20 70 54 61 62 20 26 26 20 21 49 4e   if( pTab && !IN
afe0: 5f 44 45 43 4c 41 52 45 5f 56 54 41 42 0a 20 20  _DECLARE_VTAB.  
aff0: 20 26 26 20 21 73 71 6c 69 74 65 33 42 74 72 65   && !sqlite3Btre
b000: 65 49 73 52 65 61 64 6f 6e 6c 79 28 64 62 2d 3e  eIsReadonly(db->
b010: 61 44 62 5b 64 62 2d 3e 69 6e 69 74 2e 69 44 62  aDb[db->init.iDb
b020: 5d 2e 70 42 74 29 0a 20 20 29 7b 0a 20 20 20 20  ].pBt).  ){.    
b030: 70 54 61 62 2d 3e 70 43 68 65 63 6b 20 3d 20 73  pTab->pCheck = s
b040: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70  qlite3ExprListAp
b050: 70 65 6e 64 28 70 50 61 72 73 65 2c 20 70 54 61  pend(pParse, pTa
b060: 62 2d 3e 70 43 68 65 63 6b 2c 20 70 43 68 65 63  b->pCheck, pChec
b070: 6b 45 78 70 72 29 3b 0a 20 20 20 20 69 66 28 20  kExpr);.    if( 
b080: 70 50 61 72 73 65 2d 3e 63 6f 6e 73 74 72 61 69  pParse->constrai
b090: 6e 74 4e 61 6d 65 2e 6e 20 29 7b 0a 20 20 20 20  ntName.n ){.    
b0a0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
b0b0: 74 53 65 74 4e 61 6d 65 28 70 50 61 72 73 65 2c  tSetName(pParse,
b0c0: 20 70 54 61 62 2d 3e 70 43 68 65 63 6b 2c 20 26   pTab->pCheck, &
b0d0: 70 50 61 72 73 65 2d 3e 63 6f 6e 73 74 72 61 69  pParse->constrai
b0e0: 6e 74 4e 61 6d 65 2c 20 31 29 3b 0a 20 20 20 20  ntName, 1);.    
b0f0: 7d 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66  }.  }else.#endif
b100: 0a 20 20 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  .  {.    sqlite3
b110: 45 78 70 72 44 65 6c 65 74 65 28 70 50 61 72 73  ExprDelete(pPars
b120: 65 2d 3e 64 62 2c 20 70 43 68 65 63 6b 45 78 70  e->db, pCheckExp
b130: 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  r);.  }.}../*.**
b140: 20 53 65 74 20 74 68 65 20 63 6f 6c 6c 61 74 69   Set the collati
b150: 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 6f 66 20 74  on function of t
b160: 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79  he most recently
b170: 20 70 61 72 73 65 64 20 74 61 62 6c 65 20 63 6f   parsed table co
b180: 6c 75 6d 6e 0a 2a 2a 20 74 6f 20 74 68 65 20 43  lumn.** to the C
b190: 6f 6c 6c 53 65 71 20 67 69 76 65 6e 2e 0a 2a 2f  ollSeq given..*/
b1a0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 41 64 64  .void sqlite3Add
b1b0: 43 6f 6c 6c 61 74 65 54 79 70 65 28 50 61 72 73  CollateType(Pars
b1c0: 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e  e *pParse, Token
b1d0: 20 2a 70 54 6f 6b 65 6e 29 7b 0a 20 20 54 61 62   *pToken){.  Tab
b1e0: 6c 65 20 2a 70 3b 0a 20 20 69 6e 74 20 69 3b 0a  le *p;.  int i;.
b1f0: 20 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 3b 20 20    char *zColl;  
b200: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
b210: 65 71 75 6f 74 65 64 20 6e 61 6d 65 20 6f 66 20  equoted name of 
b220: 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
b230: 63 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  ce */.  sqlite3 
b240: 2a 64 62 3b 0a 0a 20 20 69 66 28 20 28 70 20 3d  *db;..  if( (p =
b250: 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
b260: 6c 65 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  le)==0 ) return;
b270: 0a 20 20 69 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31  .  i = p->nCol-1
b280: 3b 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d  ;.  db = pParse-
b290: 3e 64 62 3b 0a 20 20 7a 43 6f 6c 6c 20 3d 20 73  >db;.  zColl = s
b2a0: 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f  qlite3NameFromTo
b2b0: 6b 65 6e 28 64 62 2c 20 70 54 6f 6b 65 6e 29 3b  ken(db, pToken);
b2c0: 0a 20 20 69 66 28 20 21 7a 43 6f 6c 6c 20 29 20  .  if( !zColl ) 
b2d0: 72 65 74 75 72 6e 3b 0a 0a 20 20 69 66 28 20 73  return;..  if( s
b2e0: 71 6c 69 74 65 33 4c 6f 63 61 74 65 43 6f 6c 6c  qlite3LocateColl
b2f0: 53 65 71 28 70 50 61 72 73 65 2c 20 7a 43 6f 6c  Seq(pParse, zCol
b300: 6c 29 20 29 7b 0a 20 20 20 20 49 6e 64 65 78 20  l) ){.    Index 
b310: 2a 70 49 64 78 3b 0a 20 20 20 20 73 71 6c 69 74  *pIdx;.    sqlit
b320: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e  e3DbFree(db, p->
b330: 61 43 6f 6c 5b 69 5d 2e 7a 43 6f 6c 6c 29 3b 0a  aCol[i].zColl);.
b340: 20 20 20 20 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a      p->aCol[i].z
b350: 43 6f 6c 6c 20 3d 20 7a 43 6f 6c 6c 3b 0a 20 20  Coll = zColl;.  
b360: 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 63  .    /* If the c
b370: 6f 6c 75 6d 6e 20 69 73 20 64 65 63 6c 61 72 65  olumn is declare
b380: 64 20 61 73 20 22 3c 6e 61 6d 65 3e 20 50 52 49  d as "<name> PRI
b390: 4d 41 52 59 20 4b 45 59 20 43 4f 4c 4c 41 54 45  MARY KEY COLLATE
b3a0: 20 3c 74 79 70 65 3e 22 2c 0a 20 20 20 20 2a 2a   <type>",.    **
b3b0: 20 74 68 65 6e 20 61 6e 20 69 6e 64 65 78 20 6d   then an index m
b3c0: 61 79 20 68 61 76 65 20 62 65 65 6e 20 63 72 65  ay have been cre
b3d0: 61 74 65 64 20 6f 6e 20 74 68 69 73 20 63 6f 6c  ated on this col
b3e0: 75 6d 6e 20 62 65 66 6f 72 65 20 74 68 65 0a 20  umn before the. 
b3f0: 20 20 20 2a 2a 20 63 6f 6c 6c 61 74 69 6f 6e 20     ** collation 
b400: 74 79 70 65 20 77 61 73 20 61 64 64 65 64 2e 20  type was added. 
b410: 43 6f 72 72 65 63 74 20 74 68 69 73 20 69 66 20  Correct this if 
b420: 69 74 20 69 73 20 74 68 65 20 63 61 73 65 2e 0a  it is the case..
b430: 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70      */.    for(p
b440: 49 64 78 3d 70 2d 3e 70 49 6e 64 65 78 3b 20 70  Idx=p->pIndex; p
b450: 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e  Idx; pIdx=pIdx->
b460: 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 61 73  pNext){.      as
b470: 73 65 72 74 28 20 70 49 64 78 2d 3e 6e 4b 65 79  sert( pIdx->nKey
b480: 43 6f 6c 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20  Col==1 );.      
b490: 69 66 28 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75  if( pIdx->aiColu
b4a0: 6d 6e 5b 30 5d 3d 3d 69 20 29 7b 0a 20 20 20 20  mn[0]==i ){.    
b4b0: 20 20 20 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c      pIdx->azColl
b4c0: 5b 30 5d 20 3d 20 70 2d 3e 61 43 6f 6c 5b 69 5d  [0] = p->aCol[i]
b4d0: 2e 7a 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a  .zColl;.      }.
b4e0: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
b4f0: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
b500: 28 64 62 2c 20 7a 43 6f 6c 6c 29 3b 0a 20 20 7d  (db, zColl);.  }
b510: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
b520: 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20  unction returns 
b530: 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  the collation se
b540: 71 75 65 6e 63 65 20 66 6f 72 20 64 61 74 61 62  quence for datab
b550: 61 73 65 20 6e 61 74 69 76 65 20 74 65 78 74 0a  ase native text.
b560: 2a 2a 20 65 6e 63 6f 64 69 6e 67 20 69 64 65 6e  ** encoding iden
b570: 74 69 66 69 65 64 20 62 79 20 74 68 65 20 73 74  tified by the st
b580: 72 69 6e 67 20 7a 4e 61 6d 65 2c 20 6c 65 6e 67  ring zName, leng
b590: 74 68 20 6e 4e 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20  th nName..**.** 
b5a0: 49 66 20 74 68 65 20 72 65 71 75 65 73 74 65 64  If the requested
b5b0: 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
b5c0: 6e 63 65 20 69 73 20 6e 6f 74 20 61 76 61 69 6c  nce is not avail
b5d0: 61 62 6c 65 2c 20 6f 72 20 6e 6f 74 20 61 76 61  able, or not ava
b5e0: 69 6c 61 62 6c 65 0a 2a 2a 20 69 6e 20 74 68 65  ilable.** in the
b5f0: 20 64 61 74 61 62 61 73 65 20 6e 61 74 69 76 65   database native
b600: 20 65 6e 63 6f 64 69 6e 67 2c 20 74 68 65 20 63   encoding, the c
b610: 6f 6c 6c 61 74 69 6f 6e 20 66 61 63 74 6f 72 79  ollation factory
b620: 20 69 73 20 69 6e 76 6f 6b 65 64 20 74 6f 0a 2a   is invoked to.*
b630: 2a 20 72 65 71 75 65 73 74 20 69 74 2e 20 49 66  * request it. If
b640: 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 66   the collation f
b650: 61 63 74 6f 72 79 20 64 6f 65 73 20 6e 6f 74 20  actory does not 
b660: 73 75 70 70 6c 79 20 73 75 63 68 20 61 20 73 65  supply such a se
b670: 71 75 65 6e 63 65 2c 0a 2a 2a 20 61 6e 64 20 74  quence,.** and t
b680: 68 65 20 73 65 71 75 65 6e 63 65 20 69 73 20 61  he sequence is a
b690: 76 61 69 6c 61 62 6c 65 20 69 6e 20 61 6e 6f 74  vailable in anot
b6a0: 68 65 72 20 74 65 78 74 20 65 6e 63 6f 64 69 6e  her text encodin
b6b0: 67 2c 20 74 68 65 6e 20 74 68 61 74 20 69 73 0a  g, then that is.
b6c0: 2a 2a 20 72 65 74 75 72 6e 65 64 20 69 6e 73 74  ** returned inst
b6d0: 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f  ead..**.** If no
b6e0: 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 74 68 65   versions of the
b6f0: 20 72 65 71 75 65 73 74 65 64 20 63 6f 6c 6c 61   requested colla
b700: 74 69 6f 6e 73 20 73 65 71 75 65 6e 63 65 20 61  tions sequence a
b710: 72 65 20 61 76 61 69 6c 61 62 6c 65 2c 20 6f 72  re available, or
b720: 0a 2a 2a 20 61 6e 6f 74 68 65 72 20 65 72 72 6f  .** another erro
b730: 72 20 6f 63 63 75 72 73 2c 20 4e 55 4c 4c 20 69  r occurs, NULL i
b740: 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 61  s returned and a
b750: 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  n error message 
b760: 77 72 69 74 74 65 6e 20 69 6e 74 6f 0a 2a 2a 20  written into.** 
b770: 70 50 61 72 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  pParse..**.** Th
b780: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
b790: 77 72 61 70 70 65 72 20 61 72 6f 75 6e 64 20 73  wrapper around s
b7a0: 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65  qlite3FindCollSe
b7b0: 71 28 29 2e 20 20 54 68 69 73 20 72 6f 75 74 69  q().  This routi
b7c0: 6e 65 0a 2a 2a 20 69 6e 76 6f 6b 65 73 20 74 68  ne.** invokes th
b7d0: 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 61 63 74  e collation fact
b7e0: 6f 72 79 20 69 66 20 74 68 65 20 6e 61 6d 65 64  ory if the named
b7f0: 20 63 6f 6c 6c 61 74 69 6f 6e 20 63 61 6e 6e 6f   collation canno
b800: 74 20 62 65 20 66 6f 75 6e 64 0a 2a 2a 20 61 6e  t be found.** an
b810: 64 20 67 65 6e 65 72 61 74 65 73 20 61 6e 20 65  d generates an e
b820: 72 72 6f 72 20 6d 65 73 73 61 67 65 2e 0a 2a 2a  rror message..**
b830: 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 3a 20 73 71  .** See also: sq
b840: 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71  lite3FindCollSeq
b850: 28 29 2c 20 73 71 6c 69 74 65 33 47 65 74 43 6f  (), sqlite3GetCo
b860: 6c 6c 53 65 71 28 29 0a 2a 2f 0a 43 6f 6c 6c 53  llSeq().*/.CollS
b870: 65 71 20 2a 73 71 6c 69 74 65 33 4c 6f 63 61 74  eq *sqlite3Locat
b880: 65 43 6f 6c 6c 53 65 71 28 50 61 72 73 65 20 2a  eCollSeq(Parse *
b890: 70 50 61 72 73 65 2c 20 63 6f 6e 73 74 20 63 68  pParse, const ch
b8a0: 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 73 71  ar *zName){.  sq
b8b0: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
b8c0: 73 65 2d 3e 64 62 3b 0a 20 20 75 38 20 65 6e 63  se->db;.  u8 enc
b8d0: 20 3d 20 45 4e 43 28 64 62 29 3b 0a 20 20 75 38   = ENC(db);.  u8
b8e0: 20 69 6e 69 74 62 75 73 79 20 3d 20 64 62 2d 3e   initbusy = db->
b8f0: 69 6e 69 74 2e 62 75 73 79 3b 0a 20 20 43 6f 6c  init.busy;.  Col
b900: 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 0a 20 20  lSeq *pColl;..  
b910: 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 46  pColl = sqlite3F
b920: 69 6e 64 43 6f 6c 6c 53 65 71 28 64 62 2c 20 65  indCollSeq(db, e
b930: 6e 63 2c 20 7a 4e 61 6d 65 2c 20 69 6e 69 74 62  nc, zName, initb
b940: 75 73 79 29 3b 0a 20 20 69 66 28 20 21 69 6e 69  usy);.  if( !ini
b950: 74 62 75 73 79 20 26 26 20 28 21 70 43 6f 6c 6c  tbusy && (!pColl
b960: 20 7c 7c 20 21 70 43 6f 6c 6c 2d 3e 78 43 6d 70   || !pColl->xCmp
b970: 29 20 29 7b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d  ) ){.    pColl =
b980: 20 73 71 6c 69 74 65 33 47 65 74 43 6f 6c 6c 53   sqlite3GetCollS
b990: 65 71 28 70 50 61 72 73 65 2c 20 65 6e 63 2c 20  eq(pParse, enc, 
b9a0: 70 43 6f 6c 6c 2c 20 7a 4e 61 6d 65 29 3b 0a 20  pColl, zName);. 
b9b0: 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 43 6f   }..  return pCo
b9c0: 6c 6c 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65  ll;.}.../*.** Ge
b9d0: 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74  nerate code that
b9e0: 20 77 69 6c 6c 20 69 6e 63 72 65 6d 65 6e 74 20   will increment 
b9f0: 74 68 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69  the schema cooki
ba00: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 63 68  e..**.** The sch
ba10: 65 6d 61 20 63 6f 6f 6b 69 65 20 69 73 20 75 73  ema cookie is us
ba20: 65 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  ed to determine 
ba30: 77 68 65 6e 20 74 68 65 20 73 63 68 65 6d 61 20  when the schema 
ba40: 66 6f 72 20 74 68 65 0a 2a 2a 20 64 61 74 61 62  for the.** datab
ba50: 61 73 65 20 63 68 61 6e 67 65 73 2e 20 20 41 66  ase changes.  Af
ba60: 74 65 72 20 65 61 63 68 20 73 63 68 65 6d 61 20  ter each schema 
ba70: 63 68 61 6e 67 65 2c 20 74 68 65 20 63 6f 6f 6b  change, the cook
ba80: 69 65 20 76 61 6c 75 65 0a 2a 2a 20 63 68 61 6e  ie value.** chan
ba90: 67 65 73 2e 20 20 57 68 65 6e 20 61 20 70 72 6f  ges.  When a pro
baa0: 63 65 73 73 20 66 69 72 73 74 20 72 65 61 64 73  cess first reads
bab0: 20 74 68 65 20 73 63 68 65 6d 61 20 69 74 20 72   the schema it r
bac0: 65 63 6f 72 64 73 20 74 68 65 0a 2a 2a 20 63 6f  ecords the.** co
bad0: 6f 6b 69 65 2e 20 20 54 68 65 72 65 61 66 74 65  okie.  Thereafte
bae0: 72 2c 20 77 68 65 6e 65 76 65 72 20 69 74 20 67  r, whenever it g
baf0: 6f 65 73 20 74 6f 20 61 63 63 65 73 73 20 74 68  oes to access th
bb00: 65 20 64 61 74 61 62 61 73 65 2c 0a 2a 2a 20 69  e database,.** i
bb10: 74 20 63 68 65 63 6b 73 20 74 68 65 20 63 6f 6f  t checks the coo
bb20: 6b 69 65 20 74 6f 20 6d 61 6b 65 20 73 75 72 65  kie to make sure
bb30: 20 74 68 65 20 73 63 68 65 6d 61 20 68 61 73 20   the schema has 
bb40: 6e 6f 74 20 63 68 61 6e 67 65 64 0a 2a 2a 20 73  not changed.** s
bb50: 69 6e 63 65 20 69 74 20 77 61 73 20 6c 61 73 74  ince it was last
bb60: 20 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69   read..**.** Thi
bb70: 73 20 70 6c 61 6e 20 69 73 20 6e 6f 74 20 63 6f  s plan is not co
bb80: 6d 70 6c 65 74 65 6c 79 20 62 75 6c 6c 65 74 2d  mpletely bullet-
bb90: 70 72 6f 6f 66 2e 20 20 49 74 20 69 73 20 70 6f  proof.  It is po
bba0: 73 73 69 62 6c 65 20 66 6f 72 0a 2a 2a 20 74 68  ssible for.** th
bbb0: 65 20 73 63 68 65 6d 61 20 74 6f 20 63 68 61 6e  e schema to chan
bbc0: 67 65 20 6d 75 6c 74 69 70 6c 65 20 74 69 6d 65  ge multiple time
bbd0: 73 20 61 6e 64 20 66 6f 72 20 74 68 65 20 63 6f  s and for the co
bbe0: 6f 6b 69 65 20 74 6f 20 62 65 0a 2a 2a 20 73 65  okie to be.** se
bbf0: 74 20 62 61 63 6b 20 74 6f 20 70 72 69 6f 72 20  t back to prior 
bc00: 76 61 6c 75 65 2e 20 20 42 75 74 20 73 63 68 65  value.  But sche
bc10: 6d 61 20 63 68 61 6e 67 65 73 20 61 72 65 20 69  ma changes are i
bc20: 6e 66 72 65 71 75 65 6e 74 0a 2a 2a 20 61 6e 64  nfrequent.** and
bc30: 20 74 68 65 20 70 72 6f 62 61 62 69 6c 69 74 79   the probability
bc40: 20 6f 66 20 68 69 74 74 69 6e 67 20 74 68 65 20   of hitting the 
bc50: 73 61 6d 65 20 63 6f 6f 6b 69 65 20 76 61 6c 75  same cookie valu
bc60: 65 20 69 73 20 6f 6e 6c 79 0a 2a 2a 20 31 20 63  e is only.** 1 c
bc70: 68 61 6e 63 65 20 69 6e 20 32 5e 33 32 2e 20 20  hance in 2^32.  
bc80: 53 6f 20 77 65 27 72 65 20 73 61 66 65 20 65 6e  So we're safe en
bc90: 6f 75 67 68 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ough..*/.void sq
bca0: 6c 69 74 65 33 43 68 61 6e 67 65 43 6f 6f 6b 69  lite3ChangeCooki
bcb0: 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
bcc0: 20 69 6e 74 20 69 44 62 29 7b 0a 20 20 73 71 6c   int iDb){.  sql
bcd0: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
bce0: 65 2d 3e 64 62 3b 0a 20 20 56 64 62 65 20 2a 76  e->db;.  Vdbe *v
bcf0: 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
bd00: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
bd10: 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65  te3SchemaMutexHe
bd20: 6c 64 28 64 62 2c 20 69 44 62 2c 20 30 29 20 29  ld(db, iDb, 0) )
bd30: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
bd40: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53 65 74 43  ddOp3(v, OP_SetC
bd50: 6f 6f 6b 69 65 2c 20 69 44 62 2c 20 42 54 52 45  ookie, iDb, BTRE
bd60: 45 5f 53 43 48 45 4d 41 5f 56 45 52 53 49 4f 4e  E_SCHEMA_VERSION
bd70: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
bd80: 20 20 20 20 20 20 20 64 62 2d 3e 61 44 62 5b 69         db->aDb[i
bd90: 44 62 5d 2e 70 53 63 68 65 6d 61 2d 3e 73 63 68  Db].pSchema->sch
bda0: 65 6d 61 5f 63 6f 6f 6b 69 65 2b 31 29 3b 0a 7d  ema_cookie+1);.}
bdb0: 0a 0a 2f 2a 0a 2a 2a 20 4d 65 61 73 75 72 65 20  ../*.** Measure 
bdc0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 68  the number of ch
bdd0: 61 72 61 63 74 65 72 73 20 6e 65 65 64 65 64 20  aracters needed 
bde0: 74 6f 20 6f 75 74 70 75 74 20 74 68 65 20 67 69  to output the gi
bdf0: 76 65 6e 0a 2a 2a 20 69 64 65 6e 74 69 66 69 65  ven.** identifie
be00: 72 2e 20 20 54 68 65 20 6e 75 6d 62 65 72 20 72  r.  The number r
be10: 65 74 75 72 6e 65 64 20 69 6e 63 6c 75 64 65 73  eturned includes
be20: 20 61 6e 79 20 71 75 6f 74 65 73 20 75 73 65 64   any quotes used
be30: 0a 2a 2a 20 62 75 74 20 64 6f 65 73 20 6e 6f 74  .** but does not
be40: 20 69 6e 63 6c 75 64 65 20 74 68 65 20 6e 75 6c   include the nul
be50: 6c 20 74 65 72 6d 69 6e 61 74 6f 72 2e 0a 2a 2a  l terminator..**
be60: 0a 2a 2a 20 54 68 65 20 65 73 74 69 6d 61 74 65  .** The estimate
be70: 20 69 73 20 63 6f 6e 73 65 72 76 61 74 69 76 65   is conservative
be80: 2e 20 20 49 74 20 6d 69 67 68 74 20 62 65 20 6c  .  It might be l
be90: 61 72 67 65 72 20 74 68 61 74 20 77 68 61 74 20  arger that what 
bea0: 69 73 0a 2a 2a 20 72 65 61 6c 6c 79 20 6e 65 65  is.** really nee
beb0: 64 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ded..*/.static i
bec0: 6e 74 20 69 64 65 6e 74 4c 65 6e 67 74 68 28 63  nt identLength(c
bed0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20  onst char *z){. 
bee0: 20 69 6e 74 20 6e 3b 0a 20 20 66 6f 72 28 6e 3d   int n;.  for(n=
bef0: 30 3b 20 2a 7a 3b 20 6e 2b 2b 2c 20 7a 2b 2b 29  0; *z; n++, z++)
bf00: 7b 0a 20 20 20 20 69 66 28 20 2a 7a 3d 3d 27 22  {.    if( *z=='"
bf10: 27 20 29 7b 20 6e 2b 2b 3b 20 7d 0a 20 20 7d 0a  ' ){ n++; }.  }.
bf20: 20 20 72 65 74 75 72 6e 20 6e 20 2b 20 32 3b 0a    return n + 2;.
bf30: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 69 72  }../*.** The fir
bf40: 73 74 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  st parameter is 
bf50: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20  a pointer to an 
bf60: 6f 75 74 70 75 74 20 62 75 66 66 65 72 2e 20 54  output buffer. T
bf70: 68 65 20 73 65 63 6f 6e 64 20 0a 2a 2a 20 70 61  he second .** pa
bf80: 72 61 6d 65 74 65 72 20 69 73 20 61 20 70 6f 69  rameter is a poi
bf90: 6e 74 65 72 20 74 6f 20 61 6e 20 69 6e 74 65 67  nter to an integ
bfa0: 65 72 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73  er that contains
bfb0: 20 74 68 65 20 6f 66 66 73 65 74 20 61 74 0a 2a   the offset at.*
bfc0: 2a 20 77 68 69 63 68 20 74 6f 20 77 72 69 74 65  * which to write
bfd0: 20 69 6e 74 6f 20 74 68 65 20 6f 75 74 70 75 74   into the output
bfe0: 20 62 75 66 66 65 72 2e 20 54 68 69 73 20 66 75   buffer. This fu
bff0: 6e 63 74 69 6f 6e 20 63 6f 70 69 65 73 20 74 68  nction copies th
c000: 65 0a 2a 2a 20 6e 75 6c 2d 74 65 72 6d 69 6e 61  e.** nul-termina
c010: 74 65 64 20 73 74 72 69 6e 67 20 70 6f 69 6e 74  ted string point
c020: 65 64 20 74 6f 20 62 79 20 74 68 65 20 74 68 69  ed to by the thi
c030: 72 64 20 70 61 72 61 6d 65 74 65 72 2c 20 7a 53  rd parameter, zS
c040: 69 67 6e 65 64 49 64 65 6e 74 2c 0a 2a 2a 20 74  ignedIdent,.** t
c050: 6f 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  o the specified 
c060: 6f 66 66 73 65 74 20 69 6e 20 74 68 65 20 62 75  offset in the bu
c070: 66 66 65 72 20 61 6e 64 20 75 70 64 61 74 65 73  ffer and updates
c080: 20 2a 70 49 64 78 20 74 6f 20 72 65 66 65 72 0a   *pIdx to refer.
c090: 2a 2a 20 74 6f 20 74 68 65 20 66 69 72 73 74 20  ** to the first 
c0a0: 62 79 74 65 20 61 66 74 65 72 20 74 68 65 20 6c  byte after the l
c0b0: 61 73 74 20 62 79 74 65 20 77 72 69 74 74 65 6e  ast byte written
c0c0: 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   before returnin
c0d0: 67 2e 0a 2a 2a 20 0a 2a 2a 20 49 66 20 74 68 65  g..** .** If the
c0e0: 20 73 74 72 69 6e 67 20 7a 53 69 67 6e 65 64 49   string zSignedI
c0f0: 64 65 6e 74 20 63 6f 6e 73 69 73 74 73 20 65 6e  dent consists en
c100: 74 69 72 65 6c 79 20 6f 66 20 61 6c 70 68 61 2d  tirely of alpha-
c110: 6e 75 6d 65 72 69 63 0a 2a 2a 20 63 68 61 72 61  numeric.** chara
c120: 63 74 65 72 73 2c 20 64 6f 65 73 20 6e 6f 74 20  cters, does not 
c130: 62 65 67 69 6e 20 77 69 74 68 20 61 20 64 69 67  begin with a dig
c140: 69 74 20 61 6e 64 20 69 73 20 6e 6f 74 20 61 6e  it and is not an
c150: 20 53 51 4c 20 6b 65 79 77 6f 72 64 2c 0a 2a 2a   SQL keyword,.**
c160: 20 74 68 65 6e 20 69 74 20 69 73 20 63 6f 70 69   then it is copi
c170: 65 64 20 74 6f 20 74 68 65 20 6f 75 74 70 75 74  ed to the output
c180: 20 62 75 66 66 65 72 20 65 78 61 63 74 6c 79 20   buffer exactly 
c190: 61 73 20 69 74 20 69 73 2e 20 4f 74 68 65 72 77  as it is. Otherw
c1a0: 69 73 65 2c 0a 2a 2a 20 69 74 20 69 73 20 71 75  ise,.** it is qu
c1b0: 6f 74 65 64 20 75 73 69 6e 67 20 64 6f 75 62 6c  oted using doubl
c1c0: 65 2d 71 75 6f 74 65 73 2e 0a 2a 2f 0a 73 74 61  e-quotes..*/.sta
c1d0: 74 69 63 20 76 6f 69 64 20 69 64 65 6e 74 50 75  tic void identPu
c1e0: 74 28 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20 2a  t(char *z, int *
c1f0: 70 49 64 78 2c 20 63 68 61 72 20 2a 7a 53 69 67  pIdx, char *zSig
c200: 6e 65 64 49 64 65 6e 74 29 7b 0a 20 20 75 6e 73  nedIdent){.  uns
c210: 69 67 6e 65 64 20 63 68 61 72 20 2a 7a 49 64 65  igned char *zIde
c220: 6e 74 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63  nt = (unsigned c
c230: 68 61 72 2a 29 7a 53 69 67 6e 65 64 49 64 65 6e  har*)zSignedIden
c240: 74 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6e  t;.  int i, j, n
c250: 65 65 64 51 75 6f 74 65 3b 0a 20 20 69 20 3d 20  eedQuote;.  i = 
c260: 2a 70 49 64 78 3b 0a 0a 20 20 66 6f 72 28 6a 3d  *pIdx;..  for(j=
c270: 30 3b 20 7a 49 64 65 6e 74 5b 6a 5d 3b 20 6a 2b  0; zIdent[j]; j+
c280: 2b 29 7b 0a 20 20 20 20 69 66 28 20 21 73 71 6c  +){.    if( !sql
c290: 69 74 65 33 49 73 61 6c 6e 75 6d 28 7a 49 64 65  ite3Isalnum(zIde
c2a0: 6e 74 5b 6a 5d 29 20 26 26 20 7a 49 64 65 6e 74  nt[j]) && zIdent
c2b0: 5b 6a 5d 21 3d 27 5f 27 20 29 20 62 72 65 61 6b  [j]!='_' ) break
c2c0: 3b 0a 20 20 7d 0a 20 20 6e 65 65 64 51 75 6f 74  ;.  }.  needQuot
c2d0: 65 20 3d 20 73 71 6c 69 74 65 33 49 73 64 69 67  e = sqlite3Isdig
c2e0: 69 74 28 7a 49 64 65 6e 74 5b 30 5d 29 0a 20 20  it(zIdent[0]).  
c2f0: 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c            || sql
c300: 69 74 65 33 4b 65 79 77 6f 72 64 43 6f 64 65 28  ite3KeywordCode(
c310: 7a 49 64 65 6e 74 2c 20 6a 29 21 3d 54 4b 5f 49  zIdent, j)!=TK_I
c320: 44 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c  D.            ||
c330: 20 7a 49 64 65 6e 74 5b 6a 5d 21 3d 30 0a 20 20   zIdent[j]!=0.  
c340: 20 20 20 20 20 20 20 20 20 20 7c 7c 20 6a 3d 3d            || j==
c350: 30 3b 0a 0a 20 20 69 66 28 20 6e 65 65 64 51 75  0;..  if( needQu
c360: 6f 74 65 20 29 20 7a 5b 69 2b 2b 5d 20 3d 20 27  ote ) z[i++] = '
c370: 22 27 3b 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 7a  "';.  for(j=0; z
c380: 49 64 65 6e 74 5b 6a 5d 3b 20 6a 2b 2b 29 7b 0a  Ident[j]; j++){.
c390: 20 20 20 20 7a 5b 69 2b 2b 5d 20 3d 20 7a 49 64      z[i++] = zId
c3a0: 65 6e 74 5b 6a 5d 3b 0a 20 20 20 20 69 66 28 20  ent[j];.    if( 
c3b0: 7a 49 64 65 6e 74 5b 6a 5d 3d 3d 27 22 27 20 29  zIdent[j]=='"' )
c3c0: 20 7a 5b 69 2b 2b 5d 20 3d 20 27 22 27 3b 0a 20   z[i++] = '"';. 
c3d0: 20 7d 0a 20 20 69 66 28 20 6e 65 65 64 51 75 6f   }.  if( needQuo
c3e0: 74 65 20 29 20 7a 5b 69 2b 2b 5d 20 3d 20 27 22  te ) z[i++] = '"
c3f0: 27 3b 0a 20 20 7a 5b 69 5d 20 3d 20 30 3b 0a 20  ';.  z[i] = 0;. 
c400: 20 2a 70 49 64 78 20 3d 20 69 3b 0a 7d 0a 0a 2f   *pIdx = i;.}../
c410: 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 61 20  *.** Generate a 
c420: 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61  CREATE TABLE sta
c430: 74 65 6d 65 6e 74 20 61 70 70 72 6f 70 72 69 61  tement appropria
c440: 74 65 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e  te for the given
c450: 0a 2a 2a 20 74 61 62 6c 65 2e 20 20 4d 65 6d 6f  .** table.  Memo
c460: 72 79 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 74  ry to hold the t
c470: 65 78 74 20 6f 66 20 74 68 65 20 73 74 61 74 65  ext of the state
c480: 6d 65 6e 74 20 69 73 20 6f 62 74 61 69 6e 65 64  ment is obtained
c490: 0a 2a 2a 20 66 72 6f 6d 20 73 71 6c 69 74 65 4d  .** from sqliteM
c4a0: 61 6c 6c 6f 63 28 29 20 61 6e 64 20 6d 75 73 74  alloc() and must
c4b0: 20 62 65 20 66 72 65 65 64 20 62 79 20 74 68 65   be freed by the
c4c0: 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f   calling functio
c4d0: 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61  n..*/.static cha
c4e0: 72 20 2a 63 72 65 61 74 65 54 61 62 6c 65 53 74  r *createTableSt
c4f0: 6d 74 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  mt(sqlite3 *db, 
c500: 54 61 62 6c 65 20 2a 70 29 7b 0a 20 20 69 6e 74  Table *p){.  int
c510: 20 69 2c 20 6b 2c 20 6e 3b 0a 20 20 63 68 61 72   i, k, n;.  char
c520: 20 2a 7a 53 74 6d 74 3b 0a 20 20 63 68 61 72 20   *zStmt;.  char 
c530: 2a 7a 53 65 70 2c 20 2a 7a 53 65 70 32 2c 20 2a  *zSep, *zSep2, *
c540: 7a 45 6e 64 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a  zEnd;.  Column *
c550: 70 43 6f 6c 3b 0a 20 20 6e 20 3d 20 30 3b 0a 20  pCol;.  n = 0;. 
c560: 20 66 6f 72 28 70 43 6f 6c 20 3d 20 70 2d 3e 61   for(pCol = p->a
c570: 43 6f 6c 2c 20 69 3d 30 3b 20 69 3c 70 2d 3e 6e  Col, i=0; i<p->n
c580: 43 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b  Col; i++, pCol++
c590: 29 7b 0a 20 20 20 20 6e 20 2b 3d 20 69 64 65 6e  ){.    n += iden
c5a0: 74 4c 65 6e 67 74 68 28 70 43 6f 6c 2d 3e 7a 4e  tLength(pCol->zN
c5b0: 61 6d 65 29 20 2b 20 35 3b 0a 20 20 7d 0a 20 20  ame) + 5;.  }.  
c5c0: 6e 20 2b 3d 20 69 64 65 6e 74 4c 65 6e 67 74 68  n += identLength
c5d0: 28 70 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 69 66  (p->zName);.  if
c5e0: 28 20 6e 3c 35 30 20 29 7b 20 0a 20 20 20 20 7a  ( n<50 ){ .    z
c5f0: 53 65 70 20 3d 20 22 22 3b 0a 20 20 20 20 7a 53  Sep = "";.    zS
c600: 65 70 32 20 3d 20 22 2c 22 3b 0a 20 20 20 20 7a  ep2 = ",";.    z
c610: 45 6e 64 20 3d 20 22 29 22 3b 0a 20 20 7d 65 6c  End = ")";.  }el
c620: 73 65 7b 0a 20 20 20 20 7a 53 65 70 20 3d 20 22  se{.    zSep = "
c630: 5c 6e 20 20 22 3b 0a 20 20 20 20 7a 53 65 70 32  \n  ";.    zSep2
c640: 20 3d 20 22 2c 5c 6e 20 20 22 3b 0a 20 20 20 20   = ",\n  ";.    
c650: 7a 45 6e 64 20 3d 20 22 5c 6e 29 22 3b 0a 20 20  zEnd = "\n)";.  
c660: 7d 0a 20 20 6e 20 2b 3d 20 33 35 20 2b 20 36 2a  }.  n += 35 + 6*
c670: 70 2d 3e 6e 43 6f 6c 3b 0a 20 20 7a 53 74 6d 74  p->nCol;.  zStmt
c680: 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
c690: 6f 63 52 61 77 28 30 2c 20 6e 29 3b 0a 20 20 69  ocRaw(0, n);.  i
c6a0: 66 28 20 7a 53 74 6d 74 3d 3d 30 20 29 7b 0a 20  f( zStmt==0 ){. 
c6b0: 20 20 20 73 71 6c 69 74 65 33 4f 6f 6d 46 61 75     sqlite3OomFau
c6c0: 6c 74 28 64 62 29 3b 0a 20 20 20 20 72 65 74 75  lt(db);.    retu
c6d0: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  rn 0;.  }.  sqli
c6e0: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 2c 20  te3_snprintf(n, 
c6f0: 7a 53 74 6d 74 2c 20 22 43 52 45 41 54 45 20 54  zStmt, "CREATE T
c700: 41 42 4c 45 20 22 29 3b 0a 20 20 6b 20 3d 20 73  ABLE ");.  k = s
c710: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
c720: 53 74 6d 74 29 3b 0a 20 20 69 64 65 6e 74 50 75  Stmt);.  identPu
c730: 74 28 7a 53 74 6d 74 2c 20 26 6b 2c 20 70 2d 3e  t(zStmt, &k, p->
c740: 7a 4e 61 6d 65 29 3b 0a 20 20 7a 53 74 6d 74 5b  zName);.  zStmt[
c750: 6b 2b 2b 5d 20 3d 20 27 28 27 3b 0a 20 20 66 6f  k++] = '(';.  fo
c760: 72 28 70 43 6f 6c 3d 70 2d 3e 61 43 6f 6c 2c 20  r(pCol=p->aCol, 
c770: 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 3b 20  i=0; i<p->nCol; 
c780: 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20  i++, pCol++){.  
c790: 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63    static const c
c7a0: 68 61 72 20 2a 20 63 6f 6e 73 74 20 61 7a 54 79  har * const azTy
c7b0: 70 65 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20  pe[] = {.       
c7c0: 20 2f 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f 42   /* SQLITE_AFF_B
c7d0: 4c 4f 42 20 20 20 20 2a 2f 20 22 22 2c 0a 20 20  LOB    */ "",.  
c7e0: 20 20 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f        /* SQLITE_
c7f0: 41 46 46 5f 54 45 58 54 20 20 20 20 2a 2f 20 22  AFF_TEXT    */ "
c800: 20 54 45 58 54 22 2c 0a 20 20 20 20 20 20 20 20   TEXT",.        
c810: 2f 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55  /* SQLITE_AFF_NU
c820: 4d 45 52 49 43 20 2a 2f 20 22 20 4e 55 4d 22 2c  MERIC */ " NUM",
c830: 0a 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 49  .        /* SQLI
c840: 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 20 2a  TE_AFF_INTEGER *
c850: 2f 20 22 20 49 4e 54 22 2c 0a 20 20 20 20 20 20  / " INT",.      
c860: 20 20 2f 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f    /* SQLITE_AFF_
c870: 52 45 41 4c 20 20 20 20 2a 2f 20 22 20 52 45 41  REAL    */ " REA
c880: 4c 22 0a 20 20 20 20 7d 3b 0a 20 20 20 20 69 6e  L".    };.    in
c890: 74 20 6c 65 6e 3b 0a 20 20 20 20 63 6f 6e 73 74  t len;.    const
c8a0: 20 63 68 61 72 20 2a 7a 54 79 70 65 3b 0a 0a 20   char *zType;.. 
c8b0: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
c8c0: 6e 74 66 28 6e 2d 6b 2c 20 26 7a 53 74 6d 74 5b  ntf(n-k, &zStmt[
c8d0: 6b 5d 2c 20 7a 53 65 70 29 3b 0a 20 20 20 20 6b  k], zSep);.    k
c8e0: 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65   += sqlite3Strle
c8f0: 6e 33 30 28 26 7a 53 74 6d 74 5b 6b 5d 29 3b 0a  n30(&zStmt[k]);.
c900: 20 20 20 20 7a 53 65 70 20 3d 20 7a 53 65 70 32      zSep = zSep2
c910: 3b 0a 20 20 20 20 69 64 65 6e 74 50 75 74 28 7a  ;.    identPut(z
c920: 53 74 6d 74 2c 20 26 6b 2c 20 70 43 6f 6c 2d 3e  Stmt, &k, pCol->
c930: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 61 73 73 65  zName);.    asse
c940: 72 74 28 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69  rt( pCol->affini
c950: 74 79 2d 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c  ty-SQLITE_AFF_BL
c960: 4f 42 20 3e 3d 20 30 20 29 3b 0a 20 20 20 20 61  OB >= 0 );.    a
c970: 73 73 65 72 74 28 20 70 43 6f 6c 2d 3e 61 66 66  ssert( pCol->aff
c980: 69 6e 69 74 79 2d 53 51 4c 49 54 45 5f 41 46 46  inity-SQLITE_AFF
c990: 5f 42 4c 4f 42 20 3c 20 41 72 72 61 79 53 69 7a  _BLOB < ArraySiz
c9a0: 65 28 61 7a 54 79 70 65 29 20 29 3b 0a 20 20 20  e(azType) );.   
c9b0: 20 74 65 73 74 63 61 73 65 28 20 70 43 6f 6c 2d   testcase( pCol-
c9c0: 3e 61 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54  >affinity==SQLIT
c9d0: 45 5f 41 46 46 5f 42 4c 4f 42 20 29 3b 0a 20 20  E_AFF_BLOB );.  
c9e0: 20 20 74 65 73 74 63 61 73 65 28 20 70 43 6f 6c    testcase( pCol
c9f0: 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49  ->affinity==SQLI
ca00: 54 45 5f 41 46 46 5f 54 45 58 54 20 29 3b 0a 20  TE_AFF_TEXT );. 
ca10: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 43 6f     testcase( pCo
ca20: 6c 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 53 51 4c  l->affinity==SQL
ca30: 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20  ITE_AFF_NUMERIC 
ca40: 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
ca50: 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 3d   pCol->affinity=
ca60: 3d 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45  =SQLITE_AFF_INTE
ca70: 47 45 52 20 29 3b 0a 20 20 20 20 74 65 73 74 63  GER );.    testc
ca80: 61 73 65 28 20 70 43 6f 6c 2d 3e 61 66 66 69 6e  ase( pCol->affin
ca90: 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f  ity==SQLITE_AFF_
caa0: 52 45 41 4c 20 29 3b 0a 20 20 20 20 0a 20 20 20  REAL );.    .   
cab0: 20 7a 54 79 70 65 20 3d 20 61 7a 54 79 70 65 5b   zType = azType[
cac0: 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 20 2d  pCol->affinity -
cad0: 20 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42   SQLITE_AFF_BLOB
cae0: 5d 3b 0a 20 20 20 20 6c 65 6e 20 3d 20 73 71 6c  ];.    len = sql
caf0: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 54 79  ite3Strlen30(zTy
cb00: 70 65 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  pe);.    assert(
cb10: 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 3d   pCol->affinity=
cb20: 3d 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42  =SQLITE_AFF_BLOB
cb30: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c   .            ||
cb40: 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 3d   pCol->affinity=
cb50: 3d 73 71 6c 69 74 65 33 41 66 66 69 6e 69 74 79  =sqlite3Affinity
cb60: 54 79 70 65 28 7a 54 79 70 65 2c 20 30 29 20 29  Type(zType, 0) )
cb70: 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 7a 53  ;.    memcpy(&zS
cb80: 74 6d 74 5b 6b 5d 2c 20 7a 54 79 70 65 2c 20 6c  tmt[k], zType, l
cb90: 65 6e 29 3b 0a 20 20 20 20 6b 20 2b 3d 20 6c 65  en);.    k += le
cba0: 6e 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6b  n;.    assert( k
cbb0: 3c 3d 6e 20 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  <=n );.  }.  sql
cbc0: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 2d  ite3_snprintf(n-
cbd0: 6b 2c 20 26 7a 53 74 6d 74 5b 6b 5d 2c 20 22 25  k, &zStmt[k], "%
cbe0: 73 22 2c 20 7a 45 6e 64 29 3b 0a 20 20 72 65 74  s", zEnd);.  ret
cbf0: 75 72 6e 20 7a 53 74 6d 74 3b 0a 7d 0a 0a 2f 2a  urn zStmt;.}../*
cc00: 0a 2a 2a 20 52 65 73 69 7a 65 20 61 6e 20 49 6e  .** Resize an In
cc10: 64 65 78 20 6f 62 6a 65 63 74 20 74 6f 20 68 6f  dex object to ho
cc20: 6c 64 20 4e 20 63 6f 6c 75 6d 6e 73 20 74 6f 74  ld N columns tot
cc30: 61 6c 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49  al.  Return SQLI
cc40: 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63  TE_OK.** on succ
cc50: 65 73 73 20 61 6e 64 20 53 51 4c 49 54 45 5f 4e  ess and SQLITE_N
cc60: 4f 4d 45 4d 20 6f 6e 20 61 6e 20 4f 4f 4d 20 65  OMEM on an OOM e
cc70: 72 72 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rror..*/.static 
cc80: 69 6e 74 20 72 65 73 69 7a 65 49 6e 64 65 78 4f  int resizeIndexO
cc90: 62 6a 65 63 74 28 73 71 6c 69 74 65 33 20 2a 64  bject(sqlite3 *d
cca0: 62 2c 20 49 6e 64 65 78 20 2a 70 49 64 78 2c 20  b, Index *pIdx, 
ccb0: 69 6e 74 20 4e 29 7b 0a 20 20 63 68 61 72 20 2a  int N){.  char *
ccc0: 7a 45 78 74 72 61 3b 0a 20 20 69 6e 74 20 6e 42  zExtra;.  int nB
ccd0: 79 74 65 3b 0a 20 20 69 66 28 20 70 49 64 78 2d  yte;.  if( pIdx-
cce0: 3e 6e 43 6f 6c 75 6d 6e 3e 3d 4e 20 29 20 72 65  >nColumn>=N ) re
ccf0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
cd00: 20 20 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e    assert( pIdx->
cd10: 69 73 52 65 73 69 7a 65 64 3d 3d 30 20 29 3b 0a  isResized==0 );.
cd20: 20 20 6e 42 79 74 65 20 3d 20 28 73 69 7a 65 6f    nByte = (sizeo
cd30: 66 28 63 68 61 72 2a 29 20 2b 20 73 69 7a 65 6f  f(char*) + sizeo
cd40: 66 28 69 31 36 29 20 2b 20 31 29 2a 4e 3b 0a 20  f(i16) + 1)*N;. 
cd50: 20 7a 45 78 74 72 61 20 3d 20 73 71 6c 69 74 65   zExtra = sqlite
cd60: 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62  3DbMallocZero(db
cd70: 2c 20 6e 42 79 74 65 29 3b 0a 20 20 69 66 28 20  , nByte);.  if( 
cd80: 7a 45 78 74 72 61 3d 3d 30 20 29 20 72 65 74 75  zExtra==0 ) retu
cd90: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f  rn SQLITE_NOMEM_
cda0: 42 4b 50 54 3b 0a 20 20 6d 65 6d 63 70 79 28 7a  BKPT;.  memcpy(z
cdb0: 45 78 74 72 61 2c 20 70 49 64 78 2d 3e 61 7a 43  Extra, pIdx->azC
cdc0: 6f 6c 6c 2c 20 73 69 7a 65 6f 66 28 63 68 61 72  oll, sizeof(char
cdd0: 2a 29 2a 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e  *)*pIdx->nColumn
cde0: 29 3b 0a 20 20 70 49 64 78 2d 3e 61 7a 43 6f 6c  );.  pIdx->azCol
cdf0: 6c 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a  l = (const char*
ce00: 2a 29 7a 45 78 74 72 61 3b 0a 20 20 7a 45 78 74  *)zExtra;.  zExt
ce10: 72 61 20 2b 3d 20 73 69 7a 65 6f 66 28 63 68 61  ra += sizeof(cha
ce20: 72 2a 29 2a 4e 3b 0a 20 20 6d 65 6d 63 70 79 28  r*)*N;.  memcpy(
ce30: 7a 45 78 74 72 61 2c 20 70 49 64 78 2d 3e 61 69  zExtra, pIdx->ai
ce40: 43 6f 6c 75 6d 6e 2c 20 73 69 7a 65 6f 66 28 69  Column, sizeof(i
ce50: 31 36 29 2a 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d  16)*pIdx->nColum
ce60: 6e 29 3b 0a 20 20 70 49 64 78 2d 3e 61 69 43 6f  n);.  pIdx->aiCo
ce70: 6c 75 6d 6e 20 3d 20 28 69 31 36 2a 29 7a 45 78  lumn = (i16*)zEx
ce80: 74 72 61 3b 0a 20 20 7a 45 78 74 72 61 20 2b 3d  tra;.  zExtra +=
ce90: 20 73 69 7a 65 6f 66 28 69 31 36 29 2a 4e 3b 0a   sizeof(i16)*N;.
cea0: 20 20 6d 65 6d 63 70 79 28 7a 45 78 74 72 61 2c    memcpy(zExtra,
ceb0: 20 70 49 64 78 2d 3e 61 53 6f 72 74 4f 72 64 65   pIdx->aSortOrde
cec0: 72 2c 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e  r, pIdx->nColumn
ced0: 29 3b 0a 20 20 70 49 64 78 2d 3e 61 53 6f 72 74  );.  pIdx->aSort
cee0: 4f 72 64 65 72 20 3d 20 28 75 38 2a 29 7a 45 78  Order = (u8*)zEx
cef0: 74 72 61 3b 0a 20 20 70 49 64 78 2d 3e 6e 43 6f  tra;.  pIdx->nCo
cf00: 6c 75 6d 6e 20 3d 20 4e 3b 0a 20 20 70 49 64 78  lumn = N;.  pIdx
cf10: 2d 3e 69 73 52 65 73 69 7a 65 64 20 3d 20 31 3b  ->isResized = 1;
cf20: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
cf30: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 73  _OK;.}../*.** Es
cf40: 74 69 6d 61 74 65 20 74 68 65 20 74 6f 74 61 6c  timate the total
cf50: 20 72 6f 77 20 77 69 64 74 68 20 66 6f 72 20 61   row width for a
cf60: 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69   table..*/.stati
cf70: 63 20 76 6f 69 64 20 65 73 74 69 6d 61 74 65 54  c void estimateT
cf80: 61 62 6c 65 57 69 64 74 68 28 54 61 62 6c 65 20  ableWidth(Table 
cf90: 2a 70 54 61 62 29 7b 0a 20 20 75 6e 73 69 67 6e  *pTab){.  unsign
cfa0: 65 64 20 77 54 61 62 6c 65 20 3d 20 30 3b 0a 20  ed wTable = 0;. 
cfb0: 20 63 6f 6e 73 74 20 43 6f 6c 75 6d 6e 20 2a 70   const Column *p
cfc0: 54 61 62 43 6f 6c 3b 0a 20 20 69 6e 74 20 69 3b  TabCol;.  int i;
cfd0: 0a 20 20 66 6f 72 28 69 3d 70 54 61 62 2d 3e 6e  .  for(i=pTab->n
cfe0: 43 6f 6c 2c 20 70 54 61 62 43 6f 6c 3d 70 54 61  Col, pTabCol=pTa
cff0: 62 2d 3e 61 43 6f 6c 3b 20 69 3e 30 3b 20 69 2d  b->aCol; i>0; i-
d000: 2d 2c 20 70 54 61 62 43 6f 6c 2b 2b 29 7b 0a 20  -, pTabCol++){. 
d010: 20 20 20 77 54 61 62 6c 65 20 2b 3d 20 70 54 61     wTable += pTa
d020: 62 43 6f 6c 2d 3e 73 7a 45 73 74 3b 0a 20 20 7d  bCol->szEst;.  }
d030: 0a 20 20 69 66 28 20 70 54 61 62 2d 3e 69 50 4b  .  if( pTab->iPK
d040: 65 79 3c 30 20 29 20 77 54 61 62 6c 65 2b 2b 3b  ey<0 ) wTable++;
d050: 0a 20 20 70 54 61 62 2d 3e 73 7a 54 61 62 52 6f  .  pTab->szTabRo
d060: 77 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73  w = sqlite3LogEs
d070: 74 28 77 54 61 62 6c 65 2a 34 29 3b 0a 7d 0a 0a  t(wTable*4);.}..
d080: 2f 2a 0a 2a 2a 20 45 73 74 69 6d 61 74 65 20 74  /*.** Estimate t
d090: 68 65 20 61 76 65 72 61 67 65 20 73 69 7a 65 20  he average size 
d0a0: 6f 66 20 61 20 72 6f 77 20 66 6f 72 20 61 6e 20  of a row for an 
d0b0: 69 6e 64 65 78 2e 0a 2a 2f 0a 73 74 61 74 69 63  index..*/.static
d0c0: 20 76 6f 69 64 20 65 73 74 69 6d 61 74 65 49 6e   void estimateIn
d0d0: 64 65 78 57 69 64 74 68 28 49 6e 64 65 78 20 2a  dexWidth(Index *
d0e0: 70 49 64 78 29 7b 0a 20 20 75 6e 73 69 67 6e 65  pIdx){.  unsigne
d0f0: 64 20 77 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20  d wIndex = 0;.  
d100: 69 6e 74 20 69 3b 0a 20 20 63 6f 6e 73 74 20 43  int i;.  const C
d110: 6f 6c 75 6d 6e 20 2a 61 43 6f 6c 20 3d 20 70 49  olumn *aCol = pI
d120: 64 78 2d 3e 70 54 61 62 6c 65 2d 3e 61 43 6f 6c  dx->pTable->aCol
d130: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
d140: 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b  Idx->nColumn; i+
d150: 2b 29 7b 0a 20 20 20 20 69 31 36 20 78 20 3d 20  +){.    i16 x = 
d160: 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69  pIdx->aiColumn[i
d170: 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 78  ];.    assert( x
d180: 3c 70 49 64 78 2d 3e 70 54 61 62 6c 65 2d 3e 6e  <pIdx->pTable->n
d190: 43 6f 6c 20 29 3b 0a 20 20 20 20 77 49 6e 64 65  Col );.    wInde
d1a0: 78 20 2b 3d 20 78 3c 30 20 3f 20 31 20 3a 20 61  x += x<0 ? 1 : a
d1b0: 43 6f 6c 5b 70 49 64 78 2d 3e 61 69 43 6f 6c 75  Col[pIdx->aiColu
d1c0: 6d 6e 5b 69 5d 5d 2e 73 7a 45 73 74 3b 0a 20 20  mn[i]].szEst;.  
d1d0: 7d 0a 20 20 70 49 64 78 2d 3e 73 7a 49 64 78 52  }.  pIdx->szIdxR
d1e0: 6f 77 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45  ow = sqlite3LogE
d1f0: 73 74 28 77 49 6e 64 65 78 2a 34 29 3b 0a 7d 0a  st(wIndex*4);.}.
d200: 0a 2f 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20  ./* Return true 
d210: 69 66 20 76 61 6c 75 65 20 78 20 69 73 20 66 6f  if value x is fo
d220: 75 6e 64 20 61 6e 79 20 6f 66 20 74 68 65 20 66  und any of the f
d230: 69 72 73 74 20 6e 43 6f 6c 20 65 6e 74 72 69 65  irst nCol entrie
d240: 73 20 6f 66 20 61 69 43 6f 6c 5b 5d 0a 2a 2f 0a  s of aiCol[].*/.
d250: 73 74 61 74 69 63 20 69 6e 74 20 68 61 73 43 6f  static int hasCo
d260: 6c 75 6d 6e 28 63 6f 6e 73 74 20 69 31 36 20 2a  lumn(const i16 *
d270: 61 69 43 6f 6c 2c 20 69 6e 74 20 6e 43 6f 6c 2c  aiCol, int nCol,
d280: 20 69 6e 74 20 78 29 7b 0a 20 20 77 68 69 6c 65   int x){.  while
d290: 28 20 6e 43 6f 6c 2d 2d 20 3e 20 30 20 29 20 69  ( nCol-- > 0 ) i
d2a0: 66 28 20 78 3d 3d 2a 28 61 69 43 6f 6c 2b 2b 29  f( x==*(aiCol++)
d2b0: 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 72   ) return 1;.  r
d2c0: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
d2d0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72  * This routine r
d2e0: 75 6e 73 20 61 74 20 74 68 65 20 65 6e 64 20 6f  uns at the end o
d2f0: 66 20 70 61 72 73 69 6e 67 20 61 20 43 52 45 41  f parsing a CREA
d300: 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65  TE TABLE stateme
d310: 6e 74 20 74 68 61 74 0a 2a 2a 20 68 61 73 20 61  nt that.** has a
d320: 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 20 63   WITHOUT ROWID c
d330: 6c 61 75 73 65 2e 20 20 54 68 65 20 6a 6f 62 20  lause.  The job 
d340: 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  of this routine 
d350: 69 73 20 74 6f 20 63 6f 6e 76 65 72 74 20 62 6f  is to convert bo
d360: 74 68 0a 2a 2a 20 69 6e 74 65 72 6e 61 6c 20 73  th.** internal s
d370: 63 68 65 6d 61 20 64 61 74 61 20 73 74 72 75 63  chema data struc
d380: 74 75 72 65 73 20 61 6e 64 20 74 68 65 20 67 65  tures and the ge
d390: 6e 65 72 61 74 65 64 20 56 44 42 45 20 63 6f 64  nerated VDBE cod
d3a0: 65 20 73 6f 20 74 68 61 74 20 74 68 65 79 0a 2a  e so that they.*
d3b0: 2a 20 61 72 65 20 61 70 70 72 6f 70 72 69 61 74  * are appropriat
d3c0: 65 20 66 6f 72 20 61 20 57 49 54 48 4f 55 54 20  e for a WITHOUT 
d3d0: 52 4f 57 49 44 20 74 61 62 6c 65 20 69 6e 73 74  ROWID table inst
d3e0: 65 61 64 20 6f 66 20 61 20 72 6f 77 69 64 20 74  ead of a rowid t
d3f0: 61 62 6c 65 2e 0a 2a 2a 20 43 68 61 6e 67 65 73  able..** Changes
d400: 20 69 6e 63 6c 75 64 65 3a 0a 2a 2a 0a 2a 2a 20   include:.**.** 
d410: 20 20 20 20 28 31 29 20 20 43 6f 6e 76 65 72 74      (1)  Convert
d420: 20 74 68 65 20 4f 50 5f 43 72 65 61 74 65 54 61   the OP_CreateTa
d430: 62 6c 65 20 69 6e 74 6f 20 61 6e 20 4f 50 5f 43  ble into an OP_C
d440: 72 65 61 74 65 49 6e 64 65 78 2e 20 20 54 68 65  reateIndex.  The
d450: 72 65 20 69 73 0a 2a 2a 20 20 20 20 20 20 20 20  re is.**        
d460: 20 20 6e 6f 20 72 6f 77 69 64 20 62 74 72 65 65    no rowid btree
d470: 20 66 6f 72 20 61 20 57 49 54 48 4f 55 54 20 52   for a WITHOUT R
d480: 4f 57 49 44 2e 20 20 49 6e 73 74 65 61 64 2c 20  OWID.  Instead, 
d490: 74 68 65 20 63 61 6e 6f 6e 69 63 61 6c 0a 2a 2a  the canonical.**
d4a0: 20 20 20 20 20 20 20 20 20 20 64 61 74 61 20 73            data s
d4b0: 74 6f 72 61 67 65 20 69 73 20 61 20 63 6f 76 65  torage is a cove
d4c0: 72 69 6e 67 20 69 6e 64 65 78 20 62 74 72 65 65  ring index btree
d4d0: 2e 0a 2a 2a 20 20 20 20 20 28 32 29 20 20 42 79  ..**     (2)  By
d4e0: 70 61 73 73 20 74 68 65 20 63 72 65 61 74 69 6f  pass the creatio
d4f0: 6e 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65 5f  n of the sqlite_
d500: 6d 61 73 74 65 72 20 74 61 62 6c 65 20 65 6e 74  master table ent
d510: 72 79 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 66  ry.**          f
d520: 6f 72 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b  or the PRIMARY K
d530: 45 59 20 61 73 20 74 68 65 20 70 72 69 6d 61 72  EY as the primar
d540: 79 20 6b 65 79 20 69 6e 64 65 78 20 69 73 20 6e  y key index is n
d550: 6f 77 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 69  ow.**          i
d560: 64 65 6e 74 69 66 69 65 64 20 62 79 20 74 68 65  dentified by the
d570: 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74   sqlite_master t
d580: 61 62 6c 65 20 65 6e 74 72 79 20 6f 66 20 74 68  able entry of th
d590: 65 20 74 61 62 6c 65 20 69 74 73 65 6c 66 2e 0a  e table itself..
d5a0: 2a 2a 20 20 20 20 20 28 33 29 20 20 53 65 74 20  **     (3)  Set 
d5b0: 74 68 65 20 49 6e 64 65 78 2e 74 6e 75 6d 20 6f  the Index.tnum o
d5c0: 66 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45  f the PRIMARY KE
d5d0: 59 20 49 6e 64 65 78 20 6f 62 6a 65 63 74 20 69  Y Index object i
d5e0: 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20  n the.**        
d5f0: 20 20 73 63 68 65 6d 61 20 74 6f 20 74 68 65 20    schema to the 
d600: 72 6f 6f 74 70 61 67 65 20 66 72 6f 6d 20 74 68  rootpage from th
d610: 65 20 6d 61 69 6e 20 74 61 62 6c 65 2e 0a 2a 2a  e main table..**
d620: 20 20 20 20 20 28 34 29 20 20 53 65 74 20 61 6c       (4)  Set al
d630: 6c 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65  l columns of the
d640: 20 50 52 49 4d 41 52 59 20 4b 45 59 20 73 63 68   PRIMARY KEY sch
d650: 65 6d 61 20 6f 62 6a 65 63 74 20 74 6f 20 62 65  ema object to be
d660: 20 4e 4f 54 20 4e 55 4c 4c 2e 0a 2a 2a 20 20 20   NOT NULL..**   
d670: 20 20 28 35 29 20 20 41 64 64 20 61 6c 6c 20 74    (5)  Add all t
d680: 61 62 6c 65 20 63 6f 6c 75 6d 6e 73 20 74 6f 20  able columns to 
d690: 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20  the PRIMARY KEY 
d6a0: 49 6e 64 65 78 20 6f 62 6a 65 63 74 0a 2a 2a 20  Index object.** 
d6b0: 20 20 20 20 20 20 20 20 20 73 6f 20 74 68 61 74           so that
d6c0: 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59   the PRIMARY KEY
d6d0: 20 69 73 20 61 20 63 6f 76 65 72 69 6e 67 20 69   is a covering i
d6e0: 6e 64 65 78 2e 20 20 54 68 65 20 73 75 72 70 6c  ndex.  The surpl
d6f0: 75 73 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 63  us.**          c
d700: 6f 6c 75 6d 6e 73 20 61 72 65 20 70 61 72 74 20  olumns are part 
d710: 6f 66 20 4b 65 79 49 6e 66 6f 2e 6e 58 46 69 65  of KeyInfo.nXFie
d720: 6c 64 20 61 6e 64 20 61 72 65 20 6e 6f 74 20 75  ld and are not u
d730: 73 65 64 20 66 6f 72 0a 2a 2a 20 20 20 20 20 20  sed for.**      
d740: 20 20 20 20 73 6f 72 74 69 6e 67 20 6f 72 20 6c      sorting or l
d750: 6f 6f 6b 75 70 20 6f 72 20 75 6e 69 71 75 65 6e  ookup or uniquen
d760: 65 73 73 20 63 68 65 63 6b 73 2e 0a 2a 2a 20 20  ess checks..**  
d770: 20 20 20 28 36 29 20 20 52 65 70 6c 61 63 65 20     (6)  Replace 
d780: 74 68 65 20 72 6f 77 69 64 20 74 61 69 6c 20 6f  the rowid tail o
d790: 6e 20 61 6c 6c 20 61 75 74 6f 6d 61 74 69 63 61  n all automatica
d7a0: 6c 6c 79 20 67 65 6e 65 72 61 74 65 64 20 55 4e  lly generated UN
d7b0: 49 51 55 45 0a 2a 2a 20 20 20 20 20 20 20 20 20  IQUE.**         
d7c0: 20 69 6e 64 69 63 65 73 20 77 69 74 68 20 74 68   indices with th
d7d0: 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 63 6f  e PRIMARY KEY co
d7e0: 6c 75 6d 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  lumns..*/.static
d7f0: 20 76 6f 69 64 20 63 6f 6e 76 65 72 74 54 6f 57   void convertToW
d800: 69 74 68 6f 75 74 52 6f 77 69 64 54 61 62 6c 65  ithoutRowidTable
d810: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
d820: 54 61 62 6c 65 20 2a 70 54 61 62 29 7b 0a 20 20  Table *pTab){.  
d830: 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 49  Index *pIdx;.  I
d840: 6e 64 65 78 20 2a 70 50 6b 3b 0a 20 20 69 6e 74  ndex *pPk;.  int
d850: 20 6e 50 6b 3b 0a 20 20 69 6e 74 20 69 2c 20 6a   nPk;.  int i, j
d860: 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
d870: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
d880: 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
d890: 2d 3e 70 56 64 62 65 3b 0a 0a 20 20 2f 2a 20 43  ->pVdbe;..  /* C
d8a0: 6f 6e 76 65 72 74 20 74 68 65 20 4f 50 5f 43 72  onvert the OP_Cr
d8b0: 65 61 74 65 54 61 62 6c 65 20 6f 70 63 6f 64 65  eateTable opcode
d8c0: 20 74 68 61 74 20 77 6f 75 6c 64 20 6e 6f 72 6d   that would norm
d8d0: 61 6c 6c 79 20 63 72 65 61 74 65 20 74 68 65 0a  ally create the.
d8e0: 20 20 2a 2a 20 72 6f 6f 74 2d 70 61 67 65 20 66    ** root-page f
d8f0: 6f 72 20 74 68 65 20 74 61 62 6c 65 20 69 6e 74  or the table int
d900: 6f 20 61 6e 20 4f 50 5f 43 72 65 61 74 65 49 6e  o an OP_CreateIn
d910: 64 65 78 20 6f 70 63 6f 64 65 2e 20 20 54 68 65  dex opcode.  The
d920: 20 69 6e 64 65 78 0a 20 20 2a 2a 20 63 72 65 61   index.  ** crea
d930: 74 65 64 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20  ted will become 
d940: 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20  the PRIMARY KEY 
d950: 69 6e 64 65 78 2e 0a 20 20 2a 2f 0a 20 20 69 66  index..  */.  if
d960: 28 20 70 50 61 72 73 65 2d 3e 61 64 64 72 43 72  ( pParse->addrCr
d970: 54 61 62 20 29 7b 0a 20 20 20 20 61 73 73 65 72  Tab ){.    asser
d980: 74 28 20 76 20 29 3b 0a 20 20 20 20 73 71 6c 69  t( v );.    sqli
d990: 74 65 33 56 64 62 65 43 68 61 6e 67 65 4f 70 63  te3VdbeChangeOpc
d9a0: 6f 64 65 28 76 2c 20 70 50 61 72 73 65 2d 3e 61  ode(v, pParse->a
d9b0: 64 64 72 43 72 54 61 62 2c 20 4f 50 5f 43 72 65  ddrCrTab, OP_Cre
d9c0: 61 74 65 49 6e 64 65 78 29 3b 0a 20 20 7d 0a 0a  ateIndex);.  }..
d9d0: 20 20 2f 2a 20 4c 6f 63 61 74 65 20 74 68 65 20    /* Locate the 
d9e0: 50 52 49 4d 41 52 59 20 4b 45 59 20 69 6e 64 65  PRIMARY KEY inde
d9f0: 78 2e 20 20 4f 72 2c 20 69 66 20 74 68 69 73 20  x.  Or, if this 
da00: 74 61 62 6c 65 20 77 61 73 20 6f 72 69 67 69 6e  table was origin
da10: 61 6c 6c 79 0a 20 20 2a 2a 20 61 6e 20 49 4e 54  ally.  ** an INT
da20: 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59  EGER PRIMARY KEY
da30: 20 74 61 62 6c 65 2c 20 63 72 65 61 74 65 20 61   table, create a
da40: 20 6e 65 77 20 50 52 49 4d 41 52 59 20 4b 45 59   new PRIMARY KEY
da50: 20 69 6e 64 65 78 2e 20 0a 20 20 2a 2f 0a 20 20   index. .  */.  
da60: 69 66 28 20 70 54 61 62 2d 3e 69 50 4b 65 79 3e  if( pTab->iPKey>
da70: 3d 30 20 29 7b 0a 20 20 20 20 45 78 70 72 4c 69  =0 ){.    ExprLi
da80: 73 74 20 2a 70 4c 69 73 74 3b 0a 20 20 20 20 54  st *pList;.    T
da90: 6f 6b 65 6e 20 69 70 6b 54 6f 6b 65 6e 3b 0a 20  oken ipkToken;. 
daa0: 20 20 20 73 71 6c 69 74 65 33 54 6f 6b 65 6e 49     sqlite3TokenI
dab0: 6e 69 74 28 26 69 70 6b 54 6f 6b 65 6e 2c 20 70  nit(&ipkToken, p
dac0: 54 61 62 2d 3e 61 43 6f 6c 5b 70 54 61 62 2d 3e  Tab->aCol[pTab->
dad0: 69 50 4b 65 79 5d 2e 7a 4e 61 6d 65 29 3b 0a 20  iPKey].zName);. 
dae0: 20 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74     pList = sqlit
daf0: 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64  e3ExprListAppend
db00: 28 70 50 61 72 73 65 2c 20 30 2c 20 0a 20 20 20  (pParse, 0, .   
db10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
db20: 71 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f 63 28  qlite3ExprAlloc(
db30: 64 62 2c 20 54 4b 5f 49 44 2c 20 26 69 70 6b 54  db, TK_ID, &ipkT
db40: 6f 6b 65 6e 2c 20 30 29 29 3b 0a 20 20 20 20 69  oken, 0));.    i
db50: 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65  f( pList==0 ) re
db60: 74 75 72 6e 3b 0a 20 20 20 20 70 4c 69 73 74 2d  turn;.    pList-
db70: 3e 61 5b 30 5d 2e 73 6f 72 74 4f 72 64 65 72 20  >a[0].sortOrder 
db80: 3d 20 70 50 61 72 73 65 2d 3e 69 50 6b 53 6f 72  = pParse->iPkSor
db90: 74 4f 72 64 65 72 3b 0a 20 20 20 20 61 73 73 65  tOrder;.    asse
dba0: 72 74 28 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  rt( pParse->pNew
dbb0: 54 61 62 6c 65 3d 3d 70 54 61 62 20 29 3b 0a 20  Table==pTab );. 
dbc0: 20 20 20 70 50 6b 20 3d 20 73 71 6c 69 74 65 33     pPk = sqlite3
dbd0: 43 72 65 61 74 65 49 6e 64 65 78 28 70 50 61 72  CreateIndex(pPar
dbe0: 73 65 2c 20 30 2c 20 30 2c 20 30 2c 20 70 4c 69  se, 0, 0, 0, pLi
dbf0: 73 74 2c 20 70 54 61 62 2d 3e 6b 65 79 43 6f 6e  st, pTab->keyCon
dc00: 66 2c 20 30 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  f, 0, 0, 0, 0);.
dc10: 20 20 20 20 69 66 28 20 70 50 6b 3d 3d 30 20 29      if( pPk==0 )
dc20: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 70 50 6b   return;.    pPk
dc30: 2d 3e 69 64 78 54 79 70 65 20 3d 20 53 51 4c 49  ->idxType = SQLI
dc40: 54 45 5f 49 44 58 54 59 50 45 5f 50 52 49 4d 41  TE_IDXTYPE_PRIMA
dc50: 52 59 4b 45 59 3b 0a 20 20 20 20 70 54 61 62 2d  RYKEY;.    pTab-
dc60: 3e 69 50 4b 65 79 20 3d 20 2d 31 3b 0a 20 20 7d  >iPKey = -1;.  }
dc70: 65 6c 73 65 7b 0a 20 20 20 20 70 50 6b 20 3d 20  else{.    pPk = 
dc80: 73 71 6c 69 74 65 33 50 72 69 6d 61 72 79 4b 65  sqlite3PrimaryKe
dc90: 79 49 6e 64 65 78 28 70 54 61 62 29 3b 0a 0a 20  yIndex(pTab);.. 
dca0: 20 20 20 2f 2a 20 42 79 70 61 73 73 20 74 68 65     /* Bypass the
dcb0: 20 63 72 65 61 74 69 6f 6e 20 6f 66 20 74 68 65   creation of the
dcc0: 20 50 52 49 4d 41 52 59 20 4b 45 59 20 62 74 72   PRIMARY KEY btr
dcd0: 65 65 20 61 6e 64 20 74 68 65 20 73 71 6c 69 74  ee and the sqlit
dce0: 65 5f 6d 61 73 74 65 72 0a 20 20 20 20 2a 2a 20  e_master.    ** 
dcf0: 74 61 62 6c 65 20 65 6e 74 72 79 2e 20 54 68 69  table entry. Thi
dd00: 73 20 69 73 20 6f 6e 6c 79 20 72 65 71 75 69 72  s is only requir
dd10: 65 64 20 69 66 20 63 75 72 72 65 6e 74 6c 79 20  ed if currently 
dd20: 67 65 6e 65 72 61 74 69 6e 67 20 56 44 42 45 0a  generating VDBE.
dd30: 20 20 20 20 2a 2a 20 63 6f 64 65 20 66 6f 72 20      ** code for 
dd40: 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 28  a CREATE TABLE (
dd50: 6e 6f 74 20 77 68 65 6e 20 70 61 72 73 69 6e 67  not when parsing
dd60: 20 6f 6e 65 20 61 73 20 70 61 72 74 20 6f 66 20   one as part of 
dd70: 72 65 61 64 69 6e 67 0a 20 20 20 20 2a 2a 20 61  reading.    ** a
dd80: 20 64 61 74 61 62 61 73 65 20 73 63 68 65 6d 61   database schema
dd90: 29 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 76  ).  */.    if( v
dda0: 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
ddb0: 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d  ( db->init.busy=
ddc0: 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  =0 );.      sqli
ddd0: 74 65 33 56 64 62 65 43 68 61 6e 67 65 4f 70 63  te3VdbeChangeOpc
dde0: 6f 64 65 28 76 2c 20 70 50 6b 2d 3e 74 6e 75 6d  ode(v, pPk->tnum
ddf0: 2c 20 4f 50 5f 47 6f 74 6f 29 3b 0a 20 20 20 20  , OP_Goto);.    
de00: 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a  }..    /*.    **
de10: 20 52 65 6d 6f 76 65 20 61 6c 6c 20 72 65 64 75   Remove all redu
de20: 6e 64 61 6e 74 20 63 6f 6c 75 6d 6e 73 20 66 72  ndant columns fr
de30: 6f 6d 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b  om the PRIMARY K
de40: 45 59 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c 65  EY.  For example
de50: 2c 20 63 68 61 6e 67 65 0a 20 20 20 20 2a 2a 20  , change.    ** 
de60: 22 50 52 49 4d 41 52 59 20 4b 45 59 28 61 2c 62  "PRIMARY KEY(a,b
de70: 2c 61 2c 62 2c 63 2c 62 2c 63 2c 64 29 22 20 69  ,a,b,c,b,c,d)" i
de80: 6e 74 6f 20 6a 75 73 74 20 22 50 52 49 4d 41 52  nto just "PRIMAR
de90: 59 20 4b 45 59 28 61 2c 62 2c 63 2c 64 29 22 2e  Y KEY(a,b,c,d)".
dea0: 20 20 4c 61 74 65 72 0a 20 20 20 20 2a 2a 20 63    Later.    ** c
deb0: 6f 64 65 20 61 73 73 75 6d 65 73 20 74 68 65 20  ode assumes the 
dec0: 50 52 49 4d 41 52 59 20 4b 45 59 20 63 6f 6e 74  PRIMARY KEY cont
ded0: 61 69 6e 73 20 6e 6f 20 72 65 70 65 61 74 65 64  ains no repeated
dee0: 20 63 6f 6c 75 6d 6e 73 2e 0a 20 20 20 20 2a 2f   columns..    */
def0: 0a 20 20 20 20 66 6f 72 28 69 3d 6a 3d 31 3b 20  .    for(i=j=1; 
df00: 69 3c 70 50 6b 2d 3e 6e 4b 65 79 43 6f 6c 3b 20  i<pPk->nKeyCol; 
df10: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  i++){.      if( 
df20: 68 61 73 43 6f 6c 75 6d 6e 28 70 50 6b 2d 3e 61  hasColumn(pPk->a
df30: 69 43 6f 6c 75 6d 6e 2c 20 6a 2c 20 70 50 6b 2d  iColumn, j, pPk-
df40: 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 29 20 29 7b  >aiColumn[i]) ){
df50: 0a 20 20 20 20 20 20 20 20 70 50 6b 2d 3e 6e 43  .        pPk->nC
df60: 6f 6c 75 6d 6e 2d 2d 3b 0a 20 20 20 20 20 20 7d  olumn--;.      }
df70: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 50  else{.        pP
df80: 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 2b 2b 5d  k->aiColumn[j++]
df90: 20 3d 20 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e   = pPk->aiColumn
dfa0: 5b 69 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  [i];.      }.   
dfb0: 20 7d 0a 20 20 20 20 70 50 6b 2d 3e 6e 4b 65 79   }.    pPk->nKey
dfc0: 43 6f 6c 20 3d 20 6a 3b 0a 20 20 7d 0a 20 20 70  Col = j;.  }.  p
dfd0: 50 6b 2d 3e 69 73 43 6f 76 65 72 69 6e 67 20 3d  Pk->isCovering =
dfe0: 20 31 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   1;.  assert( pP
dff0: 6b 21 3d 30 20 29 3b 0a 20 20 6e 50 6b 20 3d 20  k!=0 );.  nPk = 
e000: 70 50 6b 2d 3e 6e 4b 65 79 43 6f 6c 3b 0a 0a 20  pPk->nKeyCol;.. 
e010: 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 65 76   /* Make sure ev
e020: 65 72 79 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68  ery column of th
e030: 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 69 73  e PRIMARY KEY is
e040: 20 4e 4f 54 20 4e 55 4c 4c 2e 20 20 28 45 78 63   NOT NULL.  (Exc
e050: 65 70 74 2c 0a 20 20 2a 2a 20 64 6f 20 6e 6f 74  ept,.  ** do not
e060: 20 65 6e 66 6f 72 63 65 20 74 68 69 73 20 66 6f   enforce this fo
e070: 72 20 69 6d 70 6f 73 74 65 72 20 74 61 62 6c 65  r imposter table
e080: 73 2e 29 20 2a 2f 0a 20 20 69 66 28 20 21 64 62  s.) */.  if( !db
e090: 2d 3e 69 6e 69 74 2e 69 6d 70 6f 73 74 65 72 54  ->init.imposterT
e0a0: 61 62 6c 65 20 29 7b 0a 20 20 20 20 66 6f 72 28  able ){.    for(
e0b0: 69 3d 30 3b 20 69 3c 6e 50 6b 3b 20 69 2b 2b 29  i=0; i<nPk; i++)
e0c0: 7b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 61 43  {.      pTab->aC
e0d0: 6f 6c 5b 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e  ol[pPk->aiColumn
e0e0: 5b 69 5d 5d 2e 6e 6f 74 4e 75 6c 6c 20 3d 20 4f  [i]].notNull = O
e0f0: 45 5f 41 62 6f 72 74 3b 0a 20 20 20 20 7d 0a 20  E_Abort;.    }. 
e100: 20 20 20 70 50 6b 2d 3e 75 6e 69 71 4e 6f 74 4e     pPk->uniqNotN
e110: 75 6c 6c 20 3d 20 31 3b 0a 20 20 7d 0a 0a 20 20  ull = 1;.  }..  
e120: 2f 2a 20 54 68 65 20 72 6f 6f 74 20 70 61 67 65  /* The root page
e130: 20 6f 66 20 74 68 65 20 50 52 49 4d 41 52 59 20   of the PRIMARY 
e140: 4b 45 59 20 69 73 20 74 68 65 20 74 61 62 6c 65  KEY is the table
e150: 20 72 6f 6f 74 20 70 61 67 65 20 2a 2f 0a 20 20   root page */.  
e160: 70 50 6b 2d 3e 74 6e 75 6d 20 3d 20 70 54 61 62  pPk->tnum = pTab
e170: 2d 3e 74 6e 75 6d 3b 0a 0a 20 20 2f 2a 20 55 70  ->tnum;..  /* Up
e180: 64 61 74 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f  date the in-memo
e190: 72 79 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f  ry representatio
e1a0: 6e 20 6f 66 20 61 6c 6c 20 55 4e 49 51 55 45 20  n of all UNIQUE 
e1b0: 69 6e 64 69 63 65 73 20 62 79 20 63 6f 6e 76 65  indices by conve
e1c0: 72 74 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20 66  rting.  ** the f
e1d0: 69 6e 61 6c 20 72 6f 77 69 64 20 63 6f 6c 75 6d  inal rowid colum
e1e0: 6e 20 69 6e 74 6f 20 6f 6e 65 20 6f 72 20 6d 6f  n into one or mo
e1f0: 72 65 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68  re columns of th
e200: 65 20 50 52 49 4d 41 52 59 20 4b 45 59 2e 0a 20  e PRIMARY KEY.. 
e210: 20 2a 2f 0a 20 20 66 6f 72 28 70 49 64 78 3d 70   */.  for(pIdx=p
e220: 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64  Tab->pIndex; pId
e230: 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e  x; pIdx=pIdx->pN
e240: 65 78 74 29 7b 0a 20 20 20 20 69 6e 74 20 6e 3b  ext){.    int n;
e250: 0a 20 20 20 20 69 66 28 20 49 73 50 72 69 6d 61  .    if( IsPrima
e260: 72 79 4b 65 79 49 6e 64 65 78 28 70 49 64 78 29  ryKeyIndex(pIdx)
e270: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
e280: 20 66 6f 72 28 69 3d 6e 3d 30 3b 20 69 3c 6e 50   for(i=n=0; i<nP
e290: 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  k; i++){.      i
e2a0: 66 28 20 21 68 61 73 43 6f 6c 75 6d 6e 28 70 49  f( !hasColumn(pI
e2b0: 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 2c 20 70 49  dx->aiColumn, pI
e2c0: 64 78 2d 3e 6e 4b 65 79 43 6f 6c 2c 20 70 50 6b  dx->nKeyCol, pPk
e2d0: 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 29 20 29  ->aiColumn[i]) )
e2e0: 20 6e 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20   n++;.    }.    
e2f0: 69 66 28 20 6e 3d 3d 30 20 29 7b 0a 20 20 20 20  if( n==0 ){.    
e300: 20 20 2f 2a 20 54 68 69 73 20 69 6e 64 65 78 20    /* This index 
e310: 69 73 20 61 20 73 75 70 65 72 73 65 74 20 6f 66  is a superset of
e320: 20 74 68 65 20 70 72 69 6d 61 72 79 20 6b 65 79   the primary key
e330: 20 2a 2f 0a 20 20 20 20 20 20 70 49 64 78 2d 3e   */.      pIdx->
e340: 6e 43 6f 6c 75 6d 6e 20 3d 20 70 49 64 78 2d 3e  nColumn = pIdx->
e350: 6e 4b 65 79 43 6f 6c 3b 0a 20 20 20 20 20 20 63  nKeyCol;.      c
e360: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20  ontinue;.    }. 
e370: 20 20 20 69 66 28 20 72 65 73 69 7a 65 49 6e 64     if( resizeInd
e380: 65 78 4f 62 6a 65 63 74 28 64 62 2c 20 70 49 64  exObject(db, pId
e390: 78 2c 20 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c  x, pIdx->nKeyCol
e3a0: 2b 6e 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  +n) ) return;.  
e3b0: 20 20 66 6f 72 28 69 3d 30 2c 20 6a 3d 70 49 64    for(i=0, j=pId
e3c0: 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 69 3c 6e 50  x->nKeyCol; i<nP
e3d0: 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  k; i++){.      i
e3e0: 66 28 20 21 68 61 73 43 6f 6c 75 6d 6e 28 70 49  f( !hasColumn(pI
e3f0: 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 2c 20 70 49  dx->aiColumn, pI
e400: 64 78 2d 3e 6e 4b 65 79 43 6f 6c 2c 20 70 50 6b  dx->nKeyCol, pPk
e410: 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 29 20 29  ->aiColumn[i]) )
e420: 7b 0a 20 20 20 20 20 20 20 20 70 49 64 78 2d 3e  {.        pIdx->
e430: 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 20 3d 20 70 50  aiColumn[j] = pP
e440: 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 3b 0a  k->aiColumn[i];.
e450: 20 20 20 20 20 20 20 20 70 49 64 78 2d 3e 61 7a          pIdx->az
e460: 43 6f 6c 6c 5b 6a 5d 20 3d 20 70 50 6b 2d 3e 61  Coll[j] = pPk->a
e470: 7a 43 6f 6c 6c 5b 69 5d 3b 0a 20 20 20 20 20 20  zColl[i];.      
e480: 20 20 6a 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20    j++;.      }. 
e490: 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
e4a0: 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3e 3d   pIdx->nColumn>=
e4b0: 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 2b 6e 20  pIdx->nKeyCol+n 
e4c0: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
e4d0: 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3e 3d 6a 20  Idx->nColumn>=j 
e4e0: 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 64 64  );.  }..  /* Add
e4f0: 20 61 6c 6c 20 74 61 62 6c 65 20 63 6f 6c 75 6d   all table colum
e500: 6e 73 20 74 6f 20 74 68 65 20 50 52 49 4d 41 52  ns to the PRIMAR
e510: 59 20 4b 45 59 20 69 6e 64 65 78 0a 20 20 2a 2f  Y KEY index.  */
e520: 0a 20 20 69 66 28 20 6e 50 6b 3c 70 54 61 62 2d  .  if( nPk<pTab-
e530: 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 69 66 28  >nCol ){.    if(
e540: 20 72 65 73 69 7a 65 49 6e 64 65 78 4f 62 6a 65   resizeIndexObje
e550: 63 74 28 64 62 2c 20 70 50 6b 2c 20 70 54 61 62  ct(db, pPk, pTab
e560: 2d 3e 6e 43 6f 6c 29 20 29 20 72 65 74 75 72 6e  ->nCol) ) return
e570: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 6a  ;.    for(i=0, j
e580: 3d 6e 50 6b 3b 20 69 3c 70 54 61 62 2d 3e 6e 43  =nPk; i<pTab->nC
e590: 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ol; i++){.      
e5a0: 69 66 28 20 21 68 61 73 43 6f 6c 75 6d 6e 28 70  if( !hasColumn(p
e5b0: 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 2c 20 6a 2c  Pk->aiColumn, j,
e5c0: 20 69 29 20 29 7b 0a 20 20 20 20 20 20 20 20 61   i) ){.        a
e5d0: 73 73 65 72 74 28 20 6a 3c 70 50 6b 2d 3e 6e 43  ssert( j<pPk->nC
e5e0: 6f 6c 75 6d 6e 20 29 3b 0a 20 20 20 20 20 20 20  olumn );.       
e5f0: 20 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a   pPk->aiColumn[j
e600: 5d 20 3d 20 69 3b 0a 20 20 20 20 20 20 20 20 70  ] = i;.        p
e610: 50 6b 2d 3e 61 7a 43 6f 6c 6c 5b 6a 5d 20 3d 20  Pk->azColl[j] = 
e620: 73 71 6c 69 74 65 33 53 74 72 42 49 4e 41 52 59  sqlite3StrBINARY
e630: 3b 0a 20 20 20 20 20 20 20 20 6a 2b 2b 3b 0a 20  ;.        j++;. 
e640: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
e650: 20 61 73 73 65 72 74 28 20 70 50 6b 2d 3e 6e 43   assert( pPk->nC
e660: 6f 6c 75 6d 6e 3d 3d 6a 20 29 3b 0a 20 20 20 20  olumn==j );.    
e670: 61 73 73 65 72 74 28 20 70 54 61 62 2d 3e 6e 43  assert( pTab->nC
e680: 6f 6c 3d 3d 6a 20 29 3b 0a 20 20 7d 65 6c 73 65  ol==j );.  }else
e690: 7b 0a 20 20 20 20 70 50 6b 2d 3e 6e 43 6f 6c 75  {.    pPk->nColu
e6a0: 6d 6e 20 3d 20 70 54 61 62 2d 3e 6e 43 6f 6c 3b  mn = pTab->nCol;
e6b0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  .  }.}../*.** Th
e6c0: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
e6d0: 6c 6c 65 64 20 74 6f 20 72 65 70 6f 72 74 20 74  lled to report t
e6e0: 68 65 20 66 69 6e 61 6c 20 22 29 22 20 74 68 61  he final ")" tha
e6f0: 74 20 74 65 72 6d 69 6e 61 74 65 73 0a 2a 2a 20  t terminates.** 
e700: 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73  a CREATE TABLE s
e710: 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20  tatement..**.** 
e720: 54 68 65 20 74 61 62 6c 65 20 73 74 72 75 63 74  The table struct
e730: 75 72 65 20 74 68 61 74 20 6f 74 68 65 72 20 61  ure that other a
e740: 63 74 69 6f 6e 20 72 6f 75 74 69 6e 65 73 20 68  ction routines h
e750: 61 76 65 20 62 65 65 6e 20 62 75 69 6c 64 69 6e  ave been buildin
e760: 67 0a 2a 2a 20 69 73 20 61 64 64 65 64 20 74 6f  g.** is added to
e770: 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 68 61   the internal ha
e780: 73 68 20 74 61 62 6c 65 73 2c 20 61 73 73 75 6d  sh tables, assum
e790: 69 6e 67 20 6e 6f 20 65 72 72 6f 72 73 20 68 61  ing no errors ha
e7a0: 76 65 0a 2a 2a 20 6f 63 63 75 72 72 65 64 2e 0a  ve.** occurred..
e7b0: 2a 2a 0a 2a 2a 20 41 6e 20 65 6e 74 72 79 20 66  **.** An entry f
e7c0: 6f 72 20 74 68 65 20 74 61 62 6c 65 20 69 73 20  or the table is 
e7d0: 6d 61 64 65 20 69 6e 20 74 68 65 20 6d 61 73 74  made in the mast
e7e0: 65 72 20 74 61 62 6c 65 20 6f 6e 20 64 69 73 6b  er table on disk
e7f0: 2c 20 75 6e 6c 65 73 73 0a 2a 2a 20 74 68 69 73  , unless.** this
e800: 20 69 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20   is a temporary 
e810: 74 61 62 6c 65 20 6f 72 20 64 62 2d 3e 69 6e 69  table or db->ini
e820: 74 2e 62 75 73 79 3d 3d 31 2e 20 20 57 68 65 6e  t.busy==1.  When
e830: 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d   db->init.busy==
e840: 31 0a 2a 2a 20 69 74 20 6d 65 61 6e 73 20 77 65  1.** it means we
e850: 20 61 72 65 20 72 65 61 64 69 6e 67 20 74 68 65   are reading the
e860: 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74   sqlite_master t
e870: 61 62 6c 65 20 62 65 63 61 75 73 65 20 77 65 20  able because we 
e880: 6a 75 73 74 0a 2a 2a 20 63 6f 6e 6e 65 63 74 65  just.** connecte
e890: 64 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  d to the databas
e8a0: 65 20 6f 72 20 62 65 63 61 75 73 65 20 74 68 65  e or because the
e8b0: 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74   sqlite_master t
e8c0: 61 62 6c 65 20 68 61 73 0a 2a 2a 20 72 65 63 65  able has.** rece
e8d0: 6e 74 6c 79 20 63 68 61 6e 67 65 64 2c 20 73 6f  ntly changed, so
e8e0: 20 74 68 65 20 65 6e 74 72 79 20 66 6f 72 20 74   the entry for t
e8f0: 68 69 73 20 74 61 62 6c 65 20 61 6c 72 65 61 64  his table alread
e900: 79 20 65 78 69 73 74 73 20 69 6e 0a 2a 2a 20 74  y exists in.** t
e910: 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  he sqlite_master
e920: 20 74 61 62 6c 65 2e 20 20 57 65 20 64 6f 20 6e   table.  We do n
e930: 6f 74 20 77 61 6e 74 20 74 6f 20 63 72 65 61 74  ot want to creat
e940: 65 20 69 74 20 61 67 61 69 6e 2e 0a 2a 2a 0a 2a  e it again..**.*
e950: 2a 20 49 66 20 74 68 65 20 70 53 65 6c 65 63 74  * If the pSelect
e960: 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f 74   argument is not
e970: 20 4e 55 4c 4c 2c 20 69 74 20 6d 65 61 6e 73 20   NULL, it means 
e980: 74 68 61 74 20 74 68 69 73 20 72 6f 75 74 69 6e  that this routin
e990: 65 0a 2a 2a 20 77 61 73 20 63 61 6c 6c 65 64 20  e.** was called 
e9a0: 74 6f 20 63 72 65 61 74 65 20 61 20 74 61 62 6c  to create a tabl
e9b0: 65 20 67 65 6e 65 72 61 74 65 64 20 66 72 6f 6d  e generated from
e9c0: 20 61 20 0a 2a 2a 20 22 43 52 45 41 54 45 20 54   a .** "CREATE T
e9d0: 41 42 4c 45 20 2e 2e 2e 20 41 53 20 53 45 4c 45  ABLE ... AS SELE
e9e0: 43 54 20 2e 2e 2e 22 20 73 74 61 74 65 6d 65 6e  CT ..." statemen
e9f0: 74 2e 20 20 54 68 65 20 63 6f 6c 75 6d 6e 20 6e  t.  The column n
ea00: 61 6d 65 73 20 6f 66 0a 2a 2a 20 74 68 65 20 6e  ames of.** the n
ea10: 65 77 20 74 61 62 6c 65 20 77 69 6c 6c 20 6d 61  ew table will ma
ea20: 74 63 68 20 74 68 65 20 72 65 73 75 6c 74 20 73  tch the result s
ea30: 65 74 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54  et of the SELECT
ea40: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
ea50: 33 45 6e 64 54 61 62 6c 65 28 0a 20 20 50 61 72  3EndTable(.  Par
ea60: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
ea70: 20 20 20 20 20 2f 2a 20 50 61 72 73 65 20 63 6f       /* Parse co
ea80: 6e 74 65 78 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e  ntext */.  Token
ea90: 20 2a 70 43 6f 6e 73 2c 20 20 20 20 20 20 20 20   *pCons,        
eaa0: 20 20 20 2f 2a 20 54 68 65 20 27 2c 27 20 74 6f     /* The ',' to
eab0: 6b 65 6e 20 61 66 74 65 72 20 74 68 65 20 6c 61  ken after the la
eac0: 73 74 20 63 6f 6c 75 6d 6e 20 64 65 66 6e 2e 20  st column defn. 
ead0: 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 45 6e 64  */.  Token *pEnd
eae0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
eaf0: 54 68 65 20 27 29 27 20 62 65 66 6f 72 65 20 6f  The ')' before o
eb00: 70 74 69 6f 6e 73 20 69 6e 20 74 68 65 20 43 52  ptions in the CR
eb10: 45 41 54 45 20 54 41 42 4c 45 20 2a 2f 0a 20 20  EATE TABLE */.  
eb20: 75 38 20 74 61 62 4f 70 74 73 2c 20 20 20 20 20  u8 tabOpts,     
eb30: 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61          /* Extra
eb40: 20 74 61 62 6c 65 20 6f 70 74 69 6f 6e 73 2e 20   table options. 
eb50: 55 73 75 61 6c 6c 79 20 30 2e 20 2a 2f 0a 20 20  Usually 0. */.  
eb60: 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 20  Select *pSelect 
eb70: 20 20 20 20 20 20 20 20 2f 2a 20 53 65 6c 65 63          /* Selec
eb80: 74 20 66 72 6f 6d 20 61 20 22 43 52 45 41 54 45  t from a "CREATE
eb90: 20 2e 2e 2e 20 41 53 20 53 45 4c 45 43 54 22 20   ... AS SELECT" 
eba0: 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70  */.){.  Table *p
ebb0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
ebc0: 20 20 2f 2a 20 54 68 65 20 6e 65 77 20 74 61 62    /* The new tab
ebd0: 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  le */.  sqlite3 
ebe0: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
ebf0: 3b 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73  ; /* The databas
ec00: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a  e connection */.
ec10: 20 20 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20    int iDb;      
ec20: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
ec30: 61 74 61 62 61 73 65 20 69 6e 20 77 68 69 63 68  atabase in which
ec40: 20 74 68 65 20 74 61 62 6c 65 20 6c 69 76 65 73   the table lives
ec50: 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64   */.  Index *pId
ec60: 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x;              
ec70: 2f 2a 20 41 6e 20 69 6d 70 6c 69 65 64 20 69 6e  /* An implied in
ec80: 64 65 78 20 6f 66 20 74 68 65 20 74 61 62 6c 65  dex of the table
ec90: 20 2a 2f 0a 0a 20 20 69 66 28 20 70 45 6e 64 3d   */..  if( pEnd=
eca0: 3d 30 20 26 26 20 70 53 65 6c 65 63 74 3d 3d 30  =0 && pSelect==0
ecb0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a   ){.    return;.
ecc0: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 21 64    }.  assert( !d
ecd0: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
ece0: 29 3b 0a 20 20 70 20 3d 20 70 50 61 72 73 65 2d  );.  p = pParse-
ecf0: 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 69 66  >pNewTable;.  if
ed00: 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ( p==0 ) return;
ed10: 0a 0a 20 20 61 73 73 65 72 74 28 20 21 64 62 2d  ..  assert( !db-
ed20: 3e 69 6e 69 74 2e 62 75 73 79 20 7c 7c 20 21 70  >init.busy || !p
ed30: 53 65 6c 65 63 74 20 29 3b 0a 0a 20 20 2f 2a 20  Select );..  /* 
ed40: 49 66 20 74 68 65 20 64 62 2d 3e 69 6e 69 74 2e  If the db->init.
ed50: 62 75 73 79 20 69 73 20 31 20 69 74 20 6d 65 61  busy is 1 it mea
ed60: 6e 73 20 77 65 20 61 72 65 20 72 65 61 64 69 6e  ns we are readin
ed70: 67 20 74 68 65 20 53 51 4c 20 6f 66 66 20 74 68  g the SQL off th
ed80: 65 0a 20 20 2a 2a 20 22 73 71 6c 69 74 65 5f 6d  e.  ** "sqlite_m
ed90: 61 73 74 65 72 22 20 6f 72 20 22 73 71 6c 69 74  aster" or "sqlit
eda0: 65 5f 74 65 6d 70 5f 6d 61 73 74 65 72 22 20 74  e_temp_master" t
edb0: 61 62 6c 65 20 6f 6e 20 74 68 65 20 64 69 73 6b  able on the disk
edc0: 2e 0a 20 20 2a 2a 20 53 6f 20 64 6f 20 6e 6f 74  ..  ** So do not
edd0: 20 77 72 69 74 65 20 74 6f 20 74 68 65 20 64 69   write to the di
ede0: 73 6b 20 61 67 61 69 6e 2e 20 20 45 78 74 72 61  sk again.  Extra
edf0: 63 74 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65  ct the root page
ee00: 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 66 6f 72   number.  ** for
ee10: 20 74 68 65 20 74 61 62 6c 65 20 66 72 6f 6d 20   the table from 
ee20: 74 68 65 20 64 62 2d 3e 69 6e 69 74 2e 6e 65 77  the db->init.new
ee30: 54 6e 75 6d 20 66 69 65 6c 64 2e 20 20 28 54 68  Tnum field.  (Th
ee40: 65 20 70 61 67 65 20 6e 75 6d 62 65 72 0a 20 20  e page number.  
ee50: 2a 2a 20 73 68 6f 75 6c 64 20 68 61 76 65 20 62  ** should have b
ee60: 65 65 6e 20 70 75 74 20 74 68 65 72 65 20 62 79  een put there by
ee70: 20 74 68 65 20 73 71 6c 69 74 65 4f 70 65 6e 43   the sqliteOpenC
ee80: 62 20 72 6f 75 74 69 6e 65 2e 29 0a 20 20 2a 2a  b routine.).  **
ee90: 0a 20 20 2a 2a 20 49 66 20 74 68 65 20 72 6f 6f  .  ** If the roo
eea0: 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73  t page number is
eeb0: 20 31 2c 20 74 68 61 74 20 6d 65 61 6e 73 20 74   1, that means t
eec0: 68 69 73 20 69 73 20 74 68 65 20 73 71 6c 69 74  his is the sqlit
eed0: 65 5f 6d 61 73 74 65 72 0a 20 20 2a 2a 20 74 61  e_master.  ** ta
eee0: 62 6c 65 20 69 74 73 65 6c 66 2e 20 20 53 6f 20  ble itself.  So 
eef0: 6d 61 72 6b 20 69 74 20 72 65 61 64 2d 6f 6e 6c  mark it read-onl
ef00: 79 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62  y..  */.  if( db
ef10: 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20  ->init.busy ){. 
ef20: 20 20 20 70 2d 3e 74 6e 75 6d 20 3d 20 64 62 2d     p->tnum = db-
ef30: 3e 69 6e 69 74 2e 6e 65 77 54 6e 75 6d 3b 0a 20  >init.newTnum;. 
ef40: 20 20 20 69 66 28 20 70 2d 3e 74 6e 75 6d 3d 3d     if( p->tnum==
ef50: 31 20 29 20 70 2d 3e 74 61 62 46 6c 61 67 73 20  1 ) p->tabFlags 
ef60: 7c 3d 20 54 46 5f 52 65 61 64 6f 6e 6c 79 3b 0a  |= TF_Readonly;.
ef70: 20 20 7d 0a 0a 20 20 2f 2a 20 53 70 65 63 69 61    }..  /* Specia
ef80: 6c 20 70 72 6f 63 65 73 73 69 6e 67 20 66 6f 72  l processing for
ef90: 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 20 54   WITHOUT ROWID T
efa0: 61 62 6c 65 73 20 2a 2f 0a 20 20 69 66 28 20 74  ables */.  if( t
efb0: 61 62 4f 70 74 73 20 26 20 54 46 5f 57 69 74 68  abOpts & TF_With
efc0: 6f 75 74 52 6f 77 69 64 20 29 7b 0a 20 20 20 20  outRowid ){.    
efd0: 69 66 28 20 28 70 2d 3e 74 61 62 46 6c 61 67 73  if( (p->tabFlags
efe0: 20 26 20 54 46 5f 41 75 74 6f 69 6e 63 72 65 6d   & TF_Autoincrem
eff0: 65 6e 74 29 20 29 7b 0a 20 20 20 20 20 20 73 71  ent) ){.      sq
f000: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
f010: 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20 20 20  arse,.          
f020: 22 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 20 6e  "AUTOINCREMENT n
f030: 6f 74 20 61 6c 6c 6f 77 65 64 20 6f 6e 20 57 49  ot allowed on WI
f040: 54 48 4f 55 54 20 52 4f 57 49 44 20 74 61 62 6c  THOUT ROWID tabl
f050: 65 73 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75  es");.      retu
f060: 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  rn;.    }.    if
f070: 28 20 28 70 2d 3e 74 61 62 46 6c 61 67 73 20 26  ( (p->tabFlags &
f080: 20 54 46 5f 48 61 73 50 72 69 6d 61 72 79 4b 65   TF_HasPrimaryKe
f090: 79 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  y)==0 ){.      s
f0a0: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
f0b0: 50 61 72 73 65 2c 20 22 50 52 49 4d 41 52 59 20  Parse, "PRIMARY 
f0c0: 4b 45 59 20 6d 69 73 73 69 6e 67 20 6f 6e 20 74  KEY missing on t
f0d0: 61 62 6c 65 20 25 73 22 2c 20 70 2d 3e 7a 4e 61  able %s", p->zNa
f0e0: 6d 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  me);.    }else{.
f0f0: 20 20 20 20 20 20 70 2d 3e 74 61 62 46 6c 61 67        p->tabFlag
f100: 73 20 7c 3d 20 54 46 5f 57 69 74 68 6f 75 74 52  s |= TF_WithoutR
f110: 6f 77 69 64 20 7c 20 54 46 5f 4e 6f 56 69 73 69  owid | TF_NoVisi
f120: 62 6c 65 52 6f 77 69 64 3b 0a 20 20 20 20 20 20  bleRowid;.      
f130: 63 6f 6e 76 65 72 74 54 6f 57 69 74 68 6f 75 74  convertToWithout
f140: 52 6f 77 69 64 54 61 62 6c 65 28 70 50 61 72 73  RowidTable(pPars
f150: 65 2c 20 70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  e, p);.    }.  }
f160: 0a 0a 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65  ..  iDb = sqlite
f170: 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64  3SchemaToIndex(d
f180: 62 2c 20 70 2d 3e 70 53 63 68 65 6d 61 29 3b 0a  b, p->pSchema);.
f190: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
f1a0: 4f 4d 49 54 5f 43 48 45 43 4b 0a 20 20 2f 2a 20  OMIT_CHECK.  /* 
f1b0: 52 65 73 6f 6c 76 65 20 6e 61 6d 65 73 20 69 6e  Resolve names in
f1c0: 20 61 6c 6c 20 43 48 45 43 4b 20 63 6f 6e 73 74   all CHECK const
f1d0: 72 61 69 6e 74 20 65 78 70 72 65 73 73 69 6f 6e  raint expression
f1e0: 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d  s..  */.  if( p-
f1f0: 3e 70 43 68 65 63 6b 20 29 7b 0a 20 20 20 20 73  >pCheck ){.    s
f200: 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 53 65 6c  qlite3ResolveSel
f210: 66 52 65 66 65 72 65 6e 63 65 28 70 50 61 72 73  fReference(pPars
f220: 65 2c 20 70 2c 20 4e 43 5f 49 73 43 68 65 63 6b  e, p, NC_IsCheck
f230: 2c 20 30 2c 20 70 2d 3e 70 43 68 65 63 6b 29 3b  , 0, p->pCheck);
f240: 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21  .  }.#endif /* !
f250: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
f260: 4d 49 54 5f 43 48 45 43 4b 29 20 2a 2f 0a 0a 20  MIT_CHECK) */.. 
f270: 20 2f 2a 20 45 73 74 69 6d 61 74 65 20 74 68 65   /* Estimate the
f280: 20 61 76 65 72 61 67 65 20 72 6f 77 20 73 69 7a   average row siz
f290: 65 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20  e for the table 
f2a0: 61 6e 64 20 66 6f 72 20 61 6c 6c 20 69 6d 70 6c  and for all impl
f2b0: 69 65 64 20 69 6e 64 69 63 65 73 20 2a 2f 0a 20  ied indices */. 
f2c0: 20 65 73 74 69 6d 61 74 65 54 61 62 6c 65 57 69   estimateTableWi
f2d0: 64 74 68 28 70 29 3b 0a 20 20 66 6f 72 28 70 49  dth(p);.  for(pI
f2e0: 64 78 3d 70 2d 3e 70 49 6e 64 65 78 3b 20 70 49  dx=p->pIndex; pI
f2f0: 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70  dx; pIdx=pIdx->p
f300: 4e 65 78 74 29 7b 0a 20 20 20 20 65 73 74 69 6d  Next){.    estim
f310: 61 74 65 49 6e 64 65 78 57 69 64 74 68 28 70 49  ateIndexWidth(pI
f320: 64 78 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  dx);.  }..  /* I
f330: 66 20 6e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 69  f not initializi
f340: 6e 67 2c 20 74 68 65 6e 20 63 72 65 61 74 65 20  ng, then create 
f350: 61 20 72 65 63 6f 72 64 20 66 6f 72 20 74 68 65  a record for the
f360: 20 6e 65 77 20 74 61 62 6c 65 0a 20 20 2a 2a 20   new table.  ** 
f370: 69 6e 20 74 68 65 20 53 51 4c 49 54 45 5f 4d 41  in the SQLITE_MA
f380: 53 54 45 52 20 74 61 62 6c 65 20 6f 66 20 74 68  STER table of th
f390: 65 20 64 61 74 61 62 61 73 65 2e 0a 20 20 2a 2a  e database..  **
f3a0: 0a 20 20 2a 2a 20 49 66 20 74 68 69 73 20 69 73  .  ** If this is
f3b0: 20 61 20 54 45 4d 50 4f 52 41 52 59 20 74 61 62   a TEMPORARY tab
f3c0: 6c 65 2c 20 77 72 69 74 65 20 74 68 65 20 65 6e  le, write the en
f3d0: 74 72 79 20 69 6e 74 6f 20 74 68 65 20 61 75 78  try into the aux
f3e0: 69 6c 69 61 72 79 0a 20 20 2a 2a 20 66 69 6c 65  iliary.  ** file
f3f0: 20 69 6e 73 74 65 61 64 20 6f 66 20 69 6e 74 6f   instead of into
f400: 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61   the main databa
f410: 73 65 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20  se file..  */.  
f420: 69 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75  if( !db->init.bu
f430: 73 79 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 3b  sy ){.    int n;
f440: 0a 20 20 20 20 56 64 62 65 20 2a 76 3b 0a 20 20  .    Vdbe *v;.  
f450: 20 20 63 68 61 72 20 2a 7a 54 79 70 65 3b 20 20    char *zType;  
f460: 20 20 2f 2a 20 22 76 69 65 77 22 20 6f 72 20 22    /* "view" or "
f470: 74 61 62 6c 65 22 20 2a 2f 0a 20 20 20 20 63 68  table" */.    ch
f480: 61 72 20 2a 7a 54 79 70 65 32 3b 20 20 20 2f 2a  ar *zType2;   /*
f490: 20 22 56 49 45 57 22 20 6f 72 20 22 54 41 42 4c   "VIEW" or "TABL
f4a0: 45 22 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a  E" */.    char *
f4b0: 7a 53 74 6d 74 3b 20 20 20 20 2f 2a 20 54 65 78  zStmt;    /* Tex
f4c0: 74 20 6f 66 20 74 68 65 20 43 52 45 41 54 45 20  t of the CREATE 
f4d0: 54 41 42 4c 45 20 6f 72 20 43 52 45 41 54 45 20  TABLE or CREATE 
f4e0: 56 49 45 57 20 73 74 61 74 65 6d 65 6e 74 20 2a  VIEW statement *
f4f0: 2f 0a 0a 20 20 20 20 76 20 3d 20 73 71 6c 69 74  /..    v = sqlit
f500: 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
f510: 29 3b 0a 20 20 20 20 69 66 28 20 4e 45 56 45 52  );.    if( NEVER
f520: 28 76 3d 3d 30 29 20 29 20 72 65 74 75 72 6e 3b  (v==0) ) return;
f530: 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ..    sqlite3Vdb
f540: 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 43 6c  eAddOp1(v, OP_Cl
f550: 6f 73 65 2c 20 30 29 3b 0a 0a 20 20 20 20 2f 2a  ose, 0);..    /*
f560: 20 0a 20 20 20 20 2a 2a 20 49 6e 69 74 69 61 6c   .    ** Initial
f570: 69 7a 65 20 7a 54 79 70 65 20 66 6f 72 20 74 68  ize zType for th
f580: 65 20 6e 65 77 20 76 69 65 77 20 6f 72 20 74 61  e new view or ta
f590: 62 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ble..    */.    
f5a0: 69 66 28 20 70 2d 3e 70 53 65 6c 65 63 74 3d 3d  if( p->pSelect==
f5b0: 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 20  0 ){.      /* A 
f5c0: 72 65 67 75 6c 61 72 20 74 61 62 6c 65 20 2a 2f  regular table */
f5d0: 0a 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22  .      zType = "
f5e0: 74 61 62 6c 65 22 3b 0a 20 20 20 20 20 20 7a 54  table";.      zT
f5f0: 79 70 65 32 20 3d 20 22 54 41 42 4c 45 22 3b 0a  ype2 = "TABLE";.
f600: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
f610: 4d 49 54 5f 56 49 45 57 0a 20 20 20 20 7d 65 6c  MIT_VIEW.    }el
f620: 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 41 20 76  se{.      /* A v
f630: 69 65 77 20 2a 2f 0a 20 20 20 20 20 20 7a 54 79  iew */.      zTy
f640: 70 65 20 3d 20 22 76 69 65 77 22 3b 0a 20 20 20  pe = "view";.   
f650: 20 20 20 7a 54 79 70 65 32 20 3d 20 22 56 49 45     zType2 = "VIE
f660: 57 22 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d  W";.#endif.    }
f670: 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73  ..    /* If this
f680: 20 69 73 20 61 20 43 52 45 41 54 45 20 54 41 42   is a CREATE TAB
f690: 4c 45 20 78 78 20 41 53 20 53 45 4c 45 43 54 20  LE xx AS SELECT 
f6a0: 2e 2e 2e 2c 20 65 78 65 63 75 74 65 20 74 68 65  ..., execute the
f6b0: 20 53 45 4c 45 43 54 0a 20 20 20 20 2a 2a 20 73   SELECT.    ** s
f6c0: 74 61 74 65 6d 65 6e 74 20 74 6f 20 70 6f 70 75  tatement to popu
f6d0: 6c 61 74 65 20 74 68 65 20 6e 65 77 20 74 61 62  late the new tab
f6e0: 6c 65 2e 20 54 68 65 20 72 6f 6f 74 2d 70 61 67  le. The root-pag
f6f0: 65 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65  e number for the
f700: 0a 20 20 20 20 2a 2a 20 6e 65 77 20 74 61 62 6c  .    ** new tabl
f710: 65 20 69 73 20 69 6e 20 72 65 67 69 73 74 65 72  e is in register
f720: 20 70 50 61 72 73 65 2d 3e 72 65 67 52 6f 6f 74   pParse->regRoot
f730: 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
f740: 4f 6e 63 65 20 74 68 65 20 53 45 4c 45 43 54 20  Once the SELECT 
f750: 68 61 73 20 62 65 65 6e 20 63 6f 64 65 64 20 62  has been coded b
f760: 79 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28  y sqlite3Select(
f770: 29 2c 20 69 74 20 69 73 20 69 6e 20 61 0a 20 20  ), it is in a.  
f780: 20 20 2a 2a 20 73 75 69 74 61 62 6c 65 20 73 74    ** suitable st
f790: 61 74 65 20 74 6f 20 71 75 65 72 79 20 66 6f 72  ate to query for
f7a0: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65   the column name
f7b0: 73 20 61 6e 64 20 74 79 70 65 73 20 74 6f 20 62  s and types to b
f7c0: 65 20 75 73 65 64 0a 20 20 20 20 2a 2a 20 62 79  e used.    ** by
f7d0: 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 2e 0a   the new table..
f7e0: 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 41 20      **.    ** A 
f7f0: 73 68 61 72 65 64 2d 63 61 63 68 65 20 77 72 69  shared-cache wri
f800: 74 65 2d 6c 6f 63 6b 20 69 73 20 6e 6f 74 20 72  te-lock is not r
f810: 65 71 75 69 72 65 64 20 74 6f 20 77 72 69 74 65  equired to write
f820: 20 74 6f 20 74 68 65 20 6e 65 77 20 74 61 62 6c   to the new tabl
f830: 65 2c 0a 20 20 20 20 2a 2a 20 61 73 20 61 20 73  e,.    ** as a s
f840: 63 68 65 6d 61 2d 6c 6f 63 6b 20 6d 75 73 74 20  chema-lock must 
f850: 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65  have already bee
f860: 6e 20 6f 62 74 61 69 6e 65 64 20 74 6f 20 63 72  n obtained to cr
f870: 65 61 74 65 20 69 74 2e 20 53 69 6e 63 65 0a 20  eate it. Since. 
f880: 20 20 20 2a 2a 20 61 20 73 63 68 65 6d 61 2d 6c     ** a schema-l
f890: 6f 63 6b 20 65 78 63 6c 75 64 65 73 20 61 6c 6c  ock excludes all
f8a0: 20 6f 74 68 65 72 20 64 61 74 61 62 61 73 65 20   other database 
f8b0: 75 73 65 72 73 2c 20 74 68 65 20 77 72 69 74 65  users, the write
f8c0: 2d 6c 6f 63 6b 20 77 6f 75 6c 64 0a 20 20 20 20  -lock would.    
f8d0: 2a 2a 20 62 65 20 72 65 64 75 6e 64 61 6e 74 2e  ** be redundant.
f8e0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
f8f0: 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20  pSelect ){.     
f900: 20 53 65 6c 65 63 74 44 65 73 74 20 64 65 73 74   SelectDest dest
f910: 3b 20 20 20 20 2f 2a 20 57 68 65 72 65 20 74 68  ;    /* Where th
f920: 65 20 53 45 4c 45 43 54 20 73 68 6f 75 6c 64 20  e SELECT should 
f930: 73 74 6f 72 65 20 72 65 73 75 6c 74 73 20 2a 2f  store results */
f940: 0a 20 20 20 20 20 20 69 6e 74 20 72 65 67 59 69  .      int regYi
f950: 65 6c 64 3b 20 20 20 20 20 20 20 2f 2a 20 52 65  eld;       /* Re
f960: 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 63  gister holding c
f970: 6f 2d 72 6f 75 74 69 6e 65 20 65 6e 74 72 79 2d  o-routine entry-
f980: 70 6f 69 6e 74 20 2a 2f 0a 20 20 20 20 20 20 69  point */.      i
f990: 6e 74 20 61 64 64 72 54 6f 70 3b 20 20 20 20 20  nt addrTop;     
f9a0: 20 20 20 2f 2a 20 54 6f 70 20 6f 66 20 74 68 65     /* Top of the
f9b0: 20 63 6f 2d 72 6f 75 74 69 6e 65 20 2a 2f 0a 20   co-routine */. 
f9c0: 20 20 20 20 20 69 6e 74 20 72 65 67 52 65 63 3b       int regRec;
f9d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 72 65           /* A re
f9e0: 63 6f 72 64 20 74 6f 20 62 65 20 69 6e 73 65 72  cord to be inser
f9f0: 74 20 69 6e 74 6f 20 74 68 65 20 6e 65 77 20 74  t into the new t
fa00: 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e  able */.      in
fa10: 74 20 72 65 67 52 6f 77 69 64 3b 20 20 20 20 20  t regRowid;     
fa20: 20 20 2f 2a 20 52 6f 77 69 64 20 6f 66 20 74 68    /* Rowid of th
fa30: 65 20 6e 65 78 74 20 72 6f 77 20 74 6f 20 69 6e  e next row to in
fa40: 73 65 72 74 20 2a 2f 0a 20 20 20 20 20 20 69 6e  sert */.      in
fa50: 74 20 61 64 64 72 49 6e 73 4c 6f 6f 70 3b 20 20  t addrInsLoop;  
fa60: 20 20 2f 2a 20 54 6f 70 20 6f 66 20 74 68 65 20    /* Top of the 
fa70: 6c 6f 6f 70 20 66 6f 72 20 69 6e 73 65 72 74 69  loop for inserti
fa80: 6e 67 20 72 6f 77 73 20 2a 2f 0a 20 20 20 20 20  ng rows */.     
fa90: 20 54 61 62 6c 65 20 2a 70 53 65 6c 54 61 62 3b   Table *pSelTab;
faa0: 20 20 20 20 20 2f 2a 20 41 20 74 61 62 6c 65 20       /* A table 
fab0: 74 68 61 74 20 64 65 73 63 72 69 62 65 73 20 74  that describes t
fac0: 68 65 20 53 45 4c 45 43 54 20 72 65 73 75 6c 74  he SELECT result
fad0: 73 20 2a 2f 0a 0a 20 20 20 20 20 20 72 65 67 59  s */..      regY
fae0: 69 65 6c 64 20 3d 20 2b 2b 70 50 61 72 73 65 2d  ield = ++pParse-
faf0: 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 72 65 67  >nMem;.      reg
fb00: 52 65 63 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  Rec = ++pParse->
fb10: 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 72 65 67 52  nMem;.      regR
fb20: 6f 77 69 64 20 3d 20 2b 2b 70 50 61 72 73 65 2d  owid = ++pParse-
fb30: 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 61 73 73  >nMem;.      ass
fb40: 65 72 74 28 70 50 61 72 73 65 2d 3e 6e 54 61 62  ert(pParse->nTab
fb50: 3d 3d 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ==1);.      sqli
fb60: 74 65 33 4d 61 79 41 62 6f 72 74 28 70 50 61 72  te3MayAbort(pPar
fb70: 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  se);.      sqlit
fb80: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
fb90: 4f 50 5f 4f 70 65 6e 57 72 69 74 65 2c 20 31 2c  OP_OpenWrite, 1,
fba0: 20 70 50 61 72 73 65 2d 3e 72 65 67 52 6f 6f 74   pParse->regRoot
fbb0: 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20 73 71  , iDb);.      sq
fbc0: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
fbd0: 35 28 76 2c 20 4f 50 46 4c 41 47 5f 50 32 49 53  5(v, OPFLAG_P2IS
fbe0: 52 45 47 29 3b 0a 20 20 20 20 20 20 70 50 61 72  REG);.      pPar
fbf0: 73 65 2d 3e 6e 54 61 62 20 3d 20 32 3b 0a 20 20  se->nTab = 2;.  
fc00: 20 20 20 20 61 64 64 72 54 6f 70 20 3d 20 73 71      addrTop = sq
fc10: 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
fc20: 41 64 64 72 28 76 29 20 2b 20 31 3b 0a 20 20 20  Addr(v) + 1;.   
fc30: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
fc40: 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 69 74 43  dOp3(v, OP_InitC
fc50: 6f 72 6f 75 74 69 6e 65 2c 20 72 65 67 59 69 65  oroutine, regYie
fc60: 6c 64 2c 20 30 2c 20 61 64 64 72 54 6f 70 29 3b  ld, 0, addrTop);
fc70: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65  .      sqlite3Se
fc80: 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26 64 65  lectDestInit(&de
fc90: 73 74 2c 20 53 52 54 5f 43 6f 72 6f 75 74 69 6e  st, SRT_Coroutin
fca0: 65 2c 20 72 65 67 59 69 65 6c 64 29 3b 0a 20 20  e, regYield);.  
fcb0: 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63      sqlite3Selec
fcc0: 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c 65 63  t(pParse, pSelec
fcd0: 74 2c 20 26 64 65 73 74 29 3b 0a 20 20 20 20 20  t, &dest);.     
fce0: 20 73 71 6c 69 74 65 33 56 64 62 65 45 6e 64 43   sqlite3VdbeEndC
fcf0: 6f 72 6f 75 74 69 6e 65 28 76 2c 20 72 65 67 59  oroutine(v, regY
fd00: 69 65 6c 64 29 3b 0a 20 20 20 20 20 20 73 71 6c  ield);.      sql
fd10: 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
fd20: 28 76 2c 20 61 64 64 72 54 6f 70 20 2d 20 31 29  (v, addrTop - 1)
fd30: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 72  ;.      if( pPar
fd40: 73 65 2d 3e 6e 45 72 72 20 29 20 72 65 74 75 72  se->nErr ) retur
fd50: 6e 3b 0a 20 20 20 20 20 20 70 53 65 6c 54 61 62  n;.      pSelTab
fd60: 20 3d 20 73 71 6c 69 74 65 33 52 65 73 75 6c 74   = sqlite3Result
fd70: 53 65 74 4f 66 53 65 6c 65 63 74 28 70 50 61 72  SetOfSelect(pPar
fd80: 73 65 2c 20 70 53 65 6c 65 63 74 29 3b 0a 20 20  se, pSelect);.  
fd90: 20 20 20 20 69 66 28 20 70 53 65 6c 54 61 62 3d      if( pSelTab=
fda0: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20  =0 ) return;.   
fdb0: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 43     assert( p->aC
fdc0: 6f 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70  ol==0 );.      p
fdd0: 2d 3e 6e 43 6f 6c 20 3d 20 70 53 65 6c 54 61 62  ->nCol = pSelTab
fde0: 2d 3e 6e 43 6f 6c 3b 0a 20 20 20 20 20 20 70 2d  ->nCol;.      p-
fdf0: 3e 61 43 6f 6c 20 3d 20 70 53 65 6c 54 61 62 2d  >aCol = pSelTab-
fe00: 3e 61 43 6f 6c 3b 0a 20 20 20 20 20 20 70 53 65  >aCol;.      pSe
fe10: 6c 54 61 62 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a  lTab->nCol = 0;.
fe20: 20 20 20 20 20 20 70 53 65 6c 54 61 62 2d 3e 61        pSelTab->a
fe30: 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 73  Col = 0;.      s
fe40: 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62 6c  qlite3DeleteTabl
fe50: 65 28 64 62 2c 20 70 53 65 6c 54 61 62 29 3b 0a  e(db, pSelTab);.
fe60: 20 20 20 20 20 20 61 64 64 72 49 6e 73 4c 6f 6f        addrInsLoo
fe70: 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  p = sqlite3VdbeA
fe80: 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c  ddOp1(v, OP_Yiel
fe90: 64 2c 20 64 65 73 74 2e 69 53 44 50 61 72 6d 29  d, dest.iSDParm)
fea0: 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65  ;.      VdbeCove
feb0: 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 73  rage(v);.      s
fec0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
fed0: 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72  (v, OP_MakeRecor
fee0: 64 2c 20 64 65 73 74 2e 69 53 64 73 74 2c 20 64  d, dest.iSdst, d
fef0: 65 73 74 2e 6e 53 64 73 74 2c 20 72 65 67 52 65  est.nSdst, regRe
ff00: 63 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  c);.      sqlite
ff10: 33 54 61 62 6c 65 41 66 66 69 6e 69 74 79 28 76  3TableAffinity(v
ff20: 2c 20 70 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  , p, 0);.      s
ff30: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
ff40: 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77 69 64 2c  (v, OP_NewRowid,
ff50: 20 31 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a 20   1, regRowid);. 
ff60: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
ff70: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 73  AddOp3(v, OP_Ins
ff80: 65 72 74 2c 20 31 2c 20 72 65 67 52 65 63 2c 20  ert, 1, regRec, 
ff90: 72 65 67 52 6f 77 69 64 29 3b 0a 20 20 20 20 20  regRowid);.     
ffa0: 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f   sqlite3VdbeGoto
ffb0: 28 76 2c 20 61 64 64 72 49 6e 73 4c 6f 6f 70 29  (v, addrInsLoop)
ffc0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
ffd0: 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61  dbeJumpHere(v, a
ffe0: 64 64 72 49 6e 73 4c 6f 6f 70 29 3b 0a 20 20 20  ddrInsLoop);.   
fff0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
10000 64 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65  dOp1(v, OP_Close
10010 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  , 1);.    }..   
10020 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20   /* Compute the 
10030 63 6f 6d 70 6c 65 74 65 20 74 65 78 74 20 6f 66  complete text of
10040 20 74 68 65 20 43 52 45 41 54 45 20 73 74 61 74   the CREATE stat
10050 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 69 66 28  ement */.    if(
10060 20 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20   pSelect ){.    
10070 20 20 7a 53 74 6d 74 20 3d 20 63 72 65 61 74 65    zStmt = create
10080 54 61 62 6c 65 53 74 6d 74 28 64 62 2c 20 70 29  TableStmt(db, p)
10090 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
100a0 20 20 20 54 6f 6b 65 6e 20 2a 70 45 6e 64 32 20     Token *pEnd2 
100b0 3d 20 74 61 62 4f 70 74 73 20 3f 20 26 70 50 61  = tabOpts ? &pPa
100c0 72 73 65 2d 3e 73 4c 61 73 74 54 6f 6b 65 6e 20  rse->sLastToken 
100d0 3a 20 70 45 6e 64 3b 0a 20 20 20 20 20 20 6e 20  : pEnd;.      n 
100e0 3d 20 28 69 6e 74 29 28 70 45 6e 64 32 2d 3e 7a  = (int)(pEnd2->z
100f0 20 2d 20 70 50 61 72 73 65 2d 3e 73 4e 61 6d 65   - pParse->sName
10100 54 6f 6b 65 6e 2e 7a 29 3b 0a 20 20 20 20 20 20  Token.z);.      
10110 69 66 28 20 70 45 6e 64 32 2d 3e 7a 5b 30 5d 21  if( pEnd2->z[0]!
10120 3d 27 3b 27 20 29 20 6e 20 2b 3d 20 70 45 6e 64  =';' ) n += pEnd
10130 32 2d 3e 6e 3b 0a 20 20 20 20 20 20 7a 53 74 6d  2->n;.      zStm
10140 74 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e  t = sqlite3MPrin
10150 74 66 28 64 62 2c 20 0a 20 20 20 20 20 20 20 20  tf(db, .        
10160 20 20 22 43 52 45 41 54 45 20 25 73 20 25 2e 2a    "CREATE %s %.*
10170 73 22 2c 20 7a 54 79 70 65 32 2c 20 6e 2c 20 70  s", zType2, n, p
10180 50 61 72 73 65 2d 3e 73 4e 61 6d 65 54 6f 6b 65  Parse->sNameToke
10190 6e 2e 7a 0a 20 20 20 20 20 20 29 3b 0a 20 20 20  n.z.      );.   
101a0 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 20 73 6c 6f   }..    /* A slo
101b0 74 20 66 6f 72 20 74 68 65 20 72 65 63 6f 72 64  t for the record
101c0 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
101d0 6e 20 61 6c 6c 6f 63 61 74 65 64 20 69 6e 20 74  n allocated in t
101e0 68 65 20 0a 20 20 20 20 2a 2a 20 53 51 4c 49 54  he .    ** SQLIT
101f0 45 5f 4d 41 53 54 45 52 20 74 61 62 6c 65 2e 20  E_MASTER table. 
10200 20 57 65 20 6a 75 73 74 20 6e 65 65 64 20 74 6f   We just need to
10210 20 75 70 64 61 74 65 20 74 68 61 74 20 73 6c 6f   update that slo
10220 74 20 77 69 74 68 20 61 6c 6c 0a 20 20 20 20 2a  t with all.    *
10230 2a 20 74 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f  * the informatio
10240 6e 20 77 65 27 76 65 20 63 6f 6c 6c 65 63 74 65  n we've collecte
10250 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71  d..    */.    sq
10260 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72 73 65  lite3NestedParse
10270 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 22  (pParse,.      "
10280 55 50 44 41 54 45 20 25 51 2e 25 73 20 22 0a 20  UPDATE %Q.%s ". 
10290 20 20 20 20 20 20 20 20 22 53 45 54 20 74 79 70          "SET typ
102a0 65 3d 27 25 73 27 2c 20 6e 61 6d 65 3d 25 51 2c  e='%s', name=%Q,
102b0 20 74 62 6c 5f 6e 61 6d 65 3d 25 51 2c 20 72 6f   tbl_name=%Q, ro
102c0 6f 74 70 61 67 65 3d 23 25 64 2c 20 73 71 6c 3d  otpage=#%d, sql=
102d0 25 51 20 22 0a 20 20 20 20 20 20 20 22 57 48 45  %Q ".       "WHE
102e0 52 45 20 72 6f 77 69 64 3d 23 25 64 22 2c 0a 20  RE rowid=#%d",. 
102f0 20 20 20 20 20 64 62 2d 3e 61 44 62 5b 69 44 62       db->aDb[iDb
10300 5d 2e 7a 4e 61 6d 65 2c 20 53 43 48 45 4d 41 5f  ].zName, SCHEMA_
10310 54 41 42 4c 45 28 69 44 62 29 2c 0a 20 20 20 20  TABLE(iDb),.    
10320 20 20 7a 54 79 70 65 2c 0a 20 20 20 20 20 20 70    zType,.      p
10330 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 70  ->zName,.      p
10340 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 70  ->zName,.      p
10350 50 61 72 73 65 2d 3e 72 65 67 52 6f 6f 74 2c 0a  Parse->regRoot,.
10360 20 20 20 20 20 20 7a 53 74 6d 74 2c 0a 20 20 20        zStmt,.   
10370 20 20 20 70 50 61 72 73 65 2d 3e 72 65 67 52 6f     pParse->regRo
10380 77 69 64 0a 20 20 20 20 29 3b 0a 20 20 20 20 73  wid.    );.    s
10390 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
103a0 20 7a 53 74 6d 74 29 3b 0a 20 20 20 20 73 71 6c   zStmt);.    sql
103b0 69 74 65 33 43 68 61 6e 67 65 43 6f 6f 6b 69 65  ite3ChangeCookie
103c0 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 0a  (pParse, iDb);..
103d0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
103e0 4d 49 54 5f 41 55 54 4f 49 4e 43 52 45 4d 45 4e  MIT_AUTOINCREMEN
103f0 54 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74  T.    /* Check t
10400 6f 20 73 65 65 20 69 66 20 77 65 20 6e 65 65 64  o see if we need
10410 20 74 6f 20 63 72 65 61 74 65 20 61 6e 20 73 71   to create an sq
10420 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 20 74 61  lite_sequence ta
10430 62 6c 65 20 66 6f 72 0a 20 20 20 20 2a 2a 20 6b  ble for.    ** k
10440 65 65 70 69 6e 67 20 74 72 61 63 6b 20 6f 66 20  eeping track of 
10450 61 75 74 6f 69 6e 63 72 65 6d 65 6e 74 20 6b 65  autoincrement ke
10460 79 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ys..    */.    i
10470 66 28 20 70 2d 3e 74 61 62 46 6c 61 67 73 20 26  f( p->tabFlags &
10480 20 54 46 5f 41 75 74 6f 69 6e 63 72 65 6d 65 6e   TF_Autoincremen
10490 74 20 29 7b 0a 20 20 20 20 20 20 44 62 20 2a 70  t ){.      Db *p
104a0 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 44  Db = &db->aDb[iD
104b0 62 5d 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  b];.      assert
104c0 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d  ( sqlite3SchemaM
104d0 75 74 65 78 48 65 6c 64 28 64 62 2c 20 69 44 62  utexHeld(db, iDb
104e0 2c 20 30 29 20 29 3b 0a 20 20 20 20 20 20 69 66  , 0) );.      if
104f0 28 20 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e  ( pDb->pSchema->
10500 70 53 65 71 54 61 62 3d 3d 30 20 29 7b 0a 20 20  pSeqTab==0 ){.  
10510 20 20 20 20 20 20 73 71 6c 69 74 65 33 4e 65 73        sqlite3Nes
10520 74 65 64 50 61 72 73 65 28 70 50 61 72 73 65 2c  tedParse(pParse,
10530 0a 20 20 20 20 20 20 20 20 20 20 22 43 52 45 41  .          "CREA
10540 54 45 20 54 41 42 4c 45 20 25 51 2e 73 71 6c 69  TE TABLE %Q.sqli
10550 74 65 5f 73 65 71 75 65 6e 63 65 28 6e 61 6d 65  te_sequence(name
10560 2c 73 65 71 29 22 2c 0a 20 20 20 20 20 20 20 20  ,seq)",.        
10570 20 20 70 44 62 2d 3e 7a 4e 61 6d 65 0a 20 20 20    pDb->zName.   
10580 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 7d 0a       );.      }.
10590 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20      }.#endif..  
105a0 20 20 2f 2a 20 52 65 70 61 72 73 65 20 65 76 65    /* Reparse eve
105b0 72 79 74 68 69 6e 67 20 74 6f 20 75 70 64 61 74  rything to updat
105c0 65 20 6f 75 72 20 69 6e 74 65 72 6e 61 6c 20 64  e our internal d
105d0 61 74 61 20 73 74 72 75 63 74 75 72 65 73 20 2a  ata structures *
105e0 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  /.    sqlite3Vdb
105f0 65 41 64 64 50 61 72 73 65 53 63 68 65 6d 61 4f  eAddParseSchemaO
10600 70 28 76 2c 20 69 44 62 2c 0a 20 20 20 20 20 20  p(v, iDb,.      
10610 20 20 20 20 20 73 71 6c 69 74 65 33 4d 50 72 69       sqlite3MPri
10620 6e 74 66 28 64 62 2c 20 22 74 62 6c 5f 6e 61 6d  ntf(db, "tbl_nam
10630 65 3d 27 25 71 27 20 41 4e 44 20 74 79 70 65 21  e='%q' AND type!
10640 3d 27 74 72 69 67 67 65 72 27 22 2c 20 70 2d 3e  ='trigger'", p->
10650 7a 4e 61 6d 65 29 29 3b 0a 20 20 7d 0a 0a 0a 20  zName));.  }... 
10660 20 2f 2a 20 41 64 64 20 74 68 65 20 74 61 62 6c   /* Add the tabl
10670 65 20 74 6f 20 74 68 65 20 69 6e 2d 6d 65 6d 6f  e to the in-memo
10680 72 79 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f  ry representatio
10690 6e 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  n of the databas
106a0 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62  e..  */.  if( db
106b0 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20  ->init.busy ){. 
106c0 20 20 20 54 61 62 6c 65 20 2a 70 4f 6c 64 3b 0a     Table *pOld;.
106d0 20 20 20 20 53 63 68 65 6d 61 20 2a 70 53 63 68      Schema *pSch
106e0 65 6d 61 20 3d 20 70 2d 3e 70 53 63 68 65 6d 61  ema = p->pSchema
106f0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71  ;.    assert( sq
10700 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78  lite3SchemaMutex
10710 48 65 6c 64 28 64 62 2c 20 69 44 62 2c 20 30 29  Held(db, iDb, 0)
10720 20 29 3b 0a 20 20 20 20 70 4f 6c 64 20 3d 20 73   );.    pOld = s
10730 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72 74  qlite3HashInsert
10740 28 26 70 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61  (&pSchema->tblHa
10750 73 68 2c 20 70 2d 3e 7a 4e 61 6d 65 2c 20 70 29  sh, p->zName, p)
10760 3b 0a 20 20 20 20 69 66 28 20 70 4f 6c 64 20 29  ;.    if( pOld )
10770 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
10780 70 3d 3d 70 4f 6c 64 20 29 3b 20 20 2f 2a 20 4d  p==pOld );  /* M
10790 61 6c 6c 6f 63 20 6d 75 73 74 20 68 61 76 65 20  alloc must have 
107a0 66 61 69 6c 65 64 20 69 6e 73 69 64 65 20 48 61  failed inside Ha
107b0 73 68 49 6e 73 65 72 74 28 29 20 2a 2f 0a 20 20  shInsert() */.  
107c0 20 20 20 20 73 71 6c 69 74 65 33 4f 6f 6d 46 61      sqlite3OomFa
107d0 75 6c 74 28 64 62 29 3b 0a 20 20 20 20 20 20 72  ult(db);.      r
107e0 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20  eturn;.    }.   
107f0 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
10800 6c 65 20 3d 20 30 3b 0a 20 20 20 20 64 62 2d 3e  le = 0;.    db->
10810 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f  flags |= SQLITE_
10820 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a 0a  InternChanges;..
10830 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
10840 4d 49 54 5f 41 4c 54 45 52 54 41 42 4c 45 0a 20  MIT_ALTERTABLE. 
10850 20 20 20 69 66 28 20 21 70 2d 3e 70 53 65 6c 65     if( !p->pSele
10860 63 74 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73  ct ){.      cons
10870 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20  t char *zName = 
10880 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 70 50  (const char *)pP
10890 61 72 73 65 2d 3e 73 4e 61 6d 65 54 6f 6b 65 6e  arse->sNameToken
108a0 2e 7a 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4e  .z;.      int nN
108b0 61 6d 65 3b 0a 20 20 20 20 20 20 61 73 73 65 72  ame;.      asser
108c0 74 28 20 21 70 53 65 6c 65 63 74 20 26 26 20 70  t( !pSelect && p
108d0 43 6f 6e 73 20 26 26 20 70 45 6e 64 20 29 3b 0a  Cons && pEnd );.
108e0 20 20 20 20 20 20 69 66 28 20 70 43 6f 6e 73 2d        if( pCons-
108f0 3e 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  >z==0 ){.       
10900 20 70 43 6f 6e 73 20 3d 20 70 45 6e 64 3b 0a 20   pCons = pEnd;. 
10910 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6e 4e 61       }.      nNa
10920 6d 65 20 3d 20 28 69 6e 74 29 28 28 63 6f 6e 73  me = (int)((cons
10930 74 20 63 68 61 72 20 2a 29 70 43 6f 6e 73 2d 3e  t char *)pCons->
10940 7a 20 2d 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  z - zName);.    
10950 20 20 70 2d 3e 61 64 64 43 6f 6c 4f 66 66 73 65    p->addColOffse
10960 74 20 3d 20 31 33 20 2b 20 73 71 6c 69 74 65 33  t = 13 + sqlite3
10970 55 74 66 38 43 68 61 72 4c 65 6e 28 7a 4e 61 6d  Utf8CharLen(zNam
10980 65 2c 20 6e 4e 61 6d 65 29 3b 0a 20 20 20 20 7d  e, nName);.    }
10990 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 7d 0a 0a 23  .#endif.  }.}..#
109a0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
109b0 49 54 5f 56 49 45 57 0a 2f 2a 0a 2a 2a 20 54 68  IT_VIEW./*.** Th
109c0 65 20 70 61 72 73 65 72 20 63 61 6c 6c 73 20 74  e parser calls t
109d0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 6e 20 6f  his routine in o
109e0 72 64 65 72 20 74 6f 20 63 72 65 61 74 65 20 61  rder to create a
109f0 20 6e 65 77 20 56 49 45 57 0a 2a 2f 0a 76 6f 69   new VIEW.*/.voi
10a00 64 20 73 71 6c 69 74 65 33 43 72 65 61 74 65 56  d sqlite3CreateV
10a10 69 65 77 28 0a 20 20 50 61 72 73 65 20 2a 70 50  iew(.  Parse *pP
10a20 61 72 73 65 2c 20 20 20 20 20 2f 2a 20 54 68 65  arse,     /* The
10a30 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   parsing context
10a40 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 42 65   */.  Token *pBe
10a50 67 69 6e 2c 20 20 20 20 20 2f 2a 20 54 68 65 20  gin,     /* The 
10a60 43 52 45 41 54 45 20 74 6f 6b 65 6e 20 74 68 61  CREATE token tha
10a70 74 20 62 65 67 69 6e 73 20 74 68 65 20 73 74 61  t begins the sta
10a80 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 54 6f 6b 65  tement */.  Toke
10a90 6e 20 2a 70 4e 61 6d 65 31 2c 20 20 20 20 20 2f  n *pName1,     /
10aa0 2a 20 54 68 65 20 74 6f 6b 65 6e 20 74 68 61 74  * The token that
10ab0 20 68 6f 6c 64 73 20 74 68 65 20 6e 61 6d 65 20   holds the name 
10ac0 6f 66 20 74 68 65 20 76 69 65 77 20 2a 2f 0a 20  of the view */. 
10ad0 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32 2c 20   Token *pName2, 
10ae0 20 20 20 20 2f 2a 20 54 68 65 20 74 6f 6b 65 6e      /* The token
10af0 20 74 68 61 74 20 68 6f 6c 64 73 20 74 68 65 20   that holds the 
10b00 6e 61 6d 65 20 6f 66 20 74 68 65 20 76 69 65 77  name of the view
10b10 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
10b20 70 43 4e 61 6d 65 73 2c 20 2f 2a 20 4f 70 74 69  pCNames, /* Opti
10b30 6f 6e 61 6c 20 6c 69 73 74 20 6f 66 20 76 69 65  onal list of vie
10b40 77 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 2a  w column names *
10b50 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c  /.  Select *pSel
10b60 65 63 74 2c 20 20 20 2f 2a 20 41 20 53 45 4c 45  ect,   /* A SELE
10b70 43 54 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61  CT statement tha
10b80 74 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68  t will become th
10b90 65 20 6e 65 77 20 76 69 65 77 20 2a 2f 0a 20 20  e new view */.  
10ba0 69 6e 74 20 69 73 54 65 6d 70 2c 20 20 20 20 20  int isTemp,     
10bb0 20 20 20 2f 2a 20 54 52 55 45 20 66 6f 72 20 61     /* TRUE for a
10bc0 20 54 45 4d 50 4f 52 41 52 59 20 76 69 65 77 20   TEMPORARY view 
10bd0 2a 2f 0a 20 20 69 6e 74 20 6e 6f 45 72 72 20 20  */.  int noErr  
10be0 20 20 20 20 20 20 20 20 2f 2a 20 53 75 70 70 72          /* Suppr
10bf0 65 73 73 20 65 72 72 6f 72 20 6d 65 73 73 61 67  ess error messag
10c00 65 73 20 69 66 20 56 49 45 57 20 61 6c 72 65 61  es if VIEW alrea
10c10 64 79 20 65 78 69 73 74 73 20 2a 2f 0a 29 7b 0a  dy exists */.){.
10c20 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 69 6e    Table *p;.  in
10c30 74 20 6e 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  t n;.  const cha
10c40 72 20 2a 7a 3b 0a 20 20 54 6f 6b 65 6e 20 73 45  r *z;.  Token sE
10c50 6e 64 3b 0a 20 20 44 62 46 69 78 65 72 20 73 46  nd;.  DbFixer sF
10c60 69 78 3b 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61  ix;.  Token *pNa
10c70 6d 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 44  me = 0;.  int iD
10c80 62 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  b;.  sqlite3 *db
10c90 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a   = pParse->db;..
10ca0 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 56    if( pParse->nV
10cb0 61 72 3e 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  ar>0 ){.    sqli
10cc0 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
10cd0 73 65 2c 20 22 70 61 72 61 6d 65 74 65 72 73 20  se, "parameters 
10ce0 61 72 65 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 20  are not allowed 
10cf0 69 6e 20 76 69 65 77 73 22 29 3b 0a 20 20 20 20  in views");.    
10d00 67 6f 74 6f 20 63 72 65 61 74 65 5f 76 69 65 77  goto create_view
10d10 5f 66 61 69 6c 3b 0a 20 20 7d 0a 20 20 73 71 6c  _fail;.  }.  sql
10d20 69 74 65 33 53 74 61 72 74 54 61 62 6c 65 28 70  ite3StartTable(p
10d30 50 61 72 73 65 2c 20 70 4e 61 6d 65 31 2c 20 70  Parse, pName1, p
10d40 4e 61 6d 65 32 2c 20 69 73 54 65 6d 70 2c 20 31  Name2, isTemp, 1
10d50 2c 20 30 2c 20 6e 6f 45 72 72 29 3b 0a 20 20 70  , 0, noErr);.  p
10d60 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54   = pParse->pNewT
10d70 61 62 6c 65 3b 0a 20 20 69 66 28 20 70 3d 3d 30  able;.  if( p==0
10d80 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72   || pParse->nErr
10d90 20 29 20 67 6f 74 6f 20 63 72 65 61 74 65 5f 76   ) goto create_v
10da0 69 65 77 5f 66 61 69 6c 3b 0a 20 20 73 71 6c 69  iew_fail;.  sqli
10db0 74 65 33 54 77 6f 50 61 72 74 4e 61 6d 65 28 70  te3TwoPartName(p
10dc0 50 61 72 73 65 2c 20 70 4e 61 6d 65 31 2c 20 70  Parse, pName1, p
10dd0 4e 61 6d 65 32 2c 20 26 70 4e 61 6d 65 29 3b 0a  Name2, &pName);.
10de0 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53    iDb = sqlite3S
10df0 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c  chemaToIndex(db,
10e00 20 70 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20   p->pSchema);.  
10e10 73 71 6c 69 74 65 33 46 69 78 49 6e 69 74 28 26  sqlite3FixInit(&
10e20 73 46 69 78 2c 20 70 50 61 72 73 65 2c 20 69 44  sFix, pParse, iD
10e30 62 2c 20 22 76 69 65 77 22 2c 20 70 4e 61 6d 65  b, "view", pName
10e40 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  );.  if( sqlite3
10e50 46 69 78 53 65 6c 65 63 74 28 26 73 46 69 78 2c  FixSelect(&sFix,
10e60 20 70 53 65 6c 65 63 74 29 20 29 20 67 6f 74 6f   pSelect) ) goto
10e70 20 63 72 65 61 74 65 5f 76 69 65 77 5f 66 61 69   create_view_fai
10e80 6c 3b 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 61 20  l;..  /* Make a 
10e90 63 6f 70 79 20 6f 66 20 74 68 65 20 65 6e 74 69  copy of the enti
10ea0 72 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  re SELECT statem
10eb0 65 6e 74 20 74 68 61 74 20 64 65 66 69 6e 65 73  ent that defines
10ec0 20 74 68 65 20 76 69 65 77 2e 0a 20 20 2a 2a 20   the view..  ** 
10ed0 54 68 69 73 20 77 69 6c 6c 20 66 6f 72 63 65 20  This will force 
10ee0 61 6c 6c 20 74 68 65 20 45 78 70 72 2e 74 6f 6b  all the Expr.tok
10ef0 65 6e 2e 7a 20 76 61 6c 75 65 73 20 74 6f 20 62  en.z values to b
10f00 65 20 64 79 6e 61 6d 69 63 61 6c 6c 79 0a 20 20  e dynamically.  
10f10 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 72 61 74  ** allocated rat
10f20 68 65 72 20 74 68 61 6e 20 70 6f 69 6e 74 20 74  her than point t
10f30 6f 20 74 68 65 20 69 6e 70 75 74 20 73 74 72 69  o the input stri
10f40 6e 67 20 2d 20 77 68 69 63 68 20 6d 65 61 6e 73  ng - which means
10f50 20 74 68 61 74 0a 20 20 2a 2a 20 74 68 65 79 20   that.  ** they 
10f60 77 69 6c 6c 20 70 65 72 73 69 73 74 20 61 66 74  will persist aft
10f70 65 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 73  er the current s
10f80 71 6c 69 74 65 33 5f 65 78 65 63 28 29 20 63 61  qlite3_exec() ca
10f90 6c 6c 20 72 65 74 75 72 6e 73 2e 0a 20 20 2a 2f  ll returns..  */
10fa0 0a 20 20 70 2d 3e 70 53 65 6c 65 63 74 20 3d 20  .  p->pSelect = 
10fb0 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70  sqlite3SelectDup
10fc0 28 64 62 2c 20 70 53 65 6c 65 63 74 2c 20 45 58  (db, pSelect, EX
10fd0 50 52 44 55 50 5f 52 45 44 55 43 45 29 3b 0a 20  PRDUP_REDUCE);. 
10fe0 20 70 2d 3e 70 43 68 65 63 6b 20 3d 20 73 71 6c   p->pCheck = sql
10ff0 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28  ite3ExprListDup(
11000 64 62 2c 20 70 43 4e 61 6d 65 73 2c 20 45 58 50  db, pCNames, EXP
11010 52 44 55 50 5f 52 45 44 55 43 45 29 3b 0a 20 20  RDUP_REDUCE);.  
11020 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
11030 69 6c 65 64 20 29 20 67 6f 74 6f 20 63 72 65 61  iled ) goto crea
11040 74 65 5f 76 69 65 77 5f 66 61 69 6c 3b 0a 0a 20  te_view_fail;.. 
11050 20 2f 2a 20 4c 6f 63 61 74 65 20 74 68 65 20 65   /* Locate the e
11060 6e 64 20 6f 66 20 74 68 65 20 43 52 45 41 54 45  nd of the CREATE
11070 20 56 49 45 57 20 73 74 61 74 65 6d 65 6e 74 2e   VIEW statement.
11080 20 20 4d 61 6b 65 20 73 45 6e 64 20 70 6f 69 6e    Make sEnd poin
11090 74 20 74 6f 0a 20 20 2a 2a 20 74 68 65 20 65 6e  t to.  ** the en
110a0 64 2e 0a 20 20 2a 2f 0a 20 20 73 45 6e 64 20 3d  d..  */.  sEnd =
110b0 20 70 50 61 72 73 65 2d 3e 73 4c 61 73 74 54 6f   pParse->sLastTo
110c0 6b 65 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ken;.  assert( s
110d0 45 6e 64 2e 7a 5b 30 5d 21 3d 30 20 29 3b 0a 20  End.z[0]!=0 );. 
110e0 20 69 66 28 20 73 45 6e 64 2e 7a 5b 30 5d 21 3d   if( sEnd.z[0]!=
110f0 27 3b 27 20 29 7b 0a 20 20 20 20 73 45 6e 64 2e  ';' ){.    sEnd.
11100 7a 20 2b 3d 20 73 45 6e 64 2e 6e 3b 0a 20 20 7d  z += sEnd.n;.  }
11110 0a 20 20 73 45 6e 64 2e 6e 20 3d 20 30 3b 0a 20  .  sEnd.n = 0;. 
11120 20 6e 20 3d 20 28 69 6e 74 29 28 73 45 6e 64 2e   n = (int)(sEnd.
11130 7a 20 2d 20 70 42 65 67 69 6e 2d 3e 7a 29 3b 0a  z - pBegin->z);.
11140 20 20 61 73 73 65 72 74 28 20 6e 3e 30 20 29 3b    assert( n>0 );
11150 0a 20 20 7a 20 3d 20 70 42 65 67 69 6e 2d 3e 7a  .  z = pBegin->z
11160 3b 0a 20 20 77 68 69 6c 65 28 20 73 71 6c 69 74  ;.  while( sqlit
11170 65 33 49 73 73 70 61 63 65 28 7a 5b 6e 2d 31 5d  e3Isspace(z[n-1]
11180 29 20 29 7b 20 6e 2d 2d 3b 20 7d 0a 20 20 73 45  ) ){ n--; }.  sE
11190 6e 64 2e 7a 20 3d 20 26 7a 5b 6e 2d 31 5d 3b 0a  nd.z = &z[n-1];.
111a0 20 20 73 45 6e 64 2e 6e 20 3d 20 31 3b 0a 0a 20    sEnd.n = 1;.. 
111b0 20 2f 2a 20 55 73 65 20 73 71 6c 69 74 65 33 45   /* Use sqlite3E
111c0 6e 64 54 61 62 6c 65 28 29 20 74 6f 20 61 64 64  ndTable() to add
111d0 20 74 68 65 20 76 69 65 77 20 74 6f 20 74 68 65   the view to the
111e0 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52 20 74   SQLITE_MASTER t
111f0 61 62 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65  able */.  sqlite
11200 33 45 6e 64 54 61 62 6c 65 28 70 50 61 72 73 65  3EndTable(pParse
11210 2c 20 30 2c 20 26 73 45 6e 64 2c 20 30 2c 20 30  , 0, &sEnd, 0, 0
11220 29 3b 0a 0a 63 72 65 61 74 65 5f 76 69 65 77 5f  );..create_view_
11230 66 61 69 6c 3a 0a 20 20 73 71 6c 69 74 65 33 53  fail:.  sqlite3S
11240 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20  electDelete(db, 
11250 70 53 65 6c 65 63 74 29 3b 0a 20 20 73 71 6c 69  pSelect);.  sqli
11260 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
11270 65 28 64 62 2c 20 70 43 4e 61 6d 65 73 29 3b 0a  e(db, pCNames);.
11280 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 23 65 6e 64    return;.}.#end
11290 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
112a0 54 5f 56 49 45 57 20 2a 2f 0a 0a 23 69 66 20 21  T_VIEW */..#if !
112b0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
112c0 4d 49 54 5f 56 49 45 57 29 20 7c 7c 20 21 64 65  MIT_VIEW) || !de
112d0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
112e0 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 0a  T_VIRTUALTABLE).
112f0 2f 2a 0a 2a 2a 20 54 68 65 20 54 61 62 6c 65 20  /*.** The Table 
11300 73 74 72 75 63 74 75 72 65 20 70 54 61 62 6c 65  structure pTable
11310 20 69 73 20 72 65 61 6c 6c 79 20 61 20 56 49 45   is really a VIE
11320 57 2e 20 20 46 69 6c 6c 20 69 6e 20 74 68 65 20  W.  Fill in the 
11330 6e 61 6d 65 73 20 6f 66 0a 2a 2a 20 74 68 65 20  names of.** the 
11340 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 76  columns of the v
11350 69 65 77 20 69 6e 20 74 68 65 20 70 54 61 62 6c  iew in the pTabl
11360 65 20 73 74 72 75 63 74 75 72 65 2e 20 20 52 65  e structure.  Re
11370 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 0a  turn the number.
11380 2a 2a 20 6f 66 20 65 72 72 6f 72 73 2e 20 20 49  ** of errors.  I
11390 66 20 61 6e 20 65 72 72 6f 72 20 69 73 20 73 65  f an error is se
113a0 65 6e 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f  en leave an erro
113b0 72 20 6d 65 73 73 61 67 65 20 69 6e 20 70 50 61  r message in pPa
113c0 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2e 0a 2a 2f  rse->zErrMsg..*/
113d0 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 69 65 77  .int sqlite3View
113e0 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 50  GetColumnNames(P
113f0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 61  arse *pParse, Ta
11400 62 6c 65 20 2a 70 54 61 62 6c 65 29 7b 0a 20 20  ble *pTable){.  
11410 54 61 62 6c 65 20 2a 70 53 65 6c 54 61 62 3b 20  Table *pSelTab; 
11420 20 20 2f 2a 20 41 20 66 61 6b 65 20 74 61 62 6c    /* A fake tabl
11430 65 20 66 72 6f 6d 20 77 68 69 63 68 20 77 65 20  e from which we 
11440 67 65 74 20 74 68 65 20 72 65 73 75 6c 74 20 73  get the result s
11450 65 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  et */.  Select *
11460 70 53 65 6c 3b 20 20 20 20 20 2f 2a 20 43 6f 70  pSel;     /* Cop
11470 79 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20  y of the SELECT 
11480 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20  that implements 
11490 74 68 65 20 76 69 65 77 20 2a 2f 0a 20 20 69 6e  the view */.  in
114a0 74 20 6e 45 72 72 20 3d 20 30 3b 20 20 20 20 20  t nErr = 0;     
114b0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 72 72  /* Number of err
114c0 6f 72 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 20  ors encountered 
114d0 2a 2f 0a 20 20 69 6e 74 20 6e 3b 20 20 20 20 20  */.  int n;     
114e0 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 6f 72         /* Tempor
114f0 61 72 69 6c 79 20 68 6f 6c 64 73 20 74 68 65 20  arily holds the 
11500 6e 75 6d 62 65 72 20 6f 66 20 63 75 72 73 6f 72  number of cursor
11510 73 20 61 73 73 69 67 6e 65 64 20 2a 2f 0a 20 20  s assigned */.  
11520 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
11530 61 72 73 65 2d 3e 64 62 3b 20 20 2f 2a 20 44 61  arse->db;  /* Da
11540 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
11550 6e 20 66 6f 72 20 6d 61 6c 6c 6f 63 20 65 72 72  n for malloc err
11560 6f 72 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ors */.  sqlite3
11570 5f 78 61 75 74 68 20 78 41 75 74 68 3b 20 20 20  _xauth xAuth;   
11580 20 20 20 20 2f 2a 20 53 61 76 65 64 20 78 41 75      /* Saved xAu
11590 74 68 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 0a 20  th pointer */.. 
115a0 20 61 73 73 65 72 74 28 20 70 54 61 62 6c 65 20   assert( pTable 
115b0 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  );..#ifndef SQLI
115c0 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
115d0 41 42 4c 45 0a 20 20 69 66 28 20 73 71 6c 69 74  ABLE.  if( sqlit
115e0 65 33 56 74 61 62 43 61 6c 6c 43 6f 6e 6e 65 63  e3VtabCallConnec
115f0 74 28 70 50 61 72 73 65 2c 20 70 54 61 62 6c 65  t(pParse, pTable
11600 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
11610 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
11620 7d 0a 20 20 69 66 28 20 49 73 56 69 72 74 75 61  }.  if( IsVirtua
11630 6c 28 70 54 61 62 6c 65 29 20 29 20 72 65 74 75  l(pTable) ) retu
11640 72 6e 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 23 69  rn 0;.#endif..#i
11650 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
11660 54 5f 56 49 45 57 0a 20 20 2f 2a 20 41 20 70 6f  T_VIEW.  /* A po
11670 73 69 74 69 76 65 20 6e 43 6f 6c 20 6d 65 61 6e  sitive nCol mean
11680 73 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 6e 61  s the columns na
11690 6d 65 73 20 66 6f 72 20 74 68 69 73 20 76 69 65  mes for this vie
116a0 77 20 61 72 65 0a 20 20 2a 2a 20 61 6c 72 65 61  w are.  ** alrea
116b0 64 79 20 6b 6e 6f 77 6e 2e 0a 20 20 2a 2f 0a 20  dy known..  */. 
116c0 20 69 66 28 20 70 54 61 62 6c 65 2d 3e 6e 43 6f   if( pTable->nCo
116d0 6c 3e 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  l>0 ) return 0;.
116e0 0a 20 20 2f 2a 20 41 20 6e 65 67 61 74 69 76 65  .  /* A negative
116f0 20 6e 43 6f 6c 20 69 73 20 61 20 73 70 65 63 69   nCol is a speci
11700 61 6c 20 6d 61 72 6b 65 72 20 6d 65 61 6e 69 6e  al marker meanin
11710 67 20 74 68 61 74 20 77 65 20 61 72 65 20 63 75  g that we are cu
11720 72 72 65 6e 74 6c 79 0a 20 20 2a 2a 20 74 72 79  rrently.  ** try
11730 69 6e 67 20 74 6f 20 63 6f 6d 70 75 74 65 20 74  ing to compute t
11740 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 2e  he column names.
11750 20 20 49 66 20 77 65 20 65 6e 74 65 72 20 74 68    If we enter th
11760 69 73 20 72 6f 75 74 69 6e 65 20 77 69 74 68 0a  is routine with.
11770 20 20 2a 2a 20 61 20 6e 65 67 61 74 69 76 65 20    ** a negative 
11780 6e 43 6f 6c 2c 20 69 74 20 6d 65 61 6e 73 20 74  nCol, it means t
11790 77 6f 20 6f 72 20 6d 6f 72 65 20 76 69 65 77 73  wo or more views
117a0 20 66 6f 72 6d 20 61 20 6c 6f 6f 70 2c 20 6c 69   form a loop, li
117b0 6b 65 20 74 68 69 73 3a 0a 20 20 2a 2a 0a 20 20  ke this:.  **.  
117c0 2a 2a 20 20 20 20 20 43 52 45 41 54 45 20 56 49  **     CREATE VI
117d0 45 57 20 6f 6e 65 20 41 53 20 53 45 4c 45 43 54  EW one AS SELECT
117e0 20 2a 20 46 52 4f 4d 20 74 77 6f 3b 0a 20 20 2a   * FROM two;.  *
117f0 2a 20 20 20 20 20 43 52 45 41 54 45 20 56 49 45  *     CREATE VIE
11800 57 20 74 77 6f 20 41 53 20 53 45 4c 45 43 54 20  W two AS SELECT 
11810 2a 20 46 52 4f 4d 20 6f 6e 65 3b 0a 20 20 2a 2a  * FROM one;.  **
11820 0a 20 20 2a 2a 20 41 63 74 75 61 6c 6c 79 2c 20  .  ** Actually, 
11830 74 68 65 20 65 72 72 6f 72 20 61 62 6f 76 65 20  the error above 
11840 69 73 20 6e 6f 77 20 63 61 75 67 68 74 20 70 72  is now caught pr
11850 69 6f 72 20 74 6f 20 72 65 61 63 68 69 6e 67 20  ior to reaching 
11860 74 68 69 73 20 70 6f 69 6e 74 2e 0a 20 20 2a 2a  this point..  **
11870 20 42 75 74 20 74 68 65 20 66 6f 6c 6c 6f 77 69   But the followi
11880 6e 67 20 74 65 73 74 20 69 73 20 73 74 69 6c 6c  ng test is still
11890 20 69 6d 70 6f 72 74 61 6e 74 20 61 73 20 69 74   important as it
118a0 20 64 6f 65 73 20 63 6f 6d 65 20 75 70 0a 20 20   does come up.  
118b0 2a 2a 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77  ** in the follow
118c0 69 6e 67 3a 0a 20 20 2a 2a 20 0a 20 20 2a 2a 20  ing:.  ** .  ** 
118d0 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
118e0 20 6d 61 69 6e 2e 65 78 31 28 61 29 3b 0a 20 20   main.ex1(a);.  
118f0 2a 2a 20 20 20 20 20 43 52 45 41 54 45 20 54 45  **     CREATE TE
11900 4d 50 20 56 49 45 57 20 65 78 31 20 41 53 20 53  MP VIEW ex1 AS S
11910 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 65 78 31  ELECT a FROM ex1
11920 3b 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43  ;.  **     SELEC
11930 54 20 2a 20 46 52 4f 4d 20 74 65 6d 70 2e 65 78  T * FROM temp.ex
11940 31 3b 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 54  1;.  */.  if( pT
11950 61 62 6c 65 2d 3e 6e 43 6f 6c 3c 30 20 29 7b 0a  able->nCol<0 ){.
11960 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
11970 4d 73 67 28 70 50 61 72 73 65 2c 20 22 76 69 65  Msg(pParse, "vie
11980 77 20 25 73 20 69 73 20 63 69 72 63 75 6c 61 72  w %s is circular
11990 6c 79 20 64 65 66 69 6e 65 64 22 2c 20 70 54 61  ly defined", pTa
119a0 62 6c 65 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  ble->zName);.   
119b0 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20   return 1;.  }. 
119c0 20 61 73 73 65 72 74 28 20 70 54 61 62 6c 65 2d   assert( pTable-
119d0 3e 6e 43 6f 6c 3e 3d 30 20 29 3b 0a 0a 20 20 2f  >nCol>=0 );..  /
119e0 2a 20 49 66 20 77 65 20 67 65 74 20 74 68 69 73  * If we get this
119f0 20 66 61 72 2c 20 69 74 20 6d 65 61 6e 73 20 77   far, it means w
11a00 65 20 6e 65 65 64 20 74 6f 20 63 6f 6d 70 75 74  e need to comput
11a10 65 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65  e the table name
11a20 73 2e 0a 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61  s..  ** Note tha
11a30 74 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 73 71  t the call to sq
11a40 6c 69 74 65 33 52 65 73 75 6c 74 53 65 74 4f 66  lite3ResultSetOf
11a50 53 65 6c 65 63 74 28 29 20 77 69 6c 6c 20 65 78  Select() will ex
11a60 70 61 6e 64 20 61 6e 79 0a 20 20 2a 2a 20 22 2a  pand any.  ** "*
11a70 22 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 74 68  " elements in th
11a80 65 20 72 65 73 75 6c 74 73 20 73 65 74 20 6f 66  e results set of
11a90 20 74 68 65 20 76 69 65 77 20 61 6e 64 20 77 69   the view and wi
11aa0 6c 6c 20 61 73 73 69 67 6e 20 63 75 72 73 6f 72  ll assign cursor
11ab0 73 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 65 6c  s.  ** to the el
11ac0 65 6d 65 6e 74 73 20 6f 66 20 74 68 65 20 46 52  ements of the FR
11ad0 4f 4d 20 63 6c 61 75 73 65 2e 20 20 42 75 74 20  OM clause.  But 
11ae0 77 65 20 64 6f 20 6e 6f 74 20 77 61 6e 74 20 74  we do not want t
11af0 68 65 73 65 20 63 68 61 6e 67 65 73 0a 20 20 2a  hese changes.  *
11b00 2a 20 74 6f 20 62 65 20 70 65 72 6d 61 6e 65 6e  * to be permanen
11b10 74 2e 20 20 53 6f 20 74 68 65 20 63 6f 6d 70 75  t.  So the compu
11b20 74 61 74 69 6f 6e 20 69 73 20 64 6f 6e 65 20 6f  tation is done o
11b30 6e 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20  n a copy of the 
11b40 53 45 4c 45 43 54 0a 20 20 2a 2a 20 73 74 61 74  SELECT.  ** stat
11b50 65 6d 65 6e 74 20 74 68 61 74 20 64 65 66 69 6e  ement that defin
11b60 65 73 20 74 68 65 20 76 69 65 77 2e 0a 20 20 2a  es the view..  *
11b70 2f 0a 20 20 61 73 73 65 72 74 28 20 70 54 61 62  /.  assert( pTab
11b80 6c 65 2d 3e 70 53 65 6c 65 63 74 20 29 3b 0a 20  le->pSelect );. 
11b90 20 69 66 28 20 70 54 61 62 6c 65 2d 3e 70 43 68   if( pTable->pCh
11ba0 65 63 6b 20 29 7b 0a 20 20 20 20 64 62 2d 3e 6c  eck ){.    db->l
11bb0 6f 6f 6b 61 73 69 64 65 2e 62 44 69 73 61 62 6c  ookaside.bDisabl
11bc0 65 2b 2b 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  e++;.    sqlite3
11bd0 43 6f 6c 75 6d 6e 73 46 72 6f 6d 45 78 70 72 4c  ColumnsFromExprL
11be0 69 73 74 28 70 50 61 72 73 65 2c 20 70 54 61 62  ist(pParse, pTab
11bf0 6c 65 2d 3e 70 43 68 65 63 6b 2c 20 0a 20 20 20  le->pCheck, .   
11c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11c10 20 20 20 20 20 20 20 20 20 20 20 20 26 70 54 61              &pTa
11c20 62 6c 65 2d 3e 6e 43 6f 6c 2c 20 26 70 54 61 62  ble->nCol, &pTab
11c30 6c 65 2d 3e 61 43 6f 6c 29 3b 0a 20 20 20 20 64  le->aCol);.    d
11c40 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 44 69  b->lookaside.bDi
11c50 73 61 62 6c 65 2d 2d 3b 0a 20 20 7d 65 6c 73 65  sable--;.  }else
11c60 7b 0a 20 20 20 20 70 53 65 6c 20 3d 20 73 71 6c  {.    pSel = sql
11c70 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 64 62  ite3SelectDup(db
11c80 2c 20 70 54 61 62 6c 65 2d 3e 70 53 65 6c 65 63  , pTable->pSelec
11c90 74 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70  t, 0);.    if( p
11ca0 53 65 6c 20 29 7b 0a 20 20 20 20 20 20 6e 20 3d  Sel ){.      n =
11cb0 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 3b 0a 20   pParse->nTab;. 
11cc0 20 20 20 20 20 73 71 6c 69 74 65 33 53 72 63 4c       sqlite3SrcL
11cd0 69 73 74 41 73 73 69 67 6e 43 75 72 73 6f 72 73  istAssignCursors
11ce0 28 70 50 61 72 73 65 2c 20 70 53 65 6c 2d 3e 70  (pParse, pSel->p
11cf0 53 72 63 29 3b 0a 20 20 20 20 20 20 70 54 61 62  Src);.      pTab
11d00 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 2d 31 3b 0a 20  le->nCol = -1;. 
11d10 20 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69       db->lookasi
11d20 64 65 2e 62 44 69 73 61 62 6c 65 2b 2b 3b 0a 23  de.bDisable++;.#
11d30 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
11d40 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e  IT_AUTHORIZATION
11d50 0a 20 20 20 20 20 20 78 41 75 74 68 20 3d 20 64  .      xAuth = d
11d60 62 2d 3e 78 41 75 74 68 3b 0a 20 20 20 20 20 20  b->xAuth;.      
11d70 64 62 2d 3e 78 41 75 74 68 20 3d 20 30 3b 0a 20  db->xAuth = 0;. 
11d80 20 20 20 20 20 70 53 65 6c 54 61 62 20 3d 20 73       pSelTab = s
11d90 71 6c 69 74 65 33 52 65 73 75 6c 74 53 65 74 4f  qlite3ResultSetO
11da0 66 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  fSelect(pParse, 
11db0 70 53 65 6c 29 3b 0a 20 20 20 20 20 20 64 62 2d  pSel);.      db-
11dc0 3e 78 41 75 74 68 20 3d 20 78 41 75 74 68 3b 0a  >xAuth = xAuth;.
11dd0 23 65 6c 73 65 0a 20 20 20 20 20 20 70 53 65 6c  #else.      pSel
11de0 54 61 62 20 3d 20 73 71 6c 69 74 65 33 52 65 73  Tab = sqlite3Res
11df0 75 6c 74 53 65 74 4f 66 53 65 6c 65 63 74 28 70  ultSetOfSelect(p
11e00 50 61 72 73 65 2c 20 70 53 65 6c 29 3b 0a 23 65  Parse, pSel);.#e
11e10 6e 64 69 66 0a 20 20 20 20 20 20 64 62 2d 3e 6c  ndif.      db->l
11e20 6f 6f 6b 61 73 69 64 65 2e 62 44 69 73 61 62 6c  ookaside.bDisabl
11e30 65 2d 2d 3b 0a 20 20 20 20 20 20 70 50 61 72 73  e--;.      pPars
11e40 65 2d 3e 6e 54 61 62 20 3d 20 6e 3b 0a 20 20 20  e->nTab = n;.   
11e50 20 20 20 69 66 28 20 70 53 65 6c 54 61 62 20 29     if( pSelTab )
11e60 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
11e70 28 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 3d 3d  ( pTable->aCol==
11e80 30 20 29 3b 0a 20 20 20 20 20 20 20 20 70 54 61  0 );.        pTa
11e90 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 70 53 65 6c  ble->nCol = pSel
11ea0 54 61 62 2d 3e 6e 43 6f 6c 3b 0a 20 20 20 20 20  Tab->nCol;.     
11eb0 20 20 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 20     pTable->aCol 
11ec0 3d 20 70 53 65 6c 54 61 62 2d 3e 61 43 6f 6c 3b  = pSelTab->aCol;
11ed0 0a 20 20 20 20 20 20 20 20 70 53 65 6c 54 61 62  .        pSelTab
11ee0 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20  ->nCol = 0;.    
11ef0 20 20 20 20 70 53 65 6c 54 61 62 2d 3e 61 43 6f      pSelTab->aCo
11f00 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 73  l = 0;.        s
11f10 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62 6c  qlite3DeleteTabl
11f20 65 28 64 62 2c 20 70 53 65 6c 54 61 62 29 3b 0a  e(db, pSelTab);.
11f30 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
11f40 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74  sqlite3SchemaMut
11f50 65 78 48 65 6c 64 28 64 62 2c 20 30 2c 20 70 54  exHeld(db, 0, pT
11f60 61 62 6c 65 2d 3e 70 53 63 68 65 6d 61 29 20 29  able->pSchema) )
11f70 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
11f80 20 20 20 20 20 20 20 70 54 61 62 6c 65 2d 3e 6e         pTable->n
11f90 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  Col = 0;.       
11fa0 20 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 7d   nErr++;.      }
11fb0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65  .      sqlite3Se
11fc0 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70  lectDelete(db, p
11fd0 53 65 6c 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65  Sel);.    } else
11fe0 20 7b 0a 20 20 20 20 20 20 6e 45 72 72 2b 2b 3b   {.      nErr++;
11ff0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 54 61  .    }.  }.  pTa
12000 62 6c 65 2d 3e 70 53 63 68 65 6d 61 2d 3e 73 63  ble->pSchema->sc
12010 68 65 6d 61 46 6c 61 67 73 20 7c 3d 20 44 42 5f  hemaFlags |= DB_
12020 55 6e 72 65 73 65 74 56 69 65 77 73 3b 0a 23 65  UnresetViews;.#e
12030 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
12040 4d 49 54 5f 56 49 45 57 20 2a 2f 0a 20 20 72 65  MIT_VIEW */.  re
12050 74 75 72 6e 20 6e 45 72 72 3b 20 20 0a 7d 0a 23  turn nErr;  .}.#
12060 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65  endif /* !define
12070 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  d(SQLITE_OMIT_VI
12080 45 57 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28  EW) || !defined(
12090 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
120a0 55 41 4c 54 41 42 4c 45 29 20 2a 2f 0a 0a 23 69  UALTABLE) */..#i
120b0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
120c0 54 5f 56 49 45 57 0a 2f 2a 0a 2a 2a 20 43 6c 65  T_VIEW./*.** Cle
120d0 61 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61  ar the column na
120e0 6d 65 73 20 66 72 6f 6d 20 65 76 65 72 79 20 56  mes from every V
120f0 49 45 57 20 69 6e 20 64 61 74 61 62 61 73 65 20  IEW in database 
12100 69 64 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  idx..*/.static v
12110 6f 69 64 20 73 71 6c 69 74 65 56 69 65 77 52 65  oid sqliteViewRe
12120 73 65 74 41 6c 6c 28 73 71 6c 69 74 65 33 20 2a  setAll(sqlite3 *
12130 64 62 2c 20 69 6e 74 20 69 64 78 29 7b 0a 20 20  db, int idx){.  
12140 48 61 73 68 45 6c 65 6d 20 2a 69 3b 0a 20 20 61  HashElem *i;.  a
12150 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 53 63  ssert( sqlite3Sc
12160 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62  hemaMutexHeld(db
12170 2c 20 69 64 78 2c 20 30 29 20 29 3b 0a 20 20 69  , idx, 0) );.  i
12180 66 28 20 21 44 62 48 61 73 50 72 6f 70 65 72 74  f( !DbHasPropert
12190 79 28 64 62 2c 20 69 64 78 2c 20 44 42 5f 55 6e  y(db, idx, DB_Un
121a0 72 65 73 65 74 56 69 65 77 73 29 20 29 20 72 65  resetViews) ) re
121b0 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 73 71  turn;.  for(i=sq
121c0 6c 69 74 65 48 61 73 68 46 69 72 73 74 28 26 64  liteHashFirst(&d
121d0 62 2d 3e 61 44 62 5b 69 64 78 5d 2e 70 53 63 68  b->aDb[idx].pSch
121e0 65 6d 61 2d 3e 74 62 6c 48 61 73 68 29 3b 20 69  ema->tblHash); i
121f0 3b 69 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78  ;i=sqliteHashNex
12200 74 28 69 29 29 7b 0a 20 20 20 20 54 61 62 6c 65  t(i)){.    Table
12210 20 2a 70 54 61 62 20 3d 20 73 71 6c 69 74 65 48   *pTab = sqliteH
12220 61 73 68 44 61 74 61 28 69 29 3b 0a 20 20 20 20  ashData(i);.    
12230 69 66 28 20 70 54 61 62 2d 3e 70 53 65 6c 65 63  if( pTab->pSelec
12240 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  t ){.      sqlit
12250 65 33 44 65 6c 65 74 65 43 6f 6c 75 6d 6e 4e 61  e3DeleteColumnNa
12260 6d 65 73 28 64 62 2c 20 70 54 61 62 29 3b 0a 20  mes(db, pTab);. 
12270 20 20 20 20 20 70 54 61 62 2d 3e 61 43 6f 6c 20       pTab->aCol 
12280 3d 20 30 3b 0a 20 20 20 20 20 20 70 54 61 62 2d  = 0;.      pTab-
12290 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 7d  >nCol = 0;.    }
122a0 0a 20 20 7d 0a 20 20 44 62 43 6c 65 61 72 50 72  .  }.  DbClearPr
122b0 6f 70 65 72 74 79 28 64 62 2c 20 69 64 78 2c 20  operty(db, idx, 
122c0 44 42 5f 55 6e 72 65 73 65 74 56 69 65 77 73 29  DB_UnresetViews)
122d0 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69  ;.}.#else.# defi
122e0 6e 65 20 73 71 6c 69 74 65 56 69 65 77 52 65 73  ne sqliteViewRes
122f0 65 74 41 6c 6c 28 41 2c 42 29 0a 23 65 6e 64 69  etAll(A,B).#endi
12300 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
12310 5f 56 49 45 57 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  _VIEW */../*.** 
12320 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
12330 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20 56   called by the V
12340 44 42 45 20 74 6f 20 61 64 6a 75 73 74 20 74 68  DBE to adjust th
12350 65 20 69 6e 74 65 72 6e 61 6c 20 73 63 68 65 6d  e internal schem
12360 61 0a 2a 2a 20 75 73 65 64 20 62 79 20 53 51 4c  a.** used by SQL
12370 69 74 65 20 77 68 65 6e 20 74 68 65 20 62 74 72  ite when the btr
12380 65 65 20 6c 61 79 65 72 20 6d 6f 76 65 73 20 61  ee layer moves a
12390 20 74 61 62 6c 65 20 72 6f 6f 74 20 70 61 67 65   table root page
123a0 2e 20 54 68 65 0a 2a 2a 20 72 6f 6f 74 2d 70 61  . The.** root-pa
123b0 67 65 20 6f 66 20 61 20 74 61 62 6c 65 20 6f 72  ge of a table or
123c0 20 69 6e 64 65 78 20 69 6e 20 64 61 74 61 62 61   index in databa
123d0 73 65 20 69 44 62 20 68 61 73 20 63 68 61 6e 67  se iDb has chang
123e0 65 64 20 66 72 6f 6d 20 69 46 72 6f 6d 0a 2a 2a  ed from iFrom.**
123f0 20 74 6f 20 69 54 6f 2e 0a 2a 2a 0a 2a 2a 20 54   to iTo..**.** T
12400 69 63 6b 65 74 20 23 31 37 32 38 3a 20 20 54 68  icket #1728:  Th
12410 65 20 73 79 6d 62 6f 6c 20 74 61 62 6c 65 20 6d  e symbol table m
12420 69 67 68 74 20 73 74 69 6c 6c 20 63 6f 6e 74 61  ight still conta
12430 69 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 2a  in information.*
12440 2a 20 6f 6e 20 74 61 62 6c 65 73 20 61 6e 64 2f  * on tables and/
12450 6f 72 20 69 6e 64 69 63 65 73 20 74 68 61 74 20  or indices that 
12460 61 72 65 20 74 68 65 20 70 72 6f 63 65 73 73 20  are the process 
12470 6f 66 20 62 65 69 6e 67 20 64 65 6c 65 74 65 64  of being deleted
12480 2e 0a 2a 2a 20 49 66 20 79 6f 75 20 61 72 65 20  ..** If you are 
12490 75 6e 6c 75 63 6b 79 2c 20 6f 6e 65 20 6f 66 20  unlucky, one of 
124a0 74 68 6f 73 65 20 64 65 6c 65 74 65 64 20 69 6e  those deleted in
124b0 64 69 63 65 73 20 6f 72 20 74 61 62 6c 65 73 20  dices or tables 
124c0 6d 69 67 68 74 0a 2a 2a 20 68 61 76 65 20 74 68  might.** have th
124d0 65 20 73 61 6d 65 20 72 6f 6f 74 70 61 67 65 20  e same rootpage 
124e0 6e 75 6d 62 65 72 20 61 73 20 74 68 65 20 72 65  number as the re
124f0 61 6c 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65  al table or inde
12500 78 20 74 68 61 74 20 69 73 0a 2a 2a 20 62 65 69  x that is.** bei
12510 6e 67 20 6d 6f 76 65 64 2e 20 20 53 6f 20 77 65  ng moved.  So we
12520 20 63 61 6e 6e 6f 74 20 73 74 6f 70 20 73 65 61   cannot stop sea
12530 72 63 68 69 6e 67 20 61 66 74 65 72 20 74 68 65  rching after the
12540 20 66 69 72 73 74 20 6d 61 74 63 68 20 0a 2a 2a   first match .**
12550 20 62 65 63 61 75 73 65 20 74 68 65 20 66 69 72   because the fir
12560 73 74 20 6d 61 74 63 68 20 6d 69 67 68 74 20 62  st match might b
12570 65 20 66 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65  e for one of the
12580 20 64 65 6c 65 74 65 64 20 69 6e 64 69 63 65 73   deleted indices
12590 0a 2a 2a 20 6f 72 20 74 61 62 6c 65 73 20 61 6e  .** or tables an
125a0 64 20 6e 6f 74 20 74 68 65 20 74 61 62 6c 65 2f  d not the table/
125b0 69 6e 64 65 78 20 74 68 61 74 20 69 73 20 61 63  index that is ac
125c0 74 75 61 6c 6c 79 20 62 65 69 6e 67 20 6d 6f 76  tually being mov
125d0 65 64 2e 0a 2a 2a 20 57 65 20 6d 75 73 74 20 63  ed..** We must c
125e0 6f 6e 74 69 6e 75 65 20 6c 6f 6f 70 69 6e 67 20  ontinue looping 
125f0 75 6e 74 69 6c 20 61 6c 6c 20 74 61 62 6c 65 73  until all tables
12600 20 61 6e 64 20 69 6e 64 69 63 65 73 20 77 69 74   and indices wit
12610 68 0a 2a 2a 20 72 6f 6f 74 70 61 67 65 3d 3d 69  h.** rootpage==i
12620 46 72 6f 6d 20 68 61 76 65 20 62 65 65 6e 20 63  From have been c
12630 6f 6e 76 65 72 74 65 64 20 74 6f 20 68 61 76 65  onverted to have
12640 20 61 20 72 6f 6f 74 70 61 67 65 20 6f 66 20 69   a rootpage of i
12650 54 6f 0a 2a 2a 20 69 6e 20 6f 72 64 65 72 20 74  To.** in order t
12660 6f 20 62 65 20 63 65 72 74 61 69 6e 20 74 68 61  o be certain tha
12670 74 20 77 65 20 67 6f 74 20 74 68 65 20 72 69 67  t we got the rig
12680 68 74 20 6f 6e 65 2e 0a 2a 2f 0a 23 69 66 6e 64  ht one..*/.#ifnd
12690 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
126a0 55 54 4f 56 41 43 55 55 4d 0a 76 6f 69 64 20 73  UTOVACUUM.void s
126b0 71 6c 69 74 65 33 52 6f 6f 74 50 61 67 65 4d 6f  qlite3RootPageMo
126c0 76 65 64 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  ved(sqlite3 *db,
126d0 20 69 6e 74 20 69 44 62 2c 20 69 6e 74 20 69 46   int iDb, int iF
126e0 72 6f 6d 2c 20 69 6e 74 20 69 54 6f 29 7b 0a 20  rom, int iTo){. 
126f0 20 48 61 73 68 45 6c 65 6d 20 2a 70 45 6c 65 6d   HashElem *pElem
12700 3b 0a 20 20 48 61 73 68 20 2a 70 48 61 73 68 3b  ;.  Hash *pHash;
12710 0a 20 20 44 62 20 2a 70 44 62 3b 0a 0a 20 20 61  .  Db *pDb;..  a
12720 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 53 63  ssert( sqlite3Sc
12730 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62  hemaMutexHeld(db
12740 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a 20 20 70  , iDb, 0) );.  p
12750 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 44  Db = &db->aDb[iD
12760 62 5d 3b 0a 20 20 70 48 61 73 68 20 3d 20 26 70  b];.  pHash = &p
12770 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 74 62 6c  Db->pSchema->tbl
12780 48 61 73 68 3b 0a 20 20 66 6f 72 28 70 45 6c 65  Hash;.  for(pEle
12790 6d 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72 73  m=sqliteHashFirs
127a0 74 28 70 48 61 73 68 29 3b 20 70 45 6c 65 6d 3b  t(pHash); pElem;
127b0 20 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73   pElem=sqliteHas
127c0 68 4e 65 78 74 28 70 45 6c 65 6d 29 29 7b 0a 20  hNext(pElem)){. 
127d0 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d     Table *pTab =
127e0 20 73 71 6c 69 74 65 48 61 73 68 44 61 74 61 28   sqliteHashData(
127f0 70 45 6c 65 6d 29 3b 0a 20 20 20 20 69 66 28 20  pElem);.    if( 
12800 70 54 61 62 2d 3e 74 6e 75 6d 3d 3d 69 46 72 6f  pTab->tnum==iFro
12810 6d 20 29 7b 0a 20 20 20 20 20 20 70 54 61 62 2d  m ){.      pTab-
12820 3e 74 6e 75 6d 20 3d 20 69 54 6f 3b 0a 20 20 20  >tnum = iTo;.   
12830 20 7d 0a 20 20 7d 0a 20 20 70 48 61 73 68 20 3d   }.  }.  pHash =
12840 20 26 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e   &pDb->pSchema->
12850 69 64 78 48 61 73 68 3b 0a 20 20 66 6f 72 28 70  idxHash;.  for(p
12860 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73 68 46  Elem=sqliteHashF
12870 69 72 73 74 28 70 48 61 73 68 29 3b 20 70 45 6c  irst(pHash); pEl
12880 65 6d 3b 20 70 45 6c 65 6d 3d 73 71 6c 69 74 65  em; pElem=sqlite
12890 48 61 73 68 4e 65 78 74 28 70 45 6c 65 6d 29 29  HashNext(pElem))
128a0 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64  {.    Index *pId
128b0 78 20 3d 20 73 71 6c 69 74 65 48 61 73 68 44 61  x = sqliteHashDa
128c0 74 61 28 70 45 6c 65 6d 29 3b 0a 20 20 20 20 69  ta(pElem);.    i
128d0 66 28 20 70 49 64 78 2d 3e 74 6e 75 6d 3d 3d 69  f( pIdx->tnum==i
128e0 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20 70 49  From ){.      pI
128f0 64 78 2d 3e 74 6e 75 6d 20 3d 20 69 54 6f 3b 0a  dx->tnum = iTo;.
12900 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64      }.  }.}.#end
12910 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20  if../*.** Write 
12920 63 6f 64 65 20 74 6f 20 65 72 61 73 65 20 74 68  code to erase th
12930 65 20 74 61 62 6c 65 20 77 69 74 68 20 72 6f 6f  e table with roo
12940 74 2d 70 61 67 65 20 69 54 61 62 6c 65 20 66 72  t-page iTable fr
12950 6f 6d 20 64 61 74 61 62 61 73 65 20 69 44 62 2e  om database iDb.
12960 0a 2a 2a 20 41 6c 73 6f 20 77 72 69 74 65 20 63  .** Also write c
12970 6f 64 65 20 74 6f 20 6d 6f 64 69 66 79 20 74 68  ode to modify th
12980 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  e sqlite_master 
12990 74 61 62 6c 65 20 61 6e 64 20 69 6e 74 65 72 6e  table and intern
129a0 61 6c 20 73 63 68 65 6d 61 0a 2a 2a 20 69 66 20  al schema.** if 
129b0 61 20 72 6f 6f 74 2d 70 61 67 65 20 6f 66 20 61  a root-page of a
129c0 6e 6f 74 68 65 72 20 74 61 62 6c 65 20 69 73 20  nother table is 
129d0 6d 6f 76 65 64 20 62 79 20 74 68 65 20 62 74 72  moved by the btr
129e0 65 65 2d 6c 61 79 65 72 20 77 68 69 6c 73 74 0a  ee-layer whilst.
129f0 2a 2a 20 65 72 61 73 69 6e 67 20 69 54 61 62 6c  ** erasing iTabl
12a00 65 20 28 74 68 69 73 20 63 61 6e 20 68 61 70 70  e (this can happ
12a10 65 6e 20 77 69 74 68 20 61 6e 20 61 75 74 6f 2d  en with an auto-
12a20 76 61 63 75 75 6d 20 64 61 74 61 62 61 73 65 29  vacuum database)
12a30 2e 0a 2a 2f 20 0a 73 74 61 74 69 63 20 76 6f 69  ..*/ .static voi
12a40 64 20 64 65 73 74 72 6f 79 52 6f 6f 74 50 61 67  d destroyRootPag
12a50 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
12a60 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 69 6e 74   int iTable, int
12a70 20 69 44 62 29 7b 0a 20 20 56 64 62 65 20 2a 76   iDb){.  Vdbe *v
12a80 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
12a90 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 6e 74  e(pParse);.  int
12aa0 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74   r1 = sqlite3Get
12ab0 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
12ac0 0a 20 20 61 73 73 65 72 74 28 20 69 54 61 62 6c  .  assert( iTabl
12ad0 65 3e 31 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  e>1 );.  sqlite3
12ae0 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
12af0 5f 44 65 73 74 72 6f 79 2c 20 69 54 61 62 6c 65  _Destroy, iTable
12b00 2c 20 72 31 2c 20 69 44 62 29 3b 0a 20 20 73 71  , r1, iDb);.  sq
12b10 6c 69 74 65 33 4d 61 79 41 62 6f 72 74 28 70 50  lite3MayAbort(pP
12b20 61 72 73 65 29 3b 0a 23 69 66 6e 64 65 66 20 53  arse);.#ifndef S
12b30 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
12b40 41 43 55 55 4d 0a 20 20 2f 2a 20 4f 50 5f 44 65  ACUUM.  /* OP_De
12b50 73 74 72 6f 79 20 73 74 6f 72 65 73 20 61 6e 20  stroy stores an 
12b60 69 6e 20 69 6e 74 65 67 65 72 20 72 31 2e 20 49  in integer r1. I
12b70 66 20 74 68 69 73 20 69 6e 74 65 67 65 72 0a 20  f this integer. 
12b80 20 2a 2a 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c   ** is non-zero,
12b90 20 74 68 65 6e 20 69 74 20 69 73 20 74 68 65 20   then it is the 
12ba0 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62 65 72  root page number
12bb0 20 6f 66 20 61 20 74 61 62 6c 65 20 6d 6f 76 65   of a table move
12bc0 64 20 74 6f 0a 20 20 2a 2a 20 6c 6f 63 61 74 69  d to.  ** locati
12bd0 6f 6e 20 69 54 61 62 6c 65 2e 20 54 68 65 20 66  on iTable. The f
12be0 6f 6c 6c 6f 77 69 6e 67 20 63 6f 64 65 20 6d 6f  ollowing code mo
12bf0 64 69 66 69 65 73 20 74 68 65 20 73 71 6c 69 74  difies the sqlit
12c00 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20 74  e_master table t
12c10 6f 0a 20 20 2a 2a 20 72 65 66 6c 65 63 74 20 74  o.  ** reflect t
12c20 68 69 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  his..  **.  ** T
12c30 68 65 20 22 23 4e 4e 4e 22 20 69 6e 20 74 68 65  he "#NNN" in the
12c40 20 53 51 4c 20 69 73 20 61 20 73 70 65 63 69 61   SQL is a specia
12c50 6c 20 63 6f 6e 73 74 61 6e 74 20 74 68 61 74 20  l constant that 
12c60 6d 65 61 6e 73 20 77 68 61 74 65 76 65 72 20 76  means whatever v
12c70 61 6c 75 65 0a 20 20 2a 2a 20 69 73 20 69 6e 20  alue.  ** is in 
12c80 72 65 67 69 73 74 65 72 20 4e 4e 4e 2e 20 20 53  register NNN.  S
12c90 65 65 20 67 72 61 6d 6d 61 72 20 72 75 6c 65 73  ee grammar rules
12ca0 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
12cb0 20 74 68 65 20 54 4b 5f 52 45 47 49 53 54 45 52   the TK_REGISTER
12cc0 0a 20 20 2a 2a 20 74 6f 6b 65 6e 20 66 6f 72 20  .  ** token for 
12cd0 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72  additional infor
12ce0 6d 61 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 73  mation..  */.  s
12cf0 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72 73  qlite3NestedPars
12d00 65 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20  e(pParse, .     
12d10 22 55 50 44 41 54 45 20 25 51 2e 25 73 20 53 45  "UPDATE %Q.%s SE
12d20 54 20 72 6f 6f 74 70 61 67 65 3d 25 64 20 57 48  T rootpage=%d WH
12d30 45 52 45 20 23 25 64 20 41 4e 44 20 72 6f 6f 74  ERE #%d AND root
12d40 70 61 67 65 3d 23 25 64 22 2c 0a 20 20 20 20 20  page=#%d",.     
12d50 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61 44 62 5b  pParse->db->aDb[
12d60 69 44 62 5d 2e 7a 4e 61 6d 65 2c 20 53 43 48 45  iDb].zName, SCHE
12d70 4d 41 5f 54 41 42 4c 45 28 69 44 62 29 2c 20 69  MA_TABLE(iDb), i
12d80 54 61 62 6c 65 2c 20 72 31 2c 20 72 31 29 3b 0a  Table, r1, r1);.
12d90 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33  #endif.  sqlite3
12da0 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
12db0 50 61 72 73 65 2c 20 72 31 29 3b 0a 7d 0a 0a 2f  Parse, r1);.}../
12dc0 2a 0a 2a 2a 20 57 72 69 74 65 20 56 44 42 45 20  *.** Write VDBE 
12dd0 63 6f 64 65 20 74 6f 20 65 72 61 73 65 20 74 61  code to erase ta
12de0 62 6c 65 20 70 54 61 62 20 61 6e 64 20 61 6c 6c  ble pTab and all
12df0 20 61 73 73 6f 63 69 61 74 65 64 20 69 6e 64 69   associated indi
12e00 63 65 73 20 6f 6e 20 64 69 73 6b 2e 0a 2a 2a 20  ces on disk..** 
12e10 43 6f 64 65 20 74 6f 20 75 70 64 61 74 65 20 74  Code to update t
12e20 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  he sqlite_master
12e30 20 74 61 62 6c 65 73 20 61 6e 64 20 69 6e 74 65   tables and inte
12e40 72 6e 61 6c 20 73 63 68 65 6d 61 20 64 65 66 69  rnal schema defi
12e50 6e 69 74 69 6f 6e 73 0a 2a 2a 20 69 6e 20 63 61  nitions.** in ca
12e60 73 65 20 61 20 72 6f 6f 74 2d 70 61 67 65 20 62  se a root-page b
12e70 65 6c 6f 6e 67 69 6e 67 20 74 6f 20 61 6e 6f 74  elonging to anot
12e80 68 65 72 20 74 61 62 6c 65 20 69 73 20 6d 6f 76  her table is mov
12e90 65 64 20 62 79 20 74 68 65 20 62 74 72 65 65 20  ed by the btree 
12ea0 6c 61 79 65 72 0a 2a 2a 20 69 73 20 61 6c 73 6f  layer.** is also
12eb0 20 61 64 64 65 64 20 28 74 68 69 73 20 63 61 6e   added (this can
12ec0 20 68 61 70 70 65 6e 20 77 69 74 68 20 61 6e 20   happen with an 
12ed0 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61  auto-vacuum data
12ee0 62 61 73 65 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  base)..*/.static
12ef0 20 76 6f 69 64 20 64 65 73 74 72 6f 79 54 61 62   void destroyTab
12f00 6c 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  le(Parse *pParse
12f10 2c 20 54 61 62 6c 65 20 2a 70 54 61 62 29 7b 0a  , Table *pTab){.
12f20 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  #ifdef SQLITE_OM
12f30 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
12f40 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 69  Index *pIdx;.  i
12f50 6e 74 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33  nt iDb = sqlite3
12f60 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 70 50  SchemaToIndex(pP
12f70 61 72 73 65 2d 3e 64 62 2c 20 70 54 61 62 2d 3e  arse->db, pTab->
12f80 70 53 63 68 65 6d 61 29 3b 0a 20 20 64 65 73 74  pSchema);.  dest
12f90 72 6f 79 52 6f 6f 74 50 61 67 65 28 70 50 61 72  royRootPage(pPar
12fa0 73 65 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 2c 20  se, pTab->tnum, 
12fb0 69 44 62 29 3b 0a 20 20 66 6f 72 28 70 49 64 78  iDb);.  for(pIdx
12fc0 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70  =pTab->pIndex; p
12fd0 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e  Idx; pIdx=pIdx->
12fe0 70 4e 65 78 74 29 7b 0a 20 20 20 20 64 65 73 74  pNext){.    dest
12ff0 72 6f 79 52 6f 6f 74 50 61 67 65 28 70 50 61 72  royRootPage(pPar
13000 73 65 2c 20 70 49 64 78 2d 3e 74 6e 75 6d 2c 20  se, pIdx->tnum, 
13010 69 44 62 29 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a  iDb);.  }.#else.
13020 20 20 2f 2a 20 49 66 20 74 68 65 20 64 61 74 61    /* If the data
13030 62 61 73 65 20 6d 61 79 20 62 65 20 61 75 74 6f  base may be auto
13040 2d 76 61 63 75 75 6d 20 63 61 70 61 62 6c 65 20  -vacuum capable 
13050 28 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  (if SQLITE_OMIT_
13060 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 2a 2a 20  AUTOVACUUM.  ** 
13070 69 73 20 6e 6f 74 20 64 65 66 69 6e 65 64 29 2c  is not defined),
13080 20 74 68 65 6e 20 69 74 20 69 73 20 69 6d 70 6f   then it is impo
13090 72 74 61 6e 74 20 74 6f 20 63 61 6c 6c 20 4f 50  rtant to call OP
130a0 5f 44 65 73 74 72 6f 79 20 6f 6e 20 74 68 65 0a  _Destroy on the.
130b0 20 20 2a 2a 20 74 61 62 6c 65 20 61 6e 64 20 69    ** table and i
130c0 6e 64 65 78 20 72 6f 6f 74 2d 70 61 67 65 73 20  ndex root-pages 
130d0 69 6e 20 6f 72 64 65 72 2c 20 73 74 61 72 74 69  in order, starti
130e0 6e 67 20 77 69 74 68 20 74 68 65 20 6e 75 6d 65  ng with the nume
130f0 72 69 63 61 6c 6c 79 20 0a 20 20 2a 2a 20 6c 61  rically .  ** la
13100 72 67 65 73 74 20 72 6f 6f 74 2d 70 61 67 65 20  rgest root-page 
13110 6e 75 6d 62 65 72 2e 20 54 68 69 73 20 67 75 61  number. This gua
13120 72 61 6e 74 65 65 73 20 74 68 61 74 20 6e 6f 6e  rantees that non
13130 65 20 6f 66 20 74 68 65 20 72 6f 6f 74 2d 70 61  e of the root-pa
13140 67 65 73 0a 20 20 2a 2a 20 74 6f 20 62 65 20 64  ges.  ** to be d
13150 65 73 74 72 6f 79 65 64 20 69 73 20 72 65 6c 6f  estroyed is relo
13160 63 61 74 65 64 20 62 79 20 61 6e 20 65 61 72 6c  cated by an earl
13170 69 65 72 20 4f 50 5f 44 65 73 74 72 6f 79 2e 20  ier OP_Destroy. 
13180 69 2e 65 2e 20 69 66 20 74 68 65 0a 20 20 2a 2a  i.e. if the.  **
13190 20 66 6f 6c 6c 6f 77 69 6e 67 20 77 65 72 65 20   following were 
131a0 63 6f 64 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  coded:.  **.  **
131b0 20 4f 50 5f 44 65 73 74 72 6f 79 20 34 20 30 0a   OP_Destroy 4 0.
131c0 20 20 2a 2a 20 2e 2e 2e 0a 20 20 2a 2a 20 4f 50    ** ....  ** OP
131d0 5f 44 65 73 74 72 6f 79 20 35 20 30 0a 20 20 2a  _Destroy 5 0.  *
131e0 2a 0a 20 20 2a 2a 20 61 6e 64 20 72 6f 6f 74 20  *.  ** and root 
131f0 70 61 67 65 20 35 20 68 61 70 70 65 6e 65 64 20  page 5 happened 
13200 74 6f 20 62 65 20 74 68 65 20 6c 61 72 67 65 73  to be the larges
13210 74 20 72 6f 6f 74 2d 70 61 67 65 20 6e 75 6d 62  t root-page numb
13220 65 72 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20 64  er in the.  ** d
13230 61 74 61 62 61 73 65 2c 20 74 68 65 6e 20 72 6f  atabase, then ro
13240 6f 74 20 70 61 67 65 20 35 20 77 6f 75 6c 64 20  ot page 5 would 
13250 62 65 20 6d 6f 76 65 64 20 74 6f 20 70 61 67 65  be moved to page
13260 20 34 20 62 79 20 74 68 65 20 0a 20 20 2a 2a 20   4 by the .  ** 
13270 22 4f 50 5f 44 65 73 74 72 6f 79 20 34 20 30 22  "OP_Destroy 4 0"
13280 20 6f 70 63 6f 64 65 2e 20 54 68 65 20 73 75 62   opcode. The sub
13290 73 65 71 75 65 6e 74 20 22 4f 50 5f 44 65 73 74  sequent "OP_Dest
132a0 72 6f 79 20 35 20 30 22 20 77 6f 75 6c 64 20 68  roy 5 0" would h
132b0 69 74 0a 20 20 2a 2a 20 61 20 66 72 65 65 2d 6c  it.  ** a free-l
132c0 69 73 74 20 70 61 67 65 2e 0a 20 20 2a 2f 0a 20  ist page..  */. 
132d0 20 69 6e 74 20 69 54 61 62 20 3d 20 70 54 61 62   int iTab = pTab
132e0 2d 3e 74 6e 75 6d 3b 0a 20 20 69 6e 74 20 69 44  ->tnum;.  int iD
132f0 65 73 74 72 6f 79 65 64 20 3d 20 30 3b 0a 0a 20  estroyed = 0;.. 
13300 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 20 20 20   while( 1 ){.   
13310 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20   Index *pIdx;.  
13320 20 20 69 6e 74 20 69 4c 61 72 67 65 73 74 20 3d    int iLargest =
13330 20 30 3b 0a 0a 20 20 20 20 69 66 28 20 69 44 65   0;..    if( iDe
13340 73 74 72 6f 79 65 64 3d 3d 30 20 7c 7c 20 69 54  stroyed==0 || iT
13350 61 62 3c 69 44 65 73 74 72 6f 79 65 64 20 29 7b  ab<iDestroyed ){
13360 0a 20 20 20 20 20 20 69 4c 61 72 67 65 73 74 20  .      iLargest 
13370 3d 20 69 54 61 62 3b 0a 20 20 20 20 7d 0a 20 20  = iTab;.    }.  
13380 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d    for(pIdx=pTab-
13390 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70  >pIndex; pIdx; p
133a0 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29  Idx=pIdx->pNext)
133b0 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 49 64 78  {.      int iIdx
133c0 20 3d 20 70 49 64 78 2d 3e 74 6e 75 6d 3b 0a 20   = pIdx->tnum;. 
133d0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49 64       assert( pId
133e0 78 2d 3e 70 53 63 68 65 6d 61 3d 3d 70 54 61 62  x->pSchema==pTab
133f0 2d 3e 70 53 63 68 65 6d 61 20 29 3b 0a 20 20 20  ->pSchema );.   
13400 20 20 20 69 66 28 20 28 69 44 65 73 74 72 6f 79     if( (iDestroy
13410 65 64 3d 3d 30 20 7c 7c 20 28 69 49 64 78 3c 69  ed==0 || (iIdx<i
13420 44 65 73 74 72 6f 79 65 64 29 29 20 26 26 20 69  Destroyed)) && i
13430 49 64 78 3e 69 4c 61 72 67 65 73 74 20 29 7b 0a  Idx>iLargest ){.
13440 20 20 20 20 20 20 20 20 69 4c 61 72 67 65 73 74          iLargest
13450 20 3d 20 69 49 64 78 3b 0a 20 20 20 20 20 20 7d   = iIdx;.      }
13460 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69  .    }.    if( i
13470 4c 61 72 67 65 73 74 3d 3d 30 20 29 7b 0a 20 20  Largest==0 ){.  
13480 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
13490 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74  }else{.      int
134a0 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63   iDb = sqlite3Sc
134b0 68 65 6d 61 54 6f 49 6e 64 65 78 28 70 50 61 72  hemaToIndex(pPar
134c0 73 65 2d 3e 64 62 2c 20 70 54 61 62 2d 3e 70 53  se->db, pTab->pS
134d0 63 68 65 6d 61 29 3b 0a 20 20 20 20 20 20 61 73  chema);.      as
134e0 73 65 72 74 28 20 69 44 62 3e 3d 30 20 26 26 20  sert( iDb>=0 && 
134f0 69 44 62 3c 70 50 61 72 73 65 2d 3e 64 62 2d 3e  iDb<pParse->db->
13500 6e 44 62 20 29 3b 0a 20 20 20 20 20 20 64 65 73  nDb );.      des
13510 74 72 6f 79 52 6f 6f 74 50 61 67 65 28 70 50 61  troyRootPage(pPa
13520 72 73 65 2c 20 69 4c 61 72 67 65 73 74 2c 20 69  rse, iLargest, i
13530 44 62 29 3b 0a 20 20 20 20 20 20 69 44 65 73 74  Db);.      iDest
13540 72 6f 79 65 64 20 3d 20 69 4c 61 72 67 65 73 74  royed = iLargest
13550 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  ;.    }.  }.#end
13560 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f  if.}../*.** Remo
13570 76 65 20 65 6e 74 72 69 65 73 20 66 72 6f 6d 20  ve entries from 
13580 74 68 65 20 73 71 6c 69 74 65 5f 73 74 61 74 4e  the sqlite_statN
13590 20 74 61 62 6c 65 73 20 28 66 6f 72 20 4e 20 69   tables (for N i
135a0 6e 20 28 31 2c 32 2c 33 29 29 0a 2a 2a 20 61 66  n (1,2,3)).** af
135b0 74 65 72 20 61 20 44 52 4f 50 20 49 4e 44 45 58  ter a DROP INDEX
135c0 20 6f 72 20 44 52 4f 50 20 54 41 42 4c 45 20 63   or DROP TABLE c
135d0 6f 6d 6d 61 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69  ommand..*/.stati
135e0 63 20 76 6f 69 64 20 73 71 6c 69 74 65 33 43 6c  c void sqlite3Cl
135f0 65 61 72 53 74 61 74 54 61 62 6c 65 73 28 0a 20  earStatTables(. 
13600 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
13610 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
13620 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
13630 2f 0a 20 20 69 6e 74 20 69 44 62 2c 20 20 20 20  /.  int iDb,    
13640 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
13650 65 20 64 61 74 61 62 61 73 65 20 6e 75 6d 62 65  e database numbe
13660 72 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  r */.  const cha
13670 72 20 2a 7a 54 79 70 65 2c 20 20 20 20 20 2f 2a  r *zType,     /*
13680 20 22 69 64 78 22 20 6f 72 20 22 74 62 6c 22 20   "idx" or "tbl" 
13690 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
136a0 2a 7a 4e 61 6d 65 20 20 20 20 20 20 2f 2a 20 4e  *zName      /* N
136b0 61 6d 65 20 6f 66 20 69 6e 64 65 78 20 6f 72 20  ame of index or 
136c0 74 61 62 6c 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e  table */.){.  in
136d0 74 20 69 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  t i;.  const cha
136e0 72 20 2a 7a 44 62 4e 61 6d 65 20 3d 20 70 50 61  r *zDbName = pPa
136f0 72 73 65 2d 3e 64 62 2d 3e 61 44 62 5b 69 44 62  rse->db->aDb[iDb
13700 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 66 6f 72 28 69  ].zName;.  for(i
13710 3d 31 3b 20 69 3c 3d 34 3b 20 69 2b 2b 29 7b 0a  =1; i<=4; i++){.
13720 20 20 20 20 63 68 61 72 20 7a 54 61 62 5b 32 34      char zTab[24
13730 5d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  ];.    sqlite3_s
13740 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a  nprintf(sizeof(z
13750 54 61 62 29 2c 7a 54 61 62 2c 22 73 71 6c 69 74  Tab),zTab,"sqlit
13760 65 5f 73 74 61 74 25 64 22 2c 69 29 3b 0a 20 20  e_stat%d",i);.  
13770 20 20 69 66 28 20 73 71 6c 69 74 65 33 46 69 6e    if( sqlite3Fin
13780 64 54 61 62 6c 65 28 70 50 61 72 73 65 2d 3e 64  dTable(pParse->d
13790 62 2c 20 7a 54 61 62 2c 20 7a 44 62 4e 61 6d 65  b, zTab, zDbName
137a0 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ) ){.      sqlit
137b0 65 33 4e 65 73 74 65 64 50 61 72 73 65 28 70 50  e3NestedParse(pP
137c0 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20 22 44  arse,.        "D
137d0 45 4c 45 54 45 20 46 52 4f 4d 20 25 51 2e 25 73  ELETE FROM %Q.%s
137e0 20 57 48 45 52 45 20 25 73 3d 25 51 22 2c 0a 20   WHERE %s=%Q",. 
137f0 20 20 20 20 20 20 20 7a 44 62 4e 61 6d 65 2c 20         zDbName, 
13800 7a 54 61 62 2c 20 7a 54 79 70 65 2c 20 7a 4e 61  zTab, zType, zNa
13810 6d 65 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20  me.      );.    
13820 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  }.  }.}../*.** G
13830 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20  enerate code to 
13840 64 72 6f 70 20 61 20 74 61 62 6c 65 2e 0a 2a 2f  drop a table..*/
13850 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 6f 64  .void sqlite3Cod
13860 65 44 72 6f 70 54 61 62 6c 65 28 50 61 72 73 65  eDropTable(Parse
13870 20 2a 70 50 61 72 73 65 2c 20 54 61 62 6c 65 20   *pParse, Table 
13880 2a 70 54 61 62 2c 20 69 6e 74 20 69 44 62 2c 20  *pTab, int iDb, 
13890 69 6e 74 20 69 73 56 69 65 77 29 7b 0a 20 20 56  int isView){.  V
138a0 64 62 65 20 2a 76 3b 0a 20 20 73 71 6c 69 74 65  dbe *v;.  sqlite
138b0 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
138c0 64 62 3b 0a 20 20 54 72 69 67 67 65 72 20 2a 70  db;.  Trigger *p
138d0 54 72 69 67 67 65 72 3b 0a 20 20 44 62 20 2a 70  Trigger;.  Db *p
138e0 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 44  Db = &db->aDb[iD
138f0 62 5d 3b 0a 0a 20 20 76 20 3d 20 73 71 6c 69 74  b];..  v = sqlit
13900 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
13910 29 3b 0a 20 20 61 73 73 65 72 74 28 20 76 21 3d  );.  assert( v!=
13920 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 65  0 );.  sqlite3Be
13930 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f  ginWriteOperatio
13940 6e 28 70 50 61 72 73 65 2c 20 31 2c 20 69 44 62  n(pParse, 1, iDb
13950 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  );..#ifndef SQLI
13960 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
13970 41 42 4c 45 0a 20 20 69 66 28 20 49 73 56 69 72  ABLE.  if( IsVir
13980 74 75 61 6c 28 70 54 61 62 29 20 29 7b 0a 20 20  tual(pTab) ){.  
13990 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
139a0 4f 70 30 28 76 2c 20 4f 50 5f 56 42 65 67 69 6e  Op0(v, OP_VBegin
139b0 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  );.  }.#endif.. 
139c0 20 2f 2a 20 44 72 6f 70 20 61 6c 6c 20 74 72 69   /* Drop all tri
139d0 67 67 65 72 73 20 61 73 73 6f 63 69 61 74 65 64  ggers associated
139e0 20 77 69 74 68 20 74 68 65 20 74 61 62 6c 65 20   with the table 
139f0 62 65 69 6e 67 20 64 72 6f 70 70 65 64 2e 20 43  being dropped. C
13a00 6f 64 65 0a 20 20 2a 2a 20 69 73 20 67 65 6e 65  ode.  ** is gene
13a10 72 61 74 65 64 20 74 6f 20 72 65 6d 6f 76 65 20  rated to remove 
13a20 65 6e 74 72 69 65 73 20 66 72 6f 6d 20 73 71 6c  entries from sql
13a30 69 74 65 5f 6d 61 73 74 65 72 20 61 6e 64 2f 6f  ite_master and/o
13a40 72 0a 20 20 2a 2a 20 73 71 6c 69 74 65 5f 74 65  r.  ** sqlite_te
13a50 6d 70 5f 6d 61 73 74 65 72 20 69 66 20 72 65 71  mp_master if req
13a60 75 69 72 65 64 2e 0a 20 20 2a 2f 0a 20 20 70 54  uired..  */.  pT
13a70 72 69 67 67 65 72 20 3d 20 73 71 6c 69 74 65 33  rigger = sqlite3
13a80 54 72 69 67 67 65 72 4c 69 73 74 28 70 50 61 72  TriggerList(pPar
13a90 73 65 2c 20 70 54 61 62 29 3b 0a 20 20 77 68 69  se, pTab);.  whi
13aa0 6c 65 28 20 70 54 72 69 67 67 65 72 20 29 7b 0a  le( pTrigger ){.
13ab0 20 20 20 20 61 73 73 65 72 74 28 20 70 54 72 69      assert( pTri
13ac0 67 67 65 72 2d 3e 70 53 63 68 65 6d 61 3d 3d 70  gger->pSchema==p
13ad0 54 61 62 2d 3e 70 53 63 68 65 6d 61 20 7c 7c 20  Tab->pSchema || 
13ae0 0a 20 20 20 20 20 20 20 20 70 54 72 69 67 67 65  .        pTrigge
13af0 72 2d 3e 70 53 63 68 65 6d 61 3d 3d 64 62 2d 3e  r->pSchema==db->
13b00 61 44 62 5b 31 5d 2e 70 53 63 68 65 6d 61 20 29  aDb[1].pSchema )
13b10 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 72 6f  ;.    sqlite3Dro
13b20 70 54 72 69 67 67 65 72 50 74 72 28 70 50 61 72  pTriggerPtr(pPar
13b30 73 65 2c 20 70 54 72 69 67 67 65 72 29 3b 0a 20  se, pTrigger);. 
13b40 20 20 20 70 54 72 69 67 67 65 72 20 3d 20 70 54     pTrigger = pT
13b50 72 69 67 67 65 72 2d 3e 70 4e 65 78 74 3b 0a 20  rigger->pNext;. 
13b60 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   }..#ifndef SQLI
13b70 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 43 52  TE_OMIT_AUTOINCR
13b80 45 4d 45 4e 54 0a 20 20 2f 2a 20 52 65 6d 6f 76  EMENT.  /* Remov
13b90 65 20 61 6e 79 20 65 6e 74 72 69 65 73 20 6f 66  e any entries of
13ba0 20 74 68 65 20 73 71 6c 69 74 65 5f 73 65 71 75   the sqlite_sequ
13bb0 65 6e 63 65 20 74 61 62 6c 65 20 61 73 73 6f 63  ence table assoc
13bc0 69 61 74 65 64 20 77 69 74 68 0a 20 20 2a 2a 20  iated with.  ** 
13bd0 74 68 65 20 74 61 62 6c 65 20 62 65 69 6e 67 20  the table being 
13be0 64 72 6f 70 70 65 64 2e 20 54 68 69 73 20 69 73  dropped. This is
13bf0 20 64 6f 6e 65 20 62 65 66 6f 72 65 20 74 68 65   done before the
13c00 20 74 61 62 6c 65 20 69 73 20 64 72 6f 70 70 65   table is droppe
13c10 64 0a 20 20 2a 2a 20 61 74 20 74 68 65 20 62 74  d.  ** at the bt
13c20 72 65 65 20 6c 65 76 65 6c 2c 20 69 6e 20 63 61  ree level, in ca
13c30 73 65 20 74 68 65 20 73 71 6c 69 74 65 5f 73 65  se the sqlite_se
13c40 71 75 65 6e 63 65 20 74 61 62 6c 65 20 6e 65 65  quence table nee
13c50 64 73 20 74 6f 0a 20 20 2a 2a 20 6d 6f 76 65 20  ds to.  ** move 
13c60 61 73 20 61 20 72 65 73 75 6c 74 20 6f 66 20 74  as a result of t
13c70 68 65 20 64 72 6f 70 20 28 63 61 6e 20 68 61 70  he drop (can hap
13c80 70 65 6e 20 69 6e 20 61 75 74 6f 2d 76 61 63 75  pen in auto-vacu
13c90 75 6d 20 6d 6f 64 65 29 2e 0a 20 20 2a 2f 0a 20  um mode)..  */. 
13ca0 20 69 66 28 20 70 54 61 62 2d 3e 74 61 62 46 6c   if( pTab->tabFl
13cb0 61 67 73 20 26 20 54 46 5f 41 75 74 6f 69 6e 63  ags & TF_Autoinc
13cc0 72 65 6d 65 6e 74 20 29 7b 0a 20 20 20 20 73 71  rement ){.    sq
13cd0 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72 73 65  lite3NestedParse
13ce0 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 22  (pParse,.      "
13cf0 44 45 4c 45 54 45 20 46 52 4f 4d 20 25 51 2e 73  DELETE FROM %Q.s
13d00 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 20 57  qlite_sequence W
13d10 48 45 52 45 20 6e 61 6d 65 3d 25 51 22 2c 0a 20  HERE name=%Q",. 
13d20 20 20 20 20 20 70 44 62 2d 3e 7a 4e 61 6d 65 2c       pDb->zName,
13d30 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 0a 20 20 20   pTab->zName.   
13d40 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a   );.  }.#endif..
13d50 20 20 2f 2a 20 44 72 6f 70 20 61 6c 6c 20 53 51    /* Drop all SQ
13d60 4c 49 54 45 5f 4d 41 53 54 45 52 20 74 61 62 6c  LITE_MASTER tabl
13d70 65 20 61 6e 64 20 69 6e 64 65 78 20 65 6e 74 72  e and index entr
13d80 69 65 73 20 74 68 61 74 20 72 65 66 65 72 20 74  ies that refer t
13d90 6f 20 74 68 65 0a 20 20 2a 2a 20 74 61 62 6c 65  o the.  ** table
13da0 2e 20 54 68 65 20 70 72 6f 67 72 61 6d 20 6e 61  . The program na
13db0 6d 65 20 6c 6f 6f 70 73 20 74 68 72 6f 75 67 68  me loops through
13dc0 20 74 68 65 20 6d 61 73 74 65 72 20 74 61 62 6c   the master tabl
13dd0 65 20 61 6e 64 20 64 65 6c 65 74 65 73 0a 20 20  e and deletes.  
13de0 2a 2a 20 65 76 65 72 79 20 72 6f 77 20 74 68 61  ** every row tha
13df0 74 20 72 65 66 65 72 73 20 74 6f 20 61 20 74 61  t refers to a ta
13e00 62 6c 65 20 6f 66 20 74 68 65 20 73 61 6d 65 20  ble of the same 
13e10 6e 61 6d 65 20 61 73 20 74 68 65 20 6f 6e 65 20  name as the one 
13e20 62 65 69 6e 67 0a 20 20 2a 2a 20 64 72 6f 70 70  being.  ** dropp
13e30 65 64 2e 20 54 72 69 67 67 65 72 73 20 61 72 65  ed. Triggers are
13e40 20 68 61 6e 64 6c 65 64 20 73 65 70 61 72 61 74   handled separat
13e50 65 6c 79 20 62 65 63 61 75 73 65 20 61 20 74 72  ely because a tr
13e60 69 67 67 65 72 20 63 61 6e 20 62 65 0a 20 20 2a  igger can be.  *
13e70 2a 20 63 72 65 61 74 65 64 20 69 6e 20 74 68 65  * created in the
13e80 20 74 65 6d 70 20 64 61 74 61 62 61 73 65 20 74   temp database t
13e90 68 61 74 20 72 65 66 65 72 73 20 74 6f 20 61 20  hat refers to a 
13ea0 74 61 62 6c 65 20 69 6e 20 61 6e 6f 74 68 65 72  table in another
13eb0 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 2e 0a  .  ** database..
13ec0 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 4e 65    */.  sqlite3Ne
13ed0 73 74 65 64 50 61 72 73 65 28 70 50 61 72 73 65  stedParse(pParse
13ee0 2c 20 0a 20 20 20 20 20 20 22 44 45 4c 45 54 45  , .      "DELETE
13ef0 20 46 52 4f 4d 20 25 51 2e 25 73 20 57 48 45 52   FROM %Q.%s WHER
13f00 45 20 74 62 6c 5f 6e 61 6d 65 3d 25 51 20 61 6e  E tbl_name=%Q an
13f10 64 20 74 79 70 65 21 3d 27 74 72 69 67 67 65 72  d type!='trigger
13f20 27 22 2c 0a 20 20 20 20 20 20 70 44 62 2d 3e 7a  '",.      pDb->z
13f30 4e 61 6d 65 2c 20 53 43 48 45 4d 41 5f 54 41 42  Name, SCHEMA_TAB
13f40 4c 45 28 69 44 62 29 2c 20 70 54 61 62 2d 3e 7a  LE(iDb), pTab->z
13f50 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 21 69 73  Name);.  if( !is
13f60 56 69 65 77 20 26 26 20 21 49 73 56 69 72 74 75  View && !IsVirtu
13f70 61 6c 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20  al(pTab) ){.    
13f80 64 65 73 74 72 6f 79 54 61 62 6c 65 28 70 50 61  destroyTable(pPa
13f90 72 73 65 2c 20 70 54 61 62 29 3b 0a 20 20 7d 0a  rse, pTab);.  }.
13fa0 0a 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65  .  /* Remove the
13fb0 20 74 61 62 6c 65 20 65 6e 74 72 79 20 66 72 6f   table entry fro
13fc0 6d 20 53 51 4c 69 74 65 27 73 20 69 6e 74 65 72  m SQLite's inter
13fd0 6e 61 6c 20 73 63 68 65 6d 61 20 61 6e 64 20 6d  nal schema and m
13fe0 6f 64 69 66 79 0a 20 20 2a 2a 20 74 68 65 20 73  odify.  ** the s
13ff0 63 68 65 6d 61 20 63 6f 6f 6b 69 65 2e 0a 20 20  chema cookie..  
14000 2a 2f 0a 20 20 69 66 28 20 49 73 56 69 72 74 75  */.  if( IsVirtu
14010 61 6c 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20  al(pTab) ){.    
14020 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
14030 34 28 76 2c 20 4f 50 5f 56 44 65 73 74 72 6f 79  4(v, OP_VDestroy
14040 2c 20 69 44 62 2c 20 30 2c 20 30 2c 20 70 54 61  , iDb, 0, 0, pTa
14050 62 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20  b->zName, 0);.  
14060 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  }.  sqlite3VdbeA
14070 64 64 4f 70 34 28 76 2c 20 4f 50 5f 44 72 6f 70  ddOp4(v, OP_Drop
14080 54 61 62 6c 65 2c 20 69 44 62 2c 20 30 2c 20 30  Table, iDb, 0, 0
14090 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 30  , pTab->zName, 0
140a0 29 3b 0a 20 20 73 71 6c 69 74 65 33 43 68 61 6e  );.  sqlite3Chan
140b0 67 65 43 6f 6f 6b 69 65 28 70 50 61 72 73 65 2c  geCookie(pParse,
140c0 20 69 44 62 29 3b 0a 20 20 73 71 6c 69 74 65 56   iDb);.  sqliteV
140d0 69 65 77 52 65 73 65 74 41 6c 6c 28 64 62 2c 20  iewResetAll(db, 
140e0 69 44 62 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  iDb);.}../*.** T
140f0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
14100 61 6c 6c 65 64 20 74 6f 20 64 6f 20 74 68 65 20  alled to do the 
14110 77 6f 72 6b 20 6f 66 20 61 20 44 52 4f 50 20 54  work of a DROP T
14120 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a  ABLE statement..
14130 2a 2a 20 70 4e 61 6d 65 20 69 73 20 74 68 65 20  ** pName is the 
14140 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c  name of the tabl
14150 65 20 74 6f 20 62 65 20 64 72 6f 70 70 65 64 2e  e to be dropped.
14160 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
14170 44 72 6f 70 54 61 62 6c 65 28 50 61 72 73 65 20  DropTable(Parse 
14180 2a 70 50 61 72 73 65 2c 20 53 72 63 4c 69 73 74  *pParse, SrcList
14190 20 2a 70 4e 61 6d 65 2c 20 69 6e 74 20 69 73 56   *pName, int isV
141a0 69 65 77 2c 20 69 6e 74 20 6e 6f 45 72 72 29 7b  iew, int noErr){
141b0 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a  .  Table *pTab;.
141c0 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 73 71 6c    Vdbe *v;.  sql
141d0 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
141e0 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 69 44 62  e->db;.  int iDb
141f0 3b 0a 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  ;..  if( db->mal
14200 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
14210 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f   goto exit_drop_
14220 74 61 62 6c 65 3b 0a 20 20 7d 0a 20 20 61 73 73  table;.  }.  ass
14230 65 72 74 28 20 70 50 61 72 73 65 2d 3e 6e 45 72  ert( pParse->nEr
14240 72 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  r==0 );.  assert
14250 28 20 70 4e 61 6d 65 2d 3e 6e 53 72 63 3d 3d 31  ( pName->nSrc==1
14260 20 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65   );.  if( sqlite
14270 33 52 65 61 64 53 63 68 65 6d 61 28 70 50 61 72  3ReadSchema(pPar
14280 73 65 29 20 29 20 67 6f 74 6f 20 65 78 69 74 5f  se) ) goto exit_
14290 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 69 66  drop_table;.  if
142a0 28 20 6e 6f 45 72 72 20 29 20 64 62 2d 3e 73 75  ( noErr ) db->su
142b0 70 70 72 65 73 73 45 72 72 2b 2b 3b 0a 20 20 70  ppressErr++;.  p
142c0 54 61 62 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63  Tab = sqlite3Loc
142d0 61 74 65 54 61 62 6c 65 49 74 65 6d 28 70 50 61  ateTableItem(pPa
142e0 72 73 65 2c 20 69 73 56 69 65 77 2c 20 26 70 4e  rse, isView, &pN
142f0 61 6d 65 2d 3e 61 5b 30 5d 29 3b 0a 20 20 69 66  ame->a[0]);.  if
14300 28 20 6e 6f 45 72 72 20 29 20 64 62 2d 3e 73 75  ( noErr ) db->su
14310 70 70 72 65 73 73 45 72 72 2d 2d 3b 0a 0a 20 20  ppressErr--;..  
14320 69 66 28 20 70 54 61 62 3d 3d 30 20 29 7b 0a 20  if( pTab==0 ){. 
14330 20 20 20 69 66 28 20 6e 6f 45 72 72 20 29 20 73     if( noErr ) s
14340 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66 79  qlite3CodeVerify
14350 4e 61 6d 65 64 53 63 68 65 6d 61 28 70 50 61 72  NamedSchema(pPar
14360 73 65 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e  se, pName->a[0].
14370 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20 20 20  zDatabase);.    
14380 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74  goto exit_drop_t
14390 61 62 6c 65 3b 0a 20 20 7d 0a 20 20 69 44 62 20  able;.  }.  iDb 
143a0 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54  = sqlite3SchemaT
143b0 6f 49 6e 64 65 78 28 64 62 2c 20 70 54 61 62 2d  oIndex(db, pTab-
143c0 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 61 73 73  >pSchema);.  ass
143d0 65 72 74 28 20 69 44 62 3e 3d 30 20 26 26 20 69  ert( iDb>=0 && i
143e0 44 62 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 0a 20  Db<db->nDb );.. 
143f0 20 2f 2a 20 49 66 20 70 54 61 62 20 69 73 20 61   /* If pTab is a
14400 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2c 20   virtual table, 
14410 63 61 6c 6c 20 56 69 65 77 47 65 74 43 6f 6c 75  call ViewGetColu
14420 6d 6e 4e 61 6d 65 73 28 29 20 74 6f 20 65 6e 73  mnNames() to ens
14430 75 72 65 0a 20 20 2a 2a 20 69 74 20 69 73 20 69  ure.  ** it is i
14440 6e 69 74 69 61 6c 69 7a 65 64 2e 0a 20 20 2a 2f  nitialized..  */
14450 0a 20 20 69 66 28 20 49 73 56 69 72 74 75 61 6c  .  if( IsVirtual
14460 28 70 54 61 62 29 20 26 26 20 73 71 6c 69 74 65  (pTab) && sqlite
14470 33 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61  3ViewGetColumnNa
14480 6d 65 73 28 70 50 61 72 73 65 2c 20 70 54 61 62  mes(pParse, pTab
14490 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78  ) ){.    goto ex
144a0 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20  it_drop_table;. 
144b0 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
144c0 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41  E_OMIT_AUTHORIZA
144d0 54 49 4f 4e 0a 20 20 7b 0a 20 20 20 20 69 6e 74  TION.  {.    int
144e0 20 63 6f 64 65 3b 0a 20 20 20 20 63 6f 6e 73 74   code;.    const
144f0 20 63 68 61 72 20 2a 7a 54 61 62 20 3d 20 53 43   char *zTab = SC
14500 48 45 4d 41 5f 54 41 42 4c 45 28 69 44 62 29 3b  HEMA_TABLE(iDb);
14510 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
14520 2a 7a 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69  *zDb = db->aDb[i
14530 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 63  Db].zName;.    c
14540 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 72 67 32  onst char *zArg2
14550 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 73 71   = 0;.    if( sq
14560 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70  lite3AuthCheck(p
14570 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 44 45  Parse, SQLITE_DE
14580 4c 45 54 45 2c 20 7a 54 61 62 2c 20 30 2c 20 7a  LETE, zTab, 0, z
14590 44 62 29 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  Db)){.      goto
145a0 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65   exit_drop_table
145b0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
145c0 69 73 56 69 65 77 20 29 7b 0a 20 20 20 20 20 20  isView ){.      
145d0 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42  if( !OMIT_TEMPDB
145e0 20 26 26 20 69 44 62 3d 3d 31 20 29 7b 0a 20 20   && iDb==1 ){.  
145f0 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c        code = SQL
14600 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 56 49  ITE_DROP_TEMP_VI
14610 45 57 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  EW;.      }else{
14620 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20 3d 20  .        code = 
14630 53 51 4c 49 54 45 5f 44 52 4f 50 5f 56 49 45 57  SQLITE_DROP_VIEW
14640 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66 6e 64 65  ;.      }.#ifnde
14650 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
14660 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 7d  RTUALTABLE.    }
14670 65 6c 73 65 20 69 66 28 20 49 73 56 69 72 74 75  else if( IsVirtu
14680 61 6c 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20  al(pTab) ){.    
14690 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f    code = SQLITE_
146a0 44 52 4f 50 5f 56 54 41 42 4c 45 3b 0a 20 20 20  DROP_VTABLE;.   
146b0 20 20 20 7a 41 72 67 32 20 3d 20 73 71 6c 69 74     zArg2 = sqlit
146c0 65 33 47 65 74 56 54 61 62 6c 65 28 64 62 2c 20  e3GetVTable(db, 
146d0 70 54 61 62 29 2d 3e 70 4d 6f 64 2d 3e 7a 4e 61  pTab)->pMod->zNa
146e0 6d 65 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d  me;.#endif.    }
146f0 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 66 28 20  else{.      if( 
14700 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26 26 20  !OMIT_TEMPDB && 
14710 69 44 62 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20  iDb==1 ){.      
14720 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f    code = SQLITE_
14730 44 52 4f 50 5f 54 45 4d 50 5f 54 41 42 4c 45 3b  DROP_TEMP_TABLE;
14740 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
14750 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c        code = SQL
14760 49 54 45 5f 44 52 4f 50 5f 54 41 42 4c 45 3b 0a  ITE_DROP_TABLE;.
14770 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
14780 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74    if( sqlite3Aut
14790 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 63  hCheck(pParse, c
147a0 6f 64 65 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  ode, pTab->zName
147b0 2c 20 7a 41 72 67 32 2c 20 7a 44 62 29 20 29 7b  , zArg2, zDb) ){
147c0 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74  .      goto exit
147d0 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 20  _drop_table;.   
147e0 20 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74   }.    if( sqlit
147f0 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72  e3AuthCheck(pPar
14800 73 65 2c 20 53 51 4c 49 54 45 5f 44 45 4c 45 54  se, SQLITE_DELET
14810 45 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20  E, pTab->zName, 
14820 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20  0, zDb) ){.     
14830 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f   goto exit_drop_
14840 74 61 62 6c 65 3b 0a 20 20 20 20 7d 0a 20 20 7d  table;.    }.  }
14850 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 73 71  .#endif.  if( sq
14860 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28 70 54  lite3StrNICmp(pT
14870 61 62 2d 3e 7a 4e 61 6d 65 2c 20 22 73 71 6c 69  ab->zName, "sqli
14880 74 65 5f 22 2c 20 37 29 3d 3d 30 20 0a 20 20 20  te_", 7)==0 .   
14890 20 26 26 20 73 71 6c 69 74 65 33 53 74 72 4e 49   && sqlite3StrNI
148a0 43 6d 70 28 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c  Cmp(pTab->zName,
148b0 20 22 73 71 6c 69 74 65 5f 73 74 61 74 22 2c 20   "sqlite_stat", 
148c0 31 31 29 21 3d 30 20 29 7b 0a 20 20 20 20 73 71  11)!=0 ){.    sq
148d0 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
148e0 61 72 73 65 2c 20 22 74 61 62 6c 65 20 25 73 20  arse, "table %s 
148f0 6d 61 79 20 6e 6f 74 20 62 65 20 64 72 6f 70 70  may not be dropp
14900 65 64 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  ed", pTab->zName
14910 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74  );.    goto exit
14920 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 7d  _drop_table;.  }
14930 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
14940 5f 4f 4d 49 54 5f 56 49 45 57 0a 20 20 2f 2a 20  _OMIT_VIEW.  /* 
14950 45 6e 73 75 72 65 20 44 52 4f 50 20 54 41 42 4c  Ensure DROP TABL
14960 45 20 69 73 20 6e 6f 74 20 75 73 65 64 20 6f 6e  E is not used on
14970 20 61 20 76 69 65 77 2c 20 61 6e 64 20 44 52 4f   a view, and DRO
14980 50 20 56 49 45 57 20 69 73 20 6e 6f 74 20 75 73  P VIEW is not us
14990 65 64 0a 20 20 2a 2a 20 6f 6e 20 61 20 74 61 62  ed.  ** on a tab
149a0 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69  le..  */.  if( i
149b0 73 56 69 65 77 20 26 26 20 70 54 61 62 2d 3e 70  sView && pTab->p
149c0 53 65 6c 65 63 74 3d 3d 30 20 29 7b 0a 20 20 20  Select==0 ){.   
149d0 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
149e0 28 70 50 61 72 73 65 2c 20 22 75 73 65 20 44 52  (pParse, "use DR
149f0 4f 50 20 54 41 42 4c 45 20 74 6f 20 64 65 6c 65  OP TABLE to dele
14a00 74 65 20 74 61 62 6c 65 20 25 73 22 2c 20 70 54  te table %s", pT
14a10 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ab->zName);.    
14a20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74  goto exit_drop_t
14a30 61 62 6c 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20  able;.  }.  if( 
14a40 21 69 73 56 69 65 77 20 26 26 20 70 54 61 62 2d  !isView && pTab-
14a50 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20  >pSelect ){.    
14a60 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
14a70 70 50 61 72 73 65 2c 20 22 75 73 65 20 44 52 4f  pParse, "use DRO
14a80 50 20 56 49 45 57 20 74 6f 20 64 65 6c 65 74 65  P VIEW to delete
14a90 20 76 69 65 77 20 25 73 22 2c 20 70 54 61 62 2d   view %s", pTab-
14aa0 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 67 6f 74  >zName);.    got
14ab0 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c  o exit_drop_tabl
14ac0 65 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  e;.  }.#endif.. 
14ad0 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
14ae0 65 20 74 6f 20 72 65 6d 6f 76 65 20 74 68 65 20  e to remove the 
14af0 74 61 62 6c 65 20 66 72 6f 6d 20 74 68 65 20 6d  table from the m
14b00 61 73 74 65 72 20 74 61 62 6c 65 0a 20 20 2a 2a  aster table.  **
14b10 20 6f 6e 20 64 69 73 6b 2e 0a 20 20 2a 2f 0a 20   on disk..  */. 
14b20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56   v = sqlite3GetV
14b30 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69  dbe(pParse);.  i
14b40 66 28 20 76 20 29 7b 0a 20 20 20 20 73 71 6c 69  f( v ){.    sqli
14b50 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65  te3BeginWriteOpe
14b60 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 31  ration(pParse, 1
14b70 2c 20 69 44 62 29 3b 0a 20 20 20 20 73 71 6c 69  , iDb);.    sqli
14b80 74 65 33 43 6c 65 61 72 53 74 61 74 54 61 62 6c  te3ClearStatTabl
14b90 65 73 28 70 50 61 72 73 65 2c 20 69 44 62 2c 20  es(pParse, iDb, 
14ba0 22 74 62 6c 22 2c 20 70 54 61 62 2d 3e 7a 4e 61  "tbl", pTab->zNa
14bb0 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  me);.    sqlite3
14bc0 46 6b 44 72 6f 70 54 61 62 6c 65 28 70 50 61 72  FkDropTable(pPar
14bd0 73 65 2c 20 70 4e 61 6d 65 2c 20 70 54 61 62 29  se, pName, pTab)
14be0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64  ;.    sqlite3Cod
14bf0 65 44 72 6f 70 54 61 62 6c 65 28 70 50 61 72 73  eDropTable(pPars
14c00 65 2c 20 70 54 61 62 2c 20 69 44 62 2c 20 69 73  e, pTab, iDb, is
14c10 56 69 65 77 29 3b 0a 20 20 7d 0a 0a 65 78 69 74  View);.  }..exit
14c20 5f 64 72 6f 70 5f 74 61 62 6c 65 3a 0a 20 20 73  _drop_table:.  s
14c30 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c  qlite3SrcListDel
14c40 65 74 65 28 64 62 2c 20 70 4e 61 6d 65 29 3b 0a  ete(db, pName);.
14c50 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
14c60 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
14c70 74 6f 20 63 72 65 61 74 65 20 61 20 6e 65 77 20  to create a new 
14c80 66 6f 72 65 69 67 6e 20 6b 65 79 20 6f 6e 20 74  foreign key on t
14c90 68 65 20 74 61 62 6c 65 0a 2a 2a 20 63 75 72 72  he table.** curr
14ca0 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73  ently under cons
14cb0 74 72 75 63 74 69 6f 6e 2e 20 20 70 46 72 6f 6d  truction.  pFrom
14cc0 43 6f 6c 20 64 65 74 65 72 6d 69 6e 65 73 20 77  Col determines w
14cd0 68 69 63 68 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20  hich columns.** 
14ce0 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 74  in the current t
14cf0 61 62 6c 65 20 70 6f 69 6e 74 20 74 6f 20 74 68  able point to th
14d00 65 20 66 6f 72 65 69 67 6e 20 6b 65 79 2e 20 20  e foreign key.  
14d10 49 66 20 70 46 72 6f 6d 43 6f 6c 3d 3d 30 20 74  If pFromCol==0 t
14d20 68 65 6e 0a 2a 2a 20 63 6f 6e 6e 65 63 74 20 74  hen.** connect t
14d30 68 65 20 6b 65 79 20 74 6f 20 74 68 65 20 6c 61  he key to the la
14d40 73 74 20 63 6f 6c 75 6d 6e 20 69 6e 73 65 72 74  st column insert
14d50 65 64 2e 20 20 70 54 6f 20 69 73 20 74 68 65 20  ed.  pTo is the 
14d60 6e 61 6d 65 20 6f 66 0a 2a 2a 20 74 68 65 20 74  name of.** the t
14d70 61 62 6c 65 20 72 65 66 65 72 72 65 64 20 74 6f  able referred to
14d80 20 28 61 2e 6b 2e 61 20 74 68 65 20 22 70 61 72   (a.k.a the "par
14d90 65 6e 74 22 20 74 61 62 6c 65 29 2e 20 20 70 54  ent" table).  pT
14da0 6f 43 6f 6c 20 69 73 20 61 20 6c 69 73 74 0a 2a  oCol is a list.*
14db0 2a 20 6f 66 20 74 61 62 6c 65 73 20 69 6e 20 74  * of tables in t
14dc0 68 65 20 70 61 72 65 6e 74 20 70 54 6f 20 74 61  he parent pTo ta
14dd0 62 6c 65 2e 20 20 66 6c 61 67 73 20 63 6f 6e 74  ble.  flags cont
14de0 61 69 6e 73 20 61 6c 6c 0a 2a 2a 20 69 6e 66 6f  ains all.** info
14df0 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68  rmation about th
14e00 65 20 63 6f 6e 66 6c 69 63 74 20 72 65 73 6f 6c  e conflict resol
14e10 75 74 69 6f 6e 20 61 6c 67 6f 72 69 74 68 6d 73  ution algorithms
14e20 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 69 6e   specified.** in
14e30 20 74 68 65 20 4f 4e 20 44 45 4c 45 54 45 2c 20   the ON DELETE, 
14e40 4f 4e 20 55 50 44 41 54 45 20 61 6e 64 20 4f 4e  ON UPDATE and ON
14e50 20 49 4e 53 45 52 54 20 63 6c 61 75 73 65 73 2e   INSERT clauses.
14e60 0a 2a 2a 0a 2a 2a 20 41 6e 20 46 4b 65 79 20 73  .**.** An FKey s
14e70 74 72 75 63 74 75 72 65 20 69 73 20 63 72 65 61  tructure is crea
14e80 74 65 64 20 61 6e 64 20 61 64 64 65 64 20 74 6f  ted and added to
14e90 20 74 68 65 20 74 61 62 6c 65 20 63 75 72 72 65   the table curre
14ea0 6e 74 6c 79 0a 2a 2a 20 75 6e 64 65 72 20 63 6f  ntly.** under co
14eb0 6e 73 74 72 75 63 74 69 6f 6e 20 69 6e 20 74 68  nstruction in th
14ec0 65 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  e pParse->pNewTa
14ed0 62 6c 65 20 66 69 65 6c 64 2e 0a 2a 2a 0a 2a 2a  ble field..**.**
14ee0 20 54 68 65 20 66 6f 72 65 69 67 6e 20 6b 65 79   The foreign key
14ef0 20 69 73 20 73 65 74 20 66 6f 72 20 49 4d 4d 45   is set for IMME
14f00 44 49 41 54 45 20 70 72 6f 63 65 73 73 69 6e 67  DIATE processing
14f10 2e 20 20 41 20 73 75 62 73 65 71 75 65 6e 74 20  .  A subsequent 
14f20 63 61 6c 6c 0a 2a 2a 20 74 6f 20 73 71 6c 69 74  call.** to sqlit
14f30 65 33 44 65 66 65 72 46 6f 72 65 69 67 6e 4b 65  e3DeferForeignKe
14f40 79 28 29 20 6d 69 67 68 74 20 63 68 61 6e 67 65  y() might change
14f50 20 74 68 69 73 20 74 6f 20 44 45 46 45 52 52 45   this to DEFERRE
14f60 44 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  D..*/.void sqlit
14f70 65 33 43 72 65 61 74 65 46 6f 72 65 69 67 6e 4b  e3CreateForeignK
14f80 65 79 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ey(.  Parse *pPa
14f90 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 50 61  rse,       /* Pa
14fa0 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
14fb0 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 46 72  .  ExprList *pFr
14fc0 6f 6d 43 6f 6c 2c 20 20 2f 2a 20 43 6f 6c 75 6d  omCol,  /* Colum
14fd0 6e 73 20 69 6e 20 74 68 69 73 20 74 61 62 6c 65  ns in this table
14fe0 20 74 68 61 74 20 70 6f 69 6e 74 20 74 6f 20 6f   that point to o
14ff0 74 68 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20  ther table */.  
15000 54 6f 6b 65 6e 20 2a 70 54 6f 2c 20 20 20 20 20  Token *pTo,     
15010 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
15020 74 68 65 20 6f 74 68 65 72 20 74 61 62 6c 65 20  the other table 
15030 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
15040 54 6f 43 6f 6c 2c 20 20 20 20 2f 2a 20 43 6f 6c  ToCol,    /* Col
15050 75 6d 6e 73 20 69 6e 20 74 68 65 20 6f 74 68 65  umns in the othe
15060 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74  r table */.  int
15070 20 66 6c 61 67 73 20 20 20 20 20 20 20 20 20 20   flags          
15080 20 20 2f 2a 20 43 6f 6e 66 6c 69 63 74 20 72 65    /* Conflict re
15090 73 6f 6c 75 74 69 6f 6e 20 61 6c 67 6f 72 69 74  solution algorit
150a0 68 6d 73 2e 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c  hms. */.){.  sql
150b0 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
150c0 65 2d 3e 64 62 3b 0a 23 69 66 6e 64 65 66 20 53  e->db;.#ifndef S
150d0 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49  QLITE_OMIT_FOREI
150e0 47 4e 5f 4b 45 59 0a 20 20 46 4b 65 79 20 2a 70  GN_KEY.  FKey *p
150f0 46 4b 65 79 20 3d 20 30 3b 0a 20 20 46 4b 65 79  FKey = 0;.  FKey
15100 20 2a 70 4e 65 78 74 54 6f 3b 0a 20 20 54 61 62   *pNextTo;.  Tab
15110 6c 65 20 2a 70 20 3d 20 70 50 61 72 73 65 2d 3e  le *p = pParse->
15120 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 69 6e 74  pNewTable;.  int
15130 20 6e 42 79 74 65 3b 0a 20 20 69 6e 74 20 69 3b   nByte;.  int i;
15140 0a 20 20 69 6e 74 20 6e 43 6f 6c 3b 0a 20 20 63  .  int nCol;.  c
15150 68 61 72 20 2a 7a 3b 0a 0a 20 20 61 73 73 65 72  har *z;..  asser
15160 74 28 20 70 54 6f 21 3d 30 20 29 3b 0a 20 20 69  t( pTo!=0 );.  i
15170 66 28 20 70 3d 3d 30 20 7c 7c 20 49 4e 5f 44 45  f( p==0 || IN_DE
15180 43 4c 41 52 45 5f 56 54 41 42 20 29 20 67 6f 74  CLARE_VTAB ) got
15190 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 69 66 28 20  o fk_end;.  if( 
151a0 70 46 72 6f 6d 43 6f 6c 3d 3d 30 20 29 7b 0a 20  pFromCol==0 ){. 
151b0 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 2d     int iCol = p-
151c0 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 20 20 69 66 28  >nCol-1;.    if(
151d0 20 4e 45 56 45 52 28 69 43 6f 6c 3c 30 29 20 29   NEVER(iCol<0) )
151e0 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20   goto fk_end;.  
151f0 20 20 69 66 28 20 70 54 6f 43 6f 6c 20 26 26 20    if( pToCol && 
15200 70 54 6f 43 6f 6c 2d 3e 6e 45 78 70 72 21 3d 31  pToCol->nExpr!=1
15210 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
15220 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
15230 2c 20 22 66 6f 72 65 69 67 6e 20 6b 65 79 20 6f  , "foreign key o
15240 6e 20 25 73 22 0a 20 20 20 20 20 20 20 20 20 22  n %s".         "
15250 20 73 68 6f 75 6c 64 20 72 65 66 65 72 65 6e 63   should referenc
15260 65 20 6f 6e 6c 79 20 6f 6e 65 20 63 6f 6c 75 6d  e only one colum
15270 6e 20 6f 66 20 74 61 62 6c 65 20 25 54 22 2c 0a  n of table %T",.
15280 20 20 20 20 20 20 20 20 20 70 2d 3e 61 43 6f 6c           p->aCol
15290 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 2c 20 70 54  [iCol].zName, pT
152a0 6f 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 66  o);.      goto f
152b0 6b 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 20  k_end;.    }.   
152c0 20 6e 43 6f 6c 20 3d 20 31 3b 0a 20 20 7d 65 6c   nCol = 1;.  }el
152d0 73 65 20 69 66 28 20 70 54 6f 43 6f 6c 20 26 26  se if( pToCol &&
152e0 20 70 54 6f 43 6f 6c 2d 3e 6e 45 78 70 72 21 3d   pToCol->nExpr!=
152f0 70 46 72 6f 6d 43 6f 6c 2d 3e 6e 45 78 70 72 20  pFromCol->nExpr 
15300 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
15310 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 0a 20  rorMsg(pParse,. 
15320 20 20 20 20 20 20 20 22 6e 75 6d 62 65 72 20 6f         "number o
15330 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 66 6f 72  f columns in for
15340 65 69 67 6e 20 6b 65 79 20 64 6f 65 73 20 6e 6f  eign key does no
15350 74 20 6d 61 74 63 68 20 74 68 65 20 6e 75 6d 62  t match the numb
15360 65 72 20 6f 66 20 22 0a 20 20 20 20 20 20 20 20  er of ".        
15370 22 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20  "columns in the 
15380 72 65 66 65 72 65 6e 63 65 64 20 74 61 62 6c 65  referenced table
15390 22 29 3b 0a 20 20 20 20 67 6f 74 6f 20 66 6b 5f  ");.    goto fk_
153a0 65 6e 64 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  end;.  }else{.  
153b0 20 20 6e 43 6f 6c 20 3d 20 70 46 72 6f 6d 43 6f    nCol = pFromCo
153c0 6c 2d 3e 6e 45 78 70 72 3b 0a 20 20 7d 0a 20 20  l->nExpr;.  }.  
153d0 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f 66 28 2a  nByte = sizeof(*
153e0 70 46 4b 65 79 29 20 2b 20 28 6e 43 6f 6c 2d 31  pFKey) + (nCol-1
153f0 29 2a 73 69 7a 65 6f 66 28 70 46 4b 65 79 2d 3e  )*sizeof(pFKey->
15400 61 43 6f 6c 5b 30 5d 29 20 2b 20 70 54 6f 2d 3e  aCol[0]) + pTo->
15410 6e 20 2b 20 31 3b 0a 20 20 69 66 28 20 70 54 6f  n + 1;.  if( pTo
15420 43 6f 6c 20 29 7b 0a 20 20 20 20 66 6f 72 28 69  Col ){.    for(i
15430 3d 30 3b 20 69 3c 70 54 6f 43 6f 6c 2d 3e 6e 45  =0; i<pToCol->nE
15440 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  xpr; i++){.     
15450 20 6e 42 79 74 65 20 2b 3d 20 73 71 6c 69 74 65   nByte += sqlite
15460 33 53 74 72 6c 65 6e 33 30 28 70 54 6f 43 6f 6c  3Strlen30(pToCol
15470 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 20 2b 20  ->a[i].zName) + 
15480 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70  1;.    }.  }.  p
15490 46 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 44 62  FKey = sqlite3Db
154a0 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 6e  MallocZero(db, n
154b0 42 79 74 65 20 29 3b 0a 20 20 69 66 28 20 70 46  Byte );.  if( pF
154c0 4b 65 79 3d 3d 30 20 29 7b 0a 20 20 20 20 67 6f  Key==0 ){.    go
154d0 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 7d 0a 20  to fk_end;.  }. 
154e0 20 70 46 4b 65 79 2d 3e 70 46 72 6f 6d 20 3d 20   pFKey->pFrom = 
154f0 70 3b 0a 20 20 70 46 4b 65 79 2d 3e 70 4e 65 78  p;.  pFKey->pNex
15500 74 46 72 6f 6d 20 3d 20 70 2d 3e 70 46 4b 65 79  tFrom = p->pFKey
15510 3b 0a 20 20 7a 20 3d 20 28 63 68 61 72 2a 29 26  ;.  z = (char*)&
15520 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b 6e 43 6f 6c  pFKey->aCol[nCol
15530 5d 3b 0a 20 20 70 46 4b 65 79 2d 3e 7a 54 6f 20  ];.  pFKey->zTo 
15540 3d 20 7a 3b 0a 20 20 6d 65 6d 63 70 79 28 7a 2c  = z;.  memcpy(z,
15550 20 70 54 6f 2d 3e 7a 2c 20 70 54 6f 2d 3e 6e 29   pTo->z, pTo->n)
15560 3b 0a 20 20 7a 5b 70 54 6f 2d 3e 6e 5d 20 3d 20  ;.  z[pTo->n] = 
15570 30 3b 0a 20 20 73 71 6c 69 74 65 33 44 65 71 75  0;.  sqlite3Dequ
15580 6f 74 65 28 7a 29 3b 0a 20 20 7a 20 2b 3d 20 70  ote(z);.  z += p
15590 54 6f 2d 3e 6e 2b 31 3b 0a 20 20 70 46 4b 65 79  To->n+1;.  pFKey
155a0 2d 3e 6e 43 6f 6c 20 3d 20 6e 43 6f 6c 3b 0a 20  ->nCol = nCol;. 
155b0 20 69 66 28 20 70 46 72 6f 6d 43 6f 6c 3d 3d 30   if( pFromCol==0
155c0 20 29 7b 0a 20 20 20 20 70 46 4b 65 79 2d 3e 61   ){.    pFKey->a
155d0 43 6f 6c 5b 30 5d 2e 69 46 72 6f 6d 20 3d 20 70  Col[0].iFrom = p
155e0 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 7d 65 6c 73  ->nCol-1;.  }els
155f0 65 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  e{.    for(i=0; 
15600 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  i<nCol; i++){.  
15610 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20      int j;.     
15620 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 2d 3e 6e   for(j=0; j<p->n
15630 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  Col; j++){.     
15640 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74     if( sqlite3St
15650 72 49 43 6d 70 28 70 2d 3e 61 43 6f 6c 5b 6a 5d  rICmp(p->aCol[j]
15660 2e 7a 4e 61 6d 65 2c 20 70 46 72 6f 6d 43 6f 6c  .zName, pFromCol
15670 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30  ->a[i].zName)==0
15680 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 46   ){.          pF
15690 4b 65 79 2d 3e 61 43 6f 6c 5b 69 5d 2e 69 46 72  Key->aCol[i].iFr
156a0 6f 6d 20 3d 20 6a 3b 0a 20 20 20 20 20 20 20 20  om = j;.        
156b0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
156c0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
156d0 20 69 66 28 20 6a 3e 3d 70 2d 3e 6e 43 6f 6c 20   if( j>=p->nCol 
156e0 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
156f0 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
15700 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20 22 75  e, .          "u
15710 6e 6b 6e 6f 77 6e 20 63 6f 6c 75 6d 6e 20 5c 22  nknown column \"
15720 25 73 5c 22 20 69 6e 20 66 6f 72 65 69 67 6e 20  %s\" in foreign 
15730 6b 65 79 20 64 65 66 69 6e 69 74 69 6f 6e 22 2c  key definition",
15740 20 0a 20 20 20 20 20 20 20 20 20 20 70 46 72 6f   .          pFro
15750 6d 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  mCol->a[i].zName
15760 29 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  );.        goto 
15770 66 6b 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a  fk_end;.      }.
15780 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
15790 70 54 6f 43 6f 6c 20 29 7b 0a 20 20 20 20 66 6f  pToCol ){.    fo
157a0 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69  r(i=0; i<nCol; i
157b0 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e  ++){.      int n
157c0 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
157d0 33 30 28 70 54 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e  30(pToCol->a[i].
157e0 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 70 46  zName);.      pF
157f0 4b 65 79 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 43 6f  Key->aCol[i].zCo
15800 6c 20 3d 20 7a 3b 0a 20 20 20 20 20 20 6d 65 6d  l = z;.      mem
15810 63 70 79 28 7a 2c 20 70 54 6f 43 6f 6c 2d 3e 61  cpy(z, pToCol->a
15820 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 6e 29 3b 0a 20  [i].zName, n);. 
15830 20 20 20 20 20 7a 5b 6e 5d 20 3d 20 30 3b 0a 20       z[n] = 0;. 
15840 20 20 20 20 20 7a 20 2b 3d 20 6e 2b 31 3b 0a 20       z += n+1;. 
15850 20 20 20 7d 0a 20 20 7d 0a 20 20 70 46 4b 65 79     }.  }.  pFKey
15860 2d 3e 69 73 44 65 66 65 72 72 65 64 20 3d 20 30  ->isDeferred = 0
15870 3b 0a 20 20 70 46 4b 65 79 2d 3e 61 41 63 74 69  ;.  pFKey->aActi
15880 6f 6e 5b 30 5d 20 3d 20 28 75 38 29 28 66 6c 61  on[0] = (u8)(fla
15890 67 73 20 26 20 30 78 66 66 29 3b 20 20 20 20 20  gs & 0xff);     
158a0 20 20 20 20 20 20 20 2f 2a 20 4f 4e 20 44 45 4c         /* ON DEL
158b0 45 54 45 20 61 63 74 69 6f 6e 20 2a 2f 0a 20 20  ETE action */.  
158c0 70 46 4b 65 79 2d 3e 61 41 63 74 69 6f 6e 5b 31  pFKey->aAction[1
158d0 5d 20 3d 20 28 75 38 29 28 28 66 6c 61 67 73 20  ] = (u8)((flags 
158e0 3e 3e 20 38 20 29 20 26 20 30 78 66 66 29 3b 20  >> 8 ) & 0xff); 
158f0 20 20 20 2f 2a 20 4f 4e 20 55 50 44 41 54 45 20     /* ON UPDATE 
15900 61 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20 61 73 73  action */..  ass
15910 65 72 74 28 20 73 71 6c 69 74 65 33 53 63 68 65  ert( sqlite3Sche
15920 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20  maMutexHeld(db, 
15930 30 2c 20 70 2d 3e 70 53 63 68 65 6d 61 29 20 29  0, p->pSchema) )
15940 3b 0a 20 20 70 4e 65 78 74 54 6f 20 3d 20 28 46  ;.  pNextTo = (F
15950 4b 65 79 20 2a 29 73 71 6c 69 74 65 33 48 61 73  Key *)sqlite3Has
15960 68 49 6e 73 65 72 74 28 26 70 2d 3e 70 53 63 68  hInsert(&p->pSch
15970 65 6d 61 2d 3e 66 6b 65 79 48 61 73 68 2c 20 0a  ema->fkeyHash, .
15980 20 20 20 20 20 20 70 46 4b 65 79 2d 3e 7a 54 6f        pFKey->zTo
15990 2c 20 28 76 6f 69 64 20 2a 29 70 46 4b 65 79 0a  , (void *)pFKey.
159a0 20 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 78 74    );.  if( pNext
159b0 54 6f 3d 3d 70 46 4b 65 79 20 29 7b 0a 20 20 20  To==pFKey ){.   
159c0 20 73 71 6c 69 74 65 33 4f 6f 6d 46 61 75 6c 74   sqlite3OomFault
159d0 28 64 62 29 3b 0a 20 20 20 20 67 6f 74 6f 20 66  (db);.    goto f
159e0 6b 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 69 66 28  k_end;.  }.  if(
159f0 20 70 4e 65 78 74 54 6f 20 29 7b 0a 20 20 20 20   pNextTo ){.    
15a00 61 73 73 65 72 74 28 20 70 4e 65 78 74 54 6f 2d  assert( pNextTo-
15a10 3e 70 50 72 65 76 54 6f 3d 3d 30 20 29 3b 0a 20  >pPrevTo==0 );. 
15a20 20 20 20 70 46 4b 65 79 2d 3e 70 4e 65 78 74 54     pFKey->pNextT
15a30 6f 20 3d 20 70 4e 65 78 74 54 6f 3b 0a 20 20 20  o = pNextTo;.   
15a40 20 70 4e 65 78 74 54 6f 2d 3e 70 50 72 65 76 54   pNextTo->pPrevT
15a50 6f 20 3d 20 70 46 4b 65 79 3b 0a 20 20 7d 0a 0a  o = pFKey;.  }..
15a60 20 20 2f 2a 20 4c 69 6e 6b 20 74 68 65 20 66 6f    /* Link the fo
15a70 72 65 69 67 6e 20 6b 65 79 20 74 6f 20 74 68 65  reign key to the
15a80 20 74 61 62 6c 65 20 61 73 20 74 68 65 20 6c 61   table as the la
15a90 73 74 20 73 74 65 70 2e 0a 20 20 2a 2f 0a 20 20  st step..  */.  
15aa0 70 2d 3e 70 46 4b 65 79 20 3d 20 70 46 4b 65 79  p->pFKey = pFKey
15ab0 3b 0a 20 20 70 46 4b 65 79 20 3d 20 30 3b 0a 0a  ;.  pFKey = 0;..
15ac0 66 6b 5f 65 6e 64 3a 0a 20 20 73 71 6c 69 74 65  fk_end:.  sqlite
15ad0 33 44 62 46 72 65 65 28 64 62 2c 20 70 46 4b 65  3DbFree(db, pFKe
15ae0 79 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64  y);.#endif /* !d
15af0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
15b00 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 29 20  IT_FOREIGN_KEY) 
15b10 2a 2f 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  */.  sqlite3Expr
15b20 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70  ListDelete(db, p
15b30 46 72 6f 6d 43 6f 6c 29 3b 0a 20 20 73 71 6c 69  FromCol);.  sqli
15b40 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
15b50 65 28 64 62 2c 20 70 54 6f 43 6f 6c 29 3b 0a 7d  e(db, pToCol);.}
15b60 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
15b70 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77  tine is called w
15b80 68 65 6e 20 61 6e 20 49 4e 49 54 49 41 4c 4c 59  hen an INITIALLY
15b90 20 49 4d 4d 45 44 49 41 54 45 20 6f 72 20 49 4e   IMMEDIATE or IN
15ba0 49 54 49 41 4c 4c 59 20 44 45 46 45 52 52 45 44  ITIALLY DEFERRED
15bb0 0a 2a 2a 20 63 6c 61 75 73 65 20 69 73 20 73 65  .** clause is se
15bc0 65 6e 20 61 73 20 70 61 72 74 20 6f 66 20 61 20  en as part of a 
15bd0 66 6f 72 65 69 67 6e 20 6b 65 79 20 64 65 66 69  foreign key defi
15be0 6e 69 74 69 6f 6e 2e 20 20 54 68 65 20 69 73 44  nition.  The isD
15bf0 65 66 65 72 72 65 64 0a 2a 2a 20 70 61 72 61 6d  eferred.** param
15c00 65 74 65 72 20 69 73 20 31 20 66 6f 72 20 49 4e  eter is 1 for IN
15c10 49 54 49 41 4c 4c 59 20 44 45 46 45 52 52 45 44  ITIALLY DEFERRED
15c20 20 61 6e 64 20 30 20 66 6f 72 20 49 4e 49 54 49   and 0 for INITI
15c30 41 4c 4c 59 20 49 4d 4d 45 44 49 41 54 45 2e 0a  ALLY IMMEDIATE..
15c40 2a 2a 20 54 68 65 20 62 65 68 61 76 69 6f 72 20  ** The behavior 
15c50 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  of the most rece
15c60 6e 74 6c 79 20 63 72 65 61 74 65 64 20 66 6f 72  ntly created for
15c70 65 69 67 6e 20 6b 65 79 20 69 73 20 61 64 6a 75  eign key is adju
15c80 73 74 65 64 0a 2a 2a 20 61 63 63 6f 72 64 69 6e  sted.** accordin
15c90 67 6c 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  gly..*/.void sql
15ca0 69 74 65 33 44 65 66 65 72 46 6f 72 65 69 67 6e  ite3DeferForeign
15cb0 4b 65 79 28 50 61 72 73 65 20 2a 70 50 61 72 73  Key(Parse *pPars
15cc0 65 2c 20 69 6e 74 20 69 73 44 65 66 65 72 72 65  e, int isDeferre
15cd0 64 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  d){.#ifndef SQLI
15ce0 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f  TE_OMIT_FOREIGN_
15cf0 4b 45 59 0a 20 20 54 61 62 6c 65 20 2a 70 54 61  KEY.  Table *pTa
15d00 62 3b 0a 20 20 46 4b 65 79 20 2a 70 46 4b 65 79  b;.  FKey *pFKey
15d10 3b 0a 20 20 69 66 28 20 28 70 54 61 62 20 3d 20  ;.  if( (pTab = 
15d20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
15d30 65 29 3d 3d 30 20 7c 7c 20 28 70 46 4b 65 79 20  e)==0 || (pFKey 
15d40 3d 20 70 54 61 62 2d 3e 70 46 4b 65 79 29 3d 3d  = pTab->pFKey)==
15d50 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73  0 ) return;.  as
15d60 73 65 72 74 28 20 69 73 44 65 66 65 72 72 65 64  sert( isDeferred
15d70 3d 3d 30 20 7c 7c 20 69 73 44 65 66 65 72 72 65  ==0 || isDeferre
15d80 64 3d 3d 31 20 29 3b 20 2f 2a 20 45 56 3a 20 52  d==1 ); /* EV: R
15d90 2d 33 30 33 32 33 2d 32 31 39 31 37 20 2a 2f 0a  -30323-21917 */.
15da0 20 20 70 46 4b 65 79 2d 3e 69 73 44 65 66 65 72    pFKey->isDefer
15db0 72 65 64 20 3d 20 28 75 38 29 69 73 44 65 66 65  red = (u8)isDefe
15dc0 72 72 65 64 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a  rred;.#endif.}..
15dd0 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
15de0 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 65 72  ode that will er
15df0 61 73 65 20 61 6e 64 20 72 65 66 69 6c 6c 20 69  ase and refill i
15e00 6e 64 65 78 20 2a 70 49 64 78 2e 20 20 54 68 69  ndex *pIdx.  Thi
15e10 73 20 69 73 0a 2a 2a 20 75 73 65 64 20 74 6f 20  s is.** used to 
15e20 69 6e 69 74 69 61 6c 69 7a 65 20 61 20 6e 65 77  initialize a new
15e30 6c 79 20 63 72 65 61 74 65 64 20 69 6e 64 65 78  ly created index
15e40 20 6f 72 20 74 6f 20 72 65 63 6f 6d 70 75 74 65   or to recompute
15e50 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20   the.** content 
15e60 6f 66 20 61 6e 20 69 6e 64 65 78 20 69 6e 20 72  of an index in r
15e70 65 73 70 6f 6e 73 65 20 74 6f 20 61 20 52 45 49  esponse to a REI
15e80 4e 44 45 58 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a  NDEX command..**
15e90 0a 2a 2a 20 69 66 20 6d 65 6d 52 6f 6f 74 50 61  .** if memRootPa
15ea0 67 65 20 69 73 20 6e 6f 74 20 6e 65 67 61 74 69  ge is not negati
15eb0 76 65 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61  ve, it means tha
15ec0 74 20 74 68 65 20 69 6e 64 65 78 20 69 73 20 6e  t the index is n
15ed0 65 77 6c 79 0a 2a 2a 20 63 72 65 61 74 65 64 2e  ewly.** created.
15ee0 20 20 54 68 65 20 72 65 67 69 73 74 65 72 20 73    The register s
15ef0 70 65 63 69 66 69 65 64 20 62 79 20 6d 65 6d 52  pecified by memR
15f00 6f 6f 74 50 61 67 65 20 63 6f 6e 74 61 69 6e 73  ootPage contains
15f10 20 74 68 65 0a 2a 2a 20 72 6f 6f 74 20 70 61 67   the.** root pag
15f20 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  e number of the 
15f30 69 6e 64 65 78 2e 20 20 49 66 20 6d 65 6d 52 6f  index.  If memRo
15f40 6f 74 50 61 67 65 20 69 73 20 6e 65 67 61 74 69  otPage is negati
15f50 76 65 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20  ve, then.** the 
15f60 69 6e 64 65 78 20 61 6c 72 65 61 64 79 20 65 78  index already ex
15f70 69 73 74 73 20 61 6e 64 20 6d 75 73 74 20 62 65  ists and must be
15f80 20 63 6c 65 61 72 65 64 20 62 65 66 6f 72 65 20   cleared before 
15f90 62 65 69 6e 67 20 72 65 66 69 6c 6c 65 64 20 61  being refilled a
15fa0 6e 64 0a 2a 2a 20 74 68 65 20 72 6f 6f 74 20 70  nd.** the root p
15fb0 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68  age number of th
15fc0 65 20 69 6e 64 65 78 20 69 73 20 74 61 6b 65 6e  e index is taken
15fd0 20 66 72 6f 6d 20 70 49 6e 64 65 78 2d 3e 74 6e   from pIndex->tn
15fe0 75 6d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  um..*/.static vo
15ff0 69 64 20 73 71 6c 69 74 65 33 52 65 66 69 6c 6c  id sqlite3Refill
16000 49 6e 64 65 78 28 50 61 72 73 65 20 2a 70 50 61  Index(Parse *pPa
16010 72 73 65 2c 20 49 6e 64 65 78 20 2a 70 49 6e 64  rse, Index *pInd
16020 65 78 2c 20 69 6e 74 20 6d 65 6d 52 6f 6f 74 50  ex, int memRootP
16030 61 67 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70  age){.  Table *p
16040 54 61 62 20 3d 20 70 49 6e 64 65 78 2d 3e 70 54  Tab = pIndex->pT
16050 61 62 6c 65 3b 20 20 2f 2a 20 54 68 65 20 74 61  able;  /* The ta
16060 62 6c 65 20 74 68 61 74 20 69 73 20 69 6e 64 65  ble that is inde
16070 78 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61  xed */.  int iTa
16080 62 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  b = pParse->nTab
16090 2b 2b 3b 20 20 20 20 20 2f 2a 20 42 74 72 65 65  ++;     /* Btree
160a0 20 63 75 72 73 6f 72 20 75 73 65 64 20 66 6f 72   cursor used for
160b0 20 70 54 61 62 20 2a 2f 0a 20 20 69 6e 74 20 69   pTab */.  int i
160c0 49 64 78 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  Idx = pParse->nT
160d0 61 62 2b 2b 3b 20 20 20 20 20 2f 2a 20 42 74 72  ab++;     /* Btr
160e0 65 65 20 63 75 72 73 6f 72 20 75 73 65 64 20 66  ee cursor used f
160f0 6f 72 20 70 49 6e 64 65 78 20 2a 2f 0a 20 20 69  or pIndex */.  i
16100 6e 74 20 69 53 6f 72 74 65 72 3b 20 20 20 20 20  nt iSorter;     
16110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
16120 20 43 75 72 73 6f 72 20 6f 70 65 6e 65 64 20 62   Cursor opened b
16130 79 20 4f 70 65 6e 53 6f 72 74 65 72 20 28 69 66  y OpenSorter (if
16140 20 69 6e 20 75 73 65 29 20 2a 2f 0a 20 20 69 6e   in use) */.  in
16150 74 20 61 64 64 72 31 3b 20 20 20 20 20 20 20 20  t addr1;        
16160 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
16170 41 64 64 72 65 73 73 20 6f 66 20 74 6f 70 20 6f  Address of top o
16180 66 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20  f loop */.  int 
16190 61 64 64 72 32 3b 20 20 20 20 20 20 20 20 20 20  addr2;          
161a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64             /* Ad
161b0 64 72 65 73 73 20 74 6f 20 6a 75 6d 70 20 74 6f  dress to jump to
161c0 20 66 6f 72 20 6e 65 78 74 20 69 74 65 72 61 74   for next iterat
161d0 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 74 6e 75  ion */.  int tnu
161e0 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m;              
161f0 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20          /* Root 
16200 70 61 67 65 20 6f 66 20 69 6e 64 65 78 20 2a 2f  page of index */
16210 0a 20 20 69 6e 74 20 69 50 61 72 74 49 64 78 4c  .  int iPartIdxL
16220 61 62 65 6c 3b 20 20 20 20 20 20 20 20 20 20 20  abel;           
16230 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 74 68 69    /* Jump to thi
16240 73 20 6c 61 62 65 6c 20 74 6f 20 73 6b 69 70 20  s label to skip 
16250 61 20 72 6f 77 20 2a 2f 0a 20 20 56 64 62 65 20  a row */.  Vdbe 
16260 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  *v;             
16270 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47 65 6e            /* Gen
16280 65 72 61 74 65 20 63 6f 64 65 20 69 6e 74 6f 20  erate code into 
16290 74 68 69 73 20 76 69 72 74 75 61 6c 20 6d 61 63  this virtual mac
162a0 68 69 6e 65 20 2a 2f 0a 20 20 4b 65 79 49 6e 66  hine */.  KeyInf
162b0 6f 20 2a 70 4b 65 79 3b 20 20 20 20 20 20 20 20  o *pKey;        
162c0 20 20 20 20 20 20 20 20 20 2f 2a 20 4b 65 79 49           /* KeyI
162d0 6e 66 6f 20 66 6f 72 20 69 6e 64 65 78 20 2a 2f  nfo for index */
162e0 0a 20 20 69 6e 74 20 72 65 67 52 65 63 6f 72 64  .  int regRecord
162f0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
16300 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 68 6f    /* Register ho
16310 6c 64 69 6e 67 20 61 73 73 65 6d 62 6c 65 64 20  lding assembled 
16320 69 6e 64 65 78 20 72 65 63 6f 72 64 20 2a 2f 0a  index record */.
16330 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
16340 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 20 20 20  pParse->db;     
16350 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65   /* The database
16360 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20   connection */. 
16370 20 69 6e 74 20 69 44 62 20 3d 20 73 71 6c 69 74   int iDb = sqlit
16380 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28  e3SchemaToIndex(
16390 64 62 2c 20 70 49 6e 64 65 78 2d 3e 70 53 63 68  db, pIndex->pSch
163a0 65 6d 61 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53  ema);..#ifndef S
163b0 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f  QLITE_OMIT_AUTHO
163c0 52 49 5a 41 54 49 4f 4e 0a 20 20 69 66 28 20 73  RIZATION.  if( s
163d0 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28  qlite3AuthCheck(
163e0 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 52  pParse, SQLITE_R
163f0 45 49 4e 44 45 58 2c 20 70 49 6e 64 65 78 2d 3e  EINDEX, pIndex->
16400 7a 4e 61 6d 65 2c 20 30 2c 0a 20 20 20 20 20 20  zName, 0,.      
16410 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61  db->aDb[iDb].zNa
16420 6d 65 20 29 20 29 7b 0a 20 20 20 20 72 65 74 75  me ) ){.    retu
16430 72 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  rn;.  }.#endif..
16440 20 20 2f 2a 20 52 65 71 75 69 72 65 20 61 20 77    /* Require a w
16450 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65  rite-lock on the
16460 20 74 61 62 6c 65 20 74 6f 20 70 65 72 66 6f 72   table to perfor
16470 6d 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e  m this operation
16480 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 54 61 62   */.  sqlite3Tab
16490 6c 65 4c 6f 63 6b 28 70 50 61 72 73 65 2c 20 69  leLock(pParse, i
164a0 44 62 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 2c 20  Db, pTab->tnum, 
164b0 31 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b  1, pTab->zName);
164c0 0a 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47  ..  v = sqlite3G
164d0 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
164e0 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72 65 74    if( v==0 ) ret
164f0 75 72 6e 3b 0a 20 20 69 66 28 20 6d 65 6d 52 6f  urn;.  if( memRo
16500 6f 74 50 61 67 65 3e 3d 30 20 29 7b 0a 20 20 20  otPage>=0 ){.   
16510 20 74 6e 75 6d 20 3d 20 6d 65 6d 52 6f 6f 74 50   tnum = memRootP
16520 61 67 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  age;.  }else{.  
16530 20 20 74 6e 75 6d 20 3d 20 70 49 6e 64 65 78 2d    tnum = pIndex-
16540 3e 74 6e 75 6d 3b 0a 20 20 7d 0a 20 20 70 4b 65  >tnum;.  }.  pKe
16550 79 20 3d 20 73 71 6c 69 74 65 33 4b 65 79 49 6e  y = sqlite3KeyIn
16560 66 6f 4f 66 49 6e 64 65 78 28 70 50 61 72 73 65  foOfIndex(pParse
16570 2c 20 70 49 6e 64 65 78 29 3b 0a 0a 20 20 2f 2a  , pIndex);..  /*
16580 20 4f 70 65 6e 20 74 68 65 20 73 6f 72 74 65 72   Open the sorter
16590 20 63 75 72 73 6f 72 20 69 66 20 77 65 20 61 72   cursor if we ar
165a0 65 20 74 6f 20 75 73 65 20 6f 6e 65 2e 20 2a 2f  e to use one. */
165b0 0a 20 20 69 53 6f 72 74 65 72 20 3d 20 70 50 61  .  iSorter = pPa
165c0 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 73  rse->nTab++;.  s
165d0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
165e0 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 4f 70 65  (v, OP_SorterOpe
165f0 6e 2c 20 69 53 6f 72 74 65 72 2c 20 30 2c 20 70  n, iSorter, 0, p
16600 49 6e 64 65 78 2d 3e 6e 4b 65 79 43 6f 6c 2c 20  Index->nKeyCol, 
16610 28 63 68 61 72 2a 29 0a 20 20 20 20 20 20 20 20  (char*).        
16620 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
16630 74 65 33 4b 65 79 49 6e 66 6f 52 65 66 28 70 4b  te3KeyInfoRef(pK
16640 65 79 29 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29  ey), P4_KEYINFO)
16650 3b 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65  ;..  /* Open the
16660 20 74 61 62 6c 65 2e 20 4c 6f 6f 70 20 74 68 72   table. Loop thr
16670 6f 75 67 68 20 61 6c 6c 20 72 6f 77 73 20 6f 66  ough all rows of
16680 20 74 68 65 20 74 61 62 6c 65 2c 20 69 6e 73 65   the table, inse
16690 72 74 69 6e 67 20 69 6e 64 65 78 0a 20 20 2a 2a  rting index.  **
166a0 20 72 65 63 6f 72 64 73 20 69 6e 74 6f 20 74 68   records into th
166b0 65 20 73 6f 72 74 65 72 2e 20 2a 2f 0a 20 20 73  e sorter. */.  s
166c0 71 6c 69 74 65 33 4f 70 65 6e 54 61 62 6c 65 28  qlite3OpenTable(
166d0 70 50 61 72 73 65 2c 20 69 54 61 62 2c 20 69 44  pParse, iTab, iD
166e0 62 2c 20 70 54 61 62 2c 20 4f 50 5f 4f 70 65 6e  b, pTab, OP_Open
166f0 52 65 61 64 29 3b 0a 20 20 61 64 64 72 31 20 3d  Read);.  addr1 =
16700 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
16710 70 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c  p2(v, OP_Rewind,
16720 20 69 54 61 62 2c 20 30 29 3b 20 56 64 62 65 43   iTab, 0); VdbeC
16730 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 72 65  overage(v);.  re
16740 67 52 65 63 6f 72 64 20 3d 20 73 71 6c 69 74 65  gRecord = sqlite
16750 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
16760 73 65 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33 47  se);..  sqlite3G
16770 65 6e 65 72 61 74 65 49 6e 64 65 78 4b 65 79 28  enerateIndexKey(
16780 70 50 61 72 73 65 2c 70 49 6e 64 65 78 2c 69 54  pParse,pIndex,iT
16790 61 62 2c 72 65 67 52 65 63 6f 72 64 2c 30 2c 26  ab,regRecord,0,&
167a0 69 50 61 72 74 49 64 78 4c 61 62 65 6c 2c 30 2c  iPartIdxLabel,0,
167b0 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  0);.  sqlite3Vdb
167c0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f  eAddOp2(v, OP_So
167d0 72 74 65 72 49 6e 73 65 72 74 2c 20 69 53 6f 72  rterInsert, iSor
167e0 74 65 72 2c 20 72 65 67 52 65 63 6f 72 64 29 3b  ter, regRecord);
167f0 0a 20 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76  .  sqlite3Resolv
16800 65 50 61 72 74 49 64 78 4c 61 62 65 6c 28 70 50  ePartIdxLabel(pP
16810 61 72 73 65 2c 20 69 50 61 72 74 49 64 78 4c 61  arse, iPartIdxLa
16820 62 65 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  bel);.  sqlite3V
16830 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
16840 4e 65 78 74 2c 20 69 54 61 62 2c 20 61 64 64 72  Next, iTab, addr
16850 31 2b 31 29 3b 20 56 64 62 65 43 6f 76 65 72 61  1+1); VdbeCovera
16860 67 65 28 76 29 3b 0a 20 20 73 71 6c 69 74 65 33  ge(v);.  sqlite3
16870 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
16880 61 64 64 72 31 29 3b 0a 20 20 69 66 28 20 6d 65  addr1);.  if( me
16890 6d 52 6f 6f 74 50 61 67 65 3c 30 20 29 20 73 71  mRootPage<0 ) sq
168a0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
168b0 76 2c 20 4f 50 5f 43 6c 65 61 72 2c 20 74 6e 75  v, OP_Clear, tnu
168c0 6d 2c 20 69 44 62 29 3b 0a 20 20 73 71 6c 69 74  m, iDb);.  sqlit
168d0 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
168e0 4f 50 5f 4f 70 65 6e 57 72 69 74 65 2c 20 69 49  OP_OpenWrite, iI
168f0 64 78 2c 20 74 6e 75 6d 2c 20 69 44 62 2c 20 0a  dx, tnum, iDb, .
16900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16910 20 20 20 20 28 63 68 61 72 20 2a 29 70 4b 65 79      (char *)pKey
16920 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20  , P4_KEYINFO);. 
16930 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
16940 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 42  geP5(v, OPFLAG_B
16950 55 4c 4b 43 53 52 7c 28 28 6d 65 6d 52 6f 6f 74  ULKCSR|((memRoot
16960 50 61 67 65 3e 3d 30 29 3f 4f 50 46 4c 41 47 5f  Page>=0)?OPFLAG_
16970 50 32 49 53 52 45 47 3a 30 29 29 3b 0a 0a 20 20  P2ISREG:0));..  
16980 61 64 64 72 31 20 3d 20 73 71 6c 69 74 65 33 56  addr1 = sqlite3V
16990 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
169a0 53 6f 72 74 65 72 53 6f 72 74 2c 20 69 53 6f 72  SorterSort, iSor
169b0 74 65 72 2c 20 30 29 3b 20 56 64 62 65 43 6f 76  ter, 0); VdbeCov
169c0 65 72 61 67 65 28 76 29 3b 0a 20 20 61 73 73 65  erage(v);.  asse
169d0 72 74 28 20 70 4b 65 79 21 3d 30 20 7c 7c 20 64  rt( pKey!=0 || d
169e0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
169f0 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20  || pParse->nErr 
16a00 29 3b 0a 20 20 69 66 28 20 49 73 55 6e 69 71 75  );.  if( IsUniqu
16a10 65 49 6e 64 65 78 28 70 49 6e 64 65 78 29 20 26  eIndex(pIndex) &
16a20 26 20 70 4b 65 79 21 3d 30 20 29 7b 0a 20 20 20  & pKey!=0 ){.   
16a30 20 69 6e 74 20 6a 32 20 3d 20 73 71 6c 69 74 65   int j2 = sqlite
16a40 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
16a50 28 76 29 20 2b 20 33 3b 0a 20 20 20 20 73 71 6c  (v) + 3;.    sql
16a60 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20  ite3VdbeGoto(v, 
16a70 6a 32 29 3b 0a 20 20 20 20 61 64 64 72 32 20 3d  j2);.    addr2 =
16a80 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
16a90 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20  entAddr(v);.    
16aa0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
16ab0 34 49 6e 74 28 76 2c 20 4f 50 5f 53 6f 72 74 65  4Int(v, OP_Sorte
16ac0 72 43 6f 6d 70 61 72 65 2c 20 69 53 6f 72 74 65  rCompare, iSorte
16ad0 72 2c 20 6a 32 2c 20 72 65 67 52 65 63 6f 72 64  r, j2, regRecord
16ae0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
16af0 20 20 20 20 20 20 20 20 20 20 20 70 49 6e 64 65             pInde
16b00 78 2d 3e 6e 4b 65 79 43 6f 6c 29 3b 20 56 64 62  x->nKeyCol); Vdb
16b10 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
16b20 20 20 73 71 6c 69 74 65 33 55 6e 69 71 75 65 43    sqlite3UniqueC
16b30 6f 6e 73 74 72 61 69 6e 74 28 70 50 61 72 73 65  onstraint(pParse
16b40 2c 20 4f 45 5f 41 62 6f 72 74 2c 20 70 49 6e 64  , OE_Abort, pInd
16b50 65 78 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ex);.  }else{.  
16b60 20 20 61 64 64 72 32 20 3d 20 73 71 6c 69 74 65    addr2 = sqlite
16b70 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
16b80 28 76 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  (v);.  }.  sqlit
16b90 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
16ba0 4f 50 5f 53 6f 72 74 65 72 44 61 74 61 2c 20 69  OP_SorterData, i
16bb0 53 6f 72 74 65 72 2c 20 72 65 67 52 65 63 6f 72  Sorter, regRecor
16bc0 64 2c 20 69 49 64 78 29 3b 0a 20 20 73 71 6c 69  d, iIdx);.  sqli
16bd0 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
16be0 20 4f 50 5f 4c 61 73 74 2c 20 69 49 64 78 2c 20   OP_Last, iIdx, 
16bf0 30 2c 20 2d 31 29 3b 0a 20 20 73 71 6c 69 74 65  0, -1);.  sqlite
16c00 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
16c10 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 69 49 64  P_IdxInsert, iId
16c20 78 2c 20 72 65 67 52 65 63 6f 72 64 2c 20 30 29  x, regRecord, 0)
16c30 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 43  ;.  sqlite3VdbeC
16c40 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41  hangeP5(v, OPFLA
16c50 47 5f 55 53 45 53 45 45 4b 52 45 53 55 4c 54 29  G_USESEEKRESULT)
16c60 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61  ;.  sqlite3Relea
16c70 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
16c80 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20  , regRecord);.  
16c90 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
16ca0 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 4e 65  2(v, OP_SorterNe
16cb0 78 74 2c 20 69 53 6f 72 74 65 72 2c 20 61 64 64  xt, iSorter, add
16cc0 72 32 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  r2); VdbeCoverag
16cd0 65 28 76 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  e(v);.  sqlite3V
16ce0 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61  dbeJumpHere(v, a
16cf0 64 64 72 31 29 3b 0a 0a 20 20 73 71 6c 69 74 65  ddr1);..  sqlite
16d00 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
16d10 50 5f 43 6c 6f 73 65 2c 20 69 54 61 62 29 3b 0a  P_Close, iTab);.
16d20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
16d30 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c  Op1(v, OP_Close,
16d40 20 69 49 64 78 29 3b 0a 20 20 73 71 6c 69 74 65   iIdx);.  sqlite
16d50 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
16d60 50 5f 43 6c 6f 73 65 2c 20 69 53 6f 72 74 65 72  P_Close, iSorter
16d70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f  );.}../*.** Allo
16d80 63 61 74 65 20 68 65 61 70 20 73 70 61 63 65 20  cate heap space 
16d90 74 6f 20 68 6f 6c 64 20 61 6e 20 49 6e 64 65 78  to hold an Index
16da0 20 6f 62 6a 65 63 74 20 77 69 74 68 20 6e 43 6f   object with nCo
16db0 6c 20 63 6f 6c 75 6d 6e 73 2e 0a 2a 2a 0a 2a 2a  l columns..**.**
16dc0 20 49 6e 63 72 65 61 73 65 20 74 68 65 20 61 6c   Increase the al
16dd0 6c 6f 63 61 74 69 6f 6e 20 73 69 7a 65 20 74 6f  location size to
16de0 20 70 72 6f 76 69 64 65 20 61 6e 20 65 78 74 72   provide an extr
16df0 61 20 6e 45 78 74 72 61 20 62 79 74 65 73 0a 2a  a nExtra bytes.*
16e00 2a 20 6f 66 20 38 2d 62 79 74 65 20 61 6c 69 67  * of 8-byte alig
16e10 6e 65 64 20 73 70 61 63 65 20 61 66 74 65 72 20  ned space after 
16e20 74 68 65 20 49 6e 64 65 78 20 6f 62 6a 65 63 74  the Index object
16e30 20 61 6e 64 20 72 65 74 75 72 6e 20 61 0a 2a 2a   and return a.**
16e40 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 69 73   pointer to this
16e50 20 65 78 74 72 61 20 73 70 61 63 65 20 69 6e 20   extra space in 
16e60 2a 70 70 45 78 74 72 61 2e 0a 2a 2f 0a 49 6e 64  *ppExtra..*/.Ind
16e70 65 78 20 2a 73 71 6c 69 74 65 33 41 6c 6c 6f 63  ex *sqlite3Alloc
16e80 61 74 65 49 6e 64 65 78 4f 62 6a 65 63 74 28 0a  ateIndexObject(.
16e90 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20    sqlite3 *db,  
16ea0 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
16eb0 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f  se connection */
16ec0 0a 20 20 69 31 36 20 6e 43 6f 6c 2c 20 20 20 20  .  i16 nCol,    
16ed0 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c          /* Total
16ee0 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d   number of colum
16ef0 6e 73 20 69 6e 20 74 68 65 20 69 6e 64 65 78 20  ns in the index 
16f00 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 2c  */.  int nExtra,
16f10 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
16f20 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20  ber of bytes of 
16f30 65 78 74 72 61 20 73 70 61 63 65 20 74 6f 20 61  extra space to a
16f40 6c 6c 6f 63 20 2a 2f 0a 20 20 63 68 61 72 20 2a  lloc */.  char *
16f50 2a 70 70 45 78 74 72 61 20 20 20 20 20 20 20 2f  *ppExtra       /
16f60 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  * Pointer to the
16f70 20 22 65 78 74 72 61 22 20 73 70 61 63 65 20 2a   "extra" space *
16f80 2f 0a 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 3b  /.){.  Index *p;
16f90 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
16fa0 6c 6c 6f 63 61 74 65 64 20 69 6e 64 65 78 20 6f  llocated index o
16fb0 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 6e  bject */.  int n
16fc0 42 79 74 65 3b 20 20 20 20 20 20 20 20 20 20 20  Byte;           
16fd0 2f 2a 20 42 79 74 65 73 20 6f 66 20 73 70 61 63  /* Bytes of spac
16fe0 65 20 66 6f 72 20 49 6e 64 65 78 20 6f 62 6a 65  e for Index obje
16ff0 63 74 20 2b 20 61 72 72 61 79 73 20 2a 2f 0a 0a  ct + arrays */..
17000 20 20 6e 42 79 74 65 20 3d 20 52 4f 55 4e 44 38    nByte = ROUND8
17010 28 73 69 7a 65 6f 66 28 49 6e 64 65 78 29 29 20  (sizeof(Index)) 
17020 2b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  +              /
17030 2a 20 49 6e 64 65 78 20 73 74 72 75 63 74 75 72  * Index structur
17040 65 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  e  */.          
17050 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 63 68  ROUND8(sizeof(ch
17060 61 72 2a 29 2a 6e 43 6f 6c 29 20 2b 20 20 20 20  ar*)*nCol) +    
17070 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 2e 61 7a       /* Index.az
17080 43 6f 6c 6c 20 20 20 20 20 2a 2f 0a 20 20 20 20  Coll     */.    
17090 20 20 20 20 20 20 52 4f 55 4e 44 38 28 73 69 7a        ROUND8(siz
170a0 65 6f 66 28 4c 6f 67 45 73 74 29 2a 28 6e 43 6f  eof(LogEst)*(nCo
170b0 6c 2b 31 29 20 2b 20 20 20 20 20 2f 2a 20 49 6e  l+1) +     /* In
170c0 64 65 78 2e 61 69 52 6f 77 4c 6f 67 45 73 74 20  dex.aiRowLogEst 
170d0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20    */.           
170e0 20 20 20 20 20 20 73 69 7a 65 6f 66 28 69 31 36        sizeof(i16
170f0 29 2a 6e 43 6f 6c 20 2b 20 20 20 20 20 20 20 20  )*nCol +        
17100 20 20 20 20 2f 2a 20 49 6e 64 65 78 2e 61 69 43      /* Index.aiC
17110 6f 6c 75 6d 6e 20 20 20 2a 2f 0a 20 20 20 20 20  olumn   */.     
17120 20 20 20 20 20 20 20 20 20 20 20 20 73 69 7a 65              size
17130 6f 66 28 75 38 29 2a 6e 43 6f 6c 29 3b 20 20 20  of(u8)*nCol);   
17140 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
17150 65 78 2e 61 53 6f 72 74 4f 72 64 65 72 20 2a 2f  ex.aSortOrder */
17160 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 44 62  .  p = sqlite3Db
17170 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 6e  MallocZero(db, n
17180 42 79 74 65 20 2b 20 6e 45 78 74 72 61 29 3b 0a  Byte + nExtra);.
17190 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 63    if( p ){.    c
171a0 68 61 72 20 2a 70 45 78 74 72 61 20 3d 20 28 28  har *pExtra = ((
171b0 63 68 61 72 2a 29 70 29 2b 52 4f 55 4e 44 38 28  char*)p)+ROUND8(
171c0 73 69 7a 65 6f 66 28 49 6e 64 65 78 29 29 3b 0a  sizeof(Index));.
171d0 20 20 20 20 70 2d 3e 61 7a 43 6f 6c 6c 20 3d 20      p->azColl = 
171e0 28 63 6f 6e 73 74 20 63 68 61 72 2a 2a 29 70 45  (const char**)pE
171f0 78 74 72 61 3b 20 70 45 78 74 72 61 20 2b 3d 20  xtra; pExtra += 
17200 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 63 68  ROUND8(sizeof(ch
17210 61 72 2a 29 2a 6e 43 6f 6c 29 3b 0a 20 20 20 20  ar*)*nCol);.    
17220 70 2d 3e 61 69 52 6f 77 4c 6f 67 45 73 74 20 3d  p->aiRowLogEst =
17230 20 28 4c 6f 67 45 73 74 2a 29 70 45 78 74 72 61   (LogEst*)pExtra
17240 3b 20 70 45 78 74 72 61 20 2b 3d 20 73 69 7a 65  ; pExtra += size
17250 6f 66 28 4c 6f 67 45 73 74 29 2a 28 6e 43 6f 6c  of(LogEst)*(nCol
17260 2b 31 29 3b 0a 20 20 20 20 70 2d 3e 61 69 43 6f  +1);.    p->aiCo
17270 6c 75 6d 6e 20 3d 20 28 69 31 36 2a 29 70 45 78  lumn = (i16*)pEx
17280 74 72 61 3b 20 20 20 20 20 20 20 70 45 78 74 72  tra;       pExtr
17290 61 20 2b 3d 20 73 69 7a 65 6f 66 28 69 31 36 29  a += sizeof(i16)
172a0 2a 6e 43 6f 6c 3b 0a 20 20 20 20 70 2d 3e 61 53  *nCol;.    p->aS
172b0 6f 72 74 4f 72 64 65 72 20 3d 20 28 75 38 2a 29  ortOrder = (u8*)
172c0 70 45 78 74 72 61 3b 0a 20 20 20 20 70 2d 3e 6e  pExtra;.    p->n
172d0 43 6f 6c 75 6d 6e 20 3d 20 6e 43 6f 6c 3b 0a 20  Column = nCol;. 
172e0 20 20 20 70 2d 3e 6e 4b 65 79 43 6f 6c 20 3d 20     p->nKeyCol = 
172f0 6e 43 6f 6c 20 2d 20 31 3b 0a 20 20 20 20 2a 70  nCol - 1;.    *p
17300 70 45 78 74 72 61 20 3d 20 28 28 63 68 61 72 2a  pExtra = ((char*
17310 29 70 29 20 2b 20 6e 42 79 74 65 3b 0a 20 20 7d  )p) + nByte;.  }
17320 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a  .  return p;.}..
17330 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e  /*.** Create a n
17340 65 77 20 69 6e 64 65 78 20 66 6f 72 20 61 6e 20  ew index for an 
17350 53 51 4c 20 74 61 62 6c 65 2e 20 20 70 4e 61 6d  SQL table.  pNam
17360 65 31 2e 70 4e 61 6d 65 32 20 69 73 20 74 68 65  e1.pName2 is the
17370 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 69 6e 64   name of the ind
17380 65 78 20 0a 2a 2a 20 61 6e 64 20 70 54 62 6c 4c  ex .** and pTblL
17390 69 73 74 20 69 73 20 74 68 65 20 6e 61 6d 65 20  ist is the name 
173a0 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74 68 61  of the table tha
173b0 74 20 69 73 20 74 6f 20 62 65 20 69 6e 64 65 78  t is to be index
173c0 65 64 2e 20 20 42 6f 74 68 20 77 69 6c 6c 20 0a  ed.  Both will .
173d0 2a 2a 20 62 65 20 4e 55 4c 4c 20 66 6f 72 20 61  ** be NULL for a
173e0 20 70 72 69 6d 61 72 79 20 6b 65 79 20 6f 72 20   primary key or 
173f0 61 6e 20 69 6e 64 65 78 20 74 68 61 74 20 69 73  an index that is
17400 20 63 72 65 61 74 65 64 20 74 6f 20 73 61 74 69   created to sati
17410 73 66 79 20 61 0a 2a 2a 20 55 4e 49 51 55 45 20  sfy a.** UNIQUE 
17420 63 6f 6e 73 74 72 61 69 6e 74 2e 20 20 49 66 20  constraint.  If 
17430 70 54 61 62 6c 65 20 61 6e 64 20 70 49 6e 64 65  pTable and pInde
17440 78 20 61 72 65 20 4e 55 4c 4c 2c 20 75 73 65 20  x are NULL, use 
17450 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
17460 65 0a 2a 2a 20 61 73 20 74 68 65 20 74 61 62 6c  e.** as the tabl
17470 65 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64 2e  e to be indexed.
17480 20 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61    pParse->pNewTa
17490 62 6c 65 20 69 73 20 61 20 74 61 62 6c 65 20 74  ble is a table t
174a0 68 61 74 20 69 73 0a 2a 2a 20 63 75 72 72 65 6e  hat is.** curren
174b0 74 6c 79 20 62 65 69 6e 67 20 63 6f 6e 73 74 72  tly being constr
174c0 75 63 74 65 64 20 62 79 20 61 20 43 52 45 41 54  ucted by a CREAT
174d0 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e  E TABLE statemen
174e0 74 2e 0a 2a 2a 0a 2a 2a 20 70 4c 69 73 74 20 69  t..**.** pList i
174f0 73 20 61 20 6c 69 73 74 20 6f 66 20 63 6f 6c 75  s a list of colu
17500 6d 6e 73 20 74 6f 20 62 65 20 69 6e 64 65 78 65  mns to be indexe
17510 64 2e 20 20 70 4c 69 73 74 20 77 69 6c 6c 20 62  d.  pList will b
17520 65 20 4e 55 4c 4c 20 69 66 20 74 68 69 73 0a 2a  e NULL if this.*
17530 2a 20 69 73 20 61 20 70 72 69 6d 61 72 79 20 6b  * is a primary k
17540 65 79 20 6f 72 20 75 6e 69 71 75 65 2d 63 6f 6e  ey or unique-con
17550 73 74 72 61 69 6e 74 20 6f 6e 20 74 68 65 20 6d  straint on the m
17560 6f 73 74 20 72 65 63 65 6e 74 20 63 6f 6c 75 6d  ost recent colum
17570 6e 20 61 64 64 65 64 0a 2a 2a 20 74 6f 20 74 68  n added.** to th
17580 65 20 74 61 62 6c 65 20 63 75 72 72 65 6e 74 6c  e table currentl
17590 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63  y under construc
175a0 74 69 6f 6e 2e 20 20 0a 2a 2a 0a 2a 2a 20 49 66  tion.  .**.** If
175b0 20 74 68 65 20 69 6e 64 65 78 20 69 73 20 63 72   the index is cr
175c0 65 61 74 65 64 20 73 75 63 63 65 73 73 66 75 6c  eated successful
175d0 6c 79 2c 20 72 65 74 75 72 6e 20 61 20 70 6f 69  ly, return a poi
175e0 6e 74 65 72 20 74 6f 20 74 68 65 20 6e 65 77 20  nter to the new 
175f0 49 6e 64 65 78 0a 2a 2a 20 73 74 72 75 63 74 75  Index.** structu
17600 72 65 2e 20 54 68 69 73 20 69 73 20 75 73 65 64  re. This is used
17610 20 62 79 20 73 71 6c 69 74 65 33 41 64 64 50 72   by sqlite3AddPr
17620 69 6d 61 72 79 4b 65 79 28 29 20 74 6f 20 6d 61  imaryKey() to ma
17630 72 6b 20 74 68 65 20 69 6e 64 65 78 0a 2a 2a 20  rk the index.** 
17640 61 73 20 74 68 65 20 74 61 62 6c 65 73 20 70 72  as the tables pr
17650 69 6d 61 72 79 20 6b 65 79 20 28 49 6e 64 65 78  imary key (Index
17660 2e 69 64 78 54 79 70 65 3d 3d 53 51 4c 49 54 45  .idxType==SQLITE
17670 5f 49 44 58 54 59 50 45 5f 50 52 49 4d 41 52 59  _IDXTYPE_PRIMARY
17680 4b 45 59 29 0a 2a 2f 0a 49 6e 64 65 78 20 2a 73  KEY).*/.Index *s
17690 71 6c 69 74 65 33 43 72 65 61 74 65 49 6e 64 65  qlite3CreateInde
176a0 78 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  x(.  Parse *pPar
176b0 73 65 2c 20 20 20 20 20 2f 2a 20 41 6c 6c 20 69  se,     /* All i
176c0 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74  nformation about
176d0 20 74 68 69 73 20 70 61 72 73 65 20 2a 2f 0a 20   this parse */. 
176e0 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c 20   Token *pName1, 
176f0 20 20 20 20 2f 2a 20 46 69 72 73 74 20 70 61 72      /* First par
17700 74 20 6f 66 20 69 6e 64 65 78 20 6e 61 6d 65 2e  t of index name.
17710 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a   May be NULL */.
17720 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32 2c    Token *pName2,
17730 20 20 20 20 20 2f 2a 20 53 65 63 6f 6e 64 20 70       /* Second p
17740 61 72 74 20 6f 66 20 69 6e 64 65 78 20 6e 61 6d  art of index nam
17750 65 2e 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a  e. May be NULL *
17760 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 62  /.  SrcList *pTb
17770 6c 4e 61 6d 65 2c 20 2f 2a 20 54 61 62 6c 65 20  lName, /* Table 
17780 74 6f 20 69 6e 64 65 78 2e 20 55 73 65 20 70 50  to index. Use pP
17790 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20  arse->pNewTable 
177a0 69 66 20 30 20 2a 2f 0a 20 20 45 78 70 72 4c 69  if 0 */.  ExprLi
177b0 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 2f 2a 20  st *pList,   /* 
177c0 41 20 6c 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e  A list of column
177d0 73 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64 20  s to be indexed 
177e0 2a 2f 0a 20 20 69 6e 74 20 6f 6e 45 72 72 6f 72  */.  int onError
177f0 2c 20 20 20 20 20 20 20 2f 2a 20 4f 45 5f 41 62  ,       /* OE_Ab
17800 6f 72 74 2c 20 4f 45 5f 49 67 6e 6f 72 65 2c 20  ort, OE_Ignore, 
17810 4f 45 5f 52 65 70 6c 61 63 65 2c 20 6f 72 20 4f  OE_Replace, or O
17820 45 5f 4e 6f 6e 65 20 2a 2f 0a 20 20 54 6f 6b 65  E_None */.  Toke
17830 6e 20 2a 70 53 74 61 72 74 2c 20 20 20 20 20 2f  n *pStart,     /
17840 2a 20 54 68 65 20 43 52 45 41 54 45 20 74 6f 6b  * The CREATE tok
17850 65 6e 20 74 68 61 74 20 62 65 67 69 6e 73 20 74  en that begins t
17860 68 69 73 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  his statement */
17870 0a 20 20 45 78 70 72 20 2a 70 50 49 57 68 65 72  .  Expr *pPIWher
17880 65 2c 20 20 20 20 2f 2a 20 57 48 45 52 45 20 63  e,    /* WHERE c
17890 6c 61 75 73 65 20 66 6f 72 20 70 61 72 74 69 61  lause for partia
178a0 6c 20 69 6e 64 69 63 65 73 20 2a 2f 0a 20 20 69  l indices */.  i
178b0 6e 74 20 73 6f 72 74 4f 72 64 65 72 2c 20 20 20  nt sortOrder,   
178c0 20 20 2f 2a 20 53 6f 72 74 20 6f 72 64 65 72 20    /* Sort order 
178d0 6f 66 20 70 72 69 6d 61 72 79 20 6b 65 79 20 77  of primary key w
178e0 68 65 6e 20 70 4c 69 73 74 3d 3d 4e 55 4c 4c 20  hen pList==NULL 
178f0 2a 2f 0a 20 20 69 6e 74 20 69 66 4e 6f 74 45 78  */.  int ifNotEx
17900 69 73 74 20 20 20 20 20 2f 2a 20 4f 6d 69 74 20  ist     /* Omit 
17910 65 72 72 6f 72 20 69 66 20 69 6e 64 65 78 20 61  error if index a
17920 6c 72 65 61 64 79 20 65 78 69 73 74 73 20 2a 2f  lready exists */
17930 0a 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 52 65  .){.  Index *pRe
17940 74 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 50 6f  t = 0;     /* Po
17950 69 6e 74 65 72 20 74 6f 20 72 65 74 75 72 6e 20  inter to return 
17960 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  */.  Table *pTab
17970 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 54 61 62   = 0;     /* Tab
17980 6c 65 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64  le to be indexed
17990 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e   */.  Index *pIn
179a0 64 65 78 20 3d 20 30 3b 20 20 20 2f 2a 20 54 68  dex = 0;   /* Th
179b0 65 20 69 6e 64 65 78 20 74 6f 20 62 65 20 63 72  e index to be cr
179c0 65 61 74 65 64 20 2a 2f 0a 20 20 63 68 61 72 20  eated */.  char 
179d0 2a 7a 4e 61 6d 65 20 3d 20 30 3b 20 20 20 20 20  *zName = 0;     
179e0 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 69  /* Name of the i
179f0 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e  ndex */.  int nN
17a00 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f  ame;           /
17a10 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 68 61 72  * Number of char
17a20 61 63 74 65 72 73 20 69 6e 20 7a 4e 61 6d 65 20  acters in zName 
17a30 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20  */.  int i, j;. 
17a40 20 44 62 46 69 78 65 72 20 73 46 69 78 3b 20 20   DbFixer sFix;  
17a50 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 61 73 73        /* For ass
17a60 69 67 6e 69 6e 67 20 64 61 74 61 62 61 73 65 20  igning database 
17a70 6e 61 6d 65 73 20 74 6f 20 70 54 61 62 6c 65 20  names to pTable 
17a80 2a 2f 0a 20 20 69 6e 74 20 73 6f 72 74 4f 72 64  */.  int sortOrd
17a90 65 72 4d 61 73 6b 3b 20 20 20 2f 2a 20 31 20 74  erMask;   /* 1 t
17aa0 6f 20 68 6f 6e 6f 72 20 44 45 53 43 20 69 6e 20  o honor DESC in 
17ab0 69 6e 64 65 78 2e 20 20 30 20 74 6f 20 69 67 6e  index.  0 to ign
17ac0 6f 72 65 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ore. */.  sqlite
17ad0 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
17ae0 64 62 3b 0a 20 20 44 62 20 2a 70 44 62 3b 20 20  db;.  Db *pDb;  
17af0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
17b00 65 20 73 70 65 63 69 66 69 63 20 74 61 62 6c 65  e specific table
17b10 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
17b20 69 6e 64 65 78 65 64 20 64 61 74 61 62 61 73 65  indexed database
17b30 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62 3b 20 20   */.  int iDb;  
17b40 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
17b50 64 65 78 20 6f 66 20 74 68 65 20 64 61 74 61 62  dex of the datab
17b60 61 73 65 20 74 68 61 74 20 69 73 20 62 65 69 6e  ase that is bein
17b70 67 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20 54  g written */.  T
17b80 6f 6b 65 6e 20 2a 70 4e 61 6d 65 20 3d 20 30 3b  oken *pName = 0;
17b90 20 20 20 20 2f 2a 20 55 6e 71 75 61 6c 69 66 69      /* Unqualifi
17ba0 65 64 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 69  ed name of the i
17bb0 6e 64 65 78 20 74 6f 20 63 72 65 61 74 65 20 2a  ndex to create *
17bc0 2f 0a 20 20 73 74 72 75 63 74 20 45 78 70 72 4c  /.  struct ExprL
17bd0 69 73 74 5f 69 74 65 6d 20 2a 70 4c 69 73 74 49  ist_item *pListI
17be0 74 65 6d 3b 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70  tem; /* For loop
17bf0 69 6e 67 20 6f 76 65 72 20 70 4c 69 73 74 20 2a  ing over pList *
17c00 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 20 3d  /.  int nExtra =
17c10 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
17c20 20 20 20 20 20 2f 2a 20 53 70 61 63 65 20 61 6c       /* Space al
17c30 6c 6f 63 61 74 65 64 20 66 6f 72 20 7a 45 78 74  located for zExt
17c40 72 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e 45  ra[] */.  int nE
17c50 78 74 72 61 43 6f 6c 3b 20 20 20 20 20 20 20 20  xtraCol;        
17c60 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
17c70 6d 62 65 72 20 6f 66 20 65 78 74 72 61 20 63 6f  mber of extra co
17c80 6c 75 6d 6e 73 20 6e 65 65 64 65 64 20 2a 2f 0a  lumns needed */.
17c90 20 20 63 68 61 72 20 2a 7a 45 78 74 72 61 20 3d    char *zExtra =
17ca0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
17cb0 20 20 20 2f 2a 20 45 78 74 72 61 20 73 70 61 63     /* Extra spac
17cc0 65 20 61 66 74 65 72 20 74 68 65 20 49 6e 64 65  e after the Inde
17cd0 78 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 49 6e  x object */.  In
17ce0 64 65 78 20 2a 70 50 6b 20 3d 20 30 3b 20 20 20  dex *pPk = 0;   
17cf0 20 20 20 2f 2a 20 50 52 49 4d 41 52 59 20 4b 45     /* PRIMARY KE
17d00 59 20 69 6e 64 65 78 20 66 6f 72 20 57 49 54 48  Y index for WITH
17d10 4f 55 54 20 52 4f 57 49 44 20 74 61 62 6c 65 73  OUT ROWID tables
17d20 20 2a 2f 0a 0a 20 20 69 66 28 20 64 62 2d 3e 6d   */..  if( db->m
17d30 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20 49  allocFailed || I
17d40 4e 5f 44 45 43 4c 41 52 45 5f 56 54 41 42 20 7c  N_DECLARE_VTAB |
17d50 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3e 30  | pParse->nErr>0
17d60 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69   ){.    goto exi
17d70 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
17d80 20 20 7d 0a 20 20 69 66 28 20 53 51 4c 49 54 45    }.  if( SQLITE
17d90 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65 61 64  _OK!=sqlite3Read
17da0 53 63 68 65 6d 61 28 70 50 61 72 73 65 29 20 29  Schema(pParse) )
17db0 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f  {.    goto exit_
17dc0 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
17dd0 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46 69 6e  }..  /*.  ** Fin
17de0 64 20 74 68 65 20 74 61 62 6c 65 20 74 68 61 74  d the table that
17df0 20 69 73 20 74 6f 20 62 65 20 69 6e 64 65 78 65   is to be indexe
17e00 64 2e 20 20 52 65 74 75 72 6e 20 65 61 72 6c 79  d.  Return early
17e10 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 20   if not found.. 
17e20 20 2a 2f 0a 20 20 69 66 28 20 70 54 62 6c 4e 61   */.  if( pTblNa
17e30 6d 65 21 3d 30 20 29 7b 0a 0a 20 20 20 20 2f 2a  me!=0 ){..    /*
17e40 20 55 73 65 20 74 68 65 20 74 77 6f 2d 70 61 72   Use the two-par
17e50 74 20 69 6e 64 65 78 20 6e 61 6d 65 20 74 6f 20  t index name to 
17e60 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20 64 61  determine the da
17e70 74 61 62 61 73 65 20 0a 20 20 20 20 2a 2a 20 74  tabase .    ** t
17e80 6f 20 73 65 61 72 63 68 20 66 6f 72 20 74 68 65  o search for the
17e90 20 74 61 62 6c 65 2e 20 27 46 69 78 27 20 74 68   table. 'Fix' th
17ea0 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 74 6f 20  e table name to 
17eb0 74 68 69 73 20 64 62 0a 20 20 20 20 2a 2a 20 62  this db.    ** b
17ec0 65 66 6f 72 65 20 6c 6f 6f 6b 69 6e 67 20 75 70  efore looking up
17ed0 20 74 68 65 20 74 61 62 6c 65 2e 0a 20 20 20 20   the table..    
17ee0 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  */.    assert( p
17ef0 4e 61 6d 65 31 20 26 26 20 70 4e 61 6d 65 32 20  Name1 && pName2 
17f00 29 3b 0a 20 20 20 20 69 44 62 20 3d 20 73 71 6c  );.    iDb = sql
17f10 69 74 65 33 54 77 6f 50 61 72 74 4e 61 6d 65 28  ite3TwoPartName(
17f20 70 50 61 72 73 65 2c 20 70 4e 61 6d 65 31 2c 20  pParse, pName1, 
17f30 70 4e 61 6d 65 32 2c 20 26 70 4e 61 6d 65 29 3b  pName2, &pName);
17f40 0a 20 20 20 20 69 66 28 20 69 44 62 3c 30 20 29  .    if( iDb<0 )
17f50 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
17f60 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 61 73 73  e_index;.    ass
17f70 65 72 74 28 20 70 4e 61 6d 65 20 26 26 20 70 4e  ert( pName && pN
17f80 61 6d 65 2d 3e 7a 20 29 3b 0a 0a 23 69 66 6e 64  ame->z );..#ifnd
17f90 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54  ef SQLITE_OMIT_T
17fa0 45 4d 50 44 42 0a 20 20 20 20 2f 2a 20 49 66 20  EMPDB.    /* If 
17fb0 74 68 65 20 69 6e 64 65 78 20 6e 61 6d 65 20 77  the index name w
17fc0 61 73 20 75 6e 71 75 61 6c 69 66 69 65 64 2c 20  as unqualified, 
17fd0 63 68 65 63 6b 20 69 66 20 74 68 65 20 74 61 62  check if the tab
17fe0 6c 65 0a 20 20 20 20 2a 2a 20 69 73 20 61 20 74  le.    ** is a t
17ff0 65 6d 70 20 74 61 62 6c 65 2e 20 49 66 20 73 6f  emp table. If so
18000 2c 20 73 65 74 20 74 68 65 20 64 61 74 61 62 61  , set the databa
18010 73 65 20 74 6f 20 31 2e 20 44 6f 20 6e 6f 74 20  se to 1. Do not 
18020 64 6f 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 69  do this.    ** i
18030 66 20 69 6e 69 74 69 61 6c 69 73 69 6e 67 20 61  f initialising a
18040 20 64 61 74 61 62 61 73 65 20 73 63 68 65 6d 61   database schema
18050 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
18060 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20   !db->init.busy 
18070 29 7b 0a 20 20 20 20 20 20 70 54 61 62 20 3d 20  ){.      pTab = 
18080 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 4c 6f  sqlite3SrcListLo
18090 6f 6b 75 70 28 70 50 61 72 73 65 2c 20 70 54 62  okup(pParse, pTb
180a0 6c 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 69 66  lName);.      if
180b0 28 20 70 4e 61 6d 65 32 2d 3e 6e 3d 3d 30 20 26  ( pName2->n==0 &
180c0 26 20 70 54 61 62 20 26 26 20 70 54 61 62 2d 3e  & pTab && pTab->
180d0 70 53 63 68 65 6d 61 3d 3d 64 62 2d 3e 61 44 62  pSchema==db->aDb
180e0 5b 31 5d 2e 70 53 63 68 65 6d 61 20 29 7b 0a 20  [1].pSchema ){. 
180f0 20 20 20 20 20 20 20 69 44 62 20 3d 20 31 3b 0a         iDb = 1;.
18100 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65        }.    }.#e
18110 6e 64 69 66 0a 0a 20 20 20 20 73 71 6c 69 74 65  ndif..    sqlite
18120 33 46 69 78 49 6e 69 74 28 26 73 46 69 78 2c 20  3FixInit(&sFix, 
18130 70 50 61 72 73 65 2c 20 69 44 62 2c 20 22 69 6e  pParse, iDb, "in
18140 64 65 78 22 2c 20 70 4e 61 6d 65 29 3b 0a 20 20  dex", pName);.  
18150 20 20 69 66 28 20 73 71 6c 69 74 65 33 46 69 78    if( sqlite3Fix
18160 53 72 63 4c 69 73 74 28 26 73 46 69 78 2c 20 70  SrcList(&sFix, p
18170 54 62 6c 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20  TblName) ){.    
18180 20 20 2f 2a 20 42 65 63 61 75 73 65 20 74 68 65    /* Because the
18190 20 70 61 72 73 65 72 20 63 6f 6e 73 74 72 75 63   parser construc
181a0 74 73 20 70 54 62 6c 4e 61 6d 65 20 66 72 6f 6d  ts pTblName from
181b0 20 61 20 73 69 6e 67 6c 65 20 69 64 65 6e 74 69   a single identi
181c0 66 69 65 72 2c 0a 20 20 20 20 20 20 2a 2a 20 73  fier,.      ** s
181d0 71 6c 69 74 65 33 46 69 78 53 72 63 4c 69 73 74  qlite3FixSrcList
181e0 20 63 61 6e 20 6e 65 76 65 72 20 66 61 69 6c 2e   can never fail.
181f0 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74   */.      assert
18200 28 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  (0);.    }.    p
18210 54 61 62 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63  Tab = sqlite3Loc
18220 61 74 65 54 61 62 6c 65 49 74 65 6d 28 70 50 61  ateTableItem(pPa
18230 72 73 65 2c 20 30 2c 20 26 70 54 62 6c 4e 61 6d  rse, 0, &pTblNam
18240 65 2d 3e 61 5b 30 5d 29 3b 0a 20 20 20 20 61 73  e->a[0]);.    as
18250 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63  sert( db->malloc
18260 46 61 69 6c 65 64 3d 3d 30 20 7c 7c 20 70 54 61  Failed==0 || pTa
18270 62 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20  b==0 );.    if( 
18280 70 54 61 62 3d 3d 30 20 29 20 67 6f 74 6f 20 65  pTab==0 ) goto e
18290 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
182a0 3b 0a 20 20 20 20 69 66 28 20 69 44 62 3d 3d 31  ;.    if( iDb==1
182b0 20 26 26 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d   && db->aDb[iDb]
182c0 2e 70 53 63 68 65 6d 61 21 3d 70 54 61 62 2d 3e  .pSchema!=pTab->
182d0 70 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 20  pSchema ){.     
182e0 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
182f0 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20  (pParse, .      
18300 20 20 20 20 20 22 63 61 6e 6e 6f 74 20 63 72 65       "cannot cre
18310 61 74 65 20 61 20 54 45 4d 50 20 69 6e 64 65 78  ate a TEMP index
18320 20 6f 6e 20 6e 6f 6e 2d 54 45 4d 50 20 74 61 62   on non-TEMP tab
18330 6c 65 20 5c 22 25 73 5c 22 22 2c 0a 20 20 20 20  le \"%s\"",.    
18340 20 20 20 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61         pTab->zNa
18350 6d 65 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  me);.      goto 
18360 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
18370 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  x;.    }.    if(
18380 20 21 48 61 73 52 6f 77 69 64 28 70 54 61 62 29   !HasRowid(pTab)
18390 20 29 20 70 50 6b 20 3d 20 73 71 6c 69 74 65 33   ) pPk = sqlite3
183a0 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65 78 28  PrimaryKeyIndex(
183b0 70 54 61 62 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  pTab);.  }else{.
183c0 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 61 6d      assert( pNam
183d0 65 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  e==0 );.    asse
183e0 72 74 28 20 70 53 74 61 72 74 3d 3d 30 20 29 3b  rt( pStart==0 );
183f0 0a 20 20 20 20 70 54 61 62 20 3d 20 70 50 61 72  .    pTab = pPar
18400 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20  se->pNewTable;. 
18410 20 20 20 69 66 28 20 21 70 54 61 62 20 29 20 67     if( !pTab ) g
18420 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
18430 69 6e 64 65 78 3b 0a 20 20 20 20 69 44 62 20 3d  index;.    iDb =
18440 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f   sqlite3SchemaTo
18450 49 6e 64 65 78 28 64 62 2c 20 70 54 61 62 2d 3e  Index(db, pTab->
18460 70 53 63 68 65 6d 61 29 3b 0a 20 20 7d 0a 20 20  pSchema);.  }.  
18470 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69  pDb = &db->aDb[i
18480 44 62 5d 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  Db];..  assert( 
18490 70 54 61 62 21 3d 30 20 29 3b 0a 20 20 61 73 73  pTab!=0 );.  ass
184a0 65 72 74 28 20 70 50 61 72 73 65 2d 3e 6e 45 72  ert( pParse->nEr
184b0 72 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 73 71  r==0 );.  if( sq
184c0 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28 70 54  lite3StrNICmp(pT
184d0 61 62 2d 3e 7a 4e 61 6d 65 2c 20 22 73 71 6c 69  ab->zName, "sqli
184e0 74 65 5f 22 2c 20 37 29 3d 3d 30 20 0a 20 20 20  te_", 7)==0 .   
184f0 20 20 20 20 26 26 20 64 62 2d 3e 69 6e 69 74 2e      && db->init.
18500 62 75 73 79 3d 3d 30 0a 23 69 66 20 53 51 4c 49  busy==0.#if SQLI
18510 54 45 5f 55 53 45 52 5f 41 55 54 48 45 4e 54 49  TE_USER_AUTHENTI
18520 43 41 54 49 4f 4e 0a 20 20 20 20 20 20 20 26 26  CATION.       &&
18530 20 73 71 6c 69 74 65 33 55 73 65 72 41 75 74 68   sqlite3UserAuth
18540 54 61 62 6c 65 28 70 54 61 62 2d 3e 7a 4e 61 6d  Table(pTab->zNam
18550 65 29 3d 3d 30 0a 23 65 6e 64 69 66 0a 20 20 20  e)==0.#endif.   
18560 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 53 74      && sqlite3St
18570 72 4e 49 43 6d 70 28 26 70 54 61 62 2d 3e 7a 4e  rNICmp(&pTab->zN
18580 61 6d 65 5b 37 5d 2c 22 61 6c 74 65 72 74 61 62  ame[7],"altertab
18590 5f 22 2c 39 29 21 3d 30 20 29 7b 0a 20 20 20 20  _",9)!=0 ){.    
185a0 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
185b0 70 50 61 72 73 65 2c 20 22 74 61 62 6c 65 20 25  pParse, "table %
185c0 73 20 6d 61 79 20 6e 6f 74 20 62 65 20 69 6e 64  s may not be ind
185d0 65 78 65 64 22 2c 20 70 54 61 62 2d 3e 7a 4e 61  exed", pTab->zNa
185e0 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78  me);.    goto ex
185f0 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
18600 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c  .  }.#ifndef SQL
18610 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 20 20  ITE_OMIT_VIEW.  
18620 69 66 28 20 70 54 61 62 2d 3e 70 53 65 6c 65 63  if( pTab->pSelec
18630 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  t ){.    sqlite3
18640 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
18650 20 22 76 69 65 77 73 20 6d 61 79 20 6e 6f 74 20   "views may not 
18660 62 65 20 69 6e 64 65 78 65 64 22 29 3b 0a 20 20  be indexed");.  
18670 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61    goto exit_crea
18680 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 23 65  te_index;.  }.#e
18690 6e 64 69 66 0a 23 69 66 6e 64 65 66 20 53 51 4c  ndif.#ifndef SQL
186a0 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
186b0 54 41 42 4c 45 0a 20 20 69 66 28 20 49 73 56 69  TABLE.  if( IsVi
186c0 72 74 75 61 6c 28 70 54 61 62 29 20 29 7b 0a 20  rtual(pTab) ){. 
186d0 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
186e0 73 67 28 70 50 61 72 73 65 2c 20 22 76 69 72 74  sg(pParse, "virt
186f0 75 61 6c 20 74 61 62 6c 65 73 20 6d 61 79 20 6e  ual tables may n
18700 6f 74 20 62 65 20 69 6e 64 65 78 65 64 22 29 3b  ot be indexed");
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 65 6e 64 69 66 0a 0a 20 20 2f 2a 0a 20 20  .#endif..  /*.  
18740 2a 2a 20 46 69 6e 64 20 74 68 65 20 6e 61 6d 65  ** Find the name
18750 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e 20 20   of the index.  
18760 4d 61 6b 65 20 73 75 72 65 20 74 68 65 72 65 20  Make sure there 
18770 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 61  is not already a
18780 6e 6f 74 68 65 72 0a 20 20 2a 2a 20 69 6e 64 65  nother.  ** inde
18790 78 20 6f 72 20 74 61 62 6c 65 20 77 69 74 68 20  x or table with 
187a0 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 2e 20 20  the same name.  
187b0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 78 63 65 70  .  **.  ** Excep
187c0 74 69 6f 6e 3a 20 20 49 66 20 77 65 20 61 72 65  tion:  If we are
187d0 20 72 65 61 64 69 6e 67 20 74 68 65 20 6e 61 6d   reading the nam
187e0 65 73 20 6f 66 20 70 65 72 6d 61 6e 65 6e 74 20  es of permanent 
187f0 69 6e 64 69 63 65 73 20 66 72 6f 6d 20 74 68 65  indices from the
18800 0a 20 20 2a 2a 20 73 71 6c 69 74 65 5f 6d 61 73  .  ** sqlite_mas
18810 74 65 72 20 74 61 62 6c 65 20 28 62 65 63 61 75  ter table (becau
18820 73 65 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 72  se some other pr
18830 6f 63 65 73 73 20 63 68 61 6e 67 65 64 20 74 68  ocess changed th
18840 65 20 73 63 68 65 6d 61 29 20 61 6e 64 0a 20 20  e schema) and.  
18850 2a 2a 20 6f 6e 65 20 6f 66 20 74 68 65 20 69 6e  ** one of the in
18860 64 65 78 20 6e 61 6d 65 73 20 63 6f 6c 6c 69 64  dex names collid
18870 65 73 20 77 69 74 68 20 74 68 65 20 6e 61 6d 65  es with the name
18880 20 6f 66 20 61 20 74 65 6d 70 6f 72 61 72 79 20   of a temporary 
18890 74 61 62 6c 65 20 6f 72 0a 20 20 2a 2a 20 69 6e  table or.  ** in
188a0 64 65 78 2c 20 74 68 65 6e 20 77 65 20 77 69 6c  dex, then we wil
188b0 6c 20 63 6f 6e 74 69 6e 75 65 20 74 6f 20 70 72  l continue to pr
188c0 6f 63 65 73 73 20 74 68 69 73 20 69 6e 64 65 78  ocess this index
188d0 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 70  ..  **.  ** If p
188e0 4e 61 6d 65 3d 3d 30 20 69 74 20 6d 65 61 6e 73  Name==0 it means
188f0 20 74 68 61 74 20 77 65 20 61 72 65 0a 20 20 2a   that we are.  *
18900 2a 20 64 65 61 6c 69 6e 67 20 77 69 74 68 20 61  * dealing with a
18910 20 70 72 69 6d 61 72 79 20 6b 65 79 20 6f 72 20   primary key or 
18920 55 4e 49 51 55 45 20 63 6f 6e 73 74 72 61 69 6e  UNIQUE constrain
18930 74 2e 20 20 57 65 20 68 61 76 65 20 74 6f 20 69  t.  We have to i
18940 6e 76 65 6e 74 20 6f 75 72 0a 20 20 2a 2a 20 6f  nvent our.  ** o
18950 77 6e 20 6e 61 6d 65 2e 0a 20 20 2a 2f 0a 20 20  wn name..  */.  
18960 69 66 28 20 70 4e 61 6d 65 20 29 7b 0a 20 20 20  if( pName ){.   
18970 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33   zName = sqlite3
18980 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62  NameFromToken(db
18990 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66  , pName);.    if
189a0 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 20 67 6f 74  ( zName==0 ) got
189b0 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
189c0 64 65 78 3b 0a 20 20 20 20 61 73 73 65 72 74 28  dex;.    assert(
189d0 20 70 4e 61 6d 65 2d 3e 7a 21 3d 30 20 29 3b 0a   pName->z!=0 );.
189e0 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f      if( SQLITE_O
189f0 4b 21 3d 73 71 6c 69 74 65 33 43 68 65 63 6b 4f  K!=sqlite3CheckO
18a00 62 6a 65 63 74 4e 61 6d 65 28 70 50 61 72 73 65  bjectName(pParse
18a10 2c 20 7a 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20  , zName) ){.    
18a20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61    goto exit_crea
18a30 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a  te_index;.    }.
18a40 20 20 20 20 69 66 28 20 21 64 62 2d 3e 69 6e 69      if( !db->ini
18a50 74 2e 62 75 73 79 20 29 7b 0a 20 20 20 20 20 20  t.busy ){.      
18a60 69 66 28 20 73 71 6c 69 74 65 33 46 69 6e 64 54  if( sqlite3FindT
18a70 61 62 6c 65 28 64 62 2c 20 7a 4e 61 6d 65 2c 20  able(db, zName, 
18a80 30 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  0)!=0 ){.       
18a90 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
18aa0 28 70 50 61 72 73 65 2c 20 22 74 68 65 72 65 20  (pParse, "there 
18ab0 69 73 20 61 6c 72 65 61 64 79 20 61 20 74 61 62  is already a tab
18ac0 6c 65 20 6e 61 6d 65 64 20 25 73 22 2c 20 7a 4e  le named %s", zN
18ad0 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 67 6f  ame);.        go
18ae0 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
18af0 6e 64 65 78 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ndex;.      }.  
18b00 20 20 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69    }.    if( sqli
18b10 74 65 33 46 69 6e 64 49 6e 64 65 78 28 64 62 2c  te3FindIndex(db,
18b20 20 7a 4e 61 6d 65 2c 20 70 44 62 2d 3e 7a 4e 61   zName, pDb->zNa
18b30 6d 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  me)!=0 ){.      
18b40 69 66 28 20 21 69 66 4e 6f 74 45 78 69 73 74 20  if( !ifNotExist 
18b50 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
18b60 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
18b70 65 2c 20 22 69 6e 64 65 78 20 25 73 20 61 6c 72  e, "index %s alr
18b80 65 61 64 79 20 65 78 69 73 74 73 22 2c 20 7a 4e  eady exists", zN
18b90 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  ame);.      }els
18ba0 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  e{.        asser
18bb0 74 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73  t( !db->init.bus
18bc0 79 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  y );.        sql
18bd0 69 74 65 33 43 6f 64 65 56 65 72 69 66 79 53 63  ite3CodeVerifySc
18be0 68 65 6d 61 28 70 50 61 72 73 65 2c 20 69 44 62  hema(pParse, iDb
18bf0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
18c00 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
18c10 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20  e_index;.    }. 
18c20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20   }else{.    int 
18c30 6e 3b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 4c  n;.    Index *pL
18c40 6f 6f 70 3b 0a 20 20 20 20 66 6f 72 28 70 4c 6f  oop;.    for(pLo
18c50 6f 70 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 2c  op=pTab->pIndex,
18c60 20 6e 3d 31 3b 20 70 4c 6f 6f 70 3b 20 70 4c 6f   n=1; pLoop; pLo
18c70 6f 70 3d 70 4c 6f 6f 70 2d 3e 70 4e 65 78 74 2c  op=pLoop->pNext,
18c80 20 6e 2b 2b 29 7b 7d 0a 20 20 20 20 7a 4e 61 6d   n++){}.    zNam
18c90 65 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e  e = sqlite3MPrin
18ca0 74 66 28 64 62 2c 20 22 73 71 6c 69 74 65 5f 61  tf(db, "sqlite_a
18cb0 75 74 6f 69 6e 64 65 78 5f 25 73 5f 25 64 22 2c  utoindex_%s_%d",
18cc0 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 6e 29   pTab->zName, n)
18cd0 3b 0a 20 20 20 20 69 66 28 20 7a 4e 61 6d 65 3d  ;.    if( zName=
18ce0 3d 30 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  =0 ){.      goto
18cf0 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
18d00 65 78 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  ex;.    }.  }.. 
18d10 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 61 75   /* Check for au
18d20 74 68 6f 72 69 7a 61 74 69 6f 6e 20 74 6f 20 63  thorization to c
18d30 72 65 61 74 65 20 61 6e 20 69 6e 64 65 78 2e 0a  reate an index..
18d40 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c    */.#ifndef SQL
18d50 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49  ITE_OMIT_AUTHORI
18d60 5a 41 54 49 4f 4e 0a 20 20 7b 0a 20 20 20 20 63  ZATION.  {.    c
18d70 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 20 3d  onst char *zDb =
18d80 20 70 44 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20   pDb->zName;.   
18d90 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68   if( sqlite3Auth
18da0 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51  Check(pParse, SQ
18db0 4c 49 54 45 5f 49 4e 53 45 52 54 2c 20 53 43 48  LITE_INSERT, SCH
18dc0 45 4d 41 5f 54 41 42 4c 45 28 69 44 62 29 2c 20  EMA_TABLE(iDb), 
18dd0 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20  0, zDb) ){.     
18de0 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
18df0 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20  e_index;.    }. 
18e00 20 20 20 69 20 3d 20 53 51 4c 49 54 45 5f 43 52     i = SQLITE_CR
18e10 45 41 54 45 5f 49 4e 44 45 58 3b 0a 20 20 20 20  EATE_INDEX;.    
18e20 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42  if( !OMIT_TEMPDB
18e30 20 26 26 20 69 44 62 3d 3d 31 20 29 20 69 20 3d   && iDb==1 ) i =
18e40 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54   SQLITE_CREATE_T
18e50 45 4d 50 5f 49 4e 44 45 58 3b 0a 20 20 20 20 69  EMP_INDEX;.    i
18e60 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68  f( sqlite3AuthCh
18e70 65 63 6b 28 70 50 61 72 73 65 2c 20 69 2c 20 7a  eck(pParse, i, z
18e80 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  Name, pTab->zNam
18e90 65 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20  e, zDb) ){.     
18ea0 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
18eb0 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20  e_index;.    }. 
18ec0 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
18ed0 49 66 20 70 4c 69 73 74 3d 3d 30 2c 20 69 74 20  If pList==0, it 
18ee0 6d 65 61 6e 73 20 74 68 69 73 20 72 6f 75 74 69  means this routi
18ef0 6e 65 20 77 61 73 20 63 61 6c 6c 65 64 20 74 6f  ne was called to
18f00 20 6d 61 6b 65 20 61 20 70 72 69 6d 61 72 79 0a   make a primary.
18f10 20 20 2a 2a 20 6b 65 79 20 6f 75 74 20 6f 66 20    ** key out of 
18f20 74 68 65 20 6c 61 73 74 20 63 6f 6c 75 6d 6e 20  the last column 
18f30 61 64 64 65 64 20 74 6f 20 74 68 65 20 74 61 62  added to the tab
18f40 6c 65 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75  le under constru
18f50 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 53 6f 20 63  ction..  ** So c
18f60 72 65 61 74 65 20 61 20 66 61 6b 65 20 6c 69 73  reate a fake lis
18f70 74 20 74 6f 20 73 69 6d 75 6c 61 74 65 20 74 68  t to simulate th
18f80 69 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  is..  */.  if( p
18f90 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 54  List==0 ){.    T
18fa0 6f 6b 65 6e 20 70 72 65 76 43 6f 6c 3b 0a 20 20  oken prevCol;.  
18fb0 20 20 73 71 6c 69 74 65 33 54 6f 6b 65 6e 49 6e    sqlite3TokenIn
18fc0 69 74 28 26 70 72 65 76 43 6f 6c 2c 20 70 54 61  it(&prevCol, pTa
18fd0 62 2d 3e 61 43 6f 6c 5b 70 54 61 62 2d 3e 6e 43  b->aCol[pTab->nC
18fe0 6f 6c 2d 31 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20  ol-1].zName);.  
18ff0 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65    pList = sqlite
19000 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28  3ExprListAppend(
19010 70 50 61 72 73 65 2c 20 30 2c 0a 20 20 20 20 20  pParse, 0,.     
19020 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
19030 45 78 70 72 41 6c 6c 6f 63 28 64 62 2c 20 54 4b  ExprAlloc(db, TK
19040 5f 49 44 2c 20 26 70 72 65 76 43 6f 6c 2c 20 30  _ID, &prevCol, 0
19050 29 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73  ));.    if( pLis
19060 74 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78 69 74  t==0 ) goto exit
19070 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
19080 20 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74     assert( pList
19090 2d 3e 6e 45 78 70 72 3d 3d 31 20 29 3b 0a 20 20  ->nExpr==1 );.  
190a0 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
190b0 74 53 65 74 53 6f 72 74 4f 72 64 65 72 28 70 4c  tSetSortOrder(pL
190c0 69 73 74 2c 20 73 6f 72 74 4f 72 64 65 72 29 3b  ist, sortOrder);
190d0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71  .  }else{.    sq
190e0 6c 69 74 65 33 45 78 70 72 4c 69 73 74 43 68 65  lite3ExprListChe
190f0 63 6b 4c 65 6e 67 74 68 28 70 50 61 72 73 65 2c  ckLength(pParse,
19100 20 70 4c 69 73 74 2c 20 22 69 6e 64 65 78 22 29   pList, "index")
19110 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 67 75  ;.  }..  /* Figu
19120 72 65 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20  re out how many 
19130 62 79 74 65 73 20 6f 66 20 73 70 61 63 65 20 61  bytes of space a
19140 72 65 20 72 65 71 75 69 72 65 64 20 74 6f 20 73  re required to s
19150 74 6f 72 65 20 65 78 70 6c 69 63 69 74 6c 79 0a  tore explicitly.
19160 20 20 2a 2a 20 73 70 65 63 69 66 69 65 64 20 63    ** specified c
19170 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
19180 65 20 6e 61 6d 65 73 2e 0a 20 20 2a 2f 0a 20 20  e names..  */.  
19190 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74  for(i=0; i<pList
191a0 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
191b0 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d     Expr *pExpr =
191c0 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78   pList->a[i].pEx
191d0 70 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  pr;.    assert( 
191e0 70 45 78 70 72 21 3d 30 20 29 3b 0a 20 20 20 20  pExpr!=0 );.    
191f0 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  if( pExpr->op==T
19200 4b 5f 43 4f 4c 4c 41 54 45 20 29 7b 0a 20 20 20  K_COLLATE ){.   
19210 20 20 20 6e 45 78 74 72 61 20 2b 3d 20 28 31 20     nExtra += (1 
19220 2b 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  + sqlite3Strlen3
19230 30 28 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65  0(pExpr->u.zToke
19240 6e 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  n));.    }.  }..
19250 20 20 2f 2a 20 0a 20 20 2a 2a 20 41 6c 6c 6f 63    /* .  ** Alloc
19260 61 74 65 20 74 68 65 20 69 6e 64 65 78 20 73 74  ate the index st
19270 72 75 63 74 75 72 65 2e 20 0a 20 20 2a 2f 0a 20  ructure. .  */. 
19280 20 6e 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33   nName = sqlite3
19290 53 74 72 6c 65 6e 33 30 28 7a 4e 61 6d 65 29 3b  Strlen30(zName);
192a0 0a 20 20 6e 45 78 74 72 61 43 6f 6c 20 3d 20 70  .  nExtraCol = p
192b0 50 6b 20 3f 20 70 50 6b 2d 3e 6e 4b 65 79 43 6f  Pk ? pPk->nKeyCo
192c0 6c 20 3a 20 31 3b 0a 20 20 70 49 6e 64 65 78 20  l : 1;.  pIndex 
192d0 3d 20 73 71 6c 69 74 65 33 41 6c 6c 6f 63 61 74  = sqlite3Allocat
192e0 65 49 6e 64 65 78 4f 62 6a 65 63 74 28 64 62 2c  eIndexObject(db,
192f0 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 2b 20   pList->nExpr + 
19300 6e 45 78 74 72 61 43 6f 6c 2c 0a 20 20 20 20 20  nExtraCol,.     
19310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19330 20 6e 4e 61 6d 65 20 2b 20 6e 45 78 74 72 61 20   nName + nExtra 
19340 2b 20 31 2c 20 26 7a 45 78 74 72 61 29 3b 0a 20  + 1, &zExtra);. 
19350 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
19360 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f 74  ailed ){.    got
19370 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
19380 64 65 78 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  dex;.  }.  asser
19390 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c  t( EIGHT_BYTE_AL
193a0 49 47 4e 4d 45 4e 54 28 70 49 6e 64 65 78 2d 3e  IGNMENT(pIndex->
193b0 61 69 52 6f 77 4c 6f 67 45 73 74 29 20 29 3b 0a  aiRowLogEst) );.
193c0 20 20 61 73 73 65 72 74 28 20 45 49 47 48 54 5f    assert( EIGHT_
193d0 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 70  BYTE_ALIGNMENT(p
193e0 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c 29 20 29  Index->azColl) )
193f0 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d  ;.  pIndex->zNam
19400 65 20 3d 20 7a 45 78 74 72 61 3b 0a 20 20 7a 45  e = zExtra;.  zE
19410 78 74 72 61 20 2b 3d 20 6e 4e 61 6d 65 20 2b 20  xtra += nName + 
19420 31 3b 0a 20 20 6d 65 6d 63 70 79 28 70 49 6e 64  1;.  memcpy(pInd
19430 65 78 2d 3e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65  ex->zName, zName
19440 2c 20 6e 4e 61 6d 65 2b 31 29 3b 0a 20 20 70 49  , nName+1);.  pI
19450 6e 64 65 78 2d 3e 70 54 61 62 6c 65 20 3d 20 70  ndex->pTable = p
19460 54 61 62 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 6f  Tab;.  pIndex->o
19470 6e 45 72 72 6f 72 20 3d 20 28 75 38 29 6f 6e 45  nError = (u8)onE
19480 72 72 6f 72 3b 0a 20 20 70 49 6e 64 65 78 2d 3e  rror;.  pIndex->
19490 75 6e 69 71 4e 6f 74 4e 75 6c 6c 20 3d 20 6f 6e  uniqNotNull = on
194a0 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 3b 0a  Error!=OE_None;.
194b0 20 20 70 49 6e 64 65 78 2d 3e 69 64 78 54 79 70    pIndex->idxTyp
194c0 65 20 3d 20 70 4e 61 6d 65 20 3f 20 53 51 4c 49  e = pName ? SQLI
194d0 54 45 5f 49 44 58 54 59 50 45 5f 41 50 50 44 45  TE_IDXTYPE_APPDE
194e0 46 20 3a 20 53 51 4c 49 54 45 5f 49 44 58 54 59  F : SQLITE_IDXTY
194f0 50 45 5f 55 4e 49 51 55 45 3b 0a 20 20 70 49 6e  PE_UNIQUE;.  pIn
19500 64 65 78 2d 3e 70 53 63 68 65 6d 61 20 3d 20 64  dex->pSchema = d
19510 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53 63 68  b->aDb[iDb].pSch
19520 65 6d 61 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 6e  ema;.  pIndex->n
19530 4b 65 79 43 6f 6c 20 3d 20 70 4c 69 73 74 2d 3e  KeyCol = pList->
19540 6e 45 78 70 72 3b 0a 20 20 69 66 28 20 70 50 49  nExpr;.  if( pPI
19550 57 68 65 72 65 20 29 7b 0a 20 20 20 20 73 71 6c  Where ){.    sql
19560 69 74 65 33 52 65 73 6f 6c 76 65 53 65 6c 66 52  ite3ResolveSelfR
19570 65 66 65 72 65 6e 63 65 28 70 50 61 72 73 65 2c  eference(pParse,
19580 20 70 54 61 62 2c 20 4e 43 5f 50 61 72 74 49 64   pTab, NC_PartId
19590 78 2c 20 70 50 49 57 68 65 72 65 2c 20 30 29 3b  x, pPIWhere, 0);
195a0 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e 70 50 61  .    pIndex->pPa
195b0 72 74 49 64 78 57 68 65 72 65 20 3d 20 70 50 49  rtIdxWhere = pPI
195c0 57 68 65 72 65 3b 0a 20 20 20 20 70 50 49 57 68  Where;.    pPIWh
195d0 65 72 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 61  ere = 0;.  }.  a
195e0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 53 63  ssert( sqlite3Sc
195f0 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62  hemaMutexHeld(db
19600 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a 0a 20 20  , iDb, 0) );..  
19610 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20  /* Check to see 
19620 69 66 20 77 65 20 73 68 6f 75 6c 64 20 68 6f 6e  if we should hon
19630 6f 72 20 44 45 53 43 20 72 65 71 75 65 73 74 73  or DESC requests
19640 20 6f 6e 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e   on index column
19650 73 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 44 62  s.  */.  if( pDb
19660 2d 3e 70 53 63 68 65 6d 61 2d 3e 66 69 6c 65 5f  ->pSchema->file_
19670 66 6f 72 6d 61 74 3e 3d 34 20 29 7b 0a 20 20 20  format>=4 ){.   
19680 20 73 6f 72 74 4f 72 64 65 72 4d 61 73 6b 20 3d   sortOrderMask =
19690 20 2d 31 3b 20 20 20 2f 2a 20 48 6f 6e 6f 72 20   -1;   /* Honor 
196a0 44 45 53 43 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b  DESC */.  }else{
196b0 0a 20 20 20 20 73 6f 72 74 4f 72 64 65 72 4d 61  .    sortOrderMa
196c0 73 6b 20 3d 20 30 3b 20 20 20 20 2f 2a 20 49 67  sk = 0;    /* Ig
196d0 6e 6f 72 65 20 44 45 53 43 20 2a 2f 0a 20 20 7d  nore DESC */.  }
196e0 0a 0a 20 20 2f 2a 20 41 6e 61 6c 79 7a 65 20 74  ..  /* Analyze t
196f0 68 65 20 6c 69 73 74 20 6f 66 20 65 78 70 72 65  he list of expre
19700 73 73 69 6f 6e 73 20 74 68 61 74 20 66 6f 72 6d  ssions that form
19710 20 74 68 65 20 74 65 72 6d 73 20 6f 66 20 74 68   the terms of th
19720 65 20 69 6e 64 65 78 20 61 6e 64 0a 20 20 2a 2a  e index and.  **
19730 20 72 65 70 6f 72 74 20 61 6e 79 20 65 72 72 6f   report any erro
19740 72 73 2e 20 20 49 6e 20 74 68 65 20 63 6f 6d 6d  rs.  In the comm
19750 6f 6e 20 63 61 73 65 20 77 68 65 72 65 20 74 68  on case where th
19760 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
19770 65 78 61 63 74 6c 79 0a 20 20 2a 2a 20 61 20 74  exactly.  ** a t
19780 61 62 6c 65 20 63 6f 6c 75 6d 6e 2c 20 73 74 6f  able column, sto
19790 72 65 20 74 68 61 74 20 63 6f 6c 75 6d 6e 20 69  re that column i
197a0 6e 20 61 69 43 6f 6c 75 6d 6e 5b 5d 2e 20 20 46  n aiColumn[].  F
197b0 6f 72 20 67 65 6e 65 72 61 6c 20 65 78 70 72 65  or general expre
197c0 73 73 69 6f 6e 73 2c 0a 20 20 2a 2a 20 70 6f 70  ssions,.  ** pop
197d0 75 6c 61 74 65 20 70 49 6e 64 65 78 2d 3e 61 43  ulate pIndex->aC
197e0 6f 6c 45 78 70 72 20 61 6e 64 20 73 74 6f 72 65  olExpr and store
197f0 20 58 4e 5f 45 58 50 52 20 28 2d 32 29 20 69 6e   XN_EXPR (-2) in
19800 20 61 69 43 6f 6c 75 6d 6e 5b 5d 2e 0a 20 20 2a   aiColumn[]..  *
19810 2a 0a 20 20 2a 2a 20 54 4f 44 4f 3a 20 49 73 73  *.  ** TODO: Iss
19820 75 65 20 61 20 77 61 72 6e 69 6e 67 20 69 66 20  ue a warning if 
19830 74 77 6f 20 6f 72 20 6d 6f 72 65 20 63 6f 6c 75  two or more colu
19840 6d 6e 73 20 6f 66 20 74 68 65 20 69 6e 64 65 78  mns of the index
19850 20 61 72 65 20 69 64 65 6e 74 69 63 61 6c 2e 0a   are identical..
19860 20 20 2a 2a 20 54 4f 44 4f 3a 20 49 73 73 75 65    ** TODO: Issue
19870 20 61 20 77 61 72 6e 69 6e 67 20 69 66 20 74 68   a warning if th
19880 65 20 74 61 62 6c 65 20 70 72 69 6d 61 72 79 20  e table primary 
19890 6b 65 79 20 69 73 20 75 73 65 64 20 61 73 20 70  key is used as p
198a0 61 72 74 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20  art of the.  ** 
198b0 69 6e 64 65 78 20 6b 65 79 2e 0a 20 20 2a 2f 0a  index key..  */.
198c0 20 20 66 6f 72 28 69 3d 30 2c 20 70 4c 69 73 74    for(i=0, pList
198d0 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 3b 20 69  Item=pList->a; i
198e0 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69  <pList->nExpr; i
198f0 2b 2b 2c 20 70 4c 69 73 74 49 74 65 6d 2b 2b 29  ++, pListItem++)
19900 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 43 45 78  {.    Expr *pCEx
19910 70 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  pr;             
19920 20 20 20 20 20 2f 2a 20 54 68 65 20 69 2d 74 68       /* The i-th
19930 20 69 6e 64 65 78 20 65 78 70 72 65 73 73 69 6f   index expressio
19940 6e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 65 71  n */.    int req
19950 75 65 73 74 65 64 53 6f 72 74 4f 72 64 65 72 3b  uestedSortOrder;
19960 20 20 20 20 20 20 20 20 2f 2a 20 41 53 43 20 6f          /* ASC o
19970 72 20 44 45 53 43 20 6f 6e 20 74 68 65 20 69 2d  r DESC on the i-
19980 74 68 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f  th expression */
19990 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
199a0 2a 7a 43 6f 6c 6c 3b 20 20 20 20 20 20 20 20 20  *zColl;         
199b0 20 20 20 20 2f 2a 20 43 6f 6c 6c 61 74 69 6f 6e      /* Collation
199c0 20 73 65 71 75 65 6e 63 65 20 6e 61 6d 65 20 2a   sequence name *
199d0 2f 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 53 74  /..    sqlite3St
199e0 72 69 6e 67 54 6f 49 64 28 70 4c 69 73 74 49 74  ringToId(pListIt
199f0 65 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20 20  em->pExpr);.    
19a00 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 53 65  sqlite3ResolveSe
19a10 6c 66 52 65 66 65 72 65 6e 63 65 28 70 50 61 72  lfReference(pPar
19a20 73 65 2c 20 70 54 61 62 2c 20 4e 43 5f 49 64 78  se, pTab, NC_Idx
19a30 45 78 70 72 2c 20 70 4c 69 73 74 49 74 65 6d 2d  Expr, pListItem-
19a40 3e 70 45 78 70 72 2c 20 30 29 3b 0a 20 20 20 20  >pExpr, 0);.    
19a50 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  if( pParse->nErr
19a60 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65   ) goto exit_cre
19a70 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 70  ate_index;.    p
19a80 43 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45  CExpr = sqlite3E
19a90 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70  xprSkipCollate(p
19aa0 4c 69 73 74 49 74 65 6d 2d 3e 70 45 78 70 72 29  ListItem->pExpr)
19ab0 3b 0a 20 20 20 20 69 66 28 20 70 43 45 78 70 72  ;.    if( pCExpr
19ac0 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op!=TK_COLUMN 
19ad0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 54 61  ){.      if( pTa
19ae0 62 3d 3d 70 50 61 72 73 65 2d 3e 70 4e 65 77 54  b==pParse->pNewT
19af0 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20  able ){.        
19b00 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
19b10 70 50 61 72 73 65 2c 20 22 65 78 70 72 65 73 73  pParse, "express
19b20 69 6f 6e 73 20 70 72 6f 68 69 62 69 74 65 64 20  ions prohibited 
19b30 69 6e 20 50 52 49 4d 41 52 59 20 4b 45 59 20 61  in PRIMARY KEY a
19b40 6e 64 20 22 0a 20 20 20 20 20 20 20 20 20 20 20  nd ".           
19b50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19b60 20 20 20 20 20 22 55 4e 49 51 55 45 20 63 6f 6e       "UNIQUE con
19b70 73 74 72 61 69 6e 74 73 22 29 3b 0a 20 20 20 20  straints");.    
19b80 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72      goto exit_cr
19b90 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20  eate_index;.    
19ba0 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 49    }.      if( pI
19bb0 6e 64 65 78 2d 3e 61 43 6f 6c 45 78 70 72 3d 3d  ndex->aColExpr==
19bc0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 45 78 70  0 ){.        Exp
19bd0 72 4c 69 73 74 20 2a 70 43 6f 70 79 20 3d 20 73  rList *pCopy = s
19be0 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75  qlite3ExprListDu
19bf0 70 28 64 62 2c 20 70 4c 69 73 74 2c 20 30 29 3b  p(db, pList, 0);
19c00 0a 20 20 20 20 20 20 20 20 70 49 6e 64 65 78 2d  .        pIndex-
19c10 3e 61 43 6f 6c 45 78 70 72 20 3d 20 70 43 6f 70  >aColExpr = pCop
19c20 79 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21  y;.        if( !
19c30 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
19c40 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73   ){.          as
19c50 73 65 72 74 28 20 70 43 6f 70 79 21 3d 30 20 29  sert( pCopy!=0 )
19c60 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4c 69 73  ;.          pLis
19c70 74 49 74 65 6d 20 3d 20 26 70 43 6f 70 79 2d 3e  tItem = &pCopy->
19c80 61 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 7d 0a  a[i];.        }.
19c90 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6a 20        }.      j 
19ca0 3d 20 58 4e 5f 45 58 50 52 3b 0a 20 20 20 20 20  = XN_EXPR;.     
19cb0 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d   pIndex->aiColum
19cc0 6e 5b 69 5d 20 3d 20 58 4e 5f 45 58 50 52 3b 0a  n[i] = XN_EXPR;.
19cd0 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 75 6e        pIndex->un
19ce0 69 71 4e 6f 74 4e 75 6c 6c 20 3d 20 30 3b 0a 20  iqNotNull = 0;. 
19cf0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
19d00 6a 20 3d 20 70 43 45 78 70 72 2d 3e 69 43 6f 6c  j = pCExpr->iCol
19d10 75 6d 6e 3b 0a 20 20 20 20 20 20 61 73 73 65 72  umn;.      asser
19d20 74 28 20 6a 3c 3d 30 78 37 66 66 66 20 29 3b 0a  t( j<=0x7fff );.
19d30 20 20 20 20 20 20 69 66 28 20 6a 3c 30 20 29 7b        if( j<0 ){
19d40 0a 20 20 20 20 20 20 20 20 6a 20 3d 20 70 54 61  .        j = pTa
19d50 62 2d 3e 69 50 4b 65 79 3b 0a 20 20 20 20 20 20  b->iPKey;.      
19d60 7d 65 6c 73 65 20 69 66 28 20 70 54 61 62 2d 3e  }else if( pTab->
19d70 61 43 6f 6c 5b 6a 5d 2e 6e 6f 74 4e 75 6c 6c 3d  aCol[j].notNull=
19d80 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 49  =0 ){.        pI
19d90 6e 64 65 78 2d 3e 75 6e 69 71 4e 6f 74 4e 75 6c  ndex->uniqNotNul
19da0 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  l = 0;.      }. 
19db0 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 61 69 43       pIndex->aiC
19dc0 6f 6c 75 6d 6e 5b 69 5d 20 3d 20 28 69 31 36 29  olumn[i] = (i16)
19dd0 6a 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 43 6f  j;.    }.    zCo
19de0 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20  ll = 0;.    if( 
19df0 70 4c 69 73 74 49 74 65 6d 2d 3e 70 45 78 70 72  pListItem->pExpr
19e00 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45  ->op==TK_COLLATE
19e10 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 43   ){.      int nC
19e20 6f 6c 6c 3b 0a 20 20 20 20 20 20 7a 43 6f 6c 6c  oll;.      zColl
19e30 20 3d 20 70 4c 69 73 74 49 74 65 6d 2d 3e 70 45   = pListItem->pE
19e40 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20  xpr->u.zToken;. 
19e50 20 20 20 20 20 6e 43 6f 6c 6c 20 3d 20 73 71 6c       nColl = sql
19e60 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 43 6f  ite3Strlen30(zCo
19e70 6c 6c 29 20 2b 20 31 3b 0a 20 20 20 20 20 20 61  ll) + 1;.      a
19e80 73 73 65 72 74 28 20 6e 45 78 74 72 61 3e 3d 6e  ssert( nExtra>=n
19e90 43 6f 6c 6c 20 29 3b 0a 20 20 20 20 20 20 6d 65  Coll );.      me
19ea0 6d 63 70 79 28 7a 45 78 74 72 61 2c 20 7a 43 6f  mcpy(zExtra, zCo
19eb0 6c 6c 2c 20 6e 43 6f 6c 6c 29 3b 0a 20 20 20 20  ll, nColl);.    
19ec0 20 20 7a 43 6f 6c 6c 20 3d 20 7a 45 78 74 72 61    zColl = zExtra
19ed0 3b 0a 20 20 20 20 20 20 7a 45 78 74 72 61 20 2b  ;.      zExtra +
19ee0 3d 20 6e 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 6e  = nColl;.      n
19ef0 45 78 74 72 61 20 2d 3d 20 6e 43 6f 6c 6c 3b 0a  Extra -= nColl;.
19f00 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6a 3e      }else if( j>
19f10 3d 30 20 29 7b 0a 20 20 20 20 20 20 7a 43 6f 6c  =0 ){.      zCol
19f20 6c 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a  l = pTab->aCol[j
19f30 5d 2e 7a 43 6f 6c 6c 3b 0a 20 20 20 20 7d 0a 20  ].zColl;.    }. 
19f40 20 20 20 69 66 28 20 21 7a 43 6f 6c 6c 20 29 20     if( !zColl ) 
19f50 7a 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 53  zColl = sqlite3S
19f60 74 72 42 49 4e 41 52 59 3b 0a 20 20 20 20 69 66  trBINARY;.    if
19f70 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  ( !db->init.busy
19f80 20 26 26 20 21 73 71 6c 69 74 65 33 4c 6f 63 61   && !sqlite3Loca
19f90 74 65 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  teCollSeq(pParse
19fa0 2c 20 7a 43 6f 6c 6c 29 20 29 7b 0a 20 20 20 20  , zColl) ){.    
19fb0 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61    goto exit_crea
19fc0 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a  te_index;.    }.
19fd0 20 20 20 20 70 49 6e 64 65 78 2d 3e 61 7a 43 6f      pIndex->azCo
19fe0 6c 6c 5b 69 5d 20 3d 20 7a 43 6f 6c 6c 3b 0a 20  ll[i] = zColl;. 
19ff0 20 20 20 72 65 71 75 65 73 74 65 64 53 6f 72 74     requestedSort
1a000 4f 72 64 65 72 20 3d 20 70 4c 69 73 74 49 74 65  Order = pListIte
1a010 6d 2d 3e 73 6f 72 74 4f 72 64 65 72 20 26 20 73  m->sortOrder & s
1a020 6f 72 74 4f 72 64 65 72 4d 61 73 6b 3b 0a 20 20  ortOrderMask;.  
1a030 20 20 70 49 6e 64 65 78 2d 3e 61 53 6f 72 74 4f    pIndex->aSortO
1a040 72 64 65 72 5b 69 5d 20 3d 20 28 75 38 29 72 65  rder[i] = (u8)re
1a050 71 75 65 73 74 65 64 53 6f 72 74 4f 72 64 65 72  questedSortOrder
1a060 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 70 70 65  ;.  }..  /* Appe
1a070 6e 64 20 74 68 65 20 74 61 62 6c 65 20 6b 65 79  nd the table key
1a080 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74   to the end of t
1a090 68 65 20 69 6e 64 65 78 2e 20 20 46 6f 72 20 57  he index.  For W
1a0a0 49 54 48 4f 55 54 20 52 4f 57 49 44 0a 20 20 2a  ITHOUT ROWID.  *
1a0b0 2a 20 74 61 62 6c 65 73 20 28 77 68 65 6e 20 70  * tables (when p
1a0c0 50 6b 21 3d 30 29 20 74 68 69 73 20 77 69 6c 6c  Pk!=0) this will
1a0d0 20 62 65 20 74 68 65 20 64 65 63 6c 61 72 65 64   be the declared
1a0e0 20 50 52 49 4d 41 52 59 20 4b 45 59 2e 20 20 46   PRIMARY KEY.  F
1a0f0 6f 72 0a 20 20 2a 2a 20 6e 6f 72 6d 61 6c 20 74  or.  ** normal t
1a100 61 62 6c 65 73 20 28 77 68 65 6e 20 70 50 6b 3d  ables (when pPk=
1a110 3d 30 29 20 74 68 69 73 20 77 69 6c 6c 20 62 65  =0) this will be
1a120 20 74 68 65 20 72 6f 77 69 64 2e 0a 20 20 2a 2f   the rowid..  */
1a130 0a 20 20 69 66 28 20 70 50 6b 20 29 7b 0a 20 20  .  if( pPk ){.  
1a140 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 50 6b    for(j=0; j<pPk
1a150 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 6a 2b 2b 29 7b  ->nKeyCol; j++){
1a160 0a 20 20 20 20 20 20 69 6e 74 20 78 20 3d 20 70  .      int x = p
1a170 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 3b  Pk->aiColumn[j];
1a180 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 78  .      assert( x
1a190 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28  >=0 );.      if(
1a1a0 20 68 61 73 43 6f 6c 75 6d 6e 28 70 49 6e 64 65   hasColumn(pInde
1a1b0 78 2d 3e 61 69 43 6f 6c 75 6d 6e 2c 20 70 49 6e  x->aiColumn, pIn
1a1c0 64 65 78 2d 3e 6e 4b 65 79 43 6f 6c 2c 20 78 29  dex->nKeyCol, x)
1a1d0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 49 6e 64   ){.        pInd
1a1e0 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 2d 2d 3b 20 0a  ex->nColumn--; .
1a1f0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1a200 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 61 69 43       pIndex->aiC
1a210 6f 6c 75 6d 6e 5b 69 5d 20 3d 20 78 3b 0a 20 20  olumn[i] = x;.  
1a220 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 61 7a        pIndex->az
1a230 43 6f 6c 6c 5b 69 5d 20 3d 20 70 50 6b 2d 3e 61  Coll[i] = pPk->a
1a240 7a 43 6f 6c 6c 5b 6a 5d 3b 0a 20 20 20 20 20 20  zColl[j];.      
1a250 20 20 70 49 6e 64 65 78 2d 3e 61 53 6f 72 74 4f    pIndex->aSortO
1a260 72 64 65 72 5b 69 5d 20 3d 20 70 50 6b 2d 3e 61  rder[i] = pPk->a
1a270 53 6f 72 74 4f 72 64 65 72 5b 6a 5d 3b 0a 20 20  SortOrder[j];.  
1a280 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20 20        i++;.     
1a290 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73   }.    }.    ass
1a2a0 65 72 74 28 20 69 3d 3d 70 49 6e 64 65 78 2d 3e  ert( i==pIndex->
1a2b0 6e 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20 7d 65 6c  nColumn );.  }el
1a2c0 73 65 7b 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e  se{.    pIndex->
1a2d0 61 69 43 6f 6c 75 6d 6e 5b 69 5d 20 3d 20 58 4e  aiColumn[i] = XN
1a2e0 5f 52 4f 57 49 44 3b 0a 20 20 20 20 70 49 6e 64  _ROWID;.    pInd
1a2f0 65 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 20 3d 20  ex->azColl[i] = 
1a300 73 71 6c 69 74 65 33 53 74 72 42 49 4e 41 52 59  sqlite3StrBINARY
1a310 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44  ;.  }.  sqlite3D
1a320 65 66 61 75 6c 74 52 6f 77 45 73 74 28 70 49 6e  efaultRowEst(pIn
1a330 64 65 78 29 3b 0a 20 20 69 66 28 20 70 50 61 72  dex);.  if( pPar
1a340 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3d 3d 30  se->pNewTable==0
1a350 20 29 20 65 73 74 69 6d 61 74 65 49 6e 64 65 78   ) estimateIndex
1a360 57 69 64 74 68 28 70 49 6e 64 65 78 29 3b 0a 0a  Width(pIndex);..
1a370 20 20 69 66 28 20 70 54 61 62 3d 3d 70 50 61 72    if( pTab==pPar
1a380 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 29 7b  se->pNewTable ){
1a390 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 72 6f 75  .    /* This rou
1a3a0 74 69 6e 65 20 68 61 73 20 62 65 65 6e 20 63 61  tine has been ca
1a3b0 6c 6c 65 64 20 74 6f 20 63 72 65 61 74 65 20 61  lled to create a
1a3c0 6e 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65  n automatic inde
1a3d0 78 20 61 73 20 61 0a 20 20 20 20 2a 2a 20 72 65  x as a.    ** re
1a3e0 73 75 6c 74 20 6f 66 20 61 20 50 52 49 4d 41 52  sult of a PRIMAR
1a3f0 59 20 4b 45 59 20 6f 72 20 55 4e 49 51 55 45 20  Y KEY or UNIQUE 
1a400 63 6c 61 75 73 65 20 6f 6e 20 61 20 63 6f 6c 75  clause on a colu
1a410 6d 6e 20 64 65 66 69 6e 69 74 69 6f 6e 2c 20 6f  mn definition, o
1a420 72 0a 20 20 20 20 2a 2a 20 61 20 50 52 49 4d 41  r.    ** a PRIMA
1a430 52 59 20 4b 45 59 20 6f 72 20 55 4e 49 51 55 45  RY KEY or UNIQUE
1a440 20 63 6c 61 75 73 65 20 66 6f 6c 6c 6f 77 69 6e   clause followin
1a450 67 20 74 68 65 20 63 6f 6c 75 6d 6e 20 64 65 66  g the column def
1a460 69 6e 69 74 69 6f 6e 73 2e 0a 20 20 20 20 2a 2a  initions..    **
1a470 20 69 2e 65 2e 20 6f 6e 65 20 6f 66 3a 0a 20 20   i.e. one of:.  
1a480 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 43 52 45 41    **.    ** CREA
1a490 54 45 20 54 41 42 4c 45 20 74 28 78 20 50 52 49  TE TABLE t(x PRI
1a4a0 4d 41 52 59 20 4b 45 59 2c 20 79 29 3b 0a 20 20  MARY KEY, y);.  
1a4b0 20 20 2a 2a 20 43 52 45 41 54 45 20 54 41 42 4c    ** CREATE TABL
1a4c0 45 20 74 28 78 2c 20 79 2c 20 55 4e 49 51 55 45  E t(x, y, UNIQUE
1a4d0 28 78 2c 20 79 29 29 3b 0a 20 20 20 20 2a 2a 0a  (x, y));.    **.
1a4e0 20 20 20 20 2a 2a 20 45 69 74 68 65 72 20 77 61      ** Either wa
1a4f0 79 2c 20 63 68 65 63 6b 20 74 6f 20 73 65 65 20  y, check to see 
1a500 69 66 20 74 68 65 20 74 61 62 6c 65 20 61 6c 72  if the table alr
1a510 65 61 64 79 20 68 61 73 20 73 75 63 68 20 61 6e  eady has such an
1a520 20 69 6e 64 65 78 2e 20 49 66 0a 20 20 20 20 2a   index. If.    *
1a530 2a 20 73 6f 2c 20 64 6f 6e 27 74 20 62 6f 74 68  * so, don't both
1a540 65 72 20 63 72 65 61 74 69 6e 67 20 74 68 69 73  er creating this
1a550 20 6f 6e 65 2e 20 54 68 69 73 20 6f 6e 6c 79 20   one. This only 
1a560 61 70 70 6c 69 65 73 20 74 6f 0a 20 20 20 20 2a  applies to.    *
1a570 2a 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  * automatically 
1a580 63 72 65 61 74 65 64 20 69 6e 64 69 63 65 73 2e  created indices.
1a590 20 55 73 65 72 73 20 63 61 6e 20 64 6f 20 61 73   Users can do as
1a5a0 20 74 68 65 79 20 77 69 73 68 20 77 69 74 68 0a   they wish with.
1a5b0 20 20 20 20 2a 2a 20 65 78 70 6c 69 63 69 74 20      ** explicit 
1a5c0 69 6e 64 69 63 65 73 2e 0a 20 20 20 20 2a 2a 0a  indices..    **.
1a5d0 20 20 20 20 2a 2a 20 54 77 6f 20 55 4e 49 51 55      ** Two UNIQU
1a5e0 45 20 6f 72 20 50 52 49 4d 41 52 59 20 4b 45 59  E or PRIMARY KEY
1a5f0 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 61 72 65   constraints are
1a600 20 63 6f 6e 73 69 64 65 72 65 64 20 65 71 75 69   considered equi
1a610 76 61 6c 65 6e 74 0a 20 20 20 20 2a 2a 20 28 61  valent.    ** (a
1a620 6e 64 20 74 68 75 73 20 73 75 70 70 72 65 73 73  nd thus suppress
1a630 69 6e 67 20 74 68 65 20 73 65 63 6f 6e 64 20 6f  ing the second o
1a640 6e 65 29 20 65 76 65 6e 20 69 66 20 74 68 65 79  ne) even if they
1a650 20 68 61 76 65 20 64 69 66 66 65 72 65 6e 74 0a   have different.
1a660 20 20 20 20 2a 2a 20 73 6f 72 74 20 6f 72 64 65      ** sort orde
1a670 72 73 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  rs..    **.    *
1a680 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20 64  * If there are d
1a690 69 66 66 65 72 65 6e 74 20 63 6f 6c 6c 61 74 69  ifferent collati
1a6a0 6e 67 20 73 65 71 75 65 6e 63 65 73 20 6f 72 20  ng sequences or 
1a6b0 69 66 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 6f  if the columns o
1a6c0 66 0a 20 20 20 20 2a 2a 20 74 68 65 20 63 6f 6e  f.    ** the con
1a6d0 73 74 72 61 69 6e 74 20 6f 63 63 75 72 20 69 6e  straint occur in
1a6e0 20 64 69 66 66 65 72 65 6e 74 20 6f 72 64 65 72   different order
1a6f0 73 2c 20 74 68 65 6e 20 74 68 65 20 63 6f 6e 73  s, then the cons
1a700 74 72 61 69 6e 74 73 20 61 72 65 0a 20 20 20 20  traints are.    
1a710 2a 2a 20 63 6f 6e 73 69 64 65 72 65 64 20 64 69  ** considered di
1a720 73 74 69 6e 63 74 20 61 6e 64 20 62 6f 74 68 20  stinct and both 
1a730 72 65 73 75 6c 74 20 69 6e 20 73 65 70 61 72 61  result in separa
1a740 74 65 20 69 6e 64 69 63 65 73 2e 0a 20 20 20 20  te indices..    
1a750 2a 2f 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49  */.    Index *pI
1a760 64 78 3b 0a 20 20 20 20 66 6f 72 28 70 49 64 78  dx;.    for(pIdx
1a770 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70  =pTab->pIndex; p
1a780 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e  Idx; pIdx=pIdx->
1a790 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 6e  pNext){.      in
1a7a0 74 20 6b 3b 0a 20 20 20 20 20 20 61 73 73 65 72  t k;.      asser
1a7b0 74 28 20 49 73 55 6e 69 71 75 65 49 6e 64 65 78  t( IsUniqueIndex
1a7c0 28 70 49 64 78 29 20 29 3b 0a 20 20 20 20 20 20  (pIdx) );.      
1a7d0 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e 69 64  assert( pIdx->id
1a7e0 78 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 49 44  xType!=SQLITE_ID
1a7f0 58 54 59 50 45 5f 41 50 50 44 45 46 20 29 3b 0a  XTYPE_APPDEF );.
1a800 20 20 20 20 20 20 61 73 73 65 72 74 28 20 49 73        assert( Is
1a810 55 6e 69 71 75 65 49 6e 64 65 78 28 70 49 6e 64  UniqueIndex(pInd
1a820 65 78 29 20 29 3b 0a 0a 20 20 20 20 20 20 69 66  ex) );..      if
1a830 28 20 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 21  ( pIdx->nKeyCol!
1a840 3d 70 49 6e 64 65 78 2d 3e 6e 4b 65 79 43 6f 6c  =pIndex->nKeyCol
1a850 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
1a860 20 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70 49     for(k=0; k<pI
1a870 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 6b 2b 2b  dx->nKeyCol; k++
1a880 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74  ){.        const
1a890 20 63 68 61 72 20 2a 7a 31 3b 0a 20 20 20 20 20   char *z1;.     
1a8a0 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
1a8b0 32 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  2;.        asser
1a8c0 74 28 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d  t( pIdx->aiColum
1a8d0 6e 5b 6b 5d 3e 3d 30 20 29 3b 0a 20 20 20 20 20  n[k]>=0 );.     
1a8e0 20 20 20 69 66 28 20 70 49 64 78 2d 3e 61 69 43     if( pIdx->aiC
1a8f0 6f 6c 75 6d 6e 5b 6b 5d 21 3d 70 49 6e 64 65 78  olumn[k]!=pIndex
1a900 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6b 5d 20 29 20  ->aiColumn[k] ) 
1a910 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7a  break;.        z
1a920 31 20 3d 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c  1 = pIdx->azColl
1a930 5b 6b 5d 3b 0a 20 20 20 20 20 20 20 20 7a 32 20  [k];.        z2 
1a940 3d 20 70 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c  = pIndex->azColl
1a950 5b 6b 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28  [k];.        if(
1a960 20 7a 31 21 3d 7a 32 20 26 26 20 73 71 6c 69 74   z1!=z2 && sqlit
1a970 65 33 53 74 72 49 43 6d 70 28 7a 31 2c 20 7a 32  e3StrICmp(z1, z2
1a980 29 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  ) ) break;.     
1a990 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6b 3d 3d   }.      if( k==
1a9a0 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 20 29 7b  pIdx->nKeyCol ){
1a9b0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 49 64  .        if( pId
1a9c0 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d 70 49 6e 64  x->onError!=pInd
1a9d0 65 78 2d 3e 6f 6e 45 72 72 6f 72 20 29 7b 0a 20  ex->onError ){. 
1a9e0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73           /* This
1a9f0 20 63 6f 6e 73 74 72 61 69 6e 74 20 63 72 65 61   constraint crea
1aa00 74 65 73 20 74 68 65 20 73 61 6d 65 20 69 6e 64  tes the same ind
1aa10 65 78 20 61 73 20 61 20 70 72 65 76 69 6f 75 73  ex as a previous
1aa20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 6f  .          ** co
1aa30 6e 73 74 72 61 69 6e 74 20 73 70 65 63 69 66 69  nstraint specifi
1aa40 65 64 20 73 6f 6d 65 77 68 65 72 65 20 69 6e 20  ed somewhere in 
1aa50 74 68 65 20 43 52 45 41 54 45 20 54 41 42 4c 45  the CREATE TABLE
1aa60 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20 20 20   statement..    
1aa70 20 20 20 20 20 20 2a 2a 20 48 6f 77 65 76 65 72        ** However
1aa80 20 74 68 65 20 4f 4e 20 43 4f 4e 46 4c 49 43 54   the ON CONFLICT
1aa90 20 63 6c 61 75 73 65 73 20 61 72 65 20 64 69 66   clauses are dif
1aaa0 66 65 72 65 6e 74 2e 20 49 66 20 62 6f 74 68 20  ferent. If both 
1aab0 74 68 69 73 20 0a 20 20 20 20 20 20 20 20 20 20  this .          
1aac0 2a 2a 20 63 6f 6e 73 74 72 61 69 6e 74 20 61 6e  ** constraint an
1aad0 64 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 65  d the previous e
1aae0 71 75 69 76 61 6c 65 6e 74 20 63 6f 6e 73 74 72  quivalent constr
1aaf0 61 69 6e 74 20 68 61 76 65 20 65 78 70 6c 69 63  aint have explic
1ab00 69 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  it.          ** 
1ab10 4f 4e 20 43 4f 4e 46 4c 49 43 54 20 63 6c 61 75  ON CONFLICT clau
1ab20 73 65 73 20 74 68 69 73 20 69 73 20 61 6e 20 65  ses this is an e
1ab30 72 72 6f 72 2e 20 4f 74 68 65 72 77 69 73 65 2c  rror. Otherwise,
1ab40 20 75 73 65 20 74 68 65 0a 20 20 20 20 20 20 20   use the.       
1ab50 20 20 20 2a 2a 20 65 78 70 6c 69 63 69 74 6c 79     ** explicitly
1ab60 20 73 70 65 63 69 66 69 65 64 20 62 65 68 61 76   specified behav
1ab70 69 6f 72 20 66 6f 72 20 74 68 65 20 69 6e 64 65  ior for the inde
1ab80 78 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a  x..          */.
1ab90 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21 28            if( !(
1aba0 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f  pIdx->onError==O
1abb0 45 5f 44 65 66 61 75 6c 74 20 7c 7c 20 70 49 6e  E_Default || pIn
1abc0 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45  dex->onError==OE
1abd0 5f 44 65 66 61 75 6c 74 29 20 29 7b 0a 20 20 20  _Default) ){.   
1abe0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
1abf0 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
1ac00 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
1ac10 20 20 22 63 6f 6e 66 6c 69 63 74 69 6e 67 20 4f    "conflicting O
1ac20 4e 20 43 4f 4e 46 4c 49 43 54 20 63 6c 61 75 73  N CONFLICT claus
1ac30 65 73 20 73 70 65 63 69 66 69 65 64 22 2c 20 30  es specified", 0
1ac40 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
1ac50 20 20 20 20 20 20 20 20 20 69 66 28 20 70 49 64           if( pId
1ac60 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 44  x->onError==OE_D
1ac70 65 66 61 75 6c 74 20 29 7b 0a 20 20 20 20 20 20  efault ){.      
1ac80 20 20 20 20 20 20 70 49 64 78 2d 3e 6f 6e 45 72        pIdx->onEr
1ac90 72 6f 72 20 3d 20 70 49 6e 64 65 78 2d 3e 6f 6e  ror = pIndex->on
1aca0 45 72 72 6f 72 3b 0a 20 20 20 20 20 20 20 20 20  Error;.         
1acb0 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
1acc0 20 20 20 20 20 70 52 65 74 20 3d 20 70 49 64 78       pRet = pIdx
1acd0 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65  ;.        goto e
1ace0 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
1acf0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1ad00 20 20 7d 0a 0a 20 20 2f 2a 20 4c 69 6e 6b 20 74    }..  /* Link t
1ad10 68 65 20 6e 65 77 20 49 6e 64 65 78 20 73 74 72  he new Index str
1ad20 75 63 74 75 72 65 20 74 6f 20 69 74 73 20 74 61  ucture to its ta
1ad30 62 6c 65 20 61 6e 64 20 74 6f 20 74 68 65 20 6f  ble and to the o
1ad40 74 68 65 72 0a 20 20 2a 2a 20 69 6e 2d 6d 65 6d  ther.  ** in-mem
1ad50 6f 72 79 20 64 61 74 61 62 61 73 65 20 73 74 72  ory database str
1ad60 75 63 74 75 72 65 73 2e 20 0a 20 20 2a 2f 0a 20  uctures. .  */. 
1ad70 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d   assert( pParse-
1ad80 3e 6e 45 72 72 3d 3d 30 20 29 3b 0a 20 20 69 66  >nErr==0 );.  if
1ad90 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20  ( db->init.busy 
1ada0 29 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 3b  ){.    Index *p;
1adb0 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c  .    assert( sql
1adc0 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48  ite3SchemaMutexH
1add0 65 6c 64 28 64 62 2c 20 30 2c 20 70 49 6e 64 65  eld(db, 0, pInde
1ade0 78 2d 3e 70 53 63 68 65 6d 61 29 20 29 3b 0a 20  x->pSchema) );. 
1adf0 20 20 20 70 20 3d 20 73 71 6c 69 74 65 33 48 61     p = sqlite3Ha
1ae00 73 68 49 6e 73 65 72 74 28 26 70 49 6e 64 65 78  shInsert(&pIndex
1ae10 2d 3e 70 53 63 68 65 6d 61 2d 3e 69 64 78 48 61  ->pSchema->idxHa
1ae20 73 68 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  sh, .           
1ae30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
1ae40 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 70 49  Index->zName, pI
1ae50 6e 64 65 78 29 3b 0a 20 20 20 20 69 66 28 20 70  ndex);.    if( p
1ae60 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
1ae70 28 20 70 3d 3d 70 49 6e 64 65 78 20 29 3b 20 20  ( p==pIndex );  
1ae80 2f 2a 20 4d 61 6c 6c 6f 63 20 6d 75 73 74 20 68  /* Malloc must h
1ae90 61 76 65 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20  ave failed */.  
1aea0 20 20 20 20 73 71 6c 69 74 65 33 4f 6f 6d 46 61      sqlite3OomFa
1aeb0 75 6c 74 28 64 62 29 3b 0a 20 20 20 20 20 20 67  ult(db);.      g
1aec0 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
1aed0 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20  index;.    }.   
1aee0 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51   db->flags |= SQ
1aef0 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67  LITE_InternChang
1af00 65 73 3b 0a 20 20 20 20 69 66 28 20 70 54 62 6c  es;.    if( pTbl
1af10 4e 61 6d 65 21 3d 30 20 29 7b 0a 20 20 20 20 20  Name!=0 ){.     
1af20 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 20 3d 20   pIndex->tnum = 
1af30 64 62 2d 3e 69 6e 69 74 2e 6e 65 77 54 6e 75 6d  db->init.newTnum
1af40 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
1af50 2a 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65  * If this is the
1af60 20 69 6e 69 74 69 61 6c 20 43 52 45 41 54 45 20   initial CREATE 
1af70 49 4e 44 45 58 20 73 74 61 74 65 6d 65 6e 74 20  INDEX statement 
1af80 28 6f 72 20 43 52 45 41 54 45 20 54 41 42 4c 45  (or CREATE TABLE
1af90 20 69 66 20 74 68 65 0a 20 20 2a 2a 20 69 6e 64   if the.  ** ind
1afa0 65 78 20 69 73 20 61 6e 20 69 6d 70 6c 69 65 64  ex is an implied
1afb0 20 69 6e 64 65 78 20 66 6f 72 20 61 20 55 4e 49   index for a UNI
1afc0 51 55 45 20 6f 72 20 50 52 49 4d 41 52 59 20 4b  QUE or PRIMARY K
1afd0 45 59 20 63 6f 6e 73 74 72 61 69 6e 74 29 20 74  EY constraint) t
1afe0 68 65 6e 0a 20 20 2a 2a 20 65 6d 69 74 20 63 6f  hen.  ** emit co
1aff0 64 65 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 74  de to allocate t
1b000 68 65 20 69 6e 64 65 78 20 72 6f 6f 74 70 61 67  he index rootpag
1b010 65 20 6f 6e 20 64 69 73 6b 20 61 6e 64 20 6d 61  e on disk and ma
1b020 6b 65 20 61 6e 20 65 6e 74 72 79 20 66 6f 72 0a  ke an entry for.
1b030 20 20 2a 2a 20 74 68 65 20 69 6e 64 65 78 20 69    ** the index i
1b040 6e 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73  n the sqlite_mas
1b050 74 65 72 20 74 61 62 6c 65 20 61 6e 64 20 70 6f  ter table and po
1b060 70 75 6c 61 74 65 20 74 68 65 20 69 6e 64 65 78  pulate the index
1b070 20 77 69 74 68 0a 20 20 2a 2a 20 63 6f 6e 74 65   with.  ** conte
1b080 6e 74 2e 20 20 42 75 74 2c 20 64 6f 20 6e 6f 74  nt.  But, do not
1b090 20 64 6f 20 74 68 69 73 20 69 66 20 77 65 20 61   do this if we a
1b0a0 72 65 20 73 69 6d 70 6c 79 20 72 65 61 64 69 6e  re simply readin
1b0b0 67 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73  g the sqlite_mas
1b0c0 74 65 72 0a 20 20 2a 2a 20 74 61 62 6c 65 20 74  ter.  ** table t
1b0d0 6f 20 70 61 72 73 65 20 74 68 65 20 73 63 68 65  o parse the sche
1b0e0 6d 61 2c 20 6f 72 20 69 66 20 74 68 69 73 20 69  ma, or if this i
1b0f0 6e 64 65 78 20 69 73 20 74 68 65 20 50 52 49 4d  ndex is the PRIM
1b100 41 52 59 20 4b 45 59 20 69 6e 64 65 78 0a 20 20  ARY KEY index.  
1b110 2a 2a 20 6f 66 20 61 20 57 49 54 48 4f 55 54 20  ** of a WITHOUT 
1b120 52 4f 57 49 44 20 74 61 62 6c 65 2e 0a 20 20 2a  ROWID table..  *
1b130 2a 0a 20 20 2a 2a 20 49 66 20 70 54 62 6c 4e 61  *.  ** If pTblNa
1b140 6d 65 3d 3d 30 20 69 74 20 6d 65 61 6e 73 20 74  me==0 it means t
1b150 68 69 73 20 69 6e 64 65 78 20 69 73 20 67 65 6e  his index is gen
1b160 65 72 61 74 65 64 20 61 73 20 61 6e 20 69 6d 70  erated as an imp
1b170 6c 69 65 64 20 50 52 49 4d 41 52 59 20 4b 45 59  lied PRIMARY KEY
1b180 0a 20 20 2a 2a 20 6f 72 20 55 4e 49 51 55 45 20  .  ** or UNIQUE 
1b190 69 6e 64 65 78 20 69 6e 20 61 20 43 52 45 41 54  index in a CREAT
1b1a0 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e  E TABLE statemen
1b1b0 74 2e 20 20 53 69 6e 63 65 20 74 68 65 20 74 61  t.  Since the ta
1b1c0 62 6c 65 0a 20 20 2a 2a 20 68 61 73 20 6a 75 73  ble.  ** has jus
1b1d0 74 20 62 65 65 6e 20 63 72 65 61 74 65 64 2c 20  t been created, 
1b1e0 69 74 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 64  it contains no d
1b1f0 61 74 61 20 61 6e 64 20 74 68 65 20 69 6e 64 65  ata and the inde
1b200 78 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e  x initialization
1b210 0a 20 20 2a 2a 20 73 74 65 70 20 63 61 6e 20 62  .  ** step can b
1b220 65 20 73 6b 69 70 70 65 64 2e 0a 20 20 2a 2f 0a  e skipped..  */.
1b230 20 20 65 6c 73 65 20 69 66 28 20 48 61 73 52 6f    else if( HasRo
1b240 77 69 64 28 70 54 61 62 29 20 7c 7c 20 70 54 62  wid(pTab) || pTb
1b250 6c 4e 61 6d 65 21 3d 30 20 29 7b 0a 20 20 20 20  lName!=0 ){.    
1b260 56 64 62 65 20 2a 76 3b 0a 20 20 20 20 63 68 61  Vdbe *v;.    cha
1b270 72 20 2a 7a 53 74 6d 74 3b 0a 20 20 20 20 69 6e  r *zStmt;.    in
1b280 74 20 69 4d 65 6d 20 3d 20 2b 2b 70 50 61 72 73  t iMem = ++pPars
1b290 65 2d 3e 6e 4d 65 6d 3b 0a 0a 20 20 20 20 76 20  e->nMem;..    v 
1b2a0 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
1b2b0 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 69 66  (pParse);.    if
1b2c0 28 20 76 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78  ( v==0 ) goto ex
1b2d0 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
1b2e0 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65 67  ..    sqlite3Beg
1b2f0 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e  inWriteOperation
1b300 28 70 50 61 72 73 65 2c 20 31 2c 20 69 44 62 29  (pParse, 1, iDb)
1b310 3b 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65  ;..    /* Create
1b320 20 74 68 65 20 72 6f 6f 74 70 61 67 65 20 66 6f   the rootpage fo
1b330 72 20 74 68 65 20 69 6e 64 65 78 20 75 73 69 6e  r the index usin
1b340 67 20 43 72 65 61 74 65 49 6e 64 65 78 2e 20 42  g CreateIndex. B
1b350 75 74 20 62 65 66 6f 72 65 0a 20 20 20 20 2a 2a  ut before.    **
1b360 20 64 6f 69 6e 67 20 73 6f 2c 20 63 6f 64 65 20   doing so, code 
1b370 61 20 4e 6f 6f 70 20 69 6e 73 74 72 75 63 74 69  a Noop instructi
1b380 6f 6e 20 61 6e 64 20 73 74 6f 72 65 20 69 74 73  on and store its
1b390 20 61 64 64 72 65 73 73 20 69 6e 20 0a 20 20 20   address in .   
1b3a0 20 2a 2a 20 49 6e 64 65 78 2e 74 6e 75 6d 2e 20   ** Index.tnum. 
1b3b0 54 68 69 73 20 69 73 20 72 65 71 75 69 72 65 64  This is required
1b3c0 20 69 6e 20 63 61 73 65 20 74 68 69 73 20 69 6e   in case this in
1b3d0 64 65 78 20 69 73 20 61 63 74 75 61 6c 6c 79 20  dex is actually 
1b3e0 61 20 0a 20 20 20 20 2a 2a 20 50 52 49 4d 41 52  a .    ** PRIMAR
1b3f0 59 20 4b 45 59 20 61 6e 64 20 74 68 65 20 74 61  Y KEY and the ta
1b400 62 6c 65 20 69 73 20 61 63 74 75 61 6c 6c 79 20  ble is actually 
1b410 61 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 20  a WITHOUT ROWID 
1b420 74 61 62 6c 65 2e 20 49 6e 20 0a 20 20 20 20 2a  table. In .    *
1b430 2a 20 74 68 61 74 20 63 61 73 65 20 74 68 65 20  * that case the 
1b440 63 6f 6e 76 65 72 74 54 6f 57 69 74 68 6f 75 74  convertToWithout
1b450 52 6f 77 69 64 54 61 62 6c 65 28 29 20 72 6f 75  RowidTable() rou
1b460 74 69 6e 65 20 77 69 6c 6c 20 72 65 70 6c 61 63  tine will replac
1b470 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 4e 6f 6f  e.    ** the Noo
1b480 70 20 77 69 74 68 20 61 20 47 6f 74 6f 20 74 6f  p with a Goto to
1b490 20 6a 75 6d 70 20 6f 76 65 72 20 74 68 65 20 56   jump over the V
1b4a0 44 42 45 20 63 6f 64 65 20 67 65 6e 65 72 61 74  DBE code generat
1b4b0 65 64 20 62 65 6c 6f 77 2e 20 2a 2f 0a 20 20 20  ed below. */.   
1b4c0 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 20 3d 20   pIndex->tnum = 
1b4d0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1b4e0 30 28 76 2c 20 4f 50 5f 4e 6f 6f 70 29 3b 0a 20  0(v, OP_Noop);. 
1b4f0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1b500 64 4f 70 32 28 76 2c 20 4f 50 5f 43 72 65 61 74  dOp2(v, OP_Creat
1b510 65 49 6e 64 65 78 2c 20 69 44 62 2c 20 69 4d 65  eIndex, iDb, iMe
1b520 6d 29 3b 0a 0a 20 20 20 20 2f 2a 20 47 61 74 68  m);..    /* Gath
1b530 65 72 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20  er the complete 
1b540 74 65 78 74 20 6f 66 20 74 68 65 20 43 52 45 41  text of the CREA
1b550 54 45 20 49 4e 44 45 58 20 73 74 61 74 65 6d 65  TE INDEX stateme
1b560 6e 74 20 69 6e 74 6f 0a 20 20 20 20 2a 2a 20 74  nt into.    ** t
1b570 68 65 20 7a 53 74 6d 74 20 76 61 72 69 61 62 6c  he zStmt variabl
1b580 65 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  e.    */.    if(
1b590 20 70 53 74 61 72 74 20 29 7b 0a 20 20 20 20 20   pStart ){.     
1b5a0 20 69 6e 74 20 6e 20 3d 20 28 69 6e 74 29 28 70   int n = (int)(p
1b5b0 50 61 72 73 65 2d 3e 73 4c 61 73 74 54 6f 6b 65  Parse->sLastToke
1b5c0 6e 2e 7a 20 2d 20 70 4e 61 6d 65 2d 3e 7a 29 20  n.z - pName->z) 
1b5d0 2b 20 70 50 61 72 73 65 2d 3e 73 4c 61 73 74 54  + pParse->sLastT
1b5e0 6f 6b 65 6e 2e 6e 3b 0a 20 20 20 20 20 20 69 66  oken.n;.      if
1b5f0 28 20 70 4e 61 6d 65 2d 3e 7a 5b 6e 2d 31 5d 3d  ( pName->z[n-1]=
1b600 3d 27 3b 27 20 29 20 6e 2d 2d 3b 0a 20 20 20 20  =';' ) n--;.    
1b610 20 20 2f 2a 20 41 20 6e 61 6d 65 64 20 69 6e 64    /* A named ind
1b620 65 78 20 77 69 74 68 20 61 6e 20 65 78 70 6c 69  ex with an expli
1b630 63 69 74 20 43 52 45 41 54 45 20 49 4e 44 45 58  cit CREATE INDEX
1b640 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20   statement */.  
1b650 20 20 20 20 7a 53 74 6d 74 20 3d 20 73 71 6c 69      zStmt = sqli
1b660 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22  te3MPrintf(db, "
1b670 43 52 45 41 54 45 25 73 20 49 4e 44 45 58 20 25  CREATE%s INDEX %
1b680 2e 2a 73 22 2c 0a 20 20 20 20 20 20 20 20 6f 6e  .*s",.        on
1b690 45 72 72 6f 72 3d 3d 4f 45 5f 4e 6f 6e 65 20 3f  Error==OE_None ?
1b6a0 20 22 22 20 3a 20 22 20 55 4e 49 51 55 45 22 2c   "" : " UNIQUE",
1b6b0 20 6e 2c 20 70 4e 61 6d 65 2d 3e 7a 29 3b 0a 20   n, pName->z);. 
1b6c0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1b6d0 2f 2a 20 41 6e 20 61 75 74 6f 6d 61 74 69 63 20  /* An automatic 
1b6e0 69 6e 64 65 78 20 63 72 65 61 74 65 64 20 62 79  index created by
1b6f0 20 61 20 50 52 49 4d 41 52 59 20 4b 45 59 20 6f   a PRIMARY KEY o
1b700 72 20 55 4e 49 51 55 45 20 63 6f 6e 73 74 72 61  r UNIQUE constra
1b710 69 6e 74 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20  int */.      /* 
1b720 7a 53 74 6d 74 20 3d 20 73 71 6c 69 74 65 33 4d  zStmt = sqlite3M
1b730 50 72 69 6e 74 66 28 22 22 29 3b 20 2a 2f 0a 20  Printf(""); */. 
1b740 20 20 20 20 20 7a 53 74 6d 74 20 3d 20 30 3b 0a       zStmt = 0;.
1b750 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 64      }..    /* Ad
1b760 64 20 61 6e 20 65 6e 74 72 79 20 69 6e 20 73 71  d an entry in sq
1b770 6c 69 74 65 5f 6d 61 73 74 65 72 20 66 6f 72 20  lite_master for 
1b780 74 68 69 73 20 69 6e 64 65 78 0a 20 20 20 20 2a  this index.    *
1b790 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 4e 65 73  /.    sqlite3Nes
1b7a0 74 65 64 50 61 72 73 65 28 70 50 61 72 73 65 2c  tedParse(pParse,
1b7b0 20 0a 20 20 20 20 20 20 20 20 22 49 4e 53 45 52   .        "INSER
1b7c0 54 20 49 4e 54 4f 20 25 51 2e 25 73 20 56 41 4c  T INTO %Q.%s VAL
1b7d0 55 45 53 28 27 69 6e 64 65 78 27 2c 25 51 2c 25  UES('index',%Q,%
1b7e0 51 2c 23 25 64 2c 25 51 29 3b 22 2c 0a 20 20 20  Q,#%d,%Q);",.   
1b7f0 20 20 20 20 20 64 62 2d 3e 61 44 62 5b 69 44 62       db->aDb[iDb
1b800 5d 2e 7a 4e 61 6d 65 2c 20 53 43 48 45 4d 41 5f  ].zName, SCHEMA_
1b810 54 41 42 4c 45 28 69 44 62 29 2c 0a 20 20 20 20  TABLE(iDb),.    
1b820 20 20 20 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d      pIndex->zNam
1b830 65 2c 0a 20 20 20 20 20 20 20 20 70 54 61 62 2d  e,.        pTab-
1b840 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20  >zName,.        
1b850 69 4d 65 6d 2c 0a 20 20 20 20 20 20 20 20 7a 53  iMem,.        zS
1b860 74 6d 74 0a 20 20 20 20 29 3b 0a 20 20 20 20 73  tmt.    );.    s
1b870 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
1b880 20 7a 53 74 6d 74 29 3b 0a 0a 20 20 20 20 2f 2a   zStmt);..    /*
1b890 20 46 69 6c 6c 20 74 68 65 20 69 6e 64 65 78 20   Fill the index 
1b8a0 77 69 74 68 20 64 61 74 61 20 61 6e 64 20 72 65  with data and re
1b8b0 70 61 72 73 65 20 74 68 65 20 73 63 68 65 6d 61  parse the schema
1b8c0 2e 20 43 6f 64 65 20 61 6e 20 4f 50 5f 45 78 70  . Code an OP_Exp
1b8d0 69 72 65 0a 20 20 20 20 2a 2a 20 74 6f 20 69 6e  ire.    ** to in
1b8e0 76 61 6c 69 64 61 74 65 20 61 6c 6c 20 70 72 65  validate all pre
1b8f0 2d 63 6f 6d 70 69 6c 65 64 20 73 74 61 74 65 6d  -compiled statem
1b900 65 6e 74 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ents..    */.   
1b910 20 69 66 28 20 70 54 62 6c 4e 61 6d 65 20 29 7b   if( pTblName ){
1b920 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65  .      sqlite3Re
1b930 66 69 6c 6c 49 6e 64 65 78 28 70 50 61 72 73 65  fillIndex(pParse
1b940 2c 20 70 49 6e 64 65 78 2c 20 69 4d 65 6d 29 3b  , pIndex, iMem);
1b950 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 68  .      sqlite3Ch
1b960 61 6e 67 65 43 6f 6f 6b 69 65 28 70 50 61 72 73  angeCookie(pPars
1b970 65 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20 73  e, iDb);.      s
1b980 71 6c 69 74 65 33 56 64 62 65 41 64 64 50 61 72  qlite3VdbeAddPar
1b990 73 65 53 63 68 65 6d 61 4f 70 28 76 2c 20 69 44  seSchemaOp(v, iD
1b9a0 62 2c 0a 20 20 20 20 20 20 20 20 20 73 71 6c 69  b,.         sqli
1b9b0 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22  te3MPrintf(db, "
1b9c0 6e 61 6d 65 3d 27 25 71 27 20 41 4e 44 20 74 79  name='%q' AND ty
1b9d0 70 65 3d 27 69 6e 64 65 78 27 22 2c 20 70 49 6e  pe='index'", pIn
1b9e0 64 65 78 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20  dex->zName));.  
1b9f0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1ba00 64 64 4f 70 31 28 76 2c 20 4f 50 5f 45 78 70 69  ddOp1(v, OP_Expi
1ba10 72 65 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 0a 20  re, 0);.    }.. 
1ba20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
1ba30 6d 70 48 65 72 65 28 76 2c 20 70 49 6e 64 65 78  mpHere(v, pIndex
1ba40 2d 3e 74 6e 75 6d 29 3b 0a 20 20 7d 0a 0a 20 20  ->tnum);.  }..  
1ba50 2f 2a 20 57 68 65 6e 20 61 64 64 69 6e 67 20 61  /* When adding a
1ba60 6e 20 69 6e 64 65 78 20 74 6f 20 74 68 65 20 6c  n index to the l
1ba70 69 73 74 20 6f 66 20 69 6e 64 69 63 65 73 20 66  ist of indices f
1ba80 6f 72 20 61 20 74 61 62 6c 65 2c 20 6d 61 6b 65  or a table, make
1ba90 0a 20 20 2a 2a 20 73 75 72 65 20 61 6c 6c 20 69  .  ** sure all i
1baa0 6e 64 69 63 65 73 20 6c 61 62 65 6c 65 64 20 4f  ndices labeled O
1bab0 45 5f 52 65 70 6c 61 63 65 20 63 6f 6d 65 20 61  E_Replace come a
1bac0 66 74 65 72 20 61 6c 6c 20 74 68 6f 73 65 20 6c  fter all those l
1bad0 61 62 65 6c 65 64 0a 20 20 2a 2a 20 4f 45 5f 49  abeled.  ** OE_I
1bae0 67 6e 6f 72 65 2e 20 20 54 68 69 73 20 69 73 20  gnore.  This is 
1baf0 6e 65 63 65 73 73 61 72 79 20 66 6f 72 20 74 68  necessary for th
1bb00 65 20 63 6f 72 72 65 63 74 20 63 6f 6e 73 74 72  e correct constr
1bb10 61 69 6e 74 20 63 68 65 63 6b 0a 20 20 2a 2a 20  aint check.  ** 
1bb20 70 72 6f 63 65 73 73 69 6e 67 20 28 69 6e 20 73  processing (in s
1bb30 71 6c 69 74 65 33 47 65 6e 65 72 61 74 65 43 6f  qlite3GenerateCo
1bb40 6e 73 74 72 61 69 6e 74 43 68 65 63 6b 73 28 29  nstraintChecks()
1bb50 29 20 61 73 20 70 61 72 74 20 6f 66 0a 20 20 2a  ) as part of.  *
1bb60 2a 20 55 50 44 41 54 45 20 61 6e 64 20 49 4e 53  * UPDATE and INS
1bb70 45 52 54 20 73 74 61 74 65 6d 65 6e 74 73 2e 20  ERT statements. 
1bb80 20 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d   .  */.  if( db-
1bb90 3e 69 6e 69 74 2e 62 75 73 79 20 7c 7c 20 70 54  >init.busy || pT
1bba0 62 6c 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20  blName==0 ){.   
1bbb0 20 69 66 28 20 6f 6e 45 72 72 6f 72 21 3d 4f 45   if( onError!=OE
1bbc0 5f 52 65 70 6c 61 63 65 20 7c 7c 20 70 54 61 62  _Replace || pTab
1bbd0 2d 3e 70 49 6e 64 65 78 3d 3d 30 0a 20 20 20 20  ->pIndex==0.    
1bbe0 20 20 20 20 20 7c 7c 20 70 54 61 62 2d 3e 70 49       || pTab->pI
1bbf0 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f  ndex->onError==O
1bc00 45 5f 52 65 70 6c 61 63 65 29 7b 0a 20 20 20 20  E_Replace){.    
1bc10 20 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74 20    pIndex->pNext 
1bc20 3d 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 0a  = pTab->pIndex;.
1bc30 20 20 20 20 20 20 70 54 61 62 2d 3e 70 49 6e 64        pTab->pInd
1bc40 65 78 20 3d 20 70 49 6e 64 65 78 3b 0a 20 20 20  ex = pIndex;.   
1bc50 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 49 6e   }else{.      In
1bc60 64 65 78 20 2a 70 4f 74 68 65 72 20 3d 20 70 54  dex *pOther = pT
1bc70 61 62 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20 20  ab->pIndex;.    
1bc80 20 20 77 68 69 6c 65 28 20 70 4f 74 68 65 72 2d    while( pOther-
1bc90 3e 70 4e 65 78 74 20 26 26 20 70 4f 74 68 65 72  >pNext && pOther
1bca0 2d 3e 70 4e 65 78 74 2d 3e 6f 6e 45 72 72 6f 72  ->pNext->onError
1bcb0 21 3d 4f 45 5f 52 65 70 6c 61 63 65 20 29 7b 0a  !=OE_Replace ){.
1bcc0 20 20 20 20 20 20 20 20 70 4f 74 68 65 72 20 3d          pOther =
1bcd0 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74 3b 0a   pOther->pNext;.
1bce0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 49        }.      pI
1bcf0 6e 64 65 78 2d 3e 70 4e 65 78 74 20 3d 20 70 4f  ndex->pNext = pO
1bd00 74 68 65 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  ther->pNext;.   
1bd10 20 20 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74     pOther->pNext
1bd20 20 3d 20 70 49 6e 64 65 78 3b 0a 20 20 20 20 7d   = pIndex;.    }
1bd30 0a 20 20 20 20 70 52 65 74 20 3d 20 70 49 6e 64  .    pRet = pInd
1bd40 65 78 3b 0a 20 20 20 20 70 49 6e 64 65 78 20 3d  ex;.    pIndex =
1bd50 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6c   0;.  }..  /* Cl
1bd60 65 61 6e 20 75 70 20 62 65 66 6f 72 65 20 65 78  ean up before ex
1bd70 69 74 69 6e 67 20 2a 2f 0a 65 78 69 74 5f 63 72  iting */.exit_cr
1bd80 65 61 74 65 5f 69 6e 64 65 78 3a 0a 20 20 69 66  eate_index:.  if
1bd90 28 20 70 49 6e 64 65 78 20 29 20 66 72 65 65 49  ( pIndex ) freeI
1bda0 6e 64 65 78 28 64 62 2c 20 70 49 6e 64 65 78 29  ndex(db, pIndex)
1bdb0 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44  ;.  sqlite3ExprD
1bdc0 65 6c 65 74 65 28 64 62 2c 20 70 50 49 57 68 65  elete(db, pPIWhe
1bdd0 72 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78  re);.  sqlite3Ex
1bde0 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c  prListDelete(db,
1bdf0 20 70 4c 69 73 74 29 3b 0a 20 20 73 71 6c 69 74   pList);.  sqlit
1be00 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28  e3SrcListDelete(
1be10 64 62 2c 20 70 54 62 6c 4e 61 6d 65 29 3b 0a 20  db, pTblName);. 
1be20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
1be30 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 72 65 74  b, zName);.  ret
1be40 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a  urn pRet;.}../*.
1be50 2a 2a 20 46 69 6c 6c 20 74 68 65 20 49 6e 64 65  ** Fill the Inde
1be60 78 2e 61 69 52 6f 77 45 73 74 5b 5d 20 61 72 72  x.aiRowEst[] arr
1be70 61 79 20 77 69 74 68 20 64 65 66 61 75 6c 74 20  ay with default 
1be80 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2d 20 69 6e  information - in
1be90 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20 74 6f 20  formation.** to 
1bea0 62 65 20 75 73 65 64 20 77 68 65 6e 20 77 65 20  be used when we 
1beb0 68 61 76 65 20 6e 6f 74 20 72 75 6e 20 74 68 65  have not run the
1bec0 20 41 4e 41 4c 59 5a 45 20 63 6f 6d 6d 61 6e 64   ANALYZE command
1bed0 2e 0a 2a 2a 0a 2a 2a 20 61 69 52 6f 77 45 73 74  ..**.** aiRowEst
1bee0 5b 30 5d 20 69 73 20 73 75 70 70 6f 73 65 64 20  [0] is supposed 
1bef0 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 6e  to contain the n
1bf00 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74  umber of element
1bf10 73 20 69 6e 20 74 68 65 20 69 6e 64 65 78 2e 0a  s in the index..
1bf20 2a 2a 20 53 69 6e 63 65 20 77 65 20 64 6f 20 6e  ** Since we do n
1bf30 6f 74 20 6b 6e 6f 77 2c 20 67 75 65 73 73 20 31  ot know, guess 1
1bf40 20 6d 69 6c 6c 69 6f 6e 2e 20 20 61 69 52 6f 77   million.  aiRow
1bf50 45 73 74 5b 31 5d 20 69 73 20 61 6e 20 65 73 74  Est[1] is an est
1bf60 69 6d 61 74 65 20 6f 66 20 74 68 65 0a 2a 2a 20  imate of the.** 
1bf70 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69  number of rows i
1bf80 6e 20 74 68 65 20 74 61 62 6c 65 20 74 68 61 74  n the table that
1bf90 20 6d 61 74 63 68 20 61 6e 79 20 70 61 72 74 69   match any parti
1bfa0 63 75 6c 61 72 20 76 61 6c 75 65 20 6f 66 20 74  cular value of t
1bfb0 68 65 0a 2a 2a 20 66 69 72 73 74 20 63 6f 6c 75  he.** first colu
1bfc0 6d 6e 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e  mn of the index.
1bfd0 20 20 61 69 52 6f 77 45 73 74 5b 32 5d 20 69 73    aiRowEst[2] is
1bfe0 20 61 6e 20 65 73 74 69 6d 61 74 65 20 6f 66 20   an estimate of 
1bff0 74 68 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66  the number.** of
1c000 20 72 6f 77 73 20 74 68 61 74 20 6d 61 74 63 68   rows that match
1c010 20 61 6e 79 20 70 61 72 74 69 63 75 6c 61 72 20   any particular 
1c020 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f 66 20 74  combination of t
1c030 68 65 20 66 69 72 73 74 20 32 20 63 6f 6c 75 6d  he first 2 colum
1c040 6e 73 0a 2a 2a 20 6f 66 20 74 68 65 20 69 6e 64  ns.** of the ind
1c050 65 78 2e 20 20 41 6e 64 20 73 6f 20 66 6f 72 74  ex.  And so fort
1c060 68 2e 20 20 49 74 20 6d 75 73 74 20 61 6c 77 61  h.  It must alwa
1c070 79 73 20 62 65 20 74 68 65 20 63 61 73 65 20 74  ys be the case t
1c080 68 61 74 0a 2a 0a 2a 2a 20 20 20 20 20 20 20 20  hat.*.**        
1c090 20 20 20 61 69 52 6f 77 45 73 74 5b 4e 5d 3c 3d     aiRowEst[N]<=
1c0a0 61 69 52 6f 77 45 73 74 5b 4e 2d 31 5d 0a 2a 2a  aiRowEst[N-1].**
1c0b0 20 20 20 20 20 20 20 20 20 20 20 61 69 52 6f 77             aiRow
1c0c0 45 73 74 5b 4e 5d 3e 3d 31 0a 2a 2a 0a 2a 2a 20  Est[N]>=1.**.** 
1c0d0 41 70 61 72 74 20 66 72 6f 6d 20 74 68 61 74 2c  Apart from that,
1c0e0 20 77 65 20 68 61 76 65 20 6c 69 74 74 6c 65 20   we have little 
1c0f0 74 6f 20 67 6f 20 6f 6e 20 62 65 73 69 64 65 73  to go on besides
1c100 20 69 6e 74 75 69 74 69 6f 6e 20 61 73 20 74 6f   intuition as to
1c110 0a 2a 2a 20 68 6f 77 20 61 69 52 6f 77 45 73 74  .** how aiRowEst
1c120 5b 5d 20 73 68 6f 75 6c 64 20 62 65 20 69 6e 69  [] should be ini
1c130 74 69 61 6c 69 7a 65 64 2e 20 20 54 68 65 20 6e  tialized.  The n
1c140 75 6d 62 65 72 73 20 67 65 6e 65 72 61 74 65 64  umbers generated
1c150 20 68 65 72 65 0a 2a 2a 20 61 72 65 20 62 61 73   here.** are bas
1c160 65 64 20 6f 6e 20 74 79 70 69 63 61 6c 20 76 61  ed on typical va
1c170 6c 75 65 73 20 66 6f 75 6e 64 20 69 6e 20 61 63  lues found in ac
1c180 74 75 61 6c 20 69 6e 64 69 63 65 73 2e 0a 2a 2f  tual indices..*/
1c190 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 44 65 66  .void sqlite3Def
1c1a0 61 75 6c 74 52 6f 77 45 73 74 28 49 6e 64 65 78  aultRowEst(Index
1c1b0 20 2a 70 49 64 78 29 7b 0a 20 20 2f 2a 20 20 20   *pIdx){.  /*   
1c1c0 20 20 20 20 20 20 20 20 20 20 20 20 20 31 30 2c               10,
1c1d0 20 20 39 2c 20 20 38 2c 20 20 37 2c 20 20 36 20    9,  8,  7,  6 
1c1e0 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 61 56 61 6c  */.  LogEst aVal
1c1f0 5b 5d 20 3d 20 7b 20 33 33 2c 20 33 32 2c 20 33  [] = { 33, 32, 3
1c200 30 2c 20 32 38 2c 20 32 36 20 7d 3b 0a 20 20 4c  0, 28, 26 };.  L
1c210 6f 67 45 73 74 20 2a 61 20 3d 20 70 49 64 78 2d  ogEst *a = pIdx-
1c220 3e 61 69 52 6f 77 4c 6f 67 45 73 74 3b 0a 20 20  >aiRowLogEst;.  
1c230 69 6e 74 20 6e 43 6f 70 79 20 3d 20 4d 49 4e 28  int nCopy = MIN(
1c240 41 72 72 61 79 53 69 7a 65 28 61 56 61 6c 29 2c  ArraySize(aVal),
1c250 20 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 29 3b   pIdx->nKeyCol);
1c260 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 2f 2a 20  .  int i;..  /* 
1c270 53 65 74 20 74 68 65 20 66 69 72 73 74 20 65 6e  Set the first en
1c280 74 72 79 20 28 6e 75 6d 62 65 72 20 6f 66 20 72  try (number of r
1c290 6f 77 73 20 69 6e 20 74 68 65 20 69 6e 64 65 78  ows in the index
1c2a0 29 20 74 6f 20 74 68 65 20 65 73 74 69 6d 61 74  ) to the estimat
1c2b0 65 64 20 0a 20 20 2a 2a 20 6e 75 6d 62 65 72 20  ed .  ** number 
1c2c0 6f 66 20 72 6f 77 73 20 69 6e 20 74 68 65 20 74  of rows in the t
1c2d0 61 62 6c 65 2e 20 4f 72 20 31 30 2c 20 69 66 20  able. Or 10, if 
1c2e0 74 68 65 20 65 73 74 69 6d 61 74 65 64 20 6e 75  the estimated nu
1c2f0 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 0a 20 20  mber of rows .  
1c300 2a 2a 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20  ** in the table 
1c310 69 73 20 6c 65 73 73 20 74 68 61 6e 20 74 68 61  is less than tha
1c320 74 2e 20 20 2a 2f 0a 20 20 61 5b 30 5d 20 3d 20  t.  */.  a[0] = 
1c330 70 49 64 78 2d 3e 70 54 61 62 6c 65 2d 3e 6e 52  pIdx->pTable->nR
1c340 6f 77 4c 6f 67 45 73 74 3b 0a 20 20 69 66 28 20  owLogEst;.  if( 
1c350 61 5b 30 5d 3c 33 33 20 29 20 61 5b 30 5d 20 3d  a[0]<33 ) a[0] =
1c360 20 33 33 3b 20 20 20 20 20 20 20 20 61 73 73 65   33;        asse
1c370 72 74 28 20 33 33 3d 3d 73 71 6c 69 74 65 33 4c  rt( 33==sqlite3L
1c380 6f 67 45 73 74 28 31 30 29 20 29 3b 0a 0a 20 20  ogEst(10) );..  
1c390 2f 2a 20 45 73 74 69 6d 61 74 65 20 74 68 61 74  /* Estimate that
1c3a0 20 61 5b 31 5d 20 69 73 20 31 30 2c 20 61 5b 32   a[1] is 10, a[2
1c3b0 5d 20 69 73 20 39 2c 20 61 5b 33 5d 20 69 73 20  ] is 9, a[3] is 
1c3c0 38 2c 20 61 5b 34 5d 20 69 73 20 37 2c 20 61 5b  8, a[4] is 7, a[
1c3d0 35 5d 20 69 73 0a 20 20 2a 2a 20 36 20 61 6e 64  5] is.  ** 6 and
1c3e0 20 65 61 63 68 20 73 75 62 73 65 71 75 65 6e 74   each subsequent
1c3f0 20 76 61 6c 75 65 20 28 69 66 20 61 6e 79 29 20   value (if any) 
1c400 69 73 20 35 2e 20 20 2a 2f 0a 20 20 6d 65 6d 63  is 5.  */.  memc
1c410 70 79 28 26 61 5b 31 5d 2c 20 61 56 61 6c 2c 20  py(&a[1], aVal, 
1c420 6e 43 6f 70 79 2a 73 69 7a 65 6f 66 28 4c 6f 67  nCopy*sizeof(Log
1c430 45 73 74 29 29 3b 0a 20 20 66 6f 72 28 69 3d 6e  Est));.  for(i=n
1c440 43 6f 70 79 2b 31 3b 20 69 3c 3d 70 49 64 78 2d  Copy+1; i<=pIdx-
1c450 3e 6e 4b 65 79 43 6f 6c 3b 20 69 2b 2b 29 7b 0a  >nKeyCol; i++){.
1c460 20 20 20 20 61 5b 69 5d 20 3d 20 32 33 3b 20 20      a[i] = 23;  
1c470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c480 20 20 61 73 73 65 72 74 28 20 32 33 3d 3d 73 71    assert( 23==sq
1c490 6c 69 74 65 33 4c 6f 67 45 73 74 28 35 29 20 29  lite3LogEst(5) )
1c4a0 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28  ;.  }..  assert(
1c4b0 20 30 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73   0==sqlite3LogEs
1c4c0 74 28 31 29 20 29 3b 0a 20 20 69 66 28 20 49 73  t(1) );.  if( Is
1c4d0 55 6e 69 71 75 65 49 6e 64 65 78 28 70 49 64 78  UniqueIndex(pIdx
1c4e0 29 20 29 20 61 5b 70 49 64 78 2d 3e 6e 4b 65 79  ) ) a[pIdx->nKey
1c4f0 43 6f 6c 5d 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a  Col] = 0;.}../*.
1c500 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
1c510 77 69 6c 6c 20 64 72 6f 70 20 61 6e 20 65 78 69  will drop an exi
1c520 73 74 69 6e 67 20 6e 61 6d 65 64 20 69 6e 64 65  sting named inde
1c530 78 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  x.  This routine
1c540 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74  .** implements t
1c550 68 65 20 44 52 4f 50 20 49 4e 44 45 58 20 73 74  he DROP INDEX st
1c560 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64  atement..*/.void
1c570 20 73 71 6c 69 74 65 33 44 72 6f 70 49 6e 64 65   sqlite3DropInde
1c580 78 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  x(Parse *pParse,
1c590 20 53 72 63 4c 69 73 74 20 2a 70 4e 61 6d 65 2c   SrcList *pName,
1c5a0 20 69 6e 74 20 69 66 45 78 69 73 74 73 29 7b 0a   int ifExists){.
1c5b0 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b    Index *pIndex;
1c5c0 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 73 71  .  Vdbe *v;.  sq
1c5d0 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
1c5e0 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 69 44  se->db;.  int iD
1c5f0 62 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  b;..  assert( pP
1c600 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 29 3b  arse->nErr==0 );
1c610 20 20 20 2f 2a 20 4e 65 76 65 72 20 63 61 6c 6c     /* Never call
1c620 65 64 20 77 69 74 68 20 70 72 69 6f 72 20 65 72  ed with prior er
1c630 72 6f 72 73 20 2a 2f 0a 20 20 69 66 28 20 64 62  rors */.  if( db
1c640 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
1c650 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f  {.    goto exit_
1c660 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a  drop_index;.  }.
1c670 20 20 61 73 73 65 72 74 28 20 70 4e 61 6d 65 2d    assert( pName-
1c680 3e 6e 53 72 63 3d 3d 31 20 29 3b 0a 20 20 69 66  >nSrc==1 );.  if
1c690 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c  ( SQLITE_OK!=sql
1c6a0 69 74 65 33 52 65 61 64 53 63 68 65 6d 61 28 70  ite3ReadSchema(p
1c6b0 50 61 72 73 65 29 20 29 7b 0a 20 20 20 20 67 6f  Parse) ){.    go
1c6c0 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64  to exit_drop_ind
1c6d0 65 78 3b 0a 20 20 7d 0a 20 20 70 49 6e 64 65 78  ex;.  }.  pIndex
1c6e0 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e   = sqlite3FindIn
1c6f0 64 65 78 28 64 62 2c 20 70 4e 61 6d 65 2d 3e 61  dex(db, pName->a
1c700 5b 30 5d 2e 7a 4e 61 6d 65 2c 20 70 4e 61 6d 65  [0].zName, pName
1c710 2d 3e 61 5b 30 5d 2e 7a 44 61 74 61 62 61 73 65  ->a[0].zDatabase
1c720 29 3b 0a 20 20 69 66 28 20 70 49 6e 64 65 78 3d  );.  if( pIndex=
1c730 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 21 69  =0 ){.    if( !i
1c740 66 45 78 69 73 74 73 20 29 7b 0a 20 20 20 20 20  fExists ){.     
1c750 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
1c760 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 73 75 63  (pParse, "no suc
1c770 68 20 69 6e 64 65 78 3a 20 25 53 22 2c 20 70 4e  h index: %S", pN
1c780 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c  ame, 0);.    }el
1c790 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  se{.      sqlite
1c7a0 33 43 6f 64 65 56 65 72 69 66 79 4e 61 6d 65 64  3CodeVerifyNamed
1c7b0 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20 70  Schema(pParse, p
1c7c0 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 44 61 74 61  Name->a[0].zData
1c7d0 62 61 73 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  base);.    }.   
1c7e0 20 70 50 61 72 73 65 2d 3e 63 68 65 63 6b 53 63   pParse->checkSc
1c7f0 68 65 6d 61 20 3d 20 31 3b 0a 20 20 20 20 67 6f  hema = 1;.    go
1c800 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64  to exit_drop_ind
1c810 65 78 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 49  ex;.  }.  if( pI
1c820 6e 64 65 78 2d 3e 69 64 78 54 79 70 65 21 3d 53  ndex->idxType!=S
1c830 51 4c 49 54 45 5f 49 44 58 54 59 50 45 5f 41 50  QLITE_IDXTYPE_AP
1c840 50 44 45 46 20 29 7b 0a 20 20 20 20 73 71 6c 69  PDEF ){.    sqli
1c850 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
1c860 73 65 2c 20 22 69 6e 64 65 78 20 61 73 73 6f 63  se, "index assoc
1c870 69 61 74 65 64 20 77 69 74 68 20 55 4e 49 51 55  iated with UNIQU
1c880 45 20 22 0a 20 20 20 20 20 20 22 6f 72 20 50 52  E ".      "or PR
1c890 49 4d 41 52 59 20 4b 45 59 20 63 6f 6e 73 74 72  IMARY KEY constr
1c8a0 61 69 6e 74 20 63 61 6e 6e 6f 74 20 62 65 20 64  aint cannot be d
1c8b0 72 6f 70 70 65 64 22 2c 20 30 29 3b 0a 20 20 20  ropped", 0);.   
1c8c0 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f   goto exit_drop_
1c8d0 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 69 44 62  index;.  }.  iDb
1c8e0 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61   = sqlite3Schema
1c8f0 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 49 6e 64  ToIndex(db, pInd
1c900 65 78 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 23 69  ex->pSchema);.#i
1c910 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1c920 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a  T_AUTHORIZATION.
1c930 20 20 7b 0a 20 20 20 20 69 6e 74 20 63 6f 64 65    {.    int code
1c940 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 49   = SQLITE_DROP_I
1c950 4e 44 45 58 3b 0a 20 20 20 20 54 61 62 6c 65 20  NDEX;.    Table 
1c960 2a 70 54 61 62 20 3d 20 70 49 6e 64 65 78 2d 3e  *pTab = pIndex->
1c970 70 54 61 62 6c 65 3b 0a 20 20 20 20 63 6f 6e 73  pTable;.    cons
1c980 74 20 63 68 61 72 20 2a 7a 44 62 20 3d 20 64 62  t char *zDb = db
1c990 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65  ->aDb[iDb].zName
1c9a0 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  ;.    const char
1c9b0 20 2a 7a 54 61 62 20 3d 20 53 43 48 45 4d 41 5f   *zTab = SCHEMA_
1c9c0 54 41 42 4c 45 28 69 44 62 29 3b 0a 20 20 20 20  TABLE(iDb);.    
1c9d0 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43  if( sqlite3AuthC
1c9e0 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c  heck(pParse, SQL
1c9f0 49 54 45 5f 44 45 4c 45 54 45 2c 20 7a 54 61 62  ITE_DELETE, zTab
1ca00 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20  , 0, zDb) ){.   
1ca10 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f     goto exit_dro
1ca20 70 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20  p_index;.    }. 
1ca30 20 20 20 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d     if( !OMIT_TEM
1ca40 50 44 42 20 26 26 20 69 44 62 20 29 20 63 6f 64  PDB && iDb ) cod
1ca50 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f  e = SQLITE_DROP_
1ca60 54 45 4d 50 5f 49 4e 44 45 58 3b 0a 20 20 20 20  TEMP_INDEX;.    
1ca70 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43  if( sqlite3AuthC
1ca80 68 65 63 6b 28 70 50 61 72 73 65 2c 20 63 6f 64  heck(pParse, cod
1ca90 65 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65  e, pIndex->zName
1caa0 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a  , pTab->zName, z
1cab0 44 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  Db) ){.      got
1cac0 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65  o exit_drop_inde
1cad0 78 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  x;.    }.  }.#en
1cae0 64 69 66 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61  dif..  /* Genera
1caf0 74 65 20 63 6f 64 65 20 74 6f 20 72 65 6d 6f 76  te code to remov
1cb00 65 20 74 68 65 20 69 6e 64 65 78 20 61 6e 64 20  e the index and 
1cb10 66 72 6f 6d 20 74 68 65 20 6d 61 73 74 65 72 20  from the master 
1cb20 74 61 62 6c 65 20 2a 2f 0a 20 20 76 20 3d 20 73  table */.  v = s
1cb30 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
1cb40 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76 20 29  arse);.  if( v )
1cb50 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65 67  {.    sqlite3Beg
1cb60 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e  inWriteOperation
1cb70 28 70 50 61 72 73 65 2c 20 31 2c 20 69 44 62 29  (pParse, 1, iDb)
1cb80 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 4e 65 73  ;.    sqlite3Nes
1cb90 74 65 64 50 61 72 73 65 28 70 50 61 72 73 65 2c  tedParse(pParse,
1cba0 0a 20 20 20 20 20 20 20 22 44 45 4c 45 54 45 20  .       "DELETE 
1cbb0 46 52 4f 4d 20 25 51 2e 25 73 20 57 48 45 52 45  FROM %Q.%s WHERE
1cbc0 20 6e 61 6d 65 3d 25 51 20 41 4e 44 20 74 79 70   name=%Q AND typ
1cbd0 65 3d 27 69 6e 64 65 78 27 22 2c 0a 20 20 20 20  e='index'",.    
1cbe0 20 20 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e     db->aDb[iDb].
1cbf0 7a 4e 61 6d 65 2c 20 53 43 48 45 4d 41 5f 54 41  zName, SCHEMA_TA
1cc00 42 4c 45 28 69 44 62 29 2c 20 70 49 6e 64 65 78  BLE(iDb), pIndex
1cc10 2d 3e 7a 4e 61 6d 65 0a 20 20 20 20 29 3b 0a 20  ->zName.    );. 
1cc20 20 20 20 73 71 6c 69 74 65 33 43 6c 65 61 72 53     sqlite3ClearS
1cc30 74 61 74 54 61 62 6c 65 73 28 70 50 61 72 73 65  tatTables(pParse
1cc40 2c 20 69 44 62 2c 20 22 69 64 78 22 2c 20 70 49  , iDb, "idx", pI
1cc50 6e 64 65 78 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  ndex->zName);.  
1cc60 20 20 73 71 6c 69 74 65 33 43 68 61 6e 67 65 43    sqlite3ChangeC
1cc70 6f 6f 6b 69 65 28 70 50 61 72 73 65 2c 20 69 44  ookie(pParse, iD
1cc80 62 29 3b 0a 20 20 20 20 64 65 73 74 72 6f 79 52  b);.    destroyR
1cc90 6f 6f 74 50 61 67 65 28 70 50 61 72 73 65 2c 20  ootPage(pParse, 
1cca0 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 2c 20 69 44  pIndex->tnum, iD
1ccb0 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  b);.    sqlite3V
1ccc0 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
1ccd0 44 72 6f 70 49 6e 64 65 78 2c 20 69 44 62 2c 20  DropIndex, iDb, 
1cce0 30 2c 20 30 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e  0, 0, pIndex->zN
1ccf0 61 6d 65 2c 20 30 29 3b 0a 20 20 7d 0a 0a 65 78  ame, 0);.  }..ex
1cd00 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3a 0a 20  it_drop_index:. 
1cd10 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44   sqlite3SrcListD
1cd20 65 6c 65 74 65 28 64 62 2c 20 70 4e 61 6d 65 29  elete(db, pName)
1cd30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 41 72 72 61  ;.}../*.** pArra
1cd40 79 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  y is a pointer t
1cd50 6f 20 61 6e 20 61 72 72 61 79 20 6f 66 20 6f 62  o an array of ob
1cd60 6a 65 63 74 73 2e 20 45 61 63 68 20 6f 62 6a 65  jects. Each obje
1cd70 63 74 20 69 6e 20 74 68 65 0a 2a 2a 20 61 72 72  ct in the.** arr
1cd80 61 79 20 69 73 20 73 7a 45 6e 74 72 79 20 62 79  ay is szEntry by
1cd90 74 65 73 20 69 6e 20 73 69 7a 65 2e 20 54 68 69  tes in size. Thi
1cda0 73 20 72 6f 75 74 69 6e 65 20 75 73 65 73 20 73  s routine uses s
1cdb0 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 28  qlite3DbRealloc(
1cdc0 29 0a 2a 2a 20 74 6f 20 65 78 74 65 6e 64 20 74  ).** to extend t
1cdd0 68 65 20 61 72 72 61 79 20 73 6f 20 74 68 61 74  he array so that
1cde0 20 74 68 65 72 65 20 69 73 20 73 70 61 63 65 20   there is space 
1cdf0 66 6f 72 20 61 20 6e 65 77 20 6f 62 6a 65 63 74  for a new object
1ce00 20 61 74 20 74 68 65 20 65 6e 64 2e 0a 2a 2a 0a   at the end..**.
1ce10 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 66 75 6e  ** When this fun
1ce20 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c  ction is called,
1ce30 20 2a 70 6e 45 6e 74 72 79 20 63 6f 6e 74 61 69   *pnEntry contai
1ce40 6e 73 20 74 68 65 20 63 75 72 72 65 6e 74 20 73  ns the current s
1ce50 69 7a 65 20 6f 66 0a 2a 2a 20 74 68 65 20 61 72  ize of.** the ar
1ce60 72 61 79 20 28 69 6e 20 65 6e 74 72 69 65 73 20  ray (in entries 
1ce70 2d 20 73 6f 20 74 68 65 20 61 6c 6c 6f 63 61 74  - so the allocat
1ce80 69 6f 6e 20 69 73 20 28 28 2a 70 6e 45 6e 74 72  ion is ((*pnEntr
1ce90 79 29 20 2a 20 73 7a 45 6e 74 72 79 29 20 62 79  y) * szEntry) by
1cea0 74 65 73 0a 2a 2a 20 69 6e 20 74 6f 74 61 6c 29  tes.** in total)
1ceb0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 72  ..**.** If the r
1cec0 65 61 6c 6c 6f 63 28 29 20 69 73 20 73 75 63 63  ealloc() is succ
1ced0 65 73 73 66 75 6c 20 28 69 2e 65 2e 20 69 66 20  essful (i.e. if 
1cee0 6e 6f 20 4f 4f 4d 20 63 6f 6e 64 69 74 69 6f 6e  no OOM condition
1cef0 20 6f 63 63 75 72 73 29 2c 20 74 68 65 0a 2a 2a   occurs), the.**
1cf00 20 73 70 61 63 65 20 61 6c 6c 6f 63 61 74 65 64   space allocated
1cf10 20 66 6f 72 20 74 68 65 20 6e 65 77 20 6f 62 6a   for the new obj
1cf20 65 63 74 20 69 73 20 7a 65 72 6f 65 64 2c 20 2a  ect is zeroed, *
1cf30 70 6e 45 6e 74 72 79 20 75 70 64 61 74 65 64 20  pnEntry updated 
1cf40 74 6f 0a 2a 2a 20 72 65 66 6c 65 63 74 20 74 68  to.** reflect th
1cf50 65 20 6e 65 77 20 73 69 7a 65 20 6f 66 20 74 68  e new size of th
1cf60 65 20 61 72 72 61 79 20 61 6e 64 20 61 20 70 6f  e array and a po
1cf70 69 6e 74 65 72 20 74 6f 20 74 68 65 20 6e 65 77  inter to the new
1cf80 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2a 20 72   allocation.** r
1cf90 65 74 75 72 6e 65 64 2e 20 2a 70 49 64 78 20 69  eturned. *pIdx i
1cfa0 73 20 73 65 74 20 74 6f 20 74 68 65 20 69 6e 64  s set to the ind
1cfb0 65 78 20 6f 66 20 74 68 65 20 6e 65 77 20 61 72  ex of the new ar
1cfc0 72 61 79 20 65 6e 74 72 79 20 69 6e 20 74 68 69  ray entry in thi
1cfd0 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 4f 74  s case..**.** Ot
1cfe0 68 65 72 77 69 73 65 2c 20 69 66 20 74 68 65 20  herwise, if the 
1cff0 72 65 61 6c 6c 6f 63 28 29 20 66 61 69 6c 73 2c  realloc() fails,
1d000 20 2a 70 49 64 78 20 69 73 20 73 65 74 20 74 6f   *pIdx is set to
1d010 20 2d 31 2c 20 2a 70 6e 45 6e 74 72 79 20 72 65   -1, *pnEntry re
1d020 6d 61 69 6e 73 0a 2a 2a 20 75 6e 63 68 61 6e 67  mains.** unchang
1d030 65 64 20 61 6e 64 20 61 20 63 6f 70 79 20 6f 66  ed and a copy of
1d040 20 70 41 72 72 61 79 20 72 65 74 75 72 6e 65 64   pArray returned
1d050 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74  ..*/.void *sqlit
1d060 65 33 41 72 72 61 79 41 6c 6c 6f 63 61 74 65 28  e3ArrayAllocate(
1d070 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  .  sqlite3 *db, 
1d080 20 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69       /* Connecti
1d090 6f 6e 20 74 6f 20 6e 6f 74 69 66 79 20 6f 66 20  on to notify of 
1d0a0 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65 73 20  malloc failures 
1d0b0 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 41 72 72 61  */.  void *pArra
1d0c0 79 2c 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20  y,     /* Array 
1d0d0 6f 66 20 6f 62 6a 65 63 74 73 2e 20 20 4d 69 67  of objects.  Mig
1d0e0 68 74 20 62 65 20 72 65 61 6c 6c 6f 63 61 74 65  ht be reallocate
1d0f0 64 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 45 6e 74  d */.  int szEnt
1d100 72 79 2c 20 20 20 20 20 20 2f 2a 20 53 69 7a 65  ry,      /* Size
1d110 20 6f 66 20 65 61 63 68 20 6f 62 6a 65 63 74 20   of each object 
1d120 69 6e 20 74 68 65 20 61 72 72 61 79 20 2a 2f 0a  in the array */.
1d130 20 20 69 6e 74 20 2a 70 6e 45 6e 74 72 79 2c 20    int *pnEntry, 
1d140 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1d150 20 6f 62 6a 65 63 74 73 20 63 75 72 72 65 6e 74   objects current
1d160 6c 79 20 69 6e 20 75 73 65 20 2a 2f 0a 20 20 69  ly in use */.  i
1d170 6e 74 20 2a 70 49 64 78 20 20 20 20 20 20 20 20  nt *pIdx        
1d180 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 69 6e   /* Write the in
1d190 64 65 78 20 6f 66 20 61 20 6e 65 77 20 73 6c 6f  dex of a new slo
1d1a0 74 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 63  t here */.){.  c
1d1b0 68 61 72 20 2a 7a 3b 0a 20 20 69 6e 74 20 6e 20  har *z;.  int n 
1d1c0 3d 20 2a 70 6e 45 6e 74 72 79 3b 0a 20 20 69 66  = *pnEntry;.  if
1d1d0 28 20 28 6e 20 26 20 28 6e 2d 31 29 29 3d 3d 30  ( (n & (n-1))==0
1d1e0 20 29 7b 0a 20 20 20 20 69 6e 74 20 73 7a 20 3d   ){.    int sz =
1d1f0 20 28 6e 3d 3d 30 29 20 3f 20 31 20 3a 20 32 2a   (n==0) ? 1 : 2*
1d200 6e 3b 0a 20 20 20 20 76 6f 69 64 20 2a 70 4e 65  n;.    void *pNe
1d210 77 20 3d 20 73 71 6c 69 74 65 33 44 62 52 65 61  w = sqlite3DbRea
1d220 6c 6c 6f 63 28 64 62 2c 20 70 41 72 72 61 79 2c  lloc(db, pArray,
1d230 20 73 7a 2a 73 7a 45 6e 74 72 79 29 3b 0a 20 20   sz*szEntry);.  
1d240 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b    if( pNew==0 ){
1d250 0a 20 20 20 20 20 20 2a 70 49 64 78 20 3d 20 2d  .      *pIdx = -
1d260 31 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  1;.      return 
1d270 70 41 72 72 61 79 3b 0a 20 20 20 20 7d 0a 20 20  pArray;.    }.  
1d280 20 20 70 41 72 72 61 79 20 3d 20 70 4e 65 77 3b    pArray = pNew;
1d290 0a 20 20 7d 0a 20 20 7a 20 3d 20 28 63 68 61 72  .  }.  z = (char
1d2a0 2a 29 70 41 72 72 61 79 3b 0a 20 20 6d 65 6d 73  *)pArray;.  mems
1d2b0 65 74 28 26 7a 5b 6e 20 2a 20 73 7a 45 6e 74 72  et(&z[n * szEntr
1d2c0 79 5d 2c 20 30 2c 20 73 7a 45 6e 74 72 79 29 3b  y], 0, szEntry);
1d2d0 0a 20 20 2a 70 49 64 78 20 3d 20 6e 3b 0a 20 20  .  *pIdx = n;.  
1d2e0 2b 2b 2a 70 6e 45 6e 74 72 79 3b 0a 20 20 72 65  ++*pnEntry;.  re
1d2f0 74 75 72 6e 20 70 41 72 72 61 79 3b 0a 7d 0a 0a  turn pArray;.}..
1d300 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 61 20 6e  /*.** Append a n
1d310 65 77 20 65 6c 65 6d 65 6e 74 20 74 6f 20 74 68  ew element to th
1d320 65 20 67 69 76 65 6e 20 49 64 4c 69 73 74 2e 20  e given IdList. 
1d330 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 49 64   Create a new Id
1d340 4c 69 73 74 20 69 66 0a 2a 2a 20 6e 65 65 64 20  List if.** need 
1d350 62 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 6e 65 77 20  be..**.** A new 
1d360 49 64 4c 69 73 74 20 69 73 20 72 65 74 75 72 6e  IdList is return
1d370 65 64 2c 20 6f 72 20 4e 55 4c 4c 20 69 66 20 6d  ed, or NULL if m
1d380 61 6c 6c 6f 63 28 29 20 66 61 69 6c 73 2e 0a 2a  alloc() fails..*
1d390 2f 0a 49 64 4c 69 73 74 20 2a 73 71 6c 69 74 65  /.IdList *sqlite
1d3a0 33 49 64 4c 69 73 74 41 70 70 65 6e 64 28 73 71  3IdListAppend(sq
1d3b0 6c 69 74 65 33 20 2a 64 62 2c 20 49 64 4c 69 73  lite3 *db, IdLis
1d3c0 74 20 2a 70 4c 69 73 74 2c 20 54 6f 6b 65 6e 20  t *pList, Token 
1d3d0 2a 70 54 6f 6b 65 6e 29 7b 0a 20 20 69 6e 74 20  *pToken){.  int 
1d3e0 69 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d  i;.  if( pList==
1d3f0 30 20 29 7b 0a 20 20 20 20 70 4c 69 73 74 20 3d  0 ){.    pList =
1d400 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
1d410 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28  Zero(db, sizeof(
1d420 49 64 4c 69 73 74 29 20 29 3b 0a 20 20 20 20 69  IdList) );.    i
1d430 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65  f( pList==0 ) re
1d440 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 4c  turn 0;.  }.  pL
1d450 69 73 74 2d 3e 61 20 3d 20 73 71 6c 69 74 65 33  ist->a = sqlite3
1d460 41 72 72 61 79 41 6c 6c 6f 63 61 74 65 28 0a 20  ArrayAllocate(. 
1d470 20 20 20 20 20 64 62 2c 0a 20 20 20 20 20 20 70       db,.      p
1d480 4c 69 73 74 2d 3e 61 2c 0a 20 20 20 20 20 20 73  List->a,.      s
1d490 69 7a 65 6f 66 28 70 4c 69 73 74 2d 3e 61 5b 30  izeof(pList->a[0
1d4a0 5d 29 2c 0a 20 20 20 20 20 20 26 70 4c 69 73 74  ]),.      &pList
1d4b0 2d 3e 6e 49 64 2c 0a 20 20 20 20 20 20 26 69 0a  ->nId,.      &i.
1d4c0 20 20 29 3b 0a 20 20 69 66 28 20 69 3c 30 20 29    );.  if( i<0 )
1d4d0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 49 64 4c  {.    sqlite3IdL
1d4e0 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 4c  istDelete(db, pL
1d4f0 69 73 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ist);.    return
1d500 20 30 3b 0a 20 20 7d 0a 20 20 70 4c 69 73 74 2d   0;.  }.  pList-
1d510 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20 3d 20 73 71  >a[i].zName = sq
1d520 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b  lite3NameFromTok
1d530 65 6e 28 64 62 2c 20 70 54 6f 6b 65 6e 29 3b 0a  en(db, pToken);.
1d540 20 20 72 65 74 75 72 6e 20 70 4c 69 73 74 3b 0a    return pList;.
1d550 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20  }../*.** Delete 
1d560 61 6e 20 49 64 4c 69 73 74 2e 0a 2a 2f 0a 76 6f  an IdList..*/.vo
1d570 69 64 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74  id sqlite3IdList
1d580 44 65 6c 65 74 65 28 73 71 6c 69 74 65 33 20 2a  Delete(sqlite3 *
1d590 64 62 2c 20 49 64 4c 69 73 74 20 2a 70 4c 69 73  db, IdList *pLis
1d5a0 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  t){.  int i;.  i
1d5b0 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65  f( pList==0 ) re
1d5c0 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  turn;.  for(i=0;
1d5d0 20 69 3c 70 4c 69 73 74 2d 3e 6e 49 64 3b 20 69   i<pList->nId; i
1d5e0 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ++){.    sqlite3
1d5f0 44 62 46 72 65 65 28 64 62 2c 20 70 4c 69 73 74  DbFree(db, pList
1d600 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20  ->a[i].zName);. 
1d610 20 7d 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72   }.  sqlite3DbFr
1d620 65 65 28 64 62 2c 20 70 4c 69 73 74 2d 3e 61 29  ee(db, pList->a)
1d630 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  ;.  sqlite3DbFre
1d640 65 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a 7d 0a  e(db, pList);.}.
1d650 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
1d660 65 20 69 6e 64 65 78 20 69 6e 20 70 4c 69 73 74  e index in pList
1d670 20 6f 66 20 74 68 65 20 69 64 65 6e 74 69 66 69   of the identifi
1d680 65 72 20 6e 61 6d 65 64 20 7a 49 64 2e 20 20 52  er named zId.  R
1d690 65 74 75 72 6e 20 2d 31 0a 2a 2a 20 69 66 20 6e  eturn -1.** if n
1d6a0 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 69 6e 74  ot found..*/.int
1d6b0 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 49 6e   sqlite3IdListIn
1d6c0 64 65 78 28 49 64 4c 69 73 74 20 2a 70 4c 69 73  dex(IdList *pLis
1d6d0 74 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  t, const char *z
1d6e0 4e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  Name){.  int i;.
1d6f0 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29    if( pList==0 )
1d700 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 66 6f   return -1;.  fo
1d710 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e  r(i=0; i<pList->
1d720 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  nId; i++){.    i
1d730 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  f( sqlite3StrICm
1d740 70 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e  p(pList->a[i].zN
1d750 61 6d 65 2c 20 7a 4e 61 6d 65 29 3d 3d 30 20 29  ame, zName)==0 )
1d760 20 72 65 74 75 72 6e 20 69 3b 0a 20 20 7d 0a 20   return i;.  }. 
1d770 20 72 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 2f   return -1;.}../
1d780 2a 0a 2a 2a 20 45 78 70 61 6e 64 20 74 68 65 20  *.** Expand the 
1d790 73 70 61 63 65 20 61 6c 6c 6f 63 61 74 65 64 20  space allocated 
1d7a0 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20 53 72  for the given Sr
1d7b0 63 4c 69 73 74 20 6f 62 6a 65 63 74 20 62 79 0a  cList object by.
1d7c0 2a 2a 20 63 72 65 61 74 69 6e 67 20 6e 45 78 74  ** creating nExt
1d7d0 72 61 20 6e 65 77 20 73 6c 6f 74 73 20 62 65 67  ra new slots beg
1d7e0 69 6e 6e 69 6e 67 20 61 74 20 69 53 74 61 72 74  inning at iStart
1d7f0 2e 20 20 69 53 74 61 72 74 20 69 73 20 7a 65 72  .  iStart is zer
1d800 6f 20 62 61 73 65 64 2e 0a 2a 2a 20 4e 65 77 20  o based..** New 
1d810 73 6c 6f 74 73 20 61 72 65 20 7a 65 72 6f 65 64  slots are zeroed
1d820 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78 61 6d  ..**.** For exam
1d830 70 6c 65 2c 20 73 75 70 70 6f 73 65 20 61 20 53  ple, suppose a S
1d840 72 63 4c 69 73 74 20 69 6e 69 74 69 61 6c 6c 79  rcList initially
1d850 20 63 6f 6e 74 61 69 6e 73 20 74 77 6f 20 65 6e   contains two en
1d860 74 72 69 65 73 3a 20 41 2c 42 2e 0a 2a 2a 20 54  tries: A,B..** T
1d870 6f 20 61 70 70 65 6e 64 20 33 20 6e 65 77 20 65  o append 3 new e
1d880 6e 74 72 69 65 73 20 6f 6e 74 6f 20 74 68 65 20  ntries onto the 
1d890 65 6e 64 2c 20 64 6f 20 74 68 69 73 3a 0a 2a 2a  end, do this:.**
1d8a0 0a 2a 2a 20 20 20 20 73 71 6c 69 74 65 33 53 72  .**    sqlite3Sr
1d8b0 63 4c 69 73 74 45 6e 6c 61 72 67 65 28 64 62 2c  cListEnlarge(db,
1d8c0 20 70 53 72 63 6c 69 73 74 2c 20 33 2c 20 32 29   pSrclist, 3, 2)
1d8d0 3b 0a 2a 2a 0a 2a 2a 20 41 66 74 65 72 20 74 68  ;.**.** After th
1d8e0 65 20 63 61 6c 6c 20 61 62 6f 76 65 20 69 74 20  e call above it 
1d8f0 77 6f 75 6c 64 20 63 6f 6e 74 61 69 6e 3a 20 20  would contain:  
1d900 41 2c 20 42 2c 20 6e 69 6c 2c 20 6e 69 6c 2c 20  A, B, nil, nil, 
1d910 6e 69 6c 2e 0a 2a 2a 20 49 66 20 74 68 65 20 69  nil..** If the i
1d920 53 74 61 72 74 20 61 72 67 75 6d 65 6e 74 20 68  Start argument h
1d930 61 64 20 62 65 65 6e 20 31 20 69 6e 73 74 65 61  ad been 1 instea
1d940 64 20 6f 66 20 32 2c 20 74 68 65 6e 20 74 68 65  d of 2, then the
1d950 20 72 65 73 75 6c 74 0a 2a 2a 20 77 6f 75 6c 64   result.** would
1d960 20 68 61 76 65 20 62 65 65 6e 3a 20 20 41 2c 20   have been:  A, 
1d970 6e 69 6c 2c 20 6e 69 6c 2c 20 6e 69 6c 2c 20 42  nil, nil, nil, B
1d980 2e 20 20 54 6f 20 70 72 65 70 65 6e 64 20 74 68  .  To prepend th
1d990 65 20 6e 65 77 20 73 6c 6f 74 73 2c 0a 2a 2a 20  e new slots,.** 
1d9a0 74 68 65 20 69 53 74 61 72 74 20 76 61 6c 75 65  the iStart value
1d9b0 20 77 6f 75 6c 64 20 62 65 20 30 2e 20 20 54 68   would be 0.  Th
1d9c0 65 20 72 65 73 75 6c 74 20 74 68 65 6e 20 77 6f  e result then wo
1d9d0 75 6c 64 0a 2a 2a 20 62 65 3a 20 6e 69 6c 2c 20  uld.** be: nil, 
1d9e0 6e 69 6c 2c 20 6e 69 6c 2c 20 41 2c 20 42 2e 0a  nil, nil, A, B..
1d9f0 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d 65 6d 6f 72  **.** If a memor
1da00 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69  y allocation fai
1da10 6c 73 20 74 68 65 20 53 72 63 4c 69 73 74 20 69  ls the SrcList i
1da20 73 20 75 6e 63 68 61 6e 67 65 64 2e 20 20 54 68  s unchanged.  Th
1da30 65 0a 2a 2a 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  e.** db->mallocF
1da40 61 69 6c 65 64 20 66 6c 61 67 20 77 69 6c 6c 20  ailed flag will 
1da50 62 65 20 73 65 74 20 74 6f 20 74 72 75 65 2e 0a  be set to true..
1da60 2a 2f 0a 53 72 63 4c 69 73 74 20 2a 73 71 6c 69  */.SrcList *sqli
1da70 74 65 33 53 72 63 4c 69 73 74 45 6e 6c 61 72 67  te3SrcListEnlarg
1da80 65 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  e(.  sqlite3 *db
1da90 2c 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62  ,       /* Datab
1daa0 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74  ase connection t
1dab0 6f 20 6e 6f 74 69 66 79 20 6f 66 20 4f 4f 4d 20  o notify of OOM 
1dac0 65 72 72 6f 72 73 20 2a 2f 0a 20 20 53 72 63 4c  errors */.  SrcL
1dad0 69 73 74 20 2a 70 53 72 63 2c 20 20 20 20 20 2f  ist *pSrc,     /
1dae0 2a 20 54 68 65 20 53 72 63 4c 69 73 74 20 74 6f  * The SrcList to
1daf0 20 62 65 20 65 6e 6c 61 72 67 65 64 20 2a 2f 0a   be enlarged */.
1db00 20 20 69 6e 74 20 6e 45 78 74 72 61 2c 20 20 20    int nExtra,   
1db10 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
1db20 66 20 6e 65 77 20 73 6c 6f 74 73 20 74 6f 20 61  f new slots to a
1db30 64 64 20 74 6f 20 70 53 72 63 2d 3e 61 5b 5d 20  dd to pSrc->a[] 
1db40 2a 2f 0a 20 20 69 6e 74 20 69 53 74 61 72 74 20  */.  int iStart 
1db50 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
1db60 20 69 6e 20 70 53 72 63 2d 3e 61 5b 5d 20 6f 66   in pSrc->a[] of
1db70 20 66 69 72 73 74 20 6e 65 77 20 73 6c 6f 74 20   first new slot 
1db80 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 0a  */.){.  int i;..
1db90 20 20 2f 2a 20 53 61 6e 69 74 79 20 63 68 65 63    /* Sanity chec
1dba0 6b 69 6e 67 20 6f 6e 20 63 61 6c 6c 69 6e 67 20  king on calling 
1dbb0 70 61 72 61 6d 65 74 65 72 73 20 2a 2f 0a 20 20  parameters */.  
1dbc0 61 73 73 65 72 74 28 20 69 53 74 61 72 74 3e 3d  assert( iStart>=
1dbd0 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  0 );.  assert( n
1dbe0 45 78 74 72 61 3e 3d 31 20 29 3b 0a 20 20 61 73  Extra>=1 );.  as
1dbf0 73 65 72 74 28 20 70 53 72 63 21 3d 30 20 29 3b  sert( pSrc!=0 );
1dc00 0a 20 20 61 73 73 65 72 74 28 20 69 53 74 61 72  .  assert( iStar
1dc10 74 3c 3d 70 53 72 63 2d 3e 6e 53 72 63 20 29 3b  t<=pSrc->nSrc );
1dc20 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20  ..  /* Allocate 
1dc30 61 64 64 69 74 69 6f 6e 61 6c 20 73 70 61 63 65  additional space
1dc40 20 69 66 20 6e 65 65 64 65 64 20 2a 2f 0a 20 20   if needed */.  
1dc50 69 66 28 20 28 75 33 32 29 70 53 72 63 2d 3e 6e  if( (u32)pSrc->n
1dc60 53 72 63 2b 6e 45 78 74 72 61 3e 70 53 72 63 2d  Src+nExtra>pSrc-
1dc70 3e 6e 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 53  >nAlloc ){.    S
1dc80 72 63 4c 69 73 74 20 2a 70 4e 65 77 3b 0a 20 20  rcList *pNew;.  
1dc90 20 20 69 6e 74 20 6e 41 6c 6c 6f 63 20 3d 20 70    int nAlloc = p
1dca0 53 72 63 2d 3e 6e 53 72 63 2b 6e 45 78 74 72 61  Src->nSrc+nExtra
1dcb0 3b 0a 20 20 20 20 69 6e 74 20 6e 47 6f 74 3b 0a  ;.    int nGot;.
1dcc0 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74      pNew = sqlit
1dcd0 65 33 44 62 52 65 61 6c 6c 6f 63 28 64 62 2c 20  e3DbRealloc(db, 
1dce0 70 53 72 63 2c 0a 20 20 20 20 20 20 20 20 20 20  pSrc,.          
1dcf0 20 20 20 20 20 73 69 7a 65 6f 66 28 2a 70 53 72       sizeof(*pSr
1dd00 63 29 20 2b 20 28 6e 41 6c 6c 6f 63 2d 31 29 2a  c) + (nAlloc-1)*
1dd10 73 69 7a 65 6f 66 28 70 53 72 63 2d 3e 61 5b 30  sizeof(pSrc->a[0
1dd20 5d 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4e  ]) );.    if( pN
1dd30 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 61  ew==0 ){.      a
1dd40 73 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f  ssert( db->mallo
1dd50 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20  cFailed );.     
1dd60 20 72 65 74 75 72 6e 20 70 53 72 63 3b 0a 20 20   return pSrc;.  
1dd70 20 20 7d 0a 20 20 20 20 70 53 72 63 20 3d 20 70    }.    pSrc = p
1dd80 4e 65 77 3b 0a 20 20 20 20 6e 47 6f 74 20 3d 20  New;.    nGot = 
1dd90 28 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63  (sqlite3DbMalloc
1dda0 53 69 7a 65 28 64 62 2c 20 70 4e 65 77 29 20 2d  Size(db, pNew) -
1ddb0 20 73 69 7a 65 6f 66 28 2a 70 53 72 63 29 29 2f   sizeof(*pSrc))/
1ddc0 73 69 7a 65 6f 66 28 70 53 72 63 2d 3e 61 5b 30  sizeof(pSrc->a[0
1ddd0 5d 29 2b 31 3b 0a 20 20 20 20 70 53 72 63 2d 3e  ])+1;.    pSrc->
1dde0 6e 41 6c 6c 6f 63 20 3d 20 6e 47 6f 74 3b 0a 20  nAlloc = nGot;. 
1ddf0 20 7d 0a 0a 20 20 2f 2a 20 4d 6f 76 65 20 65 78   }..  /* Move ex
1de00 69 73 74 69 6e 67 20 73 6c 6f 74 73 20 74 68 61  isting slots tha
1de10 74 20 63 6f 6d 65 20 61 66 74 65 72 20 74 68 65  t come after the
1de20 20 6e 65 77 6c 79 20 69 6e 73 65 72 74 65 64 20   newly inserted 
1de30 73 6c 6f 74 73 0a 20 20 2a 2a 20 6f 75 74 20 6f  slots.  ** out o
1de40 66 20 74 68 65 20 77 61 79 20 2a 2f 0a 20 20 66  f the way */.  f
1de50 6f 72 28 69 3d 70 53 72 63 2d 3e 6e 53 72 63 2d  or(i=pSrc->nSrc-
1de60 31 3b 20 69 3e 3d 69 53 74 61 72 74 3b 20 69 2d  1; i>=iStart; i-
1de70 2d 29 7b 0a 20 20 20 20 70 53 72 63 2d 3e 61 5b  -){.    pSrc->a[
1de80 69 2b 6e 45 78 74 72 61 5d 20 3d 20 70 53 72 63  i+nExtra] = pSrc
1de90 2d 3e 61 5b 69 5d 3b 0a 20 20 7d 0a 20 20 70 53  ->a[i];.  }.  pS
1dea0 72 63 2d 3e 6e 53 72 63 20 2b 3d 20 6e 45 78 74  rc->nSrc += nExt
1deb0 72 61 3b 0a 0a 20 20 2f 2a 20 5a 65 72 6f 20 74  ra;..  /* Zero t
1dec0 68 65 20 6e 65 77 6c 79 20 61 6c 6c 6f 63 61 74  he newly allocat
1ded0 65 64 20 73 6c 6f 74 73 20 2a 2f 0a 20 20 6d 65  ed slots */.  me
1dee0 6d 73 65 74 28 26 70 53 72 63 2d 3e 61 5b 69 53  mset(&pSrc->a[iS
1def0 74 61 72 74 5d 2c 20 30 2c 20 73 69 7a 65 6f 66  tart], 0, sizeof
1df00 28 70 53 72 63 2d 3e 61 5b 30 5d 29 2a 6e 45 78  (pSrc->a[0])*nEx
1df10 74 72 61 29 3b 0a 20 20 66 6f 72 28 69 3d 69 53  tra);.  for(i=iS
1df20 74 61 72 74 3b 20 69 3c 69 53 74 61 72 74 2b 6e  tart; i<iStart+n
1df30 45 78 74 72 61 3b 20 69 2b 2b 29 7b 0a 20 20 20  Extra; i++){.   
1df40 20 70 53 72 63 2d 3e 61 5b 69 5d 2e 69 43 75 72   pSrc->a[i].iCur
1df50 73 6f 72 20 3d 20 2d 31 3b 0a 20 20 7d 0a 0a 20  sor = -1;.  }.. 
1df60 20 2f 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69   /* Return a poi
1df70 6e 74 65 72 20 74 6f 20 74 68 65 20 65 6e 6c 61  nter to the enla
1df80 72 67 65 64 20 53 72 63 4c 69 73 74 20 2a 2f 0a  rged SrcList */.
1df90 20 20 72 65 74 75 72 6e 20 70 53 72 63 3b 0a 7d    return pSrc;.}
1dfa0 0a 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20  .../*.** Append 
1dfb0 61 20 6e 65 77 20 74 61 62 6c 65 20 6e 61 6d 65  a new table name
1dfc0 20 74 6f 20 74 68 65 20 67 69 76 65 6e 20 53 72   to the given Sr
1dfd0 63 4c 69 73 74 2e 20 20 43 72 65 61 74 65 20 61  cList.  Create a
1dfe0 20 6e 65 77 20 53 72 63 4c 69 73 74 20 69 66 0a   new SrcList if.
1dff0 2a 2a 20 6e 65 65 64 20 62 65 2e 20 20 41 20 6e  ** need be.  A n
1e000 65 77 20 65 6e 74 72 79 20 69 73 20 63 72 65 61  ew entry is crea
1e010 74 65 64 20 69 6e 20 74 68 65 20 53 72 63 4c 69  ted in the SrcLi
1e020 73 74 20 65 76 65 6e 20 69 66 20 70 54 61 62 6c  st even if pTabl
1e030 65 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a  e is NULL..**.**
1e040 20 41 20 53 72 63 4c 69 73 74 20 69 73 20 72 65   A SrcList is re
1e050 74 75 72 6e 65 64 2c 20 6f 72 20 4e 55 4c 4c 20  turned, or NULL 
1e060 69 66 20 74 68 65 72 65 20 69 73 20 61 6e 20 4f  if there is an O
1e070 4f 4d 20 65 72 72 6f 72 2e 20 20 54 68 65 20 72  OM error.  The r
1e080 65 74 75 72 6e 65 64 0a 2a 2a 20 53 72 63 4c 69  eturned.** SrcLi
1e090 73 74 20 6d 69 67 68 74 20 62 65 20 74 68 65 20  st might be the 
1e0a0 73 61 6d 65 20 61 73 20 74 68 65 20 53 72 63 4c  same as the SrcL
1e0b0 69 73 74 20 74 68 61 74 20 77 61 73 20 69 6e 70  ist that was inp
1e0c0 75 74 20 6f 72 20 69 74 20 6d 69 67 68 74 20 62  ut or it might b
1e0d0 65 0a 2a 2a 20 61 20 6e 65 77 20 6f 6e 65 2e 20  e.** a new one. 
1e0e0 20 49 66 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72   If an OOM error
1e0f0 20 64 6f 65 73 20 6f 63 63 75 72 73 2c 20 74 68   does occurs, th
1e100 65 6e 20 74 68 65 20 70 72 69 6f 72 20 76 61 6c  en the prior val
1e110 75 65 20 6f 66 20 70 4c 69 73 74 0a 2a 2a 20 74  ue of pList.** t
1e120 68 61 74 20 69 73 20 69 6e 70 75 74 20 74 6f 20  hat is input to 
1e130 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
1e140 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 66 72  automatically fr
1e150 65 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 44  eed..**.** If pD
1e160 61 74 61 62 61 73 65 20 69 73 20 6e 6f 74 20 6e  atabase is not n
1e170 75 6c 6c 2c 20 69 74 20 6d 65 61 6e 73 20 74 68  ull, it means th
1e180 61 74 20 74 68 65 20 74 61 62 6c 65 20 68 61 73  at the table has
1e190 20 61 6e 20 6f 70 74 69 6f 6e 61 6c 0a 2a 2a 20   an optional.** 
1e1a0 64 61 74 61 62 61 73 65 20 6e 61 6d 65 20 70 72  database name pr
1e1b0 65 66 69 78 2e 20 20 4c 69 6b 65 20 74 68 69 73  efix.  Like this
1e1c0 3a 20 20 22 64 61 74 61 62 61 73 65 2e 74 61 62  :  "database.tab
1e1d0 6c 65 22 2e 20 20 54 68 65 20 70 44 61 74 61 62  le".  The pDatab
1e1e0 61 73 65 0a 2a 2a 20 70 6f 69 6e 74 73 20 74 6f  ase.** points to
1e1f0 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20   the table name 
1e200 61 6e 64 20 74 68 65 20 70 54 61 62 6c 65 20 70  and the pTable p
1e210 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 64 61 74  oints to the dat
1e220 61 62 61 73 65 20 6e 61 6d 65 2e 0a 2a 2a 20 54  abase name..** T
1e230 68 65 20 53 72 63 4c 69 73 74 2e 61 5b 5d 2e 7a  he SrcList.a[].z
1e240 4e 61 6d 65 20 66 69 65 6c 64 20 69 73 20 66 69  Name field is fi
1e250 6c 6c 65 64 20 77 69 74 68 20 74 68 65 20 74 61  lled with the ta
1e260 62 6c 65 20 6e 61 6d 65 20 77 68 69 63 68 20 6d  ble name which m
1e270 69 67 68 74 0a 2a 2a 20 63 6f 6d 65 20 66 72 6f  ight.** come fro
1e280 6d 20 70 54 61 62 6c 65 20 28 69 66 20 70 44 61  m pTable (if pDa
1e290 74 61 62 61 73 65 20 69 73 20 4e 55 4c 4c 29 20  tabase is NULL) 
1e2a0 6f 72 20 66 72 6f 6d 20 70 44 61 74 61 62 61 73  or from pDatabas
1e2b0 65 2e 20 20 0a 2a 2a 20 53 72 63 4c 69 73 74 2e  e.  .** SrcList.
1e2c0 61 5b 5d 2e 7a 44 61 74 61 62 61 73 65 20 69 73  a[].zDatabase is
1e2d0 20 66 69 6c 6c 65 64 20 77 69 74 68 20 74 68 65   filled with the
1e2e0 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 20 66   database name f
1e2f0 72 6f 6d 20 70 54 61 62 6c 65 2c 0a 2a 2a 20 6f  rom pTable,.** o
1e300 72 20 77 69 74 68 20 4e 55 4c 4c 20 69 66 20 6e  r with NULL if n
1e310 6f 20 64 61 74 61 62 61 73 65 20 69 73 20 73 70  o database is sp
1e320 65 63 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 49  ecified..**.** I
1e330 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 69  n other words, i
1e340 66 20 63 61 6c 6c 20 6c 69 6b 65 20 74 68 69 73  f call like this
1e350 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20  :.**.**         
1e360 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70  sqlite3SrcListAp
1e370 70 65 6e 64 28 44 2c 41 2c 42 2c 30 29 3b 0a 2a  pend(D,A,B,0);.*
1e380 2a 0a 2a 2a 20 54 68 65 6e 20 42 20 69 73 20 61  *.** Then B is a
1e390 20 74 61 62 6c 65 20 6e 61 6d 65 20 61 6e 64 20   table name and 
1e3a0 74 68 65 20 64 61 74 61 62 61 73 65 20 6e 61 6d  the database nam
1e3b0 65 20 69 73 20 75 6e 73 70 65 63 69 66 69 65 64  e is unspecified
1e3c0 2e 20 20 49 66 20 63 61 6c 6c 65 64 0a 2a 2a 20  .  If called.** 
1e3d0 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a  like this:.**.**
1e3e0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
1e3f0 53 72 63 4c 69 73 74 41 70 70 65 6e 64 28 44 2c  SrcListAppend(D,
1e400 41 2c 42 2c 43 29 3b 0a 2a 2a 0a 2a 2a 20 54 68  A,B,C);.**.** Th
1e410 65 6e 20 43 20 69 73 20 74 68 65 20 74 61 62 6c  en C is the tabl
1e420 65 20 6e 61 6d 65 20 61 6e 64 20 42 20 69 73 20  e name and B is 
1e430 74 68 65 20 64 61 74 61 62 61 73 65 20 6e 61 6d  the database nam
1e440 65 2e 20 20 49 66 20 43 20 69 73 20 64 65 66 69  e.  If C is defi
1e450 6e 65 64 0a 2a 2a 20 74 68 65 6e 20 73 6f 20 69  ned.** then so i
1e460 73 20 42 2e 20 20 49 6e 20 6f 74 68 65 72 20 77  s B.  In other w
1e470 6f 72 64 73 2c 20 77 65 20 6e 65 76 65 72 20 68  ords, we never h
1e480 61 76 65 20 61 20 63 61 73 65 20 77 68 65 72 65  ave a case where
1e490 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20  :.**.**         
1e4a0 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70  sqlite3SrcListAp
1e4b0 70 65 6e 64 28 44 2c 41 2c 30 2c 43 29 3b 0a 2a  pend(D,A,0,C);.*
1e4c0 2a 0a 2a 2a 20 42 6f 74 68 20 70 54 61 62 6c 65  *.** Both pTable
1e4d0 20 61 6e 64 20 70 44 61 74 61 62 61 73 65 20 61   and pDatabase a
1e4e0 72 65 20 61 73 73 75 6d 65 64 20 74 6f 20 62 65  re assumed to be
1e4f0 20 71 75 6f 74 65 64 2e 20 20 54 68 65 79 20 61   quoted.  They a
1e500 72 65 20 64 65 71 75 6f 74 65 64 0a 2a 2a 20 62  re dequoted.** b
1e510 65 66 6f 72 65 20 62 65 69 6e 67 20 61 64 64 65  efore being adde
1e520 64 20 74 6f 20 74 68 65 20 53 72 63 4c 69 73 74  d to the SrcList
1e530 2e 0a 2a 2f 0a 53 72 63 4c 69 73 74 20 2a 73 71  ..*/.SrcList *sq
1e540 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70 70 65  lite3SrcListAppe
1e550 6e 64 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  nd(.  sqlite3 *d
1e560 62 2c 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e  b,        /* Con
1e570 6e 65 63 74 69 6f 6e 20 74 6f 20 6e 6f 74 69 66  nection to notif
1e580 79 20 6f 66 20 6d 61 6c 6c 6f 63 20 66 61 69 6c  y of malloc fail
1e590 75 72 65 73 20 2a 2f 0a 20 20 53 72 63 4c 69 73  ures */.  SrcLis
1e5a0 74 20 2a 70 4c 69 73 74 2c 20 20 20 20 20 2f 2a  t *pList,     /*
1e5b0 20 41 70 70 65 6e 64 20 74 6f 20 74 68 69 73 20   Append to this 
1e5c0 53 72 63 4c 69 73 74 2e 20 4e 55 4c 4c 20 63 72  SrcList. NULL cr
1e5d0 65 61 74 65 73 20 61 20 6e 65 77 20 53 72 63 4c  eates a new SrcL
1e5e0 69 73 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  ist */.  Token *
1e5f0 70 54 61 62 6c 65 2c 20 20 20 20 20 20 2f 2a 20  pTable,      /* 
1e600 54 61 62 6c 65 20 74 6f 20 61 70 70 65 6e 64 20  Table to append 
1e610 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 44 61 74  */.  Token *pDat
1e620 61 62 61 73 65 20 20 20 20 2f 2a 20 44 61 74 61  abase    /* Data
1e630 62 61 73 65 20 6f 66 20 74 68 65 20 74 61 62 6c  base of the tabl
1e640 65 20 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74  e */.){.  struct
1e650 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
1e660 49 74 65 6d 3b 0a 20 20 61 73 73 65 72 74 28 20  Item;.  assert( 
1e670 70 44 61 74 61 62 61 73 65 3d 3d 30 20 7c 7c 20  pDatabase==0 || 
1e680 70 54 61 62 6c 65 21 3d 30 20 29 3b 20 20 2f 2a  pTable!=0 );  /*
1e690 20 43 61 6e 6e 6f 74 20 68 61 76 65 20 43 20 77   Cannot have C w
1e6a0 69 74 68 6f 75 74 20 42 20 2a 2f 0a 20 20 61 73  ithout B */.  as
1e6b0 73 65 72 74 28 20 64 62 21 3d 30 20 29 3b 0a 20  sert( db!=0 );. 
1e6c0 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b   if( pList==0 ){
1e6d0 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 73 71 6c  .    pList = sql
1e6e0 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e  ite3DbMallocRawN
1e6f0 4e 28 64 62 2c 20 73 69 7a 65 6f 66 28 53 72 63  N(db, sizeof(Src
1e700 4c 69 73 74 29 20 29 3b 0a 20 20 20 20 69 66 28  List) );.    if(
1e710 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75   pList==0 ) retu
1e720 72 6e 20 30 3b 0a 20 20 20 20 70 4c 69 73 74 2d  rn 0;.    pList-
1e730 3e 6e 41 6c 6c 6f 63 20 3d 20 31 3b 0a 20 20 20  >nAlloc = 1;.   
1e740 20 70 4c 69 73 74 2d 3e 6e 53 72 63 20 3d 20 30   pList->nSrc = 0
1e750 3b 0a 20 20 7d 0a 20 20 70 4c 69 73 74 20 3d 20  ;.  }.  pList = 
1e760 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 45 6e  sqlite3SrcListEn
1e770 6c 61 72 67 65 28 64 62 2c 20 70 4c 69 73 74 2c  large(db, pList,
1e780 20 31 2c 20 70 4c 69 73 74 2d 3e 6e 53 72 63 29   1, pList->nSrc)
1e790 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c  ;.  if( db->mall
1e7a0 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
1e7b0 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44 65  sqlite3SrcListDe
1e7c0 6c 65 74 65 28 64 62 2c 20 70 4c 69 73 74 29 3b  lete(db, pList);
1e7d0 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
1e7e0 20 7d 0a 20 20 70 49 74 65 6d 20 3d 20 26 70 4c   }.  pItem = &pL
1e7f0 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 53  ist->a[pList->nS
1e800 72 63 2d 31 5d 3b 0a 20 20 69 66 28 20 70 44 61  rc-1];.  if( pDa
1e810 74 61 62 61 73 65 20 26 26 20 70 44 61 74 61 62  tabase && pDatab
1e820 61 73 65 2d 3e 7a 3d 3d 30 20 29 7b 0a 20 20 20  ase->z==0 ){.   
1e830 20 70 44 61 74 61 62 61 73 65 20 3d 20 30 3b 0a   pDatabase = 0;.
1e840 20 20 7d 0a 20 20 69 66 28 20 70 44 61 74 61 62    }.  if( pDatab
1e850 61 73 65 20 29 7b 0a 20 20 20 20 54 6f 6b 65 6e  ase ){.    Token
1e860 20 2a 70 54 65 6d 70 20 3d 20 70 44 61 74 61 62   *pTemp = pDatab
1e870 61 73 65 3b 0a 20 20 20 20 70 44 61 74 61 62 61  ase;.    pDataba
1e880 73 65 20 3d 20 70 54 61 62 6c 65 3b 0a 20 20 20  se = pTable;.   
1e890 20 70 54 61 62 6c 65 20 3d 20 70 54 65 6d 70 3b   pTable = pTemp;
1e8a0 0a 20 20 7d 0a 20 20 70 49 74 65 6d 2d 3e 7a 4e  .  }.  pItem->zN
1e8b0 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d  ame = sqlite3Nam
1e8c0 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70  eFromToken(db, p
1e8d0 54 61 62 6c 65 29 3b 0a 20 20 70 49 74 65 6d 2d  Table);.  pItem-
1e8e0 3e 7a 44 61 74 61 62 61 73 65 20 3d 20 73 71 6c  >zDatabase = sql
1e8f0 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65  ite3NameFromToke
1e900 6e 28 64 62 2c 20 70 44 61 74 61 62 61 73 65 29  n(db, pDatabase)
1e910 3b 0a 20 20 72 65 74 75 72 6e 20 70 4c 69 73 74  ;.  return pList
1e920 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 73 73 69 67  ;.}../*.** Assig
1e930 6e 20 56 64 62 65 43 75 72 73 6f 72 20 69 6e 64  n VdbeCursor ind
1e940 65 78 20 6e 75 6d 62 65 72 73 20 74 6f 20 61 6c  ex numbers to al
1e950 6c 20 74 61 62 6c 65 73 20 69 6e 20 61 20 53 72  l tables in a Sr
1e960 63 4c 69 73 74 0a 2a 2f 0a 76 6f 69 64 20 73 71  cList.*/.void sq
1e970 6c 69 74 65 33 53 72 63 4c 69 73 74 41 73 73 69  lite3SrcListAssi
1e980 67 6e 43 75 72 73 6f 72 73 28 50 61 72 73 65 20  gnCursors(Parse 
1e990 2a 70 50 61 72 73 65 2c 20 53 72 63 4c 69 73 74  *pParse, SrcList
1e9a0 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20   *pList){.  int 
1e9b0 69 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  i;.  struct SrcL
1e9c0 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b  ist_item *pItem;
1e9d0 0a 20 20 61 73 73 65 72 74 28 70 4c 69 73 74 20  .  assert(pList 
1e9e0 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d  || pParse->db->m
1e9f0 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20  allocFailed );. 
1ea00 20 69 66 28 20 70 4c 69 73 74 20 29 7b 0a 20 20   if( pList ){.  
1ea10 20 20 66 6f 72 28 69 3d 30 2c 20 70 49 74 65 6d    for(i=0, pItem
1ea20 3d 70 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 4c 69  =pList->a; i<pLi
1ea30 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70  st->nSrc; i++, p
1ea40 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 69  Item++){.      i
1ea50 66 28 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f  f( pItem->iCurso
1ea60 72 3e 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  r>=0 ) break;.  
1ea70 20 20 20 20 70 49 74 65 6d 2d 3e 69 43 75 72 73      pItem->iCurs
1ea80 6f 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  or = pParse->nTa
1ea90 62 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 70  b++;.      if( p
1eaa0 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 20 29 7b  Item->pSelect ){
1eab0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1eac0 53 72 63 4c 69 73 74 41 73 73 69 67 6e 43 75 72  SrcListAssignCur
1ead0 73 6f 72 73 28 70 50 61 72 73 65 2c 20 70 49 74  sors(pParse, pIt
1eae0 65 6d 2d 3e 70 53 65 6c 65 63 74 2d 3e 70 53 72  em->pSelect->pSr
1eaf0 63 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  c);.      }.    
1eb00 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  }.  }.}../*.** D
1eb10 65 6c 65 74 65 20 61 6e 20 65 6e 74 69 72 65 20  elete an entire 
1eb20 53 72 63 4c 69 73 74 20 69 6e 63 6c 75 64 69 6e  SrcList includin
1eb30 67 20 61 6c 6c 20 69 74 73 20 73 75 62 73 74 72  g all its substr
1eb40 75 63 74 75 72 65 2e 0a 2a 2f 0a 76 6f 69 64 20  ucture..*/.void 
1eb50 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44 65  sqlite3SrcListDe
1eb60 6c 65 74 65 28 73 71 6c 69 74 65 33 20 2a 64 62  lete(sqlite3 *db
1eb70 2c 20 53 72 63 4c 69 73 74 20 2a 70 4c 69 73 74  , SrcList *pList
1eb80 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74  ){.  int i;.  st
1eb90 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
1eba0 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69 66 28 20  m *pItem;.  if( 
1ebb0 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72  pList==0 ) retur
1ebc0 6e 3b 0a 20 20 66 6f 72 28 70 49 74 65 6d 3d 70  n;.  for(pItem=p
1ebd0 4c 69 73 74 2d 3e 61 2c 20 69 3d 30 3b 20 69 3c  List->a, i=0; i<
1ebe0 70 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b  pList->nSrc; i++
1ebf0 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20  , pItem++){.    
1ec00 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
1ec10 2c 20 70 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61  , pItem->zDataba
1ec20 73 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  se);.    sqlite3
1ec30 44 62 46 72 65 65 28 64 62 2c 20 70 49 74 65 6d  DbFree(db, pItem
1ec40 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 73 71  ->zName);.    sq
1ec50 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
1ec60 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a  pItem->zAlias);.
1ec70 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 66      if( pItem->f
1ec80 67 2e 69 73 49 6e 64 65 78 65 64 42 79 20 29 20  g.isIndexedBy ) 
1ec90 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
1eca0 2c 20 70 49 74 65 6d 2d 3e 75 31 2e 7a 49 6e 64  , pItem->u1.zInd
1ecb0 65 78 65 64 42 79 29 3b 0a 20 20 20 20 69 66 28  exedBy);.    if(
1ecc0 20 70 49 74 65 6d 2d 3e 66 67 2e 69 73 54 61 62   pItem->fg.isTab
1ecd0 46 75 6e 63 20 29 20 73 71 6c 69 74 65 33 45 78  Func ) sqlite3Ex
1ece0 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c  prListDelete(db,
1ecf0 20 70 49 74 65 6d 2d 3e 75 31 2e 70 46 75 6e 63   pItem->u1.pFunc
1ed00 41 72 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Arg);.    sqlite
1ed10 33 44 65 6c 65 74 65 54 61 62 6c 65 28 64 62 2c  3DeleteTable(db,
1ed20 20 70 49 74 65 6d 2d 3e 70 54 61 62 29 3b 0a 20   pItem->pTab);. 
1ed30 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74     sqlite3Select
1ed40 44 65 6c 65 74 65 28 64 62 2c 20 70 49 74 65 6d  Delete(db, pItem
1ed50 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20  ->pSelect);.    
1ed60 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
1ed70 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 70 4f 6e  e(db, pItem->pOn
1ed80 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 49 64  );.    sqlite3Id
1ed90 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70  ListDelete(db, p
1eda0 49 74 65 6d 2d 3e 70 55 73 69 6e 67 29 3b 0a 20  Item->pUsing);. 
1edb0 20 7d 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72   }.  sqlite3DbFr
1edc0 65 65 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a 7d  ee(db, pList);.}
1edd0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
1ede0 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 62  tine is called b
1edf0 79 20 74 68 65 20 70 61 72 73 65 72 20 74 6f 20  y the parser to 
1ee00 61 64 64 20 61 20 6e 65 77 20 74 65 72 6d 20 74  add a new term t
1ee10 6f 20 74 68 65 0a 2a 2a 20 65 6e 64 20 6f 66 20  o the.** end of 
1ee20 61 20 67 72 6f 77 69 6e 67 20 46 52 4f 4d 20 63  a growing FROM c
1ee30 6c 61 75 73 65 2e 20 20 54 68 65 20 22 70 22 20  lause.  The "p" 
1ee40 70 61 72 61 6d 65 74 65 72 20 69 73 20 74 68 65  parameter is the
1ee50 20 70 61 72 74 20 6f 66 0a 2a 2a 20 74 68 65 20   part of.** the 
1ee60 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 68 61 74  FROM clause that
1ee70 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
1ee80 6e 20 63 6f 6e 73 74 72 75 63 74 65 64 2e 20 20  n constructed.  
1ee90 22 70 22 20 69 73 20 4e 55 4c 4c 0a 2a 2a 20 69  "p" is NULL.** i
1eea0 66 20 74 68 69 73 20 69 73 20 74 68 65 20 66 69  f this is the fi
1eeb0 72 73 74 20 74 65 72 6d 20 6f 66 20 74 68 65 20  rst term of the 
1eec0 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20 70 54  FROM clause.  pT
1eed0 61 62 6c 65 20 61 6e 64 20 70 44 61 74 61 62 61  able and pDataba
1eee0 73 65 0a 2a 2a 20 61 72 65 20 74 68 65 20 6e 61  se.** are the na
1eef0 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  me of the table 
1ef00 61 6e 64 20 64 61 74 61 62 61 73 65 20 6e 61 6d  and database nam
1ef10 65 64 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63  ed in the FROM c
1ef20 6c 61 75 73 65 20 74 65 72 6d 2e 0a 2a 2a 20 70  lause term..** p
1ef30 44 61 74 61 62 61 73 65 20 69 73 20 4e 55 4c 4c  Database is NULL
1ef40 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65   if the database
1ef50 20 6e 61 6d 65 20 71 75 61 6c 69 66 69 65 72 20   name qualifier 
1ef60 69 73 20 6d 69 73 73 69 6e 67 20 2d 20 74 68 65  is missing - the
1ef70 0a 2a 2a 20 75 73 75 61 6c 20 63 61 73 65 2e 20  .** usual case. 
1ef80 20 49 66 20 74 68 65 20 74 65 72 6d 20 68 61 73   If the term has
1ef90 20 61 6e 20 61 6c 69 61 73 2c 20 74 68 65 6e 20   an alias, then 
1efa0 70 41 6c 69 61 73 20 70 6f 69 6e 74 73 20 74 6f  pAlias points to
1efb0 20 74 68 65 0a 2a 2a 20 61 6c 69 61 73 20 74 6f   the.** alias to
1efc0 6b 65 6e 2e 20 20 49 66 20 74 68 65 20 74 65 72  ken.  If the ter
1efd0 6d 20 69 73 20 61 20 73 75 62 71 75 65 72 79 2c  m is a subquery,
1efe0 20 74 68 65 6e 20 70 53 75 62 71 75 65 72 79 20   then pSubquery 
1eff0 69 73 20 74 68 65 0a 2a 2a 20 53 45 4c 45 43 54  is the.** SELECT
1f000 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20   statement that 
1f010 74 68 65 20 73 75 62 71 75 65 72 79 20 65 6e 63  the subquery enc
1f020 6f 64 65 73 2e 20 20 54 68 65 20 70 54 61 62 6c  odes.  The pTabl
1f030 65 20 61 6e 64 0a 2a 2a 20 70 44 61 74 61 62 61  e and.** pDataba
1f040 73 65 20 70 61 72 61 6d 65 74 65 72 73 20 61 72  se parameters ar
1f050 65 20 4e 55 4c 4c 20 66 6f 72 20 73 75 62 71 75  e NULL for subqu
1f060 65 72 69 65 73 2e 20 20 54 68 65 20 70 4f 6e 20  eries.  The pOn 
1f070 61 6e 64 20 70 55 73 69 6e 67 0a 2a 2a 20 70 61  and pUsing.** pa
1f080 72 61 6d 65 74 65 72 73 20 61 72 65 20 74 68 65  rameters are the
1f090 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20   content of the 
1f0a0 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 63 6c 61  ON and USING cla
1f0b0 75 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  uses..**.** Retu
1f0c0 72 6e 20 61 20 6e 65 77 20 53 72 63 4c 69 73 74  rn a new SrcList
1f0d0 20 77 68 69 63 68 20 65 6e 63 6f 64 65 73 20 69   which encodes i
1f0e0 73 20 74 68 65 20 46 52 4f 4d 20 77 69 74 68 20  s the FROM with 
1f0f0 74 68 65 20 6e 65 77 0a 2a 2a 20 74 65 72 6d 20  the new.** term 
1f100 61 64 64 65 64 2e 0a 2a 2f 0a 53 72 63 4c 69 73  added..*/.SrcLis
1f110 74 20 2a 73 71 6c 69 74 65 33 53 72 63 4c 69 73  t *sqlite3SrcLis
1f120 74 41 70 70 65 6e 64 46 72 6f 6d 54 65 72 6d 28  tAppendFromTerm(
1f130 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
1f140 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61  ,          /* Pa
1f150 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
1f160 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 2c 20 20  .  SrcList *p,  
1f170 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
1f180 65 20 6c 65 66 74 20 70 61 72 74 20 6f 66 20 74  e left part of t
1f190 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 61  he FROM clause a
1f1a0 6c 72 65 61 64 79 20 73 65 65 6e 20 2a 2f 0a 20  lready seen */. 
1f1b0 20 54 6f 6b 65 6e 20 2a 70 54 61 62 6c 65 2c 20   Token *pTable, 
1f1c0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
1f1d0 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74 6f   of the table to
1f1e0 20 61 64 64 20 74 6f 20 74 68 65 20 46 52 4f 4d   add to the FROM
1f1f0 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 54 6f 6b   clause */.  Tok
1f200 65 6e 20 2a 70 44 61 74 61 62 61 73 65 2c 20 20  en *pDatabase,  
1f210 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
1f220 74 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e  the database con
1f230 74 61 69 6e 69 6e 67 20 70 54 61 62 6c 65 20 2a  taining pTable *
1f240 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 41 6c 69 61  /.  Token *pAlia
1f250 73 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  s,          /* T
1f260 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69  he right-hand si
1f270 64 65 20 6f 66 20 74 68 65 20 41 53 20 73 75 62  de of the AS sub
1f280 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20  expression */.  
1f290 53 65 6c 65 63 74 20 2a 70 53 75 62 71 75 65 72  Select *pSubquer
1f2a0 79 2c 20 20 20 20 20 20 2f 2a 20 41 20 73 75 62  y,      /* A sub
1f2b0 71 75 65 72 79 20 75 73 65 64 20 69 6e 20 70 6c  query used in pl
1f2c0 61 63 65 20 6f 66 20 61 20 74 61 62 6c 65 20 6e  ace of a table n
1f2d0 61 6d 65 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  ame */.  Expr *p
1f2e0 4f 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  On,             
1f2f0 20 2f 2a 20 54 68 65 20 4f 4e 20 63 6c 61 75 73   /* The ON claus
1f300 65 20 6f 66 20 61 20 6a 6f 69 6e 20 2a 2f 0a 20  e of a join */. 
1f310 20 49 64 4c 69 73 74 20 2a 70 55 73 69 6e 67 20   IdList *pUsing 
1f320 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1f330 55 53 49 4e 47 20 63 6c 61 75 73 65 20 6f 66 20  USING clause of 
1f340 61 20 6a 6f 69 6e 20 2a 2f 0a 29 7b 0a 20 20 73  a join */.){.  s
1f350 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
1f360 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 73 71 6c  em *pItem;.  sql
1f370 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
1f380 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20 21 70 20  e->db;.  if( !p 
1f390 26 26 20 28 70 4f 6e 20 7c 7c 20 70 55 73 69 6e  && (pOn || pUsin
1f3a0 67 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  g) ){.    sqlite
1f3b0 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
1f3c0 2c 20 22 61 20 4a 4f 49 4e 20 63 6c 61 75 73 65  , "a JOIN clause
1f3d0 20 69 73 20 72 65 71 75 69 72 65 64 20 62 65 66   is required bef
1f3e0 6f 72 65 20 25 73 22 2c 20 0a 20 20 20 20 20 20  ore %s", .      
1f3f0 28 70 4f 6e 20 3f 20 22 4f 4e 22 20 3a 20 22 55  (pOn ? "ON" : "U
1f400 53 49 4e 47 22 29 0a 20 20 20 20 29 3b 0a 20 20  SING").    );.  
1f410 20 20 67 6f 74 6f 20 61 70 70 65 6e 64 5f 66 72    goto append_fr
1f420 6f 6d 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 20 20  om_error;.  }.  
1f430 70 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69  p = sqlite3SrcLi
1f440 73 74 41 70 70 65 6e 64 28 64 62 2c 20 70 2c 20  stAppend(db, p, 
1f450 70 54 61 62 6c 65 2c 20 70 44 61 74 61 62 61 73  pTable, pDatabas
1f460 65 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c  e);.  if( p==0 |
1f470 7c 20 4e 45 56 45 52 28 70 2d 3e 6e 53 72 63 3d  | NEVER(p->nSrc=
1f480 3d 30 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  =0) ){.    goto 
1f490 61 70 70 65 6e 64 5f 66 72 6f 6d 5f 65 72 72 6f  append_from_erro
1f4a0 72 3b 0a 20 20 7d 0a 20 20 70 49 74 65 6d 20 3d  r;.  }.  pItem =
1f4b0 20 26 70 2d 3e 61 5b 70 2d 3e 6e 53 72 63 2d 31   &p->a[p->nSrc-1
1f4c0 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 41 6c  ];.  assert( pAl
1f4d0 69 61 73 21 3d 30 20 29 3b 0a 20 20 69 66 28 20  ias!=0 );.  if( 
1f4e0 70 41 6c 69 61 73 2d 3e 6e 20 29 7b 0a 20 20 20  pAlias->n ){.   
1f4f0 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 3d   pItem->zAlias =
1f500 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d   sqlite3NameFrom
1f510 54 6f 6b 65 6e 28 64 62 2c 20 70 41 6c 69 61 73  Token(db, pAlias
1f520 29 3b 0a 20 20 7d 0a 20 20 70 49 74 65 6d 2d 3e  );.  }.  pItem->
1f530 70 53 65 6c 65 63 74 20 3d 20 70 53 75 62 71 75  pSelect = pSubqu
1f540 65 72 79 3b 0a 20 20 70 49 74 65 6d 2d 3e 70 4f  ery;.  pItem->pO
1f550 6e 20 3d 20 70 4f 6e 3b 0a 20 20 70 49 74 65 6d  n = pOn;.  pItem
1f560 2d 3e 70 55 73 69 6e 67 20 3d 20 70 55 73 69 6e  ->pUsing = pUsin
1f570 67 3b 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 0a  g;.  return p;..
1f580 20 61 70 70 65 6e 64 5f 66 72 6f 6d 5f 65 72 72   append_from_err
1f590 6f 72 3a 0a 20 20 61 73 73 65 72 74 28 20 70 3d  or:.  assert( p=
1f5a0 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 45  =0 );.  sqlite3E
1f5b0 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 4f  xprDelete(db, pO
1f5c0 6e 29 3b 0a 20 20 73 71 6c 69 74 65 33 49 64 4c  n);.  sqlite3IdL
1f5d0 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 55  istDelete(db, pU
1f5e0 73 69 6e 67 29 3b 0a 20 20 73 71 6c 69 74 65 33  sing);.  sqlite3
1f5f0 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c  SelectDelete(db,
1f600 20 70 53 75 62 71 75 65 72 79 29 3b 0a 20 20 72   pSubquery);.  r
1f610 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
1f620 2a 20 41 64 64 20 61 6e 20 49 4e 44 45 58 45 44  * Add an INDEXED
1f630 20 42 59 20 6f 72 20 4e 4f 54 20 49 4e 44 45 58   BY or NOT INDEX
1f640 45 44 20 63 6c 61 75 73 65 20 74 6f 20 74 68 65  ED clause to the
1f650 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 61   most recently a
1f660 64 64 65 64 20 0a 2a 2a 20 65 6c 65 6d 65 6e 74  dded .** element
1f670 20 6f 66 20 74 68 65 20 73 6f 75 72 63 65 2d 6c   of the source-l
1f680 69 73 74 20 70 61 73 73 65 64 20 61 73 20 74 68  ist passed as th
1f690 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
1f6a0 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  t..*/.void sqlit
1f6b0 65 33 53 72 63 4c 69 73 74 49 6e 64 65 78 65 64  e3SrcListIndexed
1f6c0 42 79 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  By(Parse *pParse
1f6d0 2c 20 53 72 63 4c 69 73 74 20 2a 70 2c 20 54 6f  , SrcList *p, To
1f6e0 6b 65 6e 20 2a 70 49 6e 64 65 78 65 64 42 79 29  ken *pIndexedBy)
1f6f0 7b 0a 20 20 61 73 73 65 72 74 28 20 70 49 6e 64  {.  assert( pInd
1f700 65 78 65 64 42 79 21 3d 30 20 29 3b 0a 20 20 69  exedBy!=0 );.  i
1f710 66 28 20 70 20 26 26 20 41 4c 57 41 59 53 28 70  f( p && ALWAYS(p
1f720 2d 3e 6e 53 72 63 3e 30 29 20 29 7b 0a 20 20 20  ->nSrc>0) ){.   
1f730 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
1f740 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70  item *pItem = &p
1f750 2d 3e 61 5b 70 2d 3e 6e 53 72 63 2d 31 5d 3b 0a  ->a[p->nSrc-1];.
1f760 20 20 20 20 61 73 73 65 72 74 28 20 70 49 74 65      assert( pIte
1f770 6d 2d 3e 66 67 2e 6e 6f 74 49 6e 64 65 78 65 64  m->fg.notIndexed
1f780 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==0 );.    asser
1f790 74 28 20 70 49 74 65 6d 2d 3e 66 67 2e 69 73 49  t( pItem->fg.isI
1f7a0 6e 64 65 78 65 64 42 79 3d 3d 30 20 29 3b 0a 20  ndexedBy==0 );. 
1f7b0 20 20 20 61 73 73 65 72 74 28 20 70 49 74 65 6d     assert( pItem
1f7c0 2d 3e 66 67 2e 69 73 54 61 62 46 75 6e 63 3d 3d  ->fg.isTabFunc==
1f7d0 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70 49 6e  0 );.    if( pIn
1f7e0 64 65 78 65 64 42 79 2d 3e 6e 3d 3d 31 20 26 26  dexedBy->n==1 &&
1f7f0 20 21 70 49 6e 64 65 78 65 64 42 79 2d 3e 7a 20   !pIndexedBy->z 
1f800 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 20 22 4e  ){.      /* A "N
1f810 4f 54 20 49 4e 44 45 58 45 44 22 20 63 6c 61 75  OT INDEXED" clau
1f820 73 65 20 77 61 73 20 73 75 70 70 6c 69 65 64 2e  se was supplied.
1f830 20 53 65 65 20 70 61 72 73 65 2e 79 20 0a 20 20   See parse.y .  
1f840 20 20 20 20 2a 2a 20 63 6f 6e 73 74 72 75 63 74      ** construct
1f850 20 22 69 6e 64 65 78 65 64 5f 6f 70 74 22 20 66   "indexed_opt" f
1f860 6f 72 20 64 65 74 61 69 6c 73 2e 20 2a 2f 0a 20  or details. */. 
1f870 20 20 20 20 20 70 49 74 65 6d 2d 3e 66 67 2e 6e       pItem->fg.n
1f880 6f 74 49 6e 64 65 78 65 64 20 3d 20 31 3b 0a 20  otIndexed = 1;. 
1f890 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1f8a0 70 49 74 65 6d 2d 3e 75 31 2e 7a 49 6e 64 65 78  pItem->u1.zIndex
1f8b0 65 64 42 79 20 3d 20 73 71 6c 69 74 65 33 4e 61  edBy = sqlite3Na
1f8c0 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 50 61 72  meFromToken(pPar
1f8d0 73 65 2d 3e 64 62 2c 20 70 49 6e 64 65 78 65 64  se->db, pIndexed
1f8e0 42 79 29 3b 0a 20 20 20 20 20 20 70 49 74 65 6d  By);.      pItem
1f8f0 2d 3e 66 67 2e 69 73 49 6e 64 65 78 65 64 42 79  ->fg.isIndexedBy
1f900 20 3d 20 28 70 49 74 65 6d 2d 3e 75 31 2e 7a 49   = (pItem->u1.zI
1f910 6e 64 65 78 65 64 42 79 21 3d 30 29 3b 0a 20 20  ndexedBy!=0);.  
1f920 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
1f930 20 41 64 64 20 74 68 65 20 6c 69 73 74 20 6f 66   Add the list of
1f940 20 66 75 6e 63 74 69 6f 6e 20 61 72 67 75 6d 65   function argume
1f950 6e 74 73 20 74 6f 20 74 68 65 20 53 72 63 4c 69  nts to the SrcLi
1f960 73 74 20 65 6e 74 72 79 20 66 6f 72 20 61 0a 2a  st entry for a.*
1f970 2a 20 74 61 62 6c 65 2d 76 61 6c 75 65 64 2d 66  * table-valued-f
1f980 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64  unction..*/.void
1f990 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 46   sqlite3SrcListF
1f9a0 75 6e 63 41 72 67 73 28 50 61 72 73 65 20 2a 70  uncArgs(Parse *p
1f9b0 50 61 72 73 65 2c 20 53 72 63 4c 69 73 74 20 2a  Parse, SrcList *
1f9c0 70 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69  p, ExprList *pLi
1f9d0 73 74 29 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a  st){.  if( p ){.
1f9e0 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69      struct SrcLi
1f9f0 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d  st_item *pItem =
1fa00 20 26 70 2d 3e 61 5b 70 2d 3e 6e 53 72 63 2d 31   &p->a[p->nSrc-1
1fa10 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ];.    assert( p
1fa20 49 74 65 6d 2d 3e 66 67 2e 6e 6f 74 49 6e 64 65  Item->fg.notInde
1fa30 78 65 64 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73  xed==0 );.    as
1fa40 73 65 72 74 28 20 70 49 74 65 6d 2d 3e 66 67 2e  sert( pItem->fg.
1fa50 69 73 49 6e 64 65 78 65 64 42 79 3d 3d 30 20 29  isIndexedBy==0 )
1fa60 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49  ;.    assert( pI
1fa70 74 65 6d 2d 3e 66 67 2e 69 73 54 61 62 46 75 6e  tem->fg.isTabFun
1fa80 63 3d 3d 30 20 29 3b 0a 20 20 20 20 70 49 74 65  c==0 );.    pIte
1fa90 6d 2d 3e 75 31 2e 70 46 75 6e 63 41 72 67 20 3d  m->u1.pFuncArg =
1faa0 20 70 4c 69 73 74 3b 0a 20 20 20 20 70 49 74 65   pList;.    pIte
1fab0 6d 2d 3e 66 67 2e 69 73 54 61 62 46 75 6e 63 20  m->fg.isTabFunc 
1fac0 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 1;.  }else{.  
1fad0 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
1fae0 74 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e  tDelete(pParse->
1faf0 64 62 2c 20 70 4c 69 73 74 29 3b 0a 20 20 7d 0a  db, pList);.  }.
1fb00 7d 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 62 75  }../*.** When bu
1fb10 69 6c 64 69 6e 67 20 75 70 20 61 20 46 52 4f 4d  ilding up a FROM
1fb20 20 63 6c 61 75 73 65 20 69 6e 20 74 68 65 20 70   clause in the p
1fb30 61 72 73 65 72 2c 20 74 68 65 20 6a 6f 69 6e 20  arser, the join 
1fb40 6f 70 65 72 61 74 6f 72 0a 2a 2a 20 69 73 20 69  operator.** is i
1fb50 6e 69 74 69 61 6c 6c 79 20 61 74 74 61 63 68 65  nitially attache
1fb60 64 20 74 6f 20 74 68 65 20 6c 65 66 74 20 6f 70  d to the left op
1fb70 65 72 61 6e 64 2e 20 20 42 75 74 20 74 68 65 20  erand.  But the 
1fb80 63 6f 64 65 20 67 65 6e 65 72 61 74 6f 72 0a 2a  code generator.*
1fb90 2a 20 65 78 70 65 63 74 73 20 74 68 65 20 6a 6f  * expects the jo
1fba0 69 6e 20 6f 70 65 72 61 74 6f 72 20 74 6f 20 62  in operator to b
1fbb0 65 20 6f 6e 20 74 68 65 20 72 69 67 68 74 20 6f  e on the right o
1fbc0 70 65 72 61 6e 64 2e 20 20 54 68 69 73 20 72 6f  perand.  This ro
1fbd0 75 74 69 6e 65 0a 2a 2a 20 53 68 69 66 74 73 20  utine.** Shifts 
1fbe0 61 6c 6c 20 6a 6f 69 6e 20 6f 70 65 72 61 74 6f  all join operato
1fbf0 72 73 20 66 72 6f 6d 20 6c 65 66 74 20 74 6f 20  rs from left to 
1fc00 72 69 67 68 74 20 66 6f 72 20 61 6e 20 65 6e 74  right for an ent
1fc10 69 72 65 20 46 52 4f 4d 0a 2a 2a 20 63 6c 61 75  ire FROM.** clau
1fc20 73 65 2e 0a 2a 2a 0a 2a 2a 20 45 78 61 6d 70 6c  se..**.** Exampl
1fc30 65 3a 20 53 75 70 70 6f 73 65 20 74 68 65 20 6a  e: Suppose the j
1fc40 6f 69 6e 20 69 73 20 6c 69 6b 65 20 74 68 69 73  oin is like this
1fc50 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20  :.**.**         
1fc60 20 20 41 20 6e 61 74 75 72 61 6c 20 63 72 6f 73    A natural cros
1fc70 73 20 6a 6f 69 6e 20 42 0a 2a 2a 0a 2a 2a 20 54  s join B.**.** T
1fc80 68 65 20 6f 70 65 72 61 74 6f 72 20 69 73 20 22  he operator is "
1fc90 6e 61 74 75 72 61 6c 20 63 72 6f 73 73 20 6a 6f  natural cross jo
1fca0 69 6e 22 2e 20 20 54 68 65 20 41 20 61 6e 64 20  in".  The A and 
1fcb0 42 20 6f 70 65 72 61 6e 64 73 20 61 72 65 20 73  B operands are s
1fcc0 74 6f 72 65 64 0a 2a 2a 20 69 6e 20 70 2d 3e 61  tored.** in p->a
1fcd0 5b 30 5d 20 61 6e 64 20 70 2d 3e 61 5b 31 5d 2c  [0] and p->a[1],
1fce0 20 72 65 73 70 65 63 74 69 76 65 6c 79 2e 20 20   respectively.  
1fcf0 54 68 65 20 70 61 72 73 65 72 20 69 6e 69 74 69  The parser initi
1fd00 61 6c 6c 79 20 73 74 6f 72 65 73 20 74 68 65 0a  ally stores the.
1fd10 2a 2a 20 6f 70 65 72 61 74 6f 72 20 77 69 74 68  ** operator with
1fd20 20 41 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e   A.  This routin
1fd30 65 20 73 68 69 66 74 73 20 74 68 61 74 20 6f 70  e shifts that op
1fd40 65 72 61 74 6f 72 20 6f 76 65 72 20 74 6f 20 42  erator over to B
1fd50 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
1fd60 33 53 72 63 4c 69 73 74 53 68 69 66 74 4a 6f 69  3SrcListShiftJoi
1fd70 6e 54 79 70 65 28 53 72 63 4c 69 73 74 20 2a 70  nType(SrcList *p
1fd80 29 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20  ){.  if( p ){.  
1fd90 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72    int i;.    for
1fda0 28 69 3d 70 2d 3e 6e 53 72 63 2d 31 3b 20 69 3e  (i=p->nSrc-1; i>
1fdb0 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 20 20 70  0; i--){.      p
1fdc0 2d 3e 61 5b 69 5d 2e 66 67 2e 6a 6f 69 6e 74 79  ->a[i].fg.jointy
1fdd0 70 65 20 3d 20 70 2d 3e 61 5b 69 2d 31 5d 2e 66  pe = p->a[i-1].f
1fde0 67 2e 6a 6f 69 6e 74 79 70 65 3b 0a 20 20 20 20  g.jointype;.    
1fdf0 7d 0a 20 20 20 20 70 2d 3e 61 5b 30 5d 2e 66 67  }.    p->a[0].fg
1fe00 2e 6a 6f 69 6e 74 79 70 65 20 3d 20 30 3b 0a 20  .jointype = 0;. 
1fe10 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65   }.}../*.** Gene
1fe20 72 61 74 65 20 56 44 42 45 20 63 6f 64 65 20 66  rate VDBE code f
1fe30 6f 72 20 61 20 42 45 47 49 4e 20 73 74 61 74 65  or a BEGIN state
1fe40 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ment..*/.void sq
1fe50 6c 69 74 65 33 42 65 67 69 6e 54 72 61 6e 73 61  lite3BeginTransa
1fe60 63 74 69 6f 6e 28 50 61 72 73 65 20 2a 70 50 61  ction(Parse *pPa
1fe70 72 73 65 2c 20 69 6e 74 20 74 79 70 65 29 7b 0a  rse, int type){.
1fe80 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
1fe90 20 56 64 62 65 20 2a 76 3b 0a 20 20 69 6e 74 20   Vdbe *v;.  int 
1fea0 69 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  i;..  assert( pP
1feb0 61 72 73 65 21 3d 30 20 29 3b 0a 20 20 64 62 20  arse!=0 );.  db 
1fec0 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
1fed0 61 73 73 65 72 74 28 20 64 62 21 3d 30 20 29 3b  assert( db!=0 );
1fee0 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75  .  if( sqlite3Au
1fef0 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  thCheck(pParse, 
1ff00 53 51 4c 49 54 45 5f 54 52 41 4e 53 41 43 54 49  SQLITE_TRANSACTI
1ff10 4f 4e 2c 20 22 42 45 47 49 4e 22 2c 20 30 2c 20  ON, "BEGIN", 0, 
1ff20 30 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  0) ){.    return
1ff30 3b 0a 20 20 7d 0a 20 20 76 20 3d 20 73 71 6c 69  ;.  }.  v = sqli
1ff40 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
1ff50 65 29 3b 0a 20 20 69 66 28 20 21 76 20 29 20 72  e);.  if( !v ) r
1ff60 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 74 79 70  eturn;.  if( typ
1ff70 65 21 3d 54 4b 5f 44 45 46 45 52 52 45 44 20 29  e!=TK_DEFERRED )
1ff80 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  {.    for(i=0; i
1ff90 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a  <db->nDb; i++){.
1ffa0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1ffb0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 54 72  eAddOp2(v, OP_Tr
1ffc0 61 6e 73 61 63 74 69 6f 6e 2c 20 69 2c 20 28 74  ansaction, i, (t
1ffd0 79 70 65 3d 3d 54 4b 5f 45 58 43 4c 55 53 49 56  ype==TK_EXCLUSIV
1ffe0 45 29 2b 31 29 3b 0a 20 20 20 20 20 20 73 71 6c  E)+1);.      sql
1fff0 69 74 65 33 56 64 62 65 55 73 65 73 42 74 72 65  ite3VdbeUsesBtre
20000 65 28 76 2c 20 69 29 3b 0a 20 20 20 20 7d 0a 20  e(v, i);.    }. 
20010 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65   }.  sqlite3Vdbe
20020 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 41 75 74  AddOp0(v, OP_Aut
20030 6f 43 6f 6d 6d 69 74 29 3b 0a 7d 0a 0a 2f 2a 0a  oCommit);.}../*.
20040 2a 2a 20 47 65 6e 65 72 61 74 65 20 56 44 42 45  ** Generate VDBE
20050 20 63 6f 64 65 20 66 6f 72 20 61 20 43 4f 4d 4d   code for a COMM
20060 49 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f  IT statement..*/
20070 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 6f 6d  .void sqlite3Com
20080 6d 69 74 54 72 61 6e 73 61 63 74 69 6f 6e 28 50  mitTransaction(P
20090 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20  arse *pParse){. 
200a0 20 56 64 62 65 20 2a 76 3b 0a 0a 20 20 61 73 73   Vdbe *v;..  ass
200b0 65 72 74 28 20 70 50 61 72 73 65 21 3d 30 20 29  ert( pParse!=0 )
200c0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72  ;.  assert( pPar
200d0 73 65 2d 3e 64 62 21 3d 30 20 29 3b 0a 20 20 69  se->db!=0 );.  i
200e0 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68  f( sqlite3AuthCh
200f0 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49  eck(pParse, SQLI
20100 54 45 5f 54 52 41 4e 53 41 43 54 49 4f 4e 2c 20  TE_TRANSACTION, 
20110 22 43 4f 4d 4d 49 54 22 2c 20 30 2c 20 30 29 20  "COMMIT", 0, 0) 
20120 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  ){.    return;. 
20130 20 7d 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33   }.  v = sqlite3
20140 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
20150 0a 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20  .  if( v ){.    
20160 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
20170 31 28 76 2c 20 4f 50 5f 41 75 74 6f 43 6f 6d 6d  1(v, OP_AutoComm
20180 69 74 2c 20 31 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  it, 1);.  }.}../
20190 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 56 44  *.** Generate VD
201a0 42 45 20 63 6f 64 65 20 66 6f 72 20 61 20 52 4f  BE code for a RO
201b0 4c 4c 42 41 43 4b 20 73 74 61 74 65 6d 65 6e 74  LLBACK statement
201c0 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
201d0 33 52 6f 6c 6c 62 61 63 6b 54 72 61 6e 73 61 63  3RollbackTransac
201e0 74 69 6f 6e 28 50 61 72 73 65 20 2a 70 50 61 72  tion(Parse *pPar
201f0 73 65 29 7b 0a 20 20 56 64 62 65 20 2a 76 3b 0a  se){.  Vdbe *v;.
20200 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73  .  assert( pPars
20210 65 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  e!=0 );.  assert
20220 28 20 70 50 61 72 73 65 2d 3e 64 62 21 3d 30 20  ( pParse->db!=0 
20230 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  );.  if( sqlite3
20240 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65  AuthCheck(pParse
20250 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 41 43  , SQLITE_TRANSAC
20260 54 49 4f 4e 2c 20 22 52 4f 4c 4c 42 41 43 4b 22  TION, "ROLLBACK"
20270 2c 20 30 2c 20 30 29 20 29 7b 0a 20 20 20 20 72  , 0, 0) ){.    r
20280 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 76 20 3d  eturn;.  }.  v =
20290 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
202a0 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76  pParse);.  if( v
202b0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
202c0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
202d0 41 75 74 6f 43 6f 6d 6d 69 74 2c 20 31 2c 20 31  AutoCommit, 1, 1
202e0 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
202f0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
20300 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20 70   called by the p
20310 61 72 73 65 72 20 77 68 65 6e 20 69 74 20 70 61  arser when it pa
20320 72 73 65 73 20 61 20 63 6f 6d 6d 61 6e 64 20 74  rses a command t
20330 6f 20 63 72 65 61 74 65 2c 0a 2a 2a 20 72 65 6c  o create,.** rel
20340 65 61 73 65 20 6f 72 20 72 6f 6c 6c 62 61 63 6b  ease or rollback
20350 20 61 6e 20 53 51 4c 20 73 61 76 65 70 6f 69 6e   an SQL savepoin
20360 74 2e 20 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  t. .*/.void sqli
20370 74 65 33 53 61 76 65 70 6f 69 6e 74 28 50 61 72  te3Savepoint(Par
20380 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20  se *pParse, int 
20390 6f 70 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65  op, Token *pName
203a0 29 7b 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65  ){.  char *zName
203b0 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72   = sqlite3NameFr
203c0 6f 6d 54 6f 6b 65 6e 28 70 50 61 72 73 65 2d 3e  omToken(pParse->
203d0 64 62 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 69 66  db, pName);.  if
203e0 28 20 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 56  ( zName ){.    V
203f0 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33  dbe *v = sqlite3
20400 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
20410 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
20420 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49  OMIT_AUTHORIZATI
20430 4f 4e 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f  ON.    static co
20440 6e 73 74 20 63 68 61 72 20 2a 20 63 6f 6e 73 74  nst char * const
20450 20 61 7a 5b 5d 20 3d 20 7b 20 22 42 45 47 49 4e   az[] = { "BEGIN
20460 22 2c 20 22 52 45 4c 45 41 53 45 22 2c 20 22 52  ", "RELEASE", "R
20470 4f 4c 4c 42 41 43 4b 22 20 7d 3b 0a 20 20 20 20  OLLBACK" };.    
20480 61 73 73 65 72 74 28 20 21 53 41 56 45 50 4f 49  assert( !SAVEPOI
20490 4e 54 5f 42 45 47 49 4e 20 26 26 20 53 41 56 45  NT_BEGIN && SAVE
204a0 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 3d 3d 31  POINT_RELEASE==1
204b0 20 26 26 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f   && SAVEPOINT_RO
204c0 4c 4c 42 41 43 4b 3d 3d 32 20 29 3b 0a 23 65 6e  LLBACK==2 );.#en
204d0 64 69 66 0a 20 20 20 20 69 66 28 20 21 76 20 7c  dif.    if( !v |
204e0 7c 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65  | sqlite3AuthChe
204f0 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54  ck(pParse, SQLIT
20500 45 5f 53 41 56 45 50 4f 49 4e 54 2c 20 61 7a 5b  E_SAVEPOINT, az[
20510 6f 70 5d 2c 20 7a 4e 61 6d 65 2c 20 30 29 20 29  op], zName, 0) )
20520 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  {.      sqlite3D
20530 62 46 72 65 65 28 70 50 61 72 73 65 2d 3e 64 62  bFree(pParse->db
20540 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  , zName);.      
20550 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20  return;.    }.  
20560 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
20570 4f 70 34 28 76 2c 20 4f 50 5f 53 61 76 65 70 6f  Op4(v, OP_Savepo
20580 69 6e 74 2c 20 6f 70 2c 20 30 2c 20 30 2c 20 7a  int, op, 0, 0, z
20590 4e 61 6d 65 2c 20 50 34 5f 44 59 4e 41 4d 49 43  Name, P4_DYNAMIC
205a0 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
205b0 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 54 45  Make sure the TE
205c0 4d 50 20 64 61 74 61 62 61 73 65 20 69 73 20 6f  MP database is o
205d0 70 65 6e 20 61 6e 64 20 61 76 61 69 6c 61 62 6c  pen and availabl
205e0 65 20 66 6f 72 20 75 73 65 2e 20 20 52 65 74 75  e for use.  Retu
205f0 72 6e 0a 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72  rn.** the number
20600 20 6f 66 20 65 72 72 6f 72 73 2e 20 20 4c 65 61   of errors.  Lea
20610 76 65 20 61 6e 79 20 65 72 72 6f 72 20 6d 65 73  ve any error mes
20620 73 61 67 65 73 20 69 6e 20 74 68 65 20 70 50 61  sages in the pPa
20630 72 73 65 20 73 74 72 75 63 74 75 72 65 2e 0a 2a  rse structure..*
20640 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 4f 70 65  /.int sqlite3Ope
20650 6e 54 65 6d 70 44 61 74 61 62 61 73 65 28 50 61  nTempDatabase(Pa
20660 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20  rse *pParse){.  
20670 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
20680 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20  arse->db;.  if( 
20690 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 42 74 3d 3d  db->aDb[1].pBt==
206a0 30 20 26 26 20 21 70 50 61 72 73 65 2d 3e 65 78  0 && !pParse->ex
206b0 70 6c 61 69 6e 20 29 7b 0a 20 20 20 20 69 6e 74  plain ){.    int
206c0 20 72 63 3b 0a 20 20 20 20 42 74 72 65 65 20 2a   rc;.    Btree *
206d0 70 42 74 3b 0a 20 20 20 20 73 74 61 74 69 63 20  pBt;.    static 
206e0 63 6f 6e 73 74 20 69 6e 74 20 66 6c 61 67 73 20  const int flags 
206f0 3d 20 0a 20 20 20 20 20 20 20 20 20 20 53 51 4c  = .          SQL
20700 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49  ITE_OPEN_READWRI
20710 54 45 20 7c 0a 20 20 20 20 20 20 20 20 20 20 53  TE |.          S
20720 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54  QLITE_OPEN_CREAT
20730 45 20 7c 0a 20 20 20 20 20 20 20 20 20 20 53 51  E |.          SQ
20740 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53  LITE_OPEN_EXCLUS
20750 49 56 45 20 7c 0a 20 20 20 20 20 20 20 20 20 20  IVE |.          
20760 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45  SQLITE_OPEN_DELE
20770 54 45 4f 4e 43 4c 4f 53 45 20 7c 0a 20 20 20 20  TEONCLOSE |.    
20780 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45        SQLITE_OPE
20790 4e 5f 54 45 4d 50 5f 44 42 3b 0a 0a 20 20 20 20  N_TEMP_DB;..    
207a0 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
207b0 65 4f 70 65 6e 28 64 62 2d 3e 70 56 66 73 2c 20  eOpen(db->pVfs, 
207c0 30 2c 20 64 62 2c 20 26 70 42 74 2c 20 30 2c 20  0, db, &pBt, 0, 
207d0 66 6c 61 67 73 29 3b 0a 20 20 20 20 69 66 28 20  flags);.    if( 
207e0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
207f0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
20800 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
20810 75 6e 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 61  unable to open a
20820 20 74 65 6d 70 6f 72 61 72 79 20 64 61 74 61 62   temporary datab
20830 61 73 65 20 22 0a 20 20 20 20 20 20 20 20 22 66  ase ".        "f
20840 69 6c 65 20 66 6f 72 20 73 74 6f 72 69 6e 67 20  ile for storing 
20850 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 73  temporary tables
20860 22 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65  ");.      pParse
20870 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20 20 20 20  ->rc = rc;.     
20880 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d   return 1;.    }
20890 0a 20 20 20 20 64 62 2d 3e 61 44 62 5b 31 5d 2e  .    db->aDb[1].
208a0 70 42 74 20 3d 20 70 42 74 3b 0a 20 20 20 20 61  pBt = pBt;.    a
208b0 73 73 65 72 74 28 20 64 62 2d 3e 61 44 62 5b 31  ssert( db->aDb[1
208c0 5d 2e 70 53 63 68 65 6d 61 20 29 3b 0a 20 20 20  ].pSchema );.   
208d0 20 69 66 28 20 53 51 4c 49 54 45 5f 4e 4f 4d 45   if( SQLITE_NOME
208e0 4d 3d 3d 73 71 6c 69 74 65 33 42 74 72 65 65 53  M==sqlite3BtreeS
208f0 65 74 50 61 67 65 53 69 7a 65 28 70 42 74 2c 20  etPageSize(pBt, 
20900 64 62 2d 3e 6e 65 78 74 50 61 67 65 73 69 7a 65  db->nextPagesize
20910 2c 20 2d 31 2c 20 30 29 20 29 7b 0a 20 20 20 20  , -1, 0) ){.    
20920 20 20 73 71 6c 69 74 65 33 4f 6f 6d 46 61 75 6c    sqlite3OomFaul
20930 74 28 64 62 29 3b 0a 20 20 20 20 20 20 72 65 74  t(db);.      ret
20940 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  urn 1;.    }.  }
20950 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
20960 2f 2a 0a 2a 2a 20 52 65 63 6f 72 64 20 74 68 65  /*.** Record the
20970 20 66 61 63 74 20 74 68 61 74 20 74 68 65 20 73   fact that the s
20980 63 68 65 6d 61 20 63 6f 6f 6b 69 65 20 77 69 6c  chema cookie wil
20990 6c 20 6e 65 65 64 20 74 6f 20 62 65 20 76 65 72  l need to be ver
209a0 69 66 69 65 64 0a 2a 2a 20 66 6f 72 20 64 61 74  ified.** for dat
209b0 61 62 61 73 65 20 69 44 62 2e 20 20 54 68 65 20  abase iDb.  The 
209c0 63 6f 64 65 20 74 6f 20 61 63 74 75 61 6c 6c 79  code to actually
209d0 20 76 65 72 69 66 79 20 74 68 65 20 73 63 68 65   verify the sche
209e0 6d 61 20 63 6f 6f 6b 69 65 0a 2a 2a 20 77 69 6c  ma cookie.** wil
209f0 6c 20 6f 63 63 75 72 20 61 74 20 74 68 65 20 65  l occur at the e
20a00 6e 64 20 6f 66 20 74 68 65 20 74 6f 70 2d 6c 65  nd of the top-le
20a10 76 65 6c 20 56 44 42 45 20 61 6e 64 20 77 69 6c  vel VDBE and wil
20a20 6c 20 62 65 20 67 65 6e 65 72 61 74 65 64 0a 2a  l be generated.*
20a30 2a 20 6c 61 74 65 72 2c 20 62 79 20 73 71 6c 69  * later, by sqli
20a40 74 65 33 46 69 6e 69 73 68 43 6f 64 69 6e 67 28  te3FinishCoding(
20a50 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  )..*/.void sqlit
20a60 65 33 43 6f 64 65 56 65 72 69 66 79 53 63 68 65  e3CodeVerifySche
20a70 6d 61 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ma(Parse *pParse
20a80 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20 20 50 61  , int iDb){.  Pa
20a90 72 73 65 20 2a 70 54 6f 70 6c 65 76 65 6c 20 3d  rse *pToplevel =
20aa0 20 73 71 6c 69 74 65 33 50 61 72 73 65 54 6f 70   sqlite3ParseTop
20ab0 6c 65 76 65 6c 28 70 50 61 72 73 65 29 3b 0a 20  level(pParse);. 
20ac0 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
20ad0 54 6f 70 6c 65 76 65 6c 2d 3e 64 62 3b 0a 0a 20  Toplevel->db;.. 
20ae0 20 61 73 73 65 72 74 28 20 69 44 62 3e 3d 30 20   assert( iDb>=0 
20af0 26 26 20 69 44 62 3c 64 62 2d 3e 6e 44 62 20 29  && iDb<db->nDb )
20b00 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e  ;.  assert( db->
20b10 61 44 62 5b 69 44 62 5d 2e 70 42 74 21 3d 30 20  aDb[iDb].pBt!=0 
20b20 7c 7c 20 69 44 62 3d 3d 31 20 29 3b 0a 20 20 61  || iDb==1 );.  a
20b30 73 73 65 72 74 28 20 69 44 62 3c 53 51 4c 49 54  ssert( iDb<SQLIT
20b40 45 5f 4d 41 58 5f 41 54 54 41 43 48 45 44 2b 32  E_MAX_ATTACHED+2
20b50 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
20b60 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78  lite3SchemaMutex
20b70 48 65 6c 64 28 64 62 2c 20 69 44 62 2c 20 30 29  Held(db, iDb, 0)
20b80 20 29 3b 0a 20 20 69 66 28 20 44 62 4d 61 73 6b   );.  if( DbMask
20b90 54 65 73 74 28 70 54 6f 70 6c 65 76 65 6c 2d 3e  Test(pToplevel->
20ba0 63 6f 6f 6b 69 65 4d 61 73 6b 2c 20 69 44 62 29  cookieMask, iDb)
20bb0 3d 3d 30 20 29 7b 0a 20 20 20 20 44 62 4d 61 73  ==0 ){.    DbMas
20bc0 6b 53 65 74 28 70 54 6f 70 6c 65 76 65 6c 2d 3e  kSet(pToplevel->
20bd0 63 6f 6f 6b 69 65 4d 61 73 6b 2c 20 69 44 62 29  cookieMask, iDb)
20be0 3b 0a 20 20 20 20 70 54 6f 70 6c 65 76 65 6c 2d  ;.    pToplevel-
20bf0 3e 63 6f 6f 6b 69 65 56 61 6c 75 65 5b 69 44 62  >cookieValue[iDb
20c00 5d 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d  ] = db->aDb[iDb]
20c10 2e 70 53 63 68 65 6d 61 2d 3e 73 63 68 65 6d 61  .pSchema->schema
20c20 5f 63 6f 6f 6b 69 65 3b 0a 20 20 20 20 69 66 28  _cookie;.    if(
20c30 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26 26   !OMIT_TEMPDB &&
20c40 20 69 44 62 3d 3d 31 20 29 7b 0a 20 20 20 20 20   iDb==1 ){.     
20c50 20 73 71 6c 69 74 65 33 4f 70 65 6e 54 65 6d 70   sqlite3OpenTemp
20c60 44 61 74 61 62 61 73 65 28 70 54 6f 70 6c 65 76  Database(pToplev
20c70 65 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  el);.    }.  }.}
20c80 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 61 72 67 75 6d  ../*.** If argum
20c90 65 6e 74 20 7a 44 62 20 69 73 20 4e 55 4c 4c 2c  ent zDb is NULL,
20ca0 20 74 68 65 6e 20 63 61 6c 6c 20 73 71 6c 69 74   then call sqlit
20cb0 65 33 43 6f 64 65 56 65 72 69 66 79 53 63 68 65  e3CodeVerifySche
20cc0 6d 61 28 29 20 66 6f 72 20 65 61 63 68 20 0a 2a  ma() for each .*
20cd0 2a 20 61 74 74 61 63 68 65 64 20 64 61 74 61 62  * attached datab
20ce0 61 73 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ase. Otherwise, 
20cf0 69 6e 76 6f 6b 65 20 69 74 20 66 6f 72 20 74 68  invoke it for th
20d00 65 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 64  e database named
20d10 20 7a 44 62 20 6f 6e 6c 79 2e 0a 2a 2f 0a 76 6f   zDb only..*/.vo
20d20 69 64 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65  id sqlite3CodeVe
20d30 72 69 66 79 4e 61 6d 65 64 53 63 68 65 6d 61 28  rifyNamedSchema(
20d40 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 63  Parse *pParse, c
20d50 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 29 7b  onst char *zDb){
20d60 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
20d70 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69   pParse->db;.  i
20d80 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  nt i;.  for(i=0;
20d90 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29   i<db->nDb; i++)
20da0 7b 0a 20 20 20 20 44 62 20 2a 70 44 62 20 3d 20  {.    Db *pDb = 
20db0 26 64 62 2d 3e 61 44 62 5b 69 5d 3b 0a 20 20 20  &db->aDb[i];.   
20dc0 20 69 66 28 20 70 44 62 2d 3e 70 42 74 20 26 26   if( pDb->pBt &&
20dd0 20 28 21 7a 44 62 20 7c 7c 20 30 3d 3d 73 71 6c   (!zDb || 0==sql
20de0 69 74 65 33 53 74 72 49 43 6d 70 28 7a 44 62 2c  ite3StrICmp(zDb,
20df0 20 70 44 62 2d 3e 7a 4e 61 6d 65 29 29 20 29 7b   pDb->zName)) ){
20e00 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f  .      sqlite3Co
20e10 64 65 56 65 72 69 66 79 53 63 68 65 6d 61 28 70  deVerifySchema(p
20e20 50 61 72 73 65 2c 20 69 29 3b 0a 20 20 20 20 7d  Parse, i);.    }
20e30 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  .  }.}../*.** Ge
20e40 6e 65 72 61 74 65 20 56 44 42 45 20 63 6f 64 65  nerate VDBE code
20e50 20 74 68 61 74 20 70 72 65 70 61 72 65 73 20 66   that prepares f
20e60 6f 72 20 64 6f 69 6e 67 20 61 6e 20 6f 70 65 72  or doing an oper
20e70 61 74 69 6f 6e 20 74 68 61 74 0a 2a 2a 20 6d 69  ation that.** mi
20e80 67 68 74 20 63 68 61 6e 67 65 20 74 68 65 20 64  ght change the d
20e90 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 54  atabase..**.** T
20ea0 68 69 73 20 72 6f 75 74 69 6e 65 20 73 74 61 72  his routine star
20eb0 74 73 20 61 20 6e 65 77 20 74 72 61 6e 73 61 63  ts a new transac
20ec0 74 69 6f 6e 20 69 66 20 77 65 20 61 72 65 20 6e  tion if we are n
20ed0 6f 74 20 61 6c 72 65 61 64 79 20 77 69 74 68 69  ot already withi
20ee0 6e 0a 2a 2a 20 61 20 74 72 61 6e 73 61 63 74 69  n.** a transacti
20ef0 6f 6e 2e 20 20 49 66 20 77 65 20 61 72 65 20 61  on.  If we are a
20f00 6c 72 65 61 64 79 20 77 69 74 68 69 6e 20 61 20  lready within a 
20f10 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68 65  transaction, the
20f20 6e 20 61 20 63 68 65 63 6b 70 6f 69 6e 74 0a 2a  n a checkpoint.*
20f30 2a 20 69 73 20 73 65 74 20 69 66 20 74 68 65 20  * is set if the 
20f40 73 65 74 53 74 61 74 65 6d 65 6e 74 20 70 61 72  setStatement par
20f50 61 6d 65 74 65 72 20 69 73 20 74 72 75 65 2e 20  ameter is true. 
20f60 20 41 20 63 68 65 63 6b 70 6f 69 6e 74 20 73 68   A checkpoint sh
20f70 6f 75 6c 64 0a 2a 2a 20 62 65 20 73 65 74 20 66  ould.** be set f
20f80 6f 72 20 6f 70 65 72 61 74 69 6f 6e 73 20 74 68  or operations th
20f90 61 74 20 6d 69 67 68 74 20 66 61 69 6c 20 28 64  at might fail (d
20fa0 75 65 20 74 6f 20 61 20 63 6f 6e 73 74 72 61 69  ue to a constrai
20fb0 6e 74 29 20 70 61 72 74 20 6f 66 0a 2a 2a 20 74  nt) part of.** t
20fc0 68 65 20 77 61 79 20 74 68 72 6f 75 67 68 20 61  he way through a
20fd0 6e 64 20 77 68 69 63 68 20 77 69 6c 6c 20 6e 65  nd which will ne
20fe0 65 64 20 74 6f 20 75 6e 64 6f 20 73 6f 6d 65 20  ed to undo some 
20ff0 77 72 69 74 65 73 20 77 69 74 68 6f 75 74 20 68  writes without h
21000 61 76 69 6e 67 20 74 6f 0a 2a 2a 20 72 6f 6c 6c  aving to.** roll
21010 62 61 63 6b 20 74 68 65 20 77 68 6f 6c 65 20 74  back the whole t
21020 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 46 6f 72  ransaction.  For
21030 20 6f 70 65 72 61 74 69 6f 6e 73 20 77 68 65 72   operations wher
21040 65 20 61 6c 6c 20 63 6f 6e 73 74 72 61 69 6e 74  e all constraint
21050 73 0a 2a 2a 20 63 61 6e 20 62 65 20 63 68 65 63  s.** can be chec
21060 6b 65 64 20 62 65 66 6f 72 65 20 61 6e 79 20 63  ked before any c
21070 68 61 6e 67 65 73 20 61 72 65 20 6d 61 64 65 20  hanges are made 
21080 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 2c  to the database,
21090 20 69 74 20 69 73 20 6e 65 76 65 72 0a 2a 2a 20   it is never.** 
210a0 6e 65 63 65 73 73 61 72 79 20 74 6f 20 75 6e 64  necessary to und
210b0 6f 20 61 20 77 72 69 74 65 20 61 6e 64 20 74 68  o a write and th
210c0 65 20 63 68 65 63 6b 70 6f 69 6e 74 20 73 68 6f  e checkpoint sho
210d0 75 6c 64 20 6e 6f 74 20 62 65 20 73 65 74 2e 0a  uld not be set..
210e0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42  */.void sqlite3B
210f0 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69  eginWriteOperati
21100 6f 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  on(Parse *pParse
21110 2c 20 69 6e 74 20 73 65 74 53 74 61 74 65 6d 65  , int setStateme
21120 6e 74 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20 20  nt, int iDb){.  
21130 50 61 72 73 65 20 2a 70 54 6f 70 6c 65 76 65 6c  Parse *pToplevel
21140 20 3d 20 73 71 6c 69 74 65 33 50 61 72 73 65 54   = sqlite3ParseT
21150 6f 70 6c 65 76 65 6c 28 70 50 61 72 73 65 29 3b  oplevel(pParse);
21160 0a 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65  .  sqlite3CodeVe
21170 72 69 66 79 53 63 68 65 6d 61 28 70 50 61 72 73  rifySchema(pPars
21180 65 2c 20 69 44 62 29 3b 0a 20 20 44 62 4d 61 73  e, iDb);.  DbMas
21190 6b 53 65 74 28 70 54 6f 70 6c 65 76 65 6c 2d 3e  kSet(pToplevel->
211a0 77 72 69 74 65 4d 61 73 6b 2c 20 69 44 62 29 3b  writeMask, iDb);
211b0 0a 20 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 69 73  .  pToplevel->is
211c0 4d 75 6c 74 69 57 72 69 74 65 20 7c 3d 20 73 65  MultiWrite |= se
211d0 74 53 74 61 74 65 6d 65 6e 74 3b 0a 7d 0a 0a 2f  tStatement;.}../
211e0 2a 0a 2a 2a 20 49 6e 64 69 63 61 74 65 20 74 68  *.** Indicate th
211f0 61 74 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  at the statement
21200 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72   currently under
21210 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 6d 69   construction mi
21220 67 68 74 20 77 72 69 74 65 0a 2a 2a 20 6d 6f 72  ght write.** mor
21230 65 20 74 68 61 6e 20 6f 6e 65 20 65 6e 74 72 79  e than one entry
21240 20 28 65 78 61 6d 70 6c 65 3a 20 64 65 6c 65 74   (example: delet
21250 69 6e 67 20 6f 6e 65 20 72 6f 77 20 74 68 65 6e  ing one row then
21260 20 69 6e 73 65 72 74 69 6e 67 20 61 6e 6f 74 68   inserting anoth
21270 65 72 2c 0a 2a 2a 20 69 6e 73 65 72 74 69 6e 67  er,.** inserting
21280 20 6d 75 6c 74 69 70 6c 65 20 72 6f 77 73 20 69   multiple rows i
21290 6e 20 61 20 74 61 62 6c 65 2c 20 6f 72 20 69 6e  n a table, or in
212a0 73 65 72 74 69 6e 67 20 61 20 72 6f 77 20 61 6e  serting a row an
212b0 64 20 69 6e 64 65 78 20 65 6e 74 72 69 65 73 2e  d index entries.
212c0 29 0a 2a 2a 20 49 66 20 61 6e 20 61 62 6f 72 74  ).** If an abort
212d0 20 6f 63 63 75 72 73 20 61 66 74 65 72 20 73 6f   occurs after so
212e0 6d 65 20 6f 66 20 74 68 65 73 65 20 77 72 69 74  me of these writ
212f0 65 73 20 68 61 76 65 20 63 6f 6d 70 6c 65 74 65  es have complete
21300 64 2c 20 74 68 65 6e 20 69 74 20 77 69 6c 6c 0a  d, then it will.
21310 2a 2a 20 62 65 20 6e 65 63 65 73 73 61 72 79 20  ** be necessary 
21320 74 6f 20 75 6e 64 6f 20 74 68 65 20 63 6f 6d 70  to undo the comp
21330 6c 65 74 65 64 20 77 72 69 74 65 73 2e 0a 2a 2f  leted writes..*/
21340 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 4d 75 6c  .void sqlite3Mul
21350 74 69 57 72 69 74 65 28 50 61 72 73 65 20 2a 70  tiWrite(Parse *p
21360 50 61 72 73 65 29 7b 0a 20 20 50 61 72 73 65 20  Parse){.  Parse 
21370 2a 70 54 6f 70 6c 65 76 65 6c 20 3d 20 73 71 6c  *pToplevel = sql
21380 69 74 65 33 50 61 72 73 65 54 6f 70 6c 65 76 65  ite3ParseTopleve
21390 6c 28 70 50 61 72 73 65 29 3b 0a 20 20 70 54 6f  l(pParse);.  pTo
213a0 70 6c 65 76 65 6c 2d 3e 69 73 4d 75 6c 74 69 57  plevel->isMultiW
213b0 72 69 74 65 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a 20  rite = 1;.}../* 
213c0 0a 2a 2a 20 54 68 65 20 63 6f 64 65 20 67 65 6e  .** The code gen
213d0 65 72 61 74 6f 72 20 63 61 6c 6c 73 20 74 68 69  erator calls thi
213e0 73 20 72 6f 75 74 69 6e 65 20 69 66 20 69 73 20  s routine if is 
213f0 64 69 73 63 6f 76 65 72 73 20 74 68 61 74 20 69  discovers that i
21400 74 20 69 73 0a 2a 2a 20 70 6f 73 73 69 62 6c 65  t is.** possible
21410 20 74 6f 20 61 62 6f 72 74 20 61 20 73 74 61 74   to abort a stat
21420 65 6d 65 6e 74 20 70 72 69 6f 72 20 74 6f 20 63  ement prior to c
21430 6f 6d 70 6c 65 74 69 6f 6e 2e 20 20 49 6e 20 6f  ompletion.  In o
21440 72 64 65 72 20 74 6f 20 0a 2a 2a 20 70 65 72 66  rder to .** perf
21450 6f 72 6d 20 74 68 69 73 20 61 62 6f 72 74 20 77  orm this abort w
21460 69 74 68 6f 75 74 20 63 6f 72 72 75 70 74 69 6e  ithout corruptin
21470 67 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 20  g the database, 
21480 77 65 20 6e 65 65 64 20 74 6f 20 6d 61 6b 65 0a  we need to make.
21490 2a 2a 20 73 75 72 65 20 74 68 61 74 20 74 68 65  ** sure that the
214a0 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 70 72   statement is pr
214b0 6f 74 65 63 74 65 64 20 62 79 20 61 20 73 74 61  otected by a sta
214c0 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69  tement transacti
214d0 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 65 63 68 6e 69  on..**.** Techni
214e0 63 61 6c 6c 79 2c 20 77 65 20 6f 6e 6c 79 20 6e  cally, we only n
214f0 65 65 64 20 74 6f 20 73 65 74 20 74 68 65 20 6d  eed to set the m
21500 61 79 41 62 6f 72 74 20 66 6c 61 67 20 69 66 20  ayAbort flag if 
21510 74 68 65 0a 2a 2a 20 69 73 4d 75 6c 74 69 57 72  the.** isMultiWr
21520 69 74 65 20 66 6c 61 67 20 77 61 73 20 70 72 65  ite flag was pre
21530 76 69 6f 75 73 6c 79 20 73 65 74 2e 20 20 54 68  viously set.  Th
21540 65 72 65 20 69 73 20 61 20 74 69 6d 65 20 64 65  ere is a time de
21550 70 65 6e 64 65 6e 63 79 0a 2a 2a 20 73 75 63 68  pendency.** such
21560 20 74 68 61 74 20 74 68 65 20 61 62 6f 72 74 20   that the abort 
21570 6d 75 73 74 20 6f 63 63 75 72 20 61 66 74 65 72  must occur after
21580 20 74 68 65 20 6d 75 6c 74 69 77 72 69 74 65 2e   the multiwrite.
21590 20 20 54 68 69 73 20 6d 61 6b 65 73 0a 2a 2a 20    This makes.** 
215a0 73 6f 6d 65 20 73 74 61 74 65 6d 65 6e 74 73 20  some statements 
215b0 69 6e 76 6f 6c 76 69 6e 67 20 74 68 65 20 52 45  involving the RE
215c0 50 4c 41 43 45 20 63 6f 6e 66 6c 69 63 74 20 72  PLACE conflict r
215d0 65 73 6f 6c 75 74 69 6f 6e 20 61 6c 67 6f 72 69  esolution algori
215e0 74 68 6d 0a 2a 2a 20 67 6f 20 61 20 6c 69 74 74  thm.** go a litt
215f0 6c 65 20 66 61 73 74 65 72 2e 20 20 42 75 74 20  le faster.  But 
21600 74 61 6b 69 6e 67 20 61 64 76 61 6e 74 61 67 65  taking advantage
21610 20 6f 66 20 74 68 69 73 20 74 69 6d 65 20 64 65   of this time de
21620 70 65 6e 64 65 6e 63 79 0a 2a 2a 20 6d 61 6b 65  pendency.** make
21630 73 20 69 74 20 6d 6f 72 65 20 64 69 66 66 69 63  s it more diffic
21640 75 6c 74 20 74 6f 20 70 72 6f 76 65 20 74 68 61  ult to prove tha
21650 74 20 74 68 65 20 63 6f 64 65 20 69 73 20 63 6f  t the code is co
21660 72 72 65 63 74 20 28 69 6e 20 0a 2a 2a 20 70 61  rrect (in .** pa
21670 72 74 69 63 75 6c 61 72 2c 20 69 74 20 70 72 65  rticular, it pre
21680 76 65 6e 74 73 20 75 73 20 66 72 6f 6d 20 77 72  vents us from wr
21690 69 74 69 6e 67 20 61 6e 20 65 66 66 65 63 74 69  iting an effecti
216a0 76 65 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 61  ve.** implementa
216b0 74 69 6f 6e 20 6f 66 20 73 71 6c 69 74 65 33 41  tion of sqlite3A
216c0 73 73 65 72 74 4d 61 79 41 62 6f 72 74 28 29 29  ssertMayAbort())
216d0 20 61 6e 64 20 73 6f 20 77 65 20 68 61 76 65 20   and so we have 
216e0 63 68 6f 73 65 6e 0a 2a 2a 20 74 6f 20 74 61 6b  chosen.** to tak
216f0 65 20 74 68 65 20 73 61 66 65 20 72 6f 75 74 65  e the safe route
21700 20 61 6e 64 20 73 6b 69 70 20 74 68 65 20 6f 70   and skip the op
21710 74 69 6d 69 7a 61 74 69 6f 6e 2e 0a 2a 2f 0a 76  timization..*/.v
21720 6f 69 64 20 73 71 6c 69 74 65 33 4d 61 79 41 62  oid sqlite3MayAb
21730 6f 72 74 28 50 61 72 73 65 20 2a 70 50 61 72 73  ort(Parse *pPars
21740 65 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 54 6f  e){.  Parse *pTo
21750 70 6c 65 76 65 6c 20 3d 20 73 71 6c 69 74 65 33  plevel = sqlite3
21760 50 61 72 73 65 54 6f 70 6c 65 76 65 6c 28 70 50  ParseToplevel(pP
21770 61 72 73 65 29 3b 0a 20 20 70 54 6f 70 6c 65 76  arse);.  pToplev
21780 65 6c 2d 3e 6d 61 79 41 62 6f 72 74 20 3d 20 31  el->mayAbort = 1
21790 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20  ;.}../*.** Code 
217a0 61 6e 20 4f 50 5f 48 61 6c 74 20 74 68 61 74 20  an OP_Halt that 
217b0 63 61 75 73 65 73 20 74 68 65 20 76 64 62 65 20  causes the vdbe 
217c0 74 6f 20 72 65 74 75 72 6e 20 61 6e 20 53 51 4c  to return an SQL
217d0 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 0a 2a  ITE_CONSTRAINT.*
217e0 2a 20 65 72 72 6f 72 2e 20 54 68 65 20 6f 6e 45  * error. The onE
217f0 72 72 6f 72 20 70 61 72 61 6d 65 74 65 72 20 64  rror parameter d
21800 65 74 65 72 6d 69 6e 65 73 20 77 68 69 63 68 20  etermines which 
21810 28 69 66 20 61 6e 79 29 20 6f 66 20 74 68 65 20  (if any) of the 
21820 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 61 6e 64  statement.** and
21830 2f 6f 72 20 63 75 72 72 65 6e 74 20 74 72 61 6e  /or current tran
21840 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65  saction is rolle
21850 64 20 62 61 63 6b 2e 0a 2a 2f 0a 76 6f 69 64 20  d back..*/.void 
21860 73 71 6c 69 74 65 33 48 61 6c 74 43 6f 6e 73 74  sqlite3HaltConst
21870 72 61 69 6e 74 28 0a 20 20 50 61 72 73 65 20 2a  raint(.  Parse *
21880 70 50 61 72 73 65 2c 20 20 20 20 2f 2a 20 50 61  pParse,    /* Pa
21890 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
218a0 0a 20 20 69 6e 74 20 65 72 72 43 6f 64 65 2c 20  .  int errCode, 
218b0 20 20 20 20 20 2f 2a 20 65 78 74 65 6e 64 65 64       /* extended
218c0 20 65 72 72 6f 72 20 63 6f 64 65 20 2a 2f 0a 20   error code */. 
218d0 20 69 6e 74 20 6f 6e 45 72 72 6f 72 2c 20 20 20   int onError,   
218e0 20 20 20 2f 2a 20 43 6f 6e 73 74 72 61 69 6e 74     /* Constraint
218f0 20 74 79 70 65 20 2a 2f 0a 20 20 63 68 61 72 20   type */.  char 
21900 2a 70 34 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  *p4,         /* 
21910 45 72 72 6f 72 20 6d 65 73 73 61 67 65 20 2a 2f  Error message */
21920 0a 20 20 69 38 20 70 34 74 79 70 65 2c 20 20 20  .  i8 p4type,   
21930 20 20 20 20 20 2f 2a 20 50 34 5f 53 54 41 54 49       /* P4_STATI
21940 43 20 6f 72 20 50 34 5f 54 52 41 4e 53 49 45 4e  C or P4_TRANSIEN
21950 54 20 2a 2f 0a 20 20 75 38 20 70 35 45 72 72 6d  T */.  u8 p5Errm
21960 73 67 20 20 20 20 20 20 20 2f 2a 20 50 35 5f 45  sg       /* P5_E
21970 72 72 4d 73 67 20 74 79 70 65 20 2a 2f 0a 29 7b  rrMsg type */.){
21980 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c  .  Vdbe *v = sql
21990 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
219a0 73 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28  se);.  assert( (
219b0 65 72 72 43 6f 64 65 26 30 78 66 66 29 3d 3d 53  errCode&0xff)==S
219c0 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
219d0 20 29 3b 0a 20 20 69 66 28 20 6f 6e 45 72 72 6f   );.  if( onErro
219e0 72 3d 3d 4f 45 5f 41 62 6f 72 74 20 29 7b 0a 20  r==OE_Abort ){. 
219f0 20 20 20 73 71 6c 69 74 65 33 4d 61 79 41 62 6f     sqlite3MayAbo
21a00 72 74 28 70 50 61 72 73 65 29 3b 0a 20 20 7d 0a  rt(pParse);.  }.
21a10 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
21a20 4f 70 34 28 76 2c 20 4f 50 5f 48 61 6c 74 2c 20  Op4(v, OP_Halt, 
21a30 65 72 72 43 6f 64 65 2c 20 6f 6e 45 72 72 6f 72  errCode, onError
21a40 2c 20 30 2c 20 70 34 2c 20 70 34 74 79 70 65 29  , 0, p4, p4type)
21a50 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 43  ;.  sqlite3VdbeC
21a60 68 61 6e 67 65 50 35 28 76 2c 20 70 35 45 72 72  hangeP5(v, p5Err
21a70 6d 73 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  msg);.}../*.** C
21a80 6f 64 65 20 61 6e 20 4f 50 5f 48 61 6c 74 20 64  ode an OP_Halt d
21a90 75 65 20 74 6f 20 55 4e 49 51 55 45 20 6f 72 20  ue to UNIQUE or 
21aa0 50 52 49 4d 41 52 59 20 4b 45 59 20 63 6f 6e 73  PRIMARY KEY cons
21ab0 74 72 61 69 6e 74 20 76 69 6f 6c 61 74 69 6f 6e  traint violation
21ac0 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
21ad0 33 55 6e 69 71 75 65 43 6f 6e 73 74 72 61 69 6e  3UniqueConstrain
21ae0 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  t(.  Parse *pPar
21af0 73 65 2c 20 20 20 20 2f 2a 20 50 61 72 73 69 6e  se,    /* Parsin
21b00 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69  g context */.  i
21b10 6e 74 20 6f 6e 45 72 72 6f 72 2c 20 20 20 20 20  nt onError,     
21b20 20 2f 2a 20 43 6f 6e 73 74 72 61 69 6e 74 20 74   /* Constraint t
21b30 79 70 65 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a  ype */.  Index *
21b40 70 49 64 78 20 20 20 20 20 20 20 2f 2a 20 54 68  pIdx       /* Th
21b50 65 20 69 6e 64 65 78 20 74 68 61 74 20 74 72 69  e index that tri
21b60 67 67 65 72 73 20 74 68 65 20 63 6f 6e 73 74 72  ggers the constr
21b70 61 69 6e 74 20 2a 2f 0a 29 7b 0a 20 20 63 68 61  aint */.){.  cha
21b80 72 20 2a 7a 45 72 72 3b 0a 20 20 69 6e 74 20 6a  r *zErr;.  int j
21b90 3b 0a 20 20 53 74 72 41 63 63 75 6d 20 65 72 72  ;.  StrAccum err
21ba0 4d 73 67 3b 0a 20 20 54 61 62 6c 65 20 2a 70 54  Msg;.  Table *pT
21bb0 61 62 20 3d 20 70 49 64 78 2d 3e 70 54 61 62 6c  ab = pIdx->pTabl
21bc0 65 3b 0a 0a 20 20 73 71 6c 69 74 65 33 53 74 72  e;..  sqlite3Str
21bd0 41 63 63 75 6d 49 6e 69 74 28 26 65 72 72 4d 73  AccumInit(&errMs
21be0 67 2c 20 70 50 61 72 73 65 2d 3e 64 62 2c 20 30  g, pParse->db, 0
21bf0 2c 20 30 2c 20 32 30 30 29 3b 0a 20 20 69 66 28  , 0, 200);.  if(
21c00 20 70 49 64 78 2d 3e 61 43 6f 6c 45 78 70 72 20   pIdx->aColExpr 
21c10 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 58 50  ){.    sqlite3XP
21c20 72 69 6e 74 66 28 26 65 72 72 4d 73 67 2c 20 22  rintf(&errMsg, "
21c30 69 6e 64 65 78 20 27 25 71 27 22 2c 20 70 49 64  index '%q'", pId
21c40 78 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 7d 65 6c  x->zName);.  }el
21c50 73 65 7b 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b  se{.    for(j=0;
21c60 20 6a 3c 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c   j<pIdx->nKeyCol
21c70 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 63 68  ; j++){.      ch
21c80 61 72 20 2a 7a 43 6f 6c 3b 0a 20 20 20 20 20 20  ar *zCol;.      
21c90 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e 61 69  assert( pIdx->ai
21ca0 43 6f 6c 75 6d 6e 5b 6a 5d 3e 3d 30 20 29 3b 0a  Column[j]>=0 );.
21cb0 20 20 20 20 20 20 7a 43 6f 6c 20 3d 20 70 54 61        zCol = pTa
21cc0 62 2d 3e 61 43 6f 6c 5b 70 49 64 78 2d 3e 61 69  b->aCol[pIdx->ai
21cd0 43 6f 6c 75 6d 6e 5b 6a 5d 5d 2e 7a 4e 61 6d 65  Column[j]].zName
21ce0 3b 0a 20 20 20 20 20 20 69 66 28 20 6a 20 29 20  ;.      if( j ) 
21cf0 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d 41  sqlite3StrAccumA
21d00 70 70 65 6e 64 28 26 65 72 72 4d 73 67 2c 20 22  ppend(&errMsg, "
21d10 2c 20 22 2c 20 32 29 3b 0a 20 20 20 20 20 20 73  , ", 2);.      s
21d20 71 6c 69 74 65 33 58 50 72 69 6e 74 66 28 26 65  qlite3XPrintf(&e
21d30 72 72 4d 73 67 2c 20 22 25 73 2e 25 73 22 2c 20  rrMsg, "%s.%s", 
21d40 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 43 6f  pTab->zName, zCo
21d50 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  l);.    }.  }.  
21d60 7a 45 72 72 20 3d 20 73 71 6c 69 74 65 33 53 74  zErr = sqlite3St
21d70 72 41 63 63 75 6d 46 69 6e 69 73 68 28 26 65 72  rAccumFinish(&er
21d80 72 4d 73 67 29 3b 0a 20 20 73 71 6c 69 74 65 33  rMsg);.  sqlite3
21d90 48 61 6c 74 43 6f 6e 73 74 72 61 69 6e 74 28 70  HaltConstraint(p
21da0 50 61 72 73 65 2c 20 0a 20 20 20 20 49 73 50 72  Parse, .    IsPr
21db0 69 6d 61 72 79 4b 65 79 49 6e 64 65 78 28 70 49  imaryKeyIndex(pI
21dc0 64 78 29 20 3f 20 53 51 4c 49 54 45 5f 43 4f 4e  dx) ? SQLITE_CON
21dd0 53 54 52 41 49 4e 54 5f 50 52 49 4d 41 52 59 4b  STRAINT_PRIMARYK
21de0 45 59 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  EY .            
21df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21e00 3a 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41  : SQLITE_CONSTRA
21e10 49 4e 54 5f 55 4e 49 51 55 45 2c 0a 20 20 20 20  INT_UNIQUE,.    
21e20 6f 6e 45 72 72 6f 72 2c 20 7a 45 72 72 2c 20 50  onError, zErr, P
21e30 34 5f 44 59 4e 41 4d 49 43 2c 20 50 35 5f 43 6f  4_DYNAMIC, P5_Co
21e40 6e 73 74 72 61 69 6e 74 55 6e 69 71 75 65 29 3b  nstraintUnique);
21e50 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20  .}.../*.** Code 
21e60 61 6e 20 4f 50 5f 48 61 6c 74 20 64 75 65 20 74  an OP_Halt due t
21e70 6f 20 6e 6f 6e 2d 75 6e 69 71 75 65 20 72 6f 77  o non-unique row
21e80 69 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  id..*/.void sqli
21e90 74 65 33 52 6f 77 69 64 43 6f 6e 73 74 72 61 69  te3RowidConstrai
21ea0 6e 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  nt(.  Parse *pPa
21eb0 72 73 65 2c 20 20 20 20 2f 2a 20 50 61 72 73 69  rse,    /* Parsi
21ec0 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
21ed0 69 6e 74 20 6f 6e 45 72 72 6f 72 2c 20 20 20 20  int onError,    
21ee0 20 20 2f 2a 20 43 6f 6e 66 6c 69 63 74 20 72 65    /* Conflict re
21ef0 73 6f 6c 75 74 69 6f 6e 20 61 6c 67 6f 72 69 74  solution algorit
21f00 68 6d 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70  hm */.  Table *p
21f10 54 61 62 20 20 20 20 20 20 20 2f 2a 20 54 68 65  Tab       /* The
21f20 20 74 61 62 6c 65 20 77 69 74 68 20 74 68 65 20   table with the 
21f30 6e 6f 6e 2d 75 6e 69 71 75 65 20 72 6f 77 69 64  non-unique rowid
21f40 20 2a 2f 20 0a 29 7b 0a 20 20 63 68 61 72 20 2a   */ .){.  char *
21f50 7a 4d 73 67 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  zMsg;.  int rc;.
21f60 20 20 69 66 28 20 70 54 61 62 2d 3e 69 50 4b 65    if( pTab->iPKe
21f70 79 3e 3d 30 20 29 7b 0a 20 20 20 20 7a 4d 73 67  y>=0 ){.    zMsg
21f80 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74   = sqlite3MPrint
21f90 66 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 22 25  f(pParse->db, "%
21fa0 73 2e 25 73 22 2c 20 70 54 61 62 2d 3e 7a 4e 61  s.%s", pTab->zNa
21fb0 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  me,.            
21fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 54                pT
21fd0 61 62 2d 3e 61 43 6f 6c 5b 70 54 61 62 2d 3e 69  ab->aCol[pTab->i
21fe0 50 4b 65 79 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20  PKey].zName);.  
21ff0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f    rc = SQLITE_CO
22000 4e 53 54 52 41 49 4e 54 5f 50 52 49 4d 41 52 59  NSTRAINT_PRIMARY
22010 4b 45 59 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  KEY;.  }else{.  
22020 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33    zMsg = sqlite3
22030 4d 50 72 69 6e 74 66 28 70 50 61 72 73 65 2d 3e  MPrintf(pParse->
22040 64 62 2c 20 22 25 73 2e 72 6f 77 69 64 22 2c 20  db, "%s.rowid", 
22050 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pTab->zName);.  
22060 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f    rc = SQLITE_CO
22070 4e 53 54 52 41 49 4e 54 5f 52 4f 57 49 44 3b 0a  NSTRAINT_ROWID;.
22080 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 48 61 6c    }.  sqlite3Hal
22090 74 43 6f 6e 73 74 72 61 69 6e 74 28 70 50 61 72  tConstraint(pPar
220a0 73 65 2c 20 72 63 2c 20 6f 6e 45 72 72 6f 72 2c  se, rc, onError,
220b0 20 7a 4d 73 67 2c 20 50 34 5f 44 59 4e 41 4d 49   zMsg, P4_DYNAMI
220c0 43 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  C,.             
220d0 20 20 20 20 20 20 20 20 20 20 20 50 35 5f 43 6f             P5_Co
220e0 6e 73 74 72 61 69 6e 74 55 6e 69 71 75 65 29 3b  nstraintUnique);
220f0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20  .}../*.** Check 
22100 74 6f 20 73 65 65 20 69 66 20 70 49 6e 64 65 78  to see if pIndex
22110 20 75 73 65 73 20 74 68 65 20 63 6f 6c 6c 61 74   uses the collat
22120 69 6e 67 20 73 65 71 75 65 6e 63 65 20 70 43 6f  ing sequence pCo
22130 6c 6c 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20 74  ll.  Return.** t
22140 72 75 65 20 69 66 20 69 74 20 64 6f 65 73 20 61  rue if it does a
22150 6e 64 20 66 61 6c 73 65 20 69 66 20 69 74 20 64  nd false if it d
22160 6f 65 73 20 6e 6f 74 2e 0a 2a 2f 0a 23 69 66 6e  oes not..*/.#ifn
22170 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
22180 52 45 49 4e 44 45 58 0a 73 74 61 74 69 63 20 69  REINDEX.static i
22190 6e 74 20 63 6f 6c 6c 61 74 69 6f 6e 4d 61 74 63  nt collationMatc
221a0 68 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43  h(const char *zC
221b0 6f 6c 6c 2c 20 49 6e 64 65 78 20 2a 70 49 6e 64  oll, Index *pInd
221c0 65 78 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  ex){.  int i;.  
221d0 61 73 73 65 72 74 28 20 7a 43 6f 6c 6c 21 3d 30  assert( zColl!=0
221e0 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   );.  for(i=0; i
221f0 3c 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e  <pIndex->nColumn
22200 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 6f 6e 73  ; i++){.    cons
22210 74 20 63 68 61 72 20 2a 7a 20 3d 20 70 49 6e 64  t char *z = pInd
22220 65 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 3b 0a 20  ex->azColl[i];. 
22230 20 20 20 61 73 73 65 72 74 28 20 7a 21 3d 30 20     assert( z!=0 
22240 7c 7c 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c  || pIndex->aiCol
22250 75 6d 6e 5b 69 5d 3c 30 20 29 3b 0a 20 20 20 20  umn[i]<0 );.    
22260 69 66 28 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f  if( pIndex->aiCo
22270 6c 75 6d 6e 5b 69 5d 3e 3d 30 20 26 26 20 30 3d  lumn[i]>=0 && 0=
22280 3d 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28  =sqlite3StrICmp(
22290 7a 2c 20 7a 43 6f 6c 6c 29 20 29 7b 0a 20 20 20  z, zColl) ){.   
222a0 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
222b0 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
222c0 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  0;.}.#endif../*.
222d0 2a 2a 20 52 65 63 6f 6d 70 75 74 65 20 61 6c 6c  ** Recompute all
222e0 20 69 6e 64 69 63 65 73 20 6f 66 20 70 54 61 62   indices of pTab
222f0 20 74 68 61 74 20 75 73 65 20 74 68 65 20 63 6f   that use the co
22300 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
22310 20 70 43 6f 6c 6c 2e 0a 2a 2a 20 49 66 20 70 43   pColl..** If pC
22320 6f 6c 6c 3d 3d 30 20 74 68 65 6e 20 72 65 63 6f  oll==0 then reco
22330 6d 70 75 74 65 20 61 6c 6c 20 69 6e 64 69 63 65  mpute all indice
22340 73 20 6f 66 20 70 54 61 62 2e 0a 2a 2f 0a 23 69  s of pTab..*/.#i
22350 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
22360 54 5f 52 45 49 4e 44 45 58 0a 73 74 61 74 69 63  T_REINDEX.static
22370 20 76 6f 69 64 20 72 65 69 6e 64 65 78 54 61 62   void reindexTab
22380 6c 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  le(Parse *pParse
22390 2c 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 63  , Table *pTab, c
223a0 68 61 72 20 63 6f 6e 73 74 20 2a 7a 43 6f 6c 6c  har const *zColl
223b0 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64  ){.  Index *pInd
223c0 65 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ex;             
223d0 20 2f 2a 20 41 6e 20 69 6e 64 65 78 20 61 73 73   /* An index ass
223e0 6f 63 69 61 74 65 64 20 77 69 74 68 20 70 54 61  ociated with pTa
223f0 62 20 2a 2f 0a 0a 20 20 66 6f 72 28 70 49 6e 64  b */..  for(pInd
22400 65 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b  ex=pTab->pIndex;
22410 20 70 49 6e 64 65 78 3b 20 70 49 6e 64 65 78 3d   pIndex; pIndex=
22420 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74 29 7b 0a  pIndex->pNext){.
22430 20 20 20 20 69 66 28 20 7a 43 6f 6c 6c 3d 3d 30      if( zColl==0
22440 20 7c 7c 20 63 6f 6c 6c 61 74 69 6f 6e 4d 61 74   || collationMat
22450 63 68 28 7a 43 6f 6c 6c 2c 20 70 49 6e 64 65 78  ch(zColl, pIndex
22460 29 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  ) ){.      int i
22470 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65  Db = sqlite3Sche
22480 6d 61 54 6f 49 6e 64 65 78 28 70 50 61 72 73 65  maToIndex(pParse
22490 2d 3e 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68  ->db, pTab->pSch
224a0 65 6d 61 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ema);.      sqli
224b0 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65  te3BeginWriteOpe
224c0 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 30  ration(pParse, 0
224d0 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20 73 71  , iDb);.      sq
224e0 6c 69 74 65 33 52 65 66 69 6c 6c 49 6e 64 65 78  lite3RefillIndex
224f0 28 70 50 61 72 73 65 2c 20 70 49 6e 64 65 78 2c  (pParse, pIndex,
22500 20 2d 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   -1);.    }.  }.
22510 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
22520 52 65 63 6f 6d 70 75 74 65 20 61 6c 6c 20 69 6e  Recompute all in
22530 64 69 63 65 73 20 6f 66 20 61 6c 6c 20 74 61 62  dices of all tab
22540 6c 65 73 20 69 6e 20 61 6c 6c 20 64 61 74 61 62  les in all datab
22550 61 73 65 73 20 77 68 65 72 65 20 74 68 65 0a 2a  ases where the.*
22560 2a 20 69 6e 64 69 63 65 73 20 75 73 65 20 74 68  * indices use th
22570 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  e collating sequ
22580 65 6e 63 65 20 70 43 6f 6c 6c 2e 20 20 49 66 20  ence pColl.  If 
22590 70 43 6f 6c 6c 3d 3d 30 20 74 68 65 6e 20 72 65  pColl==0 then re
225a0 63 6f 6d 70 75 74 65 0a 2a 2a 20 61 6c 6c 20 69  compute.** all i
225b0 6e 64 69 63 65 73 20 65 76 65 72 79 77 68 65 72  ndices everywher
225c0 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  e..*/.#ifndef SQ
225d0 4c 49 54 45 5f 4f 4d 49 54 5f 52 45 49 4e 44 45  LITE_OMIT_REINDE
225e0 58 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65  X.static void re
225f0 69 6e 64 65 78 44 61 74 61 62 61 73 65 73 28 50  indexDatabases(P
22600 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 63 68  arse *pParse, ch
22610 61 72 20 63 6f 6e 73 74 20 2a 7a 43 6f 6c 6c 29  ar const *zColl)
22620 7b 0a 20 20 44 62 20 2a 70 44 62 3b 20 20 20 20  {.  Db *pDb;    
22630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22640 2f 2a 20 41 20 73 69 6e 67 6c 65 20 64 61 74 61  /* A single data
22650 62 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69 44  base */.  int iD
22660 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
22670 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74        /* The dat
22680 61 62 61 73 65 20 69 6e 64 65 78 20 6e 75 6d 62  abase index numb
22690 65 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  er */.  sqlite3 
226a0 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
226b0 3b 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62  ;   /* The datab
226c0 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a  ase connection *
226d0 2f 0a 20 20 48 61 73 68 45 6c 65 6d 20 2a 6b 3b  /.  HashElem *k;
226e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
226f0 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f  /* For looping o
22700 76 65 72 20 74 61 62 6c 65 73 20 69 6e 20 70 44  ver tables in pD
22710 62 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54  b */.  Table *pT
22720 61 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ab;             
22730 20 20 20 2f 2a 20 41 20 74 61 62 6c 65 20 69 6e     /* A table in
22740 20 74 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f   the database */
22750 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
22760 74 65 33 42 74 72 65 65 48 6f 6c 64 73 41 6c 6c  te3BtreeHoldsAll
22770 4d 75 74 65 78 65 73 28 64 62 29 20 29 3b 20 20  Mutexes(db) );  
22780 2f 2a 20 4e 65 65 64 65 64 20 66 6f 72 20 73 63  /* Needed for sc
22790 68 65 6d 61 20 61 63 63 65 73 73 20 2a 2f 0a 20  hema access */. 
227a0 20 66 6f 72 28 69 44 62 3d 30 2c 20 70 44 62 3d   for(iDb=0, pDb=
227b0 64 62 2d 3e 61 44 62 3b 20 69 44 62 3c 64 62 2d  db->aDb; iDb<db-
227c0 3e 6e 44 62 3b 20 69 44 62 2b 2b 2c 20 70 44 62  >nDb; iDb++, pDb
227d0 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  ++){.    assert(
227e0 20 70 44 62 21 3d 30 20 29 3b 0a 20 20 20 20 66   pDb!=0 );.    f
227f0 6f 72 28 6b 3d 73 71 6c 69 74 65 48 61 73 68 46  or(k=sqliteHashF
22800 69 72 73 74 28 26 70 44 62 2d 3e 70 53 63 68 65  irst(&pDb->pSche
22810 6d 61 2d 3e 74 62 6c 48 61 73 68 29 3b 20 20 6b  ma->tblHash);  k
22820 3b 20 6b 3d 73 71 6c 69 74 65 48 61 73 68 4e 65  ; k=sqliteHashNe
22830 78 74 28 6b 29 29 7b 0a 20 20 20 20 20 20 70 54  xt(k)){.      pT
22840 61 62 20 3d 20 28 54 61 62 6c 65 2a 29 73 71 6c  ab = (Table*)sql
22850 69 74 65 48 61 73 68 44 61 74 61 28 6b 29 3b 0a  iteHashData(k);.
22860 20 20 20 20 20 20 72 65 69 6e 64 65 78 54 61 62        reindexTab
22870 6c 65 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c  le(pParse, pTab,
22880 20 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20 7d 0a 20   zColl);.    }. 
22890 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a   }.}.#endif../*.
228a0 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
228b0 20 66 6f 72 20 74 68 65 20 52 45 49 4e 44 45 58   for the REINDEX
228c0 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20   command..**.** 
228d0 20 20 20 20 20 20 20 52 45 49 4e 44 45 58 20 20         REINDEX  
228e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
228f0 20 20 20 20 20 20 20 20 20 20 2d 2d 20 31 0a 2a            -- 1.*
22900 2a 20 20 20 20 20 20 20 20 52 45 49 4e 44 45 58  *        REINDEX
22910 20 20 3c 63 6f 6c 6c 61 74 69 6f 6e 3e 20 20 20    <collation>   
22920 20 20 20 20 20 20 20 20 20 20 20 20 2d 2d 20 32              -- 2
22930 0a 2a 2a 20 20 20 20 20 20 20 20 52 45 49 4e 44  .**        REIND
22940 45 58 20 20 3f 3c 64 61 74 61 62 61 73 65 3e 2e  EX  ?<database>.
22950 3f 3c 74 61 62 6c 65 6e 61 6d 65 3e 20 20 2d 2d  ?<tablename>  --
22960 20 33 0a 2a 2a 20 20 20 20 20 20 20 20 52 45 49   3.**        REI
22970 4e 44 45 58 20 20 3f 3c 64 61 74 61 62 61 73 65  NDEX  ?<database
22980 3e 2e 3f 3c 69 6e 64 65 78 6e 61 6d 65 3e 20 20  >.?<indexname>  
22990 2d 2d 20 34 0a 2a 2a 0a 2a 2a 20 46 6f 72 6d 20  -- 4.**.** Form 
229a0 31 20 63 61 75 73 65 73 20 61 6c 6c 20 69 6e 64  1 causes all ind
229b0 69 63 65 73 20 69 6e 20 61 6c 6c 20 61 74 74 61  ices in all atta
229c0 63 68 65 64 20 64 61 74 61 62 61 73 65 73 20 74  ched databases t
229d0 6f 20 62 65 20 72 65 62 75 69 6c 74 2e 0a 2a 2a  o be rebuilt..**
229e0 20 46 6f 72 6d 20 32 20 72 65 62 75 69 6c 64 73   Form 2 rebuilds
229f0 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 69 6e 20   all indices in 
22a00 61 6c 6c 20 64 61 74 61 62 61 73 65 73 20 74 68  all databases th
22a10 61 74 20 75 73 65 20 74 68 65 20 6e 61 6d 65 64  at use the named
22a20 0a 2a 2a 20 63 6f 6c 6c 61 74 69 6e 67 20 66 75  .** collating fu
22a30 6e 63 74 69 6f 6e 2e 20 20 46 6f 72 6d 73 20 33  nction.  Forms 3
22a40 20 61 6e 64 20 34 20 72 65 62 75 69 6c 64 20 74   and 4 rebuild t
22a50 68 65 20 6e 61 6d 65 64 20 69 6e 64 65 78 20 6f  he named index o
22a60 72 20 61 6c 6c 0a 2a 2a 20 69 6e 64 69 63 65 73  r all.** indices
22a70 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
22a80 20 74 68 65 20 6e 61 6d 65 64 20 74 61 62 6c 65   the named table
22a90 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
22aa0 49 54 45 5f 4f 4d 49 54 5f 52 45 49 4e 44 45 58  ITE_OMIT_REINDEX
22ab0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52 65 69  .void sqlite3Rei
22ac0 6e 64 65 78 28 50 61 72 73 65 20 2a 70 50 61 72  ndex(Parse *pPar
22ad0 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65  se, Token *pName
22ae0 31 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32  1, Token *pName2
22af0 29 7b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43  ){.  CollSeq *pC
22b00 6f 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  oll;            
22b10 20 2f 2a 20 43 6f 6c 6c 61 74 69 6e 67 20 73 65   /* Collating se
22b20 71 75 65 6e 63 65 20 74 6f 20 62 65 20 72 65 69  quence to be rei
22b30 6e 64 65 78 65 64 2c 20 6f 72 20 4e 55 4c 4c 20  ndexed, or NULL 
22b40 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 3b 20 20 20  */.  char *z;   
22b50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22b60 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 61 20 74 61   /* Name of a ta
22b70 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 2a 2f 0a  ble or index */.
22b80 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44    const char *zD
22b90 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  b;            /*
22ba0 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74   Name of the dat
22bb0 61 62 61 73 65 20 2a 2f 0a 20 20 54 61 62 6c 65  abase */.  Table
22bc0 20 2a 70 54 61 62 3b 20 20 20 20 20 20 20 20 20   *pTab;         
22bd0 20 20 20 20 20 20 20 2f 2a 20 41 20 74 61 62 6c         /* A tabl
22be0 65 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  e in the databas
22bf0 65 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49  e */.  Index *pI
22c00 6e 64 65 78 3b 20 20 20 20 20 20 20 20 20 20 20  ndex;           
22c10 20 20 20 2f 2a 20 41 6e 20 69 6e 64 65 78 20 61     /* An index a
22c20 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 70  ssociated with p
22c30 54 61 62 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62  Tab */.  int iDb
22c40 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
22c50 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61       /* The data
22c60 62 61 73 65 20 69 6e 64 65 78 20 6e 75 6d 62 65  base index numbe
22c70 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a  r */.  sqlite3 *
22c80 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
22c90 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61     /* The databa
22ca0 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f  se connection */
22cb0 0a 20 20 54 6f 6b 65 6e 20 2a 70 4f 62 6a 4e 61  .  Token *pObjNa
22cc0 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  me;            /
22cd0 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 74 61  * Name of the ta
22ce0 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 74 6f 20  ble or index to 
22cf0 62 65 20 72 65 69 6e 64 65 78 65 64 20 2a 2f 0a  be reindexed */.
22d00 0a 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 64  .  /* Read the d
22d10 61 74 61 62 61 73 65 20 73 63 68 65 6d 61 2e 20  atabase schema. 
22d20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
22d30 72 73 2c 20 6c 65 61 76 65 20 61 6e 20 65 72 72  rs, leave an err
22d40 6f 72 20 6d 65 73 73 61 67 65 0a 20 20 2a 2a 20  or message.  ** 
22d50 61 6e 64 20 63 6f 64 65 20 69 6e 20 70 50 61 72  and code in pPar
22d60 73 65 20 61 6e 64 20 72 65 74 75 72 6e 20 4e 55  se and return NU
22d70 4c 4c 2e 20 2a 2f 0a 20 20 69 66 28 20 53 51 4c  LL. */.  if( SQL
22d80 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52  ITE_OK!=sqlite3R
22d90 65 61 64 53 63 68 65 6d 61 28 70 50 61 72 73 65  eadSchema(pParse
22da0 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b  ) ){.    return;
22db0 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 4e 61 6d  .  }..  if( pNam
22dc0 65 31 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 69  e1==0 ){.    rei
22dd0 6e 64 65 78 44 61 74 61 62 61 73 65 73 28 70 50  ndexDatabases(pP
22de0 61 72 73 65 2c 20 30 29 3b 0a 20 20 20 20 72 65  arse, 0);.    re
22df0 74 75 72 6e 3b 0a 20 20 7d 65 6c 73 65 20 69 66  turn;.  }else if
22e00 28 20 4e 45 56 45 52 28 70 4e 61 6d 65 32 3d 3d  ( NEVER(pName2==
22e10 30 29 20 7c 7c 20 70 4e 61 6d 65 32 2d 3e 7a 3d  0) || pName2->z=
22e20 3d 30 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a  =0 ){.    char *
22e30 7a 43 6f 6c 6c 3b 0a 20 20 20 20 61 73 73 65 72  zColl;.    asser
22e40 74 28 20 70 4e 61 6d 65 31 2d 3e 7a 20 29 3b 0a  t( pName1->z );.
22e50 20 20 20 20 7a 43 6f 6c 6c 20 3d 20 73 71 6c 69      zColl = sqli
22e60 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e  te3NameFromToken
22e70 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 4e 61  (pParse->db, pNa
22e80 6d 65 31 29 3b 0a 20 20 20 20 69 66 28 20 21 7a  me1);.    if( !z
22e90 43 6f 6c 6c 20 29 20 72 65 74 75 72 6e 3b 0a 20  Coll ) return;. 
22ea0 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74     pColl = sqlit
22eb0 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28 64 62  e3FindCollSeq(db
22ec0 2c 20 45 4e 43 28 64 62 29 2c 20 7a 43 6f 6c 6c  , ENC(db), zColl
22ed0 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70 43  , 0);.    if( pC
22ee0 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 72 65 69  oll ){.      rei
22ef0 6e 64 65 78 44 61 74 61 62 61 73 65 73 28 70 50  ndexDatabases(pP
22f00 61 72 73 65 2c 20 7a 43 6f 6c 6c 29 3b 0a 20 20  arse, zColl);.  
22f10 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
22f20 65 28 64 62 2c 20 7a 43 6f 6c 6c 29 3b 0a 20 20  e(db, zColl);.  
22f30 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
22f40 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  }.    sqlite3DbF
22f50 72 65 65 28 64 62 2c 20 7a 43 6f 6c 6c 29 3b 0a  ree(db, zColl);.
22f60 20 20 7d 0a 20 20 69 44 62 20 3d 20 73 71 6c 69    }.  iDb = sqli
22f70 74 65 33 54 77 6f 50 61 72 74 4e 61 6d 65 28 70  te3TwoPartName(p
22f80 50 61 72 73 65 2c 20 70 4e 61 6d 65 31 2c 20 70  Parse, pName1, p
22f90 4e 61 6d 65 32 2c 20 26 70 4f 62 6a 4e 61 6d 65  Name2, &pObjName
22fa0 29 3b 0a 20 20 69 66 28 20 69 44 62 3c 30 20 29  );.  if( iDb<0 )
22fb0 20 72 65 74 75 72 6e 3b 0a 20 20 7a 20 3d 20 73   return;.  z = s
22fc0 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f  qlite3NameFromTo
22fd0 6b 65 6e 28 64 62 2c 20 70 4f 62 6a 4e 61 6d 65  ken(db, pObjName
22fe0 29 3b 0a 20 20 69 66 28 20 7a 3d 3d 30 20 29 20  );.  if( z==0 ) 
22ff0 72 65 74 75 72 6e 3b 0a 20 20 7a 44 62 20 3d 20  return;.  zDb = 
23000 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61  db->aDb[iDb].zNa
23010 6d 65 3b 0a 20 20 70 54 61 62 20 3d 20 73 71 6c  me;.  pTab = sql
23020 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28 64 62  ite3FindTable(db
23030 2c 20 7a 2c 20 7a 44 62 29 3b 0a 20 20 69 66 28  , z, zDb);.  if(
23040 20 70 54 61 62 20 29 7b 0a 20 20 20 20 72 65 69   pTab ){.    rei
23050 6e 64 65 78 54 61 62 6c 65 28 70 50 61 72 73 65  ndexTable(pParse
23060 2c 20 70 54 61 62 2c 20 30 29 3b 0a 20 20 20 20  , pTab, 0);.    
23070 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
23080 2c 20 7a 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , z);.    return
23090 3b 0a 20 20 7d 0a 20 20 70 49 6e 64 65 78 20 3d  ;.  }.  pIndex =
230a0 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 64 65   sqlite3FindInde
230b0 78 28 64 62 2c 20 7a 2c 20 7a 44 62 29 3b 0a 20  x(db, z, zDb);. 
230c0 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
230d0 62 2c 20 7a 29 3b 0a 20 20 69 66 28 20 70 49 6e  b, z);.  if( pIn
230e0 64 65 78 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  dex ){.    sqlit
230f0 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72  e3BeginWriteOper
23100 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 30 2c  ation(pParse, 0,
23110 20 69 44 62 29 3b 0a 20 20 20 20 73 71 6c 69 74   iDb);.    sqlit
23120 65 33 52 65 66 69 6c 6c 49 6e 64 65 78 28 70 50  e3RefillIndex(pP
23130 61 72 73 65 2c 20 70 49 6e 64 65 78 2c 20 2d 31  arse, pIndex, -1
23140 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  );.    return;. 
23150 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 72 72 6f   }.  sqlite3Erro
23160 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 75 6e  rMsg(pParse, "un
23170 61 62 6c 65 20 74 6f 20 69 64 65 6e 74 69 66 79  able to identify
23180 20 74 68 65 20 6f 62 6a 65 63 74 20 74 6f 20 62   the object to b
23190 65 20 72 65 69 6e 64 65 78 65 64 22 29 3b 0a 7d  e reindexed");.}
231a0 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52  .#endif../*.** R
231b0 65 74 75 72 6e 20 61 20 4b 65 79 49 6e 66 6f 20  eturn a KeyInfo 
231c0 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20 69  structure that i
231d0 73 20 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f  s appropriate fo
231e0 72 20 74 68 65 20 67 69 76 65 6e 20 49 6e 64 65  r the given Inde
231f0 78 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 4b 65 79  x..**.** The Key
23200 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 66  Info structure f
23210 6f 72 20 61 6e 20 69 6e 64 65 78 20 69 73 20 63  or an index is c
23220 61 63 68 65 64 20 69 6e 20 74 68 65 20 49 6e 64  ached in the Ind
23230 65 78 20 6f 62 6a 65 63 74 2e 0a 2a 2a 20 53 6f  ex object..** So
23240 20 74 68 65 72 65 20 6d 69 67 68 74 20 62 65 20   there might be 
23250 6d 75 6c 74 69 70 6c 65 20 72 65 66 65 72 65 6e  multiple referen
23260 63 65 73 20 74 6f 20 74 68 65 20 72 65 74 75 72  ces to the retur
23270 6e 65 64 20 70 6f 69 6e 74 65 72 2e 20 20 54 68  ned pointer.  Th
23280 65 0a 2a 2a 20 63 61 6c 6c 65 72 20 73 68 6f 75  e.** caller shou
23290 6c 64 20 6e 6f 74 20 74 72 79 20 74 6f 20 6d 6f  ld not try to mo
232a0 64 69 66 79 20 74 68 65 20 4b 65 79 49 6e 66 6f  dify the KeyInfo
232b0 20 6f 62 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 54   object..**.** T
232c0 68 65 20 63 61 6c 6c 65 72 20 73 68 6f 75 6c 64  he caller should
232d0 20 69 6e 76 6f 6b 65 20 73 71 6c 69 74 65 33 4b   invoke sqlite3K
232e0 65 79 49 6e 66 6f 55 6e 72 65 66 28 29 20 6f 6e  eyInfoUnref() on
232f0 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 6f 62   the returned ob
23300 6a 65 63 74 0a 2a 2a 20 77 68 65 6e 20 69 74 20  ject.** when it 
23310 68 61 73 20 66 69 6e 69 73 68 65 64 20 75 73 69  has finished usi
23320 6e 67 20 69 74 2e 0a 2a 2f 0a 4b 65 79 49 6e 66  ng it..*/.KeyInf
23330 6f 20 2a 73 71 6c 69 74 65 33 4b 65 79 49 6e 66  o *sqlite3KeyInf
23340 6f 4f 66 49 6e 64 65 78 28 50 61 72 73 65 20 2a  oOfIndex(Parse *
23350 70 50 61 72 73 65 2c 20 49 6e 64 65 78 20 2a 70  pParse, Index *p
23360 49 64 78 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  Idx){.  int i;. 
23370 20 69 6e 74 20 6e 43 6f 6c 20 3d 20 70 49 64 78   int nCol = pIdx
23380 2d 3e 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 69 6e 74  ->nColumn;.  int
23390 20 6e 4b 65 79 20 3d 20 70 49 64 78 2d 3e 6e 4b   nKey = pIdx->nK
233a0 65 79 43 6f 6c 3b 0a 20 20 4b 65 79 49 6e 66 6f  eyCol;.  KeyInfo
233b0 20 2a 70 4b 65 79 3b 0a 20 20 69 66 28 20 70 50   *pKey;.  if( pP
233c0 61 72 73 65 2d 3e 6e 45 72 72 20 29 20 72 65 74  arse->nErr ) ret
233d0 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 49 64  urn 0;.  if( pId
233e0 78 2d 3e 75 6e 69 71 4e 6f 74 4e 75 6c 6c 20 29  x->uniqNotNull )
233f0 7b 0a 20 20 20 20 70 4b 65 79 20 3d 20 73 71 6c  {.    pKey = sql
23400 69 74 65 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63  ite3KeyInfoAlloc
23410 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 6e 4b 65  (pParse->db, nKe
23420 79 2c 20 6e 43 6f 6c 2d 6e 4b 65 79 29 3b 0a 20  y, nCol-nKey);. 
23430 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 4b 65 79   }else{.    pKey
23440 20 3d 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66   = sqlite3KeyInf
23450 6f 41 6c 6c 6f 63 28 70 50 61 72 73 65 2d 3e 64  oAlloc(pParse->d
23460 62 2c 20 6e 43 6f 6c 2c 20 30 29 3b 0a 20 20 7d  b, nCol, 0);.  }
23470 0a 20 20 69 66 28 20 70 4b 65 79 20 29 7b 0a 20  .  if( pKey ){. 
23480 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
23490 65 33 4b 65 79 49 6e 66 6f 49 73 57 72 69 74 65  e3KeyInfoIsWrite
234a0 61 62 6c 65 28 70 4b 65 79 29 20 29 3b 0a 20 20  able(pKey) );.  
234b0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f    for(i=0; i<nCo
234c0 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 63  l; i++){.      c
234d0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 6c  onst char *zColl
234e0 20 3d 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b   = pIdx->azColl[
234f0 69 5d 3b 0a 20 20 20 20 20 20 70 4b 65 79 2d 3e  i];.      pKey->
23500 61 43 6f 6c 6c 5b 69 5d 20 3d 20 7a 43 6f 6c 6c  aColl[i] = zColl
23510 3d 3d 73 71 6c 69 74 65 33 53 74 72 42 49 4e 41  ==sqlite3StrBINA
23520 52 59 20 3f 20 30 20 3a 0a 20 20 20 20 20 20 20  RY ? 0 :.       
23530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23540 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 43 6f   sqlite3LocateCo
23550 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 7a 43  llSeq(pParse, zC
23560 6f 6c 6c 29 3b 0a 20 20 20 20 20 20 70 4b 65 79  oll);.      pKey
23570 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20  ->aSortOrder[i] 
23580 3d 20 70 49 64 78 2d 3e 61 53 6f 72 74 4f 72 64  = pIdx->aSortOrd
23590 65 72 5b 69 5d 3b 0a 20 20 20 20 7d 0a 20 20 20  er[i];.    }.   
235a0 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72   if( pParse->nEr
235b0 72 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  r ){.      sqlit
235c0 65 33 4b 65 79 49 6e 66 6f 55 6e 72 65 66 28 70  e3KeyInfoUnref(p
235d0 4b 65 79 29 3b 0a 20 20 20 20 20 20 70 4b 65 79  Key);.      pKey
235e0 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 0;.    }.  }.
235f0 20 20 72 65 74 75 72 6e 20 70 4b 65 79 3b 0a 7d    return pKey;.}
23600 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
23610 5f 4f 4d 49 54 5f 43 54 45 0a 2f 2a 20 0a 2a 2a  _OMIT_CTE./* .**
23620 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
23630 20 69 6e 76 6f 6b 65 64 20 6f 6e 63 65 20 70 65   invoked once pe
23640 72 20 43 54 45 20 62 79 20 74 68 65 20 70 61 72  r CTE by the par
23650 73 65 72 20 77 68 69 6c 65 20 70 61 72 73 69 6e  ser while parsin
23660 67 20 61 20 0a 2a 2a 20 57 49 54 48 20 63 6c 61  g a .** WITH cla
23670 75 73 65 2e 20 0a 2a 2f 0a 57 69 74 68 20 2a 73  use. .*/.With *s
23680 71 6c 69 74 65 33 57 69 74 68 41 64 64 28 0a 20  qlite3WithAdd(. 
23690 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
236a0 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73           /* Pars
236b0 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
236c0 20 57 69 74 68 20 2a 70 57 69 74 68 2c 20 20 20   With *pWith,   
236d0 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 69 73           /* Exis
236e0 74 69 6e 67 20 57 49 54 48 20 63 6c 61 75 73 65  ting WITH clause
236f0 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 54  , or NULL */.  T
23700 6f 6b 65 6e 20 2a 70 4e 61 6d 65 2c 20 20 20 20  oken *pName,    
23710 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
23720 66 20 74 68 65 20 63 6f 6d 6d 6f 6e 2d 74 61 62  f the common-tab
23730 6c 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  le */.  ExprList
23740 20 2a 70 41 72 67 6c 69 73 74 2c 20 20 20 20 20   *pArglist,     
23750 2f 2a 20 4f 70 74 69 6f 6e 61 6c 20 63 6f 6c 75  /* Optional colu
23760 6d 6e 20 6e 61 6d 65 20 6c 69 73 74 20 66 6f 72  mn name list for
23770 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20   the table */.  
23780 53 65 6c 65 63 74 20 2a 70 51 75 65 72 79 20 20  Select *pQuery  
23790 20 20 20 20 20 20 20 20 2f 2a 20 51 75 65 72 79          /* Query
237a0 20 75 73 65 64 20 74 6f 20 69 6e 69 74 69 61 6c   used to initial
237b0 69 7a 65 20 74 68 65 20 74 61 62 6c 65 20 2a 2f  ize the table */
237c0 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  .){.  sqlite3 *d
237d0 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
237e0 20 20 57 69 74 68 20 2a 70 4e 65 77 3b 0a 20 20    With *pNew;.  
237f0 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 0a 20 20  char *zName;..  
23800 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74 68  /* Check that th
23810 65 20 43 54 45 20 6e 61 6d 65 20 69 73 20 75 6e  e CTE name is un
23820 69 71 75 65 20 77 69 74 68 69 6e 20 74 68 69 73  ique within this
23830 20 57 49 54 48 20 63 6c 61 75 73 65 2e 20 49 66   WITH clause. If
23840 0a 20 20 2a 2a 20 6e 6f 74 2c 20 73 74 6f 72 65  .  ** not, store
23850 20 61 6e 20 65 72 72 6f 72 20 69 6e 20 74 68 65   an error in the
23860 20 50 61 72 73 65 20 73 74 72 75 63 74 75 72 65   Parse structure
23870 2e 20 2a 2f 0a 20 20 7a 4e 61 6d 65 20 3d 20 73  . */.  zName = s
23880 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f  qlite3NameFromTo
23890 6b 65 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ken(pParse->db, 
238a0 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a 4e  pName);.  if( zN
238b0 61 6d 65 20 26 26 20 70 57 69 74 68 20 29 7b 0a  ame && pWith ){.
238c0 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66      int i;.    f
238d0 6f 72 28 69 3d 30 3b 20 69 3c 70 57 69 74 68 2d  or(i=0; i<pWith-
238e0 3e 6e 43 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nCte; i++){.   
238f0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74     if( sqlite3St
23900 72 49 43 6d 70 28 7a 4e 61 6d 65 2c 20 70 57 69  rICmp(zName, pWi
23910 74 68 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3d  th->a[i].zName)=
23920 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  =0 ){.        sq
23930 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
23940 61 72 73 65 2c 20 22 64 75 70 6c 69 63 61 74 65  arse, "duplicate
23950 20 57 49 54 48 20 74 61 62 6c 65 20 6e 61 6d 65   WITH table name
23960 3a 20 25 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20  : %s", zName);. 
23970 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
23980 0a 0a 20 20 69 66 28 20 70 57 69 74 68 20 29 7b  ..  if( pWith ){
23990 0a 20 20 20 20 69 6e 74 20 6e 42 79 74 65 20 3d  .    int nByte =
239a0 20 73 69 7a 65 6f 66 28 2a 70 57 69 74 68 29 20   sizeof(*pWith) 
239b0 2b 20 28 73 69 7a 65 6f 66 28 70 57 69 74 68 2d  + (sizeof(pWith-
239c0 3e 61 5b 31 5d 29 20 2a 20 70 57 69 74 68 2d 3e  >a[1]) * pWith->
239d0 6e 43 74 65 29 3b 0a 20 20 20 20 70 4e 65 77 20  nCte);.    pNew 
239e0 3d 20 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c  = sqlite3DbReall
239f0 6f 63 28 64 62 2c 20 70 57 69 74 68 2c 20 6e 42  oc(db, pWith, nB
23a00 79 74 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  yte);.  }else{. 
23a10 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65     pNew = sqlite
23a20 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62  3DbMallocZero(db
23a30 2c 20 73 69 7a 65 6f 66 28 2a 70 57 69 74 68 29  , sizeof(*pWith)
23a40 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  );.  }.  assert(
23a50 20 28 70 4e 65 77 21 3d 30 20 26 26 20 7a 4e 61   (pNew!=0 && zNa
23a60 6d 65 21 3d 30 29 20 7c 7c 20 64 62 2d 3e 6d 61  me!=0) || db->ma
23a70 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 0a 20  llocFailed );.. 
23a80 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
23a90 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 73 71 6c  ailed ){.    sql
23aa0 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65  ite3ExprListDele
23ab0 74 65 28 64 62 2c 20 70 41 72 67 6c 69 73 74 29  te(db, pArglist)
23ac0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c  ;.    sqlite3Sel
23ad0 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70 51  ectDelete(db, pQ
23ae0 75 65 72 79 29 3b 0a 20 20 20 20 73 71 6c 69 74  uery);.    sqlit
23af0 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4e 61  e3DbFree(db, zNa
23b00 6d 65 29 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20  me);.    pNew = 
23b10 70 57 69 74 68 3b 0a 20 20 7d 65 6c 73 65 7b 0a  pWith;.  }else{.
23b20 20 20 20 20 70 4e 65 77 2d 3e 61 5b 70 4e 65 77      pNew->a[pNew
23b30 2d 3e 6e 43 74 65 5d 2e 70 53 65 6c 65 63 74 20  ->nCte].pSelect 
23b40 3d 20 70 51 75 65 72 79 3b 0a 20 20 20 20 70 4e  = pQuery;.    pN
23b50 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e 43 74 65  ew->a[pNew->nCte
23b60 5d 2e 70 43 6f 6c 73 20 3d 20 70 41 72 67 6c 69  ].pCols = pArgli
23b70 73 74 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 61 5b  st;.    pNew->a[
23b80 70 4e 65 77 2d 3e 6e 43 74 65 5d 2e 7a 4e 61 6d  pNew->nCte].zNam
23b90 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20 20 20 70  e = zName;.    p
23ba0 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e 43 74  New->a[pNew->nCt
23bb0 65 5d 2e 7a 43 74 65 45 72 72 20 3d 20 30 3b 0a  e].zCteErr = 0;.
23bc0 20 20 20 20 70 4e 65 77 2d 3e 6e 43 74 65 2b 2b      pNew->nCte++
23bd0 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
23be0 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  pNew;.}../*.** F
23bf0 72 65 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  ree the contents
23c00 20 6f 66 20 74 68 65 20 57 69 74 68 20 6f 62 6a   of the With obj
23c10 65 63 74 20 70 61 73 73 65 64 20 61 73 20 74 68  ect passed as th
23c20 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
23c30 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  t..*/.void sqlit
23c40 65 33 57 69 74 68 44 65 6c 65 74 65 28 73 71 6c  e3WithDelete(sql
23c50 69 74 65 33 20 2a 64 62 2c 20 57 69 74 68 20 2a  ite3 *db, With *
23c60 70 57 69 74 68 29 7b 0a 20 20 69 66 28 20 70 57  pWith){.  if( pW
23c70 69 74 68 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  ith ){.    int i
23c80 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
23c90 3c 70 57 69 74 68 2d 3e 6e 43 74 65 3b 20 69 2b  <pWith->nCte; i+
23ca0 2b 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74  +){.      struct
23cb0 20 43 74 65 20 2a 70 43 74 65 20 3d 20 26 70 57   Cte *pCte = &pW
23cc0 69 74 68 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 20  ith->a[i];.     
23cd0 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
23ce0 44 65 6c 65 74 65 28 64 62 2c 20 70 43 74 65 2d  Delete(db, pCte-
23cf0 3e 70 43 6f 6c 73 29 3b 0a 20 20 20 20 20 20 73  >pCols);.      s
23d00 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65  qlite3SelectDele
23d10 74 65 28 64 62 2c 20 70 43 74 65 2d 3e 70 53 65  te(db, pCte->pSe
23d20 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  lect);.      sql
23d30 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
23d40 43 74 65 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  Cte->zName);.   
23d50 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62   }.    sqlite3Db
23d60 46 72 65 65 28 64 62 2c 20 70 57 69 74 68 29 3b  Free(db, pWith);
23d70 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  .  }.}.#endif /*
23d80 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
23d90 5f 4f 4d 49 54 5f 43 54 45 29 20 2a 2f 0a        _OMIT_CTE) */.