/ Hex Artifact Content
Login

Artifact 6bd68dc730b01c1727738f8e4b5c730eb0ddb421:


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 33 20 32 30 30 37 2f 30 32 2f 30 32  1.413 2007/02/02
02f0: 20 31 32 3a 34 34 3a 33 37 20 64 72 68 20 45 78   12:44:37 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 73 71 6c 69 74 65 52 65 61 6c 6c 6f 63 4f 72   sqliteReallocOr
0a30: 46 72 65 65 28 28 76 6f 69 64 20 2a 2a 29 26 70  Free((void **)&p
0a40: 50 61 72 73 65 2d 3e 61 54 61 62 6c 65 4c 6f 63  Parse->aTableLoc
0a50: 6b 2c 20 6e 42 79 74 65 73 29 3b 0a 20 20 69 66  k, nBytes);.  if
0a60: 28 20 70 50 61 72 73 65 2d 3e 61 54 61 62 6c 65  ( pParse->aTable
0a70: 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 70 20 3d 20  Lock ){.    p = 
0a80: 26 70 50 61 72 73 65 2d 3e 61 54 61 62 6c 65 4c  &pParse->aTableL
0a90: 6f 63 6b 5b 70 50 61 72 73 65 2d 3e 6e 54 61 62  ock[pParse->nTab
0aa0: 6c 65 4c 6f 63 6b 2b 2b 5d 3b 0a 20 20 20 20 70  leLock++];.    p
0ab0: 2d 3e 69 44 62 20 3d 20 69 44 62 3b 0a 20 20 20  ->iDb = iDb;.   
0ac0: 20 70 2d 3e 69 54 61 62 20 3d 20 69 54 61 62 3b   p->iTab = iTab;
0ad0: 0a 20 20 20 20 70 2d 3e 69 73 57 72 69 74 65 4c  .    p->isWriteL
0ae0: 6f 63 6b 20 3d 20 69 73 57 72 69 74 65 4c 6f 63  ock = isWriteLoc
0af0: 6b 3b 0a 20 20 20 20 70 2d 3e 7a 4e 61 6d 65 20  k;.    p->zName 
0b00: 3d 20 7a 4e 61 6d 65 3b 0a 20 20 7d 0a 7d 0a 0a  = zName;.  }.}..
0b10: 2f 2a 0a 2a 2a 20 43 6f 64 65 20 61 6e 20 4f 50  /*.** Code an OP
0b20: 5f 54 61 62 6c 65 4c 6f 63 6b 20 69 6e 73 74 72  _TableLock instr
0b30: 75 63 74 69 6f 6e 20 66 6f 72 20 65 61 63 68 20  uction for each 
0b40: 74 61 62 6c 65 20 6c 6f 63 6b 65 64 20 62 79 20  table locked by 
0b50: 74 68 65 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74  the.** statement
0b60: 20 28 63 6f 6e 66 69 67 75 72 65 64 20 62 79 20   (configured by 
0b70: 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33  calls to sqlite3
0b80: 54 61 62 6c 65 4c 6f 63 6b 28 29 29 2e 0a 2a 2f  TableLock())..*/
0b90: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f 64  .static void cod
0ba0: 65 54 61 62 6c 65 4c 6f 63 6b 73 28 50 61 72 73  eTableLocks(Pars
0bb0: 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 69 6e  e *pParse){.  in
0bc0: 74 20 69 3b 0a 20 20 56 64 62 65 20 2a 70 56 64  t i;.  Vdbe *pVd
0bd0: 62 65 3b 20 0a 20 20 61 73 73 65 72 74 28 20 73  be; .  assert( s
0be0: 71 6c 69 74 65 33 54 68 72 65 61 64 44 61 74 61  qlite3ThreadData
0bf0: 52 65 61 64 4f 6e 6c 79 28 29 2d 3e 75 73 65 53  ReadOnly()->useS
0c00: 68 61 72 65 64 44 61 74 61 20 7c 7c 20 70 50 61  haredData || pPa
0c10: 72 73 65 2d 3e 6e 54 61 62 6c 65 4c 6f 63 6b 3d  rse->nTableLock=
0c20: 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20 30 3d 3d  =0 );..  if( 0==
0c30: 28 70 56 64 62 65 20 3d 20 73 71 6c 69 74 65 33  (pVdbe = sqlite3
0c40: 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 29  GetVdbe(pParse))
0c50: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a   ){.    return;.
0c60: 20 20 7d 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20    }..  for(i=0; 
0c70: 69 3c 70 50 61 72 73 65 2d 3e 6e 54 61 62 6c 65  i<pParse->nTable
0c80: 4c 6f 63 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Lock; i++){.    
0c90: 54 61 62 6c 65 4c 6f 63 6b 20 2a 70 20 3d 20 26  TableLock *p = &
0ca0: 70 50 61 72 73 65 2d 3e 61 54 61 62 6c 65 4c 6f  pParse->aTableLo
0cb0: 63 6b 5b 69 5d 3b 0a 20 20 20 20 69 6e 74 20 70  ck[i];.    int p
0cc0: 31 20 3d 20 70 2d 3e 69 44 62 3b 0a 20 20 20 20  1 = p->iDb;.    
0cd0: 69 66 28 20 70 2d 3e 69 73 57 72 69 74 65 4c 6f  if( p->isWriteLo
0ce0: 63 6b 20 29 7b 0a 20 20 20 20 20 20 70 31 20 3d  ck ){.      p1 =
0cf0: 20 2d 31 2a 28 70 31 2b 31 29 3b 0a 20 20 20 20   -1*(p1+1);.    
0d00: 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  }.    sqlite3Vdb
0d10: 65 4f 70 33 28 70 56 64 62 65 2c 20 4f 50 5f 54  eOp3(pVdbe, OP_T
0d20: 61 62 6c 65 4c 6f 63 6b 2c 20 70 31 2c 20 70 2d  ableLock, p1, p-
0d30: 3e 69 54 61 62 2c 20 70 2d 3e 7a 4e 61 6d 65 2c  >iTab, p->zName,
0d40: 20 50 33 5f 53 54 41 54 49 43 29 3b 0a 20 20 7d   P3_STATIC);.  }
0d50: 0a 7d 0a 23 65 6c 73 65 0a 20 20 23 64 65 66 69  .}.#else.  #defi
0d60: 6e 65 20 63 6f 64 65 54 61 62 6c 65 4c 6f 63 6b  ne codeTableLock
0d70: 73 28 78 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  s(x).#endif../*.
0d80: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
0d90: 69 73 20 63 61 6c 6c 65 64 20 61 66 74 65 72 20  is called after 
0da0: 61 20 73 69 6e 67 6c 65 20 53 51 4c 20 73 74 61  a single SQL sta
0db0: 74 65 6d 65 6e 74 20 68 61 73 20 62 65 65 6e 0a  tement has been.
0dc0: 2a 2a 20 70 61 72 73 65 64 20 61 6e 64 20 61 20  ** parsed and a 
0dd0: 56 44 42 45 20 70 72 6f 67 72 61 6d 20 74 6f 20  VDBE program to 
0de0: 65 78 65 63 75 74 65 20 74 68 61 74 20 73 74 61  execute that sta
0df0: 74 65 6d 65 6e 74 20 68 61 73 20 62 65 65 6e 0a  tement has been.
0e00: 2a 2a 20 70 72 65 70 61 72 65 64 2e 20 20 54 68  ** prepared.  Th
0e10: 69 73 20 72 6f 75 74 69 6e 65 20 70 75 74 73 20  is routine puts 
0e20: 74 68 65 20 66 69 6e 69 73 68 69 6e 67 20 74 6f  the finishing to
0e30: 75 63 68 65 73 20 6f 6e 20 74 68 65 0a 2a 2a 20  uches on the.** 
0e40: 56 44 42 45 20 70 72 6f 67 72 61 6d 20 61 6e 64  VDBE program and
0e50: 20 72 65 73 65 74 73 20 74 68 65 20 70 50 61 72   resets the pPar
0e60: 73 65 20 73 74 72 75 63 74 75 72 65 20 66 6f 72  se structure for
0e70: 20 74 68 65 20 6e 65 78 74 0a 2a 2a 20 70 61 72   the next.** par
0e80: 73 65 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74  se..**.** Note t
0e90: 68 61 74 20 69 66 20 61 6e 20 65 72 72 6f 72 20  hat if an error 
0ea0: 6f 63 63 75 72 72 65 64 2c 20 69 74 20 6d 69 67  occurred, it mig
0eb0: 68 74 20 62 65 20 74 68 65 20 63 61 73 65 20 74  ht be the case t
0ec0: 68 61 74 0a 2a 2a 20 6e 6f 20 56 44 42 45 20 63  hat.** no VDBE c
0ed0: 6f 64 65 20 77 61 73 20 67 65 6e 65 72 61 74 65  ode was generate
0ee0: 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  d..*/.void sqlit
0ef0: 65 33 46 69 6e 69 73 68 43 6f 64 69 6e 67 28 50  e3FinishCoding(P
0f00: 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20  arse *pParse){. 
0f10: 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
0f20: 56 64 62 65 20 2a 76 3b 0a 0a 20 20 69 66 28 20  Vdbe *v;..  if( 
0f30: 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 46 61 69  sqlite3MallocFai
0f40: 6c 65 64 28 29 20 29 20 72 65 74 75 72 6e 3b 0a  led() ) return;.
0f50: 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 65    if( pParse->ne
0f60: 73 74 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20  sted ) return;. 
0f70: 20 69 66 28 20 21 70 50 61 72 73 65 2d 3e 70 56   if( !pParse->pV
0f80: 64 62 65 20 29 7b 0a 20 20 20 20 69 66 28 20 70  dbe ){.    if( p
0f90: 50 61 72 73 65 2d 3e 72 63 3d 3d 53 51 4c 49 54  Parse->rc==SQLIT
0fa0: 45 5f 4f 4b 20 26 26 20 70 50 61 72 73 65 2d 3e  E_OK && pParse->
0fb0: 6e 45 72 72 20 29 7b 0a 20 20 20 20 20 20 70 50  nErr ){.      pP
0fc0: 61 72 73 65 2d 3e 72 63 20 3d 20 53 51 4c 49 54  arse->rc = SQLIT
0fd0: 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 72  E_ERROR;.      r
0fe0: 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d  eturn;.    }.  }
0ff0: 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20 62 79 20  ..  /* Begin by 
1000: 67 65 6e 65 72 61 74 69 6e 67 20 73 6f 6d 65 20  generating some 
1010: 74 65 72 6d 69 6e 61 74 69 6f 6e 20 63 6f 64 65  termination code
1020: 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74   at the end of t
1030: 68 65 0a 20 20 2a 2a 20 76 64 62 65 20 70 72 6f  he.  ** vdbe pro
1040: 67 72 61 6d 0a 20 20 2a 2f 0a 20 20 64 62 20 3d  gram.  */.  db =
1050: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 76   pParse->db;.  v
1060: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
1070: 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28  e(pParse);.  if(
1080: 20 76 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65   v ){.    sqlite
1090: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
10a0: 5f 48 61 6c 74 2c 20 30 2c 20 30 29 3b 0a 0a 20  _Halt, 0, 0);.. 
10b0: 20 20 20 2f 2a 20 54 68 65 20 63 6f 6f 6b 69 65     /* The cookie
10c0: 20 6d 61 73 6b 20 63 6f 6e 74 61 69 6e 73 20 6f   mask contains o
10d0: 6e 65 20 62 69 74 20 66 6f 72 20 65 61 63 68 20  ne bit for each 
10e0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6f 70  database file op
10f0: 65 6e 2e 0a 20 20 20 20 2a 2a 20 28 42 69 74 20  en..    ** (Bit 
1100: 30 20 69 73 20 66 6f 72 20 6d 61 69 6e 2c 20 62  0 is for main, b
1110: 69 74 20 31 20 69 73 20 66 6f 72 20 74 65 6d 70  it 1 is for temp
1120: 2c 20 61 6e 64 20 73 6f 20 66 6f 72 74 68 2e 29  , and so forth.)
1130: 20 20 42 69 74 73 20 61 72 65 0a 20 20 20 20 2a    Bits are.    *
1140: 2a 20 73 65 74 20 66 6f 72 20 65 61 63 68 20 64  * set for each d
1150: 61 74 61 62 61 73 65 20 74 68 61 74 20 69 73 20  atabase that is 
1160: 75 73 65 64 2e 20 20 47 65 6e 65 72 61 74 65 20  used.  Generate 
1170: 63 6f 64 65 20 74 6f 20 73 74 61 72 74 20 61 0a  code to start a.
1180: 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69      ** transacti
1190: 6f 6e 20 6f 6e 20 65 61 63 68 20 75 73 65 64 20  on on each used 
11a0: 64 61 74 61 62 61 73 65 20 61 6e 64 20 74 6f 20  database and to 
11b0: 76 65 72 69 66 79 20 74 68 65 20 73 63 68 65 6d  verify the schem
11c0: 61 20 63 6f 6f 6b 69 65 0a 20 20 20 20 2a 2a 20  a cookie.    ** 
11d0: 6f 6e 20 65 61 63 68 20 75 73 65 64 20 64 61 74  on each used dat
11e0: 61 62 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20  abase..    */.  
11f0: 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 63 6f    if( pParse->co
1200: 6f 6b 69 65 47 6f 74 6f 3e 30 20 29 7b 0a 20 20  okieGoto>0 ){.  
1210: 20 20 20 20 75 33 32 20 6d 61 73 6b 3b 0a 20 20      u32 mask;.  
1220: 20 20 20 20 69 6e 74 20 69 44 62 3b 0a 20 20 20      int iDb;.   
1230: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
1240: 6d 70 48 65 72 65 28 76 2c 20 70 50 61 72 73 65  mpHere(v, pParse
1250: 2d 3e 63 6f 6f 6b 69 65 47 6f 74 6f 2d 31 29 3b  ->cookieGoto-1);
1260: 0a 20 20 20 20 20 20 66 6f 72 28 69 44 62 3d 30  .      for(iDb=0
1270: 2c 20 6d 61 73 6b 3d 31 3b 20 69 44 62 3c 64 62  , mask=1; iDb<db
1280: 2d 3e 6e 44 62 3b 20 6d 61 73 6b 3c 3c 3d 31 2c  ->nDb; mask<<=1,
1290: 20 69 44 62 2b 2b 29 7b 0a 20 20 20 20 20 20 20   iDb++){.       
12a0: 20 69 66 28 20 28 6d 61 73 6b 20 26 20 70 50 61   if( (mask & pPa
12b0: 72 73 65 2d 3e 63 6f 6f 6b 69 65 4d 61 73 6b 29  rse->cookieMask)
12c0: 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ==0 ) continue;.
12d0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
12e0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 54  dbeAddOp(v, OP_T
12f0: 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69 44 62 2c  ransaction, iDb,
1300: 20 28 6d 61 73 6b 20 26 20 70 50 61 72 73 65 2d   (mask & pParse-
1310: 3e 77 72 69 74 65 4d 61 73 6b 29 21 3d 30 29 3b  >writeMask)!=0);
1320: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1330: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
1340: 56 65 72 69 66 79 43 6f 6f 6b 69 65 2c 20 69 44  VerifyCookie, iD
1350: 62 2c 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69  b, pParse->cooki
1360: 65 56 61 6c 75 65 5b 69 44 62 5d 29 3b 0a 20 20  eValue[iDb]);.  
1370: 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51      }.#ifndef SQ
1380: 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
1390: 4c 54 41 42 4c 45 0a 20 20 20 20 20 20 69 66 28  LTABLE.      if(
13a0: 20 70 50 61 72 73 65 2d 3e 70 56 69 72 74 75 61   pParse->pVirtua
13b0: 6c 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20 20  lLock ){.       
13c0: 20 63 68 61 72 20 2a 76 74 61 62 20 3d 20 28 63   char *vtab = (c
13d0: 68 61 72 20 2a 29 70 50 61 72 73 65 2d 3e 70 56  har *)pParse->pV
13e0: 69 72 74 75 61 6c 4c 6f 63 6b 2d 3e 70 56 74 61  irtualLock->pVta
13f0: 62 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  b;.        sqlit
1400: 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f  e3VdbeOp3(v, OP_
1410: 56 42 65 67 69 6e 2c 20 30 2c 20 30 2c 20 76 74  VBegin, 0, 0, vt
1420: 61 62 2c 20 50 33 5f 56 54 41 42 29 3b 0a 20 20  ab, P3_VTAB);.  
1430: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20      }.#endif..  
1440: 20 20 20 20 2f 2a 20 4f 6e 63 65 20 61 6c 6c 20      /* Once all 
1450: 74 68 65 20 63 6f 6f 6b 69 65 73 20 68 61 76 65  the cookies have
1460: 20 62 65 65 6e 20 76 65 72 69 66 69 65 64 20 61   been verified a
1470: 6e 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 20  nd transactions 
1480: 6f 70 65 6e 65 64 2c 20 0a 20 20 20 20 20 20 2a  opened, .      *
1490: 2a 20 6f 62 74 61 69 6e 20 74 68 65 20 72 65 71  * obtain the req
14a0: 75 69 72 65 64 20 74 61 62 6c 65 2d 6c 6f 63 6b  uired table-lock
14b0: 73 2e 20 54 68 69 73 20 69 73 20 61 20 6e 6f 2d  s. This is a no-
14c0: 6f 70 20 75 6e 6c 65 73 73 20 74 68 65 20 0a 20  op unless the . 
14d0: 20 20 20 20 20 2a 2a 20 73 68 61 72 65 64 2d 63       ** shared-c
14e0: 61 63 68 65 20 66 65 61 74 75 72 65 20 69 73 20  ache feature is 
14f0: 65 6e 61 62 6c 65 64 2e 0a 20 20 20 20 20 20 2a  enabled..      *
1500: 2f 0a 20 20 20 20 20 20 63 6f 64 65 54 61 62 6c  /.      codeTabl
1510: 65 4c 6f 63 6b 73 28 70 50 61 72 73 65 29 3b 0a  eLocks(pParse);.
1520: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1530: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74  eAddOp(v, OP_Got
1540: 6f 2c 20 30 2c 20 70 50 61 72 73 65 2d 3e 63 6f  o, 0, pParse->co
1550: 6f 6b 69 65 47 6f 74 6f 29 3b 0a 20 20 20 20 7d  okieGoto);.    }
1560: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
1570: 5f 4f 4d 49 54 5f 54 52 41 43 45 0a 20 20 20 20  _OMIT_TRACE.    
1580: 2f 2a 20 41 64 64 20 61 20 4e 6f 2d 6f 70 20 74  /* Add a No-op t
1590: 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  hat contains the
15a0: 20 63 6f 6d 70 6c 65 74 65 20 74 65 78 74 20 6f   complete text o
15b0: 66 20 74 68 65 20 63 6f 6d 70 69 6c 65 64 20 53  f the compiled S
15c0: 51 4c 0a 20 20 20 20 2a 2a 20 73 74 61 74 65 6d  QL.    ** statem
15d0: 65 6e 74 20 61 73 20 69 74 73 20 50 33 20 61 72  ent as its P3 ar
15e0: 67 75 6d 65 6e 74 2e 20 20 54 68 69 73 20 64 6f  gument.  This do
15f0: 65 73 20 6e 6f 74 20 63 68 61 6e 67 65 20 74 68  es not change th
1600: 65 20 66 75 6e 63 74 69 6f 6e 61 6c 69 74 79 0a  e functionality.
1610: 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 70 72      ** of the pr
1620: 6f 67 72 61 6d 2e 20 0a 20 20 20 20 2a 2a 0a 20  ogram. .    **. 
1630: 20 20 20 2a 2a 20 54 68 69 73 20 69 73 20 75 73     ** This is us
1640: 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20  ed to implement 
1650: 73 71 6c 69 74 65 33 5f 74 72 61 63 65 28 29 2e  sqlite3_trace().
1660: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69  .    */.    sqli
1670: 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50  te3VdbeOp3(v, OP
1680: 5f 4e 6f 6f 70 2c 20 30 2c 20 30 2c 20 70 50 61  _Noop, 0, 0, pPa
1690: 72 73 65 2d 3e 7a 53 71 6c 2c 20 70 50 61 72 73  rse->zSql, pPars
16a0: 65 2d 3e 7a 54 61 69 6c 2d 70 50 61 72 73 65 2d  e->zTail-pParse-
16b0: 3e 7a 53 71 6c 29 3b 0a 23 65 6e 64 69 66 20 2f  >zSql);.#endif /
16c0: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52  * SQLITE_OMIT_TR
16d0: 41 43 45 20 2a 2f 0a 20 20 7d 0a 0a 0a 20 20 2f  ACE */.  }...  /
16e0: 2a 20 47 65 74 20 74 68 65 20 56 44 42 45 20 70  * Get the VDBE p
16f0: 72 6f 67 72 61 6d 20 72 65 61 64 79 20 66 6f 72  rogram ready for
1700: 20 65 78 65 63 75 74 69 6f 6e 0a 20 20 2a 2f 0a   execution.  */.
1710: 20 20 69 66 28 20 76 20 26 26 20 70 50 61 72 73    if( v && pPars
1720: 65 2d 3e 6e 45 72 72 3d 3d 30 20 26 26 20 21 73  e->nErr==0 && !s
1730: 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 46 61 69 6c  qlite3MallocFail
1740: 65 64 28 29 20 29 7b 0a 20 20 20 20 46 49 4c 45  ed() ){.    FILE
1750: 20 2a 74 72 61 63 65 20 3d 20 28 64 62 2d 3e 66   *trace = (db->f
1760: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 56 64  lags & SQLITE_Vd
1770: 62 65 54 72 61 63 65 29 21 3d 30 20 3f 20 73 74  beTrace)!=0 ? st
1780: 64 6f 75 74 20 3a 20 30 3b 0a 20 20 20 20 73 71  dout : 0;.    sq
1790: 6c 69 74 65 33 56 64 62 65 54 72 61 63 65 28 76  lite3VdbeTrace(v
17a0: 2c 20 74 72 61 63 65 29 3b 0a 20 20 20 20 73 71  , trace);.    sq
17b0: 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 52 65 61  lite3VdbeMakeRea
17c0: 64 79 28 76 2c 20 70 50 61 72 73 65 2d 3e 6e 56  dy(v, pParse->nV
17d0: 61 72 2c 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  ar, pParse->nMem
17e0: 2b 33 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  +3,.            
17f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 50 61               pPa
1800: 72 73 65 2d 3e 6e 54 61 62 2b 33 2c 20 70 50 61  rse->nTab+3, pPa
1810: 72 73 65 2d 3e 65 78 70 6c 61 69 6e 29 3b 0a 20  rse->explain);. 
1820: 20 20 20 70 50 61 72 73 65 2d 3e 72 63 20 3d 20     pParse->rc = 
1830: 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20  SQLITE_DONE;.   
1840: 20 70 50 61 72 73 65 2d 3e 63 6f 6c 4e 61 6d 65   pParse->colName
1850: 73 53 65 74 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  sSet = 0;.  }els
1860: 65 20 69 66 28 20 70 50 61 72 73 65 2d 3e 72 63  e if( pParse->rc
1870: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1880: 20 20 20 70 50 61 72 73 65 2d 3e 72 63 20 3d 20     pParse->rc = 
1890: 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
18a0: 7d 0a 20 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  }.  pParse->nTab
18b0: 20 3d 20 30 3b 0a 20 20 70 50 61 72 73 65 2d 3e   = 0;.  pParse->
18c0: 6e 4d 65 6d 20 3d 20 30 3b 0a 20 20 70 50 61 72  nMem = 0;.  pPar
18d0: 73 65 2d 3e 6e 53 65 74 20 3d 20 30 3b 0a 20 20  se->nSet = 0;.  
18e0: 70 50 61 72 73 65 2d 3e 6e 56 61 72 20 3d 20 30  pParse->nVar = 0
18f0: 3b 0a 20 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b  ;.  pParse->cook
1900: 69 65 4d 61 73 6b 20 3d 20 30 3b 0a 20 20 70 50  ieMask = 0;.  pP
1910: 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 47 6f 74 6f  arse->cookieGoto
1920: 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52   = 0;.}../*.** R
1930: 75 6e 20 74 68 65 20 70 61 72 73 65 72 20 61 6e  un the parser an
1940: 64 20 63 6f 64 65 20 67 65 6e 65 72 61 74 6f 72  d code generator
1950: 20 72 65 63 75 72 73 69 76 65 6c 79 20 69 6e 20   recursively in 
1960: 6f 72 64 65 72 20 74 6f 20 67 65 6e 65 72 61 74  order to generat
1970: 65 0a 2a 2a 20 63 6f 64 65 20 66 6f 72 20 74 68  e.** code for th
1980: 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20  e SQL statement 
1990: 67 69 76 65 6e 20 6f 6e 74 6f 20 74 68 65 20 65  given onto the e
19a0: 6e 64 20 6f 66 20 74 68 65 20 70 50 61 72 73 65  nd of the pParse
19b0: 20 63 6f 6e 74 65 78 74 0a 2a 2a 20 63 75 72 72   context.** curr
19c0: 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73  ently under cons
19d0: 74 72 75 63 74 69 6f 6e 2e 20 20 57 68 65 6e 20  truction.  When 
19e0: 74 68 65 20 70 61 72 73 65 72 20 69 73 20 72 75  the parser is ru
19f0: 6e 20 72 65 63 75 72 73 69 76 65 6c 79 0a 2a 2a  n recursively.**
1a00: 20 74 68 69 73 20 77 61 79 2c 20 74 68 65 20 66   this way, the f
1a10: 69 6e 61 6c 20 4f 50 5f 48 61 6c 74 20 69 73 20  inal OP_Halt is 
1a20: 6e 6f 74 20 61 70 70 65 6e 64 65 64 20 61 6e 64  not appended and
1a30: 20 6f 74 68 65 72 20 69 6e 69 74 69 61 6c 69 7a   other initializ
1a40: 61 74 69 6f 6e 0a 2a 2a 20 61 6e 64 20 66 69 6e  ation.** and fin
1a50: 61 6c 69 7a 61 74 69 6f 6e 20 73 74 65 70 73 20  alization steps 
1a60: 61 72 65 20 6f 6d 69 74 74 65 64 20 62 65 63 61  are omitted beca
1a70: 75 73 65 20 74 68 6f 73 65 20 61 72 65 20 68 61  use those are ha
1a80: 6e 64 6c 69 6e 67 20 62 79 20 74 68 65 0a 2a 2a  ndling by the.**
1a90: 20 6f 75 74 65 72 6d 6f 73 74 20 70 61 72 73 65   outermost parse
1aa0: 72 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 20 65 76 65  r..**.** Not eve
1ab0: 72 79 74 68 69 6e 67 20 69 73 20 6e 65 73 74 61  rything is nesta
1ac0: 62 6c 65 2e 20 20 54 68 69 73 20 66 61 63 69 6c  ble.  This facil
1ad0: 69 74 79 20 69 73 20 64 65 73 69 67 6e 65 64 20  ity is designed 
1ae0: 74 6f 20 70 65 72 6d 69 74 0a 2a 2a 20 49 4e 53  to permit.** INS
1af0: 45 52 54 2c 20 55 50 44 41 54 45 2c 20 61 6e 64  ERT, UPDATE, and
1b00: 20 44 45 4c 45 54 45 20 6f 70 65 72 61 74 69 6f   DELETE operatio
1b10: 6e 73 20 61 67 61 69 6e 73 74 20 53 51 4c 49 54  ns against SQLIT
1b20: 45 5f 4d 41 53 54 45 52 2e 20 20 55 73 65 0a 2a  E_MASTER.  Use.*
1b30: 2a 20 63 61 72 65 20 69 66 20 79 6f 75 20 64 65  * care if you de
1b40: 63 69 64 65 20 74 6f 20 74 72 79 20 74 6f 20 75  cide to try to u
1b50: 73 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  se this routine 
1b60: 66 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 20 70  for some other p
1b70: 75 72 70 6f 73 65 73 2e 0a 2a 2f 0a 76 6f 69 64  urposes..*/.void
1b80: 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61   sqlite3NestedPa
1b90: 72 73 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  rse(Parse *pPars
1ba0: 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  e, const char *z
1bb0: 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20  Format, ...){.  
1bc0: 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 63 68  va_list ap;.  ch
1bd0: 61 72 20 2a 7a 53 71 6c 3b 0a 23 20 64 65 66 69  ar *zSql;.# defi
1be0: 6e 65 20 53 41 56 45 5f 53 5a 20 20 28 73 69 7a  ne SAVE_SZ  (siz
1bf0: 65 6f 66 28 50 61 72 73 65 29 20 2d 20 6f 66 66  eof(Parse) - off
1c00: 73 65 74 6f 66 28 50 61 72 73 65 2c 6e 56 61 72  setof(Parse,nVar
1c10: 29 29 0a 20 20 63 68 61 72 20 73 61 76 65 42 75  )).  char saveBu
1c20: 66 5b 53 41 56 45 5f 53 5a 5d 3b 0a 0a 20 20 69  f[SAVE_SZ];..  i
1c30: 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20  f( pParse->nErr 
1c40: 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65  ) return;.  asse
1c50: 72 74 28 20 70 50 61 72 73 65 2d 3e 6e 65 73 74  rt( pParse->nest
1c60: 65 64 3c 31 30 20 29 3b 20 20 2f 2a 20 4e 65 73  ed<10 );  /* Nes
1c70: 74 69 6e 67 20 73 68 6f 75 6c 64 20 6f 6e 6c 79  ting should only
1c80: 20 62 65 20 6f 66 20 6c 69 6d 69 74 65 64 20 64   be of limited d
1c90: 65 70 74 68 20 2a 2f 0a 20 20 76 61 5f 73 74 61  epth */.  va_sta
1ca0: 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61 74 29 3b  rt(ap, zFormat);
1cb0: 0a 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65  .  zSql = sqlite
1cc0: 33 56 4d 50 72 69 6e 74 66 28 7a 46 6f 72 6d 61  3VMPrintf(zForma
1cd0: 74 2c 20 61 70 29 3b 0a 20 20 76 61 5f 65 6e 64  t, ap);.  va_end
1ce0: 28 61 70 29 3b 0a 20 20 69 66 28 20 7a 53 71 6c  (ap);.  if( zSql
1cf0: 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
1d00: 6e 3b 20 20 20 2f 2a 20 41 20 6d 61 6c 6c 6f 63  n;   /* A malloc
1d10: 20 6d 75 73 74 20 68 61 76 65 20 66 61 69 6c 65   must have faile
1d20: 64 20 2a 2f 0a 20 20 7d 0a 20 20 70 50 61 72 73  d */.  }.  pPars
1d30: 65 2d 3e 6e 65 73 74 65 64 2b 2b 3b 0a 20 20 6d  e->nested++;.  m
1d40: 65 6d 63 70 79 28 73 61 76 65 42 75 66 2c 20 26  emcpy(saveBuf, &
1d50: 70 50 61 72 73 65 2d 3e 6e 56 61 72 2c 20 53 41  pParse->nVar, SA
1d60: 56 45 5f 53 5a 29 3b 0a 20 20 6d 65 6d 73 65 74  VE_SZ);.  memset
1d70: 28 26 70 50 61 72 73 65 2d 3e 6e 56 61 72 2c 20  (&pParse->nVar, 
1d80: 30 2c 20 53 41 56 45 5f 53 5a 29 3b 0a 20 20 73  0, SAVE_SZ);.  s
1d90: 71 6c 69 74 65 33 52 75 6e 50 61 72 73 65 72 28  qlite3RunParser(
1da0: 70 50 61 72 73 65 2c 20 7a 53 71 6c 2c 20 30 29  pParse, zSql, 0)
1db0: 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a  ;.  sqliteFree(z
1dc0: 53 71 6c 29 3b 0a 20 20 6d 65 6d 63 70 79 28 26  Sql);.  memcpy(&
1dd0: 70 50 61 72 73 65 2d 3e 6e 56 61 72 2c 20 73 61  pParse->nVar, sa
1de0: 76 65 42 75 66 2c 20 53 41 56 45 5f 53 5a 29 3b  veBuf, SAVE_SZ);
1df0: 0a 20 20 70 50 61 72 73 65 2d 3e 6e 65 73 74 65  .  pParse->neste
1e00: 64 2d 2d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f  d--;.}../*.** Lo
1e10: 63 61 74 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f  cate the in-memo
1e20: 72 79 20 73 74 72 75 63 74 75 72 65 20 74 68 61  ry structure tha
1e30: 74 20 64 65 73 63 72 69 62 65 73 20 61 20 70 61  t describes a pa
1e40: 72 74 69 63 75 6c 61 72 20 64 61 74 61 62 61 73  rticular databas
1e50: 65 0a 2a 2a 20 74 61 62 6c 65 20 67 69 76 65 6e  e.** table given
1e60: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 61   the name of tha
1e70: 74 20 74 61 62 6c 65 20 61 6e 64 20 28 6f 70 74  t table and (opt
1e80: 69 6f 6e 61 6c 6c 79 29 20 74 68 65 20 6e 61 6d  ionally) the nam
1e90: 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74 61  e of the.** data
1ea0: 62 61 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20  base containing 
1eb0: 74 68 65 20 74 61 62 6c 65 2e 20 20 52 65 74 75  the table.  Retu
1ec0: 72 6e 20 4e 55 4c 4c 20 69 66 20 6e 6f 74 20 66  rn NULL if not f
1ed0: 6f 75 6e 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a  ound..**.** If z
1ee0: 44 61 74 61 62 61 73 65 20 69 73 20 30 2c 20 61  Database is 0, a
1ef0: 6c 6c 20 64 61 74 61 62 61 73 65 73 20 61 72 65  ll databases are
1f00: 20 73 65 61 72 63 68 65 64 20 66 6f 72 20 74 68   searched for th
1f10: 65 20 74 61 62 6c 65 20 61 6e 64 20 74 68 65 0a  e table and the.
1f20: 2a 2a 20 66 69 72 73 74 20 6d 61 74 63 68 69 6e  ** first matchin
1f30: 67 20 74 61 62 6c 65 20 69 73 20 72 65 74 75 72  g table is retur
1f40: 6e 65 64 2e 20 20 28 4e 6f 20 63 68 65 63 6b 69  ned.  (No checki
1f50: 6e 67 20 66 6f 72 20 64 75 70 6c 69 63 61 74 65  ng for duplicate
1f60: 20 74 61 62 6c 65 0a 2a 2a 20 6e 61 6d 65 73 20   table.** names 
1f70: 69 73 20 64 6f 6e 65 2e 29 20 20 54 68 65 20 73  is done.)  The s
1f80: 65 61 72 63 68 20 6f 72 64 65 72 20 69 73 20 54  earch order is T
1f90: 45 4d 50 20 66 69 72 73 74 2c 20 74 68 65 6e 20  EMP first, then 
1fa0: 4d 41 49 4e 2c 20 74 68 65 6e 20 61 6e 79 0a 2a  MAIN, then any.*
1fb0: 2a 20 61 75 78 69 6c 69 61 72 79 20 64 61 74 61  * auxiliary data
1fc0: 62 61 73 65 73 20 61 64 64 65 64 20 75 73 69 6e  bases added usin
1fd0: 67 20 74 68 65 20 41 54 54 41 43 48 20 63 6f 6d  g the ATTACH com
1fe0: 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20  mand..**.** See 
1ff0: 61 6c 73 6f 20 73 71 6c 69 74 65 33 4c 6f 63 61  also sqlite3Loca
2000: 74 65 54 61 62 6c 65 28 29 2e 0a 2a 2f 0a 54 61  teTable()..*/.Ta
2010: 62 6c 65 20 2a 73 71 6c 69 74 65 33 46 69 6e 64  ble *sqlite3Find
2020: 54 61 62 6c 65 28 73 71 6c 69 74 65 33 20 2a 64  Table(sqlite3 *d
2030: 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  b, const char *z
2040: 4e 61 6d 65 2c 20 63 6f 6e 73 74 20 63 68 61 72  Name, const char
2050: 20 2a 7a 44 61 74 61 62 61 73 65 29 7b 0a 20 20   *zDatabase){.  
2060: 54 61 62 6c 65 20 2a 70 20 3d 20 30 3b 0a 20 20  Table *p = 0;.  
2070: 69 6e 74 20 69 3b 0a 20 20 61 73 73 65 72 74 28  int i;.  assert(
2080: 20 7a 4e 61 6d 65 21 3d 30 20 29 3b 0a 20 20 66   zName!=0 );.  f
2090: 6f 72 28 69 3d 4f 4d 49 54 5f 54 45 4d 50 44 42  or(i=OMIT_TEMPDB
20a0: 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b  ; i<db->nDb; i++
20b0: 29 7b 0a 20 20 20 20 69 6e 74 20 6a 20 3d 20 28  ){.    int j = (
20c0: 69 3c 32 29 20 3f 20 69 5e 31 20 3a 20 69 3b 20  i<2) ? i^1 : i; 
20d0: 20 20 2f 2a 20 53 65 61 72 63 68 20 54 45 4d 50    /* Search TEMP
20e0: 20 62 65 66 6f 72 65 20 4d 41 49 4e 20 2a 2f 0a   before MAIN */.
20f0: 20 20 20 20 69 66 28 20 7a 44 61 74 61 62 61 73      if( zDatabas
2100: 65 21 3d 30 20 26 26 20 73 71 6c 69 74 65 33 53  e!=0 && sqlite3S
2110: 74 72 49 43 6d 70 28 7a 44 61 74 61 62 61 73 65  trICmp(zDatabase
2120: 2c 20 64 62 2d 3e 61 44 62 5b 6a 5d 2e 7a 4e 61  , db->aDb[j].zNa
2130: 6d 65 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  me) ) continue;.
2140: 20 20 20 20 70 20 3d 20 73 71 6c 69 74 65 33 48      p = sqlite3H
2150: 61 73 68 46 69 6e 64 28 26 64 62 2d 3e 61 44 62  ashFind(&db->aDb
2160: 5b 6a 5d 2e 70 53 63 68 65 6d 61 2d 3e 74 62 6c  [j].pSchema->tbl
2170: 48 61 73 68 2c 20 7a 4e 61 6d 65 2c 20 73 74 72  Hash, zName, str
2180: 6c 65 6e 28 7a 4e 61 6d 65 29 2b 31 29 3b 0a 20  len(zName)+1);. 
2190: 20 20 20 69 66 28 20 70 20 29 20 62 72 65 61 6b     if( p ) break
21a0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
21b0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61 74  ;.}../*.** Locat
21c0: 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20  e the in-memory 
21d0: 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20 64  structure that d
21e0: 65 73 63 72 69 62 65 73 20 61 20 70 61 72 74 69  escribes a parti
21f0: 63 75 6c 61 72 20 64 61 74 61 62 61 73 65 0a 2a  cular database.*
2200: 2a 20 74 61 62 6c 65 20 67 69 76 65 6e 20 74 68  * table given th
2210: 65 20 6e 61 6d 65 20 6f 66 20 74 68 61 74 20 74  e name of that t
2220: 61 62 6c 65 20 61 6e 64 20 28 6f 70 74 69 6f 6e  able and (option
2230: 61 6c 6c 79 29 20 74 68 65 20 6e 61 6d 65 20 6f  ally) the name o
2240: 66 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73  f the.** databas
2250: 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  e containing the
2260: 20 74 61 62 6c 65 2e 20 20 52 65 74 75 72 6e 20   table.  Return 
2270: 4e 55 4c 4c 20 69 66 20 6e 6f 74 20 66 6f 75 6e  NULL if not foun
2280: 64 2e 20 20 41 6c 73 6f 20 6c 65 61 76 65 20 61  d.  Also leave a
2290: 6e 0a 2a 2a 20 65 72 72 6f 72 20 6d 65 73 73 61  n.** error messa
22a0: 67 65 20 69 6e 20 70 50 61 72 73 65 2d 3e 7a 45  ge in pParse->zE
22b0: 72 72 4d 73 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  rrMsg..**.** The
22c0: 20 64 69 66 66 65 72 65 6e 63 65 20 62 65 74 77   difference betw
22d0: 65 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  een this routine
22e0: 20 61 6e 64 20 73 71 6c 69 74 65 33 46 69 6e 64   and sqlite3Find
22f0: 54 61 62 6c 65 28 29 20 69 73 20 74 68 61 74 20  Table() is that 
2300: 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20  this.** routine 
2310: 6c 65 61 76 65 73 20 61 6e 20 65 72 72 6f 72 20  leaves an error 
2320: 6d 65 73 73 61 67 65 20 69 6e 20 70 50 61 72 73  message in pPars
2330: 65 2d 3e 7a 45 72 72 4d 73 67 20 77 68 65 72 65  e->zErrMsg where
2340: 0a 2a 2a 20 73 71 6c 69 74 65 33 46 69 6e 64 54  .** sqlite3FindT
2350: 61 62 6c 65 28 29 20 64 6f 65 73 20 6e 6f 74 2e  able() does not.
2360: 0a 2a 2f 0a 54 61 62 6c 65 20 2a 73 71 6c 69 74  .*/.Table *sqlit
2370: 65 33 4c 6f 63 61 74 65 54 61 62 6c 65 28 50 61  e3LocateTable(Pa
2380: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 63 6f 6e  rse *pParse, con
2390: 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20  st char *zName, 
23a0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 61  const char *zDba
23b0: 73 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b  se){.  Table *p;
23c0: 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20  ..  /* Read the 
23d0: 64 61 74 61 62 61 73 65 20 73 63 68 65 6d 61 2e  database schema.
23e0: 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
23f0: 75 72 73 2c 20 6c 65 61 76 65 20 61 6e 20 65 72  urs, leave an er
2400: 72 6f 72 20 6d 65 73 73 61 67 65 0a 20 20 2a 2a  ror message.  **
2410: 20 61 6e 64 20 63 6f 64 65 20 69 6e 20 70 50 61   and code in pPa
2420: 72 73 65 20 61 6e 64 20 72 65 74 75 72 6e 20 4e  rse and return N
2430: 55 4c 4c 2e 20 2a 2f 0a 20 20 69 66 28 20 53 51  ULL. */.  if( SQ
2440: 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33  LITE_OK!=sqlite3
2450: 52 65 61 64 53 63 68 65 6d 61 28 70 50 61 72 73  ReadSchema(pPars
2460: 65 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  e) ){.    return
2470: 20 30 3b 0a 20 20 7d 0a 0a 20 20 70 20 3d 20 73   0;.  }..  p = s
2480: 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28  qlite3FindTable(
2490: 70 50 61 72 73 65 2d 3e 64 62 2c 20 7a 4e 61 6d  pParse->db, zNam
24a0: 65 2c 20 7a 44 62 61 73 65 29 3b 0a 20 20 69 66  e, zDbase);.  if
24b0: 28 20 70 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66  ( p==0 ){.    if
24c0: 28 20 7a 44 62 61 73 65 20 29 7b 0a 20 20 20 20  ( zDbase ){.    
24d0: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
24e0: 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 73 75  g(pParse, "no su
24f0: 63 68 20 74 61 62 6c 65 3a 20 25 73 2e 25 73 22  ch table: %s.%s"
2500: 2c 20 7a 44 62 61 73 65 2c 20 7a 4e 61 6d 65 29  , zDbase, zName)
2510: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
2520: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
2530: 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 73  sg(pParse, "no s
2540: 75 63 68 20 74 61 62 6c 65 3a 20 25 73 22 2c 20  uch table: %s", 
2550: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20  zName);.    }.  
2560: 20 20 70 50 61 72 73 65 2d 3e 63 68 65 63 6b 53    pParse->checkS
2570: 63 68 65 6d 61 20 3d 20 31 3b 0a 20 20 7d 0a 20  chema = 1;.  }. 
2580: 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a   return p;.}../*
2590: 0a 2a 2a 20 4c 6f 63 61 74 65 20 74 68 65 20 69  .** Locate the i
25a0: 6e 2d 6d 65 6d 6f 72 79 20 73 74 72 75 63 74 75  n-memory structu
25b0: 72 65 20 74 68 61 74 20 64 65 73 63 72 69 62 65  re that describe
25c0: 73 20 0a 2a 2a 20 61 20 70 61 72 74 69 63 75 6c  s .** a particul
25d0: 61 72 20 69 6e 64 65 78 20 67 69 76 65 6e 20 74  ar index given t
25e0: 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 61 74 20  he name of that 
25f0: 69 6e 64 65 78 0a 2a 2a 20 61 6e 64 20 74 68 65  index.** and the
2600: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74   name of the dat
2610: 61 62 61 73 65 20 74 68 61 74 20 63 6f 6e 74 61  abase that conta
2620: 69 6e 73 20 74 68 65 20 69 6e 64 65 78 2e 0a 2a  ins the index..*
2630: 2a 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66  * Return NULL if
2640: 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2a 0a 2a   not found..**.*
2650: 2a 20 49 66 20 7a 44 61 74 61 62 61 73 65 20 69  * If zDatabase i
2660: 73 20 30 2c 20 61 6c 6c 20 64 61 74 61 62 61 73  s 0, all databas
2670: 65 73 20 61 72 65 20 73 65 61 72 63 68 65 64 20  es are searched 
2680: 66 6f 72 20 74 68 65 0a 2a 2a 20 74 61 62 6c 65  for the.** table
2690: 20 61 6e 64 20 74 68 65 20 66 69 72 73 74 20 6d   and the first m
26a0: 61 74 63 68 69 6e 67 20 69 6e 64 65 78 20 69 73  atching index is
26b0: 20 72 65 74 75 72 6e 65 64 2e 20 20 28 4e 6f 20   returned.  (No 
26c0: 63 68 65 63 6b 69 6e 67 0a 2a 2a 20 66 6f 72 20  checking.** for 
26d0: 64 75 70 6c 69 63 61 74 65 20 69 6e 64 65 78 20  duplicate index 
26e0: 6e 61 6d 65 73 20 69 73 20 64 6f 6e 65 2e 29 20  names is done.) 
26f0: 20 54 68 65 20 73 65 61 72 63 68 20 6f 72 64 65   The search orde
2700: 72 20 69 73 0a 2a 2a 20 54 45 4d 50 20 66 69 72  r is.** TEMP fir
2710: 73 74 2c 20 74 68 65 6e 20 4d 41 49 4e 2c 20 74  st, then MAIN, t
2720: 68 65 6e 20 61 6e 79 20 61 75 78 69 6c 69 61 72  hen any auxiliar
2730: 79 20 64 61 74 61 62 61 73 65 73 20 61 64 64 65  y databases adde
2740: 64 0a 2a 2a 20 75 73 69 6e 67 20 74 68 65 20 41  d.** using the A
2750: 54 54 41 43 48 20 63 6f 6d 6d 61 6e 64 2e 0a 2a  TTACH command..*
2760: 2f 0a 49 6e 64 65 78 20 2a 73 71 6c 69 74 65 33  /.Index *sqlite3
2770: 46 69 6e 64 49 6e 64 65 78 28 73 71 6c 69 74 65  FindIndex(sqlite
2780: 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68 61  3 *db, const cha
2790: 72 20 2a 7a 4e 61 6d 65 2c 20 63 6f 6e 73 74 20  r *zName, const 
27a0: 63 68 61 72 20 2a 7a 44 62 29 7b 0a 20 20 49 6e  char *zDb){.  In
27b0: 64 65 78 20 2a 70 20 3d 20 30 3b 0a 20 20 69 6e  dex *p = 0;.  in
27c0: 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 4f 4d 49  t i;.  for(i=OMI
27d0: 54 5f 54 45 4d 50 44 42 3b 20 69 3c 64 62 2d 3e  T_TEMPDB; i<db->
27e0: 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  nDb; i++){.    i
27f0: 6e 74 20 6a 20 3d 20 28 69 3c 32 29 20 3f 20 69  nt j = (i<2) ? i
2800: 5e 31 20 3a 20 69 3b 20 20 2f 2a 20 53 65 61 72  ^1 : i;  /* Sear
2810: 63 68 20 54 45 4d 50 20 62 65 66 6f 72 65 20 4d  ch TEMP before M
2820: 41 49 4e 20 2a 2f 0a 20 20 20 20 53 63 68 65 6d  AIN */.    Schem
2830: 61 20 2a 70 53 63 68 65 6d 61 20 3d 20 64 62 2d  a *pSchema = db-
2840: 3e 61 44 62 5b 6a 5d 2e 70 53 63 68 65 6d 61 3b  >aDb[j].pSchema;
2850: 0a 20 20 20 20 69 66 28 20 7a 44 62 20 26 26 20  .    if( zDb && 
2860: 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a  sqlite3StrICmp(z
2870: 44 62 2c 20 64 62 2d 3e 61 44 62 5b 6a 5d 2e 7a  Db, db->aDb[j].z
2880: 4e 61 6d 65 29 20 29 20 63 6f 6e 74 69 6e 75 65  Name) ) continue
2890: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 53  ;.    assert( pS
28a0: 63 68 65 6d 61 20 7c 7c 20 28 6a 3d 3d 31 20 26  chema || (j==1 &
28b0: 26 20 21 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 42  & !db->aDb[1].pB
28c0: 74 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 53  t) );.    if( pS
28d0: 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 20 20 70  chema ){.      p
28e0: 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68 46 69   = sqlite3HashFi
28f0: 6e 64 28 26 70 53 63 68 65 6d 61 2d 3e 69 64 78  nd(&pSchema->idx
2900: 48 61 73 68 2c 20 7a 4e 61 6d 65 2c 20 73 74 72  Hash, zName, str
2910: 6c 65 6e 28 7a 4e 61 6d 65 29 2b 31 29 3b 0a 20  len(zName)+1);. 
2920: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 20 29     }.    if( p )
2930: 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65   break;.  }.  re
2940: 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn p;.}../*.**
2950: 20 52 65 63 6c 61 69 6d 20 74 68 65 20 6d 65 6d   Reclaim the mem
2960: 6f 72 79 20 75 73 65 64 20 62 79 20 61 6e 20 69  ory used by an i
2970: 6e 64 65 78 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ndex.*/.static v
2980: 6f 69 64 20 66 72 65 65 49 6e 64 65 78 28 49 6e  oid freeIndex(In
2990: 64 65 78 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74  dex *p){.  sqlit
29a0: 65 46 72 65 65 28 70 2d 3e 7a 43 6f 6c 41 66 66  eFree(p->zColAff
29b0: 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28  );.  sqliteFree(
29c0: 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d  p);.}../*.** Rem
29d0: 6f 76 65 20 74 68 65 20 67 69 76 65 6e 20 69 6e  ove the given in
29e0: 64 65 78 20 66 72 6f 6d 20 74 68 65 20 69 6e 64  dex from the ind
29f0: 65 78 20 68 61 73 68 20 74 61 62 6c 65 2c 20 61  ex hash table, a
2a00: 6e 64 20 66 72 65 65 0a 2a 2a 20 69 74 73 20 6d  nd free.** its m
2a10: 65 6d 6f 72 79 20 73 74 72 75 63 74 75 72 65 73  emory structures
2a20: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6e 64 65  ..**.** The inde
2a30: 78 20 69 73 20 72 65 6d 6f 76 65 64 20 66 72 6f  x is removed fro
2a40: 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68  m the database h
2a50: 61 73 68 20 74 61 62 6c 65 73 20 62 75 74 0a 2a  ash tables but.*
2a60: 2a 20 69 74 20 69 73 20 6e 6f 74 20 75 6e 6c 69  * it is not unli
2a70: 6e 6b 65 64 20 66 72 6f 6d 20 74 68 65 20 54 61  nked from the Ta
2a80: 62 6c 65 20 74 68 61 74 20 69 74 20 69 6e 64 65  ble that it inde
2a90: 78 65 73 2e 0a 2a 2a 20 55 6e 6c 69 6e 6b 69 6e  xes..** Unlinkin
2aa0: 67 20 66 72 6f 6d 20 74 68 65 20 54 61 62 6c 65  g from the Table
2ab0: 20 6d 75 73 74 20 62 65 20 64 6f 6e 65 20 62 79   must be done by
2ac0: 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e   the calling fun
2ad0: 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ction..*/.static
2ae0: 20 76 6f 69 64 20 73 71 6c 69 74 65 44 65 6c 65   void sqliteDele
2af0: 74 65 49 6e 64 65 78 28 49 6e 64 65 78 20 2a 70  teIndex(Index *p
2b00: 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 4f 6c 64  ){.  Index *pOld
2b10: 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
2b20: 7a 4e 61 6d 65 20 3d 20 70 2d 3e 7a 4e 61 6d 65  zName = p->zName
2b30: 3b 0a 0a 20 20 70 4f 6c 64 20 3d 20 73 71 6c 69  ;..  pOld = sqli
2b40: 74 65 33 48 61 73 68 49 6e 73 65 72 74 28 26 70  te3HashInsert(&p
2b50: 2d 3e 70 53 63 68 65 6d 61 2d 3e 69 64 78 48 61  ->pSchema->idxHa
2b60: 73 68 2c 20 7a 4e 61 6d 65 2c 20 73 74 72 6c 65  sh, zName, strle
2b70: 6e 28 20 7a 4e 61 6d 65 29 2b 31 2c 20 30 29 3b  n( zName)+1, 0);
2b80: 0a 20 20 61 73 73 65 72 74 28 20 70 4f 6c 64 3d  .  assert( pOld=
2b90: 3d 30 20 7c 7c 20 70 4f 6c 64 3d 3d 70 20 29 3b  =0 || pOld==p );
2ba0: 0a 20 20 66 72 65 65 49 6e 64 65 78 28 70 29 3b  .  freeIndex(p);
2bb0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 20 74 68  .}../*.** For th
2bc0: 65 20 69 6e 64 65 78 20 63 61 6c 6c 65 64 20 7a  e index called z
2bd0: 49 64 78 4e 61 6d 65 20 77 68 69 63 68 20 69 73  IdxName which is
2be0: 20 66 6f 75 6e 64 20 69 6e 20 74 68 65 20 64 61   found in the da
2bf0: 74 61 62 61 73 65 20 69 44 62 2c 0a 2a 2a 20 75  tabase iDb,.** u
2c00: 6e 6c 69 6b 65 20 74 68 61 74 20 69 6e 64 65 78  nlike that index
2c10: 20 66 72 6f 6d 20 69 74 73 20 54 61 62 6c 65 20   from its Table 
2c20: 74 68 65 6e 20 72 65 6d 6f 76 65 20 74 68 65 20  then remove the 
2c30: 69 6e 64 65 78 20 66 72 6f 6d 0a 2a 2a 20 74 68  index from.** th
2c40: 65 20 69 6e 64 65 78 20 68 61 73 68 20 74 61 62  e index hash tab
2c50: 6c 65 20 61 6e 64 20 66 72 65 65 20 61 6c 6c 20  le and free all 
2c60: 6d 65 6d 6f 72 79 20 73 74 72 75 63 74 75 72 65  memory structure
2c70: 73 20 61 73 73 6f 63 69 61 74 65 64 0a 2a 2a 20  s associated.** 
2c80: 77 69 74 68 20 74 68 65 20 69 6e 64 65 78 2e 0a  with the index..
2c90: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 55  */.void sqlite3U
2ca0: 6e 6c 69 6e 6b 41 6e 64 44 65 6c 65 74 65 49 6e  nlinkAndDeleteIn
2cb0: 64 65 78 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  dex(sqlite3 *db,
2cc0: 20 69 6e 74 20 69 44 62 2c 20 63 6f 6e 73 74 20   int iDb, const 
2cd0: 63 68 61 72 20 2a 7a 49 64 78 4e 61 6d 65 29 7b  char *zIdxName){
2ce0: 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78  .  Index *pIndex
2cf0: 3b 0a 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 48  ;.  int len;.  H
2d00: 61 73 68 20 2a 70 48 61 73 68 20 3d 20 26 64 62  ash *pHash = &db
2d10: 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53 63 68 65  ->aDb[iDb].pSche
2d20: 6d 61 2d 3e 69 64 78 48 61 73 68 3b 0a 0a 20 20  ma->idxHash;..  
2d30: 6c 65 6e 20 3d 20 73 74 72 6c 65 6e 28 7a 49 64  len = strlen(zId
2d40: 78 4e 61 6d 65 29 3b 0a 20 20 70 49 6e 64 65 78  xName);.  pIndex
2d50: 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e   = sqlite3HashIn
2d60: 73 65 72 74 28 70 48 61 73 68 2c 20 7a 49 64 78  sert(pHash, zIdx
2d70: 4e 61 6d 65 2c 20 6c 65 6e 2b 31 2c 20 30 29 3b  Name, len+1, 0);
2d80: 0a 20 20 69 66 28 20 70 49 6e 64 65 78 20 29 7b  .  if( pIndex ){
2d90: 0a 20 20 20 20 69 66 28 20 70 49 6e 64 65 78 2d  .    if( pIndex-
2da0: 3e 70 54 61 62 6c 65 2d 3e 70 49 6e 64 65 78 3d  >pTable->pIndex=
2db0: 3d 70 49 6e 64 65 78 20 29 7b 0a 20 20 20 20 20  =pIndex ){.     
2dc0: 20 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 2d   pIndex->pTable-
2dd0: 3e 70 49 6e 64 65 78 20 3d 20 70 49 6e 64 65 78  >pIndex = pIndex
2de0: 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 65 6c  ->pNext;.    }el
2df0: 73 65 7b 0a 20 20 20 20 20 20 49 6e 64 65 78 20  se{.      Index 
2e00: 2a 70 3b 0a 20 20 20 20 20 20 66 6f 72 28 70 3d  *p;.      for(p=
2e10: 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 2d 3e  pIndex->pTable->
2e20: 70 49 6e 64 65 78 3b 20 70 20 26 26 20 70 2d 3e  pIndex; p && p->
2e30: 70 4e 65 78 74 21 3d 70 49 6e 64 65 78 3b 20 70  pNext!=pIndex; p
2e40: 3d 70 2d 3e 70 4e 65 78 74 29 7b 7d 0a 20 20 20  =p->pNext){}.   
2e50: 20 20 20 69 66 28 20 70 20 26 26 20 70 2d 3e 70     if( p && p->p
2e60: 4e 65 78 74 3d 3d 70 49 6e 64 65 78 20 29 7b 0a  Next==pIndex ){.
2e70: 20 20 20 20 20 20 20 20 70 2d 3e 70 4e 65 78 74          p->pNext
2e80: 20 3d 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74   = pIndex->pNext
2e90: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
2ea0: 20 20 20 20 66 72 65 65 49 6e 64 65 78 28 70 49      freeIndex(pI
2eb0: 6e 64 65 78 29 3b 0a 20 20 7d 0a 20 20 64 62 2d  ndex);.  }.  db-
2ec0: 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45  >flags |= SQLITE
2ed0: 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a  _InternChanges;.
2ee0: 7d 0a 0a 2f 2a 0a 2a 2a 20 45 72 61 73 65 20 61  }../*.** Erase a
2ef0: 6c 6c 20 73 63 68 65 6d 61 20 69 6e 66 6f 72 6d  ll schema inform
2f00: 61 74 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20 69  ation from the i
2f10: 6e 2d 6d 65 6d 6f 72 79 20 68 61 73 68 20 74 61  n-memory hash ta
2f20: 62 6c 65 73 20 6f 66 0a 2a 2a 20 61 20 73 69 6e  bles of.** a sin
2f30: 67 6c 65 20 64 61 74 61 62 61 73 65 2e 20 20 54  gle database.  T
2f40: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
2f50: 61 6c 6c 65 64 20 74 6f 20 72 65 63 6c 61 69 6d  alled to reclaim
2f60: 20 6d 65 6d 6f 72 79 0a 2a 2a 20 62 65 66 6f 72   memory.** befor
2f70: 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63  e the database c
2f80: 6c 6f 73 65 73 2e 20 20 49 74 20 69 73 20 61 6c  loses.  It is al
2f90: 73 6f 20 63 61 6c 6c 65 64 20 64 75 72 69 6e 67  so called during
2fa0: 20 61 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 69   a rollback.** i
2fb0: 66 20 74 68 65 72 65 20 77 65 72 65 20 73 63 68  f there were sch
2fc0: 65 6d 61 20 63 68 61 6e 67 65 73 20 64 75 72 69  ema changes duri
2fd0: 6e 67 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  ng the transacti
2fe0: 6f 6e 20 6f 72 20 69 66 20 61 0a 2a 2a 20 73 63  on or if a.** sc
2ff0: 68 65 6d 61 2d 63 6f 6f 6b 69 65 20 6d 69 73 6d  hema-cookie mism
3000: 61 74 63 68 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a  atch occurs..**.
3010: 2a 2a 20 49 66 20 69 44 62 3c 3d 30 20 74 68 65  ** If iDb<=0 the
3020: 6e 20 72 65 73 65 74 20 74 68 65 20 69 6e 74 65  n reset the inte
3030: 72 6e 61 6c 20 73 63 68 65 6d 61 20 74 61 62 6c  rnal schema tabl
3040: 65 73 20 66 6f 72 20 61 6c 6c 20 64 61 74 61 62  es for all datab
3050: 61 73 65 0a 2a 2a 20 66 69 6c 65 73 2e 20 20 49  ase.** files.  I
3060: 66 20 69 44 62 3e 3d 32 20 74 68 65 6e 20 72 65  f iDb>=2 then re
3070: 73 65 74 20 74 68 65 20 69 6e 74 65 72 6e 61 6c  set the internal
3080: 20 73 63 68 65 6d 61 20 66 6f 72 20 6f 6e 6c 79   schema for only
3090: 20 74 68 65 0a 2a 2a 20 73 69 6e 67 6c 65 20 66   the.** single f
30a0: 69 6c 65 20 69 6e 64 69 63 61 74 65 64 2e 0a 2a  ile indicated..*
30b0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52 65  /.void sqlite3Re
30c0: 73 65 74 49 6e 74 65 72 6e 61 6c 53 63 68 65 6d  setInternalSchem
30d0: 61 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69  a(sqlite3 *db, i
30e0: 6e 74 20 69 44 62 29 7b 0a 20 20 69 6e 74 20 69  nt iDb){.  int i
30f0: 2c 20 6a 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  , j;..  assert( 
3100: 69 44 62 3e 3d 30 20 26 26 20 69 44 62 3c 64 62  iDb>=0 && iDb<db
3110: 2d 3e 6e 44 62 20 29 3b 0a 20 20 66 6f 72 28 69  ->nDb );.  for(i
3120: 3d 69 44 62 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b  =iDb; i<db->nDb;
3130: 20 69 2b 2b 29 7b 0a 20 20 20 20 44 62 20 2a 70   i++){.    Db *p
3140: 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 5d  Db = &db->aDb[i]
3150: 3b 0a 20 20 20 20 69 66 28 20 70 44 62 2d 3e 70  ;.    if( pDb->p
3160: 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 20 20  Schema ){.      
3170: 73 71 6c 69 74 65 33 53 63 68 65 6d 61 46 72 65  sqlite3SchemaFre
3180: 65 28 70 44 62 2d 3e 70 53 63 68 65 6d 61 29 3b  e(pDb->pSchema);
3190: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69  .    }.    if( i
31a0: 44 62 3e 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  Db>0 ) return;. 
31b0: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 69 44 62   }.  assert( iDb
31c0: 3d 3d 30 20 29 3b 0a 20 20 64 62 2d 3e 66 6c 61  ==0 );.  db->fla
31d0: 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 49 6e  gs &= ~SQLITE_In
31e0: 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a 0a 20 20  ternChanges;..  
31f0: 2f 2a 20 49 66 20 6f 6e 65 20 6f 72 20 6d 6f 72  /* If one or mor
3200: 65 20 6f 66 20 74 68 65 20 61 75 78 69 6c 69 61  e of the auxilia
3210: 72 79 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ry database file
3220: 73 20 68 61 73 20 62 65 65 6e 20 63 6c 6f 73 65  s has been close
3230: 64 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 72 65 6d  d,.  ** then rem
3240: 6f 76 65 20 74 68 65 6d 20 66 72 6f 6d 20 74 68  ove them from th
3250: 65 20 61 75 78 69 6c 69 61 72 79 20 64 61 74 61  e auxiliary data
3260: 62 61 73 65 20 6c 69 73 74 2e 20 20 57 65 20 74  base list.  We t
3270: 61 6b 65 20 74 68 65 0a 20 20 2a 2a 20 6f 70 70  ake the.  ** opp
3280: 6f 72 74 75 6e 69 74 79 20 74 6f 20 64 6f 20 74  ortunity to do t
3290: 68 69 73 20 68 65 72 65 20 73 69 6e 63 65 20 77  his here since w
32a0: 65 20 68 61 76 65 20 6a 75 73 74 20 64 65 6c 65  e have just dele
32b0: 74 65 64 20 61 6c 6c 20 6f 66 20 74 68 65 0a 20  ted all of the. 
32c0: 20 2a 2a 20 73 63 68 65 6d 61 20 68 61 73 68 20   ** schema hash 
32d0: 74 61 62 6c 65 73 20 61 6e 64 20 74 68 65 72 65  tables and there
32e0: 66 6f 72 65 20 64 6f 20 6e 6f 74 20 68 61 76 65  fore do not have
32f0: 20 74 6f 20 6d 61 6b 65 20 61 6e 79 20 63 68 61   to make any cha
3300: 6e 67 65 73 0a 20 20 2a 2a 20 74 6f 20 61 6e 79  nges.  ** to any
3310: 20 6f 66 20 74 68 6f 73 65 20 74 61 62 6c 65 73   of those tables
3320: 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30  ..  */.  for(i=0
3330: 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b  ; i<db->nDb; i++
3340: 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 44 62  ){.    struct Db
3350: 20 2a 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62   *pDb = &db->aDb
3360: 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 70 44 62  [i];.    if( pDb
3370: 2d 3e 70 42 74 3d 3d 30 20 29 7b 0a 20 20 20 20  ->pBt==0 ){.    
3380: 20 20 69 66 28 20 70 44 62 2d 3e 70 41 75 78 20    if( pDb->pAux 
3390: 26 26 20 70 44 62 2d 3e 78 46 72 65 65 41 75 78  && pDb->xFreeAux
33a0: 20 29 20 70 44 62 2d 3e 78 46 72 65 65 41 75 78   ) pDb->xFreeAux
33b0: 28 70 44 62 2d 3e 70 41 75 78 29 3b 0a 20 20 20  (pDb->pAux);.   
33c0: 20 20 20 70 44 62 2d 3e 70 41 75 78 20 3d 20 30     pDb->pAux = 0
33d0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 6f  ;.    }.  }.  fo
33e0: 72 28 69 3d 6a 3d 32 3b 20 69 3c 64 62 2d 3e 6e  r(i=j=2; i<db->n
33f0: 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74  Db; i++){.    st
3400: 72 75 63 74 20 44 62 20 2a 70 44 62 20 3d 20 26  ruct Db *pDb = &
3410: 64 62 2d 3e 61 44 62 5b 69 5d 3b 0a 20 20 20 20  db->aDb[i];.    
3420: 69 66 28 20 70 44 62 2d 3e 70 42 74 3d 3d 30 20  if( pDb->pBt==0 
3430: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 46  ){.      sqliteF
3440: 72 65 65 28 70 44 62 2d 3e 7a 4e 61 6d 65 29 3b  ree(pDb->zName);
3450: 0a 20 20 20 20 20 20 70 44 62 2d 3e 7a 4e 61 6d  .      pDb->zNam
3460: 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 63 6f 6e  e = 0;.      con
3470: 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20  tinue;.    }.   
3480: 20 69 66 28 20 6a 3c 69 20 29 7b 0a 20 20 20 20   if( j<i ){.    
3490: 20 20 64 62 2d 3e 61 44 62 5b 6a 5d 20 3d 20 64    db->aDb[j] = d
34a0: 62 2d 3e 61 44 62 5b 69 5d 3b 0a 20 20 20 20 7d  b->aDb[i];.    }
34b0: 0a 20 20 20 20 6a 2b 2b 3b 0a 20 20 7d 0a 20 20  .    j++;.  }.  
34c0: 6d 65 6d 73 65 74 28 26 64 62 2d 3e 61 44 62 5b  memset(&db->aDb[
34d0: 6a 5d 2c 20 30 2c 20 28 64 62 2d 3e 6e 44 62 2d  j], 0, (db->nDb-
34e0: 6a 29 2a 73 69 7a 65 6f 66 28 64 62 2d 3e 61 44  j)*sizeof(db->aD
34f0: 62 5b 6a 5d 29 29 3b 0a 20 20 64 62 2d 3e 6e 44  b[j]));.  db->nD
3500: 62 20 3d 20 6a 3b 0a 20 20 69 66 28 20 64 62 2d  b = j;.  if( db-
3510: 3e 6e 44 62 3c 3d 32 20 26 26 20 64 62 2d 3e 61  >nDb<=2 && db->a
3520: 44 62 21 3d 64 62 2d 3e 61 44 62 53 74 61 74 69  Db!=db->aDbStati
3530: 63 20 29 7b 0a 20 20 20 20 6d 65 6d 63 70 79 28  c ){.    memcpy(
3540: 64 62 2d 3e 61 44 62 53 74 61 74 69 63 2c 20 64  db->aDbStatic, d
3550: 62 2d 3e 61 44 62 2c 20 32 2a 73 69 7a 65 6f 66  b->aDb, 2*sizeof
3560: 28 64 62 2d 3e 61 44 62 5b 30 5d 29 29 3b 0a 20  (db->aDb[0]));. 
3570: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 64 62     sqliteFree(db
3580: 2d 3e 61 44 62 29 3b 0a 20 20 20 20 64 62 2d 3e  ->aDb);.    db->
3590: 61 44 62 20 3d 20 64 62 2d 3e 61 44 62 53 74 61  aDb = db->aDbSta
35a0: 74 69 63 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  tic;.  }.}../*.*
35b0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
35c0: 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 65 76 65  s called wheneve
35d0: 72 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63  r a rollback occ
35e0: 75 72 73 2e 20 20 49 66 20 74 68 65 72 65 20 77  urs.  If there w
35f0: 65 72 65 0a 2a 2a 20 73 63 68 65 6d 61 20 63 68  ere.** schema ch
3600: 61 6e 67 65 73 20 64 75 72 69 6e 67 20 74 68 65  anges during the
3610: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68   transaction, th
3620: 65 6e 20 77 65 20 68 61 76 65 20 74 6f 20 72 65  en we have to re
3630: 73 65 74 20 74 68 65 0a 2a 2a 20 69 6e 74 65 72  set the.** inter
3640: 6e 61 6c 20 68 61 73 68 20 74 61 62 6c 65 73 20  nal hash tables 
3650: 61 6e 64 20 72 65 6c 6f 61 64 20 74 68 65 6d 20  and reload them 
3660: 66 72 6f 6d 20 64 69 73 6b 2e 0a 2a 2f 0a 76 6f  from disk..*/.vo
3670: 69 64 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61  id sqlite3Rollba
3680: 63 6b 49 6e 74 65 72 6e 61 6c 43 68 61 6e 67 65  ckInternalChange
3690: 73 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a  s(sqlite3 *db){.
36a0: 20 20 69 66 28 20 64 62 2d 3e 66 6c 61 67 73 20    if( db->flags 
36b0: 26 20 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43  & SQLITE_InternC
36c0: 68 61 6e 67 65 73 20 29 7b 0a 20 20 20 20 73 71  hanges ){.    sq
36d0: 6c 69 74 65 33 52 65 73 65 74 49 6e 74 65 72 6e  lite3ResetIntern
36e0: 61 6c 53 63 68 65 6d 61 28 64 62 2c 20 30 29 3b  alSchema(db, 0);
36f0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  .  }.}../*.** Th
3700: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
3710: 6c 6c 65 64 20 77 68 65 6e 20 61 20 63 6f 6d 6d  lled when a comm
3720: 69 74 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 76 6f  it occurs..*/.vo
3730: 69 64 20 73 71 6c 69 74 65 33 43 6f 6d 6d 69 74  id sqlite3Commit
3740: 49 6e 74 65 72 6e 61 6c 43 68 61 6e 67 65 73 28  InternalChanges(
3750: 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20  sqlite3 *db){.  
3760: 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53 51  db->flags &= ~SQ
3770: 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67  LITE_InternChang
3780: 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65  es;.}../*.** Cle
3790: 61 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61  ar the column na
37a0: 6d 65 73 20 66 72 6f 6d 20 61 20 74 61 62 6c 65  mes from a table
37b0: 20 6f 72 20 76 69 65 77 2e 0a 2a 2f 0a 73 74 61   or view..*/.sta
37c0: 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65 52  tic void sqliteR
37d0: 65 73 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28  esetColumnNames(
37e0: 54 61 62 6c 65 20 2a 70 54 61 62 6c 65 29 7b 0a  Table *pTable){.
37f0: 20 20 69 6e 74 20 69 3b 0a 20 20 43 6f 6c 75 6d    int i;.  Colum
3800: 6e 20 2a 70 43 6f 6c 3b 0a 20 20 61 73 73 65 72  n *pCol;.  asser
3810: 74 28 20 70 54 61 62 6c 65 21 3d 30 20 29 3b 0a  t( pTable!=0 );.
3820: 20 20 69 66 28 20 28 70 43 6f 6c 20 3d 20 70 54    if( (pCol = pT
3830: 61 62 6c 65 2d 3e 61 43 6f 6c 29 21 3d 30 20 29  able->aCol)!=0 )
3840: 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  {.    for(i=0; i
3850: 3c 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3b 20 69  <pTable->nCol; i
3860: 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20  ++, pCol++){.   
3870: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 43     sqliteFree(pC
3880: 6f 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ol->zName);.    
3890: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
38a0: 65 74 65 28 70 43 6f 6c 2d 3e 70 44 66 6c 74 29  ete(pCol->pDflt)
38b0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 46 72  ;.      sqliteFr
38c0: 65 65 28 70 43 6f 6c 2d 3e 7a 54 79 70 65 29 3b  ee(pCol->zType);
38d0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 46 72 65  .      sqliteFre
38e0: 65 28 70 43 6f 6c 2d 3e 7a 43 6f 6c 6c 29 3b 0a  e(pCol->zColl);.
38f0: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
3900: 46 72 65 65 28 70 54 61 62 6c 65 2d 3e 61 43 6f  Free(pTable->aCo
3910: 6c 29 3b 0a 20 20 7d 0a 20 20 70 54 61 62 6c 65  l);.  }.  pTable
3920: 2d 3e 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 70 54  ->aCol = 0;.  pT
3930: 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a  able->nCol = 0;.
3940: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20  }../*.** Remove 
3950: 74 68 65 20 6d 65 6d 6f 72 79 20 64 61 74 61 20  the memory data 
3960: 73 74 72 75 63 74 75 72 65 73 20 61 73 73 6f 63  structures assoc
3970: 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20 67  iated with the g
3980: 69 76 65 6e 0a 2a 2a 20 54 61 62 6c 65 2e 20 20  iven.** Table.  
3990: 4e 6f 20 63 68 61 6e 67 65 73 20 61 72 65 20 6d  No changes are m
39a0: 61 64 65 20 74 6f 20 64 69 73 6b 20 62 79 20 74  ade to disk by t
39b0: 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a  his routine..**.
39c0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
39d0: 6a 75 73 74 20 64 65 6c 65 74 65 73 20 74 68 65  just deletes the
39e0: 20 64 61 74 61 20 73 74 72 75 63 74 75 72 65 2e   data structure.
39f0: 20 20 49 74 20 64 6f 65 73 20 6e 6f 74 20 75 6e    It does not un
3a00: 6c 69 6e 6b 0a 2a 2a 20 74 68 65 20 74 61 62 6c  link.** the tabl
3a10: 65 20 64 61 74 61 20 73 74 72 75 63 74 75 72 65  e data structure
3a20: 20 66 72 6f 6d 20 74 68 65 20 68 61 73 68 20 74   from the hash t
3a30: 61 62 6c 65 2e 20 20 4e 6f 72 20 64 6f 65 73 20  able.  Nor does 
3a40: 69 74 20 72 65 6d 6f 76 65 0a 2a 2a 20 66 6f 72  it remove.** for
3a50: 65 69 67 6e 20 6b 65 79 73 20 66 72 6f 6d 20 74  eign keys from t
3a60: 68 65 20 73 71 6c 69 74 65 2e 61 46 4b 65 79 20  he sqlite.aFKey 
3a70: 68 61 73 68 20 74 61 62 6c 65 2e 20 20 42 75 74  hash table.  But
3a80: 20 69 74 20 64 6f 65 73 20 64 65 73 74 72 6f 79   it does destroy
3a90: 0a 2a 2a 20 6d 65 6d 6f 72 79 20 73 74 72 75 63  .** memory struc
3aa0: 74 75 72 65 73 20 6f 66 20 74 68 65 20 69 6e 64  tures of the ind
3ab0: 69 63 65 73 20 61 6e 64 20 66 6f 72 65 69 67 6e  ices and foreign
3ac0: 20 6b 65 79 73 20 61 73 73 6f 63 69 61 74 65 64   keys associated
3ad0: 20 77 69 74 68 20 0a 2a 2a 20 74 68 65 20 74 61   with .** the ta
3ae0: 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 6e 64 69 63  ble..**.** Indic
3af0: 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  es associated wi
3b00: 74 68 20 74 68 65 20 74 61 62 6c 65 20 61 72 65  th the table are
3b10: 20 75 6e 6c 69 6e 6b 65 64 20 66 72 6f 6d 20 74   unlinked from t
3b20: 68 65 20 22 64 62 22 0a 2a 2a 20 64 61 74 61 20  he "db".** data 
3b30: 73 74 72 75 63 74 75 72 65 20 69 66 20 64 62 21  structure if db!
3b40: 3d 4e 55 4c 4c 2e 20 20 49 66 20 64 62 3d 3d 4e  =NULL.  If db==N
3b50: 55 4c 4c 2c 20 69 6e 64 69 63 65 73 20 61 74 74  ULL, indices att
3b60: 61 63 68 65 64 20 74 6f 0a 2a 2a 20 74 68 65 20  ached to.** the 
3b70: 74 61 62 6c 65 20 61 72 65 20 64 65 6c 65 74 65  table are delete
3b80: 64 2c 20 62 75 74 20 69 74 20 69 73 20 61 73 73  d, but it is ass
3b90: 75 6d 65 64 20 74 68 65 79 20 68 61 76 65 20 61  umed they have a
3ba0: 6c 72 65 61 64 79 20 62 65 65 6e 0a 2a 2a 20 75  lready been.** u
3bb0: 6e 6c 69 6e 6b 65 64 2e 0a 2a 2f 0a 76 6f 69 64  nlinked..*/.void
3bc0: 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61   sqlite3DeleteTa
3bd0: 62 6c 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  ble(sqlite3 *db,
3be0: 20 54 61 62 6c 65 20 2a 70 54 61 62 6c 65 29 7b   Table *pTable){
3bf0: 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78  .  Index *pIndex
3c00: 2c 20 2a 70 4e 65 78 74 3b 0a 20 20 46 4b 65 79  , *pNext;.  FKey
3c10: 20 2a 70 46 4b 65 79 2c 20 2a 70 4e 65 78 74 46   *pFKey, *pNextF
3c20: 4b 65 79 3b 0a 0a 20 20 64 62 20 3d 20 30 3b 0a  Key;..  db = 0;.
3c30: 0a 20 20 69 66 28 20 70 54 61 62 6c 65 3d 3d 30  .  if( pTable==0
3c40: 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a   ) return;..  /*
3c50: 20 44 6f 20 6e 6f 74 20 64 65 6c 65 74 65 20 74   Do not delete t
3c60: 68 65 20 74 61 62 6c 65 20 75 6e 74 69 6c 20 74  he table until t
3c70: 68 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75  he reference cou
3c80: 6e 74 20 72 65 61 63 68 65 73 20 7a 65 72 6f 2e  nt reaches zero.
3c90: 20 2a 2f 0a 20 20 70 54 61 62 6c 65 2d 3e 6e 52   */.  pTable->nR
3ca0: 65 66 2d 2d 3b 0a 20 20 69 66 28 20 70 54 61 62  ef--;.  if( pTab
3cb0: 6c 65 2d 3e 6e 52 65 66 3e 30 20 29 7b 0a 20 20  le->nRef>0 ){.  
3cc0: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
3cd0: 61 73 73 65 72 74 28 20 70 54 61 62 6c 65 2d 3e  assert( pTable->
3ce0: 6e 52 65 66 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a  nRef==0 );..  /*
3cf0: 20 44 65 6c 65 74 65 20 61 6c 6c 20 69 6e 64 69   Delete all indi
3d00: 63 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  ces associated w
3d10: 69 74 68 20 74 68 69 73 20 74 61 62 6c 65 0a 20  ith this table. 
3d20: 20 2a 2f 0a 20 20 66 6f 72 28 70 49 6e 64 65 78   */.  for(pIndex
3d30: 20 3d 20 70 54 61 62 6c 65 2d 3e 70 49 6e 64 65   = pTable->pInde
3d40: 78 3b 20 70 49 6e 64 65 78 3b 20 70 49 6e 64 65  x; pIndex; pInde
3d50: 78 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20 70 4e  x=pNext){.    pN
3d60: 65 78 74 20 3d 20 70 49 6e 64 65 78 2d 3e 70 4e  ext = pIndex->pN
3d70: 65 78 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ext;.    assert(
3d80: 20 70 49 6e 64 65 78 2d 3e 70 53 63 68 65 6d 61   pIndex->pSchema
3d90: 3d 3d 70 54 61 62 6c 65 2d 3e 70 53 63 68 65 6d  ==pTable->pSchem
3da0: 61 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 44  a );.    sqliteD
3db0: 65 6c 65 74 65 49 6e 64 65 78 28 70 49 6e 64 65  eleteIndex(pInde
3dc0: 78 29 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66  x);.  }..#ifndef
3dd0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52   SQLITE_OMIT_FOR
3de0: 45 49 47 4e 5f 4b 45 59 0a 20 20 2f 2a 20 44 65  EIGN_KEY.  /* De
3df0: 6c 65 74 65 20 61 6c 6c 20 66 6f 72 65 69 67 6e  lete all foreign
3e00: 20 6b 65 79 73 20 61 73 73 6f 63 69 61 74 65 64   keys associated
3e10: 20 77 69 74 68 20 74 68 69 73 20 74 61 62 6c 65   with this table
3e20: 2e 20 20 54 68 65 20 6b 65 79 73 0a 20 20 2a 2a  .  The keys.  **
3e30: 20 73 68 6f 75 6c 64 20 68 61 76 65 20 61 6c 72   should have alr
3e40: 65 61 64 79 20 62 65 65 6e 20 75 6e 6c 69 6e 6b  eady been unlink
3e50: 65 64 20 66 72 6f 6d 20 74 68 65 20 64 62 2d 3e  ed from the db->
3e60: 61 46 4b 65 79 20 68 61 73 68 20 74 61 62 6c 65  aFKey hash table
3e70: 20 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 70 46 4b   .  */.  for(pFK
3e80: 65 79 3d 70 54 61 62 6c 65 2d 3e 70 46 4b 65 79  ey=pTable->pFKey
3e90: 3b 20 70 46 4b 65 79 3b 20 70 46 4b 65 79 3d 70  ; pFKey; pFKey=p
3ea0: 4e 65 78 74 46 4b 65 79 29 7b 0a 20 20 20 20 70  NextFKey){.    p
3eb0: 4e 65 78 74 46 4b 65 79 20 3d 20 70 46 4b 65 79  NextFKey = pFKey
3ec0: 2d 3e 70 4e 65 78 74 46 72 6f 6d 3b 0a 20 20 20  ->pNextFrom;.   
3ed0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
3ee0: 48 61 73 68 46 69 6e 64 28 26 70 54 61 62 6c 65  HashFind(&pTable
3ef0: 2d 3e 70 53 63 68 65 6d 61 2d 3e 61 46 4b 65 79  ->pSchema->aFKey
3f00: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
3f10: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 46 4b               pFK
3f20: 65 79 2d 3e 7a 54 6f 2c 20 73 74 72 6c 65 6e 28  ey->zTo, strlen(
3f30: 70 46 4b 65 79 2d 3e 7a 54 6f 29 2b 31 29 21 3d  pFKey->zTo)+1)!=
3f40: 70 46 4b 65 79 20 29 3b 0a 20 20 20 20 73 71 6c  pFKey );.    sql
3f50: 69 74 65 46 72 65 65 28 70 46 4b 65 79 29 3b 0a  iteFree(pFKey);.
3f60: 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a    }.#endif..  /*
3f70: 20 44 65 6c 65 74 65 20 74 68 65 20 54 61 62 6c   Delete the Tabl
3f80: 65 20 73 74 72 75 63 74 75 72 65 20 69 74 73 65  e structure itse
3f90: 6c 66 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  lf..  */.  sqlit
3fa0: 65 52 65 73 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65  eResetColumnName
3fb0: 73 28 70 54 61 62 6c 65 29 3b 0a 20 20 73 71 6c  s(pTable);.  sql
3fc0: 69 74 65 46 72 65 65 28 70 54 61 62 6c 65 2d 3e  iteFree(pTable->
3fd0: 7a 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65  zName);.  sqlite
3fe0: 46 72 65 65 28 70 54 61 62 6c 65 2d 3e 7a 43 6f  Free(pTable->zCo
3ff0: 6c 41 66 66 29 3b 0a 20 20 73 71 6c 69 74 65 33  lAff);.  sqlite3
4000: 53 65 6c 65 63 74 44 65 6c 65 74 65 28 70 54 61  SelectDelete(pTa
4010: 62 6c 65 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 23  ble->pSelect);.#
4020: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
4030: 49 54 5f 43 48 45 43 4b 0a 20 20 73 71 6c 69 74  IT_CHECK.  sqlit
4040: 65 33 45 78 70 72 44 65 6c 65 74 65 28 70 54 61  e3ExprDelete(pTa
4050: 62 6c 65 2d 3e 70 43 68 65 63 6b 29 3b 0a 23 65  ble->pCheck);.#e
4060: 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33 56 74  ndif.  sqlite3Vt
4070: 61 62 43 6c 65 61 72 28 70 54 61 62 6c 65 29 3b  abClear(pTable);
4080: 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 54  .  sqliteFree(pT
4090: 61 62 6c 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  able);.}../*.** 
40a0: 55 6e 6c 69 6e 6b 20 74 68 65 20 67 69 76 65 6e  Unlink the given
40b0: 20 74 61 62 6c 65 20 66 72 6f 6d 20 74 68 65 20   table from the 
40c0: 68 61 73 68 20 74 61 62 6c 65 73 20 61 6e 64 20  hash tables and 
40d0: 74 68 65 20 64 65 6c 65 74 65 20 74 68 65 0a 2a  the delete the.*
40e0: 2a 20 74 61 62 6c 65 20 73 74 72 75 63 74 75 72  * table structur
40f0: 65 20 77 69 74 68 20 61 6c 6c 20 69 74 73 20 69  e with all its i
4100: 6e 64 69 63 65 73 20 61 6e 64 20 66 6f 72 65 69  ndices and forei
4110: 67 6e 20 6b 65 79 73 2e 0a 2a 2f 0a 76 6f 69 64  gn keys..*/.void
4120: 20 73 71 6c 69 74 65 33 55 6e 6c 69 6e 6b 41 6e   sqlite3UnlinkAn
4130: 64 44 65 6c 65 74 65 54 61 62 6c 65 28 73 71 6c  dDeleteTable(sql
4140: 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 69 44  ite3 *db, int iD
4150: 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  b, const char *z
4160: 54 61 62 4e 61 6d 65 29 7b 0a 20 20 54 61 62 6c  TabName){.  Tabl
4170: 65 20 2a 70 3b 0a 20 20 46 4b 65 79 20 2a 70 46  e *p;.  FKey *pF
4180: 31 2c 20 2a 70 46 32 3b 0a 20 20 44 62 20 2a 70  1, *pF2;.  Db *p
4190: 44 62 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 64  Db;..  assert( d
41a0: 62 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  b!=0 );.  assert
41b0: 28 20 69 44 62 3e 3d 30 20 26 26 20 69 44 62 3c  ( iDb>=0 && iDb<
41c0: 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 61 73 73  db->nDb );.  ass
41d0: 65 72 74 28 20 7a 54 61 62 4e 61 6d 65 20 26 26  ert( zTabName &&
41e0: 20 7a 54 61 62 4e 61 6d 65 5b 30 5d 20 29 3b 0a   zTabName[0] );.
41f0: 20 20 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62    pDb = &db->aDb
4200: 5b 69 44 62 5d 3b 0a 20 20 70 20 3d 20 73 71 6c  [iDb];.  p = sql
4210: 69 74 65 33 48 61 73 68 49 6e 73 65 72 74 28 26  ite3HashInsert(&
4220: 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 74 62  pDb->pSchema->tb
4230: 6c 48 61 73 68 2c 20 7a 54 61 62 4e 61 6d 65 2c  lHash, zTabName,
4240: 20 73 74 72 6c 65 6e 28 7a 54 61 62 4e 61 6d 65   strlen(zTabName
4250: 29 2b 31 2c 30 29 3b 0a 20 20 69 66 28 20 70 20  )+1,0);.  if( p 
4260: 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ){.#ifndef SQLIT
4270: 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b  E_OMIT_FOREIGN_K
4280: 45 59 0a 20 20 20 20 66 6f 72 28 70 46 31 3d 70  EY.    for(pF1=p
4290: 2d 3e 70 46 4b 65 79 3b 20 70 46 31 3b 20 70 46  ->pFKey; pF1; pF
42a0: 31 3d 70 46 31 2d 3e 70 4e 65 78 74 46 72 6f 6d  1=pF1->pNextFrom
42b0: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 54 6f  ){.      int nTo
42c0: 20 3d 20 73 74 72 6c 65 6e 28 70 46 31 2d 3e 7a   = strlen(pF1->z
42d0: 54 6f 29 20 2b 20 31 3b 0a 20 20 20 20 20 20 70  To) + 1;.      p
42e0: 46 32 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68  F2 = sqlite3Hash
42f0: 46 69 6e 64 28 26 70 44 62 2d 3e 70 53 63 68 65  Find(&pDb->pSche
4300: 6d 61 2d 3e 61 46 4b 65 79 2c 20 70 46 31 2d 3e  ma->aFKey, pF1->
4310: 7a 54 6f 2c 20 6e 54 6f 29 3b 0a 20 20 20 20 20  zTo, nTo);.     
4320: 20 69 66 28 20 70 46 32 3d 3d 70 46 31 20 29 7b   if( pF2==pF1 ){
4330: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
4340: 48 61 73 68 49 6e 73 65 72 74 28 26 70 44 62 2d  HashInsert(&pDb-
4350: 3e 70 53 63 68 65 6d 61 2d 3e 61 46 4b 65 79 2c  >pSchema->aFKey,
4360: 20 70 46 31 2d 3e 7a 54 6f 2c 20 6e 54 6f 2c 20   pF1->zTo, nTo, 
4370: 70 46 31 2d 3e 70 4e 65 78 74 54 6f 29 3b 0a 20  pF1->pNextTo);. 
4380: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
4390: 20 20 20 20 77 68 69 6c 65 28 20 70 46 32 20 26      while( pF2 &
43a0: 26 20 70 46 32 2d 3e 70 4e 65 78 74 54 6f 21 3d  & pF2->pNextTo!=
43b0: 70 46 31 20 29 7b 20 70 46 32 3d 70 46 32 2d 3e  pF1 ){ pF2=pF2->
43c0: 70 4e 65 78 74 54 6f 3b 20 7d 0a 20 20 20 20 20  pNextTo; }.     
43d0: 20 20 20 69 66 28 20 70 46 32 20 29 7b 0a 20 20     if( pF2 ){.  
43e0: 20 20 20 20 20 20 20 20 70 46 32 2d 3e 70 4e 65          pF2->pNe
43f0: 78 74 54 6f 20 3d 20 70 46 31 2d 3e 70 4e 65 78  xtTo = pF1->pNex
4400: 74 54 6f 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  tTo;.        }. 
4410: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e       }.    }.#en
4420: 64 69 66 0a 20 20 20 20 73 71 6c 69 74 65 33 44  dif.    sqlite3D
4430: 65 6c 65 74 65 54 61 62 6c 65 28 64 62 2c 20 70  eleteTable(db, p
4440: 29 3b 0a 20 20 7d 0a 20 20 64 62 2d 3e 66 6c 61  );.  }.  db->fla
4450: 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 49 6e 74  gs |= SQLITE_Int
4460: 65 72 6e 43 68 61 6e 67 65 73 3b 0a 7d 0a 0a 2f  ernChanges;.}../
4470: 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20 74 6f 6b  *.** Given a tok
4480: 65 6e 2c 20 72 65 74 75 72 6e 20 61 20 73 74 72  en, return a str
4490: 69 6e 67 20 74 68 61 74 20 63 6f 6e 73 69 73 74  ing that consist
44a0: 73 20 6f 66 20 74 68 65 20 74 65 78 74 20 6f 66  s of the text of
44b0: 20 74 68 61 74 0a 2a 2a 20 74 6f 6b 65 6e 20 77   that.** token w
44c0: 69 74 68 20 61 6e 79 20 71 75 6f 74 61 74 69 6f  ith any quotatio
44d0: 6e 73 20 72 65 6d 6f 76 65 64 2e 20 20 53 70 61  ns removed.  Spa
44e0: 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 72  ce to hold the r
44f0: 65 74 75 72 6e 65 64 20 73 74 72 69 6e 67 0a 2a  eturned string.*
4500: 2a 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66 72  * is obtained fr
4510: 6f 6d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28  om sqliteMalloc(
4520: 29 20 61 6e 64 20 6d 75 73 74 20 62 65 20 66 72  ) and must be fr
4530: 65 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 69  eed by the calli
4540: 6e 67 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 0a  ng.** function..
4550: 2a 2a 0a 2a 2a 20 54 6f 6b 65 6e 73 20 61 72 65  **.** Tokens are
4560: 20 6f 66 74 65 6e 20 6a 75 73 74 20 70 6f 69 6e   often just poin
4570: 74 65 72 73 20 69 6e 74 6f 20 74 68 65 20 6f 72  ters into the or
4580: 69 67 69 6e 61 6c 20 53 51 4c 20 74 65 78 74 20  iginal SQL text 
4590: 61 6e 64 20 73 6f 0a 2a 2a 20 61 72 65 20 6e 6f  and so.** are no
45a0: 74 20 5c 30 30 30 20 74 65 72 6d 69 6e 61 74 65  t \000 terminate
45b0: 64 20 61 6e 64 20 61 72 65 20 6e 6f 74 20 70 65  d and are not pe
45c0: 72 73 69 73 74 65 6e 74 2e 20 20 54 68 65 20 72  rsistent.  The r
45d0: 65 74 75 72 6e 65 64 20 73 74 72 69 6e 67 0a 2a  eturned string.*
45e0: 2a 20 69 73 20 5c 30 30 30 20 74 65 72 6d 69 6e  * is \000 termin
45f0: 61 74 65 64 20 61 6e 64 20 69 73 20 70 65 72 73  ated and is pers
4600: 69 73 74 65 6e 74 2e 0a 2a 2f 0a 63 68 61 72 20  istent..*/.char 
4610: 2a 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d  *sqlite3NameFrom
4620: 54 6f 6b 65 6e 28 54 6f 6b 65 6e 20 2a 70 4e 61  Token(Token *pNa
4630: 6d 65 29 7b 0a 20 20 63 68 61 72 20 2a 7a 4e 61  me){.  char *zNa
4640: 6d 65 3b 0a 20 20 69 66 28 20 70 4e 61 6d 65 20  me;.  if( pName 
4650: 29 7b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73  ){.    zName = s
4660: 71 6c 69 74 65 53 74 72 4e 44 75 70 28 28 63 68  qliteStrNDup((ch
4670: 61 72 2a 29 70 4e 61 6d 65 2d 3e 7a 2c 20 70 4e  ar*)pName->z, pN
4680: 61 6d 65 2d 3e 6e 29 3b 0a 20 20 20 20 73 71 6c  ame->n);.    sql
4690: 69 74 65 33 44 65 71 75 6f 74 65 28 7a 4e 61 6d  ite3Dequote(zNam
46a0: 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  e);.  }else{.   
46b0: 20 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 7d 0a   zName = 0;.  }.
46c0: 20 20 72 65 74 75 72 6e 20 7a 4e 61 6d 65 3b 0a    return zName;.
46d0: 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 74 68  }../*.** Open th
46e0: 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  e sqlite_master 
46f0: 74 61 62 6c 65 20 73 74 6f 72 65 64 20 69 6e 20  table stored in 
4700: 64 61 74 61 62 61 73 65 20 6e 75 6d 62 65 72 20  database number 
4710: 69 44 62 20 66 6f 72 0a 2a 2a 20 77 72 69 74 69  iDb for.** writi
4720: 6e 67 2e 20 54 68 65 20 74 61 62 6c 65 20 69 73  ng. The table is
4730: 20 6f 70 65 6e 65 64 20 75 73 69 6e 67 20 63 75   opened using cu
4740: 72 73 6f 72 20 30 2e 0a 2a 2f 0a 76 6f 69 64 20  rsor 0..*/.void 
4750: 73 71 6c 69 74 65 33 4f 70 65 6e 4d 61 73 74 65  sqlite3OpenMaste
4760: 72 54 61 62 6c 65 28 50 61 72 73 65 20 2a 70 2c  rTable(Parse *p,
4770: 20 69 6e 74 20 69 44 62 29 7b 0a 20 20 56 64 62   int iDb){.  Vdb
4780: 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65  e *v = sqlite3Ge
4790: 74 56 64 62 65 28 70 29 3b 0a 20 20 73 71 6c 69  tVdbe(p);.  sqli
47a0: 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28 70 2c 20  te3TableLock(p, 
47b0: 69 44 62 2c 20 4d 41 53 54 45 52 5f 52 4f 4f 54  iDb, MASTER_ROOT
47c0: 2c 20 31 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c  , 1, SCHEMA_TABL
47d0: 45 28 69 44 62 29 29 3b 0a 20 20 73 71 6c 69 74  E(iDb));.  sqlit
47e0: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
47f0: 50 5f 49 6e 74 65 67 65 72 2c 20 69 44 62 2c 20  P_Integer, iDb, 
4800: 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  0);.  sqlite3Vdb
4810: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65  eAddOp(v, OP_Ope
4820: 6e 57 72 69 74 65 2c 20 30 2c 20 4d 41 53 54 45  nWrite, 0, MASTE
4830: 52 5f 52 4f 4f 54 29 3b 0a 20 20 73 71 6c 69 74  R_ROOT);.  sqlit
4840: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
4850: 50 5f 53 65 74 4e 75 6d 43 6f 6c 75 6d 6e 73 2c  P_SetNumColumns,
4860: 20 30 2c 20 35 29 3b 20 2f 2a 20 73 71 6c 69 74   0, 5); /* sqlit
4870: 65 5f 6d 61 73 74 65 72 20 68 61 73 20 35 20 63  e_master has 5 c
4880: 6f 6c 75 6d 6e 73 20 2a 2f 0a 7d 0a 0a 2f 2a 0a  olumns */.}../*.
4890: 2a 2a 20 54 68 65 20 74 6f 6b 65 6e 20 2a 70 4e  ** The token *pN
48a0: 61 6d 65 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  ame contains the
48b0: 20 6e 61 6d 65 20 6f 66 20 61 20 64 61 74 61 62   name of a datab
48c0: 61 73 65 20 28 65 69 74 68 65 72 20 22 6d 61 69  ase (either "mai
48d0: 6e 22 20 6f 72 0a 2a 2a 20 22 74 65 6d 70 22 20  n" or.** "temp" 
48e0: 6f 72 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61  or the name of a
48f0: 6e 20 61 74 74 61 63 68 65 64 20 64 62 29 2e 20  n attached db). 
4900: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  This routine ret
4910: 75 72 6e 73 20 74 68 65 0a 2a 2a 20 69 6e 64 65  urns the.** inde
4920: 78 20 6f 66 20 74 68 65 20 6e 61 6d 65 64 20 64  x of the named d
4930: 61 74 61 62 61 73 65 20 69 6e 20 64 62 2d 3e 61  atabase in db->a
4940: 44 62 5b 5d 2c 20 6f 72 20 2d 31 20 69 66 20 74  Db[], or -1 if t
4950: 68 65 20 6e 61 6d 65 64 20 64 62 20 0a 2a 2a 20  he named db .** 
4960: 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2e 0a  does not exist..
4970: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 69  */.int sqlite3Fi
4980: 6e 64 44 62 28 73 71 6c 69 74 65 33 20 2a 64 62  ndDb(sqlite3 *db
4990: 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 29 7b  , Token *pName){
49a0: 0a 20 20 69 6e 74 20 69 20 3d 20 2d 31 3b 20 20  .  int i = -1;  
49b0: 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 6e 75    /* Database nu
49c0: 6d 62 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 3b  mber */.  int n;
49d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
49e0: 65 72 20 6f 66 20 63 68 61 72 61 63 74 65 72 73  er of characters
49f0: 20 69 6e 20 74 68 65 20 6e 61 6d 65 20 2a 2f 0a   in the name */.
4a00: 20 20 44 62 20 2a 70 44 62 3b 20 20 20 20 20 20    Db *pDb;      
4a10: 20 2f 2a 20 41 20 64 61 74 61 62 61 73 65 20 77   /* A database w
4a20: 68 6f 73 65 20 6e 61 6d 65 20 73 70 61 63 65 20  hose name space 
4a30: 69 73 20 62 65 69 6e 67 20 73 65 61 72 63 68 65  is being searche
4a40: 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4e 61  d */.  char *zNa
4a50: 6d 65 3b 20 20 20 2f 2a 20 4e 61 6d 65 20 77 65  me;   /* Name we
4a60: 20 61 72 65 20 73 65 61 72 63 68 69 6e 67 20 66   are searching f
4a70: 6f 72 20 2a 2f 0a 0a 20 20 7a 4e 61 6d 65 20 3d  or */..  zName =
4a80: 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d   sqlite3NameFrom
4a90: 54 6f 6b 65 6e 28 70 4e 61 6d 65 29 3b 0a 20 20  Token(pName);.  
4aa0: 69 66 28 20 7a 4e 61 6d 65 20 29 7b 0a 20 20 20  if( zName ){.   
4ab0: 20 6e 20 3d 20 73 74 72 6c 65 6e 28 7a 4e 61 6d   n = strlen(zNam
4ac0: 65 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 28 64  e);.    for(i=(d
4ad0: 62 2d 3e 6e 44 62 2d 31 29 2c 20 70 44 62 3d 26  b->nDb-1), pDb=&
4ae0: 64 62 2d 3e 61 44 62 5b 69 5d 3b 20 69 3e 3d 30  db->aDb[i]; i>=0
4af0: 3b 20 69 2d 2d 2c 20 70 44 62 2d 2d 29 7b 0a 20  ; i--, pDb--){. 
4b00: 20 20 20 20 20 69 66 28 20 28 21 4f 4d 49 54 5f       if( (!OMIT_
4b10: 54 45 4d 50 44 42 20 7c 7c 20 69 21 3d 31 20 29  TEMPDB || i!=1 )
4b20: 20 26 26 20 6e 3d 3d 73 74 72 6c 65 6e 28 70 44   && n==strlen(pD
4b30: 62 2d 3e 7a 4e 61 6d 65 29 20 26 26 20 0a 20 20  b->zName) && .  
4b40: 20 20 20 20 20 20 20 20 30 3d 3d 73 71 6c 69 74          0==sqlit
4b50: 65 33 53 74 72 49 43 6d 70 28 70 44 62 2d 3e 7a  e3StrICmp(pDb->z
4b60: 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29 20 29 7b 0a  Name, zName) ){.
4b70: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
4b80: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
4b90: 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4e 61 6d   sqliteFree(zNam
4ba0: 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  e);.  }.  return
4bb0: 20 69 3b 0a 7d 0a 0a 2f 2a 20 54 68 65 20 74 61   i;.}../* The ta
4bc0: 62 6c 65 20 6f 72 20 76 69 65 77 20 6f 72 20 74  ble or view or t
4bd0: 72 69 67 67 65 72 20 6e 61 6d 65 20 69 73 20 70  rigger name is p
4be0: 61 73 73 65 64 20 74 6f 20 74 68 69 73 20 72 6f  assed to this ro
4bf0: 75 74 69 6e 65 20 76 69 61 20 74 6f 6b 65 6e 73  utine via tokens
4c00: 0a 2a 2a 20 70 4e 61 6d 65 31 20 61 6e 64 20 70  .** pName1 and p
4c10: 4e 61 6d 65 32 2e 20 49 66 20 74 68 65 20 74 61  Name2. If the ta
4c20: 62 6c 65 20 6e 61 6d 65 20 77 61 73 20 66 75 6c  ble name was ful
4c30: 6c 79 20 71 75 61 6c 69 66 69 65 64 2c 20 66 6f  ly qualified, fo
4c40: 72 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a  r example:.**.**
4c50: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 78 78   CREATE TABLE xx
4c60: 78 2e 79 79 79 20 28 2e 2e 2e 29 3b 0a 2a 2a 20  x.yyy (...);.** 
4c70: 0a 2a 2a 20 54 68 65 6e 20 70 4e 61 6d 65 31 20  .** Then pName1 
4c80: 69 73 20 73 65 74 20 74 6f 20 22 78 78 78 22 20  is set to "xxx" 
4c90: 61 6e 64 20 70 4e 61 6d 65 32 20 22 79 79 79 22  and pName2 "yyy"
4ca0: 2e 20 4f 6e 20 74 68 65 20 6f 74 68 65 72 20 68  . On the other h
4cb0: 61 6e 64 20 69 66 0a 2a 2a 20 74 68 65 20 74 61  and if.** the ta
4cc0: 62 6c 65 20 6e 61 6d 65 20 69 73 20 6e 6f 74 20  ble name is not 
4cd0: 66 75 6c 6c 79 20 71 75 61 6c 69 66 69 65 64 2c  fully qualified,
4ce0: 20 69 2e 65 2e 3a 0a 2a 2a 0a 2a 2a 20 43 52 45   i.e.:.**.** CRE
4cf0: 41 54 45 20 54 41 42 4c 45 20 79 79 79 28 2e 2e  ATE TABLE yyy(..
4d00: 2e 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 70  .);.**.** Then p
4d10: 4e 61 6d 65 31 20 69 73 20 73 65 74 20 74 6f 20  Name1 is set to 
4d20: 22 79 79 79 22 20 61 6e 64 20 70 4e 61 6d 65 32  "yyy" and pName2
4d30: 20 69 73 20 22 22 2e 0a 2a 2a 0a 2a 2a 20 54 68   is ""..**.** Th
4d40: 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20  is routine sets 
4d50: 74 68 65 20 2a 70 70 55 6e 71 75 61 6c 20 70 6f  the *ppUnqual po
4d60: 69 6e 74 65 72 20 74 6f 20 70 6f 69 6e 74 20 61  inter to point a
4d70: 74 20 74 68 65 20 74 6f 6b 65 6e 20 28 70 4e 61  t the token (pNa
4d80: 6d 65 31 20 6f 72 0a 2a 2a 20 70 4e 61 6d 65 32  me1 or.** pName2
4d90: 29 20 74 68 61 74 20 73 74 6f 72 65 73 20 74 68  ) that stores th
4da0: 65 20 75 6e 71 75 61 6c 69 66 69 65 64 20 74 61  e unqualified ta
4db0: 62 6c 65 20 6e 61 6d 65 2e 20 20 54 68 65 20 69  ble name.  The i
4dc0: 6e 64 65 78 20 6f 66 20 74 68 65 0a 2a 2a 20 64  ndex of the.** d
4dd0: 61 74 61 62 61 73 65 20 22 78 78 78 22 20 69 73  atabase "xxx" is
4de0: 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e   returned..*/.in
4df0: 74 20 73 71 6c 69 74 65 33 54 77 6f 50 61 72 74  t sqlite3TwoPart
4e00: 4e 61 6d 65 28 0a 20 20 50 61 72 73 65 20 2a 70  Name(.  Parse *p
4e10: 50 61 72 73 65 2c 20 20 20 20 20 20 2f 2a 20 50  Parse,      /* P
4e20: 61 72 73 69 6e 67 20 61 6e 64 20 63 6f 64 65 20  arsing and code 
4e30: 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65  generating conte
4e40: 78 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  xt */.  Token *p
4e50: 4e 61 6d 65 31 2c 20 20 20 20 20 20 2f 2a 20 54  Name1,      /* T
4e60: 68 65 20 22 78 78 78 22 20 69 6e 20 74 68 65 20  he "xxx" in the 
4e70: 6e 61 6d 65 20 22 78 78 78 2e 79 79 79 22 20 6f  name "xxx.yyy" o
4e80: 72 20 22 78 78 78 22 20 2a 2f 0a 20 20 54 6f 6b  r "xxx" */.  Tok
4e90: 65 6e 20 2a 70 4e 61 6d 65 32 2c 20 20 20 20 20  en *pName2,     
4ea0: 20 2f 2a 20 54 68 65 20 22 79 79 79 22 20 69 6e   /* The "yyy" in
4eb0: 20 74 68 65 20 6e 61 6d 65 20 22 78 78 78 2e 79   the name "xxx.y
4ec0: 79 79 22 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  yy" */.  Token *
4ed0: 2a 70 55 6e 71 75 61 6c 20 20 20 20 20 2f 2a 20  *pUnqual     /* 
4ee0: 57 72 69 74 65 20 74 68 65 20 75 6e 71 75 61 6c  Write the unqual
4ef0: 69 66 69 65 64 20 6f 62 6a 65 63 74 20 6e 61 6d  ified object nam
4f00: 65 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69  e here */.){.  i
4f10: 6e 74 20 69 44 62 3b 20 20 20 20 20 20 20 20 20  nt iDb;         
4f20: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61             /* Da
4f30: 74 61 62 61 73 65 20 68 6f 6c 64 69 6e 67 20 74  tabase holding t
4f40: 68 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 73  he object */.  s
4f50: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
4f60: 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 69 66 28 20  rse->db;..  if( 
4f70: 70 4e 61 6d 65 32 20 26 26 20 70 4e 61 6d 65 32  pName2 && pName2
4f80: 2d 3e 6e 3e 30 20 29 7b 0a 20 20 20 20 61 73 73  ->n>0 ){.    ass
4f90: 65 72 74 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62  ert( !db->init.b
4fa0: 75 73 79 20 29 3b 0a 20 20 20 20 2a 70 55 6e 71  usy );.    *pUnq
4fb0: 75 61 6c 20 3d 20 70 4e 61 6d 65 32 3b 0a 20 20  ual = pName2;.  
4fc0: 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 46    iDb = sqlite3F
4fd0: 69 6e 64 44 62 28 64 62 2c 20 70 4e 61 6d 65 31  indDb(db, pName1
4fe0: 29 3b 0a 20 20 20 20 69 66 28 20 69 44 62 3c 30  );.    if( iDb<0
4ff0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
5000: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
5010: 2c 20 22 75 6e 6b 6e 6f 77 6e 20 64 61 74 61 62  , "unknown datab
5020: 61 73 65 20 25 54 22 2c 20 70 4e 61 6d 65 31 29  ase %T", pName1)
5030: 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  ;.      pParse->
5040: 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 72 65  nErr++;.      re
5050: 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a 20  turn -1;.    }. 
5060: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65   }else{.    asse
5070: 72 74 28 20 64 62 2d 3e 69 6e 69 74 2e 69 44 62  rt( db->init.iDb
5080: 3d 3d 30 20 7c 7c 20 64 62 2d 3e 69 6e 69 74 2e  ==0 || db->init.
5090: 62 75 73 79 20 29 3b 0a 20 20 20 20 69 44 62 20  busy );.    iDb 
50a0: 3d 20 64 62 2d 3e 69 6e 69 74 2e 69 44 62 3b 0a  = db->init.iDb;.
50b0: 20 20 20 20 2a 70 55 6e 71 75 61 6c 20 3d 20 70      *pUnqual = p
50c0: 4e 61 6d 65 31 3b 0a 20 20 7d 0a 20 20 72 65 74  Name1;.  }.  ret
50d0: 75 72 6e 20 69 44 62 3b 0a 7d 0a 0a 2f 2a 0a 2a  urn iDb;.}../*.*
50e0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
50f0: 73 20 75 73 65 64 20 74 6f 20 63 68 65 63 6b 20  s used to check 
5100: 69 66 20 74 68 65 20 55 54 46 2d 38 20 73 74 72  if the UTF-8 str
5110: 69 6e 67 20 7a 4e 61 6d 65 20 69 73 20 61 20 6c  ing zName is a l
5120: 65 67 61 6c 0a 2a 2a 20 75 6e 71 75 61 6c 69 66  egal.** unqualif
5130: 69 65 64 20 6e 61 6d 65 20 66 6f 72 20 61 20 6e  ied name for a n
5140: 65 77 20 73 63 68 65 6d 61 20 6f 62 6a 65 63 74  ew schema object
5150: 20 28 74 61 62 6c 65 2c 20 69 6e 64 65 78 2c 20   (table, index, 
5160: 76 69 65 77 20 6f 72 0a 2a 2a 20 74 72 69 67 67  view or.** trigg
5170: 65 72 29 2e 20 41 6c 6c 20 6e 61 6d 65 73 20 61  er). All names a
5180: 72 65 20 6c 65 67 61 6c 20 65 78 63 65 70 74 20  re legal except 
5190: 74 68 6f 73 65 20 74 68 61 74 20 62 65 67 69 6e  those that begin
51a0: 20 77 69 74 68 20 74 68 65 20 73 74 72 69 6e 67   with the string
51b0: 0a 2a 2a 20 22 73 71 6c 69 74 65 5f 22 20 28 69  .** "sqlite_" (i
51c0: 6e 20 75 70 70 65 72 2c 20 6c 6f 77 65 72 20 6f  n upper, lower o
51d0: 72 20 6d 69 78 65 64 20 63 61 73 65 29 2e 20 54  r mixed case). T
51e0: 68 69 73 20 70 6f 72 74 69 6f 6e 20 6f 66 20 74  his portion of t
51f0: 68 65 20 6e 61 6d 65 73 70 61 63 65 0a 2a 2a 20  he namespace.** 
5200: 69 73 20 72 65 73 65 72 76 65 64 20 66 6f 72 20  is reserved for 
5210: 69 6e 74 65 72 6e 61 6c 20 75 73 65 2e 0a 2a 2f  internal use..*/
5220: 0a 69 6e 74 20 73 71 6c 69 74 65 33 43 68 65 63  .int sqlite3Chec
5230: 6b 4f 62 6a 65 63 74 4e 61 6d 65 28 50 61 72 73  kObjectName(Pars
5240: 65 20 2a 70 50 61 72 73 65 2c 20 63 6f 6e 73 74  e *pParse, const
5250: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20   char *zName){. 
5260: 20 69 66 28 20 21 70 50 61 72 73 65 2d 3e 64 62   if( !pParse->db
5270: 2d 3e 69 6e 69 74 2e 62 75 73 79 20 26 26 20 70  ->init.busy && p
5280: 50 61 72 73 65 2d 3e 6e 65 73 74 65 64 3d 3d 30  Parse->nested==0
5290: 20 0a 20 20 20 20 20 20 20 20 20 20 26 26 20 28   .          && (
52a0: 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66 6c 61 67  pParse->db->flag
52b0: 73 20 26 20 53 51 4c 49 54 45 5f 57 72 69 74 65  s & SQLITE_Write
52c0: 53 63 68 65 6d 61 29 3d 3d 30 0a 20 20 20 20 20  Schema)==0.     
52d0: 20 20 20 20 20 26 26 20 30 3d 3d 73 71 6c 69 74       && 0==sqlit
52e0: 65 33 53 74 72 4e 49 43 6d 70 28 7a 4e 61 6d 65  e3StrNICmp(zName
52f0: 2c 20 22 73 71 6c 69 74 65 5f 22 2c 20 37 29 20  , "sqlite_", 7) 
5300: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
5310: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
5320: 6f 62 6a 65 63 74 20 6e 61 6d 65 20 72 65 73 65  object name rese
5330: 72 76 65 64 20 66 6f 72 20 69 6e 74 65 72 6e 61  rved for interna
5340: 6c 20 75 73 65 3a 20 25 73 22 2c 20 7a 4e 61 6d  l use: %s", zNam
5350: 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  e);.    return S
5360: 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d  QLITE_ERROR;.  }
5370: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
5380: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65  _OK;.}../*.** Be
5390: 67 69 6e 20 63 6f 6e 73 74 72 75 63 74 69 6e 67  gin constructing
53a0: 20 61 20 6e 65 77 20 74 61 62 6c 65 20 72 65 70   a new table rep
53b0: 72 65 73 65 6e 74 61 74 69 6f 6e 20 69 6e 20 6d  resentation in m
53c0: 65 6d 6f 72 79 2e 20 20 54 68 69 73 20 69 73 0a  emory.  This is.
53d0: 2a 2a 20 74 68 65 20 66 69 72 73 74 20 6f 66 20  ** the first of 
53e0: 73 65 76 65 72 61 6c 20 61 63 74 69 6f 6e 20 72  several action r
53f0: 6f 75 74 69 6e 65 73 20 74 68 61 74 20 67 65 74  outines that get
5400: 20 63 61 6c 6c 65 64 20 69 6e 20 72 65 73 70 6f   called in respo
5410: 6e 73 65 0a 2a 2a 20 74 6f 20 61 20 43 52 45 41  nse.** to a CREA
5420: 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65  TE TABLE stateme
5430: 6e 74 2e 20 20 49 6e 20 70 61 72 74 69 63 75 6c  nt.  In particul
5440: 61 72 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ar, this routine
5450: 20 69 73 20 63 61 6c 6c 65 64 0a 2a 2a 20 61 66   is called.** af
5460: 74 65 72 20 73 65 65 69 6e 67 20 74 6f 6b 65 6e  ter seeing token
5470: 73 20 22 43 52 45 41 54 45 22 20 61 6e 64 20 22  s "CREATE" and "
5480: 54 41 42 4c 45 22 20 61 6e 64 20 74 68 65 20 74  TABLE" and the t
5490: 61 62 6c 65 20 6e 61 6d 65 2e 20 54 68 65 20 69  able name. The i
54a0: 73 54 65 6d 70 0a 2a 2a 20 66 6c 61 67 20 69 73  sTemp.** flag is
54b0: 20 74 72 75 65 20 69 66 20 74 68 65 20 74 61 62   true if the tab
54c0: 6c 65 20 73 68 6f 75 6c 64 20 62 65 20 73 74 6f  le should be sto
54d0: 72 65 64 20 69 6e 20 74 68 65 20 61 75 78 69 6c  red in the auxil
54e0: 69 61 72 79 20 64 61 74 61 62 61 73 65 0a 2a 2a  iary database.**
54f0: 20 66 69 6c 65 20 69 6e 73 74 65 61 64 20 6f 66   file instead of
5500: 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 64 61 74   in the main dat
5510: 61 62 61 73 65 20 66 69 6c 65 2e 20 20 54 68 69  abase file.  Thi
5520: 73 20 69 73 20 6e 6f 72 6d 61 6c 6c 79 20 74 68  s is normally th
5530: 65 20 63 61 73 65 0a 2a 2a 20 77 68 65 6e 20 74  e case.** when t
5540: 68 65 20 22 54 45 4d 50 22 20 6f 72 20 22 54 45  he "TEMP" or "TE
5550: 4d 50 4f 52 41 52 59 22 20 6b 65 79 77 6f 72 64  MPORARY" keyword
5560: 20 6f 63 63 75 72 73 20 69 6e 20 62 65 74 77 65   occurs in betwe
5570: 65 6e 0a 2a 2a 20 43 52 45 41 54 45 20 61 6e 64  en.** CREATE and
5580: 20 54 41 42 4c 45 2e 0a 2a 2a 0a 2a 2a 20 54 68   TABLE..**.** Th
5590: 65 20 6e 65 77 20 74 61 62 6c 65 20 72 65 63 6f  e new table reco
55a0: 72 64 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65  rd is initialize
55b0: 64 20 61 6e 64 20 70 75 74 20 69 6e 20 70 50 61  d and put in pPa
55c0: 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 2e 0a  rse->pNewTable..
55d0: 2a 2a 20 41 73 20 6d 6f 72 65 20 6f 66 20 74 68  ** As more of th
55e0: 65 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73  e CREATE TABLE s
55f0: 74 61 74 65 6d 65 6e 74 20 69 73 20 70 61 72 73  tatement is pars
5600: 65 64 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20 61  ed, additional a
5610: 63 74 69 6f 6e 0a 2a 2a 20 72 6f 75 74 69 6e 65  ction.** routine
5620: 73 20 77 69 6c 6c 20 62 65 20 63 61 6c 6c 65 64  s will be called
5630: 20 74 6f 20 61 64 64 20 6d 6f 72 65 20 69 6e 66   to add more inf
5640: 6f 72 6d 61 74 69 6f 6e 20 74 6f 20 74 68 69 73  ormation to this
5650: 20 72 65 63 6f 72 64 2e 0a 2a 2a 20 41 74 20 74   record..** At t
5660: 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 43 52  he end of the CR
5670: 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65  EATE TABLE state
5680: 6d 65 6e 74 2c 20 74 68 65 20 73 71 6c 69 74 65  ment, the sqlite
5690: 33 45 6e 64 54 61 62 6c 65 28 29 20 72 6f 75 74  3EndTable() rout
56a0: 69 6e 65 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64  ine.** is called
56b0: 20 74 6f 20 63 6f 6d 70 6c 65 74 65 20 74 68 65   to complete the
56c0: 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 6f 66   construction of
56d0: 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20 72   the new table r
56e0: 65 63 6f 72 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ecord..*/.void s
56f0: 71 6c 69 74 65 33 53 74 61 72 74 54 61 62 6c 65  qlite3StartTable
5700: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
5710: 65 2c 20 20 20 2f 2a 20 50 61 72 73 65 72 20 63  e,   /* Parser c
5720: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 6f 6b 65  ontext */.  Toke
5730: 6e 20 2a 70 4e 61 6d 65 31 2c 20 20 20 2f 2a 20  n *pName1,   /* 
5740: 46 69 72 73 74 20 70 61 72 74 20 6f 66 20 74 68  First part of th
5750: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61  e name of the ta
5760: 62 6c 65 20 6f 72 20 76 69 65 77 20 2a 2f 0a 20  ble or view */. 
5770: 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32 2c 20   Token *pName2, 
5780: 20 20 2f 2a 20 53 65 63 6f 6e 64 20 70 61 72 74    /* Second part
5790: 20 6f 66 20 74 68 65 20 6e 61 6d 65 20 6f 66 20   of the name of 
57a0: 74 68 65 20 74 61 62 6c 65 20 6f 72 20 76 69 65  the table or vie
57b0: 77 20 2a 2f 0a 20 20 69 6e 74 20 69 73 54 65 6d  w */.  int isTem
57c0: 70 2c 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20  p,      /* True 
57d0: 69 66 20 74 68 69 73 20 69 73 20 61 20 54 45 4d  if this is a TEM
57e0: 50 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74  P table */.  int
57f0: 20 69 73 56 69 65 77 2c 20 20 20 20 20 20 2f 2a   isView,      /*
5800: 20 54 72 75 65 20 69 66 20 74 68 69 73 20 69 73   True if this is
5810: 20 61 20 56 49 45 57 20 2a 2f 0a 20 20 69 6e 74   a VIEW */.  int
5820: 20 69 73 56 69 72 74 75 61 6c 2c 20 20 20 2f 2a   isVirtual,   /*
5830: 20 54 72 75 65 20 69 66 20 74 68 69 73 20 69 73   True if this is
5840: 20 61 20 56 49 52 54 55 41 4c 20 74 61 62 6c 65   a VIRTUAL table
5850: 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 45 72 72 20   */.  int noErr 
5860: 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74         /* Do not
5870: 68 69 6e 67 20 69 66 20 74 61 62 6c 65 20 61 6c  hing if table al
5880: 72 65 61 64 79 20 65 78 69 73 74 73 20 2a 2f 0a  ready exists */.
5890: 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  ){.  Table *pTab
58a0: 6c 65 3b 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d  le;.  char *zNam
58b0: 65 20 3d 20 30 3b 20 2f 2a 20 54 68 65 20 6e 61  e = 0; /* The na
58c0: 6d 65 20 6f 66 20 74 68 65 20 6e 65 77 20 74 61  me of the new ta
58d0: 62 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ble */.  sqlite3
58e0: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
58f0: 62 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20  b;.  Vdbe *v;.  
5900: 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20 20 20  int iDb;        
5910: 20 2f 2a 20 44 61 74 61 62 61 73 65 20 6e 75 6d   /* Database num
5920: 62 65 72 20 74 6f 20 63 72 65 61 74 65 20 74 68  ber to create th
5930: 65 20 74 61 62 6c 65 20 69 6e 20 2a 2f 0a 20 20  e table in */.  
5940: 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 3b 20 20 20  Token *pName;   
5950: 20 2f 2a 20 55 6e 71 75 61 6c 69 66 69 65 64 20   /* Unqualified 
5960: 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c  name of the tabl
5970: 65 20 74 6f 20 63 72 65 61 74 65 20 2a 2f 0a 0a  e to create */..
5980: 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 6f    /* The table o
5990: 72 20 76 69 65 77 20 6e 61 6d 65 20 74 6f 20 63  r view name to c
59a0: 72 65 61 74 65 20 69 73 20 70 61 73 73 65 64 20  reate is passed 
59b0: 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  to this routine 
59c0: 76 69 61 20 74 6f 6b 65 6e 73 0a 20 20 2a 2a 20  via tokens.  ** 
59d0: 70 4e 61 6d 65 31 20 61 6e 64 20 70 4e 61 6d 65  pName1 and pName
59e0: 32 2e 20 49 66 20 74 68 65 20 74 61 62 6c 65 20  2. If the table 
59f0: 6e 61 6d 65 20 77 61 73 20 66 75 6c 6c 79 20 71  name was fully q
5a00: 75 61 6c 69 66 69 65 64 2c 20 66 6f 72 20 65 78  ualified, for ex
5a10: 61 6d 70 6c 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  ample:.  **.  **
5a20: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 78 78   CREATE TABLE xx
5a30: 78 2e 79 79 79 20 28 2e 2e 2e 29 3b 0a 20 20 2a  x.yyy (...);.  *
5a40: 2a 20 0a 20 20 2a 2a 20 54 68 65 6e 20 70 4e 61  * .  ** Then pNa
5a50: 6d 65 31 20 69 73 20 73 65 74 20 74 6f 20 22 78  me1 is set to "x
5a60: 78 78 22 20 61 6e 64 20 70 4e 61 6d 65 32 20 22  xx" and pName2 "
5a70: 79 79 79 22 2e 20 4f 6e 20 74 68 65 20 6f 74 68  yyy". On the oth
5a80: 65 72 20 68 61 6e 64 20 69 66 0a 20 20 2a 2a 20  er hand if.  ** 
5a90: 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 69  the table name i
5aa0: 73 20 6e 6f 74 20 66 75 6c 6c 79 20 71 75 61 6c  s not fully qual
5ab0: 69 66 69 65 64 2c 20 69 2e 65 2e 3a 0a 20 20 2a  ified, i.e.:.  *
5ac0: 2a 0a 20 20 2a 2a 20 43 52 45 41 54 45 20 54 41  *.  ** CREATE TA
5ad0: 42 4c 45 20 79 79 79 28 2e 2e 2e 29 3b 0a 20 20  BLE yyy(...);.  
5ae0: 2a 2a 0a 20 20 2a 2a 20 54 68 65 6e 20 70 4e 61  **.  ** Then pNa
5af0: 6d 65 31 20 69 73 20 73 65 74 20 74 6f 20 22 79  me1 is set to "y
5b00: 79 79 22 20 61 6e 64 20 70 4e 61 6d 65 32 20 69  yy" and pName2 i
5b10: 73 20 22 22 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  s ""..  **.  ** 
5b20: 54 68 65 20 63 61 6c 6c 20 62 65 6c 6f 77 20 73  The call below s
5b30: 65 74 73 20 74 68 65 20 70 4e 61 6d 65 20 70 6f  ets the pName po
5b40: 69 6e 74 65 72 20 74 6f 20 70 6f 69 6e 74 20 61  inter to point a
5b50: 74 20 74 68 65 20 74 6f 6b 65 6e 20 28 70 4e 61  t the token (pNa
5b60: 6d 65 31 20 6f 72 0a 20 20 2a 2a 20 70 4e 61 6d  me1 or.  ** pNam
5b70: 65 32 29 20 74 68 61 74 20 73 74 6f 72 65 73 20  e2) that stores 
5b80: 74 68 65 20 75 6e 71 75 61 6c 69 66 69 65 64 20  the unqualified 
5b90: 74 61 62 6c 65 20 6e 61 6d 65 2e 20 54 68 65 20  table name. The 
5ba0: 76 61 72 69 61 62 6c 65 20 69 44 62 20 69 73 0a  variable iDb is.
5bb0: 20 20 2a 2a 20 73 65 74 20 74 6f 20 74 68 65 20    ** set to the 
5bc0: 69 6e 64 65 78 20 6f 66 20 74 68 65 20 64 61 74  index of the dat
5bd0: 61 62 61 73 65 20 74 68 61 74 20 74 68 65 20 74  abase that the t
5be0: 61 62 6c 65 20 6f 72 20 76 69 65 77 20 69 73 20  able or view is 
5bf0: 74 6f 20 62 65 0a 20 20 2a 2a 20 63 72 65 61 74  to be.  ** creat
5c00: 65 64 20 69 6e 2e 0a 20 20 2a 2f 0a 20 20 69 44  ed in..  */.  iD
5c10: 62 20 3d 20 73 71 6c 69 74 65 33 54 77 6f 50 61  b = sqlite3TwoPa
5c20: 72 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 70  rtName(pParse, p
5c30: 4e 61 6d 65 31 2c 20 70 4e 61 6d 65 32 2c 20 26  Name1, pName2, &
5c40: 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 69 44  pName);.  if( iD
5c50: 62 3c 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  b<0 ) return;.  
5c60: 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42  if( !OMIT_TEMPDB
5c70: 20 26 26 20 69 73 54 65 6d 70 20 26 26 20 69 44   && isTemp && iD
5c80: 62 3e 31 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66  b>1 ){.    /* If
5c90: 20 63 72 65 61 74 69 6e 67 20 61 20 74 65 6d 70   creating a temp
5ca0: 20 74 61 62 6c 65 2c 20 74 68 65 20 6e 61 6d 65   table, the name
5cb0: 20 6d 61 79 20 6e 6f 74 20 62 65 20 71 75 61 6c   may not be qual
5cc0: 69 66 69 65 64 20 2a 2f 0a 20 20 20 20 73 71 6c  ified */.    sql
5cd0: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
5ce0: 72 73 65 2c 20 22 74 65 6d 70 6f 72 61 72 79 20  rse, "temporary 
5cf0: 74 61 62 6c 65 20 6e 61 6d 65 20 6d 75 73 74 20  table name must 
5d00: 62 65 20 75 6e 71 75 61 6c 69 66 69 65 64 22 29  be unqualified")
5d10: 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
5d20: 7d 0a 20 20 69 66 28 20 21 4f 4d 49 54 5f 54 45  }.  if( !OMIT_TE
5d30: 4d 50 44 42 20 26 26 20 69 73 54 65 6d 70 20 29  MPDB && isTemp )
5d40: 20 69 44 62 20 3d 20 31 3b 0a 0a 20 20 70 50 61   iDb = 1;..  pPa
5d50: 72 73 65 2d 3e 73 4e 61 6d 65 54 6f 6b 65 6e 20  rse->sNameToken 
5d60: 3d 20 2a 70 4e 61 6d 65 3b 0a 20 20 7a 4e 61 6d  = *pName;.  zNam
5d70: 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46  e = sqlite3NameF
5d80: 72 6f 6d 54 6f 6b 65 6e 28 70 4e 61 6d 65 29 3b  romToken(pName);
5d90: 0a 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20  .  if( zName==0 
5da0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
5db0: 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74  SQLITE_OK!=sqlit
5dc0: 65 33 43 68 65 63 6b 4f 62 6a 65 63 74 4e 61 6d  e3CheckObjectNam
5dd0: 65 28 70 50 61 72 73 65 2c 20 7a 4e 61 6d 65 29  e(pParse, zName)
5de0: 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 62 65 67   ){.    goto beg
5df0: 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b 0a  in_table_error;.
5e00: 20 20 7d 0a 20 20 69 66 28 20 64 62 2d 3e 69 6e    }.  if( db->in
5e10: 69 74 2e 69 44 62 3d 3d 31 20 29 20 69 73 54 65  it.iDb==1 ) isTe
5e20: 6d 70 20 3d 20 31 3b 0a 23 69 66 6e 64 65 66 20  mp = 1;.#ifndef 
5e30: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48  SQLITE_OMIT_AUTH
5e40: 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 61 73 73 65  ORIZATION.  asse
5e50: 72 74 28 20 28 69 73 54 65 6d 70 20 26 20 31 29  rt( (isTemp & 1)
5e60: 3d 3d 69 73 54 65 6d 70 20 29 3b 0a 20 20 7b 0a  ==isTemp );.  {.
5e70: 20 20 20 20 69 6e 74 20 63 6f 64 65 3b 0a 20 20      int code;.  
5e80: 20 20 63 68 61 72 20 2a 7a 44 62 20 3d 20 64 62    char *zDb = db
5e90: 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65  ->aDb[iDb].zName
5ea0: 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
5eb0: 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73  3AuthCheck(pPars
5ec0: 65 2c 20 53 51 4c 49 54 45 5f 49 4e 53 45 52 54  e, SQLITE_INSERT
5ed0: 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69  , SCHEMA_TABLE(i
5ee0: 73 54 65 6d 70 29 2c 20 30 2c 20 7a 44 62 29 20  sTemp), 0, zDb) 
5ef0: 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 62 65  ){.      goto be
5f00: 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b  gin_table_error;
5f10: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69  .    }.    if( i
5f20: 73 56 69 65 77 20 29 7b 0a 20 20 20 20 20 20 69  sView ){.      i
5f30: 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20  f( !OMIT_TEMPDB 
5f40: 26 26 20 69 73 54 65 6d 70 20 29 7b 0a 20 20 20  && isTemp ){.   
5f50: 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49       code = SQLI
5f60: 54 45 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f 56  TE_CREATE_TEMP_V
5f70: 49 45 57 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  IEW;.      }else
5f80: 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20 3d  {.        code =
5f90: 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 56   SQLITE_CREATE_V
5fa0: 49 45 57 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  IEW;.      }.   
5fb0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 66   }else{.      if
5fc0: 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26  ( !OMIT_TEMPDB &
5fd0: 26 20 69 73 54 65 6d 70 20 29 7b 0a 20 20 20 20  & isTemp ){.    
5fe0: 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54      code = SQLIT
5ff0: 45 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f 54 41  E_CREATE_TEMP_TA
6000: 42 4c 45 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  BLE;.      }else
6010: 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20 3d  {.        code =
6020: 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54   SQLITE_CREATE_T
6030: 41 42 4c 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ABLE;.      }.  
6040: 20 20 7d 0a 20 20 20 20 69 66 28 20 21 69 73 56    }.    if( !isV
6050: 69 72 74 75 61 6c 20 26 26 20 73 71 6c 69 74 65  irtual && sqlite
6060: 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73  3AuthCheck(pPars
6070: 65 2c 20 63 6f 64 65 2c 20 7a 4e 61 6d 65 2c 20  e, code, zName, 
6080: 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20  0, zDb) ){.     
6090: 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c   goto begin_tabl
60a0: 65 5f 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20  e_error;.    }. 
60b0: 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
60c0: 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 6e 65  Make sure the ne
60d0: 77 20 74 61 62 6c 65 20 6e 61 6d 65 20 64 6f 65  w table name doe
60e0: 73 20 6e 6f 74 20 63 6f 6c 6c 69 64 65 20 77 69  s not collide wi
60f0: 74 68 20 61 6e 20 65 78 69 73 74 69 6e 67 0a 20  th an existing. 
6100: 20 2a 2a 20 69 6e 64 65 78 20 6f 72 20 74 61 62   ** index or tab
6110: 6c 65 20 6e 61 6d 65 20 69 6e 20 74 68 65 20 73  le name in the s
6120: 61 6d 65 20 64 61 74 61 62 61 73 65 2e 20 20 49  ame database.  I
6130: 73 73 75 65 20 61 6e 20 65 72 72 6f 72 20 6d 65  ssue an error me
6140: 73 73 61 67 65 20 69 66 0a 20 20 2a 2a 20 69 74  ssage if.  ** it
6150: 20 64 6f 65 73 2e 20 54 68 65 20 65 78 63 65 70   does. The excep
6160: 74 69 6f 6e 20 69 73 20 69 66 20 74 68 65 20 73  tion is if the s
6170: 74 61 74 65 6d 65 6e 74 20 62 65 69 6e 67 20 70  tatement being p
6180: 61 72 73 65 64 20 77 61 73 20 70 61 73 73 65 64  arsed was passed
6190: 0a 20 20 2a 2a 20 74 6f 20 61 6e 20 73 71 6c 69  .  ** to an sqli
61a0: 74 65 33 5f 64 65 63 6c 61 72 65 5f 76 74 61 62  te3_declare_vtab
61b0: 28 29 20 63 61 6c 6c 2e 20 49 6e 20 74 68 61 74  () call. In that
61c0: 20 63 61 73 65 20 6f 6e 6c 79 20 74 68 65 20 63   case only the c
61d0: 6f 6c 75 6d 6e 20 6e 61 6d 65 73 0a 20 20 2a 2a  olumn names.  **
61e0: 20 61 6e 64 20 74 79 70 65 73 20 77 69 6c 6c 20   and types will 
61f0: 62 65 20 75 73 65 64 2c 20 73 6f 20 74 68 65 72  be used, so ther
6200: 65 20 69 73 20 6e 6f 20 6e 65 65 64 20 74 6f 20  e is no need to 
6210: 74 65 73 74 20 66 6f 72 20 6e 61 6d 65 73 70 61  test for namespa
6220: 63 65 0a 20 20 2a 2a 20 63 6f 6c 6c 69 73 69 6f  ce.  ** collisio
6230: 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21  ns..  */.  if( !
6240: 49 4e 5f 44 45 43 4c 41 52 45 5f 56 54 41 42 20  IN_DECLARE_VTAB 
6250: 29 7b 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54  ){.    if( SQLIT
6260: 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65 61  E_OK!=sqlite3Rea
6270: 64 53 63 68 65 6d 61 28 70 50 61 72 73 65 29 20  dSchema(pParse) 
6280: 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 62 65  ){.      goto be
6290: 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b  gin_table_error;
62a0: 0a 20 20 20 20 7d 0a 20 20 20 20 70 54 61 62 6c  .    }.    pTabl
62b0: 65 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 54  e = sqlite3FindT
62c0: 61 62 6c 65 28 64 62 2c 20 7a 4e 61 6d 65 2c 20  able(db, zName, 
62d0: 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61  db->aDb[iDb].zNa
62e0: 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 70 54 61  me);.    if( pTa
62f0: 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ble ){.      if(
6300: 20 21 6e 6f 45 72 72 20 29 7b 0a 20 20 20 20 20   !noErr ){.     
6310: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
6320: 73 67 28 70 50 61 72 73 65 2c 20 22 74 61 62 6c  sg(pParse, "tabl
6330: 65 20 25 54 20 61 6c 72 65 61 64 79 20 65 78 69  e %T already exi
6340: 73 74 73 22 2c 20 70 4e 61 6d 65 29 3b 0a 20 20  sts", pName);.  
6350: 20 20 20 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f      }.      goto
6360: 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72   begin_table_err
6370: 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  or;.    }.    if
6380: 28 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 64  ( sqlite3FindInd
6390: 65 78 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 30 29  ex(db, zName, 0)
63a0: 21 3d 30 20 26 26 20 28 69 44 62 3d 3d 30 20 7c  !=0 && (iDb==0 |
63b0: 7c 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  | !db->init.busy
63c0: 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ) ){.      sqlit
63d0: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
63e0: 65 2c 20 22 74 68 65 72 65 20 69 73 20 61 6c 72  e, "there is alr
63f0: 65 61 64 79 20 61 6e 20 69 6e 64 65 78 20 6e 61  eady an index na
6400: 6d 65 64 20 25 73 22 2c 20 7a 4e 61 6d 65 29 3b  med %s", zName);
6410: 0a 20 20 20 20 20 20 67 6f 74 6f 20 62 65 67 69  .      goto begi
6420: 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b 0a 20  n_table_error;. 
6430: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 54 61 62     }.  }..  pTab
6440: 6c 65 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f  le = sqliteMallo
6450: 63 28 20 73 69 7a 65 6f 66 28 54 61 62 6c 65 29  c( sizeof(Table)
6460: 20 29 3b 0a 20 20 69 66 28 20 70 54 61 62 6c 65   );.  if( pTable
6470: 3d 3d 30 20 29 7b 0a 20 20 20 20 70 50 61 72 73  ==0 ){.    pPars
6480: 65 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e  e->rc = SQLITE_N
6490: 4f 4d 45 4d 3b 0a 20 20 20 20 70 50 61 72 73 65  OMEM;.    pParse
64a0: 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 67 6f  ->nErr++;.    go
64b0: 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65  to begin_table_e
64c0: 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 70 54 61 62  rror;.  }.  pTab
64d0: 6c 65 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 4e 61 6d  le->zName = zNam
64e0: 65 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 69 50 4b  e;.  pTable->iPK
64f0: 65 79 20 3d 20 2d 31 3b 0a 20 20 70 54 61 62 6c  ey = -1;.  pTabl
6500: 65 2d 3e 70 53 63 68 65 6d 61 20 3d 20 64 62 2d  e->pSchema = db-
6510: 3e 61 44 62 5b 69 44 62 5d 2e 70 53 63 68 65 6d  >aDb[iDb].pSchem
6520: 61 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 6e 52 65  a;.  pTable->nRe
6530: 66 20 3d 20 31 3b 0a 20 20 69 66 28 20 70 50 61  f = 1;.  if( pPa
6540: 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 29  rse->pNewTable )
6550: 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61   sqlite3DeleteTa
6560: 62 6c 65 28 64 62 2c 20 70 50 61 72 73 65 2d 3e  ble(db, pParse->
6570: 70 4e 65 77 54 61 62 6c 65 29 3b 0a 20 20 70 50  pNewTable);.  pP
6580: 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20  arse->pNewTable 
6590: 3d 20 70 54 61 62 6c 65 3b 0a 0a 20 20 2f 2a 20  = pTable;..  /* 
65a0: 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20 6d  If this is the m
65b0: 61 67 69 63 20 73 71 6c 69 74 65 5f 73 65 71 75  agic sqlite_sequ
65c0: 65 6e 63 65 20 74 61 62 6c 65 20 75 73 65 64 20  ence table used 
65d0: 62 79 20 61 75 74 6f 69 6e 63 72 65 6d 65 6e 74  by autoincrement
65e0: 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 72 65 63 6f  ,.  ** then reco
65f0: 72 64 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rd a pointer to 
6600: 74 68 69 73 20 74 61 62 6c 65 20 69 6e 20 74 68  this table in th
6610: 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20  e main database 
6620: 73 74 72 75 63 74 75 72 65 0a 20 20 2a 2a 20 73  structure.  ** s
6630: 6f 20 74 68 61 74 20 49 4e 53 45 52 54 20 63 61  o that INSERT ca
6640: 6e 20 66 69 6e 64 20 74 68 65 20 74 61 62 6c 65  n find the table
6650: 20 65 61 73 69 6c 79 2e 0a 20 20 2a 2f 0a 23 69   easily..  */.#i
6660: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
6670: 54 5f 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 0a  T_AUTOINCREMENT.
6680: 20 20 69 66 28 20 21 70 50 61 72 73 65 2d 3e 6e    if( !pParse->n
6690: 65 73 74 65 64 20 26 26 20 73 74 72 63 6d 70 28  ested && strcmp(
66a0: 7a 4e 61 6d 65 2c 20 22 73 71 6c 69 74 65 5f 73  zName, "sqlite_s
66b0: 65 71 75 65 6e 63 65 22 29 3d 3d 30 20 29 7b 0a  equence")==0 ){.
66c0: 20 20 20 20 70 54 61 62 6c 65 2d 3e 70 53 63 68      pTable->pSch
66d0: 65 6d 61 2d 3e 70 53 65 71 54 61 62 20 3d 20 70  ema->pSeqTab = p
66e0: 54 61 62 6c 65 3b 0a 20 20 7d 0a 23 65 6e 64 69  Table;.  }.#endi
66f0: 66 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20 67 65  f..  /* Begin ge
6700: 6e 65 72 61 74 69 6e 67 20 74 68 65 20 63 6f 64  nerating the cod
6710: 65 20 74 68 61 74 20 77 69 6c 6c 20 69 6e 73 65  e that will inse
6720: 72 74 20 74 68 65 20 74 61 62 6c 65 20 72 65 63  rt the table rec
6730: 6f 72 64 20 69 6e 74 6f 0a 20 20 2a 2a 20 74 68  ord into.  ** th
6740: 65 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52 20  e SQLITE_MASTER 
6750: 74 61 62 6c 65 2e 20 20 4e 6f 74 65 20 69 6e 20  table.  Note in 
6760: 70 61 72 74 69 63 75 6c 61 72 20 74 68 61 74 20  particular that 
6770: 77 65 20 6d 75 73 74 20 67 6f 20 61 68 65 61 64  we must go ahead
6780: 0a 20 20 2a 2a 20 61 6e 64 20 61 6c 6c 6f 63 61  .  ** and alloca
6790: 74 65 20 74 68 65 20 72 65 63 6f 72 64 20 6e 75  te the record nu
67a0: 6d 62 65 72 20 66 6f 72 20 74 68 65 20 74 61 62  mber for the tab
67b0: 6c 65 20 65 6e 74 72 79 20 6e 6f 77 2e 20 20 42  le entry now.  B
67c0: 65 66 6f 72 65 20 61 6e 79 0a 20 20 2a 2a 20 50  efore any.  ** P
67d0: 52 49 4d 41 52 59 20 4b 45 59 20 6f 72 20 55 4e  RIMARY KEY or UN
67e0: 49 51 55 45 20 6b 65 79 77 6f 72 64 73 20 61 72  IQUE keywords ar
67f0: 65 20 70 61 72 73 65 64 2e 20 20 54 68 6f 73 65  e parsed.  Those
6800: 20 6b 65 79 77 6f 72 64 73 20 77 69 6c 6c 20 63   keywords will c
6810: 61 75 73 65 0a 20 20 2a 2a 20 69 6e 64 69 63 65  ause.  ** indice
6820: 73 20 74 6f 20 62 65 20 63 72 65 61 74 65 64 20  s to be created 
6830: 61 6e 64 20 74 68 65 20 74 61 62 6c 65 20 72 65  and the table re
6840: 63 6f 72 64 20 6d 75 73 74 20 63 6f 6d 65 20 62  cord must come b
6850: 65 66 6f 72 65 20 74 68 65 20 0a 20 20 2a 2a 20  efore the .  ** 
6860: 69 6e 64 69 63 65 73 2e 20 20 48 65 6e 63 65 2c  indices.  Hence,
6870: 20 74 68 65 20 72 65 63 6f 72 64 20 6e 75 6d 62   the record numb
6880: 65 72 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65  er for the table
6890: 20 6d 75 73 74 20 62 65 20 61 6c 6c 6f 63 61 74   must be allocat
68a0: 65 64 0a 20 20 2a 2a 20 6e 6f 77 2e 0a 20 20 2a  ed.  ** now..  *
68b0: 2f 0a 20 20 69 66 28 20 21 64 62 2d 3e 69 6e 69  /.  if( !db->ini
68c0: 74 2e 62 75 73 79 20 26 26 20 28 76 20 3d 20 73  t.busy && (v = s
68d0: 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
68e0: 61 72 73 65 29 29 21 3d 30 20 29 7b 0a 20 20 20  arse))!=0 ){.   
68f0: 20 69 6e 74 20 6c 62 6c 3b 0a 20 20 20 20 69 6e   int lbl;.    in
6900: 74 20 66 69 6c 65 46 6f 72 6d 61 74 3b 0a 20 20  t fileFormat;.  
6910: 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72    sqlite3BeginWr
6920: 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61  iteOperation(pPa
6930: 72 73 65 2c 20 30 2c 20 69 44 62 29 3b 0a 0a 23  rse, 0, iDb);..#
6940: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
6950: 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
6960: 20 20 20 20 69 66 28 20 69 73 56 69 72 74 75 61      if( isVirtua
6970: 6c 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  l ){.      sqlit
6980: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
6990: 50 5f 56 42 65 67 69 6e 2c 20 30 2c 20 30 29 3b  P_VBegin, 0, 0);
69a0: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  .    }.#endif.. 
69b0: 20 20 20 2f 2a 20 49 66 20 74 68 65 20 66 69 6c     /* If the fil
69c0: 65 20 66 6f 72 6d 61 74 20 61 6e 64 20 65 6e 63  e format and enc
69d0: 6f 64 69 6e 67 20 69 6e 20 74 68 65 20 64 61 74  oding in the dat
69e0: 61 62 61 73 65 20 68 61 76 65 20 6e 6f 74 20 62  abase have not b
69f0: 65 65 6e 20 73 65 74 2c 20 0a 20 20 20 20 2a 2a  een set, .    **
6a00: 20 73 65 74 20 74 68 65 6d 20 6e 6f 77 2e 0a 20   set them now.. 
6a10: 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65     */.    sqlite
6a20: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
6a30: 5f 52 65 61 64 43 6f 6f 6b 69 65 2c 20 69 44 62  _ReadCookie, iDb
6a40: 2c 20 31 29 3b 20 20 20 2f 2a 20 66 69 6c 65 5f  , 1);   /* file_
6a50: 66 6f 72 6d 61 74 20 2a 2f 0a 20 20 20 20 6c 62  format */.    lb
6a60: 6c 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  l = sqlite3VdbeM
6a70: 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
6a80: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
6a90: 70 28 76 2c 20 4f 50 5f 49 66 2c 20 30 2c 20 6c  p(v, OP_If, 0, l
6aa0: 62 6c 29 3b 0a 20 20 20 20 66 69 6c 65 46 6f 72  bl);.    fileFor
6ab0: 6d 61 74 20 3d 20 28 64 62 2d 3e 66 6c 61 67 73  mat = (db->flags
6ac0: 20 26 20 53 51 4c 49 54 45 5f 4c 65 67 61 63 79   & SQLITE_Legacy
6ad0: 46 69 6c 65 46 6d 74 29 21 3d 30 20 3f 0a 20 20  FileFmt)!=0 ?.  
6ae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6af0: 31 20 3a 20 53 51 4c 49 54 45 5f 4d 41 58 5f 46  1 : SQLITE_MAX_F
6b00: 49 4c 45 5f 46 4f 52 4d 41 54 3b 0a 20 20 20 20  ILE_FORMAT;.    
6b10: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
6b20: 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
6b30: 66 69 6c 65 46 6f 72 6d 61 74 2c 20 30 29 3b 0a  fileFormat, 0);.
6b40: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
6b50: 64 64 4f 70 28 76 2c 20 4f 50 5f 53 65 74 43 6f  ddOp(v, OP_SetCo
6b60: 6f 6b 69 65 2c 20 69 44 62 2c 20 31 29 3b 0a 20  okie, iDb, 1);. 
6b70: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
6b80: 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  dOp(v, OP_Intege
6b90: 72 2c 20 45 4e 43 28 64 62 29 2c 20 30 29 3b 0a  r, ENC(db), 0);.
6ba0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
6bb0: 64 64 4f 70 28 76 2c 20 4f 50 5f 53 65 74 43 6f  ddOp(v, OP_SetCo
6bc0: 6f 6b 69 65 2c 20 69 44 62 2c 20 34 29 3b 0a 20  okie, iDb, 4);. 
6bd0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
6be0: 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6c 62  solveLabel(v, lb
6bf0: 6c 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 69 73  l);..    /* This
6c00: 20 6a 75 73 74 20 63 72 65 61 74 65 73 20 61 20   just creates a 
6c10: 70 6c 61 63 65 2d 68 6f 6c 64 65 72 20 72 65 63  place-holder rec
6c20: 6f 72 64 20 69 6e 20 74 68 65 20 73 71 6c 69 74  ord in the sqlit
6c30: 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 2e 0a  e_master table..
6c40: 20 20 20 20 2a 2a 20 54 68 65 20 72 65 63 6f 72      ** The recor
6c50: 64 20 63 72 65 61 74 65 64 20 64 6f 65 73 20 6e  d created does n
6c60: 6f 74 20 63 6f 6e 74 61 69 6e 20 61 6e 79 74 68  ot contain anyth
6c70: 69 6e 67 20 79 65 74 2e 20 20 49 74 20 77 69 6c  ing yet.  It wil
6c80: 6c 20 62 65 20 72 65 70 6c 61 63 65 64 0a 20 20  l be replaced.  
6c90: 20 20 2a 2a 20 62 79 20 74 68 65 20 72 65 61 6c    ** by the real
6ca0: 20 65 6e 74 72 79 20 69 6e 20 63 6f 64 65 20 67   entry in code g
6cb0: 65 6e 65 72 61 74 65 64 20 61 74 20 73 71 6c 69  enerated at sqli
6cc0: 74 65 33 45 6e 64 54 61 62 6c 65 28 29 2e 0a 20  te3EndTable().. 
6cd0: 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65     **.    ** The
6ce0: 20 72 6f 77 69 64 20 66 6f 72 20 74 68 65 20 6e   rowid for the n
6cf0: 65 77 20 65 6e 74 72 79 20 69 73 20 6c 65 66 74  ew entry is left
6d00: 20 6f 6e 20 74 68 65 20 74 6f 70 20 6f 66 20 74   on the top of t
6d10: 68 65 20 73 74 61 63 6b 2e 0a 20 20 20 20 2a 2a  he stack..    **
6d20: 20 54 68 65 20 72 6f 77 69 64 20 76 61 6c 75 65   The rowid value
6d30: 20 69 73 20 6e 65 65 64 65 64 20 62 79 20 74 68   is needed by th
6d40: 65 20 63 6f 64 65 20 74 68 61 74 20 73 71 6c 69  e code that sqli
6d50: 74 65 33 45 6e 64 54 61 62 6c 65 20 77 69 6c 6c  te3EndTable will
6d60: 0a 20 20 20 20 2a 2a 20 67 65 6e 65 72 61 74 65  .    ** generate
6d70: 2e 0a 20 20 20 20 2a 2f 0a 23 69 66 20 21 64 65  ..    */.#if !de
6d80: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
6d90: 54 5f 56 49 45 57 29 20 7c 7c 20 21 64 65 66 69  T_VIEW) || !defi
6da0: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
6db0: 56 49 52 54 55 41 4c 54 41 42 4c 45 29 0a 20 20  VIRTUALTABLE).  
6dc0: 20 20 69 66 28 20 69 73 56 69 65 77 20 7c 7c 20    if( isView || 
6dd0: 69 73 56 69 72 74 75 61 6c 20 29 7b 0a 20 20 20  isVirtual ){.   
6de0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
6df0: 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  dOp(v, OP_Intege
6e00: 72 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d 65  r, 0, 0);.    }e
6e10: 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 7b  lse.#endif.    {
6e20: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
6e30: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 72  beAddOp(v, OP_Cr
6e40: 65 61 74 65 54 61 62 6c 65 2c 20 69 44 62 2c 20  eateTable, iDb, 
6e50: 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  0);.    }.    sq
6e60: 6c 69 74 65 33 4f 70 65 6e 4d 61 73 74 65 72 54  lite3OpenMasterT
6e70: 61 62 6c 65 28 70 50 61 72 73 65 2c 20 69 44 62  able(pParse, iDb
6e80: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
6e90: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 65  beAddOp(v, OP_Ne
6ea0: 77 52 6f 77 69 64 2c 20 30 2c 20 30 29 3b 0a 20  wRowid, 0, 0);. 
6eb0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
6ec0: 64 4f 70 28 76 2c 20 4f 50 5f 44 75 70 2c 20 30  dOp(v, OP_Dup, 0
6ed0: 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
6ee0: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
6ef0: 5f 4e 75 6c 6c 2c 20 30 2c 20 30 29 3b 0a 20 20  _Null, 0, 0);.  
6f00: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
6f10: 4f 70 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c  Op(v, OP_Insert,
6f20: 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69   0, 0);.    sqli
6f30: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
6f40: 4f 50 5f 43 6c 6f 73 65 2c 20 30 2c 20 30 29 3b  OP_Close, 0, 0);
6f50: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
6f60: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 75 6c 6c  AddOp(v, OP_Pull
6f70: 2c 20 31 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20  , 1, 0);.  }..  
6f80: 2f 2a 20 4e 6f 72 6d 61 6c 20 28 6e 6f 6e 2d 65  /* Normal (non-e
6f90: 72 72 6f 72 29 20 72 65 74 75 72 6e 2e 20 2a 2f  rror) return. */
6fa0: 0a 20 20 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a  .  return;..  /*
6fb0: 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
6fc0: 75 72 73 2c 20 77 65 20 6a 75 6d 70 20 68 65 72  urs, we jump her
6fd0: 65 20 2a 2f 0a 62 65 67 69 6e 5f 74 61 62 6c 65  e */.begin_table
6fe0: 5f 65 72 72 6f 72 3a 0a 20 20 73 71 6c 69 74 65  _error:.  sqlite
6ff0: 46 72 65 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 72  Free(zName);.  r
7000: 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  eturn;.}../*.** 
7010: 54 68 69 73 20 6d 61 63 72 6f 20 69 73 20 75 73  This macro is us
7020: 65 64 20 74 6f 20 63 6f 6d 70 61 72 65 20 74 77  ed to compare tw
7030: 6f 20 73 74 72 69 6e 67 73 20 69 6e 20 61 20 63  o strings in a c
7040: 61 73 65 2d 69 6e 73 65 6e 73 69 74 69 76 65 20  ase-insensitive 
7050: 6d 61 6e 6e 65 72 2e 0a 2a 2a 20 49 74 20 69 73  manner..** It is
7060: 20 73 6c 69 67 68 74 6c 79 20 66 61 73 74 65 72   slightly faster
7070: 20 74 68 61 6e 20 63 61 6c 6c 69 6e 67 20 73 71   than calling sq
7080: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 29 20 64  lite3StrICmp() d
7090: 69 72 65 63 74 6c 79 2c 20 62 75 74 0a 2a 2a 20  irectly, but.** 
70a0: 70 72 6f 64 75 63 65 73 20 6c 61 72 67 65 72 20  produces larger 
70b0: 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 57 41 52 4e  code..**.** WARN
70c0: 49 4e 47 3a 20 54 68 69 73 20 6d 61 63 72 6f 20  ING: This macro 
70d0: 69 73 20 6e 6f 74 20 63 6f 6d 70 61 74 69 62 6c  is not compatibl
70e0: 65 20 77 69 74 68 20 74 68 65 20 73 74 72 63 6d  e with the strcm
70f0: 70 28 29 20 66 61 6d 69 6c 79 2e 20 49 74 0a 2a  p() family. It.*
7100: 2a 20 72 65 74 75 72 6e 73 20 74 72 75 65 20 69  * returns true i
7110: 66 20 74 68 65 20 74 77 6f 20 73 74 72 69 6e 67  f the two string
7120: 73 20 61 72 65 20 65 71 75 61 6c 2c 20 6f 74 68  s are equal, oth
7130: 65 72 77 69 73 65 20 66 61 6c 73 65 2e 0a 2a 2f  erwise false..*/
7140: 0a 23 64 65 66 69 6e 65 20 53 54 52 49 43 4d 50  .#define STRICMP
7150: 28 78 2c 20 79 29 20 28 5c 0a 73 71 6c 69 74 65  (x, y) (\.sqlite
7160: 33 55 70 70 65 72 54 6f 4c 6f 77 65 72 5b 2a 28  3UpperToLower[*(
7170: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29  unsigned char *)
7180: 28 78 29 5d 3d 3d 20 20 20 5c 0a 73 71 6c 69 74  (x)]==   \.sqlit
7190: 65 33 55 70 70 65 72 54 6f 4c 6f 77 65 72 5b 2a  e3UpperToLower[*
71a0: 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a  (unsigned char *
71b0: 29 28 79 29 5d 20 20 20 20 20 5c 0a 26 26 20 73  )(y)]     \.&& s
71c0: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 28 78  qlite3StrICmp((x
71d0: 29 2b 31 2c 28 79 29 2b 31 29 3d 3d 30 20 29 0a  )+1,(y)+1)==0 ).
71e0: 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77  ./*.** Add a new
71f0: 20 63 6f 6c 75 6d 6e 20 74 6f 20 74 68 65 20 74   column to the t
7200: 61 62 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 62  able currently b
7210: 65 69 6e 67 20 63 6f 6e 73 74 72 75 63 74 65 64  eing constructed
7220: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 72 73  ..**.** The pars
7230: 65 72 20 63 61 6c 6c 73 20 74 68 69 73 20 72 6f  er calls this ro
7240: 75 74 69 6e 65 20 6f 6e 63 65 20 66 6f 72 20 65  utine once for e
7250: 61 63 68 20 63 6f 6c 75 6d 6e 20 64 65 63 6c 61  ach column decla
7260: 72 61 74 69 6f 6e 0a 2a 2a 20 69 6e 20 61 20 43  ration.** in a C
7270: 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74  REATE TABLE stat
7280: 65 6d 65 6e 74 2e 20 20 73 71 6c 69 74 65 33 53  ement.  sqlite3S
7290: 74 61 72 74 54 61 62 6c 65 28 29 20 67 65 74 73  tartTable() gets
72a0: 20 63 61 6c 6c 65 64 0a 2a 2a 20 66 69 72 73 74   called.** first
72b0: 20 74 6f 20 67 65 74 20 74 68 69 6e 67 73 20 67   to get things g
72c0: 6f 69 6e 67 2e 20 20 54 68 65 6e 20 74 68 69 73  oing.  Then this
72d0: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
72e0: 65 64 20 66 6f 72 20 65 61 63 68 0a 2a 2a 20 63  ed for each.** c
72f0: 6f 6c 75 6d 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73  olumn..*/.void s
7300: 71 6c 69 74 65 33 41 64 64 43 6f 6c 75 6d 6e 28  qlite3AddColumn(
7310: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54  Parse *pParse, T
7320: 6f 6b 65 6e 20 2a 70 4e 61 6d 65 29 7b 0a 20 20  oken *pName){.  
7330: 54 61 62 6c 65 20 2a 70 3b 0a 20 20 69 6e 74 20  Table *p;.  int 
7340: 69 3b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20  i;.  char *z;.  
7350: 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20  Column *pCol;.  
7360: 69 66 28 20 28 70 20 3d 20 70 50 61 72 73 65 2d  if( (p = pParse-
7370: 3e 70 4e 65 77 54 61 62 6c 65 29 3d 3d 30 20 29  >pNewTable)==0 )
7380: 20 72 65 74 75 72 6e 3b 0a 20 20 7a 20 3d 20 73   return;.  z = s
7390: 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f  qlite3NameFromTo
73a0: 6b 65 6e 28 70 4e 61 6d 65 29 3b 0a 20 20 69 66  ken(pName);.  if
73b0: 28 20 7a 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ( z==0 ) return;
73c0: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d  .  for(i=0; i<p-
73d0: 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nCol; i++){.   
73e0: 20 69 66 28 20 53 54 52 49 43 4d 50 28 7a 2c 20   if( STRICMP(z, 
73f0: 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65  p->aCol[i].zName
7400: 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ) ){.      sqlit
7410: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
7420: 65 2c 20 22 64 75 70 6c 69 63 61 74 65 20 63 6f  e, "duplicate co
7430: 6c 75 6d 6e 20 6e 61 6d 65 3a 20 25 73 22 2c 20  lumn name: %s", 
7440: 7a 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  z);.      sqlite
7450: 46 72 65 65 28 7a 29 3b 0a 20 20 20 20 20 20 72  Free(z);.      r
7460: 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d  eturn;.    }.  }
7470: 0a 20 20 69 66 28 20 28 70 2d 3e 6e 43 6f 6c 20  .  if( (p->nCol 
7480: 26 20 30 78 37 29 3d 3d 30 20 29 7b 0a 20 20 20  & 0x7)==0 ){.   
7490: 20 43 6f 6c 75 6d 6e 20 2a 61 4e 65 77 3b 0a 20   Column *aNew;. 
74a0: 20 20 20 61 4e 65 77 20 3d 20 73 71 6c 69 74 65     aNew = sqlite
74b0: 52 65 61 6c 6c 6f 63 28 20 70 2d 3e 61 43 6f 6c  Realloc( p->aCol
74c0: 2c 20 28 70 2d 3e 6e 43 6f 6c 2b 38 29 2a 73 69  , (p->nCol+8)*si
74d0: 7a 65 6f 66 28 70 2d 3e 61 43 6f 6c 5b 30 5d 29  zeof(p->aCol[0])
74e0: 29 3b 0a 20 20 20 20 69 66 28 20 61 4e 65 77 3d  );.    if( aNew=
74f0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
7500: 74 65 46 72 65 65 28 7a 29 3b 0a 20 20 20 20 20  teFree(z);.     
7510: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20   return;.    }. 
7520: 20 20 20 70 2d 3e 61 43 6f 6c 20 3d 20 61 4e 65     p->aCol = aNe
7530: 77 3b 0a 20 20 7d 0a 20 20 70 43 6f 6c 20 3d 20  w;.  }.  pCol = 
7540: 26 70 2d 3e 61 43 6f 6c 5b 70 2d 3e 6e 43 6f 6c  &p->aCol[p->nCol
7550: 5d 3b 0a 20 20 6d 65 6d 73 65 74 28 70 43 6f 6c  ];.  memset(pCol
7560: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 2d 3e 61  , 0, sizeof(p->a
7570: 43 6f 6c 5b 30 5d 29 29 3b 0a 20 20 70 43 6f 6c  Col[0]));.  pCol
7580: 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 3b 0a 20 0a 20  ->zName = z;. . 
7590: 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20   /* If there is 
75a0: 6e 6f 20 74 79 70 65 20 73 70 65 63 69 66 69 65  no type specifie
75b0: 64 2c 20 63 6f 6c 75 6d 6e 73 20 68 61 76 65 20  d, columns have 
75c0: 74 68 65 20 64 65 66 61 75 6c 74 20 61 66 66 69  the default affi
75d0: 6e 69 74 79 0a 20 20 2a 2a 20 27 4e 4f 4e 45 27  nity.  ** 'NONE'
75e0: 2e 20 49 66 20 74 68 65 72 65 20 69 73 20 61 20  . If there is a 
75f0: 74 79 70 65 20 73 70 65 63 69 66 69 65 64 2c 20  type specified, 
7600: 74 68 65 6e 20 73 71 6c 69 74 65 33 41 64 64 43  then sqlite3AddC
7610: 6f 6c 75 6d 6e 54 79 70 65 28 29 20 77 69 6c 6c  olumnType() will
7620: 0a 20 20 2a 2a 20 62 65 20 63 61 6c 6c 65 64 20  .  ** be called 
7630: 6e 65 78 74 20 74 6f 20 73 65 74 20 70 43 6f 6c  next to set pCol
7640: 2d 3e 61 66 66 69 6e 69 74 79 20 63 6f 72 72 65  ->affinity corre
7650: 63 74 6c 79 2e 0a 20 20 2a 2f 0a 20 20 70 43 6f  ctly..  */.  pCo
7660: 6c 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20 53 51  l->affinity = SQ
7670: 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20  LITE_AFF_NONE;. 
7680: 20 70 2d 3e 6e 43 6f 6c 2b 2b 3b 0a 7d 0a 0a 2f   p->nCol++;.}../
7690: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
76a0: 65 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74  e is called by t
76b0: 68 65 20 70 61 72 73 65 72 20 77 68 69 6c 65 20  he parser while 
76c0: 69 6e 20 74 68 65 20 6d 69 64 64 6c 65 20 6f 66  in the middle of
76d0: 0a 2a 2a 20 70 61 72 73 69 6e 67 20 61 20 43 52  .** parsing a CR
76e0: 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65  EATE TABLE state
76f0: 6d 65 6e 74 2e 20 20 41 20 22 4e 4f 54 20 4e 55  ment.  A "NOT NU
7700: 4c 4c 22 20 63 6f 6e 73 74 72 61 69 6e 74 20 68  LL" constraint h
7710: 61 73 0a 2a 2a 20 62 65 65 6e 20 73 65 65 6e 20  as.** been seen 
7720: 6f 6e 20 61 20 63 6f 6c 75 6d 6e 2e 20 20 54 68  on a column.  Th
7730: 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20  is routine sets 
7740: 74 68 65 20 6e 6f 74 4e 75 6c 6c 20 66 6c 61 67  the notNull flag
7750: 20 6f 6e 0a 2a 2a 20 74 68 65 20 63 6f 6c 75 6d   on.** the colum
7760: 6e 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65  n currently unde
7770: 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 0a  r construction..
7780: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 41  */.void sqlite3A
7790: 64 64 4e 6f 74 4e 75 6c 6c 28 50 61 72 73 65 20  ddNotNull(Parse 
77a0: 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 6f 6e 45  *pParse, int onE
77b0: 72 72 6f 72 29 7b 0a 20 20 54 61 62 6c 65 20 2a  rror){.  Table *
77c0: 70 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66  p;.  int i;.  if
77d0: 28 20 28 70 20 3d 20 70 50 61 72 73 65 2d 3e 70  ( (p = pParse->p
77e0: 4e 65 77 54 61 62 6c 65 29 3d 3d 30 20 29 20 72  NewTable)==0 ) r
77f0: 65 74 75 72 6e 3b 0a 20 20 69 20 3d 20 70 2d 3e  eturn;.  i = p->
7800: 6e 43 6f 6c 2d 31 3b 0a 20 20 69 66 28 20 69 3e  nCol-1;.  if( i>
7810: 3d 30 20 29 20 70 2d 3e 61 43 6f 6c 5b 69 5d 2e  =0 ) p->aCol[i].
7820: 6e 6f 74 4e 75 6c 6c 20 3d 20 6f 6e 45 72 72 6f  notNull = onErro
7830: 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 63 61 6e  r;.}../*.** Scan
7840: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 74 79 70 65   the column type
7850: 20 6e 61 6d 65 20 7a 54 79 70 65 20 28 6c 65 6e   name zType (len
7860: 67 74 68 20 6e 54 79 70 65 29 20 61 6e 64 20 72  gth nType) and r
7870: 65 74 75 72 6e 20 74 68 65 0a 2a 2a 20 61 73 73  eturn the.** ass
7880: 6f 63 69 61 74 65 64 20 61 66 66 69 6e 69 74 79  ociated affinity
7890: 20 74 79 70 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69   type..**.** Thi
78a0: 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 61  s routine does a
78b0: 20 63 61 73 65 2d 69 6e 64 65 70 65 6e 64 65 6e   case-independen
78c0: 74 20 73 65 61 72 63 68 20 6f 66 20 7a 54 79 70  t search of zTyp
78d0: 65 20 66 6f 72 20 74 68 65 20 0a 2a 2a 20 73 75  e for the .** su
78e0: 62 73 74 72 69 6e 67 73 20 69 6e 20 74 68 65 20  bstrings in the 
78f0: 66 6f 6c 6c 6f 77 69 6e 67 20 74 61 62 6c 65 2e  following table.
7900: 20 49 66 20 6f 6e 65 20 6f 66 20 74 68 65 20 73   If one of the s
7910: 75 62 73 74 72 69 6e 67 73 20 69 73 0a 2a 2a 20  ubstrings is.** 
7920: 66 6f 75 6e 64 2c 20 74 68 65 20 63 6f 72 72 65  found, the corre
7930: 73 70 6f 6e 64 69 6e 67 20 61 66 66 69 6e 69 74  sponding affinit
7940: 79 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49  y is returned. I
7950: 66 20 7a 54 79 70 65 20 63 6f 6e 74 61 69 6e 73  f zType contains
7960: 0a 2a 2a 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e  .** more than on
7970: 65 20 6f 66 20 74 68 65 20 73 75 62 73 74 72 69  e of the substri
7980: 6e 67 73 2c 20 65 6e 74 72 69 65 73 20 74 6f 77  ngs, entries tow
7990: 61 72 64 20 74 68 65 20 74 6f 70 20 6f 66 20 0a  ard the top of .
79a0: 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 74 61 6b  ** the table tak
79b0: 65 20 70 72 69 6f 72 69 74 79 2e 20 46 6f 72 20  e priority. For 
79c0: 65 78 61 6d 70 6c 65 2c 20 69 66 20 7a 54 79 70  example, if zTyp
79d0: 65 20 69 73 20 27 42 4c 4f 42 49 4e 54 27 2c 20  e is 'BLOBINT', 
79e0: 0a 2a 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f 49  .** SQLITE_AFF_I
79f0: 4e 54 45 47 45 52 20 69 73 20 72 65 74 75 72 6e  NTEGER is return
7a00: 65 64 2e 0a 2a 2a 0a 2a 2a 20 53 75 62 73 74 72  ed..**.** Substr
7a10: 69 6e 67 20 20 20 20 20 7c 20 41 66 66 69 6e 69  ing     | Affini
7a20: 74 79 0a 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ty.** ----------
7a30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7a40: 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 27 49 4e 54 27 20  ------.** 'INT' 
7a50: 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45          | SQLITE
7a60: 5f 41 46 46 5f 49 4e 54 45 47 45 52 0a 2a 2a 20  _AFF_INTEGER.** 
7a70: 27 43 48 41 52 27 20 20 20 20 20 20 20 20 7c 20  'CHAR'        | 
7a80: 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 0a  SQLITE_AFF_TEXT.
7a90: 2a 2a 20 27 43 4c 4f 42 27 20 20 20 20 20 20 20  ** 'CLOB'       
7aa0: 20 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45   | SQLITE_AFF_TE
7ab0: 58 54 0a 2a 2a 20 27 54 45 58 54 27 20 20 20 20  XT.** 'TEXT'    
7ac0: 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 41 46 46      | SQLITE_AFF
7ad0: 5f 54 45 58 54 0a 2a 2a 20 27 42 4c 4f 42 27 20  _TEXT.** 'BLOB' 
7ae0: 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f         | SQLITE_
7af0: 41 46 46 5f 4e 4f 4e 45 0a 2a 2a 20 27 52 45 41  AFF_NONE.** 'REA
7b00: 4c 27 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49  L'        | SQLI
7b10: 54 45 5f 41 46 46 5f 52 45 41 4c 0a 2a 2a 20 27  TE_AFF_REAL.** '
7b20: 46 4c 4f 41 27 20 20 20 20 20 20 20 20 7c 20 53  FLOA'        | S
7b30: 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 0a 2a  QLITE_AFF_REAL.*
7b40: 2a 20 27 44 4f 55 42 27 20 20 20 20 20 20 20 20  * 'DOUB'        
7b50: 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41  | SQLITE_AFF_REA
7b60: 4c 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 6e 65 20  L.**.** If none 
7b70: 6f 66 20 74 68 65 20 73 75 62 73 74 72 69 6e 67  of the substring
7b80: 73 20 69 6e 20 74 68 65 20 61 62 6f 76 65 20 74  s in the above t
7b90: 61 62 6c 65 20 61 72 65 20 66 6f 75 6e 64 2c 0a  able are found,.
7ba0: 2a 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55  ** SQLITE_AFF_NU
7bb0: 4d 45 52 49 43 20 69 73 20 72 65 74 75 72 6e 65  MERIC is returne
7bc0: 64 2e 0a 2a 2f 0a 63 68 61 72 20 73 71 6c 69 74  d..*/.char sqlit
7bd0: 65 33 41 66 66 69 6e 69 74 79 54 79 70 65 28 63  e3AffinityType(c
7be0: 6f 6e 73 74 20 54 6f 6b 65 6e 20 2a 70 54 79 70  onst Token *pTyp
7bf0: 65 29 7b 0a 20 20 75 33 32 20 68 20 3d 20 30 3b  e){.  u32 h = 0;
7c00: 0a 20 20 63 68 61 72 20 61 66 66 20 3d 20 53 51  .  char aff = SQ
7c10: 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43  LITE_AFF_NUMERIC
7c20: 3b 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e  ;.  const unsign
7c30: 65 64 20 63 68 61 72 20 2a 7a 49 6e 20 3d 20 70  ed char *zIn = p
7c40: 54 79 70 65 2d 3e 7a 3b 0a 20 20 63 6f 6e 73 74  Type->z;.  const
7c50: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
7c60: 7a 45 6e 64 20 3d 20 26 70 54 79 70 65 2d 3e 7a  zEnd = &pType->z
7c70: 5b 70 54 79 70 65 2d 3e 6e 5d 3b 0a 0a 20 20 77  [pType->n];..  w
7c80: 68 69 6c 65 28 20 7a 49 6e 21 3d 7a 45 6e 64 20  hile( zIn!=zEnd 
7c90: 29 7b 0a 20 20 20 20 68 20 3d 20 28 68 3c 3c 38  ){.    h = (h<<8
7ca0: 29 20 2b 20 73 71 6c 69 74 65 33 55 70 70 65 72  ) + sqlite3Upper
7cb0: 54 6f 4c 6f 77 65 72 5b 2a 7a 49 6e 5d 3b 0a 20  ToLower[*zIn];. 
7cc0: 20 20 20 7a 49 6e 2b 2b 3b 0a 20 20 20 20 69 66     zIn++;.    if
7cd0: 28 20 68 3d 3d 28 28 27 63 27 3c 3c 32 34 29 2b  ( h==(('c'<<24)+
7ce0: 28 27 68 27 3c 3c 31 36 29 2b 28 27 61 27 3c 3c  ('h'<<16)+('a'<<
7cf0: 38 29 2b 27 72 27 29 20 29 7b 20 20 20 20 20 20  8)+'r') ){      
7d00: 20 20 20 20 20 20 20 2f 2a 20 43 48 41 52 20 2a         /* CHAR *
7d10: 2f 0a 20 20 20 20 20 20 61 66 66 20 3d 20 53 51  /.      aff = SQ
7d20: 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 3b 20 0a  LITE_AFF_TEXT; .
7d30: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 68 3d      }else if( h=
7d40: 3d 28 28 27 63 27 3c 3c 32 34 29 2b 28 27 6c 27  =(('c'<<24)+('l'
7d50: 3c 3c 31 36 29 2b 28 27 6f 27 3c 3c 38 29 2b 27  <<16)+('o'<<8)+'
7d60: 62 27 29 20 29 7b 20 20 20 20 20 20 20 2f 2a 20  b') ){       /* 
7d70: 43 4c 4f 42 20 2a 2f 0a 20 20 20 20 20 20 61 66  CLOB */.      af
7d80: 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 54  f = SQLITE_AFF_T
7d90: 45 58 54 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  EXT;.    }else i
7da0: 66 28 20 68 3d 3d 28 28 27 74 27 3c 3c 32 34 29  f( h==(('t'<<24)
7db0: 2b 28 27 65 27 3c 3c 31 36 29 2b 28 27 78 27 3c  +('e'<<16)+('x'<
7dc0: 3c 38 29 2b 27 74 27 29 20 29 7b 20 20 20 20 20  <8)+'t') ){     
7dd0: 20 20 2f 2a 20 54 45 58 54 20 2a 2f 0a 20 20 20    /* TEXT */.   
7de0: 20 20 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f     aff = SQLITE_
7df0: 41 46 46 5f 54 45 58 54 3b 0a 20 20 20 20 7d 65  AFF_TEXT;.    }e
7e00: 6c 73 65 20 69 66 28 20 68 3d 3d 28 28 27 62 27  lse if( h==(('b'
7e10: 3c 3c 32 34 29 2b 28 27 6c 27 3c 3c 31 36 29 2b  <<24)+('l'<<16)+
7e20: 28 27 6f 27 3c 3c 38 29 2b 27 62 27 29 20 20 20  ('o'<<8)+'b')   
7e30: 20 20 20 20 20 20 20 2f 2a 20 42 4c 4f 42 20 2a         /* BLOB *
7e40: 2f 0a 20 20 20 20 20 20 20 20 26 26 20 28 61 66  /.        && (af
7e50: 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55  f==SQLITE_AFF_NU
7e60: 4d 45 52 49 43 20 7c 7c 20 61 66 66 3d 3d 53 51  MERIC || aff==SQ
7e70: 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 29 20 29  LITE_AFF_REAL) )
7e80: 7b 0a 20 20 20 20 20 20 61 66 66 20 3d 20 53 51  {.      aff = SQ
7e90: 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 23  LITE_AFF_NONE;.#
7ea0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
7eb0: 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e  IT_FLOATING_POIN
7ec0: 54 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  T.    }else if( 
7ed0: 68 3d 3d 28 28 27 72 27 3c 3c 32 34 29 2b 28 27  h==(('r'<<24)+('
7ee0: 65 27 3c 3c 31 36 29 2b 28 27 61 27 3c 3c 38 29  e'<<16)+('a'<<8)
7ef0: 2b 27 6c 27 29 20 20 20 20 20 20 20 20 20 20 2f  +'l')          /
7f00: 2a 20 52 45 41 4c 20 2a 2f 0a 20 20 20 20 20 20  * REAL */.      
7f10: 20 20 26 26 20 61 66 66 3d 3d 53 51 4c 49 54 45    && aff==SQLITE
7f20: 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20 29 7b 0a  _AFF_NUMERIC ){.
7f30: 20 20 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49        aff = SQLI
7f40: 54 45 5f 41 46 46 5f 52 45 41 4c 3b 0a 20 20 20  TE_AFF_REAL;.   
7f50: 20 7d 65 6c 73 65 20 69 66 28 20 68 3d 3d 28 28   }else if( h==((
7f60: 27 66 27 3c 3c 32 34 29 2b 28 27 6c 27 3c 3c 31  'f'<<24)+('l'<<1
7f70: 36 29 2b 28 27 6f 27 3c 3c 38 29 2b 27 61 27 29  6)+('o'<<8)+'a')
7f80: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 4c 4f            /* FLO
7f90: 41 20 2a 2f 0a 20 20 20 20 20 20 20 20 26 26 20  A */.        && 
7fa0: 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f  aff==SQLITE_AFF_
7fb0: 4e 55 4d 45 52 49 43 20 29 7b 0a 20 20 20 20 20  NUMERIC ){.     
7fc0: 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46   aff = SQLITE_AF
7fd0: 46 5f 52 45 41 4c 3b 0a 20 20 20 20 7d 65 6c 73  F_REAL;.    }els
7fe0: 65 20 69 66 28 20 68 3d 3d 28 28 27 64 27 3c 3c  e if( h==(('d'<<
7ff0: 32 34 29 2b 28 27 6f 27 3c 3c 31 36 29 2b 28 27  24)+('o'<<16)+('
8000: 75 27 3c 3c 38 29 2b 27 62 27 29 20 20 20 20 20  u'<<8)+'b')     
8010: 20 20 20 20 20 2f 2a 20 44 4f 55 42 20 2a 2f 0a       /* DOUB */.
8020: 20 20 20 20 20 20 20 20 26 26 20 61 66 66 3d 3d          && aff==
8030: 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52  SQLITE_AFF_NUMER
8040: 49 43 20 29 7b 0a 20 20 20 20 20 20 61 66 66 20  IC ){.      aff 
8050: 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41  = SQLITE_AFF_REA
8060: 4c 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 65  L;.#endif.    }e
8070: 6c 73 65 20 69 66 28 20 28 68 26 30 78 30 30 46  lse if( (h&0x00F
8080: 46 46 46 46 46 29 3d 3d 28 28 27 69 27 3c 3c 31  FFFFF)==(('i'<<1
8090: 36 29 2b 28 27 6e 27 3c 3c 38 29 2b 27 74 27 29  6)+('n'<<8)+'t')
80a0: 20 29 7b 20 20 20 20 2f 2a 20 49 4e 54 20 2a 2f   ){    /* INT */
80b0: 0a 20 20 20 20 20 20 61 66 66 20 3d 20 53 51 4c  .      aff = SQL
80c0: 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 3b  ITE_AFF_INTEGER;
80d0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
80e0: 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72    }.  }..  retur
80f0: 6e 20 61 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  n aff;.}../*.** 
8100: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
8110: 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20 70 61  called by the pa
8120: 72 73 65 72 20 77 68 69 6c 65 20 69 6e 20 74 68  rser while in th
8130: 65 20 6d 69 64 64 6c 65 20 6f 66 0a 2a 2a 20 70  e middle of.** p
8140: 61 72 73 69 6e 67 20 61 20 43 52 45 41 54 45 20  arsing a CREATE 
8150: 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e  TABLE statement.
8160: 20 20 54 68 65 20 70 46 69 72 73 74 20 74 6f 6b    The pFirst tok
8170: 65 6e 20 69 73 20 74 68 65 20 66 69 72 73 74 0a  en is the first.
8180: 2a 2a 20 74 6f 6b 65 6e 20 69 6e 20 74 68 65 20  ** token in the 
8190: 73 65 71 75 65 6e 63 65 20 6f 66 20 74 6f 6b 65  sequence of toke
81a0: 6e 73 20 74 68 61 74 20 64 65 73 63 72 69 62 65  ns that describe
81b0: 20 74 68 65 20 74 79 70 65 20 6f 66 20 74 68 65   the type of the
81c0: 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 63 75 72 72 65  .** column curre
81d0: 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74  ntly under const
81e0: 72 75 63 74 69 6f 6e 2e 20 20 20 70 4c 61 73 74  ruction.   pLast
81f0: 20 69 73 20 74 68 65 20 6c 61 73 74 20 74 6f 6b   is the last tok
8200: 65 6e 0a 2a 2a 20 69 6e 20 74 68 65 20 73 65 71  en.** in the seq
8210: 75 65 6e 63 65 2e 20 20 55 73 65 20 74 68 69 73  uence.  Use this
8220: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20   information to 
8230: 63 6f 6e 73 74 72 75 63 74 20 61 20 73 74 72 69  construct a stri
8240: 6e 67 0a 2a 2a 20 74 68 61 74 20 63 6f 6e 74 61  ng.** that conta
8250: 69 6e 73 20 74 68 65 20 74 79 70 65 6e 61 6d 65  ins the typename
8260: 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 61   of the column a
8270: 6e 64 20 73 74 6f 72 65 20 74 68 61 74 20 73 74  nd store that st
8280: 72 69 6e 67 0a 2a 2a 20 69 6e 20 7a 54 79 70 65  ring.** in zType
8290: 2e 0a 2a 2f 20 0a 76 6f 69 64 20 73 71 6c 69 74  ..*/ .void sqlit
82a0: 65 33 41 64 64 43 6f 6c 75 6d 6e 54 79 70 65 28  e3AddColumnType(
82b0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54  Parse *pParse, T
82c0: 6f 6b 65 6e 20 2a 70 54 79 70 65 29 7b 0a 20 20  oken *pType){.  
82d0: 54 61 62 6c 65 20 2a 70 3b 0a 20 20 69 6e 74 20  Table *p;.  int 
82e0: 69 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f  i;.  Column *pCo
82f0: 6c 3b 0a 0a 20 20 69 66 28 20 28 70 20 3d 20 70  l;..  if( (p = p
8300: 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
8310: 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  )==0 ) return;. 
8320: 20 69 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a   i = p->nCol-1;.
8330: 20 20 69 66 28 20 69 3c 30 20 29 20 72 65 74 75    if( i<0 ) retu
8340: 72 6e 3b 0a 20 20 70 43 6f 6c 20 3d 20 26 70 2d  rn;.  pCol = &p-
8350: 3e 61 43 6f 6c 5b 69 5d 3b 0a 20 20 73 71 6c 69  >aCol[i];.  sqli
8360: 74 65 46 72 65 65 28 70 43 6f 6c 2d 3e 7a 54 79  teFree(pCol->zTy
8370: 70 65 29 3b 0a 20 20 70 43 6f 6c 2d 3e 7a 54 79  pe);.  pCol->zTy
8380: 70 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65  pe = sqlite3Name
8390: 46 72 6f 6d 54 6f 6b 65 6e 28 70 54 79 70 65 29  FromToken(pType)
83a0: 3b 0a 20 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69  ;.  pCol->affini
83b0: 74 79 20 3d 20 73 71 6c 69 74 65 33 41 66 66 69  ty = sqlite3Affi
83c0: 6e 69 74 79 54 79 70 65 28 70 54 79 70 65 29 3b  nityType(pType);
83d0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 65 78  .}../*.** The ex
83e0: 70 72 65 73 73 69 6f 6e 20 69 73 20 74 68 65 20  pression is the 
83f0: 64 65 66 61 75 6c 74 20 76 61 6c 75 65 20 66 6f  default value fo
8400: 72 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e  r the most recen
8410: 74 6c 79 20 61 64 64 65 64 20 63 6f 6c 75 6d 6e  tly added column
8420: 0a 2a 2a 20 6f 66 20 74 68 65 20 74 61 62 6c 65  .** of the table
8430: 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72   currently under
8440: 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a   construction..*
8450: 2a 0a 2a 2a 20 44 65 66 61 75 6c 74 20 76 61 6c  *.** Default val
8460: 75 65 20 65 78 70 72 65 73 73 69 6f 6e 73 20 6d  ue expressions m
8470: 75 73 74 20 62 65 20 63 6f 6e 73 74 61 6e 74 2e  ust be constant.
8480: 20 20 52 61 69 73 65 20 61 6e 20 65 78 63 65 70    Raise an excep
8490: 74 69 6f 6e 20 69 66 20 74 68 69 73 0a 2a 2a 20  tion if this.** 
84a0: 69 73 20 6e 6f 74 20 74 68 65 20 63 61 73 65 2e  is not the case.
84b0: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
84c0: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 62 79  ine is called by
84d0: 20 74 68 65 20 70 61 72 73 65 72 20 77 68 69 6c   the parser whil
84e0: 65 20 69 6e 20 74 68 65 20 6d 69 64 64 6c 65 20  e in the middle 
84f0: 6f 66 0a 2a 2a 20 70 61 72 73 69 6e 67 20 61 20  of.** parsing a 
8500: 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61  CREATE TABLE sta
8510: 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20  tement..*/.void 
8520: 73 71 6c 69 74 65 33 41 64 64 44 65 66 61 75 6c  sqlite3AddDefaul
8530: 74 56 61 6c 75 65 28 50 61 72 73 65 20 2a 70 50  tValue(Parse *pP
8540: 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70  arse, Expr *pExp
8550: 72 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a  r){.  Table *p;.
8560: 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a    Column *pCol;.
8570: 20 20 69 66 28 20 28 70 20 3d 20 70 50 61 72 73    if( (p = pPars
8580: 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29 21 3d 30  e->pNewTable)!=0
8590: 20 29 7b 0a 20 20 20 20 70 43 6f 6c 20 3d 20 26   ){.    pCol = &
85a0: 28 70 2d 3e 61 43 6f 6c 5b 70 2d 3e 6e 43 6f 6c  (p->aCol[p->nCol
85b0: 2d 31 5d 29 3b 0a 20 20 20 20 69 66 28 20 21 73  -1]);.    if( !s
85c0: 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73  qlite3ExprIsCons
85d0: 74 61 6e 74 4f 72 46 75 6e 63 74 69 6f 6e 28 70  tantOrFunction(p
85e0: 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20 73  Expr) ){.      s
85f0: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
8600: 50 61 72 73 65 2c 20 22 64 65 66 61 75 6c 74 20  Parse, "default 
8610: 76 61 6c 75 65 20 6f 66 20 63 6f 6c 75 6d 6e 20  value of column 
8620: 5b 25 73 5d 20 69 73 20 6e 6f 74 20 63 6f 6e 73  [%s] is not cons
8630: 74 61 6e 74 22 2c 0a 20 20 20 20 20 20 20 20 20  tant",.         
8640: 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20   pCol->zName);. 
8650: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
8660: 45 78 70 72 20 2a 70 43 6f 70 79 3b 0a 20 20 20  Expr *pCopy;.   
8670: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65     sqlite3ExprDe
8680: 6c 65 74 65 28 70 43 6f 6c 2d 3e 70 44 66 6c 74  lete(pCol->pDflt
8690: 29 3b 0a 20 20 20 20 20 20 70 43 6f 6c 2d 3e 70  );.      pCol->p
86a0: 44 66 6c 74 20 3d 20 70 43 6f 70 79 20 3d 20 73  Dflt = pCopy = s
86b0: 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 70 45  qlite3ExprDup(pE
86c0: 78 70 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20  xpr);.      if( 
86d0: 70 43 6f 70 79 20 29 7b 0a 20 20 20 20 20 20 20  pCopy ){.       
86e0: 20 73 71 6c 69 74 65 33 54 6f 6b 65 6e 43 6f 70   sqlite3TokenCop
86f0: 79 28 26 70 43 6f 70 79 2d 3e 73 70 61 6e 2c 20  y(&pCopy->span, 
8700: 26 70 45 78 70 72 2d 3e 73 70 61 6e 29 3b 0a 20  &pExpr->span);. 
8710: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
8720: 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65  .  sqlite3ExprDe
8730: 6c 65 74 65 28 70 45 78 70 72 29 3b 0a 7d 0a 0a  lete(pExpr);.}..
8740: 2f 2a 0a 2a 2a 20 44 65 73 69 67 6e 61 74 65 20  /*.** Designate 
8750: 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20  the PRIMARY KEY 
8760: 66 6f 72 20 74 68 65 20 74 61 62 6c 65 2e 20 20  for the table.  
8770: 70 4c 69 73 74 20 69 73 20 61 20 6c 69 73 74 20  pList is a list 
8780: 6f 66 20 6e 61 6d 65 73 20 0a 2a 2a 20 6f 66 20  of names .** of 
8790: 63 6f 6c 75 6d 6e 73 20 74 68 61 74 20 66 6f 72  columns that for
87a0: 6d 20 74 68 65 20 70 72 69 6d 61 72 79 20 6b 65  m the primary ke
87b0: 79 2e 20 20 49 66 20 70 4c 69 73 74 20 69 73 20  y.  If pList is 
87c0: 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68 65 0a 2a  NULL, then the.*
87d0: 2a 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20  * most recently 
87e0: 61 64 64 65 64 20 63 6f 6c 75 6d 6e 20 6f 66 20  added column of 
87f0: 74 68 65 20 74 61 62 6c 65 20 69 73 20 74 68 65  the table is the
8800: 20 70 72 69 6d 61 72 79 20 6b 65 79 2e 0a 2a 2a   primary key..**
8810: 0a 2a 2a 20 41 20 74 61 62 6c 65 20 63 61 6e 20  .** A table can 
8820: 68 61 76 65 20 61 74 20 6d 6f 73 74 20 6f 6e 65  have at most one
8830: 20 70 72 69 6d 61 72 79 20 6b 65 79 2e 20 20 49   primary key.  I
8840: 66 20 74 68 65 20 74 61 62 6c 65 20 61 6c 72 65  f the table alre
8850: 61 64 79 20 68 61 73 0a 2a 2a 20 61 20 70 72 69  ady has.** a pri
8860: 6d 61 72 79 20 6b 65 79 20 28 61 6e 64 20 74 68  mary key (and th
8870: 69 73 20 69 73 20 74 68 65 20 73 65 63 6f 6e 64  is is the second
8880: 20 70 72 69 6d 61 72 79 20 6b 65 79 29 20 74 68   primary key) th
8890: 65 6e 20 63 72 65 61 74 65 20 61 6e 0a 2a 2a 20  en create an.** 
88a0: 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  error..**.** If 
88b0: 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20  the PRIMARY KEY 
88c0: 69 73 20 6f 6e 20 61 20 73 69 6e 67 6c 65 20 63  is on a single c
88d0: 6f 6c 75 6d 6e 20 77 68 6f 73 65 20 64 61 74 61  olumn whose data
88e0: 74 79 70 65 20 69 73 20 49 4e 54 45 47 45 52 2c  type is INTEGER,
88f0: 0a 2a 2a 20 74 68 65 6e 20 77 65 20 77 69 6c 6c  .** then we will
8900: 20 74 72 79 20 74 6f 20 75 73 65 20 74 68 61 74   try to use that
8910: 20 63 6f 6c 75 6d 6e 20 61 73 20 74 68 65 20 72   column as the r
8920: 6f 77 69 64 2e 20 20 53 65 74 20 74 68 65 20 54  owid.  Set the T
8930: 61 62 6c 65 2e 69 50 4b 65 79 0a 2a 2a 20 66 69  able.iPKey.** fi
8940: 65 6c 64 20 6f 66 20 74 68 65 20 74 61 62 6c 65  eld of the table
8950: 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74   under construct
8960: 69 6f 6e 20 74 6f 20 62 65 20 74 68 65 20 69 6e  ion to be the in
8970: 64 65 78 20 6f 66 20 74 68 65 0a 2a 2a 20 49 4e  dex of the.** IN
8980: 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45  TEGER PRIMARY KE
8990: 59 20 63 6f 6c 75 6d 6e 2e 20 20 54 61 62 6c 65  Y column.  Table
89a0: 2e 69 50 4b 65 79 20 69 73 20 73 65 74 20 74 6f  .iPKey is set to
89b0: 20 2d 31 20 69 66 20 74 68 65 72 65 20 69 73 0a   -1 if there is.
89c0: 2a 2a 20 6e 6f 20 49 4e 54 45 47 45 52 20 50 52  ** no INTEGER PR
89d0: 49 4d 41 52 59 20 4b 45 59 2e 0a 2a 2a 0a 2a 2a  IMARY KEY..**.**
89e0: 20 49 66 20 74 68 65 20 6b 65 79 20 69 73 20 6e   If the key is n
89f0: 6f 74 20 61 6e 20 49 4e 54 45 47 45 52 20 50 52  ot an INTEGER PR
8a00: 49 4d 41 52 59 20 4b 45 59 2c 20 74 68 65 6e 20  IMARY KEY, then 
8a10: 63 72 65 61 74 65 20 61 20 75 6e 69 71 75 65 0a  create a unique.
8a20: 2a 2a 20 69 6e 64 65 78 20 66 6f 72 20 74 68 65  ** index for the
8a30: 20 6b 65 79 2e 20 20 4e 6f 20 69 6e 64 65 78 20   key.  No index 
8a40: 69 73 20 63 72 65 61 74 65 64 20 66 6f 72 20 49  is created for I
8a50: 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b  NTEGER PRIMARY K
8a60: 45 59 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  EYs..*/.void sql
8a70: 69 74 65 33 41 64 64 50 72 69 6d 61 72 79 4b 65  ite3AddPrimaryKe
8a80: 79 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  y(.  Parse *pPar
8a90: 73 65 2c 20 20 20 20 2f 2a 20 50 61 72 73 69 6e  se,    /* Parsin
8aa0: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45  g context */.  E
8ab0: 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20  xprList *pList, 
8ac0: 20 2f 2a 20 4c 69 73 74 20 6f 66 20 66 69 65 6c   /* List of fiel
8ad0: 64 20 6e 61 6d 65 73 20 74 6f 20 62 65 20 69 6e  d names to be in
8ae0: 64 65 78 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6f  dexed */.  int o
8af0: 6e 45 72 72 6f 72 2c 20 20 20 20 20 20 2f 2a 20  nError,      /* 
8b00: 57 68 61 74 20 74 6f 20 64 6f 20 77 69 74 68 20  What to do with 
8b10: 61 20 75 6e 69 71 75 65 6e 65 73 73 20 63 6f 6e  a uniqueness con
8b20: 66 6c 69 63 74 20 2a 2f 0a 20 20 69 6e 74 20 61  flict */.  int a
8b30: 75 74 6f 49 6e 63 2c 20 20 20 20 20 20 2f 2a 20  utoInc,      /* 
8b40: 54 72 75 65 20 69 66 20 74 68 65 20 41 55 54 4f  True if the AUTO
8b50: 49 4e 43 52 45 4d 45 4e 54 20 6b 65 79 77 6f 72  INCREMENT keywor
8b60: 64 20 69 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a  d is present */.
8b70: 20 20 69 6e 74 20 73 6f 72 74 4f 72 64 65 72 20    int sortOrder 
8b80: 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 53 4f      /* SQLITE_SO
8b90: 5f 41 53 43 20 6f 72 20 53 51 4c 49 54 45 5f 53  _ASC or SQLITE_S
8ba0: 4f 5f 44 45 53 43 20 2a 2f 0a 29 7b 0a 20 20 54  O_DESC */.){.  T
8bb0: 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 50 61  able *pTab = pPa
8bc0: 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a  rse->pNewTable;.
8bd0: 20 20 63 68 61 72 20 2a 7a 54 79 70 65 20 3d 20    char *zType = 
8be0: 30 3b 0a 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20  0;.  int iCol = 
8bf0: 2d 31 2c 20 69 3b 0a 20 20 69 66 28 20 70 54 61  -1, i;.  if( pTa
8c00: 62 3d 3d 30 20 7c 7c 20 49 4e 5f 44 45 43 4c 41  b==0 || IN_DECLA
8c10: 52 45 5f 56 54 41 42 20 29 20 67 6f 74 6f 20 70  RE_VTAB ) goto p
8c20: 72 69 6d 61 72 79 5f 6b 65 79 5f 65 78 69 74 3b  rimary_key_exit;
8c30: 0a 20 20 69 66 28 20 70 54 61 62 2d 3e 68 61 73  .  if( pTab->has
8c40: 50 72 69 6d 4b 65 79 20 29 7b 0a 20 20 20 20 73  PrimKey ){.    s
8c50: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
8c60: 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20 22 74  Parse, .      "t
8c70: 61 62 6c 65 20 5c 22 25 73 5c 22 20 68 61 73 20  able \"%s\" has 
8c80: 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 70 72  more than one pr
8c90: 69 6d 61 72 79 20 6b 65 79 22 2c 20 70 54 61 62  imary key", pTab
8ca0: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 67 6f  ->zName);.    go
8cb0: 74 6f 20 70 72 69 6d 61 72 79 5f 6b 65 79 5f 65  to primary_key_e
8cc0: 78 69 74 3b 0a 20 20 7d 0a 20 20 70 54 61 62 2d  xit;.  }.  pTab-
8cd0: 3e 68 61 73 50 72 69 6d 4b 65 79 20 3d 20 31 3b  >hasPrimKey = 1;
8ce0: 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20  .  if( pList==0 
8cf0: 29 7b 0a 20 20 20 20 69 43 6f 6c 20 3d 20 70 54  ){.    iCol = pT
8d00: 61 62 2d 3e 6e 43 6f 6c 20 2d 20 31 3b 0a 20 20  ab->nCol - 1;.  
8d10: 20 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f    pTab->aCol[iCo
8d20: 6c 5d 2e 69 73 50 72 69 6d 4b 65 79 20 3d 20 31  l].isPrimKey = 1
8d30: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66  ;.  }else{.    f
8d40: 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d  or(i=0; i<pList-
8d50: 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
8d60: 20 20 20 20 66 6f 72 28 69 43 6f 6c 3d 30 3b 20      for(iCol=0; 
8d70: 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b  iCol<pTab->nCol;
8d80: 20 69 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20   iCol++){.      
8d90: 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72    if( sqlite3Str
8da0: 49 43 6d 70 28 70 4c 69 73 74 2d 3e 61 5b 69 5d  ICmp(pList->a[i]
8db0: 2e 7a 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 61 43  .zName, pTab->aC
8dc0: 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 29 3d  ol[iCol].zName)=
8dd0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
8de0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
8df0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
8e00: 66 28 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43  f( iCol<pTab->nC
8e10: 6f 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 70 54  ol ){.        pT
8e20: 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 69  ab->aCol[iCol].i
8e30: 73 50 72 69 6d 4b 65 79 20 3d 20 31 3b 0a 20 20  sPrimKey = 1;.  
8e40: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
8e50: 69 66 28 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72  if( pList->nExpr
8e60: 3e 31 20 29 20 69 43 6f 6c 20 3d 20 2d 31 3b 0a  >1 ) iCol = -1;.
8e70: 20 20 7d 0a 20 20 69 66 28 20 69 43 6f 6c 3e 3d    }.  if( iCol>=
8e80: 30 20 26 26 20 69 43 6f 6c 3c 70 54 61 62 2d 3e  0 && iCol<pTab->
8e90: 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 7a 54 79 70  nCol ){.    zTyp
8ea0: 65 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69  e = pTab->aCol[i
8eb0: 43 6f 6c 5d 2e 7a 54 79 70 65 3b 0a 20 20 7d 0a  Col].zType;.  }.
8ec0: 20 20 69 66 28 20 7a 54 79 70 65 20 26 26 20 73    if( zType && s
8ed0: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 54  qlite3StrICmp(zT
8ee0: 79 70 65 2c 20 22 49 4e 54 45 47 45 52 22 29 3d  ype, "INTEGER")=
8ef0: 3d 30 0a 20 20 20 20 20 20 20 20 26 26 20 73 6f  =0.        && so
8f00: 72 74 4f 72 64 65 72 3d 3d 53 51 4c 49 54 45 5f  rtOrder==SQLITE_
8f10: 53 4f 5f 41 53 43 20 29 7b 0a 20 20 20 20 70 54  SO_ASC ){.    pT
8f20: 61 62 2d 3e 69 50 4b 65 79 20 3d 20 69 43 6f 6c  ab->iPKey = iCol
8f30: 3b 0a 20 20 20 20 70 54 61 62 2d 3e 6b 65 79 43  ;.    pTab->keyC
8f40: 6f 6e 66 20 3d 20 6f 6e 45 72 72 6f 72 3b 0a 20  onf = onError;. 
8f50: 20 20 20 70 54 61 62 2d 3e 61 75 74 6f 49 6e 63     pTab->autoInc
8f60: 20 3d 20 61 75 74 6f 49 6e 63 3b 0a 20 20 7d 65   = autoInc;.  }e
8f70: 6c 73 65 20 69 66 28 20 61 75 74 6f 49 6e 63 20  lse if( autoInc 
8f80: 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ){.#ifndef SQLIT
8f90: 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 43 52 45  E_OMIT_AUTOINCRE
8fa0: 4d 45 4e 54 0a 20 20 20 20 73 71 6c 69 74 65 33  MENT.    sqlite3
8fb0: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
8fc0: 20 22 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 20   "AUTOINCREMENT 
8fd0: 69 73 20 6f 6e 6c 79 20 61 6c 6c 6f 77 65 64 20  is only allowed 
8fe0: 6f 6e 20 61 6e 20 22 0a 20 20 20 20 20 20 20 22  on an ".       "
8ff0: 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20  INTEGER PRIMARY 
9000: 4b 45 59 22 29 3b 0a 23 65 6e 64 69 66 0a 20 20  KEY");.#endif.  
9010: 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74  }else{.    sqlit
9020: 65 33 43 72 65 61 74 65 49 6e 64 65 78 28 70 50  e3CreateIndex(pP
9030: 61 72 73 65 2c 20 30 2c 20 30 2c 20 30 2c 20 70  arse, 0, 0, 0, p
9040: 4c 69 73 74 2c 20 6f 6e 45 72 72 6f 72 2c 20 30  List, onError, 0
9050: 2c 20 30 2c 20 73 6f 72 74 4f 72 64 65 72 2c 20  , 0, sortOrder, 
9060: 30 29 3b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20  0);.    pList = 
9070: 30 3b 0a 20 20 7d 0a 0a 70 72 69 6d 61 72 79 5f  0;.  }..primary_
9080: 6b 65 79 5f 65 78 69 74 3a 0a 20 20 73 71 6c 69  key_exit:.  sqli
9090: 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
90a0: 65 28 70 4c 69 73 74 29 3b 0a 20 20 72 65 74 75  e(pList);.  retu
90b0: 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64  rn;.}../*.** Add
90c0: 20 61 20 6e 65 77 20 43 48 45 43 4b 20 63 6f 6e   a new CHECK con
90d0: 73 74 72 61 69 6e 74 20 74 6f 20 74 68 65 20 74  straint to the t
90e0: 61 62 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 75  able currently u
90f0: 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f  nder constructio
9100: 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  n..*/.void sqlit
9110: 65 33 41 64 64 43 68 65 63 6b 43 6f 6e 73 74 72  e3AddCheckConstr
9120: 61 69 6e 74 28 0a 20 20 50 61 72 73 65 20 2a 70  aint(.  Parse *p
9130: 50 61 72 73 65 2c 20 20 20 20 2f 2a 20 50 61 72  Parse,    /* Par
9140: 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
9150: 20 20 45 78 70 72 20 2a 70 43 68 65 63 6b 45 78    Expr *pCheckEx
9160: 70 72 20 20 2f 2a 20 54 68 65 20 63 68 65 63 6b  pr  /* The check
9170: 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 29   expression */.)
9180: 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  {.#ifndef SQLITE
9190: 5f 4f 4d 49 54 5f 43 48 45 43 4b 0a 20 20 54 61  _OMIT_CHECK.  Ta
91a0: 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 50 61 72  ble *pTab = pPar
91b0: 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20  se->pNewTable;. 
91c0: 20 69 66 28 20 70 54 61 62 20 26 26 20 21 49 4e   if( pTab && !IN
91d0: 5f 44 45 43 4c 41 52 45 5f 56 54 41 42 20 29 7b  _DECLARE_VTAB ){
91e0: 0a 20 20 20 20 2f 2a 20 54 68 65 20 43 48 45 43  .    /* The CHEC
91f0: 4b 20 65 78 70 72 65 73 73 69 6f 6e 20 6d 75 73  K expression mus
9200: 74 20 62 65 20 64 75 70 6c 69 63 61 74 65 64 20  t be duplicated 
9210: 73 6f 20 74 68 61 74 20 74 6f 6b 65 6e 73 20 72  so that tokens r
9220: 65 66 65 72 0a 20 20 20 20 2a 2a 20 74 6f 20 6d  efer.    ** to m
9230: 61 6c 6c 6f 63 65 64 20 73 70 61 63 65 20 61 6e  alloced space an
9240: 64 20 6e 6f 74 20 74 68 65 20 28 65 70 68 65 6d  d not the (ephem
9250: 65 72 61 6c 29 20 74 65 78 74 20 6f 66 20 74 68  eral) text of th
9260: 65 20 43 52 45 41 54 45 20 54 41 42 4c 45 0a 20  e CREATE TABLE. 
9270: 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20     ** statement 
9280: 2a 2f 0a 20 20 20 20 70 54 61 62 2d 3e 70 43 68  */.    pTab->pCh
9290: 65 63 6b 20 3d 20 73 71 6c 69 74 65 33 45 78 70  eck = sqlite3Exp
92a0: 72 41 6e 64 28 70 54 61 62 2d 3e 70 43 68 65 63  rAnd(pTab->pChec
92b0: 6b 2c 20 73 71 6c 69 74 65 33 45 78 70 72 44 75  k, sqlite3ExprDu
92c0: 70 28 70 43 68 65 63 6b 45 78 70 72 29 29 3b 0a  p(pCheckExpr));.
92d0: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c    }.#endif.  sql
92e0: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 70  ite3ExprDelete(p
92f0: 43 68 65 63 6b 45 78 70 72 29 3b 0a 7d 0a 0a 2f  CheckExpr);.}../
9300: 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 63 6f 6c  *.** Set the col
9310: 6c 61 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 20  lation function 
9320: 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  of the most rece
9330: 6e 74 6c 79 20 70 61 72 73 65 64 20 74 61 62 6c  ntly parsed tabl
9340: 65 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 74 6f 20 74  e column.** to t
9350: 68 65 20 43 6f 6c 6c 53 65 71 20 67 69 76 65 6e  he CollSeq given
9360: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
9370: 33 41 64 64 43 6f 6c 6c 61 74 65 54 79 70 65 28  3AddCollateType(
9380: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 63  Parse *pParse, c
9390: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 79 70 65  onst char *zType
93a0: 2c 20 69 6e 74 20 6e 54 79 70 65 29 7b 0a 20 20  , int nType){.  
93b0: 54 61 62 6c 65 20 2a 70 3b 0a 20 20 69 6e 74 20  Table *p;.  int 
93c0: 69 3b 0a 0a 20 20 69 66 28 20 28 70 20 3d 20 70  i;..  if( (p = p
93d0: 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
93e0: 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  )==0 ) return;. 
93f0: 20 69 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a   i = p->nCol-1;.
9400: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 4c 6f  .  if( sqlite3Lo
9410: 63 61 74 65 43 6f 6c 6c 53 65 71 28 70 50 61 72  cateCollSeq(pPar
9420: 73 65 2c 20 7a 54 79 70 65 2c 20 6e 54 79 70 65  se, zType, nType
9430: 29 20 29 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a  ) ){.    Index *
9440: 70 49 64 78 3b 0a 20 20 20 20 70 2d 3e 61 43 6f  pIdx;.    p->aCo
9450: 6c 5b 69 5d 2e 7a 43 6f 6c 6c 20 3d 20 73 71 6c  l[i].zColl = sql
9460: 69 74 65 53 74 72 4e 44 75 70 28 7a 54 79 70 65  iteStrNDup(zType
9470: 2c 20 6e 54 79 70 65 29 3b 0a 20 20 0a 20 20 20  , nType);.  .   
9480: 20 2f 2a 20 49 66 20 74 68 65 20 63 6f 6c 75 6d   /* If the colum
9490: 6e 20 69 73 20 64 65 63 6c 61 72 65 64 20 61 73  n is declared as
94a0: 20 22 3c 6e 61 6d 65 3e 20 50 52 49 4d 41 52 59   "<name> PRIMARY
94b0: 20 4b 45 59 20 43 4f 4c 4c 41 54 45 20 3c 74 79   KEY COLLATE <ty
94c0: 70 65 3e 22 2c 0a 20 20 20 20 2a 2a 20 74 68 65  pe>",.    ** the
94d0: 6e 20 61 6e 20 69 6e 64 65 78 20 6d 61 79 20 68  n an index may h
94e0: 61 76 65 20 62 65 65 6e 20 63 72 65 61 74 65 64  ave been created
94f0: 20 6f 6e 20 74 68 69 73 20 63 6f 6c 75 6d 6e 20   on this column 
9500: 62 65 66 6f 72 65 20 74 68 65 0a 20 20 20 20 2a  before the.    *
9510: 2a 20 63 6f 6c 6c 61 74 69 6f 6e 20 74 79 70 65  * collation type
9520: 20 77 61 73 20 61 64 64 65 64 2e 20 43 6f 72 72   was added. Corr
9530: 65 63 74 20 74 68 69 73 20 69 66 20 69 74 20 69  ect this if it i
9540: 73 20 74 68 65 20 63 61 73 65 2e 0a 20 20 20 20  s the case..    
9550: 2a 2f 0a 20 20 20 20 66 6f 72 28 70 49 64 78 3d  */.    for(pIdx=
9560: 70 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b  p->pIndex; pIdx;
9570: 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78   pIdx=pIdx->pNex
9580: 74 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  t){.      assert
9590: 28 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3d  ( pIdx->nColumn=
95a0: 3d 31 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  =1 );.      if( 
95b0: 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 30  pIdx->aiColumn[0
95c0: 5d 3d 3d 69 20 29 7b 0a 20 20 20 20 20 20 20 20  ]==i ){.        
95d0: 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 30 5d 20  pIdx->azColl[0] 
95e0: 3d 20 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 43 6f  = p->aCol[i].zCo
95f0: 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ll;.      }.    
9600: 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  }.  }.}../*.** T
9610: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  his function ret
9620: 75 72 6e 73 20 74 68 65 20 63 6f 6c 6c 61 74 69  urns the collati
9630: 6f 6e 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20  on sequence for 
9640: 64 61 74 61 62 61 73 65 20 6e 61 74 69 76 65 20  database native 
9650: 74 65 78 74 0a 2a 2a 20 65 6e 63 6f 64 69 6e 67  text.** encoding
9660: 20 69 64 65 6e 74 69 66 69 65 64 20 62 79 20 74   identified by t
9670: 68 65 20 73 74 72 69 6e 67 20 7a 4e 61 6d 65 2c  he string zName,
9680: 20 6c 65 6e 67 74 68 20 6e 4e 61 6d 65 2e 0a 2a   length nName..*
9690: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 72 65 71 75  *.** If the requ
96a0: 65 73 74 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 20  ested collation 
96b0: 73 65 71 75 65 6e 63 65 20 69 73 20 6e 6f 74 20  sequence is not 
96c0: 61 76 61 69 6c 61 62 6c 65 2c 20 6f 72 20 6e 6f  available, or no
96d0: 74 20 61 76 61 69 6c 61 62 6c 65 0a 2a 2a 20 69  t available.** i
96e0: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6e  n the database n
96f0: 61 74 69 76 65 20 65 6e 63 6f 64 69 6e 67 2c 20  ative encoding, 
9700: 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 61  the collation fa
9710: 63 74 6f 72 79 20 69 73 20 69 6e 76 6f 6b 65 64  ctory is invoked
9720: 20 74 6f 0a 2a 2a 20 72 65 71 75 65 73 74 20 69   to.** request i
9730: 74 2e 20 49 66 20 74 68 65 20 63 6f 6c 6c 61 74  t. If the collat
9740: 69 6f 6e 20 66 61 63 74 6f 72 79 20 64 6f 65 73  ion factory does
9750: 20 6e 6f 74 20 73 75 70 70 6c 79 20 73 75 63 68   not supply such
9760: 20 61 20 73 65 71 75 65 6e 63 65 2c 0a 2a 2a 20   a sequence,.** 
9770: 61 6e 64 20 74 68 65 20 73 65 71 75 65 6e 63 65  and the sequence
9780: 20 69 73 20 61 76 61 69 6c 61 62 6c 65 20 69 6e   is available in
9790: 20 61 6e 6f 74 68 65 72 20 74 65 78 74 20 65 6e   another text en
97a0: 63 6f 64 69 6e 67 2c 20 74 68 65 6e 20 74 68 61  coding, then tha
97b0: 74 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64  t is.** returned
97c0: 20 69 6e 73 74 65 61 64 2e 0a 2a 2a 0a 2a 2a 20   instead..**.** 
97d0: 49 66 20 6e 6f 20 76 65 72 73 69 6f 6e 73 20 6f  If no versions o
97e0: 66 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  f the requested 
97f0: 63 6f 6c 6c 61 74 69 6f 6e 73 20 73 65 71 75 65  collations seque
9800: 6e 63 65 20 61 72 65 20 61 76 61 69 6c 61 62 6c  nce are availabl
9810: 65 2c 20 6f 72 0a 2a 2a 20 61 6e 6f 74 68 65 72  e, or.** another
9820: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 4e   error occurs, N
9830: 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64 20  ULL is returned 
9840: 61 6e 64 20 61 6e 20 65 72 72 6f 72 20 6d 65 73  and an error mes
9850: 73 61 67 65 20 77 72 69 74 74 65 6e 20 69 6e 74  sage written int
9860: 6f 0a 2a 2a 20 70 50 61 72 73 65 2e 0a 2a 2a 0a  o.** pParse..**.
9870: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
9880: 69 73 20 61 20 77 72 61 70 70 65 72 20 61 72 6f  is a wrapper aro
9890: 75 6e 64 20 73 71 6c 69 74 65 33 46 69 6e 64 43  und sqlite3FindC
98a0: 6f 6c 6c 53 65 71 28 29 2e 20 20 54 68 69 73 20  ollSeq().  This 
98b0: 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 6e 76 6f 6b  routine.** invok
98c0: 65 73 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e  es the collation
98d0: 20 66 61 63 74 6f 72 79 20 69 66 20 74 68 65 20   factory if the 
98e0: 6e 61 6d 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 20  named collation 
98f0: 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64 0a  cannot be found.
9900: 2a 2a 20 61 6e 64 20 67 65 6e 65 72 61 74 65 73  ** and generates
9910: 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67   an error messag
9920: 65 2e 0a 2a 2f 0a 43 6f 6c 6c 53 65 71 20 2a 73  e..*/.CollSeq *s
9930: 71 6c 69 74 65 33 4c 6f 63 61 74 65 43 6f 6c 6c  qlite3LocateColl
9940: 53 65 71 28 50 61 72 73 65 20 2a 70 50 61 72 73  Seq(Parse *pPars
9950: 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  e, const char *z
9960: 4e 61 6d 65 2c 20 69 6e 74 20 6e 4e 61 6d 65 29  Name, int nName)
9970: 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  {.  sqlite3 *db 
9980: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
9990: 75 38 20 65 6e 63 20 3d 20 45 4e 43 28 64 62 29  u8 enc = ENC(db)
99a0: 3b 0a 20 20 75 38 20 69 6e 69 74 62 75 73 79 20  ;.  u8 initbusy 
99b0: 3d 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3b  = db->init.busy;
99c0: 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c  .  CollSeq *pCol
99d0: 6c 3b 0a 0a 20 20 70 43 6f 6c 6c 20 3d 20 73 71  l;..  pColl = sq
99e0: 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71  lite3FindCollSeq
99f0: 28 64 62 2c 20 65 6e 63 2c 20 7a 4e 61 6d 65 2c  (db, enc, zName,
9a00: 20 6e 4e 61 6d 65 2c 20 69 6e 69 74 62 75 73 79   nName, initbusy
9a10: 29 3b 0a 20 20 69 66 28 20 21 69 6e 69 74 62 75  );.  if( !initbu
9a20: 73 79 20 26 26 20 28 21 70 43 6f 6c 6c 20 7c 7c  sy && (!pColl ||
9a30: 20 21 70 43 6f 6c 6c 2d 3e 78 43 6d 70 29 20 29   !pColl->xCmp) )
9a40: 7b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71  {.    pColl = sq
9a50: 6c 69 74 65 33 47 65 74 43 6f 6c 6c 53 65 71 28  lite3GetCollSeq(
9a60: 64 62 2c 20 70 43 6f 6c 6c 2c 20 7a 4e 61 6d 65  db, pColl, zName
9a70: 2c 20 6e 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66  , nName);.    if
9a80: 28 20 21 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20  ( !pColl ){.    
9a90: 20 20 69 66 28 20 6e 4e 61 6d 65 3c 30 20 29 7b    if( nName<0 ){
9aa0: 0a 20 20 20 20 20 20 20 20 6e 4e 61 6d 65 20 3d  .        nName =
9ab0: 20 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 3b 0a   strlen(zName);.
9ac0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
9ad0: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
9ae0: 61 72 73 65 2c 20 22 6e 6f 20 73 75 63 68 20 63  arse, "no such c
9af0: 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
9b00: 65 3a 20 25 2e 2a 73 22 2c 20 6e 4e 61 6d 65 2c  e: %.*s", nName,
9b10: 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 70   zName);.      p
9b20: 43 6f 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  Coll = 0;.    }.
9b30: 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 43    }..  return pC
9b40: 6f 6c 6c 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47  oll;.}.../*.** G
9b50: 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61  enerate code tha
9b60: 74 20 77 69 6c 6c 20 69 6e 63 72 65 6d 65 6e 74  t will increment
9b70: 20 74 68 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b   the schema cook
9b80: 69 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 63  ie..**.** The sc
9b90: 68 65 6d 61 20 63 6f 6f 6b 69 65 20 69 73 20 75  hema cookie is u
9ba0: 73 65 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  sed to determine
9bb0: 20 77 68 65 6e 20 74 68 65 20 73 63 68 65 6d 61   when the schema
9bc0: 20 66 6f 72 20 74 68 65 0a 2a 2a 20 64 61 74 61   for the.** data
9bd0: 62 61 73 65 20 63 68 61 6e 67 65 73 2e 20 20 41  base changes.  A
9be0: 66 74 65 72 20 65 61 63 68 20 73 63 68 65 6d 61  fter each schema
9bf0: 20 63 68 61 6e 67 65 2c 20 74 68 65 20 63 6f 6f   change, the coo
9c00: 6b 69 65 20 76 61 6c 75 65 0a 2a 2a 20 63 68 61  kie value.** cha
9c10: 6e 67 65 73 2e 20 20 57 68 65 6e 20 61 20 70 72  nges.  When a pr
9c20: 6f 63 65 73 73 20 66 69 72 73 74 20 72 65 61 64  ocess first read
9c30: 73 20 74 68 65 20 73 63 68 65 6d 61 20 69 74 20  s the schema it 
9c40: 72 65 63 6f 72 64 73 20 74 68 65 0a 2a 2a 20 63  records the.** c
9c50: 6f 6f 6b 69 65 2e 20 20 54 68 65 72 65 61 66 74  ookie.  Thereaft
9c60: 65 72 2c 20 77 68 65 6e 65 76 65 72 20 69 74 20  er, whenever it 
9c70: 67 6f 65 73 20 74 6f 20 61 63 63 65 73 73 20 74  goes to access t
9c80: 68 65 20 64 61 74 61 62 61 73 65 2c 0a 2a 2a 20  he database,.** 
9c90: 69 74 20 63 68 65 63 6b 73 20 74 68 65 20 63 6f  it checks the co
9ca0: 6f 6b 69 65 20 74 6f 20 6d 61 6b 65 20 73 75 72  okie to make sur
9cb0: 65 20 74 68 65 20 73 63 68 65 6d 61 20 68 61 73  e the schema has
9cc0: 20 6e 6f 74 20 63 68 61 6e 67 65 64 0a 2a 2a 20   not changed.** 
9cd0: 73 69 6e 63 65 20 69 74 20 77 61 73 20 6c 61 73  since it was las
9ce0: 74 20 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  t read..**.** Th
9cf0: 69 73 20 70 6c 61 6e 20 69 73 20 6e 6f 74 20 63  is plan is not c
9d00: 6f 6d 70 6c 65 74 65 6c 79 20 62 75 6c 6c 65 74  ompletely bullet
9d10: 2d 70 72 6f 6f 66 2e 20 20 49 74 20 69 73 20 70  -proof.  It is p
9d20: 6f 73 73 69 62 6c 65 20 66 6f 72 0a 2a 2a 20 74  ossible for.** t
9d30: 68 65 20 73 63 68 65 6d 61 20 74 6f 20 63 68 61  he schema to cha
9d40: 6e 67 65 20 6d 75 6c 74 69 70 6c 65 20 74 69 6d  nge multiple tim
9d50: 65 73 20 61 6e 64 20 66 6f 72 20 74 68 65 20 63  es and for the c
9d60: 6f 6f 6b 69 65 20 74 6f 20 62 65 0a 2a 2a 20 73  ookie to be.** s
9d70: 65 74 20 62 61 63 6b 20 74 6f 20 70 72 69 6f 72  et back to prior
9d80: 20 76 61 6c 75 65 2e 20 20 42 75 74 20 73 63 68   value.  But sch
9d90: 65 6d 61 20 63 68 61 6e 67 65 73 20 61 72 65 20  ema changes are 
9da0: 69 6e 66 72 65 71 75 65 6e 74 0a 2a 2a 20 61 6e  infrequent.** an
9db0: 64 20 74 68 65 20 70 72 6f 62 61 62 69 6c 69 74  d the probabilit
9dc0: 79 20 6f 66 20 68 69 74 74 69 6e 67 20 74 68 65  y of hitting the
9dd0: 20 73 61 6d 65 20 63 6f 6f 6b 69 65 20 76 61 6c   same cookie val
9de0: 75 65 20 69 73 20 6f 6e 6c 79 0a 2a 2a 20 31 20  ue is only.** 1 
9df0: 63 68 61 6e 63 65 20 69 6e 20 32 5e 33 32 2e 20  chance in 2^32. 
9e00: 20 53 6f 20 77 65 27 72 65 20 73 61 66 65 20 65   So we're safe e
9e10: 6e 6f 75 67 68 2e 0a 2a 2f 0a 76 6f 69 64 20 73  nough..*/.void s
9e20: 71 6c 69 74 65 33 43 68 61 6e 67 65 43 6f 6f 6b  qlite3ChangeCook
9e30: 69 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  ie(sqlite3 *db, 
9e40: 56 64 62 65 20 2a 76 2c 20 69 6e 74 20 69 44 62  Vdbe *v, int iDb
9e50: 29 7b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  ){.  sqlite3Vdbe
9e60: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65  AddOp(v, OP_Inte
9e70: 67 65 72 2c 20 64 62 2d 3e 61 44 62 5b 69 44 62  ger, db->aDb[iDb
9e80: 5d 2e 70 53 63 68 65 6d 61 2d 3e 73 63 68 65 6d  ].pSchema->schem
9e90: 61 5f 63 6f 6f 6b 69 65 2b 31 2c 20 30 29 3b 0a  a_cookie+1, 0);.
9ea0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
9eb0: 4f 70 28 76 2c 20 4f 50 5f 53 65 74 43 6f 6f 6b  Op(v, OP_SetCook
9ec0: 69 65 2c 20 69 44 62 2c 20 30 29 3b 0a 7d 0a 0a  ie, iDb, 0);.}..
9ed0: 2f 2a 0a 2a 2a 20 4d 65 61 73 75 72 65 20 74 68  /*.** Measure th
9ee0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 68 61 72  e number of char
9ef0: 61 63 74 65 72 73 20 6e 65 65 64 65 64 20 74 6f  acters needed to
9f00: 20 6f 75 74 70 75 74 20 74 68 65 20 67 69 76 65   output the give
9f10: 6e 0a 2a 2a 20 69 64 65 6e 74 69 66 69 65 72 2e  n.** identifier.
9f20: 20 20 54 68 65 20 6e 75 6d 62 65 72 20 72 65 74    The number ret
9f30: 75 72 6e 65 64 20 69 6e 63 6c 75 64 65 73 20 61  urned includes a
9f40: 6e 79 20 71 75 6f 74 65 73 20 75 73 65 64 0a 2a  ny quotes used.*
9f50: 2a 20 62 75 74 20 64 6f 65 73 20 6e 6f 74 20 69  * but does not i
9f60: 6e 63 6c 75 64 65 20 74 68 65 20 6e 75 6c 6c 20  nclude the null 
9f70: 74 65 72 6d 69 6e 61 74 6f 72 2e 0a 2a 2a 0a 2a  terminator..**.*
9f80: 2a 20 54 68 65 20 65 73 74 69 6d 61 74 65 20 69  * The estimate i
9f90: 73 20 63 6f 6e 73 65 72 76 61 74 69 76 65 2e 20  s conservative. 
9fa0: 20 49 74 20 6d 69 67 68 74 20 62 65 20 6c 61 72   It might be lar
9fb0: 67 65 72 20 74 68 61 74 20 77 68 61 74 20 69 73  ger that what is
9fc0: 0a 2a 2a 20 72 65 61 6c 6c 79 20 6e 65 65 64 65  .** really neede
9fd0: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
9fe0: 20 69 64 65 6e 74 4c 65 6e 67 74 68 28 63 6f 6e   identLength(con
9ff0: 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20 69  st char *z){.  i
a000: 6e 74 20 6e 3b 0a 20 20 66 6f 72 28 6e 3d 30 3b  nt n;.  for(n=0;
a010: 20 2a 7a 3b 20 6e 2b 2b 2c 20 7a 2b 2b 29 7b 0a   *z; n++, z++){.
a020: 20 20 20 20 69 66 28 20 2a 7a 3d 3d 27 22 27 20      if( *z=='"' 
a030: 29 7b 20 6e 2b 2b 3b 20 7d 0a 20 20 7d 0a 20 20  ){ n++; }.  }.  
a040: 72 65 74 75 72 6e 20 6e 20 2b 20 32 3b 0a 7d 0a  return n + 2;.}.
a050: 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61 6e 20  ./*.** Write an 
a060: 69 64 65 6e 74 69 66 69 65 72 20 6f 6e 74 6f 20  identifier onto 
a070: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 67  the end of the g
a080: 69 76 65 6e 20 73 74 72 69 6e 67 2e 20 20 41 64  iven string.  Ad
a090: 64 0a 2a 2a 20 71 75 6f 74 65 20 63 68 61 72 61  d.** quote chara
a0a0: 63 74 65 72 73 20 61 73 20 6e 65 65 64 65 64 2e  cters as needed.
a0b0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
a0c0: 69 64 65 6e 74 50 75 74 28 63 68 61 72 20 2a 7a  identPut(char *z
a0d0: 2c 20 69 6e 74 20 2a 70 49 64 78 2c 20 63 68 61  , int *pIdx, cha
a0e0: 72 20 2a 7a 53 69 67 6e 65 64 49 64 65 6e 74 29  r *zSignedIdent)
a0f0: 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  {.  unsigned cha
a100: 72 20 2a 7a 49 64 65 6e 74 20 3d 20 28 75 6e 73  r *zIdent = (uns
a110: 69 67 6e 65 64 20 63 68 61 72 2a 29 7a 53 69 67  igned char*)zSig
a120: 6e 65 64 49 64 65 6e 74 3b 0a 20 20 69 6e 74 20  nedIdent;.  int 
a130: 69 2c 20 6a 2c 20 6e 65 65 64 51 75 6f 74 65 3b  i, j, needQuote;
a140: 0a 20 20 69 20 3d 20 2a 70 49 64 78 3b 0a 20 20  .  i = *pIdx;.  
a150: 66 6f 72 28 6a 3d 30 3b 20 7a 49 64 65 6e 74 5b  for(j=0; zIdent[
a160: 6a 5d 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 69 66  j]; j++){.    if
a170: 28 20 21 69 73 61 6c 6e 75 6d 28 7a 49 64 65 6e  ( !isalnum(zIden
a180: 74 5b 6a 5d 29 20 26 26 20 7a 49 64 65 6e 74 5b  t[j]) && zIdent[
a190: 6a 5d 21 3d 27 5f 27 20 29 20 62 72 65 61 6b 3b  j]!='_' ) break;
a1a0: 0a 20 20 7d 0a 20 20 6e 65 65 64 51 75 6f 74 65  .  }.  needQuote
a1b0: 20 3d 20 20 7a 49 64 65 6e 74 5b 6a 5d 21 3d 30   =  zIdent[j]!=0
a1c0: 20 7c 7c 20 69 73 64 69 67 69 74 28 7a 49 64 65   || isdigit(zIde
a1d0: 6e 74 5b 30 5d 29 0a 20 20 20 20 20 20 20 20 20  nt[0]).         
a1e0: 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69           || sqli
a1f0: 74 65 33 4b 65 79 77 6f 72 64 43 6f 64 65 28 7a  te3KeywordCode(z
a200: 49 64 65 6e 74 2c 20 6a 29 21 3d 54 4b 5f 49 44  Ident, j)!=TK_ID
a210: 3b 0a 20 20 69 66 28 20 6e 65 65 64 51 75 6f 74  ;.  if( needQuot
a220: 65 20 29 20 7a 5b 69 2b 2b 5d 20 3d 20 27 22 27  e ) z[i++] = '"'
a230: 3b 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 7a 49 64  ;.  for(j=0; zId
a240: 65 6e 74 5b 6a 5d 3b 20 6a 2b 2b 29 7b 0a 20 20  ent[j]; j++){.  
a250: 20 20 7a 5b 69 2b 2b 5d 20 3d 20 7a 49 64 65 6e    z[i++] = zIden
a260: 74 5b 6a 5d 3b 0a 20 20 20 20 69 66 28 20 7a 49  t[j];.    if( zI
a270: 64 65 6e 74 5b 6a 5d 3d 3d 27 22 27 20 29 20 7a  dent[j]=='"' ) z
a280: 5b 69 2b 2b 5d 20 3d 20 27 22 27 3b 0a 20 20 7d  [i++] = '"';.  }
a290: 0a 20 20 69 66 28 20 6e 65 65 64 51 75 6f 74 65  .  if( needQuote
a2a0: 20 29 20 7a 5b 69 2b 2b 5d 20 3d 20 27 22 27 3b   ) z[i++] = '"';
a2b0: 0a 20 20 7a 5b 69 5d 20 3d 20 30 3b 0a 20 20 2a  .  z[i] = 0;.  *
a2c0: 70 49 64 78 20 3d 20 69 3b 0a 7d 0a 0a 2f 2a 0a  pIdx = i;.}../*.
a2d0: 2a 2a 20 47 65 6e 65 72 61 74 65 20 61 20 43 52  ** Generate a CR
a2e0: 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65  EATE TABLE state
a2f0: 6d 65 6e 74 20 61 70 70 72 6f 70 72 69 61 74 65  ment appropriate
a300: 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 0a 2a   for the given.*
a310: 2a 20 74 61 62 6c 65 2e 20 20 4d 65 6d 6f 72 79  * table.  Memory
a320: 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 74 65 78   to hold the tex
a330: 74 20 6f 66 20 74 68 65 20 73 74 61 74 65 6d 65  t of the stateme
a340: 6e 74 20 69 73 20 6f 62 74 61 69 6e 65 64 0a 2a  nt is obtained.*
a350: 2a 20 66 72 6f 6d 20 73 71 6c 69 74 65 4d 61 6c  * from sqliteMal
a360: 6c 6f 63 28 29 20 61 6e 64 20 6d 75 73 74 20 62  loc() and must b
a370: 65 20 66 72 65 65 64 20 62 79 20 74 68 65 20 63  e freed by the c
a380: 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 2e  alling function.
a390: 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20  .*/.static char 
a3a0: 2a 63 72 65 61 74 65 54 61 62 6c 65 53 74 6d 74  *createTableStmt
a3b0: 28 54 61 62 6c 65 20 2a 70 2c 20 69 6e 74 20 69  (Table *p, int i
a3c0: 73 54 65 6d 70 29 7b 0a 20 20 69 6e 74 20 69 2c  sTemp){.  int i,
a3d0: 20 6b 2c 20 6e 3b 0a 20 20 63 68 61 72 20 2a 7a   k, n;.  char *z
a3e0: 53 74 6d 74 3b 0a 20 20 63 68 61 72 20 2a 7a 53  Stmt;.  char *zS
a3f0: 65 70 2c 20 2a 7a 53 65 70 32 2c 20 2a 7a 45 6e  ep, *zSep2, *zEn
a400: 64 2c 20 2a 7a 3b 0a 20 20 43 6f 6c 75 6d 6e 20  d, *z;.  Column 
a410: 2a 70 43 6f 6c 3b 0a 20 20 6e 20 3d 20 30 3b 0a  *pCol;.  n = 0;.
a420: 20 20 66 6f 72 28 70 43 6f 6c 20 3d 20 70 2d 3e    for(pCol = p->
a430: 61 43 6f 6c 2c 20 69 3d 30 3b 20 69 3c 70 2d 3e  aCol, i=0; i<p->
a440: 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b  nCol; i++, pCol+
a450: 2b 29 7b 0a 20 20 20 20 6e 20 2b 3d 20 69 64 65  +){.    n += ide
a460: 6e 74 4c 65 6e 67 74 68 28 70 43 6f 6c 2d 3e 7a  ntLength(pCol->z
a470: 4e 61 6d 65 29 3b 0a 20 20 20 20 7a 20 3d 20 70  Name);.    z = p
a480: 43 6f 6c 2d 3e 7a 54 79 70 65 3b 0a 20 20 20 20  Col->zType;.    
a490: 69 66 28 20 7a 20 29 7b 0a 20 20 20 20 20 20 6e  if( z ){.      n
a4a0: 20 2b 3d 20 28 73 74 72 6c 65 6e 28 7a 29 20 2b   += (strlen(z) +
a4b0: 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20   1);.    }.  }. 
a4c0: 20 6e 20 2b 3d 20 69 64 65 6e 74 4c 65 6e 67 74   n += identLengt
a4d0: 68 28 70 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 69  h(p->zName);.  i
a4e0: 66 28 20 6e 3c 35 30 20 29 7b 0a 20 20 20 20 7a  f( n<50 ){.    z
a4f0: 53 65 70 20 3d 20 22 22 3b 0a 20 20 20 20 7a 53  Sep = "";.    zS
a500: 65 70 32 20 3d 20 22 2c 22 3b 0a 20 20 20 20 7a  ep2 = ",";.    z
a510: 45 6e 64 20 3d 20 22 29 22 3b 0a 20 20 7d 65 6c  End = ")";.  }el
a520: 73 65 7b 0a 20 20 20 20 7a 53 65 70 20 3d 20 22  se{.    zSep = "
a530: 5c 6e 20 20 22 3b 0a 20 20 20 20 7a 53 65 70 32  \n  ";.    zSep2
a540: 20 3d 20 22 2c 5c 6e 20 20 22 3b 0a 20 20 20 20   = ",\n  ";.    
a550: 7a 45 6e 64 20 3d 20 22 5c 6e 29 22 3b 0a 20 20  zEnd = "\n)";.  
a560: 7d 0a 20 20 6e 20 2b 3d 20 33 35 20 2b 20 36 2a  }.  n += 35 + 6*
a570: 70 2d 3e 6e 43 6f 6c 3b 0a 20 20 7a 53 74 6d 74  p->nCol;.  zStmt
a580: 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 52   = sqliteMallocR
a590: 61 77 28 20 6e 20 29 3b 0a 20 20 69 66 28 20 7a  aw( n );.  if( z
a5a0: 53 74 6d 74 3d 3d 30 20 29 20 72 65 74 75 72 6e  Stmt==0 ) return
a5b0: 20 30 3b 0a 20 20 73 74 72 63 70 79 28 7a 53 74   0;.  strcpy(zSt
a5c0: 6d 74 2c 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42  mt, !OMIT_TEMPDB
a5d0: 26 26 69 73 54 65 6d 70 20 3f 20 22 43 52 45 41  &&isTemp ? "CREA
a5e0: 54 45 20 54 45 4d 50 20 54 41 42 4c 45 20 22 3a  TE TEMP TABLE ":
a5f0: 22 43 52 45 41 54 45 20 54 41 42 4c 45 20 22 29  "CREATE TABLE ")
a600: 3b 0a 20 20 6b 20 3d 20 73 74 72 6c 65 6e 28 7a  ;.  k = strlen(z
a610: 53 74 6d 74 29 3b 0a 20 20 69 64 65 6e 74 50 75  Stmt);.  identPu
a620: 74 28 7a 53 74 6d 74 2c 20 26 6b 2c 20 70 2d 3e  t(zStmt, &k, p->
a630: 7a 4e 61 6d 65 29 3b 0a 20 20 7a 53 74 6d 74 5b  zName);.  zStmt[
a640: 6b 2b 2b 5d 20 3d 20 27 28 27 3b 0a 20 20 66 6f  k++] = '(';.  fo
a650: 72 28 70 43 6f 6c 3d 70 2d 3e 61 43 6f 6c 2c 20  r(pCol=p->aCol, 
a660: 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 3b 20  i=0; i<p->nCol; 
a670: 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20  i++, pCol++){.  
a680: 20 20 73 74 72 63 70 79 28 26 7a 53 74 6d 74 5b    strcpy(&zStmt[
a690: 6b 5d 2c 20 7a 53 65 70 29 3b 0a 20 20 20 20 6b  k], zSep);.    k
a6a0: 20 2b 3d 20 73 74 72 6c 65 6e 28 26 7a 53 74 6d   += strlen(&zStm
a6b0: 74 5b 6b 5d 29 3b 0a 20 20 20 20 7a 53 65 70 20  t[k]);.    zSep 
a6c0: 3d 20 7a 53 65 70 32 3b 0a 20 20 20 20 69 64 65  = zSep2;.    ide
a6d0: 6e 74 50 75 74 28 7a 53 74 6d 74 2c 20 26 6b 2c  ntPut(zStmt, &k,
a6e0: 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20   pCol->zName);. 
a6f0: 20 20 20 69 66 28 20 28 7a 20 3d 20 70 43 6f 6c     if( (z = pCol
a700: 2d 3e 7a 54 79 70 65 29 21 3d 30 20 29 7b 0a 20  ->zType)!=0 ){. 
a710: 20 20 20 20 20 7a 53 74 6d 74 5b 6b 2b 2b 5d 20       zStmt[k++] 
a720: 3d 20 27 20 27 3b 0a 20 20 20 20 20 20 73 74 72  = ' ';.      str
a730: 63 70 79 28 26 7a 53 74 6d 74 5b 6b 5d 2c 20 7a  cpy(&zStmt[k], z
a740: 29 3b 0a 20 20 20 20 20 20 6b 20 2b 3d 20 73 74  );.      k += st
a750: 72 6c 65 6e 28 7a 29 3b 0a 20 20 20 20 7d 0a 20  rlen(z);.    }. 
a760: 20 7d 0a 20 20 73 74 72 63 70 79 28 26 7a 53 74   }.  strcpy(&zSt
a770: 6d 74 5b 6b 5d 2c 20 7a 45 6e 64 29 3b 0a 20 20  mt[k], zEnd);.  
a780: 72 65 74 75 72 6e 20 7a 53 74 6d 74 3b 0a 7d 0a  return zStmt;.}.
a790: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
a7a0: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f  ine is called to
a7b0: 20 72 65 70 6f 72 74 20 74 68 65 20 66 69 6e 61   report the fina
a7c0: 6c 20 22 29 22 20 74 68 61 74 20 74 65 72 6d 69  l ")" that termi
a7d0: 6e 61 74 65 73 0a 2a 2a 20 61 20 43 52 45 41 54  nates.** a CREAT
a7e0: 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e  E TABLE statemen
a7f0: 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 61 62  t..**.** The tab
a800: 6c 65 20 73 74 72 75 63 74 75 72 65 20 74 68 61  le structure tha
a810: 74 20 6f 74 68 65 72 20 61 63 74 69 6f 6e 20 72  t other action r
a820: 6f 75 74 69 6e 65 73 20 68 61 76 65 20 62 65 65  outines have bee
a830: 6e 20 62 75 69 6c 64 69 6e 67 0a 2a 2a 20 69 73  n building.** is
a840: 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 69 6e   added to the in
a850: 74 65 72 6e 61 6c 20 68 61 73 68 20 74 61 62 6c  ternal hash tabl
a860: 65 73 2c 20 61 73 73 75 6d 69 6e 67 20 6e 6f 20  es, assuming no 
a870: 65 72 72 6f 72 73 20 68 61 76 65 0a 2a 2a 20 6f  errors have.** o
a880: 63 63 75 72 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 41  ccurred..**.** A
a890: 6e 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20  n entry for the 
a8a0: 74 61 62 6c 65 20 69 73 20 6d 61 64 65 20 69 6e  table is made in
a8b0: 20 74 68 65 20 6d 61 73 74 65 72 20 74 61 62 6c   the master tabl
a8c0: 65 20 6f 6e 20 64 69 73 6b 2c 20 75 6e 6c 65 73  e on disk, unles
a8d0: 73 0a 2a 2a 20 74 68 69 73 20 69 73 20 61 20 74  s.** this is a t
a8e0: 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 6f  emporary table o
a8f0: 72 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d  r db->init.busy=
a900: 3d 31 2e 20 20 57 68 65 6e 20 64 62 2d 3e 69 6e  =1.  When db->in
a910: 69 74 2e 62 75 73 79 3d 3d 31 0a 2a 2a 20 69 74  it.busy==1.** it
a920: 20 6d 65 61 6e 73 20 77 65 20 61 72 65 20 72 65   means we are re
a930: 61 64 69 6e 67 20 74 68 65 20 73 71 6c 69 74 65  ading the sqlite
a940: 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20 62 65  _master table be
a950: 63 61 75 73 65 20 77 65 20 6a 75 73 74 0a 2a 2a  cause we just.**
a960: 20 63 6f 6e 6e 65 63 74 65 64 20 74 6f 20 74 68   connected to th
a970: 65 20 64 61 74 61 62 61 73 65 20 6f 72 20 62 65  e database or be
a980: 63 61 75 73 65 20 74 68 65 20 73 71 6c 69 74 65  cause the sqlite
a990: 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20 68 61  _master table ha
a9a0: 73 0a 2a 2a 20 72 65 63 65 6e 74 6c 79 20 63 68  s.** recently ch
a9b0: 61 6e 67 65 64 2c 20 73 6f 20 74 68 65 20 65 6e  anged, so the en
a9c0: 74 72 79 20 66 6f 72 20 74 68 69 73 20 74 61 62  try for this tab
a9d0: 6c 65 20 61 6c 72 65 61 64 79 20 65 78 69 73 74  le already exist
a9e0: 73 20 69 6e 0a 2a 2a 20 74 68 65 20 73 71 6c 69  s in.** the sqli
a9f0: 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 2e  te_master table.
aa00: 20 20 57 65 20 64 6f 20 6e 6f 74 20 77 61 6e 74    We do not want
aa10: 20 74 6f 20 63 72 65 61 74 65 20 69 74 20 61 67   to create it ag
aa20: 61 69 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ain..**.** If th
aa30: 65 20 70 53 65 6c 65 63 74 20 61 72 67 75 6d 65  e pSelect argume
aa40: 6e 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20  nt is not NULL, 
aa50: 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68  it means that th
aa60: 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 77 61  is routine.** wa
aa70: 73 20 63 61 6c 6c 65 64 20 74 6f 20 63 72 65 61  s called to crea
aa80: 74 65 20 61 20 74 61 62 6c 65 20 67 65 6e 65 72  te a table gener
aa90: 61 74 65 64 20 66 72 6f 6d 20 61 20 0a 2a 2a 20  ated from a .** 
aaa0: 22 43 52 45 41 54 45 20 54 41 42 4c 45 20 2e 2e  "CREATE TABLE ..
aab0: 2e 20 41 53 20 53 45 4c 45 43 54 20 2e 2e 2e 22  . AS SELECT ..."
aac0: 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 54 68 65   statement.  The
aad0: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 6f 66   column names of
aae0: 0a 2a 2a 20 74 68 65 20 6e 65 77 20 74 61 62 6c  .** the new tabl
aaf0: 65 20 77 69 6c 6c 20 6d 61 74 63 68 20 74 68 65  e will match the
ab00: 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74   result set of t
ab10: 68 65 20 53 45 4c 45 43 54 2e 0a 2a 2f 0a 76 6f  he SELECT..*/.vo
ab20: 69 64 20 73 71 6c 69 74 65 33 45 6e 64 54 61 62  id sqlite3EndTab
ab30: 6c 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  le(.  Parse *pPa
ab40: 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  rse,          /*
ab50: 20 50 61 72 73 65 20 63 6f 6e 74 65 78 74 20 2a   Parse context *
ab60: 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 43 6f 6e 73  /.  Token *pCons
ab70: 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ,           /* T
ab80: 68 65 20 27 2c 27 20 74 6f 6b 65 6e 20 61 66 74  he ',' token aft
ab90: 65 72 20 74 68 65 20 6c 61 73 74 20 63 6f 6c 75  er the last colu
aba0: 6d 6e 20 64 65 66 6e 2e 20 2a 2f 0a 20 20 54 6f  mn defn. */.  To
abb0: 6b 65 6e 20 2a 70 45 6e 64 2c 20 20 20 20 20 20  ken *pEnd,      
abc0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66 69 6e        /* The fin
abd0: 61 6c 20 27 29 27 20 74 6f 6b 65 6e 20 69 6e 20  al ')' token in 
abe0: 74 68 65 20 43 52 45 41 54 45 20 54 41 42 4c 45  the CREATE TABLE
abf0: 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53   */.  Select *pS
ac00: 65 6c 65 63 74 20 20 20 20 20 20 20 20 20 2f 2a  elect         /*
ac10: 20 53 65 6c 65 63 74 20 66 72 6f 6d 20 61 20 22   Select from a "
ac20: 43 52 45 41 54 45 20 2e 2e 2e 20 41 53 20 53 45  CREATE ... AS SE
ac30: 4c 45 43 54 22 20 2a 2f 0a 29 7b 0a 20 20 54 61  LECT" */.){.  Ta
ac40: 62 6c 65 20 2a 70 3b 0a 20 20 73 71 6c 69 74 65  ble *p;.  sqlite
ac50: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
ac60: 64 62 3b 0a 20 20 69 6e 74 20 69 44 62 3b 0a 0a  db;.  int iDb;..
ac70: 20 20 69 66 28 20 28 70 45 6e 64 3d 3d 30 20 26    if( (pEnd==0 &
ac80: 26 20 70 53 65 6c 65 63 74 3d 3d 30 29 20 7c 7c  & pSelect==0) ||
ac90: 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c   pParse->nErr ||
aca0: 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 46 61   sqlite3MallocFa
acb0: 69 6c 65 64 28 29 20 29 20 7b 0a 20 20 20 20 72  iled() ) {.    r
acc0: 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 70 20 3d  eturn;.  }.  p =
acd0: 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
ace0: 6c 65 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29  le;.  if( p==0 )
acf0: 20 72 65 74 75 72 6e 3b 0a 0a 20 20 61 73 73 65   return;..  asse
ad00: 72 74 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75  rt( !db->init.bu
ad10: 73 79 20 7c 7c 20 21 70 53 65 6c 65 63 74 20 29  sy || !pSelect )
ad20: 3b 0a 0a 20 20 69 44 62 20 3d 20 73 71 6c 69 74  ;..  iDb = sqlit
ad30: 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28  e3SchemaToIndex(
ad40: 64 62 2c 20 70 2d 3e 70 53 63 68 65 6d 61 29 3b  db, p->pSchema);
ad50: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
ad60: 5f 4f 4d 49 54 5f 43 48 45 43 4b 0a 20 20 2f 2a  _OMIT_CHECK.  /*
ad70: 20 52 65 73 6f 6c 76 65 20 6e 61 6d 65 73 20 69   Resolve names i
ad80: 6e 20 61 6c 6c 20 43 48 45 43 4b 20 63 6f 6e 73  n all CHECK cons
ad90: 74 72 61 69 6e 74 20 65 78 70 72 65 73 73 69 6f  traint expressio
ada0: 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ns..  */.  if( p
adb0: 2d 3e 70 43 68 65 63 6b 20 29 7b 0a 20 20 20 20  ->pCheck ){.    
adc0: 53 72 63 4c 69 73 74 20 73 53 72 63 3b 20 20 20  SrcList sSrc;   
add0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ade0: 2f 2a 20 46 61 6b 65 20 53 72 63 4c 69 73 74 20  /* Fake SrcList 
adf0: 66 6f 72 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  for pParse->pNew
ae00: 54 61 62 6c 65 20 2a 2f 0a 20 20 20 20 4e 61 6d  Table */.    Nam
ae10: 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b 20 20 20  eContext sNC;   
ae20: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
ae30: 4e 61 6d 65 20 63 6f 6e 74 65 78 74 20 66 6f 72  Name context for
ae40: 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
ae50: 6c 65 20 2a 2f 0a 0a 20 20 20 20 6d 65 6d 73 65  le */..    memse
ae60: 74 28 26 73 4e 43 2c 20 30 2c 20 73 69 7a 65 6f  t(&sNC, 0, sizeo
ae70: 66 28 73 4e 43 29 29 3b 0a 20 20 20 20 6d 65 6d  f(sNC));.    mem
ae80: 73 65 74 28 26 73 53 72 63 2c 20 30 2c 20 73 69  set(&sSrc, 0, si
ae90: 7a 65 6f 66 28 73 53 72 63 29 29 3b 0a 20 20 20  zeof(sSrc));.   
aea0: 20 73 53 72 63 2e 6e 53 72 63 20 3d 20 31 3b 0a   sSrc.nSrc = 1;.
aeb0: 20 20 20 20 73 53 72 63 2e 61 5b 30 5d 2e 7a 4e      sSrc.a[0].zN
aec0: 61 6d 65 20 3d 20 70 2d 3e 7a 4e 61 6d 65 3b 0a  ame = p->zName;.
aed0: 20 20 20 20 73 53 72 63 2e 61 5b 30 5d 2e 70 54      sSrc.a[0].pT
aee0: 61 62 20 3d 20 70 3b 0a 20 20 20 20 73 53 72 63  ab = p;.    sSrc
aef0: 2e 61 5b 30 5d 2e 69 43 75 72 73 6f 72 20 3d 20  .a[0].iCursor = 
af00: 2d 31 3b 0a 20 20 20 20 73 4e 43 2e 70 50 61 72  -1;.    sNC.pPar
af10: 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 20  se = pParse;.   
af20: 20 73 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d 20   sNC.pSrcList = 
af30: 26 73 53 72 63 3b 0a 20 20 20 20 73 4e 43 2e 69  &sSrc;.    sNC.i
af40: 73 43 68 65 63 6b 20 3d 20 31 3b 0a 20 20 20 20  sCheck = 1;.    
af50: 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 52  if( sqlite3ExprR
af60: 65 73 6f 6c 76 65 4e 61 6d 65 73 28 26 73 4e 43  esolveNames(&sNC
af70: 2c 20 70 2d 3e 70 43 68 65 63 6b 29 20 29 7b 0a  , p->pCheck) ){.
af80: 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20        return;.  
af90: 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f    }.  }.#endif /
afa0: 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  * !defined(SQLIT
afb0: 45 5f 4f 4d 49 54 5f 43 48 45 43 4b 29 20 2a 2f  E_OMIT_CHECK) */
afc0: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 64 62  ..  /* If the db
afd0: 2d 3e 69 6e 69 74 2e 62 75 73 79 20 69 73 20 31  ->init.busy is 1
afe0: 20 69 74 20 6d 65 61 6e 73 20 77 65 20 61 72 65   it means we are
aff0: 20 72 65 61 64 69 6e 67 20 74 68 65 20 53 51 4c   reading the SQL
b000: 20 6f 66 66 20 74 68 65 0a 20 20 2a 2a 20 22 73   off the.  ** "s
b010: 71 6c 69 74 65 5f 6d 61 73 74 65 72 22 20 6f 72  qlite_master" or
b020: 20 22 73 71 6c 69 74 65 5f 74 65 6d 70 5f 6d 61   "sqlite_temp_ma
b030: 73 74 65 72 22 20 74 61 62 6c 65 20 6f 6e 20 74  ster" table on t
b040: 68 65 20 64 69 73 6b 2e 0a 20 20 2a 2a 20 53 6f  he disk..  ** So
b050: 20 64 6f 20 6e 6f 74 20 77 72 69 74 65 20 74 6f   do not write to
b060: 20 74 68 65 20 64 69 73 6b 20 61 67 61 69 6e 2e   the disk again.
b070: 20 20 45 78 74 72 61 63 74 20 74 68 65 20 72 6f    Extract the ro
b080: 6f 74 20 70 61 67 65 20 6e 75 6d 62 65 72 0a 20  ot page number. 
b090: 20 2a 2a 20 66 6f 72 20 74 68 65 20 74 61 62 6c   ** for the tabl
b0a0: 65 20 66 72 6f 6d 20 74 68 65 20 64 62 2d 3e 69  e from the db->i
b0b0: 6e 69 74 2e 6e 65 77 54 6e 75 6d 20 66 69 65 6c  nit.newTnum fiel
b0c0: 64 2e 20 20 28 54 68 65 20 70 61 67 65 20 6e 75  d.  (The page nu
b0d0: 6d 62 65 72 0a 20 20 2a 2a 20 73 68 6f 75 6c 64  mber.  ** should
b0e0: 20 68 61 76 65 20 62 65 65 6e 20 70 75 74 20 74   have been put t
b0f0: 68 65 72 65 20 62 79 20 74 68 65 20 73 71 6c 69  here by the sqli
b100: 74 65 4f 70 65 6e 43 62 20 72 6f 75 74 69 6e 65  teOpenCb routine
b110: 2e 29 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62  .).  */.  if( db
b120: 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20  ->init.busy ){. 
b130: 20 20 20 70 2d 3e 74 6e 75 6d 20 3d 20 64 62 2d     p->tnum = db-
b140: 3e 69 6e 69 74 2e 6e 65 77 54 6e 75 6d 3b 0a 20  >init.newTnum;. 
b150: 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 6e 6f 74 20   }..  /* If not 
b160: 69 6e 69 74 69 61 6c 69 7a 69 6e 67 2c 20 74 68  initializing, th
b170: 65 6e 20 63 72 65 61 74 65 20 61 20 72 65 63 6f  en create a reco
b180: 72 64 20 66 6f 72 20 74 68 65 20 6e 65 77 20 74  rd for the new t
b190: 61 62 6c 65 0a 20 20 2a 2a 20 69 6e 20 74 68 65  able.  ** in the
b1a0: 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52 20 74   SQLITE_MASTER t
b1b0: 61 62 6c 65 20 6f 66 20 74 68 65 20 64 61 74 61  able of the data
b1c0: 62 61 73 65 2e 20 20 54 68 65 20 72 65 63 6f 72  base.  The recor
b1d0: 64 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 66 6f  d number.  ** fo
b1e0: 72 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20  r the new table 
b1f0: 65 6e 74 72 79 20 73 68 6f 75 6c 64 20 61 6c 72  entry should alr
b200: 65 61 64 79 20 62 65 20 6f 6e 20 74 68 65 20 73  eady be on the s
b210: 74 61 63 6b 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  tack..  **.  ** 
b220: 49 66 20 74 68 69 73 20 69 73 20 61 20 54 45 4d  If this is a TEM
b230: 50 4f 52 41 52 59 20 74 61 62 6c 65 2c 20 77 72  PORARY table, wr
b240: 69 74 65 20 74 68 65 20 65 6e 74 72 79 20 69 6e  ite the entry in
b250: 74 6f 20 74 68 65 20 61 75 78 69 6c 69 61 72 79  to the auxiliary
b260: 0a 20 20 2a 2a 20 66 69 6c 65 20 69 6e 73 74 65  .  ** file inste
b270: 61 64 20 6f 66 20 69 6e 74 6f 20 74 68 65 20 6d  ad of into the m
b280: 61 69 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c  ain database fil
b290: 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 64  e..  */.  if( !d
b2a0: 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a  b->init.busy ){.
b2b0: 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 56      int n;.    V
b2c0: 64 62 65 20 2a 76 3b 0a 20 20 20 20 63 68 61 72  dbe *v;.    char
b2d0: 20 2a 7a 54 79 70 65 3b 20 20 20 20 2f 2a 20 22   *zType;    /* "
b2e0: 76 69 65 77 22 20 6f 72 20 22 74 61 62 6c 65 22  view" or "table"
b2f0: 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 54   */.    char *zT
b300: 79 70 65 32 3b 20 20 20 2f 2a 20 22 56 49 45 57  ype2;   /* "VIEW
b310: 22 20 6f 72 20 22 54 41 42 4c 45 22 20 2a 2f 0a  " or "TABLE" */.
b320: 20 20 20 20 63 68 61 72 20 2a 7a 53 74 6d 74 3b      char *zStmt;
b330: 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 74      /* Text of t
b340: 68 65 20 43 52 45 41 54 45 20 54 41 42 4c 45 20  he CREATE TABLE 
b350: 6f 72 20 43 52 45 41 54 45 20 56 49 45 57 20 73  or CREATE VIEW s
b360: 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 0a 20 20 20  tatement */..   
b370: 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56   v = sqlite3GetV
b380: 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20  dbe(pParse);.   
b390: 20 69 66 28 20 76 3d 3d 30 20 29 20 72 65 74 75   if( v==0 ) retu
b3a0: 72 6e 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65 33  rn;..    sqlite3
b3b0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
b3c0: 43 6c 6f 73 65 2c 20 30 2c 20 30 29 3b 0a 0a 20  Close, 0, 0);.. 
b3d0: 20 20 20 2f 2a 20 43 72 65 61 74 65 20 74 68 65     /* Create the
b3e0: 20 72 6f 6f 74 70 61 67 65 20 66 6f 72 20 74 68   rootpage for th
b3f0: 65 20 6e 65 77 20 74 61 62 6c 65 20 61 6e 64 20  e new table and 
b400: 70 75 73 68 20 69 74 20 6f 6e 74 6f 20 74 68 65  push it onto the
b410: 20 73 74 61 63 6b 2e 0a 20 20 20 20 2a 2a 20 41   stack..    ** A
b420: 20 76 69 65 77 20 68 61 73 20 6e 6f 20 72 6f 6f   view has no roo
b430: 74 70 61 67 65 2c 20 73 6f 20 6a 75 73 74 20 70  tpage, so just p
b440: 75 73 68 20 61 20 7a 65 72 6f 20 6f 6e 74 6f 20  ush a zero onto 
b450: 74 68 65 20 73 74 61 63 6b 20 66 6f 72 0a 20 20  the stack for.  
b460: 20 20 2a 2a 20 76 69 65 77 73 2e 20 20 49 6e 69    ** views.  Ini
b470: 74 69 61 6c 69 7a 65 20 7a 54 79 70 65 20 61 74  tialize zType at
b480: 20 74 68 65 20 73 61 6d 65 20 74 69 6d 65 2e 0a   the same time..
b490: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
b4a0: 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20 29 7b 0a  ->pSelect==0 ){.
b4b0: 20 20 20 20 20 20 2f 2a 20 41 20 72 65 67 75 6c        /* A regul
b4c0: 61 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20  ar table */.    
b4d0: 20 20 7a 54 79 70 65 20 3d 20 22 74 61 62 6c 65    zType = "table
b4e0: 22 3b 0a 20 20 20 20 20 20 7a 54 79 70 65 32 20  ";.      zType2 
b4f0: 3d 20 22 54 41 42 4c 45 22 3b 0a 23 69 66 6e 64  = "TABLE";.#ifnd
b500: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
b510: 49 45 57 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  IEW.    }else{. 
b520: 20 20 20 20 20 2f 2a 20 41 20 76 69 65 77 20 2a       /* A view *
b530: 2f 0a 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20  /.      zType = 
b540: 22 76 69 65 77 22 3b 0a 20 20 20 20 20 20 7a 54  "view";.      zT
b550: 79 70 65 32 20 3d 20 22 56 49 45 57 22 3b 0a 23  ype2 = "VIEW";.#
b560: 65 6e 64 69 66 0a 20 20 20 20 7d 0a 0a 20 20 20  endif.    }..   
b570: 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61   /* If this is a
b580: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 78 78   CREATE TABLE xx
b590: 20 41 53 20 53 45 4c 45 43 54 20 2e 2e 2e 2c 20   AS SELECT ..., 
b5a0: 65 78 65 63 75 74 65 20 74 68 65 20 53 45 4c 45  execute the SELE
b5b0: 43 54 0a 20 20 20 20 2a 2a 20 73 74 61 74 65 6d  CT.    ** statem
b5c0: 65 6e 74 20 74 6f 20 70 6f 70 75 6c 61 74 65 20  ent to populate 
b5d0: 74 68 65 20 6e 65 77 20 74 61 62 6c 65 2e 20 54  the new table. T
b5e0: 68 65 20 72 6f 6f 74 2d 70 61 67 65 20 6e 75 6d  he root-page num
b5f0: 62 65 72 20 66 6f 72 20 74 68 65 0a 20 20 20 20  ber for the.    
b600: 2a 2a 20 6e 65 77 20 74 61 62 6c 65 20 69 73 20  ** new table is 
b610: 6f 6e 20 74 68 65 20 74 6f 70 20 6f 66 20 74 68  on the top of th
b620: 65 20 76 64 62 65 20 73 74 61 63 6b 2e 0a 20 20  e vdbe stack..  
b630: 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 4f 6e 63 65    **.    ** Once
b640: 20 74 68 65 20 53 45 4c 45 43 54 20 68 61 73 20   the SELECT has 
b650: 62 65 65 6e 20 63 6f 64 65 64 20 62 79 20 73 71  been coded by sq
b660: 6c 69 74 65 33 53 65 6c 65 63 74 28 29 2c 20 69  lite3Select(), i
b670: 74 20 69 73 20 69 6e 20 61 0a 20 20 20 20 2a 2a  t is in a.    **
b680: 20 73 75 69 74 61 62 6c 65 20 73 74 61 74 65 20   suitable state 
b690: 74 6f 20 71 75 65 72 79 20 66 6f 72 20 74 68 65  to query for the
b6a0: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 61 6e   column names an
b6b0: 64 20 74 79 70 65 73 20 74 6f 20 62 65 20 75 73  d types to be us
b6c0: 65 64 0a 20 20 20 20 2a 2a 20 62 79 20 74 68 65  ed.    ** by the
b6d0: 20 6e 65 77 20 74 61 62 6c 65 2e 0a 20 20 20 20   new table..    
b6e0: 2a 2a 0a 20 20 20 20 2a 2a 20 41 20 73 68 61 72  **.    ** A shar
b6f0: 65 64 2d 63 61 63 68 65 20 77 72 69 74 65 2d 6c  ed-cache write-l
b700: 6f 63 6b 20 69 73 20 6e 6f 74 20 72 65 71 75 69  ock is not requi
b710: 72 65 64 20 74 6f 20 77 72 69 74 65 20 74 6f 20  red to write to 
b720: 74 68 65 20 6e 65 77 20 74 61 62 6c 65 2c 0a 20  the new table,. 
b730: 20 20 20 2a 2a 20 61 73 20 61 20 73 63 68 65 6d     ** as a schem
b740: 61 2d 6c 6f 63 6b 20 6d 75 73 74 20 68 61 76 65  a-lock must have
b750: 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 6f 62   already been ob
b760: 74 61 69 6e 65 64 20 74 6f 20 63 72 65 61 74 65  tained to create
b770: 20 69 74 2e 20 53 69 6e 63 65 0a 20 20 20 20 2a   it. Since.    *
b780: 2a 20 61 20 73 63 68 65 6d 61 2d 6c 6f 63 6b 20  * a schema-lock 
b790: 65 78 63 6c 75 64 65 73 20 61 6c 6c 20 6f 74 68  excludes all oth
b7a0: 65 72 20 64 61 74 61 62 61 73 65 20 75 73 65 72  er database user
b7b0: 73 2c 20 74 68 65 20 77 72 69 74 65 2d 6c 6f 63  s, the write-loc
b7c0: 6b 20 77 6f 75 6c 64 0a 20 20 20 20 2a 2a 20 62  k would.    ** b
b7d0: 65 20 72 65 64 75 6e 64 61 6e 74 2e 0a 20 20 20  e redundant..   
b7e0: 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 53 65 6c   */.    if( pSel
b7f0: 65 63 74 20 29 7b 0a 20 20 20 20 20 20 54 61 62  ect ){.      Tab
b800: 6c 65 20 2a 70 53 65 6c 54 61 62 3b 0a 20 20 20  le *pSelTab;.   
b810: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
b820: 64 4f 70 28 76 2c 20 4f 50 5f 44 75 70 2c 20 30  dOp(v, OP_Dup, 0
b830: 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
b840: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
b850: 4f 50 5f 49 6e 74 65 67 65 72 2c 20 69 44 62 2c  OP_Integer, iDb,
b860: 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
b870: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
b880: 50 5f 4f 70 65 6e 57 72 69 74 65 2c 20 31 2c 20  P_OpenWrite, 1, 
b890: 30 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65  0);.      pParse
b8a0: 2d 3e 6e 54 61 62 20 3d 20 32 3b 0a 20 20 20 20  ->nTab = 2;.    
b8b0: 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28    sqlite3Select(
b8c0: 70 50 61 72 73 65 2c 20 70 53 65 6c 65 63 74 2c  pParse, pSelect,
b8d0: 20 53 52 54 5f 54 61 62 6c 65 2c 20 31 2c 20 30   SRT_Table, 1, 0
b8e0: 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  , 0, 0, 0);.    
b8f0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
b900: 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20  Op(v, OP_Close, 
b910: 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28  1, 0);.      if(
b920: 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30   pParse->nErr==0
b930: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 53 65 6c   ){.        pSel
b940: 54 61 62 20 3d 20 73 71 6c 69 74 65 33 52 65 73  Tab = sqlite3Res
b950: 75 6c 74 53 65 74 4f 66 53 65 6c 65 63 74 28 70  ultSetOfSelect(p
b960: 50 61 72 73 65 2c 20 30 2c 20 70 53 65 6c 65 63  Parse, 0, pSelec
b970: 74 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  t);.        if( 
b980: 70 53 65 6c 54 61 62 3d 3d 30 20 29 20 72 65 74  pSelTab==0 ) ret
b990: 75 72 6e 3b 0a 20 20 20 20 20 20 20 20 61 73 73  urn;.        ass
b9a0: 65 72 74 28 20 70 2d 3e 61 43 6f 6c 3d 3d 30 20  ert( p->aCol==0 
b9b0: 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6e 43  );.        p->nC
b9c0: 6f 6c 20 3d 20 70 53 65 6c 54 61 62 2d 3e 6e 43  ol = pSelTab->nC
b9d0: 6f 6c 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 61  ol;.        p->a
b9e0: 43 6f 6c 20 3d 20 70 53 65 6c 54 61 62 2d 3e 61  Col = pSelTab->a
b9f0: 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 70 53 65  Col;.        pSe
ba00: 6c 54 61 62 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a  lTab->nCol = 0;.
ba10: 20 20 20 20 20 20 20 20 70 53 65 6c 54 61 62 2d          pSelTab-
ba20: 3e 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20  >aCol = 0;.     
ba30: 20 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65     sqlite3Delete
ba40: 54 61 62 6c 65 28 30 2c 20 70 53 65 6c 54 61 62  Table(0, pSelTab
ba50: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
ba60: 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d 70 75 74 65  ..    /* Compute
ba70: 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 74 65   the complete te
ba80: 78 74 20 6f 66 20 74 68 65 20 43 52 45 41 54 45  xt of the CREATE
ba90: 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20   statement */.  
baa0: 20 20 69 66 28 20 70 53 65 6c 65 63 74 20 29 7b    if( pSelect ){
bab0: 0a 20 20 20 20 20 20 7a 53 74 6d 74 20 3d 20 63  .      zStmt = c
bac0: 72 65 61 74 65 54 61 62 6c 65 53 74 6d 74 28 70  reateTableStmt(p
bad0: 2c 20 70 2d 3e 70 53 63 68 65 6d 61 3d 3d 70 50  , p->pSchema==pP
bae0: 61 72 73 65 2d 3e 64 62 2d 3e 61 44 62 5b 31 5d  arse->db->aDb[1]
baf0: 2e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 7d  .pSchema);.    }
bb00: 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 20 3d 20  else{.      n = 
bb10: 70 45 6e 64 2d 3e 7a 20 2d 20 70 50 61 72 73 65  pEnd->z - pParse
bb20: 2d 3e 73 4e 61 6d 65 54 6f 6b 65 6e 2e 7a 20 2b  ->sNameToken.z +
bb30: 20 31 3b 0a 20 20 20 20 20 20 7a 53 74 6d 74 20   1;.      zStmt 
bb40: 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66  = sqlite3MPrintf
bb50: 28 22 43 52 45 41 54 45 20 25 73 20 25 2e 2a 73  ("CREATE %s %.*s
bb60: 22 2c 20 7a 54 79 70 65 32 2c 20 6e 2c 20 70 50  ", zType2, n, pP
bb70: 61 72 73 65 2d 3e 73 4e 61 6d 65 54 6f 6b 65 6e  arse->sNameToken
bb80: 2e 7a 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  .z);.    }..    
bb90: 2f 2a 20 41 20 73 6c 6f 74 20 66 6f 72 20 74 68  /* A slot for th
bba0: 65 20 72 65 63 6f 72 64 20 68 61 73 20 61 6c 72  e record has alr
bbb0: 65 61 64 79 20 62 65 65 6e 20 61 6c 6c 6f 63 61  eady been alloca
bbc0: 74 65 64 20 69 6e 20 74 68 65 20 0a 20 20 20 20  ted in the .    
bbd0: 2a 2a 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52  ** SQLITE_MASTER
bbe0: 20 74 61 62 6c 65 2e 20 20 57 65 20 6a 75 73 74   table.  We just
bbf0: 20 6e 65 65 64 20 74 6f 20 75 70 64 61 74 65 20   need to update 
bc00: 74 68 61 74 20 73 6c 6f 74 20 77 69 74 68 20 61  that slot with a
bc10: 6c 6c 0a 20 20 20 20 2a 2a 20 74 68 65 20 69 6e  ll.    ** the in
bc20: 66 6f 72 6d 61 74 69 6f 6e 20 77 65 27 76 65 20  formation we've 
bc30: 63 6f 6c 6c 65 63 74 65 64 2e 20 20 54 68 65 20  collected.  The 
bc40: 72 6f 77 69 64 20 66 6f 72 20 74 68 65 20 70 72  rowid for the pr
bc50: 65 61 6c 6c 6f 63 61 74 65 64 0a 20 20 20 20 2a  eallocated.    *
bc60: 2a 20 73 6c 6f 74 20 69 73 20 74 68 65 20 32 6e  * slot is the 2n
bc70: 64 20 69 74 65 6d 20 6f 6e 20 74 68 65 20 73 74  d item on the st
bc80: 61 63 6b 2e 20 20 54 68 65 20 74 6f 70 20 6f 66  ack.  The top of
bc90: 20 74 68 65 20 73 74 61 63 6b 20 69 73 20 74 68   the stack is th
bca0: 65 0a 20 20 20 20 2a 2a 20 72 6f 6f 74 20 70 61  e.    ** root pa
bcb0: 67 65 20 66 6f 72 20 74 68 65 20 6e 65 77 20 74  ge for the new t
bcc0: 61 62 6c 65 20 28 6f 72 20 61 20 30 20 69 66 20  able (or a 0 if 
bcd0: 74 68 69 73 20 69 73 20 61 20 76 69 65 77 29 2e  this is a view).
bce0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69  .    */.    sqli
bcf0: 74 65 33 4e 65 73 74 65 64 50 61 72 73 65 28 70  te3NestedParse(p
bd00: 50 61 72 73 65 2c 0a 20 20 20 20 20 20 22 55 50  Parse,.      "UP
bd10: 44 41 54 45 20 25 51 2e 25 73 20 22 0a 20 20 20  DATE %Q.%s ".   
bd20: 20 20 20 20 20 20 22 53 45 54 20 74 79 70 65 3d        "SET type=
bd30: 27 25 73 27 2c 20 6e 61 6d 65 3d 25 51 2c 20 74  '%s', name=%Q, t
bd40: 62 6c 5f 6e 61 6d 65 3d 25 51 2c 20 72 6f 6f 74  bl_name=%Q, root
bd50: 70 61 67 65 3d 23 30 2c 20 73 71 6c 3d 25 51 20  page=#0, sql=%Q 
bd60: 22 0a 20 20 20 20 20 20 20 22 57 48 45 52 45 20  ".       "WHERE 
bd70: 72 6f 77 69 64 3d 23 31 22 2c 0a 20 20 20 20 20  rowid=#1",.     
bd80: 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e   db->aDb[iDb].zN
bd90: 61 6d 65 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c  ame, SCHEMA_TABL
bda0: 45 28 69 44 62 29 2c 0a 20 20 20 20 20 20 7a 54  E(iDb),.      zT
bdb0: 79 70 65 2c 0a 20 20 20 20 20 20 70 2d 3e 7a 4e  ype,.      p->zN
bdc0: 61 6d 65 2c 0a 20 20 20 20 20 20 70 2d 3e 7a 4e  ame,.      p->zN
bdd0: 61 6d 65 2c 0a 20 20 20 20 20 20 7a 53 74 6d 74  ame,.      zStmt
bde0: 0a 20 20 20 20 29 3b 0a 20 20 20 20 73 71 6c 69  .    );.    sqli
bdf0: 74 65 46 72 65 65 28 7a 53 74 6d 74 29 3b 0a 20  teFree(zStmt);. 
be00: 20 20 20 73 71 6c 69 74 65 33 43 68 61 6e 67 65     sqlite3Change
be10: 43 6f 6f 6b 69 65 28 64 62 2c 20 76 2c 20 69 44  Cookie(db, v, iD
be20: 62 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  b);..#ifndef SQL
be30: 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 43  ITE_OMIT_AUTOINC
be40: 52 45 4d 45 4e 54 0a 20 20 20 20 2f 2a 20 43 68  REMENT.    /* Ch
be50: 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 77 65  eck to see if we
be60: 20 6e 65 65 64 20 74 6f 20 63 72 65 61 74 65 20   need to create 
be70: 61 6e 20 73 71 6c 69 74 65 5f 73 65 71 75 65 6e  an sqlite_sequen
be80: 63 65 20 74 61 62 6c 65 20 66 6f 72 0a 20 20 20  ce table for.   
be90: 20 2a 2a 20 6b 65 65 70 69 6e 67 20 74 72 61 63   ** keeping trac
bea0: 6b 20 6f 66 20 61 75 74 6f 69 6e 63 72 65 6d 65  k of autoincreme
beb0: 6e 74 20 6b 65 79 73 2e 0a 20 20 20 20 2a 2f 0a  nt keys..    */.
bec0: 20 20 20 20 69 66 28 20 70 2d 3e 61 75 74 6f 49      if( p->autoI
bed0: 6e 63 20 29 7b 0a 20 20 20 20 20 20 44 62 20 2a  nc ){.      Db *
bee0: 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69  pDb = &db->aDb[i
bef0: 44 62 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 70  Db];.      if( p
bf00: 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 70 53 65  Db->pSchema->pSe
bf10: 71 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 20  qTab==0 ){.     
bf20: 20 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64     sqlite3Nested
bf30: 50 61 72 73 65 28 70 50 61 72 73 65 2c 0a 20 20  Parse(pParse,.  
bf40: 20 20 20 20 20 20 20 20 22 43 52 45 41 54 45 20          "CREATE 
bf50: 54 41 42 4c 45 20 25 51 2e 73 71 6c 69 74 65 5f  TABLE %Q.sqlite_
bf60: 73 65 71 75 65 6e 63 65 28 6e 61 6d 65 2c 73 65  sequence(name,se
bf70: 71 29 22 2c 0a 20 20 20 20 20 20 20 20 20 20 70  q)",.          p
bf80: 44 62 2d 3e 7a 4e 61 6d 65 0a 20 20 20 20 20 20  Db->zName.      
bf90: 20 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20    );.      }.   
bfa0: 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f   }.#endif..    /
bfb0: 2a 20 52 65 70 61 72 73 65 20 65 76 65 72 79 74  * Reparse everyt
bfc0: 68 69 6e 67 20 74 6f 20 75 70 64 61 74 65 20 6f  hing to update o
bfd0: 75 72 20 69 6e 74 65 72 6e 61 6c 20 64 61 74 61  ur internal data
bfe0: 20 73 74 72 75 63 74 75 72 65 73 20 2a 2f 0a 20   structures */. 
bff0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70     sqlite3VdbeOp
c000: 33 28 76 2c 20 4f 50 5f 50 61 72 73 65 53 63 68  3(v, OP_ParseSch
c010: 65 6d 61 2c 20 69 44 62 2c 20 30 2c 0a 20 20 20  ema, iDb, 0,.   
c020: 20 20 20 20 20 73 71 6c 69 74 65 33 4d 50 72 69       sqlite3MPri
c030: 6e 74 66 28 22 74 62 6c 5f 6e 61 6d 65 3d 27 25  ntf("tbl_name='%
c040: 71 27 22 2c 70 2d 3e 7a 4e 61 6d 65 29 2c 20 50  q'",p->zName), P
c050: 33 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 7d 0a  3_DYNAMIC);.  }.
c060: 0a 0a 20 20 2f 2a 20 41 64 64 20 74 68 65 20 74  ..  /* Add the t
c070: 61 62 6c 65 20 74 6f 20 74 68 65 20 69 6e 2d 6d  able to the in-m
c080: 65 6d 6f 72 79 20 72 65 70 72 65 73 65 6e 74 61  emory representa
c090: 74 69 6f 6e 20 6f 66 20 74 68 65 20 64 61 74 61  tion of the data
c0a0: 62 61 73 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  base..  */.  if(
c0b0: 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 26   db->init.busy &
c0c0: 26 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d  & pParse->nErr==
c0d0: 30 20 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a  0 ){.    Table *
c0e0: 70 4f 6c 64 3b 0a 20 20 20 20 46 4b 65 79 20 2a  pOld;.    FKey *
c0f0: 70 46 4b 65 79 3b 20 0a 20 20 20 20 53 63 68 65  pFKey; .    Sche
c100: 6d 61 20 2a 70 53 63 68 65 6d 61 20 3d 20 70 2d  ma *pSchema = p-
c110: 3e 70 53 63 68 65 6d 61 3b 0a 20 20 20 20 70 4f  >pSchema;.    pO
c120: 6c 64 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68  ld = sqlite3Hash
c130: 49 6e 73 65 72 74 28 26 70 53 63 68 65 6d 61 2d  Insert(&pSchema-
c140: 3e 74 62 6c 48 61 73 68 2c 20 70 2d 3e 7a 4e 61  >tblHash, p->zNa
c150: 6d 65 2c 20 73 74 72 6c 65 6e 28 70 2d 3e 7a 4e  me, strlen(p->zN
c160: 61 6d 65 29 2b 31 2c 70 29 3b 0a 20 20 20 20 69  ame)+1,p);.    i
c170: 66 28 20 70 4f 6c 64 20 29 7b 0a 20 20 20 20 20  f( pOld ){.     
c180: 20 61 73 73 65 72 74 28 20 70 3d 3d 70 4f 6c 64   assert( p==pOld
c190: 20 29 3b 20 20 2f 2a 20 4d 61 6c 6c 6f 63 20 6d   );  /* Malloc m
c1a0: 75 73 74 20 68 61 76 65 20 66 61 69 6c 65 64 20  ust have failed 
c1b0: 69 6e 73 69 64 65 20 48 61 73 68 49 6e 73 65 72  inside HashInser
c1c0: 74 28 29 20 2a 2f 0a 20 20 20 20 20 20 72 65 74  t() */.      ret
c1d0: 75 72 6e 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64  urn;.    }.#ifnd
c1e0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46  ef SQLITE_OMIT_F
c1f0: 4f 52 45 49 47 4e 5f 4b 45 59 0a 20 20 20 20 66  OREIGN_KEY.    f
c200: 6f 72 28 70 46 4b 65 79 3d 70 2d 3e 70 46 4b 65  or(pFKey=p->pFKe
c210: 79 3b 20 70 46 4b 65 79 3b 20 70 46 4b 65 79 3d  y; pFKey; pFKey=
c220: 70 46 4b 65 79 2d 3e 70 4e 65 78 74 46 72 6f 6d  pFKey->pNextFrom
c230: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 54 6f  ){.      int nTo
c240: 20 3d 20 73 74 72 6c 65 6e 28 70 46 4b 65 79 2d   = strlen(pFKey-
c250: 3e 7a 54 6f 29 20 2b 20 31 3b 0a 20 20 20 20 20  >zTo) + 1;.     
c260: 20 70 46 4b 65 79 2d 3e 70 4e 65 78 74 54 6f 20   pFKey->pNextTo 
c270: 3d 20 73 71 6c 69 74 65 33 48 61 73 68 46 69 6e  = sqlite3HashFin
c280: 64 28 26 70 53 63 68 65 6d 61 2d 3e 61 46 4b 65  d(&pSchema->aFKe
c290: 79 2c 20 70 46 4b 65 79 2d 3e 7a 54 6f 2c 20 6e  y, pFKey->zTo, n
c2a0: 54 6f 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  To);.      sqlit
c2b0: 65 33 48 61 73 68 49 6e 73 65 72 74 28 26 70 53  e3HashInsert(&pS
c2c0: 63 68 65 6d 61 2d 3e 61 46 4b 65 79 2c 20 70 46  chema->aFKey, pF
c2d0: 4b 65 79 2d 3e 7a 54 6f 2c 20 6e 54 6f 2c 20 70  Key->zTo, nTo, p
c2e0: 46 4b 65 79 29 3b 0a 20 20 20 20 7d 0a 23 65 6e  FKey);.    }.#en
c2f0: 64 69 66 0a 20 20 20 20 70 50 61 72 73 65 2d 3e  dif.    pParse->
c300: 70 4e 65 77 54 61 62 6c 65 20 3d 20 30 3b 0a 20  pNewTable = 0;. 
c310: 20 20 20 64 62 2d 3e 6e 54 61 62 6c 65 2b 2b 3b     db->nTable++;
c320: 0a 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c  .    db->flags |
c330: 3d 20 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43  = SQLITE_InternC
c340: 68 61 6e 67 65 73 3b 0a 0a 23 69 66 6e 64 65 66  hanges;..#ifndef
c350: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 4c 54   SQLITE_OMIT_ALT
c360: 45 52 54 41 42 4c 45 0a 20 20 20 20 69 66 28 20  ERTABLE.    if( 
c370: 21 70 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20  !p->pSelect ){. 
c380: 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
c390: 2a 7a 4e 61 6d 65 20 3d 20 28 63 6f 6e 73 74 20  *zName = (const 
c3a0: 63 68 61 72 20 2a 29 70 50 61 72 73 65 2d 3e 73  char *)pParse->s
c3b0: 4e 61 6d 65 54 6f 6b 65 6e 2e 7a 3b 0a 20 20 20  NameToken.z;.   
c3c0: 20 20 20 69 6e 74 20 6e 4e 61 6d 65 3b 0a 20 20     int nName;.  
c3d0: 20 20 20 20 61 73 73 65 72 74 28 20 21 70 53 65      assert( !pSe
c3e0: 6c 65 63 74 20 26 26 20 70 43 6f 6e 73 20 26 26  lect && pCons &&
c3f0: 20 70 45 6e 64 20 29 3b 0a 20 20 20 20 20 20 69   pEnd );.      i
c400: 66 28 20 70 43 6f 6e 73 2d 3e 7a 3d 3d 30 20 29  f( pCons->z==0 )
c410: 7b 0a 20 20 20 20 20 20 20 20 70 43 6f 6e 73 20  {.        pCons 
c420: 3d 20 70 45 6e 64 3b 0a 20 20 20 20 20 20 7d 0a  = pEnd;.      }.
c430: 20 20 20 20 20 20 6e 4e 61 6d 65 20 3d 20 28 63        nName = (c
c440: 6f 6e 73 74 20 63 68 61 72 20 2a 29 70 43 6f 6e  onst char *)pCon
c450: 73 2d 3e 7a 20 2d 20 7a 4e 61 6d 65 3b 0a 20 20  s->z - zName;.  
c460: 20 20 20 20 70 2d 3e 61 64 64 43 6f 6c 4f 66 66      p->addColOff
c470: 73 65 74 20 3d 20 31 33 20 2b 20 73 71 6c 69 74  set = 13 + sqlit
c480: 65 33 75 74 66 38 43 68 61 72 4c 65 6e 28 7a 4e  e3utf8CharLen(zN
c490: 61 6d 65 2c 20 6e 4e 61 6d 65 29 3b 0a 20 20 20  ame, nName);.   
c4a0: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 7d 0a   }.#endif.  }.}.
c4b0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
c4c0: 4f 4d 49 54 5f 56 49 45 57 0a 2f 2a 0a 2a 2a 20  OMIT_VIEW./*.** 
c4d0: 54 68 65 20 70 61 72 73 65 72 20 63 61 6c 6c 73  The parser calls
c4e0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 6e   this routine in
c4f0: 20 6f 72 64 65 72 20 74 6f 20 63 72 65 61 74 65   order to create
c500: 20 61 20 6e 65 77 20 56 49 45 57 0a 2a 2f 0a 76   a new VIEW.*/.v
c510: 6f 69 64 20 73 71 6c 69 74 65 33 43 72 65 61 74  oid sqlite3Creat
c520: 65 56 69 65 77 28 0a 20 20 50 61 72 73 65 20 2a  eView(.  Parse *
c530: 70 50 61 72 73 65 2c 20 20 20 20 20 2f 2a 20 54  pParse,     /* T
c540: 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65  he parsing conte
c550: 78 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  xt */.  Token *p
c560: 42 65 67 69 6e 2c 20 20 20 20 20 2f 2a 20 54 68  Begin,     /* Th
c570: 65 20 43 52 45 41 54 45 20 74 6f 6b 65 6e 20 74  e CREATE token t
c580: 68 61 74 20 62 65 67 69 6e 73 20 74 68 65 20 73  hat begins the s
c590: 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 54 6f  tatement */.  To
c5a0: 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c 20 20 20 20  ken *pName1,    
c5b0: 20 2f 2a 20 54 68 65 20 74 6f 6b 65 6e 20 74 68   /* The token th
c5c0: 61 74 20 68 6f 6c 64 73 20 74 68 65 20 6e 61 6d  at holds the nam
c5d0: 65 20 6f 66 20 74 68 65 20 76 69 65 77 20 2a 2f  e of the view */
c5e0: 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32  .  Token *pName2
c5f0: 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 74 6f 6b  ,     /* The tok
c600: 65 6e 20 74 68 61 74 20 68 6f 6c 64 73 20 74 68  en that holds th
c610: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 76 69  e name of the vi
c620: 65 77 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  ew */.  Select *
c630: 70 53 65 6c 65 63 74 2c 20 20 20 2f 2a 20 41 20  pSelect,   /* A 
c640: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
c650: 20 74 68 61 74 20 77 69 6c 6c 20 62 65 63 6f 6d   that will becom
c660: 65 20 74 68 65 20 6e 65 77 20 76 69 65 77 20 2a  e the new view *
c670: 2f 0a 20 20 69 6e 74 20 69 73 54 65 6d 70 2c 20  /.  int isTemp, 
c680: 20 20 20 20 20 20 20 2f 2a 20 54 52 55 45 20 66         /* TRUE f
c690: 6f 72 20 61 20 54 45 4d 50 4f 52 41 52 59 20 76  or a TEMPORARY v
c6a0: 69 65 77 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 45  iew */.  int noE
c6b0: 72 72 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53  rr          /* S
c6c0: 75 70 70 72 65 73 73 20 65 72 72 6f 72 20 6d 65  uppress error me
c6d0: 73 73 61 67 65 73 20 69 66 20 56 49 45 57 20 61  ssages if VIEW a
c6e0: 6c 72 65 61 64 79 20 65 78 69 73 74 73 20 2a 2f  lready exists */
c6f0: 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a  .){.  Table *p;.
c700: 20 20 69 6e 74 20 6e 3b 0a 20 20 63 6f 6e 73 74    int n;.  const
c710: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
c720: 7a 3b 0a 20 20 54 6f 6b 65 6e 20 73 45 6e 64 3b  z;.  Token sEnd;
c730: 0a 20 20 44 62 46 69 78 65 72 20 73 46 69 78 3b  .  DbFixer sFix;
c740: 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 3b  .  Token *pName;
c750: 0a 20 20 69 6e 74 20 69 44 62 3b 0a 0a 20 20 69  .  int iDb;..  i
c760: 66 28 20 70 50 61 72 73 65 2d 3e 6e 56 61 72 3e  f( pParse->nVar>
c770: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
c780: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
c790: 20 22 70 61 72 61 6d 65 74 65 72 73 20 61 72 65   "parameters are
c7a0: 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 20 69 6e 20   not allowed in 
c7b0: 76 69 65 77 73 22 29 3b 0a 20 20 20 20 73 71 6c  views");.    sql
c7c0: 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65  ite3SelectDelete
c7d0: 28 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 72  (pSelect);.    r
c7e0: 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 73 71 6c  eturn;.  }.  sql
c7f0: 69 74 65 33 53 74 61 72 74 54 61 62 6c 65 28 70  ite3StartTable(p
c800: 50 61 72 73 65 2c 20 70 4e 61 6d 65 31 2c 20 70  Parse, pName1, p
c810: 4e 61 6d 65 32 2c 20 69 73 54 65 6d 70 2c 20 31  Name2, isTemp, 1
c820: 2c 20 30 2c 20 6e 6f 45 72 72 29 3b 0a 20 20 70  , 0, noErr);.  p
c830: 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54   = pParse->pNewT
c840: 61 62 6c 65 3b 0a 20 20 69 66 28 20 70 3d 3d 30  able;.  if( p==0
c850: 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72   || pParse->nErr
c860: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 53   ){.    sqlite3S
c870: 65 6c 65 63 74 44 65 6c 65 74 65 28 70 53 65 6c  electDelete(pSel
c880: 65 63 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ect);.    return
c890: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 54  ;.  }.  sqlite3T
c8a0: 77 6f 50 61 72 74 4e 61 6d 65 28 70 50 61 72 73  woPartName(pPars
c8b0: 65 2c 20 70 4e 61 6d 65 31 2c 20 70 4e 61 6d 65  e, pName1, pName
c8c0: 32 2c 20 26 70 4e 61 6d 65 29 3b 0a 20 20 69 44  2, &pName);.  iD
c8d0: 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d  b = sqlite3Schem
c8e0: 61 54 6f 49 6e 64 65 78 28 70 50 61 72 73 65 2d  aToIndex(pParse-
c8f0: 3e 64 62 2c 20 70 2d 3e 70 53 63 68 65 6d 61 29  >db, p->pSchema)
c900: 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 46  ;.  if( sqlite3F
c910: 69 78 49 6e 69 74 28 26 73 46 69 78 2c 20 70 50  ixInit(&sFix, pP
c920: 61 72 73 65 2c 20 69 44 62 2c 20 22 76 69 65 77  arse, iDb, "view
c930: 22 2c 20 70 4e 61 6d 65 29 0a 20 20 20 20 26 26  ", pName).    &&
c940: 20 73 71 6c 69 74 65 33 46 69 78 53 65 6c 65 63   sqlite3FixSelec
c950: 74 28 26 73 46 69 78 2c 20 70 53 65 6c 65 63 74  t(&sFix, pSelect
c960: 29 0a 20 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ).  ){.    sqlit
c970: 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 70  e3SelectDelete(p
c980: 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 72 65 74  Select);.    ret
c990: 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d  urn;.  }..  /* M
c9a0: 61 6b 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68  ake a copy of th
c9b0: 65 20 65 6e 74 69 72 65 20 53 45 4c 45 43 54 20  e entire SELECT 
c9c0: 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20 64  statement that d
c9d0: 65 66 69 6e 65 73 20 74 68 65 20 76 69 65 77 2e  efines the view.
c9e0: 0a 20 20 2a 2a 20 54 68 69 73 20 77 69 6c 6c 20  .  ** This will 
c9f0: 66 6f 72 63 65 20 61 6c 6c 20 74 68 65 20 45 78  force all the Ex
ca00: 70 72 2e 74 6f 6b 65 6e 2e 7a 20 76 61 6c 75 65  pr.token.z value
ca10: 73 20 74 6f 20 62 65 20 64 79 6e 61 6d 69 63 61  s to be dynamica
ca20: 6c 6c 79 0a 20 20 2a 2a 20 61 6c 6c 6f 63 61 74  lly.  ** allocat
ca30: 65 64 20 72 61 74 68 65 72 20 74 68 61 6e 20 70  ed rather than p
ca40: 6f 69 6e 74 20 74 6f 20 74 68 65 20 69 6e 70 75  oint to the inpu
ca50: 74 20 73 74 72 69 6e 67 20 2d 20 77 68 69 63 68  t string - which
ca60: 20 6d 65 61 6e 73 20 74 68 61 74 0a 20 20 2a 2a   means that.  **
ca70: 20 74 68 65 79 20 77 69 6c 6c 20 70 65 72 73 69   they will persi
ca80: 73 74 20 61 66 74 65 72 20 74 68 65 20 63 75 72  st after the cur
ca90: 72 65 6e 74 20 73 71 6c 69 74 65 33 5f 65 78 65  rent sqlite3_exe
caa0: 63 28 29 20 63 61 6c 6c 20 72 65 74 75 72 6e 73  c() call returns
cab0: 2e 0a 20 20 2a 2f 0a 20 20 70 2d 3e 70 53 65 6c  ..  */.  p->pSel
cac0: 65 63 74 20 3d 20 73 71 6c 69 74 65 33 53 65 6c  ect = sqlite3Sel
cad0: 65 63 74 44 75 70 28 70 53 65 6c 65 63 74 29 3b  ectDup(pSelect);
cae0: 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  .  sqlite3Select
caf0: 44 65 6c 65 74 65 28 70 53 65 6c 65 63 74 29 3b  Delete(pSelect);
cb00: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 4d 61  .  if( sqlite3Ma
cb10: 6c 6c 6f 63 46 61 69 6c 65 64 28 29 20 29 7b 0a  llocFailed() ){.
cb20: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
cb30: 20 20 69 66 28 20 21 70 50 61 72 73 65 2d 3e 64    if( !pParse->d
cb40: 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a  b->init.busy ){.
cb50: 20 20 20 20 73 71 6c 69 74 65 33 56 69 65 77 47      sqlite3ViewG
cb60: 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50  etColumnNames(pP
cb70: 61 72 73 65 2c 20 70 29 3b 0a 20 20 7d 0a 0a 20  arse, p);.  }.. 
cb80: 20 2f 2a 20 4c 6f 63 61 74 65 20 74 68 65 20 65   /* Locate the e
cb90: 6e 64 20 6f 66 20 74 68 65 20 43 52 45 41 54 45  nd of the CREATE
cba0: 20 56 49 45 57 20 73 74 61 74 65 6d 65 6e 74 2e   VIEW statement.
cbb0: 20 20 4d 61 6b 65 20 73 45 6e 64 20 70 6f 69 6e    Make sEnd poin
cbc0: 74 20 74 6f 0a 20 20 2a 2a 20 74 68 65 20 65 6e  t to.  ** the en
cbd0: 64 2e 0a 20 20 2a 2f 0a 20 20 73 45 6e 64 20 3d  d..  */.  sEnd =
cbe0: 20 70 50 61 72 73 65 2d 3e 73 4c 61 73 74 54 6f   pParse->sLastTo
cbf0: 6b 65 6e 3b 0a 20 20 69 66 28 20 73 45 6e 64 2e  ken;.  if( sEnd.
cc00: 7a 5b 30 5d 21 3d 30 20 26 26 20 73 45 6e 64 2e  z[0]!=0 && sEnd.
cc10: 7a 5b 30 5d 21 3d 27 3b 27 20 29 7b 0a 20 20 20  z[0]!=';' ){.   
cc20: 20 73 45 6e 64 2e 7a 20 2b 3d 20 73 45 6e 64 2e   sEnd.z += sEnd.
cc30: 6e 3b 0a 20 20 7d 0a 20 20 73 45 6e 64 2e 6e 20  n;.  }.  sEnd.n 
cc40: 3d 20 30 3b 0a 20 20 6e 20 3d 20 73 45 6e 64 2e  = 0;.  n = sEnd.
cc50: 7a 20 2d 20 70 42 65 67 69 6e 2d 3e 7a 3b 0a 20  z - pBegin->z;. 
cc60: 20 7a 20 3d 20 28 63 6f 6e 73 74 20 75 6e 73 69   z = (const unsi
cc70: 67 6e 65 64 20 63 68 61 72 2a 29 70 42 65 67 69  gned char*)pBegi
cc80: 6e 2d 3e 7a 3b 0a 20 20 77 68 69 6c 65 28 20 6e  n->z;.  while( n
cc90: 3e 30 20 26 26 20 28 7a 5b 6e 2d 31 5d 3d 3d 27  >0 && (z[n-1]=='
cca0: 3b 27 20 7c 7c 20 69 73 73 70 61 63 65 28 7a 5b  ;' || isspace(z[
ccb0: 6e 2d 31 5d 29 29 20 29 7b 20 6e 2d 2d 3b 20 7d  n-1])) ){ n--; }
ccc0: 0a 20 20 73 45 6e 64 2e 7a 20 3d 20 26 7a 5b 6e  .  sEnd.z = &z[n
ccd0: 2d 31 5d 3b 0a 20 20 73 45 6e 64 2e 6e 20 3d 20  -1];.  sEnd.n = 
cce0: 31 3b 0a 0a 20 20 2f 2a 20 55 73 65 20 73 71 6c  1;..  /* Use sql
ccf0: 69 74 65 33 45 6e 64 54 61 62 6c 65 28 29 20 74  ite3EndTable() t
cd00: 6f 20 61 64 64 20 74 68 65 20 76 69 65 77 20 74  o add the view t
cd10: 6f 20 74 68 65 20 53 51 4c 49 54 45 5f 4d 41 53  o the SQLITE_MAS
cd20: 54 45 52 20 74 61 62 6c 65 20 2a 2f 0a 20 20 73  TER table */.  s
cd30: 71 6c 69 74 65 33 45 6e 64 54 61 62 6c 65 28 70  qlite3EndTable(p
cd40: 50 61 72 73 65 2c 20 30 2c 20 26 73 45 6e 64 2c  Parse, 0, &sEnd,
cd50: 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d   0);.  return;.}
cd60: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
cd70: 45 5f 4f 4d 49 54 5f 56 49 45 57 20 2a 2f 0a 0a  E_OMIT_VIEW */..
cd80: 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
cd90: 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 7c  ITE_OMIT_VIEW) |
cda0: 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  | !defined(SQLIT
cdb0: 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
cdc0: 42 4c 45 29 0a 2f 2a 0a 2a 2a 20 54 68 65 20 54  BLE)./*.** The T
cdd0: 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 70  able structure p
cde0: 54 61 62 6c 65 20 69 73 20 72 65 61 6c 6c 79 20  Table is really 
cdf0: 61 20 56 49 45 57 2e 20 20 46 69 6c 6c 20 69 6e  a VIEW.  Fill in
ce00: 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 0a 2a 2a   the names of.**
ce10: 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 6f 66 20   the columns of 
ce20: 74 68 65 20 76 69 65 77 20 69 6e 20 74 68 65 20  the view in the 
ce30: 70 54 61 62 6c 65 20 73 74 72 75 63 74 75 72 65  pTable structure
ce40: 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75  .  Return the nu
ce50: 6d 62 65 72 0a 2a 2a 20 6f 66 20 65 72 72 6f 72  mber.** of error
ce60: 73 2e 20 20 49 66 20 61 6e 20 65 72 72 6f 72 20  s.  If an error 
ce70: 69 73 20 73 65 65 6e 20 6c 65 61 76 65 20 61 6e  is seen leave an
ce80: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69   error message i
ce90: 6e 20 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73  n pParse->zErrMs
cea0: 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  g..*/.int sqlite
ceb0: 33 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61  3ViewGetColumnNa
cec0: 6d 65 73 28 50 61 72 73 65 20 2a 70 50 61 72 73  mes(Parse *pPars
ced0: 65 2c 20 54 61 62 6c 65 20 2a 70 54 61 62 6c 65  e, Table *pTable
cee0: 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 53 65 6c  ){.  Table *pSel
cef0: 54 61 62 3b 20 20 20 2f 2a 20 41 20 66 61 6b 65  Tab;   /* A fake
cf00: 20 74 61 62 6c 65 20 66 72 6f 6d 20 77 68 69 63   table from whic
cf10: 68 20 77 65 20 67 65 74 20 74 68 65 20 72 65 73  h we get the res
cf20: 75 6c 74 20 73 65 74 20 2a 2f 0a 20 20 53 65 6c  ult set */.  Sel
cf30: 65 63 74 20 2a 70 53 65 6c 3b 20 20 20 20 20 2f  ect *pSel;     /
cf40: 2a 20 43 6f 70 79 20 6f 66 20 74 68 65 20 53 45  * Copy of the SE
cf50: 4c 45 43 54 20 74 68 61 74 20 69 6d 70 6c 65 6d  LECT that implem
cf60: 65 6e 74 73 20 74 68 65 20 76 69 65 77 20 2a 2f  ents the view */
cf70: 0a 20 20 69 6e 74 20 6e 45 72 72 20 3d 20 30 3b  .  int nErr = 0;
cf80: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
cf90: 66 20 65 72 72 6f 72 73 20 65 6e 63 6f 75 6e 74  f errors encount
cfa0: 65 72 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 3b  ered */.  int n;
cfb0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
cfc0: 65 6d 70 6f 72 61 72 69 6c 79 20 68 6f 6c 64 73  emporarily holds
cfd0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63   the number of c
cfe0: 75 72 73 6f 72 73 20 61 73 73 69 67 6e 65 64 20  ursors assigned 
cff0: 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 54  */..  assert( pT
d000: 61 62 6c 65 20 29 3b 0a 0a 23 69 66 6e 64 65 66  able );..#ifndef
d010: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
d020: 54 55 41 4c 54 41 42 4c 45 0a 20 20 69 66 28 20  TUALTABLE.  if( 
d030: 73 71 6c 69 74 65 33 56 74 61 62 43 61 6c 6c 43  sqlite3VtabCallC
d040: 6f 6e 6e 65 63 74 28 70 50 61 72 73 65 2c 20 70  onnect(pParse, p
d050: 54 61 62 6c 65 29 20 29 7b 0a 20 20 20 20 72 65  Table) ){.    re
d060: 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
d070: 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 49 73 56  R;.  }.  if( IsV
d080: 69 72 74 75 61 6c 28 70 54 61 62 6c 65 29 20 29  irtual(pTable) )
d090: 20 72 65 74 75 72 6e 20 30 3b 0a 23 65 6e 64 69   return 0;.#endi
d0a0: 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  f..#ifndef SQLIT
d0b0: 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 20 20 2f 2a  E_OMIT_VIEW.  /*
d0c0: 20 41 20 70 6f 73 69 74 69 76 65 20 6e 43 6f 6c   A positive nCol
d0d0: 20 6d 65 61 6e 73 20 74 68 65 20 63 6f 6c 75 6d   means the colum
d0e0: 6e 73 20 6e 61 6d 65 73 20 66 6f 72 20 74 68 69  ns names for thi
d0f0: 73 20 76 69 65 77 20 61 72 65 0a 20 20 2a 2a 20  s view are.  ** 
d100: 61 6c 72 65 61 64 79 20 6b 6e 6f 77 6e 2e 0a 20  already known.. 
d110: 20 2a 2f 0a 20 20 69 66 28 20 70 54 61 62 6c 65   */.  if( pTable
d120: 2d 3e 6e 43 6f 6c 3e 30 20 29 20 72 65 74 75 72  ->nCol>0 ) retur
d130: 6e 20 30 3b 0a 0a 20 20 2f 2a 20 41 20 6e 65 67  n 0;..  /* A neg
d140: 61 74 69 76 65 20 6e 43 6f 6c 20 69 73 20 61 20  ative nCol is a 
d150: 73 70 65 63 69 61 6c 20 6d 61 72 6b 65 72 20 6d  special marker m
d160: 65 61 6e 69 6e 67 20 74 68 61 74 20 77 65 20 61  eaning that we a
d170: 72 65 20 63 75 72 72 65 6e 74 6c 79 0a 20 20 2a  re currently.  *
d180: 2a 20 74 72 79 69 6e 67 20 74 6f 20 63 6f 6d 70  * trying to comp
d190: 75 74 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e  ute the column n
d1a0: 61 6d 65 73 2e 20 20 49 66 20 77 65 20 65 6e 74  ames.  If we ent
d1b0: 65 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  er this routine 
d1c0: 77 69 74 68 0a 20 20 2a 2a 20 61 20 6e 65 67 61  with.  ** a nega
d1d0: 74 69 76 65 20 6e 43 6f 6c 2c 20 69 74 20 6d 65  tive nCol, it me
d1e0: 61 6e 73 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20  ans two or more 
d1f0: 76 69 65 77 73 20 66 6f 72 6d 20 61 20 6c 6f 6f  views form a loo
d200: 70 2c 20 6c 69 6b 65 20 74 68 69 73 3a 0a 20 20  p, like this:.  
d210: 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 43 52 45 41  **.  **     CREA
d220: 54 45 20 56 49 45 57 20 6f 6e 65 20 41 53 20 53  TE VIEW one AS S
d230: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 77 6f  ELECT * FROM two
d240: 3b 0a 20 20 2a 2a 20 20 20 20 20 43 52 45 41 54  ;.  **     CREAT
d250: 45 20 56 49 45 57 20 74 77 6f 20 41 53 20 53 45  E VIEW two AS SE
d260: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 6f 6e 65 3b  LECT * FROM one;
d270: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 63 74 75 61  .  **.  ** Actua
d280: 6c 6c 79 2c 20 74 68 69 73 20 65 72 72 6f 72 20  lly, this error 
d290: 69 73 20 63 61 75 67 68 74 20 70 72 65 76 69 6f  is caught previo
d2a0: 75 73 6c 79 20 61 6e 64 20 73 6f 20 74 68 65 20  usly and so the 
d2b0: 66 6f 6c 6c 6f 77 69 6e 67 20 74 65 73 74 0a 20  following test. 
d2c0: 20 2a 2a 20 73 68 6f 75 6c 64 20 61 6c 77 61 79   ** should alway
d2d0: 73 20 66 61 69 6c 2e 20 20 42 75 74 20 77 65 20  s fail.  But we 
d2e0: 77 69 6c 6c 20 6c 65 61 76 65 20 69 74 20 69 6e  will leave it in
d2f0: 20 70 6c 61 63 65 20 6a 75 73 74 20 74 6f 20 62   place just to b
d300: 65 20 73 61 66 65 2e 0a 20 20 2a 2f 0a 20 20 69  e safe..  */.  i
d310: 66 28 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3c  f( pTable->nCol<
d320: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
d330: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
d340: 20 22 76 69 65 77 20 25 73 20 69 73 20 63 69 72   "view %s is cir
d350: 63 75 6c 61 72 6c 79 20 64 65 66 69 6e 65 64 22  cularly defined"
d360: 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 29  , pTable->zName)
d370: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a  ;.    return 1;.
d380: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 54    }.  assert( pT
d390: 61 62 6c 65 2d 3e 6e 43 6f 6c 3e 3d 30 20 29 3b  able->nCol>=0 );
d3a0: 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 67 65 74  ..  /* If we get
d3b0: 20 74 68 69 73 20 66 61 72 2c 20 69 74 20 6d 65   this far, it me
d3c0: 61 6e 73 20 77 65 20 6e 65 65 64 20 74 6f 20 63  ans we need to c
d3d0: 6f 6d 70 75 74 65 20 74 68 65 20 74 61 62 6c 65  ompute the table
d3e0: 20 6e 61 6d 65 73 2e 0a 20 20 2a 2a 20 4e 6f 74   names..  ** Not
d3f0: 65 20 74 68 61 74 20 74 68 65 20 63 61 6c 6c 20  e that the call 
d400: 74 6f 20 73 71 6c 69 74 65 33 52 65 73 75 6c 74  to sqlite3Result
d410: 53 65 74 4f 66 53 65 6c 65 63 74 28 29 20 77 69  SetOfSelect() wi
d420: 6c 6c 20 65 78 70 61 6e 64 20 61 6e 79 0a 20 20  ll expand any.  
d430: 2a 2a 20 22 2a 22 20 65 6c 65 6d 65 6e 74 73 20  ** "*" elements 
d440: 69 6e 20 74 68 65 20 72 65 73 75 6c 74 73 20 73  in the results s
d450: 65 74 20 6f 66 20 74 68 65 20 76 69 65 77 20 61  et of the view a
d460: 6e 64 20 77 69 6c 6c 20 61 73 73 69 67 6e 20 63  nd will assign c
d470: 75 72 73 6f 72 73 0a 20 20 2a 2a 20 74 6f 20 74  ursors.  ** to t
d480: 68 65 20 65 6c 65 6d 65 6e 74 73 20 6f 66 20 74  he elements of t
d490: 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20  he FROM clause. 
d4a0: 20 42 75 74 20 77 65 20 64 6f 20 6e 6f 74 20 77   But we do not w
d4b0: 61 6e 74 20 74 68 65 73 65 20 63 68 61 6e 67 65  ant these change
d4c0: 73 0a 20 20 2a 2a 20 74 6f 20 62 65 20 70 65 72  s.  ** to be per
d4d0: 6d 61 6e 65 6e 74 2e 20 20 53 6f 20 74 68 65 20  manent.  So the 
d4e0: 63 6f 6d 70 75 74 61 74 69 6f 6e 20 69 73 20 64  computation is d
d4f0: 6f 6e 65 20 6f 6e 20 61 20 63 6f 70 79 20 6f 66  one on a copy of
d500: 20 74 68 65 20 53 45 4c 45 43 54 0a 20 20 2a 2a   the SELECT.  **
d510: 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20   statement that 
d520: 64 65 66 69 6e 65 73 20 74 68 65 20 76 69 65 77  defines the view
d530: 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
d540: 20 70 54 61 62 6c 65 2d 3e 70 53 65 6c 65 63 74   pTable->pSelect
d550: 20 29 3b 0a 20 20 70 53 65 6c 20 3d 20 73 71 6c   );.  pSel = sql
d560: 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 70 54  ite3SelectDup(pT
d570: 61 62 6c 65 2d 3e 70 53 65 6c 65 63 74 29 3b 0a  able->pSelect);.
d580: 20 20 69 66 28 20 70 53 65 6c 20 29 7b 0a 20 20    if( pSel ){.  
d590: 20 20 6e 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54    n = pParse->nT
d5a0: 61 62 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53  ab;.    sqlite3S
d5b0: 72 63 4c 69 73 74 41 73 73 69 67 6e 43 75 72 73  rcListAssignCurs
d5c0: 6f 72 73 28 70 50 61 72 73 65 2c 20 70 53 65 6c  ors(pParse, pSel
d5d0: 2d 3e 70 53 72 63 29 3b 0a 20 20 20 20 70 54 61  ->pSrc);.    pTa
d5e0: 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 2d 31 3b 0a  ble->nCol = -1;.
d5f0: 20 20 20 20 70 53 65 6c 54 61 62 20 3d 20 73 71      pSelTab = sq
d600: 6c 69 74 65 33 52 65 73 75 6c 74 53 65 74 4f 66  lite3ResultSetOf
d610: 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 30  Select(pParse, 0
d620: 2c 20 70 53 65 6c 29 3b 0a 20 20 20 20 70 50 61  , pSel);.    pPa
d630: 72 73 65 2d 3e 6e 54 61 62 20 3d 20 6e 3b 0a 20  rse->nTab = n;. 
d640: 20 20 20 69 66 28 20 70 53 65 6c 54 61 62 20 29     if( pSelTab )
d650: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
d660: 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 3d 3d 30 20  pTable->aCol==0 
d670: 29 3b 0a 20 20 20 20 20 20 70 54 61 62 6c 65 2d  );.      pTable-
d680: 3e 6e 43 6f 6c 20 3d 20 70 53 65 6c 54 61 62 2d  >nCol = pSelTab-
d690: 3e 6e 43 6f 6c 3b 0a 20 20 20 20 20 20 70 54 61  >nCol;.      pTa
d6a0: 62 6c 65 2d 3e 61 43 6f 6c 20 3d 20 70 53 65 6c  ble->aCol = pSel
d6b0: 54 61 62 2d 3e 61 43 6f 6c 3b 0a 20 20 20 20 20  Tab->aCol;.     
d6c0: 20 70 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c 20 3d   pSelTab->nCol =
d6d0: 20 30 3b 0a 20 20 20 20 20 20 70 53 65 6c 54 61   0;.      pSelTa
d6e0: 62 2d 3e 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 20  b->aCol = 0;.   
d6f0: 20 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65     sqlite3Delete
d700: 54 61 62 6c 65 28 30 2c 20 70 53 65 6c 54 61 62  Table(0, pSelTab
d710: 29 3b 0a 20 20 20 20 20 20 70 54 61 62 6c 65 2d  );.      pTable-
d720: 3e 70 53 63 68 65 6d 61 2d 3e 66 6c 61 67 73 20  >pSchema->flags 
d730: 7c 3d 20 44 42 5f 55 6e 72 65 73 65 74 56 69 65  |= DB_UnresetVie
d740: 77 73 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ws;.    }else{. 
d750: 20 20 20 20 20 70 54 61 62 6c 65 2d 3e 6e 43 6f       pTable->nCo
d760: 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 6e 45 72  l = 0;.      nEr
d770: 72 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  r++;.    }.    s
d780: 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65  qlite3SelectDele
d790: 74 65 28 70 53 65 6c 29 3b 0a 20 20 7d 20 65 6c  te(pSel);.  } el
d7a0: 73 65 20 7b 0a 20 20 20 20 6e 45 72 72 2b 2b 3b  se {.    nErr++;
d7b0: 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  .  }.#endif /* S
d7c0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 20  QLITE_OMIT_VIEW 
d7d0: 2a 2f 0a 20 20 72 65 74 75 72 6e 20 6e 45 72 72  */.  return nErr
d7e0: 3b 20 20 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  ;  .}.#endif /* 
d7f0: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
d800: 4f 4d 49 54 5f 56 49 45 57 29 20 7c 7c 20 21 64  OMIT_VIEW) || !d
d810: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
d820: 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29  IT_VIRTUALTABLE)
d830: 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c   */..#ifndef SQL
d840: 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 2f 2a  ITE_OMIT_VIEW./*
d850: 0a 2a 2a 20 43 6c 65 61 72 20 74 68 65 20 63 6f  .** Clear the co
d860: 6c 75 6d 6e 20 6e 61 6d 65 73 20 66 72 6f 6d 20  lumn names from 
d870: 65 76 65 72 79 20 56 49 45 57 20 69 6e 20 64 61  every VIEW in da
d880: 74 61 62 61 73 65 20 69 64 78 2e 0a 2a 2f 0a 73  tabase idx..*/.s
d890: 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74  tatic void sqlit
d8a0: 65 56 69 65 77 52 65 73 65 74 41 6c 6c 28 73 71  eViewResetAll(sq
d8b0: 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 69  lite3 *db, int i
d8c0: 64 78 29 7b 0a 20 20 48 61 73 68 45 6c 65 6d 20  dx){.  HashElem 
d8d0: 2a 69 3b 0a 20 20 69 66 28 20 21 44 62 48 61 73  *i;.  if( !DbHas
d8e0: 50 72 6f 70 65 72 74 79 28 64 62 2c 20 69 64 78  Property(db, idx
d8f0: 2c 20 44 42 5f 55 6e 72 65 73 65 74 56 69 65 77  , DB_UnresetView
d900: 73 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66  s) ) return;.  f
d910: 6f 72 28 69 3d 73 71 6c 69 74 65 48 61 73 68 46  or(i=sqliteHashF
d920: 69 72 73 74 28 26 64 62 2d 3e 61 44 62 5b 69 64  irst(&db->aDb[id
d930: 78 5d 2e 70 53 63 68 65 6d 61 2d 3e 74 62 6c 48  x].pSchema->tblH
d940: 61 73 68 29 3b 20 69 3b 69 3d 73 71 6c 69 74 65  ash); i;i=sqlite
d950: 48 61 73 68 4e 65 78 74 28 69 29 29 7b 0a 20 20  HashNext(i)){.  
d960: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20    Table *pTab = 
d970: 73 71 6c 69 74 65 48 61 73 68 44 61 74 61 28 69  sqliteHashData(i
d980: 29 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62 2d  );.    if( pTab-
d990: 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20  >pSelect ){.    
d9a0: 20 20 73 71 6c 69 74 65 52 65 73 65 74 43 6f 6c    sqliteResetCol
d9b0: 75 6d 6e 4e 61 6d 65 73 28 70 54 61 62 29 3b 0a  umnNames(pTab);.
d9c0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 44 62 43 6c      }.  }.  DbCl
d9d0: 65 61 72 50 72 6f 70 65 72 74 79 28 64 62 2c 20  earProperty(db, 
d9e0: 69 64 78 2c 20 44 42 5f 55 6e 72 65 73 65 74 56  idx, DB_UnresetV
d9f0: 69 65 77 73 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23  iews);.}.#else.#
da00: 20 64 65 66 69 6e 65 20 73 71 6c 69 74 65 56 69   define sqliteVi
da10: 65 77 52 65 73 65 74 41 6c 6c 28 41 2c 42 29 0a  ewResetAll(A,B).
da20: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
da30: 5f 4f 4d 49 54 5f 56 49 45 57 20 2a 2f 0a 0a 2f  _OMIT_VIEW */../
da40: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
da50: 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20  on is called by 
da60: 74 68 65 20 56 44 42 45 20 74 6f 20 61 64 6a 75  the VDBE to adju
da70: 73 74 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20  st the internal 
da80: 73 63 68 65 6d 61 0a 2a 2a 20 75 73 65 64 20 62  schema.** used b
da90: 79 20 53 51 4c 69 74 65 20 77 68 65 6e 20 74 68  y SQLite when th
daa0: 65 20 62 74 72 65 65 20 6c 61 79 65 72 20 6d 6f  e btree layer mo
dab0: 76 65 73 20 61 20 74 61 62 6c 65 20 72 6f 6f 74  ves a table root
dac0: 20 70 61 67 65 2e 20 54 68 65 0a 2a 2a 20 72 6f   page. The.** ro
dad0: 6f 74 2d 70 61 67 65 20 6f 66 20 61 20 74 61 62  ot-page of a tab
dae0: 6c 65 20 6f 72 20 69 6e 64 65 78 20 69 6e 20 64  le or index in d
daf0: 61 74 61 62 61 73 65 20 69 44 62 20 68 61 73 20  atabase iDb has 
db00: 63 68 61 6e 67 65 64 20 66 72 6f 6d 20 69 46 72  changed from iFr
db10: 6f 6d 0a 2a 2a 20 74 6f 20 69 54 6f 2e 0a 2a 2a  om.** to iTo..**
db20: 0a 2a 2a 20 54 69 63 6b 65 74 20 23 31 37 32 38  .** Ticket #1728
db30: 3a 20 20 54 68 65 20 73 79 6d 62 6f 6c 20 74 61  :  The symbol ta
db40: 62 6c 65 20 6d 69 67 68 74 20 73 74 69 6c 6c 20  ble might still 
db50: 63 6f 6e 74 61 69 6e 20 69 6e 66 6f 72 6d 61 74  contain informat
db60: 69 6f 6e 0a 2a 2a 20 6f 6e 20 74 61 62 6c 65 73  ion.** on tables
db70: 20 61 6e 64 2f 6f 72 20 69 6e 64 69 63 65 73 20   and/or indices 
db80: 74 68 61 74 20 61 72 65 20 74 68 65 20 70 72 6f  that are the pro
db90: 63 65 73 73 20 6f 66 20 62 65 69 6e 67 20 64 65  cess of being de
dba0: 6c 65 74 65 64 2e 0a 2a 2a 20 49 66 20 79 6f 75  leted..** If you
dbb0: 20 61 72 65 20 75 6e 6c 75 63 6b 79 2c 20 6f 6e   are unlucky, on
dbc0: 65 20 6f 66 20 74 68 6f 73 65 20 64 65 6c 65 74  e of those delet
dbd0: 65 64 20 69 6e 64 69 63 65 73 20 6f 72 20 74 61  ed indices or ta
dbe0: 62 6c 65 73 20 6d 69 67 68 74 0a 2a 2a 20 68 61  bles might.** ha
dbf0: 76 65 20 74 68 65 20 73 61 6d 65 20 72 6f 6f 74  ve the same root
dc00: 70 61 67 65 20 6e 75 6d 62 65 72 20 61 73 20 74  page number as t
dc10: 68 65 20 72 65 61 6c 20 74 61 62 6c 65 20 6f 72  he real table or
dc20: 20 69 6e 64 65 78 20 74 68 61 74 20 69 73 0a 2a   index that is.*
dc30: 2a 20 62 65 69 6e 67 20 6d 6f 76 65 64 2e 20 20  * being moved.  
dc40: 53 6f 20 77 65 20 63 61 6e 6e 6f 74 20 73 74 6f  So we cannot sto
dc50: 70 20 73 65 61 72 63 68 69 6e 67 20 61 66 74 65  p searching afte
dc60: 72 20 74 68 65 20 66 69 72 73 74 20 6d 61 74 63  r the first matc
dc70: 68 20 0a 2a 2a 20 62 65 63 61 75 73 65 20 74 68  h .** because th
dc80: 65 20 66 69 72 73 74 20 6d 61 74 63 68 20 6d 69  e first match mi
dc90: 67 68 74 20 62 65 20 66 6f 72 20 6f 6e 65 20 6f  ght be for one o
dca0: 66 20 74 68 65 20 64 65 6c 65 74 65 64 20 69 6e  f the deleted in
dcb0: 64 69 63 65 73 0a 2a 2a 20 6f 72 20 74 61 62 6c  dices.** or tabl
dcc0: 65 73 20 61 6e 64 20 6e 6f 74 20 74 68 65 20 74  es and not the t
dcd0: 61 62 6c 65 2f 69 6e 64 65 78 20 74 68 61 74 20  able/index that 
dce0: 69 73 20 61 63 74 75 61 6c 6c 79 20 62 65 69 6e  is actually bein
dcf0: 67 20 6d 6f 76 65 64 2e 0a 2a 2a 20 57 65 20 6d  g moved..** We m
dd00: 75 73 74 20 63 6f 6e 74 69 6e 75 65 20 6c 6f 6f  ust continue loo
dd10: 70 69 6e 67 20 75 6e 74 69 6c 20 61 6c 6c 20 74  ping until all t
dd20: 61 62 6c 65 73 20 61 6e 64 20 69 6e 64 69 63 65  ables and indice
dd30: 73 20 77 69 74 68 0a 2a 2a 20 72 6f 6f 74 70 61  s with.** rootpa
dd40: 67 65 3d 3d 69 46 72 6f 6d 20 68 61 76 65 20 62  ge==iFrom have b
dd50: 65 65 6e 20 63 6f 6e 76 65 72 74 65 64 20 74 6f  een converted to
dd60: 20 68 61 76 65 20 61 20 72 6f 6f 74 70 61 67 65   have a rootpage
dd70: 20 6f 66 20 69 54 6f 0a 2a 2a 20 69 6e 20 6f 72   of iTo.** in or
dd80: 64 65 72 20 74 6f 20 62 65 20 63 65 72 74 61 69  der to be certai
dd90: 6e 20 74 68 61 74 20 77 65 20 67 6f 74 20 74 68  n that we got th
dda0: 65 20 72 69 67 68 74 20 6f 6e 65 2e 0a 2a 2f 0a  e right one..*/.
ddb0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
ddc0: 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 76  MIT_AUTOVACUUM.v
ddd0: 6f 69 64 20 73 71 6c 69 74 65 33 52 6f 6f 74 50  oid sqlite3RootP
dde0: 61 67 65 4d 6f 76 65 64 28 44 62 20 2a 70 44 62  ageMoved(Db *pDb
ddf0: 2c 20 69 6e 74 20 69 46 72 6f 6d 2c 20 69 6e 74  , int iFrom, int
de00: 20 69 54 6f 29 7b 0a 20 20 48 61 73 68 45 6c 65   iTo){.  HashEle
de10: 6d 20 2a 70 45 6c 65 6d 3b 0a 20 20 48 61 73 68  m *pElem;.  Hash
de20: 20 2a 70 48 61 73 68 3b 0a 0a 20 20 70 48 61 73   *pHash;..  pHas
de30: 68 20 3d 20 26 70 44 62 2d 3e 70 53 63 68 65 6d  h = &pDb->pSchem
de40: 61 2d 3e 74 62 6c 48 61 73 68 3b 0a 20 20 66 6f  a->tblHash;.  fo
de50: 72 28 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61  r(pElem=sqliteHa
de60: 73 68 46 69 72 73 74 28 70 48 61 73 68 29 3b 20  shFirst(pHash); 
de70: 70 45 6c 65 6d 3b 20 70 45 6c 65 6d 3d 73 71 6c  pElem; pElem=sql
de80: 69 74 65 48 61 73 68 4e 65 78 74 28 70 45 6c 65  iteHashNext(pEle
de90: 6d 29 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a  m)){.    Table *
dea0: 70 54 61 62 20 3d 20 73 71 6c 69 74 65 48 61 73  pTab = sqliteHas
deb0: 68 44 61 74 61 28 70 45 6c 65 6d 29 3b 0a 20 20  hData(pElem);.  
dec0: 20 20 69 66 28 20 70 54 61 62 2d 3e 74 6e 75 6d    if( pTab->tnum
ded0: 3d 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20  ==iFrom ){.     
dee0: 20 70 54 61 62 2d 3e 74 6e 75 6d 20 3d 20 69 54   pTab->tnum = iT
def0: 6f 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70  o;.    }.  }.  p
df00: 48 61 73 68 20 3d 20 26 70 44 62 2d 3e 70 53 63  Hash = &pDb->pSc
df10: 68 65 6d 61 2d 3e 69 64 78 48 61 73 68 3b 0a 20  hema->idxHash;. 
df20: 20 66 6f 72 28 70 45 6c 65 6d 3d 73 71 6c 69 74   for(pElem=sqlit
df30: 65 48 61 73 68 46 69 72 73 74 28 70 48 61 73 68  eHashFirst(pHash
df40: 29 3b 20 70 45 6c 65 6d 3b 20 70 45 6c 65 6d 3d  ); pElem; pElem=
df50: 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28 70  sqliteHashNext(p
df60: 45 6c 65 6d 29 29 7b 0a 20 20 20 20 49 6e 64 65  Elem)){.    Inde
df70: 78 20 2a 70 49 64 78 20 3d 20 73 71 6c 69 74 65  x *pIdx = sqlite
df80: 48 61 73 68 44 61 74 61 28 70 45 6c 65 6d 29 3b  HashData(pElem);
df90: 0a 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 74  .    if( pIdx->t
dfa0: 6e 75 6d 3d 3d 69 46 72 6f 6d 20 29 7b 0a 20 20  num==iFrom ){.  
dfb0: 20 20 20 20 70 49 64 78 2d 3e 74 6e 75 6d 20 3d      pIdx->tnum =
dfc0: 20 69 54 6f 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   iTo;.    }.  }.
dfd0: 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
dfe0: 57 72 69 74 65 20 63 6f 64 65 20 74 6f 20 65 72  Write code to er
dff0: 61 73 65 20 74 68 65 20 74 61 62 6c 65 20 77 69  ase the table wi
e000: 74 68 20 72 6f 6f 74 2d 70 61 67 65 20 69 54 61  th root-page iTa
e010: 62 6c 65 20 66 72 6f 6d 20 64 61 74 61 62 61 73  ble from databas
e020: 65 20 69 44 62 2e 0a 2a 2a 20 41 6c 73 6f 20 77  e iDb..** Also w
e030: 72 69 74 65 20 63 6f 64 65 20 74 6f 20 6d 6f 64  rite code to mod
e040: 69 66 79 20 74 68 65 20 73 71 6c 69 74 65 5f 6d  ify the sqlite_m
e050: 61 73 74 65 72 20 74 61 62 6c 65 20 61 6e 64 20  aster table and 
e060: 69 6e 74 65 72 6e 61 6c 20 73 63 68 65 6d 61 0a  internal schema.
e070: 2a 2a 20 69 66 20 61 20 72 6f 6f 74 2d 70 61 67  ** if a root-pag
e080: 65 20 6f 66 20 61 6e 6f 74 68 65 72 20 74 61 62  e of another tab
e090: 6c 65 20 69 73 20 6d 6f 76 65 64 20 62 79 20 74  le is moved by t
e0a0: 68 65 20 62 74 72 65 65 2d 6c 61 79 65 72 20 77  he btree-layer w
e0b0: 68 69 6c 73 74 0a 2a 2a 20 65 72 61 73 69 6e 67  hilst.** erasing
e0c0: 20 69 54 61 62 6c 65 20 28 74 68 69 73 20 63 61   iTable (this ca
e0d0: 6e 20 68 61 70 70 65 6e 20 77 69 74 68 20 61 6e  n happen with an
e0e0: 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74   auto-vacuum dat
e0f0: 61 62 61 73 65 29 2e 0a 2a 2f 20 0a 73 74 61 74  abase)..*/ .stat
e100: 69 63 20 76 6f 69 64 20 64 65 73 74 72 6f 79 52  ic void destroyR
e110: 6f 6f 74 50 61 67 65 28 50 61 72 73 65 20 2a 70  ootPage(Parse *p
e120: 50 61 72 73 65 2c 20 69 6e 74 20 69 54 61 62 6c  Parse, int iTabl
e130: 65 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20 20 56  e, int iDb){.  V
e140: 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33  dbe *v = sqlite3
e150: 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
e160: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
e170: 64 4f 70 28 76 2c 20 4f 50 5f 44 65 73 74 72 6f  dOp(v, OP_Destro
e180: 79 2c 20 69 54 61 62 6c 65 2c 20 69 44 62 29 3b  y, iTable, iDb);
e190: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
e1a0: 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
e1b0: 20 20 2f 2a 20 4f 50 5f 44 65 73 74 72 6f 79 20    /* OP_Destroy 
e1c0: 70 75 73 68 65 73 20 61 6e 20 69 6e 74 65 67 65  pushes an intege
e1d0: 72 20 6f 6e 74 6f 20 74 68 65 20 73 74 61 63 6b  r onto the stack
e1e0: 2e 20 49 66 20 74 68 69 73 20 69 6e 74 65 67 65  . If this intege
e1f0: 72 0a 20 20 2a 2a 20 69 73 20 6e 6f 6e 2d 7a 65  r.  ** is non-ze
e200: 72 6f 2c 20 74 68 65 6e 20 69 74 20 69 73 20 74  ro, then it is t
e210: 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d  he root page num
e220: 62 65 72 20 6f 66 20 61 20 74 61 62 6c 65 20 6d  ber of a table m
e230: 6f 76 65 64 20 74 6f 0a 20 20 2a 2a 20 6c 6f 63  oved to.  ** loc
e240: 61 74 69 6f 6e 20 69 54 61 62 6c 65 2e 20 54 68  ation iTable. Th
e250: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 64 65  e following code
e260: 20 6d 6f 64 69 66 69 65 73 20 74 68 65 20 73 71   modifies the sq
e270: 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c  lite_master tabl
e280: 65 20 74 6f 0a 20 20 2a 2a 20 72 65 66 6c 65 63  e to.  ** reflec
e290: 74 20 74 68 69 73 2e 0a 20 20 2a 2a 0a 20 20 2a  t this..  **.  *
e2a0: 2a 20 54 68 65 20 22 23 30 22 20 69 6e 20 74 68  * The "#0" in th
e2b0: 65 20 53 51 4c 20 69 73 20 61 20 73 70 65 63 69  e SQL is a speci
e2c0: 61 6c 20 63 6f 6e 73 74 61 6e 74 20 74 68 61 74  al constant that
e2d0: 20 6d 65 61 6e 73 20 77 68 61 74 65 76 65 72 20   means whatever 
e2e0: 76 61 6c 75 65 0a 20 20 2a 2a 20 69 73 20 6f 6e  value.  ** is on
e2f0: 20 74 68 65 20 74 6f 70 20 6f 66 20 74 68 65 20   the top of the 
e300: 73 74 61 63 6b 2e 20 20 53 65 65 20 73 71 6c 69  stack.  See sqli
e310: 74 65 33 52 65 67 69 73 74 65 72 45 78 70 72 28  te3RegisterExpr(
e320: 29 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  )..  */.  sqlite
e330: 33 4e 65 73 74 65 64 50 61 72 73 65 28 70 50 61  3NestedParse(pPa
e340: 72 73 65 2c 20 0a 20 20 20 20 20 22 55 50 44 41  rse, .     "UPDA
e350: 54 45 20 25 51 2e 25 73 20 53 45 54 20 72 6f 6f  TE %Q.%s SET roo
e360: 74 70 61 67 65 3d 25 64 20 57 48 45 52 45 20 23  tpage=%d WHERE #
e370: 30 20 41 4e 44 20 72 6f 6f 74 70 61 67 65 3d 23  0 AND rootpage=#
e380: 30 22 2c 0a 20 20 20 20 20 70 50 61 72 73 65 2d  0",.     pParse-
e390: 3e 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e  >db->aDb[iDb].zN
e3a0: 61 6d 65 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c  ame, SCHEMA_TABL
e3b0: 45 28 69 44 62 29 2c 20 69 54 61 62 6c 65 29 3b  E(iDb), iTable);
e3c0: 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a  .#endif.}../*.**
e3d0: 20 57 72 69 74 65 20 56 44 42 45 20 63 6f 64 65   Write VDBE code
e3e0: 20 74 6f 20 65 72 61 73 65 20 74 61 62 6c 65 20   to erase table 
e3f0: 70 54 61 62 20 61 6e 64 20 61 6c 6c 20 61 73 73  pTab and all ass
e400: 6f 63 69 61 74 65 64 20 69 6e 64 69 63 65 73 20  ociated indices 
e410: 6f 6e 20 64 69 73 6b 2e 0a 2a 2a 20 43 6f 64 65  on disk..** Code
e420: 20 74 6f 20 75 70 64 61 74 65 20 74 68 65 20 73   to update the s
e430: 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62  qlite_master tab
e440: 6c 65 73 20 61 6e 64 20 69 6e 74 65 72 6e 61 6c  les and internal
e450: 20 73 63 68 65 6d 61 20 64 65 66 69 6e 69 74 69   schema definiti
e460: 6f 6e 73 0a 2a 2a 20 69 6e 20 63 61 73 65 20 61  ons.** in case a
e470: 20 72 6f 6f 74 2d 70 61 67 65 20 62 65 6c 6f 6e   root-page belon
e480: 67 69 6e 67 20 74 6f 20 61 6e 6f 74 68 65 72 20  ging to another 
e490: 74 61 62 6c 65 20 69 73 20 6d 6f 76 65 64 20 62  table is moved b
e4a0: 79 20 74 68 65 20 62 74 72 65 65 20 6c 61 79 65  y the btree laye
e4b0: 72 0a 2a 2a 20 69 73 20 61 6c 73 6f 20 61 64 64  r.** is also add
e4c0: 65 64 20 28 74 68 69 73 20 63 61 6e 20 68 61 70  ed (this can hap
e4d0: 70 65 6e 20 77 69 74 68 20 61 6e 20 61 75 74 6f  pen with an auto
e4e0: 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61 73 65  -vacuum database
e4f0: 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  )..*/.static voi
e500: 64 20 64 65 73 74 72 6f 79 54 61 62 6c 65 28 50  d destroyTable(P
e510: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 61  arse *pParse, Ta
e520: 62 6c 65 20 2a 70 54 61 62 29 7b 0a 23 69 66 64  ble *pTab){.#ifd
e530: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
e540: 55 54 4f 56 41 43 55 55 4d 0a 20 20 49 6e 64 65  UTOVACUUM.  Inde
e550: 78 20 2a 70 49 64 78 3b 0a 20 20 69 6e 74 20 69  x *pIdx;.  int i
e560: 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65  Db = sqlite3Sche
e570: 6d 61 54 6f 49 6e 64 65 78 28 70 50 61 72 73 65  maToIndex(pParse
e580: 2d 3e 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68  ->db, pTab->pSch
e590: 65 6d 61 29 3b 0a 20 20 64 65 73 74 72 6f 79 52  ema);.  destroyR
e5a0: 6f 6f 74 50 61 67 65 28 70 50 61 72 73 65 2c 20  ootPage(pParse, 
e5b0: 70 54 61 62 2d 3e 74 6e 75 6d 2c 20 69 44 62 29  pTab->tnum, iDb)
e5c0: 3b 0a 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61  ;.  for(pIdx=pTa
e5d0: 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b  b->pIndex; pIdx;
e5e0: 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78   pIdx=pIdx->pNex
e5f0: 74 29 7b 0a 20 20 20 20 64 65 73 74 72 6f 79 52  t){.    destroyR
e600: 6f 6f 74 50 61 67 65 28 70 50 61 72 73 65 2c 20  ootPage(pParse, 
e610: 70 49 64 78 2d 3e 74 6e 75 6d 2c 20 69 44 62 29  pIdx->tnum, iDb)
e620: 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20 2f 2a  ;.  }.#else.  /*
e630: 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65   If the database
e640: 20 6d 61 79 20 62 65 20 61 75 74 6f 2d 76 61 63   may be auto-vac
e650: 75 75 6d 20 63 61 70 61 62 6c 65 20 28 69 66 20  uum capable (if 
e660: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
e670: 56 41 43 55 55 4d 0a 20 20 2a 2a 20 69 73 20 6e  VACUUM.  ** is n
e680: 6f 74 20 64 65 66 69 6e 65 64 29 2c 20 74 68 65  ot defined), the
e690: 6e 20 69 74 20 69 73 20 69 6d 70 6f 72 74 61 6e  n it is importan
e6a0: 74 20 74 6f 20 63 61 6c 6c 20 4f 50 5f 44 65 73  t to call OP_Des
e6b0: 74 72 6f 79 20 6f 6e 20 74 68 65 0a 20 20 2a 2a  troy on the.  **
e6c0: 20 74 61 62 6c 65 20 61 6e 64 20 69 6e 64 65 78   table and index
e6d0: 20 72 6f 6f 74 2d 70 61 67 65 73 20 69 6e 20 6f   root-pages in o
e6e0: 72 64 65 72 2c 20 73 74 61 72 74 69 6e 67 20 77  rder, starting w
e6f0: 69 74 68 20 74 68 65 20 6e 75 6d 65 72 69 63 61  ith the numerica
e700: 6c 6c 79 20 0a 20 20 2a 2a 20 6c 61 72 67 65 73  lly .  ** larges
e710: 74 20 72 6f 6f 74 2d 70 61 67 65 20 6e 75 6d 62  t root-page numb
e720: 65 72 2e 20 54 68 69 73 20 67 75 61 72 61 6e 74  er. This guarant
e730: 65 65 73 20 74 68 61 74 20 6e 6f 6e 65 20 6f 66  ees that none of
e740: 20 74 68 65 20 72 6f 6f 74 2d 70 61 67 65 73 0a   the root-pages.
e750: 20 20 2a 2a 20 74 6f 20 62 65 20 64 65 73 74 72    ** to be destr
e760: 6f 79 65 64 20 69 73 20 72 65 6c 6f 63 61 74 65  oyed is relocate
e770: 64 20 62 79 20 61 6e 20 65 61 72 6c 69 65 72 20  d by an earlier 
e780: 4f 50 5f 44 65 73 74 72 6f 79 2e 20 69 2e 65 2e  OP_Destroy. i.e.
e790: 20 69 66 20 74 68 65 0a 20 20 2a 2a 20 66 6f 6c   if the.  ** fol
e7a0: 6c 6f 77 69 6e 67 20 77 65 72 65 20 63 6f 64 65  lowing were code
e7b0: 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4f 50 5f  d:.  **.  ** OP_
e7c0: 44 65 73 74 72 6f 79 20 34 20 30 0a 20 20 2a 2a  Destroy 4 0.  **
e7d0: 20 2e 2e 2e 0a 20 20 2a 2a 20 4f 50 5f 44 65 73   ....  ** OP_Des
e7e0: 74 72 6f 79 20 35 20 30 0a 20 20 2a 2a 0a 20 20  troy 5 0.  **.  
e7f0: 2a 2a 20 61 6e 64 20 72 6f 6f 74 20 70 61 67 65  ** and root page
e800: 20 35 20 68 61 70 70 65 6e 65 64 20 74 6f 20 62   5 happened to b
e810: 65 20 74 68 65 20 6c 61 72 67 65 73 74 20 72 6f  e the largest ro
e820: 6f 74 2d 70 61 67 65 20 6e 75 6d 62 65 72 20 69  ot-page number i
e830: 6e 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62  n the.  ** datab
e840: 61 73 65 2c 20 74 68 65 6e 20 72 6f 6f 74 20 70  ase, then root p
e850: 61 67 65 20 35 20 77 6f 75 6c 64 20 62 65 20 6d  age 5 would be m
e860: 6f 76 65 64 20 74 6f 20 70 61 67 65 20 34 20 62  oved to page 4 b
e870: 79 20 74 68 65 20 0a 20 20 2a 2a 20 22 4f 50 5f  y the .  ** "OP_
e880: 44 65 73 74 72 6f 79 20 34 20 30 22 20 6f 70 63  Destroy 4 0" opc
e890: 6f 64 65 2e 20 54 68 65 20 73 75 62 73 65 71 75  ode. The subsequ
e8a0: 65 6e 74 20 22 4f 50 5f 44 65 73 74 72 6f 79 20  ent "OP_Destroy 
e8b0: 35 20 30 22 20 77 6f 75 6c 64 20 68 69 74 0a 20  5 0" would hit. 
e8c0: 20 2a 2a 20 61 20 66 72 65 65 2d 6c 69 73 74 20   ** a free-list 
e8d0: 70 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 6e 74  page..  */.  int
e8e0: 20 69 54 61 62 20 3d 20 70 54 61 62 2d 3e 74 6e   iTab = pTab->tn
e8f0: 75 6d 3b 0a 20 20 69 6e 74 20 69 44 65 73 74 72  um;.  int iDestr
e900: 6f 79 65 64 20 3d 20 30 3b 0a 0a 20 20 77 68 69  oyed = 0;..  whi
e910: 6c 65 28 20 31 20 29 7b 0a 20 20 20 20 49 6e 64  le( 1 ){.    Ind
e920: 65 78 20 2a 70 49 64 78 3b 0a 20 20 20 20 69 6e  ex *pIdx;.    in
e930: 74 20 69 4c 61 72 67 65 73 74 20 3d 20 30 3b 0a  t iLargest = 0;.
e940: 0a 20 20 20 20 69 66 28 20 69 44 65 73 74 72 6f  .    if( iDestro
e950: 79 65 64 3d 3d 30 20 7c 7c 20 69 54 61 62 3c 69  yed==0 || iTab<i
e960: 44 65 73 74 72 6f 79 65 64 20 29 7b 0a 20 20 20  Destroyed ){.   
e970: 20 20 20 69 4c 61 72 67 65 73 74 20 3d 20 69 54     iLargest = iT
e980: 61 62 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f  ab;.    }.    fo
e990: 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e  r(pIdx=pTab->pIn
e9a0: 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d  dex; pIdx; pIdx=
e9b0: 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  pIdx->pNext){.  
e9c0: 20 20 20 20 69 6e 74 20 69 49 64 78 20 3d 20 70      int iIdx = p
e9d0: 49 64 78 2d 3e 74 6e 75 6d 3b 0a 20 20 20 20 20  Idx->tnum;.     
e9e0: 20 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e 70   assert( pIdx->p
e9f0: 53 63 68 65 6d 61 3d 3d 70 54 61 62 2d 3e 70 53  Schema==pTab->pS
ea00: 63 68 65 6d 61 20 29 3b 0a 20 20 20 20 20 20 69  chema );.      i
ea10: 66 28 20 28 69 44 65 73 74 72 6f 79 65 64 3d 3d  f( (iDestroyed==
ea20: 30 20 7c 7c 20 28 69 49 64 78 3c 69 44 65 73 74  0 || (iIdx<iDest
ea30: 72 6f 79 65 64 29 29 20 26 26 20 69 49 64 78 3e  royed)) && iIdx>
ea40: 69 4c 61 72 67 65 73 74 20 29 7b 0a 20 20 20 20  iLargest ){.    
ea50: 20 20 20 20 69 4c 61 72 67 65 73 74 20 3d 20 69      iLargest = i
ea60: 49 64 78 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  Idx;.      }.   
ea70: 20 7d 0a 20 20 20 20 69 66 28 20 69 4c 61 72 67   }.    if( iLarg
ea80: 65 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  est==0 ){.      
ea90: 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 65 6c 73  return;.    }els
eaa0: 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 44 62  e{.      int iDb
eab0: 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61   = sqlite3Schema
eac0: 54 6f 49 6e 64 65 78 28 70 50 61 72 73 65 2d 3e  ToIndex(pParse->
ead0: 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d  db, pTab->pSchem
eae0: 61 29 3b 0a 20 20 20 20 20 20 64 65 73 74 72 6f  a);.      destro
eaf0: 79 52 6f 6f 74 50 61 67 65 28 70 50 61 72 73 65  yRootPage(pParse
eb00: 2c 20 69 4c 61 72 67 65 73 74 2c 20 69 44 62 29  , iLargest, iDb)
eb10: 3b 0a 20 20 20 20 20 20 69 44 65 73 74 72 6f 79  ;.      iDestroy
eb20: 65 64 20 3d 20 69 4c 61 72 67 65 73 74 3b 0a 20  ed = iLargest;. 
eb30: 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
eb40: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
eb50: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
eb60: 74 6f 20 64 6f 20 74 68 65 20 77 6f 72 6b 20 6f  to do the work o
eb70: 66 20 61 20 44 52 4f 50 20 54 41 42 4c 45 20 73  f a DROP TABLE s
eb80: 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 70 4e 61  tatement..** pNa
eb90: 6d 65 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f  me is the name o
eba0: 66 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20 62  f the table to b
ebb0: 65 20 64 72 6f 70 70 65 64 2e 0a 2a 2f 0a 76 6f  e dropped..*/.vo
ebc0: 69 64 20 73 71 6c 69 74 65 33 44 72 6f 70 54 61  id sqlite3DropTa
ebd0: 62 6c 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  ble(Parse *pPars
ebe0: 65 2c 20 53 72 63 4c 69 73 74 20 2a 70 4e 61 6d  e, SrcList *pNam
ebf0: 65 2c 20 69 6e 74 20 69 73 56 69 65 77 2c 20 69  e, int isView, i
ec00: 6e 74 20 6e 6f 45 72 72 29 7b 0a 20 20 54 61 62  nt noErr){.  Tab
ec10: 6c 65 20 2a 70 54 61 62 3b 0a 20 20 56 64 62 65  le *pTab;.  Vdbe
ec20: 20 2a 76 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a   *v;.  sqlite3 *
ec30: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
ec40: 0a 20 20 69 6e 74 20 69 44 62 3b 0a 0a 20 20 69  .  int iDb;..  i
ec50: 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20  f( pParse->nErr 
ec60: 7c 7c 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63  || sqlite3Malloc
ec70: 46 61 69 6c 65 64 28 29 20 29 7b 0a 20 20 20 20  Failed() ){.    
ec80: 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74  goto exit_drop_t
ec90: 61 62 6c 65 3b 0a 20 20 7d 0a 20 20 61 73 73 65  able;.  }.  asse
eca0: 72 74 28 20 70 4e 61 6d 65 2d 3e 6e 53 72 63 3d  rt( pName->nSrc=
ecb0: 3d 31 20 29 3b 0a 20 20 70 54 61 62 20 3d 20 73  =1 );.  pTab = s
ecc0: 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62 6c  qlite3LocateTabl
ecd0: 65 28 70 50 61 72 73 65 2c 20 70 4e 61 6d 65 2d  e(pParse, pName-
ece0: 3e 61 5b 30 5d 2e 7a 4e 61 6d 65 2c 20 70 4e 61  >a[0].zName, pNa
ecf0: 6d 65 2d 3e 61 5b 30 5d 2e 7a 44 61 74 61 62 61  me->a[0].zDataba
ed00: 73 65 29 3b 0a 0a 20 20 69 66 28 20 70 54 61 62  se);..  if( pTab
ed10: 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 6e  ==0 ){.    if( n
ed20: 6f 45 72 72 20 29 7b 0a 20 20 20 20 20 20 73 71  oErr ){.      sq
ed30: 6c 69 74 65 33 45 72 72 6f 72 43 6c 65 61 72 28  lite3ErrorClear(
ed40: 70 50 61 72 73 65 29 3b 0a 20 20 20 20 7d 0a 20  pParse);.    }. 
ed50: 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f     goto exit_dro
ed60: 70 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 20 20 69  p_table;.  }.  i
ed70: 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65  Db = sqlite3Sche
ed80: 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 54  maToIndex(db, pT
ed90: 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20  ab->pSchema);.  
eda0: 61 73 73 65 72 74 28 20 69 44 62 3e 3d 30 20 26  assert( iDb>=0 &
edb0: 26 20 69 44 62 3c 64 62 2d 3e 6e 44 62 20 29 3b  & iDb<db->nDb );
edc0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
edd0: 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49  OMIT_AUTHORIZATI
ede0: 4f 4e 0a 20 20 7b 0a 20 20 20 20 69 6e 74 20 63  ON.  {.    int c
edf0: 6f 64 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63  ode;.    const c
ee00: 68 61 72 20 2a 7a 54 61 62 20 3d 20 53 43 48 45  har *zTab = SCHE
ee10: 4d 41 5f 54 41 42 4c 45 28 69 44 62 29 3b 0a 20  MA_TABLE(iDb);. 
ee20: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
ee30: 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62  Db = db->aDb[iDb
ee40: 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 63 6f 6e  ].zName;.    con
ee50: 73 74 20 63 68 61 72 20 2a 7a 41 72 67 32 20 3d  st char *zArg2 =
ee60: 20 30 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69   0;.    if( sqli
ee70: 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61  te3AuthCheck(pPa
ee80: 72 73 65 2c 20 53 51 4c 49 54 45 5f 44 45 4c 45  rse, SQLITE_DELE
ee90: 54 45 2c 20 7a 54 61 62 2c 20 30 2c 20 7a 44 62  TE, zTab, 0, zDb
eea0: 29 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65  )){.      goto e
eeb0: 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a  xit_drop_table;.
eec0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 73      }.    if( is
eed0: 56 69 65 77 20 29 7b 0a 20 20 20 20 20 20 69 66  View ){.      if
eee0: 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26  ( !OMIT_TEMPDB &
eef0: 26 20 69 44 62 3d 3d 31 20 29 7b 0a 20 20 20 20  & iDb==1 ){.    
ef00: 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54      code = SQLIT
ef10: 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 56 49 45 57  E_DROP_TEMP_VIEW
ef20: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
ef30: 20 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51         code = SQ
ef40: 4c 49 54 45 5f 44 52 4f 50 5f 56 49 45 57 3b 0a  LITE_DROP_VIEW;.
ef50: 20 20 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20        }.#ifndef 
ef60: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
ef70: 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 7d 65 6c  UALTABLE.    }el
ef80: 73 65 20 69 66 28 20 49 73 56 69 72 74 75 61 6c  se if( IsVirtual
ef90: 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20  (pTab) ){.      
efa0: 69 66 28 20 73 71 6c 69 74 65 33 56 69 65 77 47  if( sqlite3ViewG
efb0: 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50  etColumnNames(pP
efc0: 61 72 73 65 2c 20 70 54 61 62 29 20 29 7b 0a 20  arse, pTab) ){. 
efd0: 20 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74         goto exit
efe0: 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 20  _drop_table;.   
eff0: 20 20 20 7d 0a 20 20 20 20 20 20 63 6f 64 65 20     }.      code 
f000: 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 56 54  = SQLITE_DROP_VT
f010: 41 42 4c 45 3b 0a 20 20 20 20 20 20 7a 41 72 67  ABLE;.      zArg
f020: 32 20 3d 20 70 54 61 62 2d 3e 70 4d 6f 64 2d 3e  2 = pTab->pMod->
f030: 7a 4e 61 6d 65 3b 0a 23 65 6e 64 69 66 0a 20 20  zName;.#endif.  
f040: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
f050: 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20  f( !OMIT_TEMPDB 
f060: 26 26 20 69 44 62 3d 3d 31 20 29 7b 0a 20 20 20  && iDb==1 ){.   
f070: 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49       code = SQLI
f080: 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 54 41 42  TE_DROP_TEMP_TAB
f090: 4c 45 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  LE;.      }else{
f0a0: 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20 3d 20  .        code = 
f0b0: 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 41 42 4c  SQLITE_DROP_TABL
f0c0: 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  E;.      }.    }
f0d0: 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
f0e0: 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65  AuthCheck(pParse
f0f0: 2c 20 63 6f 64 65 2c 20 70 54 61 62 2d 3e 7a 4e  , code, pTab->zN
f100: 61 6d 65 2c 20 7a 41 72 67 32 2c 20 7a 44 62 29  ame, zArg2, zDb)
f110: 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65   ){.      goto e
f120: 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a  xit_drop_table;.
f130: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 71      }.    if( sq
f140: 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70  lite3AuthCheck(p
f150: 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 44 45  Parse, SQLITE_DE
f160: 4c 45 54 45 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  LETE, pTab->zNam
f170: 65 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20  e, 0, zDb) ){.  
f180: 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72      goto exit_dr
f190: 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 20 20 7d 0a  op_table;.    }.
f1a0: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28    }.#endif.  if(
f1b0: 20 70 54 61 62 2d 3e 72 65 61 64 4f 6e 6c 79 20   pTab->readOnly 
f1c0: 7c 7c 20 70 54 61 62 3d 3d 64 62 2d 3e 61 44 62  || pTab==db->aDb
f1d0: 5b 69 44 62 5d 2e 70 53 63 68 65 6d 61 2d 3e 70  [iDb].pSchema->p
f1e0: 53 65 71 54 61 62 20 29 7b 0a 20 20 20 20 73 71  SeqTab ){.    sq
f1f0: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
f200: 61 72 73 65 2c 20 22 74 61 62 6c 65 20 25 73 20  arse, "table %s 
f210: 6d 61 79 20 6e 6f 74 20 62 65 20 64 72 6f 70 70  may not be dropp
f220: 65 64 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  ed", pTab->zName
f230: 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74  );.    goto exit
f240: 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 7d  _drop_table;.  }
f250: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
f260: 5f 4f 4d 49 54 5f 56 49 45 57 0a 20 20 2f 2a 20  _OMIT_VIEW.  /* 
f270: 45 6e 73 75 72 65 20 44 52 4f 50 20 54 41 42 4c  Ensure DROP TABL
f280: 45 20 69 73 20 6e 6f 74 20 75 73 65 64 20 6f 6e  E is not used on
f290: 20 61 20 76 69 65 77 2c 20 61 6e 64 20 44 52 4f   a view, and DRO
f2a0: 50 20 56 49 45 57 20 69 73 20 6e 6f 74 20 75 73  P VIEW is not us
f2b0: 65 64 0a 20 20 2a 2a 20 6f 6e 20 61 20 74 61 62  ed.  ** on a tab
f2c0: 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69  le..  */.  if( i
f2d0: 73 56 69 65 77 20 26 26 20 70 54 61 62 2d 3e 70  sView && pTab->p
f2e0: 53 65 6c 65 63 74 3d 3d 30 20 29 7b 0a 20 20 20  Select==0 ){.   
f2f0: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
f300: 28 70 50 61 72 73 65 2c 20 22 75 73 65 20 44 52  (pParse, "use DR
f310: 4f 50 20 54 41 42 4c 45 20 74 6f 20 64 65 6c 65  OP TABLE to dele
f320: 74 65 20 74 61 62 6c 65 20 25 73 22 2c 20 70 54  te table %s", pT
f330: 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ab->zName);.    
f340: 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74  goto exit_drop_t
f350: 61 62 6c 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20  able;.  }.  if( 
f360: 21 69 73 56 69 65 77 20 26 26 20 70 54 61 62 2d  !isView && pTab-
f370: 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20  >pSelect ){.    
f380: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
f390: 70 50 61 72 73 65 2c 20 22 75 73 65 20 44 52 4f  pParse, "use DRO
f3a0: 50 20 56 49 45 57 20 74 6f 20 64 65 6c 65 74 65  P VIEW to delete
f3b0: 20 76 69 65 77 20 25 73 22 2c 20 70 54 61 62 2d   view %s", pTab-
f3c0: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 67 6f 74  >zName);.    got
f3d0: 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c  o exit_drop_tabl
f3e0: 65 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  e;.  }.#endif.. 
f3f0: 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
f400: 65 20 74 6f 20 72 65 6d 6f 76 65 20 74 68 65 20  e to remove the 
f410: 74 61 62 6c 65 20 66 72 6f 6d 20 74 68 65 20 6d  table from the m
f420: 61 73 74 65 72 20 74 61 62 6c 65 0a 20 20 2a 2a  aster table.  **
f430: 20 6f 6e 20 64 69 73 6b 2e 0a 20 20 2a 2f 0a 20   on disk..  */. 
f440: 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56   v = sqlite3GetV
f450: 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69  dbe(pParse);.  i
f460: 66 28 20 76 20 29 7b 0a 20 20 20 20 54 72 69 67  f( v ){.    Trig
f470: 67 65 72 20 2a 70 54 72 69 67 67 65 72 3b 0a 20  ger *pTrigger;. 
f480: 20 20 20 44 62 20 2a 70 44 62 20 3d 20 26 64 62     Db *pDb = &db
f490: 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a 20 20 20 20  ->aDb[iDb];.    
f4a0: 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74  sqlite3BeginWrit
f4b0: 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73  eOperation(pPars
f4c0: 65 2c 20 30 2c 20 69 44 62 29 3b 0a 0a 23 69 66  e, 0, iDb);..#if
f4d0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
f4e0: 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20  _VIRTUALTABLE.  
f4f0: 20 20 69 66 28 20 49 73 56 69 72 74 75 61 6c 28    if( IsVirtual(
f500: 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20 56  pTab) ){.      V
f510: 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33  dbe *v = sqlite3
f520: 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
f530: 0a 20 20 20 20 20 20 69 66 28 20 76 20 29 7b 0a  .      if( v ){.
f540: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
f550: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 56  dbeAddOp(v, OP_V
f560: 42 65 67 69 6e 2c 20 30 2c 20 30 29 3b 0a 20 20  Begin, 0, 0);.  
f570: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64      }.    }.#end
f580: 69 66 0a 0a 20 20 20 20 2f 2a 20 44 72 6f 70 20  if..    /* Drop 
f590: 61 6c 6c 20 74 72 69 67 67 65 72 73 20 61 73 73  all triggers ass
f5a0: 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
f5b0: 20 74 61 62 6c 65 20 62 65 69 6e 67 20 64 72 6f   table being dro
f5c0: 70 70 65 64 2e 20 43 6f 64 65 0a 20 20 20 20 2a  pped. Code.    *
f5d0: 2a 20 69 73 20 67 65 6e 65 72 61 74 65 64 20 74  * is generated t
f5e0: 6f 20 72 65 6d 6f 76 65 20 65 6e 74 72 69 65 73  o remove entries
f5f0: 20 66 72 6f 6d 20 73 71 6c 69 74 65 5f 6d 61 73   from sqlite_mas
f600: 74 65 72 20 61 6e 64 2f 6f 72 0a 20 20 20 20 2a  ter and/or.    *
f610: 2a 20 73 71 6c 69 74 65 5f 74 65 6d 70 5f 6d 61  * sqlite_temp_ma
f620: 73 74 65 72 20 69 66 20 72 65 71 75 69 72 65 64  ster if required
f630: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 54 72  ..    */.    pTr
f640: 69 67 67 65 72 20 3d 20 70 54 61 62 2d 3e 70 54  igger = pTab->pT
f650: 72 69 67 67 65 72 3b 0a 20 20 20 20 77 68 69 6c  rigger;.    whil
f660: 65 28 20 70 54 72 69 67 67 65 72 20 29 7b 0a 20  e( pTrigger ){. 
f670: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54 72       assert( pTr
f680: 69 67 67 65 72 2d 3e 70 53 63 68 65 6d 61 3d 3d  igger->pSchema==
f690: 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 20 7c 7c  pTab->pSchema ||
f6a0: 20 0a 20 20 20 20 20 20 20 20 20 20 70 54 72 69   .          pTri
f6b0: 67 67 65 72 2d 3e 70 53 63 68 65 6d 61 3d 3d 64  gger->pSchema==d
f6c0: 62 2d 3e 61 44 62 5b 31 5d 2e 70 53 63 68 65 6d  b->aDb[1].pSchem
f6d0: 61 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  a );.      sqlit
f6e0: 65 33 44 72 6f 70 54 72 69 67 67 65 72 50 74 72  e3DropTriggerPtr
f6f0: 28 70 50 61 72 73 65 2c 20 70 54 72 69 67 67 65  (pParse, pTrigge
f700: 72 29 3b 0a 20 20 20 20 20 20 70 54 72 69 67 67  r);.      pTrigg
f710: 65 72 20 3d 20 70 54 72 69 67 67 65 72 2d 3e 70  er = pTrigger->p
f720: 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 0a 23 69 66  Next;.    }..#if
f730: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
f740: 5f 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 0a 20  _AUTOINCREMENT. 
f750: 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20 61 6e 79     /* Remove any
f760: 20 65 6e 74 72 69 65 73 20 6f 66 20 74 68 65 20   entries of the 
f770: 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 20  sqlite_sequence 
f780: 74 61 62 6c 65 20 61 73 73 6f 63 69 61 74 65 64  table associated
f790: 20 77 69 74 68 0a 20 20 20 20 2a 2a 20 74 68 65   with.    ** the
f7a0: 20 74 61 62 6c 65 20 62 65 69 6e 67 20 64 72 6f   table being dro
f7b0: 70 70 65 64 2e 20 54 68 69 73 20 69 73 20 64 6f  pped. This is do
f7c0: 6e 65 20 62 65 66 6f 72 65 20 74 68 65 20 74 61  ne before the ta
f7d0: 62 6c 65 20 69 73 20 64 72 6f 70 70 65 64 0a 20  ble is dropped. 
f7e0: 20 20 20 2a 2a 20 61 74 20 74 68 65 20 62 74 72     ** at the btr
f7f0: 65 65 20 6c 65 76 65 6c 2c 20 69 6e 20 63 61 73  ee level, in cas
f800: 65 20 74 68 65 20 73 71 6c 69 74 65 5f 73 65 71  e the sqlite_seq
f810: 75 65 6e 63 65 20 74 61 62 6c 65 20 6e 65 65 64  uence table need
f820: 73 20 74 6f 0a 20 20 20 20 2a 2a 20 6d 6f 76 65  s to.    ** move
f830: 20 61 73 20 61 20 72 65 73 75 6c 74 20 6f 66 20   as a result of 
f840: 74 68 65 20 64 72 6f 70 20 28 63 61 6e 20 68 61  the drop (can ha
f850: 70 70 65 6e 20 69 6e 20 61 75 74 6f 2d 76 61 63  ppen in auto-vac
f860: 75 75 6d 20 6d 6f 64 65 29 2e 0a 20 20 20 20 2a  uum mode)..    *
f870: 2f 0a 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e  /.    if( pTab->
f880: 61 75 74 6f 49 6e 63 20 29 7b 0a 20 20 20 20 20  autoInc ){.     
f890: 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61   sqlite3NestedPa
f8a0: 72 73 65 28 70 50 61 72 73 65 2c 0a 20 20 20 20  rse(pParse,.    
f8b0: 20 20 20 20 22 44 45 4c 45 54 45 20 46 52 4f 4d      "DELETE FROM
f8c0: 20 25 73 2e 73 71 6c 69 74 65 5f 73 65 71 75 65   %s.sqlite_seque
f8d0: 6e 63 65 20 57 48 45 52 45 20 6e 61 6d 65 3d 25  nce WHERE name=%
f8e0: 51 22 2c 0a 20 20 20 20 20 20 20 20 70 44 62 2d  Q",.        pDb-
f8f0: 3e 7a 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 7a 4e  >zName, pTab->zN
f900: 61 6d 65 0a 20 20 20 20 20 20 29 3b 0a 20 20 20  ame.      );.   
f910: 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f   }.#endif..    /
f920: 2a 20 44 72 6f 70 20 61 6c 6c 20 53 51 4c 49 54  * Drop all SQLIT
f930: 45 5f 4d 41 53 54 45 52 20 74 61 62 6c 65 20 61  E_MASTER table a
f940: 6e 64 20 69 6e 64 65 78 20 65 6e 74 72 69 65 73  nd index entries
f950: 20 74 68 61 74 20 72 65 66 65 72 20 74 6f 20 74   that refer to t
f960: 68 65 0a 20 20 20 20 2a 2a 20 74 61 62 6c 65 2e  he.    ** table.
f970: 20 54 68 65 20 70 72 6f 67 72 61 6d 20 6e 61 6d   The program nam
f980: 65 20 6c 6f 6f 70 73 20 74 68 72 6f 75 67 68 20  e loops through 
f990: 74 68 65 20 6d 61 73 74 65 72 20 74 61 62 6c 65  the master table
f9a0: 20 61 6e 64 20 64 65 6c 65 74 65 73 0a 20 20 20   and deletes.   
f9b0: 20 2a 2a 20 65 76 65 72 79 20 72 6f 77 20 74 68   ** every row th
f9c0: 61 74 20 72 65 66 65 72 73 20 74 6f 20 61 20 74  at refers to a t
f9d0: 61 62 6c 65 20 6f 66 20 74 68 65 20 73 61 6d 65  able of the same
f9e0: 20 6e 61 6d 65 20 61 73 20 74 68 65 20 6f 6e 65   name as the one
f9f0: 20 62 65 69 6e 67 0a 20 20 20 20 2a 2a 20 64 72   being.    ** dr
fa00: 6f 70 70 65 64 2e 20 54 72 69 67 67 65 72 73 20  opped. Triggers 
fa10: 61 72 65 20 68 61 6e 64 6c 65 64 20 73 65 70 65  are handled sepe
fa20: 72 61 74 65 6c 79 20 62 65 63 61 75 73 65 20 61  rately because a
fa30: 20 74 72 69 67 67 65 72 20 63 61 6e 20 62 65 0a   trigger can be.
fa40: 20 20 20 20 2a 2a 20 63 72 65 61 74 65 64 20 69      ** created i
fa50: 6e 20 74 68 65 20 74 65 6d 70 20 64 61 74 61 62  n the temp datab
fa60: 61 73 65 20 74 68 61 74 20 72 65 66 65 72 73 20  ase that refers 
fa70: 74 6f 20 61 20 74 61 62 6c 65 20 69 6e 20 61 6e  to a table in an
fa80: 6f 74 68 65 72 0a 20 20 20 20 2a 2a 20 64 61 74  other.    ** dat
fa90: 61 62 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20  abase..    */.  
faa0: 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50    sqlite3NestedP
fab0: 61 72 73 65 28 70 50 61 72 73 65 2c 20 0a 20 20  arse(pParse, .  
fac0: 20 20 20 20 20 20 22 44 45 4c 45 54 45 20 46 52        "DELETE FR
fad0: 4f 4d 20 25 51 2e 25 73 20 57 48 45 52 45 20 74  OM %Q.%s WHERE t
fae0: 62 6c 5f 6e 61 6d 65 3d 25 51 20 61 6e 64 20 74  bl_name=%Q and t
faf0: 79 70 65 21 3d 27 74 72 69 67 67 65 72 27 22 2c  ype!='trigger'",
fb00: 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 4e  .        pDb->zN
fb10: 61 6d 65 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c  ame, SCHEMA_TABL
fb20: 45 28 69 44 62 29 2c 20 70 54 61 62 2d 3e 7a 4e  E(iDb), pTab->zN
fb30: 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 21 69  ame);.    if( !i
fb40: 73 56 69 65 77 20 26 26 20 21 49 73 56 69 72 74  sView && !IsVirt
fb50: 75 61 6c 28 70 54 61 62 29 20 29 7b 0a 20 20 20  ual(pTab) ){.   
fb60: 20 20 20 64 65 73 74 72 6f 79 54 61 62 6c 65 28     destroyTable(
fb70: 70 50 61 72 73 65 2c 20 70 54 61 62 29 3b 0a 20  pParse, pTab);. 
fb80: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 6d     }..    /* Rem
fb90: 6f 76 65 20 74 68 65 20 74 61 62 6c 65 20 65 6e  ove the table en
fba0: 74 72 79 20 66 72 6f 6d 20 53 51 4c 69 74 65 27  try from SQLite'
fbb0: 73 20 69 6e 74 65 72 6e 61 6c 20 73 63 68 65 6d  s internal schem
fbc0: 61 20 61 6e 64 20 6d 6f 64 69 66 79 0a 20 20 20  a and modify.   
fbd0: 20 2a 2a 20 74 68 65 20 73 63 68 65 6d 61 20 63   ** the schema c
fbe0: 6f 6f 6b 69 65 2e 0a 20 20 20 20 2a 2f 0a 20 20  ookie..    */.  
fbf0: 20 20 69 66 28 20 49 73 56 69 72 74 75 61 6c 28    if( IsVirtual(
fc00: 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20 73  pTab) ){.      s
fc10: 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c  qlite3VdbeOp3(v,
fc20: 20 4f 50 5f 56 44 65 73 74 72 6f 79 2c 20 69 44   OP_VDestroy, iD
fc30: 62 2c 20 30 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  b, 0, pTab->zNam
fc40: 65 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20  e, 0);.    }.   
fc50: 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28   sqlite3VdbeOp3(
fc60: 76 2c 20 4f 50 5f 44 72 6f 70 54 61 62 6c 65 2c  v, OP_DropTable,
fc70: 20 69 44 62 2c 20 30 2c 20 70 54 61 62 2d 3e 7a   iDb, 0, pTab->z
fc80: 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 73 71  Name, 0);.    sq
fc90: 6c 69 74 65 33 43 68 61 6e 67 65 43 6f 6f 6b 69  lite3ChangeCooki
fca0: 65 28 64 62 2c 20 76 2c 20 69 44 62 29 3b 0a 20  e(db, v, iDb);. 
fcb0: 20 7d 0a 20 20 73 71 6c 69 74 65 56 69 65 77 52   }.  sqliteViewR
fcc0: 65 73 65 74 41 6c 6c 28 64 62 2c 20 69 44 62 29  esetAll(db, iDb)
fcd0: 3b 0a 0a 65 78 69 74 5f 64 72 6f 70 5f 74 61 62  ;..exit_drop_tab
fce0: 6c 65 3a 0a 20 20 73 71 6c 69 74 65 33 53 72 63  le:.  sqlite3Src
fcf0: 4c 69 73 74 44 65 6c 65 74 65 28 70 4e 61 6d 65  ListDelete(pName
fd00: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  );.}../*.** This
fd10: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
fd20: 65 64 20 74 6f 20 63 72 65 61 74 65 20 61 20 6e  ed to create a n
fd30: 65 77 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 6f  ew foreign key o
fd40: 6e 20 74 68 65 20 74 61 62 6c 65 0a 2a 2a 20 63  n the table.** c
fd50: 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63  urrently under c
fd60: 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 70 46  onstruction.  pF
fd70: 72 6f 6d 43 6f 6c 20 64 65 74 65 72 6d 69 6e 65  romCol determine
fd80: 73 20 77 68 69 63 68 20 63 6f 6c 75 6d 6e 73 0a  s which columns.
fd90: 2a 2a 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e  ** in the curren
fda0: 74 20 74 61 62 6c 65 20 70 6f 69 6e 74 20 74 6f  t table point to
fdb0: 20 74 68 65 20 66 6f 72 65 69 67 6e 20 6b 65 79   the foreign key
fdc0: 2e 20 20 49 66 20 70 46 72 6f 6d 43 6f 6c 3d 3d  .  If pFromCol==
fdd0: 30 20 74 68 65 6e 0a 2a 2a 20 63 6f 6e 6e 65 63  0 then.** connec
fde0: 74 20 74 68 65 20 6b 65 79 20 74 6f 20 74 68 65  t the key to the
fdf0: 20 6c 61 73 74 20 63 6f 6c 75 6d 6e 20 69 6e 73   last column ins
fe00: 65 72 74 65 64 2e 20 20 70 54 6f 20 69 73 20 74  erted.  pTo is t
fe10: 68 65 20 6e 61 6d 65 20 6f 66 0a 2a 2a 20 74 68  he name of.** th
fe20: 65 20 74 61 62 6c 65 20 72 65 66 65 72 72 65 64  e table referred
fe30: 20 74 6f 2e 20 20 70 54 6f 43 6f 6c 20 69 73 20   to.  pToCol is 
fe40: 61 20 6c 69 73 74 20 6f 66 20 74 61 62 6c 65 73  a list of tables
fe50: 20 69 6e 20 74 68 65 20 6f 74 68 65 72 0a 2a 2a   in the other.**
fe60: 20 70 54 6f 20 74 61 62 6c 65 20 74 68 61 74 20   pTo table that 
fe70: 74 68 65 20 66 6f 72 65 69 67 6e 20 6b 65 79 20  the foreign key 
fe80: 70 6f 69 6e 74 73 20 74 6f 2e 20 20 66 6c 61 67  points to.  flag
fe90: 73 20 63 6f 6e 74 61 69 6e 73 20 61 6c 6c 0a 2a  s contains all.*
fea0: 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62  * information ab
feb0: 6f 75 74 20 74 68 65 20 63 6f 6e 66 6c 69 63 74  out the conflict
fec0: 20 72 65 73 6f 6c 75 74 69 6f 6e 20 61 6c 67 6f   resolution algo
fed0: 72 69 74 68 6d 73 20 73 70 65 63 69 66 69 65 64  rithms specified
fee0: 0a 2a 2a 20 69 6e 20 74 68 65 20 4f 4e 20 44 45  .** in the ON DE
fef0: 4c 45 54 45 2c 20 4f 4e 20 55 50 44 41 54 45 20  LETE, ON UPDATE 
ff00: 61 6e 64 20 4f 4e 20 49 4e 53 45 52 54 20 63 6c  and ON INSERT cl
ff10: 61 75 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20  auses..**.** An 
ff20: 46 4b 65 79 20 73 74 72 75 63 74 75 72 65 20 69  FKey structure i
ff30: 73 20 63 72 65 61 74 65 64 20 61 6e 64 20 61 64  s created and ad
ff40: 64 65 64 20 74 6f 20 74 68 65 20 74 61 62 6c 65  ded to the table
ff50: 20 63 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 75 6e   currently.** un
ff60: 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e  der construction
ff70: 20 69 6e 20 74 68 65 20 70 50 61 72 73 65 2d 3e   in the pParse->
ff80: 70 4e 65 77 54 61 62 6c 65 20 66 69 65 6c 64 2e  pNewTable field.
ff90: 20 20 54 68 65 20 6e 65 77 20 46 4b 65 79 0a 2a    The new FKey.*
ffa0: 2a 20 69 73 20 6e 6f 74 20 6c 69 6e 6b 65 64 20  * is not linked 
ffb0: 69 6e 74 6f 20 64 62 2d 3e 61 46 4b 65 79 20 61  into db->aFKey a
ffc0: 74 20 74 68 69 73 20 70 6f 69 6e 74 20 2d 20 74  t this point - t
ffd0: 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 68 61 70  hat does not hap
ffe0: 70 65 6e 0a 2a 2a 20 75 6e 74 69 6c 20 73 71 6c  pen.** until sql
fff0: 69 74 65 33 45 6e 64 54 61 62 6c 65 28 29 2e 0a  ite3EndTable()..
10000 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 72 65 69 67  **.** The foreig
10010 6e 20 6b 65 79 20 69 73 20 73 65 74 20 66 6f 72  n key is set for
10020 20 49 4d 4d 45 44 49 41 54 45 20 70 72 6f 63 65   IMMEDIATE proce
10030 73 73 69 6e 67 2e 20 20 41 20 73 75 62 73 65 71  ssing.  A subseq
10040 75 65 6e 74 20 63 61 6c 6c 0a 2a 2a 20 74 6f 20  uent call.** to 
10050 73 71 6c 69 74 65 33 44 65 66 65 72 46 6f 72 65  sqlite3DeferFore
10060 69 67 6e 4b 65 79 28 29 20 6d 69 67 68 74 20 63  ignKey() might c
10070 68 61 6e 67 65 20 74 68 69 73 20 74 6f 20 44 45  hange this to DE
10080 46 45 52 52 45 44 2e 0a 2a 2f 0a 76 6f 69 64 20  FERRED..*/.void 
10090 73 71 6c 69 74 65 33 43 72 65 61 74 65 46 6f 72  sqlite3CreateFor
100a0 65 69 67 6e 4b 65 79 28 0a 20 20 50 61 72 73 65  eignKey(.  Parse
100b0 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
100c0 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
100d0 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  xt */.  ExprList
100e0 20 2a 70 46 72 6f 6d 43 6f 6c 2c 20 20 2f 2a 20   *pFromCol,  /* 
100f0 43 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 69 73 20  Columns in this 
10100 74 61 62 6c 65 20 74 68 61 74 20 70 6f 69 6e 74  table that point
10110 20 74 6f 20 6f 74 68 65 72 20 74 61 62 6c 65 20   to other table 
10120 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 54 6f 2c  */.  Token *pTo,
10130 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
10140 65 20 6f 66 20 74 68 65 20 6f 74 68 65 72 20 74  e of the other t
10150 61 62 6c 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69  able */.  ExprLi
10160 73 74 20 2a 70 54 6f 43 6f 6c 2c 20 20 20 20 2f  st *pToCol,    /
10170 2a 20 43 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65  * Columns in the
10180 20 6f 74 68 65 72 20 74 61 62 6c 65 20 2a 2f 0a   other table */.
10190 20 20 69 6e 74 20 66 6c 61 67 73 20 20 20 20 20    int flags     
101a0 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 66 6c 69         /* Confli
101b0 63 74 20 72 65 73 6f 6c 75 74 69 6f 6e 20 61 6c  ct resolution al
101c0 67 6f 72 69 74 68 6d 73 2e 20 2a 2f 0a 29 7b 0a  gorithms. */.){.
101d0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
101e0 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 0a  MIT_FOREIGN_KEY.
101f0 20 20 46 4b 65 79 20 2a 70 46 4b 65 79 20 3d 20    FKey *pFKey = 
10200 30 3b 0a 20 20 54 61 62 6c 65 20 2a 70 20 3d 20  0;.  Table *p = 
10210 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
10220 65 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a  e;.  int nByte;.
10230 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e    int i;.  int n
10240 43 6f 6c 3b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a  Col;.  char *z;.
10250 0a 20 20 61 73 73 65 72 74 28 20 70 54 6f 21 3d  .  assert( pTo!=
10260 30 20 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20  0 );.  if( p==0 
10270 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20  || pParse->nErr 
10280 7c 7c 20 49 4e 5f 44 45 43 4c 41 52 45 5f 56 54  || IN_DECLARE_VT
10290 41 42 20 29 20 67 6f 74 6f 20 66 6b 5f 65 6e 64  AB ) goto fk_end
102a0 3b 0a 20 20 69 66 28 20 70 46 72 6f 6d 43 6f 6c  ;.  if( pFromCol
102b0 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  ==0 ){.    int i
102c0 43 6f 6c 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b  Col = p->nCol-1;
102d0 0a 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20  .    if( iCol<0 
102e0 29 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20  ) goto fk_end;. 
102f0 20 20 20 69 66 28 20 70 54 6f 43 6f 6c 20 26 26     if( pToCol &&
10300 20 70 54 6f 43 6f 6c 2d 3e 6e 45 78 70 72 21 3d   pToCol->nExpr!=
10310 31 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  1 ){.      sqlit
10320 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
10330 65 2c 20 22 66 6f 72 65 69 67 6e 20 6b 65 79 20  e, "foreign key 
10340 6f 6e 20 25 73 22 0a 20 20 20 20 20 20 20 20 20  on %s".         
10350 22 20 73 68 6f 75 6c 64 20 72 65 66 65 72 65 6e  " should referen
10360 63 65 20 6f 6e 6c 79 20 6f 6e 65 20 63 6f 6c 75  ce only one colu
10370 6d 6e 20 6f 66 20 74 61 62 6c 65 20 25 54 22 2c  mn of table %T",
10380 0a 20 20 20 20 20 20 20 20 20 70 2d 3e 61 43 6f  .         p->aCo
10390 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 2c 20 70  l[iCol].zName, p
103a0 54 6f 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  To);.      goto 
103b0 66 6b 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20  fk_end;.    }.  
103c0 20 20 6e 43 6f 6c 20 3d 20 31 3b 0a 20 20 7d 65    nCol = 1;.  }e
103d0 6c 73 65 20 69 66 28 20 70 54 6f 43 6f 6c 20 26  lse if( pToCol &
103e0 26 20 70 54 6f 43 6f 6c 2d 3e 6e 45 78 70 72 21  & pToCol->nExpr!
103f0 3d 70 46 72 6f 6d 43 6f 6c 2d 3e 6e 45 78 70 72  =pFromCol->nExpr
10400 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
10410 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 0a  rrorMsg(pParse,.
10420 20 20 20 20 20 20 20 20 22 6e 75 6d 62 65 72 20          "number 
10430 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 66 6f  of columns in fo
10440 72 65 69 67 6e 20 6b 65 79 20 64 6f 65 73 20 6e  reign key does n
10450 6f 74 20 6d 61 74 63 68 20 74 68 65 20 6e 75 6d  ot match the num
10460 62 65 72 20 6f 66 20 22 0a 20 20 20 20 20 20 20  ber of ".       
10470 20 22 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65   "columns in the
10480 20 72 65 66 65 72 65 6e 63 65 64 20 74 61 62 6c   referenced tabl
10490 65 22 29 3b 0a 20 20 20 20 67 6f 74 6f 20 66 6b  e");.    goto fk
104a0 5f 65 6e 64 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  _end;.  }else{. 
104b0 20 20 20 6e 43 6f 6c 20 3d 20 70 46 72 6f 6d 43     nCol = pFromC
104c0 6f 6c 2d 3e 6e 45 78 70 72 3b 0a 20 20 7d 0a 20  ol->nExpr;.  }. 
104d0 20 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f 66 28   nByte = sizeof(
104e0 2a 70 46 4b 65 79 29 20 2b 20 6e 43 6f 6c 2a 73  *pFKey) + nCol*s
104f0 69 7a 65 6f 66 28 70 46 4b 65 79 2d 3e 61 43 6f  izeof(pFKey->aCo
10500 6c 5b 30 5d 29 20 2b 20 70 54 6f 2d 3e 6e 20 2b  l[0]) + pTo->n +
10510 20 31 3b 0a 20 20 69 66 28 20 70 54 6f 43 6f 6c   1;.  if( pToCol
10520 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   ){.    for(i=0;
10530 20 69 3c 70 54 6f 43 6f 6c 2d 3e 6e 45 78 70 72   i<pToCol->nExpr
10540 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 6e 42  ; i++){.      nB
10550 79 74 65 20 2b 3d 20 73 74 72 6c 65 6e 28 70 54  yte += strlen(pT
10560 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  oCol->a[i].zName
10570 29 20 2b 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  ) + 1;.    }.  }
10580 0a 20 20 70 46 4b 65 79 20 3d 20 73 71 6c 69 74  .  pFKey = sqlit
10590 65 4d 61 6c 6c 6f 63 28 20 6e 42 79 74 65 20 29  eMalloc( nByte )
105a0 3b 0a 20 20 69 66 28 20 70 46 4b 65 79 3d 3d 30  ;.  if( pFKey==0
105b0 20 29 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a   ) goto fk_end;.
105c0 20 20 70 46 4b 65 79 2d 3e 70 46 72 6f 6d 20 3d    pFKey->pFrom =
105d0 20 70 3b 0a 20 20 70 46 4b 65 79 2d 3e 70 4e 65   p;.  pFKey->pNe
105e0 78 74 46 72 6f 6d 20 3d 20 70 2d 3e 70 46 4b 65  xtFrom = p->pFKe
105f0 79 3b 0a 20 20 7a 20 3d 20 28 63 68 61 72 2a 29  y;.  z = (char*)
10600 26 70 46 4b 65 79 5b 31 5d 3b 0a 20 20 70 46 4b  &pFKey[1];.  pFK
10610 65 79 2d 3e 61 43 6f 6c 20 3d 20 28 73 74 72 75  ey->aCol = (stru
10620 63 74 20 73 43 6f 6c 4d 61 70 2a 29 7a 3b 0a 20  ct sColMap*)z;. 
10630 20 7a 20 2b 3d 20 73 69 7a 65 6f 66 28 73 74 72   z += sizeof(str
10640 75 63 74 20 73 43 6f 6c 4d 61 70 29 2a 6e 43 6f  uct sColMap)*nCo
10650 6c 3b 0a 20 20 70 46 4b 65 79 2d 3e 7a 54 6f 20  l;.  pFKey->zTo 
10660 3d 20 7a 3b 0a 20 20 6d 65 6d 63 70 79 28 7a 2c  = z;.  memcpy(z,
10670 20 70 54 6f 2d 3e 7a 2c 20 70 54 6f 2d 3e 6e 29   pTo->z, pTo->n)
10680 3b 0a 20 20 7a 5b 70 54 6f 2d 3e 6e 5d 20 3d 20  ;.  z[pTo->n] = 
10690 30 3b 0a 20 20 7a 20 2b 3d 20 70 54 6f 2d 3e 6e  0;.  z += pTo->n
106a0 2b 31 3b 0a 20 20 70 46 4b 65 79 2d 3e 70 4e 65  +1;.  pFKey->pNe
106b0 78 74 54 6f 20 3d 20 30 3b 0a 20 20 70 46 4b 65  xtTo = 0;.  pFKe
106c0 79 2d 3e 6e 43 6f 6c 20 3d 20 6e 43 6f 6c 3b 0a  y->nCol = nCol;.
106d0 20 20 69 66 28 20 70 46 72 6f 6d 43 6f 6c 3d 3d    if( pFromCol==
106e0 30 20 29 7b 0a 20 20 20 20 70 46 4b 65 79 2d 3e  0 ){.    pFKey->
106f0 61 43 6f 6c 5b 30 5d 2e 69 46 72 6f 6d 20 3d 20  aCol[0].iFrom = 
10700 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 7d 65 6c  p->nCol-1;.  }el
10710 73 65 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  se{.    for(i=0;
10720 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20   i<nCol; i++){. 
10730 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20       int j;.    
10740 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 2d 3e    for(j=0; j<p->
10750 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  nCol; j++){.    
10760 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53      if( sqlite3S
10770 74 72 49 43 6d 70 28 70 2d 3e 61 43 6f 6c 5b 6a  trICmp(p->aCol[j
10780 5d 2e 7a 4e 61 6d 65 2c 20 70 46 72 6f 6d 43 6f  ].zName, pFromCo
10790 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d  l->a[i].zName)==
107a0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  0 ){.          p
107b0 46 4b 65 79 2d 3e 61 43 6f 6c 5b 69 5d 2e 69 46  FKey->aCol[i].iF
107c0 72 6f 6d 20 3d 20 6a 3b 0a 20 20 20 20 20 20 20  rom = j;.       
107d0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
107e0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
107f0 20 20 69 66 28 20 6a 3e 3d 70 2d 3e 6e 43 6f 6c    if( j>=p->nCol
10800 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
10810 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
10820 73 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20 22  se, .          "
10830 75 6e 6b 6e 6f 77 6e 20 63 6f 6c 75 6d 6e 20 5c  unknown column \
10840 22 25 73 5c 22 20 69 6e 20 66 6f 72 65 69 67 6e  "%s\" in foreign
10850 20 6b 65 79 20 64 65 66 69 6e 69 74 69 6f 6e 22   key definition"
10860 2c 20 0a 20 20 20 20 20 20 20 20 20 20 70 46 72  , .          pFr
10870 6f 6d 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  omCol->a[i].zNam
10880 65 29 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f  e);.        goto
10890 20 66 6b 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d   fk_end;.      }
108a0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
108b0 20 70 54 6f 43 6f 6c 20 29 7b 0a 20 20 20 20 66   pToCol ){.    f
108c0 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20  or(i=0; i<nCol; 
108d0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  i++){.      int 
108e0 6e 20 3d 20 73 74 72 6c 65 6e 28 70 54 6f 43 6f  n = strlen(pToCo
108f0 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a  l->a[i].zName);.
10900 20 20 20 20 20 20 70 46 4b 65 79 2d 3e 61 43 6f        pFKey->aCo
10910 6c 5b 69 5d 2e 7a 43 6f 6c 20 3d 20 7a 3b 0a 20  l[i].zCol = z;. 
10920 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 2c 20 70       memcpy(z, p
10930 54 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  ToCol->a[i].zNam
10940 65 2c 20 6e 29 3b 0a 20 20 20 20 20 20 7a 5b 6e  e, n);.      z[n
10950 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 7a 20 2b  ] = 0;.      z +
10960 3d 20 6e 2b 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  = n+1;.    }.  }
10970 0a 20 20 70 46 4b 65 79 2d 3e 69 73 44 65 66 65  .  pFKey->isDefe
10980 72 72 65 64 20 3d 20 30 3b 0a 20 20 70 46 4b 65  rred = 0;.  pFKe
10990 79 2d 3e 64 65 6c 65 74 65 43 6f 6e 66 20 3d 20  y->deleteConf = 
109a0 66 6c 61 67 73 20 26 20 30 78 66 66 3b 0a 20 20  flags & 0xff;.  
109b0 70 46 4b 65 79 2d 3e 75 70 64 61 74 65 43 6f 6e  pFKey->updateCon
109c0 66 20 3d 20 28 66 6c 61 67 73 20 3e 3e 20 38 20  f = (flags >> 8 
109d0 29 20 26 20 30 78 66 66 3b 0a 20 20 70 46 4b 65  ) & 0xff;.  pFKe
109e0 79 2d 3e 69 6e 73 65 72 74 43 6f 6e 66 20 3d 20  y->insertConf = 
109f0 28 66 6c 61 67 73 20 3e 3e 20 31 36 20 29 20 26  (flags >> 16 ) &
10a00 20 30 78 66 66 3b 0a 0a 20 20 2f 2a 20 4c 69 6e   0xff;..  /* Lin
10a10 6b 20 74 68 65 20 66 6f 72 65 69 67 6e 20 6b 65  k the foreign ke
10a20 79 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 61  y to the table a
10a30 73 20 74 68 65 20 6c 61 73 74 20 73 74 65 70 2e  s the last step.
10a40 0a 20 20 2a 2f 0a 20 20 70 2d 3e 70 46 4b 65 79  .  */.  p->pFKey
10a50 20 3d 20 70 46 4b 65 79 3b 0a 20 20 70 46 4b 65   = pFKey;.  pFKe
10a60 79 20 3d 20 30 3b 0a 0a 66 6b 5f 65 6e 64 3a 0a  y = 0;..fk_end:.
10a70 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 46 4b    sqliteFree(pFK
10a80 65 79 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 21  ey);.#endif /* !
10a90 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
10aa0 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 29  MIT_FOREIGN_KEY)
10ab0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 45 78 70   */.  sqlite3Exp
10ac0 72 4c 69 73 74 44 65 6c 65 74 65 28 70 46 72 6f  rListDelete(pFro
10ad0 6d 43 6f 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33  mCol);.  sqlite3
10ae0 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70  ExprListDelete(p
10af0 54 6f 43 6f 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ToCol);.}../*.**
10b00 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
10b10 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 6e 20   called when an 
10b20 49 4e 49 54 49 41 4c 4c 59 20 49 4d 4d 45 44 49  INITIALLY IMMEDI
10b30 41 54 45 20 6f 72 20 49 4e 49 54 49 41 4c 4c 59  ATE or INITIALLY
10b40 20 44 45 46 45 52 52 45 44 0a 2a 2a 20 63 6c 61   DEFERRED.** cla
10b50 75 73 65 20 69 73 20 73 65 65 6e 20 61 73 20 70  use is seen as p
10b60 61 72 74 20 6f 66 20 61 20 66 6f 72 65 69 67 6e  art of a foreign
10b70 20 6b 65 79 20 64 65 66 69 6e 69 74 69 6f 6e 2e   key definition.
10b80 20 20 54 68 65 20 69 73 44 65 66 65 72 72 65 64    The isDeferred
10b90 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 69 73  .** parameter is
10ba0 20 31 20 66 6f 72 20 49 4e 49 54 49 41 4c 4c 59   1 for INITIALLY
10bb0 20 44 45 46 45 52 52 45 44 20 61 6e 64 20 30 20   DEFERRED and 0 
10bc0 66 6f 72 20 49 4e 49 54 49 41 4c 4c 59 20 49 4d  for INITIALLY IM
10bd0 4d 45 44 49 41 54 45 2e 0a 2a 2a 20 54 68 65 20  MEDIATE..** The 
10be0 62 65 68 61 76 69 6f 72 20 6f 66 20 74 68 65 20  behavior of the 
10bf0 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 63 72  most recently cr
10c00 65 61 74 65 64 20 66 6f 72 65 69 67 6e 20 6b 65  eated foreign ke
10c10 79 20 69 73 20 61 64 6a 75 73 74 65 64 0a 2a 2a  y is adjusted.**
10c20 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e 0a 2a 2f   accordingly..*/
10c30 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 44 65 66  .void sqlite3Def
10c40 65 72 46 6f 72 65 69 67 6e 4b 65 79 28 50 61 72  erForeignKey(Par
10c50 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20  se *pParse, int 
10c60 69 73 44 65 66 65 72 72 65 64 29 7b 0a 23 69 66  isDeferred){.#if
10c70 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
10c80 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 0a 20 20 54  _FOREIGN_KEY.  T
10c90 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 46 4b  able *pTab;.  FK
10ca0 65 79 20 2a 70 46 4b 65 79 3b 0a 20 20 69 66 28  ey *pFKey;.  if(
10cb0 20 28 70 54 61 62 20 3d 20 70 50 61 72 73 65 2d   (pTab = pParse-
10cc0 3e 70 4e 65 77 54 61 62 6c 65 29 3d 3d 30 20 7c  >pNewTable)==0 |
10cd0 7c 20 28 70 46 4b 65 79 20 3d 20 70 54 61 62 2d  | (pFKey = pTab-
10ce0 3e 70 46 4b 65 79 29 3d 3d 30 20 29 20 72 65 74  >pFKey)==0 ) ret
10cf0 75 72 6e 3b 0a 20 20 70 46 4b 65 79 2d 3e 69 73  urn;.  pFKey->is
10d00 44 65 66 65 72 72 65 64 20 3d 20 69 73 44 65 66  Deferred = isDef
10d10 65 72 72 65 64 3b 0a 23 65 6e 64 69 66 0a 7d 0a  erred;.#endif.}.
10d20 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
10d30 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 65  code that will e
10d40 72 61 73 65 20 61 6e 64 20 72 65 66 69 6c 6c 20  rase and refill 
10d50 69 6e 64 65 78 20 2a 70 49 64 78 2e 20 20 54 68  index *pIdx.  Th
10d60 69 73 20 69 73 0a 2a 2a 20 75 73 65 64 20 74 6f  is is.** used to
10d70 20 69 6e 69 74 69 61 6c 69 7a 65 20 61 20 6e 65   initialize a ne
10d80 77 6c 79 20 63 72 65 61 74 65 64 20 69 6e 64 65  wly created inde
10d90 78 20 6f 72 20 74 6f 20 72 65 63 6f 6d 70 75 74  x or to recomput
10da0 65 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74  e the.** content
10db0 20 6f 66 20 61 6e 20 69 6e 64 65 78 20 69 6e 20   of an index in 
10dc0 72 65 73 70 6f 6e 73 65 20 74 6f 20 61 20 52 45  response to a RE
10dd0 49 4e 44 45 58 20 63 6f 6d 6d 61 6e 64 2e 0a 2a  INDEX command..*
10de0 2a 0a 2a 2a 20 69 66 20 6d 65 6d 52 6f 6f 74 50  *.** if memRootP
10df0 61 67 65 20 69 73 20 6e 6f 74 20 6e 65 67 61 74  age is not negat
10e00 69 76 65 2c 20 69 74 20 6d 65 61 6e 73 20 74 68  ive, it means th
10e10 61 74 20 74 68 65 20 69 6e 64 65 78 20 69 73 20  at the index is 
10e20 6e 65 77 6c 79 0a 2a 2a 20 63 72 65 61 74 65 64  newly.** created
10e30 2e 20 20 54 68 65 20 6d 65 6d 6f 72 79 20 63 65  .  The memory ce
10e40 6c 6c 20 73 70 65 63 69 66 69 65 64 20 62 79 20  ll specified by 
10e50 6d 65 6d 52 6f 6f 74 50 61 67 65 20 63 6f 6e 74  memRootPage cont
10e60 61 69 6e 73 20 74 68 65 0a 2a 2a 20 72 6f 6f 74  ains the.** root
10e70 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
10e80 74 68 65 20 69 6e 64 65 78 2e 20 20 49 66 20 6d  the index.  If m
10e90 65 6d 52 6f 6f 74 50 61 67 65 20 69 73 20 6e 65  emRootPage is ne
10ea0 67 61 74 69 76 65 2c 20 74 68 65 6e 0a 2a 2a 20  gative, then.** 
10eb0 74 68 65 20 69 6e 64 65 78 20 61 6c 72 65 61 64  the index alread
10ec0 79 20 65 78 69 73 74 73 20 61 6e 64 20 6d 75 73  y exists and mus
10ed0 74 20 62 65 20 63 6c 65 61 72 65 64 20 62 65 66  t be cleared bef
10ee0 6f 72 65 20 62 65 69 6e 67 20 72 65 66 69 6c 6c  ore being refill
10ef0 65 64 20 61 6e 64 0a 2a 2a 20 74 68 65 20 72 6f  ed and.** the ro
10f00 6f 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f  ot page number o
10f10 66 20 74 68 65 20 69 6e 64 65 78 20 69 73 20 74  f the index is t
10f20 61 6b 65 6e 20 66 72 6f 6d 20 70 49 6e 64 65 78  aken from pIndex
10f30 2d 3e 74 6e 75 6d 2e 0a 2a 2f 0a 73 74 61 74 69  ->tnum..*/.stati
10f40 63 20 76 6f 69 64 20 73 71 6c 69 74 65 33 52 65  c void sqlite3Re
10f50 66 69 6c 6c 49 6e 64 65 78 28 50 61 72 73 65 20  fillIndex(Parse 
10f60 2a 70 50 61 72 73 65 2c 20 49 6e 64 65 78 20 2a  *pParse, Index *
10f70 70 49 6e 64 65 78 2c 20 69 6e 74 20 6d 65 6d 52  pIndex, int memR
10f80 6f 6f 74 50 61 67 65 29 7b 0a 20 20 54 61 62 6c  ootPage){.  Tabl
10f90 65 20 2a 70 54 61 62 20 3d 20 70 49 6e 64 65 78  e *pTab = pIndex
10fa0 2d 3e 70 54 61 62 6c 65 3b 20 20 2f 2a 20 54 68  ->pTable;  /* Th
10fb0 65 20 74 61 62 6c 65 20 74 68 61 74 20 69 73 20  e table that is 
10fc0 69 6e 64 65 78 65 64 20 2a 2f 0a 20 20 69 6e 74  indexed */.  int
10fd0 20 69 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e   iTab = pParse->
10fe0 6e 54 61 62 3b 20 20 20 20 20 20 20 2f 2a 20 42  nTab;       /* B
10ff0 74 72 65 65 20 63 75 72 73 6f 72 20 75 73 65 64  tree cursor used
11000 20 66 6f 72 20 70 54 61 62 20 2a 2f 0a 20 20 69   for pTab */.  i
11010 6e 74 20 69 49 64 78 20 3d 20 70 50 61 72 73 65  nt iIdx = pParse
11020 2d 3e 6e 54 61 62 2b 31 3b 20 20 20 20 20 2f 2a  ->nTab+1;     /*
11030 20 42 74 72 65 65 20 63 75 72 73 6f 72 20 75 73   Btree cursor us
11040 65 64 20 66 6f 72 20 70 49 6e 64 65 78 20 2a 2f  ed for pIndex */
11050 0a 20 20 69 6e 74 20 61 64 64 72 31 3b 20 20 20  .  int addr1;   
11060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11070 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
11080 74 6f 70 20 6f 66 20 6c 6f 6f 70 20 2a 2f 0a 20  top of loop */. 
11090 20 69 6e 74 20 74 6e 75 6d 3b 20 20 20 20 20 20   int tnum;      
110a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
110b0 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20 6f 66 20  /* Root page of 
110c0 69 6e 64 65 78 20 2a 2f 0a 20 20 56 64 62 65 20  index */.  Vdbe 
110d0 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  *v;             
110e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47 65 6e            /* Gen
110f0 65 72 61 74 65 20 63 6f 64 65 20 69 6e 74 6f 20  erate code into 
11100 74 68 69 73 20 76 69 72 74 75 61 6c 20 6d 61 63  this virtual mac
11110 68 69 6e 65 20 2a 2f 0a 20 20 4b 65 79 49 6e 66  hine */.  KeyInf
11120 6f 20 2a 70 4b 65 79 3b 20 20 20 20 20 20 20 20  o *pKey;        
11130 20 20 20 20 20 20 20 20 20 2f 2a 20 4b 65 79 49           /* KeyI
11140 6e 66 6f 20 66 6f 72 20 69 6e 64 65 78 20 2a 2f  nfo for index */
11150 0a 20 20 69 6e 74 20 69 44 62 20 3d 20 73 71 6c  .  int iDb = sql
11160 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65  ite3SchemaToInde
11170 78 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 49  x(pParse->db, pI
11180 6e 64 65 78 2d 3e 70 53 63 68 65 6d 61 29 3b 0a  ndex->pSchema);.
11190 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
111a0 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49  OMIT_AUTHORIZATI
111b0 4f 4e 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  ON.  if( sqlite3
111c0 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65  AuthCheck(pParse
111d0 2c 20 53 51 4c 49 54 45 5f 52 45 49 4e 44 45 58  , SQLITE_REINDEX
111e0 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c  , pIndex->zName,
111f0 20 30 2c 0a 20 20 20 20 20 20 70 50 61 72 73 65   0,.      pParse
11200 2d 3e 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a  ->db->aDb[iDb].z
11210 4e 61 6d 65 20 29 20 29 7b 0a 20 20 20 20 72 65  Name ) ){.    re
11220 74 75 72 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  turn;.  }.#endif
11230 0a 0a 20 20 2f 2a 20 52 65 71 75 69 72 65 20 61  ..  /* Require a
11240 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74   write-lock on t
11250 68 65 20 74 61 62 6c 65 20 74 6f 20 70 65 72 66  he table to perf
11260 6f 72 6d 20 74 68 69 73 20 6f 70 65 72 61 74 69  orm this operati
11270 6f 6e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 54  on */.  sqlite3T
11280 61 62 6c 65 4c 6f 63 6b 28 70 50 61 72 73 65 2c  ableLock(pParse,
11290 20 69 44 62 2c 20 70 54 61 62 2d 3e 74 6e 75 6d   iDb, pTab->tnum
112a0 2c 20 31 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  , 1, pTab->zName
112b0 29 3b 0a 0a 20 20 76 20 3d 20 73 71 6c 69 74 65  );..  v = sqlite
112c0 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
112d0 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72  ;.  if( v==0 ) r
112e0 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 6d 65 6d  eturn;.  if( mem
112f0 52 6f 6f 74 50 61 67 65 3e 3d 30 20 29 7b 0a 20  RootPage>=0 ){. 
11300 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
11310 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 4c 6f 61  dOp(v, OP_MemLoa
11320 64 2c 20 6d 65 6d 52 6f 6f 74 50 61 67 65 2c 20  d, memRootPage, 
11330 30 29 3b 0a 20 20 20 20 74 6e 75 6d 20 3d 20 30  0);.    tnum = 0
11340 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 74  ;.  }else{.    t
11350 6e 75 6d 20 3d 20 70 49 6e 64 65 78 2d 3e 74 6e  num = pIndex->tn
11360 75 6d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  um;.    sqlite3V
11370 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43  dbeAddOp(v, OP_C
11380 6c 65 61 72 2c 20 74 6e 75 6d 2c 20 69 44 62 29  lear, tnum, iDb)
11390 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56  ;.  }.  sqlite3V
113a0 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49  dbeAddOp(v, OP_I
113b0 6e 74 65 67 65 72 2c 20 69 44 62 2c 20 30 29 3b  nteger, iDb, 0);
113c0 0a 20 20 70 4b 65 79 20 3d 20 73 71 6c 69 74 65  .  pKey = sqlite
113d0 33 49 6e 64 65 78 4b 65 79 69 6e 66 6f 28 70 50  3IndexKeyinfo(pP
113e0 61 72 73 65 2c 20 70 49 6e 64 65 78 29 3b 0a 20  arse, pIndex);. 
113f0 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28   sqlite3VdbeOp3(
11400 76 2c 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65 2c  v, OP_OpenWrite,
11410 20 69 49 64 78 2c 20 74 6e 75 6d 2c 20 28 63 68   iIdx, tnum, (ch
11420 61 72 20 2a 29 70 4b 65 79 2c 20 50 33 5f 4b 45  ar *)pKey, P3_KE
11430 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a  YINFO_HANDOFF);.
11440 20 20 73 71 6c 69 74 65 33 4f 70 65 6e 54 61 62    sqlite3OpenTab
11450 6c 65 28 70 50 61 72 73 65 2c 20 69 54 61 62 2c  le(pParse, iTab,
11460 20 69 44 62 2c 20 70 54 61 62 2c 20 4f 50 5f 4f   iDb, pTab, OP_O
11470 70 65 6e 52 65 61 64 29 3b 0a 20 20 61 64 64 72  penRead);.  addr
11480 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  1 = sqlite3VdbeA
11490 64 64 4f 70 28 76 2c 20 4f 50 5f 52 65 77 69 6e  ddOp(v, OP_Rewin
114a0 64 2c 20 69 54 61 62 2c 20 30 29 3b 0a 20 20 73  d, iTab, 0);.  s
114b0 71 6c 69 74 65 33 47 65 6e 65 72 61 74 65 49 6e  qlite3GenerateIn
114c0 64 65 78 4b 65 79 28 76 2c 20 70 49 6e 64 65 78  dexKey(v, pIndex
114d0 2c 20 69 54 61 62 29 3b 0a 20 20 69 66 28 20 70  , iTab);.  if( p
114e0 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d  Index->onError!=
114f0 4f 45 5f 4e 6f 6e 65 20 29 7b 0a 20 20 20 20 69  OE_None ){.    i
11500 6e 74 20 63 75 72 61 64 64 72 20 3d 20 73 71 6c  nt curaddr = sql
11510 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
11520 64 64 72 28 76 29 3b 0a 20 20 20 20 69 6e 74 20  ddr(v);.    int 
11530 61 64 64 72 32 20 3d 20 63 75 72 61 64 64 72 2b  addr2 = curaddr+
11540 34 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  4;.    sqlite3Vd
11550 62 65 43 68 61 6e 67 65 50 32 28 76 2c 20 63 75  beChangeP2(v, cu
11560 72 61 64 64 72 2d 31 2c 20 61 64 64 72 32 29 3b  raddr-1, addr2);
11570 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
11580 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52 6f 77 69  AddOp(v, OP_Rowi
11590 64 2c 20 69 54 61 62 2c 20 30 29 3b 0a 20 20 20  d, iTab, 0);.   
115a0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
115b0 70 28 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20  p(v, OP_AddImm, 
115c0 31 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  1, 0);.    sqlit
115d0 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
115e0 50 5f 49 73 55 6e 69 71 75 65 2c 20 69 49 64 78  P_IsUnique, iIdx
115f0 2c 20 61 64 64 72 32 29 3b 0a 20 20 20 20 73 71  , addr2);.    sq
11600 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20  lite3VdbeOp3(v, 
11610 4f 50 5f 48 61 6c 74 2c 20 53 51 4c 49 54 45 5f  OP_Halt, SQLITE_
11620 43 4f 4e 53 54 52 41 49 4e 54 2c 20 4f 45 5f 41  CONSTRAINT, OE_A
11630 62 6f 72 74 2c 0a 20 20 20 20 20 20 20 20 20 20  bort,.          
11640 20 20 20 20 20 20 20 20 20 20 22 69 6e 64 65 78            "index
11650 65 64 20 63 6f 6c 75 6d 6e 73 20 61 72 65 20 6e  ed columns are n
11660 6f 74 20 75 6e 69 71 75 65 22 2c 20 50 33 5f 53  ot unique", P3_S
11670 54 41 54 49 43 29 3b 0a 20 20 20 20 61 73 73 65  TATIC);.    asse
11680 72 74 28 20 61 64 64 72 32 3d 3d 73 71 6c 69 74  rt( addr2==sqlit
11690 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
116a0 72 28 76 29 20 29 3b 0a 20 20 7d 0a 20 20 73 71  r(v) );.  }.  sq
116b0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
116c0 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20  , OP_IdxInsert, 
116d0 69 49 64 78 2c 20 30 29 3b 0a 20 20 73 71 6c 69  iIdx, 0);.  sqli
116e0 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
116f0 4f 50 5f 4e 65 78 74 2c 20 69 54 61 62 2c 20 61  OP_Next, iTab, a
11700 64 64 72 31 2b 31 29 3b 0a 20 20 73 71 6c 69 74  ddr1+1);.  sqlit
11710 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
11720 2c 20 61 64 64 72 31 29 3b 0a 20 20 73 71 6c 69  , addr1);.  sqli
11730 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
11740 4f 50 5f 43 6c 6f 73 65 2c 20 69 54 61 62 2c 20  OP_Close, iTab, 
11750 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  0);.  sqlite3Vdb
11760 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f  eAddOp(v, OP_Clo
11770 73 65 2c 20 69 49 64 78 2c 20 30 29 3b 0a 7d 0a  se, iIdx, 0);.}.
11780 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20  ./*.** Create a 
11790 6e 65 77 20 69 6e 64 65 78 20 66 6f 72 20 61 6e  new index for an
117a0 20 53 51 4c 20 74 61 62 6c 65 2e 20 20 70 4e 61   SQL table.  pNa
117b0 6d 65 31 2e 70 4e 61 6d 65 32 20 69 73 20 74 68  me1.pName2 is th
117c0 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 69 6e  e name of the in
117d0 64 65 78 20 0a 2a 2a 20 61 6e 64 20 70 54 62 6c  dex .** and pTbl
117e0 4c 69 73 74 20 69 73 20 74 68 65 20 6e 61 6d 65  List is the name
117f0 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74 68   of the table th
11800 61 74 20 69 73 20 74 6f 20 62 65 20 69 6e 64 65  at is to be inde
11810 78 65 64 2e 20 20 42 6f 74 68 20 77 69 6c 6c 20  xed.  Both will 
11820 0a 2a 2a 20 62 65 20 4e 55 4c 4c 20 66 6f 72 20  .** be NULL for 
11830 61 20 70 72 69 6d 61 72 79 20 6b 65 79 20 6f 72  a primary key or
11840 20 61 6e 20 69 6e 64 65 78 20 74 68 61 74 20 69   an index that i
11850 73 20 63 72 65 61 74 65 64 20 74 6f 20 73 61 74  s created to sat
11860 69 73 66 79 20 61 0a 2a 2a 20 55 4e 49 51 55 45  isfy a.** UNIQUE
11870 20 63 6f 6e 73 74 72 61 69 6e 74 2e 20 20 49 66   constraint.  If
11880 20 70 54 61 62 6c 65 20 61 6e 64 20 70 49 6e 64   pTable and pInd
11890 65 78 20 61 72 65 20 4e 55 4c 4c 2c 20 75 73 65  ex are NULL, use
118a0 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
118b0 6c 65 0a 2a 2a 20 61 73 20 74 68 65 20 74 61 62  le.** as the tab
118c0 6c 65 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64  le to be indexed
118d0 2e 20 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54  .  pParse->pNewT
118e0 61 62 6c 65 20 69 73 20 61 20 74 61 62 6c 65 20  able is a table 
118f0 74 68 61 74 20 69 73 0a 2a 2a 20 63 75 72 72 65  that is.** curre
11900 6e 74 6c 79 20 62 65 69 6e 67 20 63 6f 6e 73 74  ntly being const
11910 72 75 63 74 65 64 20 62 79 20 61 20 43 52 45 41  ructed by a CREA
11920 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65  TE TABLE stateme
11930 6e 74 2e 0a 2a 2a 0a 2a 2a 20 70 4c 69 73 74 20  nt..**.** pList 
11940 69 73 20 61 20 6c 69 73 74 20 6f 66 20 63 6f 6c  is a list of col
11950 75 6d 6e 73 20 74 6f 20 62 65 20 69 6e 64 65 78  umns to be index
11960 65 64 2e 20 20 70 4c 69 73 74 20 77 69 6c 6c 20  ed.  pList will 
11970 62 65 20 4e 55 4c 4c 20 69 66 20 74 68 69 73 0a  be NULL if this.
11980 2a 2a 20 69 73 20 61 20 70 72 69 6d 61 72 79 20  ** is a primary 
11990 6b 65 79 20 6f 72 20 75 6e 69 71 75 65 2d 63 6f  key or unique-co
119a0 6e 73 74 72 61 69 6e 74 20 6f 6e 20 74 68 65 20  nstraint on the 
119b0 6d 6f 73 74 20 72 65 63 65 6e 74 20 63 6f 6c 75  most recent colu
119c0 6d 6e 20 61 64 64 65 64 0a 2a 2a 20 74 6f 20 74  mn added.** to t
119d0 68 65 20 74 61 62 6c 65 20 63 75 72 72 65 6e 74  he table current
119e0 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75  ly under constru
119f0 63 74 69 6f 6e 2e 20 20 0a 2a 2f 0a 76 6f 69 64  ction.  .*/.void
11a00 20 73 71 6c 69 74 65 33 43 72 65 61 74 65 49 6e   sqlite3CreateIn
11a10 64 65 78 28 0a 20 20 50 61 72 73 65 20 2a 70 50  dex(.  Parse *pP
11a20 61 72 73 65 2c 20 20 20 20 20 2f 2a 20 41 6c 6c  arse,     /* All
11a30 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f   information abo
11a40 75 74 20 74 68 69 73 20 70 61 72 73 65 20 2a 2f  ut this parse */
11a50 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31  .  Token *pName1
11a60 2c 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 70  ,     /* First p
11a70 61 72 74 20 6f 66 20 69 6e 64 65 78 20 6e 61 6d  art of index nam
11a80 65 2e 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a  e. May be NULL *
11a90 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65  /.  Token *pName
11aa0 32 2c 20 20 20 20 20 2f 2a 20 53 65 63 6f 6e 64  2,     /* Second
11ab0 20 70 61 72 74 20 6f 66 20 69 6e 64 65 78 20 6e   part of index n
11ac0 61 6d 65 2e 20 4d 61 79 20 62 65 20 4e 55 4c 4c  ame. May be NULL
11ad0 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70   */.  SrcList *p
11ae0 54 62 6c 4e 61 6d 65 2c 20 2f 2a 20 54 61 62 6c  TblName, /* Tabl
11af0 65 20 74 6f 20 69 6e 64 65 78 2e 20 55 73 65 20  e to index. Use 
11b00 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
11b10 65 20 69 66 20 30 20 2a 2f 0a 20 20 45 78 70 72  e if 0 */.  Expr
11b20 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 2f  List *pList,   /
11b30 2a 20 41 20 6c 69 73 74 20 6f 66 20 63 6f 6c 75  * A list of colu
11b40 6d 6e 73 20 74 6f 20 62 65 20 69 6e 64 65 78 65  mns to be indexe
11b50 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 6e 45 72 72  d */.  int onErr
11b60 6f 72 2c 20 20 20 20 20 20 20 2f 2a 20 4f 45 5f  or,       /* OE_
11b70 41 62 6f 72 74 2c 20 4f 45 5f 49 67 6e 6f 72 65  Abort, OE_Ignore
11b80 2c 20 4f 45 5f 52 65 70 6c 61 63 65 2c 20 6f 72  , OE_Replace, or
11b90 20 4f 45 5f 4e 6f 6e 65 20 2a 2f 0a 20 20 54 6f   OE_None */.  To
11ba0 6b 65 6e 20 2a 70 53 74 61 72 74 2c 20 20 20 20  ken *pStart,    
11bb0 20 2f 2a 20 54 68 65 20 43 52 45 41 54 45 20 74   /* The CREATE t
11bc0 6f 6b 65 6e 20 74 68 61 74 20 62 65 67 69 6e 73  oken that begins
11bd0 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20   a CREATE TABLE 
11be0 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 54  statement */.  T
11bf0 6f 6b 65 6e 20 2a 70 45 6e 64 2c 20 20 20 20 20  oken *pEnd,     
11c00 20 20 2f 2a 20 54 68 65 20 22 29 22 20 74 68 61    /* The ")" tha
11c10 74 20 63 6c 6f 73 65 73 20 74 68 65 20 43 52 45  t closes the CRE
11c20 41 54 45 20 49 4e 44 45 58 20 73 74 61 74 65 6d  ATE INDEX statem
11c30 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 73 6f 72  ent */.  int sor
11c40 74 4f 72 64 65 72 2c 20 20 20 20 20 2f 2a 20 53  tOrder,     /* S
11c50 6f 72 74 20 6f 72 64 65 72 20 6f 66 20 70 72 69  ort order of pri
11c60 6d 61 72 79 20 6b 65 79 20 77 68 65 6e 20 70 4c  mary key when pL
11c70 69 73 74 3d 3d 4e 55 4c 4c 20 2a 2f 0a 20 20 69  ist==NULL */.  i
11c80 6e 74 20 69 66 4e 6f 74 45 78 69 73 74 20 20 20  nt ifNotExist   
11c90 20 20 2f 2a 20 4f 6d 69 74 20 65 72 72 6f 72 20    /* Omit error 
11ca0 69 66 20 69 6e 64 65 78 20 61 6c 72 65 61 64 79  if index already
11cb0 20 65 78 69 73 74 73 20 2a 2f 0a 29 7b 0a 20 20   exists */.){.  
11cc0 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 30 3b  Table *pTab = 0;
11cd0 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 74 6f       /* Table to
11ce0 20 62 65 20 69 6e 64 65 78 65 64 20 2a 2f 0a 20   be indexed */. 
11cf0 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 20 3d   Index *pIndex =
11d00 20 30 3b 20 20 20 2f 2a 20 54 68 65 20 69 6e 64   0;   /* The ind
11d10 65 78 20 74 6f 20 62 65 20 63 72 65 61 74 65 64  ex to be created
11d20 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d   */.  char *zNam
11d30 65 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 4e 61  e = 0;     /* Na
11d40 6d 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20  me of the index 
11d50 2a 2f 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 3b 20  */.  int nName; 
11d60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
11d70 62 65 72 20 6f 66 20 63 68 61 72 61 63 74 65 72  ber of character
11d80 73 20 69 6e 20 7a 4e 61 6d 65 20 2a 2f 0a 20 20  s in zName */.  
11d90 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 54 6f 6b 65  int i, j;.  Toke
11da0 6e 20 6e 75 6c 6c 49 64 3b 20 20 20 20 20 20 20  n nullId;       
11db0 20 2f 2a 20 46 61 6b 65 20 74 6f 6b 65 6e 20 66   /* Fake token f
11dc0 6f 72 20 61 6e 20 65 6d 70 74 79 20 49 44 20 6c  or an empty ID l
11dd0 69 73 74 20 2a 2f 0a 20 20 44 62 46 69 78 65 72  ist */.  DbFixer
11de0 20 73 46 69 78 3b 20 20 20 20 20 20 20 20 2f 2a   sFix;        /*
11df0 20 46 6f 72 20 61 73 73 69 67 6e 69 6e 67 20 64   For assigning d
11e00 61 74 61 62 61 73 65 20 6e 61 6d 65 73 20 74 6f  atabase names to
11e10 20 70 54 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74   pTable */.  int
11e20 20 73 6f 72 74 4f 72 64 65 72 4d 61 73 6b 3b 20   sortOrderMask; 
11e30 20 20 2f 2a 20 31 20 74 6f 20 68 6f 6e 6f 72 20    /* 1 to honor 
11e40 44 45 53 43 20 69 6e 20 69 6e 64 65 78 2e 20 20  DESC in index.  
11e50 30 20 74 6f 20 69 67 6e 6f 72 65 2e 20 2a 2f 0a  0 to ignore. */.
11e60 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
11e70 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 44 62  pParse->db;.  Db
11e80 20 2a 70 44 62 3b 20 20 20 20 20 20 20 20 20 20   *pDb;          
11e90 20 20 20 2f 2a 20 54 68 65 20 73 70 65 63 69 66     /* The specif
11ea0 69 63 20 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e  ic table contain
11eb0 69 6e 67 20 74 68 65 20 69 6e 64 65 78 65 64 20  ing the indexed 
11ec0 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 69 6e  database */.  in
11ed0 74 20 69 44 62 3b 20 20 20 20 20 20 20 20 20 20  t iDb;          
11ee0 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74     /* Index of t
11ef0 68 65 20 64 61 74 61 62 61 73 65 20 74 68 61 74  he database that
11f00 20 69 73 20 62 65 69 6e 67 20 77 72 69 74 74 65   is being writte
11f10 6e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e  n */.  Token *pN
11f20 61 6d 65 20 3d 20 30 3b 20 20 20 20 2f 2a 20 55  ame = 0;    /* U
11f30 6e 71 75 61 6c 69 66 69 65 64 20 6e 61 6d 65 20  nqualified name 
11f40 6f 66 20 74 68 65 20 69 6e 64 65 78 20 74 6f 20  of the index to 
11f50 63 72 65 61 74 65 20 2a 2f 0a 20 20 73 74 72 75  create */.  stru
11f60 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
11f70 20 2a 70 4c 69 73 74 49 74 65 6d 3b 20 2f 2a 20   *pListItem; /* 
11f80 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72  For looping over
11f90 20 70 4c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20   pList */.  int 
11fa0 6e 43 6f 6c 3b 0a 20 20 69 6e 74 20 6e 45 78 74  nCol;.  int nExt
11fb0 72 61 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a  ra = 0;.  char *
11fc0 7a 45 78 74 72 61 3b 0a 0a 20 20 69 66 28 20 70  zExtra;..  if( p
11fd0 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 73  Parse->nErr || s
11fe0 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 46 61 69 6c  qlite3MallocFail
11ff0 65 64 28 29 20 7c 7c 20 49 4e 5f 44 45 43 4c 41  ed() || IN_DECLA
12000 52 45 5f 56 54 41 42 20 29 7b 0a 20 20 20 20 67  RE_VTAB ){.    g
12010 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
12020 69 6e 64 65 78 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  index;.  }..  /*
12030 0a 20 20 2a 2a 20 46 69 6e 64 20 74 68 65 20 74  .  ** Find the t
12040 61 62 6c 65 20 74 68 61 74 20 69 73 20 74 6f 20  able that is to 
12050 62 65 20 69 6e 64 65 78 65 64 2e 20 20 52 65 74  be indexed.  Ret
12060 75 72 6e 20 65 61 72 6c 79 20 69 66 20 6e 6f 74  urn early if not
12070 20 66 6f 75 6e 64 2e 0a 20 20 2a 2f 0a 20 20 69   found..  */.  i
12080 66 28 20 70 54 62 6c 4e 61 6d 65 21 3d 30 20 29  f( pTblName!=0 )
12090 7b 0a 0a 20 20 20 20 2f 2a 20 55 73 65 20 74 68  {..    /* Use th
120a0 65 20 74 77 6f 2d 70 61 72 74 20 69 6e 64 65 78  e two-part index
120b0 20 6e 61 6d 65 20 74 6f 20 64 65 74 65 72 6d 69   name to determi
120c0 6e 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ne the database 
120d0 0a 20 20 20 20 2a 2a 20 74 6f 20 73 65 61 72 63  .    ** to searc
120e0 68 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 2e  h for the table.
120f0 20 27 46 69 78 27 20 74 68 65 20 74 61 62 6c 65   'Fix' the table
12100 20 6e 61 6d 65 20 74 6f 20 74 68 69 73 20 64 62   name to this db
12110 0a 20 20 20 20 2a 2a 20 62 65 66 6f 72 65 20 6c  .    ** before l
12120 6f 6f 6b 69 6e 67 20 75 70 20 74 68 65 20 74 61  ooking up the ta
12130 62 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ble..    */.    
12140 61 73 73 65 72 74 28 20 70 4e 61 6d 65 31 20 26  assert( pName1 &
12150 26 20 70 4e 61 6d 65 32 20 29 3b 0a 20 20 20 20  & pName2 );.    
12160 69 44 62 20 3d 20 73 71 6c 69 74 65 33 54 77 6f  iDb = sqlite3Two
12170 50 61 72 74 4e 61 6d 65 28 70 50 61 72 73 65 2c  PartName(pParse,
12180 20 70 4e 61 6d 65 31 2c 20 70 4e 61 6d 65 32 2c   pName1, pName2,
12190 20 26 70 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66   &pName);.    if
121a0 28 20 69 44 62 3c 30 20 29 20 67 6f 74 6f 20 65  ( iDb<0 ) goto e
121b0 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
121c0 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ;..#ifndef SQLIT
121d0 45 5f 4f 4d 49 54 5f 54 45 4d 50 44 42 0a 20 20  E_OMIT_TEMPDB.  
121e0 20 20 2f 2a 20 49 66 20 74 68 65 20 69 6e 64 65    /* If the inde
121f0 78 20 6e 61 6d 65 20 77 61 73 20 75 6e 71 75 61  x name was unqua
12200 6c 69 66 69 65 64 2c 20 63 68 65 63 6b 20 69 66  lified, check if
12210 20 74 68 65 20 74 68 65 20 74 61 62 6c 65 0a 20   the the table. 
12220 20 20 20 2a 2a 20 69 73 20 61 20 74 65 6d 70 20     ** is a temp 
12230 74 61 62 6c 65 2e 20 49 66 20 73 6f 2c 20 73 65  table. If so, se
12240 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74  t the database t
12250 6f 20 31 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  o 1..    */.    
12260 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33 53 72  pTab = sqlite3Sr
12270 63 4c 69 73 74 4c 6f 6f 6b 75 70 28 70 50 61 72  cListLookup(pPar
12280 73 65 2c 20 70 54 62 6c 4e 61 6d 65 29 3b 0a 20  se, pTblName);. 
12290 20 20 20 69 66 28 20 70 4e 61 6d 65 32 20 26 26     if( pName2 &&
122a0 20 70 4e 61 6d 65 32 2d 3e 6e 3d 3d 30 20 26 26   pName2->n==0 &&
122b0 20 70 54 61 62 20 26 26 20 70 54 61 62 2d 3e 70   pTab && pTab->p
122c0 53 63 68 65 6d 61 3d 3d 64 62 2d 3e 61 44 62 5b  Schema==db->aDb[
122d0 31 5d 2e 70 53 63 68 65 6d 61 20 29 7b 0a 20 20  1].pSchema ){.  
122e0 20 20 20 20 69 44 62 20 3d 20 31 3b 0a 20 20 20      iDb = 1;.   
122f0 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 69   }.#endif..    i
12300 66 28 20 73 71 6c 69 74 65 33 46 69 78 49 6e 69  f( sqlite3FixIni
12310 74 28 26 73 46 69 78 2c 20 70 50 61 72 73 65 2c  t(&sFix, pParse,
12320 20 69 44 62 2c 20 22 69 6e 64 65 78 22 2c 20 70   iDb, "index", p
12330 4e 61 6d 65 29 20 26 26 0a 20 20 20 20 20 20 20  Name) &&.       
12340 20 73 71 6c 69 74 65 33 46 69 78 53 72 63 4c 69   sqlite3FixSrcLi
12350 73 74 28 26 73 46 69 78 2c 20 70 54 62 6c 4e 61  st(&sFix, pTblNa
12360 6d 65 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  me).    ){.     
12370 20 2f 2a 20 42 65 63 61 75 73 65 20 74 68 65 20   /* Because the 
12380 70 61 72 73 65 72 20 63 6f 6e 73 74 72 75 63 74  parser construct
12390 73 20 70 54 62 6c 4e 61 6d 65 20 66 72 6f 6d 20  s pTblName from 
123a0 61 20 73 69 6e 67 6c 65 20 69 64 65 6e 74 69 66  a single identif
123b0 69 65 72 2c 0a 20 20 20 20 20 20 2a 2a 20 73 71  ier,.      ** sq
123c0 6c 69 74 65 33 46 69 78 53 72 63 4c 69 73 74 20  lite3FixSrcList 
123d0 63 61 6e 20 6e 65 76 65 72 20 66 61 69 6c 2e 20  can never fail. 
123e0 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  */.      assert(
123f0 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 54  0);.    }.    pT
12400 61 62 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63 61  ab = sqlite3Loca
12410 74 65 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20  teTable(pParse, 
12420 70 54 62 6c 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a  pTblName->a[0].z
12430 4e 61 6d 65 2c 20 0a 20 20 20 20 20 20 20 20 70  Name, .        p
12440 54 62 6c 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 44  TblName->a[0].zD
12450 61 74 61 62 61 73 65 29 3b 0a 20 20 20 20 69 66  atabase);.    if
12460 28 20 21 70 54 61 62 20 29 20 67 6f 74 6f 20 65  ( !pTab ) goto e
12470 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
12480 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 64 62  ;.    assert( db
12490 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53 63 68 65  ->aDb[iDb].pSche
124a0 6d 61 3d 3d 70 54 61 62 2d 3e 70 53 63 68 65 6d  ma==pTab->pSchem
124b0 61 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  a );.  }else{.  
124c0 20 20 61 73 73 65 72 74 28 20 70 4e 61 6d 65 3d    assert( pName=
124d0 3d 30 20 29 3b 0a 20 20 20 20 70 54 61 62 20 3d  =0 );.    pTab =
124e0 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
124f0 6c 65 3b 0a 20 20 20 20 69 66 28 20 21 70 54 61  le;.    if( !pTa
12500 62 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72  b ) goto exit_cr
12510 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20  eate_index;.    
12520 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68  iDb = sqlite3Sch
12530 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70  emaToIndex(db, p
12540 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20  Tab->pSchema);. 
12550 20 7d 0a 20 20 70 44 62 20 3d 20 26 64 62 2d 3e   }.  pDb = &db->
12560 61 44 62 5b 69 44 62 5d 3b 0a 0a 20 20 69 66 28  aDb[iDb];..  if(
12570 20 70 54 61 62 3d 3d 30 20 7c 7c 20 70 50 61 72   pTab==0 || pPar
12580 73 65 2d 3e 6e 45 72 72 20 29 20 67 6f 74 6f 20  se->nErr ) goto 
12590 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
125a0 78 3b 0a 20 20 69 66 28 20 70 54 61 62 2d 3e 72  x;.  if( pTab->r
125b0 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 73  eadOnly ){.    s
125c0 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
125d0 50 61 72 73 65 2c 20 22 74 61 62 6c 65 20 25 73  Parse, "table %s
125e0 20 6d 61 79 20 6e 6f 74 20 62 65 20 69 6e 64 65   may not be inde
125f0 78 65 64 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  xed", pTab->zNam
12600 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69  e);.    goto exi
12610 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
12620 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
12630 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 20 20 69  TE_OMIT_VIEW.  i
12640 66 28 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74  f( pTab->pSelect
12650 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
12660 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
12670 22 76 69 65 77 73 20 6d 61 79 20 6e 6f 74 20 62  "views may not b
12680 65 20 69 6e 64 65 78 65 64 22 29 3b 0a 20 20 20  e indexed");.   
12690 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
126a0 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 23 65 6e  e_index;.  }.#en
126b0 64 69 66 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  dif.#ifndef SQLI
126c0 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
126d0 41 42 4c 45 0a 20 20 69 66 28 20 49 73 56 69 72  ABLE.  if( IsVir
126e0 74 75 61 6c 28 70 54 61 62 29 20 29 7b 0a 20 20  tual(pTab) ){.  
126f0 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
12700 67 28 70 50 61 72 73 65 2c 20 22 76 69 72 74 75  g(pParse, "virtu
12710 61 6c 20 74 61 62 6c 65 73 20 6d 61 79 20 6e 6f  al tables may no
12720 74 20 62 65 20 69 6e 64 65 78 65 64 22 29 3b 0a  t be indexed");.
12730 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72      goto exit_cr
12740 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a  eate_index;.  }.
12750 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 0a 20 20 2a  #endif..  /*.  *
12760 2a 20 46 69 6e 64 20 74 68 65 20 6e 61 6d 65 20  * Find the name 
12770 6f 66 20 74 68 65 20 69 6e 64 65 78 2e 20 20 4d  of the index.  M
12780 61 6b 65 20 73 75 72 65 20 74 68 65 72 65 20 69  ake sure there i
12790 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 61 6e  s not already an
127a0 6f 74 68 65 72 0a 20 20 2a 2a 20 69 6e 64 65 78  other.  ** index
127b0 20 6f 72 20 74 61 62 6c 65 20 77 69 74 68 20 74   or table with t
127c0 68 65 20 73 61 6d 65 20 6e 61 6d 65 2e 20 20 0a  he same name.  .
127d0 20 20 2a 2a 0a 20 20 2a 2a 20 45 78 63 65 70 74    **.  ** Except
127e0 69 6f 6e 3a 20 20 49 66 20 77 65 20 61 72 65 20  ion:  If we are 
127f0 72 65 61 64 69 6e 67 20 74 68 65 20 6e 61 6d 65  reading the name
12800 73 20 6f 66 20 70 65 72 6d 61 6e 65 6e 74 20 69  s of permanent i
12810 6e 64 69 63 65 73 20 66 72 6f 6d 20 74 68 65 0a  ndices from the.
12820 20 20 2a 2a 20 73 71 6c 69 74 65 5f 6d 61 73 74    ** sqlite_mast
12830 65 72 20 74 61 62 6c 65 20 28 62 65 63 61 75 73  er table (becaus
12840 65 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f  e some other pro
12850 63 65 73 73 20 63 68 61 6e 67 65 64 20 74 68 65  cess changed the
12860 20 73 63 68 65 6d 61 29 20 61 6e 64 0a 20 20 2a   schema) and.  *
12870 2a 20 6f 6e 65 20 6f 66 20 74 68 65 20 69 6e 64  * one of the ind
12880 65 78 20 6e 61 6d 65 73 20 63 6f 6c 6c 69 64 65  ex names collide
12890 73 20 77 69 74 68 20 74 68 65 20 6e 61 6d 65 20  s with the name 
128a0 6f 66 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74  of a temporary t
128b0 61 62 6c 65 20 6f 72 0a 20 20 2a 2a 20 69 6e 64  able or.  ** ind
128c0 65 78 2c 20 74 68 65 6e 20 77 65 20 77 69 6c 6c  ex, then we will
128d0 20 63 6f 6e 74 69 6e 75 65 20 74 6f 20 70 72 6f   continue to pro
128e0 63 65 73 73 20 74 68 69 73 20 69 6e 64 65 78 2e  cess this index.
128f0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 70 4e  .  **.  ** If pN
12900 61 6d 65 3d 3d 30 20 69 74 20 6d 65 61 6e 73 20  ame==0 it means 
12910 74 68 61 74 20 77 65 20 61 72 65 0a 20 20 2a 2a  that we are.  **
12920 20 64 65 61 6c 69 6e 67 20 77 69 74 68 20 61 20   dealing with a 
12930 70 72 69 6d 61 72 79 20 6b 65 79 20 6f 72 20 55  primary key or U
12940 4e 49 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74  NIQUE constraint
12950 2e 20 20 57 65 20 68 61 76 65 20 74 6f 20 69 6e  .  We have to in
12960 76 65 6e 74 20 6f 75 72 0a 20 20 2a 2a 20 6f 77  vent our.  ** ow
12970 6e 20 6e 61 6d 65 2e 0a 20 20 2a 2f 0a 20 20 69  n name..  */.  i
12980 66 28 20 70 4e 61 6d 65 20 29 7b 0a 20 20 20 20  f( pName ){.    
12990 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e  zName = sqlite3N
129a0 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 4e 61  ameFromToken(pNa
129b0 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 53 51 4c  me);.    if( SQL
129c0 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52  ITE_OK!=sqlite3R
129d0 65 61 64 53 63 68 65 6d 61 28 70 50 61 72 73 65  eadSchema(pParse
129e0 29 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72  ) ) goto exit_cr
129f0 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20  eate_index;.    
12a00 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 20 67  if( zName==0 ) g
12a10 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
12a20 69 6e 64 65 78 3b 0a 20 20 20 20 69 66 28 20 53  index;.    if( S
12a30 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65  QLITE_OK!=sqlite
12a40 33 43 68 65 63 6b 4f 62 6a 65 63 74 4e 61 6d 65  3CheckObjectName
12a50 28 70 50 61 72 73 65 2c 20 7a 4e 61 6d 65 29 20  (pParse, zName) 
12a60 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78  ){.      goto ex
12a70 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
12a80 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21  .    }.    if( !
12a90 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b  db->init.busy ){
12aa0 0a 20 20 20 20 20 20 69 66 28 20 53 51 4c 49 54  .      if( SQLIT
12ab0 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65 61  E_OK!=sqlite3Rea
12ac0 64 53 63 68 65 6d 61 28 70 50 61 72 73 65 29 20  dSchema(pParse) 
12ad0 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61  ) goto exit_crea
12ae0 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 20 20  te_index;.      
12af0 69 66 28 20 73 71 6c 69 74 65 33 46 69 6e 64 49  if( sqlite3FindI
12b00 6e 64 65 78 28 64 62 2c 20 7a 4e 61 6d 65 2c 20  ndex(db, zName, 
12b10 70 44 62 2d 3e 7a 4e 61 6d 65 29 21 3d 30 20 29  pDb->zName)!=0 )
12b20 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 69  {.        if( !i
12b30 66 4e 6f 74 45 78 69 73 74 20 29 7b 0a 20 20 20  fNotExist ){.   
12b40 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
12b50 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
12b60 69 6e 64 65 78 20 25 73 20 61 6c 72 65 61 64 79  index %s already
12b70 20 65 78 69 73 74 73 22 2c 20 7a 4e 61 6d 65 29   exists", zName)
12b80 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
12b90 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72      goto exit_cr
12ba0 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20  eate_index;.    
12bb0 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 73 71    }.      if( sq
12bc0 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28 64  lite3FindTable(d
12bd0 62 2c 20 7a 4e 61 6d 65 2c 20 30 29 21 3d 30 20  b, zName, 0)!=0 
12be0 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
12bf0 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
12c00 65 2c 20 22 74 68 65 72 65 20 69 73 20 61 6c 72  e, "there is alr
12c10 65 61 64 79 20 61 20 74 61 62 6c 65 20 6e 61 6d  eady a table nam
12c20 65 64 20 25 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a  ed %s", zName);.
12c30 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69          goto exi
12c40 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
12c50 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
12c60 7d 65 6c 73 65 7b 0a 20 20 20 20 63 68 61 72 20  }else{.    char 
12c70 7a 42 75 66 5b 33 30 5d 3b 0a 20 20 20 20 69 6e  zBuf[30];.    in
12c80 74 20 6e 3b 0a 20 20 20 20 49 6e 64 65 78 20 2a  t n;.    Index *
12c90 70 4c 6f 6f 70 3b 0a 20 20 20 20 66 6f 72 28 70  pLoop;.    for(p
12ca0 4c 6f 6f 70 3d 70 54 61 62 2d 3e 70 49 6e 64 65  Loop=pTab->pInde
12cb0 78 2c 20 6e 3d 31 3b 20 70 4c 6f 6f 70 3b 20 70  x, n=1; pLoop; p
12cc0 4c 6f 6f 70 3d 70 4c 6f 6f 70 2d 3e 70 4e 65 78  Loop=pLoop->pNex
12cd0 74 2c 20 6e 2b 2b 29 7b 7d 0a 20 20 20 20 73 70  t, n++){}.    sp
12ce0 72 69 6e 74 66 28 7a 42 75 66 2c 22 5f 25 64 22  rintf(zBuf,"_%d"
12cf0 2c 6e 29 3b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d  ,n);.    zName =
12d00 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53   0;.    sqlite3S
12d10 65 74 53 74 72 69 6e 67 28 26 7a 4e 61 6d 65 2c  etString(&zName,
12d20 20 22 73 71 6c 69 74 65 5f 61 75 74 6f 69 6e 64   "sqlite_autoind
12d30 65 78 5f 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  ex_", pTab->zNam
12d40 65 2c 20 7a 42 75 66 2c 20 28 63 68 61 72 2a 29  e, zBuf, (char*)
12d50 30 29 3b 0a 20 20 20 20 69 66 28 20 7a 4e 61 6d  0);.    if( zNam
12d60 65 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78 69 74  e==0 ) goto exit
12d70 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
12d80 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 66   }..  /* Check f
12d90 6f 72 20 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e  or authorization
12da0 20 74 6f 20 63 72 65 61 74 65 20 61 6e 20 69 6e   to create an in
12db0 64 65 78 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65  dex..  */.#ifnde
12dc0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
12dd0 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 7b 0a  THORIZATION.  {.
12de0 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
12df0 7a 44 62 20 3d 20 70 44 62 2d 3e 7a 4e 61 6d 65  zDb = pDb->zName
12e00 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
12e10 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73  3AuthCheck(pPars
12e20 65 2c 20 53 51 4c 49 54 45 5f 49 4e 53 45 52 54  e, SQLITE_INSERT
12e30 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69  , SCHEMA_TABLE(i
12e40 44 62 29 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a  Db), 0, zDb) ){.
12e50 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f        goto exit_
12e60 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
12e70 20 20 7d 0a 20 20 20 20 69 20 3d 20 53 51 4c 49    }.    i = SQLI
12e80 54 45 5f 43 52 45 41 54 45 5f 49 4e 44 45 58 3b  TE_CREATE_INDEX;
12e90 0a 20 20 20 20 69 66 28 20 21 4f 4d 49 54 5f 54  .    if( !OMIT_T
12ea0 45 4d 50 44 42 20 26 26 20 69 44 62 3d 3d 31 20  EMPDB && iDb==1 
12eb0 29 20 69 20 3d 20 53 51 4c 49 54 45 5f 43 52 45  ) i = SQLITE_CRE
12ec0 41 54 45 5f 54 45 4d 50 5f 49 4e 44 45 58 3b 0a  ATE_TEMP_INDEX;.
12ed0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 41      if( sqlite3A
12ee0 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c  uthCheck(pParse,
12ef0 20 69 2c 20 7a 4e 61 6d 65 2c 20 70 54 61 62 2d   i, zName, pTab-
12f00 3e 7a 4e 61 6d 65 2c 20 7a 44 62 29 20 29 7b 0a  >zName, zDb) ){.
12f10 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f        goto exit_
12f20 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
12f30 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a    }.  }.#endif..
12f40 20 20 2f 2a 20 49 66 20 70 4c 69 73 74 3d 3d 30    /* If pList==0
12f50 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 69 73 20  , it means this 
12f60 72 6f 75 74 69 6e 65 20 77 61 73 20 63 61 6c 6c  routine was call
12f70 65 64 20 74 6f 20 6d 61 6b 65 20 61 20 70 72 69  ed to make a pri
12f80 6d 61 72 79 0a 20 20 2a 2a 20 6b 65 79 20 6f 75  mary.  ** key ou
12f90 74 20 6f 66 20 74 68 65 20 6c 61 73 74 20 63 6f  t of the last co
12fa0 6c 75 6d 6e 20 61 64 64 65 64 20 74 6f 20 74 68  lumn added to th
12fb0 65 20 74 61 62 6c 65 20 75 6e 64 65 72 20 63 6f  e table under co
12fc0 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 20 20 2a 2a  nstruction..  **
12fd0 20 53 6f 20 63 72 65 61 74 65 20 61 20 66 61 6b   So create a fak
12fe0 65 20 6c 69 73 74 20 74 6f 20 73 69 6d 75 6c 61  e list to simula
12ff0 74 65 20 74 68 69 73 2e 0a 20 20 2a 2f 0a 20 20  te this..  */.  
13000 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a  if( pList==0 ){.
13010 20 20 20 20 6e 75 6c 6c 49 64 2e 7a 20 3d 20 28      nullId.z = (
13020 75 38 2a 29 70 54 61 62 2d 3e 61 43 6f 6c 5b 70  u8*)pTab->aCol[p
13030 54 61 62 2d 3e 6e 43 6f 6c 2d 31 5d 2e 7a 4e 61  Tab->nCol-1].zNa
13040 6d 65 3b 0a 20 20 20 20 6e 75 6c 6c 49 64 2e 6e  me;.    nullId.n
13050 20 3d 20 73 74 72 6c 65 6e 28 28 63 68 61 72 2a   = strlen((char*
13060 29 6e 75 6c 6c 49 64 2e 7a 29 3b 0a 20 20 20 20  )nullId.z);.    
13070 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45  pList = sqlite3E
13080 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 30 2c  xprListAppend(0,
13090 20 30 2c 20 26 6e 75 6c 6c 49 64 29 3b 0a 20 20   0, &nullId);.  
130a0 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29    if( pList==0 )
130b0 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
130c0 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 70 4c 69  e_index;.    pLi
130d0 73 74 2d 3e 61 5b 30 5d 2e 73 6f 72 74 4f 72 64  st->a[0].sortOrd
130e0 65 72 20 3d 20 73 6f 72 74 4f 72 64 65 72 3b 0a  er = sortOrder;.
130f0 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65    }..  /* Figure
13100 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20 62 79   out how many by
13110 74 65 73 20 6f 66 20 73 70 61 63 65 20 61 72 65  tes of space are
13120 20 72 65 71 75 69 72 65 64 20 74 6f 20 73 74 6f   required to sto
13130 72 65 20 65 78 70 6c 69 63 69 74 6c 79 0a 20 20  re explicitly.  
13140 2a 2a 20 73 70 65 63 69 66 69 65 64 20 63 6f 6c  ** specified col
13150 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20  lation sequence 
13160 6e 61 6d 65 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f  names..  */.  fo
13170 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e  r(i=0; i<pList->
13180 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
13190 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70   Expr *pExpr = p
131a0 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
131b0 3b 0a 20 20 20 20 69 66 28 20 70 45 78 70 72 20  ;.    if( pExpr 
131c0 29 7b 0a 20 20 20 20 20 20 6e 45 78 74 72 61 20  ){.      nExtra 
131d0 2b 3d 20 28 31 20 2b 20 73 74 72 6c 65 6e 28 70  += (1 + strlen(p
131e0 45 78 70 72 2d 3e 70 43 6f 6c 6c 2d 3e 7a 4e 61  Expr->pColl->zNa
131f0 6d 65 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  me));.    }.  }.
13200 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 41 6c 6c 6f  .  /* .  ** Allo
13210 63 61 74 65 20 74 68 65 20 69 6e 64 65 78 20 73  cate the index s
13220 74 72 75 63 74 75 72 65 2e 20 0a 20 20 2a 2f 0a  tructure. .  */.
13230 20 20 6e 4e 61 6d 65 20 3d 20 73 74 72 6c 65 6e    nName = strlen
13240 28 7a 4e 61 6d 65 29 3b 0a 20 20 6e 43 6f 6c 20  (zName);.  nCol 
13250 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a  = pList->nExpr;.
13260 20 20 70 49 6e 64 65 78 20 3d 20 73 71 6c 69 74    pIndex = sqlit
13270 65 4d 61 6c 6c 6f 63 28 20 0a 20 20 20 20 20 20  eMalloc( .      
13280 73 69 7a 65 6f 66 28 49 6e 64 65 78 29 20 2b 20  sizeof(Index) + 
13290 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
132a0 49 6e 64 65 78 20 73 74 72 75 63 74 75 72 65 20  Index structure 
132b0 20 2a 2f 0a 20 20 20 20 20 20 73 69 7a 65 6f 66   */.      sizeof
132c0 28 69 6e 74 29 2a 6e 43 6f 6c 20 2b 20 20 20 20  (int)*nCol +    
132d0 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 2e         /* Index.
132e0 61 69 43 6f 6c 75 6d 6e 20 20 20 2a 2f 0a 20 20  aiColumn   */.  
132f0 20 20 20 20 73 69 7a 65 6f 66 28 69 6e 74 29 2a      sizeof(int)*
13300 28 6e 43 6f 6c 2b 31 29 20 2b 20 20 20 20 20 20  (nCol+1) +      
13310 20 2f 2a 20 49 6e 64 65 78 2e 61 69 52 6f 77 45   /* Index.aiRowE
13320 73 74 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 69  st   */.      si
13330 7a 65 6f 66 28 63 68 61 72 20 2a 29 2a 6e 43 6f  zeof(char *)*nCo
13340 6c 20 2b 20 20 20 20 20 20 20 20 2f 2a 20 49 6e  l +        /* In
13350 64 65 78 2e 61 7a 43 6f 6c 6c 20 20 20 20 20 2a  dex.azColl     *
13360 2f 0a 20 20 20 20 20 20 73 69 7a 65 6f 66 28 75  /.      sizeof(u
13370 38 29 2a 6e 43 6f 6c 20 2b 20 20 20 20 20 20 20  8)*nCol +       
13380 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 2e 61 53       /* Index.aS
13390 6f 72 74 4f 72 64 65 72 20 2a 2f 0a 20 20 20 20  ortOrder */.    
133a0 20 20 6e 4e 61 6d 65 20 2b 20 31 20 2b 20 20 20    nName + 1 +   
133b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
133c0 2a 20 49 6e 64 65 78 2e 7a 4e 61 6d 65 20 20 20  * Index.zName   
133d0 20 20 20 2a 2f 0a 20 20 20 20 20 20 6e 45 78 74     */.      nExt
133e0 72 61 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ra              
133f0 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 6c           /* Coll
13400 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 6e  ation sequence n
13410 61 6d 65 73 20 2a 2f 0a 20 20 29 3b 0a 20 20 69  ames */.  );.  i
13420 66 28 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63  f( sqlite3Malloc
13430 46 61 69 6c 65 64 28 29 20 29 20 67 6f 74 6f 20  Failed() ) goto 
13440 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
13450 78 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 61 7a 43  x;.  pIndex->azC
13460 6f 6c 6c 20 3d 20 28 63 68 61 72 2a 2a 29 28 26  oll = (char**)(&
13470 70 49 6e 64 65 78 5b 31 5d 29 3b 0a 20 20 70 49  pIndex[1]);.  pI
13480 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 20 3d  ndex->aiColumn =
13490 20 28 69 6e 74 20 2a 29 28 26 70 49 6e 64 65 78   (int *)(&pIndex
134a0 2d 3e 61 7a 43 6f 6c 6c 5b 6e 43 6f 6c 5d 29 3b  ->azColl[nCol]);
134b0 0a 20 20 70 49 6e 64 65 78 2d 3e 61 69 52 6f 77  .  pIndex->aiRow
134c0 45 73 74 20 3d 20 28 75 6e 73 69 67 6e 65 64 20  Est = (unsigned 
134d0 2a 29 28 26 70 49 6e 64 65 78 2d 3e 61 69 43 6f  *)(&pIndex->aiCo
134e0 6c 75 6d 6e 5b 6e 43 6f 6c 5d 29 3b 0a 20 20 70  lumn[nCol]);.  p
134f0 49 6e 64 65 78 2d 3e 61 53 6f 72 74 4f 72 64 65  Index->aSortOrde
13500 72 20 3d 20 28 75 38 20 2a 29 28 26 70 49 6e 64  r = (u8 *)(&pInd
13510 65 78 2d 3e 61 69 52 6f 77 45 73 74 5b 6e 43 6f  ex->aiRowEst[nCo
13520 6c 2b 31 5d 29 3b 0a 20 20 70 49 6e 64 65 78 2d  l+1]);.  pIndex-
13530 3e 7a 4e 61 6d 65 20 3d 20 28 63 68 61 72 20 2a  >zName = (char *
13540 29 28 26 70 49 6e 64 65 78 2d 3e 61 53 6f 72 74  )(&pIndex->aSort
13550 4f 72 64 65 72 5b 6e 43 6f 6c 5d 29 3b 0a 20 20  Order[nCol]);.  
13560 7a 45 78 74 72 61 20 3d 20 28 63 68 61 72 20 2a  zExtra = (char *
13570 29 28 26 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65  )(&pIndex->zName
13580 5b 6e 4e 61 6d 65 2b 31 5d 29 3b 0a 20 20 73 74  [nName+1]);.  st
13590 72 63 70 79 28 70 49 6e 64 65 78 2d 3e 7a 4e 61  rcpy(pIndex->zNa
135a0 6d 65 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 70 49  me, zName);.  pI
135b0 6e 64 65 78 2d 3e 70 54 61 62 6c 65 20 3d 20 70  ndex->pTable = p
135c0 54 61 62 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 6e  Tab;.  pIndex->n
135d0 43 6f 6c 75 6d 6e 20 3d 20 70 4c 69 73 74 2d 3e  Column = pList->
135e0 6e 45 78 70 72 3b 0a 20 20 70 49 6e 64 65 78 2d  nExpr;.  pIndex-
135f0 3e 6f 6e 45 72 72 6f 72 20 3d 20 6f 6e 45 72 72  >onError = onErr
13600 6f 72 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 61 75  or;.  pIndex->au
13610 74 6f 49 6e 64 65 78 20 3d 20 70 4e 61 6d 65 3d  toIndex = pName=
13620 3d 30 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 70 53  =0;.  pIndex->pS
13630 63 68 65 6d 61 20 3d 20 64 62 2d 3e 61 44 62 5b  chema = db->aDb[
13640 69 44 62 5d 2e 70 53 63 68 65 6d 61 3b 0a 0a 20  iDb].pSchema;.. 
13650 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65   /* Check to see
13660 20 69 66 20 77 65 20 73 68 6f 75 6c 64 20 68 6f   if we should ho
13670 6e 6f 72 20 44 45 53 43 20 72 65 71 75 65 73 74  nor DESC request
13680 73 20 6f 6e 20 69 6e 64 65 78 20 63 6f 6c 75 6d  s on index colum
13690 6e 73 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 44  ns.  */.  if( pD
136a0 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 66 69 6c 65  b->pSchema->file
136b0 5f 66 6f 72 6d 61 74 3e 3d 34 20 29 7b 0a 20 20  _format>=4 ){.  
136c0 20 20 73 6f 72 74 4f 72 64 65 72 4d 61 73 6b 20    sortOrderMask 
136d0 3d 20 2d 31 3b 20 20 20 2f 2a 20 48 6f 6e 6f 72  = -1;   /* Honor
136e0 20 44 45 53 43 20 2a 2f 0a 20 20 7d 65 6c 73 65   DESC */.  }else
136f0 7b 0a 20 20 20 20 73 6f 72 74 4f 72 64 65 72 4d  {.    sortOrderM
13700 61 73 6b 20 3d 20 30 3b 20 20 20 20 2f 2a 20 49  ask = 0;    /* I
13710 67 6e 6f 72 65 20 44 45 53 43 20 2a 2f 0a 20 20  gnore DESC */.  
13720 7d 0a 0a 20 20 2f 2a 20 53 63 61 6e 20 74 68 65  }..  /* Scan the
13730 20 6e 61 6d 65 73 20 6f 66 20 74 68 65 20 63 6f   names of the co
13740 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 74 61 62  lumns of the tab
13750 6c 65 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64  le to be indexed
13760 20 61 6e 64 0a 20 20 2a 2a 20 6c 6f 61 64 20 74   and.  ** load t
13770 68 65 20 63 6f 6c 75 6d 6e 20 69 6e 64 69 63 65  he column indice
13780 73 20 69 6e 74 6f 20 74 68 65 20 49 6e 64 65 78  s into the Index
13790 20 73 74 72 75 63 74 75 72 65 2e 20 20 52 65 70   structure.  Rep
137a0 6f 72 74 20 61 6e 20 65 72 72 6f 72 0a 20 20 2a  ort an error.  *
137b0 2a 20 69 66 20 61 6e 79 20 63 6f 6c 75 6d 6e 20  * if any column 
137c0 69 73 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 20 20  is not found..  
137d0 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 4c  */.  for(i=0, pL
137e0 69 73 74 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61  istItem=pList->a
137f0 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72  ; i<pList->nExpr
13800 3b 20 69 2b 2b 2c 20 70 4c 69 73 74 49 74 65 6d  ; i++, pListItem
13810 2b 2b 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63  ++){.    const c
13820 68 61 72 20 2a 7a 43 6f 6c 4e 61 6d 65 20 3d 20  har *zColName = 
13830 70 4c 69 73 74 49 74 65 6d 2d 3e 7a 4e 61 6d 65  pListItem->zName
13840 3b 0a 20 20 20 20 43 6f 6c 75 6d 6e 20 2a 70 54  ;.    Column *pT
13850 61 62 43 6f 6c 3b 0a 20 20 20 20 69 6e 74 20 72  abCol;.    int r
13860 65 71 75 65 73 74 65 64 53 6f 72 74 4f 72 64 65  equestedSortOrde
13870 72 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 43 6f  r;.    char *zCo
13880 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ll;             
13890 20 20 20 20 20 20 2f 2a 20 43 6f 6c 6c 61 74 69        /* Collati
138a0 6f 6e 20 73 65 71 75 65 6e 63 65 20 6e 61 6d 65  on sequence name
138b0 20 2a 2f 0a 0a 20 20 20 20 66 6f 72 28 6a 3d 30   */..    for(j=0
138c0 2c 20 70 54 61 62 43 6f 6c 3d 70 54 61 62 2d 3e  , pTabCol=pTab->
138d0 61 43 6f 6c 3b 20 6a 3c 70 54 61 62 2d 3e 6e 43  aCol; j<pTab->nC
138e0 6f 6c 3b 20 6a 2b 2b 2c 20 70 54 61 62 43 6f 6c  ol; j++, pTabCol
138f0 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73  ++){.      if( s
13900 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 43  qlite3StrICmp(zC
13910 6f 6c 4e 61 6d 65 2c 20 70 54 61 62 43 6f 6c 2d  olName, pTabCol-
13920 3e 7a 4e 61 6d 65 29 3d 3d 30 20 29 20 62 72 65  >zName)==0 ) bre
13930 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ak;.    }.    if
13940 28 20 6a 3e 3d 70 54 61 62 2d 3e 6e 43 6f 6c 20  ( j>=pTab->nCol 
13950 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
13960 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
13970 20 22 74 61 62 6c 65 20 25 73 20 68 61 73 20 6e   "table %s has n
13980 6f 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 64 20 25  o column named %
13990 73 22 2c 0a 20 20 20 20 20 20 20 20 70 54 61 62  s",.        pTab
139a0 2d 3e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 4e 61 6d  ->zName, zColNam
139b0 65 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65  e);.      goto e
139c0 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
139d0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 54  ;.    }.    /* T
139e0 4f 44 4f 3a 20 20 41 64 64 20 61 20 74 65 73 74  ODO:  Add a test
139f0 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68   to make sure th
13a00 61 74 20 74 68 65 20 73 61 6d 65 20 63 6f 6c 75  at the same colu
13a10 6d 6e 20 69 73 20 6e 6f 74 20 6e 61 6d 65 64 0a  mn is not named.
13a20 20 20 20 20 2a 2a 20 6d 6f 72 65 20 74 68 61 6e      ** more than
13a30 20 6f 6e 63 65 20 77 69 74 68 69 6e 20 74 68 65   once within the
13a40 20 73 61 6d 65 20 69 6e 64 65 78 2e 20 20 4f 6e   same index.  On
13a50 6c 79 20 74 68 65 20 66 69 72 73 74 20 69 6e 73  ly the first ins
13a60 74 61 6e 63 65 20 6f 66 0a 20 20 20 20 2a 2a 20  tance of.    ** 
13a70 74 68 65 20 63 6f 6c 75 6d 6e 20 77 69 6c 6c 20  the column will 
13a80 65 76 65 72 20 62 65 20 75 73 65 64 20 62 79 20  ever be used by 
13a90 74 68 65 20 6f 70 74 69 6d 69 7a 65 72 2e 20 20  the optimizer.  
13aa0 4e 6f 74 65 20 74 68 61 74 20 75 73 69 6e 67 20  Note that using 
13ab0 74 68 65 0a 20 20 20 20 2a 2a 20 73 61 6d 65 20  the.    ** same 
13ac0 63 6f 6c 75 6d 6e 20 6d 6f 72 65 20 74 68 61 6e  column more than
13ad0 20 6f 6e 63 65 20 63 61 6e 6e 6f 74 20 62 65 20   once cannot be 
13ae0 61 6e 20 65 72 72 6f 72 20 62 65 63 61 75 73 65  an error because
13af0 20 74 68 61 74 20 77 6f 75 6c 64 20 0a 20 20 20   that would .   
13b00 20 2a 2a 20 62 72 65 61 6b 20 62 61 63 6b 77 61   ** break backwa
13b10 72 64 73 20 63 6f 6d 70 61 74 69 62 69 6c 69 74  rds compatibilit
13b20 79 20 2d 20 69 74 20 6e 65 65 64 73 20 74 6f 20  y - it needs to 
13b30 62 65 20 61 20 77 61 72 6e 69 6e 67 2e 0a 20 20  be a warning..  
13b40 20 20 2a 2f 0a 20 20 20 20 70 49 6e 64 65 78 2d    */.    pIndex-
13b50 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 20 3d 20 6a  >aiColumn[i] = j
13b60 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 49  ;.    if( pListI
13b70 74 65 6d 2d 3e 70 45 78 70 72 20 29 7b 0a 20 20  tem->pExpr ){.  
13b80 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 69 73      assert( pLis
13b90 74 49 74 65 6d 2d 3e 70 45 78 70 72 2d 3e 70 43  tItem->pExpr->pC
13ba0 6f 6c 6c 20 29 3b 0a 20 20 20 20 20 20 7a 43 6f  oll );.      zCo
13bb0 6c 6c 20 3d 20 7a 45 78 74 72 61 3b 0a 20 20 20  ll = zExtra;.   
13bc0 20 20 20 73 74 72 63 70 79 28 7a 45 78 74 72 61     strcpy(zExtra
13bd0 2c 20 70 4c 69 73 74 49 74 65 6d 2d 3e 70 45 78  , pListItem->pEx
13be0 70 72 2d 3e 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65  pr->pColl->zName
13bf0 29 3b 0a 20 20 20 20 20 20 7a 45 78 74 72 61 20  );.      zExtra 
13c00 2b 3d 20 28 73 74 72 6c 65 6e 28 7a 43 6f 6c 6c  += (strlen(zColl
13c10 29 20 2b 20 31 29 3b 0a 20 20 20 20 7d 65 6c 73  ) + 1);.    }els
13c20 65 7b 0a 20 20 20 20 20 20 7a 43 6f 6c 6c 20 3d  e{.      zColl =
13c30 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a   pTab->aCol[j].z
13c40 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 69 66 28 20  Coll;.      if( 
13c50 21 7a 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20  !zColl ){.      
13c60 20 20 7a 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44    zColl = db->pD
13c70 66 6c 74 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 3b 0a  fltColl->zName;.
13c80 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
13c90 20 20 69 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e    if( !db->init.
13ca0 62 75 73 79 20 26 26 20 21 73 71 6c 69 74 65 33  busy && !sqlite3
13cb0 4c 6f 63 61 74 65 43 6f 6c 6c 53 65 71 28 70 50  LocateCollSeq(pP
13cc0 61 72 73 65 2c 20 7a 43 6f 6c 6c 2c 20 2d 31 29  arse, zColl, -1)
13cd0 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65   ){.      goto e
13ce0 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
13cf0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 49 6e 64  ;.    }.    pInd
13d00 65 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 20 3d 20  ex->azColl[i] = 
13d10 7a 43 6f 6c 6c 3b 0a 20 20 20 20 72 65 71 75 65  zColl;.    reque
13d20 73 74 65 64 53 6f 72 74 4f 72 64 65 72 20 3d 20  stedSortOrder = 
13d30 70 4c 69 73 74 49 74 65 6d 2d 3e 73 6f 72 74 4f  pListItem->sortO
13d40 72 64 65 72 20 26 20 73 6f 72 74 4f 72 64 65 72  rder & sortOrder
13d50 4d 61 73 6b 3b 0a 20 20 20 20 70 49 6e 64 65 78  Mask;.    pIndex
13d60 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20  ->aSortOrder[i] 
13d70 3d 20 72 65 71 75 65 73 74 65 64 53 6f 72 74 4f  = requestedSortO
13d80 72 64 65 72 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  rder;.  }.  sqli
13d90 74 65 33 44 65 66 61 75 6c 74 52 6f 77 45 73 74  te3DefaultRowEst
13da0 28 70 49 6e 64 65 78 29 3b 0a 0a 20 20 69 66 28  (pIndex);..  if(
13db0 20 70 54 61 62 3d 3d 70 50 61 72 73 65 2d 3e 70   pTab==pParse->p
13dc0 4e 65 77 54 61 62 6c 65 20 29 7b 0a 20 20 20 20  NewTable ){.    
13dd0 2f 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  /* This routine 
13de0 68 61 73 20 62 65 65 6e 20 63 61 6c 6c 65 64 20  has been called 
13df0 74 6f 20 63 72 65 61 74 65 20 61 6e 20 61 75 74  to create an aut
13e00 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 61 73 20  omatic index as 
13e10 61 0a 20 20 20 20 2a 2a 20 72 65 73 75 6c 74 20  a.    ** result 
13e20 6f 66 20 61 20 50 52 49 4d 41 52 59 20 4b 45 59  of a PRIMARY KEY
13e30 20 6f 72 20 55 4e 49 51 55 45 20 63 6c 61 75 73   or UNIQUE claus
13e40 65 20 6f 6e 20 61 20 63 6f 6c 75 6d 6e 20 64 65  e on a column de
13e50 66 69 6e 69 74 69 6f 6e 2c 20 6f 72 0a 20 20 20  finition, or.   
13e60 20 2a 2a 20 61 20 50 52 49 4d 41 52 59 20 4b 45   ** a PRIMARY KE
13e70 59 20 6f 72 20 55 4e 49 51 55 45 20 63 6c 61 75  Y or UNIQUE clau
13e80 73 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65  se following the
13e90 20 63 6f 6c 75 6d 6e 20 64 65 66 69 6e 69 74 69   column definiti
13ea0 6f 6e 73 2e 0a 20 20 20 20 2a 2a 20 69 2e 65 2e  ons..    ** i.e.
13eb0 20 6f 6e 65 20 6f 66 3a 0a 20 20 20 20 2a 2a 0a   one of:.    **.
13ec0 20 20 20 20 2a 2a 20 43 52 45 41 54 45 20 54 41      ** CREATE TA
13ed0 42 4c 45 20 74 28 78 20 50 52 49 4d 41 52 59 20  BLE t(x PRIMARY 
13ee0 4b 45 59 2c 20 79 29 3b 0a 20 20 20 20 2a 2a 20  KEY, y);.    ** 
13ef0 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 28 78  CREATE TABLE t(x
13f00 2c 20 79 2c 20 55 4e 49 51 55 45 28 78 2c 20 79  , y, UNIQUE(x, y
13f10 29 29 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ));.    **.    *
13f20 2a 20 45 69 74 68 65 72 20 77 61 79 2c 20 63 68  * Either way, ch
13f30 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68  eck to see if th
13f40 65 20 74 61 62 6c 65 20 61 6c 72 65 61 64 79 20  e table already 
13f50 68 61 73 20 73 75 63 68 20 61 6e 20 69 6e 64 65  has such an inde
13f60 78 2e 20 49 66 0a 20 20 20 20 2a 2a 20 73 6f 2c  x. If.    ** so,
13f70 20 64 6f 6e 27 74 20 62 6f 74 68 65 72 20 63 72   don't bother cr
13f80 65 61 74 69 6e 67 20 74 68 69 73 20 6f 6e 65 2e  eating this one.
13f90 20 54 68 69 73 20 6f 6e 6c 79 20 61 70 70 6c 69   This only appli
13fa0 65 73 20 74 6f 0a 20 20 20 20 2a 2a 20 61 75 74  es to.    ** aut
13fb0 6f 6d 61 74 69 63 61 6c 6c 79 20 63 72 65 61 74  omatically creat
13fc0 65 64 20 69 6e 64 69 63 65 73 2e 20 55 73 65 72  ed indices. User
13fd0 73 20 63 61 6e 20 64 6f 20 61 73 20 74 68 65 79  s can do as they
13fe0 20 77 69 73 68 20 77 69 74 68 0a 20 20 20 20 2a   wish with.    *
13ff0 2a 20 65 78 70 6c 69 63 69 74 20 69 6e 64 69 63  * explicit indic
14000 65 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 49  es..    */.    I
14010 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 20 20  ndex *pIdx;.    
14020 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70  for(pIdx=pTab->p
14030 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64  Index; pIdx; pId
14040 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a  x=pIdx->pNext){.
14050 20 20 20 20 20 20 69 6e 74 20 6b 3b 0a 20 20 20        int k;.   
14060 20 20 20 61 73 73 65 72 74 28 20 70 49 64 78 2d     assert( pIdx-
14070 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e  >onError!=OE_Non
14080 65 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  e );.      asser
14090 74 28 20 70 49 64 78 2d 3e 61 75 74 6f 49 6e 64  t( pIdx->autoInd
140a0 65 78 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  ex );.      asse
140b0 72 74 28 20 70 49 6e 64 65 78 2d 3e 6f 6e 45 72  rt( pIndex->onEr
140c0 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 20 29 3b 0a  ror!=OE_None );.
140d0 0a 20 20 20 20 20 20 69 66 28 20 70 49 64 78 2d  .      if( pIdx-
140e0 3e 6e 43 6f 6c 75 6d 6e 21 3d 70 49 6e 64 65 78  >nColumn!=pIndex
140f0 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 20 63 6f 6e 74  ->nColumn ) cont
14100 69 6e 75 65 3b 0a 20 20 20 20 20 20 66 6f 72 28  inue;.      for(
14110 6b 3d 30 3b 20 6b 3c 70 49 64 78 2d 3e 6e 43 6f  k=0; k<pIdx->nCo
14120 6c 75 6d 6e 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20  lumn; k++){.    
14130 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
14140 7a 31 20 3d 20 70 49 64 78 2d 3e 61 7a 43 6f 6c  z1 = pIdx->azCol
14150 6c 5b 6b 5d 3b 0a 20 20 20 20 20 20 20 20 63 6f  l[k];.        co
14160 6e 73 74 20 63 68 61 72 20 2a 7a 32 20 3d 20 70  nst char *z2 = p
14170 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c 5b 6b 5d  Index->azColl[k]
14180 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 49  ;.        if( pI
14190 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6b 5d 21  dx->aiColumn[k]!
141a0 3d 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d  =pIndex->aiColum
141b0 6e 5b 6b 5d 20 29 20 62 72 65 61 6b 3b 0a 20 20  n[k] ) break;.  
141c0 20 20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e        if( pIdx->
141d0 61 53 6f 72 74 4f 72 64 65 72 5b 6b 5d 21 3d 70  aSortOrder[k]!=p
141e0 49 6e 64 65 78 2d 3e 61 53 6f 72 74 4f 72 64 65  Index->aSortOrde
141f0 72 5b 6b 5d 20 29 20 62 72 65 61 6b 3b 0a 20 20  r[k] ) break;.  
14200 20 20 20 20 20 20 69 66 28 20 7a 31 21 3d 7a 32        if( z1!=z2
14210 20 26 26 20 73 71 6c 69 74 65 33 53 74 72 49 43   && sqlite3StrIC
14220 6d 70 28 7a 31 2c 20 7a 32 29 20 29 20 62 72 65  mp(z1, z2) ) bre
14230 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
14240 20 20 69 66 28 20 6b 3d 3d 70 49 64 78 2d 3e 6e    if( k==pIdx->n
14250 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20  Column ){.      
14260 20 20 69 66 28 20 70 49 64 78 2d 3e 6f 6e 45 72    if( pIdx->onEr
14270 72 6f 72 21 3d 70 49 6e 64 65 78 2d 3e 6f 6e 45  ror!=pIndex->onE
14280 72 72 6f 72 20 29 7b 0a 20 20 20 20 20 20 20 20  rror ){.        
14290 20 20 2f 2a 20 54 68 69 73 20 63 6f 6e 73 74 72    /* This constr
142a0 61 69 6e 74 20 63 72 65 61 74 65 73 20 74 68 65  aint creates the
142b0 20 73 61 6d 65 20 69 6e 64 65 78 20 61 73 20 61   same index as a
142c0 20 70 72 65 76 69 6f 75 73 0a 20 20 20 20 20 20   previous.      
142d0 20 20 20 20 2a 2a 20 63 6f 6e 73 74 72 61 69 6e      ** constrain
142e0 74 20 73 70 65 63 69 66 69 65 64 20 73 6f 6d 65  t specified some
142f0 77 68 65 72 65 20 69 6e 20 74 68 65 20 43 52 45  where in the CRE
14300 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d  ATE TABLE statem
14310 65 6e 74 2e 0a 20 20 20 20 20 20 20 20 20 20 2a  ent..          *
14320 2a 20 48 6f 77 65 76 65 72 20 74 68 65 20 4f 4e  * However the ON
14330 20 43 4f 4e 46 4c 49 43 54 20 63 6c 61 75 73 65   CONFLICT clause
14340 73 20 61 72 65 20 64 69 66 66 65 72 65 6e 74 2e  s are different.
14350 20 49 66 20 62 6f 74 68 20 74 68 69 73 20 0a 20   If both this . 
14360 20 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e 73           ** cons
14370 74 72 61 69 6e 74 20 61 6e 64 20 74 68 65 20 70  traint and the p
14380 72 65 76 69 6f 75 73 20 65 71 75 69 76 61 6c 65  revious equivale
14390 6e 74 20 63 6f 6e 73 74 72 61 69 6e 74 20 68 61  nt constraint ha
143a0 76 65 20 65 78 70 6c 69 63 69 74 0a 20 20 20 20  ve explicit.    
143b0 20 20 20 20 20 20 2a 2a 20 4f 4e 20 43 4f 4e 46        ** ON CONF
143c0 4c 49 43 54 20 63 6c 61 75 73 65 73 20 74 68 69  LICT clauses thi
143d0 73 20 69 73 20 61 6e 20 65 72 72 6f 72 2e 20 4f  s is an error. O
143e0 74 68 65 72 77 69 73 65 2c 20 75 73 65 20 74 68  therwise, use th
143f0 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 65  e.          ** e
14400 78 70 6c 69 63 69 74 6c 79 20 73 70 65 63 69 66  xplicitly specif
14410 69 65 64 20 62 65 68 61 76 69 6f 75 72 20 66 6f  ied behaviour fo
14420 72 20 74 68 65 20 69 6e 64 65 78 2e 0a 20 20 20  r the index..   
14430 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
14440 20 20 20 20 69 66 28 20 21 28 70 49 64 78 2d 3e      if( !(pIdx->
14450 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 44 65 66 61  onError==OE_Defa
14460 75 6c 74 20 7c 7c 20 70 49 6e 64 65 78 2d 3e 6f  ult || pIndex->o
14470 6e 45 72 72 6f 72 3d 3d 4f 45 5f 44 65 66 61 75  nError==OE_Defau
14480 6c 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  lt) ){.         
14490 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
144a0 73 67 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20  sg(pParse, .    
144b0 20 20 20 20 20 20 20 20 20 20 20 20 22 63 6f 6e              "con
144c0 66 6c 69 63 74 69 6e 67 20 4f 4e 20 43 4f 4e 46  flicting ON CONF
144d0 4c 49 43 54 20 63 6c 61 75 73 65 73 20 73 70 65  LICT clauses spe
144e0 63 69 66 69 65 64 22 2c 20 30 29 3b 0a 20 20 20  cified", 0);.   
144f0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
14500 20 20 20 69 66 28 20 70 49 64 78 2d 3e 6f 6e 45     if( pIdx->onE
14510 72 72 6f 72 3d 3d 4f 45 5f 44 65 66 61 75 6c 74  rror==OE_Default
14520 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
14530 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 20 3d 20  pIdx->onError = 
14540 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 3b  pIndex->onError;
14550 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
14560 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 67       }.        g
14570 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
14580 69 6e 64 65 78 3b 0a 20 20 20 20 20 20 7d 0a 20  index;.      }. 
14590 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c     }.  }..  /* L
145a0 69 6e 6b 20 74 68 65 20 6e 65 77 20 49 6e 64 65  ink the new Inde
145b0 78 20 73 74 72 75 63 74 75 72 65 20 74 6f 20 69  x structure to i
145c0 74 73 20 74 61 62 6c 65 20 61 6e 64 20 74 6f 20  ts table and to 
145d0 74 68 65 20 6f 74 68 65 72 0a 20 20 2a 2a 20 69  the other.  ** i
145e0 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
145f0 65 20 73 74 72 75 63 74 75 72 65 73 2e 20 0a 20  e structures. . 
14600 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 69 6e   */.  if( db->in
14610 69 74 2e 62 75 73 79 20 29 7b 0a 20 20 20 20 49  it.busy ){.    I
14620 6e 64 65 78 20 2a 70 3b 0a 20 20 20 20 70 20 3d  ndex *p;.    p =
14630 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65   sqlite3HashInse
14640 72 74 28 26 70 49 6e 64 65 78 2d 3e 70 53 63 68  rt(&pIndex->pSch
14650 65 6d 61 2d 3e 69 64 78 48 61 73 68 2c 20 0a 20  ema->idxHash, . 
14660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14670 20 20 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e          pIndex->
14680 7a 4e 61 6d 65 2c 20 73 74 72 6c 65 6e 28 70 49  zName, strlen(pI
14690 6e 64 65 78 2d 3e 7a 4e 61 6d 65 29 2b 31 2c 20  ndex->zName)+1, 
146a0 70 49 6e 64 65 78 29 3b 0a 20 20 20 20 69 66 28  pIndex);.    if(
146b0 20 70 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65   p ){.      asse
146c0 72 74 28 20 70 3d 3d 70 49 6e 64 65 78 20 29 3b  rt( p==pIndex );
146d0 20 20 2f 2a 20 4d 61 6c 6c 6f 63 20 6d 75 73 74    /* Malloc must
146e0 20 68 61 76 65 20 66 61 69 6c 65 64 20 2a 2f 0a   have failed */.
146f0 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f        goto exit_
14700 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
14710 20 20 7d 0a 20 20 20 20 64 62 2d 3e 66 6c 61 67    }.    db->flag
14720 73 20 7c 3d 20 53 51 4c 49 54 45 5f 49 6e 74 65  s |= SQLITE_Inte
14730 72 6e 43 68 61 6e 67 65 73 3b 0a 20 20 20 20 69  rnChanges;.    i
14740 66 28 20 70 54 62 6c 4e 61 6d 65 21 3d 30 20 29  f( pTblName!=0 )
14750 7b 0a 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e  {.      pIndex->
14760 74 6e 75 6d 20 3d 20 64 62 2d 3e 69 6e 69 74 2e  tnum = db->init.
14770 6e 65 77 54 6e 75 6d 3b 0a 20 20 20 20 7d 0a 20  newTnum;.    }. 
14780 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20   }..  /* If the 
14790 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 69 73  db->init.busy is
147a0 20 30 20 74 68 65 6e 20 63 72 65 61 74 65 20 74   0 then create t
147b0 68 65 20 69 6e 64 65 78 20 6f 6e 20 64 69 73 6b  he index on disk
147c0 2e 20 20 54 68 69 73 0a 20 20 2a 2a 20 69 6e 76  .  This.  ** inv
147d0 6f 6c 76 65 73 20 77 72 69 74 69 6e 67 20 74 68  olves writing th
147e0 65 20 69 6e 64 65 78 20 69 6e 74 6f 20 74 68 65  e index into the
147f0 20 6d 61 73 74 65 72 20 74 61 62 6c 65 20 61 6e   master table an
14800 64 20 66 69 6c 6c 69 6e 67 20 69 6e 20 74 68 65  d filling in the
14810 0a 20 20 2a 2a 20 69 6e 64 65 78 20 77 69 74 68  .  ** index with
14820 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 61 62   the current tab
14830 6c 65 20 63 6f 6e 74 65 6e 74 73 2e 0a 20 20 2a  le contents..  *
14840 2a 0a 20 20 2a 2a 20 54 68 65 20 64 62 2d 3e 69  *.  ** The db->i
14850 6e 69 74 2e 62 75 73 79 20 69 73 20 30 20 77 68  nit.busy is 0 wh
14860 65 6e 20 74 68 65 20 75 73 65 72 20 66 69 72 73  en the user firs
14870 74 20 65 6e 74 65 72 73 20 61 20 43 52 45 41 54  t enters a CREAT
14880 45 20 49 4e 44 45 58 20 0a 20 20 2a 2a 20 63 6f  E INDEX .  ** co
14890 6d 6d 61 6e 64 2e 20 20 64 62 2d 3e 69 6e 69 74  mmand.  db->init
148a0 2e 62 75 73 79 20 69 73 20 31 20 77 68 65 6e 20  .busy is 1 when 
148b0 61 20 64 61 74 61 62 61 73 65 20 69 73 20 6f 70  a database is op
148c0 65 6e 65 64 20 61 6e 64 20 0a 20 20 2a 2a 20 43  ened and .  ** C
148d0 52 45 41 54 45 20 49 4e 44 45 58 20 73 74 61 74  REATE INDEX stat
148e0 65 6d 65 6e 74 73 20 61 72 65 20 72 65 61 64 20  ements are read 
148f0 6f 75 74 20 6f 66 20 74 68 65 20 6d 61 73 74 65  out of the maste
14900 72 20 74 61 62 6c 65 2e 20 20 49 6e 0a 20 20 2a  r table.  In.  *
14910 2a 20 74 68 65 20 6c 61 74 74 65 72 20 63 61 73  * the latter cas
14920 65 20 74 68 65 20 69 6e 64 65 78 20 61 6c 72 65  e the index alre
14930 61 64 79 20 65 78 69 73 74 73 20 6f 6e 20 64 69  ady exists on di
14940 73 6b 2c 20 77 68 69 63 68 20 69 73 20 77 68 79  sk, which is why
14950 0a 20 20 2a 2a 20 77 65 20 64 6f 6e 27 74 20 77  .  ** we don't w
14960 61 6e 74 20 74 6f 20 72 65 63 72 65 61 74 65 20  ant to recreate 
14970 69 74 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66  it..  **.  ** If
14980 20 70 54 62 6c 4e 61 6d 65 3d 3d 30 20 69 74 20   pTblName==0 it 
14990 6d 65 61 6e 73 20 74 68 69 73 20 69 6e 64 65 78  means this index
149a0 20 69 73 20 67 65 6e 65 72 61 74 65 64 20 61 73   is generated as
149b0 20 61 20 70 72 69 6d 61 72 79 20 6b 65 79 0a 20   a primary key. 
149c0 20 2a 2a 20 6f 72 20 55 4e 49 51 55 45 20 63 6f   ** or UNIQUE co
149d0 6e 73 74 72 61 69 6e 74 20 6f 66 20 61 20 43 52  nstraint of a CR
149e0 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65  EATE TABLE state
149f0 6d 65 6e 74 2e 20 20 53 69 6e 63 65 20 74 68 65  ment.  Since the
14a00 20 74 61 62 6c 65 0a 20 20 2a 2a 20 68 61 73 20   table.  ** has 
14a10 6a 75 73 74 20 62 65 65 6e 20 63 72 65 61 74 65  just been create
14a20 64 2c 20 69 74 20 63 6f 6e 74 61 69 6e 73 20 6e  d, it contains n
14a30 6f 20 64 61 74 61 20 61 6e 64 20 74 68 65 20 69  o data and the i
14a40 6e 64 65 78 20 69 6e 69 74 69 61 6c 69 7a 61 74  ndex initializat
14a50 69 6f 6e 0a 20 20 2a 2a 20 73 74 65 70 20 63 61  ion.  ** step ca
14a60 6e 20 62 65 20 73 6b 69 70 70 65 64 2e 0a 20 20  n be skipped..  
14a70 2a 2f 0a 20 20 65 6c 73 65 20 69 66 28 20 64 62  */.  else if( db
14a80 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d 30 20 29  ->init.busy==0 )
14a90 7b 0a 20 20 20 20 56 64 62 65 20 2a 76 3b 0a 20  {.    Vdbe *v;. 
14aa0 20 20 20 63 68 61 72 20 2a 7a 53 74 6d 74 3b 0a     char *zStmt;.
14ab0 20 20 20 20 69 6e 74 20 69 4d 65 6d 20 3d 20 70      int iMem = p
14ac0 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b 0a 0a  Parse->nMem++;..
14ad0 20 20 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47      v = sqlite3G
14ae0 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
14af0 20 20 20 20 69 66 28 20 76 3d 3d 30 20 29 20 67      if( v==0 ) g
14b00 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
14b10 69 6e 64 65 78 3b 0a 0a 0a 20 20 20 20 2f 2a 20  index;...    /* 
14b20 43 72 65 61 74 65 20 74 68 65 20 72 6f 6f 74 70  Create the rootp
14b30 61 67 65 20 66 6f 72 20 74 68 65 20 69 6e 64 65  age for the inde
14b40 78 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c  x.    */.    sql
14b50 69 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70  ite3BeginWriteOp
14b60 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20  eration(pParse, 
14b70 31 2c 20 69 44 62 29 3b 0a 20 20 20 20 73 71 6c  1, iDb);.    sql
14b80 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
14b90 20 4f 50 5f 43 72 65 61 74 65 49 6e 64 65 78 2c   OP_CreateIndex,
14ba0 20 69 44 62 2c 20 30 29 3b 0a 20 20 20 20 73 71   iDb, 0);.    sq
14bb0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
14bc0 2c 20 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c 20 69  , OP_MemStore, i
14bd0 4d 65 6d 2c 20 30 29 3b 0a 0a 20 20 20 20 2f 2a  Mem, 0);..    /*
14be0 20 47 61 74 68 65 72 20 74 68 65 20 63 6f 6d 70   Gather the comp
14bf0 6c 65 74 65 20 74 65 78 74 20 6f 66 20 74 68 65  lete text of the
14c00 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 73 74   CREATE INDEX st
14c10 61 74 65 6d 65 6e 74 20 69 6e 74 6f 0a 20 20 20  atement into.   
14c20 20 2a 2a 20 74 68 65 20 7a 53 74 6d 74 20 76 61   ** the zStmt va
14c30 72 69 61 62 6c 65 0a 20 20 20 20 2a 2f 0a 20 20  riable.    */.  
14c40 20 20 69 66 28 20 70 53 74 61 72 74 20 26 26 20    if( pStart && 
14c50 70 45 6e 64 20 29 7b 0a 20 20 20 20 20 20 2f 2a  pEnd ){.      /*
14c60 20 41 20 6e 61 6d 65 64 20 69 6e 64 65 78 20 77   A named index w
14c70 69 74 68 20 61 6e 20 65 78 70 6c 69 63 69 74 20  ith an explicit 
14c80 43 52 45 41 54 45 20 49 4e 44 45 58 20 73 74 61  CREATE INDEX sta
14c90 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 20 20  tement */.      
14ca0 7a 53 74 6d 74 20 3d 20 73 71 6c 69 74 65 33 4d  zStmt = sqlite3M
14cb0 50 72 69 6e 74 66 28 22 43 52 45 41 54 45 25 73  Printf("CREATE%s
14cc0 20 49 4e 44 45 58 20 25 2e 2a 73 22 2c 0a 20 20   INDEX %.*s",.  
14cd0 20 20 20 20 20 20 6f 6e 45 72 72 6f 72 3d 3d 4f        onError==O
14ce0 45 5f 4e 6f 6e 65 20 3f 20 22 22 20 3a 20 22 20  E_None ? "" : " 
14cf0 55 4e 49 51 55 45 22 2c 0a 20 20 20 20 20 20 20  UNIQUE",.       
14d00 20 70 45 6e 64 2d 3e 7a 20 2d 20 70 4e 61 6d 65   pEnd->z - pName
14d10 2d 3e 7a 20 2b 20 31 2c 0a 20 20 20 20 20 20 20  ->z + 1,.       
14d20 20 70 4e 61 6d 65 2d 3e 7a 29 3b 0a 20 20 20 20   pName->z);.    
14d30 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20  }else{.      /* 
14d40 41 6e 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64  An automatic ind
14d50 65 78 20 63 72 65 61 74 65 64 20 62 79 20 61 20  ex created by a 
14d60 50 52 49 4d 41 52 59 20 4b 45 59 20 6f 72 20 55  PRIMARY KEY or U
14d70 4e 49 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74  NIQUE constraint
14d80 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 7a 53 74   */.      /* zSt
14d90 6d 74 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69  mt = sqlite3MPri
14da0 6e 74 66 28 22 22 29 3b 20 2a 2f 0a 20 20 20 20  ntf(""); */.    
14db0 20 20 7a 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20    zStmt = 0;.   
14dc0 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 64 64 20 61   }..    /* Add a
14dd0 6e 20 65 6e 74 72 79 20 69 6e 20 73 71 6c 69 74  n entry in sqlit
14de0 65 5f 6d 61 73 74 65 72 20 66 6f 72 20 74 68 69  e_master for thi
14df0 73 20 69 6e 64 65 78 0a 20 20 20 20 2a 2f 0a 20  s index.    */. 
14e00 20 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64     sqlite3Nested
14e10 50 61 72 73 65 28 70 50 61 72 73 65 2c 20 0a 20  Parse(pParse, . 
14e20 20 20 20 20 20 20 20 22 49 4e 53 45 52 54 20 49         "INSERT I
14e30 4e 54 4f 20 25 51 2e 25 73 20 56 41 4c 55 45 53  NTO %Q.%s VALUES
14e40 28 27 69 6e 64 65 78 27 2c 25 51 2c 25 51 2c 23  ('index',%Q,%Q,#
14e50 30 2c 25 51 29 3b 22 2c 0a 20 20 20 20 20 20 20  0,%Q);",.       
14e60 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e   db->aDb[iDb].zN
14e70 61 6d 65 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c  ame, SCHEMA_TABL
14e80 45 28 69 44 62 29 2c 0a 20 20 20 20 20 20 20 20  E(iDb),.        
14e90 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 0a 20  pIndex->zName,. 
14ea0 20 20 20 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61         pTab->zNa
14eb0 6d 65 2c 0a 20 20 20 20 20 20 20 20 7a 53 74 6d  me,.        zStm
14ec0 74 0a 20 20 20 20 29 3b 0a 20 20 20 20 73 71 6c  t.    );.    sql
14ed0 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
14ee0 20 4f 50 5f 50 6f 70 2c 20 31 2c 20 30 29 3b 0a   OP_Pop, 1, 0);.
14ef0 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a      sqliteFree(z
14f00 53 74 6d 74 29 3b 0a 0a 20 20 20 20 2f 2a 20 46  Stmt);..    /* F
14f10 69 6c 6c 20 74 68 65 20 69 6e 64 65 78 20 77 69  ill the index wi
14f20 74 68 20 64 61 74 61 20 61 6e 64 20 72 65 70 61  th data and repa
14f30 72 73 65 20 74 68 65 20 73 63 68 65 6d 61 2e 20  rse the schema. 
14f40 43 6f 64 65 20 61 6e 20 4f 50 5f 45 78 70 69 72  Code an OP_Expir
14f50 65 0a 20 20 20 20 2a 2a 20 74 6f 20 69 6e 76 61  e.    ** to inva
14f60 6c 69 64 61 74 65 20 61 6c 6c 20 70 72 65 2d 63  lidate all pre-c
14f70 6f 6d 70 69 6c 65 64 20 73 74 61 74 65 6d 65 6e  ompiled statemen
14f80 74 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ts..    */.    i
14f90 66 28 20 70 54 62 6c 4e 61 6d 65 20 29 7b 0a 20  f( pTblName ){. 
14fa0 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 66 69       sqlite3Refi
14fb0 6c 6c 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20  llIndex(pParse, 
14fc0 70 49 6e 64 65 78 2c 20 69 4d 65 6d 29 3b 0a 20  pIndex, iMem);. 
14fd0 20 20 20 20 20 73 71 6c 69 74 65 33 43 68 61 6e       sqlite3Chan
14fe0 67 65 43 6f 6f 6b 69 65 28 64 62 2c 20 76 2c 20  geCookie(db, v, 
14ff0 69 44 62 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  iDb);.      sqli
15000 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50  te3VdbeOp3(v, OP
15010 5f 50 61 72 73 65 53 63 68 65 6d 61 2c 20 69 44  _ParseSchema, iD
15020 62 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 73  b, 0,.         s
15030 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 22 6e  qlite3MPrintf("n
15040 61 6d 65 3d 27 25 71 27 22 2c 20 70 49 6e 64 65  ame='%q'", pInde
15050 78 2d 3e 7a 4e 61 6d 65 29 2c 20 50 33 5f 44 59  x->zName), P3_DY
15060 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20 20 73 71  NAMIC);.      sq
15070 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
15080 2c 20 4f 50 5f 45 78 70 69 72 65 2c 20 30 2c 20  , OP_Expire, 0, 
15090 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  0);.    }.  }.. 
150a0 20 2f 2a 20 57 68 65 6e 20 61 64 64 69 6e 67 20   /* When adding 
150b0 61 6e 20 69 6e 64 65 78 20 74 6f 20 74 68 65 20  an index to the 
150c0 6c 69 73 74 20 6f 66 20 69 6e 64 69 63 65 73 20  list of indices 
150d0 66 6f 72 20 61 20 74 61 62 6c 65 2c 20 6d 61 6b  for a table, mak
150e0 65 0a 20 20 2a 2a 20 73 75 72 65 20 61 6c 6c 20  e.  ** sure all 
150f0 69 6e 64 69 63 65 73 20 6c 61 62 65 6c 65 64 20  indices labeled 
15100 4f 45 5f 52 65 70 6c 61 63 65 20 63 6f 6d 65 20  OE_Replace come 
15110 61 66 74 65 72 20 61 6c 6c 20 74 68 6f 73 65 20  after all those 
15120 6c 61 62 65 6c 65 64 0a 20 20 2a 2a 20 4f 45 5f  labeled.  ** OE_
15130 49 67 6e 6f 72 65 2e 20 20 54 68 69 73 20 69 73  Ignore.  This is
15140 20 6e 65 63 65 73 73 61 72 79 20 66 6f 72 20 74   necessary for t
15150 68 65 20 63 6f 72 72 65 63 74 20 6f 70 65 72 61  he correct opera
15160 74 69 6f 6e 20 6f 66 20 55 50 44 41 54 45 0a 20  tion of UPDATE. 
15170 20 2a 2a 20 61 6e 64 20 49 4e 53 45 52 54 2e 0a   ** and INSERT..
15180 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 69    */.  if( db->i
15190 6e 69 74 2e 62 75 73 79 20 7c 7c 20 70 54 62 6c  nit.busy || pTbl
151a0 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 69  Name==0 ){.    i
151b0 66 28 20 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 52  f( onError!=OE_R
151c0 65 70 6c 61 63 65 20 7c 7c 20 70 54 61 62 2d 3e  eplace || pTab->
151d0 70 49 6e 64 65 78 3d 3d 30 0a 20 20 20 20 20 20  pIndex==0.      
151e0 20 20 20 7c 7c 20 70 54 61 62 2d 3e 70 49 6e 64     || pTab->pInd
151f0 65 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f  ex->onError==OE_
15200 52 65 70 6c 61 63 65 29 7b 0a 20 20 20 20 20 20  Replace){.      
15210 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74 20 3d 20  pIndex->pNext = 
15220 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 0a 20 20  pTab->pIndex;.  
15230 20 20 20 20 70 54 61 62 2d 3e 70 49 6e 64 65 78      pTab->pIndex
15240 20 3d 20 70 49 6e 64 65 78 3b 0a 20 20 20 20 7d   = pIndex;.    }
15250 65 6c 73 65 7b 0a 20 20 20 20 20 20 49 6e 64 65  else{.      Inde
15260 78 20 2a 70 4f 74 68 65 72 20 3d 20 70 54 61 62  x *pOther = pTab
15270 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20 20 20 20  ->pIndex;.      
15280 77 68 69 6c 65 28 20 70 4f 74 68 65 72 2d 3e 70  while( pOther->p
15290 4e 65 78 74 20 26 26 20 70 4f 74 68 65 72 2d 3e  Next && pOther->
152a0 70 4e 65 78 74 2d 3e 6f 6e 45 72 72 6f 72 21 3d  pNext->onError!=
152b0 4f 45 5f 52 65 70 6c 61 63 65 20 29 7b 0a 20 20  OE_Replace ){.  
152c0 20 20 20 20 20 20 70 4f 74 68 65 72 20 3d 20 70        pOther = p
152d0 4f 74 68 65 72 2d 3e 70 4e 65 78 74 3b 0a 20 20  Other->pNext;.  
152e0 20 20 20 20 7d 0a 20 20 20 20 20 20 70 49 6e 64      }.      pInd
152f0 65 78 2d 3e 70 4e 65 78 74 20 3d 20 70 4f 74 68  ex->pNext = pOth
15300 65 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20  er->pNext;.     
15310 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74 20 3d   pOther->pNext =
15320 20 70 49 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20   pIndex;.    }. 
15330 20 20 20 70 49 6e 64 65 78 20 3d 20 30 3b 0a 20     pIndex = 0;. 
15340 20 7d 0a 0a 20 20 2f 2a 20 43 6c 65 61 6e 20 75   }..  /* Clean u
15350 70 20 62 65 66 6f 72 65 20 65 78 69 74 69 6e 67  p before exiting
15360 20 2a 2f 0a 65 78 69 74 5f 63 72 65 61 74 65 5f   */.exit_create_
15370 69 6e 64 65 78 3a 0a 20 20 69 66 28 20 70 49 6e  index:.  if( pIn
15380 64 65 78 20 29 7b 0a 20 20 20 20 66 72 65 65 49  dex ){.    freeI
15390 6e 64 65 78 28 70 49 6e 64 65 78 29 3b 0a 20 20  ndex(pIndex);.  
153a0 7d 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c  }.  sqlite3ExprL
153b0 69 73 74 44 65 6c 65 74 65 28 70 4c 69 73 74 29  istDelete(pList)
153c0 3b 0a 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69  ;.  sqlite3SrcLi
153d0 73 74 44 65 6c 65 74 65 28 70 54 62 6c 4e 61 6d  stDelete(pTblNam
153e0 65 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65  e);.  sqliteFree
153f0 28 7a 4e 61 6d 65 29 3b 0a 20 20 72 65 74 75 72  (zName);.  retur
15400 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  n;.}../*.** Gene
15410 72 61 74 65 20 63 6f 64 65 20 74 6f 20 6d 61 6b  rate code to mak
15420 65 20 73 75 72 65 20 74 68 65 20 66 69 6c 65 20  e sure the file 
15430 66 6f 72 6d 61 74 20 6e 75 6d 62 65 72 20 69 73  format number is
15440 20 61 74 20 6c 65 61 73 74 20 6d 69 6e 46 6f 72   at least minFor
15450 6d 61 74 2e 0a 2a 2a 20 54 68 65 20 67 65 6e 65  mat..** The gene
15460 72 61 74 65 64 20 63 6f 64 65 20 77 69 6c 6c 20  rated code will 
15470 69 6e 63 72 65 61 73 65 20 74 68 65 20 66 69 6c  increase the fil
15480 65 20 66 6f 72 6d 61 74 20 6e 75 6d 62 65 72 20  e format number 
15490 69 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2f  if necessary..*/
154a0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 4d 69 6e  .void sqlite3Min
154b0 69 6d 75 6d 46 69 6c 65 46 6f 72 6d 61 74 28 50  imumFileFormat(P
154c0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e  arse *pParse, in
154d0 74 20 69 44 62 2c 20 69 6e 74 20 6d 69 6e 46 6f  t iDb, int minFo
154e0 72 6d 61 74 29 7b 0a 20 20 56 64 62 65 20 2a 76  rmat){.  Vdbe *v
154f0 3b 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47  ;.  v = sqlite3G
15500 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
15510 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20 73    if( v ){.    s
15520 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
15530 76 2c 20 4f 50 5f 52 65 61 64 43 6f 6f 6b 69 65  v, OP_ReadCookie
15540 2c 20 69 44 62 2c 20 31 29 3b 0a 20 20 20 20 73  , iDb, 1);.    s
15550 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
15560 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 6d  v, OP_Integer, m
15570 69 6e 46 6f 72 6d 61 74 2c 20 30 29 3b 0a 20 20  inFormat, 0);.  
15580 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
15590 4f 70 28 76 2c 20 4f 50 5f 47 65 2c 20 30 2c 20  Op(v, OP_Ge, 0, 
155a0 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
155b0 6e 74 41 64 64 72 28 76 29 2b 33 29 3b 0a 20 20  ntAddr(v)+3);.  
155c0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
155d0 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  Op(v, OP_Integer
155e0 2c 20 6d 69 6e 46 6f 72 6d 61 74 2c 20 30 29 3b  , minFormat, 0);
155f0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
15600 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 65 74 43  AddOp(v, OP_SetC
15610 6f 6f 6b 69 65 2c 20 69 44 62 2c 20 31 29 3b 0a  ookie, iDb, 1);.
15620 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6c    }.}../*.** Fil
15630 6c 20 74 68 65 20 49 6e 64 65 78 2e 61 69 52 6f  l the Index.aiRo
15640 77 45 73 74 5b 5d 20 61 72 72 61 79 20 77 69 74  wEst[] array wit
15650 68 20 64 65 66 61 75 6c 74 20 69 6e 66 6f 72 6d  h default inform
15660 61 74 69 6f 6e 20 2d 20 69 6e 66 6f 72 6d 61 74  ation - informat
15670 69 6f 6e 0a 2a 2a 20 74 6f 20 62 65 20 75 73 65  ion.** to be use
15680 64 20 77 68 65 6e 20 77 65 20 68 61 76 65 20 6e  d when we have n
15690 6f 74 20 72 75 6e 20 74 68 65 20 41 4e 41 4c 59  ot run the ANALY
156a0 5a 45 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a  ZE command..**.*
156b0 2a 20 61 69 52 6f 77 45 73 74 5b 30 5d 20 69 73  * aiRowEst[0] is
156c0 20 73 75 70 70 6f 73 65 20 74 6f 20 63 6f 6e 74   suppose to cont
156d0 61 69 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ain the number o
156e0 66 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 74 68  f elements in th
156f0 65 20 69 6e 64 65 78 2e 0a 2a 2a 20 53 69 6e 63  e index..** Sinc
15700 65 20 77 65 20 64 6f 20 6e 6f 74 20 6b 6e 6f 77  e we do not know
15710 2c 20 67 75 65 73 73 20 31 20 6d 69 6c 6c 69 6f  , guess 1 millio
15720 6e 2e 20 20 61 69 52 6f 77 45 73 74 5b 31 5d 20  n.  aiRowEst[1] 
15730 69 73 20 61 6e 20 65 73 74 69 6d 61 74 65 20 6f  is an estimate o
15740 66 20 74 68 65 0a 2a 2a 20 6e 75 6d 62 65 72 20  f the.** number 
15750 6f 66 20 72 6f 77 73 20 69 6e 20 74 68 65 20 74  of rows in the t
15760 61 62 6c 65 20 74 68 61 74 20 6d 61 74 63 68 20  able that match 
15770 61 6e 79 20 70 61 72 74 69 63 75 6c 61 72 20 76  any particular v
15780 61 6c 75 65 20 6f 66 20 74 68 65 0a 2a 2a 20 66  alue of the.** f
15790 69 72 73 74 20 63 6f 6c 75 6d 6e 20 6f 66 20 74  irst column of t
157a0 68 65 20 69 6e 64 65 78 2e 20 20 61 69 52 6f 77  he index.  aiRow
157b0 45 73 74 5b 32 5d 20 69 73 20 61 6e 20 65 73 74  Est[2] is an est
157c0 69 6d 61 74 65 20 6f 66 20 74 68 65 20 6e 75 6d  imate of the num
157d0 62 65 72 0a 2a 2a 20 6f 66 20 72 6f 77 73 20 74  ber.** of rows t
157e0 68 61 74 20 6d 61 74 63 68 20 61 6e 79 20 70 61  hat match any pa
157f0 72 74 69 63 75 6c 61 72 20 63 6f 6d 62 69 6e 69  rticular combini
15800 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 66 69 72  ation of the fir
15810 73 74 20 32 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20  st 2 columns.** 
15820 6f 66 20 74 68 65 20 69 6e 64 65 78 2e 20 20 41  of the index.  A
15830 6e 64 20 73 6f 20 66 6f 72 74 68 2e 20 20 49 74  nd so forth.  It
15840 20 6d 75 73 74 20 61 6c 77 61 79 73 20 62 65 20   must always be 
15850 74 68 65 20 63 61 73 65 20 74 68 61 74 0a 2a 0a  the case that.*.
15860 2a 2a 20 20 20 20 20 20 20 20 20 20 20 61 69 52  **           aiR
15870 6f 77 45 73 74 5b 4e 5d 3c 3d 61 69 52 6f 77 45  owEst[N]<=aiRowE
15880 73 74 5b 4e 2d 31 5d 0a 2a 2a 20 20 20 20 20 20  st[N-1].**      
15890 20 20 20 20 20 61 69 52 6f 77 45 73 74 5b 4e 5d       aiRowEst[N]
158a0 3e 3d 31 0a 2a 2a 0a 2a 2a 20 41 70 61 72 74 20  >=1.**.** Apart 
158b0 66 72 6f 6d 20 74 68 61 74 2c 20 77 65 20 68 61  from that, we ha
158c0 76 65 20 6c 69 74 74 6c 65 20 74 6f 20 67 6f 20  ve little to go 
158d0 6f 6e 20 62 65 73 69 64 65 73 20 69 6e 74 75 69  on besides intui
158e0 74 69 6f 6e 20 61 73 20 74 6f 0a 2a 2a 20 68 6f  tion as to.** ho
158f0 77 20 61 69 52 6f 77 45 73 74 5b 5d 20 73 68 6f  w aiRowEst[] sho
15900 75 6c 64 20 62 65 20 69 6e 69 74 69 61 6c 69 7a  uld be initializ
15910 65 64 2e 20 20 54 68 65 20 6e 75 6d 62 65 72 73  ed.  The numbers
15920 20 67 65 6e 65 72 61 74 65 64 20 68 65 72 65 0a   generated here.
15930 2a 2a 20 61 72 65 20 62 61 73 65 64 20 6f 6e 20  ** are based on 
15940 74 79 70 69 63 61 6c 20 76 61 6c 75 65 73 20 66  typical values f
15950 6f 75 6e 64 20 69 6e 20 61 63 74 75 61 6c 20 69  ound in actual i
15960 6e 64 69 63 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20  ndices..*/.void 
15970 73 71 6c 69 74 65 33 44 65 66 61 75 6c 74 52 6f  sqlite3DefaultRo
15980 77 45 73 74 28 49 6e 64 65 78 20 2a 70 49 64 78  wEst(Index *pIdx
15990 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 2a 61  ){.  unsigned *a
159a0 20 3d 20 70 49 64 78 2d 3e 61 69 52 6f 77 45 73   = pIdx->aiRowEs
159b0 74 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 61 73  t;.  int i;.  as
159c0 73 65 72 74 28 20 61 21 3d 30 20 29 3b 0a 20 20  sert( a!=0 );.  
159d0 61 5b 30 5d 20 3d 20 31 30 30 30 30 30 30 3b 0a  a[0] = 1000000;.
159e0 20 20 66 6f 72 28 69 3d 70 49 64 78 2d 3e 6e 43    for(i=pIdx->nC
159f0 6f 6c 75 6d 6e 3b 20 69 3e 3d 35 3b 20 69 2d 2d  olumn; i>=5; i--
15a00 29 7b 0a 20 20 20 20 61 5b 69 5d 20 3d 20 35 3b  ){.    a[i] = 5;
15a10 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28 20 69 3e  .  }.  while( i>
15a20 3d 31 20 29 7b 0a 20 20 20 20 61 5b 69 5d 20 3d  =1 ){.    a[i] =
15a30 20 31 31 20 2d 20 69 3b 0a 20 20 20 20 69 2d 2d   11 - i;.    i--
15a40 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 49 64 78  ;.  }.  if( pIdx
15a50 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f  ->onError!=OE_No
15a60 6e 65 20 29 7b 0a 20 20 20 20 61 5b 70 49 64 78  ne ){.    a[pIdx
15a70 2d 3e 6e 43 6f 6c 75 6d 6e 5d 20 3d 20 31 3b 0a  ->nColumn] = 1;.
15a80 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69    }.}../*.** Thi
15a90 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 64  s routine will d
15aa0 72 6f 70 20 61 6e 20 65 78 69 73 74 69 6e 67 20  rop an existing 
15ab0 6e 61 6d 65 64 20 69 6e 64 65 78 2e 20 20 54 68  named index.  Th
15ac0 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 6d  is routine.** im
15ad0 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 44 52 4f  plements the DRO
15ae0 50 20 49 4e 44 45 58 20 73 74 61 74 65 6d 65 6e  P INDEX statemen
15af0 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  t..*/.void sqlit
15b00 65 33 44 72 6f 70 49 6e 64 65 78 28 50 61 72 73  e3DropIndex(Pars
15b10 65 20 2a 70 50 61 72 73 65 2c 20 53 72 63 4c 69  e *pParse, SrcLi
15b20 73 74 20 2a 70 4e 61 6d 65 2c 20 69 6e 74 20 69  st *pName, int i
15b30 66 45 78 69 73 74 73 29 7b 0a 20 20 49 6e 64 65  fExists){.  Inde
15b40 78 20 2a 70 49 6e 64 65 78 3b 0a 20 20 56 64 62  x *pIndex;.  Vdb
15b50 65 20 2a 76 3b 0a 20 20 73 71 6c 69 74 65 33 20  e *v;.  sqlite3 
15b60 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
15b70 3b 0a 20 20 69 6e 74 20 69 44 62 3b 0a 0a 20 20  ;.  int iDb;..  
15b80 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  if( pParse->nErr
15b90 20 7c 7c 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f   || sqlite3Mallo
15ba0 63 46 61 69 6c 65 64 28 29 20 29 7b 0a 20 20 20  cFailed() ){.   
15bb0 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f   goto exit_drop_
15bc0 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 61 73 73  index;.  }.  ass
15bd0 65 72 74 28 20 70 4e 61 6d 65 2d 3e 6e 53 72 63  ert( pName->nSrc
15be0 3d 3d 31 20 29 3b 0a 20 20 69 66 28 20 53 51 4c  ==1 );.  if( SQL
15bf0 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52  ITE_OK!=sqlite3R
15c00 65 61 64 53 63 68 65 6d 61 28 70 50 61 72 73 65  eadSchema(pParse
15c10 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78  ) ){.    goto ex
15c20 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20  it_drop_index;. 
15c30 20 7d 0a 20 20 70 49 6e 64 65 78 20 3d 20 73 71   }.  pIndex = sq
15c40 6c 69 74 65 33 46 69 6e 64 49 6e 64 65 78 28 64  lite3FindIndex(d
15c50 62 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a  b, pName->a[0].z
15c60 4e 61 6d 65 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30  Name, pName->a[0
15c70 5d 2e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20  ].zDatabase);.  
15c80 69 66 28 20 70 49 6e 64 65 78 3d 3d 30 20 29 7b  if( pIndex==0 ){
15c90 0a 20 20 20 20 69 66 28 20 21 69 66 45 78 69 73  .    if( !ifExis
15ca0 74 73 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ts ){.      sqli
15cb0 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
15cc0 73 65 2c 20 22 6e 6f 20 73 75 63 68 20 69 6e 64  se, "no such ind
15cd0 65 78 3a 20 25 53 22 2c 20 70 4e 61 6d 65 2c 20  ex: %S", pName, 
15ce0 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50  0);.    }.    pP
15cf0 61 72 73 65 2d 3e 63 68 65 63 6b 53 63 68 65 6d  arse->checkSchem
15d00 61 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f 20  a = 1;.    goto 
15d10 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b  exit_drop_index;
15d20 0a 20 20 7d 0a 20 20 69 66 28 20 70 49 6e 64 65  .  }.  if( pInde
15d30 78 2d 3e 61 75 74 6f 49 6e 64 65 78 20 29 7b 0a  x->autoIndex ){.
15d40 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
15d50 4d 73 67 28 70 50 61 72 73 65 2c 20 22 69 6e 64  Msg(pParse, "ind
15d60 65 78 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ex associated wi
15d70 74 68 20 55 4e 49 51 55 45 20 22 0a 20 20 20 20  th UNIQUE ".    
15d80 20 20 22 6f 72 20 50 52 49 4d 41 52 59 20 4b 45    "or PRIMARY KE
15d90 59 20 63 6f 6e 73 74 72 61 69 6e 74 20 63 61 6e  Y constraint can
15da0 6e 6f 74 20 62 65 20 64 72 6f 70 70 65 64 22 2c  not be dropped",
15db0 20 30 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78   0);.    goto ex
15dc0 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20  it_drop_index;. 
15dd0 20 7d 0a 20 20 69 44 62 20 3d 20 73 71 6c 69 74   }.  iDb = sqlit
15de0 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28  e3SchemaToIndex(
15df0 64 62 2c 20 70 49 6e 64 65 78 2d 3e 70 53 63 68  db, pIndex->pSch
15e00 65 6d 61 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  ema);.#ifndef SQ
15e10 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52  LITE_OMIT_AUTHOR
15e20 49 5a 41 54 49 4f 4e 0a 20 20 7b 0a 20 20 20 20  IZATION.  {.    
15e30 69 6e 74 20 63 6f 64 65 20 3d 20 53 51 4c 49 54  int code = SQLIT
15e40 45 5f 44 52 4f 50 5f 49 4e 44 45 58 3b 0a 20 20  E_DROP_INDEX;.  
15e50 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20    Table *pTab = 
15e60 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 3b 0a  pIndex->pTable;.
15e70 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
15e80 7a 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44  zDb = db->aDb[iD
15e90 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 63 6f  b].zName;.    co
15ea0 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62 20 3d  nst char *zTab =
15eb0 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 44   SCHEMA_TABLE(iD
15ec0 62 29 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69  b);.    if( sqli
15ed0 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61  te3AuthCheck(pPa
15ee0 72 73 65 2c 20 53 51 4c 49 54 45 5f 44 45 4c 45  rse, SQLITE_DELE
15ef0 54 45 2c 20 7a 54 61 62 2c 20 30 2c 20 7a 44 62  TE, zTab, 0, zDb
15f00 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  ) ){.      goto 
15f10 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b  exit_drop_index;
15f20 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21  .    }.    if( !
15f30 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26 26 20 69  OMIT_TEMPDB && i
15f40 44 62 20 29 20 63 6f 64 65 20 3d 20 53 51 4c 49  Db ) code = SQLI
15f50 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 49 4e 44  TE_DROP_TEMP_IND
15f60 45 58 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69  EX;.    if( sqli
15f70 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61  te3AuthCheck(pPa
15f80 72 73 65 2c 20 63 6f 64 65 2c 20 70 49 6e 64 65  rse, code, pInde
15f90 78 2d 3e 7a 4e 61 6d 65 2c 20 70 54 61 62 2d 3e  x->zName, pTab->
15fa0 7a 4e 61 6d 65 2c 20 7a 44 62 29 20 29 7b 0a 20  zName, zDb) ){. 
15fb0 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64       goto exit_d
15fc0 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d  rop_index;.    }
15fd0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  .  }.#endif..  /
15fe0 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
15ff0 74 6f 20 72 65 6d 6f 76 65 20 74 68 65 20 69 6e  to remove the in
16000 64 65 78 20 61 6e 64 20 66 72 6f 6d 20 74 68 65  dex and from the
16010 20 6d 61 73 74 65 72 20 74 61 62 6c 65 20 2a 2f   master table */
16020 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65  .  v = sqlite3Ge
16030 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
16040 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20 73 71   if( v ){.    sq
16050 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72 73 65  lite3NestedParse
16060 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20  (pParse,.       
16070 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 25 51 2e  "DELETE FROM %Q.
16080 25 73 20 57 48 45 52 45 20 6e 61 6d 65 3d 25 51  %s WHERE name=%Q
16090 22 2c 0a 20 20 20 20 20 20 20 64 62 2d 3e 61 44  ",.       db->aD
160a0 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 2c 20 53 43  b[iDb].zName, SC
160b0 48 45 4d 41 5f 54 41 42 4c 45 28 69 44 62 29 2c  HEMA_TABLE(iDb),
160c0 0a 20 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e  .       pIndex->
160d0 7a 4e 61 6d 65 0a 20 20 20 20 29 3b 0a 20 20 20  zName.    );.   
160e0 20 73 71 6c 69 74 65 33 43 68 61 6e 67 65 43 6f   sqlite3ChangeCo
160f0 6f 6b 69 65 28 64 62 2c 20 76 2c 20 69 44 62 29  okie(db, v, iDb)
16100 3b 0a 20 20 20 20 64 65 73 74 72 6f 79 52 6f 6f  ;.    destroyRoo
16110 74 50 61 67 65 28 70 50 61 72 73 65 2c 20 70 49  tPage(pParse, pI
16120 6e 64 65 78 2d 3e 74 6e 75 6d 2c 20 69 44 62 29  ndex->tnum, iDb)
16130 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
16140 65 4f 70 33 28 76 2c 20 4f 50 5f 44 72 6f 70 49  eOp3(v, OP_DropI
16150 6e 64 65 78 2c 20 69 44 62 2c 20 30 2c 20 70 49  ndex, iDb, 0, pI
16160 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b  ndex->zName, 0);
16170 0a 20 20 7d 0a 0a 65 78 69 74 5f 64 72 6f 70 5f  .  }..exit_drop_
16180 69 6e 64 65 78 3a 0a 20 20 73 71 6c 69 74 65 33  index:.  sqlite3
16190 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28 70 4e  SrcListDelete(pN
161a0 61 6d 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70  ame);.}../*.** p
161b0 70 41 72 72 61 79 20 70 6f 69 6e 74 73 20 69 6e  pArray points in
161c0 74 6f 20 61 20 73 74 72 75 63 74 75 72 65 20 77  to a structure w
161d0 68 65 72 65 20 74 68 65 72 65 20 69 73 20 61 6e  here there is an
161e0 20 61 72 72 61 79 20 70 6f 69 6e 74 65 72 0a 2a   array pointer.*
161f0 2a 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20 74 77  * followed by tw
16200 6f 20 69 6e 74 65 67 65 72 73 2e 20 54 68 65 20  o integers. The 
16210 66 69 72 73 74 20 69 6e 74 65 67 65 72 20 69 73  first integer is
16220 20 74 68 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f   the.** number o
16230 66 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 74 68  f elements in th
16240 65 20 73 74 72 75 63 74 75 72 65 20 61 72 72 61  e structure arra
16250 79 2e 20 20 54 68 65 20 73 65 63 6f 6e 64 20 69  y.  The second i
16260 6e 74 65 67 65 72 0a 2a 2a 20 69 73 20 74 68 65  nteger.** is the
16270 20 6e 75 6d 62 65 72 20 6f 66 20 61 6c 6c 6f 63   number of alloc
16280 61 74 65 64 20 73 6c 6f 74 73 20 69 6e 20 74 68  ated slots in th
16290 65 20 61 72 72 61 79 2e 0a 2a 2a 0a 2a 2a 20 49  e array..**.** I
162a0 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 74  n other words, t
162b0 68 65 20 73 74 72 75 63 74 75 72 65 20 6c 6f 6f  he structure loo
162c0 6b 73 20 73 6f 6d 65 74 68 69 6e 67 20 6c 69 6b  ks something lik
162d0 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  e this:.**.**   
162e0 20 20 20 20 20 73 74 72 75 63 74 20 45 78 61 6d       struct Exam
162f0 70 6c 65 31 20 7b 0a 2a 2a 20 20 20 20 20 20 20  ple1 {.**       
16300 20 20 20 73 74 72 75 63 74 20 73 75 62 45 6c 65     struct subEle
16310 6d 20 2a 61 45 6e 74 72 79 3b 0a 2a 2a 20 20 20  m *aEntry;.**   
16320 20 20 20 20 20 20 20 69 6e 74 20 6e 45 6e 74 72         int nEntr
16330 79 3b 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 69  y;.**          i
16340 6e 74 20 6e 41 6c 6c 6f 63 3b 0a 2a 2a 20 20 20  nt nAlloc;.**   
16350 20 20 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 54 68 65       }.**.** The
16360 20 70 6e 45 6e 74 72 79 20 70 61 72 61 6d 65 74   pnEntry paramet
16370 65 72 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65  er points to the
16380 20 65 71 75 69 76 61 6c 65 6e 74 20 6f 66 20 45   equivalent of E
16390 78 61 6d 70 6c 65 31 2e 6e 45 6e 74 72 79 2e 0a  xample1.nEntry..
163a0 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
163b0 6e 65 20 61 6c 6c 6f 63 61 74 65 73 20 61 20 6e  ne allocates a n
163c0 65 77 20 73 6c 6f 74 20 69 6e 20 74 68 65 20 61  ew slot in the a
163d0 72 72 61 79 2c 20 7a 65 72 6f 73 20 69 74 20 6f  rray, zeros it o
163e0 75 74 2c 0a 2a 2a 20 61 6e 64 20 72 65 74 75 72  ut,.** and retur
163f0 6e 73 20 69 74 73 20 69 6e 64 65 78 2e 20 20 49  ns its index.  I
16400 66 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 20 61  f malloc fails a
16410 20 6e 65 67 61 74 69 76 65 20 6e 75 6d 62 65 72   negative number
16420 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a   is returned..**
16430 0a 2a 2a 20 73 7a 45 6e 74 72 79 20 69 73 20 74  .** szEntry is t
16440 68 65 20 73 69 7a 65 6f 66 20 6f 66 20 61 20 73  he sizeof of a s
16450 69 6e 67 6c 65 20 61 72 72 61 79 20 65 6e 74 72  ingle array entr
16460 79 2e 20 20 69 6e 69 74 53 69 7a 65 20 69 73 20  y.  initSize is 
16470 74 68 65 20 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f  the .** number o
16480 66 20 61 72 72 61 79 20 65 6e 74 72 69 65 73 20  f array entries 
16490 61 6c 6c 6f 63 61 74 65 64 20 6f 6e 20 74 68 65  allocated on the
164a0 20 69 6e 69 74 69 61 6c 20 61 6c 6c 6f 63 61 74   initial allocat
164b0 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ion..*/.int sqli
164c0 74 65 33 41 72 72 61 79 41 6c 6c 6f 63 61 74 65  te3ArrayAllocate
164d0 28 76 6f 69 64 20 2a 2a 70 70 41 72 72 61 79 2c  (void **ppArray,
164e0 20 69 6e 74 20 73 7a 45 6e 74 72 79 2c 20 69 6e   int szEntry, in
164f0 74 20 69 6e 69 74 53 69 7a 65 29 7b 0a 20 20 63  t initSize){.  c
16500 68 61 72 20 2a 70 3b 0a 20 20 69 6e 74 20 2a 61  har *p;.  int *a
16510 6e 20 3d 20 28 69 6e 74 2a 29 26 70 70 41 72 72  n = (int*)&ppArr
16520 61 79 5b 31 5d 3b 0a 20 20 69 66 28 20 61 6e 5b  ay[1];.  if( an[
16530 30 5d 3e 3d 61 6e 5b 31 5d 20 29 7b 0a 20 20 20  0]>=an[1] ){.   
16540 20 76 6f 69 64 20 2a 70 4e 65 77 3b 0a 20 20 20   void *pNew;.   
16550 20 69 6e 74 20 6e 65 77 53 69 7a 65 3b 0a 20 20   int newSize;.  
16560 20 20 6e 65 77 53 69 7a 65 20 3d 20 61 6e 5b 31    newSize = an[1
16570 5d 2a 32 20 2b 20 69 6e 69 74 53 69 7a 65 3b 0a  ]*2 + initSize;.
16580 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74      pNew = sqlit
16590 65 52 65 61 6c 6c 6f 63 28 2a 70 70 41 72 72 61  eRealloc(*ppArra
165a0 79 2c 20 6e 65 77 53 69 7a 65 2a 73 7a 45 6e 74  y, newSize*szEnt
165b0 72 79 29 3b 0a 20 20 20 20 69 66 28 20 70 4e 65  ry);.    if( pNe
165c0 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65  w==0 ){.      re
165d0 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a 20  turn -1;.    }. 
165e0 20 20 20 61 6e 5b 31 5d 20 3d 20 6e 65 77 53 69     an[1] = newSi
165f0 7a 65 3b 0a 20 20 20 20 2a 70 70 41 72 72 61 79  ze;.    *ppArray
16600 20 3d 20 70 4e 65 77 3b 0a 20 20 7d 0a 20 20 70   = pNew;.  }.  p
16610 20 3d 20 2a 70 70 41 72 72 61 79 3b 0a 20 20 6d   = *ppArray;.  m
16620 65 6d 73 65 74 28 26 70 5b 61 6e 5b 30 5d 2a 73  emset(&p[an[0]*s
16630 7a 45 6e 74 72 79 5d 2c 20 30 2c 20 73 7a 45 6e  zEntry], 0, szEn
16640 74 72 79 29 3b 0a 20 20 72 65 74 75 72 6e 20 61  try);.  return a
16650 6e 5b 30 5d 2b 2b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n[0]++;.}../*.**
16660 20 41 70 70 65 6e 64 20 61 20 6e 65 77 20 65 6c   Append a new el
16670 65 6d 65 6e 74 20 74 6f 20 74 68 65 20 67 69 76  ement to the giv
16680 65 6e 20 49 64 4c 69 73 74 2e 20 20 43 72 65 61  en IdList.  Crea
16690 74 65 20 61 20 6e 65 77 20 49 64 4c 69 73 74 20  te a new IdList 
166a0 69 66 0a 2a 2a 20 6e 65 65 64 20 62 65 2e 0a 2a  if.** need be..*
166b0 2a 0a 2a 2a 20 41 20 6e 65 77 20 49 64 4c 69 73  *.** A new IdLis
166c0 74 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20 6f  t is returned, o
166d0 72 20 4e 55 4c 4c 20 69 66 20 6d 61 6c 6c 6f 63  r NULL if malloc
166e0 28 29 20 66 61 69 6c 73 2e 0a 2a 2f 0a 49 64 4c  () fails..*/.IdL
166f0 69 73 74 20 2a 73 71 6c 69 74 65 33 49 64 4c 69  ist *sqlite3IdLi
16700 73 74 41 70 70 65 6e 64 28 49 64 4c 69 73 74 20  stAppend(IdList 
16710 2a 70 4c 69 73 74 2c 20 54 6f 6b 65 6e 20 2a 70  *pList, Token *p
16720 54 6f 6b 65 6e 29 7b 0a 20 20 69 6e 74 20 69 3b  Token){.  int i;
16730 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20  .  if( pList==0 
16740 29 7b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 73  ){.    pList = s
16750 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a  qliteMalloc( siz
16760 65 6f 66 28 49 64 4c 69 73 74 29 20 29 3b 0a 20  eof(IdList) );. 
16770 20 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20     if( pList==0 
16780 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20  ) return 0;.    
16790 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20 3d 20  pList->nAlloc = 
167a0 30 3b 0a 20 20 7d 0a 20 20 69 20 3d 20 73 71 6c  0;.  }.  i = sql
167b0 69 74 65 33 41 72 72 61 79 41 6c 6c 6f 63 61 74  ite3ArrayAllocat
167c0 65 28 28 76 6f 69 64 2a 2a 29 26 70 4c 69 73 74  e((void**)&pList
167d0 2d 3e 61 2c 20 73 69 7a 65 6f 66 28 70 4c 69 73  ->a, sizeof(pLis
167e0 74 2d 3e 61 5b 30 5d 29 2c 20 35 29 3b 0a 20 20  t->a[0]), 5);.  
167f0 69 66 28 20 69 3c 30 20 29 7b 0a 20 20 20 20 73  if( i<0 ){.    s
16800 71 6c 69 74 65 33 49 64 4c 69 73 74 44 65 6c 65  qlite3IdListDele
16810 74 65 28 70 4c 69 73 74 29 3b 0a 20 20 20 20 72  te(pList);.    r
16820 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70  eturn 0;.  }.  p
16830 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  List->a[i].zName
16840 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72   = sqlite3NameFr
16850 6f 6d 54 6f 6b 65 6e 28 70 54 6f 6b 65 6e 29 3b  omToken(pToken);
16860 0a 20 20 72 65 74 75 72 6e 20 70 4c 69 73 74 3b  .  return pList;
16870 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65  .}../*.** Delete
16880 20 61 6e 20 49 64 4c 69 73 74 2e 0a 2a 2f 0a 76   an IdList..*/.v
16890 6f 69 64 20 73 71 6c 69 74 65 33 49 64 4c 69 73  oid sqlite3IdLis
168a0 74 44 65 6c 65 74 65 28 49 64 4c 69 73 74 20 2a  tDelete(IdList *
168b0 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b  pList){.  int i;
168c0 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20  .  if( pList==0 
168d0 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28  ) return;.  for(
168e0 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 49  i=0; i<pList->nI
168f0 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c  d; i++){.    sql
16900 69 74 65 46 72 65 65 28 70 4c 69 73 74 2d 3e 61  iteFree(pList->a
16910 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a  [i].zName);.  }.
16920 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 4c 69    sqliteFree(pLi
16930 73 74 2d 3e 61 29 3b 0a 20 20 73 71 6c 69 74 65  st->a);.  sqlite
16940 46 72 65 65 28 70 4c 69 73 74 29 3b 0a 7d 0a 0a  Free(pList);.}..
16950 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
16960 20 69 6e 64 65 78 20 69 6e 20 70 4c 69 73 74 20   index in pList 
16970 6f 66 20 74 68 65 20 69 64 65 6e 74 69 66 69 65  of the identifie
16980 72 20 6e 61 6d 65 64 20 7a 49 64 2e 20 20 52 65  r named zId.  Re
16990 74 75 72 6e 20 2d 31 0a 2a 2a 20 69 66 20 6e 6f  turn -1.** if no
169a0 74 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 69 6e 74 20  t found..*/.int 
169b0 73 71 6c 69 74 65 33 49 64 4c 69 73 74 49 6e 64  sqlite3IdListInd
169c0 65 78 28 49 64 4c 69 73 74 20 2a 70 4c 69 73 74  ex(IdList *pList
169d0 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e  , const char *zN
169e0 61 6d 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  ame){.  int i;. 
169f0 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20   if( pList==0 ) 
16a00 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 66 6f 72  return -1;.  for
16a10 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e  (i=0; i<pList->n
16a20 49 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  Id; i++){.    if
16a30 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ( sqlite3StrICmp
16a40 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61  (pList->a[i].zNa
16a50 6d 65 2c 20 7a 4e 61 6d 65 29 3d 3d 30 20 29 20  me, zName)==0 ) 
16a60 72 65 74 75 72 6e 20 69 3b 0a 20 20 7d 0a 20 20  return i;.  }.  
16a70 72 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 2f 2a  return -1;.}../*
16a80 0a 2a 2a 20 41 70 70 65 6e 64 20 61 20 6e 65 77  .** Append a new
16a90 20 74 61 62 6c 65 20 6e 61 6d 65 20 74 6f 20 74   table name to t
16aa0 68 65 20 67 69 76 65 6e 20 53 72 63 4c 69 73 74  he given SrcList
16ab0 2e 20 20 43 72 65 61 74 65 20 61 20 6e 65 77 20  .  Create a new 
16ac0 53 72 63 4c 69 73 74 20 69 66 0a 2a 2a 20 6e 65  SrcList if.** ne
16ad0 65 64 20 62 65 2e 20 20 41 20 6e 65 77 20 65 6e  ed be.  A new en
16ae0 74 72 79 20 69 73 20 63 72 65 61 74 65 64 20 69  try is created i
16af0 6e 20 74 68 65 20 53 72 63 4c 69 73 74 20 65 76  n the SrcList ev
16b00 65 6e 20 69 66 20 70 54 6f 6b 65 6e 20 69 73 20  en if pToken is 
16b10 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 41 20 6e 65  NULL..**.** A ne
16b20 77 20 53 72 63 4c 69 73 74 20 69 73 20 72 65 74  w SrcList is ret
16b30 75 72 6e 65 64 2c 20 6f 72 20 4e 55 4c 4c 20 69  urned, or NULL i
16b40 66 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 73  f malloc() fails
16b50 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 44 61 74 61  ..**.** If pData
16b60 62 61 73 65 20 69 73 20 6e 6f 74 20 6e 75 6c 6c  base is not null
16b70 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20  , it means that 
16b80 74 68 65 20 74 61 62 6c 65 20 68 61 73 20 61 6e  the table has an
16b90 20 6f 70 74 69 6f 6e 61 6c 0a 2a 2a 20 64 61 74   optional.** dat
16ba0 61 62 61 73 65 20 6e 61 6d 65 20 70 72 65 66 69  abase name prefi
16bb0 78 2e 20 20 4c 69 6b 65 20 74 68 69 73 3a 20 20  x.  Like this:  
16bc0 22 64 61 74 61 62 61 73 65 2e 74 61 62 6c 65 22  "database.table"
16bd0 2e 20 20 54 68 65 20 70 44 61 74 61 62 61 73 65  .  The pDatabase
16be0 0a 2a 2a 20 70 6f 69 6e 74 73 20 74 6f 20 74 68  .** points to th
16bf0 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 61 6e 64  e table name and
16c00 20 74 68 65 20 70 54 61 62 6c 65 20 70 6f 69 6e   the pTable poin
16c10 74 73 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ts to the databa
16c20 73 65 20 6e 61 6d 65 2e 0a 2a 2a 20 54 68 65 20  se name..** The 
16c30 53 72 63 4c 69 73 74 2e 61 5b 5d 2e 7a 4e 61 6d  SrcList.a[].zNam
16c40 65 20 66 69 65 6c 64 20 69 73 20 66 69 6c 6c 65  e field is fille
16c50 64 20 77 69 74 68 20 74 68 65 20 74 61 62 6c 65  d with the table
16c60 20 6e 61 6d 65 20 77 68 69 63 68 20 6d 69 67 68   name which migh
16c70 74 0a 2a 2a 20 63 6f 6d 65 20 66 72 6f 6d 20 70  t.** come from p
16c80 54 61 62 6c 65 20 28 69 66 20 70 44 61 74 61 62  Table (if pDatab
16c90 61 73 65 20 69 73 20 4e 55 4c 4c 29 20 6f 72 20  ase is NULL) or 
16ca0 66 72 6f 6d 20 70 44 61 74 61 62 61 73 65 2e 20  from pDatabase. 
16cb0 20 0a 2a 2a 20 53 72 63 4c 69 73 74 2e 61 5b 5d   .** SrcList.a[]
16cc0 2e 7a 44 61 74 61 62 61 73 65 20 69 73 20 66 69  .zDatabase is fi
16cd0 6c 6c 65 64 20 77 69 74 68 20 74 68 65 20 64 61  lled with the da
16ce0 74 61 62 61 73 65 20 6e 61 6d 65 20 66 72 6f 6d  tabase name from
16cf0 20 70 54 61 62 6c 65 2c 0a 2a 2a 20 6f 72 20 77   pTable,.** or w
16d00 69 74 68 20 4e 55 4c 4c 20 69 66 20 6e 6f 20 64  ith NULL if no d
16d10 61 74 61 62 61 73 65 20 69 73 20 73 70 65 63 69  atabase is speci
16d20 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 6f  fied..**.** In o
16d30 74 68 65 72 20 77 6f 72 64 73 2c 20 69 66 20 63  ther words, if c
16d40 61 6c 6c 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a  all like this:.*
16d50 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 73 71 6c  *.**         sql
16d60 69 74 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e  ite3SrcListAppen
16d70 64 28 41 2c 42 2c 30 29 3b 0a 2a 2a 0a 2a 2a 20  d(A,B,0);.**.** 
16d80 54 68 65 6e 20 42 20 69 73 20 61 20 74 61 62 6c  Then B is a tabl
16d90 65 20 6e 61 6d 65 20 61 6e 64 20 74 68 65 20 64  e name and the d
16da0 61 74 61 62 61 73 65 20 6e 61 6d 65 20 69 73 20  atabase name is 
16db0 75 6e 73 70 65 63 69 66 69 65 64 2e 20 20 49 66  unspecified.  If
16dc0 20 63 61 6c 6c 65 64 0a 2a 2a 20 6c 69 6b 65 20   called.** like 
16dd0 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  this:.**.**     
16de0 20 20 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69      sqlite3SrcLi
16df0 73 74 41 70 70 65 6e 64 28 41 2c 42 2c 43 29 3b  stAppend(A,B,C);
16e00 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 43 20 69 73  .**.** Then C is
16e10 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20   the table name 
16e20 61 6e 64 20 42 20 69 73 20 74 68 65 20 64 61 74  and B is the dat
16e30 61 62 61 73 65 20 6e 61 6d 65 2e 0a 2a 2f 0a 53  abase name..*/.S
16e40 72 63 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 53  rcList *sqlite3S
16e50 72 63 4c 69 73 74 41 70 70 65 6e 64 28 53 72 63  rcListAppend(Src
16e60 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 54 6f 6b  List *pList, Tok
16e70 65 6e 20 2a 70 54 61 62 6c 65 2c 20 54 6f 6b 65  en *pTable, Toke
16e80 6e 20 2a 70 44 61 74 61 62 61 73 65 29 7b 0a 20  n *pDatabase){. 
16e90 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
16ea0 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69  item *pItem;.  i
16eb0 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20  f( pList==0 ){. 
16ec0 20 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74     pList = sqlit
16ed0 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28  eMalloc( sizeof(
16ee0 53 72 63 4c 69 73 74 29 20 29 3b 0a 20 20 20 20  SrcList) );.    
16ef0 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72  if( pList==0 ) r
16f00 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 70 4c 69  eturn 0;.    pLi
16f10 73 74 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 31 3b 0a  st->nAlloc = 1;.
16f20 20 20 7d 0a 20 20 69 66 28 20 70 4c 69 73 74 2d    }.  if( pList-
16f30 3e 6e 53 72 63 3e 3d 70 4c 69 73 74 2d 3e 6e 41  >nSrc>=pList->nA
16f40 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 53 72 63 4c  lloc ){.    SrcL
16f50 69 73 74 20 2a 70 4e 65 77 3b 0a 20 20 20 20 70  ist *pNew;.    p
16f60 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20 2a 3d 20  List->nAlloc *= 
16f70 32 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20 73 71  2;.    pNew = sq
16f80 6c 69 74 65 52 65 61 6c 6c 6f 63 28 70 4c 69 73  liteRealloc(pLis
16f90 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t,.             
16fa0 20 20 73 69 7a 65 6f 66 28 2a 70 4c 69 73 74 29    sizeof(*pList)
16fb0 20 2b 20 28 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f   + (pList->nAllo
16fc0 63 2d 31 29 2a 73 69 7a 65 6f 66 28 70 4c 69 73  c-1)*sizeof(pLis
16fd0 74 2d 3e 61 5b 30 5d 29 20 29 3b 0a 20 20 20 20  t->a[0]) );.    
16fe0 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20  if( pNew==0 ){. 
16ff0 20 20 20 20 20 73 71 6c 69 74 65 33 53 72 63 4c       sqlite3SrcL
17000 69 73 74 44 65 6c 65 74 65 28 70 4c 69 73 74 29  istDelete(pList)
17010 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30  ;.      return 0
17020 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c 69 73  ;.    }.    pLis
17030 74 20 3d 20 70 4e 65 77 3b 0a 20 20 7d 0a 20 20  t = pNew;.  }.  
17040 70 49 74 65 6d 20 3d 20 26 70 4c 69 73 74 2d 3e  pItem = &pList->
17050 61 5b 70 4c 69 73 74 2d 3e 6e 53 72 63 5d 3b 0a  a[pList->nSrc];.
17060 20 20 6d 65 6d 73 65 74 28 70 49 74 65 6d 2c 20    memset(pItem, 
17070 30 2c 20 73 69 7a 65 6f 66 28 70 4c 69 73 74 2d  0, sizeof(pList-
17080 3e 61 5b 30 5d 29 29 3b 0a 20 20 69 66 28 20 70  >a[0]));.  if( p
17090 44 61 74 61 62 61 73 65 20 26 26 20 70 44 61 74  Database && pDat
170a0 61 62 61 73 65 2d 3e 7a 3d 3d 30 20 29 7b 0a 20  abase->z==0 ){. 
170b0 20 20 20 70 44 61 74 61 62 61 73 65 20 3d 20 30     pDatabase = 0
170c0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 44 61 74  ;.  }.  if( pDat
170d0 61 62 61 73 65 20 26 26 20 70 54 61 62 6c 65 20  abase && pTable 
170e0 29 7b 0a 20 20 20 20 54 6f 6b 65 6e 20 2a 70 54  ){.    Token *pT
170f0 65 6d 70 20 3d 20 70 44 61 74 61 62 61 73 65 3b  emp = pDatabase;
17100 0a 20 20 20 20 70 44 61 74 61 62 61 73 65 20 3d  .    pDatabase =
17110 20 70 54 61 62 6c 65 3b 0a 20 20 20 20 70 54 61   pTable;.    pTa
17120 62 6c 65 20 3d 20 70 54 65 6d 70 3b 0a 20 20 7d  ble = pTemp;.  }
17130 0a 20 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20  .  pItem->zName 
17140 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f  = sqlite3NameFro
17150 6d 54 6f 6b 65 6e 28 70 54 61 62 6c 65 29 3b 0a  mToken(pTable);.
17160 20 20 70 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61    pItem->zDataba
17170 73 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65  se = sqlite3Name
17180 46 72 6f 6d 54 6f 6b 65 6e 28 70 44 61 74 61 62  FromToken(pDatab
17190 61 73 65 29 3b 0a 20 20 70 49 74 65 6d 2d 3e 69  ase);.  pItem->i
171a0 43 75 72 73 6f 72 20 3d 20 2d 31 3b 0a 20 20 70  Cursor = -1;.  p
171b0 49 74 65 6d 2d 3e 69 73 50 6f 70 75 6c 61 74 65  Item->isPopulate
171c0 64 20 3d 20 30 3b 0a 20 20 70 4c 69 73 74 2d 3e  d = 0;.  pList->
171d0 6e 53 72 63 2b 2b 3b 0a 20 20 72 65 74 75 72 6e  nSrc++;.  return
171e0 20 70 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   pList;.}../*.**
171f0 20 41 73 73 69 67 6e 20 63 75 72 73 6f 72 73 20   Assign cursors 
17200 74 6f 20 61 6c 6c 20 74 61 62 6c 65 73 20 69 6e  to all tables in
17210 20 61 20 53 72 63 4c 69 73 74 0a 2a 2f 0a 76 6f   a SrcList.*/.vo
17220 69 64 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73  id sqlite3SrcLis
17230 74 41 73 73 69 67 6e 43 75 72 73 6f 72 73 28 50  tAssignCursors(P
17240 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 72  arse *pParse, Sr
17250 63 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20  cList *pList){. 
17260 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74   int i;.  struct
17270 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
17280 49 74 65 6d 3b 0a 20 20 61 73 73 65 72 74 28 70  Item;.  assert(p
17290 4c 69 73 74 20 7c 7c 20 73 71 6c 69 74 65 33 4d  List || sqlite3M
172a0 61 6c 6c 6f 63 46 61 69 6c 65 64 28 29 20 29 3b  allocFailed() );
172b0 0a 20 20 69 66 28 20 70 4c 69 73 74 20 29 7b 0a  .  if( pList ){.
172c0 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 70 49 74      for(i=0, pIt
172d0 65 6d 3d 70 4c 69 73 74 2d 3e 61 3b 20 69 3c 70  em=pList->a; i<p
172e0 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c  List->nSrc; i++,
172f0 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20   pItem++){.     
17300 20 69 66 28 20 70 49 74 65 6d 2d 3e 69 43 75 72   if( pItem->iCur
17310 73 6f 72 3e 3d 30 20 29 20 62 72 65 61 6b 3b 0a  sor>=0 ) break;.
17320 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 69 43 75        pItem->iCu
17330 72 73 6f 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e  rsor = pParse->n
17340 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28  Tab++;.      if(
17350 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 20   pItem->pSelect 
17360 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
17370 65 33 53 72 63 4c 69 73 74 41 73 73 69 67 6e 43  e3SrcListAssignC
17380 75 72 73 6f 72 73 28 70 50 61 72 73 65 2c 20 70  ursors(pParse, p
17390 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 2d 3e 70  Item->pSelect->p
173a0 53 72 63 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Src);.      }.  
173b0 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
173c0 20 44 65 6c 65 74 65 20 61 6e 20 65 6e 74 69 72   Delete an entir
173d0 65 20 53 72 63 4c 69 73 74 20 69 6e 63 6c 75 64  e SrcList includ
173e0 69 6e 67 20 61 6c 6c 20 69 74 73 20 73 75 62 73  ing all its subs
173f0 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 76 6f 69  tructure..*/.voi
17400 64 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74  d sqlite3SrcList
17410 44 65 6c 65 74 65 28 53 72 63 4c 69 73 74 20 2a  Delete(SrcList *
17420 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b  pList){.  int i;
17430 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73  .  struct SrcLis
17440 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20  t_item *pItem;. 
17450 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20   if( pList==0 ) 
17460 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 70 49  return;.  for(pI
17470 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 2c 20 69 3d  tem=pList->a, i=
17480 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 53 72 63  0; i<pList->nSrc
17490 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b  ; i++, pItem++){
174a0 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28  .    sqliteFree(
174b0 70 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65  pItem->zDatabase
174c0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65  );.    sqliteFre
174d0 65 28 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b  e(pItem->zName);
174e0 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28  .    sqliteFree(
174f0 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a  pItem->zAlias);.
17500 20 20 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74      sqlite3Delet
17510 65 54 61 62 6c 65 28 30 2c 20 70 49 74 65 6d 2d  eTable(0, pItem-
17520 3e 70 54 61 62 29 3b 0a 20 20 20 20 73 71 6c 69  >pTab);.    sqli
17530 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28  te3SelectDelete(
17540 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 29 3b  pItem->pSelect);
17550 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
17560 44 65 6c 65 74 65 28 70 49 74 65 6d 2d 3e 70 4f  Delete(pItem->pO
17570 6e 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 49  n);.    sqlite3I
17580 64 4c 69 73 74 44 65 6c 65 74 65 28 70 49 74 65  dListDelete(pIte
17590 6d 2d 3e 70 55 73 69 6e 67 29 3b 0a 20 20 7d 0a  m->pUsing);.  }.
175a0 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 4c 69    sqliteFree(pLi
175b0 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  st);.}../*.** Th
175c0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
175d0 6c 6c 65 64 20 62 79 20 74 68 65 20 70 61 72 73  lled by the pars
175e0 65 72 20 74 6f 20 61 64 64 20 61 20 6e 65 77 20  er to add a new 
175f0 74 65 72 6d 20 74 6f 20 74 68 65 0a 2a 2a 20 65  term to the.** e
17600 6e 64 20 6f 66 20 61 20 67 72 6f 77 69 6e 67 20  nd of a growing 
17610 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20 54 68  FROM clause.  Th
17620 65 20 22 70 22 20 70 61 72 61 6d 65 74 65 72 20  e "p" parameter 
17630 69 73 20 74 68 65 20 70 61 72 74 20 6f 66 0a 2a  is the part of.*
17640 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  * the FROM claus
17650 65 20 74 68 61 74 20 68 61 73 20 61 6c 72 65 61  e that has alrea
17660 64 79 20 62 65 65 6e 20 63 6f 6e 73 74 72 75 63  dy been construc
17670 74 65 64 2e 20 20 22 70 22 20 69 73 20 4e 55 4c  ted.  "p" is NUL
17680 4c 0a 2a 2a 20 69 66 20 74 68 69 73 20 69 73 20  L.** if this is 
17690 74 68 65 20 66 69 72 73 74 20 74 65 72 6d 20 6f  the first term o
176a0 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  f the FROM claus
176b0 65 2e 20 20 70 54 61 62 6c 65 20 61 6e 64 20 70  e.  pTable and p
176c0 44 61 74 61 62 61 73 65 0a 2a 2a 20 61 72 65 20  Database.** are 
176d0 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
176e0 74 61 62 6c 65 20 61 6e 64 20 64 61 74 61 62 61  table and databa
176f0 73 65 20 6e 61 6d 65 64 20 69 6e 20 74 68 65 20  se named in the 
17700 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d  FROM clause term
17710 2e 0a 2a 2a 20 70 44 61 74 61 62 61 73 65 20 69  ..** pDatabase i
17720 73 20 4e 55 4c 4c 20 69 66 20 74 68 65 20 64 61  s NULL if the da
17730 74 61 62 61 73 65 20 6e 61 6d 65 20 71 75 61 6c  tabase name qual
17740 69 66 69 65 72 20 69 73 20 6d 69 73 73 69 6e 67  ifier is missing
17750 20 2d 20 74 68 65 0a 2a 2a 20 75 73 75 61 6c 20   - the.** usual 
17760 63 61 73 65 2e 20 20 49 66 20 74 68 65 20 74 65  case.  If the te
17770 72 6d 20 68 61 73 20 61 20 61 6c 69 61 73 2c 20  rm has a alias, 
17780 74 68 65 6e 20 70 41 6c 69 61 73 20 70 6f 69 6e  then pAlias poin
17790 74 73 20 74 6f 20 74 68 65 0a 2a 2a 20 61 6c 69  ts to the.** ali
177a0 61 73 20 74 6f 6b 65 6e 2e 20 20 49 66 20 74 68  as token.  If th
177b0 65 20 74 65 72 6d 20 69 73 20 61 20 73 75 62 71  e term is a subq
177c0 75 65 72 79 2c 20 74 68 65 6e 20 70 53 75 62 71  uery, then pSubq
177d0 75 65 72 79 20 69 73 20 74 68 65 0a 2a 2a 20 53  uery is the.** S
177e0 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
177f0 74 68 61 74 20 74 68 65 20 73 75 62 71 75 65 72  that the subquer
17800 79 20 65 6e 63 6f 64 65 73 2e 20 20 54 68 65 20  y encodes.  The 
17810 70 54 61 62 6c 65 20 61 6e 64 0a 2a 2a 20 70 44  pTable and.** pD
17820 61 74 61 62 61 73 65 20 70 61 72 61 6d 65 74 65  atabase paramete
17830 72 73 20 61 72 65 20 4e 55 4c 4c 20 66 6f 72 20  rs are NULL for 
17840 73 75 62 71 75 65 72 69 65 73 2e 20 20 54 68 65  subqueries.  The
17850 20 70 4f 6e 20 61 6e 64 20 70 55 73 69 6e 67 0a   pOn and pUsing.
17860 2a 2a 20 70 61 72 61 6d 65 74 65 72 73 20 61 72  ** parameters ar
17870 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66  e the content of
17880 20 74 68 65 20 4f 4e 20 61 6e 64 20 55 53 49 4e   the ON and USIN
17890 47 20 63 6c 61 75 73 65 73 2e 0a 2a 2a 0a 2a 2a  G clauses..**.**
178a0 20 52 65 74 75 72 6e 20 61 20 6e 65 77 20 53 72   Return a new Sr
178b0 63 4c 69 73 74 20 77 68 69 63 68 20 65 6e 63 6f  cList which enco
178c0 64 65 73 20 69 73 20 74 68 65 20 46 52 4f 4d 20  des is the FROM 
178d0 77 69 74 68 20 74 68 65 20 6e 65 77 0a 2a 2a 20  with the new.** 
178e0 74 65 72 6d 20 61 64 64 65 64 2e 0a 2a 2f 0a 53  term added..*/.S
178f0 72 63 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 53  rcList *sqlite3S
17900 72 63 4c 69 73 74 41 70 70 65 6e 64 46 72 6f 6d  rcListAppendFrom
17910 54 65 72 6d 28 0a 20 20 53 72 63 4c 69 73 74 20  Term(.  SrcList 
17920 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
17930 2f 2a 20 54 68 65 20 6c 65 66 74 20 70 61 72 74  /* The left part
17940 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   of the FROM cla
17950 75 73 65 20 61 6c 72 65 61 64 79 20 73 65 65 6e  use already seen
17960 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 54 61   */.  Token *pTa
17970 62 6c 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  ble,          /*
17980 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62   Name of the tab
17990 6c 65 20 74 6f 20 61 64 64 20 74 6f 20 74 68 65  le to add to the
179a0 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a   FROM clause */.
179b0 20 20 54 6f 6b 65 6e 20 2a 70 44 61 74 61 62 61    Token *pDataba
179c0 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d  se,       /* Nam
179d0 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
179e0 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 70 54 61  e containing pTa
179f0 62 6c 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  ble */.  Token *
17a00 70 41 6c 69 61 73 2c 20 20 20 20 20 20 20 20 20  pAlias,         
17a10 20 2f 2a 20 54 68 65 20 72 69 67 68 74 2d 68 61   /* The right-ha
17a20 6e 64 20 73 69 64 65 20 6f 66 20 74 68 65 20 41  nd side of the A
17a30 53 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 20  S subexpression 
17a40 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 75  */.  Select *pSu
17a50 62 71 75 65 72 79 2c 20 20 20 20 20 20 2f 2a 20  bquery,      /* 
17a60 41 20 73 75 62 71 75 65 72 79 20 75 73 65 64 20  A subquery used 
17a70 69 6e 20 70 6c 61 63 65 20 6f 66 20 61 20 74 61  in place of a ta
17a80 62 6c 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 45 78  ble name */.  Ex
17a90 70 72 20 2a 70 4f 6e 2c 20 20 20 20 20 20 20 20  pr *pOn,        
17aa0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4f 4e 20        /* The ON 
17ab0 63 6c 61 75 73 65 20 6f 66 20 61 20 6a 6f 69 6e  clause of a join
17ac0 20 2a 2f 0a 20 20 49 64 4c 69 73 74 20 2a 70 55   */.  IdList *pU
17ad0 73 69 6e 67 20 20 20 20 20 20 20 20 20 20 2f 2a  sing          /*
17ae0 20 54 68 65 20 55 53 49 4e 47 20 63 6c 61 75 73   The USING claus
17af0 65 20 6f 66 20 61 20 6a 6f 69 6e 20 2a 2f 0a 29  e of a join */.)
17b00 7b 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69  {.  struct SrcLi
17b10 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a  st_item *pItem;.
17b20 20 20 70 20 3d 20 73 71 6c 69 74 65 33 53 72 63    p = sqlite3Src
17b30 4c 69 73 74 41 70 70 65 6e 64 28 70 2c 20 70 54  ListAppend(p, pT
17b40 61 62 6c 65 2c 20 70 44 61 74 61 62 61 73 65 29  able, pDatabase)
17b50 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20  ;.  if( p==0 || 
17b60 70 2d 3e 6e 53 72 63 3d 3d 30 20 29 7b 0a 20 20  p->nSrc==0 ){.  
17b70 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
17b80 65 74 65 28 70 4f 6e 29 3b 0a 20 20 20 20 73 71  ete(pOn);.    sq
17b90 6c 69 74 65 33 49 64 4c 69 73 74 44 65 6c 65 74  lite3IdListDelet
17ba0 65 28 70 55 73 69 6e 67 29 3b 0a 20 20 20 20 73  e(pUsing);.    s
17bb0 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65  qlite3SelectDele
17bc0 74 65 28 70 53 75 62 71 75 65 72 79 29 3b 0a 20  te(pSubquery);. 
17bd0 20 20 20 72 65 74 75 72 6e 20 70 3b 0a 20 20 7d     return p;.  }
17be0 0a 20 20 70 49 74 65 6d 20 3d 20 26 70 2d 3e 61  .  pItem = &p->a
17bf0 5b 70 2d 3e 6e 53 72 63 2d 31 5d 3b 0a 20 20 69  [p->nSrc-1];.  i
17c00 66 28 20 70 41 6c 69 61 73 20 26 26 20 70 41 6c  f( pAlias && pAl
17c10 69 61 73 2d 3e 6e 20 29 7b 0a 20 20 20 20 70 49  ias->n ){.    pI
17c20 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 3d 20 73 71  tem->zAlias = sq
17c30 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b  lite3NameFromTok
17c40 65 6e 28 70 41 6c 69 61 73 29 3b 0a 20 20 7d 0a  en(pAlias);.  }.
17c50 20 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74    pItem->pSelect
17c60 20 3d 20 70 53 75 62 71 75 65 72 79 3b 0a 20 20   = pSubquery;.  
17c70 70 49 74 65 6d 2d 3e 70 4f 6e 20 3d 20 70 4f 6e  pItem->pOn = pOn
17c80 3b 0a 20 20 70 49 74 65 6d 2d 3e 70 55 73 69 6e  ;.  pItem->pUsin
17c90 67 20 3d 20 70 55 73 69 6e 67 3b 0a 20 20 72 65  g = pUsing;.  re
17ca0 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn p;.}../*.**
17cb0 20 57 68 65 6e 20 62 75 69 6c 64 69 6e 67 20 75   When building u
17cc0 70 20 61 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  p a FROM clause 
17cd0 69 6e 20 74 68 65 20 70 61 72 73 65 72 2c 20 74  in the parser, t
17ce0 68 65 20 6a 6f 69 6e 20 6f 70 65 72 61 74 6f 72  he join operator
17cf0 0a 2a 2a 20 69 73 20 69 6e 69 74 69 61 6c 6c 79  .** is initially
17d00 20 61 74 74 61 63 68 65 64 20 74 6f 20 74 68 65   attached to the
17d10 20 6c 65 66 74 20 6f 70 65 72 61 6e 64 2e 20 20   left operand.  
17d20 42 75 74 20 74 68 65 20 63 6f 64 65 20 67 65 6e  But the code gen
17d30 65 72 61 74 6f 72 0a 2a 2a 20 65 78 70 65 63 74  erator.** expect
17d40 73 20 74 68 65 20 6a 6f 69 6e 20 6f 70 65 72 61  s the join opera
17d50 74 6f 72 20 74 6f 20 62 65 20 6f 6e 20 74 68 65  tor to be on the
17d60 20 72 69 67 68 74 20 6f 70 65 72 61 6e 64 2e 20   right operand. 
17d70 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a   This routine.**
17d80 20 53 68 69 66 74 73 20 61 6c 6c 20 6a 6f 69 6e   Shifts all join
17d90 20 6f 70 65 72 61 74 6f 72 73 20 66 72 6f 6d 20   operators from 
17da0 6c 65 66 74 20 74 6f 20 72 69 67 68 74 20 66 6f  left to right fo
17db0 72 20 61 6e 20 65 6e 74 69 72 65 20 46 52 4f 4d  r an entire FROM
17dc0 0a 2a 2a 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a  .** clause..**.*
17dd0 2a 20 45 78 61 6d 70 6c 65 3a 20 53 75 70 70 6f  * Example: Suppo
17de0 73 65 20 74 68 65 20 6a 6f 69 6e 20 69 73 20 6c  se the join is l
17df0 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20  ike this:.**.** 
17e00 20 20 20 20 20 20 20 20 20 20 41 20 6e 61 74 75            A natu
17e10 72 61 6c 20 63 72 6f 73 73 20 6a 6f 69 6e 20 42  ral cross join B
17e20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 70 65 72 61  .**.** The opera
17e30 74 6f 72 20 69 73 20 22 6e 61 74 75 72 61 6c 20  tor is "natural 
17e40 63 72 6f 73 73 20 6a 6f 69 6e 22 2e 20 20 54 68  cross join".  Th
17e50 65 20 41 20 61 6e 64 20 42 20 6f 70 65 72 61 6e  e A and B operan
17e60 64 73 20 61 72 65 20 73 74 6f 72 65 64 0a 2a 2a  ds are stored.**
17e70 20 69 6e 20 70 2d 3e 61 5b 30 5d 20 61 6e 64 20   in p->a[0] and 
17e80 70 2d 3e 61 5b 31 5d 2c 20 72 65 73 70 65 63 74  p->a[1], respect
17e90 69 76 65 6c 79 2e 20 20 54 68 65 20 70 61 72 73  ively.  The pars
17ea0 65 72 20 69 6e 69 74 69 61 6c 6c 79 20 73 74 6f  er initially sto
17eb0 72 65 73 20 74 68 65 0a 2a 2a 20 6f 70 65 72 61  res the.** opera
17ec0 74 6f 72 20 77 69 74 68 20 41 2e 20 20 54 68 69  tor with A.  Thi
17ed0 73 20 72 6f 75 74 69 6e 65 20 73 68 69 66 74 73  s routine shifts
17ee0 20 74 68 61 74 20 6f 70 65 72 61 74 6f 72 20 6f   that operator o
17ef0 76 65 72 20 74 6f 20 42 2e 0a 2a 2f 0a 76 6f 69  ver to B..*/.voi
17f00 64 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74  d sqlite3SrcList
17f10 53 68 69 66 74 4a 6f 69 6e 54 79 70 65 28 53 72  ShiftJoinType(Sr
17f20 63 4c 69 73 74 20 2a 70 29 7b 0a 20 20 69 66 28  cList *p){.  if(
17f30 20 70 20 26 26 20 70 2d 3e 61 20 29 7b 0a 20 20   p && p->a ){.  
17f40 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72    int i;.    for
17f50 28 69 3d 70 2d 3e 6e 53 72 63 2d 31 3b 20 69 3e  (i=p->nSrc-1; i>
17f60 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 20 20 70  0; i--){.      p
17f70 2d 3e 61 5b 69 5d 2e 6a 6f 69 6e 74 79 70 65 20  ->a[i].jointype 
17f80 3d 20 70 2d 3e 61 5b 69 2d 31 5d 2e 6a 6f 69 6e  = p->a[i-1].join
17f90 74 79 70 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20  type;.    }.    
17fa0 70 2d 3e 61 5b 30 5d 2e 6a 6f 69 6e 74 79 70 65  p->a[0].jointype
17fb0 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a   = 0;.  }.}../*.
17fc0 2a 2a 20 42 65 67 69 6e 20 61 20 74 72 61 6e 73  ** Begin a trans
17fd0 61 63 74 69 6f 6e 0a 2a 2f 0a 76 6f 69 64 20 73  action.*/.void s
17fe0 71 6c 69 74 65 33 42 65 67 69 6e 54 72 61 6e 73  qlite3BeginTrans
17ff0 61 63 74 69 6f 6e 28 50 61 72 73 65 20 2a 70 50  action(Parse *pP
18000 61 72 73 65 2c 20 69 6e 74 20 74 79 70 65 29 7b  arse, int type){
18010 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
18020 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 69 6e 74    Vdbe *v;.  int
18030 20 69 3b 0a 0a 20 20 69 66 28 20 70 50 61 72 73   i;..  if( pPars
18040 65 3d 3d 30 20 7c 7c 20 28 64 62 3d 70 50 61 72  e==0 || (db=pPar
18050 73 65 2d 3e 64 62 29 3d 3d 30 20 7c 7c 20 64 62  se->db)==0 || db
18060 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 3d 3d 30 20  ->aDb[0].pBt==0 
18070 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
18080 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20  pParse->nErr || 
18090 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 46 61 69  sqlite3MallocFai
180a0 6c 65 64 28 29 20 29 20 72 65 74 75 72 6e 3b 0a  led() ) return;.
180b0 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74    if( sqlite3Aut
180c0 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53  hCheck(pParse, S
180d0 51 4c 49 54 45 5f 54 52 41 4e 53 41 43 54 49 4f  QLITE_TRANSACTIO
180e0 4e 2c 20 22 42 45 47 49 4e 22 2c 20 30 2c 20 30  N, "BEGIN", 0, 0
180f0 29 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 76  ) ) return;..  v
18100 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
18110 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28  e(pParse);.  if(
18120 20 21 76 20 29 20 72 65 74 75 72 6e 3b 0a 20 20   !v ) return;.  
18130 69 66 28 20 74 79 70 65 21 3d 54 4b 5f 44 45 46  if( type!=TK_DEF
18140 45 52 52 45 44 20 29 7b 0a 20 20 20 20 66 6f 72  ERRED ){.    for
18150 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b  (i=0; i<db->nDb;
18160 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c   i++){.      sql
18170 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
18180 20 4f 50 5f 54 72 61 6e 73 61 63 74 69 6f 6e 2c   OP_Transaction,
18190 20 69 2c 20 28 74 79 70 65 3d 3d 54 4b 5f 45 58   i, (type==TK_EX
181a0 43 4c 55 53 49 56 45 29 2b 31 29 3b 0a 20 20 20  CLUSIVE)+1);.   
181b0 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33   }.  }.  sqlite3
181c0 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
181d0 41 75 74 6f 43 6f 6d 6d 69 74 2c 20 30 2c 20 30  AutoCommit, 0, 0
181e0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d  );.}../*.** Comm
181f0 69 74 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  it a transaction
18200 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
18210 43 6f 6d 6d 69 74 54 72 61 6e 73 61 63 74 69 6f  CommitTransactio
18220 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29  n(Parse *pParse)
18230 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  {.  sqlite3 *db;
18240 0a 20 20 56 64 62 65 20 2a 76 3b 0a 0a 20 20 69  .  Vdbe *v;..  i
18250 66 28 20 70 50 61 72 73 65 3d 3d 30 20 7c 7c 20  f( pParse==0 || 
18260 28 64 62 3d 70 50 61 72 73 65 2d 3e 64 62 29 3d  (db=pParse->db)=
18270 3d 30 20 7c 7c 20 64 62 2d 3e 61 44 62 5b 30 5d  =0 || db->aDb[0]
18280 2e 70 42 74 3d 3d 30 20 29 20 72 65 74 75 72 6e  .pBt==0 ) return
18290 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  ;.  if( pParse->
182a0 6e 45 72 72 20 7c 7c 20 73 71 6c 69 74 65 33 4d  nErr || sqlite3M
182b0 61 6c 6c 6f 63 46 61 69 6c 65 64 28 29 20 29 20  allocFailed() ) 
182c0 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 73 71  return;.  if( sq
182d0 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70  lite3AuthCheck(p
182e0 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 54 52  Parse, SQLITE_TR
182f0 41 4e 53 41 43 54 49 4f 4e 2c 20 22 43 4f 4d 4d  ANSACTION, "COMM
18300 49 54 22 2c 20 30 2c 20 30 29 20 29 20 72 65 74  IT", 0, 0) ) ret
18310 75 72 6e 3b 0a 0a 20 20 76 20 3d 20 73 71 6c 69  urn;..  v = sqli
18320 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
18330 65 29 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a 20  e);.  if( v ){. 
18340 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
18350 64 4f 70 28 76 2c 20 4f 50 5f 41 75 74 6f 43 6f  dOp(v, OP_AutoCo
18360 6d 6d 69 74 2c 20 31 2c 20 30 29 3b 0a 20 20 7d  mmit, 1, 0);.  }
18370 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61  .}../*.** Rollba
18380 63 6b 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  ck a transaction
18390 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
183a0 52 6f 6c 6c 62 61 63 6b 54 72 61 6e 73 61 63 74  RollbackTransact
183b0 69 6f 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73  ion(Parse *pPars
183c0 65 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  e){.  sqlite3 *d
183d0 62 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 0a 20  b;.  Vdbe *v;.. 
183e0 20 69 66 28 20 70 50 61 72 73 65 3d 3d 30 20 7c   if( pParse==0 |
183f0 7c 20 28 64 62 3d 70 50 61 72 73 65 2d 3e 64 62  | (db=pParse->db
18400 29 3d 3d 30 20 7c 7c 20 64 62 2d 3e 61 44 62 5b  )==0 || db->aDb[
18410 30 5d 2e 70 42 74 3d 3d 30 20 29 20 72 65 74 75  0].pBt==0 ) retu
18420 72 6e 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65  rn;.  if( pParse
18430 2d 3e 6e 45 72 72 20 7c 7c 20 73 71 6c 69 74 65  ->nErr || sqlite
18440 33 4d 61 6c 6c 6f 63 46 61 69 6c 65 64 28 29 20  3MallocFailed() 
18450 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
18460 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b  sqlite3AuthCheck
18470 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f  (pParse, SQLITE_
18480 54 52 41 4e 53 41 43 54 49 4f 4e 2c 20 22 52 4f  TRANSACTION, "RO
18490 4c 4c 42 41 43 4b 22 2c 20 30 2c 20 30 29 20 29  LLBACK", 0, 0) )
184a0 20 72 65 74 75 72 6e 3b 0a 0a 20 20 76 20 3d 20   return;..  v = 
184b0 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
184c0 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76 20  Parse);.  if( v 
184d0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
184e0 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 41 75  beAddOp(v, OP_Au
184f0 74 6f 43 6f 6d 6d 69 74 2c 20 31 2c 20 31 29 3b  toCommit, 1, 1);
18500 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61  .  }.}../*.** Ma
18510 6b 65 20 73 75 72 65 20 74 68 65 20 54 45 4d 50  ke sure the TEMP
18520 20 64 61 74 61 62 61 73 65 20 69 73 20 6f 70 65   database is ope
18530 6e 20 61 6e 64 20 61 76 61 69 6c 61 62 6c 65 20  n and available 
18540 66 6f 72 20 75 73 65 2e 20 20 52 65 74 75 72 6e  for use.  Return
18550 0a 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  .** the number o
18560 66 20 65 72 72 6f 72 73 2e 20 20 4c 65 61 76 65  f errors.  Leave
18570 20 61 6e 79 20 65 72 72 6f 72 20 6d 65 73 73 61   any error messa
18580 67 65 73 20 69 6e 20 74 68 65 20 70 50 61 72 73  ges in the pPars
18590 65 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a  e structure..*/.
185a0 69 6e 74 20 73 71 6c 69 74 65 33 4f 70 65 6e 54  int sqlite3OpenT
185b0 65 6d 70 44 61 74 61 62 61 73 65 28 50 61 72 73  empDatabase(Pars
185c0 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 73 71  e *pParse){.  sq
185d0 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
185e0 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20 64 62  se->db;.  if( db
185f0 2d 3e 61 44 62 5b 31 5d 2e 70 42 74 3d 3d 30 20  ->aDb[1].pBt==0 
18600 26 26 20 21 70 50 61 72 73 65 2d 3e 65 78 70 6c  && !pParse->expl
18610 61 69 6e 20 29 7b 0a 20 20 20 20 69 6e 74 20 72  ain ){.    int r
18620 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
18630 46 61 63 74 6f 72 79 28 64 62 2c 20 30 2c 20 30  Factory(db, 0, 0
18640 2c 20 4d 41 58 5f 50 41 47 45 53 2c 20 26 64 62  , MAX_PAGES, &db
18650 2d 3e 61 44 62 5b 31 5d 2e 70 42 74 29 3b 0a 20  ->aDb[1].pBt);. 
18660 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
18670 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71  E_OK ){.      sq
18680 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
18690 61 72 73 65 2c 20 22 75 6e 61 62 6c 65 20 74 6f  arse, "unable to
186a0 20 6f 70 65 6e 20 61 20 74 65 6d 70 6f 72 61 72   open a temporar
186b0 79 20 64 61 74 61 62 61 73 65 20 22 0a 20 20 20  y database ".   
186c0 20 20 20 20 20 22 66 69 6c 65 20 66 6f 72 20 73       "file for s
186d0 74 6f 72 69 6e 67 20 74 65 6d 70 6f 72 61 72 79  toring temporary
186e0 20 74 61 62 6c 65 73 22 29 3b 0a 20 20 20 20 20   tables");.     
186f0 20 70 50 61 72 73 65 2d 3e 72 63 20 3d 20 72 63   pParse->rc = rc
18700 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31  ;.      return 1
18710 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
18720 64 62 2d 3e 66 6c 61 67 73 20 26 20 21 64 62 2d  db->flags & !db-
18730 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 29 7b 0a 20  >autoCommit ){. 
18740 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
18750 33 42 74 72 65 65 42 65 67 69 6e 54 72 61 6e 73  3BtreeBeginTrans
18760 28 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 42 74 2c  (db->aDb[1].pBt,
18770 20 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72   1);.      if( r
18780 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
18790 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
187a0 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
187b0 22 75 6e 61 62 6c 65 20 74 6f 20 67 65 74 20 61  "unable to get a
187c0 20 77 72 69 74 65 20 6c 6f 63 6b 20 6f 6e 20 22   write lock on "
187d0 0a 20 20 20 20 20 20 20 20 20 20 22 74 68 65 20  .          "the 
187e0 74 65 6d 70 6f 72 61 72 79 20 64 61 74 61 62 61  temporary databa
187f0 73 65 20 66 69 6c 65 22 29 3b 0a 20 20 20 20 20  se file");.     
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 20 20 72 65 74 75  rc;.        retu
18820 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rn 1;.      }.  
18830 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
18840 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 53 63 68 65  db->aDb[1].pSche
18850 6d 61 20 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  ma );.  }.  retu
18860 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  rn 0;.}../*.** G
18870 65 6e 65 72 61 74 65 20 56 44 42 45 20 63 6f 64  enerate VDBE cod
18880 65 20 74 68 61 74 20 77 69 6c 6c 20 76 65 72 69  e that will veri
18890 66 79 20 74 68 65 20 73 63 68 65 6d 61 20 63 6f  fy the schema co
188a0 6f 6b 69 65 20 61 6e 64 20 73 74 61 72 74 0a 2a  okie and start.*
188b0 2a 20 61 20 72 65 61 64 2d 74 72 61 6e 73 61 63  * a read-transac
188c0 74 69 6f 6e 20 66 6f 72 20 61 6c 6c 20 6e 61 6d  tion for all nam
188d0 65 64 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ed database file
188e0 73 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 69  s..**.** It is i
188f0 6d 70 6f 72 74 61 6e 74 20 74 68 61 74 20 61 6c  mportant that al
18900 6c 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 73  l schema cookies
18910 20 62 65 20 76 65 72 69 66 69 65 64 20 61 6e 64   be verified and
18920 20 61 6c 6c 0a 2a 2a 20 72 65 61 64 20 74 72 61   all.** read tra
18930 6e 73 61 63 74 69 6f 6e 73 20 62 65 20 73 74 61  nsactions be sta
18940 72 74 65 64 20 62 65 66 6f 72 65 20 61 6e 79 74  rted before anyt
18950 68 69 6e 67 20 65 6c 73 65 20 68 61 70 70 65 6e  hing else happen
18960 73 20 69 6e 0a 2a 2a 20 74 68 65 20 56 44 42 45  s in.** the VDBE
18970 20 70 72 6f 67 72 61 6d 2e 20 20 42 75 74 20 74   program.  But t
18980 68 69 73 20 72 6f 75 74 69 6e 65 20 63 61 6e 20  his routine can 
18990 62 65 20 63 61 6c 6c 65 64 20 61 66 74 65 72 20  be called after 
189a0 6d 75 63 68 20 6f 74 68 65 72 0a 2a 2a 20 63 6f  much other.** co
189b0 64 65 20 68 61 73 20 62 65 65 6e 20 67 65 6e 65  de has been gene
189c0 72 61 74 65 64 2e 20 20 53 6f 20 68 65 72 65 20  rated.  So here 
189d0 69 73 20 77 68 61 74 20 77 65 20 64 6f 3a 0a 2a  is what we do:.*
189e0 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 74  *.** The first t
189f0 69 6d 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ime this routine
18a00 20 69 73 20 63 61 6c 6c 65 64 2c 20 77 65 20 63   is called, we c
18a10 6f 64 65 20 61 6e 20 4f 50 5f 47 6f 74 6f 20 74  ode an OP_Goto t
18a20 68 61 74 0a 2a 2a 20 77 69 6c 6c 20 6a 75 6d 70  hat.** will jump
18a30 20 74 6f 20 61 20 73 75 62 72 6f 75 74 69 6e 65   to a subroutine
18a40 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74   at the end of t
18a50 68 65 20 70 72 6f 67 72 61 6d 2e 20 20 54 68 65  he program.  The
18a60 6e 20 77 65 0a 2a 2a 20 72 65 63 6f 72 64 20 65  n we.** record e
18a70 76 65 72 79 20 64 61 74 61 62 61 73 65 20 74 68  very database th
18a80 61 74 20 6e 65 65 64 73 20 69 74 73 20 73 63 68  at needs its sch
18a90 65 6d 61 20 76 65 72 69 66 69 65 64 20 69 6e 20  ema verified in 
18aa0 74 68 65 0a 2a 2a 20 70 50 61 72 73 65 2d 3e 63  the.** pParse->c
18ab0 6f 6f 6b 69 65 4d 61 73 6b 20 66 69 65 6c 64 2e  ookieMask field.
18ac0 20 20 4c 61 74 65 72 2c 20 61 66 74 65 72 20 61    Later, after a
18ad0 6c 6c 20 6f 74 68 65 72 20 63 6f 64 65 20 68 61  ll other code ha
18ae0 73 20 62 65 65 6e 0a 2a 2a 20 67 65 6e 65 72 61  s been.** genera
18af0 74 65 64 2c 20 74 68 65 20 73 75 62 72 6f 75 74  ted, the subrout
18b00 69 6e 65 20 74 68 61 74 20 64 6f 65 73 20 74 68  ine that does th
18b10 65 20 63 6f 6f 6b 69 65 20 76 65 72 69 66 69 63  e cookie verific
18b20 61 74 69 6f 6e 73 20 61 6e 64 0a 2a 2a 20 73 74  ations and.** st
18b30 61 72 74 73 20 74 68 65 20 74 72 61 6e 73 61 63  arts the transac
18b40 74 69 6f 6e 73 20 77 69 6c 6c 20 62 65 20 63 6f  tions will be co
18b50 64 65 64 20 61 6e 64 20 74 68 65 20 4f 50 5f 47  ded and the OP_G
18b60 6f 74 6f 20 50 32 20 76 61 6c 75 65 0a 2a 2a 20  oto P2 value.** 
18b70 77 69 6c 6c 20 62 65 20 6d 61 64 65 20 74 6f 20  will be made to 
18b80 70 6f 69 6e 74 20 74 6f 20 74 68 61 74 20 73 75  point to that su
18b90 62 72 6f 75 74 69 6e 65 2e 20 20 54 68 65 20 67  broutine.  The g
18ba0 65 6e 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65  eneration of the
18bb0 0a 2a 2a 20 63 6f 6f 6b 69 65 20 76 65 72 69 66  .** cookie verif
18bc0 69 63 61 74 69 6f 6e 20 73 75 62 72 6f 75 74 69  ication subrouti
18bd0 6e 65 20 63 6f 64 65 20 68 61 70 70 65 6e 73 20  ne code happens 
18be0 69 6e 20 73 71 6c 69 74 65 33 46 69 6e 69 73 68  in sqlite3Finish
18bf0 43 6f 64 69 6e 67 28 29 2e 0a 2a 2a 0a 2a 2a 20  Coding()..**.** 
18c00 49 66 20 69 44 62 3c 30 20 74 68 65 6e 20 63 6f  If iDb<0 then co
18c10 64 65 20 74 68 65 20 4f 50 5f 47 6f 74 6f 20 6f  de the OP_Goto o
18c20 6e 6c 79 20 2d 20 64 6f 6e 27 74 20 73 65 74 20  nly - don't set 
18c30 66 6c 61 67 20 74 6f 20 76 65 72 69 66 79 20 74  flag to verify t
18c40 68 65 0a 2a 2a 20 73 63 68 65 6d 61 20 6f 6e 20  he.** schema on 
18c50 61 6e 79 20 64 61 74 61 62 61 73 65 73 2e 20 20  any databases.  
18c60 54 68 69 73 20 63 61 6e 20 62 65 20 75 73 65 64  This can be used
18c70 20 74 6f 20 70 6f 73 69 74 69 6f 6e 20 74 68 65   to position the
18c80 20 4f 50 5f 47 6f 74 6f 0a 2a 2a 20 65 61 72 6c   OP_Goto.** earl
18c90 79 20 69 6e 20 74 68 65 20 63 6f 64 65 2c 20 62  y in the code, b
18ca0 65 66 6f 72 65 20 77 65 20 6b 6e 6f 77 20 69 66  efore we know if
18cb0 20 61 6e 79 20 64 61 74 61 62 61 73 65 20 74 61   any database ta
18cc0 62 6c 65 73 20 77 69 6c 6c 20 62 65 20 75 73 65  bles will be use
18cd0 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  d..*/.void sqlit
18ce0 65 33 43 6f 64 65 56 65 72 69 66 79 53 63 68 65  e3CodeVerifySche
18cf0 6d 61 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ma(Parse *pParse
18d00 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20 20 73 71  , int iDb){.  sq
18d10 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 56 64 62  lite3 *db;.  Vdb
18d20 65 20 2a 76 3b 0a 20 20 69 6e 74 20 6d 61 73 6b  e *v;.  int mask
18d30 3b 0a 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33  ;..  v = sqlite3
18d40 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
18d50 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72 65  .  if( v==0 ) re
18d60 74 75 72 6e 3b 20 20 2f 2a 20 54 68 69 73 20 6f  turn;  /* This o
18d70 6e 6c 79 20 68 61 70 70 65 6e 73 20 69 66 20 74  nly happens if t
18d80 68 65 72 65 20 77 61 73 20 61 20 70 72 69 6f 72  here was a prior
18d90 20 65 72 72 6f 72 20 2a 2f 0a 20 20 64 62 20 3d   error */.  db =
18da0 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69   pParse->db;.  i
18db0 66 28 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69  f( pParse->cooki
18dc0 65 47 6f 74 6f 3d 3d 30 20 29 7b 0a 20 20 20 20  eGoto==0 ){.    
18dd0 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 47 6f  pParse->cookieGo
18de0 74 6f 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  to = sqlite3Vdbe
18df0 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f  AddOp(v, OP_Goto
18e00 2c 20 30 2c 20 30 29 2b 31 3b 0a 20 20 7d 0a 20  , 0, 0)+1;.  }. 
18e10 20 69 66 28 20 69 44 62 3e 3d 30 20 29 7b 0a 20   if( iDb>=0 ){. 
18e20 20 20 20 61 73 73 65 72 74 28 20 69 44 62 3c 64     assert( iDb<d
18e30 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 20 20 61 73  b->nDb );.    as
18e40 73 65 72 74 28 20 64 62 2d 3e 61 44 62 5b 69 44  sert( db->aDb[iD
18e50 62 5d 2e 70 42 74 21 3d 30 20 7c 7c 20 69 44 62  b].pBt!=0 || iDb
18e60 3d 3d 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==1 );.    asser
18e70 74 28 20 69 44 62 3c 4d 41 58 5f 41 54 54 41 43  t( iDb<MAX_ATTAC
18e80 48 45 44 2b 32 20 29 3b 0a 20 20 20 20 6d 61 73  HED+2 );.    mas
18e90 6b 20 3d 20 31 3c 3c 69 44 62 3b 0a 20 20 20 20  k = 1<<iDb;.    
18ea0 69 66 28 20 28 70 50 61 72 73 65 2d 3e 63 6f 6f  if( (pParse->coo
18eb0 6b 69 65 4d 61 73 6b 20 26 20 6d 61 73 6b 29 3d  kieMask & mask)=
18ec0 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 50 61 72  =0 ){.      pPar
18ed0 73 65 2d 3e 63 6f 6f 6b 69 65 4d 61 73 6b 20 7c  se->cookieMask |
18ee0 3d 20 6d 61 73 6b 3b 0a 20 20 20 20 20 20 70 50  = mask;.      pP
18ef0 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 56 61 6c 75  arse->cookieValu
18f00 65 5b 69 44 62 5d 20 3d 20 64 62 2d 3e 61 44 62  e[iDb] = db->aDb
18f10 5b 69 44 62 5d 2e 70 53 63 68 65 6d 61 2d 3e 73  [iDb].pSchema->s
18f20 63 68 65 6d 61 5f 63 6f 6f 6b 69 65 3b 0a 20 20  chema_cookie;.  
18f30 20 20 20 20 69 66 28 20 21 4f 4d 49 54 5f 54 45      if( !OMIT_TE
18f40 4d 50 44 42 20 26 26 20 69 44 62 3d 3d 31 20 29  MPDB && iDb==1 )
18f50 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
18f60 33 4f 70 65 6e 54 65 6d 70 44 61 74 61 62 61 73  3OpenTempDatabas
18f70 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  e(pParse);.     
18f80 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a   }.    }.  }.}..
18f90 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 56  /*.** Generate V
18fa0 44 42 45 20 63 6f 64 65 20 74 68 61 74 20 70 72  DBE code that pr
18fb0 65 70 61 72 65 73 20 66 6f 72 20 64 6f 69 6e 67  epares for doing
18fc0 20 61 6e 20 6f 70 65 72 61 74 69 6f 6e 20 74 68   an operation th
18fd0 61 74 0a 2a 2a 20 6d 69 67 68 74 20 63 68 61 6e  at.** might chan
18fe0 67 65 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  ge the database.
18ff0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
19000 69 6e 65 20 73 74 61 72 74 73 20 61 20 6e 65 77  ine starts a new
19010 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 66 20   transaction if 
19020 77 65 20 61 72 65 20 6e 6f 74 20 61 6c 72 65 61  we are not alrea
19030 64 79 20 77 69 74 68 69 6e 0a 2a 2a 20 61 20 74  dy within.** a t
19040 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 49 66 20  ransaction.  If 
19050 77 65 20 61 72 65 20 61 6c 72 65 61 64 79 20 77  we are already w
19060 69 74 68 69 6e 20 61 20 74 72 61 6e 73 61 63 74  ithin a transact
19070 69 6f 6e 2c 20 74 68 65 6e 20 61 20 63 68 65 63  ion, then a chec
19080 6b 70 6f 69 6e 74 0a 2a 2a 20 69 73 20 73 65 74  kpoint.** is set
19090 20 69 66 20 74 68 65 20 73 65 74 53 74 61 74 65   if the setState
190a0 6d 65 6e 74 20 70 61 72 61 6d 65 74 65 72 20 69  ment parameter i
190b0 73 20 74 72 75 65 2e 20 20 41 20 63 68 65 63 6b  s true.  A check
190c0 70 6f 69 6e 74 20 73 68 6f 75 6c 64 0a 2a 2a 20  point should.** 
190d0 62 65 20 73 65 74 20 66 6f 72 20 6f 70 65 72 61  be set for opera
190e0 74 69 6f 6e 73 20 74 68 61 74 20 6d 69 67 68 74  tions that might
190f0 20 66 61 69 6c 20 28 64 75 65 20 74 6f 20 61 20   fail (due to a 
19100 63 6f 6e 73 74 72 61 69 6e 74 29 20 70 61 72 74  constraint) part
19110 20 6f 66 0a 2a 2a 20 74 68 65 20 77 61 79 20 74   of.** the way t
19120 68 72 6f 75 67 68 20 61 6e 64 20 77 68 69 63 68  hrough and which
19130 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20 75 6e   will need to un
19140 64 6f 20 73 6f 6d 65 20 77 72 69 74 65 73 20 77  do some writes w
19150 69 74 68 6f 75 74 20 68 61 76 69 6e 67 20 74 6f  ithout having to
19160 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65  .** rollback the
19170 20 77 68 6f 6c 65 20 74 72 61 6e 73 61 63 74 69   whole transacti
19180 6f 6e 2e 20 20 46 6f 72 20 6f 70 65 72 61 74 69  on.  For operati
19190 6f 6e 73 20 77 68 65 72 65 20 61 6c 6c 20 63 6f  ons where all co
191a0 6e 73 74 72 61 69 6e 74 73 0a 2a 2a 20 63 61 6e  nstraints.** can
191b0 20 62 65 20 63 68 65 63 6b 65 64 20 62 65 66 6f   be checked befo
191c0 72 65 20 61 6e 79 20 63 68 61 6e 67 65 73 20 61  re any changes a
191d0 72 65 20 6d 61 64 65 20 74 6f 20 74 68 65 20 64  re made to the d
191e0 61 74 61 62 61 73 65 2c 20 69 74 20 69 73 20 6e  atabase, it is n
191f0 65 76 65 72 0a 2a 2a 20 6e 65 63 65 73 73 61 72  ever.** necessar
19200 79 20 74 6f 20 75 6e 64 6f 20 61 20 77 72 69 74  y to undo a writ
19210 65 20 61 6e 64 20 74 68 65 20 63 68 65 63 6b 70  e and the checkp
19220 6f 69 6e 74 20 73 68 6f 75 6c 64 20 6e 6f 74 20  oint should not 
19230 62 65 20 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 4f 6e  be set..**.** On
19240 6c 79 20 64 61 74 61 62 61 73 65 20 69 44 62 20  ly database iDb 
19250 61 6e 64 20 74 68 65 20 74 65 6d 70 20 64 61 74  and the temp dat
19260 61 62 61 73 65 20 61 72 65 20 6d 61 64 65 20 77  abase are made w
19270 72 69 74 61 62 6c 65 20 62 79 20 74 68 69 73 20  ritable by this 
19280 63 61 6c 6c 2e 0a 2a 2a 20 49 66 20 69 44 62 3d  call..** If iDb=
19290 3d 30 2c 20 74 68 65 6e 20 74 68 65 20 6d 61 69  =0, then the mai
192a0 6e 20 61 6e 64 20 74 65 6d 70 20 64 61 74 61 62  n and temp datab
192b0 61 73 65 73 20 61 72 65 20 6d 61 64 65 20 77 72  ases are made wr
192c0 69 74 61 62 6c 65 2e 20 20 20 49 66 0a 2a 2a 20  itable.   If.** 
192d0 69 44 62 3d 3d 31 20 74 68 65 6e 20 6f 6e 6c 79  iDb==1 then only
192e0 20 74 68 65 20 74 65 6d 70 20 64 61 74 61 62 61   the temp databa
192f0 73 65 20 69 73 20 6d 61 64 65 20 77 72 69 74 61  se is made writa
19300 62 6c 65 2e 20 20 49 66 20 69 44 62 3e 31 20 74  ble.  If iDb>1 t
19310 68 65 6e 20 74 68 65 0a 2a 2a 20 73 70 65 63 69  hen the.** speci
19320 66 69 65 64 20 61 75 78 69 6c 69 61 72 79 20 64  fied auxiliary d
19330 61 74 61 62 61 73 65 20 61 6e 64 20 74 68 65 20  atabase and the 
19340 74 65 6d 70 20 64 61 74 61 62 61 73 65 20 61 72  temp database ar
19350 65 20 6d 61 64 65 20 77 72 69 74 61 62 6c 65 2e  e made writable.
19360 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
19370 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74  BeginWriteOperat
19380 69 6f 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73  ion(Parse *pPars
19390 65 2c 20 69 6e 74 20 73 65 74 53 74 61 74 65 6d  e, int setStatem
193a0 65 6e 74 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20  ent, int iDb){. 
193b0 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74   Vdbe *v = sqlit
193c0 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
193d0 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20  );.  if( v==0 ) 
193e0 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65  return;.  sqlite
193f0 33 43 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d  3CodeVerifySchem
19400 61 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a  a(pParse, iDb);.
19410 20 20 70 50 61 72 73 65 2d 3e 77 72 69 74 65 4d    pParse->writeM
19420 61 73 6b 20 7c 3d 20 31 3c 3c 69 44 62 3b 0a 20  ask |= 1<<iDb;. 
19430 20 69 66 28 20 73 65 74 53 74 61 74 65 6d 65 6e   if( setStatemen
19440 74 20 26 26 20 70 50 61 72 73 65 2d 3e 6e 65 73  t && pParse->nes
19450 74 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  ted==0 ){.    sq
19460 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
19470 2c 20 4f 50 5f 53 74 61 74 65 6d 65 6e 74 2c 20  , OP_Statement, 
19480 69 44 62 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69  iDb, 0);.  }.  i
19490 66 28 20 28 4f 4d 49 54 5f 54 45 4d 50 44 42 20  f( (OMIT_TEMPDB 
194a0 7c 7c 20 69 44 62 21 3d 31 29 20 26 26 20 70 50  || iDb!=1) && pP
194b0 61 72 73 65 2d 3e 64 62 2d 3e 61 44 62 5b 31 5d  arse->db->aDb[1]
194c0 2e 70 42 74 21 3d 30 20 29 7b 0a 20 20 20 20 73  .pBt!=0 ){.    s
194d0 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74 65  qlite3BeginWrite
194e0 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65  Operation(pParse
194f0 2c 20 73 65 74 53 74 61 74 65 6d 65 6e 74 2c 20  , setStatement, 
19500 31 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  1);.  }.}../*.**
19510 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   Check to see if
19520 20 70 49 6e 64 65 78 20 75 73 65 73 20 74 68 65   pIndex uses the
19530 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
19540 6e 63 65 20 70 43 6f 6c 6c 2e 20 20 52 65 74 75  nce pColl.  Retu
19550 72 6e 0a 2a 2a 20 74 72 75 65 20 69 66 20 69 74  rn.** true if it
19560 20 64 6f 65 73 20 61 6e 64 20 66 61 6c 73 65 20   does and false 
19570 69 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 2e 0a  if it does not..
19580 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
19590 45 5f 4f 4d 49 54 5f 52 45 49 4e 44 45 58 0a 73  E_OMIT_REINDEX.s
195a0 74 61 74 69 63 20 69 6e 74 20 63 6f 6c 6c 61 74  tatic int collat
195b0 69 6f 6e 4d 61 74 63 68 28 63 6f 6e 73 74 20 63  ionMatch(const c
195c0 68 61 72 20 2a 7a 43 6f 6c 6c 2c 20 49 6e 64 65  har *zColl, Inde
195d0 78 20 2a 70 49 6e 64 65 78 29 7b 0a 20 20 69 6e  x *pIndex){.  in
195e0 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  t i;.  for(i=0; 
195f0 69 3c 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d  i<pIndex->nColum
19600 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 6f 6e  n; i++){.    con
19610 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 70 49 6e  st char *z = pIn
19620 64 65 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 3b 0a  dex->azColl[i];.
19630 20 20 20 20 69 66 28 20 7a 3d 3d 7a 43 6f 6c 6c      if( z==zColl
19640 20 7c 7c 20 28 7a 20 26 26 20 7a 43 6f 6c 6c 20   || (z && zColl 
19650 26 26 20 30 3d 3d 73 71 6c 69 74 65 33 53 74 72  && 0==sqlite3Str
19660 49 43 6d 70 28 7a 2c 20 7a 43 6f 6c 6c 29 29 20  ICmp(z, zColl)) 
19670 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
19680 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  1;.    }.  }.  r
19690 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69  eturn 0;.}.#endi
196a0 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6f 6d 70 75  f../*.** Recompu
196b0 74 65 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 6f  te all indices o
196c0 66 20 70 54 61 62 20 74 68 61 74 20 75 73 65 20  f pTab that use 
196d0 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  the collating se
196e0 71 75 65 6e 63 65 20 70 43 6f 6c 6c 2e 0a 2a 2a  quence pColl..**
196f0 20 49 66 20 70 43 6f 6c 6c 3d 3d 30 20 74 68 65   If pColl==0 the
19700 6e 20 72 65 63 6f 6d 70 75 74 65 20 61 6c 6c 20  n recompute all 
19710 69 6e 64 69 63 65 73 20 6f 66 20 70 54 61 62 2e  indices of pTab.
19720 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .*/.#ifndef SQLI
19730 54 45 5f 4f 4d 49 54 5f 52 45 49 4e 44 45 58 0a  TE_OMIT_REINDEX.
19740 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 69 6e  static void rein
19750 64 65 78 54 61 62 6c 65 28 50 61 72 73 65 20 2a  dexTable(Parse *
19760 70 50 61 72 73 65 2c 20 54 61 62 6c 65 20 2a 70  pParse, Table *p
19770 54 61 62 2c 20 63 68 61 72 20 63 6f 6e 73 74 20  Tab, char const 
19780 2a 7a 43 6f 6c 6c 29 7b 0a 20 20 49 6e 64 65 78  *zColl){.  Index
19790 20 2a 70 49 6e 64 65 78 3b 20 20 20 20 20 20 20   *pIndex;       
197a0 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 69 6e 64         /* An ind
197b0 65 78 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ex associated wi
197c0 74 68 20 70 54 61 62 20 2a 2f 0a 0a 20 20 66 6f  th pTab */..  fo
197d0 72 28 70 49 6e 64 65 78 3d 70 54 61 62 2d 3e 70  r(pIndex=pTab->p
197e0 49 6e 64 65 78 3b 20 70 49 6e 64 65 78 3b 20 70  Index; pIndex; p
197f0 49 6e 64 65 78 3d 70 49 6e 64 65 78 2d 3e 70 4e  Index=pIndex->pN
19800 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 7a 43  ext){.    if( zC
19810 6f 6c 6c 3d 3d 30 20 7c 7c 20 63 6f 6c 6c 61 74  oll==0 || collat
19820 69 6f 6e 4d 61 74 63 68 28 7a 43 6f 6c 6c 2c 20  ionMatch(zColl, 
19830 70 49 6e 64 65 78 29 20 29 7b 0a 20 20 20 20 20  pIndex) ){.     
19840 20 69 6e 74 20 69 44 62 20 3d 20 73 71 6c 69 74   int iDb = sqlit
19850 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28  e3SchemaToIndex(
19860 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 54 61 62  pParse->db, pTab
19870 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20  ->pSchema);.    
19880 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72    sqlite3BeginWr
19890 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61  iteOperation(pPa
198a0 72 73 65 2c 20 30 2c 20 69 44 62 29 3b 0a 20 20  rse, 0, iDb);.  
198b0 20 20 20 20 73 71 6c 69 74 65 33 52 65 66 69 6c      sqlite3Refil
198c0 6c 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70  lIndex(pParse, p
198d0 49 6e 64 65 78 2c 20 2d 31 29 3b 0a 20 20 20 20  Index, -1);.    
198e0 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a  }.  }.}.#endif..
198f0 2f 2a 0a 2a 2a 20 52 65 63 6f 6d 70 75 74 65 20  /*.** Recompute 
19900 61 6c 6c 20 69 6e 64 69 63 65 73 20 6f 66 20 61  all indices of a
19910 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20 61 6c 6c  ll tables in all
19920 20 64 61 74 61 62 61 73 65 73 20 77 68 65 72 65   databases where
19930 20 74 68 65 0a 2a 2a 20 69 6e 64 69 63 65 73 20   the.** indices 
19940 75 73 65 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e  use the collatin
19950 67 20 73 65 71 75 65 6e 63 65 20 70 43 6f 6c 6c  g sequence pColl
19960 2e 20 20 49 66 20 70 43 6f 6c 6c 3d 3d 30 20 74  .  If pColl==0 t
19970 68 65 6e 20 72 65 63 6f 6d 70 75 74 65 0a 2a 2a  hen recompute.**
19980 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 65 76 65   all indices eve
19990 72 79 77 68 65 72 65 2e 0a 2a 2f 0a 23 69 66 6e  rywhere..*/.#ifn
199a0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
199b0 52 45 49 4e 44 45 58 0a 73 74 61 74 69 63 20 76  REINDEX.static v
199c0 6f 69 64 20 72 65 69 6e 64 65 78 44 61 74 61 62  oid reindexDatab
199d0 61 73 65 73 28 50 61 72 73 65 20 2a 70 50 61 72  ases(Parse *pPar
199e0 73 65 2c 20 63 68 61 72 20 63 6f 6e 73 74 20 2a  se, char const *
199f0 7a 43 6f 6c 6c 29 7b 0a 20 20 44 62 20 2a 70 44  zColl){.  Db *pD
19a00 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
19a10 20 20 20 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c        /* A singl
19a20 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20  e database */.  
19a30 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20 20 20  int iDb;        
19a40 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
19a50 68 65 20 64 61 74 61 62 61 73 65 20 69 6e 64 65  he database inde
19a60 78 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 73 71  x number */.  sq
19a70 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
19a80 73 65 2d 3e 64 62 3b 20 20 20 2f 2a 20 54 68 65  se->db;   /* The
19a90 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
19aa0 74 69 6f 6e 20 2a 2f 0a 20 20 48 61 73 68 45 6c  tion */.  HashEl
19ab0 65 6d 20 2a 6b 3b 20 20 20 20 20 20 20 20 20 20  em *k;          
19ac0 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f        /* For loo
19ad0 70 69 6e 67 20 6f 76 65 72 20 74 61 62 6c 65 73  ping over tables
19ae0 20 69 6e 20 70 44 62 20 2a 2f 0a 20 20 54 61 62   in pDb */.  Tab
19af0 6c 65 20 2a 70 54 61 62 3b 20 20 20 20 20 20 20  le *pTab;       
19b00 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 74 61           /* A ta
19b10 62 6c 65 20 69 6e 20 74 68 65 20 64 61 74 61 62  ble in the datab
19b20 61 73 65 20 2a 2f 0a 0a 20 20 66 6f 72 28 69 44  ase */..  for(iD
19b30 62 3d 30 2c 20 70 44 62 3d 64 62 2d 3e 61 44 62  b=0, pDb=db->aDb
19b40 3b 20 69 44 62 3c 64 62 2d 3e 6e 44 62 3b 20 69  ; iDb<db->nDb; i
19b50 44 62 2b 2b 2c 20 70 44 62 2b 2b 29 7b 0a 20 20  Db++, pDb++){.  
19b60 20 20 61 73 73 65 72 74 28 20 70 44 62 21 3d 30    assert( pDb!=0
19b70 20 29 3b 0a 20 20 20 20 66 6f 72 28 6b 3d 73 71   );.    for(k=sq
19b80 6c 69 74 65 48 61 73 68 46 69 72 73 74 28 26 70  liteHashFirst(&p
19b90 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 74 62 6c  Db->pSchema->tbl
19ba0 48 61 73 68 29 3b 20 20 6b 3b 20 6b 3d 73 71 6c  Hash);  k; k=sql
19bb0 69 74 65 48 61 73 68 4e 65 78 74 28 6b 29 29 7b  iteHashNext(k)){
19bc0 0a 20 20 20 20 20 20 70 54 61 62 20 3d 20 28 54  .      pTab = (T
19bd0 61 62 6c 65 2a 29 73 71 6c 69 74 65 48 61 73 68  able*)sqliteHash
19be0 44 61 74 61 28 6b 29 3b 0a 20 20 20 20 20 20 72  Data(k);.      r
19bf0 65 69 6e 64 65 78 54 61 62 6c 65 28 70 50 61 72  eindexTable(pPar
19c00 73 65 2c 20 70 54 61 62 2c 20 7a 43 6f 6c 6c 29  se, pTab, zColl)
19c10 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65  ;.    }.  }.}.#e
19c20 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  ndif../*.** Gene
19c30 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 74 68  rate code for th
19c40 65 20 52 45 49 4e 44 45 58 20 63 6f 6d 6d 61 6e  e REINDEX comman
19c50 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20  d..**.**        
19c60 52 45 49 4e 44 45 58 20 20 20 20 20 20 20 20 20  REINDEX         
19c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19c80 20 20 20 2d 2d 20 31 0a 2a 2a 20 20 20 20 20 20     -- 1.**      
19c90 20 20 52 45 49 4e 44 45 58 20 20 3c 63 6f 6c 6c    REINDEX  <coll
19ca0 61 74 69 6f 6e 3e 20 20 20 20 20 20 20 20 20 20  ation>          
19cb0 20 20 20 20 20 2d 2d 20 32 0a 2a 2a 20 20 20 20       -- 2.**    
19cc0 20 20 20 20 52 45 49 4e 44 45 58 20 20 3f 3c 64      REINDEX  ?<d
19cd0 61 74 61 62 61 73 65 3e 2e 3f 3c 74 61 62 6c 65  atabase>.?<table
19ce0 6e 61 6d 65 3e 20 20 2d 2d 20 33 0a 2a 2a 20 20  name>  -- 3.**  
19cf0 20 20 20 20 20 20 52 45 49 4e 44 45 58 20 20 3f        REINDEX  ?
19d00 3c 64 61 74 61 62 61 73 65 3e 2e 3f 3c 69 6e 64  <database>.?<ind
19d10 65 78 6e 61 6d 65 3e 20 20 2d 2d 20 34 0a 2a 2a  exname>  -- 4.**
19d20 0a 2a 2a 20 46 6f 72 6d 20 31 20 63 61 75 73 65  .** Form 1 cause
19d30 73 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 69 6e  s all indices in
19d40 20 61 6c 6c 20 61 74 74 61 63 68 65 64 20 64 61   all attached da
19d50 74 61 62 61 73 65 73 20 74 6f 20 62 65 20 72 65  tabases to be re
19d60 62 75 69 6c 74 2e 0a 2a 2a 20 46 6f 72 6d 20 32  built..** Form 2
19d70 20 72 65 62 75 69 6c 64 73 20 61 6c 6c 20 69 6e   rebuilds all in
19d80 64 69 63 65 73 20 69 6e 20 61 6c 6c 20 64 61 74  dices in all dat
19d90 61 62 61 73 65 73 20 74 68 61 74 20 75 73 65 20  abases that use 
19da0 74 68 65 20 6e 61 6d 65 64 0a 2a 2a 20 63 6f 6c  the named.** col
19db0 6c 61 74 69 6e 67 20 66 75 6e 63 74 69 6f 6e 2e  lating function.
19dc0 20 20 46 6f 72 6d 73 20 33 20 61 6e 64 20 34 20    Forms 3 and 4 
19dd0 72 65 62 75 69 6c 64 20 74 68 65 20 6e 61 6d 65  rebuild the name
19de0 64 20 69 6e 64 65 78 20 6f 72 20 61 6c 6c 0a 2a  d index or all.*
19df0 2a 20 69 6e 64 69 63 65 73 20 61 73 73 6f 63 69  * indices associ
19e00 61 74 65 64 20 77 69 74 68 20 74 68 65 20 6e 61  ated with the na
19e10 6d 65 64 20 74 61 62 6c 65 2e 0a 2a 2f 0a 23 69  med table..*/.#i
19e20 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
19e30 54 5f 52 45 49 4e 44 45 58 0a 76 6f 69 64 20 73  T_REINDEX.void s
19e40 71 6c 69 74 65 33 52 65 69 6e 64 65 78 28 50 61  qlite3Reindex(Pa
19e50 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b  rse *pParse, Tok
19e60 65 6e 20 2a 70 4e 61 6d 65 31 2c 20 54 6f 6b 65  en *pName1, Toke
19e70 6e 20 2a 70 4e 61 6d 65 32 29 7b 0a 20 20 43 6f  n *pName2){.  Co
19e80 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 20 20 20  llSeq *pColl;   
19e90 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c            /* Col
19ea0 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20  lating sequence 
19eb0 74 6f 20 62 65 20 72 65 69 6e 64 65 78 65 64 2c  to be reindexed,
19ec0 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 63 68   or NULL */.  ch
19ed0 61 72 20 2a 7a 3b 20 20 20 20 20 20 20 20 20 20  ar *z;          
19ee0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
19ef0 65 20 6f 66 20 61 20 74 61 62 6c 65 20 6f 72 20  e of a table or 
19f00 69 6e 64 65 78 20 2a 2f 0a 20 20 63 6f 6e 73 74  index */.  const
19f10 20 63 68 61 72 20 2a 7a 44 62 3b 20 20 20 20 20   char *zDb;     
19f20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
19f30 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 2a  f the database *
19f40 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b  /.  Table *pTab;
19f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19f60 2f 2a 20 41 20 74 61 62 6c 65 20 69 6e 20 74 68  /* A table in th
19f70 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20  e database */.  
19f80 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b 20 20  Index *pIndex;  
19f90 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
19fa0 6e 20 69 6e 64 65 78 20 61 73 73 6f 63 69 61 74  n index associat
19fb0 65 64 20 77 69 74 68 20 70 54 61 62 20 2a 2f 0a  ed with pTab */.
19fc0 20 20 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20    int iDb;      
19fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
19fe0 20 54 68 65 20 64 61 74 61 62 61 73 65 20 69 6e   The database in
19ff0 64 65 78 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20  dex number */.  
1a000 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
1a010 61 72 73 65 2d 3e 64 62 3b 20 20 20 2f 2a 20 54  arse->db;   /* T
1a020 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  he database conn
1a030 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 6f 6b 65  ection */.  Toke
1a040 6e 20 2a 70 4f 62 6a 4e 61 6d 65 3b 20 20 20 20  n *pObjName;    
1a050 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
1a060 6f 66 20 74 68 65 20 74 61 62 6c 65 20 6f 72 20  of the table or 
1a070 69 6e 64 65 78 20 74 6f 20 62 65 20 72 65 69 6e  index to be rein
1a080 64 65 78 65 64 20 2a 2f 0a 0a 20 20 2f 2a 20 52  dexed */..  /* R
1a090 65 61 64 20 74 68 65 20 64 61 74 61 62 61 73 65  ead the database
1a0a0 20 73 63 68 65 6d 61 2e 20 49 66 20 61 6e 20 65   schema. If an e
1a0b0 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 6c 65 61  rror occurs, lea
1a0c0 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73  ve an error mess
1a0d0 61 67 65 0a 20 20 2a 2a 20 61 6e 64 20 63 6f 64  age.  ** and cod
1a0e0 65 20 69 6e 20 70 50 61 72 73 65 20 61 6e 64 20  e in pParse and 
1a0f0 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 20 2a 2f 0a  return NULL. */.
1a100 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21    if( SQLITE_OK!
1a110 3d 73 71 6c 69 74 65 33 52 65 61 64 53 63 68 65  =sqlite3ReadSche
1a120 6d 61 28 70 50 61 72 73 65 29 20 29 7b 0a 20 20  ma(pParse) ){.  
1a130 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20    return;.  }.. 
1a140 20 69 66 28 20 70 4e 61 6d 65 31 3d 3d 30 20 7c   if( pName1==0 |
1a150 7c 20 70 4e 61 6d 65 31 2d 3e 7a 3d 3d 30 20 29  | pName1->z==0 )
1a160 7b 0a 20 20 20 20 72 65 69 6e 64 65 78 44 61 74  {.    reindexDat
1a170 61 62 61 73 65 73 28 70 50 61 72 73 65 2c 20 30  abases(pParse, 0
1a180 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  );.    return;. 
1a190 20 7d 65 6c 73 65 20 69 66 28 20 70 4e 61 6d 65   }else if( pName
1a1a0 32 3d 3d 30 20 7c 7c 20 70 4e 61 6d 65 32 2d 3e  2==0 || pName2->
1a1b0 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65  z==0 ){.    asse
1a1c0 72 74 28 20 70 4e 61 6d 65 31 2d 3e 7a 20 29 3b  rt( pName1->z );
1a1d0 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c  .    pColl = sql
1a1e0 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28  ite3FindCollSeq(
1a1f0 64 62 2c 20 45 4e 43 28 64 62 29 2c 20 28 63 68  db, ENC(db), (ch
1a200 61 72 2a 29 70 4e 61 6d 65 31 2d 3e 7a 2c 20 70  ar*)pName1->z, p
1a210 4e 61 6d 65 31 2d 3e 6e 2c 20 30 29 3b 0a 20 20  Name1->n, 0);.  
1a220 20 20 69 66 28 20 70 43 6f 6c 6c 20 29 7b 0a 20    if( pColl ){. 
1a230 20 20 20 20 20 63 68 61 72 20 2a 7a 43 6f 6c 6c       char *zColl
1a240 20 3d 20 73 71 6c 69 74 65 53 74 72 4e 44 75 70   = sqliteStrNDup
1a250 28 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 70  ((const char *)p
1a260 4e 61 6d 65 31 2d 3e 7a 2c 20 70 4e 61 6d 65 31  Name1->z, pName1
1a270 2d 3e 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ->n);.      if( 
1a280 7a 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20  zColl ){.       
1a290 20 72 65 69 6e 64 65 78 44 61 74 61 62 61 73 65   reindexDatabase
1a2a0 73 28 70 50 61 72 73 65 2c 20 7a 43 6f 6c 6c 29  s(pParse, zColl)
1a2b0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
1a2c0 46 72 65 65 28 7a 43 6f 6c 6c 29 3b 0a 20 20 20  Free(zColl);.   
1a2d0 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72     }.      retur
1a2e0 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  n;.    }.  }.  i
1a2f0 44 62 20 3d 20 73 71 6c 69 74 65 33 54 77 6f 50  Db = sqlite3TwoP
1a300 61 72 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20  artName(pParse, 
1a310 70 4e 61 6d 65 31 2c 20 70 4e 61 6d 65 32 2c 20  pName1, pName2, 
1a320 26 70 4f 62 6a 4e 61 6d 65 29 3b 0a 20 20 69 66  &pObjName);.  if
1a330 28 20 69 44 62 3c 30 20 29 20 72 65 74 75 72 6e  ( iDb<0 ) return
1a340 3b 0a 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 4e  ;.  z = sqlite3N
1a350 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 4f 62  ameFromToken(pOb
1a360 6a 4e 61 6d 65 29 3b 0a 20 20 7a 44 62 20 3d 20  jName);.  zDb = 
1a370 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61  db->aDb[iDb].zNa
1a380 6d 65 3b 0a 20 20 70 54 61 62 20 3d 20 73 71 6c  me;.  pTab = sql
1a390 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28 64 62  ite3FindTable(db
1a3a0 2c 20 7a 2c 20 7a 44 62 29 3b 0a 20 20 69 66 28  , z, zDb);.  if(
1a3b0 20 70 54 61 62 20 29 7b 0a 20 20 20 20 72 65 69   pTab ){.    rei
1a3c0 6e 64 65 78 54 61 62 6c 65 28 70 50 61 72 73 65  ndexTable(pParse
1a3d0 2c 20 70 54 61 62 2c 20 30 29 3b 0a 20 20 20 20  , pTab, 0);.    
1a3e0 73 71 6c 69 74 65 46 72 65 65 28 7a 29 3b 0a 20  sqliteFree(z);. 
1a3f0 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
1a400 20 70 49 6e 64 65 78 20 3d 20 73 71 6c 69 74 65   pIndex = sqlite
1a410 33 46 69 6e 64 49 6e 64 65 78 28 64 62 2c 20 7a  3FindIndex(db, z
1a420 2c 20 7a 44 62 29 3b 0a 20 20 73 71 6c 69 74 65  , zDb);.  sqlite
1a430 46 72 65 65 28 7a 29 3b 0a 20 20 69 66 28 20 70  Free(z);.  if( p
1a440 49 6e 64 65 78 20 29 7b 0a 20 20 20 20 73 71 6c  Index ){.    sql
1a450 69 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70  ite3BeginWriteOp
1a460 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20  eration(pParse, 
1a470 30 2c 20 69 44 62 29 3b 0a 20 20 20 20 73 71 6c  0, iDb);.    sql
1a480 69 74 65 33 52 65 66 69 6c 6c 49 6e 64 65 78 28  ite3RefillIndex(
1a490 70 50 61 72 73 65 2c 20 70 49 6e 64 65 78 2c 20  pParse, pIndex, 
1a4a0 2d 31 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b  -1);.    return;
1a4b0 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 72  .  }.  sqlite3Er
1a4c0 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
1a4d0 75 6e 61 62 6c 65 20 74 6f 20 69 64 65 6e 74 69  unable to identi
1a4e0 66 79 20 74 68 65 20 6f 62 6a 65 63 74 20 74 6f  fy the object to
1a4f0 20 62 65 20 72 65 69 6e 64 65 78 65 64 22 29 3b   be reindexed");
1a500 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
1a510 20 52 65 74 75 72 6e 20 61 20 64 79 6e 61 6d 69   Return a dynami
1a520 63 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 4b 65  cly allocated Ke
1a530 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20  yInfo structure 
1a540 74 68 61 74 20 63 61 6e 20 62 65 20 75 73 65 64  that can be used
1a550 0a 2a 2a 20 77 69 74 68 20 4f 50 5f 4f 70 65 6e  .** with OP_Open
1a560 52 65 61 64 20 6f 72 20 4f 50 5f 4f 70 65 6e 57  Read or OP_OpenW
1a570 72 69 74 65 20 74 6f 20 61 63 63 65 73 73 20 64  rite to access d
1a580 61 74 61 62 61 73 65 20 69 6e 64 65 78 20 70 49  atabase index pI
1a590 64 78 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63  dx..**.** If suc
1a5a0 63 65 73 73 66 75 6c 2c 20 61 20 70 6f 69 6e 74  cessful, a point
1a5b0 65 72 20 74 6f 20 74 68 65 20 6e 65 77 20 73 74  er to the new st
1a5c0 72 75 63 74 75 72 65 20 69 73 20 72 65 74 75 72  ructure is retur
1a5d0 6e 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ned. In this cas
1a5e0 65 0a 2a 2a 20 74 68 65 20 63 61 6c 6c 65 72 20  e.** the caller 
1a5f0 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66  is responsible f
1a600 6f 72 20 63 61 6c 6c 69 6e 67 20 73 71 6c 69 74  or calling sqlit
1a610 65 46 72 65 65 28 29 20 6f 6e 20 74 68 65 20 72  eFree() on the r
1a620 65 74 75 72 6e 65 64 20 0a 2a 2a 20 70 6f 69 6e  eturned .** poin
1a630 74 65 72 2e 20 49 66 20 61 6e 20 65 72 72 6f 72  ter. If an error
1a640 20 6f 63 63 75 72 73 20 28 6f 75 74 20 6f 66 20   occurs (out of 
1a650 6d 65 6d 6f 72 79 20 6f 72 20 6d 69 73 73 69 6e  memory or missin
1a660 67 20 63 6f 6c 6c 61 74 69 6f 6e 20 0a 2a 2a 20  g collation .** 
1a670 73 65 71 75 65 6e 63 65 29 2c 20 4e 55 4c 4c 20  sequence), NULL 
1a680 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20  is returned and 
1a690 74 68 65 20 73 74 61 74 65 20 6f 66 20 70 50 61  the state of pPa
1a6a0 72 73 65 20 75 70 64 61 74 65 64 20 74 6f 20 72  rse updated to r
1a6b0 65 66 6c 65 63 74 0a 2a 2a 20 74 68 65 20 65 72  eflect.** the er
1a6c0 72 6f 72 2e 0a 2a 2f 0a 4b 65 79 49 6e 66 6f 20  ror..*/.KeyInfo 
1a6d0 2a 73 71 6c 69 74 65 33 49 6e 64 65 78 4b 65 79  *sqlite3IndexKey
1a6e0 69 6e 66 6f 28 50 61 72 73 65 20 2a 70 50 61 72  info(Parse *pPar
1a6f0 73 65 2c 20 49 6e 64 65 78 20 2a 70 49 64 78 29  se, Index *pIdx)
1a700 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74  {.  int i;.  int
1a710 20 6e 43 6f 6c 20 3d 20 70 49 64 78 2d 3e 6e 43   nCol = pIdx->nC
1a720 6f 6c 75 6d 6e 3b 0a 20 20 69 6e 74 20 6e 42 79  olumn;.  int nBy
1a730 74 65 73 20 3d 20 73 69 7a 65 6f 66 28 4b 65 79  tes = sizeof(Key
1a740 49 6e 66 6f 29 20 2b 20 28 6e 43 6f 6c 2d 31 29  Info) + (nCol-1)
1a750 2a 73 69 7a 65 6f 66 28 43 6f 6c 6c 53 65 71 2a  *sizeof(CollSeq*
1a760 29 20 2b 20 6e 43 6f 6c 3b 0a 20 20 4b 65 79 49  ) + nCol;.  KeyI
1a770 6e 66 6f 20 2a 70 4b 65 79 20 3d 20 28 4b 65 79  nfo *pKey = (Key
1a780 49 6e 66 6f 20 2a 29 73 71 6c 69 74 65 4d 61 6c  Info *)sqliteMal
1a790 6c 6f 63 28 6e 42 79 74 65 73 29 3b 0a 0a 20 20  loc(nBytes);..  
1a7a0 69 66 28 20 70 4b 65 79 20 29 7b 0a 20 20 20 20  if( pKey ){.    
1a7b0 70 4b 65 79 2d 3e 61 53 6f 72 74 4f 72 64 65 72  pKey->aSortOrder
1a7c0 20 3d 20 28 75 38 20 2a 29 26 28 70 4b 65 79 2d   = (u8 *)&(pKey-
1a7d0 3e 61 43 6f 6c 6c 5b 6e 43 6f 6c 5d 29 3b 0a 20  >aColl[nCol]);. 
1a7e0 20 20 20 61 73 73 65 72 74 28 20 26 70 4b 65 79     assert( &pKey
1a7f0 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 6e 43 6f  ->aSortOrder[nCo
1a800 6c 5d 3d 3d 26 28 28 28 75 38 20 2a 29 70 4b 65  l]==&(((u8 *)pKe
1a810 79 29 5b 6e 42 79 74 65 73 5d 29 20 29 3b 0a 20  y)[nBytes]) );. 
1a820 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43     for(i=0; i<nC
1a830 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ol; i++){.      
1a840 63 68 61 72 20 2a 7a 43 6f 6c 6c 20 3d 20 70 49  char *zColl = pI
1a850 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 3b 0a 20  dx->azColl[i];. 
1a860 20 20 20 20 20 61 73 73 65 72 74 28 20 7a 43 6f       assert( zCo
1a870 6c 6c 20 29 3b 0a 20 20 20 20 20 20 70 4b 65 79  ll );.      pKey
1a880 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d 20 73 71 6c  ->aColl[i] = sql
1a890 69 74 65 33 4c 6f 63 61 74 65 43 6f 6c 6c 53 65  ite3LocateCollSe
1a8a0 71 28 70 50 61 72 73 65 2c 20 7a 43 6f 6c 6c 2c  q(pParse, zColl,
1a8b0 20 2d 31 29 3b 0a 20 20 20 20 20 20 70 4b 65 79   -1);.      pKey
1a8c0 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20  ->aSortOrder[i] 
1a8d0 3d 20 70 49 64 78 2d 3e 61 53 6f 72 74 4f 72 64  = pIdx->aSortOrd
1a8e0 65 72 5b 69 5d 3b 0a 20 20 20 20 7d 0a 20 20 20  er[i];.    }.   
1a8f0 20 70 4b 65 79 2d 3e 6e 46 69 65 6c 64 20 3d 20   pKey->nField = 
1a900 6e 43 6f 6c 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  nCol;.  }..  if(
1a910 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 7b   pParse->nErr ){
1a920 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28  .    sqliteFree(
1a930 70 4b 65 79 29 3b 0a 20 20 20 20 70 4b 65 79 20  pKey);.    pKey 
1a940 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 0;.  }.  retur
1a950 6e 20 70 4b 65 79 3b 0a 7d 0a                    n pKey;.}.