/ Hex Artifact Content
Login

Artifact ad3374b5409554e504300f77e1fbc6b4c106a57f:


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 2a 0a 2a 2a    ROLLBACK.**.**
02d0: 20 24 49 64 3a 20 62 75 69 6c 64 2e 63 2c 76 20   $Id: build.c,v 
02e0: 31 2e 34 31 38 20 32 30 30 37 2f 30 33 2f 32 39  1.418 2007/03/29
02f0: 20 30 35 3a 35 31 3a 34 39 20 64 72 68 20 45 78   05:51:49 drh Ex
0300: 70 20 24 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20  p $.*/.#include 
0310: 22 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a 23 69  "sqliteInt.h".#i
0320: 6e 63 6c 75 64 65 20 3c 63 74 79 70 65 2e 68 3e  nclude <ctype.h>
0330: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
0340: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77  tine is called w
0350: 68 65 6e 20 61 20 6e 65 77 20 53 51 4c 20 73 74  hen a new SQL st
0360: 61 74 65 6d 65 6e 74 20 69 73 20 62 65 67 69 6e  atement is begin
0370: 6e 69 6e 67 20 74 6f 0a 2a 2a 20 62 65 20 70 61  ning to.** be pa
0380: 72 73 65 64 2e 20 20 49 6e 69 74 69 61 6c 69 7a  rsed.  Initializ
0390: 65 20 74 68 65 20 70 50 61 72 73 65 20 73 74 72  e the pParse str
03a0: 75 63 74 75 72 65 20 61 73 20 6e 65 65 64 65 64  ucture as needed
03b0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
03c0: 33 42 65 67 69 6e 50 61 72 73 65 28 50 61 72 73  3BeginParse(Pars
03d0: 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 65  e *pParse, int e
03e0: 78 70 6c 61 69 6e 46 6c 61 67 29 7b 0a 20 20 70  xplainFlag){.  p
03f0: 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 20 3d  Parse->explain =
0400: 20 65 78 70 6c 61 69 6e 46 6c 61 67 3b 0a 20 20   explainFlag;.  
0410: 70 50 61 72 73 65 2d 3e 6e 56 61 72 20 3d 20 30  pParse->nVar = 0
0420: 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ;.}..#ifndef SQL
0430: 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f  ITE_OMIT_SHARED_
0440: 43 41 43 48 45 0a 2f 2a 0a 2a 2a 20 54 68 65 20  CACHE./*.** The 
0450: 54 61 62 6c 65 4c 6f 63 6b 20 73 74 72 75 63 74  TableLock struct
0460: 75 72 65 20 69 73 20 6f 6e 6c 79 20 75 73 65 64  ure is only used
0470: 20 62 79 20 74 68 65 20 73 71 6c 69 74 65 33 54   by the sqlite3T
0480: 61 62 6c 65 4c 6f 63 6b 28 29 20 61 6e 64 0a 2a  ableLock() and.*
0490: 2a 20 63 6f 64 65 54 61 62 6c 65 4c 6f 63 6b 73  * codeTableLocks
04a0: 28 29 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 2a 2f  () functions..*/
04b0: 0a 73 74 72 75 63 74 20 54 61 62 6c 65 4c 6f 63  .struct TableLoc
04c0: 6b 20 7b 0a 20 20 69 6e 74 20 69 44 62 3b 20 20  k {.  int iDb;  
04d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
04e0: 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74 61  e database conta
04f0: 69 6e 69 6e 67 20 74 68 65 20 74 61 62 6c 65 20  ining the table 
0500: 74 6f 20 62 65 20 6c 6f 63 6b 65 64 20 2a 2f 0a  to be locked */.
0510: 20 20 69 6e 74 20 69 54 61 62 3b 20 20 20 20 20    int iTab;     
0520: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 6f         /* The ro
0530: 6f 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 74  ot page of the t
0540: 61 62 6c 65 20 74 6f 20 62 65 20 6c 6f 63 6b 65  able to be locke
0550: 64 20 2a 2f 0a 20 20 75 38 20 69 73 57 72 69 74  d */.  u8 isWrit
0560: 65 4c 6f 63 6b 3b 20 20 20 20 20 20 2f 2a 20 54  eLock;      /* T
0570: 72 75 65 20 66 6f 72 20 77 72 69 74 65 20 6c 6f  rue for write lo
0580: 63 6b 2e 20 20 46 61 6c 73 65 20 66 6f 72 20 61  ck.  False for a
0590: 20 72 65 61 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20   read lock */.  
05a0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
05b0: 65 3b 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20  e;   /* Name of 
05c0: 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 7d 3b 0a  the table */.};.
05d0: 0a 2f 2a 0a 2a 2a 20 52 65 63 6f 72 64 20 74 68  ./*.** Record th
05e0: 65 20 66 61 63 74 20 74 68 61 74 20 77 65 20 77  e fact that we w
05f0: 61 6e 74 20 74 6f 20 6c 6f 63 6b 20 61 20 74 61  ant to lock a ta
0600: 62 6c 65 20 61 74 20 72 75 6e 2d 74 69 6d 65 2e  ble at run-time.
0610: 20 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 61 62    .**.** The tab
0620: 6c 65 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64 20  le to be locked 
0630: 68 61 73 20 72 6f 6f 74 20 70 61 67 65 20 69 54  has root page iT
0640: 61 62 20 61 6e 64 20 69 73 20 66 6f 75 6e 64 20  ab and is found 
0650: 69 6e 20 64 61 74 61 62 61 73 65 20 69 44 62 2e  in database iDb.
0660: 0a 2a 2a 20 41 20 72 65 61 64 20 6f 72 20 61 20  .** A read or a 
0670: 77 72 69 74 65 20 6c 6f 63 6b 20 63 61 6e 20 62  write lock can b
0680: 65 20 74 61 6b 65 6e 20 64 65 70 65 6e 64 69 6e  e taken dependin
0690: 67 20 6f 6e 20 69 73 57 72 69 74 65 6c 6f 63 6b  g on isWritelock
06a0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
06b0: 74 69 6e 65 20 6a 75 73 74 20 72 65 63 6f 72 64  tine just record
06c0: 73 20 74 68 65 20 66 61 63 74 20 74 68 61 74 20  s the fact that 
06d0: 74 68 65 20 6c 6f 63 6b 20 69 73 20 64 65 73 69  the lock is desi
06e0: 72 65 64 2e 20 20 54 68 65 0a 2a 2a 20 63 6f 64  red.  The.** cod
06f0: 65 20 74 6f 20 6d 61 6b 65 20 74 68 65 20 6c 6f  e to make the lo
0700: 63 6b 20 6f 63 63 75 72 20 69 73 20 67 65 6e 65  ck occur is gene
0710: 72 61 74 65 64 20 62 79 20 61 20 6c 61 74 65 72  rated by a later
0720: 20 63 61 6c 6c 20 74 6f 0a 2a 2a 20 63 6f 64 65   call to.** code
0730: 54 61 62 6c 65 4c 6f 63 6b 73 28 29 20 77 68 69  TableLocks() whi
0740: 63 68 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67  ch occurs during
0750: 20 73 71 6c 69 74 65 33 46 69 6e 69 73 68 43 6f   sqlite3FinishCo
0760: 64 69 6e 67 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20  ding()..*/.void 
0770: 73 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b  sqlite3TableLock
0780: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
0790: 65 2c 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e  e,     /* Parsin
07a0: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69  g context */.  i
07b0: 6e 74 20 69 44 62 2c 20 20 20 20 20 20 20 20 20  nt iDb,         
07c0: 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74 68    /* Index of th
07d0: 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74 61  e database conta
07e0: 69 6e 69 6e 67 20 74 68 65 20 74 61 62 6c 65 20  ining the table 
07f0: 74 6f 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 6e 74  to lock */.  int
0800: 20 69 54 61 62 2c 20 20 20 20 20 20 20 20 20 20   iTab,          
0810: 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20 6e 75 6d  /* Root page num
0820: 62 65 72 20 6f 66 20 74 68 65 20 74 61 62 6c 65  ber of the table
0830: 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64 20 2a 2f   to be locked */
0840: 0a 20 20 75 38 20 69 73 57 72 69 74 65 4c 6f 63  .  u8 isWriteLoc
0850: 6b 2c 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f  k,    /* True fo
0860: 72 20 61 20 77 72 69 74 65 20 6c 6f 63 6b 20 2a  r a write lock *
0870: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
0880: 7a 4e 61 6d 65 20 20 2f 2a 20 4e 61 6d 65 20 6f  zName  /* Name o
0890: 66 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20 62  f the table to b
08a0: 65 20 6c 6f 63 6b 65 64 20 2a 2f 0a 29 7b 0a 20  e locked */.){. 
08b0: 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e 42   int i;.  int nB
08c0: 79 74 65 73 3b 0a 20 20 54 61 62 6c 65 4c 6f 63  ytes;.  TableLoc
08d0: 6b 20 2a 70 3b 0a 0a 20 20 69 66 28 20 30 3d 3d  k *p;..  if( 0==
08e0: 73 71 6c 69 74 65 33 54 68 72 65 61 64 44 61 74  sqlite3ThreadDat
08f0: 61 52 65 61 64 4f 6e 6c 79 28 29 2d 3e 75 73 65  aReadOnly()->use
0900: 53 68 61 72 65 64 44 61 74 61 20 7c 7c 20 69 44  SharedData || iD
0910: 62 3c 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  b<0 ){.    retur
0920: 6e 3b 0a 20 20 7d 0a 0a 20 20 66 6f 72 28 69 3d  n;.  }..  for(i=
0930: 30 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e 54 61  0; i<pParse->nTa
0940: 62 6c 65 4c 6f 63 6b 3b 20 69 2b 2b 29 7b 0a 20  bleLock; i++){. 
0950: 20 20 20 70 20 3d 20 26 70 50 61 72 73 65 2d 3e     p = &pParse->
0960: 61 54 61 62 6c 65 4c 6f 63 6b 5b 69 5d 3b 0a 20  aTableLock[i];. 
0970: 20 20 20 69 66 28 20 70 2d 3e 69 44 62 3d 3d 69     if( p->iDb==i
0980: 44 62 20 26 26 20 70 2d 3e 69 54 61 62 3d 3d 69  Db && p->iTab==i
0990: 54 61 62 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  Tab ){.      p->
09a0: 69 73 57 72 69 74 65 4c 6f 63 6b 20 3d 20 28 70  isWriteLock = (p
09b0: 2d 3e 69 73 57 72 69 74 65 4c 6f 63 6b 20 7c 7c  ->isWriteLock ||
09c0: 20 69 73 57 72 69 74 65 4c 6f 63 6b 29 3b 0a 20   isWriteLock);. 
09d0: 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20       return;.   
09e0: 20 7d 0a 20 20 7d 0a 0a 20 20 6e 42 79 74 65 73   }.  }..  nBytes
09f0: 20 3d 20 73 69 7a 65 6f 66 28 54 61 62 6c 65 4c   = sizeof(TableL
0a00: 6f 63 6b 29 20 2a 20 28 70 50 61 72 73 65 2d 3e  ock) * (pParse->
0a10: 6e 54 61 62 6c 65 4c 6f 63 6b 2b 31 29 3b 0a 20  nTableLock+1);. 
0a20: 20 70 50 61 72 73 65 2d 3e 61 54 61 62 6c 65 4c   pParse->aTableL
0a30: 6f 63 6b 20 3d 20 73 71 6c 69 74 65 52 65 61 6c  ock = sqliteReal
0a40: 6c 6f 63 4f 72 46 72 65 65 28 70 50 61 72 73 65  locOrFree(pParse
0a50: 2d 3e 61 54 61 62 6c 65 4c 6f 63 6b 2c 20 6e 42  ->aTableLock, nB
0a60: 79 74 65 73 29 3b 0a 20 20 69 66 28 20 70 50 61  ytes);.  if( pPa
0a70: 72 73 65 2d 3e 61 54 61 62 6c 65 4c 6f 63 6b 20  rse->aTableLock 
0a80: 29 7b 0a 20 20 20 20 70 20 3d 20 26 70 50 61 72  ){.    p = &pPar
0a90: 73 65 2d 3e 61 54 61 62 6c 65 4c 6f 63 6b 5b 70  se->aTableLock[p
0aa0: 50 61 72 73 65 2d 3e 6e 54 61 62 6c 65 4c 6f 63  Parse->nTableLoc
0ab0: 6b 2b 2b 5d 3b 0a 20 20 20 20 70 2d 3e 69 44 62  k++];.    p->iDb
0ac0: 20 3d 20 69 44 62 3b 0a 20 20 20 20 70 2d 3e 69   = iDb;.    p->i
0ad0: 54 61 62 20 3d 20 69 54 61 62 3b 0a 20 20 20 20  Tab = iTab;.    
0ae0: 70 2d 3e 69 73 57 72 69 74 65 4c 6f 63 6b 20 3d  p->isWriteLock =
0af0: 20 69 73 57 72 69 74 65 4c 6f 63 6b 3b 0a 20 20   isWriteLock;.  
0b00: 20 20 70 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 4e 61    p->zName = zNa
0b10: 6d 65 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  me;.  }.}../*.**
0b20: 20 43 6f 64 65 20 61 6e 20 4f 50 5f 54 61 62 6c   Code an OP_Tabl
0b30: 65 4c 6f 63 6b 20 69 6e 73 74 72 75 63 74 69 6f  eLock instructio
0b40: 6e 20 66 6f 72 20 65 61 63 68 20 74 61 62 6c 65  n for each table
0b50: 20 6c 6f 63 6b 65 64 20 62 79 20 74 68 65 0a 2a   locked by the.*
0b60: 2a 20 73 74 61 74 65 6d 65 6e 74 20 28 63 6f 6e  * statement (con
0b70: 66 69 67 75 72 65 64 20 62 79 20 63 61 6c 6c 73  figured by calls
0b80: 20 74 6f 20 73 71 6c 69 74 65 33 54 61 62 6c 65   to sqlite3Table
0b90: 4c 6f 63 6b 28 29 29 2e 0a 2a 2f 0a 73 74 61 74  Lock())..*/.stat
0ba0: 69 63 20 76 6f 69 64 20 63 6f 64 65 54 61 62 6c  ic void codeTabl
0bb0: 65 4c 6f 63 6b 73 28 50 61 72 73 65 20 2a 70 50  eLocks(Parse *pP
0bc0: 61 72 73 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  arse){.  int i;.
0bd0: 20 20 56 64 62 65 20 2a 70 56 64 62 65 3b 20 0a    Vdbe *pVdbe; .
0be0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
0bf0: 33 54 68 72 65 61 64 44 61 74 61 52 65 61 64 4f  3ThreadDataReadO
0c00: 6e 6c 79 28 29 2d 3e 75 73 65 53 68 61 72 65 64  nly()->useShared
0c10: 44 61 74 61 20 7c 7c 20 70 50 61 72 73 65 2d 3e  Data || pParse->
0c20: 6e 54 61 62 6c 65 4c 6f 63 6b 3d 3d 30 20 29 3b  nTableLock==0 );
0c30: 0a 0a 20 20 69 66 28 20 30 3d 3d 28 70 56 64 62  ..  if( 0==(pVdb
0c40: 65 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  e = sqlite3GetVd
0c50: 62 65 28 70 50 61 72 73 65 29 29 20 29 7b 0a 20  be(pParse)) ){. 
0c60: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a     return;.  }..
0c70: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61    for(i=0; i<pPa
0c80: 72 73 65 2d 3e 6e 54 61 62 6c 65 4c 6f 63 6b 3b  rse->nTableLock;
0c90: 20 69 2b 2b 29 7b 0a 20 20 20 20 54 61 62 6c 65   i++){.    Table
0ca0: 4c 6f 63 6b 20 2a 70 20 3d 20 26 70 50 61 72 73  Lock *p = &pPars
0cb0: 65 2d 3e 61 54 61 62 6c 65 4c 6f 63 6b 5b 69 5d  e->aTableLock[i]
0cc0: 3b 0a 20 20 20 20 69 6e 74 20 70 31 20 3d 20 70  ;.    int p1 = p
0cd0: 2d 3e 69 44 62 3b 0a 20 20 20 20 69 66 28 20 70  ->iDb;.    if( p
0ce0: 2d 3e 69 73 57 72 69 74 65 4c 6f 63 6b 20 29 7b  ->isWriteLock ){
0cf0: 0a 20 20 20 20 20 20 70 31 20 3d 20 2d 31 2a 28  .      p1 = -1*(
0d00: 70 31 2b 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20  p1+1);.    }.   
0d10: 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28   sqlite3VdbeOp3(
0d20: 70 56 64 62 65 2c 20 4f 50 5f 54 61 62 6c 65 4c  pVdbe, OP_TableL
0d30: 6f 63 6b 2c 20 70 31 2c 20 70 2d 3e 69 54 61 62  ock, p1, p->iTab
0d40: 2c 20 70 2d 3e 7a 4e 61 6d 65 2c 20 50 33 5f 53  , p->zName, P3_S
0d50: 54 41 54 49 43 29 3b 0a 20 20 7d 0a 7d 0a 23 65  TATIC);.  }.}.#e
0d60: 6c 73 65 0a 20 20 23 64 65 66 69 6e 65 20 63 6f  lse.  #define co
0d70: 64 65 54 61 62 6c 65 4c 6f 63 6b 73 28 78 29 0a  deTableLocks(x).
0d80: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68  #endif../*.** Th
0d90: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
0da0: 6c 6c 65 64 20 61 66 74 65 72 20 61 20 73 69 6e  lled after a sin
0db0: 67 6c 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e  gle SQL statemen
0dc0: 74 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20 70 61  t has been.** pa
0dd0: 72 73 65 64 20 61 6e 64 20 61 20 56 44 42 45 20  rsed and a VDBE 
0de0: 70 72 6f 67 72 61 6d 20 74 6f 20 65 78 65 63 75  program to execu
0df0: 74 65 20 74 68 61 74 20 73 74 61 74 65 6d 65 6e  te that statemen
0e00: 74 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20 70 72  t has been.** pr
0e10: 65 70 61 72 65 64 2e 20 20 54 68 69 73 20 72 6f  epared.  This ro
0e20: 75 74 69 6e 65 20 70 75 74 73 20 74 68 65 20 66  utine puts the f
0e30: 69 6e 69 73 68 69 6e 67 20 74 6f 75 63 68 65 73  inishing touches
0e40: 20 6f 6e 20 74 68 65 0a 2a 2a 20 56 44 42 45 20   on the.** VDBE 
0e50: 70 72 6f 67 72 61 6d 20 61 6e 64 20 72 65 73 65  program and rese
0e60: 74 73 20 74 68 65 20 70 50 61 72 73 65 20 73 74  ts the pParse st
0e70: 72 75 63 74 75 72 65 20 66 6f 72 20 74 68 65 20  ructure for the 
0e80: 6e 65 78 74 0a 2a 2a 20 70 61 72 73 65 2e 0a 2a  next.** parse..*
0e90: 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 69  *.** Note that i
0ea0: 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
0eb0: 72 65 64 2c 20 69 74 20 6d 69 67 68 74 20 62 65  red, it might be
0ec0: 20 74 68 65 20 63 61 73 65 20 74 68 61 74 0a 2a   the case that.*
0ed0: 2a 20 6e 6f 20 56 44 42 45 20 63 6f 64 65 20 77  * no VDBE code w
0ee0: 61 73 20 67 65 6e 65 72 61 74 65 64 2e 0a 2a 2f  as generated..*/
0ef0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 46 69 6e  .void sqlite3Fin
0f00: 69 73 68 43 6f 64 69 6e 67 28 50 61 72 73 65 20  ishCoding(Parse 
0f10: 2a 70 50 61 72 73 65 29 7b 0a 20 20 73 71 6c 69  *pParse){.  sqli
0f20: 74 65 33 20 2a 64 62 3b 0a 20 20 56 64 62 65 20  te3 *db;.  Vdbe 
0f30: 2a 76 3b 0a 0a 20 20 69 66 28 20 73 71 6c 69 74  *v;..  if( sqlit
0f40: 65 33 4d 61 6c 6c 6f 63 46 61 69 6c 65 64 28 29  e3MallocFailed()
0f50: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
0f60: 20 70 50 61 72 73 65 2d 3e 6e 65 73 74 65 64 20   pParse->nested 
0f70: 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
0f80: 21 70 50 61 72 73 65 2d 3e 70 56 64 62 65 20 29  !pParse->pVdbe )
0f90: 7b 0a 20 20 20 20 69 66 28 20 70 50 61 72 73 65  {.    if( pParse
0fa0: 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
0fb0: 26 26 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20  && pParse->nErr 
0fc0: 29 7b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d  ){.      pParse-
0fd0: 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52  >rc = SQLITE_ERR
0fe0: 4f 52 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  OR;.      return
0ff0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
1000: 2a 20 42 65 67 69 6e 20 62 79 20 67 65 6e 65 72  * Begin by gener
1010: 61 74 69 6e 67 20 73 6f 6d 65 20 74 65 72 6d 69  ating some termi
1020: 6e 61 74 69 6f 6e 20 63 6f 64 65 20 61 74 20 74  nation code at t
1030: 68 65 20 65 6e 64 20 6f 66 20 74 68 65 0a 20 20  he end of the.  
1040: 2a 2a 20 76 64 62 65 20 70 72 6f 67 72 61 6d 0a  ** vdbe program.
1050: 20 20 2a 2f 0a 20 20 64 62 20 3d 20 70 50 61 72    */.  db = pPar
1060: 73 65 2d 3e 64 62 3b 0a 20 20 76 20 3d 20 73 71  se->db;.  v = sq
1070: 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
1080: 72 73 65 29 3b 0a 20 20 69 66 28 20 76 20 29 7b  rse);.  if( v ){
1090: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
10a0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 48 61 6c 74  AddOp(v, OP_Halt
10b0: 2c 20 30 2c 20 30 29 3b 0a 0a 20 20 20 20 2f 2a  , 0, 0);..    /*
10c0: 20 54 68 65 20 63 6f 6f 6b 69 65 20 6d 61 73 6b   The cookie mask
10d0: 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 65 20 62 69   contains one bi
10e0: 74 20 66 6f 72 20 65 61 63 68 20 64 61 74 61 62  t for each datab
10f0: 61 73 65 20 66 69 6c 65 20 6f 70 65 6e 2e 0a 20  ase file open.. 
1100: 20 20 20 2a 2a 20 28 42 69 74 20 30 20 69 73 20     ** (Bit 0 is 
1110: 66 6f 72 20 6d 61 69 6e 2c 20 62 69 74 20 31 20  for main, bit 1 
1120: 69 73 20 66 6f 72 20 74 65 6d 70 2c 20 61 6e 64  is for temp, and
1130: 20 73 6f 20 66 6f 72 74 68 2e 29 20 20 42 69 74   so forth.)  Bit
1140: 73 20 61 72 65 0a 20 20 20 20 2a 2a 20 73 65 74  s are.    ** set
1150: 20 66 6f 72 20 65 61 63 68 20 64 61 74 61 62 61   for each databa
1160: 73 65 20 74 68 61 74 20 69 73 20 75 73 65 64 2e  se that is used.
1170: 20 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20    Generate code 
1180: 74 6f 20 73 74 61 72 74 20 61 0a 20 20 20 20 2a  to start a.    *
1190: 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e  * transaction on
11a0: 20 65 61 63 68 20 75 73 65 64 20 64 61 74 61 62   each used datab
11b0: 61 73 65 20 61 6e 64 20 74 6f 20 76 65 72 69 66  ase and to verif
11c0: 79 20 74 68 65 20 73 63 68 65 6d 61 20 63 6f 6f  y the schema coo
11d0: 6b 69 65 0a 20 20 20 20 2a 2a 20 6f 6e 20 65 61  kie.    ** on ea
11e0: 63 68 20 75 73 65 64 20 64 61 74 61 62 61 73 65  ch used database
11f0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
1200: 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 47   pParse->cookieG
1210: 6f 74 6f 3e 30 20 29 7b 0a 20 20 20 20 20 20 75  oto>0 ){.      u
1220: 33 32 20 6d 61 73 6b 3b 0a 20 20 20 20 20 20 69  32 mask;.      i
1230: 6e 74 20 69 44 62 3b 0a 20 20 20 20 20 20 73 71  nt iDb;.      sq
1240: 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
1250: 65 28 76 2c 20 70 50 61 72 73 65 2d 3e 63 6f 6f  e(v, pParse->coo
1260: 6b 69 65 47 6f 74 6f 2d 31 29 3b 0a 20 20 20 20  kieGoto-1);.    
1270: 20 20 66 6f 72 28 69 44 62 3d 30 2c 20 6d 61 73    for(iDb=0, mas
1280: 6b 3d 31 3b 20 69 44 62 3c 64 62 2d 3e 6e 44 62  k=1; iDb<db->nDb
1290: 3b 20 6d 61 73 6b 3c 3c 3d 31 2c 20 69 44 62 2b  ; mask<<=1, iDb+
12a0: 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
12b0: 28 6d 61 73 6b 20 26 20 70 50 61 72 73 65 2d 3e  (mask & pParse->
12c0: 63 6f 6f 6b 69 65 4d 61 73 6b 29 3d 3d 30 20 29  cookieMask)==0 )
12d0: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
12e0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
12f0: 64 4f 70 28 76 2c 20 4f 50 5f 54 72 61 6e 73 61  dOp(v, OP_Transa
1300: 63 74 69 6f 6e 2c 20 69 44 62 2c 20 28 6d 61 73  ction, iDb, (mas
1310: 6b 20 26 20 70 50 61 72 73 65 2d 3e 77 72 69 74  k & pParse->writ
1320: 65 4d 61 73 6b 29 21 3d 30 29 3b 0a 20 20 20 20  eMask)!=0);.    
1330: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1340: 64 64 4f 70 28 76 2c 20 4f 50 5f 56 65 72 69 66  ddOp(v, OP_Verif
1350: 79 43 6f 6f 6b 69 65 2c 20 69 44 62 2c 20 70 50  yCookie, iDb, pP
1360: 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 56 61 6c 75  arse->cookieValu
1370: 65 5b 69 44 62 5d 29 3b 0a 20 20 20 20 20 20 7d  e[iDb]);.      }
1380: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1390: 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
13a0: 45 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 72  E.      if( pPar
13b0: 73 65 2d 3e 70 56 69 72 74 75 61 6c 4c 6f 63 6b  se->pVirtualLock
13c0: 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72   ){.        char
13d0: 20 2a 76 74 61 62 20 3d 20 28 63 68 61 72 20 2a   *vtab = (char *
13e0: 29 70 50 61 72 73 65 2d 3e 70 56 69 72 74 75 61  )pParse->pVirtua
13f0: 6c 4c 6f 63 6b 2d 3e 70 56 74 61 62 3b 0a 20 20  lLock->pVtab;.  
1400: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1410: 65 4f 70 33 28 76 2c 20 4f 50 5f 56 42 65 67 69  eOp3(v, OP_VBegi
1420: 6e 2c 20 30 2c 20 30 2c 20 76 74 61 62 2c 20 50  n, 0, 0, vtab, P
1430: 33 5f 56 54 41 42 29 3b 0a 20 20 20 20 20 20 7d  3_VTAB);.      }
1440: 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 20 20 2f  .#endif..      /
1450: 2a 20 4f 6e 63 65 20 61 6c 6c 20 74 68 65 20 63  * Once all the c
1460: 6f 6f 6b 69 65 73 20 68 61 76 65 20 62 65 65 6e  ookies have been
1470: 20 76 65 72 69 66 69 65 64 20 61 6e 64 20 74 72   verified and tr
1480: 61 6e 73 61 63 74 69 6f 6e 73 20 6f 70 65 6e 65  ansactions opene
1490: 64 2c 20 0a 20 20 20 20 20 20 2a 2a 20 6f 62 74  d, .      ** obt
14a0: 61 69 6e 20 74 68 65 20 72 65 71 75 69 72 65 64  ain the required
14b0: 20 74 61 62 6c 65 2d 6c 6f 63 6b 73 2e 20 54 68   table-locks. Th
14c0: 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 20 75 6e  is is a no-op un
14d0: 6c 65 73 73 20 74 68 65 20 0a 20 20 20 20 20 20  less the .      
14e0: 2a 2a 20 73 68 61 72 65 64 2d 63 61 63 68 65 20  ** shared-cache 
14f0: 66 65 61 74 75 72 65 20 69 73 20 65 6e 61 62 6c  feature is enabl
1500: 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ed..      */.   
1510: 20 20 20 63 6f 64 65 54 61 62 6c 65 4c 6f 63 6b     codeTableLock
1520: 73 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  s(pParse);.     
1530: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1540: 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c  p(v, OP_Goto, 0,
1550: 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 47   pParse->cookieG
1560: 6f 74 6f 29 3b 0a 20 20 20 20 7d 0a 0a 23 69 66  oto);.    }..#if
1570: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1580: 5f 54 52 41 43 45 0a 20 20 20 20 2f 2a 20 41 64  _TRACE.    /* Ad
1590: 64 20 61 20 4e 6f 2d 6f 70 20 74 68 61 74 20 63  d a No-op that c
15a0: 6f 6e 74 61 69 6e 73 20 74 68 65 20 63 6f 6d 70  ontains the comp
15b0: 6c 65 74 65 20 74 65 78 74 20 6f 66 20 74 68 65  lete text of the
15c0: 20 63 6f 6d 70 69 6c 65 64 20 53 51 4c 0a 20 20   compiled SQL.  
15d0: 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 61    ** statement a
15e0: 73 20 69 74 73 20 50 33 20 61 72 67 75 6d 65 6e  s its P3 argumen
15f0: 74 2e 20 20 54 68 69 73 20 64 6f 65 73 20 6e 6f  t.  This does no
1600: 74 20 63 68 61 6e 67 65 20 74 68 65 20 66 75 6e  t change the fun
1610: 63 74 69 6f 6e 61 6c 69 74 79 0a 20 20 20 20 2a  ctionality.    *
1620: 2a 20 6f 66 20 74 68 65 20 70 72 6f 67 72 61 6d  * of the program
1630: 2e 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  . .    **.    **
1640: 20 54 68 69 73 20 69 73 20 75 73 65 64 20 74 6f   This is used to
1650: 20 69 6d 70 6c 65 6d 65 6e 74 20 73 71 6c 69 74   implement sqlit
1660: 65 33 5f 74 72 61 63 65 28 29 2e 0a 20 20 20 20  e3_trace()..    
1670: 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  */.    sqlite3Vd
1680: 62 65 4f 70 33 28 76 2c 20 4f 50 5f 4e 6f 6f 70  beOp3(v, OP_Noop
1690: 2c 20 30 2c 20 30 2c 20 70 50 61 72 73 65 2d 3e  , 0, 0, pParse->
16a0: 7a 53 71 6c 2c 20 70 50 61 72 73 65 2d 3e 7a 54  zSql, pParse->zT
16b0: 61 69 6c 2d 70 50 61 72 73 65 2d 3e 7a 53 71 6c  ail-pParse->zSql
16c0: 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  );.#endif /* SQL
16d0: 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 20 2a  ITE_OMIT_TRACE *
16e0: 2f 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20 47 65 74  /.  }...  /* Get
16f0: 20 74 68 65 20 56 44 42 45 20 70 72 6f 67 72 61   the VDBE progra
1700: 6d 20 72 65 61 64 79 20 66 6f 72 20 65 78 65 63  m ready for exec
1710: 75 74 69 6f 6e 0a 20 20 2a 2f 0a 20 20 69 66 28  ution.  */.  if(
1720: 20 76 20 26 26 20 70 50 61 72 73 65 2d 3e 6e 45   v && pParse->nE
1730: 72 72 3d 3d 30 20 26 26 20 21 73 71 6c 69 74 65  rr==0 && !sqlite
1740: 33 4d 61 6c 6c 6f 63 46 61 69 6c 65 64 28 29 20  3MallocFailed() 
1750: 29 7b 0a 20 20 20 20 46 49 4c 45 20 2a 74 72 61  ){.    FILE *tra
1760: 63 65 20 3d 20 28 64 62 2d 3e 66 6c 61 67 73 20  ce = (db->flags 
1770: 26 20 53 51 4c 49 54 45 5f 56 64 62 65 54 72 61  & SQLITE_VdbeTra
1780: 63 65 29 21 3d 30 20 3f 20 73 74 64 6f 75 74 20  ce)!=0 ? stdout 
1790: 3a 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  : 0;.    sqlite3
17a0: 56 64 62 65 54 72 61 63 65 28 76 2c 20 74 72 61  VdbeTrace(v, tra
17b0: 63 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ce);.    sqlite3
17c0: 56 64 62 65 4d 61 6b 65 52 65 61 64 79 28 76 2c  VdbeMakeReady(v,
17d0: 20 70 50 61 72 73 65 2d 3e 6e 56 61 72 2c 20 70   pParse->nVar, p
17e0: 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 33 2c 0a 20  Parse->nMem+3,. 
17f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1800: 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e          pParse->
1810: 6e 54 61 62 2b 33 2c 20 70 50 61 72 73 65 2d 3e  nTab+3, pParse->
1820: 65 78 70 6c 61 69 6e 29 3b 0a 20 20 20 20 70 50  explain);.    pP
1830: 61 72 73 65 2d 3e 72 63 20 3d 20 53 51 4c 49 54  arse->rc = SQLIT
1840: 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 70 50 61 72  E_DONE;.    pPar
1850: 73 65 2d 3e 63 6f 6c 4e 61 6d 65 73 53 65 74 20  se->colNamesSet 
1860: 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  = 0;.  }else if(
1870: 20 70 50 61 72 73 65 2d 3e 72 63 3d 3d 53 51 4c   pParse->rc==SQL
1880: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 50  ITE_OK ){.    pP
1890: 61 72 73 65 2d 3e 72 63 20 3d 20 53 51 4c 49 54  arse->rc = SQLIT
18a0: 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 70  E_ERROR;.  }.  p
18b0: 50 61 72 73 65 2d 3e 6e 54 61 62 20 3d 20 30 3b  Parse->nTab = 0;
18c0: 0a 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20  .  pParse->nMem 
18d0: 3d 20 30 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e  = 0;.  pParse->n
18e0: 53 65 74 20 3d 20 30 3b 0a 20 20 70 50 61 72 73  Set = 0;.  pPars
18f0: 65 2d 3e 6e 56 61 72 20 3d 20 30 3b 0a 20 20 70  e->nVar = 0;.  p
1900: 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 4d 61 73  Parse->cookieMas
1910: 6b 20 3d 20 30 3b 0a 20 20 70 50 61 72 73 65 2d  k = 0;.  pParse-
1920: 3e 63 6f 6f 6b 69 65 47 6f 74 6f 20 3d 20 30 3b  >cookieGoto = 0;
1930: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 75 6e 20 74 68  .}../*.** Run th
1940: 65 20 70 61 72 73 65 72 20 61 6e 64 20 63 6f 64  e parser and cod
1950: 65 20 67 65 6e 65 72 61 74 6f 72 20 72 65 63 75  e generator recu
1960: 72 73 69 76 65 6c 79 20 69 6e 20 6f 72 64 65 72  rsively in order
1970: 20 74 6f 20 67 65 6e 65 72 61 74 65 0a 2a 2a 20   to generate.** 
1980: 63 6f 64 65 20 66 6f 72 20 74 68 65 20 53 51 4c  code for the SQL
1990: 20 73 74 61 74 65 6d 65 6e 74 20 67 69 76 65 6e   statement given
19a0: 20 6f 6e 74 6f 20 74 68 65 20 65 6e 64 20 6f 66   onto the end of
19b0: 20 74 68 65 20 70 50 61 72 73 65 20 63 6f 6e 74   the pParse cont
19c0: 65 78 74 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79  ext.** currently
19d0: 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74   under construct
19e0: 69 6f 6e 2e 20 20 57 68 65 6e 20 74 68 65 20 70  ion.  When the p
19f0: 61 72 73 65 72 20 69 73 20 72 75 6e 20 72 65 63  arser is run rec
1a00: 75 72 73 69 76 65 6c 79 0a 2a 2a 20 74 68 69 73  ursively.** this
1a10: 20 77 61 79 2c 20 74 68 65 20 66 69 6e 61 6c 20   way, the final 
1a20: 4f 50 5f 48 61 6c 74 20 69 73 20 6e 6f 74 20 61  OP_Halt is not a
1a30: 70 70 65 6e 64 65 64 20 61 6e 64 20 6f 74 68 65  ppended and othe
1a40: 72 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e  r initialization
1a50: 0a 2a 2a 20 61 6e 64 20 66 69 6e 61 6c 69 7a 61  .** and finaliza
1a60: 74 69 6f 6e 20 73 74 65 70 73 20 61 72 65 20 6f  tion steps are o
1a70: 6d 69 74 74 65 64 20 62 65 63 61 75 73 65 20 74  mitted because t
1a80: 68 6f 73 65 20 61 72 65 20 68 61 6e 64 6c 69 6e  hose are handlin
1a90: 67 20 62 79 20 74 68 65 0a 2a 2a 20 6f 75 74 65  g by the.** oute
1aa0: 72 6d 6f 73 74 20 70 61 72 73 65 72 2e 0a 2a 2a  rmost parser..**
1ab0: 0a 2a 2a 20 4e 6f 74 20 65 76 65 72 79 74 68 69  .** Not everythi
1ac0: 6e 67 20 69 73 20 6e 65 73 74 61 62 6c 65 2e 20  ng is nestable. 
1ad0: 20 54 68 69 73 20 66 61 63 69 6c 69 74 79 20 69   This facility i
1ae0: 73 20 64 65 73 69 67 6e 65 64 20 74 6f 20 70 65  s designed to pe
1af0: 72 6d 69 74 0a 2a 2a 20 49 4e 53 45 52 54 2c 20  rmit.** INSERT, 
1b00: 55 50 44 41 54 45 2c 20 61 6e 64 20 44 45 4c 45  UPDATE, and DELE
1b10: 54 45 20 6f 70 65 72 61 74 69 6f 6e 73 20 61 67  TE operations ag
1b20: 61 69 6e 73 74 20 53 51 4c 49 54 45 5f 4d 41 53  ainst SQLITE_MAS
1b30: 54 45 52 2e 20 20 55 73 65 0a 2a 2a 20 63 61 72  TER.  Use.** car
1b40: 65 20 69 66 20 79 6f 75 20 64 65 63 69 64 65 20  e if you decide 
1b50: 74 6f 20 74 72 79 20 74 6f 20 75 73 65 20 74 68  to try to use th
1b60: 69 73 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 73  is routine for s
1b70: 6f 6d 65 20 6f 74 68 65 72 20 70 75 72 70 6f 73  ome other purpos
1b80: 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  es..*/.void sqli
1b90: 74 65 33 4e 65 73 74 65 64 50 61 72 73 65 28 50  te3NestedParse(P
1ba0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 63 6f  arse *pParse, co
1bb0: 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61  nst char *zForma
1bc0: 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69  t, ...){.  va_li
1bd0: 73 74 20 61 70 3b 0a 20 20 63 68 61 72 20 2a 7a  st ap;.  char *z
1be0: 53 71 6c 3b 0a 23 20 64 65 66 69 6e 65 20 53 41  Sql;.# define SA
1bf0: 56 45 5f 53 5a 20 20 28 73 69 7a 65 6f 66 28 50  VE_SZ  (sizeof(P
1c00: 61 72 73 65 29 20 2d 20 6f 66 66 73 65 74 6f 66  arse) - offsetof
1c10: 28 50 61 72 73 65 2c 6e 56 61 72 29 29 0a 20 20  (Parse,nVar)).  
1c20: 63 68 61 72 20 73 61 76 65 42 75 66 5b 53 41 56  char saveBuf[SAV
1c30: 45 5f 53 5a 5d 3b 0a 0a 20 20 69 66 28 20 70 50  E_SZ];..  if( pP
1c40: 61 72 73 65 2d 3e 6e 45 72 72 20 29 20 72 65 74  arse->nErr ) ret
1c50: 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 70  urn;.  assert( p
1c60: 50 61 72 73 65 2d 3e 6e 65 73 74 65 64 3c 31 30  Parse->nested<10
1c70: 20 29 3b 20 20 2f 2a 20 4e 65 73 74 69 6e 67 20   );  /* Nesting 
1c80: 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 62 65 20 6f  should only be o
1c90: 66 20 6c 69 6d 69 74 65 64 20 64 65 70 74 68 20  f limited depth 
1ca0: 2a 2f 0a 20 20 76 61 5f 73 74 61 72 74 28 61 70  */.  va_start(ap
1cb0: 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a 20 20 7a 53  , zFormat);.  zS
1cc0: 71 6c 20 3d 20 73 71 6c 69 74 65 33 56 4d 50 72  ql = sqlite3VMPr
1cd0: 69 6e 74 66 28 7a 46 6f 72 6d 61 74 2c 20 61 70  intf(zFormat, ap
1ce0: 29 3b 0a 20 20 76 61 5f 65 6e 64 28 61 70 29 3b  );.  va_end(ap);
1cf0: 0a 20 20 69 66 28 20 7a 53 71 6c 3d 3d 30 20 29  .  if( zSql==0 )
1d00: 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 20 20 20  {.    return;   
1d10: 2f 2a 20 41 20 6d 61 6c 6c 6f 63 20 6d 75 73 74  /* A malloc must
1d20: 20 68 61 76 65 20 66 61 69 6c 65 64 20 2a 2f 0a   have failed */.
1d30: 20 20 7d 0a 20 20 70 50 61 72 73 65 2d 3e 6e 65    }.  pParse->ne
1d40: 73 74 65 64 2b 2b 3b 0a 20 20 6d 65 6d 63 70 79  sted++;.  memcpy
1d50: 28 73 61 76 65 42 75 66 2c 20 26 70 50 61 72 73  (saveBuf, &pPars
1d60: 65 2d 3e 6e 56 61 72 2c 20 53 41 56 45 5f 53 5a  e->nVar, SAVE_SZ
1d70: 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26 70 50 61  );.  memset(&pPa
1d80: 72 73 65 2d 3e 6e 56 61 72 2c 20 30 2c 20 53 41  rse->nVar, 0, SA
1d90: 56 45 5f 53 5a 29 3b 0a 20 20 73 71 6c 69 74 65  VE_SZ);.  sqlite
1da0: 33 52 75 6e 50 61 72 73 65 72 28 70 50 61 72 73  3RunParser(pPars
1db0: 65 2c 20 7a 53 71 6c 2c 20 30 29 3b 0a 20 20 73  e, zSql, 0);.  s
1dc0: 71 6c 69 74 65 46 72 65 65 28 7a 53 71 6c 29 3b  qliteFree(zSql);
1dd0: 0a 20 20 6d 65 6d 63 70 79 28 26 70 50 61 72 73  .  memcpy(&pPars
1de0: 65 2d 3e 6e 56 61 72 2c 20 73 61 76 65 42 75 66  e->nVar, saveBuf
1df0: 2c 20 53 41 56 45 5f 53 5a 29 3b 0a 20 20 70 50  , SAVE_SZ);.  pP
1e00: 61 72 73 65 2d 3e 6e 65 73 74 65 64 2d 2d 3b 0a  arse->nested--;.
1e10: 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61 74 65 20  }../*.** Locate 
1e20: 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 73 74  the in-memory st
1e30: 72 75 63 74 75 72 65 20 74 68 61 74 20 64 65 73  ructure that des
1e40: 63 72 69 62 65 73 20 61 20 70 61 72 74 69 63 75  cribes a particu
1e50: 6c 61 72 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  lar database.** 
1e60: 74 61 62 6c 65 20 67 69 76 65 6e 20 74 68 65 20  table given the 
1e70: 6e 61 6d 65 20 6f 66 20 74 68 61 74 20 74 61 62  name of that tab
1e80: 6c 65 20 61 6e 64 20 28 6f 70 74 69 6f 6e 61 6c  le and (optional
1e90: 6c 79 29 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  ly) the name of 
1ea0: 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  the.** database 
1eb0: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 74  containing the t
1ec0: 61 62 6c 65 2e 20 20 52 65 74 75 72 6e 20 4e 55  able.  Return NU
1ed0: 4c 4c 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e  LL if not found.
1ee0: 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 44 61 74 61 62  .**.** If zDatab
1ef0: 61 73 65 20 69 73 20 30 2c 20 61 6c 6c 20 64 61  ase is 0, all da
1f00: 74 61 62 61 73 65 73 20 61 72 65 20 73 65 61 72  tabases are sear
1f10: 63 68 65 64 20 66 6f 72 20 74 68 65 20 74 61 62  ched for the tab
1f20: 6c 65 20 61 6e 64 20 74 68 65 0a 2a 2a 20 66 69  le and the.** fi
1f30: 72 73 74 20 6d 61 74 63 68 69 6e 67 20 74 61 62  rst matching tab
1f40: 6c 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  le is returned. 
1f50: 20 28 4e 6f 20 63 68 65 63 6b 69 6e 67 20 66 6f   (No checking fo
1f60: 72 20 64 75 70 6c 69 63 61 74 65 20 74 61 62 6c  r duplicate tabl
1f70: 65 0a 2a 2a 20 6e 61 6d 65 73 20 69 73 20 64 6f  e.** names is do
1f80: 6e 65 2e 29 20 20 54 68 65 20 73 65 61 72 63 68  ne.)  The search
1f90: 20 6f 72 64 65 72 20 69 73 20 54 45 4d 50 20 66   order is TEMP f
1fa0: 69 72 73 74 2c 20 74 68 65 6e 20 4d 41 49 4e 2c  irst, then MAIN,
1fb0: 20 74 68 65 6e 20 61 6e 79 0a 2a 2a 20 61 75 78   then any.** aux
1fc0: 69 6c 69 61 72 79 20 64 61 74 61 62 61 73 65 73  iliary databases
1fd0: 20 61 64 64 65 64 20 75 73 69 6e 67 20 74 68 65   added using the
1fe0: 20 41 54 54 41 43 48 20 63 6f 6d 6d 61 6e 64 2e   ATTACH command.
1ff0: 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20  .**.** See also 
2000: 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62  sqlite3LocateTab
2010: 6c 65 28 29 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a  le()..*/.Table *
2020: 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65  sqlite3FindTable
2030: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f  (sqlite3 *db, co
2040: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c  nst char *zName,
2050: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 61   const char *zDa
2060: 74 61 62 61 73 65 29 7b 0a 20 20 54 61 62 6c 65  tabase){.  Table
2070: 20 2a 70 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69   *p = 0;.  int i
2080: 3b 0a 20 20 61 73 73 65 72 74 28 20 7a 4e 61 6d  ;.  assert( zNam
2090: 65 21 3d 30 20 29 3b 0a 20 20 66 6f 72 28 69 3d  e!=0 );.  for(i=
20a0: 4f 4d 49 54 5f 54 45 4d 50 44 42 3b 20 69 3c 64  OMIT_TEMPDB; i<d
20b0: 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20  b->nDb; i++){.  
20c0: 20 20 69 6e 74 20 6a 20 3d 20 28 69 3c 32 29 20    int j = (i<2) 
20d0: 3f 20 69 5e 31 20 3a 20 69 3b 20 20 20 2f 2a 20  ? i^1 : i;   /* 
20e0: 53 65 61 72 63 68 20 54 45 4d 50 20 62 65 66 6f  Search TEMP befo
20f0: 72 65 20 4d 41 49 4e 20 2a 2f 0a 20 20 20 20 69  re MAIN */.    i
2100: 66 28 20 7a 44 61 74 61 62 61 73 65 21 3d 30 20  f( zDatabase!=0 
2110: 26 26 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  && sqlite3StrICm
2120: 70 28 7a 44 61 74 61 62 61 73 65 2c 20 64 62 2d  p(zDatabase, db-
2130: 3e 61 44 62 5b 6a 5d 2e 7a 4e 61 6d 65 29 20 29  >aDb[j].zName) )
2140: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 70   continue;.    p
2150: 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68 46 69   = sqlite3HashFi
2160: 6e 64 28 26 64 62 2d 3e 61 44 62 5b 6a 5d 2e 70  nd(&db->aDb[j].p
2170: 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68 2c  Schema->tblHash,
2180: 20 7a 4e 61 6d 65 2c 20 73 74 72 6c 65 6e 28 7a   zName, strlen(z
2190: 4e 61 6d 65 29 2b 31 29 3b 0a 20 20 20 20 69 66  Name)+1);.    if
21a0: 28 20 70 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d  ( p ) break;.  }
21b0: 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a  .  return p;.}..
21c0: 2f 2a 0a 2a 2a 20 4c 6f 63 61 74 65 20 74 68 65  /*.** Locate the
21d0: 20 69 6e 2d 6d 65 6d 6f 72 79 20 73 74 72 75 63   in-memory struc
21e0: 74 75 72 65 20 74 68 61 74 20 64 65 73 63 72 69  ture that descri
21f0: 62 65 73 20 61 20 70 61 72 74 69 63 75 6c 61 72  bes a particular
2200: 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 74 61 62   database.** tab
2210: 6c 65 20 67 69 76 65 6e 20 74 68 65 20 6e 61 6d  le given the nam
2220: 65 20 6f 66 20 74 68 61 74 20 74 61 62 6c 65 20  e of that table 
2230: 61 6e 64 20 28 6f 70 74 69 6f 6e 61 6c 6c 79 29  and (optionally)
2240: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
2250: 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 63 6f 6e  .** database con
2260: 74 61 69 6e 69 6e 67 20 74 68 65 20 74 61 62 6c  taining the tabl
2270: 65 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20  e.  Return NULL 
2280: 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 20 20 41  if not found.  A
2290: 6c 73 6f 20 6c 65 61 76 65 20 61 6e 0a 2a 2a 20  lso leave an.** 
22a0: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e  error message in
22b0: 20 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67   pParse->zErrMsg
22c0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 69 66 66  ..**.** The diff
22d0: 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20 74  erence between t
22e0: 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6e 64 20  his routine and 
22f0: 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65  sqlite3FindTable
2300: 28 29 20 69 73 20 74 68 61 74 20 74 68 69 73 0a  () is that this.
2310: 2a 2a 20 72 6f 75 74 69 6e 65 20 6c 65 61 76 65  ** routine leave
2320: 73 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61  s an error messa
2330: 67 65 20 69 6e 20 70 50 61 72 73 65 2d 3e 7a 45  ge in pParse->zE
2340: 72 72 4d 73 67 20 77 68 65 72 65 0a 2a 2a 20 73  rrMsg where.** s
2350: 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28  qlite3FindTable(
2360: 29 20 64 6f 65 73 20 6e 6f 74 2e 0a 2a 2f 0a 54  ) does not..*/.T
2370: 61 62 6c 65 20 2a 73 71 6c 69 74 65 33 4c 6f 63  able *sqlite3Loc
2380: 61 74 65 54 61 62 6c 65 28 50 61 72 73 65 20 2a  ateTable(Parse *
2390: 70 50 61 72 73 65 2c 20 63 6f 6e 73 74 20 63 68  pParse, const ch
23a0: 61 72 20 2a 7a 4e 61 6d 65 2c 20 63 6f 6e 73 74  ar *zName, const
23b0: 20 63 68 61 72 20 2a 7a 44 62 61 73 65 29 7b 0a   char *zDbase){.
23c0: 20 20 54 61 62 6c 65 20 2a 70 3b 0a 0a 20 20 2f    Table *p;..  /
23d0: 2a 20 52 65 61 64 20 74 68 65 20 64 61 74 61 62  * Read the datab
23e0: 61 73 65 20 73 63 68 65 6d 61 2e 20 49 66 20 61  ase schema. If a
23f0: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
2400: 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d  leave an error m
2410: 65 73 73 61 67 65 0a 20 20 2a 2a 20 61 6e 64 20  essage.  ** and 
2420: 63 6f 64 65 20 69 6e 20 70 50 61 72 73 65 20 61  code in pParse a
2430: 6e 64 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 20  nd return NULL. 
2440: 2a 2f 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f  */.  if( SQLITE_
2450: 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65 61 64 53  OK!=sqlite3ReadS
2460: 63 68 65 6d 61 28 70 50 61 72 73 65 29 20 29 7b  chema(pParse) ){
2470: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
2480: 20 7d 0a 0a 20 20 70 20 3d 20 73 71 6c 69 74 65   }..  p = sqlite
2490: 33 46 69 6e 64 54 61 62 6c 65 28 70 50 61 72 73  3FindTable(pPars
24a0: 65 2d 3e 64 62 2c 20 7a 4e 61 6d 65 2c 20 7a 44  e->db, zName, zD
24b0: 62 61 73 65 29 3b 0a 20 20 69 66 28 20 70 3d 3d  base);.  if( p==
24c0: 30 20 29 7b 0a 20 20 20 20 69 66 28 20 7a 44 62  0 ){.    if( zDb
24d0: 61 73 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ase ){.      sql
24e0: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
24f0: 72 73 65 2c 20 22 6e 6f 20 73 75 63 68 20 74 61  rse, "no such ta
2500: 62 6c 65 3a 20 25 73 2e 25 73 22 2c 20 7a 44 62  ble: %s.%s", zDb
2510: 61 73 65 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20  ase, zName);.   
2520: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71   }else{.      sq
2530: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
2540: 61 72 73 65 2c 20 22 6e 6f 20 73 75 63 68 20 74  arse, "no such t
2550: 61 62 6c 65 3a 20 25 73 22 2c 20 7a 4e 61 6d 65  able: %s", zName
2560: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61  );.    }.    pPa
2570: 72 73 65 2d 3e 63 68 65 63 6b 53 63 68 65 6d 61  rse->checkSchema
2580: 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75   = 1;.  }.  retu
2590: 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c  rn p;.}../*.** L
25a0: 6f 63 61 74 65 20 74 68 65 20 69 6e 2d 6d 65 6d  ocate the in-mem
25b0: 6f 72 79 20 73 74 72 75 63 74 75 72 65 20 74 68  ory structure th
25c0: 61 74 20 64 65 73 63 72 69 62 65 73 20 0a 2a 2a  at describes .**
25d0: 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 69 6e   a particular in
25e0: 64 65 78 20 67 69 76 65 6e 20 74 68 65 20 6e 61  dex given the na
25f0: 6d 65 20 6f 66 20 74 68 61 74 20 69 6e 64 65 78  me of that index
2600: 0a 2a 2a 20 61 6e 64 20 74 68 65 20 6e 61 6d 65  .** and the name
2610: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
2620: 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74   that contains t
2630: 68 65 20 69 6e 64 65 78 2e 0a 2a 2a 20 52 65 74  he index..** Ret
2640: 75 72 6e 20 4e 55 4c 4c 20 69 66 20 6e 6f 74 20  urn NULL if not 
2650: 66 6f 75 6e 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  found..**.** If 
2660: 7a 44 61 74 61 62 61 73 65 20 69 73 20 30 2c 20  zDatabase is 0, 
2670: 61 6c 6c 20 64 61 74 61 62 61 73 65 73 20 61 72  all databases ar
2680: 65 20 73 65 61 72 63 68 65 64 20 66 6f 72 20 74  e searched for t
2690: 68 65 0a 2a 2a 20 74 61 62 6c 65 20 61 6e 64 20  he.** table and 
26a0: 74 68 65 20 66 69 72 73 74 20 6d 61 74 63 68 69  the first matchi
26b0: 6e 67 20 69 6e 64 65 78 20 69 73 20 72 65 74 75  ng index is retu
26c0: 72 6e 65 64 2e 20 20 28 4e 6f 20 63 68 65 63 6b  rned.  (No check
26d0: 69 6e 67 0a 2a 2a 20 66 6f 72 20 64 75 70 6c 69  ing.** for dupli
26e0: 63 61 74 65 20 69 6e 64 65 78 20 6e 61 6d 65 73  cate index names
26f0: 20 69 73 20 64 6f 6e 65 2e 29 20 20 54 68 65 20   is done.)  The 
2700: 73 65 61 72 63 68 20 6f 72 64 65 72 20 69 73 0a  search order is.
2710: 2a 2a 20 54 45 4d 50 20 66 69 72 73 74 2c 20 74  ** TEMP first, t
2720: 68 65 6e 20 4d 41 49 4e 2c 20 74 68 65 6e 20 61  hen MAIN, then a
2730: 6e 79 20 61 75 78 69 6c 69 61 72 79 20 64 61 74  ny auxiliary dat
2740: 61 62 61 73 65 73 20 61 64 64 65 64 0a 2a 2a 20  abases added.** 
2750: 75 73 69 6e 67 20 74 68 65 20 41 54 54 41 43 48  using the ATTACH
2760: 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2f 0a 49 6e 64   command..*/.Ind
2770: 65 78 20 2a 73 71 6c 69 74 65 33 46 69 6e 64 49  ex *sqlite3FindI
2780: 6e 64 65 78 28 73 71 6c 69 74 65 33 20 2a 64 62  ndex(sqlite3 *db
2790: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e  , const char *zN
27a0: 61 6d 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  ame, const char 
27b0: 2a 7a 44 62 29 7b 0a 20 20 49 6e 64 65 78 20 2a  *zDb){.  Index *
27c0: 70 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a  p = 0;.  int i;.
27d0: 20 20 66 6f 72 28 69 3d 4f 4d 49 54 5f 54 45 4d    for(i=OMIT_TEM
27e0: 50 44 42 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20  PDB; i<db->nDb; 
27f0: 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6a 20  i++){.    int j 
2800: 3d 20 28 69 3c 32 29 20 3f 20 69 5e 31 20 3a 20  = (i<2) ? i^1 : 
2810: 69 3b 20 20 2f 2a 20 53 65 61 72 63 68 20 54 45  i;  /* Search TE
2820: 4d 50 20 62 65 66 6f 72 65 20 4d 41 49 4e 20 2a  MP before MAIN *
2830: 2f 0a 20 20 20 20 53 63 68 65 6d 61 20 2a 70 53  /.    Schema *pS
2840: 63 68 65 6d 61 20 3d 20 64 62 2d 3e 61 44 62 5b  chema = db->aDb[
2850: 6a 5d 2e 70 53 63 68 65 6d 61 3b 0a 20 20 20 20  j].pSchema;.    
2860: 69 66 28 20 7a 44 62 20 26 26 20 73 71 6c 69 74  if( zDb && sqlit
2870: 65 33 53 74 72 49 43 6d 70 28 7a 44 62 2c 20 64  e3StrICmp(zDb, d
2880: 62 2d 3e 61 44 62 5b 6a 5d 2e 7a 4e 61 6d 65 29  b->aDb[j].zName)
2890: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
28a0: 20 61 73 73 65 72 74 28 20 70 53 63 68 65 6d 61   assert( pSchema
28b0: 20 7c 7c 20 28 6a 3d 3d 31 20 26 26 20 21 64 62   || (j==1 && !db
28c0: 2d 3e 61 44 62 5b 31 5d 2e 70 42 74 29 20 29 3b  ->aDb[1].pBt) );
28d0: 0a 20 20 20 20 69 66 28 20 70 53 63 68 65 6d 61  .    if( pSchema
28e0: 20 29 7b 0a 20 20 20 20 20 20 70 20 3d 20 73 71   ){.      p = sq
28f0: 6c 69 74 65 33 48 61 73 68 46 69 6e 64 28 26 70  lite3HashFind(&p
2900: 53 63 68 65 6d 61 2d 3e 69 64 78 48 61 73 68 2c  Schema->idxHash,
2910: 20 7a 4e 61 6d 65 2c 20 73 74 72 6c 65 6e 28 7a   zName, strlen(z
2920: 4e 61 6d 65 29 2b 31 29 3b 0a 20 20 20 20 7d 0a  Name)+1);.    }.
2930: 20 20 20 20 69 66 28 20 70 20 29 20 62 72 65 61      if( p ) brea
2940: 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  k;.  }.  return 
2950: 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6c  p;.}../*.** Recl
2960: 61 69 6d 20 74 68 65 20 6d 65 6d 6f 72 79 20 75  aim the memory u
2970: 73 65 64 20 62 79 20 61 6e 20 69 6e 64 65 78 0a  sed by an index.
2980: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
2990: 72 65 65 49 6e 64 65 78 28 49 6e 64 65 78 20 2a  reeIndex(Index *
29a0: 70 29 7b 0a 20 20 73 71 6c 69 74 65 46 72 65 65  p){.  sqliteFree
29b0: 28 70 2d 3e 7a 43 6f 6c 41 66 66 29 3b 0a 20 20  (p->zColAff);.  
29c0: 73 71 6c 69 74 65 46 72 65 65 28 70 29 3b 0a 7d  sqliteFree(p);.}
29d0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 74  ../*.** Remove t
29e0: 68 65 20 67 69 76 65 6e 20 69 6e 64 65 78 20 66  he given index f
29f0: 72 6f 6d 20 74 68 65 20 69 6e 64 65 78 20 68 61  rom the index ha
2a00: 73 68 20 74 61 62 6c 65 2c 20 61 6e 64 20 66 72  sh table, and fr
2a10: 65 65 0a 2a 2a 20 69 74 73 20 6d 65 6d 6f 72 79  ee.** its memory
2a20: 20 73 74 72 75 63 74 75 72 65 73 2e 0a 2a 2a 0a   structures..**.
2a30: 2a 2a 20 54 68 65 20 69 6e 64 65 78 20 69 73 20  ** The index is 
2a40: 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65  removed from the
2a50: 20 64 61 74 61 62 61 73 65 20 68 61 73 68 20 74   database hash t
2a60: 61 62 6c 65 73 20 62 75 74 0a 2a 2a 20 69 74 20  ables but.** it 
2a70: 69 73 20 6e 6f 74 20 75 6e 6c 69 6e 6b 65 64 20  is not unlinked 
2a80: 66 72 6f 6d 20 74 68 65 20 54 61 62 6c 65 20 74  from the Table t
2a90: 68 61 74 20 69 74 20 69 6e 64 65 78 65 73 2e 0a  hat it indexes..
2aa0: 2a 2a 20 55 6e 6c 69 6e 6b 69 6e 67 20 66 72 6f  ** Unlinking fro
2ab0: 6d 20 74 68 65 20 54 61 62 6c 65 20 6d 75 73 74  m the Table must
2ac0: 20 62 65 20 64 6f 6e 65 20 62 79 20 74 68 65 20   be done by the 
2ad0: 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e  calling function
2ae0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
2af0: 20 73 71 6c 69 74 65 44 65 6c 65 74 65 49 6e 64   sqliteDeleteInd
2b00: 65 78 28 49 6e 64 65 78 20 2a 70 29 7b 0a 20 20  ex(Index *p){.  
2b10: 49 6e 64 65 78 20 2a 70 4f 6c 64 3b 0a 20 20 63  Index *pOld;.  c
2b20: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
2b30: 20 3d 20 70 2d 3e 7a 4e 61 6d 65 3b 0a 0a 20 20   = p->zName;..  
2b40: 70 4f 6c 64 20 3d 20 73 71 6c 69 74 65 33 48 61  pOld = sqlite3Ha
2b50: 73 68 49 6e 73 65 72 74 28 26 70 2d 3e 70 53 63  shInsert(&p->pSc
2b60: 68 65 6d 61 2d 3e 69 64 78 48 61 73 68 2c 20 7a  hema->idxHash, z
2b70: 4e 61 6d 65 2c 20 73 74 72 6c 65 6e 28 20 7a 4e  Name, strlen( zN
2b80: 61 6d 65 29 2b 31 2c 20 30 29 3b 0a 20 20 61 73  ame)+1, 0);.  as
2b90: 73 65 72 74 28 20 70 4f 6c 64 3d 3d 30 20 7c 7c  sert( pOld==0 ||
2ba0: 20 70 4f 6c 64 3d 3d 70 20 29 3b 0a 20 20 66 72   pOld==p );.  fr
2bb0: 65 65 49 6e 64 65 78 28 70 29 3b 0a 7d 0a 0a 2f  eeIndex(p);.}../
2bc0: 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20 69 6e 64  *.** For the ind
2bd0: 65 78 20 63 61 6c 6c 65 64 20 7a 49 64 78 4e 61  ex called zIdxNa
2be0: 6d 65 20 77 68 69 63 68 20 69 73 20 66 6f 75 6e  me which is foun
2bf0: 64 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  d in the databas
2c00: 65 20 69 44 62 2c 0a 2a 2a 20 75 6e 6c 69 6b 65  e iDb,.** unlike
2c10: 20 74 68 61 74 20 69 6e 64 65 78 20 66 72 6f 6d   that index from
2c20: 20 69 74 73 20 54 61 62 6c 65 20 74 68 65 6e 20   its Table then 
2c30: 72 65 6d 6f 76 65 20 74 68 65 20 69 6e 64 65 78  remove the index
2c40: 20 66 72 6f 6d 0a 2a 2a 20 74 68 65 20 69 6e 64   from.** the ind
2c50: 65 78 20 68 61 73 68 20 74 61 62 6c 65 20 61 6e  ex hash table an
2c60: 64 20 66 72 65 65 20 61 6c 6c 20 6d 65 6d 6f 72  d free all memor
2c70: 79 20 73 74 72 75 63 74 75 72 65 73 20 61 73 73  y structures ass
2c80: 6f 63 69 61 74 65 64 0a 2a 2a 20 77 69 74 68 20  ociated.** with 
2c90: 74 68 65 20 69 6e 64 65 78 2e 0a 2a 2f 0a 76 6f  the index..*/.vo
2ca0: 69 64 20 73 71 6c 69 74 65 33 55 6e 6c 69 6e 6b  id sqlite3Unlink
2cb0: 41 6e 64 44 65 6c 65 74 65 49 6e 64 65 78 28 73  AndDeleteIndex(s
2cc0: 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20  qlite3 *db, int 
2cd0: 69 44 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  iDb, const char 
2ce0: 2a 7a 49 64 78 4e 61 6d 65 29 7b 0a 20 20 49 6e  *zIdxName){.  In
2cf0: 64 65 78 20 2a 70 49 6e 64 65 78 3b 0a 20 20 69  dex *pIndex;.  i
2d00: 6e 74 20 6c 65 6e 3b 0a 20 20 48 61 73 68 20 2a  nt len;.  Hash *
2d10: 70 48 61 73 68 20 3d 20 26 64 62 2d 3e 61 44 62  pHash = &db->aDb
2d20: 5b 69 44 62 5d 2e 70 53 63 68 65 6d 61 2d 3e 69  [iDb].pSchema->i
2d30: 64 78 48 61 73 68 3b 0a 0a 20 20 6c 65 6e 20 3d  dxHash;..  len =
2d40: 20 73 74 72 6c 65 6e 28 7a 49 64 78 4e 61 6d 65   strlen(zIdxName
2d50: 29 3b 0a 20 20 70 49 6e 64 65 78 20 3d 20 73 71  );.  pIndex = sq
2d60: 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72 74 28  lite3HashInsert(
2d70: 70 48 61 73 68 2c 20 7a 49 64 78 4e 61 6d 65 2c  pHash, zIdxName,
2d80: 20 6c 65 6e 2b 31 2c 20 30 29 3b 0a 20 20 69 66   len+1, 0);.  if
2d90: 28 20 70 49 6e 64 65 78 20 29 7b 0a 20 20 20 20  ( pIndex ){.    
2da0: 69 66 28 20 70 49 6e 64 65 78 2d 3e 70 54 61 62  if( pIndex->pTab
2db0: 6c 65 2d 3e 70 49 6e 64 65 78 3d 3d 70 49 6e 64  le->pIndex==pInd
2dc0: 65 78 20 29 7b 0a 20 20 20 20 20 20 70 49 6e 64  ex ){.      pInd
2dd0: 65 78 2d 3e 70 54 61 62 6c 65 2d 3e 70 49 6e 64  ex->pTable->pInd
2de0: 65 78 20 3d 20 70 49 6e 64 65 78 2d 3e 70 4e 65  ex = pIndex->pNe
2df0: 78 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  xt;.    }else{. 
2e00: 20 20 20 20 20 49 6e 64 65 78 20 2a 70 3b 0a 20       Index *p;. 
2e10: 20 20 20 20 20 66 6f 72 28 70 3d 70 49 6e 64 65       for(p=pInde
2e20: 78 2d 3e 70 54 61 62 6c 65 2d 3e 70 49 6e 64 65  x->pTable->pInde
2e30: 78 3b 20 70 20 26 26 20 70 2d 3e 70 4e 65 78 74  x; p && p->pNext
2e40: 21 3d 70 49 6e 64 65 78 3b 20 70 3d 70 2d 3e 70  !=pIndex; p=p->p
2e50: 4e 65 78 74 29 7b 7d 0a 20 20 20 20 20 20 69 66  Next){}.      if
2e60: 28 20 70 20 26 26 20 70 2d 3e 70 4e 65 78 74 3d  ( p && p->pNext=
2e70: 3d 70 49 6e 64 65 78 20 29 7b 0a 20 20 20 20 20  =pIndex ){.     
2e80: 20 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70 49     p->pNext = pI
2e90: 6e 64 65 78 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  ndex->pNext;.   
2ea0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 66     }.    }.    f
2eb0: 72 65 65 49 6e 64 65 78 28 70 49 6e 64 65 78 29  reeIndex(pIndex)
2ec0: 3b 0a 20 20 7d 0a 20 20 64 62 2d 3e 66 6c 61 67  ;.  }.  db->flag
2ed0: 73 20 7c 3d 20 53 51 4c 49 54 45 5f 49 6e 74 65  s |= SQLITE_Inte
2ee0: 72 6e 43 68 61 6e 67 65 73 3b 0a 7d 0a 0a 2f 2a  rnChanges;.}../*
2ef0: 0a 2a 2a 20 45 72 61 73 65 20 61 6c 6c 20 73 63  .** Erase all sc
2f00: 68 65 6d 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  hema information
2f10: 20 66 72 6f 6d 20 74 68 65 20 69 6e 2d 6d 65 6d   from the in-mem
2f20: 6f 72 79 20 68 61 73 68 20 74 61 62 6c 65 73 20  ory hash tables 
2f30: 6f 66 0a 2a 2a 20 61 20 73 69 6e 67 6c 65 20 64  of.** a single d
2f40: 61 74 61 62 61 73 65 2e 20 20 54 68 69 73 20 72  atabase.  This r
2f50: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
2f60: 20 74 6f 20 72 65 63 6c 61 69 6d 20 6d 65 6d 6f   to reclaim memo
2f70: 72 79 0a 2a 2a 20 62 65 66 6f 72 65 20 74 68 65  ry.** before the
2f80: 20 64 61 74 61 62 61 73 65 20 63 6c 6f 73 65 73   database closes
2f90: 2e 20 20 49 74 20 69 73 20 61 6c 73 6f 20 63 61  .  It is also ca
2fa0: 6c 6c 65 64 20 64 75 72 69 6e 67 20 61 20 72 6f  lled during a ro
2fb0: 6c 6c 62 61 63 6b 0a 2a 2a 20 69 66 20 74 68 65  llback.** if the
2fc0: 72 65 20 77 65 72 65 20 73 63 68 65 6d 61 20 63  re were schema c
2fd0: 68 61 6e 67 65 73 20 64 75 72 69 6e 67 20 74 68  hanges during th
2fe0: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 72  e transaction or
2ff0: 20 69 66 20 61 0a 2a 2a 20 73 63 68 65 6d 61 2d   if a.** schema-
3000: 63 6f 6f 6b 69 65 20 6d 69 73 6d 61 74 63 68 20  cookie mismatch 
3010: 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 49 66  occurs..**.** If
3020: 20 69 44 62 3c 3d 30 20 74 68 65 6e 20 72 65 73   iDb<=0 then res
3030: 65 74 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20  et the internal 
3040: 73 63 68 65 6d 61 20 74 61 62 6c 65 73 20 66 6f  schema tables fo
3050: 72 20 61 6c 6c 20 64 61 74 61 62 61 73 65 0a 2a  r all database.*
3060: 2a 20 66 69 6c 65 73 2e 20 20 49 66 20 69 44 62  * files.  If iDb
3070: 3e 3d 32 20 74 68 65 6e 20 72 65 73 65 74 20 74  >=2 then reset t
3080: 68 65 20 69 6e 74 65 72 6e 61 6c 20 73 63 68 65  he internal sche
3090: 6d 61 20 66 6f 72 20 6f 6e 6c 79 20 74 68 65 0a  ma for only the.
30a0: 2a 2a 20 73 69 6e 67 6c 65 20 66 69 6c 65 20 69  ** single file i
30b0: 6e 64 69 63 61 74 65 64 2e 0a 2a 2f 0a 76 6f 69  ndicated..*/.voi
30c0: 64 20 73 71 6c 69 74 65 33 52 65 73 65 74 49 6e  d sqlite3ResetIn
30d0: 74 65 72 6e 61 6c 53 63 68 65 6d 61 28 73 71 6c  ternalSchema(sql
30e0: 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 69 44  ite3 *db, int iD
30f0: 62 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a  b){.  int i, j;.
3100: 0a 20 20 61 73 73 65 72 74 28 20 69 44 62 3e 3d  .  assert( iDb>=
3110: 30 20 26 26 20 69 44 62 3c 64 62 2d 3e 6e 44 62  0 && iDb<db->nDb
3120: 20 29 3b 0a 20 20 66 6f 72 28 69 3d 69 44 62 3b   );.  for(i=iDb;
3130: 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29   i<db->nDb; i++)
3140: 7b 0a 20 20 20 20 44 62 20 2a 70 44 62 20 3d 20  {.    Db *pDb = 
3150: 26 64 62 2d 3e 61 44 62 5b 69 5d 3b 0a 20 20 20  &db->aDb[i];.   
3160: 20 69 66 28 20 70 44 62 2d 3e 70 53 63 68 65 6d   if( pDb->pSchem
3170: 61 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  a ){.      sqlit
3180: 65 33 53 63 68 65 6d 61 46 72 65 65 28 70 44 62  e3SchemaFree(pDb
3190: 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20  ->pSchema);.    
31a0: 7d 0a 20 20 20 20 69 66 28 20 69 44 62 3e 30 20  }.    if( iDb>0 
31b0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20  ) return;.  }.  
31c0: 61 73 73 65 72 74 28 20 69 44 62 3d 3d 30 20 29  assert( iDb==0 )
31d0: 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d  ;.  db->flags &=
31e0: 20 7e 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43   ~SQLITE_InternC
31f0: 68 61 6e 67 65 73 3b 0a 0a 20 20 2f 2a 20 49 66  hanges;..  /* If
3200: 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 66 20   one or more of 
3210: 74 68 65 20 61 75 78 69 6c 69 61 72 79 20 64 61  the auxiliary da
3220: 74 61 62 61 73 65 20 66 69 6c 65 73 20 68 61 73  tabase files has
3230: 20 62 65 65 6e 20 63 6c 6f 73 65 64 2c 0a 20 20   been closed,.  
3240: 2a 2a 20 74 68 65 6e 20 72 65 6d 6f 76 65 20 74  ** then remove t
3250: 68 65 6d 20 66 72 6f 6d 20 74 68 65 20 61 75 78  hem from the aux
3260: 69 6c 69 61 72 79 20 64 61 74 61 62 61 73 65 20  iliary database 
3270: 6c 69 73 74 2e 20 20 57 65 20 74 61 6b 65 20 74  list.  We take t
3280: 68 65 0a 20 20 2a 2a 20 6f 70 70 6f 72 74 75 6e  he.  ** opportun
3290: 69 74 79 20 74 6f 20 64 6f 20 74 68 69 73 20 68  ity to do this h
32a0: 65 72 65 20 73 69 6e 63 65 20 77 65 20 68 61 76  ere since we hav
32b0: 65 20 6a 75 73 74 20 64 65 6c 65 74 65 64 20 61  e just deleted a
32c0: 6c 6c 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 73  ll of the.  ** s
32d0: 63 68 65 6d 61 20 68 61 73 68 20 74 61 62 6c 65  chema hash table
32e0: 73 20 61 6e 64 20 74 68 65 72 65 66 6f 72 65 20  s and therefore 
32f0: 64 6f 20 6e 6f 74 20 68 61 76 65 20 74 6f 20 6d  do not have to m
3300: 61 6b 65 20 61 6e 79 20 63 68 61 6e 67 65 73 0a  ake any changes.
3310: 20 20 2a 2a 20 74 6f 20 61 6e 79 20 6f 66 20 74    ** to any of t
3320: 68 6f 73 65 20 74 61 62 6c 65 73 2e 0a 20 20 2a  hose tables..  *
3330: 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64  /.  for(i=0; i<d
3340: 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20  b->nDb; i++){.  
3350: 20 20 73 74 72 75 63 74 20 44 62 20 2a 70 44 62    struct Db *pDb
3360: 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 5d 3b 0a   = &db->aDb[i];.
3370: 20 20 20 20 69 66 28 20 70 44 62 2d 3e 70 42 74      if( pDb->pBt
3380: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ==0 ){.      if(
3390: 20 70 44 62 2d 3e 70 41 75 78 20 26 26 20 70 44   pDb->pAux && pD
33a0: 62 2d 3e 78 46 72 65 65 41 75 78 20 29 20 70 44  b->xFreeAux ) pD
33b0: 62 2d 3e 78 46 72 65 65 41 75 78 28 70 44 62 2d  b->xFreeAux(pDb-
33c0: 3e 70 41 75 78 29 3b 0a 20 20 20 20 20 20 70 44  >pAux);.      pD
33d0: 62 2d 3e 70 41 75 78 20 3d 20 30 3b 0a 20 20 20  b->pAux = 0;.   
33e0: 20 7d 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 6a   }.  }.  for(i=j
33f0: 3d 32 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69  =2; i<db->nDb; i
3400: 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  ++){.    struct 
3410: 44 62 20 2a 70 44 62 20 3d 20 26 64 62 2d 3e 61  Db *pDb = &db->a
3420: 44 62 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 70  Db[i];.    if( p
3430: 44 62 2d 3e 70 42 74 3d 3d 30 20 29 7b 0a 20 20  Db->pBt==0 ){.  
3440: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70      sqliteFree(p
3450: 44 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  Db->zName);.    
3460: 20 20 70 44 62 2d 3e 7a 4e 61 6d 65 20 3d 20 30    pDb->zName = 0
3470: 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65  ;.      continue
3480: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
3490: 6a 3c 69 20 29 7b 0a 20 20 20 20 20 20 64 62 2d  j<i ){.      db-
34a0: 3e 61 44 62 5b 6a 5d 20 3d 20 64 62 2d 3e 61 44  >aDb[j] = db->aD
34b0: 62 5b 69 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20  b[i];.    }.    
34c0: 6a 2b 2b 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65  j++;.  }.  memse
34d0: 74 28 26 64 62 2d 3e 61 44 62 5b 6a 5d 2c 20 30  t(&db->aDb[j], 0
34e0: 2c 20 28 64 62 2d 3e 6e 44 62 2d 6a 29 2a 73 69  , (db->nDb-j)*si
34f0: 7a 65 6f 66 28 64 62 2d 3e 61 44 62 5b 6a 5d 29  zeof(db->aDb[j])
3500: 29 3b 0a 20 20 64 62 2d 3e 6e 44 62 20 3d 20 6a  );.  db->nDb = j
3510: 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6e 44 62 3c  ;.  if( db->nDb<
3520: 3d 32 20 26 26 20 64 62 2d 3e 61 44 62 21 3d 64  =2 && db->aDb!=d
3530: 62 2d 3e 61 44 62 53 74 61 74 69 63 20 29 7b 0a  b->aDbStatic ){.
3540: 20 20 20 20 6d 65 6d 63 70 79 28 64 62 2d 3e 61      memcpy(db->a
3550: 44 62 53 74 61 74 69 63 2c 20 64 62 2d 3e 61 44  DbStatic, db->aD
3560: 62 2c 20 32 2a 73 69 7a 65 6f 66 28 64 62 2d 3e  b, 2*sizeof(db->
3570: 61 44 62 5b 30 5d 29 29 3b 0a 20 20 20 20 73 71  aDb[0]));.    sq
3580: 6c 69 74 65 46 72 65 65 28 64 62 2d 3e 61 44 62  liteFree(db->aDb
3590: 29 3b 0a 20 20 20 20 64 62 2d 3e 61 44 62 20 3d  );.    db->aDb =
35a0: 20 64 62 2d 3e 61 44 62 53 74 61 74 69 63 3b 0a   db->aDbStatic;.
35b0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69    }.}../*.** Thi
35c0: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
35d0: 6c 65 64 20 77 68 65 6e 65 76 65 72 20 61 20 72  led whenever a r
35e0: 6f 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73 2e 20  ollback occurs. 
35f0: 20 49 66 20 74 68 65 72 65 20 77 65 72 65 0a 2a   If there were.*
3600: 2a 20 73 63 68 65 6d 61 20 63 68 61 6e 67 65 73  * schema changes
3610: 20 64 75 72 69 6e 67 20 74 68 65 20 74 72 61 6e   during the tran
3620: 73 61 63 74 69 6f 6e 2c 20 74 68 65 6e 20 77 65  saction, then we
3630: 20 68 61 76 65 20 74 6f 20 72 65 73 65 74 20 74   have to reset t
3640: 68 65 0a 2a 2a 20 69 6e 74 65 72 6e 61 6c 20 68  he.** internal h
3650: 61 73 68 20 74 61 62 6c 65 73 20 61 6e 64 20 72  ash tables and r
3660: 65 6c 6f 61 64 20 74 68 65 6d 20 66 72 6f 6d 20  eload them from 
3670: 64 69 73 6b 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  disk..*/.void sq
3680: 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 49 6e 74  lite3RollbackInt
3690: 65 72 6e 61 6c 43 68 61 6e 67 65 73 28 73 71 6c  ernalChanges(sql
36a0: 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 69 66 28  ite3 *db){.  if(
36b0: 20 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c   db->flags & SQL
36c0: 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65  ITE_InternChange
36d0: 73 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  s ){.    sqlite3
36e0: 52 65 73 65 74 49 6e 74 65 72 6e 61 6c 53 63 68  ResetInternalSch
36f0: 65 6d 61 28 64 62 2c 20 30 29 3b 0a 20 20 7d 0a  ema(db, 0);.  }.
3700: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
3710: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
3720: 77 68 65 6e 20 61 20 63 6f 6d 6d 69 74 20 6f 63  when a commit oc
3730: 63 75 72 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  curs..*/.void sq
3740: 6c 69 74 65 33 43 6f 6d 6d 69 74 49 6e 74 65 72  lite3CommitInter
3750: 6e 61 6c 43 68 61 6e 67 65 73 28 73 71 6c 69 74  nalChanges(sqlit
3760: 65 33 20 2a 64 62 29 7b 0a 20 20 64 62 2d 3e 66  e3 *db){.  db->f
3770: 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f  lags &= ~SQLITE_
3780: 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a 7d  InternChanges;.}
3790: 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 74 68  ../*.** Clear th
37a0: 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 66  e column names f
37b0: 72 6f 6d 20 61 20 74 61 62 6c 65 20 6f 72 20 76  rom a table or v
37c0: 69 65 77 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  iew..*/.static v
37d0: 6f 69 64 20 73 71 6c 69 74 65 52 65 73 65 74 43  oid sqliteResetC
37e0: 6f 6c 75 6d 6e 4e 61 6d 65 73 28 54 61 62 6c 65  olumnNames(Table
37f0: 20 2a 70 54 61 62 6c 65 29 7b 0a 20 20 69 6e 74   *pTable){.  int
3800: 20 69 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43   i;.  Column *pC
3810: 6f 6c 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54  ol;.  assert( pT
3820: 61 62 6c 65 21 3d 30 20 29 3b 0a 20 20 69 66 28  able!=0 );.  if(
3830: 20 28 70 43 6f 6c 20 3d 20 70 54 61 62 6c 65 2d   (pCol = pTable-
3840: 3e 61 43 6f 6c 29 21 3d 30 20 29 7b 0a 20 20 20  >aCol)!=0 ){.   
3850: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61 62   for(i=0; i<pTab
3860: 6c 65 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70  le->nCol; i++, p
3870: 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71  Col++){.      sq
3880: 6c 69 74 65 46 72 65 65 28 70 43 6f 6c 2d 3e 7a  liteFree(pCol->z
3890: 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 73 71 6c  Name);.      sql
38a0: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 70  ite3ExprDelete(p
38b0: 43 6f 6c 2d 3e 70 44 66 6c 74 29 3b 0a 20 20 20  Col->pDflt);.   
38c0: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 43     sqliteFree(pC
38d0: 6f 6c 2d 3e 7a 54 79 70 65 29 3b 0a 20 20 20 20  ol->zType);.    
38e0: 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 43 6f    sqliteFree(pCo
38f0: 6c 2d 3e 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20 7d  l->zColl);.    }
3900: 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28  .    sqliteFree(
3910: 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 29 3b 0a 20  pTable->aCol);. 
3920: 20 7d 0a 20 20 70 54 61 62 6c 65 2d 3e 61 43 6f   }.  pTable->aCo
3930: 6c 20 3d 20 30 3b 0a 20 20 70 54 61 62 6c 65 2d  l = 0;.  pTable-
3940: 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a  >nCol = 0;.}../*
3950: 0a 2a 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 6d  .** Remove the m
3960: 65 6d 6f 72 79 20 64 61 74 61 20 73 74 72 75 63  emory data struc
3970: 74 75 72 65 73 20 61 73 73 6f 63 69 61 74 65 64  tures associated
3980: 20 77 69 74 68 20 74 68 65 20 67 69 76 65 6e 0a   with the given.
3990: 2a 2a 20 54 61 62 6c 65 2e 20 20 4e 6f 20 63 68  ** Table.  No ch
39a0: 61 6e 67 65 73 20 61 72 65 20 6d 61 64 65 20 74  anges are made t
39b0: 6f 20 64 69 73 6b 20 62 79 20 74 68 69 73 20 72  o disk by this r
39c0: 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  outine..**.** Th
39d0: 69 73 20 72 6f 75 74 69 6e 65 20 6a 75 73 74 20  is routine just 
39e0: 64 65 6c 65 74 65 73 20 74 68 65 20 64 61 74 61  deletes the data
39f0: 20 73 74 72 75 63 74 75 72 65 2e 20 20 49 74 20   structure.  It 
3a00: 64 6f 65 73 20 6e 6f 74 20 75 6e 6c 69 6e 6b 0a  does not unlink.
3a10: 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 64 61 74  ** the table dat
3a20: 61 20 73 74 72 75 63 74 75 72 65 20 66 72 6f 6d  a structure from
3a30: 20 74 68 65 20 68 61 73 68 20 74 61 62 6c 65 2e   the hash table.
3a40: 20 20 4e 6f 72 20 64 6f 65 73 20 69 74 20 72 65    Nor does it re
3a50: 6d 6f 76 65 0a 2a 2a 20 66 6f 72 65 69 67 6e 20  move.** foreign 
3a60: 6b 65 79 73 20 66 72 6f 6d 20 74 68 65 20 73 71  keys from the sq
3a70: 6c 69 74 65 2e 61 46 4b 65 79 20 68 61 73 68 20  lite.aFKey hash 
3a80: 74 61 62 6c 65 2e 20 20 42 75 74 20 69 74 20 64  table.  But it d
3a90: 6f 65 73 20 64 65 73 74 72 6f 79 0a 2a 2a 20 6d  oes destroy.** m
3aa0: 65 6d 6f 72 79 20 73 74 72 75 63 74 75 72 65 73  emory structures
3ab0: 20 6f 66 20 74 68 65 20 69 6e 64 69 63 65 73 20   of the indices 
3ac0: 61 6e 64 20 66 6f 72 65 69 67 6e 20 6b 65 79 73  and foreign keys
3ad0: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
3ae0: 20 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 2e 0a   .** the table..
3af0: 2a 2a 0a 2a 2a 20 49 6e 64 69 63 65 73 20 61 73  **.** Indices as
3b00: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
3b10: 65 20 74 61 62 6c 65 20 61 72 65 20 75 6e 6c 69  e table are unli
3b20: 6e 6b 65 64 20 66 72 6f 6d 20 74 68 65 20 22 64  nked from the "d
3b30: 62 22 0a 2a 2a 20 64 61 74 61 20 73 74 72 75 63  b".** data struc
3b40: 74 75 72 65 20 69 66 20 64 62 21 3d 4e 55 4c 4c  ture if db!=NULL
3b50: 2e 20 20 49 66 20 64 62 3d 3d 4e 55 4c 4c 2c 20  .  If db==NULL, 
3b60: 69 6e 64 69 63 65 73 20 61 74 74 61 63 68 65 64  indices attached
3b70: 20 74 6f 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65   to.** the table
3b80: 20 61 72 65 20 64 65 6c 65 74 65 64 2c 20 62 75   are deleted, bu
3b90: 74 20 69 74 20 69 73 20 61 73 73 75 6d 65 64 20  t it is assumed 
3ba0: 74 68 65 79 20 68 61 76 65 20 61 6c 72 65 61 64  they have alread
3bb0: 79 20 62 65 65 6e 0a 2a 2a 20 75 6e 6c 69 6e 6b  y been.** unlink
3bc0: 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ed..*/.void sqli
3bd0: 74 65 33 44 65 6c 65 74 65 54 61 62 6c 65 28 73  te3DeleteTable(s
3be0: 71 6c 69 74 65 33 20 2a 64 62 2c 20 54 61 62 6c  qlite3 *db, Tabl
3bf0: 65 20 2a 70 54 61 62 6c 65 29 7b 0a 20 20 49 6e  e *pTable){.  In
3c00: 64 65 78 20 2a 70 49 6e 64 65 78 2c 20 2a 70 4e  dex *pIndex, *pN
3c10: 65 78 74 3b 0a 20 20 46 4b 65 79 20 2a 70 46 4b  ext;.  FKey *pFK
3c20: 65 79 2c 20 2a 70 4e 65 78 74 46 4b 65 79 3b 0a  ey, *pNextFKey;.
3c30: 0a 20 20 64 62 20 3d 20 30 3b 0a 0a 20 20 69 66  .  db = 0;..  if
3c40: 28 20 70 54 61 62 6c 65 3d 3d 30 20 29 20 72 65  ( pTable==0 ) re
3c50: 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 44 6f 20 6e  turn;..  /* Do n
3c60: 6f 74 20 64 65 6c 65 74 65 20 74 68 65 20 74 61  ot delete the ta
3c70: 62 6c 65 20 75 6e 74 69 6c 20 74 68 65 20 72 65  ble until the re
3c80: 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 72 65  ference count re
3c90: 61 63 68 65 73 20 7a 65 72 6f 2e 20 2a 2f 0a 20  aches zero. */. 
3ca0: 20 70 54 61 62 6c 65 2d 3e 6e 52 65 66 2d 2d 3b   pTable->nRef--;
3cb0: 0a 20 20 69 66 28 20 70 54 61 62 6c 65 2d 3e 6e  .  if( pTable->n
3cc0: 52 65 66 3e 30 20 29 7b 0a 20 20 20 20 72 65 74  Ref>0 ){.    ret
3cd0: 75 72 6e 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  urn;.  }.  asser
3ce0: 74 28 20 70 54 61 62 6c 65 2d 3e 6e 52 65 66 3d  t( pTable->nRef=
3cf0: 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 44 65 6c 65  =0 );..  /* Dele
3d00: 74 65 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 61  te all indices a
3d10: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
3d20: 68 69 73 20 74 61 62 6c 65 0a 20 20 2a 2f 0a 20  his table.  */. 
3d30: 20 66 6f 72 28 70 49 6e 64 65 78 20 3d 20 70 54   for(pIndex = pT
3d40: 61 62 6c 65 2d 3e 70 49 6e 64 65 78 3b 20 70 49  able->pIndex; pI
3d50: 6e 64 65 78 3b 20 70 49 6e 64 65 78 3d 70 4e 65  ndex; pIndex=pNe
3d60: 78 74 29 7b 0a 20 20 20 20 70 4e 65 78 74 20 3d  xt){.    pNext =
3d70: 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74 3b 0a   pIndex->pNext;.
3d80: 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 64      assert( pInd
3d90: 65 78 2d 3e 70 53 63 68 65 6d 61 3d 3d 70 54 61  ex->pSchema==pTa
3da0: 62 6c 65 2d 3e 70 53 63 68 65 6d 61 20 29 3b 0a  ble->pSchema );.
3db0: 20 20 20 20 73 71 6c 69 74 65 44 65 6c 65 74 65      sqliteDelete
3dc0: 49 6e 64 65 78 28 70 49 6e 64 65 78 29 3b 0a 20  Index(pIndex);. 
3dd0: 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   }..#ifndef SQLI
3de0: 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f  TE_OMIT_FOREIGN_
3df0: 4b 45 59 0a 20 20 2f 2a 20 44 65 6c 65 74 65 20  KEY.  /* Delete 
3e00: 61 6c 6c 20 66 6f 72 65 69 67 6e 20 6b 65 79 73  all foreign keys
3e10: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
3e20: 20 74 68 69 73 20 74 61 62 6c 65 2e 20 20 54 68   this table.  Th
3e30: 65 20 6b 65 79 73 0a 20 20 2a 2a 20 73 68 6f 75  e keys.  ** shou
3e40: 6c 64 20 68 61 76 65 20 61 6c 72 65 61 64 79 20  ld have already 
3e50: 62 65 65 6e 20 75 6e 6c 69 6e 6b 65 64 20 66 72  been unlinked fr
3e60: 6f 6d 20 74 68 65 20 64 62 2d 3e 61 46 4b 65 79  om the db->aFKey
3e70: 20 68 61 73 68 20 74 61 62 6c 65 20 0a 20 20 2a   hash table .  *
3e80: 2f 0a 20 20 66 6f 72 28 70 46 4b 65 79 3d 70 54  /.  for(pFKey=pT
3e90: 61 62 6c 65 2d 3e 70 46 4b 65 79 3b 20 70 46 4b  able->pFKey; pFK
3ea0: 65 79 3b 20 70 46 4b 65 79 3d 70 4e 65 78 74 46  ey; pFKey=pNextF
3eb0: 4b 65 79 29 7b 0a 20 20 20 20 70 4e 65 78 74 46  Key){.    pNextF
3ec0: 4b 65 79 20 3d 20 70 46 4b 65 79 2d 3e 70 4e 65  Key = pFKey->pNe
3ed0: 78 74 46 72 6f 6d 3b 0a 20 20 20 20 61 73 73 65  xtFrom;.    asse
3ee0: 72 74 28 20 73 71 6c 69 74 65 33 48 61 73 68 46  rt( sqlite3HashF
3ef0: 69 6e 64 28 26 70 54 61 62 6c 65 2d 3e 70 53 63  ind(&pTable->pSc
3f00: 68 65 6d 61 2d 3e 61 46 4b 65 79 2c 0a 20 20 20  hema->aFKey,.   
3f10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3f20: 20 20 20 20 20 20 20 20 70 46 4b 65 79 2d 3e 7a          pFKey->z
3f30: 54 6f 2c 20 73 74 72 6c 65 6e 28 70 46 4b 65 79  To, strlen(pFKey
3f40: 2d 3e 7a 54 6f 29 2b 31 29 21 3d 70 46 4b 65 79  ->zTo)+1)!=pFKey
3f50: 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72   );.    sqliteFr
3f60: 65 65 28 70 46 4b 65 79 29 3b 0a 20 20 7d 0a 23  ee(pFKey);.  }.#
3f70: 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 44 65 6c 65  endif..  /* Dele
3f80: 74 65 20 74 68 65 20 54 61 62 6c 65 20 73 74 72  te the Table str
3f90: 75 63 74 75 72 65 20 69 74 73 65 6c 66 2e 0a 20  ucture itself.. 
3fa0: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 52 65 73 65   */.  sqliteRese
3fb0: 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 54 61  tColumnNames(pTa
3fc0: 62 6c 65 29 3b 0a 20 20 73 71 6c 69 74 65 46 72  ble);.  sqliteFr
3fd0: 65 65 28 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65  ee(pTable->zName
3fe0: 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28  );.  sqliteFree(
3ff0: 70 54 61 62 6c 65 2d 3e 7a 43 6f 6c 41 66 66 29  pTable->zColAff)
4000: 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63  ;.  sqlite3Selec
4010: 74 44 65 6c 65 74 65 28 70 54 61 62 6c 65 2d 3e  tDelete(pTable->
4020: 70 53 65 6c 65 63 74 29 3b 0a 23 69 66 6e 64 65  pSelect);.#ifnde
4030: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 48  f SQLITE_OMIT_CH
4040: 45 43 4b 0a 20 20 73 71 6c 69 74 65 33 45 78 70  ECK.  sqlite3Exp
4050: 72 44 65 6c 65 74 65 28 70 54 61 62 6c 65 2d 3e  rDelete(pTable->
4060: 70 43 68 65 63 6b 29 3b 0a 23 65 6e 64 69 66 0a  pCheck);.#endif.
4070: 20 20 73 71 6c 69 74 65 33 56 74 61 62 43 6c 65    sqlite3VtabCle
4080: 61 72 28 70 54 61 62 6c 65 29 3b 0a 20 20 73 71  ar(pTable);.  sq
4090: 6c 69 74 65 46 72 65 65 28 70 54 61 62 6c 65 29  liteFree(pTable)
40a0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 69 6e  ;.}../*.** Unlin
40b0: 6b 20 74 68 65 20 67 69 76 65 6e 20 74 61 62 6c  k the given tabl
40c0: 65 20 66 72 6f 6d 20 74 68 65 20 68 61 73 68 20  e from the hash 
40d0: 74 61 62 6c 65 73 20 61 6e 64 20 74 68 65 20 64  tables and the d
40e0: 65 6c 65 74 65 20 74 68 65 0a 2a 2a 20 74 61 62  elete the.** tab
40f0: 6c 65 20 73 74 72 75 63 74 75 72 65 20 77 69 74  le structure wit
4100: 68 20 61 6c 6c 20 69 74 73 20 69 6e 64 69 63 65  h all its indice
4110: 73 20 61 6e 64 20 66 6f 72 65 69 67 6e 20 6b 65  s and foreign ke
4120: 79 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ys..*/.void sqli
4130: 74 65 33 55 6e 6c 69 6e 6b 41 6e 64 44 65 6c 65  te3UnlinkAndDele
4140: 74 65 54 61 62 6c 65 28 73 71 6c 69 74 65 33 20  teTable(sqlite3 
4150: 2a 64 62 2c 20 69 6e 74 20 69 44 62 2c 20 63 6f  *db, int iDb, co
4160: 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62 4e 61  nst char *zTabNa
4170: 6d 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b  me){.  Table *p;
4180: 0a 20 20 46 4b 65 79 20 2a 70 46 31 2c 20 2a 70  .  FKey *pF1, *p
4190: 46 32 3b 0a 20 20 44 62 20 2a 70 44 62 3b 0a 0a  F2;.  Db *pDb;..
41a0: 20 20 61 73 73 65 72 74 28 20 64 62 21 3d 30 20    assert( db!=0 
41b0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 44 62  );.  assert( iDb
41c0: 3e 3d 30 20 26 26 20 69 44 62 3c 64 62 2d 3e 6e  >=0 && iDb<db->n
41d0: 44 62 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  Db );.  assert( 
41e0: 7a 54 61 62 4e 61 6d 65 20 26 26 20 7a 54 61 62  zTabName && zTab
41f0: 4e 61 6d 65 5b 30 5d 20 29 3b 0a 20 20 70 44 62  Name[0] );.  pDb
4200: 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d   = &db->aDb[iDb]
4210: 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 48  ;.  p = sqlite3H
4220: 61 73 68 49 6e 73 65 72 74 28 26 70 44 62 2d 3e  ashInsert(&pDb->
4230: 70 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68  pSchema->tblHash
4240: 2c 20 7a 54 61 62 4e 61 6d 65 2c 20 73 74 72 6c  , zTabName, strl
4250: 65 6e 28 7a 54 61 62 4e 61 6d 65 29 2b 31 2c 30  en(zTabName)+1,0
4260: 29 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 23 69  );.  if( p ){.#i
4270: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
4280: 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 0a 20 20  T_FOREIGN_KEY.  
4290: 20 20 66 6f 72 28 70 46 31 3d 70 2d 3e 70 46 4b    for(pF1=p->pFK
42a0: 65 79 3b 20 70 46 31 3b 20 70 46 31 3d 70 46 31  ey; pF1; pF1=pF1
42b0: 2d 3e 70 4e 65 78 74 46 72 6f 6d 29 7b 0a 20 20  ->pNextFrom){.  
42c0: 20 20 20 20 69 6e 74 20 6e 54 6f 20 3d 20 73 74      int nTo = st
42d0: 72 6c 65 6e 28 70 46 31 2d 3e 7a 54 6f 29 20 2b  rlen(pF1->zTo) +
42e0: 20 31 3b 0a 20 20 20 20 20 20 70 46 32 20 3d 20   1;.      pF2 = 
42f0: 73 71 6c 69 74 65 33 48 61 73 68 46 69 6e 64 28  sqlite3HashFind(
4300: 26 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 61  &pDb->pSchema->a
4310: 46 4b 65 79 2c 20 70 46 31 2d 3e 7a 54 6f 2c 20  FKey, pF1->zTo, 
4320: 6e 54 6f 29 3b 0a 20 20 20 20 20 20 69 66 28 20  nTo);.      if( 
4330: 70 46 32 3d 3d 70 46 31 20 29 7b 0a 20 20 20 20  pF2==pF1 ){.    
4340: 20 20 20 20 73 71 6c 69 74 65 33 48 61 73 68 49      sqlite3HashI
4350: 6e 73 65 72 74 28 26 70 44 62 2d 3e 70 53 63 68  nsert(&pDb->pSch
4360: 65 6d 61 2d 3e 61 46 4b 65 79 2c 20 70 46 31 2d  ema->aFKey, pF1-
4370: 3e 7a 54 6f 2c 20 6e 54 6f 2c 20 70 46 31 2d 3e  >zTo, nTo, pF1->
4380: 70 4e 65 78 74 54 6f 29 3b 0a 20 20 20 20 20 20  pNextTo);.      
4390: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 77  }else{.        w
43a0: 68 69 6c 65 28 20 70 46 32 20 26 26 20 70 46 32  hile( pF2 && pF2
43b0: 2d 3e 70 4e 65 78 74 54 6f 21 3d 70 46 31 20 29  ->pNextTo!=pF1 )
43c0: 7b 20 70 46 32 3d 70 46 32 2d 3e 70 4e 65 78 74  { pF2=pF2->pNext
43d0: 54 6f 3b 20 7d 0a 20 20 20 20 20 20 20 20 69 66  To; }.        if
43e0: 28 20 70 46 32 20 29 7b 0a 20 20 20 20 20 20 20  ( pF2 ){.       
43f0: 20 20 20 70 46 32 2d 3e 70 4e 65 78 74 54 6f 20     pF2->pNextTo 
4400: 3d 20 70 46 31 2d 3e 70 4e 65 78 74 54 6f 3b 0a  = pF1->pNextTo;.
4410: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
4420: 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  }.    }.#endif. 
4430: 20 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65     sqlite3Delete
4440: 54 61 62 6c 65 28 64 62 2c 20 70 29 3b 0a 20 20  Table(db, p);.  
4450: 7d 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d  }.  db->flags |=
4460: 20 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68   SQLITE_InternCh
4470: 61 6e 67 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  anges;.}../*.** 
4480: 47 69 76 65 6e 20 61 20 74 6f 6b 65 6e 2c 20 72  Given a token, r
4490: 65 74 75 72 6e 20 61 20 73 74 72 69 6e 67 20 74  eturn a string t
44a0: 68 61 74 20 63 6f 6e 73 69 73 74 73 20 6f 66 20  hat consists of 
44b0: 74 68 65 20 74 65 78 74 20 6f 66 20 74 68 61 74  the text of that
44c0: 0a 2a 2a 20 74 6f 6b 65 6e 20 77 69 74 68 20 61  .** token with a
44d0: 6e 79 20 71 75 6f 74 61 74 69 6f 6e 73 20 72 65  ny quotations re
44e0: 6d 6f 76 65 64 2e 20 20 53 70 61 63 65 20 74 6f  moved.  Space to
44f0: 20 68 6f 6c 64 20 74 68 65 20 72 65 74 75 72 6e   hold the return
4500: 65 64 20 73 74 72 69 6e 67 0a 2a 2a 20 69 73 20  ed string.** is 
4510: 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71  obtained from sq
4520: 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 20 61 6e 64  liteMalloc() and
4530: 20 6d 75 73 74 20 62 65 20 66 72 65 65 64 20 62   must be freed b
4540: 79 20 74 68 65 20 63 61 6c 6c 69 6e 67 0a 2a 2a  y the calling.**
4550: 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a   function..**.**
4560: 20 54 6f 6b 65 6e 73 20 61 72 65 20 6f 66 74 65   Tokens are ofte
4570: 6e 20 6a 75 73 74 20 70 6f 69 6e 74 65 72 73 20  n just pointers 
4580: 69 6e 74 6f 20 74 68 65 20 6f 72 69 67 69 6e 61  into the origina
4590: 6c 20 53 51 4c 20 74 65 78 74 20 61 6e 64 20 73  l SQL text and s
45a0: 6f 0a 2a 2a 20 61 72 65 20 6e 6f 74 20 5c 30 30  o.** are not \00
45b0: 30 20 74 65 72 6d 69 6e 61 74 65 64 20 61 6e 64  0 terminated and
45c0: 20 61 72 65 20 6e 6f 74 20 70 65 72 73 69 73 74   are not persist
45d0: 65 6e 74 2e 20 20 54 68 65 20 72 65 74 75 72 6e  ent.  The return
45e0: 65 64 20 73 74 72 69 6e 67 0a 2a 2a 20 69 73 20  ed string.** is 
45f0: 5c 30 30 30 20 74 65 72 6d 69 6e 61 74 65 64 20  \000 terminated 
4600: 61 6e 64 20 69 73 20 70 65 72 73 69 73 74 65 6e  and is persisten
4610: 74 2e 0a 2a 2f 0a 63 68 61 72 20 2a 73 71 6c 69  t..*/.char *sqli
4620: 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e  te3NameFromToken
4630: 28 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 29 7b 0a  (Token *pName){.
4640: 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20    char *zName;. 
4650: 20 69 66 28 20 70 4e 61 6d 65 20 29 7b 0a 20 20   if( pName ){.  
4660: 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65    zName = sqlite
4670: 53 74 72 4e 44 75 70 28 28 63 68 61 72 2a 29 70  StrNDup((char*)p
4680: 4e 61 6d 65 2d 3e 7a 2c 20 70 4e 61 6d 65 2d 3e  Name->z, pName->
4690: 6e 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  n);.    sqlite3D
46a0: 65 71 75 6f 74 65 28 7a 4e 61 6d 65 29 3b 0a 20  equote(zName);. 
46b0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 4e 61 6d   }else{.    zNam
46c0: 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74  e = 0;.  }.  ret
46d0: 75 72 6e 20 7a 4e 61 6d 65 3b 0a 7d 0a 0a 2f 2a  urn zName;.}../*
46e0: 0a 2a 2a 20 4f 70 65 6e 20 74 68 65 20 73 71 6c  .** Open the sql
46f0: 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65  ite_master table
4700: 20 73 74 6f 72 65 64 20 69 6e 20 64 61 74 61 62   stored in datab
4710: 61 73 65 20 6e 75 6d 62 65 72 20 69 44 62 20 66  ase number iDb f
4720: 6f 72 0a 2a 2a 20 77 72 69 74 69 6e 67 2e 20 54  or.** writing. T
4730: 68 65 20 74 61 62 6c 65 20 69 73 20 6f 70 65 6e  he table is open
4740: 65 64 20 75 73 69 6e 67 20 63 75 72 73 6f 72 20  ed using cursor 
4750: 30 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  0..*/.void sqlit
4760: 65 33 4f 70 65 6e 4d 61 73 74 65 72 54 61 62 6c  e3OpenMasterTabl
4770: 65 28 50 61 72 73 65 20 2a 70 2c 20 69 6e 74 20  e(Parse *p, int 
4780: 69 44 62 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  iDb){.  Vdbe *v 
4790: 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
47a0: 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 54 61  (p);.  sqlite3Ta
47b0: 62 6c 65 4c 6f 63 6b 28 70 2c 20 69 44 62 2c 20  bleLock(p, iDb, 
47c0: 4d 41 53 54 45 52 5f 52 4f 4f 54 2c 20 31 2c 20  MASTER_ROOT, 1, 
47d0: 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 44 62  SCHEMA_TABLE(iDb
47e0: 29 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  ));.  sqlite3Vdb
47f0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74  eAddOp(v, OP_Int
4800: 65 67 65 72 2c 20 69 44 62 2c 20 30 29 3b 0a 20  eger, iDb, 0);. 
4810: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
4820: 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 57 72 69 74  p(v, OP_OpenWrit
4830: 65 2c 20 30 2c 20 4d 41 53 54 45 52 5f 52 4f 4f  e, 0, MASTER_ROO
4840: 54 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  T);.  sqlite3Vdb
4850: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 65 74  eAddOp(v, OP_Set
4860: 4e 75 6d 43 6f 6c 75 6d 6e 73 2c 20 30 2c 20 35  NumColumns, 0, 5
4870: 29 3b 20 2f 2a 20 73 71 6c 69 74 65 5f 6d 61 73  ); /* sqlite_mas
4880: 74 65 72 20 68 61 73 20 35 20 63 6f 6c 75 6d 6e  ter has 5 column
4890: 73 20 2a 2f 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  s */.}../*.** Th
48a0: 65 20 74 6f 6b 65 6e 20 2a 70 4e 61 6d 65 20 63  e token *pName c
48b0: 6f 6e 74 61 69 6e 73 20 74 68 65 20 6e 61 6d 65  ontains the name
48c0: 20 6f 66 20 61 20 64 61 74 61 62 61 73 65 20 28   of a database (
48d0: 65 69 74 68 65 72 20 22 6d 61 69 6e 22 20 6f 72  either "main" or
48e0: 0a 2a 2a 20 22 74 65 6d 70 22 20 6f 72 20 74 68  .** "temp" or th
48f0: 65 20 6e 61 6d 65 20 6f 66 20 61 6e 20 61 74 74  e name of an att
4900: 61 63 68 65 64 20 64 62 29 2e 20 54 68 69 73 20  ached db). This 
4910: 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20  routine returns 
4920: 74 68 65 0a 2a 2a 20 69 6e 64 65 78 20 6f 66 20  the.** index of 
4930: 74 68 65 20 6e 61 6d 65 64 20 64 61 74 61 62 61  the named databa
4940: 73 65 20 69 6e 20 64 62 2d 3e 61 44 62 5b 5d 2c  se in db->aDb[],
4950: 20 6f 72 20 2d 31 20 69 66 20 74 68 65 20 6e 61   or -1 if the na
4960: 6d 65 64 20 64 62 20 0a 2a 2a 20 64 6f 65 73 20  med db .** does 
4970: 6e 6f 74 20 65 78 69 73 74 2e 0a 2a 2f 0a 69 6e  not exist..*/.in
4980: 74 20 73 71 6c 69 74 65 33 46 69 6e 64 44 62 28  t sqlite3FindDb(
4990: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 54 6f 6b  sqlite3 *db, Tok
49a0: 65 6e 20 2a 70 4e 61 6d 65 29 7b 0a 20 20 69 6e  en *pName){.  in
49b0: 74 20 69 20 3d 20 2d 31 3b 20 20 20 20 2f 2a 20  t i = -1;    /* 
49c0: 44 61 74 61 62 61 73 65 20 6e 75 6d 62 65 72 20  Database number 
49d0: 2a 2f 0a 20 20 69 6e 74 20 6e 3b 20 20 20 20 20  */.  int n;     
49e0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
49f0: 20 63 68 61 72 61 63 74 65 72 73 20 69 6e 20 74   characters in t
4a00: 68 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 44 62 20  he name */.  Db 
4a10: 2a 70 44 62 3b 20 20 20 20 20 20 20 2f 2a 20 41  *pDb;       /* A
4a20: 20 64 61 74 61 62 61 73 65 20 77 68 6f 73 65 20   database whose 
4a30: 6e 61 6d 65 20 73 70 61 63 65 20 69 73 20 62 65  name space is be
4a40: 69 6e 67 20 73 65 61 72 63 68 65 64 20 2a 2f 0a  ing searched */.
4a50: 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 20 20    char *zName;  
4a60: 20 2f 2a 20 4e 61 6d 65 20 77 65 20 61 72 65 20   /* Name we are 
4a70: 73 65 61 72 63 68 69 6e 67 20 66 6f 72 20 2a 2f  searching for */
4a80: 0a 0a 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69  ..  zName = sqli
4a90: 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e  te3NameFromToken
4aa0: 28 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a  (pName);.  if( z
4ab0: 4e 61 6d 65 20 29 7b 0a 20 20 20 20 6e 20 3d 20  Name ){.    n = 
4ac0: 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 3b 0a 20  strlen(zName);. 
4ad0: 20 20 20 66 6f 72 28 69 3d 28 64 62 2d 3e 6e 44     for(i=(db->nD
4ae0: 62 2d 31 29 2c 20 70 44 62 3d 26 64 62 2d 3e 61  b-1), pDb=&db->a
4af0: 44 62 5b 69 5d 3b 20 69 3e 3d 30 3b 20 69 2d 2d  Db[i]; i>=0; i--
4b00: 2c 20 70 44 62 2d 2d 29 7b 0a 20 20 20 20 20 20  , pDb--){.      
4b10: 69 66 28 20 28 21 4f 4d 49 54 5f 54 45 4d 50 44  if( (!OMIT_TEMPD
4b20: 42 20 7c 7c 20 69 21 3d 31 20 29 20 26 26 20 6e  B || i!=1 ) && n
4b30: 3d 3d 73 74 72 6c 65 6e 28 70 44 62 2d 3e 7a 4e  ==strlen(pDb->zN
4b40: 61 6d 65 29 20 26 26 20 0a 20 20 20 20 20 20 20  ame) && .       
4b50: 20 20 20 30 3d 3d 73 71 6c 69 74 65 33 53 74 72     0==sqlite3Str
4b60: 49 43 6d 70 28 70 44 62 2d 3e 7a 4e 61 6d 65 2c  ICmp(pDb->zName,
4b70: 20 7a 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 20   zName) ){.     
4b80: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
4b90: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  }.    }.    sqli
4ba0: 74 65 46 72 65 65 28 7a 4e 61 6d 65 29 3b 0a 20  teFree(zName);. 
4bb0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d   }.  return i;.}
4bc0: 0a 0a 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 6f  ../* The table o
4bd0: 72 20 76 69 65 77 20 6f 72 20 74 72 69 67 67 65  r view or trigge
4be0: 72 20 6e 61 6d 65 20 69 73 20 70 61 73 73 65 64  r name is passed
4bf0: 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65   to this routine
4c00: 20 76 69 61 20 74 6f 6b 65 6e 73 0a 2a 2a 20 70   via tokens.** p
4c10: 4e 61 6d 65 31 20 61 6e 64 20 70 4e 61 6d 65 32  Name1 and pName2
4c20: 2e 20 49 66 20 74 68 65 20 74 61 62 6c 65 20 6e  . If the table n
4c30: 61 6d 65 20 77 61 73 20 66 75 6c 6c 79 20 71 75  ame was fully qu
4c40: 61 6c 69 66 69 65 64 2c 20 66 6f 72 20 65 78 61  alified, for exa
4c50: 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 43 52 45 41  mple:.**.** CREA
4c60: 54 45 20 54 41 42 4c 45 20 78 78 78 2e 79 79 79  TE TABLE xxx.yyy
4c70: 20 28 2e 2e 2e 29 3b 0a 2a 2a 20 0a 2a 2a 20 54   (...);.** .** T
4c80: 68 65 6e 20 70 4e 61 6d 65 31 20 69 73 20 73 65  hen pName1 is se
4c90: 74 20 74 6f 20 22 78 78 78 22 20 61 6e 64 20 70  t to "xxx" and p
4ca0: 4e 61 6d 65 32 20 22 79 79 79 22 2e 20 4f 6e 20  Name2 "yyy". On 
4cb0: 74 68 65 20 6f 74 68 65 72 20 68 61 6e 64 20 69  the other hand i
4cc0: 66 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 6e  f.** the table n
4cd0: 61 6d 65 20 69 73 20 6e 6f 74 20 66 75 6c 6c 79  ame is not fully
4ce0: 20 71 75 61 6c 69 66 69 65 64 2c 20 69 2e 65 2e   qualified, i.e.
4cf0: 3a 0a 2a 2a 0a 2a 2a 20 43 52 45 41 54 45 20 54  :.**.** CREATE T
4d00: 41 42 4c 45 20 79 79 79 28 2e 2e 2e 29 3b 0a 2a  ABLE yyy(...);.*
4d10: 2a 0a 2a 2a 20 54 68 65 6e 20 70 4e 61 6d 65 31  *.** Then pName1
4d20: 20 69 73 20 73 65 74 20 74 6f 20 22 79 79 79 22   is set to "yyy"
4d30: 20 61 6e 64 20 70 4e 61 6d 65 32 20 69 73 20 22   and pName2 is "
4d40: 22 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  "..**.** This ro
4d50: 75 74 69 6e 65 20 73 65 74 73 20 74 68 65 20 2a  utine sets the *
4d60: 70 70 55 6e 71 75 61 6c 20 70 6f 69 6e 74 65 72  ppUnqual pointer
4d70: 20 74 6f 20 70 6f 69 6e 74 20 61 74 20 74 68 65   to point at the
4d80: 20 74 6f 6b 65 6e 20 28 70 4e 61 6d 65 31 20 6f   token (pName1 o
4d90: 72 0a 2a 2a 20 70 4e 61 6d 65 32 29 20 74 68 61  r.** pName2) tha
4da0: 74 20 73 74 6f 72 65 73 20 74 68 65 20 75 6e 71  t stores the unq
4db0: 75 61 6c 69 66 69 65 64 20 74 61 62 6c 65 20 6e  ualified table n
4dc0: 61 6d 65 2e 20 20 54 68 65 20 69 6e 64 65 78 20  ame.  The index 
4dd0: 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61  of the.** databa
4de0: 73 65 20 22 78 78 78 22 20 69 73 20 72 65 74 75  se "xxx" is retu
4df0: 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  rned..*/.int sql
4e00: 69 74 65 33 54 77 6f 50 61 72 74 4e 61 6d 65 28  ite3TwoPartName(
4e10: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
4e20: 2c 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e  ,      /* Parsin
4e30: 67 20 61 6e 64 20 63 6f 64 65 20 67 65 6e 65 72  g and code gener
4e40: 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  ating context */
4e50: 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31  .  Token *pName1
4e60: 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 22 78  ,      /* The "x
4e70: 78 78 22 20 69 6e 20 74 68 65 20 6e 61 6d 65 20  xx" in the name 
4e80: 22 78 78 78 2e 79 79 79 22 20 6f 72 20 22 78 78  "xxx.yyy" or "xx
4e90: 78 22 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  x" */.  Token *p
4ea0: 4e 61 6d 65 32 2c 20 20 20 20 20 20 2f 2a 20 54  Name2,      /* T
4eb0: 68 65 20 22 79 79 79 22 20 69 6e 20 74 68 65 20  he "yyy" in the 
4ec0: 6e 61 6d 65 20 22 78 78 78 2e 79 79 79 22 20 2a  name "xxx.yyy" *
4ed0: 2f 0a 20 20 54 6f 6b 65 6e 20 2a 2a 70 55 6e 71  /.  Token **pUnq
4ee0: 75 61 6c 20 20 20 20 20 2f 2a 20 57 72 69 74 65  ual     /* Write
4ef0: 20 74 68 65 20 75 6e 71 75 61 6c 69 66 69 65 64   the unqualified
4f00: 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20 68 65 72   object name her
4f10: 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 44  e */.){.  int iD
4f20: 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
4f30: 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
4f40: 65 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 6f 62  e holding the ob
4f50: 6a 65 63 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ject */.  sqlite
4f60: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
4f70: 64 62 3b 0a 0a 20 20 69 66 28 20 70 4e 61 6d 65  db;..  if( pName
4f80: 32 20 26 26 20 70 4e 61 6d 65 32 2d 3e 6e 3e 30  2 && pName2->n>0
4f90: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
4fa0: 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29  !db->init.busy )
4fb0: 3b 0a 20 20 20 20 2a 70 55 6e 71 75 61 6c 20 3d  ;.    *pUnqual =
4fc0: 20 70 4e 61 6d 65 32 3b 0a 20 20 20 20 69 44 62   pName2;.    iDb
4fd0: 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 44 62   = sqlite3FindDb
4fe0: 28 64 62 2c 20 70 4e 61 6d 65 31 29 3b 0a 20 20  (db, pName1);.  
4ff0: 20 20 69 66 28 20 69 44 62 3c 30 20 29 7b 0a 20    if( iDb<0 ){. 
5000: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
5010: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 75 6e  rMsg(pParse, "un
5020: 6b 6e 6f 77 6e 20 64 61 74 61 62 61 73 65 20 25  known database %
5030: 54 22 2c 20 70 4e 61 6d 65 31 29 3b 0a 20 20 20  T", pName1);.   
5040: 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b     pParse->nErr+
5050: 2b 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  +;.      return 
5060: 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  -1;.    }.  }els
5070: 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 64  e{.    assert( d
5080: 62 2d 3e 69 6e 69 74 2e 69 44 62 3d 3d 30 20 7c  b->init.iDb==0 |
5090: 7c 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20  | db->init.busy 
50a0: 29 3b 0a 20 20 20 20 69 44 62 20 3d 20 64 62 2d  );.    iDb = db-
50b0: 3e 69 6e 69 74 2e 69 44 62 3b 0a 20 20 20 20 2a  >init.iDb;.    *
50c0: 70 55 6e 71 75 61 6c 20 3d 20 70 4e 61 6d 65 31  pUnqual = pName1
50d0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 69  ;.  }.  return i
50e0: 44 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  Db;.}../*.** Thi
50f0: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65  s routine is use
5100: 64 20 74 6f 20 63 68 65 63 6b 20 69 66 20 74 68  d to check if th
5110: 65 20 55 54 46 2d 38 20 73 74 72 69 6e 67 20 7a  e UTF-8 string z
5120: 4e 61 6d 65 20 69 73 20 61 20 6c 65 67 61 6c 0a  Name is a legal.
5130: 2a 2a 20 75 6e 71 75 61 6c 69 66 69 65 64 20 6e  ** unqualified n
5140: 61 6d 65 20 66 6f 72 20 61 20 6e 65 77 20 73 63  ame for a new sc
5150: 68 65 6d 61 20 6f 62 6a 65 63 74 20 28 74 61 62  hema object (tab
5160: 6c 65 2c 20 69 6e 64 65 78 2c 20 76 69 65 77 20  le, index, view 
5170: 6f 72 0a 2a 2a 20 74 72 69 67 67 65 72 29 2e 20  or.** trigger). 
5180: 41 6c 6c 20 6e 61 6d 65 73 20 61 72 65 20 6c 65  All names are le
5190: 67 61 6c 20 65 78 63 65 70 74 20 74 68 6f 73 65  gal except those
51a0: 20 74 68 61 74 20 62 65 67 69 6e 20 77 69 74 68   that begin with
51b0: 20 74 68 65 20 73 74 72 69 6e 67 0a 2a 2a 20 22   the string.** "
51c0: 73 71 6c 69 74 65 5f 22 20 28 69 6e 20 75 70 70  sqlite_" (in upp
51d0: 65 72 2c 20 6c 6f 77 65 72 20 6f 72 20 6d 69 78  er, lower or mix
51e0: 65 64 20 63 61 73 65 29 2e 20 54 68 69 73 20 70  ed case). This p
51f0: 6f 72 74 69 6f 6e 20 6f 66 20 74 68 65 20 6e 61  ortion of the na
5200: 6d 65 73 70 61 63 65 0a 2a 2a 20 69 73 20 72 65  mespace.** is re
5210: 73 65 72 76 65 64 20 66 6f 72 20 69 6e 74 65 72  served for inter
5220: 6e 61 6c 20 75 73 65 2e 0a 2a 2f 0a 69 6e 74 20  nal use..*/.int 
5230: 73 71 6c 69 74 65 33 43 68 65 63 6b 4f 62 6a 65  sqlite3CheckObje
5240: 63 74 4e 61 6d 65 28 50 61 72 73 65 20 2a 70 50  ctName(Parse *pP
5250: 61 72 73 65 2c 20 63 6f 6e 73 74 20 63 68 61 72  arse, const char
5260: 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69 66 28 20   *zName){.  if( 
5270: 21 70 50 61 72 73 65 2d 3e 64 62 2d 3e 69 6e 69  !pParse->db->ini
5280: 74 2e 62 75 73 79 20 26 26 20 70 50 61 72 73 65  t.busy && pParse
5290: 2d 3e 6e 65 73 74 65 64 3d 3d 30 20 0a 20 20 20  ->nested==0 .   
52a0: 20 20 20 20 20 20 20 26 26 20 28 70 50 61 72 73         && (pPars
52b0: 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  e->db->flags & S
52c0: 51 4c 49 54 45 5f 57 72 69 74 65 53 63 68 65 6d  QLITE_WriteSchem
52d0: 61 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20  a)==0.          
52e0: 26 26 20 30 3d 3d 73 71 6c 69 74 65 33 53 74 72  && 0==sqlite3Str
52f0: 4e 49 43 6d 70 28 7a 4e 61 6d 65 2c 20 22 73 71  NICmp(zName, "sq
5300: 6c 69 74 65 5f 22 2c 20 37 29 20 29 7b 0a 20 20  lite_", 7) ){.  
5310: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
5320: 67 28 70 50 61 72 73 65 2c 20 22 6f 62 6a 65 63  g(pParse, "objec
5330: 74 20 6e 61 6d 65 20 72 65 73 65 72 76 65 64 20  t name reserved 
5340: 66 6f 72 20 69 6e 74 65 72 6e 61 6c 20 75 73 65  for internal use
5350: 3a 20 25 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20  : %s", zName);. 
5360: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
5370: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65  _ERROR;.  }.  re
5380: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
5390: 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65 67 69 6e 20 63  }../*.** Begin c
53a0: 6f 6e 73 74 72 75 63 74 69 6e 67 20 61 20 6e 65  onstructing a ne
53b0: 77 20 74 61 62 6c 65 20 72 65 70 72 65 73 65 6e  w table represen
53c0: 74 61 74 69 6f 6e 20 69 6e 20 6d 65 6d 6f 72 79  tation in memory
53d0: 2e 20 20 54 68 69 73 20 69 73 0a 2a 2a 20 74 68  .  This is.** th
53e0: 65 20 66 69 72 73 74 20 6f 66 20 73 65 76 65 72  e first of sever
53f0: 61 6c 20 61 63 74 69 6f 6e 20 72 6f 75 74 69 6e  al action routin
5400: 65 73 20 74 68 61 74 20 67 65 74 20 63 61 6c 6c  es that get call
5410: 65 64 20 69 6e 20 72 65 73 70 6f 6e 73 65 0a 2a  ed in response.*
5420: 2a 20 74 6f 20 61 20 43 52 45 41 54 45 20 54 41  * to a CREATE TA
5430: 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 20 20  BLE statement.  
5440: 49 6e 20 70 61 72 74 69 63 75 6c 61 72 2c 20 74  In particular, t
5450: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
5460: 61 6c 6c 65 64 0a 2a 2a 20 61 66 74 65 72 20 73  alled.** after s
5470: 65 65 69 6e 67 20 74 6f 6b 65 6e 73 20 22 43 52  eeing tokens "CR
5480: 45 41 54 45 22 20 61 6e 64 20 22 54 41 42 4c 45  EATE" and "TABLE
5490: 22 20 61 6e 64 20 74 68 65 20 74 61 62 6c 65 20  " and the table 
54a0: 6e 61 6d 65 2e 20 54 68 65 20 69 73 54 65 6d 70  name. The isTemp
54b0: 0a 2a 2a 20 66 6c 61 67 20 69 73 20 74 72 75 65  .** flag is true
54c0: 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 73 68   if the table sh
54d0: 6f 75 6c 64 20 62 65 20 73 74 6f 72 65 64 20 69  ould be stored i
54e0: 6e 20 74 68 65 20 61 75 78 69 6c 69 61 72 79 20  n the auxiliary 
54f0: 64 61 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65  database.** file
5500: 20 69 6e 73 74 65 61 64 20 6f 66 20 69 6e 20 74   instead of in t
5510: 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65  he main database
5520: 20 66 69 6c 65 2e 20 20 54 68 69 73 20 69 73 20   file.  This is 
5530: 6e 6f 72 6d 61 6c 6c 79 20 74 68 65 20 63 61 73  normally the cas
5540: 65 0a 2a 2a 20 77 68 65 6e 20 74 68 65 20 22 54  e.** when the "T
5550: 45 4d 50 22 20 6f 72 20 22 54 45 4d 50 4f 52 41  EMP" or "TEMPORA
5560: 52 59 22 20 6b 65 79 77 6f 72 64 20 6f 63 63 75  RY" keyword occu
5570: 72 73 20 69 6e 20 62 65 74 77 65 65 6e 0a 2a 2a  rs in between.**
5580: 20 43 52 45 41 54 45 20 61 6e 64 20 54 41 42 4c   CREATE and TABL
5590: 45 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65 77  E..**.** The new
55a0: 20 74 61 62 6c 65 20 72 65 63 6f 72 64 20 69 73   table record is
55b0: 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 61 6e 64   initialized and
55c0: 20 70 75 74 20 69 6e 20 70 50 61 72 73 65 2d 3e   put in pParse->
55d0: 70 4e 65 77 54 61 62 6c 65 2e 0a 2a 2a 20 41 73  pNewTable..** As
55e0: 20 6d 6f 72 65 20 6f 66 20 74 68 65 20 43 52 45   more of the CRE
55f0: 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d  ATE TABLE statem
5600: 65 6e 74 20 69 73 20 70 61 72 73 65 64 2c 20 61  ent is parsed, a
5610: 64 64 69 74 69 6f 6e 61 6c 20 61 63 74 69 6f 6e  dditional action
5620: 0a 2a 2a 20 72 6f 75 74 69 6e 65 73 20 77 69 6c  .** routines wil
5630: 6c 20 62 65 20 63 61 6c 6c 65 64 20 74 6f 20 61  l be called to a
5640: 64 64 20 6d 6f 72 65 20 69 6e 66 6f 72 6d 61 74  dd more informat
5650: 69 6f 6e 20 74 6f 20 74 68 69 73 20 72 65 63 6f  ion to this reco
5660: 72 64 2e 0a 2a 2a 20 41 74 20 74 68 65 20 65 6e  rd..** At the en
5670: 64 20 6f 66 20 74 68 65 20 43 52 45 41 54 45 20  d of the CREATE 
5680: 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2c  TABLE statement,
5690: 20 74 68 65 20 73 71 6c 69 74 65 33 45 6e 64 54   the sqlite3EndT
56a0: 61 62 6c 65 28 29 20 72 6f 75 74 69 6e 65 0a 2a  able() routine.*
56b0: 2a 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 63  * is called to c
56c0: 6f 6d 70 6c 65 74 65 20 74 68 65 20 63 6f 6e 73  omplete the cons
56d0: 74 72 75 63 74 69 6f 6e 20 6f 66 20 74 68 65 20  truction of the 
56e0: 6e 65 77 20 74 61 62 6c 65 20 72 65 63 6f 72 64  new table record
56f0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
5700: 33 53 74 61 72 74 54 61 62 6c 65 28 0a 20 20 50  3StartTable(.  P
5710: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
5720: 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e 74 65 78  /* Parser contex
5730: 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e  t */.  Token *pN
5740: 61 6d 65 31 2c 20 20 20 2f 2a 20 46 69 72 73 74  ame1,   /* First
5750: 20 70 61 72 74 20 6f 66 20 74 68 65 20 6e 61 6d   part of the nam
5760: 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 6f  e of the table o
5770: 72 20 76 69 65 77 20 2a 2f 0a 20 20 54 6f 6b 65  r view */.  Toke
5780: 6e 20 2a 70 4e 61 6d 65 32 2c 20 20 20 2f 2a 20  n *pName2,   /* 
5790: 53 65 63 6f 6e 64 20 70 61 72 74 20 6f 66 20 74  Second part of t
57a0: 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74  he name of the t
57b0: 61 62 6c 65 20 6f 72 20 76 69 65 77 20 2a 2f 0a  able or view */.
57c0: 20 20 69 6e 74 20 69 73 54 65 6d 70 2c 20 20 20    int isTemp,   
57d0: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68     /* True if th
57e0: 69 73 20 69 73 20 61 20 54 45 4d 50 20 74 61 62  is is a TEMP tab
57f0: 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73 56 69  le */.  int isVi
5800: 65 77 2c 20 20 20 20 20 20 2f 2a 20 54 72 75 65  ew,      /* True
5810: 20 69 66 20 74 68 69 73 20 69 73 20 61 20 56 49   if this is a VI
5820: 45 57 20 2a 2f 0a 20 20 69 6e 74 20 69 73 56 69  EW */.  int isVi
5830: 72 74 75 61 6c 2c 20 20 20 2f 2a 20 54 72 75 65  rtual,   /* True
5840: 20 69 66 20 74 68 69 73 20 69 73 20 61 20 56 49   if this is a VI
5850: 52 54 55 41 4c 20 74 61 62 6c 65 20 2a 2f 0a 20  RTUAL table */. 
5860: 20 69 6e 74 20 6e 6f 45 72 72 20 20 20 20 20 20   int noErr      
5870: 20 20 2f 2a 20 44 6f 20 6e 6f 74 68 69 6e 67 20    /* Do nothing 
5880: 69 66 20 74 61 62 6c 65 20 61 6c 72 65 61 64 79  if table already
5890: 20 65 78 69 73 74 73 20 2a 2f 0a 29 7b 0a 20 20   exists */.){.  
58a0: 54 61 62 6c 65 20 2a 70 54 61 62 6c 65 3b 0a 20  Table *pTable;. 
58b0: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 30   char *zName = 0
58c0: 3b 20 2f 2a 20 54 68 65 20 6e 61 6d 65 20 6f 66  ; /* The name of
58d0: 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20 2a   the new table *
58e0: 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  /.  sqlite3 *db 
58f0: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
5900: 56 64 62 65 20 2a 76 3b 0a 20 20 69 6e 74 20 69  Vdbe *v;.  int i
5910: 44 62 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 44  Db;         /* D
5920: 61 74 61 62 61 73 65 20 6e 75 6d 62 65 72 20 74  atabase number t
5930: 6f 20 63 72 65 61 74 65 20 74 68 65 20 74 61 62  o create the tab
5940: 6c 65 20 69 6e 20 2a 2f 0a 20 20 54 6f 6b 65 6e  le in */.  Token
5950: 20 2a 70 4e 61 6d 65 3b 20 20 20 20 2f 2a 20 55   *pName;    /* U
5960: 6e 71 75 61 6c 69 66 69 65 64 20 6e 61 6d 65 20  nqualified name 
5970: 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20  of the table to 
5980: 63 72 65 61 74 65 20 2a 2f 0a 0a 20 20 2f 2a 20  create */..  /* 
5990: 54 68 65 20 74 61 62 6c 65 20 6f 72 20 76 69 65  The table or vie
59a0: 77 20 6e 61 6d 65 20 74 6f 20 63 72 65 61 74 65  w name to create
59b0: 20 69 73 20 70 61 73 73 65 64 20 74 6f 20 74 68   is passed to th
59c0: 69 73 20 72 6f 75 74 69 6e 65 20 76 69 61 20 74  is routine via t
59d0: 6f 6b 65 6e 73 0a 20 20 2a 2a 20 70 4e 61 6d 65  okens.  ** pName
59e0: 31 20 61 6e 64 20 70 4e 61 6d 65 32 2e 20 49 66  1 and pName2. If
59f0: 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20   the table name 
5a00: 77 61 73 20 66 75 6c 6c 79 20 71 75 61 6c 69 66  was fully qualif
5a10: 69 65 64 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65  ied, for example
5a20: 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43 52 45 41  :.  **.  ** CREA
5a30: 54 45 20 54 41 42 4c 45 20 78 78 78 2e 79 79 79  TE TABLE xxx.yyy
5a40: 20 28 2e 2e 2e 29 3b 0a 20 20 2a 2a 20 0a 20 20   (...);.  ** .  
5a50: 2a 2a 20 54 68 65 6e 20 70 4e 61 6d 65 31 20 69  ** Then pName1 i
5a60: 73 20 73 65 74 20 74 6f 20 22 78 78 78 22 20 61  s set to "xxx" a
5a70: 6e 64 20 70 4e 61 6d 65 32 20 22 79 79 79 22 2e  nd pName2 "yyy".
5a80: 20 4f 6e 20 74 68 65 20 6f 74 68 65 72 20 68 61   On the other ha
5a90: 6e 64 20 69 66 0a 20 20 2a 2a 20 74 68 65 20 74  nd if.  ** the t
5aa0: 61 62 6c 65 20 6e 61 6d 65 20 69 73 20 6e 6f 74  able name is not
5ab0: 20 66 75 6c 6c 79 20 71 75 61 6c 69 66 69 65 64   fully qualified
5ac0: 2c 20 69 2e 65 2e 3a 0a 20 20 2a 2a 0a 20 20 2a  , i.e.:.  **.  *
5ad0: 2a 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 79  * CREATE TABLE y
5ae0: 79 79 28 2e 2e 2e 29 3b 0a 20 20 2a 2a 0a 20 20  yy(...);.  **.  
5af0: 2a 2a 20 54 68 65 6e 20 70 4e 61 6d 65 31 20 69  ** Then pName1 i
5b00: 73 20 73 65 74 20 74 6f 20 22 79 79 79 22 20 61  s set to "yyy" a
5b10: 6e 64 20 70 4e 61 6d 65 32 20 69 73 20 22 22 2e  nd pName2 is "".
5b20: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 63  .  **.  ** The c
5b30: 61 6c 6c 20 62 65 6c 6f 77 20 73 65 74 73 20 74  all below sets t
5b40: 68 65 20 70 4e 61 6d 65 20 70 6f 69 6e 74 65 72  he pName pointer
5b50: 20 74 6f 20 70 6f 69 6e 74 20 61 74 20 74 68 65   to point at the
5b60: 20 74 6f 6b 65 6e 20 28 70 4e 61 6d 65 31 20 6f   token (pName1 o
5b70: 72 0a 20 20 2a 2a 20 70 4e 61 6d 65 32 29 20 74  r.  ** pName2) t
5b80: 68 61 74 20 73 74 6f 72 65 73 20 74 68 65 20 75  hat stores the u
5b90: 6e 71 75 61 6c 69 66 69 65 64 20 74 61 62 6c 65  nqualified table
5ba0: 20 6e 61 6d 65 2e 20 54 68 65 20 76 61 72 69 61   name. The varia
5bb0: 62 6c 65 20 69 44 62 20 69 73 0a 20 20 2a 2a 20  ble iDb is.  ** 
5bc0: 73 65 74 20 74 6f 20 74 68 65 20 69 6e 64 65 78  set to the index
5bd0: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
5be0: 20 74 68 61 74 20 74 68 65 20 74 61 62 6c 65 20   that the table 
5bf0: 6f 72 20 76 69 65 77 20 69 73 20 74 6f 20 62 65  or view is to be
5c00: 0a 20 20 2a 2a 20 63 72 65 61 74 65 64 20 69 6e  .  ** created in
5c10: 2e 0a 20 20 2a 2f 0a 20 20 69 44 62 20 3d 20 73  ..  */.  iDb = s
5c20: 71 6c 69 74 65 33 54 77 6f 50 61 72 74 4e 61 6d  qlite3TwoPartNam
5c30: 65 28 70 50 61 72 73 65 2c 20 70 4e 61 6d 65 31  e(pParse, pName1
5c40: 2c 20 70 4e 61 6d 65 32 2c 20 26 70 4e 61 6d 65  , pName2, &pName
5c50: 29 3b 0a 20 20 69 66 28 20 69 44 62 3c 30 20 29  );.  if( iDb<0 )
5c60: 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 21   return;.  if( !
5c70: 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26 26 20 69  OMIT_TEMPDB && i
5c80: 73 54 65 6d 70 20 26 26 20 69 44 62 3e 31 20 29  sTemp && iDb>1 )
5c90: 7b 0a 20 20 20 20 2f 2a 20 49 66 20 63 72 65 61  {.    /* If crea
5ca0: 74 69 6e 67 20 61 20 74 65 6d 70 20 74 61 62 6c  ting a temp tabl
5cb0: 65 2c 20 74 68 65 20 6e 61 6d 65 20 6d 61 79 20  e, the name may 
5cc0: 6e 6f 74 20 62 65 20 71 75 61 6c 69 66 69 65 64  not be qualified
5cd0: 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 45   */.    sqlite3E
5ce0: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
5cf0: 22 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65  "temporary table
5d00: 20 6e 61 6d 65 20 6d 75 73 74 20 62 65 20 75 6e   name must be un
5d10: 71 75 61 6c 69 66 69 65 64 22 29 3b 0a 20 20 20  qualified");.   
5d20: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69   return;.  }.  i
5d30: 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20  f( !OMIT_TEMPDB 
5d40: 26 26 20 69 73 54 65 6d 70 20 29 20 69 44 62 20  && isTemp ) iDb 
5d50: 3d 20 31 3b 0a 0a 20 20 70 50 61 72 73 65 2d 3e  = 1;..  pParse->
5d60: 73 4e 61 6d 65 54 6f 6b 65 6e 20 3d 20 2a 70 4e  sNameToken = *pN
5d70: 61 6d 65 3b 0a 20 20 7a 4e 61 6d 65 20 3d 20 73  ame;.  zName = s
5d80: 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f  qlite3NameFromTo
5d90: 6b 65 6e 28 70 4e 61 6d 65 29 3b 0a 20 20 69 66  ken(pName);.  if
5da0: 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 20 72 65 74  ( zName==0 ) ret
5db0: 75 72 6e 3b 0a 20 20 69 66 28 20 53 51 4c 49 54  urn;.  if( SQLIT
5dc0: 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 43 68 65  E_OK!=sqlite3Che
5dd0: 63 6b 4f 62 6a 65 63 74 4e 61 6d 65 28 70 50 61  ckObjectName(pPa
5de0: 72 73 65 2c 20 7a 4e 61 6d 65 29 20 29 7b 0a 20  rse, zName) ){. 
5df0: 20 20 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61     goto begin_ta
5e00: 62 6c 65 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 20  ble_error;.  }. 
5e10: 20 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 69 44   if( db->init.iD
5e20: 62 3d 3d 31 20 29 20 69 73 54 65 6d 70 20 3d 20  b==1 ) isTemp = 
5e30: 31 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  1;.#ifndef SQLIT
5e40: 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41  E_OMIT_AUTHORIZA
5e50: 54 49 4f 4e 0a 20 20 61 73 73 65 72 74 28 20 28  TION.  assert( (
5e60: 69 73 54 65 6d 70 20 26 20 31 29 3d 3d 69 73 54  isTemp & 1)==isT
5e70: 65 6d 70 20 29 3b 0a 20 20 7b 0a 20 20 20 20 69  emp );.  {.    i
5e80: 6e 74 20 63 6f 64 65 3b 0a 20 20 20 20 63 68 61  nt code;.    cha
5e90: 72 20 2a 7a 44 62 20 3d 20 64 62 2d 3e 61 44 62  r *zDb = db->aDb
5ea0: 5b 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20  [iDb].zName;.   
5eb0: 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68   if( sqlite3Auth
5ec0: 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51  Check(pParse, SQ
5ed0: 4c 49 54 45 5f 49 4e 53 45 52 54 2c 20 53 43 48  LITE_INSERT, SCH
5ee0: 45 4d 41 5f 54 41 42 4c 45 28 69 73 54 65 6d 70  EMA_TABLE(isTemp
5ef0: 29 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20  ), 0, zDb) ){.  
5f00: 20 20 20 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74      goto begin_t
5f10: 61 62 6c 65 5f 65 72 72 6f 72 3b 0a 20 20 20 20  able_error;.    
5f20: 7d 0a 20 20 20 20 69 66 28 20 69 73 56 69 65 77  }.    if( isView
5f30: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 21 4f   ){.      if( !O
5f40: 4d 49 54 5f 54 45 4d 50 44 42 20 26 26 20 69 73  MIT_TEMPDB && is
5f50: 54 65 6d 70 20 29 7b 0a 20 20 20 20 20 20 20 20  Temp ){.        
5f60: 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 43 52  code = SQLITE_CR
5f70: 45 41 54 45 5f 54 45 4d 50 5f 56 49 45 57 3b 0a  EATE_TEMP_VIEW;.
5f80: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
5f90: 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49       code = SQLI
5fa0: 54 45 5f 43 52 45 41 54 45 5f 56 49 45 57 3b 0a  TE_CREATE_VIEW;.
5fb0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
5fc0: 65 7b 0a 20 20 20 20 20 20 69 66 28 20 21 4f 4d  e{.      if( !OM
5fd0: 49 54 5f 54 45 4d 50 44 42 20 26 26 20 69 73 54  IT_TEMPDB && isT
5fe0: 65 6d 70 20 29 7b 0a 20 20 20 20 20 20 20 20 63  emp ){.        c
5ff0: 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 43 52 45  ode = SQLITE_CRE
6000: 41 54 45 5f 54 45 4d 50 5f 54 41 42 4c 45 3b 0a  ATE_TEMP_TABLE;.
6010: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
6020: 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49       code = SQLI
6030: 54 45 5f 43 52 45 41 54 45 5f 54 41 42 4c 45 3b  TE_CREATE_TABLE;
6040: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
6050: 20 20 20 69 66 28 20 21 69 73 56 69 72 74 75 61     if( !isVirtua
6060: 6c 20 26 26 20 73 71 6c 69 74 65 33 41 75 74 68  l && sqlite3Auth
6070: 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 63 6f  Check(pParse, co
6080: 64 65 2c 20 7a 4e 61 6d 65 2c 20 30 2c 20 7a 44  de, zName, 0, zD
6090: 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  b) ){.      goto
60a0: 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72   begin_table_err
60b0: 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65  or;.    }.  }.#e
60c0: 6e 64 69 66 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20  ndif..  /* Make 
60d0: 73 75 72 65 20 74 68 65 20 6e 65 77 20 74 61 62  sure the new tab
60e0: 6c 65 20 6e 61 6d 65 20 64 6f 65 73 20 6e 6f 74  le name does not
60f0: 20 63 6f 6c 6c 69 64 65 20 77 69 74 68 20 61 6e   collide with an
6100: 20 65 78 69 73 74 69 6e 67 0a 20 20 2a 2a 20 69   existing.  ** i
6110: 6e 64 65 78 20 6f 72 20 74 61 62 6c 65 20 6e 61  ndex or table na
6120: 6d 65 20 69 6e 20 74 68 65 20 73 61 6d 65 20 64  me in the same d
6130: 61 74 61 62 61 73 65 2e 20 20 49 73 73 75 65 20  atabase.  Issue 
6140: 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  an error message
6150: 20 69 66 0a 20 20 2a 2a 20 69 74 20 64 6f 65 73   if.  ** it does
6160: 2e 20 54 68 65 20 65 78 63 65 70 74 69 6f 6e 20  . The exception 
6170: 69 73 20 69 66 20 74 68 65 20 73 74 61 74 65 6d  is if the statem
6180: 65 6e 74 20 62 65 69 6e 67 20 70 61 72 73 65 64  ent being parsed
6190: 20 77 61 73 20 70 61 73 73 65 64 0a 20 20 2a 2a   was passed.  **
61a0: 20 74 6f 20 61 6e 20 73 71 6c 69 74 65 33 5f 64   to an sqlite3_d
61b0: 65 63 6c 61 72 65 5f 76 74 61 62 28 29 20 63 61  eclare_vtab() ca
61c0: 6c 6c 2e 20 49 6e 20 74 68 61 74 20 63 61 73 65  ll. In that case
61d0: 20 6f 6e 6c 79 20 74 68 65 20 63 6f 6c 75 6d 6e   only the column
61e0: 20 6e 61 6d 65 73 0a 20 20 2a 2a 20 61 6e 64 20   names.  ** and 
61f0: 74 79 70 65 73 20 77 69 6c 6c 20 62 65 20 75 73  types will be us
6200: 65 64 2c 20 73 6f 20 74 68 65 72 65 20 69 73 20  ed, so there is 
6210: 6e 6f 20 6e 65 65 64 20 74 6f 20 74 65 73 74 20  no need to test 
6220: 66 6f 72 20 6e 61 6d 65 73 70 61 63 65 0a 20 20  for namespace.  
6230: 2a 2a 20 63 6f 6c 6c 69 73 69 6f 6e 73 2e 0a 20  ** collisions.. 
6240: 20 2a 2f 0a 20 20 69 66 28 20 21 49 4e 5f 44 45   */.  if( !IN_DE
6250: 43 4c 41 52 45 5f 56 54 41 42 20 29 7b 0a 20 20  CLARE_VTAB ){.  
6260: 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21    if( SQLITE_OK!
6270: 3d 73 71 6c 69 74 65 33 52 65 61 64 53 63 68 65  =sqlite3ReadSche
6280: 6d 61 28 70 50 61 72 73 65 29 20 29 7b 0a 20 20  ma(pParse) ){.  
6290: 20 20 20 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74      goto begin_t
62a0: 61 62 6c 65 5f 65 72 72 6f 72 3b 0a 20 20 20 20  able_error;.    
62b0: 7d 0a 20 20 20 20 70 54 61 62 6c 65 20 3d 20 73  }.    pTable = s
62c0: 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28  qlite3FindTable(
62d0: 64 62 2c 20 7a 4e 61 6d 65 2c 20 64 62 2d 3e 61  db, zName, db->a
62e0: 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 29 3b 0a  Db[iDb].zName);.
62f0: 20 20 20 20 69 66 28 20 70 54 61 62 6c 65 20 29      if( pTable )
6300: 7b 0a 20 20 20 20 20 20 69 66 28 20 21 6e 6f 45  {.      if( !noE
6310: 72 72 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  rr ){.        sq
6320: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
6330: 61 72 73 65 2c 20 22 74 61 62 6c 65 20 25 54 20  arse, "table %T 
6340: 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 22 2c  already exists",
6350: 20 70 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d   pName);.      }
6360: 0a 20 20 20 20 20 20 67 6f 74 6f 20 62 65 67 69  .      goto begi
6370: 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b 0a 20  n_table_error;. 
6380: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 71 6c     }.    if( sql
6390: 69 74 65 33 46 69 6e 64 49 6e 64 65 78 28 64 62  ite3FindIndex(db
63a0: 2c 20 7a 4e 61 6d 65 2c 20 30 29 21 3d 30 20 26  , zName, 0)!=0 &
63b0: 26 20 28 69 44 62 3d 3d 30 20 7c 7c 20 21 64 62  & (iDb==0 || !db
63c0: 2d 3e 69 6e 69 74 2e 62 75 73 79 29 20 29 7b 0a  ->init.busy) ){.
63d0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
63e0: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74  orMsg(pParse, "t
63f0: 68 65 72 65 20 69 73 20 61 6c 72 65 61 64 79 20  here is already 
6400: 61 6e 20 69 6e 64 65 78 20 6e 61 6d 65 64 20 25  an index named %
6410: 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  s", zName);.    
6420: 20 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62    goto begin_tab
6430: 6c 65 5f 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a  le_error;.    }.
6440: 20 20 7d 0a 0a 20 20 70 54 61 62 6c 65 20 3d 20    }..  pTable = 
6450: 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69  sqliteMalloc( si
6460: 7a 65 6f 66 28 54 61 62 6c 65 29 20 29 3b 0a 20  zeof(Table) );. 
6470: 20 69 66 28 20 70 54 61 62 6c 65 3d 3d 30 20 29   if( pTable==0 )
6480: 7b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 72 63  {.    pParse->rc
6490: 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
64a0: 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72  .    pParse->nEr
64b0: 72 2b 2b 3b 0a 20 20 20 20 67 6f 74 6f 20 62 65  r++;.    goto be
64c0: 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b  gin_table_error;
64d0: 0a 20 20 7d 0a 20 20 70 54 61 62 6c 65 2d 3e 7a  .  }.  pTable->z
64e0: 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20  Name = zName;.  
64f0: 70 54 61 62 6c 65 2d 3e 69 50 4b 65 79 20 3d 20  pTable->iPKey = 
6500: 2d 31 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 70 53  -1;.  pTable->pS
6510: 63 68 65 6d 61 20 3d 20 64 62 2d 3e 61 44 62 5b  chema = db->aDb[
6520: 69 44 62 5d 2e 70 53 63 68 65 6d 61 3b 0a 20 20  iDb].pSchema;.  
6530: 70 54 61 62 6c 65 2d 3e 6e 52 65 66 20 3d 20 31  pTable->nRef = 1
6540: 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  ;.  if( pParse->
6550: 70 4e 65 77 54 61 62 6c 65 20 29 20 73 71 6c 69  pNewTable ) sqli
6560: 74 65 33 44 65 6c 65 74 65 54 61 62 6c 65 28 64  te3DeleteTable(d
6570: 62 2c 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54  b, pParse->pNewT
6580: 61 62 6c 65 29 3b 0a 20 20 70 50 61 72 73 65 2d  able);.  pParse-
6590: 3e 70 4e 65 77 54 61 62 6c 65 20 3d 20 70 54 61  >pNewTable = pTa
65a0: 62 6c 65 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  ble;..  /* If th
65b0: 69 73 20 69 73 20 74 68 65 20 6d 61 67 69 63 20  is is the magic 
65c0: 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 20  sqlite_sequence 
65d0: 74 61 62 6c 65 20 75 73 65 64 20 62 79 20 61 75  table used by au
65e0: 74 6f 69 6e 63 72 65 6d 65 6e 74 2c 0a 20 20 2a  toincrement,.  *
65f0: 2a 20 74 68 65 6e 20 72 65 63 6f 72 64 20 61 20  * then record a 
6600: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 69 73 20  pointer to this 
6610: 74 61 62 6c 65 20 69 6e 20 74 68 65 20 6d 61 69  table in the mai
6620: 6e 20 64 61 74 61 62 61 73 65 20 73 74 72 75 63  n database struc
6630: 74 75 72 65 0a 20 20 2a 2a 20 73 6f 20 74 68 61  ture.  ** so tha
6640: 74 20 49 4e 53 45 52 54 20 63 61 6e 20 66 69 6e  t INSERT can fin
6650: 64 20 74 68 65 20 74 61 62 6c 65 20 65 61 73 69  d the table easi
6660: 6c 79 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66  ly..  */.#ifndef
6670: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
6680: 4f 49 4e 43 52 45 4d 45 4e 54 0a 20 20 69 66 28  OINCREMENT.  if(
6690: 20 21 70 50 61 72 73 65 2d 3e 6e 65 73 74 65 64   !pParse->nested
66a0: 20 26 26 20 73 74 72 63 6d 70 28 7a 4e 61 6d 65   && strcmp(zName
66b0: 2c 20 22 73 71 6c 69 74 65 5f 73 65 71 75 65 6e  , "sqlite_sequen
66c0: 63 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70  ce")==0 ){.    p
66d0: 54 61 62 6c 65 2d 3e 70 53 63 68 65 6d 61 2d 3e  Table->pSchema->
66e0: 70 53 65 71 54 61 62 20 3d 20 70 54 61 62 6c 65  pSeqTab = pTable
66f0: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
6700: 2f 2a 20 42 65 67 69 6e 20 67 65 6e 65 72 61 74  /* Begin generat
6710: 69 6e 67 20 74 68 65 20 63 6f 64 65 20 74 68 61  ing the code tha
6720: 74 20 77 69 6c 6c 20 69 6e 73 65 72 74 20 74 68  t will insert th
6730: 65 20 74 61 62 6c 65 20 72 65 63 6f 72 64 20 69  e table record i
6740: 6e 74 6f 0a 20 20 2a 2a 20 74 68 65 20 53 51 4c  nto.  ** the SQL
6750: 49 54 45 5f 4d 41 53 54 45 52 20 74 61 62 6c 65  ITE_MASTER table
6760: 2e 20 20 4e 6f 74 65 20 69 6e 20 70 61 72 74 69  .  Note in parti
6770: 63 75 6c 61 72 20 74 68 61 74 20 77 65 20 6d 75  cular that we mu
6780: 73 74 20 67 6f 20 61 68 65 61 64 0a 20 20 2a 2a  st go ahead.  **
6790: 20 61 6e 64 20 61 6c 6c 6f 63 61 74 65 20 74 68   and allocate th
67a0: 65 20 72 65 63 6f 72 64 20 6e 75 6d 62 65 72 20  e record number 
67b0: 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20 65 6e  for the table en
67c0: 74 72 79 20 6e 6f 77 2e 20 20 42 65 66 6f 72 65  try now.  Before
67d0: 20 61 6e 79 0a 20 20 2a 2a 20 50 52 49 4d 41 52   any.  ** PRIMAR
67e0: 59 20 4b 45 59 20 6f 72 20 55 4e 49 51 55 45 20  Y KEY or UNIQUE 
67f0: 6b 65 79 77 6f 72 64 73 20 61 72 65 20 70 61 72  keywords are par
6800: 73 65 64 2e 20 20 54 68 6f 73 65 20 6b 65 79 77  sed.  Those keyw
6810: 6f 72 64 73 20 77 69 6c 6c 20 63 61 75 73 65 0a  ords will cause.
6820: 20 20 2a 2a 20 69 6e 64 69 63 65 73 20 74 6f 20    ** indices to 
6830: 62 65 20 63 72 65 61 74 65 64 20 61 6e 64 20 74  be created and t
6840: 68 65 20 74 61 62 6c 65 20 72 65 63 6f 72 64 20  he table record 
6850: 6d 75 73 74 20 63 6f 6d 65 20 62 65 66 6f 72 65  must come before
6860: 20 74 68 65 20 0a 20 20 2a 2a 20 69 6e 64 69 63   the .  ** indic
6870: 65 73 2e 20 20 48 65 6e 63 65 2c 20 74 68 65 20  es.  Hence, the 
6880: 72 65 63 6f 72 64 20 6e 75 6d 62 65 72 20 66 6f  record number fo
6890: 72 20 74 68 65 20 74 61 62 6c 65 20 6d 75 73 74  r the table must
68a0: 20 62 65 20 61 6c 6c 6f 63 61 74 65 64 0a 20 20   be allocated.  
68b0: 2a 2a 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 69  ** now..  */.  i
68c0: 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73  f( !db->init.bus
68d0: 79 20 26 26 20 28 76 20 3d 20 73 71 6c 69 74 65  y && (v = sqlite
68e0: 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
68f0: 29 21 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20  )!=0 ){.    int 
6900: 6c 62 6c 3b 0a 20 20 20 20 69 6e 74 20 66 69 6c  lbl;.    int fil
6910: 65 46 6f 72 6d 61 74 3b 0a 20 20 20 20 73 71 6c  eFormat;.    sql
6920: 69 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70  ite3BeginWriteOp
6930: 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20  eration(pParse, 
6940: 30 2c 20 69 44 62 29 3b 0a 0a 23 69 66 6e 64 65  0, iDb);..#ifnde
6950: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
6960: 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 69  RTUALTABLE.    i
6970: 66 28 20 69 73 56 69 72 74 75 61 6c 20 29 7b 0a  f( isVirtual ){.
6980: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
6990: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 56 42 65  eAddOp(v, OP_VBe
69a0: 67 69 6e 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  gin, 0, 0);.    
69b0: 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a  }.#endif..    /*
69c0: 20 49 66 20 74 68 65 20 66 69 6c 65 20 66 6f 72   If the file for
69d0: 6d 61 74 20 61 6e 64 20 65 6e 63 6f 64 69 6e 67  mat and encoding
69e0: 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
69f0: 20 68 61 76 65 20 6e 6f 74 20 62 65 65 6e 20 73   have not been s
6a00: 65 74 2c 20 0a 20 20 20 20 2a 2a 20 73 65 74 20  et, .    ** set 
6a10: 74 68 65 6d 20 6e 6f 77 2e 0a 20 20 20 20 2a 2f  them now..    */
6a20: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
6a30: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52 65 61 64  AddOp(v, OP_Read
6a40: 43 6f 6f 6b 69 65 2c 20 69 44 62 2c 20 31 29 3b  Cookie, iDb, 1);
6a50: 20 20 20 2f 2a 20 66 69 6c 65 5f 66 6f 72 6d 61     /* file_forma
6a60: 74 20 2a 2f 0a 20 20 20 20 6c 62 6c 20 3d 20 73  t */.    lbl = s
6a70: 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
6a80: 62 65 6c 28 76 29 3b 0a 20 20 20 20 73 71 6c 69  bel(v);.    sqli
6a90: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
6aa0: 4f 50 5f 49 66 2c 20 30 2c 20 6c 62 6c 29 3b 0a  OP_If, 0, lbl);.
6ab0: 20 20 20 20 66 69 6c 65 46 6f 72 6d 61 74 20 3d      fileFormat =
6ac0: 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51   (db->flags & SQ
6ad0: 4c 49 54 45 5f 4c 65 67 61 63 79 46 69 6c 65 46  LITE_LegacyFileF
6ae0: 6d 74 29 21 3d 30 20 3f 0a 20 20 20 20 20 20 20  mt)!=0 ?.       
6af0: 20 20 20 20 20 20 20 20 20 20 20 31 20 3a 20 53             1 : S
6b00: 51 4c 49 54 45 5f 4d 41 58 5f 46 49 4c 45 5f 46  QLITE_MAX_FILE_F
6b10: 4f 52 4d 41 54 3b 0a 20 20 20 20 73 71 6c 69 74  ORMAT;.    sqlit
6b20: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
6b30: 50 5f 49 6e 74 65 67 65 72 2c 20 66 69 6c 65 46  P_Integer, fileF
6b40: 6f 72 6d 61 74 2c 20 30 29 3b 0a 20 20 20 20 73  ormat, 0);.    s
6b50: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
6b60: 76 2c 20 4f 50 5f 53 65 74 43 6f 6f 6b 69 65 2c  v, OP_SetCookie,
6b70: 20 69 44 62 2c 20 31 29 3b 0a 20 20 20 20 73 71   iDb, 1);.    sq
6b80: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
6b90: 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 45 4e  , OP_Integer, EN
6ba0: 43 28 64 62 29 2c 20 30 29 3b 0a 20 20 20 20 73  C(db), 0);.    s
6bb0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
6bc0: 76 2c 20 4f 50 5f 53 65 74 43 6f 6f 6b 69 65 2c  v, OP_SetCookie,
6bd0: 20 69 44 62 2c 20 34 29 3b 0a 20 20 20 20 73 71   iDb, 4);.    sq
6be0: 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
6bf0: 4c 61 62 65 6c 28 76 2c 20 6c 62 6c 29 3b 0a 0a  Label(v, lbl);..
6c00: 20 20 20 20 2f 2a 20 54 68 69 73 20 6a 75 73 74      /* This just
6c10: 20 63 72 65 61 74 65 73 20 61 20 70 6c 61 63 65   creates a place
6c20: 2d 68 6f 6c 64 65 72 20 72 65 63 6f 72 64 20 69  -holder record i
6c30: 6e 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73  n the sqlite_mas
6c40: 74 65 72 20 74 61 62 6c 65 2e 0a 20 20 20 20 2a  ter table..    *
6c50: 2a 20 54 68 65 20 72 65 63 6f 72 64 20 63 72 65  * The record cre
6c60: 61 74 65 64 20 64 6f 65 73 20 6e 6f 74 20 63 6f  ated does not co
6c70: 6e 74 61 69 6e 20 61 6e 79 74 68 69 6e 67 20 79  ntain anything y
6c80: 65 74 2e 20 20 49 74 20 77 69 6c 6c 20 62 65 20  et.  It will be 
6c90: 72 65 70 6c 61 63 65 64 0a 20 20 20 20 2a 2a 20  replaced.    ** 
6ca0: 62 79 20 74 68 65 20 72 65 61 6c 20 65 6e 74 72  by the real entr
6cb0: 79 20 69 6e 20 63 6f 64 65 20 67 65 6e 65 72 61  y in code genera
6cc0: 74 65 64 20 61 74 20 73 71 6c 69 74 65 33 45 6e  ted at sqlite3En
6cd0: 64 54 61 62 6c 65 28 29 2e 0a 20 20 20 20 2a 2a  dTable()..    **
6ce0: 0a 20 20 20 20 2a 2a 20 54 68 65 20 72 6f 77 69  .    ** The rowi
6cf0: 64 20 66 6f 72 20 74 68 65 20 6e 65 77 20 65 6e  d for the new en
6d00: 74 72 79 20 69 73 20 6c 65 66 74 20 6f 6e 20 74  try is left on t
6d10: 68 65 20 74 6f 70 20 6f 66 20 74 68 65 20 73 74  he top of the st
6d20: 61 63 6b 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20  ack..    ** The 
6d30: 72 6f 77 69 64 20 76 61 6c 75 65 20 69 73 20 6e  rowid value is n
6d40: 65 65 64 65 64 20 62 79 20 74 68 65 20 63 6f 64  eeded by the cod
6d50: 65 20 74 68 61 74 20 73 71 6c 69 74 65 33 45 6e  e that sqlite3En
6d60: 64 54 61 62 6c 65 20 77 69 6c 6c 0a 20 20 20 20  dTable will.    
6d70: 2a 2a 20 67 65 6e 65 72 61 74 65 2e 0a 20 20 20  ** generate..   
6d80: 20 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64   */.#if !defined
6d90: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45  (SQLITE_OMIT_VIE
6da0: 57 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53  W) || !defined(S
6db0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
6dc0: 41 4c 54 41 42 4c 45 29 0a 20 20 20 20 69 66 28  ALTABLE).    if(
6dd0: 20 69 73 56 69 65 77 20 7c 7c 20 69 73 56 69 72   isView || isVir
6de0: 74 75 61 6c 20 29 7b 0a 20 20 20 20 20 20 73 71  tual ){.      sq
6df0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
6e00: 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c  , OP_Integer, 0,
6e10: 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 0a 23   0);.    }else.#
6e20: 65 6e 64 69 66 0a 20 20 20 20 7b 0a 20 20 20 20  endif.    {.    
6e30: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
6e40: 4f 70 28 76 2c 20 4f 50 5f 43 72 65 61 74 65 54  Op(v, OP_CreateT
6e50: 61 62 6c 65 2c 20 69 44 62 2c 20 30 29 3b 0a 20  able, iDb, 0);. 
6e60: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
6e70: 4f 70 65 6e 4d 61 73 74 65 72 54 61 62 6c 65 28  OpenMasterTable(
6e80: 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20  pParse, iDb);.  
6e90: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
6ea0: 4f 70 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77 69  Op(v, OP_NewRowi
6eb0: 64 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71  d, 0, 0);.    sq
6ec0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
6ed0: 2c 20 4f 50 5f 44 75 70 2c 20 30 2c 20 30 29 3b  , OP_Dup, 0, 0);
6ee0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
6ef0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 75 6c 6c  AddOp(v, OP_Null
6f00: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  , 0, 0);.    sql
6f10: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
6f20: 20 4f 50 5f 49 6e 73 65 72 74 2c 20 30 2c 20 4f   OP_Insert, 0, O
6f30: 50 46 4c 41 47 5f 41 50 50 45 4e 44 29 3b 0a 20  PFLAG_APPEND);. 
6f40: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
6f50: 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c  dOp(v, OP_Close,
6f60: 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69   0, 0);.    sqli
6f70: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
6f80: 4f 50 5f 50 75 6c 6c 2c 20 31 2c 20 30 29 3b 0a  OP_Pull, 1, 0);.
6f90: 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 72 6d 61 6c    }..  /* Normal
6fa0: 20 28 6e 6f 6e 2d 65 72 72 6f 72 29 20 72 65 74   (non-error) ret
6fb0: 75 72 6e 2e 20 2a 2f 0a 20 20 72 65 74 75 72 6e  urn. */.  return
6fc0: 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 20 65 72  ;..  /* If an er
6fd0: 72 6f 72 20 6f 63 63 75 72 73 2c 20 77 65 20 6a  ror occurs, we j
6fe0: 75 6d 70 20 68 65 72 65 20 2a 2f 0a 62 65 67 69  ump here */.begi
6ff0: 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3a 0a 20  n_table_error:. 
7000: 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4e 61 6d   sqliteFree(zNam
7010: 65 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a  e);.  return;.}.
7020: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 6d 61 63 72  ./*.** This macr
7030: 6f 20 69 73 20 75 73 65 64 20 74 6f 20 63 6f 6d  o is used to com
7040: 70 61 72 65 20 74 77 6f 20 73 74 72 69 6e 67 73  pare two strings
7050: 20 69 6e 20 61 20 63 61 73 65 2d 69 6e 73 65 6e   in a case-insen
7060: 73 69 74 69 76 65 20 6d 61 6e 6e 65 72 2e 0a 2a  sitive manner..*
7070: 2a 20 49 74 20 69 73 20 73 6c 69 67 68 74 6c 79  * It is slightly
7080: 20 66 61 73 74 65 72 20 74 68 61 6e 20 63 61 6c   faster than cal
7090: 6c 69 6e 67 20 73 71 6c 69 74 65 33 53 74 72 49  ling sqlite3StrI
70a0: 43 6d 70 28 29 20 64 69 72 65 63 74 6c 79 2c 20  Cmp() directly, 
70b0: 62 75 74 0a 2a 2a 20 70 72 6f 64 75 63 65 73 20  but.** produces 
70c0: 6c 61 72 67 65 72 20 63 6f 64 65 2e 0a 2a 2a 0a  larger code..**.
70d0: 2a 2a 20 57 41 52 4e 49 4e 47 3a 20 54 68 69 73  ** WARNING: This
70e0: 20 6d 61 63 72 6f 20 69 73 20 6e 6f 74 20 63 6f   macro is not co
70f0: 6d 70 61 74 69 62 6c 65 20 77 69 74 68 20 74 68  mpatible with th
7100: 65 20 73 74 72 63 6d 70 28 29 20 66 61 6d 69 6c  e strcmp() famil
7110: 79 2e 20 49 74 0a 2a 2a 20 72 65 74 75 72 6e 73  y. It.** returns
7120: 20 74 72 75 65 20 69 66 20 74 68 65 20 74 77 6f   true if the two
7130: 20 73 74 72 69 6e 67 73 20 61 72 65 20 65 71 75   strings are equ
7140: 61 6c 2c 20 6f 74 68 65 72 77 69 73 65 20 66 61  al, otherwise fa
7150: 6c 73 65 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  lse..*/.#define 
7160: 53 54 52 49 43 4d 50 28 78 2c 20 79 29 20 28 5c  STRICMP(x, y) (\
7170: 0a 73 71 6c 69 74 65 33 55 70 70 65 72 54 6f 4c  .sqlite3UpperToL
7180: 6f 77 65 72 5b 2a 28 75 6e 73 69 67 6e 65 64 20  ower[*(unsigned 
7190: 63 68 61 72 20 2a 29 28 78 29 5d 3d 3d 20 20 20  char *)(x)]==   
71a0: 5c 0a 73 71 6c 69 74 65 33 55 70 70 65 72 54 6f  \.sqlite3UpperTo
71b0: 4c 6f 77 65 72 5b 2a 28 75 6e 73 69 67 6e 65 64  Lower[*(unsigned
71c0: 20 63 68 61 72 20 2a 29 28 79 29 5d 20 20 20 20   char *)(y)]    
71d0: 20 5c 0a 26 26 20 73 71 6c 69 74 65 33 53 74 72   \.&& sqlite3Str
71e0: 49 43 6d 70 28 28 78 29 2b 31 2c 28 79 29 2b 31  ICmp((x)+1,(y)+1
71f0: 29 3d 3d 30 20 29 0a 0a 2f 2a 0a 2a 2a 20 41 64  )==0 )../*.** Ad
7200: 64 20 61 20 6e 65 77 20 63 6f 6c 75 6d 6e 20 74  d a new column t
7210: 6f 20 74 68 65 20 74 61 62 6c 65 20 63 75 72 72  o the table curr
7220: 65 6e 74 6c 79 20 62 65 69 6e 67 20 63 6f 6e 73  ently being cons
7230: 74 72 75 63 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  tructed..**.** T
7240: 68 65 20 70 61 72 73 65 72 20 63 61 6c 6c 73 20  he parser calls 
7250: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6f 6e 63  this routine onc
7260: 65 20 66 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d  e for each colum
7270: 6e 20 64 65 63 6c 61 72 61 74 69 6f 6e 0a 2a 2a  n declaration.**
7280: 20 69 6e 20 61 20 43 52 45 41 54 45 20 54 41 42   in a CREATE TAB
7290: 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 73  LE statement.  s
72a0: 71 6c 69 74 65 33 53 74 61 72 74 54 61 62 6c 65  qlite3StartTable
72b0: 28 29 20 67 65 74 73 20 63 61 6c 6c 65 64 0a 2a  () gets called.*
72c0: 2a 20 66 69 72 73 74 20 74 6f 20 67 65 74 20 74  * first to get t
72d0: 68 69 6e 67 73 20 67 6f 69 6e 67 2e 20 20 54 68  hings going.  Th
72e0: 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
72f0: 69 73 20 63 61 6c 6c 65 64 20 66 6f 72 20 65 61  is called for ea
7300: 63 68 0a 2a 2a 20 63 6f 6c 75 6d 6e 2e 0a 2a 2f  ch.** column..*/
7310: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 41 64 64  .void sqlite3Add
7320: 43 6f 6c 75 6d 6e 28 50 61 72 73 65 20 2a 70 50  Column(Parse *pP
7330: 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61  arse, Token *pNa
7340: 6d 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b  me){.  Table *p;
7350: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 68 61 72  .  int i;.  char
7360: 20 2a 7a 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70   *z;.  Column *p
7370: 43 6f 6c 3b 0a 20 20 69 66 28 20 28 70 20 3d 20  Col;.  if( (p = 
7380: 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
7390: 65 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  e)==0 ) return;.
73a0: 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d    z = sqlite3Nam
73b0: 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 4e 61 6d 65  eFromToken(pName
73c0: 29 3b 0a 20 20 69 66 28 20 7a 3d 3d 30 20 29 20  );.  if( z==0 ) 
73d0: 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d  return;.  for(i=
73e0: 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 3b 20 69 2b  0; i<p->nCol; i+
73f0: 2b 29 7b 0a 20 20 20 20 69 66 28 20 53 54 52 49  +){.    if( STRI
7400: 43 4d 50 28 7a 2c 20 70 2d 3e 61 43 6f 6c 5b 69  CMP(z, p->aCol[i
7410: 5d 2e 7a 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20  ].zName) ){.    
7420: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
7430: 67 28 70 50 61 72 73 65 2c 20 22 64 75 70 6c 69  g(pParse, "dupli
7440: 63 61 74 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  cate column name
7450: 3a 20 25 73 22 2c 20 7a 29 3b 0a 20 20 20 20 20  : %s", z);.     
7460: 20 73 71 6c 69 74 65 46 72 65 65 28 7a 29 3b 0a   sqliteFree(z);.
7470: 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20        return;.  
7480: 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 28 70    }.  }.  if( (p
7490: 2d 3e 6e 43 6f 6c 20 26 20 30 78 37 29 3d 3d 30  ->nCol & 0x7)==0
74a0: 20 29 7b 0a 20 20 20 20 43 6f 6c 75 6d 6e 20 2a   ){.    Column *
74b0: 61 4e 65 77 3b 0a 20 20 20 20 61 4e 65 77 20 3d  aNew;.    aNew =
74c0: 20 73 71 6c 69 74 65 52 65 61 6c 6c 6f 63 28 20   sqliteRealloc( 
74d0: 70 2d 3e 61 43 6f 6c 2c 20 28 70 2d 3e 6e 43 6f  p->aCol, (p->nCo
74e0: 6c 2b 38 29 2a 73 69 7a 65 6f 66 28 70 2d 3e 61  l+8)*sizeof(p->a
74f0: 43 6f 6c 5b 30 5d 29 29 3b 0a 20 20 20 20 69 66  Col[0]));.    if
7500: 28 20 61 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20  ( aNew==0 ){.   
7510: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 29     sqliteFree(z)
7520: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a  ;.      return;.
7530: 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 61 43 6f      }.    p->aCo
7540: 6c 20 3d 20 61 4e 65 77 3b 0a 20 20 7d 0a 20 20  l = aNew;.  }.  
7550: 70 43 6f 6c 20 3d 20 26 70 2d 3e 61 43 6f 6c 5b  pCol = &p->aCol[
7560: 70 2d 3e 6e 43 6f 6c 5d 3b 0a 20 20 6d 65 6d 73  p->nCol];.  mems
7570: 65 74 28 70 43 6f 6c 2c 20 30 2c 20 73 69 7a 65  et(pCol, 0, size
7580: 6f 66 28 70 2d 3e 61 43 6f 6c 5b 30 5d 29 29 3b  of(p->aCol[0]));
7590: 0a 20 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 20 3d  .  pCol->zName =
75a0: 20 7a 3b 0a 20 0a 20 20 2f 2a 20 49 66 20 74 68   z;. .  /* If th
75b0: 65 72 65 20 69 73 20 6e 6f 20 74 79 70 65 20 73  ere is no type s
75c0: 70 65 63 69 66 69 65 64 2c 20 63 6f 6c 75 6d 6e  pecified, column
75d0: 73 20 68 61 76 65 20 74 68 65 20 64 65 66 61 75  s have the defau
75e0: 6c 74 20 61 66 66 69 6e 69 74 79 0a 20 20 2a 2a  lt affinity.  **
75f0: 20 27 4e 4f 4e 45 27 2e 20 49 66 20 74 68 65 72   'NONE'. If ther
7600: 65 20 69 73 20 61 20 74 79 70 65 20 73 70 65 63  e is a type spec
7610: 69 66 69 65 64 2c 20 74 68 65 6e 20 73 71 6c 69  ified, then sqli
7620: 74 65 33 41 64 64 43 6f 6c 75 6d 6e 54 79 70 65  te3AddColumnType
7630: 28 29 20 77 69 6c 6c 0a 20 20 2a 2a 20 62 65 20  () will.  ** be 
7640: 63 61 6c 6c 65 64 20 6e 65 78 74 20 74 6f 20 73  called next to s
7650: 65 74 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74  et pCol->affinit
7660: 79 20 63 6f 72 72 65 63 74 6c 79 2e 0a 20 20 2a  y correctly..  *
7670: 2f 0a 20 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69  /.  pCol->affini
7680: 74 79 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f  ty = SQLITE_AFF_
7690: 4e 4f 4e 45 3b 0a 20 20 70 2d 3e 6e 43 6f 6c 2b  NONE;.  p->nCol+
76a0: 2b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  +;.}../*.** This
76b0: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
76c0: 65 64 20 62 79 20 74 68 65 20 70 61 72 73 65 72  ed by the parser
76d0: 20 77 68 69 6c 65 20 69 6e 20 74 68 65 20 6d 69   while in the mi
76e0: 64 64 6c 65 20 6f 66 0a 2a 2a 20 70 61 72 73 69  ddle of.** parsi
76f0: 6e 67 20 61 20 43 52 45 41 54 45 20 54 41 42 4c  ng a CREATE TABL
7700: 45 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 41 20  E statement.  A 
7710: 22 4e 4f 54 20 4e 55 4c 4c 22 20 63 6f 6e 73 74  "NOT NULL" const
7720: 72 61 69 6e 74 20 68 61 73 0a 2a 2a 20 62 65 65  raint has.** bee
7730: 6e 20 73 65 65 6e 20 6f 6e 20 61 20 63 6f 6c 75  n seen on a colu
7740: 6d 6e 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  mn.  This routin
7750: 65 20 73 65 74 73 20 74 68 65 20 6e 6f 74 4e 75  e sets the notNu
7760: 6c 6c 20 66 6c 61 67 20 6f 6e 0a 2a 2a 20 74 68  ll flag on.** th
7770: 65 20 63 6f 6c 75 6d 6e 20 63 75 72 72 65 6e 74  e column current
7780: 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75  ly under constru
7790: 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ction..*/.void s
77a0: 71 6c 69 74 65 33 41 64 64 4e 6f 74 4e 75 6c 6c  qlite3AddNotNull
77b0: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
77c0: 69 6e 74 20 6f 6e 45 72 72 6f 72 29 7b 0a 20 20  int onError){.  
77d0: 54 61 62 6c 65 20 2a 70 3b 0a 20 20 69 6e 74 20  Table *p;.  int 
77e0: 69 3b 0a 20 20 69 66 28 20 28 70 20 3d 20 70 50  i;.  if( (p = pP
77f0: 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29  arse->pNewTable)
7800: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
7810: 69 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20  i = p->nCol-1;. 
7820: 20 69 66 28 20 69 3e 3d 30 20 29 20 70 2d 3e 61   if( i>=0 ) p->a
7830: 43 6f 6c 5b 69 5d 2e 6e 6f 74 4e 75 6c 6c 20 3d  Col[i].notNull =
7840: 20 6f 6e 45 72 72 6f 72 3b 0a 7d 0a 0a 2f 2a 0a   onError;.}../*.
7850: 2a 2a 20 53 63 61 6e 20 74 68 65 20 63 6f 6c 75  ** Scan the colu
7860: 6d 6e 20 74 79 70 65 20 6e 61 6d 65 20 7a 54 79  mn type name zTy
7870: 70 65 20 28 6c 65 6e 67 74 68 20 6e 54 79 70 65  pe (length nType
7880: 29 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65  ) and return the
7890: 0a 2a 2a 20 61 73 73 6f 63 69 61 74 65 64 20 61  .** associated a
78a0: 66 66 69 6e 69 74 79 20 74 79 70 65 2e 0a 2a 2a  ffinity type..**
78b0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
78c0: 20 64 6f 65 73 20 61 20 63 61 73 65 2d 69 6e 64   does a case-ind
78d0: 65 70 65 6e 64 65 6e 74 20 73 65 61 72 63 68 20  ependent search 
78e0: 6f 66 20 7a 54 79 70 65 20 66 6f 72 20 74 68 65  of zType for the
78f0: 20 0a 2a 2a 20 73 75 62 73 74 72 69 6e 67 73 20   .** substrings 
7900: 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  in the following
7910: 20 74 61 62 6c 65 2e 20 49 66 20 6f 6e 65 20 6f   table. If one o
7920: 66 20 74 68 65 20 73 75 62 73 74 72 69 6e 67 73  f the substrings
7930: 20 69 73 0a 2a 2a 20 66 6f 75 6e 64 2c 20 74 68   is.** found, th
7940: 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  e corresponding 
7950: 61 66 66 69 6e 69 74 79 20 69 73 20 72 65 74 75  affinity is retu
7960: 72 6e 65 64 2e 20 49 66 20 7a 54 79 70 65 20 63  rned. If zType c
7970: 6f 6e 74 61 69 6e 73 0a 2a 2a 20 6d 6f 72 65 20  ontains.** more 
7980: 74 68 61 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20  than one of the 
7990: 73 75 62 73 74 72 69 6e 67 73 2c 20 65 6e 74 72  substrings, entr
79a0: 69 65 73 20 74 6f 77 61 72 64 20 74 68 65 20 74  ies toward the t
79b0: 6f 70 20 6f 66 20 0a 2a 2a 20 74 68 65 20 74 61  op of .** the ta
79c0: 62 6c 65 20 74 61 6b 65 20 70 72 69 6f 72 69 74  ble take priorit
79d0: 79 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20  y. For example, 
79e0: 69 66 20 7a 54 79 70 65 20 69 73 20 27 42 4c 4f  if zType is 'BLO
79f0: 42 49 4e 54 27 2c 20 0a 2a 2a 20 53 51 4c 49 54  BINT', .** SQLIT
7a00: 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 20 69 73  E_AFF_INTEGER is
7a10: 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a   returned..**.**
7a20: 20 53 75 62 73 74 72 69 6e 67 20 20 20 20 20 7c   Substring     |
7a30: 20 41 66 66 69 6e 69 74 79 0a 2a 2a 20 2d 2d 2d   Affinity.** ---
7a40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7a50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a  -------------.**
7a60: 20 27 49 4e 54 27 20 20 20 20 20 20 20 20 20 7c   'INT'         |
7a70: 20 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45   SQLITE_AFF_INTE
7a80: 47 45 52 0a 2a 2a 20 27 43 48 41 52 27 20 20 20  GER.** 'CHAR'   
7a90: 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 41 46       | SQLITE_AF
7aa0: 46 5f 54 45 58 54 0a 2a 2a 20 27 43 4c 4f 42 27  F_TEXT.** 'CLOB'
7ab0: 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45          | SQLITE
7ac0: 5f 41 46 46 5f 54 45 58 54 0a 2a 2a 20 27 54 45  _AFF_TEXT.** 'TE
7ad0: 58 54 27 20 20 20 20 20 20 20 20 7c 20 53 51 4c  XT'        | SQL
7ae0: 49 54 45 5f 41 46 46 5f 54 45 58 54 0a 2a 2a 20  ITE_AFF_TEXT.** 
7af0: 27 42 4c 4f 42 27 20 20 20 20 20 20 20 20 7c 20  'BLOB'        | 
7b00: 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 0a  SQLITE_AFF_NONE.
7b10: 2a 2a 20 27 52 45 41 4c 27 20 20 20 20 20 20 20  ** 'REAL'       
7b20: 20 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f 52 45   | SQLITE_AFF_RE
7b30: 41 4c 0a 2a 2a 20 27 46 4c 4f 41 27 20 20 20 20  AL.** 'FLOA'    
7b40: 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 41 46 46      | SQLITE_AFF
7b50: 5f 52 45 41 4c 0a 2a 2a 20 27 44 4f 55 42 27 20  _REAL.** 'DOUB' 
7b60: 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f         | SQLITE_
7b70: 41 46 46 5f 52 45 41 4c 0a 2a 2a 0a 2a 2a 20 49  AFF_REAL.**.** I
7b80: 66 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20 73 75  f none of the su
7b90: 62 73 74 72 69 6e 67 73 20 69 6e 20 74 68 65 20  bstrings in the 
7ba0: 61 62 6f 76 65 20 74 61 62 6c 65 20 61 72 65 20  above table are 
7bb0: 66 6f 75 6e 64 2c 0a 2a 2a 20 53 51 4c 49 54 45  found,.** SQLITE
7bc0: 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20 69 73 20  _AFF_NUMERIC is 
7bd0: 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 63 68 61  returned..*/.cha
7be0: 72 20 73 71 6c 69 74 65 33 41 66 66 69 6e 69 74  r sqlite3Affinit
7bf0: 79 54 79 70 65 28 63 6f 6e 73 74 20 54 6f 6b 65  yType(const Toke
7c00: 6e 20 2a 70 54 79 70 65 29 7b 0a 20 20 75 33 32  n *pType){.  u32
7c10: 20 68 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 61   h = 0;.  char a
7c20: 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f  ff = SQLITE_AFF_
7c30: 4e 55 4d 45 52 49 43 3b 0a 20 20 63 6f 6e 73 74  NUMERIC;.  const
7c40: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
7c50: 7a 49 6e 20 3d 20 70 54 79 70 65 2d 3e 7a 3b 0a  zIn = pType->z;.
7c60: 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64    const unsigned
7c70: 20 63 68 61 72 20 2a 7a 45 6e 64 20 3d 20 26 70   char *zEnd = &p
7c80: 54 79 70 65 2d 3e 7a 5b 70 54 79 70 65 2d 3e 6e  Type->z[pType->n
7c90: 5d 3b 0a 0a 20 20 77 68 69 6c 65 28 20 7a 49 6e  ];..  while( zIn
7ca0: 21 3d 7a 45 6e 64 20 29 7b 0a 20 20 20 20 68 20  !=zEnd ){.    h 
7cb0: 3d 20 28 68 3c 3c 38 29 20 2b 20 73 71 6c 69 74  = (h<<8) + sqlit
7cc0: 65 33 55 70 70 65 72 54 6f 4c 6f 77 65 72 5b 2a  e3UpperToLower[*
7cd0: 7a 49 6e 5d 3b 0a 20 20 20 20 7a 49 6e 2b 2b 3b  zIn];.    zIn++;
7ce0: 0a 20 20 20 20 69 66 28 20 68 3d 3d 28 28 27 63  .    if( h==(('c
7cf0: 27 3c 3c 32 34 29 2b 28 27 68 27 3c 3c 31 36 29  '<<24)+('h'<<16)
7d00: 2b 28 27 61 27 3c 3c 38 29 2b 27 72 27 29 20 29  +('a'<<8)+'r') )
7d10: 7b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  {             /*
7d20: 20 43 48 41 52 20 2a 2f 0a 20 20 20 20 20 20 61   CHAR */.      a
7d30: 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f  ff = SQLITE_AFF_
7d40: 54 45 58 54 3b 20 0a 20 20 20 20 7d 65 6c 73 65  TEXT; .    }else
7d50: 20 69 66 28 20 68 3d 3d 28 28 27 63 27 3c 3c 32   if( h==(('c'<<2
7d60: 34 29 2b 28 27 6c 27 3c 3c 31 36 29 2b 28 27 6f  4)+('l'<<16)+('o
7d70: 27 3c 3c 38 29 2b 27 62 27 29 20 29 7b 20 20 20  '<<8)+'b') ){   
7d80: 20 20 20 20 2f 2a 20 43 4c 4f 42 20 2a 2f 0a 20      /* CLOB */. 
7d90: 20 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49 54       aff = SQLIT
7da0: 45 5f 41 46 46 5f 54 45 58 54 3b 0a 20 20 20 20  E_AFF_TEXT;.    
7db0: 7d 65 6c 73 65 20 69 66 28 20 68 3d 3d 28 28 27  }else if( h==(('
7dc0: 74 27 3c 3c 32 34 29 2b 28 27 65 27 3c 3c 31 36  t'<<24)+('e'<<16
7dd0: 29 2b 28 27 78 27 3c 3c 38 29 2b 27 74 27 29 20  )+('x'<<8)+'t') 
7de0: 29 7b 20 20 20 20 20 20 20 2f 2a 20 54 45 58 54  ){       /* TEXT
7df0: 20 2a 2f 0a 20 20 20 20 20 20 61 66 66 20 3d 20   */.      aff = 
7e00: 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 3b  SQLITE_AFF_TEXT;
7e10: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 68  .    }else if( h
7e20: 3d 3d 28 28 27 62 27 3c 3c 32 34 29 2b 28 27 6c  ==(('b'<<24)+('l
7e30: 27 3c 3c 31 36 29 2b 28 27 6f 27 3c 3c 38 29 2b  '<<16)+('o'<<8)+
7e40: 27 62 27 29 20 20 20 20 20 20 20 20 20 20 2f 2a  'b')          /*
7e50: 20 42 4c 4f 42 20 2a 2f 0a 20 20 20 20 20 20 20   BLOB */.       
7e60: 20 26 26 20 28 61 66 66 3d 3d 53 51 4c 49 54 45   && (aff==SQLITE
7e70: 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20 7c 7c 20  _AFF_NUMERIC || 
7e80: 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f  aff==SQLITE_AFF_
7e90: 52 45 41 4c 29 20 29 7b 0a 20 20 20 20 20 20 61  REAL) ){.      a
7ea0: 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f  ff = SQLITE_AFF_
7eb0: 4e 4f 4e 45 3b 0a 23 69 66 6e 64 65 66 20 53 51  NONE;.#ifndef SQ
7ec0: 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49  LITE_OMIT_FLOATI
7ed0: 4e 47 5f 50 4f 49 4e 54 0a 20 20 20 20 7d 65 6c  NG_POINT.    }el
7ee0: 73 65 20 69 66 28 20 68 3d 3d 28 28 27 72 27 3c  se if( h==(('r'<
7ef0: 3c 32 34 29 2b 28 27 65 27 3c 3c 31 36 29 2b 28  <24)+('e'<<16)+(
7f00: 27 61 27 3c 3c 38 29 2b 27 6c 27 29 20 20 20 20  'a'<<8)+'l')    
7f10: 20 20 20 20 20 20 2f 2a 20 52 45 41 4c 20 2a 2f        /* REAL */
7f20: 0a 20 20 20 20 20 20 20 20 26 26 20 61 66 66 3d  .        && aff=
7f30: 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45  =SQLITE_AFF_NUME
7f40: 52 49 43 20 29 7b 0a 20 20 20 20 20 20 61 66 66  RIC ){.      aff
7f50: 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 52 45   = SQLITE_AFF_RE
7f60: 41 4c 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  AL;.    }else if
7f70: 28 20 68 3d 3d 28 28 27 66 27 3c 3c 32 34 29 2b  ( h==(('f'<<24)+
7f80: 28 27 6c 27 3c 3c 31 36 29 2b 28 27 6f 27 3c 3c  ('l'<<16)+('o'<<
7f90: 38 29 2b 27 61 27 29 20 20 20 20 20 20 20 20 20  8)+'a')         
7fa0: 20 2f 2a 20 46 4c 4f 41 20 2a 2f 0a 20 20 20 20   /* FLOA */.    
7fb0: 20 20 20 20 26 26 20 61 66 66 3d 3d 53 51 4c 49      && aff==SQLI
7fc0: 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20 29  TE_AFF_NUMERIC )
7fd0: 7b 0a 20 20 20 20 20 20 61 66 66 20 3d 20 53 51  {.      aff = SQ
7fe0: 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 3b 0a 20  LITE_AFF_REAL;. 
7ff0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 68 3d 3d     }else if( h==
8000: 28 28 27 64 27 3c 3c 32 34 29 2b 28 27 6f 27 3c  (('d'<<24)+('o'<
8010: 3c 31 36 29 2b 28 27 75 27 3c 3c 38 29 2b 27 62  <16)+('u'<<8)+'b
8020: 27 29 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44  ')          /* D
8030: 4f 55 42 20 2a 2f 0a 20 20 20 20 20 20 20 20 26  OUB */.        &
8040: 26 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46  & aff==SQLITE_AF
8050: 46 5f 4e 55 4d 45 52 49 43 20 29 7b 0a 20 20 20  F_NUMERIC ){.   
8060: 20 20 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f     aff = SQLITE_
8070: 41 46 46 5f 52 45 41 4c 3b 0a 23 65 6e 64 69 66  AFF_REAL;.#endif
8080: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28  .    }else if( (
8090: 68 26 30 78 30 30 46 46 46 46 46 46 29 3d 3d 28  h&0x00FFFFFF)==(
80a0: 28 27 69 27 3c 3c 31 36 29 2b 28 27 6e 27 3c 3c  ('i'<<16)+('n'<<
80b0: 38 29 2b 27 74 27 29 20 29 7b 20 20 20 20 2f 2a  8)+'t') ){    /*
80c0: 20 49 4e 54 20 2a 2f 0a 20 20 20 20 20 20 61 66   INT */.      af
80d0: 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 49  f = SQLITE_AFF_I
80e0: 4e 54 45 47 45 52 3b 0a 20 20 20 20 20 20 62 72  NTEGER;.      br
80f0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  eak;.    }.  }..
8100: 20 20 72 65 74 75 72 6e 20 61 66 66 3b 0a 7d 0a    return aff;.}.
8110: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
8120: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 62 79  ine is called by
8130: 20 74 68 65 20 70 61 72 73 65 72 20 77 68 69 6c   the parser whil
8140: 65 20 69 6e 20 74 68 65 20 6d 69 64 64 6c 65 20  e in the middle 
8150: 6f 66 0a 2a 2a 20 70 61 72 73 69 6e 67 20 61 20  of.** parsing a 
8160: 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61  CREATE TABLE sta
8170: 74 65 6d 65 6e 74 2e 20 20 54 68 65 20 70 46 69  tement.  The pFi
8180: 72 73 74 20 74 6f 6b 65 6e 20 69 73 20 74 68 65  rst token is the
8190: 20 66 69 72 73 74 0a 2a 2a 20 74 6f 6b 65 6e 20   first.** token 
81a0: 69 6e 20 74 68 65 20 73 65 71 75 65 6e 63 65 20  in the sequence 
81b0: 6f 66 20 74 6f 6b 65 6e 73 20 74 68 61 74 20 64  of tokens that d
81c0: 65 73 63 72 69 62 65 20 74 68 65 20 74 79 70 65  escribe the type
81d0: 20 6f 66 20 74 68 65 0a 2a 2a 20 63 6f 6c 75 6d   of the.** colum
81e0: 6e 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65  n currently unde
81f0: 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 20  r construction. 
8200: 20 20 70 4c 61 73 74 20 69 73 20 74 68 65 20 6c    pLast is the l
8210: 61 73 74 20 74 6f 6b 65 6e 0a 2a 2a 20 69 6e 20  ast token.** in 
8220: 74 68 65 20 73 65 71 75 65 6e 63 65 2e 20 20 55  the sequence.  U
8230: 73 65 20 74 68 69 73 20 69 6e 66 6f 72 6d 61 74  se this informat
8240: 69 6f 6e 20 74 6f 20 63 6f 6e 73 74 72 75 63 74  ion to construct
8250: 20 61 20 73 74 72 69 6e 67 0a 2a 2a 20 74 68 61   a string.** tha
8260: 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 74  t contains the t
8270: 79 70 65 6e 61 6d 65 20 6f 66 20 74 68 65 20 63  ypename of the c
8280: 6f 6c 75 6d 6e 20 61 6e 64 20 73 74 6f 72 65 20  olumn and store 
8290: 74 68 61 74 20 73 74 72 69 6e 67 0a 2a 2a 20 69  that string.** i
82a0: 6e 20 7a 54 79 70 65 2e 0a 2a 2f 20 0a 76 6f 69  n zType..*/ .voi
82b0: 64 20 73 71 6c 69 74 65 33 41 64 64 43 6f 6c 75  d sqlite3AddColu
82c0: 6d 6e 54 79 70 65 28 50 61 72 73 65 20 2a 70 50  mnType(Parse *pP
82d0: 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 54 79  arse, Token *pTy
82e0: 70 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b  pe){.  Table *p;
82f0: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 43 6f 6c 75  .  int i;.  Colu
8300: 6d 6e 20 2a 70 43 6f 6c 3b 0a 0a 20 20 69 66 28  mn *pCol;..  if(
8310: 20 28 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e   (p = pParse->pN
8320: 65 77 54 61 62 6c 65 29 3d 3d 30 20 29 20 72 65  ewTable)==0 ) re
8330: 74 75 72 6e 3b 0a 20 20 69 20 3d 20 70 2d 3e 6e  turn;.  i = p->n
8340: 43 6f 6c 2d 31 3b 0a 20 20 69 66 28 20 69 3c 30  Col-1;.  if( i<0
8350: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 43 6f   ) return;.  pCo
8360: 6c 20 3d 20 26 70 2d 3e 61 43 6f 6c 5b 69 5d 3b  l = &p->aCol[i];
8370: 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 43  .  sqliteFree(pC
8380: 6f 6c 2d 3e 7a 54 79 70 65 29 3b 0a 20 20 70 43  ol->zType);.  pC
8390: 6f 6c 2d 3e 7a 54 79 70 65 20 3d 20 73 71 6c 69  ol->zType = sqli
83a0: 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e  te3NameFromToken
83b0: 28 70 54 79 70 65 29 3b 0a 20 20 70 43 6f 6c 2d  (pType);.  pCol-
83c0: 3e 61 66 66 69 6e 69 74 79 20 3d 20 73 71 6c 69  >affinity = sqli
83d0: 74 65 33 41 66 66 69 6e 69 74 79 54 79 70 65 28  te3AffinityType(
83e0: 70 54 79 70 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pType);.}../*.**
83f0: 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   The expression 
8400: 69 73 20 74 68 65 20 64 65 66 61 75 6c 74 20 76  is the default v
8410: 61 6c 75 65 20 66 6f 72 20 74 68 65 20 6d 6f 73  alue for the mos
8420: 74 20 72 65 63 65 6e 74 6c 79 20 61 64 64 65 64  t recently added
8430: 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 6f 66 20 74 68   column.** of th
8440: 65 20 74 61 62 6c 65 20 63 75 72 72 65 6e 74 6c  e table currentl
8450: 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63  y under construc
8460: 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 44 65 66 61  tion..**.** Defa
8470: 75 6c 74 20 76 61 6c 75 65 20 65 78 70 72 65 73  ult value expres
8480: 73 69 6f 6e 73 20 6d 75 73 74 20 62 65 20 63 6f  sions must be co
8490: 6e 73 74 61 6e 74 2e 20 20 52 61 69 73 65 20 61  nstant.  Raise a
84a0: 6e 20 65 78 63 65 70 74 69 6f 6e 20 69 66 20 74  n exception if t
84b0: 68 69 73 0a 2a 2a 20 69 73 20 6e 6f 74 20 74 68  his.** is not th
84c0: 65 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  e case..**.** Th
84d0: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
84e0: 6c 6c 65 64 20 62 79 20 74 68 65 20 70 61 72 73  lled by the pars
84f0: 65 72 20 77 68 69 6c 65 20 69 6e 20 74 68 65 20  er while in the 
8500: 6d 69 64 64 6c 65 20 6f 66 0a 2a 2a 20 70 61 72  middle of.** par
8510: 73 69 6e 67 20 61 20 43 52 45 41 54 45 20 54 41  sing a CREATE TA
8520: 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a  BLE statement..*
8530: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 41 64  /.void sqlite3Ad
8540: 64 44 65 66 61 75 6c 74 56 61 6c 75 65 28 50 61  dDefaultValue(Pa
8550: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70  rse *pParse, Exp
8560: 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 54 61 62  r *pExpr){.  Tab
8570: 6c 65 20 2a 70 3b 0a 20 20 43 6f 6c 75 6d 6e 20  le *p;.  Column 
8580: 2a 70 43 6f 6c 3b 0a 20 20 69 66 28 20 28 70 20  *pCol;.  if( (p 
8590: 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  = pParse->pNewTa
85a0: 62 6c 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 70  ble)!=0 ){.    p
85b0: 43 6f 6c 20 3d 20 26 28 70 2d 3e 61 43 6f 6c 5b  Col = &(p->aCol[
85c0: 70 2d 3e 6e 43 6f 6c 2d 31 5d 29 3b 0a 20 20 20  p->nCol-1]);.   
85d0: 20 69 66 28 20 21 73 71 6c 69 74 65 33 45 78 70   if( !sqlite3Exp
85e0: 72 49 73 43 6f 6e 73 74 61 6e 74 4f 72 46 75 6e  rIsConstantOrFun
85f0: 63 74 69 6f 6e 28 70 45 78 70 72 29 20 29 7b 0a  ction(pExpr) ){.
8600: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
8610: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 64  orMsg(pParse, "d
8620: 65 66 61 75 6c 74 20 76 61 6c 75 65 20 6f 66 20  efault value of 
8630: 63 6f 6c 75 6d 6e 20 5b 25 73 5d 20 69 73 20 6e  column [%s] is n
8640: 6f 74 20 63 6f 6e 73 74 61 6e 74 22 2c 0a 20 20  ot constant",.  
8650: 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 7a 4e          pCol->zN
8660: 61 6d 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ame);.    }else{
8670: 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 43 6f  .      Expr *pCo
8680: 70 79 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  py;.      sqlite
8690: 33 45 78 70 72 44 65 6c 65 74 65 28 70 43 6f 6c  3ExprDelete(pCol
86a0: 2d 3e 70 44 66 6c 74 29 3b 0a 20 20 20 20 20 20  ->pDflt);.      
86b0: 70 43 6f 6c 2d 3e 70 44 66 6c 74 20 3d 20 70 43  pCol->pDflt = pC
86c0: 6f 70 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70  opy = sqlite3Exp
86d0: 72 44 75 70 28 70 45 78 70 72 29 3b 0a 20 20 20  rDup(pExpr);.   
86e0: 20 20 20 69 66 28 20 70 43 6f 70 79 20 29 7b 0a     if( pCopy ){.
86f0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 54          sqlite3T
8700: 6f 6b 65 6e 43 6f 70 79 28 26 70 43 6f 70 79 2d  okenCopy(&pCopy-
8710: 3e 73 70 61 6e 2c 20 26 70 45 78 70 72 2d 3e 73  >span, &pExpr->s
8720: 70 61 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  pan);.      }.  
8730: 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65    }.  }.  sqlite
8740: 33 45 78 70 72 44 65 6c 65 74 65 28 70 45 78 70  3ExprDelete(pExp
8750: 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 73  r);.}../*.** Des
8760: 69 67 6e 61 74 65 20 74 68 65 20 50 52 49 4d 41  ignate the PRIMA
8770: 52 59 20 4b 45 59 20 66 6f 72 20 74 68 65 20 74  RY KEY for the t
8780: 61 62 6c 65 2e 20 20 70 4c 69 73 74 20 69 73 20  able.  pList is 
8790: 61 20 6c 69 73 74 20 6f 66 20 6e 61 6d 65 73 20  a list of names 
87a0: 0a 2a 2a 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74  .** of columns t
87b0: 68 61 74 20 66 6f 72 6d 20 74 68 65 20 70 72 69  hat form the pri
87c0: 6d 61 72 79 20 6b 65 79 2e 20 20 49 66 20 70 4c  mary key.  If pL
87d0: 69 73 74 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65  ist is NULL, the
87e0: 6e 20 74 68 65 0a 2a 2a 20 6d 6f 73 74 20 72 65  n the.** most re
87f0: 63 65 6e 74 6c 79 20 61 64 64 65 64 20 63 6f 6c  cently added col
8800: 75 6d 6e 20 6f 66 20 74 68 65 20 74 61 62 6c 65  umn of the table
8810: 20 69 73 20 74 68 65 20 70 72 69 6d 61 72 79 20   is the primary 
8820: 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20 41 20 74 61 62  key..**.** A tab
8830: 6c 65 20 63 61 6e 20 68 61 76 65 20 61 74 20 6d  le can have at m
8840: 6f 73 74 20 6f 6e 65 20 70 72 69 6d 61 72 79 20  ost one primary 
8850: 6b 65 79 2e 20 20 49 66 20 74 68 65 20 74 61 62  key.  If the tab
8860: 6c 65 20 61 6c 72 65 61 64 79 20 68 61 73 0a 2a  le already has.*
8870: 2a 20 61 20 70 72 69 6d 61 72 79 20 6b 65 79 20  * a primary key 
8880: 28 61 6e 64 20 74 68 69 73 20 69 73 20 74 68 65  (and this is the
8890: 20 73 65 63 6f 6e 64 20 70 72 69 6d 61 72 79 20   second primary 
88a0: 6b 65 79 29 20 74 68 65 6e 20 63 72 65 61 74 65  key) then create
88b0: 20 61 6e 0a 2a 2a 20 65 72 72 6f 72 2e 0a 2a 2a   an.** error..**
88c0: 0a 2a 2a 20 49 66 20 74 68 65 20 50 52 49 4d 41  .** If the PRIMA
88d0: 52 59 20 4b 45 59 20 69 73 20 6f 6e 20 61 20 73  RY KEY is on a s
88e0: 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20 77 68 6f  ingle column who
88f0: 73 65 20 64 61 74 61 74 79 70 65 20 69 73 20 49  se datatype is I
8900: 4e 54 45 47 45 52 2c 0a 2a 2a 20 74 68 65 6e 20  NTEGER,.** then 
8910: 77 65 20 77 69 6c 6c 20 74 72 79 20 74 6f 20 75  we will try to u
8920: 73 65 20 74 68 61 74 20 63 6f 6c 75 6d 6e 20 61  se that column a
8930: 73 20 74 68 65 20 72 6f 77 69 64 2e 20 20 53 65  s the rowid.  Se
8940: 74 20 74 68 65 20 54 61 62 6c 65 2e 69 50 4b 65  t the Table.iPKe
8950: 79 0a 2a 2a 20 66 69 65 6c 64 20 6f 66 20 74 68  y.** field of th
8960: 65 20 74 61 62 6c 65 20 75 6e 64 65 72 20 63 6f  e table under co
8970: 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f 20 62 65  nstruction to be
8980: 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68   the index of th
8990: 65 0a 2a 2a 20 49 4e 54 45 47 45 52 20 50 52 49  e.** INTEGER PRI
89a0: 4d 41 52 59 20 4b 45 59 20 63 6f 6c 75 6d 6e 2e  MARY KEY column.
89b0: 20 20 54 61 62 6c 65 2e 69 50 4b 65 79 20 69 73    Table.iPKey is
89c0: 20 73 65 74 20 74 6f 20 2d 31 20 69 66 20 74 68   set to -1 if th
89d0: 65 72 65 20 69 73 0a 2a 2a 20 6e 6f 20 49 4e 54  ere is.** no INT
89e0: 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59  EGER PRIMARY KEY
89f0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6b  ..**.** If the k
8a00: 65 79 20 69 73 20 6e 6f 74 20 61 6e 20 49 4e 54  ey is not an INT
8a10: 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59  EGER PRIMARY KEY
8a20: 2c 20 74 68 65 6e 20 63 72 65 61 74 65 20 61 20  , then create a 
8a30: 75 6e 69 71 75 65 0a 2a 2a 20 69 6e 64 65 78 20  unique.** index 
8a40: 66 6f 72 20 74 68 65 20 6b 65 79 2e 20 20 4e 6f  for the key.  No
8a50: 20 69 6e 64 65 78 20 69 73 20 63 72 65 61 74 65   index is create
8a60: 64 20 66 6f 72 20 49 4e 54 45 47 45 52 20 50 52  d for INTEGER PR
8a70: 49 4d 41 52 59 20 4b 45 59 73 2e 0a 2a 2f 0a 76  IMARY KEYs..*/.v
8a80: 6f 69 64 20 73 71 6c 69 74 65 33 41 64 64 50 72  oid sqlite3AddPr
8a90: 69 6d 61 72 79 4b 65 79 28 0a 20 20 50 61 72 73  imaryKey(.  Pars
8aa0: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a  e *pParse,    /*
8ab0: 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
8ac0: 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
8ad0: 70 4c 69 73 74 2c 20 20 2f 2a 20 4c 69 73 74 20  pList,  /* List 
8ae0: 6f 66 20 66 69 65 6c 64 20 6e 61 6d 65 73 20 74  of field names t
8af0: 6f 20 62 65 20 69 6e 64 65 78 65 64 20 2a 2f 0a  o be indexed */.
8b00: 20 20 69 6e 74 20 6f 6e 45 72 72 6f 72 2c 20 20    int onError,  
8b10: 20 20 20 20 2f 2a 20 57 68 61 74 20 74 6f 20 64      /* What to d
8b20: 6f 20 77 69 74 68 20 61 20 75 6e 69 71 75 65 6e  o with a uniquen
8b30: 65 73 73 20 63 6f 6e 66 6c 69 63 74 20 2a 2f 0a  ess conflict */.
8b40: 20 20 69 6e 74 20 61 75 74 6f 49 6e 63 2c 20 20    int autoInc,  
8b50: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74      /* True if t
8b60: 68 65 20 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54  he AUTOINCREMENT
8b70: 20 6b 65 79 77 6f 72 64 20 69 73 20 70 72 65 73   keyword is pres
8b80: 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 73 6f 72  ent */.  int sor
8b90: 74 4f 72 64 65 72 20 20 20 20 20 2f 2a 20 53 51  tOrder     /* SQ
8ba0: 4c 49 54 45 5f 53 4f 5f 41 53 43 20 6f 72 20 53  LITE_SO_ASC or S
8bb0: 51 4c 49 54 45 5f 53 4f 5f 44 45 53 43 20 2a 2f  QLITE_SO_DESC */
8bc0: 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61  .){.  Table *pTa
8bd0: 62 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  b = pParse->pNew
8be0: 54 61 62 6c 65 3b 0a 20 20 63 68 61 72 20 2a 7a  Table;.  char *z
8bf0: 54 79 70 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20  Type = 0;.  int 
8c00: 69 43 6f 6c 20 3d 20 2d 31 2c 20 69 3b 0a 20 20  iCol = -1, i;.  
8c10: 69 66 28 20 70 54 61 62 3d 3d 30 20 7c 7c 20 49  if( pTab==0 || I
8c20: 4e 5f 44 45 43 4c 41 52 45 5f 56 54 41 42 20 29  N_DECLARE_VTAB )
8c30: 20 67 6f 74 6f 20 70 72 69 6d 61 72 79 5f 6b 65   goto primary_ke
8c40: 79 5f 65 78 69 74 3b 0a 20 20 69 66 28 20 70 54  y_exit;.  if( pT
8c50: 61 62 2d 3e 68 61 73 50 72 69 6d 4b 65 79 20 29  ab->hasPrimKey )
8c60: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
8c70: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 0a 20  orMsg(pParse, . 
8c80: 20 20 20 20 20 22 74 61 62 6c 65 20 5c 22 25 73       "table \"%s
8c90: 5c 22 20 68 61 73 20 6d 6f 72 65 20 74 68 61 6e  \" has more than
8ca0: 20 6f 6e 65 20 70 72 69 6d 61 72 79 20 6b 65 79   one primary key
8cb0: 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b  ", pTab->zName);
8cc0: 0a 20 20 20 20 67 6f 74 6f 20 70 72 69 6d 61 72  .    goto primar
8cd0: 79 5f 6b 65 79 5f 65 78 69 74 3b 0a 20 20 7d 0a  y_key_exit;.  }.
8ce0: 20 20 70 54 61 62 2d 3e 68 61 73 50 72 69 6d 4b    pTab->hasPrimK
8cf0: 65 79 20 3d 20 31 3b 0a 20 20 69 66 28 20 70 4c  ey = 1;.  if( pL
8d00: 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 69 43  ist==0 ){.    iC
8d10: 6f 6c 20 3d 20 70 54 61 62 2d 3e 6e 43 6f 6c 20  ol = pTab->nCol 
8d20: 2d 20 31 3b 0a 20 20 20 20 70 54 61 62 2d 3e 61  - 1;.    pTab->a
8d30: 43 6f 6c 5b 69 43 6f 6c 5d 2e 69 73 50 72 69 6d  Col[iCol].isPrim
8d40: 4b 65 79 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65  Key = 1;.  }else
8d50: 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  {.    for(i=0; i
8d60: 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69  <pList->nExpr; i
8d70: 2b 2b 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 69  ++){.      for(i
8d80: 43 6f 6c 3d 30 3b 20 69 43 6f 6c 3c 70 54 61 62  Col=0; iCol<pTab
8d90: 2d 3e 6e 43 6f 6c 3b 20 69 43 6f 6c 2b 2b 29 7b  ->nCol; iCol++){
8da0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c  .        if( sql
8db0: 69 74 65 33 53 74 72 49 43 6d 70 28 70 4c 69 73  ite3StrICmp(pLis
8dc0: 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 70  t->a[i].zName, p
8dd0: 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e  Tab->aCol[iCol].
8de0: 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20  zName)==0 ){.   
8df0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
8e00: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
8e10: 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 70        if( iCol<p
8e20: 54 61 62 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20  Tab->nCol ){.   
8e30: 20 20 20 20 20 70 54 61 62 2d 3e 61 43 6f 6c 5b       pTab->aCol[
8e40: 69 43 6f 6c 5d 2e 69 73 50 72 69 6d 4b 65 79 20  iCol].isPrimKey 
8e50: 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 1;.      }.   
8e60: 20 7d 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74   }.    if( pList
8e70: 2d 3e 6e 45 78 70 72 3e 31 20 29 20 69 43 6f 6c  ->nExpr>1 ) iCol
8e80: 20 3d 20 2d 31 3b 0a 20 20 7d 0a 20 20 69 66 28   = -1;.  }.  if(
8e90: 20 69 43 6f 6c 3e 3d 30 20 26 26 20 69 43 6f 6c   iCol>=0 && iCol
8ea0: 3c 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 7b 0a 20  <pTab->nCol ){. 
8eb0: 20 20 20 7a 54 79 70 65 20 3d 20 70 54 61 62 2d     zType = pTab-
8ec0: 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 54 79 70  >aCol[iCol].zTyp
8ed0: 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a 54 79  e;.  }.  if( zTy
8ee0: 70 65 20 26 26 20 73 71 6c 69 74 65 33 53 74 72  pe && sqlite3Str
8ef0: 49 43 6d 70 28 7a 54 79 70 65 2c 20 22 49 4e 54  ICmp(zType, "INT
8f00: 45 47 45 52 22 29 3d 3d 30 0a 20 20 20 20 20 20  EGER")==0.      
8f10: 20 20 26 26 20 73 6f 72 74 4f 72 64 65 72 3d 3d    && sortOrder==
8f20: 53 51 4c 49 54 45 5f 53 4f 5f 41 53 43 20 29 7b  SQLITE_SO_ASC ){
8f30: 0a 20 20 20 20 70 54 61 62 2d 3e 69 50 4b 65 79  .    pTab->iPKey
8f40: 20 3d 20 69 43 6f 6c 3b 0a 20 20 20 20 70 54 61   = iCol;.    pTa
8f50: 62 2d 3e 6b 65 79 43 6f 6e 66 20 3d 20 6f 6e 45  b->keyConf = onE
8f60: 72 72 6f 72 3b 0a 20 20 20 20 70 54 61 62 2d 3e  rror;.    pTab->
8f70: 61 75 74 6f 49 6e 63 20 3d 20 61 75 74 6f 49 6e  autoInc = autoIn
8f80: 63 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 61  c;.  }else if( a
8f90: 75 74 6f 49 6e 63 20 29 7b 0a 23 69 66 6e 64 65  utoInc ){.#ifnde
8fa0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
8fb0: 54 4f 49 4e 43 52 45 4d 45 4e 54 0a 20 20 20 20  TOINCREMENT.    
8fc0: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
8fd0: 70 50 61 72 73 65 2c 20 22 41 55 54 4f 49 4e 43  pParse, "AUTOINC
8fe0: 52 45 4d 45 4e 54 20 69 73 20 6f 6e 6c 79 20 61  REMENT is only a
8ff0: 6c 6c 6f 77 65 64 20 6f 6e 20 61 6e 20 22 0a 20  llowed on an ". 
9000: 20 20 20 20 20 20 22 49 4e 54 45 47 45 52 20 50        "INTEGER P
9010: 52 49 4d 41 52 59 20 4b 45 59 22 29 3b 0a 23 65  RIMARY KEY");.#e
9020: 6e 64 69 66 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ndif.  }else{.  
9030: 20 20 73 71 6c 69 74 65 33 43 72 65 61 74 65 49    sqlite3CreateI
9040: 6e 64 65 78 28 70 50 61 72 73 65 2c 20 30 2c 20  ndex(pParse, 0, 
9050: 30 2c 20 30 2c 20 70 4c 69 73 74 2c 20 6f 6e 45  0, 0, pList, onE
9060: 72 72 6f 72 2c 20 30 2c 20 30 2c 20 73 6f 72 74  rror, 0, 0, sort
9070: 4f 72 64 65 72 2c 20 30 29 3b 0a 20 20 20 20 70  Order, 0);.    p
9080: 4c 69 73 74 20 3d 20 30 3b 0a 20 20 7d 0a 0a 70  List = 0;.  }..p
9090: 72 69 6d 61 72 79 5f 6b 65 79 5f 65 78 69 74 3a  rimary_key_exit:
90a0: 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69  .  sqlite3ExprLi
90b0: 73 74 44 65 6c 65 74 65 28 70 4c 69 73 74 29 3b  stDelete(pList);
90c0: 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a  .  return;.}../*
90d0: 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77 20 43 48  .** Add a new CH
90e0: 45 43 4b 20 63 6f 6e 73 74 72 61 69 6e 74 20 74  ECK constraint t
90f0: 6f 20 74 68 65 20 74 61 62 6c 65 20 63 75 72 72  o the table curr
9100: 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73  ently under cons
9110: 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69  truction..*/.voi
9120: 64 20 73 71 6c 69 74 65 33 41 64 64 43 68 65 63  d sqlite3AddChec
9130: 6b 43 6f 6e 73 74 72 61 69 6e 74 28 0a 20 20 50  kConstraint(.  P
9140: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
9150: 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
9160: 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  ext */.  Expr *p
9170: 43 68 65 63 6b 45 78 70 72 20 20 2f 2a 20 54 68  CheckExpr  /* Th
9180: 65 20 63 68 65 63 6b 20 65 78 70 72 65 73 73 69  e check expressi
9190: 6f 6e 20 2a 2f 0a 29 7b 0a 23 69 66 6e 64 65 66  on */.){.#ifndef
91a0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 48 45   SQLITE_OMIT_CHE
91b0: 43 4b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  CK.  Table *pTab
91c0: 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54   = pParse->pNewT
91d0: 61 62 6c 65 3b 0a 20 20 69 66 28 20 70 54 61 62  able;.  if( pTab
91e0: 20 26 26 20 21 49 4e 5f 44 45 43 4c 41 52 45 5f   && !IN_DECLARE_
91f0: 56 54 41 42 20 29 7b 0a 20 20 20 20 2f 2a 20 54  VTAB ){.    /* T
9200: 68 65 20 43 48 45 43 4b 20 65 78 70 72 65 73 73  he CHECK express
9210: 69 6f 6e 20 6d 75 73 74 20 62 65 20 64 75 70 6c  ion must be dupl
9220: 69 63 61 74 65 64 20 73 6f 20 74 68 61 74 20 74  icated so that t
9230: 6f 6b 65 6e 73 20 72 65 66 65 72 0a 20 20 20 20  okens refer.    
9240: 2a 2a 20 74 6f 20 6d 61 6c 6c 6f 63 65 64 20 73  ** to malloced s
9250: 70 61 63 65 20 61 6e 64 20 6e 6f 74 20 74 68 65  pace and not the
9260: 20 28 65 70 68 65 6d 65 72 61 6c 29 20 74 65 78   (ephemeral) tex
9270: 74 20 6f 66 20 74 68 65 20 43 52 45 41 54 45 20  t of the CREATE 
9280: 54 41 42 4c 45 0a 20 20 20 20 2a 2a 20 73 74 61  TABLE.    ** sta
9290: 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 70 54  tement */.    pT
92a0: 61 62 2d 3e 70 43 68 65 63 6b 20 3d 20 73 71 6c  ab->pCheck = sql
92b0: 69 74 65 33 45 78 70 72 41 6e 64 28 70 54 61 62  ite3ExprAnd(pTab
92c0: 2d 3e 70 43 68 65 63 6b 2c 20 73 71 6c 69 74 65  ->pCheck, sqlite
92d0: 33 45 78 70 72 44 75 70 28 70 43 68 65 63 6b 45  3ExprDup(pCheckE
92e0: 78 70 72 29 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  xpr));.  }.#endi
92f0: 66 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44  f.  sqlite3ExprD
9300: 65 6c 65 74 65 28 70 43 68 65 63 6b 45 78 70 72  elete(pCheckExpr
9310: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  );.}../*.** Set 
9320: 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 75  the collation fu
9330: 6e 63 74 69 6f 6e 20 6f 66 20 74 68 65 20 6d 6f  nction of the mo
9340: 73 74 20 72 65 63 65 6e 74 6c 79 20 70 61 72 73  st recently pars
9350: 65 64 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 0a  ed table column.
9360: 2a 2a 20 74 6f 20 74 68 65 20 43 6f 6c 6c 53 65  ** to the CollSe
9370: 71 20 67 69 76 65 6e 2e 0a 2a 2f 0a 76 6f 69 64  q given..*/.void
9380: 20 73 71 6c 69 74 65 33 41 64 64 43 6f 6c 6c 61   sqlite3AddColla
9390: 74 65 54 79 70 65 28 50 61 72 73 65 20 2a 70 50  teType(Parse *pP
93a0: 61 72 73 65 2c 20 63 6f 6e 73 74 20 63 68 61 72  arse, const char
93b0: 20 2a 7a 54 79 70 65 2c 20 69 6e 74 20 6e 54 79   *zType, int nTy
93c0: 70 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b  pe){.  Table *p;
93d0: 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 69 66 28  .  int i;..  if(
93e0: 20 28 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e   (p = pParse->pN
93f0: 65 77 54 61 62 6c 65 29 3d 3d 30 20 29 20 72 65  ewTable)==0 ) re
9400: 74 75 72 6e 3b 0a 20 20 69 20 3d 20 70 2d 3e 6e  turn;.  i = p->n
9410: 43 6f 6c 2d 31 3b 0a 0a 20 20 69 66 28 20 73 71  Col-1;..  if( sq
9420: 6c 69 74 65 33 4c 6f 63 61 74 65 43 6f 6c 6c 53  lite3LocateCollS
9430: 65 71 28 70 50 61 72 73 65 2c 20 7a 54 79 70 65  eq(pParse, zType
9440: 2c 20 6e 54 79 70 65 29 20 29 7b 0a 20 20 20 20  , nType) ){.    
9450: 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 20  Index *pIdx;.   
9460: 20 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 43 6f 6c   p->aCol[i].zCol
9470: 6c 20 3d 20 73 71 6c 69 74 65 53 74 72 4e 44 75  l = sqliteStrNDu
9480: 70 28 7a 54 79 70 65 2c 20 6e 54 79 70 65 29 3b  p(zType, nType);
9490: 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  .  .    /* If th
94a0: 65 20 63 6f 6c 75 6d 6e 20 69 73 20 64 65 63 6c  e column is decl
94b0: 61 72 65 64 20 61 73 20 22 3c 6e 61 6d 65 3e 20  ared as "<name> 
94c0: 50 52 49 4d 41 52 59 20 4b 45 59 20 43 4f 4c 4c  PRIMARY KEY COLL
94d0: 41 54 45 20 3c 74 79 70 65 3e 22 2c 0a 20 20 20  ATE <type>",.   
94e0: 20 2a 2a 20 74 68 65 6e 20 61 6e 20 69 6e 64 65   ** then an inde
94f0: 78 20 6d 61 79 20 68 61 76 65 20 62 65 65 6e 20  x may have been 
9500: 63 72 65 61 74 65 64 20 6f 6e 20 74 68 69 73 20  created on this 
9510: 63 6f 6c 75 6d 6e 20 62 65 66 6f 72 65 20 74 68  column before th
9520: 65 0a 20 20 20 20 2a 2a 20 63 6f 6c 6c 61 74 69  e.    ** collati
9530: 6f 6e 20 74 79 70 65 20 77 61 73 20 61 64 64 65  on type was adde
9540: 64 2e 20 43 6f 72 72 65 63 74 20 74 68 69 73 20  d. Correct this 
9550: 69 66 20 69 74 20 69 73 20 74 68 65 20 63 61 73  if it is the cas
9560: 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f  e..    */.    fo
9570: 72 28 70 49 64 78 3d 70 2d 3e 70 49 6e 64 65 78  r(pIdx=p->pIndex
9580: 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64  ; pIdx; pIdx=pId
9590: 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20  x->pNext){.     
95a0: 20 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e 6e   assert( pIdx->n
95b0: 43 6f 6c 75 6d 6e 3d 3d 31 20 29 3b 0a 20 20 20  Column==1 );.   
95c0: 20 20 20 69 66 28 20 70 49 64 78 2d 3e 61 69 43     if( pIdx->aiC
95d0: 6f 6c 75 6d 6e 5b 30 5d 3d 3d 69 20 29 7b 0a 20  olumn[0]==i ){. 
95e0: 20 20 20 20 20 20 20 70 49 64 78 2d 3e 61 7a 43         pIdx->azC
95f0: 6f 6c 6c 5b 30 5d 20 3d 20 70 2d 3e 61 43 6f 6c  oll[0] = p->aCol
9600: 5b 69 5d 2e 7a 43 6f 6c 6c 3b 0a 20 20 20 20 20  [i].zColl;.     
9610: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a   }.    }.  }.}..
9620: 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
9630: 69 6f 6e 20 72 65 74 75 72 6e 73 20 74 68 65 20  ion returns the 
9640: 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
9650: 63 65 20 66 6f 72 20 64 61 74 61 62 61 73 65 20  ce for database 
9660: 6e 61 74 69 76 65 20 74 65 78 74 0a 2a 2a 20 65  native text.** e
9670: 6e 63 6f 64 69 6e 67 20 69 64 65 6e 74 69 66 69  ncoding identifi
9680: 65 64 20 62 79 20 74 68 65 20 73 74 72 69 6e 67  ed by the string
9690: 20 7a 4e 61 6d 65 2c 20 6c 65 6e 67 74 68 20 6e   zName, length n
96a0: 4e 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  Name..**.** If t
96b0: 68 65 20 72 65 71 75 65 73 74 65 64 20 63 6f 6c  he requested col
96c0: 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20  lation sequence 
96d0: 69 73 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65  is not available
96e0: 2c 20 6f 72 20 6e 6f 74 20 61 76 61 69 6c 61 62  , or not availab
96f0: 6c 65 0a 2a 2a 20 69 6e 20 74 68 65 20 64 61 74  le.** in the dat
9700: 61 62 61 73 65 20 6e 61 74 69 76 65 20 65 6e 63  abase native enc
9710: 6f 64 69 6e 67 2c 20 74 68 65 20 63 6f 6c 6c 61  oding, the colla
9720: 74 69 6f 6e 20 66 61 63 74 6f 72 79 20 69 73 20  tion factory is 
9730: 69 6e 76 6f 6b 65 64 20 74 6f 0a 2a 2a 20 72 65  invoked to.** re
9740: 71 75 65 73 74 20 69 74 2e 20 49 66 20 74 68 65  quest it. If the
9750: 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 61 63 74 6f   collation facto
9760: 72 79 20 64 6f 65 73 20 6e 6f 74 20 73 75 70 70  ry does not supp
9770: 6c 79 20 73 75 63 68 20 61 20 73 65 71 75 65 6e  ly such a sequen
9780: 63 65 2c 0a 2a 2a 20 61 6e 64 20 74 68 65 20 73  ce,.** and the s
9790: 65 71 75 65 6e 63 65 20 69 73 20 61 76 61 69 6c  equence is avail
97a0: 61 62 6c 65 20 69 6e 20 61 6e 6f 74 68 65 72 20  able in another 
97b0: 74 65 78 74 20 65 6e 63 6f 64 69 6e 67 2c 20 74  text encoding, t
97c0: 68 65 6e 20 74 68 61 74 20 69 73 0a 2a 2a 20 72  hen that is.** r
97d0: 65 74 75 72 6e 65 64 20 69 6e 73 74 65 61 64 2e  eturned instead.
97e0: 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 20 76 65 72  .**.** If no ver
97f0: 73 69 6f 6e 73 20 6f 66 20 74 68 65 20 72 65 71  sions of the req
9800: 75 65 73 74 65 64 20 63 6f 6c 6c 61 74 69 6f 6e  uested collation
9810: 73 20 73 65 71 75 65 6e 63 65 20 61 72 65 20 61  s sequence are a
9820: 76 61 69 6c 61 62 6c 65 2c 20 6f 72 0a 2a 2a 20  vailable, or.** 
9830: 61 6e 6f 74 68 65 72 20 65 72 72 6f 72 20 6f 63  another error oc
9840: 63 75 72 73 2c 20 4e 55 4c 4c 20 69 73 20 72 65  curs, NULL is re
9850: 74 75 72 6e 65 64 20 61 6e 64 20 61 6e 20 65 72  turned and an er
9860: 72 6f 72 20 6d 65 73 73 61 67 65 20 77 72 69 74  ror message writ
9870: 74 65 6e 20 69 6e 74 6f 0a 2a 2a 20 70 50 61 72  ten into.** pPar
9880: 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  se..**.** This r
9890: 6f 75 74 69 6e 65 20 69 73 20 61 20 77 72 61 70  outine is a wrap
98a0: 70 65 72 20 61 72 6f 75 6e 64 20 73 71 6c 69 74  per around sqlit
98b0: 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28 29 2e  e3FindCollSeq().
98c0: 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a    This routine.*
98d0: 2a 20 69 6e 76 6f 6b 65 73 20 74 68 65 20 63 6f  * invokes the co
98e0: 6c 6c 61 74 69 6f 6e 20 66 61 63 74 6f 72 79 20  llation factory 
98f0: 69 66 20 74 68 65 20 6e 61 6d 65 64 20 63 6f 6c  if the named col
9900: 6c 61 74 69 6f 6e 20 63 61 6e 6e 6f 74 20 62 65  lation cannot be
9910: 20 66 6f 75 6e 64 0a 2a 2a 20 61 6e 64 20 67 65   found.** and ge
9920: 6e 65 72 61 74 65 73 20 61 6e 20 65 72 72 6f 72  nerates an error
9930: 20 6d 65 73 73 61 67 65 2e 0a 2a 2f 0a 43 6f 6c   message..*/.Col
9940: 6c 53 65 71 20 2a 73 71 6c 69 74 65 33 4c 6f 63  lSeq *sqlite3Loc
9950: 61 74 65 43 6f 6c 6c 53 65 71 28 50 61 72 73 65  ateCollSeq(Parse
9960: 20 2a 70 50 61 72 73 65 2c 20 63 6f 6e 73 74 20   *pParse, const 
9970: 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 69 6e 74  char *zName, int
9980: 20 6e 4e 61 6d 65 29 7b 0a 20 20 73 71 6c 69 74   nName){.  sqlit
9990: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
99a0: 3e 64 62 3b 0a 20 20 75 38 20 65 6e 63 20 3d 20  >db;.  u8 enc = 
99b0: 45 4e 43 28 64 62 29 3b 0a 20 20 75 38 20 69 6e  ENC(db);.  u8 in
99c0: 69 74 62 75 73 79 20 3d 20 64 62 2d 3e 69 6e 69  itbusy = db->ini
99d0: 74 2e 62 75 73 79 3b 0a 20 20 43 6f 6c 6c 53 65  t.busy;.  CollSe
99e0: 71 20 2a 70 43 6f 6c 6c 3b 0a 0a 20 20 70 43 6f  q *pColl;..  pCo
99f0: 6c 6c 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64  ll = sqlite3Find
9a00: 43 6f 6c 6c 53 65 71 28 64 62 2c 20 65 6e 63 2c  CollSeq(db, enc,
9a10: 20 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 2c 20 69   zName, nName, i
9a20: 6e 69 74 62 75 73 79 29 3b 0a 20 20 69 66 28 20  nitbusy);.  if( 
9a30: 21 69 6e 69 74 62 75 73 79 20 26 26 20 28 21 70  !initbusy && (!p
9a40: 43 6f 6c 6c 20 7c 7c 20 21 70 43 6f 6c 6c 2d 3e  Coll || !pColl->
9a50: 78 43 6d 70 29 20 29 7b 0a 20 20 20 20 70 43 6f  xCmp) ){.    pCo
9a60: 6c 6c 20 3d 20 73 71 6c 69 74 65 33 47 65 74 43  ll = sqlite3GetC
9a70: 6f 6c 6c 53 65 71 28 64 62 2c 20 70 43 6f 6c 6c  ollSeq(db, pColl
9a80: 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 29 3b  , zName, nName);
9a90: 0a 20 20 20 20 69 66 28 20 21 70 43 6f 6c 6c 20  .    if( !pColl 
9aa0: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 4e 61  ){.      if( nNa
9ab0: 6d 65 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20  me<0 ){.        
9ac0: 6e 4e 61 6d 65 20 3d 20 73 74 72 6c 65 6e 28 7a  nName = strlen(z
9ad0: 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Name);.      }. 
9ae0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
9af0: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f  rMsg(pParse, "no
9b00: 20 73 75 63 68 20 63 6f 6c 6c 61 74 69 6f 6e 20   such collation 
9b10: 73 65 71 75 65 6e 63 65 3a 20 25 2e 2a 73 22 2c  sequence: %.*s",
9b20: 20 6e 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29 3b 0a   nName, zName);.
9b30: 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 30 3b        pColl = 0;
9b40: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65  .    }.  }..  re
9b50: 74 75 72 6e 20 70 43 6f 6c 6c 3b 0a 7d 0a 0a 0a  turn pColl;.}...
9b60: 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
9b70: 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 69 6e  ode that will in
9b80: 63 72 65 6d 65 6e 74 20 74 68 65 20 73 63 68 65  crement the sche
9b90: 6d 61 20 63 6f 6f 6b 69 65 2e 0a 2a 2a 0a 2a 2a  ma cookie..**.**
9ba0: 20 54 68 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b   The schema cook
9bb0: 69 65 20 69 73 20 75 73 65 64 20 74 6f 20 64 65  ie is used to de
9bc0: 74 65 72 6d 69 6e 65 20 77 68 65 6e 20 74 68 65  termine when the
9bd0: 20 73 63 68 65 6d 61 20 66 6f 72 20 74 68 65 0a   schema for the.
9be0: 2a 2a 20 64 61 74 61 62 61 73 65 20 63 68 61 6e  ** database chan
9bf0: 67 65 73 2e 20 20 41 66 74 65 72 20 65 61 63 68  ges.  After each
9c00: 20 73 63 68 65 6d 61 20 63 68 61 6e 67 65 2c 20   schema change, 
9c10: 74 68 65 20 63 6f 6f 6b 69 65 20 76 61 6c 75 65  the cookie value
9c20: 0a 2a 2a 20 63 68 61 6e 67 65 73 2e 20 20 57 68  .** changes.  Wh
9c30: 65 6e 20 61 20 70 72 6f 63 65 73 73 20 66 69 72  en a process fir
9c40: 73 74 20 72 65 61 64 73 20 74 68 65 20 73 63 68  st reads the sch
9c50: 65 6d 61 20 69 74 20 72 65 63 6f 72 64 73 20 74  ema it records t
9c60: 68 65 0a 2a 2a 20 63 6f 6f 6b 69 65 2e 20 20 54  he.** cookie.  T
9c70: 68 65 72 65 61 66 74 65 72 2c 20 77 68 65 6e 65  hereafter, whene
9c80: 76 65 72 20 69 74 20 67 6f 65 73 20 74 6f 20 61  ver it goes to a
9c90: 63 63 65 73 73 20 74 68 65 20 64 61 74 61 62 61  ccess the databa
9ca0: 73 65 2c 0a 2a 2a 20 69 74 20 63 68 65 63 6b 73  se,.** it checks
9cb0: 20 74 68 65 20 63 6f 6f 6b 69 65 20 74 6f 20 6d   the cookie to m
9cc0: 61 6b 65 20 73 75 72 65 20 74 68 65 20 73 63 68  ake sure the sch
9cd0: 65 6d 61 20 68 61 73 20 6e 6f 74 20 63 68 61 6e  ema has not chan
9ce0: 67 65 64 0a 2a 2a 20 73 69 6e 63 65 20 69 74 20  ged.** since it 
9cf0: 77 61 73 20 6c 61 73 74 20 72 65 61 64 2e 0a 2a  was last read..*
9d00: 2a 0a 2a 2a 20 54 68 69 73 20 70 6c 61 6e 20 69  *.** This plan i
9d10: 73 20 6e 6f 74 20 63 6f 6d 70 6c 65 74 65 6c 79  s not completely
9d20: 20 62 75 6c 6c 65 74 2d 70 72 6f 6f 66 2e 20 20   bullet-proof.  
9d30: 49 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20 66  It is possible f
9d40: 6f 72 0a 2a 2a 20 74 68 65 20 73 63 68 65 6d 61  or.** the schema
9d50: 20 74 6f 20 63 68 61 6e 67 65 20 6d 75 6c 74 69   to change multi
9d60: 70 6c 65 20 74 69 6d 65 73 20 61 6e 64 20 66 6f  ple times and fo
9d70: 72 20 74 68 65 20 63 6f 6f 6b 69 65 20 74 6f 20  r the cookie to 
9d80: 62 65 0a 2a 2a 20 73 65 74 20 62 61 63 6b 20 74  be.** set back t
9d90: 6f 20 70 72 69 6f 72 20 76 61 6c 75 65 2e 20 20  o prior value.  
9da0: 42 75 74 20 73 63 68 65 6d 61 20 63 68 61 6e 67  But schema chang
9db0: 65 73 20 61 72 65 20 69 6e 66 72 65 71 75 65 6e  es are infrequen
9dc0: 74 0a 2a 2a 20 61 6e 64 20 74 68 65 20 70 72 6f  t.** and the pro
9dd0: 62 61 62 69 6c 69 74 79 20 6f 66 20 68 69 74 74  bability of hitt
9de0: 69 6e 67 20 74 68 65 20 73 61 6d 65 20 63 6f 6f  ing the same coo
9df0: 6b 69 65 20 76 61 6c 75 65 20 69 73 20 6f 6e 6c  kie value is onl
9e00: 79 0a 2a 2a 20 31 20 63 68 61 6e 63 65 20 69 6e  y.** 1 chance in
9e10: 20 32 5e 33 32 2e 20 20 53 6f 20 77 65 27 72 65   2^32.  So we're
9e20: 20 73 61 66 65 20 65 6e 6f 75 67 68 2e 0a 2a 2f   safe enough..*/
9e30: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 68 61  .void sqlite3Cha
9e40: 6e 67 65 43 6f 6f 6b 69 65 28 73 71 6c 69 74 65  ngeCookie(sqlite
9e50: 33 20 2a 64 62 2c 20 56 64 62 65 20 2a 76 2c 20  3 *db, Vdbe *v, 
9e60: 69 6e 74 20 69 44 62 29 7b 0a 20 20 73 71 6c 69  int iDb){.  sqli
9e70: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
9e80: 4f 50 5f 49 6e 74 65 67 65 72 2c 20 64 62 2d 3e  OP_Integer, db->
9e90: 61 44 62 5b 69 44 62 5d 2e 70 53 63 68 65 6d 61  aDb[iDb].pSchema
9ea0: 2d 3e 73 63 68 65 6d 61 5f 63 6f 6f 6b 69 65 2b  ->schema_cookie+
9eb0: 31 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33  1, 0);.  sqlite3
9ec0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
9ed0: 53 65 74 43 6f 6f 6b 69 65 2c 20 69 44 62 2c 20  SetCookie, iDb, 
9ee0: 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 65 61  0);.}../*.** Mea
9ef0: 73 75 72 65 20 74 68 65 20 6e 75 6d 62 65 72 20  sure the number 
9f00: 6f 66 20 63 68 61 72 61 63 74 65 72 73 20 6e 65  of characters ne
9f10: 65 64 65 64 20 74 6f 20 6f 75 74 70 75 74 20 74  eded to output t
9f20: 68 65 20 67 69 76 65 6e 0a 2a 2a 20 69 64 65 6e  he given.** iden
9f30: 74 69 66 69 65 72 2e 20 20 54 68 65 20 6e 75 6d  tifier.  The num
9f40: 62 65 72 20 72 65 74 75 72 6e 65 64 20 69 6e 63  ber returned inc
9f50: 6c 75 64 65 73 20 61 6e 79 20 71 75 6f 74 65 73  ludes any quotes
9f60: 20 75 73 65 64 0a 2a 2a 20 62 75 74 20 64 6f 65   used.** but doe
9f70: 73 20 6e 6f 74 20 69 6e 63 6c 75 64 65 20 74 68  s not include th
9f80: 65 20 6e 75 6c 6c 20 74 65 72 6d 69 6e 61 74 6f  e null terminato
9f90: 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 65 73 74  r..**.** The est
9fa0: 69 6d 61 74 65 20 69 73 20 63 6f 6e 73 65 72 76  imate is conserv
9fb0: 61 74 69 76 65 2e 20 20 49 74 20 6d 69 67 68 74  ative.  It might
9fc0: 20 62 65 20 6c 61 72 67 65 72 20 74 68 61 74 20   be larger that 
9fd0: 77 68 61 74 20 69 73 0a 2a 2a 20 72 65 61 6c 6c  what is.** reall
9fe0: 79 20 6e 65 65 64 65 64 2e 0a 2a 2f 0a 73 74 61  y needed..*/.sta
9ff0: 74 69 63 20 69 6e 74 20 69 64 65 6e 74 4c 65 6e  tic int identLen
a000: 67 74 68 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  gth(const char *
a010: 7a 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 66  z){.  int n;.  f
a020: 6f 72 28 6e 3d 30 3b 20 2a 7a 3b 20 6e 2b 2b 2c  or(n=0; *z; n++,
a030: 20 7a 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 2a   z++){.    if( *
a040: 7a 3d 3d 27 22 27 20 29 7b 20 6e 2b 2b 3b 20 7d  z=='"' ){ n++; }
a050: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 20  .  }.  return n 
a060: 2b 20 32 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72  + 2;.}../*.** Wr
a070: 69 74 65 20 61 6e 20 69 64 65 6e 74 69 66 69 65  ite an identifie
a080: 72 20 6f 6e 74 6f 20 74 68 65 20 65 6e 64 20 6f  r onto the end o
a090: 66 20 74 68 65 20 67 69 76 65 6e 20 73 74 72 69  f the given stri
a0a0: 6e 67 2e 20 20 41 64 64 0a 2a 2a 20 71 75 6f 74  ng.  Add.** quot
a0b0: 65 20 63 68 61 72 61 63 74 65 72 73 20 61 73 20  e characters as 
a0c0: 6e 65 65 64 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  needed..*/.stati
a0d0: 63 20 76 6f 69 64 20 69 64 65 6e 74 50 75 74 28  c void identPut(
a0e0: 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20 2a 70 49  char *z, int *pI
a0f0: 64 78 2c 20 63 68 61 72 20 2a 7a 53 69 67 6e 65  dx, char *zSigne
a100: 64 49 64 65 6e 74 29 7b 0a 20 20 75 6e 73 69 67  dIdent){.  unsig
a110: 6e 65 64 20 63 68 61 72 20 2a 7a 49 64 65 6e 74  ned char *zIdent
a120: 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61   = (unsigned cha
a130: 72 2a 29 7a 53 69 67 6e 65 64 49 64 65 6e 74 3b  r*)zSignedIdent;
a140: 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6e 65 65  .  int i, j, nee
a150: 64 51 75 6f 74 65 3b 0a 20 20 69 20 3d 20 2a 70  dQuote;.  i = *p
a160: 49 64 78 3b 0a 20 20 66 6f 72 28 6a 3d 30 3b 20  Idx;.  for(j=0; 
a170: 7a 49 64 65 6e 74 5b 6a 5d 3b 20 6a 2b 2b 29 7b  zIdent[j]; j++){
a180: 0a 20 20 20 20 69 66 28 20 21 69 73 61 6c 6e 75  .    if( !isalnu
a190: 6d 28 7a 49 64 65 6e 74 5b 6a 5d 29 20 26 26 20  m(zIdent[j]) && 
a1a0: 7a 49 64 65 6e 74 5b 6a 5d 21 3d 27 5f 27 20 29  zIdent[j]!='_' )
a1b0: 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 6e 65   break;.  }.  ne
a1c0: 65 64 51 75 6f 74 65 20 3d 20 20 7a 49 64 65 6e  edQuote =  zIden
a1d0: 74 5b 6a 5d 21 3d 30 20 7c 7c 20 69 73 64 69 67  t[j]!=0 || isdig
a1e0: 69 74 28 7a 49 64 65 6e 74 5b 30 5d 29 0a 20 20  it(zIdent[0]).  
a1f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a200: 7c 7c 20 73 71 6c 69 74 65 33 4b 65 79 77 6f 72  || sqlite3Keywor
a210: 64 43 6f 64 65 28 7a 49 64 65 6e 74 2c 20 6a 29  dCode(zIdent, j)
a220: 21 3d 54 4b 5f 49 44 3b 0a 20 20 69 66 28 20 6e  !=TK_ID;.  if( n
a230: 65 65 64 51 75 6f 74 65 20 29 20 7a 5b 69 2b 2b  eedQuote ) z[i++
a240: 5d 20 3d 20 27 22 27 3b 0a 20 20 66 6f 72 28 6a  ] = '"';.  for(j
a250: 3d 30 3b 20 7a 49 64 65 6e 74 5b 6a 5d 3b 20 6a  =0; zIdent[j]; j
a260: 2b 2b 29 7b 0a 20 20 20 20 7a 5b 69 2b 2b 5d 20  ++){.    z[i++] 
a270: 3d 20 7a 49 64 65 6e 74 5b 6a 5d 3b 0a 20 20 20  = zIdent[j];.   
a280: 20 69 66 28 20 7a 49 64 65 6e 74 5b 6a 5d 3d 3d   if( zIdent[j]==
a290: 27 22 27 20 29 20 7a 5b 69 2b 2b 5d 20 3d 20 27  '"' ) z[i++] = '
a2a0: 22 27 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 65  "';.  }.  if( ne
a2b0: 65 64 51 75 6f 74 65 20 29 20 7a 5b 69 2b 2b 5d  edQuote ) z[i++]
a2c0: 20 3d 20 27 22 27 3b 0a 20 20 7a 5b 69 5d 20 3d   = '"';.  z[i] =
a2d0: 20 30 3b 0a 20 20 2a 70 49 64 78 20 3d 20 69 3b   0;.  *pIdx = i;
a2e0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
a2f0: 74 65 20 61 20 43 52 45 41 54 45 20 54 41 42 4c  te a CREATE TABL
a300: 45 20 73 74 61 74 65 6d 65 6e 74 20 61 70 70 72  E statement appr
a310: 6f 70 72 69 61 74 65 20 66 6f 72 20 74 68 65 20  opriate for the 
a320: 67 69 76 65 6e 0a 2a 2a 20 74 61 62 6c 65 2e 20  given.** table. 
a330: 20 4d 65 6d 6f 72 79 20 74 6f 20 68 6f 6c 64 20   Memory to hold 
a340: 74 68 65 20 74 65 78 74 20 6f 66 20 74 68 65 20  the text of the 
a350: 73 74 61 74 65 6d 65 6e 74 20 69 73 20 6f 62 74  statement is obt
a360: 61 69 6e 65 64 0a 2a 2a 20 66 72 6f 6d 20 73 71  ained.** from sq
a370: 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 20 61 6e 64  liteMalloc() and
a380: 20 6d 75 73 74 20 62 65 20 66 72 65 65 64 20 62   must be freed b
a390: 79 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 66 75  y the calling fu
a3a0: 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  nction..*/.stati
a3b0: 63 20 63 68 61 72 20 2a 63 72 65 61 74 65 54 61  c char *createTa
a3c0: 62 6c 65 53 74 6d 74 28 54 61 62 6c 65 20 2a 70  bleStmt(Table *p
a3d0: 2c 20 69 6e 74 20 69 73 54 65 6d 70 29 7b 0a 20  , int isTemp){. 
a3e0: 20 69 6e 74 20 69 2c 20 6b 2c 20 6e 3b 0a 20 20   int i, k, n;.  
a3f0: 63 68 61 72 20 2a 7a 53 74 6d 74 3b 0a 20 20 63  char *zStmt;.  c
a400: 68 61 72 20 2a 7a 53 65 70 2c 20 2a 7a 53 65 70  har *zSep, *zSep
a410: 32 2c 20 2a 7a 45 6e 64 2c 20 2a 7a 3b 0a 20 20  2, *zEnd, *z;.  
a420: 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20  Column *pCol;.  
a430: 6e 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70 43 6f  n = 0;.  for(pCo
a440: 6c 20 3d 20 70 2d 3e 61 43 6f 6c 2c 20 69 3d 30  l = p->aCol, i=0
a450: 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b  ; i<p->nCol; i++
a460: 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 6e  , pCol++){.    n
a470: 20 2b 3d 20 69 64 65 6e 74 4c 65 6e 67 74 68 28   += identLength(
a480: 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pCol->zName);.  
a490: 20 20 7a 20 3d 20 70 43 6f 6c 2d 3e 7a 54 79 70    z = pCol->zTyp
a4a0: 65 3b 0a 20 20 20 20 69 66 28 20 7a 20 29 7b 0a  e;.    if( z ){.
a4b0: 20 20 20 20 20 20 6e 20 2b 3d 20 28 73 74 72 6c        n += (strl
a4c0: 65 6e 28 7a 29 20 2b 20 31 29 3b 0a 20 20 20 20  en(z) + 1);.    
a4d0: 7d 0a 20 20 7d 0a 20 20 6e 20 2b 3d 20 69 64 65  }.  }.  n += ide
a4e0: 6e 74 4c 65 6e 67 74 68 28 70 2d 3e 7a 4e 61 6d  ntLength(p->zNam
a4f0: 65 29 3b 0a 20 20 69 66 28 20 6e 3c 35 30 20 29  e);.  if( n<50 )
a500: 7b 0a 20 20 20 20 7a 53 65 70 20 3d 20 22 22 3b  {.    zSep = "";
a510: 0a 20 20 20 20 7a 53 65 70 32 20 3d 20 22 2c 22  .    zSep2 = ","
a520: 3b 0a 20 20 20 20 7a 45 6e 64 20 3d 20 22 29 22  ;.    zEnd = ")"
a530: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a  ;.  }else{.    z
a540: 53 65 70 20 3d 20 22 5c 6e 20 20 22 3b 0a 20 20  Sep = "\n  ";.  
a550: 20 20 7a 53 65 70 32 20 3d 20 22 2c 5c 6e 20 20    zSep2 = ",\n  
a560: 22 3b 0a 20 20 20 20 7a 45 6e 64 20 3d 20 22 5c  ";.    zEnd = "\
a570: 6e 29 22 3b 0a 20 20 7d 0a 20 20 6e 20 2b 3d 20  n)";.  }.  n += 
a580: 33 35 20 2b 20 36 2a 70 2d 3e 6e 43 6f 6c 3b 0a  35 + 6*p->nCol;.
a590: 20 20 7a 53 74 6d 74 20 3d 20 73 71 6c 69 74 65    zStmt = sqlite
a5a0: 4d 61 6c 6c 6f 63 52 61 77 28 20 6e 20 29 3b 0a  MallocRaw( n );.
a5b0: 20 20 69 66 28 20 7a 53 74 6d 74 3d 3d 30 20 29    if( zStmt==0 )
a5c0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 73 74 72   return 0;.  str
a5d0: 63 70 79 28 7a 53 74 6d 74 2c 20 21 4f 4d 49 54  cpy(zStmt, !OMIT
a5e0: 5f 54 45 4d 50 44 42 26 26 69 73 54 65 6d 70 20  _TEMPDB&&isTemp 
a5f0: 3f 20 22 43 52 45 41 54 45 20 54 45 4d 50 20 54  ? "CREATE TEMP T
a600: 41 42 4c 45 20 22 3a 22 43 52 45 41 54 45 20 54  ABLE ":"CREATE T
a610: 41 42 4c 45 20 22 29 3b 0a 20 20 6b 20 3d 20 73  ABLE ");.  k = s
a620: 74 72 6c 65 6e 28 7a 53 74 6d 74 29 3b 0a 20 20  trlen(zStmt);.  
a630: 69 64 65 6e 74 50 75 74 28 7a 53 74 6d 74 2c 20  identPut(zStmt, 
a640: 26 6b 2c 20 70 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  &k, p->zName);. 
a650: 20 7a 53 74 6d 74 5b 6b 2b 2b 5d 20 3d 20 27 28   zStmt[k++] = '(
a660: 27 3b 0a 20 20 66 6f 72 28 70 43 6f 6c 3d 70 2d  ';.  for(pCol=p-
a670: 3e 61 43 6f 6c 2c 20 69 3d 30 3b 20 69 3c 70 2d  >aCol, i=0; i<p-
a680: 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c  >nCol; i++, pCol
a690: 2b 2b 29 7b 0a 20 20 20 20 73 74 72 63 70 79 28  ++){.    strcpy(
a6a0: 26 7a 53 74 6d 74 5b 6b 5d 2c 20 7a 53 65 70 29  &zStmt[k], zSep)
a6b0: 3b 0a 20 20 20 20 6b 20 2b 3d 20 73 74 72 6c 65  ;.    k += strle
a6c0: 6e 28 26 7a 53 74 6d 74 5b 6b 5d 29 3b 0a 20 20  n(&zStmt[k]);.  
a6d0: 20 20 7a 53 65 70 20 3d 20 7a 53 65 70 32 3b 0a    zSep = zSep2;.
a6e0: 20 20 20 20 69 64 65 6e 74 50 75 74 28 7a 53 74      identPut(zSt
a6f0: 6d 74 2c 20 26 6b 2c 20 70 43 6f 6c 2d 3e 7a 4e  mt, &k, pCol->zN
a700: 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 28 7a  ame);.    if( (z
a710: 20 3d 20 70 43 6f 6c 2d 3e 7a 54 79 70 65 29 21   = pCol->zType)!
a720: 3d 30 20 29 7b 0a 20 20 20 20 20 20 7a 53 74 6d  =0 ){.      zStm
a730: 74 5b 6b 2b 2b 5d 20 3d 20 27 20 27 3b 0a 20 20  t[k++] = ' ';.  
a740: 20 20 20 20 73 74 72 63 70 79 28 26 7a 53 74 6d      strcpy(&zStm
a750: 74 5b 6b 5d 2c 20 7a 29 3b 0a 20 20 20 20 20 20  t[k], z);.      
a760: 6b 20 2b 3d 20 73 74 72 6c 65 6e 28 7a 29 3b 0a  k += strlen(z);.
a770: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 74 72 63      }.  }.  strc
a780: 70 79 28 26 7a 53 74 6d 74 5b 6b 5d 2c 20 7a 45  py(&zStmt[k], zE
a790: 6e 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a 53  nd);.  return zS
a7a0: 74 6d 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  tmt;.}../*.** Th
a7b0: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
a7c0: 6c 6c 65 64 20 74 6f 20 72 65 70 6f 72 74 20 74  lled to report t
a7d0: 68 65 20 66 69 6e 61 6c 20 22 29 22 20 74 68 61  he final ")" tha
a7e0: 74 20 74 65 72 6d 69 6e 61 74 65 73 0a 2a 2a 20  t terminates.** 
a7f0: 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73  a CREATE TABLE s
a800: 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20  tatement..**.** 
a810: 54 68 65 20 74 61 62 6c 65 20 73 74 72 75 63 74  The table struct
a820: 75 72 65 20 74 68 61 74 20 6f 74 68 65 72 20 61  ure that other a
a830: 63 74 69 6f 6e 20 72 6f 75 74 69 6e 65 73 20 68  ction routines h
a840: 61 76 65 20 62 65 65 6e 20 62 75 69 6c 64 69 6e  ave been buildin
a850: 67 0a 2a 2a 20 69 73 20 61 64 64 65 64 20 74 6f  g.** is added to
a860: 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 68 61   the internal ha
a870: 73 68 20 74 61 62 6c 65 73 2c 20 61 73 73 75 6d  sh tables, assum
a880: 69 6e 67 20 6e 6f 20 65 72 72 6f 72 73 20 68 61  ing no errors ha
a890: 76 65 0a 2a 2a 20 6f 63 63 75 72 72 65 64 2e 0a  ve.** occurred..
a8a0: 2a 2a 0a 2a 2a 20 41 6e 20 65 6e 74 72 79 20 66  **.** An entry f
a8b0: 6f 72 20 74 68 65 20 74 61 62 6c 65 20 69 73 20  or the table is 
a8c0: 6d 61 64 65 20 69 6e 20 74 68 65 20 6d 61 73 74  made in the mast
a8d0: 65 72 20 74 61 62 6c 65 20 6f 6e 20 64 69 73 6b  er table on disk
a8e0: 2c 20 75 6e 6c 65 73 73 0a 2a 2a 20 74 68 69 73  , unless.** this
a8f0: 20 69 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20   is a temporary 
a900: 74 61 62 6c 65 20 6f 72 20 64 62 2d 3e 69 6e 69  table or db->ini
a910: 74 2e 62 75 73 79 3d 3d 31 2e 20 20 57 68 65 6e  t.busy==1.  When
a920: 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d   db->init.busy==
a930: 31 0a 2a 2a 20 69 74 20 6d 65 61 6e 73 20 77 65  1.** it means we
a940: 20 61 72 65 20 72 65 61 64 69 6e 67 20 74 68 65   are reading the
a950: 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74   sqlite_master t
a960: 61 62 6c 65 20 62 65 63 61 75 73 65 20 77 65 20  able because we 
a970: 6a 75 73 74 0a 2a 2a 20 63 6f 6e 6e 65 63 74 65  just.** connecte
a980: 64 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  d to the databas
a990: 65 20 6f 72 20 62 65 63 61 75 73 65 20 74 68 65  e or because the
a9a0: 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74   sqlite_master t
a9b0: 61 62 6c 65 20 68 61 73 0a 2a 2a 20 72 65 63 65  able has.** rece
a9c0: 6e 74 6c 79 20 63 68 61 6e 67 65 64 2c 20 73 6f  ntly changed, so
a9d0: 20 74 68 65 20 65 6e 74 72 79 20 66 6f 72 20 74   the entry for t
a9e0: 68 69 73 20 74 61 62 6c 65 20 61 6c 72 65 61 64  his table alread
a9f0: 79 20 65 78 69 73 74 73 20 69 6e 0a 2a 2a 20 74  y exists in.** t
aa00: 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  he sqlite_master
aa10: 20 74 61 62 6c 65 2e 20 20 57 65 20 64 6f 20 6e   table.  We do n
aa20: 6f 74 20 77 61 6e 74 20 74 6f 20 63 72 65 61 74  ot want to creat
aa30: 65 20 69 74 20 61 67 61 69 6e 2e 0a 2a 2a 0a 2a  e it again..**.*
aa40: 2a 20 49 66 20 74 68 65 20 70 53 65 6c 65 63 74  * If the pSelect
aa50: 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f 74   argument is not
aa60: 20 4e 55 4c 4c 2c 20 69 74 20 6d 65 61 6e 73 20   NULL, it means 
aa70: 74 68 61 74 20 74 68 69 73 20 72 6f 75 74 69 6e  that this routin
aa80: 65 0a 2a 2a 20 77 61 73 20 63 61 6c 6c 65 64 20  e.** was called 
aa90: 74 6f 20 63 72 65 61 74 65 20 61 20 74 61 62 6c  to create a tabl
aaa0: 65 20 67 65 6e 65 72 61 74 65 64 20 66 72 6f 6d  e generated from
aab0: 20 61 20 0a 2a 2a 20 22 43 52 45 41 54 45 20 54   a .** "CREATE T
aac0: 41 42 4c 45 20 2e 2e 2e 20 41 53 20 53 45 4c 45  ABLE ... AS SELE
aad0: 43 54 20 2e 2e 2e 22 20 73 74 61 74 65 6d 65 6e  CT ..." statemen
aae0: 74 2e 20 20 54 68 65 20 63 6f 6c 75 6d 6e 20 6e  t.  The column n
aaf0: 61 6d 65 73 20 6f 66 0a 2a 2a 20 74 68 65 20 6e  ames of.** the n
ab00: 65 77 20 74 61 62 6c 65 20 77 69 6c 6c 20 6d 61  ew table will ma
ab10: 74 63 68 20 74 68 65 20 72 65 73 75 6c 74 20 73  tch the result s
ab20: 65 74 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54  et of the SELECT
ab30: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
ab40: 33 45 6e 64 54 61 62 6c 65 28 0a 20 20 50 61 72  3EndTable(.  Par
ab50: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
ab60: 20 20 20 20 20 2f 2a 20 50 61 72 73 65 20 63 6f       /* Parse co
ab70: 6e 74 65 78 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e  ntext */.  Token
ab80: 20 2a 70 43 6f 6e 73 2c 20 20 20 20 20 20 20 20   *pCons,        
ab90: 20 20 20 2f 2a 20 54 68 65 20 27 2c 27 20 74 6f     /* The ',' to
aba0: 6b 65 6e 20 61 66 74 65 72 20 74 68 65 20 6c 61  ken after the la
abb0: 73 74 20 63 6f 6c 75 6d 6e 20 64 65 66 6e 2e 20  st column defn. 
abc0: 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 45 6e 64  */.  Token *pEnd
abd0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
abe0: 54 68 65 20 66 69 6e 61 6c 20 27 29 27 20 74 6f  The final ')' to
abf0: 6b 65 6e 20 69 6e 20 74 68 65 20 43 52 45 41 54  ken in the CREAT
ac00: 45 20 54 41 42 4c 45 20 2a 2f 0a 20 20 53 65 6c  E TABLE */.  Sel
ac10: 65 63 74 20 2a 70 53 65 6c 65 63 74 20 20 20 20  ect *pSelect    
ac20: 20 20 20 20 20 2f 2a 20 53 65 6c 65 63 74 20 66       /* Select f
ac30: 72 6f 6d 20 61 20 22 43 52 45 41 54 45 20 2e 2e  rom a "CREATE ..
ac40: 2e 20 41 53 20 53 45 4c 45 43 54 22 20 2a 2f 0a  . AS SELECT" */.
ac50: 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20  ){.  Table *p;. 
ac60: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
ac70: 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74  Parse->db;.  int
ac80: 20 69 44 62 3b 0a 0a 20 20 69 66 28 20 28 70 45   iDb;..  if( (pE
ac90: 6e 64 3d 3d 30 20 26 26 20 70 53 65 6c 65 63 74  nd==0 && pSelect
aca0: 3d 3d 30 29 20 7c 7c 20 70 50 61 72 73 65 2d 3e  ==0) || pParse->
acb0: 6e 45 72 72 20 7c 7c 20 73 71 6c 69 74 65 33 4d  nErr || sqlite3M
acc0: 61 6c 6c 6f 63 46 61 69 6c 65 64 28 29 20 29 20  allocFailed() ) 
acd0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  {.    return;.  
ace0: 7d 0a 20 20 70 20 3d 20 70 50 61 72 73 65 2d 3e  }.  p = pParse->
acf0: 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 69 66 28  pNewTable;.  if(
ad00: 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a   p==0 ) return;.
ad10: 0a 20 20 61 73 73 65 72 74 28 20 21 64 62 2d 3e  .  assert( !db->
ad20: 69 6e 69 74 2e 62 75 73 79 20 7c 7c 20 21 70 53  init.busy || !pS
ad30: 65 6c 65 63 74 20 29 3b 0a 0a 20 20 69 44 62 20  elect );..  iDb 
ad40: 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54  = sqlite3SchemaT
ad50: 6f 49 6e 64 65 78 28 64 62 2c 20 70 2d 3e 70 53  oIndex(db, p->pS
ad60: 63 68 65 6d 61 29 3b 0a 0a 23 69 66 6e 64 65 66  chema);..#ifndef
ad70: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 48 45   SQLITE_OMIT_CHE
ad80: 43 4b 0a 20 20 2f 2a 20 52 65 73 6f 6c 76 65 20  CK.  /* Resolve 
ad90: 6e 61 6d 65 73 20 69 6e 20 61 6c 6c 20 43 48 45  names in all CHE
ada0: 43 4b 20 63 6f 6e 73 74 72 61 69 6e 74 20 65 78  CK constraint ex
adb0: 70 72 65 73 73 69 6f 6e 73 2e 0a 20 20 2a 2f 0a  pressions..  */.
adc0: 20 20 69 66 28 20 70 2d 3e 70 43 68 65 63 6b 20    if( p->pCheck 
add0: 29 7b 0a 20 20 20 20 53 72 63 4c 69 73 74 20 73  ){.    SrcList s
ade0: 53 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20  Src;            
adf0: 20 20 20 20 20 20 20 2f 2a 20 46 61 6b 65 20 53         /* Fake S
ae00: 72 63 4c 69 73 74 20 66 6f 72 20 70 50 61 72 73  rcList for pPars
ae10: 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 2a 2f 0a  e->pNewTable */.
ae20: 20 20 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20      NameContext 
ae30: 73 4e 43 3b 20 20 20 20 20 20 20 20 20 20 20 20  sNC;            
ae40: 20 20 20 20 2f 2a 20 4e 61 6d 65 20 63 6f 6e 74      /* Name cont
ae50: 65 78 74 20 66 6f 72 20 70 50 61 72 73 65 2d 3e  ext for pParse->
ae60: 70 4e 65 77 54 61 62 6c 65 20 2a 2f 0a 0a 20 20  pNewTable */..  
ae70: 20 20 6d 65 6d 73 65 74 28 26 73 4e 43 2c 20 30    memset(&sNC, 0
ae80: 2c 20 73 69 7a 65 6f 66 28 73 4e 43 29 29 3b 0a  , sizeof(sNC));.
ae90: 20 20 20 20 6d 65 6d 73 65 74 28 26 73 53 72 63      memset(&sSrc
aea0: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 53 72 63  , 0, sizeof(sSrc
aeb0: 29 29 3b 0a 20 20 20 20 73 53 72 63 2e 6e 53 72  ));.    sSrc.nSr
aec0: 63 20 3d 20 31 3b 0a 20 20 20 20 73 53 72 63 2e  c = 1;.    sSrc.
aed0: 61 5b 30 5d 2e 7a 4e 61 6d 65 20 3d 20 70 2d 3e  a[0].zName = p->
aee0: 7a 4e 61 6d 65 3b 0a 20 20 20 20 73 53 72 63 2e  zName;.    sSrc.
aef0: 61 5b 30 5d 2e 70 54 61 62 20 3d 20 70 3b 0a 20  a[0].pTab = p;. 
af00: 20 20 20 73 53 72 63 2e 61 5b 30 5d 2e 69 43 75     sSrc.a[0].iCu
af10: 72 73 6f 72 20 3d 20 2d 31 3b 0a 20 20 20 20 73  rsor = -1;.    s
af20: 4e 43 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72  NC.pParse = pPar
af30: 73 65 3b 0a 20 20 20 20 73 4e 43 2e 70 53 72 63  se;.    sNC.pSrc
af40: 4c 69 73 74 20 3d 20 26 73 53 72 63 3b 0a 20 20  List = &sSrc;.  
af50: 20 20 73 4e 43 2e 69 73 43 68 65 63 6b 20 3d 20    sNC.isCheck = 
af60: 31 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  1;.    if( sqlit
af70: 65 33 45 78 70 72 52 65 73 6f 6c 76 65 4e 61 6d  e3ExprResolveNam
af80: 65 73 28 26 73 4e 43 2c 20 70 2d 3e 70 43 68 65  es(&sNC, p->pChe
af90: 63 6b 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74  ck) ){.      ret
afa0: 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  urn;.    }.  }.#
afb0: 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65  endif /* !define
afc0: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 48  d(SQLITE_OMIT_CH
afd0: 45 43 4b 29 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66  ECK) */..  /* If
afe0: 20 74 68 65 20 64 62 2d 3e 69 6e 69 74 2e 62 75   the db->init.bu
aff0: 73 79 20 69 73 20 31 20 69 74 20 6d 65 61 6e 73  sy is 1 it means
b000: 20 77 65 20 61 72 65 20 72 65 61 64 69 6e 67 20   we are reading 
b010: 74 68 65 20 53 51 4c 20 6f 66 66 20 74 68 65 0a  the SQL off the.
b020: 20 20 2a 2a 20 22 73 71 6c 69 74 65 5f 6d 61 73    ** "sqlite_mas
b030: 74 65 72 22 20 6f 72 20 22 73 71 6c 69 74 65 5f  ter" or "sqlite_
b040: 74 65 6d 70 5f 6d 61 73 74 65 72 22 20 74 61 62  temp_master" tab
b050: 6c 65 20 6f 6e 20 74 68 65 20 64 69 73 6b 2e 0a  le on the disk..
b060: 20 20 2a 2a 20 53 6f 20 64 6f 20 6e 6f 74 20 77    ** So do not w
b070: 72 69 74 65 20 74 6f 20 74 68 65 20 64 69 73 6b  rite to the disk
b080: 20 61 67 61 69 6e 2e 20 20 45 78 74 72 61 63 74   again.  Extract
b090: 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6e   the root page n
b0a0: 75 6d 62 65 72 0a 20 20 2a 2a 20 66 6f 72 20 74  umber.  ** for t
b0b0: 68 65 20 74 61 62 6c 65 20 66 72 6f 6d 20 74 68  he table from th
b0c0: 65 20 64 62 2d 3e 69 6e 69 74 2e 6e 65 77 54 6e  e db->init.newTn
b0d0: 75 6d 20 66 69 65 6c 64 2e 20 20 28 54 68 65 20  um field.  (The 
b0e0: 70 61 67 65 20 6e 75 6d 62 65 72 0a 20 20 2a 2a  page number.  **
b0f0: 20 73 68 6f 75 6c 64 20 68 61 76 65 20 62 65 65   should have bee
b100: 6e 20 70 75 74 20 74 68 65 72 65 20 62 79 20 74  n put there by t
b110: 68 65 20 73 71 6c 69 74 65 4f 70 65 6e 43 62 20  he sqliteOpenCb 
b120: 72 6f 75 74 69 6e 65 2e 29 0a 20 20 2a 2f 0a 20  routine.).  */. 
b130: 20 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75   if( db->init.bu
b140: 73 79 20 29 7b 0a 20 20 20 20 70 2d 3e 74 6e 75  sy ){.    p->tnu
b150: 6d 20 3d 20 64 62 2d 3e 69 6e 69 74 2e 6e 65 77  m = db->init.new
b160: 54 6e 75 6d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  Tnum;.  }..  /* 
b170: 49 66 20 6e 6f 74 20 69 6e 69 74 69 61 6c 69 7a  If not initializ
b180: 69 6e 67 2c 20 74 68 65 6e 20 63 72 65 61 74 65  ing, then create
b190: 20 61 20 72 65 63 6f 72 64 20 66 6f 72 20 74 68   a record for th
b1a0: 65 20 6e 65 77 20 74 61 62 6c 65 0a 20 20 2a 2a  e new table.  **
b1b0: 20 69 6e 20 74 68 65 20 53 51 4c 49 54 45 5f 4d   in the SQLITE_M
b1c0: 41 53 54 45 52 20 74 61 62 6c 65 20 6f 66 20 74  ASTER table of t
b1d0: 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 54 68  he database.  Th
b1e0: 65 20 72 65 63 6f 72 64 20 6e 75 6d 62 65 72 0a  e record number.
b1f0: 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 6e 65 77    ** for the new
b200: 20 74 61 62 6c 65 20 65 6e 74 72 79 20 73 68 6f   table entry sho
b210: 75 6c 64 20 61 6c 72 65 61 64 79 20 62 65 20 6f  uld already be o
b220: 6e 20 74 68 65 20 73 74 61 63 6b 2e 0a 20 20 2a  n the stack..  *
b230: 2a 0a 20 20 2a 2a 20 49 66 20 74 68 69 73 20 69  *.  ** If this i
b240: 73 20 61 20 54 45 4d 50 4f 52 41 52 59 20 74 61  s a TEMPORARY ta
b250: 62 6c 65 2c 20 77 72 69 74 65 20 74 68 65 20 65  ble, write the e
b260: 6e 74 72 79 20 69 6e 74 6f 20 74 68 65 20 61 75  ntry into the au
b270: 78 69 6c 69 61 72 79 0a 20 20 2a 2a 20 66 69 6c  xiliary.  ** fil
b280: 65 20 69 6e 73 74 65 61 64 20 6f 66 20 69 6e 74  e instead of int
b290: 6f 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62  o the main datab
b2a0: 61 73 65 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20  ase file..  */. 
b2b0: 20 69 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62   if( !db->init.b
b2c0: 75 73 79 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e  usy ){.    int n
b2d0: 3b 0a 20 20 20 20 56 64 62 65 20 2a 76 3b 0a 20  ;.    Vdbe *v;. 
b2e0: 20 20 20 63 68 61 72 20 2a 7a 54 79 70 65 3b 20     char *zType; 
b2f0: 20 20 20 2f 2a 20 22 76 69 65 77 22 20 6f 72 20     /* "view" or 
b300: 22 74 61 62 6c 65 22 20 2a 2f 0a 20 20 20 20 63  "table" */.    c
b310: 68 61 72 20 2a 7a 54 79 70 65 32 3b 20 20 20 2f  har *zType2;   /
b320: 2a 20 22 56 49 45 57 22 20 6f 72 20 22 54 41 42  * "VIEW" or "TAB
b330: 4c 45 22 20 2a 2f 0a 20 20 20 20 63 68 61 72 20  LE" */.    char 
b340: 2a 7a 53 74 6d 74 3b 20 20 20 20 2f 2a 20 54 65  *zStmt;    /* Te
b350: 78 74 20 6f 66 20 74 68 65 20 43 52 45 41 54 45  xt of the CREATE
b360: 20 54 41 42 4c 45 20 6f 72 20 43 52 45 41 54 45   TABLE or CREATE
b370: 20 56 49 45 57 20 73 74 61 74 65 6d 65 6e 74 20   VIEW statement 
b380: 2a 2f 0a 0a 20 20 20 20 76 20 3d 20 73 71 6c 69  */..    v = sqli
b390: 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
b3a0: 65 29 3b 0a 20 20 20 20 69 66 28 20 76 3d 3d 30  e);.    if( v==0
b3b0: 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 20 20   ) return;..    
b3c0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
b3d0: 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 30 2c  (v, OP_Close, 0,
b3e0: 20 30 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 72 65   0);..    /* Cre
b3f0: 61 74 65 20 74 68 65 20 72 6f 6f 74 70 61 67 65  ate the rootpage
b400: 20 66 6f 72 20 74 68 65 20 6e 65 77 20 74 61 62   for the new tab
b410: 6c 65 20 61 6e 64 20 70 75 73 68 20 69 74 20 6f  le and push it o
b420: 6e 74 6f 20 74 68 65 20 73 74 61 63 6b 2e 0a 20  nto the stack.. 
b430: 20 20 20 2a 2a 20 41 20 76 69 65 77 20 68 61 73     ** A view has
b440: 20 6e 6f 20 72 6f 6f 74 70 61 67 65 2c 20 73 6f   no rootpage, so
b450: 20 6a 75 73 74 20 70 75 73 68 20 61 20 7a 65 72   just push a zer
b460: 6f 20 6f 6e 74 6f 20 74 68 65 20 73 74 61 63 6b  o onto the stack
b470: 20 66 6f 72 0a 20 20 20 20 2a 2a 20 76 69 65 77   for.    ** view
b480: 73 2e 20 20 49 6e 69 74 69 61 6c 69 7a 65 20 7a  s.  Initialize z
b490: 54 79 70 65 20 61 74 20 74 68 65 20 73 61 6d 65  Type at the same
b4a0: 20 74 69 6d 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   time..    */.  
b4b0: 20 20 69 66 28 20 70 2d 3e 70 53 65 6c 65 63 74    if( p->pSelect
b4c0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ==0 ){.      /* 
b4d0: 41 20 72 65 67 75 6c 61 72 20 74 61 62 6c 65 20  A regular table 
b4e0: 2a 2f 0a 20 20 20 20 20 20 7a 54 79 70 65 20 3d  */.      zType =
b4f0: 20 22 74 61 62 6c 65 22 3b 0a 20 20 20 20 20 20   "table";.      
b500: 7a 54 79 70 65 32 20 3d 20 22 54 41 42 4c 45 22  zType2 = "TABLE"
b510: 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
b520: 5f 4f 4d 49 54 5f 56 49 45 57 0a 20 20 20 20 7d  _OMIT_VIEW.    }
b530: 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 41  else{.      /* A
b540: 20 76 69 65 77 20 2a 2f 0a 20 20 20 20 20 20 7a   view */.      z
b550: 54 79 70 65 20 3d 20 22 76 69 65 77 22 3b 0a 20  Type = "view";. 
b560: 20 20 20 20 20 7a 54 79 70 65 32 20 3d 20 22 56       zType2 = "V
b570: 49 45 57 22 3b 0a 23 65 6e 64 69 66 0a 20 20 20  IEW";.#endif.   
b580: 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   }..    /* If th
b590: 69 73 20 69 73 20 61 20 43 52 45 41 54 45 20 54  is is a CREATE T
b5a0: 41 42 4c 45 20 78 78 20 41 53 20 53 45 4c 45 43  ABLE xx AS SELEC
b5b0: 54 20 2e 2e 2e 2c 20 65 78 65 63 75 74 65 20 74  T ..., execute t
b5c0: 68 65 20 53 45 4c 45 43 54 0a 20 20 20 20 2a 2a  he SELECT.    **
b5d0: 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 70 6f   statement to po
b5e0: 70 75 6c 61 74 65 20 74 68 65 20 6e 65 77 20 74  pulate the new t
b5f0: 61 62 6c 65 2e 20 54 68 65 20 72 6f 6f 74 2d 70  able. The root-p
b600: 61 67 65 20 6e 75 6d 62 65 72 20 66 6f 72 20 74  age number for t
b610: 68 65 0a 20 20 20 20 2a 2a 20 6e 65 77 20 74 61  he.    ** new ta
b620: 62 6c 65 20 69 73 20 6f 6e 20 74 68 65 20 74 6f  ble is on the to
b630: 70 20 6f 66 20 74 68 65 20 76 64 62 65 20 73 74  p of the vdbe st
b640: 61 63 6b 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ack..    **.    
b650: 2a 2a 20 4f 6e 63 65 20 74 68 65 20 53 45 4c 45  ** Once the SELE
b660: 43 54 20 68 61 73 20 62 65 65 6e 20 63 6f 64 65  CT has been code
b670: 64 20 62 79 20 73 71 6c 69 74 65 33 53 65 6c 65  d by sqlite3Sele
b680: 63 74 28 29 2c 20 69 74 20 69 73 20 69 6e 20 61  ct(), it is in a
b690: 0a 20 20 20 20 2a 2a 20 73 75 69 74 61 62 6c 65  .    ** suitable
b6a0: 20 73 74 61 74 65 20 74 6f 20 71 75 65 72 79 20   state to query 
b6b0: 66 6f 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e  for the column n
b6c0: 61 6d 65 73 20 61 6e 64 20 74 79 70 65 73 20 74  ames and types t
b6d0: 6f 20 62 65 20 75 73 65 64 0a 20 20 20 20 2a 2a  o be used.    **
b6e0: 20 62 79 20 74 68 65 20 6e 65 77 20 74 61 62 6c   by the new tabl
b6f0: 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  e..    **.    **
b700: 20 41 20 73 68 61 72 65 64 2d 63 61 63 68 65 20   A shared-cache 
b710: 77 72 69 74 65 2d 6c 6f 63 6b 20 69 73 20 6e 6f  write-lock is no
b720: 74 20 72 65 71 75 69 72 65 64 20 74 6f 20 77 72  t required to wr
b730: 69 74 65 20 74 6f 20 74 68 65 20 6e 65 77 20 74  ite to the new t
b740: 61 62 6c 65 2c 0a 20 20 20 20 2a 2a 20 61 73 20  able,.    ** as 
b750: 61 20 73 63 68 65 6d 61 2d 6c 6f 63 6b 20 6d 75  a schema-lock mu
b760: 73 74 20 68 61 76 65 20 61 6c 72 65 61 64 79 20  st have already 
b770: 62 65 65 6e 20 6f 62 74 61 69 6e 65 64 20 74 6f  been obtained to
b780: 20 63 72 65 61 74 65 20 69 74 2e 20 53 69 6e 63   create it. Sinc
b790: 65 0a 20 20 20 20 2a 2a 20 61 20 73 63 68 65 6d  e.    ** a schem
b7a0: 61 2d 6c 6f 63 6b 20 65 78 63 6c 75 64 65 73 20  a-lock excludes 
b7b0: 61 6c 6c 20 6f 74 68 65 72 20 64 61 74 61 62 61  all other databa
b7c0: 73 65 20 75 73 65 72 73 2c 20 74 68 65 20 77 72  se users, the wr
b7d0: 69 74 65 2d 6c 6f 63 6b 20 77 6f 75 6c 64 0a 20  ite-lock would. 
b7e0: 20 20 20 2a 2a 20 62 65 20 72 65 64 75 6e 64 61     ** be redunda
b7f0: 6e 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  nt..    */.    i
b800: 66 28 20 70 53 65 6c 65 63 74 20 29 7b 0a 20 20  f( pSelect ){.  
b810: 20 20 20 20 54 61 62 6c 65 20 2a 70 53 65 6c 54      Table *pSelT
b820: 61 62 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ab;.      sqlite
b830: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
b840: 5f 44 75 70 2c 20 30 2c 20 30 29 3b 0a 20 20 20  _Dup, 0, 0);.   
b850: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
b860: 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  dOp(v, OP_Intege
b870: 72 2c 20 69 44 62 2c 20 30 29 3b 0a 20 20 20 20  r, iDb, 0);.    
b880: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
b890: 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 57 72 69  Op(v, OP_OpenWri
b8a0: 74 65 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20  te, 1, 0);.     
b8b0: 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 20 3d 20   pParse->nTab = 
b8c0: 32 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  2;.      sqlite3
b8d0: 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  Select(pParse, p
b8e0: 53 65 6c 65 63 74 2c 20 53 52 54 5f 54 61 62 6c  Select, SRT_Tabl
b8f0: 65 2c 20 31 2c 20 30 2c 20 30 2c 20 30 2c 20 30  e, 1, 0, 0, 0, 0
b900: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
b910: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
b920: 43 6c 6f 73 65 2c 20 31 2c 20 30 29 3b 0a 20 20  Close, 1, 0);.  
b930: 20 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e      if( pParse->
b940: 6e 45 72 72 3d 3d 30 20 29 7b 0a 20 20 20 20 20  nErr==0 ){.     
b950: 20 20 20 70 53 65 6c 54 61 62 20 3d 20 73 71 6c     pSelTab = sql
b960: 69 74 65 33 52 65 73 75 6c 74 53 65 74 4f 66 53  ite3ResultSetOfS
b970: 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 30 2c  elect(pParse, 0,
b980: 20 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 20   pSelect);.     
b990: 20 20 20 69 66 28 20 70 53 65 6c 54 61 62 3d 3d     if( pSelTab==
b9a0: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20  0 ) return;.    
b9b0: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61      assert( p->a
b9c0: 43 6f 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  Col==0 );.      
b9d0: 20 20 70 2d 3e 6e 43 6f 6c 20 3d 20 70 53 65 6c    p->nCol = pSel
b9e0: 54 61 62 2d 3e 6e 43 6f 6c 3b 0a 20 20 20 20 20  Tab->nCol;.     
b9f0: 20 20 20 70 2d 3e 61 43 6f 6c 20 3d 20 70 53 65     p->aCol = pSe
ba00: 6c 54 61 62 2d 3e 61 43 6f 6c 3b 0a 20 20 20 20  lTab->aCol;.    
ba10: 20 20 20 20 70 53 65 6c 54 61 62 2d 3e 6e 43 6f      pSelTab->nCo
ba20: 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70  l = 0;.        p
ba30: 53 65 6c 54 61 62 2d 3e 61 43 6f 6c 20 3d 20 30  SelTab->aCol = 0
ba40: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
ba50: 33 44 65 6c 65 74 65 54 61 62 6c 65 28 30 2c 20  3DeleteTable(0, 
ba60: 70 53 65 6c 54 61 62 29 3b 0a 20 20 20 20 20 20  pSelTab);.      
ba70: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
ba80: 43 6f 6d 70 75 74 65 20 74 68 65 20 63 6f 6d 70  Compute the comp
ba90: 6c 65 74 65 20 74 65 78 74 20 6f 66 20 74 68 65  lete text of the
baa0: 20 43 52 45 41 54 45 20 73 74 61 74 65 6d 65 6e   CREATE statemen
bab0: 74 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 53 65  t */.    if( pSe
bac0: 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 7a 53  lect ){.      zS
bad0: 74 6d 74 20 3d 20 63 72 65 61 74 65 54 61 62 6c  tmt = createTabl
bae0: 65 53 74 6d 74 28 70 2c 20 70 2d 3e 70 53 63 68  eStmt(p, p->pSch
baf0: 65 6d 61 3d 3d 70 50 61 72 73 65 2d 3e 64 62 2d  ema==pParse->db-
bb00: 3e 61 44 62 5b 31 5d 2e 70 53 63 68 65 6d 61 29  >aDb[1].pSchema)
bb10: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
bb20: 20 20 20 6e 20 3d 20 70 45 6e 64 2d 3e 7a 20 2d     n = pEnd->z -
bb30: 20 70 50 61 72 73 65 2d 3e 73 4e 61 6d 65 54 6f   pParse->sNameTo
bb40: 6b 65 6e 2e 7a 20 2b 20 31 3b 0a 20 20 20 20 20  ken.z + 1;.     
bb50: 20 7a 53 74 6d 74 20 3d 20 73 71 6c 69 74 65 33   zStmt = sqlite3
bb60: 4d 50 72 69 6e 74 66 28 22 43 52 45 41 54 45 20  MPrintf("CREATE 
bb70: 25 73 20 25 2e 2a 73 22 2c 20 7a 54 79 70 65 32  %s %.*s", zType2
bb80: 2c 20 6e 2c 20 70 50 61 72 73 65 2d 3e 73 4e 61  , n, pParse->sNa
bb90: 6d 65 54 6f 6b 65 6e 2e 7a 29 3b 0a 20 20 20 20  meToken.z);.    
bba0: 7d 0a 0a 20 20 20 20 2f 2a 20 41 20 73 6c 6f 74  }..    /* A slot
bbb0: 20 66 6f 72 20 74 68 65 20 72 65 63 6f 72 64 20   for the record 
bbc0: 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
bbd0: 20 61 6c 6c 6f 63 61 74 65 64 20 69 6e 20 74 68   allocated in th
bbe0: 65 20 0a 20 20 20 20 2a 2a 20 53 51 4c 49 54 45  e .    ** SQLITE
bbf0: 5f 4d 41 53 54 45 52 20 74 61 62 6c 65 2e 20 20  _MASTER table.  
bc00: 57 65 20 6a 75 73 74 20 6e 65 65 64 20 74 6f 20  We just need to 
bc10: 75 70 64 61 74 65 20 74 68 61 74 20 73 6c 6f 74  update that slot
bc20: 20 77 69 74 68 20 61 6c 6c 0a 20 20 20 20 2a 2a   with all.    **
bc30: 20 74 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e   the information
bc40: 20 77 65 27 76 65 20 63 6f 6c 6c 65 63 74 65 64   we've collected
bc50: 2e 20 20 54 68 65 20 72 6f 77 69 64 20 66 6f 72  .  The rowid for
bc60: 20 74 68 65 20 70 72 65 61 6c 6c 6f 63 61 74 65   the preallocate
bc70: 64 0a 20 20 20 20 2a 2a 20 73 6c 6f 74 20 69 73  d.    ** slot is
bc80: 20 74 68 65 20 32 6e 64 20 69 74 65 6d 20 6f 6e   the 2nd item on
bc90: 20 74 68 65 20 73 74 61 63 6b 2e 20 20 54 68 65   the stack.  The
bca0: 20 74 6f 70 20 6f 66 20 74 68 65 20 73 74 61 63   top of the stac
bcb0: 6b 20 69 73 20 74 68 65 0a 20 20 20 20 2a 2a 20  k is the.    ** 
bcc0: 72 6f 6f 74 20 70 61 67 65 20 66 6f 72 20 74 68  root page for th
bcd0: 65 20 6e 65 77 20 74 61 62 6c 65 20 28 6f 72 20  e new table (or 
bce0: 61 20 30 20 69 66 20 74 68 69 73 20 69 73 20 61  a 0 if this is a
bcf0: 20 76 69 65 77 29 2e 0a 20 20 20 20 2a 2f 0a 20   view)..    */. 
bd00: 20 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64     sqlite3Nested
bd10: 50 61 72 73 65 28 70 50 61 72 73 65 2c 0a 20 20  Parse(pParse,.  
bd20: 20 20 20 20 22 55 50 44 41 54 45 20 25 51 2e 25      "UPDATE %Q.%
bd30: 73 20 22 0a 20 20 20 20 20 20 20 20 20 22 53 45  s ".         "SE
bd40: 54 20 74 79 70 65 3d 27 25 73 27 2c 20 6e 61 6d  T type='%s', nam
bd50: 65 3d 25 51 2c 20 74 62 6c 5f 6e 61 6d 65 3d 25  e=%Q, tbl_name=%
bd60: 51 2c 20 72 6f 6f 74 70 61 67 65 3d 23 30 2c 20  Q, rootpage=#0, 
bd70: 73 71 6c 3d 25 51 20 22 0a 20 20 20 20 20 20 20  sql=%Q ".       
bd80: 22 57 48 45 52 45 20 72 6f 77 69 64 3d 23 31 22  "WHERE rowid=#1"
bd90: 2c 0a 20 20 20 20 20 20 64 62 2d 3e 61 44 62 5b  ,.      db->aDb[
bda0: 69 44 62 5d 2e 7a 4e 61 6d 65 2c 20 53 43 48 45  iDb].zName, SCHE
bdb0: 4d 41 5f 54 41 42 4c 45 28 69 44 62 29 2c 0a 20  MA_TABLE(iDb),. 
bdc0: 20 20 20 20 20 7a 54 79 70 65 2c 0a 20 20 20 20       zType,.    
bdd0: 20 20 70 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20    p->zName,.    
bde0: 20 20 70 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20    p->zName,.    
bdf0: 20 20 7a 53 74 6d 74 0a 20 20 20 20 29 3b 0a 20    zStmt.    );. 
be00: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 53     sqliteFree(zS
be10: 74 6d 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  tmt);.    sqlite
be20: 33 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28 64 62  3ChangeCookie(db
be30: 2c 20 76 2c 20 69 44 62 29 3b 0a 0a 23 69 66 6e  , v, iDb);..#ifn
be40: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
be50: 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 0a 20 20  AUTOINCREMENT.  
be60: 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65    /* Check to se
be70: 65 20 69 66 20 77 65 20 6e 65 65 64 20 74 6f 20  e if we need to 
be80: 63 72 65 61 74 65 20 61 6e 20 73 71 6c 69 74 65  create an sqlite
be90: 5f 73 65 71 75 65 6e 63 65 20 74 61 62 6c 65 20  _sequence table 
bea0: 66 6f 72 0a 20 20 20 20 2a 2a 20 6b 65 65 70 69  for.    ** keepi
beb0: 6e 67 20 74 72 61 63 6b 20 6f 66 20 61 75 74 6f  ng track of auto
bec0: 69 6e 63 72 65 6d 65 6e 74 20 6b 65 79 73 2e 0a  increment keys..
bed0: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
bee0: 2d 3e 61 75 74 6f 49 6e 63 20 29 7b 0a 20 20 20  ->autoInc ){.   
bef0: 20 20 20 44 62 20 2a 70 44 62 20 3d 20 26 64 62     Db *pDb = &db
bf00: 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a 20 20 20 20  ->aDb[iDb];.    
bf10: 20 20 69 66 28 20 70 44 62 2d 3e 70 53 63 68 65    if( pDb->pSche
bf20: 6d 61 2d 3e 70 53 65 71 54 61 62 3d 3d 30 20 29  ma->pSeqTab==0 )
bf30: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
bf40: 33 4e 65 73 74 65 64 50 61 72 73 65 28 70 50 61  3NestedParse(pPa
bf50: 72 73 65 2c 0a 20 20 20 20 20 20 20 20 20 20 22  rse,.          "
bf60: 43 52 45 41 54 45 20 54 41 42 4c 45 20 25 51 2e  CREATE TABLE %Q.
bf70: 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 28  sqlite_sequence(
bf80: 6e 61 6d 65 2c 73 65 71 29 22 2c 0a 20 20 20 20  name,seq)",.    
bf90: 20 20 20 20 20 20 70 44 62 2d 3e 7a 4e 61 6d 65        pDb->zName
bfa0: 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20  .        );.    
bfb0: 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66    }.    }.#endif
bfc0: 0a 0a 20 20 20 20 2f 2a 20 52 65 70 61 72 73 65  ..    /* Reparse
bfd0: 20 65 76 65 72 79 74 68 69 6e 67 20 74 6f 20 75   everything to u
bfe0: 70 64 61 74 65 20 6f 75 72 20 69 6e 74 65 72 6e  pdate our intern
bff0: 61 6c 20 64 61 74 61 20 73 74 72 75 63 74 75 72  al data structur
c000: 65 73 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65  es */.    sqlite
c010: 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 50  3VdbeOp3(v, OP_P
c020: 61 72 73 65 53 63 68 65 6d 61 2c 20 69 44 62 2c  arseSchema, iDb,
c030: 20 30 2c 0a 20 20 20 20 20 20 20 20 73 71 6c 69   0,.        sqli
c040: 74 65 33 4d 50 72 69 6e 74 66 28 22 74 62 6c 5f  te3MPrintf("tbl_
c050: 6e 61 6d 65 3d 27 25 71 27 22 2c 70 2d 3e 7a 4e  name='%q'",p->zN
c060: 61 6d 65 29 2c 20 50 33 5f 44 59 4e 41 4d 49 43  ame), P3_DYNAMIC
c070: 29 3b 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20 41 64  );.  }...  /* Ad
c080: 64 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20 74  d the table to t
c090: 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 72 65 70  he in-memory rep
c0a0: 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74  resentation of t
c0b0: 68 65 20 64 61 74 61 62 61 73 65 2e 0a 20 20 2a  he database..  *
c0c0: 2f 0a 20 20 69 66 28 20 64 62 2d 3e 69 6e 69 74  /.  if( db->init
c0d0: 2e 62 75 73 79 20 26 26 20 70 50 61 72 73 65 2d  .busy && pParse-
c0e0: 3e 6e 45 72 72 3d 3d 30 20 29 7b 0a 20 20 20 20  >nErr==0 ){.    
c0f0: 54 61 62 6c 65 20 2a 70 4f 6c 64 3b 0a 20 20 20  Table *pOld;.   
c100: 20 46 4b 65 79 20 2a 70 46 4b 65 79 3b 20 0a 20   FKey *pFKey; . 
c110: 20 20 20 53 63 68 65 6d 61 20 2a 70 53 63 68 65     Schema *pSche
c120: 6d 61 20 3d 20 70 2d 3e 70 53 63 68 65 6d 61 3b  ma = p->pSchema;
c130: 0a 20 20 20 20 70 4f 6c 64 20 3d 20 73 71 6c 69  .    pOld = sqli
c140: 74 65 33 48 61 73 68 49 6e 73 65 72 74 28 26 70  te3HashInsert(&p
c150: 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68 2c  Schema->tblHash,
c160: 20 70 2d 3e 7a 4e 61 6d 65 2c 20 73 74 72 6c 65   p->zName, strle
c170: 6e 28 70 2d 3e 7a 4e 61 6d 65 29 2b 31 2c 70 29  n(p->zName)+1,p)
c180: 3b 0a 20 20 20 20 69 66 28 20 70 4f 6c 64 20 29  ;.    if( pOld )
c190: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
c1a0: 70 3d 3d 70 4f 6c 64 20 29 3b 20 20 2f 2a 20 4d  p==pOld );  /* M
c1b0: 61 6c 6c 6f 63 20 6d 75 73 74 20 68 61 76 65 20  alloc must have 
c1c0: 66 61 69 6c 65 64 20 69 6e 73 69 64 65 20 48 61  failed inside Ha
c1d0: 73 68 49 6e 73 65 72 74 28 29 20 2a 2f 0a 20 20  shInsert() */.  
c1e0: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
c1f0: 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
c200: 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45  _OMIT_FOREIGN_KE
c210: 59 0a 20 20 20 20 66 6f 72 28 70 46 4b 65 79 3d  Y.    for(pFKey=
c220: 70 2d 3e 70 46 4b 65 79 3b 20 70 46 4b 65 79 3b  p->pFKey; pFKey;
c230: 20 70 46 4b 65 79 3d 70 46 4b 65 79 2d 3e 70 4e   pFKey=pFKey->pN
c240: 65 78 74 46 72 6f 6d 29 7b 0a 20 20 20 20 20 20  extFrom){.      
c250: 69 6e 74 20 6e 54 6f 20 3d 20 73 74 72 6c 65 6e  int nTo = strlen
c260: 28 70 46 4b 65 79 2d 3e 7a 54 6f 29 20 2b 20 31  (pFKey->zTo) + 1
c270: 3b 0a 20 20 20 20 20 20 70 46 4b 65 79 2d 3e 70  ;.      pFKey->p
c280: 4e 65 78 74 54 6f 20 3d 20 73 71 6c 69 74 65 33  NextTo = sqlite3
c290: 48 61 73 68 46 69 6e 64 28 26 70 53 63 68 65 6d  HashFind(&pSchem
c2a0: 61 2d 3e 61 46 4b 65 79 2c 20 70 46 4b 65 79 2d  a->aFKey, pFKey-
c2b0: 3e 7a 54 6f 2c 20 6e 54 6f 29 3b 0a 20 20 20 20  >zTo, nTo);.    
c2c0: 20 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73    sqlite3HashIns
c2d0: 65 72 74 28 26 70 53 63 68 65 6d 61 2d 3e 61 46  ert(&pSchema->aF
c2e0: 4b 65 79 2c 20 70 46 4b 65 79 2d 3e 7a 54 6f 2c  Key, pFKey->zTo,
c2f0: 20 6e 54 6f 2c 20 70 46 4b 65 79 29 3b 0a 20 20   nTo, pFKey);.  
c300: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 70    }.#endif.    p
c310: 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
c320: 20 3d 20 30 3b 0a 20 20 20 20 64 62 2d 3e 6e 54   = 0;.    db->nT
c330: 61 62 6c 65 2b 2b 3b 0a 20 20 20 20 64 62 2d 3e  able++;.    db->
c340: 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f  flags |= SQLITE_
c350: 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a 0a  InternChanges;..
c360: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
c370: 4d 49 54 5f 41 4c 54 45 52 54 41 42 4c 45 0a 20  MIT_ALTERTABLE. 
c380: 20 20 20 69 66 28 20 21 70 2d 3e 70 53 65 6c 65     if( !p->pSele
c390: 63 74 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73  ct ){.      cons
c3a0: 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20  t char *zName = 
c3b0: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 70 50  (const char *)pP
c3c0: 61 72 73 65 2d 3e 73 4e 61 6d 65 54 6f 6b 65 6e  arse->sNameToken
c3d0: 2e 7a 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4e  .z;.      int nN
c3e0: 61 6d 65 3b 0a 20 20 20 20 20 20 61 73 73 65 72  ame;.      asser
c3f0: 74 28 20 21 70 53 65 6c 65 63 74 20 26 26 20 70  t( !pSelect && p
c400: 43 6f 6e 73 20 26 26 20 70 45 6e 64 20 29 3b 0a  Cons && pEnd );.
c410: 20 20 20 20 20 20 69 66 28 20 70 43 6f 6e 73 2d        if( pCons-
c420: 3e 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  >z==0 ){.       
c430: 20 70 43 6f 6e 73 20 3d 20 70 45 6e 64 3b 0a 20   pCons = pEnd;. 
c440: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6e 4e 61       }.      nNa
c450: 6d 65 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72  me = (const char
c460: 20 2a 29 70 43 6f 6e 73 2d 3e 7a 20 2d 20 7a 4e   *)pCons->z - zN
c470: 61 6d 65 3b 0a 20 20 20 20 20 20 70 2d 3e 61 64  ame;.      p->ad
c480: 64 43 6f 6c 4f 66 66 73 65 74 20 3d 20 31 33 20  dColOffset = 13 
c490: 2b 20 73 71 6c 69 74 65 33 75 74 66 38 43 68 61  + sqlite3utf8Cha
c4a0: 72 4c 65 6e 28 7a 4e 61 6d 65 2c 20 6e 4e 61 6d  rLen(zName, nNam
c4b0: 65 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  e);.    }.#endif
c4c0: 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20  .  }.}..#ifndef 
c4d0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57  SQLITE_OMIT_VIEW
c4e0: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 61 72 73 65  ./*.** The parse
c4f0: 72 20 63 61 6c 6c 73 20 74 68 69 73 20 72 6f 75  r calls this rou
c500: 74 69 6e 65 20 69 6e 20 6f 72 64 65 72 20 74 6f  tine in order to
c510: 20 63 72 65 61 74 65 20 61 20 6e 65 77 20 56 49   create a new VI
c520: 45 57 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  EW.*/.void sqlit
c530: 65 33 43 72 65 61 74 65 56 69 65 77 28 0a 20 20  e3CreateView(.  
c540: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
c550: 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e     /* The parsin
c560: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54  g context */.  T
c570: 6f 6b 65 6e 20 2a 70 42 65 67 69 6e 2c 20 20 20  oken *pBegin,   
c580: 20 20 2f 2a 20 54 68 65 20 43 52 45 41 54 45 20    /* The CREATE 
c590: 74 6f 6b 65 6e 20 74 68 61 74 20 62 65 67 69 6e  token that begin
c5a0: 73 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  s the statement 
c5b0: 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d  */.  Token *pNam
c5c0: 65 31 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 74  e1,     /* The t
c5d0: 6f 6b 65 6e 20 74 68 61 74 20 68 6f 6c 64 73 20  oken that holds 
c5e0: 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
c5f0: 76 69 65 77 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  view */.  Token 
c600: 2a 70 4e 61 6d 65 32 2c 20 20 20 20 20 2f 2a 20  *pName2,     /* 
c610: 54 68 65 20 74 6f 6b 65 6e 20 74 68 61 74 20 68  The token that h
c620: 6f 6c 64 73 20 74 68 65 20 6e 61 6d 65 20 6f 66  olds the name of
c630: 20 74 68 65 20 76 69 65 77 20 2a 2f 0a 20 20 53   the view */.  S
c640: 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 2c 20  elect *pSelect, 
c650: 20 20 2f 2a 20 41 20 53 45 4c 45 43 54 20 73 74    /* A SELECT st
c660: 61 74 65 6d 65 6e 74 20 74 68 61 74 20 77 69 6c  atement that wil
c670: 6c 20 62 65 63 6f 6d 65 20 74 68 65 20 6e 65 77  l become the new
c680: 20 76 69 65 77 20 2a 2f 0a 20 20 69 6e 74 20 69   view */.  int i
c690: 73 54 65 6d 70 2c 20 20 20 20 20 20 20 20 2f 2a  sTemp,        /*
c6a0: 20 54 52 55 45 20 66 6f 72 20 61 20 54 45 4d 50   TRUE for a TEMP
c6b0: 4f 52 41 52 59 20 76 69 65 77 20 2a 2f 0a 20 20  ORARY view */.  
c6c0: 69 6e 74 20 6e 6f 45 72 72 20 20 20 20 20 20 20  int noErr       
c6d0: 20 20 20 2f 2a 20 53 75 70 70 72 65 73 73 20 65     /* Suppress e
c6e0: 72 72 6f 72 20 6d 65 73 73 61 67 65 73 20 69 66  rror messages if
c6f0: 20 56 49 45 57 20 61 6c 72 65 61 64 79 20 65 78   VIEW already ex
c700: 69 73 74 73 20 2a 2f 0a 29 7b 0a 20 20 54 61 62  ists */.){.  Tab
c710: 6c 65 20 2a 70 3b 0a 20 20 69 6e 74 20 6e 3b 0a  le *p;.  int n;.
c720: 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64    const unsigned
c730: 20 63 68 61 72 20 2a 7a 3b 0a 20 20 54 6f 6b 65   char *z;.  Toke
c740: 6e 20 73 45 6e 64 3b 0a 20 20 44 62 46 69 78 65  n sEnd;.  DbFixe
c750: 72 20 73 46 69 78 3b 0a 20 20 54 6f 6b 65 6e 20  r sFix;.  Token 
c760: 2a 70 4e 61 6d 65 3b 0a 20 20 69 6e 74 20 69 44  *pName;.  int iD
c770: 62 3b 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65  b;..  if( pParse
c780: 2d 3e 6e 56 61 72 3e 30 20 29 7b 0a 20 20 20 20  ->nVar>0 ){.    
c790: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
c7a0: 70 50 61 72 73 65 2c 20 22 70 61 72 61 6d 65 74  pParse, "paramet
c7b0: 65 72 73 20 61 72 65 20 6e 6f 74 20 61 6c 6c 6f  ers are not allo
c7c0: 77 65 64 20 69 6e 20 76 69 65 77 73 22 29 3b 0a  wed in views");.
c7d0: 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63      sqlite3Selec
c7e0: 74 44 65 6c 65 74 65 28 70 53 65 6c 65 63 74 29  tDelete(pSelect)
c7f0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
c800: 7d 0a 20 20 73 71 6c 69 74 65 33 53 74 61 72 74  }.  sqlite3Start
c810: 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70 4e  Table(pParse, pN
c820: 61 6d 65 31 2c 20 70 4e 61 6d 65 32 2c 20 69 73  ame1, pName2, is
c830: 54 65 6d 70 2c 20 31 2c 20 30 2c 20 6e 6f 45 72  Temp, 1, 0, noEr
c840: 72 29 3b 0a 20 20 70 20 3d 20 70 50 61 72 73 65  r);.  p = pParse
c850: 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 69  ->pNewTable;.  i
c860: 66 28 20 70 3d 3d 30 20 7c 7c 20 70 50 61 72 73  f( p==0 || pPars
c870: 65 2d 3e 6e 45 72 72 20 29 7b 0a 20 20 20 20 73  e->nErr ){.    s
c880: 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65  qlite3SelectDele
c890: 74 65 28 70 53 65 6c 65 63 74 29 3b 0a 20 20 20  te(pSelect);.   
c8a0: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 73   return;.  }.  s
c8b0: 71 6c 69 74 65 33 54 77 6f 50 61 72 74 4e 61 6d  qlite3TwoPartNam
c8c0: 65 28 70 50 61 72 73 65 2c 20 70 4e 61 6d 65 31  e(pParse, pName1
c8d0: 2c 20 70 4e 61 6d 65 32 2c 20 26 70 4e 61 6d 65  , pName2, &pName
c8e0: 29 3b 0a 20 20 69 44 62 20 3d 20 73 71 6c 69 74  );.  iDb = sqlit
c8f0: 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28  e3SchemaToIndex(
c900: 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 2d 3e 70  pParse->db, p->p
c910: 53 63 68 65 6d 61 29 3b 0a 20 20 69 66 28 20 73  Schema);.  if( s
c920: 71 6c 69 74 65 33 46 69 78 49 6e 69 74 28 26 73  qlite3FixInit(&s
c930: 46 69 78 2c 20 70 50 61 72 73 65 2c 20 69 44 62  Fix, pParse, iDb
c940: 2c 20 22 76 69 65 77 22 2c 20 70 4e 61 6d 65 29  , "view", pName)
c950: 0a 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 46  .    && sqlite3F
c960: 69 78 53 65 6c 65 63 74 28 26 73 46 69 78 2c 20  ixSelect(&sFix, 
c970: 70 53 65 6c 65 63 74 29 0a 20 20 29 7b 0a 20 20  pSelect).  ){.  
c980: 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44    sqlite3SelectD
c990: 65 6c 65 74 65 28 70 53 65 6c 65 63 74 29 3b 0a  elete(pSelect);.
c9a0: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
c9b0: 0a 20 20 2f 2a 20 4d 61 6b 65 20 61 20 63 6f 70  .  /* Make a cop
c9c0: 79 20 6f 66 20 74 68 65 20 65 6e 74 69 72 65 20  y of the entire 
c9d0: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
c9e0: 20 74 68 61 74 20 64 65 66 69 6e 65 73 20 74 68   that defines th
c9f0: 65 20 76 69 65 77 2e 0a 20 20 2a 2a 20 54 68 69  e view..  ** Thi
ca00: 73 20 77 69 6c 6c 20 66 6f 72 63 65 20 61 6c 6c  s will force all
ca10: 20 74 68 65 20 45 78 70 72 2e 74 6f 6b 65 6e 2e   the Expr.token.
ca20: 7a 20 76 61 6c 75 65 73 20 74 6f 20 62 65 20 64  z values to be d
ca30: 79 6e 61 6d 69 63 61 6c 6c 79 0a 20 20 2a 2a 20  ynamically.  ** 
ca40: 61 6c 6c 6f 63 61 74 65 64 20 72 61 74 68 65 72  allocated rather
ca50: 20 74 68 61 6e 20 70 6f 69 6e 74 20 74 6f 20 74   than point to t
ca60: 68 65 20 69 6e 70 75 74 20 73 74 72 69 6e 67 20  he input string 
ca70: 2d 20 77 68 69 63 68 20 6d 65 61 6e 73 20 74 68  - which means th
ca80: 61 74 0a 20 20 2a 2a 20 74 68 65 79 20 77 69 6c  at.  ** they wil
ca90: 6c 20 70 65 72 73 69 73 74 20 61 66 74 65 72 20  l persist after 
caa0: 74 68 65 20 63 75 72 72 65 6e 74 20 73 71 6c 69  the current sqli
cab0: 74 65 33 5f 65 78 65 63 28 29 20 63 61 6c 6c 20  te3_exec() call 
cac0: 72 65 74 75 72 6e 73 2e 0a 20 20 2a 2f 0a 20 20  returns..  */.  
cad0: 70 2d 3e 70 53 65 6c 65 63 74 20 3d 20 73 71 6c  p->pSelect = sql
cae0: 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 70 53  ite3SelectDup(pS
caf0: 65 6c 65 63 74 29 3b 0a 20 20 73 71 6c 69 74 65  elect);.  sqlite
cb00: 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 70 53  3SelectDelete(pS
cb10: 65 6c 65 63 74 29 3b 0a 20 20 69 66 28 20 73 71  elect);.  if( sq
cb20: 6c 69 74 65 33 4d 61 6c 6c 6f 63 46 61 69 6c 65  lite3MallocFaile
cb30: 64 28 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  d() ){.    retur
cb40: 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 70 50  n;.  }.  if( !pP
cb50: 61 72 73 65 2d 3e 64 62 2d 3e 69 6e 69 74 2e 62  arse->db->init.b
cb60: 75 73 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  usy ){.    sqlit
cb70: 65 33 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e  e3ViewGetColumnN
cb80: 61 6d 65 73 28 70 50 61 72 73 65 2c 20 70 29 3b  ames(pParse, p);
cb90: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 63 61 74  .  }..  /* Locat
cba0: 65 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  e the end of the
cbb0: 20 43 52 45 41 54 45 20 56 49 45 57 20 73 74 61   CREATE VIEW sta
cbc0: 74 65 6d 65 6e 74 2e 20 20 4d 61 6b 65 20 73 45  tement.  Make sE
cbd0: 6e 64 20 70 6f 69 6e 74 20 74 6f 0a 20 20 2a 2a  nd point to.  **
cbe0: 20 74 68 65 20 65 6e 64 2e 0a 20 20 2a 2f 0a 20   the end..  */. 
cbf0: 20 73 45 6e 64 20 3d 20 70 50 61 72 73 65 2d 3e   sEnd = pParse->
cc00: 73 4c 61 73 74 54 6f 6b 65 6e 3b 0a 20 20 69 66  sLastToken;.  if
cc10: 28 20 73 45 6e 64 2e 7a 5b 30 5d 21 3d 30 20 26  ( sEnd.z[0]!=0 &
cc20: 26 20 73 45 6e 64 2e 7a 5b 30 5d 21 3d 27 3b 27  & sEnd.z[0]!=';'
cc30: 20 29 7b 0a 20 20 20 20 73 45 6e 64 2e 7a 20 2b   ){.    sEnd.z +
cc40: 3d 20 73 45 6e 64 2e 6e 3b 0a 20 20 7d 0a 20 20  = sEnd.n;.  }.  
cc50: 73 45 6e 64 2e 6e 20 3d 20 30 3b 0a 20 20 6e 20  sEnd.n = 0;.  n 
cc60: 3d 20 73 45 6e 64 2e 7a 20 2d 20 70 42 65 67 69  = sEnd.z - pBegi
cc70: 6e 2d 3e 7a 3b 0a 20 20 7a 20 3d 20 28 63 6f 6e  n->z;.  z = (con
cc80: 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
cc90: 2a 29 70 42 65 67 69 6e 2d 3e 7a 3b 0a 20 20 77  *)pBegin->z;.  w
cca0: 68 69 6c 65 28 20 6e 3e 30 20 26 26 20 28 7a 5b  hile( n>0 && (z[
ccb0: 6e 2d 31 5d 3d 3d 27 3b 27 20 7c 7c 20 69 73 73  n-1]==';' || iss
ccc0: 70 61 63 65 28 7a 5b 6e 2d 31 5d 29 29 20 29 7b  pace(z[n-1])) ){
ccd0: 20 6e 2d 2d 3b 20 7d 0a 20 20 73 45 6e 64 2e 7a   n--; }.  sEnd.z
cce0: 20 3d 20 26 7a 5b 6e 2d 31 5d 3b 0a 20 20 73 45   = &z[n-1];.  sE
ccf0: 6e 64 2e 6e 20 3d 20 31 3b 0a 0a 20 20 2f 2a 20  nd.n = 1;..  /* 
cd00: 55 73 65 20 73 71 6c 69 74 65 33 45 6e 64 54 61  Use sqlite3EndTa
cd10: 62 6c 65 28 29 20 74 6f 20 61 64 64 20 74 68 65  ble() to add the
cd20: 20 76 69 65 77 20 74 6f 20 74 68 65 20 53 51 4c   view to the SQL
cd30: 49 54 45 5f 4d 41 53 54 45 52 20 74 61 62 6c 65  ITE_MASTER table
cd40: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 45 6e 64   */.  sqlite3End
cd50: 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 30 2c  Table(pParse, 0,
cd60: 20 26 73 45 6e 64 2c 20 30 29 3b 0a 20 20 72 65   &sEnd, 0);.  re
cd70: 74 75 72 6e 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  turn;.}.#endif /
cd80: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  * SQLITE_OMIT_VI
cd90: 45 57 20 2a 2f 0a 0a 23 69 66 20 21 64 65 66 69  EW */..#if !defi
cda0: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
cdb0: 56 49 45 57 29 20 7c 7c 20 21 64 65 66 69 6e 65  VIEW) || !define
cdc0: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  d(SQLITE_OMIT_VI
cdd0: 52 54 55 41 4c 54 41 42 4c 45 29 0a 2f 2a 0a 2a  RTUALTABLE)./*.*
cde0: 2a 20 54 68 65 20 54 61 62 6c 65 20 73 74 72 75  * The Table stru
cdf0: 63 74 75 72 65 20 70 54 61 62 6c 65 20 69 73 20  cture pTable is 
ce00: 72 65 61 6c 6c 79 20 61 20 56 49 45 57 2e 20 20  really a VIEW.  
ce10: 46 69 6c 6c 20 69 6e 20 74 68 65 20 6e 61 6d 65  Fill in the name
ce20: 73 20 6f 66 0a 2a 2a 20 74 68 65 20 63 6f 6c 75  s of.** the colu
ce30: 6d 6e 73 20 6f 66 20 74 68 65 20 76 69 65 77 20  mns of the view 
ce40: 69 6e 20 74 68 65 20 70 54 61 62 6c 65 20 73 74  in the pTable st
ce50: 72 75 63 74 75 72 65 2e 20 20 52 65 74 75 72 6e  ructure.  Return
ce60: 20 74 68 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f   the number.** o
ce70: 66 20 65 72 72 6f 72 73 2e 20 20 49 66 20 61 6e  f errors.  If an
ce80: 20 65 72 72 6f 72 20 69 73 20 73 65 65 6e 20 6c   error is seen l
ce90: 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65  eave an error me
cea0: 73 73 61 67 65 20 69 6e 20 70 50 61 72 73 65 2d  ssage in pParse-
ceb0: 3e 7a 45 72 72 4d 73 67 2e 0a 2a 2f 0a 69 6e 74  >zErrMsg..*/.int
cec0: 20 73 71 6c 69 74 65 33 56 69 65 77 47 65 74 43   sqlite3ViewGetC
ced0: 6f 6c 75 6d 6e 4e 61 6d 65 73 28 50 61 72 73 65  olumnNames(Parse
cee0: 20 2a 70 50 61 72 73 65 2c 20 54 61 62 6c 65 20   *pParse, Table 
cef0: 2a 70 54 61 62 6c 65 29 7b 0a 20 20 54 61 62 6c  *pTable){.  Tabl
cf00: 65 20 2a 70 53 65 6c 54 61 62 3b 20 20 20 2f 2a  e *pSelTab;   /*
cf10: 20 41 20 66 61 6b 65 20 74 61 62 6c 65 20 66 72   A fake table fr
cf20: 6f 6d 20 77 68 69 63 68 20 77 65 20 67 65 74 20  om which we get 
cf30: 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 2a  the result set *
cf40: 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c  /.  Select *pSel
cf50: 3b 20 20 20 20 20 2f 2a 20 43 6f 70 79 20 6f 66  ;     /* Copy of
cf60: 20 74 68 65 20 53 45 4c 45 43 54 20 74 68 61 74   the SELECT that
cf70: 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20   implements the 
cf80: 76 69 65 77 20 2a 2f 0a 20 20 69 6e 74 20 6e 45  view */.  int nE
cf90: 72 72 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 4e  rr = 0;     /* N
cfa0: 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73 20  umber of errors 
cfb0: 65 6e 63 6f 75 6e 74 65 72 65 64 20 2a 2f 0a 20  encountered */. 
cfc0: 20 69 6e 74 20 6e 3b 20 20 20 20 20 20 20 20 20   int n;         
cfd0: 20 20 20 2f 2a 20 54 65 6d 70 6f 72 61 72 69 6c     /* Temporaril
cfe0: 79 20 68 6f 6c 64 73 20 74 68 65 20 6e 75 6d 62  y holds the numb
cff0: 65 72 20 6f 66 20 63 75 72 73 6f 72 73 20 61 73  er of cursors as
d000: 73 69 67 6e 65 64 20 2a 2f 0a 0a 20 20 61 73 73  signed */..  ass
d010: 65 72 74 28 20 70 54 61 62 6c 65 20 29 3b 0a 0a  ert( pTable );..
d020: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
d030: 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
d040: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 56 74  .  if( sqlite3Vt
d050: 61 62 43 61 6c 6c 43 6f 6e 6e 65 63 74 28 70 50  abCallConnect(pP
d060: 61 72 73 65 2c 20 70 54 61 62 6c 65 29 20 29 7b  arse, pTable) ){
d070: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
d080: 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  TE_ERROR;.  }.  
d090: 69 66 28 20 49 73 56 69 72 74 75 61 6c 28 70 54  if( IsVirtual(pT
d0a0: 61 62 6c 65 29 20 29 20 72 65 74 75 72 6e 20 30  able) ) return 0
d0b0: 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65  ;.#endif..#ifnde
d0c0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
d0d0: 45 57 0a 20 20 2f 2a 20 41 20 70 6f 73 69 74 69  EW.  /* A positi
d0e0: 76 65 20 6e 43 6f 6c 20 6d 65 61 6e 73 20 74 68  ve nCol means th
d0f0: 65 20 63 6f 6c 75 6d 6e 73 20 6e 61 6d 65 73 20  e columns names 
d100: 66 6f 72 20 74 68 69 73 20 76 69 65 77 20 61 72  for this view ar
d110: 65 0a 20 20 2a 2a 20 61 6c 72 65 61 64 79 20 6b  e.  ** already k
d120: 6e 6f 77 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  nown..  */.  if(
d130: 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3e 30 20   pTable->nCol>0 
d140: 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20 2f  ) return 0;..  /
d150: 2a 20 41 20 6e 65 67 61 74 69 76 65 20 6e 43 6f  * A negative nCo
d160: 6c 20 69 73 20 61 20 73 70 65 63 69 61 6c 20 6d  l is a special m
d170: 61 72 6b 65 72 20 6d 65 61 6e 69 6e 67 20 74 68  arker meaning th
d180: 61 74 20 77 65 20 61 72 65 20 63 75 72 72 65 6e  at we are curren
d190: 74 6c 79 0a 20 20 2a 2a 20 74 72 79 69 6e 67 20  tly.  ** trying 
d1a0: 74 6f 20 63 6f 6d 70 75 74 65 20 74 68 65 20 63  to compute the c
d1b0: 6f 6c 75 6d 6e 20 6e 61 6d 65 73 2e 20 20 49 66  olumn names.  If
d1c0: 20 77 65 20 65 6e 74 65 72 20 74 68 69 73 20 72   we enter this r
d1d0: 6f 75 74 69 6e 65 20 77 69 74 68 0a 20 20 2a 2a  outine with.  **
d1e0: 20 61 20 6e 65 67 61 74 69 76 65 20 6e 43 6f 6c   a negative nCol
d1f0: 2c 20 69 74 20 6d 65 61 6e 73 20 74 77 6f 20 6f  , it means two o
d200: 72 20 6d 6f 72 65 20 76 69 65 77 73 20 66 6f 72  r more views for
d210: 6d 20 61 20 6c 6f 6f 70 2c 20 6c 69 6b 65 20 74  m a loop, like t
d220: 68 69 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  his:.  **.  **  
d230: 20 20 20 43 52 45 41 54 45 20 56 49 45 57 20 6f     CREATE VIEW o
d240: 6e 65 20 41 53 20 53 45 4c 45 43 54 20 2a 20 46  ne AS SELECT * F
d250: 52 4f 4d 20 74 77 6f 3b 0a 20 20 2a 2a 20 20 20  ROM two;.  **   
d260: 20 20 43 52 45 41 54 45 20 56 49 45 57 20 74 77    CREATE VIEW tw
d270: 6f 20 41 53 20 53 45 4c 45 43 54 20 2a 20 46 52  o AS SELECT * FR
d280: 4f 4d 20 6f 6e 65 3b 0a 20 20 2a 2a 0a 20 20 2a  OM one;.  **.  *
d290: 2a 20 41 63 74 75 61 6c 6c 79 2c 20 74 68 69 73  * Actually, this
d2a0: 20 65 72 72 6f 72 20 69 73 20 63 61 75 67 68 74   error is caught
d2b0: 20 70 72 65 76 69 6f 75 73 6c 79 20 61 6e 64 20   previously and 
d2c0: 73 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  so the following
d2d0: 20 74 65 73 74 0a 20 20 2a 2a 20 73 68 6f 75 6c   test.  ** shoul
d2e0: 64 20 61 6c 77 61 79 73 20 66 61 69 6c 2e 20 20  d always fail.  
d2f0: 42 75 74 20 77 65 20 77 69 6c 6c 20 6c 65 61 76  But we will leav
d300: 65 20 69 74 20 69 6e 20 70 6c 61 63 65 20 6a 75  e it in place ju
d310: 73 74 20 74 6f 20 62 65 20 73 61 66 65 2e 0a 20  st to be safe.. 
d320: 20 2a 2f 0a 20 20 69 66 28 20 70 54 61 62 6c 65   */.  if( pTable
d330: 2d 3e 6e 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20  ->nCol<0 ){.    
d340: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
d350: 70 50 61 72 73 65 2c 20 22 76 69 65 77 20 25 73  pParse, "view %s
d360: 20 69 73 20 63 69 72 63 75 6c 61 72 6c 79 20 64   is circularly d
d370: 65 66 69 6e 65 64 22 2c 20 70 54 61 62 6c 65 2d  efined", pTable-
d380: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72 65 74  >zName);.    ret
d390: 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 61 73 73  urn 1;.  }.  ass
d3a0: 65 72 74 28 20 70 54 61 62 6c 65 2d 3e 6e 43 6f  ert( pTable->nCo
d3b0: 6c 3e 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 49 66  l>=0 );..  /* If
d3c0: 20 77 65 20 67 65 74 20 74 68 69 73 20 66 61 72   we get this far
d3d0: 2c 20 69 74 20 6d 65 61 6e 73 20 77 65 20 6e 65  , it means we ne
d3e0: 65 64 20 74 6f 20 63 6f 6d 70 75 74 65 20 74 68  ed to compute th
d3f0: 65 20 74 61 62 6c 65 20 6e 61 6d 65 73 2e 0a 20  e table names.. 
d400: 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68   ** Note that th
d410: 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  e call to sqlite
d420: 33 52 65 73 75 6c 74 53 65 74 4f 66 53 65 6c 65  3ResultSetOfSele
d430: 63 74 28 29 20 77 69 6c 6c 20 65 78 70 61 6e 64  ct() will expand
d440: 20 61 6e 79 0a 20 20 2a 2a 20 22 2a 22 20 65 6c   any.  ** "*" el
d450: 65 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 72 65  ements in the re
d460: 73 75 6c 74 73 20 73 65 74 20 6f 66 20 74 68 65  sults set of the
d470: 20 76 69 65 77 20 61 6e 64 20 77 69 6c 6c 20 61   view and will a
d480: 73 73 69 67 6e 20 63 75 72 73 6f 72 73 0a 20 20  ssign cursors.  
d490: 2a 2a 20 74 6f 20 74 68 65 20 65 6c 65 6d 65 6e  ** to the elemen
d4a0: 74 73 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63  ts of the FROM c
d4b0: 6c 61 75 73 65 2e 20 20 42 75 74 20 77 65 20 64  lause.  But we d
d4c0: 6f 20 6e 6f 74 20 77 61 6e 74 20 74 68 65 73 65  o not want these
d4d0: 20 63 68 61 6e 67 65 73 0a 20 20 2a 2a 20 74 6f   changes.  ** to
d4e0: 20 62 65 20 70 65 72 6d 61 6e 65 6e 74 2e 20 20   be permanent.  
d4f0: 53 6f 20 74 68 65 20 63 6f 6d 70 75 74 61 74 69  So the computati
d500: 6f 6e 20 69 73 20 64 6f 6e 65 20 6f 6e 20 61 20  on is done on a 
d510: 63 6f 70 79 20 6f 66 20 74 68 65 20 53 45 4c 45  copy of the SELE
d520: 43 54 0a 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e  CT.  ** statemen
d530: 74 20 74 68 61 74 20 64 65 66 69 6e 65 73 20 74  t that defines t
d540: 68 65 20 76 69 65 77 2e 0a 20 20 2a 2f 0a 20 20  he view..  */.  
d550: 61 73 73 65 72 74 28 20 70 54 61 62 6c 65 2d 3e  assert( pTable->
d560: 70 53 65 6c 65 63 74 20 29 3b 0a 20 20 70 53 65  pSelect );.  pSe
d570: 6c 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63  l = sqlite3Selec
d580: 74 44 75 70 28 70 54 61 62 6c 65 2d 3e 70 53 65  tDup(pTable->pSe
d590: 6c 65 63 74 29 3b 0a 20 20 69 66 28 20 70 53 65  lect);.  if( pSe
d5a0: 6c 20 29 7b 0a 20 20 20 20 6e 20 3d 20 70 50 61  l ){.    n = pPa
d5b0: 72 73 65 2d 3e 6e 54 61 62 3b 0a 20 20 20 20 73  rse->nTab;.    s
d5c0: 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 73 73  qlite3SrcListAss
d5d0: 69 67 6e 43 75 72 73 6f 72 73 28 70 50 61 72 73  ignCursors(pPars
d5e0: 65 2c 20 70 53 65 6c 2d 3e 70 53 72 63 29 3b 0a  e, pSel->pSrc);.
d5f0: 20 20 20 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c      pTable->nCol
d600: 20 3d 20 2d 31 3b 0a 20 20 20 20 70 53 65 6c 54   = -1;.    pSelT
d610: 61 62 20 3d 20 73 71 6c 69 74 65 33 52 65 73 75  ab = sqlite3Resu
d620: 6c 74 53 65 74 4f 66 53 65 6c 65 63 74 28 70 50  ltSetOfSelect(pP
d630: 61 72 73 65 2c 20 30 2c 20 70 53 65 6c 29 3b 0a  arse, 0, pSel);.
d640: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 54 61 62      pParse->nTab
d650: 20 3d 20 6e 3b 0a 20 20 20 20 69 66 28 20 70 53   = n;.    if( pS
d660: 65 6c 54 61 62 20 29 7b 0a 20 20 20 20 20 20 61  elTab ){.      a
d670: 73 73 65 72 74 28 20 70 54 61 62 6c 65 2d 3e 61  ssert( pTable->a
d680: 43 6f 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  Col==0 );.      
d690: 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 70  pTable->nCol = p
d6a0: 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c 3b 0a 20 20  SelTab->nCol;.  
d6b0: 20 20 20 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c      pTable->aCol
d6c0: 20 3d 20 70 53 65 6c 54 61 62 2d 3e 61 43 6f 6c   = pSelTab->aCol
d6d0: 3b 0a 20 20 20 20 20 20 70 53 65 6c 54 61 62 2d  ;.      pSelTab-
d6e0: 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20  >nCol = 0;.     
d6f0: 20 70 53 65 6c 54 61 62 2d 3e 61 43 6f 6c 20 3d   pSelTab->aCol =
d700: 20 30 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   0;.      sqlite
d710: 33 44 65 6c 65 74 65 54 61 62 6c 65 28 30 2c 20  3DeleteTable(0, 
d720: 70 53 65 6c 54 61 62 29 3b 0a 20 20 20 20 20 20  pSelTab);.      
d730: 70 54 61 62 6c 65 2d 3e 70 53 63 68 65 6d 61 2d  pTable->pSchema-
d740: 3e 66 6c 61 67 73 20 7c 3d 20 44 42 5f 55 6e 72  >flags |= DB_Unr
d750: 65 73 65 74 56 69 65 77 73 3b 0a 20 20 20 20 7d  esetViews;.    }
d760: 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 54 61 62  else{.      pTab
d770: 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20  le->nCol = 0;.  
d780: 20 20 20 20 6e 45 72 72 2b 2b 3b 0a 20 20 20 20      nErr++;.    
d790: 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c  }.    sqlite3Sel
d7a0: 65 63 74 44 65 6c 65 74 65 28 70 53 65 6c 29 3b  ectDelete(pSel);
d7b0: 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20  .  } else {.    
d7c0: 6e 45 72 72 2b 2b 3b 0a 20 20 7d 0a 23 65 6e 64  nErr++;.  }.#end
d7d0: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
d7e0: 54 5f 56 49 45 57 20 2a 2f 0a 20 20 72 65 74 75  T_VIEW */.  retu
d7f0: 72 6e 20 6e 45 72 72 3b 20 20 0a 7d 0a 23 65 6e  rn nErr;  .}.#en
d800: 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28  dif /* !defined(
d810: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57  SQLITE_OMIT_VIEW
d820: 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51  ) || !defined(SQ
d830: 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
d840: 4c 54 41 42 4c 45 29 20 2a 2f 0a 0a 23 69 66 6e  LTABLE) */..#ifn
d850: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
d860: 56 49 45 57 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72  VIEW./*.** Clear
d870: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65   the column name
d880: 73 20 66 72 6f 6d 20 65 76 65 72 79 20 56 49 45  s from every VIE
d890: 57 20 69 6e 20 64 61 74 61 62 61 73 65 20 69 64  W in database id
d8a0: 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  x..*/.static voi
d8b0: 64 20 73 71 6c 69 74 65 56 69 65 77 52 65 73 65  d sqliteViewRese
d8c0: 74 41 6c 6c 28 73 71 6c 69 74 65 33 20 2a 64 62  tAll(sqlite3 *db
d8d0: 2c 20 69 6e 74 20 69 64 78 29 7b 0a 20 20 48 61  , int idx){.  Ha
d8e0: 73 68 45 6c 65 6d 20 2a 69 3b 0a 20 20 69 66 28  shElem *i;.  if(
d8f0: 20 21 44 62 48 61 73 50 72 6f 70 65 72 74 79 28   !DbHasProperty(
d900: 64 62 2c 20 69 64 78 2c 20 44 42 5f 55 6e 72 65  db, idx, DB_Unre
d910: 73 65 74 56 69 65 77 73 29 20 29 20 72 65 74 75  setViews) ) retu
d920: 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 73 71 6c 69  rn;.  for(i=sqli
d930: 74 65 48 61 73 68 46 69 72 73 74 28 26 64 62 2d  teHashFirst(&db-
d940: 3e 61 44 62 5b 69 64 78 5d 2e 70 53 63 68 65 6d  >aDb[idx].pSchem
d950: 61 2d 3e 74 62 6c 48 61 73 68 29 3b 20 69 3b 69  a->tblHash); i;i
d960: 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28  =sqliteHashNext(
d970: 69 29 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a  i)){.    Table *
d980: 70 54 61 62 20 3d 20 73 71 6c 69 74 65 48 61 73  pTab = sqliteHas
d990: 68 44 61 74 61 28 69 29 3b 0a 20 20 20 20 69 66  hData(i);.    if
d9a0: 28 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20  ( pTab->pSelect 
d9b0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 52  ){.      sqliteR
d9c0: 65 73 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28  esetColumnNames(
d9d0: 70 54 61 62 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  pTab);.    }.  }
d9e0: 0a 20 20 44 62 43 6c 65 61 72 50 72 6f 70 65 72  .  DbClearProper
d9f0: 74 79 28 64 62 2c 20 69 64 78 2c 20 44 42 5f 55  ty(db, idx, DB_U
da00: 6e 72 65 73 65 74 56 69 65 77 73 29 3b 0a 7d 0a  nresetViews);.}.
da10: 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 73  #else.# define s
da20: 71 6c 69 74 65 56 69 65 77 52 65 73 65 74 41 6c  qliteViewResetAl
da30: 6c 28 41 2c 42 29 0a 23 65 6e 64 69 66 20 2f 2a  l(A,B).#endif /*
da40: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45   SQLITE_OMIT_VIE
da50: 57 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  W */../*.** This
da60: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
da70: 6c 65 64 20 62 79 20 74 68 65 20 56 44 42 45 20  led by the VDBE 
da80: 74 6f 20 61 64 6a 75 73 74 20 74 68 65 20 69 6e  to adjust the in
da90: 74 65 72 6e 61 6c 20 73 63 68 65 6d 61 0a 2a 2a  ternal schema.**
daa0: 20 75 73 65 64 20 62 79 20 53 51 4c 69 74 65 20   used by SQLite 
dab0: 77 68 65 6e 20 74 68 65 20 62 74 72 65 65 20 6c  when the btree l
dac0: 61 79 65 72 20 6d 6f 76 65 73 20 61 20 74 61 62  ayer moves a tab
dad0: 6c 65 20 72 6f 6f 74 20 70 61 67 65 2e 20 54 68  le root page. Th
dae0: 65 0a 2a 2a 20 72 6f 6f 74 2d 70 61 67 65 20 6f  e.** root-page o
daf0: 66 20 61 20 74 61 62 6c 65 20 6f 72 20 69 6e 64  f a table or ind
db00: 65 78 20 69 6e 20 64 61 74 61 62 61 73 65 20 69  ex in database i
db10: 44 62 20 68 61 73 20 63 68 61 6e 67 65 64 20 66  Db has changed f
db20: 72 6f 6d 20 69 46 72 6f 6d 0a 2a 2a 20 74 6f 20  rom iFrom.** to 
db30: 69 54 6f 2e 0a 2a 2a 0a 2a 2a 20 54 69 63 6b 65  iTo..**.** Ticke
db40: 74 20 23 31 37 32 38 3a 20 20 54 68 65 20 73 79  t #1728:  The sy
db50: 6d 62 6f 6c 20 74 61 62 6c 65 20 6d 69 67 68 74  mbol table might
db60: 20 73 74 69 6c 6c 20 63 6f 6e 74 61 69 6e 20 69   still contain i
db70: 6e 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20 6f 6e  nformation.** on
db80: 20 74 61 62 6c 65 73 20 61 6e 64 2f 6f 72 20 69   tables and/or i
db90: 6e 64 69 63 65 73 20 74 68 61 74 20 61 72 65 20  ndices that are 
dba0: 74 68 65 20 70 72 6f 63 65 73 73 20 6f 66 20 62  the process of b
dbb0: 65 69 6e 67 20 64 65 6c 65 74 65 64 2e 0a 2a 2a  eing deleted..**
dbc0: 20 49 66 20 79 6f 75 20 61 72 65 20 75 6e 6c 75   If you are unlu
dbd0: 63 6b 79 2c 20 6f 6e 65 20 6f 66 20 74 68 6f 73  cky, one of thos
dbe0: 65 20 64 65 6c 65 74 65 64 20 69 6e 64 69 63 65  e deleted indice
dbf0: 73 20 6f 72 20 74 61 62 6c 65 73 20 6d 69 67 68  s or tables migh
dc00: 74 0a 2a 2a 20 68 61 76 65 20 74 68 65 20 73 61  t.** have the sa
dc10: 6d 65 20 72 6f 6f 74 70 61 67 65 20 6e 75 6d 62  me rootpage numb
dc20: 65 72 20 61 73 20 74 68 65 20 72 65 61 6c 20 74  er as the real t
dc30: 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 74 68  able or index th
dc40: 61 74 20 69 73 0a 2a 2a 20 62 65 69 6e 67 20 6d  at is.** being m
dc50: 6f 76 65 64 2e 20 20 53 6f 20 77 65 20 63 61 6e  oved.  So we can
dc60: 6e 6f 74 20 73 74 6f 70 20 73 65 61 72 63 68 69  not stop searchi
dc70: 6e 67 20 61 66 74 65 72 20 74 68 65 20 66 69 72  ng after the fir
dc80: 73 74 20 6d 61 74 63 68 20 0a 2a 2a 20 62 65 63  st match .** bec
dc90: 61 75 73 65 20 74 68 65 20 66 69 72 73 74 20 6d  ause the first m
dca0: 61 74 63 68 20 6d 69 67 68 74 20 62 65 20 66 6f  atch might be fo
dcb0: 72 20 6f 6e 65 20 6f 66 20 74 68 65 20 64 65 6c  r one of the del
dcc0: 65 74 65 64 20 69 6e 64 69 63 65 73 0a 2a 2a 20  eted indices.** 
dcd0: 6f 72 20 74 61 62 6c 65 73 20 61 6e 64 20 6e 6f  or tables and no
dce0: 74 20 74 68 65 20 74 61 62 6c 65 2f 69 6e 64 65  t the table/inde
dcf0: 78 20 74 68 61 74 20 69 73 20 61 63 74 75 61 6c  x that is actual
dd00: 6c 79 20 62 65 69 6e 67 20 6d 6f 76 65 64 2e 0a  ly being moved..
dd10: 2a 2a 20 57 65 20 6d 75 73 74 20 63 6f 6e 74 69  ** We must conti
dd20: 6e 75 65 20 6c 6f 6f 70 69 6e 67 20 75 6e 74 69  nue looping unti
dd30: 6c 20 61 6c 6c 20 74 61 62 6c 65 73 20 61 6e 64  l all tables and
dd40: 20 69 6e 64 69 63 65 73 20 77 69 74 68 0a 2a 2a   indices with.**
dd50: 20 72 6f 6f 74 70 61 67 65 3d 3d 69 46 72 6f 6d   rootpage==iFrom
dd60: 20 68 61 76 65 20 62 65 65 6e 20 63 6f 6e 76 65   have been conve
dd70: 72 74 65 64 20 74 6f 20 68 61 76 65 20 61 20 72  rted to have a r
dd80: 6f 6f 74 70 61 67 65 20 6f 66 20 69 54 6f 0a 2a  ootpage of iTo.*
dd90: 2a 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 62 65  * in order to be
dda0: 20 63 65 72 74 61 69 6e 20 74 68 61 74 20 77 65   certain that we
ddb0: 20 67 6f 74 20 74 68 65 20 72 69 67 68 74 20 6f   got the right o
ddc0: 6e 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53  ne..*/.#ifndef S
ddd0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
dde0: 41 43 55 55 4d 0a 76 6f 69 64 20 73 71 6c 69 74  ACUUM.void sqlit
ddf0: 65 33 52 6f 6f 74 50 61 67 65 4d 6f 76 65 64 28  e3RootPageMoved(
de00: 44 62 20 2a 70 44 62 2c 20 69 6e 74 20 69 46 72  Db *pDb, int iFr
de10: 6f 6d 2c 20 69 6e 74 20 69 54 6f 29 7b 0a 20 20  om, int iTo){.  
de20: 48 61 73 68 45 6c 65 6d 20 2a 70 45 6c 65 6d 3b  HashElem *pElem;
de30: 0a 20 20 48 61 73 68 20 2a 70 48 61 73 68 3b 0a  .  Hash *pHash;.
de40: 0a 20 20 70 48 61 73 68 20 3d 20 26 70 44 62 2d  .  pHash = &pDb-
de50: 3e 70 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73  >pSchema->tblHas
de60: 68 3b 0a 20 20 66 6f 72 28 70 45 6c 65 6d 3d 73  h;.  for(pElem=s
de70: 71 6c 69 74 65 48 61 73 68 46 69 72 73 74 28 70  qliteHashFirst(p
de80: 48 61 73 68 29 3b 20 70 45 6c 65 6d 3b 20 70 45  Hash); pElem; pE
de90: 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73 68 4e 65  lem=sqliteHashNe
dea0: 78 74 28 70 45 6c 65 6d 29 29 7b 0a 20 20 20 20  xt(pElem)){.    
deb0: 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 73 71  Table *pTab = sq
dec0: 6c 69 74 65 48 61 73 68 44 61 74 61 28 70 45 6c  liteHashData(pEl
ded0: 65 6d 29 3b 0a 20 20 20 20 69 66 28 20 70 54 61  em);.    if( pTa
dee0: 62 2d 3e 74 6e 75 6d 3d 3d 69 46 72 6f 6d 20 29  b->tnum==iFrom )
def0: 7b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 74 6e  {.      pTab->tn
df00: 75 6d 20 3d 20 69 54 6f 3b 0a 20 20 20 20 7d 0a  um = iTo;.    }.
df10: 20 20 7d 0a 20 20 70 48 61 73 68 20 3d 20 26 70    }.  pHash = &p
df20: 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 69 64 78  Db->pSchema->idx
df30: 48 61 73 68 3b 0a 20 20 66 6f 72 28 70 45 6c 65  Hash;.  for(pEle
df40: 6d 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72 73  m=sqliteHashFirs
df50: 74 28 70 48 61 73 68 29 3b 20 70 45 6c 65 6d 3b  t(pHash); pElem;
df60: 20 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73   pElem=sqliteHas
df70: 68 4e 65 78 74 28 70 45 6c 65 6d 29 29 7b 0a 20  hNext(pElem)){. 
df80: 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 20 3d     Index *pIdx =
df90: 20 73 71 6c 69 74 65 48 61 73 68 44 61 74 61 28   sqliteHashData(
dfa0: 70 45 6c 65 6d 29 3b 0a 20 20 20 20 69 66 28 20  pElem);.    if( 
dfb0: 70 49 64 78 2d 3e 74 6e 75 6d 3d 3d 69 46 72 6f  pIdx->tnum==iFro
dfc0: 6d 20 29 7b 0a 20 20 20 20 20 20 70 49 64 78 2d  m ){.      pIdx-
dfd0: 3e 74 6e 75 6d 20 3d 20 69 54 6f 3b 0a 20 20 20  >tnum = iTo;.   
dfe0: 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a   }.  }.}.#endif.
dff0: 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 63 6f 64  ./*.** Write cod
e000: 65 20 74 6f 20 65 72 61 73 65 20 74 68 65 20 74  e to erase the t
e010: 61 62 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d 70  able with root-p
e020: 61 67 65 20 69 54 61 62 6c 65 20 66 72 6f 6d 20  age iTable from 
e030: 64 61 74 61 62 61 73 65 20 69 44 62 2e 0a 2a 2a  database iDb..**
e040: 20 41 6c 73 6f 20 77 72 69 74 65 20 63 6f 64 65   Also write code
e050: 20 74 6f 20 6d 6f 64 69 66 79 20 74 68 65 20 73   to modify the s
e060: 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62  qlite_master tab
e070: 6c 65 20 61 6e 64 20 69 6e 74 65 72 6e 61 6c 20  le and internal 
e080: 73 63 68 65 6d 61 0a 2a 2a 20 69 66 20 61 20 72  schema.** if a r
e090: 6f 6f 74 2d 70 61 67 65 20 6f 66 20 61 6e 6f 74  oot-page of anot
e0a0: 68 65 72 20 74 61 62 6c 65 20 69 73 20 6d 6f 76  her table is mov
e0b0: 65 64 20 62 79 20 74 68 65 20 62 74 72 65 65 2d  ed by the btree-
e0c0: 6c 61 79 65 72 20 77 68 69 6c 73 74 0a 2a 2a 20  layer whilst.** 
e0d0: 65 72 61 73 69 6e 67 20 69 54 61 62 6c 65 20 28  erasing iTable (
e0e0: 74 68 69 73 20 63 61 6e 20 68 61 70 70 65 6e 20  this can happen 
e0f0: 77 69 74 68 20 61 6e 20 61 75 74 6f 2d 76 61 63  with an auto-vac
e100: 75 75 6d 20 64 61 74 61 62 61 73 65 29 2e 0a 2a  uum database)..*
e110: 2f 20 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64  / .static void d
e120: 65 73 74 72 6f 79 52 6f 6f 74 50 61 67 65 28 50  estroyRootPage(P
e130: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e  arse *pParse, in
e140: 74 20 69 54 61 62 6c 65 2c 20 69 6e 74 20 69 44  t iTable, int iD
e150: 62 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  b){.  Vdbe *v = 
e160: 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
e170: 50 61 72 73 65 29 3b 0a 20 20 73 71 6c 69 74 65  Parse);.  sqlite
e180: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
e190: 5f 44 65 73 74 72 6f 79 2c 20 69 54 61 62 6c 65  _Destroy, iTable
e1a0: 2c 20 69 44 62 29 3b 0a 23 69 66 6e 64 65 66 20  , iDb);.#ifndef 
e1b0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
e1c0: 56 41 43 55 55 4d 0a 20 20 2f 2a 20 4f 50 5f 44  VACUUM.  /* OP_D
e1d0: 65 73 74 72 6f 79 20 70 75 73 68 65 73 20 61 6e  estroy pushes an
e1e0: 20 69 6e 74 65 67 65 72 20 6f 6e 74 6f 20 74 68   integer onto th
e1f0: 65 20 73 74 61 63 6b 2e 20 49 66 20 74 68 69 73  e stack. If this
e200: 20 69 6e 74 65 67 65 72 0a 20 20 2a 2a 20 69 73   integer.  ** is
e210: 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20   non-zero, then 
e220: 69 74 20 69 73 20 74 68 65 20 72 6f 6f 74 20 70  it is the root p
e230: 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 20  age number of a 
e240: 74 61 62 6c 65 20 6d 6f 76 65 64 20 74 6f 0a 20  table moved to. 
e250: 20 2a 2a 20 6c 6f 63 61 74 69 6f 6e 20 69 54 61   ** location iTa
e260: 62 6c 65 2e 20 54 68 65 20 66 6f 6c 6c 6f 77 69  ble. The followi
e270: 6e 67 20 63 6f 64 65 20 6d 6f 64 69 66 69 65 73  ng code modifies
e280: 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74   the sqlite_mast
e290: 65 72 20 74 61 62 6c 65 20 74 6f 0a 20 20 2a 2a  er table to.  **
e2a0: 20 72 65 66 6c 65 63 74 20 74 68 69 73 2e 0a 20   reflect this.. 
e2b0: 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 22 23 30   **.  ** The "#0
e2c0: 22 20 69 6e 20 74 68 65 20 53 51 4c 20 69 73 20  " in the SQL is 
e2d0: 61 20 73 70 65 63 69 61 6c 20 63 6f 6e 73 74 61  a special consta
e2e0: 6e 74 20 74 68 61 74 20 6d 65 61 6e 73 20 77 68  nt that means wh
e2f0: 61 74 65 76 65 72 20 76 61 6c 75 65 0a 20 20 2a  atever value.  *
e300: 2a 20 69 73 20 6f 6e 20 74 68 65 20 74 6f 70 20  * is on the top 
e310: 6f 66 20 74 68 65 20 73 74 61 63 6b 2e 20 20 53  of the stack.  S
e320: 65 65 20 73 71 6c 69 74 65 33 52 65 67 69 73 74  ee sqlite3Regist
e330: 65 72 45 78 70 72 28 29 2e 0a 20 20 2a 2f 0a 20  erExpr()..  */. 
e340: 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61   sqlite3NestedPa
e350: 72 73 65 28 70 50 61 72 73 65 2c 20 0a 20 20 20  rse(pParse, .   
e360: 20 20 22 55 50 44 41 54 45 20 25 51 2e 25 73 20    "UPDATE %Q.%s 
e370: 53 45 54 20 72 6f 6f 74 70 61 67 65 3d 25 64 20  SET rootpage=%d 
e380: 57 48 45 52 45 20 23 30 20 41 4e 44 20 72 6f 6f  WHERE #0 AND roo
e390: 74 70 61 67 65 3d 23 30 22 2c 0a 20 20 20 20 20  tpage=#0",.     
e3a0: 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61 44 62 5b  pParse->db->aDb[
e3b0: 69 44 62 5d 2e 7a 4e 61 6d 65 2c 20 53 43 48 45  iDb].zName, SCHE
e3c0: 4d 41 5f 54 41 42 4c 45 28 69 44 62 29 2c 20 69  MA_TABLE(iDb), i
e3d0: 54 61 62 6c 65 29 3b 0a 23 65 6e 64 69 66 0a 7d  Table);.#endif.}
e3e0: 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 56 44  ../*.** Write VD
e3f0: 42 45 20 63 6f 64 65 20 74 6f 20 65 72 61 73 65  BE code to erase
e400: 20 74 61 62 6c 65 20 70 54 61 62 20 61 6e 64 20   table pTab and 
e410: 61 6c 6c 20 61 73 73 6f 63 69 61 74 65 64 20 69  all associated i
e420: 6e 64 69 63 65 73 20 6f 6e 20 64 69 73 6b 2e 0a  ndices on disk..
e430: 2a 2a 20 43 6f 64 65 20 74 6f 20 75 70 64 61 74  ** Code to updat
e440: 65 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73  e the sqlite_mas
e450: 74 65 72 20 74 61 62 6c 65 73 20 61 6e 64 20 69  ter tables and i
e460: 6e 74 65 72 6e 61 6c 20 73 63 68 65 6d 61 20 64  nternal schema d
e470: 65 66 69 6e 69 74 69 6f 6e 73 0a 2a 2a 20 69 6e  efinitions.** in
e480: 20 63 61 73 65 20 61 20 72 6f 6f 74 2d 70 61 67   case a root-pag
e490: 65 20 62 65 6c 6f 6e 67 69 6e 67 20 74 6f 20 61  e belonging to a
e4a0: 6e 6f 74 68 65 72 20 74 61 62 6c 65 20 69 73 20  nother table is 
e4b0: 6d 6f 76 65 64 20 62 79 20 74 68 65 20 62 74 72  moved by the btr
e4c0: 65 65 20 6c 61 79 65 72 0a 2a 2a 20 69 73 20 61  ee layer.** is a
e4d0: 6c 73 6f 20 61 64 64 65 64 20 28 74 68 69 73 20  lso added (this 
e4e0: 63 61 6e 20 68 61 70 70 65 6e 20 77 69 74 68 20  can happen with 
e4f0: 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64  an auto-vacuum d
e500: 61 74 61 62 61 73 65 29 2e 0a 2a 2f 0a 73 74 61  atabase)..*/.sta
e510: 74 69 63 20 76 6f 69 64 20 64 65 73 74 72 6f 79  tic void destroy
e520: 54 61 62 6c 65 28 50 61 72 73 65 20 2a 70 50 61  Table(Parse *pPa
e530: 72 73 65 2c 20 54 61 62 6c 65 20 2a 70 54 61 62  rse, Table *pTab
e540: 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ){.#ifdef SQLITE
e550: 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
e560: 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a  .  Index *pIdx;.
e570: 20 20 69 6e 74 20 69 44 62 20 3d 20 73 71 6c 69    int iDb = sqli
e580: 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78  te3SchemaToIndex
e590: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 54 61  (pParse->db, pTa
e5a0: 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 64  b->pSchema);.  d
e5b0: 65 73 74 72 6f 79 52 6f 6f 74 50 61 67 65 28 70  estroyRootPage(p
e5c0: 50 61 72 73 65 2c 20 70 54 61 62 2d 3e 74 6e 75  Parse, pTab->tnu
e5d0: 6d 2c 20 69 44 62 29 3b 0a 20 20 66 6f 72 28 70  m, iDb);.  for(p
e5e0: 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78  Idx=pTab->pIndex
e5f0: 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64  ; pIdx; pIdx=pId
e600: 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 64  x->pNext){.    d
e610: 65 73 74 72 6f 79 52 6f 6f 74 50 61 67 65 28 70  estroyRootPage(p
e620: 50 61 72 73 65 2c 20 70 49 64 78 2d 3e 74 6e 75  Parse, pIdx->tnu
e630: 6d 2c 20 69 44 62 29 3b 0a 20 20 7d 0a 23 65 6c  m, iDb);.  }.#el
e640: 73 65 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 64  se.  /* If the d
e650: 61 74 61 62 61 73 65 20 6d 61 79 20 62 65 20 61  atabase may be a
e660: 75 74 6f 2d 76 61 63 75 75 6d 20 63 61 70 61 62  uto-vacuum capab
e670: 6c 65 20 28 69 66 20 53 51 4c 49 54 45 5f 4f 4d  le (if SQLITE_OM
e680: 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
e690: 2a 2a 20 69 73 20 6e 6f 74 20 64 65 66 69 6e 65  ** is not define
e6a0: 64 29 2c 20 74 68 65 6e 20 69 74 20 69 73 20 69  d), then it is i
e6b0: 6d 70 6f 72 74 61 6e 74 20 74 6f 20 63 61 6c 6c  mportant to call
e6c0: 20 4f 50 5f 44 65 73 74 72 6f 79 20 6f 6e 20 74   OP_Destroy on t
e6d0: 68 65 0a 20 20 2a 2a 20 74 61 62 6c 65 20 61 6e  he.  ** table an
e6e0: 64 20 69 6e 64 65 78 20 72 6f 6f 74 2d 70 61 67  d index root-pag
e6f0: 65 73 20 69 6e 20 6f 72 64 65 72 2c 20 73 74 61  es in order, sta
e700: 72 74 69 6e 67 20 77 69 74 68 20 74 68 65 20 6e  rting with the n
e710: 75 6d 65 72 69 63 61 6c 6c 79 20 0a 20 20 2a 2a  umerically .  **
e720: 20 6c 61 72 67 65 73 74 20 72 6f 6f 74 2d 70 61   largest root-pa
e730: 67 65 20 6e 75 6d 62 65 72 2e 20 54 68 69 73 20  ge number. This 
e740: 67 75 61 72 61 6e 74 65 65 73 20 74 68 61 74 20  guarantees that 
e750: 6e 6f 6e 65 20 6f 66 20 74 68 65 20 72 6f 6f 74  none of the root
e760: 2d 70 61 67 65 73 0a 20 20 2a 2a 20 74 6f 20 62  -pages.  ** to b
e770: 65 20 64 65 73 74 72 6f 79 65 64 20 69 73 20 72  e destroyed is r
e780: 65 6c 6f 63 61 74 65 64 20 62 79 20 61 6e 20 65  elocated by an e
e790: 61 72 6c 69 65 72 20 4f 50 5f 44 65 73 74 72 6f  arlier OP_Destro
e7a0: 79 2e 20 69 2e 65 2e 20 69 66 20 74 68 65 0a 20  y. i.e. if the. 
e7b0: 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 77 65   ** following we
e7c0: 72 65 20 63 6f 64 65 64 3a 0a 20 20 2a 2a 0a 20  re coded:.  **. 
e7d0: 20 2a 2a 20 4f 50 5f 44 65 73 74 72 6f 79 20 34   ** OP_Destroy 4
e7e0: 20 30 0a 20 20 2a 2a 20 2e 2e 2e 0a 20 20 2a 2a   0.  ** ....  **
e7f0: 20 4f 50 5f 44 65 73 74 72 6f 79 20 35 20 30 0a   OP_Destroy 5 0.
e800: 20 20 2a 2a 0a 20 20 2a 2a 20 61 6e 64 20 72 6f    **.  ** and ro
e810: 6f 74 20 70 61 67 65 20 35 20 68 61 70 70 65 6e  ot page 5 happen
e820: 65 64 20 74 6f 20 62 65 20 74 68 65 20 6c 61 72  ed to be the lar
e830: 67 65 73 74 20 72 6f 6f 74 2d 70 61 67 65 20 6e  gest root-page n
e840: 75 6d 62 65 72 20 69 6e 20 74 68 65 0a 20 20 2a  umber in the.  *
e850: 2a 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 6e  * database, then
e860: 20 72 6f 6f 74 20 70 61 67 65 20 35 20 77 6f 75   root page 5 wou
e870: 6c 64 20 62 65 20 6d 6f 76 65 64 20 74 6f 20 70  ld be moved to p
e880: 61 67 65 20 34 20 62 79 20 74 68 65 20 0a 20 20  age 4 by the .  
e890: 2a 2a 20 22 4f 50 5f 44 65 73 74 72 6f 79 20 34  ** "OP_Destroy 4
e8a0: 20 30 22 20 6f 70 63 6f 64 65 2e 20 54 68 65 20   0" opcode. The 
e8b0: 73 75 62 73 65 71 75 65 6e 74 20 22 4f 50 5f 44  subsequent "OP_D
e8c0: 65 73 74 72 6f 79 20 35 20 30 22 20 77 6f 75 6c  estroy 5 0" woul
e8d0: 64 20 68 69 74 0a 20 20 2a 2a 20 61 20 66 72 65  d hit.  ** a fre
e8e0: 65 2d 6c 69 73 74 20 70 61 67 65 2e 0a 20 20 2a  e-list page..  *
e8f0: 2f 0a 20 20 69 6e 74 20 69 54 61 62 20 3d 20 70  /.  int iTab = p
e900: 54 61 62 2d 3e 74 6e 75 6d 3b 0a 20 20 69 6e 74  Tab->tnum;.  int
e910: 20 69 44 65 73 74 72 6f 79 65 64 20 3d 20 30 3b   iDestroyed = 0;
e920: 0a 0a 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a  ..  while( 1 ){.
e930: 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b      Index *pIdx;
e940: 0a 20 20 20 20 69 6e 74 20 69 4c 61 72 67 65 73  .    int iLarges
e950: 74 20 3d 20 30 3b 0a 0a 20 20 20 20 69 66 28 20  t = 0;..    if( 
e960: 69 44 65 73 74 72 6f 79 65 64 3d 3d 30 20 7c 7c  iDestroyed==0 ||
e970: 20 69 54 61 62 3c 69 44 65 73 74 72 6f 79 65 64   iTab<iDestroyed
e980: 20 29 7b 0a 20 20 20 20 20 20 69 4c 61 72 67 65   ){.      iLarge
e990: 73 74 20 3d 20 69 54 61 62 3b 0a 20 20 20 20 7d  st = iTab;.    }
e9a0: 0a 20 20 20 20 66 6f 72 28 70 49 64 78 3d 70 54  .    for(pIdx=pT
e9b0: 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78  ab->pIndex; pIdx
e9c0: 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65  ; pIdx=pIdx->pNe
e9d0: 78 74 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  xt){.      int i
e9e0: 49 64 78 20 3d 20 70 49 64 78 2d 3e 74 6e 75 6d  Idx = pIdx->tnum
e9f0: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
ea00: 70 49 64 78 2d 3e 70 53 63 68 65 6d 61 3d 3d 70  pIdx->pSchema==p
ea10: 54 61 62 2d 3e 70 53 63 68 65 6d 61 20 29 3b 0a  Tab->pSchema );.
ea20: 20 20 20 20 20 20 69 66 28 20 28 69 44 65 73 74        if( (iDest
ea30: 72 6f 79 65 64 3d 3d 30 20 7c 7c 20 28 69 49 64  royed==0 || (iId
ea40: 78 3c 69 44 65 73 74 72 6f 79 65 64 29 29 20 26  x<iDestroyed)) &
ea50: 26 20 69 49 64 78 3e 69 4c 61 72 67 65 73 74 20  & iIdx>iLargest 
ea60: 29 7b 0a 20 20 20 20 20 20 20 20 69 4c 61 72 67  ){.        iLarg
ea70: 65 73 74 20 3d 20 69 49 64 78 3b 0a 20 20 20 20  est = iIdx;.    
ea80: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
ea90: 28 20 69 4c 61 72 67 65 73 74 3d 3d 30 20 29 7b  ( iLargest==0 ){
eaa0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  .      return;. 
eab0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
eac0: 69 6e 74 20 69 44 62 20 3d 20 73 71 6c 69 74 65  int iDb = sqlite
ead0: 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 70  3SchemaToIndex(p
eae0: 50 61 72 73 65 2d 3e 64 62 2c 20 70 54 61 62 2d  Parse->db, pTab-
eaf0: 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 20  >pSchema);.     
eb00: 20 64 65 73 74 72 6f 79 52 6f 6f 74 50 61 67 65   destroyRootPage
eb10: 28 70 50 61 72 73 65 2c 20 69 4c 61 72 67 65 73  (pParse, iLarges
eb20: 74 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20 69  t, iDb);.      i
eb30: 44 65 73 74 72 6f 79 65 64 20 3d 20 69 4c 61 72  Destroyed = iLar
eb40: 67 65 73 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  gest;.    }.  }.
eb50: 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  #endif.}../*.** 
eb60: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
eb70: 63 61 6c 6c 65 64 20 74 6f 20 64 6f 20 74 68 65  called to do the
eb80: 20 77 6f 72 6b 20 6f 66 20 61 20 44 52 4f 50 20   work of a DROP 
eb90: 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e  TABLE statement.
eba0: 0a 2a 2a 20 70 4e 61 6d 65 20 69 73 20 74 68 65  .** pName is the
ebb0: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62   name of the tab
ebc0: 6c 65 20 74 6f 20 62 65 20 64 72 6f 70 70 65 64  le to be dropped
ebd0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
ebe0: 33 44 72 6f 70 54 61 62 6c 65 28 50 61 72 73 65  3DropTable(Parse
ebf0: 20 2a 70 50 61 72 73 65 2c 20 53 72 63 4c 69 73   *pParse, SrcLis
ec00: 74 20 2a 70 4e 61 6d 65 2c 20 69 6e 74 20 69 73  t *pName, int is
ec10: 56 69 65 77 2c 20 69 6e 74 20 6e 6f 45 72 72 29  View, int noErr)
ec20: 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b  {.  Table *pTab;
ec30: 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 73 71  .  Vdbe *v;.  sq
ec40: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
ec50: 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 69 44  se->db;.  int iD
ec60: 62 3b 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65  b;..  if( pParse
ec70: 2d 3e 6e 45 72 72 20 7c 7c 20 73 71 6c 69 74 65  ->nErr || sqlite
ec80: 33 4d 61 6c 6c 6f 63 46 61 69 6c 65 64 28 29 20  3MallocFailed() 
ec90: 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74  ){.    goto exit
eca0: 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 7d  _drop_table;.  }
ecb0: 0a 20 20 61 73 73 65 72 74 28 20 70 4e 61 6d 65  .  assert( pName
ecc0: 2d 3e 6e 53 72 63 3d 3d 31 20 29 3b 0a 20 20 70  ->nSrc==1 );.  p
ecd0: 54 61 62 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63  Tab = sqlite3Loc
ece0: 61 74 65 54 61 62 6c 65 28 70 50 61 72 73 65 2c  ateTable(pParse,
ecf0: 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 4e 61   pName->a[0].zNa
ed00: 6d 65 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e  me, pName->a[0].
ed10: 7a 44 61 74 61 62 61 73 65 29 3b 0a 0a 20 20 69  zDatabase);..  i
ed20: 66 28 20 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20  f( pTab==0 ){.  
ed30: 20 20 69 66 28 20 6e 6f 45 72 72 20 29 7b 0a 20    if( noErr ){. 
ed40: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
ed50: 72 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a  rClear(pParse);.
ed60: 20 20 20 20 7d 0a 20 20 20 20 67 6f 74 6f 20 65      }.    goto e
ed70: 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a  xit_drop_table;.
ed80: 20 20 7d 0a 20 20 69 44 62 20 3d 20 73 71 6c 69    }.  iDb = sqli
ed90: 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78  te3SchemaToIndex
eda0: 28 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65  (db, pTab->pSche
edb0: 6d 61 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69  ma);.  assert( i
edc0: 44 62 3e 3d 30 20 26 26 20 69 44 62 3c 64 62 2d  Db>=0 && iDb<db-
edd0: 3e 6e 44 62 20 29 3b 0a 23 69 66 6e 64 65 66 20  >nDb );.#ifndef 
ede0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48  SQLITE_OMIT_AUTH
edf0: 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 7b 0a 20 20  ORIZATION.  {.  
ee00: 20 20 69 6e 74 20 63 6f 64 65 3b 0a 20 20 20 20    int code;.    
ee10: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62  const char *zTab
ee20: 20 3d 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28   = SCHEMA_TABLE(
ee30: 69 44 62 29 3b 0a 20 20 20 20 63 6f 6e 73 74 20  iDb);.    const 
ee40: 63 68 61 72 20 2a 7a 44 62 20 3d 20 64 62 2d 3e  char *zDb = db->
ee50: 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a  aDb[iDb].zName;.
ee60: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
ee70: 7a 41 72 67 32 20 3d 20 30 3b 0a 20 20 20 20 69  zArg2 = 0;.    i
ee80: 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68  f( sqlite3AuthCh
ee90: 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49  eck(pParse, SQLI
eea0: 54 45 5f 44 45 4c 45 54 45 2c 20 7a 54 61 62 2c  TE_DELETE, zTab,
eeb0: 20 30 2c 20 7a 44 62 29 29 7b 0a 20 20 20 20 20   0, zDb)){.     
eec0: 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f   goto exit_drop_
eed0: 74 61 62 6c 65 3b 0a 20 20 20 20 7d 0a 20 20 20  table;.    }.   
eee0: 20 69 66 28 20 69 73 56 69 65 77 20 29 7b 0a 20   if( isView ){. 
eef0: 20 20 20 20 20 69 66 28 20 21 4f 4d 49 54 5f 54       if( !OMIT_T
ef00: 45 4d 50 44 42 20 26 26 20 69 44 62 3d 3d 31 20  EMPDB && iDb==1 
ef10: 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20  ){.        code 
ef20: 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45  = SQLITE_DROP_TE
ef30: 4d 50 5f 56 49 45 57 3b 0a 20 20 20 20 20 20 7d  MP_VIEW;.      }
ef40: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 63 6f  else{.        co
ef50: 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50  de = SQLITE_DROP
ef60: 5f 56 49 45 57 3b 0a 20 20 20 20 20 20 7d 0a 23  _VIEW;.      }.#
ef70: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
ef80: 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
ef90: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 49 73      }else if( Is
efa0: 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 29 7b  Virtual(pTab) ){
efb0: 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
efc0: 65 33 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e  e3ViewGetColumnN
efd0: 61 6d 65 73 28 70 50 61 72 73 65 2c 20 70 54 61  ames(pParse, pTa
efe0: 62 29 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f  b) ){.        go
eff0: 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62  to exit_drop_tab
f000: 6c 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  le;.      }.    
f010: 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f    code = SQLITE_
f020: 44 52 4f 50 5f 56 54 41 42 4c 45 3b 0a 20 20 20  DROP_VTABLE;.   
f030: 20 20 20 7a 41 72 67 32 20 3d 20 70 54 61 62 2d     zArg2 = pTab-
f040: 3e 70 4d 6f 64 2d 3e 7a 4e 61 6d 65 3b 0a 23 65  >pMod->zName;.#e
f050: 6e 64 69 66 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ndif.    }else{.
f060: 20 20 20 20 20 20 69 66 28 20 21 4f 4d 49 54 5f        if( !OMIT_
f070: 54 45 4d 50 44 42 20 26 26 20 69 44 62 3d 3d 31  TEMPDB && iDb==1
f080: 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65   ){.        code
f090: 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54   = SQLITE_DROP_T
f0a0: 45 4d 50 5f 54 41 42 4c 45 3b 0a 20 20 20 20 20  EMP_TABLE;.     
f0b0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
f0c0: 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52  code = SQLITE_DR
f0d0: 4f 50 5f 54 41 42 4c 45 3b 0a 20 20 20 20 20 20  OP_TABLE;.      
f0e0: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
f0f0: 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b  sqlite3AuthCheck
f100: 28 70 50 61 72 73 65 2c 20 63 6f 64 65 2c 20 70  (pParse, code, p
f110: 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 41 72 67  Tab->zName, zArg
f120: 32 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20  2, zDb) ){.     
f130: 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f   goto exit_drop_
f140: 74 61 62 6c 65 3b 0a 20 20 20 20 7d 0a 20 20 20  table;.    }.   
f150: 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68   if( sqlite3Auth
f160: 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51  Check(pParse, SQ
f170: 4c 49 54 45 5f 44 45 4c 45 54 45 2c 20 70 54 61  LITE_DELETE, pTa
f180: 62 2d 3e 7a 4e 61 6d 65 2c 20 30 2c 20 7a 44 62  b->zName, 0, zDb
f190: 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  ) ){.      goto 
f1a0: 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b  exit_drop_table;
f1b0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
f1c0: 66 0a 20 20 69 66 28 20 70 54 61 62 2d 3e 72 65  f.  if( pTab->re
f1d0: 61 64 4f 6e 6c 79 20 7c 7c 20 70 54 61 62 3d 3d  adOnly || pTab==
f1e0: 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53 63  db->aDb[iDb].pSc
f1f0: 68 65 6d 61 2d 3e 70 53 65 71 54 61 62 20 29 7b  hema->pSeqTab ){
f200: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
f210: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 61  rMsg(pParse, "ta
f220: 62 6c 65 20 25 73 20 6d 61 79 20 6e 6f 74 20 62  ble %s may not b
f230: 65 20 64 72 6f 70 70 65 64 22 2c 20 70 54 61 62  e dropped", pTab
f240: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 67 6f  ->zName);.    go
f250: 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62  to exit_drop_tab
f260: 6c 65 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66  le;.  }..#ifndef
f270: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45   SQLITE_OMIT_VIE
f280: 57 0a 20 20 2f 2a 20 45 6e 73 75 72 65 20 44 52  W.  /* Ensure DR
f290: 4f 50 20 54 41 42 4c 45 20 69 73 20 6e 6f 74 20  OP TABLE is not 
f2a0: 75 73 65 64 20 6f 6e 20 61 20 76 69 65 77 2c 20  used on a view, 
f2b0: 61 6e 64 20 44 52 4f 50 20 56 49 45 57 20 69 73  and DROP VIEW is
f2c0: 20 6e 6f 74 20 75 73 65 64 0a 20 20 2a 2a 20 6f   not used.  ** o
f2d0: 6e 20 61 20 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a  n a table..  */.
f2e0: 20 20 69 66 28 20 69 73 56 69 65 77 20 26 26 20    if( isView && 
f2f0: 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 3d 3d 30  pTab->pSelect==0
f300: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
f310: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
f320: 22 75 73 65 20 44 52 4f 50 20 54 41 42 4c 45 20  "use DROP TABLE 
f330: 74 6f 20 64 65 6c 65 74 65 20 74 61 62 6c 65 20  to delete table 
f340: 25 73 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  %s", pTab->zName
f350: 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74  );.    goto exit
f360: 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 7d  _drop_table;.  }
f370: 0a 20 20 69 66 28 20 21 69 73 56 69 65 77 20 26  .  if( !isView &
f380: 26 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20  & pTab->pSelect 
f390: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
f3a0: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
f3b0: 75 73 65 20 44 52 4f 50 20 56 49 45 57 20 74 6f  use DROP VIEW to
f3c0: 20 64 65 6c 65 74 65 20 76 69 65 77 20 25 73 22   delete view %s"
f3d0: 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a  , pTab->zName);.
f3e0: 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72      goto exit_dr
f3f0: 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 23 65  op_table;.  }.#e
f400: 6e 64 69 66 0a 0a 20 20 2f 2a 20 47 65 6e 65 72  ndif..  /* Gener
f410: 61 74 65 20 63 6f 64 65 20 74 6f 20 72 65 6d 6f  ate code to remo
f420: 76 65 20 74 68 65 20 74 61 62 6c 65 20 66 72 6f  ve the table fro
f430: 6d 20 74 68 65 20 6d 61 73 74 65 72 20 74 61 62  m the master tab
f440: 6c 65 0a 20 20 2a 2a 20 6f 6e 20 64 69 73 6b 2e  le.  ** on disk.
f450: 0a 20 20 2a 2f 0a 20 20 76 20 3d 20 73 71 6c 69  .  */.  v = sqli
f460: 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
f470: 65 29 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a 20  e);.  if( v ){. 
f480: 20 20 20 54 72 69 67 67 65 72 20 2a 70 54 72 69     Trigger *pTri
f490: 67 67 65 72 3b 0a 20 20 20 20 44 62 20 2a 70 44  gger;.    Db *pD
f4a0: 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 44 62  b = &db->aDb[iDb
f4b0: 5d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65  ];.    sqlite3Be
f4c0: 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f  ginWriteOperatio
f4d0: 6e 28 70 50 61 72 73 65 2c 20 30 2c 20 69 44 62  n(pParse, 0, iDb
f4e0: 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  );..#ifndef SQLI
f4f0: 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
f500: 41 42 4c 45 0a 20 20 20 20 69 66 28 20 49 73 56  ABLE.    if( IsV
f510: 69 72 74 75 61 6c 28 70 54 61 62 29 20 29 7b 0a  irtual(pTab) ){.
f520: 20 20 20 20 20 20 56 64 62 65 20 2a 76 20 3d 20        Vdbe *v = 
f530: 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
f540: 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 69 66  Parse);.      if
f550: 28 20 76 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ( v ){.        s
f560: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
f570: 76 2c 20 4f 50 5f 56 42 65 67 69 6e 2c 20 30 2c  v, OP_VBegin, 0,
f580: 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
f590: 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f   }.#endif..    /
f5a0: 2a 20 44 72 6f 70 20 61 6c 6c 20 74 72 69 67 67  * Drop all trigg
f5b0: 65 72 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  ers associated w
f5c0: 69 74 68 20 74 68 65 20 74 61 62 6c 65 20 62 65  ith the table be
f5d0: 69 6e 67 20 64 72 6f 70 70 65 64 2e 20 43 6f 64  ing dropped. Cod
f5e0: 65 0a 20 20 20 20 2a 2a 20 69 73 20 67 65 6e 65  e.    ** is gene
f5f0: 72 61 74 65 64 20 74 6f 20 72 65 6d 6f 76 65 20  rated to remove 
f600: 65 6e 74 72 69 65 73 20 66 72 6f 6d 20 73 71 6c  entries from sql
f610: 69 74 65 5f 6d 61 73 74 65 72 20 61 6e 64 2f 6f  ite_master and/o
f620: 72 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 5f  r.    ** sqlite_
f630: 74 65 6d 70 5f 6d 61 73 74 65 72 20 69 66 20 72  temp_master if r
f640: 65 71 75 69 72 65 64 2e 0a 20 20 20 20 2a 2f 0a  equired..    */.
f650: 20 20 20 20 70 54 72 69 67 67 65 72 20 3d 20 70      pTrigger = p
f660: 54 61 62 2d 3e 70 54 72 69 67 67 65 72 3b 0a 20  Tab->pTrigger;. 
f670: 20 20 20 77 68 69 6c 65 28 20 70 54 72 69 67 67     while( pTrigg
f680: 65 72 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  er ){.      asse
f690: 72 74 28 20 70 54 72 69 67 67 65 72 2d 3e 70 53  rt( pTrigger->pS
f6a0: 63 68 65 6d 61 3d 3d 70 54 61 62 2d 3e 70 53 63  chema==pTab->pSc
f6b0: 68 65 6d 61 20 7c 7c 20 0a 20 20 20 20 20 20 20  hema || .       
f6c0: 20 20 20 70 54 72 69 67 67 65 72 2d 3e 70 53 63     pTrigger->pSc
f6d0: 68 65 6d 61 3d 3d 64 62 2d 3e 61 44 62 5b 31 5d  hema==db->aDb[1]
f6e0: 2e 70 53 63 68 65 6d 61 20 29 3b 0a 20 20 20 20  .pSchema );.    
f6f0: 20 20 73 71 6c 69 74 65 33 44 72 6f 70 54 72 69    sqlite3DropTri
f700: 67 67 65 72 50 74 72 28 70 50 61 72 73 65 2c 20  ggerPtr(pParse, 
f710: 70 54 72 69 67 67 65 72 29 3b 0a 20 20 20 20 20  pTrigger);.     
f720: 20 70 54 72 69 67 67 65 72 20 3d 20 70 54 72 69   pTrigger = pTri
f730: 67 67 65 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  gger->pNext;.   
f740: 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   }..#ifndef SQLI
f750: 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 43 52  TE_OMIT_AUTOINCR
f760: 45 4d 45 4e 54 0a 20 20 20 20 2f 2a 20 52 65 6d  EMENT.    /* Rem
f770: 6f 76 65 20 61 6e 79 20 65 6e 74 72 69 65 73 20  ove any entries 
f780: 6f 66 20 74 68 65 20 73 71 6c 69 74 65 5f 73 65  of the sqlite_se
f790: 71 75 65 6e 63 65 20 74 61 62 6c 65 20 61 73 73  quence table ass
f7a0: 6f 63 69 61 74 65 64 20 77 69 74 68 0a 20 20 20  ociated with.   
f7b0: 20 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 62 65   ** the table be
f7c0: 69 6e 67 20 64 72 6f 70 70 65 64 2e 20 54 68 69  ing dropped. Thi
f7d0: 73 20 69 73 20 64 6f 6e 65 20 62 65 66 6f 72 65  s is done before
f7e0: 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 64 72   the table is dr
f7f0: 6f 70 70 65 64 0a 20 20 20 20 2a 2a 20 61 74 20  opped.    ** at 
f800: 74 68 65 20 62 74 72 65 65 20 6c 65 76 65 6c 2c  the btree level,
f810: 20 69 6e 20 63 61 73 65 20 74 68 65 20 73 71 6c   in case the sql
f820: 69 74 65 5f 73 65 71 75 65 6e 63 65 20 74 61 62  ite_sequence tab
f830: 6c 65 20 6e 65 65 64 73 20 74 6f 0a 20 20 20 20  le needs to.    
f840: 2a 2a 20 6d 6f 76 65 20 61 73 20 61 20 72 65 73  ** move as a res
f850: 75 6c 74 20 6f 66 20 74 68 65 20 64 72 6f 70 20  ult of the drop 
f860: 28 63 61 6e 20 68 61 70 70 65 6e 20 69 6e 20 61  (can happen in a
f870: 75 74 6f 2d 76 61 63 75 75 6d 20 6d 6f 64 65 29  uto-vacuum mode)
f880: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
f890: 20 70 54 61 62 2d 3e 61 75 74 6f 49 6e 63 20 29   pTab->autoInc )
f8a0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4e  {.      sqlite3N
f8b0: 65 73 74 65 64 50 61 72 73 65 28 70 50 61 72 73  estedParse(pPars
f8c0: 65 2c 0a 20 20 20 20 20 20 20 20 22 44 45 4c 45  e,.        "DELE
f8d0: 54 45 20 46 52 4f 4d 20 25 73 2e 73 71 6c 69 74  TE FROM %s.sqlit
f8e0: 65 5f 73 65 71 75 65 6e 63 65 20 57 48 45 52 45  e_sequence WHERE
f8f0: 20 6e 61 6d 65 3d 25 51 22 2c 0a 20 20 20 20 20   name=%Q",.     
f900: 20 20 20 70 44 62 2d 3e 7a 4e 61 6d 65 2c 20 70     pDb->zName, p
f910: 54 61 62 2d 3e 7a 4e 61 6d 65 0a 20 20 20 20 20  Tab->zName.     
f920: 20 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66   );.    }.#endif
f930: 0a 0a 20 20 20 20 2f 2a 20 44 72 6f 70 20 61 6c  ..    /* Drop al
f940: 6c 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52 20  l SQLITE_MASTER 
f950: 74 61 62 6c 65 20 61 6e 64 20 69 6e 64 65 78 20  table and index 
f960: 65 6e 74 72 69 65 73 20 74 68 61 74 20 72 65 66  entries that ref
f970: 65 72 20 74 6f 20 74 68 65 0a 20 20 20 20 2a 2a  er to the.    **
f980: 20 74 61 62 6c 65 2e 20 54 68 65 20 70 72 6f 67   table. The prog
f990: 72 61 6d 20 6e 61 6d 65 20 6c 6f 6f 70 73 20 74  ram name loops t
f9a0: 68 72 6f 75 67 68 20 74 68 65 20 6d 61 73 74 65  hrough the maste
f9b0: 72 20 74 61 62 6c 65 20 61 6e 64 20 64 65 6c 65  r table and dele
f9c0: 74 65 73 0a 20 20 20 20 2a 2a 20 65 76 65 72 79  tes.    ** every
f9d0: 20 72 6f 77 20 74 68 61 74 20 72 65 66 65 72 73   row that refers
f9e0: 20 74 6f 20 61 20 74 61 62 6c 65 20 6f 66 20 74   to a table of t
f9f0: 68 65 20 73 61 6d 65 20 6e 61 6d 65 20 61 73 20  he same name as 
fa00: 74 68 65 20 6f 6e 65 20 62 65 69 6e 67 0a 20 20  the one being.  
fa10: 20 20 2a 2a 20 64 72 6f 70 70 65 64 2e 20 54 72    ** dropped. Tr
fa20: 69 67 67 65 72 73 20 61 72 65 20 68 61 6e 64 6c  iggers are handl
fa30: 65 64 20 73 65 70 65 72 61 74 65 6c 79 20 62 65  ed seperately be
fa40: 63 61 75 73 65 20 61 20 74 72 69 67 67 65 72 20  cause a trigger 
fa50: 63 61 6e 20 62 65 0a 20 20 20 20 2a 2a 20 63 72  can be.    ** cr
fa60: 65 61 74 65 64 20 69 6e 20 74 68 65 20 74 65 6d  eated in the tem
fa70: 70 20 64 61 74 61 62 61 73 65 20 74 68 61 74 20  p database that 
fa80: 72 65 66 65 72 73 20 74 6f 20 61 20 74 61 62 6c  refers to a tabl
fa90: 65 20 69 6e 20 61 6e 6f 74 68 65 72 0a 20 20 20  e in another.   
faa0: 20 2a 2a 20 64 61 74 61 62 61 73 65 2e 0a 20 20   ** database..  
fab0: 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33    */.    sqlite3
fac0: 4e 65 73 74 65 64 50 61 72 73 65 28 70 50 61 72  NestedParse(pPar
fad0: 73 65 2c 20 0a 20 20 20 20 20 20 20 20 22 44 45  se, .        "DE
fae0: 4c 45 54 45 20 46 52 4f 4d 20 25 51 2e 25 73 20  LETE FROM %Q.%s 
faf0: 57 48 45 52 45 20 74 62 6c 5f 6e 61 6d 65 3d 25  WHERE tbl_name=%
fb00: 51 20 61 6e 64 20 74 79 70 65 21 3d 27 74 72 69  Q and type!='tri
fb10: 67 67 65 72 27 22 2c 0a 20 20 20 20 20 20 20 20  gger'",.        
fb20: 70 44 62 2d 3e 7a 4e 61 6d 65 2c 20 53 43 48 45  pDb->zName, SCHE
fb30: 4d 41 5f 54 41 42 4c 45 28 69 44 62 29 2c 20 70  MA_TABLE(iDb), p
fb40: 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  Tab->zName);.   
fb50: 20 69 66 28 20 21 69 73 56 69 65 77 20 26 26 20   if( !isView && 
fb60: 21 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29  !IsVirtual(pTab)
fb70: 20 29 7b 0a 20 20 20 20 20 20 64 65 73 74 72 6f   ){.      destro
fb80: 79 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70  yTable(pParse, p
fb90: 54 61 62 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  Tab);.    }..   
fba0: 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 74   /* Remove the t
fbb0: 61 62 6c 65 20 65 6e 74 72 79 20 66 72 6f 6d 20  able entry from 
fbc0: 53 51 4c 69 74 65 27 73 20 69 6e 74 65 72 6e 61  SQLite's interna
fbd0: 6c 20 73 63 68 65 6d 61 20 61 6e 64 20 6d 6f 64  l schema and mod
fbe0: 69 66 79 0a 20 20 20 20 2a 2a 20 74 68 65 20 73  ify.    ** the s
fbf0: 63 68 65 6d 61 20 63 6f 6f 6b 69 65 2e 0a 20 20  chema cookie..  
fc00: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 49 73 56    */.    if( IsV
fc10: 69 72 74 75 61 6c 28 70 54 61 62 29 20 29 7b 0a  irtual(pTab) ){.
fc20: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
fc30: 65 4f 70 33 28 76 2c 20 4f 50 5f 56 44 65 73 74  eOp3(v, OP_VDest
fc40: 72 6f 79 2c 20 69 44 62 2c 20 30 2c 20 70 54 61  roy, iDb, 0, pTa
fc50: 62 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20  b->zName, 0);.  
fc60: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56    }.    sqlite3V
fc70: 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 44 72 6f  dbeOp3(v, OP_Dro
fc80: 70 54 61 62 6c 65 2c 20 69 44 62 2c 20 30 2c 20  pTable, iDb, 0, 
fc90: 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b  pTab->zName, 0);
fca0: 0a 20 20 20 20 73 71 6c 69 74 65 33 43 68 61 6e  .    sqlite3Chan
fcb0: 67 65 43 6f 6f 6b 69 65 28 64 62 2c 20 76 2c 20  geCookie(db, v, 
fcc0: 69 44 62 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  iDb);.  }.  sqli
fcd0: 74 65 56 69 65 77 52 65 73 65 74 41 6c 6c 28 64  teViewResetAll(d
fce0: 62 2c 20 69 44 62 29 3b 0a 0a 65 78 69 74 5f 64  b, iDb);..exit_d
fcf0: 72 6f 70 5f 74 61 62 6c 65 3a 0a 20 20 73 71 6c  rop_table:.  sql
fd00: 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74  ite3SrcListDelet
fd10: 65 28 70 4e 61 6d 65 29 3b 0a 7d 0a 0a 2f 2a 0a  e(pName);.}../*.
fd20: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
fd30: 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 63 72 65  is called to cre
fd40: 61 74 65 20 61 20 6e 65 77 20 66 6f 72 65 69 67  ate a new foreig
fd50: 6e 20 6b 65 79 20 6f 6e 20 74 68 65 20 74 61 62  n key on the tab
fd60: 6c 65 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20  le.** currently 
fd70: 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69  under constructi
fd80: 6f 6e 2e 20 20 70 46 72 6f 6d 43 6f 6c 20 64 65  on.  pFromCol de
fd90: 74 65 72 6d 69 6e 65 73 20 77 68 69 63 68 20 63  termines which c
fda0: 6f 6c 75 6d 6e 73 0a 2a 2a 20 69 6e 20 74 68 65  olumns.** in the
fdb0: 20 63 75 72 72 65 6e 74 20 74 61 62 6c 65 20 70   current table p
fdc0: 6f 69 6e 74 20 74 6f 20 74 68 65 20 66 6f 72 65  oint to the fore
fdd0: 69 67 6e 20 6b 65 79 2e 20 20 49 66 20 70 46 72  ign key.  If pFr
fde0: 6f 6d 43 6f 6c 3d 3d 30 20 74 68 65 6e 0a 2a 2a  omCol==0 then.**
fdf0: 20 63 6f 6e 6e 65 63 74 20 74 68 65 20 6b 65 79   connect the key
fe00: 20 74 6f 20 74 68 65 20 6c 61 73 74 20 63 6f 6c   to the last col
fe10: 75 6d 6e 20 69 6e 73 65 72 74 65 64 2e 20 20 70  umn inserted.  p
fe20: 54 6f 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f  To is the name o
fe30: 66 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 72  f.** the table r
fe40: 65 66 65 72 72 65 64 20 74 6f 2e 20 20 70 54 6f  eferred to.  pTo
fe50: 43 6f 6c 20 69 73 20 61 20 6c 69 73 74 20 6f 66  Col is a list of
fe60: 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20 6f   tables in the o
fe70: 74 68 65 72 0a 2a 2a 20 70 54 6f 20 74 61 62 6c  ther.** pTo tabl
fe80: 65 20 74 68 61 74 20 74 68 65 20 66 6f 72 65 69  e that the forei
fe90: 67 6e 20 6b 65 79 20 70 6f 69 6e 74 73 20 74 6f  gn key points to
fea0: 2e 20 20 66 6c 61 67 73 20 63 6f 6e 74 61 69 6e  .  flags contain
feb0: 73 20 61 6c 6c 0a 2a 2a 20 69 6e 66 6f 72 6d 61  s all.** informa
fec0: 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 63  tion about the c
fed0: 6f 6e 66 6c 69 63 74 20 72 65 73 6f 6c 75 74 69  onflict resoluti
fee0: 6f 6e 20 61 6c 67 6f 72 69 74 68 6d 73 20 73 70  on algorithms sp
fef0: 65 63 69 66 69 65 64 0a 2a 2a 20 69 6e 20 74 68  ecified.** in th
ff00: 65 20 4f 4e 20 44 45 4c 45 54 45 2c 20 4f 4e 20  e ON DELETE, ON 
ff10: 55 50 44 41 54 45 20 61 6e 64 20 4f 4e 20 49 4e  UPDATE and ON IN
ff20: 53 45 52 54 20 63 6c 61 75 73 65 73 2e 0a 2a 2a  SERT clauses..**
ff30: 0a 2a 2a 20 41 6e 20 46 4b 65 79 20 73 74 72 75  .** An FKey stru
ff40: 63 74 75 72 65 20 69 73 20 63 72 65 61 74 65 64  cture is created
ff50: 20 61 6e 64 20 61 64 64 65 64 20 74 6f 20 74 68   and added to th
ff60: 65 20 74 61 62 6c 65 20 63 75 72 72 65 6e 74 6c  e table currentl
ff70: 79 0a 2a 2a 20 75 6e 64 65 72 20 63 6f 6e 73 74  y.** under const
ff80: 72 75 63 74 69 6f 6e 20 69 6e 20 74 68 65 20 70  ruction in the p
ff90: 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
ffa0: 20 66 69 65 6c 64 2e 20 20 54 68 65 20 6e 65 77   field.  The new
ffb0: 20 46 4b 65 79 0a 2a 2a 20 69 73 20 6e 6f 74 20   FKey.** is not 
ffc0: 6c 69 6e 6b 65 64 20 69 6e 74 6f 20 64 62 2d 3e  linked into db->
ffd0: 61 46 4b 65 79 20 61 74 20 74 68 69 73 20 70 6f  aFKey at this po
ffe0: 69 6e 74 20 2d 20 74 68 61 74 20 64 6f 65 73 20  int - that does 
fff0: 6e 6f 74 20 68 61 70 70 65 6e 0a 2a 2a 20 75 6e  not happen.** un
10000 74 69 6c 20 73 71 6c 69 74 65 33 45 6e 64 54 61  til sqlite3EndTa
10010 62 6c 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ble()..**.** The
10020 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 69 73 20   foreign key is 
10030 73 65 74 20 66 6f 72 20 49 4d 4d 45 44 49 41 54  set for IMMEDIAT
10040 45 20 70 72 6f 63 65 73 73 69 6e 67 2e 20 20 41  E processing.  A
10050 20 73 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c   subsequent call
10060 0a 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33 44 65  .** to sqlite3De
10070 66 65 72 46 6f 72 65 69 67 6e 4b 65 79 28 29 20  ferForeignKey() 
10080 6d 69 67 68 74 20 63 68 61 6e 67 65 20 74 68 69  might change thi
10090 73 20 74 6f 20 44 45 46 45 52 52 45 44 2e 0a 2a  s to DEFERRED..*
100a0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 72  /.void sqlite3Cr
100b0 65 61 74 65 46 6f 72 65 69 67 6e 4b 65 79 28 0a  eateForeignKey(.
100c0 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
100d0 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
100e0 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45  g context */.  E
100f0 78 70 72 4c 69 73 74 20 2a 70 46 72 6f 6d 43 6f  xprList *pFromCo
10100 6c 2c 20 20 2f 2a 20 43 6f 6c 75 6d 6e 73 20 69  l,  /* Columns i
10110 6e 20 74 68 69 73 20 74 61 62 6c 65 20 74 68 61  n this table tha
10120 74 20 70 6f 69 6e 74 20 74 6f 20 6f 74 68 65 72  t point to other
10130 20 74 61 62 6c 65 20 2a 2f 0a 20 20 54 6f 6b 65   table */.  Toke
10140 6e 20 2a 70 54 6f 2c 20 20 20 20 20 20 20 20 20  n *pTo,         
10150 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
10160 6f 74 68 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20  other table */. 
10170 20 45 78 70 72 4c 69 73 74 20 2a 70 54 6f 43 6f   ExprList *pToCo
10180 6c 2c 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 73  l,    /* Columns
10190 20 69 6e 20 74 68 65 20 6f 74 68 65 72 20 74 61   in the other ta
101a0 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61  ble */.  int fla
101b0 67 73 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  gs            /*
101c0 20 43 6f 6e 66 6c 69 63 74 20 72 65 73 6f 6c 75   Conflict resolu
101d0 74 69 6f 6e 20 61 6c 67 6f 72 69 74 68 6d 73 2e  tion algorithms.
101e0 20 2a 2f 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53   */.){.#ifndef S
101f0 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49  QLITE_OMIT_FOREI
10200 47 4e 5f 4b 45 59 0a 20 20 46 4b 65 79 20 2a 70  GN_KEY.  FKey *p
10210 46 4b 65 79 20 3d 20 30 3b 0a 20 20 54 61 62 6c  FKey = 0;.  Tabl
10220 65 20 2a 70 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *p = pParse->p
10230 4e 65 77 54 61 62 6c 65 3b 0a 20 20 69 6e 74 20  NewTable;.  int 
10240 6e 42 79 74 65 3b 0a 20 20 69 6e 74 20 69 3b 0a  nByte;.  int i;.
10250 20 20 69 6e 74 20 6e 43 6f 6c 3b 0a 20 20 63 68    int nCol;.  ch
10260 61 72 20 2a 7a 3b 0a 0a 20 20 61 73 73 65 72 74  ar *z;..  assert
10270 28 20 70 54 6f 21 3d 30 20 29 3b 0a 20 20 69 66  ( pTo!=0 );.  if
10280 28 20 70 3d 3d 30 20 7c 7c 20 70 50 61 72 73 65  ( p==0 || pParse
10290 2d 3e 6e 45 72 72 20 7c 7c 20 49 4e 5f 44 45 43  ->nErr || IN_DEC
102a0 4c 41 52 45 5f 56 54 41 42 20 29 20 67 6f 74 6f  LARE_VTAB ) goto
102b0 20 66 6b 5f 65 6e 64 3b 0a 20 20 69 66 28 20 70   fk_end;.  if( p
102c0 46 72 6f 6d 43 6f 6c 3d 3d 30 20 29 7b 0a 20 20  FromCol==0 ){.  
102d0 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 2d 3e    int iCol = p->
102e0 6e 43 6f 6c 2d 31 3b 0a 20 20 20 20 69 66 28 20  nCol-1;.    if( 
102f0 69 43 6f 6c 3c 30 20 29 20 67 6f 74 6f 20 66 6b  iCol<0 ) goto fk
10300 5f 65 6e 64 3b 0a 20 20 20 20 69 66 28 20 70 54  _end;.    if( pT
10310 6f 43 6f 6c 20 26 26 20 70 54 6f 43 6f 6c 2d 3e  oCol && pToCol->
10320 6e 45 78 70 72 21 3d 31 20 29 7b 0a 20 20 20 20  nExpr!=1 ){.    
10330 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
10340 67 28 70 50 61 72 73 65 2c 20 22 66 6f 72 65 69  g(pParse, "forei
10350 67 6e 20 6b 65 79 20 6f 6e 20 25 73 22 0a 20 20  gn key on %s".  
10360 20 20 20 20 20 20 20 22 20 73 68 6f 75 6c 64 20         " should 
10370 72 65 66 65 72 65 6e 63 65 20 6f 6e 6c 79 20 6f  reference only o
10380 6e 65 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 61 62  ne column of tab
10390 6c 65 20 25 54 22 2c 0a 20 20 20 20 20 20 20 20  le %T",.        
103a0 20 70 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a   p->aCol[iCol].z
103b0 4e 61 6d 65 2c 20 70 54 6f 29 3b 0a 20 20 20 20  Name, pTo);.    
103c0 20 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20    goto fk_end;. 
103d0 20 20 20 7d 0a 20 20 20 20 6e 43 6f 6c 20 3d 20     }.    nCol = 
103e0 31 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  1;.  }else if( p
103f0 54 6f 43 6f 6c 20 26 26 20 70 54 6f 43 6f 6c 2d  ToCol && pToCol-
10400 3e 6e 45 78 70 72 21 3d 70 46 72 6f 6d 43 6f 6c  >nExpr!=pFromCol
10410 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 73  ->nExpr ){.    s
10420 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
10430 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20 22  Parse,.        "
10440 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e  number of column
10450 73 20 69 6e 20 66 6f 72 65 69 67 6e 20 6b 65 79  s in foreign key
10460 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 20   does not match 
10470 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 22 0a  the number of ".
10480 20 20 20 20 20 20 20 20 22 63 6f 6c 75 6d 6e 73          "columns
10490 20 69 6e 20 74 68 65 20 72 65 66 65 72 65 6e 63   in the referenc
104a0 65 64 20 74 61 62 6c 65 22 29 3b 0a 20 20 20 20  ed table");.    
104b0 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 7d  goto fk_end;.  }
104c0 65 6c 73 65 7b 0a 20 20 20 20 6e 43 6f 6c 20 3d  else{.    nCol =
104d0 20 70 46 72 6f 6d 43 6f 6c 2d 3e 6e 45 78 70 72   pFromCol->nExpr
104e0 3b 0a 20 20 7d 0a 20 20 6e 42 79 74 65 20 3d 20  ;.  }.  nByte = 
104f0 73 69 7a 65 6f 66 28 2a 70 46 4b 65 79 29 20 2b  sizeof(*pFKey) +
10500 20 6e 43 6f 6c 2a 73 69 7a 65 6f 66 28 70 46 4b   nCol*sizeof(pFK
10510 65 79 2d 3e 61 43 6f 6c 5b 30 5d 29 20 2b 20 70  ey->aCol[0]) + p
10520 54 6f 2d 3e 6e 20 2b 20 31 3b 0a 20 20 69 66 28  To->n + 1;.  if(
10530 20 70 54 6f 43 6f 6c 20 29 7b 0a 20 20 20 20 66   pToCol ){.    f
10540 6f 72 28 69 3d 30 3b 20 69 3c 70 54 6f 43 6f 6c  or(i=0; i<pToCol
10550 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
10560 20 20 20 20 20 6e 42 79 74 65 20 2b 3d 20 73 74       nByte += st
10570 72 6c 65 6e 28 70 54 6f 43 6f 6c 2d 3e 61 5b 69  rlen(pToCol->a[i
10580 5d 2e 7a 4e 61 6d 65 29 20 2b 20 31 3b 0a 20 20  ].zName) + 1;.  
10590 20 20 7d 0a 20 20 7d 0a 20 20 70 46 4b 65 79 20    }.  }.  pFKey 
105a0 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20  = sqliteMalloc( 
105b0 6e 42 79 74 65 20 29 3b 0a 20 20 69 66 28 20 70  nByte );.  if( p
105c0 46 4b 65 79 3d 3d 30 20 29 20 67 6f 74 6f 20 66  FKey==0 ) goto f
105d0 6b 5f 65 6e 64 3b 0a 20 20 70 46 4b 65 79 2d 3e  k_end;.  pFKey->
105e0 70 46 72 6f 6d 20 3d 20 70 3b 0a 20 20 70 46 4b  pFrom = p;.  pFK
105f0 65 79 2d 3e 70 4e 65 78 74 46 72 6f 6d 20 3d 20  ey->pNextFrom = 
10600 70 2d 3e 70 46 4b 65 79 3b 0a 20 20 7a 20 3d 20  p->pFKey;.  z = 
10610 28 63 68 61 72 2a 29 26 70 46 4b 65 79 5b 31 5d  (char*)&pFKey[1]
10620 3b 0a 20 20 70 46 4b 65 79 2d 3e 61 43 6f 6c 20  ;.  pFKey->aCol 
10630 3d 20 28 73 74 72 75 63 74 20 73 43 6f 6c 4d 61  = (struct sColMa
10640 70 2a 29 7a 3b 0a 20 20 7a 20 2b 3d 20 73 69 7a  p*)z;.  z += siz
10650 65 6f 66 28 73 74 72 75 63 74 20 73 43 6f 6c 4d  eof(struct sColM
10660 61 70 29 2a 6e 43 6f 6c 3b 0a 20 20 70 46 4b 65  ap)*nCol;.  pFKe
10670 79 2d 3e 7a 54 6f 20 3d 20 7a 3b 0a 20 20 6d 65  y->zTo = z;.  me
10680 6d 63 70 79 28 7a 2c 20 70 54 6f 2d 3e 7a 2c 20  mcpy(z, pTo->z, 
10690 70 54 6f 2d 3e 6e 29 3b 0a 20 20 7a 5b 70 54 6f  pTo->n);.  z[pTo
106a0 2d 3e 6e 5d 20 3d 20 30 3b 0a 20 20 7a 20 2b 3d  ->n] = 0;.  z +=
106b0 20 70 54 6f 2d 3e 6e 2b 31 3b 0a 20 20 70 46 4b   pTo->n+1;.  pFK
106c0 65 79 2d 3e 70 4e 65 78 74 54 6f 20 3d 20 30 3b  ey->pNextTo = 0;
106d0 0a 20 20 70 46 4b 65 79 2d 3e 6e 43 6f 6c 20 3d  .  pFKey->nCol =
106e0 20 6e 43 6f 6c 3b 0a 20 20 69 66 28 20 70 46 72   nCol;.  if( pFr
106f0 6f 6d 43 6f 6c 3d 3d 30 20 29 7b 0a 20 20 20 20  omCol==0 ){.    
10700 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b 30 5d 2e 69  pFKey->aCol[0].i
10710 46 72 6f 6d 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31  From = p->nCol-1
10720 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66  ;.  }else{.    f
10730 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20  or(i=0; i<nCol; 
10740 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  i++){.      int 
10750 6a 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30  j;.      for(j=0
10760 3b 20 6a 3c 70 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b  ; j<p->nCol; j++
10770 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73  ){.        if( s
10780 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 2d  qlite3StrICmp(p-
10790 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 2c 20  >aCol[j].zName, 
107a0 70 46 72 6f 6d 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a  pFromCol->a[i].z
107b0 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20  Name)==0 ){.    
107c0 20 20 20 20 20 20 70 46 4b 65 79 2d 3e 61 43 6f        pFKey->aCo
107d0 6c 5b 69 5d 2e 69 46 72 6f 6d 20 3d 20 6a 3b 0a  l[i].iFrom = j;.
107e0 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
107f0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
10800 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6a 3e 3d   }.      if( j>=
10810 70 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 20  p->nCol ){.     
10820 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
10830 73 67 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20  sg(pParse, .    
10840 20 20 20 20 20 20 22 75 6e 6b 6e 6f 77 6e 20 63        "unknown c
10850 6f 6c 75 6d 6e 20 5c 22 25 73 5c 22 20 69 6e 20  olumn \"%s\" in 
10860 66 6f 72 65 69 67 6e 20 6b 65 79 20 64 65 66 69  foreign key defi
10870 6e 69 74 69 6f 6e 22 2c 20 0a 20 20 20 20 20 20  nition", .      
10880 20 20 20 20 70 46 72 6f 6d 43 6f 6c 2d 3e 61 5b      pFromCol->a[
10890 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  i].zName);.     
108a0 20 20 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a     goto fk_end;.
108b0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
108c0 7d 0a 20 20 69 66 28 20 70 54 6f 43 6f 6c 20 29  }.  if( pToCol )
108d0 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  {.    for(i=0; i
108e0 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nCol; i++){.   
108f0 20 20 20 69 6e 74 20 6e 20 3d 20 73 74 72 6c 65     int n = strle
10900 6e 28 70 54 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a  n(pToCol->a[i].z
10910 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 70 46 4b  Name);.      pFK
10920 65 79 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 43 6f 6c  ey->aCol[i].zCol
10930 20 3d 20 7a 3b 0a 20 20 20 20 20 20 6d 65 6d 63   = z;.      memc
10940 70 79 28 7a 2c 20 70 54 6f 43 6f 6c 2d 3e 61 5b  py(z, pToCol->a[
10950 69 5d 2e 7a 4e 61 6d 65 2c 20 6e 29 3b 0a 20 20  i].zName, n);.  
10960 20 20 20 20 7a 5b 6e 5d 20 3d 20 30 3b 0a 20 20      z[n] = 0;.  
10970 20 20 20 20 7a 20 2b 3d 20 6e 2b 31 3b 0a 20 20      z += n+1;.  
10980 20 20 7d 0a 20 20 7d 0a 20 20 70 46 4b 65 79 2d    }.  }.  pFKey-
10990 3e 69 73 44 65 66 65 72 72 65 64 20 3d 20 30 3b  >isDeferred = 0;
109a0 0a 20 20 70 46 4b 65 79 2d 3e 64 65 6c 65 74 65  .  pFKey->delete
109b0 43 6f 6e 66 20 3d 20 66 6c 61 67 73 20 26 20 30  Conf = flags & 0
109c0 78 66 66 3b 0a 20 20 70 46 4b 65 79 2d 3e 75 70  xff;.  pFKey->up
109d0 64 61 74 65 43 6f 6e 66 20 3d 20 28 66 6c 61 67  dateConf = (flag
109e0 73 20 3e 3e 20 38 20 29 20 26 20 30 78 66 66 3b  s >> 8 ) & 0xff;
109f0 0a 20 20 70 46 4b 65 79 2d 3e 69 6e 73 65 72 74  .  pFKey->insert
10a00 43 6f 6e 66 20 3d 20 28 66 6c 61 67 73 20 3e 3e  Conf = (flags >>
10a10 20 31 36 20 29 20 26 20 30 78 66 66 3b 0a 0a 20   16 ) & 0xff;.. 
10a20 20 2f 2a 20 4c 69 6e 6b 20 74 68 65 20 66 6f 72   /* Link the for
10a30 65 69 67 6e 20 6b 65 79 20 74 6f 20 74 68 65 20  eign key to the 
10a40 74 61 62 6c 65 20 61 73 20 74 68 65 20 6c 61 73  table as the las
10a50 74 20 73 74 65 70 2e 0a 20 20 2a 2f 0a 20 20 70  t step..  */.  p
10a60 2d 3e 70 46 4b 65 79 20 3d 20 70 46 4b 65 79 3b  ->pFKey = pFKey;
10a70 0a 20 20 70 46 4b 65 79 20 3d 20 30 3b 0a 0a 66  .  pFKey = 0;..f
10a80 6b 5f 65 6e 64 3a 0a 20 20 73 71 6c 69 74 65 46  k_end:.  sqliteF
10a90 72 65 65 28 70 46 4b 65 79 29 3b 0a 23 65 6e 64  ree(pFKey);.#end
10aa0 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53  if /* !defined(S
10ab0 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49  QLITE_OMIT_FOREI
10ac0 47 4e 5f 4b 45 59 29 20 2a 2f 0a 20 20 73 71 6c  GN_KEY) */.  sql
10ad0 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65  ite3ExprListDele
10ae0 74 65 28 70 46 72 6f 6d 43 6f 6c 29 3b 0a 20 20  te(pFromCol);.  
10af0 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
10b00 65 6c 65 74 65 28 70 54 6f 43 6f 6c 29 3b 0a 7d  elete(pToCol);.}
10b10 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
10b20 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77  tine is called w
10b30 68 65 6e 20 61 6e 20 49 4e 49 54 49 41 4c 4c 59  hen an INITIALLY
10b40 20 49 4d 4d 45 44 49 41 54 45 20 6f 72 20 49 4e   IMMEDIATE or IN
10b50 49 54 49 41 4c 4c 59 20 44 45 46 45 52 52 45 44  ITIALLY DEFERRED
10b60 0a 2a 2a 20 63 6c 61 75 73 65 20 69 73 20 73 65  .** clause is se
10b70 65 6e 20 61 73 20 70 61 72 74 20 6f 66 20 61 20  en as part of a 
10b80 66 6f 72 65 69 67 6e 20 6b 65 79 20 64 65 66 69  foreign key defi
10b90 6e 69 74 69 6f 6e 2e 20 20 54 68 65 20 69 73 44  nition.  The isD
10ba0 65 66 65 72 72 65 64 0a 2a 2a 20 70 61 72 61 6d  eferred.** param
10bb0 65 74 65 72 20 69 73 20 31 20 66 6f 72 20 49 4e  eter is 1 for IN
10bc0 49 54 49 41 4c 4c 59 20 44 45 46 45 52 52 45 44  ITIALLY DEFERRED
10bd0 20 61 6e 64 20 30 20 66 6f 72 20 49 4e 49 54 49   and 0 for INITI
10be0 41 4c 4c 59 20 49 4d 4d 45 44 49 41 54 45 2e 0a  ALLY IMMEDIATE..
10bf0 2a 2a 20 54 68 65 20 62 65 68 61 76 69 6f 72 20  ** The behavior 
10c00 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  of the most rece
10c10 6e 74 6c 79 20 63 72 65 61 74 65 64 20 66 6f 72  ntly created for
10c20 65 69 67 6e 20 6b 65 79 20 69 73 20 61 64 6a 75  eign key is adju
10c30 73 74 65 64 0a 2a 2a 20 61 63 63 6f 72 64 69 6e  sted.** accordin
10c40 67 6c 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  gly..*/.void sql
10c50 69 74 65 33 44 65 66 65 72 46 6f 72 65 69 67 6e  ite3DeferForeign
10c60 4b 65 79 28 50 61 72 73 65 20 2a 70 50 61 72 73  Key(Parse *pPars
10c70 65 2c 20 69 6e 74 20 69 73 44 65 66 65 72 72 65  e, int isDeferre
10c80 64 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  d){.#ifndef SQLI
10c90 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f  TE_OMIT_FOREIGN_
10ca0 4b 45 59 0a 20 20 54 61 62 6c 65 20 2a 70 54 61  KEY.  Table *pTa
10cb0 62 3b 0a 20 20 46 4b 65 79 20 2a 70 46 4b 65 79  b;.  FKey *pFKey
10cc0 3b 0a 20 20 69 66 28 20 28 70 54 61 62 20 3d 20  ;.  if( (pTab = 
10cd0 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
10ce0 65 29 3d 3d 30 20 7c 7c 20 28 70 46 4b 65 79 20  e)==0 || (pFKey 
10cf0 3d 20 70 54 61 62 2d 3e 70 46 4b 65 79 29 3d 3d  = pTab->pFKey)==
10d00 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 46  0 ) return;.  pF
10d10 4b 65 79 2d 3e 69 73 44 65 66 65 72 72 65 64 20  Key->isDeferred 
10d20 3d 20 69 73 44 65 66 65 72 72 65 64 3b 0a 23 65  = isDeferred;.#e
10d30 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  ndif.}../*.** Ge
10d40 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74  nerate code that
10d50 20 77 69 6c 6c 20 65 72 61 73 65 20 61 6e 64 20   will erase and 
10d60 72 65 66 69 6c 6c 20 69 6e 64 65 78 20 2a 70 49  refill index *pI
10d70 64 78 2e 20 20 54 68 69 73 20 69 73 0a 2a 2a 20  dx.  This is.** 
10d80 75 73 65 64 20 74 6f 20 69 6e 69 74 69 61 6c 69  used to initiali
10d90 7a 65 20 61 20 6e 65 77 6c 79 20 63 72 65 61 74  ze a newly creat
10da0 65 64 20 69 6e 64 65 78 20 6f 72 20 74 6f 20 72  ed index or to r
10db0 65 63 6f 6d 70 75 74 65 20 74 68 65 0a 2a 2a 20  ecompute the.** 
10dc0 63 6f 6e 74 65 6e 74 20 6f 66 20 61 6e 20 69 6e  content of an in
10dd0 64 65 78 20 69 6e 20 72 65 73 70 6f 6e 73 65 20  dex in response 
10de0 74 6f 20 61 20 52 45 49 4e 44 45 58 20 63 6f 6d  to a REINDEX com
10df0 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 69 66 20 6d  mand..**.** if m
10e00 65 6d 52 6f 6f 74 50 61 67 65 20 69 73 20 6e 6f  emRootPage is no
10e10 74 20 6e 65 67 61 74 69 76 65 2c 20 69 74 20 6d  t negative, it m
10e20 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 69 6e  eans that the in
10e30 64 65 78 20 69 73 20 6e 65 77 6c 79 0a 2a 2a 20  dex is newly.** 
10e40 63 72 65 61 74 65 64 2e 20 20 54 68 65 20 6d 65  created.  The me
10e50 6d 6f 72 79 20 63 65 6c 6c 20 73 70 65 63 69 66  mory cell specif
10e60 69 65 64 20 62 79 20 6d 65 6d 52 6f 6f 74 50 61  ied by memRootPa
10e70 67 65 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 0a  ge contains the.
10e80 2a 2a 20 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d  ** root page num
10e90 62 65 72 20 6f 66 20 74 68 65 20 69 6e 64 65 78  ber of the index
10ea0 2e 20 20 49 66 20 6d 65 6d 52 6f 6f 74 50 61 67  .  If memRootPag
10eb0 65 20 69 73 20 6e 65 67 61 74 69 76 65 2c 20 74  e is negative, t
10ec0 68 65 6e 0a 2a 2a 20 74 68 65 20 69 6e 64 65 78  hen.** the index
10ed0 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 20   already exists 
10ee0 61 6e 64 20 6d 75 73 74 20 62 65 20 63 6c 65 61  and must be clea
10ef0 72 65 64 20 62 65 66 6f 72 65 20 62 65 69 6e 67  red before being
10f00 20 72 65 66 69 6c 6c 65 64 20 61 6e 64 0a 2a 2a   refilled and.**
10f10 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6e   the root page n
10f20 75 6d 62 65 72 20 6f 66 20 74 68 65 20 69 6e 64  umber of the ind
10f30 65 78 20 69 73 20 74 61 6b 65 6e 20 66 72 6f 6d  ex is taken from
10f40 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 2e 0a 2a   pIndex->tnum..*
10f50 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 71  /.static void sq
10f60 6c 69 74 65 33 52 65 66 69 6c 6c 49 6e 64 65 78  lite3RefillIndex
10f70 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
10f80 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 2c 20 69  Index *pIndex, i
10f90 6e 74 20 6d 65 6d 52 6f 6f 74 50 61 67 65 29 7b  nt memRootPage){
10fa0 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d  .  Table *pTab =
10fb0 20 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 3b   pIndex->pTable;
10fc0 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 74    /* The table t
10fd0 68 61 74 20 69 73 20 69 6e 64 65 78 65 64 20 2a  hat is indexed *
10fe0 2f 0a 20 20 69 6e 74 20 69 54 61 62 20 3d 20 70  /.  int iTab = p
10ff0 50 61 72 73 65 2d 3e 6e 54 61 62 3b 20 20 20 20  Parse->nTab;    
11000 20 20 20 2f 2a 20 42 74 72 65 65 20 63 75 72 73     /* Btree curs
11010 6f 72 20 75 73 65 64 20 66 6f 72 20 70 54 61 62  or used for pTab
11020 20 2a 2f 0a 20 20 69 6e 74 20 69 49 64 78 20 3d   */.  int iIdx =
11030 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 31 3b   pParse->nTab+1;
11040 20 20 20 20 20 2f 2a 20 42 74 72 65 65 20 63 75       /* Btree cu
11050 72 73 6f 72 20 75 73 65 64 20 66 6f 72 20 70 49  rsor used for pI
11060 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 61 64  ndex */.  int ad
11070 64 72 31 3b 20 20 20 20 20 20 20 20 20 20 20 20  dr1;            
11080 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72           /* Addr
11090 65 73 73 20 6f 66 20 74 6f 70 20 6f 66 20 6c 6f  ess of top of lo
110a0 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 74 6e 75 6d  op */.  int tnum
110b0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
110c0 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70         /* Root p
110d0 61 67 65 20 6f 66 20 69 6e 64 65 78 20 2a 2f 0a  age of index */.
110e0 20 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20 20    Vdbe *v;      
110f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11100 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
11110 65 20 69 6e 74 6f 20 74 68 69 73 20 76 69 72 74  e into this virt
11120 75 61 6c 20 6d 61 63 68 69 6e 65 20 2a 2f 0a 20  ual machine */. 
11130 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 3b 20   KeyInfo *pKey; 
11140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11150 2f 2a 20 4b 65 79 49 6e 66 6f 20 66 6f 72 20 69  /* KeyInfo for i
11160 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 69 44  ndex */.  int iD
11170 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d  b = sqlite3Schem
11180 61 54 6f 49 6e 64 65 78 28 70 50 61 72 73 65 2d  aToIndex(pParse-
11190 3e 64 62 2c 20 70 49 6e 64 65 78 2d 3e 70 53 63  >db, pIndex->pSc
111a0 68 65 6d 61 29 3b 0a 0a 23 69 66 6e 64 65 66 20  hema);..#ifndef 
111b0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48  SQLITE_OMIT_AUTH
111c0 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 69 66 28 20  ORIZATION.  if( 
111d0 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b  sqlite3AuthCheck
111e0 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f  (pParse, SQLITE_
111f0 52 45 49 4e 44 45 58 2c 20 70 49 6e 64 65 78 2d  REINDEX, pIndex-
11200 3e 7a 4e 61 6d 65 2c 20 30 2c 0a 20 20 20 20 20  >zName, 0,.     
11210 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61 44 62   pParse->db->aDb
11220 5b 69 44 62 5d 2e 7a 4e 61 6d 65 20 29 20 29 7b  [iDb].zName ) ){
11230 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
11240 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 52 65  .#endif..  /* Re
11250 71 75 69 72 65 20 61 20 77 72 69 74 65 2d 6c 6f  quire a write-lo
11260 63 6b 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 20  ck on the table 
11270 74 6f 20 70 65 72 66 6f 72 6d 20 74 68 69 73 20  to perform this 
11280 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 73  operation */.  s
11290 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28  qlite3TableLock(
112a0 70 50 61 72 73 65 2c 20 69 44 62 2c 20 70 54 61  pParse, iDb, pTa
112b0 62 2d 3e 74 6e 75 6d 2c 20 31 2c 20 70 54 61 62  b->tnum, 1, pTab
112c0 2d 3e 7a 4e 61 6d 65 29 3b 0a 0a 20 20 76 20 3d  ->zName);..  v =
112d0 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
112e0 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76  pParse);.  if( v
112f0 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
11300 69 66 28 20 6d 65 6d 52 6f 6f 74 50 61 67 65 3e  if( memRootPage>
11310 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
11320 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
11330 5f 4d 65 6d 4c 6f 61 64 2c 20 6d 65 6d 52 6f 6f  _MemLoad, memRoo
11340 74 50 61 67 65 2c 20 30 29 3b 0a 20 20 20 20 74  tPage, 0);.    t
11350 6e 75 6d 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  num = 0;.  }else
11360 7b 0a 20 20 20 20 74 6e 75 6d 20 3d 20 70 49 6e  {.    tnum = pIn
11370 64 65 78 2d 3e 74 6e 75 6d 3b 0a 20 20 20 20 73  dex->tnum;.    s
11380 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
11390 76 2c 20 4f 50 5f 43 6c 65 61 72 2c 20 74 6e 75  v, OP_Clear, tnu
113a0 6d 2c 20 69 44 62 29 3b 0a 20 20 7d 0a 20 20 73  m, iDb);.  }.  s
113b0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
113c0 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 69  v, OP_Integer, i
113d0 44 62 2c 20 30 29 3b 0a 20 20 70 4b 65 79 20 3d  Db, 0);.  pKey =
113e0 20 73 71 6c 69 74 65 33 49 6e 64 65 78 4b 65 79   sqlite3IndexKey
113f0 69 6e 66 6f 28 70 50 61 72 73 65 2c 20 70 49 6e  info(pParse, pIn
11400 64 65 78 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  dex);.  sqlite3V
11410 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65  dbeOp3(v, OP_Ope
11420 6e 57 72 69 74 65 2c 20 69 49 64 78 2c 20 74 6e  nWrite, iIdx, tn
11430 75 6d 2c 20 28 63 68 61 72 20 2a 29 70 4b 65 79  um, (char *)pKey
11440 2c 20 50 33 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e  , P3_KEYINFO_HAN
11450 44 4f 46 46 29 3b 0a 20 20 73 71 6c 69 74 65 33  DOFF);.  sqlite3
11460 4f 70 65 6e 54 61 62 6c 65 28 70 50 61 72 73 65  OpenTable(pParse
11470 2c 20 69 54 61 62 2c 20 69 44 62 2c 20 70 54 61  , iTab, iDb, pTa
11480 62 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64 29 3b  b, OP_OpenRead);
11490 0a 20 20 61 64 64 72 31 20 3d 20 73 71 6c 69 74  .  addr1 = sqlit
114a0 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
114b0 50 5f 52 65 77 69 6e 64 2c 20 69 54 61 62 2c 20  P_Rewind, iTab, 
114c0 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 47 65 6e  0);.  sqlite3Gen
114d0 65 72 61 74 65 49 6e 64 65 78 4b 65 79 28 76 2c  erateIndexKey(v,
114e0 20 70 49 6e 64 65 78 2c 20 69 54 61 62 29 3b 0a   pIndex, iTab);.
114f0 20 20 69 66 28 20 70 49 6e 64 65 78 2d 3e 6f 6e    if( pIndex->on
11500 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 20 29  Error!=OE_None )
11510 7b 0a 20 20 20 20 69 6e 74 20 63 75 72 61 64 64  {.    int curadd
11520 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  r = sqlite3VdbeC
11530 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20  urrentAddr(v);. 
11540 20 20 20 69 6e 74 20 61 64 64 72 32 20 3d 20 63     int addr2 = c
11550 75 72 61 64 64 72 2b 34 3b 0a 20 20 20 20 73 71  uraddr+4;.    sq
11560 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
11570 32 28 76 2c 20 63 75 72 61 64 64 72 2d 31 2c 20  2(v, curaddr-1, 
11580 61 64 64 72 32 29 3b 0a 20 20 20 20 73 71 6c 69  addr2);.    sqli
11590 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
115a0 4f 50 5f 52 6f 77 69 64 2c 20 69 54 61 62 2c 20  OP_Rowid, iTab, 
115b0 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  0);.    sqlite3V
115c0 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 41  dbeAddOp(v, OP_A
115d0 64 64 49 6d 6d 2c 20 31 2c 20 30 29 3b 0a 20 20  ddImm, 1, 0);.  
115e0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
115f0 4f 70 28 76 2c 20 4f 50 5f 49 73 55 6e 69 71 75  Op(v, OP_IsUniqu
11600 65 2c 20 69 49 64 78 2c 20 61 64 64 72 32 29 3b  e, iIdx, addr2);
11610 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
11620 4f 70 33 28 76 2c 20 4f 50 5f 48 61 6c 74 2c 20  Op3(v, OP_Halt, 
11630 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
11640 54 2c 20 4f 45 5f 41 62 6f 72 74 2c 0a 20 20 20  T, OE_Abort,.   
11650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11660 20 22 69 6e 64 65 78 65 64 20 63 6f 6c 75 6d 6e   "indexed column
11670 73 20 61 72 65 20 6e 6f 74 20 75 6e 69 71 75 65  s are not unique
11680 22 2c 20 50 33 5f 53 54 41 54 49 43 29 3b 0a 20  ", P3_STATIC);. 
11690 20 20 20 61 73 73 65 72 74 28 20 61 64 64 72 32     assert( addr2
116a0 3d 3d 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  ==sqlite3VdbeCur
116b0 72 65 6e 74 41 64 64 72 28 76 29 20 29 3b 0a 20  rentAddr(v) );. 
116c0 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65   }.  sqlite3Vdbe
116d0 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 64 78 49  AddOp(v, OP_IdxI
116e0 6e 73 65 72 74 2c 20 69 49 64 78 2c 20 30 29 3b  nsert, iIdx, 0);
116f0 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
11700 64 4f 70 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20  dOp(v, OP_Next, 
11710 69 54 61 62 2c 20 61 64 64 72 31 2b 31 29 3b 0a  iTab, addr1+1);.
11720 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
11730 70 48 65 72 65 28 76 2c 20 61 64 64 72 31 29 3b  pHere(v, addr1);
11740 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
11750 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c  dOp(v, OP_Close,
11760 20 69 54 61 62 2c 20 30 29 3b 0a 20 20 73 71 6c   iTab, 0);.  sql
11770 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
11780 20 4f 50 5f 43 6c 6f 73 65 2c 20 69 49 64 78 2c   OP_Close, iIdx,
11790 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72   0);.}../*.** Cr
117a0 65 61 74 65 20 61 20 6e 65 77 20 69 6e 64 65 78  eate a new index
117b0 20 66 6f 72 20 61 6e 20 53 51 4c 20 74 61 62 6c   for an SQL tabl
117c0 65 2e 20 20 70 4e 61 6d 65 31 2e 70 4e 61 6d 65  e.  pName1.pName
117d0 32 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66  2 is the name of
117e0 20 74 68 65 20 69 6e 64 65 78 20 0a 2a 2a 20 61   the index .** a
117f0 6e 64 20 70 54 62 6c 4c 69 73 74 20 69 73 20 74  nd pTblList is t
11800 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74  he name of the t
11810 61 62 6c 65 20 74 68 61 74 20 69 73 20 74 6f 20  able that is to 
11820 62 65 20 69 6e 64 65 78 65 64 2e 20 20 42 6f 74  be indexed.  Bot
11830 68 20 77 69 6c 6c 20 0a 2a 2a 20 62 65 20 4e 55  h will .** be NU
11840 4c 4c 20 66 6f 72 20 61 20 70 72 69 6d 61 72 79  LL for a primary
11850 20 6b 65 79 20 6f 72 20 61 6e 20 69 6e 64 65 78   key or an index
11860 20 74 68 61 74 20 69 73 20 63 72 65 61 74 65 64   that is created
11870 20 74 6f 20 73 61 74 69 73 66 79 20 61 0a 2a 2a   to satisfy a.**
11880 20 55 4e 49 51 55 45 20 63 6f 6e 73 74 72 61 69   UNIQUE constrai
11890 6e 74 2e 20 20 49 66 20 70 54 61 62 6c 65 20 61  nt.  If pTable a
118a0 6e 64 20 70 49 6e 64 65 78 20 61 72 65 20 4e 55  nd pIndex are NU
118b0 4c 4c 2c 20 75 73 65 20 70 50 61 72 73 65 2d 3e  LL, use pParse->
118c0 70 4e 65 77 54 61 62 6c 65 0a 2a 2a 20 61 73 20  pNewTable.** as 
118d0 74 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20  the table to be 
118e0 69 6e 64 65 78 65 64 2e 20 20 70 50 61 72 73 65  indexed.  pParse
118f0 2d 3e 70 4e 65 77 54 61 62 6c 65 20 69 73 20 61  ->pNewTable is a
11900 20 74 61 62 6c 65 20 74 68 61 74 20 69 73 0a 2a   table that is.*
11910 2a 20 63 75 72 72 65 6e 74 6c 79 20 62 65 69 6e  * currently bein
11920 67 20 63 6f 6e 73 74 72 75 63 74 65 64 20 62 79  g constructed by
11930 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20   a CREATE TABLE 
11940 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a  statement..**.**
11950 20 70 4c 69 73 74 20 69 73 20 61 20 6c 69 73 74   pList is a list
11960 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 62   of columns to b
11970 65 20 69 6e 64 65 78 65 64 2e 20 20 70 4c 69 73  e indexed.  pLis
11980 74 20 77 69 6c 6c 20 62 65 20 4e 55 4c 4c 20 69  t will be NULL i
11990 66 20 74 68 69 73 0a 2a 2a 20 69 73 20 61 20 70  f this.** is a p
119a0 72 69 6d 61 72 79 20 6b 65 79 20 6f 72 20 75 6e  rimary key or un
119b0 69 71 75 65 2d 63 6f 6e 73 74 72 61 69 6e 74 20  ique-constraint 
119c0 6f 6e 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  on the most rece
119d0 6e 74 20 63 6f 6c 75 6d 6e 20 61 64 64 65 64 0a  nt column added.
119e0 2a 2a 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20  ** to the table 
119f0 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72 20  currently under 
11a00 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 0a  construction.  .
11a10 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43  */.void sqlite3C
11a20 72 65 61 74 65 49 6e 64 65 78 28 0a 20 20 50 61  reateIndex(.  Pa
11a30 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
11a40 20 2f 2a 20 41 6c 6c 20 69 6e 66 6f 72 6d 61 74   /* All informat
11a50 69 6f 6e 20 61 62 6f 75 74 20 74 68 69 73 20 70  ion about this p
11a60 61 72 73 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  arse */.  Token 
11a70 2a 70 4e 61 6d 65 31 2c 20 20 20 20 20 2f 2a 20  *pName1,     /* 
11a80 46 69 72 73 74 20 70 61 72 74 20 6f 66 20 69 6e  First part of in
11a90 64 65 78 20 6e 61 6d 65 2e 20 4d 61 79 20 62 65  dex name. May be
11aa0 20 4e 55 4c 4c 20 2a 2f 0a 20 20 54 6f 6b 65 6e   NULL */.  Token
11ab0 20 2a 70 4e 61 6d 65 32 2c 20 20 20 20 20 2f 2a   *pName2,     /*
11ac0 20 53 65 63 6f 6e 64 20 70 61 72 74 20 6f 66 20   Second part of 
11ad0 69 6e 64 65 78 20 6e 61 6d 65 2e 20 4d 61 79 20  index name. May 
11ae0 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 53 72 63  be NULL */.  Src
11af0 4c 69 73 74 20 2a 70 54 62 6c 4e 61 6d 65 2c 20  List *pTblName, 
11b00 2f 2a 20 54 61 62 6c 65 20 74 6f 20 69 6e 64 65  /* Table to inde
11b10 78 2e 20 55 73 65 20 70 50 61 72 73 65 2d 3e 70  x. Use pParse->p
11b20 4e 65 77 54 61 62 6c 65 20 69 66 20 30 20 2a 2f  NewTable if 0 */
11b30 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69  .  ExprList *pLi
11b40 73 74 2c 20 20 20 2f 2a 20 41 20 6c 69 73 74 20  st,   /* A list 
11b50 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 62 65  of columns to be
11b60 20 69 6e 64 65 78 65 64 20 2a 2f 0a 20 20 69 6e   indexed */.  in
11b70 74 20 6f 6e 45 72 72 6f 72 2c 20 20 20 20 20 20  t onError,      
11b80 20 2f 2a 20 4f 45 5f 41 62 6f 72 74 2c 20 4f 45   /* OE_Abort, OE
11b90 5f 49 67 6e 6f 72 65 2c 20 4f 45 5f 52 65 70 6c  _Ignore, OE_Repl
11ba0 61 63 65 2c 20 6f 72 20 4f 45 5f 4e 6f 6e 65 20  ace, or OE_None 
11bb0 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 53 74 61  */.  Token *pSta
11bc0 72 74 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 43  rt,     /* The C
11bd0 52 45 41 54 45 20 74 6f 6b 65 6e 20 74 68 61 74  REATE token that
11be0 20 62 65 67 69 6e 73 20 61 20 43 52 45 41 54 45   begins a CREATE
11bf0 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74   TABLE statement
11c00 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 45 6e   */.  Token *pEn
11c10 64 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  d,       /* The 
11c20 22 29 22 20 74 68 61 74 20 63 6c 6f 73 65 73 20  ")" that closes 
11c30 74 68 65 20 43 52 45 41 54 45 20 49 4e 44 45 58  the CREATE INDEX
11c40 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20   statement */.  
11c50 69 6e 74 20 73 6f 72 74 4f 72 64 65 72 2c 20 20  int sortOrder,  
11c60 20 20 20 2f 2a 20 53 6f 72 74 20 6f 72 64 65 72     /* Sort order
11c70 20 6f 66 20 70 72 69 6d 61 72 79 20 6b 65 79 20   of primary key 
11c80 77 68 65 6e 20 70 4c 69 73 74 3d 3d 4e 55 4c 4c  when pList==NULL
11c90 20 2a 2f 0a 20 20 69 6e 74 20 69 66 4e 6f 74 45   */.  int ifNotE
11ca0 78 69 73 74 20 20 20 20 20 2f 2a 20 4f 6d 69 74  xist     /* Omit
11cb0 20 65 72 72 6f 72 20 69 66 20 69 6e 64 65 78 20   error if index 
11cc0 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 20 2a  already exists *
11cd0 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54  /.){.  Table *pT
11ce0 61 62 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 54  ab = 0;     /* T
11cf0 61 62 6c 65 20 74 6f 20 62 65 20 69 6e 64 65 78  able to be index
11d00 65 64 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70  ed */.  Index *p
11d10 49 6e 64 65 78 20 3d 20 30 3b 20 20 20 2f 2a 20  Index = 0;   /* 
11d20 54 68 65 20 69 6e 64 65 78 20 74 6f 20 62 65 20  The index to be 
11d30 63 72 65 61 74 65 64 20 2a 2f 0a 20 20 63 68 61  created */.  cha
11d40 72 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b 20 20 20  r *zName = 0;   
11d50 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
11d60 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20   index */.  int 
11d70 6e 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20  nName;          
11d80 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 68   /* Number of ch
11d90 61 72 61 63 74 65 72 73 20 69 6e 20 7a 4e 61 6d  aracters in zNam
11da0 65 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 6a 3b  e */.  int i, j;
11db0 0a 20 20 54 6f 6b 65 6e 20 6e 75 6c 6c 49 64 3b  .  Token nullId;
11dc0 20 20 20 20 20 20 20 20 2f 2a 20 46 61 6b 65 20          /* Fake 
11dd0 74 6f 6b 65 6e 20 66 6f 72 20 61 6e 20 65 6d 70  token for an emp
11de0 74 79 20 49 44 20 6c 69 73 74 20 2a 2f 0a 20 20  ty ID list */.  
11df0 44 62 46 69 78 65 72 20 73 46 69 78 3b 20 20 20  DbFixer sFix;   
11e00 20 20 20 20 20 2f 2a 20 46 6f 72 20 61 73 73 69       /* For assi
11e10 67 6e 69 6e 67 20 64 61 74 61 62 61 73 65 20 6e  gning database n
11e20 61 6d 65 73 20 74 6f 20 70 54 61 62 6c 65 20 2a  ames to pTable *
11e30 2f 0a 20 20 69 6e 74 20 73 6f 72 74 4f 72 64 65  /.  int sortOrde
11e40 72 4d 61 73 6b 3b 20 20 20 2f 2a 20 31 20 74 6f  rMask;   /* 1 to
11e50 20 68 6f 6e 6f 72 20 44 45 53 43 20 69 6e 20 69   honor DESC in i
11e60 6e 64 65 78 2e 20 20 30 20 74 6f 20 69 67 6e 6f  ndex.  0 to igno
11e70 72 65 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  re. */.  sqlite3
11e80 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
11e90 62 3b 0a 20 20 44 62 20 2a 70 44 62 3b 20 20 20  b;.  Db *pDb;   
11ea0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
11eb0 20 73 70 65 63 69 66 69 63 20 74 61 62 6c 65 20   specific table 
11ec0 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 69  containing the i
11ed0 6e 64 65 78 65 64 20 64 61 74 61 62 61 73 65 20  ndexed database 
11ee0 2a 2f 0a 20 20 69 6e 74 20 69 44 62 3b 20 20 20  */.  int iDb;   
11ef0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
11f00 65 78 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ex of the databa
11f10 73 65 20 74 68 61 74 20 69 73 20 62 65 69 6e 67  se that is being
11f20 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20 54 6f   written */.  To
11f30 6b 65 6e 20 2a 70 4e 61 6d 65 20 3d 20 30 3b 20  ken *pName = 0; 
11f40 20 20 20 2f 2a 20 55 6e 71 75 61 6c 69 66 69 65     /* Unqualifie
11f50 64 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 69 6e  d name of the in
11f60 64 65 78 20 74 6f 20 63 72 65 61 74 65 20 2a 2f  dex to create */
11f70 0a 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69  .  struct ExprLi
11f80 73 74 5f 69 74 65 6d 20 2a 70 4c 69 73 74 49 74  st_item *pListIt
11f90 65 6d 3b 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69  em; /* For loopi
11fa0 6e 67 20 6f 76 65 72 20 70 4c 69 73 74 20 2a 2f  ng over pList */
11fb0 0a 20 20 69 6e 74 20 6e 43 6f 6c 3b 0a 20 20 69  .  int nCol;.  i
11fc0 6e 74 20 6e 45 78 74 72 61 20 3d 20 30 3b 0a 20  nt nExtra = 0;. 
11fd0 20 63 68 61 72 20 2a 7a 45 78 74 72 61 3b 0a 0a   char *zExtra;..
11fe0 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45    if( pParse->nE
11ff0 72 72 20 7c 7c 20 73 71 6c 69 74 65 33 4d 61 6c  rr || sqlite3Mal
12000 6c 6f 63 46 61 69 6c 65 64 28 29 20 7c 7c 20 49  locFailed() || I
12010 4e 5f 44 45 43 4c 41 52 45 5f 56 54 41 42 20 29  N_DECLARE_VTAB )
12020 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f  {.    goto exit_
12030 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
12040 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46 69 6e  }..  /*.  ** Fin
12050 64 20 74 68 65 20 74 61 62 6c 65 20 74 68 61 74  d the table that
12060 20 69 73 20 74 6f 20 62 65 20 69 6e 64 65 78 65   is to be indexe
12070 64 2e 20 20 52 65 74 75 72 6e 20 65 61 72 6c 79  d.  Return early
12080 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 20   if not found.. 
12090 20 2a 2f 0a 20 20 69 66 28 20 70 54 62 6c 4e 61   */.  if( pTblNa
120a0 6d 65 21 3d 30 20 29 7b 0a 0a 20 20 20 20 2f 2a  me!=0 ){..    /*
120b0 20 55 73 65 20 74 68 65 20 74 77 6f 2d 70 61 72   Use the two-par
120c0 74 20 69 6e 64 65 78 20 6e 61 6d 65 20 74 6f 20  t index name to 
120d0 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20 64 61  determine the da
120e0 74 61 62 61 73 65 20 0a 20 20 20 20 2a 2a 20 74  tabase .    ** t
120f0 6f 20 73 65 61 72 63 68 20 66 6f 72 20 74 68 65  o search for the
12100 20 74 61 62 6c 65 2e 20 27 46 69 78 27 20 74 68   table. 'Fix' th
12110 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 74 6f 20  e table name to 
12120 74 68 69 73 20 64 62 0a 20 20 20 20 2a 2a 20 62  this db.    ** b
12130 65 66 6f 72 65 20 6c 6f 6f 6b 69 6e 67 20 75 70  efore looking up
12140 20 74 68 65 20 74 61 62 6c 65 2e 0a 20 20 20 20   the table..    
12150 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  */.    assert( p
12160 4e 61 6d 65 31 20 26 26 20 70 4e 61 6d 65 32 20  Name1 && pName2 
12170 29 3b 0a 20 20 20 20 69 44 62 20 3d 20 73 71 6c  );.    iDb = sql
12180 69 74 65 33 54 77 6f 50 61 72 74 4e 61 6d 65 28  ite3TwoPartName(
12190 70 50 61 72 73 65 2c 20 70 4e 61 6d 65 31 2c 20  pParse, pName1, 
121a0 70 4e 61 6d 65 32 2c 20 26 70 4e 61 6d 65 29 3b  pName2, &pName);
121b0 0a 20 20 20 20 69 66 28 20 69 44 62 3c 30 20 29  .    if( iDb<0 )
121c0 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
121d0 65 5f 69 6e 64 65 78 3b 0a 0a 23 69 66 6e 64 65  e_index;..#ifnde
121e0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 45  f SQLITE_OMIT_TE
121f0 4d 50 44 42 0a 20 20 20 20 2f 2a 20 49 66 20 74  MPDB.    /* If t
12200 68 65 20 69 6e 64 65 78 20 6e 61 6d 65 20 77 61  he index name wa
12210 73 20 75 6e 71 75 61 6c 69 66 69 65 64 2c 20 63  s unqualified, c
12220 68 65 63 6b 20 69 66 20 74 68 65 20 74 68 65 20  heck if the the 
12230 74 61 62 6c 65 0a 20 20 20 20 2a 2a 20 69 73 20  table.    ** is 
12240 61 20 74 65 6d 70 20 74 61 62 6c 65 2e 20 49 66  a temp table. If
12250 20 73 6f 2c 20 73 65 74 20 74 68 65 20 64 61 74   so, set the dat
12260 61 62 61 73 65 20 74 6f 20 31 2e 0a 20 20 20 20  abase to 1..    
12270 2a 2f 0a 20 20 20 20 70 54 61 62 20 3d 20 73 71  */.    pTab = sq
12280 6c 69 74 65 33 53 72 63 4c 69 73 74 4c 6f 6f 6b  lite3SrcListLook
12290 75 70 28 70 50 61 72 73 65 2c 20 70 54 62 6c 4e  up(pParse, pTblN
122a0 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 70 4e  ame);.    if( pN
122b0 61 6d 65 32 20 26 26 20 70 4e 61 6d 65 32 2d 3e  ame2 && pName2->
122c0 6e 3d 3d 30 20 26 26 20 70 54 61 62 20 26 26 20  n==0 && pTab && 
122d0 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 3d 3d 64  pTab->pSchema==d
122e0 62 2d 3e 61 44 62 5b 31 5d 2e 70 53 63 68 65 6d  b->aDb[1].pSchem
122f0 61 20 29 7b 0a 20 20 20 20 20 20 69 44 62 20 3d  a ){.      iDb =
12300 20 31 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66   1;.    }.#endif
12310 0a 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ..    if( sqlite
12320 33 46 69 78 49 6e 69 74 28 26 73 46 69 78 2c 20  3FixInit(&sFix, 
12330 70 50 61 72 73 65 2c 20 69 44 62 2c 20 22 69 6e  pParse, iDb, "in
12340 64 65 78 22 2c 20 70 4e 61 6d 65 29 20 26 26 0a  dex", pName) &&.
12350 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 46          sqlite3F
12360 69 78 53 72 63 4c 69 73 74 28 26 73 46 69 78 2c  ixSrcList(&sFix,
12370 20 70 54 62 6c 4e 61 6d 65 29 0a 20 20 20 20 29   pTblName).    )
12380 7b 0a 20 20 20 20 20 20 2f 2a 20 42 65 63 61 75  {.      /* Becau
12390 73 65 20 74 68 65 20 70 61 72 73 65 72 20 63 6f  se the parser co
123a0 6e 73 74 72 75 63 74 73 20 70 54 62 6c 4e 61 6d  nstructs pTblNam
123b0 65 20 66 72 6f 6d 20 61 20 73 69 6e 67 6c 65 20  e from a single 
123c0 69 64 65 6e 74 69 66 69 65 72 2c 0a 20 20 20 20  identifier,.    
123d0 20 20 2a 2a 20 73 71 6c 69 74 65 33 46 69 78 53    ** sqlite3FixS
123e0 72 63 4c 69 73 74 20 63 61 6e 20 6e 65 76 65 72  rcList can never
123f0 20 66 61 69 6c 2e 20 2a 2f 0a 20 20 20 20 20 20   fail. */.      
12400 61 73 73 65 72 74 28 30 29 3b 0a 20 20 20 20 7d  assert(0);.    }
12410 0a 20 20 20 20 70 54 61 62 20 3d 20 73 71 6c 69  .    pTab = sqli
12420 74 65 33 4c 6f 63 61 74 65 54 61 62 6c 65 28 70  te3LocateTable(p
12430 50 61 72 73 65 2c 20 70 54 62 6c 4e 61 6d 65 2d  Parse, pTblName-
12440 3e 61 5b 30 5d 2e 7a 4e 61 6d 65 2c 20 0a 20 20  >a[0].zName, .  
12450 20 20 20 20 20 20 70 54 62 6c 4e 61 6d 65 2d 3e        pTblName->
12460 61 5b 30 5d 2e 7a 44 61 74 61 62 61 73 65 29 3b  a[0].zDatabase);
12470 0a 20 20 20 20 69 66 28 20 21 70 54 61 62 20 29  .    if( !pTab )
12480 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
12490 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 61 73 73  e_index;.    ass
124a0 65 72 74 28 20 64 62 2d 3e 61 44 62 5b 69 44 62  ert( db->aDb[iDb
124b0 5d 2e 70 53 63 68 65 6d 61 3d 3d 70 54 61 62 2d  ].pSchema==pTab-
124c0 3e 70 53 63 68 65 6d 61 20 29 3b 0a 20 20 7d 65  >pSchema );.  }e
124d0 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28  lse{.    assert(
124e0 20 70 4e 61 6d 65 3d 3d 30 20 29 3b 0a 20 20 20   pName==0 );.   
124f0 20 70 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e   pTab = pParse->
12500 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 20 20 69  pNewTable;.    i
12510 66 28 20 21 70 54 61 62 20 29 20 67 6f 74 6f 20  f( !pTab ) goto 
12520 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
12530 78 3b 0a 20 20 20 20 69 44 62 20 3d 20 73 71 6c  x;.    iDb = sql
12540 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65  ite3SchemaToInde
12550 78 28 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68  x(db, pTab->pSch
12560 65 6d 61 29 3b 0a 20 20 7d 0a 20 20 70 44 62 20  ema);.  }.  pDb 
12570 3d 20 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d 3b  = &db->aDb[iDb];
12580 0a 0a 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20  ..  if( pTab==0 
12590 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20  || pParse->nErr 
125a0 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61  ) goto exit_crea
125b0 74 65 5f 69 6e 64 65 78 3b 0a 20 20 69 66 28 20  te_index;.  if( 
125c0 70 54 61 62 2d 3e 72 65 61 64 4f 6e 6c 79 20 29  pTab->readOnly )
125d0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
125e0 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74  orMsg(pParse, "t
125f0 61 62 6c 65 20 25 73 20 6d 61 79 20 6e 6f 74 20  able %s may not 
12600 62 65 20 69 6e 64 65 78 65 64 22 2c 20 70 54 61  be indexed", pTa
12610 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 67  b->zName);.    g
12620 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
12630 69 6e 64 65 78 3b 0a 20 20 7d 0a 23 69 66 6e 64  index;.  }.#ifnd
12640 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
12650 49 45 57 0a 20 20 69 66 28 20 70 54 61 62 2d 3e  IEW.  if( pTab->
12660 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 73  pSelect ){.    s
12670 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
12680 50 61 72 73 65 2c 20 22 76 69 65 77 73 20 6d 61  Parse, "views ma
12690 79 20 6e 6f 74 20 62 65 20 69 6e 64 65 78 65 64  y not be indexed
126a0 22 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69  ");.    goto exi
126b0 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
126c0 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64    }.#endif.#ifnd
126d0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
126e0 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 69 66  IRTUALTABLE.  if
126f0 28 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62  ( IsVirtual(pTab
12700 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) ){.    sqlite3
12710 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
12720 20 22 76 69 72 74 75 61 6c 20 74 61 62 6c 65 73   "virtual tables
12730 20 6d 61 79 20 6e 6f 74 20 62 65 20 69 6e 64 65   may not be inde
12740 78 65 64 22 29 3b 0a 20 20 20 20 67 6f 74 6f 20  xed");.    goto 
12750 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
12760 78 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  x;.  }.#endif.. 
12770 20 2f 2a 0a 20 20 2a 2a 20 46 69 6e 64 20 74 68   /*.  ** Find th
12780 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 69 6e  e name of the in
12790 64 65 78 2e 20 20 4d 61 6b 65 20 73 75 72 65 20  dex.  Make sure 
127a0 74 68 65 72 65 20 69 73 20 6e 6f 74 20 61 6c 72  there is not alr
127b0 65 61 64 79 20 61 6e 6f 74 68 65 72 0a 20 20 2a  eady another.  *
127c0 2a 20 69 6e 64 65 78 20 6f 72 20 74 61 62 6c 65  * index or table
127d0 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 6e   with the same n
127e0 61 6d 65 2e 20 20 0a 20 20 2a 2a 0a 20 20 2a 2a  ame.  .  **.  **
127f0 20 45 78 63 65 70 74 69 6f 6e 3a 20 20 49 66 20   Exception:  If 
12800 77 65 20 61 72 65 20 72 65 61 64 69 6e 67 20 74  we are reading t
12810 68 65 20 6e 61 6d 65 73 20 6f 66 20 70 65 72 6d  he names of perm
12820 61 6e 65 6e 74 20 69 6e 64 69 63 65 73 20 66 72  anent indices fr
12830 6f 6d 20 74 68 65 0a 20 20 2a 2a 20 73 71 6c 69  om the.  ** sqli
12840 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20  te_master table 
12850 28 62 65 63 61 75 73 65 20 73 6f 6d 65 20 6f 74  (because some ot
12860 68 65 72 20 70 72 6f 63 65 73 73 20 63 68 61 6e  her process chan
12870 67 65 64 20 74 68 65 20 73 63 68 65 6d 61 29 20  ged the schema) 
12880 61 6e 64 0a 20 20 2a 2a 20 6f 6e 65 20 6f 66 20  and.  ** one of 
12890 74 68 65 20 69 6e 64 65 78 20 6e 61 6d 65 73 20  the index names 
128a0 63 6f 6c 6c 69 64 65 73 20 77 69 74 68 20 74 68  collides with th
128b0 65 20 6e 61 6d 65 20 6f 66 20 61 20 74 65 6d 70  e name of a temp
128c0 6f 72 61 72 79 20 74 61 62 6c 65 20 6f 72 0a 20  orary table or. 
128d0 20 2a 2a 20 69 6e 64 65 78 2c 20 74 68 65 6e 20   ** index, then 
128e0 77 65 20 77 69 6c 6c 20 63 6f 6e 74 69 6e 75 65  we will continue
128f0 20 74 6f 20 70 72 6f 63 65 73 73 20 74 68 69 73   to process this
12900 20 69 6e 64 65 78 2e 0a 20 20 2a 2a 0a 20 20 2a   index..  **.  *
12910 2a 20 49 66 20 70 4e 61 6d 65 3d 3d 30 20 69 74  * If pName==0 it
12920 20 6d 65 61 6e 73 20 74 68 61 74 20 77 65 20 61   means that we a
12930 72 65 0a 20 20 2a 2a 20 64 65 61 6c 69 6e 67 20  re.  ** dealing 
12940 77 69 74 68 20 61 20 70 72 69 6d 61 72 79 20 6b  with a primary k
12950 65 79 20 6f 72 20 55 4e 49 51 55 45 20 63 6f 6e  ey or UNIQUE con
12960 73 74 72 61 69 6e 74 2e 20 20 57 65 20 68 61 76  straint.  We hav
12970 65 20 74 6f 20 69 6e 76 65 6e 74 20 6f 75 72 0a  e to invent our.
12980 20 20 2a 2a 20 6f 77 6e 20 6e 61 6d 65 2e 0a 20    ** own name.. 
12990 20 2a 2f 0a 20 20 69 66 28 20 70 4e 61 6d 65 20   */.  if( pName 
129a0 29 7b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73  ){.    zName = s
129b0 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f  qlite3NameFromTo
129c0 6b 65 6e 28 70 4e 61 6d 65 29 3b 0a 20 20 20 20  ken(pName);.    
129d0 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73  if( SQLITE_OK!=s
129e0 71 6c 69 74 65 33 52 65 61 64 53 63 68 65 6d 61  qlite3ReadSchema
129f0 28 70 50 61 72 73 65 29 20 29 20 67 6f 74 6f 20  (pParse) ) goto 
12a00 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
12a10 78 3b 0a 20 20 20 20 69 66 28 20 7a 4e 61 6d 65  x;.    if( zName
12a20 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78 69 74 5f  ==0 ) goto exit_
12a30 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
12a40 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21    if( SQLITE_OK!
12a50 3d 73 71 6c 69 74 65 33 43 68 65 63 6b 4f 62 6a  =sqlite3CheckObj
12a60 65 63 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20  ectName(pParse, 
12a70 7a 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 20 20  zName) ){.      
12a80 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
12a90 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20  _index;.    }.  
12aa0 20 20 69 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e    if( !db->init.
12ab0 62 75 73 79 20 29 7b 0a 20 20 20 20 20 20 69 66  busy ){.      if
12ac0 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c  ( SQLITE_OK!=sql
12ad0 69 74 65 33 52 65 61 64 53 63 68 65 6d 61 28 70  ite3ReadSchema(p
12ae0 50 61 72 73 65 29 20 29 20 67 6f 74 6f 20 65 78  Parse) ) goto ex
12af0 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
12b00 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
12b10 65 33 46 69 6e 64 54 61 62 6c 65 28 64 62 2c 20  e3FindTable(db, 
12b20 7a 4e 61 6d 65 2c 20 30 29 21 3d 30 20 29 7b 0a  zName, 0)!=0 ){.
12b30 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
12b40 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
12b50 22 74 68 65 72 65 20 69 73 20 61 6c 72 65 61 64  "there is alread
12b60 79 20 61 20 74 61 62 6c 65 20 6e 61 6d 65 64 20  y a table named 
12b70 25 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20  %s", zName);.   
12b80 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63       goto exit_c
12b90 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20  reate_index;.   
12ba0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
12bb0 66 28 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e  f( sqlite3FindIn
12bc0 64 65 78 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 70  dex(db, zName, p
12bd0 44 62 2d 3e 7a 4e 61 6d 65 29 21 3d 30 20 29 7b  Db->zName)!=0 ){
12be0 0a 20 20 20 20 20 20 69 66 28 20 21 69 66 4e 6f  .      if( !ifNo
12bf0 74 45 78 69 73 74 20 29 7b 0a 20 20 20 20 20 20  tExist ){.      
12c00 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
12c10 67 28 70 50 61 72 73 65 2c 20 22 69 6e 64 65 78  g(pParse, "index
12c20 20 25 73 20 61 6c 72 65 61 64 79 20 65 78 69 73   %s already exis
12c30 74 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20  ts", zName);.   
12c40 20 20 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20     }.      goto 
12c50 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
12c60 78 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  x;.    }.  }else
12c70 7b 0a 20 20 20 20 63 68 61 72 20 7a 42 75 66 5b  {.    char zBuf[
12c80 33 30 5d 3b 0a 20 20 20 20 69 6e 74 20 6e 3b 0a  30];.    int n;.
12c90 20 20 20 20 49 6e 64 65 78 20 2a 70 4c 6f 6f 70      Index *pLoop
12ca0 3b 0a 20 20 20 20 66 6f 72 28 70 4c 6f 6f 70 3d  ;.    for(pLoop=
12cb0 70 54 61 62 2d 3e 70 49 6e 64 65 78 2c 20 6e 3d  pTab->pIndex, n=
12cc0 31 3b 20 70 4c 6f 6f 70 3b 20 70 4c 6f 6f 70 3d  1; pLoop; pLoop=
12cd0 70 4c 6f 6f 70 2d 3e 70 4e 65 78 74 2c 20 6e 2b  pLoop->pNext, n+
12ce0 2b 29 7b 7d 0a 20 20 20 20 73 70 72 69 6e 74 66  +){}.    sprintf
12cf0 28 7a 42 75 66 2c 22 5f 25 64 22 2c 6e 29 3b 0a  (zBuf,"_%d",n);.
12d00 20 20 20 20 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20      zName = 0;. 
12d10 20 20 20 73 71 6c 69 74 65 33 53 65 74 53 74 72     sqlite3SetStr
12d20 69 6e 67 28 26 7a 4e 61 6d 65 2c 20 22 73 71 6c  ing(&zName, "sql
12d30 69 74 65 5f 61 75 74 6f 69 6e 64 65 78 5f 22 2c  ite_autoindex_",
12d40 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 42   pTab->zName, zB
12d50 75 66 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20  uf, (char*)0);. 
12d60 20 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20     if( zName==0 
12d70 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61  ) goto exit_crea
12d80 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 0a 20  te_index;.  }.. 
12d90 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 61 75   /* Check for au
12da0 74 68 6f 72 69 7a 61 74 69 6f 6e 20 74 6f 20 63  thorization to c
12db0 72 65 61 74 65 20 61 6e 20 69 6e 64 65 78 2e 0a  reate an index..
12dc0 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c    */.#ifndef SQL
12dd0 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49  ITE_OMIT_AUTHORI
12de0 5a 41 54 49 4f 4e 0a 20 20 7b 0a 20 20 20 20 63  ZATION.  {.    c
12df0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 20 3d  onst char *zDb =
12e00 20 70 44 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20   pDb->zName;.   
12e10 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68   if( sqlite3Auth
12e20 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51  Check(pParse, SQ
12e30 4c 49 54 45 5f 49 4e 53 45 52 54 2c 20 53 43 48  LITE_INSERT, SCH
12e40 45 4d 41 5f 54 41 42 4c 45 28 69 44 62 29 2c 20  EMA_TABLE(iDb), 
12e50 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20  0, zDb) ){.     
12e60 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
12e70 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20  e_index;.    }. 
12e80 20 20 20 69 20 3d 20 53 51 4c 49 54 45 5f 43 52     i = SQLITE_CR
12e90 45 41 54 45 5f 49 4e 44 45 58 3b 0a 20 20 20 20  EATE_INDEX;.    
12ea0 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42  if( !OMIT_TEMPDB
12eb0 20 26 26 20 69 44 62 3d 3d 31 20 29 20 69 20 3d   && iDb==1 ) i =
12ec0 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54   SQLITE_CREATE_T
12ed0 45 4d 50 5f 49 4e 44 45 58 3b 0a 20 20 20 20 69  EMP_INDEX;.    i
12ee0 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68  f( sqlite3AuthCh
12ef0 65 63 6b 28 70 50 61 72 73 65 2c 20 69 2c 20 7a  eck(pParse, i, z
12f00 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  Name, pTab->zNam
12f10 65 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20  e, zDb) ){.     
12f20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
12f30 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20  e_index;.    }. 
12f40 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
12f50 49 66 20 70 4c 69 73 74 3d 3d 30 2c 20 69 74 20  If pList==0, it 
12f60 6d 65 61 6e 73 20 74 68 69 73 20 72 6f 75 74 69  means this routi
12f70 6e 65 20 77 61 73 20 63 61 6c 6c 65 64 20 74 6f  ne was called to
12f80 20 6d 61 6b 65 20 61 20 70 72 69 6d 61 72 79 0a   make a primary.
12f90 20 20 2a 2a 20 6b 65 79 20 6f 75 74 20 6f 66 20    ** key out of 
12fa0 74 68 65 20 6c 61 73 74 20 63 6f 6c 75 6d 6e 20  the last column 
12fb0 61 64 64 65 64 20 74 6f 20 74 68 65 20 74 61 62  added to the tab
12fc0 6c 65 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75  le under constru
12fd0 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 53 6f 20 63  ction..  ** So c
12fe0 72 65 61 74 65 20 61 20 66 61 6b 65 20 6c 69 73  reate a fake lis
12ff0 74 20 74 6f 20 73 69 6d 75 6c 61 74 65 20 74 68  t to simulate th
13000 69 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  is..  */.  if( p
13010 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 6e  List==0 ){.    n
13020 75 6c 6c 49 64 2e 7a 20 3d 20 28 75 38 2a 29 70  ullId.z = (u8*)p
13030 54 61 62 2d 3e 61 43 6f 6c 5b 70 54 61 62 2d 3e  Tab->aCol[pTab->
13040 6e 43 6f 6c 2d 31 5d 2e 7a 4e 61 6d 65 3b 0a 20  nCol-1].zName;. 
13050 20 20 20 6e 75 6c 6c 49 64 2e 6e 20 3d 20 73 74     nullId.n = st
13060 72 6c 65 6e 28 28 63 68 61 72 2a 29 6e 75 6c 6c  rlen((char*)null
13070 49 64 2e 7a 29 3b 0a 20 20 20 20 70 4c 69 73 74  Id.z);.    pList
13080 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69   = sqlite3ExprLi
13090 73 74 41 70 70 65 6e 64 28 30 2c 20 30 2c 20 26  stAppend(0, 0, &
130a0 6e 75 6c 6c 49 64 29 3b 0a 20 20 20 20 69 66 28  nullId);.    if(
130b0 20 70 4c 69 73 74 3d 3d 30 20 29 20 67 6f 74 6f   pList==0 ) goto
130c0 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
130d0 65 78 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 61  ex;.    pList->a
130e0 5b 30 5d 2e 73 6f 72 74 4f 72 64 65 72 20 3d 20  [0].sortOrder = 
130f0 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20 7d 0a 0a  sortOrder;.  }..
13100 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20    /* Figure out 
13110 68 6f 77 20 6d 61 6e 79 20 62 79 74 65 73 20 6f  how many bytes o
13120 66 20 73 70 61 63 65 20 61 72 65 20 72 65 71 75  f space are requ
13130 69 72 65 64 20 74 6f 20 73 74 6f 72 65 20 65 78  ired to store ex
13140 70 6c 69 63 69 74 6c 79 0a 20 20 2a 2a 20 73 70  plicitly.  ** sp
13150 65 63 69 66 69 65 64 20 63 6f 6c 6c 61 74 69 6f  ecified collatio
13160 6e 20 73 65 71 75 65 6e 63 65 20 6e 61 6d 65 73  n sequence names
13170 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30  ..  */.  for(i=0
13180 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72  ; i<pList->nExpr
13190 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72  ; i++){.    Expr
131a0 20 2a 70 45 78 70 72 20 3d 20 70 4c 69 73 74 2d   *pExpr = pList-
131b0 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20  >a[i].pExpr;.   
131c0 20 69 66 28 20 70 45 78 70 72 20 29 7b 0a 20 20   if( pExpr ){.  
131d0 20 20 20 20 6e 45 78 74 72 61 20 2b 3d 20 28 31      nExtra += (1
131e0 20 2b 20 73 74 72 6c 65 6e 28 70 45 78 70 72 2d   + strlen(pExpr-
131f0 3e 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29 29 3b  >pColl->zName));
13200 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
13210 20 0a 20 20 2a 2a 20 41 6c 6c 6f 63 61 74 65 20   .  ** Allocate 
13220 74 68 65 20 69 6e 64 65 78 20 73 74 72 75 63 74  the index struct
13230 75 72 65 2e 20 0a 20 20 2a 2f 0a 20 20 6e 4e 61  ure. .  */.  nNa
13240 6d 65 20 3d 20 73 74 72 6c 65 6e 28 7a 4e 61 6d  me = strlen(zNam
13250 65 29 3b 0a 20 20 6e 43 6f 6c 20 3d 20 70 4c 69  e);.  nCol = pLi
13260 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 70 49 6e  st->nExpr;.  pIn
13270 64 65 78 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c  dex = sqliteMall
13280 6f 63 28 20 0a 20 20 20 20 20 20 73 69 7a 65 6f  oc( .      sizeo
13290 66 28 49 6e 64 65 78 29 20 2b 20 20 20 20 20 20  f(Index) +      
132a0 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
132b0 20 73 74 72 75 63 74 75 72 65 20 20 2a 2f 0a 20   structure  */. 
132c0 20 20 20 20 20 73 69 7a 65 6f 66 28 69 6e 74 29       sizeof(int)
132d0 2a 6e 43 6f 6c 20 2b 20 20 20 20 20 20 20 20 20  *nCol +         
132e0 20 20 2f 2a 20 49 6e 64 65 78 2e 61 69 43 6f 6c    /* Index.aiCol
132f0 75 6d 6e 20 20 20 2a 2f 0a 20 20 20 20 20 20 73  umn   */.      s
13300 69 7a 65 6f 66 28 69 6e 74 29 2a 28 6e 43 6f 6c  izeof(int)*(nCol
13310 2b 31 29 20 2b 20 20 20 20 20 20 20 2f 2a 20 49  +1) +       /* I
13320 6e 64 65 78 2e 61 69 52 6f 77 45 73 74 20 20 20  ndex.aiRowEst   
13330 2a 2f 0a 20 20 20 20 20 20 73 69 7a 65 6f 66 28  */.      sizeof(
13340 63 68 61 72 20 2a 29 2a 6e 43 6f 6c 20 2b 20 20  char *)*nCol +  
13350 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 2e 61        /* Index.a
13360 7a 43 6f 6c 6c 20 20 20 20 20 2a 2f 0a 20 20 20  zColl     */.   
13370 20 20 20 73 69 7a 65 6f 66 28 75 38 29 2a 6e 43     sizeof(u8)*nC
13380 6f 6c 20 2b 20 20 20 20 20 20 20 20 20 20 20 20  ol +            
13390 2f 2a 20 49 6e 64 65 78 2e 61 53 6f 72 74 4f 72  /* Index.aSortOr
133a0 64 65 72 20 2a 2f 0a 20 20 20 20 20 20 6e 4e 61  der */.      nNa
133b0 6d 65 20 2b 20 31 20 2b 20 20 20 20 20 20 20 20  me + 1 +        
133c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
133d0 65 78 2e 7a 4e 61 6d 65 20 20 20 20 20 20 2a 2f  ex.zName      */
133e0 0a 20 20 20 20 20 20 6e 45 78 74 72 61 20 20 20  .      nExtra   
133f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13400 20 20 20 20 2f 2a 20 43 6f 6c 6c 61 74 69 6f 6e      /* Collation
13410 20 73 65 71 75 65 6e 63 65 20 6e 61 6d 65 73 20   sequence names 
13420 2a 2f 0a 20 20 29 3b 0a 20 20 69 66 28 20 73 71  */.  );.  if( sq
13430 6c 69 74 65 33 4d 61 6c 6c 6f 63 46 61 69 6c 65  lite3MallocFaile
13440 64 28 29 20 29 20 67 6f 74 6f 20 65 78 69 74 5f  d() ) goto exit_
13450 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
13460 70 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c 20 3d  pIndex->azColl =
13470 20 28 63 68 61 72 2a 2a 29 28 26 70 49 6e 64 65   (char**)(&pInde
13480 78 5b 31 5d 29 3b 0a 20 20 70 49 6e 64 65 78 2d  x[1]);.  pIndex-
13490 3e 61 69 43 6f 6c 75 6d 6e 20 3d 20 28 69 6e 74  >aiColumn = (int
134a0 20 2a 29 28 26 70 49 6e 64 65 78 2d 3e 61 7a 43   *)(&pIndex->azC
134b0 6f 6c 6c 5b 6e 43 6f 6c 5d 29 3b 0a 20 20 70 49  oll[nCol]);.  pI
134c0 6e 64 65 78 2d 3e 61 69 52 6f 77 45 73 74 20 3d  ndex->aiRowEst =
134d0 20 28 75 6e 73 69 67 6e 65 64 20 2a 29 28 26 70   (unsigned *)(&p
134e0 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b  Index->aiColumn[
134f0 6e 43 6f 6c 5d 29 3b 0a 20 20 70 49 6e 64 65 78  nCol]);.  pIndex
13500 2d 3e 61 53 6f 72 74 4f 72 64 65 72 20 3d 20 28  ->aSortOrder = (
13510 75 38 20 2a 29 28 26 70 49 6e 64 65 78 2d 3e 61  u8 *)(&pIndex->a
13520 69 52 6f 77 45 73 74 5b 6e 43 6f 6c 2b 31 5d 29  iRowEst[nCol+1])
13530 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d  ;.  pIndex->zNam
13540 65 20 3d 20 28 63 68 61 72 20 2a 29 28 26 70 49  e = (char *)(&pI
13550 6e 64 65 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72  ndex->aSortOrder
13560 5b 6e 43 6f 6c 5d 29 3b 0a 20 20 7a 45 78 74 72  [nCol]);.  zExtr
13570 61 20 3d 20 28 63 68 61 72 20 2a 29 28 26 70 49  a = (char *)(&pI
13580 6e 64 65 78 2d 3e 7a 4e 61 6d 65 5b 6e 4e 61 6d  ndex->zName[nNam
13590 65 2b 31 5d 29 3b 0a 20 20 73 74 72 63 70 79 28  e+1]);.  strcpy(
135a0 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 7a  pIndex->zName, z
135b0 4e 61 6d 65 29 3b 0a 20 20 70 49 6e 64 65 78 2d  Name);.  pIndex-
135c0 3e 70 54 61 62 6c 65 20 3d 20 70 54 61 62 3b 0a  >pTable = pTab;.
135d0 20 20 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d    pIndex->nColum
135e0 6e 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72  n = pList->nExpr
135f0 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 6f 6e 45 72  ;.  pIndex->onEr
13600 72 6f 72 20 3d 20 6f 6e 45 72 72 6f 72 3b 0a 20  ror = onError;. 
13610 20 70 49 6e 64 65 78 2d 3e 61 75 74 6f 49 6e 64   pIndex->autoInd
13620 65 78 20 3d 20 70 4e 61 6d 65 3d 3d 30 3b 0a 20  ex = pName==0;. 
13630 20 70 49 6e 64 65 78 2d 3e 70 53 63 68 65 6d 61   pIndex->pSchema
13640 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e   = db->aDb[iDb].
13650 70 53 63 68 65 6d 61 3b 0a 0a 20 20 2f 2a 20 43  pSchema;..  /* C
13660 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 77  heck to see if w
13670 65 20 73 68 6f 75 6c 64 20 68 6f 6e 6f 72 20 44  e should honor D
13680 45 53 43 20 72 65 71 75 65 73 74 73 20 6f 6e 20  ESC requests on 
13690 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 73 0a 20 20  index columns.  
136a0 2a 2f 0a 20 20 69 66 28 20 70 44 62 2d 3e 70 53  */.  if( pDb->pS
136b0 63 68 65 6d 61 2d 3e 66 69 6c 65 5f 66 6f 72 6d  chema->file_form
136c0 61 74 3e 3d 34 20 29 7b 0a 20 20 20 20 73 6f 72  at>=4 ){.    sor
136d0 74 4f 72 64 65 72 4d 61 73 6b 20 3d 20 2d 31 3b  tOrderMask = -1;
136e0 20 20 20 2f 2a 20 48 6f 6e 6f 72 20 44 45 53 43     /* Honor DESC
136f0 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   */.  }else{.   
13700 20 73 6f 72 74 4f 72 64 65 72 4d 61 73 6b 20 3d   sortOrderMask =
13710 20 30 3b 20 20 20 20 2f 2a 20 49 67 6e 6f 72 65   0;    /* Ignore
13720 20 44 45 53 43 20 2a 2f 0a 20 20 7d 0a 0a 20 20   DESC */.  }..  
13730 2f 2a 20 53 63 61 6e 20 74 68 65 20 6e 61 6d 65  /* Scan the name
13740 73 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 73  s of the columns
13750 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74 6f   of the table to
13760 20 62 65 20 69 6e 64 65 78 65 64 20 61 6e 64 0a   be indexed and.
13770 20 20 2a 2a 20 6c 6f 61 64 20 74 68 65 20 63 6f    ** load the co
13780 6c 75 6d 6e 20 69 6e 64 69 63 65 73 20 69 6e 74  lumn indices int
13790 6f 20 74 68 65 20 49 6e 64 65 78 20 73 74 72 75  o the Index stru
137a0 63 74 75 72 65 2e 20 20 52 65 70 6f 72 74 20 61  cture.  Report a
137b0 6e 20 65 72 72 6f 72 0a 20 20 2a 2a 20 69 66 20  n error.  ** if 
137c0 61 6e 79 20 63 6f 6c 75 6d 6e 20 69 73 20 6e 6f  any column is no
137d0 74 20 66 6f 75 6e 64 2e 0a 20 20 2a 2f 0a 20 20  t found..  */.  
137e0 66 6f 72 28 69 3d 30 2c 20 70 4c 69 73 74 49 74  for(i=0, pListIt
137f0 65 6d 3d 70 4c 69 73 74 2d 3e 61 3b 20 69 3c 70  em=pList->a; i<p
13800 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  List->nExpr; i++
13810 2c 20 70 4c 69 73 74 49 74 65 6d 2b 2b 29 7b 0a  , pListItem++){.
13820 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
13830 7a 43 6f 6c 4e 61 6d 65 20 3d 20 70 4c 69 73 74  zColName = pList
13840 49 74 65 6d 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20  Item->zName;.   
13850 20 43 6f 6c 75 6d 6e 20 2a 70 54 61 62 43 6f 6c   Column *pTabCol
13860 3b 0a 20 20 20 20 69 6e 74 20 72 65 71 75 65 73  ;.    int reques
13870 74 65 64 53 6f 72 74 4f 72 64 65 72 3b 0a 20 20  tedSortOrder;.  
13880 20 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 3b 20 20    char *zColl;  
13890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
138a0 20 2f 2a 20 43 6f 6c 6c 61 74 69 6f 6e 20 73 65   /* Collation se
138b0 71 75 65 6e 63 65 20 6e 61 6d 65 20 2a 2f 0a 0a  quence name */..
138c0 20 20 20 20 66 6f 72 28 6a 3d 30 2c 20 70 54 61      for(j=0, pTa
138d0 62 43 6f 6c 3d 70 54 61 62 2d 3e 61 43 6f 6c 3b  bCol=pTab->aCol;
138e0 20 6a 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a   j<pTab->nCol; j
138f0 2b 2b 2c 20 70 54 61 62 43 6f 6c 2b 2b 29 7b 0a  ++, pTabCol++){.
13900 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
13910 33 53 74 72 49 43 6d 70 28 7a 43 6f 6c 4e 61 6d  3StrICmp(zColNam
13920 65 2c 20 70 54 61 62 43 6f 6c 2d 3e 7a 4e 61 6d  e, pTabCol->zNam
13930 65 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  e)==0 ) break;. 
13940 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6a 3e 3d     }.    if( j>=
13950 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20  pTab->nCol ){.  
13960 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
13970 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 61 62  Msg(pParse, "tab
13980 6c 65 20 25 73 20 68 61 73 20 6e 6f 20 63 6f 6c  le %s has no col
13990 75 6d 6e 20 6e 61 6d 65 64 20 25 73 22 2c 0a 20  umn named %s",. 
139a0 20 20 20 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61         pTab->zNa
139b0 6d 65 2c 20 7a 43 6f 6c 4e 61 6d 65 29 3b 0a 20  me, zColName);. 
139c0 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63       goto exit_c
139d0 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20  reate_index;.   
139e0 20 7d 0a 20 20 20 20 2f 2a 20 54 4f 44 4f 3a 20   }.    /* TODO: 
139f0 20 41 64 64 20 61 20 74 65 73 74 20 74 6f 20 6d   Add a test to m
13a00 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 74 68  ake sure that th
13a10 65 20 73 61 6d 65 20 63 6f 6c 75 6d 6e 20 69 73  e same column is
13a20 20 6e 6f 74 20 6e 61 6d 65 64 0a 20 20 20 20 2a   not named.    *
13a30 2a 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 63 65  * more than once
13a40 20 77 69 74 68 69 6e 20 74 68 65 20 73 61 6d 65   within the same
13a50 20 69 6e 64 65 78 2e 20 20 4f 6e 6c 79 20 74 68   index.  Only th
13a60 65 20 66 69 72 73 74 20 69 6e 73 74 61 6e 63 65  e first instance
13a70 20 6f 66 0a 20 20 20 20 2a 2a 20 74 68 65 20 63   of.    ** the c
13a80 6f 6c 75 6d 6e 20 77 69 6c 6c 20 65 76 65 72 20  olumn will ever 
13a90 62 65 20 75 73 65 64 20 62 79 20 74 68 65 20 6f  be used by the o
13aa0 70 74 69 6d 69 7a 65 72 2e 20 20 4e 6f 74 65 20  ptimizer.  Note 
13ab0 74 68 61 74 20 75 73 69 6e 67 20 74 68 65 0a 20  that using the. 
13ac0 20 20 20 2a 2a 20 73 61 6d 65 20 63 6f 6c 75 6d     ** same colum
13ad0 6e 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 63 65  n more than once
13ae0 20 63 61 6e 6e 6f 74 20 62 65 20 61 6e 20 65 72   cannot be an er
13af0 72 6f 72 20 62 65 63 61 75 73 65 20 74 68 61 74  ror because that
13b00 20 77 6f 75 6c 64 20 0a 20 20 20 20 2a 2a 20 62   would .    ** b
13b10 72 65 61 6b 20 62 61 63 6b 77 61 72 64 73 20 63  reak backwards c
13b20 6f 6d 70 61 74 69 62 69 6c 69 74 79 20 2d 20 69  ompatibility - i
13b30 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 61 20  t needs to be a 
13b40 77 61 72 6e 69 6e 67 2e 0a 20 20 20 20 2a 2f 0a  warning..    */.
13b50 20 20 20 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f      pIndex->aiCo
13b60 6c 75 6d 6e 5b 69 5d 20 3d 20 6a 3b 0a 20 20 20  lumn[i] = j;.   
13b70 20 69 66 28 20 70 4c 69 73 74 49 74 65 6d 2d 3e   if( pListItem->
13b80 70 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20 61  pExpr ){.      a
13b90 73 73 65 72 74 28 20 70 4c 69 73 74 49 74 65 6d  ssert( pListItem
13ba0 2d 3e 70 45 78 70 72 2d 3e 70 43 6f 6c 6c 20 29  ->pExpr->pColl )
13bb0 3b 0a 20 20 20 20 20 20 7a 43 6f 6c 6c 20 3d 20  ;.      zColl = 
13bc0 7a 45 78 74 72 61 3b 0a 20 20 20 20 20 20 73 74  zExtra;.      st
13bd0 72 63 70 79 28 7a 45 78 74 72 61 2c 20 70 4c 69  rcpy(zExtra, pLi
13be0 73 74 49 74 65 6d 2d 3e 70 45 78 70 72 2d 3e 70  stItem->pExpr->p
13bf0 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  Coll->zName);.  
13c00 20 20 20 20 7a 45 78 74 72 61 20 2b 3d 20 28 73      zExtra += (s
13c10 74 72 6c 65 6e 28 7a 43 6f 6c 6c 29 20 2b 20 31  trlen(zColl) + 1
13c20 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
13c30 20 20 20 20 7a 43 6f 6c 6c 20 3d 20 70 54 61 62      zColl = pTab
13c40 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 43 6f 6c 6c 3b  ->aCol[j].zColl;
13c50 0a 20 20 20 20 20 20 69 66 28 20 21 7a 43 6f 6c  .      if( !zCol
13c60 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 43 6f  l ){.        zCo
13c70 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f  ll = db->pDfltCo
13c80 6c 6c 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20  ll->zName;.     
13c90 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
13ca0 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20   !db->init.busy 
13cb0 26 26 20 21 73 71 6c 69 74 65 33 4c 6f 63 61 74  && !sqlite3Locat
13cc0 65 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  eCollSeq(pParse,
13cd0 20 7a 43 6f 6c 6c 2c 20 2d 31 29 20 29 7b 0a 20   zColl, -1) ){. 
13ce0 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63       goto exit_c
13cf0 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20  reate_index;.   
13d00 20 7d 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e 61   }.    pIndex->a
13d10 7a 43 6f 6c 6c 5b 69 5d 20 3d 20 7a 43 6f 6c 6c  zColl[i] = zColl
13d20 3b 0a 20 20 20 20 72 65 71 75 65 73 74 65 64 53  ;.    requestedS
13d30 6f 72 74 4f 72 64 65 72 20 3d 20 70 4c 69 73 74  ortOrder = pList
13d40 49 74 65 6d 2d 3e 73 6f 72 74 4f 72 64 65 72 20  Item->sortOrder 
13d50 26 20 73 6f 72 74 4f 72 64 65 72 4d 61 73 6b 3b  & sortOrderMask;
13d60 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e 61 53 6f  .    pIndex->aSo
13d70 72 74 4f 72 64 65 72 5b 69 5d 20 3d 20 72 65 71  rtOrder[i] = req
13d80 75 65 73 74 65 64 53 6f 72 74 4f 72 64 65 72 3b  uestedSortOrder;
13d90 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44 65  .  }.  sqlite3De
13da0 66 61 75 6c 74 52 6f 77 45 73 74 28 70 49 6e 64  faultRowEst(pInd
13db0 65 78 29 3b 0a 0a 20 20 69 66 28 20 70 54 61 62  ex);..  if( pTab
13dc0 3d 3d 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  ==pParse->pNewTa
13dd0 62 6c 65 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  ble ){.    /* Th
13de0 69 73 20 72 6f 75 74 69 6e 65 20 68 61 73 20 62  is routine has b
13df0 65 65 6e 20 63 61 6c 6c 65 64 20 74 6f 20 63 72  een called to cr
13e00 65 61 74 65 20 61 6e 20 61 75 74 6f 6d 61 74 69  eate an automati
13e10 63 20 69 6e 64 65 78 20 61 73 20 61 0a 20 20 20  c index as a.   
13e20 20 2a 2a 20 72 65 73 75 6c 74 20 6f 66 20 61 20   ** result of a 
13e30 50 52 49 4d 41 52 59 20 4b 45 59 20 6f 72 20 55  PRIMARY KEY or U
13e40 4e 49 51 55 45 20 63 6c 61 75 73 65 20 6f 6e 20  NIQUE clause on 
13e50 61 20 63 6f 6c 75 6d 6e 20 64 65 66 69 6e 69 74  a column definit
13e60 69 6f 6e 2c 20 6f 72 0a 20 20 20 20 2a 2a 20 61  ion, or.    ** a
13e70 20 50 52 49 4d 41 52 59 20 4b 45 59 20 6f 72 20   PRIMARY KEY or 
13e80 55 4e 49 51 55 45 20 63 6c 61 75 73 65 20 66 6f  UNIQUE clause fo
13e90 6c 6c 6f 77 69 6e 67 20 74 68 65 20 63 6f 6c 75  llowing the colu
13ea0 6d 6e 20 64 65 66 69 6e 69 74 69 6f 6e 73 2e 0a  mn definitions..
13eb0 20 20 20 20 2a 2a 20 69 2e 65 2e 20 6f 6e 65 20      ** i.e. one 
13ec0 6f 66 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  of:.    **.    *
13ed0 2a 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74  * CREATE TABLE t
13ee0 28 78 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20  (x PRIMARY KEY, 
13ef0 79 29 3b 0a 20 20 20 20 2a 2a 20 43 52 45 41 54  y);.    ** CREAT
13f00 45 20 54 41 42 4c 45 20 74 28 78 2c 20 79 2c 20  E TABLE t(x, y, 
13f10 55 4e 49 51 55 45 28 78 2c 20 79 29 29 3b 0a 20  UNIQUE(x, y));. 
13f20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 45 69 74     **.    ** Eit
13f30 68 65 72 20 77 61 79 2c 20 63 68 65 63 6b 20 74  her way, check t
13f40 6f 20 73 65 65 20 69 66 20 74 68 65 20 74 61 62  o see if the tab
13f50 6c 65 20 61 6c 72 65 61 64 79 20 68 61 73 20 73  le already has s
13f60 75 63 68 20 61 6e 20 69 6e 64 65 78 2e 20 49 66  uch an index. If
13f70 0a 20 20 20 20 2a 2a 20 73 6f 2c 20 64 6f 6e 27  .    ** so, don'
13f80 74 20 62 6f 74 68 65 72 20 63 72 65 61 74 69 6e  t bother creatin
13f90 67 20 74 68 69 73 20 6f 6e 65 2e 20 54 68 69 73  g this one. This
13fa0 20 6f 6e 6c 79 20 61 70 70 6c 69 65 73 20 74 6f   only applies to
13fb0 0a 20 20 20 20 2a 2a 20 61 75 74 6f 6d 61 74 69  .    ** automati
13fc0 63 61 6c 6c 79 20 63 72 65 61 74 65 64 20 69 6e  cally created in
13fd0 64 69 63 65 73 2e 20 55 73 65 72 73 20 63 61 6e  dices. Users can
13fe0 20 64 6f 20 61 73 20 74 68 65 79 20 77 69 73 68   do as they wish
13ff0 20 77 69 74 68 0a 20 20 20 20 2a 2a 20 65 78 70   with.    ** exp
14000 6c 69 63 69 74 20 69 6e 64 69 63 65 73 2e 0a 20  licit indices.. 
14010 20 20 20 2a 2f 0a 20 20 20 20 49 6e 64 65 78 20     */.    Index 
14020 2a 70 49 64 78 3b 0a 20 20 20 20 66 6f 72 28 70  *pIdx;.    for(p
14030 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78  Idx=pTab->pIndex
14040 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64  ; pIdx; pIdx=pId
14050 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20  x->pNext){.     
14060 20 69 6e 74 20 6b 3b 0a 20 20 20 20 20 20 61 73   int k;.      as
14070 73 65 72 74 28 20 70 49 64 78 2d 3e 6f 6e 45 72  sert( pIdx->onEr
14080 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 20 29 3b 0a  ror!=OE_None );.
14090 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49        assert( pI
140a0 64 78 2d 3e 61 75 74 6f 49 6e 64 65 78 20 29 3b  dx->autoIndex );
140b0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
140c0 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d  Index->onError!=
140d0 4f 45 5f 4e 6f 6e 65 20 29 3b 0a 0a 20 20 20 20  OE_None );..    
140e0 20 20 69 66 28 20 70 49 64 78 2d 3e 6e 43 6f 6c    if( pIdx->nCol
140f0 75 6d 6e 21 3d 70 49 6e 64 65 78 2d 3e 6e 43 6f  umn!=pIndex->nCo
14100 6c 75 6d 6e 20 29 20 63 6f 6e 74 69 6e 75 65 3b  lumn ) continue;
14110 0a 20 20 20 20 20 20 66 6f 72 28 6b 3d 30 3b 20  .      for(k=0; 
14120 6b 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b  k<pIdx->nColumn;
14130 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 63   k++){.        c
14140 6f 6e 73 74 20 63 68 61 72 20 2a 7a 31 20 3d 20  onst char *z1 = 
14150 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6b 5d 3b  pIdx->azColl[k];
14160 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63  .        const c
14170 68 61 72 20 2a 7a 32 20 3d 20 70 49 6e 64 65 78  har *z2 = pIndex
14180 2d 3e 61 7a 43 6f 6c 6c 5b 6b 5d 3b 0a 20 20 20  ->azColl[k];.   
14190 20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 61       if( pIdx->a
141a0 69 43 6f 6c 75 6d 6e 5b 6b 5d 21 3d 70 49 6e 64  iColumn[k]!=pInd
141b0 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6b 5d 20  ex->aiColumn[k] 
141c0 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20  ) break;.       
141d0 20 69 66 28 20 70 49 64 78 2d 3e 61 53 6f 72 74   if( pIdx->aSort
141e0 4f 72 64 65 72 5b 6b 5d 21 3d 70 49 6e 64 65 78  Order[k]!=pIndex
141f0 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 6b 5d 20  ->aSortOrder[k] 
14200 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20  ) break;.       
14210 20 69 66 28 20 7a 31 21 3d 7a 32 20 26 26 20 73   if( z1!=z2 && s
14220 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 31  qlite3StrICmp(z1
14230 2c 20 7a 32 29 20 29 20 62 72 65 61 6b 3b 0a 20  , z2) ) break;. 
14240 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
14250 20 6b 3d 3d 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d   k==pIdx->nColum
14260 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  n ){.        if(
14270 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d   pIdx->onError!=
14280 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 20  pIndex->onError 
14290 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
142a0 54 68 69 73 20 63 6f 6e 73 74 72 61 69 6e 74 20  This constraint 
142b0 63 72 65 61 74 65 73 20 74 68 65 20 73 61 6d 65  creates the same
142c0 20 69 6e 64 65 78 20 61 73 20 61 20 70 72 65 76   index as a prev
142d0 69 6f 75 73 0a 20 20 20 20 20 20 20 20 20 20 2a  ious.          *
142e0 2a 20 63 6f 6e 73 74 72 61 69 6e 74 20 73 70 65  * constraint spe
142f0 63 69 66 69 65 64 20 73 6f 6d 65 77 68 65 72 65  cified somewhere
14300 20 69 6e 20 74 68 65 20 43 52 45 41 54 45 20 54   in the CREATE T
14310 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a  ABLE statement..
14320 20 20 20 20 20 20 20 20 20 20 2a 2a 20 48 6f 77            ** How
14330 65 76 65 72 20 74 68 65 20 4f 4e 20 43 4f 4e 46  ever the ON CONF
14340 4c 49 43 54 20 63 6c 61 75 73 65 73 20 61 72 65  LICT clauses are
14350 20 64 69 66 66 65 72 65 6e 74 2e 20 49 66 20 62   different. If b
14360 6f 74 68 20 74 68 69 73 20 0a 20 20 20 20 20 20  oth this .      
14370 20 20 20 20 2a 2a 20 63 6f 6e 73 74 72 61 69 6e      ** constrain
14380 74 20 61 6e 64 20 74 68 65 20 70 72 65 76 69 6f  t and the previo
14390 75 73 20 65 71 75 69 76 61 6c 65 6e 74 20 63 6f  us equivalent co
143a0 6e 73 74 72 61 69 6e 74 20 68 61 76 65 20 65 78  nstraint have ex
143b0 70 6c 69 63 69 74 0a 20 20 20 20 20 20 20 20 20  plicit.         
143c0 20 2a 2a 20 4f 4e 20 43 4f 4e 46 4c 49 43 54 20   ** ON CONFLICT 
143d0 63 6c 61 75 73 65 73 20 74 68 69 73 20 69 73 20  clauses this is 
143e0 61 6e 20 65 72 72 6f 72 2e 20 4f 74 68 65 72 77  an error. Otherw
143f0 69 73 65 2c 20 75 73 65 20 74 68 65 0a 20 20 20  ise, use the.   
14400 20 20 20 20 20 20 20 2a 2a 20 65 78 70 6c 69 63         ** explic
14410 69 74 6c 79 20 73 70 65 63 69 66 69 65 64 20 62  itly specified b
14420 65 68 61 76 69 6f 75 72 20 66 6f 72 20 74 68 65  ehaviour for the
14430 20 69 6e 64 65 78 2e 0a 20 20 20 20 20 20 20 20   index..        
14440 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69    */.          i
14450 66 28 20 21 28 70 49 64 78 2d 3e 6f 6e 45 72 72  f( !(pIdx->onErr
14460 6f 72 3d 3d 4f 45 5f 44 65 66 61 75 6c 74 20 7c  or==OE_Default |
14470 7c 20 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f  | pIndex->onErro
14480 72 3d 3d 4f 45 5f 44 65 66 61 75 6c 74 29 20 29  r==OE_Default) )
14490 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  {.            sq
144a0 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
144b0 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20 20  arse, .         
144c0 20 20 20 20 20 20 20 22 63 6f 6e 66 6c 69 63 74         "conflict
144d0 69 6e 67 20 4f 4e 20 43 4f 4e 46 4c 49 43 54 20  ing ON CONFLICT 
144e0 63 6c 61 75 73 65 73 20 73 70 65 63 69 66 69 65  clauses specifie
144f0 64 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  d", 0);.        
14500 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66    }.          if
14510 28 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 3d  ( pIdx->onError=
14520 3d 4f 45 5f 44 65 66 61 75 6c 74 20 29 7b 0a 20  =OE_Default ){. 
14530 20 20 20 20 20 20 20 20 20 20 20 70 49 64 78 2d             pIdx-
14540 3e 6f 6e 45 72 72 6f 72 20 3d 20 70 49 6e 64 65  >onError = pInde
14550 78 2d 3e 6f 6e 45 72 72 6f 72 3b 0a 20 20 20 20  x->onError;.    
14560 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
14570 7d 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65  }.        goto e
14580 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
14590 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
145a0 20 20 7d 0a 0a 20 20 2f 2a 20 4c 69 6e 6b 20 74    }..  /* Link t
145b0 68 65 20 6e 65 77 20 49 6e 64 65 78 20 73 74 72  he new Index str
145c0 75 63 74 75 72 65 20 74 6f 20 69 74 73 20 74 61  ucture to its ta
145d0 62 6c 65 20 61 6e 64 20 74 6f 20 74 68 65 20 6f  ble and to the o
145e0 74 68 65 72 0a 20 20 2a 2a 20 69 6e 2d 6d 65 6d  ther.  ** in-mem
145f0 6f 72 79 20 64 61 74 61 62 61 73 65 20 73 74 72  ory database str
14600 75 63 74 75 72 65 73 2e 20 0a 20 20 2a 2f 0a 20  uctures. .  */. 
14610 20 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75   if( db->init.bu
14620 73 79 20 29 7b 0a 20 20 20 20 49 6e 64 65 78 20  sy ){.    Index 
14630 2a 70 3b 0a 20 20 20 20 70 20 3d 20 73 71 6c 69  *p;.    p = sqli
14640 74 65 33 48 61 73 68 49 6e 73 65 72 74 28 26 70  te3HashInsert(&p
14650 49 6e 64 65 78 2d 3e 70 53 63 68 65 6d 61 2d 3e  Index->pSchema->
14660 69 64 78 48 61 73 68 2c 20 0a 20 20 20 20 20 20  idxHash, .      
14670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14680 20 20 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65     pIndex->zName
14690 2c 20 73 74 72 6c 65 6e 28 70 49 6e 64 65 78 2d  , strlen(pIndex-
146a0 3e 7a 4e 61 6d 65 29 2b 31 2c 20 70 49 6e 64 65  >zName)+1, pInde
146b0 78 29 3b 0a 20 20 20 20 69 66 28 20 70 20 29 7b  x);.    if( p ){
146c0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
146d0 3d 3d 70 49 6e 64 65 78 20 29 3b 20 20 2f 2a 20  ==pIndex );  /* 
146e0 4d 61 6c 6c 6f 63 20 6d 75 73 74 20 68 61 76 65  Malloc must have
146f0 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20 20 20 20   failed */.     
14700 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
14710 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20  e_index;.    }. 
14720 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20     db->flags |= 
14730 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61  SQLITE_InternCha
14740 6e 67 65 73 3b 0a 20 20 20 20 69 66 28 20 70 54  nges;.    if( pT
14750 62 6c 4e 61 6d 65 21 3d 30 20 29 7b 0a 20 20 20  blName!=0 ){.   
14760 20 20 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 20     pIndex->tnum 
14770 3d 20 64 62 2d 3e 69 6e 69 74 2e 6e 65 77 54 6e  = db->init.newTn
14780 75 6d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  um;.    }.  }.. 
14790 20 2f 2a 20 49 66 20 74 68 65 20 64 62 2d 3e 69   /* If the db->i
147a0 6e 69 74 2e 62 75 73 79 20 69 73 20 30 20 74 68  nit.busy is 0 th
147b0 65 6e 20 63 72 65 61 74 65 20 74 68 65 20 69 6e  en create the in
147c0 64 65 78 20 6f 6e 20 64 69 73 6b 2e 20 20 54 68  dex on disk.  Th
147d0 69 73 0a 20 20 2a 2a 20 69 6e 76 6f 6c 76 65 73  is.  ** involves
147e0 20 77 72 69 74 69 6e 67 20 74 68 65 20 69 6e 64   writing the ind
147f0 65 78 20 69 6e 74 6f 20 74 68 65 20 6d 61 73 74  ex into the mast
14800 65 72 20 74 61 62 6c 65 20 61 6e 64 20 66 69 6c  er table and fil
14810 6c 69 6e 67 20 69 6e 20 74 68 65 0a 20 20 2a 2a  ling in the.  **
14820 20 69 6e 64 65 78 20 77 69 74 68 20 74 68 65 20   index with the 
14830 63 75 72 72 65 6e 74 20 74 61 62 6c 65 20 63 6f  current table co
14840 6e 74 65 6e 74 73 2e 0a 20 20 2a 2a 0a 20 20 2a  ntents..  **.  *
14850 2a 20 54 68 65 20 64 62 2d 3e 69 6e 69 74 2e 62  * The db->init.b
14860 75 73 79 20 69 73 20 30 20 77 68 65 6e 20 74 68  usy is 0 when th
14870 65 20 75 73 65 72 20 66 69 72 73 74 20 65 6e 74  e user first ent
14880 65 72 73 20 61 20 43 52 45 41 54 45 20 49 4e 44  ers a CREATE IND
14890 45 58 20 0a 20 20 2a 2a 20 63 6f 6d 6d 61 6e 64  EX .  ** command
148a0 2e 20 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  .  db->init.busy
148b0 20 69 73 20 31 20 77 68 65 6e 20 61 20 64 61 74   is 1 when a dat
148c0 61 62 61 73 65 20 69 73 20 6f 70 65 6e 65 64 20  abase is opened 
148d0 61 6e 64 20 0a 20 20 2a 2a 20 43 52 45 41 54 45  and .  ** CREATE
148e0 20 49 4e 44 45 58 20 73 74 61 74 65 6d 65 6e 74   INDEX statement
148f0 73 20 61 72 65 20 72 65 61 64 20 6f 75 74 20 6f  s are read out o
14900 66 20 74 68 65 20 6d 61 73 74 65 72 20 74 61 62  f the master tab
14910 6c 65 2e 20 20 49 6e 0a 20 20 2a 2a 20 74 68 65  le.  In.  ** the
14920 20 6c 61 74 74 65 72 20 63 61 73 65 20 74 68 65   latter case the
14930 20 69 6e 64 65 78 20 61 6c 72 65 61 64 79 20 65   index already e
14940 78 69 73 74 73 20 6f 6e 20 64 69 73 6b 2c 20 77  xists on disk, w
14950 68 69 63 68 20 69 73 20 77 68 79 0a 20 20 2a 2a  hich is why.  **
14960 20 77 65 20 64 6f 6e 27 74 20 77 61 6e 74 20 74   we don't want t
14970 6f 20 72 65 63 72 65 61 74 65 20 69 74 2e 0a 20  o recreate it.. 
14980 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 70 54 62 6c   **.  ** If pTbl
14990 4e 61 6d 65 3d 3d 30 20 69 74 20 6d 65 61 6e 73  Name==0 it means
149a0 20 74 68 69 73 20 69 6e 64 65 78 20 69 73 20 67   this index is g
149b0 65 6e 65 72 61 74 65 64 20 61 73 20 61 20 70 72  enerated as a pr
149c0 69 6d 61 72 79 20 6b 65 79 0a 20 20 2a 2a 20 6f  imary key.  ** o
149d0 72 20 55 4e 49 51 55 45 20 63 6f 6e 73 74 72 61  r UNIQUE constra
149e0 69 6e 74 20 6f 66 20 61 20 43 52 45 41 54 45 20  int of a CREATE 
149f0 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e  TABLE statement.
14a00 20 20 53 69 6e 63 65 20 74 68 65 20 74 61 62 6c    Since the tabl
14a10 65 0a 20 20 2a 2a 20 68 61 73 20 6a 75 73 74 20  e.  ** has just 
14a20 62 65 65 6e 20 63 72 65 61 74 65 64 2c 20 69 74  been created, it
14a30 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 64 61 74   contains no dat
14a40 61 20 61 6e 64 20 74 68 65 20 69 6e 64 65 78 20  a and the index 
14a50 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 0a 20  initialization. 
14a60 20 2a 2a 20 73 74 65 70 20 63 61 6e 20 62 65 20   ** step can be 
14a70 73 6b 69 70 70 65 64 2e 0a 20 20 2a 2f 0a 20 20  skipped..  */.  
14a80 65 6c 73 65 20 69 66 28 20 64 62 2d 3e 69 6e 69  else if( db->ini
14a90 74 2e 62 75 73 79 3d 3d 30 20 29 7b 0a 20 20 20  t.busy==0 ){.   
14aa0 20 56 64 62 65 20 2a 76 3b 0a 20 20 20 20 63 68   Vdbe *v;.    ch
14ab0 61 72 20 2a 7a 53 74 6d 74 3b 0a 20 20 20 20 69  ar *zStmt;.    i
14ac0 6e 74 20 69 4d 65 6d 20 3d 20 70 50 61 72 73 65  nt iMem = pParse
14ad0 2d 3e 6e 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20 76  ->nMem++;..    v
14ae0 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
14af0 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 69  e(pParse);.    i
14b00 66 28 20 76 3d 3d 30 20 29 20 67 6f 74 6f 20 65  f( v==0 ) goto e
14b10 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
14b20 3b 0a 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74  ;...    /* Creat
14b30 65 20 74 68 65 20 72 6f 6f 74 70 61 67 65 20 66  e the rootpage f
14b40 6f 72 20 74 68 65 20 69 6e 64 65 78 0a 20 20 20  or the index.   
14b50 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 42   */.    sqlite3B
14b60 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69  eginWriteOperati
14b70 6f 6e 28 70 50 61 72 73 65 2c 20 31 2c 20 69 44  on(pParse, 1, iD
14b80 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  b);.    sqlite3V
14b90 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43  dbeAddOp(v, OP_C
14ba0 72 65 61 74 65 49 6e 64 65 78 2c 20 69 44 62 2c  reateIndex, iDb,
14bb0 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
14bc0 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
14bd0 4d 65 6d 53 74 6f 72 65 2c 20 69 4d 65 6d 2c 20  MemStore, iMem, 
14be0 30 29 3b 0a 0a 20 20 20 20 2f 2a 20 47 61 74 68  0);..    /* Gath
14bf0 65 72 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20  er the complete 
14c00 74 65 78 74 20 6f 66 20 74 68 65 20 43 52 45 41  text of the CREA
14c10 54 45 20 49 4e 44 45 58 20 73 74 61 74 65 6d 65  TE INDEX stateme
14c20 6e 74 20 69 6e 74 6f 0a 20 20 20 20 2a 2a 20 74  nt into.    ** t
14c30 68 65 20 7a 53 74 6d 74 20 76 61 72 69 61 62 6c  he zStmt variabl
14c40 65 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  e.    */.    if(
14c50 20 70 53 74 61 72 74 20 26 26 20 70 45 6e 64 20   pStart && pEnd 
14c60 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 20 6e 61  ){.      /* A na
14c70 6d 65 64 20 69 6e 64 65 78 20 77 69 74 68 20 61  med index with a
14c80 6e 20 65 78 70 6c 69 63 69 74 20 43 52 45 41 54  n explicit CREAT
14c90 45 20 49 4e 44 45 58 20 73 74 61 74 65 6d 65 6e  E INDEX statemen
14ca0 74 20 2a 2f 0a 20 20 20 20 20 20 7a 53 74 6d 74  t */.      zStmt
14cb0 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74   = sqlite3MPrint
14cc0 66 28 22 43 52 45 41 54 45 25 73 20 49 4e 44 45  f("CREATE%s INDE
14cd0 58 20 25 2e 2a 73 22 2c 0a 20 20 20 20 20 20 20  X %.*s",.       
14ce0 20 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 4e 6f 6e   onError==OE_Non
14cf0 65 20 3f 20 22 22 20 3a 20 22 20 55 4e 49 51 55  e ? "" : " UNIQU
14d00 45 22 2c 0a 20 20 20 20 20 20 20 20 70 45 6e 64  E",.        pEnd
14d10 2d 3e 7a 20 2d 20 70 4e 61 6d 65 2d 3e 7a 20 2b  ->z - pName->z +
14d20 20 31 2c 0a 20 20 20 20 20 20 20 20 70 4e 61 6d   1,.        pNam
14d30 65 2d 3e 7a 29 3b 0a 20 20 20 20 7d 65 6c 73 65  e->z);.    }else
14d40 7b 0a 20 20 20 20 20 20 2f 2a 20 41 6e 20 61 75  {.      /* An au
14d50 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 63 72  tomatic index cr
14d60 65 61 74 65 64 20 62 79 20 61 20 50 52 49 4d 41  eated by a PRIMA
14d70 52 59 20 4b 45 59 20 6f 72 20 55 4e 49 51 55 45  RY KEY or UNIQUE
14d80 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 20   constraint */. 
14d90 20 20 20 20 20 2f 2a 20 7a 53 74 6d 74 20 3d 20       /* zStmt = 
14da0 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 22  sqlite3MPrintf("
14db0 22 29 3b 20 2a 2f 0a 20 20 20 20 20 20 7a 53 74  "); */.      zSt
14dc0 6d 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20  mt = 0;.    }.. 
14dd0 20 20 20 2f 2a 20 41 64 64 20 61 6e 20 65 6e 74     /* Add an ent
14de0 72 79 20 69 6e 20 73 71 6c 69 74 65 5f 6d 61 73  ry in sqlite_mas
14df0 74 65 72 20 66 6f 72 20 74 68 69 73 20 69 6e 64  ter for this ind
14e00 65 78 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71  ex.    */.    sq
14e10 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72 73 65  lite3NestedParse
14e20 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20  (pParse, .      
14e30 20 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 25    "INSERT INTO %
14e40 51 2e 25 73 20 56 41 4c 55 45 53 28 27 69 6e 64  Q.%s VALUES('ind
14e50 65 78 27 2c 25 51 2c 25 51 2c 23 30 2c 25 51 29  ex',%Q,%Q,#0,%Q)
14e60 3b 22 2c 0a 20 20 20 20 20 20 20 20 64 62 2d 3e  ;",.        db->
14e70 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 2c 20  aDb[iDb].zName, 
14e80 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 44 62  SCHEMA_TABLE(iDb
14e90 29 2c 0a 20 20 20 20 20 20 20 20 70 49 6e 64 65  ),.        pInde
14ea0 78 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20  x->zName,.      
14eb0 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 0a 20    pTab->zName,. 
14ec0 20 20 20 20 20 20 20 7a 53 74 6d 74 0a 20 20 20         zStmt.   
14ed0 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   );.    sqlite3V
14ee0 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50  dbeAddOp(v, OP_P
14ef0 6f 70 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 73  op, 1, 0);.    s
14f00 71 6c 69 74 65 46 72 65 65 28 7a 53 74 6d 74 29  qliteFree(zStmt)
14f10 3b 0a 0a 20 20 20 20 2f 2a 20 46 69 6c 6c 20 74  ;..    /* Fill t
14f20 68 65 20 69 6e 64 65 78 20 77 69 74 68 20 64 61  he index with da
14f30 74 61 20 61 6e 64 20 72 65 70 61 72 73 65 20 74  ta and reparse t
14f40 68 65 20 73 63 68 65 6d 61 2e 20 43 6f 64 65 20  he schema. Code 
14f50 61 6e 20 4f 50 5f 45 78 70 69 72 65 0a 20 20 20  an OP_Expire.   
14f60 20 2a 2a 20 74 6f 20 69 6e 76 61 6c 69 64 61 74   ** to invalidat
14f70 65 20 61 6c 6c 20 70 72 65 2d 63 6f 6d 70 69 6c  e all pre-compil
14f80 65 64 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 20  ed statements.. 
14f90 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 54     */.    if( pT
14fa0 62 6c 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20  blName ){.      
14fb0 73 71 6c 69 74 65 33 52 65 66 69 6c 6c 49 6e 64  sqlite3RefillInd
14fc0 65 78 28 70 50 61 72 73 65 2c 20 70 49 6e 64 65  ex(pParse, pInde
14fd0 78 2c 20 69 4d 65 6d 29 3b 0a 20 20 20 20 20 20  x, iMem);.      
14fe0 73 71 6c 69 74 65 33 43 68 61 6e 67 65 43 6f 6f  sqlite3ChangeCoo
14ff0 6b 69 65 28 64 62 2c 20 76 2c 20 69 44 62 29 3b  kie(db, v, iDb);
15000 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
15010 62 65 4f 70 33 28 76 2c 20 4f 50 5f 50 61 72 73  beOp3(v, OP_Pars
15020 65 53 63 68 65 6d 61 2c 20 69 44 62 2c 20 30 2c  eSchema, iDb, 0,
15030 0a 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  .         sqlite
15040 33 4d 50 72 69 6e 74 66 28 22 6e 61 6d 65 3d 27  3MPrintf("name='
15050 25 71 27 22 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e  %q'", pIndex->zN
15060 61 6d 65 29 2c 20 50 33 5f 44 59 4e 41 4d 49 43  ame), P3_DYNAMIC
15070 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
15080 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
15090 45 78 70 69 72 65 2c 20 30 2c 20 30 29 3b 0a 20  Expire, 0, 0);. 
150a0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57     }.  }..  /* W
150b0 68 65 6e 20 61 64 64 69 6e 67 20 61 6e 20 69 6e  hen adding an in
150c0 64 65 78 20 74 6f 20 74 68 65 20 6c 69 73 74 20  dex to the list 
150d0 6f 66 20 69 6e 64 69 63 65 73 20 66 6f 72 20 61  of indices for a
150e0 20 74 61 62 6c 65 2c 20 6d 61 6b 65 0a 20 20 2a   table, make.  *
150f0 2a 20 73 75 72 65 20 61 6c 6c 20 69 6e 64 69 63  * sure all indic
15100 65 73 20 6c 61 62 65 6c 65 64 20 4f 45 5f 52 65  es labeled OE_Re
15110 70 6c 61 63 65 20 63 6f 6d 65 20 61 66 74 65 72  place come after
15120 20 61 6c 6c 20 74 68 6f 73 65 20 6c 61 62 65 6c   all those label
15130 65 64 0a 20 20 2a 2a 20 4f 45 5f 49 67 6e 6f 72  ed.  ** OE_Ignor
15140 65 2e 20 20 54 68 69 73 20 69 73 20 6e 65 63 65  e.  This is nece
15150 73 73 61 72 79 20 66 6f 72 20 74 68 65 20 63 6f  ssary for the co
15160 72 72 65 63 74 20 6f 70 65 72 61 74 69 6f 6e 20  rrect operation 
15170 6f 66 20 55 50 44 41 54 45 0a 20 20 2a 2a 20 61  of UPDATE.  ** a
15180 6e 64 20 49 4e 53 45 52 54 2e 0a 20 20 2a 2f 0a  nd INSERT..  */.
15190 20 20 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62    if( db->init.b
151a0 75 73 79 20 7c 7c 20 70 54 62 6c 4e 61 6d 65 3d  usy || pTblName=
151b0 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 6f 6e  =0 ){.    if( on
151c0 45 72 72 6f 72 21 3d 4f 45 5f 52 65 70 6c 61 63  Error!=OE_Replac
151d0 65 20 7c 7c 20 70 54 61 62 2d 3e 70 49 6e 64 65  e || pTab->pInde
151e0 78 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 7c 7c  x==0.         ||
151f0 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 2d 3e 6f   pTab->pIndex->o
15200 6e 45 72 72 6f 72 3d 3d 4f 45 5f 52 65 70 6c 61  nError==OE_Repla
15210 63 65 29 7b 0a 20 20 20 20 20 20 70 49 6e 64 65  ce){.      pInde
15220 78 2d 3e 70 4e 65 78 74 20 3d 20 70 54 61 62 2d  x->pNext = pTab-
15230 3e 70 49 6e 64 65 78 3b 0a 20 20 20 20 20 20 70  >pIndex;.      p
15240 54 61 62 2d 3e 70 49 6e 64 65 78 20 3d 20 70 49  Tab->pIndex = pI
15250 6e 64 65 78 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ndex;.    }else{
15260 0a 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70 4f  .      Index *pO
15270 74 68 65 72 20 3d 20 70 54 61 62 2d 3e 70 49 6e  ther = pTab->pIn
15280 64 65 78 3b 0a 20 20 20 20 20 20 77 68 69 6c 65  dex;.      while
15290 28 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74 20  ( pOther->pNext 
152a0 26 26 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74  && pOther->pNext
152b0 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 52 65  ->onError!=OE_Re
152c0 70 6c 61 63 65 20 29 7b 0a 20 20 20 20 20 20 20  place ){.       
152d0 20 70 4f 74 68 65 72 20 3d 20 70 4f 74 68 65 72   pOther = pOther
152e0 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d  ->pNext;.      }
152f0 0a 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 70  .      pIndex->p
15300 4e 65 78 74 20 3d 20 70 4f 74 68 65 72 2d 3e 70  Next = pOther->p
15310 4e 65 78 74 3b 0a 20 20 20 20 20 20 70 4f 74 68  Next;.      pOth
15320 65 72 2d 3e 70 4e 65 78 74 20 3d 20 70 49 6e 64  er->pNext = pInd
15330 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 49  ex;.    }.    pI
15340 6e 64 65 78 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20  ndex = 0;.  }.. 
15350 20 2f 2a 20 43 6c 65 61 6e 20 75 70 20 62 65 66   /* Clean up bef
15360 6f 72 65 20 65 78 69 74 69 6e 67 20 2a 2f 0a 65  ore exiting */.e
15370 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
15380 3a 0a 20 20 69 66 28 20 70 49 6e 64 65 78 20 29  :.  if( pIndex )
15390 7b 0a 20 20 20 20 66 72 65 65 49 6e 64 65 78 28  {.    freeIndex(
153a0 70 49 6e 64 65 78 29 3b 0a 20 20 7d 0a 20 20 73  pIndex);.  }.  s
153b0 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65  qlite3ExprListDe
153c0 6c 65 74 65 28 70 4c 69 73 74 29 3b 0a 20 20 73  lete(pList);.  s
153d0 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c  qlite3SrcListDel
153e0 65 74 65 28 70 54 62 6c 4e 61 6d 65 29 3b 0a 20  ete(pTblName);. 
153f0 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4e 61 6d   sqliteFree(zNam
15400 65 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a  e);.  return;.}.
15410 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
15420 63 6f 64 65 20 74 6f 20 6d 61 6b 65 20 73 75 72  code to make sur
15430 65 20 74 68 65 20 66 69 6c 65 20 66 6f 72 6d 61  e the file forma
15440 74 20 6e 75 6d 62 65 72 20 69 73 20 61 74 20 6c  t number is at l
15450 65 61 73 74 20 6d 69 6e 46 6f 72 6d 61 74 2e 0a  east minFormat..
15460 2a 2a 20 54 68 65 20 67 65 6e 65 72 61 74 65 64  ** The generated
15470 20 63 6f 64 65 20 77 69 6c 6c 20 69 6e 63 72 65   code will incre
15480 61 73 65 20 74 68 65 20 66 69 6c 65 20 66 6f 72  ase the file for
15490 6d 61 74 20 6e 75 6d 62 65 72 20 69 66 20 6e 65  mat number if ne
154a0 63 65 73 73 61 72 79 2e 0a 2a 2f 0a 76 6f 69 64  cessary..*/.void
154b0 20 73 71 6c 69 74 65 33 4d 69 6e 69 6d 75 6d 46   sqlite3MinimumF
154c0 69 6c 65 46 6f 72 6d 61 74 28 50 61 72 73 65 20  ileFormat(Parse 
154d0 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69 44 62  *pParse, int iDb
154e0 2c 20 69 6e 74 20 6d 69 6e 46 6f 72 6d 61 74 29  , int minFormat)
154f0 7b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 76  {.  Vdbe *v;.  v
15500 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
15510 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28  e(pParse);.  if(
15520 20 76 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65   v ){.    sqlite
15530 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
15540 5f 52 65 61 64 43 6f 6f 6b 69 65 2c 20 69 44 62  _ReadCookie, iDb
15550 2c 20 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 1);.    sqlite
15560 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
15570 5f 49 6e 74 65 67 65 72 2c 20 6d 69 6e 46 6f 72  _Integer, minFor
15580 6d 61 74 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  mat, 0);.    sql
15590 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
155a0 20 4f 50 5f 47 65 2c 20 30 2c 20 73 71 6c 69 74   OP_Ge, 0, sqlit
155b0 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
155c0 72 28 76 29 2b 33 29 3b 0a 20 20 20 20 73 71 6c  r(v)+3);.    sql
155d0 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
155e0 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 6d 69 6e   OP_Integer, min
155f0 46 6f 72 6d 61 74 2c 20 30 29 3b 0a 20 20 20 20  Format, 0);.    
15600 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
15610 28 76 2c 20 4f 50 5f 53 65 74 43 6f 6f 6b 69 65  (v, OP_SetCookie
15620 2c 20 69 44 62 2c 20 31 29 3b 0a 20 20 7d 0a 7d  , iDb, 1);.  }.}
15630 0a 0a 2f 2a 0a 2a 2a 20 46 69 6c 6c 20 74 68 65  ../*.** Fill the
15640 20 49 6e 64 65 78 2e 61 69 52 6f 77 45 73 74 5b   Index.aiRowEst[
15650 5d 20 61 72 72 61 79 20 77 69 74 68 20 64 65 66  ] array with def
15660 61 75 6c 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  ault information
15670 20 2d 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 2a   - information.*
15680 2a 20 74 6f 20 62 65 20 75 73 65 64 20 77 68 65  * to be used whe
15690 6e 20 77 65 20 68 61 76 65 20 6e 6f 74 20 72 75  n we have not ru
156a0 6e 20 74 68 65 20 41 4e 41 4c 59 5a 45 20 63 6f  n the ANALYZE co
156b0 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 61 69 52  mmand..**.** aiR
156c0 6f 77 45 73 74 5b 30 5d 20 69 73 20 73 75 70 70  owEst[0] is supp
156d0 6f 73 65 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74  ose to contain t
156e0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6c 65  he number of ele
156f0 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 69 6e 64  ments in the ind
15700 65 78 2e 0a 2a 2a 20 53 69 6e 63 65 20 77 65 20  ex..** Since we 
15710 64 6f 20 6e 6f 74 20 6b 6e 6f 77 2c 20 67 75 65  do not know, gue
15720 73 73 20 31 20 6d 69 6c 6c 69 6f 6e 2e 20 20 61  ss 1 million.  a
15730 69 52 6f 77 45 73 74 5b 31 5d 20 69 73 20 61 6e  iRowEst[1] is an
15740 20 65 73 74 69 6d 61 74 65 20 6f 66 20 74 68 65   estimate of the
15750 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f  .** number of ro
15760 77 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20  ws in the table 
15770 74 68 61 74 20 6d 61 74 63 68 20 61 6e 79 20 70  that match any p
15780 61 72 74 69 63 75 6c 61 72 20 76 61 6c 75 65 20  articular value 
15790 6f 66 20 74 68 65 0a 2a 2a 20 66 69 72 73 74 20  of the.** first 
157a0 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 69 6e  column of the in
157b0 64 65 78 2e 20 20 61 69 52 6f 77 45 73 74 5b 32  dex.  aiRowEst[2
157c0 5d 20 69 73 20 61 6e 20 65 73 74 69 6d 61 74 65  ] is an estimate
157d0 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 0a 2a   of the number.*
157e0 2a 20 6f 66 20 72 6f 77 73 20 74 68 61 74 20 6d  * of rows that m
157f0 61 74 63 68 20 61 6e 79 20 70 61 72 74 69 63 75  atch any particu
15800 6c 61 72 20 63 6f 6d 62 69 6e 69 61 74 69 6f 6e  lar combiniation
15810 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 32 20   of the first 2 
15820 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 6f 66 20 74 68  columns.** of th
15830 65 20 69 6e 64 65 78 2e 20 20 41 6e 64 20 73 6f  e index.  And so
15840 20 66 6f 72 74 68 2e 20 20 49 74 20 6d 75 73 74   forth.  It must
15850 20 61 6c 77 61 79 73 20 62 65 20 74 68 65 20 63   always be the c
15860 61 73 65 20 74 68 61 74 0a 2a 0a 2a 2a 20 20 20  ase that.*.**   
15870 20 20 20 20 20 20 20 20 61 69 52 6f 77 45 73 74          aiRowEst
15880 5b 4e 5d 3c 3d 61 69 52 6f 77 45 73 74 5b 4e 2d  [N]<=aiRowEst[N-
15890 31 5d 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  1].**           
158a0 61 69 52 6f 77 45 73 74 5b 4e 5d 3e 3d 31 0a 2a  aiRowEst[N]>=1.*
158b0 2a 0a 2a 2a 20 41 70 61 72 74 20 66 72 6f 6d 20  *.** Apart from 
158c0 74 68 61 74 2c 20 77 65 20 68 61 76 65 20 6c 69  that, we have li
158d0 74 74 6c 65 20 74 6f 20 67 6f 20 6f 6e 20 62 65  ttle to go on be
158e0 73 69 64 65 73 20 69 6e 74 75 69 74 69 6f 6e 20  sides intuition 
158f0 61 73 20 74 6f 0a 2a 2a 20 68 6f 77 20 61 69 52  as to.** how aiR
15900 6f 77 45 73 74 5b 5d 20 73 68 6f 75 6c 64 20 62  owEst[] should b
15910 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 20 20  e initialized.  
15920 54 68 65 20 6e 75 6d 62 65 72 73 20 67 65 6e 65  The numbers gene
15930 72 61 74 65 64 20 68 65 72 65 0a 2a 2a 20 61 72  rated here.** ar
15940 65 20 62 61 73 65 64 20 6f 6e 20 74 79 70 69 63  e based on typic
15950 61 6c 20 76 61 6c 75 65 73 20 66 6f 75 6e 64 20  al values found 
15960 69 6e 20 61 63 74 75 61 6c 20 69 6e 64 69 63 65  in actual indice
15970 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  s..*/.void sqlit
15980 65 33 44 65 66 61 75 6c 74 52 6f 77 45 73 74 28  e3DefaultRowEst(
15990 49 6e 64 65 78 20 2a 70 49 64 78 29 7b 0a 20 20  Index *pIdx){.  
159a0 75 6e 73 69 67 6e 65 64 20 2a 61 20 3d 20 70 49  unsigned *a = pI
159b0 64 78 2d 3e 61 69 52 6f 77 45 73 74 3b 0a 20 20  dx->aiRowEst;.  
159c0 69 6e 74 20 69 3b 0a 20 20 61 73 73 65 72 74 28  int i;.  assert(
159d0 20 61 21 3d 30 20 29 3b 0a 20 20 61 5b 30 5d 20   a!=0 );.  a[0] 
159e0 3d 20 31 30 30 30 30 30 30 3b 0a 20 20 66 6f 72  = 1000000;.  for
159f0 28 69 3d 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e  (i=pIdx->nColumn
15a00 3b 20 69 3e 3d 35 3b 20 69 2d 2d 29 7b 0a 20 20  ; i>=5; i--){.  
15a10 20 20 61 5b 69 5d 20 3d 20 35 3b 0a 20 20 7d 0a    a[i] = 5;.  }.
15a20 20 20 77 68 69 6c 65 28 20 69 3e 3d 31 20 29 7b    while( i>=1 ){
15a30 0a 20 20 20 20 61 5b 69 5d 20 3d 20 31 31 20 2d  .    a[i] = 11 -
15a40 20 69 3b 0a 20 20 20 20 69 2d 2d 3b 0a 20 20 7d   i;.    i--;.  }
15a50 0a 20 20 69 66 28 20 70 49 64 78 2d 3e 6f 6e 45  .  if( pIdx->onE
15a60 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 20 29 7b  rror!=OE_None ){
15a70 0a 20 20 20 20 61 5b 70 49 64 78 2d 3e 6e 43 6f  .    a[pIdx->nCo
15a80 6c 75 6d 6e 5d 20 3d 20 31 3b 0a 20 20 7d 0a 7d  lumn] = 1;.  }.}
15a90 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
15aa0 74 69 6e 65 20 77 69 6c 6c 20 64 72 6f 70 20 61  tine will drop a
15ab0 6e 20 65 78 69 73 74 69 6e 67 20 6e 61 6d 65 64  n existing named
15ac0 20 69 6e 64 65 78 2e 20 20 54 68 69 73 20 72 6f   index.  This ro
15ad0 75 74 69 6e 65 0a 2a 2a 20 69 6d 70 6c 65 6d 65  utine.** impleme
15ae0 6e 74 73 20 74 68 65 20 44 52 4f 50 20 49 4e 44  nts the DROP IND
15af0 45 58 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f  EX statement..*/
15b00 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 44 72 6f  .void sqlite3Dro
15b10 70 49 6e 64 65 78 28 50 61 72 73 65 20 2a 70 50  pIndex(Parse *pP
15b20 61 72 73 65 2c 20 53 72 63 4c 69 73 74 20 2a 70  arse, SrcList *p
15b30 4e 61 6d 65 2c 20 69 6e 74 20 69 66 45 78 69 73  Name, int ifExis
15b40 74 73 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 49  ts){.  Index *pI
15b50 6e 64 65 78 3b 0a 20 20 56 64 62 65 20 2a 76 3b  ndex;.  Vdbe *v;
15b60 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
15b70 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69   pParse->db;.  i
15b80 6e 74 20 69 44 62 3b 0a 0a 20 20 69 66 28 20 70  nt iDb;..  if( p
15b90 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 73  Parse->nErr || s
15ba0 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 46 61 69 6c  qlite3MallocFail
15bb0 65 64 28 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f  ed() ){.    goto
15bc0 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78   exit_drop_index
15bd0 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
15be0 70 4e 61 6d 65 2d 3e 6e 53 72 63 3d 3d 31 20 29  pName->nSrc==1 )
15bf0 3b 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f  ;.  if( SQLITE_O
15c00 4b 21 3d 73 71 6c 69 74 65 33 52 65 61 64 53 63  K!=sqlite3ReadSc
15c10 68 65 6d 61 28 70 50 61 72 73 65 29 20 29 7b 0a  hema(pParse) ){.
15c20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72      goto exit_dr
15c30 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20  op_index;.  }.  
15c40 70 49 6e 64 65 78 20 3d 20 73 71 6c 69 74 65 33  pIndex = sqlite3
15c50 46 69 6e 64 49 6e 64 65 78 28 64 62 2c 20 70 4e  FindIndex(db, pN
15c60 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 4e 61 6d 65 2c  ame->a[0].zName,
15c70 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 44 61   pName->a[0].zDa
15c80 74 61 62 61 73 65 29 3b 0a 20 20 69 66 28 20 70  tabase);.  if( p
15c90 49 6e 64 65 78 3d 3d 30 20 29 7b 0a 20 20 20 20  Index==0 ){.    
15ca0 69 66 28 20 21 69 66 45 78 69 73 74 73 20 29 7b  if( !ifExists ){
15cb0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
15cc0 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
15cd0 6e 6f 20 73 75 63 68 20 69 6e 64 65 78 3a 20 25  no such index: %
15ce0 53 22 2c 20 70 4e 61 6d 65 2c 20 30 29 3b 0a 20  S", pName, 0);. 
15cf0 20 20 20 7d 0a 20 20 20 20 70 50 61 72 73 65 2d     }.    pParse-
15d00 3e 63 68 65 63 6b 53 63 68 65 6d 61 20 3d 20 31  >checkSchema = 1
15d10 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f  ;.    goto exit_
15d20 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a  drop_index;.  }.
15d30 20 20 69 66 28 20 70 49 6e 64 65 78 2d 3e 61 75    if( pIndex->au
15d40 74 6f 49 6e 64 65 78 20 29 7b 0a 20 20 20 20 73  toIndex ){.    s
15d50 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
15d60 50 61 72 73 65 2c 20 22 69 6e 64 65 78 20 61 73  Parse, "index as
15d70 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 55 4e  sociated with UN
15d80 49 51 55 45 20 22 0a 20 20 20 20 20 20 22 6f 72  IQUE ".      "or
15d90 20 50 52 49 4d 41 52 59 20 4b 45 59 20 63 6f 6e   PRIMARY KEY con
15da0 73 74 72 61 69 6e 74 20 63 61 6e 6e 6f 74 20 62  straint cannot b
15db0 65 20 64 72 6f 70 70 65 64 22 2c 20 30 29 3b 0a  e dropped", 0);.
15dc0 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72      goto exit_dr
15dd0 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20  op_index;.  }.  
15de0 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68  iDb = sqlite3Sch
15df0 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70  emaToIndex(db, p
15e00 49 6e 64 65 78 2d 3e 70 53 63 68 65 6d 61 29 3b  Index->pSchema);
15e10 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
15e20 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49  OMIT_AUTHORIZATI
15e30 4f 4e 0a 20 20 7b 0a 20 20 20 20 69 6e 74 20 63  ON.  {.    int c
15e40 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f  ode = SQLITE_DRO
15e50 50 5f 49 4e 44 45 58 3b 0a 20 20 20 20 54 61 62  P_INDEX;.    Tab
15e60 6c 65 20 2a 70 54 61 62 20 3d 20 70 49 6e 64 65  le *pTab = pInde
15e70 78 2d 3e 70 54 61 62 6c 65 3b 0a 20 20 20 20 63  x->pTable;.    c
15e80 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 20 3d  onst char *zDb =
15e90 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e   db->aDb[iDb].zN
15ea0 61 6d 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63  ame;.    const c
15eb0 68 61 72 20 2a 7a 54 61 62 20 3d 20 53 43 48 45  har *zTab = SCHE
15ec0 4d 41 5f 54 41 42 4c 45 28 69 44 62 29 3b 0a 20  MA_TABLE(iDb);. 
15ed0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75     if( sqlite3Au
15ee0 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  thCheck(pParse, 
15ef0 53 51 4c 49 54 45 5f 44 45 4c 45 54 45 2c 20 7a  SQLITE_DELETE, z
15f00 54 61 62 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a  Tab, 0, zDb) ){.
15f10 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f        goto exit_
15f20 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 20 20  drop_index;.    
15f30 7d 0a 20 20 20 20 69 66 28 20 21 4f 4d 49 54 5f  }.    if( !OMIT_
15f40 54 45 4d 50 44 42 20 26 26 20 69 44 62 20 29 20  TEMPDB && iDb ) 
15f50 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52  code = SQLITE_DR
15f60 4f 50 5f 54 45 4d 50 5f 49 4e 44 45 58 3b 0a 20  OP_TEMP_INDEX;. 
15f70 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75     if( sqlite3Au
15f80 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  thCheck(pParse, 
15f90 63 6f 64 65 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e  code, pIndex->zN
15fa0 61 6d 65 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  ame, pTab->zName
15fb0 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20  , zDb) ){.      
15fc0 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69  goto exit_drop_i
15fd0 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ndex;.    }.  }.
15fe0 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 47 65 6e  #endif..  /* Gen
15ff0 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 72 65  erate code to re
16000 6d 6f 76 65 20 74 68 65 20 69 6e 64 65 78 20 61  move the index a
16010 6e 64 20 66 72 6f 6d 20 74 68 65 20 6d 61 73 74  nd from the mast
16020 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20 76 20  er table */.  v 
16030 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
16040 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20  (pParse);.  if( 
16050 76 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  v ){.    sqlite3
16060 4e 65 73 74 65 64 50 61 72 73 65 28 70 50 61 72  NestedParse(pPar
16070 73 65 2c 0a 20 20 20 20 20 20 20 22 44 45 4c 45  se,.       "DELE
16080 54 45 20 46 52 4f 4d 20 25 51 2e 25 73 20 57 48  TE FROM %Q.%s WH
16090 45 52 45 20 6e 61 6d 65 3d 25 51 22 2c 0a 20 20  ERE name=%Q",.  
160a0 20 20 20 20 20 64 62 2d 3e 61 44 62 5b 69 44 62       db->aDb[iDb
160b0 5d 2e 7a 4e 61 6d 65 2c 20 53 43 48 45 4d 41 5f  ].zName, SCHEMA_
160c0 54 41 42 4c 45 28 69 44 62 29 2c 0a 20 20 20 20  TABLE(iDb),.    
160d0 20 20 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65     pIndex->zName
160e0 0a 20 20 20 20 29 3b 0a 20 20 20 20 73 71 6c 69  .    );.    sqli
160f0 74 65 33 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28  te3ChangeCookie(
16100 64 62 2c 20 76 2c 20 69 44 62 29 3b 0a 20 20 20  db, v, iDb);.   
16110 20 64 65 73 74 72 6f 79 52 6f 6f 74 50 61 67 65   destroyRootPage
16120 28 70 50 61 72 73 65 2c 20 70 49 6e 64 65 78 2d  (pParse, pIndex-
16130 3e 74 6e 75 6d 2c 20 69 44 62 29 3b 0a 20 20 20  >tnum, iDb);.   
16140 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28   sqlite3VdbeOp3(
16150 76 2c 20 4f 50 5f 44 72 6f 70 49 6e 64 65 78 2c  v, OP_DropIndex,
16160 20 69 44 62 2c 20 30 2c 20 70 49 6e 64 65 78 2d   iDb, 0, pIndex-
16170 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 7d 0a  >zName, 0);.  }.
16180 0a 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78  .exit_drop_index
16190 3a 0a 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69  :.  sqlite3SrcLi
161a0 73 74 44 65 6c 65 74 65 28 70 4e 61 6d 65 29 3b  stDelete(pName);
161b0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 41 72 72 61 79  .}../*.** pArray
161c0 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   is a pointer to
161d0 20 61 6e 20 61 72 72 61 79 20 6f 66 20 6f 62 6a   an array of obj
161e0 65 63 74 73 2e 20 20 45 61 63 68 20 6f 62 6a 65  ects.  Each obje
161f0 63 74 20 69 6e 20 74 68 65 0a 2a 2a 20 61 72 72  ct in the.** arr
16200 61 79 20 69 73 20 73 7a 45 6e 74 72 79 20 62 79  ay is szEntry by
16210 74 65 73 20 69 6e 20 73 69 7a 65 2e 20 20 54 68  tes in size.  Th
16220 69 73 20 72 6f 75 74 69 6e 65 20 61 6c 6c 6f 63  is routine alloc
16230 61 74 65 73 20 61 20 6e 65 77 0a 2a 2a 20 6f 62  ates a new.** ob
16240 6a 65 63 74 20 6f 6e 20 74 68 65 20 65 6e 64 20  ject on the end 
16250 6f 66 20 74 68 65 20 61 72 72 61 79 2e 0a 2a 2a  of the array..**
16260 0a 2a 2a 20 2a 70 6e 45 6e 74 72 79 20 69 73 20  .** *pnEntry is 
16270 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6e  the number of en
16280 74 72 69 65 73 20 61 6c 72 65 61 64 79 20 69 6e  tries already in
16290 20 75 73 65 2e 20 20 2a 70 6e 41 6c 6c 6f 63 20   use.  *pnAlloc 
162a0 69 73 0a 2a 2a 20 74 68 65 20 70 72 65 76 69 6f  is.** the previo
162b0 75 73 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 73  usly allocated s
162c0 69 7a 65 20 6f 66 20 74 68 65 20 61 72 72 61 79  ize of the array
162d0 2e 20 20 69 6e 69 74 53 69 7a 65 20 69 73 20 74  .  initSize is t
162e0 68 65 0a 2a 2a 20 73 75 67 67 65 73 74 65 64 20  he.** suggested 
162f0 69 6e 69 74 69 61 6c 20 61 72 72 61 79 20 73 69  initial array si
16300 7a 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e 0a 2a  ze allocation..*
16310 2a 0a 2a 2a 20 54 68 65 20 69 6e 64 65 78 20 6f  *.** The index o
16320 66 20 74 68 65 20 6e 65 77 20 65 6e 74 72 79 20  f the new entry 
16330 69 73 20 72 65 74 75 72 6e 65 64 20 69 6e 20 2a  is returned in *
16340 70 49 64 78 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  pIdx..**.** This
16350 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73   routine returns
16360 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
16370 65 20 61 72 72 61 79 20 6f 66 20 6f 62 6a 65 63  e array of objec
16380 74 73 2e 20 20 54 68 69 73 0a 2a 2a 20 6d 69 67  ts.  This.** mig
16390 68 74 20 62 65 20 74 68 65 20 73 61 6d 65 20 61  ht be the same a
163a0 73 20 74 68 65 20 70 41 72 72 61 79 20 70 61 72  s the pArray par
163b0 61 6d 65 74 65 72 20 6f 72 20 69 74 20 6d 69 67  ameter or it mig
163c0 68 74 20 62 65 20 61 20 64 69 66 66 65 72 65 6e  ht be a differen
163d0 74 0a 2a 2a 20 70 6f 69 6e 74 65 72 20 69 66 20  t.** pointer if 
163e0 74 68 65 20 61 72 72 61 79 20 77 61 73 20 72 65  the array was re
163f0 73 69 7a 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 2a  sized..*/.void *
16400 73 71 6c 69 74 65 33 41 72 72 61 79 41 6c 6c 6f  sqlite3ArrayAllo
16410 63 61 74 65 28 0a 20 20 76 6f 69 64 20 2a 70 41  cate(.  void *pA
16420 72 72 61 79 2c 20 20 20 20 20 2f 2a 20 41 72 72  rray,     /* Arr
16430 61 79 20 6f 66 20 6f 62 6a 65 63 74 73 2e 20 20  ay of objects.  
16440 4d 69 67 68 74 20 62 65 20 72 65 61 6c 6c 6f 63  Might be realloc
16450 61 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 73 7a  ated */.  int sz
16460 45 6e 74 72 79 2c 20 20 20 20 20 20 2f 2a 20 53  Entry,      /* S
16470 69 7a 65 20 6f 66 20 65 61 63 68 20 6f 62 6a 65  ize of each obje
16480 63 74 20 69 6e 20 74 68 65 20 61 72 72 61 79 20  ct in the array 
16490 2a 2f 0a 20 20 69 6e 74 20 69 6e 69 74 53 69 7a  */.  int initSiz
164a0 65 2c 20 20 20 20 20 2f 2a 20 53 75 67 67 65 73  e,     /* Sugges
164b0 74 65 64 20 69 6e 69 74 69 61 6c 20 61 6c 6c 6f  ted initial allo
164c0 63 61 74 69 6f 6e 2c 20 69 6e 20 65 6c 65 6d 65  cation, in eleme
164d0 6e 74 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e  nts */.  int *pn
164e0 45 6e 74 72 79 2c 20 20 20 20 20 2f 2a 20 4e 75  Entry,     /* Nu
164f0 6d 62 65 72 20 6f 66 20 6f 62 6a 65 63 74 73 20  mber of objects 
16500 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 75 73 65  currently in use
16510 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 41 6c 6c   */.  int *pnAll
16520 6f 63 2c 20 20 20 20 20 2f 2a 20 43 75 72 72 65  oc,     /* Curre
16530 6e 74 20 73 69 7a 65 20 6f 66 20 74 68 65 20 61  nt size of the a
16540 6c 6c 6f 63 61 74 69 6f 6e 2c 20 69 6e 20 65 6c  llocation, in el
16550 65 6d 65 6e 74 73 20 2a 2f 0a 20 20 69 6e 74 20  ements */.  int 
16560 2a 70 49 64 78 20 20 20 20 20 20 20 20 20 2f 2a  *pIdx         /*
16570 20 57 72 69 74 65 20 74 68 65 20 69 6e 64 65 78   Write the index
16580 20 6f 66 20 61 20 6e 65 77 20 73 6c 6f 74 20 68   of a new slot h
16590 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72  ere */.){.  char
165a0 20 2a 7a 3b 0a 20 20 69 66 28 20 2a 70 6e 45 6e   *z;.  if( *pnEn
165b0 74 72 79 20 3e 3d 20 2a 70 6e 41 6c 6c 6f 63 20  try >= *pnAlloc 
165c0 29 7b 0a 20 20 20 20 76 6f 69 64 20 2a 70 4e 65  ){.    void *pNe
165d0 77 3b 0a 20 20 20 20 69 6e 74 20 6e 65 77 53 69  w;.    int newSi
165e0 7a 65 3b 0a 20 20 20 20 6e 65 77 53 69 7a 65 20  ze;.    newSize 
165f0 3d 20 28 2a 70 6e 41 6c 6c 6f 63 29 2a 32 20 2b  = (*pnAlloc)*2 +
16600 20 69 6e 69 74 53 69 7a 65 3b 0a 20 20 20 20 70   initSize;.    p
16610 4e 65 77 20 3d 20 73 71 6c 69 74 65 52 65 61 6c  New = sqliteReal
16620 6c 6f 63 28 70 41 72 72 61 79 2c 20 6e 65 77 53  loc(pArray, newS
16630 69 7a 65 2a 73 7a 45 6e 74 72 79 29 3b 0a 20 20  ize*szEntry);.  
16640 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b    if( pNew==0 ){
16650 0a 20 20 20 20 20 20 2a 70 49 64 78 20 3d 20 2d  .      *pIdx = -
16660 31 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  1;.      return 
16670 70 41 72 72 61 79 3b 0a 20 20 20 20 7d 0a 20 20  pArray;.    }.  
16680 20 20 2a 70 6e 41 6c 6c 6f 63 20 3d 20 6e 65 77    *pnAlloc = new
16690 53 69 7a 65 3b 0a 20 20 20 20 70 41 72 72 61 79  Size;.    pArray
166a0 20 3d 20 70 4e 65 77 3b 0a 20 20 7d 0a 20 20 7a   = pNew;.  }.  z
166b0 20 3d 20 28 63 68 61 72 2a 29 70 41 72 72 61 79   = (char*)pArray
166c0 3b 0a 20 20 6d 65 6d 73 65 74 28 26 7a 5b 2a 70  ;.  memset(&z[*p
166d0 6e 45 6e 74 72 79 20 2a 20 73 7a 45 6e 74 72 79  nEntry * szEntry
166e0 5d 2c 20 30 2c 20 73 7a 45 6e 74 72 79 29 3b 0a  ], 0, szEntry);.
166f0 20 20 2a 70 49 64 78 20 3d 20 2a 70 6e 45 6e 74    *pIdx = *pnEnt
16700 72 79 3b 0a 20 20 2b 2b 2a 70 6e 45 6e 74 72 79  ry;.  ++*pnEntry
16710 3b 0a 20 20 72 65 74 75 72 6e 20 70 41 72 72 61  ;.  return pArra
16720 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65  y;.}../*.** Appe
16730 6e 64 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74  nd a new element
16740 20 74 6f 20 74 68 65 20 67 69 76 65 6e 20 49 64   to the given Id
16750 4c 69 73 74 2e 20 20 43 72 65 61 74 65 20 61 20  List.  Create a 
16760 6e 65 77 20 49 64 4c 69 73 74 20 69 66 0a 2a 2a  new IdList if.**
16770 20 6e 65 65 64 20 62 65 2e 0a 2a 2a 0a 2a 2a 20   need be..**.** 
16780 41 20 6e 65 77 20 49 64 4c 69 73 74 20 69 73 20  A new IdList is 
16790 72 65 74 75 72 6e 65 64 2c 20 6f 72 20 4e 55 4c  returned, or NUL
167a0 4c 20 69 66 20 6d 61 6c 6c 6f 63 28 29 20 66 61  L if malloc() fa
167b0 69 6c 73 2e 0a 2a 2f 0a 49 64 4c 69 73 74 20 2a  ils..*/.IdList *
167c0 73 71 6c 69 74 65 33 49 64 4c 69 73 74 41 70 70  sqlite3IdListApp
167d0 65 6e 64 28 49 64 4c 69 73 74 20 2a 70 4c 69 73  end(IdList *pLis
167e0 74 2c 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e  t, Token *pToken
167f0 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66  ){.  int i;.  if
16800 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20  ( pList==0 ){.  
16810 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65    pList = sqlite
16820 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 49  Malloc( sizeof(I
16830 64 4c 69 73 74 29 20 29 3b 0a 20 20 20 20 69 66  dList) );.    if
16840 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74  ( pList==0 ) ret
16850 75 72 6e 20 30 3b 0a 20 20 20 20 70 4c 69 73 74  urn 0;.    pList
16860 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 30 3b 0a 20 20  ->nAlloc = 0;.  
16870 7d 0a 20 20 70 4c 69 73 74 2d 3e 61 20 3d 20 73  }.  pList->a = s
16880 71 6c 69 74 65 33 41 72 72 61 79 41 6c 6c 6f 63  qlite3ArrayAlloc
16890 61 74 65 28 0a 20 20 20 20 20 20 70 4c 69 73 74  ate(.      pList
168a0 2d 3e 61 2c 0a 20 20 20 20 20 20 73 69 7a 65 6f  ->a,.      sizeo
168b0 66 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 29 2c 0a  f(pList->a[0]),.
168c0 20 20 20 20 20 20 35 2c 0a 20 20 20 20 20 20 26        5,.      &
168d0 70 4c 69 73 74 2d 3e 6e 49 64 2c 0a 20 20 20 20  pList->nId,.    
168e0 20 20 26 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63    &pList->nAlloc
168f0 2c 0a 20 20 20 20 20 20 26 69 0a 20 20 29 3b 0a  ,.      &i.  );.
16900 20 20 69 66 28 20 69 3c 30 20 29 7b 0a 20 20 20    if( i<0 ){.   
16910 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44 65   sqlite3IdListDe
16920 6c 65 74 65 28 70 4c 69 73 74 29 3b 0a 20 20 20  lete(pList);.   
16930 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
16940 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61   pList->a[i].zNa
16950 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65  me = sqlite3Name
16960 46 72 6f 6d 54 6f 6b 65 6e 28 70 54 6f 6b 65 6e  FromToken(pToken
16970 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 4c 69 73  );.  return pLis
16980 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65  t;.}../*.** Dele
16990 74 65 20 61 6e 20 49 64 4c 69 73 74 2e 0a 2a 2f  te an IdList..*/
169a0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 49 64 4c  .void sqlite3IdL
169b0 69 73 74 44 65 6c 65 74 65 28 49 64 4c 69 73 74  istDelete(IdList
169c0 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20   *pList){.  int 
169d0 69 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d  i;.  if( pList==
169e0 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f  0 ) return;.  fo
169f0 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e  r(i=0; i<pList->
16a00 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73  nId; i++){.    s
16a10 71 6c 69 74 65 46 72 65 65 28 70 4c 69 73 74 2d  qliteFree(pList-
16a20 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20  >a[i].zName);.  
16a30 7d 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70  }.  sqliteFree(p
16a40 4c 69 73 74 2d 3e 61 29 3b 0a 20 20 73 71 6c 69  List->a);.  sqli
16a50 74 65 46 72 65 65 28 70 4c 69 73 74 29 3b 0a 7d  teFree(pList);.}
16a60 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
16a70 68 65 20 69 6e 64 65 78 20 69 6e 20 70 4c 69 73  he index in pLis
16a80 74 20 6f 66 20 74 68 65 20 69 64 65 6e 74 69 66  t of the identif
16a90 69 65 72 20 6e 61 6d 65 64 20 7a 49 64 2e 20 20  ier named zId.  
16aa0 52 65 74 75 72 6e 20 2d 31 0a 2a 2a 20 69 66 20  Return -1.** if 
16ab0 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 69 6e  not found..*/.in
16ac0 74 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 49  t sqlite3IdListI
16ad0 6e 64 65 78 28 49 64 4c 69 73 74 20 2a 70 4c 69  ndex(IdList *pLi
16ae0 73 74 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  st, const char *
16af0 7a 4e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 69 3b  zName){.  int i;
16b00 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20  .  if( pList==0 
16b10 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 66  ) return -1;.  f
16b20 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d  or(i=0; i<pList-
16b30 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nId; i++){.    
16b40 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43  if( sqlite3StrIC
16b50 6d 70 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a  mp(pList->a[i].z
16b60 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29 3d 3d 30 20  Name, zName)==0 
16b70 29 20 72 65 74 75 72 6e 20 69 3b 0a 20 20 7d 0a  ) return i;.  }.
16b80 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a    return -1;.}..
16b90 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 61 20 6e  /*.** Append a n
16ba0 65 77 20 74 61 62 6c 65 20 6e 61 6d 65 20 74 6f  ew table name to
16bb0 20 74 68 65 20 67 69 76 65 6e 20 53 72 63 4c 69   the given SrcLi
16bc0 73 74 2e 20 20 43 72 65 61 74 65 20 61 20 6e 65  st.  Create a ne
16bd0 77 20 53 72 63 4c 69 73 74 20 69 66 0a 2a 2a 20  w SrcList if.** 
16be0 6e 65 65 64 20 62 65 2e 20 20 41 20 6e 65 77 20  need be.  A new 
16bf0 65 6e 74 72 79 20 69 73 20 63 72 65 61 74 65 64  entry is created
16c00 20 69 6e 20 74 68 65 20 53 72 63 4c 69 73 74 20   in the SrcList 
16c10 65 76 65 6e 20 69 66 20 70 54 6f 6b 65 6e 20 69  even if pToken i
16c20 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 41 20  s NULL..**.** A 
16c30 6e 65 77 20 53 72 63 4c 69 73 74 20 69 73 20 72  new SrcList is r
16c40 65 74 75 72 6e 65 64 2c 20 6f 72 20 4e 55 4c 4c  eturned, or NULL
16c50 20 69 66 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69   if malloc() fai
16c60 6c 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 44 61  ls..**.** If pDa
16c70 74 61 62 61 73 65 20 69 73 20 6e 6f 74 20 6e 75  tabase is not nu
16c80 6c 6c 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61  ll, it means tha
16c90 74 20 74 68 65 20 74 61 62 6c 65 20 68 61 73 20  t the table has 
16ca0 61 6e 20 6f 70 74 69 6f 6e 61 6c 0a 2a 2a 20 64  an optional.** d
16cb0 61 74 61 62 61 73 65 20 6e 61 6d 65 20 70 72 65  atabase name pre
16cc0 66 69 78 2e 20 20 4c 69 6b 65 20 74 68 69 73 3a  fix.  Like this:
16cd0 20 20 22 64 61 74 61 62 61 73 65 2e 74 61 62 6c    "database.tabl
16ce0 65 22 2e 20 20 54 68 65 20 70 44 61 74 61 62 61  e".  The pDataba
16cf0 73 65 0a 2a 2a 20 70 6f 69 6e 74 73 20 74 6f 20  se.** points to 
16d00 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 61  the table name a
16d10 6e 64 20 74 68 65 20 70 54 61 62 6c 65 20 70 6f  nd the pTable po
16d20 69 6e 74 73 20 74 6f 20 74 68 65 20 64 61 74 61  ints to the data
16d30 62 61 73 65 20 6e 61 6d 65 2e 0a 2a 2a 20 54 68  base name..** Th
16d40 65 20 53 72 63 4c 69 73 74 2e 61 5b 5d 2e 7a 4e  e SrcList.a[].zN
16d50 61 6d 65 20 66 69 65 6c 64 20 69 73 20 66 69 6c  ame field is fil
16d60 6c 65 64 20 77 69 74 68 20 74 68 65 20 74 61 62  led with the tab
16d70 6c 65 20 6e 61 6d 65 20 77 68 69 63 68 20 6d 69  le name which mi
16d80 67 68 74 0a 2a 2a 20 63 6f 6d 65 20 66 72 6f 6d  ght.** come from
16d90 20 70 54 61 62 6c 65 20 28 69 66 20 70 44 61 74   pTable (if pDat
16da0 61 62 61 73 65 20 69 73 20 4e 55 4c 4c 29 20 6f  abase is NULL) o
16db0 72 20 66 72 6f 6d 20 70 44 61 74 61 62 61 73 65  r from pDatabase
16dc0 2e 20 20 0a 2a 2a 20 53 72 63 4c 69 73 74 2e 61  .  .** SrcList.a
16dd0 5b 5d 2e 7a 44 61 74 61 62 61 73 65 20 69 73 20  [].zDatabase is 
16de0 66 69 6c 6c 65 64 20 77 69 74 68 20 74 68 65 20  filled with the 
16df0 64 61 74 61 62 61 73 65 20 6e 61 6d 65 20 66 72  database name fr
16e00 6f 6d 20 70 54 61 62 6c 65 2c 0a 2a 2a 20 6f 72  om pTable,.** or
16e10 20 77 69 74 68 20 4e 55 4c 4c 20 69 66 20 6e 6f   with NULL if no
16e20 20 64 61 74 61 62 61 73 65 20 69 73 20 73 70 65   database is spe
16e30 63 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 6e  cified..**.** In
16e40 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 69 66   other words, if
16e50 20 63 61 6c 6c 20 6c 69 6b 65 20 74 68 69 73 3a   call like this:
16e60 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 73  .**.**         s
16e70 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70 70  qlite3SrcListApp
16e80 65 6e 64 28 41 2c 42 2c 30 29 3b 0a 2a 2a 0a 2a  end(A,B,0);.**.*
16e90 2a 20 54 68 65 6e 20 42 20 69 73 20 61 20 74 61  * Then B is a ta
16ea0 62 6c 65 20 6e 61 6d 65 20 61 6e 64 20 74 68 65  ble name and the
16eb0 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 20 69   database name i
16ec0 73 20 75 6e 73 70 65 63 69 66 69 65 64 2e 20 20  s unspecified.  
16ed0 49 66 20 63 61 6c 6c 65 64 0a 2a 2a 20 6c 69 6b  If called.** lik
16ee0 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  e this:.**.**   
16ef0 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 72 63        sqlite3Src
16f00 4c 69 73 74 41 70 70 65 6e 64 28 41 2c 42 2c 43  ListAppend(A,B,C
16f10 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 43 20  );.**.** Then C 
16f20 69 73 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d  is the table nam
16f30 65 20 61 6e 64 20 42 20 69 73 20 74 68 65 20 64  e and B is the d
16f40 61 74 61 62 61 73 65 20 6e 61 6d 65 2e 0a 2a 2f  atabase name..*/
16f50 0a 53 72 63 4c 69 73 74 20 2a 73 71 6c 69 74 65  .SrcList *sqlite
16f60 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64 28 53  3SrcListAppend(S
16f70 72 63 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 54  rcList *pList, T
16f80 6f 6b 65 6e 20 2a 70 54 61 62 6c 65 2c 20 54 6f  oken *pTable, To
16f90 6b 65 6e 20 2a 70 44 61 74 61 62 61 73 65 29 7b  ken *pDatabase){
16fa0 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73  .  struct SrcLis
16fb0 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20  t_item *pItem;. 
16fc0 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b   if( pList==0 ){
16fd0 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 73 71 6c  .    pList = sql
16fe0 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f  iteMalloc( sizeo
16ff0 66 28 53 72 63 4c 69 73 74 29 20 29 3b 0a 20 20  f(SrcList) );.  
17000 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29    if( pList==0 )
17010 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 70   return 0;.    p
17020 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 31  List->nAlloc = 1
17030 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 4c 69 73  ;.  }.  if( pLis
17040 74 2d 3e 6e 53 72 63 3e 3d 70 4c 69 73 74 2d 3e  t->nSrc>=pList->
17050 6e 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 53 72  nAlloc ){.    Sr
17060 63 4c 69 73 74 20 2a 70 4e 65 77 3b 0a 20 20 20  cList *pNew;.   
17070 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20 2a   pList->nAlloc *
17080 3d 20 32 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20  = 2;.    pNew = 
17090 73 71 6c 69 74 65 52 65 61 6c 6c 6f 63 28 70 4c  sqliteRealloc(pL
170a0 69 73 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ist,.           
170b0 20 20 20 20 73 69 7a 65 6f 66 28 2a 70 4c 69 73      sizeof(*pLis
170c0 74 29 20 2b 20 28 70 4c 69 73 74 2d 3e 6e 41 6c  t) + (pList->nAl
170d0 6c 6f 63 2d 31 29 2a 73 69 7a 65 6f 66 28 70 4c  loc-1)*sizeof(pL
170e0 69 73 74 2d 3e 61 5b 30 5d 29 20 29 3b 0a 20 20  ist->a[0]) );.  
170f0 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b    if( pNew==0 ){
17100 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 72  .      sqlite3Sr
17110 63 4c 69 73 74 44 65 6c 65 74 65 28 70 4c 69 73  cListDelete(pLis
17120 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  t);.      return
17130 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c   0;.    }.    pL
17140 69 73 74 20 3d 20 70 4e 65 77 3b 0a 20 20 7d 0a  ist = pNew;.  }.
17150 20 20 70 49 74 65 6d 20 3d 20 26 70 4c 69 73 74    pItem = &pList
17160 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 53 72 63 5d  ->a[pList->nSrc]
17170 3b 0a 20 20 6d 65 6d 73 65 74 28 70 49 74 65 6d  ;.  memset(pItem
17180 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 4c 69 73  , 0, sizeof(pLis
17190 74 2d 3e 61 5b 30 5d 29 29 3b 0a 20 20 69 66 28  t->a[0]));.  if(
171a0 20 70 44 61 74 61 62 61 73 65 20 26 26 20 70 44   pDatabase && pD
171b0 61 74 61 62 61 73 65 2d 3e 7a 3d 3d 30 20 29 7b  atabase->z==0 ){
171c0 0a 20 20 20 20 70 44 61 74 61 62 61 73 65 20 3d  .    pDatabase =
171d0 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 44   0;.  }.  if( pD
171e0 61 74 61 62 61 73 65 20 26 26 20 70 54 61 62 6c  atabase && pTabl
171f0 65 20 29 7b 0a 20 20 20 20 54 6f 6b 65 6e 20 2a  e ){.    Token *
17200 70 54 65 6d 70 20 3d 20 70 44 61 74 61 62 61 73  pTemp = pDatabas
17210 65 3b 0a 20 20 20 20 70 44 61 74 61 62 61 73 65  e;.    pDatabase
17220 20 3d 20 70 54 61 62 6c 65 3b 0a 20 20 20 20 70   = pTable;.    p
17230 54 61 62 6c 65 20 3d 20 70 54 65 6d 70 3b 0a 20  Table = pTemp;. 
17240 20 7d 0a 20 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d   }.  pItem->zNam
17250 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46  e = sqlite3NameF
17260 72 6f 6d 54 6f 6b 65 6e 28 70 54 61 62 6c 65 29  romToken(pTable)
17270 3b 0a 20 20 70 49 74 65 6d 2d 3e 7a 44 61 74 61  ;.  pItem->zData
17280 62 61 73 65 20 3d 20 73 71 6c 69 74 65 33 4e 61  base = sqlite3Na
17290 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 44 61 74  meFromToken(pDat
172a0 61 62 61 73 65 29 3b 0a 20 20 70 49 74 65 6d 2d  abase);.  pItem-
172b0 3e 69 43 75 72 73 6f 72 20 3d 20 2d 31 3b 0a 20  >iCursor = -1;. 
172c0 20 70 49 74 65 6d 2d 3e 69 73 50 6f 70 75 6c 61   pItem->isPopula
172d0 74 65 64 20 3d 20 30 3b 0a 20 20 70 4c 69 73 74  ted = 0;.  pList
172e0 2d 3e 6e 53 72 63 2b 2b 3b 0a 20 20 72 65 74 75  ->nSrc++;.  retu
172f0 72 6e 20 70 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a  rn pList;.}../*.
17300 2a 2a 20 41 73 73 69 67 6e 20 63 75 72 73 6f 72  ** Assign cursor
17310 73 20 74 6f 20 61 6c 6c 20 74 61 62 6c 65 73 20  s to all tables 
17320 69 6e 20 61 20 53 72 63 4c 69 73 74 0a 2a 2f 0a  in a SrcList.*/.
17330 76 6f 69 64 20 73 71 6c 69 74 65 33 53 72 63 4c  void sqlite3SrcL
17340 69 73 74 41 73 73 69 67 6e 43 75 72 73 6f 72 73  istAssignCursors
17350 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
17360 53 72 63 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b  SrcList *pList){
17370 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75  .  int i;.  stru
17380 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
17390 2a 70 49 74 65 6d 3b 0a 20 20 61 73 73 65 72 74  *pItem;.  assert
173a0 28 70 4c 69 73 74 20 7c 7c 20 73 71 6c 69 74 65  (pList || sqlite
173b0 33 4d 61 6c 6c 6f 63 46 61 69 6c 65 64 28 29 20  3MallocFailed() 
173c0 29 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 20 29  );.  if( pList )
173d0 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 70  {.    for(i=0, p
173e0 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 3b 20 69  Item=pList->a; i
173f0 3c 70 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b  <pList->nSrc; i+
17400 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20  +, pItem++){.   
17410 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 69 43     if( pItem->iC
17420 75 72 73 6f 72 3e 3d 30 20 29 20 62 72 65 61 6b  ursor>=0 ) break
17430 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 69  ;.      pItem->i
17440 43 75 72 73 6f 72 20 3d 20 70 50 61 72 73 65 2d  Cursor = pParse-
17450 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 69  >nTab++;.      i
17460 66 28 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63  f( pItem->pSelec
17470 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  t ){.        sql
17480 69 74 65 33 53 72 63 4c 69 73 74 41 73 73 69 67  ite3SrcListAssig
17490 6e 43 75 72 73 6f 72 73 28 70 50 61 72 73 65 2c  nCursors(pParse,
174a0 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 2d   pItem->pSelect-
174b0 3e 70 53 72 63 29 3b 0a 20 20 20 20 20 20 7d 0a  >pSrc);.      }.
174c0 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
174d0 2a 2a 20 44 65 6c 65 74 65 20 61 6e 20 65 6e 74  ** Delete an ent
174e0 69 72 65 20 53 72 63 4c 69 73 74 20 69 6e 63 6c  ire SrcList incl
174f0 75 64 69 6e 67 20 61 6c 6c 20 69 74 73 20 73 75  uding all its su
17500 62 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 76  bstructure..*/.v
17510 6f 69 64 20 73 71 6c 69 74 65 33 53 72 63 4c 69  oid sqlite3SrcLi
17520 73 74 44 65 6c 65 74 65 28 53 72 63 4c 69 73 74  stDelete(SrcList
17530 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20   *pList){.  int 
17540 69 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  i;.  struct SrcL
17550 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b  ist_item *pItem;
17560 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20  .  if( pList==0 
17570 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28  ) return;.  for(
17580 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 2c 20  pItem=pList->a, 
17590 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 53  i=0; i<pList->nS
175a0 72 63 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b  rc; i++, pItem++
175b0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65  ){.    sqliteFre
175c0 65 28 70 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61  e(pItem->zDataba
175d0 73 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46  se);.    sqliteF
175e0 72 65 65 28 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65  ree(pItem->zName
175f0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65  );.    sqliteFre
17600 65 28 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 29  e(pItem->zAlias)
17610 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 6c  ;.    sqlite3Del
17620 65 74 65 54 61 62 6c 65 28 30 2c 20 70 49 74 65  eteTable(0, pIte
17630 6d 2d 3e 70 54 61 62 29 3b 0a 20 20 20 20 73 71  m->pTab);.    sq
17640 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74  lite3SelectDelet
17650 65 28 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74  e(pItem->pSelect
17660 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  );.    sqlite3Ex
17670 70 72 44 65 6c 65 74 65 28 70 49 74 65 6d 2d 3e  prDelete(pItem->
17680 70 4f 6e 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  pOn);.    sqlite
17690 33 49 64 4c 69 73 74 44 65 6c 65 74 65 28 70 49  3IdListDelete(pI
176a0 74 65 6d 2d 3e 70 55 73 69 6e 67 29 3b 0a 20 20  tem->pUsing);.  
176b0 7d 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70  }.  sqliteFree(p
176c0 4c 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  List);.}../*.** 
176d0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
176e0 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20 70 61  called by the pa
176f0 72 73 65 72 20 74 6f 20 61 64 64 20 61 20 6e 65  rser to add a ne
17700 77 20 74 65 72 6d 20 74 6f 20 74 68 65 0a 2a 2a  w term to the.**
17710 20 65 6e 64 20 6f 66 20 61 20 67 72 6f 77 69 6e   end of a growin
17720 67 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20  g FROM clause.  
17730 54 68 65 20 22 70 22 20 70 61 72 61 6d 65 74 65  The "p" paramete
17740 72 20 69 73 20 74 68 65 20 70 61 72 74 20 6f 66  r is the part of
17750 0a 2a 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c 61  .** the FROM cla
17760 75 73 65 20 74 68 61 74 20 68 61 73 20 61 6c 72  use that has alr
17770 65 61 64 79 20 62 65 65 6e 20 63 6f 6e 73 74 72  eady been constr
17780 75 63 74 65 64 2e 20 20 22 70 22 20 69 73 20 4e  ucted.  "p" is N
17790 55 4c 4c 0a 2a 2a 20 69 66 20 74 68 69 73 20 69  ULL.** if this i
177a0 73 20 74 68 65 20 66 69 72 73 74 20 74 65 72 6d  s the first term
177b0 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   of the FROM cla
177c0 75 73 65 2e 20 20 70 54 61 62 6c 65 20 61 6e 64  use.  pTable and
177d0 20 70 44 61 74 61 62 61 73 65 0a 2a 2a 20 61 72   pDatabase.** ar
177e0 65 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  e the name of th
177f0 65 20 74 61 62 6c 65 20 61 6e 64 20 64 61 74 61  e table and data
17800 62 61 73 65 20 6e 61 6d 65 64 20 69 6e 20 74 68  base named in th
17810 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65  e FROM clause te
17820 72 6d 2e 0a 2a 2a 20 70 44 61 74 61 62 61 73 65  rm..** pDatabase
17830 20 69 73 20 4e 55 4c 4c 20 69 66 20 74 68 65 20   is NULL if the 
17840 64 61 74 61 62 61 73 65 20 6e 61 6d 65 20 71 75  database name qu
17850 61 6c 69 66 69 65 72 20 69 73 20 6d 69 73 73 69  alifier is missi
17860 6e 67 20 2d 20 74 68 65 0a 2a 2a 20 75 73 75 61  ng - the.** usua
17870 6c 20 63 61 73 65 2e 20 20 49 66 20 74 68 65 20  l case.  If the 
17880 74 65 72 6d 20 68 61 73 20 61 20 61 6c 69 61 73  term has a alias
17890 2c 20 74 68 65 6e 20 70 41 6c 69 61 73 20 70 6f  , then pAlias po
178a0 69 6e 74 73 20 74 6f 20 74 68 65 0a 2a 2a 20 61  ints to the.** a
178b0 6c 69 61 73 20 74 6f 6b 65 6e 2e 20 20 49 66 20  lias token.  If 
178c0 74 68 65 20 74 65 72 6d 20 69 73 20 61 20 73 75  the term is a su
178d0 62 71 75 65 72 79 2c 20 74 68 65 6e 20 70 53 75  bquery, then pSu
178e0 62 71 75 65 72 79 20 69 73 20 74 68 65 0a 2a 2a  bquery is the.**
178f0 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
17900 74 20 74 68 61 74 20 74 68 65 20 73 75 62 71 75  t that the subqu
17910 65 72 79 20 65 6e 63 6f 64 65 73 2e 20 20 54 68  ery encodes.  Th
17920 65 20 70 54 61 62 6c 65 20 61 6e 64 0a 2a 2a 20  e pTable and.** 
17930 70 44 61 74 61 62 61 73 65 20 70 61 72 61 6d 65  pDatabase parame
17940 74 65 72 73 20 61 72 65 20 4e 55 4c 4c 20 66 6f  ters are NULL fo
17950 72 20 73 75 62 71 75 65 72 69 65 73 2e 20 20 54  r subqueries.  T
17960 68 65 20 70 4f 6e 20 61 6e 64 20 70 55 73 69 6e  he pOn and pUsin
17970 67 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 73 20  g.** parameters 
17980 61 72 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 20  are the content 
17990 6f 66 20 74 68 65 20 4f 4e 20 61 6e 64 20 55 53  of the ON and US
179a0 49 4e 47 20 63 6c 61 75 73 65 73 2e 0a 2a 2a 0a  ING clauses..**.
179b0 2a 2a 20 52 65 74 75 72 6e 20 61 20 6e 65 77 20  ** Return a new 
179c0 53 72 63 4c 69 73 74 20 77 68 69 63 68 20 65 6e  SrcList which en
179d0 63 6f 64 65 73 20 69 73 20 74 68 65 20 46 52 4f  codes is the FRO
179e0 4d 20 77 69 74 68 20 74 68 65 20 6e 65 77 0a 2a  M with the new.*
179f0 2a 20 74 65 72 6d 20 61 64 64 65 64 2e 0a 2a 2f  * term added..*/
17a00 0a 53 72 63 4c 69 73 74 20 2a 73 71 6c 69 74 65  .SrcList *sqlite
17a10 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64 46 72  3SrcListAppendFr
17a20 6f 6d 54 65 72 6d 28 0a 20 20 53 72 63 4c 69 73  omTerm(.  SrcLis
17a30 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  t *p,           
17a40 20 20 2f 2a 20 54 68 65 20 6c 65 66 74 20 70 61    /* The left pa
17a50 72 74 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63  rt of the FROM c
17a60 6c 61 75 73 65 20 61 6c 72 65 61 64 79 20 73 65  lause already se
17a70 65 6e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  en */.  Token *p
17a80 54 61 62 6c 65 2c 20 20 20 20 20 20 20 20 20 20  Table,          
17a90 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 74  /* Name of the t
17aa0 61 62 6c 65 20 74 6f 20 61 64 64 20 74 6f 20 74  able to add to t
17ab0 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a  he FROM clause *
17ac0 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 44 61 74 61  /.  Token *pData
17ad0 62 61 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 4e  base,       /* N
17ae0 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ame of the datab
17af0 61 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 70  ase containing p
17b00 54 61 62 6c 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e  Table */.  Token
17b10 20 2a 70 41 6c 69 61 73 2c 20 20 20 20 20 20 20   *pAlias,       
17b20 20 20 20 2f 2a 20 54 68 65 20 72 69 67 68 74 2d     /* The right-
17b30 68 61 6e 64 20 73 69 64 65 20 6f 66 20 74 68 65  hand side of the
17b40 20 41 53 20 73 75 62 65 78 70 72 65 73 73 69 6f   AS subexpressio
17b50 6e 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  n */.  Select *p
17b60 53 75 62 71 75 65 72 79 2c 20 20 20 20 20 20 2f  Subquery,      /
17b70 2a 20 41 20 73 75 62 71 75 65 72 79 20 75 73 65  * A subquery use
17b80 64 20 69 6e 20 70 6c 61 63 65 20 6f 66 20 61 20  d in place of a 
17b90 74 61 62 6c 65 20 6e 61 6d 65 20 2a 2f 0a 20 20  table name */.  
17ba0 45 78 70 72 20 2a 70 4f 6e 2c 20 20 20 20 20 20  Expr *pOn,      
17bb0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4f          /* The O
17bc0 4e 20 63 6c 61 75 73 65 20 6f 66 20 61 20 6a 6f  N clause of a jo
17bd0 69 6e 20 2a 2f 0a 20 20 49 64 4c 69 73 74 20 2a  in */.  IdList *
17be0 70 55 73 69 6e 67 20 20 20 20 20 20 20 20 20 20  pUsing          
17bf0 2f 2a 20 54 68 65 20 55 53 49 4e 47 20 63 6c 61  /* The USING cla
17c00 75 73 65 20 6f 66 20 61 20 6a 6f 69 6e 20 2a 2f  use of a join */
17c10 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 53 72 63  .){.  struct Src
17c20 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
17c30 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 53  ;.  p = sqlite3S
17c40 72 63 4c 69 73 74 41 70 70 65 6e 64 28 70 2c 20  rcListAppend(p, 
17c50 70 54 61 62 6c 65 2c 20 70 44 61 74 61 62 61 73  pTable, pDatabas
17c60 65 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c  e);.  if( p==0 |
17c70 7c 20 70 2d 3e 6e 53 72 63 3d 3d 30 20 29 7b 0a  | p->nSrc==0 ){.
17c80 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
17c90 65 6c 65 74 65 28 70 4f 6e 29 3b 0a 20 20 20 20  elete(pOn);.    
17ca0 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44 65 6c  sqlite3IdListDel
17cb0 65 74 65 28 70 55 73 69 6e 67 29 3b 0a 20 20 20  ete(pUsing);.   
17cc0 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
17cd0 6c 65 74 65 28 70 53 75 62 71 75 65 72 79 29 3b  lete(pSubquery);
17ce0 0a 20 20 20 20 72 65 74 75 72 6e 20 70 3b 0a 20  .    return p;. 
17cf0 20 7d 0a 20 20 70 49 74 65 6d 20 3d 20 26 70 2d   }.  pItem = &p-
17d00 3e 61 5b 70 2d 3e 6e 53 72 63 2d 31 5d 3b 0a 20  >a[p->nSrc-1];. 
17d10 20 69 66 28 20 70 41 6c 69 61 73 20 26 26 20 70   if( pAlias && p
17d20 41 6c 69 61 73 2d 3e 6e 20 29 7b 0a 20 20 20 20  Alias->n ){.    
17d30 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 3d 20  pItem->zAlias = 
17d40 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54  sqlite3NameFromT
17d50 6f 6b 65 6e 28 70 41 6c 69 61 73 29 3b 0a 20 20  oken(pAlias);.  
17d60 7d 0a 20 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65  }.  pItem->pSele
17d70 63 74 20 3d 20 70 53 75 62 71 75 65 72 79 3b 0a  ct = pSubquery;.
17d80 20 20 70 49 74 65 6d 2d 3e 70 4f 6e 20 3d 20 70    pItem->pOn = p
17d90 4f 6e 3b 0a 20 20 70 49 74 65 6d 2d 3e 70 55 73  On;.  pItem->pUs
17da0 69 6e 67 20 3d 20 70 55 73 69 6e 67 3b 0a 20 20  ing = pUsing;.  
17db0 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a  return p;.}../*.
17dc0 2a 2a 20 57 68 65 6e 20 62 75 69 6c 64 69 6e 67  ** When building
17dd0 20 75 70 20 61 20 46 52 4f 4d 20 63 6c 61 75 73   up a FROM claus
17de0 65 20 69 6e 20 74 68 65 20 70 61 72 73 65 72 2c  e in the parser,
17df0 20 74 68 65 20 6a 6f 69 6e 20 6f 70 65 72 61 74   the join operat
17e00 6f 72 0a 2a 2a 20 69 73 20 69 6e 69 74 69 61 6c  or.** is initial
17e10 6c 79 20 61 74 74 61 63 68 65 64 20 74 6f 20 74  ly attached to t
17e20 68 65 20 6c 65 66 74 20 6f 70 65 72 61 6e 64 2e  he left operand.
17e30 20 20 42 75 74 20 74 68 65 20 63 6f 64 65 20 67    But the code g
17e40 65 6e 65 72 61 74 6f 72 0a 2a 2a 20 65 78 70 65  enerator.** expe
17e50 63 74 73 20 74 68 65 20 6a 6f 69 6e 20 6f 70 65  cts the join ope
17e60 72 61 74 6f 72 20 74 6f 20 62 65 20 6f 6e 20 74  rator to be on t
17e70 68 65 20 72 69 67 68 74 20 6f 70 65 72 61 6e 64  he right operand
17e80 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a  .  This routine.
17e90 2a 2a 20 53 68 69 66 74 73 20 61 6c 6c 20 6a 6f  ** Shifts all jo
17ea0 69 6e 20 6f 70 65 72 61 74 6f 72 73 20 66 72 6f  in operators fro
17eb0 6d 20 6c 65 66 74 20 74 6f 20 72 69 67 68 74 20  m left to right 
17ec0 66 6f 72 20 61 6e 20 65 6e 74 69 72 65 20 46 52  for an entire FR
17ed0 4f 4d 0a 2a 2a 20 63 6c 61 75 73 65 2e 0a 2a 2a  OM.** clause..**
17ee0 0a 2a 2a 20 45 78 61 6d 70 6c 65 3a 20 53 75 70  .** Example: Sup
17ef0 70 6f 73 65 20 74 68 65 20 6a 6f 69 6e 20 69 73  pose the join is
17f00 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a   like this:.**.*
17f10 2a 20 20 20 20 20 20 20 20 20 20 20 41 20 6e 61  *           A na
17f20 74 75 72 61 6c 20 63 72 6f 73 73 20 6a 6f 69 6e  tural cross join
17f30 20 42 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 70 65   B.**.** The ope
17f40 72 61 74 6f 72 20 69 73 20 22 6e 61 74 75 72 61  rator is "natura
17f50 6c 20 63 72 6f 73 73 20 6a 6f 69 6e 22 2e 20 20  l cross join".  
17f60 54 68 65 20 41 20 61 6e 64 20 42 20 6f 70 65 72  The A and B oper
17f70 61 6e 64 73 20 61 72 65 20 73 74 6f 72 65 64 0a  ands are stored.
17f80 2a 2a 20 69 6e 20 70 2d 3e 61 5b 30 5d 20 61 6e  ** in p->a[0] an
17f90 64 20 70 2d 3e 61 5b 31 5d 2c 20 72 65 73 70 65  d p->a[1], respe
17fa0 63 74 69 76 65 6c 79 2e 20 20 54 68 65 20 70 61  ctively.  The pa
17fb0 72 73 65 72 20 69 6e 69 74 69 61 6c 6c 79 20 73  rser initially s
17fc0 74 6f 72 65 73 20 74 68 65 0a 2a 2a 20 6f 70 65  tores the.** ope
17fd0 72 61 74 6f 72 20 77 69 74 68 20 41 2e 20 20 54  rator with A.  T
17fe0 68 69 73 20 72 6f 75 74 69 6e 65 20 73 68 69 66  his routine shif
17ff0 74 73 20 74 68 61 74 20 6f 70 65 72 61 74 6f 72  ts that operator
18000 20 6f 76 65 72 20 74 6f 20 42 2e 0a 2a 2f 0a 76   over to B..*/.v
18010 6f 69 64 20 73 71 6c 69 74 65 33 53 72 63 4c 69  oid sqlite3SrcLi
18020 73 74 53 68 69 66 74 4a 6f 69 6e 54 79 70 65 28  stShiftJoinType(
18030 53 72 63 4c 69 73 74 20 2a 70 29 7b 0a 20 20 69  SrcList *p){.  i
18040 66 28 20 70 20 26 26 20 70 2d 3e 61 20 29 7b 0a  f( p && p->a ){.
18050 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66      int i;.    f
18060 6f 72 28 69 3d 70 2d 3e 6e 53 72 63 2d 31 3b 20  or(i=p->nSrc-1; 
18070 69 3e 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 20  i>0; i--){.     
18080 20 70 2d 3e 61 5b 69 5d 2e 6a 6f 69 6e 74 79 70   p->a[i].jointyp
18090 65 20 3d 20 70 2d 3e 61 5b 69 2d 31 5d 2e 6a 6f  e = p->a[i-1].jo
180a0 69 6e 74 79 70 65 3b 0a 20 20 20 20 7d 0a 20 20  intype;.    }.  
180b0 20 20 70 2d 3e 61 5b 30 5d 2e 6a 6f 69 6e 74 79    p->a[0].jointy
180c0 70 65 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f  pe = 0;.  }.}../
180d0 2a 0a 2a 2a 20 42 65 67 69 6e 20 61 20 74 72 61  *.** Begin a tra
180e0 6e 73 61 63 74 69 6f 6e 0a 2a 2f 0a 76 6f 69 64  nsaction.*/.void
180f0 20 73 71 6c 69 74 65 33 42 65 67 69 6e 54 72 61   sqlite3BeginTra
18100 6e 73 61 63 74 69 6f 6e 28 50 61 72 73 65 20 2a  nsaction(Parse *
18110 70 50 61 72 73 65 2c 20 69 6e 74 20 74 79 70 65  pParse, int type
18120 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
18130 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 69  ;.  Vdbe *v;.  i
18140 6e 74 20 69 3b 0a 0a 20 20 69 66 28 20 70 50 61  nt i;..  if( pPa
18150 72 73 65 3d 3d 30 20 7c 7c 20 28 64 62 3d 70 50  rse==0 || (db=pP
18160 61 72 73 65 2d 3e 64 62 29 3d 3d 30 20 7c 7c 20  arse->db)==0 || 
18170 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 3d 3d  db->aDb[0].pBt==
18180 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66  0 ) return;.  if
18190 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c  ( pParse->nErr |
181a0 7c 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 46  | sqlite3MallocF
181b0 61 69 6c 65 64 28 29 20 29 20 72 65 74 75 72 6e  ailed() ) return
181c0 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 41  ;.  if( sqlite3A
181d0 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c  uthCheck(pParse,
181e0 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 41 43 54   SQLITE_TRANSACT
181f0 49 4f 4e 2c 20 22 42 45 47 49 4e 22 2c 20 30 2c  ION, "BEGIN", 0,
18200 20 30 29 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20   0) ) return;.. 
18210 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56   v = sqlite3GetV
18220 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69  dbe(pParse);.  i
18230 66 28 20 21 76 20 29 20 72 65 74 75 72 6e 3b 0a  f( !v ) return;.
18240 20 20 69 66 28 20 74 79 70 65 21 3d 54 4b 5f 44    if( type!=TK_D
18250 45 46 45 52 52 45 44 20 29 7b 0a 20 20 20 20 66  EFERRED ){.    f
18260 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44  or(i=0; i<db->nD
18270 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73  b; i++){.      s
18280 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
18290 76 2c 20 4f 50 5f 54 72 61 6e 73 61 63 74 69 6f  v, OP_Transactio
182a0 6e 2c 20 69 2c 20 28 74 79 70 65 3d 3d 54 4b 5f  n, i, (type==TK_
182b0 45 58 43 4c 55 53 49 56 45 29 2b 31 29 3b 0a 20  EXCLUSIVE)+1);. 
182c0 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74     }.  }.  sqlit
182d0 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
182e0 50 5f 41 75 74 6f 43 6f 6d 6d 69 74 2c 20 30 2c  P_AutoCommit, 0,
182f0 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f   0);.}../*.** Co
18300 6d 6d 69 74 20 61 20 74 72 61 6e 73 61 63 74 69  mmit a transacti
18310 6f 6e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  on.*/.void sqlit
18320 65 33 43 6f 6d 6d 69 74 54 72 61 6e 73 61 63 74  e3CommitTransact
18330 69 6f 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73  ion(Parse *pPars
18340 65 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  e){.  sqlite3 *d
18350 62 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 0a 20  b;.  Vdbe *v;.. 
18360 20 69 66 28 20 70 50 61 72 73 65 3d 3d 30 20 7c   if( pParse==0 |
18370 7c 20 28 64 62 3d 70 50 61 72 73 65 2d 3e 64 62  | (db=pParse->db
18380 29 3d 3d 30 20 7c 7c 20 64 62 2d 3e 61 44 62 5b  )==0 || db->aDb[
18390 30 5d 2e 70 42 74 3d 3d 30 20 29 20 72 65 74 75  0].pBt==0 ) retu
183a0 72 6e 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65  rn;.  if( pParse
183b0 2d 3e 6e 45 72 72 20 7c 7c 20 73 71 6c 69 74 65  ->nErr || sqlite
183c0 33 4d 61 6c 6c 6f 63 46 61 69 6c 65 64 28 29 20  3MallocFailed() 
183d0 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
183e0 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b  sqlite3AuthCheck
183f0 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f  (pParse, SQLITE_
18400 54 52 41 4e 53 41 43 54 49 4f 4e 2c 20 22 43 4f  TRANSACTION, "CO
18410 4d 4d 49 54 22 2c 20 30 2c 20 30 29 20 29 20 72  MMIT", 0, 0) ) r
18420 65 74 75 72 6e 3b 0a 0a 20 20 76 20 3d 20 73 71  eturn;..  v = sq
18430 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
18440 72 73 65 29 3b 0a 20 20 69 66 28 20 76 20 29 7b  rse);.  if( v ){
18450 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
18460 41 64 64 4f 70 28 76 2c 20 4f 50 5f 41 75 74 6f  AddOp(v, OP_Auto
18470 43 6f 6d 6d 69 74 2c 20 31 2c 20 30 29 3b 0a 20  Commit, 1, 0);. 
18480 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c   }.}../*.** Roll
18490 62 61 63 6b 20 61 20 74 72 61 6e 73 61 63 74 69  back a transacti
184a0 6f 6e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  on.*/.void sqlit
184b0 65 33 52 6f 6c 6c 62 61 63 6b 54 72 61 6e 73 61  e3RollbackTransa
184c0 63 74 69 6f 6e 28 50 61 72 73 65 20 2a 70 50 61  ction(Parse *pPa
184d0 72 73 65 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  rse){.  sqlite3 
184e0 2a 64 62 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a  *db;.  Vdbe *v;.
184f0 0a 20 20 69 66 28 20 70 50 61 72 73 65 3d 3d 30  .  if( pParse==0
18500 20 7c 7c 20 28 64 62 3d 70 50 61 72 73 65 2d 3e   || (db=pParse->
18510 64 62 29 3d 3d 30 20 7c 7c 20 64 62 2d 3e 61 44  db)==0 || db->aD
18520 62 5b 30 5d 2e 70 42 74 3d 3d 30 20 29 20 72 65  b[0].pBt==0 ) re
18530 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 50 61 72  turn;.  if( pPar
18540 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 73 71 6c 69  se->nErr || sqli
18550 74 65 33 4d 61 6c 6c 6f 63 46 61 69 6c 65 64 28  te3MallocFailed(
18560 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66  ) ) return;.  if
18570 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65  ( sqlite3AuthChe
18580 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54  ck(pParse, SQLIT
18590 45 5f 54 52 41 4e 53 41 43 54 49 4f 4e 2c 20 22  E_TRANSACTION, "
185a0 52 4f 4c 4c 42 41 43 4b 22 2c 20 30 2c 20 30 29  ROLLBACK", 0, 0)
185b0 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 76 20   ) return;..  v 
185c0 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
185d0 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20  (pParse);.  if( 
185e0 76 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  v ){.    sqlite3
185f0 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
18600 41 75 74 6f 43 6f 6d 6d 69 74 2c 20 31 2c 20 31  AutoCommit, 1, 1
18610 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
18620 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 54 45  Make sure the TE
18630 4d 50 20 64 61 74 61 62 61 73 65 20 69 73 20 6f  MP database is o
18640 70 65 6e 20 61 6e 64 20 61 76 61 69 6c 61 62 6c  pen and availabl
18650 65 20 66 6f 72 20 75 73 65 2e 20 20 52 65 74 75  e for use.  Retu
18660 72 6e 0a 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72  rn.** the number
18670 20 6f 66 20 65 72 72 6f 72 73 2e 20 20 4c 65 61   of errors.  Lea
18680 76 65 20 61 6e 79 20 65 72 72 6f 72 20 6d 65 73  ve any error mes
18690 73 61 67 65 73 20 69 6e 20 74 68 65 20 70 50 61  sages in the pPa
186a0 72 73 65 20 73 74 72 75 63 74 75 72 65 2e 0a 2a  rse structure..*
186b0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 4f 70 65  /.int sqlite3Ope
186c0 6e 54 65 6d 70 44 61 74 61 62 61 73 65 28 50 61  nTempDatabase(Pa
186d0 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20  rse *pParse){.  
186e0 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
186f0 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20  arse->db;.  if( 
18700 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 42 74 3d 3d  db->aDb[1].pBt==
18710 30 20 26 26 20 21 70 50 61 72 73 65 2d 3e 65 78  0 && !pParse->ex
18720 70 6c 61 69 6e 20 29 7b 0a 20 20 20 20 69 6e 74  plain ){.    int
18730 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
18740 65 65 46 61 63 74 6f 72 79 28 64 62 2c 20 30 2c  eeFactory(db, 0,
18750 20 30 2c 20 4d 41 58 5f 50 41 47 45 53 2c 20 26   0, MAX_PAGES, &
18760 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 42 74 29 3b  db->aDb[1].pBt);
18770 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
18780 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
18790 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
187a0 70 50 61 72 73 65 2c 20 22 75 6e 61 62 6c 65 20  pParse, "unable 
187b0 74 6f 20 6f 70 65 6e 20 61 20 74 65 6d 70 6f 72  to open a tempor
187c0 61 72 79 20 64 61 74 61 62 61 73 65 20 22 0a 20  ary database ". 
187d0 20 20 20 20 20 20 20 22 66 69 6c 65 20 66 6f 72         "file for
187e0 20 73 74 6f 72 69 6e 67 20 74 65 6d 70 6f 72 61   storing tempora
187f0 72 79 20 74 61 62 6c 65 73 22 29 3b 0a 20 20 20  ry tables");.   
18800 20 20 20 70 50 61 72 73 65 2d 3e 72 63 20 3d 20     pParse->rc = 
18810 72 63 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  rc;.      return
18820 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   1;.    }.    if
18830 28 20 64 62 2d 3e 66 6c 61 67 73 20 26 20 21 64  ( db->flags & !d
18840 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 29 7b  b->autoCommit ){
18850 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
18860 74 65 33 42 74 72 65 65 42 65 67 69 6e 54 72 61  te3BtreeBeginTra
18870 6e 73 28 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 42  ns(db->aDb[1].pB
18880 74 2c 20 31 29 3b 0a 20 20 20 20 20 20 69 66 28  t, 1);.      if(
18890 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
188a0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
188b0 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
188c0 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20 67 65 74  , "unable to get
188d0 20 61 20 77 72 69 74 65 20 6c 6f 63 6b 20 6f 6e   a write lock on
188e0 20 22 0a 20 20 20 20 20 20 20 20 20 20 22 74 68   ".          "th
188f0 65 20 74 65 6d 70 6f 72 61 72 79 20 64 61 74 61  e temporary data
18900 62 61 73 65 20 66 69 6c 65 22 29 3b 0a 20 20 20  base file");.   
18910 20 20 20 20 20 70 50 61 72 73 65 2d 3e 72 63 20       pParse->rc 
18920 3d 20 72 63 3b 0a 20 20 20 20 20 20 20 20 72 65  = rc;.        re
18930 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a  turn 1;.      }.
18940 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
18950 28 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 53 63  ( db->aDb[1].pSc
18960 68 65 6d 61 20 29 3b 0a 20 20 7d 0a 20 20 72 65  hema );.  }.  re
18970 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
18980 20 47 65 6e 65 72 61 74 65 20 56 44 42 45 20 63   Generate VDBE c
18990 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 76 65  ode that will ve
189a0 72 69 66 79 20 74 68 65 20 73 63 68 65 6d 61 20  rify the schema 
189b0 63 6f 6f 6b 69 65 20 61 6e 64 20 73 74 61 72 74  cookie and start
189c0 0a 2a 2a 20 61 20 72 65 61 64 2d 74 72 61 6e 73  .** a read-trans
189d0 61 63 74 69 6f 6e 20 66 6f 72 20 61 6c 6c 20 6e  action for all n
189e0 61 6d 65 64 20 64 61 74 61 62 61 73 65 20 66 69  amed database fi
189f0 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73  les..**.** It is
18a00 20 69 6d 70 6f 72 74 61 6e 74 20 74 68 61 74 20   important that 
18a10 61 6c 6c 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69  all schema cooki
18a20 65 73 20 62 65 20 76 65 72 69 66 69 65 64 20 61  es be verified a
18a30 6e 64 20 61 6c 6c 0a 2a 2a 20 72 65 61 64 20 74  nd all.** read t
18a40 72 61 6e 73 61 63 74 69 6f 6e 73 20 62 65 20 73  ransactions be s
18a50 74 61 72 74 65 64 20 62 65 66 6f 72 65 20 61 6e  tarted before an
18a60 79 74 68 69 6e 67 20 65 6c 73 65 20 68 61 70 70  ything else happ
18a70 65 6e 73 20 69 6e 0a 2a 2a 20 74 68 65 20 56 44  ens in.** the VD
18a80 42 45 20 70 72 6f 67 72 61 6d 2e 20 20 42 75 74  BE program.  But
18a90 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 63 61   this routine ca
18aa0 6e 20 62 65 20 63 61 6c 6c 65 64 20 61 66 74 65  n be called afte
18ab0 72 20 6d 75 63 68 20 6f 74 68 65 72 0a 2a 2a 20  r much other.** 
18ac0 63 6f 64 65 20 68 61 73 20 62 65 65 6e 20 67 65  code has been ge
18ad0 6e 65 72 61 74 65 64 2e 20 20 53 6f 20 68 65 72  nerated.  So her
18ae0 65 20 69 73 20 77 68 61 74 20 77 65 20 64 6f 3a  e is what we do:
18af0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74  .**.** The first
18b00 20 74 69 6d 65 20 74 68 69 73 20 72 6f 75 74 69   time this routi
18b10 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 77 65  ne is called, we
18b20 20 63 6f 64 65 20 61 6e 20 4f 50 5f 47 6f 74 6f   code an OP_Goto
18b30 20 74 68 61 74 0a 2a 2a 20 77 69 6c 6c 20 6a 75   that.** will ju
18b40 6d 70 20 74 6f 20 61 20 73 75 62 72 6f 75 74 69  mp to a subrouti
18b50 6e 65 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66  ne at the end of
18b60 20 74 68 65 20 70 72 6f 67 72 61 6d 2e 20 20 54   the program.  T
18b70 68 65 6e 20 77 65 0a 2a 2a 20 72 65 63 6f 72 64  hen we.** record
18b80 20 65 76 65 72 79 20 64 61 74 61 62 61 73 65 20   every database 
18b90 74 68 61 74 20 6e 65 65 64 73 20 69 74 73 20 73  that needs its s
18ba0 63 68 65 6d 61 20 76 65 72 69 66 69 65 64 20 69  chema verified i
18bb0 6e 20 74 68 65 0a 2a 2a 20 70 50 61 72 73 65 2d  n the.** pParse-
18bc0 3e 63 6f 6f 6b 69 65 4d 61 73 6b 20 66 69 65 6c  >cookieMask fiel
18bd0 64 2e 20 20 4c 61 74 65 72 2c 20 61 66 74 65 72  d.  Later, after
18be0 20 61 6c 6c 20 6f 74 68 65 72 20 63 6f 64 65 20   all other code 
18bf0 68 61 73 20 62 65 65 6e 0a 2a 2a 20 67 65 6e 65  has been.** gene
18c00 72 61 74 65 64 2c 20 74 68 65 20 73 75 62 72 6f  rated, the subro
18c10 75 74 69 6e 65 20 74 68 61 74 20 64 6f 65 73 20  utine that does 
18c20 74 68 65 20 63 6f 6f 6b 69 65 20 76 65 72 69 66  the cookie verif
18c30 69 63 61 74 69 6f 6e 73 20 61 6e 64 0a 2a 2a 20  ications and.** 
18c40 73 74 61 72 74 73 20 74 68 65 20 74 72 61 6e 73  starts the trans
18c50 61 63 74 69 6f 6e 73 20 77 69 6c 6c 20 62 65 20  actions will be 
18c60 63 6f 64 65 64 20 61 6e 64 20 74 68 65 20 4f 50  coded and the OP
18c70 5f 47 6f 74 6f 20 50 32 20 76 61 6c 75 65 0a 2a  _Goto P2 value.*
18c80 2a 20 77 69 6c 6c 20 62 65 20 6d 61 64 65 20 74  * will be made t
18c90 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 61 74 20  o point to that 
18ca0 73 75 62 72 6f 75 74 69 6e 65 2e 20 20 54 68 65  subroutine.  The
18cb0 20 67 65 6e 65 72 61 74 69 6f 6e 20 6f 66 20 74   generation of t
18cc0 68 65 0a 2a 2a 20 63 6f 6f 6b 69 65 20 76 65 72  he.** cookie ver
18cd0 69 66 69 63 61 74 69 6f 6e 20 73 75 62 72 6f 75  ification subrou
18ce0 74 69 6e 65 20 63 6f 64 65 20 68 61 70 70 65 6e  tine code happen
18cf0 73 20 69 6e 20 73 71 6c 69 74 65 33 46 69 6e 69  s in sqlite3Fini
18d00 73 68 43 6f 64 69 6e 67 28 29 2e 0a 2a 2a 0a 2a  shCoding()..**.*
18d10 2a 20 49 66 20 69 44 62 3c 30 20 74 68 65 6e 20  * If iDb<0 then 
18d20 63 6f 64 65 20 74 68 65 20 4f 50 5f 47 6f 74 6f  code the OP_Goto
18d30 20 6f 6e 6c 79 20 2d 20 64 6f 6e 27 74 20 73 65   only - don't se
18d40 74 20 66 6c 61 67 20 74 6f 20 76 65 72 69 66 79  t flag to verify
18d50 20 74 68 65 0a 2a 2a 20 73 63 68 65 6d 61 20 6f   the.** schema o
18d60 6e 20 61 6e 79 20 64 61 74 61 62 61 73 65 73 2e  n any databases.
18d70 20 20 54 68 69 73 20 63 61 6e 20 62 65 20 75 73    This can be us
18d80 65 64 20 74 6f 20 70 6f 73 69 74 69 6f 6e 20 74  ed to position t
18d90 68 65 20 4f 50 5f 47 6f 74 6f 0a 2a 2a 20 65 61  he OP_Goto.** ea
18da0 72 6c 79 20 69 6e 20 74 68 65 20 63 6f 64 65 2c  rly in the code,
18db0 20 62 65 66 6f 72 65 20 77 65 20 6b 6e 6f 77 20   before we know 
18dc0 69 66 20 61 6e 79 20 64 61 74 61 62 61 73 65 20  if any database 
18dd0 74 61 62 6c 65 73 20 77 69 6c 6c 20 62 65 20 75  tables will be u
18de0 73 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  sed..*/.void sql
18df0 69 74 65 33 43 6f 64 65 56 65 72 69 66 79 53 63  ite3CodeVerifySc
18e00 68 65 6d 61 28 50 61 72 73 65 20 2a 70 50 61 72  hema(Parse *pPar
18e10 73 65 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20 20  se, int iDb){.  
18e20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 56  sqlite3 *db;.  V
18e30 64 62 65 20 2a 76 3b 0a 20 20 69 6e 74 20 6d 61  dbe *v;.  int ma
18e40 73 6b 3b 0a 0a 20 20 76 20 3d 20 73 71 6c 69 74  sk;..  v = sqlit
18e50 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
18e60 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20  );.  if( v==0 ) 
18e70 72 65 74 75 72 6e 3b 20 20 2f 2a 20 54 68 69 73  return;  /* This
18e80 20 6f 6e 6c 79 20 68 61 70 70 65 6e 73 20 69 66   only happens if
18e90 20 74 68 65 72 65 20 77 61 73 20 61 20 70 72 69   there was a pri
18ea0 6f 72 20 65 72 72 6f 72 20 2a 2f 0a 20 20 64 62  or error */.  db
18eb0 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
18ec0 20 69 66 28 20 70 50 61 72 73 65 2d 3e 63 6f 6f   if( pParse->coo
18ed0 6b 69 65 47 6f 74 6f 3d 3d 30 20 29 7b 0a 20 20  kieGoto==0 ){.  
18ee0 20 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65    pParse->cookie
18ef0 47 6f 74 6f 20 3d 20 73 71 6c 69 74 65 33 56 64  Goto = sqlite3Vd
18f00 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f  beAddOp(v, OP_Go
18f10 74 6f 2c 20 30 2c 20 30 29 2b 31 3b 0a 20 20 7d  to, 0, 0)+1;.  }
18f20 0a 20 20 69 66 28 20 69 44 62 3e 3d 30 20 29 7b  .  if( iDb>=0 ){
18f30 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 44 62  .    assert( iDb
18f40 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 20 20  <db->nDb );.    
18f50 61 73 73 65 72 74 28 20 64 62 2d 3e 61 44 62 5b  assert( db->aDb[
18f60 69 44 62 5d 2e 70 42 74 21 3d 30 20 7c 7c 20 69  iDb].pBt!=0 || i
18f70 44 62 3d 3d 31 20 29 3b 0a 20 20 20 20 61 73 73  Db==1 );.    ass
18f80 65 72 74 28 20 69 44 62 3c 4d 41 58 5f 41 54 54  ert( iDb<MAX_ATT
18f90 41 43 48 45 44 2b 32 20 29 3b 0a 20 20 20 20 6d  ACHED+2 );.    m
18fa0 61 73 6b 20 3d 20 31 3c 3c 69 44 62 3b 0a 20 20  ask = 1<<iDb;.  
18fb0 20 20 69 66 28 20 28 70 50 61 72 73 65 2d 3e 63    if( (pParse->c
18fc0 6f 6f 6b 69 65 4d 61 73 6b 20 26 20 6d 61 73 6b  ookieMask & mask
18fd0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 50  )==0 ){.      pP
18fe0 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 4d 61 73 6b  arse->cookieMask
18ff0 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20 20 20 20 20   |= mask;.      
19000 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 56 61  pParse->cookieVa
19010 6c 75 65 5b 69 44 62 5d 20 3d 20 64 62 2d 3e 61  lue[iDb] = db->a
19020 44 62 5b 69 44 62 5d 2e 70 53 63 68 65 6d 61 2d  Db[iDb].pSchema-
19030 3e 73 63 68 65 6d 61 5f 63 6f 6f 6b 69 65 3b 0a  >schema_cookie;.
19040 20 20 20 20 20 20 69 66 28 20 21 4f 4d 49 54 5f        if( !OMIT_
19050 54 45 4d 50 44 42 20 26 26 20 69 44 62 3d 3d 31  TEMPDB && iDb==1
19060 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
19070 74 65 33 4f 70 65 6e 54 65 6d 70 44 61 74 61 62  te3OpenTempDatab
19080 61 73 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20  ase(pParse);.   
19090 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d     }.    }.  }.}
190a0 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
190b0 20 56 44 42 45 20 63 6f 64 65 20 74 68 61 74 20   VDBE code that 
190c0 70 72 65 70 61 72 65 73 20 66 6f 72 20 64 6f 69  prepares for doi
190d0 6e 67 20 61 6e 20 6f 70 65 72 61 74 69 6f 6e 20  ng an operation 
190e0 74 68 61 74 0a 2a 2a 20 6d 69 67 68 74 20 63 68  that.** might ch
190f0 61 6e 67 65 20 74 68 65 20 64 61 74 61 62 61 73  ange the databas
19100 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  e..**.** This ro
19110 75 74 69 6e 65 20 73 74 61 72 74 73 20 61 20 6e  utine starts a n
19120 65 77 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  ew transaction i
19130 66 20 77 65 20 61 72 65 20 6e 6f 74 20 61 6c 72  f we are not alr
19140 65 61 64 79 20 77 69 74 68 69 6e 0a 2a 2a 20 61  eady within.** a
19150 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 49   transaction.  I
19160 66 20 77 65 20 61 72 65 20 61 6c 72 65 61 64 79  f we are already
19170 20 77 69 74 68 69 6e 20 61 20 74 72 61 6e 73 61   within a transa
19180 63 74 69 6f 6e 2c 20 74 68 65 6e 20 61 20 63 68  ction, then a ch
19190 65 63 6b 70 6f 69 6e 74 0a 2a 2a 20 69 73 20 73  eckpoint.** is s
191a0 65 74 20 69 66 20 74 68 65 20 73 65 74 53 74 61  et if the setSta
191b0 74 65 6d 65 6e 74 20 70 61 72 61 6d 65 74 65 72  tement parameter
191c0 20 69 73 20 74 72 75 65 2e 20 20 41 20 63 68 65   is true.  A che
191d0 63 6b 70 6f 69 6e 74 20 73 68 6f 75 6c 64 0a 2a  ckpoint should.*
191e0 2a 20 62 65 20 73 65 74 20 66 6f 72 20 6f 70 65  * be set for ope
191f0 72 61 74 69 6f 6e 73 20 74 68 61 74 20 6d 69 67  rations that mig
19200 68 74 20 66 61 69 6c 20 28 64 75 65 20 74 6f 20  ht fail (due to 
19210 61 20 63 6f 6e 73 74 72 61 69 6e 74 29 20 70 61  a constraint) pa
19220 72 74 20 6f 66 0a 2a 2a 20 74 68 65 20 77 61 79  rt of.** the way
19230 20 74 68 72 6f 75 67 68 20 61 6e 64 20 77 68 69   through and whi
19240 63 68 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20  ch will need to 
19250 75 6e 64 6f 20 73 6f 6d 65 20 77 72 69 74 65 73  undo some writes
19260 20 77 69 74 68 6f 75 74 20 68 61 76 69 6e 67 20   without having 
19270 74 6f 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 74  to.** rollback t
19280 68 65 20 77 68 6f 6c 65 20 74 72 61 6e 73 61 63  he whole transac
19290 74 69 6f 6e 2e 20 20 46 6f 72 20 6f 70 65 72 61  tion.  For opera
192a0 74 69 6f 6e 73 20 77 68 65 72 65 20 61 6c 6c 20  tions where all 
192b0 63 6f 6e 73 74 72 61 69 6e 74 73 0a 2a 2a 20 63  constraints.** c
192c0 61 6e 20 62 65 20 63 68 65 63 6b 65 64 20 62 65  an be checked be
192d0 66 6f 72 65 20 61 6e 79 20 63 68 61 6e 67 65 73  fore any changes
192e0 20 61 72 65 20 6d 61 64 65 20 74 6f 20 74 68 65   are made to the
192f0 20 64 61 74 61 62 61 73 65 2c 20 69 74 20 69 73   database, it is
19300 20 6e 65 76 65 72 0a 2a 2a 20 6e 65 63 65 73 73   never.** necess
19310 61 72 79 20 74 6f 20 75 6e 64 6f 20 61 20 77 72  ary to undo a wr
19320 69 74 65 20 61 6e 64 20 74 68 65 20 63 68 65 63  ite and the chec
19330 6b 70 6f 69 6e 74 20 73 68 6f 75 6c 64 20 6e 6f  kpoint should no
19340 74 20 62 65 20 73 65 74 2e 0a 2a 2a 0a 2a 2a 20  t be set..**.** 
19350 4f 6e 6c 79 20 64 61 74 61 62 61 73 65 20 69 44  Only database iD
19360 62 20 61 6e 64 20 74 68 65 20 74 65 6d 70 20 64  b and the temp d
19370 61 74 61 62 61 73 65 20 61 72 65 20 6d 61 64 65  atabase are made
19380 20 77 72 69 74 61 62 6c 65 20 62 79 20 74 68 69   writable by thi
19390 73 20 63 61 6c 6c 2e 0a 2a 2a 20 49 66 20 69 44  s call..** If iD
193a0 62 3d 3d 30 2c 20 74 68 65 6e 20 74 68 65 20 6d  b==0, then the m
193b0 61 69 6e 20 61 6e 64 20 74 65 6d 70 20 64 61 74  ain and temp dat
193c0 61 62 61 73 65 73 20 61 72 65 20 6d 61 64 65 20  abases are made 
193d0 77 72 69 74 61 62 6c 65 2e 20 20 20 49 66 0a 2a  writable.   If.*
193e0 2a 20 69 44 62 3d 3d 31 20 74 68 65 6e 20 6f 6e  * iDb==1 then on
193f0 6c 79 20 74 68 65 20 74 65 6d 70 20 64 61 74 61  ly the temp data
19400 62 61 73 65 20 69 73 20 6d 61 64 65 20 77 72 69  base is made wri
19410 74 61 62 6c 65 2e 20 20 49 66 20 69 44 62 3e 31  table.  If iDb>1
19420 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20 73 70 65   then the.** spe
19430 63 69 66 69 65 64 20 61 75 78 69 6c 69 61 72 79  cified auxiliary
19440 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 74 68   database and th
19450 65 20 74 65 6d 70 20 64 61 74 61 62 61 73 65 20  e temp database 
19460 61 72 65 20 6d 61 64 65 20 77 72 69 74 61 62 6c  are made writabl
19470 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  e..*/.void sqlit
19480 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72  e3BeginWriteOper
19490 61 74 69 6f 6e 28 50 61 72 73 65 20 2a 70 50 61  ation(Parse *pPa
194a0 72 73 65 2c 20 69 6e 74 20 73 65 74 53 74 61 74  rse, int setStat
194b0 65 6d 65 6e 74 2c 20 69 6e 74 20 69 44 62 29 7b  ement, int iDb){
194c0 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c  .  Vdbe *v = sql
194d0 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
194e0 73 65 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20  se);.  if( v==0 
194f0 29 20 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69  ) return;.  sqli
19500 74 65 33 43 6f 64 65 56 65 72 69 66 79 53 63 68  te3CodeVerifySch
19510 65 6d 61 28 70 50 61 72 73 65 2c 20 69 44 62 29  ema(pParse, iDb)
19520 3b 0a 20 20 70 50 61 72 73 65 2d 3e 77 72 69 74  ;.  pParse->writ
19530 65 4d 61 73 6b 20 7c 3d 20 31 3c 3c 69 44 62 3b  eMask |= 1<<iDb;
19540 0a 20 20 69 66 28 20 73 65 74 53 74 61 74 65 6d  .  if( setStatem
19550 65 6e 74 20 26 26 20 70 50 61 72 73 65 2d 3e 6e  ent && pParse->n
19560 65 73 74 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20  ested==0 ){.    
19570 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
19580 28 76 2c 20 4f 50 5f 53 74 61 74 65 6d 65 6e 74  (v, OP_Statement
19590 2c 20 69 44 62 2c 20 30 29 3b 0a 20 20 7d 0a 20  , iDb, 0);.  }. 
195a0 20 69 66 28 20 28 4f 4d 49 54 5f 54 45 4d 50 44   if( (OMIT_TEMPD
195b0 42 20 7c 7c 20 69 44 62 21 3d 31 29 20 26 26 20  B || iDb!=1) && 
195c0 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61 44 62 5b  pParse->db->aDb[
195d0 31 5d 2e 70 42 74 21 3d 30 20 29 7b 0a 20 20 20  1].pBt!=0 ){.   
195e0 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69   sqlite3BeginWri
195f0 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72  teOperation(pPar
19600 73 65 2c 20 73 65 74 53 74 61 74 65 6d 65 6e 74  se, setStatement
19610 2c 20 31 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  , 1);.  }.}../*.
19620 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20  ** Check to see 
19630 69 66 20 70 49 6e 64 65 78 20 75 73 65 73 20 74  if pIndex uses t
19640 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71  he collating seq
19650 75 65 6e 63 65 20 70 43 6f 6c 6c 2e 20 20 52 65  uence pColl.  Re
19660 74 75 72 6e 0a 2a 2a 20 74 72 75 65 20 69 66 20  turn.** true if 
19670 69 74 20 64 6f 65 73 20 61 6e 64 20 66 61 6c 73  it does and fals
19680 65 20 69 66 20 69 74 20 64 6f 65 73 20 6e 6f 74  e if it does not
19690 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
196a0 49 54 45 5f 4f 4d 49 54 5f 52 45 49 4e 44 45 58  ITE_OMIT_REINDEX
196b0 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f 6c 6c  .static int coll
196c0 61 74 69 6f 6e 4d 61 74 63 68 28 63 6f 6e 73 74  ationMatch(const
196d0 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 2c 20 49 6e   char *zColl, In
196e0 64 65 78 20 2a 70 49 6e 64 65 78 29 7b 0a 20 20  dex *pIndex){.  
196f0 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30  int i;.  for(i=0
19700 3b 20 69 3c 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c  ; i<pIndex->nCol
19710 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63  umn; i++){.    c
19720 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 70  onst char *z = p
19730 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d  Index->azColl[i]
19740 3b 0a 20 20 20 20 69 66 28 20 7a 3d 3d 7a 43 6f  ;.    if( z==zCo
19750 6c 6c 20 7c 7c 20 28 7a 20 26 26 20 7a 43 6f 6c  ll || (z && zCol
19760 6c 20 26 26 20 30 3d 3d 73 71 6c 69 74 65 33 53  l && 0==sqlite3S
19770 74 72 49 43 6d 70 28 7a 2c 20 7a 43 6f 6c 6c 29  trICmp(z, zColl)
19780 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  ) ){.      retur
19790 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  n 1;.    }.  }. 
197a0 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e   return 0;.}.#en
197b0 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6f 6d  dif../*.** Recom
197c0 70 75 74 65 20 61 6c 6c 20 69 6e 64 69 63 65 73  pute all indices
197d0 20 6f 66 20 70 54 61 62 20 74 68 61 74 20 75 73   of pTab that us
197e0 65 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20  e the collating 
197f0 73 65 71 75 65 6e 63 65 20 70 43 6f 6c 6c 2e 0a  sequence pColl..
19800 2a 2a 20 49 66 20 70 43 6f 6c 6c 3d 3d 30 20 74  ** If pColl==0 t
19810 68 65 6e 20 72 65 63 6f 6d 70 75 74 65 20 61 6c  hen recompute al
19820 6c 20 69 6e 64 69 63 65 73 20 6f 66 20 70 54 61  l indices of pTa
19830 62 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  b..*/.#ifndef SQ
19840 4c 49 54 45 5f 4f 4d 49 54 5f 52 45 49 4e 44 45  LITE_OMIT_REINDE
19850 58 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65  X.static void re
19860 69 6e 64 65 78 54 61 62 6c 65 28 50 61 72 73 65  indexTable(Parse
19870 20 2a 70 50 61 72 73 65 2c 20 54 61 62 6c 65 20   *pParse, Table 
19880 2a 70 54 61 62 2c 20 63 68 61 72 20 63 6f 6e 73  *pTab, char cons
19890 74 20 2a 7a 43 6f 6c 6c 29 7b 0a 20 20 49 6e 64  t *zColl){.  Ind
198a0 65 78 20 2a 70 49 6e 64 65 78 3b 20 20 20 20 20  ex *pIndex;     
198b0 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 69           /* An i
198c0 6e 64 65 78 20 61 73 73 6f 63 69 61 74 65 64 20  ndex associated 
198d0 77 69 74 68 20 70 54 61 62 20 2a 2f 0a 0a 20 20  with pTab */..  
198e0 66 6f 72 28 70 49 6e 64 65 78 3d 70 54 61 62 2d  for(pIndex=pTab-
198f0 3e 70 49 6e 64 65 78 3b 20 70 49 6e 64 65 78 3b  >pIndex; pIndex;
19900 20 70 49 6e 64 65 78 3d 70 49 6e 64 65 78 2d 3e   pIndex=pIndex->
19910 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20  pNext){.    if( 
19920 7a 43 6f 6c 6c 3d 3d 30 20 7c 7c 20 63 6f 6c 6c  zColl==0 || coll
19930 61 74 69 6f 6e 4d 61 74 63 68 28 7a 43 6f 6c 6c  ationMatch(zColl
19940 2c 20 70 49 6e 64 65 78 29 20 29 7b 0a 20 20 20  , pIndex) ){.   
19950 20 20 20 69 6e 74 20 69 44 62 20 3d 20 73 71 6c     int iDb = sql
19960 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65  ite3SchemaToInde
19970 78 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 54  x(pParse->db, pT
19980 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20  ab->pSchema);.  
19990 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e      sqlite3Begin
199a0 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70  WriteOperation(p
199b0 50 61 72 73 65 2c 20 30 2c 20 69 44 62 29 3b 0a  Parse, 0, iDb);.
199c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 66        sqlite3Ref
199d0 69 6c 6c 49 6e 64 65 78 28 70 50 61 72 73 65 2c  illIndex(pParse,
199e0 20 70 49 6e 64 65 78 2c 20 2d 31 29 3b 0a 20 20   pIndex, -1);.  
199f0 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66    }.  }.}.#endif
19a00 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6f 6d 70 75 74  ../*.** Recomput
19a10 65 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 6f 66  e all indices of
19a20 20 61 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20 61   all tables in a
19a30 6c 6c 20 64 61 74 61 62 61 73 65 73 20 77 68 65  ll databases whe
19a40 72 65 20 74 68 65 0a 2a 2a 20 69 6e 64 69 63 65  re the.** indice
19a50 73 20 75 73 65 20 74 68 65 20 63 6f 6c 6c 61 74  s use the collat
19a60 69 6e 67 20 73 65 71 75 65 6e 63 65 20 70 43 6f  ing sequence pCo
19a70 6c 6c 2e 20 20 49 66 20 70 43 6f 6c 6c 3d 3d 30  ll.  If pColl==0
19a80 20 74 68 65 6e 20 72 65 63 6f 6d 70 75 74 65 0a   then recompute.
19a90 2a 2a 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 65  ** all indices e
19aa0 76 65 72 79 77 68 65 72 65 2e 0a 2a 2f 0a 23 69  verywhere..*/.#i
19ab0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
19ac0 54 5f 52 45 49 4e 44 45 58 0a 73 74 61 74 69 63  T_REINDEX.static
19ad0 20 76 6f 69 64 20 72 65 69 6e 64 65 78 44 61 74   void reindexDat
19ae0 61 62 61 73 65 73 28 50 61 72 73 65 20 2a 70 50  abases(Parse *pP
19af0 61 72 73 65 2c 20 63 68 61 72 20 63 6f 6e 73 74  arse, char const
19b00 20 2a 7a 43 6f 6c 6c 29 7b 0a 20 20 44 62 20 2a   *zColl){.  Db *
19b10 70 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  pDb;            
19b20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 73 69 6e          /* A sin
19b30 67 6c 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  gle database */.
19b40 20 20 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20    int iDb;      
19b50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
19b60 20 54 68 65 20 64 61 74 61 62 61 73 65 20 69 6e   The database in
19b70 64 65 78 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20  dex number */.  
19b80 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
19b90 61 72 73 65 2d 3e 64 62 3b 20 20 20 2f 2a 20 54  arse->db;   /* T
19ba0 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  he database conn
19bb0 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 48 61 73 68  ection */.  Hash
19bc0 45 6c 65 6d 20 2a 6b 3b 20 20 20 20 20 20 20 20  Elem *k;        
19bd0 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c          /* For l
19be0 6f 6f 70 69 6e 67 20 6f 76 65 72 20 74 61 62 6c  ooping over tabl
19bf0 65 73 20 69 6e 20 70 44 62 20 2a 2f 0a 20 20 54  es in pDb */.  T
19c00 61 62 6c 65 20 2a 70 54 61 62 3b 20 20 20 20 20  able *pTab;     
19c10 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20             /* A 
19c20 74 61 62 6c 65 20 69 6e 20 74 68 65 20 64 61 74  table in the dat
19c30 61 62 61 73 65 20 2a 2f 0a 0a 20 20 66 6f 72 28  abase */..  for(
19c40 69 44 62 3d 30 2c 20 70 44 62 3d 64 62 2d 3e 61  iDb=0, pDb=db->a
19c50 44 62 3b 20 69 44 62 3c 64 62 2d 3e 6e 44 62 3b  Db; iDb<db->nDb;
19c60 20 69 44 62 2b 2b 2c 20 70 44 62 2b 2b 29 7b 0a   iDb++, pDb++){.
19c70 20 20 20 20 61 73 73 65 72 74 28 20 70 44 62 21      assert( pDb!
19c80 3d 30 20 29 3b 0a 20 20 20 20 66 6f 72 28 6b 3d  =0 );.    for(k=
19c90 73 71 6c 69 74 65 48 61 73 68 46 69 72 73 74 28  sqliteHashFirst(
19ca0 26 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 74  &pDb->pSchema->t
19cb0 62 6c 48 61 73 68 29 3b 20 20 6b 3b 20 6b 3d 73  blHash);  k; k=s
19cc0 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28 6b 29  qliteHashNext(k)
19cd0 29 7b 0a 20 20 20 20 20 20 70 54 61 62 20 3d 20  ){.      pTab = 
19ce0 28 54 61 62 6c 65 2a 29 73 71 6c 69 74 65 48 61  (Table*)sqliteHa
19cf0 73 68 44 61 74 61 28 6b 29 3b 0a 20 20 20 20 20  shData(k);.     
19d00 20 72 65 69 6e 64 65 78 54 61 62 6c 65 28 70 50   reindexTable(pP
19d10 61 72 73 65 2c 20 70 54 61 62 2c 20 7a 43 6f 6c  arse, pTab, zCol
19d20 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  l);.    }.  }.}.
19d30 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 47 65  #endif../*.** Ge
19d40 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20  nerate code for 
19d50 74 68 65 20 52 45 49 4e 44 45 58 20 63 6f 6d 6d  the REINDEX comm
19d60 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  and..**.**      
19d70 20 20 52 45 49 4e 44 45 58 20 20 20 20 20 20 20    REINDEX       
19d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19d90 20 20 20 20 20 2d 2d 20 31 0a 2a 2a 20 20 20 20       -- 1.**    
19da0 20 20 20 20 52 45 49 4e 44 45 58 20 20 3c 63 6f      REINDEX  <co
19db0 6c 6c 61 74 69 6f 6e 3e 20 20 20 20 20 20 20 20  llation>        
19dc0 20 20 20 20 20 20 20 2d 2d 20 32 0a 2a 2a 20 20         -- 2.**  
19dd0 20 20 20 20 20 20 52 45 49 4e 44 45 58 20 20 3f        REINDEX  ?
19de0 3c 64 61 74 61 62 61 73 65 3e 2e 3f 3c 74 61 62  <database>.?<tab
19df0 6c 65 6e 61 6d 65 3e 20 20 2d 2d 20 33 0a 2a 2a  lename>  -- 3.**
19e00 20 20 20 20 20 20 20 20 52 45 49 4e 44 45 58 20          REINDEX 
19e10 20 3f 3c 64 61 74 61 62 61 73 65 3e 2e 3f 3c 69   ?<database>.?<i
19e20 6e 64 65 78 6e 61 6d 65 3e 20 20 2d 2d 20 34 0a  ndexname>  -- 4.
19e30 2a 2a 0a 2a 2a 20 46 6f 72 6d 20 31 20 63 61 75  **.** Form 1 cau
19e40 73 65 73 20 61 6c 6c 20 69 6e 64 69 63 65 73 20  ses all indices 
19e50 69 6e 20 61 6c 6c 20 61 74 74 61 63 68 65 64 20  in all attached 
19e60 64 61 74 61 62 61 73 65 73 20 74 6f 20 62 65 20  databases to be 
19e70 72 65 62 75 69 6c 74 2e 0a 2a 2a 20 46 6f 72 6d  rebuilt..** Form
19e80 20 32 20 72 65 62 75 69 6c 64 73 20 61 6c 6c 20   2 rebuilds all 
19e90 69 6e 64 69 63 65 73 20 69 6e 20 61 6c 6c 20 64  indices in all d
19ea0 61 74 61 62 61 73 65 73 20 74 68 61 74 20 75 73  atabases that us
19eb0 65 20 74 68 65 20 6e 61 6d 65 64 0a 2a 2a 20 63  e the named.** c
19ec0 6f 6c 6c 61 74 69 6e 67 20 66 75 6e 63 74 69 6f  ollating functio
19ed0 6e 2e 20 20 46 6f 72 6d 73 20 33 20 61 6e 64 20  n.  Forms 3 and 
19ee0 34 20 72 65 62 75 69 6c 64 20 74 68 65 20 6e 61  4 rebuild the na
19ef0 6d 65 64 20 69 6e 64 65 78 20 6f 72 20 61 6c 6c  med index or all
19f00 0a 2a 2a 20 69 6e 64 69 63 65 73 20 61 73 73 6f  .** indices asso
19f10 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20  ciated with the 
19f20 6e 61 6d 65 64 20 74 61 62 6c 65 2e 0a 2a 2f 0a  named table..*/.
19f30 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
19f40 4d 49 54 5f 52 45 49 4e 44 45 58 0a 76 6f 69 64  MIT_REINDEX.void
19f50 20 73 71 6c 69 74 65 33 52 65 69 6e 64 65 78 28   sqlite3Reindex(
19f60 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54  Parse *pParse, T
19f70 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c 20 54 6f  oken *pName1, To
19f80 6b 65 6e 20 2a 70 4e 61 6d 65 32 29 7b 0a 20 20  ken *pName2){.  
19f90 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 20  CollSeq *pColl; 
19fa0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
19fb0 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
19fc0 65 20 74 6f 20 62 65 20 72 65 69 6e 64 65 78 65  e to be reindexe
19fd0 64 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20  d, or NULL */.  
19fe0 63 68 61 72 20 2a 7a 3b 20 20 20 20 20 20 20 20  char *z;        
19ff0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
1a000 61 6d 65 20 6f 66 20 61 20 74 61 62 6c 65 20 6f  ame of a table o
1a010 72 20 69 6e 64 65 78 20 2a 2f 0a 20 20 63 6f 6e  r index */.  con
1a020 73 74 20 63 68 61 72 20 2a 7a 44 62 3b 20 20 20  st char *zDb;   
1a030 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
1a040 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
1a050 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61   */.  Table *pTa
1a060 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
1a070 20 20 2f 2a 20 41 20 74 61 62 6c 65 20 69 6e 20    /* A table in 
1a080 74 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  the database */.
1a090 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b    Index *pIndex;
1a0a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1a0b0 20 41 6e 20 69 6e 64 65 78 20 61 73 73 6f 63 69   An index associ
1a0c0 61 74 65 64 20 77 69 74 68 20 70 54 61 62 20 2a  ated with pTab *
1a0d0 2f 0a 20 20 69 6e 74 20 69 44 62 3b 20 20 20 20  /.  int iDb;    
1a0e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a0f0 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20  /* The database 
1a100 69 6e 64 65 78 20 6e 75 6d 62 65 72 20 2a 2f 0a  index number */.
1a110 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
1a120 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 20 2f 2a  pParse->db;   /*
1a130 20 54 68 65 20 64 61 74 61 62 61 73 65 20 63 6f   The database co
1a140 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 6f  nnection */.  To
1a150 6b 65 6e 20 2a 70 4f 62 6a 4e 61 6d 65 3b 20 20  ken *pObjName;  
1a160 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
1a170 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 6f  e of the table o
1a180 72 20 69 6e 64 65 78 20 74 6f 20 62 65 20 72 65  r index to be re
1a190 69 6e 64 65 78 65 64 20 2a 2f 0a 0a 20 20 2f 2a  indexed */..  /*
1a1a0 20 52 65 61 64 20 74 68 65 20 64 61 74 61 62 61   Read the databa
1a1b0 73 65 20 73 63 68 65 6d 61 2e 20 49 66 20 61 6e  se schema. If an
1a1c0 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 6c   error occurs, l
1a1d0 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65  eave an error me
1a1e0 73 73 61 67 65 0a 20 20 2a 2a 20 61 6e 64 20 63  ssage.  ** and c
1a1f0 6f 64 65 20 69 6e 20 70 50 61 72 73 65 20 61 6e  ode in pParse an
1a200 64 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 20 2a  d return NULL. *
1a210 2f 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f  /.  if( SQLITE_O
1a220 4b 21 3d 73 71 6c 69 74 65 33 52 65 61 64 53 63  K!=sqlite3ReadSc
1a230 68 65 6d 61 28 70 50 61 72 73 65 29 20 29 7b 0a  hema(pParse) ){.
1a240 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
1a250 0a 20 20 69 66 28 20 70 4e 61 6d 65 31 3d 3d 30  .  if( pName1==0
1a260 20 7c 7c 20 70 4e 61 6d 65 31 2d 3e 7a 3d 3d 30   || pName1->z==0
1a270 20 29 7b 0a 20 20 20 20 72 65 69 6e 64 65 78 44   ){.    reindexD
1a280 61 74 61 62 61 73 65 73 28 70 50 61 72 73 65 2c  atabases(pParse,
1a290 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b   0);.    return;
1a2a0 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4e 61  .  }else if( pNa
1a2b0 6d 65 32 3d 3d 30 20 7c 7c 20 70 4e 61 6d 65 32  me2==0 || pName2
1a2c0 2d 3e 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73  ->z==0 ){.    as
1a2d0 73 65 72 74 28 20 70 4e 61 6d 65 31 2d 3e 7a 20  sert( pName1->z 
1a2e0 29 3b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73  );.    pColl = s
1a2f0 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65  qlite3FindCollSe
1a300 71 28 64 62 2c 20 45 4e 43 28 64 62 29 2c 20 28  q(db, ENC(db), (
1a310 63 68 61 72 2a 29 70 4e 61 6d 65 31 2d 3e 7a 2c  char*)pName1->z,
1a320 20 70 4e 61 6d 65 31 2d 3e 6e 2c 20 30 29 3b 0a   pName1->n, 0);.
1a330 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 20 29 7b      if( pColl ){
1a340 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 43 6f  .      char *zCo
1a350 6c 6c 20 3d 20 73 71 6c 69 74 65 53 74 72 4e 44  ll = sqliteStrND
1a360 75 70 28 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  up((const char *
1a370 29 70 4e 61 6d 65 31 2d 3e 7a 2c 20 70 4e 61 6d  )pName1->z, pNam
1a380 65 31 2d 3e 6e 29 3b 0a 20 20 20 20 20 20 69 66  e1->n);.      if
1a390 28 20 7a 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20  ( zColl ){.     
1a3a0 20 20 20 72 65 69 6e 64 65 78 44 61 74 61 62 61     reindexDataba
1a3b0 73 65 73 28 70 50 61 72 73 65 2c 20 7a 43 6f 6c  ses(pParse, zCol
1a3c0 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  l);.        sqli
1a3d0 74 65 46 72 65 65 28 7a 43 6f 6c 6c 29 3b 0a 20  teFree(zColl);. 
1a3e0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74       }.      ret
1a3f0 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  urn;.    }.  }. 
1a400 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 54 77   iDb = sqlite3Tw
1a410 6f 50 61 72 74 4e 61 6d 65 28 70 50 61 72 73 65  oPartName(pParse
1a420 2c 20 70 4e 61 6d 65 31 2c 20 70 4e 61 6d 65 32  , pName1, pName2
1a430 2c 20 26 70 4f 62 6a 4e 61 6d 65 29 3b 0a 20 20  , &pObjName);.  
1a440 69 66 28 20 69 44 62 3c 30 20 29 20 72 65 74 75  if( iDb<0 ) retu
1a450 72 6e 3b 0a 20 20 7a 20 3d 20 73 71 6c 69 74 65  rn;.  z = sqlite
1a460 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70  3NameFromToken(p
1a470 4f 62 6a 4e 61 6d 65 29 3b 0a 20 20 7a 44 62 20  ObjName);.  zDb 
1a480 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a  = db->aDb[iDb].z
1a490 4e 61 6d 65 3b 0a 20 20 70 54 61 62 20 3d 20 73  Name;.  pTab = s
1a4a0 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28  qlite3FindTable(
1a4b0 64 62 2c 20 7a 2c 20 7a 44 62 29 3b 0a 20 20 69  db, z, zDb);.  i
1a4c0 66 28 20 70 54 61 62 20 29 7b 0a 20 20 20 20 72  f( pTab ){.    r
1a4d0 65 69 6e 64 65 78 54 61 62 6c 65 28 70 50 61 72  eindexTable(pPar
1a4e0 73 65 2c 20 70 54 61 62 2c 20 30 29 3b 0a 20 20  se, pTab, 0);.  
1a4f0 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 29 3b    sqliteFree(z);
1a500 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
1a510 0a 20 20 70 49 6e 64 65 78 20 3d 20 73 71 6c 69  .  pIndex = sqli
1a520 74 65 33 46 69 6e 64 49 6e 64 65 78 28 64 62 2c  te3FindIndex(db,
1a530 20 7a 2c 20 7a 44 62 29 3b 0a 20 20 73 71 6c 69   z, zDb);.  sqli
1a540 74 65 46 72 65 65 28 7a 29 3b 0a 20 20 69 66 28  teFree(z);.  if(
1a550 20 70 49 6e 64 65 78 20 29 7b 0a 20 20 20 20 73   pIndex ){.    s
1a560 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74 65  qlite3BeginWrite
1a570 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65  Operation(pParse
1a580 2c 20 30 2c 20 69 44 62 29 3b 0a 20 20 20 20 73  , 0, iDb);.    s
1a590 71 6c 69 74 65 33 52 65 66 69 6c 6c 49 6e 64 65  qlite3RefillInde
1a5a0 78 28 70 50 61 72 73 65 2c 20 70 49 6e 64 65 78  x(pParse, pIndex
1a5b0 2c 20 2d 31 29 3b 0a 20 20 20 20 72 65 74 75 72  , -1);.    retur
1a5c0 6e 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  n;.  }.  sqlite3
1a5d0 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
1a5e0 20 22 75 6e 61 62 6c 65 20 74 6f 20 69 64 65 6e   "unable to iden
1a5f0 74 69 66 79 20 74 68 65 20 6f 62 6a 65 63 74 20  tify the object 
1a600 74 6f 20 62 65 20 72 65 69 6e 64 65 78 65 64 22  to be reindexed"
1a610 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  );.}.#endif../*.
1a620 2a 2a 20 52 65 74 75 72 6e 20 61 20 64 79 6e 61  ** Return a dyna
1a630 6d 69 63 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20  micly allocated 
1a640 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72  KeyInfo structur
1a650 65 20 74 68 61 74 20 63 61 6e 20 62 65 20 75 73  e that can be us
1a660 65 64 0a 2a 2a 20 77 69 74 68 20 4f 50 5f 4f 70  ed.** with OP_Op
1a670 65 6e 52 65 61 64 20 6f 72 20 4f 50 5f 4f 70 65  enRead or OP_Ope
1a680 6e 57 72 69 74 65 20 74 6f 20 61 63 63 65 73 73  nWrite to access
1a690 20 64 61 74 61 62 61 73 65 20 69 6e 64 65 78 20   database index 
1a6a0 70 49 64 78 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73  pIdx..**.** If s
1a6b0 75 63 63 65 73 73 66 75 6c 2c 20 61 20 70 6f 69  uccessful, a poi
1a6c0 6e 74 65 72 20 74 6f 20 74 68 65 20 6e 65 77 20  nter to the new 
1a6d0 73 74 72 75 63 74 75 72 65 20 69 73 20 72 65 74  structure is ret
1a6e0 75 72 6e 65 64 2e 20 49 6e 20 74 68 69 73 20 63  urned. In this c
1a6f0 61 73 65 0a 2a 2a 20 74 68 65 20 63 61 6c 6c 65  ase.** the calle
1a700 72 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65  r is responsible
1a710 20 66 6f 72 20 63 61 6c 6c 69 6e 67 20 73 71 6c   for calling sql
1a720 69 74 65 46 72 65 65 28 29 20 6f 6e 20 74 68 65  iteFree() on the
1a730 20 72 65 74 75 72 6e 65 64 20 0a 2a 2a 20 70 6f   returned .** po
1a740 69 6e 74 65 72 2e 20 49 66 20 61 6e 20 65 72 72  inter. If an err
1a750 6f 72 20 6f 63 63 75 72 73 20 28 6f 75 74 20 6f  or occurs (out o
1a760 66 20 6d 65 6d 6f 72 79 20 6f 72 20 6d 69 73 73  f memory or miss
1a770 69 6e 67 20 63 6f 6c 6c 61 74 69 6f 6e 20 0a 2a  ing collation .*
1a780 2a 20 73 65 71 75 65 6e 63 65 29 2c 20 4e 55 4c  * sequence), NUL
1a790 4c 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e  L is returned an
1a7a0 64 20 74 68 65 20 73 74 61 74 65 20 6f 66 20 70  d the state of p
1a7b0 50 61 72 73 65 20 75 70 64 61 74 65 64 20 74 6f  Parse updated to
1a7c0 20 72 65 66 6c 65 63 74 0a 2a 2a 20 74 68 65 20   reflect.** the 
1a7d0 65 72 72 6f 72 2e 0a 2a 2f 0a 4b 65 79 49 6e 66  error..*/.KeyInf
1a7e0 6f 20 2a 73 71 6c 69 74 65 33 49 6e 64 65 78 4b  o *sqlite3IndexK
1a7f0 65 79 69 6e 66 6f 28 50 61 72 73 65 20 2a 70 50  eyinfo(Parse *pP
1a800 61 72 73 65 2c 20 49 6e 64 65 78 20 2a 70 49 64  arse, Index *pId
1a810 78 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  x){.  int i;.  i
1a820 6e 74 20 6e 43 6f 6c 20 3d 20 70 49 64 78 2d 3e  nt nCol = pIdx->
1a830 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 69 6e 74 20 6e  nColumn;.  int n
1a840 42 79 74 65 73 20 3d 20 73 69 7a 65 6f 66 28 4b  Bytes = sizeof(K
1a850 65 79 49 6e 66 6f 29 20 2b 20 28 6e 43 6f 6c 2d  eyInfo) + (nCol-
1a860 31 29 2a 73 69 7a 65 6f 66 28 43 6f 6c 6c 53 65  1)*sizeof(CollSe
1a870 71 2a 29 20 2b 20 6e 43 6f 6c 3b 0a 20 20 4b 65  q*) + nCol;.  Ke
1a880 79 49 6e 66 6f 20 2a 70 4b 65 79 20 3d 20 28 4b  yInfo *pKey = (K
1a890 65 79 49 6e 66 6f 20 2a 29 73 71 6c 69 74 65 4d  eyInfo *)sqliteM
1a8a0 61 6c 6c 6f 63 28 6e 42 79 74 65 73 29 3b 0a 0a  alloc(nBytes);..
1a8b0 20 20 69 66 28 20 70 4b 65 79 20 29 7b 0a 20 20    if( pKey ){.  
1a8c0 20 20 70 4b 65 79 2d 3e 61 53 6f 72 74 4f 72 64    pKey->aSortOrd
1a8d0 65 72 20 3d 20 28 75 38 20 2a 29 26 28 70 4b 65  er = (u8 *)&(pKe
1a8e0 79 2d 3e 61 43 6f 6c 6c 5b 6e 43 6f 6c 5d 29 3b  y->aColl[nCol]);
1a8f0 0a 20 20 20 20 61 73 73 65 72 74 28 20 26 70 4b  .    assert( &pK
1a900 65 79 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 6e  ey->aSortOrder[n
1a910 43 6f 6c 5d 3d 3d 26 28 28 28 75 38 20 2a 29 70  Col]==&(((u8 *)p
1a920 4b 65 79 29 5b 6e 42 79 74 65 73 5d 29 20 29 3b  Key)[nBytes]) );
1a930 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
1a940 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nCol; i++){.    
1a950 20 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 20 3d 20    char *zColl = 
1a960 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 3b  pIdx->azColl[i];
1a970 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 7a  .      assert( z
1a980 43 6f 6c 6c 20 29 3b 0a 20 20 20 20 20 20 70 4b  Coll );.      pK
1a990 65 79 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d 20 73  ey->aColl[i] = s
1a9a0 71 6c 69 74 65 33 4c 6f 63 61 74 65 43 6f 6c 6c  qlite3LocateColl
1a9b0 53 65 71 28 70 50 61 72 73 65 2c 20 7a 43 6f 6c  Seq(pParse, zCol
1a9c0 6c 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20 70 4b  l, -1);.      pK
1a9d0 65 79 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69  ey->aSortOrder[i
1a9e0 5d 20 3d 20 70 49 64 78 2d 3e 61 53 6f 72 74 4f  ] = pIdx->aSortO
1a9f0 72 64 65 72 5b 69 5d 3b 0a 20 20 20 20 7d 0a 20  rder[i];.    }. 
1aa00 20 20 20 70 4b 65 79 2d 3e 6e 46 69 65 6c 64 20     pKey->nField 
1aa10 3d 20 6e 43 6f 6c 3b 0a 20 20 7d 0a 0a 20 20 69  = nCol;.  }..  i
1aa20 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20  f( pParse->nErr 
1aa30 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65  ){.    sqliteFre
1aa40 65 28 70 4b 65 79 29 3b 0a 20 20 20 20 70 4b 65  e(pKey);.    pKe
1aa50 79 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74  y = 0;.  }.  ret
1aa60 75 72 6e 20 70 4b 65 79 3b 0a 7d 0a              urn pKey;.}.