/ Hex Artifact Content
Login

Artifact 66bab5ee3998b1ebbea66ce0de60a82dcf497747:


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 69 66 28 20 69 44 62 3d 3d 31 20 29 20 72 65   if( iDb==1 ) re
07f0: 74 75 72 6e 3b 0a 20 20 69 66 28 20 21 73 71 6c  turn;.  if( !sql
0800: 69 74 65 33 42 74 72 65 65 53 68 61 72 61 62 6c  ite3BtreeSharabl
0810: 65 28 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61 44  e(pParse->db->aD
0820: 62 5b 69 44 62 5d 2e 70 42 74 29 20 29 20 72 65  b[iDb].pBt) ) re
0830: 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  turn;.  for(i=0;
0840: 20 69 3c 70 54 6f 70 6c 65 76 65 6c 2d 3e 6e 54   i<pToplevel->nT
0850: 61 62 6c 65 4c 6f 63 6b 3b 20 69 2b 2b 29 7b 0a  ableLock; i++){.
0860: 20 20 20 20 70 20 3d 20 26 70 54 6f 70 6c 65 76      p = &pToplev
0870: 65 6c 2d 3e 61 54 61 62 6c 65 4c 6f 63 6b 5b 69  el->aTableLock[i
0880: 5d 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 44  ];.    if( p->iD
0890: 62 3d 3d 69 44 62 20 26 26 20 70 2d 3e 69 54 61  b==iDb && p->iTa
08a0: 62 3d 3d 69 54 61 62 20 29 7b 0a 20 20 20 20 20  b==iTab ){.     
08b0: 20 70 2d 3e 69 73 57 72 69 74 65 4c 6f 63 6b 20   p->isWriteLock 
08c0: 3d 20 28 70 2d 3e 69 73 57 72 69 74 65 4c 6f 63  = (p->isWriteLoc
08d0: 6b 20 7c 7c 20 69 73 57 72 69 74 65 4c 6f 63 6b  k || isWriteLock
08e0: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b  );.      return;
08f0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 6e 42  .    }.  }..  nB
0900: 79 74 65 73 20 3d 20 73 69 7a 65 6f 66 28 54 61  ytes = sizeof(Ta
0910: 62 6c 65 4c 6f 63 6b 29 20 2a 20 28 70 54 6f 70  bleLock) * (pTop
0920: 6c 65 76 65 6c 2d 3e 6e 54 61 62 6c 65 4c 6f 63  level->nTableLoc
0930: 6b 2b 31 29 3b 0a 20 20 70 54 6f 70 6c 65 76 65  k+1);.  pTopleve
0940: 6c 2d 3e 61 54 61 62 6c 65 4c 6f 63 6b 20 3d 0a  l->aTableLock =.
0950: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 52        sqlite3DbR
0960: 65 61 6c 6c 6f 63 4f 72 46 72 65 65 28 70 54 6f  eallocOrFree(pTo
0970: 70 6c 65 76 65 6c 2d 3e 64 62 2c 20 70 54 6f 70  plevel->db, pTop
0980: 6c 65 76 65 6c 2d 3e 61 54 61 62 6c 65 4c 6f 63  level->aTableLoc
0990: 6b 2c 20 6e 42 79 74 65 73 29 3b 0a 20 20 69 66  k, nBytes);.  if
09a0: 28 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 61 54 61  ( pToplevel->aTa
09b0: 62 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 70  bleLock ){.    p
09c0: 20 3d 20 26 70 54 6f 70 6c 65 76 65 6c 2d 3e 61   = &pToplevel->a
09d0: 54 61 62 6c 65 4c 6f 63 6b 5b 70 54 6f 70 6c 65  TableLock[pTople
09e0: 76 65 6c 2d 3e 6e 54 61 62 6c 65 4c 6f 63 6b 2b  vel->nTableLock+
09f0: 2b 5d 3b 0a 20 20 20 20 70 2d 3e 69 44 62 20 3d  +];.    p->iDb =
0a00: 20 69 44 62 3b 0a 20 20 20 20 70 2d 3e 69 54 61   iDb;.    p->iTa
0a10: 62 20 3d 20 69 54 61 62 3b 0a 20 20 20 20 70 2d  b = iTab;.    p-
0a20: 3e 69 73 57 72 69 74 65 4c 6f 63 6b 20 3d 20 69  >isWriteLock = i
0a30: 73 57 72 69 74 65 4c 6f 63 6b 3b 0a 20 20 20 20  sWriteLock;.    
0a40: 70 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65  p->zName = zName
0a50: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
0a60: 54 6f 70 6c 65 76 65 6c 2d 3e 6e 54 61 62 6c 65  Toplevel->nTable
0a70: 4c 6f 63 6b 20 3d 20 30 3b 0a 20 20 20 20 73 71  Lock = 0;.    sq
0a80: 6c 69 74 65 33 4f 6f 6d 46 61 75 6c 74 28 70 54  lite3OomFault(pT
0a90: 6f 70 6c 65 76 65 6c 2d 3e 64 62 29 3b 0a 20 20  oplevel->db);.  
0aa0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20  }.}../*.** Code 
0ab0: 61 6e 20 4f 50 5f 54 61 62 6c 65 4c 6f 63 6b 20  an OP_TableLock 
0ac0: 69 6e 73 74 72 75 63 74 69 6f 6e 20 66 6f 72 20  instruction for 
0ad0: 65 61 63 68 20 74 61 62 6c 65 20 6c 6f 63 6b 65  each table locke
0ae0: 64 20 62 79 20 74 68 65 0a 2a 2a 20 73 74 61 74  d by the.** stat
0af0: 65 6d 65 6e 74 20 28 63 6f 6e 66 69 67 75 72 65  ement (configure
0b00: 64 20 62 79 20 63 61 6c 6c 73 20 74 6f 20 73 71  d by calls to sq
0b10: 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28 29  lite3TableLock()
0b20: 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  )..*/.static voi
0b30: 64 20 63 6f 64 65 54 61 62 6c 65 4c 6f 63 6b 73  d codeTableLocks
0b40: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b  (Parse *pParse){
0b50: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 56 64 62 65  .  int i;.  Vdbe
0b60: 20 2a 70 56 64 62 65 3b 20 0a 0a 20 20 70 56 64   *pVdbe; ..  pVd
0b70: 62 65 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56  be = sqlite3GetV
0b80: 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 61  dbe(pParse);.  a
0b90: 73 73 65 72 74 28 20 70 56 64 62 65 21 3d 30 20  ssert( pVdbe!=0 
0ba0: 29 3b 20 2f 2a 20 73 71 6c 69 74 65 33 47 65 74  ); /* sqlite3Get
0bb0: 56 64 62 65 20 63 61 6e 6e 6f 74 20 66 61 69 6c  Vdbe cannot fail
0bc0: 3a 20 56 44 42 45 20 61 6c 72 65 61 64 79 20 61  : VDBE already a
0bd0: 6c 6c 6f 63 61 74 65 64 20 2a 2f 0a 0a 20 20 66  llocated */..  f
0be0: 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 72 73 65  or(i=0; i<pParse
0bf0: 2d 3e 6e 54 61 62 6c 65 4c 6f 63 6b 3b 20 69 2b  ->nTableLock; i+
0c00: 2b 29 7b 0a 20 20 20 20 54 61 62 6c 65 4c 6f 63  +){.    TableLoc
0c10: 6b 20 2a 70 20 3d 20 26 70 50 61 72 73 65 2d 3e  k *p = &pParse->
0c20: 61 54 61 62 6c 65 4c 6f 63 6b 5b 69 5d 3b 0a 20  aTableLock[i];. 
0c30: 20 20 20 69 6e 74 20 70 31 20 3d 20 70 2d 3e 69     int p1 = p->i
0c40: 44 62 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  Db;.    sqlite3V
0c50: 64 62 65 41 64 64 4f 70 34 28 70 56 64 62 65 2c  dbeAddOp4(pVdbe,
0c60: 20 4f 50 5f 54 61 62 6c 65 4c 6f 63 6b 2c 20 70   OP_TableLock, p
0c70: 31 2c 20 70 2d 3e 69 54 61 62 2c 20 70 2d 3e 69  1, p->iTab, p->i
0c80: 73 57 72 69 74 65 4c 6f 63 6b 2c 0a 20 20 20 20  sWriteLock,.    
0c90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0ca0: 20 20 70 2d 3e 7a 4e 61 6d 65 2c 20 50 34 5f 53    p->zName, P4_S
0cb0: 54 41 54 49 43 29 3b 0a 20 20 7d 0a 7d 0a 23 65  TATIC);.  }.}.#e
0cc0: 6c 73 65 0a 20 20 23 64 65 66 69 6e 65 20 63 6f  lse.  #define co
0cd0: 64 65 54 61 62 6c 65 4c 6f 63 6b 73 28 78 29 0a  deTableLocks(x).
0ce0: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65  #endif../*.** Re
0cf0: 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65  turn TRUE if the
0d00: 20 67 69 76 65 6e 20 79 44 62 4d 61 73 6b 20 6f   given yDbMask o
0d10: 62 6a 65 63 74 20 69 73 20 65 6d 70 74 79 20 2d  bject is empty -
0d20: 20 69 66 20 69 74 20 63 6f 6e 74 61 69 6e 73 20   if it contains 
0d30: 6e 6f 0a 2a 2a 20 31 20 62 69 74 73 2e 20 20 54  no.** 1 bits.  T
0d40: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75  his routine is u
0d50: 73 65 64 20 62 79 20 74 68 65 20 44 62 4d 61 73  sed by the DbMas
0d60: 6b 41 6c 6c 5a 65 72 6f 28 29 20 61 6e 64 20 44  kAllZero() and D
0d70: 62 4d 61 73 6b 4e 6f 74 5a 65 72 6f 28 29 0a 2a  bMaskNotZero().*
0d80: 2a 20 6d 61 63 72 6f 73 20 77 68 65 6e 20 53 51  * macros when SQ
0d90: 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41 43 48 45  LITE_MAX_ATTACHE
0da0: 44 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61  D is greater tha
0db0: 6e 20 33 30 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c  n 30..*/.#if SQL
0dc0: 49 54 45 5f 4d 41 58 5f 41 54 54 41 43 48 45 44  ITE_MAX_ATTACHED
0dd0: 3e 33 30 0a 69 6e 74 20 73 71 6c 69 74 65 33 44  >30.int sqlite3D
0de0: 62 4d 61 73 6b 41 6c 6c 5a 65 72 6f 28 79 44 62  bMaskAllZero(yDb
0df0: 4d 61 73 6b 20 6d 29 7b 0a 20 20 69 6e 74 20 69  Mask m){.  int i
0e00: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73  ;.  for(i=0; i<s
0e10: 69 7a 65 6f 66 28 79 44 62 4d 61 73 6b 29 3b 20  izeof(yDbMask); 
0e20: 69 2b 2b 29 20 69 66 28 20 6d 5b 69 5d 20 29 20  i++) if( m[i] ) 
0e30: 72 65 74 75 72 6e 20 30 3b 0a 20 20 72 65 74 75  return 0;.  retu
0e40: 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  rn 1;.}.#endif..
0e50: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
0e60: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 61 66 74  ne is called aft
0e70: 65 72 20 61 20 73 69 6e 67 6c 65 20 53 51 4c 20  er a single SQL 
0e80: 73 74 61 74 65 6d 65 6e 74 20 68 61 73 20 62 65  statement has be
0e90: 65 6e 0a 2a 2a 20 70 61 72 73 65 64 20 61 6e 64  en.** parsed and
0ea0: 20 61 20 56 44 42 45 20 70 72 6f 67 72 61 6d 20   a VDBE program 
0eb0: 74 6f 20 65 78 65 63 75 74 65 20 74 68 61 74 20  to execute that 
0ec0: 73 74 61 74 65 6d 65 6e 74 20 68 61 73 20 62 65  statement has be
0ed0: 65 6e 0a 2a 2a 20 70 72 65 70 61 72 65 64 2e 20  en.** prepared. 
0ee0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 70 75   This routine pu
0ef0: 74 73 20 74 68 65 20 66 69 6e 69 73 68 69 6e 67  ts the finishing
0f00: 20 74 6f 75 63 68 65 73 20 6f 6e 20 74 68 65 0a   touches on the.
0f10: 2a 2a 20 56 44 42 45 20 70 72 6f 67 72 61 6d 20  ** VDBE program 
0f20: 61 6e 64 20 72 65 73 65 74 73 20 74 68 65 20 70  and resets the p
0f30: 50 61 72 73 65 20 73 74 72 75 63 74 75 72 65 20  Parse structure 
0f40: 66 6f 72 20 74 68 65 20 6e 65 78 74 0a 2a 2a 20  for the next.** 
0f50: 70 61 72 73 65 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74  parse..**.** Not
0f60: 65 20 74 68 61 74 20 69 66 20 61 6e 20 65 72 72  e that if an err
0f70: 6f 72 20 6f 63 63 75 72 72 65 64 2c 20 69 74 20  or occurred, it 
0f80: 6d 69 67 68 74 20 62 65 20 74 68 65 20 63 61 73  might be the cas
0f90: 65 20 74 68 61 74 0a 2a 2a 20 6e 6f 20 56 44 42  e that.** no VDB
0fa0: 45 20 63 6f 64 65 20 77 61 73 20 67 65 6e 65 72  E code was gener
0fb0: 61 74 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ated..*/.void sq
0fc0: 6c 69 74 65 33 46 69 6e 69 73 68 43 6f 64 69 6e  lite3FinishCodin
0fd0: 67 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29  g(Parse *pParse)
0fe0: 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  {.  sqlite3 *db;
0ff0: 0a 20 20 56 64 62 65 20 2a 76 3b 0a 0a 20 20 61  .  Vdbe *v;..  a
1000: 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 70  ssert( pParse->p
1010: 54 6f 70 6c 65 76 65 6c 3d 3d 30 20 29 3b 0a 20  Toplevel==0 );. 
1020: 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62   db = pParse->db
1030: 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  ;.  if( pParse->
1040: 6e 65 73 74 65 64 20 29 20 72 65 74 75 72 6e 3b  nested ) return;
1050: 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f  .  if( db->mallo
1060: 63 46 61 69 6c 65 64 20 7c 7c 20 70 50 61 72 73  cFailed || pPars
1070: 65 2d 3e 6e 45 72 72 20 29 7b 0a 20 20 20 20 69  e->nErr ){.    i
1080: 66 28 20 70 50 61 72 73 65 2d 3e 72 63 3d 3d 53  f( pParse->rc==S
1090: 51 4c 49 54 45 5f 4f 4b 20 29 20 70 50 61 72 73  QLITE_OK ) pPars
10a0: 65 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 45  e->rc = SQLITE_E
10b0: 52 52 4f 52 3b 0a 20 20 20 20 72 65 74 75 72 6e  RROR;.    return
10c0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42 65 67 69  ;.  }..  /* Begi
10d0: 6e 20 62 79 20 67 65 6e 65 72 61 74 69 6e 67 20  n by generating 
10e0: 73 6f 6d 65 20 74 65 72 6d 69 6e 61 74 69 6f 6e  some termination
10f0: 20 63 6f 64 65 20 61 74 20 74 68 65 20 65 6e 64   code at the end
1100: 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 76 64 62   of the.  ** vdb
1110: 65 20 70 72 6f 67 72 61 6d 0a 20 20 2a 2f 0a 20  e program.  */. 
1120: 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56   v = sqlite3GetV
1130: 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 61  dbe(pParse);.  a
1140: 73 73 65 72 74 28 20 21 70 50 61 72 73 65 2d 3e  ssert( !pParse->
1150: 69 73 4d 75 6c 74 69 57 72 69 74 65 20 0a 20 20  isMultiWrite .  
1160: 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 56       || sqlite3V
1170: 64 62 65 41 73 73 65 72 74 4d 61 79 41 62 6f 72  dbeAssertMayAbor
1180: 74 28 76 2c 20 70 50 61 72 73 65 2d 3e 6d 61 79  t(v, pParse->may
1190: 41 62 6f 72 74 29 29 3b 0a 20 20 69 66 28 20 76  Abort));.  if( v
11a0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
11b0: 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f  dbeAddOp0(v, OP_
11c0: 48 61 6c 74 29 3b 0a 0a 23 69 66 20 53 51 4c 49  Halt);..#if SQLI
11d0: 54 45 5f 55 53 45 52 5f 41 55 54 48 45 4e 54 49  TE_USER_AUTHENTI
11e0: 43 41 54 49 4f 4e 0a 20 20 20 20 69 66 28 20 70  CATION.    if( p
11f0: 50 61 72 73 65 2d 3e 6e 54 61 62 6c 65 4c 6f 63  Parse->nTableLoc
1200: 6b 3e 30 20 26 26 20 64 62 2d 3e 69 6e 69 74 2e  k>0 && db->init.
1210: 62 75 73 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20  busy==0 ){.     
1220: 20 73 71 6c 69 74 65 33 55 73 65 72 41 75 74 68   sqlite3UserAuth
1230: 49 6e 69 74 28 64 62 29 3b 0a 20 20 20 20 20 20  Init(db);.      
1240: 69 66 28 20 64 62 2d 3e 61 75 74 68 2e 61 75 74  if( db->auth.aut
1250: 68 4c 65 76 65 6c 3c 55 41 55 54 48 5f 55 73 65  hLevel<UAUTH_Use
1260: 72 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  r ){.        sql
1270: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
1280: 72 73 65 2c 20 22 75 73 65 72 20 6e 6f 74 20 61  rse, "user not a
1290: 75 74 68 65 6e 74 69 63 61 74 65 64 22 29 3b 0a  uthenticated");.
12a0: 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e          pParse->
12b0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 41 55 54 48  rc = SQLITE_AUTH
12c0: 5f 55 53 45 52 3b 0a 20 20 20 20 20 20 20 20 72  _USER;.        r
12d0: 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20  eturn;.      }. 
12e0: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20     }.#endif..   
12f0: 20 2f 2a 20 54 68 65 20 63 6f 6f 6b 69 65 20 6d   /* The cookie m
1300: 61 73 6b 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 65  ask contains one
1310: 20 62 69 74 20 66 6f 72 20 65 61 63 68 20 64 61   bit for each da
1320: 74 61 62 61 73 65 20 66 69 6c 65 20 6f 70 65 6e  tabase file open
1330: 2e 0a 20 20 20 20 2a 2a 20 28 42 69 74 20 30 20  ..    ** (Bit 0 
1340: 69 73 20 66 6f 72 20 6d 61 69 6e 2c 20 62 69 74  is for main, bit
1350: 20 31 20 69 73 20 66 6f 72 20 74 65 6d 70 2c 20   1 is for temp, 
1360: 61 6e 64 20 73 6f 20 66 6f 72 74 68 2e 29 20 20  and so forth.)  
1370: 42 69 74 73 20 61 72 65 0a 20 20 20 20 2a 2a 20  Bits are.    ** 
1380: 73 65 74 20 66 6f 72 20 65 61 63 68 20 64 61 74  set for each dat
1390: 61 62 61 73 65 20 74 68 61 74 20 69 73 20 75 73  abase that is us
13a0: 65 64 2e 20 20 47 65 6e 65 72 61 74 65 20 63 6f  ed.  Generate co
13b0: 64 65 20 74 6f 20 73 74 61 72 74 20 61 0a 20 20  de to start a.  
13c0: 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e    ** transaction
13d0: 20 6f 6e 20 65 61 63 68 20 75 73 65 64 20 64 61   on each used da
13e0: 74 61 62 61 73 65 20 61 6e 64 20 74 6f 20 76 65  tabase and to ve
13f0: 72 69 66 79 20 74 68 65 20 73 63 68 65 6d 61 20  rify the schema 
1400: 63 6f 6f 6b 69 65 0a 20 20 20 20 2a 2a 20 6f 6e  cookie.    ** on
1410: 20 65 61 63 68 20 75 73 65 64 20 64 61 74 61 62   each used datab
1420: 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ase..    */.    
1430: 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
1440: 69 6c 65 64 3d 3d 30 20 0a 20 20 20 20 20 26 26  iled==0 .     &&
1450: 20 28 44 62 4d 61 73 6b 4e 6f 6e 5a 65 72 6f 28   (DbMaskNonZero(
1460: 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 4d 61  pParse->cookieMa
1470: 73 6b 29 20 7c 7c 20 70 50 61 72 73 65 2d 3e 70  sk) || pParse->p
1480: 43 6f 6e 73 74 45 78 70 72 29 0a 20 20 20 20 29  ConstExpr).    )
1490: 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 44 62 2c  {.      int iDb,
14a0: 20 69 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   i;.      assert
14b0: 28 20 73 71 6c 69 74 65 33 56 64 62 65 47 65 74  ( sqlite3VdbeGet
14c0: 4f 70 28 76 2c 20 30 29 2d 3e 6f 70 63 6f 64 65  Op(v, 0)->opcode
14d0: 3d 3d 4f 50 5f 49 6e 69 74 20 29 3b 0a 20 20 20  ==OP_Init );.   
14e0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
14f0: 6d 70 48 65 72 65 28 76 2c 20 30 29 3b 0a 20 20  mpHere(v, 0);.  
1500: 20 20 20 20 66 6f 72 28 69 44 62 3d 30 3b 20 69      for(iDb=0; i
1510: 44 62 3c 64 62 2d 3e 6e 44 62 3b 20 69 44 62 2b  Db<db->nDb; iDb+
1520: 2b 29 7b 0a 20 20 20 20 20 20 20 20 53 63 68 65  +){.        Sche
1530: 6d 61 20 2a 70 53 63 68 65 6d 61 3b 0a 20 20 20  ma *pSchema;.   
1540: 20 20 20 20 20 69 66 28 20 44 62 4d 61 73 6b 54       if( DbMaskT
1550: 65 73 74 28 70 50 61 72 73 65 2d 3e 63 6f 6f 6b  est(pParse->cook
1560: 69 65 4d 61 73 6b 2c 20 69 44 62 29 3d 3d 30 20  ieMask, iDb)==0 
1570: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
1580: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 55      sqlite3VdbeU
1590: 73 65 73 42 74 72 65 65 28 76 2c 20 69 44 62 29  sesBtree(v, iDb)
15a0: 3b 0a 20 20 20 20 20 20 20 20 70 53 63 68 65 6d  ;.        pSchem
15b0: 61 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d  a = db->aDb[iDb]
15c0: 2e 70 53 63 68 65 6d 61 3b 0a 20 20 20 20 20 20  .pSchema;.      
15d0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
15e0: 4f 70 34 49 6e 74 28 76 2c 0a 20 20 20 20 20 20  Op4Int(v,.      
15f0: 20 20 20 20 4f 50 5f 54 72 61 6e 73 61 63 74 69      OP_Transacti
1600: 6f 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  on,             
1610: 20 20 20 20 20 20 20 2f 2a 20 4f 70 63 6f 64 65         /* Opcode
1620: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 44   */.          iD
1630: 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b,              
1640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1650: 20 2f 2a 20 50 31 20 2a 2f 0a 20 20 20 20 20 20   /* P1 */.      
1660: 20 20 20 20 44 62 4d 61 73 6b 54 65 73 74 28 70      DbMaskTest(p
1670: 50 61 72 73 65 2d 3e 77 72 69 74 65 4d 61 73 6b  Parse->writeMask
1680: 2c 69 44 62 29 2c 20 2f 2a 20 50 32 20 2a 2f 0a  ,iDb), /* P2 */.
1690: 20 20 20 20 20 20 20 20 20 20 70 53 63 68 65 6d            pSchem
16a0: 61 2d 3e 73 63 68 65 6d 61 5f 63 6f 6f 6b 69 65  a->schema_cookie
16b0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
16c0: 50 33 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  P3 */.          
16d0: 70 53 63 68 65 6d 61 2d 3e 69 47 65 6e 65 72 61  pSchema->iGenera
16e0: 74 69 6f 6e 20 20 20 20 20 20 20 20 20 20 20 20  tion            
16f0: 20 20 20 2f 2a 20 50 34 20 2a 2f 0a 20 20 20 20     /* P4 */.    
1700: 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 69      );.        i
1710: 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  f( db->init.busy
1720: 3d 3d 30 20 29 20 73 71 6c 69 74 65 33 56 64 62  ==0 ) sqlite3Vdb
1730: 65 43 68 61 6e 67 65 50 35 28 76 2c 20 31 29 3b  eChangeP5(v, 1);
1740: 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d  .        VdbeCom
1750: 6d 65 6e 74 28 28 76 2c 0a 20 20 20 20 20 20 20  ment((v,.       
1760: 20 20 20 20 20 20 20 22 75 73 65 73 53 74 6d 74         "usesStmt
1770: 4a 6f 75 72 6e 61 6c 3d 25 64 22 2c 20 70 50 61  Journal=%d", pPa
1780: 72 73 65 2d 3e 6d 61 79 41 62 6f 72 74 20 26 26  rse->mayAbort &&
1790: 20 70 50 61 72 73 65 2d 3e 69 73 4d 75 6c 74 69   pParse->isMulti
17a0: 57 72 69 74 65 29 29 3b 0a 20 20 20 20 20 20 7d  Write));.      }
17b0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
17c0: 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
17d0: 45 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  E.      for(i=0;
17e0: 20 69 3c 70 50 61 72 73 65 2d 3e 6e 56 74 61 62   i<pParse->nVtab
17f0: 4c 6f 63 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Lock; i++){.    
1800: 20 20 20 20 63 68 61 72 20 2a 76 74 61 62 20 3d      char *vtab =
1810: 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33   (char *)sqlite3
1820: 47 65 74 56 54 61 62 6c 65 28 64 62 2c 20 70 50  GetVTable(db, pP
1830: 61 72 73 65 2d 3e 61 70 56 74 61 62 4c 6f 63 6b  arse->apVtabLock
1840: 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 73 71  [i]);.        sq
1850: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
1860: 76 2c 20 4f 50 5f 56 42 65 67 69 6e 2c 20 30 2c  v, OP_VBegin, 0,
1870: 20 30 2c 20 30 2c 20 76 74 61 62 2c 20 50 34 5f   0, 0, vtab, P4_
1880: 56 54 41 42 29 3b 0a 20 20 20 20 20 20 7d 0a 20  VTAB);.      }. 
1890: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 56 74       pParse->nVt
18a0: 61 62 4c 6f 63 6b 20 3d 20 30 3b 0a 23 65 6e 64  abLock = 0;.#end
18b0: 69 66 0a 0a 20 20 20 20 20 20 2f 2a 20 4f 6e 63  if..      /* Onc
18c0: 65 20 61 6c 6c 20 74 68 65 20 63 6f 6f 6b 69 65  e all the cookie
18d0: 73 20 68 61 76 65 20 62 65 65 6e 20 76 65 72 69  s have been veri
18e0: 66 69 65 64 20 61 6e 64 20 74 72 61 6e 73 61 63  fied and transac
18f0: 74 69 6f 6e 73 20 6f 70 65 6e 65 64 2c 20 0a 20  tions opened, . 
1900: 20 20 20 20 20 2a 2a 20 6f 62 74 61 69 6e 20 74       ** obtain t
1910: 68 65 20 72 65 71 75 69 72 65 64 20 74 61 62 6c  he required tabl
1920: 65 2d 6c 6f 63 6b 73 2e 20 54 68 69 73 20 69 73  e-locks. This is
1930: 20 61 20 6e 6f 2d 6f 70 20 75 6e 6c 65 73 73 20   a no-op unless 
1940: 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 73 68  the .      ** sh
1950: 61 72 65 64 2d 63 61 63 68 65 20 66 65 61 74 75  ared-cache featu
1960: 72 65 20 69 73 20 65 6e 61 62 6c 65 64 2e 0a 20  re is enabled.. 
1970: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 63 6f       */.      co
1980: 64 65 54 61 62 6c 65 4c 6f 63 6b 73 28 70 50 61  deTableLocks(pPa
1990: 72 73 65 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  rse);..      /* 
19a0: 49 6e 69 74 69 61 6c 69 7a 65 20 61 6e 79 20 41  Initialize any A
19b0: 55 54 4f 49 4e 43 52 45 4d 45 4e 54 20 64 61 74  UTOINCREMENT dat
19c0: 61 20 73 74 72 75 63 74 75 72 65 73 20 72 65 71  a structures req
19d0: 75 69 72 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a  uired..      */.
19e0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 41 75 74        sqlite3Aut
19f0: 6f 69 6e 63 72 65 6d 65 6e 74 42 65 67 69 6e 28  oincrementBegin(
1a00: 70 50 61 72 73 65 29 3b 0a 0a 20 20 20 20 20 20  pParse);..      
1a10: 2f 2a 20 43 6f 64 65 20 63 6f 6e 73 74 61 6e 74  /* Code constant
1a20: 20 65 78 70 72 65 73 73 69 6f 6e 73 20 74 68 61   expressions tha
1a30: 74 20 77 68 65 72 65 20 66 61 63 74 6f 72 65 64  t where factored
1a40: 20 6f 75 74 20 6f 66 20 69 6e 6e 65 72 20 6c 6f   out of inner lo
1a50: 6f 70 73 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  ops */.      if(
1a60: 20 70 50 61 72 73 65 2d 3e 70 43 6f 6e 73 74 45   pParse->pConstE
1a70: 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20 45  xpr ){.        E
1a80: 78 70 72 4c 69 73 74 20 2a 70 45 4c 20 3d 20 70  xprList *pEL = p
1a90: 50 61 72 73 65 2d 3e 70 43 6f 6e 73 74 45 78 70  Parse->pConstExp
1aa0: 72 3b 0a 20 20 20 20 20 20 20 20 70 50 61 72 73  r;.        pPars
1ab0: 65 2d 3e 6f 6b 43 6f 6e 73 74 46 61 63 74 6f 72  e->okConstFactor
1ac0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 66 6f   = 0;.        fo
1ad0: 72 28 69 3d 30 3b 20 69 3c 70 45 4c 2d 3e 6e 45  r(i=0; i<pEL->nE
1ae0: 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  xpr; i++){.     
1af0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
1b00: 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 4c  Code(pParse, pEL
1b10: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 70 45  ->a[i].pExpr, pE
1b20: 4c 2d 3e 61 5b 69 5d 2e 75 2e 69 43 6f 6e 73 74  L->a[i].u.iConst
1b30: 45 78 70 72 52 65 67 29 3b 0a 20 20 20 20 20 20  ExprReg);.      
1b40: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20    }.      }..   
1b50: 20 20 20 2f 2a 20 46 69 6e 61 6c 6c 79 2c 20 6a     /* Finally, j
1b60: 75 6d 70 20 62 61 63 6b 20 74 6f 20 74 68 65 20  ump back to the 
1b70: 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65  beginning of the
1b80: 20 65 78 65 63 75 74 61 62 6c 65 20 63 6f 64 65   executable code
1b90: 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74  . */.      sqlit
1ba0: 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 31 29  e3VdbeGoto(v, 1)
1bb0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 0a 20 20  ;.    }.  }...  
1bc0: 2f 2a 20 47 65 74 20 74 68 65 20 56 44 42 45 20  /* Get the VDBE 
1bd0: 70 72 6f 67 72 61 6d 20 72 65 61 64 79 20 66 6f  program ready fo
1be0: 72 20 65 78 65 63 75 74 69 6f 6e 0a 20 20 2a 2f  r execution.  */
1bf0: 0a 20 20 69 66 28 20 76 20 26 26 20 70 50 61 72  .  if( v && pPar
1c00: 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 26 26 20 21  se->nErr==0 && !
1c10: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
1c20: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
1c30: 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65 4c 65  pParse->iCacheLe
1c40: 76 65 6c 3d 3d 30 20 29 3b 20 20 2f 2a 20 44 69  vel==0 );  /* Di
1c50: 73 61 62 6c 65 73 20 61 6e 64 20 72 65 2d 65 6e  sables and re-en
1c60: 61 62 6c 65 73 20 6d 61 74 63 68 20 2a 2f 0a 20  ables match */. 
1c70: 20 20 20 2f 2a 20 41 20 6d 69 6e 69 6d 75 6d 20     /* A minimum 
1c80: 6f 66 20 6f 6e 65 20 63 75 72 73 6f 72 20 69 73  of one cursor is
1c90: 20 72 65 71 75 69 72 65 64 20 69 66 20 61 75 74   required if aut
1ca0: 6f 69 6e 63 72 65 6d 65 6e 74 20 69 73 20 75 73  oincrement is us
1cb0: 65 64 0a 20 20 20 20 2a 20 20 53 65 65 20 74 69  ed.    *  See ti
1cc0: 63 6b 65 74 20 5b 61 36 39 36 33 37 39 63 31 66  cket [a696379c1f
1cd0: 30 38 38 36 36 5d 20 2a 2f 0a 20 20 20 20 69 66  08866] */.    if
1ce0: 28 20 70 50 61 72 73 65 2d 3e 70 41 69 6e 63 21  ( pParse->pAinc!
1cf0: 3d 30 20 26 26 20 70 50 61 72 73 65 2d 3e 6e 54  =0 && pParse->nT
1d00: 61 62 3d 3d 30 20 29 20 70 50 61 72 73 65 2d 3e  ab==0 ) pParse->
1d10: 6e 54 61 62 20 3d 20 31 3b 0a 20 20 20 20 73 71  nTab = 1;.    sq
1d20: 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 52 65 61  lite3VdbeMakeRea
1d30: 64 79 28 76 2c 20 70 50 61 72 73 65 29 3b 0a 20  dy(v, pParse);. 
1d40: 20 20 20 70 50 61 72 73 65 2d 3e 72 63 20 3d 20     pParse->rc = 
1d50: 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d  SQLITE_DONE;.  }
1d60: 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 72 73 65  else{.    pParse
1d70: 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52  ->rc = SQLITE_ER
1d80: 52 4f 52 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  ROR;.  }.}../*.*
1d90: 2a 20 52 75 6e 20 74 68 65 20 70 61 72 73 65 72  * Run the parser
1da0: 20 61 6e 64 20 63 6f 64 65 20 67 65 6e 65 72 61   and code genera
1db0: 74 6f 72 20 72 65 63 75 72 73 69 76 65 6c 79 20  tor recursively 
1dc0: 69 6e 20 6f 72 64 65 72 20 74 6f 20 67 65 6e 65  in order to gene
1dd0: 72 61 74 65 0a 2a 2a 20 63 6f 64 65 20 66 6f 72  rate.** code for
1de0: 20 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65   the SQL stateme
1df0: 6e 74 20 67 69 76 65 6e 20 6f 6e 74 6f 20 74 68  nt given onto th
1e00: 65 20 65 6e 64 20 6f 66 20 74 68 65 20 70 50 61  e end of the pPa
1e10: 72 73 65 20 63 6f 6e 74 65 78 74 0a 2a 2a 20 63  rse context.** c
1e20: 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63  urrently under c
1e30: 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 57 68  onstruction.  Wh
1e40: 65 6e 20 74 68 65 20 70 61 72 73 65 72 20 69 73  en the parser is
1e50: 20 72 75 6e 20 72 65 63 75 72 73 69 76 65 6c 79   run recursively
1e60: 0a 2a 2a 20 74 68 69 73 20 77 61 79 2c 20 74 68  .** this way, th
1e70: 65 20 66 69 6e 61 6c 20 4f 50 5f 48 61 6c 74 20  e final OP_Halt 
1e80: 69 73 20 6e 6f 74 20 61 70 70 65 6e 64 65 64 20  is not appended 
1e90: 61 6e 64 20 6f 74 68 65 72 20 69 6e 69 74 69 61  and other initia
1ea0: 6c 69 7a 61 74 69 6f 6e 0a 2a 2a 20 61 6e 64 20  lization.** and 
1eb0: 66 69 6e 61 6c 69 7a 61 74 69 6f 6e 20 73 74 65  finalization ste
1ec0: 70 73 20 61 72 65 20 6f 6d 69 74 74 65 64 20 62  ps are omitted b
1ed0: 65 63 61 75 73 65 20 74 68 6f 73 65 20 61 72 65  ecause those are
1ee0: 20 68 61 6e 64 6c 69 6e 67 20 62 79 20 74 68 65   handling by the
1ef0: 0a 2a 2a 20 6f 75 74 65 72 6d 6f 73 74 20 70 61  .** outermost pa
1f00: 72 73 65 72 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 20  rser..**.** Not 
1f10: 65 76 65 72 79 74 68 69 6e 67 20 69 73 20 6e 65  everything is ne
1f20: 73 74 61 62 6c 65 2e 20 20 54 68 69 73 20 66 61  stable.  This fa
1f30: 63 69 6c 69 74 79 20 69 73 20 64 65 73 69 67 6e  cility is design
1f40: 65 64 20 74 6f 20 70 65 72 6d 69 74 0a 2a 2a 20  ed to permit.** 
1f50: 49 4e 53 45 52 54 2c 20 55 50 44 41 54 45 2c 20  INSERT, UPDATE, 
1f60: 61 6e 64 20 44 45 4c 45 54 45 20 6f 70 65 72 61  and DELETE opera
1f70: 74 69 6f 6e 73 20 61 67 61 69 6e 73 74 20 53 51  tions against SQ
1f80: 4c 49 54 45 5f 4d 41 53 54 45 52 2e 20 20 55 73  LITE_MASTER.  Us
1f90: 65 0a 2a 2a 20 63 61 72 65 20 69 66 20 79 6f 75  e.** care if you
1fa0: 20 64 65 63 69 64 65 20 74 6f 20 74 72 79 20 74   decide to try t
1fb0: 6f 20 75 73 65 20 74 68 69 73 20 72 6f 75 74 69  o use this routi
1fc0: 6e 65 20 66 6f 72 20 73 6f 6d 65 20 6f 74 68 65  ne for some othe
1fd0: 72 20 70 75 72 70 6f 73 65 73 2e 0a 2a 2f 0a 76  r purposes..*/.v
1fe0: 6f 69 64 20 73 71 6c 69 74 65 33 4e 65 73 74 65  oid sqlite3Neste
1ff0: 64 50 61 72 73 65 28 50 61 72 73 65 20 2a 70 50  dParse(Parse *pP
2000: 61 72 73 65 2c 20 63 6f 6e 73 74 20 63 68 61 72  arse, const char
2010: 20 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b   *zFormat, ...){
2020: 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20  .  va_list ap;. 
2030: 20 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20 20 63   char *zSql;.  c
2040: 68 61 72 20 2a 7a 45 72 72 4d 73 67 20 3d 20 30  har *zErrMsg = 0
2050: 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
2060: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
2070: 63 68 61 72 20 73 61 76 65 42 75 66 5b 50 41 52  char saveBuf[PAR
2080: 53 45 5f 54 41 49 4c 5f 53 5a 5d 3b 0a 0a 20 20  SE_TAIL_SZ];..  
2090: 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  if( pParse->nErr
20a0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73   ) return;.  ass
20b0: 65 72 74 28 20 70 50 61 72 73 65 2d 3e 6e 65 73  ert( pParse->nes
20c0: 74 65 64 3c 31 30 20 29 3b 20 20 2f 2a 20 4e 65  ted<10 );  /* Ne
20d0: 73 74 69 6e 67 20 73 68 6f 75 6c 64 20 6f 6e 6c  sting should onl
20e0: 79 20 62 65 20 6f 66 20 6c 69 6d 69 74 65 64 20  y be of limited 
20f0: 64 65 70 74 68 20 2a 2f 0a 20 20 76 61 5f 73 74  depth */.  va_st
2100: 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61 74 29  art(ap, zFormat)
2110: 3b 0a 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74  ;.  zSql = sqlit
2120: 65 33 56 4d 50 72 69 6e 74 66 28 64 62 2c 20 7a  e3VMPrintf(db, z
2130: 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20 76  Format, ap);.  v
2140: 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 69 66 28  a_end(ap);.  if(
2150: 20 7a 53 71 6c 3d 3d 30 20 29 7b 0a 20 20 20 20   zSql==0 ){.    
2160: 72 65 74 75 72 6e 3b 20 20 20 2f 2a 20 41 20 6d  return;   /* A m
2170: 61 6c 6c 6f 63 20 6d 75 73 74 20 68 61 76 65 20  alloc must have 
2180: 66 61 69 6c 65 64 20 2a 2f 0a 20 20 7d 0a 20 20  failed */.  }.  
2190: 70 50 61 72 73 65 2d 3e 6e 65 73 74 65 64 2b 2b  pParse->nested++
21a0: 3b 0a 20 20 6d 65 6d 63 70 79 28 73 61 76 65 42  ;.  memcpy(saveB
21b0: 75 66 2c 20 50 41 52 53 45 5f 54 41 49 4c 28 70  uf, PARSE_TAIL(p
21c0: 50 61 72 73 65 29 2c 20 50 41 52 53 45 5f 54 41  Parse), PARSE_TA
21d0: 49 4c 5f 53 5a 29 3b 0a 20 20 6d 65 6d 73 65 74  IL_SZ);.  memset
21e0: 28 50 41 52 53 45 5f 54 41 49 4c 28 70 50 61 72  (PARSE_TAIL(pPar
21f0: 73 65 29 2c 20 30 2c 20 50 41 52 53 45 5f 54 41  se), 0, PARSE_TA
2200: 49 4c 5f 53 5a 29 3b 0a 20 20 73 71 6c 69 74 65  IL_SZ);.  sqlite
2210: 33 52 75 6e 50 61 72 73 65 72 28 70 50 61 72 73  3RunParser(pPars
2220: 65 2c 20 7a 53 71 6c 2c 20 26 7a 45 72 72 4d 73  e, zSql, &zErrMs
2230: 67 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46  g);.  sqlite3DbF
2240: 72 65 65 28 64 62 2c 20 7a 45 72 72 4d 73 67 29  ree(db, zErrMsg)
2250: 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  ;.  sqlite3DbFre
2260: 65 28 64 62 2c 20 7a 53 71 6c 29 3b 0a 20 20 6d  e(db, zSql);.  m
2270: 65 6d 63 70 79 28 50 41 52 53 45 5f 54 41 49 4c  emcpy(PARSE_TAIL
2280: 28 70 50 61 72 73 65 29 2c 20 73 61 76 65 42 75  (pParse), saveBu
2290: 66 2c 20 50 41 52 53 45 5f 54 41 49 4c 5f 53 5a  f, PARSE_TAIL_SZ
22a0: 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 65 73  );.  pParse->nes
22b0: 74 65 64 2d 2d 3b 0a 7d 0a 0a 23 69 66 20 53 51  ted--;.}..#if SQ
22c0: 4c 49 54 45 5f 55 53 45 52 5f 41 55 54 48 45 4e  LITE_USER_AUTHEN
22d0: 54 49 43 41 54 49 4f 4e 0a 2f 2a 0a 2a 2a 20 52  TICATION./*.** R
22e0: 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 7a 54  eturn TRUE if zT
22f0: 61 62 6c 65 20 69 73 20 74 68 65 20 6e 61 6d 65  able is the name
2300: 20 6f 66 20 74 68 65 20 73 79 73 74 65 6d 20 74   of the system t
2310: 61 62 6c 65 20 74 68 61 74 20 73 74 6f 72 65 73  able that stores
2320: 20 74 68 65 0a 2a 2a 20 6c 69 73 74 20 6f 66 20   the.** list of 
2330: 75 73 65 72 73 20 61 6e 64 20 74 68 65 69 72 20  users and their 
2340: 61 63 63 65 73 73 20 63 72 65 64 65 6e 74 69 61  access credentia
2350: 6c 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ls..*/.int sqlit
2360: 65 33 55 73 65 72 41 75 74 68 54 61 62 6c 65 28  e3UserAuthTable(
2370: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62  const char *zTab
2380: 6c 65 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71  le){.  return sq
2390: 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28 7a 54  lite3_stricmp(zT
23a0: 61 62 6c 65 2c 20 22 73 71 6c 69 74 65 5f 75 73  able, "sqlite_us
23b0: 65 72 22 29 3d 3d 30 3b 0a 7d 0a 23 65 6e 64 69  er")==0;.}.#endi
23c0: 66 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61 74 65 20  f../*.** Locate 
23d0: 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 73 74  the in-memory st
23e0: 72 75 63 74 75 72 65 20 74 68 61 74 20 64 65 73  ructure that des
23f0: 63 72 69 62 65 73 20 61 20 70 61 72 74 69 63 75  cribes a particu
2400: 6c 61 72 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  lar database.** 
2410: 74 61 62 6c 65 20 67 69 76 65 6e 20 74 68 65 20  table given the 
2420: 6e 61 6d 65 20 6f 66 20 74 68 61 74 20 74 61 62  name of that tab
2430: 6c 65 20 61 6e 64 20 28 6f 70 74 69 6f 6e 61 6c  le and (optional
2440: 6c 79 29 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  ly) the name of 
2450: 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  the.** database 
2460: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 74  containing the t
2470: 61 62 6c 65 2e 20 20 52 65 74 75 72 6e 20 4e 55  able.  Return NU
2480: 4c 4c 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e  LL if not found.
2490: 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 44 61 74 61 62  .**.** If zDatab
24a0: 61 73 65 20 69 73 20 30 2c 20 61 6c 6c 20 64 61  ase is 0, all da
24b0: 74 61 62 61 73 65 73 20 61 72 65 20 73 65 61 72  tabases are sear
24c0: 63 68 65 64 20 66 6f 72 20 74 68 65 20 74 61 62  ched for the tab
24d0: 6c 65 20 61 6e 64 20 74 68 65 0a 2a 2a 20 66 69  le and the.** fi
24e0: 72 73 74 20 6d 61 74 63 68 69 6e 67 20 74 61 62  rst matching tab
24f0: 6c 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  le is returned. 
2500: 20 28 4e 6f 20 63 68 65 63 6b 69 6e 67 20 66 6f   (No checking fo
2510: 72 20 64 75 70 6c 69 63 61 74 65 20 74 61 62 6c  r duplicate tabl
2520: 65 0a 2a 2a 20 6e 61 6d 65 73 20 69 73 20 64 6f  e.** names is do
2530: 6e 65 2e 29 20 20 54 68 65 20 73 65 61 72 63 68  ne.)  The search
2540: 20 6f 72 64 65 72 20 69 73 20 54 45 4d 50 20 66   order is TEMP f
2550: 69 72 73 74 2c 20 74 68 65 6e 20 4d 41 49 4e 2c  irst, then MAIN,
2560: 20 74 68 65 6e 20 61 6e 79 0a 2a 2a 20 61 75 78   then any.** aux
2570: 69 6c 69 61 72 79 20 64 61 74 61 62 61 73 65 73  iliary databases
2580: 20 61 64 64 65 64 20 75 73 69 6e 67 20 74 68 65   added using the
2590: 20 41 54 54 41 43 48 20 63 6f 6d 6d 61 6e 64 2e   ATTACH command.
25a0: 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20  .**.** See also 
25b0: 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62  sqlite3LocateTab
25c0: 6c 65 28 29 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a  le()..*/.Table *
25d0: 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65  sqlite3FindTable
25e0: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f  (sqlite3 *db, co
25f0: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c  nst char *zName,
2600: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 61   const char *zDa
2610: 74 61 62 61 73 65 29 7b 0a 20 20 54 61 62 6c 65  tabase){.  Table
2620: 20 2a 70 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69   *p = 0;.  int i
2630: 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 20 6d 75 74 65  ;..  /* All mute
2640: 78 65 73 20 61 72 65 20 72 65 71 75 69 72 65 64  xes are required
2650: 20 66 6f 72 20 73 63 68 65 6d 61 20 61 63 63 65   for schema acce
2660: 73 73 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 77  ss.  Make sure w
2670: 65 20 68 6f 6c 64 20 74 68 65 6d 2e 20 2a 2f 0a  e hold them. */.
2680: 20 20 61 73 73 65 72 74 28 20 7a 44 61 74 61 62    assert( zDatab
2690: 61 73 65 21 3d 30 20 7c 7c 20 73 71 6c 69 74 65  ase!=0 || sqlite
26a0: 33 42 74 72 65 65 48 6f 6c 64 73 41 6c 6c 4d 75  3BtreeHoldsAllMu
26b0: 74 65 78 65 73 28 64 62 29 20 29 3b 0a 23 69 66  texes(db) );.#if
26c0: 20 53 51 4c 49 54 45 5f 55 53 45 52 5f 41 55 54   SQLITE_USER_AUT
26d0: 48 45 4e 54 49 43 41 54 49 4f 4e 0a 20 20 2f 2a  HENTICATION.  /*
26e0: 20 4f 6e 6c 79 20 74 68 65 20 61 64 6d 69 6e 20   Only the admin 
26f0: 75 73 65 72 20 69 73 20 61 6c 6c 6f 77 65 64 20  user is allowed 
2700: 74 6f 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65  to know that the
2710: 20 73 71 6c 69 74 65 5f 75 73 65 72 20 74 61 62   sqlite_user tab
2720: 6c 65 0a 20 20 2a 2a 20 65 78 69 73 74 73 20 2a  le.  ** exists *
2730: 2f 0a 20 20 69 66 28 20 64 62 2d 3e 61 75 74 68  /.  if( db->auth
2740: 2e 61 75 74 68 4c 65 76 65 6c 3c 55 41 55 54 48  .authLevel<UAUTH
2750: 5f 41 64 6d 69 6e 20 26 26 20 73 71 6c 69 74 65  _Admin && sqlite
2760: 33 55 73 65 72 41 75 74 68 54 61 62 6c 65 28 7a  3UserAuthTable(z
2770: 4e 61 6d 65 29 21 3d 30 20 29 7b 0a 20 20 20 20  Name)!=0 ){.    
2780: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 23 65  return 0;.  }.#e
2790: 6e 64 69 66 0a 20 20 66 6f 72 28 69 3d 4f 4d 49  ndif.  for(i=OMI
27a0: 54 5f 54 45 4d 50 44 42 3b 20 69 3c 64 62 2d 3e  T_TEMPDB; i<db->
27b0: 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  nDb; i++){.    i
27c0: 6e 74 20 6a 20 3d 20 28 69 3c 32 29 20 3f 20 69  nt j = (i<2) ? i
27d0: 5e 31 20 3a 20 69 3b 20 20 20 2f 2a 20 53 65 61  ^1 : i;   /* Sea
27e0: 72 63 68 20 54 45 4d 50 20 62 65 66 6f 72 65 20  rch TEMP before 
27f0: 4d 41 49 4e 20 2a 2f 0a 20 20 20 20 69 66 28 20  MAIN */.    if( 
2800: 7a 44 61 74 61 62 61 73 65 3d 3d 30 20 7c 7c 20  zDatabase==0 || 
2810: 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a  sqlite3StrICmp(z
2820: 44 61 74 61 62 61 73 65 2c 20 64 62 2d 3e 61 44  Database, db->aD
2830: 62 5b 6a 5d 2e 7a 44 62 53 4e 61 6d 65 29 3d 3d  b[j].zDbSName)==
2840: 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  0 ){.      asser
2850: 74 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61  t( sqlite3Schema
2860: 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20 6a 2c  MutexHeld(db, j,
2870: 20 30 29 20 29 3b 0a 20 20 20 20 20 20 70 20 3d   0) );.      p =
2880: 20 73 71 6c 69 74 65 33 48 61 73 68 46 69 6e 64   sqlite3HashFind
2890: 28 26 64 62 2d 3e 61 44 62 5b 6a 5d 2e 70 53 63  (&db->aDb[j].pSc
28a0: 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68 2c 20 7a  hema->tblHash, z
28b0: 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 69 66 28  Name);.      if(
28c0: 20 70 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20   p ) break;.    
28d0: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  }.  }.  return p
28e0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61 74  ;.}../*.** Locat
28f0: 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20  e the in-memory 
2900: 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20 64  structure that d
2910: 65 73 63 72 69 62 65 73 20 61 20 70 61 72 74 69  escribes a parti
2920: 63 75 6c 61 72 20 64 61 74 61 62 61 73 65 0a 2a  cular database.*
2930: 2a 20 74 61 62 6c 65 20 67 69 76 65 6e 20 74 68  * table given th
2940: 65 20 6e 61 6d 65 20 6f 66 20 74 68 61 74 20 74  e name of that t
2950: 61 62 6c 65 20 61 6e 64 20 28 6f 70 74 69 6f 6e  able and (option
2960: 61 6c 6c 79 29 20 74 68 65 20 6e 61 6d 65 20 6f  ally) the name o
2970: 66 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73  f the.** databas
2980: 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  e containing the
2990: 20 74 61 62 6c 65 2e 20 20 52 65 74 75 72 6e 20   table.  Return 
29a0: 4e 55 4c 4c 20 69 66 20 6e 6f 74 20 66 6f 75 6e  NULL if not foun
29b0: 64 2e 20 20 41 6c 73 6f 20 6c 65 61 76 65 20 61  d.  Also leave a
29c0: 6e 0a 2a 2a 20 65 72 72 6f 72 20 6d 65 73 73 61  n.** error messa
29d0: 67 65 20 69 6e 20 70 50 61 72 73 65 2d 3e 7a 45  ge in pParse->zE
29e0: 72 72 4d 73 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  rrMsg..**.** The
29f0: 20 64 69 66 66 65 72 65 6e 63 65 20 62 65 74 77   difference betw
2a00: 65 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  een this routine
2a10: 20 61 6e 64 20 73 71 6c 69 74 65 33 46 69 6e 64   and sqlite3Find
2a20: 54 61 62 6c 65 28 29 20 69 73 20 74 68 61 74 20  Table() is that 
2a30: 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20  this.** routine 
2a40: 6c 65 61 76 65 73 20 61 6e 20 65 72 72 6f 72 20  leaves an error 
2a50: 6d 65 73 73 61 67 65 20 69 6e 20 70 50 61 72 73  message in pPars
2a60: 65 2d 3e 7a 45 72 72 4d 73 67 20 77 68 65 72 65  e->zErrMsg where
2a70: 0a 2a 2a 20 73 71 6c 69 74 65 33 46 69 6e 64 54  .** sqlite3FindT
2a80: 61 62 6c 65 28 29 20 64 6f 65 73 20 6e 6f 74 2e  able() does not.
2a90: 0a 2a 2f 0a 54 61 62 6c 65 20 2a 73 71 6c 69 74  .*/.Table *sqlit
2aa0: 65 33 4c 6f 63 61 74 65 54 61 62 6c 65 28 0a 20  e3LocateTable(. 
2ab0: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
2ac0: 20 20 20 20 20 20 20 20 2f 2a 20 63 6f 6e 74 65          /* conte
2ad0: 78 74 20 69 6e 20 77 68 69 63 68 20 74 6f 20 72  xt in which to r
2ae0: 65 70 6f 72 74 20 65 72 72 6f 72 73 20 2a 2f 0a  eport errors */.
2af0: 20 20 75 33 32 20 66 6c 61 67 73 2c 20 20 20 20    u32 flags,    
2b00: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 4f 43 41           /* LOCA
2b10: 54 45 5f 56 49 45 57 20 6f 72 20 4c 4f 43 41 54  TE_VIEW or LOCAT
2b20: 45 5f 4e 4f 45 52 52 20 2a 2f 0a 20 20 63 6f 6e  E_NOERR */.  con
2b30: 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20  st char *zName, 
2b40: 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
2b50: 68 65 20 74 61 62 6c 65 20 77 65 20 61 72 65 20  he table we are 
2b60: 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 2a 2f 0a 20  looking for */. 
2b70: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62   const char *zDb
2b80: 61 73 65 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20  ase     /* Name 
2b90: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  of the database.
2ba0: 20 20 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20    Might be NULL 
2bb0: 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70  */.){.  Table *p
2bc0: 3b 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74 68 65  ;..  /* Read the
2bd0: 20 64 61 74 61 62 61 73 65 20 73 63 68 65 6d 61   database schema
2be0: 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  . If an error oc
2bf0: 63 75 72 73 2c 20 6c 65 61 76 65 20 61 6e 20 65  curs, leave an e
2c00: 72 72 6f 72 20 6d 65 73 73 61 67 65 0a 20 20 2a  rror message.  *
2c10: 2a 20 61 6e 64 20 63 6f 64 65 20 69 6e 20 70 50  * and code in pP
2c20: 61 72 73 65 20 61 6e 64 20 72 65 74 75 72 6e 20  arse and return 
2c30: 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 69 66 28 20 53  NULL. */.  if( S
2c40: 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65  QLITE_OK!=sqlite
2c50: 33 52 65 61 64 53 63 68 65 6d 61 28 70 50 61 72  3ReadSchema(pPar
2c60: 73 65 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  se) ){.    retur
2c70: 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 70 20 3d 20  n 0;.  }..  p = 
2c80: 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65  sqlite3FindTable
2c90: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 7a 4e 61  (pParse->db, zNa
2ca0: 6d 65 2c 20 7a 44 62 61 73 65 29 3b 0a 20 20 69  me, zDbase);.  i
2cb0: 66 28 20 70 3d 3d 30 20 29 7b 0a 20 20 20 20 63  f( p==0 ){.    c
2cc0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 73 67 20  onst char *zMsg 
2cd0: 3d 20 66 6c 61 67 73 20 26 20 4c 4f 43 41 54 45  = flags & LOCATE
2ce0: 5f 56 49 45 57 20 3f 20 22 6e 6f 20 73 75 63 68  _VIEW ? "no such
2cf0: 20 76 69 65 77 22 20 3a 20 22 6e 6f 20 73 75 63   view" : "no suc
2d00: 68 20 74 61 62 6c 65 22 3b 0a 23 69 66 6e 64 65  h table";.#ifnde
2d10: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
2d20: 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 69  RTUALTABLE.    i
2d30: 66 28 20 73 71 6c 69 74 65 33 46 69 6e 64 44 62  f( sqlite3FindDb
2d40: 4e 61 6d 65 28 70 50 61 72 73 65 2d 3e 64 62 2c  Name(pParse->db,
2d50: 20 7a 44 62 61 73 65 29 3c 31 20 29 7b 0a 20 20   zDbase)<1 ){.  
2d60: 20 20 20 20 2f 2a 20 49 66 20 7a 4e 61 6d 65 20      /* If zName 
2d70: 69 73 20 74 68 65 20 6e 6f 74 20 74 68 65 20 6e  is the not the n
2d80: 61 6d 65 20 6f 66 20 61 20 74 61 62 6c 65 20 69  ame of a table i
2d90: 6e 20 74 68 65 20 73 63 68 65 6d 61 20 63 72 65  n the schema cre
2da0: 61 74 65 64 20 75 73 69 6e 67 0a 20 20 20 20 20  ated using.     
2db0: 20 2a 2a 20 43 52 45 41 54 45 2c 20 74 68 65 6e   ** CREATE, then
2dc0: 20 63 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   check to see if
2dd0: 20 69 74 20 69 73 20 74 68 65 20 6e 61 6d 65 20   it is the name 
2de0: 6f 66 20 61 6e 20 76 69 72 74 75 61 6c 20 74 61  of an virtual ta
2df0: 62 6c 65 20 74 68 61 74 0a 20 20 20 20 20 20 2a  ble that.      *
2e00: 2a 20 63 61 6e 20 62 65 20 61 6e 20 65 70 6f 6e  * can be an epon
2e10: 79 6d 6f 75 73 20 76 69 72 74 75 61 6c 20 74 61  ymous virtual ta
2e20: 62 6c 65 2e 20 2a 2f 0a 20 20 20 20 20 20 4d 6f  ble. */.      Mo
2e30: 64 75 6c 65 20 2a 70 4d 6f 64 20 3d 20 28 4d 6f  dule *pMod = (Mo
2e40: 64 75 6c 65 2a 29 73 71 6c 69 74 65 33 48 61 73  dule*)sqlite3Has
2e50: 68 46 69 6e 64 28 26 70 50 61 72 73 65 2d 3e 64  hFind(&pParse->d
2e60: 62 2d 3e 61 4d 6f 64 75 6c 65 2c 20 7a 4e 61 6d  b->aModule, zNam
2e70: 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4d  e);.      if( pM
2e80: 6f 64 20 26 26 20 73 71 6c 69 74 65 33 56 74 61  od && sqlite3Vta
2e90: 62 45 70 6f 6e 79 6d 6f 75 73 54 61 62 6c 65 49  bEponymousTableI
2ea0: 6e 69 74 28 70 50 61 72 73 65 2c 20 70 4d 6f 64  nit(pParse, pMod
2eb0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  ) ){.        ret
2ec0: 75 72 6e 20 70 4d 6f 64 2d 3e 70 45 70 6f 54 61  urn pMod->pEpoTa
2ed0: 62 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  b;.      }.    }
2ee0: 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20  .#endif.    if( 
2ef0: 28 66 6c 61 67 73 20 26 20 4c 4f 43 41 54 45 5f  (flags & LOCATE_
2f00: 4e 4f 45 52 52 29 3d 3d 30 20 29 7b 0a 20 20 20  NOERR)==0 ){.   
2f10: 20 20 20 69 66 28 20 7a 44 62 61 73 65 20 29 7b     if( zDbase ){
2f20: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
2f30: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
2f40: 20 22 25 73 3a 20 25 73 2e 25 73 22 2c 20 7a 4d   "%s: %s.%s", zM
2f50: 73 67 2c 20 7a 44 62 61 73 65 2c 20 7a 4e 61 6d  sg, zDbase, zNam
2f60: 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  e);.      }else{
2f70: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
2f80: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
2f90: 20 22 25 73 3a 20 25 73 22 2c 20 7a 4d 73 67 2c   "%s: %s", zMsg,
2fa0: 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d   zName);.      }
2fb0: 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 63  .      pParse->c
2fc0: 68 65 63 6b 53 63 68 65 6d 61 20 3d 20 31 3b 0a  heckSchema = 1;.
2fd0: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74      }.  }..  ret
2fe0: 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn p;.}../*.** 
2ff0: 4c 6f 63 61 74 65 20 74 68 65 20 74 61 62 6c 65  Locate the table
3000: 20 69 64 65 6e 74 69 66 69 65 64 20 62 79 20 2a   identified by *
3010: 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73  p..**.** This is
3020: 20 61 20 77 72 61 70 70 65 72 20 61 72 6f 75 6e   a wrapper aroun
3030: 64 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54  d sqlite3LocateT
3040: 61 62 6c 65 28 29 2e 20 54 68 65 20 64 69 66 66  able(). The diff
3050: 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e 0a 2a  erence between.*
3060: 2a 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54  * sqlite3LocateT
3070: 61 62 6c 65 28 29 20 61 6e 64 20 74 68 69 73 20  able() and this 
3080: 66 75 6e 63 74 69 6f 6e 20 69 73 20 74 68 61 74  function is that
3090: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   this function r
30a0: 65 73 74 72 69 63 74 73 0a 2a 2a 20 74 68 65 20  estricts.** the 
30b0: 73 65 61 72 63 68 20 74 6f 20 73 63 68 65 6d 61  search to schema
30c0: 20 28 70 2d 3e 70 53 63 68 65 6d 61 29 20 69 66   (p->pSchema) if
30d0: 20 69 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2e   it is not NULL.
30e0: 20 70 2d 3e 70 53 63 68 65 6d 61 20 6d 61 79 20   p->pSchema may 
30f0: 62 65 0a 2a 2a 20 6e 6f 6e 2d 4e 55 4c 4c 20 69  be.** non-NULL i
3100: 66 20 69 74 20 69 73 20 70 61 72 74 20 6f 66 20  f it is part of 
3110: 61 20 76 69 65 77 20 6f 72 20 74 72 69 67 67 65  a view or trigge
3120: 72 20 70 72 6f 67 72 61 6d 20 64 65 66 69 6e 69  r program defini
3130: 74 69 6f 6e 2e 20 53 65 65 0a 2a 2a 20 73 71 6c  tion. See.** sql
3140: 69 74 65 33 46 69 78 53 72 63 4c 69 73 74 28 29  ite3FixSrcList()
3150: 20 66 6f 72 20 64 65 74 61 69 6c 73 2e 0a 2a 2f   for details..*/
3160: 0a 54 61 62 6c 65 20 2a 73 71 6c 69 74 65 33 4c  .Table *sqlite3L
3170: 6f 63 61 74 65 54 61 62 6c 65 49 74 65 6d 28 0a  ocateTableItem(.
3180: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
3190: 20 0a 20 20 75 33 32 20 66 6c 61 67 73 2c 0a 20   .  u32 flags,. 
31a0: 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
31b0: 69 74 65 6d 20 2a 70 0a 29 7b 0a 20 20 63 6f 6e  item *p.){.  con
31c0: 73 74 20 63 68 61 72 20 2a 7a 44 62 3b 0a 20 20  st char *zDb;.  
31d0: 61 73 73 65 72 74 28 20 70 2d 3e 70 53 63 68 65  assert( p->pSche
31e0: 6d 61 3d 3d 30 20 7c 7c 20 70 2d 3e 7a 44 61 74  ma==0 || p->zDat
31f0: 61 62 61 73 65 3d 3d 30 20 29 3b 0a 20 20 69 66  abase==0 );.  if
3200: 28 20 70 2d 3e 70 53 63 68 65 6d 61 20 29 7b 0a  ( p->pSchema ){.
3210: 20 20 20 20 69 6e 74 20 69 44 62 20 3d 20 73 71      int iDb = sq
3220: 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64  lite3SchemaToInd
3230: 65 78 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  ex(pParse->db, p
3240: 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20  ->pSchema);.    
3250: 7a 44 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  zDb = pParse->db
3260: 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 44 62 53 4e  ->aDb[iDb].zDbSN
3270: 61 6d 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ame;.  }else{.  
3280: 20 20 7a 44 62 20 3d 20 70 2d 3e 7a 44 61 74 61    zDb = p->zData
3290: 62 61 73 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75  base;.  }.  retu
32a0: 72 6e 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65  rn sqlite3Locate
32b0: 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 66 6c  Table(pParse, fl
32c0: 61 67 73 2c 20 70 2d 3e 7a 4e 61 6d 65 2c 20 7a  ags, p->zName, z
32d0: 44 62 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f  Db);.}../*.** Lo
32e0: 63 61 74 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f  cate the in-memo
32f0: 72 79 20 73 74 72 75 63 74 75 72 65 20 74 68 61  ry structure tha
3300: 74 20 64 65 73 63 72 69 62 65 73 20 0a 2a 2a 20  t describes .** 
3310: 61 20 70 61 72 74 69 63 75 6c 61 72 20 69 6e 64  a particular ind
3320: 65 78 20 67 69 76 65 6e 20 74 68 65 20 6e 61 6d  ex given the nam
3330: 65 20 6f 66 20 74 68 61 74 20 69 6e 64 65 78 0a  e of that index.
3340: 2a 2a 20 61 6e 64 20 74 68 65 20 6e 61 6d 65 20  ** and the name 
3350: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
3360: 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68  that contains th
3370: 65 20 69 6e 64 65 78 2e 0a 2a 2a 20 52 65 74 75  e index..** Retu
3380: 72 6e 20 4e 55 4c 4c 20 69 66 20 6e 6f 74 20 66  rn NULL if not f
3390: 6f 75 6e 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a  ound..**.** If z
33a0: 44 61 74 61 62 61 73 65 20 69 73 20 30 2c 20 61  Database is 0, a
33b0: 6c 6c 20 64 61 74 61 62 61 73 65 73 20 61 72 65  ll databases are
33c0: 20 73 65 61 72 63 68 65 64 20 66 6f 72 20 74 68   searched for th
33d0: 65 0a 2a 2a 20 74 61 62 6c 65 20 61 6e 64 20 74  e.** table and t
33e0: 68 65 20 66 69 72 73 74 20 6d 61 74 63 68 69 6e  he first matchin
33f0: 67 20 69 6e 64 65 78 20 69 73 20 72 65 74 75 72  g index is retur
3400: 6e 65 64 2e 20 20 28 4e 6f 20 63 68 65 63 6b 69  ned.  (No checki
3410: 6e 67 0a 2a 2a 20 66 6f 72 20 64 75 70 6c 69 63  ng.** for duplic
3420: 61 74 65 20 69 6e 64 65 78 20 6e 61 6d 65 73 20  ate index names 
3430: 69 73 20 64 6f 6e 65 2e 29 20 20 54 68 65 20 73  is done.)  The s
3440: 65 61 72 63 68 20 6f 72 64 65 72 20 69 73 0a 2a  earch order is.*
3450: 2a 20 54 45 4d 50 20 66 69 72 73 74 2c 20 74 68  * TEMP first, th
3460: 65 6e 20 4d 41 49 4e 2c 20 74 68 65 6e 20 61 6e  en MAIN, then an
3470: 79 20 61 75 78 69 6c 69 61 72 79 20 64 61 74 61  y auxiliary data
3480: 62 61 73 65 73 20 61 64 64 65 64 0a 2a 2a 20 75  bases added.** u
3490: 73 69 6e 67 20 74 68 65 20 41 54 54 41 43 48 20  sing the ATTACH 
34a0: 63 6f 6d 6d 61 6e 64 2e 0a 2a 2f 0a 49 6e 64 65  command..*/.Inde
34b0: 78 20 2a 73 71 6c 69 74 65 33 46 69 6e 64 49 6e  x *sqlite3FindIn
34c0: 64 65 78 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  dex(sqlite3 *db,
34d0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
34e0: 6d 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  me, const char *
34f0: 7a 44 62 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70  zDb){.  Index *p
3500: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 20   = 0;.  int i;. 
3510: 20 2f 2a 20 41 6c 6c 20 6d 75 74 65 78 65 73 20   /* All mutexes 
3520: 61 72 65 20 72 65 71 75 69 72 65 64 20 66 6f 72  are required for
3530: 20 73 63 68 65 6d 61 20 61 63 63 65 73 73 2e 20   schema access. 
3540: 20 4d 61 6b 65 20 73 75 72 65 20 77 65 20 68 6f   Make sure we ho
3550: 6c 64 20 74 68 65 6d 2e 20 2a 2f 0a 20 20 61 73  ld them. */.  as
3560: 73 65 72 74 28 20 7a 44 62 21 3d 30 20 7c 7c 20  sert( zDb!=0 || 
3570: 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64  sqlite3BtreeHold
3580: 73 41 6c 6c 4d 75 74 65 78 65 73 28 64 62 29 20  sAllMutexes(db) 
3590: 29 3b 0a 20 20 66 6f 72 28 69 3d 4f 4d 49 54 5f  );.  for(i=OMIT_
35a0: 54 45 4d 50 44 42 3b 20 69 3c 64 62 2d 3e 6e 44  TEMPDB; i<db->nD
35b0: 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74  b; i++){.    int
35c0: 20 6a 20 3d 20 28 69 3c 32 29 20 3f 20 69 5e 31   j = (i<2) ? i^1
35d0: 20 3a 20 69 3b 20 20 2f 2a 20 53 65 61 72 63 68   : i;  /* Search
35e0: 20 54 45 4d 50 20 62 65 66 6f 72 65 20 4d 41 49   TEMP before MAI
35f0: 4e 20 2a 2f 0a 20 20 20 20 53 63 68 65 6d 61 20  N */.    Schema 
3600: 2a 70 53 63 68 65 6d 61 20 3d 20 64 62 2d 3e 61  *pSchema = db->a
3610: 44 62 5b 6a 5d 2e 70 53 63 68 65 6d 61 3b 0a 20  Db[j].pSchema;. 
3620: 20 20 20 61 73 73 65 72 74 28 20 70 53 63 68 65     assert( pSche
3630: 6d 61 20 29 3b 0a 20 20 20 20 69 66 28 20 7a 44  ma );.    if( zD
3640: 62 20 26 26 20 73 71 6c 69 74 65 33 53 74 72 49  b && sqlite3StrI
3650: 43 6d 70 28 7a 44 62 2c 20 64 62 2d 3e 61 44 62  Cmp(zDb, db->aDb
3660: 5b 6a 5d 2e 7a 44 62 53 4e 61 6d 65 29 20 29 20  [j].zDbSName) ) 
3670: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 61 73  continue;.    as
3680: 73 65 72 74 28 20 73 71 6c 69 74 65 33 53 63 68  sert( sqlite3Sch
3690: 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c  emaMutexHeld(db,
36a0: 20 6a 2c 20 30 29 20 29 3b 0a 20 20 20 20 70 20   j, 0) );.    p 
36b0: 3d 20 73 71 6c 69 74 65 33 48 61 73 68 46 69 6e  = sqlite3HashFin
36c0: 64 28 26 70 53 63 68 65 6d 61 2d 3e 69 64 78 48  d(&pSchema->idxH
36d0: 61 73 68 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20  ash, zName);.   
36e0: 20 69 66 28 20 70 20 29 20 62 72 65 61 6b 3b 0a   if( p ) break;.
36f0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a    }.  return p;.
3700: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6c 61 69 6d  }../*.** Reclaim
3710: 20 74 68 65 20 6d 65 6d 6f 72 79 20 75 73 65 64   the memory used
3720: 20 62 79 20 61 6e 20 69 6e 64 65 78 0a 2a 2f 0a   by an index.*/.
3730: 73 74 61 74 69 63 20 76 6f 69 64 20 66 72 65 65  static void free
3740: 49 6e 64 65 78 28 73 71 6c 69 74 65 33 20 2a 64  Index(sqlite3 *d
3750: 62 2c 20 49 6e 64 65 78 20 2a 70 29 7b 0a 23 69  b, Index *p){.#i
3760: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
3770: 54 5f 41 4e 41 4c 59 5a 45 0a 20 20 73 71 6c 69  T_ANALYZE.  sqli
3780: 74 65 33 44 65 6c 65 74 65 49 6e 64 65 78 53 61  te3DeleteIndexSa
3790: 6d 70 6c 65 73 28 64 62 2c 20 70 29 3b 0a 23 65  mples(db, p);.#e
37a0: 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33 45 78  ndif.  sqlite3Ex
37b0: 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e  prDelete(db, p->
37c0: 70 50 61 72 74 49 64 78 57 68 65 72 65 29 3b 0a  pPartIdxWhere);.
37d0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
37e0: 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 61  tDelete(db, p->a
37f0: 43 6f 6c 45 78 70 72 29 3b 0a 20 20 73 71 6c 69  ColExpr);.  sqli
3800: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d  te3DbFree(db, p-
3810: 3e 7a 43 6f 6c 41 66 66 29 3b 0a 20 20 69 66 28  >zColAff);.  if(
3820: 20 70 2d 3e 69 73 52 65 73 69 7a 65 64 20 29 20   p->isResized ) 
3830: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
3840: 2c 20 28 76 6f 69 64 20 2a 29 70 2d 3e 61 7a 43  , (void *)p->azC
3850: 6f 6c 6c 29 3b 0a 23 69 66 64 65 66 20 53 51 4c  oll);.#ifdef SQL
3860: 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33  ITE_ENABLE_STAT3
3870: 5f 4f 52 5f 53 54 41 54 34 0a 20 20 73 71 6c 69  _OR_STAT4.  sqli
3880: 74 65 33 5f 66 72 65 65 28 70 2d 3e 61 69 52 6f  te3_free(p->aiRo
3890: 77 45 73 74 29 3b 0a 23 65 6e 64 69 66 0a 20 20  wEst);.#endif.  
38a0: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
38b0: 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  , p);.}../*.** F
38c0: 6f 72 20 74 68 65 20 69 6e 64 65 78 20 63 61 6c  or the index cal
38d0: 6c 65 64 20 7a 49 64 78 4e 61 6d 65 20 77 68 69  led zIdxName whi
38e0: 63 68 20 69 73 20 66 6f 75 6e 64 20 69 6e 20 74  ch is found in t
38f0: 68 65 20 64 61 74 61 62 61 73 65 20 69 44 62 2c  he database iDb,
3900: 0a 2a 2a 20 75 6e 6c 69 6b 65 20 74 68 61 74 20  .** unlike that 
3910: 69 6e 64 65 78 20 66 72 6f 6d 20 69 74 73 20 54  index from its T
3920: 61 62 6c 65 20 74 68 65 6e 20 72 65 6d 6f 76 65  able then remove
3930: 20 74 68 65 20 69 6e 64 65 78 20 66 72 6f 6d 0a   the index from.
3940: 2a 2a 20 74 68 65 20 69 6e 64 65 78 20 68 61 73  ** the index has
3950: 68 20 74 61 62 6c 65 20 61 6e 64 20 66 72 65 65  h table and free
3960: 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 73 74 72 75   all memory stru
3970: 63 74 75 72 65 73 20 61 73 73 6f 63 69 61 74 65  ctures associate
3980: 64 0a 2a 2a 20 77 69 74 68 20 74 68 65 20 69 6e  d.** with the in
3990: 64 65 78 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  dex..*/.void sql
39a0: 69 74 65 33 55 6e 6c 69 6e 6b 41 6e 64 44 65 6c  ite3UnlinkAndDel
39b0: 65 74 65 49 6e 64 65 78 28 73 71 6c 69 74 65 33  eteIndex(sqlite3
39c0: 20 2a 64 62 2c 20 69 6e 74 20 69 44 62 2c 20 63   *db, int iDb, c
39d0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 64 78 4e  onst char *zIdxN
39e0: 61 6d 65 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70  ame){.  Index *p
39f0: 49 6e 64 65 78 3b 0a 20 20 48 61 73 68 20 2a 70  Index;.  Hash *p
3a00: 48 61 73 68 3b 0a 0a 20 20 61 73 73 65 72 74 28  Hash;..  assert(
3a10: 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75   sqlite3SchemaMu
3a20: 74 65 78 48 65 6c 64 28 64 62 2c 20 69 44 62 2c  texHeld(db, iDb,
3a30: 20 30 29 20 29 3b 0a 20 20 70 48 61 73 68 20 3d   0) );.  pHash =
3a40: 20 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70   &db->aDb[iDb].p
3a50: 53 63 68 65 6d 61 2d 3e 69 64 78 48 61 73 68 3b  Schema->idxHash;
3a60: 0a 20 20 70 49 6e 64 65 78 20 3d 20 73 71 6c 69  .  pIndex = sqli
3a70: 74 65 33 48 61 73 68 49 6e 73 65 72 74 28 70 48  te3HashInsert(pH
3a80: 61 73 68 2c 20 7a 49 64 78 4e 61 6d 65 2c 20 30  ash, zIdxName, 0
3a90: 29 3b 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28  );.  if( ALWAYS(
3aa0: 70 49 6e 64 65 78 29 20 29 7b 0a 20 20 20 20 69  pIndex) ){.    i
3ab0: 66 28 20 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c  f( pIndex->pTabl
3ac0: 65 2d 3e 70 49 6e 64 65 78 3d 3d 70 49 6e 64 65  e->pIndex==pInde
3ad0: 78 20 29 7b 0a 20 20 20 20 20 20 70 49 6e 64 65  x ){.      pInde
3ae0: 78 2d 3e 70 54 61 62 6c 65 2d 3e 70 49 6e 64 65  x->pTable->pInde
3af0: 78 20 3d 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78  x = pIndex->pNex
3b00: 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  t;.    }else{.  
3b10: 20 20 20 20 49 6e 64 65 78 20 2a 70 3b 0a 20 20      Index *p;.  
3b20: 20 20 20 20 2f 2a 20 4a 75 73 74 69 66 69 63 61      /* Justifica
3b30: 74 69 6f 6e 20 6f 66 20 41 4c 57 41 59 53 28 29  tion of ALWAYS()
3b40: 3b 20 20 54 68 65 20 69 6e 64 65 78 20 6d 75 73  ;  The index mus
3b50: 74 20 62 65 20 6f 6e 20 74 68 65 20 6c 69 73 74  t be on the list
3b60: 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20 69 6e 64   of.      ** ind
3b70: 69 63 65 73 2e 20 2a 2f 0a 20 20 20 20 20 20 70  ices. */.      p
3b80: 20 3d 20 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c   = pIndex->pTabl
3b90: 65 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20 20 20  e->pIndex;.     
3ba0: 20 77 68 69 6c 65 28 20 41 4c 57 41 59 53 28 70   while( ALWAYS(p
3bb0: 29 20 26 26 20 70 2d 3e 70 4e 65 78 74 21 3d 70  ) && p->pNext!=p
3bc0: 49 6e 64 65 78 20 29 7b 20 70 20 3d 20 70 2d 3e  Index ){ p = p->
3bd0: 70 4e 65 78 74 3b 20 7d 0a 20 20 20 20 20 20 69  pNext; }.      i
3be0: 66 28 20 41 4c 57 41 59 53 28 70 20 26 26 20 70  f( ALWAYS(p && p
3bf0: 2d 3e 70 4e 65 78 74 3d 3d 70 49 6e 64 65 78 29  ->pNext==pIndex)
3c00: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 70   ){.        p->p
3c10: 4e 65 78 74 20 3d 20 70 49 6e 64 65 78 2d 3e 70  Next = pIndex->p
3c20: 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Next;.      }.  
3c30: 20 20 7d 0a 20 20 20 20 66 72 65 65 49 6e 64 65    }.    freeInde
3c40: 78 28 64 62 2c 20 70 49 6e 64 65 78 29 3b 0a 20  x(db, pIndex);. 
3c50: 20 7d 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c   }.  db->flags |
3c60: 3d 20 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43  = SQLITE_InternC
3c70: 68 61 6e 67 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  hanges;.}../*.**
3c80: 20 4c 6f 6f 6b 20 74 68 72 6f 75 67 68 20 74 68   Look through th
3c90: 65 20 6c 69 73 74 20 6f 66 20 6f 70 65 6e 20 64  e list of open d
3ca0: 61 74 61 62 61 73 65 20 66 69 6c 65 73 20 69 6e  atabase files in
3cb0: 20 64 62 2d 3e 61 44 62 5b 5d 20 61 6e 64 20 69   db->aDb[] and i
3cc0: 66 0a 2a 2a 20 61 6e 79 20 68 61 76 65 20 62 65  f.** any have be
3cd0: 65 6e 20 63 6c 6f 73 65 64 2c 20 72 65 6d 6f 76  en closed, remov
3ce0: 65 20 74 68 65 6d 20 66 72 6f 6d 20 74 68 65 20  e them from the 
3cf0: 6c 69 73 74 2e 20 20 52 65 61 6c 6c 6f 63 61 74  list.  Reallocat
3d00: 65 20 74 68 65 0a 2a 2a 20 64 62 2d 3e 61 44 62  e the.** db->aDb
3d10: 5b 5d 20 73 74 72 75 63 74 75 72 65 20 74 6f 20  [] structure to 
3d20: 61 20 73 6d 61 6c 6c 65 72 20 73 69 7a 65 2c 20  a smaller size, 
3d30: 69 66 20 70 6f 73 73 69 62 6c 65 2e 0a 2a 2a 0a  if possible..**.
3d40: 2a 2a 20 45 6e 74 72 79 20 30 20 28 74 68 65 20  ** Entry 0 (the 
3d50: 22 6d 61 69 6e 22 20 64 61 74 61 62 61 73 65 29  "main" database)
3d60: 20 61 6e 64 20 65 6e 74 72 79 20 31 20 28 74 68   and entry 1 (th
3d70: 65 20 22 74 65 6d 70 22 20 64 61 74 61 62 61 73  e "temp" databas
3d80: 65 29 0a 2a 2a 20 61 72 65 20 6e 65 76 65 72 20  e).** are never 
3d90: 63 61 6e 64 69 64 61 74 65 73 20 66 6f 72 20 62  candidates for b
3da0: 65 69 6e 67 20 63 6f 6c 6c 61 70 73 65 64 2e 0a  eing collapsed..
3db0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43  */.void sqlite3C
3dc0: 6f 6c 6c 61 70 73 65 44 61 74 61 62 61 73 65 41  ollapseDatabaseA
3dd0: 72 72 61 79 28 73 71 6c 69 74 65 33 20 2a 64 62  rray(sqlite3 *db
3de0: 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20  ){.  int i, j;. 
3df0: 20 66 6f 72 28 69 3d 6a 3d 32 3b 20 69 3c 64 62   for(i=j=2; i<db
3e00: 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nDb; i++){.   
3e10: 20 73 74 72 75 63 74 20 44 62 20 2a 70 44 62 20   struct Db *pDb 
3e20: 3d 20 26 64 62 2d 3e 61 44 62 5b 69 5d 3b 0a 20  = &db->aDb[i];. 
3e30: 20 20 20 69 66 28 20 70 44 62 2d 3e 70 42 74 3d     if( pDb->pBt=
3e40: 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
3e50: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 44  te3DbFree(db, pD
3e60: 62 2d 3e 7a 44 62 53 4e 61 6d 65 29 3b 0a 20 20  b->zDbSName);.  
3e70: 20 20 20 20 70 44 62 2d 3e 7a 44 62 53 4e 61 6d      pDb->zDbSNam
3e80: 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 63 6f 6e  e = 0;.      con
3e90: 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20  tinue;.    }.   
3ea0: 20 69 66 28 20 6a 3c 69 20 29 7b 0a 20 20 20 20   if( j<i ){.    
3eb0: 20 20 64 62 2d 3e 61 44 62 5b 6a 5d 20 3d 20 64    db->aDb[j] = d
3ec0: 62 2d 3e 61 44 62 5b 69 5d 3b 0a 20 20 20 20 7d  b->aDb[i];.    }
3ed0: 0a 20 20 20 20 6a 2b 2b 3b 0a 20 20 7d 0a 20 20  .    j++;.  }.  
3ee0: 64 62 2d 3e 6e 44 62 20 3d 20 6a 3b 0a 20 20 69  db->nDb = j;.  i
3ef0: 66 28 20 64 62 2d 3e 6e 44 62 3c 3d 32 20 26 26  f( db->nDb<=2 &&
3f00: 20 64 62 2d 3e 61 44 62 21 3d 64 62 2d 3e 61 44   db->aDb!=db->aD
3f10: 62 53 74 61 74 69 63 20 29 7b 0a 20 20 20 20 6d  bStatic ){.    m
3f20: 65 6d 63 70 79 28 64 62 2d 3e 61 44 62 53 74 61  emcpy(db->aDbSta
3f30: 74 69 63 2c 20 64 62 2d 3e 61 44 62 2c 20 32 2a  tic, db->aDb, 2*
3f40: 73 69 7a 65 6f 66 28 64 62 2d 3e 61 44 62 5b 30  sizeof(db->aDb[0
3f50: 5d 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ]));.    sqlite3
3f60: 44 62 46 72 65 65 28 64 62 2c 20 64 62 2d 3e 61  DbFree(db, db->a
3f70: 44 62 29 3b 0a 20 20 20 20 64 62 2d 3e 61 44 62  Db);.    db->aDb
3f80: 20 3d 20 64 62 2d 3e 61 44 62 53 74 61 74 69 63   = db->aDbStatic
3f90: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ;.  }.}../*.** R
3fa0: 65 73 65 74 20 74 68 65 20 73 63 68 65 6d 61 20  eset the schema 
3fb0: 66 6f 72 20 74 68 65 20 64 61 74 61 62 61 73 65  for the database
3fc0: 20 61 74 20 69 6e 64 65 78 20 69 44 62 2e 20 20   at index iDb.  
3fd0: 41 6c 73 6f 20 72 65 73 65 74 20 74 68 65 0a 2a  Also reset the.*
3fe0: 2a 20 54 45 4d 50 20 73 63 68 65 6d 61 2e 0a 2a  * TEMP schema..*
3ff0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52 65  /.void sqlite3Re
4000: 73 65 74 4f 6e 65 53 63 68 65 6d 61 28 73 71 6c  setOneSchema(sql
4010: 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 69 44  ite3 *db, int iD
4020: 62 29 7b 0a 20 20 44 62 20 2a 70 44 62 3b 0a 20  b){.  Db *pDb;. 
4030: 20 61 73 73 65 72 74 28 20 69 44 62 3c 64 62 2d   assert( iDb<db-
4040: 3e 6e 44 62 20 29 3b 0a 0a 20 20 2f 2a 20 43 61  >nDb );..  /* Ca
4050: 73 65 20 31 3a 20 20 52 65 73 65 74 20 74 68 65  se 1:  Reset the
4060: 20 73 69 6e 67 6c 65 20 73 63 68 65 6d 61 20 69   single schema i
4070: 64 65 6e 74 69 66 69 65 64 20 62 79 20 69 44 62  dentified by iDb
4080: 20 2a 2f 0a 20 20 70 44 62 20 3d 20 26 64 62 2d   */.  pDb = &db-
4090: 3e 61 44 62 5b 69 44 62 5d 3b 0a 20 20 61 73 73  >aDb[iDb];.  ass
40a0: 65 72 74 28 20 73 71 6c 69 74 65 33 53 63 68 65  ert( sqlite3Sche
40b0: 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20  maMutexHeld(db, 
40c0: 69 44 62 2c 20 30 29 20 29 3b 0a 20 20 61 73 73  iDb, 0) );.  ass
40d0: 65 72 74 28 20 70 44 62 2d 3e 70 53 63 68 65 6d  ert( pDb->pSchem
40e0: 61 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65  a!=0 );.  sqlite
40f0: 33 53 63 68 65 6d 61 43 6c 65 61 72 28 70 44 62  3SchemaClear(pDb
4100: 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 0a 20 20 2f  ->pSchema);..  /
4110: 2a 20 49 66 20 61 6e 79 20 64 61 74 61 62 61 73  * If any databas
4120: 65 20 6f 74 68 65 72 20 74 68 61 6e 20 54 45 4d  e other than TEM
4130: 50 20 69 73 20 72 65 73 65 74 2c 20 74 68 65 6e  P is reset, then
4140: 20 61 6c 73 6f 20 72 65 73 65 74 20 54 45 4d 50   also reset TEMP
4150: 0a 20 20 2a 2a 20 73 69 6e 63 65 20 54 45 4d 50  .  ** since TEMP
4160: 20 6d 69 67 68 74 20 62 65 20 68 6f 6c 64 69 6e   might be holdin
4170: 67 20 74 72 69 67 67 65 72 73 20 74 68 61 74 20  g triggers that 
4180: 72 65 66 65 72 65 6e 63 65 20 74 61 62 6c 65 73  reference tables
4190: 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20 6f 74 68   in the.  ** oth
41a0: 65 72 20 64 61 74 61 62 61 73 65 2e 0a 20 20 2a  er database..  *
41b0: 2f 0a 20 20 69 66 28 20 69 44 62 21 3d 31 20 29  /.  if( iDb!=1 )
41c0: 7b 0a 20 20 20 20 70 44 62 20 3d 20 26 64 62 2d  {.    pDb = &db-
41d0: 3e 61 44 62 5b 31 5d 3b 0a 20 20 20 20 61 73 73  >aDb[1];.    ass
41e0: 65 72 74 28 20 70 44 62 2d 3e 70 53 63 68 65 6d  ert( pDb->pSchem
41f0: 61 21 3d 30 20 29 3b 0a 20 20 20 20 73 71 6c 69  a!=0 );.    sqli
4200: 74 65 33 53 63 68 65 6d 61 43 6c 65 61 72 28 70  te3SchemaClear(p
4210: 44 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20  Db->pSchema);.  
4220: 7d 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f  }.  return;.}../
4230: 2a 0a 2a 2a 20 45 72 61 73 65 20 61 6c 6c 20 73  *.** Erase all s
4240: 63 68 65 6d 61 20 69 6e 66 6f 72 6d 61 74 69 6f  chema informatio
4250: 6e 20 66 72 6f 6d 20 61 6c 6c 20 61 74 74 61 63  n from all attac
4260: 68 65 64 20 64 61 74 61 62 61 73 65 73 20 28 69  hed databases (i
4270: 6e 63 6c 75 64 69 6e 67 0a 2a 2a 20 22 6d 61 69  ncluding.** "mai
4280: 6e 22 20 61 6e 64 20 22 74 65 6d 70 22 29 20 66  n" and "temp") f
4290: 6f 72 20 61 20 73 69 6e 67 6c 65 20 64 61 74 61  or a single data
42a0: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e  base connection.
42b0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
42c0: 52 65 73 65 74 41 6c 6c 53 63 68 65 6d 61 73 4f  ResetAllSchemasO
42d0: 66 43 6f 6e 6e 65 63 74 69 6f 6e 28 73 71 6c 69  fConnection(sqli
42e0: 74 65 33 20 2a 64 62 29 7b 0a 20 20 69 6e 74 20  te3 *db){.  int 
42f0: 69 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  i;.  sqlite3Btre
4300: 65 45 6e 74 65 72 41 6c 6c 28 64 62 29 3b 0a 20  eEnterAll(db);. 
4310: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e   for(i=0; i<db->
4320: 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 44  nDb; i++){.    D
4330: 62 20 2a 70 44 62 20 3d 20 26 64 62 2d 3e 61 44  b *pDb = &db->aD
4340: 62 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 70 44  b[i];.    if( pD
4350: 62 2d 3e 70 53 63 68 65 6d 61 20 29 7b 0a 20 20  b->pSchema ){.  
4360: 20 20 20 20 73 71 6c 69 74 65 33 53 63 68 65 6d      sqlite3Schem
4370: 61 43 6c 65 61 72 28 70 44 62 2d 3e 70 53 63 68  aClear(pDb->pSch
4380: 65 6d 61 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ema);.    }.  }.
4390: 20 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e    db->flags &= ~
43a0: 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61  SQLITE_InternCha
43b0: 6e 67 65 73 3b 0a 20 20 73 71 6c 69 74 65 33 56  nges;.  sqlite3V
43c0: 74 61 62 55 6e 6c 6f 63 6b 4c 69 73 74 28 64 62  tabUnlockList(db
43d0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
43e0: 65 4c 65 61 76 65 41 6c 6c 28 64 62 29 3b 0a 20  eLeaveAll(db);. 
43f0: 20 73 71 6c 69 74 65 33 43 6f 6c 6c 61 70 73 65   sqlite3Collapse
4400: 44 61 74 61 62 61 73 65 41 72 72 61 79 28 64 62  DatabaseArray(db
4410: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  );.}../*.** This
4420: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
4430: 65 64 20 77 68 65 6e 20 61 20 63 6f 6d 6d 69 74  ed when a commit
4440: 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 76 6f 69 64   occurs..*/.void
4450: 20 73 71 6c 69 74 65 33 43 6f 6d 6d 69 74 49 6e   sqlite3CommitIn
4460: 74 65 72 6e 61 6c 43 68 61 6e 67 65 73 28 73 71  ternalChanges(sq
4470: 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 64 62  lite3 *db){.  db
4480: 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49  ->flags &= ~SQLI
4490: 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73  TE_InternChanges
44a0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74  ;.}../*.** Delet
44b0: 65 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74  e memory allocat
44c0: 65 64 20 66 6f 72 20 74 68 65 20 63 6f 6c 75 6d  ed for the colum
44d0: 6e 20 6e 61 6d 65 73 20 6f 66 20 61 20 74 61 62  n names of a tab
44e0: 6c 65 20 6f 72 20 76 69 65 77 20 28 74 68 65 0a  le or view (the.
44f0: 2a 2a 20 54 61 62 6c 65 2e 61 43 6f 6c 5b 5d 20  ** Table.aCol[] 
4500: 61 72 72 61 79 29 2e 0a 2a 2f 0a 76 6f 69 64 20  array)..*/.void 
4510: 73 71 6c 69 74 65 33 44 65 6c 65 74 65 43 6f 6c  sqlite3DeleteCol
4520: 75 6d 6e 4e 61 6d 65 73 28 73 71 6c 69 74 65 33  umnNames(sqlite3
4530: 20 2a 64 62 2c 20 54 61 62 6c 65 20 2a 70 54 61   *db, Table *pTa
4540: 62 6c 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  ble){.  int i;. 
4550: 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20   Column *pCol;. 
4560: 20 61 73 73 65 72 74 28 20 70 54 61 62 6c 65 21   assert( pTable!
4570: 3d 30 20 29 3b 0a 20 20 69 66 28 20 28 70 43 6f  =0 );.  if( (pCo
4580: 6c 20 3d 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c  l = pTable->aCol
4590: 29 21 3d 30 20 29 7b 0a 20 20 20 20 66 6f 72 28  )!=0 ){.    for(
45a0: 69 3d 30 3b 20 69 3c 70 54 61 62 6c 65 2d 3e 6e  i=0; i<pTable->n
45b0: 43 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b  Col; i++, pCol++
45c0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
45d0: 44 62 46 72 65 65 28 64 62 2c 20 70 43 6f 6c 2d  DbFree(db, pCol-
45e0: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 73  >zName);.      s
45f0: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
4600: 28 64 62 2c 20 70 43 6f 6c 2d 3e 70 44 66 6c 74  (db, pCol->pDflt
4610: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
4620: 44 62 46 72 65 65 28 64 62 2c 20 70 43 6f 6c 2d  DbFree(db, pCol-
4630: 3e 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20 7d 0a 20  >zColl);.    }. 
4640: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
4650: 28 64 62 2c 20 70 54 61 62 6c 65 2d 3e 61 43 6f  (db, pTable->aCo
4660: 6c 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  l);.  }.}../*.**
4670: 20 52 65 6d 6f 76 65 20 74 68 65 20 6d 65 6d 6f   Remove the memo
4680: 72 79 20 64 61 74 61 20 73 74 72 75 63 74 75 72  ry data structur
4690: 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  es associated wi
46a0: 74 68 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20  th the given.** 
46b0: 54 61 62 6c 65 2e 20 20 4e 6f 20 63 68 61 6e 67  Table.  No chang
46c0: 65 73 20 61 72 65 20 6d 61 64 65 20 74 6f 20 64  es are made to d
46d0: 69 73 6b 20 62 79 20 74 68 69 73 20 72 6f 75 74  isk by this rout
46e0: 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ine..**.** This 
46f0: 72 6f 75 74 69 6e 65 20 6a 75 73 74 20 64 65 6c  routine just del
4700: 65 74 65 73 20 74 68 65 20 64 61 74 61 20 73 74  etes the data st
4710: 72 75 63 74 75 72 65 2e 20 20 49 74 20 64 6f 65  ructure.  It doe
4720: 73 20 6e 6f 74 20 75 6e 6c 69 6e 6b 0a 2a 2a 20  s not unlink.** 
4730: 74 68 65 20 74 61 62 6c 65 20 64 61 74 61 20 73  the table data s
4740: 74 72 75 63 74 75 72 65 20 66 72 6f 6d 20 74 68  tructure from th
4750: 65 20 68 61 73 68 20 74 61 62 6c 65 2e 20 20 42  e hash table.  B
4760: 75 74 20 69 74 20 64 6f 65 73 20 64 65 73 74 72  ut it does destr
4770: 6f 79 0a 2a 2a 20 6d 65 6d 6f 72 79 20 73 74 72  oy.** memory str
4780: 75 63 74 75 72 65 73 20 6f 66 20 74 68 65 20 69  uctures of the i
4790: 6e 64 69 63 65 73 20 61 6e 64 20 66 6f 72 65 69  ndices and forei
47a0: 67 6e 20 6b 65 79 73 20 61 73 73 6f 63 69 61 74  gn keys associat
47b0: 65 64 20 77 69 74 68 20 0a 2a 2a 20 74 68 65 20  ed with .** the 
47c0: 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  table..**.** The
47d0: 20 64 62 20 70 61 72 61 6d 65 74 65 72 20 69 73   db parameter is
47e0: 20 6f 70 74 69 6f 6e 61 6c 2e 20 20 49 74 20 69   optional.  It i
47f0: 73 20 6e 65 65 64 65 64 20 69 66 20 74 68 65 20  s needed if the 
4800: 54 61 62 6c 65 20 6f 62 6a 65 63 74 20 0a 2a 2a  Table object .**
4810: 20 63 6f 6e 74 61 69 6e 73 20 6c 6f 6f 6b 61 73   contains lookas
4820: 69 64 65 20 6d 65 6d 6f 72 79 2e 20 20 28 54 61  ide memory.  (Ta
4830: 62 6c 65 20 6f 62 6a 65 63 74 73 20 69 6e 20 74  ble objects in t
4840: 68 65 20 73 63 68 65 6d 61 20 64 6f 20 6e 6f 74  he schema do not
4850: 20 75 73 65 0a 2a 2a 20 6c 6f 6f 6b 61 73 69 64   use.** lookasid
4860: 65 20 6d 65 6d 6f 72 79 2c 20 62 75 74 20 73 6f  e memory, but so
4870: 6d 65 20 65 70 68 65 6d 65 72 61 6c 20 54 61 62  me ephemeral Tab
4880: 6c 65 20 6f 62 6a 65 63 74 73 20 64 6f 2e 29 20  le objects do.) 
4890: 20 4f 72 20 74 68 65 0a 2a 2a 20 64 62 20 70 61   Or the.** db pa
48a0: 72 61 6d 65 74 65 72 20 63 61 6e 20 62 65 20 75  rameter can be u
48b0: 73 65 64 20 77 69 74 68 20 64 62 2d 3e 70 6e 42  sed with db->pnB
48c0: 79 74 65 73 46 72 65 65 64 20 74 6f 20 6d 65 61  ytesFreed to mea
48d0: 73 75 72 65 20 74 68 65 20 6d 65 6d 6f 72 79 0a  sure the memory.
48e0: 2a 2a 20 75 73 65 64 20 62 79 20 74 68 65 20 54  ** used by the T
48f0: 61 62 6c 65 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a  able object..*/.
4900: 73 74 61 74 69 63 20 76 6f 69 64 20 53 51 4c 49  static void SQLI
4910: 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 64 65 6c 65  TE_NOINLINE dele
4920: 74 65 54 61 62 6c 65 28 73 71 6c 69 74 65 33 20  teTable(sqlite3 
4930: 2a 64 62 2c 20 54 61 62 6c 65 20 2a 70 54 61 62  *db, Table *pTab
4940: 6c 65 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 49  le){.  Index *pI
4950: 6e 64 65 78 2c 20 2a 70 4e 65 78 74 3b 0a 20 20  ndex, *pNext;.  
4960: 54 45 53 54 4f 4e 4c 59 28 20 69 6e 74 20 6e 4c  TESTONLY( int nL
4970: 6f 6f 6b 61 73 69 64 65 3b 20 29 20 2f 2a 20 55  ookaside; ) /* U
4980: 73 65 64 20 74 6f 20 76 65 72 69 66 79 20 6c 6f  sed to verify lo
4990: 6f 6b 61 73 69 64 65 20 6e 6f 74 20 75 73 65 64  okaside not used
49a0: 20 66 6f 72 20 73 63 68 65 6d 61 20 2a 2f 0a 0a   for schema */..
49b0: 20 20 2f 2a 20 52 65 63 6f 72 64 20 74 68 65 20    /* Record the 
49c0: 6e 75 6d 62 65 72 20 6f 66 20 6f 75 74 73 74 61  number of outsta
49d0: 6e 64 69 6e 67 20 6c 6f 6f 6b 61 73 69 64 65 20  nding lookaside 
49e0: 61 6c 6c 6f 63 61 74 69 6f 6e 73 20 69 6e 20 73  allocations in s
49f0: 63 68 65 6d 61 20 54 61 62 6c 65 73 0a 20 20 2a  chema Tables.  *
4a00: 2a 20 70 72 69 6f 72 20 74 6f 20 64 6f 69 6e 67  * prior to doing
4a10: 20 61 6e 79 20 66 72 65 65 28 29 20 6f 70 65 72   any free() oper
4a20: 61 74 69 6f 6e 73 2e 20 20 53 69 6e 63 65 20 73  ations.  Since s
4a30: 63 68 65 6d 61 20 54 61 62 6c 65 73 20 64 6f 20  chema Tables do 
4a40: 6e 6f 74 20 75 73 65 0a 20 20 2a 2a 20 6c 6f 6f  not use.  ** loo
4a50: 6b 61 73 69 64 65 2c 20 74 68 69 73 20 6e 75 6d  kaside, this num
4a60: 62 65 72 20 73 68 6f 75 6c 64 20 6e 6f 74 20 63  ber should not c
4a70: 68 61 6e 67 65 2e 20 2a 2f 0a 20 20 54 45 53 54  hange. */.  TEST
4a80: 4f 4e 4c 59 28 20 6e 4c 6f 6f 6b 61 73 69 64 65  ONLY( nLookaside
4a90: 20 3d 20 28 64 62 20 26 26 20 28 70 54 61 62 6c   = (db && (pTabl
4aa0: 65 2d 3e 74 61 62 46 6c 61 67 73 20 26 20 54 46  e->tabFlags & TF
4ab0: 5f 45 70 68 65 6d 65 72 61 6c 29 3d 3d 30 29 20  _Ephemeral)==0) 
4ac0: 3f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ?.              
4ad0: 20 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e 6c             db->l
4ae0: 6f 6f 6b 61 73 69 64 65 2e 6e 4f 75 74 20 3a 20  ookaside.nOut : 
4af0: 30 20 29 3b 0a 0a 20 20 2f 2a 20 44 65 6c 65 74  0 );..  /* Delet
4b00: 65 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 61 73  e all indices as
4b10: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
4b20: 69 73 20 74 61 62 6c 65 2e 20 2a 2f 0a 20 20 66  is table. */.  f
4b30: 6f 72 28 70 49 6e 64 65 78 20 3d 20 70 54 61 62  or(pIndex = pTab
4b40: 6c 65 2d 3e 70 49 6e 64 65 78 3b 20 70 49 6e 64  le->pIndex; pInd
4b50: 65 78 3b 20 70 49 6e 64 65 78 3d 70 4e 65 78 74  ex; pIndex=pNext
4b60: 29 7b 0a 20 20 20 20 70 4e 65 78 74 20 3d 20 70  ){.    pNext = p
4b70: 49 6e 64 65 78 2d 3e 70 4e 65 78 74 3b 0a 20 20  Index->pNext;.  
4b80: 20 20 61 73 73 65 72 74 28 20 70 49 6e 64 65 78    assert( pIndex
4b90: 2d 3e 70 53 63 68 65 6d 61 3d 3d 70 54 61 62 6c  ->pSchema==pTabl
4ba0: 65 2d 3e 70 53 63 68 65 6d 61 0a 20 20 20 20 20  e->pSchema.     
4bb0: 20 20 20 20 7c 7c 20 28 49 73 56 69 72 74 75 61      || (IsVirtua
4bc0: 6c 28 70 54 61 62 6c 65 29 20 26 26 20 70 49 6e  l(pTable) && pIn
4bd0: 64 65 78 2d 3e 69 64 78 54 79 70 65 21 3d 53 51  dex->idxType!=SQ
4be0: 4c 49 54 45 5f 49 44 58 54 59 50 45 5f 41 50 50  LITE_IDXTYPE_APP
4bf0: 44 45 46 29 20 29 3b 0a 20 20 20 20 69 66 28 20  DEF) );.    if( 
4c00: 28 64 62 3d 3d 30 20 7c 7c 20 64 62 2d 3e 70 6e  (db==0 || db->pn
4c10: 42 79 74 65 73 46 72 65 65 64 3d 3d 30 29 20 26  BytesFreed==0) &
4c20: 26 20 21 49 73 56 69 72 74 75 61 6c 28 70 54 61  & !IsVirtual(pTa
4c30: 62 6c 65 29 20 29 7b 0a 20 20 20 20 20 20 63 68  ble) ){.      ch
4c40: 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 70 49 6e 64  ar *zName = pInd
4c50: 65 78 2d 3e 7a 4e 61 6d 65 3b 20 0a 20 20 20 20  ex->zName; .    
4c60: 20 20 54 45 53 54 4f 4e 4c 59 20 28 20 49 6e 64    TESTONLY ( Ind
4c70: 65 78 20 2a 70 4f 6c 64 20 3d 20 29 20 73 71 6c  ex *pOld = ) sql
4c80: 69 74 65 33 48 61 73 68 49 6e 73 65 72 74 28 0a  ite3HashInsert(.
4c90: 20 20 20 20 20 20 20 20 20 26 70 49 6e 64 65 78           &pIndex
4ca0: 2d 3e 70 53 63 68 65 6d 61 2d 3e 69 64 78 48 61  ->pSchema->idxHa
4cb0: 73 68 2c 20 7a 4e 61 6d 65 2c 20 30 0a 20 20 20  sh, zName, 0.   
4cc0: 20 20 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65     );.      asse
4cd0: 72 74 28 20 64 62 3d 3d 30 20 7c 7c 20 73 71 6c  rt( db==0 || sql
4ce0: 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48  ite3SchemaMutexH
4cf0: 65 6c 64 28 64 62 2c 20 30 2c 20 70 49 6e 64 65  eld(db, 0, pInde
4d00: 78 2d 3e 70 53 63 68 65 6d 61 29 20 29 3b 0a 20  x->pSchema) );. 
4d10: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 6c       assert( pOl
4d20: 64 3d 3d 70 49 6e 64 65 78 20 7c 7c 20 70 4f 6c  d==pIndex || pOl
4d30: 64 3d 3d 30 20 29 3b 0a 20 20 20 20 7d 0a 20 20  d==0 );.    }.  
4d40: 20 20 66 72 65 65 49 6e 64 65 78 28 64 62 2c 20    freeIndex(db, 
4d50: 70 49 6e 64 65 78 29 3b 0a 20 20 7d 0a 0a 20 20  pIndex);.  }..  
4d60: 2f 2a 20 44 65 6c 65 74 65 20 61 6e 79 20 66 6f  /* Delete any fo
4d70: 72 65 69 67 6e 20 6b 65 79 73 20 61 74 74 61 63  reign keys attac
4d80: 68 65 64 20 74 6f 20 74 68 69 73 20 74 61 62 6c  hed to this tabl
4d90: 65 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 46  e. */.  sqlite3F
4da0: 6b 44 65 6c 65 74 65 28 64 62 2c 20 70 54 61 62  kDelete(db, pTab
4db0: 6c 65 29 3b 0a 0a 20 20 2f 2a 20 44 65 6c 65 74  le);..  /* Delet
4dc0: 65 20 74 68 65 20 54 61 62 6c 65 20 73 74 72 75  e the Table stru
4dd0: 63 74 75 72 65 20 69 74 73 65 6c 66 2e 0a 20 20  cture itself..  
4de0: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 44 65 6c 65  */.  sqlite3Dele
4df0: 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 64 62  teColumnNames(db
4e00: 2c 20 70 54 61 62 6c 65 29 3b 0a 20 20 73 71 6c  , pTable);.  sql
4e10: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
4e20: 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  Table->zName);. 
4e30: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
4e40: 62 2c 20 70 54 61 62 6c 65 2d 3e 7a 43 6f 6c 41  b, pTable->zColA
4e50: 66 66 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 65  ff);.  sqlite3Se
4e60: 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70  lectDelete(db, p
4e70: 54 61 62 6c 65 2d 3e 70 53 65 6c 65 63 74 29 3b  Table->pSelect);
4e80: 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69  .  sqlite3ExprLi
4e90: 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 54 61  stDelete(db, pTa
4ea0: 62 6c 65 2d 3e 70 43 68 65 63 6b 29 3b 0a 23 69  ble->pCheck);.#i
4eb0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
4ec0: 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20  T_VIRTUALTABLE. 
4ed0: 20 73 71 6c 69 74 65 33 56 74 61 62 43 6c 65 61   sqlite3VtabClea
4ee0: 72 28 64 62 2c 20 70 54 61 62 6c 65 29 3b 0a 23  r(db, pTable);.#
4ef0: 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33 44  endif.  sqlite3D
4f00: 62 46 72 65 65 28 64 62 2c 20 70 54 61 62 6c 65  bFree(db, pTable
4f10: 29 3b 0a 0a 20 20 2f 2a 20 56 65 72 69 66 79 20  );..  /* Verify 
4f20: 74 68 61 74 20 6e 6f 20 6c 6f 6f 6b 61 73 69 64  that no lookasid
4f30: 65 20 6d 65 6d 6f 72 79 20 77 61 73 20 75 73 65  e memory was use
4f40: 64 20 62 79 20 73 63 68 65 6d 61 20 74 61 62 6c  d by schema tabl
4f50: 65 73 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  es */.  assert( 
4f60: 6e 4c 6f 6f 6b 61 73 69 64 65 3d 3d 30 20 7c 7c  nLookaside==0 ||
4f70: 20 6e 4c 6f 6f 6b 61 73 69 64 65 3d 3d 64 62 2d   nLookaside==db-
4f80: 3e 6c 6f 6f 6b 61 73 69 64 65 2e 6e 4f 75 74 20  >lookaside.nOut 
4f90: 29 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65  );.}.void sqlite
4fa0: 33 44 65 6c 65 74 65 54 61 62 6c 65 28 73 71 6c  3DeleteTable(sql
4fb0: 69 74 65 33 20 2a 64 62 2c 20 54 61 62 6c 65 20  ite3 *db, Table 
4fc0: 2a 70 54 61 62 6c 65 29 7b 0a 20 20 2f 2a 20 44  *pTable){.  /* D
4fd0: 6f 20 6e 6f 74 20 64 65 6c 65 74 65 20 74 68 65  o not delete the
4fe0: 20 74 61 62 6c 65 20 75 6e 74 69 6c 20 74 68 65   table until the
4ff0: 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74   reference count
5000: 20 72 65 61 63 68 65 73 20 7a 65 72 6f 2e 20 2a   reaches zero. *
5010: 2f 0a 20 20 69 66 28 20 21 70 54 61 62 6c 65 20  /.  if( !pTable 
5020: 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
5030: 28 28 21 64 62 20 7c 7c 20 64 62 2d 3e 70 6e 42  ((!db || db->pnB
5040: 79 74 65 73 46 72 65 65 64 3d 3d 30 29 20 26 26  ytesFreed==0) &&
5050: 20 28 2d 2d 70 54 61 62 6c 65 2d 3e 6e 52 65 66   (--pTable->nRef
5060: 29 3e 30 29 20 29 20 72 65 74 75 72 6e 3b 0a 20  )>0) ) return;. 
5070: 20 64 65 6c 65 74 65 54 61 62 6c 65 28 64 62 2c   deleteTable(db,
5080: 20 70 54 61 62 6c 65 29 3b 0a 7d 0a 0a 0a 2f 2a   pTable);.}.../*
5090: 0a 2a 2a 20 55 6e 6c 69 6e 6b 20 74 68 65 20 67  .** Unlink the g
50a0: 69 76 65 6e 20 74 61 62 6c 65 20 66 72 6f 6d 20  iven table from 
50b0: 74 68 65 20 68 61 73 68 20 74 61 62 6c 65 73 20  the hash tables 
50c0: 61 6e 64 20 74 68 65 20 64 65 6c 65 74 65 20 74  and the delete t
50d0: 68 65 0a 2a 2a 20 74 61 62 6c 65 20 73 74 72 75  he.** table stru
50e0: 63 74 75 72 65 20 77 69 74 68 20 61 6c 6c 20 69  cture with all i
50f0: 74 73 20 69 6e 64 69 63 65 73 20 61 6e 64 20 66  ts indices and f
5100: 6f 72 65 69 67 6e 20 6b 65 79 73 2e 0a 2a 2f 0a  oreign keys..*/.
5110: 76 6f 69 64 20 73 71 6c 69 74 65 33 55 6e 6c 69  void sqlite3Unli
5120: 6e 6b 41 6e 64 44 65 6c 65 74 65 54 61 62 6c 65  nkAndDeleteTable
5130: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e  (sqlite3 *db, in
5140: 74 20 69 44 62 2c 20 63 6f 6e 73 74 20 63 68 61  t iDb, const cha
5150: 72 20 2a 7a 54 61 62 4e 61 6d 65 29 7b 0a 20 20  r *zTabName){.  
5160: 54 61 62 6c 65 20 2a 70 3b 0a 20 20 44 62 20 2a  Table *p;.  Db *
5170: 70 44 62 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  pDb;..  assert( 
5180: 64 62 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  db!=0 );.  asser
5190: 74 28 20 69 44 62 3e 3d 30 20 26 26 20 69 44 62  t( iDb>=0 && iDb
51a0: 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 61 73  <db->nDb );.  as
51b0: 73 65 72 74 28 20 7a 54 61 62 4e 61 6d 65 20 29  sert( zTabName )
51c0: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
51d0: 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65  te3SchemaMutexHe
51e0: 6c 64 28 64 62 2c 20 69 44 62 2c 20 30 29 20 29  ld(db, iDb, 0) )
51f0: 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 7a 54  ;.  testcase( zT
5200: 61 62 4e 61 6d 65 5b 30 5d 3d 3d 30 20 29 3b 20  abName[0]==0 ); 
5210: 20 2f 2a 20 5a 65 72 6f 2d 6c 65 6e 67 74 68 20   /* Zero-length 
5220: 74 61 62 6c 65 20 6e 61 6d 65 73 20 61 72 65 20  table names are 
5230: 61 6c 6c 6f 77 65 64 20 2a 2f 0a 20 20 70 44 62  allowed */.  pDb
5240: 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d   = &db->aDb[iDb]
5250: 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 48  ;.  p = sqlite3H
5260: 61 73 68 49 6e 73 65 72 74 28 26 70 44 62 2d 3e  ashInsert(&pDb->
5270: 70 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68  pSchema->tblHash
5280: 2c 20 7a 54 61 62 4e 61 6d 65 2c 20 30 29 3b 0a  , zTabName, 0);.
5290: 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54    sqlite3DeleteT
52a0: 61 62 6c 65 28 64 62 2c 20 70 29 3b 0a 20 20 64  able(db, p);.  d
52b0: 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49  b->flags |= SQLI
52c0: 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73  TE_InternChanges
52d0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e  ;.}../*.** Given
52e0: 20 61 20 74 6f 6b 65 6e 2c 20 72 65 74 75 72 6e   a token, return
52f0: 20 61 20 73 74 72 69 6e 67 20 74 68 61 74 20 63   a string that c
5300: 6f 6e 73 69 73 74 73 20 6f 66 20 74 68 65 20 74  onsists of the t
5310: 65 78 74 20 6f 66 20 74 68 61 74 0a 2a 2a 20 74  ext of that.** t
5320: 6f 6b 65 6e 2e 20 20 53 70 61 63 65 20 74 6f 20  oken.  Space to 
5330: 68 6f 6c 64 20 74 68 65 20 72 65 74 75 72 6e 65  hold the returne
5340: 64 20 73 74 72 69 6e 67 0a 2a 2a 20 69 73 20 6f  d string.** is o
5350: 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c  btained from sql
5360: 69 74 65 4d 61 6c 6c 6f 63 28 29 20 61 6e 64 20  iteMalloc() and 
5370: 6d 75 73 74 20 62 65 20 66 72 65 65 64 20 62 79  must be freed by
5380: 20 74 68 65 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20   the calling.** 
5390: 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  function..**.** 
53a0: 41 6e 79 20 71 75 6f 74 61 74 69 6f 6e 20 6d 61  Any quotation ma
53b0: 72 6b 73 20 28 65 78 3a 20 20 22 6e 61 6d 65 22  rks (ex:  "name"
53c0: 2c 20 27 6e 61 6d 65 27 2c 20 5b 6e 61 6d 65 5d  , 'name', [name]
53d0: 2c 20 6f 72 20 60 6e 61 6d 65 60 29 20 74 68 61  , or `name`) tha
53e0: 74 0a 2a 2a 20 73 75 72 72 6f 75 6e 64 20 74 68  t.** surround th
53f0: 65 20 62 6f 64 79 20 6f 66 20 74 68 65 20 74 6f  e body of the to
5400: 6b 65 6e 20 61 72 65 20 72 65 6d 6f 76 65 64 2e  ken are removed.
5410: 0a 2a 2a 0a 2a 2a 20 54 6f 6b 65 6e 73 20 61 72  .**.** Tokens ar
5420: 65 20 6f 66 74 65 6e 20 6a 75 73 74 20 70 6f 69  e often just poi
5430: 6e 74 65 72 73 20 69 6e 74 6f 20 74 68 65 20 6f  nters into the o
5440: 72 69 67 69 6e 61 6c 20 53 51 4c 20 74 65 78 74  riginal SQL text
5450: 20 61 6e 64 20 73 6f 0a 2a 2a 20 61 72 65 20 6e   and so.** are n
5460: 6f 74 20 5c 30 30 30 20 74 65 72 6d 69 6e 61 74  ot \000 terminat
5470: 65 64 20 61 6e 64 20 61 72 65 20 6e 6f 74 20 70  ed and are not p
5480: 65 72 73 69 73 74 65 6e 74 2e 20 20 54 68 65 20  ersistent.  The 
5490: 72 65 74 75 72 6e 65 64 20 73 74 72 69 6e 67 0a  returned string.
54a0: 2a 2a 20 69 73 20 5c 30 30 30 20 74 65 72 6d 69  ** is \000 termi
54b0: 6e 61 74 65 64 20 61 6e 64 20 69 73 20 70 65 72  nated and is per
54c0: 73 69 73 74 65 6e 74 2e 0a 2a 2f 0a 63 68 61 72  sistent..*/.char
54d0: 20 2a 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f   *sqlite3NameFro
54e0: 6d 54 6f 6b 65 6e 28 73 71 6c 69 74 65 33 20 2a  mToken(sqlite3 *
54f0: 64 62 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65  db, Token *pName
5500: 29 7b 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65  ){.  char *zName
5510: 3b 0a 20 20 69 66 28 20 70 4e 61 6d 65 20 29 7b  ;.  if( pName ){
5520: 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c  .    zName = sql
5530: 69 74 65 33 44 62 53 74 72 4e 44 75 70 28 64 62  ite3DbStrNDup(db
5540: 2c 20 28 63 68 61 72 2a 29 70 4e 61 6d 65 2d 3e  , (char*)pName->
5550: 7a 2c 20 70 4e 61 6d 65 2d 3e 6e 29 3b 0a 20 20  z, pName->n);.  
5560: 20 20 73 71 6c 69 74 65 33 44 65 71 75 6f 74 65    sqlite3Dequote
5570: 28 7a 4e 61 6d 65 29 3b 0a 20 20 7d 65 6c 73 65  (zName);.  }else
5580: 7b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 30 3b  {.    zName = 0;
5590: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 4e  .  }.  return zN
55a0: 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70  ame;.}../*.** Op
55b0: 65 6e 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61  en the sqlite_ma
55c0: 73 74 65 72 20 74 61 62 6c 65 20 73 74 6f 72 65  ster table store
55d0: 64 20 69 6e 20 64 61 74 61 62 61 73 65 20 6e 75  d in database nu
55e0: 6d 62 65 72 20 69 44 62 20 66 6f 72 0a 2a 2a 20  mber iDb for.** 
55f0: 77 72 69 74 69 6e 67 2e 20 54 68 65 20 74 61 62  writing. The tab
5600: 6c 65 20 69 73 20 6f 70 65 6e 65 64 20 75 73 69  le is opened usi
5610: 6e 67 20 63 75 72 73 6f 72 20 30 2e 0a 2a 2f 0a  ng cursor 0..*/.
5620: 76 6f 69 64 20 73 71 6c 69 74 65 33 4f 70 65 6e  void sqlite3Open
5630: 4d 61 73 74 65 72 54 61 62 6c 65 28 50 61 72 73  MasterTable(Pars
5640: 65 20 2a 70 2c 20 69 6e 74 20 69 44 62 29 7b 0a  e *p, int iDb){.
5650: 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69    Vdbe *v = sqli
5660: 74 65 33 47 65 74 56 64 62 65 28 70 29 3b 0a 20  te3GetVdbe(p);. 
5670: 20 73 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63   sqlite3TableLoc
5680: 6b 28 70 2c 20 69 44 62 2c 20 4d 41 53 54 45 52  k(p, iDb, MASTER
5690: 5f 52 4f 4f 54 2c 20 31 2c 20 53 43 48 45 4d 41  _ROOT, 1, SCHEMA
56a0: 5f 54 41 42 4c 45 28 69 44 62 29 29 3b 0a 20 20  _TABLE(iDb));.  
56b0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
56c0: 34 49 6e 74 28 76 2c 20 4f 50 5f 4f 70 65 6e 57  4Int(v, OP_OpenW
56d0: 72 69 74 65 2c 20 30 2c 20 4d 41 53 54 45 52 5f  rite, 0, MASTER_
56e0: 52 4f 4f 54 2c 20 69 44 62 2c 20 35 29 3b 0a 20  ROOT, iDb, 5);. 
56f0: 20 69 66 28 20 70 2d 3e 6e 54 61 62 3d 3d 30 20   if( p->nTab==0 
5700: 29 7b 0a 20 20 20 20 70 2d 3e 6e 54 61 62 20 3d  ){.    p->nTab =
5710: 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a   1;.  }.}../*.**
5720: 20 50 61 72 61 6d 65 74 65 72 20 7a 4e 61 6d 65   Parameter zName
5730: 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 6e 75 6c   points to a nul
5740: 2d 74 65 72 6d 69 6e 61 74 65 64 20 62 75 66 66  -terminated buff
5750: 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  er containing th
5760: 65 20 6e 61 6d 65 0a 2a 2a 20 6f 66 20 61 20 64  e name.** of a d
5770: 61 74 61 62 61 73 65 20 28 22 6d 61 69 6e 22 2c  atabase ("main",
5780: 20 22 74 65 6d 70 22 20 6f 72 20 74 68 65 20 6e   "temp" or the n
5790: 61 6d 65 20 6f 66 20 61 6e 20 61 74 74 61 63 68  ame of an attach
57a0: 65 64 20 64 62 29 2e 20 54 68 69 73 0a 2a 2a 20  ed db). This.** 
57b0: 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
57c0: 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68   the index of th
57d0: 65 20 6e 61 6d 65 64 20 64 61 74 61 62 61 73 65  e named database
57e0: 20 69 6e 20 64 62 2d 3e 61 44 62 5b 5d 2c 20 6f   in db->aDb[], o
57f0: 72 0a 2a 2a 20 2d 31 20 69 66 20 74 68 65 20 6e  r.** -1 if the n
5800: 61 6d 65 64 20 64 62 20 63 61 6e 6e 6f 74 20 62  amed db cannot b
5810: 65 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 69 6e 74 20  e found..*/.int 
5820: 73 71 6c 69 74 65 33 46 69 6e 64 44 62 4e 61 6d  sqlite3FindDbNam
5830: 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 63  e(sqlite3 *db, c
5840: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
5850: 29 7b 0a 20 20 69 6e 74 20 69 20 3d 20 2d 31 3b  ){.  int i = -1;
5860: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
5870: 62 61 73 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20  base number */. 
5880: 20 69 66 28 20 7a 4e 61 6d 65 20 29 7b 0a 20 20   if( zName ){.  
5890: 20 20 44 62 20 2a 70 44 62 3b 0a 20 20 20 20 66    Db *pDb;.    f
58a0: 6f 72 28 69 3d 28 64 62 2d 3e 6e 44 62 2d 31 29  or(i=(db->nDb-1)
58b0: 2c 20 70 44 62 3d 26 64 62 2d 3e 61 44 62 5b 69  , pDb=&db->aDb[i
58c0: 5d 3b 20 69 3e 3d 30 3b 20 69 2d 2d 2c 20 70 44  ]; i>=0; i--, pD
58d0: 62 2d 2d 29 7b 0a 20 20 20 20 20 20 69 66 28 20  b--){.      if( 
58e0: 30 3d 3d 73 71 6c 69 74 65 33 53 74 72 49 43 6d  0==sqlite3StrICm
58f0: 70 28 70 44 62 2d 3e 7a 44 62 53 4e 61 6d 65 2c  p(pDb->zDbSName,
5900: 20 7a 4e 61 6d 65 29 20 29 20 62 72 65 61 6b 3b   zName) ) break;
5910: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
5920: 75 72 6e 20 69 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn i;.}../*.** 
5930: 54 68 65 20 74 6f 6b 65 6e 20 2a 70 4e 61 6d 65  The token *pName
5940: 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 6e 61   contains the na
5950: 6d 65 20 6f 66 20 61 20 64 61 74 61 62 61 73 65  me of a database
5960: 20 28 65 69 74 68 65 72 20 22 6d 61 69 6e 22 20   (either "main" 
5970: 6f 72 0a 2a 2a 20 22 74 65 6d 70 22 20 6f 72 20  or.** "temp" or 
5980: 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 6e 20 61  the name of an a
5990: 74 74 61 63 68 65 64 20 64 62 29 2e 20 54 68 69  ttached db). Thi
59a0: 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  s routine return
59b0: 73 20 74 68 65 0a 2a 2a 20 69 6e 64 65 78 20 6f  s the.** index o
59c0: 66 20 74 68 65 20 6e 61 6d 65 64 20 64 61 74 61  f the named data
59d0: 62 61 73 65 20 69 6e 20 64 62 2d 3e 61 44 62 5b  base in db->aDb[
59e0: 5d 2c 20 6f 72 20 2d 31 20 69 66 20 74 68 65 20  ], or -1 if the 
59f0: 6e 61 6d 65 64 20 64 62 20 0a 2a 2a 20 64 6f 65  named db .** doe
5a00: 73 20 6e 6f 74 20 65 78 69 73 74 2e 0a 2a 2f 0a  s not exist..*/.
5a10: 69 6e 74 20 73 71 6c 69 74 65 33 46 69 6e 64 44  int sqlite3FindD
5a20: 62 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 54  b(sqlite3 *db, T
5a30: 6f 6b 65 6e 20 2a 70 4e 61 6d 65 29 7b 0a 20 20  oken *pName){.  
5a40: 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
5a50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5a60: 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
5a70: 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 63 68 61   number */.  cha
5a80: 72 20 2a 7a 4e 61 6d 65 3b 20 20 20 20 20 20 20  r *zName;       
5a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5aa0: 20 20 2f 2a 20 4e 61 6d 65 20 77 65 20 61 72 65    /* Name we are
5ab0: 20 73 65 61 72 63 68 69 6e 67 20 66 6f 72 20 2a   searching for *
5ac0: 2f 0a 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69  /.  zName = sqli
5ad0: 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e  te3NameFromToken
5ae0: 28 64 62 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 69  (db, pName);.  i
5af0: 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 44 62   = sqlite3FindDb
5b00: 4e 61 6d 65 28 64 62 2c 20 7a 4e 61 6d 65 29 3b  Name(db, zName);
5b10: 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
5b20: 28 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 72  (db, zName);.  r
5b30: 65 74 75 72 6e 20 69 3b 0a 7d 0a 0a 2f 2a 20 54  eturn i;.}../* T
5b40: 68 65 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77  he table or view
5b50: 20 6f 72 20 74 72 69 67 67 65 72 20 6e 61 6d 65   or trigger name
5b60: 20 69 73 20 70 61 73 73 65 64 20 74 6f 20 74 68   is passed to th
5b70: 69 73 20 72 6f 75 74 69 6e 65 20 76 69 61 20 74  is routine via t
5b80: 6f 6b 65 6e 73 0a 2a 2a 20 70 4e 61 6d 65 31 20  okens.** pName1 
5b90: 61 6e 64 20 70 4e 61 6d 65 32 2e 20 49 66 20 74  and pName2. If t
5ba0: 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 77 61  he table name wa
5bb0: 73 20 66 75 6c 6c 79 20 71 75 61 6c 69 66 69 65  s fully qualifie
5bc0: 64 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 3a 0a  d, for example:.
5bd0: 2a 2a 0a 2a 2a 20 43 52 45 41 54 45 20 54 41 42  **.** CREATE TAB
5be0: 4c 45 20 78 78 78 2e 79 79 79 20 28 2e 2e 2e 29  LE xxx.yyy (...)
5bf0: 3b 0a 2a 2a 20 0a 2a 2a 20 54 68 65 6e 20 70 4e  ;.** .** Then pN
5c00: 61 6d 65 31 20 69 73 20 73 65 74 20 74 6f 20 22  ame1 is set to "
5c10: 78 78 78 22 20 61 6e 64 20 70 4e 61 6d 65 32 20  xxx" and pName2 
5c20: 22 79 79 79 22 2e 20 4f 6e 20 74 68 65 20 6f 74  "yyy". On the ot
5c30: 68 65 72 20 68 61 6e 64 20 69 66 0a 2a 2a 20 74  her hand if.** t
5c40: 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 69 73  he table name is
5c50: 20 6e 6f 74 20 66 75 6c 6c 79 20 71 75 61 6c 69   not fully quali
5c60: 66 69 65 64 2c 20 69 2e 65 2e 3a 0a 2a 2a 0a 2a  fied, i.e.:.**.*
5c70: 2a 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 79  * CREATE TABLE y
5c80: 79 79 28 2e 2e 2e 29 3b 0a 2a 2a 0a 2a 2a 20 54  yy(...);.**.** T
5c90: 68 65 6e 20 70 4e 61 6d 65 31 20 69 73 20 73 65  hen pName1 is se
5ca0: 74 20 74 6f 20 22 79 79 79 22 20 61 6e 64 20 70  t to "yyy" and p
5cb0: 4e 61 6d 65 32 20 69 73 20 22 22 2e 0a 2a 2a 0a  Name2 is ""..**.
5cc0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
5cd0: 73 65 74 73 20 74 68 65 20 2a 70 70 55 6e 71 75  sets the *ppUnqu
5ce0: 61 6c 20 70 6f 69 6e 74 65 72 20 74 6f 20 70 6f  al pointer to po
5cf0: 69 6e 74 20 61 74 20 74 68 65 20 74 6f 6b 65 6e  int at the token
5d00: 20 28 70 4e 61 6d 65 31 20 6f 72 0a 2a 2a 20 70   (pName1 or.** p
5d10: 4e 61 6d 65 32 29 20 74 68 61 74 20 73 74 6f 72  Name2) that stor
5d20: 65 73 20 74 68 65 20 75 6e 71 75 61 6c 69 66 69  es the unqualifi
5d30: 65 64 20 74 61 62 6c 65 20 6e 61 6d 65 2e 20 20  ed table name.  
5d40: 54 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65  The index of the
5d50: 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 22 78 78  .** database "xx
5d60: 78 22 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  x" is returned..
5d70: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 54 77  */.int sqlite3Tw
5d80: 6f 50 61 72 74 4e 61 6d 65 28 0a 20 20 50 61 72  oPartName(.  Par
5d90: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
5da0: 20 2f 2a 20 50 61 72 73 69 6e 67 20 61 6e 64 20   /* Parsing and 
5db0: 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20  code generating 
5dc0: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 6f 6b  context */.  Tok
5dd0: 65 6e 20 2a 70 4e 61 6d 65 31 2c 20 20 20 20 20  en *pName1,     
5de0: 20 2f 2a 20 54 68 65 20 22 78 78 78 22 20 69 6e   /* The "xxx" in
5df0: 20 74 68 65 20 6e 61 6d 65 20 22 78 78 78 2e 79   the name "xxx.y
5e00: 79 79 22 20 6f 72 20 22 78 78 78 22 20 2a 2f 0a  yy" or "xxx" */.
5e10: 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32 2c    Token *pName2,
5e20: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 22 79 79        /* The "yy
5e30: 79 22 20 69 6e 20 74 68 65 20 6e 61 6d 65 20 22  y" in the name "
5e40: 78 78 78 2e 79 79 79 22 20 2a 2f 0a 20 20 54 6f  xxx.yyy" */.  To
5e50: 6b 65 6e 20 2a 2a 70 55 6e 71 75 61 6c 20 20 20  ken **pUnqual   
5e60: 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 75    /* Write the u
5e70: 6e 71 75 61 6c 69 66 69 65 64 20 6f 62 6a 65 63  nqualified objec
5e80: 74 20 6e 61 6d 65 20 68 65 72 65 20 2a 2f 0a 29  t name here */.)
5e90: 7b 0a 20 20 69 6e 74 20 69 44 62 3b 20 20 20 20  {.  int iDb;    
5ea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5eb0: 2f 2a 20 44 61 74 61 62 61 73 65 20 68 6f 6c 64  /* Database hold
5ec0: 69 6e 67 20 74 68 65 20 6f 62 6a 65 63 74 20 2a  ing the object *
5ed0: 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  /.  sqlite3 *db 
5ee0: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20  = pParse->db;.. 
5ef0: 20 61 73 73 65 72 74 28 20 70 4e 61 6d 65 32 21   assert( pName2!
5f00: 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 4e 61 6d  =0 );.  if( pNam
5f10: 65 32 2d 3e 6e 3e 30 20 29 7b 0a 20 20 20 20 69  e2->n>0 ){.    i
5f20: 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  f( db->init.busy
5f30: 20 29 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74   ) {.      sqlit
5f40: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
5f50: 65 2c 20 22 63 6f 72 72 75 70 74 20 64 61 74 61  e, "corrupt data
5f60: 62 61 73 65 22 29 3b 0a 20 20 20 20 20 20 72 65  base");.      re
5f70: 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a 20  turn -1;.    }. 
5f80: 20 20 20 2a 70 55 6e 71 75 61 6c 20 3d 20 70 4e     *pUnqual = pN
5f90: 61 6d 65 32 3b 0a 20 20 20 20 69 44 62 20 3d 20  ame2;.    iDb = 
5fa0: 73 71 6c 69 74 65 33 46 69 6e 64 44 62 28 64 62  sqlite3FindDb(db
5fb0: 2c 20 70 4e 61 6d 65 31 29 3b 0a 20 20 20 20 69  , pName1);.    i
5fc0: 66 28 20 69 44 62 3c 30 20 29 7b 0a 20 20 20 20  f( iDb<0 ){.    
5fd0: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
5fe0: 67 28 70 50 61 72 73 65 2c 20 22 75 6e 6b 6e 6f  g(pParse, "unkno
5ff0: 77 6e 20 64 61 74 61 62 61 73 65 20 25 54 22 2c  wn database %T",
6000: 20 70 4e 61 6d 65 31 29 3b 0a 20 20 20 20 20 20   pName1);.      
6010: 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 7d  return -1;.    }
6020: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73  .  }else{.    as
6030: 73 65 72 74 28 20 64 62 2d 3e 69 6e 69 74 2e 69  sert( db->init.i
6040: 44 62 3d 3d 30 20 7c 7c 20 64 62 2d 3e 69 6e 69  Db==0 || db->ini
6050: 74 2e 62 75 73 79 20 7c 7c 20 28 64 62 2d 3e 66  t.busy || (db->f
6060: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 56 61  lags & SQLITE_Va
6070: 63 75 75 6d 29 21 3d 30 29 3b 0a 20 20 20 20 69  cuum)!=0);.    i
6080: 44 62 20 3d 20 64 62 2d 3e 69 6e 69 74 2e 69 44  Db = db->init.iD
6090: 62 3b 0a 20 20 20 20 2a 70 55 6e 71 75 61 6c 20  b;.    *pUnqual 
60a0: 3d 20 70 4e 61 6d 65 31 3b 0a 20 20 7d 0a 20 20  = pName1;.  }.  
60b0: 72 65 74 75 72 6e 20 69 44 62 3b 0a 7d 0a 0a 2f  return iDb;.}../
60c0: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
60d0: 65 20 69 73 20 75 73 65 64 20 74 6f 20 63 68 65  e is used to che
60e0: 63 6b 20 69 66 20 74 68 65 20 55 54 46 2d 38 20  ck if the UTF-8 
60f0: 73 74 72 69 6e 67 20 7a 4e 61 6d 65 20 69 73 20  string zName is 
6100: 61 20 6c 65 67 61 6c 0a 2a 2a 20 75 6e 71 75 61  a legal.** unqua
6110: 6c 69 66 69 65 64 20 6e 61 6d 65 20 66 6f 72 20  lified name for 
6120: 61 20 6e 65 77 20 73 63 68 65 6d 61 20 6f 62 6a  a new schema obj
6130: 65 63 74 20 28 74 61 62 6c 65 2c 20 69 6e 64 65  ect (table, inde
6140: 78 2c 20 76 69 65 77 20 6f 72 0a 2a 2a 20 74 72  x, view or.** tr
6150: 69 67 67 65 72 29 2e 20 41 6c 6c 20 6e 61 6d 65  igger). All name
6160: 73 20 61 72 65 20 6c 65 67 61 6c 20 65 78 63 65  s are legal exce
6170: 70 74 20 74 68 6f 73 65 20 74 68 61 74 20 62 65  pt those that be
6180: 67 69 6e 20 77 69 74 68 20 74 68 65 20 73 74 72  gin with the str
6190: 69 6e 67 0a 2a 2a 20 22 73 71 6c 69 74 65 5f 22  ing.** "sqlite_"
61a0: 20 28 69 6e 20 75 70 70 65 72 2c 20 6c 6f 77 65   (in upper, lowe
61b0: 72 20 6f 72 20 6d 69 78 65 64 20 63 61 73 65 29  r or mixed case)
61c0: 2e 20 54 68 69 73 20 70 6f 72 74 69 6f 6e 20 6f  . This portion o
61d0: 66 20 74 68 65 20 6e 61 6d 65 73 70 61 63 65 0a  f the namespace.
61e0: 2a 2a 20 69 73 20 72 65 73 65 72 76 65 64 20 66  ** is reserved f
61f0: 6f 72 20 69 6e 74 65 72 6e 61 6c 20 75 73 65 2e  or internal use.
6200: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 43  .*/.int sqlite3C
6210: 68 65 63 6b 4f 62 6a 65 63 74 4e 61 6d 65 28 50  heckObjectName(P
6220: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 63 6f  arse *pParse, co
6230: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29  nst char *zName)
6240: 7b 0a 20 20 69 66 28 20 21 70 50 61 72 73 65 2d  {.  if( !pParse-
6250: 3e 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 26  >db->init.busy &
6260: 26 20 70 50 61 72 73 65 2d 3e 6e 65 73 74 65 64  & pParse->nested
6270: 3d 3d 30 20 0a 20 20 20 20 20 20 20 20 20 20 26  ==0 .          &
6280: 26 20 28 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66  & (pParse->db->f
6290: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 57 72  lags & SQLITE_Wr
62a0: 69 74 65 53 63 68 65 6d 61 29 3d 3d 30 0a 20 20  iteSchema)==0.  
62b0: 20 20 20 20 20 20 20 20 26 26 20 30 3d 3d 73 71          && 0==sq
62c0: 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28 7a 4e  lite3StrNICmp(zN
62d0: 61 6d 65 2c 20 22 73 71 6c 69 74 65 5f 22 2c 20  ame, "sqlite_", 
62e0: 37 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  7) ){.    sqlite
62f0: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
6300: 2c 20 22 6f 62 6a 65 63 74 20 6e 61 6d 65 20 72  , "object name r
6310: 65 73 65 72 76 65 64 20 66 6f 72 20 69 6e 74 65  eserved for inte
6320: 72 6e 61 6c 20 75 73 65 3a 20 25 73 22 2c 20 7a  rnal use: %s", z
6330: 4e 61 6d 65 29 3b 0a 20 20 20 20 72 65 74 75 72  Name);.    retur
6340: 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
6350: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
6360: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
6370: 20 52 65 74 75 72 6e 20 74 68 65 20 50 52 49 4d   Return the PRIM
6380: 41 52 59 20 4b 45 59 20 69 6e 64 65 78 20 6f 66  ARY KEY index of
6390: 20 61 20 74 61 62 6c 65 0a 2a 2f 0a 49 6e 64 65   a table.*/.Inde
63a0: 78 20 2a 73 71 6c 69 74 65 33 50 72 69 6d 61 72  x *sqlite3Primar
63b0: 79 4b 65 79 49 6e 64 65 78 28 54 61 62 6c 65 20  yKeyIndex(Table 
63c0: 2a 70 54 61 62 29 7b 0a 20 20 49 6e 64 65 78 20  *pTab){.  Index 
63d0: 2a 70 3b 0a 20 20 66 6f 72 28 70 3d 70 54 61 62  *p;.  for(p=pTab
63e0: 2d 3e 70 49 6e 64 65 78 3b 20 70 20 26 26 20 21  ->pIndex; p && !
63f0: 49 73 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65  IsPrimaryKeyInde
6400: 78 28 70 29 3b 20 70 3d 70 2d 3e 70 4e 65 78 74  x(p); p=p->pNext
6410: 29 7b 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a  ){}.  return p;.
6420: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
6430: 74 68 65 20 63 6f 6c 75 6d 6e 20 6f 66 20 69 6e  the column of in
6440: 64 65 78 20 70 49 64 78 20 74 68 61 74 20 63 6f  dex pIdx that co
6450: 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 74 61 62  rresponds to tab
6460: 6c 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 69 43 6f  le.** column iCo
6470: 6c 2e 20 20 52 65 74 75 72 6e 20 2d 31 20 69 66  l.  Return -1 if
6480: 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 69   not found..*/.i
6490: 31 36 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e  16 sqlite3Column
64a0: 4f 66 49 6e 64 65 78 28 49 6e 64 65 78 20 2a 70  OfIndex(Index *p
64b0: 49 64 78 2c 20 69 31 36 20 69 43 6f 6c 29 7b 0a  Idx, i16 iCol){.
64c0: 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69    int i;.  for(i
64d0: 3d 30 3b 20 69 3c 70 49 64 78 2d 3e 6e 43 6f 6c  =0; i<pIdx->nCol
64e0: 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  umn; i++){.    i
64f0: 66 28 20 69 43 6f 6c 3d 3d 70 49 64 78 2d 3e 61  f( iCol==pIdx->a
6500: 69 43 6f 6c 75 6d 6e 5b 69 5d 20 29 20 72 65 74  iColumn[i] ) ret
6510: 75 72 6e 20 69 3b 0a 20 20 7d 0a 20 20 72 65 74  urn i;.  }.  ret
6520: 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn -1;.}../*.**
6530: 20 42 65 67 69 6e 20 63 6f 6e 73 74 72 75 63 74   Begin construct
6540: 69 6e 67 20 61 20 6e 65 77 20 74 61 62 6c 65 20  ing a new table 
6550: 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 69  representation i
6560: 6e 20 6d 65 6d 6f 72 79 2e 20 20 54 68 69 73 20  n memory.  This 
6570: 69 73 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20  is.** the first 
6580: 6f 66 20 73 65 76 65 72 61 6c 20 61 63 74 69 6f  of several actio
6590: 6e 20 72 6f 75 74 69 6e 65 73 20 74 68 61 74 20  n routines that 
65a0: 67 65 74 20 63 61 6c 6c 65 64 20 69 6e 20 72 65  get called in re
65b0: 73 70 6f 6e 73 65 0a 2a 2a 20 74 6f 20 61 20 43  sponse.** to a C
65c0: 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74  REATE TABLE stat
65d0: 65 6d 65 6e 74 2e 20 20 49 6e 20 70 61 72 74 69  ement.  In parti
65e0: 63 75 6c 61 72 2c 20 74 68 69 73 20 72 6f 75 74  cular, this rout
65f0: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 0a 2a 2a  ine is called.**
6600: 20 61 66 74 65 72 20 73 65 65 69 6e 67 20 74 6f   after seeing to
6610: 6b 65 6e 73 20 22 43 52 45 41 54 45 22 20 61 6e  kens "CREATE" an
6620: 64 20 22 54 41 42 4c 45 22 20 61 6e 64 20 74 68  d "TABLE" and th
6630: 65 20 74 61 62 6c 65 20 6e 61 6d 65 2e 20 54 68  e table name. Th
6640: 65 20 69 73 54 65 6d 70 0a 2a 2a 20 66 6c 61 67  e isTemp.** flag
6650: 20 69 73 20 74 72 75 65 20 69 66 20 74 68 65 20   is true if the 
6660: 74 61 62 6c 65 20 73 68 6f 75 6c 64 20 62 65 20  table should be 
6670: 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 61 75  stored in the au
6680: 78 69 6c 69 61 72 79 20 64 61 74 61 62 61 73 65  xiliary database
6690: 0a 2a 2a 20 66 69 6c 65 20 69 6e 73 74 65 61 64  .** file instead
66a0: 20 6f 66 20 69 6e 20 74 68 65 20 6d 61 69 6e 20   of in the main 
66b0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20  database file.  
66c0: 54 68 69 73 20 69 73 20 6e 6f 72 6d 61 6c 6c 79  This is normally
66d0: 20 74 68 65 20 63 61 73 65 0a 2a 2a 20 77 68 65   the case.** whe
66e0: 6e 20 74 68 65 20 22 54 45 4d 50 22 20 6f 72 20  n the "TEMP" or 
66f0: 22 54 45 4d 50 4f 52 41 52 59 22 20 6b 65 79 77  "TEMPORARY" keyw
6700: 6f 72 64 20 6f 63 63 75 72 73 20 69 6e 20 62 65  ord occurs in be
6710: 74 77 65 65 6e 0a 2a 2a 20 43 52 45 41 54 45 20  tween.** CREATE 
6720: 61 6e 64 20 54 41 42 4c 45 2e 0a 2a 2a 0a 2a 2a  and TABLE..**.**
6730: 20 54 68 65 20 6e 65 77 20 74 61 62 6c 65 20 72   The new table r
6740: 65 63 6f 72 64 20 69 73 20 69 6e 69 74 69 61 6c  ecord is initial
6750: 69 7a 65 64 20 61 6e 64 20 70 75 74 20 69 6e 20  ized and put in 
6760: 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
6770: 65 2e 0a 2a 2a 20 41 73 20 6d 6f 72 65 20 6f 66  e..** As more of
6780: 20 74 68 65 20 43 52 45 41 54 45 20 54 41 42 4c   the CREATE TABL
6790: 45 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 70  E statement is p
67a0: 61 72 73 65 64 2c 20 61 64 64 69 74 69 6f 6e 61  arsed, additiona
67b0: 6c 20 61 63 74 69 6f 6e 0a 2a 2a 20 72 6f 75 74  l action.** rout
67c0: 69 6e 65 73 20 77 69 6c 6c 20 62 65 20 63 61 6c  ines will be cal
67d0: 6c 65 64 20 74 6f 20 61 64 64 20 6d 6f 72 65 20  led to add more 
67e0: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20 74  information to t
67f0: 68 69 73 20 72 65 63 6f 72 64 2e 0a 2a 2a 20 41  his record..** A
6800: 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
6810: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74   CREATE TABLE st
6820: 61 74 65 6d 65 6e 74 2c 20 74 68 65 20 73 71 6c  atement, the sql
6830: 69 74 65 33 45 6e 64 54 61 62 6c 65 28 29 20 72  ite3EndTable() r
6840: 6f 75 74 69 6e 65 0a 2a 2a 20 69 73 20 63 61 6c  outine.** is cal
6850: 6c 65 64 20 74 6f 20 63 6f 6d 70 6c 65 74 65 20  led to complete 
6860: 74 68 65 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e  the construction
6870: 20 6f 66 20 74 68 65 20 6e 65 77 20 74 61 62 6c   of the new tabl
6880: 65 20 72 65 63 6f 72 64 2e 0a 2a 2f 0a 76 6f 69  e record..*/.voi
6890: 64 20 73 71 6c 69 74 65 33 53 74 61 72 74 54 61  d sqlite3StartTa
68a0: 62 6c 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ble(.  Parse *pP
68b0: 61 72 73 65 2c 20 20 20 2f 2a 20 50 61 72 73 65  arse,   /* Parse
68c0: 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54  r context */.  T
68d0: 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c 20 20 20  oken *pName1,   
68e0: 2f 2a 20 46 69 72 73 74 20 70 61 72 74 20 6f 66  /* First part of
68f0: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
6900: 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77 20 2a   table or view *
6910: 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65  /.  Token *pName
6920: 32 2c 20 20 20 2f 2a 20 53 65 63 6f 6e 64 20 70  2,   /* Second p
6930: 61 72 74 20 6f 66 20 74 68 65 20 6e 61 6d 65 20  art of the name 
6940: 6f 66 20 74 68 65 20 74 61 62 6c 65 20 6f 72 20  of the table or 
6950: 76 69 65 77 20 2a 2f 0a 20 20 69 6e 74 20 69 73  view */.  int is
6960: 54 65 6d 70 2c 20 20 20 20 20 20 2f 2a 20 54 72  Temp,      /* Tr
6970: 75 65 20 69 66 20 74 68 69 73 20 69 73 20 61 20  ue if this is a 
6980: 54 45 4d 50 20 74 61 62 6c 65 20 2a 2f 0a 20 20  TEMP table */.  
6990: 69 6e 74 20 69 73 56 69 65 77 2c 20 20 20 20 20  int isView,     
69a0: 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69 73   /* True if this
69b0: 20 69 73 20 61 20 56 49 45 57 20 2a 2f 0a 20 20   is a VIEW */.  
69c0: 69 6e 74 20 69 73 56 69 72 74 75 61 6c 2c 20 20  int isVirtual,  
69d0: 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69 73   /* True if this
69e0: 20 69 73 20 61 20 56 49 52 54 55 41 4c 20 74 61   is a VIRTUAL ta
69f0: 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 45  ble */.  int noE
6a00: 72 72 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20  rr        /* Do 
6a10: 6e 6f 74 68 69 6e 67 20 69 66 20 74 61 62 6c 65  nothing if table
6a20: 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 20   already exists 
6a30: 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70  */.){.  Table *p
6a40: 54 61 62 6c 65 3b 0a 20 20 63 68 61 72 20 2a 7a  Table;.  char *z
6a50: 4e 61 6d 65 20 3d 20 30 3b 20 2f 2a 20 54 68 65  Name = 0; /* The
6a60: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 6e 65 77   name of the new
6a70: 20 74 61 62 6c 65 20 2a 2f 0a 20 20 73 71 6c 69   table */.  sqli
6a80: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
6a90: 2d 3e 64 62 3b 0a 20 20 56 64 62 65 20 2a 76 3b  ->db;.  Vdbe *v;
6aa0: 0a 20 20 69 6e 74 20 69 44 62 3b 20 20 20 20 20  .  int iDb;     
6ab0: 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
6ac0: 6e 75 6d 62 65 72 20 74 6f 20 63 72 65 61 74 65  number to create
6ad0: 20 74 68 65 20 74 61 62 6c 65 20 69 6e 20 2a 2f   the table in */
6ae0: 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 3b  .  Token *pName;
6af0: 20 20 20 20 2f 2a 20 55 6e 71 75 61 6c 69 66 69      /* Unqualifi
6b00: 65 64 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74  ed name of the t
6b10: 61 62 6c 65 20 74 6f 20 63 72 65 61 74 65 20 2a  able to create *
6b20: 2f 0a 0a 20 20 69 66 28 20 64 62 2d 3e 69 6e 69  /..  if( db->ini
6b30: 74 2e 62 75 73 79 20 26 26 20 64 62 2d 3e 69 6e  t.busy && db->in
6b40: 69 74 2e 6e 65 77 54 6e 75 6d 3d 3d 31 20 29 7b  it.newTnum==1 ){
6b50: 0a 20 20 20 20 2f 2a 20 53 70 65 63 69 61 6c 20  .    /* Special 
6b60: 63 61 73 65 3a 20 20 50 61 72 73 69 6e 67 20 74  case:  Parsing t
6b70: 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  he sqlite_master
6b80: 20 6f 72 20 73 71 6c 69 74 65 5f 74 65 6d 70 5f   or sqlite_temp_
6b90: 6d 61 73 74 65 72 20 73 63 68 65 6d 61 20 2a 2f  master schema */
6ba0: 0a 20 20 20 20 69 44 62 20 3d 20 64 62 2d 3e 69  .    iDb = db->i
6bb0: 6e 69 74 2e 69 44 62 3b 0a 20 20 20 20 7a 4e 61  nit.iDb;.    zNa
6bc0: 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  me = sqlite3DbSt
6bd0: 72 44 75 70 28 64 62 2c 20 53 43 48 45 4d 41 5f  rDup(db, SCHEMA_
6be0: 54 41 42 4c 45 28 69 44 62 29 29 3b 0a 20 20 20  TABLE(iDb));.   
6bf0: 20 70 4e 61 6d 65 20 3d 20 70 4e 61 6d 65 31 3b   pName = pName1;
6c00: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
6c10: 20 54 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65   The common case
6c20: 20 2a 2f 0a 20 20 20 20 69 44 62 20 3d 20 73 71   */.    iDb = sq
6c30: 6c 69 74 65 33 54 77 6f 50 61 72 74 4e 61 6d 65  lite3TwoPartName
6c40: 28 70 50 61 72 73 65 2c 20 70 4e 61 6d 65 31 2c  (pParse, pName1,
6c50: 20 70 4e 61 6d 65 32 2c 20 26 70 4e 61 6d 65 29   pName2, &pName)
6c60: 3b 0a 20 20 20 20 69 66 28 20 69 44 62 3c 30 20  ;.    if( iDb<0 
6c70: 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 69 66  ) return;.    if
6c80: 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26  ( !OMIT_TEMPDB &
6c90: 26 20 69 73 54 65 6d 70 20 26 26 20 70 4e 61 6d  & isTemp && pNam
6ca0: 65 32 2d 3e 6e 3e 30 20 26 26 20 69 44 62 21 3d  e2->n>0 && iDb!=
6cb0: 31 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66  1 ){.      /* If
6cc0: 20 63 72 65 61 74 69 6e 67 20 61 20 74 65 6d 70   creating a temp
6cd0: 20 74 61 62 6c 65 2c 20 74 68 65 20 6e 61 6d 65   table, the name
6ce0: 20 6d 61 79 20 6e 6f 74 20 62 65 20 71 75 61 6c   may not be qual
6cf0: 69 66 69 65 64 2e 20 55 6e 6c 65 73 73 20 0a 20  ified. Unless . 
6d00: 20 20 20 20 20 2a 2a 20 74 68 65 20 64 61 74 61       ** the data
6d10: 62 61 73 65 20 6e 61 6d 65 20 69 73 20 22 74 65  base name is "te
6d20: 6d 70 22 20 61 6e 79 77 61 79 2e 20 20 2a 2f 0a  mp" anyway.  */.
6d30: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
6d40: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74  orMsg(pParse, "t
6d50: 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 6e  emporary table n
6d60: 61 6d 65 20 6d 75 73 74 20 62 65 20 75 6e 71 75  ame must be unqu
6d70: 61 6c 69 66 69 65 64 22 29 3b 0a 20 20 20 20 20  alified");.     
6d80: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20   return;.    }. 
6d90: 20 20 20 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d     if( !OMIT_TEM
6da0: 50 44 42 20 26 26 20 69 73 54 65 6d 70 20 29 20  PDB && isTemp ) 
6db0: 69 44 62 20 3d 20 31 3b 0a 20 20 20 20 7a 4e 61  iDb = 1;.    zNa
6dc0: 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65  me = sqlite3Name
6dd0: 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 4e  FromToken(db, pN
6de0: 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 70 50 61 72  ame);.  }.  pPar
6df0: 73 65 2d 3e 73 4e 61 6d 65 54 6f 6b 65 6e 20 3d  se->sNameToken =
6e00: 20 2a 70 4e 61 6d 65 3b 0a 20 20 69 66 28 20 7a   *pName;.  if( z
6e10: 4e 61 6d 65 3d 3d 30 20 29 20 72 65 74 75 72 6e  Name==0 ) return
6e20: 3b 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f  ;.  if( SQLITE_O
6e30: 4b 21 3d 73 71 6c 69 74 65 33 43 68 65 63 6b 4f  K!=sqlite3CheckO
6e40: 62 6a 65 63 74 4e 61 6d 65 28 70 50 61 72 73 65  bjectName(pParse
6e50: 2c 20 7a 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20  , zName) ){.    
6e60: 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65  goto begin_table
6e70: 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 69 66  _error;.  }.  if
6e80: 28 20 64 62 2d 3e 69 6e 69 74 2e 69 44 62 3d 3d  ( db->init.iDb==
6e90: 31 20 29 20 69 73 54 65 6d 70 20 3d 20 31 3b 0a  1 ) isTemp = 1;.
6ea0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
6eb0: 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f  MIT_AUTHORIZATIO
6ec0: 4e 0a 20 20 61 73 73 65 72 74 28 20 69 73 54 65  N.  assert( isTe
6ed0: 6d 70 3d 3d 30 20 7c 7c 20 69 73 54 65 6d 70 3d  mp==0 || isTemp=
6ee0: 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =1 );.  assert( 
6ef0: 69 73 56 69 65 77 3d 3d 30 20 7c 7c 20 69 73 56  isView==0 || isV
6f00: 69 65 77 3d 3d 31 20 29 3b 0a 20 20 7b 0a 20 20  iew==1 );.  {.  
6f10: 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75    static const u
6f20: 38 20 61 43 6f 64 65 5b 5d 20 3d 20 7b 0a 20 20  8 aCode[] = {.  
6f30: 20 20 20 20 20 53 51 4c 49 54 45 5f 43 52 45 41       SQLITE_CREA
6f40: 54 45 5f 54 41 42 4c 45 2c 0a 20 20 20 20 20 20  TE_TABLE,.      
6f50: 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54   SQLITE_CREATE_T
6f60: 45 4d 50 5f 54 41 42 4c 45 2c 0a 20 20 20 20 20  EMP_TABLE,.     
6f70: 20 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f    SQLITE_CREATE_
6f80: 56 49 45 57 2c 0a 20 20 20 20 20 20 20 53 51 4c  VIEW,.       SQL
6f90: 49 54 45 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f  ITE_CREATE_TEMP_
6fa0: 56 49 45 57 0a 20 20 20 20 7d 3b 0a 20 20 20 20  VIEW.    };.    
6fb0: 63 68 61 72 20 2a 7a 44 62 20 3d 20 64 62 2d 3e  char *zDb = db->
6fc0: 61 44 62 5b 69 44 62 5d 2e 7a 44 62 53 4e 61 6d  aDb[iDb].zDbSNam
6fd0: 65 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  e;.    if( sqlit
6fe0: 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72  e3AuthCheck(pPar
6ff0: 73 65 2c 20 53 51 4c 49 54 45 5f 49 4e 53 45 52  se, SQLITE_INSER
7000: 54 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28  T, SCHEMA_TABLE(
7010: 69 73 54 65 6d 70 29 2c 20 30 2c 20 7a 44 62 29  isTemp), 0, zDb)
7020: 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 62   ){.      goto b
7030: 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72  egin_table_error
7040: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
7050: 21 69 73 56 69 72 74 75 61 6c 20 26 26 20 73 71  !isVirtual && sq
7060: 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70  lite3AuthCheck(p
7070: 50 61 72 73 65 2c 20 28 69 6e 74 29 61 43 6f 64  Parse, (int)aCod
7080: 65 5b 69 73 54 65 6d 70 2b 32 2a 69 73 56 69 65  e[isTemp+2*isVie
7090: 77 5d 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  w],.            
70a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
70b0: 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65             zName
70c0: 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20  , 0, zDb) ){.   
70d0: 20 20 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61     goto begin_ta
70e0: 62 6c 65 5f 65 72 72 6f 72 3b 0a 20 20 20 20 7d  ble_error;.    }
70f0: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  .  }.#endif..  /
7100: 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20  * Make sure the 
7110: 6e 65 77 20 74 61 62 6c 65 20 6e 61 6d 65 20 64  new table name d
7120: 6f 65 73 20 6e 6f 74 20 63 6f 6c 6c 69 64 65 20  oes not collide 
7130: 77 69 74 68 20 61 6e 20 65 78 69 73 74 69 6e 67  with an existing
7140: 0a 20 20 2a 2a 20 69 6e 64 65 78 20 6f 72 20 74  .  ** index or t
7150: 61 62 6c 65 20 6e 61 6d 65 20 69 6e 20 74 68 65  able name in the
7160: 20 73 61 6d 65 20 64 61 74 61 62 61 73 65 2e 20   same database. 
7170: 20 49 73 73 75 65 20 61 6e 20 65 72 72 6f 72 20   Issue an error 
7180: 6d 65 73 73 61 67 65 20 69 66 0a 20 20 2a 2a 20  message if.  ** 
7190: 69 74 20 64 6f 65 73 2e 20 54 68 65 20 65 78 63  it does. The exc
71a0: 65 70 74 69 6f 6e 20 69 73 20 69 66 20 74 68 65  eption is if the
71b0: 20 73 74 61 74 65 6d 65 6e 74 20 62 65 69 6e 67   statement being
71c0: 20 70 61 72 73 65 64 20 77 61 73 20 70 61 73 73   parsed was pass
71d0: 65 64 0a 20 20 2a 2a 20 74 6f 20 61 6e 20 73 71  ed.  ** to an sq
71e0: 6c 69 74 65 33 5f 64 65 63 6c 61 72 65 5f 76 74  lite3_declare_vt
71f0: 61 62 28 29 20 63 61 6c 6c 2e 20 49 6e 20 74 68  ab() call. In th
7200: 61 74 20 63 61 73 65 20 6f 6e 6c 79 20 74 68 65  at case only the
7210: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 0a 20 20   column names.  
7220: 2a 2a 20 61 6e 64 20 74 79 70 65 73 20 77 69 6c  ** and types wil
7230: 6c 20 62 65 20 75 73 65 64 2c 20 73 6f 20 74 68  l be used, so th
7240: 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 20 74  ere is no need t
7250: 6f 20 74 65 73 74 20 66 6f 72 20 6e 61 6d 65 73  o test for names
7260: 70 61 63 65 0a 20 20 2a 2a 20 63 6f 6c 6c 69 73  pace.  ** collis
7270: 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ions..  */.  if(
7280: 20 21 49 4e 5f 44 45 43 4c 41 52 45 5f 56 54 41   !IN_DECLARE_VTA
7290: 42 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a  B ){.    char *z
72a0: 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62  Db = db->aDb[iDb
72b0: 5d 2e 7a 44 62 53 4e 61 6d 65 3b 0a 20 20 20 20  ].zDbSName;.    
72c0: 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73  if( SQLITE_OK!=s
72d0: 71 6c 69 74 65 33 52 65 61 64 53 63 68 65 6d 61  qlite3ReadSchema
72e0: 28 70 50 61 72 73 65 29 20 29 7b 0a 20 20 20 20  (pParse) ){.    
72f0: 20 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62    goto begin_tab
7300: 6c 65 5f 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a  le_error;.    }.
7310: 20 20 20 20 70 54 61 62 6c 65 20 3d 20 73 71 6c      pTable = sql
7320: 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28 64 62  ite3FindTable(db
7330: 2c 20 7a 4e 61 6d 65 2c 20 7a 44 62 29 3b 0a 20  , zName, zDb);. 
7340: 20 20 20 69 66 28 20 70 54 61 62 6c 65 20 29 7b     if( pTable ){
7350: 0a 20 20 20 20 20 20 69 66 28 20 21 6e 6f 45 72  .      if( !noEr
7360: 72 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  r ){.        sql
7370: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
7380: 72 73 65 2c 20 22 74 61 62 6c 65 20 25 54 20 61  rse, "table %T a
7390: 6c 72 65 61 64 79 20 65 78 69 73 74 73 22 2c 20  lready exists", 
73a0: 70 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 65  pName);.      }e
73b0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73  lse{.        ass
73c0: 65 72 74 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62  ert( !db->init.b
73d0: 75 73 79 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44  usy || CORRUPT_D
73e0: 42 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  B );.        sql
73f0: 69 74 65 33 43 6f 64 65 56 65 72 69 66 79 53 63  ite3CodeVerifySc
7400: 68 65 6d 61 28 70 50 61 72 73 65 2c 20 69 44 62  hema(pParse, iDb
7410: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
7420: 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c   goto begin_tabl
7430: 65 5f 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20  e_error;.    }. 
7440: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 46 69     if( sqlite3Fi
7450: 6e 64 49 6e 64 65 78 28 64 62 2c 20 7a 4e 61 6d  ndIndex(db, zNam
7460: 65 2c 20 7a 44 62 29 21 3d 30 20 29 7b 0a 20 20  e, zDb)!=0 ){.  
7470: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
7480: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 68 65  Msg(pParse, "the
7490: 72 65 20 69 73 20 61 6c 72 65 61 64 79 20 61 6e  re is already an
74a0: 20 69 6e 64 65 78 20 6e 61 6d 65 64 20 25 73 22   index named %s"
74b0: 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  , zName);.      
74c0: 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65  goto begin_table
74d0: 5f 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20  _error;.    }.  
74e0: 7d 0a 0a 20 20 70 54 61 62 6c 65 20 3d 20 73 71  }..  pTable = sq
74f0: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72  lite3DbMallocZer
7500: 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 54 61 62  o(db, sizeof(Tab
7510: 6c 65 29 29 3b 0a 20 20 69 66 28 20 70 54 61 62  le));.  if( pTab
7520: 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73  le==0 ){.    ass
7530: 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  ert( db->mallocF
7540: 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 70 50 61  ailed );.    pPa
7550: 72 73 65 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45  rse->rc = SQLITE
7560: 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20  _NOMEM_BKPT;.   
7570: 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b   pParse->nErr++;
7580: 0a 20 20 20 20 67 6f 74 6f 20 62 65 67 69 6e 5f  .    goto begin_
7590: 74 61 62 6c 65 5f 65 72 72 6f 72 3b 0a 20 20 7d  table_error;.  }
75a0: 0a 20 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65  .  pTable->zName
75b0: 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20 70 54 61 62   = zName;.  pTab
75c0: 6c 65 2d 3e 69 50 4b 65 79 20 3d 20 2d 31 3b 0a  le->iPKey = -1;.
75d0: 20 20 70 54 61 62 6c 65 2d 3e 70 53 63 68 65 6d    pTable->pSchem
75e0: 61 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d  a = db->aDb[iDb]
75f0: 2e 70 53 63 68 65 6d 61 3b 0a 20 20 70 54 61 62  .pSchema;.  pTab
7600: 6c 65 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20  le->nRef = 1;.  
7610: 70 54 61 62 6c 65 2d 3e 6e 52 6f 77 4c 6f 67 45  pTable->nRowLogE
7620: 73 74 20 3d 20 32 30 30 3b 20 61 73 73 65 72 74  st = 200; assert
7630: 28 20 32 30 30 3d 3d 73 71 6c 69 74 65 33 4c 6f  ( 200==sqlite3Lo
7640: 67 45 73 74 28 31 30 34 38 35 37 36 29 20 29 3b  gEst(1048576) );
7650: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73  .  assert( pPars
7660: 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3d 3d 30 20  e->pNewTable==0 
7670: 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e 70 4e 65  );.  pParse->pNe
7680: 77 54 61 62 6c 65 20 3d 20 70 54 61 62 6c 65 3b  wTable = pTable;
7690: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69  ..  /* If this i
76a0: 73 20 74 68 65 20 6d 61 67 69 63 20 73 71 6c 69  s the magic sqli
76b0: 74 65 5f 73 65 71 75 65 6e 63 65 20 74 61 62 6c  te_sequence tabl
76c0: 65 20 75 73 65 64 20 62 79 20 61 75 74 6f 69 6e  e used by autoin
76d0: 63 72 65 6d 65 6e 74 2c 0a 20 20 2a 2a 20 74 68  crement,.  ** th
76e0: 65 6e 20 72 65 63 6f 72 64 20 61 20 70 6f 69 6e  en record a poin
76f0: 74 65 72 20 74 6f 20 74 68 69 73 20 74 61 62 6c  ter to this tabl
7700: 65 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 64 61  e in the main da
7710: 74 61 62 61 73 65 20 73 74 72 75 63 74 75 72 65  tabase structure
7720: 0a 20 20 2a 2a 20 73 6f 20 74 68 61 74 20 49 4e  .  ** so that IN
7730: 53 45 52 54 20 63 61 6e 20 66 69 6e 64 20 74 68  SERT can find th
7740: 65 20 74 61 62 6c 65 20 65 61 73 69 6c 79 2e 0a  e table easily..
7750: 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c    */.#ifndef SQL
7760: 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 43  ITE_OMIT_AUTOINC
7770: 52 45 4d 45 4e 54 0a 20 20 69 66 28 20 21 70 50  REMENT.  if( !pP
7780: 61 72 73 65 2d 3e 6e 65 73 74 65 64 20 26 26 20  arse->nested && 
7790: 73 74 72 63 6d 70 28 7a 4e 61 6d 65 2c 20 22 73  strcmp(zName, "s
77a0: 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 22 29  qlite_sequence")
77b0: 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ==0 ){.    asser
77c0: 74 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61  t( sqlite3Schema
77d0: 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20 69 44  MutexHeld(db, iD
77e0: 62 2c 20 30 29 20 29 3b 0a 20 20 20 20 70 54 61  b, 0) );.    pTa
77f0: 62 6c 65 2d 3e 70 53 63 68 65 6d 61 2d 3e 70 53  ble->pSchema->pS
7800: 65 71 54 61 62 20 3d 20 70 54 61 62 6c 65 3b 0a  eqTab = pTable;.
7810: 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a    }.#endif..  /*
7820: 20 42 65 67 69 6e 20 67 65 6e 65 72 61 74 69 6e   Begin generatin
7830: 67 20 74 68 65 20 63 6f 64 65 20 74 68 61 74 20  g the code that 
7840: 77 69 6c 6c 20 69 6e 73 65 72 74 20 74 68 65 20  will insert the 
7850: 74 61 62 6c 65 20 72 65 63 6f 72 64 20 69 6e 74  table record int
7860: 6f 0a 20 20 2a 2a 20 74 68 65 20 53 51 4c 49 54  o.  ** the SQLIT
7870: 45 5f 4d 41 53 54 45 52 20 74 61 62 6c 65 2e 20  E_MASTER table. 
7880: 20 4e 6f 74 65 20 69 6e 20 70 61 72 74 69 63 75   Note in particu
7890: 6c 61 72 20 74 68 61 74 20 77 65 20 6d 75 73 74  lar that we must
78a0: 20 67 6f 20 61 68 65 61 64 0a 20 20 2a 2a 20 61   go ahead.  ** a
78b0: 6e 64 20 61 6c 6c 6f 63 61 74 65 20 74 68 65 20  nd allocate the 
78c0: 72 65 63 6f 72 64 20 6e 75 6d 62 65 72 20 66 6f  record number fo
78d0: 72 20 74 68 65 20 74 61 62 6c 65 20 65 6e 74 72  r the table entr
78e0: 79 20 6e 6f 77 2e 20 20 42 65 66 6f 72 65 20 61  y now.  Before a
78f0: 6e 79 0a 20 20 2a 2a 20 50 52 49 4d 41 52 59 20  ny.  ** PRIMARY 
7900: 4b 45 59 20 6f 72 20 55 4e 49 51 55 45 20 6b 65  KEY or UNIQUE ke
7910: 79 77 6f 72 64 73 20 61 72 65 20 70 61 72 73 65  ywords are parse
7920: 64 2e 20 20 54 68 6f 73 65 20 6b 65 79 77 6f 72  d.  Those keywor
7930: 64 73 20 77 69 6c 6c 20 63 61 75 73 65 0a 20 20  ds will cause.  
7940: 2a 2a 20 69 6e 64 69 63 65 73 20 74 6f 20 62 65  ** indices to be
7950: 20 63 72 65 61 74 65 64 20 61 6e 64 20 74 68 65   created and the
7960: 20 74 61 62 6c 65 20 72 65 63 6f 72 64 20 6d 75   table record mu
7970: 73 74 20 63 6f 6d 65 20 62 65 66 6f 72 65 20 74  st come before t
7980: 68 65 20 0a 20 20 2a 2a 20 69 6e 64 69 63 65 73  he .  ** indices
7990: 2e 20 20 48 65 6e 63 65 2c 20 74 68 65 20 72 65  .  Hence, the re
79a0: 63 6f 72 64 20 6e 75 6d 62 65 72 20 66 6f 72 20  cord number for 
79b0: 74 68 65 20 74 61 62 6c 65 20 6d 75 73 74 20 62  the table must b
79c0: 65 20 61 6c 6c 6f 63 61 74 65 64 0a 20 20 2a 2a  e allocated.  **
79d0: 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 69 66 28   now..  */.  if(
79e0: 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20   !db->init.busy 
79f0: 26 26 20 28 76 20 3d 20 73 71 6c 69 74 65 33 47  && (v = sqlite3G
7a00: 65 74 56 64 62 65 28 70 50 61 72 73 65 29 29 21  etVdbe(pParse))!
7a10: 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 61 64  =0 ){.    int ad
7a20: 64 72 31 3b 0a 20 20 20 20 69 6e 74 20 66 69 6c  dr1;.    int fil
7a30: 65 46 6f 72 6d 61 74 3b 0a 20 20 20 20 69 6e 74  eFormat;.    int
7a40: 20 72 65 67 31 2c 20 72 65 67 32 2c 20 72 65 67   reg1, reg2, reg
7a50: 33 3b 0a 20 20 20 20 2f 2a 20 6e 75 6c 6c 52 6f  3;.    /* nullRo
7a60: 77 5b 5d 20 69 73 20 61 6e 20 4f 50 5f 52 65 63  w[] is an OP_Rec
7a70: 6f 72 64 20 65 6e 63 6f 64 69 6e 67 20 6f 66 20  ord encoding of 
7a80: 61 20 72 6f 77 20 63 6f 6e 74 61 69 6e 69 6e 67  a row containing
7a90: 20 35 20 4e 55 4c 4c 73 20 2a 2f 0a 20 20 20 20   5 NULLs */.    
7aa0: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
7ab0: 72 20 6e 75 6c 6c 52 6f 77 5b 5d 20 3d 20 7b 20  r nullRow[] = { 
7ac0: 36 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  6, 0, 0, 0, 0, 0
7ad0: 20 7d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42   };.    sqlite3B
7ae0: 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69  eginWriteOperati
7af0: 6f 6e 28 70 50 61 72 73 65 2c 20 31 2c 20 69 44  on(pParse, 1, iD
7b00: 62 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  b);..#ifndef SQL
7b10: 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
7b20: 54 41 42 4c 45 0a 20 20 20 20 69 66 28 20 69 73  TABLE.    if( is
7b30: 56 69 72 74 75 61 6c 20 29 7b 0a 20 20 20 20 20  Virtual ){.     
7b40: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
7b50: 70 30 28 76 2c 20 4f 50 5f 56 42 65 67 69 6e 29  p0(v, OP_VBegin)
7b60: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  ;.    }.#endif..
7b70: 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 66 69      /* If the fi
7b80: 6c 65 20 66 6f 72 6d 61 74 20 61 6e 64 20 65 6e  le format and en
7b90: 63 6f 64 69 6e 67 20 69 6e 20 74 68 65 20 64 61  coding in the da
7ba0: 74 61 62 61 73 65 20 68 61 76 65 20 6e 6f 74 20  tabase have not 
7bb0: 62 65 65 6e 20 73 65 74 2c 20 0a 20 20 20 20 2a  been set, .    *
7bc0: 2a 20 73 65 74 20 74 68 65 6d 20 6e 6f 77 2e 0a  * set them now..
7bd0: 20 20 20 20 2a 2f 0a 20 20 20 20 72 65 67 31 20      */.    reg1 
7be0: 3d 20 70 50 61 72 73 65 2d 3e 72 65 67 52 6f 77  = pParse->regRow
7bf0: 69 64 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  id = ++pParse->n
7c00: 4d 65 6d 3b 0a 20 20 20 20 72 65 67 32 20 3d 20  Mem;.    reg2 = 
7c10: 70 50 61 72 73 65 2d 3e 72 65 67 52 6f 6f 74 20  pParse->regRoot 
7c20: 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
7c30: 3b 0a 20 20 20 20 72 65 67 33 20 3d 20 2b 2b 70  ;.    reg3 = ++p
7c40: 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
7c50: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
7c60: 70 33 28 76 2c 20 4f 50 5f 52 65 61 64 43 6f 6f  p3(v, OP_ReadCoo
7c70: 6b 69 65 2c 20 69 44 62 2c 20 72 65 67 33 2c 20  kie, iDb, reg3, 
7c80: 42 54 52 45 45 5f 46 49 4c 45 5f 46 4f 52 4d 41  BTREE_FILE_FORMA
7c90: 54 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  T);.    sqlite3V
7ca0: 64 62 65 55 73 65 73 42 74 72 65 65 28 76 2c 20  dbeUsesBtree(v, 
7cb0: 69 44 62 29 3b 0a 20 20 20 20 61 64 64 72 31 20  iDb);.    addr1 
7cc0: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
7cd0: 4f 70 31 28 76 2c 20 4f 50 5f 49 66 2c 20 72 65  Op1(v, OP_If, re
7ce0: 67 33 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  g3); VdbeCoverag
7cf0: 65 28 76 29 3b 0a 20 20 20 20 66 69 6c 65 46 6f  e(v);.    fileFo
7d00: 72 6d 61 74 20 3d 20 28 64 62 2d 3e 66 6c 61 67  rmat = (db->flag
7d10: 73 20 26 20 53 51 4c 49 54 45 5f 4c 65 67 61 63  s & SQLITE_Legac
7d20: 79 46 69 6c 65 46 6d 74 29 21 3d 30 20 3f 0a 20  yFileFmt)!=0 ?. 
7d30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7d40: 20 31 20 3a 20 53 51 4c 49 54 45 5f 4d 41 58 5f   1 : SQLITE_MAX_
7d50: 46 49 4c 45 5f 46 4f 52 4d 41 54 3b 0a 20 20 20  FILE_FORMAT;.   
7d60: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
7d70: 70 33 28 76 2c 20 4f 50 5f 53 65 74 43 6f 6f 6b  p3(v, OP_SetCook
7d80: 69 65 2c 20 69 44 62 2c 20 42 54 52 45 45 5f 46  ie, iDb, BTREE_F
7d90: 49 4c 45 5f 46 4f 52 4d 41 54 2c 20 66 69 6c 65  ILE_FORMAT, file
7da0: 46 6f 72 6d 61 74 29 3b 0a 20 20 20 20 73 71 6c  Format);.    sql
7db0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
7dc0: 2c 20 4f 50 5f 53 65 74 43 6f 6f 6b 69 65 2c 20  , OP_SetCookie, 
7dd0: 69 44 62 2c 20 42 54 52 45 45 5f 54 45 58 54 5f  iDb, BTREE_TEXT_
7de0: 45 4e 43 4f 44 49 4e 47 2c 20 45 4e 43 28 64 62  ENCODING, ENC(db
7df0: 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  ));.    sqlite3V
7e00: 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61  dbeJumpHere(v, a
7e10: 64 64 72 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 54  ddr1);..    /* T
7e20: 68 69 73 20 6a 75 73 74 20 63 72 65 61 74 65 73  his just creates
7e30: 20 61 20 70 6c 61 63 65 2d 68 6f 6c 64 65 72 20   a place-holder 
7e40: 72 65 63 6f 72 64 20 69 6e 20 74 68 65 20 73 71  record in the sq
7e50: 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c  lite_master tabl
7e60: 65 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 72 65  e..    ** The re
7e70: 63 6f 72 64 20 63 72 65 61 74 65 64 20 64 6f 65  cord created doe
7e80: 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61 6e  s not contain an
7e90: 79 74 68 69 6e 67 20 79 65 74 2e 20 20 49 74 20  ything yet.  It 
7ea0: 77 69 6c 6c 20 62 65 20 72 65 70 6c 61 63 65 64  will be replaced
7eb0: 0a 20 20 20 20 2a 2a 20 62 79 20 74 68 65 20 72  .    ** by the r
7ec0: 65 61 6c 20 65 6e 74 72 79 20 69 6e 20 63 6f 64  eal entry in cod
7ed0: 65 20 67 65 6e 65 72 61 74 65 64 20 61 74 20 73  e generated at s
7ee0: 71 6c 69 74 65 33 45 6e 64 54 61 62 6c 65 28 29  qlite3EndTable()
7ef0: 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
7f00: 54 68 65 20 72 6f 77 69 64 20 66 6f 72 20 74 68  The rowid for th
7f10: 65 20 6e 65 77 20 65 6e 74 72 79 20 69 73 20 6c  e new entry is l
7f20: 65 66 74 20 69 6e 20 72 65 67 69 73 74 65 72 20  eft in register 
7f30: 70 50 61 72 73 65 2d 3e 72 65 67 52 6f 77 69 64  pParse->regRowid
7f40: 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 72 6f 6f  ..    ** The roo
7f50: 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  t page number of
7f60: 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20 69   the new table i
7f70: 73 20 6c 65 66 74 20 69 6e 20 72 65 67 20 70 50  s left in reg pP
7f80: 61 72 73 65 2d 3e 72 65 67 52 6f 6f 74 2e 0a 20  arse->regRoot.. 
7f90: 20 20 20 2a 2a 20 54 68 65 20 72 6f 77 69 64 20     ** The rowid 
7fa0: 61 6e 64 20 72 6f 6f 74 20 70 61 67 65 20 6e 75  and root page nu
7fb0: 6d 62 65 72 20 76 61 6c 75 65 73 20 61 72 65 20  mber values are 
7fc0: 6e 65 65 64 65 64 20 62 79 20 74 68 65 20 63 6f  needed by the co
7fd0: 64 65 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 73  de that.    ** s
7fe0: 71 6c 69 74 65 33 45 6e 64 54 61 62 6c 65 20 77  qlite3EndTable w
7ff0: 69 6c 6c 20 67 65 6e 65 72 61 74 65 2e 0a 20 20  ill generate..  
8000: 20 20 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65    */.#if !define
8010: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  d(SQLITE_OMIT_VI
8020: 45 57 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28  EW) || !defined(
8030: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
8040: 55 41 4c 54 41 42 4c 45 29 0a 20 20 20 20 69 66  UALTABLE).    if
8050: 28 20 69 73 56 69 65 77 20 7c 7c 20 69 73 56 69  ( isView || isVi
8060: 72 74 75 61 6c 20 29 7b 0a 20 20 20 20 20 20 73  rtual ){.      s
8070: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
8080: 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
8090: 30 2c 20 72 65 67 32 29 3b 0a 20 20 20 20 7d 65  0, reg2);.    }e
80a0: 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 7b  lse.#endif.    {
80b0: 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 61  .      pParse->a
80c0: 64 64 72 43 72 54 61 62 20 3d 20 73 71 6c 69 74  ddrCrTab = sqlit
80d0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
80e0: 4f 50 5f 43 72 65 61 74 65 54 61 62 6c 65 2c 20  OP_CreateTable, 
80f0: 69 44 62 2c 20 72 65 67 32 29 3b 0a 20 20 20 20  iDb, reg2);.    
8100: 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 70 65  }.    sqlite3Ope
8110: 6e 4d 61 73 74 65 72 54 61 62 6c 65 28 70 50 61  nMasterTable(pPa
8120: 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 20 20 73  rse, iDb);.    s
8130: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
8140: 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77 69 64 2c  (v, OP_NewRowid,
8150: 20 30 2c 20 72 65 67 31 29 3b 0a 20 20 20 20 73   0, reg1);.    s
8160: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
8170: 28 76 2c 20 4f 50 5f 42 6c 6f 62 2c 20 36 2c 20  (v, OP_Blob, 6, 
8180: 72 65 67 33 2c 20 30 2c 20 6e 75 6c 6c 52 6f 77  reg3, 0, nullRow
8190: 2c 20 50 34 5f 53 54 41 54 49 43 29 3b 0a 20 20  , P4_STATIC);.  
81a0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
81b0: 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74  Op3(v, OP_Insert
81c0: 2c 20 30 2c 20 72 65 67 33 2c 20 72 65 67 31 29  , 0, reg3, reg1)
81d0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
81e0: 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46  eChangeP5(v, OPF
81f0: 4c 41 47 5f 41 50 50 45 4e 44 29 3b 0a 20 20 20  LAG_APPEND);.   
8200: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
8210: 70 30 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 29 3b  p0(v, OP_Close);
8220: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 72 6d 61  .  }..  /* Norma
8230: 6c 20 28 6e 6f 6e 2d 65 72 72 6f 72 29 20 72 65  l (non-error) re
8240: 74 75 72 6e 2e 20 2a 2f 0a 20 20 72 65 74 75 72  turn. */.  retur
8250: 6e 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 20 65  n;..  /* If an e
8260: 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 77 65 20  rror occurs, we 
8270: 6a 75 6d 70 20 68 65 72 65 20 2a 2f 0a 62 65 67  jump here */.beg
8280: 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3a 0a  in_table_error:.
8290: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
82a0: 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 72 65  db, zName);.  re
82b0: 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20 53 65 74 20  turn;.}../* Set 
82c0: 70 72 6f 70 65 72 74 69 65 73 20 6f 66 20 61 20  properties of a 
82d0: 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 20 62 61 73  table column bas
82e0: 65 64 20 6f 6e 20 74 68 65 20 28 6d 61 67 69 63  ed on the (magic
82f0: 61 6c 29 0a 2a 2a 20 6e 61 6d 65 20 6f 66 20 74  al).** name of t
8300: 68 65 20 63 6f 6c 75 6d 6e 2e 0a 2a 2f 0a 23 69  he column..*/.#i
8310: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
8320: 48 49 44 44 45 4e 5f 43 4f 4c 55 4d 4e 53 0a 76  HIDDEN_COLUMNS.v
8330: 6f 69 64 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d  oid sqlite3Colum
8340: 6e 50 72 6f 70 65 72 74 69 65 73 46 72 6f 6d 4e  nPropertiesFromN
8350: 61 6d 65 28 54 61 62 6c 65 20 2a 70 54 61 62 2c  ame(Table *pTab,
8360: 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 29 7b 0a   Column *pCol){.
8370: 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74    if( sqlite3_st
8380: 72 6e 69 63 6d 70 28 70 43 6f 6c 2d 3e 7a 4e 61  rnicmp(pCol->zNa
8390: 6d 65 2c 20 22 5f 5f 68 69 64 64 65 6e 5f 5f 22  me, "__hidden__"
83a0: 2c 20 31 30 29 3d 3d 30 20 29 7b 0a 20 20 20 20  , 10)==0 ){.    
83b0: 70 43 6f 6c 2d 3e 63 6f 6c 46 6c 61 67 73 20 7c  pCol->colFlags |
83c0: 3d 20 43 4f 4c 46 4c 41 47 5f 48 49 44 44 45 4e  = COLFLAG_HIDDEN
83d0: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 54  ;.  }else if( pT
83e0: 61 62 20 26 26 20 70 43 6f 6c 21 3d 70 54 61 62  ab && pCol!=pTab
83f0: 2d 3e 61 43 6f 6c 20 26 26 20 28 70 43 6f 6c 5b  ->aCol && (pCol[
8400: 2d 31 5d 2e 63 6f 6c 46 6c 61 67 73 20 26 20 43  -1].colFlags & C
8410: 4f 4c 46 4c 41 47 5f 48 49 44 44 45 4e 29 20 29  OLFLAG_HIDDEN) )
8420: 7b 0a 20 20 20 20 70 54 61 62 2d 3e 74 61 62 46  {.    pTab->tabF
8430: 6c 61 67 73 20 7c 3d 20 54 46 5f 4f 4f 4f 48 69  lags |= TF_OOOHi
8440: 64 64 65 6e 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64  dden;.  }.}.#end
8450: 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61  if.../*.** Add a
8460: 20 6e 65 77 20 63 6f 6c 75 6d 6e 20 74 6f 20 74   new column to t
8470: 68 65 20 74 61 62 6c 65 20 63 75 72 72 65 6e 74  he table current
8480: 6c 79 20 62 65 69 6e 67 20 63 6f 6e 73 74 72 75  ly being constru
8490: 63 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  cted..**.** The 
84a0: 70 61 72 73 65 72 20 63 61 6c 6c 73 20 74 68 69  parser calls thi
84b0: 73 20 72 6f 75 74 69 6e 65 20 6f 6e 63 65 20 66  s routine once f
84c0: 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e 20 64  or each column d
84d0: 65 63 6c 61 72 61 74 69 6f 6e 0a 2a 2a 20 69 6e  eclaration.** in
84e0: 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20   a CREATE TABLE 
84f0: 73 74 61 74 65 6d 65 6e 74 2e 20 20 73 71 6c 69  statement.  sqli
8500: 74 65 33 53 74 61 72 74 54 61 62 6c 65 28 29 20  te3StartTable() 
8510: 67 65 74 73 20 63 61 6c 6c 65 64 0a 2a 2a 20 66  gets called.** f
8520: 69 72 73 74 20 74 6f 20 67 65 74 20 74 68 69 6e  irst to get thin
8530: 67 73 20 67 6f 69 6e 67 2e 20 20 54 68 65 6e 20  gs going.  Then 
8540: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
8550: 63 61 6c 6c 65 64 20 66 6f 72 20 65 61 63 68 0a  called for each.
8560: 2a 2a 20 63 6f 6c 75 6d 6e 2e 0a 2a 2f 0a 76 6f  ** column..*/.vo
8570: 69 64 20 73 71 6c 69 74 65 33 41 64 64 43 6f 6c  id sqlite3AddCol
8580: 75 6d 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73  umn(Parse *pPars
8590: 65 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 2c  e, Token *pName,
85a0: 20 54 6f 6b 65 6e 20 2a 70 54 79 70 65 29 7b 0a   Token *pType){.
85b0: 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 69 6e    Table *p;.  in
85c0: 74 20 69 3b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a  t i;.  char *z;.
85d0: 20 20 63 68 61 72 20 2a 7a 54 79 70 65 3b 0a 20    char *zType;. 
85e0: 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20   Column *pCol;. 
85f0: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
8600: 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28  Parse->db;.  if(
8610: 20 28 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e   (p = pParse->pN
8620: 65 77 54 61 62 6c 65 29 3d 3d 30 20 29 20 72 65  ewTable)==0 ) re
8630: 74 75 72 6e 3b 0a 23 69 66 20 53 51 4c 49 54 45  turn;.#if SQLITE
8640: 5f 4d 41 58 5f 43 4f 4c 55 4d 4e 0a 20 20 69 66  _MAX_COLUMN.  if
8650: 28 20 70 2d 3e 6e 43 6f 6c 2b 31 3e 64 62 2d 3e  ( p->nCol+1>db->
8660: 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49  aLimit[SQLITE_LI
8670: 4d 49 54 5f 43 4f 4c 55 4d 4e 5d 20 29 7b 0a 20  MIT_COLUMN] ){. 
8680: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
8690: 73 67 28 70 50 61 72 73 65 2c 20 22 74 6f 6f 20  sg(pParse, "too 
86a0: 6d 61 6e 79 20 63 6f 6c 75 6d 6e 73 20 6f 6e 20  many columns on 
86b0: 25 73 22 2c 20 70 2d 3e 7a 4e 61 6d 65 29 3b 0a  %s", p->zName);.
86c0: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
86d0: 23 65 6e 64 69 66 0a 20 20 7a 20 3d 20 73 71 6c  #endif.  z = sql
86e0: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28  ite3DbMallocRaw(
86f0: 64 62 2c 20 70 4e 61 6d 65 2d 3e 6e 20 2b 20 70  db, pName->n + p
8700: 54 79 70 65 2d 3e 6e 20 2b 20 32 29 3b 0a 20 20  Type->n + 2);.  
8710: 69 66 28 20 7a 3d 3d 30 20 29 20 72 65 74 75 72  if( z==0 ) retur
8720: 6e 3b 0a 20 20 6d 65 6d 63 70 79 28 7a 2c 20 70  n;.  memcpy(z, p
8730: 4e 61 6d 65 2d 3e 7a 2c 20 70 4e 61 6d 65 2d 3e  Name->z, pName->
8740: 6e 29 3b 0a 20 20 7a 5b 70 4e 61 6d 65 2d 3e 6e  n);.  z[pName->n
8750: 5d 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33  ] = 0;.  sqlite3
8760: 44 65 71 75 6f 74 65 28 7a 29 3b 0a 20 20 66 6f  Dequote(z);.  fo
8770: 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6c  r(i=0; i<p->nCol
8780: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
8790: 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28  sqlite3_stricmp(
87a0: 7a 2c 20 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e  z, p->aCol[i].zN
87b0: 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ame)==0 ){.     
87c0: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
87d0: 28 70 50 61 72 73 65 2c 20 22 64 75 70 6c 69 63  (pParse, "duplic
87e0: 61 74 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 3a  ate column name:
87f0: 20 25 73 22 2c 20 7a 29 3b 0a 20 20 20 20 20 20   %s", z);.      
8800: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
8810: 2c 20 7a 29 3b 0a 20 20 20 20 20 20 72 65 74 75  , z);.      retu
8820: 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  rn;.    }.  }.  
8830: 69 66 28 20 28 70 2d 3e 6e 43 6f 6c 20 26 20 30  if( (p->nCol & 0
8840: 78 37 29 3d 3d 30 20 29 7b 0a 20 20 20 20 43 6f  x7)==0 ){.    Co
8850: 6c 75 6d 6e 20 2a 61 4e 65 77 3b 0a 20 20 20 20  lumn *aNew;.    
8860: 61 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62  aNew = sqlite3Db
8870: 52 65 61 6c 6c 6f 63 28 64 62 2c 70 2d 3e 61 43  Realloc(db,p->aC
8880: 6f 6c 2c 28 70 2d 3e 6e 43 6f 6c 2b 38 29 2a 73  ol,(p->nCol+8)*s
8890: 69 7a 65 6f 66 28 70 2d 3e 61 43 6f 6c 5b 30 5d  izeof(p->aCol[0]
88a0: 29 29 3b 0a 20 20 20 20 69 66 28 20 61 4e 65 77  ));.    if( aNew
88b0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ==0 ){.      sql
88c0: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a  ite3DbFree(db, z
88d0: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b  );.      return;
88e0: 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 61 43  .    }.    p->aC
88f0: 6f 6c 20 3d 20 61 4e 65 77 3b 0a 20 20 7d 0a 20  ol = aNew;.  }. 
8900: 20 70 43 6f 6c 20 3d 20 26 70 2d 3e 61 43 6f 6c   pCol = &p->aCol
8910: 5b 70 2d 3e 6e 43 6f 6c 5d 3b 0a 20 20 6d 65 6d  [p->nCol];.  mem
8920: 73 65 74 28 70 43 6f 6c 2c 20 30 2c 20 73 69 7a  set(pCol, 0, siz
8930: 65 6f 66 28 70 2d 3e 61 43 6f 6c 5b 30 5d 29 29  eof(p->aCol[0]))
8940: 3b 0a 20 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 20  ;.  pCol->zName 
8950: 3d 20 7a 3b 0a 20 20 73 71 6c 69 74 65 33 43 6f  = z;.  sqlite3Co
8960: 6c 75 6d 6e 50 72 6f 70 65 72 74 69 65 73 46 72  lumnPropertiesFr
8970: 6f 6d 4e 61 6d 65 28 70 2c 20 70 43 6f 6c 29 3b  omName(p, pCol);
8980: 0a 20 0a 20 20 69 66 28 20 70 54 79 70 65 2d 3e  . .  if( pType->
8990: 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 49  n==0 ){.    /* I
89a0: 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 74 79  f there is no ty
89b0: 70 65 20 73 70 65 63 69 66 69 65 64 2c 20 63 6f  pe specified, co
89c0: 6c 75 6d 6e 73 20 68 61 76 65 20 74 68 65 20 64  lumns have the d
89d0: 65 66 61 75 6c 74 20 61 66 66 69 6e 69 74 79 0a  efault affinity.
89e0: 20 20 20 20 2a 2a 20 27 42 4c 4f 42 27 2e 20 2a      ** 'BLOB'. *
89f0: 2f 0a 20 20 20 20 70 43 6f 6c 2d 3e 61 66 66 69  /.    pCol->affi
8a00: 6e 69 74 79 20 3d 20 53 51 4c 49 54 45 5f 41 46  nity = SQLITE_AF
8a10: 46 5f 42 4c 4f 42 3b 0a 20 20 20 20 70 43 6f 6c  F_BLOB;.    pCol
8a20: 2d 3e 73 7a 45 73 74 20 3d 20 31 3b 0a 20 20 7d  ->szEst = 1;.  }
8a30: 65 6c 73 65 7b 0a 20 20 20 20 7a 54 79 70 65 20  else{.    zType 
8a40: 3d 20 7a 20 2b 20 73 71 6c 69 74 65 33 53 74 72  = z + sqlite3Str
8a50: 6c 65 6e 33 30 28 7a 29 20 2b 20 31 3b 0a 20 20  len30(z) + 1;.  
8a60: 20 20 6d 65 6d 63 70 79 28 7a 54 79 70 65 2c 20    memcpy(zType, 
8a70: 70 54 79 70 65 2d 3e 7a 2c 20 70 54 79 70 65 2d  pType->z, pType-
8a80: 3e 6e 29 3b 0a 20 20 20 20 7a 54 79 70 65 5b 70  >n);.    zType[p
8a90: 54 79 70 65 2d 3e 6e 5d 20 3d 20 30 3b 0a 20 20  Type->n] = 0;.  
8aa0: 20 20 73 71 6c 69 74 65 33 44 65 71 75 6f 74 65    sqlite3Dequote
8ab0: 28 7a 54 79 70 65 29 3b 0a 20 20 20 20 70 43 6f  (zType);.    pCo
8ac0: 6c 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20 73 71  l->affinity = sq
8ad0: 6c 69 74 65 33 41 66 66 69 6e 69 74 79 54 79 70  lite3AffinityTyp
8ae0: 65 28 7a 54 79 70 65 2c 20 26 70 43 6f 6c 2d 3e  e(zType, &pCol->
8af0: 73 7a 45 73 74 29 3b 0a 20 20 20 20 70 43 6f 6c  szEst);.    pCol
8b00: 2d 3e 63 6f 6c 46 6c 61 67 73 20 7c 3d 20 43 4f  ->colFlags |= CO
8b10: 4c 46 4c 41 47 5f 48 41 53 54 59 50 45 3b 0a 20  LFLAG_HASTYPE;. 
8b20: 20 7d 0a 20 20 70 2d 3e 6e 43 6f 6c 2b 2b 3b 0a   }.  p->nCol++;.
8b30: 20 20 70 50 61 72 73 65 2d 3e 63 6f 6e 73 74 72    pParse->constr
8b40: 61 69 6e 74 4e 61 6d 65 2e 6e 20 3d 20 30 3b 0a  aintName.n = 0;.
8b50: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
8b60: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
8b70: 62 79 20 74 68 65 20 70 61 72 73 65 72 20 77 68  by the parser wh
8b80: 69 6c 65 20 69 6e 20 74 68 65 20 6d 69 64 64 6c  ile in the middl
8b90: 65 20 6f 66 0a 2a 2a 20 70 61 72 73 69 6e 67 20  e of.** parsing 
8ba0: 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73  a CREATE TABLE s
8bb0: 74 61 74 65 6d 65 6e 74 2e 20 20 41 20 22 4e 4f  tatement.  A "NO
8bc0: 54 20 4e 55 4c 4c 22 20 63 6f 6e 73 74 72 61 69  T NULL" constrai
8bd0: 6e 74 20 68 61 73 0a 2a 2a 20 62 65 65 6e 20 73  nt has.** been s
8be0: 65 65 6e 20 6f 6e 20 61 20 63 6f 6c 75 6d 6e 2e  een on a column.
8bf0: 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73    This routine s
8c00: 65 74 73 20 74 68 65 20 6e 6f 74 4e 75 6c 6c 20  ets the notNull 
8c10: 66 6c 61 67 20 6f 6e 0a 2a 2a 20 74 68 65 20 63  flag on.** the c
8c20: 6f 6c 75 6d 6e 20 63 75 72 72 65 6e 74 6c 79 20  olumn currently 
8c30: 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69  under constructi
8c40: 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  on..*/.void sqli
8c50: 74 65 33 41 64 64 4e 6f 74 4e 75 6c 6c 28 50 61  te3AddNotNull(Pa
8c60: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74  rse *pParse, int
8c70: 20 6f 6e 45 72 72 6f 72 29 7b 0a 20 20 54 61 62   onError){.  Tab
8c80: 6c 65 20 2a 70 3b 0a 20 20 70 20 3d 20 70 50 61  le *p;.  p = pPa
8c90: 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a  rse->pNewTable;.
8ca0: 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20 4e 45    if( p==0 || NE
8cb0: 56 45 52 28 70 2d 3e 6e 43 6f 6c 3c 31 29 20 29  VER(p->nCol<1) )
8cc0: 20 72 65 74 75 72 6e 3b 0a 20 20 70 2d 3e 61 43   return;.  p->aC
8cd0: 6f 6c 5b 70 2d 3e 6e 43 6f 6c 2d 31 5d 2e 6e 6f  ol[p->nCol-1].no
8ce0: 74 4e 75 6c 6c 20 3d 20 28 75 38 29 6f 6e 45 72  tNull = (u8)onEr
8cf0: 72 6f 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 63  ror;.}../*.** Sc
8d00: 61 6e 20 74 68 65 20 63 6f 6c 75 6d 6e 20 74 79  an the column ty
8d10: 70 65 20 6e 61 6d 65 20 7a 54 79 70 65 20 28 6c  pe name zType (l
8d20: 65 6e 67 74 68 20 6e 54 79 70 65 29 20 61 6e 64  ength nType) and
8d30: 20 72 65 74 75 72 6e 20 74 68 65 0a 2a 2a 20 61   return the.** a
8d40: 73 73 6f 63 69 61 74 65 64 20 61 66 66 69 6e 69  ssociated affini
8d50: 74 79 20 74 79 70 65 2e 0a 2a 2a 0a 2a 2a 20 54  ty type..**.** T
8d60: 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73  his routine does
8d70: 20 61 20 63 61 73 65 2d 69 6e 64 65 70 65 6e 64   a case-independ
8d80: 65 6e 74 20 73 65 61 72 63 68 20 6f 66 20 7a 54  ent search of zT
8d90: 79 70 65 20 66 6f 72 20 74 68 65 20 0a 2a 2a 20  ype for the .** 
8da0: 73 75 62 73 74 72 69 6e 67 73 20 69 6e 20 74 68  substrings in th
8db0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 61 62 6c  e following tabl
8dc0: 65 2e 20 49 66 20 6f 6e 65 20 6f 66 20 74 68 65  e. If one of the
8dd0: 20 73 75 62 73 74 72 69 6e 67 73 20 69 73 0a 2a   substrings is.*
8de0: 2a 20 66 6f 75 6e 64 2c 20 74 68 65 20 63 6f 72  * found, the cor
8df0: 72 65 73 70 6f 6e 64 69 6e 67 20 61 66 66 69 6e  responding affin
8e00: 69 74 79 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ity is returned.
8e10: 20 49 66 20 7a 54 79 70 65 20 63 6f 6e 74 61 69   If zType contai
8e20: 6e 73 0a 2a 2a 20 6d 6f 72 65 20 74 68 61 6e 20  ns.** more than 
8e30: 6f 6e 65 20 6f 66 20 74 68 65 20 73 75 62 73 74  one of the subst
8e40: 72 69 6e 67 73 2c 20 65 6e 74 72 69 65 73 20 74  rings, entries t
8e50: 6f 77 61 72 64 20 74 68 65 20 74 6f 70 20 6f 66  oward the top of
8e60: 20 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 74   .** the table t
8e70: 61 6b 65 20 70 72 69 6f 72 69 74 79 2e 20 46 6f  ake priority. Fo
8e80: 72 20 65 78 61 6d 70 6c 65 2c 20 69 66 20 7a 54  r example, if zT
8e90: 79 70 65 20 69 73 20 27 42 4c 4f 42 49 4e 54 27  ype is 'BLOBINT'
8ea0: 2c 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 41 46 46  , .** SQLITE_AFF
8eb0: 5f 49 4e 54 45 47 45 52 20 69 73 20 72 65 74 75  _INTEGER is retu
8ec0: 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 53 75 62 73  rned..**.** Subs
8ed0: 74 72 69 6e 67 20 20 20 20 20 7c 20 41 66 66 69  tring     | Affi
8ee0: 6e 69 74 79 0a 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d  nity.** --------
8ef0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8f00: 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 27 49 4e 54  --------.** 'INT
8f10: 27 20 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49  '         | SQLI
8f20: 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 0a 2a  TE_AFF_INTEGER.*
8f30: 2a 20 27 43 48 41 52 27 20 20 20 20 20 20 20 20  * 'CHAR'        
8f40: 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58  | SQLITE_AFF_TEX
8f50: 54 0a 2a 2a 20 27 43 4c 4f 42 27 20 20 20 20 20  T.** 'CLOB'     
8f60: 20 20 20 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f     | SQLITE_AFF_
8f70: 54 45 58 54 0a 2a 2a 20 27 54 45 58 54 27 20 20  TEXT.** 'TEXT'  
8f80: 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 41        | SQLITE_A
8f90: 46 46 5f 54 45 58 54 0a 2a 2a 20 27 42 4c 4f 42  FF_TEXT.** 'BLOB
8fa0: 27 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54  '        | SQLIT
8fb0: 45 5f 41 46 46 5f 42 4c 4f 42 0a 2a 2a 20 27 52  E_AFF_BLOB.** 'R
8fc0: 45 41 4c 27 20 20 20 20 20 20 20 20 7c 20 53 51  EAL'        | SQ
8fd0: 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 0a 2a 2a  LITE_AFF_REAL.**
8fe0: 20 27 46 4c 4f 41 27 20 20 20 20 20 20 20 20 7c   'FLOA'        |
8ff0: 20 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c   SQLITE_AFF_REAL
9000: 0a 2a 2a 20 27 44 4f 55 42 27 20 20 20 20 20 20  .** 'DOUB'      
9010: 20 20 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f 52    | SQLITE_AFF_R
9020: 45 41 4c 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 6e  EAL.**.** If non
9030: 65 20 6f 66 20 74 68 65 20 73 75 62 73 74 72 69  e of the substri
9040: 6e 67 73 20 69 6e 20 74 68 65 20 61 62 6f 76 65  ngs in the above
9050: 20 74 61 62 6c 65 20 61 72 65 20 66 6f 75 6e 64   table are found
9060: 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f  ,.** SQLITE_AFF_
9070: 4e 55 4d 45 52 49 43 20 69 73 20 72 65 74 75 72  NUMERIC is retur
9080: 6e 65 64 2e 0a 2a 2f 0a 63 68 61 72 20 73 71 6c  ned..*/.char sql
9090: 69 74 65 33 41 66 66 69 6e 69 74 79 54 79 70 65  ite3AffinityType
90a0: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 6e  (const char *zIn
90b0: 2c 20 75 38 20 2a 70 73 7a 45 73 74 29 7b 0a 20  , u8 *pszEst){. 
90c0: 20 75 33 32 20 68 20 3d 20 30 3b 0a 20 20 63 68   u32 h = 0;.  ch
90d0: 61 72 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f  ar aff = SQLITE_
90e0: 41 46 46 5f 4e 55 4d 45 52 49 43 3b 0a 20 20 63  AFF_NUMERIC;.  c
90f0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 68 61 72  onst char *zChar
9100: 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28   = 0;..  assert(
9110: 20 7a 49 6e 21 3d 30 20 29 3b 0a 20 20 77 68 69   zIn!=0 );.  whi
9120: 6c 65 28 20 7a 49 6e 5b 30 5d 20 29 7b 0a 20 20  le( zIn[0] ){.  
9130: 20 20 68 20 3d 20 28 68 3c 3c 38 29 20 2b 20 73    h = (h<<8) + s
9140: 71 6c 69 74 65 33 55 70 70 65 72 54 6f 4c 6f 77  qlite3UpperToLow
9150: 65 72 5b 28 2a 7a 49 6e 29 26 30 78 66 66 5d 3b  er[(*zIn)&0xff];
9160: 0a 20 20 20 20 7a 49 6e 2b 2b 3b 0a 20 20 20 20  .    zIn++;.    
9170: 69 66 28 20 68 3d 3d 28 28 27 63 27 3c 3c 32 34  if( h==(('c'<<24
9180: 29 2b 28 27 68 27 3c 3c 31 36 29 2b 28 27 61 27  )+('h'<<16)+('a'
9190: 3c 3c 38 29 2b 27 72 27 29 20 29 7b 20 20 20 20  <<8)+'r') ){    
91a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 48 41 52           /* CHAR
91b0: 20 2a 2f 0a 20 20 20 20 20 20 61 66 66 20 3d 20   */.      aff = 
91c0: 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 3b  SQLITE_AFF_TEXT;
91d0: 0a 20 20 20 20 20 20 7a 43 68 61 72 20 3d 20 7a  .      zChar = z
91e0: 49 6e 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  In;.    }else if
91f0: 28 20 68 3d 3d 28 28 27 63 27 3c 3c 32 34 29 2b  ( h==(('c'<<24)+
9200: 28 27 6c 27 3c 3c 31 36 29 2b 28 27 6f 27 3c 3c  ('l'<<16)+('o'<<
9210: 38 29 2b 27 62 27 29 20 29 7b 20 20 20 20 20 20  8)+'b') ){      
9220: 20 2f 2a 20 43 4c 4f 42 20 2a 2f 0a 20 20 20 20   /* CLOB */.    
9230: 20 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41    aff = SQLITE_A
9240: 46 46 5f 54 45 58 54 3b 0a 20 20 20 20 7d 65 6c  FF_TEXT;.    }el
9250: 73 65 20 69 66 28 20 68 3d 3d 28 28 27 74 27 3c  se if( h==(('t'<
9260: 3c 32 34 29 2b 28 27 65 27 3c 3c 31 36 29 2b 28  <24)+('e'<<16)+(
9270: 27 78 27 3c 3c 38 29 2b 27 74 27 29 20 29 7b 20  'x'<<8)+'t') ){ 
9280: 20 20 20 20 20 20 2f 2a 20 54 45 58 54 20 2a 2f        /* TEXT */
9290: 0a 20 20 20 20 20 20 61 66 66 20 3d 20 53 51 4c  .      aff = SQL
92a0: 49 54 45 5f 41 46 46 5f 54 45 58 54 3b 0a 20 20  ITE_AFF_TEXT;.  
92b0: 20 20 7d 65 6c 73 65 20 69 66 28 20 68 3d 3d 28    }else if( h==(
92c0: 28 27 62 27 3c 3c 32 34 29 2b 28 27 6c 27 3c 3c  ('b'<<24)+('l'<<
92d0: 31 36 29 2b 28 27 6f 27 3c 3c 38 29 2b 27 62 27  16)+('o'<<8)+'b'
92e0: 29 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 4c  )          /* BL
92f0: 4f 42 20 2a 2f 0a 20 20 20 20 20 20 20 20 26 26  OB */.        &&
9300: 20 28 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46   (aff==SQLITE_AF
9310: 46 5f 4e 55 4d 45 52 49 43 20 7c 7c 20 61 66 66  F_NUMERIC || aff
9320: 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41  ==SQLITE_AFF_REA
9330: 4c 29 20 29 7b 0a 20 20 20 20 20 20 61 66 66 20  L) ){.      aff 
9340: 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f  = SQLITE_AFF_BLO
9350: 42 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 49 6e  B;.      if( zIn
9360: 5b 30 5d 3d 3d 27 28 27 20 29 20 7a 43 68 61 72  [0]=='(' ) zChar
9370: 20 3d 20 7a 49 6e 3b 0a 23 69 66 6e 64 65 66 20   = zIn;.#ifndef 
9380: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41  SQLITE_OMIT_FLOA
9390: 54 49 4e 47 5f 50 4f 49 4e 54 0a 20 20 20 20 7d  TING_POINT.    }
93a0: 65 6c 73 65 20 69 66 28 20 68 3d 3d 28 28 27 72  else if( h==(('r
93b0: 27 3c 3c 32 34 29 2b 28 27 65 27 3c 3c 31 36 29  '<<24)+('e'<<16)
93c0: 2b 28 27 61 27 3c 3c 38 29 2b 27 6c 27 29 20 20  +('a'<<8)+'l')  
93d0: 20 20 20 20 20 20 20 20 2f 2a 20 52 45 41 4c 20          /* REAL 
93e0: 2a 2f 0a 20 20 20 20 20 20 20 20 26 26 20 61 66  */.        && af
93f0: 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55  f==SQLITE_AFF_NU
9400: 4d 45 52 49 43 20 29 7b 0a 20 20 20 20 20 20 61  MERIC ){.      a
9410: 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f  ff = SQLITE_AFF_
9420: 52 45 41 4c 3b 0a 20 20 20 20 7d 65 6c 73 65 20  REAL;.    }else 
9430: 69 66 28 20 68 3d 3d 28 28 27 66 27 3c 3c 32 34  if( h==(('f'<<24
9440: 29 2b 28 27 6c 27 3c 3c 31 36 29 2b 28 27 6f 27  )+('l'<<16)+('o'
9450: 3c 3c 38 29 2b 27 61 27 29 20 20 20 20 20 20 20  <<8)+'a')       
9460: 20 20 20 2f 2a 20 46 4c 4f 41 20 2a 2f 0a 20 20     /* FLOA */.  
9470: 20 20 20 20 20 20 26 26 20 61 66 66 3d 3d 53 51        && aff==SQ
9480: 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43  LITE_AFF_NUMERIC
9490: 20 29 7b 0a 20 20 20 20 20 20 61 66 66 20 3d 20   ){.      aff = 
94a0: 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 3b  SQLITE_AFF_REAL;
94b0: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 68  .    }else if( h
94c0: 3d 3d 28 28 27 64 27 3c 3c 32 34 29 2b 28 27 6f  ==(('d'<<24)+('o
94d0: 27 3c 3c 31 36 29 2b 28 27 75 27 3c 3c 38 29 2b  '<<16)+('u'<<8)+
94e0: 27 62 27 29 20 20 20 20 20 20 20 20 20 20 2f 2a  'b')          /*
94f0: 20 44 4f 55 42 20 2a 2f 0a 20 20 20 20 20 20 20   DOUB */.       
9500: 20 26 26 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f   && aff==SQLITE_
9510: 41 46 46 5f 4e 55 4d 45 52 49 43 20 29 7b 0a 20  AFF_NUMERIC ){. 
9520: 20 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49 54       aff = SQLIT
9530: 45 5f 41 46 46 5f 52 45 41 4c 3b 0a 23 65 6e 64  E_AFF_REAL;.#end
9540: 69 66 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  if.    }else if(
9550: 20 28 68 26 30 78 30 30 46 46 46 46 46 46 29 3d   (h&0x00FFFFFF)=
9560: 3d 28 28 27 69 27 3c 3c 31 36 29 2b 28 27 6e 27  =(('i'<<16)+('n'
9570: 3c 3c 38 29 2b 27 74 27 29 20 29 7b 20 20 20 20  <<8)+'t') ){    
9580: 2f 2a 20 49 4e 54 20 2a 2f 0a 20 20 20 20 20 20  /* INT */.      
9590: 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46  aff = SQLITE_AFF
95a0: 5f 49 4e 54 45 47 45 52 3b 0a 20 20 20 20 20 20  _INTEGER;.      
95b0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
95c0: 0a 0a 20 20 2f 2a 20 49 66 20 70 73 7a 45 73 74  ..  /* If pszEst
95d0: 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 73 74   is not NULL, st
95e0: 6f 72 65 20 61 6e 20 65 73 74 69 6d 61 74 65 20  ore an estimate 
95f0: 6f 66 20 74 68 65 20 66 69 65 6c 64 20 73 69 7a  of the field siz
9600: 65 2e 20 20 54 68 65 0a 20 20 2a 2a 20 65 73 74  e.  The.  ** est
9610: 69 6d 61 74 65 20 69 73 20 73 63 61 6c 65 64 20  imate is scaled 
9620: 73 6f 20 74 68 61 74 20 74 68 65 20 73 69 7a 65  so that the size
9630: 20 6f 66 20 61 6e 20 69 6e 74 65 67 65 72 20 69   of an integer i
9640: 73 20 31 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70  s 1.  */.  if( p
9650: 73 7a 45 73 74 20 29 7b 0a 20 20 20 20 2a 70 73  szEst ){.    *ps
9660: 7a 45 73 74 20 3d 20 31 3b 20 20 20 2f 2a 20 64  zEst = 1;   /* d
9670: 65 66 61 75 6c 74 20 73 69 7a 65 20 69 73 20 61  efault size is a
9680: 70 70 72 6f 78 20 34 20 62 79 74 65 73 20 2a 2f  pprox 4 bytes */
9690: 0a 20 20 20 20 69 66 28 20 61 66 66 3c 53 51 4c  .    if( aff<SQL
96a0: 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20  ITE_AFF_NUMERIC 
96b0: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 7a 43 68  ){.      if( zCh
96c0: 61 72 20 29 7b 0a 20 20 20 20 20 20 20 20 77 68  ar ){.        wh
96d0: 69 6c 65 28 20 7a 43 68 61 72 5b 30 5d 20 29 7b  ile( zChar[0] ){
96e0: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73  .          if( s
96f0: 71 6c 69 74 65 33 49 73 64 69 67 69 74 28 7a 43  qlite3Isdigit(zC
9700: 68 61 72 5b 30 5d 29 20 29 7b 0a 20 20 20 20 20  har[0]) ){.     
9710: 20 20 20 20 20 20 20 69 6e 74 20 76 20 3d 20 30         int v = 0
9720: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  ;.            sq
9730: 6c 69 74 65 33 47 65 74 49 6e 74 33 32 28 7a 43  lite3GetInt32(zC
9740: 68 61 72 2c 20 26 76 29 3b 0a 20 20 20 20 20 20  har, &v);.      
9750: 20 20 20 20 20 20 76 20 3d 20 76 2f 34 20 2b 20        v = v/4 + 
9760: 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  1;.            i
9770: 66 28 20 76 3e 32 35 35 20 29 20 76 20 3d 20 32  f( v>255 ) v = 2
9780: 35 35 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  55;.            
9790: 2a 70 73 7a 45 73 74 20 3d 20 76 3b 20 2f 2a 20  *pszEst = v; /* 
97a0: 42 4c 4f 42 28 6b 29 2c 20 56 41 52 43 48 41 52  BLOB(k), VARCHAR
97b0: 28 6b 29 2c 20 43 48 41 52 28 6b 29 20 2d 3e 20  (k), CHAR(k) -> 
97c0: 72 3d 28 6b 2f 34 2b 31 29 20 2a 2f 0a 20 20 20  r=(k/4+1) */.   
97d0: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
97e0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
97f0: 20 20 20 20 20 20 7a 43 68 61 72 2b 2b 3b 0a 20        zChar++;. 
9800: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
9810: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2a 70  else{.        *p
9820: 73 7a 45 73 74 20 3d 20 35 3b 20 20 20 2f 2a 20  szEst = 5;   /* 
9830: 42 4c 4f 42 2c 20 54 45 58 54 2c 20 43 4c 4f 42  BLOB, TEXT, CLOB
9840: 20 2d 3e 20 72 3d 35 20 20 28 61 70 70 72 6f 78   -> r=5  (approx
9850: 20 32 30 20 62 79 74 65 73 29 2a 2f 0a 20 20 20   20 bytes)*/.   
9860: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
9870: 20 72 65 74 75 72 6e 20 61 66 66 3b 0a 7d 0a 0a   return aff;.}..
9880: 2f 2a 0a 2a 2a 20 54 68 65 20 65 78 70 72 65 73  /*.** The expres
9890: 73 69 6f 6e 20 69 73 20 74 68 65 20 64 65 66 61  sion is the defa
98a0: 75 6c 74 20 76 61 6c 75 65 20 66 6f 72 20 74 68  ult value for th
98b0: 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20  e most recently 
98c0: 61 64 64 65 64 20 63 6f 6c 75 6d 6e 0a 2a 2a 20  added column.** 
98d0: 6f 66 20 74 68 65 20 74 61 62 6c 65 20 63 75 72  of the table cur
98e0: 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e  rently under con
98f0: 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  struction..**.**
9900: 20 44 65 66 61 75 6c 74 20 76 61 6c 75 65 20 65   Default value e
9910: 78 70 72 65 73 73 69 6f 6e 73 20 6d 75 73 74 20  xpressions must 
9920: 62 65 20 63 6f 6e 73 74 61 6e 74 2e 20 20 52 61  be constant.  Ra
9930: 69 73 65 20 61 6e 20 65 78 63 65 70 74 69 6f 6e  ise an exception
9940: 20 69 66 20 74 68 69 73 0a 2a 2a 20 69 73 20 6e   if this.** is n
9950: 6f 74 20 74 68 65 20 63 61 73 65 2e 0a 2a 2a 0a  ot the case..**.
9960: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
9970: 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65  is called by the
9980: 20 70 61 72 73 65 72 20 77 68 69 6c 65 20 69 6e   parser while in
9990: 20 74 68 65 20 6d 69 64 64 6c 65 20 6f 66 0a 2a   the middle of.*
99a0: 2a 20 70 61 72 73 69 6e 67 20 61 20 43 52 45 41  * parsing a CREA
99b0: 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65  TE TABLE stateme
99c0: 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  nt..*/.void sqli
99d0: 74 65 33 41 64 64 44 65 66 61 75 6c 74 56 61 6c  te3AddDefaultVal
99e0: 75 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ue(Parse *pParse
99f0: 2c 20 45 78 70 72 53 70 61 6e 20 2a 70 53 70 61  , ExprSpan *pSpa
9a00: 6e 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a  n){.  Table *p;.
9a10: 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a    Column *pCol;.
9a20: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
9a30: 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 70 20  pParse->db;.  p 
9a40: 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  = pParse->pNewTa
9a50: 62 6c 65 3b 0a 20 20 69 66 28 20 70 21 3d 30 20  ble;.  if( p!=0 
9a60: 29 7b 0a 20 20 20 20 70 43 6f 6c 20 3d 20 26 28  ){.    pCol = &(
9a70: 70 2d 3e 61 43 6f 6c 5b 70 2d 3e 6e 43 6f 6c 2d  p->aCol[p->nCol-
9a80: 31 5d 29 3b 0a 20 20 20 20 69 66 28 20 21 73 71  1]);.    if( !sq
9a90: 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74  lite3ExprIsConst
9aa0: 61 6e 74 4f 72 46 75 6e 63 74 69 6f 6e 28 70 53  antOrFunction(pS
9ab0: 70 61 6e 2d 3e 70 45 78 70 72 2c 20 64 62 2d 3e  pan->pExpr, db->
9ac0: 69 6e 69 74 2e 62 75 73 79 29 20 29 7b 0a 20 20  init.busy) ){.  
9ad0: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
9ae0: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 64 65 66  Msg(pParse, "def
9af0: 61 75 6c 74 20 76 61 6c 75 65 20 6f 66 20 63 6f  ault value of co
9b00: 6c 75 6d 6e 20 5b 25 73 5d 20 69 73 20 6e 6f 74  lumn [%s] is not
9b10: 20 63 6f 6e 73 74 61 6e 74 22 2c 0a 20 20 20 20   constant",.    
9b20: 20 20 20 20 20 20 70 43 6f 6c 2d 3e 7a 4e 61 6d        pCol->zNam
9b30: 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  e);.    }else{. 
9b40: 20 20 20 20 20 2f 2a 20 41 20 63 6f 70 79 20 6f       /* A copy o
9b50: 66 20 70 45 78 70 72 20 69 73 20 75 73 65 64 20  f pExpr is used 
9b60: 69 6e 73 74 65 61 64 20 6f 66 20 74 68 65 20 6f  instead of the o
9b70: 72 69 67 69 6e 61 6c 2c 20 61 73 20 70 45 78 70  riginal, as pExp
9b80: 72 20 63 6f 6e 74 61 69 6e 73 0a 20 20 20 20 20  r contains.     
9b90: 20 2a 2a 20 74 6f 6b 65 6e 73 20 74 68 61 74 20   ** tokens that 
9ba0: 70 6f 69 6e 74 20 74 6f 20 76 6f 6c 61 74 69 6c  point to volatil
9bb0: 65 20 6d 65 6d 6f 72 79 2e 20 54 68 65 20 27 73  e memory. The 's
9bc0: 70 61 6e 27 20 6f 66 20 74 68 65 20 65 78 70 72  pan' of the expr
9bd0: 65 73 73 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20  ession.      ** 
9be0: 69 73 20 72 65 71 75 69 72 65 64 20 62 79 20 70  is required by p
9bf0: 72 61 67 6d 61 20 74 61 62 6c 65 5f 69 6e 66 6f  ragma table_info
9c00: 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
9c10: 20 45 78 70 72 20 78 3b 0a 20 20 20 20 20 20 73   Expr x;.      s
9c20: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
9c30: 28 64 62 2c 20 70 43 6f 6c 2d 3e 70 44 66 6c 74  (db, pCol->pDflt
9c40: 29 3b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28  );.      memset(
9c50: 26 78 2c 20 30 2c 20 73 69 7a 65 6f 66 28 78 29  &x, 0, sizeof(x)
9c60: 29 3b 0a 20 20 20 20 20 20 78 2e 6f 70 20 3d 20  );.      x.op = 
9c70: 54 4b 5f 53 50 41 4e 3b 0a 20 20 20 20 20 20 78  TK_SPAN;.      x
9c80: 2e 75 2e 7a 54 6f 6b 65 6e 20 3d 20 73 71 6c 69  .u.zToken = sqli
9c90: 74 65 33 44 62 53 74 72 4e 44 75 70 28 64 62 2c  te3DbStrNDup(db,
9ca0: 20 28 63 68 61 72 2a 29 70 53 70 61 6e 2d 3e 7a   (char*)pSpan->z
9cb0: 53 74 61 72 74 2c 0a 20 20 20 20 20 20 20 20 20  Start,.         
9cc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9cd0: 20 20 20 20 20 20 20 20 20 20 20 28 69 6e 74 29             (int)
9ce0: 28 70 53 70 61 6e 2d 3e 7a 45 6e 64 20 2d 20 70  (pSpan->zEnd - p
9cf0: 53 70 61 6e 2d 3e 7a 53 74 61 72 74 29 29 3b 0a  Span->zStart));.
9d00: 20 20 20 20 20 20 78 2e 70 4c 65 66 74 20 3d 20        x.pLeft = 
9d10: 70 53 70 61 6e 2d 3e 70 45 78 70 72 3b 0a 20 20  pSpan->pExpr;.  
9d20: 20 20 20 20 78 2e 66 6c 61 67 73 20 3d 20 45 50      x.flags = EP
9d30: 5f 53 6b 69 70 3b 0a 20 20 20 20 20 20 70 43 6f  _Skip;.      pCo
9d40: 6c 2d 3e 70 44 66 6c 74 20 3d 20 73 71 6c 69 74  l->pDflt = sqlit
9d50: 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 26 78  e3ExprDup(db, &x
9d60: 2c 20 45 58 50 52 44 55 50 5f 52 45 44 55 43 45  , EXPRDUP_REDUCE
9d70: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
9d80: 44 62 46 72 65 65 28 64 62 2c 20 78 2e 75 2e 7a  DbFree(db, x.u.z
9d90: 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 7d 0a 20 20  Token);.    }.  
9da0: 7d 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44  }.  sqlite3ExprD
9db0: 65 6c 65 74 65 28 64 62 2c 20 70 53 70 61 6e 2d  elete(db, pSpan-
9dc0: 3e 70 45 78 70 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  >pExpr);.}../*.*
9dd0: 2a 20 42 61 63 6b 77 61 72 64 73 20 43 6f 6d 70  * Backwards Comp
9de0: 61 74 69 62 69 6c 69 74 79 20 48 61 63 6b 3a 0a  atibility Hack:.
9df0: 2a 2a 20 0a 2a 2a 20 48 69 73 74 6f 72 69 63 61  ** .** Historica
9e00: 6c 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51  l versions of SQ
9e10: 4c 69 74 65 20 61 63 63 65 70 74 65 64 20 73 74  Lite accepted st
9e20: 72 69 6e 67 73 20 61 73 20 63 6f 6c 75 6d 6e 20  rings as column 
9e30: 6e 61 6d 65 73 20 69 6e 0a 2a 2a 20 69 6e 64 65  names in.** inde
9e40: 78 65 73 20 61 6e 64 20 50 52 49 4d 41 52 59 20  xes and PRIMARY 
9e50: 4b 45 59 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  KEY constraints 
9e60: 61 6e 64 20 69 6e 20 55 4e 49 51 55 45 20 63 6f  and in UNIQUE co
9e70: 6e 73 74 72 61 69 6e 74 73 2e 20 20 45 78 61 6d  nstraints.  Exam
9e80: 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 43  ple:.**.**     C
9e90: 52 45 41 54 45 20 54 41 42 4c 45 20 78 79 7a 28  REATE TABLE xyz(
9ea0: 61 2c 62 2c 63 2c 64 2c 65 2c 50 52 49 4d 41 52  a,b,c,d,e,PRIMAR
9eb0: 59 20 4b 45 59 28 27 61 27 29 2c 55 4e 49 51 55  Y KEY('a'),UNIQU
9ec0: 45 28 27 62 27 2c 27 63 27 20 43 4f 4c 4c 41 54  E('b','c' COLLAT
9ed0: 45 20 74 72 69 6d 29 0a 2a 2a 20 20 20 20 20 43  E trim).**     C
9ee0: 52 45 41 54 45 20 49 4e 44 45 58 20 61 62 63 20  REATE INDEX abc 
9ef0: 4f 4e 20 78 79 7a 28 27 63 27 2c 27 64 27 20 44  ON xyz('c','d' D
9f00: 45 53 43 2c 27 65 27 20 43 4f 4c 4c 41 54 45 20  ESC,'e' COLLATE 
9f10: 6e 6f 63 61 73 65 20 44 45 53 43 29 3b 0a 2a 2a  nocase DESC);.**
9f20: 0a 2a 2a 20 54 68 69 73 20 69 73 20 67 6f 6f 66  .** This is goof
9f30: 79 2e 20 20 42 75 74 20 74 6f 20 70 72 65 73 65  y.  But to prese
9f40: 72 76 65 20 62 61 63 6b 77 61 72 64 73 20 63 6f  rve backwards co
9f50: 6d 70 61 74 69 62 69 6c 69 74 79 20 77 65 20 63  mpatibility we c
9f60: 6f 6e 74 69 6e 75 65 20 74 6f 0a 2a 2a 20 61 63  ontinue to.** ac
9f70: 63 65 70 74 20 69 74 2e 20 20 54 68 69 73 20 72  cept it.  This r
9f80: 6f 75 74 69 6e 65 20 64 6f 65 73 20 74 68 65 20  outine does the 
9f90: 6e 65 63 65 73 73 61 72 79 20 63 6f 6e 76 65 72  necessary conver
9fa0: 73 69 6f 6e 2e 20 20 49 74 20 63 6f 6e 76 65 72  sion.  It conver
9fb0: 74 73 0a 2a 2a 20 74 68 65 20 65 78 70 72 65 73  ts.** the expres
9fc0: 73 69 6f 6e 20 67 69 76 65 6e 20 69 6e 20 69 74  sion given in it
9fd0: 73 20 61 72 67 75 6d 65 6e 74 20 66 72 6f 6d 20  s argument from 
9fe0: 61 20 54 4b 5f 53 54 52 49 4e 47 20 69 6e 74 6f  a TK_STRING into
9ff0: 20 61 20 54 4b 5f 49 44 0a 2a 2a 20 69 66 20 74   a TK_ID.** if t
a000: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
a010: 20 6a 75 73 74 20 61 20 54 4b 5f 53 54 52 49 4e   just a TK_STRIN
a020: 47 20 77 69 74 68 20 61 6e 20 6f 70 74 69 6f 6e  G with an option
a030: 61 6c 20 43 4f 4c 4c 41 54 45 20 63 6c 61 75 73  al COLLATE claus
a040: 65 2e 0a 2a 2a 20 49 66 20 74 68 65 20 65 70 78  e..** If the epx
a050: 72 65 73 73 69 6f 6e 20 69 73 20 61 6e 79 74 68  ression is anyth
a060: 69 6e 67 20 6f 74 68 65 72 20 74 68 61 6e 20 54  ing other than T
a070: 4b 5f 53 54 52 49 4e 47 2c 20 74 68 65 20 65 78  K_STRING, the ex
a080: 70 72 65 73 73 69 6f 6e 20 69 73 0a 2a 2a 20 75  pression is.** u
a090: 6e 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 73 74 61  nchanged..*/.sta
a0a0: 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65 33  tic void sqlite3
a0b0: 53 74 72 69 6e 67 54 6f 49 64 28 45 78 70 72 20  StringToId(Expr 
a0c0: 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 6f 70  *p){.  if( p->op
a0d0: 3d 3d 54 4b 5f 53 54 52 49 4e 47 20 29 7b 0a 20  ==TK_STRING ){. 
a0e0: 20 20 20 70 2d 3e 6f 70 20 3d 20 54 4b 5f 49 44     p->op = TK_ID
a0f0: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d  ;.  }else if( p-
a100: 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45 20  >op==TK_COLLATE 
a110: 26 26 20 70 2d 3e 70 4c 65 66 74 2d 3e 6f 70 3d  && p->pLeft->op=
a120: 3d 54 4b 5f 53 54 52 49 4e 47 20 29 7b 0a 20 20  =TK_STRING ){.  
a130: 20 20 70 2d 3e 70 4c 65 66 74 2d 3e 6f 70 20 3d    p->pLeft->op =
a140: 20 54 4b 5f 49 44 3b 0a 20 20 7d 0a 7d 0a 0a 2f   TK_ID;.  }.}../
a150: 2a 0a 2a 2a 20 44 65 73 69 67 6e 61 74 65 20 74  *.** Designate t
a160: 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 66  he PRIMARY KEY f
a170: 6f 72 20 74 68 65 20 74 61 62 6c 65 2e 20 20 70  or the table.  p
a180: 4c 69 73 74 20 69 73 20 61 20 6c 69 73 74 20 6f  List is a list o
a190: 66 20 6e 61 6d 65 73 20 0a 2a 2a 20 6f 66 20 63  f names .** of c
a1a0: 6f 6c 75 6d 6e 73 20 74 68 61 74 20 66 6f 72 6d  olumns that form
a1b0: 20 74 68 65 20 70 72 69 6d 61 72 79 20 6b 65 79   the primary key
a1c0: 2e 20 20 49 66 20 70 4c 69 73 74 20 69 73 20 4e  .  If pList is N
a1d0: 55 4c 4c 2c 20 74 68 65 6e 20 74 68 65 0a 2a 2a  ULL, then the.**
a1e0: 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 61   most recently a
a1f0: 64 64 65 64 20 63 6f 6c 75 6d 6e 20 6f 66 20 74  dded column of t
a200: 68 65 20 74 61 62 6c 65 20 69 73 20 74 68 65 20  he table is the 
a210: 70 72 69 6d 61 72 79 20 6b 65 79 2e 0a 2a 2a 0a  primary key..**.
a220: 2a 2a 20 41 20 74 61 62 6c 65 20 63 61 6e 20 68  ** A table can h
a230: 61 76 65 20 61 74 20 6d 6f 73 74 20 6f 6e 65 20  ave at most one 
a240: 70 72 69 6d 61 72 79 20 6b 65 79 2e 20 20 49 66  primary key.  If
a250: 20 74 68 65 20 74 61 62 6c 65 20 61 6c 72 65 61   the table alrea
a260: 64 79 20 68 61 73 0a 2a 2a 20 61 20 70 72 69 6d  dy has.** a prim
a270: 61 72 79 20 6b 65 79 20 28 61 6e 64 20 74 68 69  ary key (and thi
a280: 73 20 69 73 20 74 68 65 20 73 65 63 6f 6e 64 20  s is the second 
a290: 70 72 69 6d 61 72 79 20 6b 65 79 29 20 74 68 65  primary key) the
a2a0: 6e 20 63 72 65 61 74 65 20 61 6e 0a 2a 2a 20 65  n create an.** e
a2b0: 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  rror..**.** If t
a2c0: 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 69  he PRIMARY KEY i
a2d0: 73 20 6f 6e 20 61 20 73 69 6e 67 6c 65 20 63 6f  s on a single co
a2e0: 6c 75 6d 6e 20 77 68 6f 73 65 20 64 61 74 61 74  lumn whose datat
a2f0: 79 70 65 20 69 73 20 49 4e 54 45 47 45 52 2c 0a  ype is INTEGER,.
a300: 2a 2a 20 74 68 65 6e 20 77 65 20 77 69 6c 6c 20  ** then we will 
a310: 74 72 79 20 74 6f 20 75 73 65 20 74 68 61 74 20  try to use that 
a320: 63 6f 6c 75 6d 6e 20 61 73 20 74 68 65 20 72 6f  column as the ro
a330: 77 69 64 2e 20 20 53 65 74 20 74 68 65 20 54 61  wid.  Set the Ta
a340: 62 6c 65 2e 69 50 4b 65 79 0a 2a 2a 20 66 69 65  ble.iPKey.** fie
a350: 6c 64 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  ld of the table 
a360: 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69  under constructi
a370: 6f 6e 20 74 6f 20 62 65 20 74 68 65 20 69 6e 64  on to be the ind
a380: 65 78 20 6f 66 20 74 68 65 0a 2a 2a 20 49 4e 54  ex of the.** INT
a390: 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59  EGER PRIMARY KEY
a3a0: 20 63 6f 6c 75 6d 6e 2e 20 20 54 61 62 6c 65 2e   column.  Table.
a3b0: 69 50 4b 65 79 20 69 73 20 73 65 74 20 74 6f 20  iPKey is set to 
a3c0: 2d 31 20 69 66 20 74 68 65 72 65 20 69 73 0a 2a  -1 if there is.*
a3d0: 2a 20 6e 6f 20 49 4e 54 45 47 45 52 20 50 52 49  * no INTEGER PRI
a3e0: 4d 41 52 59 20 4b 45 59 2e 0a 2a 2a 0a 2a 2a 20  MARY KEY..**.** 
a3f0: 49 66 20 74 68 65 20 6b 65 79 20 69 73 20 6e 6f  If the key is no
a400: 74 20 61 6e 20 49 4e 54 45 47 45 52 20 50 52 49  t an INTEGER PRI
a410: 4d 41 52 59 20 4b 45 59 2c 20 74 68 65 6e 20 63  MARY KEY, then c
a420: 72 65 61 74 65 20 61 20 75 6e 69 71 75 65 0a 2a  reate a unique.*
a430: 2a 20 69 6e 64 65 78 20 66 6f 72 20 74 68 65 20  * index for the 
a440: 6b 65 79 2e 20 20 4e 6f 20 69 6e 64 65 78 20 69  key.  No index i
a450: 73 20 63 72 65 61 74 65 64 20 66 6f 72 20 49 4e  s created for IN
a460: 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45  TEGER PRIMARY KE
a470: 59 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  Ys..*/.void sqli
a480: 74 65 33 41 64 64 50 72 69 6d 61 72 79 4b 65 79  te3AddPrimaryKey
a490: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
a4a0: 65 2c 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67  e,    /* Parsing
a4b0: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78   context */.  Ex
a4c0: 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20  prList *pList,  
a4d0: 2f 2a 20 4c 69 73 74 20 6f 66 20 66 69 65 6c 64  /* List of field
a4e0: 20 6e 61 6d 65 73 20 74 6f 20 62 65 20 69 6e 64   names to be ind
a4f0: 65 78 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 6e  exed */.  int on
a500: 45 72 72 6f 72 2c 20 20 20 20 20 20 2f 2a 20 57  Error,      /* W
a510: 68 61 74 20 74 6f 20 64 6f 20 77 69 74 68 20 61  hat to do with a
a520: 20 75 6e 69 71 75 65 6e 65 73 73 20 63 6f 6e 66   uniqueness conf
a530: 6c 69 63 74 20 2a 2f 0a 20 20 69 6e 74 20 61 75  lict */.  int au
a540: 74 6f 49 6e 63 2c 20 20 20 20 20 20 2f 2a 20 54  toInc,      /* T
a550: 72 75 65 20 69 66 20 74 68 65 20 41 55 54 4f 49  rue if the AUTOI
a560: 4e 43 52 45 4d 45 4e 54 20 6b 65 79 77 6f 72 64  NCREMENT keyword
a570: 20 69 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a 20   is present */. 
a580: 20 69 6e 74 20 73 6f 72 74 4f 72 64 65 72 20 20   int sortOrder  
a590: 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 53 4f 5f     /* SQLITE_SO_
a5a0: 41 53 43 20 6f 72 20 53 51 4c 49 54 45 5f 53 4f  ASC or SQLITE_SO
a5b0: 5f 44 45 53 43 20 2a 2f 0a 29 7b 0a 20 20 54 61  _DESC */.){.  Ta
a5c0: 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 50 61 72  ble *pTab = pPar
a5d0: 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20  se->pNewTable;. 
a5e0: 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 20 3d 20   Column *pCol = 
a5f0: 30 3b 0a 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20  0;.  int iCol = 
a600: 2d 31 2c 20 69 3b 0a 20 20 69 6e 74 20 6e 54 65  -1, i;.  int nTe
a610: 72 6d 3b 0a 20 20 69 66 28 20 70 54 61 62 3d 3d  rm;.  if( pTab==
a620: 30 20 29 20 67 6f 74 6f 20 70 72 69 6d 61 72 79  0 ) goto primary
a630: 5f 6b 65 79 5f 65 78 69 74 3b 0a 20 20 69 66 28  _key_exit;.  if(
a640: 20 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20   pTab->tabFlags 
a650: 26 20 54 46 5f 48 61 73 50 72 69 6d 61 72 79 4b  & TF_HasPrimaryK
a660: 65 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ey ){.    sqlite
a670: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
a680: 2c 20 0a 20 20 20 20 20 20 22 74 61 62 6c 65 20  , .      "table 
a690: 5c 22 25 73 5c 22 20 68 61 73 20 6d 6f 72 65 20  \"%s\" has more 
a6a0: 74 68 61 6e 20 6f 6e 65 20 70 72 69 6d 61 72 79  than one primary
a6b0: 20 6b 65 79 22 2c 20 70 54 61 62 2d 3e 7a 4e 61   key", pTab->zNa
a6c0: 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20 70 72  me);.    goto pr
a6d0: 69 6d 61 72 79 5f 6b 65 79 5f 65 78 69 74 3b 0a  imary_key_exit;.
a6e0: 20 20 7d 0a 20 20 70 54 61 62 2d 3e 74 61 62 46    }.  pTab->tabF
a6f0: 6c 61 67 73 20 7c 3d 20 54 46 5f 48 61 73 50 72  lags |= TF_HasPr
a700: 69 6d 61 72 79 4b 65 79 3b 0a 20 20 69 66 28 20  imaryKey;.  if( 
a710: 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20  pList==0 ){.    
a720: 69 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 6e 43 6f  iCol = pTab->nCo
a730: 6c 20 2d 20 31 3b 0a 20 20 20 20 70 43 6f 6c 20  l - 1;.    pCol 
a740: 3d 20 26 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43  = &pTab->aCol[iC
a750: 6f 6c 5d 3b 0a 20 20 20 20 70 43 6f 6c 2d 3e 63  ol];.    pCol->c
a760: 6f 6c 46 6c 61 67 73 20 7c 3d 20 43 4f 4c 46 4c  olFlags |= COLFL
a770: 41 47 5f 50 52 49 4d 4b 45 59 3b 0a 20 20 20 20  AG_PRIMKEY;.    
a780: 6e 54 65 72 6d 20 3d 20 31 3b 0a 20 20 7d 65 6c  nTerm = 1;.  }el
a790: 73 65 7b 0a 20 20 20 20 6e 54 65 72 6d 20 3d 20  se{.    nTerm = 
a7a0: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20  pList->nExpr;.  
a7b0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 54 65    for(i=0; i<nTe
a7c0: 72 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  rm; i++){.      
a7d0: 45 78 70 72 20 2a 70 43 45 78 70 72 20 3d 20 73  Expr *pCExpr = s
a7e0: 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f  qlite3ExprSkipCo
a7f0: 6c 6c 61 74 65 28 70 4c 69 73 74 2d 3e 61 5b 69  llate(pList->a[i
a800: 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  ].pExpr);.      
a810: 61 73 73 65 72 74 28 20 70 43 45 78 70 72 21 3d  assert( pCExpr!=
a820: 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 );.      sqlit
a830: 65 33 53 74 72 69 6e 67 54 6f 49 64 28 70 43 45  e3StringToId(pCE
a840: 78 70 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20  xpr);.      if( 
a850: 70 43 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49  pCExpr->op==TK_I
a860: 44 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e  D ){.        con
a870: 73 74 20 63 68 61 72 20 2a 7a 43 4e 61 6d 65 20  st char *zCName 
a880: 3d 20 70 43 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b  = pCExpr->u.zTok
a890: 65 6e 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28  en;.        for(
a8a0: 69 43 6f 6c 3d 30 3b 20 69 43 6f 6c 3c 70 54 61  iCol=0; iCol<pTa
a8b0: 62 2d 3e 6e 43 6f 6c 3b 20 69 43 6f 6c 2b 2b 29  b->nCol; iCol++)
a8c0: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
a8d0: 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a  sqlite3StrICmp(z
a8e0: 43 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 61 43 6f  CName, pTab->aCo
a8f0: 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 29 3d 3d  l[iCol].zName)==
a900: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
a910: 20 70 43 6f 6c 20 3d 20 26 70 54 61 62 2d 3e 61   pCol = &pTab->a
a920: 43 6f 6c 5b 69 43 6f 6c 5d 3b 0a 20 20 20 20 20  Col[iCol];.     
a930: 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 63 6f 6c         pCol->col
a940: 46 6c 61 67 73 20 7c 3d 20 43 4f 4c 46 4c 41 47  Flags |= COLFLAG
a950: 5f 50 52 49 4d 4b 45 59 3b 0a 20 20 20 20 20 20  _PRIMKEY;.      
a960: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
a970: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
a980: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
a990: 0a 20 20 7d 0a 20 20 69 66 28 20 6e 54 65 72 6d  .  }.  if( nTerm
a9a0: 3d 3d 31 0a 20 20 20 26 26 20 70 43 6f 6c 0a 20  ==1.   && pCol. 
a9b0: 20 20 26 26 20 73 71 6c 69 74 65 33 53 74 72 49    && sqlite3StrI
a9c0: 43 6d 70 28 73 71 6c 69 74 65 33 43 6f 6c 75 6d  Cmp(sqlite3Colum
a9d0: 6e 54 79 70 65 28 70 43 6f 6c 2c 22 22 29 2c 20  nType(pCol,""), 
a9e0: 22 49 4e 54 45 47 45 52 22 29 3d 3d 30 0a 20 20  "INTEGER")==0.  
a9f0: 20 26 26 20 73 6f 72 74 4f 72 64 65 72 21 3d 53   && sortOrder!=S
aa00: 51 4c 49 54 45 5f 53 4f 5f 44 45 53 43 0a 20 20  QLITE_SO_DESC.  
aa10: 29 7b 0a 20 20 20 20 70 54 61 62 2d 3e 69 50 4b  ){.    pTab->iPK
aa20: 65 79 20 3d 20 69 43 6f 6c 3b 0a 20 20 20 20 70  ey = iCol;.    p
aa30: 54 61 62 2d 3e 6b 65 79 43 6f 6e 66 20 3d 20 28  Tab->keyConf = (
aa40: 75 38 29 6f 6e 45 72 72 6f 72 3b 0a 20 20 20 20  u8)onError;.    
aa50: 61 73 73 65 72 74 28 20 61 75 74 6f 49 6e 63 3d  assert( autoInc=
aa60: 3d 30 20 7c 7c 20 61 75 74 6f 49 6e 63 3d 3d 31  =0 || autoInc==1
aa70: 20 29 3b 0a 20 20 20 20 70 54 61 62 2d 3e 74 61   );.    pTab->ta
aa80: 62 46 6c 61 67 73 20 7c 3d 20 61 75 74 6f 49 6e  bFlags |= autoIn
aa90: 63 2a 54 46 5f 41 75 74 6f 69 6e 63 72 65 6d 65  c*TF_Autoincreme
aaa0: 6e 74 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73  nt;.    if( pLis
aab0: 74 20 29 20 70 50 61 72 73 65 2d 3e 69 50 6b 53  t ) pParse->iPkS
aac0: 6f 72 74 4f 72 64 65 72 20 3d 20 70 4c 69 73 74  ortOrder = pList
aad0: 2d 3e 61 5b 30 5d 2e 73 6f 72 74 4f 72 64 65 72  ->a[0].sortOrder
aae0: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 61 75  ;.  }else if( au
aaf0: 74 6f 49 6e 63 20 29 7b 0a 23 69 66 6e 64 65 66  toInc ){.#ifndef
ab00: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
ab10: 4f 49 4e 43 52 45 4d 45 4e 54 0a 20 20 20 20 73  OINCREMENT.    s
ab20: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
ab30: 50 61 72 73 65 2c 20 22 41 55 54 4f 49 4e 43 52  Parse, "AUTOINCR
ab40: 45 4d 45 4e 54 20 69 73 20 6f 6e 6c 79 20 61 6c  EMENT is only al
ab50: 6c 6f 77 65 64 20 6f 6e 20 61 6e 20 22 0a 20 20  lowed on an ".  
ab60: 20 20 20 20 20 22 49 4e 54 45 47 45 52 20 50 52       "INTEGER PR
ab70: 49 4d 41 52 59 20 4b 45 59 22 29 3b 0a 23 65 6e  IMARY KEY");.#en
ab80: 64 69 66 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  dif.  }else{.   
ab90: 20 73 71 6c 69 74 65 33 43 72 65 61 74 65 49 6e   sqlite3CreateIn
aba0: 64 65 78 28 70 50 61 72 73 65 2c 20 30 2c 20 30  dex(pParse, 0, 0
abb0: 2c 20 30 2c 20 70 4c 69 73 74 2c 20 6f 6e 45 72  , 0, pList, onEr
abc0: 72 6f 72 2c 20 30 2c 0a 20 20 20 20 20 20 20 20  ror, 0,.        
abd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
abe0: 20 20 20 30 2c 20 73 6f 72 74 4f 72 64 65 72 2c     0, sortOrder,
abf0: 20 30 2c 20 53 51 4c 49 54 45 5f 49 44 58 54 59   0, SQLITE_IDXTY
ac00: 50 45 5f 50 52 49 4d 41 52 59 4b 45 59 29 3b 0a  PE_PRIMARYKEY);.
ac10: 20 20 20 20 70 4c 69 73 74 20 3d 20 30 3b 0a 20      pList = 0;. 
ac20: 20 7d 0a 0a 70 72 69 6d 61 72 79 5f 6b 65 79 5f   }..primary_key_
ac30: 65 78 69 74 3a 0a 20 20 73 71 6c 69 74 65 33 45  exit:.  sqlite3E
ac40: 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70 50  xprListDelete(pP
ac50: 61 72 73 65 2d 3e 64 62 2c 20 70 4c 69 73 74 29  arse->db, pList)
ac60: 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f  ;.  return;.}../
ac70: 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77 20 43  *.** Add a new C
ac80: 48 45 43 4b 20 63 6f 6e 73 74 72 61 69 6e 74 20  HECK constraint 
ac90: 74 6f 20 74 68 65 20 74 61 62 6c 65 20 63 75 72  to the table cur
aca0: 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e  rently under con
acb0: 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f  struction..*/.vo
acc0: 69 64 20 73 71 6c 69 74 65 33 41 64 64 43 68 65  id sqlite3AddChe
acd0: 63 6b 43 6f 6e 73 74 72 61 69 6e 74 28 0a 20 20  ckConstraint(.  
ace0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
acf0: 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
ad00: 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a  text */.  Expr *
ad10: 70 43 68 65 63 6b 45 78 70 72 20 20 2f 2a 20 54  pCheckExpr  /* T
ad20: 68 65 20 63 68 65 63 6b 20 65 78 70 72 65 73 73  he check express
ad30: 69 6f 6e 20 2a 2f 0a 29 7b 0a 23 69 66 6e 64 65  ion */.){.#ifnde
ad40: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 48  f SQLITE_OMIT_CH
ad50: 45 43 4b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61  ECK.  Table *pTa
ad60: 62 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  b = pParse->pNew
ad70: 54 61 62 6c 65 3b 0a 20 20 73 71 6c 69 74 65 33  Table;.  sqlite3
ad80: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
ad90: 62 3b 0a 20 20 69 66 28 20 70 54 61 62 20 26 26  b;.  if( pTab &&
ada0: 20 21 49 4e 5f 44 45 43 4c 41 52 45 5f 56 54 41   !IN_DECLARE_VTA
adb0: 42 0a 20 20 20 26 26 20 21 73 71 6c 69 74 65 33  B.   && !sqlite3
adc0: 42 74 72 65 65 49 73 52 65 61 64 6f 6e 6c 79 28  BtreeIsReadonly(
add0: 64 62 2d 3e 61 44 62 5b 64 62 2d 3e 69 6e 69 74  db->aDb[db->init
ade0: 2e 69 44 62 5d 2e 70 42 74 29 0a 20 20 29 7b 0a  .iDb].pBt).  ){.
adf0: 20 20 20 20 70 54 61 62 2d 3e 70 43 68 65 63 6b      pTab->pCheck
ae00: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69   = sqlite3ExprLi
ae10: 73 74 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c  stAppend(pParse,
ae20: 20 70 54 61 62 2d 3e 70 43 68 65 63 6b 2c 20 70   pTab->pCheck, p
ae30: 43 68 65 63 6b 45 78 70 72 29 3b 0a 20 20 20 20  CheckExpr);.    
ae40: 69 66 28 20 70 50 61 72 73 65 2d 3e 63 6f 6e 73  if( pParse->cons
ae50: 74 72 61 69 6e 74 4e 61 6d 65 2e 6e 20 29 7b 0a  traintName.n ){.
ae60: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
ae70: 72 4c 69 73 74 53 65 74 4e 61 6d 65 28 70 50 61  rListSetName(pPa
ae80: 72 73 65 2c 20 70 54 61 62 2d 3e 70 43 68 65 63  rse, pTab->pChec
ae90: 6b 2c 20 26 70 50 61 72 73 65 2d 3e 63 6f 6e 73  k, &pParse->cons
aea0: 74 72 61 69 6e 74 4e 61 6d 65 2c 20 31 29 3b 0a  traintName, 1);.
aeb0: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 23 65      }.  }else.#e
aec0: 6e 64 69 66 0a 20 20 7b 0a 20 20 20 20 73 71 6c  ndif.  {.    sql
aed0: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 70  ite3ExprDelete(p
aee0: 50 61 72 73 65 2d 3e 64 62 2c 20 70 43 68 65 63  Parse->db, pChec
aef0: 6b 45 78 70 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  kExpr);.  }.}../
af00: 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 63 6f 6c  *.** Set the col
af10: 6c 61 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 20  lation function 
af20: 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  of the most rece
af30: 6e 74 6c 79 20 70 61 72 73 65 64 20 74 61 62 6c  ntly parsed tabl
af40: 65 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 74 6f 20 74  e column.** to t
af50: 68 65 20 43 6f 6c 6c 53 65 71 20 67 69 76 65 6e  he CollSeq given
af60: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
af70: 33 41 64 64 43 6f 6c 6c 61 74 65 54 79 70 65 28  3AddCollateType(
af80: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54  Parse *pParse, T
af90: 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 29 7b 0a 20  oken *pToken){. 
afa0: 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 69 6e 74   Table *p;.  int
afb0: 20 69 3b 0a 20 20 63 68 61 72 20 2a 7a 43 6f 6c   i;.  char *zCol
afc0: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
afd0: 2f 2a 20 44 65 71 75 6f 74 65 64 20 6e 61 6d 65  /* Dequoted name
afe0: 20 6f 66 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65   of collation se
aff0: 71 75 65 6e 63 65 20 2a 2f 0a 20 20 73 71 6c 69  quence */.  sqli
b000: 74 65 33 20 2a 64 62 3b 0a 0a 20 20 69 66 28 20  te3 *db;..  if( 
b010: 28 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65  (p = pParse->pNe
b020: 77 54 61 62 6c 65 29 3d 3d 30 20 29 20 72 65 74  wTable)==0 ) ret
b030: 75 72 6e 3b 0a 20 20 69 20 3d 20 70 2d 3e 6e 43  urn;.  i = p->nC
b040: 6f 6c 2d 31 3b 0a 20 20 64 62 20 3d 20 70 50 61  ol-1;.  db = pPa
b050: 72 73 65 2d 3e 64 62 3b 0a 20 20 7a 43 6f 6c 6c  rse->db;.  zColl
b060: 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72   = sqlite3NameFr
b070: 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 54 6f 6b  omToken(db, pTok
b080: 65 6e 29 3b 0a 20 20 69 66 28 20 21 7a 43 6f 6c  en);.  if( !zCol
b090: 6c 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 69  l ) return;..  i
b0a0: 66 28 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65  f( sqlite3Locate
b0b0: 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
b0c0: 7a 43 6f 6c 6c 29 20 29 7b 0a 20 20 20 20 49 6e  zColl) ){.    In
b0d0: 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 20 20 73  dex *pIdx;.    s
b0e0: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
b0f0: 20 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 43 6f 6c   p->aCol[i].zCol
b100: 6c 29 3b 0a 20 20 20 20 70 2d 3e 61 43 6f 6c 5b  l);.    p->aCol[
b110: 69 5d 2e 7a 43 6f 6c 6c 20 3d 20 7a 43 6f 6c 6c  i].zColl = zColl
b120: 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74  ;.  .    /* If t
b130: 68 65 20 63 6f 6c 75 6d 6e 20 69 73 20 64 65 63  he column is dec
b140: 6c 61 72 65 64 20 61 73 20 22 3c 6e 61 6d 65 3e  lared as "<name>
b150: 20 50 52 49 4d 41 52 59 20 4b 45 59 20 43 4f 4c   PRIMARY KEY COL
b160: 4c 41 54 45 20 3c 74 79 70 65 3e 22 2c 0a 20 20  LATE <type>",.  
b170: 20 20 2a 2a 20 74 68 65 6e 20 61 6e 20 69 6e 64    ** then an ind
b180: 65 78 20 6d 61 79 20 68 61 76 65 20 62 65 65 6e  ex may have been
b190: 20 63 72 65 61 74 65 64 20 6f 6e 20 74 68 69 73   created on this
b1a0: 20 63 6f 6c 75 6d 6e 20 62 65 66 6f 72 65 20 74   column before t
b1b0: 68 65 0a 20 20 20 20 2a 2a 20 63 6f 6c 6c 61 74  he.    ** collat
b1c0: 69 6f 6e 20 74 79 70 65 20 77 61 73 20 61 64 64  ion type was add
b1d0: 65 64 2e 20 43 6f 72 72 65 63 74 20 74 68 69 73  ed. Correct this
b1e0: 20 69 66 20 69 74 20 69 73 20 74 68 65 20 63 61   if it is the ca
b1f0: 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66  se..    */.    f
b200: 6f 72 28 70 49 64 78 3d 70 2d 3e 70 49 6e 64 65  or(pIdx=p->pInde
b210: 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49  x; pIdx; pIdx=pI
b220: 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  dx->pNext){.    
b230: 20 20 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e    assert( pIdx->
b240: 6e 4b 65 79 43 6f 6c 3d 3d 31 20 29 3b 0a 20 20  nKeyCol==1 );.  
b250: 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 61 69      if( pIdx->ai
b260: 43 6f 6c 75 6d 6e 5b 30 5d 3d 3d 69 20 29 7b 0a  Column[0]==i ){.
b270: 20 20 20 20 20 20 20 20 70 49 64 78 2d 3e 61 7a          pIdx->az
b280: 43 6f 6c 6c 5b 30 5d 20 3d 20 70 2d 3e 61 43 6f  Coll[0] = p->aCo
b290: 6c 5b 69 5d 2e 7a 43 6f 6c 6c 3b 0a 20 20 20 20  l[i].zColl;.    
b2a0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73    }.    }.  }els
b2b0: 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  e{.    sqlite3Db
b2c0: 46 72 65 65 28 64 62 2c 20 7a 43 6f 6c 6c 29 3b  Free(db, zColl);
b2d0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  .  }.}../*.** Th
b2e0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  is function retu
b2f0: 72 6e 73 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f  rns the collatio
b300: 6e 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20 64  n sequence for d
b310: 61 74 61 62 61 73 65 20 6e 61 74 69 76 65 20 74  atabase native t
b320: 65 78 74 0a 2a 2a 20 65 6e 63 6f 64 69 6e 67 20  ext.** encoding 
b330: 69 64 65 6e 74 69 66 69 65 64 20 62 79 20 74 68  identified by th
b340: 65 20 73 74 72 69 6e 67 20 7a 4e 61 6d 65 2c 20  e string zName, 
b350: 6c 65 6e 67 74 68 20 6e 4e 61 6d 65 2e 0a 2a 2a  length nName..**
b360: 0a 2a 2a 20 49 66 20 74 68 65 20 72 65 71 75 65  .** If the reque
b370: 73 74 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 73  sted collation s
b380: 65 71 75 65 6e 63 65 20 69 73 20 6e 6f 74 20 61  equence is not a
b390: 76 61 69 6c 61 62 6c 65 2c 20 6f 72 20 6e 6f 74  vailable, or not
b3a0: 20 61 76 61 69 6c 61 62 6c 65 0a 2a 2a 20 69 6e   available.** in
b3b0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6e 61   the database na
b3c0: 74 69 76 65 20 65 6e 63 6f 64 69 6e 67 2c 20 74  tive encoding, t
b3d0: 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 61 63  he collation fac
b3e0: 74 6f 72 79 20 69 73 20 69 6e 76 6f 6b 65 64 20  tory is invoked 
b3f0: 74 6f 0a 2a 2a 20 72 65 71 75 65 73 74 20 69 74  to.** request it
b400: 2e 20 49 66 20 74 68 65 20 63 6f 6c 6c 61 74 69  . If the collati
b410: 6f 6e 20 66 61 63 74 6f 72 79 20 64 6f 65 73 20  on factory does 
b420: 6e 6f 74 20 73 75 70 70 6c 79 20 73 75 63 68 20  not supply such 
b430: 61 20 73 65 71 75 65 6e 63 65 2c 0a 2a 2a 20 61  a sequence,.** a
b440: 6e 64 20 74 68 65 20 73 65 71 75 65 6e 63 65 20  nd the sequence 
b450: 69 73 20 61 76 61 69 6c 61 62 6c 65 20 69 6e 20  is available in 
b460: 61 6e 6f 74 68 65 72 20 74 65 78 74 20 65 6e 63  another text enc
b470: 6f 64 69 6e 67 2c 20 74 68 65 6e 20 74 68 61 74  oding, then that
b480: 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20   is.** returned 
b490: 69 6e 73 74 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 49  instead..**.** I
b4a0: 66 20 6e 6f 20 76 65 72 73 69 6f 6e 73 20 6f 66  f no versions of
b4b0: 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 63   the requested c
b4c0: 6f 6c 6c 61 74 69 6f 6e 73 20 73 65 71 75 65 6e  ollations sequen
b4d0: 63 65 20 61 72 65 20 61 76 61 69 6c 61 62 6c 65  ce are available
b4e0: 2c 20 6f 72 0a 2a 2a 20 61 6e 6f 74 68 65 72 20  , or.** another 
b4f0: 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 4e 55  error occurs, NU
b500: 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64 20 61  LL is returned a
b510: 6e 64 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73  nd an error mess
b520: 61 67 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f  age written into
b530: 0a 2a 2a 20 70 50 61 72 73 65 2e 0a 2a 2a 0a 2a  .** pParse..**.*
b540: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
b550: 73 20 61 20 77 72 61 70 70 65 72 20 61 72 6f 75  s a wrapper arou
b560: 6e 64 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f  nd sqlite3FindCo
b570: 6c 6c 53 65 71 28 29 2e 20 20 54 68 69 73 20 72  llSeq().  This r
b580: 6f 75 74 69 6e 65 0a 2a 2a 20 69 6e 76 6f 6b 65  outine.** invoke
b590: 73 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20  s the collation 
b5a0: 66 61 63 74 6f 72 79 20 69 66 20 74 68 65 20 6e  factory if the n
b5b0: 61 6d 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 63  amed collation c
b5c0: 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64 0a 2a  annot be found.*
b5d0: 2a 20 61 6e 64 20 67 65 6e 65 72 61 74 65 73 20  * and generates 
b5e0: 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  an error message
b5f0: 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f  ..**.** See also
b600: 3a 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c  : sqlite3FindCol
b610: 6c 53 65 71 28 29 2c 20 73 71 6c 69 74 65 33 47  lSeq(), sqlite3G
b620: 65 74 43 6f 6c 6c 53 65 71 28 29 0a 2a 2f 0a 43  etCollSeq().*/.C
b630: 6f 6c 6c 53 65 71 20 2a 73 71 6c 69 74 65 33 4c  ollSeq *sqlite3L
b640: 6f 63 61 74 65 43 6f 6c 6c 53 65 71 28 50 61 72  ocateCollSeq(Par
b650: 73 65 20 2a 70 50 61 72 73 65 2c 20 63 6f 6e 73  se *pParse, cons
b660: 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a  t char *zName){.
b670: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
b680: 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 75 38  pParse->db;.  u8
b690: 20 65 6e 63 20 3d 20 45 4e 43 28 64 62 29 3b 0a   enc = ENC(db);.
b6a0: 20 20 75 38 20 69 6e 69 74 62 75 73 79 20 3d 20    u8 initbusy = 
b6b0: 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3b 0a 20  db->init.busy;. 
b6c0: 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b   CollSeq *pColl;
b6d0: 0a 0a 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69  ..  pColl = sqli
b6e0: 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28 64  te3FindCollSeq(d
b6f0: 62 2c 20 65 6e 63 2c 20 7a 4e 61 6d 65 2c 20 69  b, enc, zName, i
b700: 6e 69 74 62 75 73 79 29 3b 0a 20 20 69 66 28 20  nitbusy);.  if( 
b710: 21 69 6e 69 74 62 75 73 79 20 26 26 20 28 21 70  !initbusy && (!p
b720: 43 6f 6c 6c 20 7c 7c 20 21 70 43 6f 6c 6c 2d 3e  Coll || !pColl->
b730: 78 43 6d 70 29 20 29 7b 0a 20 20 20 20 70 43 6f  xCmp) ){.    pCo
b740: 6c 6c 20 3d 20 73 71 6c 69 74 65 33 47 65 74 43  ll = sqlite3GetC
b750: 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 65  ollSeq(pParse, e
b760: 6e 63 2c 20 70 43 6f 6c 6c 2c 20 7a 4e 61 6d 65  nc, pColl, zName
b770: 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  );.  }..  return
b780: 20 70 43 6f 6c 6c 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a   pColl;.}.../*.*
b790: 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
b7a0: 74 68 61 74 20 77 69 6c 6c 20 69 6e 63 72 65 6d  that will increm
b7b0: 65 6e 74 20 74 68 65 20 73 63 68 65 6d 61 20 63  ent the schema c
b7c0: 6f 6f 6b 69 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ookie..**.** The
b7d0: 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 20 69   schema cookie i
b7e0: 73 20 75 73 65 64 20 74 6f 20 64 65 74 65 72 6d  s used to determ
b7f0: 69 6e 65 20 77 68 65 6e 20 74 68 65 20 73 63 68  ine when the sch
b800: 65 6d 61 20 66 6f 72 20 74 68 65 0a 2a 2a 20 64  ema for the.** d
b810: 61 74 61 62 61 73 65 20 63 68 61 6e 67 65 73 2e  atabase changes.
b820: 20 20 41 66 74 65 72 20 65 61 63 68 20 73 63 68    After each sch
b830: 65 6d 61 20 63 68 61 6e 67 65 2c 20 74 68 65 20  ema change, the 
b840: 63 6f 6f 6b 69 65 20 76 61 6c 75 65 0a 2a 2a 20  cookie value.** 
b850: 63 68 61 6e 67 65 73 2e 20 20 57 68 65 6e 20 61  changes.  When a
b860: 20 70 72 6f 63 65 73 73 20 66 69 72 73 74 20 72   process first r
b870: 65 61 64 73 20 74 68 65 20 73 63 68 65 6d 61 20  eads the schema 
b880: 69 74 20 72 65 63 6f 72 64 73 20 74 68 65 0a 2a  it records the.*
b890: 2a 20 63 6f 6f 6b 69 65 2e 20 20 54 68 65 72 65  * cookie.  There
b8a0: 61 66 74 65 72 2c 20 77 68 65 6e 65 76 65 72 20  after, whenever 
b8b0: 69 74 20 67 6f 65 73 20 74 6f 20 61 63 63 65 73  it goes to acces
b8c0: 73 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 0a  s the database,.
b8d0: 2a 2a 20 69 74 20 63 68 65 63 6b 73 20 74 68 65  ** it checks the
b8e0: 20 63 6f 6f 6b 69 65 20 74 6f 20 6d 61 6b 65 20   cookie to make 
b8f0: 73 75 72 65 20 74 68 65 20 73 63 68 65 6d 61 20  sure the schema 
b900: 68 61 73 20 6e 6f 74 20 63 68 61 6e 67 65 64 0a  has not changed.
b910: 2a 2a 20 73 69 6e 63 65 20 69 74 20 77 61 73 20  ** since it was 
b920: 6c 61 73 74 20 72 65 61 64 2e 0a 2a 2a 0a 2a 2a  last read..**.**
b930: 20 54 68 69 73 20 70 6c 61 6e 20 69 73 20 6e 6f   This plan is no
b940: 74 20 63 6f 6d 70 6c 65 74 65 6c 79 20 62 75 6c  t completely bul
b950: 6c 65 74 2d 70 72 6f 6f 66 2e 20 20 49 74 20 69  let-proof.  It i
b960: 73 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 0a 2a  s possible for.*
b970: 2a 20 74 68 65 20 73 63 68 65 6d 61 20 74 6f 20  * the schema to 
b980: 63 68 61 6e 67 65 20 6d 75 6c 74 69 70 6c 65 20  change multiple 
b990: 74 69 6d 65 73 20 61 6e 64 20 66 6f 72 20 74 68  times and for th
b9a0: 65 20 63 6f 6f 6b 69 65 20 74 6f 20 62 65 0a 2a  e cookie to be.*
b9b0: 2a 20 73 65 74 20 62 61 63 6b 20 74 6f 20 70 72  * set back to pr
b9c0: 69 6f 72 20 76 61 6c 75 65 2e 20 20 42 75 74 20  ior value.  But 
b9d0: 73 63 68 65 6d 61 20 63 68 61 6e 67 65 73 20 61  schema changes a
b9e0: 72 65 20 69 6e 66 72 65 71 75 65 6e 74 0a 2a 2a  re infrequent.**
b9f0: 20 61 6e 64 20 74 68 65 20 70 72 6f 62 61 62 69   and the probabi
ba00: 6c 69 74 79 20 6f 66 20 68 69 74 74 69 6e 67 20  lity of hitting 
ba10: 74 68 65 20 73 61 6d 65 20 63 6f 6f 6b 69 65 20  the same cookie 
ba20: 76 61 6c 75 65 20 69 73 20 6f 6e 6c 79 0a 2a 2a  value is only.**
ba30: 20 31 20 63 68 61 6e 63 65 20 69 6e 20 32 5e 33   1 chance in 2^3
ba40: 32 2e 20 20 53 6f 20 77 65 27 72 65 20 73 61 66  2.  So we're saf
ba50: 65 20 65 6e 6f 75 67 68 2e 0a 2a 2a 0a 2a 2a 20  e enough..**.** 
ba60: 49 4d 50 4c 45 4d 45 4e 54 41 54 49 4f 4e 2d 4f  IMPLEMENTATION-O
ba70: 46 3a 20 52 2d 33 34 32 33 30 2d 35 36 30 34 39  F: R-34230-56049
ba80: 20 53 51 4c 69 74 65 20 61 75 74 6f 6d 61 74 69   SQLite automati
ba90: 63 61 6c 6c 79 20 69 6e 63 72 65 6d 65 6e 74 73  cally increments
baa0: 0a 2a 2a 20 74 68 65 20 73 63 68 65 6d 61 2d 76  .** the schema-v
bab0: 65 72 73 69 6f 6e 20 77 68 65 6e 65 76 65 72 20  ersion whenever 
bac0: 74 68 65 20 73 63 68 65 6d 61 20 63 68 61 6e 67  the schema chang
bad0: 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  es..*/.void sqli
bae0: 74 65 33 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28  te3ChangeCookie(
baf0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69  Parse *pParse, i
bb00: 6e 74 20 69 44 62 29 7b 0a 20 20 73 71 6c 69 74  nt iDb){.  sqlit
bb10: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
bb20: 3e 64 62 3b 0a 20 20 56 64 62 65 20 2a 76 20 3d  >db;.  Vdbe *v =
bb30: 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
bb40: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
bb50: 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64  3SchemaMutexHeld
bb60: 28 64 62 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a  (db, iDb, 0) );.
bb70: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
bb80: 4f 70 33 28 76 2c 20 4f 50 5f 53 65 74 43 6f 6f  Op3(v, OP_SetCoo
bb90: 6b 69 65 2c 20 69 44 62 2c 20 42 54 52 45 45 5f  kie, iDb, BTREE_
bba0: 53 43 48 45 4d 41 5f 56 45 52 53 49 4f 4e 2c 20  SCHEMA_VERSION, 
bbb0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
bbc0: 20 20 20 20 20 64 62 2d 3e 61 44 62 5b 69 44 62       db->aDb[iDb
bbd0: 5d 2e 70 53 63 68 65 6d 61 2d 3e 73 63 68 65 6d  ].pSchema->schem
bbe0: 61 5f 63 6f 6f 6b 69 65 2b 31 29 3b 0a 7d 0a 0a  a_cookie+1);.}..
bbf0: 2f 2a 0a 2a 2a 20 4d 65 61 73 75 72 65 20 74 68  /*.** Measure th
bc00: 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 68 61 72  e number of char
bc10: 61 63 74 65 72 73 20 6e 65 65 64 65 64 20 74 6f  acters needed to
bc20: 20 6f 75 74 70 75 74 20 74 68 65 20 67 69 76 65   output the give
bc30: 6e 0a 2a 2a 20 69 64 65 6e 74 69 66 69 65 72 2e  n.** identifier.
bc40: 20 20 54 68 65 20 6e 75 6d 62 65 72 20 72 65 74    The number ret
bc50: 75 72 6e 65 64 20 69 6e 63 6c 75 64 65 73 20 61  urned includes a
bc60: 6e 79 20 71 75 6f 74 65 73 20 75 73 65 64 0a 2a  ny quotes used.*
bc70: 2a 20 62 75 74 20 64 6f 65 73 20 6e 6f 74 20 69  * but does not i
bc80: 6e 63 6c 75 64 65 20 74 68 65 20 6e 75 6c 6c 20  nclude the null 
bc90: 74 65 72 6d 69 6e 61 74 6f 72 2e 0a 2a 2a 0a 2a  terminator..**.*
bca0: 2a 20 54 68 65 20 65 73 74 69 6d 61 74 65 20 69  * The estimate i
bcb0: 73 20 63 6f 6e 73 65 72 76 61 74 69 76 65 2e 20  s conservative. 
bcc0: 20 49 74 20 6d 69 67 68 74 20 62 65 20 6c 61 72   It might be lar
bcd0: 67 65 72 20 74 68 61 74 20 77 68 61 74 20 69 73  ger that what is
bce0: 0a 2a 2a 20 72 65 61 6c 6c 79 20 6e 65 65 64 65  .** really neede
bcf0: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
bd00: 20 69 64 65 6e 74 4c 65 6e 67 74 68 28 63 6f 6e   identLength(con
bd10: 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20 69  st char *z){.  i
bd20: 6e 74 20 6e 3b 0a 20 20 66 6f 72 28 6e 3d 30 3b  nt n;.  for(n=0;
bd30: 20 2a 7a 3b 20 6e 2b 2b 2c 20 7a 2b 2b 29 7b 0a   *z; n++, z++){.
bd40: 20 20 20 20 69 66 28 20 2a 7a 3d 3d 27 22 27 20      if( *z=='"' 
bd50: 29 7b 20 6e 2b 2b 3b 20 7d 0a 20 20 7d 0a 20 20  ){ n++; }.  }.  
bd60: 72 65 74 75 72 6e 20 6e 20 2b 20 32 3b 0a 7d 0a  return n + 2;.}.
bd70: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74  ./*.** The first
bd80: 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 61 20   parameter is a 
bd90: 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 6f 75  pointer to an ou
bda0: 74 70 75 74 20 62 75 66 66 65 72 2e 20 54 68 65  tput buffer. The
bdb0: 20 73 65 63 6f 6e 64 20 0a 2a 2a 20 70 61 72 61   second .** para
bdc0: 6d 65 74 65 72 20 69 73 20 61 20 70 6f 69 6e 74  meter is a point
bdd0: 65 72 20 74 6f 20 61 6e 20 69 6e 74 65 67 65 72  er to an integer
bde0: 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74   that contains t
bdf0: 68 65 20 6f 66 66 73 65 74 20 61 74 0a 2a 2a 20  he offset at.** 
be00: 77 68 69 63 68 20 74 6f 20 77 72 69 74 65 20 69  which to write i
be10: 6e 74 6f 20 74 68 65 20 6f 75 74 70 75 74 20 62  nto the output b
be20: 75 66 66 65 72 2e 20 54 68 69 73 20 66 75 6e 63  uffer. This func
be30: 74 69 6f 6e 20 63 6f 70 69 65 73 20 74 68 65 0a  tion copies the.
be40: 2a 2a 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 65  ** nul-terminate
be50: 64 20 73 74 72 69 6e 67 20 70 6f 69 6e 74 65 64  d string pointed
be60: 20 74 6f 20 62 79 20 74 68 65 20 74 68 69 72 64   to by the third
be70: 20 70 61 72 61 6d 65 74 65 72 2c 20 7a 53 69 67   parameter, zSig
be80: 6e 65 64 49 64 65 6e 74 2c 0a 2a 2a 20 74 6f 20  nedIdent,.** to 
be90: 74 68 65 20 73 70 65 63 69 66 69 65 64 20 6f 66  the specified of
bea0: 66 73 65 74 20 69 6e 20 74 68 65 20 62 75 66 66  fset in the buff
beb0: 65 72 20 61 6e 64 20 75 70 64 61 74 65 73 20 2a  er and updates *
bec0: 70 49 64 78 20 74 6f 20 72 65 66 65 72 0a 2a 2a  pIdx to refer.**
bed0: 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 62 79   to the first by
bee0: 74 65 20 61 66 74 65 72 20 74 68 65 20 6c 61 73  te after the las
bef0: 74 20 62 79 74 65 20 77 72 69 74 74 65 6e 20 62  t byte written b
bf00: 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e  efore returning.
bf10: 0a 2a 2a 20 0a 2a 2a 20 49 66 20 74 68 65 20 73  .** .** If the s
bf20: 74 72 69 6e 67 20 7a 53 69 67 6e 65 64 49 64 65  tring zSignedIde
bf30: 6e 74 20 63 6f 6e 73 69 73 74 73 20 65 6e 74 69  nt consists enti
bf40: 72 65 6c 79 20 6f 66 20 61 6c 70 68 61 2d 6e 75  rely of alpha-nu
bf50: 6d 65 72 69 63 0a 2a 2a 20 63 68 61 72 61 63 74  meric.** charact
bf60: 65 72 73 2c 20 64 6f 65 73 20 6e 6f 74 20 62 65  ers, does not be
bf70: 67 69 6e 20 77 69 74 68 20 61 20 64 69 67 69 74  gin with a digit
bf80: 20 61 6e 64 20 69 73 20 6e 6f 74 20 61 6e 20 53   and is not an S
bf90: 51 4c 20 6b 65 79 77 6f 72 64 2c 0a 2a 2a 20 74  QL keyword,.** t
bfa0: 68 65 6e 20 69 74 20 69 73 20 63 6f 70 69 65 64  hen it is copied
bfb0: 20 74 6f 20 74 68 65 20 6f 75 74 70 75 74 20 62   to the output b
bfc0: 75 66 66 65 72 20 65 78 61 63 74 6c 79 20 61 73  uffer exactly as
bfd0: 20 69 74 20 69 73 2e 20 4f 74 68 65 72 77 69 73   it is. Otherwis
bfe0: 65 2c 0a 2a 2a 20 69 74 20 69 73 20 71 75 6f 74  e,.** it is quot
bff0: 65 64 20 75 73 69 6e 67 20 64 6f 75 62 6c 65 2d  ed using double-
c000: 71 75 6f 74 65 73 2e 0a 2a 2f 0a 73 74 61 74 69  quotes..*/.stati
c010: 63 20 76 6f 69 64 20 69 64 65 6e 74 50 75 74 28  c void identPut(
c020: 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20 2a 70 49  char *z, int *pI
c030: 64 78 2c 20 63 68 61 72 20 2a 7a 53 69 67 6e 65  dx, char *zSigne
c040: 64 49 64 65 6e 74 29 7b 0a 20 20 75 6e 73 69 67  dIdent){.  unsig
c050: 6e 65 64 20 63 68 61 72 20 2a 7a 49 64 65 6e 74  ned char *zIdent
c060: 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61   = (unsigned cha
c070: 72 2a 29 7a 53 69 67 6e 65 64 49 64 65 6e 74 3b  r*)zSignedIdent;
c080: 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6e 65 65  .  int i, j, nee
c090: 64 51 75 6f 74 65 3b 0a 20 20 69 20 3d 20 2a 70  dQuote;.  i = *p
c0a0: 49 64 78 3b 0a 0a 20 20 66 6f 72 28 6a 3d 30 3b  Idx;..  for(j=0;
c0b0: 20 7a 49 64 65 6e 74 5b 6a 5d 3b 20 6a 2b 2b 29   zIdent[j]; j++)
c0c0: 7b 0a 20 20 20 20 69 66 28 20 21 73 71 6c 69 74  {.    if( !sqlit
c0d0: 65 33 49 73 61 6c 6e 75 6d 28 7a 49 64 65 6e 74  e3Isalnum(zIdent
c0e0: 5b 6a 5d 29 20 26 26 20 7a 49 64 65 6e 74 5b 6a  [j]) && zIdent[j
c0f0: 5d 21 3d 27 5f 27 20 29 20 62 72 65 61 6b 3b 0a  ]!='_' ) break;.
c100: 20 20 7d 0a 20 20 6e 65 65 64 51 75 6f 74 65 20    }.  needQuote 
c110: 3d 20 73 71 6c 69 74 65 33 49 73 64 69 67 69 74  = sqlite3Isdigit
c120: 28 7a 49 64 65 6e 74 5b 30 5d 29 0a 20 20 20 20  (zIdent[0]).    
c130: 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74          || sqlit
c140: 65 33 4b 65 79 77 6f 72 64 43 6f 64 65 28 7a 49  e3KeywordCode(zI
c150: 64 65 6e 74 2c 20 6a 29 21 3d 54 4b 5f 49 44 0a  dent, j)!=TK_ID.
c160: 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 7a              || z
c170: 49 64 65 6e 74 5b 6a 5d 21 3d 30 0a 20 20 20 20  Ident[j]!=0.    
c180: 20 20 20 20 20 20 20 20 7c 7c 20 6a 3d 3d 30 3b          || j==0;
c190: 0a 0a 20 20 69 66 28 20 6e 65 65 64 51 75 6f 74  ..  if( needQuot
c1a0: 65 20 29 20 7a 5b 69 2b 2b 5d 20 3d 20 27 22 27  e ) z[i++] = '"'
c1b0: 3b 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 7a 49 64  ;.  for(j=0; zId
c1c0: 65 6e 74 5b 6a 5d 3b 20 6a 2b 2b 29 7b 0a 20 20  ent[j]; j++){.  
c1d0: 20 20 7a 5b 69 2b 2b 5d 20 3d 20 7a 49 64 65 6e    z[i++] = zIden
c1e0: 74 5b 6a 5d 3b 0a 20 20 20 20 69 66 28 20 7a 49  t[j];.    if( zI
c1f0: 64 65 6e 74 5b 6a 5d 3d 3d 27 22 27 20 29 20 7a  dent[j]=='"' ) z
c200: 5b 69 2b 2b 5d 20 3d 20 27 22 27 3b 0a 20 20 7d  [i++] = '"';.  }
c210: 0a 20 20 69 66 28 20 6e 65 65 64 51 75 6f 74 65  .  if( needQuote
c220: 20 29 20 7a 5b 69 2b 2b 5d 20 3d 20 27 22 27 3b   ) z[i++] = '"';
c230: 0a 20 20 7a 5b 69 5d 20 3d 20 30 3b 0a 20 20 2a  .  z[i] = 0;.  *
c240: 70 49 64 78 20 3d 20 69 3b 0a 7d 0a 0a 2f 2a 0a  pIdx = i;.}../*.
c250: 2a 2a 20 47 65 6e 65 72 61 74 65 20 61 20 43 52  ** Generate a CR
c260: 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65  EATE TABLE state
c270: 6d 65 6e 74 20 61 70 70 72 6f 70 72 69 61 74 65  ment appropriate
c280: 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 0a 2a   for the given.*
c290: 2a 20 74 61 62 6c 65 2e 20 20 4d 65 6d 6f 72 79  * table.  Memory
c2a0: 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 74 65 78   to hold the tex
c2b0: 74 20 6f 66 20 74 68 65 20 73 74 61 74 65 6d 65  t of the stateme
c2c0: 6e 74 20 69 73 20 6f 62 74 61 69 6e 65 64 0a 2a  nt is obtained.*
c2d0: 2a 20 66 72 6f 6d 20 73 71 6c 69 74 65 4d 61 6c  * from sqliteMal
c2e0: 6c 6f 63 28 29 20 61 6e 64 20 6d 75 73 74 20 62  loc() and must b
c2f0: 65 20 66 72 65 65 64 20 62 79 20 74 68 65 20 63  e freed by the c
c300: 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 2e  alling function.
c310: 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20  .*/.static char 
c320: 2a 63 72 65 61 74 65 54 61 62 6c 65 53 74 6d 74  *createTableStmt
c330: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 54 61  (sqlite3 *db, Ta
c340: 62 6c 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69  ble *p){.  int i
c350: 2c 20 6b 2c 20 6e 3b 0a 20 20 63 68 61 72 20 2a  , k, n;.  char *
c360: 7a 53 74 6d 74 3b 0a 20 20 63 68 61 72 20 2a 7a  zStmt;.  char *z
c370: 53 65 70 2c 20 2a 7a 53 65 70 32 2c 20 2a 7a 45  Sep, *zSep2, *zE
c380: 6e 64 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43  nd;.  Column *pC
c390: 6f 6c 3b 0a 20 20 6e 20 3d 20 30 3b 0a 20 20 66  ol;.  n = 0;.  f
c3a0: 6f 72 28 70 43 6f 6c 20 3d 20 70 2d 3e 61 43 6f  or(pCol = p->aCo
c3b0: 6c 2c 20 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f  l, i=0; i<p->nCo
c3c0: 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b  l; i++, pCol++){
c3d0: 0a 20 20 20 20 6e 20 2b 3d 20 69 64 65 6e 74 4c  .    n += identL
c3e0: 65 6e 67 74 68 28 70 43 6f 6c 2d 3e 7a 4e 61 6d  ength(pCol->zNam
c3f0: 65 29 20 2b 20 35 3b 0a 20 20 7d 0a 20 20 6e 20  e) + 5;.  }.  n 
c400: 2b 3d 20 69 64 65 6e 74 4c 65 6e 67 74 68 28 70  += identLength(p
c410: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20  ->zName);.  if( 
c420: 6e 3c 35 30 20 29 7b 20 0a 20 20 20 20 7a 53 65  n<50 ){ .    zSe
c430: 70 20 3d 20 22 22 3b 0a 20 20 20 20 7a 53 65 70  p = "";.    zSep
c440: 32 20 3d 20 22 2c 22 3b 0a 20 20 20 20 7a 45 6e  2 = ",";.    zEn
c450: 64 20 3d 20 22 29 22 3b 0a 20 20 7d 65 6c 73 65  d = ")";.  }else
c460: 7b 0a 20 20 20 20 7a 53 65 70 20 3d 20 22 5c 6e  {.    zSep = "\n
c470: 20 20 22 3b 0a 20 20 20 20 7a 53 65 70 32 20 3d    ";.    zSep2 =
c480: 20 22 2c 5c 6e 20 20 22 3b 0a 20 20 20 20 7a 45   ",\n  ";.    zE
c490: 6e 64 20 3d 20 22 5c 6e 29 22 3b 0a 20 20 7d 0a  nd = "\n)";.  }.
c4a0: 20 20 6e 20 2b 3d 20 33 35 20 2b 20 36 2a 70 2d    n += 35 + 6*p-
c4b0: 3e 6e 43 6f 6c 3b 0a 20 20 7a 53 74 6d 74 20 3d  >nCol;.  zStmt =
c4c0: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
c4d0: 52 61 77 28 30 2c 20 6e 29 3b 0a 20 20 69 66 28  Raw(0, n);.  if(
c4e0: 20 7a 53 74 6d 74 3d 3d 30 20 29 7b 0a 20 20 20   zStmt==0 ){.   
c4f0: 20 73 71 6c 69 74 65 33 4f 6f 6d 46 61 75 6c 74   sqlite3OomFault
c500: 28 64 62 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  (db);.    return
c510: 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65   0;.  }.  sqlite
c520: 33 5f 73 6e 70 72 69 6e 74 66 28 6e 2c 20 7a 53  3_snprintf(n, zS
c530: 74 6d 74 2c 20 22 43 52 45 41 54 45 20 54 41 42  tmt, "CREATE TAB
c540: 4c 45 20 22 29 3b 0a 20 20 6b 20 3d 20 73 71 6c  LE ");.  k = sql
c550: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 53 74  ite3Strlen30(zSt
c560: 6d 74 29 3b 0a 20 20 69 64 65 6e 74 50 75 74 28  mt);.  identPut(
c570: 7a 53 74 6d 74 2c 20 26 6b 2c 20 70 2d 3e 7a 4e  zStmt, &k, p->zN
c580: 61 6d 65 29 3b 0a 20 20 7a 53 74 6d 74 5b 6b 2b  ame);.  zStmt[k+
c590: 2b 5d 20 3d 20 27 28 27 3b 0a 20 20 66 6f 72 28  +] = '(';.  for(
c5a0: 70 43 6f 6c 3d 70 2d 3e 61 43 6f 6c 2c 20 69 3d  pCol=p->aCol, i=
c5b0: 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 3b 20 69 2b  0; i<p->nCol; i+
c5c0: 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20  +, pCol++){.    
c5d0: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
c5e0: 72 20 2a 20 63 6f 6e 73 74 20 61 7a 54 79 70 65  r * const azType
c5f0: 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20 20 2f  [] = {.        /
c600: 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f  * SQLITE_AFF_BLO
c610: 42 20 20 20 20 2a 2f 20 22 22 2c 0a 20 20 20 20  B    */ "",.    
c620: 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 41 46      /* SQLITE_AF
c630: 46 5f 54 45 58 54 20 20 20 20 2a 2f 20 22 20 54  F_TEXT    */ " T
c640: 45 58 54 22 2c 0a 20 20 20 20 20 20 20 20 2f 2a  EXT",.        /*
c650: 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45   SQLITE_AFF_NUME
c660: 52 49 43 20 2a 2f 20 22 20 4e 55 4d 22 2c 0a 20  RIC */ " NUM",. 
c670: 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 49 54 45         /* SQLITE
c680: 5f 41 46 46 5f 49 4e 54 45 47 45 52 20 2a 2f 20  _AFF_INTEGER */ 
c690: 22 20 49 4e 54 22 2c 0a 20 20 20 20 20 20 20 20  " INT",.        
c6a0: 2f 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f 52 45  /* SQLITE_AFF_RE
c6b0: 41 4c 20 20 20 20 2a 2f 20 22 20 52 45 41 4c 22  AL    */ " REAL"
c6c0: 0a 20 20 20 20 7d 3b 0a 20 20 20 20 69 6e 74 20  .    };.    int 
c6d0: 6c 65 6e 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63  len;.    const c
c6e0: 68 61 72 20 2a 7a 54 79 70 65 3b 0a 0a 20 20 20  har *zType;..   
c6f0: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
c700: 66 28 6e 2d 6b 2c 20 26 7a 53 74 6d 74 5b 6b 5d  f(n-k, &zStmt[k]
c710: 2c 20 7a 53 65 70 29 3b 0a 20 20 20 20 6b 20 2b  , zSep);.    k +
c720: 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
c730: 30 28 26 7a 53 74 6d 74 5b 6b 5d 29 3b 0a 20 20  0(&zStmt[k]);.  
c740: 20 20 7a 53 65 70 20 3d 20 7a 53 65 70 32 3b 0a    zSep = zSep2;.
c750: 20 20 20 20 69 64 65 6e 74 50 75 74 28 7a 53 74      identPut(zSt
c760: 6d 74 2c 20 26 6b 2c 20 70 43 6f 6c 2d 3e 7a 4e  mt, &k, pCol->zN
c770: 61 6d 65 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ame);.    assert
c780: 28 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79  ( pCol->affinity
c790: 2d 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42  -SQLITE_AFF_BLOB
c7a0: 20 3e 3d 20 30 20 29 3b 0a 20 20 20 20 61 73 73   >= 0 );.    ass
c7b0: 65 72 74 28 20 70 43 6f 6c 2d 3e 61 66 66 69 6e  ert( pCol->affin
c7c0: 69 74 79 2d 53 51 4c 49 54 45 5f 41 46 46 5f 42  ity-SQLITE_AFF_B
c7d0: 4c 4f 42 20 3c 20 41 72 72 61 79 53 69 7a 65 28  LOB < ArraySize(
c7e0: 61 7a 54 79 70 65 29 20 29 3b 0a 20 20 20 20 74  azType) );.    t
c7f0: 65 73 74 63 61 73 65 28 20 70 43 6f 6c 2d 3e 61  estcase( pCol->a
c800: 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f  ffinity==SQLITE_
c810: 41 46 46 5f 42 4c 4f 42 20 29 3b 0a 20 20 20 20  AFF_BLOB );.    
c820: 74 65 73 74 63 61 73 65 28 20 70 43 6f 6c 2d 3e  testcase( pCol->
c830: 61 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45  affinity==SQLITE
c840: 5f 41 46 46 5f 54 45 58 54 20 29 3b 0a 20 20 20  _AFF_TEXT );.   
c850: 20 74 65 73 74 63 61 73 65 28 20 70 43 6f 6c 2d   testcase( pCol-
c860: 3e 61 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54  >affinity==SQLIT
c870: 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20 29 3b  E_AFF_NUMERIC );
c880: 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70  .    testcase( p
c890: 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 53  Col->affinity==S
c8a0: 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45  QLITE_AFF_INTEGE
c8b0: 52 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  R );.    testcas
c8c0: 65 28 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74  e( pCol->affinit
c8d0: 79 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 52 45  y==SQLITE_AFF_RE
c8e0: 41 4c 20 29 3b 0a 20 20 20 20 0a 20 20 20 20 7a  AL );.    .    z
c8f0: 54 79 70 65 20 3d 20 61 7a 54 79 70 65 5b 70 43  Type = azType[pC
c900: 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 20 2d 20 53  ol->affinity - S
c910: 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 5d 3b  QLITE_AFF_BLOB];
c920: 0a 20 20 20 20 6c 65 6e 20 3d 20 73 71 6c 69 74  .    len = sqlit
c930: 65 33 53 74 72 6c 65 6e 33 30 28 7a 54 79 70 65  e3Strlen30(zType
c940: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
c950: 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 53  Col->affinity==S
c960: 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 20 0a  QLITE_AFF_BLOB .
c970: 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70              || p
c980: 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 73  Col->affinity==s
c990: 71 6c 69 74 65 33 41 66 66 69 6e 69 74 79 54 79  qlite3AffinityTy
c9a0: 70 65 28 7a 54 79 70 65 2c 20 30 29 20 29 3b 0a  pe(zType, 0) );.
c9b0: 20 20 20 20 6d 65 6d 63 70 79 28 26 7a 53 74 6d      memcpy(&zStm
c9c0: 74 5b 6b 5d 2c 20 7a 54 79 70 65 2c 20 6c 65 6e  t[k], zType, len
c9d0: 29 3b 0a 20 20 20 20 6b 20 2b 3d 20 6c 65 6e 3b  );.    k += len;
c9e0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 6b 3c 3d  .    assert( k<=
c9f0: 6e 20 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  n );.  }.  sqlit
ca00: 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 2d 6b 2c  e3_snprintf(n-k,
ca10: 20 26 7a 53 74 6d 74 5b 6b 5d 2c 20 22 25 73 22   &zStmt[k], "%s"
ca20: 2c 20 7a 45 6e 64 29 3b 0a 20 20 72 65 74 75 72  , zEnd);.  retur
ca30: 6e 20 7a 53 74 6d 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  n zStmt;.}../*.*
ca40: 2a 20 52 65 73 69 7a 65 20 61 6e 20 49 6e 64 65  * Resize an Inde
ca50: 78 20 6f 62 6a 65 63 74 20 74 6f 20 68 6f 6c 64  x object to hold
ca60: 20 4e 20 63 6f 6c 75 6d 6e 73 20 74 6f 74 61 6c   N columns total
ca70: 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  .  Return SQLITE
ca80: 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73  _OK.** on succes
ca90: 73 20 61 6e 64 20 53 51 4c 49 54 45 5f 4e 4f 4d  s and SQLITE_NOM
caa0: 45 4d 20 6f 6e 20 61 6e 20 4f 4f 4d 20 65 72 72  EM on an OOM err
cab0: 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  or..*/.static in
cac0: 74 20 72 65 73 69 7a 65 49 6e 64 65 78 4f 62 6a  t resizeIndexObj
cad0: 65 63 74 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  ect(sqlite3 *db,
cae0: 20 49 6e 64 65 78 20 2a 70 49 64 78 2c 20 69 6e   Index *pIdx, in
caf0: 74 20 4e 29 7b 0a 20 20 63 68 61 72 20 2a 7a 45  t N){.  char *zE
cb00: 78 74 72 61 3b 0a 20 20 69 6e 74 20 6e 42 79 74  xtra;.  int nByt
cb10: 65 3b 0a 20 20 69 66 28 20 70 49 64 78 2d 3e 6e  e;.  if( pIdx->n
cb20: 43 6f 6c 75 6d 6e 3e 3d 4e 20 29 20 72 65 74 75  Column>=N ) retu
cb30: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
cb40: 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e 69 73  assert( pIdx->is
cb50: 52 65 73 69 7a 65 64 3d 3d 30 20 29 3b 0a 20 20  Resized==0 );.  
cb60: 6e 42 79 74 65 20 3d 20 28 73 69 7a 65 6f 66 28  nByte = (sizeof(
cb70: 63 68 61 72 2a 29 20 2b 20 73 69 7a 65 6f 66 28  char*) + sizeof(
cb80: 69 31 36 29 20 2b 20 31 29 2a 4e 3b 0a 20 20 7a  i16) + 1)*N;.  z
cb90: 45 78 74 72 61 20 3d 20 73 71 6c 69 74 65 33 44  Extra = sqlite3D
cba0: 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20  bMallocZero(db, 
cbb0: 6e 42 79 74 65 29 3b 0a 20 20 69 66 28 20 7a 45  nByte);.  if( zE
cbc0: 78 74 72 61 3d 3d 30 20 29 20 72 65 74 75 72 6e  xtra==0 ) return
cbd0: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b   SQLITE_NOMEM_BK
cbe0: 50 54 3b 0a 20 20 6d 65 6d 63 70 79 28 7a 45 78  PT;.  memcpy(zEx
cbf0: 74 72 61 2c 20 70 49 64 78 2d 3e 61 7a 43 6f 6c  tra, pIdx->azCol
cc00: 6c 2c 20 73 69 7a 65 6f 66 28 63 68 61 72 2a 29  l, sizeof(char*)
cc10: 2a 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 29 3b  *pIdx->nColumn);
cc20: 0a 20 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 20  .  pIdx->azColl 
cc30: 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 2a 29  = (const char**)
cc40: 7a 45 78 74 72 61 3b 0a 20 20 7a 45 78 74 72 61  zExtra;.  zExtra
cc50: 20 2b 3d 20 73 69 7a 65 6f 66 28 63 68 61 72 2a   += sizeof(char*
cc60: 29 2a 4e 3b 0a 20 20 6d 65 6d 63 70 79 28 7a 45  )*N;.  memcpy(zE
cc70: 78 74 72 61 2c 20 70 49 64 78 2d 3e 61 69 43 6f  xtra, pIdx->aiCo
cc80: 6c 75 6d 6e 2c 20 73 69 7a 65 6f 66 28 69 31 36  lumn, sizeof(i16
cc90: 29 2a 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 29  )*pIdx->nColumn)
cca0: 3b 0a 20 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75  ;.  pIdx->aiColu
ccb0: 6d 6e 20 3d 20 28 69 31 36 2a 29 7a 45 78 74 72  mn = (i16*)zExtr
ccc0: 61 3b 0a 20 20 7a 45 78 74 72 61 20 2b 3d 20 73  a;.  zExtra += s
ccd0: 69 7a 65 6f 66 28 69 31 36 29 2a 4e 3b 0a 20 20  izeof(i16)*N;.  
cce0: 6d 65 6d 63 70 79 28 7a 45 78 74 72 61 2c 20 70  memcpy(zExtra, p
ccf0: 49 64 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 2c  Idx->aSortOrder,
cd00: 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 29 3b   pIdx->nColumn);
cd10: 0a 20 20 70 49 64 78 2d 3e 61 53 6f 72 74 4f 72  .  pIdx->aSortOr
cd20: 64 65 72 20 3d 20 28 75 38 2a 29 7a 45 78 74 72  der = (u8*)zExtr
cd30: 61 3b 0a 20 20 70 49 64 78 2d 3e 6e 43 6f 6c 75  a;.  pIdx->nColu
cd40: 6d 6e 20 3d 20 4e 3b 0a 20 20 70 49 64 78 2d 3e  mn = N;.  pIdx->
cd50: 69 73 52 65 73 69 7a 65 64 20 3d 20 31 3b 0a 20  isResized = 1;. 
cd60: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
cd70: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 73 74 69  K;.}../*.** Esti
cd80: 6d 61 74 65 20 74 68 65 20 74 6f 74 61 6c 20 72  mate the total r
cd90: 6f 77 20 77 69 64 74 68 20 66 6f 72 20 61 20 74  ow width for a t
cda0: 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  able..*/.static 
cdb0: 76 6f 69 64 20 65 73 74 69 6d 61 74 65 54 61 62  void estimateTab
cdc0: 6c 65 57 69 64 74 68 28 54 61 62 6c 65 20 2a 70  leWidth(Table *p
cdd0: 54 61 62 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64  Tab){.  unsigned
cde0: 20 77 54 61 62 6c 65 20 3d 20 30 3b 0a 20 20 63   wTable = 0;.  c
cdf0: 6f 6e 73 74 20 43 6f 6c 75 6d 6e 20 2a 70 54 61  onst Column *pTa
ce00: 62 43 6f 6c 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  bCol;.  int i;. 
ce10: 20 66 6f 72 28 69 3d 70 54 61 62 2d 3e 6e 43 6f   for(i=pTab->nCo
ce20: 6c 2c 20 70 54 61 62 43 6f 6c 3d 70 54 61 62 2d  l, pTabCol=pTab-
ce30: 3e 61 43 6f 6c 3b 20 69 3e 30 3b 20 69 2d 2d 2c  >aCol; i>0; i--,
ce40: 20 70 54 61 62 43 6f 6c 2b 2b 29 7b 0a 20 20 20   pTabCol++){.   
ce50: 20 77 54 61 62 6c 65 20 2b 3d 20 70 54 61 62 43   wTable += pTabC
ce60: 6f 6c 2d 3e 73 7a 45 73 74 3b 0a 20 20 7d 0a 20  ol->szEst;.  }. 
ce70: 20 69 66 28 20 70 54 61 62 2d 3e 69 50 4b 65 79   if( pTab->iPKey
ce80: 3c 30 20 29 20 77 54 61 62 6c 65 2b 2b 3b 0a 20  <0 ) wTable++;. 
ce90: 20 70 54 61 62 2d 3e 73 7a 54 61 62 52 6f 77 20   pTab->szTabRow 
cea0: 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28  = sqlite3LogEst(
ceb0: 77 54 61 62 6c 65 2a 34 29 3b 0a 7d 0a 0a 2f 2a  wTable*4);.}../*
cec0: 0a 2a 2a 20 45 73 74 69 6d 61 74 65 20 74 68 65  .** Estimate the
ced0: 20 61 76 65 72 61 67 65 20 73 69 7a 65 20 6f 66   average size of
cee0: 20 61 20 72 6f 77 20 66 6f 72 20 61 6e 20 69 6e   a row for an in
cef0: 64 65 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  dex..*/.static v
cf00: 6f 69 64 20 65 73 74 69 6d 61 74 65 49 6e 64 65  oid estimateInde
cf10: 78 57 69 64 74 68 28 49 6e 64 65 78 20 2a 70 49  xWidth(Index *pI
cf20: 64 78 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20  dx){.  unsigned 
cf30: 77 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20 69 6e  wIndex = 0;.  in
cf40: 74 20 69 3b 0a 20 20 63 6f 6e 73 74 20 43 6f 6c  t i;.  const Col
cf50: 75 6d 6e 20 2a 61 43 6f 6c 20 3d 20 70 49 64 78  umn *aCol = pIdx
cf60: 2d 3e 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 3b 0a  ->pTable->aCol;.
cf70: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 64    for(i=0; i<pId
cf80: 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29  x->nColumn; i++)
cf90: 7b 0a 20 20 20 20 69 31 36 20 78 20 3d 20 70 49  {.    i16 x = pI
cfa0: 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 3b  dx->aiColumn[i];
cfb0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 78 3c 70  .    assert( x<p
cfc0: 49 64 78 2d 3e 70 54 61 62 6c 65 2d 3e 6e 43 6f  Idx->pTable->nCo
cfd0: 6c 20 29 3b 0a 20 20 20 20 77 49 6e 64 65 78 20  l );.    wIndex 
cfe0: 2b 3d 20 78 3c 30 20 3f 20 31 20 3a 20 61 43 6f  += x<0 ? 1 : aCo
cff0: 6c 5b 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e  l[pIdx->aiColumn
d000: 5b 69 5d 5d 2e 73 7a 45 73 74 3b 0a 20 20 7d 0a  [i]].szEst;.  }.
d010: 20 20 70 49 64 78 2d 3e 73 7a 49 64 78 52 6f 77    pIdx->szIdxRow
d020: 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74   = sqlite3LogEst
d030: 28 77 49 6e 64 65 78 2a 34 29 3b 0a 7d 0a 0a 2f  (wIndex*4);.}../
d040: 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66  * Return true if
d050: 20 76 61 6c 75 65 20 78 20 69 73 20 66 6f 75 6e   value x is foun
d060: 64 20 61 6e 79 20 6f 66 20 74 68 65 20 66 69 72  d any of the fir
d070: 73 74 20 6e 43 6f 6c 20 65 6e 74 72 69 65 73 20  st nCol entries 
d080: 6f 66 20 61 69 43 6f 6c 5b 5d 0a 2a 2f 0a 73 74  of aiCol[].*/.st
d090: 61 74 69 63 20 69 6e 74 20 68 61 73 43 6f 6c 75  atic int hasColu
d0a0: 6d 6e 28 63 6f 6e 73 74 20 69 31 36 20 2a 61 69  mn(const i16 *ai
d0b0: 43 6f 6c 2c 20 69 6e 74 20 6e 43 6f 6c 2c 20 69  Col, int nCol, i
d0c0: 6e 74 20 78 29 7b 0a 20 20 77 68 69 6c 65 28 20  nt x){.  while( 
d0d0: 6e 43 6f 6c 2d 2d 20 3e 20 30 20 29 20 69 66 28  nCol-- > 0 ) if(
d0e0: 20 78 3d 3d 2a 28 61 69 43 6f 6c 2b 2b 29 20 29   x==*(aiCol++) )
d0f0: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 72 65 74   return 1;.  ret
d100: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
d110: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 75 6e  This routine run
d120: 73 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20  s at the end of 
d130: 70 61 72 73 69 6e 67 20 61 20 43 52 45 41 54 45  parsing a CREATE
d140: 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74   TABLE statement
d150: 20 74 68 61 74 0a 2a 2a 20 68 61 73 20 61 20 57   that.** has a W
d160: 49 54 48 4f 55 54 20 52 4f 57 49 44 20 63 6c 61  ITHOUT ROWID cla
d170: 75 73 65 2e 20 20 54 68 65 20 6a 6f 62 20 6f 66  use.  The job of
d180: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
d190: 20 74 6f 20 63 6f 6e 76 65 72 74 20 62 6f 74 68   to convert both
d1a0: 0a 2a 2a 20 69 6e 74 65 72 6e 61 6c 20 73 63 68  .** internal sch
d1b0: 65 6d 61 20 64 61 74 61 20 73 74 72 75 63 74 75  ema data structu
d1c0: 72 65 73 20 61 6e 64 20 74 68 65 20 67 65 6e 65  res and the gene
d1d0: 72 61 74 65 64 20 56 44 42 45 20 63 6f 64 65 20  rated VDBE code 
d1e0: 73 6f 20 74 68 61 74 20 74 68 65 79 0a 2a 2a 20  so that they.** 
d1f0: 61 72 65 20 61 70 70 72 6f 70 72 69 61 74 65 20  are appropriate 
d200: 66 6f 72 20 61 20 57 49 54 48 4f 55 54 20 52 4f  for a WITHOUT RO
d210: 57 49 44 20 74 61 62 6c 65 20 69 6e 73 74 65 61  WID table instea
d220: 64 20 6f 66 20 61 20 72 6f 77 69 64 20 74 61 62  d of a rowid tab
d230: 6c 65 2e 0a 2a 2a 20 43 68 61 6e 67 65 73 20 69  le..** Changes i
d240: 6e 63 6c 75 64 65 3a 0a 2a 2a 0a 2a 2a 20 20 20  nclude:.**.**   
d250: 20 20 28 31 29 20 20 53 65 74 20 61 6c 6c 20 63    (1)  Set all c
d260: 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 50 52  olumns of the PR
d270: 49 4d 41 52 59 20 4b 45 59 20 73 63 68 65 6d 61  IMARY KEY schema
d280: 20 6f 62 6a 65 63 74 20 74 6f 20 62 65 20 4e 4f   object to be NO
d290: 54 20 4e 55 4c 4c 2e 0a 2a 2a 20 20 20 20 20 28  T NULL..**     (
d2a0: 32 29 20 20 43 6f 6e 76 65 72 74 20 74 68 65 20  2)  Convert the 
d2b0: 4f 50 5f 43 72 65 61 74 65 54 61 62 6c 65 20 69  OP_CreateTable i
d2c0: 6e 74 6f 20 61 6e 20 4f 50 5f 43 72 65 61 74 65  nto an OP_Create
d2d0: 49 6e 64 65 78 2e 20 20 54 68 65 72 65 20 69 73  Index.  There is
d2e0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 6e 6f 20  .**          no 
d2f0: 72 6f 77 69 64 20 62 74 72 65 65 20 66 6f 72 20  rowid btree for 
d300: 61 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 2e  a WITHOUT ROWID.
d310: 20 20 49 6e 73 74 65 61 64 2c 20 74 68 65 20 63    Instead, the c
d320: 61 6e 6f 6e 69 63 61 6c 0a 2a 2a 20 20 20 20 20  anonical.**     
d330: 20 20 20 20 20 64 61 74 61 20 73 74 6f 72 61 67       data storag
d340: 65 20 69 73 20 61 20 63 6f 76 65 72 69 6e 67 20  e is a covering 
d350: 69 6e 64 65 78 20 62 74 72 65 65 2e 0a 2a 2a 20  index btree..** 
d360: 20 20 20 20 28 33 29 20 20 42 79 70 61 73 73 20      (3)  Bypass 
d370: 74 68 65 20 63 72 65 61 74 69 6f 6e 20 6f 66 20  the creation of 
d380: 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  the sqlite_maste
d390: 72 20 74 61 62 6c 65 20 65 6e 74 72 79 0a 2a 2a  r table entry.**
d3a0: 20 20 20 20 20 20 20 20 20 20 66 6f 72 20 74 68            for th
d3b0: 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 61 73  e PRIMARY KEY as
d3c0: 20 74 68 65 20 70 72 69 6d 61 72 79 20 6b 65 79   the primary key
d3d0: 20 69 6e 64 65 78 20 69 73 20 6e 6f 77 0a 2a 2a   index is now.**
d3e0: 20 20 20 20 20 20 20 20 20 20 69 64 65 6e 74 69            identi
d3f0: 66 69 65 64 20 62 79 20 74 68 65 20 73 71 6c 69  fied by the sqli
d400: 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20  te_master table 
d410: 65 6e 74 72 79 20 6f 66 20 74 68 65 20 74 61 62  entry of the tab
d420: 6c 65 20 69 74 73 65 6c 66 2e 0a 2a 2a 20 20 20  le itself..**   
d430: 20 20 28 34 29 20 20 53 65 74 20 74 68 65 20 49    (4)  Set the I
d440: 6e 64 65 78 2e 74 6e 75 6d 20 6f 66 20 74 68 65  ndex.tnum of the
d450: 20 50 52 49 4d 41 52 59 20 4b 45 59 20 49 6e 64   PRIMARY KEY Ind
d460: 65 78 20 6f 62 6a 65 63 74 20 69 6e 20 74 68 65  ex object in the
d470: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 73 63 68  .**          sch
d480: 65 6d 61 20 74 6f 20 74 68 65 20 72 6f 6f 74 70  ema to the rootp
d490: 61 67 65 20 66 72 6f 6d 20 74 68 65 20 6d 61 69  age from the mai
d4a0: 6e 20 74 61 62 6c 65 2e 0a 2a 2a 20 20 20 20 20  n table..**     
d4b0: 28 35 29 20 20 41 64 64 20 61 6c 6c 20 74 61 62  (5)  Add all tab
d4c0: 6c 65 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 74 68  le columns to th
d4d0: 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 49 6e  e PRIMARY KEY In
d4e0: 64 65 78 20 6f 62 6a 65 63 74 0a 2a 2a 20 20 20  dex object.**   
d4f0: 20 20 20 20 20 20 20 73 6f 20 74 68 61 74 20 74         so that t
d500: 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 69  he PRIMARY KEY i
d510: 73 20 61 20 63 6f 76 65 72 69 6e 67 20 69 6e 64  s a covering ind
d520: 65 78 2e 20 20 54 68 65 20 73 75 72 70 6c 75 73  ex.  The surplus
d530: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 63 6f 6c  .**          col
d540: 75 6d 6e 73 20 61 72 65 20 70 61 72 74 20 6f 66  umns are part of
d550: 20 4b 65 79 49 6e 66 6f 2e 6e 58 46 69 65 6c 64   KeyInfo.nXField
d560: 20 61 6e 64 20 61 72 65 20 6e 6f 74 20 75 73 65   and are not use
d570: 64 20 66 6f 72 0a 2a 2a 20 20 20 20 20 20 20 20  d for.**        
d580: 20 20 73 6f 72 74 69 6e 67 20 6f 72 20 6c 6f 6f    sorting or loo
d590: 6b 75 70 20 6f 72 20 75 6e 69 71 75 65 6e 65 73  kup or uniquenes
d5a0: 73 20 63 68 65 63 6b 73 2e 0a 2a 2a 20 20 20 20  s checks..**    
d5b0: 20 28 36 29 20 20 52 65 70 6c 61 63 65 20 74 68   (6)  Replace th
d5c0: 65 20 72 6f 77 69 64 20 74 61 69 6c 20 6f 6e 20  e rowid tail on 
d5d0: 61 6c 6c 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c  all automaticall
d5e0: 79 20 67 65 6e 65 72 61 74 65 64 20 55 4e 49 51  y generated UNIQ
d5f0: 55 45 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 69  UE.**          i
d600: 6e 64 69 63 65 73 20 77 69 74 68 20 74 68 65 20  ndices with the 
d610: 50 52 49 4d 41 52 59 20 4b 45 59 20 63 6f 6c 75  PRIMARY KEY colu
d620: 6d 6e 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 76  mns..**.** For v
d630: 69 72 74 75 61 6c 20 74 61 62 6c 65 73 2c 20 6f  irtual tables, o
d640: 6e 6c 79 20 28 31 29 20 69 73 20 70 65 72 66 6f  nly (1) is perfo
d650: 72 6d 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rmed..*/.static 
d660: 76 6f 69 64 20 63 6f 6e 76 65 72 74 54 6f 57 69  void convertToWi
d670: 74 68 6f 75 74 52 6f 77 69 64 54 61 62 6c 65 28  thoutRowidTable(
d680: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54  Parse *pParse, T
d690: 61 62 6c 65 20 2a 70 54 61 62 29 7b 0a 20 20 49  able *pTab){.  I
d6a0: 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 49 6e  ndex *pIdx;.  In
d6b0: 64 65 78 20 2a 70 50 6b 3b 0a 20 20 69 6e 74 20  dex *pPk;.  int 
d6c0: 6e 50 6b 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b  nPk;.  int i, j;
d6d0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
d6e0: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 56   pParse->db;.  V
d6f0: 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
d700: 3e 70 56 64 62 65 3b 0a 0a 20 20 2f 2a 20 4d 61  >pVdbe;..  /* Ma
d710: 72 6b 20 65 76 65 72 79 20 50 52 49 4d 41 52 59  rk every PRIMARY
d720: 20 4b 45 59 20 63 6f 6c 75 6d 6e 20 61 73 20 4e   KEY column as N
d730: 4f 54 20 4e 55 4c 4c 20 28 65 78 63 65 70 74 20  OT NULL (except 
d740: 66 6f 72 20 69 6d 70 6f 73 74 65 72 20 74 61 62  for imposter tab
d750: 6c 65 73 29 0a 20 20 2a 2f 0a 20 20 69 66 28 20  les).  */.  if( 
d760: 21 64 62 2d 3e 69 6e 69 74 2e 69 6d 70 6f 73 74  !db->init.impost
d770: 65 72 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 66  erTable ){.    f
d780: 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61 62 2d 3e  or(i=0; i<pTab->
d790: 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nCol; i++){.    
d7a0: 20 20 69 66 28 20 28 70 54 61 62 2d 3e 61 43 6f    if( (pTab->aCo
d7b0: 6c 5b 69 5d 2e 63 6f 6c 46 6c 61 67 73 20 26 20  l[i].colFlags & 
d7c0: 43 4f 4c 46 4c 41 47 5f 50 52 49 4d 4b 45 59 29  COLFLAG_PRIMKEY)
d7d0: 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  !=0 ){.        p
d7e0: 54 61 62 2d 3e 61 43 6f 6c 5b 69 5d 2e 6e 6f 74  Tab->aCol[i].not
d7f0: 4e 75 6c 6c 20 3d 20 4f 45 5f 41 62 6f 72 74 3b  Null = OE_Abort;
d800: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
d810: 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 72 65 6d   }..  /* The rem
d820: 61 69 6e 69 6e 67 20 74 72 61 6e 73 66 6f 72 6d  aining transform
d830: 61 74 69 6f 6e 73 20 6f 6e 6c 79 20 61 70 70 6c  ations only appl
d840: 79 20 74 6f 20 62 2d 74 72 65 65 20 74 61 62 6c  y to b-tree tabl
d850: 65 73 2c 20 6e 6f 74 20 74 6f 0a 20 20 2a 2a 20  es, not to.  ** 
d860: 76 69 72 74 75 61 6c 20 74 61 62 6c 65 73 20 2a  virtual tables *
d870: 2f 0a 20 20 69 66 28 20 49 4e 5f 44 45 43 4c 41  /.  if( IN_DECLA
d880: 52 45 5f 56 54 41 42 20 29 20 72 65 74 75 72 6e  RE_VTAB ) return
d890: 3b 0a 0a 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20  ;..  /* Convert 
d8a0: 74 68 65 20 4f 50 5f 43 72 65 61 74 65 54 61 62  the OP_CreateTab
d8b0: 6c 65 20 6f 70 63 6f 64 65 20 74 68 61 74 20 77  le opcode that w
d8c0: 6f 75 6c 64 20 6e 6f 72 6d 61 6c 6c 79 20 63 72  ould normally cr
d8d0: 65 61 74 65 20 74 68 65 0a 20 20 2a 2a 20 72 6f  eate the.  ** ro
d8e0: 6f 74 2d 70 61 67 65 20 66 6f 72 20 74 68 65 20  ot-page for the 
d8f0: 74 61 62 6c 65 20 69 6e 74 6f 20 61 6e 20 4f 50  table into an OP
d900: 5f 43 72 65 61 74 65 49 6e 64 65 78 20 6f 70 63  _CreateIndex opc
d910: 6f 64 65 2e 20 20 54 68 65 20 69 6e 64 65 78 0a  ode.  The index.
d920: 20 20 2a 2a 20 63 72 65 61 74 65 64 20 77 69 6c    ** created wil
d930: 6c 20 62 65 63 6f 6d 65 20 74 68 65 20 50 52 49  l become the PRI
d940: 4d 41 52 59 20 4b 45 59 20 69 6e 64 65 78 2e 0a  MARY KEY index..
d950: 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 72 73    */.  if( pPars
d960: 65 2d 3e 61 64 64 72 43 72 54 61 62 20 29 7b 0a  e->addrCrTab ){.
d970: 20 20 20 20 61 73 73 65 72 74 28 20 76 20 29 3b      assert( v );
d980: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
d990: 43 68 61 6e 67 65 4f 70 63 6f 64 65 28 76 2c 20  ChangeOpcode(v, 
d9a0: 70 50 61 72 73 65 2d 3e 61 64 64 72 43 72 54 61  pParse->addrCrTa
d9b0: 62 2c 20 4f 50 5f 43 72 65 61 74 65 49 6e 64 65  b, OP_CreateInde
d9c0: 78 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f  x);.  }..  /* Lo
d9d0: 63 61 74 65 20 74 68 65 20 50 52 49 4d 41 52 59  cate the PRIMARY
d9e0: 20 4b 45 59 20 69 6e 64 65 78 2e 20 20 4f 72 2c   KEY index.  Or,
d9f0: 20 69 66 20 74 68 69 73 20 74 61 62 6c 65 20 77   if this table w
da00: 61 73 20 6f 72 69 67 69 6e 61 6c 6c 79 0a 20 20  as originally.  
da10: 2a 2a 20 61 6e 20 49 4e 54 45 47 45 52 20 50 52  ** an INTEGER PR
da20: 49 4d 41 52 59 20 4b 45 59 20 74 61 62 6c 65 2c  IMARY KEY table,
da30: 20 63 72 65 61 74 65 20 61 20 6e 65 77 20 50 52   create a new PR
da40: 49 4d 41 52 59 20 4b 45 59 20 69 6e 64 65 78 2e  IMARY KEY index.
da50: 20 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 54 61   .  */.  if( pTa
da60: 62 2d 3e 69 50 4b 65 79 3e 3d 30 20 29 7b 0a 20  b->iPKey>=0 ){. 
da70: 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69     ExprList *pLi
da80: 73 74 3b 0a 20 20 20 20 54 6f 6b 65 6e 20 69 70  st;.    Token ip
da90: 6b 54 6f 6b 65 6e 3b 0a 20 20 20 20 73 71 6c 69  kToken;.    sqli
daa0: 74 65 33 54 6f 6b 65 6e 49 6e 69 74 28 26 69 70  te3TokenInit(&ip
dab0: 6b 54 6f 6b 65 6e 2c 20 70 54 61 62 2d 3e 61 43  kToken, pTab->aC
dac0: 6f 6c 5b 70 54 61 62 2d 3e 69 50 4b 65 79 5d 2e  ol[pTab->iPKey].
dad0: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70 4c 69 73  zName);.    pLis
dae0: 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  t = sqlite3ExprL
daf0: 69 73 74 41 70 70 65 6e 64 28 70 50 61 72 73 65  istAppend(pParse
db00: 2c 20 30 2c 20 0a 20 20 20 20 20 20 20 20 20 20  , 0, .          
db10: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
db20: 78 70 72 41 6c 6c 6f 63 28 64 62 2c 20 54 4b 5f  xprAlloc(db, TK_
db30: 49 44 2c 20 26 69 70 6b 54 6f 6b 65 6e 2c 20 30  ID, &ipkToken, 0
db40: 29 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73  ));.    if( pLis
db50: 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  t==0 ) return;. 
db60: 20 20 20 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 73     pList->a[0].s
db70: 6f 72 74 4f 72 64 65 72 20 3d 20 70 50 61 72 73  ortOrder = pPars
db80: 65 2d 3e 69 50 6b 53 6f 72 74 4f 72 64 65 72 3b  e->iPkSortOrder;
db90: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
dba0: 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3d 3d  rse->pNewTable==
dbb0: 70 54 61 62 20 29 3b 0a 20 20 20 20 73 71 6c 69  pTab );.    sqli
dbc0: 74 65 33 43 72 65 61 74 65 49 6e 64 65 78 28 70  te3CreateIndex(p
dbd0: 50 61 72 73 65 2c 20 30 2c 20 30 2c 20 30 2c 20  Parse, 0, 0, 0, 
dbe0: 70 4c 69 73 74 2c 20 70 54 61 62 2d 3e 6b 65 79  pList, pTab->key
dbf0: 43 6f 6e 66 2c 20 30 2c 20 30 2c 20 30 2c 20 30  Conf, 0, 0, 0, 0
dc00: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
dc10: 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
dc20: 49 44 58 54 59 50 45 5f 50 52 49 4d 41 52 59 4b  IDXTYPE_PRIMARYK
dc30: 45 59 29 3b 0a 20 20 20 20 69 66 28 20 64 62 2d  EY);.    if( db-
dc40: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20  >mallocFailed ) 
dc50: 72 65 74 75 72 6e 3b 0a 20 20 20 20 70 50 6b 20  return;.    pPk 
dc60: 3d 20 73 71 6c 69 74 65 33 50 72 69 6d 61 72 79  = sqlite3Primary
dc70: 4b 65 79 49 6e 64 65 78 28 70 54 61 62 29 3b 0a  KeyIndex(pTab);.
dc80: 20 20 20 20 70 54 61 62 2d 3e 69 50 4b 65 79 20      pTab->iPKey 
dc90: 3d 20 2d 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  = -1;.  }else{. 
dca0: 20 20 20 70 50 6b 20 3d 20 73 71 6c 69 74 65 33     pPk = sqlite3
dcb0: 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65 78 28  PrimaryKeyIndex(
dcc0: 70 54 61 62 29 3b 0a 0a 20 20 20 20 2f 2a 20 42  pTab);..    /* B
dcd0: 79 70 61 73 73 20 74 68 65 20 63 72 65 61 74 69  ypass the creati
dce0: 6f 6e 20 6f 66 20 74 68 65 20 50 52 49 4d 41 52  on of the PRIMAR
dcf0: 59 20 4b 45 59 20 62 74 72 65 65 20 61 6e 64 20  Y KEY btree and 
dd00: 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  the sqlite_maste
dd10: 72 0a 20 20 20 20 2a 2a 20 74 61 62 6c 65 20 65  r.    ** table e
dd20: 6e 74 72 79 2e 20 54 68 69 73 20 69 73 20 6f 6e  ntry. This is on
dd30: 6c 79 20 72 65 71 75 69 72 65 64 20 69 66 20 63  ly required if c
dd40: 75 72 72 65 6e 74 6c 79 20 67 65 6e 65 72 61 74  urrently generat
dd50: 69 6e 67 20 56 44 42 45 0a 20 20 20 20 2a 2a 20  ing VDBE.    ** 
dd60: 63 6f 64 65 20 66 6f 72 20 61 20 43 52 45 41 54  code for a CREAT
dd70: 45 20 54 41 42 4c 45 20 28 6e 6f 74 20 77 68 65  E TABLE (not whe
dd80: 6e 20 70 61 72 73 69 6e 67 20 6f 6e 65 20 61 73  n parsing one as
dd90: 20 70 61 72 74 20 6f 66 20 72 65 61 64 69 6e 67   part of reading
dda0: 0a 20 20 20 20 2a 2a 20 61 20 64 61 74 61 62 61  .    ** a databa
ddb0: 73 65 20 73 63 68 65 6d 61 29 2e 20 20 2a 2f 0a  se schema).  */.
ddc0: 20 20 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20      if( v ){.   
ddd0: 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 69     assert( db->i
dde0: 6e 69 74 2e 62 75 73 79 3d 3d 30 20 29 3b 0a 20  nit.busy==0 );. 
ddf0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
de00: 43 68 61 6e 67 65 4f 70 63 6f 64 65 28 76 2c 20  ChangeOpcode(v, 
de10: 70 50 6b 2d 3e 74 6e 75 6d 2c 20 4f 50 5f 47 6f  pPk->tnum, OP_Go
de20: 74 6f 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  to);.    }..    
de30: 2f 2a 0a 20 20 20 20 2a 2a 20 52 65 6d 6f 76 65  /*.    ** Remove
de40: 20 61 6c 6c 20 72 65 64 75 6e 64 61 6e 74 20 63   all redundant c
de50: 6f 6c 75 6d 6e 73 20 66 72 6f 6d 20 74 68 65 20  olumns from the 
de60: 50 52 49 4d 41 52 59 20 4b 45 59 2e 20 20 46 6f  PRIMARY KEY.  Fo
de70: 72 20 65 78 61 6d 70 6c 65 2c 20 63 68 61 6e 67  r example, chang
de80: 65 0a 20 20 20 20 2a 2a 20 22 50 52 49 4d 41 52  e.    ** "PRIMAR
de90: 59 20 4b 45 59 28 61 2c 62 2c 61 2c 62 2c 63 2c  Y KEY(a,b,a,b,c,
dea0: 62 2c 63 2c 64 29 22 20 69 6e 74 6f 20 6a 75 73  b,c,d)" into jus
deb0: 74 20 22 50 52 49 4d 41 52 59 20 4b 45 59 28 61  t "PRIMARY KEY(a
dec0: 2c 62 2c 63 2c 64 29 22 2e 20 20 4c 61 74 65 72  ,b,c,d)".  Later
ded0: 0a 20 20 20 20 2a 2a 20 63 6f 64 65 20 61 73 73  .    ** code ass
dee0: 75 6d 65 73 20 74 68 65 20 50 52 49 4d 41 52 59  umes the PRIMARY
def0: 20 4b 45 59 20 63 6f 6e 74 61 69 6e 73 20 6e 6f   KEY contains no
df00: 20 72 65 70 65 61 74 65 64 20 63 6f 6c 75 6d 6e   repeated column
df10: 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f  s..    */.    fo
df20: 72 28 69 3d 6a 3d 31 3b 20 69 3c 70 50 6b 2d 3e  r(i=j=1; i<pPk->
df30: 6e 4b 65 79 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20  nKeyCol; i++){. 
df40: 20 20 20 20 20 69 66 28 20 68 61 73 43 6f 6c 75       if( hasColu
df50: 6d 6e 28 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e  mn(pPk->aiColumn
df60: 2c 20 6a 2c 20 70 50 6b 2d 3e 61 69 43 6f 6c 75  , j, pPk->aiColu
df70: 6d 6e 5b 69 5d 29 20 29 7b 0a 20 20 20 20 20 20  mn[i]) ){.      
df80: 20 20 70 50 6b 2d 3e 6e 43 6f 6c 75 6d 6e 2d 2d    pPk->nColumn--
df90: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
dfa0: 20 20 20 20 20 20 20 70 50 6b 2d 3e 61 69 43 6f         pPk->aiCo
dfb0: 6c 75 6d 6e 5b 6a 2b 2b 5d 20 3d 20 70 50 6b 2d  lumn[j++] = pPk-
dfc0: 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 3b 0a 20 20  >aiColumn[i];.  
dfd0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
dfe0: 70 50 6b 2d 3e 6e 4b 65 79 43 6f 6c 20 3d 20 6a  pPk->nKeyCol = j
dff0: 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
e000: 70 50 6b 21 3d 30 20 29 3b 0a 20 20 70 50 6b 2d  pPk!=0 );.  pPk-
e010: 3e 69 73 43 6f 76 65 72 69 6e 67 20 3d 20 31 3b  >isCovering = 1;
e020: 0a 20 20 69 66 28 20 21 64 62 2d 3e 69 6e 69 74  .  if( !db->init
e030: 2e 69 6d 70 6f 73 74 65 72 54 61 62 6c 65 20 29  .imposterTable )
e040: 20 70 50 6b 2d 3e 75 6e 69 71 4e 6f 74 4e 75 6c   pPk->uniqNotNul
e050: 6c 20 3d 20 31 3b 0a 20 20 6e 50 6b 20 3d 20 70  l = 1;.  nPk = p
e060: 50 6b 2d 3e 6e 4b 65 79 43 6f 6c 3b 0a 0a 20 20  Pk->nKeyCol;..  
e070: 2f 2a 20 54 68 65 20 72 6f 6f 74 20 70 61 67 65  /* The root page
e080: 20 6f 66 20 74 68 65 20 50 52 49 4d 41 52 59 20   of the PRIMARY 
e090: 4b 45 59 20 69 73 20 74 68 65 20 74 61 62 6c 65  KEY is the table
e0a0: 20 72 6f 6f 74 20 70 61 67 65 20 2a 2f 0a 20 20   root page */.  
e0b0: 70 50 6b 2d 3e 74 6e 75 6d 20 3d 20 70 54 61 62  pPk->tnum = pTab
e0c0: 2d 3e 74 6e 75 6d 3b 0a 0a 20 20 2f 2a 20 55 70  ->tnum;..  /* Up
e0d0: 64 61 74 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f  date the in-memo
e0e0: 72 79 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f  ry representatio
e0f0: 6e 20 6f 66 20 61 6c 6c 20 55 4e 49 51 55 45 20  n of all UNIQUE 
e100: 69 6e 64 69 63 65 73 20 62 79 20 63 6f 6e 76 65  indices by conve
e110: 72 74 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20 66  rting.  ** the f
e120: 69 6e 61 6c 20 72 6f 77 69 64 20 63 6f 6c 75 6d  inal rowid colum
e130: 6e 20 69 6e 74 6f 20 6f 6e 65 20 6f 72 20 6d 6f  n into one or mo
e140: 72 65 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68  re columns of th
e150: 65 20 50 52 49 4d 41 52 59 20 4b 45 59 2e 0a 20  e PRIMARY KEY.. 
e160: 20 2a 2f 0a 20 20 66 6f 72 28 70 49 64 78 3d 70   */.  for(pIdx=p
e170: 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64  Tab->pIndex; pId
e180: 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e  x; pIdx=pIdx->pN
e190: 65 78 74 29 7b 0a 20 20 20 20 69 6e 74 20 6e 3b  ext){.    int n;
e1a0: 0a 20 20 20 20 69 66 28 20 49 73 50 72 69 6d 61  .    if( IsPrima
e1b0: 72 79 4b 65 79 49 6e 64 65 78 28 70 49 64 78 29  ryKeyIndex(pIdx)
e1c0: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
e1d0: 20 66 6f 72 28 69 3d 6e 3d 30 3b 20 69 3c 6e 50   for(i=n=0; i<nP
e1e0: 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  k; i++){.      i
e1f0: 66 28 20 21 68 61 73 43 6f 6c 75 6d 6e 28 70 49  f( !hasColumn(pI
e200: 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 2c 20 70 49  dx->aiColumn, pI
e210: 64 78 2d 3e 6e 4b 65 79 43 6f 6c 2c 20 70 50 6b  dx->nKeyCol, pPk
e220: 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 29 20 29  ->aiColumn[i]) )
e230: 20 6e 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20   n++;.    }.    
e240: 69 66 28 20 6e 3d 3d 30 20 29 7b 0a 20 20 20 20  if( n==0 ){.    
e250: 20 20 2f 2a 20 54 68 69 73 20 69 6e 64 65 78 20    /* This index 
e260: 69 73 20 61 20 73 75 70 65 72 73 65 74 20 6f 66  is a superset of
e270: 20 74 68 65 20 70 72 69 6d 61 72 79 20 6b 65 79   the primary key
e280: 20 2a 2f 0a 20 20 20 20 20 20 70 49 64 78 2d 3e   */.      pIdx->
e290: 6e 43 6f 6c 75 6d 6e 20 3d 20 70 49 64 78 2d 3e  nColumn = pIdx->
e2a0: 6e 4b 65 79 43 6f 6c 3b 0a 20 20 20 20 20 20 63  nKeyCol;.      c
e2b0: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20  ontinue;.    }. 
e2c0: 20 20 20 69 66 28 20 72 65 73 69 7a 65 49 6e 64     if( resizeInd
e2d0: 65 78 4f 62 6a 65 63 74 28 64 62 2c 20 70 49 64  exObject(db, pId
e2e0: 78 2c 20 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c  x, pIdx->nKeyCol
e2f0: 2b 6e 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  +n) ) return;.  
e300: 20 20 66 6f 72 28 69 3d 30 2c 20 6a 3d 70 49 64    for(i=0, j=pId
e310: 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 69 3c 6e 50  x->nKeyCol; i<nP
e320: 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  k; i++){.      i
e330: 66 28 20 21 68 61 73 43 6f 6c 75 6d 6e 28 70 49  f( !hasColumn(pI
e340: 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 2c 20 70 49  dx->aiColumn, pI
e350: 64 78 2d 3e 6e 4b 65 79 43 6f 6c 2c 20 70 50 6b  dx->nKeyCol, pPk
e360: 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 29 20 29  ->aiColumn[i]) )
e370: 7b 0a 20 20 20 20 20 20 20 20 70 49 64 78 2d 3e  {.        pIdx->
e380: 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 20 3d 20 70 50  aiColumn[j] = pP
e390: 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 3b 0a  k->aiColumn[i];.
e3a0: 20 20 20 20 20 20 20 20 70 49 64 78 2d 3e 61 7a          pIdx->az
e3b0: 43 6f 6c 6c 5b 6a 5d 20 3d 20 70 50 6b 2d 3e 61  Coll[j] = pPk->a
e3c0: 7a 43 6f 6c 6c 5b 69 5d 3b 0a 20 20 20 20 20 20  zColl[i];.      
e3d0: 20 20 6a 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20    j++;.      }. 
e3e0: 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
e3f0: 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3e 3d   pIdx->nColumn>=
e400: 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 2b 6e 20  pIdx->nKeyCol+n 
e410: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
e420: 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3e 3d 6a 20  Idx->nColumn>=j 
e430: 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 64 64  );.  }..  /* Add
e440: 20 61 6c 6c 20 74 61 62 6c 65 20 63 6f 6c 75 6d   all table colum
e450: 6e 73 20 74 6f 20 74 68 65 20 50 52 49 4d 41 52  ns to the PRIMAR
e460: 59 20 4b 45 59 20 69 6e 64 65 78 0a 20 20 2a 2f  Y KEY index.  */
e470: 0a 20 20 69 66 28 20 6e 50 6b 3c 70 54 61 62 2d  .  if( nPk<pTab-
e480: 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 69 66 28  >nCol ){.    if(
e490: 20 72 65 73 69 7a 65 49 6e 64 65 78 4f 62 6a 65   resizeIndexObje
e4a0: 63 74 28 64 62 2c 20 70 50 6b 2c 20 70 54 61 62  ct(db, pPk, pTab
e4b0: 2d 3e 6e 43 6f 6c 29 20 29 20 72 65 74 75 72 6e  ->nCol) ) return
e4c0: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 6a  ;.    for(i=0, j
e4d0: 3d 6e 50 6b 3b 20 69 3c 70 54 61 62 2d 3e 6e 43  =nPk; i<pTab->nC
e4e0: 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ol; i++){.      
e4f0: 69 66 28 20 21 68 61 73 43 6f 6c 75 6d 6e 28 70  if( !hasColumn(p
e500: 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 2c 20 6a 2c  Pk->aiColumn, j,
e510: 20 69 29 20 29 7b 0a 20 20 20 20 20 20 20 20 61   i) ){.        a
e520: 73 73 65 72 74 28 20 6a 3c 70 50 6b 2d 3e 6e 43  ssert( j<pPk->nC
e530: 6f 6c 75 6d 6e 20 29 3b 0a 20 20 20 20 20 20 20  olumn );.       
e540: 20 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a   pPk->aiColumn[j
e550: 5d 20 3d 20 69 3b 0a 20 20 20 20 20 20 20 20 70  ] = i;.        p
e560: 50 6b 2d 3e 61 7a 43 6f 6c 6c 5b 6a 5d 20 3d 20  Pk->azColl[j] = 
e570: 73 71 6c 69 74 65 33 53 74 72 42 49 4e 41 52 59  sqlite3StrBINARY
e580: 3b 0a 20 20 20 20 20 20 20 20 6a 2b 2b 3b 0a 20  ;.        j++;. 
e590: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
e5a0: 20 61 73 73 65 72 74 28 20 70 50 6b 2d 3e 6e 43   assert( pPk->nC
e5b0: 6f 6c 75 6d 6e 3d 3d 6a 20 29 3b 0a 20 20 20 20  olumn==j );.    
e5c0: 61 73 73 65 72 74 28 20 70 54 61 62 2d 3e 6e 43  assert( pTab->nC
e5d0: 6f 6c 3d 3d 6a 20 29 3b 0a 20 20 7d 65 6c 73 65  ol==j );.  }else
e5e0: 7b 0a 20 20 20 20 70 50 6b 2d 3e 6e 43 6f 6c 75  {.    pPk->nColu
e5f0: 6d 6e 20 3d 20 70 54 61 62 2d 3e 6e 43 6f 6c 3b  mn = pTab->nCol;
e600: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  .  }.}../*.** Th
e610: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
e620: 6c 6c 65 64 20 74 6f 20 72 65 70 6f 72 74 20 74  lled to report t
e630: 68 65 20 66 69 6e 61 6c 20 22 29 22 20 74 68 61  he final ")" tha
e640: 74 20 74 65 72 6d 69 6e 61 74 65 73 0a 2a 2a 20  t terminates.** 
e650: 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73  a CREATE TABLE s
e660: 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20  tatement..**.** 
e670: 54 68 65 20 74 61 62 6c 65 20 73 74 72 75 63 74  The table struct
e680: 75 72 65 20 74 68 61 74 20 6f 74 68 65 72 20 61  ure that other a
e690: 63 74 69 6f 6e 20 72 6f 75 74 69 6e 65 73 20 68  ction routines h
e6a0: 61 76 65 20 62 65 65 6e 20 62 75 69 6c 64 69 6e  ave been buildin
e6b0: 67 0a 2a 2a 20 69 73 20 61 64 64 65 64 20 74 6f  g.** is added to
e6c0: 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 68 61   the internal ha
e6d0: 73 68 20 74 61 62 6c 65 73 2c 20 61 73 73 75 6d  sh tables, assum
e6e0: 69 6e 67 20 6e 6f 20 65 72 72 6f 72 73 20 68 61  ing no errors ha
e6f0: 76 65 0a 2a 2a 20 6f 63 63 75 72 72 65 64 2e 0a  ve.** occurred..
e700: 2a 2a 0a 2a 2a 20 41 6e 20 65 6e 74 72 79 20 66  **.** An entry f
e710: 6f 72 20 74 68 65 20 74 61 62 6c 65 20 69 73 20  or the table is 
e720: 6d 61 64 65 20 69 6e 20 74 68 65 20 6d 61 73 74  made in the mast
e730: 65 72 20 74 61 62 6c 65 20 6f 6e 20 64 69 73 6b  er table on disk
e740: 2c 20 75 6e 6c 65 73 73 0a 2a 2a 20 74 68 69 73  , unless.** this
e750: 20 69 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20   is a temporary 
e760: 74 61 62 6c 65 20 6f 72 20 64 62 2d 3e 69 6e 69  table or db->ini
e770: 74 2e 62 75 73 79 3d 3d 31 2e 20 20 57 68 65 6e  t.busy==1.  When
e780: 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d   db->init.busy==
e790: 31 0a 2a 2a 20 69 74 20 6d 65 61 6e 73 20 77 65  1.** it means we
e7a0: 20 61 72 65 20 72 65 61 64 69 6e 67 20 74 68 65   are reading the
e7b0: 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74   sqlite_master t
e7c0: 61 62 6c 65 20 62 65 63 61 75 73 65 20 77 65 20  able because we 
e7d0: 6a 75 73 74 0a 2a 2a 20 63 6f 6e 6e 65 63 74 65  just.** connecte
e7e0: 64 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  d to the databas
e7f0: 65 20 6f 72 20 62 65 63 61 75 73 65 20 74 68 65  e or because the
e800: 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74   sqlite_master t
e810: 61 62 6c 65 20 68 61 73 0a 2a 2a 20 72 65 63 65  able has.** rece
e820: 6e 74 6c 79 20 63 68 61 6e 67 65 64 2c 20 73 6f  ntly changed, so
e830: 20 74 68 65 20 65 6e 74 72 79 20 66 6f 72 20 74   the entry for t
e840: 68 69 73 20 74 61 62 6c 65 20 61 6c 72 65 61 64  his table alread
e850: 79 20 65 78 69 73 74 73 20 69 6e 0a 2a 2a 20 74  y exists in.** t
e860: 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  he sqlite_master
e870: 20 74 61 62 6c 65 2e 20 20 57 65 20 64 6f 20 6e   table.  We do n
e880: 6f 74 20 77 61 6e 74 20 74 6f 20 63 72 65 61 74  ot want to creat
e890: 65 20 69 74 20 61 67 61 69 6e 2e 0a 2a 2a 0a 2a  e it again..**.*
e8a0: 2a 20 49 66 20 74 68 65 20 70 53 65 6c 65 63 74  * If the pSelect
e8b0: 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f 74   argument is not
e8c0: 20 4e 55 4c 4c 2c 20 69 74 20 6d 65 61 6e 73 20   NULL, it means 
e8d0: 74 68 61 74 20 74 68 69 73 20 72 6f 75 74 69 6e  that this routin
e8e0: 65 0a 2a 2a 20 77 61 73 20 63 61 6c 6c 65 64 20  e.** was called 
e8f0: 74 6f 20 63 72 65 61 74 65 20 61 20 74 61 62 6c  to create a tabl
e900: 65 20 67 65 6e 65 72 61 74 65 64 20 66 72 6f 6d  e generated from
e910: 20 61 20 0a 2a 2a 20 22 43 52 45 41 54 45 20 54   a .** "CREATE T
e920: 41 42 4c 45 20 2e 2e 2e 20 41 53 20 53 45 4c 45  ABLE ... AS SELE
e930: 43 54 20 2e 2e 2e 22 20 73 74 61 74 65 6d 65 6e  CT ..." statemen
e940: 74 2e 20 20 54 68 65 20 63 6f 6c 75 6d 6e 20 6e  t.  The column n
e950: 61 6d 65 73 20 6f 66 0a 2a 2a 20 74 68 65 20 6e  ames of.** the n
e960: 65 77 20 74 61 62 6c 65 20 77 69 6c 6c 20 6d 61  ew table will ma
e970: 74 63 68 20 74 68 65 20 72 65 73 75 6c 74 20 73  tch the result s
e980: 65 74 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54  et of the SELECT
e990: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
e9a0: 33 45 6e 64 54 61 62 6c 65 28 0a 20 20 50 61 72  3EndTable(.  Par
e9b0: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
e9c0: 20 20 20 20 20 2f 2a 20 50 61 72 73 65 20 63 6f       /* Parse co
e9d0: 6e 74 65 78 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e  ntext */.  Token
e9e0: 20 2a 70 43 6f 6e 73 2c 20 20 20 20 20 20 20 20   *pCons,        
e9f0: 20 20 20 2f 2a 20 54 68 65 20 27 2c 27 20 74 6f     /* The ',' to
ea00: 6b 65 6e 20 61 66 74 65 72 20 74 68 65 20 6c 61  ken after the la
ea10: 73 74 20 63 6f 6c 75 6d 6e 20 64 65 66 6e 2e 20  st column defn. 
ea20: 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 45 6e 64  */.  Token *pEnd
ea30: 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
ea40: 54 68 65 20 27 29 27 20 62 65 66 6f 72 65 20 6f  The ')' before o
ea50: 70 74 69 6f 6e 73 20 69 6e 20 74 68 65 20 43 52  ptions in the CR
ea60: 45 41 54 45 20 54 41 42 4c 45 20 2a 2f 0a 20 20  EATE TABLE */.  
ea70: 75 38 20 74 61 62 4f 70 74 73 2c 20 20 20 20 20  u8 tabOpts,     
ea80: 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61          /* Extra
ea90: 20 74 61 62 6c 65 20 6f 70 74 69 6f 6e 73 2e 20   table options. 
eaa0: 55 73 75 61 6c 6c 79 20 30 2e 20 2a 2f 0a 20 20  Usually 0. */.  
eab0: 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 20  Select *pSelect 
eac0: 20 20 20 20 20 20 20 20 2f 2a 20 53 65 6c 65 63          /* Selec
ead0: 74 20 66 72 6f 6d 20 61 20 22 43 52 45 41 54 45  t from a "CREATE
eae0: 20 2e 2e 2e 20 41 53 20 53 45 4c 45 43 54 22 20   ... AS SELECT" 
eaf0: 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70  */.){.  Table *p
eb00: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
eb10: 20 20 2f 2a 20 54 68 65 20 6e 65 77 20 74 61 62    /* The new tab
eb20: 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  le */.  sqlite3 
eb30: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
eb40: 3b 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73  ; /* The databas
eb50: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a  e connection */.
eb60: 20 20 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20    int iDb;      
eb70: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
eb80: 61 74 61 62 61 73 65 20 69 6e 20 77 68 69 63 68  atabase in which
eb90: 20 74 68 65 20 74 61 62 6c 65 20 6c 69 76 65 73   the table lives
eba0: 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64   */.  Index *pId
ebb0: 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x;              
ebc0: 2f 2a 20 41 6e 20 69 6d 70 6c 69 65 64 20 69 6e  /* An implied in
ebd0: 64 65 78 20 6f 66 20 74 68 65 20 74 61 62 6c 65  dex of the table
ebe0: 20 2a 2f 0a 0a 20 20 69 66 28 20 70 45 6e 64 3d   */..  if( pEnd=
ebf0: 3d 30 20 26 26 20 70 53 65 6c 65 63 74 3d 3d 30  =0 && pSelect==0
ec00: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a   ){.    return;.
ec10: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 21 64    }.  assert( !d
ec20: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
ec30: 29 3b 0a 20 20 70 20 3d 20 70 50 61 72 73 65 2d  );.  p = pParse-
ec40: 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 69 66  >pNewTable;.  if
ec50: 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ( p==0 ) return;
ec60: 0a 0a 20 20 61 73 73 65 72 74 28 20 21 64 62 2d  ..  assert( !db-
ec70: 3e 69 6e 69 74 2e 62 75 73 79 20 7c 7c 20 21 70  >init.busy || !p
ec80: 53 65 6c 65 63 74 20 29 3b 0a 0a 20 20 2f 2a 20  Select );..  /* 
ec90: 49 66 20 74 68 65 20 64 62 2d 3e 69 6e 69 74 2e  If the db->init.
eca0: 62 75 73 79 20 69 73 20 31 20 69 74 20 6d 65 61  busy is 1 it mea
ecb0: 6e 73 20 77 65 20 61 72 65 20 72 65 61 64 69 6e  ns we are readin
ecc0: 67 20 74 68 65 20 53 51 4c 20 6f 66 66 20 74 68  g the SQL off th
ecd0: 65 0a 20 20 2a 2a 20 22 73 71 6c 69 74 65 5f 6d  e.  ** "sqlite_m
ece0: 61 73 74 65 72 22 20 6f 72 20 22 73 71 6c 69 74  aster" or "sqlit
ecf0: 65 5f 74 65 6d 70 5f 6d 61 73 74 65 72 22 20 74  e_temp_master" t
ed00: 61 62 6c 65 20 6f 6e 20 74 68 65 20 64 69 73 6b  able on the disk
ed10: 2e 0a 20 20 2a 2a 20 53 6f 20 64 6f 20 6e 6f 74  ..  ** So do not
ed20: 20 77 72 69 74 65 20 74 6f 20 74 68 65 20 64 69   write to the di
ed30: 73 6b 20 61 67 61 69 6e 2e 20 20 45 78 74 72 61  sk again.  Extra
ed40: 63 74 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65  ct the root page
ed50: 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 66 6f 72   number.  ** for
ed60: 20 74 68 65 20 74 61 62 6c 65 20 66 72 6f 6d 20   the table from 
ed70: 74 68 65 20 64 62 2d 3e 69 6e 69 74 2e 6e 65 77  the db->init.new
ed80: 54 6e 75 6d 20 66 69 65 6c 64 2e 20 20 28 54 68  Tnum field.  (Th
ed90: 65 20 70 61 67 65 20 6e 75 6d 62 65 72 0a 20 20  e page number.  
eda0: 2a 2a 20 73 68 6f 75 6c 64 20 68 61 76 65 20 62  ** should have b
edb0: 65 65 6e 20 70 75 74 20 74 68 65 72 65 20 62 79  een put there by
edc0: 20 74 68 65 20 73 71 6c 69 74 65 4f 70 65 6e 43   the sqliteOpenC
edd0: 62 20 72 6f 75 74 69 6e 65 2e 29 0a 20 20 2a 2a  b routine.).  **
ede0: 0a 20 20 2a 2a 20 49 66 20 74 68 65 20 72 6f 6f  .  ** If the roo
edf0: 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73  t page number is
ee00: 20 31 2c 20 74 68 61 74 20 6d 65 61 6e 73 20 74   1, that means t
ee10: 68 69 73 20 69 73 20 74 68 65 20 73 71 6c 69 74  his is the sqlit
ee20: 65 5f 6d 61 73 74 65 72 0a 20 20 2a 2a 20 74 61  e_master.  ** ta
ee30: 62 6c 65 20 69 74 73 65 6c 66 2e 20 20 53 6f 20  ble itself.  So 
ee40: 6d 61 72 6b 20 69 74 20 72 65 61 64 2d 6f 6e 6c  mark it read-onl
ee50: 79 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62  y..  */.  if( db
ee60: 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20  ->init.busy ){. 
ee70: 20 20 20 70 2d 3e 74 6e 75 6d 20 3d 20 64 62 2d     p->tnum = db-
ee80: 3e 69 6e 69 74 2e 6e 65 77 54 6e 75 6d 3b 0a 20  >init.newTnum;. 
ee90: 20 20 20 69 66 28 20 70 2d 3e 74 6e 75 6d 3d 3d     if( p->tnum==
eea0: 31 20 29 20 70 2d 3e 74 61 62 46 6c 61 67 73 20  1 ) p->tabFlags 
eeb0: 7c 3d 20 54 46 5f 52 65 61 64 6f 6e 6c 79 3b 0a  |= TF_Readonly;.
eec0: 20 20 7d 0a 0a 20 20 2f 2a 20 53 70 65 63 69 61    }..  /* Specia
eed0: 6c 20 70 72 6f 63 65 73 73 69 6e 67 20 66 6f 72  l processing for
eee0: 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 20 54   WITHOUT ROWID T
eef0: 61 62 6c 65 73 20 2a 2f 0a 20 20 69 66 28 20 74  ables */.  if( t
ef00: 61 62 4f 70 74 73 20 26 20 54 46 5f 57 69 74 68  abOpts & TF_With
ef10: 6f 75 74 52 6f 77 69 64 20 29 7b 0a 20 20 20 20  outRowid ){.    
ef20: 69 66 28 20 28 70 2d 3e 74 61 62 46 6c 61 67 73  if( (p->tabFlags
ef30: 20 26 20 54 46 5f 41 75 74 6f 69 6e 63 72 65 6d   & TF_Autoincrem
ef40: 65 6e 74 29 20 29 7b 0a 20 20 20 20 20 20 73 71  ent) ){.      sq
ef50: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
ef60: 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20 20 20  arse,.          
ef70: 22 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 20 6e  "AUTOINCREMENT n
ef80: 6f 74 20 61 6c 6c 6f 77 65 64 20 6f 6e 20 57 49  ot allowed on WI
ef90: 54 48 4f 55 54 20 52 4f 57 49 44 20 74 61 62 6c  THOUT ROWID tabl
efa0: 65 73 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75  es");.      retu
efb0: 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  rn;.    }.    if
efc0: 28 20 28 70 2d 3e 74 61 62 46 6c 61 67 73 20 26  ( (p->tabFlags &
efd0: 20 54 46 5f 48 61 73 50 72 69 6d 61 72 79 4b 65   TF_HasPrimaryKe
efe0: 79 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  y)==0 ){.      s
eff0: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
f000: 50 61 72 73 65 2c 20 22 50 52 49 4d 41 52 59 20  Parse, "PRIMARY 
f010: 4b 45 59 20 6d 69 73 73 69 6e 67 20 6f 6e 20 74  KEY missing on t
f020: 61 62 6c 65 20 25 73 22 2c 20 70 2d 3e 7a 4e 61  able %s", p->zNa
f030: 6d 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  me);.    }else{.
f040: 20 20 20 20 20 20 70 2d 3e 74 61 62 46 6c 61 67        p->tabFlag
f050: 73 20 7c 3d 20 54 46 5f 57 69 74 68 6f 75 74 52  s |= TF_WithoutR
f060: 6f 77 69 64 20 7c 20 54 46 5f 4e 6f 56 69 73 69  owid | TF_NoVisi
f070: 62 6c 65 52 6f 77 69 64 3b 0a 20 20 20 20 20 20  bleRowid;.      
f080: 63 6f 6e 76 65 72 74 54 6f 57 69 74 68 6f 75 74  convertToWithout
f090: 52 6f 77 69 64 54 61 62 6c 65 28 70 50 61 72 73  RowidTable(pPars
f0a0: 65 2c 20 70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  e, p);.    }.  }
f0b0: 0a 0a 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65  ..  iDb = sqlite
f0c0: 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64  3SchemaToIndex(d
f0d0: 62 2c 20 70 2d 3e 70 53 63 68 65 6d 61 29 3b 0a  b, p->pSchema);.
f0e0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
f0f0: 4f 4d 49 54 5f 43 48 45 43 4b 0a 20 20 2f 2a 20  OMIT_CHECK.  /* 
f100: 52 65 73 6f 6c 76 65 20 6e 61 6d 65 73 20 69 6e  Resolve names in
f110: 20 61 6c 6c 20 43 48 45 43 4b 20 63 6f 6e 73 74   all CHECK const
f120: 72 61 69 6e 74 20 65 78 70 72 65 73 73 69 6f 6e  raint expression
f130: 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d  s..  */.  if( p-
f140: 3e 70 43 68 65 63 6b 20 29 7b 0a 20 20 20 20 73  >pCheck ){.    s
f150: 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 53 65 6c  qlite3ResolveSel
f160: 66 52 65 66 65 72 65 6e 63 65 28 70 50 61 72 73  fReference(pPars
f170: 65 2c 20 70 2c 20 4e 43 5f 49 73 43 68 65 63 6b  e, p, NC_IsCheck
f180: 2c 20 30 2c 20 70 2d 3e 70 43 68 65 63 6b 29 3b  , 0, p->pCheck);
f190: 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21  .  }.#endif /* !
f1a0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
f1b0: 4d 49 54 5f 43 48 45 43 4b 29 20 2a 2f 0a 0a 20  MIT_CHECK) */.. 
f1c0: 20 2f 2a 20 45 73 74 69 6d 61 74 65 20 74 68 65   /* Estimate the
f1d0: 20 61 76 65 72 61 67 65 20 72 6f 77 20 73 69 7a   average row siz
f1e0: 65 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20  e for the table 
f1f0: 61 6e 64 20 66 6f 72 20 61 6c 6c 20 69 6d 70 6c  and for all impl
f200: 69 65 64 20 69 6e 64 69 63 65 73 20 2a 2f 0a 20  ied indices */. 
f210: 20 65 73 74 69 6d 61 74 65 54 61 62 6c 65 57 69   estimateTableWi
f220: 64 74 68 28 70 29 3b 0a 20 20 66 6f 72 28 70 49  dth(p);.  for(pI
f230: 64 78 3d 70 2d 3e 70 49 6e 64 65 78 3b 20 70 49  dx=p->pIndex; pI
f240: 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70  dx; pIdx=pIdx->p
f250: 4e 65 78 74 29 7b 0a 20 20 20 20 65 73 74 69 6d  Next){.    estim
f260: 61 74 65 49 6e 64 65 78 57 69 64 74 68 28 70 49  ateIndexWidth(pI
f270: 64 78 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  dx);.  }..  /* I
f280: 66 20 6e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 69  f not initializi
f290: 6e 67 2c 20 74 68 65 6e 20 63 72 65 61 74 65 20  ng, then create 
f2a0: 61 20 72 65 63 6f 72 64 20 66 6f 72 20 74 68 65  a record for the
f2b0: 20 6e 65 77 20 74 61 62 6c 65 0a 20 20 2a 2a 20   new table.  ** 
f2c0: 69 6e 20 74 68 65 20 53 51 4c 49 54 45 5f 4d 41  in the SQLITE_MA
f2d0: 53 54 45 52 20 74 61 62 6c 65 20 6f 66 20 74 68  STER table of th
f2e0: 65 20 64 61 74 61 62 61 73 65 2e 0a 20 20 2a 2a  e database..  **
f2f0: 0a 20 20 2a 2a 20 49 66 20 74 68 69 73 20 69 73  .  ** If this is
f300: 20 61 20 54 45 4d 50 4f 52 41 52 59 20 74 61 62   a TEMPORARY tab
f310: 6c 65 2c 20 77 72 69 74 65 20 74 68 65 20 65 6e  le, write the en
f320: 74 72 79 20 69 6e 74 6f 20 74 68 65 20 61 75 78  try into the aux
f330: 69 6c 69 61 72 79 0a 20 20 2a 2a 20 66 69 6c 65  iliary.  ** file
f340: 20 69 6e 73 74 65 61 64 20 6f 66 20 69 6e 74 6f   instead of into
f350: 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61   the main databa
f360: 73 65 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20  se file..  */.  
f370: 69 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75  if( !db->init.bu
f380: 73 79 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 3b  sy ){.    int n;
f390: 0a 20 20 20 20 56 64 62 65 20 2a 76 3b 0a 20 20  .    Vdbe *v;.  
f3a0: 20 20 63 68 61 72 20 2a 7a 54 79 70 65 3b 20 20    char *zType;  
f3b0: 20 20 2f 2a 20 22 76 69 65 77 22 20 6f 72 20 22    /* "view" or "
f3c0: 74 61 62 6c 65 22 20 2a 2f 0a 20 20 20 20 63 68  table" */.    ch
f3d0: 61 72 20 2a 7a 54 79 70 65 32 3b 20 20 20 2f 2a  ar *zType2;   /*
f3e0: 20 22 56 49 45 57 22 20 6f 72 20 22 54 41 42 4c   "VIEW" or "TABL
f3f0: 45 22 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a  E" */.    char *
f400: 7a 53 74 6d 74 3b 20 20 20 20 2f 2a 20 54 65 78  zStmt;    /* Tex
f410: 74 20 6f 66 20 74 68 65 20 43 52 45 41 54 45 20  t of the CREATE 
f420: 54 41 42 4c 45 20 6f 72 20 43 52 45 41 54 45 20  TABLE or CREATE 
f430: 56 49 45 57 20 73 74 61 74 65 6d 65 6e 74 20 2a  VIEW statement *
f440: 2f 0a 0a 20 20 20 20 76 20 3d 20 73 71 6c 69 74  /..    v = sqlit
f450: 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
f460: 29 3b 0a 20 20 20 20 69 66 28 20 4e 45 56 45 52  );.    if( NEVER
f470: 28 76 3d 3d 30 29 20 29 20 72 65 74 75 72 6e 3b  (v==0) ) return;
f480: 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ..    sqlite3Vdb
f490: 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 43 6c  eAddOp1(v, OP_Cl
f4a0: 6f 73 65 2c 20 30 29 3b 0a 0a 20 20 20 20 2f 2a  ose, 0);..    /*
f4b0: 20 0a 20 20 20 20 2a 2a 20 49 6e 69 74 69 61 6c   .    ** Initial
f4c0: 69 7a 65 20 7a 54 79 70 65 20 66 6f 72 20 74 68  ize zType for th
f4d0: 65 20 6e 65 77 20 76 69 65 77 20 6f 72 20 74 61  e new view or ta
f4e0: 62 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ble..    */.    
f4f0: 69 66 28 20 70 2d 3e 70 53 65 6c 65 63 74 3d 3d  if( p->pSelect==
f500: 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 20  0 ){.      /* A 
f510: 72 65 67 75 6c 61 72 20 74 61 62 6c 65 20 2a 2f  regular table */
f520: 0a 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22  .      zType = "
f530: 74 61 62 6c 65 22 3b 0a 20 20 20 20 20 20 7a 54  table";.      zT
f540: 79 70 65 32 20 3d 20 22 54 41 42 4c 45 22 3b 0a  ype2 = "TABLE";.
f550: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
f560: 4d 49 54 5f 56 49 45 57 0a 20 20 20 20 7d 65 6c  MIT_VIEW.    }el
f570: 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 41 20 76  se{.      /* A v
f580: 69 65 77 20 2a 2f 0a 20 20 20 20 20 20 7a 54 79  iew */.      zTy
f590: 70 65 20 3d 20 22 76 69 65 77 22 3b 0a 20 20 20  pe = "view";.   
f5a0: 20 20 20 7a 54 79 70 65 32 20 3d 20 22 56 49 45     zType2 = "VIE
f5b0: 57 22 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d  W";.#endif.    }
f5c0: 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73  ..    /* If this
f5d0: 20 69 73 20 61 20 43 52 45 41 54 45 20 54 41 42   is a CREATE TAB
f5e0: 4c 45 20 78 78 20 41 53 20 53 45 4c 45 43 54 20  LE xx AS SELECT 
f5f0: 2e 2e 2e 2c 20 65 78 65 63 75 74 65 20 74 68 65  ..., execute the
f600: 20 53 45 4c 45 43 54 0a 20 20 20 20 2a 2a 20 73   SELECT.    ** s
f610: 74 61 74 65 6d 65 6e 74 20 74 6f 20 70 6f 70 75  tatement to popu
f620: 6c 61 74 65 20 74 68 65 20 6e 65 77 20 74 61 62  late the new tab
f630: 6c 65 2e 20 54 68 65 20 72 6f 6f 74 2d 70 61 67  le. The root-pag
f640: 65 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65  e number for the
f650: 0a 20 20 20 20 2a 2a 20 6e 65 77 20 74 61 62 6c  .    ** new tabl
f660: 65 20 69 73 20 69 6e 20 72 65 67 69 73 74 65 72  e is in register
f670: 20 70 50 61 72 73 65 2d 3e 72 65 67 52 6f 6f 74   pParse->regRoot
f680: 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
f690: 4f 6e 63 65 20 74 68 65 20 53 45 4c 45 43 54 20  Once the SELECT 
f6a0: 68 61 73 20 62 65 65 6e 20 63 6f 64 65 64 20 62  has been coded b
f6b0: 79 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28  y sqlite3Select(
f6c0: 29 2c 20 69 74 20 69 73 20 69 6e 20 61 0a 20 20  ), it is in a.  
f6d0: 20 20 2a 2a 20 73 75 69 74 61 62 6c 65 20 73 74    ** suitable st
f6e0: 61 74 65 20 74 6f 20 71 75 65 72 79 20 66 6f 72  ate to query for
f6f0: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65   the column name
f700: 73 20 61 6e 64 20 74 79 70 65 73 20 74 6f 20 62  s and types to b
f710: 65 20 75 73 65 64 0a 20 20 20 20 2a 2a 20 62 79  e used.    ** by
f720: 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 2e 0a   the new table..
f730: 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 41 20      **.    ** A 
f740: 73 68 61 72 65 64 2d 63 61 63 68 65 20 77 72 69  shared-cache wri
f750: 74 65 2d 6c 6f 63 6b 20 69 73 20 6e 6f 74 20 72  te-lock is not r
f760: 65 71 75 69 72 65 64 20 74 6f 20 77 72 69 74 65  equired to write
f770: 20 74 6f 20 74 68 65 20 6e 65 77 20 74 61 62 6c   to the new tabl
f780: 65 2c 0a 20 20 20 20 2a 2a 20 61 73 20 61 20 73  e,.    ** as a s
f790: 63 68 65 6d 61 2d 6c 6f 63 6b 20 6d 75 73 74 20  chema-lock must 
f7a0: 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65  have already bee
f7b0: 6e 20 6f 62 74 61 69 6e 65 64 20 74 6f 20 63 72  n obtained to cr
f7c0: 65 61 74 65 20 69 74 2e 20 53 69 6e 63 65 0a 20  eate it. Since. 
f7d0: 20 20 20 2a 2a 20 61 20 73 63 68 65 6d 61 2d 6c     ** a schema-l
f7e0: 6f 63 6b 20 65 78 63 6c 75 64 65 73 20 61 6c 6c  ock excludes all
f7f0: 20 6f 74 68 65 72 20 64 61 74 61 62 61 73 65 20   other database 
f800: 75 73 65 72 73 2c 20 74 68 65 20 77 72 69 74 65  users, the write
f810: 2d 6c 6f 63 6b 20 77 6f 75 6c 64 0a 20 20 20 20  -lock would.    
f820: 2a 2a 20 62 65 20 72 65 64 75 6e 64 61 6e 74 2e  ** be redundant.
f830: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
f840: 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20  pSelect ){.     
f850: 20 53 65 6c 65 63 74 44 65 73 74 20 64 65 73 74   SelectDest dest
f860: 3b 20 20 20 20 2f 2a 20 57 68 65 72 65 20 74 68  ;    /* Where th
f870: 65 20 53 45 4c 45 43 54 20 73 68 6f 75 6c 64 20  e SELECT should 
f880: 73 74 6f 72 65 20 72 65 73 75 6c 74 73 20 2a 2f  store results */
f890: 0a 20 20 20 20 20 20 69 6e 74 20 72 65 67 59 69  .      int regYi
f8a0: 65 6c 64 3b 20 20 20 20 20 20 20 2f 2a 20 52 65  eld;       /* Re
f8b0: 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 63  gister holding c
f8c0: 6f 2d 72 6f 75 74 69 6e 65 20 65 6e 74 72 79 2d  o-routine entry-
f8d0: 70 6f 69 6e 74 20 2a 2f 0a 20 20 20 20 20 20 69  point */.      i
f8e0: 6e 74 20 61 64 64 72 54 6f 70 3b 20 20 20 20 20  nt addrTop;     
f8f0: 20 20 20 2f 2a 20 54 6f 70 20 6f 66 20 74 68 65     /* Top of the
f900: 20 63 6f 2d 72 6f 75 74 69 6e 65 20 2a 2f 0a 20   co-routine */. 
f910: 20 20 20 20 20 69 6e 74 20 72 65 67 52 65 63 3b       int regRec;
f920: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 72 65           /* A re
f930: 63 6f 72 64 20 74 6f 20 62 65 20 69 6e 73 65 72  cord to be inser
f940: 74 20 69 6e 74 6f 20 74 68 65 20 6e 65 77 20 74  t into the new t
f950: 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e  able */.      in
f960: 74 20 72 65 67 52 6f 77 69 64 3b 20 20 20 20 20  t regRowid;     
f970: 20 20 2f 2a 20 52 6f 77 69 64 20 6f 66 20 74 68    /* Rowid of th
f980: 65 20 6e 65 78 74 20 72 6f 77 20 74 6f 20 69 6e  e next row to in
f990: 73 65 72 74 20 2a 2f 0a 20 20 20 20 20 20 69 6e  sert */.      in
f9a0: 74 20 61 64 64 72 49 6e 73 4c 6f 6f 70 3b 20 20  t addrInsLoop;  
f9b0: 20 20 2f 2a 20 54 6f 70 20 6f 66 20 74 68 65 20    /* Top of the 
f9c0: 6c 6f 6f 70 20 66 6f 72 20 69 6e 73 65 72 74 69  loop for inserti
f9d0: 6e 67 20 72 6f 77 73 20 2a 2f 0a 20 20 20 20 20  ng rows */.     
f9e0: 20 54 61 62 6c 65 20 2a 70 53 65 6c 54 61 62 3b   Table *pSelTab;
f9f0: 20 20 20 20 20 2f 2a 20 41 20 74 61 62 6c 65 20       /* A table 
fa00: 74 68 61 74 20 64 65 73 63 72 69 62 65 73 20 74  that describes t
fa10: 68 65 20 53 45 4c 45 43 54 20 72 65 73 75 6c 74  he SELECT result
fa20: 73 20 2a 2f 0a 0a 20 20 20 20 20 20 72 65 67 59  s */..      regY
fa30: 69 65 6c 64 20 3d 20 2b 2b 70 50 61 72 73 65 2d  ield = ++pParse-
fa40: 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 72 65 67  >nMem;.      reg
fa50: 52 65 63 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  Rec = ++pParse->
fa60: 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 72 65 67 52  nMem;.      regR
fa70: 6f 77 69 64 20 3d 20 2b 2b 70 50 61 72 73 65 2d  owid = ++pParse-
fa80: 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 61 73 73  >nMem;.      ass
fa90: 65 72 74 28 70 50 61 72 73 65 2d 3e 6e 54 61 62  ert(pParse->nTab
faa0: 3d 3d 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ==1);.      sqli
fab0: 74 65 33 4d 61 79 41 62 6f 72 74 28 70 50 61 72  te3MayAbort(pPar
fac0: 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  se);.      sqlit
fad0: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
fae0: 4f 50 5f 4f 70 65 6e 57 72 69 74 65 2c 20 31 2c  OP_OpenWrite, 1,
faf0: 20 70 50 61 72 73 65 2d 3e 72 65 67 52 6f 6f 74   pParse->regRoot
fb00: 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20 73 71  , iDb);.      sq
fb10: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
fb20: 35 28 76 2c 20 4f 50 46 4c 41 47 5f 50 32 49 53  5(v, OPFLAG_P2IS
fb30: 52 45 47 29 3b 0a 20 20 20 20 20 20 70 50 61 72  REG);.      pPar
fb40: 73 65 2d 3e 6e 54 61 62 20 3d 20 32 3b 0a 20 20  se->nTab = 2;.  
fb50: 20 20 20 20 61 64 64 72 54 6f 70 20 3d 20 73 71      addrTop = sq
fb60: 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
fb70: 41 64 64 72 28 76 29 20 2b 20 31 3b 0a 20 20 20  Addr(v) + 1;.   
fb80: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
fb90: 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 69 74 43  dOp3(v, OP_InitC
fba0: 6f 72 6f 75 74 69 6e 65 2c 20 72 65 67 59 69 65  oroutine, regYie
fbb0: 6c 64 2c 20 30 2c 20 61 64 64 72 54 6f 70 29 3b  ld, 0, addrTop);
fbc0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65  .      sqlite3Se
fbd0: 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26 64 65  lectDestInit(&de
fbe0: 73 74 2c 20 53 52 54 5f 43 6f 72 6f 75 74 69 6e  st, SRT_Coroutin
fbf0: 65 2c 20 72 65 67 59 69 65 6c 64 29 3b 0a 20 20  e, regYield);.  
fc00: 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63      sqlite3Selec
fc10: 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c 65 63  t(pParse, pSelec
fc20: 74 2c 20 26 64 65 73 74 29 3b 0a 20 20 20 20 20  t, &dest);.     
fc30: 20 73 71 6c 69 74 65 33 56 64 62 65 45 6e 64 43   sqlite3VdbeEndC
fc40: 6f 72 6f 75 74 69 6e 65 28 76 2c 20 72 65 67 59  oroutine(v, regY
fc50: 69 65 6c 64 29 3b 0a 20 20 20 20 20 20 73 71 6c  ield);.      sql
fc60: 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
fc70: 28 76 2c 20 61 64 64 72 54 6f 70 20 2d 20 31 29  (v, addrTop - 1)
fc80: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 72  ;.      if( pPar
fc90: 73 65 2d 3e 6e 45 72 72 20 29 20 72 65 74 75 72  se->nErr ) retur
fca0: 6e 3b 0a 20 20 20 20 20 20 70 53 65 6c 54 61 62  n;.      pSelTab
fcb0: 20 3d 20 73 71 6c 69 74 65 33 52 65 73 75 6c 74   = sqlite3Result
fcc0: 53 65 74 4f 66 53 65 6c 65 63 74 28 70 50 61 72  SetOfSelect(pPar
fcd0: 73 65 2c 20 70 53 65 6c 65 63 74 29 3b 0a 20 20  se, pSelect);.  
fce0: 20 20 20 20 69 66 28 20 70 53 65 6c 54 61 62 3d      if( pSelTab=
fcf0: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20  =0 ) return;.   
fd00: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 43     assert( p->aC
fd10: 6f 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70  ol==0 );.      p
fd20: 2d 3e 6e 43 6f 6c 20 3d 20 70 53 65 6c 54 61 62  ->nCol = pSelTab
fd30: 2d 3e 6e 43 6f 6c 3b 0a 20 20 20 20 20 20 70 2d  ->nCol;.      p-
fd40: 3e 61 43 6f 6c 20 3d 20 70 53 65 6c 54 61 62 2d  >aCol = pSelTab-
fd50: 3e 61 43 6f 6c 3b 0a 20 20 20 20 20 20 70 53 65  >aCol;.      pSe
fd60: 6c 54 61 62 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a  lTab->nCol = 0;.
fd70: 20 20 20 20 20 20 70 53 65 6c 54 61 62 2d 3e 61        pSelTab->a
fd80: 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 73  Col = 0;.      s
fd90: 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62 6c  qlite3DeleteTabl
fda0: 65 28 64 62 2c 20 70 53 65 6c 54 61 62 29 3b 0a  e(db, pSelTab);.
fdb0: 20 20 20 20 20 20 61 64 64 72 49 6e 73 4c 6f 6f        addrInsLoo
fdc0: 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  p = sqlite3VdbeA
fdd0: 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c  ddOp1(v, OP_Yiel
fde0: 64 2c 20 64 65 73 74 2e 69 53 44 50 61 72 6d 29  d, dest.iSDParm)
fdf0: 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65  ;.      VdbeCove
fe00: 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 73  rage(v);.      s
fe10: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
fe20: 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72  (v, OP_MakeRecor
fe30: 64 2c 20 64 65 73 74 2e 69 53 64 73 74 2c 20 64  d, dest.iSdst, d
fe40: 65 73 74 2e 6e 53 64 73 74 2c 20 72 65 67 52 65  est.nSdst, regRe
fe50: 63 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  c);.      sqlite
fe60: 33 54 61 62 6c 65 41 66 66 69 6e 69 74 79 28 76  3TableAffinity(v
fe70: 2c 20 70 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  , p, 0);.      s
fe80: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
fe90: 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77 69 64 2c  (v, OP_NewRowid,
fea0: 20 31 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a 20   1, regRowid);. 
feb0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
fec0: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 73  AddOp3(v, OP_Ins
fed0: 65 72 74 2c 20 31 2c 20 72 65 67 52 65 63 2c 20  ert, 1, regRec, 
fee0: 72 65 67 52 6f 77 69 64 29 3b 0a 20 20 20 20 20  regRowid);.     
fef0: 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f   sqlite3VdbeGoto
ff00: 28 76 2c 20 61 64 64 72 49 6e 73 4c 6f 6f 70 29  (v, addrInsLoop)
ff10: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
ff20: 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61  dbeJumpHere(v, a
ff30: 64 64 72 49 6e 73 4c 6f 6f 70 29 3b 0a 20 20 20  ddrInsLoop);.   
ff40: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
ff50: 64 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65  dOp1(v, OP_Close
ff60: 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  , 1);.    }..   
ff70: 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20   /* Compute the 
ff80: 63 6f 6d 70 6c 65 74 65 20 74 65 78 74 20 6f 66  complete text of
ff90: 20 74 68 65 20 43 52 45 41 54 45 20 73 74 61 74   the CREATE stat
ffa0: 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 69 66 28  ement */.    if(
ffb0: 20 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20   pSelect ){.    
ffc0: 20 20 7a 53 74 6d 74 20 3d 20 63 72 65 61 74 65    zStmt = create
ffd0: 54 61 62 6c 65 53 74 6d 74 28 64 62 2c 20 70 29  TableStmt(db, p)
ffe0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
fff0: 20 20 20 54 6f 6b 65 6e 20 2a 70 45 6e 64 32 20     Token *pEnd2 
10000 3d 20 74 61 62 4f 70 74 73 20 3f 20 26 70 50 61  = tabOpts ? &pPa
10010 72 73 65 2d 3e 73 4c 61 73 74 54 6f 6b 65 6e 20  rse->sLastToken 
10020 3a 20 70 45 6e 64 3b 0a 20 20 20 20 20 20 6e 20  : pEnd;.      n 
10030 3d 20 28 69 6e 74 29 28 70 45 6e 64 32 2d 3e 7a  = (int)(pEnd2->z
10040 20 2d 20 70 50 61 72 73 65 2d 3e 73 4e 61 6d 65   - pParse->sName
10050 54 6f 6b 65 6e 2e 7a 29 3b 0a 20 20 20 20 20 20  Token.z);.      
10060 69 66 28 20 70 45 6e 64 32 2d 3e 7a 5b 30 5d 21  if( pEnd2->z[0]!
10070 3d 27 3b 27 20 29 20 6e 20 2b 3d 20 70 45 6e 64  =';' ) n += pEnd
10080 32 2d 3e 6e 3b 0a 20 20 20 20 20 20 7a 53 74 6d  2->n;.      zStm
10090 74 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e  t = sqlite3MPrin
100a0 74 66 28 64 62 2c 20 0a 20 20 20 20 20 20 20 20  tf(db, .        
100b0 20 20 22 43 52 45 41 54 45 20 25 73 20 25 2e 2a    "CREATE %s %.*
100c0 73 22 2c 20 7a 54 79 70 65 32 2c 20 6e 2c 20 70  s", zType2, n, p
100d0 50 61 72 73 65 2d 3e 73 4e 61 6d 65 54 6f 6b 65  Parse->sNameToke
100e0 6e 2e 7a 0a 20 20 20 20 20 20 29 3b 0a 20 20 20  n.z.      );.   
100f0 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 20 73 6c 6f   }..    /* A slo
10100 74 20 66 6f 72 20 74 68 65 20 72 65 63 6f 72 64  t for the record
10110 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
10120 6e 20 61 6c 6c 6f 63 61 74 65 64 20 69 6e 20 74  n allocated in t
10130 68 65 20 0a 20 20 20 20 2a 2a 20 53 51 4c 49 54  he .    ** SQLIT
10140 45 5f 4d 41 53 54 45 52 20 74 61 62 6c 65 2e 20  E_MASTER table. 
10150 20 57 65 20 6a 75 73 74 20 6e 65 65 64 20 74 6f   We just need to
10160 20 75 70 64 61 74 65 20 74 68 61 74 20 73 6c 6f   update that slo
10170 74 20 77 69 74 68 20 61 6c 6c 0a 20 20 20 20 2a  t with all.    *
10180 2a 20 74 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f  * the informatio
10190 6e 20 77 65 27 76 65 20 63 6f 6c 6c 65 63 74 65  n we've collecte
101a0 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71  d..    */.    sq
101b0 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72 73 65  lite3NestedParse
101c0 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 22  (pParse,.      "
101d0 55 50 44 41 54 45 20 25 51 2e 25 73 20 22 0a 20  UPDATE %Q.%s ". 
101e0 20 20 20 20 20 20 20 20 22 53 45 54 20 74 79 70          "SET typ
101f0 65 3d 27 25 73 27 2c 20 6e 61 6d 65 3d 25 51 2c  e='%s', name=%Q,
10200 20 74 62 6c 5f 6e 61 6d 65 3d 25 51 2c 20 72 6f   tbl_name=%Q, ro
10210 6f 74 70 61 67 65 3d 23 25 64 2c 20 73 71 6c 3d  otpage=#%d, sql=
10220 25 51 20 22 0a 20 20 20 20 20 20 20 22 57 48 45  %Q ".       "WHE
10230 52 45 20 72 6f 77 69 64 3d 23 25 64 22 2c 0a 20  RE rowid=#%d",. 
10240 20 20 20 20 20 64 62 2d 3e 61 44 62 5b 69 44 62       db->aDb[iDb
10250 5d 2e 7a 44 62 53 4e 61 6d 65 2c 20 53 43 48 45  ].zDbSName, SCHE
10260 4d 41 5f 54 41 42 4c 45 28 69 44 62 29 2c 0a 20  MA_TABLE(iDb),. 
10270 20 20 20 20 20 7a 54 79 70 65 2c 0a 20 20 20 20       zType,.    
10280 20 20 70 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20    p->zName,.    
10290 20 20 70 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20    p->zName,.    
102a0 20 20 70 50 61 72 73 65 2d 3e 72 65 67 52 6f 6f    pParse->regRoo
102b0 74 2c 0a 20 20 20 20 20 20 7a 53 74 6d 74 2c 0a  t,.      zStmt,.
102c0 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 72 65        pParse->re
102d0 67 52 6f 77 69 64 0a 20 20 20 20 29 3b 0a 20 20  gRowid.    );.  
102e0 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
102f0 64 62 2c 20 7a 53 74 6d 74 29 3b 0a 20 20 20 20  db, zStmt);.    
10300 73 71 6c 69 74 65 33 43 68 61 6e 67 65 43 6f 6f  sqlite3ChangeCoo
10310 6b 69 65 28 70 50 61 72 73 65 2c 20 69 44 62 29  kie(pParse, iDb)
10320 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ;..#ifndef SQLIT
10330 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 43 52 45  E_OMIT_AUTOINCRE
10340 4d 45 4e 54 0a 20 20 20 20 2f 2a 20 43 68 65 63  MENT.    /* Chec
10350 6b 20 74 6f 20 73 65 65 20 69 66 20 77 65 20 6e  k to see if we n
10360 65 65 64 20 74 6f 20 63 72 65 61 74 65 20 61 6e  eed to create an
10370 20 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65   sqlite_sequence
10380 20 74 61 62 6c 65 20 66 6f 72 0a 20 20 20 20 2a   table for.    *
10390 2a 20 6b 65 65 70 69 6e 67 20 74 72 61 63 6b 20  * keeping track 
103a0 6f 66 20 61 75 74 6f 69 6e 63 72 65 6d 65 6e 74  of autoincrement
103b0 20 6b 65 79 73 2e 0a 20 20 20 20 2a 2f 0a 20 20   keys..    */.  
103c0 20 20 69 66 28 20 28 70 2d 3e 74 61 62 46 6c 61    if( (p->tabFla
103d0 67 73 20 26 20 54 46 5f 41 75 74 6f 69 6e 63 72  gs & TF_Autoincr
103e0 65 6d 65 6e 74 29 21 3d 30 20 29 7b 0a 20 20 20  ement)!=0 ){.   
103f0 20 20 20 44 62 20 2a 70 44 62 20 3d 20 26 64 62     Db *pDb = &db
10400 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a 20 20 20 20  ->aDb[iDb];.    
10410 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
10420 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64  3SchemaMutexHeld
10430 28 64 62 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a  (db, iDb, 0) );.
10440 20 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e 70        if( pDb->p
10450 53 63 68 65 6d 61 2d 3e 70 53 65 71 54 61 62 3d  Schema->pSeqTab=
10460 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  =0 ){.        sq
10470 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72 73 65  lite3NestedParse
10480 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20  (pParse,.       
10490 20 20 20 22 43 52 45 41 54 45 20 54 41 42 4c 45     "CREATE TABLE
104a0 20 25 51 2e 73 71 6c 69 74 65 5f 73 65 71 75 65   %Q.sqlite_seque
104b0 6e 63 65 28 6e 61 6d 65 2c 73 65 71 29 22 2c 0a  nce(name,seq)",.
104c0 20 20 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a            pDb->z
104d0 44 62 53 4e 61 6d 65 0a 20 20 20 20 20 20 20 20  DbSName.        
104e0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
104f0 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20  .#endif..    /* 
10500 52 65 70 61 72 73 65 20 65 76 65 72 79 74 68 69  Reparse everythi
10510 6e 67 20 74 6f 20 75 70 64 61 74 65 20 6f 75 72  ng to update our
10520 20 69 6e 74 65 72 6e 61 6c 20 64 61 74 61 20 73   internal data s
10530 74 72 75 63 74 75 72 65 73 20 2a 2f 0a 20 20 20  tructures */.   
10540 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 50   sqlite3VdbeAddP
10550 61 72 73 65 53 63 68 65 6d 61 4f 70 28 76 2c 20  arseSchemaOp(v, 
10560 69 44 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20  iDb,.           
10570 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64  sqlite3MPrintf(d
10580 62 2c 20 22 74 62 6c 5f 6e 61 6d 65 3d 27 25 71  b, "tbl_name='%q
10590 27 20 41 4e 44 20 74 79 70 65 21 3d 27 74 72 69  ' AND type!='tri
105a0 67 67 65 72 27 22 2c 20 70 2d 3e 7a 4e 61 6d 65  gger'", p->zName
105b0 29 29 3b 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20 41  ));.  }...  /* A
105c0 64 64 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20  dd the table to 
105d0 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 72 65  the in-memory re
105e0 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20  presentation of 
105f0 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 20 20  the database..  
10600 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 69 6e 69  */.  if( db->ini
10610 74 2e 62 75 73 79 20 29 7b 0a 20 20 20 20 54 61  t.busy ){.    Ta
10620 62 6c 65 20 2a 70 4f 6c 64 3b 0a 20 20 20 20 53  ble *pOld;.    S
10630 63 68 65 6d 61 20 2a 70 53 63 68 65 6d 61 20 3d  chema *pSchema =
10640 20 70 2d 3e 70 53 63 68 65 6d 61 3b 0a 20 20 20   p->pSchema;.   
10650 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
10660 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28  SchemaMutexHeld(
10670 64 62 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a 20  db, iDb, 0) );. 
10680 20 20 20 70 4f 6c 64 20 3d 20 73 71 6c 69 74 65     pOld = sqlite
10690 33 48 61 73 68 49 6e 73 65 72 74 28 26 70 53 63  3HashInsert(&pSc
106a0 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68 2c 20 70  hema->tblHash, p
106b0 2d 3e 7a 4e 61 6d 65 2c 20 70 29 3b 0a 20 20 20  ->zName, p);.   
106c0 20 69 66 28 20 70 4f 6c 64 20 29 7b 0a 20 20 20   if( pOld ){.   
106d0 20 20 20 61 73 73 65 72 74 28 20 70 3d 3d 70 4f     assert( p==pO
106e0 6c 64 20 29 3b 20 20 2f 2a 20 4d 61 6c 6c 6f 63  ld );  /* Malloc
106f0 20 6d 75 73 74 20 68 61 76 65 20 66 61 69 6c 65   must have faile
10700 64 20 69 6e 73 69 64 65 20 48 61 73 68 49 6e 73  d inside HashIns
10710 65 72 74 28 29 20 2a 2f 0a 20 20 20 20 20 20 73  ert() */.      s
10720 71 6c 69 74 65 33 4f 6f 6d 46 61 75 6c 74 28 64  qlite3OomFault(d
10730 62 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  b);.      return
10740 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 72  ;.    }.    pPar
10750 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 3d 20  se->pNewTable = 
10760 30 3b 0a 20 20 20 20 64 62 2d 3e 66 6c 61 67 73  0;.    db->flags
10770 20 7c 3d 20 53 51 4c 49 54 45 5f 49 6e 74 65 72   |= SQLITE_Inter
10780 6e 43 68 61 6e 67 65 73 3b 0a 0a 23 69 66 6e 64  nChanges;..#ifnd
10790 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
107a0 4c 54 45 52 54 41 42 4c 45 0a 20 20 20 20 69 66  LTERTABLE.    if
107b0 28 20 21 70 2d 3e 70 53 65 6c 65 63 74 20 29 7b  ( !p->pSelect ){
107c0 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61  .      const cha
107d0 72 20 2a 7a 4e 61 6d 65 20 3d 20 28 63 6f 6e 73  r *zName = (cons
107e0 74 20 63 68 61 72 20 2a 29 70 50 61 72 73 65 2d  t char *)pParse-
107f0 3e 73 4e 61 6d 65 54 6f 6b 65 6e 2e 7a 3b 0a 20  >sNameToken.z;. 
10800 20 20 20 20 20 69 6e 74 20 6e 4e 61 6d 65 3b 0a       int nName;.
10810 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70        assert( !p
10820 53 65 6c 65 63 74 20 26 26 20 70 43 6f 6e 73 20  Select && pCons 
10830 26 26 20 70 45 6e 64 20 29 3b 0a 20 20 20 20 20  && pEnd );.     
10840 20 69 66 28 20 70 43 6f 6e 73 2d 3e 7a 3d 3d 30   if( pCons->z==0
10850 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 6f 6e   ){.        pCon
10860 73 20 3d 20 70 45 6e 64 3b 0a 20 20 20 20 20 20  s = pEnd;.      
10870 7d 0a 20 20 20 20 20 20 6e 4e 61 6d 65 20 3d 20  }.      nName = 
10880 28 69 6e 74 29 28 28 63 6f 6e 73 74 20 63 68 61  (int)((const cha
10890 72 20 2a 29 70 43 6f 6e 73 2d 3e 7a 20 2d 20 7a  r *)pCons->z - z
108a0 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 70 2d 3e  Name);.      p->
108b0 61 64 64 43 6f 6c 4f 66 66 73 65 74 20 3d 20 31  addColOffset = 1
108c0 33 20 2b 20 73 71 6c 69 74 65 33 55 74 66 38 43  3 + sqlite3Utf8C
108d0 68 61 72 4c 65 6e 28 7a 4e 61 6d 65 2c 20 6e 4e  harLen(zName, nN
108e0 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  ame);.    }.#end
108f0 69 66 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65  if.  }.}..#ifnde
10900 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
10910 45 57 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 61 72  EW./*.** The par
10920 73 65 72 20 63 61 6c 6c 73 20 74 68 69 73 20 72  ser calls this r
10930 6f 75 74 69 6e 65 20 69 6e 20 6f 72 64 65 72 20  outine in order 
10940 74 6f 20 63 72 65 61 74 65 20 61 20 6e 65 77 20  to create a new 
10950 56 49 45 57 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  VIEW.*/.void sql
10960 69 74 65 33 43 72 65 61 74 65 56 69 65 77 28 0a  ite3CreateView(.
10970 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
10980 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73       /* The pars
10990 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
109a0 20 54 6f 6b 65 6e 20 2a 70 42 65 67 69 6e 2c 20   Token *pBegin, 
109b0 20 20 20 20 2f 2a 20 54 68 65 20 43 52 45 41 54      /* The CREAT
109c0 45 20 74 6f 6b 65 6e 20 74 68 61 74 20 62 65 67  E token that beg
109d0 69 6e 73 20 74 68 65 20 73 74 61 74 65 6d 65 6e  ins the statemen
109e0 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e  t */.  Token *pN
109f0 61 6d 65 31 2c 20 20 20 20 20 2f 2a 20 54 68 65  ame1,     /* The
10a00 20 74 6f 6b 65 6e 20 74 68 61 74 20 68 6f 6c 64   token that hold
10a10 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  s the name of th
10a20 65 20 76 69 65 77 20 2a 2f 0a 20 20 54 6f 6b 65  e view */.  Toke
10a30 6e 20 2a 70 4e 61 6d 65 32 2c 20 20 20 20 20 2f  n *pName2,     /
10a40 2a 20 54 68 65 20 74 6f 6b 65 6e 20 74 68 61 74  * The token that
10a50 20 68 6f 6c 64 73 20 74 68 65 20 6e 61 6d 65 20   holds the name 
10a60 6f 66 20 74 68 65 20 76 69 65 77 20 2a 2f 0a 20  of the view */. 
10a70 20 45 78 70 72 4c 69 73 74 20 2a 70 43 4e 61 6d   ExprList *pCNam
10a80 65 73 2c 20 2f 2a 20 4f 70 74 69 6f 6e 61 6c 20  es, /* Optional 
10a90 6c 69 73 74 20 6f 66 20 76 69 65 77 20 63 6f 6c  list of view col
10aa0 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a 20 20 53  umn names */.  S
10ab0 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 2c 20  elect *pSelect, 
10ac0 20 20 2f 2a 20 41 20 53 45 4c 45 43 54 20 73 74    /* A SELECT st
10ad0 61 74 65 6d 65 6e 74 20 74 68 61 74 20 77 69 6c  atement that wil
10ae0 6c 20 62 65 63 6f 6d 65 20 74 68 65 20 6e 65 77  l become the new
10af0 20 76 69 65 77 20 2a 2f 0a 20 20 69 6e 74 20 69   view */.  int i
10b00 73 54 65 6d 70 2c 20 20 20 20 20 20 20 20 2f 2a  sTemp,        /*
10b10 20 54 52 55 45 20 66 6f 72 20 61 20 54 45 4d 50   TRUE for a TEMP
10b20 4f 52 41 52 59 20 76 69 65 77 20 2a 2f 0a 20 20  ORARY view */.  
10b30 69 6e 74 20 6e 6f 45 72 72 20 20 20 20 20 20 20  int noErr       
10b40 20 20 20 2f 2a 20 53 75 70 70 72 65 73 73 20 65     /* Suppress e
10b50 72 72 6f 72 20 6d 65 73 73 61 67 65 73 20 69 66  rror messages if
10b60 20 56 49 45 57 20 61 6c 72 65 61 64 79 20 65 78   VIEW already ex
10b70 69 73 74 73 20 2a 2f 0a 29 7b 0a 20 20 54 61 62  ists */.){.  Tab
10b80 6c 65 20 2a 70 3b 0a 20 20 69 6e 74 20 6e 3b 0a  le *p;.  int n;.
10b90 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b    const char *z;
10ba0 0a 20 20 54 6f 6b 65 6e 20 73 45 6e 64 3b 0a 20  .  Token sEnd;. 
10bb0 20 44 62 46 69 78 65 72 20 73 46 69 78 3b 0a 20   DbFixer sFix;. 
10bc0 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 20 3d 20   Token *pName = 
10bd0 30 3b 0a 20 20 69 6e 74 20 69 44 62 3b 0a 20 20  0;.  int iDb;.  
10be0 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
10bf0 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 69 66 28  arse->db;..  if(
10c00 20 70 50 61 72 73 65 2d 3e 6e 56 61 72 3e 30 20   pParse->nVar>0 
10c10 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
10c20 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
10c30 70 61 72 61 6d 65 74 65 72 73 20 61 72 65 20 6e  parameters are n
10c40 6f 74 20 61 6c 6c 6f 77 65 64 20 69 6e 20 76 69  ot allowed in vi
10c50 65 77 73 22 29 3b 0a 20 20 20 20 67 6f 74 6f 20  ews");.    goto 
10c60 63 72 65 61 74 65 5f 76 69 65 77 5f 66 61 69 6c  create_view_fail
10c70 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 53  ;.  }.  sqlite3S
10c80 74 61 72 74 54 61 62 6c 65 28 70 50 61 72 73 65  tartTable(pParse
10c90 2c 20 70 4e 61 6d 65 31 2c 20 70 4e 61 6d 65 32  , pName1, pName2
10ca0 2c 20 69 73 54 65 6d 70 2c 20 31 2c 20 30 2c 20  , isTemp, 1, 0, 
10cb0 6e 6f 45 72 72 29 3b 0a 20 20 70 20 3d 20 70 50  noErr);.  p = pP
10cc0 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b  arse->pNewTable;
10cd0 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20 70  .  if( p==0 || p
10ce0 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 20 67 6f  Parse->nErr ) go
10cf0 74 6f 20 63 72 65 61 74 65 5f 76 69 65 77 5f 66  to create_view_f
10d00 61 69 6c 3b 0a 20 20 73 71 6c 69 74 65 33 54 77  ail;.  sqlite3Tw
10d10 6f 50 61 72 74 4e 61 6d 65 28 70 50 61 72 73 65  oPartName(pParse
10d20 2c 20 70 4e 61 6d 65 31 2c 20 70 4e 61 6d 65 32  , pName1, pName2
10d30 2c 20 26 70 4e 61 6d 65 29 3b 0a 20 20 69 44 62  , &pName);.  iDb
10d40 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61   = sqlite3Schema
10d50 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 2d 3e 70  ToIndex(db, p->p
10d60 53 63 68 65 6d 61 29 3b 0a 20 20 73 71 6c 69 74  Schema);.  sqlit
10d70 65 33 46 69 78 49 6e 69 74 28 26 73 46 69 78 2c  e3FixInit(&sFix,
10d80 20 70 50 61 72 73 65 2c 20 69 44 62 2c 20 22 76   pParse, iDb, "v
10d90 69 65 77 22 2c 20 70 4e 61 6d 65 29 3b 0a 20 20  iew", pName);.  
10da0 69 66 28 20 73 71 6c 69 74 65 33 46 69 78 53 65  if( sqlite3FixSe
10db0 6c 65 63 74 28 26 73 46 69 78 2c 20 70 53 65 6c  lect(&sFix, pSel
10dc0 65 63 74 29 20 29 20 67 6f 74 6f 20 63 72 65 61  ect) ) goto crea
10dd0 74 65 5f 76 69 65 77 5f 66 61 69 6c 3b 0a 0a 20  te_view_fail;.. 
10de0 20 2f 2a 20 4d 61 6b 65 20 61 20 63 6f 70 79 20   /* Make a copy 
10df0 6f 66 20 74 68 65 20 65 6e 74 69 72 65 20 53 45  of the entire SE
10e00 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 74  LECT statement t
10e10 68 61 74 20 64 65 66 69 6e 65 73 20 74 68 65 20  hat defines the 
10e20 76 69 65 77 2e 0a 20 20 2a 2a 20 54 68 69 73 20  view..  ** This 
10e30 77 69 6c 6c 20 66 6f 72 63 65 20 61 6c 6c 20 74  will force all t
10e40 68 65 20 45 78 70 72 2e 74 6f 6b 65 6e 2e 7a 20  he Expr.token.z 
10e50 76 61 6c 75 65 73 20 74 6f 20 62 65 20 64 79 6e  values to be dyn
10e60 61 6d 69 63 61 6c 6c 79 0a 20 20 2a 2a 20 61 6c  amically.  ** al
10e70 6c 6f 63 61 74 65 64 20 72 61 74 68 65 72 20 74  located rather t
10e80 68 61 6e 20 70 6f 69 6e 74 20 74 6f 20 74 68 65  han point to the
10e90 20 69 6e 70 75 74 20 73 74 72 69 6e 67 20 2d 20   input string - 
10ea0 77 68 69 63 68 20 6d 65 61 6e 73 20 74 68 61 74  which means that
10eb0 0a 20 20 2a 2a 20 74 68 65 79 20 77 69 6c 6c 20  .  ** they will 
10ec0 70 65 72 73 69 73 74 20 61 66 74 65 72 20 74 68  persist after th
10ed0 65 20 63 75 72 72 65 6e 74 20 73 71 6c 69 74 65  e current sqlite
10ee0 33 5f 65 78 65 63 28 29 20 63 61 6c 6c 20 72 65  3_exec() call re
10ef0 74 75 72 6e 73 2e 0a 20 20 2a 2f 0a 20 20 70 2d  turns..  */.  p-
10f00 3e 70 53 65 6c 65 63 74 20 3d 20 73 71 6c 69 74  >pSelect = sqlit
10f10 65 33 53 65 6c 65 63 74 44 75 70 28 64 62 2c 20  e3SelectDup(db, 
10f20 70 53 65 6c 65 63 74 2c 20 45 58 50 52 44 55 50  pSelect, EXPRDUP
10f30 5f 52 45 44 55 43 45 29 3b 0a 20 20 70 2d 3e 70  _REDUCE);.  p->p
10f40 43 68 65 63 6b 20 3d 20 73 71 6c 69 74 65 33 45  Check = sqlite3E
10f50 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70  xprListDup(db, p
10f60 43 4e 61 6d 65 73 2c 20 45 58 50 52 44 55 50 5f  CNames, EXPRDUP_
10f70 52 45 44 55 43 45 29 3b 0a 20 20 69 66 28 20 64  REDUCE);.  if( d
10f80 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
10f90 29 20 67 6f 74 6f 20 63 72 65 61 74 65 5f 76 69  ) goto create_vi
10fa0 65 77 5f 66 61 69 6c 3b 0a 0a 20 20 2f 2a 20 4c  ew_fail;..  /* L
10fb0 6f 63 61 74 65 20 74 68 65 20 65 6e 64 20 6f 66  ocate the end of
10fc0 20 74 68 65 20 43 52 45 41 54 45 20 56 49 45 57   the CREATE VIEW
10fd0 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 4d 61 6b   statement.  Mak
10fe0 65 20 73 45 6e 64 20 70 6f 69 6e 74 20 74 6f 0a  e sEnd point to.
10ff0 20 20 2a 2a 20 74 68 65 20 65 6e 64 2e 0a 20 20    ** the end..  
11000 2a 2f 0a 20 20 73 45 6e 64 20 3d 20 70 50 61 72  */.  sEnd = pPar
11010 73 65 2d 3e 73 4c 61 73 74 54 6f 6b 65 6e 3b 0a  se->sLastToken;.
11020 20 20 61 73 73 65 72 74 28 20 73 45 6e 64 2e 7a    assert( sEnd.z
11030 5b 30 5d 21 3d 30 20 29 3b 0a 20 20 69 66 28 20  [0]!=0 );.  if( 
11040 73 45 6e 64 2e 7a 5b 30 5d 21 3d 27 3b 27 20 29  sEnd.z[0]!=';' )
11050 7b 0a 20 20 20 20 73 45 6e 64 2e 7a 20 2b 3d 20  {.    sEnd.z += 
11060 73 45 6e 64 2e 6e 3b 0a 20 20 7d 0a 20 20 73 45  sEnd.n;.  }.  sE
11070 6e 64 2e 6e 20 3d 20 30 3b 0a 20 20 6e 20 3d 20  nd.n = 0;.  n = 
11080 28 69 6e 74 29 28 73 45 6e 64 2e 7a 20 2d 20 70  (int)(sEnd.z - p
11090 42 65 67 69 6e 2d 3e 7a 29 3b 0a 20 20 61 73 73  Begin->z);.  ass
110a0 65 72 74 28 20 6e 3e 30 20 29 3b 0a 20 20 7a 20  ert( n>0 );.  z 
110b0 3d 20 70 42 65 67 69 6e 2d 3e 7a 3b 0a 20 20 77  = pBegin->z;.  w
110c0 68 69 6c 65 28 20 73 71 6c 69 74 65 33 49 73 73  hile( sqlite3Iss
110d0 70 61 63 65 28 7a 5b 6e 2d 31 5d 29 20 29 7b 20  pace(z[n-1]) ){ 
110e0 6e 2d 2d 3b 20 7d 0a 20 20 73 45 6e 64 2e 7a 20  n--; }.  sEnd.z 
110f0 3d 20 26 7a 5b 6e 2d 31 5d 3b 0a 20 20 73 45 6e  = &z[n-1];.  sEn
11100 64 2e 6e 20 3d 20 31 3b 0a 0a 20 20 2f 2a 20 55  d.n = 1;..  /* U
11110 73 65 20 73 71 6c 69 74 65 33 45 6e 64 54 61 62  se sqlite3EndTab
11120 6c 65 28 29 20 74 6f 20 61 64 64 20 74 68 65 20  le() to add the 
11130 76 69 65 77 20 74 6f 20 74 68 65 20 53 51 4c 49  view to the SQLI
11140 54 45 5f 4d 41 53 54 45 52 20 74 61 62 6c 65 20  TE_MASTER table 
11150 2a 2f 0a 20 20 73 71 6c 69 74 65 33 45 6e 64 54  */.  sqlite3EndT
11160 61 62 6c 65 28 70 50 61 72 73 65 2c 20 30 2c 20  able(pParse, 0, 
11170 26 73 45 6e 64 2c 20 30 2c 20 30 29 3b 0a 0a 63  &sEnd, 0, 0);..c
11180 72 65 61 74 65 5f 76 69 65 77 5f 66 61 69 6c 3a  reate_view_fail:
11190 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  .  sqlite3Select
111a0 44 65 6c 65 74 65 28 64 62 2c 20 70 53 65 6c 65  Delete(db, pSele
111b0 63 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78  ct);.  sqlite3Ex
111c0 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c  prListDelete(db,
111d0 20 70 43 4e 61 6d 65 73 29 3b 0a 20 20 72 65 74   pCNames);.  ret
111e0 75 72 6e 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  urn;.}.#endif /*
111f0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45   SQLITE_OMIT_VIE
11200 57 20 2a 2f 0a 0a 23 69 66 20 21 64 65 66 69 6e  W */..#if !defin
11210 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ed(SQLITE_OMIT_V
11220 49 45 57 29 20 7c 7c 20 21 64 65 66 69 6e 65 64  IEW) || !defined
11230 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52  (SQLITE_OMIT_VIR
11240 54 55 41 4c 54 41 42 4c 45 29 0a 2f 2a 0a 2a 2a  TUALTABLE)./*.**
11250 20 54 68 65 20 54 61 62 6c 65 20 73 74 72 75 63   The Table struc
11260 74 75 72 65 20 70 54 61 62 6c 65 20 69 73 20 72  ture pTable is r
11270 65 61 6c 6c 79 20 61 20 56 49 45 57 2e 20 20 46  eally a VIEW.  F
11280 69 6c 6c 20 69 6e 20 74 68 65 20 6e 61 6d 65 73  ill in the names
11290 20 6f 66 0a 2a 2a 20 74 68 65 20 63 6f 6c 75 6d   of.** the colum
112a0 6e 73 20 6f 66 20 74 68 65 20 76 69 65 77 20 69  ns of the view i
112b0 6e 20 74 68 65 20 70 54 61 62 6c 65 20 73 74 72  n the pTable str
112c0 75 63 74 75 72 65 2e 20 20 52 65 74 75 72 6e 20  ucture.  Return 
112d0 74 68 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66  the number.** of
112e0 20 65 72 72 6f 72 73 2e 20 20 49 66 20 61 6e 20   errors.  If an 
112f0 65 72 72 6f 72 20 69 73 20 73 65 65 6e 20 6c 65  error is seen le
11300 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73  ave an error mes
11310 73 61 67 65 20 69 6e 20 70 50 61 72 73 65 2d 3e  sage in pParse->
11320 7a 45 72 72 4d 73 67 2e 0a 2a 2f 0a 69 6e 74 20  zErrMsg..*/.int 
11330 73 71 6c 69 74 65 33 56 69 65 77 47 65 74 43 6f  sqlite3ViewGetCo
11340 6c 75 6d 6e 4e 61 6d 65 73 28 50 61 72 73 65 20  lumnNames(Parse 
11350 2a 70 50 61 72 73 65 2c 20 54 61 62 6c 65 20 2a  *pParse, Table *
11360 70 54 61 62 6c 65 29 7b 0a 20 20 54 61 62 6c 65  pTable){.  Table
11370 20 2a 70 53 65 6c 54 61 62 3b 20 20 20 2f 2a 20   *pSelTab;   /* 
11380 41 20 66 61 6b 65 20 74 61 62 6c 65 20 66 72 6f  A fake table fro
11390 6d 20 77 68 69 63 68 20 77 65 20 67 65 74 20 74  m which we get t
113a0 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f  he result set */
113b0 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 3b  .  Select *pSel;
113c0 20 20 20 20 20 2f 2a 20 43 6f 70 79 20 6f 66 20       /* Copy of 
113d0 74 68 65 20 53 45 4c 45 43 54 20 74 68 61 74 20  the SELECT that 
113e0 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 76  implements the v
113f0 69 65 77 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 72  iew */.  int nEr
11400 72 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 4e 75  r = 0;     /* Nu
11410 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73 20 65  mber of errors e
11420 6e 63 6f 75 6e 74 65 72 65 64 20 2a 2f 0a 20 20  ncountered */.  
11430 69 6e 74 20 6e 3b 20 20 20 20 20 20 20 20 20 20  int n;          
11440 20 20 2f 2a 20 54 65 6d 70 6f 72 61 72 69 6c 79    /* Temporarily
11450 20 68 6f 6c 64 73 20 74 68 65 20 6e 75 6d 62 65   holds the numbe
11460 72 20 6f 66 20 63 75 72 73 6f 72 73 20 61 73 73  r of cursors ass
11470 69 67 6e 65 64 20 2a 2f 0a 20 20 73 71 6c 69 74  igned */.  sqlit
11480 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
11490 3e 64 62 3b 20 20 2f 2a 20 44 61 74 61 62 61 73  >db;  /* Databas
114a0 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 66 6f 72  e connection for
114b0 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 73 20 2a   malloc errors *
114c0 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
114d0 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54  _OMIT_AUTHORIZAT
114e0 49 4f 4e 0a 20 20 73 71 6c 69 74 65 33 5f 78 61  ION.  sqlite3_xa
114f0 75 74 68 20 78 41 75 74 68 3b 20 20 20 20 20 20  uth xAuth;      
11500 20 2f 2a 20 53 61 76 65 64 20 78 41 75 74 68 20   /* Saved xAuth 
11510 70 6f 69 6e 74 65 72 20 2a 2f 0a 23 65 6e 64 69  pointer */.#endi
11520 66 0a 0a 20 20 61 73 73 65 72 74 28 20 70 54 61  f..  assert( pTa
11530 62 6c 65 20 29 3b 0a 0a 23 69 66 6e 64 65 66 20  ble );..#ifndef 
11540 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
11550 55 41 4c 54 41 42 4c 45 0a 20 20 69 66 28 20 73  UALTABLE.  if( s
11560 71 6c 69 74 65 33 56 74 61 62 43 61 6c 6c 43 6f  qlite3VtabCallCo
11570 6e 6e 65 63 74 28 70 50 61 72 73 65 2c 20 70 54  nnect(pParse, pT
11580 61 62 6c 65 29 20 29 7b 0a 20 20 20 20 72 65 74  able) ){.    ret
11590 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
115a0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 49 73 56 69  ;.  }.  if( IsVi
115b0 72 74 75 61 6c 28 70 54 61 62 6c 65 29 20 29 20  rtual(pTable) ) 
115c0 72 65 74 75 72 6e 20 30 3b 0a 23 65 6e 64 69 66  return 0;.#endif
115d0 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
115e0 5f 4f 4d 49 54 5f 56 49 45 57 0a 20 20 2f 2a 20  _OMIT_VIEW.  /* 
115f0 41 20 70 6f 73 69 74 69 76 65 20 6e 43 6f 6c 20  A positive nCol 
11600 6d 65 61 6e 73 20 74 68 65 20 63 6f 6c 75 6d 6e  means the column
11610 73 20 6e 61 6d 65 73 20 66 6f 72 20 74 68 69 73  s names for this
11620 20 76 69 65 77 20 61 72 65 0a 20 20 2a 2a 20 61   view are.  ** a
11630 6c 72 65 61 64 79 20 6b 6e 6f 77 6e 2e 0a 20 20  lready known..  
11640 2a 2f 0a 20 20 69 66 28 20 70 54 61 62 6c 65 2d  */.  if( pTable-
11650 3e 6e 43 6f 6c 3e 30 20 29 20 72 65 74 75 72 6e  >nCol>0 ) return
11660 20 30 3b 0a 0a 20 20 2f 2a 20 41 20 6e 65 67 61   0;..  /* A nega
11670 74 69 76 65 20 6e 43 6f 6c 20 69 73 20 61 20 73  tive nCol is a s
11680 70 65 63 69 61 6c 20 6d 61 72 6b 65 72 20 6d 65  pecial marker me
11690 61 6e 69 6e 67 20 74 68 61 74 20 77 65 20 61 72  aning that we ar
116a0 65 20 63 75 72 72 65 6e 74 6c 79 0a 20 20 2a 2a  e currently.  **
116b0 20 74 72 79 69 6e 67 20 74 6f 20 63 6f 6d 70 75   trying to compu
116c0 74 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61  te the column na
116d0 6d 65 73 2e 20 20 49 66 20 77 65 20 65 6e 74 65  mes.  If we ente
116e0 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77  r this routine w
116f0 69 74 68 0a 20 20 2a 2a 20 61 20 6e 65 67 61 74  ith.  ** a negat
11700 69 76 65 20 6e 43 6f 6c 2c 20 69 74 20 6d 65 61  ive nCol, it mea
11710 6e 73 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 76  ns two or more v
11720 69 65 77 73 20 66 6f 72 6d 20 61 20 6c 6f 6f 70  iews form a loop
11730 2c 20 6c 69 6b 65 20 74 68 69 73 3a 0a 20 20 2a  , like this:.  *
11740 2a 0a 20 20 2a 2a 20 20 20 20 20 43 52 45 41 54  *.  **     CREAT
11750 45 20 56 49 45 57 20 6f 6e 65 20 41 53 20 53 45  E VIEW one AS SE
11760 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 77 6f 3b  LECT * FROM two;
11770 0a 20 20 2a 2a 20 20 20 20 20 43 52 45 41 54 45  .  **     CREATE
11780 20 56 49 45 57 20 74 77 6f 20 41 53 20 53 45 4c   VIEW two AS SEL
11790 45 43 54 20 2a 20 46 52 4f 4d 20 6f 6e 65 3b 0a  ECT * FROM one;.
117a0 20 20 2a 2a 0a 20 20 2a 2a 20 41 63 74 75 61 6c    **.  ** Actual
117b0 6c 79 2c 20 74 68 65 20 65 72 72 6f 72 20 61 62  ly, the error ab
117c0 6f 76 65 20 69 73 20 6e 6f 77 20 63 61 75 67 68  ove is now caugh
117d0 74 20 70 72 69 6f 72 20 74 6f 20 72 65 61 63 68  t prior to reach
117e0 69 6e 67 20 74 68 69 73 20 70 6f 69 6e 74 2e 0a  ing this point..
117f0 20 20 2a 2a 20 42 75 74 20 74 68 65 20 66 6f 6c    ** But the fol
11800 6c 6f 77 69 6e 67 20 74 65 73 74 20 69 73 20 73  lowing test is s
11810 74 69 6c 6c 20 69 6d 70 6f 72 74 61 6e 74 20 61  till important a
11820 73 20 69 74 20 64 6f 65 73 20 63 6f 6d 65 20 75  s it does come u
11830 70 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 66 6f  p.  ** in the fo
11840 6c 6c 6f 77 69 6e 67 3a 0a 20 20 2a 2a 20 0a 20  llowing:.  ** . 
11850 20 2a 2a 20 20 20 20 20 43 52 45 41 54 45 20 54   **     CREATE T
11860 41 42 4c 45 20 6d 61 69 6e 2e 65 78 31 28 61 29  ABLE main.ex1(a)
11870 3b 0a 20 20 2a 2a 20 20 20 20 20 43 52 45 41 54  ;.  **     CREAT
11880 45 20 54 45 4d 50 20 56 49 45 57 20 65 78 31 20  E TEMP VIEW ex1 
11890 41 53 20 53 45 4c 45 43 54 20 61 20 46 52 4f 4d  AS SELECT a FROM
118a0 20 65 78 31 3b 0a 20 20 2a 2a 20 20 20 20 20 53   ex1;.  **     S
118b0 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 65 6d  ELECT * FROM tem
118c0 70 2e 65 78 31 3b 0a 20 20 2a 2f 0a 20 20 69 66  p.ex1;.  */.  if
118d0 28 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3c 30  ( pTable->nCol<0
118e0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
118f0 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
11900 22 76 69 65 77 20 25 73 20 69 73 20 63 69 72 63  "view %s is circ
11910 75 6c 61 72 6c 79 20 64 65 66 69 6e 65 64 22 2c  ularly defined",
11920 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 29 3b   pTable->zName);
11930 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20  .    return 1;. 
11940 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 54 61   }.  assert( pTa
11950 62 6c 65 2d 3e 6e 43 6f 6c 3e 3d 30 20 29 3b 0a  ble->nCol>=0 );.
11960 0a 20 20 2f 2a 20 49 66 20 77 65 20 67 65 74 20  .  /* If we get 
11970 74 68 69 73 20 66 61 72 2c 20 69 74 20 6d 65 61  this far, it mea
11980 6e 73 20 77 65 20 6e 65 65 64 20 74 6f 20 63 6f  ns we need to co
11990 6d 70 75 74 65 20 74 68 65 20 74 61 62 6c 65 20  mpute the table 
119a0 6e 61 6d 65 73 2e 0a 20 20 2a 2a 20 4e 6f 74 65  names..  ** Note
119b0 20 74 68 61 74 20 74 68 65 20 63 61 6c 6c 20 74   that the call t
119c0 6f 20 73 71 6c 69 74 65 33 52 65 73 75 6c 74 53  o sqlite3ResultS
119d0 65 74 4f 66 53 65 6c 65 63 74 28 29 20 77 69 6c  etOfSelect() wil
119e0 6c 20 65 78 70 61 6e 64 20 61 6e 79 0a 20 20 2a  l expand any.  *
119f0 2a 20 22 2a 22 20 65 6c 65 6d 65 6e 74 73 20 69  * "*" elements i
11a00 6e 20 74 68 65 20 72 65 73 75 6c 74 73 20 73 65  n the results se
11a10 74 20 6f 66 20 74 68 65 20 76 69 65 77 20 61 6e  t of the view an
11a20 64 20 77 69 6c 6c 20 61 73 73 69 67 6e 20 63 75  d will assign cu
11a30 72 73 6f 72 73 0a 20 20 2a 2a 20 74 6f 20 74 68  rsors.  ** to th
11a40 65 20 65 6c 65 6d 65 6e 74 73 20 6f 66 20 74 68  e elements of th
11a50 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20  e FROM clause.  
11a60 42 75 74 20 77 65 20 64 6f 20 6e 6f 74 20 77 61  But we do not wa
11a70 6e 74 20 74 68 65 73 65 20 63 68 61 6e 67 65 73  nt these changes
11a80 0a 20 20 2a 2a 20 74 6f 20 62 65 20 70 65 72 6d  .  ** to be perm
11a90 61 6e 65 6e 74 2e 20 20 53 6f 20 74 68 65 20 63  anent.  So the c
11aa0 6f 6d 70 75 74 61 74 69 6f 6e 20 69 73 20 64 6f  omputation is do
11ab0 6e 65 20 6f 6e 20 61 20 63 6f 70 79 20 6f 66 20  ne on a copy of 
11ac0 74 68 65 20 53 45 4c 45 43 54 0a 20 20 2a 2a 20  the SELECT.  ** 
11ad0 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20 64  statement that d
11ae0 65 66 69 6e 65 73 20 74 68 65 20 76 69 65 77 2e  efines the view.
11af0 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
11b00 70 54 61 62 6c 65 2d 3e 70 53 65 6c 65 63 74 20  pTable->pSelect 
11b10 29 3b 0a 20 20 70 53 65 6c 20 3d 20 73 71 6c 69  );.  pSel = sqli
11b20 74 65 33 53 65 6c 65 63 74 44 75 70 28 64 62 2c  te3SelectDup(db,
11b30 20 70 54 61 62 6c 65 2d 3e 70 53 65 6c 65 63 74   pTable->pSelect
11b40 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 53 65 6c  , 0);.  if( pSel
11b50 20 29 7b 0a 20 20 20 20 6e 20 3d 20 70 50 61 72   ){.    n = pPar
11b60 73 65 2d 3e 6e 54 61 62 3b 0a 20 20 20 20 73 71  se->nTab;.    sq
11b70 6c 69 74 65 33 53 72 63 4c 69 73 74 41 73 73 69  lite3SrcListAssi
11b80 67 6e 43 75 72 73 6f 72 73 28 70 50 61 72 73 65  gnCursors(pParse
11b90 2c 20 70 53 65 6c 2d 3e 70 53 72 63 29 3b 0a 20  , pSel->pSrc);. 
11ba0 20 20 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20     pTable->nCol 
11bb0 3d 20 2d 31 3b 0a 20 20 20 20 64 62 2d 3e 6c 6f  = -1;.    db->lo
11bc0 6f 6b 61 73 69 64 65 2e 62 44 69 73 61 62 6c 65  okaside.bDisable
11bd0 2b 2b 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  ++;.#ifndef SQLI
11be0 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a  TE_OMIT_AUTHORIZ
11bf0 41 54 49 4f 4e 0a 20 20 20 20 78 41 75 74 68 20  ATION.    xAuth 
11c00 3d 20 64 62 2d 3e 78 41 75 74 68 3b 0a 20 20 20  = db->xAuth;.   
11c10 20 64 62 2d 3e 78 41 75 74 68 20 3d 20 30 3b 0a   db->xAuth = 0;.
11c20 20 20 20 20 70 53 65 6c 54 61 62 20 3d 20 73 71      pSelTab = sq
11c30 6c 69 74 65 33 52 65 73 75 6c 74 53 65 74 4f 66  lite3ResultSetOf
11c40 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  Select(pParse, p
11c50 53 65 6c 29 3b 0a 20 20 20 20 64 62 2d 3e 78 41  Sel);.    db->xA
11c60 75 74 68 20 3d 20 78 41 75 74 68 3b 0a 23 65 6c  uth = xAuth;.#el
11c70 73 65 0a 20 20 20 20 70 53 65 6c 54 61 62 20 3d  se.    pSelTab =
11c80 20 73 71 6c 69 74 65 33 52 65 73 75 6c 74 53 65   sqlite3ResultSe
11c90 74 4f 66 53 65 6c 65 63 74 28 70 50 61 72 73 65  tOfSelect(pParse
11ca0 2c 20 70 53 65 6c 29 3b 0a 23 65 6e 64 69 66 0a  , pSel);.#endif.
11cb0 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 54 61 62      pParse->nTab
11cc0 20 3d 20 6e 3b 0a 20 20 20 20 69 66 28 20 70 54   = n;.    if( pT
11cd0 61 62 6c 65 2d 3e 70 43 68 65 63 6b 20 29 7b 0a  able->pCheck ){.
11ce0 20 20 20 20 20 20 2f 2a 20 43 52 45 41 54 45 20        /* CREATE 
11cf0 56 49 45 57 20 6e 61 6d 65 28 61 72 67 6c 69 73  VIEW name(arglis
11d00 74 29 20 41 53 20 2e 2e 2e 0a 20 20 20 20 20 20  t) AS ....      
11d10 2a 2a 20 54 68 65 20 6e 61 6d 65 73 20 6f 66 20  ** The names of 
11d20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74  the columns in t
11d30 68 65 20 74 61 62 6c 65 20 61 72 65 20 74 61 6b  he table are tak
11d40 65 6e 20 66 72 6f 6d 0a 20 20 20 20 20 20 2a 2a  en from.      **
11d50 20 61 72 67 6c 69 73 74 20 77 68 69 63 68 20 69   arglist which i
11d60 73 20 73 74 6f 72 65 64 20 69 6e 20 70 54 61 62  s stored in pTab
11d70 6c 65 2d 3e 70 43 68 65 63 6b 2e 20 20 54 68 65  le->pCheck.  The
11d80 20 70 43 68 65 63 6b 20 66 69 65 6c 64 0a 20 20   pCheck field.  
11d90 20 20 20 20 2a 2a 20 6e 6f 72 6d 61 6c 6c 79 20      ** normally 
11da0 68 6f 6c 64 73 20 43 48 45 43 4b 20 63 6f 6e 73  holds CHECK cons
11db0 74 72 61 69 6e 74 73 20 6f 6e 20 61 6e 20 6f 72  traints on an or
11dc0 64 69 6e 61 72 79 20 74 61 62 6c 65 2c 20 62 75  dinary table, bu
11dd0 74 20 66 6f 72 0a 20 20 20 20 20 20 2a 2a 20 61  t for.      ** a
11de0 20 56 49 45 57 20 69 74 20 68 6f 6c 64 73 20 74   VIEW it holds t
11df0 68 65 20 6c 69 73 74 20 6f 66 20 63 6f 6c 75 6d  he list of colum
11e00 6e 20 6e 61 6d 65 73 2e 0a 20 20 20 20 20 20 2a  n names..      *
11e10 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 43  /.      sqlite3C
11e20 6f 6c 75 6d 6e 73 46 72 6f 6d 45 78 70 72 4c 69  olumnsFromExprLi
11e30 73 74 28 70 50 61 72 73 65 2c 20 70 54 61 62 6c  st(pParse, pTabl
11e40 65 2d 3e 70 43 68 65 63 6b 2c 20 0a 20 20 20 20  e->pCheck, .    
11e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11e60 20 20 20 20 20 20 20 20 20 20 20 20 20 26 70 54               &pT
11e70 61 62 6c 65 2d 3e 6e 43 6f 6c 2c 20 26 70 54 61  able->nCol, &pTa
11e80 62 6c 65 2d 3e 61 43 6f 6c 29 3b 0a 20 20 20 20  ble->aCol);.    
11e90 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
11ea0 46 61 69 6c 65 64 3d 3d 30 20 0a 20 20 20 20 20  Failed==0 .     
11eb0 20 20 26 26 20 70 50 61 72 73 65 2d 3e 6e 45 72    && pParse->nEr
11ec0 72 3d 3d 30 0a 20 20 20 20 20 20 20 26 26 20 70  r==0.       && p
11ed0 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3d 3d 70 53 65  Table->nCol==pSe
11ee0 6c 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  l->pEList->nExpr
11ef0 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20  .      ){.      
11f00 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 41    sqlite3SelectA
11f10 64 64 43 6f 6c 75 6d 6e 54 79 70 65 41 6e 64 43  ddColumnTypeAndC
11f20 6f 6c 6c 61 74 69 6f 6e 28 70 50 61 72 73 65 2c  ollation(pParse,
11f30 20 70 54 61 62 6c 65 2c 20 70 53 65 6c 29 3b 0a   pTable, pSel);.
11f40 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
11f50 65 20 69 66 28 20 70 53 65 6c 54 61 62 20 29 7b  e if( pSelTab ){
11f60 0a 20 20 20 20 20 20 2f 2a 20 43 52 45 41 54 45  .      /* CREATE
11f70 20 56 49 45 57 20 6e 61 6d 65 20 41 53 2e 2e 2e   VIEW name AS...
11f80 20 20 77 69 74 68 6f 75 74 20 61 6e 20 61 72 67    without an arg
11f90 75 6d 65 6e 74 20 6c 69 73 74 2e 20 20 43 6f 6e  ument list.  Con
11fa0 73 74 72 75 63 74 0a 20 20 20 20 20 20 2a 2a 20  struct.      ** 
11fb0 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73  the column names
11fc0 20 66 72 6f 6d 20 74 68 65 20 53 45 4c 45 43 54   from the SELECT
11fd0 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20   statement that 
11fe0 64 65 66 69 6e 65 73 20 74 68 65 20 76 69 65 77  defines the view
11ff0 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
12000 20 61 73 73 65 72 74 28 20 70 54 61 62 6c 65 2d   assert( pTable-
12010 3e 61 43 6f 6c 3d 3d 30 20 29 3b 0a 20 20 20 20  >aCol==0 );.    
12020 20 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d    pTable->nCol =
12030 20 70 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c 3b 0a   pSelTab->nCol;.
12040 20 20 20 20 20 20 70 54 61 62 6c 65 2d 3e 61 43        pTable->aC
12050 6f 6c 20 3d 20 70 53 65 6c 54 61 62 2d 3e 61 43  ol = pSelTab->aC
12060 6f 6c 3b 0a 20 20 20 20 20 20 70 53 65 6c 54 61  ol;.      pSelTa
12070 62 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20  b->nCol = 0;.   
12080 20 20 20 70 53 65 6c 54 61 62 2d 3e 61 43 6f 6c     pSelTab->aCol
12090 20 3d 20 30 3b 0a 20 20 20 20 20 20 61 73 73 65   = 0;.      asse
120a0 72 74 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d  rt( sqlite3Schem
120b0 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20 30  aMutexHeld(db, 0
120c0 2c 20 70 54 61 62 6c 65 2d 3e 70 53 63 68 65 6d  , pTable->pSchem
120d0 61 29 20 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  a) );.    }else{
120e0 0a 20 20 20 20 20 20 70 54 61 62 6c 65 2d 3e 6e  .      pTable->n
120f0 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 6e  Col = 0;.      n
12100 45 72 72 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20  Err++;.    }.   
12110 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61   sqlite3DeleteTa
12120 62 6c 65 28 64 62 2c 20 70 53 65 6c 54 61 62 29  ble(db, pSelTab)
12130 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c  ;.    sqlite3Sel
12140 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70 53  ectDelete(db, pS
12150 65 6c 29 3b 0a 20 20 20 20 64 62 2d 3e 6c 6f 6f  el);.    db->loo
12160 6b 61 73 69 64 65 2e 62 44 69 73 61 62 6c 65 2d  kaside.bDisable-
12170 2d 3b 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20  -;.  } else {.  
12180 20 20 6e 45 72 72 2b 2b 3b 0a 20 20 7d 0a 20 20    nErr++;.  }.  
12190 70 54 61 62 6c 65 2d 3e 70 53 63 68 65 6d 61 2d  pTable->pSchema-
121a0 3e 73 63 68 65 6d 61 46 6c 61 67 73 20 7c 3d 20  >schemaFlags |= 
121b0 44 42 5f 55 6e 72 65 73 65 74 56 69 65 77 73 3b  DB_UnresetViews;
121c0 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
121d0 45 5f 4f 4d 49 54 5f 56 49 45 57 20 2a 2f 0a 20  E_OMIT_VIEW */. 
121e0 20 72 65 74 75 72 6e 20 6e 45 72 72 3b 20 20 0a   return nErr;  .
121f0 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66  }.#endif /* !def
12200 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
12210 5f 56 49 45 57 29 20 7c 7c 20 21 64 65 66 69 6e  _VIEW) || !defin
12220 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ed(SQLITE_OMIT_V
12230 49 52 54 55 41 4c 54 41 42 4c 45 29 20 2a 2f 0a  IRTUALTABLE) */.
12240 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
12250 4f 4d 49 54 5f 56 49 45 57 0a 2f 2a 0a 2a 2a 20  OMIT_VIEW./*.** 
12260 43 6c 65 61 72 20 74 68 65 20 63 6f 6c 75 6d 6e  Clear the column
12270 20 6e 61 6d 65 73 20 66 72 6f 6d 20 65 76 65 72   names from ever
12280 79 20 56 49 45 57 20 69 6e 20 64 61 74 61 62 61  y VIEW in databa
12290 73 65 20 69 64 78 2e 0a 2a 2f 0a 73 74 61 74 69  se idx..*/.stati
122a0 63 20 76 6f 69 64 20 73 71 6c 69 74 65 56 69 65  c void sqliteVie
122b0 77 52 65 73 65 74 41 6c 6c 28 73 71 6c 69 74 65  wResetAll(sqlite
122c0 33 20 2a 64 62 2c 20 69 6e 74 20 69 64 78 29 7b  3 *db, int idx){
122d0 0a 20 20 48 61 73 68 45 6c 65 6d 20 2a 69 3b 0a  .  HashElem *i;.
122e0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
122f0 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64  3SchemaMutexHeld
12300 28 64 62 2c 20 69 64 78 2c 20 30 29 20 29 3b 0a  (db, idx, 0) );.
12310 20 20 69 66 28 20 21 44 62 48 61 73 50 72 6f 70    if( !DbHasProp
12320 65 72 74 79 28 64 62 2c 20 69 64 78 2c 20 44 42  erty(db, idx, DB
12330 5f 55 6e 72 65 73 65 74 56 69 65 77 73 29 20 29  _UnresetViews) )
12340 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69   return;.  for(i
12350 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72 73 74  =sqliteHashFirst
12360 28 26 64 62 2d 3e 61 44 62 5b 69 64 78 5d 2e 70  (&db->aDb[idx].p
12370 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68 29  Schema->tblHash)
12380 3b 20 69 3b 69 3d 73 71 6c 69 74 65 48 61 73 68  ; i;i=sqliteHash
12390 4e 65 78 74 28 69 29 29 7b 0a 20 20 20 20 54 61  Next(i)){.    Ta
123a0 62 6c 65 20 2a 70 54 61 62 20 3d 20 73 71 6c 69  ble *pTab = sqli
123b0 74 65 48 61 73 68 44 61 74 61 28 69 29 3b 0a 20  teHashData(i);. 
123c0 20 20 20 69 66 28 20 70 54 61 62 2d 3e 70 53 65     if( pTab->pSe
123d0 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 73 71  lect ){.      sq
123e0 6c 69 74 65 33 44 65 6c 65 74 65 43 6f 6c 75 6d  lite3DeleteColum
123f0 6e 4e 61 6d 65 73 28 64 62 2c 20 70 54 61 62 29  nNames(db, pTab)
12400 3b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 61 43  ;.      pTab->aC
12410 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 54  ol = 0;.      pT
12420 61 62 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20  ab->nCol = 0;.  
12430 20 20 7d 0a 20 20 7d 0a 20 20 44 62 43 6c 65 61    }.  }.  DbClea
12440 72 50 72 6f 70 65 72 74 79 28 64 62 2c 20 69 64  rProperty(db, id
12450 78 2c 20 44 42 5f 55 6e 72 65 73 65 74 56 69 65  x, DB_UnresetVie
12460 77 73 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64  ws);.}.#else.# d
12470 65 66 69 6e 65 20 73 71 6c 69 74 65 56 69 65 77  efine sqliteView
12480 52 65 73 65 74 41 6c 6c 28 41 2c 42 29 0a 23 65  ResetAll(A,B).#e
12490 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
124a0 4d 49 54 5f 56 49 45 57 20 2a 2f 0a 0a 2f 2a 0a  MIT_VIEW */../*.
124b0 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
124c0 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68   is called by th
124d0 65 20 56 44 42 45 20 74 6f 20 61 64 6a 75 73 74  e VDBE to adjust
124e0 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 73 63   the internal sc
124f0 68 65 6d 61 0a 2a 2a 20 75 73 65 64 20 62 79 20  hema.** used by 
12500 53 51 4c 69 74 65 20 77 68 65 6e 20 74 68 65 20  SQLite when the 
12510 62 74 72 65 65 20 6c 61 79 65 72 20 6d 6f 76 65  btree layer move
12520 73 20 61 20 74 61 62 6c 65 20 72 6f 6f 74 20 70  s a table root p
12530 61 67 65 2e 20 54 68 65 0a 2a 2a 20 72 6f 6f 74  age. The.** root
12540 2d 70 61 67 65 20 6f 66 20 61 20 74 61 62 6c 65  -page of a table
12550 20 6f 72 20 69 6e 64 65 78 20 69 6e 20 64 61 74   or index in dat
12560 61 62 61 73 65 20 69 44 62 20 68 61 73 20 63 68  abase iDb has ch
12570 61 6e 67 65 64 20 66 72 6f 6d 20 69 46 72 6f 6d  anged from iFrom
12580 0a 2a 2a 20 74 6f 20 69 54 6f 2e 0a 2a 2a 0a 2a  .** to iTo..**.*
12590 2a 20 54 69 63 6b 65 74 20 23 31 37 32 38 3a 20  * Ticket #1728: 
125a0 20 54 68 65 20 73 79 6d 62 6f 6c 20 74 61 62 6c   The symbol tabl
125b0 65 20 6d 69 67 68 74 20 73 74 69 6c 6c 20 63 6f  e might still co
125c0 6e 74 61 69 6e 20 69 6e 66 6f 72 6d 61 74 69 6f  ntain informatio
125d0 6e 0a 2a 2a 20 6f 6e 20 74 61 62 6c 65 73 20 61  n.** on tables a
125e0 6e 64 2f 6f 72 20 69 6e 64 69 63 65 73 20 74 68  nd/or indices th
125f0 61 74 20 61 72 65 20 74 68 65 20 70 72 6f 63 65  at are the proce
12600 73 73 20 6f 66 20 62 65 69 6e 67 20 64 65 6c 65  ss of being dele
12610 74 65 64 2e 0a 2a 2a 20 49 66 20 79 6f 75 20 61  ted..** If you a
12620 72 65 20 75 6e 6c 75 63 6b 79 2c 20 6f 6e 65 20  re unlucky, one 
12630 6f 66 20 74 68 6f 73 65 20 64 65 6c 65 74 65 64  of those deleted
12640 20 69 6e 64 69 63 65 73 20 6f 72 20 74 61 62 6c   indices or tabl
12650 65 73 20 6d 69 67 68 74 0a 2a 2a 20 68 61 76 65  es might.** have
12660 20 74 68 65 20 73 61 6d 65 20 72 6f 6f 74 70 61   the same rootpa
12670 67 65 20 6e 75 6d 62 65 72 20 61 73 20 74 68 65  ge number as the
12680 20 72 65 61 6c 20 74 61 62 6c 65 20 6f 72 20 69   real table or i
12690 6e 64 65 78 20 74 68 61 74 20 69 73 0a 2a 2a 20  ndex that is.** 
126a0 62 65 69 6e 67 20 6d 6f 76 65 64 2e 20 20 53 6f  being moved.  So
126b0 20 77 65 20 63 61 6e 6e 6f 74 20 73 74 6f 70 20   we cannot stop 
126c0 73 65 61 72 63 68 69 6e 67 20 61 66 74 65 72 20  searching after 
126d0 74 68 65 20 66 69 72 73 74 20 6d 61 74 63 68 20  the first match 
126e0 0a 2a 2a 20 62 65 63 61 75 73 65 20 74 68 65 20  .** because the 
126f0 66 69 72 73 74 20 6d 61 74 63 68 20 6d 69 67 68  first match migh
12700 74 20 62 65 20 66 6f 72 20 6f 6e 65 20 6f 66 20  t be for one of 
12710 74 68 65 20 64 65 6c 65 74 65 64 20 69 6e 64 69  the deleted indi
12720 63 65 73 0a 2a 2a 20 6f 72 20 74 61 62 6c 65 73  ces.** or tables
12730 20 61 6e 64 20 6e 6f 74 20 74 68 65 20 74 61 62   and not the tab
12740 6c 65 2f 69 6e 64 65 78 20 74 68 61 74 20 69 73  le/index that is
12750 20 61 63 74 75 61 6c 6c 79 20 62 65 69 6e 67 20   actually being 
12760 6d 6f 76 65 64 2e 0a 2a 2a 20 57 65 20 6d 75 73  moved..** We mus
12770 74 20 63 6f 6e 74 69 6e 75 65 20 6c 6f 6f 70 69  t continue loopi
12780 6e 67 20 75 6e 74 69 6c 20 61 6c 6c 20 74 61 62  ng until all tab
12790 6c 65 73 20 61 6e 64 20 69 6e 64 69 63 65 73 20  les and indices 
127a0 77 69 74 68 0a 2a 2a 20 72 6f 6f 74 70 61 67 65  with.** rootpage
127b0 3d 3d 69 46 72 6f 6d 20 68 61 76 65 20 62 65 65  ==iFrom have bee
127c0 6e 20 63 6f 6e 76 65 72 74 65 64 20 74 6f 20 68  n converted to h
127d0 61 76 65 20 61 20 72 6f 6f 74 70 61 67 65 20 6f  ave a rootpage o
127e0 66 20 69 54 6f 0a 2a 2a 20 69 6e 20 6f 72 64 65  f iTo.** in orde
127f0 72 20 74 6f 20 62 65 20 63 65 72 74 61 69 6e 20  r to be certain 
12800 74 68 61 74 20 77 65 20 67 6f 74 20 74 68 65 20  that we got the 
12810 72 69 67 68 74 20 6f 6e 65 2e 0a 2a 2f 0a 23 69  right one..*/.#i
12820 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
12830 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 76 6f 69  T_AUTOVACUUM.voi
12840 64 20 73 71 6c 69 74 65 33 52 6f 6f 74 50 61 67  d sqlite3RootPag
12850 65 4d 6f 76 65 64 28 73 71 6c 69 74 65 33 20 2a  eMoved(sqlite3 *
12860 64 62 2c 20 69 6e 74 20 69 44 62 2c 20 69 6e 74  db, int iDb, int
12870 20 69 46 72 6f 6d 2c 20 69 6e 74 20 69 54 6f 29   iFrom, int iTo)
12880 7b 0a 20 20 48 61 73 68 45 6c 65 6d 20 2a 70 45  {.  HashElem *pE
12890 6c 65 6d 3b 0a 20 20 48 61 73 68 20 2a 70 48 61  lem;.  Hash *pHa
128a0 73 68 3b 0a 20 20 44 62 20 2a 70 44 62 3b 0a 0a  sh;.  Db *pDb;..
128b0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
128c0 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64  3SchemaMutexHeld
128d0 28 64 62 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a  (db, iDb, 0) );.
128e0 20 20 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62    pDb = &db->aDb
128f0 5b 69 44 62 5d 3b 0a 20 20 70 48 61 73 68 20 3d  [iDb];.  pHash =
12900 20 26 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e   &pDb->pSchema->
12910 74 62 6c 48 61 73 68 3b 0a 20 20 66 6f 72 28 70  tblHash;.  for(p
12920 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73 68 46  Elem=sqliteHashF
12930 69 72 73 74 28 70 48 61 73 68 29 3b 20 70 45 6c  irst(pHash); pEl
12940 65 6d 3b 20 70 45 6c 65 6d 3d 73 71 6c 69 74 65  em; pElem=sqlite
12950 48 61 73 68 4e 65 78 74 28 70 45 6c 65 6d 29 29  HashNext(pElem))
12960 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61  {.    Table *pTa
12970 62 20 3d 20 73 71 6c 69 74 65 48 61 73 68 44 61  b = sqliteHashDa
12980 74 61 28 70 45 6c 65 6d 29 3b 0a 20 20 20 20 69  ta(pElem);.    i
12990 66 28 20 70 54 61 62 2d 3e 74 6e 75 6d 3d 3d 69  f( pTab->tnum==i
129a0 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20 70 54  From ){.      pT
129b0 61 62 2d 3e 74 6e 75 6d 20 3d 20 69 54 6f 3b 0a  ab->tnum = iTo;.
129c0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 48 61 73      }.  }.  pHas
129d0 68 20 3d 20 26 70 44 62 2d 3e 70 53 63 68 65 6d  h = &pDb->pSchem
129e0 61 2d 3e 69 64 78 48 61 73 68 3b 0a 20 20 66 6f  a->idxHash;.  fo
129f0 72 28 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61  r(pElem=sqliteHa
12a00 73 68 46 69 72 73 74 28 70 48 61 73 68 29 3b 20  shFirst(pHash); 
12a10 70 45 6c 65 6d 3b 20 70 45 6c 65 6d 3d 73 71 6c  pElem; pElem=sql
12a20 69 74 65 48 61 73 68 4e 65 78 74 28 70 45 6c 65  iteHashNext(pEle
12a30 6d 29 29 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a  m)){.    Index *
12a40 70 49 64 78 20 3d 20 73 71 6c 69 74 65 48 61 73  pIdx = sqliteHas
12a50 68 44 61 74 61 28 70 45 6c 65 6d 29 3b 0a 20 20  hData(pElem);.  
12a60 20 20 69 66 28 20 70 49 64 78 2d 3e 74 6e 75 6d    if( pIdx->tnum
12a70 3d 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20  ==iFrom ){.     
12a80 20 70 49 64 78 2d 3e 74 6e 75 6d 20 3d 20 69 54   pIdx->tnum = iT
12a90 6f 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23  o;.    }.  }.}.#
12aa0 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 72 69  endif../*.** Wri
12ab0 74 65 20 63 6f 64 65 20 74 6f 20 65 72 61 73 65  te code to erase
12ac0 20 74 68 65 20 74 61 62 6c 65 20 77 69 74 68 20   the table with 
12ad0 72 6f 6f 74 2d 70 61 67 65 20 69 54 61 62 6c 65  root-page iTable
12ae0 20 66 72 6f 6d 20 64 61 74 61 62 61 73 65 20 69   from database i
12af0 44 62 2e 0a 2a 2a 20 41 6c 73 6f 20 77 72 69 74  Db..** Also writ
12b00 65 20 63 6f 64 65 20 74 6f 20 6d 6f 64 69 66 79  e code to modify
12b10 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74   the sqlite_mast
12b20 65 72 20 74 61 62 6c 65 20 61 6e 64 20 69 6e 74  er table and int
12b30 65 72 6e 61 6c 20 73 63 68 65 6d 61 0a 2a 2a 20  ernal schema.** 
12b40 69 66 20 61 20 72 6f 6f 74 2d 70 61 67 65 20 6f  if a root-page o
12b50 66 20 61 6e 6f 74 68 65 72 20 74 61 62 6c 65 20  f another table 
12b60 69 73 20 6d 6f 76 65 64 20 62 79 20 74 68 65 20  is moved by the 
12b70 62 74 72 65 65 2d 6c 61 79 65 72 20 77 68 69 6c  btree-layer whil
12b80 73 74 0a 2a 2a 20 65 72 61 73 69 6e 67 20 69 54  st.** erasing iT
12b90 61 62 6c 65 20 28 74 68 69 73 20 63 61 6e 20 68  able (this can h
12ba0 61 70 70 65 6e 20 77 69 74 68 20 61 6e 20 61 75  appen with an au
12bb0 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61  to-vacuum databa
12bc0 73 65 29 2e 0a 2a 2f 20 0a 73 74 61 74 69 63 20  se)..*/ .static 
12bd0 76 6f 69 64 20 64 65 73 74 72 6f 79 52 6f 6f 74  void destroyRoot
12be0 50 61 67 65 28 50 61 72 73 65 20 2a 70 50 61 72  Page(Parse *pPar
12bf0 73 65 2c 20 69 6e 74 20 69 54 61 62 6c 65 2c 20  se, int iTable, 
12c00 69 6e 74 20 69 44 62 29 7b 0a 20 20 56 64 62 65  int iDb){.  Vdbe
12c10 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74   *v = sqlite3Get
12c20 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
12c30 69 6e 74 20 72 31 20 3d 20 73 71 6c 69 74 65 33  int r1 = sqlite3
12c40 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
12c50 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 54  e);.  assert( iT
12c60 61 62 6c 65 3e 31 20 29 3b 0a 20 20 73 71 6c 69  able>1 );.  sqli
12c70 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
12c80 20 4f 50 5f 44 65 73 74 72 6f 79 2c 20 69 54 61   OP_Destroy, iTa
12c90 62 6c 65 2c 20 72 31 2c 20 69 44 62 29 3b 0a 20  ble, r1, iDb);. 
12ca0 20 73 71 6c 69 74 65 33 4d 61 79 41 62 6f 72 74   sqlite3MayAbort
12cb0 28 70 50 61 72 73 65 29 3b 0a 23 69 66 6e 64 65  (pParse);.#ifnde
12cc0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
12cd0 54 4f 56 41 43 55 55 4d 0a 20 20 2f 2a 20 4f 50  TOVACUUM.  /* OP
12ce0 5f 44 65 73 74 72 6f 79 20 73 74 6f 72 65 73 20  _Destroy stores 
12cf0 61 6e 20 69 6e 20 69 6e 74 65 67 65 72 20 72 31  an in integer r1
12d00 2e 20 49 66 20 74 68 69 73 20 69 6e 74 65 67 65  . If this intege
12d10 72 0a 20 20 2a 2a 20 69 73 20 6e 6f 6e 2d 7a 65  r.  ** is non-ze
12d20 72 6f 2c 20 74 68 65 6e 20 69 74 20 69 73 20 74  ro, then it is t
12d30 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d  he root page num
12d40 62 65 72 20 6f 66 20 61 20 74 61 62 6c 65 20 6d  ber of a table m
12d50 6f 76 65 64 20 74 6f 0a 20 20 2a 2a 20 6c 6f 63  oved to.  ** loc
12d60 61 74 69 6f 6e 20 69 54 61 62 6c 65 2e 20 54 68  ation iTable. Th
12d70 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 64 65  e following code
12d80 20 6d 6f 64 69 66 69 65 73 20 74 68 65 20 73 71   modifies the sq
12d90 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c  lite_master tabl
12da0 65 20 74 6f 0a 20 20 2a 2a 20 72 65 66 6c 65 63  e to.  ** reflec
12db0 74 20 74 68 69 73 2e 0a 20 20 2a 2a 0a 20 20 2a  t this..  **.  *
12dc0 2a 20 54 68 65 20 22 23 4e 4e 4e 22 20 69 6e 20  * The "#NNN" in 
12dd0 74 68 65 20 53 51 4c 20 69 73 20 61 20 73 70 65  the SQL is a spe
12de0 63 69 61 6c 20 63 6f 6e 73 74 61 6e 74 20 74 68  cial constant th
12df0 61 74 20 6d 65 61 6e 73 20 77 68 61 74 65 76 65  at means whateve
12e00 72 20 76 61 6c 75 65 0a 20 20 2a 2a 20 69 73 20  r value.  ** is 
12e10 69 6e 20 72 65 67 69 73 74 65 72 20 4e 4e 4e 2e  in register NNN.
12e20 20 20 53 65 65 20 67 72 61 6d 6d 61 72 20 72 75    See grammar ru
12e30 6c 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  les associated w
12e40 69 74 68 20 74 68 65 20 54 4b 5f 52 45 47 49 53  ith the TK_REGIS
12e50 54 45 52 0a 20 20 2a 2a 20 74 6f 6b 65 6e 20 66  TER.  ** token f
12e60 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e  or additional in
12e70 66 6f 72 6d 61 74 69 6f 6e 2e 0a 20 20 2a 2f 0a  formation..  */.
12e80 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50    sqlite3NestedP
12e90 61 72 73 65 28 70 50 61 72 73 65 2c 20 0a 20 20  arse(pParse, .  
12ea0 20 20 20 22 55 50 44 41 54 45 20 25 51 2e 25 73     "UPDATE %Q.%s
12eb0 20 53 45 54 20 72 6f 6f 74 70 61 67 65 3d 25 64   SET rootpage=%d
12ec0 20 57 48 45 52 45 20 23 25 64 20 41 4e 44 20 72   WHERE #%d AND r
12ed0 6f 6f 74 70 61 67 65 3d 23 25 64 22 2c 0a 20 20  ootpage=#%d",.  
12ee0 20 20 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61     pParse->db->a
12ef0 44 62 5b 69 44 62 5d 2e 7a 44 62 53 4e 61 6d 65  Db[iDb].zDbSName
12f00 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69  , SCHEMA_TABLE(i
12f10 44 62 29 2c 20 69 54 61 62 6c 65 2c 20 72 31 2c  Db), iTable, r1,
12f20 20 72 31 29 3b 0a 23 65 6e 64 69 66 0a 20 20 73   r1);.#endif.  s
12f30 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
12f40 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29  pReg(pParse, r1)
12f50 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65  ;.}../*.** Write
12f60 20 56 44 42 45 20 63 6f 64 65 20 74 6f 20 65 72   VDBE code to er
12f70 61 73 65 20 74 61 62 6c 65 20 70 54 61 62 20 61  ase table pTab a
12f80 6e 64 20 61 6c 6c 20 61 73 73 6f 63 69 61 74 65  nd all associate
12f90 64 20 69 6e 64 69 63 65 73 20 6f 6e 20 64 69 73  d indices on dis
12fa0 6b 2e 0a 2a 2a 20 43 6f 64 65 20 74 6f 20 75 70  k..** Code to up
12fb0 64 61 74 65 20 74 68 65 20 73 71 6c 69 74 65 5f  date the sqlite_
12fc0 6d 61 73 74 65 72 20 74 61 62 6c 65 73 20 61 6e  master tables an
12fd0 64 20 69 6e 74 65 72 6e 61 6c 20 73 63 68 65 6d  d internal schem
12fe0 61 20 64 65 66 69 6e 69 74 69 6f 6e 73 0a 2a 2a  a definitions.**
12ff0 20 69 6e 20 63 61 73 65 20 61 20 72 6f 6f 74 2d   in case a root-
13000 70 61 67 65 20 62 65 6c 6f 6e 67 69 6e 67 20 74  page belonging t
13010 6f 20 61 6e 6f 74 68 65 72 20 74 61 62 6c 65 20  o another table 
13020 69 73 20 6d 6f 76 65 64 20 62 79 20 74 68 65 20  is moved by the 
13030 62 74 72 65 65 20 6c 61 79 65 72 0a 2a 2a 20 69  btree layer.** i
13040 73 20 61 6c 73 6f 20 61 64 64 65 64 20 28 74 68  s also added (th
13050 69 73 20 63 61 6e 20 68 61 70 70 65 6e 20 77 69  is can happen wi
13060 74 68 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75  th an auto-vacuu
13070 6d 20 64 61 74 61 62 61 73 65 29 2e 0a 2a 2f 0a  m database)..*/.
13080 73 74 61 74 69 63 20 76 6f 69 64 20 64 65 73 74  static void dest
13090 72 6f 79 54 61 62 6c 65 28 50 61 72 73 65 20 2a  royTable(Parse *
130a0 70 50 61 72 73 65 2c 20 54 61 62 6c 65 20 2a 70  pParse, Table *p
130b0 54 61 62 29 7b 0a 23 69 66 64 65 66 20 53 51 4c  Tab){.#ifdef SQL
130c0 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
130d0 55 55 4d 0a 20 20 49 6e 64 65 78 20 2a 70 49 64  UUM.  Index *pId
130e0 78 3b 0a 20 20 69 6e 74 20 69 44 62 20 3d 20 73  x;.  int iDb = s
130f0 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e  qlite3SchemaToIn
13100 64 65 78 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  dex(pParse->db, 
13110 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a  pTab->pSchema);.
13120 20 20 64 65 73 74 72 6f 79 52 6f 6f 74 50 61 67    destroyRootPag
13130 65 28 70 50 61 72 73 65 2c 20 70 54 61 62 2d 3e  e(pParse, pTab->
13140 74 6e 75 6d 2c 20 69 44 62 29 3b 0a 20 20 66 6f  tnum, iDb);.  fo
13150 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e  r(pIdx=pTab->pIn
13160 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d  dex; pIdx; pIdx=
13170 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  pIdx->pNext){.  
13180 20 20 64 65 73 74 72 6f 79 52 6f 6f 74 50 61 67    destroyRootPag
13190 65 28 70 50 61 72 73 65 2c 20 70 49 64 78 2d 3e  e(pParse, pIdx->
131a0 74 6e 75 6d 2c 20 69 44 62 29 3b 0a 20 20 7d 0a  tnum, iDb);.  }.
131b0 23 65 6c 73 65 0a 20 20 2f 2a 20 49 66 20 74 68  #else.  /* If th
131c0 65 20 64 61 74 61 62 61 73 65 20 6d 61 79 20 62  e database may b
131d0 65 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 63 61  e auto-vacuum ca
131e0 70 61 62 6c 65 20 28 69 66 20 53 51 4c 49 54 45  pable (if SQLITE
131f0 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
13200 0a 20 20 2a 2a 20 69 73 20 6e 6f 74 20 64 65 66  .  ** is not def
13210 69 6e 65 64 29 2c 20 74 68 65 6e 20 69 74 20 69  ined), then it i
13220 73 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f 20 63  s important to c
13230 61 6c 6c 20 4f 50 5f 44 65 73 74 72 6f 79 20 6f  all OP_Destroy o
13240 6e 20 74 68 65 0a 20 20 2a 2a 20 74 61 62 6c 65  n the.  ** table
13250 20 61 6e 64 20 69 6e 64 65 78 20 72 6f 6f 74 2d   and index root-
13260 70 61 67 65 73 20 69 6e 20 6f 72 64 65 72 2c 20  pages in order, 
13270 73 74 61 72 74 69 6e 67 20 77 69 74 68 20 74 68  starting with th
13280 65 20 6e 75 6d 65 72 69 63 61 6c 6c 79 20 0a 20  e numerically . 
13290 20 2a 2a 20 6c 61 72 67 65 73 74 20 72 6f 6f 74   ** largest root
132a0 2d 70 61 67 65 20 6e 75 6d 62 65 72 2e 20 54 68  -page number. Th
132b0 69 73 20 67 75 61 72 61 6e 74 65 65 73 20 74 68  is guarantees th
132c0 61 74 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20 72  at none of the r
132d0 6f 6f 74 2d 70 61 67 65 73 0a 20 20 2a 2a 20 74  oot-pages.  ** t
132e0 6f 20 62 65 20 64 65 73 74 72 6f 79 65 64 20 69  o be destroyed i
132f0 73 20 72 65 6c 6f 63 61 74 65 64 20 62 79 20 61  s relocated by a
13300 6e 20 65 61 72 6c 69 65 72 20 4f 50 5f 44 65 73  n earlier OP_Des
13310 74 72 6f 79 2e 20 69 2e 65 2e 20 69 66 20 74 68  troy. i.e. if th
13320 65 0a 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67  e.  ** following
13330 20 77 65 72 65 20 63 6f 64 65 64 3a 0a 20 20 2a   were coded:.  *
13340 2a 0a 20 20 2a 2a 20 4f 50 5f 44 65 73 74 72 6f  *.  ** OP_Destro
13350 79 20 34 20 30 0a 20 20 2a 2a 20 2e 2e 2e 0a 20  y 4 0.  ** .... 
13360 20 2a 2a 20 4f 50 5f 44 65 73 74 72 6f 79 20 35   ** OP_Destroy 5
13370 20 30 0a 20 20 2a 2a 0a 20 20 2a 2a 20 61 6e 64   0.  **.  ** and
13380 20 72 6f 6f 74 20 70 61 67 65 20 35 20 68 61 70   root page 5 hap
13390 70 65 6e 65 64 20 74 6f 20 62 65 20 74 68 65 20  pened to be the 
133a0 6c 61 72 67 65 73 74 20 72 6f 6f 74 2d 70 61 67  largest root-pag
133b0 65 20 6e 75 6d 62 65 72 20 69 6e 20 74 68 65 0a  e number in the.
133c0 20 20 2a 2a 20 64 61 74 61 62 61 73 65 2c 20 74    ** database, t
133d0 68 65 6e 20 72 6f 6f 74 20 70 61 67 65 20 35 20  hen root page 5 
133e0 77 6f 75 6c 64 20 62 65 20 6d 6f 76 65 64 20 74  would be moved t
133f0 6f 20 70 61 67 65 20 34 20 62 79 20 74 68 65 20  o page 4 by the 
13400 0a 20 20 2a 2a 20 22 4f 50 5f 44 65 73 74 72 6f  .  ** "OP_Destro
13410 79 20 34 20 30 22 20 6f 70 63 6f 64 65 2e 20 54  y 4 0" opcode. T
13420 68 65 20 73 75 62 73 65 71 75 65 6e 74 20 22 4f  he subsequent "O
13430 50 5f 44 65 73 74 72 6f 79 20 35 20 30 22 20 77  P_Destroy 5 0" w
13440 6f 75 6c 64 20 68 69 74 0a 20 20 2a 2a 20 61 20  ould hit.  ** a 
13450 66 72 65 65 2d 6c 69 73 74 20 70 61 67 65 2e 0a  free-list page..
13460 20 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 20    */.  int iTab 
13470 3d 20 70 54 61 62 2d 3e 74 6e 75 6d 3b 0a 20 20  = pTab->tnum;.  
13480 69 6e 74 20 69 44 65 73 74 72 6f 79 65 64 20 3d  int iDestroyed =
13490 20 30 3b 0a 0a 20 20 77 68 69 6c 65 28 20 31 20   0;..  while( 1 
134a0 29 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49  ){.    Index *pI
134b0 64 78 3b 0a 20 20 20 20 69 6e 74 20 69 4c 61 72  dx;.    int iLar
134c0 67 65 73 74 20 3d 20 30 3b 0a 0a 20 20 20 20 69  gest = 0;..    i
134d0 66 28 20 69 44 65 73 74 72 6f 79 65 64 3d 3d 30  f( iDestroyed==0
134e0 20 7c 7c 20 69 54 61 62 3c 69 44 65 73 74 72 6f   || iTab<iDestro
134f0 79 65 64 20 29 7b 0a 20 20 20 20 20 20 69 4c 61  yed ){.      iLa
13500 72 67 65 73 74 20 3d 20 69 54 61 62 3b 0a 20 20  rgest = iTab;.  
13510 20 20 7d 0a 20 20 20 20 66 6f 72 28 70 49 64 78    }.    for(pIdx
13520 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70  =pTab->pIndex; p
13530 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e  Idx; pIdx=pIdx->
13540 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 6e  pNext){.      in
13550 74 20 69 49 64 78 20 3d 20 70 49 64 78 2d 3e 74  t iIdx = pIdx->t
13560 6e 75 6d 3b 0a 20 20 20 20 20 20 61 73 73 65 72  num;.      asser
13570 74 28 20 70 49 64 78 2d 3e 70 53 63 68 65 6d 61  t( pIdx->pSchema
13580 3d 3d 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 20  ==pTab->pSchema 
13590 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28 69 44  );.      if( (iD
135a0 65 73 74 72 6f 79 65 64 3d 3d 30 20 7c 7c 20 28  estroyed==0 || (
135b0 69 49 64 78 3c 69 44 65 73 74 72 6f 79 65 64 29  iIdx<iDestroyed)
135c0 29 20 26 26 20 69 49 64 78 3e 69 4c 61 72 67 65  ) && iIdx>iLarge
135d0 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 69 4c  st ){.        iL
135e0 61 72 67 65 73 74 20 3d 20 69 49 64 78 3b 0a 20  argest = iIdx;. 
135f0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
13600 20 69 66 28 20 69 4c 61 72 67 65 73 74 3d 3d 30   if( iLargest==0
13610 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
13620 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
13630 20 20 20 69 6e 74 20 69 44 62 20 3d 20 73 71 6c     int iDb = sql
13640 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65  ite3SchemaToInde
13650 78 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 54  x(pParse->db, pT
13660 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20  ab->pSchema);.  
13670 20 20 20 20 61 73 73 65 72 74 28 20 69 44 62 3e      assert( iDb>
13680 3d 30 20 26 26 20 69 44 62 3c 70 50 61 72 73 65  =0 && iDb<pParse
13690 2d 3e 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 20  ->db->nDb );.   
136a0 20 20 20 64 65 73 74 72 6f 79 52 6f 6f 74 50 61     destroyRootPa
136b0 67 65 28 70 50 61 72 73 65 2c 20 69 4c 61 72 67  ge(pParse, iLarg
136c0 65 73 74 2c 20 69 44 62 29 3b 0a 20 20 20 20 20  est, iDb);.     
136d0 20 69 44 65 73 74 72 6f 79 65 64 20 3d 20 69 4c   iDestroyed = iL
136e0 61 72 67 65 73 74 3b 0a 20 20 20 20 7d 0a 20 20  argest;.    }.  
136f0 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a  }.#endif.}../*.*
13700 2a 20 52 65 6d 6f 76 65 20 65 6e 74 72 69 65 73  * Remove entries
13710 20 66 72 6f 6d 20 74 68 65 20 73 71 6c 69 74 65   from the sqlite
13720 5f 73 74 61 74 4e 20 74 61 62 6c 65 73 20 28 66  _statN tables (f
13730 6f 72 20 4e 20 69 6e 20 28 31 2c 32 2c 33 29 29  or N in (1,2,3))
13740 0a 2a 2a 20 61 66 74 65 72 20 61 20 44 52 4f 50  .** after a DROP
13750 20 49 4e 44 45 58 20 6f 72 20 44 52 4f 50 20 54   INDEX or DROP T
13760 41 42 4c 45 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2f  ABLE command..*/
13770 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c  .static void sql
13780 69 74 65 33 43 6c 65 61 72 53 74 61 74 54 61 62  ite3ClearStatTab
13790 6c 65 73 28 0a 20 20 50 61 72 73 65 20 2a 70 50  les(.  Parse *pP
137a0 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 2f 2a  arse,         /*
137b0 20 54 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e   The parsing con
137c0 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20 69 44  text */.  int iD
137d0 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b,              
137e0 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65   /* The database
137f0 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 63 6f 6e   number */.  con
13800 73 74 20 63 68 61 72 20 2a 7a 54 79 70 65 2c 20  st char *zType, 
13810 20 20 20 20 2f 2a 20 22 69 64 78 22 20 6f 72 20      /* "idx" or 
13820 22 74 62 6c 22 20 2a 2f 0a 20 20 63 6f 6e 73 74  "tbl" */.  const
13830 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 20 20 20   char *zName    
13840 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 69 6e 64    /* Name of ind
13850 65 78 20 6f 72 20 74 61 62 6c 65 20 2a 2f 0a 29  ex or table */.)
13860 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 6f 6e  {.  int i;.  con
13870 73 74 20 63 68 61 72 20 2a 7a 44 62 4e 61 6d 65  st char *zDbName
13880 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61   = pParse->db->a
13890 44 62 5b 69 44 62 5d 2e 7a 44 62 53 4e 61 6d 65  Db[iDb].zDbSName
138a0 3b 0a 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 3d  ;.  for(i=1; i<=
138b0 34 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 68 61  4; i++){.    cha
138c0 72 20 7a 54 61 62 5b 32 34 5d 3b 0a 20 20 20 20  r zTab[24];.    
138d0 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
138e0 28 73 69 7a 65 6f 66 28 7a 54 61 62 29 2c 7a 54  (sizeof(zTab),zT
138f0 61 62 2c 22 73 71 6c 69 74 65 5f 73 74 61 74 25  ab,"sqlite_stat%
13900 64 22 2c 69 29 3b 0a 20 20 20 20 69 66 28 20 73  d",i);.    if( s
13910 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28  qlite3FindTable(
13920 70 50 61 72 73 65 2d 3e 64 62 2c 20 7a 54 61 62  pParse->db, zTab
13930 2c 20 7a 44 62 4e 61 6d 65 29 20 29 7b 0a 20 20  , zDbName) ){.  
13940 20 20 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65      sqlite3Neste
13950 64 50 61 72 73 65 28 70 50 61 72 73 65 2c 0a 20  dParse(pParse,. 
13960 20 20 20 20 20 20 20 22 44 45 4c 45 54 45 20 46         "DELETE F
13970 52 4f 4d 20 25 51 2e 25 73 20 57 48 45 52 45 20  ROM %Q.%s WHERE 
13980 25 73 3d 25 51 22 2c 0a 20 20 20 20 20 20 20 20  %s=%Q",.        
13990 7a 44 62 4e 61 6d 65 2c 20 7a 54 61 62 2c 20 7a  zDbName, zTab, z
139a0 54 79 70 65 2c 20 7a 4e 61 6d 65 0a 20 20 20 20  Type, zName.    
139b0 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d    );.    }.  }.}
139c0 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
139d0 20 63 6f 64 65 20 74 6f 20 64 72 6f 70 20 61 20   code to drop a 
139e0 74 61 62 6c 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73  table..*/.void s
139f0 71 6c 69 74 65 33 43 6f 64 65 44 72 6f 70 54 61  qlite3CodeDropTa
13a00 62 6c 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  ble(Parse *pPars
13a10 65 2c 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20  e, Table *pTab, 
13a20 69 6e 74 20 69 44 62 2c 20 69 6e 74 20 69 73 56  int iDb, int isV
13a30 69 65 77 29 7b 0a 20 20 56 64 62 65 20 2a 76 3b  iew){.  Vdbe *v;
13a40 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
13a50 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 54   pParse->db;.  T
13a60 72 69 67 67 65 72 20 2a 70 54 72 69 67 67 65 72  rigger *pTrigger
13a70 3b 0a 20 20 44 62 20 2a 70 44 62 20 3d 20 26 64  ;.  Db *pDb = &d
13a80 62 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a 0a 20 20  b->aDb[iDb];..  
13a90 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
13aa0 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 61 73  be(pParse);.  as
13ab0 73 65 72 74 28 20 76 21 3d 30 20 29 3b 0a 20 20  sert( v!=0 );.  
13ac0 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74  sqlite3BeginWrit
13ad0 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73  eOperation(pPars
13ae0 65 2c 20 31 2c 20 69 44 62 29 3b 0a 0a 23 69 66  e, 1, iDb);..#if
13af0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
13b00 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20  _VIRTUALTABLE.  
13b10 69 66 28 20 49 73 56 69 72 74 75 61 6c 28 70 54  if( IsVirtual(pT
13b20 61 62 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ab) ){.    sqlit
13b30 65 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20  e3VdbeAddOp0(v, 
13b40 4f 50 5f 56 42 65 67 69 6e 29 3b 0a 20 20 7d 0a  OP_VBegin);.  }.
13b50 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 44 72 6f  #endif..  /* Dro
13b60 70 20 61 6c 6c 20 74 72 69 67 67 65 72 73 20 61  p all triggers a
13b70 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
13b80 68 65 20 74 61 62 6c 65 20 62 65 69 6e 67 20 64  he table being d
13b90 72 6f 70 70 65 64 2e 20 43 6f 64 65 0a 20 20 2a  ropped. Code.  *
13ba0 2a 20 69 73 20 67 65 6e 65 72 61 74 65 64 20 74  * is generated t
13bb0 6f 20 72 65 6d 6f 76 65 20 65 6e 74 72 69 65 73  o remove entries
13bc0 20 66 72 6f 6d 20 73 71 6c 69 74 65 5f 6d 61 73   from sqlite_mas
13bd0 74 65 72 20 61 6e 64 2f 6f 72 0a 20 20 2a 2a 20  ter and/or.  ** 
13be0 73 71 6c 69 74 65 5f 74 65 6d 70 5f 6d 61 73 74  sqlite_temp_mast
13bf0 65 72 20 69 66 20 72 65 71 75 69 72 65 64 2e 0a  er if required..
13c00 20 20 2a 2f 0a 20 20 70 54 72 69 67 67 65 72 20    */.  pTrigger 
13c10 3d 20 73 71 6c 69 74 65 33 54 72 69 67 67 65 72  = sqlite3Trigger
13c20 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 54 61  List(pParse, pTa
13c30 62 29 3b 0a 20 20 77 68 69 6c 65 28 20 70 54 72  b);.  while( pTr
13c40 69 67 67 65 72 20 29 7b 0a 20 20 20 20 61 73 73  igger ){.    ass
13c50 65 72 74 28 20 70 54 72 69 67 67 65 72 2d 3e 70  ert( pTrigger->p
13c60 53 63 68 65 6d 61 3d 3d 70 54 61 62 2d 3e 70 53  Schema==pTab->pS
13c70 63 68 65 6d 61 20 7c 7c 20 0a 20 20 20 20 20 20  chema || .      
13c80 20 20 70 54 72 69 67 67 65 72 2d 3e 70 53 63 68    pTrigger->pSch
13c90 65 6d 61 3d 3d 64 62 2d 3e 61 44 62 5b 31 5d 2e  ema==db->aDb[1].
13ca0 70 53 63 68 65 6d 61 20 29 3b 0a 20 20 20 20 73  pSchema );.    s
13cb0 71 6c 69 74 65 33 44 72 6f 70 54 72 69 67 67 65  qlite3DropTrigge
13cc0 72 50 74 72 28 70 50 61 72 73 65 2c 20 70 54 72  rPtr(pParse, pTr
13cd0 69 67 67 65 72 29 3b 0a 20 20 20 20 70 54 72 69  igger);.    pTri
13ce0 67 67 65 72 20 3d 20 70 54 72 69 67 67 65 72 2d  gger = pTrigger-
13cf0 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 0a 23 69 66  >pNext;.  }..#if
13d00 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
13d10 5f 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 0a 20  _AUTOINCREMENT. 
13d20 20 2f 2a 20 52 65 6d 6f 76 65 20 61 6e 79 20 65   /* Remove any e
13d30 6e 74 72 69 65 73 20 6f 66 20 74 68 65 20 73 71  ntries of the sq
13d40 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 20 74 61  lite_sequence ta
13d50 62 6c 65 20 61 73 73 6f 63 69 61 74 65 64 20 77  ble associated w
13d60 69 74 68 0a 20 20 2a 2a 20 74 68 65 20 74 61 62  ith.  ** the tab
13d70 6c 65 20 62 65 69 6e 67 20 64 72 6f 70 70 65 64  le being dropped
13d80 2e 20 54 68 69 73 20 69 73 20 64 6f 6e 65 20 62  . This is done b
13d90 65 66 6f 72 65 20 74 68 65 20 74 61 62 6c 65 20  efore the table 
13da0 69 73 20 64 72 6f 70 70 65 64 0a 20 20 2a 2a 20  is dropped.  ** 
13db0 61 74 20 74 68 65 20 62 74 72 65 65 20 6c 65 76  at the btree lev
13dc0 65 6c 2c 20 69 6e 20 63 61 73 65 20 74 68 65 20  el, in case the 
13dd0 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 20  sqlite_sequence 
13de0 74 61 62 6c 65 20 6e 65 65 64 73 20 74 6f 0a 20  table needs to. 
13df0 20 2a 2a 20 6d 6f 76 65 20 61 73 20 61 20 72 65   ** move as a re
13e00 73 75 6c 74 20 6f 66 20 74 68 65 20 64 72 6f 70  sult of the drop
13e10 20 28 63 61 6e 20 68 61 70 70 65 6e 20 69 6e 20   (can happen in 
13e20 61 75 74 6f 2d 76 61 63 75 75 6d 20 6d 6f 64 65  auto-vacuum mode
13e30 29 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 54  )..  */.  if( pT
13e40 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 26 20 54  ab->tabFlags & T
13e50 46 5f 41 75 74 6f 69 6e 63 72 65 6d 65 6e 74 20  F_Autoincrement 
13e60 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4e 65  ){.    sqlite3Ne
13e70 73 74 65 64 50 61 72 73 65 28 70 50 61 72 73 65  stedParse(pParse
13e80 2c 0a 20 20 20 20 20 20 22 44 45 4c 45 54 45 20  ,.      "DELETE 
13e90 46 52 4f 4d 20 25 51 2e 73 71 6c 69 74 65 5f 73  FROM %Q.sqlite_s
13ea0 65 71 75 65 6e 63 65 20 57 48 45 52 45 20 6e 61  equence WHERE na
13eb0 6d 65 3d 25 51 22 2c 0a 20 20 20 20 20 20 70 44  me=%Q",.      pD
13ec0 62 2d 3e 7a 44 62 53 4e 61 6d 65 2c 20 70 54 61  b->zDbSName, pTa
13ed0 62 2d 3e 7a 4e 61 6d 65 0a 20 20 20 20 29 3b 0a  b->zName.    );.
13ee0 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a    }.#endif..  /*
13ef0 20 44 72 6f 70 20 61 6c 6c 20 53 51 4c 49 54 45   Drop all SQLITE
13f00 5f 4d 41 53 54 45 52 20 74 61 62 6c 65 20 61 6e  _MASTER table an
13f10 64 20 69 6e 64 65 78 20 65 6e 74 72 69 65 73 20  d index entries 
13f20 74 68 61 74 20 72 65 66 65 72 20 74 6f 20 74 68  that refer to th
13f30 65 0a 20 20 2a 2a 20 74 61 62 6c 65 2e 20 54 68  e.  ** table. Th
13f40 65 20 70 72 6f 67 72 61 6d 20 6e 61 6d 65 20 6c  e program name l
13f50 6f 6f 70 73 20 74 68 72 6f 75 67 68 20 74 68 65  oops through the
13f60 20 6d 61 73 74 65 72 20 74 61 62 6c 65 20 61 6e   master table an
13f70 64 20 64 65 6c 65 74 65 73 0a 20 20 2a 2a 20 65  d deletes.  ** e
13f80 76 65 72 79 20 72 6f 77 20 74 68 61 74 20 72 65  very row that re
13f90 66 65 72 73 20 74 6f 20 61 20 74 61 62 6c 65 20  fers to a table 
13fa0 6f 66 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65  of the same name
13fb0 20 61 73 20 74 68 65 20 6f 6e 65 20 62 65 69 6e   as the one bein
13fc0 67 0a 20 20 2a 2a 20 64 72 6f 70 70 65 64 2e 20  g.  ** dropped. 
13fd0 54 72 69 67 67 65 72 73 20 61 72 65 20 68 61 6e  Triggers are han
13fe0 64 6c 65 64 20 73 65 70 61 72 61 74 65 6c 79 20  dled separately 
13ff0 62 65 63 61 75 73 65 20 61 20 74 72 69 67 67 65  because a trigge
14000 72 20 63 61 6e 20 62 65 0a 20 20 2a 2a 20 63 72  r can be.  ** cr
14010 65 61 74 65 64 20 69 6e 20 74 68 65 20 74 65 6d  eated in the tem
14020 70 20 64 61 74 61 62 61 73 65 20 74 68 61 74 20  p database that 
14030 72 65 66 65 72 73 20 74 6f 20 61 20 74 61 62 6c  refers to a tabl
14040 65 20 69 6e 20 61 6e 6f 74 68 65 72 0a 20 20 2a  e in another.  *
14050 2a 20 64 61 74 61 62 61 73 65 2e 0a 20 20 2a 2f  * database..  */
14060 0a 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64  .  sqlite3Nested
14070 50 61 72 73 65 28 70 50 61 72 73 65 2c 20 0a 20  Parse(pParse, . 
14080 20 20 20 20 20 22 44 45 4c 45 54 45 20 46 52 4f       "DELETE FRO
14090 4d 20 25 51 2e 25 73 20 57 48 45 52 45 20 74 62  M %Q.%s WHERE tb
140a0 6c 5f 6e 61 6d 65 3d 25 51 20 61 6e 64 20 74 79  l_name=%Q and ty
140b0 70 65 21 3d 27 74 72 69 67 67 65 72 27 22 2c 0a  pe!='trigger'",.
140c0 20 20 20 20 20 20 70 44 62 2d 3e 7a 44 62 53 4e        pDb->zDbSN
140d0 61 6d 65 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c  ame, SCHEMA_TABL
140e0 45 28 69 44 62 29 2c 20 70 54 61 62 2d 3e 7a 4e  E(iDb), pTab->zN
140f0 61 6d 65 29 3b 0a 20 20 69 66 28 20 21 69 73 56  ame);.  if( !isV
14100 69 65 77 20 26 26 20 21 49 73 56 69 72 74 75 61  iew && !IsVirtua
14110 6c 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20 64  l(pTab) ){.    d
14120 65 73 74 72 6f 79 54 61 62 6c 65 28 70 50 61 72  estroyTable(pPar
14130 73 65 2c 20 70 54 61 62 29 3b 0a 20 20 7d 0a 0a  se, pTab);.  }..
14140 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65 20    /* Remove the 
14150 74 61 62 6c 65 20 65 6e 74 72 79 20 66 72 6f 6d  table entry from
14160 20 53 51 4c 69 74 65 27 73 20 69 6e 74 65 72 6e   SQLite's intern
14170 61 6c 20 73 63 68 65 6d 61 20 61 6e 64 20 6d 6f  al schema and mo
14180 64 69 66 79 0a 20 20 2a 2a 20 74 68 65 20 73 63  dify.  ** the sc
14190 68 65 6d 61 20 63 6f 6f 6b 69 65 2e 0a 20 20 2a  hema cookie..  *
141a0 2f 0a 20 20 69 66 28 20 49 73 56 69 72 74 75 61  /.  if( IsVirtua
141b0 6c 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20 73  l(pTab) ){.    s
141c0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
141d0 28 76 2c 20 4f 50 5f 56 44 65 73 74 72 6f 79 2c  (v, OP_VDestroy,
141e0 20 69 44 62 2c 20 30 2c 20 30 2c 20 70 54 61 62   iDb, 0, 0, pTab
141f0 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 7d  ->zName, 0);.  }
14200 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
14210 64 4f 70 34 28 76 2c 20 4f 50 5f 44 72 6f 70 54  dOp4(v, OP_DropT
14220 61 62 6c 65 2c 20 69 44 62 2c 20 30 2c 20 30 2c  able, iDb, 0, 0,
14230 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 30 29   pTab->zName, 0)
14240 3b 0a 20 20 73 71 6c 69 74 65 33 43 68 61 6e 67  ;.  sqlite3Chang
14250 65 43 6f 6f 6b 69 65 28 70 50 61 72 73 65 2c 20  eCookie(pParse, 
14260 69 44 62 29 3b 0a 20 20 73 71 6c 69 74 65 56 69  iDb);.  sqliteVi
14270 65 77 52 65 73 65 74 41 6c 6c 28 64 62 2c 20 69  ewResetAll(db, i
14280 44 62 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  Db);.}../*.** Th
14290 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
142a0 6c 6c 65 64 20 74 6f 20 64 6f 20 74 68 65 20 77  lled to do the w
142b0 6f 72 6b 20 6f 66 20 61 20 44 52 4f 50 20 54 41  ork of a DROP TA
142c0 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a  BLE statement..*
142d0 2a 20 70 4e 61 6d 65 20 69 73 20 74 68 65 20 6e  * pName is the n
142e0 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65  ame of the table
142f0 20 74 6f 20 62 65 20 64 72 6f 70 70 65 64 2e 0a   to be dropped..
14300 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 44  */.void sqlite3D
14310 72 6f 70 54 61 62 6c 65 28 50 61 72 73 65 20 2a  ropTable(Parse *
14320 70 50 61 72 73 65 2c 20 53 72 63 4c 69 73 74 20  pParse, SrcList 
14330 2a 70 4e 61 6d 65 2c 20 69 6e 74 20 69 73 56 69  *pName, int isVi
14340 65 77 2c 20 69 6e 74 20 6e 6f 45 72 72 29 7b 0a  ew, int noErr){.
14350 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20    Table *pTab;. 
14360 20 56 64 62 65 20 2a 76 3b 0a 20 20 73 71 6c 69   Vdbe *v;.  sqli
14370 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
14380 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 69 44 62 3b  ->db;.  int iDb;
14390 0a 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c  ..  if( db->mall
143a0 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
143b0 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74  goto exit_drop_t
143c0 61 62 6c 65 3b 0a 20 20 7d 0a 20 20 61 73 73 65  able;.  }.  asse
143d0 72 74 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  rt( pParse->nErr
143e0 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
143f0 20 70 4e 61 6d 65 2d 3e 6e 53 72 63 3d 3d 31 20   pName->nSrc==1 
14400 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  );.  if( sqlite3
14410 52 65 61 64 53 63 68 65 6d 61 28 70 50 61 72 73  ReadSchema(pPars
14420 65 29 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 64  e) ) goto exit_d
14430 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 69 66 28  rop_table;.  if(
14440 20 6e 6f 45 72 72 20 29 20 64 62 2d 3e 73 75 70   noErr ) db->sup
14450 70 72 65 73 73 45 72 72 2b 2b 3b 0a 20 20 61 73  pressErr++;.  as
14460 73 65 72 74 28 20 69 73 56 69 65 77 3d 3d 30 20  sert( isView==0 
14470 7c 7c 20 69 73 56 69 65 77 3d 3d 4c 4f 43 41 54  || isView==LOCAT
14480 45 5f 56 49 45 57 20 29 3b 0a 20 20 70 54 61 62  E_VIEW );.  pTab
14490 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65   = sqlite3Locate
144a0 54 61 62 6c 65 49 74 65 6d 28 70 50 61 72 73 65  TableItem(pParse
144b0 2c 20 69 73 56 69 65 77 2c 20 26 70 4e 61 6d 65  , isView, &pName
144c0 2d 3e 61 5b 30 5d 29 3b 0a 20 20 69 66 28 20 6e  ->a[0]);.  if( n
144d0 6f 45 72 72 20 29 20 64 62 2d 3e 73 75 70 70 72  oErr ) db->suppr
144e0 65 73 73 45 72 72 2d 2d 3b 0a 0a 20 20 69 66 28  essErr--;..  if(
144f0 20 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20   pTab==0 ){.    
14500 69 66 28 20 6e 6f 45 72 72 20 29 20 73 71 6c 69  if( noErr ) sqli
14510 74 65 33 43 6f 64 65 56 65 72 69 66 79 4e 61 6d  te3CodeVerifyNam
14520 65 64 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c  edSchema(pParse,
14530 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 44 61   pName->a[0].zDa
14540 74 61 62 61 73 65 29 3b 0a 20 20 20 20 67 6f 74  tabase);.    got
14550 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c  o exit_drop_tabl
14560 65 3b 0a 20 20 7d 0a 20 20 69 44 62 20 3d 20 73  e;.  }.  iDb = s
14570 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e  qlite3SchemaToIn
14580 64 65 78 28 64 62 2c 20 70 54 61 62 2d 3e 70 53  dex(db, pTab->pS
14590 63 68 65 6d 61 29 3b 0a 20 20 61 73 73 65 72 74  chema);.  assert
145a0 28 20 69 44 62 3e 3d 30 20 26 26 20 69 44 62 3c  ( iDb>=0 && iDb<
145b0 64 62 2d 3e 6e 44 62 20 29 3b 0a 0a 20 20 2f 2a  db->nDb );..  /*
145c0 20 49 66 20 70 54 61 62 20 69 73 20 61 20 76 69   If pTab is a vi
145d0 72 74 75 61 6c 20 74 61 62 6c 65 2c 20 63 61 6c  rtual table, cal
145e0 6c 20 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e  l ViewGetColumnN
145f0 61 6d 65 73 28 29 20 74 6f 20 65 6e 73 75 72 65  ames() to ensure
14600 0a 20 20 2a 2a 20 69 74 20 69 73 20 69 6e 69 74  .  ** it is init
14610 69 61 6c 69 7a 65 64 2e 0a 20 20 2a 2f 0a 20 20  ialized..  */.  
14620 69 66 28 20 49 73 56 69 72 74 75 61 6c 28 70 54  if( IsVirtual(pT
14630 61 62 29 20 26 26 20 73 71 6c 69 74 65 33 56 69  ab) && sqlite3Vi
14640 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73  ewGetColumnNames
14650 28 70 50 61 72 73 65 2c 20 70 54 61 62 29 20 29  (pParse, pTab) )
14660 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f  {.    goto exit_
14670 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a  drop_table;.  }.
14680 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
14690 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f  MIT_AUTHORIZATIO
146a0 4e 0a 20 20 7b 0a 20 20 20 20 69 6e 74 20 63 6f  N.  {.    int co
146b0 64 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  de;.    const ch
146c0 61 72 20 2a 7a 54 61 62 20 3d 20 53 43 48 45 4d  ar *zTab = SCHEM
146d0 41 5f 54 41 42 4c 45 28 69 44 62 29 3b 0a 20 20  A_TABLE(iDb);.  
146e0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44    const char *zD
146f0 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d  b = db->aDb[iDb]
14700 2e 7a 44 62 53 4e 61 6d 65 3b 0a 20 20 20 20 63  .zDbSName;.    c
14710 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 72 67 32  onst char *zArg2
14720 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 73 71   = 0;.    if( sq
14730 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70  lite3AuthCheck(p
14740 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 44 45  Parse, SQLITE_DE
14750 4c 45 54 45 2c 20 7a 54 61 62 2c 20 30 2c 20 7a  LETE, zTab, 0, z
14760 44 62 29 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  Db)){.      goto
14770 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65   exit_drop_table
14780 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
14790 69 73 56 69 65 77 20 29 7b 0a 20 20 20 20 20 20  isView ){.      
147a0 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42  if( !OMIT_TEMPDB
147b0 20 26 26 20 69 44 62 3d 3d 31 20 29 7b 0a 20 20   && iDb==1 ){.  
147c0 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c        code = SQL
147d0 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 56 49  ITE_DROP_TEMP_VI
147e0 45 57 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  EW;.      }else{
147f0 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20 3d 20  .        code = 
14800 53 51 4c 49 54 45 5f 44 52 4f 50 5f 56 49 45 57  SQLITE_DROP_VIEW
14810 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66 6e 64 65  ;.      }.#ifnde
14820 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
14830 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 7d  RTUALTABLE.    }
14840 65 6c 73 65 20 69 66 28 20 49 73 56 69 72 74 75  else if( IsVirtu
14850 61 6c 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20  al(pTab) ){.    
14860 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f    code = SQLITE_
14870 44 52 4f 50 5f 56 54 41 42 4c 45 3b 0a 20 20 20  DROP_VTABLE;.   
14880 20 20 20 7a 41 72 67 32 20 3d 20 73 71 6c 69 74     zArg2 = sqlit
14890 65 33 47 65 74 56 54 61 62 6c 65 28 64 62 2c 20  e3GetVTable(db, 
148a0 70 54 61 62 29 2d 3e 70 4d 6f 64 2d 3e 7a 4e 61  pTab)->pMod->zNa
148b0 6d 65 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d  me;.#endif.    }
148c0 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 66 28 20  else{.      if( 
148d0 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26 26 20  !OMIT_TEMPDB && 
148e0 69 44 62 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20  iDb==1 ){.      
148f0 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f    code = SQLITE_
14900 44 52 4f 50 5f 54 45 4d 50 5f 54 41 42 4c 45 3b  DROP_TEMP_TABLE;
14910 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
14920 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c        code = SQL
14930 49 54 45 5f 44 52 4f 50 5f 54 41 42 4c 45 3b 0a  ITE_DROP_TABLE;.
14940 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
14950 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74    if( sqlite3Aut
14960 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 63  hCheck(pParse, c
14970 6f 64 65 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  ode, pTab->zName
14980 2c 20 7a 41 72 67 32 2c 20 7a 44 62 29 20 29 7b  , zArg2, zDb) ){
14990 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74  .      goto exit
149a0 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 20  _drop_table;.   
149b0 20 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74   }.    if( sqlit
149c0 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72  e3AuthCheck(pPar
149d0 73 65 2c 20 53 51 4c 49 54 45 5f 44 45 4c 45 54  se, SQLITE_DELET
149e0 45 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20  E, pTab->zName, 
149f0 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20  0, zDb) ){.     
14a00 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f   goto exit_drop_
14a10 74 61 62 6c 65 3b 0a 20 20 20 20 7d 0a 20 20 7d  table;.    }.  }
14a20 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 73 71  .#endif.  if( sq
14a30 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28 70 54  lite3StrNICmp(pT
14a40 61 62 2d 3e 7a 4e 61 6d 65 2c 20 22 73 71 6c 69  ab->zName, "sqli
14a50 74 65 5f 22 2c 20 37 29 3d 3d 30 20 0a 20 20 20  te_", 7)==0 .   
14a60 20 26 26 20 73 71 6c 69 74 65 33 53 74 72 4e 49   && sqlite3StrNI
14a70 43 6d 70 28 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c  Cmp(pTab->zName,
14a80 20 22 73 71 6c 69 74 65 5f 73 74 61 74 22 2c 20   "sqlite_stat", 
14a90 31 31 29 21 3d 30 20 29 7b 0a 20 20 20 20 73 71  11)!=0 ){.    sq
14aa0 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
14ab0 61 72 73 65 2c 20 22 74 61 62 6c 65 20 25 73 20  arse, "table %s 
14ac0 6d 61 79 20 6e 6f 74 20 62 65 20 64 72 6f 70 70  may not be dropp
14ad0 65 64 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  ed", pTab->zName
14ae0 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74  );.    goto exit
14af0 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 7d  _drop_table;.  }
14b00 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
14b10 5f 4f 4d 49 54 5f 56 49 45 57 0a 20 20 2f 2a 20  _OMIT_VIEW.  /* 
14b20 45 6e 73 75 72 65 20 44 52 4f 50 20 54 41 42 4c  Ensure DROP TABL
14b30 45 20 69 73 20 6e 6f 74 20 75 73 65 64 20 6f 6e  E is not used on
14b40 20 61 20 76 69 65 77 2c 20 61 6e 64 20 44 52 4f   a view, and DRO
14b50 50 20 56 49 45 57 20 69 73 20 6e 6f 74 20 75 73  P VIEW is not us
14b60 65 64 0a 20 20 2a 2a 20 6f 6e 20 61 20 74 61 62  ed.  ** on a tab
14b70 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69  le..  */.  if( i
14b80 73 56 69 65 77 20 26 26 20 70 54 61 62 2d 3e 70  sView && pTab->p
14b90 53 65 6c 65 63 74 3d 3d 30 20 29 7b 0a 20 20 20  Select==0 ){.   
14ba0 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
14bb0 28 70 50 61 72 73 65 2c 20 22 75 73 65 20 44 52  (pParse, "use DR
14bc0 4f 50 20 54 41 42 4c 45 20 74 6f 20 64 65 6c 65  OP TABLE to dele
14bd0 74 65 20 74 61 62 6c 65 20 25 73 22 2c 20 70 54  te table %s", pT
14be0 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ab->zName);.    
14bf0 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74  goto exit_drop_t
14c00 61 62 6c 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20  able;.  }.  if( 
14c10 21 69 73 56 69 65 77 20 26 26 20 70 54 61 62 2d  !isView && pTab-
14c20 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20  >pSelect ){.    
14c30 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
14c40 70 50 61 72 73 65 2c 20 22 75 73 65 20 44 52 4f  pParse, "use DRO
14c50 50 20 56 49 45 57 20 74 6f 20 64 65 6c 65 74 65  P VIEW to delete
14c60 20 76 69 65 77 20 25 73 22 2c 20 70 54 61 62 2d   view %s", pTab-
14c70 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 67 6f 74  >zName);.    got
14c80 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c  o exit_drop_tabl
14c90 65 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  e;.  }.#endif.. 
14ca0 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
14cb0 65 20 74 6f 20 72 65 6d 6f 76 65 20 74 68 65 20  e to remove the 
14cc0 74 61 62 6c 65 20 66 72 6f 6d 20 74 68 65 20 6d  table from the m
14cd0 61 73 74 65 72 20 74 61 62 6c 65 0a 20 20 2a 2a  aster table.  **
14ce0 20 6f 6e 20 64 69 73 6b 2e 0a 20 20 2a 2f 0a 20   on disk..  */. 
14cf0 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56   v = sqlite3GetV
14d00 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69  dbe(pParse);.  i
14d10 66 28 20 76 20 29 7b 0a 20 20 20 20 73 71 6c 69  f( v ){.    sqli
14d20 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65  te3BeginWriteOpe
14d30 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 31  ration(pParse, 1
14d40 2c 20 69 44 62 29 3b 0a 20 20 20 20 73 71 6c 69  , iDb);.    sqli
14d50 74 65 33 43 6c 65 61 72 53 74 61 74 54 61 62 6c  te3ClearStatTabl
14d60 65 73 28 70 50 61 72 73 65 2c 20 69 44 62 2c 20  es(pParse, iDb, 
14d70 22 74 62 6c 22 2c 20 70 54 61 62 2d 3e 7a 4e 61  "tbl", pTab->zNa
14d80 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  me);.    sqlite3
14d90 46 6b 44 72 6f 70 54 61 62 6c 65 28 70 50 61 72  FkDropTable(pPar
14da0 73 65 2c 20 70 4e 61 6d 65 2c 20 70 54 61 62 29  se, pName, pTab)
14db0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64  ;.    sqlite3Cod
14dc0 65 44 72 6f 70 54 61 62 6c 65 28 70 50 61 72 73  eDropTable(pPars
14dd0 65 2c 20 70 54 61 62 2c 20 69 44 62 2c 20 69 73  e, pTab, iDb, is
14de0 56 69 65 77 29 3b 0a 20 20 7d 0a 0a 65 78 69 74  View);.  }..exit
14df0 5f 64 72 6f 70 5f 74 61 62 6c 65 3a 0a 20 20 73  _drop_table:.  s
14e00 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c  qlite3SrcListDel
14e10 65 74 65 28 64 62 2c 20 70 4e 61 6d 65 29 3b 0a  ete(db, pName);.
14e20 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
14e30 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
14e40 74 6f 20 63 72 65 61 74 65 20 61 20 6e 65 77 20  to create a new 
14e50 66 6f 72 65 69 67 6e 20 6b 65 79 20 6f 6e 20 74  foreign key on t
14e60 68 65 20 74 61 62 6c 65 0a 2a 2a 20 63 75 72 72  he table.** curr
14e70 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73  ently under cons
14e80 74 72 75 63 74 69 6f 6e 2e 20 20 70 46 72 6f 6d  truction.  pFrom
14e90 43 6f 6c 20 64 65 74 65 72 6d 69 6e 65 73 20 77  Col determines w
14ea0 68 69 63 68 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20  hich columns.** 
14eb0 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 74  in the current t
14ec0 61 62 6c 65 20 70 6f 69 6e 74 20 74 6f 20 74 68  able point to th
14ed0 65 20 66 6f 72 65 69 67 6e 20 6b 65 79 2e 20 20  e foreign key.  
14ee0 49 66 20 70 46 72 6f 6d 43 6f 6c 3d 3d 30 20 74  If pFromCol==0 t
14ef0 68 65 6e 0a 2a 2a 20 63 6f 6e 6e 65 63 74 20 74  hen.** connect t
14f00 68 65 20 6b 65 79 20 74 6f 20 74 68 65 20 6c 61  he key to the la
14f10 73 74 20 63 6f 6c 75 6d 6e 20 69 6e 73 65 72 74  st column insert
14f20 65 64 2e 20 20 70 54 6f 20 69 73 20 74 68 65 20  ed.  pTo is the 
14f30 6e 61 6d 65 20 6f 66 0a 2a 2a 20 74 68 65 20 74  name of.** the t
14f40 61 62 6c 65 20 72 65 66 65 72 72 65 64 20 74 6f  able referred to
14f50 20 28 61 2e 6b 2e 61 20 74 68 65 20 22 70 61 72   (a.k.a the "par
14f60 65 6e 74 22 20 74 61 62 6c 65 29 2e 20 20 70 54  ent" table).  pT
14f70 6f 43 6f 6c 20 69 73 20 61 20 6c 69 73 74 0a 2a  oCol is a list.*
14f80 2a 20 6f 66 20 74 61 62 6c 65 73 20 69 6e 20 74  * of tables in t
14f90 68 65 20 70 61 72 65 6e 74 20 70 54 6f 20 74 61  he parent pTo ta
14fa0 62 6c 65 2e 20 20 66 6c 61 67 73 20 63 6f 6e 74  ble.  flags cont
14fb0 61 69 6e 73 20 61 6c 6c 0a 2a 2a 20 69 6e 66 6f  ains all.** info
14fc0 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68  rmation about th
14fd0 65 20 63 6f 6e 66 6c 69 63 74 20 72 65 73 6f 6c  e conflict resol
14fe0 75 74 69 6f 6e 20 61 6c 67 6f 72 69 74 68 6d 73  ution algorithms
14ff0 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 69 6e   specified.** in
15000 20 74 68 65 20 4f 4e 20 44 45 4c 45 54 45 2c 20   the ON DELETE, 
15010 4f 4e 20 55 50 44 41 54 45 20 61 6e 64 20 4f 4e  ON UPDATE and ON
15020 20 49 4e 53 45 52 54 20 63 6c 61 75 73 65 73 2e   INSERT clauses.
15030 0a 2a 2a 0a 2a 2a 20 41 6e 20 46 4b 65 79 20 73  .**.** An FKey s
15040 74 72 75 63 74 75 72 65 20 69 73 20 63 72 65 61  tructure is crea
15050 74 65 64 20 61 6e 64 20 61 64 64 65 64 20 74 6f  ted and added to
15060 20 74 68 65 20 74 61 62 6c 65 20 63 75 72 72 65   the table curre
15070 6e 74 6c 79 0a 2a 2a 20 75 6e 64 65 72 20 63 6f  ntly.** under co
15080 6e 73 74 72 75 63 74 69 6f 6e 20 69 6e 20 74 68  nstruction in th
15090 65 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  e pParse->pNewTa
150a0 62 6c 65 20 66 69 65 6c 64 2e 0a 2a 2a 0a 2a 2a  ble field..**.**
150b0 20 54 68 65 20 66 6f 72 65 69 67 6e 20 6b 65 79   The foreign key
150c0 20 69 73 20 73 65 74 20 66 6f 72 20 49 4d 4d 45   is set for IMME
150d0 44 49 41 54 45 20 70 72 6f 63 65 73 73 69 6e 67  DIATE processing
150e0 2e 20 20 41 20 73 75 62 73 65 71 75 65 6e 74 20  .  A subsequent 
150f0 63 61 6c 6c 0a 2a 2a 20 74 6f 20 73 71 6c 69 74  call.** to sqlit
15100 65 33 44 65 66 65 72 46 6f 72 65 69 67 6e 4b 65  e3DeferForeignKe
15110 79 28 29 20 6d 69 67 68 74 20 63 68 61 6e 67 65  y() might change
15120 20 74 68 69 73 20 74 6f 20 44 45 46 45 52 52 45   this to DEFERRE
15130 44 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  D..*/.void sqlit
15140 65 33 43 72 65 61 74 65 46 6f 72 65 69 67 6e 4b  e3CreateForeignK
15150 65 79 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ey(.  Parse *pPa
15160 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 50 61  rse,       /* Pa
15170 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
15180 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 46 72  .  ExprList *pFr
15190 6f 6d 43 6f 6c 2c 20 20 2f 2a 20 43 6f 6c 75 6d  omCol,  /* Colum
151a0 6e 73 20 69 6e 20 74 68 69 73 20 74 61 62 6c 65  ns in this table
151b0 20 74 68 61 74 20 70 6f 69 6e 74 20 74 6f 20 6f   that point to o
151c0 74 68 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20  ther table */.  
151d0 54 6f 6b 65 6e 20 2a 70 54 6f 2c 20 20 20 20 20  Token *pTo,     
151e0 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
151f0 74 68 65 20 6f 74 68 65 72 20 74 61 62 6c 65 20  the other table 
15200 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
15210 54 6f 43 6f 6c 2c 20 20 20 20 2f 2a 20 43 6f 6c  ToCol,    /* Col
15220 75 6d 6e 73 20 69 6e 20 74 68 65 20 6f 74 68 65  umns in the othe
15230 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74  r table */.  int
15240 20 66 6c 61 67 73 20 20 20 20 20 20 20 20 20 20   flags          
15250 20 20 2f 2a 20 43 6f 6e 66 6c 69 63 74 20 72 65    /* Conflict re
15260 73 6f 6c 75 74 69 6f 6e 20 61 6c 67 6f 72 69 74  solution algorit
15270 68 6d 73 2e 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c  hms. */.){.  sql
15280 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
15290 65 2d 3e 64 62 3b 0a 23 69 66 6e 64 65 66 20 53  e->db;.#ifndef S
152a0 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49  QLITE_OMIT_FOREI
152b0 47 4e 5f 4b 45 59 0a 20 20 46 4b 65 79 20 2a 70  GN_KEY.  FKey *p
152c0 46 4b 65 79 20 3d 20 30 3b 0a 20 20 46 4b 65 79  FKey = 0;.  FKey
152d0 20 2a 70 4e 65 78 74 54 6f 3b 0a 20 20 54 61 62   *pNextTo;.  Tab
152e0 6c 65 20 2a 70 20 3d 20 70 50 61 72 73 65 2d 3e  le *p = pParse->
152f0 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 69 6e 74  pNewTable;.  int
15300 20 6e 42 79 74 65 3b 0a 20 20 69 6e 74 20 69 3b   nByte;.  int i;
15310 0a 20 20 69 6e 74 20 6e 43 6f 6c 3b 0a 20 20 63  .  int nCol;.  c
15320 68 61 72 20 2a 7a 3b 0a 0a 20 20 61 73 73 65 72  har *z;..  asser
15330 74 28 20 70 54 6f 21 3d 30 20 29 3b 0a 20 20 69  t( pTo!=0 );.  i
15340 66 28 20 70 3d 3d 30 20 7c 7c 20 49 4e 5f 44 45  f( p==0 || IN_DE
15350 43 4c 41 52 45 5f 56 54 41 42 20 29 20 67 6f 74  CLARE_VTAB ) got
15360 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 69 66 28 20  o fk_end;.  if( 
15370 70 46 72 6f 6d 43 6f 6c 3d 3d 30 20 29 7b 0a 20  pFromCol==0 ){. 
15380 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 2d     int iCol = p-
15390 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 20 20 69 66 28  >nCol-1;.    if(
153a0 20 4e 45 56 45 52 28 69 43 6f 6c 3c 30 29 20 29   NEVER(iCol<0) )
153b0 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20   goto fk_end;.  
153c0 20 20 69 66 28 20 70 54 6f 43 6f 6c 20 26 26 20    if( pToCol && 
153d0 70 54 6f 43 6f 6c 2d 3e 6e 45 78 70 72 21 3d 31  pToCol->nExpr!=1
153e0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
153f0 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
15400 2c 20 22 66 6f 72 65 69 67 6e 20 6b 65 79 20 6f  , "foreign key o
15410 6e 20 25 73 22 0a 20 20 20 20 20 20 20 20 20 22  n %s".         "
15420 20 73 68 6f 75 6c 64 20 72 65 66 65 72 65 6e 63   should referenc
15430 65 20 6f 6e 6c 79 20 6f 6e 65 20 63 6f 6c 75 6d  e only one colum
15440 6e 20 6f 66 20 74 61 62 6c 65 20 25 54 22 2c 0a  n of table %T",.
15450 20 20 20 20 20 20 20 20 20 70 2d 3e 61 43 6f 6c           p->aCol
15460 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 2c 20 70 54  [iCol].zName, pT
15470 6f 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 66  o);.      goto f
15480 6b 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 20  k_end;.    }.   
15490 20 6e 43 6f 6c 20 3d 20 31 3b 0a 20 20 7d 65 6c   nCol = 1;.  }el
154a0 73 65 20 69 66 28 20 70 54 6f 43 6f 6c 20 26 26  se if( pToCol &&
154b0 20 70 54 6f 43 6f 6c 2d 3e 6e 45 78 70 72 21 3d   pToCol->nExpr!=
154c0 70 46 72 6f 6d 43 6f 6c 2d 3e 6e 45 78 70 72 20  pFromCol->nExpr 
154d0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
154e0 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 0a 20  rorMsg(pParse,. 
154f0 20 20 20 20 20 20 20 22 6e 75 6d 62 65 72 20 6f         "number o
15500 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 66 6f 72  f columns in for
15510 65 69 67 6e 20 6b 65 79 20 64 6f 65 73 20 6e 6f  eign key does no
15520 74 20 6d 61 74 63 68 20 74 68 65 20 6e 75 6d 62  t match the numb
15530 65 72 20 6f 66 20 22 0a 20 20 20 20 20 20 20 20  er of ".        
15540 22 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20  "columns in the 
15550 72 65 66 65 72 65 6e 63 65 64 20 74 61 62 6c 65  referenced table
15560 22 29 3b 0a 20 20 20 20 67 6f 74 6f 20 66 6b 5f  ");.    goto fk_
15570 65 6e 64 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  end;.  }else{.  
15580 20 20 6e 43 6f 6c 20 3d 20 70 46 72 6f 6d 43 6f    nCol = pFromCo
15590 6c 2d 3e 6e 45 78 70 72 3b 0a 20 20 7d 0a 20 20  l->nExpr;.  }.  
155a0 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f 66 28 2a  nByte = sizeof(*
155b0 70 46 4b 65 79 29 20 2b 20 28 6e 43 6f 6c 2d 31  pFKey) + (nCol-1
155c0 29 2a 73 69 7a 65 6f 66 28 70 46 4b 65 79 2d 3e  )*sizeof(pFKey->
155d0 61 43 6f 6c 5b 30 5d 29 20 2b 20 70 54 6f 2d 3e  aCol[0]) + pTo->
155e0 6e 20 2b 20 31 3b 0a 20 20 69 66 28 20 70 54 6f  n + 1;.  if( pTo
155f0 43 6f 6c 20 29 7b 0a 20 20 20 20 66 6f 72 28 69  Col ){.    for(i
15600 3d 30 3b 20 69 3c 70 54 6f 43 6f 6c 2d 3e 6e 45  =0; i<pToCol->nE
15610 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  xpr; i++){.     
15620 20 6e 42 79 74 65 20 2b 3d 20 73 71 6c 69 74 65   nByte += sqlite
15630 33 53 74 72 6c 65 6e 33 30 28 70 54 6f 43 6f 6c  3Strlen30(pToCol
15640 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 20 2b 20  ->a[i].zName) + 
15650 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70  1;.    }.  }.  p
15660 46 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 44 62  FKey = sqlite3Db
15670 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 6e  MallocZero(db, n
15680 42 79 74 65 20 29 3b 0a 20 20 69 66 28 20 70 46  Byte );.  if( pF
15690 4b 65 79 3d 3d 30 20 29 7b 0a 20 20 20 20 67 6f  Key==0 ){.    go
156a0 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 7d 0a 20  to fk_end;.  }. 
156b0 20 70 46 4b 65 79 2d 3e 70 46 72 6f 6d 20 3d 20   pFKey->pFrom = 
156c0 70 3b 0a 20 20 70 46 4b 65 79 2d 3e 70 4e 65 78  p;.  pFKey->pNex
156d0 74 46 72 6f 6d 20 3d 20 70 2d 3e 70 46 4b 65 79  tFrom = p->pFKey
156e0 3b 0a 20 20 7a 20 3d 20 28 63 68 61 72 2a 29 26  ;.  z = (char*)&
156f0 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b 6e 43 6f 6c  pFKey->aCol[nCol
15700 5d 3b 0a 20 20 70 46 4b 65 79 2d 3e 7a 54 6f 20  ];.  pFKey->zTo 
15710 3d 20 7a 3b 0a 20 20 6d 65 6d 63 70 79 28 7a 2c  = z;.  memcpy(z,
15720 20 70 54 6f 2d 3e 7a 2c 20 70 54 6f 2d 3e 6e 29   pTo->z, pTo->n)
15730 3b 0a 20 20 7a 5b 70 54 6f 2d 3e 6e 5d 20 3d 20  ;.  z[pTo->n] = 
15740 30 3b 0a 20 20 73 71 6c 69 74 65 33 44 65 71 75  0;.  sqlite3Dequ
15750 6f 74 65 28 7a 29 3b 0a 20 20 7a 20 2b 3d 20 70  ote(z);.  z += p
15760 54 6f 2d 3e 6e 2b 31 3b 0a 20 20 70 46 4b 65 79  To->n+1;.  pFKey
15770 2d 3e 6e 43 6f 6c 20 3d 20 6e 43 6f 6c 3b 0a 20  ->nCol = nCol;. 
15780 20 69 66 28 20 70 46 72 6f 6d 43 6f 6c 3d 3d 30   if( pFromCol==0
15790 20 29 7b 0a 20 20 20 20 70 46 4b 65 79 2d 3e 61   ){.    pFKey->a
157a0 43 6f 6c 5b 30 5d 2e 69 46 72 6f 6d 20 3d 20 70  Col[0].iFrom = p
157b0 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 7d 65 6c 73  ->nCol-1;.  }els
157c0 65 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  e{.    for(i=0; 
157d0 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  i<nCol; i++){.  
157e0 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20      int j;.     
157f0 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 2d 3e 6e   for(j=0; j<p->n
15800 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  Col; j++){.     
15810 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74     if( sqlite3St
15820 72 49 43 6d 70 28 70 2d 3e 61 43 6f 6c 5b 6a 5d  rICmp(p->aCol[j]
15830 2e 7a 4e 61 6d 65 2c 20 70 46 72 6f 6d 43 6f 6c  .zName, pFromCol
15840 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30  ->a[i].zName)==0
15850 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 46   ){.          pF
15860 4b 65 79 2d 3e 61 43 6f 6c 5b 69 5d 2e 69 46 72  Key->aCol[i].iFr
15870 6f 6d 20 3d 20 6a 3b 0a 20 20 20 20 20 20 20 20  om = j;.        
15880 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
15890 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
158a0 20 69 66 28 20 6a 3e 3d 70 2d 3e 6e 43 6f 6c 20   if( j>=p->nCol 
158b0 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
158c0 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
158d0 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20 22 75  e, .          "u
158e0 6e 6b 6e 6f 77 6e 20 63 6f 6c 75 6d 6e 20 5c 22  nknown column \"
158f0 25 73 5c 22 20 69 6e 20 66 6f 72 65 69 67 6e 20  %s\" in foreign 
15900 6b 65 79 20 64 65 66 69 6e 69 74 69 6f 6e 22 2c  key definition",
15910 20 0a 20 20 20 20 20 20 20 20 20 20 70 46 72 6f   .          pFro
15920 6d 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  mCol->a[i].zName
15930 29 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  );.        goto 
15940 66 6b 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a  fk_end;.      }.
15950 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
15960 70 54 6f 43 6f 6c 20 29 7b 0a 20 20 20 20 66 6f  pToCol ){.    fo
15970 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69  r(i=0; i<nCol; i
15980 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e  ++){.      int n
15990 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
159a0 33 30 28 70 54 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e  30(pToCol->a[i].
159b0 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 70 46  zName);.      pF
159c0 4b 65 79 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 43 6f  Key->aCol[i].zCo
159d0 6c 20 3d 20 7a 3b 0a 20 20 20 20 20 20 6d 65 6d  l = z;.      mem
159e0 63 70 79 28 7a 2c 20 70 54 6f 43 6f 6c 2d 3e 61  cpy(z, pToCol->a
159f0 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 6e 29 3b 0a 20  [i].zName, n);. 
15a00 20 20 20 20 20 7a 5b 6e 5d 20 3d 20 30 3b 0a 20       z[n] = 0;. 
15a10 20 20 20 20 20 7a 20 2b 3d 20 6e 2b 31 3b 0a 20       z += n+1;. 
15a20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 46 4b 65 79     }.  }.  pFKey
15a30 2d 3e 69 73 44 65 66 65 72 72 65 64 20 3d 20 30  ->isDeferred = 0
15a40 3b 0a 20 20 70 46 4b 65 79 2d 3e 61 41 63 74 69  ;.  pFKey->aActi
15a50 6f 6e 5b 30 5d 20 3d 20 28 75 38 29 28 66 6c 61  on[0] = (u8)(fla
15a60 67 73 20 26 20 30 78 66 66 29 3b 20 20 20 20 20  gs & 0xff);     
15a70 20 20 20 20 20 20 20 2f 2a 20 4f 4e 20 44 45 4c         /* ON DEL
15a80 45 54 45 20 61 63 74 69 6f 6e 20 2a 2f 0a 20 20  ETE action */.  
15a90 70 46 4b 65 79 2d 3e 61 41 63 74 69 6f 6e 5b 31  pFKey->aAction[1
15aa0 5d 20 3d 20 28 75 38 29 28 28 66 6c 61 67 73 20  ] = (u8)((flags 
15ab0 3e 3e 20 38 20 29 20 26 20 30 78 66 66 29 3b 20  >> 8 ) & 0xff); 
15ac0 20 20 20 2f 2a 20 4f 4e 20 55 50 44 41 54 45 20     /* ON UPDATE 
15ad0 61 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20 61 73 73  action */..  ass
15ae0 65 72 74 28 20 73 71 6c 69 74 65 33 53 63 68 65  ert( sqlite3Sche
15af0 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20  maMutexHeld(db, 
15b00 30 2c 20 70 2d 3e 70 53 63 68 65 6d 61 29 20 29  0, p->pSchema) )
15b10 3b 0a 20 20 70 4e 65 78 74 54 6f 20 3d 20 28 46  ;.  pNextTo = (F
15b20 4b 65 79 20 2a 29 73 71 6c 69 74 65 33 48 61 73  Key *)sqlite3Has
15b30 68 49 6e 73 65 72 74 28 26 70 2d 3e 70 53 63 68  hInsert(&p->pSch
15b40 65 6d 61 2d 3e 66 6b 65 79 48 61 73 68 2c 20 0a  ema->fkeyHash, .
15b50 20 20 20 20 20 20 70 46 4b 65 79 2d 3e 7a 54 6f        pFKey->zTo
15b60 2c 20 28 76 6f 69 64 20 2a 29 70 46 4b 65 79 0a  , (void *)pFKey.
15b70 20 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 78 74    );.  if( pNext
15b80 54 6f 3d 3d 70 46 4b 65 79 20 29 7b 0a 20 20 20  To==pFKey ){.   
15b90 20 73 71 6c 69 74 65 33 4f 6f 6d 46 61 75 6c 74   sqlite3OomFault
15ba0 28 64 62 29 3b 0a 20 20 20 20 67 6f 74 6f 20 66  (db);.    goto f
15bb0 6b 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 69 66 28  k_end;.  }.  if(
15bc0 20 70 4e 65 78 74 54 6f 20 29 7b 0a 20 20 20 20   pNextTo ){.    
15bd0 61 73 73 65 72 74 28 20 70 4e 65 78 74 54 6f 2d  assert( pNextTo-
15be0 3e 70 50 72 65 76 54 6f 3d 3d 30 20 29 3b 0a 20  >pPrevTo==0 );. 
15bf0 20 20 20 70 46 4b 65 79 2d 3e 70 4e 65 78 74 54     pFKey->pNextT
15c00 6f 20 3d 20 70 4e 65 78 74 54 6f 3b 0a 20 20 20  o = pNextTo;.   
15c10 20 70 4e 65 78 74 54 6f 2d 3e 70 50 72 65 76 54   pNextTo->pPrevT
15c20 6f 20 3d 20 70 46 4b 65 79 3b 0a 20 20 7d 0a 0a  o = pFKey;.  }..
15c30 20 20 2f 2a 20 4c 69 6e 6b 20 74 68 65 20 66 6f    /* Link the fo
15c40 72 65 69 67 6e 20 6b 65 79 20 74 6f 20 74 68 65  reign key to the
15c50 20 74 61 62 6c 65 20 61 73 20 74 68 65 20 6c 61   table as the la
15c60 73 74 20 73 74 65 70 2e 0a 20 20 2a 2f 0a 20 20  st step..  */.  
15c70 70 2d 3e 70 46 4b 65 79 20 3d 20 70 46 4b 65 79  p->pFKey = pFKey
15c80 3b 0a 20 20 70 46 4b 65 79 20 3d 20 30 3b 0a 0a  ;.  pFKey = 0;..
15c90 66 6b 5f 65 6e 64 3a 0a 20 20 73 71 6c 69 74 65  fk_end:.  sqlite
15ca0 33 44 62 46 72 65 65 28 64 62 2c 20 70 46 4b 65  3DbFree(db, pFKe
15cb0 79 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64  y);.#endif /* !d
15cc0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
15cd0 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 29 20  IT_FOREIGN_KEY) 
15ce0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  */.  sqlite3Expr
15cf0 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70  ListDelete(db, p
15d00 46 72 6f 6d 43 6f 6c 29 3b 0a 20 20 73 71 6c 69  FromCol);.  sqli
15d10 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
15d20 65 28 64 62 2c 20 70 54 6f 43 6f 6c 29 3b 0a 7d  e(db, pToCol);.}
15d30 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
15d40 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77  tine is called w
15d50 68 65 6e 20 61 6e 20 49 4e 49 54 49 41 4c 4c 59  hen an INITIALLY
15d60 20 49 4d 4d 45 44 49 41 54 45 20 6f 72 20 49 4e   IMMEDIATE or IN
15d70 49 54 49 41 4c 4c 59 20 44 45 46 45 52 52 45 44  ITIALLY DEFERRED
15d80 0a 2a 2a 20 63 6c 61 75 73 65 20 69 73 20 73 65  .** clause is se
15d90 65 6e 20 61 73 20 70 61 72 74 20 6f 66 20 61 20  en as part of a 
15da0 66 6f 72 65 69 67 6e 20 6b 65 79 20 64 65 66 69  foreign key defi
15db0 6e 69 74 69 6f 6e 2e 20 20 54 68 65 20 69 73 44  nition.  The isD
15dc0 65 66 65 72 72 65 64 0a 2a 2a 20 70 61 72 61 6d  eferred.** param
15dd0 65 74 65 72 20 69 73 20 31 20 66 6f 72 20 49 4e  eter is 1 for IN
15de0 49 54 49 41 4c 4c 59 20 44 45 46 45 52 52 45 44  ITIALLY DEFERRED
15df0 20 61 6e 64 20 30 20 66 6f 72 20 49 4e 49 54 49   and 0 for INITI
15e00 41 4c 4c 59 20 49 4d 4d 45 44 49 41 54 45 2e 0a  ALLY IMMEDIATE..
15e10 2a 2a 20 54 68 65 20 62 65 68 61 76 69 6f 72 20  ** The behavior 
15e20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  of the most rece
15e30 6e 74 6c 79 20 63 72 65 61 74 65 64 20 66 6f 72  ntly created for
15e40 65 69 67 6e 20 6b 65 79 20 69 73 20 61 64 6a 75  eign key is adju
15e50 73 74 65 64 0a 2a 2a 20 61 63 63 6f 72 64 69 6e  sted.** accordin
15e60 67 6c 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  gly..*/.void sql
15e70 69 74 65 33 44 65 66 65 72 46 6f 72 65 69 67 6e  ite3DeferForeign
15e80 4b 65 79 28 50 61 72 73 65 20 2a 70 50 61 72 73  Key(Parse *pPars
15e90 65 2c 20 69 6e 74 20 69 73 44 65 66 65 72 72 65  e, int isDeferre
15ea0 64 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  d){.#ifndef SQLI
15eb0 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f  TE_OMIT_FOREIGN_
15ec0 4b 45 59 0a 20 20 54 61 62 6c 65 20 2a 70 54 61  KEY.  Table *pTa
15ed0 62 3b 0a 20 20 46 4b 65 79 20 2a 70 46 4b 65 79  b;.  FKey *pFKey
15ee0 3b 0a 20 20 69 66 28 20 28 70 54 61 62 20 3d 20  ;.  if( (pTab = 
15ef0 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
15f00 65 29 3d 3d 30 20 7c 7c 20 28 70 46 4b 65 79 20  e)==0 || (pFKey 
15f10 3d 20 70 54 61 62 2d 3e 70 46 4b 65 79 29 3d 3d  = pTab->pFKey)==
15f20 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73  0 ) return;.  as
15f30 73 65 72 74 28 20 69 73 44 65 66 65 72 72 65 64  sert( isDeferred
15f40 3d 3d 30 20 7c 7c 20 69 73 44 65 66 65 72 72 65  ==0 || isDeferre
15f50 64 3d 3d 31 20 29 3b 20 2f 2a 20 45 56 3a 20 52  d==1 ); /* EV: R
15f60 2d 33 30 33 32 33 2d 32 31 39 31 37 20 2a 2f 0a  -30323-21917 */.
15f70 20 20 70 46 4b 65 79 2d 3e 69 73 44 65 66 65 72    pFKey->isDefer
15f80 72 65 64 20 3d 20 28 75 38 29 69 73 44 65 66 65  red = (u8)isDefe
15f90 72 72 65 64 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a  rred;.#endif.}..
15fa0 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
15fb0 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 65 72  ode that will er
15fc0 61 73 65 20 61 6e 64 20 72 65 66 69 6c 6c 20 69  ase and refill i
15fd0 6e 64 65 78 20 2a 70 49 64 78 2e 20 20 54 68 69  ndex *pIdx.  Thi
15fe0 73 20 69 73 0a 2a 2a 20 75 73 65 64 20 74 6f 20  s is.** used to 
15ff0 69 6e 69 74 69 61 6c 69 7a 65 20 61 20 6e 65 77  initialize a new
16000 6c 79 20 63 72 65 61 74 65 64 20 69 6e 64 65 78  ly created index
16010 20 6f 72 20 74 6f 20 72 65 63 6f 6d 70 75 74 65   or to recompute
16020 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20   the.** content 
16030 6f 66 20 61 6e 20 69 6e 64 65 78 20 69 6e 20 72  of an index in r
16040 65 73 70 6f 6e 73 65 20 74 6f 20 61 20 52 45 49  esponse to a REI
16050 4e 44 45 58 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a  NDEX command..**
16060 0a 2a 2a 20 69 66 20 6d 65 6d 52 6f 6f 74 50 61  .** if memRootPa
16070 67 65 20 69 73 20 6e 6f 74 20 6e 65 67 61 74 69  ge is not negati
16080 76 65 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61  ve, it means tha
16090 74 20 74 68 65 20 69 6e 64 65 78 20 69 73 20 6e  t the index is n
160a0 65 77 6c 79 0a 2a 2a 20 63 72 65 61 74 65 64 2e  ewly.** created.
160b0 20 20 54 68 65 20 72 65 67 69 73 74 65 72 20 73    The register s
160c0 70 65 63 69 66 69 65 64 20 62 79 20 6d 65 6d 52  pecified by memR
160d0 6f 6f 74 50 61 67 65 20 63 6f 6e 74 61 69 6e 73  ootPage contains
160e0 20 74 68 65 0a 2a 2a 20 72 6f 6f 74 20 70 61 67   the.** root pag
160f0 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  e number of the 
16100 69 6e 64 65 78 2e 20 20 49 66 20 6d 65 6d 52 6f  index.  If memRo
16110 6f 74 50 61 67 65 20 69 73 20 6e 65 67 61 74 69  otPage is negati
16120 76 65 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20  ve, then.** the 
16130 69 6e 64 65 78 20 61 6c 72 65 61 64 79 20 65 78  index already ex
16140 69 73 74 73 20 61 6e 64 20 6d 75 73 74 20 62 65  ists and must be
16150 20 63 6c 65 61 72 65 64 20 62 65 66 6f 72 65 20   cleared before 
16160 62 65 69 6e 67 20 72 65 66 69 6c 6c 65 64 20 61  being refilled a
16170 6e 64 0a 2a 2a 20 74 68 65 20 72 6f 6f 74 20 70  nd.** the root p
16180 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68  age number of th
16190 65 20 69 6e 64 65 78 20 69 73 20 74 61 6b 65 6e  e index is taken
161a0 20 66 72 6f 6d 20 70 49 6e 64 65 78 2d 3e 74 6e   from pIndex->tn
161b0 75 6d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  um..*/.static vo
161c0 69 64 20 73 71 6c 69 74 65 33 52 65 66 69 6c 6c  id sqlite3Refill
161d0 49 6e 64 65 78 28 50 61 72 73 65 20 2a 70 50 61  Index(Parse *pPa
161e0 72 73 65 2c 20 49 6e 64 65 78 20 2a 70 49 6e 64  rse, Index *pInd
161f0 65 78 2c 20 69 6e 74 20 6d 65 6d 52 6f 6f 74 50  ex, int memRootP
16200 61 67 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70  age){.  Table *p
16210 54 61 62 20 3d 20 70 49 6e 64 65 78 2d 3e 70 54  Tab = pIndex->pT
16220 61 62 6c 65 3b 20 20 2f 2a 20 54 68 65 20 74 61  able;  /* The ta
16230 62 6c 65 20 74 68 61 74 20 69 73 20 69 6e 64 65  ble that is inde
16240 78 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61  xed */.  int iTa
16250 62 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  b = pParse->nTab
16260 2b 2b 3b 20 20 20 20 20 2f 2a 20 42 74 72 65 65  ++;     /* Btree
16270 20 63 75 72 73 6f 72 20 75 73 65 64 20 66 6f 72   cursor used for
16280 20 70 54 61 62 20 2a 2f 0a 20 20 69 6e 74 20 69   pTab */.  int i
16290 49 64 78 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  Idx = pParse->nT
162a0 61 62 2b 2b 3b 20 20 20 20 20 2f 2a 20 42 74 72  ab++;     /* Btr
162b0 65 65 20 63 75 72 73 6f 72 20 75 73 65 64 20 66  ee cursor used f
162c0 6f 72 20 70 49 6e 64 65 78 20 2a 2f 0a 20 20 69  or pIndex */.  i
162d0 6e 74 20 69 53 6f 72 74 65 72 3b 20 20 20 20 20  nt iSorter;     
162e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
162f0 20 43 75 72 73 6f 72 20 6f 70 65 6e 65 64 20 62   Cursor opened b
16300 79 20 4f 70 65 6e 53 6f 72 74 65 72 20 28 69 66  y OpenSorter (if
16310 20 69 6e 20 75 73 65 29 20 2a 2f 0a 20 20 69 6e   in use) */.  in
16320 74 20 61 64 64 72 31 3b 20 20 20 20 20 20 20 20  t addr1;        
16330 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
16340 41 64 64 72 65 73 73 20 6f 66 20 74 6f 70 20 6f  Address of top o
16350 66 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20  f loop */.  int 
16360 61 64 64 72 32 3b 20 20 20 20 20 20 20 20 20 20  addr2;          
16370 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64             /* Ad
16380 64 72 65 73 73 20 74 6f 20 6a 75 6d 70 20 74 6f  dress to jump to
16390 20 66 6f 72 20 6e 65 78 74 20 69 74 65 72 61 74   for next iterat
163a0 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 74 6e 75  ion */.  int tnu
163b0 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m;              
163c0 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20          /* Root 
163d0 70 61 67 65 20 6f 66 20 69 6e 64 65 78 20 2a 2f  page of index */
163e0 0a 20 20 69 6e 74 20 69 50 61 72 74 49 64 78 4c  .  int iPartIdxL
163f0 61 62 65 6c 3b 20 20 20 20 20 20 20 20 20 20 20  abel;           
16400 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 74 68 69    /* Jump to thi
16410 73 20 6c 61 62 65 6c 20 74 6f 20 73 6b 69 70 20  s label to skip 
16420 61 20 72 6f 77 20 2a 2f 0a 20 20 56 64 62 65 20  a row */.  Vdbe 
16430 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  *v;             
16440 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47 65 6e            /* Gen
16450 65 72 61 74 65 20 63 6f 64 65 20 69 6e 74 6f 20  erate code into 
16460 74 68 69 73 20 76 69 72 74 75 61 6c 20 6d 61 63  this virtual mac
16470 68 69 6e 65 20 2a 2f 0a 20 20 4b 65 79 49 6e 66  hine */.  KeyInf
16480 6f 20 2a 70 4b 65 79 3b 20 20 20 20 20 20 20 20  o *pKey;        
16490 20 20 20 20 20 20 20 20 20 2f 2a 20 4b 65 79 49           /* KeyI
164a0 6e 66 6f 20 66 6f 72 20 69 6e 64 65 78 20 2a 2f  nfo for index */
164b0 0a 20 20 69 6e 74 20 72 65 67 52 65 63 6f 72 64  .  int regRecord
164c0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
164d0 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 68 6f    /* Register ho
164e0 6c 64 69 6e 67 20 61 73 73 65 6d 62 6c 65 64 20  lding assembled 
164f0 69 6e 64 65 78 20 72 65 63 6f 72 64 20 2a 2f 0a  index record */.
16500 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
16510 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 20 20 20  pParse->db;     
16520 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65   /* The database
16530 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20   connection */. 
16540 20 69 6e 74 20 69 44 62 20 3d 20 73 71 6c 69 74   int iDb = sqlit
16550 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28  e3SchemaToIndex(
16560 64 62 2c 20 70 49 6e 64 65 78 2d 3e 70 53 63 68  db, pIndex->pSch
16570 65 6d 61 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53  ema);..#ifndef S
16580 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f  QLITE_OMIT_AUTHO
16590 52 49 5a 41 54 49 4f 4e 0a 20 20 69 66 28 20 73  RIZATION.  if( s
165a0 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28  qlite3AuthCheck(
165b0 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 52  pParse, SQLITE_R
165c0 45 49 4e 44 45 58 2c 20 70 49 6e 64 65 78 2d 3e  EINDEX, pIndex->
165d0 7a 4e 61 6d 65 2c 20 30 2c 0a 20 20 20 20 20 20  zName, 0,.      
165e0 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 44 62  db->aDb[iDb].zDb
165f0 53 4e 61 6d 65 20 29 20 29 7b 0a 20 20 20 20 72  SName ) ){.    r
16600 65 74 75 72 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69  eturn;.  }.#endi
16610 66 0a 0a 20 20 2f 2a 20 52 65 71 75 69 72 65 20  f..  /* Require 
16620 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20  a write-lock on 
16630 74 68 65 20 74 61 62 6c 65 20 74 6f 20 70 65 72  the table to per
16640 66 6f 72 6d 20 74 68 69 73 20 6f 70 65 72 61 74  form this operat
16650 69 6f 6e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ion */.  sqlite3
16660 54 61 62 6c 65 4c 6f 63 6b 28 70 50 61 72 73 65  TableLock(pParse
16670 2c 20 69 44 62 2c 20 70 54 61 62 2d 3e 74 6e 75  , iDb, pTab->tnu
16680 6d 2c 20 31 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  m, 1, pTab->zNam
16690 65 29 3b 0a 0a 20 20 76 20 3d 20 73 71 6c 69 74  e);..  v = sqlit
166a0 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
166b0 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20  );.  if( v==0 ) 
166c0 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 6d 65  return;.  if( me
166d0 6d 52 6f 6f 74 50 61 67 65 3e 3d 30 20 29 7b 0a  mRootPage>=0 ){.
166e0 20 20 20 20 74 6e 75 6d 20 3d 20 6d 65 6d 52 6f      tnum = memRo
166f0 6f 74 50 61 67 65 3b 0a 20 20 7d 65 6c 73 65 7b  otPage;.  }else{
16700 0a 20 20 20 20 74 6e 75 6d 20 3d 20 70 49 6e 64  .    tnum = pInd
16710 65 78 2d 3e 74 6e 75 6d 3b 0a 20 20 7d 0a 20 20  ex->tnum;.  }.  
16720 70 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 4b 65  pKey = sqlite3Ke
16730 79 49 6e 66 6f 4f 66 49 6e 64 65 78 28 70 50 61  yInfoOfIndex(pPa
16740 72 73 65 2c 20 70 49 6e 64 65 78 29 3b 0a 20 20  rse, pIndex);.  
16750 61 73 73 65 72 74 28 20 70 4b 65 79 21 3d 30 20  assert( pKey!=0 
16760 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  || db->mallocFai
16770 6c 65 64 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e  led || pParse->n
16780 45 72 72 20 29 3b 0a 0a 20 20 2f 2a 20 4f 70 65  Err );..  /* Ope
16790 6e 20 74 68 65 20 73 6f 72 74 65 72 20 63 75 72  n the sorter cur
167a0 73 6f 72 20 69 66 20 77 65 20 61 72 65 20 74 6f  sor if we are to
167b0 20 75 73 65 20 6f 6e 65 2e 20 2a 2f 0a 20 20 69   use one. */.  i
167c0 53 6f 72 74 65 72 20 3d 20 70 50 61 72 73 65 2d  Sorter = pParse-
167d0 3e 6e 54 61 62 2b 2b 3b 0a 20 20 73 71 6c 69 74  >nTab++;.  sqlit
167e0 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
167f0 4f 50 5f 53 6f 72 74 65 72 4f 70 65 6e 2c 20 69  OP_SorterOpen, i
16800 53 6f 72 74 65 72 2c 20 30 2c 20 70 49 6e 64 65  Sorter, 0, pInde
16810 78 2d 3e 6e 4b 65 79 43 6f 6c 2c 20 28 63 68 61  x->nKeyCol, (cha
16820 72 2a 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  r*).            
16830 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4b          sqlite3K
16840 65 79 49 6e 66 6f 52 65 66 28 70 4b 65 79 29 2c  eyInfoRef(pKey),
16850 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 0a 20   P4_KEYINFO);.. 
16860 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 74 61 62   /* Open the tab
16870 6c 65 2e 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68  le. Loop through
16880 20 61 6c 6c 20 72 6f 77 73 20 6f 66 20 74 68 65   all rows of the
16890 20 74 61 62 6c 65 2c 20 69 6e 73 65 72 74 69 6e   table, insertin
168a0 67 20 69 6e 64 65 78 0a 20 20 2a 2a 20 72 65 63  g index.  ** rec
168b0 6f 72 64 73 20 69 6e 74 6f 20 74 68 65 20 73 6f  ords into the so
168c0 72 74 65 72 2e 20 2a 2f 0a 20 20 73 71 6c 69 74  rter. */.  sqlit
168d0 65 33 4f 70 65 6e 54 61 62 6c 65 28 70 50 61 72  e3OpenTable(pPar
168e0 73 65 2c 20 69 54 61 62 2c 20 69 44 62 2c 20 70  se, iTab, iDb, p
168f0 54 61 62 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64  Tab, OP_OpenRead
16900 29 3b 0a 20 20 61 64 64 72 31 20 3d 20 73 71 6c  );.  addr1 = sql
16910 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
16920 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 69 54 61  , OP_Rewind, iTa
16930 62 2c 20 30 29 3b 20 56 64 62 65 43 6f 76 65 72  b, 0); VdbeCover
16940 61 67 65 28 76 29 3b 0a 20 20 72 65 67 52 65 63  age(v);.  regRec
16950 6f 72 64 20 3d 20 73 71 6c 69 74 65 33 47 65 74  ord = sqlite3Get
16960 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
16970 0a 0a 20 20 73 71 6c 69 74 65 33 47 65 6e 65 72  ..  sqlite3Gener
16980 61 74 65 49 6e 64 65 78 4b 65 79 28 70 50 61 72  ateIndexKey(pPar
16990 73 65 2c 70 49 6e 64 65 78 2c 69 54 61 62 2c 72  se,pIndex,iTab,r
169a0 65 67 52 65 63 6f 72 64 2c 30 2c 26 69 50 61 72  egRecord,0,&iPar
169b0 74 49 64 78 4c 61 62 65 6c 2c 30 2c 30 29 3b 0a  tIdxLabel,0,0);.
169c0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
169d0 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72  Op2(v, OP_Sorter
169e0 49 6e 73 65 72 74 2c 20 69 53 6f 72 74 65 72 2c  Insert, iSorter,
169f0 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 73   regRecord);.  s
16a00 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 50 61 72  qlite3ResolvePar
16a10 74 49 64 78 4c 61 62 65 6c 28 70 50 61 72 73 65  tIdxLabel(pParse
16a20 2c 20 69 50 61 72 74 49 64 78 4c 61 62 65 6c 29  , iPartIdxLabel)
16a30 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
16a40 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74  ddOp2(v, OP_Next
16a50 2c 20 69 54 61 62 2c 20 61 64 64 72 31 2b 31 29  , iTab, addr1+1)
16a60 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
16a70 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
16a80 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
16a90 31 29 3b 0a 20 20 69 66 28 20 6d 65 6d 52 6f 6f  1);.  if( memRoo
16aa0 74 50 61 67 65 3c 30 20 29 20 73 71 6c 69 74 65  tPage<0 ) sqlite
16ab0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
16ac0 50 5f 43 6c 65 61 72 2c 20 74 6e 75 6d 2c 20 69  P_Clear, tnum, i
16ad0 44 62 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  Db);.  sqlite3Vd
16ae0 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f  beAddOp4(v, OP_O
16af0 70 65 6e 57 72 69 74 65 2c 20 69 49 64 78 2c 20  penWrite, iIdx, 
16b00 74 6e 75 6d 2c 20 69 44 62 2c 20 0a 20 20 20 20  tnum, iDb, .    
16b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16b20 28 63 68 61 72 20 2a 29 70 4b 65 79 2c 20 50 34  (char *)pKey, P4
16b30 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 73 71 6c  _KEYINFO);.  sql
16b40 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
16b50 28 76 2c 20 4f 50 46 4c 41 47 5f 42 55 4c 4b 43  (v, OPFLAG_BULKC
16b60 53 52 7c 28 28 6d 65 6d 52 6f 6f 74 50 61 67 65  SR|((memRootPage
16b70 3e 3d 30 29 3f 4f 50 46 4c 41 47 5f 50 32 49 53  >=0)?OPFLAG_P2IS
16b80 52 45 47 3a 30 29 29 3b 0a 0a 20 20 61 64 64 72  REG:0));..  addr
16b90 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  1 = sqlite3VdbeA
16ba0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74  ddOp2(v, OP_Sort
16bb0 65 72 53 6f 72 74 2c 20 69 53 6f 72 74 65 72 2c  erSort, iSorter,
16bc0 20 30 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67   0); VdbeCoverag
16bd0 65 28 76 29 3b 0a 20 20 69 66 28 20 49 73 55 6e  e(v);.  if( IsUn
16be0 69 71 75 65 49 6e 64 65 78 28 70 49 6e 64 65 78  iqueIndex(pIndex
16bf0 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 6a 32 20  ) ){.    int j2 
16c00 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
16c10 72 65 6e 74 41 64 64 72 28 76 29 20 2b 20 33 3b  rentAddr(v) + 3;
16c20 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
16c30 47 6f 74 6f 28 76 2c 20 6a 32 29 3b 0a 20 20 20  Goto(v, j2);.   
16c40 20 61 64 64 72 32 20 3d 20 73 71 6c 69 74 65 33   addr2 = sqlite3
16c50 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
16c60 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  v);.    sqlite3V
16c70 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20  dbeAddOp4Int(v, 
16c80 4f 50 5f 53 6f 72 74 65 72 43 6f 6d 70 61 72 65  OP_SorterCompare
16c90 2c 20 69 53 6f 72 74 65 72 2c 20 6a 32 2c 20 72  , iSorter, j2, r
16ca0 65 67 52 65 63 6f 72 64 2c 0a 20 20 20 20 20 20  egRecord,.      
16cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16cc0 20 20 20 70 49 6e 64 65 78 2d 3e 6e 4b 65 79 43     pIndex->nKeyC
16cd0 6f 6c 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  ol); VdbeCoverag
16ce0 65 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  e(v);.    sqlite
16cf0 33 55 6e 69 71 75 65 43 6f 6e 73 74 72 61 69 6e  3UniqueConstrain
16d00 74 28 70 50 61 72 73 65 2c 20 4f 45 5f 41 62 6f  t(pParse, OE_Abo
16d10 72 74 2c 20 70 49 6e 64 65 78 29 3b 0a 20 20 7d  rt, pIndex);.  }
16d20 65 6c 73 65 7b 0a 20 20 20 20 61 64 64 72 32 20  else{.    addr2 
16d30 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
16d40 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 7d  rentAddr(v);.  }
16d50 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
16d60 64 4f 70 33 28 76 2c 20 4f 50 5f 53 6f 72 74 65  dOp3(v, OP_Sorte
16d70 72 44 61 74 61 2c 20 69 53 6f 72 74 65 72 2c 20  rData, iSorter, 
16d80 72 65 67 52 65 63 6f 72 64 2c 20 69 49 64 78 29  regRecord, iIdx)
16d90 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
16da0 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4c 61 73 74  ddOp3(v, OP_Last
16db0 2c 20 69 49 64 78 2c 20 30 2c 20 2d 31 29 3b 0a  , iIdx, 0, -1);.
16dc0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
16dd0 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73  Op2(v, OP_IdxIns
16de0 65 72 74 2c 20 69 49 64 78 2c 20 72 65 67 52 65  ert, iIdx, regRe
16df0 63 6f 72 64 29 3b 0a 20 20 73 71 6c 69 74 65 33  cord);.  sqlite3
16e00 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
16e10 4f 50 46 4c 41 47 5f 55 53 45 53 45 45 4b 52 45  OPFLAG_USESEEKRE
16e20 53 55 4c 54 29 3b 0a 20 20 73 71 6c 69 74 65 33  SULT);.  sqlite3
16e30 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
16e40 50 61 72 73 65 2c 20 72 65 67 52 65 63 6f 72 64  Parse, regRecord
16e50 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
16e60 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72  AddOp2(v, OP_Sor
16e70 74 65 72 4e 65 78 74 2c 20 69 53 6f 72 74 65 72  terNext, iSorter
16e80 2c 20 61 64 64 72 32 29 3b 20 56 64 62 65 43 6f  , addr2); VdbeCo
16e90 76 65 72 61 67 65 28 76 29 3b 0a 20 20 73 71 6c  verage(v);.  sql
16ea0 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
16eb0 28 76 2c 20 61 64 64 72 31 29 3b 0a 0a 20 20 73  (v, addr1);..  s
16ec0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
16ed0 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 69 54  (v, OP_Close, iT
16ee0 61 62 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  ab);.  sqlite3Vd
16ef0 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 43  beAddOp1(v, OP_C
16f00 6c 6f 73 65 2c 20 69 49 64 78 29 3b 0a 20 20 73  lose, iIdx);.  s
16f10 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
16f20 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 69 53  (v, OP_Close, iS
16f30 6f 72 74 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  orter);.}../*.**
16f40 20 41 6c 6c 6f 63 61 74 65 20 68 65 61 70 20 73   Allocate heap s
16f50 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 61 6e 20  pace to hold an 
16f60 49 6e 64 65 78 20 6f 62 6a 65 63 74 20 77 69 74  Index object wit
16f70 68 20 6e 43 6f 6c 20 63 6f 6c 75 6d 6e 73 2e 0a  h nCol columns..
16f80 2a 2a 0a 2a 2a 20 49 6e 63 72 65 61 73 65 20 74  **.** Increase t
16f90 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 73 69  he allocation si
16fa0 7a 65 20 74 6f 20 70 72 6f 76 69 64 65 20 61 6e  ze to provide an
16fb0 20 65 78 74 72 61 20 6e 45 78 74 72 61 20 62 79   extra nExtra by
16fc0 74 65 73 0a 2a 2a 20 6f 66 20 38 2d 62 79 74 65  tes.** of 8-byte
16fd0 20 61 6c 69 67 6e 65 64 20 73 70 61 63 65 20 61   aligned space a
16fe0 66 74 65 72 20 74 68 65 20 49 6e 64 65 78 20 6f  fter the Index o
16ff0 62 6a 65 63 74 20 61 6e 64 20 72 65 74 75 72 6e  bject and return
17000 20 61 0a 2a 2a 20 70 6f 69 6e 74 65 72 20 74 6f   a.** pointer to
17010 20 74 68 69 73 20 65 78 74 72 61 20 73 70 61 63   this extra spac
17020 65 20 69 6e 20 2a 70 70 45 78 74 72 61 2e 0a 2a  e in *ppExtra..*
17030 2f 0a 49 6e 64 65 78 20 2a 73 71 6c 69 74 65 33  /.Index *sqlite3
17040 41 6c 6c 6f 63 61 74 65 49 6e 64 65 78 4f 62 6a  AllocateIndexObj
17050 65 63 74 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  ect(.  sqlite3 *
17060 64 62 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 44  db,         /* D
17070 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
17080 6f 6e 20 2a 2f 0a 20 20 69 31 36 20 6e 43 6f 6c  on */.  i16 nCol
17090 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
170a0 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  Total number of 
170b0 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 69  columns in the i
170c0 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 6e 45  ndex */.  int nE
170d0 78 74 72 61 2c 20 20 20 20 20 20 20 20 20 20 2f  xtra,          /
170e0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
170f0 73 20 6f 66 20 65 78 74 72 61 20 73 70 61 63 65  s of extra space
17100 20 74 6f 20 61 6c 6c 6f 63 20 2a 2f 0a 20 20 63   to alloc */.  c
17110 68 61 72 20 2a 2a 70 70 45 78 74 72 61 20 20 20  har **ppExtra   
17120 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
17130 6f 20 74 68 65 20 22 65 78 74 72 61 22 20 73 70  o the "extra" sp
17140 61 63 65 20 2a 2f 0a 29 7b 0a 20 20 49 6e 64 65  ace */.){.  Inde
17150 78 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20  x *p;           
17160 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 64 20 69 6e   /* Allocated in
17170 64 65 78 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  dex object */.  
17180 69 6e 74 20 6e 42 79 74 65 3b 20 20 20 20 20 20  int nByte;      
17190 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66       /* Bytes of
171a0 20 73 70 61 63 65 20 66 6f 72 20 49 6e 64 65 78   space for Index
171b0 20 6f 62 6a 65 63 74 20 2b 20 61 72 72 61 79 73   object + arrays
171c0 20 2a 2f 0a 0a 20 20 6e 42 79 74 65 20 3d 20 52   */..  nByte = R
171d0 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 49 6e 64  OUND8(sizeof(Ind
171e0 65 78 29 29 20 2b 20 20 20 20 20 20 20 20 20 20  ex)) +          
171f0 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 73 74 72      /* Index str
17200 75 63 74 75 72 65 20 20 2a 2f 0a 20 20 20 20 20  ucture  */.     
17210 20 20 20 20 20 52 4f 55 4e 44 38 28 73 69 7a 65       ROUND8(size
17220 6f 66 28 63 68 61 72 2a 29 2a 6e 43 6f 6c 29 20  of(char*)*nCol) 
17230 2b 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64  +         /* Ind
17240 65 78 2e 61 7a 43 6f 6c 6c 20 20 20 20 20 2a 2f  ex.azColl     */
17250 0a 20 20 20 20 20 20 20 20 20 20 52 4f 55 4e 44  .          ROUND
17260 38 28 73 69 7a 65 6f 66 28 4c 6f 67 45 73 74 29  8(sizeof(LogEst)
17270 2a 28 6e 43 6f 6c 2b 31 29 20 2b 20 20 20 20 20  *(nCol+1) +     
17280 2f 2a 20 49 6e 64 65 78 2e 61 69 52 6f 77 4c 6f  /* Index.aiRowLo
17290 67 45 73 74 20 20 20 2a 2f 0a 20 20 20 20 20 20  gEst   */.      
172a0 20 20 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f             sizeo
172b0 66 28 69 31 36 29 2a 6e 43 6f 6c 20 2b 20 20 20  f(i16)*nCol +   
172c0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
172d0 78 2e 61 69 43 6f 6c 75 6d 6e 20 20 20 2a 2f 0a  x.aiColumn   */.
172e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
172f0 20 73 69 7a 65 6f 66 28 75 38 29 2a 6e 43 6f 6c   sizeof(u8)*nCol
17300 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  );             /
17310 2a 20 49 6e 64 65 78 2e 61 53 6f 72 74 4f 72 64  * Index.aSortOrd
17320 65 72 20 2a 2f 0a 20 20 70 20 3d 20 73 71 6c 69  er */.  p = sqli
17330 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28  te3DbMallocZero(
17340 64 62 2c 20 6e 42 79 74 65 20 2b 20 6e 45 78 74  db, nByte + nExt
17350 72 61 29 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a  ra);.  if( p ){.
17360 20 20 20 20 63 68 61 72 20 2a 70 45 78 74 72 61      char *pExtra
17370 20 3d 20 28 28 63 68 61 72 2a 29 70 29 2b 52 4f   = ((char*)p)+RO
17380 55 4e 44 38 28 73 69 7a 65 6f 66 28 49 6e 64 65  UND8(sizeof(Inde
17390 78 29 29 3b 0a 20 20 20 20 70 2d 3e 61 7a 43 6f  x));.    p->azCo
173a0 6c 6c 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72  ll = (const char
173b0 2a 2a 29 70 45 78 74 72 61 3b 20 70 45 78 74 72  **)pExtra; pExtr
173c0 61 20 2b 3d 20 52 4f 55 4e 44 38 28 73 69 7a 65  a += ROUND8(size
173d0 6f 66 28 63 68 61 72 2a 29 2a 6e 43 6f 6c 29 3b  of(char*)*nCol);
173e0 0a 20 20 20 20 70 2d 3e 61 69 52 6f 77 4c 6f 67  .    p->aiRowLog
173f0 45 73 74 20 3d 20 28 4c 6f 67 45 73 74 2a 29 70  Est = (LogEst*)p
17400 45 78 74 72 61 3b 20 70 45 78 74 72 61 20 2b 3d  Extra; pExtra +=
17410 20 73 69 7a 65 6f 66 28 4c 6f 67 45 73 74 29 2a   sizeof(LogEst)*
17420 28 6e 43 6f 6c 2b 31 29 3b 0a 20 20 20 20 70 2d  (nCol+1);.    p-
17430 3e 61 69 43 6f 6c 75 6d 6e 20 3d 20 28 69 31 36  >aiColumn = (i16
17440 2a 29 70 45 78 74 72 61 3b 20 20 20 20 20 20 20  *)pExtra;       
17450 70 45 78 74 72 61 20 2b 3d 20 73 69 7a 65 6f 66  pExtra += sizeof
17460 28 69 31 36 29 2a 6e 43 6f 6c 3b 0a 20 20 20 20  (i16)*nCol;.    
17470 70 2d 3e 61 53 6f 72 74 4f 72 64 65 72 20 3d 20  p->aSortOrder = 
17480 28 75 38 2a 29 70 45 78 74 72 61 3b 0a 20 20 20  (u8*)pExtra;.   
17490 20 70 2d 3e 6e 43 6f 6c 75 6d 6e 20 3d 20 6e 43   p->nColumn = nC
174a0 6f 6c 3b 0a 20 20 20 20 70 2d 3e 6e 4b 65 79 43  ol;.    p->nKeyC
174b0 6f 6c 20 3d 20 6e 43 6f 6c 20 2d 20 31 3b 0a 20  ol = nCol - 1;. 
174c0 20 20 20 2a 70 70 45 78 74 72 61 20 3d 20 28 28     *ppExtra = ((
174d0 63 68 61 72 2a 29 70 29 20 2b 20 6e 42 79 74 65  char*)p) + nByte
174e0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
174f0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74  ;.}../*.** Creat
17500 65 20 61 20 6e 65 77 20 69 6e 64 65 78 20 66 6f  e a new index fo
17510 72 20 61 6e 20 53 51 4c 20 74 61 62 6c 65 2e 20  r an SQL table. 
17520 20 70 4e 61 6d 65 31 2e 70 4e 61 6d 65 32 20 69   pName1.pName2 i
17530 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  s the name of th
17540 65 20 69 6e 64 65 78 20 0a 2a 2a 20 61 6e 64 20  e index .** and 
17550 70 54 62 6c 4c 69 73 74 20 69 73 20 74 68 65 20  pTblList is the 
17560 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c  name of the tabl
17570 65 20 74 68 61 74 20 69 73 20 74 6f 20 62 65 20  e that is to be 
17580 69 6e 64 65 78 65 64 2e 20 20 42 6f 74 68 20 77  indexed.  Both w
17590 69 6c 6c 20 0a 2a 2a 20 62 65 20 4e 55 4c 4c 20  ill .** be NULL 
175a0 66 6f 72 20 61 20 70 72 69 6d 61 72 79 20 6b 65  for a primary ke
175b0 79 20 6f 72 20 61 6e 20 69 6e 64 65 78 20 74 68  y or an index th
175c0 61 74 20 69 73 20 63 72 65 61 74 65 64 20 74 6f  at is created to
175d0 20 73 61 74 69 73 66 79 20 61 0a 2a 2a 20 55 4e   satisfy a.** UN
175e0 49 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 2e  IQUE constraint.
175f0 20 20 49 66 20 70 54 61 62 6c 65 20 61 6e 64 20    If pTable and 
17600 70 49 6e 64 65 78 20 61 72 65 20 4e 55 4c 4c 2c  pIndex are NULL,
17610 20 75 73 65 20 70 50 61 72 73 65 2d 3e 70 4e 65   use pParse->pNe
17620 77 54 61 62 6c 65 0a 2a 2a 20 61 73 20 74 68 65  wTable.** as the
17630 20 74 61 62 6c 65 20 74 6f 20 62 65 20 69 6e 64   table to be ind
17640 65 78 65 64 2e 20 20 70 50 61 72 73 65 2d 3e 70  exed.  pParse->p
17650 4e 65 77 54 61 62 6c 65 20 69 73 20 61 20 74 61  NewTable is a ta
17660 62 6c 65 20 74 68 61 74 20 69 73 0a 2a 2a 20 63  ble that is.** c
17670 75 72 72 65 6e 74 6c 79 20 62 65 69 6e 67 20 63  urrently being c
17680 6f 6e 73 74 72 75 63 74 65 64 20 62 79 20 61 20  onstructed by a 
17690 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61  CREATE TABLE sta
176a0 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 70 4c  tement..**.** pL
176b0 69 73 74 20 69 73 20 61 20 6c 69 73 74 20 6f 66  ist is a list of
176c0 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 62 65 20 69   columns to be i
176d0 6e 64 65 78 65 64 2e 20 20 70 4c 69 73 74 20 77  ndexed.  pList w
176e0 69 6c 6c 20 62 65 20 4e 55 4c 4c 20 69 66 20 74  ill be NULL if t
176f0 68 69 73 0a 2a 2a 20 69 73 20 61 20 70 72 69 6d  his.** is a prim
17700 61 72 79 20 6b 65 79 20 6f 72 20 75 6e 69 71 75  ary key or uniqu
17710 65 2d 63 6f 6e 73 74 72 61 69 6e 74 20 6f 6e 20  e-constraint on 
17720 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20  the most recent 
17730 63 6f 6c 75 6d 6e 20 61 64 64 65 64 0a 2a 2a 20  column added.** 
17740 74 6f 20 74 68 65 20 74 61 62 6c 65 20 63 75 72  to the table cur
17750 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e  rently under con
17760 73 74 72 75 63 74 69 6f 6e 2e 20 20 0a 2a 2f 0a  struction.  .*/.
17770 76 6f 69 64 20 73 71 6c 69 74 65 33 43 72 65 61  void sqlite3Crea
17780 74 65 49 6e 64 65 78 28 0a 20 20 50 61 72 73 65  teIndex(.  Parse
17790 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 2f 2a   *pParse,     /*
177a0 20 41 6c 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e   All information
177b0 20 61 62 6f 75 74 20 74 68 69 73 20 70 61 72 73   about this pars
177c0 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e  e */.  Token *pN
177d0 61 6d 65 31 2c 20 20 20 20 20 2f 2a 20 46 69 72  ame1,     /* Fir
177e0 73 74 20 70 61 72 74 20 6f 66 20 69 6e 64 65 78  st part of index
177f0 20 6e 61 6d 65 2e 20 4d 61 79 20 62 65 20 4e 55   name. May be NU
17800 4c 4c 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  LL */.  Token *p
17810 4e 61 6d 65 32 2c 20 20 20 20 20 2f 2a 20 53 65  Name2,     /* Se
17820 63 6f 6e 64 20 70 61 72 74 20 6f 66 20 69 6e 64  cond part of ind
17830 65 78 20 6e 61 6d 65 2e 20 4d 61 79 20 62 65 20  ex name. May be 
17840 4e 55 4c 4c 20 2a 2f 0a 20 20 53 72 63 4c 69 73  NULL */.  SrcLis
17850 74 20 2a 70 54 62 6c 4e 61 6d 65 2c 20 2f 2a 20  t *pTblName, /* 
17860 54 61 62 6c 65 20 74 6f 20 69 6e 64 65 78 2e 20  Table to index. 
17870 55 73 65 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  Use pParse->pNew
17880 54 61 62 6c 65 20 69 66 20 30 20 2a 2f 0a 20 20  Table if 0 */.  
17890 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c  ExprList *pList,
178a0 20 20 20 2f 2a 20 41 20 6c 69 73 74 20 6f 66 20     /* A list of 
178b0 63 6f 6c 75 6d 6e 73 20 74 6f 20 62 65 20 69 6e  columns to be in
178c0 64 65 78 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6f  dexed */.  int o
178d0 6e 45 72 72 6f 72 2c 20 20 20 20 20 20 20 2f 2a  nError,       /*
178e0 20 4f 45 5f 41 62 6f 72 74 2c 20 4f 45 5f 49 67   OE_Abort, OE_Ig
178f0 6e 6f 72 65 2c 20 4f 45 5f 52 65 70 6c 61 63 65  nore, OE_Replace
17900 2c 20 6f 72 20 4f 45 5f 4e 6f 6e 65 20 2a 2f 0a  , or OE_None */.
17910 20 20 54 6f 6b 65 6e 20 2a 70 53 74 61 72 74 2c    Token *pStart,
17920 20 20 20 20 20 2f 2a 20 54 68 65 20 43 52 45 41       /* The CREA
17930 54 45 20 74 6f 6b 65 6e 20 74 68 61 74 20 62 65  TE token that be
17940 67 69 6e 73 20 74 68 69 73 20 73 74 61 74 65 6d  gins this statem
17950 65 6e 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  ent */.  Expr *p
17960 50 49 57 68 65 72 65 2c 20 20 20 20 2f 2a 20 57  PIWhere,    /* W
17970 48 45 52 45 20 63 6c 61 75 73 65 20 66 6f 72 20  HERE clause for 
17980 70 61 72 74 69 61 6c 20 69 6e 64 69 63 65 73 20  partial indices 
17990 2a 2f 0a 20 20 69 6e 74 20 73 6f 72 74 4f 72 64  */.  int sortOrd
179a0 65 72 2c 20 20 20 20 20 2f 2a 20 53 6f 72 74 20  er,     /* Sort 
179b0 6f 72 64 65 72 20 6f 66 20 70 72 69 6d 61 72 79  order of primary
179c0 20 6b 65 79 20 77 68 65 6e 20 70 4c 69 73 74 3d   key when pList=
179d0 3d 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20 69  =NULL */.  int i
179e0 66 4e 6f 74 45 78 69 73 74 2c 20 20 20 20 2f 2a  fNotExist,    /*
179f0 20 4f 6d 69 74 20 65 72 72 6f 72 20 69 66 20 69   Omit error if i
17a00 6e 64 65 78 20 61 6c 72 65 61 64 79 20 65 78 69  ndex already exi
17a10 73 74 73 20 2a 2f 0a 20 20 75 38 20 69 64 78 54  sts */.  u8 idxT
17a20 79 70 65 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ype         /* T
17a30 68 65 20 69 6e 64 65 78 20 74 79 70 65 20 2a 2f  he index type */
17a40 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61  .){.  Table *pTa
17a50 62 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 54 61  b = 0;     /* Ta
17a60 62 6c 65 20 74 6f 20 62 65 20 69 6e 64 65 78 65  ble to be indexe
17a70 64 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49  d */.  Index *pI
17a80 6e 64 65 78 20 3d 20 30 3b 20 20 20 2f 2a 20 54  ndex = 0;   /* T
17a90 68 65 20 69 6e 64 65 78 20 74 6f 20 62 65 20 63  he index to be c
17aa0 72 65 61 74 65 64 20 2a 2f 0a 20 20 63 68 61 72  reated */.  char
17ab0 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b 20 20 20 20   *zName = 0;    
17ac0 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
17ad0 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 6e  index */.  int n
17ae0 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20  Name;           
17af0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 68 61  /* Number of cha
17b00 72 61 63 74 65 72 73 20 69 6e 20 7a 4e 61 6d 65  racters in zName
17b10 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a   */.  int i, j;.
17b20 20 20 44 62 46 69 78 65 72 20 73 46 69 78 3b 20    DbFixer sFix; 
17b30 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 61 73         /* For as
17b40 73 69 67 6e 69 6e 67 20 64 61 74 61 62 61 73 65  signing database
17b50 20 6e 61 6d 65 73 20 74 6f 20 70 54 61 62 6c 65   names to pTable
17b60 20 2a 2f 0a 20 20 69 6e 74 20 73 6f 72 74 4f 72   */.  int sortOr
17b70 64 65 72 4d 61 73 6b 3b 20 20 20 2f 2a 20 31 20  derMask;   /* 1 
17b80 74 6f 20 68 6f 6e 6f 72 20 44 45 53 43 20 69 6e  to honor DESC in
17b90 20 69 6e 64 65 78 2e 20 20 30 20 74 6f 20 69 67   index.  0 to ig
17ba0 6e 6f 72 65 2e 20 2a 2f 0a 20 20 73 71 6c 69 74  nore. */.  sqlit
17bb0 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
17bc0 3e 64 62 3b 0a 20 20 44 62 20 2a 70 44 62 3b 20  >db;.  Db *pDb; 
17bd0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
17be0 68 65 20 73 70 65 63 69 66 69 63 20 74 61 62 6c  he specific tabl
17bf0 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  e containing the
17c00 20 69 6e 64 65 78 65 64 20 64 61 74 61 62 61 73   indexed databas
17c10 65 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62 3b 20  e */.  int iDb; 
17c20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
17c30 6e 64 65 78 20 6f 66 20 74 68 65 20 64 61 74 61  ndex of the data
17c40 62 61 73 65 20 74 68 61 74 20 69 73 20 62 65 69  base that is bei
17c50 6e 67 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20  ng written */.  
17c60 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 20 3d 20 30  Token *pName = 0
17c70 3b 20 20 20 20 2f 2a 20 55 6e 71 75 61 6c 69 66  ;    /* Unqualif
17c80 69 65 64 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  ied name of the 
17c90 69 6e 64 65 78 20 74 6f 20 63 72 65 61 74 65 20  index to create 
17ca0 2a 2f 0a 20 20 73 74 72 75 63 74 20 45 78 70 72  */.  struct Expr
17cb0 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4c 69 73 74  List_item *pList
17cc0 49 74 65 6d 3b 20 2f 2a 20 46 6f 72 20 6c 6f 6f  Item; /* For loo
17cd0 70 69 6e 67 20 6f 76 65 72 20 70 4c 69 73 74 20  ping over pList 
17ce0 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 20  */.  int nExtra 
17cf0 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
17d00 20 20 20 20 20 20 2f 2a 20 53 70 61 63 65 20 61        /* Space a
17d10 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 7a 45 78  llocated for zEx
17d20 74 72 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e  tra[] */.  int n
17d30 45 78 74 72 61 43 6f 6c 3b 20 20 20 20 20 20 20  ExtraCol;       
17d40 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
17d50 75 6d 62 65 72 20 6f 66 20 65 78 74 72 61 20 63  umber of extra c
17d60 6f 6c 75 6d 6e 73 20 6e 65 65 64 65 64 20 2a 2f  olumns needed */
17d70 0a 20 20 63 68 61 72 20 2a 7a 45 78 74 72 61 20  .  char *zExtra 
17d80 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
17d90 20 20 20 20 2f 2a 20 45 78 74 72 61 20 73 70 61      /* Extra spa
17da0 63 65 20 61 66 74 65 72 20 74 68 65 20 49 6e 64  ce after the Ind
17db0 65 78 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 49  ex object */.  I
17dc0 6e 64 65 78 20 2a 70 50 6b 20 3d 20 30 3b 20 20  ndex *pPk = 0;  
17dd0 20 20 20 20 2f 2a 20 50 52 49 4d 41 52 59 20 4b      /* PRIMARY K
17de0 45 59 20 69 6e 64 65 78 20 66 6f 72 20 57 49 54  EY index for WIT
17df0 48 4f 55 54 20 52 4f 57 49 44 20 74 61 62 6c 65  HOUT ROWID table
17e00 73 20 2a 2f 0a 0a 20 20 69 66 28 20 64 62 2d 3e  s */..  if( db->
17e10 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20  mallocFailed || 
17e20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3e 30 20 29  pParse->nErr>0 )
17e30 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f  {.    goto exit_
17e40 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
17e50 7d 0a 20 20 69 66 28 20 49 4e 5f 44 45 43 4c 41  }.  if( IN_DECLA
17e60 52 45 5f 56 54 41 42 20 26 26 20 69 64 78 54 79  RE_VTAB && idxTy
17e70 70 65 21 3d 53 51 4c 49 54 45 5f 49 44 58 54 59  pe!=SQLITE_IDXTY
17e80 50 45 5f 50 52 49 4d 41 52 59 4b 45 59 20 29 7b  PE_PRIMARYKEY ){
17e90 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63  .    goto exit_c
17ea0 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d  reate_index;.  }
17eb0 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b  .  if( SQLITE_OK
17ec0 21 3d 73 71 6c 69 74 65 33 52 65 61 64 53 63 68  !=sqlite3ReadSch
17ed0 65 6d 61 28 70 50 61 72 73 65 29 20 29 7b 0a 20  ema(pParse) ){. 
17ee0 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65     goto exit_cre
17ef0 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 0a  ate_index;.  }..
17f00 20 20 2f 2a 0a 20 20 2a 2a 20 46 69 6e 64 20 74    /*.  ** Find t
17f10 68 65 20 74 61 62 6c 65 20 74 68 61 74 20 69 73  he table that is
17f20 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64 2e 20   to be indexed. 
17f30 20 52 65 74 75 72 6e 20 65 61 72 6c 79 20 69 66   Return early if
17f40 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 20 20 2a 2f   not found..  */
17f50 0a 20 20 69 66 28 20 70 54 62 6c 4e 61 6d 65 21  .  if( pTblName!
17f60 3d 30 20 29 7b 0a 0a 20 20 20 20 2f 2a 20 55 73  =0 ){..    /* Us
17f70 65 20 74 68 65 20 74 77 6f 2d 70 61 72 74 20 69  e the two-part i
17f80 6e 64 65 78 20 6e 61 6d 65 20 74 6f 20 64 65 74  ndex name to det
17f90 65 72 6d 69 6e 65 20 74 68 65 20 64 61 74 61 62  ermine the datab
17fa0 61 73 65 20 0a 20 20 20 20 2a 2a 20 74 6f 20 73  ase .    ** to s
17fb0 65 61 72 63 68 20 66 6f 72 20 74 68 65 20 74 61  earch for the ta
17fc0 62 6c 65 2e 20 27 46 69 78 27 20 74 68 65 20 74  ble. 'Fix' the t
17fd0 61 62 6c 65 20 6e 61 6d 65 20 74 6f 20 74 68 69  able name to thi
17fe0 73 20 64 62 0a 20 20 20 20 2a 2a 20 62 65 66 6f  s db.    ** befo
17ff0 72 65 20 6c 6f 6f 6b 69 6e 67 20 75 70 20 74 68  re looking up th
18000 65 20 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2f 0a  e table..    */.
18010 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 61 6d      assert( pNam
18020 65 31 20 26 26 20 70 4e 61 6d 65 32 20 29 3b 0a  e1 && pName2 );.
18030 20 20 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65      iDb = sqlite
18040 33 54 77 6f 50 61 72 74 4e 61 6d 65 28 70 50 61  3TwoPartName(pPa
18050 72 73 65 2c 20 70 4e 61 6d 65 31 2c 20 70 4e 61  rse, pName1, pNa
18060 6d 65 32 2c 20 26 70 4e 61 6d 65 29 3b 0a 20 20  me2, &pName);.  
18070 20 20 69 66 28 20 69 44 62 3c 30 20 29 20 67 6f    if( iDb<0 ) go
18080 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
18090 6e 64 65 78 3b 0a 20 20 20 20 61 73 73 65 72 74  ndex;.    assert
180a0 28 20 70 4e 61 6d 65 20 26 26 20 70 4e 61 6d 65  ( pName && pName
180b0 2d 3e 7a 20 29 3b 0a 0a 23 69 66 6e 64 65 66 20  ->z );..#ifndef 
180c0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 45 4d 50  SQLITE_OMIT_TEMP
180d0 44 42 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  DB.    /* If the
180e0 20 69 6e 64 65 78 20 6e 61 6d 65 20 77 61 73 20   index name was 
180f0 75 6e 71 75 61 6c 69 66 69 65 64 2c 20 63 68 65  unqualified, che
18100 63 6b 20 69 66 20 74 68 65 20 74 61 62 6c 65 0a  ck if the table.
18110 20 20 20 20 2a 2a 20 69 73 20 61 20 74 65 6d 70      ** is a temp
18120 20 74 61 62 6c 65 2e 20 49 66 20 73 6f 2c 20 73   table. If so, s
18130 65 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20  et the database 
18140 74 6f 20 31 2e 20 44 6f 20 6e 6f 74 20 64 6f 20  to 1. Do not do 
18150 74 68 69 73 0a 20 20 20 20 2a 2a 20 69 66 20 69  this.    ** if i
18160 6e 69 74 69 61 6c 69 73 69 6e 67 20 61 20 64 61  nitialising a da
18170 74 61 62 61 73 65 20 73 63 68 65 6d 61 2e 0a 20  tabase schema.. 
18180 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 64     */.    if( !d
18190 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a  b->init.busy ){.
181a0 20 20 20 20 20 20 70 54 61 62 20 3d 20 73 71 6c        pTab = sql
181b0 69 74 65 33 53 72 63 4c 69 73 74 4c 6f 6f 6b 75  ite3SrcListLooku
181c0 70 28 70 50 61 72 73 65 2c 20 70 54 62 6c 4e 61  p(pParse, pTblNa
181d0 6d 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  me);.      if( p
181e0 4e 61 6d 65 32 2d 3e 6e 3d 3d 30 20 26 26 20 70  Name2->n==0 && p
181f0 54 61 62 20 26 26 20 70 54 61 62 2d 3e 70 53 63  Tab && pTab->pSc
18200 68 65 6d 61 3d 3d 64 62 2d 3e 61 44 62 5b 31 5d  hema==db->aDb[1]
18210 2e 70 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20  .pSchema ){.    
18220 20 20 20 20 69 44 62 20 3d 20 31 3b 0a 20 20 20      iDb = 1;.   
18230 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69     }.    }.#endi
18240 66 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 46 69  f..    sqlite3Fi
18250 78 49 6e 69 74 28 26 73 46 69 78 2c 20 70 50 61  xInit(&sFix, pPa
18260 72 73 65 2c 20 69 44 62 2c 20 22 69 6e 64 65 78  rse, iDb, "index
18270 22 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 20 20 69  ", pName);.    i
18280 66 28 20 73 71 6c 69 74 65 33 46 69 78 53 72 63  f( sqlite3FixSrc
18290 4c 69 73 74 28 26 73 46 69 78 2c 20 70 54 62 6c  List(&sFix, pTbl
182a0 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 20 20 2f  Name) ){.      /
182b0 2a 20 42 65 63 61 75 73 65 20 74 68 65 20 70 61  * Because the pa
182c0 72 73 65 72 20 63 6f 6e 73 74 72 75 63 74 73 20  rser constructs 
182d0 70 54 62 6c 4e 61 6d 65 20 66 72 6f 6d 20 61 20  pTblName from a 
182e0 73 69 6e 67 6c 65 20 69 64 65 6e 74 69 66 69 65  single identifie
182f0 72 2c 0a 20 20 20 20 20 20 2a 2a 20 73 71 6c 69  r,.      ** sqli
18300 74 65 33 46 69 78 53 72 63 4c 69 73 74 20 63 61  te3FixSrcList ca
18310 6e 20 6e 65 76 65 72 20 66 61 69 6c 2e 20 2a 2f  n never fail. */
18320 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 30 29  .      assert(0)
18330 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 54 61 62  ;.    }.    pTab
18340 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65   = sqlite3Locate
18350 54 61 62 6c 65 49 74 65 6d 28 70 50 61 72 73 65  TableItem(pParse
18360 2c 20 30 2c 20 26 70 54 62 6c 4e 61 6d 65 2d 3e  , 0, &pTblName->
18370 61 5b 30 5d 29 3b 0a 20 20 20 20 61 73 73 65 72  a[0]);.    asser
18380 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  t( db->mallocFai
18390 6c 65 64 3d 3d 30 20 7c 7c 20 70 54 61 62 3d 3d  led==0 || pTab==
183a0 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70 54 61  0 );.    if( pTa
183b0 62 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78 69 74  b==0 ) goto exit
183c0 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
183d0 20 20 20 69 66 28 20 69 44 62 3d 3d 31 20 26 26     if( iDb==1 &&
183e0 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53   db->aDb[iDb].pS
183f0 63 68 65 6d 61 21 3d 70 54 61 62 2d 3e 70 53 63  chema!=pTab->pSc
18400 68 65 6d 61 20 29 7b 0a 20 20 20 20 20 20 73 71  hema ){.      sq
18410 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
18420 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20 20  arse, .         
18430 20 20 22 63 61 6e 6e 6f 74 20 63 72 65 61 74 65    "cannot create
18440 20 61 20 54 45 4d 50 20 69 6e 64 65 78 20 6f 6e   a TEMP index on
18450 20 6e 6f 6e 2d 54 45 4d 50 20 74 61 62 6c 65 20   non-TEMP table 
18460 5c 22 25 73 5c 22 22 2c 0a 20 20 20 20 20 20 20  \"%s\"",.       
18470 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29      pTab->zName)
18480 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69  ;.      goto exi
18490 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
184a0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21 48      }.    if( !H
184b0 61 73 52 6f 77 69 64 28 70 54 61 62 29 20 29 20  asRowid(pTab) ) 
184c0 70 50 6b 20 3d 20 73 71 6c 69 74 65 33 50 72 69  pPk = sqlite3Pri
184d0 6d 61 72 79 4b 65 79 49 6e 64 65 78 28 70 54 61  maryKeyIndex(pTa
184e0 62 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  b);.  }else{.   
184f0 20 61 73 73 65 72 74 28 20 70 4e 61 6d 65 3d 3d   assert( pName==
18500 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
18510 20 70 53 74 61 72 74 3d 3d 30 20 29 3b 0a 20 20   pStart==0 );.  
18520 20 20 70 54 61 62 20 3d 20 70 50 61 72 73 65 2d    pTab = pParse-
18530 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 20 20  >pNewTable;.    
18540 69 66 28 20 21 70 54 61 62 20 29 20 67 6f 74 6f  if( !pTab ) goto
18550 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
18560 65 78 3b 0a 20 20 20 20 69 44 62 20 3d 20 73 71  ex;.    iDb = sq
18570 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64  lite3SchemaToInd
18580 65 78 28 64 62 2c 20 70 54 61 62 2d 3e 70 53 63  ex(db, pTab->pSc
18590 68 65 6d 61 29 3b 0a 20 20 7d 0a 20 20 70 44 62  hema);.  }.  pDb
185a0 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d   = &db->aDb[iDb]
185b0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 54 61  ;..  assert( pTa
185c0 62 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  b!=0 );.  assert
185d0 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d  ( pParse->nErr==
185e0 30 20 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  0 );.  if( sqlit
185f0 65 33 53 74 72 4e 49 43 6d 70 28 70 54 61 62 2d  e3StrNICmp(pTab-
18600 3e 7a 4e 61 6d 65 2c 20 22 73 71 6c 69 74 65 5f  >zName, "sqlite_
18610 22 2c 20 37 29 3d 3d 30 20 0a 20 20 20 20 20 20  ", 7)==0 .      
18620 20 26 26 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73   && db->init.bus
18630 79 3d 3d 30 0a 23 69 66 20 53 51 4c 49 54 45 5f  y==0.#if SQLITE_
18640 55 53 45 52 5f 41 55 54 48 45 4e 54 49 43 41 54  USER_AUTHENTICAT
18650 49 4f 4e 0a 20 20 20 20 20 20 20 26 26 20 73 71  ION.       && sq
18660 6c 69 74 65 33 55 73 65 72 41 75 74 68 54 61 62  lite3UserAuthTab
18670 6c 65 28 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3d  le(pTab->zName)=
18680 3d 30 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  =0.#endif.      
18690 20 26 26 20 73 71 6c 69 74 65 33 53 74 72 4e 49   && sqlite3StrNI
186a0 43 6d 70 28 26 70 54 61 62 2d 3e 7a 4e 61 6d 65  Cmp(&pTab->zName
186b0 5b 37 5d 2c 22 61 6c 74 65 72 74 61 62 5f 22 2c  [7],"altertab_",
186c0 39 29 21 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  9)!=0 ){.    sql
186d0 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
186e0 72 73 65 2c 20 22 74 61 62 6c 65 20 25 73 20 6d  rse, "table %s m
186f0 61 79 20 6e 6f 74 20 62 65 20 69 6e 64 65 78 65  ay not be indexe
18700 64 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29  d", pTab->zName)
18710 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f  ;.    goto exit_
18720 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
18730 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
18740 5f 4f 4d 49 54 5f 56 49 45 57 0a 20 20 69 66 28  _OMIT_VIEW.  if(
18750 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 29   pTab->pSelect )
18760 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
18770 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 76  orMsg(pParse, "v
18780 69 65 77 73 20 6d 61 79 20 6e 6f 74 20 62 65 20  iews may not be 
18790 69 6e 64 65 78 65 64 22 29 3b 0a 20 20 20 20 67  indexed");.    g
187a0 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
187b0 69 6e 64 65 78 3b 0a 20 20 7d 0a 23 65 6e 64 69  index;.  }.#endi
187c0 66 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  f.#ifndef SQLITE
187d0 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
187e0 4c 45 0a 20 20 69 66 28 20 49 73 56 69 72 74 75  LE.  if( IsVirtu
187f0 61 6c 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20  al(pTab) ){.    
18800 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
18810 70 50 61 72 73 65 2c 20 22 76 69 72 74 75 61 6c  pParse, "virtual
18820 20 74 61 62 6c 65 73 20 6d 61 79 20 6e 6f 74 20   tables may not 
18830 62 65 20 69 6e 64 65 78 65 64 22 29 3b 0a 20 20  be indexed");.  
18840 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61    goto exit_crea
18850 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 23 65  te_index;.  }.#e
18860 6e 64 69 66 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  ndif..  /*.  ** 
18870 46 69 6e 64 20 74 68 65 20 6e 61 6d 65 20 6f 66  Find the name of
18880 20 74 68 65 20 69 6e 64 65 78 2e 20 20 4d 61 6b   the index.  Mak
18890 65 20 73 75 72 65 20 74 68 65 72 65 20 69 73 20  e sure there is 
188a0 6e 6f 74 20 61 6c 72 65 61 64 79 20 61 6e 6f 74  not already anot
188b0 68 65 72 0a 20 20 2a 2a 20 69 6e 64 65 78 20 6f  her.  ** index o
188c0 72 20 74 61 62 6c 65 20 77 69 74 68 20 74 68 65  r table with the
188d0 20 73 61 6d 65 20 6e 61 6d 65 2e 20 20 0a 20 20   same name.  .  
188e0 2a 2a 0a 20 20 2a 2a 20 45 78 63 65 70 74 69 6f  **.  ** Exceptio
188f0 6e 3a 20 20 49 66 20 77 65 20 61 72 65 20 72 65  n:  If we are re
18900 61 64 69 6e 67 20 74 68 65 20 6e 61 6d 65 73 20  ading the names 
18910 6f 66 20 70 65 72 6d 61 6e 65 6e 74 20 69 6e 64  of permanent ind
18920 69 63 65 73 20 66 72 6f 6d 20 74 68 65 0a 20 20  ices from the.  
18930 2a 2a 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  ** sqlite_master
18940 20 74 61 62 6c 65 20 28 62 65 63 61 75 73 65 20   table (because 
18950 73 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f 63 65  some other proce
18960 73 73 20 63 68 61 6e 67 65 64 20 74 68 65 20 73  ss changed the s
18970 63 68 65 6d 61 29 20 61 6e 64 0a 20 20 2a 2a 20  chema) and.  ** 
18980 6f 6e 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78  one of the index
18990 20 6e 61 6d 65 73 20 63 6f 6c 6c 69 64 65 73 20   names collides 
189a0 77 69 74 68 20 74 68 65 20 6e 61 6d 65 20 6f 66  with the name of
189b0 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62   a temporary tab
189c0 6c 65 20 6f 72 0a 20 20 2a 2a 20 69 6e 64 65 78  le or.  ** index
189d0 2c 20 74 68 65 6e 20 77 65 20 77 69 6c 6c 20 63  , then we will c
189e0 6f 6e 74 69 6e 75 65 20 74 6f 20 70 72 6f 63 65  ontinue to proce
189f0 73 73 20 74 68 69 73 20 69 6e 64 65 78 2e 0a 20  ss this index.. 
18a00 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 70 4e 61 6d   **.  ** If pNam
18a10 65 3d 3d 30 20 69 74 20 6d 65 61 6e 73 20 74 68  e==0 it means th
18a20 61 74 20 77 65 20 61 72 65 0a 20 20 2a 2a 20 64  at we are.  ** d
18a30 65 61 6c 69 6e 67 20 77 69 74 68 20 61 20 70 72  ealing with a pr
18a40 69 6d 61 72 79 20 6b 65 79 20 6f 72 20 55 4e 49  imary key or UNI
18a50 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 2e 20  QUE constraint. 
18a60 20 57 65 20 68 61 76 65 20 74 6f 20 69 6e 76 65   We have to inve
18a70 6e 74 20 6f 75 72 0a 20 20 2a 2a 20 6f 77 6e 20  nt our.  ** own 
18a80 6e 61 6d 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  name..  */.  if(
18a90 20 70 4e 61 6d 65 20 29 7b 0a 20 20 20 20 7a 4e   pName ){.    zN
18aa0 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d  ame = sqlite3Nam
18ab0 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70  eFromToken(db, p
18ac0 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 7a  Name);.    if( z
18ad0 4e 61 6d 65 3d 3d 30 20 29 20 67 6f 74 6f 20 65  Name==0 ) goto e
18ae0 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
18af0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4e  ;.    assert( pN
18b00 61 6d 65 2d 3e 7a 21 3d 30 20 29 3b 0a 20 20 20  ame->z!=0 );.   
18b10 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d   if( SQLITE_OK!=
18b20 73 71 6c 69 74 65 33 43 68 65 63 6b 4f 62 6a 65  sqlite3CheckObje
18b30 63 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 7a  ctName(pParse, z
18b40 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 20 20 67  Name) ){.      g
18b50 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
18b60 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20  index;.    }.   
18b70 20 69 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62   if( !db->init.b
18b80 75 73 79 20 29 7b 0a 20 20 20 20 20 20 69 66 28  usy ){.      if(
18b90 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c   sqlite3FindTabl
18ba0 65 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 30 29 21  e(db, zName, 0)!
18bb0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  =0 ){.        sq
18bc0 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
18bd0 61 72 73 65 2c 20 22 74 68 65 72 65 20 69 73 20  arse, "there is 
18be0 61 6c 72 65 61 64 79 20 61 20 74 61 62 6c 65 20  already a table 
18bf0 6e 61 6d 65 64 20 25 73 22 2c 20 7a 4e 61 6d 65  named %s", zName
18c00 29 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  );.        goto 
18c10 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
18c20 78 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  x;.      }.    }
18c30 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
18c40 46 69 6e 64 49 6e 64 65 78 28 64 62 2c 20 7a 4e  FindIndex(db, zN
18c50 61 6d 65 2c 20 70 44 62 2d 3e 7a 44 62 53 4e 61  ame, pDb->zDbSNa
18c60 6d 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  me)!=0 ){.      
18c70 69 66 28 20 21 69 66 4e 6f 74 45 78 69 73 74 20  if( !ifNotExist 
18c80 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
18c90 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
18ca0 65 2c 20 22 69 6e 64 65 78 20 25 73 20 61 6c 72  e, "index %s alr
18cb0 65 61 64 79 20 65 78 69 73 74 73 22 2c 20 7a 4e  eady exists", zN
18cc0 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  ame);.      }els
18cd0 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  e{.        asser
18ce0 74 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73  t( !db->init.bus
18cf0 79 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  y );.        sql
18d00 69 74 65 33 43 6f 64 65 56 65 72 69 66 79 53 63  ite3CodeVerifySc
18d10 68 65 6d 61 28 70 50 61 72 73 65 2c 20 69 44 62  hema(pParse, iDb
18d20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
18d30 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
18d40 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20  e_index;.    }. 
18d50 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20   }else{.    int 
18d60 6e 3b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 4c  n;.    Index *pL
18d70 6f 6f 70 3b 0a 20 20 20 20 66 6f 72 28 70 4c 6f  oop;.    for(pLo
18d80 6f 70 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 2c  op=pTab->pIndex,
18d90 20 6e 3d 31 3b 20 70 4c 6f 6f 70 3b 20 70 4c 6f   n=1; pLoop; pLo
18da0 6f 70 3d 70 4c 6f 6f 70 2d 3e 70 4e 65 78 74 2c  op=pLoop->pNext,
18db0 20 6e 2b 2b 29 7b 7d 0a 20 20 20 20 7a 4e 61 6d   n++){}.    zNam
18dc0 65 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e  e = sqlite3MPrin
18dd0 74 66 28 64 62 2c 20 22 73 71 6c 69 74 65 5f 61  tf(db, "sqlite_a
18de0 75 74 6f 69 6e 64 65 78 5f 25 73 5f 25 64 22 2c  utoindex_%s_%d",
18df0 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 6e 29   pTab->zName, n)
18e00 3b 0a 20 20 20 20 69 66 28 20 7a 4e 61 6d 65 3d  ;.    if( zName=
18e10 3d 30 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  =0 ){.      goto
18e20 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
18e30 65 78 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ex;.    }..    /
18e40 2a 20 41 75 74 6f 6d 61 74 69 63 20 69 6e 64 65  * Automatic inde
18e50 78 20 6e 61 6d 65 73 20 67 65 6e 65 72 61 74 65  x names generate
18e60 64 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 73 71  d from within sq
18e70 6c 69 74 65 33 5f 64 65 63 6c 61 72 65 5f 76 74  lite3_declare_vt
18e80 61 62 28 29 0a 20 20 20 20 2a 2a 20 6d 75 73 74  ab().    ** must
18e90 20 68 61 76 65 20 6e 61 6d 65 73 20 74 68 61 74   have names that
18ea0 20 61 72 65 20 64 69 73 74 69 6e 63 74 20 66 72   are distinct fr
18eb0 6f 6d 20 6e 6f 72 6d 61 6c 20 61 75 74 6f 6d 61  om normal automa
18ec0 74 69 63 20 69 6e 64 65 78 20 6e 61 6d 65 73 2e  tic index names.
18ed0 0a 20 20 20 20 2a 2a 20 54 68 65 20 66 6f 6c 6c  .    ** The foll
18ee0 6f 77 69 6e 67 20 73 74 61 74 65 6d 65 6e 74 20  owing statement 
18ef0 63 6f 6e 76 65 72 74 73 20 22 73 71 6c 69 74 65  converts "sqlite
18f00 33 5f 61 75 74 6f 69 6e 64 65 78 2e 2e 2e 22 20  3_autoindex..." 
18f10 69 6e 74 6f 0a 20 20 20 20 2a 2a 20 22 73 71 6c  into.    ** "sql
18f20 69 74 65 33 5f 62 75 74 6f 69 6e 64 65 78 2e 2e  ite3_butoindex..
18f30 2e 22 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 6d  ." in order to m
18f40 61 6b 65 20 74 68 65 20 6e 61 6d 65 73 20 64 69  ake the names di
18f50 73 74 69 6e 63 74 2e 0a 20 20 20 20 2a 2a 20 54  stinct..    ** T
18f60 68 65 20 22 76 74 61 62 5f 65 72 72 2e 74 65 73  he "vtab_err.tes
18f70 74 22 20 74 65 73 74 20 64 65 6d 6f 6e 73 74 72  t" test demonstr
18f80 61 74 65 73 20 74 68 65 20 6e 65 65 64 20 6f 66  ates the need of
18f90 20 74 68 69 73 20 73 74 61 74 65 6d 65 6e 74 2e   this statement.
18fa0 20 2a 2f 0a 20 20 20 20 69 66 28 20 49 4e 5f 44   */.    if( IN_D
18fb0 45 43 4c 41 52 45 5f 56 54 41 42 20 29 20 7a 4e  ECLARE_VTAB ) zN
18fc0 61 6d 65 5b 37 5d 2b 2b 3b 0a 20 20 7d 0a 0a 20  ame[7]++;.  }.. 
18fd0 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 61 75   /* Check for au
18fe0 74 68 6f 72 69 7a 61 74 69 6f 6e 20 74 6f 20 63  thorization to c
18ff0 72 65 61 74 65 20 61 6e 20 69 6e 64 65 78 2e 0a  reate an index..
19000 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c    */.#ifndef SQL
19010 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49  ITE_OMIT_AUTHORI
19020 5a 41 54 49 4f 4e 0a 20 20 7b 0a 20 20 20 20 63  ZATION.  {.    c
19030 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 20 3d  onst char *zDb =
19040 20 70 44 62 2d 3e 7a 44 62 53 4e 61 6d 65 3b 0a   pDb->zDbSName;.
19050 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 41      if( sqlite3A
19060 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c  uthCheck(pParse,
19070 20 53 51 4c 49 54 45 5f 49 4e 53 45 52 54 2c 20   SQLITE_INSERT, 
19080 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 44 62  SCHEMA_TABLE(iDb
19090 29 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20  ), 0, zDb) ){.  
190a0 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72      goto exit_cr
190b0 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20  eate_index;.    
190c0 7d 0a 20 20 20 20 69 20 3d 20 53 51 4c 49 54 45  }.    i = SQLITE
190d0 5f 43 52 45 41 54 45 5f 49 4e 44 45 58 3b 0a 20  _CREATE_INDEX;. 
190e0 20 20 20 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d     if( !OMIT_TEM
190f0 50 44 42 20 26 26 20 69 44 62 3d 3d 31 20 29 20  PDB && iDb==1 ) 
19100 69 20 3d 20 53 51 4c 49 54 45 5f 43 52 45 41 54  i = SQLITE_CREAT
19110 45 5f 54 45 4d 50 5f 49 4e 44 45 58 3b 0a 20 20  E_TEMP_INDEX;.  
19120 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74    if( sqlite3Aut
19130 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 69  hCheck(pParse, i
19140 2c 20 7a 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 7a  , zName, pTab->z
19150 4e 61 6d 65 2c 20 7a 44 62 29 20 29 7b 0a 20 20  Name, zDb) ){.  
19160 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72      goto exit_cr
19170 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20  eate_index;.    
19180 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  }.  }.#endif..  
19190 2f 2a 20 49 66 20 70 4c 69 73 74 3d 3d 30 2c 20  /* If pList==0, 
191a0 69 74 20 6d 65 61 6e 73 20 74 68 69 73 20 72 6f  it means this ro
191b0 75 74 69 6e 65 20 77 61 73 20 63 61 6c 6c 65 64  utine was called
191c0 20 74 6f 20 6d 61 6b 65 20 61 20 70 72 69 6d 61   to make a prima
191d0 72 79 0a 20 20 2a 2a 20 6b 65 79 20 6f 75 74 20  ry.  ** key out 
191e0 6f 66 20 74 68 65 20 6c 61 73 74 20 63 6f 6c 75  of the last colu
191f0 6d 6e 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  mn added to the 
19200 74 61 62 6c 65 20 75 6e 64 65 72 20 63 6f 6e 73  table under cons
19210 74 72 75 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 53  truction..  ** S
19220 6f 20 63 72 65 61 74 65 20 61 20 66 61 6b 65 20  o create a fake 
19230 6c 69 73 74 20 74 6f 20 73 69 6d 75 6c 61 74 65  list to simulate
19240 20 74 68 69 73 2e 0a 20 20 2a 2f 0a 20 20 69 66   this..  */.  if
19250 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20  ( pList==0 ){.  
19260 20 20 54 6f 6b 65 6e 20 70 72 65 76 43 6f 6c 3b    Token prevCol;
19270 0a 20 20 20 20 73 71 6c 69 74 65 33 54 6f 6b 65  .    sqlite3Toke
19280 6e 49 6e 69 74 28 26 70 72 65 76 43 6f 6c 2c 20  nInit(&prevCol, 
19290 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 54 61 62 2d  pTab->aCol[pTab-
192a0 3e 6e 43 6f 6c 2d 31 5d 2e 7a 4e 61 6d 65 29 3b  >nCol-1].zName);
192b0 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 73 71 6c  .    pList = sql
192c0 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65  ite3ExprListAppe
192d0 6e 64 28 70 50 61 72 73 65 2c 20 30 2c 0a 20 20  nd(pParse, 0,.  
192e0 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
192f0 74 65 33 45 78 70 72 41 6c 6c 6f 63 28 64 62 2c  te3ExprAlloc(db,
19300 20 54 4b 5f 49 44 2c 20 26 70 72 65 76 43 6f 6c   TK_ID, &prevCol
19310 2c 20 30 29 29 3b 0a 20 20 20 20 69 66 28 20 70  , 0));.    if( p
19320 4c 69 73 74 3d 3d 30 20 29 20 67 6f 74 6f 20 65  List==0 ) goto e
19330 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
19340 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4c  ;.    assert( pL
19350 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 31 20 29 3b  ist->nExpr==1 );
19360 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
19370 4c 69 73 74 53 65 74 53 6f 72 74 4f 72 64 65 72  ListSetSortOrder
19380 28 70 4c 69 73 74 2c 20 73 6f 72 74 4f 72 64 65  (pList, sortOrde
19390 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  r);.  }else{.   
193a0 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
193b0 43 68 65 63 6b 4c 65 6e 67 74 68 28 70 50 61 72  CheckLength(pPar
193c0 73 65 2c 20 70 4c 69 73 74 2c 20 22 69 6e 64 65  se, pList, "inde
193d0 78 22 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46  x");.  }..  /* F
193e0 69 67 75 72 65 20 6f 75 74 20 68 6f 77 20 6d 61  igure out how ma
193f0 6e 79 20 62 79 74 65 73 20 6f 66 20 73 70 61 63  ny bytes of spac
19400 65 20 61 72 65 20 72 65 71 75 69 72 65 64 20 74  e are required t
19410 6f 20 73 74 6f 72 65 20 65 78 70 6c 69 63 69 74  o store explicit
19420 6c 79 0a 20 20 2a 2a 20 73 70 65 63 69 66 69 65  ly.  ** specifie
19430 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  d collation sequ
19440 65 6e 63 65 20 6e 61 6d 65 73 2e 0a 20 20 2a 2f  ence names..  */
19450 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c  .  for(i=0; i<pL
19460 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  ist->nExpr; i++)
19470 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45 78 70  {.    Expr *pExp
19480 72 20 3d 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  r = pList->a[i].
19490 70 45 78 70 72 3b 0a 20 20 20 20 61 73 73 65 72  pExpr;.    asser
194a0 74 28 20 70 45 78 70 72 21 3d 30 20 29 3b 0a 20  t( pExpr!=0 );. 
194b0 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70     if( pExpr->op
194c0 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45 20 29 7b 0a  ==TK_COLLATE ){.
194d0 20 20 20 20 20 20 6e 45 78 74 72 61 20 2b 3d 20        nExtra += 
194e0 28 31 20 2b 20 73 71 6c 69 74 65 33 53 74 72 6c  (1 + sqlite3Strl
194f0 65 6e 33 30 28 70 45 78 70 72 2d 3e 75 2e 7a 54  en30(pExpr->u.zT
19500 6f 6b 65 6e 29 29 3b 0a 20 20 20 20 7d 0a 20 20  oken));.    }.  
19510 7d 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 41 6c  }..  /* .  ** Al
19520 6c 6f 63 61 74 65 20 74 68 65 20 69 6e 64 65 78  locate the index
19530 20 73 74 72 75 63 74 75 72 65 2e 20 0a 20 20 2a   structure. .  *
19540 2f 0a 20 20 6e 4e 61 6d 65 20 3d 20 73 71 6c 69  /.  nName = sqli
19550 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4e 61 6d  te3Strlen30(zNam
19560 65 29 3b 0a 20 20 6e 45 78 74 72 61 43 6f 6c 20  e);.  nExtraCol 
19570 3d 20 70 50 6b 20 3f 20 70 50 6b 2d 3e 6e 4b 65  = pPk ? pPk->nKe
19580 79 43 6f 6c 20 3a 20 31 3b 0a 20 20 70 49 6e 64  yCol : 1;.  pInd
19590 65 78 20 3d 20 73 71 6c 69 74 65 33 41 6c 6c 6f  ex = sqlite3Allo
195a0 63 61 74 65 49 6e 64 65 78 4f 62 6a 65 63 74 28  cateIndexObject(
195b0 64 62 2c 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72  db, pList->nExpr
195c0 20 2b 20 6e 45 78 74 72 61 43 6f 6c 2c 0a 20 20   + nExtraCol,.  
195d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
195e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
195f0 20 20 20 20 6e 4e 61 6d 65 20 2b 20 6e 45 78 74      nName + nExt
19600 72 61 20 2b 20 31 2c 20 26 7a 45 78 74 72 61 29  ra + 1, &zExtra)
19610 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c  ;.  if( db->mall
19620 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
19630 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
19640 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 61 73  _index;.  }.  as
19650 73 65 72 74 28 20 45 49 47 48 54 5f 42 59 54 45  sert( EIGHT_BYTE
19660 5f 41 4c 49 47 4e 4d 45 4e 54 28 70 49 6e 64 65  _ALIGNMENT(pInde
19670 78 2d 3e 61 69 52 6f 77 4c 6f 67 45 73 74 29 20  x->aiRowLogEst) 
19680 29 3b 0a 20 20 61 73 73 65 72 74 28 20 45 49 47  );.  assert( EIG
19690 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e  HT_BYTE_ALIGNMEN
196a0 54 28 70 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c  T(pIndex->azColl
196b0 29 20 29 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 7a  ) );.  pIndex->z
196c0 4e 61 6d 65 20 3d 20 7a 45 78 74 72 61 3b 0a 20  Name = zExtra;. 
196d0 20 7a 45 78 74 72 61 20 2b 3d 20 6e 4e 61 6d 65   zExtra += nName
196e0 20 2b 20 31 3b 0a 20 20 6d 65 6d 63 70 79 28 70   + 1;.  memcpy(p
196f0 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 7a 4e  Index->zName, zN
19700 61 6d 65 2c 20 6e 4e 61 6d 65 2b 31 29 3b 0a 20  ame, nName+1);. 
19710 20 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 20   pIndex->pTable 
19720 3d 20 70 54 61 62 3b 0a 20 20 70 49 6e 64 65 78  = pTab;.  pIndex
19730 2d 3e 6f 6e 45 72 72 6f 72 20 3d 20 28 75 38 29  ->onError = (u8)
19740 6f 6e 45 72 72 6f 72 3b 0a 20 20 70 49 6e 64 65  onError;.  pInde
19750 78 2d 3e 75 6e 69 71 4e 6f 74 4e 75 6c 6c 20 3d  x->uniqNotNull =
19760 20 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e   onError!=OE_Non
19770 65 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 69 64 78  e;.  pIndex->idx
19780 54 79 70 65 20 3d 20 69 64 78 54 79 70 65 3b 0a  Type = idxType;.
19790 20 20 70 49 6e 64 65 78 2d 3e 70 53 63 68 65 6d    pIndex->pSchem
197a0 61 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d  a = db->aDb[iDb]
197b0 2e 70 53 63 68 65 6d 61 3b 0a 20 20 70 49 6e 64  .pSchema;.  pInd
197c0 65 78 2d 3e 6e 4b 65 79 43 6f 6c 20 3d 20 70 4c  ex->nKeyCol = pL
197d0 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 69 66  ist->nExpr;.  if
197e0 28 20 70 50 49 57 68 65 72 65 20 29 7b 0a 20 20  ( pPIWhere ){.  
197f0 20 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65    sqlite3Resolve
19800 53 65 6c 66 52 65 66 65 72 65 6e 63 65 28 70 50  SelfReference(pP
19810 61 72 73 65 2c 20 70 54 61 62 2c 20 4e 43 5f 50  arse, pTab, NC_P
19820 61 72 74 49 64 78 2c 20 70 50 49 57 68 65 72 65  artIdx, pPIWhere
19830 2c 20 30 29 3b 0a 20 20 20 20 70 49 6e 64 65 78  , 0);.    pIndex
19840 2d 3e 70 50 61 72 74 49 64 78 57 68 65 72 65 20  ->pPartIdxWhere 
19850 3d 20 70 50 49 57 68 65 72 65 3b 0a 20 20 20 20  = pPIWhere;.    
19860 70 50 49 57 68 65 72 65 20 3d 20 30 3b 0a 20 20  pPIWhere = 0;.  
19870 7d 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  }.  assert( sqli
19880 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65  te3SchemaMutexHe
19890 6c 64 28 64 62 2c 20 69 44 62 2c 20 30 29 20 29  ld(db, iDb, 0) )
198a0 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f  ;..  /* Check to
198b0 20 73 65 65 20 69 66 20 77 65 20 73 68 6f 75 6c   see if we shoul
198c0 64 20 68 6f 6e 6f 72 20 44 45 53 43 20 72 65 71  d honor DESC req
198d0 75 65 73 74 73 20 6f 6e 20 69 6e 64 65 78 20 63  uests on index c
198e0 6f 6c 75 6d 6e 73 0a 20 20 2a 2f 0a 20 20 69 66  olumns.  */.  if
198f0 28 20 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e  ( pDb->pSchema->
19900 66 69 6c 65 5f 66 6f 72 6d 61 74 3e 3d 34 20 29  file_format>=4 )
19910 7b 0a 20 20 20 20 73 6f 72 74 4f 72 64 65 72 4d  {.    sortOrderM
19920 61 73 6b 20 3d 20 2d 31 3b 20 20 20 2f 2a 20 48  ask = -1;   /* H
19930 6f 6e 6f 72 20 44 45 53 43 20 2a 2f 0a 20 20 7d  onor DESC */.  }
19940 65 6c 73 65 7b 0a 20 20 20 20 73 6f 72 74 4f 72  else{.    sortOr
19950 64 65 72 4d 61 73 6b 20 3d 20 30 3b 20 20 20 20  derMask = 0;    
19960 2f 2a 20 49 67 6e 6f 72 65 20 44 45 53 43 20 2a  /* Ignore DESC *
19970 2f 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6e 61 6c  /.  }..  /* Anal
19980 79 7a 65 20 74 68 65 20 6c 69 73 74 20 6f 66 20  yze the list of 
19990 65 78 70 72 65 73 73 69 6f 6e 73 20 74 68 61 74  expressions that
199a0 20 66 6f 72 6d 20 74 68 65 20 74 65 72 6d 73 20   form the terms 
199b0 6f 66 20 74 68 65 20 69 6e 64 65 78 20 61 6e 64  of the index and
199c0 0a 20 20 2a 2a 20 72 65 70 6f 72 74 20 61 6e 79  .  ** report any
199d0 20 65 72 72 6f 72 73 2e 20 20 49 6e 20 74 68 65   errors.  In the
199e0 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65   common case whe
199f0 72 65 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  re the expressio
19a00 6e 20 69 73 20 65 78 61 63 74 6c 79 0a 20 20 2a  n is exactly.  *
19a10 2a 20 61 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e  * a table column
19a20 2c 20 73 74 6f 72 65 20 74 68 61 74 20 63 6f 6c  , store that col
19a30 75 6d 6e 20 69 6e 20 61 69 43 6f 6c 75 6d 6e 5b  umn in aiColumn[
19a40 5d 2e 20 20 46 6f 72 20 67 65 6e 65 72 61 6c 20  ].  For general 
19a50 65 78 70 72 65 73 73 69 6f 6e 73 2c 0a 20 20 2a  expressions,.  *
19a60 2a 20 70 6f 70 75 6c 61 74 65 20 70 49 6e 64 65  * populate pInde
19a70 78 2d 3e 61 43 6f 6c 45 78 70 72 20 61 6e 64 20  x->aColExpr and 
19a80 73 74 6f 72 65 20 58 4e 5f 45 58 50 52 20 28 2d  store XN_EXPR (-
19a90 32 29 20 69 6e 20 61 69 43 6f 6c 75 6d 6e 5b 5d  2) in aiColumn[]
19aa0 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 4f 44 4f  ..  **.  ** TODO
19ab0 3a 20 49 73 73 75 65 20 61 20 77 61 72 6e 69 6e  : Issue a warnin
19ac0 67 20 69 66 20 74 77 6f 20 6f 72 20 6d 6f 72 65  g if two or more
19ad0 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20   columns of the 
19ae0 69 6e 64 65 78 20 61 72 65 20 69 64 65 6e 74 69  index are identi
19af0 63 61 6c 2e 0a 20 20 2a 2a 20 54 4f 44 4f 3a 20  cal..  ** TODO: 
19b00 49 73 73 75 65 20 61 20 77 61 72 6e 69 6e 67 20  Issue a warning 
19b10 69 66 20 74 68 65 20 74 61 62 6c 65 20 70 72 69  if the table pri
19b20 6d 61 72 79 20 6b 65 79 20 69 73 20 75 73 65 64  mary key is used
19b30 20 61 73 20 70 61 72 74 20 6f 66 20 74 68 65 0a   as part of the.
19b40 20 20 2a 2a 20 69 6e 64 65 78 20 6b 65 79 2e 0a    ** index key..
19b50 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 2c 20    */.  for(i=0, 
19b60 70 4c 69 73 74 49 74 65 6d 3d 70 4c 69 73 74 2d  pListItem=pList-
19b70 3e 61 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78  >a; i<pList->nEx
19b80 70 72 3b 20 69 2b 2b 2c 20 70 4c 69 73 74 49 74  pr; i++, pListIt
19b90 65 6d 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20  em++){.    Expr 
19ba0 2a 70 43 45 78 70 72 3b 20 20 20 20 20 20 20 20  *pCExpr;        
19bb0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
19bc0 20 69 2d 74 68 20 69 6e 64 65 78 20 65 78 70 72   i-th index expr
19bd0 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 69 6e  ession */.    in
19be0 74 20 72 65 71 75 65 73 74 65 64 53 6f 72 74 4f  t requestedSortO
19bf0 72 64 65 72 3b 20 20 20 20 20 20 20 20 2f 2a 20  rder;        /* 
19c00 41 53 43 20 6f 72 20 44 45 53 43 20 6f 6e 20 74  ASC or DESC on t
19c10 68 65 20 69 2d 74 68 20 65 78 70 72 65 73 73 69  he i-th expressi
19c20 6f 6e 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20  on */.    const 
19c30 63 68 61 72 20 2a 7a 43 6f 6c 6c 3b 20 20 20 20  char *zColl;    
19c40 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 6c           /* Coll
19c50 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 6e  ation sequence n
19c60 61 6d 65 20 2a 2f 0a 0a 20 20 20 20 73 71 6c 69  ame */..    sqli
19c70 74 65 33 53 74 72 69 6e 67 54 6f 49 64 28 70 4c  te3StringToId(pL
19c80 69 73 74 49 74 65 6d 2d 3e 70 45 78 70 72 29 3b  istItem->pExpr);
19c90 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 73 6f  .    sqlite3Reso
19ca0 6c 76 65 53 65 6c 66 52 65 66 65 72 65 6e 63 65  lveSelfReference
19cb0 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20 4e  (pParse, pTab, N
19cc0 43 5f 49 64 78 45 78 70 72 2c 20 70 4c 69 73 74  C_IdxExpr, pList
19cd0 49 74 65 6d 2d 3e 70 45 78 70 72 2c 20 30 29 3b  Item->pExpr, 0);
19ce0 0a 20 20 20 20 69 66 28 20 70 50 61 72 73 65 2d  .    if( pParse-
19cf0 3e 6e 45 72 72 20 29 20 67 6f 74 6f 20 65 78 69  >nErr ) goto exi
19d00 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
19d10 20 20 20 20 70 43 45 78 70 72 20 3d 20 73 71 6c      pCExpr = sql
19d20 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c  ite3ExprSkipColl
19d30 61 74 65 28 70 4c 69 73 74 49 74 65 6d 2d 3e 70  ate(pListItem->p
19d40 45 78 70 72 29 3b 0a 20 20 20 20 69 66 28 20 70  Expr);.    if( p
19d50 43 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f  CExpr->op!=TK_CO
19d60 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 20 20 69 66  LUMN ){.      if
19d70 28 20 70 54 61 62 3d 3d 70 50 61 72 73 65 2d 3e  ( pTab==pParse->
19d80 70 4e 65 77 54 61 62 6c 65 20 29 7b 0a 20 20 20  pNewTable ){.   
19d90 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
19da0 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 65 78  rMsg(pParse, "ex
19db0 70 72 65 73 73 69 6f 6e 73 20 70 72 6f 68 69 62  pressions prohib
19dc0 69 74 65 64 20 69 6e 20 50 52 49 4d 41 52 59 20  ited in PRIMARY 
19dd0 4b 45 59 20 61 6e 64 20 22 0a 20 20 20 20 20 20  KEY and ".      
19de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19df0 20 20 20 20 20 20 20 20 20 20 22 55 4e 49 51 55            "UNIQU
19e00 45 20 63 6f 6e 73 74 72 61 69 6e 74 73 22 29 3b  E constraints");
19e10 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 78  .        goto ex
19e20 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
19e30 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
19e40 66 28 20 70 49 6e 64 65 78 2d 3e 61 43 6f 6c 45  f( pIndex->aColE
19e50 78 70 72 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  xpr==0 ){.      
19e60 20 20 45 78 70 72 4c 69 73 74 20 2a 70 43 6f 70    ExprList *pCop
19e70 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  y = sqlite3ExprL
19e80 69 73 74 44 75 70 28 64 62 2c 20 70 4c 69 73 74  istDup(db, pList
19e90 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70 49  , 0);.        pI
19ea0 6e 64 65 78 2d 3e 61 43 6f 6c 45 78 70 72 20 3d  ndex->aColExpr =
19eb0 20 70 43 6f 70 79 3b 0a 20 20 20 20 20 20 20 20   pCopy;.        
19ec0 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46  if( !db->mallocF
19ed0 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 20  ailed ){.       
19ee0 20 20 20 61 73 73 65 72 74 28 20 70 43 6f 70 79     assert( pCopy
19ef0 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20  !=0 );.         
19f00 20 70 4c 69 73 74 49 74 65 6d 20 3d 20 26 70 43   pListItem = &pC
19f10 6f 70 79 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 20  opy->a[i];.     
19f20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
19f30 20 20 20 6a 20 3d 20 58 4e 5f 45 58 50 52 3b 0a     j = XN_EXPR;.
19f40 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 61 69        pIndex->ai
19f50 43 6f 6c 75 6d 6e 5b 69 5d 20 3d 20 58 4e 5f 45  Column[i] = XN_E
19f60 58 50 52 3b 0a 20 20 20 20 20 20 70 49 6e 64 65  XPR;.      pInde
19f70 78 2d 3e 75 6e 69 71 4e 6f 74 4e 75 6c 6c 20 3d  x->uniqNotNull =
19f80 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   0;.    }else{. 
19f90 20 20 20 20 20 6a 20 3d 20 70 43 45 78 70 72 2d       j = pCExpr-
19fa0 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20  >iColumn;.      
19fb0 61 73 73 65 72 74 28 20 6a 3c 3d 30 78 37 66 66  assert( j<=0x7ff
19fc0 66 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6a  f );.      if( j
19fd0 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 6a 20  <0 ){.        j 
19fe0 3d 20 70 54 61 62 2d 3e 69 50 4b 65 79 3b 0a 20  = pTab->iPKey;. 
19ff0 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70       }else if( p
1a000 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 6e 6f 74  Tab->aCol[j].not
1a010 4e 75 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Null==0 ){.     
1a020 20 20 20 70 49 6e 64 65 78 2d 3e 75 6e 69 71 4e     pIndex->uniqN
1a030 6f 74 4e 75 6c 6c 20 3d 20 30 3b 0a 20 20 20 20  otNull = 0;.    
1a040 20 20 7d 0a 20 20 20 20 20 20 70 49 6e 64 65 78    }.      pIndex
1a050 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 20 3d 20  ->aiColumn[i] = 
1a060 28 69 31 36 29 6a 3b 0a 20 20 20 20 7d 0a 20 20  (i16)j;.    }.  
1a070 20 20 7a 43 6f 6c 6c 20 3d 20 30 3b 0a 20 20 20    zColl = 0;.   
1a080 20 69 66 28 20 70 4c 69 73 74 49 74 65 6d 2d 3e   if( pListItem->
1a090 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  pExpr->op==TK_CO
1a0a0 4c 4c 41 54 45 20 29 7b 0a 20 20 20 20 20 20 69  LLATE ){.      i
1a0b0 6e 74 20 6e 43 6f 6c 6c 3b 0a 20 20 20 20 20 20  nt nColl;.      
1a0c0 7a 43 6f 6c 6c 20 3d 20 70 4c 69 73 74 49 74 65  zColl = pListIte
1a0d0 6d 2d 3e 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b  m->pExpr->u.zTok
1a0e0 65 6e 3b 0a 20 20 20 20 20 20 6e 43 6f 6c 6c 20  en;.      nColl 
1a0f0 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
1a100 30 28 7a 43 6f 6c 6c 29 20 2b 20 31 3b 0a 20 20  0(zColl) + 1;.  
1a110 20 20 20 20 61 73 73 65 72 74 28 20 6e 45 78 74      assert( nExt
1a120 72 61 3e 3d 6e 43 6f 6c 6c 20 29 3b 0a 20 20 20  ra>=nColl );.   
1a130 20 20 20 6d 65 6d 63 70 79 28 7a 45 78 74 72 61     memcpy(zExtra
1a140 2c 20 7a 43 6f 6c 6c 2c 20 6e 43 6f 6c 6c 29 3b  , zColl, nColl);
1a150 0a 20 20 20 20 20 20 7a 43 6f 6c 6c 20 3d 20 7a  .      zColl = z
1a160 45 78 74 72 61 3b 0a 20 20 20 20 20 20 7a 45 78  Extra;.      zEx
1a170 74 72 61 20 2b 3d 20 6e 43 6f 6c 6c 3b 0a 20 20  tra += nColl;.  
1a180 20 20 20 20 6e 45 78 74 72 61 20 2d 3d 20 6e 43      nExtra -= nC
1a190 6f 6c 6c 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  oll;.    }else i
1a1a0 66 28 20 6a 3e 3d 30 20 29 7b 0a 20 20 20 20 20  f( j>=0 ){.     
1a1b0 20 7a 43 6f 6c 6c 20 3d 20 70 54 61 62 2d 3e 61   zColl = pTab->a
1a1c0 43 6f 6c 5b 6a 5d 2e 7a 43 6f 6c 6c 3b 0a 20 20  Col[j].zColl;.  
1a1d0 20 20 7d 0a 20 20 20 20 69 66 28 20 21 7a 43 6f    }.    if( !zCo
1a1e0 6c 6c 20 29 20 7a 43 6f 6c 6c 20 3d 20 73 71 6c  ll ) zColl = sql
1a1f0 69 74 65 33 53 74 72 42 49 4e 41 52 59 3b 0a 20  ite3StrBINARY;. 
1a200 20 20 20 69 66 28 20 21 64 62 2d 3e 69 6e 69 74     if( !db->init
1a210 2e 62 75 73 79 20 26 26 20 21 73 71 6c 69 74 65  .busy && !sqlite
1a220 33 4c 6f 63 61 74 65 43 6f 6c 6c 53 65 71 28 70  3LocateCollSeq(p
1a230 50 61 72 73 65 2c 20 7a 43 6f 6c 6c 29 20 29 7b  Parse, zColl) ){
1a240 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74  .      goto exit
1a250 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
1a260 20 20 20 7d 0a 20 20 20 20 70 49 6e 64 65 78 2d     }.    pIndex-
1a270 3e 61 7a 43 6f 6c 6c 5b 69 5d 20 3d 20 7a 43 6f  >azColl[i] = zCo
1a280 6c 6c 3b 0a 20 20 20 20 72 65 71 75 65 73 74 65  ll;.    requeste
1a290 64 53 6f 72 74 4f 72 64 65 72 20 3d 20 70 4c 69  dSortOrder = pLi
1a2a0 73 74 49 74 65 6d 2d 3e 73 6f 72 74 4f 72 64 65  stItem->sortOrde
1a2b0 72 20 26 20 73 6f 72 74 4f 72 64 65 72 4d 61 73  r & sortOrderMas
1a2c0 6b 3b 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e 61  k;.    pIndex->a
1a2d0 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20 3d 20 28  SortOrder[i] = (
1a2e0 75 38 29 72 65 71 75 65 73 74 65 64 53 6f 72 74  u8)requestedSort
1a2f0 4f 72 64 65 72 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  Order;.  }..  /*
1a300 20 41 70 70 65 6e 64 20 74 68 65 20 74 61 62 6c   Append the tabl
1a310 65 20 6b 65 79 20 74 6f 20 74 68 65 20 65 6e 64  e key to the end
1a320 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e 20 20   of the index.  
1a330 46 6f 72 20 57 49 54 48 4f 55 54 20 52 4f 57 49  For WITHOUT ROWI
1a340 44 0a 20 20 2a 2a 20 74 61 62 6c 65 73 20 28 77  D.  ** tables (w
1a350 68 65 6e 20 70 50 6b 21 3d 30 29 20 74 68 69 73  hen pPk!=0) this
1a360 20 77 69 6c 6c 20 62 65 20 74 68 65 20 64 65 63   will be the dec
1a370 6c 61 72 65 64 20 50 52 49 4d 41 52 59 20 4b 45  lared PRIMARY KE
1a380 59 2e 20 20 46 6f 72 0a 20 20 2a 2a 20 6e 6f 72  Y.  For.  ** nor
1a390 6d 61 6c 20 74 61 62 6c 65 73 20 28 77 68 65 6e  mal tables (when
1a3a0 20 70 50 6b 3d 3d 30 29 20 74 68 69 73 20 77 69   pPk==0) this wi
1a3b0 6c 6c 20 62 65 20 74 68 65 20 72 6f 77 69 64 2e  ll be the rowid.
1a3c0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 6b 20  .  */.  if( pPk 
1a3d0 29 7b 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20  ){.    for(j=0; 
1a3e0 6a 3c 70 50 6b 2d 3e 6e 4b 65 79 43 6f 6c 3b 20  j<pPk->nKeyCol; 
1a3f0 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  j++){.      int 
1a400 78 20 3d 20 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d  x = pPk->aiColum
1a410 6e 5b 6a 5d 3b 0a 20 20 20 20 20 20 61 73 73 65  n[j];.      asse
1a420 72 74 28 20 78 3e 3d 30 20 29 3b 0a 20 20 20 20  rt( x>=0 );.    
1a430 20 20 69 66 28 20 68 61 73 43 6f 6c 75 6d 6e 28    if( hasColumn(
1a440 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e  pIndex->aiColumn
1a450 2c 20 70 49 6e 64 65 78 2d 3e 6e 4b 65 79 43 6f  , pIndex->nKeyCo
1a460 6c 2c 20 78 29 20 29 7b 0a 20 20 20 20 20 20 20  l, x) ){.       
1a470 20 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e   pIndex->nColumn
1a480 2d 2d 3b 20 0a 20 20 20 20 20 20 7d 65 6c 73 65  --; .      }else
1a490 7b 0a 20 20 20 20 20 20 20 20 70 49 6e 64 65 78  {.        pIndex
1a4a0 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 20 3d 20  ->aiColumn[i] = 
1a4b0 78 3b 0a 20 20 20 20 20 20 20 20 70 49 6e 64 65  x;.        pInde
1a4c0 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 20 3d 20 70  x->azColl[i] = p
1a4d0 50 6b 2d 3e 61 7a 43 6f 6c 6c 5b 6a 5d 3b 0a 20  Pk->azColl[j];. 
1a4e0 20 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 61         pIndex->a
1a4f0 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20 3d 20 70  SortOrder[i] = p
1a500 50 6b 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 6a  Pk->aSortOrder[j
1a510 5d 3b 0a 20 20 20 20 20 20 20 20 69 2b 2b 3b 0a  ];.        i++;.
1a520 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1a530 20 20 61 73 73 65 72 74 28 20 69 3d 3d 70 49 6e    assert( i==pIn
1a540 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 3b 0a  dex->nColumn );.
1a550 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49 6e    }else{.    pIn
1a560 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d  dex->aiColumn[i]
1a570 20 3d 20 58 4e 5f 52 4f 57 49 44 3b 0a 20 20 20   = XN_ROWID;.   
1a580 20 70 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c 5b   pIndex->azColl[
1a590 69 5d 20 3d 20 73 71 6c 69 74 65 33 53 74 72 42  i] = sqlite3StrB
1a5a0 49 4e 41 52 59 3b 0a 20 20 7d 0a 20 20 73 71 6c  INARY;.  }.  sql
1a5b0 69 74 65 33 44 65 66 61 75 6c 74 52 6f 77 45 73  ite3DefaultRowEs
1a5c0 74 28 70 49 6e 64 65 78 29 3b 0a 20 20 69 66 28  t(pIndex);.  if(
1a5d0 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
1a5e0 6c 65 3d 3d 30 20 29 20 65 73 74 69 6d 61 74 65  le==0 ) estimate
1a5f0 49 6e 64 65 78 57 69 64 74 68 28 70 49 6e 64 65  IndexWidth(pInde
1a600 78 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69  x);..  /* If thi
1a610 73 20 69 6e 64 65 78 20 63 6f 6e 74 61 69 6e 73  s index contains
1a620 20 65 76 65 72 79 20 63 6f 6c 75 6d 6e 20 6f 66   every column of
1a630 20 69 74 73 20 74 61 62 6c 65 2c 20 74 68 65 6e   its table, then
1a640 20 6d 61 72 6b 0a 20 20 2a 2a 20 69 74 20 61 73   mark.  ** it as
1a650 20 61 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65   a covering inde
1a660 78 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 48  x */.  assert( H
1a670 61 73 52 6f 77 69 64 28 70 54 61 62 29 20 0a 20  asRowid(pTab) . 
1a680 20 20 20 20 20 7c 7c 20 70 54 61 62 2d 3e 69 50       || pTab->iP
1a690 4b 65 79 3c 30 20 7c 7c 20 73 71 6c 69 74 65 33  Key<0 || sqlite3
1a6a0 43 6f 6c 75 6d 6e 4f 66 49 6e 64 65 78 28 70 49  ColumnOfIndex(pI
1a6b0 6e 64 65 78 2c 20 70 54 61 62 2d 3e 69 50 4b 65  ndex, pTab->iPKe
1a6c0 79 29 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  y)>=0 );.  if( p
1a6d0 54 62 6c 4e 61 6d 65 21 3d 30 20 26 26 20 70 49  TblName!=0 && pI
1a6e0 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 3e 3d 70  ndex->nColumn>=p
1a6f0 54 61 62 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20  Tab->nCol ){.   
1a700 20 70 49 6e 64 65 78 2d 3e 69 73 43 6f 76 65 72   pIndex->isCover
1a710 69 6e 67 20 3d 20 31 3b 0a 20 20 20 20 66 6f 72  ing = 1;.    for
1a720 28 6a 3d 30 3b 20 6a 3c 70 54 61 62 2d 3e 6e 43  (j=0; j<pTab->nC
1a730 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  ol; j++){.      
1a740 69 66 28 20 6a 3d 3d 70 54 61 62 2d 3e 69 50 4b  if( j==pTab->iPK
1a750 65 79 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  ey ) continue;. 
1a760 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
1a770 43 6f 6c 75 6d 6e 4f 66 49 6e 64 65 78 28 70 49  ColumnOfIndex(pI
1a780 6e 64 65 78 2c 6a 29 3e 3d 30 20 29 20 63 6f 6e  ndex,j)>=0 ) con
1a790 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 70 49 6e  tinue;.      pIn
1a7a0 64 65 78 2d 3e 69 73 43 6f 76 65 72 69 6e 67 20  dex->isCovering 
1a7b0 3d 20 30 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  = 0;.      break
1a7c0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69  ;.    }.  }..  i
1a7d0 66 28 20 70 54 61 62 3d 3d 70 50 61 72 73 65 2d  f( pTab==pParse-
1a7e0 3e 70 4e 65 77 54 61 62 6c 65 20 29 7b 0a 20 20  >pNewTable ){.  
1a7f0 20 20 2f 2a 20 54 68 69 73 20 72 6f 75 74 69 6e    /* This routin
1a800 65 20 68 61 73 20 62 65 65 6e 20 63 61 6c 6c 65  e has been calle
1a810 64 20 74 6f 20 63 72 65 61 74 65 20 61 6e 20 61  d to create an a
1a820 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 61  utomatic index a
1a830 73 20 61 0a 20 20 20 20 2a 2a 20 72 65 73 75 6c  s a.    ** resul
1a840 74 20 6f 66 20 61 20 50 52 49 4d 41 52 59 20 4b  t of a PRIMARY K
1a850 45 59 20 6f 72 20 55 4e 49 51 55 45 20 63 6c 61  EY or UNIQUE cla
1a860 75 73 65 20 6f 6e 20 61 20 63 6f 6c 75 6d 6e 20  use on a column 
1a870 64 65 66 69 6e 69 74 69 6f 6e 2c 20 6f 72 0a 20  definition, or. 
1a880 20 20 20 2a 2a 20 61 20 50 52 49 4d 41 52 59 20     ** a PRIMARY 
1a890 4b 45 59 20 6f 72 20 55 4e 49 51 55 45 20 63 6c  KEY or UNIQUE cl
1a8a0 61 75 73 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74  ause following t
1a8b0 68 65 20 63 6f 6c 75 6d 6e 20 64 65 66 69 6e 69  he column defini
1a8c0 74 69 6f 6e 73 2e 0a 20 20 20 20 2a 2a 20 69 2e  tions..    ** i.
1a8d0 65 2e 20 6f 6e 65 20 6f 66 3a 0a 20 20 20 20 2a  e. one of:.    *
1a8e0 2a 0a 20 20 20 20 2a 2a 20 43 52 45 41 54 45 20  *.    ** CREATE 
1a8f0 54 41 42 4c 45 20 74 28 78 20 50 52 49 4d 41 52  TABLE t(x PRIMAR
1a900 59 20 4b 45 59 2c 20 79 29 3b 0a 20 20 20 20 2a  Y KEY, y);.    *
1a910 2a 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74  * CREATE TABLE t
1a920 28 78 2c 20 79 2c 20 55 4e 49 51 55 45 28 78 2c  (x, y, UNIQUE(x,
1a930 20 79 29 29 3b 0a 20 20 20 20 2a 2a 0a 20 20 20   y));.    **.   
1a940 20 2a 2a 20 45 69 74 68 65 72 20 77 61 79 2c 20   ** Either way, 
1a950 63 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  check to see if 
1a960 74 68 65 20 74 61 62 6c 65 20 61 6c 72 65 61 64  the table alread
1a970 79 20 68 61 73 20 73 75 63 68 20 61 6e 20 69 6e  y has such an in
1a980 64 65 78 2e 20 49 66 0a 20 20 20 20 2a 2a 20 73  dex. If.    ** s
1a990 6f 2c 20 64 6f 6e 27 74 20 62 6f 74 68 65 72 20  o, don't bother 
1a9a0 63 72 65 61 74 69 6e 67 20 74 68 69 73 20 6f 6e  creating this on
1a9b0 65 2e 20 54 68 69 73 20 6f 6e 6c 79 20 61 70 70  e. This only app
1a9c0 6c 69 65 73 20 74 6f 0a 20 20 20 20 2a 2a 20 61  lies to.    ** a
1a9d0 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63 72 65  utomatically cre
1a9e0 61 74 65 64 20 69 6e 64 69 63 65 73 2e 20 55 73  ated indices. Us
1a9f0 65 72 73 20 63 61 6e 20 64 6f 20 61 73 20 74 68  ers can do as th
1aa00 65 79 20 77 69 73 68 20 77 69 74 68 0a 20 20 20  ey wish with.   
1aa10 20 2a 2a 20 65 78 70 6c 69 63 69 74 20 69 6e 64   ** explicit ind
1aa20 69 63 65 73 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  ices..    **.   
1aa30 20 2a 2a 20 54 77 6f 20 55 4e 49 51 55 45 20 6f   ** Two UNIQUE o
1aa40 72 20 50 52 49 4d 41 52 59 20 4b 45 59 20 63 6f  r PRIMARY KEY co
1aa50 6e 73 74 72 61 69 6e 74 73 20 61 72 65 20 63 6f  nstraints are co
1aa60 6e 73 69 64 65 72 65 64 20 65 71 75 69 76 61 6c  nsidered equival
1aa70 65 6e 74 0a 20 20 20 20 2a 2a 20 28 61 6e 64 20  ent.    ** (and 
1aa80 74 68 75 73 20 73 75 70 70 72 65 73 73 69 6e 67  thus suppressing
1aa90 20 74 68 65 20 73 65 63 6f 6e 64 20 6f 6e 65 29   the second one)
1aaa0 20 65 76 65 6e 20 69 66 20 74 68 65 79 20 68 61   even if they ha
1aab0 76 65 20 64 69 66 66 65 72 65 6e 74 0a 20 20 20  ve different.   
1aac0 20 2a 2a 20 73 6f 72 74 20 6f 72 64 65 72 73 2e   ** sort orders.
1aad0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49  .    **.    ** I
1aae0 66 20 74 68 65 72 65 20 61 72 65 20 64 69 66 66  f there are diff
1aaf0 65 72 65 6e 74 20 63 6f 6c 6c 61 74 69 6e 67 20  erent collating 
1ab00 73 65 71 75 65 6e 63 65 73 20 6f 72 20 69 66 20  sequences or if 
1ab10 74 68 65 20 63 6f 6c 75 6d 6e 73 20 6f 66 0a 20  the columns of. 
1ab20 20 20 20 2a 2a 20 74 68 65 20 63 6f 6e 73 74 72     ** the constr
1ab30 61 69 6e 74 20 6f 63 63 75 72 20 69 6e 20 64 69  aint occur in di
1ab40 66 66 65 72 65 6e 74 20 6f 72 64 65 72 73 2c 20  fferent orders, 
1ab50 74 68 65 6e 20 74 68 65 20 63 6f 6e 73 74 72 61  then the constra
1ab60 69 6e 74 73 20 61 72 65 0a 20 20 20 20 2a 2a 20  ints are.    ** 
1ab70 63 6f 6e 73 69 64 65 72 65 64 20 64 69 73 74 69  considered disti
1ab80 6e 63 74 20 61 6e 64 20 62 6f 74 68 20 72 65 73  nct and both res
1ab90 75 6c 74 20 69 6e 20 73 65 70 61 72 61 74 65 20  ult in separate 
1aba0 69 6e 64 69 63 65 73 2e 0a 20 20 20 20 2a 2f 0a  indices..    */.
1abb0 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b      Index *pIdx;
1abc0 0a 20 20 20 20 66 6f 72 28 70 49 64 78 3d 70 54  .    for(pIdx=pT
1abd0 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78  ab->pIndex; pIdx
1abe0 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65  ; pIdx=pIdx->pNe
1abf0 78 74 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6b  xt){.      int k
1ac00 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1ac10 49 73 55 6e 69 71 75 65 49 6e 64 65 78 28 70 49  IsUniqueIndex(pI
1ac20 64 78 29 20 29 3b 0a 20 20 20 20 20 20 61 73 73  dx) );.      ass
1ac30 65 72 74 28 20 70 49 64 78 2d 3e 69 64 78 54 79  ert( pIdx->idxTy
1ac40 70 65 21 3d 53 51 4c 49 54 45 5f 49 44 58 54 59  pe!=SQLITE_IDXTY
1ac50 50 45 5f 41 50 50 44 45 46 20 29 3b 0a 20 20 20  PE_APPDEF );.   
1ac60 20 20 20 61 73 73 65 72 74 28 20 49 73 55 6e 69     assert( IsUni
1ac70 71 75 65 49 6e 64 65 78 28 70 49 6e 64 65 78 29  queIndex(pIndex)
1ac80 20 29 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 70   );..      if( p
1ac90 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 21 3d 70 49  Idx->nKeyCol!=pI
1aca0 6e 64 65 78 2d 3e 6e 4b 65 79 43 6f 6c 20 29 20  ndex->nKeyCol ) 
1acb0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
1acc0 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70 49 64 78 2d  for(k=0; k<pIdx-
1acd0 3e 6e 4b 65 79 43 6f 6c 3b 20 6b 2b 2b 29 7b 0a  >nKeyCol; k++){.
1ace0 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68          const ch
1acf0 61 72 20 2a 7a 31 3b 0a 20 20 20 20 20 20 20 20  ar *z1;.        
1ad00 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 32 3b 0a  const char *z2;.
1ad10 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
1ad20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6b  pIdx->aiColumn[k
1ad30 5d 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  ]>=0 );.        
1ad40 69 66 28 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75  if( pIdx->aiColu
1ad50 6d 6e 5b 6b 5d 21 3d 70 49 6e 64 65 78 2d 3e 61  mn[k]!=pIndex->a
1ad60 69 43 6f 6c 75 6d 6e 5b 6b 5d 20 29 20 62 72 65  iColumn[k] ) bre
1ad70 61 6b 3b 0a 20 20 20 20 20 20 20 20 7a 31 20 3d  ak;.        z1 =
1ad80 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6b 5d   pIdx->azColl[k]
1ad90 3b 0a 20 20 20 20 20 20 20 20 7a 32 20 3d 20 70  ;.        z2 = p
1ada0 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c 5b 6b 5d  Index->azColl[k]
1adb0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71  ;.        if( sq
1adc0 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 31 2c  lite3StrICmp(z1,
1add0 20 7a 32 29 20 29 20 62 72 65 61 6b 3b 0a 20 20   z2) ) break;.  
1ade0 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
1adf0 6b 3d 3d 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c  k==pIdx->nKeyCol
1ae00 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
1ae10 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d 70  pIdx->onError!=p
1ae20 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 20 29  Index->onError )
1ae30 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  {.          /* T
1ae40 68 69 73 20 63 6f 6e 73 74 72 61 69 6e 74 20 63  his constraint c
1ae50 72 65 61 74 65 73 20 74 68 65 20 73 61 6d 65 20  reates the same 
1ae60 69 6e 64 65 78 20 61 73 20 61 20 70 72 65 76 69  index as a previ
1ae70 6f 75 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ous.          **
1ae80 20 63 6f 6e 73 74 72 61 69 6e 74 20 73 70 65 63   constraint spec
1ae90 69 66 69 65 64 20 73 6f 6d 65 77 68 65 72 65 20  ified somewhere 
1aea0 69 6e 20 74 68 65 20 43 52 45 41 54 45 20 54 41  in the CREATE TA
1aeb0 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20  BLE statement.. 
1aec0 20 20 20 20 20 20 20 20 20 2a 2a 20 48 6f 77 65           ** Howe
1aed0 76 65 72 20 74 68 65 20 4f 4e 20 43 4f 4e 46 4c  ver the ON CONFL
1aee0 49 43 54 20 63 6c 61 75 73 65 73 20 61 72 65 20  ICT clauses are 
1aef0 64 69 66 66 65 72 65 6e 74 2e 20 49 66 20 62 6f  different. If bo
1af00 74 68 20 74 68 69 73 20 0a 20 20 20 20 20 20 20  th this .       
1af10 20 20 20 2a 2a 20 63 6f 6e 73 74 72 61 69 6e 74     ** constraint
1af20 20 61 6e 64 20 74 68 65 20 70 72 65 76 69 6f 75   and the previou
1af30 73 20 65 71 75 69 76 61 6c 65 6e 74 20 63 6f 6e  s equivalent con
1af40 73 74 72 61 69 6e 74 20 68 61 76 65 20 65 78 70  straint have exp
1af50 6c 69 63 69 74 0a 20 20 20 20 20 20 20 20 20 20  licit.          
1af60 2a 2a 20 4f 4e 20 43 4f 4e 46 4c 49 43 54 20 63  ** ON CONFLICT c
1af70 6c 61 75 73 65 73 20 74 68 69 73 20 69 73 20 61  lauses this is a
1af80 6e 20 65 72 72 6f 72 2e 20 4f 74 68 65 72 77 69  n error. Otherwi
1af90 73 65 2c 20 75 73 65 20 74 68 65 0a 20 20 20 20  se, use the.    
1afa0 20 20 20 20 20 20 2a 2a 20 65 78 70 6c 69 63 69        ** explici
1afb0 74 6c 79 20 73 70 65 63 69 66 69 65 64 20 62 65  tly specified be
1afc0 68 61 76 69 6f 72 20 66 6f 72 20 74 68 65 20 69  havior for the i
1afd0 6e 64 65 78 2e 0a 20 20 20 20 20 20 20 20 20 20  ndex..          
1afe0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  */.          if(
1aff0 20 21 28 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72   !(pIdx->onError
1b000 3d 3d 4f 45 5f 44 65 66 61 75 6c 74 20 7c 7c 20  ==OE_Default || 
1b010 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 3d  pIndex->onError=
1b020 3d 4f 45 5f 44 65 66 61 75 6c 74 29 20 29 7b 0a  =OE_Default) ){.
1b030 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
1b040 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
1b050 73 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  se, .           
1b060 20 20 20 20 20 22 63 6f 6e 66 6c 69 63 74 69 6e       "conflictin
1b070 67 20 4f 4e 20 43 4f 4e 46 4c 49 43 54 20 63 6c  g ON CONFLICT cl
1b080 61 75 73 65 73 20 73 70 65 63 69 66 69 65 64 22  auses specified"
1b090 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
1b0a0 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  }.          if( 
1b0b0 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f  pIdx->onError==O
1b0c0 45 5f 44 65 66 61 75 6c 74 20 29 7b 0a 20 20 20  E_Default ){.   
1b0d0 20 20 20 20 20 20 20 20 20 70 49 64 78 2d 3e 6f           pIdx->o
1b0e0 6e 45 72 72 6f 72 20 3d 20 70 49 6e 64 65 78 2d  nError = pIndex-
1b0f0 3e 6f 6e 45 72 72 6f 72 3b 0a 20 20 20 20 20 20  >onError;.      
1b100 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
1b110 20 20 20 20 20 20 20 20 69 66 28 20 69 64 78 54          if( idxT
1b120 79 70 65 3d 3d 53 51 4c 49 54 45 5f 49 44 58 54  ype==SQLITE_IDXT
1b130 59 50 45 5f 50 52 49 4d 41 52 59 4b 45 59 20 29  YPE_PRIMARYKEY )
1b140 20 70 49 64 78 2d 3e 69 64 78 54 79 70 65 20 3d   pIdx->idxType =
1b150 20 69 64 78 54 79 70 65 3b 0a 20 20 20 20 20 20   idxType;.      
1b160 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61    goto exit_crea
1b170 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 20 20  te_index;.      
1b180 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  }.    }.  }..  /
1b190 2a 20 4c 69 6e 6b 20 74 68 65 20 6e 65 77 20 49  * Link the new I
1b1a0 6e 64 65 78 20 73 74 72 75 63 74 75 72 65 20 74  ndex structure t
1b1b0 6f 20 69 74 73 20 74 61 62 6c 65 20 61 6e 64 20  o its table and 
1b1c0 74 6f 20 74 68 65 20 6f 74 68 65 72 0a 20 20 2a  to the other.  *
1b1d0 2a 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61  * in-memory data
1b1e0 62 61 73 65 20 73 74 72 75 63 74 75 72 65 73 2e  base structures.
1b1f0 20 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28   .  */.  assert(
1b200 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30   pParse->nErr==0
1b210 20 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 69 6e   );.  if( db->in
1b220 69 74 2e 62 75 73 79 20 29 7b 0a 20 20 20 20 49  it.busy ){.    I
1b230 6e 64 65 78 20 2a 70 3b 0a 20 20 20 20 61 73 73  ndex *p;.    ass
1b240 65 72 74 28 20 21 49 4e 5f 44 45 43 4c 41 52 45  ert( !IN_DECLARE
1b250 5f 56 54 41 42 20 29 3b 0a 20 20 20 20 61 73 73  _VTAB );.    ass
1b260 65 72 74 28 20 73 71 6c 69 74 65 33 53 63 68 65  ert( sqlite3Sche
1b270 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20  maMutexHeld(db, 
1b280 30 2c 20 70 49 6e 64 65 78 2d 3e 70 53 63 68 65  0, pIndex->pSche
1b290 6d 61 29 20 29 3b 0a 20 20 20 20 70 20 3d 20 73  ma) );.    p = s
1b2a0 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72 74  qlite3HashInsert
1b2b0 28 26 70 49 6e 64 65 78 2d 3e 70 53 63 68 65 6d  (&pIndex->pSchem
1b2c0 61 2d 3e 69 64 78 48 61 73 68 2c 20 0a 20 20 20  a->idxHash, .   
1b2d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b2e0 20 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 7a         pIndex->z
1b2f0 4e 61 6d 65 2c 20 70 49 6e 64 65 78 29 3b 0a 20  Name, pIndex);. 
1b300 20 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20     if( p ){.    
1b310 20 20 61 73 73 65 72 74 28 20 70 3d 3d 70 49 6e    assert( p==pIn
1b320 64 65 78 20 29 3b 20 20 2f 2a 20 4d 61 6c 6c 6f  dex );  /* Mallo
1b330 63 20 6d 75 73 74 20 68 61 76 65 20 66 61 69 6c  c must have fail
1b340 65 64 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69  ed */.      sqli
1b350 74 65 33 4f 6f 6d 46 61 75 6c 74 28 64 62 29 3b  te3OomFault(db);
1b360 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74  .      goto exit
1b370 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
1b380 20 20 20 7d 0a 20 20 20 20 64 62 2d 3e 66 6c 61     }.    db->fla
1b390 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 49 6e 74  gs |= SQLITE_Int
1b3a0 65 72 6e 43 68 61 6e 67 65 73 3b 0a 20 20 20 20  ernChanges;.    
1b3b0 69 66 28 20 70 54 62 6c 4e 61 6d 65 21 3d 30 20  if( pTblName!=0 
1b3c0 29 7b 0a 20 20 20 20 20 20 70 49 6e 64 65 78 2d  ){.      pIndex-
1b3d0 3e 74 6e 75 6d 20 3d 20 64 62 2d 3e 69 6e 69 74  >tnum = db->init
1b3e0 2e 6e 65 77 54 6e 75 6d 3b 0a 20 20 20 20 7d 0a  .newTnum;.    }.
1b3f0 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69    }..  /* If thi
1b400 73 20 69 73 20 74 68 65 20 69 6e 69 74 69 61 6c  s is the initial
1b410 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 73 74   CREATE INDEX st
1b420 61 74 65 6d 65 6e 74 20 28 6f 72 20 43 52 45 41  atement (or CREA
1b430 54 45 20 54 41 42 4c 45 20 69 66 20 74 68 65 0a  TE TABLE if the.
1b440 20 20 2a 2a 20 69 6e 64 65 78 20 69 73 20 61 6e    ** index is an
1b450 20 69 6d 70 6c 69 65 64 20 69 6e 64 65 78 20 66   implied index f
1b460 6f 72 20 61 20 55 4e 49 51 55 45 20 6f 72 20 50  or a UNIQUE or P
1b470 52 49 4d 41 52 59 20 4b 45 59 20 63 6f 6e 73 74  RIMARY KEY const
1b480 72 61 69 6e 74 29 20 74 68 65 6e 0a 20 20 2a 2a  raint) then.  **
1b490 20 65 6d 69 74 20 63 6f 64 65 20 74 6f 20 61 6c   emit code to al
1b4a0 6c 6f 63 61 74 65 20 74 68 65 20 69 6e 64 65 78  locate the index
1b4b0 20 72 6f 6f 74 70 61 67 65 20 6f 6e 20 64 69 73   rootpage on dis
1b4c0 6b 20 61 6e 64 20 6d 61 6b 65 20 61 6e 20 65 6e  k and make an en
1b4d0 74 72 79 20 66 6f 72 0a 20 20 2a 2a 20 74 68 65  try for.  ** the
1b4e0 20 69 6e 64 65 78 20 69 6e 20 74 68 65 20 73 71   index in the sq
1b4f0 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c  lite_master tabl
1b500 65 20 61 6e 64 20 70 6f 70 75 6c 61 74 65 20 74  e and populate t
1b510 68 65 20 69 6e 64 65 78 20 77 69 74 68 0a 20 20  he index with.  
1b520 2a 2a 20 63 6f 6e 74 65 6e 74 2e 20 20 42 75 74  ** content.  But
1b530 2c 20 64 6f 20 6e 6f 74 20 64 6f 20 74 68 69 73  , do not do this
1b540 20 69 66 20 77 65 20 61 72 65 20 73 69 6d 70 6c   if we are simpl
1b550 79 20 72 65 61 64 69 6e 67 20 74 68 65 20 73 71  y reading the sq
1b560 6c 69 74 65 5f 6d 61 73 74 65 72 0a 20 20 2a 2a  lite_master.  **
1b570 20 74 61 62 6c 65 20 74 6f 20 70 61 72 73 65 20   table to parse 
1b580 74 68 65 20 73 63 68 65 6d 61 2c 20 6f 72 20 69  the schema, or i
1b590 66 20 74 68 69 73 20 69 6e 64 65 78 20 69 73 20  f this index is 
1b5a0 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20  the PRIMARY KEY 
1b5b0 69 6e 64 65 78 0a 20 20 2a 2a 20 6f 66 20 61 20  index.  ** of a 
1b5c0 57 49 54 48 4f 55 54 20 52 4f 57 49 44 20 74 61  WITHOUT ROWID ta
1b5d0 62 6c 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49  ble..  **.  ** I
1b5e0 66 20 70 54 62 6c 4e 61 6d 65 3d 3d 30 20 69 74  f pTblName==0 it
1b5f0 20 6d 65 61 6e 73 20 74 68 69 73 20 69 6e 64 65   means this inde
1b600 78 20 69 73 20 67 65 6e 65 72 61 74 65 64 20 61  x is generated a
1b610 73 20 61 6e 20 69 6d 70 6c 69 65 64 20 50 52 49  s an implied PRI
1b620 4d 41 52 59 20 4b 45 59 0a 20 20 2a 2a 20 6f 72  MARY KEY.  ** or
1b630 20 55 4e 49 51 55 45 20 69 6e 64 65 78 20 69 6e   UNIQUE index in
1b640 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20   a CREATE TABLE 
1b650 73 74 61 74 65 6d 65 6e 74 2e 20 20 53 69 6e 63  statement.  Sinc
1b660 65 20 74 68 65 20 74 61 62 6c 65 0a 20 20 2a 2a  e the table.  **
1b670 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20 63   has just been c
1b680 72 65 61 74 65 64 2c 20 69 74 20 63 6f 6e 74 61  reated, it conta
1b690 69 6e 73 20 6e 6f 20 64 61 74 61 20 61 6e 64 20  ins no data and 
1b6a0 74 68 65 20 69 6e 64 65 78 20 69 6e 69 74 69 61  the index initia
1b6b0 6c 69 7a 61 74 69 6f 6e 0a 20 20 2a 2a 20 73 74  lization.  ** st
1b6c0 65 70 20 63 61 6e 20 62 65 20 73 6b 69 70 70 65  ep can be skippe
1b6d0 64 2e 0a 20 20 2a 2f 0a 20 20 65 6c 73 65 20 69  d..  */.  else i
1b6e0 66 28 20 48 61 73 52 6f 77 69 64 28 70 54 61 62  f( HasRowid(pTab
1b6f0 29 20 7c 7c 20 70 54 62 6c 4e 61 6d 65 21 3d 30  ) || pTblName!=0
1b700 20 29 7b 0a 20 20 20 20 56 64 62 65 20 2a 76 3b   ){.    Vdbe *v;
1b710 0a 20 20 20 20 63 68 61 72 20 2a 7a 53 74 6d 74  .    char *zStmt
1b720 3b 0a 20 20 20 20 69 6e 74 20 69 4d 65 6d 20 3d  ;.    int iMem =
1b730 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
1b740 0a 0a 20 20 20 20 76 20 3d 20 73 71 6c 69 74 65  ..    v = sqlite
1b750 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
1b760 3b 0a 20 20 20 20 69 66 28 20 76 3d 3d 30 20 29  ;.    if( v==0 )
1b770 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
1b780 65 5f 69 6e 64 65 78 3b 0a 0a 20 20 20 20 73 71  e_index;..    sq
1b790 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f  lite3BeginWriteO
1b7a0 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c  peration(pParse,
1b7b0 20 31 2c 20 69 44 62 29 3b 0a 0a 20 20 20 20 2f   1, iDb);..    /
1b7c0 2a 20 43 72 65 61 74 65 20 74 68 65 20 72 6f 6f  * Create the roo
1b7d0 74 70 61 67 65 20 66 6f 72 20 74 68 65 20 69 6e  tpage for the in
1b7e0 64 65 78 20 75 73 69 6e 67 20 43 72 65 61 74 65  dex using Create
1b7f0 49 6e 64 65 78 2e 20 42 75 74 20 62 65 66 6f 72  Index. But befor
1b800 65 0a 20 20 20 20 2a 2a 20 64 6f 69 6e 67 20 73  e.    ** doing s
1b810 6f 2c 20 63 6f 64 65 20 61 20 4e 6f 6f 70 20 69  o, code a Noop i
1b820 6e 73 74 72 75 63 74 69 6f 6e 20 61 6e 64 20 73  nstruction and s
1b830 74 6f 72 65 20 69 74 73 20 61 64 64 72 65 73 73  tore its address
1b840 20 69 6e 20 0a 20 20 20 20 2a 2a 20 49 6e 64 65   in .    ** Inde
1b850 78 2e 74 6e 75 6d 2e 20 54 68 69 73 20 69 73 20  x.tnum. This is 
1b860 72 65 71 75 69 72 65 64 20 69 6e 20 63 61 73 65  required in case
1b870 20 74 68 69 73 20 69 6e 64 65 78 20 69 73 20 61   this index is a
1b880 63 74 75 61 6c 6c 79 20 61 20 0a 20 20 20 20 2a  ctually a .    *
1b890 2a 20 50 52 49 4d 41 52 59 20 4b 45 59 20 61 6e  * PRIMARY KEY an
1b8a0 64 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 61  d the table is a
1b8b0 63 74 75 61 6c 6c 79 20 61 20 57 49 54 48 4f 55  ctually a WITHOU
1b8c0 54 20 52 4f 57 49 44 20 74 61 62 6c 65 2e 20 49  T ROWID table. I
1b8d0 6e 20 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 63  n .    ** that c
1b8e0 61 73 65 20 74 68 65 20 63 6f 6e 76 65 72 74 54  ase the convertT
1b8f0 6f 57 69 74 68 6f 75 74 52 6f 77 69 64 54 61 62  oWithoutRowidTab
1b900 6c 65 28 29 20 72 6f 75 74 69 6e 65 20 77 69 6c  le() routine wil
1b910 6c 20 72 65 70 6c 61 63 65 0a 20 20 20 20 2a 2a  l replace.    **
1b920 20 74 68 65 20 4e 6f 6f 70 20 77 69 74 68 20 61   the Noop with a
1b930 20 47 6f 74 6f 20 74 6f 20 6a 75 6d 70 20 6f 76   Goto to jump ov
1b940 65 72 20 74 68 65 20 56 44 42 45 20 63 6f 64 65  er the VDBE code
1b950 20 67 65 6e 65 72 61 74 65 64 20 62 65 6c 6f 77   generated below
1b960 2e 20 2a 2f 0a 20 20 20 20 70 49 6e 64 65 78 2d  . */.    pIndex-
1b970 3e 74 6e 75 6d 20 3d 20 73 71 6c 69 74 65 33 56  >tnum = sqlite3V
1b980 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f  dbeAddOp0(v, OP_
1b990 4e 6f 6f 70 29 3b 0a 20 20 20 20 73 71 6c 69 74  Noop);.    sqlit
1b9a0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1b9b0 4f 50 5f 43 72 65 61 74 65 49 6e 64 65 78 2c 20  OP_CreateIndex, 
1b9c0 69 44 62 2c 20 69 4d 65 6d 29 3b 0a 0a 20 20 20  iDb, iMem);..   
1b9d0 20 2f 2a 20 47 61 74 68 65 72 20 74 68 65 20 63   /* Gather the c
1b9e0 6f 6d 70 6c 65 74 65 20 74 65 78 74 20 6f 66 20  omplete text of 
1b9f0 74 68 65 20 43 52 45 41 54 45 20 49 4e 44 45 58  the CREATE INDEX
1ba00 20 73 74 61 74 65 6d 65 6e 74 20 69 6e 74 6f 0a   statement into.
1ba10 20 20 20 20 2a 2a 20 74 68 65 20 7a 53 74 6d 74      ** the zStmt
1ba20 20 76 61 72 69 61 62 6c 65 0a 20 20 20 20 2a 2f   variable.    */
1ba30 0a 20 20 20 20 69 66 28 20 70 53 74 61 72 74 20  .    if( pStart 
1ba40 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 20 3d  ){.      int n =
1ba50 20 28 69 6e 74 29 28 70 50 61 72 73 65 2d 3e 73   (int)(pParse->s
1ba60 4c 61 73 74 54 6f 6b 65 6e 2e 7a 20 2d 20 70 4e  LastToken.z - pN
1ba70 61 6d 65 2d 3e 7a 29 20 2b 20 70 50 61 72 73 65  ame->z) + pParse
1ba80 2d 3e 73 4c 61 73 74 54 6f 6b 65 6e 2e 6e 3b 0a  ->sLastToken.n;.
1ba90 20 20 20 20 20 20 69 66 28 20 70 4e 61 6d 65 2d        if( pName-
1baa0 3e 7a 5b 6e 2d 31 5d 3d 3d 27 3b 27 20 29 20 6e  >z[n-1]==';' ) n
1bab0 2d 2d 3b 0a 20 20 20 20 20 20 2f 2a 20 41 20 6e  --;.      /* A n
1bac0 61 6d 65 64 20 69 6e 64 65 78 20 77 69 74 68 20  amed index with 
1bad0 61 6e 20 65 78 70 6c 69 63 69 74 20 43 52 45 41  an explicit CREA
1bae0 54 45 20 49 4e 44 45 58 20 73 74 61 74 65 6d 65  TE INDEX stateme
1baf0 6e 74 20 2a 2f 0a 20 20 20 20 20 20 7a 53 74 6d  nt */.      zStm
1bb00 74 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e  t = sqlite3MPrin
1bb10 74 66 28 64 62 2c 20 22 43 52 45 41 54 45 25 73  tf(db, "CREATE%s
1bb20 20 49 4e 44 45 58 20 25 2e 2a 73 22 2c 0a 20 20   INDEX %.*s",.  
1bb30 20 20 20 20 20 20 6f 6e 45 72 72 6f 72 3d 3d 4f        onError==O
1bb40 45 5f 4e 6f 6e 65 20 3f 20 22 22 20 3a 20 22 20  E_None ? "" : " 
1bb50 55 4e 49 51 55 45 22 2c 20 6e 2c 20 70 4e 61 6d  UNIQUE", n, pNam
1bb60 65 2d 3e 7a 29 3b 0a 20 20 20 20 7d 65 6c 73 65  e->z);.    }else
1bb70 7b 0a 20 20 20 20 20 20 2f 2a 20 41 6e 20 61 75  {.      /* An au
1bb80 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 63 72  tomatic index cr
1bb90 65 61 74 65 64 20 62 79 20 61 20 50 52 49 4d 41  eated by a PRIMA
1bba0 52 59 20 4b 45 59 20 6f 72 20 55 4e 49 51 55 45  RY KEY or UNIQUE
1bbb0 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 20   constraint */. 
1bbc0 20 20 20 20 20 2f 2a 20 7a 53 74 6d 74 20 3d 20       /* zStmt = 
1bbd0 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 22  sqlite3MPrintf("
1bbe0 22 29 3b 20 2a 2f 0a 20 20 20 20 20 20 7a 53 74  "); */.      zSt
1bbf0 6d 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20  mt = 0;.    }.. 
1bc00 20 20 20 2f 2a 20 41 64 64 20 61 6e 20 65 6e 74     /* Add an ent
1bc10 72 79 20 69 6e 20 73 71 6c 69 74 65 5f 6d 61 73  ry in sqlite_mas
1bc20 74 65 72 20 66 6f 72 20 74 68 69 73 20 69 6e 64  ter for this ind
1bc30 65 78 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71  ex.    */.    sq
1bc40 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72 73 65  lite3NestedParse
1bc50 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20  (pParse, .      
1bc60 20 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 25    "INSERT INTO %
1bc70 51 2e 25 73 20 56 41 4c 55 45 53 28 27 69 6e 64  Q.%s VALUES('ind
1bc80 65 78 27 2c 25 51 2c 25 51 2c 23 25 64 2c 25 51  ex',%Q,%Q,#%d,%Q
1bc90 29 3b 22 2c 0a 20 20 20 20 20 20 20 20 64 62 2d  );",.        db-
1bca0 3e 61 44 62 5b 69 44 62 5d 2e 7a 44 62 53 4e 61  >aDb[iDb].zDbSNa
1bcb0 6d 65 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c 45  me, SCHEMA_TABLE
1bcc0 28 69 44 62 29 2c 0a 20 20 20 20 20 20 20 20 70  (iDb),.        p
1bcd0 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 0a 20 20  Index->zName,.  
1bce0 20 20 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d        pTab->zNam
1bcf0 65 2c 0a 20 20 20 20 20 20 20 20 69 4d 65 6d 2c  e,.        iMem,
1bd00 0a 20 20 20 20 20 20 20 20 7a 53 74 6d 74 0a 20  .        zStmt. 
1bd10 20 20 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65     );.    sqlite
1bd20 33 44 62 46 72 65 65 28 64 62 2c 20 7a 53 74 6d  3DbFree(db, zStm
1bd30 74 29 3b 0a 0a 20 20 20 20 2f 2a 20 46 69 6c 6c  t);..    /* Fill
1bd40 20 74 68 65 20 69 6e 64 65 78 20 77 69 74 68 20   the index with 
1bd50 64 61 74 61 20 61 6e 64 20 72 65 70 61 72 73 65  data and reparse
1bd60 20 74 68 65 20 73 63 68 65 6d 61 2e 20 43 6f 64   the schema. Cod
1bd70 65 20 61 6e 20 4f 50 5f 45 78 70 69 72 65 0a 20  e an OP_Expire. 
1bd80 20 20 20 2a 2a 20 74 6f 20 69 6e 76 61 6c 69 64     ** to invalid
1bd90 61 74 65 20 61 6c 6c 20 70 72 65 2d 63 6f 6d 70  ate all pre-comp
1bda0 69 6c 65 64 20 73 74 61 74 65 6d 65 6e 74 73 2e  iled statements.
1bdb0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
1bdc0 70 54 62 6c 4e 61 6d 65 20 29 7b 0a 20 20 20 20  pTblName ){.    
1bdd0 20 20 73 71 6c 69 74 65 33 52 65 66 69 6c 6c 49    sqlite3RefillI
1bde0 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70 49 6e  ndex(pParse, pIn
1bdf0 64 65 78 2c 20 69 4d 65 6d 29 3b 0a 20 20 20 20  dex, iMem);.    
1be00 20 20 73 71 6c 69 74 65 33 43 68 61 6e 67 65 43    sqlite3ChangeC
1be10 6f 6f 6b 69 65 28 70 50 61 72 73 65 2c 20 69 44  ookie(pParse, iD
1be20 62 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  b);.      sqlite
1be30 33 56 64 62 65 41 64 64 50 61 72 73 65 53 63 68  3VdbeAddParseSch
1be40 65 6d 61 4f 70 28 76 2c 20 69 44 62 2c 0a 20 20  emaOp(v, iDb,.  
1be50 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4d 50         sqlite3MP
1be60 72 69 6e 74 66 28 64 62 2c 20 22 6e 61 6d 65 3d  rintf(db, "name=
1be70 27 25 71 27 20 41 4e 44 20 74 79 70 65 3d 27 69  '%q' AND type='i
1be80 6e 64 65 78 27 22 2c 20 70 49 6e 64 65 78 2d 3e  ndex'", pIndex->
1be90 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20 20 73  zName));.      s
1bea0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30  qlite3VdbeAddOp0
1beb0 28 76 2c 20 4f 50 5f 45 78 70 69 72 65 29 3b 0a  (v, OP_Expire);.
1bec0 20 20 20 20 7d 0a 0a 20 20 20 20 73 71 6c 69 74      }..    sqlit
1bed0 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
1bee0 2c 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 29 3b  , pIndex->tnum);
1bef0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 68 65 6e 20  .  }..  /* When 
1bf00 61 64 64 69 6e 67 20 61 6e 20 69 6e 64 65 78 20  adding an index 
1bf10 74 6f 20 74 68 65 20 6c 69 73 74 20 6f 66 20 69  to the list of i
1bf20 6e 64 69 63 65 73 20 66 6f 72 20 61 20 74 61 62  ndices for a tab
1bf30 6c 65 2c 20 6d 61 6b 65 0a 20 20 2a 2a 20 73 75  le, make.  ** su
1bf40 72 65 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 6c  re all indices l
1bf50 61 62 65 6c 65 64 20 4f 45 5f 52 65 70 6c 61 63  abeled OE_Replac
1bf60 65 20 63 6f 6d 65 20 61 66 74 65 72 20 61 6c 6c  e come after all
1bf70 20 74 68 6f 73 65 20 6c 61 62 65 6c 65 64 0a 20   those labeled. 
1bf80 20 2a 2a 20 4f 45 5f 49 67 6e 6f 72 65 2e 20 20   ** OE_Ignore.  
1bf90 54 68 69 73 20 69 73 20 6e 65 63 65 73 73 61 72  This is necessar
1bfa0 79 20 66 6f 72 20 74 68 65 20 63 6f 72 72 65 63  y for the correc
1bfb0 74 20 63 6f 6e 73 74 72 61 69 6e 74 20 63 68 65  t constraint che
1bfc0 63 6b 0a 20 20 2a 2a 20 70 72 6f 63 65 73 73 69  ck.  ** processi
1bfd0 6e 67 20 28 69 6e 20 73 71 6c 69 74 65 33 47 65  ng (in sqlite3Ge
1bfe0 6e 65 72 61 74 65 43 6f 6e 73 74 72 61 69 6e 74  nerateConstraint
1bff0 43 68 65 63 6b 73 28 29 29 20 61 73 20 70 61 72  Checks()) as par
1c000 74 20 6f 66 0a 20 20 2a 2a 20 55 50 44 41 54 45  t of.  ** UPDATE
1c010 20 61 6e 64 20 49 4e 53 45 52 54 20 73 74 61 74   and INSERT stat
1c020 65 6d 65 6e 74 73 2e 20 20 0a 20 20 2a 2f 0a 20  ements.  .  */. 
1c030 20 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75   if( db->init.bu
1c040 73 79 20 7c 7c 20 70 54 62 6c 4e 61 6d 65 3d 3d  sy || pTblName==
1c050 30 20 29 7b 0a 20 20 20 20 69 66 28 20 6f 6e 45  0 ){.    if( onE
1c060 72 72 6f 72 21 3d 4f 45 5f 52 65 70 6c 61 63 65  rror!=OE_Replace
1c070 20 7c 7c 20 70 54 61 62 2d 3e 70 49 6e 64 65 78   || pTab->pIndex
1c080 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 7c 7c 20  ==0.         || 
1c090 70 54 61 62 2d 3e 70 49 6e 64 65 78 2d 3e 6f 6e  pTab->pIndex->on
1c0a0 45 72 72 6f 72 3d 3d 4f 45 5f 52 65 70 6c 61 63  Error==OE_Replac
1c0b0 65 29 7b 0a 20 20 20 20 20 20 70 49 6e 64 65 78  e){.      pIndex
1c0c0 2d 3e 70 4e 65 78 74 20 3d 20 70 54 61 62 2d 3e  ->pNext = pTab->
1c0d0 70 49 6e 64 65 78 3b 0a 20 20 20 20 20 20 70 54  pIndex;.      pT
1c0e0 61 62 2d 3e 70 49 6e 64 65 78 20 3d 20 70 49 6e  ab->pIndex = pIn
1c0f0 64 65 78 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  dex;.    }else{.
1c100 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70 4f 74        Index *pOt
1c110 68 65 72 20 3d 20 70 54 61 62 2d 3e 70 49 6e 64  her = pTab->pInd
1c120 65 78 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28  ex;.      while(
1c130 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74 20 26   pOther->pNext &
1c140 26 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74 2d  & pOther->pNext-
1c150 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 52 65 70  >onError!=OE_Rep
1c160 6c 61 63 65 20 29 7b 0a 20 20 20 20 20 20 20 20  lace ){.        
1c170 70 4f 74 68 65 72 20 3d 20 70 4f 74 68 65 72 2d  pOther = pOther-
1c180 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a  >pNext;.      }.
1c190 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 70 4e        pIndex->pN
1c1a0 65 78 74 20 3d 20 70 4f 74 68 65 72 2d 3e 70 4e  ext = pOther->pN
1c1b0 65 78 74 3b 0a 20 20 20 20 20 20 70 4f 74 68 65  ext;.      pOthe
1c1c0 72 2d 3e 70 4e 65 78 74 20 3d 20 70 49 6e 64 65  r->pNext = pInde
1c1d0 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 49 6e  x;.    }.    pIn
1c1e0 64 65 78 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20  dex = 0;.  }..  
1c1f0 2f 2a 20 43 6c 65 61 6e 20 75 70 20 62 65 66 6f  /* Clean up befo
1c200 72 65 20 65 78 69 74 69 6e 67 20 2a 2f 0a 65 78  re exiting */.ex
1c210 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3a  it_create_index:
1c220 0a 20 20 69 66 28 20 70 49 6e 64 65 78 20 29 20  .  if( pIndex ) 
1c230 66 72 65 65 49 6e 64 65 78 28 64 62 2c 20 70 49  freeIndex(db, pI
1c240 6e 64 65 78 29 3b 0a 20 20 73 71 6c 69 74 65 33  ndex);.  sqlite3
1c250 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70  ExprDelete(db, p
1c260 50 49 57 68 65 72 65 29 3b 0a 20 20 73 71 6c 69  PIWhere);.  sqli
1c270 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
1c280 65 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a 20 20  e(db, pList);.  
1c290 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44 65  sqlite3SrcListDe
1c2a0 6c 65 74 65 28 64 62 2c 20 70 54 62 6c 4e 61 6d  lete(db, pTblNam
1c2b0 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46  e);.  sqlite3DbF
1c2c0 72 65 65 28 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a  ree(db, zName);.
1c2d0 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6c 6c 20 74 68  }../*.** Fill th
1c2e0 65 20 49 6e 64 65 78 2e 61 69 52 6f 77 45 73 74  e Index.aiRowEst
1c2f0 5b 5d 20 61 72 72 61 79 20 77 69 74 68 20 64 65  [] array with de
1c300 66 61 75 6c 74 20 69 6e 66 6f 72 6d 61 74 69 6f  fault informatio
1c310 6e 20 2d 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a  n - information.
1c320 2a 2a 20 74 6f 20 62 65 20 75 73 65 64 20 77 68  ** to be used wh
1c330 65 6e 20 77 65 20 68 61 76 65 20 6e 6f 74 20 72  en we have not r
1c340 75 6e 20 74 68 65 20 41 4e 41 4c 59 5a 45 20 63  un the ANALYZE c
1c350 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 61 69  ommand..**.** ai
1c360 52 6f 77 45 73 74 5b 30 5d 20 69 73 20 73 75 70  RowEst[0] is sup
1c370 70 6f 73 65 64 20 74 6f 20 63 6f 6e 74 61 69 6e  posed to contain
1c380 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65   the number of e
1c390 6c 65 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 69  lements in the i
1c3a0 6e 64 65 78 2e 0a 2a 2a 20 53 69 6e 63 65 20 77  ndex..** Since w
1c3b0 65 20 64 6f 20 6e 6f 74 20 6b 6e 6f 77 2c 20 67  e do not know, g
1c3c0 75 65 73 73 20 31 20 6d 69 6c 6c 69 6f 6e 2e 20  uess 1 million. 
1c3d0 20 61 69 52 6f 77 45 73 74 5b 31 5d 20 69 73 20   aiRowEst[1] is 
1c3e0 61 6e 20 65 73 74 69 6d 61 74 65 20 6f 66 20 74  an estimate of t
1c3f0 68 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20  he.** number of 
1c400 72 6f 77 73 20 69 6e 20 74 68 65 20 74 61 62 6c  rows in the tabl
1c410 65 20 74 68 61 74 20 6d 61 74 63 68 20 61 6e 79  e that match any
1c420 20 70 61 72 74 69 63 75 6c 61 72 20 76 61 6c 75   particular valu
1c430 65 20 6f 66 20 74 68 65 0a 2a 2a 20 66 69 72 73  e of the.** firs
1c440 74 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20  t column of the 
1c450 69 6e 64 65 78 2e 20 20 61 69 52 6f 77 45 73 74  index.  aiRowEst
1c460 5b 32 5d 20 69 73 20 61 6e 20 65 73 74 69 6d 61  [2] is an estima
1c470 74 65 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72  te of the number
1c480 0a 2a 2a 20 6f 66 20 72 6f 77 73 20 74 68 61 74  .** of rows that
1c490 20 6d 61 74 63 68 20 61 6e 79 20 70 61 72 74 69   match any parti
1c4a0 63 75 6c 61 72 20 63 6f 6d 62 69 6e 61 74 69 6f  cular combinatio
1c4b0 6e 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 32  n of the first 2
1c4c0 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 6f 66 20 74   columns.** of t
1c4d0 68 65 20 69 6e 64 65 78 2e 20 20 41 6e 64 20 73  he index.  And s
1c4e0 6f 20 66 6f 72 74 68 2e 20 20 49 74 20 6d 75 73  o forth.  It mus
1c4f0 74 20 61 6c 77 61 79 73 20 62 65 20 74 68 65 20  t always be the 
1c500 63 61 73 65 20 74 68 61 74 0a 2a 0a 2a 2a 20 20  case that.*.**  
1c510 20 20 20 20 20 20 20 20 20 61 69 52 6f 77 45 73           aiRowEs
1c520 74 5b 4e 5d 3c 3d 61 69 52 6f 77 45 73 74 5b 4e  t[N]<=aiRowEst[N
1c530 2d 31 5d 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  -1].**          
1c540 20 61 69 52 6f 77 45 73 74 5b 4e 5d 3e 3d 31 0a   aiRowEst[N]>=1.
1c550 2a 2a 0a 2a 2a 20 41 70 61 72 74 20 66 72 6f 6d  **.** Apart from
1c560 20 74 68 61 74 2c 20 77 65 20 68 61 76 65 20 6c   that, we have l
1c570 69 74 74 6c 65 20 74 6f 20 67 6f 20 6f 6e 20 62  ittle to go on b
1c580 65 73 69 64 65 73 20 69 6e 74 75 69 74 69 6f 6e  esides intuition
1c590 20 61 73 20 74 6f 0a 2a 2a 20 68 6f 77 20 61 69   as to.** how ai
1c5a0 52 6f 77 45 73 74 5b 5d 20 73 68 6f 75 6c 64 20  RowEst[] should 
1c5b0 62 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 20  be initialized. 
1c5c0 20 54 68 65 20 6e 75 6d 62 65 72 73 20 67 65 6e   The numbers gen
1c5d0 65 72 61 74 65 64 20 68 65 72 65 0a 2a 2a 20 61  erated here.** a
1c5e0 72 65 20 62 61 73 65 64 20 6f 6e 20 74 79 70 69  re based on typi
1c5f0 63 61 6c 20 76 61 6c 75 65 73 20 66 6f 75 6e 64  cal values found
1c600 20 69 6e 20 61 63 74 75 61 6c 20 69 6e 64 69 63   in actual indic
1c610 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  es..*/.void sqli
1c620 74 65 33 44 65 66 61 75 6c 74 52 6f 77 45 73 74  te3DefaultRowEst
1c630 28 49 6e 64 65 78 20 2a 70 49 64 78 29 7b 0a 20  (Index *pIdx){. 
1c640 20 2f 2a 20 20 20 20 20 20 20 20 20 20 20 20 20   /*             
1c650 20 20 20 31 30 2c 20 20 39 2c 20 20 38 2c 20 20     10,  9,  8,  
1c660 37 2c 20 20 36 20 2a 2f 0a 20 20 4c 6f 67 45 73  7,  6 */.  LogEs
1c670 74 20 61 56 61 6c 5b 5d 20 3d 20 7b 20 33 33 2c  t aVal[] = { 33,
1c680 20 33 32 2c 20 33 30 2c 20 32 38 2c 20 32 36 20   32, 30, 28, 26 
1c690 7d 3b 0a 20 20 4c 6f 67 45 73 74 20 2a 61 20 3d  };.  LogEst *a =
1c6a0 20 70 49 64 78 2d 3e 61 69 52 6f 77 4c 6f 67 45   pIdx->aiRowLogE
1c6b0 73 74 3b 0a 20 20 69 6e 74 20 6e 43 6f 70 79 20  st;.  int nCopy 
1c6c0 3d 20 4d 49 4e 28 41 72 72 61 79 53 69 7a 65 28  = MIN(ArraySize(
1c6d0 61 56 61 6c 29 2c 20 70 49 64 78 2d 3e 6e 4b 65  aVal), pIdx->nKe
1c6e0 79 43 6f 6c 29 3b 0a 20 20 69 6e 74 20 69 3b 0a  yCol);.  int i;.
1c6f0 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20 66 69  .  /* Set the fi
1c700 72 73 74 20 65 6e 74 72 79 20 28 6e 75 6d 62 65  rst entry (numbe
1c710 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74 68 65  r of rows in the
1c720 20 69 6e 64 65 78 29 20 74 6f 20 74 68 65 20 65   index) to the e
1c730 73 74 69 6d 61 74 65 64 20 0a 20 20 2a 2a 20 6e  stimated .  ** n
1c740 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e  umber of rows in
1c750 20 74 68 65 20 74 61 62 6c 65 2c 20 6f 72 20 68   the table, or h
1c760 61 6c 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  alf the number o
1c770 66 20 72 6f 77 73 20 69 6e 20 74 68 65 20 74 61  f rows in the ta
1c780 62 6c 65 0a 20 20 2a 2a 20 66 6f 72 20 61 20 70  ble.  ** for a p
1c790 61 72 74 69 61 6c 20 69 6e 64 65 78 2e 20 20 20  artial index.   
1c7a0 42 75 74 20 64 6f 20 6e 6f 74 20 6c 65 74 20 74  But do not let t
1c7b0 68 65 20 65 73 74 69 6d 61 74 65 20 64 72 6f 70  he estimate drop
1c7c0 20 62 65 6c 6f 77 20 31 30 2e 20 2a 2f 0a 20 20   below 10. */.  
1c7d0 61 5b 30 5d 20 3d 20 70 49 64 78 2d 3e 70 54 61  a[0] = pIdx->pTa
1c7e0 62 6c 65 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74 3b  ble->nRowLogEst;
1c7f0 0a 20 20 69 66 28 20 70 49 64 78 2d 3e 70 50 61  .  if( pIdx->pPa
1c800 72 74 49 64 78 57 68 65 72 65 21 3d 30 20 29 20  rtIdxWhere!=0 ) 
1c810 61 5b 30 5d 20 2d 3d 20 31 30 3b 20 20 61 73 73  a[0] -= 10;  ass
1c820 65 72 74 28 20 31 30 3d 3d 73 71 6c 69 74 65 33  ert( 10==sqlite3
1c830 4c 6f 67 45 73 74 28 32 29 20 29 3b 0a 20 20 69  LogEst(2) );.  i
1c840 66 28 20 61 5b 30 5d 3c 33 33 20 29 20 61 5b 30  f( a[0]<33 ) a[0
1c850 5d 20 3d 20 33 33 3b 20 20 20 20 20 20 20 20 20  ] = 33;         
1c860 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
1c870 20 33 33 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45   33==sqlite3LogE
1c880 73 74 28 31 30 29 20 29 3b 0a 0a 20 20 2f 2a 20  st(10) );..  /* 
1c890 45 73 74 69 6d 61 74 65 20 74 68 61 74 20 61 5b  Estimate that a[
1c8a0 31 5d 20 69 73 20 31 30 2c 20 61 5b 32 5d 20 69  1] is 10, a[2] i
1c8b0 73 20 39 2c 20 61 5b 33 5d 20 69 73 20 38 2c 20  s 9, a[3] is 8, 
1c8c0 61 5b 34 5d 20 69 73 20 37 2c 20 61 5b 35 5d 20  a[4] is 7, a[5] 
1c8d0 69 73 0a 20 20 2a 2a 20 36 20 61 6e 64 20 65 61  is.  ** 6 and ea
1c8e0 63 68 20 73 75 62 73 65 71 75 65 6e 74 20 76 61  ch subsequent va
1c8f0 6c 75 65 20 28 69 66 20 61 6e 79 29 20 69 73 20  lue (if any) is 
1c900 35 2e 20 20 2a 2f 0a 20 20 6d 65 6d 63 70 79 28  5.  */.  memcpy(
1c910 26 61 5b 31 5d 2c 20 61 56 61 6c 2c 20 6e 43 6f  &a[1], aVal, nCo
1c920 70 79 2a 73 69 7a 65 6f 66 28 4c 6f 67 45 73 74  py*sizeof(LogEst
1c930 29 29 3b 0a 20 20 66 6f 72 28 69 3d 6e 43 6f 70  ));.  for(i=nCop
1c940 79 2b 31 3b 20 69 3c 3d 70 49 64 78 2d 3e 6e 4b  y+1; i<=pIdx->nK
1c950 65 79 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  eyCol; i++){.   
1c960 20 61 5b 69 5d 20 3d 20 32 33 3b 20 20 20 20 20   a[i] = 23;     
1c970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61                 a
1c980 73 73 65 72 74 28 20 32 33 3d 3d 73 71 6c 69 74  ssert( 23==sqlit
1c990 65 33 4c 6f 67 45 73 74 28 35 29 20 29 3b 0a 20  e3LogEst(5) );. 
1c9a0 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 30 3d   }..  assert( 0=
1c9b0 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 31  =sqlite3LogEst(1
1c9c0 29 20 29 3b 0a 20 20 69 66 28 20 49 73 55 6e 69  ) );.  if( IsUni
1c9d0 71 75 65 49 6e 64 65 78 28 70 49 64 78 29 20 29  queIndex(pIdx) )
1c9e0 20 61 5b 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c   a[pIdx->nKeyCol
1c9f0 5d 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ] = 0;.}../*.** 
1ca00 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c  This routine wil
1ca10 6c 20 64 72 6f 70 20 61 6e 20 65 78 69 73 74 69  l drop an existi
1ca20 6e 67 20 6e 61 6d 65 64 20 69 6e 64 65 78 2e 20  ng named index. 
1ca30 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a   This routine.**
1ca40 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20   implements the 
1ca50 44 52 4f 50 20 49 4e 44 45 58 20 73 74 61 74 65  DROP INDEX state
1ca60 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ment..*/.void sq
1ca70 6c 69 74 65 33 44 72 6f 70 49 6e 64 65 78 28 50  lite3DropIndex(P
1ca80 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 72  arse *pParse, Sr
1ca90 63 4c 69 73 74 20 2a 70 4e 61 6d 65 2c 20 69 6e  cList *pName, in
1caa0 74 20 69 66 45 78 69 73 74 73 29 7b 0a 20 20 49  t ifExists){.  I
1cab0 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b 0a 20 20  ndex *pIndex;.  
1cac0 56 64 62 65 20 2a 76 3b 0a 20 20 73 71 6c 69 74  Vdbe *v;.  sqlit
1cad0 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
1cae0 3e 64 62 3b 0a 20 20 69 6e 74 20 69 44 62 3b 0a  >db;.  int iDb;.
1caf0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73  .  assert( pPars
1cb00 65 2d 3e 6e 45 72 72 3d 3d 30 20 29 3b 20 20 20  e->nErr==0 );   
1cb10 2f 2a 20 4e 65 76 65 72 20 63 61 6c 6c 65 64 20  /* Never called 
1cb20 77 69 74 68 20 70 72 69 6f 72 20 65 72 72 6f 72  with prior error
1cb30 73 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 6d  s */.  if( db->m
1cb40 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
1cb50 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f     goto exit_dro
1cb60 70 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 61  p_index;.  }.  a
1cb70 73 73 65 72 74 28 20 70 4e 61 6d 65 2d 3e 6e 53  ssert( pName->nS
1cb80 72 63 3d 3d 31 20 29 3b 0a 20 20 69 66 28 20 53  rc==1 );.  if( S
1cb90 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65  QLITE_OK!=sqlite
1cba0 33 52 65 61 64 53 63 68 65 6d 61 28 70 50 61 72  3ReadSchema(pPar
1cbb0 73 65 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  se) ){.    goto 
1cbc0 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b  exit_drop_index;
1cbd0 0a 20 20 7d 0a 20 20 70 49 6e 64 65 78 20 3d 20  .  }.  pIndex = 
1cbe0 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 64 65 78  sqlite3FindIndex
1cbf0 28 64 62 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d  (db, pName->a[0]
1cc00 2e 7a 4e 61 6d 65 2c 20 70 4e 61 6d 65 2d 3e 61  .zName, pName->a
1cc10 5b 30 5d 2e 7a 44 61 74 61 62 61 73 65 29 3b 0a  [0].zDatabase);.
1cc20 20 20 69 66 28 20 70 49 6e 64 65 78 3d 3d 30 20    if( pIndex==0 
1cc30 29 7b 0a 20 20 20 20 69 66 28 20 21 69 66 45 78  ){.    if( !ifEx
1cc40 69 73 74 73 20 29 7b 0a 20 20 20 20 20 20 73 71  ists ){.      sq
1cc50 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
1cc60 61 72 73 65 2c 20 22 6e 6f 20 73 75 63 68 20 69  arse, "no such i
1cc70 6e 64 65 78 3a 20 25 53 22 2c 20 70 4e 61 6d 65  ndex: %S", pName
1cc80 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  , 0);.    }else{
1cc90 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f  .      sqlite3Co
1cca0 64 65 56 65 72 69 66 79 4e 61 6d 65 64 53 63 68  deVerifyNamedSch
1ccb0 65 6d 61 28 70 50 61 72 73 65 2c 20 70 4e 61 6d  ema(pParse, pNam
1ccc0 65 2d 3e 61 5b 30 5d 2e 7a 44 61 74 61 62 61 73  e->a[0].zDatabas
1ccd0 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50  e);.    }.    pP
1cce0 61 72 73 65 2d 3e 63 68 65 63 6b 53 63 68 65 6d  arse->checkSchem
1ccf0 61 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f 20  a = 1;.    goto 
1cd00 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b  exit_drop_index;
1cd10 0a 20 20 7d 0a 20 20 69 66 28 20 70 49 6e 64 65  .  }.  if( pInde
1cd20 78 2d 3e 69 64 78 54 79 70 65 21 3d 53 51 4c 49  x->idxType!=SQLI
1cd30 54 45 5f 49 44 58 54 59 50 45 5f 41 50 50 44 45  TE_IDXTYPE_APPDE
1cd40 46 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  F ){.    sqlite3
1cd50 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
1cd60 20 22 69 6e 64 65 78 20 61 73 73 6f 63 69 61 74   "index associat
1cd70 65 64 20 77 69 74 68 20 55 4e 49 51 55 45 20 22  ed with UNIQUE "
1cd80 0a 20 20 20 20 20 20 22 6f 72 20 50 52 49 4d 41  .      "or PRIMA
1cd90 52 59 20 4b 45 59 20 63 6f 6e 73 74 72 61 69 6e  RY KEY constrain
1cda0 74 20 63 61 6e 6e 6f 74 20 62 65 20 64 72 6f 70  t cannot be drop
1cdb0 70 65 64 22 2c 20 30 29 3b 0a 20 20 20 20 67 6f  ped", 0);.    go
1cdc0 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64  to exit_drop_ind
1cdd0 65 78 3b 0a 20 20 7d 0a 20 20 69 44 62 20 3d 20  ex;.  }.  iDb = 
1cde0 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49  sqlite3SchemaToI
1cdf0 6e 64 65 78 28 64 62 2c 20 70 49 6e 64 65 78 2d  ndex(db, pIndex-
1ce00 3e 70 53 63 68 65 6d 61 29 3b 0a 23 69 66 6e 64  >pSchema);.#ifnd
1ce10 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
1ce20 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 7b  UTHORIZATION.  {
1ce30 0a 20 20 20 20 69 6e 74 20 63 6f 64 65 20 3d 20  .    int code = 
1ce40 53 51 4c 49 54 45 5f 44 52 4f 50 5f 49 4e 44 45  SQLITE_DROP_INDE
1ce50 58 3b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54  X;.    Table *pT
1ce60 61 62 20 3d 20 70 49 6e 64 65 78 2d 3e 70 54 61  ab = pIndex->pTa
1ce70 62 6c 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63  ble;.    const c
1ce80 68 61 72 20 2a 7a 44 62 20 3d 20 64 62 2d 3e 61  har *zDb = db->a
1ce90 44 62 5b 69 44 62 5d 2e 7a 44 62 53 4e 61 6d 65  Db[iDb].zDbSName
1cea0 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  ;.    const char
1ceb0 20 2a 7a 54 61 62 20 3d 20 53 43 48 45 4d 41 5f   *zTab = SCHEMA_
1cec0 54 41 42 4c 45 28 69 44 62 29 3b 0a 20 20 20 20  TABLE(iDb);.    
1ced0 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43  if( sqlite3AuthC
1cee0 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c  heck(pParse, SQL
1cef0 49 54 45 5f 44 45 4c 45 54 45 2c 20 7a 54 61 62  ITE_DELETE, zTab
1cf00 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20  , 0, zDb) ){.   
1cf10 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f     goto exit_dro
1cf20 70 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20  p_index;.    }. 
1cf30 20 20 20 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d     if( !OMIT_TEM
1cf40 50 44 42 20 26 26 20 69 44 62 20 29 20 63 6f 64  PDB && iDb ) cod
1cf50 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f  e = SQLITE_DROP_
1cf60 54 45 4d 50 5f 49 4e 44 45 58 3b 0a 20 20 20 20  TEMP_INDEX;.    
1cf70 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43  if( sqlite3AuthC
1cf80 68 65 63 6b 28 70 50 61 72 73 65 2c 20 63 6f 64  heck(pParse, cod
1cf90 65 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65  e, pIndex->zName
1cfa0 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a  , pTab->zName, z
1cfb0 44 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  Db) ){.      got
1cfc0 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65  o exit_drop_inde
1cfd0 78 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  x;.    }.  }.#en
1cfe0 64 69 66 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61  dif..  /* Genera
1cff0 74 65 20 63 6f 64 65 20 74 6f 20 72 65 6d 6f 76  te code to remov
1d000 65 20 74 68 65 20 69 6e 64 65 78 20 61 6e 64 20  e the index and 
1d010 66 72 6f 6d 20 74 68 65 20 6d 61 73 74 65 72 20  from the master 
1d020 74 61 62 6c 65 20 2a 2f 0a 20 20 76 20 3d 20 73  table */.  v = s
1d030 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
1d040 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76 20 29  arse);.  if( v )
1d050 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65 67  {.    sqlite3Beg
1d060 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e  inWriteOperation
1d070 28 70 50 61 72 73 65 2c 20 31 2c 20 69 44 62 29  (pParse, 1, iDb)
1d080 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 4e 65 73  ;.    sqlite3Nes
1d090 74 65 64 50 61 72 73 65 28 70 50 61 72 73 65 2c  tedParse(pParse,
1d0a0 0a 20 20 20 20 20 20 20 22 44 45 4c 45 54 45 20  .       "DELETE 
1d0b0 46 52 4f 4d 20 25 51 2e 25 73 20 57 48 45 52 45  FROM %Q.%s WHERE
1d0c0 20 6e 61 6d 65 3d 25 51 20 41 4e 44 20 74 79 70   name=%Q AND typ
1d0d0 65 3d 27 69 6e 64 65 78 27 22 2c 0a 20 20 20 20  e='index'",.    
1d0e0 20 20 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e     db->aDb[iDb].
1d0f0 7a 44 62 53 4e 61 6d 65 2c 20 53 43 48 45 4d 41  zDbSName, SCHEMA
1d100 5f 54 41 42 4c 45 28 69 44 62 29 2c 20 70 49 6e  _TABLE(iDb), pIn
1d110 64 65 78 2d 3e 7a 4e 61 6d 65 0a 20 20 20 20 29  dex->zName.    )
1d120 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6c 65  ;.    sqlite3Cle
1d130 61 72 53 74 61 74 54 61 62 6c 65 73 28 70 50 61  arStatTables(pPa
1d140 72 73 65 2c 20 69 44 62 2c 20 22 69 64 78 22 2c  rse, iDb, "idx",
1d150 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 29 3b   pIndex->zName);
1d160 0a 20 20 20 20 73 71 6c 69 74 65 33 43 68 61 6e  .    sqlite3Chan
1d170 67 65 43 6f 6f 6b 69 65 28 70 50 61 72 73 65 2c  geCookie(pParse,
1d180 20 69 44 62 29 3b 0a 20 20 20 20 64 65 73 74 72   iDb);.    destr
1d190 6f 79 52 6f 6f 74 50 61 67 65 28 70 50 61 72 73  oyRootPage(pPars
1d1a0 65 2c 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 2c  e, pIndex->tnum,
1d1b0 20 69 44 62 29 3b 0a 20 20 20 20 73 71 6c 69 74   iDb);.    sqlit
1d1c0 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
1d1d0 4f 50 5f 44 72 6f 70 49 6e 64 65 78 2c 20 69 44  OP_DropIndex, iD
1d1e0 62 2c 20 30 2c 20 30 2c 20 70 49 6e 64 65 78 2d  b, 0, 0, pIndex-
1d1f0 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 7d 0a  >zName, 0);.  }.
1d200 0a 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78  .exit_drop_index
1d210 3a 0a 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69  :.  sqlite3SrcLi
1d220 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 4e 61  stDelete(db, pNa
1d230 6d 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 41  me);.}../*.** pA
1d240 72 72 61 79 20 69 73 20 61 20 70 6f 69 6e 74 65  rray is a pointe
1d250 72 20 74 6f 20 61 6e 20 61 72 72 61 79 20 6f 66  r to an array of
1d260 20 6f 62 6a 65 63 74 73 2e 20 45 61 63 68 20 6f   objects. Each o
1d270 62 6a 65 63 74 20 69 6e 20 74 68 65 0a 2a 2a 20  bject in the.** 
1d280 61 72 72 61 79 20 69 73 20 73 7a 45 6e 74 72 79  array is szEntry
1d290 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 20   bytes in size. 
1d2a0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 75 73 65  This routine use
1d2b0 73 20 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c  s sqlite3DbReall
1d2c0 6f 63 28 29 0a 2a 2a 20 74 6f 20 65 78 74 65 6e  oc().** to exten
1d2d0 64 20 74 68 65 20 61 72 72 61 79 20 73 6f 20 74  d the array so t
1d2e0 68 61 74 20 74 68 65 72 65 20 69 73 20 73 70 61  hat there is spa
1d2f0 63 65 20 66 6f 72 20 61 20 6e 65 77 20 6f 62 6a  ce for a new obj
1d300 65 63 74 20 61 74 20 74 68 65 20 65 6e 64 2e 0a  ect at the end..
1d310 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20  **.** When this 
1d320 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
1d330 65 64 2c 20 2a 70 6e 45 6e 74 72 79 20 63 6f 6e  ed, *pnEntry con
1d340 74 61 69 6e 73 20 74 68 65 20 63 75 72 72 65 6e  tains the curren
1d350 74 20 73 69 7a 65 20 6f 66 0a 2a 2a 20 74 68 65  t size of.** the
1d360 20 61 72 72 61 79 20 28 69 6e 20 65 6e 74 72 69   array (in entri
1d370 65 73 20 2d 20 73 6f 20 74 68 65 20 61 6c 6c 6f  es - so the allo
1d380 63 61 74 69 6f 6e 20 69 73 20 28 28 2a 70 6e 45  cation is ((*pnE
1d390 6e 74 72 79 29 20 2a 20 73 7a 45 6e 74 72 79 29  ntry) * szEntry)
1d3a0 20 62 79 74 65 73 0a 2a 2a 20 69 6e 20 74 6f 74   bytes.** in tot
1d3b0 61 6c 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  al)..**.** If th
1d3c0 65 20 72 65 61 6c 6c 6f 63 28 29 20 69 73 20 73  e realloc() is s
1d3d0 75 63 63 65 73 73 66 75 6c 20 28 69 2e 65 2e 20  uccessful (i.e. 
1d3e0 69 66 20 6e 6f 20 4f 4f 4d 20 63 6f 6e 64 69 74  if no OOM condit
1d3f0 69 6f 6e 20 6f 63 63 75 72 73 29 2c 20 74 68 65  ion occurs), the
1d400 0a 2a 2a 20 73 70 61 63 65 20 61 6c 6c 6f 63 61  .** space alloca
1d410 74 65 64 20 66 6f 72 20 74 68 65 20 6e 65 77 20  ted for the new 
1d420 6f 62 6a 65 63 74 20 69 73 20 7a 65 72 6f 65 64  object is zeroed
1d430 2c 20 2a 70 6e 45 6e 74 72 79 20 75 70 64 61 74  , *pnEntry updat
1d440 65 64 20 74 6f 0a 2a 2a 20 72 65 66 6c 65 63 74  ed to.** reflect
1d450 20 74 68 65 20 6e 65 77 20 73 69 7a 65 20 6f 66   the new size of
1d460 20 74 68 65 20 61 72 72 61 79 20 61 6e 64 20 61   the array and a
1d470 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
1d480 6e 65 77 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a  new allocation.*
1d490 2a 20 72 65 74 75 72 6e 65 64 2e 20 2a 70 49 64  * returned. *pId
1d4a0 78 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  x is set to the 
1d4b0 69 6e 64 65 78 20 6f 66 20 74 68 65 20 6e 65 77  index of the new
1d4c0 20 61 72 72 61 79 20 65 6e 74 72 79 20 69 6e 20   array entry in 
1d4d0 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a  this case..**.**
1d4e0 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 74   Otherwise, if t
1d4f0 68 65 20 72 65 61 6c 6c 6f 63 28 29 20 66 61 69  he realloc() fai
1d500 6c 73 2c 20 2a 70 49 64 78 20 69 73 20 73 65 74  ls, *pIdx is set
1d510 20 74 6f 20 2d 31 2c 20 2a 70 6e 45 6e 74 72 79   to -1, *pnEntry
1d520 20 72 65 6d 61 69 6e 73 0a 2a 2a 20 75 6e 63 68   remains.** unch
1d530 61 6e 67 65 64 20 61 6e 64 20 61 20 63 6f 70 79  anged and a copy
1d540 20 6f 66 20 70 41 72 72 61 79 20 72 65 74 75 72   of pArray retur
1d550 6e 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71  ned..*/.void *sq
1d560 6c 69 74 65 33 41 72 72 61 79 41 6c 6c 6f 63 61  lite3ArrayAlloca
1d570 74 65 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  te(.  sqlite3 *d
1d580 62 2c 20 20 20 20 20 20 2f 2a 20 43 6f 6e 6e 65  b,      /* Conne
1d590 63 74 69 6f 6e 20 74 6f 20 6e 6f 74 69 66 79 20  ction to notify 
1d5a0 6f 66 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72  of malloc failur
1d5b0 65 73 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 41  es */.  void *pA
1d5c0 72 72 61 79 2c 20 20 20 20 20 2f 2a 20 41 72 72  rray,     /* Arr
1d5d0 61 79 20 6f 66 20 6f 62 6a 65 63 74 73 2e 20 20  ay of objects.  
1d5e0 4d 69 67 68 74 20 62 65 20 72 65 61 6c 6c 6f 63  Might be realloc
1d5f0 61 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 73 7a  ated */.  int sz
1d600 45 6e 74 72 79 2c 20 20 20 20 20 20 2f 2a 20 53  Entry,      /* S
1d610 69 7a 65 20 6f 66 20 65 61 63 68 20 6f 62 6a 65  ize of each obje
1d620 63 74 20 69 6e 20 74 68 65 20 61 72 72 61 79 20  ct in the array 
1d630 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 45 6e 74 72  */.  int *pnEntr
1d640 79 2c 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72  y,     /* Number
1d650 20 6f 66 20 6f 62 6a 65 63 74 73 20 63 75 72 72   of objects curr
1d660 65 6e 74 6c 79 20 69 6e 20 75 73 65 20 2a 2f 0a  ently in use */.
1d670 20 20 69 6e 74 20 2a 70 49 64 78 20 20 20 20 20    int *pIdx     
1d680 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65      /* Write the
1d690 20 69 6e 64 65 78 20 6f 66 20 61 20 6e 65 77 20   index of a new 
1d6a0 73 6c 6f 74 20 68 65 72 65 20 2a 2f 0a 29 7b 0a  slot here */.){.
1d6b0 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 69 6e 74    char *z;.  int
1d6c0 20 6e 20 3d 20 2a 70 6e 45 6e 74 72 79 3b 0a 20   n = *pnEntry;. 
1d6d0 20 69 66 28 20 28 6e 20 26 20 28 6e 2d 31 29 29   if( (n & (n-1))
1d6e0 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 73  ==0 ){.    int s
1d6f0 7a 20 3d 20 28 6e 3d 3d 30 29 20 3f 20 31 20 3a  z = (n==0) ? 1 :
1d700 20 32 2a 6e 3b 0a 20 20 20 20 76 6f 69 64 20 2a   2*n;.    void *
1d710 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62  pNew = sqlite3Db
1d720 52 65 61 6c 6c 6f 63 28 64 62 2c 20 70 41 72 72  Realloc(db, pArr
1d730 61 79 2c 20 73 7a 2a 73 7a 45 6e 74 72 79 29 3b  ay, sz*szEntry);
1d740 0a 20 20 20 20 69 66 28 20 70 4e 65 77 3d 3d 30  .    if( pNew==0
1d750 20 29 7b 0a 20 20 20 20 20 20 2a 70 49 64 78 20   ){.      *pIdx 
1d760 3d 20 2d 31 3b 0a 20 20 20 20 20 20 72 65 74 75  = -1;.      retu
1d770 72 6e 20 70 41 72 72 61 79 3b 0a 20 20 20 20 7d  rn pArray;.    }
1d780 0a 20 20 20 20 70 41 72 72 61 79 20 3d 20 70 4e  .    pArray = pN
1d790 65 77 3b 0a 20 20 7d 0a 20 20 7a 20 3d 20 28 63  ew;.  }.  z = (c
1d7a0 68 61 72 2a 29 70 41 72 72 61 79 3b 0a 20 20 6d  har*)pArray;.  m
1d7b0 65 6d 73 65 74 28 26 7a 5b 6e 20 2a 20 73 7a 45  emset(&z[n * szE
1d7c0 6e 74 72 79 5d 2c 20 30 2c 20 73 7a 45 6e 74 72  ntry], 0, szEntr
1d7d0 79 29 3b 0a 20 20 2a 70 49 64 78 20 3d 20 6e 3b  y);.  *pIdx = n;
1d7e0 0a 20 20 2b 2b 2a 70 6e 45 6e 74 72 79 3b 0a 20  .  ++*pnEntry;. 
1d7f0 20 72 65 74 75 72 6e 20 70 41 72 72 61 79 3b 0a   return pArray;.
1d800 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20  }../*.** Append 
1d810 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20 74 6f  a new element to
1d820 20 74 68 65 20 67 69 76 65 6e 20 49 64 4c 69 73   the given IdLis
1d830 74 2e 20 20 43 72 65 61 74 65 20 61 20 6e 65 77  t.  Create a new
1d840 20 49 64 4c 69 73 74 20 69 66 0a 2a 2a 20 6e 65   IdList if.** ne
1d850 65 64 20 62 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 6e  ed be..**.** A n
1d860 65 77 20 49 64 4c 69 73 74 20 69 73 20 72 65 74  ew IdList is ret
1d870 75 72 6e 65 64 2c 20 6f 72 20 4e 55 4c 4c 20 69  urned, or NULL i
1d880 66 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 73  f malloc() fails
1d890 2e 0a 2a 2f 0a 49 64 4c 69 73 74 20 2a 73 71 6c  ..*/.IdList *sql
1d8a0 69 74 65 33 49 64 4c 69 73 74 41 70 70 65 6e 64  ite3IdListAppend
1d8b0 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 49 64  (sqlite3 *db, Id
1d8c0 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 54 6f 6b  List *pList, Tok
1d8d0 65 6e 20 2a 70 54 6f 6b 65 6e 29 7b 0a 20 20 69  en *pToken){.  i
1d8e0 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 4c 69 73  nt i;.  if( pLis
1d8f0 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4c 69 73  t==0 ){.    pLis
1d900 74 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  t = sqlite3DbMal
1d910 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65  locZero(db, size
1d920 6f 66 28 49 64 4c 69 73 74 29 20 29 3b 0a 20 20  of(IdList) );.  
1d930 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29    if( pList==0 )
1d940 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
1d950 20 70 4c 69 73 74 2d 3e 61 20 3d 20 73 71 6c 69   pList->a = sqli
1d960 74 65 33 41 72 72 61 79 41 6c 6c 6f 63 61 74 65  te3ArrayAllocate
1d970 28 0a 20 20 20 20 20 20 64 62 2c 0a 20 20 20 20  (.      db,.    
1d980 20 20 70 4c 69 73 74 2d 3e 61 2c 0a 20 20 20 20    pList->a,.    
1d990 20 20 73 69 7a 65 6f 66 28 70 4c 69 73 74 2d 3e    sizeof(pList->
1d9a0 61 5b 30 5d 29 2c 0a 20 20 20 20 20 20 26 70 4c  a[0]),.      &pL
1d9b0 69 73 74 2d 3e 6e 49 64 2c 0a 20 20 20 20 20 20  ist->nId,.      
1d9c0 26 69 0a 20 20 29 3b 0a 20 20 69 66 28 20 69 3c  &i.  );.  if( i<
1d9d0 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
1d9e0 49 64 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c  IdListDelete(db,
1d9f0 20 70 4c 69 73 74 29 3b 0a 20 20 20 20 72 65 74   pList);.    ret
1da00 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 4c 69  urn 0;.  }.  pLi
1da10 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20 3d  st->a[i].zName =
1da20 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d   sqlite3NameFrom
1da30 54 6f 6b 65 6e 28 64 62 2c 20 70 54 6f 6b 65 6e  Token(db, pToken
1da40 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 4c 69 73  );.  return pLis
1da50 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65  t;.}../*.** Dele
1da60 74 65 20 61 6e 20 49 64 4c 69 73 74 2e 0a 2a 2f  te an IdList..*/
1da70 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 49 64 4c  .void sqlite3IdL
1da80 69 73 74 44 65 6c 65 74 65 28 73 71 6c 69 74 65  istDelete(sqlite
1da90 33 20 2a 64 62 2c 20 49 64 4c 69 73 74 20 2a 70  3 *db, IdList *p
1daa0 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  List){.  int i;.
1dab0 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29    if( pList==0 )
1dac0 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69   return;.  for(i
1dad0 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 49 64  =0; i<pList->nId
1dae0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69  ; i++){.    sqli
1daf0 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 4c  te3DbFree(db, pL
1db00 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29  ist->a[i].zName)
1db10 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44  ;.  }.  sqlite3D
1db20 62 46 72 65 65 28 64 62 2c 20 70 4c 69 73 74 2d  bFree(db, pList-
1db30 3e 61 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62  >a);.  sqlite3Db
1db40 46 72 65 65 28 64 62 2c 20 70 4c 69 73 74 29 3b  Free(db, pList);
1db50 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
1db60 20 74 68 65 20 69 6e 64 65 78 20 69 6e 20 70 4c   the index in pL
1db70 69 73 74 20 6f 66 20 74 68 65 20 69 64 65 6e 74  ist of the ident
1db80 69 66 69 65 72 20 6e 61 6d 65 64 20 7a 49 64 2e  ifier named zId.
1db90 20 20 52 65 74 75 72 6e 20 2d 31 0a 2a 2a 20 69    Return -1.** i
1dba0 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2f 0a  f not found..*/.
1dbb0 69 6e 74 20 73 71 6c 69 74 65 33 49 64 4c 69 73  int sqlite3IdLis
1dbc0 74 49 6e 64 65 78 28 49 64 4c 69 73 74 20 2a 70  tIndex(IdList *p
1dbd0 4c 69 73 74 2c 20 63 6f 6e 73 74 20 63 68 61 72  List, const char
1dbe0 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69 6e 74 20   *zName){.  int 
1dbf0 69 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d  i;.  if( pList==
1dc00 30 20 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20  0 ) return -1;. 
1dc10 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73   for(i=0; i<pLis
1dc20 74 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20 20  t->nId; i++){.  
1dc30 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72    if( sqlite3Str
1dc40 49 43 6d 70 28 70 4c 69 73 74 2d 3e 61 5b 69 5d  ICmp(pList->a[i]
1dc50 2e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29 3d 3d  .zName, zName)==
1dc60 30 20 29 20 72 65 74 75 72 6e 20 69 3b 0a 20 20  0 ) return i;.  
1dc70 7d 0a 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 7d  }.  return -1;.}
1dc80 0a 0a 2f 2a 0a 2a 2a 20 45 78 70 61 6e 64 20 74  ../*.** Expand t
1dc90 68 65 20 73 70 61 63 65 20 61 6c 6c 6f 63 61 74  he space allocat
1dca0 65 64 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e  ed for the given
1dcb0 20 53 72 63 4c 69 73 74 20 6f 62 6a 65 63 74 20   SrcList object 
1dcc0 62 79 0a 2a 2a 20 63 72 65 61 74 69 6e 67 20 6e  by.** creating n
1dcd0 45 78 74 72 61 20 6e 65 77 20 73 6c 6f 74 73 20  Extra new slots 
1dce0 62 65 67 69 6e 6e 69 6e 67 20 61 74 20 69 53 74  beginning at iSt
1dcf0 61 72 74 2e 20 20 69 53 74 61 72 74 20 69 73 20  art.  iStart is 
1dd00 7a 65 72 6f 20 62 61 73 65 64 2e 0a 2a 2a 20 4e  zero based..** N
1dd10 65 77 20 73 6c 6f 74 73 20 61 72 65 20 7a 65 72  ew slots are zer
1dd20 6f 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65  oed..**.** For e
1dd30 78 61 6d 70 6c 65 2c 20 73 75 70 70 6f 73 65 20  xample, suppose 
1dd40 61 20 53 72 63 4c 69 73 74 20 69 6e 69 74 69 61  a SrcList initia
1dd50 6c 6c 79 20 63 6f 6e 74 61 69 6e 73 20 74 77 6f  lly contains two
1dd60 20 65 6e 74 72 69 65 73 3a 20 41 2c 42 2e 0a 2a   entries: A,B..*
1dd70 2a 20 54 6f 20 61 70 70 65 6e 64 20 33 20 6e 65  * To append 3 ne
1dd80 77 20 65 6e 74 72 69 65 73 20 6f 6e 74 6f 20 74  w entries onto t
1dd90 68 65 20 65 6e 64 2c 20 64 6f 20 74 68 69 73 3a  he end, do this:
1dda0 0a 2a 2a 0a 2a 2a 20 20 20 20 73 71 6c 69 74 65  .**.**    sqlite
1ddb0 33 53 72 63 4c 69 73 74 45 6e 6c 61 72 67 65 28  3SrcListEnlarge(
1ddc0 64 62 2c 20 70 53 72 63 6c 69 73 74 2c 20 33 2c  db, pSrclist, 3,
1ddd0 20 32 29 3b 0a 2a 2a 0a 2a 2a 20 41 66 74 65 72   2);.**.** After
1dde0 20 74 68 65 20 63 61 6c 6c 20 61 62 6f 76 65 20   the call above 
1ddf0 69 74 20 77 6f 75 6c 64 20 63 6f 6e 74 61 69 6e  it would contain
1de00 3a 20 20 41 2c 20 42 2c 20 6e 69 6c 2c 20 6e 69  :  A, B, nil, ni
1de10 6c 2c 20 6e 69 6c 2e 0a 2a 2a 20 49 66 20 74 68  l, nil..** If th
1de20 65 20 69 53 74 61 72 74 20 61 72 67 75 6d 65 6e  e iStart argumen
1de30 74 20 68 61 64 20 62 65 65 6e 20 31 20 69 6e 73  t had been 1 ins
1de40 74 65 61 64 20 6f 66 20 32 2c 20 74 68 65 6e 20  tead of 2, then 
1de50 74 68 65 20 72 65 73 75 6c 74 0a 2a 2a 20 77 6f  the result.** wo
1de60 75 6c 64 20 68 61 76 65 20 62 65 65 6e 3a 20 20  uld have been:  
1de70 41 2c 20 6e 69 6c 2c 20 6e 69 6c 2c 20 6e 69 6c  A, nil, nil, nil
1de80 2c 20 42 2e 20 20 54 6f 20 70 72 65 70 65 6e 64  , B.  To prepend
1de90 20 74 68 65 20 6e 65 77 20 73 6c 6f 74 73 2c 0a   the new slots,.
1dea0 2a 2a 20 74 68 65 20 69 53 74 61 72 74 20 76 61  ** the iStart va
1deb0 6c 75 65 20 77 6f 75 6c 64 20 62 65 20 30 2e 20  lue would be 0. 
1dec0 20 54 68 65 20 72 65 73 75 6c 74 20 74 68 65 6e   The result then
1ded0 20 77 6f 75 6c 64 0a 2a 2a 20 62 65 3a 20 6e 69   would.** be: ni
1dee0 6c 2c 20 6e 69 6c 2c 20 6e 69 6c 2c 20 41 2c 20  l, nil, nil, A, 
1def0 42 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d 65  B..**.** If a me
1df00 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  mory allocation 
1df10 66 61 69 6c 73 20 74 68 65 20 53 72 63 4c 69 73  fails the SrcLis
1df20 74 20 69 73 20 75 6e 63 68 61 6e 67 65 64 2e 20  t is unchanged. 
1df30 20 54 68 65 0a 2a 2a 20 64 62 2d 3e 6d 61 6c 6c   The.** db->mall
1df40 6f 63 46 61 69 6c 65 64 20 66 6c 61 67 20 77 69  ocFailed flag wi
1df50 6c 6c 20 62 65 20 73 65 74 20 74 6f 20 74 72 75  ll be set to tru
1df60 65 2e 0a 2a 2f 0a 53 72 63 4c 69 73 74 20 2a 73  e..*/.SrcList *s
1df70 71 6c 69 74 65 33 53 72 63 4c 69 73 74 45 6e 6c  qlite3SrcListEnl
1df80 61 72 67 65 28 0a 20 20 73 71 6c 69 74 65 33 20  arge(.  sqlite3 
1df90 2a 64 62 2c 20 20 20 20 20 20 20 2f 2a 20 44 61  *db,       /* Da
1dfa0 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
1dfb0 6e 20 74 6f 20 6e 6f 74 69 66 79 20 6f 66 20 4f  n to notify of O
1dfc0 4f 4d 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20 53  OM errors */.  S
1dfd0 72 63 4c 69 73 74 20 2a 70 53 72 63 2c 20 20 20  rcList *pSrc,   
1dfe0 20 20 2f 2a 20 54 68 65 20 53 72 63 4c 69 73 74    /* The SrcList
1dff0 20 74 6f 20 62 65 20 65 6e 6c 61 72 67 65 64 20   to be enlarged 
1e000 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 2c  */.  int nExtra,
1e010 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
1e020 72 20 6f 66 20 6e 65 77 20 73 6c 6f 74 73 20 74  r of new slots t
1e030 6f 20 61 64 64 20 74 6f 20 70 53 72 63 2d 3e 61  o add to pSrc->a
1e040 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 69 53 74 61  [] */.  int iSta
1e050 72 74 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e  rt         /* In
1e060 64 65 78 20 69 6e 20 70 53 72 63 2d 3e 61 5b 5d  dex in pSrc->a[]
1e070 20 6f 66 20 66 69 72 73 74 20 6e 65 77 20 73 6c   of first new sl
1e080 6f 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69  ot */.){.  int i
1e090 3b 0a 0a 20 20 2f 2a 20 53 61 6e 69 74 79 20 63  ;..  /* Sanity c
1e0a0 68 65 63 6b 69 6e 67 20 6f 6e 20 63 61 6c 6c 69  hecking on calli
1e0b0 6e 67 20 70 61 72 61 6d 65 74 65 72 73 20 2a 2f  ng parameters */
1e0c0 0a 20 20 61 73 73 65 72 74 28 20 69 53 74 61 72  .  assert( iStar
1e0d0 74 3e 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  t>=0 );.  assert
1e0e0 28 20 6e 45 78 74 72 61 3e 3d 31 20 29 3b 0a 20  ( nExtra>=1 );. 
1e0f0 20 61 73 73 65 72 74 28 20 70 53 72 63 21 3d 30   assert( pSrc!=0
1e100 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 53   );.  assert( iS
1e110 74 61 72 74 3c 3d 70 53 72 63 2d 3e 6e 53 72 63  tart<=pSrc->nSrc
1e120 20 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61   );..  /* Alloca
1e130 74 65 20 61 64 64 69 74 69 6f 6e 61 6c 20 73 70  te additional sp
1e140 61 63 65 20 69 66 20 6e 65 65 64 65 64 20 2a 2f  ace if needed */
1e150 0a 20 20 69 66 28 20 28 75 33 32 29 70 53 72 63  .  if( (u32)pSrc
1e160 2d 3e 6e 53 72 63 2b 6e 45 78 74 72 61 3e 70 53  ->nSrc+nExtra>pS
1e170 72 63 2d 3e 6e 41 6c 6c 6f 63 20 29 7b 0a 20 20  rc->nAlloc ){.  
1e180 20 20 53 72 63 4c 69 73 74 20 2a 70 4e 65 77 3b    SrcList *pNew;
1e190 0a 20 20 20 20 69 6e 74 20 6e 41 6c 6c 6f 63 20  .    int nAlloc 
1e1a0 3d 20 70 53 72 63 2d 3e 6e 53 72 63 2b 6e 45 78  = pSrc->nSrc+nEx
1e1b0 74 72 61 3b 0a 20 20 20 20 69 6e 74 20 6e 47 6f  tra;.    int nGo
1e1c0 74 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20 73 71  t;.    pNew = sq
1e1d0 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 28 64  lite3DbRealloc(d
1e1e0 62 2c 20 70 53 72 63 2c 0a 20 20 20 20 20 20 20  b, pSrc,.       
1e1f0 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28 2a          sizeof(*
1e200 70 53 72 63 29 20 2b 20 28 6e 41 6c 6c 6f 63 2d  pSrc) + (nAlloc-
1e210 31 29 2a 73 69 7a 65 6f 66 28 70 53 72 63 2d 3e  1)*sizeof(pSrc->
1e220 61 5b 30 5d 29 20 29 3b 0a 20 20 20 20 69 66 28  a[0]) );.    if(
1e230 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20   pNew==0 ){.    
1e240 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6d 61    assert( db->ma
1e250 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20  llocFailed );.  
1e260 20 20 20 20 72 65 74 75 72 6e 20 70 53 72 63 3b      return pSrc;
1e270 0a 20 20 20 20 7d 0a 20 20 20 20 70 53 72 63 20  .    }.    pSrc 
1e280 3d 20 70 4e 65 77 3b 0a 20 20 20 20 6e 47 6f 74  = pNew;.    nGot
1e290 20 3d 20 28 73 71 6c 69 74 65 33 44 62 4d 61 6c   = (sqlite3DbMal
1e2a0 6c 6f 63 53 69 7a 65 28 64 62 2c 20 70 4e 65 77  locSize(db, pNew
1e2b0 29 20 2d 20 73 69 7a 65 6f 66 28 2a 70 53 72 63  ) - sizeof(*pSrc
1e2c0 29 29 2f 73 69 7a 65 6f 66 28 70 53 72 63 2d 3e  ))/sizeof(pSrc->
1e2d0 61 5b 30 5d 29 2b 31 3b 0a 20 20 20 20 70 53 72  a[0])+1;.    pSr
1e2e0 63 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 6e 47 6f 74  c->nAlloc = nGot
1e2f0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 6f 76 65  ;.  }..  /* Move
1e300 20 65 78 69 73 74 69 6e 67 20 73 6c 6f 74 73 20   existing slots 
1e310 74 68 61 74 20 63 6f 6d 65 20 61 66 74 65 72 20  that come after 
1e320 74 68 65 20 6e 65 77 6c 79 20 69 6e 73 65 72 74  the newly insert
1e330 65 64 20 73 6c 6f 74 73 0a 20 20 2a 2a 20 6f 75  ed slots.  ** ou
1e340 74 20 6f 66 20 74 68 65 20 77 61 79 20 2a 2f 0a  t of the way */.
1e350 20 20 66 6f 72 28 69 3d 70 53 72 63 2d 3e 6e 53    for(i=pSrc->nS
1e360 72 63 2d 31 3b 20 69 3e 3d 69 53 74 61 72 74 3b  rc-1; i>=iStart;
1e370 20 69 2d 2d 29 7b 0a 20 20 20 20 70 53 72 63 2d   i--){.    pSrc-
1e380 3e 61 5b 69 2b 6e 45 78 74 72 61 5d 20 3d 20 70  >a[i+nExtra] = p
1e390 53 72 63 2d 3e 61 5b 69 5d 3b 0a 20 20 7d 0a 20  Src->a[i];.  }. 
1e3a0 20 70 53 72 63 2d 3e 6e 53 72 63 20 2b 3d 20 6e   pSrc->nSrc += n
1e3b0 45 78 74 72 61 3b 0a 0a 20 20 2f 2a 20 5a 65 72  Extra;..  /* Zer
1e3c0 6f 20 74 68 65 20 6e 65 77 6c 79 20 61 6c 6c 6f  o the newly allo
1e3d0 63 61 74 65 64 20 73 6c 6f 74 73 20 2a 2f 0a 20  cated slots */. 
1e3e0 20 6d 65 6d 73 65 74 28 26 70 53 72 63 2d 3e 61   memset(&pSrc->a
1e3f0 5b 69 53 74 61 72 74 5d 2c 20 30 2c 20 73 69 7a  [iStart], 0, siz
1e400 65 6f 66 28 70 53 72 63 2d 3e 61 5b 30 5d 29 2a  eof(pSrc->a[0])*
1e410 6e 45 78 74 72 61 29 3b 0a 20 20 66 6f 72 28 69  nExtra);.  for(i
1e420 3d 69 53 74 61 72 74 3b 20 69 3c 69 53 74 61 72  =iStart; i<iStar
1e430 74 2b 6e 45 78 74 72 61 3b 20 69 2b 2b 29 7b 0a  t+nExtra; i++){.
1e440 20 20 20 20 70 53 72 63 2d 3e 61 5b 69 5d 2e 69      pSrc->a[i].i
1e450 43 75 72 73 6f 72 20 3d 20 2d 31 3b 0a 20 20 7d  Cursor = -1;.  }
1e460 0a 0a 20 20 2f 2a 20 52 65 74 75 72 6e 20 61 20  ..  /* Return a 
1e470 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 65  pointer to the e
1e480 6e 6c 61 72 67 65 64 20 53 72 63 4c 69 73 74 20  nlarged SrcList 
1e490 2a 2f 0a 20 20 72 65 74 75 72 6e 20 70 53 72 63  */.  return pSrc
1e4a0 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65  ;.}.../*.** Appe
1e4b0 6e 64 20 61 20 6e 65 77 20 74 61 62 6c 65 20 6e  nd a new table n
1e4c0 61 6d 65 20 74 6f 20 74 68 65 20 67 69 76 65 6e  ame to the given
1e4d0 20 53 72 63 4c 69 73 74 2e 20 20 43 72 65 61 74   SrcList.  Creat
1e4e0 65 20 61 20 6e 65 77 20 53 72 63 4c 69 73 74 20  e a new SrcList 
1e4f0 69 66 0a 2a 2a 20 6e 65 65 64 20 62 65 2e 20 20  if.** need be.  
1e500 41 20 6e 65 77 20 65 6e 74 72 79 20 69 73 20 63  A new entry is c
1e510 72 65 61 74 65 64 20 69 6e 20 74 68 65 20 53 72  reated in the Sr
1e520 63 4c 69 73 74 20 65 76 65 6e 20 69 66 20 70 54  cList even if pT
1e530 61 62 6c 65 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2a  able is NULL..**
1e540 0a 2a 2a 20 41 20 53 72 63 4c 69 73 74 20 69 73  .** A SrcList is
1e550 20 72 65 74 75 72 6e 65 64 2c 20 6f 72 20 4e 55   returned, or NU
1e560 4c 4c 20 69 66 20 74 68 65 72 65 20 69 73 20 61  LL if there is a
1e570 6e 20 4f 4f 4d 20 65 72 72 6f 72 2e 20 20 54 68  n OOM error.  Th
1e580 65 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 53 72  e returned.** Sr
1e590 63 4c 69 73 74 20 6d 69 67 68 74 20 62 65 20 74  cList might be t
1e5a0 68 65 20 73 61 6d 65 20 61 73 20 74 68 65 20 53  he same as the S
1e5b0 72 63 4c 69 73 74 20 74 68 61 74 20 77 61 73 20  rcList that was 
1e5c0 69 6e 70 75 74 20 6f 72 20 69 74 20 6d 69 67 68  input or it migh
1e5d0 74 20 62 65 0a 2a 2a 20 61 20 6e 65 77 20 6f 6e  t be.** a new on
1e5e0 65 2e 20 20 49 66 20 61 6e 20 4f 4f 4d 20 65 72  e.  If an OOM er
1e5f0 72 6f 72 20 64 6f 65 73 20 6f 63 63 75 72 73 2c  ror does occurs,
1e600 20 74 68 65 6e 20 74 68 65 20 70 72 69 6f 72 20   then the prior 
1e610 76 61 6c 75 65 20 6f 66 20 70 4c 69 73 74 0a 2a  value of pList.*
1e620 2a 20 74 68 61 74 20 69 73 20 69 6e 70 75 74 20  * that is input 
1e630 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  to this routine 
1e640 69 73 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  is automatically
1e650 20 66 72 65 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66   freed..**.** If
1e660 20 70 44 61 74 61 62 61 73 65 20 69 73 20 6e 6f   pDatabase is no
1e670 74 20 6e 75 6c 6c 2c 20 69 74 20 6d 65 61 6e 73  t null, it means
1e680 20 74 68 61 74 20 74 68 65 20 74 61 62 6c 65 20   that the table 
1e690 68 61 73 20 61 6e 20 6f 70 74 69 6f 6e 61 6c 0a  has an optional.
1e6a0 2a 2a 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65  ** database name
1e6b0 20 70 72 65 66 69 78 2e 20 20 4c 69 6b 65 20 74   prefix.  Like t
1e6c0 68 69 73 3a 20 20 22 64 61 74 61 62 61 73 65 2e  his:  "database.
1e6d0 74 61 62 6c 65 22 2e 20 20 54 68 65 20 70 44 61  table".  The pDa
1e6e0 74 61 62 61 73 65 0a 2a 2a 20 70 6f 69 6e 74 73  tabase.** points
1e6f0 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 6e 61   to the table na
1e700 6d 65 20 61 6e 64 20 74 68 65 20 70 54 61 62 6c  me and the pTabl
1e710 65 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20  e points to the 
1e720 64 61 74 61 62 61 73 65 20 6e 61 6d 65 2e 0a 2a  database name..*
1e730 2a 20 54 68 65 20 53 72 63 4c 69 73 74 2e 61 5b  * The SrcList.a[
1e740 5d 2e 7a 4e 61 6d 65 20 66 69 65 6c 64 20 69 73  ].zName field is
1e750 20 66 69 6c 6c 65 64 20 77 69 74 68 20 74 68 65   filled with the
1e760 20 74 61 62 6c 65 20 6e 61 6d 65 20 77 68 69 63   table name whic
1e770 68 20 6d 69 67 68 74 0a 2a 2a 20 63 6f 6d 65 20  h might.** come 
1e780 66 72 6f 6d 20 70 54 61 62 6c 65 20 28 69 66 20  from pTable (if 
1e790 70 44 61 74 61 62 61 73 65 20 69 73 20 4e 55 4c  pDatabase is NUL
1e7a0 4c 29 20 6f 72 20 66 72 6f 6d 20 70 44 61 74 61  L) or from pData
1e7b0 62 61 73 65 2e 20 20 0a 2a 2a 20 53 72 63 4c 69  base.  .** SrcLi
1e7c0 73 74 2e 61 5b 5d 2e 7a 44 61 74 61 62 61 73 65  st.a[].zDatabase
1e7d0 20 69 73 20 66 69 6c 6c 65 64 20 77 69 74 68 20   is filled with 
1e7e0 74 68 65 20 64 61 74 61 62 61 73 65 20 6e 61 6d  the database nam
1e7f0 65 20 66 72 6f 6d 20 70 54 61 62 6c 65 2c 0a 2a  e from pTable,.*
1e800 2a 20 6f 72 20 77 69 74 68 20 4e 55 4c 4c 20 69  * or with NULL i
1e810 66 20 6e 6f 20 64 61 74 61 62 61 73 65 20 69 73  f no database is
1e820 20 73 70 65 63 69 66 69 65 64 2e 0a 2a 2a 0a 2a   specified..**.*
1e830 2a 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73  * In other words
1e840 2c 20 69 66 20 63 61 6c 6c 20 6c 69 6b 65 20 74  , if call like t
1e850 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  his:.**.**      
1e860 20 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73     sqlite3SrcLis
1e870 74 41 70 70 65 6e 64 28 44 2c 41 2c 42 2c 30 29  tAppend(D,A,B,0)
1e880 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 42 20 69  ;.**.** Then B i
1e890 73 20 61 20 74 61 62 6c 65 20 6e 61 6d 65 20 61  s a table name a
1e8a0 6e 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20  nd the database 
1e8b0 6e 61 6d 65 20 69 73 20 75 6e 73 70 65 63 69 66  name is unspecif
1e8c0 69 65 64 2e 20 20 49 66 20 63 61 6c 6c 65 64 0a  ied.  If called.
1e8d0 2a 2a 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a  ** like this:.**
1e8e0 0a 2a 2a 20 20 20 20 20 20 20 20 20 73 71 6c 69  .**         sqli
1e8f0 74 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64  te3SrcListAppend
1e900 28 44 2c 41 2c 42 2c 43 29 3b 0a 2a 2a 0a 2a 2a  (D,A,B,C);.**.**
1e910 20 54 68 65 6e 20 43 20 69 73 20 74 68 65 20 74   Then C is the t
1e920 61 62 6c 65 20 6e 61 6d 65 20 61 6e 64 20 42 20  able name and B 
1e930 69 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20  is the database 
1e940 6e 61 6d 65 2e 20 20 49 66 20 43 20 69 73 20 64  name.  If C is d
1e950 65 66 69 6e 65 64 0a 2a 2a 20 74 68 65 6e 20 73  efined.** then s
1e960 6f 20 69 73 20 42 2e 20 20 49 6e 20 6f 74 68 65  o is B.  In othe
1e970 72 20 77 6f 72 64 73 2c 20 77 65 20 6e 65 76 65  r words, we neve
1e980 72 20 68 61 76 65 20 61 20 63 61 73 65 20 77 68  r have a case wh
1e990 65 72 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  ere:.**.**      
1e9a0 20 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73     sqlite3SrcLis
1e9b0 74 41 70 70 65 6e 64 28 44 2c 41 2c 30 2c 43 29  tAppend(D,A,0,C)
1e9c0 3b 0a 2a 2a 0a 2a 2a 20 42 6f 74 68 20 70 54 61  ;.**.** Both pTa
1e9d0 62 6c 65 20 61 6e 64 20 70 44 61 74 61 62 61 73  ble and pDatabas
1e9e0 65 20 61 72 65 20 61 73 73 75 6d 65 64 20 74 6f  e are assumed to
1e9f0 20 62 65 20 71 75 6f 74 65 64 2e 20 20 54 68 65   be quoted.  The
1ea00 79 20 61 72 65 20 64 65 71 75 6f 74 65 64 0a 2a  y are dequoted.*
1ea10 2a 20 62 65 66 6f 72 65 20 62 65 69 6e 67 20 61  * before being a
1ea20 64 64 65 64 20 74 6f 20 74 68 65 20 53 72 63 4c  dded to the SrcL
1ea30 69 73 74 2e 0a 2a 2f 0a 53 72 63 4c 69 73 74 20  ist..*/.SrcList 
1ea40 2a 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41  *sqlite3SrcListA
1ea50 70 70 65 6e 64 28 0a 20 20 73 71 6c 69 74 65 33  ppend(.  sqlite3
1ea60 20 2a 64 62 2c 20 20 20 20 20 20 20 20 2f 2a 20   *db,        /* 
1ea70 43 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 6e 6f  Connection to no
1ea80 74 69 66 79 20 6f 66 20 6d 61 6c 6c 6f 63 20 66  tify of malloc f
1ea90 61 69 6c 75 72 65 73 20 2a 2f 0a 20 20 53 72 63  ailures */.  Src
1eaa0 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 20  List *pList,    
1eab0 20 2f 2a 20 41 70 70 65 6e 64 20 74 6f 20 74 68   /* Append to th
1eac0 69 73 20 53 72 63 4c 69 73 74 2e 20 4e 55 4c 4c  is SrcList. NULL
1ead0 20 63 72 65 61 74 65 73 20 61 20 6e 65 77 20 53   creates a new S
1eae0 72 63 4c 69 73 74 20 2a 2f 0a 20 20 54 6f 6b 65  rcList */.  Toke
1eaf0 6e 20 2a 70 54 61 62 6c 65 2c 20 20 20 20 20 20  n *pTable,      
1eb00 2f 2a 20 54 61 62 6c 65 20 74 6f 20 61 70 70 65  /* Table to appe
1eb10 6e 64 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  nd */.  Token *p
1eb20 44 61 74 61 62 61 73 65 20 20 20 20 2f 2a 20 44  Database    /* D
1eb30 61 74 61 62 61 73 65 20 6f 66 20 74 68 65 20 74  atabase of the t
1eb40 61 62 6c 65 20 2a 2f 0a 29 7b 0a 20 20 73 74 72  able */.){.  str
1eb50 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
1eb60 20 2a 70 49 74 65 6d 3b 0a 20 20 61 73 73 65 72   *pItem;.  asser
1eb70 74 28 20 70 44 61 74 61 62 61 73 65 3d 3d 30 20  t( pDatabase==0 
1eb80 7c 7c 20 70 54 61 62 6c 65 21 3d 30 20 29 3b 20  || pTable!=0 ); 
1eb90 20 2f 2a 20 43 61 6e 6e 6f 74 20 68 61 76 65 20   /* Cannot have 
1eba0 43 20 77 69 74 68 6f 75 74 20 42 20 2a 2f 0a 20  C without B */. 
1ebb0 20 61 73 73 65 72 74 28 20 64 62 21 3d 30 20 29   assert( db!=0 )
1ebc0 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30  ;.  if( pList==0
1ebd0 20 29 7b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20   ){.    pList = 
1ebe0 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52  sqlite3DbMallocR
1ebf0 61 77 4e 4e 28 64 62 2c 20 73 69 7a 65 6f 66 28  awNN(db, sizeof(
1ec00 53 72 63 4c 69 73 74 29 20 29 3b 0a 20 20 20 20  SrcList) );.    
1ec10 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72  if( pList==0 ) r
1ec20 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 70 4c 69  eturn 0;.    pLi
1ec30 73 74 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 31 3b 0a  st->nAlloc = 1;.
1ec40 20 20 20 20 70 4c 69 73 74 2d 3e 6e 53 72 63 20      pList->nSrc 
1ec50 3d 20 31 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28  = 1;.    memset(
1ec60 26 70 4c 69 73 74 2d 3e 61 5b 30 5d 2c 20 30 2c  &pList->a[0], 0,
1ec70 20 73 69 7a 65 6f 66 28 70 4c 69 73 74 2d 3e 61   sizeof(pList->a
1ec80 5b 30 5d 29 29 3b 0a 20 20 20 20 70 4c 69 73 74  [0]));.    pList
1ec90 2d 3e 61 5b 30 5d 2e 69 43 75 72 73 6f 72 20 3d  ->a[0].iCursor =
1eca0 20 2d 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20   -1;.  }else{.  
1ecb0 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65    pList = sqlite
1ecc0 33 53 72 63 4c 69 73 74 45 6e 6c 61 72 67 65 28  3SrcListEnlarge(
1ecd0 64 62 2c 20 70 4c 69 73 74 2c 20 31 2c 20 70 4c  db, pList, 1, pL
1ece0 69 73 74 2d 3e 6e 53 72 63 29 3b 0a 20 20 7d 0a  ist->nSrc);.  }.
1ecf0 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
1ed00 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 73 71  Failed ){.    sq
1ed10 6c 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65  lite3SrcListDele
1ed20 74 65 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a 20  te(db, pList);. 
1ed30 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
1ed40 0a 20 20 70 49 74 65 6d 20 3d 20 26 70 4c 69 73  .  pItem = &pLis
1ed50 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 53 72 63  t->a[pList->nSrc
1ed60 2d 31 5d 3b 0a 20 20 69 66 28 20 70 44 61 74 61  -1];.  if( pData
1ed70 62 61 73 65 20 26 26 20 70 44 61 74 61 62 61 73  base && pDatabas
1ed80 65 2d 3e 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 70  e->z==0 ){.    p
1ed90 44 61 74 61 62 61 73 65 20 3d 20 30 3b 0a 20 20  Database = 0;.  
1eda0 7d 0a 20 20 69 66 28 20 70 44 61 74 61 62 61 73  }.  if( pDatabas
1edb0 65 20 29 7b 0a 20 20 20 20 54 6f 6b 65 6e 20 2a  e ){.    Token *
1edc0 70 54 65 6d 70 20 3d 20 70 44 61 74 61 62 61 73  pTemp = pDatabas
1edd0 65 3b 0a 20 20 20 20 70 44 61 74 61 62 61 73 65  e;.    pDatabase
1ede0 20 3d 20 70 54 61 62 6c 65 3b 0a 20 20 20 20 70   = pTable;.    p
1edf0 54 61 62 6c 65 20 3d 20 70 54 65 6d 70 3b 0a 20  Table = pTemp;. 
1ee00 20 7d 0a 20 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d   }.  pItem->zNam
1ee10 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46  e = sqlite3NameF
1ee20 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 54 61  romToken(db, pTa
1ee30 62 6c 65 29 3b 0a 20 20 70 49 74 65 6d 2d 3e 7a  ble);.  pItem->z
1ee40 44 61 74 61 62 61 73 65 20 3d 20 73 71 6c 69 74  Database = sqlit
1ee50 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28  e3NameFromToken(
1ee60 64 62 2c 20 70 44 61 74 61 62 61 73 65 29 3b 0a  db, pDatabase);.
1ee70 20 20 72 65 74 75 72 6e 20 70 4c 69 73 74 3b 0a    return pList;.
1ee80 7d 0a 0a 2f 2a 0a 2a 2a 20 41 73 73 69 67 6e 20  }../*.** Assign 
1ee90 56 64 62 65 43 75 72 73 6f 72 20 69 6e 64 65 78  VdbeCursor index
1eea0 20 6e 75 6d 62 65 72 73 20 74 6f 20 61 6c 6c 20   numbers to all 
1eeb0 74 61 62 6c 65 73 20 69 6e 20 61 20 53 72 63 4c  tables in a SrcL
1eec0 69 73 74 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ist.*/.void sqli
1eed0 74 65 33 53 72 63 4c 69 73 74 41 73 73 69 67 6e  te3SrcListAssign
1eee0 43 75 72 73 6f 72 73 28 50 61 72 73 65 20 2a 70  Cursors(Parse *p
1eef0 50 61 72 73 65 2c 20 53 72 63 4c 69 73 74 20 2a  Parse, SrcList *
1ef00 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b  pList){.  int i;
1ef10 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73  .  struct SrcLis
1ef20 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20  t_item *pItem;. 
1ef30 20 61 73 73 65 72 74 28 70 4c 69 73 74 20 7c 7c   assert(pList ||
1ef40 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c   pParse->db->mal
1ef50 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 69  locFailed );.  i
1ef60 66 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20  f( pList ){.    
1ef70 66 6f 72 28 69 3d 30 2c 20 70 49 74 65 6d 3d 70  for(i=0, pItem=p
1ef80 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 4c 69 73 74  List->a; i<pList
1ef90 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 49 74  ->nSrc; i++, pIt
1efa0 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28  em++){.      if(
1efb0 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3e   pItem->iCursor>
1efc0 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =0 ) break;.    
1efd0 20 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72    pItem->iCursor
1efe0 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b   = pParse->nTab+
1eff0 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49 74  +;.      if( pIt
1f000 65 6d 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20  em->pSelect ){. 
1f010 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 72         sqlite3Sr
1f020 63 4c 69 73 74 41 73 73 69 67 6e 43 75 72 73 6f  cListAssignCurso
1f030 72 73 28 70 50 61 72 73 65 2c 20 70 49 74 65 6d  rs(pParse, pItem
1f040 2d 3e 70 53 65 6c 65 63 74 2d 3e 70 53 72 63 29  ->pSelect->pSrc)
1f050 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1f060 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c    }.}../*.** Del
1f070 65 74 65 20 61 6e 20 65 6e 74 69 72 65 20 53 72  ete an entire Sr
1f080 63 4c 69 73 74 20 69 6e 63 6c 75 64 69 6e 67 20  cList including 
1f090 61 6c 6c 20 69 74 73 20 73 75 62 73 74 72 75 63  all its substruc
1f0a0 74 75 72 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ture..*/.void sq
1f0b0 6c 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65  lite3SrcListDele
1f0c0 74 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  te(sqlite3 *db, 
1f0d0 53 72 63 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b  SrcList *pList){
1f0e0 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75  .  int i;.  stru
1f0f0 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
1f100 2a 70 49 74 65 6d 3b 0a 20 20 69 66 28 20 70 4c  *pItem;.  if( pL
1f110 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ist==0 ) return;
1f120 0a 20 20 66 6f 72 28 70 49 74 65 6d 3d 70 4c 69  .  for(pItem=pLi
1f130 73 74 2d 3e 61 2c 20 69 3d 30 3b 20 69 3c 70 4c  st->a, i=0; i<pL
1f140 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20  ist->nSrc; i++, 
1f150 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 73 71  pItem++){.    sq
1f160 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
1f170 70 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65  pItem->zDatabase
1f180 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  );.    sqlite3Db
1f190 46 72 65 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e  Free(db, pItem->
1f1a0 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69  zName);.    sqli
1f1b0 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 49  te3DbFree(db, pI
1f1c0 74 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20 20  tem->zAlias);.  
1f1d0 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 66 67 2e    if( pItem->fg.
1f1e0 69 73 49 6e 64 65 78 65 64 42 79 20 29 20 73 71  isIndexedBy ) sq
1f1f0 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
1f200 70 49 74 65 6d 2d 3e 75 31 2e 7a 49 6e 64 65 78  pItem->u1.zIndex
1f210 65 64 42 79 29 3b 0a 20 20 20 20 69 66 28 20 70  edBy);.    if( p
1f220 49 74 65 6d 2d 3e 66 67 2e 69 73 54 61 62 46 75  Item->fg.isTabFu
1f230 6e 63 20 29 20 73 71 6c 69 74 65 33 45 78 70 72  nc ) sqlite3Expr
1f240 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70  ListDelete(db, p
1f250 49 74 65 6d 2d 3e 75 31 2e 70 46 75 6e 63 41 72  Item->u1.pFuncAr
1f260 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  g);.    sqlite3D
1f270 65 6c 65 74 65 54 61 62 6c 65 28 64 62 2c 20 70  eleteTable(db, p
1f280 49 74 65 6d 2d 3e 70 54 61 62 29 3b 0a 20 20 20  Item->pTab);.   
1f290 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
1f2a0 6c 65 74 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e  lete(db, pItem->
1f2b0 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 73 71  pSelect);.    sq
1f2c0 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
1f2d0 64 62 2c 20 70 49 74 65 6d 2d 3e 70 4f 6e 29 3b  db, pItem->pOn);
1f2e0 0a 20 20 20 20 73 71 6c 69 74 65 33 49 64 4c 69  .    sqlite3IdLi
1f2f0 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 49 74  stDelete(db, pIt
1f300 65 6d 2d 3e 70 55 73 69 6e 67 29 3b 0a 20 20 7d  em->pUsing);.  }
1f310 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
1f320 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a 7d 0a 0a  (db, pList);.}..
1f330 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
1f340 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20  ne is called by 
1f350 74 68 65 20 70 61 72 73 65 72 20 74 6f 20 61 64  the parser to ad
1f360 64 20 61 20 6e 65 77 20 74 65 72 6d 20 74 6f 20  d a new term to 
1f370 74 68 65 0a 2a 2a 20 65 6e 64 20 6f 66 20 61 20  the.** end of a 
1f380 67 72 6f 77 69 6e 67 20 46 52 4f 4d 20 63 6c 61  growing FROM cla
1f390 75 73 65 2e 20 20 54 68 65 20 22 70 22 20 70 61  use.  The "p" pa
1f3a0 72 61 6d 65 74 65 72 20 69 73 20 74 68 65 20 70  rameter is the p
1f3b0 61 72 74 20 6f 66 0a 2a 2a 20 74 68 65 20 46 52  art of.** the FR
1f3c0 4f 4d 20 63 6c 61 75 73 65 20 74 68 61 74 20 68  OM clause that h
1f3d0 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
1f3e0 63 6f 6e 73 74 72 75 63 74 65 64 2e 20 20 22 70  constructed.  "p
1f3f0 22 20 69 73 20 4e 55 4c 4c 0a 2a 2a 20 69 66 20  " is NULL.** if 
1f400 74 68 69 73 20 69 73 20 74 68 65 20 66 69 72 73  this is the firs
1f410 74 20 74 65 72 6d 20 6f 66 20 74 68 65 20 46 52  t term of the FR
1f420 4f 4d 20 63 6c 61 75 73 65 2e 20 20 70 54 61 62  OM clause.  pTab
1f430 6c 65 20 61 6e 64 20 70 44 61 74 61 62 61 73 65  le and pDatabase
1f440 0a 2a 2a 20 61 72 65 20 74 68 65 20 6e 61 6d 65  .** are the name
1f450 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 61 6e   of the table an
1f460 64 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 64  d database named
1f470 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
1f480 75 73 65 20 74 65 72 6d 2e 0a 2a 2a 20 70 44 61  use term..** pDa
1f490 74 61 62 61 73 65 20 69 73 20 4e 55 4c 4c 20 69  tabase is NULL i
1f4a0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6e  f the database n
1f4b0 61 6d 65 20 71 75 61 6c 69 66 69 65 72 20 69 73  ame qualifier is
1f4c0 20 6d 69 73 73 69 6e 67 20 2d 20 74 68 65 0a 2a   missing - the.*
1f4d0 2a 20 75 73 75 61 6c 20 63 61 73 65 2e 20 20 49  * usual case.  I
1f4e0 66 20 74 68 65 20 74 65 72 6d 20 68 61 73 20 61  f the term has a
1f4f0 6e 20 61 6c 69 61 73 2c 20 74 68 65 6e 20 70 41  n alias, then pA
1f500 6c 69 61 73 20 70 6f 69 6e 74 73 20 74 6f 20 74  lias points to t
1f510 68 65 0a 2a 2a 20 61 6c 69 61 73 20 74 6f 6b 65  he.** alias toke
1f520 6e 2e 20 20 49 66 20 74 68 65 20 74 65 72 6d 20  n.  If the term 
1f530 69 73 20 61 20 73 75 62 71 75 65 72 79 2c 20 74  is a subquery, t
1f540 68 65 6e 20 70 53 75 62 71 75 65 72 79 20 69 73  hen pSubquery is
1f550 20 74 68 65 0a 2a 2a 20 53 45 4c 45 43 54 20 73   the.** SELECT s
1f560 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20 74 68  tatement that th
1f570 65 20 73 75 62 71 75 65 72 79 20 65 6e 63 6f 64  e subquery encod
1f580 65 73 2e 20 20 54 68 65 20 70 54 61 62 6c 65 20  es.  The pTable 
1f590 61 6e 64 0a 2a 2a 20 70 44 61 74 61 62 61 73 65  and.** pDatabase
1f5a0 20 70 61 72 61 6d 65 74 65 72 73 20 61 72 65 20   parameters are 
1f5b0 4e 55 4c 4c 20 66 6f 72 20 73 75 62 71 75 65 72  NULL for subquer
1f5c0 69 65 73 2e 20 20 54 68 65 20 70 4f 6e 20 61 6e  ies.  The pOn an
1f5d0 64 20 70 55 73 69 6e 67 0a 2a 2a 20 70 61 72 61  d pUsing.** para
1f5e0 6d 65 74 65 72 73 20 61 72 65 20 74 68 65 20 63  meters are the c
1f5f0 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 4f 4e  ontent of the ON
1f600 20 61 6e 64 20 55 53 49 4e 47 20 63 6c 61 75 73   and USING claus
1f610 65 73 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  es..**.** Return
1f620 20 61 20 6e 65 77 20 53 72 63 4c 69 73 74 20 77   a new SrcList w
1f630 68 69 63 68 20 65 6e 63 6f 64 65 73 20 69 73 20  hich encodes is 
1f640 74 68 65 20 46 52 4f 4d 20 77 69 74 68 20 74 68  the FROM with th
1f650 65 20 6e 65 77 0a 2a 2a 20 74 65 72 6d 20 61 64  e new.** term ad
1f660 64 65 64 2e 0a 2a 2f 0a 53 72 63 4c 69 73 74 20  ded..*/.SrcList 
1f670 2a 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41  *sqlite3SrcListA
1f680 70 70 65 6e 64 46 72 6f 6d 54 65 72 6d 28 0a 20  ppendFromTerm(. 
1f690 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
1f6a0 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73           /* Pars
1f6b0 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
1f6c0 20 53 72 63 4c 69 73 74 20 2a 70 2c 20 20 20 20   SrcList *p,    
1f6d0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1f6e0 6c 65 66 74 20 70 61 72 74 20 6f 66 20 74 68 65  left part of the
1f6f0 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 61 6c 72   FROM clause alr
1f700 65 61 64 79 20 73 65 65 6e 20 2a 2f 0a 20 20 54  eady seen */.  T
1f710 6f 6b 65 6e 20 2a 70 54 61 62 6c 65 2c 20 20 20  oken *pTable,   
1f720 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
1f730 66 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20 61  f the table to a
1f740 64 64 20 74 6f 20 74 68 65 20 46 52 4f 4d 20 63  dd to the FROM c
1f750 6c 61 75 73 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e  lause */.  Token
1f760 20 2a 70 44 61 74 61 62 61 73 65 2c 20 20 20 20   *pDatabase,    
1f770 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
1f780 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74 61  e database conta
1f790 69 6e 69 6e 67 20 70 54 61 62 6c 65 20 2a 2f 0a  ining pTable */.
1f7a0 20 20 54 6f 6b 65 6e 20 2a 70 41 6c 69 61 73 2c    Token *pAlias,
1f7b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1f7c0 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65   right-hand side
1f7d0 20 6f 66 20 74 68 65 20 41 53 20 73 75 62 65 78   of the AS subex
1f7e0 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 53 65  pression */.  Se
1f7f0 6c 65 63 74 20 2a 70 53 75 62 71 75 65 72 79 2c  lect *pSubquery,
1f800 20 20 20 20 20 20 2f 2a 20 41 20 73 75 62 71 75        /* A subqu
1f810 65 72 79 20 75 73 65 64 20 69 6e 20 70 6c 61 63  ery used in plac
1f820 65 20 6f 66 20 61 20 74 61 62 6c 65 20 6e 61 6d  e of a table nam
1f830 65 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4f 6e  e */.  Expr *pOn
1f840 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
1f850 2a 20 54 68 65 20 4f 4e 20 63 6c 61 75 73 65 20  * The ON clause 
1f860 6f 66 20 61 20 6a 6f 69 6e 20 2a 2f 0a 20 20 49  of a join */.  I
1f870 64 4c 69 73 74 20 2a 70 55 73 69 6e 67 20 20 20  dList *pUsing   
1f880 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 55 53         /* The US
1f890 49 4e 47 20 63 6c 61 75 73 65 20 6f 66 20 61 20  ING clause of a 
1f8a0 6a 6f 69 6e 20 2a 2f 0a 29 7b 0a 20 20 73 74 72  join */.){.  str
1f8b0 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
1f8c0 20 2a 70 49 74 65 6d 3b 0a 20 20 73 71 6c 69 74   *pItem;.  sqlit
1f8d0 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
1f8e0 3e 64 62 3b 0a 20 20 69 66 28 20 21 70 20 26 26  >db;.  if( !p &&
1f8f0 20 28 70 4f 6e 20 7c 7c 20 70 55 73 69 6e 67 29   (pOn || pUsing)
1f900 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
1f910 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
1f920 22 61 20 4a 4f 49 4e 20 63 6c 61 75 73 65 20 69  "a JOIN clause i
1f930 73 20 72 65 71 75 69 72 65 64 20 62 65 66 6f 72  s required befor
1f940 65 20 25 73 22 2c 20 0a 20 20 20 20 20 20 28 70  e %s", .      (p
1f950 4f 6e 20 3f 20 22 4f 4e 22 20 3a 20 22 55 53 49  On ? "ON" : "USI
1f960 4e 47 22 29 0a 20 20 20 20 29 3b 0a 20 20 20 20  NG").    );.    
1f970 67 6f 74 6f 20 61 70 70 65 6e 64 5f 66 72 6f 6d  goto append_from
1f980 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 70 20  _error;.  }.  p 
1f990 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74  = sqlite3SrcList
1f9a0 41 70 70 65 6e 64 28 64 62 2c 20 70 2c 20 70 54  Append(db, p, pT
1f9b0 61 62 6c 65 2c 20 70 44 61 74 61 62 61 73 65 29  able, pDatabase)
1f9c0 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20  ;.  if( p==0 || 
1f9d0 4e 45 56 45 52 28 70 2d 3e 6e 53 72 63 3d 3d 30  NEVER(p->nSrc==0
1f9e0 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 61 70  ) ){.    goto ap
1f9f0 70 65 6e 64 5f 66 72 6f 6d 5f 65 72 72 6f 72 3b  pend_from_error;
1fa00 0a 20 20 7d 0a 20 20 70 49 74 65 6d 20 3d 20 26  .  }.  pItem = &
1fa10 70 2d 3e 61 5b 70 2d 3e 6e 53 72 63 2d 31 5d 3b  p->a[p->nSrc-1];
1fa20 0a 20 20 61 73 73 65 72 74 28 20 70 41 6c 69 61  .  assert( pAlia
1fa30 73 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 41  s!=0 );.  if( pA
1fa40 6c 69 61 73 2d 3e 6e 20 29 7b 0a 20 20 20 20 70  lias->n ){.    p
1fa50 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 3d 20 73  Item->zAlias = s
1fa60 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f  qlite3NameFromTo
1fa70 6b 65 6e 28 64 62 2c 20 70 41 6c 69 61 73 29 3b  ken(db, pAlias);
1fa80 0a 20 20 7d 0a 20 20 70 49 74 65 6d 2d 3e 70 53  .  }.  pItem->pS
1fa90 65 6c 65 63 74 20 3d 20 70 53 75 62 71 75 65 72  elect = pSubquer
1faa0 79 3b 0a 20 20 70 49 74 65 6d 2d 3e 70 4f 6e 20  y;.  pItem->pOn 
1fab0 3d 20 70 4f 6e 3b 0a 20 20 70 49 74 65 6d 2d 3e  = pOn;.  pItem->
1fac0 70 55 73 69 6e 67 20 3d 20 70 55 73 69 6e 67 3b  pUsing = pUsing;
1fad0 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 0a 20 61  .  return p;.. a
1fae0 70 70 65 6e 64 5f 66 72 6f 6d 5f 65 72 72 6f 72  ppend_from_error
1faf0 3a 0a 20 20 61 73 73 65 72 74 28 20 70 3d 3d 30  :.  assert( p==0
1fb00 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70   );.  sqlite3Exp
1fb10 72 44 65 6c 65 74 65 28 64 62 2c 20 70 4f 6e 29  rDelete(db, pOn)
1fb20 3b 0a 20 20 73 71 6c 69 74 65 33 49 64 4c 69 73  ;.  sqlite3IdLis
1fb30 74 44 65 6c 65 74 65 28 64 62 2c 20 70 55 73 69  tDelete(db, pUsi
1fb40 6e 67 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 65  ng);.  sqlite3Se
1fb50 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70  lectDelete(db, p
1fb60 53 75 62 71 75 65 72 79 29 3b 0a 20 20 72 65 74  Subquery);.  ret
1fb70 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
1fb80 41 64 64 20 61 6e 20 49 4e 44 45 58 45 44 20 42  Add an INDEXED B
1fb90 59 20 6f 72 20 4e 4f 54 20 49 4e 44 45 58 45 44  Y or NOT INDEXED
1fba0 20 63 6c 61 75 73 65 20 74 6f 20 74 68 65 20 6d   clause to the m
1fbb0 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 61 64 64  ost recently add
1fbc0 65 64 20 0a 2a 2a 20 65 6c 65 6d 65 6e 74 20 6f  ed .** element o
1fbd0 66 20 74 68 65 20 73 6f 75 72 63 65 2d 6c 69 73  f the source-lis
1fbe0 74 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  t passed as the 
1fbf0 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e  second argument.
1fc00 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
1fc10 53 72 63 4c 69 73 74 49 6e 64 65 78 65 64 42 79  SrcListIndexedBy
1fc20 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
1fc30 53 72 63 4c 69 73 74 20 2a 70 2c 20 54 6f 6b 65  SrcList *p, Toke
1fc40 6e 20 2a 70 49 6e 64 65 78 65 64 42 79 29 7b 0a  n *pIndexedBy){.
1fc50 20 20 61 73 73 65 72 74 28 20 70 49 6e 64 65 78    assert( pIndex
1fc60 65 64 42 79 21 3d 30 20 29 3b 0a 20 20 69 66 28  edBy!=0 );.  if(
1fc70 20 70 20 26 26 20 41 4c 57 41 59 53 28 70 2d 3e   p && ALWAYS(p->
1fc80 6e 53 72 63 3e 30 29 20 29 7b 0a 20 20 20 20 73  nSrc>0) ){.    s
1fc90 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
1fca0 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70 2d 3e  em *pItem = &p->
1fcb0 61 5b 70 2d 3e 6e 53 72 63 2d 31 5d 3b 0a 20 20  a[p->nSrc-1];.  
1fcc0 20 20 61 73 73 65 72 74 28 20 70 49 74 65 6d 2d    assert( pItem-
1fcd0 3e 66 67 2e 6e 6f 74 49 6e 64 65 78 65 64 3d 3d  >fg.notIndexed==
1fce0 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
1fcf0 20 70 49 74 65 6d 2d 3e 66 67 2e 69 73 49 6e 64   pItem->fg.isInd
1fd00 65 78 65 64 42 79 3d 3d 30 20 29 3b 0a 20 20 20  exedBy==0 );.   
1fd10 20 61 73 73 65 72 74 28 20 70 49 74 65 6d 2d 3e   assert( pItem->
1fd20 66 67 2e 69 73 54 61 62 46 75 6e 63 3d 3d 30 20  fg.isTabFunc==0 
1fd30 29 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 64 65  );.    if( pInde
1fd40 78 65 64 42 79 2d 3e 6e 3d 3d 31 20 26 26 20 21  xedBy->n==1 && !
1fd50 70 49 6e 64 65 78 65 64 42 79 2d 3e 7a 20 29 7b  pIndexedBy->z ){
1fd60 0a 20 20 20 20 20 20 2f 2a 20 41 20 22 4e 4f 54  .      /* A "NOT
1fd70 20 49 4e 44 45 58 45 44 22 20 63 6c 61 75 73 65   INDEXED" clause
1fd80 20 77 61 73 20 73 75 70 70 6c 69 65 64 2e 20 53   was supplied. S
1fd90 65 65 20 70 61 72 73 65 2e 79 20 0a 20 20 20 20  ee parse.y .    
1fda0 20 20 2a 2a 20 63 6f 6e 73 74 72 75 63 74 20 22    ** construct "
1fdb0 69 6e 64 65 78 65 64 5f 6f 70 74 22 20 66 6f 72  indexed_opt" for
1fdc0 20 64 65 74 61 69 6c 73 2e 20 2a 2f 0a 20 20 20   details. */.   
1fdd0 20 20 20 70 49 74 65 6d 2d 3e 66 67 2e 6e 6f 74     pItem->fg.not
1fde0 49 6e 64 65 78 65 64 20 3d 20 31 3b 0a 20 20 20  Indexed = 1;.   
1fdf0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 49   }else{.      pI
1fe00 74 65 6d 2d 3e 75 31 2e 7a 49 6e 64 65 78 65 64  tem->u1.zIndexed
1fe10 42 79 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65  By = sqlite3Name
1fe20 46 72 6f 6d 54 6f 6b 65 6e 28 70 50 61 72 73 65  FromToken(pParse
1fe30 2d 3e 64 62 2c 20 70 49 6e 64 65 78 65 64 42 79  ->db, pIndexedBy
1fe40 29 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e  );.      pItem->
1fe50 66 67 2e 69 73 49 6e 64 65 78 65 64 42 79 20 3d  fg.isIndexedBy =
1fe60 20 28 70 49 74 65 6d 2d 3e 75 31 2e 7a 49 6e 64   (pItem->u1.zInd
1fe70 65 78 65 64 42 79 21 3d 30 29 3b 0a 20 20 20 20  exedBy!=0);.    
1fe80 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  }.  }.}../*.** A
1fe90 64 64 20 74 68 65 20 6c 69 73 74 20 6f 66 20 66  dd the list of f
1fea0 75 6e 63 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74  unction argument
1feb0 73 20 74 6f 20 74 68 65 20 53 72 63 4c 69 73 74  s to the SrcList
1fec0 20 65 6e 74 72 79 20 66 6f 72 20 61 0a 2a 2a 20   entry for a.** 
1fed0 74 61 62 6c 65 2d 76 61 6c 75 65 64 2d 66 75 6e  table-valued-fun
1fee0 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ction..*/.void s
1fef0 71 6c 69 74 65 33 53 72 63 4c 69 73 74 46 75 6e  qlite3SrcListFun
1ff00 63 41 72 67 73 28 50 61 72 73 65 20 2a 70 50 61  cArgs(Parse *pPa
1ff10 72 73 65 2c 20 53 72 63 4c 69 73 74 20 2a 70 2c  rse, SrcList *p,
1ff20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
1ff30 29 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20  ){.  if( p ){.  
1ff40 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
1ff50 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26  _item *pItem = &
1ff60 70 2d 3e 61 5b 70 2d 3e 6e 53 72 63 2d 31 5d 3b  p->a[p->nSrc-1];
1ff70 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49 74  .    assert( pIt
1ff80 65 6d 2d 3e 66 67 2e 6e 6f 74 49 6e 64 65 78 65  em->fg.notIndexe
1ff90 64 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  d==0 );.    asse
1ffa0 72 74 28 20 70 49 74 65 6d 2d 3e 66 67 2e 69 73  rt( pItem->fg.is
1ffb0 49 6e 64 65 78 65 64 42 79 3d 3d 30 20 29 3b 0a  IndexedBy==0 );.
1ffc0 20 20 20 20 61 73 73 65 72 74 28 20 70 49 74 65      assert( pIte
1ffd0 6d 2d 3e 66 67 2e 69 73 54 61 62 46 75 6e 63 3d  m->fg.isTabFunc=
1ffe0 3d 30 20 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d  =0 );.    pItem-
1fff0 3e 75 31 2e 70 46 75 6e 63 41 72 67 20 3d 20 70  >u1.pFuncArg = p
20000 4c 69 73 74 3b 0a 20 20 20 20 70 49 74 65 6d 2d  List;.    pItem-
20010 3e 66 67 2e 69 73 54 61 62 46 75 6e 63 20 3d 20  >fg.isTabFunc = 
20020 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  1;.  }else{.    
20030 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
20040 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62  elete(pParse->db
20050 2c 20 70 4c 69 73 74 29 3b 0a 20 20 7d 0a 7d 0a  , pList);.  }.}.
20060 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 62 75 69 6c  ./*.** When buil
20070 64 69 6e 67 20 75 70 20 61 20 46 52 4f 4d 20 63  ding up a FROM c
20080 6c 61 75 73 65 20 69 6e 20 74 68 65 20 70 61 72  lause in the par
20090 73 65 72 2c 20 74 68 65 20 6a 6f 69 6e 20 6f 70  ser, the join op
200a0 65 72 61 74 6f 72 0a 2a 2a 20 69 73 20 69 6e 69  erator.** is ini
200b0 74 69 61 6c 6c 79 20 61 74 74 61 63 68 65 64 20  tially attached 
200c0 74 6f 20 74 68 65 20 6c 65 66 74 20 6f 70 65 72  to the left oper
200d0 61 6e 64 2e 20 20 42 75 74 20 74 68 65 20 63 6f  and.  But the co
200e0 64 65 20 67 65 6e 65 72 61 74 6f 72 0a 2a 2a 20  de generator.** 
200f0 65 78 70 65 63 74 73 20 74 68 65 20 6a 6f 69 6e  expects the join
20100 20 6f 70 65 72 61 74 6f 72 20 74 6f 20 62 65 20   operator to be 
20110 6f 6e 20 74 68 65 20 72 69 67 68 74 20 6f 70 65  on the right ope
20120 72 61 6e 64 2e 20 20 54 68 69 73 20 72 6f 75 74  rand.  This rout
20130 69 6e 65 0a 2a 2a 20 53 68 69 66 74 73 20 61 6c  ine.** Shifts al
20140 6c 20 6a 6f 69 6e 20 6f 70 65 72 61 74 6f 72 73  l join operators
20150 20 66 72 6f 6d 20 6c 65 66 74 20 74 6f 20 72 69   from left to ri
20160 67 68 74 20 66 6f 72 20 61 6e 20 65 6e 74 69 72  ght for an entir
20170 65 20 46 52 4f 4d 0a 2a 2a 20 63 6c 61 75 73 65  e FROM.** clause
20180 2e 0a 2a 2a 0a 2a 2a 20 45 78 61 6d 70 6c 65 3a  ..**.** Example:
20190 20 53 75 70 70 6f 73 65 20 74 68 65 20 6a 6f 69   Suppose the joi
201a0 6e 20 69 73 20 6c 69 6b 65 20 74 68 69 73 3a 0a  n is like this:.
201b0 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  **.**           
201c0 41 20 6e 61 74 75 72 61 6c 20 63 72 6f 73 73 20  A natural cross 
201d0 6a 6f 69 6e 20 42 0a 2a 2a 0a 2a 2a 20 54 68 65  join B.**.** The
201e0 20 6f 70 65 72 61 74 6f 72 20 69 73 20 22 6e 61   operator is "na
201f0 74 75 72 61 6c 20 63 72 6f 73 73 20 6a 6f 69 6e  tural cross join
20200 22 2e 20 20 54 68 65 20 41 20 61 6e 64 20 42 20  ".  The A and B 
20210 6f 70 65 72 61 6e 64 73 20 61 72 65 20 73 74 6f  operands are sto
20220 72 65 64 0a 2a 2a 20 69 6e 20 70 2d 3e 61 5b 30  red.** in p->a[0
20230 5d 20 61 6e 64 20 70 2d 3e 61 5b 31 5d 2c 20 72  ] and p->a[1], r
20240 65 73 70 65 63 74 69 76 65 6c 79 2e 20 20 54 68  espectively.  Th
20250 65 20 70 61 72 73 65 72 20 69 6e 69 74 69 61 6c  e parser initial
20260 6c 79 20 73 74 6f 72 65 73 20 74 68 65 0a 2a 2a  ly stores the.**
20270 20 6f 70 65 72 61 74 6f 72 20 77 69 74 68 20 41   operator with A
20280 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
20290 73 68 69 66 74 73 20 74 68 61 74 20 6f 70 65 72  shifts that oper
202a0 61 74 6f 72 20 6f 76 65 72 20 74 6f 20 42 2e 0a  ator over to B..
202b0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53  */.void sqlite3S
202c0 72 63 4c 69 73 74 53 68 69 66 74 4a 6f 69 6e 54  rcListShiftJoinT
202d0 79 70 65 28 53 72 63 4c 69 73 74 20 2a 70 29 7b  ype(SrcList *p){
202e0 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20  .  if( p ){.    
202f0 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69  int i;.    for(i
20300 3d 70 2d 3e 6e 53 72 63 2d 31 3b 20 69 3e 30 3b  =p->nSrc-1; i>0;
20310 20 69 2d 2d 29 7b 0a 20 20 20 20 20 20 70 2d 3e   i--){.      p->
20320 61 5b 69 5d 2e 66 67 2e 6a 6f 69 6e 74 79 70 65  a[i].fg.jointype
20330 20 3d 20 70 2d 3e 61 5b 69 2d 31 5d 2e 66 67 2e   = p->a[i-1].fg.
20340 6a 6f 69 6e 74 79 70 65 3b 0a 20 20 20 20 7d 0a  jointype;.    }.
20350 20 20 20 20 70 2d 3e 61 5b 30 5d 2e 66 67 2e 6a      p->a[0].fg.j
20360 6f 69 6e 74 79 70 65 20 3d 20 30 3b 0a 20 20 7d  ointype = 0;.  }
20370 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
20380 74 65 20 56 44 42 45 20 63 6f 64 65 20 66 6f 72  te VDBE code for
20390 20 61 20 42 45 47 49 4e 20 73 74 61 74 65 6d 65   a BEGIN stateme
203a0 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  nt..*/.void sqli
203b0 74 65 33 42 65 67 69 6e 54 72 61 6e 73 61 63 74  te3BeginTransact
203c0 69 6f 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73  ion(Parse *pPars
203d0 65 2c 20 69 6e 74 20 74 79 70 65 29 7b 0a 20 20  e, int type){.  
203e0 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 56  sqlite3 *db;.  V
203f0 64 62 65 20 2a 76 3b 0a 20 20 69 6e 74 20 69 3b  dbe *v;.  int i;
20400 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72  ..  assert( pPar
20410 73 65 21 3d 30 20 29 3b 0a 20 20 64 62 20 3d 20  se!=0 );.  db = 
20420 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 61 73  pParse->db;.  as
20430 73 65 72 74 28 20 64 62 21 3d 30 20 29 3b 0a 20  sert( db!=0 );. 
20440 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68   if( sqlite3Auth
20450 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51  Check(pParse, SQ
20460 4c 49 54 45 5f 54 52 41 4e 53 41 43 54 49 4f 4e  LITE_TRANSACTION
20470 2c 20 22 42 45 47 49 4e 22 2c 20 30 2c 20 30 29  , "BEGIN", 0, 0)
20480 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a   ){.    return;.
20490 20 20 7d 0a 20 20 76 20 3d 20 73 71 6c 69 74 65    }.  v = sqlite
204a0 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
204b0 3b 0a 20 20 69 66 28 20 21 76 20 29 20 72 65 74  ;.  if( !v ) ret
204c0 75 72 6e 3b 0a 20 20 69 66 28 20 74 79 70 65 21  urn;.  if( type!
204d0 3d 54 4b 5f 44 45 46 45 52 52 45 44 20 29 7b 0a  =TK_DEFERRED ){.
204e0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64      for(i=0; i<d
204f0 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20  b->nDb; i++){.  
20500 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
20510 64 64 4f 70 32 28 76 2c 20 4f 50 5f 54 72 61 6e  ddOp2(v, OP_Tran
20520 73 61 63 74 69 6f 6e 2c 20 69 2c 20 28 74 79 70  saction, i, (typ
20530 65 3d 3d 54 4b 5f 45 58 43 4c 55 53 49 56 45 29  e==TK_EXCLUSIVE)
20540 2b 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  +1);.      sqlit
20550 65 33 56 64 62 65 55 73 65 73 42 74 72 65 65 28  e3VdbeUsesBtree(
20560 76 2c 20 69 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  v, i);.    }.  }
20570 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
20580 64 4f 70 30 28 76 2c 20 4f 50 5f 41 75 74 6f 43  dOp0(v, OP_AutoC
20590 6f 6d 6d 69 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ommit);.}../*.**
205a0 20 47 65 6e 65 72 61 74 65 20 56 44 42 45 20 63   Generate VDBE c
205b0 6f 64 65 20 66 6f 72 20 61 20 43 4f 4d 4d 49 54  ode for a COMMIT
205c0 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 76   statement..*/.v
205d0 6f 69 64 20 73 71 6c 69 74 65 33 43 6f 6d 6d 69  oid sqlite3Commi
205e0 74 54 72 61 6e 73 61 63 74 69 6f 6e 28 50 61 72  tTransaction(Par
205f0 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 56  se *pParse){.  V
20600 64 62 65 20 2a 76 3b 0a 0a 20 20 61 73 73 65 72  dbe *v;..  asser
20610 74 28 20 70 50 61 72 73 65 21 3d 30 20 29 3b 0a  t( pParse!=0 );.
20620 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65    assert( pParse
20630 2d 3e 64 62 21 3d 30 20 29 3b 0a 20 20 69 66 28  ->db!=0 );.  if(
20640 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63   sqlite3AuthChec
20650 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45  k(pParse, SQLITE
20660 5f 54 52 41 4e 53 41 43 54 49 4f 4e 2c 20 22 43  _TRANSACTION, "C
20670 4f 4d 4d 49 54 22 2c 20 30 2c 20 30 29 20 29 7b  OMMIT", 0, 0) ){
20680 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
20690 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65  .  v = sqlite3Ge
206a0 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
206b0 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20 73 71   if( v ){.    sq
206c0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
206d0 76 2c 20 4f 50 5f 41 75 74 6f 43 6f 6d 6d 69 74  v, OP_AutoCommit
206e0 2c 20 31 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  , 1);.  }.}../*.
206f0 2a 2a 20 47 65 6e 65 72 61 74 65 20 56 44 42 45  ** Generate VDBE
20700 20 63 6f 64 65 20 66 6f 72 20 61 20 52 4f 4c 4c   code for a ROLL
20710 42 41 43 4b 20 73 74 61 74 65 6d 65 6e 74 2e 0a  BACK statement..
20720 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52  */.void sqlite3R
20730 6f 6c 6c 62 61 63 6b 54 72 61 6e 73 61 63 74 69  ollbackTransacti
20740 6f 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  on(Parse *pParse
20750 29 7b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 0a 20  ){.  Vdbe *v;.. 
20760 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65 21   assert( pParse!
20770 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
20780 70 50 61 72 73 65 2d 3e 64 62 21 3d 30 20 29 3b  pParse->db!=0 );
20790 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75  .  if( sqlite3Au
207a0 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  thCheck(pParse, 
207b0 53 51 4c 49 54 45 5f 54 52 41 4e 53 41 43 54 49  SQLITE_TRANSACTI
207c0 4f 4e 2c 20 22 52 4f 4c 4c 42 41 43 4b 22 2c 20  ON, "ROLLBACK", 
207d0 30 2c 20 30 29 20 29 7b 0a 20 20 20 20 72 65 74  0, 0) ){.    ret
207e0 75 72 6e 3b 0a 20 20 7d 0a 20 20 76 20 3d 20 73  urn;.  }.  v = s
207f0 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
20800 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76 20 29  arse);.  if( v )
20810 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
20820 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41 75  eAddOp2(v, OP_Au
20830 74 6f 43 6f 6d 6d 69 74 2c 20 31 2c 20 31 29 3b  toCommit, 1, 1);
20840 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  .  }.}../*.** Th
20850 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
20860 61 6c 6c 65 64 20 62 79 20 74 68 65 20 70 61 72  alled by the par
20870 73 65 72 20 77 68 65 6e 20 69 74 20 70 61 72 73  ser when it pars
20880 65 73 20 61 20 63 6f 6d 6d 61 6e 64 20 74 6f 20  es a command to 
20890 63 72 65 61 74 65 2c 0a 2a 2a 20 72 65 6c 65 61  create,.** relea
208a0 73 65 20 6f 72 20 72 6f 6c 6c 62 61 63 6b 20 61  se or rollback a
208b0 6e 20 53 51 4c 20 73 61 76 65 70 6f 69 6e 74 2e  n SQL savepoint.
208c0 20 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65   .*/.void sqlite
208d0 33 53 61 76 65 70 6f 69 6e 74 28 50 61 72 73 65  3Savepoint(Parse
208e0 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 6f 70   *pParse, int op
208f0 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 29 7b  , Token *pName){
20900 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d  .  char *zName =
20910 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d   sqlite3NameFrom
20920 54 6f 6b 65 6e 28 70 50 61 72 73 65 2d 3e 64 62  Token(pParse->db
20930 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20  , pName);.  if( 
20940 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 56 64 62  zName ){.    Vdb
20950 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65  e *v = sqlite3Ge
20960 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 23  tVdbe(pParse);.#
20970 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
20980 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e  IT_AUTHORIZATION
20990 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73  .    static cons
209a0 74 20 63 68 61 72 20 2a 20 63 6f 6e 73 74 20 61  t char * const a
209b0 7a 5b 5d 20 3d 20 7b 20 22 42 45 47 49 4e 22 2c  z[] = { "BEGIN",
209c0 20 22 52 45 4c 45 41 53 45 22 2c 20 22 52 4f 4c   "RELEASE", "ROL
209d0 4c 42 41 43 4b 22 20 7d 3b 0a 20 20 20 20 61 73  LBACK" };.    as
209e0 73 65 72 74 28 20 21 53 41 56 45 50 4f 49 4e 54  sert( !SAVEPOINT
209f0 5f 42 45 47 49 4e 20 26 26 20 53 41 56 45 50 4f  _BEGIN && SAVEPO
20a00 49 4e 54 5f 52 45 4c 45 41 53 45 3d 3d 31 20 26  INT_RELEASE==1 &
20a10 26 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c  & SAVEPOINT_ROLL
20a20 42 41 43 4b 3d 3d 32 20 29 3b 0a 23 65 6e 64 69  BACK==2 );.#endi
20a30 66 0a 20 20 20 20 69 66 28 20 21 76 20 7c 7c 20  f.    if( !v || 
20a40 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b  sqlite3AuthCheck
20a50 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f  (pParse, SQLITE_
20a60 53 41 56 45 50 4f 49 4e 54 2c 20 61 7a 5b 6f 70  SAVEPOINT, az[op
20a70 5d 2c 20 7a 4e 61 6d 65 2c 20 30 29 20 29 7b 0a  ], zName, 0) ){.
20a80 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
20a90 72 65 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ree(pParse->db, 
20aa0 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 72 65  zName);.      re
20ab0 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20  turn;.    }.    
20ac0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
20ad0 34 28 76 2c 20 4f 50 5f 53 61 76 65 70 6f 69 6e  4(v, OP_Savepoin
20ae0 74 2c 20 6f 70 2c 20 30 2c 20 30 2c 20 7a 4e 61  t, op, 0, 0, zNa
20af0 6d 65 2c 20 50 34 5f 44 59 4e 41 4d 49 43 29 3b  me, P4_DYNAMIC);
20b00 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61  .  }.}../*.** Ma
20b10 6b 65 20 73 75 72 65 20 74 68 65 20 54 45 4d 50  ke sure the TEMP
20b20 20 64 61 74 61 62 61 73 65 20 69 73 20 6f 70 65   database is ope
20b30 6e 20 61 6e 64 20 61 76 61 69 6c 61 62 6c 65 20  n and available 
20b40 66 6f 72 20 75 73 65 2e 20 20 52 65 74 75 72 6e  for use.  Return
20b50 0a 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  .** the number o
20b60 66 20 65 72 72 6f 72 73 2e 20 20 4c 65 61 76 65  f errors.  Leave
20b70 20 61 6e 79 20 65 72 72 6f 72 20 6d 65 73 73 61   any error messa
20b80 67 65 73 20 69 6e 20 74 68 65 20 70 50 61 72 73  ges in the pPars
20b90 65 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a  e structure..*/.
20ba0 69 6e 74 20 73 71 6c 69 74 65 33 4f 70 65 6e 54  int sqlite3OpenT
20bb0 65 6d 70 44 61 74 61 62 61 73 65 28 50 61 72 73  empDatabase(Pars
20bc0 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 73 71  e *pParse){.  sq
20bd0 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
20be0 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20 64 62  se->db;.  if( db
20bf0 2d 3e 61 44 62 5b 31 5d 2e 70 42 74 3d 3d 30 20  ->aDb[1].pBt==0 
20c00 26 26 20 21 70 50 61 72 73 65 2d 3e 65 78 70 6c  && !pParse->expl
20c10 61 69 6e 20 29 7b 0a 20 20 20 20 69 6e 74 20 72  ain ){.    int r
20c20 63 3b 0a 20 20 20 20 42 74 72 65 65 20 2a 70 42  c;.    Btree *pB
20c30 74 3b 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f  t;.    static co
20c40 6e 73 74 20 69 6e 74 20 66 6c 61 67 73 20 3d 20  nst int flags = 
20c50 0a 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54  .          SQLIT
20c60 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45  E_OPEN_READWRITE
20c70 20 7c 0a 20 20 20 20 20 20 20 20 20 20 53 51 4c   |.          SQL
20c80 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 20  ITE_OPEN_CREATE 
20c90 7c 0a 20 20 20 20 20 20 20 20 20 20 53 51 4c 49  |.          SQLI
20ca0 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56  TE_OPEN_EXCLUSIV
20cb0 45 20 7c 0a 20 20 20 20 20 20 20 20 20 20 53 51  E |.          SQ
20cc0 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45  LITE_OPEN_DELETE
20cd0 4f 4e 43 4c 4f 53 45 20 7c 0a 20 20 20 20 20 20  ONCLOSE |.      
20ce0 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f      SQLITE_OPEN_
20cf0 54 45 4d 50 5f 44 42 3b 0a 0a 20 20 20 20 72 63  TEMP_DB;..    rc
20d00 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4f   = sqlite3BtreeO
20d10 70 65 6e 28 64 62 2d 3e 70 56 66 73 2c 20 30 2c  pen(db->pVfs, 0,
20d20 20 64 62 2c 20 26 70 42 74 2c 20 30 2c 20 66 6c   db, &pBt, 0, fl
20d30 61 67 73 29 3b 0a 20 20 20 20 69 66 28 20 72 63  ags);.    if( rc
20d40 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
20d50 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
20d60 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 75 6e  rMsg(pParse, "un
20d70 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 61 20 74  able to open a t
20d80 65 6d 70 6f 72 61 72 79 20 64 61 74 61 62 61 73  emporary databas
20d90 65 20 22 0a 20 20 20 20 20 20 20 20 22 66 69 6c  e ".        "fil
20da0 65 20 66 6f 72 20 73 74 6f 72 69 6e 67 20 74 65  e for storing te
20db0 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 73 22 29  mporary tables")
20dc0 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  ;.      pParse->
20dd0 72 63 20 3d 20 72 63 3b 0a 20 20 20 20 20 20 72  rc = rc;.      r
20de0 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20  eturn 1;.    }. 
20df0 20 20 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 42     db->aDb[1].pB
20e00 74 20 3d 20 70 42 74 3b 0a 20 20 20 20 61 73 73  t = pBt;.    ass
20e10 65 72 74 28 20 64 62 2d 3e 61 44 62 5b 31 5d 2e  ert( db->aDb[1].
20e20 70 53 63 68 65 6d 61 20 29 3b 0a 20 20 20 20 69  pSchema );.    i
20e30 66 28 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3d  f( SQLITE_NOMEM=
20e40 3d 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 74  =sqlite3BtreeSet
20e50 50 61 67 65 53 69 7a 65 28 70 42 74 2c 20 64 62  PageSize(pBt, db
20e60 2d 3e 6e 65 78 74 50 61 67 65 73 69 7a 65 2c 20  ->nextPagesize, 
20e70 2d 31 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20  -1, 0) ){.      
20e80 73 71 6c 69 74 65 33 4f 6f 6d 46 61 75 6c 74 28  sqlite3OomFault(
20e90 64 62 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  db);.      retur
20ea0 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  n 1;.    }.  }. 
20eb0 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
20ec0 0a 2a 2a 20 52 65 63 6f 72 64 20 74 68 65 20 66  .** Record the f
20ed0 61 63 74 20 74 68 61 74 20 74 68 65 20 73 63 68  act that the sch
20ee0 65 6d 61 20 63 6f 6f 6b 69 65 20 77 69 6c 6c 20  ema cookie will 
20ef0 6e 65 65 64 20 74 6f 20 62 65 20 76 65 72 69 66  need to be verif
20f00 69 65 64 0a 2a 2a 20 66 6f 72 20 64 61 74 61 62  ied.** for datab
20f10 61 73 65 20 69 44 62 2e 20 20 54 68 65 20 63 6f  ase iDb.  The co
20f20 64 65 20 74 6f 20 61 63 74 75 61 6c 6c 79 20 76  de to actually v
20f30 65 72 69 66 79 20 74 68 65 20 73 63 68 65 6d 61  erify the schema
20f40 20 63 6f 6f 6b 69 65 0a 2a 2a 20 77 69 6c 6c 20   cookie.** will 
20f50 6f 63 63 75 72 20 61 74 20 74 68 65 20 65 6e 64  occur at the end
20f60 20 6f 66 20 74 68 65 20 74 6f 70 2d 6c 65 76 65   of the top-leve
20f70 6c 20 56 44 42 45 20 61 6e 64 20 77 69 6c 6c 20  l VDBE and will 
20f80 62 65 20 67 65 6e 65 72 61 74 65 64 0a 2a 2a 20  be generated.** 
20f90 6c 61 74 65 72 2c 20 62 79 20 73 71 6c 69 74 65  later, by sqlite
20fa0 33 46 69 6e 69 73 68 43 6f 64 69 6e 67 28 29 2e  3FinishCoding().
20fb0 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
20fc0 43 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d 61  CodeVerifySchema
20fd0 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
20fe0 69 6e 74 20 69 44 62 29 7b 0a 20 20 50 61 72 73  int iDb){.  Pars
20ff0 65 20 2a 70 54 6f 70 6c 65 76 65 6c 20 3d 20 73  e *pToplevel = s
21000 71 6c 69 74 65 33 50 61 72 73 65 54 6f 70 6c 65  qlite3ParseTople
21010 76 65 6c 28 70 50 61 72 73 65 29 3b 0a 0a 20 20  vel(pParse);..  
21020 61 73 73 65 72 74 28 20 69 44 62 3e 3d 30 20 26  assert( iDb>=0 &
21030 26 20 69 44 62 3c 70 50 61 72 73 65 2d 3e 64 62  & iDb<pParse->db
21040 2d 3e 6e 44 62 20 29 3b 0a 20 20 61 73 73 65 72  ->nDb );.  asser
21050 74 28 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61  t( pParse->db->a
21060 44 62 5b 69 44 62 5d 2e 70 42 74 21 3d 30 20 7c  Db[iDb].pBt!=0 |
21070 7c 20 69 44 62 3d 3d 31 20 29 3b 0a 20 20 61 73  | iDb==1 );.  as
21080 73 65 72 74 28 20 69 44 62 3c 53 51 4c 49 54 45  sert( iDb<SQLITE
21090 5f 4d 41 58 5f 41 54 54 41 43 48 45 44 2b 32 20  _MAX_ATTACHED+2 
210a0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
210b0 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48  ite3SchemaMutexH
210c0 65 6c 64 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  eld(pParse->db, 
210d0 69 44 62 2c 20 30 29 20 29 3b 0a 20 20 69 66 28  iDb, 0) );.  if(
210e0 20 44 62 4d 61 73 6b 54 65 73 74 28 70 54 6f 70   DbMaskTest(pTop
210f0 6c 65 76 65 6c 2d 3e 63 6f 6f 6b 69 65 4d 61 73  level->cookieMas
21100 6b 2c 20 69 44 62 29 3d 3d 30 20 29 7b 0a 20 20  k, iDb)==0 ){.  
21110 20 20 44 62 4d 61 73 6b 53 65 74 28 70 54 6f 70    DbMaskSet(pTop
21120 6c 65 76 65 6c 2d 3e 63 6f 6f 6b 69 65 4d 61 73  level->cookieMas
21130 6b 2c 20 69 44 62 29 3b 0a 20 20 20 20 69 66 28  k, iDb);.    if(
21140 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26 26   !OMIT_TEMPDB &&
21150 20 69 44 62 3d 3d 31 20 29 7b 0a 20 20 20 20 20   iDb==1 ){.     
21160 20 73 71 6c 69 74 65 33 4f 70 65 6e 54 65 6d 70   sqlite3OpenTemp
21170 44 61 74 61 62 61 73 65 28 70 54 6f 70 6c 65 76  Database(pToplev
21180 65 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  el);.    }.  }.}
21190 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 61 72 67 75 6d  ../*.** If argum
211a0 65 6e 74 20 7a 44 62 20 69 73 20 4e 55 4c 4c 2c  ent zDb is NULL,
211b0 20 74 68 65 6e 20 63 61 6c 6c 20 73 71 6c 69 74   then call sqlit
211c0 65 33 43 6f 64 65 56 65 72 69 66 79 53 63 68 65  e3CodeVerifySche
211d0 6d 61 28 29 20 66 6f 72 20 65 61 63 68 20 0a 2a  ma() for each .*
211e0 2a 20 61 74 74 61 63 68 65 64 20 64 61 74 61 62  * attached datab
211f0 61 73 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ase. Otherwise, 
21200 69 6e 76 6f 6b 65 20 69 74 20 66 6f 72 20 74 68  invoke it for th
21210 65 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 64  e database named
21220 20 7a 44 62 20 6f 6e 6c 79 2e 0a 2a 2f 0a 76 6f   zDb only..*/.vo
21230 69 64 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65  id sqlite3CodeVe
21240 72 69 66 79 4e 61 6d 65 64 53 63 68 65 6d 61 28  rifyNamedSchema(
21250 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 63  Parse *pParse, c
21260 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 29 7b  onst char *zDb){
21270 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
21280 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69   pParse->db;.  i
21290 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  nt i;.  for(i=0;
212a0 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29   i<db->nDb; i++)
212b0 7b 0a 20 20 20 20 44 62 20 2a 70 44 62 20 3d 20  {.    Db *pDb = 
212c0 26 64 62 2d 3e 61 44 62 5b 69 5d 3b 0a 20 20 20  &db->aDb[i];.   
212d0 20 69 66 28 20 70 44 62 2d 3e 70 42 74 20 26 26   if( pDb->pBt &&
212e0 20 28 21 7a 44 62 20 7c 7c 20 30 3d 3d 73 71 6c   (!zDb || 0==sql
212f0 69 74 65 33 53 74 72 49 43 6d 70 28 7a 44 62 2c  ite3StrICmp(zDb,
21300 20 70 44 62 2d 3e 7a 44 62 53 4e 61 6d 65 29 29   pDb->zDbSName))
21310 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
21320 33 43 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d  3CodeVerifySchem
21330 61 28 70 50 61 72 73 65 2c 20 69 29 3b 0a 20 20  a(pParse, i);.  
21340 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
21350 20 47 65 6e 65 72 61 74 65 20 56 44 42 45 20 63   Generate VDBE c
21360 6f 64 65 20 74 68 61 74 20 70 72 65 70 61 72 65  ode that prepare
21370 73 20 66 6f 72 20 64 6f 69 6e 67 20 61 6e 20 6f  s for doing an o
21380 70 65 72 61 74 69 6f 6e 20 74 68 61 74 0a 2a 2a  peration that.**
21390 20 6d 69 67 68 74 20 63 68 61 6e 67 65 20 74 68   might change th
213a0 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a  e database..**.*
213b0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73  * This routine s
213c0 74 61 72 74 73 20 61 20 6e 65 77 20 74 72 61 6e  tarts a new tran
213d0 73 61 63 74 69 6f 6e 20 69 66 20 77 65 20 61 72  saction if we ar
213e0 65 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 77 69  e not already wi
213f0 74 68 69 6e 0a 2a 2a 20 61 20 74 72 61 6e 73 61  thin.** a transa
21400 63 74 69 6f 6e 2e 20 20 49 66 20 77 65 20 61 72  ction.  If we ar
21410 65 20 61 6c 72 65 61 64 79 20 77 69 74 68 69 6e  e already within
21420 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20   a transaction, 
21430 74 68 65 6e 20 61 20 63 68 65 63 6b 70 6f 69 6e  then a checkpoin
21440 74 0a 2a 2a 20 69 73 20 73 65 74 20 69 66 20 74  t.** is set if t
21450 68 65 20 73 65 74 53 74 61 74 65 6d 65 6e 74 20  he setStatement 
21460 70 61 72 61 6d 65 74 65 72 20 69 73 20 74 72 75  parameter is tru
21470 65 2e 20 20 41 20 63 68 65 63 6b 70 6f 69 6e 74  e.  A checkpoint
21480 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 73 65   should.** be se
21490 74 20 66 6f 72 20 6f 70 65 72 61 74 69 6f 6e 73  t for operations
214a0 20 74 68 61 74 20 6d 69 67 68 74 20 66 61 69 6c   that might fail
214b0 20 28 64 75 65 20 74 6f 20 61 20 63 6f 6e 73 74   (due to a const
214c0 72 61 69 6e 74 29 20 70 61 72 74 20 6f 66 0a 2a  raint) part of.*
214d0 2a 20 74 68 65 20 77 61 79 20 74 68 72 6f 75 67  * the way throug
214e0 68 20 61 6e 64 20 77 68 69 63 68 20 77 69 6c 6c  h and which will
214f0 20 6e 65 65 64 20 74 6f 20 75 6e 64 6f 20 73 6f   need to undo so
21500 6d 65 20 77 72 69 74 65 73 20 77 69 74 68 6f 75  me writes withou
21510 74 20 68 61 76 69 6e 67 20 74 6f 0a 2a 2a 20 72  t having to.** r
21520 6f 6c 6c 62 61 63 6b 20 74 68 65 20 77 68 6f 6c  ollback the whol
21530 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20  e transaction.  
21540 46 6f 72 20 6f 70 65 72 61 74 69 6f 6e 73 20 77  For operations w
21550 68 65 72 65 20 61 6c 6c 20 63 6f 6e 73 74 72 61  here all constra
21560 69 6e 74 73 0a 2a 2a 20 63 61 6e 20 62 65 20 63  ints.** can be c
21570 68 65 63 6b 65 64 20 62 65 66 6f 72 65 20 61 6e  hecked before an
21580 79 20 63 68 61 6e 67 65 73 20 61 72 65 20 6d 61  y changes are ma
21590 64 65 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  de to the databa
215a0 73 65 2c 20 69 74 20 69 73 20 6e 65 76 65 72 0a  se, it is never.
215b0 2a 2a 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20  ** necessary to 
215c0 75 6e 64 6f 20 61 20 77 72 69 74 65 20 61 6e 64  undo a write and
215d0 20 74 68 65 20 63 68 65 63 6b 70 6f 69 6e 74 20   the checkpoint 
215e0 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20 73 65  should not be se
215f0 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  t..*/.void sqlit
21600 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72  e3BeginWriteOper
21610 61 74 69 6f 6e 28 50 61 72 73 65 20 2a 70 50 61  ation(Parse *pPa
21620 72 73 65 2c 20 69 6e 74 20 73 65 74 53 74 61 74  rse, int setStat
21630 65 6d 65 6e 74 2c 20 69 6e 74 20 69 44 62 29 7b  ement, int iDb){
21640 0a 20 20 50 61 72 73 65 20 2a 70 54 6f 70 6c 65  .  Parse *pTople
21650 76 65 6c 20 3d 20 73 71 6c 69 74 65 33 50 61 72  vel = sqlite3Par
21660 73 65 54 6f 70 6c 65 76 65 6c 28 70 50 61 72 73  seToplevel(pPars
21670 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 43 6f 64  e);.  sqlite3Cod
21680 65 56 65 72 69 66 79 53 63 68 65 6d 61 28 70 50  eVerifySchema(pP
21690 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 44 62  arse, iDb);.  Db
216a0 4d 61 73 6b 53 65 74 28 70 54 6f 70 6c 65 76 65  MaskSet(pTopleve
216b0 6c 2d 3e 77 72 69 74 65 4d 61 73 6b 2c 20 69 44  l->writeMask, iD
216c0 62 29 3b 0a 20 20 70 54 6f 70 6c 65 76 65 6c 2d  b);.  pToplevel-
216d0 3e 69 73 4d 75 6c 74 69 57 72 69 74 65 20 7c 3d  >isMultiWrite |=
216e0 20 73 65 74 53 74 61 74 65 6d 65 6e 74 3b 0a 7d   setStatement;.}
216f0 0a 0a 2f 2a 0a 2a 2a 20 49 6e 64 69 63 61 74 65  ../*.** Indicate
21700 20 74 68 61 74 20 74 68 65 20 73 74 61 74 65 6d   that the statem
21710 65 6e 74 20 63 75 72 72 65 6e 74 6c 79 20 75 6e  ent currently un
21720 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e  der construction
21730 20 6d 69 67 68 74 20 77 72 69 74 65 0a 2a 2a 20   might write.** 
21740 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 65 6e  more than one en
21750 74 72 79 20 28 65 78 61 6d 70 6c 65 3a 20 64 65  try (example: de
21760 6c 65 74 69 6e 67 20 6f 6e 65 20 72 6f 77 20 74  leting one row t
21770 68 65 6e 20 69 6e 73 65 72 74 69 6e 67 20 61 6e  hen inserting an
21780 6f 74 68 65 72 2c 0a 2a 2a 20 69 6e 73 65 72 74  other,.** insert
21790 69 6e 67 20 6d 75 6c 74 69 70 6c 65 20 72 6f 77  ing multiple row
217a0 73 20 69 6e 20 61 20 74 61 62 6c 65 2c 20 6f 72  s in a table, or
217b0 20 69 6e 73 65 72 74 69 6e 67 20 61 20 72 6f 77   inserting a row
217c0 20 61 6e 64 20 69 6e 64 65 78 20 65 6e 74 72 69   and index entri
217d0 65 73 2e 29 0a 2a 2a 20 49 66 20 61 6e 20 61 62  es.).** If an ab
217e0 6f 72 74 20 6f 63 63 75 72 73 20 61 66 74 65 72  ort occurs after
217f0 20 73 6f 6d 65 20 6f 66 20 74 68 65 73 65 20 77   some of these w
21800 72 69 74 65 73 20 68 61 76 65 20 63 6f 6d 70 6c  rites have compl
21810 65 74 65 64 2c 20 74 68 65 6e 20 69 74 20 77 69  eted, then it wi
21820 6c 6c 0a 2a 2a 20 62 65 20 6e 65 63 65 73 73 61  ll.** be necessa
21830 72 79 20 74 6f 20 75 6e 64 6f 20 74 68 65 20 63  ry to undo the c
21840 6f 6d 70 6c 65 74 65 64 20 77 72 69 74 65 73 2e  ompleted writes.
21850 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
21860 4d 75 6c 74 69 57 72 69 74 65 28 50 61 72 73 65  MultiWrite(Parse
21870 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 50 61 72   *pParse){.  Par
21880 73 65 20 2a 70 54 6f 70 6c 65 76 65 6c 20 3d 20  se *pToplevel = 
21890 73 71 6c 69 74 65 33 50 61 72 73 65 54 6f 70 6c  sqlite3ParseTopl
218a0 65 76 65 6c 28 70 50 61 72 73 65 29 3b 0a 20 20  evel(pParse);.  
218b0 70 54 6f 70 6c 65 76 65 6c 2d 3e 69 73 4d 75 6c  pToplevel->isMul
218c0 74 69 57 72 69 74 65 20 3d 20 31 3b 0a 7d 0a 0a  tiWrite = 1;.}..
218d0 2f 2a 20 0a 2a 2a 20 54 68 65 20 63 6f 64 65 20  /* .** The code 
218e0 67 65 6e 65 72 61 74 6f 72 20 63 61 6c 6c 73 20  generator calls 
218f0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 66 20  this routine if 
21900 69 73 20 64 69 73 63 6f 76 65 72 73 20 74 68 61  is discovers tha
21910 74 20 69 74 20 69 73 0a 2a 2a 20 70 6f 73 73 69  t it is.** possi
21920 62 6c 65 20 74 6f 20 61 62 6f 72 74 20 61 20 73  ble to abort a s
21930 74 61 74 65 6d 65 6e 74 20 70 72 69 6f 72 20 74  tatement prior t
21940 6f 20 63 6f 6d 70 6c 65 74 69 6f 6e 2e 20 20 49  o completion.  I
21950 6e 20 6f 72 64 65 72 20 74 6f 20 0a 2a 2a 20 70  n order to .** p
21960 65 72 66 6f 72 6d 20 74 68 69 73 20 61 62 6f 72  erform this abor
21970 74 20 77 69 74 68 6f 75 74 20 63 6f 72 72 75 70  t without corrup
21980 74 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73  ting the databas
21990 65 2c 20 77 65 20 6e 65 65 64 20 74 6f 20 6d 61  e, we need to ma
219a0 6b 65 0a 2a 2a 20 73 75 72 65 20 74 68 61 74 20  ke.** sure that 
219b0 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 69 73  the statement is
219c0 20 70 72 6f 74 65 63 74 65 64 20 62 79 20 61 20   protected by a 
219d0 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61  statement transa
219e0 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 65 63  ction..**.** Tec
219f0 68 6e 69 63 61 6c 6c 79 2c 20 77 65 20 6f 6e 6c  hnically, we onl
21a00 79 20 6e 65 65 64 20 74 6f 20 73 65 74 20 74 68  y need to set th
21a10 65 20 6d 61 79 41 62 6f 72 74 20 66 6c 61 67 20  e mayAbort flag 
21a20 69 66 20 74 68 65 0a 2a 2a 20 69 73 4d 75 6c 74  if the.** isMult
21a30 69 57 72 69 74 65 20 66 6c 61 67 20 77 61 73 20  iWrite flag was 
21a40 70 72 65 76 69 6f 75 73 6c 79 20 73 65 74 2e 20  previously set. 
21a50 20 54 68 65 72 65 20 69 73 20 61 20 74 69 6d 65   There is a time
21a60 20 64 65 70 65 6e 64 65 6e 63 79 0a 2a 2a 20 73   dependency.** s
21a70 75 63 68 20 74 68 61 74 20 74 68 65 20 61 62 6f  uch that the abo
21a80 72 74 20 6d 75 73 74 20 6f 63 63 75 72 20 61 66  rt must occur af
21a90 74 65 72 20 74 68 65 20 6d 75 6c 74 69 77 72 69  ter the multiwri
21aa0 74 65 2e 20 20 54 68 69 73 20 6d 61 6b 65 73 0a  te.  This makes.
21ab0 2a 2a 20 73 6f 6d 65 20 73 74 61 74 65 6d 65 6e  ** some statemen
21ac0 74 73 20 69 6e 76 6f 6c 76 69 6e 67 20 74 68 65  ts involving the
21ad0 20 52 45 50 4c 41 43 45 20 63 6f 6e 66 6c 69 63   REPLACE conflic
21ae0 74 20 72 65 73 6f 6c 75 74 69 6f 6e 20 61 6c 67  t resolution alg
21af0 6f 72 69 74 68 6d 0a 2a 2a 20 67 6f 20 61 20 6c  orithm.** go a l
21b00 69 74 74 6c 65 20 66 61 73 74 65 72 2e 20 20 42  ittle faster.  B
21b10 75 74 20 74 61 6b 69 6e 67 20 61 64 76 61 6e 74  ut taking advant
21b20 61 67 65 20 6f 66 20 74 68 69 73 20 74 69 6d 65  age of this time
21b30 20 64 65 70 65 6e 64 65 6e 63 79 0a 2a 2a 20 6d   dependency.** m
21b40 61 6b 65 73 20 69 74 20 6d 6f 72 65 20 64 69 66  akes it more dif
21b50 66 69 63 75 6c 74 20 74 6f 20 70 72 6f 76 65 20  ficult to prove 
21b60 74 68 61 74 20 74 68 65 20 63 6f 64 65 20 69 73  that the code is
21b70 20 63 6f 72 72 65 63 74 20 28 69 6e 20 0a 2a 2a   correct (in .**
21b80 20 70 61 72 74 69 63 75 6c 61 72 2c 20 69 74 20   particular, it 
21b90 70 72 65 76 65 6e 74 73 20 75 73 20 66 72 6f 6d  prevents us from
21ba0 20 77 72 69 74 69 6e 67 20 61 6e 20 65 66 66 65   writing an effe
21bb0 63 74 69 76 65 0a 2a 2a 20 69 6d 70 6c 65 6d 65  ctive.** impleme
21bc0 6e 74 61 74 69 6f 6e 20 6f 66 20 73 71 6c 69 74  ntation of sqlit
21bd0 65 33 41 73 73 65 72 74 4d 61 79 41 62 6f 72 74  e3AssertMayAbort
21be0 28 29 29 20 61 6e 64 20 73 6f 20 77 65 20 68 61  ()) and so we ha
21bf0 76 65 20 63 68 6f 73 65 6e 0a 2a 2a 20 74 6f 20  ve chosen.** to 
21c00 74 61 6b 65 20 74 68 65 20 73 61 66 65 20 72 6f  take the safe ro
21c10 75 74 65 20 61 6e 64 20 73 6b 69 70 20 74 68 65  ute and skip the
21c20 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 0a 2a   optimization..*
21c30 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 4d 61  /.void sqlite3Ma
21c40 79 41 62 6f 72 74 28 50 61 72 73 65 20 2a 70 50  yAbort(Parse *pP
21c50 61 72 73 65 29 7b 0a 20 20 50 61 72 73 65 20 2a  arse){.  Parse *
21c60 70 54 6f 70 6c 65 76 65 6c 20 3d 20 73 71 6c 69  pToplevel = sqli
21c70 74 65 33 50 61 72 73 65 54 6f 70 6c 65 76 65 6c  te3ParseToplevel
21c80 28 70 50 61 72 73 65 29 3b 0a 20 20 70 54 6f 70  (pParse);.  pTop
21c90 6c 65 76 65 6c 2d 3e 6d 61 79 41 62 6f 72 74 20  level->mayAbort 
21ca0 3d 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  = 1;.}../*.** Co
21cb0 64 65 20 61 6e 20 4f 50 5f 48 61 6c 74 20 74 68  de an OP_Halt th
21cc0 61 74 20 63 61 75 73 65 73 20 74 68 65 20 76 64  at causes the vd
21cd0 62 65 20 74 6f 20 72 65 74 75 72 6e 20 61 6e 20  be to return an 
21ce0 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
21cf0 54 0a 2a 2a 20 65 72 72 6f 72 2e 20 54 68 65 20  T.** error. The 
21d00 6f 6e 45 72 72 6f 72 20 70 61 72 61 6d 65 74 65  onError paramete
21d10 72 20 64 65 74 65 72 6d 69 6e 65 73 20 77 68 69  r determines whi
21d20 63 68 20 28 69 66 20 61 6e 79 29 20 6f 66 20 74  ch (if any) of t
21d30 68 65 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20  he statement.** 
21d40 61 6e 64 2f 6f 72 20 63 75 72 72 65 6e 74 20 74  and/or current t
21d50 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f  ransaction is ro
21d60 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2f 0a 76 6f  lled back..*/.vo
21d70 69 64 20 73 71 6c 69 74 65 33 48 61 6c 74 43 6f  id sqlite3HaltCo
21d80 6e 73 74 72 61 69 6e 74 28 0a 20 20 50 61 72 73  nstraint(.  Pars
21d90 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a  e *pParse,    /*
21da0 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
21db0 20 2a 2f 0a 20 20 69 6e 74 20 65 72 72 43 6f 64   */.  int errCod
21dc0 65 2c 20 20 20 20 20 20 2f 2a 20 65 78 74 65 6e  e,      /* exten
21dd0 64 65 64 20 65 72 72 6f 72 20 63 6f 64 65 20 2a  ded error code *
21de0 2f 0a 20 20 69 6e 74 20 6f 6e 45 72 72 6f 72 2c  /.  int onError,
21df0 20 20 20 20 20 20 2f 2a 20 43 6f 6e 73 74 72 61        /* Constra
21e00 69 6e 74 20 74 79 70 65 20 2a 2f 0a 20 20 63 68  int type */.  ch
21e10 61 72 20 2a 70 34 2c 20 20 20 20 20 20 20 20 20  ar *p4,         
21e20 2f 2a 20 45 72 72 6f 72 20 6d 65 73 73 61 67 65  /* Error message
21e30 20 2a 2f 0a 20 20 69 38 20 70 34 74 79 70 65 2c   */.  i8 p4type,
21e40 20 20 20 20 20 20 20 20 2f 2a 20 50 34 5f 53 54          /* P4_ST
21e50 41 54 49 43 20 6f 72 20 50 34 5f 54 52 41 4e 53  ATIC or P4_TRANS
21e60 49 45 4e 54 20 2a 2f 0a 20 20 75 38 20 70 35 45  IENT */.  u8 p5E
21e70 72 72 6d 73 67 20 20 20 20 20 20 20 2f 2a 20 50  rrmsg       /* P
21e80 35 5f 45 72 72 4d 73 67 20 74 79 70 65 20 2a 2f  5_ErrMsg type */
21e90 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  .){.  Vdbe *v = 
21ea0 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
21eb0 50 61 72 73 65 29 3b 0a 20 20 61 73 73 65 72 74  Parse);.  assert
21ec0 28 20 28 65 72 72 43 6f 64 65 26 30 78 66 66 29  ( (errCode&0xff)
21ed0 3d 3d 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41  ==SQLITE_CONSTRA
21ee0 49 4e 54 20 29 3b 0a 20 20 69 66 28 20 6f 6e 45  INT );.  if( onE
21ef0 72 72 6f 72 3d 3d 4f 45 5f 41 62 6f 72 74 20 29  rror==OE_Abort )
21f00 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4d 61 79  {.    sqlite3May
21f10 41 62 6f 72 74 28 70 50 61 72 73 65 29 3b 0a 20  Abort(pParse);. 
21f20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65   }.  sqlite3Vdbe
21f30 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 48 61 6c  AddOp4(v, OP_Hal
21f40 74 2c 20 65 72 72 43 6f 64 65 2c 20 6f 6e 45 72  t, errCode, onEr
21f50 72 6f 72 2c 20 30 2c 20 70 34 2c 20 70 34 74 79  ror, 0, p4, p4ty
21f60 70 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  pe);.  sqlite3Vd
21f70 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 70 35  beChangeP5(v, p5
21f80 45 72 72 6d 73 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  Errmsg);.}../*.*
21f90 2a 20 43 6f 64 65 20 61 6e 20 4f 50 5f 48 61 6c  * Code an OP_Hal
21fa0 74 20 64 75 65 20 74 6f 20 55 4e 49 51 55 45 20  t due to UNIQUE 
21fb0 6f 72 20 50 52 49 4d 41 52 59 20 4b 45 59 20 63  or PRIMARY KEY c
21fc0 6f 6e 73 74 72 61 69 6e 74 20 76 69 6f 6c 61 74  onstraint violat
21fd0 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ion..*/.void sql
21fe0 69 74 65 33 55 6e 69 71 75 65 43 6f 6e 73 74 72  ite3UniqueConstr
21ff0 61 69 6e 74 28 0a 20 20 50 61 72 73 65 20 2a 70  aint(.  Parse *p
22000 50 61 72 73 65 2c 20 20 20 20 2f 2a 20 50 61 72  Parse,    /* Par
22010 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
22020 20 20 69 6e 74 20 6f 6e 45 72 72 6f 72 2c 20 20    int onError,  
22030 20 20 20 20 2f 2a 20 43 6f 6e 73 74 72 61 69 6e      /* Constrain
22040 74 20 74 79 70 65 20 2a 2f 0a 20 20 49 6e 64 65  t type */.  Inde
22050 78 20 2a 70 49 64 78 20 20 20 20 20 20 20 2f 2a  x *pIdx       /*
22060 20 54 68 65 20 69 6e 64 65 78 20 74 68 61 74 20   The index that 
22070 74 72 69 67 67 65 72 73 20 74 68 65 20 63 6f 6e  triggers the con
22080 73 74 72 61 69 6e 74 20 2a 2f 0a 29 7b 0a 20 20  straint */.){.  
22090 63 68 61 72 20 2a 7a 45 72 72 3b 0a 20 20 69 6e  char *zErr;.  in
220a0 74 20 6a 3b 0a 20 20 53 74 72 41 63 63 75 6d 20  t j;.  StrAccum 
220b0 65 72 72 4d 73 67 3b 0a 20 20 54 61 62 6c 65 20  errMsg;.  Table 
220c0 2a 70 54 61 62 20 3d 20 70 49 64 78 2d 3e 70 54  *pTab = pIdx->pT
220d0 61 62 6c 65 3b 0a 0a 20 20 73 71 6c 69 74 65 33  able;..  sqlite3
220e0 53 74 72 41 63 63 75 6d 49 6e 69 74 28 26 65 72  StrAccumInit(&er
220f0 72 4d 73 67 2c 20 70 50 61 72 73 65 2d 3e 64 62  rMsg, pParse->db
22100 2c 20 30 2c 20 30 2c 20 32 30 30 29 3b 0a 20 20  , 0, 0, 200);.  
22110 69 66 28 20 70 49 64 78 2d 3e 61 43 6f 6c 45 78  if( pIdx->aColEx
22120 70 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  pr ){.    sqlite
22130 33 58 50 72 69 6e 74 66 28 26 65 72 72 4d 73 67  3XPrintf(&errMsg
22140 2c 20 22 69 6e 64 65 78 20 27 25 71 27 22 2c 20  , "index '%q'", 
22150 70 49 64 78 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pIdx->zName);.  
22160 7d 65 6c 73 65 7b 0a 20 20 20 20 66 6f 72 28 6a  }else{.    for(j
22170 3d 30 3b 20 6a 3c 70 49 64 78 2d 3e 6e 4b 65 79  =0; j<pIdx->nKey
22180 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  Col; j++){.     
22190 20 63 68 61 72 20 2a 7a 43 6f 6c 3b 0a 20 20 20   char *zCol;.   
221a0 20 20 20 61 73 73 65 72 74 28 20 70 49 64 78 2d     assert( pIdx-
221b0 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 3e 3d 30 20  >aiColumn[j]>=0 
221c0 29 3b 0a 20 20 20 20 20 20 7a 43 6f 6c 20 3d 20  );.      zCol = 
221d0 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 49 64 78 2d  pTab->aCol[pIdx-
221e0 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 5d 2e 7a 4e  >aiColumn[j]].zN
221f0 61 6d 65 3b 0a 20 20 20 20 20 20 69 66 28 20 6a  ame;.      if( j
22200 20 29 20 73 71 6c 69 74 65 33 53 74 72 41 63 63   ) sqlite3StrAcc
22210 75 6d 41 70 70 65 6e 64 28 26 65 72 72 4d 73 67  umAppend(&errMsg
22220 2c 20 22 2c 20 22 2c 20 32 29 3b 0a 20 20 20 20  , ", ", 2);.    
22230 20 20 73 71 6c 69 74 65 33 58 50 72 69 6e 74 66    sqlite3XPrintf
22240 28 26 65 72 72 4d 73 67 2c 20 22 25 73 2e 25 73  (&errMsg, "%s.%s
22250 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20  ", pTab->zName, 
22260 7a 43 6f 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  zCol);.    }.  }
22270 0a 20 20 7a 45 72 72 20 3d 20 73 71 6c 69 74 65  .  zErr = sqlite
22280 33 53 74 72 41 63 63 75 6d 46 69 6e 69 73 68 28  3StrAccumFinish(
22290 26 65 72 72 4d 73 67 29 3b 0a 20 20 73 71 6c 69  &errMsg);.  sqli
222a0 74 65 33 48 61 6c 74 43 6f 6e 73 74 72 61 69 6e  te3HaltConstrain
222b0 74 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 49  t(pParse, .    I
222c0 73 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65 78  sPrimaryKeyIndex
222d0 28 70 49 64 78 29 20 3f 20 53 51 4c 49 54 45 5f  (pIdx) ? SQLITE_
222e0 43 4f 4e 53 54 52 41 49 4e 54 5f 50 52 49 4d 41  CONSTRAINT_PRIMA
222f0 52 59 4b 45 59 20 0a 20 20 20 20 20 20 20 20 20  RYKEY .         
22300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22310 20 20 20 3a 20 53 51 4c 49 54 45 5f 43 4f 4e 53     : SQLITE_CONS
22320 54 52 41 49 4e 54 5f 55 4e 49 51 55 45 2c 0a 20  TRAINT_UNIQUE,. 
22330 20 20 20 6f 6e 45 72 72 6f 72 2c 20 7a 45 72 72     onError, zErr
22340 2c 20 50 34 5f 44 59 4e 41 4d 49 43 2c 20 50 35  , P4_DYNAMIC, P5
22350 5f 43 6f 6e 73 74 72 61 69 6e 74 55 6e 69 71 75  _ConstraintUniqu
22360 65 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f  e);.}.../*.** Co
22370 64 65 20 61 6e 20 4f 50 5f 48 61 6c 74 20 64 75  de an OP_Halt du
22380 65 20 74 6f 20 6e 6f 6e 2d 75 6e 69 71 75 65 20  e to non-unique 
22390 72 6f 77 69 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73  rowid..*/.void s
223a0 71 6c 69 74 65 33 52 6f 77 69 64 43 6f 6e 73 74  qlite3RowidConst
223b0 72 61 69 6e 74 28 0a 20 20 50 61 72 73 65 20 2a  raint(.  Parse *
223c0 70 50 61 72 73 65 2c 20 20 20 20 2f 2a 20 50 61  pParse,    /* Pa
223d0 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
223e0 0a 20 20 69 6e 74 20 6f 6e 45 72 72 6f 72 2c 20  .  int onError, 
223f0 20 20 20 20 20 2f 2a 20 43 6f 6e 66 6c 69 63 74       /* Conflict
22400 20 72 65 73 6f 6c 75 74 69 6f 6e 20 61 6c 67 6f   resolution algo
22410 72 69 74 68 6d 20 2a 2f 0a 20 20 54 61 62 6c 65  rithm */.  Table
22420 20 2a 70 54 61 62 20 20 20 20 20 20 20 2f 2a 20   *pTab       /* 
22430 54 68 65 20 74 61 62 6c 65 20 77 69 74 68 20 74  The table with t
22440 68 65 20 6e 6f 6e 2d 75 6e 69 71 75 65 20 72 6f  he non-unique ro
22450 77 69 64 20 2a 2f 20 0a 29 7b 0a 20 20 63 68 61  wid */ .){.  cha
22460 72 20 2a 7a 4d 73 67 3b 0a 20 20 69 6e 74 20 72  r *zMsg;.  int r
22470 63 3b 0a 20 20 69 66 28 20 70 54 61 62 2d 3e 69  c;.  if( pTab->i
22480 50 4b 65 79 3e 3d 30 20 29 7b 0a 20 20 20 20 7a  PKey>=0 ){.    z
22490 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 50 72  Msg = sqlite3MPr
224a0 69 6e 74 66 28 70 50 61 72 73 65 2d 3e 64 62 2c  intf(pParse->db,
224b0 20 22 25 73 2e 25 73 22 2c 20 70 54 61 62 2d 3e   "%s.%s", pTab->
224c0 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20  zName,.         
224d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
224e0 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 54 61 62   pTab->aCol[pTab
224f0 2d 3e 69 50 4b 65 79 5d 2e 7a 4e 61 6d 65 29 3b  ->iPKey].zName);
22500 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
22510 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 50 52 49 4d  _CONSTRAINT_PRIM
22520 41 52 59 4b 45 59 3b 0a 20 20 7d 65 6c 73 65 7b  ARYKEY;.  }else{
22530 0a 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69  .    zMsg = sqli
22540 74 65 33 4d 50 72 69 6e 74 66 28 70 50 61 72 73  te3MPrintf(pPars
22550 65 2d 3e 64 62 2c 20 22 25 73 2e 72 6f 77 69 64  e->db, "%s.rowid
22560 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b  ", pTab->zName);
22570 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
22580 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 52 4f 57 49  _CONSTRAINT_ROWI
22590 44 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  D;.  }.  sqlite3
225a0 48 61 6c 74 43 6f 6e 73 74 72 61 69 6e 74 28 70  HaltConstraint(p
225b0 50 61 72 73 65 2c 20 72 63 2c 20 6f 6e 45 72 72  Parse, rc, onErr
225c0 6f 72 2c 20 7a 4d 73 67 2c 20 50 34 5f 44 59 4e  or, zMsg, P4_DYN
225d0 41 4d 49 43 2c 0a 20 20 20 20 20 20 20 20 20 20  AMIC,.          
225e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 50 35                P5
225f0 5f 43 6f 6e 73 74 72 61 69 6e 74 55 6e 69 71 75  _ConstraintUniqu
22600 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65  e);.}../*.** Che
22610 63 6b 20 74 6f 20 73 65 65 20 69 66 20 70 49 6e  ck to see if pIn
22620 64 65 78 20 75 73 65 73 20 74 68 65 20 63 6f 6c  dex uses the col
22630 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20  lating sequence 
22640 70 43 6f 6c 6c 2e 20 20 52 65 74 75 72 6e 0a 2a  pColl.  Return.*
22650 2a 20 74 72 75 65 20 69 66 20 69 74 20 64 6f 65  * true if it doe
22660 73 20 61 6e 64 20 66 61 6c 73 65 20 69 66 20 69  s and false if i
22670 74 20 64 6f 65 73 20 6e 6f 74 2e 0a 2a 2f 0a 23  t does not..*/.#
22680 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
22690 49 54 5f 52 45 49 4e 44 45 58 0a 73 74 61 74 69  IT_REINDEX.stati
226a0 63 20 69 6e 74 20 63 6f 6c 6c 61 74 69 6f 6e 4d  c int collationM
226b0 61 74 63 68 28 63 6f 6e 73 74 20 63 68 61 72 20  atch(const char 
226c0 2a 7a 43 6f 6c 6c 2c 20 49 6e 64 65 78 20 2a 70  *zColl, Index *p
226d0 49 6e 64 65 78 29 7b 0a 20 20 69 6e 74 20 69 3b  Index){.  int i;
226e0 0a 20 20 61 73 73 65 72 74 28 20 7a 43 6f 6c 6c  .  assert( zColl
226f0 21 3d 30 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30  !=0 );.  for(i=0
22700 3b 20 69 3c 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c  ; i<pIndex->nCol
22710 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63  umn; i++){.    c
22720 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 70  onst char *z = p
22730 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d  Index->azColl[i]
22740 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 7a 21  ;.    assert( z!
22750 3d 30 20 7c 7c 20 70 49 6e 64 65 78 2d 3e 61 69  =0 || pIndex->ai
22760 43 6f 6c 75 6d 6e 5b 69 5d 3c 30 20 29 3b 0a 20  Column[i]<0 );. 
22770 20 20 20 69 66 28 20 70 49 6e 64 65 78 2d 3e 61     if( pIndex->a
22780 69 43 6f 6c 75 6d 6e 5b 69 5d 3e 3d 30 20 26 26  iColumn[i]>=0 &&
22790 20 30 3d 3d 73 71 6c 69 74 65 33 53 74 72 49 43   0==sqlite3StrIC
227a0 6d 70 28 7a 2c 20 7a 43 6f 6c 6c 29 20 29 7b 0a  mp(z, zColl) ){.
227b0 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
227c0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
227d0 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  rn 0;.}.#endif..
227e0 2f 2a 0a 2a 2a 20 52 65 63 6f 6d 70 75 74 65 20  /*.** Recompute 
227f0 61 6c 6c 20 69 6e 64 69 63 65 73 20 6f 66 20 70  all indices of p
22800 54 61 62 20 74 68 61 74 20 75 73 65 20 74 68 65  Tab that use the
22810 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
22820 6e 63 65 20 70 43 6f 6c 6c 2e 0a 2a 2a 20 49 66  nce pColl..** If
22830 20 70 43 6f 6c 6c 3d 3d 30 20 74 68 65 6e 20 72   pColl==0 then r
22840 65 63 6f 6d 70 75 74 65 20 61 6c 6c 20 69 6e 64  ecompute all ind
22850 69 63 65 73 20 6f 66 20 70 54 61 62 2e 0a 2a 2f  ices of pTab..*/
22860 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
22870 4f 4d 49 54 5f 52 45 49 4e 44 45 58 0a 73 74 61  OMIT_REINDEX.sta
22880 74 69 63 20 76 6f 69 64 20 72 65 69 6e 64 65 78  tic void reindex
22890 54 61 62 6c 65 28 50 61 72 73 65 20 2a 70 50 61  Table(Parse *pPa
228a0 72 73 65 2c 20 54 61 62 6c 65 20 2a 70 54 61 62  rse, Table *pTab
228b0 2c 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 43  , char const *zC
228c0 6f 6c 6c 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70  oll){.  Index *p
228d0 49 6e 64 65 78 3b 20 20 20 20 20 20 20 20 20 20  Index;          
228e0 20 20 20 20 2f 2a 20 41 6e 20 69 6e 64 65 78 20      /* An index 
228f0 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
22900 70 54 61 62 20 2a 2f 0a 0a 20 20 66 6f 72 28 70  pTab */..  for(p
22910 49 6e 64 65 78 3d 70 54 61 62 2d 3e 70 49 6e 64  Index=pTab->pInd
22920 65 78 3b 20 70 49 6e 64 65 78 3b 20 70 49 6e 64  ex; pIndex; pInd
22930 65 78 3d 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74  ex=pIndex->pNext
22940 29 7b 0a 20 20 20 20 69 66 28 20 7a 43 6f 6c 6c  ){.    if( zColl
22950 3d 3d 30 20 7c 7c 20 63 6f 6c 6c 61 74 69 6f 6e  ==0 || collation
22960 4d 61 74 63 68 28 7a 43 6f 6c 6c 2c 20 70 49 6e  Match(zColl, pIn
22970 64 65 78 29 20 29 7b 0a 20 20 20 20 20 20 69 6e  dex) ){.      in
22980 74 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53  t iDb = sqlite3S
22990 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 70 50 61  chemaToIndex(pPa
229a0 72 73 65 2d 3e 64 62 2c 20 70 54 61 62 2d 3e 70  rse->db, pTab->p
229b0 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 20 20 73  Schema);.      s
229c0 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74 65  qlite3BeginWrite
229d0 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65  Operation(pParse
229e0 2c 20 30 2c 20 69 44 62 29 3b 0a 20 20 20 20 20  , 0, iDb);.     
229f0 20 73 71 6c 69 74 65 33 52 65 66 69 6c 6c 49 6e   sqlite3RefillIn
22a00 64 65 78 28 70 50 61 72 73 65 2c 20 70 49 6e 64  dex(pParse, pInd
22a10 65 78 2c 20 2d 31 29 3b 0a 20 20 20 20 7d 0a 20  ex, -1);.    }. 
22a20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a   }.}.#endif../*.
22a30 2a 2a 20 52 65 63 6f 6d 70 75 74 65 20 61 6c 6c  ** Recompute all
22a40 20 69 6e 64 69 63 65 73 20 6f 66 20 61 6c 6c 20   indices of all 
22a50 74 61 62 6c 65 73 20 69 6e 20 61 6c 6c 20 64 61  tables in all da
22a60 74 61 62 61 73 65 73 20 77 68 65 72 65 20 74 68  tabases where th
22a70 65 0a 2a 2a 20 69 6e 64 69 63 65 73 20 75 73 65  e.** indices use
22a80 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73   the collating s
22a90 65 71 75 65 6e 63 65 20 70 43 6f 6c 6c 2e 20 20  equence pColl.  
22aa0 49 66 20 70 43 6f 6c 6c 3d 3d 30 20 74 68 65 6e  If pColl==0 then
22ab0 20 72 65 63 6f 6d 70 75 74 65 0a 2a 2a 20 61 6c   recompute.** al
22ac0 6c 20 69 6e 64 69 63 65 73 20 65 76 65 72 79 77  l indices everyw
22ad0 68 65 72 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  here..*/.#ifndef
22ae0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 52 45 49   SQLITE_OMIT_REI
22af0 4e 44 45 58 0a 73 74 61 74 69 63 20 76 6f 69 64  NDEX.static void
22b00 20 72 65 69 6e 64 65 78 44 61 74 61 62 61 73 65   reindexDatabase
22b10 73 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  s(Parse *pParse,
22b20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 43 6f   char const *zCo
22b30 6c 6c 29 7b 0a 20 20 44 62 20 2a 70 44 62 3b 20  ll){.  Db *pDb; 
22b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22b50 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20 64     /* A single d
22b60 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 69 6e 74  atabase */.  int
22b70 20 69 44 62 3b 20 20 20 20 20 20 20 20 20 20 20   iDb;           
22b80 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
22b90 64 61 74 61 62 61 73 65 20 69 6e 64 65 78 20 6e  database index n
22ba0 75 6d 62 65 72 20 2a 2f 0a 20 20 73 71 6c 69 74  umber */.  sqlit
22bb0 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
22bc0 3e 64 62 3b 20 20 20 2f 2a 20 54 68 65 20 64 61  >db;   /* The da
22bd0 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
22be0 6e 20 2a 2f 0a 20 20 48 61 73 68 45 6c 65 6d 20  n */.  HashElem 
22bf0 2a 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  *k;             
22c00 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e     /* For loopin
22c10 67 20 6f 76 65 72 20 74 61 62 6c 65 73 20 69 6e  g over tables in
22c20 20 70 44 62 20 2a 2f 0a 20 20 54 61 62 6c 65 20   pDb */.  Table 
22c30 2a 70 54 61 62 3b 20 20 20 20 20 20 20 20 20 20  *pTab;          
22c40 20 20 20 20 20 20 2f 2a 20 41 20 74 61 62 6c 65        /* A table
22c50 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
22c60 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73   */..  assert( s
22c70 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73  qlite3BtreeHolds
22c80 41 6c 6c 4d 75 74 65 78 65 73 28 64 62 29 20 29  AllMutexes(db) )
22c90 3b 20 20 2f 2a 20 4e 65 65 64 65 64 20 66 6f 72  ;  /* Needed for
22ca0 20 73 63 68 65 6d 61 20 61 63 63 65 73 73 20 2a   schema access *
22cb0 2f 0a 20 20 66 6f 72 28 69 44 62 3d 30 2c 20 70  /.  for(iDb=0, p
22cc0 44 62 3d 64 62 2d 3e 61 44 62 3b 20 69 44 62 3c  Db=db->aDb; iDb<
22cd0 64 62 2d 3e 6e 44 62 3b 20 69 44 62 2b 2b 2c 20  db->nDb; iDb++, 
22ce0 70 44 62 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65  pDb++){.    asse
22cf0 72 74 28 20 70 44 62 21 3d 30 20 29 3b 0a 20 20  rt( pDb!=0 );.  
22d00 20 20 66 6f 72 28 6b 3d 73 71 6c 69 74 65 48 61    for(k=sqliteHa
22d10 73 68 46 69 72 73 74 28 26 70 44 62 2d 3e 70 53  shFirst(&pDb->pS
22d20 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68 29 3b  chema->tblHash);
22d30 20 20 6b 3b 20 6b 3d 73 71 6c 69 74 65 48 61 73    k; k=sqliteHas
22d40 68 4e 65 78 74 28 6b 29 29 7b 0a 20 20 20 20 20  hNext(k)){.     
22d50 20 70 54 61 62 20 3d 20 28 54 61 62 6c 65 2a 29   pTab = (Table*)
22d60 73 71 6c 69 74 65 48 61 73 68 44 61 74 61 28 6b  sqliteHashData(k
22d70 29 3b 0a 20 20 20 20 20 20 72 65 69 6e 64 65 78  );.      reindex
22d80 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70 54  Table(pParse, pT
22d90 61 62 2c 20 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20  ab, zColl);.    
22da0 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a  }.  }.}.#endif..
22db0 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
22dc0 6f 64 65 20 66 6f 72 20 74 68 65 20 52 45 49 4e  ode for the REIN
22dd0 44 45 58 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a  DEX command..**.
22de0 2a 2a 20 20 20 20 20 20 20 20 52 45 49 4e 44 45  **        REINDE
22df0 58 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  X               
22e00 20 20 20 20 20 20 20 20 20 20 20 20 20 2d 2d 20               -- 
22e10 31 0a 2a 2a 20 20 20 20 20 20 20 20 52 45 49 4e  1.**        REIN
22e20 44 45 58 20 20 3c 63 6f 6c 6c 61 74 69 6f 6e 3e  DEX  <collation>
22e30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2d                 -
22e40 2d 20 32 0a 2a 2a 20 20 20 20 20 20 20 20 52 45  - 2.**        RE
22e50 49 4e 44 45 58 20 20 3f 3c 64 61 74 61 62 61 73  INDEX  ?<databas
22e60 65 3e 2e 3f 3c 74 61 62 6c 65 6e 61 6d 65 3e 20  e>.?<tablename> 
22e70 20 2d 2d 20 33 0a 2a 2a 20 20 20 20 20 20 20 20   -- 3.**        
22e80 52 45 49 4e 44 45 58 20 20 3f 3c 64 61 74 61 62  REINDEX  ?<datab
22e90 61 73 65 3e 2e 3f 3c 69 6e 64 65 78 6e 61 6d 65  ase>.?<indexname
22ea0 3e 20 20 2d 2d 20 34 0a 2a 2a 0a 2a 2a 20 46 6f  >  -- 4.**.** Fo
22eb0 72 6d 20 31 20 63 61 75 73 65 73 20 61 6c 6c 20  rm 1 causes all 
22ec0 69 6e 64 69 63 65 73 20 69 6e 20 61 6c 6c 20 61  indices in all a
22ed0 74 74 61 63 68 65 64 20 64 61 74 61 62 61 73 65  ttached database
22ee0 73 20 74 6f 20 62 65 20 72 65 62 75 69 6c 74 2e  s to be rebuilt.
22ef0 0a 2a 2a 20 46 6f 72 6d 20 32 20 72 65 62 75 69  .** Form 2 rebui
22f00 6c 64 73 20 61 6c 6c 20 69 6e 64 69 63 65 73 20  lds all indices 
22f10 69 6e 20 61 6c 6c 20 64 61 74 61 62 61 73 65 73  in all databases
22f20 20 74 68 61 74 20 75 73 65 20 74 68 65 20 6e 61   that use the na
22f30 6d 65 64 0a 2a 2a 20 63 6f 6c 6c 61 74 69 6e 67  med.** collating
22f40 20 66 75 6e 63 74 69 6f 6e 2e 20 20 46 6f 72 6d   function.  Form
22f50 73 20 33 20 61 6e 64 20 34 20 72 65 62 75 69 6c  s 3 and 4 rebuil
22f60 64 20 74 68 65 20 6e 61 6d 65 64 20 69 6e 64 65  d the named inde
22f70 78 20 6f 72 20 61 6c 6c 0a 2a 2a 20 69 6e 64 69  x or all.** indi
22f80 63 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  ces associated w
22f90 69 74 68 20 74 68 65 20 6e 61 6d 65 64 20 74 61  ith the named ta
22fa0 62 6c 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  ble..*/.#ifndef 
22fb0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 52 45 49 4e  SQLITE_OMIT_REIN
22fc0 44 45 58 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  DEX.void sqlite3
22fd0 52 65 69 6e 64 65 78 28 50 61 72 73 65 20 2a 70  Reindex(Parse *p
22fe0 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 4e  Parse, Token *pN
22ff0 61 6d 65 31 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61  ame1, Token *pNa
23000 6d 65 32 29 7b 0a 20 20 43 6f 6c 6c 53 65 71 20  me2){.  CollSeq 
23010 2a 70 43 6f 6c 6c 3b 20 20 20 20 20 20 20 20 20  *pColl;         
23020 20 20 20 20 2f 2a 20 43 6f 6c 6c 61 74 69 6e 67      /* Collating
23030 20 73 65 71 75 65 6e 63 65 20 74 6f 20 62 65 20   sequence to be 
23040 72 65 69 6e 64 65 78 65 64 2c 20 6f 72 20 4e 55  reindexed, or NU
23050 4c 4c 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 3b  LL */.  char *z;
23060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23070 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 61      /* Name of a
23080 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20   table or index 
23090 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
230a0 2a 7a 44 62 3b 20 20 20 20 20 20 20 20 20 20 20  *zDb;           
230b0 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
230c0 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 54 61  database */.  Ta
230d0 62 6c 65 20 2a 70 54 61 62 3b 20 20 20 20 20 20  ble *pTab;      
230e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 74            /* A t
230f0 61 62 6c 65 20 69 6e 20 74 68 65 20 64 61 74 61  able in the data
23100 62 61 73 65 20 2a 2f 0a 20 20 49 6e 64 65 78 20  base */.  Index 
23110 2a 70 49 6e 64 65 78 3b 20 20 20 20 20 20 20 20  *pIndex;        
23120 20 20 20 20 20 20 2f 2a 20 41 6e 20 69 6e 64 65        /* An inde
23130 78 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  x associated wit
23140 68 20 70 54 61 62 20 2a 2f 0a 20 20 69 6e 74 20  h pTab */.  int 
23150 69 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  iDb;            
23160 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64          /* The d
23170 61 74 61 62 61 73 65 20 69 6e 64 65 78 20 6e 75  atabase index nu
23180 6d 62 65 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65  mber */.  sqlite
23190 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
231a0 64 62 3b 20 20 20 2f 2a 20 54 68 65 20 64 61 74  db;   /* The dat
231b0 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
231c0 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4f 62   */.  Token *pOb
231d0 6a 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20  jName;          
231e0 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
231f0 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20   table or index 
23200 74 6f 20 62 65 20 72 65 69 6e 64 65 78 65 64 20  to be reindexed 
23210 2a 2f 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74 68  */..  /* Read th
23220 65 20 64 61 74 61 62 61 73 65 20 73 63 68 65 6d  e database schem
23230 61 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  a. If an error o
23240 63 63 75 72 73 2c 20 6c 65 61 76 65 20 61 6e 20  ccurs, leave an 
23250 65 72 72 6f 72 20 6d 65 73 73 61 67 65 0a 20 20  error message.  
23260 2a 2a 20 61 6e 64 20 63 6f 64 65 20 69 6e 20 70  ** and code in p
23270 50 61 72 73 65 20 61 6e 64 20 72 65 74 75 72 6e  Parse and return
23280 20 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 69 66 28 20   NULL. */.  if( 
23290 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74  SQLITE_OK!=sqlit
232a0 65 33 52 65 61 64 53 63 68 65 6d 61 28 70 50 61  e3ReadSchema(pPa
232b0 72 73 65 29 20 29 7b 0a 20 20 20 20 72 65 74 75  rse) ){.    retu
232c0 72 6e 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70  rn;.  }..  if( p
232d0 4e 61 6d 65 31 3d 3d 30 20 29 7b 0a 20 20 20 20  Name1==0 ){.    
232e0 72 65 69 6e 64 65 78 44 61 74 61 62 61 73 65 73  reindexDatabases
232f0 28 70 50 61 72 73 65 2c 20 30 29 3b 0a 20 20 20  (pParse, 0);.   
23300 20 72 65 74 75 72 6e 3b 0a 20 20 7d 65 6c 73 65   return;.  }else
23310 20 69 66 28 20 4e 45 56 45 52 28 70 4e 61 6d 65   if( NEVER(pName
23320 32 3d 3d 30 29 20 7c 7c 20 70 4e 61 6d 65 32 2d  2==0) || pName2-
23330 3e 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 63 68 61  >z==0 ){.    cha
23340 72 20 2a 7a 43 6f 6c 6c 3b 0a 20 20 20 20 61 73  r *zColl;.    as
23350 73 65 72 74 28 20 70 4e 61 6d 65 31 2d 3e 7a 20  sert( pName1->z 
23360 29 3b 0a 20 20 20 20 7a 43 6f 6c 6c 20 3d 20 73  );.    zColl = s
23370 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f  qlite3NameFromTo
23380 6b 65 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ken(pParse->db, 
23390 70 4e 61 6d 65 31 29 3b 0a 20 20 20 20 69 66 28  pName1);.    if(
233a0 20 21 7a 43 6f 6c 6c 20 29 20 72 65 74 75 72 6e   !zColl ) return
233b0 3b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71  ;.    pColl = sq
233c0 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71  lite3FindCollSeq
233d0 28 64 62 2c 20 45 4e 43 28 64 62 29 2c 20 7a 43  (db, ENC(db), zC
233e0 6f 6c 6c 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  oll, 0);.    if(
233f0 20 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20   pColl ){.      
23400 72 65 69 6e 64 65 78 44 61 74 61 62 61 73 65 73  reindexDatabases
23410 28 70 50 61 72 73 65 2c 20 7a 43 6f 6c 6c 29 3b  (pParse, zColl);
23420 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62  .      sqlite3Db
23430 46 72 65 65 28 64 62 2c 20 7a 43 6f 6c 6c 29 3b  Free(db, zColl);
23440 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  .      return;. 
23450 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
23460 44 62 46 72 65 65 28 64 62 2c 20 7a 43 6f 6c 6c  DbFree(db, zColl
23470 29 3b 0a 20 20 7d 0a 20 20 69 44 62 20 3d 20 73  );.  }.  iDb = s
23480 71 6c 69 74 65 33 54 77 6f 50 61 72 74 4e 61 6d  qlite3TwoPartNam
23490 65 28 70 50 61 72 73 65 2c 20 70 4e 61 6d 65 31  e(pParse, pName1
234a0 2c 20 70 4e 61 6d 65 32 2c 20 26 70 4f 62 6a 4e  , pName2, &pObjN
234b0 61 6d 65 29 3b 0a 20 20 69 66 28 20 69 44 62 3c  ame);.  if( iDb<
234c0 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 7a 20  0 ) return;.  z 
234d0 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f  = sqlite3NameFro
234e0 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 4f 62 6a 4e  mToken(db, pObjN
234f0 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a 3d 3d 30  ame);.  if( z==0
23500 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 7a 44 62   ) return;.  zDb
23510 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e   = db->aDb[iDb].
23520 7a 44 62 53 4e 61 6d 65 3b 0a 20 20 70 54 61 62  zDbSName;.  pTab
23530 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61   = sqlite3FindTa
23540 62 6c 65 28 64 62 2c 20 7a 2c 20 7a 44 62 29 3b  ble(db, z, zDb);
23550 0a 20 20 69 66 28 20 70 54 61 62 20 29 7b 0a 20  .  if( pTab ){. 
23560 20 20 20 72 65 69 6e 64 65 78 54 61 62 6c 65 28     reindexTable(
23570 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20 30 29  pParse, pTab, 0)
23580 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  ;.    sqlite3DbF
23590 72 65 65 28 64 62 2c 20 7a 29 3b 0a 20 20 20 20  ree(db, z);.    
235a0 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 70 49  return;.  }.  pI
235b0 6e 64 65 78 20 3d 20 73 71 6c 69 74 65 33 46 69  ndex = sqlite3Fi
235c0 6e 64 49 6e 64 65 78 28 64 62 2c 20 7a 2c 20 7a  ndIndex(db, z, z
235d0 44 62 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62  Db);.  sqlite3Db
235e0 46 72 65 65 28 64 62 2c 20 7a 29 3b 0a 20 20 69  Free(db, z);.  i
235f0 66 28 20 70 49 6e 64 65 78 20 29 7b 0a 20 20 20  f( pIndex ){.   
23600 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69   sqlite3BeginWri
23610 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72  teOperation(pPar
23620 73 65 2c 20 30 2c 20 69 44 62 29 3b 0a 20 20 20  se, 0, iDb);.   
23630 20 73 71 6c 69 74 65 33 52 65 66 69 6c 6c 49 6e   sqlite3RefillIn
23640 64 65 78 28 70 50 61 72 73 65 2c 20 70 49 6e 64  dex(pParse, pInd
23650 65 78 2c 20 2d 31 29 3b 0a 20 20 20 20 72 65 74  ex, -1);.    ret
23660 75 72 6e 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  urn;.  }.  sqlit
23670 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
23680 65 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20 69 64  e, "unable to id
23690 65 6e 74 69 66 79 20 74 68 65 20 6f 62 6a 65 63  entify the objec
236a0 74 20 74 6f 20 62 65 20 72 65 69 6e 64 65 78 65  t to be reindexe
236b0 64 22 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  d");.}.#endif../
236c0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 4b 65  *.** Return a Ke
236d0 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20  yInfo structure 
236e0 74 68 61 74 20 69 73 20 61 70 70 72 6f 70 72 69  that is appropri
236f0 61 74 65 20 66 6f 72 20 74 68 65 20 67 69 76 65  ate for the give
23700 6e 20 49 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 54  n Index..**.** T
23710 68 65 20 63 61 6c 6c 65 72 20 73 68 6f 75 6c 64  he caller should
23720 20 69 6e 76 6f 6b 65 20 73 71 6c 69 74 65 33 4b   invoke sqlite3K
23730 65 79 49 6e 66 6f 55 6e 72 65 66 28 29 20 6f 6e  eyInfoUnref() on
23740 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 6f 62   the returned ob
23750 6a 65 63 74 0a 2a 2a 20 77 68 65 6e 20 69 74 20  ject.** when it 
23760 68 61 73 20 66 69 6e 69 73 68 65 64 20 75 73 69  has finished usi
23770 6e 67 20 69 74 2e 0a 2a 2f 0a 4b 65 79 49 6e 66  ng it..*/.KeyInf
23780 6f 20 2a 73 71 6c 69 74 65 33 4b 65 79 49 6e 66  o *sqlite3KeyInf
23790 6f 4f 66 49 6e 64 65 78 28 50 61 72 73 65 20 2a  oOfIndex(Parse *
237a0 70 50 61 72 73 65 2c 20 49 6e 64 65 78 20 2a 70  pParse, Index *p
237b0 49 64 78 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  Idx){.  int i;. 
237c0 20 69 6e 74 20 6e 43 6f 6c 20 3d 20 70 49 64 78   int nCol = pIdx
237d0 2d 3e 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 69 6e 74  ->nColumn;.  int
237e0 20 6e 4b 65 79 20 3d 20 70 49 64 78 2d 3e 6e 4b   nKey = pIdx->nK
237f0 65 79 43 6f 6c 3b 0a 20 20 4b 65 79 49 6e 66 6f  eyCol;.  KeyInfo
23800 20 2a 70 4b 65 79 3b 0a 20 20 69 66 28 20 70 50   *pKey;.  if( pP
23810 61 72 73 65 2d 3e 6e 45 72 72 20 29 20 72 65 74  arse->nErr ) ret
23820 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 49 64  urn 0;.  if( pId
23830 78 2d 3e 75 6e 69 71 4e 6f 74 4e 75 6c 6c 20 29  x->uniqNotNull )
23840 7b 0a 20 20 20 20 70 4b 65 79 20 3d 20 73 71 6c  {.    pKey = sql
23850 69 74 65 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63  ite3KeyInfoAlloc
23860 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 6e 4b 65  (pParse->db, nKe
23870 79 2c 20 6e 43 6f 6c 2d 6e 4b 65 79 29 3b 0a 20  y, nCol-nKey);. 
23880 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 4b 65 79   }else{.    pKey
23890 20 3d 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66   = sqlite3KeyInf
238a0 6f 41 6c 6c 6f 63 28 70 50 61 72 73 65 2d 3e 64  oAlloc(pParse->d
238b0 62 2c 20 6e 43 6f 6c 2c 20 30 29 3b 0a 20 20 7d  b, nCol, 0);.  }
238c0 0a 20 20 69 66 28 20 70 4b 65 79 20 29 7b 0a 20  .  if( pKey ){. 
238d0 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
238e0 65 33 4b 65 79 49 6e 66 6f 49 73 57 72 69 74 65  e3KeyInfoIsWrite
238f0 61 62 6c 65 28 70 4b 65 79 29 20 29 3b 0a 20 20  able(pKey) );.  
23900 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f    for(i=0; i<nCo
23910 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 63  l; i++){.      c
23920 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 6c  onst char *zColl
23930 20 3d 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b   = pIdx->azColl[
23940 69 5d 3b 0a 20 20 20 20 20 20 70 4b 65 79 2d 3e  i];.      pKey->
23950 61 43 6f 6c 6c 5b 69 5d 20 3d 20 7a 43 6f 6c 6c  aColl[i] = zColl
23960 3d 3d 73 71 6c 69 74 65 33 53 74 72 42 49 4e 41  ==sqlite3StrBINA
23970 52 59 20 3f 20 30 20 3a 0a 20 20 20 20 20 20 20  RY ? 0 :.       
23980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23990 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 43 6f   sqlite3LocateCo
239a0 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 7a 43  llSeq(pParse, zC
239b0 6f 6c 6c 29 3b 0a 20 20 20 20 20 20 70 4b 65 79  oll);.      pKey
239c0 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20  ->aSortOrder[i] 
239d0 3d 20 70 49 64 78 2d 3e 61 53 6f 72 74 4f 72 64  = pIdx->aSortOrd
239e0 65 72 5b 69 5d 3b 0a 20 20 20 20 7d 0a 20 20 20  er[i];.    }.   
239f0 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72   if( pParse->nEr
23a00 72 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  r ){.      sqlit
23a10 65 33 4b 65 79 49 6e 66 6f 55 6e 72 65 66 28 70  e3KeyInfoUnref(p
23a20 4b 65 79 29 3b 0a 20 20 20 20 20 20 70 4b 65 79  Key);.      pKey
23a30 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 0;.    }.  }.
23a40 20 20 72 65 74 75 72 6e 20 70 4b 65 79 3b 0a 7d    return pKey;.}
23a50 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
23a60 5f 4f 4d 49 54 5f 43 54 45 0a 2f 2a 20 0a 2a 2a  _OMIT_CTE./* .**
23a70 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
23a80 20 69 6e 76 6f 6b 65 64 20 6f 6e 63 65 20 70 65   invoked once pe
23a90 72 20 43 54 45 20 62 79 20 74 68 65 20 70 61 72  r CTE by the par
23aa0 73 65 72 20 77 68 69 6c 65 20 70 61 72 73 69 6e  ser while parsin
23ab0 67 20 61 20 0a 2a 2a 20 57 49 54 48 20 63 6c 61  g a .** WITH cla
23ac0 75 73 65 2e 20 0a 2a 2f 0a 57 69 74 68 20 2a 73  use. .*/.With *s
23ad0 71 6c 69 74 65 33 57 69 74 68 41 64 64 28 0a 20  qlite3WithAdd(. 
23ae0 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
23af0 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73           /* Pars
23b00 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
23b10 20 57 69 74 68 20 2a 70 57 69 74 68 2c 20 20 20   With *pWith,   
23b20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 69 73           /* Exis
23b30 74 69 6e 67 20 57 49 54 48 20 63 6c 61 75 73 65  ting WITH clause
23b40 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 54  , or NULL */.  T
23b50 6f 6b 65 6e 20 2a 70 4e 61 6d 65 2c 20 20 20 20  oken *pName,    
23b60 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
23b70 66 20 74 68 65 20 63 6f 6d 6d 6f 6e 2d 74 61 62  f the common-tab
23b80 6c 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  le */.  ExprList
23b90 20 2a 70 41 72 67 6c 69 73 74 2c 20 20 20 20 20   *pArglist,     
23ba0 2f 2a 20 4f 70 74 69 6f 6e 61 6c 20 63 6f 6c 75  /* Optional colu
23bb0 6d 6e 20 6e 61 6d 65 20 6c 69 73 74 20 66 6f 72  mn name list for
23bc0 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20   the table */.  
23bd0 53 65 6c 65 63 74 20 2a 70 51 75 65 72 79 20 20  Select *pQuery  
23be0 20 20 20 20 20 20 20 20 2f 2a 20 51 75 65 72 79          /* Query
23bf0 20 75 73 65 64 20 74 6f 20 69 6e 69 74 69 61 6c   used to initial
23c00 69 7a 65 20 74 68 65 20 74 61 62 6c 65 20 2a 2f  ize the table */
23c10 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  .){.  sqlite3 *d
23c20 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
23c30 20 20 57 69 74 68 20 2a 70 4e 65 77 3b 0a 20 20    With *pNew;.  
23c40 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 0a 20 20  char *zName;..  
23c50 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74 68  /* Check that th
23c60 65 20 43 54 45 20 6e 61 6d 65 20 69 73 20 75 6e  e CTE name is un
23c70 69 71 75 65 20 77 69 74 68 69 6e 20 74 68 69 73  ique within this
23c80 20 57 49 54 48 20 63 6c 61 75 73 65 2e 20 49 66   WITH clause. If
23c90 0a 20 20 2a 2a 20 6e 6f 74 2c 20 73 74 6f 72 65  .  ** not, store
23ca0 20 61 6e 20 65 72 72 6f 72 20 69 6e 20 74 68 65   an error in the
23cb0 20 50 61 72 73 65 20 73 74 72 75 63 74 75 72 65   Parse structure
23cc0 2e 20 2a 2f 0a 20 20 7a 4e 61 6d 65 20 3d 20 73  . */.  zName = s
23cd0 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f  qlite3NameFromTo
23ce0 6b 65 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ken(pParse->db, 
23cf0 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a 4e  pName);.  if( zN
23d00 61 6d 65 20 26 26 20 70 57 69 74 68 20 29 7b 0a  ame && pWith ){.
23d10 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66      int i;.    f
23d20 6f 72 28 69 3d 30 3b 20 69 3c 70 57 69 74 68 2d  or(i=0; i<pWith-
23d30 3e 6e 43 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nCte; i++){.   
23d40 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74     if( sqlite3St
23d50 72 49 43 6d 70 28 7a 4e 61 6d 65 2c 20 70 57 69  rICmp(zName, pWi
23d60 74 68 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3d  th->a[i].zName)=
23d70 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  =0 ){.        sq
23d80 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
23d90 61 72 73 65 2c 20 22 64 75 70 6c 69 63 61 74 65  arse, "duplicate
23da0 20 57 49 54 48 20 74 61 62 6c 65 20 6e 61 6d 65   WITH table name
23db0 3a 20 25 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20  : %s", zName);. 
23dc0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
23dd0 0a 0a 20 20 69 66 28 20 70 57 69 74 68 20 29 7b  ..  if( pWith ){
23de0 0a 20 20 20 20 69 6e 74 20 6e 42 79 74 65 20 3d  .    int nByte =
23df0 20 73 69 7a 65 6f 66 28 2a 70 57 69 74 68 29 20   sizeof(*pWith) 
23e00 2b 20 28 73 69 7a 65 6f 66 28 70 57 69 74 68 2d  + (sizeof(pWith-
23e10 3e 61 5b 31 5d 29 20 2a 20 70 57 69 74 68 2d 3e  >a[1]) * pWith->
23e20 6e 43 74 65 29 3b 0a 20 20 20 20 70 4e 65 77 20  nCte);.    pNew 
23e30 3d 20 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c  = sqlite3DbReall
23e40 6f 63 28 64 62 2c 20 70 57 69 74 68 2c 20 6e 42  oc(db, pWith, nB
23e50 79 74 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  yte);.  }else{. 
23e60 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65     pNew = sqlite
23e70 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62  3DbMallocZero(db
23e80 2c 20 73 69 7a 65 6f 66 28 2a 70 57 69 74 68 29  , sizeof(*pWith)
23e90 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  );.  }.  assert(
23ea0 20 28 70 4e 65 77 21 3d 30 20 26 26 20 7a 4e 61   (pNew!=0 && zNa
23eb0 6d 65 21 3d 30 29 20 7c 7c 20 64 62 2d 3e 6d 61  me!=0) || db->ma
23ec0 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 0a 20  llocFailed );.. 
23ed0 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
23ee0 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 73 71 6c  ailed ){.    sql
23ef0 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65  ite3ExprListDele
23f00 74 65 28 64 62 2c 20 70 41 72 67 6c 69 73 74 29  te(db, pArglist)
23f10 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c  ;.    sqlite3Sel
23f20 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70 51  ectDelete(db, pQ
23f30 75 65 72 79 29 3b 0a 20 20 20 20 73 71 6c 69 74  uery);.    sqlit
23f40 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4e 61  e3DbFree(db, zNa
23f50 6d 65 29 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20  me);.    pNew = 
23f60 70 57 69 74 68 3b 0a 20 20 7d 65 6c 73 65 7b 0a  pWith;.  }else{.
23f70 20 20 20 20 70 4e 65 77 2d 3e 61 5b 70 4e 65 77      pNew->a[pNew
23f80 2d 3e 6e 43 74 65 5d 2e 70 53 65 6c 65 63 74 20  ->nCte].pSelect 
23f90 3d 20 70 51 75 65 72 79 3b 0a 20 20 20 20 70 4e  = pQuery;.    pN
23fa0 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e 43 74 65  ew->a[pNew->nCte
23fb0 5d 2e 70 43 6f 6c 73 20 3d 20 70 41 72 67 6c 69  ].pCols = pArgli
23fc0 73 74 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 61 5b  st;.    pNew->a[
23fd0 70 4e 65 77 2d 3e 6e 43 74 65 5d 2e 7a 4e 61 6d  pNew->nCte].zNam
23fe0 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20 20 20 70  e = zName;.    p
23ff0 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e 43 74  New->a[pNew->nCt
24000 65 5d 2e 7a 43 74 65 45 72 72 20 3d 20 30 3b 0a  e].zCteErr = 0;.
24010 20 20 20 20 70 4e 65 77 2d 3e 6e 43 74 65 2b 2b      pNew->nCte++
24020 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
24030 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  pNew;.}../*.** F
24040 72 65 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  ree the contents
24050 20 6f 66 20 74 68 65 20 57 69 74 68 20 6f 62 6a   of the With obj
24060 65 63 74 20 70 61 73 73 65 64 20 61 73 20 74 68  ect passed as th
24070 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
24080 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  t..*/.void sqlit
24090 65 33 57 69 74 68 44 65 6c 65 74 65 28 73 71 6c  e3WithDelete(sql
240a0 69 74 65 33 20 2a 64 62 2c 20 57 69 74 68 20 2a  ite3 *db, With *
240b0 70 57 69 74 68 29 7b 0a 20 20 69 66 28 20 70 57  pWith){.  if( pW
240c0 69 74 68 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  ith ){.    int i
240d0 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
240e0 3c 70 57 69 74 68 2d 3e 6e 43 74 65 3b 20 69 2b  <pWith->nCte; i+
240f0 2b 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74  +){.      struct
24100 20 43 74 65 20 2a 70 43 74 65 20 3d 20 26 70 57   Cte *pCte = &pW
24110 69 74 68 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 20  ith->a[i];.     
24120 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
24130 44 65 6c 65 74 65 28 64 62 2c 20 70 43 74 65 2d  Delete(db, pCte-
24140 3e 70 43 6f 6c 73 29 3b 0a 20 20 20 20 20 20 73  >pCols);.      s
24150 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65  qlite3SelectDele
24160 74 65 28 64 62 2c 20 70 43 74 65 2d 3e 70 53 65  te(db, pCte->pSe
24170 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  lect);.      sql
24180 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
24190 43 74 65 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  Cte->zName);.   
241a0 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62   }.    sqlite3Db
241b0 46 72 65 65 28 64 62 2c 20 70 57 69 74 68 29 3b  Free(db, pWith);
241c0 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  .  }.}.#endif /*
241d0 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
241e0 5f 4f 4d 49 54 5f 43 54 45 29 20 2a 2f 0a        _OMIT_CTE) */.