/ Hex Artifact Content
Login

Artifact 77d5518a64c0a905024bee80f6df2e794f4f5d43:


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 39 31 20 32 30 30 38 2f 30 37 2f 32 38  1.491 2008/07/28
02f0: 20 31 39 3a 33 34 3a 35 33 20 64 72 68 20 45 78   19:34:53 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 69 44 62  k *p;..  if( iDb
08e0: 3c 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  <0 ){.    return
08f0: 3b 0a 20 20 7d 0a 0a 20 20 66 6f 72 28 69 3d 30  ;.  }..  for(i=0
0900: 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e 54 61 62  ; i<pParse->nTab
0910: 6c 65 4c 6f 63 6b 3b 20 69 2b 2b 29 7b 0a 20 20  leLock; i++){.  
0920: 20 20 70 20 3d 20 26 70 50 61 72 73 65 2d 3e 61    p = &pParse->a
0930: 54 61 62 6c 65 4c 6f 63 6b 5b 69 5d 3b 0a 20 20  TableLock[i];.  
0940: 20 20 69 66 28 20 70 2d 3e 69 44 62 3d 3d 69 44    if( p->iDb==iD
0950: 62 20 26 26 20 70 2d 3e 69 54 61 62 3d 3d 69 54  b && p->iTab==iT
0960: 61 62 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 69  ab ){.      p->i
0970: 73 57 72 69 74 65 4c 6f 63 6b 20 3d 20 28 70 2d  sWriteLock = (p-
0980: 3e 69 73 57 72 69 74 65 4c 6f 63 6b 20 7c 7c 20  >isWriteLock || 
0990: 69 73 57 72 69 74 65 4c 6f 63 6b 29 3b 0a 20 20  isWriteLock);.  
09a0: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
09b0: 7d 0a 20 20 7d 0a 0a 20 20 6e 42 79 74 65 73 20  }.  }..  nBytes 
09c0: 3d 20 73 69 7a 65 6f 66 28 54 61 62 6c 65 4c 6f  = sizeof(TableLo
09d0: 63 6b 29 20 2a 20 28 70 50 61 72 73 65 2d 3e 6e  ck) * (pParse->n
09e0: 54 61 62 6c 65 4c 6f 63 6b 2b 31 29 3b 0a 20 20  TableLock+1);.  
09f0: 70 50 61 72 73 65 2d 3e 61 54 61 62 6c 65 4c 6f  pParse->aTableLo
0a00: 63 6b 20 3d 20 0a 20 20 20 20 20 20 73 71 6c 69  ck = .      sqli
0a10: 74 65 33 44 62 52 65 61 6c 6c 6f 63 4f 72 46 72  te3DbReallocOrFr
0a20: 65 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  ee(pParse->db, p
0a30: 50 61 72 73 65 2d 3e 61 54 61 62 6c 65 4c 6f 63  Parse->aTableLoc
0a40: 6b 2c 20 6e 42 79 74 65 73 29 3b 0a 20 20 69 66  k, nBytes);.  if
0a50: 28 20 70 50 61 72 73 65 2d 3e 61 54 61 62 6c 65  ( pParse->aTable
0a60: 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 70 20 3d 20  Lock ){.    p = 
0a70: 26 70 50 61 72 73 65 2d 3e 61 54 61 62 6c 65 4c  &pParse->aTableL
0a80: 6f 63 6b 5b 70 50 61 72 73 65 2d 3e 6e 54 61 62  ock[pParse->nTab
0a90: 6c 65 4c 6f 63 6b 2b 2b 5d 3b 0a 20 20 20 20 70  leLock++];.    p
0aa0: 2d 3e 69 44 62 20 3d 20 69 44 62 3b 0a 20 20 20  ->iDb = iDb;.   
0ab0: 20 70 2d 3e 69 54 61 62 20 3d 20 69 54 61 62 3b   p->iTab = iTab;
0ac0: 0a 20 20 20 20 70 2d 3e 69 73 57 72 69 74 65 4c  .    p->isWriteL
0ad0: 6f 63 6b 20 3d 20 69 73 57 72 69 74 65 4c 6f 63  ock = isWriteLoc
0ae0: 6b 3b 0a 20 20 20 20 70 2d 3e 7a 4e 61 6d 65 20  k;.    p->zName 
0af0: 3d 20 7a 4e 61 6d 65 3b 0a 20 20 7d 65 6c 73 65  = zName;.  }else
0b00: 7b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 54  {.    pParse->nT
0b10: 61 62 6c 65 4c 6f 63 6b 20 3d 20 30 3b 0a 20 20  ableLock = 0;.  
0b20: 20 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61    pParse->db->ma
0b30: 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a  llocFailed = 1;.
0b40: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64    }.}../*.** Cod
0b50: 65 20 61 6e 20 4f 50 5f 54 61 62 6c 65 4c 6f 63  e an OP_TableLoc
0b60: 6b 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 66 6f  k instruction fo
0b70: 72 20 65 61 63 68 20 74 61 62 6c 65 20 6c 6f 63  r each table loc
0b80: 6b 65 64 20 62 79 20 74 68 65 0a 2a 2a 20 73 74  ked by the.** st
0b90: 61 74 65 6d 65 6e 74 20 28 63 6f 6e 66 69 67 75  atement (configu
0ba0: 72 65 64 20 62 79 20 63 61 6c 6c 73 20 74 6f 20  red by calls to 
0bb0: 73 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b  sqlite3TableLock
0bc0: 28 29 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ())..*/.static v
0bd0: 6f 69 64 20 63 6f 64 65 54 61 62 6c 65 4c 6f 63  oid codeTableLoc
0be0: 6b 73 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ks(Parse *pParse
0bf0: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 56 64  ){.  int i;.  Vd
0c00: 62 65 20 2a 70 56 64 62 65 3b 20 0a 0a 20 20 69  be *pVdbe; ..  i
0c10: 66 28 20 30 3d 3d 28 70 56 64 62 65 20 3d 20 73  f( 0==(pVdbe = s
0c20: 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
0c30: 61 72 73 65 29 29 20 29 7b 0a 20 20 20 20 72 65  arse)) ){.    re
0c40: 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 66 6f 72  turn;.  }..  for
0c50: 28 69 3d 30 3b 20 69 3c 70 50 61 72 73 65 2d 3e  (i=0; i<pParse->
0c60: 6e 54 61 62 6c 65 4c 6f 63 6b 3b 20 69 2b 2b 29  nTableLock; i++)
0c70: 7b 0a 20 20 20 20 54 61 62 6c 65 4c 6f 63 6b 20  {.    TableLock 
0c80: 2a 70 20 3d 20 26 70 50 61 72 73 65 2d 3e 61 54  *p = &pParse->aT
0c90: 61 62 6c 65 4c 6f 63 6b 5b 69 5d 3b 0a 20 20 20  ableLock[i];.   
0ca0: 20 69 6e 74 20 70 31 20 3d 20 70 2d 3e 69 44 62   int p1 = p->iDb
0cb0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
0cc0: 65 41 64 64 4f 70 34 28 70 56 64 62 65 2c 20 4f  eAddOp4(pVdbe, O
0cd0: 50 5f 54 61 62 6c 65 4c 6f 63 6b 2c 20 70 31 2c  P_TableLock, p1,
0ce0: 20 70 2d 3e 69 54 61 62 2c 20 70 2d 3e 69 73 57   p->iTab, p->isW
0cf0: 72 69 74 65 4c 6f 63 6b 2c 0a 20 20 20 20 20 20  riteLock,.      
0d00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0d10: 70 2d 3e 7a 4e 61 6d 65 2c 20 50 34 5f 53 54 41  p->zName, P4_STA
0d20: 54 49 43 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73  TIC);.  }.}.#els
0d30: 65 0a 20 20 23 64 65 66 69 6e 65 20 63 6f 64 65  e.  #define code
0d40: 54 61 62 6c 65 4c 6f 63 6b 73 28 78 29 0a 23 65  TableLocks(x).#e
0d50: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ndif../*.** This
0d60: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
0d70: 65 64 20 61 66 74 65 72 20 61 20 73 69 6e 67 6c  ed after a singl
0d80: 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20  e SQL statement 
0d90: 68 61 73 20 62 65 65 6e 0a 2a 2a 20 70 61 72 73  has been.** pars
0da0: 65 64 20 61 6e 64 20 61 20 56 44 42 45 20 70 72  ed and a VDBE pr
0db0: 6f 67 72 61 6d 20 74 6f 20 65 78 65 63 75 74 65  ogram to execute
0dc0: 20 74 68 61 74 20 73 74 61 74 65 6d 65 6e 74 20   that statement 
0dd0: 68 61 73 20 62 65 65 6e 0a 2a 2a 20 70 72 65 70  has been.** prep
0de0: 61 72 65 64 2e 20 20 54 68 69 73 20 72 6f 75 74  ared.  This rout
0df0: 69 6e 65 20 70 75 74 73 20 74 68 65 20 66 69 6e  ine puts the fin
0e00: 69 73 68 69 6e 67 20 74 6f 75 63 68 65 73 20 6f  ishing touches o
0e10: 6e 20 74 68 65 0a 2a 2a 20 56 44 42 45 20 70 72  n the.** VDBE pr
0e20: 6f 67 72 61 6d 20 61 6e 64 20 72 65 73 65 74 73  ogram and resets
0e30: 20 74 68 65 20 70 50 61 72 73 65 20 73 74 72 75   the pParse stru
0e40: 63 74 75 72 65 20 66 6f 72 20 74 68 65 20 6e 65  cture for the ne
0e50: 78 74 0a 2a 2a 20 70 61 72 73 65 2e 0a 2a 2a 0a  xt.** parse..**.
0e60: 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 69 66 20  ** Note that if 
0e70: 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65  an error occurre
0e80: 64 2c 20 69 74 20 6d 69 67 68 74 20 62 65 20 74  d, it might be t
0e90: 68 65 20 63 61 73 65 20 74 68 61 74 0a 2a 2a 20  he case that.** 
0ea0: 6e 6f 20 56 44 42 45 20 63 6f 64 65 20 77 61 73  no VDBE code was
0eb0: 20 67 65 6e 65 72 61 74 65 64 2e 0a 2a 2f 0a 76   generated..*/.v
0ec0: 6f 69 64 20 73 71 6c 69 74 65 33 46 69 6e 69 73  oid sqlite3Finis
0ed0: 68 43 6f 64 69 6e 67 28 50 61 72 73 65 20 2a 70  hCoding(Parse *p
0ee0: 50 61 72 73 65 29 7b 0a 20 20 73 71 6c 69 74 65  Parse){.  sqlite
0ef0: 33 20 2a 64 62 3b 0a 20 20 56 64 62 65 20 2a 76  3 *db;.  Vdbe *v
0f00: 3b 0a 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65  ;..  db = pParse
0f10: 2d 3e 64 62 3b 0a 20 20 69 66 28 20 64 62 2d 3e  ->db;.  if( db->
0f20: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72  mallocFailed ) r
0f30: 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 50 61  eturn;.  if( pPa
0f40: 72 73 65 2d 3e 6e 65 73 74 65 64 20 29 20 72 65  rse->nested ) re
0f50: 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 50 61 72  turn;.  if( pPar
0f60: 73 65 2d 3e 6e 45 72 72 20 29 20 72 65 74 75 72  se->nErr ) retur
0f70: 6e 3b 0a 20 20 69 66 28 20 21 70 50 61 72 73 65  n;.  if( !pParse
0f80: 2d 3e 70 56 64 62 65 20 29 7b 0a 20 20 20 20 69  ->pVdbe ){.    i
0f90: 66 28 20 70 50 61 72 73 65 2d 3e 72 63 3d 3d 53  f( pParse->rc==S
0fa0: 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 61 72  QLITE_OK && pPar
0fb0: 73 65 2d 3e 6e 45 72 72 20 29 7b 0a 20 20 20 20  se->nErr ){.    
0fc0: 20 20 70 50 61 72 73 65 2d 3e 72 63 20 3d 20 53    pParse->rc = S
0fd0: 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20  QLITE_ERROR;.   
0fe0: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d     return;.    }
0ff0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42 65 67 69 6e  .  }..  /* Begin
1000: 20 62 79 20 67 65 6e 65 72 61 74 69 6e 67 20 73   by generating s
1010: 6f 6d 65 20 74 65 72 6d 69 6e 61 74 69 6f 6e 20  ome termination 
1020: 63 6f 64 65 20 61 74 20 74 68 65 20 65 6e 64 20  code at the end 
1030: 6f 66 20 74 68 65 0a 20 20 2a 2a 20 76 64 62 65  of the.  ** vdbe
1040: 20 70 72 6f 67 72 61 6d 0a 20 20 2a 2f 0a 20 20   program.  */.  
1050: 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
1060: 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66  be(pParse);.  if
1070: 28 20 76 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ( v ){.    sqlit
1080: 65 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20  e3VdbeAddOp0(v, 
1090: 4f 50 5f 48 61 6c 74 29 3b 0a 0a 20 20 20 20 2f  OP_Halt);..    /
10a0: 2a 20 54 68 65 20 63 6f 6f 6b 69 65 20 6d 61 73  * The cookie mas
10b0: 6b 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 65 20 62  k contains one b
10c0: 69 74 20 66 6f 72 20 65 61 63 68 20 64 61 74 61  it for each data
10d0: 62 61 73 65 20 66 69 6c 65 20 6f 70 65 6e 2e 0a  base file open..
10e0: 20 20 20 20 2a 2a 20 28 42 69 74 20 30 20 69 73      ** (Bit 0 is
10f0: 20 66 6f 72 20 6d 61 69 6e 2c 20 62 69 74 20 31   for main, bit 1
1100: 20 69 73 20 66 6f 72 20 74 65 6d 70 2c 20 61 6e   is for temp, an
1110: 64 20 73 6f 20 66 6f 72 74 68 2e 29 20 20 42 69  d so forth.)  Bi
1120: 74 73 20 61 72 65 0a 20 20 20 20 2a 2a 20 73 65  ts are.    ** se
1130: 74 20 66 6f 72 20 65 61 63 68 20 64 61 74 61 62  t for each datab
1140: 61 73 65 20 74 68 61 74 20 69 73 20 75 73 65 64  ase that is used
1150: 2e 20 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  .  Generate code
1160: 20 74 6f 20 73 74 61 72 74 20 61 0a 20 20 20 20   to start a.    
1170: 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f  ** transaction o
1180: 6e 20 65 61 63 68 20 75 73 65 64 20 64 61 74 61  n each used data
1190: 62 61 73 65 20 61 6e 64 20 74 6f 20 76 65 72 69  base and to veri
11a0: 66 79 20 74 68 65 20 73 63 68 65 6d 61 20 63 6f  fy the schema co
11b0: 6f 6b 69 65 0a 20 20 20 20 2a 2a 20 6f 6e 20 65  okie.    ** on e
11c0: 61 63 68 20 75 73 65 64 20 64 61 74 61 62 61 73  ach used databas
11d0: 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  e..    */.    if
11e0: 28 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65  ( pParse->cookie
11f0: 47 6f 74 6f 3e 30 20 29 7b 0a 20 20 20 20 20 20  Goto>0 ){.      
1200: 75 33 32 20 6d 61 73 6b 3b 0a 20 20 20 20 20 20  u32 mask;.      
1210: 69 6e 74 20 69 44 62 3b 0a 20 20 20 20 20 20 73  int iDb;.      s
1220: 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
1230: 72 65 28 76 2c 20 70 50 61 72 73 65 2d 3e 63 6f  re(v, pParse->co
1240: 6f 6b 69 65 47 6f 74 6f 2d 31 29 3b 0a 20 20 20  okieGoto-1);.   
1250: 20 20 20 66 6f 72 28 69 44 62 3d 30 2c 20 6d 61     for(iDb=0, ma
1260: 73 6b 3d 31 3b 20 69 44 62 3c 64 62 2d 3e 6e 44  sk=1; iDb<db->nD
1270: 62 3b 20 6d 61 73 6b 3c 3c 3d 31 2c 20 69 44 62  b; mask<<=1, iDb
1280: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ++){.        if(
1290: 20 28 6d 61 73 6b 20 26 20 70 50 61 72 73 65 2d   (mask & pParse-
12a0: 3e 63 6f 6f 6b 69 65 4d 61 73 6b 29 3d 3d 30 20  >cookieMask)==0 
12b0: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
12c0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 55      sqlite3VdbeU
12d0: 73 65 73 42 74 72 65 65 28 76 2c 20 69 44 62 29  sesBtree(v, iDb)
12e0: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
12f0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 4f 50  3VdbeAddOp2(v,OP
1300: 5f 54 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69 44  _Transaction, iD
1310: 62 2c 20 28 6d 61 73 6b 20 26 20 70 50 61 72 73  b, (mask & pPars
1320: 65 2d 3e 77 72 69 74 65 4d 61 73 6b 29 21 3d 30  e->writeMask)!=0
1330: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
1340: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 4f  e3VdbeAddOp2(v,O
1350: 50 5f 56 65 72 69 66 79 43 6f 6f 6b 69 65 2c 20  P_VerifyCookie, 
1360: 69 44 62 2c 20 70 50 61 72 73 65 2d 3e 63 6f 6f  iDb, pParse->coo
1370: 6b 69 65 56 61 6c 75 65 5b 69 44 62 5d 29 3b 0a  kieValue[iDb]);.
1380: 20 20 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20        }.#ifndef 
1390: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
13a0: 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 20 20 7b  UALTABLE.      {
13b0: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 3b 0a  .        int i;.
13c0: 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b          for(i=0;
13d0: 20 69 3c 70 50 61 72 73 65 2d 3e 6e 56 74 61 62   i<pParse->nVtab
13e0: 4c 6f 63 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Lock; i++){.    
13f0: 20 20 20 20 20 20 63 68 61 72 20 2a 76 74 61 62        char *vtab
1400: 20 3d 20 28 63 68 61 72 20 2a 29 70 50 61 72 73   = (char *)pPars
1410: 65 2d 3e 61 70 56 74 61 62 4c 6f 63 6b 5b 69 5d  e->apVtabLock[i]
1420: 2d 3e 70 56 74 61 62 3b 0a 20 20 20 20 20 20 20  ->pVtab;.       
1430: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1440: 64 4f 70 34 28 76 2c 20 4f 50 5f 56 42 65 67 69  dOp4(v, OP_VBegi
1450: 6e 2c 20 30 2c 20 30 2c 20 30 2c 20 76 74 61 62  n, 0, 0, 0, vtab
1460: 2c 20 50 34 5f 56 54 41 42 29 3b 0a 20 20 20 20  , P4_VTAB);.    
1470: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 50      }.        pP
1480: 61 72 73 65 2d 3e 6e 56 74 61 62 4c 6f 63 6b 20  arse->nVtabLock 
1490: 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e  = 0;.      }.#en
14a0: 64 69 66 0a 0a 20 20 20 20 20 20 2f 2a 20 4f 6e  dif..      /* On
14b0: 63 65 20 61 6c 6c 20 74 68 65 20 63 6f 6f 6b 69  ce all the cooki
14c0: 65 73 20 68 61 76 65 20 62 65 65 6e 20 76 65 72  es have been ver
14d0: 69 66 69 65 64 20 61 6e 64 20 74 72 61 6e 73 61  ified and transa
14e0: 63 74 69 6f 6e 73 20 6f 70 65 6e 65 64 2c 20 0a  ctions opened, .
14f0: 20 20 20 20 20 20 2a 2a 20 6f 62 74 61 69 6e 20        ** obtain 
1500: 74 68 65 20 72 65 71 75 69 72 65 64 20 74 61 62  the required tab
1510: 6c 65 2d 6c 6f 63 6b 73 2e 20 54 68 69 73 20 69  le-locks. This i
1520: 73 20 61 20 6e 6f 2d 6f 70 20 75 6e 6c 65 73 73  s a no-op unless
1530: 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 73   the .      ** s
1540: 68 61 72 65 64 2d 63 61 63 68 65 20 66 65 61 74  hared-cache feat
1550: 75 72 65 20 69 73 20 65 6e 61 62 6c 65 64 2e 0a  ure is enabled..
1560: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 63        */.      c
1570: 6f 64 65 54 61 62 6c 65 4c 6f 63 6b 73 28 70 50  odeTableLocks(pP
1580: 61 72 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c  arse);.      sql
1590: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
15a0: 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 70 50  , OP_Goto, 0, pP
15b0: 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 47 6f 74 6f  arse->cookieGoto
15c0: 29 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 6e 64 65  );.    }..#ifnde
15d0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52  f SQLITE_OMIT_TR
15e0: 41 43 45 0a 20 20 20 20 69 66 28 20 21 64 62 2d  ACE.    if( !db-
15f0: 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20 20  >init.busy ){.  
1600: 20 20 20 20 2f 2a 20 43 68 61 6e 67 65 20 74 68      /* Change th
1610: 65 20 50 34 20 61 72 67 75 6d 65 6e 74 20 6f 66  e P4 argument of
1620: 20 74 68 65 20 66 69 72 73 74 20 6f 70 63 6f 64   the first opcod
1630: 65 20 28 77 68 69 63 68 20 77 69 6c 6c 20 61 6c  e (which will al
1640: 77 61 79 73 20 62 65 0a 20 20 20 20 20 20 2a 2a  ways be.      **
1650: 20 61 6e 20 4f 50 5f 54 72 61 63 65 29 20 74 6f   an OP_Trace) to
1660: 20 62 65 20 74 68 65 20 63 6f 6d 70 6c 65 74 65   be the complete
1670: 20 74 65 78 74 20 6f 66 20 74 68 65 20 63 75 72   text of the cur
1680: 72 65 6e 74 20 53 51 4c 20 73 74 61 74 65 6d 65  rent SQL stateme
1690: 6e 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  nt..      */.   
16a0: 20 20 20 56 64 62 65 4f 70 20 2a 70 4f 70 20 3d     VdbeOp *pOp =
16b0: 20 73 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f   sqlite3VdbeGetO
16c0: 70 28 76 2c 20 30 29 3b 0a 20 20 20 20 20 20 69  p(v, 0);.      i
16d0: 66 28 20 70 4f 70 20 26 26 20 70 4f 70 2d 3e 6f  f( pOp && pOp->o
16e0: 70 63 6f 64 65 3d 3d 4f 50 5f 54 72 61 63 65 20  pcode==OP_Trace 
16f0: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
1700: 65 33 56 64 62 65 43 68 61 6e 67 65 50 34 28 76  e3VdbeChangeP4(v
1710: 2c 20 30 2c 20 70 50 61 72 73 65 2d 3e 7a 53 71  , 0, pParse->zSq
1720: 6c 2c 20 70 50 61 72 73 65 2d 3e 7a 54 61 69 6c  l, pParse->zTail
1730: 2d 70 50 61 72 73 65 2d 3e 7a 53 71 6c 29 3b 0a  -pParse->zSql);.
1740: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65        }.    }.#e
1750: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
1760: 4d 49 54 5f 54 52 41 43 45 20 2a 2f 0a 20 20 7d  MIT_TRACE */.  }
1770: 0a 0a 0a 20 20 2f 2a 20 47 65 74 20 74 68 65 20  ...  /* Get the 
1780: 56 44 42 45 20 70 72 6f 67 72 61 6d 20 72 65 61  VDBE program rea
1790: 64 79 20 66 6f 72 20 65 78 65 63 75 74 69 6f 6e  dy for execution
17a0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 76 20 26 26  .  */.  if( v &&
17b0: 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30   pParse->nErr==0
17c0: 20 26 26 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46   && !db->mallocF
17d0: 61 69 6c 65 64 20 29 7b 0a 23 69 66 64 65 66 20  ailed ){.#ifdef 
17e0: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20  SQLITE_DEBUG.   
17f0: 20 46 49 4c 45 20 2a 74 72 61 63 65 20 3d 20 28   FILE *trace = (
1800: 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  db->flags & SQLI
1810: 54 45 5f 56 64 62 65 54 72 61 63 65 29 21 3d 30  TE_VdbeTrace)!=0
1820: 20 3f 20 73 74 64 6f 75 74 20 3a 20 30 3b 0a 20   ? stdout : 0;. 
1830: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 54 72     sqlite3VdbeTr
1840: 61 63 65 28 76 2c 20 74 72 61 63 65 29 3b 0a 23  ace(v, trace);.#
1850: 65 6e 64 69 66 0a 20 20 20 20 61 73 73 65 72 74  endif.    assert
1860: 28 20 70 50 61 72 73 65 2d 3e 64 69 73 61 62 6c  ( pParse->disabl
1870: 65 43 6f 6c 43 61 63 68 65 3d 3d 30 20 29 3b 20  eColCache==0 ); 
1880: 20 2f 2a 20 44 69 73 61 62 6c 65 73 20 61 6e 64   /* Disables and
1890: 20 72 65 2d 65 6e 61 62 6c 65 73 20 6d 61 74 63   re-enables matc
18a0: 68 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33  h */.    sqlite3
18b0: 56 64 62 65 4d 61 6b 65 52 65 61 64 79 28 76 2c  VdbeMakeReady(v,
18c0: 20 70 50 61 72 73 65 2d 3e 6e 56 61 72 2c 20 70   pParse->nVar, p
18d0: 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 33 2c 0a 20  Parse->nMem+3,. 
18e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18f0: 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e          pParse->
1900: 6e 54 61 62 2b 33 2c 20 70 50 61 72 73 65 2d 3e  nTab+3, pParse->
1910: 65 78 70 6c 61 69 6e 29 3b 0a 20 20 20 20 70 50  explain);.    pP
1920: 61 72 73 65 2d 3e 72 63 20 3d 20 53 51 4c 49 54  arse->rc = SQLIT
1930: 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 70 50 61 72  E_DONE;.    pPar
1940: 73 65 2d 3e 63 6f 6c 4e 61 6d 65 73 53 65 74 20  se->colNamesSet 
1950: 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  = 0;.  }else if(
1960: 20 70 50 61 72 73 65 2d 3e 72 63 3d 3d 53 51 4c   pParse->rc==SQL
1970: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 50  ITE_OK ){.    pP
1980: 61 72 73 65 2d 3e 72 63 20 3d 20 53 51 4c 49 54  arse->rc = SQLIT
1990: 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 70  E_ERROR;.  }.  p
19a0: 50 61 72 73 65 2d 3e 6e 54 61 62 20 3d 20 30 3b  Parse->nTab = 0;
19b0: 0a 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20  .  pParse->nMem 
19c0: 3d 20 30 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e  = 0;.  pParse->n
19d0: 53 65 74 20 3d 20 30 3b 0a 20 20 70 50 61 72 73  Set = 0;.  pPars
19e0: 65 2d 3e 6e 56 61 72 20 3d 20 30 3b 0a 20 20 70  e->nVar = 0;.  p
19f0: 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 4d 61 73  Parse->cookieMas
1a00: 6b 20 3d 20 30 3b 0a 20 20 70 50 61 72 73 65 2d  k = 0;.  pParse-
1a10: 3e 63 6f 6f 6b 69 65 47 6f 74 6f 20 3d 20 30 3b  >cookieGoto = 0;
1a20: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 75 6e 20 74 68  .}../*.** Run th
1a30: 65 20 70 61 72 73 65 72 20 61 6e 64 20 63 6f 64  e parser and cod
1a40: 65 20 67 65 6e 65 72 61 74 6f 72 20 72 65 63 75  e generator recu
1a50: 72 73 69 76 65 6c 79 20 69 6e 20 6f 72 64 65 72  rsively in order
1a60: 20 74 6f 20 67 65 6e 65 72 61 74 65 0a 2a 2a 20   to generate.** 
1a70: 63 6f 64 65 20 66 6f 72 20 74 68 65 20 53 51 4c  code for the SQL
1a80: 20 73 74 61 74 65 6d 65 6e 74 20 67 69 76 65 6e   statement given
1a90: 20 6f 6e 74 6f 20 74 68 65 20 65 6e 64 20 6f 66   onto the end of
1aa0: 20 74 68 65 20 70 50 61 72 73 65 20 63 6f 6e 74   the pParse cont
1ab0: 65 78 74 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79  ext.** currently
1ac0: 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74   under construct
1ad0: 69 6f 6e 2e 20 20 57 68 65 6e 20 74 68 65 20 70  ion.  When the p
1ae0: 61 72 73 65 72 20 69 73 20 72 75 6e 20 72 65 63  arser is run rec
1af0: 75 72 73 69 76 65 6c 79 0a 2a 2a 20 74 68 69 73  ursively.** this
1b00: 20 77 61 79 2c 20 74 68 65 20 66 69 6e 61 6c 20   way, the final 
1b10: 4f 50 5f 48 61 6c 74 20 69 73 20 6e 6f 74 20 61  OP_Halt is not a
1b20: 70 70 65 6e 64 65 64 20 61 6e 64 20 6f 74 68 65  ppended and othe
1b30: 72 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e  r initialization
1b40: 0a 2a 2a 20 61 6e 64 20 66 69 6e 61 6c 69 7a 61  .** and finaliza
1b50: 74 69 6f 6e 20 73 74 65 70 73 20 61 72 65 20 6f  tion steps are o
1b60: 6d 69 74 74 65 64 20 62 65 63 61 75 73 65 20 74  mitted because t
1b70: 68 6f 73 65 20 61 72 65 20 68 61 6e 64 6c 69 6e  hose are handlin
1b80: 67 20 62 79 20 74 68 65 0a 2a 2a 20 6f 75 74 65  g by the.** oute
1b90: 72 6d 6f 73 74 20 70 61 72 73 65 72 2e 0a 2a 2a  rmost parser..**
1ba0: 0a 2a 2a 20 4e 6f 74 20 65 76 65 72 79 74 68 69  .** Not everythi
1bb0: 6e 67 20 69 73 20 6e 65 73 74 61 62 6c 65 2e 20  ng is nestable. 
1bc0: 20 54 68 69 73 20 66 61 63 69 6c 69 74 79 20 69   This facility i
1bd0: 73 20 64 65 73 69 67 6e 65 64 20 74 6f 20 70 65  s designed to pe
1be0: 72 6d 69 74 0a 2a 2a 20 49 4e 53 45 52 54 2c 20  rmit.** INSERT, 
1bf0: 55 50 44 41 54 45 2c 20 61 6e 64 20 44 45 4c 45  UPDATE, and DELE
1c00: 54 45 20 6f 70 65 72 61 74 69 6f 6e 73 20 61 67  TE operations ag
1c10: 61 69 6e 73 74 20 53 51 4c 49 54 45 5f 4d 41 53  ainst SQLITE_MAS
1c20: 54 45 52 2e 20 20 55 73 65 0a 2a 2a 20 63 61 72  TER.  Use.** car
1c30: 65 20 69 66 20 79 6f 75 20 64 65 63 69 64 65 20  e if you decide 
1c40: 74 6f 20 74 72 79 20 74 6f 20 75 73 65 20 74 68  to try to use th
1c50: 69 73 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 73  is routine for s
1c60: 6f 6d 65 20 6f 74 68 65 72 20 70 75 72 70 6f 73  ome other purpos
1c70: 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  es..*/.void sqli
1c80: 74 65 33 4e 65 73 74 65 64 50 61 72 73 65 28 50  te3NestedParse(P
1c90: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 63 6f  arse *pParse, co
1ca0: 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61  nst char *zForma
1cb0: 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69  t, ...){.  va_li
1cc0: 73 74 20 61 70 3b 0a 20 20 63 68 61 72 20 2a 7a  st ap;.  char *z
1cd0: 53 71 6c 3b 0a 20 20 63 68 61 72 20 2a 7a 45 72  Sql;.  char *zEr
1ce0: 72 4d 73 67 20 3d 20 30 3b 0a 20 20 73 71 6c 69  rMsg = 0;.  sqli
1cf0: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
1d00: 2d 3e 64 62 3b 0a 23 20 64 65 66 69 6e 65 20 53  ->db;.# define S
1d10: 41 56 45 5f 53 5a 20 20 28 73 69 7a 65 6f 66 28  AVE_SZ  (sizeof(
1d20: 50 61 72 73 65 29 20 2d 20 6f 66 66 73 65 74 6f  Parse) - offseto
1d30: 66 28 50 61 72 73 65 2c 6e 56 61 72 29 29 0a 20  f(Parse,nVar)). 
1d40: 20 63 68 61 72 20 73 61 76 65 42 75 66 5b 53 41   char saveBuf[SA
1d50: 56 45 5f 53 5a 5d 3b 0a 0a 20 20 69 66 28 20 70  VE_SZ];..  if( p
1d60: 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 20 72 65  Parse->nErr ) re
1d70: 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28 20  turn;.  assert( 
1d80: 70 50 61 72 73 65 2d 3e 6e 65 73 74 65 64 3c 31  pParse->nested<1
1d90: 30 20 29 3b 20 20 2f 2a 20 4e 65 73 74 69 6e 67  0 );  /* Nesting
1da0: 20 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 62 65 20   should only be 
1db0: 6f 66 20 6c 69 6d 69 74 65 64 20 64 65 70 74 68  of limited depth
1dc0: 20 2a 2f 0a 20 20 76 61 5f 73 74 61 72 74 28 61   */.  va_start(a
1dd0: 70 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a 20 20 7a  p, zFormat);.  z
1de0: 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 56 4d 50  Sql = sqlite3VMP
1df0: 72 69 6e 74 66 28 64 62 2c 20 7a 46 6f 72 6d 61  rintf(db, zForma
1e00: 74 2c 20 61 70 29 3b 0a 20 20 76 61 5f 65 6e 64  t, ap);.  va_end
1e10: 28 61 70 29 3b 0a 20 20 69 66 28 20 7a 53 71 6c  (ap);.  if( zSql
1e20: 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
1e30: 6e 3b 20 20 20 2f 2a 20 41 20 6d 61 6c 6c 6f 63  n;   /* A malloc
1e40: 20 6d 75 73 74 20 68 61 76 65 20 66 61 69 6c 65   must have faile
1e50: 64 20 2a 2f 0a 20 20 7d 0a 20 20 70 50 61 72 73  d */.  }.  pPars
1e60: 65 2d 3e 6e 65 73 74 65 64 2b 2b 3b 0a 20 20 6d  e->nested++;.  m
1e70: 65 6d 63 70 79 28 73 61 76 65 42 75 66 2c 20 26  emcpy(saveBuf, &
1e80: 70 50 61 72 73 65 2d 3e 6e 56 61 72 2c 20 53 41  pParse->nVar, SA
1e90: 56 45 5f 53 5a 29 3b 0a 20 20 6d 65 6d 73 65 74  VE_SZ);.  memset
1ea0: 28 26 70 50 61 72 73 65 2d 3e 6e 56 61 72 2c 20  (&pParse->nVar, 
1eb0: 30 2c 20 53 41 56 45 5f 53 5a 29 3b 0a 20 20 73  0, SAVE_SZ);.  s
1ec0: 71 6c 69 74 65 33 52 75 6e 50 61 72 73 65 72 28  qlite3RunParser(
1ed0: 70 50 61 72 73 65 2c 20 7a 53 71 6c 2c 20 26 7a  pParse, zSql, &z
1ee0: 45 72 72 4d 73 67 29 3b 0a 20 20 73 71 6c 69 74  ErrMsg);.  sqlit
1ef0: 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 45 72  e3DbFree(db, zEr
1f00: 72 4d 73 67 29 3b 0a 20 20 73 71 6c 69 74 65 33  rMsg);.  sqlite3
1f10: 44 62 46 72 65 65 28 64 62 2c 20 7a 53 71 6c 29  DbFree(db, zSql)
1f20: 3b 0a 20 20 6d 65 6d 63 70 79 28 26 70 50 61 72  ;.  memcpy(&pPar
1f30: 73 65 2d 3e 6e 56 61 72 2c 20 73 61 76 65 42 75  se->nVar, saveBu
1f40: 66 2c 20 53 41 56 45 5f 53 5a 29 3b 0a 20 20 70  f, SAVE_SZ);.  p
1f50: 50 61 72 73 65 2d 3e 6e 65 73 74 65 64 2d 2d 3b  Parse->nested--;
1f60: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61 74 65  .}../*.** Locate
1f70: 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 73   the in-memory s
1f80: 74 72 75 63 74 75 72 65 20 74 68 61 74 20 64 65  tructure that de
1f90: 73 63 72 69 62 65 73 20 61 20 70 61 72 74 69 63  scribes a partic
1fa0: 75 6c 61 72 20 64 61 74 61 62 61 73 65 0a 2a 2a  ular database.**
1fb0: 20 74 61 62 6c 65 20 67 69 76 65 6e 20 74 68 65   table given the
1fc0: 20 6e 61 6d 65 20 6f 66 20 74 68 61 74 20 74 61   name of that ta
1fd0: 62 6c 65 20 61 6e 64 20 28 6f 70 74 69 6f 6e 61  ble and (optiona
1fe0: 6c 6c 79 29 20 74 68 65 20 6e 61 6d 65 20 6f 66  lly) the name of
1ff0: 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65   the.** database
2000: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
2010: 74 61 62 6c 65 2e 20 20 52 65 74 75 72 6e 20 4e  table.  Return N
2020: 55 4c 4c 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64  ULL if not found
2030: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 44 61 74 61  ..**.** If zData
2040: 62 61 73 65 20 69 73 20 30 2c 20 61 6c 6c 20 64  base is 0, all d
2050: 61 74 61 62 61 73 65 73 20 61 72 65 20 73 65 61  atabases are sea
2060: 72 63 68 65 64 20 66 6f 72 20 74 68 65 20 74 61  rched for the ta
2070: 62 6c 65 20 61 6e 64 20 74 68 65 0a 2a 2a 20 66  ble and the.** f
2080: 69 72 73 74 20 6d 61 74 63 68 69 6e 67 20 74 61  irst matching ta
2090: 62 6c 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ble is returned.
20a0: 20 20 28 4e 6f 20 63 68 65 63 6b 69 6e 67 20 66    (No checking f
20b0: 6f 72 20 64 75 70 6c 69 63 61 74 65 20 74 61 62  or duplicate tab
20c0: 6c 65 0a 2a 2a 20 6e 61 6d 65 73 20 69 73 20 64  le.** names is d
20d0: 6f 6e 65 2e 29 20 20 54 68 65 20 73 65 61 72 63  one.)  The searc
20e0: 68 20 6f 72 64 65 72 20 69 73 20 54 45 4d 50 20  h order is TEMP 
20f0: 66 69 72 73 74 2c 20 74 68 65 6e 20 4d 41 49 4e  first, then MAIN
2100: 2c 20 74 68 65 6e 20 61 6e 79 0a 2a 2a 20 61 75  , then any.** au
2110: 78 69 6c 69 61 72 79 20 64 61 74 61 62 61 73 65  xiliary database
2120: 73 20 61 64 64 65 64 20 75 73 69 6e 67 20 74 68  s added using th
2130: 65 20 41 54 54 41 43 48 20 63 6f 6d 6d 61 6e 64  e ATTACH command
2140: 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f  ..**.** See also
2150: 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61   sqlite3LocateTa
2160: 62 6c 65 28 29 2e 0a 2a 2f 0a 54 61 62 6c 65 20  ble()..*/.Table 
2170: 2a 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c  *sqlite3FindTabl
2180: 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 63  e(sqlite3 *db, c
2190: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
21a0: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44  , const char *zD
21b0: 61 74 61 62 61 73 65 29 7b 0a 20 20 54 61 62 6c  atabase){.  Tabl
21c0: 65 20 2a 70 20 3d 20 30 3b 0a 20 20 69 6e 74 20  e *p = 0;.  int 
21d0: 69 3b 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 3b 0a  i;.  int nName;.
21e0: 20 20 61 73 73 65 72 74 28 20 7a 4e 61 6d 65 21    assert( zName!
21f0: 3d 30 20 29 3b 0a 20 20 6e 4e 61 6d 65 20 3d 20  =0 );.  nName = 
2200: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 28 64 62  sqlite3Strlen(db
2210: 2c 20 7a 4e 61 6d 65 29 20 2b 20 31 3b 0a 20 20  , zName) + 1;.  
2220: 66 6f 72 28 69 3d 4f 4d 49 54 5f 54 45 4d 50 44  for(i=OMIT_TEMPD
2230: 42 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b  B; i<db->nDb; i+
2240: 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6a 20 3d 20  +){.    int j = 
2250: 28 69 3c 32 29 20 3f 20 69 5e 31 20 3a 20 69 3b  (i<2) ? i^1 : i;
2260: 20 20 20 2f 2a 20 53 65 61 72 63 68 20 54 45 4d     /* Search TEM
2270: 50 20 62 65 66 6f 72 65 20 4d 41 49 4e 20 2a 2f  P before MAIN */
2280: 0a 20 20 20 20 69 66 28 20 7a 44 61 74 61 62 61  .    if( zDataba
2290: 73 65 21 3d 30 20 26 26 20 73 71 6c 69 74 65 33  se!=0 && sqlite3
22a0: 53 74 72 49 43 6d 70 28 7a 44 61 74 61 62 61 73  StrICmp(zDatabas
22b0: 65 2c 20 64 62 2d 3e 61 44 62 5b 6a 5d 2e 7a 4e  e, db->aDb[j].zN
22c0: 61 6d 65 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b  ame) ) continue;
22d0: 0a 20 20 20 20 70 20 3d 20 73 71 6c 69 74 65 33  .    p = sqlite3
22e0: 48 61 73 68 46 69 6e 64 28 26 64 62 2d 3e 61 44  HashFind(&db->aD
22f0: 62 5b 6a 5d 2e 70 53 63 68 65 6d 61 2d 3e 74 62  b[j].pSchema->tb
2300: 6c 48 61 73 68 2c 20 7a 4e 61 6d 65 2c 20 6e 4e  lHash, zName, nN
2310: 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 70 20  ame);.    if( p 
2320: 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72  ) break;.  }.  r
2330: 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn p;.}../*.*
2340: 2a 20 4c 6f 63 61 74 65 20 74 68 65 20 69 6e 2d  * Locate the in-
2350: 6d 65 6d 6f 72 79 20 73 74 72 75 63 74 75 72 65  memory structure
2360: 20 74 68 61 74 20 64 65 73 63 72 69 62 65 73 20   that describes 
2370: 61 20 70 61 72 74 69 63 75 6c 61 72 20 64 61 74  a particular dat
2380: 61 62 61 73 65 0a 2a 2a 20 74 61 62 6c 65 20 67  abase.** table g
2390: 69 76 65 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66  iven the name of
23a0: 20 74 68 61 74 20 74 61 62 6c 65 20 61 6e 64 20   that table and 
23b0: 28 6f 70 74 69 6f 6e 61 6c 6c 79 29 20 74 68 65  (optionally) the
23c0: 20 6e 61 6d 65 20 6f 66 20 74 68 65 0a 2a 2a 20   name of the.** 
23d0: 64 61 74 61 62 61 73 65 20 63 6f 6e 74 61 69 6e  database contain
23e0: 69 6e 67 20 74 68 65 20 74 61 62 6c 65 2e 20 20  ing the table.  
23f0: 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 6e  Return NULL if n
2400: 6f 74 20 66 6f 75 6e 64 2e 20 20 41 6c 73 6f 20  ot found.  Also 
2410: 6c 65 61 76 65 20 61 6e 0a 2a 2a 20 65 72 72 6f  leave an.** erro
2420: 72 20 6d 65 73 73 61 67 65 20 69 6e 20 70 50 61  r message in pPa
2430: 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2e 0a 2a 2a  rse->zErrMsg..**
2440: 0a 2a 2a 20 54 68 65 20 64 69 66 66 65 72 65 6e  .** The differen
2450: 63 65 20 62 65 74 77 65 65 6e 20 74 68 69 73 20  ce between this 
2460: 72 6f 75 74 69 6e 65 20 61 6e 64 20 73 71 6c 69  routine and sqli
2470: 74 65 33 46 69 6e 64 54 61 62 6c 65 28 29 20 69  te3FindTable() i
2480: 73 20 74 68 61 74 20 74 68 69 73 0a 2a 2a 20 72  s that this.** r
2490: 6f 75 74 69 6e 65 20 6c 65 61 76 65 73 20 61 6e  outine leaves an
24a0: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69   error message i
24b0: 6e 20 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73  n pParse->zErrMs
24c0: 67 20 77 68 65 72 65 0a 2a 2a 20 73 71 6c 69 74  g where.** sqlit
24d0: 65 33 46 69 6e 64 54 61 62 6c 65 28 29 20 64 6f  e3FindTable() do
24e0: 65 73 20 6e 6f 74 2e 0a 2a 2f 0a 54 61 62 6c 65  es not..*/.Table
24f0: 20 2a 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54   *sqlite3LocateT
2500: 61 62 6c 65 28 0a 20 20 50 61 72 73 65 20 2a 70  able(.  Parse *p
2510: 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 2f  Parse,         /
2520: 2a 20 63 6f 6e 74 65 78 74 20 69 6e 20 77 68 69  * context in whi
2530: 63 68 20 74 6f 20 72 65 70 6f 72 74 20 65 72 72  ch to report err
2540: 6f 72 73 20 2a 2f 0a 20 20 69 6e 74 20 69 73 56  ors */.  int isV
2550: 69 65 77 2c 20 20 20 20 20 20 20 20 20 20 20 20  iew,            
2560: 2f 2a 20 54 72 75 65 20 69 66 20 6c 6f 6f 6b 69  /* True if looki
2570: 6e 67 20 66 6f 72 20 61 20 56 49 45 57 20 72 61  ng for a VIEW ra
2580: 74 68 65 72 20 74 68 61 6e 20 61 20 54 41 42 4c  ther than a TABL
2590: 45 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  E */.  const cha
25a0: 72 20 2a 7a 4e 61 6d 65 2c 20 20 20 20 20 2f 2a  r *zName,     /*
25b0: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62   Name of the tab
25c0: 6c 65 20 77 65 20 61 72 65 20 6c 6f 6f 6b 69 6e  le we are lookin
25d0: 67 20 66 6f 72 20 2a 2f 0a 20 20 63 6f 6e 73 74  g for */.  const
25e0: 20 63 68 61 72 20 2a 7a 44 62 61 73 65 20 20 20   char *zDbase   
25f0: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
2600: 20 64 61 74 61 62 61 73 65 2e 20 20 4d 69 67 68   database.  Migh
2610: 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a  t be NULL */.){.
2620: 20 20 54 61 62 6c 65 20 2a 70 3b 0a 0a 20 20 2f    Table *p;..  /
2630: 2a 20 52 65 61 64 20 74 68 65 20 64 61 74 61 62  * Read the datab
2640: 61 73 65 20 73 63 68 65 6d 61 2e 20 49 66 20 61  ase schema. If a
2650: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
2660: 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d  leave an error m
2670: 65 73 73 61 67 65 0a 20 20 2a 2a 20 61 6e 64 20  essage.  ** and 
2680: 63 6f 64 65 20 69 6e 20 70 50 61 72 73 65 20 61  code in pParse a
2690: 6e 64 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 20  nd return NULL. 
26a0: 2a 2f 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f  */.  if( SQLITE_
26b0: 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65 61 64 53  OK!=sqlite3ReadS
26c0: 63 68 65 6d 61 28 70 50 61 72 73 65 29 20 29 7b  chema(pParse) ){
26d0: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
26e0: 20 7d 0a 0a 20 20 70 20 3d 20 73 71 6c 69 74 65   }..  p = sqlite
26f0: 33 46 69 6e 64 54 61 62 6c 65 28 70 50 61 72 73  3FindTable(pPars
2700: 65 2d 3e 64 62 2c 20 7a 4e 61 6d 65 2c 20 7a 44  e->db, zName, zD
2710: 62 61 73 65 29 3b 0a 20 20 69 66 28 20 70 3d 3d  base);.  if( p==
2720: 30 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63  0 ){.    const c
2730: 68 61 72 20 2a 7a 4d 73 67 20 3d 20 69 73 56 69  har *zMsg = isVi
2740: 65 77 20 3f 20 22 6e 6f 20 73 75 63 68 20 76 69  ew ? "no such vi
2750: 65 77 22 20 3a 20 22 6e 6f 20 73 75 63 68 20 74  ew" : "no such t
2760: 61 62 6c 65 22 3b 0a 20 20 20 20 69 66 28 20 7a  able";.    if( z
2770: 44 62 61 73 65 20 29 7b 0a 20 20 20 20 20 20 73  Dbase ){.      s
2780: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
2790: 50 61 72 73 65 2c 20 22 25 73 3a 20 25 73 2e 25  Parse, "%s: %s.%
27a0: 73 22 2c 20 7a 4d 73 67 2c 20 7a 44 62 61 73 65  s", zMsg, zDbase
27b0: 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 65  , zName);.    }e
27c0: 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  lse{.      sqlit
27d0: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
27e0: 65 2c 20 22 25 73 3a 20 25 73 22 2c 20 7a 4d 73  e, "%s: %s", zMs
27f0: 67 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d  g, zName);.    }
2800: 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 63 68 65  .    pParse->che
2810: 63 6b 53 63 68 65 6d 61 20 3d 20 31 3b 0a 20 20  ckSchema = 1;.  
2820: 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a  }.  return p;.}.
2830: 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61 74 65 20 74 68  ./*.** Locate th
2840: 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 73 74 72 75  e in-memory stru
2850: 63 74 75 72 65 20 74 68 61 74 20 64 65 73 63 72  cture that descr
2860: 69 62 65 73 20 0a 2a 2a 20 61 20 70 61 72 74 69  ibes .** a parti
2870: 63 75 6c 61 72 20 69 6e 64 65 78 20 67 69 76 65  cular index give
2880: 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  n the name of th
2890: 61 74 20 69 6e 64 65 78 0a 2a 2a 20 61 6e 64 20  at index.** and 
28a0: 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
28b0: 64 61 74 61 62 61 73 65 20 74 68 61 74 20 63 6f  database that co
28c0: 6e 74 61 69 6e 73 20 74 68 65 20 69 6e 64 65 78  ntains the index
28d0: 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 4e 55 4c 4c  ..** Return NULL
28e0: 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a   if not found..*
28f0: 2a 0a 2a 2a 20 49 66 20 7a 44 61 74 61 62 61 73  *.** If zDatabas
2900: 65 20 69 73 20 30 2c 20 61 6c 6c 20 64 61 74 61  e is 0, all data
2910: 62 61 73 65 73 20 61 72 65 20 73 65 61 72 63 68  bases are search
2920: 65 64 20 66 6f 72 20 74 68 65 0a 2a 2a 20 74 61  ed for the.** ta
2930: 62 6c 65 20 61 6e 64 20 74 68 65 20 66 69 72 73  ble and the firs
2940: 74 20 6d 61 74 63 68 69 6e 67 20 69 6e 64 65 78  t matching index
2950: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 20 28   is returned.  (
2960: 4e 6f 20 63 68 65 63 6b 69 6e 67 0a 2a 2a 20 66  No checking.** f
2970: 6f 72 20 64 75 70 6c 69 63 61 74 65 20 69 6e 64  or duplicate ind
2980: 65 78 20 6e 61 6d 65 73 20 69 73 20 64 6f 6e 65  ex names is done
2990: 2e 29 20 20 54 68 65 20 73 65 61 72 63 68 20 6f  .)  The search o
29a0: 72 64 65 72 20 69 73 0a 2a 2a 20 54 45 4d 50 20  rder is.** TEMP 
29b0: 66 69 72 73 74 2c 20 74 68 65 6e 20 4d 41 49 4e  first, then MAIN
29c0: 2c 20 74 68 65 6e 20 61 6e 79 20 61 75 78 69 6c  , then any auxil
29d0: 69 61 72 79 20 64 61 74 61 62 61 73 65 73 20 61  iary databases a
29e0: 64 64 65 64 0a 2a 2a 20 75 73 69 6e 67 20 74 68  dded.** using th
29f0: 65 20 41 54 54 41 43 48 20 63 6f 6d 6d 61 6e 64  e ATTACH command
2a00: 2e 0a 2a 2f 0a 49 6e 64 65 78 20 2a 73 71 6c 69  ..*/.Index *sqli
2a10: 74 65 33 46 69 6e 64 49 6e 64 65 78 28 73 71 6c  te3FindIndex(sql
2a20: 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20  ite3 *db, const 
2a30: 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 63 6f 6e  char *zName, con
2a40: 73 74 20 63 68 61 72 20 2a 7a 44 62 29 7b 0a 20  st char *zDb){. 
2a50: 20 49 6e 64 65 78 20 2a 70 20 3d 20 30 3b 0a 20   Index *p = 0;. 
2a60: 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e 4e   int i;.  int nN
2a70: 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 53 74 72  ame = sqlite3Str
2a80: 6c 65 6e 28 64 62 2c 20 7a 4e 61 6d 65 29 2b 31  len(db, zName)+1
2a90: 3b 0a 20 20 66 6f 72 28 69 3d 4f 4d 49 54 5f 54  ;.  for(i=OMIT_T
2aa0: 45 4d 50 44 42 3b 20 69 3c 64 62 2d 3e 6e 44 62  EMPDB; i<db->nDb
2ab0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20  ; i++){.    int 
2ac0: 6a 20 3d 20 28 69 3c 32 29 20 3f 20 69 5e 31 20  j = (i<2) ? i^1 
2ad0: 3a 20 69 3b 20 20 2f 2a 20 53 65 61 72 63 68 20  : i;  /* Search 
2ae0: 54 45 4d 50 20 62 65 66 6f 72 65 20 4d 41 49 4e  TEMP before MAIN
2af0: 20 2a 2f 0a 20 20 20 20 53 63 68 65 6d 61 20 2a   */.    Schema *
2b00: 70 53 63 68 65 6d 61 20 3d 20 64 62 2d 3e 61 44  pSchema = db->aD
2b10: 62 5b 6a 5d 2e 70 53 63 68 65 6d 61 3b 0a 20 20  b[j].pSchema;.  
2b20: 20 20 69 66 28 20 7a 44 62 20 26 26 20 73 71 6c    if( zDb && sql
2b30: 69 74 65 33 53 74 72 49 43 6d 70 28 7a 44 62 2c  ite3StrICmp(zDb,
2b40: 20 64 62 2d 3e 61 44 62 5b 6a 5d 2e 7a 4e 61 6d   db->aDb[j].zNam
2b50: 65 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  e) ) continue;. 
2b60: 20 20 20 61 73 73 65 72 74 28 20 70 53 63 68 65     assert( pSche
2b70: 6d 61 20 7c 7c 20 28 6a 3d 3d 31 20 26 26 20 21  ma || (j==1 && !
2b80: 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 42 74 29 20  db->aDb[1].pBt) 
2b90: 29 3b 0a 20 20 20 20 69 66 28 20 70 53 63 68 65  );.    if( pSche
2ba0: 6d 61 20 29 7b 0a 20 20 20 20 20 20 70 20 3d 20  ma ){.      p = 
2bb0: 73 71 6c 69 74 65 33 48 61 73 68 46 69 6e 64 28  sqlite3HashFind(
2bc0: 26 70 53 63 68 65 6d 61 2d 3e 69 64 78 48 61 73  &pSchema->idxHas
2bd0: 68 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 29  h, zName, nName)
2be0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
2bf0: 70 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20  p ) break;.  }. 
2c00: 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a   return p;.}../*
2c10: 0a 2a 2a 20 52 65 63 6c 61 69 6d 20 74 68 65 20  .** Reclaim the 
2c20: 6d 65 6d 6f 72 79 20 75 73 65 64 20 62 79 20 61  memory used by a
2c30: 6e 20 69 6e 64 65 78 0a 2a 2f 0a 73 74 61 74 69  n index.*/.stati
2c40: 63 20 76 6f 69 64 20 66 72 65 65 49 6e 64 65 78  c void freeIndex
2c50: 28 49 6e 64 65 78 20 2a 70 29 7b 0a 20 20 73 71  (Index *p){.  sq
2c60: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 70  lite3 *db = p->p
2c70: 54 61 62 6c 65 2d 3e 64 62 3b 0a 20 20 73 71 6c  Table->db;.  sql
2c80: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
2c90: 2d 3e 7a 43 6f 6c 41 66 66 29 3b 0a 20 20 73 71  ->zColAff);.  sq
2ca0: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
2cb0: 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d  p);.}../*.** Rem
2cc0: 6f 76 65 20 74 68 65 20 67 69 76 65 6e 20 69 6e  ove the given in
2cd0: 64 65 78 20 66 72 6f 6d 20 74 68 65 20 69 6e 64  dex from the ind
2ce0: 65 78 20 68 61 73 68 20 74 61 62 6c 65 2c 20 61  ex hash table, a
2cf0: 6e 64 20 66 72 65 65 0a 2a 2a 20 69 74 73 20 6d  nd free.** its m
2d00: 65 6d 6f 72 79 20 73 74 72 75 63 74 75 72 65 73  emory structures
2d10: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6e 64 65  ..**.** The inde
2d20: 78 20 69 73 20 72 65 6d 6f 76 65 64 20 66 72 6f  x is removed fro
2d30: 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68  m the database h
2d40: 61 73 68 20 74 61 62 6c 65 73 20 62 75 74 0a 2a  ash tables but.*
2d50: 2a 20 69 74 20 69 73 20 6e 6f 74 20 75 6e 6c 69  * it is not unli
2d60: 6e 6b 65 64 20 66 72 6f 6d 20 74 68 65 20 54 61  nked from the Ta
2d70: 62 6c 65 20 74 68 61 74 20 69 74 20 69 6e 64 65  ble that it inde
2d80: 78 65 73 2e 0a 2a 2a 20 55 6e 6c 69 6e 6b 69 6e  xes..** Unlinkin
2d90: 67 20 66 72 6f 6d 20 74 68 65 20 54 61 62 6c 65  g from the Table
2da0: 20 6d 75 73 74 20 62 65 20 64 6f 6e 65 20 62 79   must be done by
2db0: 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e   the calling fun
2dc0: 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ction..*/.static
2dd0: 20 76 6f 69 64 20 73 71 6c 69 74 65 44 65 6c 65   void sqliteDele
2de0: 74 65 49 6e 64 65 78 28 49 6e 64 65 78 20 2a 70  teIndex(Index *p
2df0: 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 4f 6c 64  ){.  Index *pOld
2e00: 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
2e10: 7a 4e 61 6d 65 20 3d 20 70 2d 3e 7a 4e 61 6d 65  zName = p->zName
2e20: 3b 0a 0a 20 20 70 4f 6c 64 20 3d 20 73 71 6c 69  ;..  pOld = sqli
2e30: 74 65 33 48 61 73 68 49 6e 73 65 72 74 28 26 70  te3HashInsert(&p
2e40: 2d 3e 70 53 63 68 65 6d 61 2d 3e 69 64 78 48 61  ->pSchema->idxHa
2e50: 73 68 2c 20 7a 4e 61 6d 65 2c 20 73 74 72 6c 65  sh, zName, strle
2e60: 6e 28 7a 4e 61 6d 65 29 2b 31 2c 20 30 29 3b 0a  n(zName)+1, 0);.
2e70: 20 20 61 73 73 65 72 74 28 20 70 4f 6c 64 3d 3d    assert( pOld==
2e80: 30 20 7c 7c 20 70 4f 6c 64 3d 3d 70 20 29 3b 0a  0 || pOld==p );.
2e90: 20 20 66 72 65 65 49 6e 64 65 78 28 70 29 3b 0a    freeIndex(p);.
2ea0: 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 20 74 68 65  }../*.** For the
2eb0: 20 69 6e 64 65 78 20 63 61 6c 6c 65 64 20 7a 49   index called zI
2ec0: 64 78 4e 61 6d 65 20 77 68 69 63 68 20 69 73 20  dxName which is 
2ed0: 66 6f 75 6e 64 20 69 6e 20 74 68 65 20 64 61 74  found in the dat
2ee0: 61 62 61 73 65 20 69 44 62 2c 0a 2a 2a 20 75 6e  abase iDb,.** un
2ef0: 6c 69 6b 65 20 74 68 61 74 20 69 6e 64 65 78 20  like that index 
2f00: 66 72 6f 6d 20 69 74 73 20 54 61 62 6c 65 20 74  from its Table t
2f10: 68 65 6e 20 72 65 6d 6f 76 65 20 74 68 65 20 69  hen remove the i
2f20: 6e 64 65 78 20 66 72 6f 6d 0a 2a 2a 20 74 68 65  ndex from.** the
2f30: 20 69 6e 64 65 78 20 68 61 73 68 20 74 61 62 6c   index hash tabl
2f40: 65 20 61 6e 64 20 66 72 65 65 20 61 6c 6c 20 6d  e and free all m
2f50: 65 6d 6f 72 79 20 73 74 72 75 63 74 75 72 65 73  emory structures
2f60: 20 61 73 73 6f 63 69 61 74 65 64 0a 2a 2a 20 77   associated.** w
2f70: 69 74 68 20 74 68 65 20 69 6e 64 65 78 2e 0a 2a  ith the index..*
2f80: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 55 6e  /.void sqlite3Un
2f90: 6c 69 6e 6b 41 6e 64 44 65 6c 65 74 65 49 6e 64  linkAndDeleteInd
2fa0: 65 78 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  ex(sqlite3 *db, 
2fb0: 69 6e 74 20 69 44 62 2c 20 63 6f 6e 73 74 20 63  int iDb, const c
2fc0: 68 61 72 20 2a 7a 49 64 78 4e 61 6d 65 29 7b 0a  har *zIdxName){.
2fd0: 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b    Index *pIndex;
2fe0: 0a 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 48 61  .  int len;.  Ha
2ff0: 73 68 20 2a 70 48 61 73 68 20 3d 20 26 64 62 2d  sh *pHash = &db-
3000: 3e 61 44 62 5b 69 44 62 5d 2e 70 53 63 68 65 6d  >aDb[iDb].pSchem
3010: 61 2d 3e 69 64 78 48 61 73 68 3b 0a 0a 20 20 6c  a->idxHash;..  l
3020: 65 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  en = sqlite3Strl
3030: 65 6e 28 64 62 2c 20 7a 49 64 78 4e 61 6d 65 29  en(db, zIdxName)
3040: 3b 0a 20 20 70 49 6e 64 65 78 20 3d 20 73 71 6c  ;.  pIndex = sql
3050: 69 74 65 33 48 61 73 68 49 6e 73 65 72 74 28 70  ite3HashInsert(p
3060: 48 61 73 68 2c 20 7a 49 64 78 4e 61 6d 65 2c 20  Hash, zIdxName, 
3070: 6c 65 6e 2b 31 2c 20 30 29 3b 0a 20 20 69 66 28  len+1, 0);.  if(
3080: 20 70 49 6e 64 65 78 20 29 7b 0a 20 20 20 20 69   pIndex ){.    i
3090: 66 28 20 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c  f( pIndex->pTabl
30a0: 65 2d 3e 70 49 6e 64 65 78 3d 3d 70 49 6e 64 65  e->pIndex==pInde
30b0: 78 20 29 7b 0a 20 20 20 20 20 20 70 49 6e 64 65  x ){.      pInde
30c0: 78 2d 3e 70 54 61 62 6c 65 2d 3e 70 49 6e 64 65  x->pTable->pInde
30d0: 78 20 3d 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78  x = pIndex->pNex
30e0: 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  t;.    }else{.  
30f0: 20 20 20 20 49 6e 64 65 78 20 2a 70 3b 0a 20 20      Index *p;.  
3100: 20 20 20 20 66 6f 72 28 70 3d 70 49 6e 64 65 78      for(p=pIndex
3110: 2d 3e 70 54 61 62 6c 65 2d 3e 70 49 6e 64 65 78  ->pTable->pIndex
3120: 3b 20 70 20 26 26 20 70 2d 3e 70 4e 65 78 74 21  ; p && p->pNext!
3130: 3d 70 49 6e 64 65 78 3b 20 70 3d 70 2d 3e 70 4e  =pIndex; p=p->pN
3140: 65 78 74 29 7b 7d 0a 20 20 20 20 20 20 69 66 28  ext){}.      if(
3150: 20 70 20 26 26 20 70 2d 3e 70 4e 65 78 74 3d 3d   p && p->pNext==
3160: 70 49 6e 64 65 78 20 29 7b 0a 20 20 20 20 20 20  pIndex ){.      
3170: 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70 49 6e    p->pNext = pIn
3180: 64 65 78 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  dex->pNext;.    
3190: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 66 72    }.    }.    fr
31a0: 65 65 49 6e 64 65 78 28 70 49 6e 64 65 78 29 3b  eeIndex(pIndex);
31b0: 0a 20 20 7d 0a 20 20 64 62 2d 3e 66 6c 61 67 73  .  }.  db->flags
31c0: 20 7c 3d 20 53 51 4c 49 54 45 5f 49 6e 74 65 72   |= SQLITE_Inter
31d0: 6e 43 68 61 6e 67 65 73 3b 0a 7d 0a 0a 2f 2a 0a  nChanges;.}../*.
31e0: 2a 2a 20 45 72 61 73 65 20 61 6c 6c 20 73 63 68  ** Erase all sch
31f0: 65 6d 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ema information 
3200: 66 72 6f 6d 20 74 68 65 20 69 6e 2d 6d 65 6d 6f  from the in-memo
3210: 72 79 20 68 61 73 68 20 74 61 62 6c 65 73 20 6f  ry hash tables o
3220: 66 0a 2a 2a 20 61 20 73 69 6e 67 6c 65 20 64 61  f.** a single da
3230: 74 61 62 61 73 65 2e 20 20 54 68 69 73 20 72 6f  tabase.  This ro
3240: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
3250: 74 6f 20 72 65 63 6c 61 69 6d 20 6d 65 6d 6f 72  to reclaim memor
3260: 79 0a 2a 2a 20 62 65 66 6f 72 65 20 74 68 65 20  y.** before the 
3270: 64 61 74 61 62 61 73 65 20 63 6c 6f 73 65 73 2e  database closes.
3280: 20 20 49 74 20 69 73 20 61 6c 73 6f 20 63 61 6c    It is also cal
3290: 6c 65 64 20 64 75 72 69 6e 67 20 61 20 72 6f 6c  led during a rol
32a0: 6c 62 61 63 6b 0a 2a 2a 20 69 66 20 74 68 65 72  lback.** if ther
32b0: 65 20 77 65 72 65 20 73 63 68 65 6d 61 20 63 68  e were schema ch
32c0: 61 6e 67 65 73 20 64 75 72 69 6e 67 20 74 68 65  anges during the
32d0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 72 20   transaction or 
32e0: 69 66 20 61 0a 2a 2a 20 73 63 68 65 6d 61 2d 63  if a.** schema-c
32f0: 6f 6f 6b 69 65 20 6d 69 73 6d 61 74 63 68 20 6f  ookie mismatch o
3300: 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ccurs..**.** If 
3310: 69 44 62 3c 3d 30 20 74 68 65 6e 20 72 65 73 65  iDb<=0 then rese
3320: 74 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 73  t the internal s
3330: 63 68 65 6d 61 20 74 61 62 6c 65 73 20 66 6f 72  chema tables for
3340: 20 61 6c 6c 20 64 61 74 61 62 61 73 65 0a 2a 2a   all database.**
3350: 20 66 69 6c 65 73 2e 20 20 49 66 20 69 44 62 3e   files.  If iDb>
3360: 3d 32 20 74 68 65 6e 20 72 65 73 65 74 20 74 68  =2 then reset th
3370: 65 20 69 6e 74 65 72 6e 61 6c 20 73 63 68 65 6d  e internal schem
3380: 61 20 66 6f 72 20 6f 6e 6c 79 20 74 68 65 0a 2a  a for only the.*
3390: 2a 20 73 69 6e 67 6c 65 20 66 69 6c 65 20 69 6e  * single file in
33a0: 64 69 63 61 74 65 64 2e 0a 2a 2f 0a 76 6f 69 64  dicated..*/.void
33b0: 20 73 71 6c 69 74 65 33 52 65 73 65 74 49 6e 74   sqlite3ResetInt
33c0: 65 72 6e 61 6c 53 63 68 65 6d 61 28 73 71 6c 69  ernalSchema(sqli
33d0: 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 69 44 62  te3 *db, int iDb
33e0: 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20  ){.  int i, j;. 
33f0: 20 61 73 73 65 72 74 28 20 69 44 62 3e 3d 30 20   assert( iDb>=0 
3400: 26 26 20 69 44 62 3c 64 62 2d 3e 6e 44 62 20 29  && iDb<db->nDb )
3410: 3b 0a 0a 20 20 69 66 28 20 69 44 62 3d 3d 30 20  ;..  if( iDb==0 
3420: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74  ){.    sqlite3Bt
3430: 72 65 65 45 6e 74 65 72 41 6c 6c 28 64 62 29 3b  reeEnterAll(db);
3440: 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 69 44 62  .  }.  for(i=iDb
3450: 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b  ; i<db->nDb; i++
3460: 29 7b 0a 20 20 20 20 44 62 20 2a 70 44 62 20 3d  ){.    Db *pDb =
3470: 20 26 64 62 2d 3e 61 44 62 5b 69 5d 3b 0a 20 20   &db->aDb[i];.  
3480: 20 20 69 66 28 20 70 44 62 2d 3e 70 53 63 68 65    if( pDb->pSche
3490: 6d 61 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  ma ){.      asse
34a0: 72 74 28 69 3d 3d 31 20 7c 7c 20 28 70 44 62 2d  rt(i==1 || (pDb-
34b0: 3e 70 42 74 20 26 26 20 73 71 6c 69 74 65 33 42  >pBt && sqlite3B
34c0: 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70  treeHoldsMutex(p
34d0: 44 62 2d 3e 70 42 74 29 29 29 3b 0a 20 20 20 20  Db->pBt)));.    
34e0: 20 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 46    sqlite3SchemaF
34f0: 72 65 65 28 70 44 62 2d 3e 70 53 63 68 65 6d 61  ree(pDb->pSchema
3500: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
3510: 20 69 44 62 3e 30 20 29 20 72 65 74 75 72 6e 3b   iDb>0 ) return;
3520: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 69  .  }.  assert( i
3530: 44 62 3d 3d 30 20 29 3b 0a 20 20 64 62 2d 3e 66  Db==0 );.  db->f
3540: 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f  lags &= ~SQLITE_
3550: 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a 20  InternChanges;. 
3560: 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
3570: 76 65 41 6c 6c 28 64 62 29 3b 0a 0a 20 20 2f 2a  veAll(db);..  /*
3580: 20 49 66 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20   If one or more 
3590: 6f 66 20 74 68 65 20 61 75 78 69 6c 69 61 72 79  of the auxiliary
35a0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73 20   database files 
35b0: 68 61 73 20 62 65 65 6e 20 63 6c 6f 73 65 64 2c  has been closed,
35c0: 0a 20 20 2a 2a 20 74 68 65 6e 20 72 65 6d 6f 76  .  ** then remov
35d0: 65 20 74 68 65 6d 20 66 72 6f 6d 20 74 68 65 20  e them from the 
35e0: 61 75 78 69 6c 69 61 72 79 20 64 61 74 61 62 61  auxiliary databa
35f0: 73 65 20 6c 69 73 74 2e 20 20 57 65 20 74 61 6b  se list.  We tak
3600: 65 20 74 68 65 0a 20 20 2a 2a 20 6f 70 70 6f 72  e the.  ** oppor
3610: 74 75 6e 69 74 79 20 74 6f 20 64 6f 20 74 68 69  tunity to do thi
3620: 73 20 68 65 72 65 20 73 69 6e 63 65 20 77 65 20  s here since we 
3630: 68 61 76 65 20 6a 75 73 74 20 64 65 6c 65 74 65  have just delete
3640: 64 20 61 6c 6c 20 6f 66 20 74 68 65 0a 20 20 2a  d all of the.  *
3650: 2a 20 73 63 68 65 6d 61 20 68 61 73 68 20 74 61  * schema hash ta
3660: 62 6c 65 73 20 61 6e 64 20 74 68 65 72 65 66 6f  bles and therefo
3670: 72 65 20 64 6f 20 6e 6f 74 20 68 61 76 65 20 74  re do not have t
3680: 6f 20 6d 61 6b 65 20 61 6e 79 20 63 68 61 6e 67  o make any chang
3690: 65 73 0a 20 20 2a 2a 20 74 6f 20 61 6e 79 20 6f  es.  ** to any o
36a0: 66 20 74 68 6f 73 65 20 74 61 62 6c 65 73 2e 0a  f those tables..
36b0: 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20    */.  for(i=0; 
36c0: 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b  i<db->nDb; i++){
36d0: 0a 20 20 20 20 73 74 72 75 63 74 20 44 62 20 2a  .    struct Db *
36e0: 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69  pDb = &db->aDb[i
36f0: 5d 3b 0a 20 20 20 20 69 66 28 20 70 44 62 2d 3e  ];.    if( pDb->
3700: 70 42 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  pBt==0 ){.      
3710: 69 66 28 20 70 44 62 2d 3e 70 41 75 78 20 26 26  if( pDb->pAux &&
3720: 20 70 44 62 2d 3e 78 46 72 65 65 41 75 78 20 29   pDb->xFreeAux )
3730: 20 70 44 62 2d 3e 78 46 72 65 65 41 75 78 28 70   pDb->xFreeAux(p
3740: 44 62 2d 3e 70 41 75 78 29 3b 0a 20 20 20 20 20  Db->pAux);.     
3750: 20 70 44 62 2d 3e 70 41 75 78 20 3d 20 30 3b 0a   pDb->pAux = 0;.
3760: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 6f 72 28      }.  }.  for(
3770: 69 3d 6a 3d 32 3b 20 69 3c 64 62 2d 3e 6e 44 62  i=j=2; i<db->nDb
3780: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75  ; i++){.    stru
3790: 63 74 20 44 62 20 2a 70 44 62 20 3d 20 26 64 62  ct Db *pDb = &db
37a0: 2d 3e 61 44 62 5b 69 5d 3b 0a 20 20 20 20 69 66  ->aDb[i];.    if
37b0: 28 20 70 44 62 2d 3e 70 42 74 3d 3d 30 20 29 7b  ( pDb->pBt==0 ){
37c0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62  .      sqlite3Db
37d0: 46 72 65 65 28 64 62 2c 20 70 44 62 2d 3e 7a 4e  Free(db, pDb->zN
37e0: 61 6d 65 29 3b 0a 20 20 20 20 20 20 70 44 62 2d  ame);.      pDb-
37f0: 3e 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20  >zName = 0;.    
3800: 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
3810: 7d 0a 20 20 20 20 69 66 28 20 6a 3c 69 20 29 7b  }.    if( j<i ){
3820: 0a 20 20 20 20 20 20 64 62 2d 3e 61 44 62 5b 6a  .      db->aDb[j
3830: 5d 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 3b 0a  ] = db->aDb[i];.
3840: 20 20 20 20 7d 0a 20 20 20 20 6a 2b 2b 3b 0a 20      }.    j++;. 
3850: 20 7d 0a 20 20 6d 65 6d 73 65 74 28 26 64 62 2d   }.  memset(&db-
3860: 3e 61 44 62 5b 6a 5d 2c 20 30 2c 20 28 64 62 2d  >aDb[j], 0, (db-
3870: 3e 6e 44 62 2d 6a 29 2a 73 69 7a 65 6f 66 28 64  >nDb-j)*sizeof(d
3880: 62 2d 3e 61 44 62 5b 6a 5d 29 29 3b 0a 20 20 64  b->aDb[j]));.  d
3890: 62 2d 3e 6e 44 62 20 3d 20 6a 3b 0a 20 20 69 66  b->nDb = j;.  if
38a0: 28 20 64 62 2d 3e 6e 44 62 3c 3d 32 20 26 26 20  ( db->nDb<=2 && 
38b0: 64 62 2d 3e 61 44 62 21 3d 64 62 2d 3e 61 44 62  db->aDb!=db->aDb
38c0: 53 74 61 74 69 63 20 29 7b 0a 20 20 20 20 6d 65  Static ){.    me
38d0: 6d 63 70 79 28 64 62 2d 3e 61 44 62 53 74 61 74  mcpy(db->aDbStat
38e0: 69 63 2c 20 64 62 2d 3e 61 44 62 2c 20 32 2a 73  ic, db->aDb, 2*s
38f0: 69 7a 65 6f 66 28 64 62 2d 3e 61 44 62 5b 30 5d  izeof(db->aDb[0]
3900: 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  ));.    sqlite3D
3910: 62 46 72 65 65 28 64 62 2c 20 64 62 2d 3e 61 44  bFree(db, db->aD
3920: 62 29 3b 0a 20 20 20 20 64 62 2d 3e 61 44 62 20  b);.    db->aDb 
3930: 3d 20 64 62 2d 3e 61 44 62 53 74 61 74 69 63 3b  = db->aDbStatic;
3940: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  .  }.}../*.** Th
3950: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
3960: 6c 6c 65 64 20 77 68 65 6e 20 61 20 63 6f 6d 6d  lled when a comm
3970: 69 74 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 76 6f  it occurs..*/.vo
3980: 69 64 20 73 71 6c 69 74 65 33 43 6f 6d 6d 69 74  id sqlite3Commit
3990: 49 6e 74 65 72 6e 61 6c 43 68 61 6e 67 65 73 28  InternalChanges(
39a0: 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20  sqlite3 *db){.  
39b0: 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53 51  db->flags &= ~SQ
39c0: 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67  LITE_InternChang
39d0: 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65  es;.}../*.** Cle
39e0: 61 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61  ar the column na
39f0: 6d 65 73 20 66 72 6f 6d 20 61 20 74 61 62 6c 65  mes from a table
3a00: 20 6f 72 20 76 69 65 77 2e 0a 2a 2f 0a 73 74 61   or view..*/.sta
3a10: 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65 52  tic void sqliteR
3a20: 65 73 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28  esetColumnNames(
3a30: 54 61 62 6c 65 20 2a 70 54 61 62 6c 65 29 7b 0a  Table *pTable){.
3a40: 20 20 69 6e 74 20 69 3b 0a 20 20 43 6f 6c 75 6d    int i;.  Colum
3a50: 6e 20 2a 70 43 6f 6c 3b 0a 20 20 73 71 6c 69 74  n *pCol;.  sqlit
3a60: 65 33 20 2a 64 62 20 3d 20 70 54 61 62 6c 65 2d  e3 *db = pTable-
3a70: 3e 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20 70  >db;.  assert( p
3a80: 54 61 62 6c 65 21 3d 30 20 29 3b 0a 20 20 69 66  Table!=0 );.  if
3a90: 28 20 28 70 43 6f 6c 20 3d 20 70 54 61 62 6c 65  ( (pCol = pTable
3aa0: 2d 3e 61 43 6f 6c 29 21 3d 30 20 29 7b 0a 20 20  ->aCol)!=0 ){.  
3ab0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61    for(i=0; i<pTa
3ac0: 62 6c 65 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c 20  ble->nCol; i++, 
3ad0: 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 73  pCol++){.      s
3ae0: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
3af0: 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20   pCol->zName);. 
3b00: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
3b10: 44 65 6c 65 74 65 28 64 62 2c 20 70 43 6f 6c 2d  Delete(db, pCol-
3b20: 3e 70 44 66 6c 74 29 3b 0a 20 20 20 20 20 20 73  >pDflt);.      s
3b30: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
3b40: 20 70 43 6f 6c 2d 3e 7a 54 79 70 65 29 3b 0a 20   pCol->zType);. 
3b50: 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
3b60: 65 65 28 64 62 2c 20 70 43 6f 6c 2d 3e 7a 43 6f  ee(db, pCol->zCo
3b70: 6c 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  ll);.    }.    s
3b80: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
3b90: 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 29 3b 0a   pTable->aCol);.
3ba0: 20 20 7d 0a 20 20 70 54 61 62 6c 65 2d 3e 61 43    }.  pTable->aC
3bb0: 6f 6c 20 3d 20 30 3b 0a 20 20 70 54 61 62 6c 65  ol = 0;.  pTable
3bc0: 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 7d 0a 0a 2f  ->nCol = 0;.}../
3bd0: 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 74 68 65 20  *.** Remove the 
3be0: 6d 65 6d 6f 72 79 20 64 61 74 61 20 73 74 72 75  memory data stru
3bf0: 63 74 75 72 65 73 20 61 73 73 6f 63 69 61 74 65  ctures associate
3c00: 64 20 77 69 74 68 20 74 68 65 20 67 69 76 65 6e  d with the given
3c10: 0a 2a 2a 20 54 61 62 6c 65 2e 20 20 4e 6f 20 63  .** Table.  No c
3c20: 68 61 6e 67 65 73 20 61 72 65 20 6d 61 64 65 20  hanges are made 
3c30: 74 6f 20 64 69 73 6b 20 62 79 20 74 68 69 73 20  to disk by this 
3c40: 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54  routine..**.** T
3c50: 68 69 73 20 72 6f 75 74 69 6e 65 20 6a 75 73 74  his routine just
3c60: 20 64 65 6c 65 74 65 73 20 74 68 65 20 64 61 74   deletes the dat
3c70: 61 20 73 74 72 75 63 74 75 72 65 2e 20 20 49 74  a structure.  It
3c80: 20 64 6f 65 73 20 6e 6f 74 20 75 6e 6c 69 6e 6b   does not unlink
3c90: 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 64 61  .** the table da
3ca0: 74 61 20 73 74 72 75 63 74 75 72 65 20 66 72 6f  ta structure fro
3cb0: 6d 20 74 68 65 20 68 61 73 68 20 74 61 62 6c 65  m the hash table
3cc0: 2e 20 20 4e 6f 72 20 64 6f 65 73 20 69 74 20 72  .  Nor does it r
3cd0: 65 6d 6f 76 65 0a 2a 2a 20 66 6f 72 65 69 67 6e  emove.** foreign
3ce0: 20 6b 65 79 73 20 66 72 6f 6d 20 74 68 65 20 73   keys from the s
3cf0: 71 6c 69 74 65 2e 61 46 4b 65 79 20 68 61 73 68  qlite.aFKey hash
3d00: 20 74 61 62 6c 65 2e 20 20 42 75 74 20 69 74 20   table.  But it 
3d10: 64 6f 65 73 20 64 65 73 74 72 6f 79 0a 2a 2a 20  does destroy.** 
3d20: 6d 65 6d 6f 72 79 20 73 74 72 75 63 74 75 72 65  memory structure
3d30: 73 20 6f 66 20 74 68 65 20 69 6e 64 69 63 65 73  s of the indices
3d40: 20 61 6e 64 20 66 6f 72 65 69 67 6e 20 6b 65 79   and foreign key
3d50: 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
3d60: 68 20 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 2e  h .** the table.
3d70: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
3d80: 44 65 6c 65 74 65 54 61 62 6c 65 28 54 61 62 6c  DeleteTable(Tabl
3d90: 65 20 2a 70 54 61 62 6c 65 29 7b 0a 20 20 49 6e  e *pTable){.  In
3da0: 64 65 78 20 2a 70 49 6e 64 65 78 2c 20 2a 70 4e  dex *pIndex, *pN
3db0: 65 78 74 3b 0a 20 20 46 4b 65 79 20 2a 70 46 4b  ext;.  FKey *pFK
3dc0: 65 79 2c 20 2a 70 4e 65 78 74 46 4b 65 79 3b 0a  ey, *pNextFKey;.
3dd0: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 0a    sqlite3 *db;..
3de0: 20 20 69 66 28 20 70 54 61 62 6c 65 3d 3d 30 20    if( pTable==0 
3df0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 64 62 20 3d  ) return;.  db =
3e00: 20 70 54 61 62 6c 65 2d 3e 64 62 3b 0a 0a 20 20   pTable->db;..  
3e10: 2f 2a 20 44 6f 20 6e 6f 74 20 64 65 6c 65 74 65  /* Do not delete
3e20: 20 74 68 65 20 74 61 62 6c 65 20 75 6e 74 69 6c   the table until
3e30: 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 63   the reference c
3e40: 6f 75 6e 74 20 72 65 61 63 68 65 73 20 7a 65 72  ount reaches zer
3e50: 6f 2e 20 2a 2f 0a 20 20 70 54 61 62 6c 65 2d 3e  o. */.  pTable->
3e60: 6e 52 65 66 2d 2d 3b 0a 20 20 69 66 28 20 70 54  nRef--;.  if( pT
3e70: 61 62 6c 65 2d 3e 6e 52 65 66 3e 30 20 29 7b 0a  able->nRef>0 ){.
3e80: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
3e90: 20 20 61 73 73 65 72 74 28 20 70 54 61 62 6c 65    assert( pTable
3ea0: 2d 3e 6e 52 65 66 3d 3d 30 20 29 3b 0a 0a 20 20  ->nRef==0 );..  
3eb0: 2f 2a 20 44 65 6c 65 74 65 20 61 6c 6c 20 69 6e  /* Delete all in
3ec0: 64 69 63 65 73 20 61 73 73 6f 63 69 61 74 65 64  dices associated
3ed0: 20 77 69 74 68 20 74 68 69 73 20 74 61 62 6c 65   with this table
3ee0: 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 70 49 6e 64  .  */.  for(pInd
3ef0: 65 78 20 3d 20 70 54 61 62 6c 65 2d 3e 70 49 6e  ex = pTable->pIn
3f00: 64 65 78 3b 20 70 49 6e 64 65 78 3b 20 70 49 6e  dex; pIndex; pIn
3f10: 64 65 78 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20  dex=pNext){.    
3f20: 70 4e 65 78 74 20 3d 20 70 49 6e 64 65 78 2d 3e  pNext = pIndex->
3f30: 70 4e 65 78 74 3b 0a 20 20 20 20 61 73 73 65 72  pNext;.    asser
3f40: 74 28 20 70 49 6e 64 65 78 2d 3e 70 53 63 68 65  t( pIndex->pSche
3f50: 6d 61 3d 3d 70 54 61 62 6c 65 2d 3e 70 53 63 68  ma==pTable->pSch
3f60: 65 6d 61 20 29 3b 0a 20 20 20 20 73 71 6c 69 74  ema );.    sqlit
3f70: 65 44 65 6c 65 74 65 49 6e 64 65 78 28 70 49 6e  eDeleteIndex(pIn
3f80: 64 65 78 29 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64  dex);.  }..#ifnd
3f90: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46  ef SQLITE_OMIT_F
3fa0: 4f 52 45 49 47 4e 5f 4b 45 59 0a 20 20 2f 2a 20  OREIGN_KEY.  /* 
3fb0: 44 65 6c 65 74 65 20 61 6c 6c 20 66 6f 72 65 69  Delete all forei
3fc0: 67 6e 20 6b 65 79 73 20 61 73 73 6f 63 69 61 74  gn keys associat
3fd0: 65 64 20 77 69 74 68 20 74 68 69 73 20 74 61 62  ed with this tab
3fe0: 6c 65 2e 20 20 54 68 65 20 6b 65 79 73 0a 20 20  le.  The keys.  
3ff0: 2a 2a 20 73 68 6f 75 6c 64 20 68 61 76 65 20 61  ** should have a
4000: 6c 72 65 61 64 79 20 62 65 65 6e 20 75 6e 6c 69  lready been unli
4010: 6e 6b 65 64 20 66 72 6f 6d 20 74 68 65 20 70 53  nked from the pS
4020: 63 68 65 6d 61 2d 3e 61 46 4b 65 79 20 68 61 73  chema->aFKey has
4030: 68 20 74 61 62 6c 65 20 0a 20 20 2a 2f 0a 20 20  h table .  */.  
4040: 66 6f 72 28 70 46 4b 65 79 3d 70 54 61 62 6c 65  for(pFKey=pTable
4050: 2d 3e 70 46 4b 65 79 3b 20 70 46 4b 65 79 3b 20  ->pFKey; pFKey; 
4060: 70 46 4b 65 79 3d 70 4e 65 78 74 46 4b 65 79 29  pFKey=pNextFKey)
4070: 7b 0a 20 20 20 20 70 4e 65 78 74 46 4b 65 79 20  {.    pNextFKey 
4080: 3d 20 70 46 4b 65 79 2d 3e 70 4e 65 78 74 46 72  = pFKey->pNextFr
4090: 6f 6d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  om;.    assert( 
40a0: 73 71 6c 69 74 65 33 48 61 73 68 46 69 6e 64 28  sqlite3HashFind(
40b0: 26 70 54 61 62 6c 65 2d 3e 70 53 63 68 65 6d 61  &pTable->pSchema
40c0: 2d 3e 61 46 4b 65 79 2c 0a 20 20 20 20 20 20 20  ->aFKey,.       
40d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
40e0: 20 20 20 20 70 46 4b 65 79 2d 3e 7a 54 6f 2c 20      pFKey->zTo, 
40f0: 73 74 72 6c 65 6e 28 70 46 4b 65 79 2d 3e 7a 54  strlen(pFKey->zT
4100: 6f 29 2b 31 29 21 3d 70 46 4b 65 79 20 29 3b 0a  o)+1)!=pFKey );.
4110: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
4120: 65 28 64 62 2c 20 70 46 4b 65 79 29 3b 0a 20 20  e(db, pFKey);.  
4130: 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 44  }.#endif..  /* D
4140: 65 6c 65 74 65 20 74 68 65 20 54 61 62 6c 65 20  elete the Table 
4150: 73 74 72 75 63 74 75 72 65 20 69 74 73 65 6c 66  structure itself
4160: 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 52  ..  */.  sqliteR
4170: 65 73 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28  esetColumnNames(
4180: 70 54 61 62 6c 65 29 3b 0a 20 20 73 71 6c 69 74  pTable);.  sqlit
4190: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 54 61  e3DbFree(db, pTa
41a0: 62 6c 65 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 73  ble->zName);.  s
41b0: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
41c0: 20 70 54 61 62 6c 65 2d 3e 7a 43 6f 6c 41 66 66   pTable->zColAff
41d0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65  );.  sqlite3Sele
41e0: 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70 54 61  ctDelete(db, pTa
41f0: 62 6c 65 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 23  ble->pSelect);.#
4200: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
4210: 49 54 5f 43 48 45 43 4b 0a 20 20 73 71 6c 69 74  IT_CHECK.  sqlit
4220: 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c  e3ExprDelete(db,
4230: 20 70 54 61 62 6c 65 2d 3e 70 43 68 65 63 6b 29   pTable->pCheck)
4240: 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74  ;.#endif.  sqlit
4250: 65 33 56 74 61 62 43 6c 65 61 72 28 70 54 61 62  e3VtabClear(pTab
4260: 6c 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62  le);.  sqlite3Db
4270: 46 72 65 65 28 64 62 2c 20 70 54 61 62 6c 65 29  Free(db, pTable)
4280: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 69 6e  ;.}../*.** Unlin
4290: 6b 20 74 68 65 20 67 69 76 65 6e 20 74 61 62 6c  k the given tabl
42a0: 65 20 66 72 6f 6d 20 74 68 65 20 68 61 73 68 20  e from the hash 
42b0: 74 61 62 6c 65 73 20 61 6e 64 20 74 68 65 20 64  tables and the d
42c0: 65 6c 65 74 65 20 74 68 65 0a 2a 2a 20 74 61 62  elete the.** tab
42d0: 6c 65 20 73 74 72 75 63 74 75 72 65 20 77 69 74  le structure wit
42e0: 68 20 61 6c 6c 20 69 74 73 20 69 6e 64 69 63 65  h all its indice
42f0: 73 20 61 6e 64 20 66 6f 72 65 69 67 6e 20 6b 65  s and foreign ke
4300: 79 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ys..*/.void sqli
4310: 74 65 33 55 6e 6c 69 6e 6b 41 6e 64 44 65 6c 65  te3UnlinkAndDele
4320: 74 65 54 61 62 6c 65 28 73 71 6c 69 74 65 33 20  teTable(sqlite3 
4330: 2a 64 62 2c 20 69 6e 74 20 69 44 62 2c 20 63 6f  *db, int iDb, co
4340: 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62 4e 61  nst char *zTabNa
4350: 6d 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b  me){.  Table *p;
4360: 0a 20 20 46 4b 65 79 20 2a 70 46 31 2c 20 2a 70  .  FKey *pF1, *p
4370: 46 32 3b 0a 20 20 44 62 20 2a 70 44 62 3b 0a 0a  F2;.  Db *pDb;..
4380: 20 20 61 73 73 65 72 74 28 20 64 62 21 3d 30 20    assert( db!=0 
4390: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 44 62  );.  assert( iDb
43a0: 3e 3d 30 20 26 26 20 69 44 62 3c 64 62 2d 3e 6e  >=0 && iDb<db->n
43b0: 44 62 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  Db );.  assert( 
43c0: 7a 54 61 62 4e 61 6d 65 20 26 26 20 7a 54 61 62  zTabName && zTab
43d0: 4e 61 6d 65 5b 30 5d 20 29 3b 0a 20 20 70 44 62  Name[0] );.  pDb
43e0: 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d   = &db->aDb[iDb]
43f0: 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 48  ;.  p = sqlite3H
4400: 61 73 68 49 6e 73 65 72 74 28 26 70 44 62 2d 3e  ashInsert(&pDb->
4410: 70 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68  pSchema->tblHash
4420: 2c 20 7a 54 61 62 4e 61 6d 65 2c 20 73 74 72 6c  , zTabName, strl
4430: 65 6e 28 7a 54 61 62 4e 61 6d 65 29 2b 31 2c 30  en(zTabName)+1,0
4440: 29 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 23 69  );.  if( p ){.#i
4450: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
4460: 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 0a 20 20  T_FOREIGN_KEY.  
4470: 20 20 66 6f 72 28 70 46 31 3d 70 2d 3e 70 46 4b    for(pF1=p->pFK
4480: 65 79 3b 20 70 46 31 3b 20 70 46 31 3d 70 46 31  ey; pF1; pF1=pF1
4490: 2d 3e 70 4e 65 78 74 46 72 6f 6d 29 7b 0a 20 20  ->pNextFrom){.  
44a0: 20 20 20 20 69 6e 74 20 6e 54 6f 20 3d 20 73 74      int nTo = st
44b0: 72 6c 65 6e 28 70 46 31 2d 3e 7a 54 6f 29 20 2b  rlen(pF1->zTo) +
44c0: 20 31 3b 0a 20 20 20 20 20 20 70 46 32 20 3d 20   1;.      pF2 = 
44d0: 73 71 6c 69 74 65 33 48 61 73 68 46 69 6e 64 28  sqlite3HashFind(
44e0: 26 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 61  &pDb->pSchema->a
44f0: 46 4b 65 79 2c 20 70 46 31 2d 3e 7a 54 6f 2c 20  FKey, pF1->zTo, 
4500: 6e 54 6f 29 3b 0a 20 20 20 20 20 20 69 66 28 20  nTo);.      if( 
4510: 70 46 32 3d 3d 70 46 31 20 29 7b 0a 20 20 20 20  pF2==pF1 ){.    
4520: 20 20 20 20 73 71 6c 69 74 65 33 48 61 73 68 49      sqlite3HashI
4530: 6e 73 65 72 74 28 26 70 44 62 2d 3e 70 53 63 68  nsert(&pDb->pSch
4540: 65 6d 61 2d 3e 61 46 4b 65 79 2c 20 70 46 31 2d  ema->aFKey, pF1-
4550: 3e 7a 54 6f 2c 20 6e 54 6f 2c 20 70 46 31 2d 3e  >zTo, nTo, pF1->
4560: 70 4e 65 78 74 54 6f 29 3b 0a 20 20 20 20 20 20  pNextTo);.      
4570: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 77  }else{.        w
4580: 68 69 6c 65 28 20 70 46 32 20 26 26 20 70 46 32  hile( pF2 && pF2
4590: 2d 3e 70 4e 65 78 74 54 6f 21 3d 70 46 31 20 29  ->pNextTo!=pF1 )
45a0: 7b 20 70 46 32 3d 70 46 32 2d 3e 70 4e 65 78 74  { pF2=pF2->pNext
45b0: 54 6f 3b 20 7d 0a 20 20 20 20 20 20 20 20 69 66  To; }.        if
45c0: 28 20 70 46 32 20 29 7b 0a 20 20 20 20 20 20 20  ( pF2 ){.       
45d0: 20 20 20 70 46 32 2d 3e 70 4e 65 78 74 54 6f 20     pF2->pNextTo 
45e0: 3d 20 70 46 31 2d 3e 70 4e 65 78 74 54 6f 3b 0a  = pF1->pNextTo;.
45f0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
4600: 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  }.    }.#endif. 
4610: 20 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65     sqlite3Delete
4620: 54 61 62 6c 65 28 70 29 3b 0a 20 20 7d 0a 20 20  Table(p);.  }.  
4630: 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c  db->flags |= SQL
4640: 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65  ITE_InternChange
4650: 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65  s;.}../*.** Give
4660: 6e 20 61 20 74 6f 6b 65 6e 2c 20 72 65 74 75 72  n a token, retur
4670: 6e 20 61 20 73 74 72 69 6e 67 20 74 68 61 74 20  n a string that 
4680: 63 6f 6e 73 69 73 74 73 20 6f 66 20 74 68 65 20  consists of the 
4690: 74 65 78 74 20 6f 66 20 74 68 61 74 0a 2a 2a 20  text of that.** 
46a0: 74 6f 6b 65 6e 20 77 69 74 68 20 61 6e 79 20 71  token with any q
46b0: 75 6f 74 61 74 69 6f 6e 73 20 72 65 6d 6f 76 65  uotations remove
46c0: 64 2e 20 20 53 70 61 63 65 20 74 6f 20 68 6f 6c  d.  Space to hol
46d0: 64 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 73  d the returned s
46e0: 74 72 69 6e 67 0a 2a 2a 20 69 73 20 6f 62 74 61  tring.** is obta
46f0: 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65  ined from sqlite
4700: 4d 61 6c 6c 6f 63 28 29 20 61 6e 64 20 6d 75 73  Malloc() and mus
4710: 74 20 62 65 20 66 72 65 65 64 20 62 79 20 74 68  t be freed by th
4720: 65 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 66 75 6e  e calling.** fun
4730: 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 6f 6b  ction..**.** Tok
4740: 65 6e 73 20 61 72 65 20 6f 66 74 65 6e 20 6a 75  ens are often ju
4750: 73 74 20 70 6f 69 6e 74 65 72 73 20 69 6e 74 6f  st pointers into
4760: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 53 51   the original SQ
4770: 4c 20 74 65 78 74 20 61 6e 64 20 73 6f 0a 2a 2a  L text and so.**
4780: 20 61 72 65 20 6e 6f 74 20 5c 30 30 30 20 74 65   are not \000 te
4790: 72 6d 69 6e 61 74 65 64 20 61 6e 64 20 61 72 65  rminated and are
47a0: 20 6e 6f 74 20 70 65 72 73 69 73 74 65 6e 74 2e   not persistent.
47b0: 20 20 54 68 65 20 72 65 74 75 72 6e 65 64 20 73    The returned s
47c0: 74 72 69 6e 67 0a 2a 2a 20 69 73 20 5c 30 30 30  tring.** is \000
47d0: 20 74 65 72 6d 69 6e 61 74 65 64 20 61 6e 64 20   terminated and 
47e0: 69 73 20 70 65 72 73 69 73 74 65 6e 74 2e 0a 2a  is persistent..*
47f0: 2f 0a 63 68 61 72 20 2a 73 71 6c 69 74 65 33 4e  /.char *sqlite3N
4800: 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 73 71 6c  ameFromToken(sql
4810: 69 74 65 33 20 2a 64 62 2c 20 54 6f 6b 65 6e 20  ite3 *db, Token 
4820: 2a 70 4e 61 6d 65 29 7b 0a 20 20 63 68 61 72 20  *pName){.  char 
4830: 2a 7a 4e 61 6d 65 3b 0a 20 20 69 66 28 20 70 4e  *zName;.  if( pN
4840: 61 6d 65 20 29 7b 0a 20 20 20 20 7a 4e 61 6d 65  ame ){.    zName
4850: 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 4e   = sqlite3DbStrN
4860: 44 75 70 28 64 62 2c 20 28 63 68 61 72 2a 29 70  Dup(db, (char*)p
4870: 4e 61 6d 65 2d 3e 7a 2c 20 70 4e 61 6d 65 2d 3e  Name->z, pName->
4880: 6e 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  n);.    sqlite3D
4890: 65 71 75 6f 74 65 28 7a 4e 61 6d 65 29 3b 0a 20  equote(zName);. 
48a0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 4e 61 6d   }else{.    zNam
48b0: 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74  e = 0;.  }.  ret
48c0: 75 72 6e 20 7a 4e 61 6d 65 3b 0a 7d 0a 0a 2f 2a  urn zName;.}../*
48d0: 0a 2a 2a 20 4f 70 65 6e 20 74 68 65 20 73 71 6c  .** Open the sql
48e0: 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65  ite_master table
48f0: 20 73 74 6f 72 65 64 20 69 6e 20 64 61 74 61 62   stored in datab
4900: 61 73 65 20 6e 75 6d 62 65 72 20 69 44 62 20 66  ase number iDb f
4910: 6f 72 0a 2a 2a 20 77 72 69 74 69 6e 67 2e 20 54  or.** writing. T
4920: 68 65 20 74 61 62 6c 65 20 69 73 20 6f 70 65 6e  he table is open
4930: 65 64 20 75 73 69 6e 67 20 63 75 72 73 6f 72 20  ed using cursor 
4940: 30 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  0..*/.void sqlit
4950: 65 33 4f 70 65 6e 4d 61 73 74 65 72 54 61 62 6c  e3OpenMasterTabl
4960: 65 28 50 61 72 73 65 20 2a 70 2c 20 69 6e 74 20  e(Parse *p, int 
4970: 69 44 62 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  iDb){.  Vdbe *v 
4980: 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
4990: 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 54 61  (p);.  sqlite3Ta
49a0: 62 6c 65 4c 6f 63 6b 28 70 2c 20 69 44 62 2c 20  bleLock(p, iDb, 
49b0: 4d 41 53 54 45 52 5f 52 4f 4f 54 2c 20 31 2c 20  MASTER_ROOT, 1, 
49c0: 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 44 62  SCHEMA_TABLE(iDb
49d0: 29 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  ));.  sqlite3Vdb
49e0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 65  eAddOp2(v, OP_Se
49f0: 74 4e 75 6d 43 6f 6c 75 6d 6e 73 2c 20 30 2c 20  tNumColumns, 0, 
4a00: 35 29 3b 2f 2a 20 73 71 6c 69 74 65 5f 6d 61 73  5);/* sqlite_mas
4a10: 74 65 72 20 68 61 73 20 35 20 63 6f 6c 75 6d 6e  ter has 5 column
4a20: 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64  s */.  sqlite3Vd
4a30: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4f  beAddOp3(v, OP_O
4a40: 70 65 6e 57 72 69 74 65 2c 20 30 2c 20 4d 41 53  penWrite, 0, MAS
4a50: 54 45 52 5f 52 4f 4f 54 2c 20 69 44 62 29 3b 0a  TER_ROOT, iDb);.
4a60: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 74 6f 6b  }../*.** The tok
4a70: 65 6e 20 2a 70 4e 61 6d 65 20 63 6f 6e 74 61 69  en *pName contai
4a80: 6e 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61  ns the name of a
4a90: 20 64 61 74 61 62 61 73 65 20 28 65 69 74 68 65   database (eithe
4aa0: 72 20 22 6d 61 69 6e 22 20 6f 72 0a 2a 2a 20 22  r "main" or.** "
4ab0: 74 65 6d 70 22 20 6f 72 20 74 68 65 20 6e 61 6d  temp" or the nam
4ac0: 65 20 6f 66 20 61 6e 20 61 74 74 61 63 68 65 64  e of an attached
4ad0: 20 64 62 29 2e 20 54 68 69 73 20 72 6f 75 74 69   db). This routi
4ae0: 6e 65 20 72 65 74 75 72 6e 73 20 74 68 65 0a 2a  ne returns the.*
4af0: 2a 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20 6e  * index of the n
4b00: 61 6d 65 64 20 64 61 74 61 62 61 73 65 20 69 6e  amed database in
4b10: 20 64 62 2d 3e 61 44 62 5b 5d 2c 20 6f 72 20 2d   db->aDb[], or -
4b20: 31 20 69 66 20 74 68 65 20 6e 61 6d 65 64 20 64  1 if the named d
4b30: 62 20 0a 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 65  b .** does not e
4b40: 78 69 73 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  xist..*/.int sql
4b50: 69 74 65 33 46 69 6e 64 44 62 28 73 71 6c 69 74  ite3FindDb(sqlit
4b60: 65 33 20 2a 64 62 2c 20 54 6f 6b 65 6e 20 2a 70  e3 *db, Token *p
4b70: 4e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 69 20 3d  Name){.  int i =
4b80: 20 2d 31 3b 20 20 20 20 2f 2a 20 44 61 74 61 62   -1;    /* Datab
4b90: 61 73 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20  ase number */.  
4ba0: 69 6e 74 20 6e 3b 20 20 20 20 20 20 20 20 20 2f  int n;         /
4bb0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 68 61 72  * Number of char
4bc0: 61 63 74 65 72 73 20 69 6e 20 74 68 65 20 6e 61  acters in the na
4bd0: 6d 65 20 2a 2f 0a 20 20 44 62 20 2a 70 44 62 3b  me */.  Db *pDb;
4be0: 20 20 20 20 20 20 20 2f 2a 20 41 20 64 61 74 61         /* A data
4bf0: 62 61 73 65 20 77 68 6f 73 65 20 6e 61 6d 65 20  base whose name 
4c00: 73 70 61 63 65 20 69 73 20 62 65 69 6e 67 20 73  space is being s
4c10: 65 61 72 63 68 65 64 20 2a 2f 0a 20 20 63 68 61  earched */.  cha
4c20: 72 20 2a 7a 4e 61 6d 65 3b 20 20 20 2f 2a 20 4e  r *zName;   /* N
4c30: 61 6d 65 20 77 65 20 61 72 65 20 73 65 61 72 63  ame we are searc
4c40: 68 69 6e 67 20 66 6f 72 20 2a 2f 0a 0a 20 20 7a  hing for */..  z
4c50: 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61  Name = sqlite3Na
4c60: 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20  meFromToken(db, 
4c70: 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a 4e  pName);.  if( zN
4c80: 61 6d 65 20 29 7b 0a 20 20 20 20 6e 20 3d 20 73  ame ){.    n = s
4c90: 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 3b 0a 20 20  trlen(zName);.  
4ca0: 20 20 66 6f 72 28 69 3d 28 64 62 2d 3e 6e 44 62    for(i=(db->nDb
4cb0: 2d 31 29 2c 20 70 44 62 3d 26 64 62 2d 3e 61 44  -1), pDb=&db->aD
4cc0: 62 5b 69 5d 3b 20 69 3e 3d 30 3b 20 69 2d 2d 2c  b[i]; i>=0; i--,
4cd0: 20 70 44 62 2d 2d 29 7b 0a 20 20 20 20 20 20 69   pDb--){.      i
4ce0: 66 28 20 28 21 4f 4d 49 54 5f 54 45 4d 50 44 42  f( (!OMIT_TEMPDB
4cf0: 20 7c 7c 20 69 21 3d 31 20 29 20 26 26 20 6e 3d   || i!=1 ) && n=
4d00: 3d 73 74 72 6c 65 6e 28 70 44 62 2d 3e 7a 4e 61  =strlen(pDb->zNa
4d10: 6d 65 29 20 26 26 20 0a 20 20 20 20 20 20 20 20  me) && .        
4d20: 20 20 30 3d 3d 73 71 6c 69 74 65 33 53 74 72 49    0==sqlite3StrI
4d30: 43 6d 70 28 70 44 62 2d 3e 7a 4e 61 6d 65 2c 20  Cmp(pDb->zName, 
4d40: 7a 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 20 20  zName) ){.      
4d50: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
4d60: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
4d70: 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4e 61  e3DbFree(db, zNa
4d80: 6d 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  me);.  }.  retur
4d90: 6e 20 69 3b 0a 7d 0a 0a 2f 2a 20 54 68 65 20 74  n i;.}../* The t
4da0: 61 62 6c 65 20 6f 72 20 76 69 65 77 20 6f 72 20  able or view or 
4db0: 74 72 69 67 67 65 72 20 6e 61 6d 65 20 69 73 20  trigger name is 
4dc0: 70 61 73 73 65 64 20 74 6f 20 74 68 69 73 20 72  passed to this r
4dd0: 6f 75 74 69 6e 65 20 76 69 61 20 74 6f 6b 65 6e  outine via token
4de0: 73 0a 2a 2a 20 70 4e 61 6d 65 31 20 61 6e 64 20  s.** pName1 and 
4df0: 70 4e 61 6d 65 32 2e 20 49 66 20 74 68 65 20 74  pName2. If the t
4e00: 61 62 6c 65 20 6e 61 6d 65 20 77 61 73 20 66 75  able name was fu
4e10: 6c 6c 79 20 71 75 61 6c 69 66 69 65 64 2c 20 66  lly qualified, f
4e20: 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a  or example:.**.*
4e30: 2a 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 78  * CREATE TABLE x
4e40: 78 78 2e 79 79 79 20 28 2e 2e 2e 29 3b 0a 2a 2a  xx.yyy (...);.**
4e50: 20 0a 2a 2a 20 54 68 65 6e 20 70 4e 61 6d 65 31   .** Then pName1
4e60: 20 69 73 20 73 65 74 20 74 6f 20 22 78 78 78 22   is set to "xxx"
4e70: 20 61 6e 64 20 70 4e 61 6d 65 32 20 22 79 79 79   and pName2 "yyy
4e80: 22 2e 20 4f 6e 20 74 68 65 20 6f 74 68 65 72 20  ". On the other 
4e90: 68 61 6e 64 20 69 66 0a 2a 2a 20 74 68 65 20 74  hand if.** the t
4ea0: 61 62 6c 65 20 6e 61 6d 65 20 69 73 20 6e 6f 74  able name is not
4eb0: 20 66 75 6c 6c 79 20 71 75 61 6c 69 66 69 65 64   fully qualified
4ec0: 2c 20 69 2e 65 2e 3a 0a 2a 2a 0a 2a 2a 20 43 52  , i.e.:.**.** CR
4ed0: 45 41 54 45 20 54 41 42 4c 45 20 79 79 79 28 2e  EATE TABLE yyy(.
4ee0: 2e 2e 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20  ..);.**.** Then 
4ef0: 70 4e 61 6d 65 31 20 69 73 20 73 65 74 20 74 6f  pName1 is set to
4f00: 20 22 79 79 79 22 20 61 6e 64 20 70 4e 61 6d 65   "yyy" and pName
4f10: 32 20 69 73 20 22 22 2e 0a 2a 2a 0a 2a 2a 20 54  2 is ""..**.** T
4f20: 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73  his routine sets
4f30: 20 74 68 65 20 2a 70 70 55 6e 71 75 61 6c 20 70   the *ppUnqual p
4f40: 6f 69 6e 74 65 72 20 74 6f 20 70 6f 69 6e 74 20  ointer to point 
4f50: 61 74 20 74 68 65 20 74 6f 6b 65 6e 20 28 70 4e  at the token (pN
4f60: 61 6d 65 31 20 6f 72 0a 2a 2a 20 70 4e 61 6d 65  ame1 or.** pName
4f70: 32 29 20 74 68 61 74 20 73 74 6f 72 65 73 20 74  2) that stores t
4f80: 68 65 20 75 6e 71 75 61 6c 69 66 69 65 64 20 74  he unqualified t
4f90: 61 62 6c 65 20 6e 61 6d 65 2e 20 20 54 68 65 20  able name.  The 
4fa0: 69 6e 64 65 78 20 6f 66 20 74 68 65 0a 2a 2a 20  index of the.** 
4fb0: 64 61 74 61 62 61 73 65 20 22 78 78 78 22 20 69  database "xxx" i
4fc0: 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69  s returned..*/.i
4fd0: 6e 74 20 73 71 6c 69 74 65 33 54 77 6f 50 61 72  nt sqlite3TwoPar
4fe0: 74 4e 61 6d 65 28 0a 20 20 50 61 72 73 65 20 2a  tName(.  Parse *
4ff0: 70 50 61 72 73 65 2c 20 20 20 20 20 20 2f 2a 20  pParse,      /* 
5000: 50 61 72 73 69 6e 67 20 61 6e 64 20 63 6f 64 65  Parsing and code
5010: 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74   generating cont
5020: 65 78 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  ext */.  Token *
5030: 70 4e 61 6d 65 31 2c 20 20 20 20 20 20 2f 2a 20  pName1,      /* 
5040: 54 68 65 20 22 78 78 78 22 20 69 6e 20 74 68 65  The "xxx" in the
5050: 20 6e 61 6d 65 20 22 78 78 78 2e 79 79 79 22 20   name "xxx.yyy" 
5060: 6f 72 20 22 78 78 78 22 20 2a 2f 0a 20 20 54 6f  or "xxx" */.  To
5070: 6b 65 6e 20 2a 70 4e 61 6d 65 32 2c 20 20 20 20  ken *pName2,    
5080: 20 20 2f 2a 20 54 68 65 20 22 79 79 79 22 20 69    /* The "yyy" i
5090: 6e 20 74 68 65 20 6e 61 6d 65 20 22 78 78 78 2e  n the name "xxx.
50a0: 79 79 79 22 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  yyy" */.  Token 
50b0: 2a 2a 70 55 6e 71 75 61 6c 20 20 20 20 20 2f 2a  **pUnqual     /*
50c0: 20 57 72 69 74 65 20 74 68 65 20 75 6e 71 75 61   Write the unqua
50d0: 6c 69 66 69 65 64 20 6f 62 6a 65 63 74 20 6e 61  lified object na
50e0: 6d 65 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20  me here */.){.  
50f0: 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20 20 20  int iDb;        
5100: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
5110: 61 74 61 62 61 73 65 20 68 6f 6c 64 69 6e 67 20  atabase holding 
5120: 74 68 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  the object */.  
5130: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
5140: 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 69 66 28  arse->db;..  if(
5150: 20 70 4e 61 6d 65 32 20 26 26 20 70 4e 61 6d 65   pName2 && pName
5160: 32 2d 3e 6e 3e 30 20 29 7b 0a 20 20 20 20 61 73  2->n>0 ){.    as
5170: 73 65 72 74 28 20 21 64 62 2d 3e 69 6e 69 74 2e  sert( !db->init.
5180: 62 75 73 79 20 29 3b 0a 20 20 20 20 2a 70 55 6e  busy );.    *pUn
5190: 71 75 61 6c 20 3d 20 70 4e 61 6d 65 32 3b 0a 20  qual = pName2;. 
51a0: 20 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33     iDb = sqlite3
51b0: 46 69 6e 64 44 62 28 64 62 2c 20 70 4e 61 6d 65  FindDb(db, pName
51c0: 31 29 3b 0a 20 20 20 20 69 66 28 20 69 44 62 3c  1);.    if( iDb<
51d0: 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
51e0: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
51f0: 65 2c 20 22 75 6e 6b 6e 6f 77 6e 20 64 61 74 61  e, "unknown data
5200: 62 61 73 65 20 25 54 22 2c 20 70 4e 61 6d 65 31  base %T", pName1
5210: 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d  );.      pParse-
5220: 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 72  >nErr++;.      r
5230: 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a  eturn -1;.    }.
5240: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73    }else{.    ass
5250: 65 72 74 28 20 64 62 2d 3e 69 6e 69 74 2e 69 44  ert( db->init.iD
5260: 62 3d 3d 30 20 7c 7c 20 64 62 2d 3e 69 6e 69 74  b==0 || db->init
5270: 2e 62 75 73 79 20 29 3b 0a 20 20 20 20 69 44 62  .busy );.    iDb
5280: 20 3d 20 64 62 2d 3e 69 6e 69 74 2e 69 44 62 3b   = db->init.iDb;
5290: 0a 20 20 20 20 2a 70 55 6e 71 75 61 6c 20 3d 20  .    *pUnqual = 
52a0: 70 4e 61 6d 65 31 3b 0a 20 20 7d 0a 20 20 72 65  pName1;.  }.  re
52b0: 74 75 72 6e 20 69 44 62 3b 0a 7d 0a 0a 2f 2a 0a  turn iDb;.}../*.
52c0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
52d0: 69 73 20 75 73 65 64 20 74 6f 20 63 68 65 63 6b  is used to check
52e0: 20 69 66 20 74 68 65 20 55 54 46 2d 38 20 73 74   if the UTF-8 st
52f0: 72 69 6e 67 20 7a 4e 61 6d 65 20 69 73 20 61 20  ring zName is a 
5300: 6c 65 67 61 6c 0a 2a 2a 20 75 6e 71 75 61 6c 69  legal.** unquali
5310: 66 69 65 64 20 6e 61 6d 65 20 66 6f 72 20 61 20  fied name for a 
5320: 6e 65 77 20 73 63 68 65 6d 61 20 6f 62 6a 65 63  new schema objec
5330: 74 20 28 74 61 62 6c 65 2c 20 69 6e 64 65 78 2c  t (table, index,
5340: 20 76 69 65 77 20 6f 72 0a 2a 2a 20 74 72 69 67   view or.** trig
5350: 67 65 72 29 2e 20 41 6c 6c 20 6e 61 6d 65 73 20  ger). All names 
5360: 61 72 65 20 6c 65 67 61 6c 20 65 78 63 65 70 74  are legal except
5370: 20 74 68 6f 73 65 20 74 68 61 74 20 62 65 67 69   those that begi
5380: 6e 20 77 69 74 68 20 74 68 65 20 73 74 72 69 6e  n with the strin
5390: 67 0a 2a 2a 20 22 73 71 6c 69 74 65 5f 22 20 28  g.** "sqlite_" (
53a0: 69 6e 20 75 70 70 65 72 2c 20 6c 6f 77 65 72 20  in upper, lower 
53b0: 6f 72 20 6d 69 78 65 64 20 63 61 73 65 29 2e 20  or mixed case). 
53c0: 54 68 69 73 20 70 6f 72 74 69 6f 6e 20 6f 66 20  This portion of 
53d0: 74 68 65 20 6e 61 6d 65 73 70 61 63 65 0a 2a 2a  the namespace.**
53e0: 20 69 73 20 72 65 73 65 72 76 65 64 20 66 6f 72   is reserved for
53f0: 20 69 6e 74 65 72 6e 61 6c 20 75 73 65 2e 0a 2a   internal use..*
5400: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 43 68 65  /.int sqlite3Che
5410: 63 6b 4f 62 6a 65 63 74 4e 61 6d 65 28 50 61 72  ckObjectName(Par
5420: 73 65 20 2a 70 50 61 72 73 65 2c 20 63 6f 6e 73  se *pParse, cons
5430: 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a  t char *zName){.
5440: 20 20 69 66 28 20 21 70 50 61 72 73 65 2d 3e 64    if( !pParse->d
5450: 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 26 26 20  b->init.busy && 
5460: 70 50 61 72 73 65 2d 3e 6e 65 73 74 65 64 3d 3d  pParse->nested==
5470: 30 20 0a 20 20 20 20 20 20 20 20 20 20 26 26 20  0 .          && 
5480: 28 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66 6c 61  (pParse->db->fla
5490: 67 73 20 26 20 53 51 4c 49 54 45 5f 57 72 69 74  gs & SQLITE_Writ
54a0: 65 53 63 68 65 6d 61 29 3d 3d 30 0a 20 20 20 20  eSchema)==0.    
54b0: 20 20 20 20 20 20 26 26 20 30 3d 3d 73 71 6c 69        && 0==sqli
54c0: 74 65 33 53 74 72 4e 49 43 6d 70 28 7a 4e 61 6d  te3StrNICmp(zNam
54d0: 65 2c 20 22 73 71 6c 69 74 65 5f 22 2c 20 37 29  e, "sqlite_", 7)
54e0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
54f0: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
5500: 22 6f 62 6a 65 63 74 20 6e 61 6d 65 20 72 65 73  "object name res
5510: 65 72 76 65 64 20 66 6f 72 20 69 6e 74 65 72 6e  erved for intern
5520: 61 6c 20 75 73 65 3a 20 25 73 22 2c 20 7a 4e 61  al use: %s", zNa
5530: 6d 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  me);.    return 
5540: 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
5550: 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
5560: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42  E_OK;.}../*.** B
5570: 65 67 69 6e 20 63 6f 6e 73 74 72 75 63 74 69 6e  egin constructin
5580: 67 20 61 20 6e 65 77 20 74 61 62 6c 65 20 72 65  g a new table re
5590: 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 69 6e 20  presentation in 
55a0: 6d 65 6d 6f 72 79 2e 20 20 54 68 69 73 20 69 73  memory.  This is
55b0: 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20 6f 66  .** the first of
55c0: 20 73 65 76 65 72 61 6c 20 61 63 74 69 6f 6e 20   several action 
55d0: 72 6f 75 74 69 6e 65 73 20 74 68 61 74 20 67 65  routines that ge
55e0: 74 20 63 61 6c 6c 65 64 20 69 6e 20 72 65 73 70  t called in resp
55f0: 6f 6e 73 65 0a 2a 2a 20 74 6f 20 61 20 43 52 45  onse.** to a CRE
5600: 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d  ATE TABLE statem
5610: 65 6e 74 2e 20 20 49 6e 20 70 61 72 74 69 63 75  ent.  In particu
5620: 6c 61 72 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  lar, this routin
5630: 65 20 69 73 20 63 61 6c 6c 65 64 0a 2a 2a 20 61  e is called.** a
5640: 66 74 65 72 20 73 65 65 69 6e 67 20 74 6f 6b 65  fter seeing toke
5650: 6e 73 20 22 43 52 45 41 54 45 22 20 61 6e 64 20  ns "CREATE" and 
5660: 22 54 41 42 4c 45 22 20 61 6e 64 20 74 68 65 20  "TABLE" and the 
5670: 74 61 62 6c 65 20 6e 61 6d 65 2e 20 54 68 65 20  table name. The 
5680: 69 73 54 65 6d 70 0a 2a 2a 20 66 6c 61 67 20 69  isTemp.** flag i
5690: 73 20 74 72 75 65 20 69 66 20 74 68 65 20 74 61  s true if the ta
56a0: 62 6c 65 20 73 68 6f 75 6c 64 20 62 65 20 73 74  ble should be st
56b0: 6f 72 65 64 20 69 6e 20 74 68 65 20 61 75 78 69  ored in the auxi
56c0: 6c 69 61 72 79 20 64 61 74 61 62 61 73 65 0a 2a  liary database.*
56d0: 2a 20 66 69 6c 65 20 69 6e 73 74 65 61 64 20 6f  * file instead o
56e0: 66 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 64 61  f in the main da
56f0: 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 54 68  tabase file.  Th
5700: 69 73 20 69 73 20 6e 6f 72 6d 61 6c 6c 79 20 74  is is normally t
5710: 68 65 20 63 61 73 65 0a 2a 2a 20 77 68 65 6e 20  he case.** when 
5720: 74 68 65 20 22 54 45 4d 50 22 20 6f 72 20 22 54  the "TEMP" or "T
5730: 45 4d 50 4f 52 41 52 59 22 20 6b 65 79 77 6f 72  EMPORARY" keywor
5740: 64 20 6f 63 63 75 72 73 20 69 6e 20 62 65 74 77  d occurs in betw
5750: 65 65 6e 0a 2a 2a 20 43 52 45 41 54 45 20 61 6e  een.** CREATE an
5760: 64 20 54 41 42 4c 45 2e 0a 2a 2a 0a 2a 2a 20 54  d TABLE..**.** T
5770: 68 65 20 6e 65 77 20 74 61 62 6c 65 20 72 65 63  he new table rec
5780: 6f 72 64 20 69 73 20 69 6e 69 74 69 61 6c 69 7a  ord is initializ
5790: 65 64 20 61 6e 64 20 70 75 74 20 69 6e 20 70 50  ed and put in pP
57a0: 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 2e  arse->pNewTable.
57b0: 0a 2a 2a 20 41 73 20 6d 6f 72 65 20 6f 66 20 74  .** As more of t
57c0: 68 65 20 43 52 45 41 54 45 20 54 41 42 4c 45 20  he CREATE TABLE 
57d0: 73 74 61 74 65 6d 65 6e 74 20 69 73 20 70 61 72  statement is par
57e0: 73 65 64 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20  sed, additional 
57f0: 61 63 74 69 6f 6e 0a 2a 2a 20 72 6f 75 74 69 6e  action.** routin
5800: 65 73 20 77 69 6c 6c 20 62 65 20 63 61 6c 6c 65  es will be calle
5810: 64 20 74 6f 20 61 64 64 20 6d 6f 72 65 20 69 6e  d to add more in
5820: 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20 74 68 69  formation to thi
5830: 73 20 72 65 63 6f 72 64 2e 0a 2a 2a 20 41 74 20  s record..** At 
5840: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 43  the end of the C
5850: 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74  REATE TABLE stat
5860: 65 6d 65 6e 74 2c 20 74 68 65 20 73 71 6c 69 74  ement, the sqlit
5870: 65 33 45 6e 64 54 61 62 6c 65 28 29 20 72 6f 75  e3EndTable() rou
5880: 74 69 6e 65 0a 2a 2a 20 69 73 20 63 61 6c 6c 65  tine.** is calle
5890: 64 20 74 6f 20 63 6f 6d 70 6c 65 74 65 20 74 68  d to complete th
58a0: 65 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 6f  e construction o
58b0: 66 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20  f the new table 
58c0: 72 65 63 6f 72 64 2e 0a 2a 2f 0a 76 6f 69 64 20  record..*/.void 
58d0: 73 71 6c 69 74 65 33 53 74 61 72 74 54 61 62 6c  sqlite3StartTabl
58e0: 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  e(.  Parse *pPar
58f0: 73 65 2c 20 20 20 2f 2a 20 50 61 72 73 65 72 20  se,   /* Parser 
5900: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 6f 6b  context */.  Tok
5910: 65 6e 20 2a 70 4e 61 6d 65 31 2c 20 20 20 2f 2a  en *pName1,   /*
5920: 20 46 69 72 73 74 20 70 61 72 74 20 6f 66 20 74   First part of t
5930: 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74  he name of the t
5940: 61 62 6c 65 20 6f 72 20 76 69 65 77 20 2a 2f 0a  able or view */.
5950: 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32 2c    Token *pName2,
5960: 20 20 20 2f 2a 20 53 65 63 6f 6e 64 20 70 61 72     /* Second par
5970: 74 20 6f 66 20 74 68 65 20 6e 61 6d 65 20 6f 66  t of the name of
5980: 20 74 68 65 20 74 61 62 6c 65 20 6f 72 20 76 69   the table or vi
5990: 65 77 20 2a 2f 0a 20 20 69 6e 74 20 69 73 54 65  ew */.  int isTe
59a0: 6d 70 2c 20 20 20 20 20 20 2f 2a 20 54 72 75 65  mp,      /* True
59b0: 20 69 66 20 74 68 69 73 20 69 73 20 61 20 54 45   if this is a TE
59c0: 4d 50 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e  MP table */.  in
59d0: 74 20 69 73 56 69 65 77 2c 20 20 20 20 20 20 2f  t isView,      /
59e0: 2a 20 54 72 75 65 20 69 66 20 74 68 69 73 20 69  * True if this i
59f0: 73 20 61 20 56 49 45 57 20 2a 2f 0a 20 20 69 6e  s a VIEW */.  in
5a00: 74 20 69 73 56 69 72 74 75 61 6c 2c 20 20 20 2f  t isVirtual,   /
5a10: 2a 20 54 72 75 65 20 69 66 20 74 68 69 73 20 69  * True if this i
5a20: 73 20 61 20 56 49 52 54 55 41 4c 20 74 61 62 6c  s a VIRTUAL tabl
5a30: 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 45 72 72  e */.  int noErr
5a40: 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f          /* Do no
5a50: 74 68 69 6e 67 20 69 66 20 74 61 62 6c 65 20 61  thing if table a
5a60: 6c 72 65 61 64 79 20 65 78 69 73 74 73 20 2a 2f  lready exists */
5a70: 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61  .){.  Table *pTa
5a80: 62 6c 65 3b 0a 20 20 63 68 61 72 20 2a 7a 4e 61  ble;.  char *zNa
5a90: 6d 65 20 3d 20 30 3b 20 2f 2a 20 54 68 65 20 6e  me = 0; /* The n
5aa0: 61 6d 65 20 6f 66 20 74 68 65 20 6e 65 77 20 74  ame of the new t
5ab0: 61 62 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65  able */.  sqlite
5ac0: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
5ad0: 64 62 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20  db;.  Vdbe *v;. 
5ae0: 20 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20 20   int iDb;       
5af0: 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 6e 75    /* Database nu
5b00: 6d 62 65 72 20 74 6f 20 63 72 65 61 74 65 20 74  mber to create t
5b10: 68 65 20 74 61 62 6c 65 20 69 6e 20 2a 2f 0a 20  he table in */. 
5b20: 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 3b 20 20   Token *pName;  
5b30: 20 20 2f 2a 20 55 6e 71 75 61 6c 69 66 69 65 64    /* Unqualified
5b40: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62   name of the tab
5b50: 6c 65 20 74 6f 20 63 72 65 61 74 65 20 2a 2f 0a  le to create */.
5b60: 0a 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20  .  /* The table 
5b70: 6f 72 20 76 69 65 77 20 6e 61 6d 65 20 74 6f 20  or view name to 
5b80: 63 72 65 61 74 65 20 69 73 20 70 61 73 73 65 64  create is passed
5b90: 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65   to this routine
5ba0: 20 76 69 61 20 74 6f 6b 65 6e 73 0a 20 20 2a 2a   via tokens.  **
5bb0: 20 70 4e 61 6d 65 31 20 61 6e 64 20 70 4e 61 6d   pName1 and pNam
5bc0: 65 32 2e 20 49 66 20 74 68 65 20 74 61 62 6c 65  e2. If the table
5bd0: 20 6e 61 6d 65 20 77 61 73 20 66 75 6c 6c 79 20   name was fully 
5be0: 71 75 61 6c 69 66 69 65 64 2c 20 66 6f 72 20 65  qualified, for e
5bf0: 78 61 6d 70 6c 65 3a 0a 20 20 2a 2a 0a 20 20 2a  xample:.  **.  *
5c00: 2a 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 78  * CREATE TABLE x
5c10: 78 78 2e 79 79 79 20 28 2e 2e 2e 29 3b 0a 20 20  xx.yyy (...);.  
5c20: 2a 2a 20 0a 20 20 2a 2a 20 54 68 65 6e 20 70 4e  ** .  ** Then pN
5c30: 61 6d 65 31 20 69 73 20 73 65 74 20 74 6f 20 22  ame1 is set to "
5c40: 78 78 78 22 20 61 6e 64 20 70 4e 61 6d 65 32 20  xxx" and pName2 
5c50: 22 79 79 79 22 2e 20 4f 6e 20 74 68 65 20 6f 74  "yyy". On the ot
5c60: 68 65 72 20 68 61 6e 64 20 69 66 0a 20 20 2a 2a  her hand if.  **
5c70: 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20   the table name 
5c80: 69 73 20 6e 6f 74 20 66 75 6c 6c 79 20 71 75 61  is not fully qua
5c90: 6c 69 66 69 65 64 2c 20 69 2e 65 2e 3a 0a 20 20  lified, i.e.:.  
5ca0: 2a 2a 0a 20 20 2a 2a 20 43 52 45 41 54 45 20 54  **.  ** CREATE T
5cb0: 41 42 4c 45 20 79 79 79 28 2e 2e 2e 29 3b 0a 20  ABLE yyy(...);. 
5cc0: 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 6e 20 70 4e   **.  ** Then pN
5cd0: 61 6d 65 31 20 69 73 20 73 65 74 20 74 6f 20 22  ame1 is set to "
5ce0: 79 79 79 22 20 61 6e 64 20 70 4e 61 6d 65 32 20  yyy" and pName2 
5cf0: 69 73 20 22 22 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  is ""..  **.  **
5d00: 20 54 68 65 20 63 61 6c 6c 20 62 65 6c 6f 77 20   The call below 
5d10: 73 65 74 73 20 74 68 65 20 70 4e 61 6d 65 20 70  sets the pName p
5d20: 6f 69 6e 74 65 72 20 74 6f 20 70 6f 69 6e 74 20  ointer to point 
5d30: 61 74 20 74 68 65 20 74 6f 6b 65 6e 20 28 70 4e  at the token (pN
5d40: 61 6d 65 31 20 6f 72 0a 20 20 2a 2a 20 70 4e 61  ame1 or.  ** pNa
5d50: 6d 65 32 29 20 74 68 61 74 20 73 74 6f 72 65 73  me2) that stores
5d60: 20 74 68 65 20 75 6e 71 75 61 6c 69 66 69 65 64   the unqualified
5d70: 20 74 61 62 6c 65 20 6e 61 6d 65 2e 20 54 68 65   table name. The
5d80: 20 76 61 72 69 61 62 6c 65 20 69 44 62 20 69 73   variable iDb is
5d90: 0a 20 20 2a 2a 20 73 65 74 20 74 6f 20 74 68 65  .  ** set to the
5da0: 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20 64 61   index of the da
5db0: 74 61 62 61 73 65 20 74 68 61 74 20 74 68 65 20  tabase that the 
5dc0: 74 61 62 6c 65 20 6f 72 20 76 69 65 77 20 69 73  table or view is
5dd0: 20 74 6f 20 62 65 0a 20 20 2a 2a 20 63 72 65 61   to be.  ** crea
5de0: 74 65 64 20 69 6e 2e 0a 20 20 2a 2f 0a 20 20 69  ted in..  */.  i
5df0: 44 62 20 3d 20 73 71 6c 69 74 65 33 54 77 6f 50  Db = sqlite3TwoP
5e00: 61 72 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20  artName(pParse, 
5e10: 70 4e 61 6d 65 31 2c 20 70 4e 61 6d 65 32 2c 20  pName1, pName2, 
5e20: 26 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 69  &pName);.  if( i
5e30: 44 62 3c 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  Db<0 ) return;. 
5e40: 20 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44   if( !OMIT_TEMPD
5e50: 42 20 26 26 20 69 73 54 65 6d 70 20 26 26 20 69  B && isTemp && i
5e60: 44 62 3e 31 20 29 7b 0a 20 20 20 20 2f 2a 20 49  Db>1 ){.    /* I
5e70: 66 20 63 72 65 61 74 69 6e 67 20 61 20 74 65 6d  f creating a tem
5e80: 70 20 74 61 62 6c 65 2c 20 74 68 65 20 6e 61 6d  p table, the nam
5e90: 65 20 6d 61 79 20 6e 6f 74 20 62 65 20 71 75 61  e may not be qua
5ea0: 6c 69 66 69 65 64 20 2a 2f 0a 20 20 20 20 73 71  lified */.    sq
5eb0: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
5ec0: 61 72 73 65 2c 20 22 74 65 6d 70 6f 72 61 72 79  arse, "temporary
5ed0: 20 74 61 62 6c 65 20 6e 61 6d 65 20 6d 75 73 74   table name must
5ee0: 20 62 65 20 75 6e 71 75 61 6c 69 66 69 65 64 22   be unqualified"
5ef0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  );.    return;. 
5f00: 20 7d 0a 20 20 69 66 28 20 21 4f 4d 49 54 5f 54   }.  if( !OMIT_T
5f10: 45 4d 50 44 42 20 26 26 20 69 73 54 65 6d 70 20  EMPDB && isTemp 
5f20: 29 20 69 44 62 20 3d 20 31 3b 0a 0a 20 20 70 50  ) iDb = 1;..  pP
5f30: 61 72 73 65 2d 3e 73 4e 61 6d 65 54 6f 6b 65 6e  arse->sNameToken
5f40: 20 3d 20 2a 70 4e 61 6d 65 3b 0a 20 20 7a 4e 61   = *pName;.  zNa
5f50: 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65  me = sqlite3Name
5f60: 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 4e  FromToken(db, pN
5f70: 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a 4e 61 6d  ame);.  if( zNam
5f80: 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  e==0 ) return;. 
5f90: 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d   if( SQLITE_OK!=
5fa0: 73 71 6c 69 74 65 33 43 68 65 63 6b 4f 62 6a 65  sqlite3CheckObje
5fb0: 63 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 7a  ctName(pParse, z
5fc0: 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 67 6f 74  Name) ){.    got
5fd0: 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72  o begin_table_er
5fe0: 72 6f 72 3b 0a 20 20 7d 0a 20 20 69 66 28 20 64  ror;.  }.  if( d
5ff0: 62 2d 3e 69 6e 69 74 2e 69 44 62 3d 3d 31 20 29  b->init.iDb==1 )
6000: 20 69 73 54 65 6d 70 20 3d 20 31 3b 0a 23 69 66   isTemp = 1;.#if
6010: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
6020: 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20  _AUTHORIZATION. 
6030: 20 61 73 73 65 72 74 28 20 28 69 73 54 65 6d 70   assert( (isTemp
6040: 20 26 20 31 29 3d 3d 69 73 54 65 6d 70 20 29 3b   & 1)==isTemp );
6050: 0a 20 20 7b 0a 20 20 20 20 69 6e 74 20 63 6f 64  .  {.    int cod
6060: 65 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 44 62  e;.    char *zDb
6070: 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e   = db->aDb[iDb].
6080: 7a 4e 61 6d 65 3b 0a 20 20 20 20 69 66 28 20 73  zName;.    if( s
6090: 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28  qlite3AuthCheck(
60a0: 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 49  pParse, SQLITE_I
60b0: 4e 53 45 52 54 2c 20 53 43 48 45 4d 41 5f 54 41  NSERT, SCHEMA_TA
60c0: 42 4c 45 28 69 73 54 65 6d 70 29 2c 20 30 2c 20  BLE(isTemp), 0, 
60d0: 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f  zDb) ){.      go
60e0: 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65  to begin_table_e
60f0: 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rror;.    }.    
6100: 69 66 28 20 69 73 56 69 65 77 20 29 7b 0a 20 20  if( isView ){.  
6110: 20 20 20 20 69 66 28 20 21 4f 4d 49 54 5f 54 45      if( !OMIT_TE
6120: 4d 50 44 42 20 26 26 20 69 73 54 65 6d 70 20 29  MPDB && isTemp )
6130: 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20 3d  {.        code =
6140: 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54   SQLITE_CREATE_T
6150: 45 4d 50 5f 56 49 45 57 3b 0a 20 20 20 20 20 20  EMP_VIEW;.      
6160: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 63  }else{.        c
6170: 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 43 52 45  ode = SQLITE_CRE
6180: 41 54 45 5f 56 49 45 57 3b 0a 20 20 20 20 20 20  ATE_VIEW;.      
6190: 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
61a0: 20 20 20 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d     if( !OMIT_TEM
61b0: 50 44 42 20 26 26 20 69 73 54 65 6d 70 20 29 7b  PDB && isTemp ){
61c0: 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20 3d 20  .        code = 
61d0: 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 45  SQLITE_CREATE_TE
61e0: 4d 50 5f 54 41 42 4c 45 3b 0a 20 20 20 20 20 20  MP_TABLE;.      
61f0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 63  }else{.        c
6200: 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 43 52 45  ode = SQLITE_CRE
6210: 41 54 45 5f 54 41 42 4c 45 3b 0a 20 20 20 20 20  ATE_TABLE;.     
6220: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
6230: 20 21 69 73 56 69 72 74 75 61 6c 20 26 26 20 73   !isVirtual && s
6240: 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28  qlite3AuthCheck(
6250: 70 50 61 72 73 65 2c 20 63 6f 64 65 2c 20 7a 4e  pParse, code, zN
6260: 61 6d 65 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a  ame, 0, zDb) ){.
6270: 20 20 20 20 20 20 67 6f 74 6f 20 62 65 67 69 6e        goto begin
6280: 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b 0a 20 20  _table_error;.  
6290: 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a    }.  }.#endif..
62a0: 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74    /* Make sure t
62b0: 68 65 20 6e 65 77 20 74 61 62 6c 65 20 6e 61 6d  he new table nam
62c0: 65 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6c 6c 69  e does not colli
62d0: 64 65 20 77 69 74 68 20 61 6e 20 65 78 69 73 74  de with an exist
62e0: 69 6e 67 0a 20 20 2a 2a 20 69 6e 64 65 78 20 6f  ing.  ** index o
62f0: 72 20 74 61 62 6c 65 20 6e 61 6d 65 20 69 6e 20  r table name in 
6300: 74 68 65 20 73 61 6d 65 20 64 61 74 61 62 61 73  the same databas
6310: 65 2e 20 20 49 73 73 75 65 20 61 6e 20 65 72 72  e.  Issue an err
6320: 6f 72 20 6d 65 73 73 61 67 65 20 69 66 0a 20 20  or message if.  
6330: 2a 2a 20 69 74 20 64 6f 65 73 2e 20 54 68 65 20  ** it does. The 
6340: 65 78 63 65 70 74 69 6f 6e 20 69 73 20 69 66 20  exception is if 
6350: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 62 65  the statement be
6360: 69 6e 67 20 70 61 72 73 65 64 20 77 61 73 20 70  ing parsed was p
6370: 61 73 73 65 64 0a 20 20 2a 2a 20 74 6f 20 61 6e  assed.  ** to an
6380: 20 73 71 6c 69 74 65 33 5f 64 65 63 6c 61 72 65   sqlite3_declare
6390: 5f 76 74 61 62 28 29 20 63 61 6c 6c 2e 20 49 6e  _vtab() call. In
63a0: 20 74 68 61 74 20 63 61 73 65 20 6f 6e 6c 79 20   that case only 
63b0: 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73  the column names
63c0: 0a 20 20 2a 2a 20 61 6e 64 20 74 79 70 65 73 20  .  ** and types 
63d0: 77 69 6c 6c 20 62 65 20 75 73 65 64 2c 20 73 6f  will be used, so
63e0: 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65   there is no nee
63f0: 64 20 74 6f 20 74 65 73 74 20 66 6f 72 20 6e 61  d to test for na
6400: 6d 65 73 70 61 63 65 0a 20 20 2a 2a 20 63 6f 6c  mespace.  ** col
6410: 6c 69 73 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20  lisions..  */.  
6420: 69 66 28 20 21 49 4e 5f 44 45 43 4c 41 52 45 5f  if( !IN_DECLARE_
6430: 56 54 41 42 20 29 7b 0a 20 20 20 20 69 66 28 20  VTAB ){.    if( 
6440: 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74  SQLITE_OK!=sqlit
6450: 65 33 52 65 61 64 53 63 68 65 6d 61 28 70 50 61  e3ReadSchema(pPa
6460: 72 73 65 29 20 29 7b 0a 20 20 20 20 20 20 67 6f  rse) ){.      go
6470: 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65  to begin_table_e
6480: 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rror;.    }.    
6490: 70 54 61 62 6c 65 20 3d 20 73 71 6c 69 74 65 33  pTable = sqlite3
64a0: 46 69 6e 64 54 61 62 6c 65 28 64 62 2c 20 7a 4e  FindTable(db, zN
64b0: 61 6d 65 2c 20 64 62 2d 3e 61 44 62 5b 69 44 62  ame, db->aDb[iDb
64c0: 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66  ].zName);.    if
64d0: 28 20 70 54 61 62 6c 65 20 29 7b 0a 20 20 20 20  ( pTable ){.    
64e0: 20 20 69 66 28 20 21 6e 6f 45 72 72 20 29 7b 0a    if( !noErr ){.
64f0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
6500: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
6510: 22 74 61 62 6c 65 20 25 54 20 61 6c 72 65 61 64  "table %T alread
6520: 79 20 65 78 69 73 74 73 22 2c 20 70 4e 61 6d 65  y exists", pName
6530: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
6540: 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c   goto begin_tabl
6550: 65 5f 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20  e_error;.    }. 
6560: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 46 69     if( sqlite3Fi
6570: 6e 64 49 6e 64 65 78 28 64 62 2c 20 7a 4e 61 6d  ndIndex(db, zNam
6580: 65 2c 20 30 29 21 3d 30 20 26 26 20 28 69 44 62  e, 0)!=0 && (iDb
6590: 3d 3d 30 20 7c 7c 20 21 64 62 2d 3e 69 6e 69 74  ==0 || !db->init
65a0: 2e 62 75 73 79 29 20 29 7b 0a 20 20 20 20 20 20  .busy) ){.      
65b0: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
65c0: 70 50 61 72 73 65 2c 20 22 74 68 65 72 65 20 69  pParse, "there i
65d0: 73 20 61 6c 72 65 61 64 79 20 61 6e 20 69 6e 64  s already an ind
65e0: 65 78 20 6e 61 6d 65 64 20 25 73 22 2c 20 7a 4e  ex named %s", zN
65f0: 61 6d 65 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f  ame);.      goto
6600: 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72   begin_table_err
6610: 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  or;.    }.  }.. 
6620: 20 70 54 61 62 6c 65 20 3d 20 73 71 6c 69 74 65   pTable = sqlite
6630: 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62  3DbMallocZero(db
6640: 2c 20 73 69 7a 65 6f 66 28 54 61 62 6c 65 29 29  , sizeof(Table))
6650: 3b 0a 20 20 69 66 28 20 70 54 61 62 6c 65 3d 3d  ;.  if( pTable==
6660: 30 20 29 7b 0a 20 20 20 20 64 62 2d 3e 6d 61 6c  0 ){.    db->mal
6670: 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20  locFailed = 1;. 
6680: 20 20 20 70 50 61 72 73 65 2d 3e 72 63 20 3d 20     pParse->rc = 
6690: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
66a0: 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b    pParse->nErr++
66b0: 3b 0a 20 20 20 20 67 6f 74 6f 20 62 65 67 69 6e  ;.    goto begin
66c0: 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b 0a 20 20  _table_error;.  
66d0: 7d 0a 20 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d  }.  pTable->zNam
66e0: 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20 70 54 61  e = zName;.  pTa
66f0: 62 6c 65 2d 3e 69 50 4b 65 79 20 3d 20 2d 31 3b  ble->iPKey = -1;
6700: 0a 20 20 70 54 61 62 6c 65 2d 3e 70 53 63 68 65  .  pTable->pSche
6710: 6d 61 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62  ma = db->aDb[iDb
6720: 5d 2e 70 53 63 68 65 6d 61 3b 0a 20 20 70 54 61  ].pSchema;.  pTa
6730: 62 6c 65 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20  ble->nRef = 1;. 
6740: 20 70 54 61 62 6c 65 2d 3e 64 62 20 3d 20 64 62   pTable->db = db
6750: 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  ;.  if( pParse->
6760: 70 4e 65 77 54 61 62 6c 65 20 29 20 73 71 6c 69  pNewTable ) sqli
6770: 74 65 33 44 65 6c 65 74 65 54 61 62 6c 65 28 70  te3DeleteTable(p
6780: 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
6790: 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e 70 4e 65  );.  pParse->pNe
67a0: 77 54 61 62 6c 65 20 3d 20 70 54 61 62 6c 65 3b  wTable = pTable;
67b0: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69  ..  /* If this i
67c0: 73 20 74 68 65 20 6d 61 67 69 63 20 73 71 6c 69  s the magic sqli
67d0: 74 65 5f 73 65 71 75 65 6e 63 65 20 74 61 62 6c  te_sequence tabl
67e0: 65 20 75 73 65 64 20 62 79 20 61 75 74 6f 69 6e  e used by autoin
67f0: 63 72 65 6d 65 6e 74 2c 0a 20 20 2a 2a 20 74 68  crement,.  ** th
6800: 65 6e 20 72 65 63 6f 72 64 20 61 20 70 6f 69 6e  en record a poin
6810: 74 65 72 20 74 6f 20 74 68 69 73 20 74 61 62 6c  ter to this tabl
6820: 65 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 64 61  e in the main da
6830: 74 61 62 61 73 65 20 73 74 72 75 63 74 75 72 65  tabase structure
6840: 0a 20 20 2a 2a 20 73 6f 20 74 68 61 74 20 49 4e  .  ** so that IN
6850: 53 45 52 54 20 63 61 6e 20 66 69 6e 64 20 74 68  SERT can find th
6860: 65 20 74 61 62 6c 65 20 65 61 73 69 6c 79 2e 0a  e table easily..
6870: 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c    */.#ifndef SQL
6880: 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 43  ITE_OMIT_AUTOINC
6890: 52 45 4d 45 4e 54 0a 20 20 69 66 28 20 21 70 50  REMENT.  if( !pP
68a0: 61 72 73 65 2d 3e 6e 65 73 74 65 64 20 26 26 20  arse->nested && 
68b0: 73 74 72 63 6d 70 28 7a 4e 61 6d 65 2c 20 22 73  strcmp(zName, "s
68c0: 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 22 29  qlite_sequence")
68d0: 3d 3d 30 20 29 7b 0a 20 20 20 20 70 54 61 62 6c  ==0 ){.    pTabl
68e0: 65 2d 3e 70 53 63 68 65 6d 61 2d 3e 70 53 65 71  e->pSchema->pSeq
68f0: 54 61 62 20 3d 20 70 54 61 62 6c 65 3b 0a 20 20  Tab = pTable;.  
6900: 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 42  }.#endif..  /* B
6910: 65 67 69 6e 20 67 65 6e 65 72 61 74 69 6e 67 20  egin generating 
6920: 74 68 65 20 63 6f 64 65 20 74 68 61 74 20 77 69  the code that wi
6930: 6c 6c 20 69 6e 73 65 72 74 20 74 68 65 20 74 61  ll insert the ta
6940: 62 6c 65 20 72 65 63 6f 72 64 20 69 6e 74 6f 0a  ble record into.
6950: 20 20 2a 2a 20 74 68 65 20 53 51 4c 49 54 45 5f    ** the SQLITE_
6960: 4d 41 53 54 45 52 20 74 61 62 6c 65 2e 20 20 4e  MASTER table.  N
6970: 6f 74 65 20 69 6e 20 70 61 72 74 69 63 75 6c 61  ote in particula
6980: 72 20 74 68 61 74 20 77 65 20 6d 75 73 74 20 67  r that we must g
6990: 6f 20 61 68 65 61 64 0a 20 20 2a 2a 20 61 6e 64  o ahead.  ** and
69a0: 20 61 6c 6c 6f 63 61 74 65 20 74 68 65 20 72 65   allocate the re
69b0: 63 6f 72 64 20 6e 75 6d 62 65 72 20 66 6f 72 20  cord number for 
69c0: 74 68 65 20 74 61 62 6c 65 20 65 6e 74 72 79 20  the table entry 
69d0: 6e 6f 77 2e 20 20 42 65 66 6f 72 65 20 61 6e 79  now.  Before any
69e0: 0a 20 20 2a 2a 20 50 52 49 4d 41 52 59 20 4b 45  .  ** PRIMARY KE
69f0: 59 20 6f 72 20 55 4e 49 51 55 45 20 6b 65 79 77  Y or UNIQUE keyw
6a00: 6f 72 64 73 20 61 72 65 20 70 61 72 73 65 64 2e  ords are parsed.
6a10: 20 20 54 68 6f 73 65 20 6b 65 79 77 6f 72 64 73    Those keywords
6a20: 20 77 69 6c 6c 20 63 61 75 73 65 0a 20 20 2a 2a   will cause.  **
6a30: 20 69 6e 64 69 63 65 73 20 74 6f 20 62 65 20 63   indices to be c
6a40: 72 65 61 74 65 64 20 61 6e 64 20 74 68 65 20 74  reated and the t
6a50: 61 62 6c 65 20 72 65 63 6f 72 64 20 6d 75 73 74  able record must
6a60: 20 63 6f 6d 65 20 62 65 66 6f 72 65 20 74 68 65   come before the
6a70: 20 0a 20 20 2a 2a 20 69 6e 64 69 63 65 73 2e 20   .  ** indices. 
6a80: 20 48 65 6e 63 65 2c 20 74 68 65 20 72 65 63 6f   Hence, the reco
6a90: 72 64 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68  rd number for th
6aa0: 65 20 74 61 62 6c 65 20 6d 75 73 74 20 62 65 20  e table must be 
6ab0: 61 6c 6c 6f 63 61 74 65 64 0a 20 20 2a 2a 20 6e  allocated.  ** n
6ac0: 6f 77 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21  ow..  */.  if( !
6ad0: 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 26 26  db->init.busy &&
6ae0: 20 28 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74   (v = sqlite3Get
6af0: 56 64 62 65 28 70 50 61 72 73 65 29 29 21 3d 30  Vdbe(pParse))!=0
6b00: 20 29 7b 0a 20 20 20 20 69 6e 74 20 6a 31 3b 0a   ){.    int j1;.
6b10: 20 20 20 20 69 6e 74 20 66 69 6c 65 46 6f 72 6d      int fileForm
6b20: 61 74 3b 0a 20 20 20 20 69 6e 74 20 72 65 67 31  at;.    int reg1
6b30: 2c 20 72 65 67 32 2c 20 72 65 67 33 3b 0a 20 20  , reg2, reg3;.  
6b40: 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72    sqlite3BeginWr
6b50: 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61  iteOperation(pPa
6b60: 72 73 65 2c 20 30 2c 20 69 44 62 29 3b 0a 0a 23  rse, 0, iDb);..#
6b70: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
6b80: 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
6b90: 20 20 20 20 69 66 28 20 69 73 56 69 72 74 75 61      if( isVirtua
6ba0: 6c 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  l ){.      sqlit
6bb0: 65 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20  e3VdbeAddOp0(v, 
6bc0: 4f 50 5f 56 42 65 67 69 6e 29 3b 0a 20 20 20 20  OP_VBegin);.    
6bd0: 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a  }.#endif..    /*
6be0: 20 49 66 20 74 68 65 20 66 69 6c 65 20 66 6f 72   If the file for
6bf0: 6d 61 74 20 61 6e 64 20 65 6e 63 6f 64 69 6e 67  mat and encoding
6c00: 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
6c10: 20 68 61 76 65 20 6e 6f 74 20 62 65 65 6e 20 73   have not been s
6c20: 65 74 2c 20 0a 20 20 20 20 2a 2a 20 73 65 74 20  et, .    ** set 
6c30: 74 68 65 6d 20 6e 6f 77 2e 0a 20 20 20 20 2a 2f  them now..    */
6c40: 0a 20 20 20 20 72 65 67 31 20 3d 20 70 50 61 72  .    reg1 = pPar
6c50: 73 65 2d 3e 72 65 67 52 6f 77 69 64 20 3d 20 2b  se->regRowid = +
6c60: 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
6c70: 20 20 20 72 65 67 32 20 3d 20 70 50 61 72 73 65     reg2 = pParse
6c80: 2d 3e 72 65 67 52 6f 6f 74 20 3d 20 2b 2b 70 50  ->regRoot = ++pP
6c90: 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
6ca0: 72 65 67 33 20 3d 20 2b 2b 70 50 61 72 73 65 2d  reg3 = ++pParse-
6cb0: 3e 6e 4d 65 6d 3b 0a 20 20 20 20 73 71 6c 69 74  >nMem;.    sqlit
6cc0: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
6cd0: 4f 50 5f 52 65 61 64 43 6f 6f 6b 69 65 2c 20 69  OP_ReadCookie, i
6ce0: 44 62 2c 20 72 65 67 33 2c 20 31 29 3b 20 20 20  Db, reg3, 1);   
6cf0: 2f 2a 20 66 69 6c 65 5f 66 6f 72 6d 61 74 20 2a  /* file_format *
6d00: 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  /.    sqlite3Vdb
6d10: 65 55 73 65 73 42 74 72 65 65 28 76 2c 20 69 44  eUsesBtree(v, iD
6d20: 62 29 3b 0a 20 20 20 20 6a 31 20 3d 20 73 71 6c  b);.    j1 = sql
6d30: 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
6d40: 2c 20 4f 50 5f 49 66 2c 20 72 65 67 33 29 3b 0a  , OP_If, reg3);.
6d50: 20 20 20 20 66 69 6c 65 46 6f 72 6d 61 74 20 3d      fileFormat =
6d60: 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51   (db->flags & SQ
6d70: 4c 49 54 45 5f 4c 65 67 61 63 79 46 69 6c 65 46  LITE_LegacyFileF
6d80: 6d 74 29 21 3d 30 20 3f 0a 20 20 20 20 20 20 20  mt)!=0 ?.       
6d90: 20 20 20 20 20 20 20 20 20 20 20 31 20 3a 20 53             1 : S
6da0: 51 4c 49 54 45 5f 4d 41 58 5f 46 49 4c 45 5f 46  QLITE_MAX_FILE_F
6db0: 4f 52 4d 41 54 3b 0a 20 20 20 20 73 71 6c 69 74  ORMAT;.    sqlit
6dc0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
6dd0: 4f 50 5f 49 6e 74 65 67 65 72 2c 20 66 69 6c 65  OP_Integer, file
6de0: 46 6f 72 6d 61 74 2c 20 72 65 67 33 29 3b 0a 20  Format, reg3);. 
6df0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
6e00: 64 4f 70 33 28 76 2c 20 4f 50 5f 53 65 74 43 6f  dOp3(v, OP_SetCo
6e10: 6f 6b 69 65 2c 20 69 44 62 2c 20 31 2c 20 72 65  okie, iDb, 1, re
6e20: 67 33 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  g3);.    sqlite3
6e30: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
6e40: 5f 49 6e 74 65 67 65 72 2c 20 45 4e 43 28 64 62  _Integer, ENC(db
6e50: 29 2c 20 72 65 67 33 29 3b 0a 20 20 20 20 73 71  ), reg3);.    sq
6e60: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
6e70: 76 2c 20 4f 50 5f 53 65 74 43 6f 6f 6b 69 65 2c  v, OP_SetCookie,
6e80: 20 69 44 62 2c 20 34 2c 20 72 65 67 33 29 3b 0a   iDb, 4, reg3);.
6e90: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
6ea0: 75 6d 70 48 65 72 65 28 76 2c 20 6a 31 29 3b 0a  umpHere(v, j1);.
6eb0: 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 6a 75 73  .    /* This jus
6ec0: 74 20 63 72 65 61 74 65 73 20 61 20 70 6c 61 63  t creates a plac
6ed0: 65 2d 68 6f 6c 64 65 72 20 72 65 63 6f 72 64 20  e-holder record 
6ee0: 69 6e 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61  in the sqlite_ma
6ef0: 73 74 65 72 20 74 61 62 6c 65 2e 0a 20 20 20 20  ster table..    
6f00: 2a 2a 20 54 68 65 20 72 65 63 6f 72 64 20 63 72  ** The record cr
6f10: 65 61 74 65 64 20 64 6f 65 73 20 6e 6f 74 20 63  eated does not c
6f20: 6f 6e 74 61 69 6e 20 61 6e 79 74 68 69 6e 67 20  ontain anything 
6f30: 79 65 74 2e 20 20 49 74 20 77 69 6c 6c 20 62 65  yet.  It will be
6f40: 20 72 65 70 6c 61 63 65 64 0a 20 20 20 20 2a 2a   replaced.    **
6f50: 20 62 79 20 74 68 65 20 72 65 61 6c 20 65 6e 74   by the real ent
6f60: 72 79 20 69 6e 20 63 6f 64 65 20 67 65 6e 65 72  ry in code gener
6f70: 61 74 65 64 20 61 74 20 73 71 6c 69 74 65 33 45  ated at sqlite3E
6f80: 6e 64 54 61 62 6c 65 28 29 2e 0a 20 20 20 20 2a  ndTable()..    *
6f90: 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 72 6f 77  *.    ** The row
6fa0: 69 64 20 66 6f 72 20 74 68 65 20 6e 65 77 20 65  id for the new e
6fb0: 6e 74 72 79 20 69 73 20 6c 65 66 74 20 6f 6e 20  ntry is left on 
6fc0: 74 68 65 20 74 6f 70 20 6f 66 20 74 68 65 20 73  the top of the s
6fd0: 74 61 63 6b 2e 0a 20 20 20 20 2a 2a 20 54 68 65  tack..    ** The
6fe0: 20 72 6f 77 69 64 20 76 61 6c 75 65 20 69 73 20   rowid value is 
6ff0: 6e 65 65 64 65 64 20 62 79 20 74 68 65 20 63 6f  needed by the co
7000: 64 65 20 74 68 61 74 20 73 71 6c 69 74 65 33 45  de that sqlite3E
7010: 6e 64 54 61 62 6c 65 20 77 69 6c 6c 0a 20 20 20  ndTable will.   
7020: 20 2a 2a 20 67 65 6e 65 72 61 74 65 2e 0a 20 20   ** generate..  
7030: 20 20 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65    */.#if !define
7040: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  d(SQLITE_OMIT_VI
7050: 45 57 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28  EW) || !defined(
7060: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
7070: 55 41 4c 54 41 42 4c 45 29 0a 20 20 20 20 69 66  UALTABLE).    if
7080: 28 20 69 73 56 69 65 77 20 7c 7c 20 69 73 56 69  ( isView || isVi
7090: 72 74 75 61 6c 20 29 7b 0a 20 20 20 20 20 20 73  rtual ){.      s
70a0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
70b0: 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
70c0: 30 2c 20 72 65 67 32 29 3b 0a 20 20 20 20 7d 65  0, reg2);.    }e
70d0: 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 7b  lse.#endif.    {
70e0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
70f0: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43  beAddOp2(v, OP_C
7100: 72 65 61 74 65 54 61 62 6c 65 2c 20 69 44 62 2c  reateTable, iDb,
7110: 20 72 65 67 32 29 3b 0a 20 20 20 20 7d 0a 20 20   reg2);.    }.  
7120: 20 20 73 71 6c 69 74 65 33 4f 70 65 6e 4d 61 73    sqlite3OpenMas
7130: 74 65 72 54 61 62 6c 65 28 70 50 61 72 73 65 2c  terTable(pParse,
7140: 20 69 44 62 29 3b 0a 20 20 20 20 73 71 6c 69 74   iDb);.    sqlit
7150: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
7160: 4f 50 5f 4e 65 77 52 6f 77 69 64 2c 20 30 2c 20  OP_NewRowid, 0, 
7170: 72 65 67 31 29 3b 0a 20 20 20 20 73 71 6c 69 74  reg1);.    sqlit
7180: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
7190: 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 72 65 67 33  OP_Null, 0, reg3
71a0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
71b0: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49  beAddOp3(v, OP_I
71c0: 6e 73 65 72 74 2c 20 30 2c 20 72 65 67 33 2c 20  nsert, 0, reg3, 
71d0: 72 65 67 31 29 3b 0a 20 20 20 20 73 71 6c 69 74  reg1);.    sqlit
71e0: 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76  e3VdbeChangeP5(v
71f0: 2c 20 4f 50 46 4c 41 47 5f 41 50 50 45 4e 44 29  , OPFLAG_APPEND)
7200: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
7210: 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 43 6c  eAddOp0(v, OP_Cl
7220: 6f 73 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  ose);.  }..  /* 
7230: 4e 6f 72 6d 61 6c 20 28 6e 6f 6e 2d 65 72 72 6f  Normal (non-erro
7240: 72 29 20 72 65 74 75 72 6e 2e 20 2a 2f 0a 20 20  r) return. */.  
7250: 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 49 66  return;..  /* If
7260: 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
7270: 2c 20 77 65 20 6a 75 6d 70 20 68 65 72 65 20 2a  , we jump here *
7280: 2f 0a 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72  /.begin_table_er
7290: 72 6f 72 3a 0a 20 20 73 71 6c 69 74 65 33 44 62  ror:.  sqlite3Db
72a0: 46 72 65 65 28 64 62 2c 20 7a 4e 61 6d 65 29 3b  Free(db, zName);
72b0: 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a  .  return;.}../*
72c0: 0a 2a 2a 20 54 68 69 73 20 6d 61 63 72 6f 20 69  .** This macro i
72d0: 73 20 75 73 65 64 20 74 6f 20 63 6f 6d 70 61 72  s used to compar
72e0: 65 20 74 77 6f 20 73 74 72 69 6e 67 73 20 69 6e  e two strings in
72f0: 20 61 20 63 61 73 65 2d 69 6e 73 65 6e 73 69 74   a case-insensit
7300: 69 76 65 20 6d 61 6e 6e 65 72 2e 0a 2a 2a 20 49  ive manner..** I
7310: 74 20 69 73 20 73 6c 69 67 68 74 6c 79 20 66 61  t is slightly fa
7320: 73 74 65 72 20 74 68 61 6e 20 63 61 6c 6c 69 6e  ster than callin
7330: 67 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  g sqlite3StrICmp
7340: 28 29 20 64 69 72 65 63 74 6c 79 2c 20 62 75 74  () directly, but
7350: 0a 2a 2a 20 70 72 6f 64 75 63 65 73 20 6c 61 72  .** produces lar
7360: 67 65 72 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20  ger code..**.** 
7370: 57 41 52 4e 49 4e 47 3a 20 54 68 69 73 20 6d 61  WARNING: This ma
7380: 63 72 6f 20 69 73 20 6e 6f 74 20 63 6f 6d 70 61  cro is not compa
7390: 74 69 62 6c 65 20 77 69 74 68 20 74 68 65 20 73  tible with the s
73a0: 74 72 63 6d 70 28 29 20 66 61 6d 69 6c 79 2e 20  trcmp() family. 
73b0: 49 74 0a 2a 2a 20 72 65 74 75 72 6e 73 20 74 72  It.** returns tr
73c0: 75 65 20 69 66 20 74 68 65 20 74 77 6f 20 73 74  ue if the two st
73d0: 72 69 6e 67 73 20 61 72 65 20 65 71 75 61 6c 2c  rings are equal,
73e0: 20 6f 74 68 65 72 77 69 73 65 20 66 61 6c 73 65   otherwise false
73f0: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 53 54 52  ..*/.#define STR
7400: 49 43 4d 50 28 78 2c 20 79 29 20 28 5c 0a 73 71  ICMP(x, y) (\.sq
7410: 6c 69 74 65 33 55 70 70 65 72 54 6f 4c 6f 77 65  lite3UpperToLowe
7420: 72 5b 2a 28 75 6e 73 69 67 6e 65 64 20 63 68 61  r[*(unsigned cha
7430: 72 20 2a 29 28 78 29 5d 3d 3d 20 20 20 5c 0a 73  r *)(x)]==   \.s
7440: 71 6c 69 74 65 33 55 70 70 65 72 54 6f 4c 6f 77  qlite3UpperToLow
7450: 65 72 5b 2a 28 75 6e 73 69 67 6e 65 64 20 63 68  er[*(unsigned ch
7460: 61 72 20 2a 29 28 79 29 5d 20 20 20 20 20 5c 0a  ar *)(y)]     \.
7470: 26 26 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  && sqlite3StrICm
7480: 70 28 28 78 29 2b 31 2c 28 79 29 2b 31 29 3d 3d  p((x)+1,(y)+1)==
7490: 30 20 29 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61  0 )../*.** Add a
74a0: 20 6e 65 77 20 63 6f 6c 75 6d 6e 20 74 6f 20 74   new column to t
74b0: 68 65 20 74 61 62 6c 65 20 63 75 72 72 65 6e 74  he table current
74c0: 6c 79 20 62 65 69 6e 67 20 63 6f 6e 73 74 72 75  ly being constru
74d0: 63 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  cted..**.** The 
74e0: 70 61 72 73 65 72 20 63 61 6c 6c 73 20 74 68 69  parser calls thi
74f0: 73 20 72 6f 75 74 69 6e 65 20 6f 6e 63 65 20 66  s routine once f
7500: 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e 20 64  or each column d
7510: 65 63 6c 61 72 61 74 69 6f 6e 0a 2a 2a 20 69 6e  eclaration.** in
7520: 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20   a CREATE TABLE 
7530: 73 74 61 74 65 6d 65 6e 74 2e 20 20 73 71 6c 69  statement.  sqli
7540: 74 65 33 53 74 61 72 74 54 61 62 6c 65 28 29 20  te3StartTable() 
7550: 67 65 74 73 20 63 61 6c 6c 65 64 0a 2a 2a 20 66  gets called.** f
7560: 69 72 73 74 20 74 6f 20 67 65 74 20 74 68 69 6e  irst to get thin
7570: 67 73 20 67 6f 69 6e 67 2e 20 20 54 68 65 6e 20  gs going.  Then 
7580: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
7590: 63 61 6c 6c 65 64 20 66 6f 72 20 65 61 63 68 0a  called for each.
75a0: 2a 2a 20 63 6f 6c 75 6d 6e 2e 0a 2a 2f 0a 76 6f  ** column..*/.vo
75b0: 69 64 20 73 71 6c 69 74 65 33 41 64 64 43 6f 6c  id sqlite3AddCol
75c0: 75 6d 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73  umn(Parse *pPars
75d0: 65 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 29  e, Token *pName)
75e0: 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20  {.  Table *p;.  
75f0: 69 6e 74 20 69 3b 0a 20 20 63 68 61 72 20 2a 7a  int i;.  char *z
7600: 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c  ;.  Column *pCol
7610: 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
7620: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
7630: 69 66 28 20 28 70 20 3d 20 70 50 61 72 73 65 2d  if( (p = pParse-
7640: 3e 70 4e 65 77 54 61 62 6c 65 29 3d 3d 30 20 29  >pNewTable)==0 )
7650: 20 72 65 74 75 72 6e 3b 0a 23 69 66 20 53 51 4c   return;.#if SQL
7660: 49 54 45 5f 4d 41 58 5f 43 4f 4c 55 4d 4e 0a 20  ITE_MAX_COLUMN. 
7670: 20 69 66 28 20 70 2d 3e 6e 43 6f 6c 2b 31 3e 64   if( p->nCol+1>d
7680: 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45  b->aLimit[SQLITE
7690: 5f 4c 49 4d 49 54 5f 43 4f 4c 55 4d 4e 5d 20 29  _LIMIT_COLUMN] )
76a0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
76b0: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74  orMsg(pParse, "t
76c0: 6f 6f 20 6d 61 6e 79 20 63 6f 6c 75 6d 6e 73 20  oo many columns 
76d0: 6f 6e 20 25 73 22 2c 20 70 2d 3e 7a 4e 61 6d 65  on %s", p->zName
76e0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  );.    return;. 
76f0: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7a 20 3d 20   }.#endif.  z = 
7700: 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54  sqlite3NameFromT
7710: 6f 6b 65 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c  oken(pParse->db,
7720: 20 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a   pName);.  if( z
7730: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
7740: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43  for(i=0; i<p->nC
7750: 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  ol; i++){.    if
7760: 28 20 53 54 52 49 43 4d 50 28 7a 2c 20 70 2d 3e  ( STRICMP(z, p->
7770: 61 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 20 29  aCol[i].zName) )
7780: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
7790: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
77a0: 22 64 75 70 6c 69 63 61 74 65 20 63 6f 6c 75 6d  "duplicate colum
77b0: 6e 20 6e 61 6d 65 3a 20 25 73 22 2c 20 7a 29 3b  n name: %s", z);
77c0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62  .      sqlite3Db
77d0: 46 72 65 65 28 64 62 2c 20 7a 29 3b 0a 20 20 20  Free(db, z);.   
77e0: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d     return;.    }
77f0: 0a 20 20 7d 0a 20 20 69 66 28 20 28 70 2d 3e 6e  .  }.  if( (p->n
7800: 43 6f 6c 20 26 20 30 78 37 29 3d 3d 30 20 29 7b  Col & 0x7)==0 ){
7810: 0a 20 20 20 20 43 6f 6c 75 6d 6e 20 2a 61 4e 65  .    Column *aNe
7820: 77 3b 0a 20 20 20 20 61 4e 65 77 20 3d 20 73 71  w;.    aNew = sq
7830: 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 28 70  lite3DbRealloc(p
7840: 50 61 72 73 65 2d 3e 64 62 2c 70 2d 3e 61 43 6f  Parse->db,p->aCo
7850: 6c 2c 28 70 2d 3e 6e 43 6f 6c 2b 38 29 2a 73 69  l,(p->nCol+8)*si
7860: 7a 65 6f 66 28 70 2d 3e 61 43 6f 6c 5b 30 5d 29  zeof(p->aCol[0])
7870: 29 3b 0a 20 20 20 20 69 66 28 20 61 4e 65 77 3d  );.    if( aNew=
7880: 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
7890: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 29  te3DbFree(db, z)
78a0: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a  ;.      return;.
78b0: 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 61 43 6f      }.    p->aCo
78c0: 6c 20 3d 20 61 4e 65 77 3b 0a 20 20 7d 0a 20 20  l = aNew;.  }.  
78d0: 70 43 6f 6c 20 3d 20 26 70 2d 3e 61 43 6f 6c 5b  pCol = &p->aCol[
78e0: 70 2d 3e 6e 43 6f 6c 5d 3b 0a 20 20 6d 65 6d 73  p->nCol];.  mems
78f0: 65 74 28 70 43 6f 6c 2c 20 30 2c 20 73 69 7a 65  et(pCol, 0, size
7900: 6f 66 28 70 2d 3e 61 43 6f 6c 5b 30 5d 29 29 3b  of(p->aCol[0]));
7910: 0a 20 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 20 3d  .  pCol->zName =
7920: 20 7a 3b 0a 20 0a 20 20 2f 2a 20 49 66 20 74 68   z;. .  /* If th
7930: 65 72 65 20 69 73 20 6e 6f 20 74 79 70 65 20 73  ere is no type s
7940: 70 65 63 69 66 69 65 64 2c 20 63 6f 6c 75 6d 6e  pecified, column
7950: 73 20 68 61 76 65 20 74 68 65 20 64 65 66 61 75  s have the defau
7960: 6c 74 20 61 66 66 69 6e 69 74 79 0a 20 20 2a 2a  lt affinity.  **
7970: 20 27 4e 4f 4e 45 27 2e 20 49 66 20 74 68 65 72   'NONE'. If ther
7980: 65 20 69 73 20 61 20 74 79 70 65 20 73 70 65 63  e is a type spec
7990: 69 66 69 65 64 2c 20 74 68 65 6e 20 73 71 6c 69  ified, then sqli
79a0: 74 65 33 41 64 64 43 6f 6c 75 6d 6e 54 79 70 65  te3AddColumnType
79b0: 28 29 20 77 69 6c 6c 0a 20 20 2a 2a 20 62 65 20  () will.  ** be 
79c0: 63 61 6c 6c 65 64 20 6e 65 78 74 20 74 6f 20 73  called next to s
79d0: 65 74 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74  et pCol->affinit
79e0: 79 20 63 6f 72 72 65 63 74 6c 79 2e 0a 20 20 2a  y correctly..  *
79f0: 2f 0a 20 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69  /.  pCol->affini
7a00: 74 79 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f  ty = SQLITE_AFF_
7a10: 4e 4f 4e 45 3b 0a 20 20 70 2d 3e 6e 43 6f 6c 2b  NONE;.  p->nCol+
7a20: 2b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  +;.}../*.** This
7a30: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
7a40: 65 64 20 62 79 20 74 68 65 20 70 61 72 73 65 72  ed by the parser
7a50: 20 77 68 69 6c 65 20 69 6e 20 74 68 65 20 6d 69   while in the mi
7a60: 64 64 6c 65 20 6f 66 0a 2a 2a 20 70 61 72 73 69  ddle of.** parsi
7a70: 6e 67 20 61 20 43 52 45 41 54 45 20 54 41 42 4c  ng a CREATE TABL
7a80: 45 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 41 20  E statement.  A 
7a90: 22 4e 4f 54 20 4e 55 4c 4c 22 20 63 6f 6e 73 74  "NOT NULL" const
7aa0: 72 61 69 6e 74 20 68 61 73 0a 2a 2a 20 62 65 65  raint has.** bee
7ab0: 6e 20 73 65 65 6e 20 6f 6e 20 61 20 63 6f 6c 75  n seen on a colu
7ac0: 6d 6e 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  mn.  This routin
7ad0: 65 20 73 65 74 73 20 74 68 65 20 6e 6f 74 4e 75  e sets the notNu
7ae0: 6c 6c 20 66 6c 61 67 20 6f 6e 0a 2a 2a 20 74 68  ll flag on.** th
7af0: 65 20 63 6f 6c 75 6d 6e 20 63 75 72 72 65 6e 74  e column current
7b00: 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75  ly under constru
7b10: 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ction..*/.void s
7b20: 71 6c 69 74 65 33 41 64 64 4e 6f 74 4e 75 6c 6c  qlite3AddNotNull
7b30: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
7b40: 69 6e 74 20 6f 6e 45 72 72 6f 72 29 7b 0a 20 20  int onError){.  
7b50: 54 61 62 6c 65 20 2a 70 3b 0a 20 20 69 6e 74 20  Table *p;.  int 
7b60: 69 3b 0a 20 20 69 66 28 20 28 70 20 3d 20 70 50  i;.  if( (p = pP
7b70: 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29  arse->pNewTable)
7b80: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
7b90: 69 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20  i = p->nCol-1;. 
7ba0: 20 69 66 28 20 69 3e 3d 30 20 29 20 70 2d 3e 61   if( i>=0 ) p->a
7bb0: 43 6f 6c 5b 69 5d 2e 6e 6f 74 4e 75 6c 6c 20 3d  Col[i].notNull =
7bc0: 20 6f 6e 45 72 72 6f 72 3b 0a 7d 0a 0a 2f 2a 0a   onError;.}../*.
7bd0: 2a 2a 20 53 63 61 6e 20 74 68 65 20 63 6f 6c 75  ** Scan the colu
7be0: 6d 6e 20 74 79 70 65 20 6e 61 6d 65 20 7a 54 79  mn type name zTy
7bf0: 70 65 20 28 6c 65 6e 67 74 68 20 6e 54 79 70 65  pe (length nType
7c00: 29 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65  ) and return the
7c10: 0a 2a 2a 20 61 73 73 6f 63 69 61 74 65 64 20 61  .** associated a
7c20: 66 66 69 6e 69 74 79 20 74 79 70 65 2e 0a 2a 2a  ffinity type..**
7c30: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
7c40: 20 64 6f 65 73 20 61 20 63 61 73 65 2d 69 6e 64   does a case-ind
7c50: 65 70 65 6e 64 65 6e 74 20 73 65 61 72 63 68 20  ependent search 
7c60: 6f 66 20 7a 54 79 70 65 20 66 6f 72 20 74 68 65  of zType for the
7c70: 20 0a 2a 2a 20 73 75 62 73 74 72 69 6e 67 73 20   .** substrings 
7c80: 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  in the following
7c90: 20 74 61 62 6c 65 2e 20 49 66 20 6f 6e 65 20 6f   table. If one o
7ca0: 66 20 74 68 65 20 73 75 62 73 74 72 69 6e 67 73  f the substrings
7cb0: 20 69 73 0a 2a 2a 20 66 6f 75 6e 64 2c 20 74 68   is.** found, th
7cc0: 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  e corresponding 
7cd0: 61 66 66 69 6e 69 74 79 20 69 73 20 72 65 74 75  affinity is retu
7ce0: 72 6e 65 64 2e 20 49 66 20 7a 54 79 70 65 20 63  rned. If zType c
7cf0: 6f 6e 74 61 69 6e 73 0a 2a 2a 20 6d 6f 72 65 20  ontains.** more 
7d00: 74 68 61 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20  than one of the 
7d10: 73 75 62 73 74 72 69 6e 67 73 2c 20 65 6e 74 72  substrings, entr
7d20: 69 65 73 20 74 6f 77 61 72 64 20 74 68 65 20 74  ies toward the t
7d30: 6f 70 20 6f 66 20 0a 2a 2a 20 74 68 65 20 74 61  op of .** the ta
7d40: 62 6c 65 20 74 61 6b 65 20 70 72 69 6f 72 69 74  ble take priorit
7d50: 79 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20  y. For example, 
7d60: 69 66 20 7a 54 79 70 65 20 69 73 20 27 42 4c 4f  if zType is 'BLO
7d70: 42 49 4e 54 27 2c 20 0a 2a 2a 20 53 51 4c 49 54  BINT', .** SQLIT
7d80: 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 20 69 73  E_AFF_INTEGER is
7d90: 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a   returned..**.**
7da0: 20 53 75 62 73 74 72 69 6e 67 20 20 20 20 20 7c   Substring     |
7db0: 20 41 66 66 69 6e 69 74 79 0a 2a 2a 20 2d 2d 2d   Affinity.** ---
7dc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7dd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a  -------------.**
7de0: 20 27 49 4e 54 27 20 20 20 20 20 20 20 20 20 7c   'INT'         |
7df0: 20 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45   SQLITE_AFF_INTE
7e00: 47 45 52 0a 2a 2a 20 27 43 48 41 52 27 20 20 20  GER.** 'CHAR'   
7e10: 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 41 46       | SQLITE_AF
7e20: 46 5f 54 45 58 54 0a 2a 2a 20 27 43 4c 4f 42 27  F_TEXT.** 'CLOB'
7e30: 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45          | SQLITE
7e40: 5f 41 46 46 5f 54 45 58 54 0a 2a 2a 20 27 54 45  _AFF_TEXT.** 'TE
7e50: 58 54 27 20 20 20 20 20 20 20 20 7c 20 53 51 4c  XT'        | SQL
7e60: 49 54 45 5f 41 46 46 5f 54 45 58 54 0a 2a 2a 20  ITE_AFF_TEXT.** 
7e70: 27 42 4c 4f 42 27 20 20 20 20 20 20 20 20 7c 20  'BLOB'        | 
7e80: 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 0a  SQLITE_AFF_NONE.
7e90: 2a 2a 20 27 52 45 41 4c 27 20 20 20 20 20 20 20  ** 'REAL'       
7ea0: 20 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f 52 45   | SQLITE_AFF_RE
7eb0: 41 4c 0a 2a 2a 20 27 46 4c 4f 41 27 20 20 20 20  AL.** 'FLOA'    
7ec0: 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 41 46 46      | SQLITE_AFF
7ed0: 5f 52 45 41 4c 0a 2a 2a 20 27 44 4f 55 42 27 20  _REAL.** 'DOUB' 
7ee0: 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f         | SQLITE_
7ef0: 41 46 46 5f 52 45 41 4c 0a 2a 2a 0a 2a 2a 20 49  AFF_REAL.**.** I
7f00: 66 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20 73 75  f none of the su
7f10: 62 73 74 72 69 6e 67 73 20 69 6e 20 74 68 65 20  bstrings in the 
7f20: 61 62 6f 76 65 20 74 61 62 6c 65 20 61 72 65 20  above table are 
7f30: 66 6f 75 6e 64 2c 0a 2a 2a 20 53 51 4c 49 54 45  found,.** SQLITE
7f40: 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20 69 73 20  _AFF_NUMERIC is 
7f50: 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 63 68 61  returned..*/.cha
7f60: 72 20 73 71 6c 69 74 65 33 41 66 66 69 6e 69 74  r sqlite3Affinit
7f70: 79 54 79 70 65 28 63 6f 6e 73 74 20 54 6f 6b 65  yType(const Toke
7f80: 6e 20 2a 70 54 79 70 65 29 7b 0a 20 20 75 33 32  n *pType){.  u32
7f90: 20 68 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 61   h = 0;.  char a
7fa0: 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f  ff = SQLITE_AFF_
7fb0: 4e 55 4d 45 52 49 43 3b 0a 20 20 63 6f 6e 73 74  NUMERIC;.  const
7fc0: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
7fd0: 7a 49 6e 20 3d 20 70 54 79 70 65 2d 3e 7a 3b 0a  zIn = pType->z;.
7fe0: 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64    const unsigned
7ff0: 20 63 68 61 72 20 2a 7a 45 6e 64 20 3d 20 26 70   char *zEnd = &p
8000: 54 79 70 65 2d 3e 7a 5b 70 54 79 70 65 2d 3e 6e  Type->z[pType->n
8010: 5d 3b 0a 0a 20 20 77 68 69 6c 65 28 20 7a 49 6e  ];..  while( zIn
8020: 21 3d 7a 45 6e 64 20 29 7b 0a 20 20 20 20 68 20  !=zEnd ){.    h 
8030: 3d 20 28 68 3c 3c 38 29 20 2b 20 73 71 6c 69 74  = (h<<8) + sqlit
8040: 65 33 55 70 70 65 72 54 6f 4c 6f 77 65 72 5b 2a  e3UpperToLower[*
8050: 7a 49 6e 5d 3b 0a 20 20 20 20 7a 49 6e 2b 2b 3b  zIn];.    zIn++;
8060: 0a 20 20 20 20 69 66 28 20 68 3d 3d 28 28 27 63  .    if( h==(('c
8070: 27 3c 3c 32 34 29 2b 28 27 68 27 3c 3c 31 36 29  '<<24)+('h'<<16)
8080: 2b 28 27 61 27 3c 3c 38 29 2b 27 72 27 29 20 29  +('a'<<8)+'r') )
8090: 7b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  {             /*
80a0: 20 43 48 41 52 20 2a 2f 0a 20 20 20 20 20 20 61   CHAR */.      a
80b0: 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f  ff = SQLITE_AFF_
80c0: 54 45 58 54 3b 20 0a 20 20 20 20 7d 65 6c 73 65  TEXT; .    }else
80d0: 20 69 66 28 20 68 3d 3d 28 28 27 63 27 3c 3c 32   if( h==(('c'<<2
80e0: 34 29 2b 28 27 6c 27 3c 3c 31 36 29 2b 28 27 6f  4)+('l'<<16)+('o
80f0: 27 3c 3c 38 29 2b 27 62 27 29 20 29 7b 20 20 20  '<<8)+'b') ){   
8100: 20 20 20 20 2f 2a 20 43 4c 4f 42 20 2a 2f 0a 20      /* CLOB */. 
8110: 20 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49 54       aff = SQLIT
8120: 45 5f 41 46 46 5f 54 45 58 54 3b 0a 20 20 20 20  E_AFF_TEXT;.    
8130: 7d 65 6c 73 65 20 69 66 28 20 68 3d 3d 28 28 27  }else if( h==(('
8140: 74 27 3c 3c 32 34 29 2b 28 27 65 27 3c 3c 31 36  t'<<24)+('e'<<16
8150: 29 2b 28 27 78 27 3c 3c 38 29 2b 27 74 27 29 20  )+('x'<<8)+'t') 
8160: 29 7b 20 20 20 20 20 20 20 2f 2a 20 54 45 58 54  ){       /* TEXT
8170: 20 2a 2f 0a 20 20 20 20 20 20 61 66 66 20 3d 20   */.      aff = 
8180: 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 3b  SQLITE_AFF_TEXT;
8190: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 68  .    }else if( h
81a0: 3d 3d 28 28 27 62 27 3c 3c 32 34 29 2b 28 27 6c  ==(('b'<<24)+('l
81b0: 27 3c 3c 31 36 29 2b 28 27 6f 27 3c 3c 38 29 2b  '<<16)+('o'<<8)+
81c0: 27 62 27 29 20 20 20 20 20 20 20 20 20 20 2f 2a  'b')          /*
81d0: 20 42 4c 4f 42 20 2a 2f 0a 20 20 20 20 20 20 20   BLOB */.       
81e0: 20 26 26 20 28 61 66 66 3d 3d 53 51 4c 49 54 45   && (aff==SQLITE
81f0: 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20 7c 7c 20  _AFF_NUMERIC || 
8200: 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f  aff==SQLITE_AFF_
8210: 52 45 41 4c 29 20 29 7b 0a 20 20 20 20 20 20 61  REAL) ){.      a
8220: 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f  ff = SQLITE_AFF_
8230: 4e 4f 4e 45 3b 0a 23 69 66 6e 64 65 66 20 53 51  NONE;.#ifndef SQ
8240: 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49  LITE_OMIT_FLOATI
8250: 4e 47 5f 50 4f 49 4e 54 0a 20 20 20 20 7d 65 6c  NG_POINT.    }el
8260: 73 65 20 69 66 28 20 68 3d 3d 28 28 27 72 27 3c  se if( h==(('r'<
8270: 3c 32 34 29 2b 28 27 65 27 3c 3c 31 36 29 2b 28  <24)+('e'<<16)+(
8280: 27 61 27 3c 3c 38 29 2b 27 6c 27 29 20 20 20 20  'a'<<8)+'l')    
8290: 20 20 20 20 20 20 2f 2a 20 52 45 41 4c 20 2a 2f        /* REAL */
82a0: 0a 20 20 20 20 20 20 20 20 26 26 20 61 66 66 3d  .        && aff=
82b0: 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45  =SQLITE_AFF_NUME
82c0: 52 49 43 20 29 7b 0a 20 20 20 20 20 20 61 66 66  RIC ){.      aff
82d0: 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 52 45   = SQLITE_AFF_RE
82e0: 41 4c 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  AL;.    }else if
82f0: 28 20 68 3d 3d 28 28 27 66 27 3c 3c 32 34 29 2b  ( h==(('f'<<24)+
8300: 28 27 6c 27 3c 3c 31 36 29 2b 28 27 6f 27 3c 3c  ('l'<<16)+('o'<<
8310: 38 29 2b 27 61 27 29 20 20 20 20 20 20 20 20 20  8)+'a')         
8320: 20 2f 2a 20 46 4c 4f 41 20 2a 2f 0a 20 20 20 20   /* FLOA */.    
8330: 20 20 20 20 26 26 20 61 66 66 3d 3d 53 51 4c 49      && aff==SQLI
8340: 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20 29  TE_AFF_NUMERIC )
8350: 7b 0a 20 20 20 20 20 20 61 66 66 20 3d 20 53 51  {.      aff = SQ
8360: 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 3b 0a 20  LITE_AFF_REAL;. 
8370: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 68 3d 3d     }else if( h==
8380: 28 28 27 64 27 3c 3c 32 34 29 2b 28 27 6f 27 3c  (('d'<<24)+('o'<
8390: 3c 31 36 29 2b 28 27 75 27 3c 3c 38 29 2b 27 62  <16)+('u'<<8)+'b
83a0: 27 29 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44  ')          /* D
83b0: 4f 55 42 20 2a 2f 0a 20 20 20 20 20 20 20 20 26  OUB */.        &
83c0: 26 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46  & aff==SQLITE_AF
83d0: 46 5f 4e 55 4d 45 52 49 43 20 29 7b 0a 20 20 20  F_NUMERIC ){.   
83e0: 20 20 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f     aff = SQLITE_
83f0: 41 46 46 5f 52 45 41 4c 3b 0a 23 65 6e 64 69 66  AFF_REAL;.#endif
8400: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28  .    }else if( (
8410: 68 26 30 78 30 30 46 46 46 46 46 46 29 3d 3d 28  h&0x00FFFFFF)==(
8420: 28 27 69 27 3c 3c 31 36 29 2b 28 27 6e 27 3c 3c  ('i'<<16)+('n'<<
8430: 38 29 2b 27 74 27 29 20 29 7b 20 20 20 20 2f 2a  8)+'t') ){    /*
8440: 20 49 4e 54 20 2a 2f 0a 20 20 20 20 20 20 61 66   INT */.      af
8450: 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 49  f = SQLITE_AFF_I
8460: 4e 54 45 47 45 52 3b 0a 20 20 20 20 20 20 62 72  NTEGER;.      br
8470: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  eak;.    }.  }..
8480: 20 20 72 65 74 75 72 6e 20 61 66 66 3b 0a 7d 0a    return aff;.}.
8490: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
84a0: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 62 79  ine is called by
84b0: 20 74 68 65 20 70 61 72 73 65 72 20 77 68 69 6c   the parser whil
84c0: 65 20 69 6e 20 74 68 65 20 6d 69 64 64 6c 65 20  e in the middle 
84d0: 6f 66 0a 2a 2a 20 70 61 72 73 69 6e 67 20 61 20  of.** parsing a 
84e0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61  CREATE TABLE sta
84f0: 74 65 6d 65 6e 74 2e 20 20 54 68 65 20 70 46 69  tement.  The pFi
8500: 72 73 74 20 74 6f 6b 65 6e 20 69 73 20 74 68 65  rst token is the
8510: 20 66 69 72 73 74 0a 2a 2a 20 74 6f 6b 65 6e 20   first.** token 
8520: 69 6e 20 74 68 65 20 73 65 71 75 65 6e 63 65 20  in the sequence 
8530: 6f 66 20 74 6f 6b 65 6e 73 20 74 68 61 74 20 64  of tokens that d
8540: 65 73 63 72 69 62 65 20 74 68 65 20 74 79 70 65  escribe the type
8550: 20 6f 66 20 74 68 65 0a 2a 2a 20 63 6f 6c 75 6d   of the.** colum
8560: 6e 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65  n currently unde
8570: 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 20  r construction. 
8580: 20 20 70 4c 61 73 74 20 69 73 20 74 68 65 20 6c    pLast is the l
8590: 61 73 74 20 74 6f 6b 65 6e 0a 2a 2a 20 69 6e 20  ast token.** in 
85a0: 74 68 65 20 73 65 71 75 65 6e 63 65 2e 20 20 55  the sequence.  U
85b0: 73 65 20 74 68 69 73 20 69 6e 66 6f 72 6d 61 74  se this informat
85c0: 69 6f 6e 20 74 6f 20 63 6f 6e 73 74 72 75 63 74  ion to construct
85d0: 20 61 20 73 74 72 69 6e 67 0a 2a 2a 20 74 68 61   a string.** tha
85e0: 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 74  t contains the t
85f0: 79 70 65 6e 61 6d 65 20 6f 66 20 74 68 65 20 63  ypename of the c
8600: 6f 6c 75 6d 6e 20 61 6e 64 20 73 74 6f 72 65 20  olumn and store 
8610: 74 68 61 74 20 73 74 72 69 6e 67 0a 2a 2a 20 69  that string.** i
8620: 6e 20 7a 54 79 70 65 2e 0a 2a 2f 20 0a 76 6f 69  n zType..*/ .voi
8630: 64 20 73 71 6c 69 74 65 33 41 64 64 43 6f 6c 75  d sqlite3AddColu
8640: 6d 6e 54 79 70 65 28 50 61 72 73 65 20 2a 70 50  mnType(Parse *pP
8650: 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 54 79  arse, Token *pTy
8660: 70 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b  pe){.  Table *p;
8670: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 43 6f 6c 75  .  int i;.  Colu
8680: 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 73 71 6c 69  mn *pCol;.  sqli
8690: 74 65 33 20 2a 64 62 3b 0a 0a 20 20 69 66 28 20  te3 *db;..  if( 
86a0: 28 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65  (p = pParse->pNe
86b0: 77 54 61 62 6c 65 29 3d 3d 30 20 29 20 72 65 74  wTable)==0 ) ret
86c0: 75 72 6e 3b 0a 20 20 69 20 3d 20 70 2d 3e 6e 43  urn;.  i = p->nC
86d0: 6f 6c 2d 31 3b 0a 20 20 69 66 28 20 69 3c 30 20  ol-1;.  if( i<0 
86e0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 43 6f 6c  ) return;.  pCol
86f0: 20 3d 20 26 70 2d 3e 61 43 6f 6c 5b 69 5d 3b 0a   = &p->aCol[i];.
8700: 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64    db = pParse->d
8710: 62 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  b;.  sqlite3DbFr
8720: 65 65 28 64 62 2c 20 70 43 6f 6c 2d 3e 7a 54 79  ee(db, pCol->zTy
8730: 70 65 29 3b 0a 20 20 70 43 6f 6c 2d 3e 7a 54 79  pe);.  pCol->zTy
8740: 70 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65  pe = sqlite3Name
8750: 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 54  FromToken(db, pT
8760: 79 70 65 29 3b 0a 20 20 70 43 6f 6c 2d 3e 61 66  ype);.  pCol->af
8770: 66 69 6e 69 74 79 20 3d 20 73 71 6c 69 74 65 33  finity = sqlite3
8780: 41 66 66 69 6e 69 74 79 54 79 70 65 28 70 54 79  AffinityType(pTy
8790: 70 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  pe);.}../*.** Th
87a0: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
87b0: 74 68 65 20 64 65 66 61 75 6c 74 20 76 61 6c 75  the default valu
87c0: 65 20 66 6f 72 20 74 68 65 20 6d 6f 73 74 20 72  e for the most r
87d0: 65 63 65 6e 74 6c 79 20 61 64 64 65 64 20 63 6f  ecently added co
87e0: 6c 75 6d 6e 0a 2a 2a 20 6f 66 20 74 68 65 20 74  lumn.** of the t
87f0: 61 62 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 75  able currently u
8800: 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f  nder constructio
8810: 6e 2e 0a 2a 2a 0a 2a 2a 20 44 65 66 61 75 6c 74  n..**.** Default
8820: 20 76 61 6c 75 65 20 65 78 70 72 65 73 73 69 6f   value expressio
8830: 6e 73 20 6d 75 73 74 20 62 65 20 63 6f 6e 73 74  ns must be const
8840: 61 6e 74 2e 20 20 52 61 69 73 65 20 61 6e 20 65  ant.  Raise an e
8850: 78 63 65 70 74 69 6f 6e 20 69 66 20 74 68 69 73  xception if this
8860: 0a 2a 2a 20 69 73 20 6e 6f 74 20 74 68 65 20 63  .** is not the c
8870: 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ase..**.** This 
8880: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
8890: 64 20 62 79 20 74 68 65 20 70 61 72 73 65 72 20  d by the parser 
88a0: 77 68 69 6c 65 20 69 6e 20 74 68 65 20 6d 69 64  while in the mid
88b0: 64 6c 65 20 6f 66 0a 2a 2a 20 70 61 72 73 69 6e  dle of.** parsin
88c0: 67 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45  g a CREATE TABLE
88d0: 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 76   statement..*/.v
88e0: 6f 69 64 20 73 71 6c 69 74 65 33 41 64 64 44 65  oid sqlite3AddDe
88f0: 66 61 75 6c 74 56 61 6c 75 65 28 50 61 72 73 65  faultValue(Parse
8900: 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a   *pParse, Expr *
8910: 70 45 78 70 72 29 7b 0a 20 20 54 61 62 6c 65 20  pExpr){.  Table 
8920: 2a 70 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43  *p;.  Column *pC
8930: 6f 6c 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  ol;.  sqlite3 *d
8940: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
8950: 20 20 69 66 28 20 28 70 20 3d 20 70 50 61 72 73    if( (p = pPars
8960: 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29 21 3d 30  e->pNewTable)!=0
8970: 20 29 7b 0a 20 20 20 20 70 43 6f 6c 20 3d 20 26   ){.    pCol = &
8980: 28 70 2d 3e 61 43 6f 6c 5b 70 2d 3e 6e 43 6f 6c  (p->aCol[p->nCol
8990: 2d 31 5d 29 3b 0a 20 20 20 20 69 66 28 20 21 73  -1]);.    if( !s
89a0: 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73  qlite3ExprIsCons
89b0: 74 61 6e 74 4f 72 46 75 6e 63 74 69 6f 6e 28 70  tantOrFunction(p
89c0: 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20 73  Expr) ){.      s
89d0: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
89e0: 50 61 72 73 65 2c 20 22 64 65 66 61 75 6c 74 20  Parse, "default 
89f0: 76 61 6c 75 65 20 6f 66 20 63 6f 6c 75 6d 6e 20  value of column 
8a00: 5b 25 73 5d 20 69 73 20 6e 6f 74 20 63 6f 6e 73  [%s] is not cons
8a10: 74 61 6e 74 22 2c 0a 20 20 20 20 20 20 20 20 20  tant",.         
8a20: 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20   pCol->zName);. 
8a30: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
8a40: 45 78 70 72 20 2a 70 43 6f 70 79 3b 0a 20 20 20  Expr *pCopy;.   
8a50: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65     sqlite3ExprDe
8a60: 6c 65 74 65 28 64 62 2c 20 70 43 6f 6c 2d 3e 70  lete(db, pCol->p
8a70: 44 66 6c 74 29 3b 0a 20 20 20 20 20 20 70 43 6f  Dflt);.      pCo
8a80: 6c 2d 3e 70 44 66 6c 74 20 3d 20 70 43 6f 70 79  l->pDflt = pCopy
8a90: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
8aa0: 70 28 64 62 2c 20 70 45 78 70 72 29 3b 0a 20 20  p(db, pExpr);.  
8ab0: 20 20 20 20 69 66 28 20 70 43 6f 70 79 20 29 7b      if( pCopy ){
8ac0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
8ad0: 54 6f 6b 65 6e 43 6f 70 79 28 64 62 2c 20 26 70  TokenCopy(db, &p
8ae0: 43 6f 70 79 2d 3e 73 70 61 6e 2c 20 26 70 45 78  Copy->span, &pEx
8af0: 70 72 2d 3e 73 70 61 6e 29 3b 0a 20 20 20 20 20  pr->span);.     
8b00: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73   }.    }.  }.  s
8b10: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
8b20: 28 64 62 2c 20 70 45 78 70 72 29 3b 0a 7d 0a 0a  (db, pExpr);.}..
8b30: 2f 2a 0a 2a 2a 20 44 65 73 69 67 6e 61 74 65 20  /*.** Designate 
8b40: 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20  the PRIMARY KEY 
8b50: 66 6f 72 20 74 68 65 20 74 61 62 6c 65 2e 20 20  for the table.  
8b60: 70 4c 69 73 74 20 69 73 20 61 20 6c 69 73 74 20  pList is a list 
8b70: 6f 66 20 6e 61 6d 65 73 20 0a 2a 2a 20 6f 66 20  of names .** of 
8b80: 63 6f 6c 75 6d 6e 73 20 74 68 61 74 20 66 6f 72  columns that for
8b90: 6d 20 74 68 65 20 70 72 69 6d 61 72 79 20 6b 65  m the primary ke
8ba0: 79 2e 20 20 49 66 20 70 4c 69 73 74 20 69 73 20  y.  If pList is 
8bb0: 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68 65 0a 2a  NULL, then the.*
8bc0: 2a 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20  * most recently 
8bd0: 61 64 64 65 64 20 63 6f 6c 75 6d 6e 20 6f 66 20  added column of 
8be0: 74 68 65 20 74 61 62 6c 65 20 69 73 20 74 68 65  the table is the
8bf0: 20 70 72 69 6d 61 72 79 20 6b 65 79 2e 0a 2a 2a   primary key..**
8c00: 0a 2a 2a 20 41 20 74 61 62 6c 65 20 63 61 6e 20  .** A table can 
8c10: 68 61 76 65 20 61 74 20 6d 6f 73 74 20 6f 6e 65  have at most one
8c20: 20 70 72 69 6d 61 72 79 20 6b 65 79 2e 20 20 49   primary key.  I
8c30: 66 20 74 68 65 20 74 61 62 6c 65 20 61 6c 72 65  f the table alre
8c40: 61 64 79 20 68 61 73 0a 2a 2a 20 61 20 70 72 69  ady has.** a pri
8c50: 6d 61 72 79 20 6b 65 79 20 28 61 6e 64 20 74 68  mary key (and th
8c60: 69 73 20 69 73 20 74 68 65 20 73 65 63 6f 6e 64  is is the second
8c70: 20 70 72 69 6d 61 72 79 20 6b 65 79 29 20 74 68   primary key) th
8c80: 65 6e 20 63 72 65 61 74 65 20 61 6e 0a 2a 2a 20  en create an.** 
8c90: 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  error..**.** If 
8ca0: 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20  the PRIMARY KEY 
8cb0: 69 73 20 6f 6e 20 61 20 73 69 6e 67 6c 65 20 63  is on a single c
8cc0: 6f 6c 75 6d 6e 20 77 68 6f 73 65 20 64 61 74 61  olumn whose data
8cd0: 74 79 70 65 20 69 73 20 49 4e 54 45 47 45 52 2c  type is INTEGER,
8ce0: 0a 2a 2a 20 74 68 65 6e 20 77 65 20 77 69 6c 6c  .** then we will
8cf0: 20 74 72 79 20 74 6f 20 75 73 65 20 74 68 61 74   try to use that
8d00: 20 63 6f 6c 75 6d 6e 20 61 73 20 74 68 65 20 72   column as the r
8d10: 6f 77 69 64 2e 20 20 53 65 74 20 74 68 65 20 54  owid.  Set the T
8d20: 61 62 6c 65 2e 69 50 4b 65 79 0a 2a 2a 20 66 69  able.iPKey.** fi
8d30: 65 6c 64 20 6f 66 20 74 68 65 20 74 61 62 6c 65  eld of the table
8d40: 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74   under construct
8d50: 69 6f 6e 20 74 6f 20 62 65 20 74 68 65 20 69 6e  ion to be the in
8d60: 64 65 78 20 6f 66 20 74 68 65 0a 2a 2a 20 49 4e  dex of the.** IN
8d70: 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45  TEGER PRIMARY KE
8d80: 59 20 63 6f 6c 75 6d 6e 2e 20 20 54 61 62 6c 65  Y column.  Table
8d90: 2e 69 50 4b 65 79 20 69 73 20 73 65 74 20 74 6f  .iPKey is set to
8da0: 20 2d 31 20 69 66 20 74 68 65 72 65 20 69 73 0a   -1 if there is.
8db0: 2a 2a 20 6e 6f 20 49 4e 54 45 47 45 52 20 50 52  ** no INTEGER PR
8dc0: 49 4d 41 52 59 20 4b 45 59 2e 0a 2a 2a 0a 2a 2a  IMARY KEY..**.**
8dd0: 20 49 66 20 74 68 65 20 6b 65 79 20 69 73 20 6e   If the key is n
8de0: 6f 74 20 61 6e 20 49 4e 54 45 47 45 52 20 50 52  ot an INTEGER PR
8df0: 49 4d 41 52 59 20 4b 45 59 2c 20 74 68 65 6e 20  IMARY KEY, then 
8e00: 63 72 65 61 74 65 20 61 20 75 6e 69 71 75 65 0a  create a unique.
8e10: 2a 2a 20 69 6e 64 65 78 20 66 6f 72 20 74 68 65  ** index for the
8e20: 20 6b 65 79 2e 20 20 4e 6f 20 69 6e 64 65 78 20   key.  No index 
8e30: 69 73 20 63 72 65 61 74 65 64 20 66 6f 72 20 49  is created for I
8e40: 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b  NTEGER PRIMARY K
8e50: 45 59 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  EYs..*/.void sql
8e60: 69 74 65 33 41 64 64 50 72 69 6d 61 72 79 4b 65  ite3AddPrimaryKe
8e70: 79 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  y(.  Parse *pPar
8e80: 73 65 2c 20 20 20 20 2f 2a 20 50 61 72 73 69 6e  se,    /* Parsin
8e90: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45  g context */.  E
8ea0: 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20  xprList *pList, 
8eb0: 20 2f 2a 20 4c 69 73 74 20 6f 66 20 66 69 65 6c   /* List of fiel
8ec0: 64 20 6e 61 6d 65 73 20 74 6f 20 62 65 20 69 6e  d names to be in
8ed0: 64 65 78 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6f  dexed */.  int o
8ee0: 6e 45 72 72 6f 72 2c 20 20 20 20 20 20 2f 2a 20  nError,      /* 
8ef0: 57 68 61 74 20 74 6f 20 64 6f 20 77 69 74 68 20  What to do with 
8f00: 61 20 75 6e 69 71 75 65 6e 65 73 73 20 63 6f 6e  a uniqueness con
8f10: 66 6c 69 63 74 20 2a 2f 0a 20 20 69 6e 74 20 61  flict */.  int a
8f20: 75 74 6f 49 6e 63 2c 20 20 20 20 20 20 2f 2a 20  utoInc,      /* 
8f30: 54 72 75 65 20 69 66 20 74 68 65 20 41 55 54 4f  True if the AUTO
8f40: 49 4e 43 52 45 4d 45 4e 54 20 6b 65 79 77 6f 72  INCREMENT keywor
8f50: 64 20 69 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a  d is present */.
8f60: 20 20 69 6e 74 20 73 6f 72 74 4f 72 64 65 72 20    int sortOrder 
8f70: 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 53 4f      /* SQLITE_SO
8f80: 5f 41 53 43 20 6f 72 20 53 51 4c 49 54 45 5f 53  _ASC or SQLITE_S
8f90: 4f 5f 44 45 53 43 20 2a 2f 0a 29 7b 0a 20 20 54  O_DESC */.){.  T
8fa0: 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 50 61  able *pTab = pPa
8fb0: 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a  rse->pNewTable;.
8fc0: 20 20 63 68 61 72 20 2a 7a 54 79 70 65 20 3d 20    char *zType = 
8fd0: 30 3b 0a 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20  0;.  int iCol = 
8fe0: 2d 31 2c 20 69 3b 0a 20 20 69 66 28 20 70 54 61  -1, i;.  if( pTa
8ff0: 62 3d 3d 30 20 7c 7c 20 49 4e 5f 44 45 43 4c 41  b==0 || IN_DECLA
9000: 52 45 5f 56 54 41 42 20 29 20 67 6f 74 6f 20 70  RE_VTAB ) goto p
9010: 72 69 6d 61 72 79 5f 6b 65 79 5f 65 78 69 74 3b  rimary_key_exit;
9020: 0a 20 20 69 66 28 20 70 54 61 62 2d 3e 68 61 73  .  if( pTab->has
9030: 50 72 69 6d 4b 65 79 20 29 7b 0a 20 20 20 20 73  PrimKey ){.    s
9040: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
9050: 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20 22 74  Parse, .      "t
9060: 61 62 6c 65 20 5c 22 25 73 5c 22 20 68 61 73 20  able \"%s\" has 
9070: 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 70 72  more than one pr
9080: 69 6d 61 72 79 20 6b 65 79 22 2c 20 70 54 61 62  imary key", pTab
9090: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 67 6f  ->zName);.    go
90a0: 74 6f 20 70 72 69 6d 61 72 79 5f 6b 65 79 5f 65  to primary_key_e
90b0: 78 69 74 3b 0a 20 20 7d 0a 20 20 70 54 61 62 2d  xit;.  }.  pTab-
90c0: 3e 68 61 73 50 72 69 6d 4b 65 79 20 3d 20 31 3b  >hasPrimKey = 1;
90d0: 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20  .  if( pList==0 
90e0: 29 7b 0a 20 20 20 20 69 43 6f 6c 20 3d 20 70 54  ){.    iCol = pT
90f0: 61 62 2d 3e 6e 43 6f 6c 20 2d 20 31 3b 0a 20 20  ab->nCol - 1;.  
9100: 20 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f    pTab->aCol[iCo
9110: 6c 5d 2e 69 73 50 72 69 6d 4b 65 79 20 3d 20 31  l].isPrimKey = 1
9120: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66  ;.  }else{.    f
9130: 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d  or(i=0; i<pList-
9140: 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
9150: 20 20 20 20 66 6f 72 28 69 43 6f 6c 3d 30 3b 20      for(iCol=0; 
9160: 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b  iCol<pTab->nCol;
9170: 20 69 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20   iCol++){.      
9180: 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72    if( sqlite3Str
9190: 49 43 6d 70 28 70 4c 69 73 74 2d 3e 61 5b 69 5d  ICmp(pList->a[i]
91a0: 2e 7a 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 61 43  .zName, pTab->aC
91b0: 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 29 3d  ol[iCol].zName)=
91c0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
91d0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
91e0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
91f0: 66 28 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43  f( iCol<pTab->nC
9200: 6f 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 70 54  ol ){.        pT
9210: 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 69  ab->aCol[iCol].i
9220: 73 50 72 69 6d 4b 65 79 20 3d 20 31 3b 0a 20 20  sPrimKey = 1;.  
9230: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
9240: 69 66 28 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72  if( pList->nExpr
9250: 3e 31 20 29 20 69 43 6f 6c 20 3d 20 2d 31 3b 0a  >1 ) iCol = -1;.
9260: 20 20 7d 0a 20 20 69 66 28 20 69 43 6f 6c 3e 3d    }.  if( iCol>=
9270: 30 20 26 26 20 69 43 6f 6c 3c 70 54 61 62 2d 3e  0 && iCol<pTab->
9280: 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 7a 54 79 70  nCol ){.    zTyp
9290: 65 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69  e = pTab->aCol[i
92a0: 43 6f 6c 5d 2e 7a 54 79 70 65 3b 0a 20 20 7d 0a  Col].zType;.  }.
92b0: 20 20 69 66 28 20 7a 54 79 70 65 20 26 26 20 73    if( zType && s
92c0: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 54  qlite3StrICmp(zT
92d0: 79 70 65 2c 20 22 49 4e 54 45 47 45 52 22 29 3d  ype, "INTEGER")=
92e0: 3d 30 0a 20 20 20 20 20 20 20 20 26 26 20 73 6f  =0.        && so
92f0: 72 74 4f 72 64 65 72 3d 3d 53 51 4c 49 54 45 5f  rtOrder==SQLITE_
9300: 53 4f 5f 41 53 43 20 29 7b 0a 20 20 20 20 70 54  SO_ASC ){.    pT
9310: 61 62 2d 3e 69 50 4b 65 79 20 3d 20 69 43 6f 6c  ab->iPKey = iCol
9320: 3b 0a 20 20 20 20 70 54 61 62 2d 3e 6b 65 79 43  ;.    pTab->keyC
9330: 6f 6e 66 20 3d 20 6f 6e 45 72 72 6f 72 3b 0a 20  onf = onError;. 
9340: 20 20 20 70 54 61 62 2d 3e 61 75 74 6f 49 6e 63     pTab->autoInc
9350: 20 3d 20 61 75 74 6f 49 6e 63 3b 0a 20 20 7d 65   = autoInc;.  }e
9360: 6c 73 65 20 69 66 28 20 61 75 74 6f 49 6e 63 20  lse if( autoInc 
9370: 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ){.#ifndef SQLIT
9380: 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 43 52 45  E_OMIT_AUTOINCRE
9390: 4d 45 4e 54 0a 20 20 20 20 73 71 6c 69 74 65 33  MENT.    sqlite3
93a0: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
93b0: 20 22 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 20   "AUTOINCREMENT 
93c0: 69 73 20 6f 6e 6c 79 20 61 6c 6c 6f 77 65 64 20  is only allowed 
93d0: 6f 6e 20 61 6e 20 22 0a 20 20 20 20 20 20 20 22  on an ".       "
93e0: 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20  INTEGER PRIMARY 
93f0: 4b 45 59 22 29 3b 0a 23 65 6e 64 69 66 0a 20 20  KEY");.#endif.  
9400: 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74  }else{.    sqlit
9410: 65 33 43 72 65 61 74 65 49 6e 64 65 78 28 70 50  e3CreateIndex(pP
9420: 61 72 73 65 2c 20 30 2c 20 30 2c 20 30 2c 20 70  arse, 0, 0, 0, p
9430: 4c 69 73 74 2c 20 6f 6e 45 72 72 6f 72 2c 20 30  List, onError, 0
9440: 2c 20 30 2c 20 73 6f 72 74 4f 72 64 65 72 2c 20  , 0, sortOrder, 
9450: 30 29 3b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20  0);.    pList = 
9460: 30 3b 0a 20 20 7d 0a 0a 70 72 69 6d 61 72 79 5f  0;.  }..primary_
9470: 6b 65 79 5f 65 78 69 74 3a 0a 20 20 73 71 6c 69  key_exit:.  sqli
9480: 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
9490: 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 4c  e(pParse->db, pL
94a0: 69 73 74 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a  ist);.  return;.
94b0: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e  }../*.** Add a n
94c0: 65 77 20 43 48 45 43 4b 20 63 6f 6e 73 74 72 61  ew CHECK constra
94d0: 69 6e 74 20 74 6f 20 74 68 65 20 74 61 62 6c 65  int to the table
94e0: 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72   currently under
94f0: 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a   construction..*
9500: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 41 64  /.void sqlite3Ad
9510: 64 43 68 65 63 6b 43 6f 6e 73 74 72 61 69 6e 74  dCheckConstraint
9520: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
9530: 65 2c 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67  e,    /* Parsing
9540: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78   context */.  Ex
9550: 70 72 20 2a 70 43 68 65 63 6b 45 78 70 72 20 20  pr *pCheckExpr  
9560: 2f 2a 20 54 68 65 20 63 68 65 63 6b 20 65 78 70  /* The check exp
9570: 72 65 73 73 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20  ression */.){.  
9580: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
9590: 61 72 73 65 2d 3e 64 62 3b 0a 23 69 66 6e 64 65  arse->db;.#ifnde
95a0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 48  f SQLITE_OMIT_CH
95b0: 45 43 4b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61  ECK.  Table *pTa
95c0: 62 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  b = pParse->pNew
95d0: 54 61 62 6c 65 3b 0a 20 20 69 66 28 20 70 54 61  Table;.  if( pTa
95e0: 62 20 26 26 20 21 49 4e 5f 44 45 43 4c 41 52 45  b && !IN_DECLARE
95f0: 5f 56 54 41 42 20 29 7b 0a 20 20 20 20 2f 2a 20  _VTAB ){.    /* 
9600: 54 68 65 20 43 48 45 43 4b 20 65 78 70 72 65 73  The CHECK expres
9610: 73 69 6f 6e 20 6d 75 73 74 20 62 65 20 64 75 70  sion must be dup
9620: 6c 69 63 61 74 65 64 20 73 6f 20 74 68 61 74 20  licated so that 
9630: 74 6f 6b 65 6e 73 20 72 65 66 65 72 0a 20 20 20  tokens refer.   
9640: 20 2a 2a 20 74 6f 20 6d 61 6c 6c 6f 63 65 64 20   ** to malloced 
9650: 73 70 61 63 65 20 61 6e 64 20 6e 6f 74 20 74 68  space and not th
9660: 65 20 28 65 70 68 65 6d 65 72 61 6c 29 20 74 65  e (ephemeral) te
9670: 78 74 20 6f 66 20 74 68 65 20 43 52 45 41 54 45  xt of the CREATE
9680: 20 54 41 42 4c 45 0a 20 20 20 20 2a 2a 20 73 74   TABLE.    ** st
9690: 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 70  atement */.    p
96a0: 54 61 62 2d 3e 70 43 68 65 63 6b 20 3d 20 73 71  Tab->pCheck = sq
96b0: 6c 69 74 65 33 45 78 70 72 41 6e 64 28 64 62 2c  lite3ExprAnd(db,
96c0: 20 70 54 61 62 2d 3e 70 43 68 65 63 6b 2c 20 0a   pTab->pCheck, .
96d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
96e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
96f0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70    sqlite3ExprDup
9700: 28 64 62 2c 20 70 43 68 65 63 6b 45 78 70 72 29  (db, pCheckExpr)
9710: 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  );.  }.#endif.  
9720: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
9730: 65 28 64 62 2c 20 70 43 68 65 63 6b 45 78 70 72  e(db, pCheckExpr
9740: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  );.}../*.** Set 
9750: 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 75  the collation fu
9760: 6e 63 74 69 6f 6e 20 6f 66 20 74 68 65 20 6d 6f  nction of the mo
9770: 73 74 20 72 65 63 65 6e 74 6c 79 20 70 61 72 73  st recently pars
9780: 65 64 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 0a  ed table column.
9790: 2a 2a 20 74 6f 20 74 68 65 20 43 6f 6c 6c 53 65  ** to the CollSe
97a0: 71 20 67 69 76 65 6e 2e 0a 2a 2f 0a 76 6f 69 64  q given..*/.void
97b0: 20 73 71 6c 69 74 65 33 41 64 64 43 6f 6c 6c 61   sqlite3AddColla
97c0: 74 65 54 79 70 65 28 50 61 72 73 65 20 2a 70 50  teType(Parse *pP
97d0: 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 54 6f  arse, Token *pTo
97e0: 6b 65 6e 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70  ken){.  Table *p
97f0: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 68 61  ;.  int i;.  cha
9800: 72 20 2a 7a 43 6f 6c 6c 3b 20 20 20 20 20 20 20  r *zColl;       
9810: 20 20 20 20 20 20 20 2f 2a 20 44 65 71 75 6f 74         /* Dequot
9820: 65 64 20 6e 61 6d 65 20 6f 66 20 63 6f 6c 6c 61  ed name of colla
9830: 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 2a 2f  tion sequence */
9840: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
9850: 0a 20 20 69 66 28 20 28 70 20 3d 20 70 50 61 72  .  if( (p = pPar
9860: 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3d 3d  se->pNewTable)==
9870: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 20  0 ) return;.  i 
9880: 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 64  = p->nCol-1;.  d
9890: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
98a0: 20 20 7a 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65    zColl = sqlite
98b0: 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64  3NameFromToken(d
98c0: 62 2c 20 70 54 6f 6b 65 6e 29 3b 0a 20 20 69 66  b, pToken);.  if
98d0: 28 20 21 7a 43 6f 6c 6c 20 29 20 72 65 74 75 72  ( !zColl ) retur
98e0: 6e 3b 0a 0a 20 20 69 66 28 20 73 71 6c 69 74 65  n;..  if( sqlite
98f0: 33 4c 6f 63 61 74 65 43 6f 6c 6c 53 65 71 28 70  3LocateCollSeq(p
9900: 50 61 72 73 65 2c 20 7a 43 6f 6c 6c 2c 20 2d 31  Parse, zColl, -1
9910: 29 20 29 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a  ) ){.    Index *
9920: 70 49 64 78 3b 0a 20 20 20 20 70 2d 3e 61 43 6f  pIdx;.    p->aCo
9930: 6c 5b 69 5d 2e 7a 43 6f 6c 6c 20 3d 20 7a 43 6f  l[i].zColl = zCo
9940: 6c 6c 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66  ll;.  .    /* If
9950: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69 73 20 64   the column is d
9960: 65 63 6c 61 72 65 64 20 61 73 20 22 3c 6e 61 6d  eclared as "<nam
9970: 65 3e 20 50 52 49 4d 41 52 59 20 4b 45 59 20 43  e> PRIMARY KEY C
9980: 4f 4c 4c 41 54 45 20 3c 74 79 70 65 3e 22 2c 0a  OLLATE <type>",.
9990: 20 20 20 20 2a 2a 20 74 68 65 6e 20 61 6e 20 69      ** then an i
99a0: 6e 64 65 78 20 6d 61 79 20 68 61 76 65 20 62 65  ndex may have be
99b0: 65 6e 20 63 72 65 61 74 65 64 20 6f 6e 20 74 68  en created on th
99c0: 69 73 20 63 6f 6c 75 6d 6e 20 62 65 66 6f 72 65  is column before
99d0: 20 74 68 65 0a 20 20 20 20 2a 2a 20 63 6f 6c 6c   the.    ** coll
99e0: 61 74 69 6f 6e 20 74 79 70 65 20 77 61 73 20 61  ation type was a
99f0: 64 64 65 64 2e 20 43 6f 72 72 65 63 74 20 74 68  dded. Correct th
9a00: 69 73 20 69 66 20 69 74 20 69 73 20 74 68 65 20  is if it is the 
9a10: 63 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  case..    */.   
9a20: 20 66 6f 72 28 70 49 64 78 3d 70 2d 3e 70 49 6e   for(pIdx=p->pIn
9a30: 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d  dex; pIdx; pIdx=
9a40: 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  pIdx->pNext){.  
9a50: 20 20 20 20 61 73 73 65 72 74 28 20 70 49 64 78      assert( pIdx
9a60: 2d 3e 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 29 3b 0a  ->nColumn==1 );.
9a70: 20 20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e        if( pIdx->
9a80: 61 69 43 6f 6c 75 6d 6e 5b 30 5d 3d 3d 69 20 29  aiColumn[0]==i )
9a90: 7b 0a 20 20 20 20 20 20 20 20 70 49 64 78 2d 3e  {.        pIdx->
9aa0: 61 7a 43 6f 6c 6c 5b 30 5d 20 3d 20 70 2d 3e 61  azColl[0] = p->a
9ab0: 43 6f 6c 5b 69 5d 2e 7a 43 6f 6c 6c 3b 0a 20 20  Col[i].zColl;.  
9ac0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65      }.    }.  }e
9ad0: 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  lse{.    sqlite3
9ae0: 44 62 46 72 65 65 28 64 62 2c 20 7a 43 6f 6c 6c  DbFree(db, zColl
9af0: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
9b00: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  This function re
9b10: 74 75 72 6e 73 20 74 68 65 20 63 6f 6c 6c 61 74  turns the collat
9b20: 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 66 6f 72  ion sequence for
9b30: 20 64 61 74 61 62 61 73 65 20 6e 61 74 69 76 65   database native
9b40: 20 74 65 78 74 0a 2a 2a 20 65 6e 63 6f 64 69 6e   text.** encodin
9b50: 67 20 69 64 65 6e 74 69 66 69 65 64 20 62 79 20  g identified by 
9b60: 74 68 65 20 73 74 72 69 6e 67 20 7a 4e 61 6d 65  the string zName
9b70: 2c 20 6c 65 6e 67 74 68 20 6e 4e 61 6d 65 2e 0a  , length nName..
9b80: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 72 65 71  **.** If the req
9b90: 75 65 73 74 65 64 20 63 6f 6c 6c 61 74 69 6f 6e  uested collation
9ba0: 20 73 65 71 75 65 6e 63 65 20 69 73 20 6e 6f 74   sequence is not
9bb0: 20 61 76 61 69 6c 61 62 6c 65 2c 20 6f 72 20 6e   available, or n
9bc0: 6f 74 20 61 76 61 69 6c 61 62 6c 65 0a 2a 2a 20  ot available.** 
9bd0: 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
9be0: 6e 61 74 69 76 65 20 65 6e 63 6f 64 69 6e 67 2c  native encoding,
9bf0: 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 66   the collation f
9c00: 61 63 74 6f 72 79 20 69 73 20 69 6e 76 6f 6b 65  actory is invoke
9c10: 64 20 74 6f 0a 2a 2a 20 72 65 71 75 65 73 74 20  d to.** request 
9c20: 69 74 2e 20 49 66 20 74 68 65 20 63 6f 6c 6c 61  it. If the colla
9c30: 74 69 6f 6e 20 66 61 63 74 6f 72 79 20 64 6f 65  tion factory doe
9c40: 73 20 6e 6f 74 20 73 75 70 70 6c 79 20 73 75 63  s not supply suc
9c50: 68 20 61 20 73 65 71 75 65 6e 63 65 2c 0a 2a 2a  h a sequence,.**
9c60: 20 61 6e 64 20 74 68 65 20 73 65 71 75 65 6e 63   and the sequenc
9c70: 65 20 69 73 20 61 76 61 69 6c 61 62 6c 65 20 69  e is available i
9c80: 6e 20 61 6e 6f 74 68 65 72 20 74 65 78 74 20 65  n another text e
9c90: 6e 63 6f 64 69 6e 67 2c 20 74 68 65 6e 20 74 68  ncoding, then th
9ca0: 61 74 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65  at is.** returne
9cb0: 64 20 69 6e 73 74 65 61 64 2e 0a 2a 2a 0a 2a 2a  d instead..**.**
9cc0: 20 49 66 20 6e 6f 20 76 65 72 73 69 6f 6e 73 20   If no versions 
9cd0: 6f 66 20 74 68 65 20 72 65 71 75 65 73 74 65 64  of the requested
9ce0: 20 63 6f 6c 6c 61 74 69 6f 6e 73 20 73 65 71 75   collations sequ
9cf0: 65 6e 63 65 20 61 72 65 20 61 76 61 69 6c 61 62  ence are availab
9d00: 6c 65 2c 20 6f 72 0a 2a 2a 20 61 6e 6f 74 68 65  le, or.** anothe
9d10: 72 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  r error occurs, 
9d20: 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64  NULL is returned
9d30: 20 61 6e 64 20 61 6e 20 65 72 72 6f 72 20 6d 65   and an error me
9d40: 73 73 61 67 65 20 77 72 69 74 74 65 6e 20 69 6e  ssage written in
9d50: 74 6f 0a 2a 2a 20 70 50 61 72 73 65 2e 0a 2a 2a  to.** pParse..**
9d60: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
9d70: 20 69 73 20 61 20 77 72 61 70 70 65 72 20 61 72   is a wrapper ar
9d80: 6f 75 6e 64 20 73 71 6c 69 74 65 33 46 69 6e 64  ound sqlite3Find
9d90: 43 6f 6c 6c 53 65 71 28 29 2e 20 20 54 68 69 73  CollSeq().  This
9da0: 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 6e 76 6f   routine.** invo
9db0: 6b 65 73 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f  kes the collatio
9dc0: 6e 20 66 61 63 74 6f 72 79 20 69 66 20 74 68 65  n factory if the
9dd0: 20 6e 61 6d 65 64 20 63 6f 6c 6c 61 74 69 6f 6e   named collation
9de0: 20 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64   cannot be found
9df0: 0a 2a 2a 20 61 6e 64 20 67 65 6e 65 72 61 74 65  .** and generate
9e00: 73 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61  s an error messa
9e10: 67 65 2e 0a 2a 2f 0a 43 6f 6c 6c 53 65 71 20 2a  ge..*/.CollSeq *
9e20: 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 43 6f 6c  sqlite3LocateCol
9e30: 6c 53 65 71 28 50 61 72 73 65 20 2a 70 50 61 72  lSeq(Parse *pPar
9e40: 73 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  se, const char *
9e50: 7a 4e 61 6d 65 2c 20 69 6e 74 20 6e 4e 61 6d 65  zName, int nName
9e60: 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
9e70: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
9e80: 20 75 38 20 65 6e 63 20 3d 20 45 4e 43 28 64 62   u8 enc = ENC(db
9e90: 29 3b 0a 20 20 75 38 20 69 6e 69 74 62 75 73 79  );.  u8 initbusy
9ea0: 20 3d 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79   = db->init.busy
9eb0: 3b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f  ;.  CollSeq *pCo
9ec0: 6c 6c 3b 0a 0a 20 20 70 43 6f 6c 6c 20 3d 20 73  ll;..  pColl = s
9ed0: 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65  qlite3FindCollSe
9ee0: 71 28 64 62 2c 20 65 6e 63 2c 20 7a 4e 61 6d 65  q(db, enc, zName
9ef0: 2c 20 6e 4e 61 6d 65 2c 20 69 6e 69 74 62 75 73  , nName, initbus
9f00: 79 29 3b 0a 20 20 69 66 28 20 21 69 6e 69 74 62  y);.  if( !initb
9f10: 75 73 79 20 26 26 20 28 21 70 43 6f 6c 6c 20 7c  usy && (!pColl |
9f20: 7c 20 21 70 43 6f 6c 6c 2d 3e 78 43 6d 70 29 20  | !pColl->xCmp) 
9f30: 29 7b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73  ){.    pColl = s
9f40: 71 6c 69 74 65 33 47 65 74 43 6f 6c 6c 53 65 71  qlite3GetCollSeq
9f50: 28 64 62 2c 20 70 43 6f 6c 6c 2c 20 7a 4e 61 6d  (db, pColl, zNam
9f60: 65 2c 20 6e 4e 61 6d 65 29 3b 0a 20 20 20 20 69  e, nName);.    i
9f70: 66 28 20 21 70 43 6f 6c 6c 20 29 7b 0a 20 20 20  f( !pColl ){.   
9f80: 20 20 20 69 66 28 20 6e 4e 61 6d 65 3c 30 20 29     if( nName<0 )
9f90: 7b 0a 20 20 20 20 20 20 20 20 6e 4e 61 6d 65 20  {.        nName 
9fa0: 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 28  = sqlite3Strlen(
9fb0: 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  db, zName);.    
9fc0: 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
9fd0: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
9fe0: 2c 20 22 6e 6f 20 73 75 63 68 20 63 6f 6c 6c 61  , "no such colla
9ff0: 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 3a 20 25  tion sequence: %
a000: 2e 2a 73 22 2c 20 6e 4e 61 6d 65 2c 20 7a 4e 61  .*s", nName, zNa
a010: 6d 65 29 3b 0a 20 20 20 20 20 20 70 43 6f 6c 6c  me);.      pColl
a020: 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 0;.    }.  }.
a030: 0a 20 20 72 65 74 75 72 6e 20 70 43 6f 6c 6c 3b  .  return pColl;
a040: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  .}.../*.** Gener
a050: 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 77 69  ate code that wi
a060: 6c 6c 20 69 6e 63 72 65 6d 65 6e 74 20 74 68 65  ll increment the
a070: 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 2e 0a   schema cookie..
a080: 2a 2a 0a 2a 2a 20 54 68 65 20 73 63 68 65 6d 61  **.** The schema
a090: 20 63 6f 6f 6b 69 65 20 69 73 20 75 73 65 64 20   cookie is used 
a0a0: 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 77 68 65  to determine whe
a0b0: 6e 20 74 68 65 20 73 63 68 65 6d 61 20 66 6f 72  n the schema for
a0c0: 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65   the.** database
a0d0: 20 63 68 61 6e 67 65 73 2e 20 20 41 66 74 65 72   changes.  After
a0e0: 20 65 61 63 68 20 73 63 68 65 6d 61 20 63 68 61   each schema cha
a0f0: 6e 67 65 2c 20 74 68 65 20 63 6f 6f 6b 69 65 20  nge, the cookie 
a100: 76 61 6c 75 65 0a 2a 2a 20 63 68 61 6e 67 65 73  value.** changes
a110: 2e 20 20 57 68 65 6e 20 61 20 70 72 6f 63 65 73  .  When a proces
a120: 73 20 66 69 72 73 74 20 72 65 61 64 73 20 74 68  s first reads th
a130: 65 20 73 63 68 65 6d 61 20 69 74 20 72 65 63 6f  e schema it reco
a140: 72 64 73 20 74 68 65 0a 2a 2a 20 63 6f 6f 6b 69  rds the.** cooki
a150: 65 2e 20 20 54 68 65 72 65 61 66 74 65 72 2c 20  e.  Thereafter, 
a160: 77 68 65 6e 65 76 65 72 20 69 74 20 67 6f 65 73  whenever it goes
a170: 20 74 6f 20 61 63 63 65 73 73 20 74 68 65 20 64   to access the d
a180: 61 74 61 62 61 73 65 2c 0a 2a 2a 20 69 74 20 63  atabase,.** it c
a190: 68 65 63 6b 73 20 74 68 65 20 63 6f 6f 6b 69 65  hecks the cookie
a1a0: 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68   to make sure th
a1b0: 65 20 73 63 68 65 6d 61 20 68 61 73 20 6e 6f 74  e schema has not
a1c0: 20 63 68 61 6e 67 65 64 0a 2a 2a 20 73 69 6e 63   changed.** sinc
a1d0: 65 20 69 74 20 77 61 73 20 6c 61 73 74 20 72 65  e it was last re
a1e0: 61 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 70  ad..**.** This p
a1f0: 6c 61 6e 20 69 73 20 6e 6f 74 20 63 6f 6d 70 6c  lan is not compl
a200: 65 74 65 6c 79 20 62 75 6c 6c 65 74 2d 70 72 6f  etely bullet-pro
a210: 6f 66 2e 20 20 49 74 20 69 73 20 70 6f 73 73 69  of.  It is possi
a220: 62 6c 65 20 66 6f 72 0a 2a 2a 20 74 68 65 20 73  ble for.** the s
a230: 63 68 65 6d 61 20 74 6f 20 63 68 61 6e 67 65 20  chema to change 
a240: 6d 75 6c 74 69 70 6c 65 20 74 69 6d 65 73 20 61  multiple times a
a250: 6e 64 20 66 6f 72 20 74 68 65 20 63 6f 6f 6b 69  nd for the cooki
a260: 65 20 74 6f 20 62 65 0a 2a 2a 20 73 65 74 20 62  e to be.** set b
a270: 61 63 6b 20 74 6f 20 70 72 69 6f 72 20 76 61 6c  ack to prior val
a280: 75 65 2e 20 20 42 75 74 20 73 63 68 65 6d 61 20  ue.  But schema 
a290: 63 68 61 6e 67 65 73 20 61 72 65 20 69 6e 66 72  changes are infr
a2a0: 65 71 75 65 6e 74 0a 2a 2a 20 61 6e 64 20 74 68  equent.** and th
a2b0: 65 20 70 72 6f 62 61 62 69 6c 69 74 79 20 6f 66  e probability of
a2c0: 20 68 69 74 74 69 6e 67 20 74 68 65 20 73 61 6d   hitting the sam
a2d0: 65 20 63 6f 6f 6b 69 65 20 76 61 6c 75 65 20 69  e cookie value i
a2e0: 73 20 6f 6e 6c 79 0a 2a 2a 20 31 20 63 68 61 6e  s only.** 1 chan
a2f0: 63 65 20 69 6e 20 32 5e 33 32 2e 20 20 53 6f 20  ce in 2^32.  So 
a300: 77 65 27 72 65 20 73 61 66 65 20 65 6e 6f 75 67  we're safe enoug
a310: 68 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  h..*/.void sqlit
a320: 65 33 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28 50  e3ChangeCookie(P
a330: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e  arse *pParse, in
a340: 74 20 69 44 62 29 7b 0a 20 20 69 6e 74 20 72 31  t iDb){.  int r1
a350: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
a360: 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
a370: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
a380: 61 72 73 65 2d 3e 64 62 3b 0a 20 20 56 64 62 65  arse->db;.  Vdbe
a390: 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
a3a0: 64 62 65 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  dbe;.  sqlite3Vd
a3b0: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
a3c0: 6e 74 65 67 65 72 2c 20 64 62 2d 3e 61 44 62 5b  nteger, db->aDb[
a3d0: 69 44 62 5d 2e 70 53 63 68 65 6d 61 2d 3e 73 63  iDb].pSchema->sc
a3e0: 68 65 6d 61 5f 63 6f 6f 6b 69 65 2b 31 2c 20 72  hema_cookie+1, r
a3f0: 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  1);.  sqlite3Vdb
a400: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53 65  eAddOp3(v, OP_Se
a410: 74 43 6f 6f 6b 69 65 2c 20 69 44 62 2c 20 30 2c  tCookie, iDb, 0,
a420: 20 72 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 52   r1);.  sqlite3R
a430: 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
a440: 61 72 73 65 2c 20 72 31 29 3b 0a 7d 0a 0a 2f 2a  arse, r1);.}../*
a450: 0a 2a 2a 20 4d 65 61 73 75 72 65 20 74 68 65 20  .** Measure the 
a460: 6e 75 6d 62 65 72 20 6f 66 20 63 68 61 72 61 63  number of charac
a470: 74 65 72 73 20 6e 65 65 64 65 64 20 74 6f 20 6f  ters needed to o
a480: 75 74 70 75 74 20 74 68 65 20 67 69 76 65 6e 0a  utput the given.
a490: 2a 2a 20 69 64 65 6e 74 69 66 69 65 72 2e 20 20  ** identifier.  
a4a0: 54 68 65 20 6e 75 6d 62 65 72 20 72 65 74 75 72  The number retur
a4b0: 6e 65 64 20 69 6e 63 6c 75 64 65 73 20 61 6e 79  ned includes any
a4c0: 20 71 75 6f 74 65 73 20 75 73 65 64 0a 2a 2a 20   quotes used.** 
a4d0: 62 75 74 20 64 6f 65 73 20 6e 6f 74 20 69 6e 63  but does not inc
a4e0: 6c 75 64 65 20 74 68 65 20 6e 75 6c 6c 20 74 65  lude the null te
a4f0: 72 6d 69 6e 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20  rminator..**.** 
a500: 54 68 65 20 65 73 74 69 6d 61 74 65 20 69 73 20  The estimate is 
a510: 63 6f 6e 73 65 72 76 61 74 69 76 65 2e 20 20 49  conservative.  I
a520: 74 20 6d 69 67 68 74 20 62 65 20 6c 61 72 67 65  t might be large
a530: 72 20 74 68 61 74 20 77 68 61 74 20 69 73 0a 2a  r that what is.*
a540: 2a 20 72 65 61 6c 6c 79 20 6e 65 65 64 65 64 2e  * really needed.
a550: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69  .*/.static int i
a560: 64 65 6e 74 4c 65 6e 67 74 68 28 63 6f 6e 73 74  dentLength(const
a570: 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20 69 6e 74   char *z){.  int
a580: 20 6e 3b 0a 20 20 66 6f 72 28 6e 3d 30 3b 20 2a   n;.  for(n=0; *
a590: 7a 3b 20 6e 2b 2b 2c 20 7a 2b 2b 29 7b 0a 20 20  z; n++, z++){.  
a5a0: 20 20 69 66 28 20 2a 7a 3d 3d 27 22 27 20 29 7b    if( *z=='"' ){
a5b0: 20 6e 2b 2b 3b 20 7d 0a 20 20 7d 0a 20 20 72 65   n++; }.  }.  re
a5c0: 74 75 72 6e 20 6e 20 2b 20 32 3b 0a 7d 0a 0a 2f  turn n + 2;.}../
a5d0: 2a 0a 2a 2a 20 57 72 69 74 65 20 61 6e 20 69 64  *.** Write an id
a5e0: 65 6e 74 69 66 69 65 72 20 6f 6e 74 6f 20 74 68  entifier onto th
a5f0: 65 20 65 6e 64 20 6f 66 20 74 68 65 20 67 69 76  e end of the giv
a600: 65 6e 20 73 74 72 69 6e 67 2e 20 20 41 64 64 0a  en string.  Add.
a610: 2a 2a 20 71 75 6f 74 65 20 63 68 61 72 61 63 74  ** quote charact
a620: 65 72 73 20 61 73 20 6e 65 65 64 65 64 2e 0a 2a  ers as needed..*
a630: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 69 64  /.static void id
a640: 65 6e 74 50 75 74 28 63 68 61 72 20 2a 7a 2c 20  entPut(char *z, 
a650: 69 6e 74 20 2a 70 49 64 78 2c 20 63 68 61 72 20  int *pIdx, char 
a660: 2a 7a 53 69 67 6e 65 64 49 64 65 6e 74 29 7b 0a  *zSignedIdent){.
a670: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
a680: 2a 7a 49 64 65 6e 74 20 3d 20 28 75 6e 73 69 67  *zIdent = (unsig
a690: 6e 65 64 20 63 68 61 72 2a 29 7a 53 69 67 6e 65  ned char*)zSigne
a6a0: 64 49 64 65 6e 74 3b 0a 20 20 69 6e 74 20 69 2c  dIdent;.  int i,
a6b0: 20 6a 2c 20 6e 65 65 64 51 75 6f 74 65 3b 0a 20   j, needQuote;. 
a6c0: 20 69 20 3d 20 2a 70 49 64 78 3b 0a 20 20 66 6f   i = *pIdx;.  fo
a6d0: 72 28 6a 3d 30 3b 20 7a 49 64 65 6e 74 5b 6a 5d  r(j=0; zIdent[j]
a6e0: 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; j++){.    if( 
a6f0: 21 69 73 61 6c 6e 75 6d 28 7a 49 64 65 6e 74 5b  !isalnum(zIdent[
a700: 6a 5d 29 20 26 26 20 7a 49 64 65 6e 74 5b 6a 5d  j]) && zIdent[j]
a710: 21 3d 27 5f 27 20 29 20 62 72 65 61 6b 3b 0a 20  !='_' ) break;. 
a720: 20 7d 0a 20 20 6e 65 65 64 51 75 6f 74 65 20 3d   }.  needQuote =
a730: 20 20 7a 49 64 65 6e 74 5b 6a 5d 21 3d 30 20 7c    zIdent[j]!=0 |
a740: 7c 20 69 73 64 69 67 69 74 28 7a 49 64 65 6e 74  | isdigit(zIdent
a750: 5b 30 5d 29 0a 20 20 20 20 20 20 20 20 20 20 20  [0]).           
a760: 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65         || sqlite
a770: 33 4b 65 79 77 6f 72 64 43 6f 64 65 28 7a 49 64  3KeywordCode(zId
a780: 65 6e 74 2c 20 6a 29 21 3d 54 4b 5f 49 44 3b 0a  ent, j)!=TK_ID;.
a790: 20 20 69 66 28 20 6e 65 65 64 51 75 6f 74 65 20    if( needQuote 
a7a0: 29 20 7a 5b 69 2b 2b 5d 20 3d 20 27 22 27 3b 0a  ) z[i++] = '"';.
a7b0: 20 20 66 6f 72 28 6a 3d 30 3b 20 7a 49 64 65 6e    for(j=0; zIden
a7c0: 74 5b 6a 5d 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  t[j]; j++){.    
a7d0: 7a 5b 69 2b 2b 5d 20 3d 20 7a 49 64 65 6e 74 5b  z[i++] = zIdent[
a7e0: 6a 5d 3b 0a 20 20 20 20 69 66 28 20 7a 49 64 65  j];.    if( zIde
a7f0: 6e 74 5b 6a 5d 3d 3d 27 22 27 20 29 20 7a 5b 69  nt[j]=='"' ) z[i
a800: 2b 2b 5d 20 3d 20 27 22 27 3b 0a 20 20 7d 0a 20  ++] = '"';.  }. 
a810: 20 69 66 28 20 6e 65 65 64 51 75 6f 74 65 20 29   if( needQuote )
a820: 20 7a 5b 69 2b 2b 5d 20 3d 20 27 22 27 3b 0a 20   z[i++] = '"';. 
a830: 20 7a 5b 69 5d 20 3d 20 30 3b 0a 20 20 2a 70 49   z[i] = 0;.  *pI
a840: 64 78 20 3d 20 69 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  dx = i;.}../*.**
a850: 20 47 65 6e 65 72 61 74 65 20 61 20 43 52 45 41   Generate a CREA
a860: 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65  TE TABLE stateme
a870: 6e 74 20 61 70 70 72 6f 70 72 69 61 74 65 20 66  nt appropriate f
a880: 6f 72 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20  or the given.** 
a890: 74 61 62 6c 65 2e 20 20 4d 65 6d 6f 72 79 20 74  table.  Memory t
a8a0: 6f 20 68 6f 6c 64 20 74 68 65 20 74 65 78 74 20  o hold the text 
a8b0: 6f 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  of the statement
a8c0: 20 69 73 20 6f 62 74 61 69 6e 65 64 0a 2a 2a 20   is obtained.** 
a8d0: 66 72 6f 6d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f  from sqliteMallo
a8e0: 63 28 29 20 61 6e 64 20 6d 75 73 74 20 62 65 20  c() and must be 
a8f0: 66 72 65 65 64 20 62 79 20 74 68 65 20 63 61 6c  freed by the cal
a900: 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  ling function..*
a910: 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 63  /.static char *c
a920: 72 65 61 74 65 54 61 62 6c 65 53 74 6d 74 28 73  reateTableStmt(s
a930: 71 6c 69 74 65 33 20 2a 64 62 2c 20 54 61 62 6c  qlite3 *db, Tabl
a940: 65 20 2a 70 2c 20 69 6e 74 20 69 73 54 65 6d 70  e *p, int isTemp
a950: 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6b 2c 20 6e  ){.  int i, k, n
a960: 3b 0a 20 20 63 68 61 72 20 2a 7a 53 74 6d 74 3b  ;.  char *zStmt;
a970: 0a 20 20 63 68 61 72 20 2a 7a 53 65 70 2c 20 2a  .  char *zSep, *
a980: 7a 53 65 70 32 2c 20 2a 7a 45 6e 64 2c 20 2a 7a  zSep2, *zEnd, *z
a990: 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c  ;.  Column *pCol
a9a0: 3b 0a 20 20 6e 20 3d 20 30 3b 0a 20 20 66 6f 72  ;.  n = 0;.  for
a9b0: 28 70 43 6f 6c 20 3d 20 70 2d 3e 61 43 6f 6c 2c  (pCol = p->aCol,
a9c0: 20 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 3b   i=0; i<p->nCol;
a9d0: 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20   i++, pCol++){. 
a9e0: 20 20 20 6e 20 2b 3d 20 69 64 65 6e 74 4c 65 6e     n += identLen
a9f0: 67 74 68 28 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 29  gth(pCol->zName)
aa00: 3b 0a 20 20 20 20 7a 20 3d 20 70 43 6f 6c 2d 3e  ;.    z = pCol->
aa10: 7a 54 79 70 65 3b 0a 20 20 20 20 69 66 28 20 7a  zType;.    if( z
aa20: 20 29 7b 0a 20 20 20 20 20 20 6e 20 2b 3d 20 28   ){.      n += (
aa30: 73 74 72 6c 65 6e 28 7a 29 20 2b 20 31 29 3b 0a  strlen(z) + 1);.
aa40: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 6e 20 2b 3d      }.  }.  n +=
aa50: 20 69 64 65 6e 74 4c 65 6e 67 74 68 28 70 2d 3e   identLength(p->
aa60: 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 6e 3c  zName);.  if( n<
aa70: 35 30 20 29 7b 0a 20 20 20 20 7a 53 65 70 20 3d  50 ){.    zSep =
aa80: 20 22 22 3b 0a 20 20 20 20 7a 53 65 70 32 20 3d   "";.    zSep2 =
aa90: 20 22 2c 22 3b 0a 20 20 20 20 7a 45 6e 64 20 3d   ",";.    zEnd =
aaa0: 20 22 29 22 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   ")";.  }else{. 
aab0: 20 20 20 7a 53 65 70 20 3d 20 22 5c 6e 20 20 22     zSep = "\n  "
aac0: 3b 0a 20 20 20 20 7a 53 65 70 32 20 3d 20 22 2c  ;.    zSep2 = ",
aad0: 5c 6e 20 20 22 3b 0a 20 20 20 20 7a 45 6e 64 20  \n  ";.    zEnd 
aae0: 3d 20 22 5c 6e 29 22 3b 0a 20 20 7d 0a 20 20 6e  = "\n)";.  }.  n
aaf0: 20 2b 3d 20 33 35 20 2b 20 36 2a 70 2d 3e 6e 43   += 35 + 6*p->nC
ab00: 6f 6c 3b 0a 20 20 7a 53 74 6d 74 20 3d 20 73 71  ol;.  zStmt = sq
ab10: 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 20 6e 20 29  lite3Malloc( n )
ab20: 3b 0a 20 20 69 66 28 20 7a 53 74 6d 74 3d 3d 30  ;.  if( zStmt==0
ab30: 20 29 7b 0a 20 20 20 20 64 62 2d 3e 6d 61 6c 6c   ){.    db->mall
ab40: 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20  ocFailed = 1;.  
ab50: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
ab60: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
ab70: 74 66 28 6e 2c 20 7a 53 74 6d 74 2c 0a 20 20 20  tf(n, zStmt,.   
ab80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 21                 !
ab90: 4f 4d 49 54 5f 54 45 4d 50 44 42 26 26 69 73 54  OMIT_TEMPDB&&isT
aba0: 65 6d 70 20 3f 20 22 43 52 45 41 54 45 20 54 45  emp ? "CREATE TE
abb0: 4d 50 20 54 41 42 4c 45 20 22 3a 22 43 52 45 41  MP TABLE ":"CREA
abc0: 54 45 20 54 41 42 4c 45 20 22 29 3b 0a 20 20 6b  TE TABLE ");.  k
abd0: 20 3d 20 73 74 72 6c 65 6e 28 7a 53 74 6d 74 29   = strlen(zStmt)
abe0: 3b 0a 20 20 69 64 65 6e 74 50 75 74 28 7a 53 74  ;.  identPut(zSt
abf0: 6d 74 2c 20 26 6b 2c 20 70 2d 3e 7a 4e 61 6d 65  mt, &k, p->zName
ac00: 29 3b 0a 20 20 7a 53 74 6d 74 5b 6b 2b 2b 5d 20  );.  zStmt[k++] 
ac10: 3d 20 27 28 27 3b 0a 20 20 66 6f 72 28 70 43 6f  = '(';.  for(pCo
ac20: 6c 3d 70 2d 3e 61 43 6f 6c 2c 20 69 3d 30 3b 20  l=p->aCol, i=0; 
ac30: 69 3c 70 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c 20  i<p->nCol; i++, 
ac40: 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 73 71 6c  pCol++){.    sql
ac50: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 2d  ite3_snprintf(n-
ac60: 6b 2c 20 26 7a 53 74 6d 74 5b 6b 5d 2c 20 7a 53  k, &zStmt[k], zS
ac70: 65 70 29 3b 0a 20 20 20 20 6b 20 2b 3d 20 73 74  ep);.    k += st
ac80: 72 6c 65 6e 28 26 7a 53 74 6d 74 5b 6b 5d 29 3b  rlen(&zStmt[k]);
ac90: 0a 20 20 20 20 7a 53 65 70 20 3d 20 7a 53 65 70  .    zSep = zSep
aca0: 32 3b 0a 20 20 20 20 69 64 65 6e 74 50 75 74 28  2;.    identPut(
acb0: 7a 53 74 6d 74 2c 20 26 6b 2c 20 70 43 6f 6c 2d  zStmt, &k, pCol-
acc0: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28  >zName);.    if(
acd0: 20 28 7a 20 3d 20 70 43 6f 6c 2d 3e 7a 54 79 70   (z = pCol->zTyp
ace0: 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 7a  e)!=0 ){.      z
acf0: 53 74 6d 74 5b 6b 2b 2b 5d 20 3d 20 27 20 27 3b  Stmt[k++] = ' ';
ad00: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73  .      assert( s
ad10: 74 72 6c 65 6e 28 7a 29 2b 6b 2b 31 3c 3d 6e 20  trlen(z)+k+1<=n 
ad20: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
ad30: 5f 73 6e 70 72 69 6e 74 66 28 6e 2d 6b 2c 20 26  _snprintf(n-k, &
ad40: 7a 53 74 6d 74 5b 6b 5d 2c 20 22 25 73 22 2c 20  zStmt[k], "%s", 
ad50: 7a 29 3b 0a 20 20 20 20 20 20 6b 20 2b 3d 20 73  z);.      k += s
ad60: 74 72 6c 65 6e 28 7a 29 3b 0a 20 20 20 20 7d 0a  trlen(z);.    }.
ad70: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e    }.  sqlite3_sn
ad80: 70 72 69 6e 74 66 28 6e 2d 6b 2c 20 26 7a 53 74  printf(n-k, &zSt
ad90: 6d 74 5b 6b 5d 2c 20 22 25 73 22 2c 20 7a 45 6e  mt[k], "%s", zEn
ada0: 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a 53 74  d);.  return zSt
adb0: 6d 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  mt;.}../*.** Thi
adc0: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
add0: 6c 65 64 20 74 6f 20 72 65 70 6f 72 74 20 74 68  led to report th
ade0: 65 20 66 69 6e 61 6c 20 22 29 22 20 74 68 61 74  e final ")" that
adf0: 20 74 65 72 6d 69 6e 61 74 65 73 0a 2a 2a 20 61   terminates.** a
ae00: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74   CREATE TABLE st
ae10: 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54  atement..**.** T
ae20: 68 65 20 74 61 62 6c 65 20 73 74 72 75 63 74 75  he table structu
ae30: 72 65 20 74 68 61 74 20 6f 74 68 65 72 20 61 63  re that other ac
ae40: 74 69 6f 6e 20 72 6f 75 74 69 6e 65 73 20 68 61  tion routines ha
ae50: 76 65 20 62 65 65 6e 20 62 75 69 6c 64 69 6e 67  ve been building
ae60: 0a 2a 2a 20 69 73 20 61 64 64 65 64 20 74 6f 20  .** is added to 
ae70: 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 68 61 73  the internal has
ae80: 68 20 74 61 62 6c 65 73 2c 20 61 73 73 75 6d 69  h tables, assumi
ae90: 6e 67 20 6e 6f 20 65 72 72 6f 72 73 20 68 61 76  ng no errors hav
aea0: 65 0a 2a 2a 20 6f 63 63 75 72 72 65 64 2e 0a 2a  e.** occurred..*
aeb0: 2a 0a 2a 2a 20 41 6e 20 65 6e 74 72 79 20 66 6f  *.** An entry fo
aec0: 72 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 6d  r the table is m
aed0: 61 64 65 20 69 6e 20 74 68 65 20 6d 61 73 74 65  ade in the maste
aee0: 72 20 74 61 62 6c 65 20 6f 6e 20 64 69 73 6b 2c  r table on disk,
aef0: 20 75 6e 6c 65 73 73 0a 2a 2a 20 74 68 69 73 20   unless.** this 
af00: 69 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74  is a temporary t
af10: 61 62 6c 65 20 6f 72 20 64 62 2d 3e 69 6e 69 74  able or db->init
af20: 2e 62 75 73 79 3d 3d 31 2e 20 20 57 68 65 6e 20  .busy==1.  When 
af30: 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d 31  db->init.busy==1
af40: 0a 2a 2a 20 69 74 20 6d 65 61 6e 73 20 77 65 20  .** it means we 
af50: 61 72 65 20 72 65 61 64 69 6e 67 20 74 68 65 20  are reading the 
af60: 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61  sqlite_master ta
af70: 62 6c 65 20 62 65 63 61 75 73 65 20 77 65 20 6a  ble because we j
af80: 75 73 74 0a 2a 2a 20 63 6f 6e 6e 65 63 74 65 64  ust.** connected
af90: 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
afa0: 20 6f 72 20 62 65 63 61 75 73 65 20 74 68 65 20   or because the 
afb0: 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61  sqlite_master ta
afc0: 62 6c 65 20 68 61 73 0a 2a 2a 20 72 65 63 65 6e  ble has.** recen
afd0: 74 6c 79 20 63 68 61 6e 67 65 64 2c 20 73 6f 20  tly changed, so 
afe0: 74 68 65 20 65 6e 74 72 79 20 66 6f 72 20 74 68  the entry for th
aff0: 69 73 20 74 61 62 6c 65 20 61 6c 72 65 61 64 79  is table already
b000: 20 65 78 69 73 74 73 20 69 6e 0a 2a 2a 20 74 68   exists in.** th
b010: 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  e sqlite_master 
b020: 74 61 62 6c 65 2e 20 20 57 65 20 64 6f 20 6e 6f  table.  We do no
b030: 74 20 77 61 6e 74 20 74 6f 20 63 72 65 61 74 65  t want to create
b040: 20 69 74 20 61 67 61 69 6e 2e 0a 2a 2a 0a 2a 2a   it again..**.**
b050: 20 49 66 20 74 68 65 20 70 53 65 6c 65 63 74 20   If the pSelect 
b060: 61 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f 74 20  argument is not 
b070: 4e 55 4c 4c 2c 20 69 74 20 6d 65 61 6e 73 20 74  NULL, it means t
b080: 68 61 74 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hat this routine
b090: 0a 2a 2a 20 77 61 73 20 63 61 6c 6c 65 64 20 74  .** was called t
b0a0: 6f 20 63 72 65 61 74 65 20 61 20 74 61 62 6c 65  o create a table
b0b0: 20 67 65 6e 65 72 61 74 65 64 20 66 72 6f 6d 20   generated from 
b0c0: 61 20 0a 2a 2a 20 22 43 52 45 41 54 45 20 54 41  a .** "CREATE TA
b0d0: 42 4c 45 20 2e 2e 2e 20 41 53 20 53 45 4c 45 43  BLE ... AS SELEC
b0e0: 54 20 2e 2e 2e 22 20 73 74 61 74 65 6d 65 6e 74  T ..." statement
b0f0: 2e 20 20 54 68 65 20 63 6f 6c 75 6d 6e 20 6e 61  .  The column na
b100: 6d 65 73 20 6f 66 0a 2a 2a 20 74 68 65 20 6e 65  mes of.** the ne
b110: 77 20 74 61 62 6c 65 20 77 69 6c 6c 20 6d 61 74  w table will mat
b120: 63 68 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  ch the result se
b130: 74 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 2e  t of the SELECT.
b140: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
b150: 45 6e 64 54 61 62 6c 65 28 0a 20 20 50 61 72 73  EndTable(.  Pars
b160: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
b170: 20 20 20 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e      /* Parse con
b180: 74 65 78 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  text */.  Token 
b190: 2a 70 43 6f 6e 73 2c 20 20 20 20 20 20 20 20 20  *pCons,         
b1a0: 20 20 2f 2a 20 54 68 65 20 27 2c 27 20 74 6f 6b    /* The ',' tok
b1b0: 65 6e 20 61 66 74 65 72 20 74 68 65 20 6c 61 73  en after the las
b1c0: 74 20 63 6f 6c 75 6d 6e 20 64 65 66 6e 2e 20 2a  t column defn. *
b1d0: 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 45 6e 64 2c  /.  Token *pEnd,
b1e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
b1f0: 68 65 20 66 69 6e 61 6c 20 27 29 27 20 74 6f 6b  he final ')' tok
b200: 65 6e 20 69 6e 20 74 68 65 20 43 52 45 41 54 45  en in the CREATE
b210: 20 54 41 42 4c 45 20 2a 2f 0a 20 20 53 65 6c 65   TABLE */.  Sele
b220: 63 74 20 2a 70 53 65 6c 65 63 74 20 20 20 20 20  ct *pSelect     
b230: 20 20 20 20 2f 2a 20 53 65 6c 65 63 74 20 66 72      /* Select fr
b240: 6f 6d 20 61 20 22 43 52 45 41 54 45 20 2e 2e 2e  om a "CREATE ...
b250: 20 41 53 20 53 45 4c 45 43 54 22 20 2a 2f 0a 29   AS SELECT" */.)
b260: 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20  {.  Table *p;.  
b270: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
b280: 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20  arse->db;.  int 
b290: 69 44 62 3b 0a 0a 20 20 69 66 28 20 28 70 45 6e  iDb;..  if( (pEn
b2a0: 64 3d 3d 30 20 26 26 20 70 53 65 6c 65 63 74 3d  d==0 && pSelect=
b2b0: 3d 30 29 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e  =0) || pParse->n
b2c0: 45 72 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f  Err || db->mallo
b2d0: 63 46 61 69 6c 65 64 20 29 20 7b 0a 20 20 20 20  cFailed ) {.    
b2e0: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 70 20  return;.  }.  p 
b2f0: 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  = pParse->pNewTa
b300: 62 6c 65 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20  ble;.  if( p==0 
b310: 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 61 73 73  ) return;..  ass
b320: 65 72 74 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62  ert( !db->init.b
b330: 75 73 79 20 7c 7c 20 21 70 53 65 6c 65 63 74 20  usy || !pSelect 
b340: 29 3b 0a 0a 20 20 69 44 62 20 3d 20 73 71 6c 69  );..  iDb = sqli
b350: 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78  te3SchemaToIndex
b360: 28 64 62 2c 20 70 2d 3e 70 53 63 68 65 6d 61 29  (db, p->pSchema)
b370: 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ;..#ifndef SQLIT
b380: 45 5f 4f 4d 49 54 5f 43 48 45 43 4b 0a 20 20 2f  E_OMIT_CHECK.  /
b390: 2a 20 52 65 73 6f 6c 76 65 20 6e 61 6d 65 73 20  * Resolve names 
b3a0: 69 6e 20 61 6c 6c 20 43 48 45 43 4b 20 63 6f 6e  in all CHECK con
b3b0: 73 74 72 61 69 6e 74 20 65 78 70 72 65 73 73 69  straint expressi
b3c0: 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ons..  */.  if( 
b3d0: 70 2d 3e 70 43 68 65 63 6b 20 29 7b 0a 20 20 20  p->pCheck ){.   
b3e0: 20 53 72 63 4c 69 73 74 20 73 53 72 63 3b 20 20   SrcList sSrc;  
b3f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b400: 20 2f 2a 20 46 61 6b 65 20 53 72 63 4c 69 73 74   /* Fake SrcList
b410: 20 66 6f 72 20 70 50 61 72 73 65 2d 3e 70 4e 65   for pParse->pNe
b420: 77 54 61 62 6c 65 20 2a 2f 0a 20 20 20 20 4e 61  wTable */.    Na
b430: 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b 20 20  meContext sNC;  
b440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
b450: 20 4e 61 6d 65 20 63 6f 6e 74 65 78 74 20 66 6f   Name context fo
b460: 72 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  r pParse->pNewTa
b470: 62 6c 65 20 2a 2f 0a 0a 20 20 20 20 6d 65 6d 73  ble */..    mems
b480: 65 74 28 26 73 4e 43 2c 20 30 2c 20 73 69 7a 65  et(&sNC, 0, size
b490: 6f 66 28 73 4e 43 29 29 3b 0a 20 20 20 20 6d 65  of(sNC));.    me
b4a0: 6d 73 65 74 28 26 73 53 72 63 2c 20 30 2c 20 73  mset(&sSrc, 0, s
b4b0: 69 7a 65 6f 66 28 73 53 72 63 29 29 3b 0a 20 20  izeof(sSrc));.  
b4c0: 20 20 73 53 72 63 2e 6e 53 72 63 20 3d 20 31 3b    sSrc.nSrc = 1;
b4d0: 0a 20 20 20 20 73 53 72 63 2e 61 5b 30 5d 2e 7a  .    sSrc.a[0].z
b4e0: 4e 61 6d 65 20 3d 20 70 2d 3e 7a 4e 61 6d 65 3b  Name = p->zName;
b4f0: 0a 20 20 20 20 73 53 72 63 2e 61 5b 30 5d 2e 70  .    sSrc.a[0].p
b500: 54 61 62 20 3d 20 70 3b 0a 20 20 20 20 73 53 72  Tab = p;.    sSr
b510: 63 2e 61 5b 30 5d 2e 69 43 75 72 73 6f 72 20 3d  c.a[0].iCursor =
b520: 20 2d 31 3b 0a 20 20 20 20 73 4e 43 2e 70 50 61   -1;.    sNC.pPa
b530: 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20  rse = pParse;.  
b540: 20 20 73 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d    sNC.pSrcList =
b550: 20 26 73 53 72 63 3b 0a 20 20 20 20 73 4e 43 2e   &sSrc;.    sNC.
b560: 69 73 43 68 65 63 6b 20 3d 20 31 3b 0a 20 20 20  isCheck = 1;.   
b570: 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72   if( sqlite3Expr
b580: 52 65 73 6f 6c 76 65 4e 61 6d 65 73 28 26 73 4e  ResolveNames(&sN
b590: 43 2c 20 70 2d 3e 70 43 68 65 63 6b 29 20 29 7b  C, p->pCheck) ){
b5a0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  .      return;. 
b5b0: 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 20     }.  }.#endif 
b5c0: 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  /* !defined(SQLI
b5d0: 54 45 5f 4f 4d 49 54 5f 43 48 45 43 4b 29 20 2a  TE_OMIT_CHECK) *
b5e0: 2f 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 64  /..  /* If the d
b5f0: 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 69 73 20  b->init.busy is 
b600: 31 20 69 74 20 6d 65 61 6e 73 20 77 65 20 61 72  1 it means we ar
b610: 65 20 72 65 61 64 69 6e 67 20 74 68 65 20 53 51  e reading the SQ
b620: 4c 20 6f 66 66 20 74 68 65 0a 20 20 2a 2a 20 22  L off the.  ** "
b630: 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 22 20 6f  sqlite_master" o
b640: 72 20 22 73 71 6c 69 74 65 5f 74 65 6d 70 5f 6d  r "sqlite_temp_m
b650: 61 73 74 65 72 22 20 74 61 62 6c 65 20 6f 6e 20  aster" table on 
b660: 74 68 65 20 64 69 73 6b 2e 0a 20 20 2a 2a 20 53  the disk..  ** S
b670: 6f 20 64 6f 20 6e 6f 74 20 77 72 69 74 65 20 74  o do not write t
b680: 6f 20 74 68 65 20 64 69 73 6b 20 61 67 61 69 6e  o the disk again
b690: 2e 20 20 45 78 74 72 61 63 74 20 74 68 65 20 72  .  Extract the r
b6a0: 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62 65 72 0a  oot page number.
b6b0: 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 74 61 62    ** for the tab
b6c0: 6c 65 20 66 72 6f 6d 20 74 68 65 20 64 62 2d 3e  le from the db->
b6d0: 69 6e 69 74 2e 6e 65 77 54 6e 75 6d 20 66 69 65  init.newTnum fie
b6e0: 6c 64 2e 20 20 28 54 68 65 20 70 61 67 65 20 6e  ld.  (The page n
b6f0: 75 6d 62 65 72 0a 20 20 2a 2a 20 73 68 6f 75 6c  umber.  ** shoul
b700: 64 20 68 61 76 65 20 62 65 65 6e 20 70 75 74 20  d have been put 
b710: 74 68 65 72 65 20 62 79 20 74 68 65 20 73 71 6c  there by the sql
b720: 69 74 65 4f 70 65 6e 43 62 20 72 6f 75 74 69 6e  iteOpenCb routin
b730: 65 2e 29 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64  e.).  */.  if( d
b740: 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a  b->init.busy ){.
b750: 20 20 20 20 70 2d 3e 74 6e 75 6d 20 3d 20 64 62      p->tnum = db
b760: 2d 3e 69 6e 69 74 2e 6e 65 77 54 6e 75 6d 3b 0a  ->init.newTnum;.
b770: 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 6e 6f 74    }..  /* If not
b780: 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 2c 20 74   initializing, t
b790: 68 65 6e 20 63 72 65 61 74 65 20 61 20 72 65 63  hen create a rec
b7a0: 6f 72 64 20 66 6f 72 20 74 68 65 20 6e 65 77 20  ord for the new 
b7b0: 74 61 62 6c 65 0a 20 20 2a 2a 20 69 6e 20 74 68  table.  ** in th
b7c0: 65 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52 20  e SQLITE_MASTER 
b7d0: 74 61 62 6c 65 20 6f 66 20 74 68 65 20 64 61 74  table of the dat
b7e0: 61 62 61 73 65 2e 20 20 54 68 65 20 72 65 63 6f  abase.  The reco
b7f0: 72 64 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 66  rd number.  ** f
b800: 6f 72 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65  or the new table
b810: 20 65 6e 74 72 79 20 73 68 6f 75 6c 64 20 61 6c   entry should al
b820: 72 65 61 64 79 20 62 65 20 6f 6e 20 74 68 65 20  ready be on the 
b830: 73 74 61 63 6b 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  stack..  **.  **
b840: 20 49 66 20 74 68 69 73 20 69 73 20 61 20 54 45   If this is a TE
b850: 4d 50 4f 52 41 52 59 20 74 61 62 6c 65 2c 20 77  MPORARY table, w
b860: 72 69 74 65 20 74 68 65 20 65 6e 74 72 79 20 69  rite the entry i
b870: 6e 74 6f 20 74 68 65 20 61 75 78 69 6c 69 61 72  nto the auxiliar
b880: 79 0a 20 20 2a 2a 20 66 69 6c 65 20 69 6e 73 74  y.  ** file inst
b890: 65 61 64 20 6f 66 20 69 6e 74 6f 20 74 68 65 20  ead of into the 
b8a0: 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 66 69  main database fi
b8b0: 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21  le..  */.  if( !
b8c0: 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b  db->init.busy ){
b8d0: 0a 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20  .    int n;.    
b8e0: 56 64 62 65 20 2a 76 3b 0a 20 20 20 20 63 68 61  Vdbe *v;.    cha
b8f0: 72 20 2a 7a 54 79 70 65 3b 20 20 20 20 2f 2a 20  r *zType;    /* 
b900: 22 76 69 65 77 22 20 6f 72 20 22 74 61 62 6c 65  "view" or "table
b910: 22 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a  " */.    char *z
b920: 54 79 70 65 32 3b 20 20 20 2f 2a 20 22 56 49 45  Type2;   /* "VIE
b930: 57 22 20 6f 72 20 22 54 41 42 4c 45 22 20 2a 2f  W" or "TABLE" */
b940: 0a 20 20 20 20 63 68 61 72 20 2a 7a 53 74 6d 74  .    char *zStmt
b950: 3b 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20  ;    /* Text of 
b960: 74 68 65 20 43 52 45 41 54 45 20 54 41 42 4c 45  the CREATE TABLE
b970: 20 6f 72 20 43 52 45 41 54 45 20 56 49 45 57 20   or CREATE VIEW 
b980: 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 0a 20 20  statement */..  
b990: 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74    v = sqlite3Get
b9a0: 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
b9b0: 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72 65 74    if( v==0 ) ret
b9c0: 75 72 6e 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65  urn;..    sqlite
b9d0: 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
b9e0: 50 5f 43 6c 6f 73 65 2c 20 30 29 3b 0a 0a 20 20  P_Close, 0);..  
b9f0: 20 20 2f 2a 20 43 72 65 61 74 65 20 74 68 65 20    /* Create the 
ba00: 72 6f 6f 74 70 61 67 65 20 66 6f 72 20 74 68 65  rootpage for the
ba10: 20 6e 65 77 20 74 61 62 6c 65 20 61 6e 64 20 70   new table and p
ba20: 75 73 68 20 69 74 20 6f 6e 74 6f 20 74 68 65 20  ush it onto the 
ba30: 73 74 61 63 6b 2e 0a 20 20 20 20 2a 2a 20 41 20  stack..    ** A 
ba40: 76 69 65 77 20 68 61 73 20 6e 6f 20 72 6f 6f 74  view has no root
ba50: 70 61 67 65 2c 20 73 6f 20 6a 75 73 74 20 70 75  page, so just pu
ba60: 73 68 20 61 20 7a 65 72 6f 20 6f 6e 74 6f 20 74  sh a zero onto t
ba70: 68 65 20 73 74 61 63 6b 20 66 6f 72 0a 20 20 20  he stack for.   
ba80: 20 2a 2a 20 76 69 65 77 73 2e 20 20 49 6e 69 74   ** views.  Init
ba90: 69 61 6c 69 7a 65 20 7a 54 79 70 65 20 61 74 20  ialize zType at 
baa0: 74 68 65 20 73 61 6d 65 20 74 69 6d 65 2e 0a 20  the same time.. 
bab0: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d     */.    if( p-
bac0: 3e 70 53 65 6c 65 63 74 3d 3d 30 20 29 7b 0a 20  >pSelect==0 ){. 
bad0: 20 20 20 20 20 2f 2a 20 41 20 72 65 67 75 6c 61       /* A regula
bae0: 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20  r table */.     
baf0: 20 7a 54 79 70 65 20 3d 20 22 74 61 62 6c 65 22   zType = "table"
bb00: 3b 0a 20 20 20 20 20 20 7a 54 79 70 65 32 20 3d  ;.      zType2 =
bb10: 20 22 54 41 42 4c 45 22 3b 0a 23 69 66 6e 64 65   "TABLE";.#ifnde
bb20: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
bb30: 45 57 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  EW.    }else{.  
bb40: 20 20 20 20 2f 2a 20 41 20 76 69 65 77 20 2a 2f      /* A view */
bb50: 0a 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22  .      zType = "
bb60: 76 69 65 77 22 3b 0a 20 20 20 20 20 20 7a 54 79  view";.      zTy
bb70: 70 65 32 20 3d 20 22 56 49 45 57 22 3b 0a 23 65  pe2 = "VIEW";.#e
bb80: 6e 64 69 66 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ndif.    }..    
bb90: 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 20  /* If this is a 
bba0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 78 78 20  CREATE TABLE xx 
bbb0: 41 53 20 53 45 4c 45 43 54 20 2e 2e 2e 2c 20 65  AS SELECT ..., e
bbc0: 78 65 63 75 74 65 20 74 68 65 20 53 45 4c 45 43  xecute the SELEC
bbd0: 54 0a 20 20 20 20 2a 2a 20 73 74 61 74 65 6d 65  T.    ** stateme
bbe0: 6e 74 20 74 6f 20 70 6f 70 75 6c 61 74 65 20 74  nt to populate t
bbf0: 68 65 20 6e 65 77 20 74 61 62 6c 65 2e 20 54 68  he new table. Th
bc00: 65 20 72 6f 6f 74 2d 70 61 67 65 20 6e 75 6d 62  e root-page numb
bc10: 65 72 20 66 6f 72 20 74 68 65 0a 20 20 20 20 2a  er for the.    *
bc20: 2a 20 6e 65 77 20 74 61 62 6c 65 20 69 73 20 6f  * new table is o
bc30: 6e 20 74 68 65 20 74 6f 70 20 6f 66 20 74 68 65  n the top of the
bc40: 20 76 64 62 65 20 73 74 61 63 6b 2e 0a 20 20 20   vdbe stack..   
bc50: 20 2a 2a 0a 20 20 20 20 2a 2a 20 4f 6e 63 65 20   **.    ** Once 
bc60: 74 68 65 20 53 45 4c 45 43 54 20 68 61 73 20 62  the SELECT has b
bc70: 65 65 6e 20 63 6f 64 65 64 20 62 79 20 73 71 6c  een coded by sql
bc80: 69 74 65 33 53 65 6c 65 63 74 28 29 2c 20 69 74  ite3Select(), it
bc90: 20 69 73 20 69 6e 20 61 0a 20 20 20 20 2a 2a 20   is in a.    ** 
bca0: 73 75 69 74 61 62 6c 65 20 73 74 61 74 65 20 74  suitable state t
bcb0: 6f 20 71 75 65 72 79 20 66 6f 72 20 74 68 65 20  o query for the 
bcc0: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 61 6e 64  column names and
bcd0: 20 74 79 70 65 73 20 74 6f 20 62 65 20 75 73 65   types to be use
bce0: 64 0a 20 20 20 20 2a 2a 20 62 79 20 74 68 65 20  d.    ** by the 
bcf0: 6e 65 77 20 74 61 62 6c 65 2e 0a 20 20 20 20 2a  new table..    *
bd00: 2a 0a 20 20 20 20 2a 2a 20 41 20 73 68 61 72 65  *.    ** A share
bd10: 64 2d 63 61 63 68 65 20 77 72 69 74 65 2d 6c 6f  d-cache write-lo
bd20: 63 6b 20 69 73 20 6e 6f 74 20 72 65 71 75 69 72  ck is not requir
bd30: 65 64 20 74 6f 20 77 72 69 74 65 20 74 6f 20 74  ed to write to t
bd40: 68 65 20 6e 65 77 20 74 61 62 6c 65 2c 0a 20 20  he new table,.  
bd50: 20 20 2a 2a 20 61 73 20 61 20 73 63 68 65 6d 61    ** as a schema
bd60: 2d 6c 6f 63 6b 20 6d 75 73 74 20 68 61 76 65 20  -lock must have 
bd70: 61 6c 72 65 61 64 79 20 62 65 65 6e 20 6f 62 74  already been obt
bd80: 61 69 6e 65 64 20 74 6f 20 63 72 65 61 74 65 20  ained to create 
bd90: 69 74 2e 20 53 69 6e 63 65 0a 20 20 20 20 2a 2a  it. Since.    **
bda0: 20 61 20 73 63 68 65 6d 61 2d 6c 6f 63 6b 20 65   a schema-lock e
bdb0: 78 63 6c 75 64 65 73 20 61 6c 6c 20 6f 74 68 65  xcludes all othe
bdc0: 72 20 64 61 74 61 62 61 73 65 20 75 73 65 72 73  r database users
bdd0: 2c 20 74 68 65 20 77 72 69 74 65 2d 6c 6f 63 6b  , the write-lock
bde0: 20 77 6f 75 6c 64 0a 20 20 20 20 2a 2a 20 62 65   would.    ** be
bdf0: 20 72 65 64 75 6e 64 61 6e 74 2e 0a 20 20 20 20   redundant..    
be00: 2a 2f 0a 20 20 20 20 69 66 28 20 70 53 65 6c 65  */.    if( pSele
be10: 63 74 20 29 7b 0a 20 20 20 20 20 20 53 65 6c 65  ct ){.      Sele
be20: 63 74 44 65 73 74 20 64 65 73 74 3b 0a 20 20 20  ctDest dest;.   
be30: 20 20 20 54 61 62 6c 65 20 2a 70 53 65 6c 54 61     Table *pSelTa
be40: 62 3b 0a 0a 20 20 20 20 20 20 73 71 6c 69 74 65  b;..      sqlite
be50: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
be60: 50 5f 4f 70 65 6e 57 72 69 74 65 2c 20 31 2c 20  P_OpenWrite, 1, 
be70: 70 50 61 72 73 65 2d 3e 72 65 67 52 6f 6f 74 2c  pParse->regRoot,
be80: 20 69 44 62 29 3b 0a 20 20 20 20 20 20 73 71 6c   iDb);.      sql
be90: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
bea0: 28 76 2c 20 31 29 3b 0a 20 20 20 20 20 20 70 50  (v, 1);.      pP
beb0: 61 72 73 65 2d 3e 6e 54 61 62 20 3d 20 32 3b 0a  arse->nTab = 2;.
bec0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c        sqlite3Sel
bed0: 65 63 74 44 65 73 74 49 6e 69 74 28 26 64 65 73  ectDestInit(&des
bee0: 74 2c 20 53 52 54 5f 54 61 62 6c 65 2c 20 31 29  t, SRT_Table, 1)
bef0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53  ;.      sqlite3S
bf00: 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 53  elect(pParse, pS
bf10: 65 6c 65 63 74 2c 20 26 64 65 73 74 2c 20 30 2c  elect, &dest, 0,
bf20: 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71   0, 0);.      sq
bf30: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
bf40: 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 31 29 3b  v, OP_Close, 1);
bf50: 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 72 73  .      if( pPars
bf60: 65 2d 3e 6e 45 72 72 3d 3d 30 20 29 7b 0a 20 20  e->nErr==0 ){.  
bf70: 20 20 20 20 20 20 70 53 65 6c 54 61 62 20 3d 20        pSelTab = 
bf80: 73 71 6c 69 74 65 33 52 65 73 75 6c 74 53 65 74  sqlite3ResultSet
bf90: 4f 66 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  OfSelect(pParse,
bfa0: 20 30 2c 20 70 53 65 6c 65 63 74 29 3b 0a 20 20   0, pSelect);.  
bfb0: 20 20 20 20 20 20 69 66 28 20 70 53 65 6c 54 61        if( pSelTa
bfc0: 62 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  b==0 ) return;. 
bfd0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
bfe0: 2d 3e 61 43 6f 6c 3d 3d 30 20 29 3b 0a 20 20 20  ->aCol==0 );.   
bff0: 20 20 20 20 20 70 2d 3e 6e 43 6f 6c 20 3d 20 70       p->nCol = p
c000: 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c 3b 0a 20 20  SelTab->nCol;.  
c010: 20 20 20 20 20 20 70 2d 3e 61 43 6f 6c 20 3d 20        p->aCol = 
c020: 70 53 65 6c 54 61 62 2d 3e 61 43 6f 6c 3b 0a 20  pSelTab->aCol;. 
c030: 20 20 20 20 20 20 20 70 53 65 6c 54 61 62 2d 3e         pSelTab->
c040: 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20  nCol = 0;.      
c050: 20 20 70 53 65 6c 54 61 62 2d 3e 61 43 6f 6c 20    pSelTab->aCol 
c060: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  = 0;.        sql
c070: 69 74 65 33 44 65 6c 65 74 65 54 61 62 6c 65 28  ite3DeleteTable(
c080: 70 53 65 6c 54 61 62 29 3b 0a 20 20 20 20 20 20  pSelTab);.      
c090: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
c0a0: 43 6f 6d 70 75 74 65 20 74 68 65 20 63 6f 6d 70  Compute the comp
c0b0: 6c 65 74 65 20 74 65 78 74 20 6f 66 20 74 68 65  lete text of the
c0c0: 20 43 52 45 41 54 45 20 73 74 61 74 65 6d 65 6e   CREATE statemen
c0d0: 74 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 53 65  t */.    if( pSe
c0e0: 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 7a 53  lect ){.      zS
c0f0: 74 6d 74 20 3d 20 63 72 65 61 74 65 54 61 62 6c  tmt = createTabl
c100: 65 53 74 6d 74 28 64 62 2c 20 70 2c 20 70 2d 3e  eStmt(db, p, p->
c110: 70 53 63 68 65 6d 61 3d 3d 64 62 2d 3e 61 44 62  pSchema==db->aDb
c120: 5b 31 5d 2e 70 53 63 68 65 6d 61 29 3b 0a 20 20  [1].pSchema);.  
c130: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e    }else{.      n
c140: 20 3d 20 70 45 6e 64 2d 3e 7a 20 2d 20 70 50 61   = pEnd->z - pPa
c150: 72 73 65 2d 3e 73 4e 61 6d 65 54 6f 6b 65 6e 2e  rse->sNameToken.
c160: 7a 20 2b 20 31 3b 0a 20 20 20 20 20 20 7a 53 74  z + 1;.      zSt
c170: 6d 74 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69  mt = sqlite3MPri
c180: 6e 74 66 28 64 62 2c 20 0a 20 20 20 20 20 20 20  ntf(db, .       
c190: 20 20 20 22 43 52 45 41 54 45 20 25 73 20 25 2e     "CREATE %s %.
c1a0: 2a 73 22 2c 20 7a 54 79 70 65 32 2c 20 6e 2c 20  *s", zType2, n, 
c1b0: 70 50 61 72 73 65 2d 3e 73 4e 61 6d 65 54 6f 6b  pParse->sNameTok
c1c0: 65 6e 2e 7a 0a 20 20 20 20 20 20 29 3b 0a 20 20  en.z.      );.  
c1d0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 20 73 6c    }..    /* A sl
c1e0: 6f 74 20 66 6f 72 20 74 68 65 20 72 65 63 6f 72  ot for the recor
c1f0: 64 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  d has already be
c200: 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 69 6e 20  en allocated in 
c210: 74 68 65 20 0a 20 20 20 20 2a 2a 20 53 51 4c 49  the .    ** SQLI
c220: 54 45 5f 4d 41 53 54 45 52 20 74 61 62 6c 65 2e  TE_MASTER table.
c230: 20 20 57 65 20 6a 75 73 74 20 6e 65 65 64 20 74    We just need t
c240: 6f 20 75 70 64 61 74 65 20 74 68 61 74 20 73 6c  o update that sl
c250: 6f 74 20 77 69 74 68 20 61 6c 6c 0a 20 20 20 20  ot with all.    
c260: 2a 2a 20 74 68 65 20 69 6e 66 6f 72 6d 61 74 69  ** the informati
c270: 6f 6e 20 77 65 27 76 65 20 63 6f 6c 6c 65 63 74  on we've collect
c280: 65 64 2e 20 20 54 68 65 20 72 6f 77 69 64 20 66  ed.  The rowid f
c290: 6f 72 20 74 68 65 20 70 72 65 61 6c 6c 6f 63 61  or the prealloca
c2a0: 74 65 64 0a 20 20 20 20 2a 2a 20 73 6c 6f 74 20  ted.    ** slot 
c2b0: 69 73 20 74 68 65 20 32 6e 64 20 69 74 65 6d 20  is the 2nd item 
c2c0: 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e 20 20 54  on the stack.  T
c2d0: 68 65 20 74 6f 70 20 6f 66 20 74 68 65 20 73 74  he top of the st
c2e0: 61 63 6b 20 69 73 20 74 68 65 0a 20 20 20 20 2a  ack is the.    *
c2f0: 2a 20 72 6f 6f 74 20 70 61 67 65 20 66 6f 72 20  * root page for 
c300: 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20 28 6f  the new table (o
c310: 72 20 61 20 30 20 69 66 20 74 68 69 73 20 69 73  r a 0 if this is
c320: 20 61 20 76 69 65 77 29 2e 0a 20 20 20 20 2a 2f   a view)..    */
c330: 0a 20 20 20 20 73 71 6c 69 74 65 33 4e 65 73 74  .    sqlite3Nest
c340: 65 64 50 61 72 73 65 28 70 50 61 72 73 65 2c 0a  edParse(pParse,.
c350: 20 20 20 20 20 20 22 55 50 44 41 54 45 20 25 51        "UPDATE %Q
c360: 2e 25 73 20 22 0a 20 20 20 20 20 20 20 20 20 22  .%s ".         "
c370: 53 45 54 20 74 79 70 65 3d 27 25 73 27 2c 20 6e  SET type='%s', n
c380: 61 6d 65 3d 25 51 2c 20 74 62 6c 5f 6e 61 6d 65  ame=%Q, tbl_name
c390: 3d 25 51 2c 20 72 6f 6f 74 70 61 67 65 3d 23 25  =%Q, rootpage=#%
c3a0: 64 2c 20 73 71 6c 3d 25 51 20 22 0a 20 20 20 20  d, sql=%Q ".    
c3b0: 20 20 20 22 57 48 45 52 45 20 72 6f 77 69 64 3d     "WHERE rowid=
c3c0: 23 25 64 22 2c 0a 20 20 20 20 20 20 64 62 2d 3e  #%d",.      db->
c3d0: 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 2c 20  aDb[iDb].zName, 
c3e0: 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 44 62  SCHEMA_TABLE(iDb
c3f0: 29 2c 0a 20 20 20 20 20 20 7a 54 79 70 65 2c 0a  ),.      zType,.
c400: 20 20 20 20 20 20 70 2d 3e 7a 4e 61 6d 65 2c 0a        p->zName,.
c410: 20 20 20 20 20 20 70 2d 3e 7a 4e 61 6d 65 2c 0a        p->zName,.
c420: 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 72 65        pParse->re
c430: 67 52 6f 6f 74 2c 0a 20 20 20 20 20 20 7a 53 74  gRoot,.      zSt
c440: 6d 74 2c 0a 20 20 20 20 20 20 70 50 61 72 73 65  mt,.      pParse
c450: 2d 3e 72 65 67 52 6f 77 69 64 0a 20 20 20 20 29  ->regRowid.    )
c460: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  ;.    sqlite3DbF
c470: 72 65 65 28 64 62 2c 20 7a 53 74 6d 74 29 3b 0a  ree(db, zStmt);.
c480: 20 20 20 20 73 71 6c 69 74 65 33 43 68 61 6e 67      sqlite3Chang
c490: 65 43 6f 6f 6b 69 65 28 70 50 61 72 73 65 2c 20  eCookie(pParse, 
c4a0: 69 44 62 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53  iDb);..#ifndef S
c4b0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49  QLITE_OMIT_AUTOI
c4c0: 4e 43 52 45 4d 45 4e 54 0a 20 20 20 20 2f 2a 20  NCREMENT.    /* 
c4d0: 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  Check to see if 
c4e0: 77 65 20 6e 65 65 64 20 74 6f 20 63 72 65 61 74  we need to creat
c4f0: 65 20 61 6e 20 73 71 6c 69 74 65 5f 73 65 71 75  e an sqlite_sequ
c500: 65 6e 63 65 20 74 61 62 6c 65 20 66 6f 72 0a 20  ence table for. 
c510: 20 20 20 2a 2a 20 6b 65 65 70 69 6e 67 20 74 72     ** keeping tr
c520: 61 63 6b 20 6f 66 20 61 75 74 6f 69 6e 63 72 65  ack of autoincre
c530: 6d 65 6e 74 20 6b 65 79 73 2e 0a 20 20 20 20 2a  ment keys..    *
c540: 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 61 75 74  /.    if( p->aut
c550: 6f 49 6e 63 20 29 7b 0a 20 20 20 20 20 20 44 62  oInc ){.      Db
c560: 20 2a 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62   *pDb = &db->aDb
c570: 5b 69 44 62 5d 3b 0a 20 20 20 20 20 20 69 66 28  [iDb];.      if(
c580: 20 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 70   pDb->pSchema->p
c590: 53 65 71 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20  SeqTab==0 ){.   
c5a0: 20 20 20 20 20 73 71 6c 69 74 65 33 4e 65 73 74       sqlite3Nest
c5b0: 65 64 50 61 72 73 65 28 70 50 61 72 73 65 2c 0a  edParse(pParse,.
c5c0: 20 20 20 20 20 20 20 20 20 20 22 43 52 45 41 54            "CREAT
c5d0: 45 20 54 41 42 4c 45 20 25 51 2e 73 71 6c 69 74  E TABLE %Q.sqlit
c5e0: 65 5f 73 65 71 75 65 6e 63 65 28 6e 61 6d 65 2c  e_sequence(name,
c5f0: 73 65 71 29 22 2c 0a 20 20 20 20 20 20 20 20 20  seq)",.         
c600: 20 70 44 62 2d 3e 7a 4e 61 6d 65 0a 20 20 20 20   pDb->zName.    
c610: 20 20 20 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20      );.      }. 
c620: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20     }.#endif..   
c630: 20 2f 2a 20 52 65 70 61 72 73 65 20 65 76 65 72   /* Reparse ever
c640: 79 74 68 69 6e 67 20 74 6f 20 75 70 64 61 74 65  ything to update
c650: 20 6f 75 72 20 69 6e 74 65 72 6e 61 6c 20 64 61   our internal da
c660: 74 61 20 73 74 72 75 63 74 75 72 65 73 20 2a 2f  ta structures */
c670: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
c680: 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 50 61 72  AddOp4(v, OP_Par
c690: 73 65 53 63 68 65 6d 61 2c 20 69 44 62 2c 20 30  seSchema, iDb, 0
c6a0: 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 73 71 6c  , 0,.        sql
c6b0: 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20  ite3MPrintf(db, 
c6c0: 22 74 62 6c 5f 6e 61 6d 65 3d 27 25 71 27 22 2c  "tbl_name='%q'",
c6d0: 70 2d 3e 7a 4e 61 6d 65 29 2c 20 50 34 5f 44 59  p->zName), P4_DY
c6e0: 4e 41 4d 49 43 29 3b 0a 20 20 7d 0a 0a 0a 20 20  NAMIC);.  }...  
c6f0: 2f 2a 20 41 64 64 20 74 68 65 20 74 61 62 6c 65  /* Add the table
c700: 20 74 6f 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72   to the in-memor
c710: 79 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e  y representation
c720: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
c730: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d  ..  */.  if( db-
c740: 3e 69 6e 69 74 2e 62 75 73 79 20 26 26 20 70 50  >init.busy && pP
c750: 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 29 7b  arse->nErr==0 ){
c760: 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 4f 6c 64  .    Table *pOld
c770: 3b 0a 20 20 20 20 46 4b 65 79 20 2a 70 46 4b 65  ;.    FKey *pFKe
c780: 79 3b 20 0a 20 20 20 20 53 63 68 65 6d 61 20 2a  y; .    Schema *
c790: 70 53 63 68 65 6d 61 20 3d 20 70 2d 3e 70 53 63  pSchema = p->pSc
c7a0: 68 65 6d 61 3b 0a 20 20 20 20 70 4f 6c 64 20 3d  hema;.    pOld =
c7b0: 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65   sqlite3HashInse
c7c0: 72 74 28 26 70 53 63 68 65 6d 61 2d 3e 74 62 6c  rt(&pSchema->tbl
c7d0: 48 61 73 68 2c 20 70 2d 3e 7a 4e 61 6d 65 2c 20  Hash, p->zName, 
c7e0: 73 74 72 6c 65 6e 28 70 2d 3e 7a 4e 61 6d 65 29  strlen(p->zName)
c7f0: 2b 31 2c 70 29 3b 0a 20 20 20 20 69 66 28 20 70  +1,p);.    if( p
c800: 4f 6c 64 20 29 7b 0a 20 20 20 20 20 20 61 73 73  Old ){.      ass
c810: 65 72 74 28 20 70 3d 3d 70 4f 6c 64 20 29 3b 20  ert( p==pOld ); 
c820: 20 2f 2a 20 4d 61 6c 6c 6f 63 20 6d 75 73 74 20   /* Malloc must 
c830: 68 61 76 65 20 66 61 69 6c 65 64 20 69 6e 73 69  have failed insi
c840: 64 65 20 48 61 73 68 49 6e 73 65 72 74 28 29 20  de HashInsert() 
c850: 2a 2f 0a 20 20 20 20 20 20 64 62 2d 3e 6d 61 6c  */.      db->mal
c860: 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20  locFailed = 1;. 
c870: 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20       return;.   
c880: 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
c890: 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b  E_OMIT_FOREIGN_K
c8a0: 45 59 0a 20 20 20 20 66 6f 72 28 70 46 4b 65 79  EY.    for(pFKey
c8b0: 3d 70 2d 3e 70 46 4b 65 79 3b 20 70 46 4b 65 79  =p->pFKey; pFKey
c8c0: 3b 20 70 46 4b 65 79 3d 70 46 4b 65 79 2d 3e 70  ; pFKey=pFKey->p
c8d0: 4e 65 78 74 46 72 6f 6d 29 7b 0a 20 20 20 20 20  NextFrom){.     
c8e0: 20 76 6f 69 64 20 2a 64 61 74 61 3b 0a 20 20 20   void *data;.   
c8f0: 20 20 20 69 6e 74 20 6e 54 6f 20 3d 20 73 74 72     int nTo = str
c900: 6c 65 6e 28 70 46 4b 65 79 2d 3e 7a 54 6f 29 20  len(pFKey->zTo) 
c910: 2b 20 31 3b 0a 20 20 20 20 20 20 70 46 4b 65 79  + 1;.      pFKey
c920: 2d 3e 70 4e 65 78 74 54 6f 20 3d 20 73 71 6c 69  ->pNextTo = sqli
c930: 74 65 33 48 61 73 68 46 69 6e 64 28 26 70 53 63  te3HashFind(&pSc
c940: 68 65 6d 61 2d 3e 61 46 4b 65 79 2c 20 70 46 4b  hema->aFKey, pFK
c950: 65 79 2d 3e 7a 54 6f 2c 20 6e 54 6f 29 3b 0a 20  ey->zTo, nTo);. 
c960: 20 20 20 20 20 64 61 74 61 20 3d 20 73 71 6c 69       data = sqli
c970: 74 65 33 48 61 73 68 49 6e 73 65 72 74 28 26 70  te3HashInsert(&p
c980: 53 63 68 65 6d 61 2d 3e 61 46 4b 65 79 2c 20 70  Schema->aFKey, p
c990: 46 4b 65 79 2d 3e 7a 54 6f 2c 20 6e 54 6f 2c 20  FKey->zTo, nTo, 
c9a0: 70 46 4b 65 79 29 3b 0a 20 20 20 20 20 20 69 66  pFKey);.      if
c9b0: 28 20 64 61 74 61 3d 3d 28 76 6f 69 64 20 2a 29  ( data==(void *)
c9c0: 70 46 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 20  pFKey ){.       
c9d0: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
c9e0: 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  d = 1;.      }. 
c9f0: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
ca00: 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
ca10: 65 20 3d 20 30 3b 0a 20 20 20 20 64 62 2d 3e 6e  e = 0;.    db->n
ca20: 54 61 62 6c 65 2b 2b 3b 0a 20 20 20 20 64 62 2d  Table++;.    db-
ca30: 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45  >flags |= SQLITE
ca40: 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a  _InternChanges;.
ca50: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
ca60: 4f 4d 49 54 5f 41 4c 54 45 52 54 41 42 4c 45 0a  OMIT_ALTERTABLE.
ca70: 20 20 20 20 69 66 28 20 21 70 2d 3e 70 53 65 6c      if( !p->pSel
ca80: 65 63 74 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e  ect ){.      con
ca90: 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d  st char *zName =
caa0: 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 70   (const char *)p
cab0: 50 61 72 73 65 2d 3e 73 4e 61 6d 65 54 6f 6b 65  Parse->sNameToke
cac0: 6e 2e 7a 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e  n.z;.      int n
cad0: 4e 61 6d 65 3b 0a 20 20 20 20 20 20 61 73 73 65  Name;.      asse
cae0: 72 74 28 20 21 70 53 65 6c 65 63 74 20 26 26 20  rt( !pSelect && 
caf0: 70 43 6f 6e 73 20 26 26 20 70 45 6e 64 20 29 3b  pCons && pEnd );
cb00: 0a 20 20 20 20 20 20 69 66 28 20 70 43 6f 6e 73  .      if( pCons
cb10: 2d 3e 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ->z==0 ){.      
cb20: 20 20 70 43 6f 6e 73 20 3d 20 70 45 6e 64 3b 0a    pCons = pEnd;.
cb30: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6e 4e        }.      nN
cb40: 61 6d 65 20 3d 20 28 63 6f 6e 73 74 20 63 68 61  ame = (const cha
cb50: 72 20 2a 29 70 43 6f 6e 73 2d 3e 7a 20 2d 20 7a  r *)pCons->z - z
cb60: 4e 61 6d 65 3b 0a 20 20 20 20 20 20 70 2d 3e 61  Name;.      p->a
cb70: 64 64 43 6f 6c 4f 66 66 73 65 74 20 3d 20 31 33  ddColOffset = 13
cb80: 20 2b 20 73 71 6c 69 74 65 33 55 74 66 38 43 68   + sqlite3Utf8Ch
cb90: 61 72 4c 65 6e 28 7a 4e 61 6d 65 2c 20 6e 4e 61  arLen(zName, nNa
cba0: 6d 65 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  me);.    }.#endi
cbb0: 66 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66  f.  }.}..#ifndef
cbc0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45   SQLITE_OMIT_VIE
cbd0: 57 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 61 72 73  W./*.** The pars
cbe0: 65 72 20 63 61 6c 6c 73 20 74 68 69 73 20 72 6f  er calls this ro
cbf0: 75 74 69 6e 65 20 69 6e 20 6f 72 64 65 72 20 74  utine in order t
cc00: 6f 20 63 72 65 61 74 65 20 61 20 6e 65 77 20 56  o create a new V
cc10: 49 45 57 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  IEW.*/.void sqli
cc20: 74 65 33 43 72 65 61 74 65 56 69 65 77 28 0a 20  te3CreateView(. 
cc30: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
cc40: 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69      /* The parsi
cc50: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
cc60: 54 6f 6b 65 6e 20 2a 70 42 65 67 69 6e 2c 20 20  Token *pBegin,  
cc70: 20 20 20 2f 2a 20 54 68 65 20 43 52 45 41 54 45     /* The CREATE
cc80: 20 74 6f 6b 65 6e 20 74 68 61 74 20 62 65 67 69   token that begi
cc90: 6e 73 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  ns the statement
cca0: 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61   */.  Token *pNa
ccb0: 6d 65 31 2c 20 20 20 20 20 2f 2a 20 54 68 65 20  me1,     /* The 
ccc0: 74 6f 6b 65 6e 20 74 68 61 74 20 68 6f 6c 64 73  token that holds
ccd0: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
cce0: 20 76 69 65 77 20 2a 2f 0a 20 20 54 6f 6b 65 6e   view */.  Token
ccf0: 20 2a 70 4e 61 6d 65 32 2c 20 20 20 20 20 2f 2a   *pName2,     /*
cd00: 20 54 68 65 20 74 6f 6b 65 6e 20 74 68 61 74 20   The token that 
cd10: 68 6f 6c 64 73 20 74 68 65 20 6e 61 6d 65 20 6f  holds the name o
cd20: 66 20 74 68 65 20 76 69 65 77 20 2a 2f 0a 20 20  f the view */.  
cd30: 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 2c  Select *pSelect,
cd40: 20 20 20 2f 2a 20 41 20 53 45 4c 45 43 54 20 73     /* A SELECT s
cd50: 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20 77 69  tatement that wi
cd60: 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65 20 6e 65  ll become the ne
cd70: 77 20 76 69 65 77 20 2a 2f 0a 20 20 69 6e 74 20  w view */.  int 
cd80: 69 73 54 65 6d 70 2c 20 20 20 20 20 20 20 20 2f  isTemp,        /
cd90: 2a 20 54 52 55 45 20 66 6f 72 20 61 20 54 45 4d  * TRUE for a TEM
cda0: 50 4f 52 41 52 59 20 76 69 65 77 20 2a 2f 0a 20  PORARY view */. 
cdb0: 20 69 6e 74 20 6e 6f 45 72 72 20 20 20 20 20 20   int noErr      
cdc0: 20 20 20 20 2f 2a 20 53 75 70 70 72 65 73 73 20      /* Suppress 
cdd0: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73 20 69  error messages i
cde0: 66 20 56 49 45 57 20 61 6c 72 65 61 64 79 20 65  f VIEW already e
cdf0: 78 69 73 74 73 20 2a 2f 0a 29 7b 0a 20 20 54 61  xists */.){.  Ta
ce00: 62 6c 65 20 2a 70 3b 0a 20 20 69 6e 74 20 6e 3b  ble *p;.  int n;
ce10: 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  .  const unsigne
ce20: 64 20 63 68 61 72 20 2a 7a 3b 0a 20 20 54 6f 6b  d char *z;.  Tok
ce30: 65 6e 20 73 45 6e 64 3b 0a 20 20 44 62 46 69 78  en sEnd;.  DbFix
ce40: 65 72 20 73 46 69 78 3b 0a 20 20 54 6f 6b 65 6e  er sFix;.  Token
ce50: 20 2a 70 4e 61 6d 65 3b 0a 20 20 69 6e 74 20 69   *pName;.  int i
ce60: 44 62 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  Db;.  sqlite3 *d
ce70: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
ce80: 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e  .  if( pParse->n
ce90: 56 61 72 3e 30 20 29 7b 0a 20 20 20 20 73 71 6c  Var>0 ){.    sql
cea0: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
ceb0: 72 73 65 2c 20 22 70 61 72 61 6d 65 74 65 72 73  rse, "parameters
cec0: 20 61 72 65 20 6e 6f 74 20 61 6c 6c 6f 77 65 64   are not allowed
ced0: 20 69 6e 20 76 69 65 77 73 22 29 3b 0a 20 20 20   in views");.   
cee0: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
cef0: 6c 65 74 65 28 64 62 2c 20 70 53 65 6c 65 63 74  lete(db, pSelect
cf00: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  );.    return;. 
cf10: 20 7d 0a 20 20 73 71 6c 69 74 65 33 53 74 61 72   }.  sqlite3Star
cf20: 74 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70  tTable(pParse, p
cf30: 4e 61 6d 65 31 2c 20 70 4e 61 6d 65 32 2c 20 69  Name1, pName2, i
cf40: 73 54 65 6d 70 2c 20 31 2c 20 30 2c 20 6e 6f 45  sTemp, 1, 0, noE
cf50: 72 72 29 3b 0a 20 20 70 20 3d 20 70 50 61 72 73  rr);.  p = pPars
cf60: 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20  e->pNewTable;.  
cf70: 69 66 28 20 70 3d 3d 30 20 7c 7c 20 70 50 61 72  if( p==0 || pPar
cf80: 73 65 2d 3e 6e 45 72 72 20 29 7b 0a 20 20 20 20  se->nErr ){.    
cf90: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c  sqlite3SelectDel
cfa0: 65 74 65 28 64 62 2c 20 70 53 65 6c 65 63 74 29  ete(db, pSelect)
cfb0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
cfc0: 7d 0a 20 20 73 71 6c 69 74 65 33 54 77 6f 50 61  }.  sqlite3TwoPa
cfd0: 72 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 70  rtName(pParse, p
cfe0: 4e 61 6d 65 31 2c 20 70 4e 61 6d 65 32 2c 20 26  Name1, pName2, &
cff0: 70 4e 61 6d 65 29 3b 0a 20 20 69 44 62 20 3d 20  pName);.  iDb = 
d000: 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49  sqlite3SchemaToI
d010: 6e 64 65 78 28 64 62 2c 20 70 2d 3e 70 53 63 68  ndex(db, p->pSch
d020: 65 6d 61 29 3b 0a 20 20 69 66 28 20 73 71 6c 69  ema);.  if( sqli
d030: 74 65 33 46 69 78 49 6e 69 74 28 26 73 46 69 78  te3FixInit(&sFix
d040: 2c 20 70 50 61 72 73 65 2c 20 69 44 62 2c 20 22  , pParse, iDb, "
d050: 76 69 65 77 22 2c 20 70 4e 61 6d 65 29 0a 20 20  view", pName).  
d060: 20 20 26 26 20 73 71 6c 69 74 65 33 46 69 78 53    && sqlite3FixS
d070: 65 6c 65 63 74 28 26 73 46 69 78 2c 20 70 53 65  elect(&sFix, pSe
d080: 6c 65 63 74 29 0a 20 20 29 7b 0a 20 20 20 20 73  lect).  ){.    s
d090: 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65  qlite3SelectDele
d0a0: 74 65 28 64 62 2c 20 70 53 65 6c 65 63 74 29 3b  te(db, pSelect);
d0b0: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
d0c0: 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 61 20 63 6f  ..  /* Make a co
d0d0: 70 79 20 6f 66 20 74 68 65 20 65 6e 74 69 72 65  py of the entire
d0e0: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
d0f0: 74 20 74 68 61 74 20 64 65 66 69 6e 65 73 20 74  t that defines t
d100: 68 65 20 76 69 65 77 2e 0a 20 20 2a 2a 20 54 68  he view..  ** Th
d110: 69 73 20 77 69 6c 6c 20 66 6f 72 63 65 20 61 6c  is will force al
d120: 6c 20 74 68 65 20 45 78 70 72 2e 74 6f 6b 65 6e  l the Expr.token
d130: 2e 7a 20 76 61 6c 75 65 73 20 74 6f 20 62 65 20  .z values to be 
d140: 64 79 6e 61 6d 69 63 61 6c 6c 79 0a 20 20 2a 2a  dynamically.  **
d150: 20 61 6c 6c 6f 63 61 74 65 64 20 72 61 74 68 65   allocated rathe
d160: 72 20 74 68 61 6e 20 70 6f 69 6e 74 20 74 6f 20  r than point to 
d170: 74 68 65 20 69 6e 70 75 74 20 73 74 72 69 6e 67  the input string
d180: 20 2d 20 77 68 69 63 68 20 6d 65 61 6e 73 20 74   - which means t
d190: 68 61 74 0a 20 20 2a 2a 20 74 68 65 79 20 77 69  hat.  ** they wi
d1a0: 6c 6c 20 70 65 72 73 69 73 74 20 61 66 74 65 72  ll persist after
d1b0: 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 71 6c   the current sql
d1c0: 69 74 65 33 5f 65 78 65 63 28 29 20 63 61 6c 6c  ite3_exec() call
d1d0: 20 72 65 74 75 72 6e 73 2e 0a 20 20 2a 2f 0a 20   returns..  */. 
d1e0: 20 70 2d 3e 70 53 65 6c 65 63 74 20 3d 20 73 71   p->pSelect = sq
d1f0: 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 64  lite3SelectDup(d
d200: 62 2c 20 70 53 65 6c 65 63 74 29 3b 0a 20 20 73  b, pSelect);.  s
d210: 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65  qlite3SelectDele
d220: 74 65 28 64 62 2c 20 70 53 65 6c 65 63 74 29 3b  te(db, pSelect);
d230: 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f  .  if( db->mallo
d240: 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 72  cFailed ){.    r
d250: 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28  eturn;.  }.  if(
d260: 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20   !db->init.busy 
d270: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 69  ){.    sqlite3Vi
d280: 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73  ewGetColumnNames
d290: 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 7d  (pParse, p);.  }
d2a0: 0a 0a 20 20 2f 2a 20 4c 6f 63 61 74 65 20 74 68  ..  /* Locate th
d2b0: 65 20 65 6e 64 20 6f 66 20 74 68 65 20 43 52 45  e end of the CRE
d2c0: 41 54 45 20 56 49 45 57 20 73 74 61 74 65 6d 65  ATE VIEW stateme
d2d0: 6e 74 2e 20 20 4d 61 6b 65 20 73 45 6e 64 20 70  nt.  Make sEnd p
d2e0: 6f 69 6e 74 20 74 6f 0a 20 20 2a 2a 20 74 68 65  oint to.  ** the
d2f0: 20 65 6e 64 2e 0a 20 20 2a 2f 0a 20 20 73 45 6e   end..  */.  sEn
d300: 64 20 3d 20 70 50 61 72 73 65 2d 3e 73 4c 61 73  d = pParse->sLas
d310: 74 54 6f 6b 65 6e 3b 0a 20 20 69 66 28 20 73 45  tToken;.  if( sE
d320: 6e 64 2e 7a 5b 30 5d 21 3d 30 20 26 26 20 73 45  nd.z[0]!=0 && sE
d330: 6e 64 2e 7a 5b 30 5d 21 3d 27 3b 27 20 29 7b 0a  nd.z[0]!=';' ){.
d340: 20 20 20 20 73 45 6e 64 2e 7a 20 2b 3d 20 73 45      sEnd.z += sE
d350: 6e 64 2e 6e 3b 0a 20 20 7d 0a 20 20 73 45 6e 64  nd.n;.  }.  sEnd
d360: 2e 6e 20 3d 20 30 3b 0a 20 20 6e 20 3d 20 73 45  .n = 0;.  n = sE
d370: 6e 64 2e 7a 20 2d 20 70 42 65 67 69 6e 2d 3e 7a  nd.z - pBegin->z
d380: 3b 0a 20 20 7a 20 3d 20 28 63 6f 6e 73 74 20 75  ;.  z = (const u
d390: 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29 70 42  nsigned char*)pB
d3a0: 65 67 69 6e 2d 3e 7a 3b 0a 20 20 77 68 69 6c 65  egin->z;.  while
d3b0: 28 20 6e 3e 30 20 26 26 20 28 7a 5b 6e 2d 31 5d  ( n>0 && (z[n-1]
d3c0: 3d 3d 27 3b 27 20 7c 7c 20 69 73 73 70 61 63 65  ==';' || isspace
d3d0: 28 7a 5b 6e 2d 31 5d 29 29 20 29 7b 20 6e 2d 2d  (z[n-1])) ){ n--
d3e0: 3b 20 7d 0a 20 20 73 45 6e 64 2e 7a 20 3d 20 26  ; }.  sEnd.z = &
d3f0: 7a 5b 6e 2d 31 5d 3b 0a 20 20 73 45 6e 64 2e 6e  z[n-1];.  sEnd.n
d400: 20 3d 20 31 3b 0a 0a 20 20 2f 2a 20 55 73 65 20   = 1;..  /* Use 
d410: 73 71 6c 69 74 65 33 45 6e 64 54 61 62 6c 65 28  sqlite3EndTable(
d420: 29 20 74 6f 20 61 64 64 20 74 68 65 20 76 69 65  ) to add the vie
d430: 77 20 74 6f 20 74 68 65 20 53 51 4c 49 54 45 5f  w to the SQLITE_
d440: 4d 41 53 54 45 52 20 74 61 62 6c 65 20 2a 2f 0a  MASTER table */.
d450: 20 20 73 71 6c 69 74 65 33 45 6e 64 54 61 62 6c    sqlite3EndTabl
d460: 65 28 70 50 61 72 73 65 2c 20 30 2c 20 26 73 45  e(pParse, 0, &sE
d470: 6e 64 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e  nd, 0);.  return
d480: 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
d490: 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 20 2a  LITE_OMIT_VIEW *
d4a0: 2f 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  /..#if !defined(
d4b0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57  SQLITE_OMIT_VIEW
d4c0: 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51  ) || !defined(SQ
d4d0: 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
d4e0: 4c 54 41 42 4c 45 29 0a 2f 2a 0a 2a 2a 20 54 68  LTABLE)./*.** Th
d4f0: 65 20 54 61 62 6c 65 20 73 74 72 75 63 74 75 72  e Table structur
d500: 65 20 70 54 61 62 6c 65 20 69 73 20 72 65 61 6c  e pTable is real
d510: 6c 79 20 61 20 56 49 45 57 2e 20 20 46 69 6c 6c  ly a VIEW.  Fill
d520: 20 69 6e 20 74 68 65 20 6e 61 6d 65 73 20 6f 66   in the names of
d530: 0a 2a 2a 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20  .** the columns 
d540: 6f 66 20 74 68 65 20 76 69 65 77 20 69 6e 20 74  of the view in t
d550: 68 65 20 70 54 61 62 6c 65 20 73 74 72 75 63 74  he pTable struct
d560: 75 72 65 2e 20 20 52 65 74 75 72 6e 20 74 68 65  ure.  Return the
d570: 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66 20 65 72   number.** of er
d580: 72 6f 72 73 2e 20 20 49 66 20 61 6e 20 65 72 72  rors.  If an err
d590: 6f 72 20 69 73 20 73 65 65 6e 20 6c 65 61 76 65  or is seen leave
d5a0: 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67   an error messag
d5b0: 65 20 69 6e 20 70 50 61 72 73 65 2d 3e 7a 45 72  e in pParse->zEr
d5c0: 72 4d 73 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  rMsg..*/.int sql
d5d0: 69 74 65 33 56 69 65 77 47 65 74 43 6f 6c 75 6d  ite3ViewGetColum
d5e0: 6e 4e 61 6d 65 73 28 50 61 72 73 65 20 2a 70 50  nNames(Parse *pP
d5f0: 61 72 73 65 2c 20 54 61 62 6c 65 20 2a 70 54 61  arse, Table *pTa
d600: 62 6c 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70  ble){.  Table *p
d610: 53 65 6c 54 61 62 3b 20 20 20 2f 2a 20 41 20 66  SelTab;   /* A f
d620: 61 6b 65 20 74 61 62 6c 65 20 66 72 6f 6d 20 77  ake table from w
d630: 68 69 63 68 20 77 65 20 67 65 74 20 74 68 65 20  hich we get the 
d640: 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 20 20  result set */.  
d650: 53 65 6c 65 63 74 20 2a 70 53 65 6c 3b 20 20 20  Select *pSel;   
d660: 20 20 2f 2a 20 43 6f 70 79 20 6f 66 20 74 68 65    /* Copy of the
d670: 20 53 45 4c 45 43 54 20 74 68 61 74 20 69 6d 70   SELECT that imp
d680: 6c 65 6d 65 6e 74 73 20 74 68 65 20 76 69 65 77  lements the view
d690: 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 72 72 20 3d   */.  int nErr =
d6a0: 20 30 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65   0;     /* Numbe
d6b0: 72 20 6f 66 20 65 72 72 6f 72 73 20 65 6e 63 6f  r of errors enco
d6c0: 75 6e 74 65 72 65 64 20 2a 2f 0a 20 20 69 6e 74  untered */.  int
d6d0: 20 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f   n;            /
d6e0: 2a 20 54 65 6d 70 6f 72 61 72 69 6c 79 20 68 6f  * Temporarily ho
d6f0: 6c 64 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  lds the number o
d700: 66 20 63 75 72 73 6f 72 73 20 61 73 73 69 67 6e  f cursors assign
d710: 65 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  ed */.  sqlite3 
d720: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
d730: 3b 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63  ;  /* Database c
d740: 6f 6e 6e 65 63 74 69 6f 6e 20 66 6f 72 20 6d 61  onnection for ma
d750: 6c 6c 6f 63 20 65 72 72 6f 72 73 20 2a 2f 0a 20  lloc errors */. 
d760: 20 69 6e 74 20 28 2a 78 41 75 74 68 29 28 76 6f   int (*xAuth)(vo
d770: 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 63 68  id*,int,const ch
d780: 61 72 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a 2c  ar*,const char*,
d790: 63 6f 6e 73 74 20 63 68 61 72 2a 2c 63 6f 6e 73  const char*,cons
d7a0: 74 20 63 68 61 72 2a 29 3b 0a 0a 20 20 61 73 73  t char*);..  ass
d7b0: 65 72 74 28 20 70 54 61 62 6c 65 20 29 3b 0a 0a  ert( pTable );..
d7c0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
d7d0: 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
d7e0: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 56 74  .  if( sqlite3Vt
d7f0: 61 62 43 61 6c 6c 43 6f 6e 6e 65 63 74 28 70 50  abCallConnect(pP
d800: 61 72 73 65 2c 20 70 54 61 62 6c 65 29 20 29 7b  arse, pTable) ){
d810: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
d820: 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  TE_ERROR;.  }.  
d830: 69 66 28 20 49 73 56 69 72 74 75 61 6c 28 70 54  if( IsVirtual(pT
d840: 61 62 6c 65 29 20 29 20 72 65 74 75 72 6e 20 30  able) ) return 0
d850: 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65  ;.#endif..#ifnde
d860: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
d870: 45 57 0a 20 20 2f 2a 20 41 20 70 6f 73 69 74 69  EW.  /* A positi
d880: 76 65 20 6e 43 6f 6c 20 6d 65 61 6e 73 20 74 68  ve nCol means th
d890: 65 20 63 6f 6c 75 6d 6e 73 20 6e 61 6d 65 73 20  e columns names 
d8a0: 66 6f 72 20 74 68 69 73 20 76 69 65 77 20 61 72  for this view ar
d8b0: 65 0a 20 20 2a 2a 20 61 6c 72 65 61 64 79 20 6b  e.  ** already k
d8c0: 6e 6f 77 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  nown..  */.  if(
d8d0: 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3e 30 20   pTable->nCol>0 
d8e0: 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20 2f  ) return 0;..  /
d8f0: 2a 20 41 20 6e 65 67 61 74 69 76 65 20 6e 43 6f  * A negative nCo
d900: 6c 20 69 73 20 61 20 73 70 65 63 69 61 6c 20 6d  l is a special m
d910: 61 72 6b 65 72 20 6d 65 61 6e 69 6e 67 20 74 68  arker meaning th
d920: 61 74 20 77 65 20 61 72 65 20 63 75 72 72 65 6e  at we are curren
d930: 74 6c 79 0a 20 20 2a 2a 20 74 72 79 69 6e 67 20  tly.  ** trying 
d940: 74 6f 20 63 6f 6d 70 75 74 65 20 74 68 65 20 63  to compute the c
d950: 6f 6c 75 6d 6e 20 6e 61 6d 65 73 2e 20 20 49 66  olumn names.  If
d960: 20 77 65 20 65 6e 74 65 72 20 74 68 69 73 20 72   we enter this r
d970: 6f 75 74 69 6e 65 20 77 69 74 68 0a 20 20 2a 2a  outine with.  **
d980: 20 61 20 6e 65 67 61 74 69 76 65 20 6e 43 6f 6c   a negative nCol
d990: 2c 20 69 74 20 6d 65 61 6e 73 20 74 77 6f 20 6f  , it means two o
d9a0: 72 20 6d 6f 72 65 20 76 69 65 77 73 20 66 6f 72  r more views for
d9b0: 6d 20 61 20 6c 6f 6f 70 2c 20 6c 69 6b 65 20 74  m a loop, like t
d9c0: 68 69 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  his:.  **.  **  
d9d0: 20 20 20 43 52 45 41 54 45 20 56 49 45 57 20 6f     CREATE VIEW o
d9e0: 6e 65 20 41 53 20 53 45 4c 45 43 54 20 2a 20 46  ne AS SELECT * F
d9f0: 52 4f 4d 20 74 77 6f 3b 0a 20 20 2a 2a 20 20 20  ROM two;.  **   
da00: 20 20 43 52 45 41 54 45 20 56 49 45 57 20 74 77    CREATE VIEW tw
da10: 6f 20 41 53 20 53 45 4c 45 43 54 20 2a 20 46 52  o AS SELECT * FR
da20: 4f 4d 20 6f 6e 65 3b 0a 20 20 2a 2a 0a 20 20 2a  OM one;.  **.  *
da30: 2a 20 41 63 74 75 61 6c 6c 79 2c 20 74 68 69 73  * Actually, this
da40: 20 65 72 72 6f 72 20 69 73 20 63 61 75 67 68 74   error is caught
da50: 20 70 72 65 76 69 6f 75 73 6c 79 20 61 6e 64 20   previously and 
da60: 73 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  so the following
da70: 20 74 65 73 74 0a 20 20 2a 2a 20 73 68 6f 75 6c   test.  ** shoul
da80: 64 20 61 6c 77 61 79 73 20 66 61 69 6c 2e 20 20  d always fail.  
da90: 42 75 74 20 77 65 20 77 69 6c 6c 20 6c 65 61 76  But we will leav
daa0: 65 20 69 74 20 69 6e 20 70 6c 61 63 65 20 6a 75  e it in place ju
dab0: 73 74 20 74 6f 20 62 65 20 73 61 66 65 2e 0a 20  st to be safe.. 
dac0: 20 2a 2f 0a 20 20 69 66 28 20 70 54 61 62 6c 65   */.  if( pTable
dad0: 2d 3e 6e 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20  ->nCol<0 ){.    
dae0: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
daf0: 70 50 61 72 73 65 2c 20 22 76 69 65 77 20 25 73  pParse, "view %s
db00: 20 69 73 20 63 69 72 63 75 6c 61 72 6c 79 20 64   is circularly d
db10: 65 66 69 6e 65 64 22 2c 20 70 54 61 62 6c 65 2d  efined", pTable-
db20: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72 65 74  >zName);.    ret
db30: 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 61 73 73  urn 1;.  }.  ass
db40: 65 72 74 28 20 70 54 61 62 6c 65 2d 3e 6e 43 6f  ert( pTable->nCo
db50: 6c 3e 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 49 66  l>=0 );..  /* If
db60: 20 77 65 20 67 65 74 20 74 68 69 73 20 66 61 72   we get this far
db70: 2c 20 69 74 20 6d 65 61 6e 73 20 77 65 20 6e 65  , it means we ne
db80: 65 64 20 74 6f 20 63 6f 6d 70 75 74 65 20 74 68  ed to compute th
db90: 65 20 74 61 62 6c 65 20 6e 61 6d 65 73 2e 0a 20  e table names.. 
dba0: 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68   ** Note that th
dbb0: 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  e call to sqlite
dbc0: 33 52 65 73 75 6c 74 53 65 74 4f 66 53 65 6c 65  3ResultSetOfSele
dbd0: 63 74 28 29 20 77 69 6c 6c 20 65 78 70 61 6e 64  ct() will expand
dbe0: 20 61 6e 79 0a 20 20 2a 2a 20 22 2a 22 20 65 6c   any.  ** "*" el
dbf0: 65 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 72 65  ements in the re
dc00: 73 75 6c 74 73 20 73 65 74 20 6f 66 20 74 68 65  sults set of the
dc10: 20 76 69 65 77 20 61 6e 64 20 77 69 6c 6c 20 61   view and will a
dc20: 73 73 69 67 6e 20 63 75 72 73 6f 72 73 0a 20 20  ssign cursors.  
dc30: 2a 2a 20 74 6f 20 74 68 65 20 65 6c 65 6d 65 6e  ** to the elemen
dc40: 74 73 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63  ts of the FROM c
dc50: 6c 61 75 73 65 2e 20 20 42 75 74 20 77 65 20 64  lause.  But we d
dc60: 6f 20 6e 6f 74 20 77 61 6e 74 20 74 68 65 73 65  o not want these
dc70: 20 63 68 61 6e 67 65 73 0a 20 20 2a 2a 20 74 6f   changes.  ** to
dc80: 20 62 65 20 70 65 72 6d 61 6e 65 6e 74 2e 20 20   be permanent.  
dc90: 53 6f 20 74 68 65 20 63 6f 6d 70 75 74 61 74 69  So the computati
dca0: 6f 6e 20 69 73 20 64 6f 6e 65 20 6f 6e 20 61 20  on is done on a 
dcb0: 63 6f 70 79 20 6f 66 20 74 68 65 20 53 45 4c 45  copy of the SELE
dcc0: 43 54 0a 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e  CT.  ** statemen
dcd0: 74 20 74 68 61 74 20 64 65 66 69 6e 65 73 20 74  t that defines t
dce0: 68 65 20 76 69 65 77 2e 0a 20 20 2a 2f 0a 20 20  he view..  */.  
dcf0: 61 73 73 65 72 74 28 20 70 54 61 62 6c 65 2d 3e  assert( pTable->
dd00: 70 53 65 6c 65 63 74 20 29 3b 0a 20 20 70 53 65  pSelect );.  pSe
dd10: 6c 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63  l = sqlite3Selec
dd20: 74 44 75 70 28 64 62 2c 20 70 54 61 62 6c 65 2d  tDup(db, pTable-
dd30: 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20 69 66 28  >pSelect);.  if(
dd40: 20 70 53 65 6c 20 29 7b 0a 20 20 20 20 6e 20 3d   pSel ){.    n =
dd50: 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 3b 0a 20   pParse->nTab;. 
dd60: 20 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73     sqlite3SrcLis
dd70: 74 41 73 73 69 67 6e 43 75 72 73 6f 72 73 28 70  tAssignCursors(p
dd80: 50 61 72 73 65 2c 20 70 53 65 6c 2d 3e 70 53 72  Parse, pSel->pSr
dd90: 63 29 3b 0a 20 20 20 20 70 54 61 62 6c 65 2d 3e  c);.    pTable->
dda0: 6e 43 6f 6c 20 3d 20 2d 31 3b 0a 23 69 66 6e 64  nCol = -1;.#ifnd
ddb0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
ddc0: 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 20  UTHORIZATION.   
ddd0: 20 78 41 75 74 68 20 3d 20 64 62 2d 3e 78 41 75   xAuth = db->xAu
dde0: 74 68 3b 0a 20 20 20 20 64 62 2d 3e 78 41 75 74  th;.    db->xAut
ddf0: 68 20 3d 20 30 3b 0a 20 20 20 20 70 53 65 6c 54  h = 0;.    pSelT
de00: 61 62 20 3d 20 73 71 6c 69 74 65 33 52 65 73 75  ab = sqlite3Resu
de10: 6c 74 53 65 74 4f 66 53 65 6c 65 63 74 28 70 50  ltSetOfSelect(pP
de20: 61 72 73 65 2c 20 30 2c 20 70 53 65 6c 29 3b 0a  arse, 0, pSel);.
de30: 20 20 20 20 64 62 2d 3e 78 41 75 74 68 20 3d 20      db->xAuth = 
de40: 78 41 75 74 68 3b 0a 23 65 6c 73 65 0a 20 20 20  xAuth;.#else.   
de50: 20 70 53 65 6c 54 61 62 20 3d 20 73 71 6c 69 74   pSelTab = sqlit
de60: 65 33 52 65 73 75 6c 74 53 65 74 4f 66 53 65 6c  e3ResultSetOfSel
de70: 65 63 74 28 70 50 61 72 73 65 2c 20 30 2c 20 70  ect(pParse, 0, p
de80: 53 65 6c 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  Sel);.#endif.   
de90: 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 20 3d 20   pParse->nTab = 
dea0: 6e 3b 0a 20 20 20 20 69 66 28 20 70 53 65 6c 54  n;.    if( pSelT
deb0: 61 62 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  ab ){.      asse
dec0: 72 74 28 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c  rt( pTable->aCol
ded0: 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 54 61  ==0 );.      pTa
dee0: 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 70 53 65 6c  ble->nCol = pSel
def0: 54 61 62 2d 3e 6e 43 6f 6c 3b 0a 20 20 20 20 20  Tab->nCol;.     
df00: 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 20 3d 20   pTable->aCol = 
df10: 70 53 65 6c 54 61 62 2d 3e 61 43 6f 6c 3b 0a 20  pSelTab->aCol;. 
df20: 20 20 20 20 20 70 53 65 6c 54 61 62 2d 3e 6e 43       pSelTab->nC
df30: 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 53  ol = 0;.      pS
df40: 65 6c 54 61 62 2d 3e 61 43 6f 6c 20 3d 20 30 3b  elTab->aCol = 0;
df50: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65  .      sqlite3De
df60: 6c 65 74 65 54 61 62 6c 65 28 70 53 65 6c 54 61  leteTable(pSelTa
df70: 62 29 3b 0a 20 20 20 20 20 20 70 54 61 62 6c 65  b);.      pTable
df80: 2d 3e 70 53 63 68 65 6d 61 2d 3e 66 6c 61 67 73  ->pSchema->flags
df90: 20 7c 3d 20 44 42 5f 55 6e 72 65 73 65 74 56 69   |= DB_UnresetVi
dfa0: 65 77 73 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ews;.    }else{.
dfb0: 20 20 20 20 20 20 70 54 61 62 6c 65 2d 3e 6e 43        pTable->nC
dfc0: 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 6e 45  ol = 0;.      nE
dfd0: 72 72 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rr++;.    }.    
dfe0: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c  sqlite3SelectDel
dff0: 65 74 65 28 64 62 2c 20 70 53 65 6c 29 3b 0a 20  ete(db, pSel);. 
e000: 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 6e 45   } else {.    nE
e010: 72 72 2b 2b 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  rr++;.  }.#endif
e020: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
e030: 56 49 45 57 20 2a 2f 0a 20 20 72 65 74 75 72 6e  VIEW */.  return
e040: 20 6e 45 72 72 3b 20 20 0a 7d 0a 23 65 6e 64 69   nErr;  .}.#endi
e050: 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51  f /* !defined(SQ
e060: 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20  LITE_OMIT_VIEW) 
e070: 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  || !defined(SQLI
e080: 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
e090: 41 42 4c 45 29 20 2a 2f 0a 0a 23 69 66 6e 64 65  ABLE) */..#ifnde
e0a0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
e0b0: 45 57 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 74  EW./*.** Clear t
e0c0: 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20  he column names 
e0d0: 66 72 6f 6d 20 65 76 65 72 79 20 56 49 45 57 20  from every VIEW 
e0e0: 69 6e 20 64 61 74 61 62 61 73 65 20 69 64 78 2e  in database idx.
e0f0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
e100: 73 71 6c 69 74 65 56 69 65 77 52 65 73 65 74 41  sqliteViewResetA
e110: 6c 6c 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  ll(sqlite3 *db, 
e120: 69 6e 74 20 69 64 78 29 7b 0a 20 20 48 61 73 68  int idx){.  Hash
e130: 45 6c 65 6d 20 2a 69 3b 0a 20 20 69 66 28 20 21  Elem *i;.  if( !
e140: 44 62 48 61 73 50 72 6f 70 65 72 74 79 28 64 62  DbHasProperty(db
e150: 2c 20 69 64 78 2c 20 44 42 5f 55 6e 72 65 73 65  , idx, DB_Unrese
e160: 74 56 69 65 77 73 29 20 29 20 72 65 74 75 72 6e  tViews) ) return
e170: 3b 0a 20 20 66 6f 72 28 69 3d 73 71 6c 69 74 65  ;.  for(i=sqlite
e180: 48 61 73 68 46 69 72 73 74 28 26 64 62 2d 3e 61  HashFirst(&db->a
e190: 44 62 5b 69 64 78 5d 2e 70 53 63 68 65 6d 61 2d  Db[idx].pSchema-
e1a0: 3e 74 62 6c 48 61 73 68 29 3b 20 69 3b 69 3d 73  >tblHash); i;i=s
e1b0: 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28 69 29  qliteHashNext(i)
e1c0: 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54  ){.    Table *pT
e1d0: 61 62 20 3d 20 73 71 6c 69 74 65 48 61 73 68 44  ab = sqliteHashD
e1e0: 61 74 61 28 69 29 3b 0a 20 20 20 20 69 66 28 20  ata(i);.    if( 
e1f0: 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 29 7b  pTab->pSelect ){
e200: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 52 65 73  .      sqliteRes
e210: 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 54  etColumnNames(pT
e220: 61 62 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ab);.    }.  }. 
e230: 20 44 62 43 6c 65 61 72 50 72 6f 70 65 72 74 79   DbClearProperty
e240: 28 64 62 2c 20 69 64 78 2c 20 44 42 5f 55 6e 72  (db, idx, DB_Unr
e250: 65 73 65 74 56 69 65 77 73 29 3b 0a 7d 0a 23 65  esetViews);.}.#e
e260: 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 73 71 6c  lse.# define sql
e270: 69 74 65 56 69 65 77 52 65 73 65 74 41 6c 6c 28  iteViewResetAll(
e280: 41 2c 42 29 0a 23 65 6e 64 69 66 20 2f 2a 20 53  A,B).#endif /* S
e290: 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 20  QLITE_OMIT_VIEW 
e2a0: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  */../*.** This f
e2b0: 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
e2c0: 64 20 62 79 20 74 68 65 20 56 44 42 45 20 74 6f  d by the VDBE to
e2d0: 20 61 64 6a 75 73 74 20 74 68 65 20 69 6e 74 65   adjust the inte
e2e0: 72 6e 61 6c 20 73 63 68 65 6d 61 0a 2a 2a 20 75  rnal schema.** u
e2f0: 73 65 64 20 62 79 20 53 51 4c 69 74 65 20 77 68  sed by SQLite wh
e300: 65 6e 20 74 68 65 20 62 74 72 65 65 20 6c 61 79  en the btree lay
e310: 65 72 20 6d 6f 76 65 73 20 61 20 74 61 62 6c 65  er moves a table
e320: 20 72 6f 6f 74 20 70 61 67 65 2e 20 54 68 65 0a   root page. The.
e330: 2a 2a 20 72 6f 6f 74 2d 70 61 67 65 20 6f 66 20  ** root-page of 
e340: 61 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78  a table or index
e350: 20 69 6e 20 64 61 74 61 62 61 73 65 20 69 44 62   in database iDb
e360: 20 68 61 73 20 63 68 61 6e 67 65 64 20 66 72 6f   has changed fro
e370: 6d 20 69 46 72 6f 6d 0a 2a 2a 20 74 6f 20 69 54  m iFrom.** to iT
e380: 6f 2e 0a 2a 2a 0a 2a 2a 20 54 69 63 6b 65 74 20  o..**.** Ticket 
e390: 23 31 37 32 38 3a 20 20 54 68 65 20 73 79 6d 62  #1728:  The symb
e3a0: 6f 6c 20 74 61 62 6c 65 20 6d 69 67 68 74 20 73  ol table might s
e3b0: 74 69 6c 6c 20 63 6f 6e 74 61 69 6e 20 69 6e 66  till contain inf
e3c0: 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20 6f 6e 20 74  ormation.** on t
e3d0: 61 62 6c 65 73 20 61 6e 64 2f 6f 72 20 69 6e 64  ables and/or ind
e3e0: 69 63 65 73 20 74 68 61 74 20 61 72 65 20 74 68  ices that are th
e3f0: 65 20 70 72 6f 63 65 73 73 20 6f 66 20 62 65 69  e process of bei
e400: 6e 67 20 64 65 6c 65 74 65 64 2e 0a 2a 2a 20 49  ng deleted..** I
e410: 66 20 79 6f 75 20 61 72 65 20 75 6e 6c 75 63 6b  f you are unluck
e420: 79 2c 20 6f 6e 65 20 6f 66 20 74 68 6f 73 65 20  y, one of those 
e430: 64 65 6c 65 74 65 64 20 69 6e 64 69 63 65 73 20  deleted indices 
e440: 6f 72 20 74 61 62 6c 65 73 20 6d 69 67 68 74 0a  or tables might.
e450: 2a 2a 20 68 61 76 65 20 74 68 65 20 73 61 6d 65  ** have the same
e460: 20 72 6f 6f 74 70 61 67 65 20 6e 75 6d 62 65 72   rootpage number
e470: 20 61 73 20 74 68 65 20 72 65 61 6c 20 74 61 62   as the real tab
e480: 6c 65 20 6f 72 20 69 6e 64 65 78 20 74 68 61 74  le or index that
e490: 20 69 73 0a 2a 2a 20 62 65 69 6e 67 20 6d 6f 76   is.** being mov
e4a0: 65 64 2e 20 20 53 6f 20 77 65 20 63 61 6e 6e 6f  ed.  So we canno
e4b0: 74 20 73 74 6f 70 20 73 65 61 72 63 68 69 6e 67  t stop searching
e4c0: 20 61 66 74 65 72 20 74 68 65 20 66 69 72 73 74   after the first
e4d0: 20 6d 61 74 63 68 20 0a 2a 2a 20 62 65 63 61 75   match .** becau
e4e0: 73 65 20 74 68 65 20 66 69 72 73 74 20 6d 61 74  se the first mat
e4f0: 63 68 20 6d 69 67 68 74 20 62 65 20 66 6f 72 20  ch might be for 
e500: 6f 6e 65 20 6f 66 20 74 68 65 20 64 65 6c 65 74  one of the delet
e510: 65 64 20 69 6e 64 69 63 65 73 0a 2a 2a 20 6f 72  ed indices.** or
e520: 20 74 61 62 6c 65 73 20 61 6e 64 20 6e 6f 74 20   tables and not 
e530: 74 68 65 20 74 61 62 6c 65 2f 69 6e 64 65 78 20  the table/index 
e540: 74 68 61 74 20 69 73 20 61 63 74 75 61 6c 6c 79  that is actually
e550: 20 62 65 69 6e 67 20 6d 6f 76 65 64 2e 0a 2a 2a   being moved..**
e560: 20 57 65 20 6d 75 73 74 20 63 6f 6e 74 69 6e 75   We must continu
e570: 65 20 6c 6f 6f 70 69 6e 67 20 75 6e 74 69 6c 20  e looping until 
e580: 61 6c 6c 20 74 61 62 6c 65 73 20 61 6e 64 20 69  all tables and i
e590: 6e 64 69 63 65 73 20 77 69 74 68 0a 2a 2a 20 72  ndices with.** r
e5a0: 6f 6f 74 70 61 67 65 3d 3d 69 46 72 6f 6d 20 68  ootpage==iFrom h
e5b0: 61 76 65 20 62 65 65 6e 20 63 6f 6e 76 65 72 74  ave been convert
e5c0: 65 64 20 74 6f 20 68 61 76 65 20 61 20 72 6f 6f  ed to have a roo
e5d0: 74 70 61 67 65 20 6f 66 20 69 54 6f 0a 2a 2a 20  tpage of iTo.** 
e5e0: 69 6e 20 6f 72 64 65 72 20 74 6f 20 62 65 20 63  in order to be c
e5f0: 65 72 74 61 69 6e 20 74 68 61 74 20 77 65 20 67  ertain that we g
e600: 6f 74 20 74 68 65 20 72 69 67 68 74 20 6f 6e 65  ot the right one
e610: 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
e620: 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
e630: 55 55 4d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  UUM.void sqlite3
e640: 52 6f 6f 74 50 61 67 65 4d 6f 76 65 64 28 44 62  RootPageMoved(Db
e650: 20 2a 70 44 62 2c 20 69 6e 74 20 69 46 72 6f 6d   *pDb, int iFrom
e660: 2c 20 69 6e 74 20 69 54 6f 29 7b 0a 20 20 48 61  , int iTo){.  Ha
e670: 73 68 45 6c 65 6d 20 2a 70 45 6c 65 6d 3b 0a 20  shElem *pElem;. 
e680: 20 48 61 73 68 20 2a 70 48 61 73 68 3b 0a 0a 20   Hash *pHash;.. 
e690: 20 70 48 61 73 68 20 3d 20 26 70 44 62 2d 3e 70   pHash = &pDb->p
e6a0: 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68 3b  Schema->tblHash;
e6b0: 0a 20 20 66 6f 72 28 70 45 6c 65 6d 3d 73 71 6c  .  for(pElem=sql
e6c0: 69 74 65 48 61 73 68 46 69 72 73 74 28 70 48 61  iteHashFirst(pHa
e6d0: 73 68 29 3b 20 70 45 6c 65 6d 3b 20 70 45 6c 65  sh); pElem; pEle
e6e0: 6d 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74  m=sqliteHashNext
e6f0: 28 70 45 6c 65 6d 29 29 7b 0a 20 20 20 20 54 61  (pElem)){.    Ta
e700: 62 6c 65 20 2a 70 54 61 62 20 3d 20 73 71 6c 69  ble *pTab = sqli
e710: 74 65 48 61 73 68 44 61 74 61 28 70 45 6c 65 6d  teHashData(pElem
e720: 29 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62 2d  );.    if( pTab-
e730: 3e 74 6e 75 6d 3d 3d 69 46 72 6f 6d 20 29 7b 0a  >tnum==iFrom ){.
e740: 20 20 20 20 20 20 70 54 61 62 2d 3e 74 6e 75 6d        pTab->tnum
e750: 20 3d 20 69 54 6f 3b 0a 20 20 20 20 7d 0a 20 20   = iTo;.    }.  
e760: 7d 0a 20 20 70 48 61 73 68 20 3d 20 26 70 44 62  }.  pHash = &pDb
e770: 2d 3e 70 53 63 68 65 6d 61 2d 3e 69 64 78 48 61  ->pSchema->idxHa
e780: 73 68 3b 0a 20 20 66 6f 72 28 70 45 6c 65 6d 3d  sh;.  for(pElem=
e790: 73 71 6c 69 74 65 48 61 73 68 46 69 72 73 74 28  sqliteHashFirst(
e7a0: 70 48 61 73 68 29 3b 20 70 45 6c 65 6d 3b 20 70  pHash); pElem; p
e7b0: 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73 68 4e  Elem=sqliteHashN
e7c0: 65 78 74 28 70 45 6c 65 6d 29 29 7b 0a 20 20 20  ext(pElem)){.   
e7d0: 20 49 6e 64 65 78 20 2a 70 49 64 78 20 3d 20 73   Index *pIdx = s
e7e0: 71 6c 69 74 65 48 61 73 68 44 61 74 61 28 70 45  qliteHashData(pE
e7f0: 6c 65 6d 29 3b 0a 20 20 20 20 69 66 28 20 70 49  lem);.    if( pI
e800: 64 78 2d 3e 74 6e 75 6d 3d 3d 69 46 72 6f 6d 20  dx->tnum==iFrom 
e810: 29 7b 0a 20 20 20 20 20 20 70 49 64 78 2d 3e 74  ){.      pIdx->t
e820: 6e 75 6d 20 3d 20 69 54 6f 3b 0a 20 20 20 20 7d  num = iTo;.    }
e830: 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  .  }.}.#endif../
e840: 2a 0a 2a 2a 20 57 72 69 74 65 20 63 6f 64 65 20  *.** Write code 
e850: 74 6f 20 65 72 61 73 65 20 74 68 65 20 74 61 62  to erase the tab
e860: 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67  le with root-pag
e870: 65 20 69 54 61 62 6c 65 20 66 72 6f 6d 20 64 61  e iTable from da
e880: 74 61 62 61 73 65 20 69 44 62 2e 0a 2a 2a 20 41  tabase iDb..** A
e890: 6c 73 6f 20 77 72 69 74 65 20 63 6f 64 65 20 74  lso write code t
e8a0: 6f 20 6d 6f 64 69 66 79 20 74 68 65 20 73 71 6c  o modify the sql
e8b0: 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65  ite_master table
e8c0: 20 61 6e 64 20 69 6e 74 65 72 6e 61 6c 20 73 63   and internal sc
e8d0: 68 65 6d 61 0a 2a 2a 20 69 66 20 61 20 72 6f 6f  hema.** if a roo
e8e0: 74 2d 70 61 67 65 20 6f 66 20 61 6e 6f 74 68 65  t-page of anothe
e8f0: 72 20 74 61 62 6c 65 20 69 73 20 6d 6f 76 65 64  r table is moved
e900: 20 62 79 20 74 68 65 20 62 74 72 65 65 2d 6c 61   by the btree-la
e910: 79 65 72 20 77 68 69 6c 73 74 0a 2a 2a 20 65 72  yer whilst.** er
e920: 61 73 69 6e 67 20 69 54 61 62 6c 65 20 28 74 68  asing iTable (th
e930: 69 73 20 63 61 6e 20 68 61 70 70 65 6e 20 77 69  is can happen wi
e940: 74 68 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75  th an auto-vacuu
e950: 6d 20 64 61 74 61 62 61 73 65 29 2e 0a 2a 2f 20  m database)..*/ 
e960: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64 65 73  .static void des
e970: 74 72 6f 79 52 6f 6f 74 50 61 67 65 28 50 61 72  troyRootPage(Par
e980: 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20  se *pParse, int 
e990: 69 54 61 62 6c 65 2c 20 69 6e 74 20 69 44 62 29  iTable, int iDb)
e9a0: 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71  {.  Vdbe *v = sq
e9b0: 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
e9c0: 72 73 65 29 3b 0a 20 20 69 6e 74 20 72 31 20 3d  rse);.  int r1 =
e9d0: 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
e9e0: 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 73 71  eg(pParse);.  sq
e9f0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
ea00: 76 2c 20 4f 50 5f 44 65 73 74 72 6f 79 2c 20 69  v, OP_Destroy, i
ea10: 54 61 62 6c 65 2c 20 72 31 2c 20 69 44 62 29 3b  Table, r1, iDb);
ea20: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
ea30: 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
ea40: 20 20 2f 2a 20 4f 50 5f 44 65 73 74 72 6f 79 20    /* OP_Destroy 
ea50: 73 74 6f 72 65 73 20 61 6e 20 69 6e 20 69 6e 74  stores an in int
ea60: 65 67 65 72 20 72 31 2e 20 49 66 20 74 68 69 73  eger r1. If this
ea70: 20 69 6e 74 65 67 65 72 0a 20 20 2a 2a 20 69 73   integer.  ** is
ea80: 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20   non-zero, then 
ea90: 69 74 20 69 73 20 74 68 65 20 72 6f 6f 74 20 70  it is the root p
eaa0: 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 20  age number of a 
eab0: 74 61 62 6c 65 20 6d 6f 76 65 64 20 74 6f 0a 20  table moved to. 
eac0: 20 2a 2a 20 6c 6f 63 61 74 69 6f 6e 20 69 54 61   ** location iTa
ead0: 62 6c 65 2e 20 54 68 65 20 66 6f 6c 6c 6f 77 69  ble. The followi
eae0: 6e 67 20 63 6f 64 65 20 6d 6f 64 69 66 69 65 73  ng code modifies
eaf0: 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74   the sqlite_mast
eb00: 65 72 20 74 61 62 6c 65 20 74 6f 0a 20 20 2a 2a  er table to.  **
eb10: 20 72 65 66 6c 65 63 74 20 74 68 69 73 2e 0a 20   reflect this.. 
eb20: 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 22 23 25   **.  ** The "#%
eb30: 64 22 20 69 6e 20 74 68 65 20 53 51 4c 20 69 73  d" in the SQL is
eb40: 20 61 20 73 70 65 63 69 61 6c 20 63 6f 6e 73 74   a special const
eb50: 61 6e 74 20 74 68 61 74 20 6d 65 61 6e 73 20 77  ant that means w
eb60: 68 61 74 65 76 65 72 20 76 61 6c 75 65 0a 20 20  hatever value.  
eb70: 2a 2a 20 69 73 20 6f 6e 20 74 68 65 20 74 6f 70  ** is on the top
eb80: 20 6f 66 20 74 68 65 20 73 74 61 63 6b 2e 20 20   of the stack.  
eb90: 53 65 65 20 73 71 6c 69 74 65 33 52 65 67 69 73  See sqlite3Regis
eba0: 74 65 72 45 78 70 72 28 29 2e 0a 20 20 2a 2f 0a  terExpr()..  */.
ebb0: 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50    sqlite3NestedP
ebc0: 61 72 73 65 28 70 50 61 72 73 65 2c 20 0a 20 20  arse(pParse, .  
ebd0: 20 20 20 22 55 50 44 41 54 45 20 25 51 2e 25 73     "UPDATE %Q.%s
ebe0: 20 53 45 54 20 72 6f 6f 74 70 61 67 65 3d 25 64   SET rootpage=%d
ebf0: 20 57 48 45 52 45 20 23 25 64 20 41 4e 44 20 72   WHERE #%d AND r
ec00: 6f 6f 74 70 61 67 65 3d 23 25 64 22 2c 0a 20 20  ootpage=#%d",.  
ec10: 20 20 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61     pParse->db->a
ec20: 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 2c 20 53  Db[iDb].zName, S
ec30: 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 44 62 29  CHEMA_TABLE(iDb)
ec40: 2c 20 69 54 61 62 6c 65 2c 20 72 31 2c 20 72 31  , iTable, r1, r1
ec50: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69  );.#endif.  sqli
ec60: 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
ec70: 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 7d  g(pParse, r1);.}
ec80: 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 56 44  ../*.** Write VD
ec90: 42 45 20 63 6f 64 65 20 74 6f 20 65 72 61 73 65  BE code to erase
eca0: 20 74 61 62 6c 65 20 70 54 61 62 20 61 6e 64 20   table pTab and 
ecb0: 61 6c 6c 20 61 73 73 6f 63 69 61 74 65 64 20 69  all associated i
ecc0: 6e 64 69 63 65 73 20 6f 6e 20 64 69 73 6b 2e 0a  ndices on disk..
ecd0: 2a 2a 20 43 6f 64 65 20 74 6f 20 75 70 64 61 74  ** Code to updat
ece0: 65 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73  e the sqlite_mas
ecf0: 74 65 72 20 74 61 62 6c 65 73 20 61 6e 64 20 69  ter tables and i
ed00: 6e 74 65 72 6e 61 6c 20 73 63 68 65 6d 61 20 64  nternal schema d
ed10: 65 66 69 6e 69 74 69 6f 6e 73 0a 2a 2a 20 69 6e  efinitions.** in
ed20: 20 63 61 73 65 20 61 20 72 6f 6f 74 2d 70 61 67   case a root-pag
ed30: 65 20 62 65 6c 6f 6e 67 69 6e 67 20 74 6f 20 61  e belonging to a
ed40: 6e 6f 74 68 65 72 20 74 61 62 6c 65 20 69 73 20  nother table is 
ed50: 6d 6f 76 65 64 20 62 79 20 74 68 65 20 62 74 72  moved by the btr
ed60: 65 65 20 6c 61 79 65 72 0a 2a 2a 20 69 73 20 61  ee layer.** is a
ed70: 6c 73 6f 20 61 64 64 65 64 20 28 74 68 69 73 20  lso added (this 
ed80: 63 61 6e 20 68 61 70 70 65 6e 20 77 69 74 68 20  can happen with 
ed90: 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64  an auto-vacuum d
eda0: 61 74 61 62 61 73 65 29 2e 0a 2a 2f 0a 73 74 61  atabase)..*/.sta
edb0: 74 69 63 20 76 6f 69 64 20 64 65 73 74 72 6f 79  tic void destroy
edc0: 54 61 62 6c 65 28 50 61 72 73 65 20 2a 70 50 61  Table(Parse *pPa
edd0: 72 73 65 2c 20 54 61 62 6c 65 20 2a 70 54 61 62  rse, Table *pTab
ede0: 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ){.#ifdef SQLITE
edf0: 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
ee00: 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a  .  Index *pIdx;.
ee10: 20 20 69 6e 74 20 69 44 62 20 3d 20 73 71 6c 69    int iDb = sqli
ee20: 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78  te3SchemaToIndex
ee30: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 54 61  (pParse->db, pTa
ee40: 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 64  b->pSchema);.  d
ee50: 65 73 74 72 6f 79 52 6f 6f 74 50 61 67 65 28 70  estroyRootPage(p
ee60: 50 61 72 73 65 2c 20 70 54 61 62 2d 3e 74 6e 75  Parse, pTab->tnu
ee70: 6d 2c 20 69 44 62 29 3b 0a 20 20 66 6f 72 28 70  m, iDb);.  for(p
ee80: 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78  Idx=pTab->pIndex
ee90: 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64  ; pIdx; pIdx=pId
eea0: 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 64  x->pNext){.    d
eeb0: 65 73 74 72 6f 79 52 6f 6f 74 50 61 67 65 28 70  estroyRootPage(p
eec0: 50 61 72 73 65 2c 20 70 49 64 78 2d 3e 74 6e 75  Parse, pIdx->tnu
eed0: 6d 2c 20 69 44 62 29 3b 0a 20 20 7d 0a 23 65 6c  m, iDb);.  }.#el
eee0: 73 65 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 64  se.  /* If the d
eef0: 61 74 61 62 61 73 65 20 6d 61 79 20 62 65 20 61  atabase may be a
ef00: 75 74 6f 2d 76 61 63 75 75 6d 20 63 61 70 61 62  uto-vacuum capab
ef10: 6c 65 20 28 69 66 20 53 51 4c 49 54 45 5f 4f 4d  le (if SQLITE_OM
ef20: 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
ef30: 2a 2a 20 69 73 20 6e 6f 74 20 64 65 66 69 6e 65  ** is not define
ef40: 64 29 2c 20 74 68 65 6e 20 69 74 20 69 73 20 69  d), then it is i
ef50: 6d 70 6f 72 74 61 6e 74 20 74 6f 20 63 61 6c 6c  mportant to call
ef60: 20 4f 50 5f 44 65 73 74 72 6f 79 20 6f 6e 20 74   OP_Destroy on t
ef70: 68 65 0a 20 20 2a 2a 20 74 61 62 6c 65 20 61 6e  he.  ** table an
ef80: 64 20 69 6e 64 65 78 20 72 6f 6f 74 2d 70 61 67  d index root-pag
ef90: 65 73 20 69 6e 20 6f 72 64 65 72 2c 20 73 74 61  es in order, sta
efa0: 72 74 69 6e 67 20 77 69 74 68 20 74 68 65 20 6e  rting with the n
efb0: 75 6d 65 72 69 63 61 6c 6c 79 20 0a 20 20 2a 2a  umerically .  **
efc0: 20 6c 61 72 67 65 73 74 20 72 6f 6f 74 2d 70 61   largest root-pa
efd0: 67 65 20 6e 75 6d 62 65 72 2e 20 54 68 69 73 20  ge number. This 
efe0: 67 75 61 72 61 6e 74 65 65 73 20 74 68 61 74 20  guarantees that 
eff0: 6e 6f 6e 65 20 6f 66 20 74 68 65 20 72 6f 6f 74  none of the root
f000: 2d 70 61 67 65 73 0a 20 20 2a 2a 20 74 6f 20 62  -pages.  ** to b
f010: 65 20 64 65 73 74 72 6f 79 65 64 20 69 73 20 72  e destroyed is r
f020: 65 6c 6f 63 61 74 65 64 20 62 79 20 61 6e 20 65  elocated by an e
f030: 61 72 6c 69 65 72 20 4f 50 5f 44 65 73 74 72 6f  arlier OP_Destro
f040: 79 2e 20 69 2e 65 2e 20 69 66 20 74 68 65 0a 20  y. i.e. if the. 
f050: 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 77 65   ** following we
f060: 72 65 20 63 6f 64 65 64 3a 0a 20 20 2a 2a 0a 20  re coded:.  **. 
f070: 20 2a 2a 20 4f 50 5f 44 65 73 74 72 6f 79 20 34   ** OP_Destroy 4
f080: 20 30 0a 20 20 2a 2a 20 2e 2e 2e 0a 20 20 2a 2a   0.  ** ....  **
f090: 20 4f 50 5f 44 65 73 74 72 6f 79 20 35 20 30 0a   OP_Destroy 5 0.
f0a0: 20 20 2a 2a 0a 20 20 2a 2a 20 61 6e 64 20 72 6f    **.  ** and ro
f0b0: 6f 74 20 70 61 67 65 20 35 20 68 61 70 70 65 6e  ot page 5 happen
f0c0: 65 64 20 74 6f 20 62 65 20 74 68 65 20 6c 61 72  ed to be the lar
f0d0: 67 65 73 74 20 72 6f 6f 74 2d 70 61 67 65 20 6e  gest root-page n
f0e0: 75 6d 62 65 72 20 69 6e 20 74 68 65 0a 20 20 2a  umber in the.  *
f0f0: 2a 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 6e  * database, then
f100: 20 72 6f 6f 74 20 70 61 67 65 20 35 20 77 6f 75   root page 5 wou
f110: 6c 64 20 62 65 20 6d 6f 76 65 64 20 74 6f 20 70  ld be moved to p
f120: 61 67 65 20 34 20 62 79 20 74 68 65 20 0a 20 20  age 4 by the .  
f130: 2a 2a 20 22 4f 50 5f 44 65 73 74 72 6f 79 20 34  ** "OP_Destroy 4
f140: 20 30 22 20 6f 70 63 6f 64 65 2e 20 54 68 65 20   0" opcode. The 
f150: 73 75 62 73 65 71 75 65 6e 74 20 22 4f 50 5f 44  subsequent "OP_D
f160: 65 73 74 72 6f 79 20 35 20 30 22 20 77 6f 75 6c  estroy 5 0" woul
f170: 64 20 68 69 74 0a 20 20 2a 2a 20 61 20 66 72 65  d hit.  ** a fre
f180: 65 2d 6c 69 73 74 20 70 61 67 65 2e 0a 20 20 2a  e-list page..  *
f190: 2f 0a 20 20 69 6e 74 20 69 54 61 62 20 3d 20 70  /.  int iTab = p
f1a0: 54 61 62 2d 3e 74 6e 75 6d 3b 0a 20 20 69 6e 74  Tab->tnum;.  int
f1b0: 20 69 44 65 73 74 72 6f 79 65 64 20 3d 20 30 3b   iDestroyed = 0;
f1c0: 0a 0a 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a  ..  while( 1 ){.
f1d0: 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b      Index *pIdx;
f1e0: 0a 20 20 20 20 69 6e 74 20 69 4c 61 72 67 65 73  .    int iLarges
f1f0: 74 20 3d 20 30 3b 0a 0a 20 20 20 20 69 66 28 20  t = 0;..    if( 
f200: 69 44 65 73 74 72 6f 79 65 64 3d 3d 30 20 7c 7c  iDestroyed==0 ||
f210: 20 69 54 61 62 3c 69 44 65 73 74 72 6f 79 65 64   iTab<iDestroyed
f220: 20 29 7b 0a 20 20 20 20 20 20 69 4c 61 72 67 65   ){.      iLarge
f230: 73 74 20 3d 20 69 54 61 62 3b 0a 20 20 20 20 7d  st = iTab;.    }
f240: 0a 20 20 20 20 66 6f 72 28 70 49 64 78 3d 70 54  .    for(pIdx=pT
f250: 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78  ab->pIndex; pIdx
f260: 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65  ; pIdx=pIdx->pNe
f270: 78 74 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  xt){.      int i
f280: 49 64 78 20 3d 20 70 49 64 78 2d 3e 74 6e 75 6d  Idx = pIdx->tnum
f290: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
f2a0: 70 49 64 78 2d 3e 70 53 63 68 65 6d 61 3d 3d 70  pIdx->pSchema==p
f2b0: 54 61 62 2d 3e 70 53 63 68 65 6d 61 20 29 3b 0a  Tab->pSchema );.
f2c0: 20 20 20 20 20 20 69 66 28 20 28 69 44 65 73 74        if( (iDest
f2d0: 72 6f 79 65 64 3d 3d 30 20 7c 7c 20 28 69 49 64  royed==0 || (iId
f2e0: 78 3c 69 44 65 73 74 72 6f 79 65 64 29 29 20 26  x<iDestroyed)) &
f2f0: 26 20 69 49 64 78 3e 69 4c 61 72 67 65 73 74 20  & iIdx>iLargest 
f300: 29 7b 0a 20 20 20 20 20 20 20 20 69 4c 61 72 67  ){.        iLarg
f310: 65 73 74 20 3d 20 69 49 64 78 3b 0a 20 20 20 20  est = iIdx;.    
f320: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
f330: 28 20 69 4c 61 72 67 65 73 74 3d 3d 30 20 29 7b  ( iLargest==0 ){
f340: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  .      return;. 
f350: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
f360: 69 6e 74 20 69 44 62 20 3d 20 73 71 6c 69 74 65  int iDb = sqlite
f370: 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 70  3SchemaToIndex(p
f380: 50 61 72 73 65 2d 3e 64 62 2c 20 70 54 61 62 2d  Parse->db, pTab-
f390: 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 20  >pSchema);.     
f3a0: 20 64 65 73 74 72 6f 79 52 6f 6f 74 50 61 67 65   destroyRootPage
f3b0: 28 70 50 61 72 73 65 2c 20 69 4c 61 72 67 65 73  (pParse, iLarges
f3c0: 74 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20 69  t, iDb);.      i
f3d0: 44 65 73 74 72 6f 79 65 64 20 3d 20 69 4c 61 72  Destroyed = iLar
f3e0: 67 65 73 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  gest;.    }.  }.
f3f0: 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  #endif.}../*.** 
f400: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
f410: 63 61 6c 6c 65 64 20 74 6f 20 64 6f 20 74 68 65  called to do the
f420: 20 77 6f 72 6b 20 6f 66 20 61 20 44 52 4f 50 20   work of a DROP 
f430: 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e  TABLE statement.
f440: 0a 2a 2a 20 70 4e 61 6d 65 20 69 73 20 74 68 65  .** pName is the
f450: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62   name of the tab
f460: 6c 65 20 74 6f 20 62 65 20 64 72 6f 70 70 65 64  le to be dropped
f470: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
f480: 33 44 72 6f 70 54 61 62 6c 65 28 50 61 72 73 65  3DropTable(Parse
f490: 20 2a 70 50 61 72 73 65 2c 20 53 72 63 4c 69 73   *pParse, SrcLis
f4a0: 74 20 2a 70 4e 61 6d 65 2c 20 69 6e 74 20 69 73  t *pName, int is
f4b0: 56 69 65 77 2c 20 69 6e 74 20 6e 6f 45 72 72 29  View, int noErr)
f4c0: 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b  {.  Table *pTab;
f4d0: 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 73 71  .  Vdbe *v;.  sq
f4e0: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
f4f0: 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 69 44  se->db;.  int iD
f500: 62 3b 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65  b;..  if( pParse
f510: 2d 3e 6e 45 72 72 20 7c 7c 20 64 62 2d 3e 6d 61  ->nErr || db->ma
f520: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
f530: 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70    goto exit_drop
f540: 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 20 20 61 73  _table;.  }.  as
f550: 73 65 72 74 28 20 70 4e 61 6d 65 2d 3e 6e 53 72  sert( pName->nSr
f560: 63 3d 3d 31 20 29 3b 0a 20 20 70 54 61 62 20 3d  c==1 );.  pTab =
f570: 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61   sqlite3LocateTa
f580: 62 6c 65 28 70 50 61 72 73 65 2c 20 69 73 56 69  ble(pParse, isVi
f590: 65 77 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  ew, .           
f5a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f5b0: 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 4e 61   pName->a[0].zNa
f5c0: 6d 65 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e  me, pName->a[0].
f5d0: 7a 44 61 74 61 62 61 73 65 29 3b 0a 0a 20 20 69  zDatabase);..  i
f5e0: 66 28 20 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20  f( pTab==0 ){.  
f5f0: 20 20 69 66 28 20 6e 6f 45 72 72 20 29 7b 0a 20    if( noErr ){. 
f600: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
f610: 72 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a  rClear(pParse);.
f620: 20 20 20 20 7d 0a 20 20 20 20 67 6f 74 6f 20 65      }.    goto e
f630: 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a  xit_drop_table;.
f640: 20 20 7d 0a 20 20 69 44 62 20 3d 20 73 71 6c 69    }.  iDb = sqli
f650: 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78  te3SchemaToIndex
f660: 28 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65  (db, pTab->pSche
f670: 6d 61 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69  ma);.  assert( i
f680: 44 62 3e 3d 30 20 26 26 20 69 44 62 3c 64 62 2d  Db>=0 && iDb<db-
f690: 3e 6e 44 62 20 29 3b 0a 0a 20 20 2f 2a 20 49 66  >nDb );..  /* If
f6a0: 20 70 54 61 62 20 69 73 20 61 20 76 69 72 74 75   pTab is a virtu
f6b0: 61 6c 20 74 61 62 6c 65 2c 20 63 61 6c 6c 20 56  al table, call V
f6c0: 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65  iewGetColumnName
f6d0: 73 28 29 20 74 6f 20 65 6e 73 75 72 65 0a 20 20  s() to ensure.  
f6e0: 2a 2a 20 69 74 20 69 73 20 69 6e 69 74 69 61 6c  ** it is initial
f6f0: 69 7a 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ized..  */.  if(
f700: 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29   IsVirtual(pTab)
f710: 20 26 26 20 73 71 6c 69 74 65 33 56 69 65 77 47   && sqlite3ViewG
f720: 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50  etColumnNames(pP
f730: 61 72 73 65 2c 20 70 54 61 62 29 20 29 7b 0a 20  arse, pTab) ){. 
f740: 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f     goto exit_dro
f750: 70 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 23 69 66  p_table;.  }.#if
f760: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
f770: 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20  _AUTHORIZATION. 
f780: 20 7b 0a 20 20 20 20 69 6e 74 20 63 6f 64 65 3b   {.    int code;
f790: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
f7a0: 2a 7a 54 61 62 20 3d 20 53 43 48 45 4d 41 5f 54  *zTab = SCHEMA_T
f7b0: 41 42 4c 45 28 69 44 62 29 3b 0a 20 20 20 20 63  ABLE(iDb);.    c
f7c0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 20 3d  onst char *zDb =
f7d0: 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e   db->aDb[iDb].zN
f7e0: 61 6d 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63  ame;.    const c
f7f0: 68 61 72 20 2a 7a 41 72 67 32 20 3d 20 30 3b 0a  har *zArg2 = 0;.
f800: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 41      if( sqlite3A
f810: 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c  uthCheck(pParse,
f820: 20 53 51 4c 49 54 45 5f 44 45 4c 45 54 45 2c 20   SQLITE_DELETE, 
f830: 7a 54 61 62 2c 20 30 2c 20 7a 44 62 29 29 7b 0a  zTab, 0, zDb)){.
f840: 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f        goto exit_
f850: 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 20 20  drop_table;.    
f860: 7d 0a 20 20 20 20 69 66 28 20 69 73 56 69 65 77  }.    if( isView
f870: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 21 4f   ){.      if( !O
f880: 4d 49 54 5f 54 45 4d 50 44 42 20 26 26 20 69 44  MIT_TEMPDB && iD
f890: 62 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20  b==1 ){.        
f8a0: 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52  code = SQLITE_DR
f8b0: 4f 50 5f 54 45 4d 50 5f 56 49 45 57 3b 0a 20 20  OP_TEMP_VIEW;.  
f8c0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
f8d0: 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45     code = SQLITE
f8e0: 5f 44 52 4f 50 5f 56 49 45 57 3b 0a 20 20 20 20  _DROP_VIEW;.    
f8f0: 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
f900: 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
f910: 41 42 4c 45 0a 20 20 20 20 7d 65 6c 73 65 20 69  ABLE.    }else i
f920: 66 28 20 49 73 56 69 72 74 75 61 6c 28 70 54 61  f( IsVirtual(pTa
f930: 62 29 20 29 7b 0a 20 20 20 20 20 20 63 6f 64 65  b) ){.      code
f940: 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 56   = SQLITE_DROP_V
f950: 54 41 42 4c 45 3b 0a 20 20 20 20 20 20 7a 41 72  TABLE;.      zAr
f960: 67 32 20 3d 20 70 54 61 62 2d 3e 70 4d 6f 64 2d  g2 = pTab->pMod-
f970: 3e 7a 4e 61 6d 65 3b 0a 23 65 6e 64 69 66 0a 20  >zName;.#endif. 
f980: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
f990: 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42  if( !OMIT_TEMPDB
f9a0: 20 26 26 20 69 44 62 3d 3d 31 20 29 7b 0a 20 20   && iDb==1 ){.  
f9b0: 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c        code = SQL
f9c0: 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 54 41  ITE_DROP_TEMP_TA
f9d0: 42 4c 45 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  BLE;.      }else
f9e0: 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20 3d  {.        code =
f9f0: 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 41 42   SQLITE_DROP_TAB
fa00: 4c 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  LE;.      }.    
fa10: 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  }.    if( sqlite
fa20: 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73  3AuthCheck(pPars
fa30: 65 2c 20 63 6f 64 65 2c 20 70 54 61 62 2d 3e 7a  e, code, pTab->z
fa40: 4e 61 6d 65 2c 20 7a 41 72 67 32 2c 20 7a 44 62  Name, zArg2, zDb
fa50: 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  ) ){.      goto 
fa60: 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b  exit_drop_table;
fa70: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73  .    }.    if( s
fa80: 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28  qlite3AuthCheck(
fa90: 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 44  pParse, SQLITE_D
faa0: 45 4c 45 54 45 2c 20 70 54 61 62 2d 3e 7a 4e 61  ELETE, pTab->zNa
fab0: 6d 65 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20  me, 0, zDb) ){. 
fac0: 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64       goto exit_d
fad0: 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 20 20 7d  rop_table;.    }
fae0: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66  .  }.#endif.  if
faf0: 28 20 70 54 61 62 2d 3e 72 65 61 64 4f 6e 6c 79  ( pTab->readOnly
fb00: 20 7c 7c 20 70 54 61 62 3d 3d 64 62 2d 3e 61 44   || pTab==db->aD
fb10: 62 5b 69 44 62 5d 2e 70 53 63 68 65 6d 61 2d 3e  b[iDb].pSchema->
fb20: 70 53 65 71 54 61 62 20 29 7b 0a 20 20 20 20 73  pSeqTab ){.    s
fb30: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
fb40: 50 61 72 73 65 2c 20 22 74 61 62 6c 65 20 25 73  Parse, "table %s
fb50: 20 6d 61 79 20 6e 6f 74 20 62 65 20 64 72 6f 70   may not be drop
fb60: 70 65 64 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  ped", pTab->zNam
fb70: 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69  e);.    goto exi
fb80: 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20  t_drop_table;.  
fb90: 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
fba0: 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 20 20 2f 2a  E_OMIT_VIEW.  /*
fbb0: 20 45 6e 73 75 72 65 20 44 52 4f 50 20 54 41 42   Ensure DROP TAB
fbc0: 4c 45 20 69 73 20 6e 6f 74 20 75 73 65 64 20 6f  LE is not used o
fbd0: 6e 20 61 20 76 69 65 77 2c 20 61 6e 64 20 44 52  n a view, and DR
fbe0: 4f 50 20 56 49 45 57 20 69 73 20 6e 6f 74 20 75  OP VIEW is not u
fbf0: 73 65 64 0a 20 20 2a 2a 20 6f 6e 20 61 20 74 61  sed.  ** on a ta
fc00: 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ble..  */.  if( 
fc10: 69 73 56 69 65 77 20 26 26 20 70 54 61 62 2d 3e  isView && pTab->
fc20: 70 53 65 6c 65 63 74 3d 3d 30 20 29 7b 0a 20 20  pSelect==0 ){.  
fc30: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
fc40: 67 28 70 50 61 72 73 65 2c 20 22 75 73 65 20 44  g(pParse, "use D
fc50: 52 4f 50 20 54 41 42 4c 45 20 74 6f 20 64 65 6c  ROP TABLE to del
fc60: 65 74 65 20 74 61 62 6c 65 20 25 73 22 2c 20 70  ete table %s", p
fc70: 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  Tab->zName);.   
fc80: 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f   goto exit_drop_
fc90: 74 61 62 6c 65 3b 0a 20 20 7d 0a 20 20 69 66 28  table;.  }.  if(
fca0: 20 21 69 73 56 69 65 77 20 26 26 20 70 54 61 62   !isView && pTab
fcb0: 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20  ->pSelect ){.   
fcc0: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
fcd0: 28 70 50 61 72 73 65 2c 20 22 75 73 65 20 44 52  (pParse, "use DR
fce0: 4f 50 20 56 49 45 57 20 74 6f 20 64 65 6c 65 74  OP VIEW to delet
fcf0: 65 20 76 69 65 77 20 25 73 22 2c 20 70 54 61 62  e view %s", pTab
fd00: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 67 6f  ->zName);.    go
fd10: 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62  to exit_drop_tab
fd20: 6c 65 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  le;.  }.#endif..
fd30: 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f    /* Generate co
fd40: 64 65 20 74 6f 20 72 65 6d 6f 76 65 20 74 68 65  de to remove the
fd50: 20 74 61 62 6c 65 20 66 72 6f 6d 20 74 68 65 20   table from the 
fd60: 6d 61 73 74 65 72 20 74 61 62 6c 65 0a 20 20 2a  master table.  *
fd70: 2a 20 6f 6e 20 64 69 73 6b 2e 0a 20 20 2a 2f 0a  * on disk..  */.
fd80: 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74    v = sqlite3Get
fd90: 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
fda0: 69 66 28 20 76 20 29 7b 0a 20 20 20 20 54 72 69  if( v ){.    Tri
fdb0: 67 67 65 72 20 2a 70 54 72 69 67 67 65 72 3b 0a  gger *pTrigger;.
fdc0: 20 20 20 20 44 62 20 2a 70 44 62 20 3d 20 26 64      Db *pDb = &d
fdd0: 62 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a 20 20 20  b->aDb[iDb];.   
fde0: 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69   sqlite3BeginWri
fdf0: 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72  teOperation(pPar
fe00: 73 65 2c 20 31 2c 20 69 44 62 29 3b 0a 0a 23 69  se, 1, iDb);..#i
fe10: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
fe20: 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20  T_VIRTUALTABLE. 
fe30: 20 20 20 69 66 28 20 49 73 56 69 72 74 75 61 6c     if( IsVirtual
fe40: 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20  (pTab) ){.      
fe50: 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65  Vdbe *v = sqlite
fe60: 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
fe70: 3b 0a 20 20 20 20 20 20 69 66 28 20 76 20 29 7b  ;.      if( v ){
fe80: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
fe90: 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50  VdbeAddOp0(v, OP
fea0: 5f 56 42 65 67 69 6e 29 3b 0a 20 20 20 20 20 20  _VBegin);.      
feb0: 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  }.    }.#endif..
fec0: 20 20 20 20 2f 2a 20 44 72 6f 70 20 61 6c 6c 20      /* Drop all 
fed0: 74 72 69 67 67 65 72 73 20 61 73 73 6f 63 69 61  triggers associa
fee0: 74 65 64 20 77 69 74 68 20 74 68 65 20 74 61 62  ted with the tab
fef0: 6c 65 20 62 65 69 6e 67 20 64 72 6f 70 70 65 64  le being dropped
ff00: 2e 20 43 6f 64 65 0a 20 20 20 20 2a 2a 20 69 73  . Code.    ** is
ff10: 20 67 65 6e 65 72 61 74 65 64 20 74 6f 20 72 65   generated to re
ff20: 6d 6f 76 65 20 65 6e 74 72 69 65 73 20 66 72 6f  move entries fro
ff30: 6d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  m sqlite_master 
ff40: 61 6e 64 2f 6f 72 0a 20 20 20 20 2a 2a 20 73 71  and/or.    ** sq
ff50: 6c 69 74 65 5f 74 65 6d 70 5f 6d 61 73 74 65 72  lite_temp_master
ff60: 20 69 66 20 72 65 71 75 69 72 65 64 2e 0a 20 20   if required..  
ff70: 20 20 2a 2f 0a 20 20 20 20 70 54 72 69 67 67 65    */.    pTrigge
ff80: 72 20 3d 20 70 54 61 62 2d 3e 70 54 72 69 67 67  r = pTab->pTrigg
ff90: 65 72 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 70  er;.    while( p
ffa0: 54 72 69 67 67 65 72 20 29 7b 0a 20 20 20 20 20  Trigger ){.     
ffb0: 20 61 73 73 65 72 74 28 20 70 54 72 69 67 67 65   assert( pTrigge
ffc0: 72 2d 3e 70 53 63 68 65 6d 61 3d 3d 70 54 61 62  r->pSchema==pTab
ffd0: 2d 3e 70 53 63 68 65 6d 61 20 7c 7c 20 0a 20 20  ->pSchema || .  
ffe0: 20 20 20 20 20 20 20 20 70 54 72 69 67 67 65 72          pTrigger
fff0: 2d 3e 70 53 63 68 65 6d 61 3d 3d 64 62 2d 3e 61  ->pSchema==db->a
10000 44 62 5b 31 5d 2e 70 53 63 68 65 6d 61 20 29 3b  Db[1].pSchema );
10010 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 72  .      sqlite3Dr
10020 6f 70 54 72 69 67 67 65 72 50 74 72 28 70 50 61  opTriggerPtr(pPa
10030 72 73 65 2c 20 70 54 72 69 67 67 65 72 29 3b 0a  rse, pTrigger);.
10040 20 20 20 20 20 20 70 54 72 69 67 67 65 72 20 3d        pTrigger =
10050 20 70 54 72 69 67 67 65 72 2d 3e 70 4e 65 78 74   pTrigger->pNext
10060 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 6e 64 65 66  ;.    }..#ifndef
10070 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
10080 4f 49 4e 43 52 45 4d 45 4e 54 0a 20 20 20 20 2f  OINCREMENT.    /
10090 2a 20 52 65 6d 6f 76 65 20 61 6e 79 20 65 6e 74  * Remove any ent
100a0 72 69 65 73 20 6f 66 20 74 68 65 20 73 71 6c 69  ries of the sqli
100b0 74 65 5f 73 65 71 75 65 6e 63 65 20 74 61 62 6c  te_sequence tabl
100c0 65 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  e associated wit
100d0 68 0a 20 20 20 20 2a 2a 20 74 68 65 20 74 61 62  h.    ** the tab
100e0 6c 65 20 62 65 69 6e 67 20 64 72 6f 70 70 65 64  le being dropped
100f0 2e 20 54 68 69 73 20 69 73 20 64 6f 6e 65 20 62  . This is done b
10100 65 66 6f 72 65 20 74 68 65 20 74 61 62 6c 65 20  efore the table 
10110 69 73 20 64 72 6f 70 70 65 64 0a 20 20 20 20 2a  is dropped.    *
10120 2a 20 61 74 20 74 68 65 20 62 74 72 65 65 20 6c  * at the btree l
10130 65 76 65 6c 2c 20 69 6e 20 63 61 73 65 20 74 68  evel, in case th
10140 65 20 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63  e sqlite_sequenc
10150 65 20 74 61 62 6c 65 20 6e 65 65 64 73 20 74 6f  e table needs to
10160 0a 20 20 20 20 2a 2a 20 6d 6f 76 65 20 61 73 20  .    ** move as 
10170 61 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20  a result of the 
10180 64 72 6f 70 20 28 63 61 6e 20 68 61 70 70 65 6e  drop (can happen
10190 20 69 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20   in auto-vacuum 
101a0 6d 6f 64 65 29 2e 0a 20 20 20 20 2a 2f 0a 20 20  mode)..    */.  
101b0 20 20 69 66 28 20 70 54 61 62 2d 3e 61 75 74 6f    if( pTab->auto
101c0 49 6e 63 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  Inc ){.      sql
101d0 69 74 65 33 4e 65 73 74 65 64 50 61 72 73 65 28  ite3NestedParse(
101e0 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20  pParse,.        
101f0 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 25 73 2e  "DELETE FROM %s.
10200 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 20  sqlite_sequence 
10210 57 48 45 52 45 20 6e 61 6d 65 3d 25 51 22 2c 0a  WHERE name=%Q",.
10220 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 4e 61          pDb->zNa
10230 6d 65 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 0a  me, pTab->zName.
10240 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 23        );.    }.#
10250 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 44 72  endif..    /* Dr
10260 6f 70 20 61 6c 6c 20 53 51 4c 49 54 45 5f 4d 41  op all SQLITE_MA
10270 53 54 45 52 20 74 61 62 6c 65 20 61 6e 64 20 69  STER table and i
10280 6e 64 65 78 20 65 6e 74 72 69 65 73 20 74 68 61  ndex entries tha
10290 74 20 72 65 66 65 72 20 74 6f 20 74 68 65 0a 20  t refer to the. 
102a0 20 20 20 2a 2a 20 74 61 62 6c 65 2e 20 54 68 65     ** table. The
102b0 20 70 72 6f 67 72 61 6d 20 6e 61 6d 65 20 6c 6f   program name lo
102c0 6f 70 73 20 74 68 72 6f 75 67 68 20 74 68 65 20  ops through the 
102d0 6d 61 73 74 65 72 20 74 61 62 6c 65 20 61 6e 64  master table and
102e0 20 64 65 6c 65 74 65 73 0a 20 20 20 20 2a 2a 20   deletes.    ** 
102f0 65 76 65 72 79 20 72 6f 77 20 74 68 61 74 20 72  every row that r
10300 65 66 65 72 73 20 74 6f 20 61 20 74 61 62 6c 65  efers to a table
10310 20 6f 66 20 74 68 65 20 73 61 6d 65 20 6e 61 6d   of the same nam
10320 65 20 61 73 20 74 68 65 20 6f 6e 65 20 62 65 69  e as the one bei
10330 6e 67 0a 20 20 20 20 2a 2a 20 64 72 6f 70 70 65  ng.    ** droppe
10340 64 2e 20 54 72 69 67 67 65 72 73 20 61 72 65 20  d. Triggers are 
10350 68 61 6e 64 6c 65 64 20 73 65 70 65 72 61 74 65  handled seperate
10360 6c 79 20 62 65 63 61 75 73 65 20 61 20 74 72 69  ly because a tri
10370 67 67 65 72 20 63 61 6e 20 62 65 0a 20 20 20 20  gger can be.    
10380 2a 2a 20 63 72 65 61 74 65 64 20 69 6e 20 74 68  ** created in th
10390 65 20 74 65 6d 70 20 64 61 74 61 62 61 73 65 20  e temp database 
103a0 74 68 61 74 20 72 65 66 65 72 73 20 74 6f 20 61  that refers to a
103b0 20 74 61 62 6c 65 20 69 6e 20 61 6e 6f 74 68 65   table in anothe
103c0 72 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73  r.    ** databas
103d0 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71  e..    */.    sq
103e0 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72 73 65  lite3NestedParse
103f0 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20  (pParse, .      
10400 20 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 25    "DELETE FROM %
10410 51 2e 25 73 20 57 48 45 52 45 20 74 62 6c 5f 6e  Q.%s WHERE tbl_n
10420 61 6d 65 3d 25 51 20 61 6e 64 20 74 79 70 65 21  ame=%Q and type!
10430 3d 27 74 72 69 67 67 65 72 27 22 2c 0a 20 20 20  ='trigger'",.   
10440 20 20 20 20 20 70 44 62 2d 3e 7a 4e 61 6d 65 2c       pDb->zName,
10450 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 44   SCHEMA_TABLE(iD
10460 62 29 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29  b), pTab->zName)
10470 3b 0a 0a 20 20 20 20 2f 2a 20 44 72 6f 70 20 61  ;..    /* Drop a
10480 6e 79 20 73 74 61 74 69 73 74 69 63 73 20 66 72  ny statistics fr
10490 6f 6d 20 74 68 65 20 73 71 6c 69 74 65 5f 73 74  om the sqlite_st
104a0 61 74 31 20 74 61 62 6c 65 2c 20 69 66 20 69 74  at1 table, if it
104b0 20 65 78 69 73 74 73 20 2a 2f 0a 20 20 20 20 69   exists */.    i
104c0 66 28 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61  f( sqlite3FindTa
104d0 62 6c 65 28 64 62 2c 20 22 73 71 6c 69 74 65 5f  ble(db, "sqlite_
104e0 73 74 61 74 31 22 2c 20 64 62 2d 3e 61 44 62 5b  stat1", db->aDb[
104f0 69 44 62 5d 2e 7a 4e 61 6d 65 29 20 29 7b 0a 20  iDb].zName) ){. 
10500 20 20 20 20 20 73 71 6c 69 74 65 33 4e 65 73 74       sqlite3Nest
10510 65 64 50 61 72 73 65 28 70 50 61 72 73 65 2c 0a  edParse(pParse,.
10520 20 20 20 20 20 20 20 20 22 44 45 4c 45 54 45 20          "DELETE 
10530 46 52 4f 4d 20 25 51 2e 73 71 6c 69 74 65 5f 73  FROM %Q.sqlite_s
10540 74 61 74 31 20 57 48 45 52 45 20 74 62 6c 3d 25  tat1 WHERE tbl=%
10550 51 22 2c 20 70 44 62 2d 3e 7a 4e 61 6d 65 2c 20  Q", pDb->zName, 
10560 70 54 61 62 2d 3e 7a 4e 61 6d 65 0a 20 20 20 20  pTab->zName.    
10570 20 20 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20    );.    }..    
10580 69 66 28 20 21 69 73 56 69 65 77 20 26 26 20 21  if( !isView && !
10590 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20  IsVirtual(pTab) 
105a0 29 7b 0a 20 20 20 20 20 20 64 65 73 74 72 6f 79  ){.      destroy
105b0 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70 54  Table(pParse, pT
105c0 61 62 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ab);.    }..    
105d0 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 74 61  /* Remove the ta
105e0 62 6c 65 20 65 6e 74 72 79 20 66 72 6f 6d 20 53  ble entry from S
105f0 51 4c 69 74 65 27 73 20 69 6e 74 65 72 6e 61 6c  QLite's internal
10600 20 73 63 68 65 6d 61 20 61 6e 64 20 6d 6f 64 69   schema and modi
10610 66 79 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 63  fy.    ** the sc
10620 68 65 6d 61 20 63 6f 6f 6b 69 65 2e 0a 20 20 20  hema cookie..   
10630 20 2a 2f 0a 20 20 20 20 69 66 28 20 49 73 56 69   */.    if( IsVi
10640 72 74 75 61 6c 28 70 54 61 62 29 20 29 7b 0a 20  rtual(pTab) ){. 
10650 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
10660 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 56 44 65  AddOp4(v, OP_VDe
10670 73 74 72 6f 79 2c 20 69 44 62 2c 20 30 2c 20 30  stroy, iDb, 0, 0
10680 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 30  , pTab->zName, 0
10690 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
106a0 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
106b0 2c 20 4f 50 5f 44 72 6f 70 54 61 62 6c 65 2c 20  , OP_DropTable, 
106c0 69 44 62 2c 20 30 2c 20 30 2c 20 70 54 61 62 2d  iDb, 0, 0, pTab-
106d0 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20  >zName, 0);.    
106e0 73 71 6c 69 74 65 33 43 68 61 6e 67 65 43 6f 6f  sqlite3ChangeCoo
106f0 6b 69 65 28 70 50 61 72 73 65 2c 20 69 44 62 29  kie(pParse, iDb)
10700 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 56 69  ;.  }.  sqliteVi
10710 65 77 52 65 73 65 74 41 6c 6c 28 64 62 2c 20 69  ewResetAll(db, i
10720 44 62 29 3b 0a 0a 65 78 69 74 5f 64 72 6f 70 5f  Db);..exit_drop_
10730 74 61 62 6c 65 3a 0a 20 20 73 71 6c 69 74 65 33  table:.  sqlite3
10740 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28 64 62  SrcListDelete(db
10750 2c 20 70 4e 61 6d 65 29 3b 0a 7d 0a 0a 2f 2a 0a  , pName);.}../*.
10760 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
10770 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 63 72 65  is called to cre
10780 61 74 65 20 61 20 6e 65 77 20 66 6f 72 65 69 67  ate a new foreig
10790 6e 20 6b 65 79 20 6f 6e 20 74 68 65 20 74 61 62  n key on the tab
107a0 6c 65 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20  le.** currently 
107b0 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69  under constructi
107c0 6f 6e 2e 20 20 70 46 72 6f 6d 43 6f 6c 20 64 65  on.  pFromCol de
107d0 74 65 72 6d 69 6e 65 73 20 77 68 69 63 68 20 63  termines which c
107e0 6f 6c 75 6d 6e 73 0a 2a 2a 20 69 6e 20 74 68 65  olumns.** in the
107f0 20 63 75 72 72 65 6e 74 20 74 61 62 6c 65 20 70   current table p
10800 6f 69 6e 74 20 74 6f 20 74 68 65 20 66 6f 72 65  oint to the fore
10810 69 67 6e 20 6b 65 79 2e 20 20 49 66 20 70 46 72  ign key.  If pFr
10820 6f 6d 43 6f 6c 3d 3d 30 20 74 68 65 6e 0a 2a 2a  omCol==0 then.**
10830 20 63 6f 6e 6e 65 63 74 20 74 68 65 20 6b 65 79   connect the key
10840 20 74 6f 20 74 68 65 20 6c 61 73 74 20 63 6f 6c   to the last col
10850 75 6d 6e 20 69 6e 73 65 72 74 65 64 2e 20 20 70  umn inserted.  p
10860 54 6f 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f  To is the name o
10870 66 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 72  f.** the table r
10880 65 66 65 72 72 65 64 20 74 6f 2e 20 20 70 54 6f  eferred to.  pTo
10890 43 6f 6c 20 69 73 20 61 20 6c 69 73 74 20 6f 66  Col is a list of
108a0 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20 6f   tables in the o
108b0 74 68 65 72 0a 2a 2a 20 70 54 6f 20 74 61 62 6c  ther.** pTo tabl
108c0 65 20 74 68 61 74 20 74 68 65 20 66 6f 72 65 69  e that the forei
108d0 67 6e 20 6b 65 79 20 70 6f 69 6e 74 73 20 74 6f  gn key points to
108e0 2e 20 20 66 6c 61 67 73 20 63 6f 6e 74 61 69 6e  .  flags contain
108f0 73 20 61 6c 6c 0a 2a 2a 20 69 6e 66 6f 72 6d 61  s all.** informa
10900 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 63  tion about the c
10910 6f 6e 66 6c 69 63 74 20 72 65 73 6f 6c 75 74 69  onflict resoluti
10920 6f 6e 20 61 6c 67 6f 72 69 74 68 6d 73 20 73 70  on algorithms sp
10930 65 63 69 66 69 65 64 0a 2a 2a 20 69 6e 20 74 68  ecified.** in th
10940 65 20 4f 4e 20 44 45 4c 45 54 45 2c 20 4f 4e 20  e ON DELETE, ON 
10950 55 50 44 41 54 45 20 61 6e 64 20 4f 4e 20 49 4e  UPDATE and ON IN
10960 53 45 52 54 20 63 6c 61 75 73 65 73 2e 0a 2a 2a  SERT clauses..**
10970 0a 2a 2a 20 41 6e 20 46 4b 65 79 20 73 74 72 75  .** An FKey stru
10980 63 74 75 72 65 20 69 73 20 63 72 65 61 74 65 64  cture is created
10990 20 61 6e 64 20 61 64 64 65 64 20 74 6f 20 74 68   and added to th
109a0 65 20 74 61 62 6c 65 20 63 75 72 72 65 6e 74 6c  e table currentl
109b0 79 0a 2a 2a 20 75 6e 64 65 72 20 63 6f 6e 73 74  y.** under const
109c0 72 75 63 74 69 6f 6e 20 69 6e 20 74 68 65 20 70  ruction in the p
109d0 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
109e0 20 66 69 65 6c 64 2e 20 20 54 68 65 20 6e 65 77   field.  The new
109f0 20 46 4b 65 79 0a 2a 2a 20 69 73 20 6e 6f 74 20   FKey.** is not 
10a00 6c 69 6e 6b 65 64 20 69 6e 74 6f 20 64 62 2d 3e  linked into db->
10a10 61 46 4b 65 79 20 61 74 20 74 68 69 73 20 70 6f  aFKey at this po
10a20 69 6e 74 20 2d 20 74 68 61 74 20 64 6f 65 73 20  int - that does 
10a30 6e 6f 74 20 68 61 70 70 65 6e 0a 2a 2a 20 75 6e  not happen.** un
10a40 74 69 6c 20 73 71 6c 69 74 65 33 45 6e 64 54 61  til sqlite3EndTa
10a50 62 6c 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ble()..**.** The
10a60 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 69 73 20   foreign key is 
10a70 73 65 74 20 66 6f 72 20 49 4d 4d 45 44 49 41 54  set for IMMEDIAT
10a80 45 20 70 72 6f 63 65 73 73 69 6e 67 2e 20 20 41  E processing.  A
10a90 20 73 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c   subsequent call
10aa0 0a 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33 44 65  .** to sqlite3De
10ab0 66 65 72 46 6f 72 65 69 67 6e 4b 65 79 28 29 20  ferForeignKey() 
10ac0 6d 69 67 68 74 20 63 68 61 6e 67 65 20 74 68 69  might change thi
10ad0 73 20 74 6f 20 44 45 46 45 52 52 45 44 2e 0a 2a  s to DEFERRED..*
10ae0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 72  /.void sqlite3Cr
10af0 65 61 74 65 46 6f 72 65 69 67 6e 4b 65 79 28 0a  eateForeignKey(.
10b00 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
10b10 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
10b20 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45  g context */.  E
10b30 78 70 72 4c 69 73 74 20 2a 70 46 72 6f 6d 43 6f  xprList *pFromCo
10b40 6c 2c 20 20 2f 2a 20 43 6f 6c 75 6d 6e 73 20 69  l,  /* Columns i
10b50 6e 20 74 68 69 73 20 74 61 62 6c 65 20 74 68 61  n this table tha
10b60 74 20 70 6f 69 6e 74 20 74 6f 20 6f 74 68 65 72  t point to other
10b70 20 74 61 62 6c 65 20 2a 2f 0a 20 20 54 6f 6b 65   table */.  Toke
10b80 6e 20 2a 70 54 6f 2c 20 20 20 20 20 20 20 20 20  n *pTo,         
10b90 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
10ba0 6f 74 68 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20  other table */. 
10bb0 20 45 78 70 72 4c 69 73 74 20 2a 70 54 6f 43 6f   ExprList *pToCo
10bc0 6c 2c 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 73  l,    /* Columns
10bd0 20 69 6e 20 74 68 65 20 6f 74 68 65 72 20 74 61   in the other ta
10be0 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61  ble */.  int fla
10bf0 67 73 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  gs            /*
10c00 20 43 6f 6e 66 6c 69 63 74 20 72 65 73 6f 6c 75   Conflict resolu
10c10 74 69 6f 6e 20 61 6c 67 6f 72 69 74 68 6d 73 2e  tion algorithms.
10c20 20 2a 2f 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53   */.){.#ifndef S
10c30 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49  QLITE_OMIT_FOREI
10c40 47 4e 5f 4b 45 59 0a 20 20 46 4b 65 79 20 2a 70  GN_KEY.  FKey *p
10c50 46 4b 65 79 20 3d 20 30 3b 0a 20 20 54 61 62 6c  FKey = 0;.  Tabl
10c60 65 20 2a 70 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *p = pParse->p
10c70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 69 6e 74 20  NewTable;.  int 
10c80 6e 42 79 74 65 3b 0a 20 20 69 6e 74 20 69 3b 0a  nByte;.  int i;.
10c90 20 20 69 6e 74 20 6e 43 6f 6c 3b 0a 20 20 63 68    int nCol;.  ch
10ca0 61 72 20 2a 7a 3b 0a 20 20 73 71 6c 69 74 65 33  ar *z;.  sqlite3
10cb0 20 2a 64 62 3b 0a 0a 20 20 61 73 73 65 72 74 28   *db;..  assert(
10cc0 20 70 54 6f 21 3d 30 20 29 3b 0a 20 20 64 62 20   pTo!=0 );.  db 
10cd0 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
10ce0 69 66 28 20 70 3d 3d 30 20 7c 7c 20 70 50 61 72  if( p==0 || pPar
10cf0 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 49 4e 5f 44  se->nErr || IN_D
10d00 45 43 4c 41 52 45 5f 56 54 41 42 20 29 20 67 6f  ECLARE_VTAB ) go
10d10 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 69 66 28  to fk_end;.  if(
10d20 20 70 46 72 6f 6d 43 6f 6c 3d 3d 30 20 29 7b 0a   pFromCol==0 ){.
10d30 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70      int iCol = p
10d40 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 20 20 69 66  ->nCol-1;.    if
10d50 28 20 69 43 6f 6c 3c 30 20 29 20 67 6f 74 6f 20  ( iCol<0 ) goto 
10d60 66 6b 5f 65 6e 64 3b 0a 20 20 20 20 69 66 28 20  fk_end;.    if( 
10d70 70 54 6f 43 6f 6c 20 26 26 20 70 54 6f 43 6f 6c  pToCol && pToCol
10d80 2d 3e 6e 45 78 70 72 21 3d 31 20 29 7b 0a 20 20  ->nExpr!=1 ){.  
10d90 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
10da0 4d 73 67 28 70 50 61 72 73 65 2c 20 22 66 6f 72  Msg(pParse, "for
10db0 65 69 67 6e 20 6b 65 79 20 6f 6e 20 25 73 22 0a  eign key on %s".
10dc0 20 20 20 20 20 20 20 20 20 22 20 73 68 6f 75 6c           " shoul
10dd0 64 20 72 65 66 65 72 65 6e 63 65 20 6f 6e 6c 79  d reference only
10de0 20 6f 6e 65 20 63 6f 6c 75 6d 6e 20 6f 66 20 74   one column of t
10df0 61 62 6c 65 20 25 54 22 2c 0a 20 20 20 20 20 20  able %T",.      
10e00 20 20 20 70 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d     p->aCol[iCol]
10e10 2e 7a 4e 61 6d 65 2c 20 70 54 6f 29 3b 0a 20 20  .zName, pTo);.  
10e20 20 20 20 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b      goto fk_end;
10e30 0a 20 20 20 20 7d 0a 20 20 20 20 6e 43 6f 6c 20  .    }.    nCol 
10e40 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  = 1;.  }else if(
10e50 20 70 54 6f 43 6f 6c 20 26 26 20 70 54 6f 43 6f   pToCol && pToCo
10e60 6c 2d 3e 6e 45 78 70 72 21 3d 70 46 72 6f 6d 43  l->nExpr!=pFromC
10e70 6f 6c 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20  ol->nExpr ){.   
10e80 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
10e90 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20  (pParse,.       
10ea0 20 22 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75   "number of colu
10eb0 6d 6e 73 20 69 6e 20 66 6f 72 65 69 67 6e 20 6b  mns in foreign k
10ec0 65 79 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63  ey does not matc
10ed0 68 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  h the number of 
10ee0 22 0a 20 20 20 20 20 20 20 20 22 63 6f 6c 75 6d  ".        "colum
10ef0 6e 73 20 69 6e 20 74 68 65 20 72 65 66 65 72 65  ns in the refere
10f00 6e 63 65 64 20 74 61 62 6c 65 22 29 3b 0a 20 20  nced table");.  
10f10 20 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20    goto fk_end;. 
10f20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 43 6f 6c   }else{.    nCol
10f30 20 3d 20 70 46 72 6f 6d 43 6f 6c 2d 3e 6e 45 78   = pFromCol->nEx
10f40 70 72 3b 0a 20 20 7d 0a 20 20 6e 42 79 74 65 20  pr;.  }.  nByte 
10f50 3d 20 73 69 7a 65 6f 66 28 2a 70 46 4b 65 79 29  = sizeof(*pFKey)
10f60 20 2b 20 6e 43 6f 6c 2a 73 69 7a 65 6f 66 28 70   + nCol*sizeof(p
10f70 46 4b 65 79 2d 3e 61 43 6f 6c 5b 30 5d 29 20 2b  FKey->aCol[0]) +
10f80 20 70 54 6f 2d 3e 6e 20 2b 20 31 3b 0a 20 20 69   pTo->n + 1;.  i
10f90 66 28 20 70 54 6f 43 6f 6c 20 29 7b 0a 20 20 20  f( pToCol ){.   
10fa0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 6f 43   for(i=0; i<pToC
10fb0 6f 6c 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  ol->nExpr; i++){
10fc0 0a 20 20 20 20 20 20 6e 42 79 74 65 20 2b 3d 20  .      nByte += 
10fd0 73 74 72 6c 65 6e 28 70 54 6f 43 6f 6c 2d 3e 61  strlen(pToCol->a
10fe0 5b 69 5d 2e 7a 4e 61 6d 65 29 20 2b 20 31 3b 0a  [i].zName) + 1;.
10ff0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 46 4b 65      }.  }.  pFKe
11000 79 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  y = sqlite3DbMal
11010 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 6e 42 79 74  locZero(db, nByt
11020 65 20 29 3b 0a 20 20 69 66 28 20 70 46 4b 65 79  e );.  if( pFKey
11030 3d 3d 30 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  ==0 ){.    goto 
11040 66 6b 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 70 46  fk_end;.  }.  pF
11050 4b 65 79 2d 3e 70 46 72 6f 6d 20 3d 20 70 3b 0a  Key->pFrom = p;.
11060 20 20 70 46 4b 65 79 2d 3e 70 4e 65 78 74 46 72    pFKey->pNextFr
11070 6f 6d 20 3d 20 70 2d 3e 70 46 4b 65 79 3b 0a 20  om = p->pFKey;. 
11080 20 7a 20 3d 20 28 63 68 61 72 2a 29 26 70 46 4b   z = (char*)&pFK
11090 65 79 5b 31 5d 3b 0a 20 20 70 46 4b 65 79 2d 3e  ey[1];.  pFKey->
110a0 61 43 6f 6c 20 3d 20 28 73 74 72 75 63 74 20 73  aCol = (struct s
110b0 43 6f 6c 4d 61 70 2a 29 7a 3b 0a 20 20 7a 20 2b  ColMap*)z;.  z +
110c0 3d 20 73 69 7a 65 6f 66 28 73 74 72 75 63 74 20  = sizeof(struct 
110d0 73 43 6f 6c 4d 61 70 29 2a 6e 43 6f 6c 3b 0a 20  sColMap)*nCol;. 
110e0 20 70 46 4b 65 79 2d 3e 7a 54 6f 20 3d 20 7a 3b   pFKey->zTo = z;
110f0 0a 20 20 6d 65 6d 63 70 79 28 7a 2c 20 70 54 6f  .  memcpy(z, pTo
11100 2d 3e 7a 2c 20 70 54 6f 2d 3e 6e 29 3b 0a 20 20  ->z, pTo->n);.  
11110 7a 5b 70 54 6f 2d 3e 6e 5d 20 3d 20 30 3b 0a 20  z[pTo->n] = 0;. 
11120 20 7a 20 2b 3d 20 70 54 6f 2d 3e 6e 2b 31 3b 0a   z += pTo->n+1;.
11130 20 20 70 46 4b 65 79 2d 3e 70 4e 65 78 74 54 6f    pFKey->pNextTo
11140 20 3d 20 30 3b 0a 20 20 70 46 4b 65 79 2d 3e 6e   = 0;.  pFKey->n
11150 43 6f 6c 20 3d 20 6e 43 6f 6c 3b 0a 20 20 69 66  Col = nCol;.  if
11160 28 20 70 46 72 6f 6d 43 6f 6c 3d 3d 30 20 29 7b  ( pFromCol==0 ){
11170 0a 20 20 20 20 70 46 4b 65 79 2d 3e 61 43 6f 6c  .    pFKey->aCol
11180 5b 30 5d 2e 69 46 72 6f 6d 20 3d 20 70 2d 3e 6e  [0].iFrom = p->n
11190 43 6f 6c 2d 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Col-1;.  }else{.
111a0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
111b0 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Col; i++){.     
111c0 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 66 6f   int j;.      fo
111d0 72 28 6a 3d 30 3b 20 6a 3c 70 2d 3e 6e 43 6f 6c  r(j=0; j<p->nCol
111e0 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; j++){.        
111f0 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43  if( sqlite3StrIC
11200 6d 70 28 70 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e  mp(p->aCol[j].zN
11210 61 6d 65 2c 20 70 46 72 6f 6d 43 6f 6c 2d 3e 61  ame, pFromCol->a
11220 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b  [i].zName)==0 ){
11230 0a 20 20 20 20 20 20 20 20 20 20 70 46 4b 65 79  .          pFKey
11240 2d 3e 61 43 6f 6c 5b 69 5d 2e 69 46 72 6f 6d 20  ->aCol[i].iFrom 
11250 3d 20 6a 3b 0a 20 20 20 20 20 20 20 20 20 20 62  = j;.          b
11260 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  reak;.        }.
11270 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
11280 28 20 6a 3e 3d 70 2d 3e 6e 43 6f 6c 20 29 7b 0a  ( j>=p->nCol ){.
11290 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
112a0 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
112b0 0a 20 20 20 20 20 20 20 20 20 20 22 75 6e 6b 6e  .          "unkn
112c0 6f 77 6e 20 63 6f 6c 75 6d 6e 20 5c 22 25 73 5c  own column \"%s\
112d0 22 20 69 6e 20 66 6f 72 65 69 67 6e 20 6b 65 79  " in foreign key
112e0 20 64 65 66 69 6e 69 74 69 6f 6e 22 2c 20 0a 20   definition", . 
112f0 20 20 20 20 20 20 20 20 20 70 46 72 6f 6d 43 6f           pFromCo
11300 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a  l->a[i].zName);.
11310 20 20 20 20 20 20 20 20 67 6f 74 6f 20 66 6b 5f          goto fk_
11320 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  end;.      }.   
11330 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 54 6f   }.  }.  if( pTo
11340 43 6f 6c 20 29 7b 0a 20 20 20 20 66 6f 72 28 69  Col ){.    for(i
11350 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29  =0; i<nCol; i++)
11360 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20  {.      int n = 
11370 73 74 72 6c 65 6e 28 70 54 6f 43 6f 6c 2d 3e 61  strlen(pToCol->a
11380 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  [i].zName);.    
11390 20 20 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b 69 5d    pFKey->aCol[i]
113a0 2e 7a 43 6f 6c 20 3d 20 7a 3b 0a 20 20 20 20 20  .zCol = z;.     
113b0 20 6d 65 6d 63 70 79 28 7a 2c 20 70 54 6f 43 6f   memcpy(z, pToCo
113c0 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 6e  l->a[i].zName, n
113d0 29 3b 0a 20 20 20 20 20 20 7a 5b 6e 5d 20 3d 20  );.      z[n] = 
113e0 30 3b 0a 20 20 20 20 20 20 7a 20 2b 3d 20 6e 2b  0;.      z += n+
113f0 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70  1;.    }.  }.  p
11400 46 4b 65 79 2d 3e 69 73 44 65 66 65 72 72 65 64  FKey->isDeferred
11410 20 3d 20 30 3b 0a 20 20 70 46 4b 65 79 2d 3e 64   = 0;.  pFKey->d
11420 65 6c 65 74 65 43 6f 6e 66 20 3d 20 66 6c 61 67  eleteConf = flag
11430 73 20 26 20 30 78 66 66 3b 0a 20 20 70 46 4b 65  s & 0xff;.  pFKe
11440 79 2d 3e 75 70 64 61 74 65 43 6f 6e 66 20 3d 20  y->updateConf = 
11450 28 66 6c 61 67 73 20 3e 3e 20 38 20 29 20 26 20  (flags >> 8 ) & 
11460 30 78 66 66 3b 0a 20 20 70 46 4b 65 79 2d 3e 69  0xff;.  pFKey->i
11470 6e 73 65 72 74 43 6f 6e 66 20 3d 20 28 66 6c 61  nsertConf = (fla
11480 67 73 20 3e 3e 20 31 36 20 29 20 26 20 30 78 66  gs >> 16 ) & 0xf
11490 66 3b 0a 0a 20 20 2f 2a 20 4c 69 6e 6b 20 74 68  f;..  /* Link th
114a0 65 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 74 6f  e foreign key to
114b0 20 74 68 65 20 74 61 62 6c 65 20 61 73 20 74 68   the table as th
114c0 65 20 6c 61 73 74 20 73 74 65 70 2e 0a 20 20 2a  e last step..  *
114d0 2f 0a 20 20 70 2d 3e 70 46 4b 65 79 20 3d 20 70  /.  p->pFKey = p
114e0 46 4b 65 79 3b 0a 20 20 70 46 4b 65 79 20 3d 20  FKey;.  pFKey = 
114f0 30 3b 0a 0a 66 6b 5f 65 6e 64 3a 0a 20 20 73 71  0;..fk_end:.  sq
11500 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
11510 70 46 4b 65 79 29 3b 0a 23 65 6e 64 69 66 20 2f  pFKey);.#endif /
11520 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  * !defined(SQLIT
11530 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b  E_OMIT_FOREIGN_K
11540 45 59 29 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  EY) */.  sqlite3
11550 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64  ExprListDelete(d
11560 62 2c 20 70 46 72 6f 6d 43 6f 6c 29 3b 0a 20 20  b, pFromCol);.  
11570 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
11580 65 6c 65 74 65 28 64 62 2c 20 70 54 6f 43 6f 6c  elete(db, pToCol
11590 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  );.}../*.** This
115a0 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
115b0 65 64 20 77 68 65 6e 20 61 6e 20 49 4e 49 54 49  ed when an INITI
115c0 41 4c 4c 59 20 49 4d 4d 45 44 49 41 54 45 20 6f  ALLY IMMEDIATE o
115d0 72 20 49 4e 49 54 49 41 4c 4c 59 20 44 45 46 45  r INITIALLY DEFE
115e0 52 52 45 44 0a 2a 2a 20 63 6c 61 75 73 65 20 69  RRED.** clause i
115f0 73 20 73 65 65 6e 20 61 73 20 70 61 72 74 20 6f  s seen as part o
11600 66 20 61 20 66 6f 72 65 69 67 6e 20 6b 65 79 20  f a foreign key 
11610 64 65 66 69 6e 69 74 69 6f 6e 2e 20 20 54 68 65  definition.  The
11620 20 69 73 44 65 66 65 72 72 65 64 0a 2a 2a 20 70   isDeferred.** p
11630 61 72 61 6d 65 74 65 72 20 69 73 20 31 20 66 6f  arameter is 1 fo
11640 72 20 49 4e 49 54 49 41 4c 4c 59 20 44 45 46 45  r INITIALLY DEFE
11650 52 52 45 44 20 61 6e 64 20 30 20 66 6f 72 20 49  RRED and 0 for I
11660 4e 49 54 49 41 4c 4c 59 20 49 4d 4d 45 44 49 41  NITIALLY IMMEDIA
11670 54 45 2e 0a 2a 2a 20 54 68 65 20 62 65 68 61 76  TE..** The behav
11680 69 6f 72 20 6f 66 20 74 68 65 20 6d 6f 73 74 20  ior of the most 
11690 72 65 63 65 6e 74 6c 79 20 63 72 65 61 74 65 64  recently created
116a0 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 69 73 20   foreign key is 
116b0 61 64 6a 75 73 74 65 64 0a 2a 2a 20 61 63 63 6f  adjusted.** acco
116c0 72 64 69 6e 67 6c 79 2e 0a 2a 2f 0a 76 6f 69 64  rdingly..*/.void
116d0 20 73 71 6c 69 74 65 33 44 65 66 65 72 46 6f 72   sqlite3DeferFor
116e0 65 69 67 6e 4b 65 79 28 50 61 72 73 65 20 2a 70  eignKey(Parse *p
116f0 50 61 72 73 65 2c 20 69 6e 74 20 69 73 44 65 66  Parse, int isDef
11700 65 72 72 65 64 29 7b 0a 23 69 66 6e 64 65 66 20  erred){.#ifndef 
11710 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45  SQLITE_OMIT_FORE
11720 49 47 4e 5f 4b 45 59 0a 20 20 54 61 62 6c 65 20  IGN_KEY.  Table 
11730 2a 70 54 61 62 3b 0a 20 20 46 4b 65 79 20 2a 70  *pTab;.  FKey *p
11740 46 4b 65 79 3b 0a 20 20 69 66 28 20 28 70 54 61  FKey;.  if( (pTa
11750 62 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  b = pParse->pNew
11760 54 61 62 6c 65 29 3d 3d 30 20 7c 7c 20 28 70 46  Table)==0 || (pF
11770 4b 65 79 20 3d 20 70 54 61 62 2d 3e 70 46 4b 65  Key = pTab->pFKe
11780 79 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  y)==0 ) return;.
11790 20 20 70 46 4b 65 79 2d 3e 69 73 44 65 66 65 72    pFKey->isDefer
117a0 72 65 64 20 3d 20 69 73 44 65 66 65 72 72 65 64  red = isDeferred
117b0 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a  ;.#endif.}../*.*
117c0 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
117d0 74 68 61 74 20 77 69 6c 6c 20 65 72 61 73 65 20  that will erase 
117e0 61 6e 64 20 72 65 66 69 6c 6c 20 69 6e 64 65 78  and refill index
117f0 20 2a 70 49 64 78 2e 20 20 54 68 69 73 20 69 73   *pIdx.  This is
11800 0a 2a 2a 20 75 73 65 64 20 74 6f 20 69 6e 69 74  .** used to init
11810 69 61 6c 69 7a 65 20 61 20 6e 65 77 6c 79 20 63  ialize a newly c
11820 72 65 61 74 65 64 20 69 6e 64 65 78 20 6f 72 20  reated index or 
11830 74 6f 20 72 65 63 6f 6d 70 75 74 65 20 74 68 65  to recompute the
11840 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61  .** content of a
11850 6e 20 69 6e 64 65 78 20 69 6e 20 72 65 73 70 6f  n index in respo
11860 6e 73 65 20 74 6f 20 61 20 52 45 49 4e 44 45 58  nse to a REINDEX
11870 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20   command..**.** 
11880 69 66 20 6d 65 6d 52 6f 6f 74 50 61 67 65 20 69  if memRootPage i
11890 73 20 6e 6f 74 20 6e 65 67 61 74 69 76 65 2c 20  s not negative, 
118a0 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68  it means that th
118b0 65 20 69 6e 64 65 78 20 69 73 20 6e 65 77 6c 79  e index is newly
118c0 0a 2a 2a 20 63 72 65 61 74 65 64 2e 20 20 54 68  .** created.  Th
118d0 65 20 72 65 67 69 73 74 65 72 20 73 70 65 63 69  e register speci
118e0 66 69 65 64 20 62 79 20 6d 65 6d 52 6f 6f 74 50  fied by memRootP
118f0 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  age contains the
11900 0a 2a 2a 20 72 6f 6f 74 20 70 61 67 65 20 6e 75  .** root page nu
11910 6d 62 65 72 20 6f 66 20 74 68 65 20 69 6e 64 65  mber of the inde
11920 78 2e 20 20 49 66 20 6d 65 6d 52 6f 6f 74 50 61  x.  If memRootPa
11930 67 65 20 69 73 20 6e 65 67 61 74 69 76 65 2c 20  ge is negative, 
11940 74 68 65 6e 0a 2a 2a 20 74 68 65 20 69 6e 64 65  then.** the inde
11950 78 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73  x already exists
11960 20 61 6e 64 20 6d 75 73 74 20 62 65 20 63 6c 65   and must be cle
11970 61 72 65 64 20 62 65 66 6f 72 65 20 62 65 69 6e  ared before bein
11980 67 20 72 65 66 69 6c 6c 65 64 20 61 6e 64 0a 2a  g refilled and.*
11990 2a 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20  * the root page 
119a0 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 69 6e  number of the in
119b0 64 65 78 20 69 73 20 74 61 6b 65 6e 20 66 72 6f  dex is taken fro
119c0 6d 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 2e 0a  m pIndex->tnum..
119d0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
119e0 71 6c 69 74 65 33 52 65 66 69 6c 6c 49 6e 64 65  qlite3RefillInde
119f0 78 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  x(Parse *pParse,
11a00 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 2c 20   Index *pIndex, 
11a10 69 6e 74 20 6d 65 6d 52 6f 6f 74 50 61 67 65 29  int memRootPage)
11a20 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20  {.  Table *pTab 
11a30 3d 20 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65  = pIndex->pTable
11a40 3b 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20  ;  /* The table 
11a50 74 68 61 74 20 69 73 20 69 6e 64 65 78 65 64 20  that is indexed 
11a60 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 20 3d 20  */.  int iTab = 
11a70 70 50 61 72 73 65 2d 3e 6e 54 61 62 3b 20 20 20  pParse->nTab;   
11a80 20 20 20 20 2f 2a 20 42 74 72 65 65 20 63 75 72      /* Btree cur
11a90 73 6f 72 20 75 73 65 64 20 66 6f 72 20 70 54 61  sor used for pTa
11aa0 62 20 2a 2f 0a 20 20 69 6e 74 20 69 49 64 78 20  b */.  int iIdx 
11ab0 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 31  = pParse->nTab+1
11ac0 3b 20 20 20 20 20 2f 2a 20 42 74 72 65 65 20 63  ;     /* Btree c
11ad0 75 72 73 6f 72 20 75 73 65 64 20 66 6f 72 20 70  ursor used for p
11ae0 49 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 61  Index */.  int a
11af0 64 64 72 31 3b 20 20 20 20 20 20 20 20 20 20 20  ddr1;           
11b00 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
11b10 72 65 73 73 20 6f 66 20 74 6f 70 20 6f 66 20 6c  ress of top of l
11b20 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 74 6e 75  oop */.  int tnu
11b30 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m;              
11b40 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20          /* Root 
11b50 70 61 67 65 20 6f 66 20 69 6e 64 65 78 20 2a 2f  page of index */
11b60 0a 20 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20  .  Vdbe *v;     
11b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11b80 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f    /* Generate co
11b90 64 65 20 69 6e 74 6f 20 74 68 69 73 20 76 69 72  de into this vir
11ba0 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 2a 2f 0a  tual machine */.
11bb0 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 3b    KeyInfo *pKey;
11bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11bd0 20 2f 2a 20 4b 65 79 49 6e 66 6f 20 66 6f 72 20   /* KeyInfo for 
11be0 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 72  index */.  int r
11bf0 65 67 49 64 78 4b 65 79 3b 20 20 20 20 20 20 20  egIdxKey;       
11c00 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67            /* Reg
11c10 69 73 74 65 72 73 20 63 6f 6e 74 61 69 6e 69 6e  isters containin
11c20 67 20 74 68 65 20 69 6e 64 65 78 20 6b 65 79 20  g the index key 
11c30 2a 2f 0a 20 20 69 6e 74 20 72 65 67 52 65 63 6f  */.  int regReco
11c40 72 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rd;             
11c50 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20      /* Register 
11c60 68 6f 6c 64 69 6e 67 20 61 73 73 65 6d 62 6c 69  holding assembli
11c70 65 64 20 69 6e 64 65 78 20 72 65 63 6f 72 64 20  ed index record 
11c80 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
11c90 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20   = pParse->db;  
11ca0 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62      /* The datab
11cb0 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a  ase connection *
11cc0 2f 0a 20 20 69 6e 74 20 69 44 62 20 3d 20 73 71  /.  int iDb = sq
11cd0 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64  lite3SchemaToInd
11ce0 65 78 28 64 62 2c 20 70 49 6e 64 65 78 2d 3e 70  ex(db, pIndex->p
11cf0 53 63 68 65 6d 61 29 3b 0a 0a 23 69 66 6e 64 65  Schema);..#ifnde
11d00 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
11d10 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 69 66  THORIZATION.  if
11d20 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65  ( sqlite3AuthChe
11d30 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54  ck(pParse, SQLIT
11d40 45 5f 52 45 49 4e 44 45 58 2c 20 70 49 6e 64 65  E_REINDEX, pInde
11d50 78 2d 3e 7a 4e 61 6d 65 2c 20 30 2c 0a 20 20 20  x->zName, 0,.   
11d60 20 20 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e     db->aDb[iDb].
11d70 7a 4e 61 6d 65 20 29 20 29 7b 0a 20 20 20 20 72  zName ) ){.    r
11d80 65 74 75 72 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69  eturn;.  }.#endi
11d90 66 0a 0a 20 20 2f 2a 20 52 65 71 75 69 72 65 20  f..  /* Require 
11da0 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20  a write-lock on 
11db0 74 68 65 20 74 61 62 6c 65 20 74 6f 20 70 65 72  the table to per
11dc0 66 6f 72 6d 20 74 68 69 73 20 6f 70 65 72 61 74  form this operat
11dd0 69 6f 6e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ion */.  sqlite3
11de0 54 61 62 6c 65 4c 6f 63 6b 28 70 50 61 72 73 65  TableLock(pParse
11df0 2c 20 69 44 62 2c 20 70 54 61 62 2d 3e 74 6e 75  , iDb, pTab->tnu
11e00 6d 2c 20 31 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  m, 1, pTab->zNam
11e10 65 29 3b 0a 0a 20 20 76 20 3d 20 73 71 6c 69 74  e);..  v = sqlit
11e20 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
11e30 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20  );.  if( v==0 ) 
11e40 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 6d 65  return;.  if( me
11e50 6d 52 6f 6f 74 50 61 67 65 3e 3d 30 20 29 7b 0a  mRootPage>=0 ){.
11e60 20 20 20 20 74 6e 75 6d 20 3d 20 6d 65 6d 52 6f      tnum = memRo
11e70 6f 74 50 61 67 65 3b 0a 20 20 7d 65 6c 73 65 7b  otPage;.  }else{
11e80 0a 20 20 20 20 74 6e 75 6d 20 3d 20 70 49 6e 64  .    tnum = pInd
11e90 65 78 2d 3e 74 6e 75 6d 3b 0a 20 20 20 20 73 71  ex->tnum;.    sq
11ea0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
11eb0 76 2c 20 4f 50 5f 43 6c 65 61 72 2c 20 74 6e 75  v, OP_Clear, tnu
11ec0 6d 2c 20 69 44 62 29 3b 0a 20 20 7d 0a 20 20 70  m, iDb);.  }.  p
11ed0 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 49 6e 64  Key = sqlite3Ind
11ee0 65 78 4b 65 79 69 6e 66 6f 28 70 50 61 72 73 65  exKeyinfo(pParse
11ef0 2c 20 70 49 6e 64 65 78 29 3b 0a 20 20 73 71 6c  , pIndex);.  sql
11f00 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
11f10 2c 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65 2c 20  , OP_OpenWrite, 
11f20 69 49 64 78 2c 20 74 6e 75 6d 2c 20 69 44 62 2c  iIdx, tnum, iDb,
11f30 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
11f40 20 20 20 20 20 20 28 63 68 61 72 20 2a 29 70 4b        (char *)pK
11f50 65 79 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 5f 48  ey, P4_KEYINFO_H
11f60 41 4e 44 4f 46 46 29 3b 0a 20 20 69 66 28 20 6d  ANDOFF);.  if( m
11f70 65 6d 52 6f 6f 74 50 61 67 65 3e 3d 30 20 29 7b  emRootPage>=0 ){
11f80 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
11f90 43 68 61 6e 67 65 50 35 28 76 2c 20 31 29 3b 0a  ChangeP5(v, 1);.
11fa0 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 4f 70 65    }.  sqlite3Ope
11fb0 6e 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 69  nTable(pParse, i
11fc0 54 61 62 2c 20 69 44 62 2c 20 70 54 61 62 2c 20  Tab, iDb, pTab, 
11fd0 4f 50 5f 4f 70 65 6e 52 65 61 64 29 3b 0a 20 20  OP_OpenRead);.  
11fe0 61 64 64 72 31 20 3d 20 73 71 6c 69 74 65 33 56  addr1 = sqlite3V
11ff0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
12000 52 65 77 69 6e 64 2c 20 69 54 61 62 2c 20 30 29  Rewind, iTab, 0)
12010 3b 0a 20 20 72 65 67 52 65 63 6f 72 64 20 3d 20  ;.  regRecord = 
12020 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
12030 67 28 70 50 61 72 73 65 29 3b 0a 20 20 72 65 67  g(pParse);.  reg
12040 49 64 78 4b 65 79 20 3d 20 73 71 6c 69 74 65 33  IdxKey = sqlite3
12050 47 65 6e 65 72 61 74 65 49 6e 64 65 78 4b 65 79  GenerateIndexKey
12060 28 70 50 61 72 73 65 2c 20 70 49 6e 64 65 78 2c  (pParse, pIndex,
12070 20 69 54 61 62 2c 20 72 65 67 52 65 63 6f 72 64   iTab, regRecord
12080 2c 20 31 29 3b 0a 20 20 69 66 28 20 70 49 6e 64  , 1);.  if( pInd
12090 65 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f  ex->onError!=OE_
120a0 4e 6f 6e 65 20 29 7b 0a 20 20 20 20 69 6e 74 20  None ){.    int 
120b0 6a 31 2c 20 6a 32 3b 0a 20 20 20 20 69 6e 74 20  j1, j2;.    int 
120c0 72 65 67 52 6f 77 69 64 3b 0a 0a 20 20 20 20 72  regRowid;..    r
120d0 65 67 52 6f 77 69 64 20 3d 20 72 65 67 49 64 78  egRowid = regIdx
120e0 4b 65 79 20 2b 20 70 49 6e 64 65 78 2d 3e 6e 43  Key + pIndex->nC
120f0 6f 6c 75 6d 6e 3b 0a 20 20 20 20 6a 31 20 3d 20  olumn;.    j1 = 
12100 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
12110 33 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20  3(v, OP_IsNull, 
12120 72 65 67 49 64 78 4b 65 79 2c 20 30 2c 20 70 49  regIdxKey, 0, pI
12130 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 29 3b 0a  ndex->nColumn);.
12140 20 20 20 20 6a 32 20 3d 20 73 71 6c 69 74 65 33      j2 = sqlite3
12150 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
12160 5f 49 73 55 6e 69 71 75 65 2c 20 69 49 64 78 2c  _IsUnique, iIdx,
12170 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
12180 20 20 20 20 20 20 20 20 20 20 20 20 30 2c 20 72              0, r
12190 65 67 52 6f 77 69 64 2c 20 53 51 4c 49 54 45 5f  egRowid, SQLITE_
121a0 49 4e 54 5f 54 4f 5f 50 54 52 28 72 65 67 52 65  INT_TO_PTR(regRe
121b0 63 6f 72 64 29 2c 20 50 34 5f 49 4e 54 33 32 29  cord), P4_INT32)
121c0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
121d0 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 48 61  eAddOp4(v, OP_Ha
121e0 6c 74 2c 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54  lt, SQLITE_CONST
121f0 52 41 49 4e 54 2c 20 4f 45 5f 41 62 6f 72 74 2c  RAINT, OE_Abort,
12200 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   0,.            
12210 20 20 20 20 20 20 20 20 22 69 6e 64 65 78 65 64          "indexed
12220 20 63 6f 6c 75 6d 6e 73 20 61 72 65 20 6e 6f 74   columns are not
12230 20 75 6e 69 71 75 65 22 2c 20 50 34 5f 53 54 41   unique", P4_STA
12240 54 49 43 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  TIC);.    sqlite
12250 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
12260 20 6a 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65   j1);.    sqlite
12270 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
12280 20 6a 32 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69   j2);.  }.  sqli
12290 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
122a0 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 69   OP_IdxInsert, i
122b0 49 64 78 2c 20 72 65 67 52 65 63 6f 72 64 29 3b  Idx, regRecord);
122c0 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73  .  sqlite3Releas
122d0 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
122e0 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 73   regRecord);.  s
122f0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
12300 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 69 54 61  (v, OP_Next, iTa
12310 62 2c 20 61 64 64 72 31 2b 31 29 3b 0a 20 20 73  b, addr1+1);.  s
12320 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
12330 72 65 28 76 2c 20 61 64 64 72 31 29 3b 0a 20 20  re(v, addr1);.  
12340 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
12350 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 69  1(v, OP_Close, i
12360 54 61 62 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  Tab);.  sqlite3V
12370 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
12380 43 6c 6f 73 65 2c 20 69 49 64 78 29 3b 0a 7d 0a  Close, iIdx);.}.
12390 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20  ./*.** Create a 
123a0 6e 65 77 20 69 6e 64 65 78 20 66 6f 72 20 61 6e  new index for an
123b0 20 53 51 4c 20 74 61 62 6c 65 2e 20 20 70 4e 61   SQL table.  pNa
123c0 6d 65 31 2e 70 4e 61 6d 65 32 20 69 73 20 74 68  me1.pName2 is th
123d0 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 69 6e  e name of the in
123e0 64 65 78 20 0a 2a 2a 20 61 6e 64 20 70 54 62 6c  dex .** and pTbl
123f0 4c 69 73 74 20 69 73 20 74 68 65 20 6e 61 6d 65  List is the name
12400 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74 68   of the table th
12410 61 74 20 69 73 20 74 6f 20 62 65 20 69 6e 64 65  at is to be inde
12420 78 65 64 2e 20 20 42 6f 74 68 20 77 69 6c 6c 20  xed.  Both will 
12430 0a 2a 2a 20 62 65 20 4e 55 4c 4c 20 66 6f 72 20  .** be NULL for 
12440 61 20 70 72 69 6d 61 72 79 20 6b 65 79 20 6f 72  a primary key or
12450 20 61 6e 20 69 6e 64 65 78 20 74 68 61 74 20 69   an index that i
12460 73 20 63 72 65 61 74 65 64 20 74 6f 20 73 61 74  s created to sat
12470 69 73 66 79 20 61 0a 2a 2a 20 55 4e 49 51 55 45  isfy a.** UNIQUE
12480 20 63 6f 6e 73 74 72 61 69 6e 74 2e 20 20 49 66   constraint.  If
12490 20 70 54 61 62 6c 65 20 61 6e 64 20 70 49 6e 64   pTable and pInd
124a0 65 78 20 61 72 65 20 4e 55 4c 4c 2c 20 75 73 65  ex are NULL, use
124b0 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
124c0 6c 65 0a 2a 2a 20 61 73 20 74 68 65 20 74 61 62  le.** as the tab
124d0 6c 65 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64  le to be indexed
124e0 2e 20 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54  .  pParse->pNewT
124f0 61 62 6c 65 20 69 73 20 61 20 74 61 62 6c 65 20  able is a table 
12500 74 68 61 74 20 69 73 0a 2a 2a 20 63 75 72 72 65  that is.** curre
12510 6e 74 6c 79 20 62 65 69 6e 67 20 63 6f 6e 73 74  ntly being const
12520 72 75 63 74 65 64 20 62 79 20 61 20 43 52 45 41  ructed by a CREA
12530 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65  TE TABLE stateme
12540 6e 74 2e 0a 2a 2a 0a 2a 2a 20 70 4c 69 73 74 20  nt..**.** pList 
12550 69 73 20 61 20 6c 69 73 74 20 6f 66 20 63 6f 6c  is a list of col
12560 75 6d 6e 73 20 74 6f 20 62 65 20 69 6e 64 65 78  umns to be index
12570 65 64 2e 20 20 70 4c 69 73 74 20 77 69 6c 6c 20  ed.  pList will 
12580 62 65 20 4e 55 4c 4c 20 69 66 20 74 68 69 73 0a  be NULL if this.
12590 2a 2a 20 69 73 20 61 20 70 72 69 6d 61 72 79 20  ** is a primary 
125a0 6b 65 79 20 6f 72 20 75 6e 69 71 75 65 2d 63 6f  key or unique-co
125b0 6e 73 74 72 61 69 6e 74 20 6f 6e 20 74 68 65 20  nstraint on the 
125c0 6d 6f 73 74 20 72 65 63 65 6e 74 20 63 6f 6c 75  most recent colu
125d0 6d 6e 20 61 64 64 65 64 0a 2a 2a 20 74 6f 20 74  mn added.** to t
125e0 68 65 20 74 61 62 6c 65 20 63 75 72 72 65 6e 74  he table current
125f0 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75  ly under constru
12600 63 74 69 6f 6e 2e 20 20 0a 2a 2f 0a 76 6f 69 64  ction.  .*/.void
12610 20 73 71 6c 69 74 65 33 43 72 65 61 74 65 49 6e   sqlite3CreateIn
12620 64 65 78 28 0a 20 20 50 61 72 73 65 20 2a 70 50  dex(.  Parse *pP
12630 61 72 73 65 2c 20 20 20 20 20 2f 2a 20 41 6c 6c  arse,     /* All
12640 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f   information abo
12650 75 74 20 74 68 69 73 20 70 61 72 73 65 20 2a 2f  ut this parse */
12660 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31  .  Token *pName1
12670 2c 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 70  ,     /* First p
12680 61 72 74 20 6f 66 20 69 6e 64 65 78 20 6e 61 6d  art of index nam
12690 65 2e 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a  e. May be NULL *
126a0 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65  /.  Token *pName
126b0 32 2c 20 20 20 20 20 2f 2a 20 53 65 63 6f 6e 64  2,     /* Second
126c0 20 70 61 72 74 20 6f 66 20 69 6e 64 65 78 20 6e   part of index n
126d0 61 6d 65 2e 20 4d 61 79 20 62 65 20 4e 55 4c 4c  ame. May be NULL
126e0 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70   */.  SrcList *p
126f0 54 62 6c 4e 61 6d 65 2c 20 2f 2a 20 54 61 62 6c  TblName, /* Tabl
12700 65 20 74 6f 20 69 6e 64 65 78 2e 20 55 73 65 20  e to index. Use 
12710 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
12720 65 20 69 66 20 30 20 2a 2f 0a 20 20 45 78 70 72  e if 0 */.  Expr
12730 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 2f  List *pList,   /
12740 2a 20 41 20 6c 69 73 74 20 6f 66 20 63 6f 6c 75  * A list of colu
12750 6d 6e 73 20 74 6f 20 62 65 20 69 6e 64 65 78 65  mns to be indexe
12760 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 6e 45 72 72  d */.  int onErr
12770 6f 72 2c 20 20 20 20 20 20 20 2f 2a 20 4f 45 5f  or,       /* OE_
12780 41 62 6f 72 74 2c 20 4f 45 5f 49 67 6e 6f 72 65  Abort, OE_Ignore
12790 2c 20 4f 45 5f 52 65 70 6c 61 63 65 2c 20 6f 72  , OE_Replace, or
127a0 20 4f 45 5f 4e 6f 6e 65 20 2a 2f 0a 20 20 54 6f   OE_None */.  To
127b0 6b 65 6e 20 2a 70 53 74 61 72 74 2c 20 20 20 20  ken *pStart,    
127c0 20 2f 2a 20 54 68 65 20 43 52 45 41 54 45 20 74   /* The CREATE t
127d0 6f 6b 65 6e 20 74 68 61 74 20 62 65 67 69 6e 73  oken that begins
127e0 20 74 68 69 73 20 73 74 61 74 65 6d 65 6e 74 20   this statement 
127f0 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 45 6e 64  */.  Token *pEnd
12800 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 22  ,       /* The "
12810 29 22 20 74 68 61 74 20 63 6c 6f 73 65 73 20 74  )" that closes t
12820 68 65 20 43 52 45 41 54 45 20 49 4e 44 45 58 20  he CREATE INDEX 
12830 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69  statement */.  i
12840 6e 74 20 73 6f 72 74 4f 72 64 65 72 2c 20 20 20  nt sortOrder,   
12850 20 20 2f 2a 20 53 6f 72 74 20 6f 72 64 65 72 20    /* Sort order 
12860 6f 66 20 70 72 69 6d 61 72 79 20 6b 65 79 20 77  of primary key w
12870 68 65 6e 20 70 4c 69 73 74 3d 3d 4e 55 4c 4c 20  hen pList==NULL 
12880 2a 2f 0a 20 20 69 6e 74 20 69 66 4e 6f 74 45 78  */.  int ifNotEx
12890 69 73 74 20 20 20 20 20 2f 2a 20 4f 6d 69 74 20  ist     /* Omit 
128a0 65 72 72 6f 72 20 69 66 20 69 6e 64 65 78 20 61  error if index a
128b0 6c 72 65 61 64 79 20 65 78 69 73 74 73 20 2a 2f  lready exists */
128c0 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61  .){.  Table *pTa
128d0 62 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 54 61  b = 0;     /* Ta
128e0 62 6c 65 20 74 6f 20 62 65 20 69 6e 64 65 78 65  ble to be indexe
128f0 64 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49  d */.  Index *pI
12900 6e 64 65 78 20 3d 20 30 3b 20 20 20 2f 2a 20 54  ndex = 0;   /* T
12910 68 65 20 69 6e 64 65 78 20 74 6f 20 62 65 20 63  he index to be c
12920 72 65 61 74 65 64 20 2a 2f 0a 20 20 63 68 61 72  reated */.  char
12930 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b 20 20 20 20   *zName = 0;    
12940 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
12950 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 6e  index */.  int n
12960 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20  Name;           
12970 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 68 61  /* Number of cha
12980 72 61 63 74 65 72 73 20 69 6e 20 7a 4e 61 6d 65  racters in zName
12990 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a   */.  int i, j;.
129a0 20 20 54 6f 6b 65 6e 20 6e 75 6c 6c 49 64 3b 20    Token nullId; 
129b0 20 20 20 20 20 20 20 2f 2a 20 46 61 6b 65 20 74         /* Fake t
129c0 6f 6b 65 6e 20 66 6f 72 20 61 6e 20 65 6d 70 74  oken for an empt
129d0 79 20 49 44 20 6c 69 73 74 20 2a 2f 0a 20 20 44  y ID list */.  D
129e0 62 46 69 78 65 72 20 73 46 69 78 3b 20 20 20 20  bFixer sFix;    
129f0 20 20 20 20 2f 2a 20 46 6f 72 20 61 73 73 69 67      /* For assig
12a00 6e 69 6e 67 20 64 61 74 61 62 61 73 65 20 6e 61  ning database na
12a10 6d 65 73 20 74 6f 20 70 54 61 62 6c 65 20 2a 2f  mes to pTable */
12a20 0a 20 20 69 6e 74 20 73 6f 72 74 4f 72 64 65 72  .  int sortOrder
12a30 4d 61 73 6b 3b 20 20 20 2f 2a 20 31 20 74 6f 20  Mask;   /* 1 to 
12a40 68 6f 6e 6f 72 20 44 45 53 43 20 69 6e 20 69 6e  honor DESC in in
12a50 64 65 78 2e 20 20 30 20 74 6f 20 69 67 6e 6f 72  dex.  0 to ignor
12a60 65 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  e. */.  sqlite3 
12a70 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
12a80 3b 0a 20 20 44 62 20 2a 70 44 62 3b 20 20 20 20  ;.  Db *pDb;    
12a90 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
12aa0 73 70 65 63 69 66 69 63 20 74 61 62 6c 65 20 63  specific table c
12ab0 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 69 6e  ontaining the in
12ac0 64 65 78 65 64 20 64 61 74 61 62 61 73 65 20 2a  dexed database *
12ad0 2f 0a 20 20 69 6e 74 20 69 44 62 3b 20 20 20 20  /.  int iDb;    
12ae0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
12af0 78 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  x of the databas
12b00 65 20 74 68 61 74 20 69 73 20 62 65 69 6e 67 20  e that is being 
12b10 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20 54 6f 6b  written */.  Tok
12b20 65 6e 20 2a 70 4e 61 6d 65 20 3d 20 30 3b 20 20  en *pName = 0;  
12b30 20 20 2f 2a 20 55 6e 71 75 61 6c 69 66 69 65 64    /* Unqualified
12b40 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 69 6e 64   name of the ind
12b50 65 78 20 74 6f 20 63 72 65 61 74 65 20 2a 2f 0a  ex to create */.
12b60 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
12b70 74 5f 69 74 65 6d 20 2a 70 4c 69 73 74 49 74 65  t_item *pListIte
12b80 6d 3b 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e  m; /* For loopin
12b90 67 20 6f 76 65 72 20 70 4c 69 73 74 20 2a 2f 0a  g over pList */.
12ba0 20 20 69 6e 74 20 6e 43 6f 6c 3b 0a 20 20 69 6e    int nCol;.  in
12bb0 74 20 6e 45 78 74 72 61 20 3d 20 30 3b 0a 20 20  t nExtra = 0;.  
12bc0 63 68 61 72 20 2a 7a 45 78 74 72 61 3b 0a 0a 20  char *zExtra;.. 
12bd0 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72   if( pParse->nEr
12be0 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  r || db->mallocF
12bf0 61 69 6c 65 64 20 7c 7c 20 49 4e 5f 44 45 43 4c  ailed || IN_DECL
12c00 41 52 45 5f 56 54 41 42 20 29 7b 0a 20 20 20 20  ARE_VTAB ){.    
12c10 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
12c20 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 0a 20 20 2f  _index;.  }..  /
12c30 2a 0a 20 20 2a 2a 20 46 69 6e 64 20 74 68 65 20  *.  ** Find the 
12c40 74 61 62 6c 65 20 74 68 61 74 20 69 73 20 74 6f  table that is to
12c50 20 62 65 20 69 6e 64 65 78 65 64 2e 20 20 52 65   be indexed.  Re
12c60 74 75 72 6e 20 65 61 72 6c 79 20 69 66 20 6e 6f  turn early if no
12c70 74 20 66 6f 75 6e 64 2e 0a 20 20 2a 2f 0a 20 20  t found..  */.  
12c80 69 66 28 20 70 54 62 6c 4e 61 6d 65 21 3d 30 20  if( pTblName!=0 
12c90 29 7b 0a 0a 20 20 20 20 2f 2a 20 55 73 65 20 74  ){..    /* Use t
12ca0 68 65 20 74 77 6f 2d 70 61 72 74 20 69 6e 64 65  he two-part inde
12cb0 78 20 6e 61 6d 65 20 74 6f 20 64 65 74 65 72 6d  x name to determ
12cc0 69 6e 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ine the database
12cd0 20 0a 20 20 20 20 2a 2a 20 74 6f 20 73 65 61 72   .    ** to sear
12ce0 63 68 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65  ch for the table
12cf0 2e 20 27 46 69 78 27 20 74 68 65 20 74 61 62 6c  . 'Fix' the tabl
12d00 65 20 6e 61 6d 65 20 74 6f 20 74 68 69 73 20 64  e name to this d
12d10 62 0a 20 20 20 20 2a 2a 20 62 65 66 6f 72 65 20  b.    ** before 
12d20 6c 6f 6f 6b 69 6e 67 20 75 70 20 74 68 65 20 74  looking up the t
12d30 61 62 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  able..    */.   
12d40 20 61 73 73 65 72 74 28 20 70 4e 61 6d 65 31 20   assert( pName1 
12d50 26 26 20 70 4e 61 6d 65 32 20 29 3b 0a 20 20 20  && pName2 );.   
12d60 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 54 77   iDb = sqlite3Tw
12d70 6f 50 61 72 74 4e 61 6d 65 28 70 50 61 72 73 65  oPartName(pParse
12d80 2c 20 70 4e 61 6d 65 31 2c 20 70 4e 61 6d 65 32  , pName1, pName2
12d90 2c 20 26 70 4e 61 6d 65 29 3b 0a 20 20 20 20 69  , &pName);.    i
12da0 66 28 20 69 44 62 3c 30 20 29 20 67 6f 74 6f 20  f( iDb<0 ) goto 
12db0 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
12dc0 78 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  x;..#ifndef SQLI
12dd0 54 45 5f 4f 4d 49 54 5f 54 45 4d 50 44 42 0a 20  TE_OMIT_TEMPDB. 
12de0 20 20 20 2f 2a 20 49 66 20 74 68 65 20 69 6e 64     /* If the ind
12df0 65 78 20 6e 61 6d 65 20 77 61 73 20 75 6e 71 75  ex name was unqu
12e00 61 6c 69 66 69 65 64 2c 20 63 68 65 63 6b 20 69  alified, check i
12e10 66 20 74 68 65 20 74 68 65 20 74 61 62 6c 65 0a  f the the table.
12e20 20 20 20 20 2a 2a 20 69 73 20 61 20 74 65 6d 70      ** is a temp
12e30 20 74 61 62 6c 65 2e 20 49 66 20 73 6f 2c 20 73   table. If so, s
12e40 65 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20  et the database 
12e50 74 6f 20 31 2e 20 44 6f 20 6e 6f 74 20 64 6f 20  to 1. Do not do 
12e60 74 68 69 73 0a 20 20 20 20 2a 2a 20 69 66 20 69  this.    ** if i
12e70 6e 69 74 69 61 6c 69 73 69 6e 67 20 61 20 64 61  nitialising a da
12e80 74 61 62 61 73 65 20 73 63 68 65 6d 61 2e 0a 20  tabase schema.. 
12e90 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 64     */.    if( !d
12ea0 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a  b->init.busy ){.
12eb0 20 20 20 20 20 20 70 54 61 62 20 3d 20 73 71 6c        pTab = sql
12ec0 69 74 65 33 53 72 63 4c 69 73 74 4c 6f 6f 6b 75  ite3SrcListLooku
12ed0 70 28 70 50 61 72 73 65 2c 20 70 54 62 6c 4e 61  p(pParse, pTblNa
12ee0 6d 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  me);.      if( p
12ef0 4e 61 6d 65 32 20 26 26 20 70 4e 61 6d 65 32 2d  Name2 && pName2-
12f00 3e 6e 3d 3d 30 20 26 26 20 70 54 61 62 20 26 26  >n==0 && pTab &&
12f10 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 3d 3d   pTab->pSchema==
12f20 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 53 63 68 65  db->aDb[1].pSche
12f30 6d 61 20 29 7b 0a 20 20 20 20 20 20 20 20 69 44  ma ){.        iD
12f40 62 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  b = 1;.      }. 
12f50 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20     }.#endif..   
12f60 20 69 66 28 20 73 71 6c 69 74 65 33 46 69 78 49   if( sqlite3FixI
12f70 6e 69 74 28 26 73 46 69 78 2c 20 70 50 61 72 73  nit(&sFix, pPars
12f80 65 2c 20 69 44 62 2c 20 22 69 6e 64 65 78 22 2c  e, iDb, "index",
12f90 20 70 4e 61 6d 65 29 20 26 26 0a 20 20 20 20 20   pName) &&.     
12fa0 20 20 20 73 71 6c 69 74 65 33 46 69 78 53 72 63     sqlite3FixSrc
12fb0 4c 69 73 74 28 26 73 46 69 78 2c 20 70 54 62 6c  List(&sFix, pTbl
12fc0 4e 61 6d 65 29 0a 20 20 20 20 29 7b 0a 20 20 20  Name).    ){.   
12fd0 20 20 20 2f 2a 20 42 65 63 61 75 73 65 20 74 68     /* Because th
12fe0 65 20 70 61 72 73 65 72 20 63 6f 6e 73 74 72 75  e parser constru
12ff0 63 74 73 20 70 54 62 6c 4e 61 6d 65 20 66 72 6f  cts pTblName fro
13000 6d 20 61 20 73 69 6e 67 6c 65 20 69 64 65 6e 74  m a single ident
13010 69 66 69 65 72 2c 0a 20 20 20 20 20 20 2a 2a 20  ifier,.      ** 
13020 73 71 6c 69 74 65 33 46 69 78 53 72 63 4c 69 73  sqlite3FixSrcLis
13030 74 20 63 61 6e 20 6e 65 76 65 72 20 66 61 69 6c  t can never fail
13040 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72  . */.      asser
13050 74 28 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  t(0);.    }.    
13060 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33 4c 6f  pTab = sqlite3Lo
13070 63 61 74 65 54 61 62 6c 65 28 70 50 61 72 73 65  cateTable(pParse
13080 2c 20 30 2c 20 70 54 62 6c 4e 61 6d 65 2d 3e 61  , 0, pTblName->a
13090 5b 30 5d 2e 7a 4e 61 6d 65 2c 20 0a 20 20 20 20  [0].zName, .    
130a0 20 20 20 20 70 54 62 6c 4e 61 6d 65 2d 3e 61 5b      pTblName->a[
130b0 30 5d 2e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20  0].zDatabase);. 
130c0 20 20 20 69 66 28 20 21 70 54 61 62 20 29 20 67     if( !pTab ) g
130d0 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
130e0 69 6e 64 65 78 3b 0a 20 20 20 20 61 73 73 65 72  index;.    asser
130f0 74 28 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e  t( db->aDb[iDb].
13100 70 53 63 68 65 6d 61 3d 3d 70 54 61 62 2d 3e 70  pSchema==pTab->p
13110 53 63 68 65 6d 61 20 29 3b 0a 20 20 7d 65 6c 73  Schema );.  }els
13120 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  e{.    assert( p
13130 4e 61 6d 65 3d 3d 30 20 29 3b 0a 20 20 20 20 70  Name==0 );.    p
13140 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e  Tab = pParse->pN
13150 65 77 54 61 62 6c 65 3b 0a 20 20 20 20 69 66 28  ewTable;.    if(
13160 20 21 70 54 61 62 20 29 20 67 6f 74 6f 20 65 78   !pTab ) goto ex
13170 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
13180 0a 20 20 20 20 69 44 62 20 3d 20 73 71 6c 69 74  .    iDb = sqlit
13190 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28  e3SchemaToIndex(
131a0 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d  db, pTab->pSchem
131b0 61 29 3b 0a 20 20 7d 0a 20 20 70 44 62 20 3d 20  a);.  }.  pDb = 
131c0 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a 0a  &db->aDb[iDb];..
131d0 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20 7c 7c    if( pTab==0 ||
131e0 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 20   pParse->nErr ) 
131f0 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
13200 5f 69 6e 64 65 78 3b 0a 20 20 69 66 28 20 70 54  _index;.  if( pT
13210 61 62 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a  ab->readOnly ){.
13220 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
13230 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 61 62  Msg(pParse, "tab
13240 6c 65 20 25 73 20 6d 61 79 20 6e 6f 74 20 62 65  le %s may not be
13250 20 69 6e 64 65 78 65 64 22 2c 20 70 54 61 62 2d   indexed", pTab-
13260 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 67 6f 74  >zName);.    got
13270 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
13280 64 65 78 3b 0a 20 20 7d 0a 23 69 66 6e 64 65 66  dex;.  }.#ifndef
13290 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45   SQLITE_OMIT_VIE
132a0 57 0a 20 20 69 66 28 20 70 54 61 62 2d 3e 70 53  W.  if( pTab->pS
132b0 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 73 71 6c  elect ){.    sql
132c0 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
132d0 72 73 65 2c 20 22 76 69 65 77 73 20 6d 61 79 20  rse, "views may 
132e0 6e 6f 74 20 62 65 20 69 6e 64 65 78 65 64 22 29  not be indexed")
132f0 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f  ;.    goto exit_
13300 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
13310 7d 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 66  }.#endif.#ifndef
13320 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
13330 54 55 41 4c 54 41 42 4c 45 0a 20 20 69 66 28 20  TUALTABLE.  if( 
13340 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20  IsVirtual(pTab) 
13350 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
13360 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
13370 76 69 72 74 75 61 6c 20 74 61 62 6c 65 73 20 6d  virtual tables m
13380 61 79 20 6e 6f 74 20 62 65 20 69 6e 64 65 78 65  ay not be indexe
13390 64 22 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78  d");.    goto ex
133a0 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
133b0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  .  }.#endif..  /
133c0 2a 0a 20 20 2a 2a 20 46 69 6e 64 20 74 68 65 20  *.  ** Find the 
133d0 6e 61 6d 65 20 6f 66 20 74 68 65 20 69 6e 64 65  name of the inde
133e0 78 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 74 68  x.  Make sure th
133f0 65 72 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61  ere is not alrea
13400 64 79 20 61 6e 6f 74 68 65 72 0a 20 20 2a 2a 20  dy another.  ** 
13410 69 6e 64 65 78 20 6f 72 20 74 61 62 6c 65 20 77  index or table w
13420 69 74 68 20 74 68 65 20 73 61 6d 65 20 6e 61 6d  ith the same nam
13430 65 2e 20 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45  e.  .  **.  ** E
13440 78 63 65 70 74 69 6f 6e 3a 20 20 49 66 20 77 65  xception:  If we
13450 20 61 72 65 20 72 65 61 64 69 6e 67 20 74 68 65   are reading the
13460 20 6e 61 6d 65 73 20 6f 66 20 70 65 72 6d 61 6e   names of perman
13470 65 6e 74 20 69 6e 64 69 63 65 73 20 66 72 6f 6d  ent indices from
13480 20 74 68 65 0a 20 20 2a 2a 20 73 71 6c 69 74 65   the.  ** sqlite
13490 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20 28 62  _master table (b
134a0 65 63 61 75 73 65 20 73 6f 6d 65 20 6f 74 68 65  ecause some othe
134b0 72 20 70 72 6f 63 65 73 73 20 63 68 61 6e 67 65  r process change
134c0 64 20 74 68 65 20 73 63 68 65 6d 61 29 20 61 6e  d the schema) an
134d0 64 0a 20 20 2a 2a 20 6f 6e 65 20 6f 66 20 74 68  d.  ** one of th
134e0 65 20 69 6e 64 65 78 20 6e 61 6d 65 73 20 63 6f  e index names co
134f0 6c 6c 69 64 65 73 20 77 69 74 68 20 74 68 65 20  llides with the 
13500 6e 61 6d 65 20 6f 66 20 61 20 74 65 6d 70 6f 72  name of a tempor
13510 61 72 79 20 74 61 62 6c 65 20 6f 72 0a 20 20 2a  ary table or.  *
13520 2a 20 69 6e 64 65 78 2c 20 74 68 65 6e 20 77 65  * index, then we
13530 20 77 69 6c 6c 20 63 6f 6e 74 69 6e 75 65 20 74   will continue t
13540 6f 20 70 72 6f 63 65 73 73 20 74 68 69 73 20 69  o process this i
13550 6e 64 65 78 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ndex..  **.  ** 
13560 49 66 20 70 4e 61 6d 65 3d 3d 30 20 69 74 20 6d  If pName==0 it m
13570 65 61 6e 73 20 74 68 61 74 20 77 65 20 61 72 65  eans that we are
13580 0a 20 20 2a 2a 20 64 65 61 6c 69 6e 67 20 77 69  .  ** dealing wi
13590 74 68 20 61 20 70 72 69 6d 61 72 79 20 6b 65 79  th a primary key
135a0 20 6f 72 20 55 4e 49 51 55 45 20 63 6f 6e 73 74   or UNIQUE const
135b0 72 61 69 6e 74 2e 20 20 57 65 20 68 61 76 65 20  raint.  We have 
135c0 74 6f 20 69 6e 76 65 6e 74 20 6f 75 72 0a 20 20  to invent our.  
135d0 2a 2a 20 6f 77 6e 20 6e 61 6d 65 2e 0a 20 20 2a  ** own name..  *
135e0 2f 0a 20 20 69 66 28 20 70 4e 61 6d 65 20 29 7b  /.  if( pName ){
135f0 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c  .    zName = sql
13600 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65  ite3NameFromToke
13610 6e 28 64 62 2c 20 70 4e 61 6d 65 29 3b 0a 20 20  n(db, pName);.  
13620 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21    if( SQLITE_OK!
13630 3d 73 71 6c 69 74 65 33 52 65 61 64 53 63 68 65  =sqlite3ReadSche
13640 6d 61 28 70 50 61 72 73 65 29 20 29 20 67 6f 74  ma(pParse) ) got
13650 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
13660 64 65 78 3b 0a 20 20 20 20 69 66 28 20 7a 4e 61  dex;.    if( zNa
13670 6d 65 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78 69  me==0 ) goto exi
13680 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
13690 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f      if( SQLITE_O
136a0 4b 21 3d 73 71 6c 69 74 65 33 43 68 65 63 6b 4f  K!=sqlite3CheckO
136b0 62 6a 65 63 74 4e 61 6d 65 28 70 50 61 72 73 65  bjectName(pParse
136c0 2c 20 7a 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20  , zName) ){.    
136d0 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61    goto exit_crea
136e0 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a  te_index;.    }.
136f0 20 20 20 20 69 66 28 20 21 64 62 2d 3e 69 6e 69      if( !db->ini
13700 74 2e 62 75 73 79 20 29 7b 0a 20 20 20 20 20 20  t.busy ){.      
13710 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73  if( SQLITE_OK!=s
13720 71 6c 69 74 65 33 52 65 61 64 53 63 68 65 6d 61  qlite3ReadSchema
13730 28 70 50 61 72 73 65 29 20 29 20 67 6f 74 6f 20  (pParse) ) goto 
13740 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
13750 78 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  x;.      if( sql
13760 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28 64 62  ite3FindTable(db
13770 2c 20 7a 4e 61 6d 65 2c 20 30 29 21 3d 30 20 29  , zName, 0)!=0 )
13780 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
13790 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
137a0 2c 20 22 74 68 65 72 65 20 69 73 20 61 6c 72 65  , "there is alre
137b0 61 64 79 20 61 20 74 61 62 6c 65 20 6e 61 6d 65  ady a table name
137c0 64 20 25 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20  d %s", zName);. 
137d0 20 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74         goto exit
137e0 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
137f0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
13800 20 69 66 28 20 73 71 6c 69 74 65 33 46 69 6e 64   if( sqlite3Find
13810 49 6e 64 65 78 28 64 62 2c 20 7a 4e 61 6d 65 2c  Index(db, zName,
13820 20 70 44 62 2d 3e 7a 4e 61 6d 65 29 21 3d 30 20   pDb->zName)!=0 
13830 29 7b 0a 20 20 20 20 20 20 69 66 28 20 21 69 66  ){.      if( !if
13840 4e 6f 74 45 78 69 73 74 20 29 7b 0a 20 20 20 20  NotExist ){.    
13850 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
13860 4d 73 67 28 70 50 61 72 73 65 2c 20 22 69 6e 64  Msg(pParse, "ind
13870 65 78 20 25 73 20 61 6c 72 65 61 64 79 20 65 78  ex %s already ex
13880 69 73 74 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20  ists", zName);. 
13890 20 20 20 20 20 7d 0a 20 20 20 20 20 20 67 6f 74       }.      got
138a0 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
138b0 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  dex;.    }.  }el
138c0 73 65 7b 0a 20 20 20 20 69 6e 74 20 6e 3b 0a 20  se{.    int n;. 
138d0 20 20 20 49 6e 64 65 78 20 2a 70 4c 6f 6f 70 3b     Index *pLoop;
138e0 0a 20 20 20 20 66 6f 72 28 70 4c 6f 6f 70 3d 70  .    for(pLoop=p
138f0 54 61 62 2d 3e 70 49 6e 64 65 78 2c 20 6e 3d 31  Tab->pIndex, n=1
13900 3b 20 70 4c 6f 6f 70 3b 20 70 4c 6f 6f 70 3d 70  ; pLoop; pLoop=p
13910 4c 6f 6f 70 2d 3e 70 4e 65 78 74 2c 20 6e 2b 2b  Loop->pNext, n++
13920 29 7b 7d 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20  ){}.    zName = 
13930 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64  sqlite3MPrintf(d
13940 62 2c 20 22 73 71 6c 69 74 65 5f 61 75 74 6f 69  b, "sqlite_autoi
13950 6e 64 65 78 5f 25 73 5f 25 64 22 2c 20 70 54 61  ndex_%s_%d", pTa
13960 62 2d 3e 7a 4e 61 6d 65 2c 20 6e 29 3b 0a 20 20  b->zName, n);.  
13970 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29    if( zName==0 )
13980 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69  {.      goto exi
13990 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
139a0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
139b0 43 68 65 63 6b 20 66 6f 72 20 61 75 74 68 6f 72  Check for author
139c0 69 7a 61 74 69 6f 6e 20 74 6f 20 63 72 65 61 74  ization to creat
139d0 65 20 61 6e 20 69 6e 64 65 78 2e 0a 20 20 2a 2f  e an index..  */
139e0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
139f0 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49  OMIT_AUTHORIZATI
13a00 4f 4e 0a 20 20 7b 0a 20 20 20 20 63 6f 6e 73 74  ON.  {.    const
13a10 20 63 68 61 72 20 2a 7a 44 62 20 3d 20 70 44 62   char *zDb = pDb
13a20 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 69 66 28  ->zName;.    if(
13a30 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63   sqlite3AuthChec
13a40 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45  k(pParse, SQLITE
13a50 5f 49 4e 53 45 52 54 2c 20 53 43 48 45 4d 41 5f  _INSERT, SCHEMA_
13a60 54 41 42 4c 45 28 69 44 62 29 2c 20 30 2c 20 7a  TABLE(iDb), 0, z
13a70 44 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  Db) ){.      got
13a80 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
13a90 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  dex;.    }.    i
13aa0 20 3d 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45   = SQLITE_CREATE
13ab0 5f 49 4e 44 45 58 3b 0a 20 20 20 20 69 66 28 20  _INDEX;.    if( 
13ac0 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26 26 20  !OMIT_TEMPDB && 
13ad0 69 44 62 3d 3d 31 20 29 20 69 20 3d 20 53 51 4c  iDb==1 ) i = SQL
13ae0 49 54 45 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f  ITE_CREATE_TEMP_
13af0 49 4e 44 45 58 3b 0a 20 20 20 20 69 66 28 20 73  INDEX;.    if( s
13b00 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28  qlite3AuthCheck(
13b10 70 50 61 72 73 65 2c 20 69 2c 20 7a 4e 61 6d 65  pParse, i, zName
13b20 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a  , pTab->zName, z
13b30 44 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  Db) ){.      got
13b40 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
13b50 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  dex;.    }.  }.#
13b60 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20 70  endif..  /* If p
13b70 4c 69 73 74 3d 3d 30 2c 20 69 74 20 6d 65 61 6e  List==0, it mean
13b80 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77  s this routine w
13b90 61 73 20 63 61 6c 6c 65 64 20 74 6f 20 6d 61 6b  as called to mak
13ba0 65 20 61 20 70 72 69 6d 61 72 79 0a 20 20 2a 2a  e a primary.  **
13bb0 20 6b 65 79 20 6f 75 74 20 6f 66 20 74 68 65 20   key out of the 
13bc0 6c 61 73 74 20 63 6f 6c 75 6d 6e 20 61 64 64 65  last column adde
13bd0 64 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 75  d to the table u
13be0 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f  nder constructio
13bf0 6e 2e 0a 20 20 2a 2a 20 53 6f 20 63 72 65 61 74  n..  ** So creat
13c00 65 20 61 20 66 61 6b 65 20 6c 69 73 74 20 74 6f  e a fake list to
13c10 20 73 69 6d 75 6c 61 74 65 20 74 68 69 73 2e 0a   simulate this..
13c20 20 20 2a 2f 0a 20 20 69 66 28 20 70 4c 69 73 74    */.  if( pList
13c30 3d 3d 30 20 29 7b 0a 20 20 20 20 6e 75 6c 6c 49  ==0 ){.    nullI
13c40 64 2e 7a 20 3d 20 28 75 38 2a 29 70 54 61 62 2d  d.z = (u8*)pTab-
13c50 3e 61 43 6f 6c 5b 70 54 61 62 2d 3e 6e 43 6f 6c  >aCol[pTab->nCol
13c60 2d 31 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 6e  -1].zName;.    n
13c70 75 6c 6c 49 64 2e 6e 20 3d 20 73 74 72 6c 65 6e  ullId.n = strlen
13c80 28 28 63 68 61 72 2a 29 6e 75 6c 6c 49 64 2e 7a  ((char*)nullId.z
13c90 29 3b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 73  );.    pList = s
13ca0 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70  qlite3ExprListAp
13cb0 70 65 6e 64 28 70 50 61 72 73 65 2c 20 30 2c 20  pend(pParse, 0, 
13cc0 30 2c 20 26 6e 75 6c 6c 49 64 29 3b 0a 20 20 20  0, &nullId);.   
13cd0 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20   if( pList==0 ) 
13ce0 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
13cf0 5f 69 6e 64 65 78 3b 0a 20 20 20 20 70 4c 69 73  _index;.    pLis
13d00 74 2d 3e 61 5b 30 5d 2e 73 6f 72 74 4f 72 64 65  t->a[0].sortOrde
13d10 72 20 3d 20 73 6f 72 74 4f 72 64 65 72 3b 0a 20  r = sortOrder;. 
13d20 20 7d 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20   }..  /* Figure 
13d30 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20 62 79 74  out how many byt
13d40 65 73 20 6f 66 20 73 70 61 63 65 20 61 72 65 20  es of space are 
13d50 72 65 71 75 69 72 65 64 20 74 6f 20 73 74 6f 72  required to stor
13d60 65 20 65 78 70 6c 69 63 69 74 6c 79 0a 20 20 2a  e explicitly.  *
13d70 2a 20 73 70 65 63 69 66 69 65 64 20 63 6f 6c 6c  * specified coll
13d80 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 6e  ation sequence n
13d90 61 6d 65 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  ames..  */.  for
13da0 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e  (i=0; i<pList->n
13db0 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
13dc0 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70 4c  Expr *pExpr = pL
13dd0 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b  ist->a[i].pExpr;
13de0 0a 20 20 20 20 69 66 28 20 70 45 78 70 72 20 29  .    if( pExpr )
13df0 7b 0a 20 20 20 20 20 20 6e 45 78 74 72 61 20 2b  {.      nExtra +
13e00 3d 20 28 31 20 2b 20 73 74 72 6c 65 6e 28 70 45  = (1 + strlen(pE
13e10 78 70 72 2d 3e 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d  xpr->pColl->zNam
13e20 65 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  e));.    }.  }..
13e30 20 20 2f 2a 20 0a 20 20 2a 2a 20 41 6c 6c 6f 63    /* .  ** Alloc
13e40 61 74 65 20 74 68 65 20 69 6e 64 65 78 20 73 74  ate the index st
13e50 72 75 63 74 75 72 65 2e 20 0a 20 20 2a 2f 0a 20  ructure. .  */. 
13e60 20 6e 4e 61 6d 65 20 3d 20 73 74 72 6c 65 6e 28   nName = strlen(
13e70 7a 4e 61 6d 65 29 3b 0a 20 20 6e 43 6f 6c 20 3d  zName);.  nCol =
13e80 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20   pList->nExpr;. 
13e90 20 70 49 6e 64 65 78 20 3d 20 73 71 6c 69 74 65   pIndex = sqlite
13ea0 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62  3DbMallocZero(db
13eb0 2c 20 0a 20 20 20 20 20 20 73 69 7a 65 6f 66 28  , .      sizeof(
13ec0 49 6e 64 65 78 29 20 2b 20 20 20 20 20 20 20 20  Index) +        
13ed0 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 73        /* Index s
13ee0 74 72 75 63 74 75 72 65 20 20 2a 2f 0a 20 20 20  tructure  */.   
13ef0 20 20 20 73 69 7a 65 6f 66 28 69 6e 74 29 2a 6e     sizeof(int)*n
13f00 43 6f 6c 20 2b 20 20 20 20 20 20 20 20 20 20 20  Col +           
13f10 2f 2a 20 49 6e 64 65 78 2e 61 69 43 6f 6c 75 6d  /* Index.aiColum
13f20 6e 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 69 7a  n   */.      siz
13f30 65 6f 66 28 69 6e 74 29 2a 28 6e 43 6f 6c 2b 31  eof(int)*(nCol+1
13f40 29 20 2b 20 20 20 20 20 20 20 2f 2a 20 49 6e 64  ) +       /* Ind
13f50 65 78 2e 61 69 52 6f 77 45 73 74 20 20 20 2a 2f  ex.aiRowEst   */
13f60 0a 20 20 20 20 20 20 73 69 7a 65 6f 66 28 63 68  .      sizeof(ch
13f70 61 72 20 2a 29 2a 6e 43 6f 6c 20 2b 20 20 20 20  ar *)*nCol +    
13f80 20 20 20 20 2f 2a 20 49 6e 64 65 78 2e 61 7a 43      /* Index.azC
13f90 6f 6c 6c 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  oll     */.     
13fa0 20 73 69 7a 65 6f 66 28 75 38 29 2a 6e 43 6f 6c   sizeof(u8)*nCol
13fb0 20 2b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a   +            /*
13fc0 20 49 6e 64 65 78 2e 61 53 6f 72 74 4f 72 64 65   Index.aSortOrde
13fd0 72 20 2a 2f 0a 20 20 20 20 20 20 6e 4e 61 6d 65  r */.      nName
13fe0 20 2b 20 31 20 2b 20 20 20 20 20 20 20 20 20 20   + 1 +          
13ff0 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
14000 2e 7a 4e 61 6d 65 20 20 20 20 20 20 2a 2f 0a 20  .zName      */. 
14010 20 20 20 20 20 6e 45 78 74 72 61 20 20 20 20 20       nExtra     
14020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14030 20 20 2f 2a 20 43 6f 6c 6c 61 74 69 6f 6e 20 73    /* Collation s
14040 65 71 75 65 6e 63 65 20 6e 61 6d 65 73 20 2a 2f  equence names */
14050 0a 20 20 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e  .  );.  if( db->
14060 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
14070 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72      goto exit_cr
14080 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a  eate_index;.  }.
14090 20 20 70 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c    pIndex->azColl
140a0 20 3d 20 28 63 68 61 72 2a 2a 29 28 26 70 49 6e   = (char**)(&pIn
140b0 64 65 78 5b 31 5d 29 3b 0a 20 20 70 49 6e 64 65  dex[1]);.  pInde
140c0 78 2d 3e 61 69 43 6f 6c 75 6d 6e 20 3d 20 28 69  x->aiColumn = (i
140d0 6e 74 20 2a 29 28 26 70 49 6e 64 65 78 2d 3e 61  nt *)(&pIndex->a
140e0 7a 43 6f 6c 6c 5b 6e 43 6f 6c 5d 29 3b 0a 20 20  zColl[nCol]);.  
140f0 70 49 6e 64 65 78 2d 3e 61 69 52 6f 77 45 73 74  pIndex->aiRowEst
14100 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 2a 29 28   = (unsigned *)(
14110 26 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d  &pIndex->aiColum
14120 6e 5b 6e 43 6f 6c 5d 29 3b 0a 20 20 70 49 6e 64  n[nCol]);.  pInd
14130 65 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 20 3d  ex->aSortOrder =
14140 20 28 75 38 20 2a 29 28 26 70 49 6e 64 65 78 2d   (u8 *)(&pIndex-
14150 3e 61 69 52 6f 77 45 73 74 5b 6e 43 6f 6c 2b 31  >aiRowEst[nCol+1
14160 5d 29 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 7a 4e  ]);.  pIndex->zN
14170 61 6d 65 20 3d 20 28 63 68 61 72 20 2a 29 28 26  ame = (char *)(&
14180 70 49 6e 64 65 78 2d 3e 61 53 6f 72 74 4f 72 64  pIndex->aSortOrd
14190 65 72 5b 6e 43 6f 6c 5d 29 3b 0a 20 20 7a 45 78  er[nCol]);.  zEx
141a0 74 72 61 20 3d 20 28 63 68 61 72 20 2a 29 28 26  tra = (char *)(&
141b0 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 5b 6e 4e  pIndex->zName[nN
141c0 61 6d 65 2b 31 5d 29 3b 0a 20 20 6d 65 6d 63 70  ame+1]);.  memcp
141d0 79 28 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c  y(pIndex->zName,
141e0 20 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 2b 31 29   zName, nName+1)
141f0 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 70 54 61 62  ;.  pIndex->pTab
14200 6c 65 20 3d 20 70 54 61 62 3b 0a 20 20 70 49 6e  le = pTab;.  pIn
14210 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 3d 20 70  dex->nColumn = p
14220 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 70  List->nExpr;.  p
14230 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 20 3d  Index->onError =
14240 20 6f 6e 45 72 72 6f 72 3b 0a 20 20 70 49 6e 64   onError;.  pInd
14250 65 78 2d 3e 61 75 74 6f 49 6e 64 65 78 20 3d 20  ex->autoIndex = 
14260 70 4e 61 6d 65 3d 3d 30 3b 0a 20 20 70 49 6e 64  pName==0;.  pInd
14270 65 78 2d 3e 70 53 63 68 65 6d 61 20 3d 20 64 62  ex->pSchema = db
14280 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53 63 68 65  ->aDb[iDb].pSche
14290 6d 61 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20  ma;..  /* Check 
142a0 74 6f 20 73 65 65 20 69 66 20 77 65 20 73 68 6f  to see if we sho
142b0 75 6c 64 20 68 6f 6e 6f 72 20 44 45 53 43 20 72  uld honor DESC r
142c0 65 71 75 65 73 74 73 20 6f 6e 20 69 6e 64 65 78  equests on index
142d0 20 63 6f 6c 75 6d 6e 73 0a 20 20 2a 2f 0a 20 20   columns.  */.  
142e0 69 66 28 20 70 44 62 2d 3e 70 53 63 68 65 6d 61  if( pDb->pSchema
142f0 2d 3e 66 69 6c 65 5f 66 6f 72 6d 61 74 3e 3d 34  ->file_format>=4
14300 20 29 7b 0a 20 20 20 20 73 6f 72 74 4f 72 64 65   ){.    sortOrde
14310 72 4d 61 73 6b 20 3d 20 2d 31 3b 20 20 20 2f 2a  rMask = -1;   /*
14320 20 48 6f 6e 6f 72 20 44 45 53 43 20 2a 2f 0a 20   Honor DESC */. 
14330 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 6f 72 74   }else{.    sort
14340 4f 72 64 65 72 4d 61 73 6b 20 3d 20 30 3b 20 20  OrderMask = 0;  
14350 20 20 2f 2a 20 49 67 6e 6f 72 65 20 44 45 53 43    /* Ignore DESC
14360 20 2a 2f 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 63   */.  }..  /* Sc
14370 61 6e 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20  an the names of 
14380 74 68 65 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74  the columns of t
14390 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20 69  he table to be i
143a0 6e 64 65 78 65 64 20 61 6e 64 0a 20 20 2a 2a 20  ndexed and.  ** 
143b0 6c 6f 61 64 20 74 68 65 20 63 6f 6c 75 6d 6e 20  load the column 
143c0 69 6e 64 69 63 65 73 20 69 6e 74 6f 20 74 68 65  indices into the
143d0 20 49 6e 64 65 78 20 73 74 72 75 63 74 75 72 65   Index structure
143e0 2e 20 20 52 65 70 6f 72 74 20 61 6e 20 65 72 72  .  Report an err
143f0 6f 72 0a 20 20 2a 2a 20 69 66 20 61 6e 79 20 63  or.  ** if any c
14400 6f 6c 75 6d 6e 20 69 73 20 6e 6f 74 20 66 6f 75  olumn is not fou
14410 6e 64 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69  nd..  */.  for(i
14420 3d 30 2c 20 70 4c 69 73 74 49 74 65 6d 3d 70 4c  =0, pListItem=pL
14430 69 73 74 2d 3e 61 3b 20 69 3c 70 4c 69 73 74 2d  ist->a; i<pList-
14440 3e 6e 45 78 70 72 3b 20 69 2b 2b 2c 20 70 4c 69  >nExpr; i++, pLi
14450 73 74 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 63  stItem++){.    c
14460 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 4e  onst char *zColN
14470 61 6d 65 20 3d 20 70 4c 69 73 74 49 74 65 6d 2d  ame = pListItem-
14480 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 43 6f 6c 75  >zName;.    Colu
14490 6d 6e 20 2a 70 54 61 62 43 6f 6c 3b 0a 20 20 20  mn *pTabCol;.   
144a0 20 69 6e 74 20 72 65 71 75 65 73 74 65 64 53 6f   int requestedSo
144b0 72 74 4f 72 64 65 72 3b 0a 20 20 20 20 63 68 61  rtOrder;.    cha
144c0 72 20 2a 7a 43 6f 6c 6c 3b 20 20 20 20 20 20 20  r *zColl;       
144d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
144e0 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
144f0 65 20 6e 61 6d 65 20 2a 2f 0a 0a 20 20 20 20 66  e name */..    f
14500 6f 72 28 6a 3d 30 2c 20 70 54 61 62 43 6f 6c 3d  or(j=0, pTabCol=
14510 70 54 61 62 2d 3e 61 43 6f 6c 3b 20 6a 3c 70 54  pTab->aCol; j<pT
14520 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 2c 20 70  ab->nCol; j++, p
14530 54 61 62 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20  TabCol++){.     
14540 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49   if( sqlite3StrI
14550 43 6d 70 28 7a 43 6f 6c 4e 61 6d 65 2c 20 70 54  Cmp(zColName, pT
14560 61 62 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 3d 3d 30  abCol->zName)==0
14570 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a   ) break;.    }.
14580 20 20 20 20 69 66 28 20 6a 3e 3d 70 54 61 62 2d      if( j>=pTab-
14590 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 73  >nCol ){.      s
145a0 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
145b0 50 61 72 73 65 2c 20 22 74 61 62 6c 65 20 25 73  Parse, "table %s
145c0 20 68 61 73 20 6e 6f 20 63 6f 6c 75 6d 6e 20 6e   has no column n
145d0 61 6d 65 64 20 25 73 22 2c 0a 20 20 20 20 20 20  amed %s",.      
145e0 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a    pTab->zName, z
145f0 43 6f 6c 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ColName);.      
14600 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
14610 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20  _index;.    }.  
14620 20 20 2f 2a 20 54 4f 44 4f 3a 20 20 41 64 64 20    /* TODO:  Add 
14630 61 20 74 65 73 74 20 74 6f 20 6d 61 6b 65 20 73  a test to make s
14640 75 72 65 20 74 68 61 74 20 74 68 65 20 73 61 6d  ure that the sam
14650 65 20 63 6f 6c 75 6d 6e 20 69 73 20 6e 6f 74 20  e column is not 
14660 6e 61 6d 65 64 0a 20 20 20 20 2a 2a 20 6d 6f 72  named.    ** mor
14670 65 20 74 68 61 6e 20 6f 6e 63 65 20 77 69 74 68  e than once with
14680 69 6e 20 74 68 65 20 73 61 6d 65 20 69 6e 64 65  in the same inde
14690 78 2e 20 20 4f 6e 6c 79 20 74 68 65 20 66 69 72  x.  Only the fir
146a0 73 74 20 69 6e 73 74 61 6e 63 65 20 6f 66 0a 20  st instance of. 
146b0 20 20 20 2a 2a 20 74 68 65 20 63 6f 6c 75 6d 6e     ** the column
146c0 20 77 69 6c 6c 20 65 76 65 72 20 62 65 20 75 73   will ever be us
146d0 65 64 20 62 79 20 74 68 65 20 6f 70 74 69 6d 69  ed by the optimi
146e0 7a 65 72 2e 20 20 4e 6f 74 65 20 74 68 61 74 20  zer.  Note that 
146f0 75 73 69 6e 67 20 74 68 65 0a 20 20 20 20 2a 2a  using the.    **
14700 20 73 61 6d 65 20 63 6f 6c 75 6d 6e 20 6d 6f 72   same column mor
14710 65 20 74 68 61 6e 20 6f 6e 63 65 20 63 61 6e 6e  e than once cann
14720 6f 74 20 62 65 20 61 6e 20 65 72 72 6f 72 20 62  ot be an error b
14730 65 63 61 75 73 65 20 74 68 61 74 20 77 6f 75 6c  ecause that woul
14740 64 20 0a 20 20 20 20 2a 2a 20 62 72 65 61 6b 20  d .    ** break 
14750 62 61 63 6b 77 61 72 64 73 20 63 6f 6d 70 61 74  backwards compat
14760 69 62 69 6c 69 74 79 20 2d 20 69 74 20 6e 65 65  ibility - it nee
14770 64 73 20 74 6f 20 62 65 20 61 20 77 61 72 6e 69  ds to be a warni
14780 6e 67 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70  ng..    */.    p
14790 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b  Index->aiColumn[
147a0 69 5d 20 3d 20 6a 3b 0a 20 20 20 20 69 66 28 20  i] = j;.    if( 
147b0 70 4c 69 73 74 49 74 65 6d 2d 3e 70 45 78 70 72  pListItem->pExpr
147c0 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
147d0 28 20 70 4c 69 73 74 49 74 65 6d 2d 3e 70 45 78  ( pListItem->pEx
147e0 70 72 2d 3e 70 43 6f 6c 6c 20 29 3b 0a 20 20 20  pr->pColl );.   
147f0 20 20 20 7a 43 6f 6c 6c 20 3d 20 7a 45 78 74 72     zColl = zExtr
14800 61 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  a;.      sqlite3
14810 5f 73 6e 70 72 69 6e 74 66 28 6e 45 78 74 72 61  _snprintf(nExtra
14820 2c 20 7a 45 78 74 72 61 2c 20 22 25 73 22 2c 20  , zExtra, "%s", 
14830 70 4c 69 73 74 49 74 65 6d 2d 3e 70 45 78 70 72  pListItem->pExpr
14840 2d 3e 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29 3b  ->pColl->zName);
14850 0a 20 20 20 20 20 20 7a 45 78 74 72 61 20 2b 3d  .      zExtra +=
14860 20 28 73 74 72 6c 65 6e 28 7a 43 6f 6c 6c 29 20   (strlen(zColl) 
14870 2b 20 31 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  + 1);.    }else{
14880 0a 20 20 20 20 20 20 7a 43 6f 6c 6c 20 3d 20 70  .      zColl = p
14890 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 43 6f  Tab->aCol[j].zCo
148a0 6c 6c 3b 0a 20 20 20 20 20 20 69 66 28 20 21 7a  ll;.      if( !z
148b0 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  Coll ){.        
148c0 7a 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c  zColl = db->pDfl
148d0 74 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 3b 0a 20 20  tColl->zName;.  
148e0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
148f0 69 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75  if( !db->init.bu
14900 73 79 20 26 26 20 21 73 71 6c 69 74 65 33 4c 6f  sy && !sqlite3Lo
14910 63 61 74 65 43 6f 6c 6c 53 65 71 28 70 50 61 72  cateCollSeq(pPar
14920 73 65 2c 20 7a 43 6f 6c 6c 2c 20 2d 31 29 20 29  se, zColl, -1) )
14930 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69  {.      goto exi
14940 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
14950 20 20 20 20 7d 0a 20 20 20 20 70 49 6e 64 65 78      }.    pIndex
14960 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 20 3d 20 7a 43  ->azColl[i] = zC
14970 6f 6c 6c 3b 0a 20 20 20 20 72 65 71 75 65 73 74  oll;.    request
14980 65 64 53 6f 72 74 4f 72 64 65 72 20 3d 20 70 4c  edSortOrder = pL
14990 69 73 74 49 74 65 6d 2d 3e 73 6f 72 74 4f 72 64  istItem->sortOrd
149a0 65 72 20 26 20 73 6f 72 74 4f 72 64 65 72 4d 61  er & sortOrderMa
149b0 73 6b 3b 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e  sk;.    pIndex->
149c0 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20 3d 20  aSortOrder[i] = 
149d0 72 65 71 75 65 73 74 65 64 53 6f 72 74 4f 72 64  requestedSortOrd
149e0 65 72 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  er;.  }.  sqlite
149f0 33 44 65 66 61 75 6c 74 52 6f 77 45 73 74 28 70  3DefaultRowEst(p
14a00 49 6e 64 65 78 29 3b 0a 0a 20 20 69 66 28 20 70  Index);..  if( p
14a10 54 61 62 3d 3d 70 50 61 72 73 65 2d 3e 70 4e 65  Tab==pParse->pNe
14a20 77 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 2f 2a  wTable ){.    /*
14a30 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 68 61   This routine ha
14a40 73 20 62 65 65 6e 20 63 61 6c 6c 65 64 20 74 6f  s been called to
14a50 20 63 72 65 61 74 65 20 61 6e 20 61 75 74 6f 6d   create an autom
14a60 61 74 69 63 20 69 6e 64 65 78 20 61 73 20 61 0a  atic index as a.
14a70 20 20 20 20 2a 2a 20 72 65 73 75 6c 74 20 6f 66      ** result of
14a80 20 61 20 50 52 49 4d 41 52 59 20 4b 45 59 20 6f   a PRIMARY KEY o
14a90 72 20 55 4e 49 51 55 45 20 63 6c 61 75 73 65 20  r UNIQUE clause 
14aa0 6f 6e 20 61 20 63 6f 6c 75 6d 6e 20 64 65 66 69  on a column defi
14ab0 6e 69 74 69 6f 6e 2c 20 6f 72 0a 20 20 20 20 2a  nition, or.    *
14ac0 2a 20 61 20 50 52 49 4d 41 52 59 20 4b 45 59 20  * a PRIMARY KEY 
14ad0 6f 72 20 55 4e 49 51 55 45 20 63 6c 61 75 73 65  or UNIQUE clause
14ae0 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 63   following the c
14af0 6f 6c 75 6d 6e 20 64 65 66 69 6e 69 74 69 6f 6e  olumn definition
14b00 73 2e 0a 20 20 20 20 2a 2a 20 69 2e 65 2e 20 6f  s..    ** i.e. o
14b10 6e 65 20 6f 66 3a 0a 20 20 20 20 2a 2a 0a 20 20  ne of:.    **.  
14b20 20 20 2a 2a 20 43 52 45 41 54 45 20 54 41 42 4c    ** CREATE TABL
14b30 45 20 74 28 78 20 50 52 49 4d 41 52 59 20 4b 45  E t(x PRIMARY KE
14b40 59 2c 20 79 29 3b 0a 20 20 20 20 2a 2a 20 43 52  Y, y);.    ** CR
14b50 45 41 54 45 20 54 41 42 4c 45 20 74 28 78 2c 20  EATE TABLE t(x, 
14b60 79 2c 20 55 4e 49 51 55 45 28 78 2c 20 79 29 29  y, UNIQUE(x, y))
14b70 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ;.    **.    ** 
14b80 45 69 74 68 65 72 20 77 61 79 2c 20 63 68 65 63  Either way, chec
14b90 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 20  k to see if the 
14ba0 74 61 62 6c 65 20 61 6c 72 65 61 64 79 20 68 61  table already ha
14bb0 73 20 73 75 63 68 20 61 6e 20 69 6e 64 65 78 2e  s such an index.
14bc0 20 49 66 0a 20 20 20 20 2a 2a 20 73 6f 2c 20 64   If.    ** so, d
14bd0 6f 6e 27 74 20 62 6f 74 68 65 72 20 63 72 65 61  on't bother crea
14be0 74 69 6e 67 20 74 68 69 73 20 6f 6e 65 2e 20 54  ting this one. T
14bf0 68 69 73 20 6f 6e 6c 79 20 61 70 70 6c 69 65 73  his only applies
14c00 20 74 6f 0a 20 20 20 20 2a 2a 20 61 75 74 6f 6d   to.    ** autom
14c10 61 74 69 63 61 6c 6c 79 20 63 72 65 61 74 65 64  atically created
14c20 20 69 6e 64 69 63 65 73 2e 20 55 73 65 72 73 20   indices. Users 
14c30 63 61 6e 20 64 6f 20 61 73 20 74 68 65 79 20 77  can do as they w
14c40 69 73 68 20 77 69 74 68 0a 20 20 20 20 2a 2a 20  ish with.    ** 
14c50 65 78 70 6c 69 63 69 74 20 69 6e 64 69 63 65 73  explicit indices
14c60 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 49 6e 64  ..    */.    Ind
14c70 65 78 20 2a 70 49 64 78 3b 0a 20 20 20 20 66 6f  ex *pIdx;.    fo
14c80 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e  r(pIdx=pTab->pIn
14c90 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d  dex; pIdx; pIdx=
14ca0 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  pIdx->pNext){.  
14cb0 20 20 20 20 69 6e 74 20 6b 3b 0a 20 20 20 20 20      int k;.     
14cc0 20 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e 6f   assert( pIdx->o
14cd0 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 20  nError!=OE_None 
14ce0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
14cf0 20 70 49 64 78 2d 3e 61 75 74 6f 49 6e 64 65 78   pIdx->autoIndex
14d00 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
14d10 28 20 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f  ( pIndex->onErro
14d20 72 21 3d 4f 45 5f 4e 6f 6e 65 20 29 3b 0a 0a 20  r!=OE_None );.. 
14d30 20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 6e       if( pIdx->n
14d40 43 6f 6c 75 6d 6e 21 3d 70 49 6e 64 65 78 2d 3e  Column!=pIndex->
14d50 6e 43 6f 6c 75 6d 6e 20 29 20 63 6f 6e 74 69 6e  nColumn ) contin
14d60 75 65 3b 0a 20 20 20 20 20 20 66 6f 72 28 6b 3d  ue;.      for(k=
14d70 30 3b 20 6b 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75  0; k<pIdx->nColu
14d80 6d 6e 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20  mn; k++){.      
14d90 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 31    const char *z1
14da0 20 3d 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b   = pIdx->azColl[
14db0 6b 5d 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73  k];.        cons
14dc0 74 20 63 68 61 72 20 2a 7a 32 20 3d 20 70 49 6e  t char *z2 = pIn
14dd0 64 65 78 2d 3e 61 7a 43 6f 6c 6c 5b 6b 5d 3b 0a  dex->azColl[k];.
14de0 20 20 20 20 20 20 20 20 69 66 28 20 70 49 64 78          if( pIdx
14df0 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6b 5d 21 3d 70  ->aiColumn[k]!=p
14e00 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b  Index->aiColumn[
14e10 6b 5d 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  k] ) break;.    
14e20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 61 53      if( pIdx->aS
14e30 6f 72 74 4f 72 64 65 72 5b 6b 5d 21 3d 70 49 6e  ortOrder[k]!=pIn
14e40 64 65 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b  dex->aSortOrder[
14e50 6b 5d 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  k] ) break;.    
14e60 20 20 20 20 69 66 28 20 7a 31 21 3d 7a 32 20 26      if( z1!=z2 &
14e70 26 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  & sqlite3StrICmp
14e80 28 7a 31 2c 20 7a 32 29 20 29 20 62 72 65 61 6b  (z1, z2) ) break
14e90 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
14ea0 69 66 28 20 6b 3d 3d 70 49 64 78 2d 3e 6e 43 6f  if( k==pIdx->nCo
14eb0 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20 20  lumn ){.        
14ec0 69 66 28 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f  if( pIdx->onErro
14ed0 72 21 3d 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72  r!=pIndex->onErr
14ee0 6f 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  or ){.          
14ef0 2f 2a 20 54 68 69 73 20 63 6f 6e 73 74 72 61 69  /* This constrai
14f00 6e 74 20 63 72 65 61 74 65 73 20 74 68 65 20 73  nt creates the s
14f10 61 6d 65 20 69 6e 64 65 78 20 61 73 20 61 20 70  ame index as a p
14f20 72 65 76 69 6f 75 73 0a 20 20 20 20 20 20 20 20  revious.        
14f30 20 20 2a 2a 20 63 6f 6e 73 74 72 61 69 6e 74 20    ** constraint 
14f40 73 70 65 63 69 66 69 65 64 20 73 6f 6d 65 77 68  specified somewh
14f50 65 72 65 20 69 6e 20 74 68 65 20 43 52 45 41 54  ere in the CREAT
14f60 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e  E TABLE statemen
14f70 74 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  t..          ** 
14f80 48 6f 77 65 76 65 72 20 74 68 65 20 4f 4e 20 43  However the ON C
14f90 4f 4e 46 4c 49 43 54 20 63 6c 61 75 73 65 73 20  ONFLICT clauses 
14fa0 61 72 65 20 64 69 66 66 65 72 65 6e 74 2e 20 49  are different. I
14fb0 66 20 62 6f 74 68 20 74 68 69 73 20 0a 20 20 20  f both this .   
14fc0 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e 73 74 72         ** constr
14fd0 61 69 6e 74 20 61 6e 64 20 74 68 65 20 70 72 65  aint and the pre
14fe0 76 69 6f 75 73 20 65 71 75 69 76 61 6c 65 6e 74  vious equivalent
14ff0 20 63 6f 6e 73 74 72 61 69 6e 74 20 68 61 76 65   constraint have
15000 20 65 78 70 6c 69 63 69 74 0a 20 20 20 20 20 20   explicit.      
15010 20 20 20 20 2a 2a 20 4f 4e 20 43 4f 4e 46 4c 49      ** ON CONFLI
15020 43 54 20 63 6c 61 75 73 65 73 20 74 68 69 73 20  CT clauses this 
15030 69 73 20 61 6e 20 65 72 72 6f 72 2e 20 4f 74 68  is an error. Oth
15040 65 72 77 69 73 65 2c 20 75 73 65 20 74 68 65 0a  erwise, use the.
15050 20 20 20 20 20 20 20 20 20 20 2a 2a 20 65 78 70            ** exp
15060 6c 69 63 69 74 6c 79 20 73 70 65 63 69 66 69 65  licitly specifie
15070 64 20 62 65 68 61 76 69 6f 75 72 20 66 6f 72 20  d behaviour for 
15080 74 68 65 20 69 6e 64 65 78 2e 0a 20 20 20 20 20  the index..     
15090 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
150a0 20 20 69 66 28 20 21 28 70 49 64 78 2d 3e 6f 6e    if( !(pIdx->on
150b0 45 72 72 6f 72 3d 3d 4f 45 5f 44 65 66 61 75 6c  Error==OE_Defaul
150c0 74 20 7c 7c 20 70 49 6e 64 65 78 2d 3e 6f 6e 45  t || pIndex->onE
150d0 72 72 6f 72 3d 3d 4f 45 5f 44 65 66 61 75 6c 74  rror==OE_Default
150e0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
150f0 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
15100 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20  (pParse, .      
15110 20 20 20 20 20 20 20 20 20 20 22 63 6f 6e 66 6c            "confl
15120 69 63 74 69 6e 67 20 4f 4e 20 43 4f 4e 46 4c 49  icting ON CONFLI
15130 43 54 20 63 6c 61 75 73 65 73 20 73 70 65 63 69  CT clauses speci
15140 66 69 65 64 22 2c 20 30 29 3b 0a 20 20 20 20 20  fied", 0);.     
15150 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
15160 20 69 66 28 20 70 49 64 78 2d 3e 6f 6e 45 72 72   if( pIdx->onErr
15170 6f 72 3d 3d 4f 45 5f 44 65 66 61 75 6c 74 20 29  or==OE_Default )
15180 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 49  {.            pI
15190 64 78 2d 3e 6f 6e 45 72 72 6f 72 20 3d 20 70 49  dx->onError = pI
151a0 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 3b 0a 20  ndex->onError;. 
151b0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
151c0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 67 6f 74     }.        got
151d0 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
151e0 64 65 78 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  dex;.      }.   
151f0 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 69 6e   }.  }..  /* Lin
15200 6b 20 74 68 65 20 6e 65 77 20 49 6e 64 65 78 20  k the new Index 
15210 73 74 72 75 63 74 75 72 65 20 74 6f 20 69 74 73  structure to its
15220 20 74 61 62 6c 65 20 61 6e 64 20 74 6f 20 74 68   table and to th
15230 65 20 6f 74 68 65 72 0a 20 20 2a 2a 20 69 6e 2d  e other.  ** in-
15240 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 20  memory database 
15250 73 74 72 75 63 74 75 72 65 73 2e 20 0a 20 20 2a  structures. .  *
15260 2f 0a 20 20 69 66 28 20 64 62 2d 3e 69 6e 69 74  /.  if( db->init
15270 2e 62 75 73 79 20 29 7b 0a 20 20 20 20 49 6e 64  .busy ){.    Ind
15280 65 78 20 2a 70 3b 0a 20 20 20 20 70 20 3d 20 73  ex *p;.    p = s
15290 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72 74  qlite3HashInsert
152a0 28 26 70 49 6e 64 65 78 2d 3e 70 53 63 68 65 6d  (&pIndex->pSchem
152b0 61 2d 3e 69 64 78 48 61 73 68 2c 20 0a 20 20 20  a->idxHash, .   
152c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
152d0 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 7a 4e        pIndex->zN
152e0 61 6d 65 2c 20 73 74 72 6c 65 6e 28 70 49 6e 64  ame, strlen(pInd
152f0 65 78 2d 3e 7a 4e 61 6d 65 29 2b 31 2c 20 70 49  ex->zName)+1, pI
15300 6e 64 65 78 29 3b 0a 20 20 20 20 69 66 28 20 70  ndex);.    if( p
15310 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
15320 28 20 70 3d 3d 70 49 6e 64 65 78 20 29 3b 20 20  ( p==pIndex );  
15330 2f 2a 20 4d 61 6c 6c 6f 63 20 6d 75 73 74 20 68  /* Malloc must h
15340 61 76 65 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20  ave failed */.  
15350 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61      db->mallocFa
15360 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20 20 20  iled = 1;.      
15370 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
15380 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20  _index;.    }.  
15390 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53    db->flags |= S
153a0 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e  QLITE_InternChan
153b0 67 65 73 3b 0a 20 20 20 20 69 66 28 20 70 54 62  ges;.    if( pTb
153c0 6c 4e 61 6d 65 21 3d 30 20 29 7b 0a 20 20 20 20  lName!=0 ){.    
153d0 20 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 20 3d    pIndex->tnum =
153e0 20 64 62 2d 3e 69 6e 69 74 2e 6e 65 77 54 6e 75   db->init.newTnu
153f0 6d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  m;.    }.  }..  
15400 2f 2a 20 49 66 20 74 68 65 20 64 62 2d 3e 69 6e  /* If the db->in
15410 69 74 2e 62 75 73 79 20 69 73 20 30 20 74 68 65  it.busy is 0 the
15420 6e 20 63 72 65 61 74 65 20 74 68 65 20 69 6e 64  n create the ind
15430 65 78 20 6f 6e 20 64 69 73 6b 2e 20 20 54 68 69  ex on disk.  Thi
15440 73 0a 20 20 2a 2a 20 69 6e 76 6f 6c 76 65 73 20  s.  ** involves 
15450 77 72 69 74 69 6e 67 20 74 68 65 20 69 6e 64 65  writing the inde
15460 78 20 69 6e 74 6f 20 74 68 65 20 6d 61 73 74 65  x into the maste
15470 72 20 74 61 62 6c 65 20 61 6e 64 20 66 69 6c 6c  r table and fill
15480 69 6e 67 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20  ing in the.  ** 
15490 69 6e 64 65 78 20 77 69 74 68 20 74 68 65 20 63  index with the c
154a0 75 72 72 65 6e 74 20 74 61 62 6c 65 20 63 6f 6e  urrent table con
154b0 74 65 6e 74 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  tents..  **.  **
154c0 20 54 68 65 20 64 62 2d 3e 69 6e 69 74 2e 62 75   The db->init.bu
154d0 73 79 20 69 73 20 30 20 77 68 65 6e 20 74 68 65  sy is 0 when the
154e0 20 75 73 65 72 20 66 69 72 73 74 20 65 6e 74 65   user first ente
154f0 72 73 20 61 20 43 52 45 41 54 45 20 49 4e 44 45  rs a CREATE INDE
15500 58 20 0a 20 20 2a 2a 20 63 6f 6d 6d 61 6e 64 2e  X .  ** command.
15510 20 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20    db->init.busy 
15520 69 73 20 31 20 77 68 65 6e 20 61 20 64 61 74 61  is 1 when a data
15530 62 61 73 65 20 69 73 20 6f 70 65 6e 65 64 20 61  base is opened a
15540 6e 64 20 0a 20 20 2a 2a 20 43 52 45 41 54 45 20  nd .  ** CREATE 
15550 49 4e 44 45 58 20 73 74 61 74 65 6d 65 6e 74 73  INDEX statements
15560 20 61 72 65 20 72 65 61 64 20 6f 75 74 20 6f 66   are read out of
15570 20 74 68 65 20 6d 61 73 74 65 72 20 74 61 62 6c   the master tabl
15580 65 2e 20 20 49 6e 0a 20 20 2a 2a 20 74 68 65 20  e.  In.  ** the 
15590 6c 61 74 74 65 72 20 63 61 73 65 20 74 68 65 20  latter case the 
155a0 69 6e 64 65 78 20 61 6c 72 65 61 64 79 20 65 78  index already ex
155b0 69 73 74 73 20 6f 6e 20 64 69 73 6b 2c 20 77 68  ists on disk, wh
155c0 69 63 68 20 69 73 20 77 68 79 0a 20 20 2a 2a 20  ich is why.  ** 
155d0 77 65 20 64 6f 6e 27 74 20 77 61 6e 74 20 74 6f  we don't want to
155e0 20 72 65 63 72 65 61 74 65 20 69 74 2e 0a 20 20   recreate it..  
155f0 2a 2a 0a 20 20 2a 2a 20 49 66 20 70 54 62 6c 4e  **.  ** If pTblN
15600 61 6d 65 3d 3d 30 20 69 74 20 6d 65 61 6e 73 20  ame==0 it means 
15610 74 68 69 73 20 69 6e 64 65 78 20 69 73 20 67 65  this index is ge
15620 6e 65 72 61 74 65 64 20 61 73 20 61 20 70 72 69  nerated as a pri
15630 6d 61 72 79 20 6b 65 79 0a 20 20 2a 2a 20 6f 72  mary key.  ** or
15640 20 55 4e 49 51 55 45 20 63 6f 6e 73 74 72 61 69   UNIQUE constrai
15650 6e 74 20 6f 66 20 61 20 43 52 45 41 54 45 20 54  nt of a CREATE T
15660 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 20  ABLE statement. 
15670 20 53 69 6e 63 65 20 74 68 65 20 74 61 62 6c 65   Since the table
15680 0a 20 20 2a 2a 20 68 61 73 20 6a 75 73 74 20 62  .  ** has just b
15690 65 65 6e 20 63 72 65 61 74 65 64 2c 20 69 74 20  een created, it 
156a0 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 64 61 74 61  contains no data
156b0 20 61 6e 64 20 74 68 65 20 69 6e 64 65 78 20 69   and the index i
156c0 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 0a 20 20  nitialization.  
156d0 2a 2a 20 73 74 65 70 20 63 61 6e 20 62 65 20 73  ** step can be s
156e0 6b 69 70 70 65 64 2e 0a 20 20 2a 2f 0a 20 20 65  kipped..  */.  e
156f0 6c 73 65 20 69 66 28 20 64 62 2d 3e 69 6e 69 74  lse if( db->init
15700 2e 62 75 73 79 3d 3d 30 20 29 7b 0a 20 20 20 20  .busy==0 ){.    
15710 56 64 62 65 20 2a 76 3b 0a 20 20 20 20 63 68 61  Vdbe *v;.    cha
15720 72 20 2a 7a 53 74 6d 74 3b 0a 20 20 20 20 69 6e  r *zStmt;.    in
15730 74 20 69 4d 65 6d 20 3d 20 2b 2b 70 50 61 72 73  t iMem = ++pPars
15740 65 2d 3e 6e 4d 65 6d 3b 0a 0a 20 20 20 20 76 20  e->nMem;..    v 
15750 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
15760 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 69 66  (pParse);.    if
15770 28 20 76 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78  ( v==0 ) goto ex
15780 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
15790 0a 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65  ...    /* Create
157a0 20 74 68 65 20 72 6f 6f 74 70 61 67 65 20 66 6f   the rootpage fo
157b0 72 20 74 68 65 20 69 6e 64 65 78 0a 20 20 20 20  r the index.    
157c0 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65  */.    sqlite3Be
157d0 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f  ginWriteOperatio
157e0 6e 28 70 50 61 72 73 65 2c 20 31 2c 20 69 44 62  n(pParse, 1, iDb
157f0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
15800 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43  beAddOp2(v, OP_C
15810 72 65 61 74 65 49 6e 64 65 78 2c 20 69 44 62 2c  reateIndex, iDb,
15820 20 69 4d 65 6d 29 3b 0a 0a 20 20 20 20 2f 2a 20   iMem);..    /* 
15830 47 61 74 68 65 72 20 74 68 65 20 63 6f 6d 70 6c  Gather the compl
15840 65 74 65 20 74 65 78 74 20 6f 66 20 74 68 65 20  ete text of the 
15850 43 52 45 41 54 45 20 49 4e 44 45 58 20 73 74 61  CREATE INDEX sta
15860 74 65 6d 65 6e 74 20 69 6e 74 6f 0a 20 20 20 20  tement into.    
15870 2a 2a 20 74 68 65 20 7a 53 74 6d 74 20 76 61 72  ** the zStmt var
15880 69 61 62 6c 65 0a 20 20 20 20 2a 2f 0a 20 20 20  iable.    */.   
15890 20 69 66 28 20 70 53 74 61 72 74 20 26 26 20 70   if( pStart && p
158a0 45 6e 64 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  End ){.      /* 
158b0 41 20 6e 61 6d 65 64 20 69 6e 64 65 78 20 77 69  A named index wi
158c0 74 68 20 61 6e 20 65 78 70 6c 69 63 69 74 20 43  th an explicit C
158d0 52 45 41 54 45 20 49 4e 44 45 58 20 73 74 61 74  REATE INDEX stat
158e0 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 20 20 7a  ement */.      z
158f0 53 74 6d 74 20 3d 20 73 71 6c 69 74 65 33 4d 50  Stmt = sqlite3MP
15900 72 69 6e 74 66 28 64 62 2c 20 22 43 52 45 41 54  rintf(db, "CREAT
15910 45 25 73 20 49 4e 44 45 58 20 25 2e 2a 73 22 2c  E%s INDEX %.*s",
15920 0a 20 20 20 20 20 20 20 20 6f 6e 45 72 72 6f 72  .        onError
15930 3d 3d 4f 45 5f 4e 6f 6e 65 20 3f 20 22 22 20 3a  ==OE_None ? "" :
15940 20 22 20 55 4e 49 51 55 45 22 2c 0a 20 20 20 20   " UNIQUE",.    
15950 20 20 20 20 70 45 6e 64 2d 3e 7a 20 2d 20 70 4e      pEnd->z - pN
15960 61 6d 65 2d 3e 7a 20 2b 20 31 2c 0a 20 20 20 20  ame->z + 1,.    
15970 20 20 20 20 70 4e 61 6d 65 2d 3e 7a 29 3b 0a 20      pName->z);. 
15980 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
15990 2f 2a 20 41 6e 20 61 75 74 6f 6d 61 74 69 63 20  /* An automatic 
159a0 69 6e 64 65 78 20 63 72 65 61 74 65 64 20 62 79  index created by
159b0 20 61 20 50 52 49 4d 41 52 59 20 4b 45 59 20 6f   a PRIMARY KEY o
159c0 72 20 55 4e 49 51 55 45 20 63 6f 6e 73 74 72 61  r UNIQUE constra
159d0 69 6e 74 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20  int */.      /* 
159e0 7a 53 74 6d 74 20 3d 20 73 71 6c 69 74 65 33 4d  zStmt = sqlite3M
159f0 50 72 69 6e 74 66 28 22 22 29 3b 20 2a 2f 0a 20  Printf(""); */. 
15a00 20 20 20 20 20 7a 53 74 6d 74 20 3d 20 30 3b 0a       zStmt = 0;.
15a10 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 64      }..    /* Ad
15a20 64 20 61 6e 20 65 6e 74 72 79 20 69 6e 20 73 71  d an entry in sq
15a30 6c 69 74 65 5f 6d 61 73 74 65 72 20 66 6f 72 20  lite_master for 
15a40 74 68 69 73 20 69 6e 64 65 78 0a 20 20 20 20 2a  this index.    *
15a50 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 4e 65 73  /.    sqlite3Nes
15a60 74 65 64 50 61 72 73 65 28 70 50 61 72 73 65 2c  tedParse(pParse,
15a70 20 0a 20 20 20 20 20 20 20 20 22 49 4e 53 45 52   .        "INSER
15a80 54 20 49 4e 54 4f 20 25 51 2e 25 73 20 56 41 4c  T INTO %Q.%s VAL
15a90 55 45 53 28 27 69 6e 64 65 78 27 2c 25 51 2c 25  UES('index',%Q,%
15aa0 51 2c 23 25 64 2c 25 51 29 3b 22 2c 0a 20 20 20  Q,#%d,%Q);",.   
15ab0 20 20 20 20 20 64 62 2d 3e 61 44 62 5b 69 44 62       db->aDb[iDb
15ac0 5d 2e 7a 4e 61 6d 65 2c 20 53 43 48 45 4d 41 5f  ].zName, SCHEMA_
15ad0 54 41 42 4c 45 28 69 44 62 29 2c 0a 20 20 20 20  TABLE(iDb),.    
15ae0 20 20 20 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d      pIndex->zNam
15af0 65 2c 0a 20 20 20 20 20 20 20 20 70 54 61 62 2d  e,.        pTab-
15b00 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20  >zName,.        
15b10 69 4d 65 6d 2c 0a 20 20 20 20 20 20 20 20 7a 53  iMem,.        zS
15b20 74 6d 74 0a 20 20 20 20 29 3b 0a 20 20 20 20 73  tmt.    );.    s
15b30 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
15b40 20 7a 53 74 6d 74 29 3b 0a 0a 20 20 20 20 2f 2a   zStmt);..    /*
15b50 20 46 69 6c 6c 20 74 68 65 20 69 6e 64 65 78 20   Fill the index 
15b60 77 69 74 68 20 64 61 74 61 20 61 6e 64 20 72 65  with data and re
15b70 70 61 72 73 65 20 74 68 65 20 73 63 68 65 6d 61  parse the schema
15b80 2e 20 43 6f 64 65 20 61 6e 20 4f 50 5f 45 78 70  . Code an OP_Exp
15b90 69 72 65 0a 20 20 20 20 2a 2a 20 74 6f 20 69 6e  ire.    ** to in
15ba0 76 61 6c 69 64 61 74 65 20 61 6c 6c 20 70 72 65  validate all pre
15bb0 2d 63 6f 6d 70 69 6c 65 64 20 73 74 61 74 65 6d  -compiled statem
15bc0 65 6e 74 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ents..    */.   
15bd0 20 69 66 28 20 70 54 62 6c 4e 61 6d 65 20 29 7b   if( pTblName ){
15be0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65  .      sqlite3Re
15bf0 66 69 6c 6c 49 6e 64 65 78 28 70 50 61 72 73 65  fillIndex(pParse
15c00 2c 20 70 49 6e 64 65 78 2c 20 69 4d 65 6d 29 3b  , pIndex, iMem);
15c10 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 68  .      sqlite3Ch
15c20 61 6e 67 65 43 6f 6f 6b 69 65 28 70 50 61 72 73  angeCookie(pPars
15c30 65 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20 73  e, iDb);.      s
15c40 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
15c50 28 76 2c 20 4f 50 5f 50 61 72 73 65 53 63 68 65  (v, OP_ParseSche
15c60 6d 61 2c 20 69 44 62 2c 20 30 2c 20 30 2c 0a 20  ma, iDb, 0, 0,. 
15c70 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4d          sqlite3M
15c80 50 72 69 6e 74 66 28 64 62 2c 20 22 6e 61 6d 65  Printf(db, "name
15c90 3d 27 25 71 27 22 2c 20 70 49 6e 64 65 78 2d 3e  ='%q'", pIndex->
15ca0 7a 4e 61 6d 65 29 2c 20 50 34 5f 44 59 4e 41 4d  zName), P4_DYNAM
15cb0 49 43 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  IC);.      sqlit
15cc0 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
15cd0 4f 50 5f 45 78 70 69 72 65 2c 20 30 29 3b 0a 20  OP_Expire, 0);. 
15ce0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57     }.  }..  /* W
15cf0 68 65 6e 20 61 64 64 69 6e 67 20 61 6e 20 69 6e  hen adding an in
15d00 64 65 78 20 74 6f 20 74 68 65 20 6c 69 73 74 20  dex to the list 
15d10 6f 66 20 69 6e 64 69 63 65 73 20 66 6f 72 20 61  of indices for a
15d20 20 74 61 62 6c 65 2c 20 6d 61 6b 65 0a 20 20 2a   table, make.  *
15d30 2a 20 73 75 72 65 20 61 6c 6c 20 69 6e 64 69 63  * sure all indic
15d40 65 73 20 6c 61 62 65 6c 65 64 20 4f 45 5f 52 65  es labeled OE_Re
15d50 70 6c 61 63 65 20 63 6f 6d 65 20 61 66 74 65 72  place come after
15d60 20 61 6c 6c 20 74 68 6f 73 65 20 6c 61 62 65 6c   all those label
15d70 65 64 0a 20 20 2a 2a 20 4f 45 5f 49 67 6e 6f 72  ed.  ** OE_Ignor
15d80 65 2e 20 20 54 68 69 73 20 69 73 20 6e 65 63 65  e.  This is nece
15d90 73 73 61 72 79 20 66 6f 72 20 74 68 65 20 63 6f  ssary for the co
15da0 72 72 65 63 74 20 6f 70 65 72 61 74 69 6f 6e 20  rrect operation 
15db0 6f 66 20 55 50 44 41 54 45 0a 20 20 2a 2a 20 61  of UPDATE.  ** a
15dc0 6e 64 20 49 4e 53 45 52 54 2e 0a 20 20 2a 2f 0a  nd INSERT..  */.
15dd0 20 20 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62    if( db->init.b
15de0 75 73 79 20 7c 7c 20 70 54 62 6c 4e 61 6d 65 3d  usy || pTblName=
15df0 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 6f 6e  =0 ){.    if( on
15e00 45 72 72 6f 72 21 3d 4f 45 5f 52 65 70 6c 61 63  Error!=OE_Replac
15e10 65 20 7c 7c 20 70 54 61 62 2d 3e 70 49 6e 64 65  e || pTab->pInde
15e20 78 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 7c 7c  x==0.         ||
15e30 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 2d 3e 6f   pTab->pIndex->o
15e40 6e 45 72 72 6f 72 3d 3d 4f 45 5f 52 65 70 6c 61  nError==OE_Repla
15e50 63 65 29 7b 0a 20 20 20 20 20 20 70 49 6e 64 65  ce){.      pInde
15e60 78 2d 3e 70 4e 65 78 74 20 3d 20 70 54 61 62 2d  x->pNext = pTab-
15e70 3e 70 49 6e 64 65 78 3b 0a 20 20 20 20 20 20 70  >pIndex;.      p
15e80 54 61 62 2d 3e 70 49 6e 64 65 78 20 3d 20 70 49  Tab->pIndex = pI
15e90 6e 64 65 78 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ndex;.    }else{
15ea0 0a 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70 4f  .      Index *pO
15eb0 74 68 65 72 20 3d 20 70 54 61 62 2d 3e 70 49 6e  ther = pTab->pIn
15ec0 64 65 78 3b 0a 20 20 20 20 20 20 77 68 69 6c 65  dex;.      while
15ed0 28 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74 20  ( pOther->pNext 
15ee0 26 26 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74  && pOther->pNext
15ef0 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 52 65  ->onError!=OE_Re
15f00 70 6c 61 63 65 20 29 7b 0a 20 20 20 20 20 20 20  place ){.       
15f10 20 70 4f 74 68 65 72 20 3d 20 70 4f 74 68 65 72   pOther = pOther
15f20 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d  ->pNext;.      }
15f30 0a 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 70  .      pIndex->p
15f40 4e 65 78 74 20 3d 20 70 4f 74 68 65 72 2d 3e 70  Next = pOther->p
15f50 4e 65 78 74 3b 0a 20 20 20 20 20 20 70 4f 74 68  Next;.      pOth
15f60 65 72 2d 3e 70 4e 65 78 74 20 3d 20 70 49 6e 64  er->pNext = pInd
15f70 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 49  ex;.    }.    pI
15f80 6e 64 65 78 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20  ndex = 0;.  }.. 
15f90 20 2f 2a 20 43 6c 65 61 6e 20 75 70 20 62 65 66   /* Clean up bef
15fa0 6f 72 65 20 65 78 69 74 69 6e 67 20 2a 2f 0a 65  ore exiting */.e
15fb0 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
15fc0 3a 0a 20 20 69 66 28 20 70 49 6e 64 65 78 20 29  :.  if( pIndex )
15fd0 7b 0a 20 20 20 20 66 72 65 65 49 6e 64 65 78 28  {.    freeIndex(
15fe0 70 49 6e 64 65 78 29 3b 0a 20 20 7d 0a 20 20 73  pIndex);.  }.  s
15ff0 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65  qlite3ExprListDe
16000 6c 65 74 65 28 64 62 2c 20 70 4c 69 73 74 29 3b  lete(db, pList);
16010 0a 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73  .  sqlite3SrcLis
16020 74 44 65 6c 65 74 65 28 64 62 2c 20 70 54 62 6c  tDelete(db, pTbl
16030 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65 33  Name);.  sqlite3
16040 44 62 46 72 65 65 28 64 62 2c 20 7a 4e 61 6d 65  DbFree(db, zName
16050 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a  );.  return;.}..
16060 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
16070 6f 64 65 20 74 6f 20 6d 61 6b 65 20 73 75 72 65  ode to make sure
16080 20 74 68 65 20 66 69 6c 65 20 66 6f 72 6d 61 74   the file format
16090 20 6e 75 6d 62 65 72 20 69 73 20 61 74 20 6c 65   number is at le
160a0 61 73 74 20 6d 69 6e 46 6f 72 6d 61 74 2e 0a 2a  ast minFormat..*
160b0 2a 20 54 68 65 20 67 65 6e 65 72 61 74 65 64 20  * The generated 
160c0 63 6f 64 65 20 77 69 6c 6c 20 69 6e 63 72 65 61  code will increa
160d0 73 65 20 74 68 65 20 66 69 6c 65 20 66 6f 72 6d  se the file form
160e0 61 74 20 6e 75 6d 62 65 72 20 69 66 20 6e 65 63  at number if nec
160f0 65 73 73 61 72 79 2e 0a 2a 2f 0a 76 6f 69 64 20  essary..*/.void 
16100 73 71 6c 69 74 65 33 4d 69 6e 69 6d 75 6d 46 69  sqlite3MinimumFi
16110 6c 65 46 6f 72 6d 61 74 28 50 61 72 73 65 20 2a  leFormat(Parse *
16120 70 50 61 72 73 65 2c 20 69 6e 74 20 69 44 62 2c  pParse, int iDb,
16130 20 69 6e 74 20 6d 69 6e 46 6f 72 6d 61 74 29 7b   int minFormat){
16140 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 76 20  .  Vdbe *v;.  v 
16150 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
16160 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20  (pParse);.  if( 
16170 76 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 31 20  v ){.    int r1 
16180 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
16190 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20  Reg(pParse);.   
161a0 20 69 6e 74 20 72 32 20 3d 20 73 71 6c 69 74 65   int r2 = sqlite
161b0 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
161c0 73 65 29 3b 0a 20 20 20 20 69 6e 74 20 6a 31 3b  se);.    int j1;
161d0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
161e0 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 52 65 61  AddOp3(v, OP_Rea
161f0 64 43 6f 6f 6b 69 65 2c 20 69 44 62 2c 20 72 31  dCookie, iDb, r1
16200 2c 20 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 1);.    sqlite
16210 33 56 64 62 65 55 73 65 73 42 74 72 65 65 28 76  3VdbeUsesBtree(v
16220 2c 20 69 44 62 29 3b 0a 20 20 20 20 73 71 6c 69  , iDb);.    sqli
16230 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
16240 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 6d 69 6e   OP_Integer, min
16250 46 6f 72 6d 61 74 2c 20 72 32 29 3b 0a 20 20 20  Format, r2);.   
16260 20 6a 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62   j1 = sqlite3Vdb
16270 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 47 65  eAddOp3(v, OP_Ge
16280 2c 20 72 32 2c 20 30 2c 20 72 31 29 3b 0a 20 20  , r2, 0, r1);.  
16290 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
162a0 4f 70 33 28 76 2c 20 4f 50 5f 53 65 74 43 6f 6f  Op3(v, OP_SetCoo
162b0 6b 69 65 2c 20 69 44 62 2c 20 31 2c 20 72 32 29  kie, iDb, 1, r2)
162c0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
162d0 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a 31 29  eJumpHere(v, j1)
162e0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c  ;.    sqlite3Rel
162f0 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
16300 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 73 71 6c  se, r1);.    sql
16310 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
16320 65 67 28 70 50 61 72 73 65 2c 20 72 32 29 3b 0a  eg(pParse, r2);.
16330 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6c    }.}../*.** Fil
16340 6c 20 74 68 65 20 49 6e 64 65 78 2e 61 69 52 6f  l the Index.aiRo
16350 77 45 73 74 5b 5d 20 61 72 72 61 79 20 77 69 74  wEst[] array wit
16360 68 20 64 65 66 61 75 6c 74 20 69 6e 66 6f 72 6d  h default inform
16370 61 74 69 6f 6e 20 2d 20 69 6e 66 6f 72 6d 61 74  ation - informat
16380 69 6f 6e 0a 2a 2a 20 74 6f 20 62 65 20 75 73 65  ion.** to be use
16390 64 20 77 68 65 6e 20 77 65 20 68 61 76 65 20 6e  d when we have n
163a0 6f 74 20 72 75 6e 20 74 68 65 20 41 4e 41 4c 59  ot run the ANALY
163b0 5a 45 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a  ZE command..**.*
163c0 2a 20 61 69 52 6f 77 45 73 74 5b 30 5d 20 69 73  * aiRowEst[0] is
163d0 20 73 75 70 70 6f 73 65 20 74 6f 20 63 6f 6e 74   suppose to cont
163e0 61 69 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ain the number o
163f0 66 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 74 68  f elements in th
16400 65 20 69 6e 64 65 78 2e 0a 2a 2a 20 53 69 6e 63  e index..** Sinc
16410 65 20 77 65 20 64 6f 20 6e 6f 74 20 6b 6e 6f 77  e we do not know
16420 2c 20 67 75 65 73 73 20 31 20 6d 69 6c 6c 69 6f  , guess 1 millio
16430 6e 2e 20 20 61 69 52 6f 77 45 73 74 5b 31 5d 20  n.  aiRowEst[1] 
16440 69 73 20 61 6e 20 65 73 74 69 6d 61 74 65 20 6f  is an estimate o
16450 66 20 74 68 65 0a 2a 2a 20 6e 75 6d 62 65 72 20  f the.** number 
16460 6f 66 20 72 6f 77 73 20 69 6e 20 74 68 65 20 74  of rows in the t
16470 61 62 6c 65 20 74 68 61 74 20 6d 61 74 63 68 20  able that match 
16480 61 6e 79 20 70 61 72 74 69 63 75 6c 61 72 20 76  any particular v
16490 61 6c 75 65 20 6f 66 20 74 68 65 0a 2a 2a 20 66  alue of the.** f
164a0 69 72 73 74 20 63 6f 6c 75 6d 6e 20 6f 66 20 74  irst column of t
164b0 68 65 20 69 6e 64 65 78 2e 20 20 61 69 52 6f 77  he index.  aiRow
164c0 45 73 74 5b 32 5d 20 69 73 20 61 6e 20 65 73 74  Est[2] is an est
164d0 69 6d 61 74 65 20 6f 66 20 74 68 65 20 6e 75 6d  imate of the num
164e0 62 65 72 0a 2a 2a 20 6f 66 20 72 6f 77 73 20 74  ber.** of rows t
164f0 68 61 74 20 6d 61 74 63 68 20 61 6e 79 20 70 61  hat match any pa
16500 72 74 69 63 75 6c 61 72 20 63 6f 6d 62 69 6e 69  rticular combini
16510 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 66 69 72  ation of the fir
16520 73 74 20 32 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20  st 2 columns.** 
16530 6f 66 20 74 68 65 20 69 6e 64 65 78 2e 20 20 41  of the index.  A
16540 6e 64 20 73 6f 20 66 6f 72 74 68 2e 20 20 49 74  nd so forth.  It
16550 20 6d 75 73 74 20 61 6c 77 61 79 73 20 62 65 20   must always be 
16560 74 68 65 20 63 61 73 65 20 74 68 61 74 0a 2a 0a  the case that.*.
16570 2a 2a 20 20 20 20 20 20 20 20 20 20 20 61 69 52  **           aiR
16580 6f 77 45 73 74 5b 4e 5d 3c 3d 61 69 52 6f 77 45  owEst[N]<=aiRowE
16590 73 74 5b 4e 2d 31 5d 0a 2a 2a 20 20 20 20 20 20  st[N-1].**      
165a0 20 20 20 20 20 61 69 52 6f 77 45 73 74 5b 4e 5d       aiRowEst[N]
165b0 3e 3d 31 0a 2a 2a 0a 2a 2a 20 41 70 61 72 74 20  >=1.**.** Apart 
165c0 66 72 6f 6d 20 74 68 61 74 2c 20 77 65 20 68 61  from that, we ha
165d0 76 65 20 6c 69 74 74 6c 65 20 74 6f 20 67 6f 20  ve little to go 
165e0 6f 6e 20 62 65 73 69 64 65 73 20 69 6e 74 75 69  on besides intui
165f0 74 69 6f 6e 20 61 73 20 74 6f 0a 2a 2a 20 68 6f  tion as to.** ho
16600 77 20 61 69 52 6f 77 45 73 74 5b 5d 20 73 68 6f  w aiRowEst[] sho
16610 75 6c 64 20 62 65 20 69 6e 69 74 69 61 6c 69 7a  uld be initializ
16620 65 64 2e 20 20 54 68 65 20 6e 75 6d 62 65 72 73  ed.  The numbers
16630 20 67 65 6e 65 72 61 74 65 64 20 68 65 72 65 0a   generated here.
16640 2a 2a 20 61 72 65 20 62 61 73 65 64 20 6f 6e 20  ** are based on 
16650 74 79 70 69 63 61 6c 20 76 61 6c 75 65 73 20 66  typical values f
16660 6f 75 6e 64 20 69 6e 20 61 63 74 75 61 6c 20 69  ound in actual i
16670 6e 64 69 63 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20  ndices..*/.void 
16680 73 71 6c 69 74 65 33 44 65 66 61 75 6c 74 52 6f  sqlite3DefaultRo
16690 77 45 73 74 28 49 6e 64 65 78 20 2a 70 49 64 78  wEst(Index *pIdx
166a0 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 2a 61  ){.  unsigned *a
166b0 20 3d 20 70 49 64 78 2d 3e 61 69 52 6f 77 45 73   = pIdx->aiRowEs
166c0 74 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 61 73  t;.  int i;.  as
166d0 73 65 72 74 28 20 61 21 3d 30 20 29 3b 0a 20 20  sert( a!=0 );.  
166e0 61 5b 30 5d 20 3d 20 31 30 30 30 30 30 30 3b 0a  a[0] = 1000000;.
166f0 20 20 66 6f 72 28 69 3d 70 49 64 78 2d 3e 6e 43    for(i=pIdx->nC
16700 6f 6c 75 6d 6e 3b 20 69 3e 3d 35 3b 20 69 2d 2d  olumn; i>=5; i--
16710 29 7b 0a 20 20 20 20 61 5b 69 5d 20 3d 20 35 3b  ){.    a[i] = 5;
16720 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28 20 69 3e  .  }.  while( i>
16730 3d 31 20 29 7b 0a 20 20 20 20 61 5b 69 5d 20 3d  =1 ){.    a[i] =
16740 20 31 31 20 2d 20 69 3b 0a 20 20 20 20 69 2d 2d   11 - i;.    i--
16750 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 49 64 78  ;.  }.  if( pIdx
16760 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f  ->onError!=OE_No
16770 6e 65 20 29 7b 0a 20 20 20 20 61 5b 70 49 64 78  ne ){.    a[pIdx
16780 2d 3e 6e 43 6f 6c 75 6d 6e 5d 20 3d 20 31 3b 0a  ->nColumn] = 1;.
16790 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69    }.}../*.** Thi
167a0 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 64  s routine will d
167b0 72 6f 70 20 61 6e 20 65 78 69 73 74 69 6e 67 20  rop an existing 
167c0 6e 61 6d 65 64 20 69 6e 64 65 78 2e 20 20 54 68  named index.  Th
167d0 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 6d  is routine.** im
167e0 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 44 52 4f  plements the DRO
167f0 50 20 49 4e 44 45 58 20 73 74 61 74 65 6d 65 6e  P INDEX statemen
16800 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  t..*/.void sqlit
16810 65 33 44 72 6f 70 49 6e 64 65 78 28 50 61 72 73  e3DropIndex(Pars
16820 65 20 2a 70 50 61 72 73 65 2c 20 53 72 63 4c 69  e *pParse, SrcLi
16830 73 74 20 2a 70 4e 61 6d 65 2c 20 69 6e 74 20 69  st *pName, int i
16840 66 45 78 69 73 74 73 29 7b 0a 20 20 49 6e 64 65  fExists){.  Inde
16850 78 20 2a 70 49 6e 64 65 78 3b 0a 20 20 56 64 62  x *pIndex;.  Vdb
16860 65 20 2a 76 3b 0a 20 20 73 71 6c 69 74 65 33 20  e *v;.  sqlite3 
16870 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
16880 3b 0a 20 20 69 6e 74 20 69 44 62 3b 0a 0a 20 20  ;.  int iDb;..  
16890 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  if( pParse->nErr
168a0 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   || db->mallocFa
168b0 69 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f  iled ){.    goto
168c0 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78   exit_drop_index
168d0 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
168e0 70 4e 61 6d 65 2d 3e 6e 53 72 63 3d 3d 31 20 29  pName->nSrc==1 )
168f0 3b 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f  ;.  if( SQLITE_O
16900 4b 21 3d 73 71 6c 69 74 65 33 52 65 61 64 53 63  K!=sqlite3ReadSc
16910 68 65 6d 61 28 70 50 61 72 73 65 29 20 29 7b 0a  hema(pParse) ){.
16920 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72      goto exit_dr
16930 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20  op_index;.  }.  
16940 70 49 6e 64 65 78 20 3d 20 73 71 6c 69 74 65 33  pIndex = sqlite3
16950 46 69 6e 64 49 6e 64 65 78 28 64 62 2c 20 70 4e  FindIndex(db, pN
16960 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 4e 61 6d 65 2c  ame->a[0].zName,
16970 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 44 61   pName->a[0].zDa
16980 74 61 62 61 73 65 29 3b 0a 20 20 69 66 28 20 70  tabase);.  if( p
16990 49 6e 64 65 78 3d 3d 30 20 29 7b 0a 20 20 20 20  Index==0 ){.    
169a0 69 66 28 20 21 69 66 45 78 69 73 74 73 20 29 7b  if( !ifExists ){
169b0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
169c0 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
169d0 6e 6f 20 73 75 63 68 20 69 6e 64 65 78 3a 20 25  no such index: %
169e0 53 22 2c 20 70 4e 61 6d 65 2c 20 30 29 3b 0a 20  S", pName, 0);. 
169f0 20 20 20 7d 0a 20 20 20 20 70 50 61 72 73 65 2d     }.    pParse-
16a00 3e 63 68 65 63 6b 53 63 68 65 6d 61 20 3d 20 31  >checkSchema = 1
16a10 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f  ;.    goto exit_
16a20 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a  drop_index;.  }.
16a30 20 20 69 66 28 20 70 49 6e 64 65 78 2d 3e 61 75    if( pIndex->au
16a40 74 6f 49 6e 64 65 78 20 29 7b 0a 20 20 20 20 73  toIndex ){.    s
16a50 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
16a60 50 61 72 73 65 2c 20 22 69 6e 64 65 78 20 61 73  Parse, "index as
16a70 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 55 4e  sociated with UN
16a80 49 51 55 45 20 22 0a 20 20 20 20 20 20 22 6f 72  IQUE ".      "or
16a90 20 50 52 49 4d 41 52 59 20 4b 45 59 20 63 6f 6e   PRIMARY KEY con
16aa0 73 74 72 61 69 6e 74 20 63 61 6e 6e 6f 74 20 62  straint cannot b
16ab0 65 20 64 72 6f 70 70 65 64 22 2c 20 30 29 3b 0a  e dropped", 0);.
16ac0 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72      goto exit_dr
16ad0 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20  op_index;.  }.  
16ae0 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68  iDb = sqlite3Sch
16af0 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70  emaToIndex(db, p
16b00 49 6e 64 65 78 2d 3e 70 53 63 68 65 6d 61 29 3b  Index->pSchema);
16b10 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
16b20 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49  OMIT_AUTHORIZATI
16b30 4f 4e 0a 20 20 7b 0a 20 20 20 20 69 6e 74 20 63  ON.  {.    int c
16b40 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f  ode = SQLITE_DRO
16b50 50 5f 49 4e 44 45 58 3b 0a 20 20 20 20 54 61 62  P_INDEX;.    Tab
16b60 6c 65 20 2a 70 54 61 62 20 3d 20 70 49 6e 64 65  le *pTab = pInde
16b70 78 2d 3e 70 54 61 62 6c 65 3b 0a 20 20 20 20 63  x->pTable;.    c
16b80 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 20 3d  onst char *zDb =
16b90 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e   db->aDb[iDb].zN
16ba0 61 6d 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63  ame;.    const c
16bb0 68 61 72 20 2a 7a 54 61 62 20 3d 20 53 43 48 45  har *zTab = SCHE
16bc0 4d 41 5f 54 41 42 4c 45 28 69 44 62 29 3b 0a 20  MA_TABLE(iDb);. 
16bd0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75     if( sqlite3Au
16be0 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  thCheck(pParse, 
16bf0 53 51 4c 49 54 45 5f 44 45 4c 45 54 45 2c 20 7a  SQLITE_DELETE, z
16c00 54 61 62 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a  Tab, 0, zDb) ){.
16c10 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f        goto exit_
16c20 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 20 20  drop_index;.    
16c30 7d 0a 20 20 20 20 69 66 28 20 21 4f 4d 49 54 5f  }.    if( !OMIT_
16c40 54 45 4d 50 44 42 20 26 26 20 69 44 62 20 29 20  TEMPDB && iDb ) 
16c50 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52  code = SQLITE_DR
16c60 4f 50 5f 54 45 4d 50 5f 49 4e 44 45 58 3b 0a 20  OP_TEMP_INDEX;. 
16c70 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75     if( sqlite3Au
16c80 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  thCheck(pParse, 
16c90 63 6f 64 65 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e  code, pIndex->zN
16ca0 61 6d 65 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  ame, pTab->zName
16cb0 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20  , zDb) ){.      
16cc0 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69  goto exit_drop_i
16cd0 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ndex;.    }.  }.
16ce0 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 47 65 6e  #endif..  /* Gen
16cf0 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 72 65  erate code to re
16d00 6d 6f 76 65 20 74 68 65 20 69 6e 64 65 78 20 61  move the index a
16d10 6e 64 20 66 72 6f 6d 20 74 68 65 20 6d 61 73 74  nd from the mast
16d20 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20 76 20  er table */.  v 
16d30 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
16d40 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20  (pParse);.  if( 
16d50 76 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  v ){.    sqlite3
16d60 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74  BeginWriteOperat
16d70 69 6f 6e 28 70 50 61 72 73 65 2c 20 31 2c 20 69  ion(pParse, 1, i
16d80 44 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Db);.    sqlite3
16d90 4e 65 73 74 65 64 50 61 72 73 65 28 70 50 61 72  NestedParse(pPar
16da0 73 65 2c 0a 20 20 20 20 20 20 20 22 44 45 4c 45  se,.       "DELE
16db0 54 45 20 46 52 4f 4d 20 25 51 2e 25 73 20 57 48  TE FROM %Q.%s WH
16dc0 45 52 45 20 6e 61 6d 65 3d 25 51 22 2c 0a 20 20  ERE name=%Q",.  
16dd0 20 20 20 20 20 64 62 2d 3e 61 44 62 5b 69 44 62       db->aDb[iDb
16de0 5d 2e 7a 4e 61 6d 65 2c 20 53 43 48 45 4d 41 5f  ].zName, SCHEMA_
16df0 54 41 42 4c 45 28 69 44 62 29 2c 0a 20 20 20 20  TABLE(iDb),.    
16e00 20 20 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65     pIndex->zName
16e10 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20  .    );.    if( 
16e20 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65  sqlite3FindTable
16e30 28 64 62 2c 20 22 73 71 6c 69 74 65 5f 73 74 61  (db, "sqlite_sta
16e40 74 31 22 2c 20 64 62 2d 3e 61 44 62 5b 69 44 62  t1", db->aDb[iDb
16e50 5d 2e 7a 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20  ].zName) ){.    
16e60 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50    sqlite3NestedP
16e70 61 72 73 65 28 70 50 61 72 73 65 2c 0a 20 20 20  arse(pParse,.   
16e80 20 20 20 20 20 22 44 45 4c 45 54 45 20 46 52 4f       "DELETE FRO
16e90 4d 20 25 51 2e 73 71 6c 69 74 65 5f 73 74 61 74  M %Q.sqlite_stat
16ea0 31 20 57 48 45 52 45 20 69 64 78 3d 25 51 22 2c  1 WHERE idx=%Q",
16eb0 0a 20 20 20 20 20 20 20 20 64 62 2d 3e 61 44 62  .        db->aDb
16ec0 5b 69 44 62 5d 2e 7a 4e 61 6d 65 2c 20 70 49 6e  [iDb].zName, pIn
16ed0 64 65 78 2d 3e 7a 4e 61 6d 65 0a 20 20 20 20 20  dex->zName.     
16ee0 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71   );.    }.    sq
16ef0 6c 69 74 65 33 43 68 61 6e 67 65 43 6f 6f 6b 69  lite3ChangeCooki
16f00 65 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a  e(pParse, iDb);.
16f10 20 20 20 20 64 65 73 74 72 6f 79 52 6f 6f 74 50      destroyRootP
16f20 61 67 65 28 70 50 61 72 73 65 2c 20 70 49 6e 64  age(pParse, pInd
16f30 65 78 2d 3e 74 6e 75 6d 2c 20 69 44 62 29 3b 0a  ex->tnum, iDb);.
16f40 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
16f50 64 64 4f 70 34 28 76 2c 20 4f 50 5f 44 72 6f 70  ddOp4(v, OP_Drop
16f60 49 6e 64 65 78 2c 20 69 44 62 2c 20 30 2c 20 30  Index, iDb, 0, 0
16f70 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c  , pIndex->zName,
16f80 20 30 29 3b 0a 20 20 7d 0a 0a 65 78 69 74 5f 64   0);.  }..exit_d
16f90 72 6f 70 5f 69 6e 64 65 78 3a 0a 20 20 73 71 6c  rop_index:.  sql
16fa0 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74  ite3SrcListDelet
16fb0 65 28 64 62 2c 20 70 4e 61 6d 65 29 3b 0a 7d 0a  e(db, pName);.}.
16fc0 0a 2f 2a 0a 2a 2a 20 70 41 72 72 61 79 20 69 73  ./*.** pArray is
16fd0 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e   a pointer to an
16fe0 20 61 72 72 61 79 20 6f 66 20 6f 62 6a 65 63 74   array of object
16ff0 73 2e 20 20 45 61 63 68 20 6f 62 6a 65 63 74 20  s.  Each object 
17000 69 6e 20 74 68 65 0a 2a 2a 20 61 72 72 61 79 20  in the.** array 
17010 69 73 20 73 7a 45 6e 74 72 79 20 62 79 74 65 73  is szEntry bytes
17020 20 69 6e 20 73 69 7a 65 2e 20 20 54 68 69 73 20   in size.  This 
17030 72 6f 75 74 69 6e 65 20 61 6c 6c 6f 63 61 74 65  routine allocate
17040 73 20 61 20 6e 65 77 0a 2a 2a 20 6f 62 6a 65 63  s a new.** objec
17050 74 20 6f 6e 20 74 68 65 20 65 6e 64 20 6f 66 20  t on the end of 
17060 74 68 65 20 61 72 72 61 79 2e 0a 2a 2a 0a 2a 2a  the array..**.**
17070 20 2a 70 6e 45 6e 74 72 79 20 69 73 20 74 68 65   *pnEntry is the
17080 20 6e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69   number of entri
17090 65 73 20 61 6c 72 65 61 64 79 20 69 6e 20 75 73  es already in us
170a0 65 2e 20 20 2a 70 6e 41 6c 6c 6f 63 20 69 73 0a  e.  *pnAlloc is.
170b0 2a 2a 20 74 68 65 20 70 72 65 76 69 6f 75 73 6c  ** the previousl
170c0 79 20 61 6c 6c 6f 63 61 74 65 64 20 73 69 7a 65  y allocated size
170d0 20 6f 66 20 74 68 65 20 61 72 72 61 79 2e 20 20   of the array.  
170e0 69 6e 69 74 53 69 7a 65 20 69 73 20 74 68 65 0a  initSize is the.
170f0 2a 2a 20 73 75 67 67 65 73 74 65 64 20 69 6e 69  ** suggested ini
17100 74 69 61 6c 20 61 72 72 61 79 20 73 69 7a 65 20  tial array size 
17110 61 6c 6c 6f 63 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a  allocation..**.*
17120 2a 20 54 68 65 20 69 6e 64 65 78 20 6f 66 20 74  * The index of t
17130 68 65 20 6e 65 77 20 65 6e 74 72 79 20 69 73 20  he new entry is 
17140 72 65 74 75 72 6e 65 64 20 69 6e 20 2a 70 49 64  returned in *pId
17150 78 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  x..**.** This ro
17160 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 61 20  utine returns a 
17170 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 61  pointer to the a
17180 72 72 61 79 20 6f 66 20 6f 62 6a 65 63 74 73 2e  rray of objects.
17190 20 20 54 68 69 73 0a 2a 2a 20 6d 69 67 68 74 20    This.** might 
171a0 62 65 20 74 68 65 20 73 61 6d 65 20 61 73 20 74  be the same as t
171b0 68 65 20 70 41 72 72 61 79 20 70 61 72 61 6d 65  he pArray parame
171c0 74 65 72 20 6f 72 20 69 74 20 6d 69 67 68 74 20  ter or it might 
171d0 62 65 20 61 20 64 69 66 66 65 72 65 6e 74 0a 2a  be a different.*
171e0 2a 20 70 6f 69 6e 74 65 72 20 69 66 20 74 68 65  * pointer if the
171f0 20 61 72 72 61 79 20 77 61 73 20 72 65 73 69 7a   array was resiz
17200 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c  ed..*/.void *sql
17210 69 74 65 33 41 72 72 61 79 41 6c 6c 6f 63 61 74  ite3ArrayAllocat
17220 65 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  e(.  sqlite3 *db
17230 2c 20 20 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63  ,      /* Connec
17240 74 69 6f 6e 20 74 6f 20 6e 6f 74 69 66 79 20 6f  tion to notify o
17250 66 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65  f malloc failure
17260 73 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 41 72  s */.  void *pAr
17270 72 61 79 2c 20 20 20 20 20 2f 2a 20 41 72 72 61  ray,     /* Arra
17280 79 20 6f 66 20 6f 62 6a 65 63 74 73 2e 20 20 4d  y of objects.  M
17290 69 67 68 74 20 62 65 20 72 65 61 6c 6c 6f 63 61  ight be realloca
172a0 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 45  ted */.  int szE
172b0 6e 74 72 79 2c 20 20 20 20 20 20 2f 2a 20 53 69  ntry,      /* Si
172c0 7a 65 20 6f 66 20 65 61 63 68 20 6f 62 6a 65 63  ze of each objec
172d0 74 20 69 6e 20 74 68 65 20 61 72 72 61 79 20 2a  t in the array *
172e0 2f 0a 20 20 69 6e 74 20 69 6e 69 74 53 69 7a 65  /.  int initSize
172f0 2c 20 20 20 20 20 2f 2a 20 53 75 67 67 65 73 74  ,     /* Suggest
17300 65 64 20 69 6e 69 74 69 61 6c 20 61 6c 6c 6f 63  ed initial alloc
17310 61 74 69 6f 6e 2c 20 69 6e 20 65 6c 65 6d 65 6e  ation, in elemen
17320 74 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 45  ts */.  int *pnE
17330 6e 74 72 79 2c 20 20 20 20 20 2f 2a 20 4e 75 6d  ntry,     /* Num
17340 62 65 72 20 6f 66 20 6f 62 6a 65 63 74 73 20 63  ber of objects c
17350 75 72 72 65 6e 74 6c 79 20 69 6e 20 75 73 65 20  urrently in use 
17360 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 41 6c 6c 6f  */.  int *pnAllo
17370 63 2c 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e  c,     /* Curren
17380 74 20 73 69 7a 65 20 6f 66 20 74 68 65 20 61 6c  t size of the al
17390 6c 6f 63 61 74 69 6f 6e 2c 20 69 6e 20 65 6c 65  location, in ele
173a0 6d 65 6e 74 73 20 2a 2f 0a 20 20 69 6e 74 20 2a  ments */.  int *
173b0 70 49 64 78 20 20 20 20 20 20 20 20 20 2f 2a 20  pIdx         /* 
173c0 57 72 69 74 65 20 74 68 65 20 69 6e 64 65 78 20  Write the index 
173d0 6f 66 20 61 20 6e 65 77 20 73 6c 6f 74 20 68 65  of a new slot he
173e0 72 65 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20  re */.){.  char 
173f0 2a 7a 3b 0a 20 20 69 66 28 20 2a 70 6e 45 6e 74  *z;.  if( *pnEnt
17400 72 79 20 3e 3d 20 2a 70 6e 41 6c 6c 6f 63 20 29  ry >= *pnAlloc )
17410 7b 0a 20 20 20 20 76 6f 69 64 20 2a 70 4e 65 77  {.    void *pNew
17420 3b 0a 20 20 20 20 69 6e 74 20 6e 65 77 53 69 7a  ;.    int newSiz
17430 65 3b 0a 20 20 20 20 6e 65 77 53 69 7a 65 20 3d  e;.    newSize =
17440 20 28 2a 70 6e 41 6c 6c 6f 63 29 2a 32 20 2b 20   (*pnAlloc)*2 + 
17450 69 6e 69 74 53 69 7a 65 3b 0a 20 20 20 20 70 4e  initSize;.    pN
17460 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62 52 65  ew = sqlite3DbRe
17470 61 6c 6c 6f 63 28 64 62 2c 20 70 41 72 72 61 79  alloc(db, pArray
17480 2c 20 6e 65 77 53 69 7a 65 2a 73 7a 45 6e 74 72  , newSize*szEntr
17490 79 29 3b 0a 20 20 20 20 69 66 28 20 70 4e 65 77  y);.    if( pNew
174a0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2a 70 49  ==0 ){.      *pI
174b0 64 78 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 72  dx = -1;.      r
174c0 65 74 75 72 6e 20 70 41 72 72 61 79 3b 0a 20 20  eturn pArray;.  
174d0 20 20 7d 0a 20 20 20 20 2a 70 6e 41 6c 6c 6f 63    }.    *pnAlloc
174e0 20 3d 20 6e 65 77 53 69 7a 65 3b 0a 20 20 20 20   = newSize;.    
174f0 70 41 72 72 61 79 20 3d 20 70 4e 65 77 3b 0a 20  pArray = pNew;. 
17500 20 7d 0a 20 20 7a 20 3d 20 28 63 68 61 72 2a 29   }.  z = (char*)
17510 70 41 72 72 61 79 3b 0a 20 20 6d 65 6d 73 65 74  pArray;.  memset
17520 28 26 7a 5b 2a 70 6e 45 6e 74 72 79 20 2a 20 73  (&z[*pnEntry * s
17530 7a 45 6e 74 72 79 5d 2c 20 30 2c 20 73 7a 45 6e  zEntry], 0, szEn
17540 74 72 79 29 3b 0a 20 20 2a 70 49 64 78 20 3d 20  try);.  *pIdx = 
17550 2a 70 6e 45 6e 74 72 79 3b 0a 20 20 2b 2b 2a 70  *pnEntry;.  ++*p
17560 6e 45 6e 74 72 79 3b 0a 20 20 72 65 74 75 72 6e  nEntry;.  return
17570 20 70 41 72 72 61 79 3b 0a 7d 0a 0a 2f 2a 0a 2a   pArray;.}../*.*
17580 2a 20 41 70 70 65 6e 64 20 61 20 6e 65 77 20 65  * Append a new e
17590 6c 65 6d 65 6e 74 20 74 6f 20 74 68 65 20 67 69  lement to the gi
175a0 76 65 6e 20 49 64 4c 69 73 74 2e 20 20 43 72 65  ven IdList.  Cre
175b0 61 74 65 20 61 20 6e 65 77 20 49 64 4c 69 73 74  ate a new IdList
175c0 20 69 66 0a 2a 2a 20 6e 65 65 64 20 62 65 2e 0a   if.** need be..
175d0 2a 2a 0a 2a 2a 20 41 20 6e 65 77 20 49 64 4c 69  **.** A new IdLi
175e0 73 74 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20  st is returned, 
175f0 6f 72 20 4e 55 4c 4c 20 69 66 20 6d 61 6c 6c 6f  or NULL if mallo
17600 63 28 29 20 66 61 69 6c 73 2e 0a 2a 2f 0a 49 64  c() fails..*/.Id
17610 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 49 64 4c  List *sqlite3IdL
17620 69 73 74 41 70 70 65 6e 64 28 73 71 6c 69 74 65  istAppend(sqlite
17630 33 20 2a 64 62 2c 20 49 64 4c 69 73 74 20 2a 70  3 *db, IdList *p
17640 4c 69 73 74 2c 20 54 6f 6b 65 6e 20 2a 70 54 6f  List, Token *pTo
17650 6b 65 6e 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  ken){.  int i;. 
17660 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b   if( pList==0 ){
17670 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 73 71 6c  .    pList = sql
17680 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f  ite3DbMallocZero
17690 28 64 62 2c 20 73 69 7a 65 6f 66 28 49 64 4c 69  (db, sizeof(IdLi
176a0 73 74 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70  st) );.    if( p
176b0 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e  List==0 ) return
176c0 20 30 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 6e   0;.    pList->n
176d0 41 6c 6c 6f 63 20 3d 20 30 3b 0a 20 20 7d 0a 20  Alloc = 0;.  }. 
176e0 20 70 4c 69 73 74 2d 3e 61 20 3d 20 73 71 6c 69   pList->a = sqli
176f0 74 65 33 41 72 72 61 79 41 6c 6c 6f 63 61 74 65  te3ArrayAllocate
17700 28 0a 20 20 20 20 20 20 64 62 2c 0a 20 20 20 20  (.      db,.    
17710 20 20 70 4c 69 73 74 2d 3e 61 2c 0a 20 20 20 20    pList->a,.    
17720 20 20 73 69 7a 65 6f 66 28 70 4c 69 73 74 2d 3e    sizeof(pList->
17730 61 5b 30 5d 29 2c 0a 20 20 20 20 20 20 35 2c 0a  a[0]),.      5,.
17740 20 20 20 20 20 20 26 70 4c 69 73 74 2d 3e 6e 49        &pList->nI
17750 64 2c 0a 20 20 20 20 20 20 26 70 4c 69 73 74 2d  d,.      &pList-
17760 3e 6e 41 6c 6c 6f 63 2c 0a 20 20 20 20 20 20 26  >nAlloc,.      &
17770 69 0a 20 20 29 3b 0a 20 20 69 66 28 20 69 3c 30  i.  );.  if( i<0
17780 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 49   ){.    sqlite3I
17790 64 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20  dListDelete(db, 
177a0 70 4c 69 73 74 29 3b 0a 20 20 20 20 72 65 74 75  pList);.    retu
177b0 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 4c 69 73  rn 0;.  }.  pLis
177c0 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20 3d 20  t->a[i].zName = 
177d0 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54  sqlite3NameFromT
177e0 6f 6b 65 6e 28 64 62 2c 20 70 54 6f 6b 65 6e 29  oken(db, pToken)
177f0 3b 0a 20 20 72 65 74 75 72 6e 20 70 4c 69 73 74  ;.  return pList
17800 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74  ;.}../*.** Delet
17810 65 20 61 6e 20 49 64 4c 69 73 74 2e 0a 2a 2f 0a  e an IdList..*/.
17820 76 6f 69 64 20 73 71 6c 69 74 65 33 49 64 4c 69  void sqlite3IdLi
17830 73 74 44 65 6c 65 74 65 28 73 71 6c 69 74 65 33  stDelete(sqlite3
17840 20 2a 64 62 2c 20 49 64 4c 69 73 74 20 2a 70 4c   *db, IdList *pL
17850 69 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  ist){.  int i;. 
17860 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20   if( pList==0 ) 
17870 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d  return;.  for(i=
17880 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 49 64 3b  0; i<pList->nId;
17890 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74   i++){.    sqlit
178a0 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 4c 69  e3DbFree(db, pLi
178b0 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b  st->a[i].zName);
178c0 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44 62  .  }.  sqlite3Db
178d0 46 72 65 65 28 64 62 2c 20 70 4c 69 73 74 2d 3e  Free(db, pList->
178e0 61 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46  a);.  sqlite3DbF
178f0 72 65 65 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a  ree(db, pList);.
17900 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
17910 74 68 65 20 69 6e 64 65 78 20 69 6e 20 70 4c 69  the index in pLi
17920 73 74 20 6f 66 20 74 68 65 20 69 64 65 6e 74 69  st of the identi
17930 66 69 65 72 20 6e 61 6d 65 64 20 7a 49 64 2e 20  fier named zId. 
17940 20 52 65 74 75 72 6e 20 2d 31 0a 2a 2a 20 69 66   Return -1.** if
17950 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 69   not found..*/.i
17960 6e 74 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74  nt sqlite3IdList
17970 49 6e 64 65 78 28 49 64 4c 69 73 74 20 2a 70 4c  Index(IdList *pL
17980 69 73 74 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  ist, const char 
17990 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 69  *zName){.  int i
179a0 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30  ;.  if( pList==0
179b0 20 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20   ) return -1;.  
179c0 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74  for(i=0; i<pList
179d0 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nId; i++){.   
179e0 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49   if( sqlite3StrI
179f0 43 6d 70 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  Cmp(pList->a[i].
17a00 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29 3d 3d 30  zName, zName)==0
17a10 20 29 20 72 65 74 75 72 6e 20 69 3b 0a 20 20 7d   ) return i;.  }
17a20 0a 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a  .  return -1;.}.
17a30 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 61 20  ./*.** Append a 
17a40 6e 65 77 20 74 61 62 6c 65 20 6e 61 6d 65 20 74  new table name t
17a50 6f 20 74 68 65 20 67 69 76 65 6e 20 53 72 63 4c  o the given SrcL
17a60 69 73 74 2e 20 20 43 72 65 61 74 65 20 61 20 6e  ist.  Create a n
17a70 65 77 20 53 72 63 4c 69 73 74 20 69 66 0a 2a 2a  ew SrcList if.**
17a80 20 6e 65 65 64 20 62 65 2e 20 20 41 20 6e 65 77   need be.  A new
17a90 20 65 6e 74 72 79 20 69 73 20 63 72 65 61 74 65   entry is create
17aa0 64 20 69 6e 20 74 68 65 20 53 72 63 4c 69 73 74  d in the SrcList
17ab0 20 65 76 65 6e 20 69 66 20 70 54 6f 6b 65 6e 20   even if pToken 
17ac0 69 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 41  is NULL..**.** A
17ad0 20 6e 65 77 20 53 72 63 4c 69 73 74 20 69 73 20   new SrcList is 
17ae0 72 65 74 75 72 6e 65 64 2c 20 6f 72 20 4e 55 4c  returned, or NUL
17af0 4c 20 69 66 20 6d 61 6c 6c 6f 63 28 29 20 66 61  L if malloc() fa
17b00 69 6c 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 44  ils..**.** If pD
17b10 61 74 61 62 61 73 65 20 69 73 20 6e 6f 74 20 6e  atabase is not n
17b20 75 6c 6c 2c 20 69 74 20 6d 65 61 6e 73 20 74 68  ull, it means th
17b30 61 74 20 74 68 65 20 74 61 62 6c 65 20 68 61 73  at the table has
17b40 20 61 6e 20 6f 70 74 69 6f 6e 61 6c 0a 2a 2a 20   an optional.** 
17b50 64 61 74 61 62 61 73 65 20 6e 61 6d 65 20 70 72  database name pr
17b60 65 66 69 78 2e 20 20 4c 69 6b 65 20 74 68 69 73  efix.  Like this
17b70 3a 20 20 22 64 61 74 61 62 61 73 65 2e 74 61 62  :  "database.tab
17b80 6c 65 22 2e 20 20 54 68 65 20 70 44 61 74 61 62  le".  The pDatab
17b90 61 73 65 0a 2a 2a 20 70 6f 69 6e 74 73 20 74 6f  ase.** points to
17ba0 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20   the table name 
17bb0 61 6e 64 20 74 68 65 20 70 54 61 62 6c 65 20 70  and the pTable p
17bc0 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 64 61 74  oints to the dat
17bd0 61 62 61 73 65 20 6e 61 6d 65 2e 0a 2a 2a 20 54  abase name..** T
17be0 68 65 20 53 72 63 4c 69 73 74 2e 61 5b 5d 2e 7a  he SrcList.a[].z
17bf0 4e 61 6d 65 20 66 69 65 6c 64 20 69 73 20 66 69  Name field is fi
17c00 6c 6c 65 64 20 77 69 74 68 20 74 68 65 20 74 61  lled with the ta
17c10 62 6c 65 20 6e 61 6d 65 20 77 68 69 63 68 20 6d  ble name which m
17c20 69 67 68 74 0a 2a 2a 20 63 6f 6d 65 20 66 72 6f  ight.** come fro
17c30 6d 20 70 54 61 62 6c 65 20 28 69 66 20 70 44 61  m pTable (if pDa
17c40 74 61 62 61 73 65 20 69 73 20 4e 55 4c 4c 29 20  tabase is NULL) 
17c50 6f 72 20 66 72 6f 6d 20 70 44 61 74 61 62 61 73  or from pDatabas
17c60 65 2e 20 20 0a 2a 2a 20 53 72 63 4c 69 73 74 2e  e.  .** SrcList.
17c70 61 5b 5d 2e 7a 44 61 74 61 62 61 73 65 20 69 73  a[].zDatabase is
17c80 20 66 69 6c 6c 65 64 20 77 69 74 68 20 74 68 65   filled with the
17c90 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 20 66   database name f
17ca0 72 6f 6d 20 70 54 61 62 6c 65 2c 0a 2a 2a 20 6f  rom pTable,.** o
17cb0 72 20 77 69 74 68 20 4e 55 4c 4c 20 69 66 20 6e  r with NULL if n
17cc0 6f 20 64 61 74 61 62 61 73 65 20 69 73 20 73 70  o database is sp
17cd0 65 63 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 49  ecified..**.** I
17ce0 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 69  n other words, i
17cf0 66 20 63 61 6c 6c 20 6c 69 6b 65 20 74 68 69 73  f call like this
17d00 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20  :.**.**         
17d10 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70  sqlite3SrcListAp
17d20 70 65 6e 64 28 44 2c 41 2c 42 2c 30 29 3b 0a 2a  pend(D,A,B,0);.*
17d30 2a 0a 2a 2a 20 54 68 65 6e 20 42 20 69 73 20 61  *.** Then B is a
17d40 20 74 61 62 6c 65 20 6e 61 6d 65 20 61 6e 64 20   table name and 
17d50 74 68 65 20 64 61 74 61 62 61 73 65 20 6e 61 6d  the database nam
17d60 65 20 69 73 20 75 6e 73 70 65 63 69 66 69 65 64  e is unspecified
17d70 2e 20 20 49 66 20 63 61 6c 6c 65 64 0a 2a 2a 20  .  If called.** 
17d80 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a  like this:.**.**
17d90 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
17da0 53 72 63 4c 69 73 74 41 70 70 65 6e 64 28 44 2c  SrcListAppend(D,
17db0 41 2c 42 2c 43 29 3b 0a 2a 2a 0a 2a 2a 20 54 68  A,B,C);.**.** Th
17dc0 65 6e 20 43 20 69 73 20 74 68 65 20 74 61 62 6c  en C is the tabl
17dd0 65 20 6e 61 6d 65 20 61 6e 64 20 42 20 69 73 20  e name and B is 
17de0 74 68 65 20 64 61 74 61 62 61 73 65 20 6e 61 6d  the database nam
17df0 65 2e 0a 2a 2f 0a 53 72 63 4c 69 73 74 20 2a 73  e..*/.SrcList *s
17e00 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70 70  qlite3SrcListApp
17e10 65 6e 64 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  end(.  sqlite3 *
17e20 64 62 2c 20 20 20 20 20 20 20 20 2f 2a 20 43 6f  db,        /* Co
17e30 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 6e 6f 74 69  nnection to noti
17e40 66 79 20 6f 66 20 6d 61 6c 6c 6f 63 20 66 61 69  fy of malloc fai
17e50 6c 75 72 65 73 20 2a 2f 0a 20 20 53 72 63 4c 69  lures */.  SrcLi
17e60 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 20 20 2f  st *pList,     /
17e70 2a 20 41 70 70 65 6e 64 20 74 6f 20 74 68 69 73  * Append to this
17e80 20 53 72 63 4c 69 73 74 2e 20 4e 55 4c 4c 20 63   SrcList. NULL c
17e90 72 65 61 74 65 73 20 61 20 6e 65 77 20 53 72 63  reates a new Src
17ea0 4c 69 73 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  List */.  Token 
17eb0 2a 70 54 61 62 6c 65 2c 20 20 20 20 20 20 2f 2a  *pTable,      /*
17ec0 20 54 61 62 6c 65 20 74 6f 20 61 70 70 65 6e 64   Table to append
17ed0 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 44 61   */.  Token *pDa
17ee0 74 61 62 61 73 65 20 20 20 20 2f 2a 20 44 61 74  tabase    /* Dat
17ef0 61 62 61 73 65 20 6f 66 20 74 68 65 20 74 61 62  abase of the tab
17f00 6c 65 20 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63  le */.){.  struc
17f10 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
17f20 70 49 74 65 6d 3b 0a 20 20 69 66 28 20 70 4c 69  pItem;.  if( pLi
17f30 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4c 69  st==0 ){.    pLi
17f40 73 74 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  st = sqlite3DbMa
17f50 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a  llocZero(db, siz
17f60 65 6f 66 28 53 72 63 4c 69 73 74 29 20 29 3b 0a  eof(SrcList) );.
17f70 20 20 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30      if( pList==0
17f80 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20   ) return 0;.   
17f90 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20 3d   pList->nAlloc =
17fa0 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 4c   1;.  }.  if( pL
17fb0 69 73 74 2d 3e 6e 53 72 63 3e 3d 70 4c 69 73 74  ist->nSrc>=pList
17fc0 2d 3e 6e 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20  ->nAlloc ){.    
17fd0 53 72 63 4c 69 73 74 20 2a 70 4e 65 77 3b 0a 20  SrcList *pNew;. 
17fe0 20 20 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63     pList->nAlloc
17ff0 20 2a 3d 20 32 3b 0a 20 20 20 20 70 4e 65 77 20   *= 2;.    pNew 
18000 3d 20 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c  = sqlite3DbReall
18010 6f 63 28 64 62 2c 20 70 4c 69 73 74 2c 0a 20 20  oc(db, pList,.  
18020 20 20 20 20 20 20 20 20 20 20 20 20 20 73 69 7a               siz
18030 65 6f 66 28 2a 70 4c 69 73 74 29 20 2b 20 28 70  eof(*pList) + (p
18040 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 2d 31 29 2a  List->nAlloc-1)*
18050 73 69 7a 65 6f 66 28 70 4c 69 73 74 2d 3e 61 5b  sizeof(pList->a[
18060 30 5d 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70  0]) );.    if( p
18070 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  New==0 ){.      
18080 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44 65  sqlite3SrcListDe
18090 6c 65 74 65 28 64 62 2c 20 70 4c 69 73 74 29 3b  lete(db, pList);
180a0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  .      return 0;
180b0 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c 69 73 74  .    }.    pList
180c0 20 3d 20 70 4e 65 77 3b 0a 20 20 7d 0a 20 20 70   = pNew;.  }.  p
180d0 49 74 65 6d 20 3d 20 26 70 4c 69 73 74 2d 3e 61  Item = &pList->a
180e0 5b 70 4c 69 73 74 2d 3e 6e 53 72 63 5d 3b 0a 20  [pList->nSrc];. 
180f0 20 6d 65 6d 73 65 74 28 70 49 74 65 6d 2c 20 30   memset(pItem, 0
18100 2c 20 73 69 7a 65 6f 66 28 70 4c 69 73 74 2d 3e  , sizeof(pList->
18110 61 5b 30 5d 29 29 3b 0a 20 20 69 66 28 20 70 44  a[0]));.  if( pD
18120 61 74 61 62 61 73 65 20 26 26 20 70 44 61 74 61  atabase && pData
18130 62 61 73 65 2d 3e 7a 3d 3d 30 20 29 7b 0a 20 20  base->z==0 ){.  
18140 20 20 70 44 61 74 61 62 61 73 65 20 3d 20 30 3b    pDatabase = 0;
18150 0a 20 20 7d 0a 20 20 69 66 28 20 70 44 61 74 61  .  }.  if( pData
18160 62 61 73 65 20 26 26 20 70 54 61 62 6c 65 20 29  base && pTable )
18170 7b 0a 20 20 20 20 54 6f 6b 65 6e 20 2a 70 54 65  {.    Token *pTe
18180 6d 70 20 3d 20 70 44 61 74 61 62 61 73 65 3b 0a  mp = pDatabase;.
18190 20 20 20 20 70 44 61 74 61 62 61 73 65 20 3d 20      pDatabase = 
181a0 70 54 61 62 6c 65 3b 0a 20 20 20 20 70 54 61 62  pTable;.    pTab
181b0 6c 65 20 3d 20 70 54 65 6d 70 3b 0a 20 20 7d 0a  le = pTemp;.  }.
181c0 20 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d    pItem->zName =
181d0 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d   sqlite3NameFrom
181e0 54 6f 6b 65 6e 28 64 62 2c 20 70 54 61 62 6c 65  Token(db, pTable
181f0 29 3b 0a 20 20 70 49 74 65 6d 2d 3e 7a 44 61 74  );.  pItem->zDat
18200 61 62 61 73 65 20 3d 20 73 71 6c 69 74 65 33 4e  abase = sqlite3N
18210 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c  ameFromToken(db,
18220 20 70 44 61 74 61 62 61 73 65 29 3b 0a 20 20 70   pDatabase);.  p
18230 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 20 3d 20  Item->iCursor = 
18240 2d 31 3b 0a 20 20 70 49 74 65 6d 2d 3e 69 73 50  -1;.  pItem->isP
18250 6f 70 75 6c 61 74 65 64 20 3d 20 30 3b 0a 20 20  opulated = 0;.  
18260 70 4c 69 73 74 2d 3e 6e 53 72 63 2b 2b 3b 0a 20  pList->nSrc++;. 
18270 20 72 65 74 75 72 6e 20 70 4c 69 73 74 3b 0a 7d   return pList;.}
18280 0a 0a 2f 2a 0a 2a 2a 20 41 73 73 69 67 6e 20 63  ../*.** Assign c
18290 75 72 73 6f 72 73 20 74 6f 20 61 6c 6c 20 74 61  ursors to all ta
182a0 62 6c 65 73 20 69 6e 20 61 20 53 72 63 4c 69 73  bles in a SrcLis
182b0 74 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  t.*/.void sqlite
182c0 33 53 72 63 4c 69 73 74 41 73 73 69 67 6e 43 75  3SrcListAssignCu
182d0 72 73 6f 72 73 28 50 61 72 73 65 20 2a 70 50 61  rsors(Parse *pPa
182e0 72 73 65 2c 20 53 72 63 4c 69 73 74 20 2a 70 4c  rse, SrcList *pL
182f0 69 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  ist){.  int i;. 
18300 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
18310 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 61  item *pItem;.  a
18320 73 73 65 72 74 28 70 4c 69 73 74 20 7c 7c 20 70  ssert(pList || p
18330 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  Parse->db->mallo
18340 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 69 66 28  cFailed );.  if(
18350 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 66 6f   pList ){.    fo
18360 72 28 69 3d 30 2c 20 70 49 74 65 6d 3d 70 4c 69  r(i=0, pItem=pLi
18370 73 74 2d 3e 61 3b 20 69 3c 70 4c 69 73 74 2d 3e  st->a; i<pList->
18380 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 49 74 65 6d  nSrc; i++, pItem
18390 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  ++){.      if( p
183a0 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3e 3d 30  Item->iCursor>=0
183b0 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
183c0 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 20 3d  pItem->iCursor =
183d0 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b   pParse->nTab++;
183e0 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65 6d  .      if( pItem
183f0 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20  ->pSelect ){.   
18400 20 20 20 20 20 73 71 6c 69 74 65 33 53 72 63 4c       sqlite3SrcL
18410 69 73 74 41 73 73 69 67 6e 43 75 72 73 6f 72 73  istAssignCursors
18420 28 70 50 61 72 73 65 2c 20 70 49 74 65 6d 2d 3e  (pParse, pItem->
18430 70 53 65 6c 65 63 74 2d 3e 70 53 72 63 29 3b 0a  pSelect->pSrc);.
18440 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
18450 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74  }.}../*.** Delet
18460 65 20 61 6e 20 65 6e 74 69 72 65 20 53 72 63 4c  e an entire SrcL
18470 69 73 74 20 69 6e 63 6c 75 64 69 6e 67 20 61 6c  ist including al
18480 6c 20 69 74 73 20 73 75 62 73 74 72 75 63 74 75  l its substructu
18490 72 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  re..*/.void sqli
184a0 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65  te3SrcListDelete
184b0 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 53 72  (sqlite3 *db, Sr
184c0 63 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20  cList *pList){. 
184d0 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74   int i;.  struct
184e0 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
184f0 49 74 65 6d 3b 0a 20 20 69 66 28 20 70 4c 69 73  Item;.  if( pLis
18500 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  t==0 ) return;. 
18510 20 66 6f 72 28 70 49 74 65 6d 3d 70 4c 69 73 74   for(pItem=pList
18520 2d 3e 61 2c 20 69 3d 30 3b 20 69 3c 70 4c 69 73  ->a, i=0; i<pLis
18530 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 49  t->nSrc; i++, pI
18540 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69  tem++){.    sqli
18550 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 49  te3DbFree(db, pI
18560 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 29 3b  tem->zDatabase);
18570 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
18580 65 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 7a 4e  ee(db, pItem->zN
18590 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ame);.    sqlite
185a0 33 44 62 46 72 65 65 28 64 62 2c 20 70 49 74 65  3DbFree(db, pIte
185b0 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20 20 20 20  m->zAlias);.    
185c0 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62  sqlite3DeleteTab
185d0 6c 65 28 70 49 74 65 6d 2d 3e 70 54 61 62 29 3b  le(pItem->pTab);
185e0 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65  .    sqlite3Sele
185f0 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70 49 74  ctDelete(db, pIt
18600 65 6d 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20  em->pSelect);.  
18610 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
18620 65 74 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 70  ete(db, pItem->p
18630 4f 6e 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  On);.    sqlite3
18640 49 64 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c  IdListDelete(db,
18650 20 70 49 74 65 6d 2d 3e 70 55 73 69 6e 67 29 3b   pItem->pUsing);
18660 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44 62  .  }.  sqlite3Db
18670 46 72 65 65 28 64 62 2c 20 70 4c 69 73 74 29 3b  Free(db, pList);
18680 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
18690 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
186a0 20 62 79 20 74 68 65 20 70 61 72 73 65 72 20 74   by the parser t
186b0 6f 20 61 64 64 20 61 20 6e 65 77 20 74 65 72 6d  o add a new term
186c0 20 74 6f 20 74 68 65 0a 2a 2a 20 65 6e 64 20 6f   to the.** end o
186d0 66 20 61 20 67 72 6f 77 69 6e 67 20 46 52 4f 4d  f a growing FROM
186e0 20 63 6c 61 75 73 65 2e 20 20 54 68 65 20 22 70   clause.  The "p
186f0 22 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 74  " parameter is t
18700 68 65 20 70 61 72 74 20 6f 66 0a 2a 2a 20 74 68  he part of.** th
18710 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 68  e FROM clause th
18720 61 74 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  at has already b
18730 65 65 6e 20 63 6f 6e 73 74 72 75 63 74 65 64 2e  een constructed.
18740 20 20 22 70 22 20 69 73 20 4e 55 4c 4c 0a 2a 2a    "p" is NULL.**
18750 20 69 66 20 74 68 69 73 20 69 73 20 74 68 65 20   if this is the 
18760 66 69 72 73 74 20 74 65 72 6d 20 6f 66 20 74 68  first term of th
18770 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20  e FROM clause.  
18780 70 54 61 62 6c 65 20 61 6e 64 20 70 44 61 74 61  pTable and pData
18790 62 61 73 65 0a 2a 2a 20 61 72 65 20 74 68 65 20  base.** are the 
187a0 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c  name of the tabl
187b0 65 20 61 6e 64 20 64 61 74 61 62 61 73 65 20 6e  e and database n
187c0 61 6d 65 64 20 69 6e 20 74 68 65 20 46 52 4f 4d  amed in the FROM
187d0 20 63 6c 61 75 73 65 20 74 65 72 6d 2e 0a 2a 2a   clause term..**
187e0 20 70 44 61 74 61 62 61 73 65 20 69 73 20 4e 55   pDatabase is NU
187f0 4c 4c 20 69 66 20 74 68 65 20 64 61 74 61 62 61  LL if the databa
18800 73 65 20 6e 61 6d 65 20 71 75 61 6c 69 66 69 65  se name qualifie
18810 72 20 69 73 20 6d 69 73 73 69 6e 67 20 2d 20 74  r is missing - t
18820 68 65 0a 2a 2a 20 75 73 75 61 6c 20 63 61 73 65  he.** usual case
18830 2e 20 20 49 66 20 74 68 65 20 74 65 72 6d 20 68  .  If the term h
18840 61 73 20 61 20 61 6c 69 61 73 2c 20 74 68 65 6e  as a alias, then
18850 20 70 41 6c 69 61 73 20 70 6f 69 6e 74 73 20 74   pAlias points t
18860 6f 20 74 68 65 0a 2a 2a 20 61 6c 69 61 73 20 74  o the.** alias t
18870 6f 6b 65 6e 2e 20 20 49 66 20 74 68 65 20 74 65  oken.  If the te
18880 72 6d 20 69 73 20 61 20 73 75 62 71 75 65 72 79  rm is a subquery
18890 2c 20 74 68 65 6e 20 70 53 75 62 71 75 65 72 79  , then pSubquery
188a0 20 69 73 20 74 68 65 0a 2a 2a 20 53 45 4c 45 43   is the.** SELEC
188b0 54 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74  T statement that
188c0 20 74 68 65 20 73 75 62 71 75 65 72 79 20 65 6e   the subquery en
188d0 63 6f 64 65 73 2e 20 20 54 68 65 20 70 54 61 62  codes.  The pTab
188e0 6c 65 20 61 6e 64 0a 2a 2a 20 70 44 61 74 61 62  le and.** pDatab
188f0 61 73 65 20 70 61 72 61 6d 65 74 65 72 73 20 61  ase parameters a
18900 72 65 20 4e 55 4c 4c 20 66 6f 72 20 73 75 62 71  re NULL for subq
18910 75 65 72 69 65 73 2e 20 20 54 68 65 20 70 4f 6e  ueries.  The pOn
18920 20 61 6e 64 20 70 55 73 69 6e 67 0a 2a 2a 20 70   and pUsing.** p
18930 61 72 61 6d 65 74 65 72 73 20 61 72 65 20 74 68  arameters are th
18940 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65  e content of the
18950 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 63 6c   ON and USING cl
18960 61 75 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  auses..**.** Ret
18970 75 72 6e 20 61 20 6e 65 77 20 53 72 63 4c 69 73  urn a new SrcLis
18980 74 20 77 68 69 63 68 20 65 6e 63 6f 64 65 73 20  t which encodes 
18990 69 73 20 74 68 65 20 46 52 4f 4d 20 77 69 74 68  is the FROM with
189a0 20 74 68 65 20 6e 65 77 0a 2a 2a 20 74 65 72 6d   the new.** term
189b0 20 61 64 64 65 64 2e 0a 2a 2f 0a 53 72 63 4c 69   added..*/.SrcLi
189c0 73 74 20 2a 73 71 6c 69 74 65 33 53 72 63 4c 69  st *sqlite3SrcLi
189d0 73 74 41 70 70 65 6e 64 46 72 6f 6d 54 65 72 6d  stAppendFromTerm
189e0 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
189f0 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  e,          /* P
18a00 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
18a10 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 2c 20  /.  SrcList *p, 
18a20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
18a30 68 65 20 6c 65 66 74 20 70 61 72 74 20 6f 66 20  he left part of 
18a40 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
18a50 61 6c 72 65 61 64 79 20 73 65 65 6e 20 2a 2f 0a  already seen */.
18a60 20 20 54 6f 6b 65 6e 20 2a 70 54 61 62 6c 65 2c    Token *pTable,
18a70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
18a80 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74  e of the table t
18a90 6f 20 61 64 64 20 74 6f 20 74 68 65 20 46 52 4f  o add to the FRO
18aa0 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 54 6f  M clause */.  To
18ab0 6b 65 6e 20 2a 70 44 61 74 61 62 61 73 65 2c 20  ken *pDatabase, 
18ac0 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
18ad0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63 6f   the database co
18ae0 6e 74 61 69 6e 69 6e 67 20 70 54 61 62 6c 65 20  ntaining pTable 
18af0 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 41 6c 69  */.  Token *pAli
18b00 61 73 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  as,          /* 
18b10 54 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73  The right-hand s
18b20 69 64 65 20 6f 66 20 74 68 65 20 41 53 20 73 75  ide of the AS su
18b30 62 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20  bexpression */. 
18b40 20 53 65 6c 65 63 74 20 2a 70 53 75 62 71 75 65   Select *pSubque
18b50 72 79 2c 20 20 20 20 20 20 2f 2a 20 41 20 73 75  ry,      /* A su
18b60 62 71 75 65 72 79 20 75 73 65 64 20 69 6e 20 70  bquery used in p
18b70 6c 61 63 65 20 6f 66 20 61 20 74 61 62 6c 65 20  lace of a table 
18b80 6e 61 6d 65 20 2a 2f 0a 20 20 45 78 70 72 20 2a  name */.  Expr *
18b90 70 4f 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20  pOn,            
18ba0 20 20 2f 2a 20 54 68 65 20 4f 4e 20 63 6c 61 75    /* The ON clau
18bb0 73 65 20 6f 66 20 61 20 6a 6f 69 6e 20 2a 2f 0a  se of a join */.
18bc0 20 20 49 64 4c 69 73 74 20 2a 70 55 73 69 6e 67    IdList *pUsing
18bd0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
18be0 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20 6f 66   USING clause of
18bf0 20 61 20 6a 6f 69 6e 20 2a 2f 0a 29 7b 0a 20 20   a join */.){.  
18c00 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
18c10 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 73 71  tem *pItem;.  sq
18c20 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
18c30 73 65 2d 3e 64 62 3b 0a 20 20 70 20 3d 20 73 71  se->db;.  p = sq
18c40 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70 70 65  lite3SrcListAppe
18c50 6e 64 28 64 62 2c 20 70 2c 20 70 54 61 62 6c 65  nd(db, p, pTable
18c60 2c 20 70 44 61 74 61 62 61 73 65 29 3b 0a 20 20  , pDatabase);.  
18c70 69 66 28 20 70 3d 3d 30 20 7c 7c 20 70 2d 3e 6e  if( p==0 || p->n
18c80 53 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  Src==0 ){.    sq
18c90 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
18ca0 64 62 2c 20 70 4f 6e 29 3b 0a 20 20 20 20 73 71  db, pOn);.    sq
18cb0 6c 69 74 65 33 49 64 4c 69 73 74 44 65 6c 65 74  lite3IdListDelet
18cc0 65 28 64 62 2c 20 70 55 73 69 6e 67 29 3b 0a 20  e(db, pUsing);. 
18cd0 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74     sqlite3Select
18ce0 44 65 6c 65 74 65 28 64 62 2c 20 70 53 75 62 71  Delete(db, pSubq
18cf0 75 65 72 79 29 3b 0a 20 20 20 20 72 65 74 75 72  uery);.    retur
18d00 6e 20 70 3b 0a 20 20 7d 0a 20 20 70 49 74 65 6d  n p;.  }.  pItem
18d10 20 3d 20 26 70 2d 3e 61 5b 70 2d 3e 6e 53 72 63   = &p->a[p->nSrc
18d20 2d 31 5d 3b 0a 20 20 69 66 28 20 70 41 6c 69 61  -1];.  if( pAlia
18d30 73 20 26 26 20 70 41 6c 69 61 73 2d 3e 6e 20 29  s && pAlias->n )
18d40 7b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 7a 41 6c  {.    pItem->zAl
18d50 69 61 73 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d  ias = sqlite3Nam
18d60 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70  eFromToken(db, p
18d70 41 6c 69 61 73 29 3b 0a 20 20 7d 0a 20 20 70 49  Alias);.  }.  pI
18d80 74 65 6d 2d 3e 70 53 65 6c 65 63 74 20 3d 20 70  tem->pSelect = p
18d90 53 75 62 71 75 65 72 79 3b 0a 20 20 70 49 74 65  Subquery;.  pIte
18da0 6d 2d 3e 70 4f 6e 20 3d 20 70 4f 6e 3b 0a 20 20  m->pOn = pOn;.  
18db0 70 49 74 65 6d 2d 3e 70 55 73 69 6e 67 20 3d 20  pItem->pUsing = 
18dc0 70 55 73 69 6e 67 3b 0a 20 20 72 65 74 75 72 6e  pUsing;.  return
18dd0 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 68 65   p;.}../*.** Whe
18de0 6e 20 62 75 69 6c 64 69 6e 67 20 75 70 20 61 20  n building up a 
18df0 46 52 4f 4d 20 63 6c 61 75 73 65 20 69 6e 20 74  FROM clause in t
18e00 68 65 20 70 61 72 73 65 72 2c 20 74 68 65 20 6a  he parser, the j
18e10 6f 69 6e 20 6f 70 65 72 61 74 6f 72 0a 2a 2a 20  oin operator.** 
18e20 69 73 20 69 6e 69 74 69 61 6c 6c 79 20 61 74 74  is initially att
18e30 61 63 68 65 64 20 74 6f 20 74 68 65 20 6c 65 66  ached to the lef
18e40 74 20 6f 70 65 72 61 6e 64 2e 20 20 42 75 74 20  t operand.  But 
18e50 74 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74  the code generat
18e60 6f 72 0a 2a 2a 20 65 78 70 65 63 74 73 20 74 68  or.** expects th
18e70 65 20 6a 6f 69 6e 20 6f 70 65 72 61 74 6f 72 20  e join operator 
18e80 74 6f 20 62 65 20 6f 6e 20 74 68 65 20 72 69 67  to be on the rig
18e90 68 74 20 6f 70 65 72 61 6e 64 2e 20 20 54 68 69  ht operand.  Thi
18ea0 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 53 68 69  s routine.** Shi
18eb0 66 74 73 20 61 6c 6c 20 6a 6f 69 6e 20 6f 70 65  fts all join ope
18ec0 72 61 74 6f 72 73 20 66 72 6f 6d 20 6c 65 66 74  rators from left
18ed0 20 74 6f 20 72 69 67 68 74 20 66 6f 72 20 61 6e   to right for an
18ee0 20 65 6e 74 69 72 65 20 46 52 4f 4d 0a 2a 2a 20   entire FROM.** 
18ef0 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 45 78  clause..**.** Ex
18f00 61 6d 70 6c 65 3a 20 53 75 70 70 6f 73 65 20 74  ample: Suppose t
18f10 68 65 20 6a 6f 69 6e 20 69 73 20 6c 69 6b 65 20  he join is like 
18f20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  this:.**.**     
18f30 20 20 20 20 20 20 41 20 6e 61 74 75 72 61 6c 20        A natural 
18f40 63 72 6f 73 73 20 6a 6f 69 6e 20 42 0a 2a 2a 0a  cross join B.**.
18f50 2a 2a 20 54 68 65 20 6f 70 65 72 61 74 6f 72 20  ** The operator 
18f60 69 73 20 22 6e 61 74 75 72 61 6c 20 63 72 6f 73  is "natural cros
18f70 73 20 6a 6f 69 6e 22 2e 20 20 54 68 65 20 41 20  s join".  The A 
18f80 61 6e 64 20 42 20 6f 70 65 72 61 6e 64 73 20 61  and B operands a
18f90 72 65 20 73 74 6f 72 65 64 0a 2a 2a 20 69 6e 20  re stored.** in 
18fa0 70 2d 3e 61 5b 30 5d 20 61 6e 64 20 70 2d 3e 61  p->a[0] and p->a
18fb0 5b 31 5d 2c 20 72 65 73 70 65 63 74 69 76 65 6c  [1], respectivel
18fc0 79 2e 20 20 54 68 65 20 70 61 72 73 65 72 20 69  y.  The parser i
18fd0 6e 69 74 69 61 6c 6c 79 20 73 74 6f 72 65 73 20  nitially stores 
18fe0 74 68 65 0a 2a 2a 20 6f 70 65 72 61 74 6f 72 20  the.** operator 
18ff0 77 69 74 68 20 41 2e 20 20 54 68 69 73 20 72 6f  with A.  This ro
19000 75 74 69 6e 65 20 73 68 69 66 74 73 20 74 68 61  utine shifts tha
19010 74 20 6f 70 65 72 61 74 6f 72 20 6f 76 65 72 20  t operator over 
19020 74 6f 20 42 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  to B..*/.void sq
19030 6c 69 74 65 33 53 72 63 4c 69 73 74 53 68 69 66  lite3SrcListShif
19040 74 4a 6f 69 6e 54 79 70 65 28 53 72 63 4c 69 73  tJoinType(SrcLis
19050 74 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 20 26  t *p){.  if( p &
19060 26 20 70 2d 3e 61 20 29 7b 0a 20 20 20 20 69 6e  & p->a ){.    in
19070 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 70  t i;.    for(i=p
19080 2d 3e 6e 53 72 63 2d 31 3b 20 69 3e 30 3b 20 69  ->nSrc-1; i>0; i
19090 2d 2d 29 7b 0a 20 20 20 20 20 20 70 2d 3e 61 5b  --){.      p->a[
190a0 69 5d 2e 6a 6f 69 6e 74 79 70 65 20 3d 20 70 2d  i].jointype = p-
190b0 3e 61 5b 69 2d 31 5d 2e 6a 6f 69 6e 74 79 70 65  >a[i-1].jointype
190c0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 61  ;.    }.    p->a
190d0 5b 30 5d 2e 6a 6f 69 6e 74 79 70 65 20 3d 20 30  [0].jointype = 0
190e0 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42  ;.  }.}../*.** B
190f0 65 67 69 6e 20 61 20 74 72 61 6e 73 61 63 74 69  egin a transacti
19100 6f 6e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  on.*/.void sqlit
19110 65 33 42 65 67 69 6e 54 72 61 6e 73 61 63 74 69  e3BeginTransacti
19120 6f 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  on(Parse *pParse
19130 2c 20 69 6e 74 20 74 79 70 65 29 7b 0a 20 20 73  , int type){.  s
19140 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 56 64  qlite3 *db;.  Vd
19150 62 65 20 2a 76 3b 0a 20 20 69 6e 74 20 69 3b 0a  be *v;.  int i;.
19160 0a 20 20 69 66 28 20 70 50 61 72 73 65 3d 3d 30  .  if( pParse==0
19170 20 7c 7c 20 28 64 62 3d 70 50 61 72 73 65 2d 3e   || (db=pParse->
19180 64 62 29 3d 3d 30 20 7c 7c 20 64 62 2d 3e 61 44  db)==0 || db->aD
19190 62 5b 30 5d 2e 70 42 74 3d 3d 30 20 29 20 72 65  b[0].pBt==0 ) re
191a0 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 50 61 72  turn;.  if( pPar
191b0 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 64 62 2d 3e  se->nErr || db->
191c0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72  mallocFailed ) r
191d0 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 73 71 6c  eturn;.  if( sql
191e0 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50  ite3AuthCheck(pP
191f0 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 54 52 41  arse, SQLITE_TRA
19200 4e 53 41 43 54 49 4f 4e 2c 20 22 42 45 47 49 4e  NSACTION, "BEGIN
19210 22 2c 20 30 2c 20 30 29 20 29 20 72 65 74 75 72  ", 0, 0) ) retur
19220 6e 3b 0a 0a 20 20 76 20 3d 20 73 71 6c 69 74 65  n;..  v = sqlite
19230 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
19240 3b 0a 20 20 69 66 28 20 21 76 20 29 20 72 65 74  ;.  if( !v ) ret
19250 75 72 6e 3b 0a 20 20 69 66 28 20 74 79 70 65 21  urn;.  if( type!
19260 3d 54 4b 5f 44 45 46 45 52 52 45 44 20 29 7b 0a  =TK_DEFERRED ){.
19270 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64      for(i=0; i<d
19280 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20  b->nDb; i++){.  
19290 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
192a0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 54 72 61 6e  ddOp2(v, OP_Tran
192b0 73 61 63 74 69 6f 6e 2c 20 69 2c 20 28 74 79 70  saction, i, (typ
192c0 65 3d 3d 54 4b 5f 45 58 43 4c 55 53 49 56 45 29  e==TK_EXCLUSIVE)
192d0 2b 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  +1);.      sqlit
192e0 65 33 56 64 62 65 55 73 65 73 42 74 72 65 65 28  e3VdbeUsesBtree(
192f0 76 2c 20 69 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  v, i);.    }.  }
19300 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
19310 64 4f 70 32 28 76 2c 20 4f 50 5f 41 75 74 6f 43  dOp2(v, OP_AutoC
19320 6f 6d 6d 69 74 2c 20 30 2c 20 30 29 3b 0a 7d 0a  ommit, 0, 0);.}.
19330 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20 61 20  ./*.** Commit a 
19340 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2f 0a 76  transaction.*/.v
19350 6f 69 64 20 73 71 6c 69 74 65 33 43 6f 6d 6d 69  oid sqlite3Commi
19360 74 54 72 61 6e 73 61 63 74 69 6f 6e 28 50 61 72  tTransaction(Par
19370 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 73  se *pParse){.  s
19380 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 56 64  qlite3 *db;.  Vd
19390 62 65 20 2a 76 3b 0a 0a 20 20 69 66 28 20 70 50  be *v;..  if( pP
193a0 61 72 73 65 3d 3d 30 20 7c 7c 20 28 64 62 3d 70  arse==0 || (db=p
193b0 50 61 72 73 65 2d 3e 64 62 29 3d 3d 30 20 7c 7c  Parse->db)==0 ||
193c0 20 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 3d   db->aDb[0].pBt=
193d0 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69  =0 ) return;.  i
193e0 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20  f( pParse->nErr 
193f0 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  || db->mallocFai
19400 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  led ) return;.  
19410 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43  if( sqlite3AuthC
19420 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c  heck(pParse, SQL
19430 49 54 45 5f 54 52 41 4e 53 41 43 54 49 4f 4e 2c  ITE_TRANSACTION,
19440 20 22 43 4f 4d 4d 49 54 22 2c 20 30 2c 20 30 29   "COMMIT", 0, 0)
19450 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 76 20   ) return;..  v 
19460 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
19470 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20  (pParse);.  if( 
19480 76 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  v ){.    sqlite3
19490 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
194a0 5f 41 75 74 6f 43 6f 6d 6d 69 74 2c 20 31 2c 20  _AutoCommit, 1, 
194b0 30 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  0);.  }.}../*.**
194c0 20 52 6f 6c 6c 62 61 63 6b 20 61 20 74 72 61 6e   Rollback a tran
194d0 73 61 63 74 69 6f 6e 0a 2a 2f 0a 76 6f 69 64 20  saction.*/.void 
194e0 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 54  sqlite3RollbackT
194f0 72 61 6e 73 61 63 74 69 6f 6e 28 50 61 72 73 65  ransaction(Parse
19500 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 73 71 6c   *pParse){.  sql
19510 69 74 65 33 20 2a 64 62 3b 0a 20 20 56 64 62 65  ite3 *db;.  Vdbe
19520 20 2a 76 3b 0a 0a 20 20 69 66 28 20 70 50 61 72   *v;..  if( pPar
19530 73 65 3d 3d 30 20 7c 7c 20 28 64 62 3d 70 50 61  se==0 || (db=pPa
19540 72 73 65 2d 3e 64 62 29 3d 3d 30 20 7c 7c 20 64  rse->db)==0 || d
19550 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 3d 3d 30  b->aDb[0].pBt==0
19560 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
19570 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c   pParse->nErr ||
19580 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
19590 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66  d ) return;.  if
195a0 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65  ( sqlite3AuthChe
195b0 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54  ck(pParse, SQLIT
195c0 45 5f 54 52 41 4e 53 41 43 54 49 4f 4e 2c 20 22  E_TRANSACTION, "
195d0 52 4f 4c 4c 42 41 43 4b 22 2c 20 30 2c 20 30 29  ROLLBACK", 0, 0)
195e0 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 76 20   ) return;..  v 
195f0 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
19600 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20  (pParse);.  if( 
19610 76 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  v ){.    sqlite3
19620 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
19630 5f 41 75 74 6f 43 6f 6d 6d 69 74 2c 20 31 2c 20  _AutoCommit, 1, 
19640 31 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  1);.  }.}../*.**
19650 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 54   Make sure the T
19660 45 4d 50 20 64 61 74 61 62 61 73 65 20 69 73 20  EMP database is 
19670 6f 70 65 6e 20 61 6e 64 20 61 76 61 69 6c 61 62  open and availab
19680 6c 65 20 66 6f 72 20 75 73 65 2e 20 20 52 65 74  le for use.  Ret
19690 75 72 6e 0a 2a 2a 20 74 68 65 20 6e 75 6d 62 65  urn.** the numbe
196a0 72 20 6f 66 20 65 72 72 6f 72 73 2e 20 20 4c 65  r of errors.  Le
196b0 61 76 65 20 61 6e 79 20 65 72 72 6f 72 20 6d 65  ave any error me
196c0 73 73 61 67 65 73 20 69 6e 20 74 68 65 20 70 50  ssages in the pP
196d0 61 72 73 65 20 73 74 72 75 63 74 75 72 65 2e 0a  arse structure..
196e0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 4f 70  */.int sqlite3Op
196f0 65 6e 54 65 6d 70 44 61 74 61 62 61 73 65 28 50  enTempDatabase(P
19700 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20  arse *pParse){. 
19710 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
19720 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28  Parse->db;.  if(
19730 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 42 74 3d   db->aDb[1].pBt=
19740 3d 30 20 26 26 20 21 70 50 61 72 73 65 2d 3e 65  =0 && !pParse->e
19750 78 70 6c 61 69 6e 20 29 7b 0a 20 20 20 20 69 6e  xplain ){.    in
19760 74 20 72 63 3b 0a 20 20 20 20 73 74 61 74 69 63  t rc;.    static
19770 20 63 6f 6e 73 74 20 69 6e 74 20 66 6c 61 67 73   const int flags
19780 20 3d 20 0a 20 20 20 20 20 20 20 20 20 20 53 51   = .          SQ
19790 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52  LITE_OPEN_READWR
197a0 49 54 45 20 7c 0a 20 20 20 20 20 20 20 20 20 20  ITE |.          
197b0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41  SQLITE_OPEN_CREA
197c0 54 45 20 7c 0a 20 20 20 20 20 20 20 20 20 20 53  TE |.          S
197d0 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55  QLITE_OPEN_EXCLU
197e0 53 49 56 45 20 7c 0a 20 20 20 20 20 20 20 20 20  SIVE |.         
197f0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c   SQLITE_OPEN_DEL
19800 45 54 45 4f 4e 43 4c 4f 53 45 20 7c 0a 20 20 20  ETEONCLOSE |.   
19810 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50         SQLITE_OP
19820 45 4e 5f 54 45 4d 50 5f 44 42 3b 0a 0a 20 20 20  EN_TEMP_DB;..   
19830 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
19840 65 65 46 61 63 74 6f 72 79 28 64 62 2c 20 30 2c  eeFactory(db, 0,
19850 20 30 2c 20 53 51 4c 49 54 45 5f 44 45 46 41 55   0, SQLITE_DEFAU
19860 4c 54 5f 43 41 43 48 45 5f 53 49 5a 45 2c 20 66  LT_CACHE_SIZE, f
19870 6c 61 67 73 2c 0a 20 20 20 20 20 20 20 20 20 20  lags,.          
19880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19890 20 20 20 20 20 20 20 26 64 62 2d 3e 61 44 62 5b         &db->aDb[
198a0 31 5d 2e 70 42 74 29 3b 0a 20 20 20 20 69 66 28  1].pBt);.    if(
198b0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
198c0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
198d0 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
198e0 22 75 6e 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20  "unable to open 
198f0 61 20 74 65 6d 70 6f 72 61 72 79 20 64 61 74 61  a temporary data
19900 62 61 73 65 20 22 0a 20 20 20 20 20 20 20 20 22  base ".        "
19910 66 69 6c 65 20 66 6f 72 20 73 74 6f 72 69 6e 67  file for storing
19920 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
19930 73 22 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73  s");.      pPars
19940 65 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20 20 20  e->rc = rc;.    
19950 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
19960 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 64  }.    assert( (d
19970 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54  b->flags & SQLIT
19980 45 5f 49 6e 54 72 61 6e 73 29 3d 3d 30 20 7c 7c  E_InTrans)==0 ||
19990 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20   db->autoCommit 
199a0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 64  );.    assert( d
199b0 62 2d 3e 61 44 62 5b 31 5d 2e 70 53 63 68 65 6d  b->aDb[1].pSchem
199c0 61 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  a );.    sqlite3
199d0 50 61 67 65 72 4a 6f 75 72 6e 61 6c 4d 6f 64 65  PagerJournalMode
199e0 28 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 67  (sqlite3BtreePag
199f0 65 72 28 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 42  er(db->aDb[1].pB
19a00 74 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  t),.            
19a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19a20 64 62 2d 3e 64 66 6c 74 4a 6f 75 72 6e 61 6c 4d  db->dfltJournalM
19a30 6f 64 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  ode);.  }.  retu
19a40 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  rn 0;.}../*.** G
19a50 65 6e 65 72 61 74 65 20 56 44 42 45 20 63 6f 64  enerate VDBE cod
19a60 65 20 74 68 61 74 20 77 69 6c 6c 20 76 65 72 69  e that will veri
19a70 66 79 20 74 68 65 20 73 63 68 65 6d 61 20 63 6f  fy the schema co
19a80 6f 6b 69 65 20 61 6e 64 20 73 74 61 72 74 0a 2a  okie and start.*
19a90 2a 20 61 20 72 65 61 64 2d 74 72 61 6e 73 61 63  * a read-transac
19aa0 74 69 6f 6e 20 66 6f 72 20 61 6c 6c 20 6e 61 6d  tion for all nam
19ab0 65 64 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ed database file
19ac0 73 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 69  s..**.** It is i
19ad0 6d 70 6f 72 74 61 6e 74 20 74 68 61 74 20 61 6c  mportant that al
19ae0 6c 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 73  l schema cookies
19af0 20 62 65 20 76 65 72 69 66 69 65 64 20 61 6e 64   be verified and
19b00 20 61 6c 6c 0a 2a 2a 20 72 65 61 64 20 74 72 61   all.** read tra
19b10 6e 73 61 63 74 69 6f 6e 73 20 62 65 20 73 74 61  nsactions be sta
19b20 72 74 65 64 20 62 65 66 6f 72 65 20 61 6e 79 74  rted before anyt
19b30 68 69 6e 67 20 65 6c 73 65 20 68 61 70 70 65 6e  hing else happen
19b40 73 20 69 6e 0a 2a 2a 20 74 68 65 20 56 44 42 45  s in.** the VDBE
19b50 20 70 72 6f 67 72 61 6d 2e 20 20 42 75 74 20 74   program.  But t
19b60 68 69 73 20 72 6f 75 74 69 6e 65 20 63 61 6e 20  his routine can 
19b70 62 65 20 63 61 6c 6c 65 64 20 61 66 74 65 72 20  be called after 
19b80 6d 75 63 68 20 6f 74 68 65 72 0a 2a 2a 20 63 6f  much other.** co
19b90 64 65 20 68 61 73 20 62 65 65 6e 20 67 65 6e 65  de has been gene
19ba0 72 61 74 65 64 2e 20 20 53 6f 20 68 65 72 65 20  rated.  So here 
19bb0 69 73 20 77 68 61 74 20 77 65 20 64 6f 3a 0a 2a  is what we do:.*
19bc0 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 74  *.** The first t
19bd0 69 6d 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ime this routine
19be0 20 69 73 20 63 61 6c 6c 65 64 2c 20 77 65 20 63   is called, we c
19bf0 6f 64 65 20 61 6e 20 4f 50 5f 47 6f 74 6f 20 74  ode an OP_Goto t
19c00 68 61 74 0a 2a 2a 20 77 69 6c 6c 20 6a 75 6d 70  hat.** will jump
19c10 20 74 6f 20 61 20 73 75 62 72 6f 75 74 69 6e 65   to a subroutine
19c20 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74   at the end of t
19c30 68 65 20 70 72 6f 67 72 61 6d 2e 20 20 54 68 65  he program.  The
19c40 6e 20 77 65 0a 2a 2a 20 72 65 63 6f 72 64 20 65  n we.** record e
19c50 76 65 72 79 20 64 61 74 61 62 61 73 65 20 74 68  very database th
19c60 61 74 20 6e 65 65 64 73 20 69 74 73 20 73 63 68  at needs its sch
19c70 65 6d 61 20 76 65 72 69 66 69 65 64 20 69 6e 20  ema verified in 
19c80 74 68 65 0a 2a 2a 20 70 50 61 72 73 65 2d 3e 63  the.** pParse->c
19c90 6f 6f 6b 69 65 4d 61 73 6b 20 66 69 65 6c 64 2e  ookieMask field.
19ca0 20 20 4c 61 74 65 72 2c 20 61 66 74 65 72 20 61    Later, after a
19cb0 6c 6c 20 6f 74 68 65 72 20 63 6f 64 65 20 68 61  ll other code ha
19cc0 73 20 62 65 65 6e 0a 2a 2a 20 67 65 6e 65 72 61  s been.** genera
19cd0 74 65 64 2c 20 74 68 65 20 73 75 62 72 6f 75 74  ted, the subrout
19ce0 69 6e 65 20 74 68 61 74 20 64 6f 65 73 20 74 68  ine that does th
19cf0 65 20 63 6f 6f 6b 69 65 20 76 65 72 69 66 69 63  e cookie verific
19d00 61 74 69 6f 6e 73 20 61 6e 64 0a 2a 2a 20 73 74  ations and.** st
19d10 61 72 74 73 20 74 68 65 20 74 72 61 6e 73 61 63  arts the transac
19d20 74 69 6f 6e 73 20 77 69 6c 6c 20 62 65 20 63 6f  tions will be co
19d30 64 65 64 20 61 6e 64 20 74 68 65 20 4f 50 5f 47  ded and the OP_G
19d40 6f 74 6f 20 50 32 20 76 61 6c 75 65 0a 2a 2a 20  oto P2 value.** 
19d50 77 69 6c 6c 20 62 65 20 6d 61 64 65 20 74 6f 20  will be made to 
19d60 70 6f 69 6e 74 20 74 6f 20 74 68 61 74 20 73 75  point to that su
19d70 62 72 6f 75 74 69 6e 65 2e 20 20 54 68 65 20 67  broutine.  The g
19d80 65 6e 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65  eneration of the
19d90 0a 2a 2a 20 63 6f 6f 6b 69 65 20 76 65 72 69 66  .** cookie verif
19da0 69 63 61 74 69 6f 6e 20 73 75 62 72 6f 75 74 69  ication subrouti
19db0 6e 65 20 63 6f 64 65 20 68 61 70 70 65 6e 73 20  ne code happens 
19dc0 69 6e 20 73 71 6c 69 74 65 33 46 69 6e 69 73 68  in sqlite3Finish
19dd0 43 6f 64 69 6e 67 28 29 2e 0a 2a 2a 0a 2a 2a 20  Coding()..**.** 
19de0 49 66 20 69 44 62 3c 30 20 74 68 65 6e 20 63 6f  If iDb<0 then co
19df0 64 65 20 74 68 65 20 4f 50 5f 47 6f 74 6f 20 6f  de the OP_Goto o
19e00 6e 6c 79 20 2d 20 64 6f 6e 27 74 20 73 65 74 20  nly - don't set 
19e10 66 6c 61 67 20 74 6f 20 76 65 72 69 66 79 20 74  flag to verify t
19e20 68 65 0a 2a 2a 20 73 63 68 65 6d 61 20 6f 6e 20  he.** schema on 
19e30 61 6e 79 20 64 61 74 61 62 61 73 65 73 2e 20 20  any databases.  
19e40 54 68 69 73 20 63 61 6e 20 62 65 20 75 73 65 64  This can be used
19e50 20 74 6f 20 70 6f 73 69 74 69 6f 6e 20 74 68 65   to position the
19e60 20 4f 50 5f 47 6f 74 6f 0a 2a 2a 20 65 61 72 6c   OP_Goto.** earl
19e70 79 20 69 6e 20 74 68 65 20 63 6f 64 65 2c 20 62  y in the code, b
19e80 65 66 6f 72 65 20 77 65 20 6b 6e 6f 77 20 69 66  efore we know if
19e90 20 61 6e 79 20 64 61 74 61 62 61 73 65 20 74 61   any database ta
19ea0 62 6c 65 73 20 77 69 6c 6c 20 62 65 20 75 73 65  bles will be use
19eb0 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  d..*/.void sqlit
19ec0 65 33 43 6f 64 65 56 65 72 69 66 79 53 63 68 65  e3CodeVerifySche
19ed0 6d 61 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ma(Parse *pParse
19ee0 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20 20 73 71  , int iDb){.  sq
19ef0 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 56 64 62  lite3 *db;.  Vdb
19f00 65 20 2a 76 3b 0a 20 20 69 6e 74 20 6d 61 73 6b  e *v;.  int mask
19f10 3b 0a 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33  ;..  v = sqlite3
19f20 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
19f30 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72 65  .  if( v==0 ) re
19f40 74 75 72 6e 3b 20 20 2f 2a 20 54 68 69 73 20 6f  turn;  /* This o
19f50 6e 6c 79 20 68 61 70 70 65 6e 73 20 69 66 20 74  nly happens if t
19f60 68 65 72 65 20 77 61 73 20 61 20 70 72 69 6f 72  here was a prior
19f70 20 65 72 72 6f 72 20 2a 2f 0a 20 20 64 62 20 3d   error */.  db =
19f80 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69   pParse->db;.  i
19f90 66 28 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69  f( pParse->cooki
19fa0 65 47 6f 74 6f 3d 3d 30 20 29 7b 0a 20 20 20 20  eGoto==0 ){.    
19fb0 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 47 6f  pParse->cookieGo
19fc0 74 6f 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  to = sqlite3Vdbe
19fd0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74  AddOp2(v, OP_Got
19fe0 6f 2c 20 30 2c 20 30 29 2b 31 3b 0a 20 20 7d 0a  o, 0, 0)+1;.  }.
19ff0 20 20 69 66 28 20 69 44 62 3e 3d 30 20 29 7b 0a    if( iDb>=0 ){.
1a000 20 20 20 20 61 73 73 65 72 74 28 20 69 44 62 3c      assert( iDb<
1a010 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 20 20 61  db->nDb );.    a
1a020 73 73 65 72 74 28 20 64 62 2d 3e 61 44 62 5b 69  ssert( db->aDb[i
1a030 44 62 5d 2e 70 42 74 21 3d 30 20 7c 7c 20 69 44  Db].pBt!=0 || iD
1a040 62 3d 3d 31 20 29 3b 0a 20 20 20 20 61 73 73 65  b==1 );.    asse
1a050 72 74 28 20 69 44 62 3c 53 51 4c 49 54 45 5f 4d  rt( iDb<SQLITE_M
1a060 41 58 5f 41 54 54 41 43 48 45 44 2b 32 20 29 3b  AX_ATTACHED+2 );
1a070 0a 20 20 20 20 6d 61 73 6b 20 3d 20 31 3c 3c 69  .    mask = 1<<i
1a080 44 62 3b 0a 20 20 20 20 69 66 28 20 28 70 50 61  Db;.    if( (pPa
1a090 72 73 65 2d 3e 63 6f 6f 6b 69 65 4d 61 73 6b 20  rse->cookieMask 
1a0a0 26 20 6d 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20  & mask)==0 ){.  
1a0b0 20 20 20 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b      pParse->cook
1a0c0 69 65 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a  ieMask |= mask;.
1a0d0 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 63 6f        pParse->co
1a0e0 6f 6b 69 65 56 61 6c 75 65 5b 69 44 62 5d 20 3d  okieValue[iDb] =
1a0f0 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53   db->aDb[iDb].pS
1a100 63 68 65 6d 61 2d 3e 73 63 68 65 6d 61 5f 63 6f  chema->schema_co
1a110 6f 6b 69 65 3b 0a 20 20 20 20 20 20 69 66 28 20  okie;.      if( 
1a120 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26 26 20  !OMIT_TEMPDB && 
1a130 69 44 62 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20  iDb==1 ){.      
1a140 20 20 73 71 6c 69 74 65 33 4f 70 65 6e 54 65 6d    sqlite3OpenTem
1a150 70 44 61 74 61 62 61 73 65 28 70 50 61 72 73 65  pDatabase(pParse
1a160 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
1a170 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  .  }.}../*.** Ge
1a180 6e 65 72 61 74 65 20 56 44 42 45 20 63 6f 64 65  nerate VDBE code
1a190 20 74 68 61 74 20 70 72 65 70 61 72 65 73 20 66   that prepares f
1a1a0 6f 72 20 64 6f 69 6e 67 20 61 6e 20 6f 70 65 72  or doing an oper
1a1b0 61 74 69 6f 6e 20 74 68 61 74 0a 2a 2a 20 6d 69  ation that.** mi
1a1c0 67 68 74 20 63 68 61 6e 67 65 20 74 68 65 20 64  ght change the d
1a1d0 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 54  atabase..**.** T
1a1e0 68 69 73 20 72 6f 75 74 69 6e 65 20 73 74 61 72  his routine star
1a1f0 74 73 20 61 20 6e 65 77 20 74 72 61 6e 73 61 63  ts a new transac
1a200 74 69 6f 6e 20 69 66 20 77 65 20 61 72 65 20 6e  tion if we are n
1a210 6f 74 20 61 6c 72 65 61 64 79 20 77 69 74 68 69  ot already withi
1a220 6e 0a 2a 2a 20 61 20 74 72 61 6e 73 61 63 74 69  n.** a transacti
1a230 6f 6e 2e 20 20 49 66 20 77 65 20 61 72 65 20 61  on.  If we are a
1a240 6c 72 65 61 64 79 20 77 69 74 68 69 6e 20 61 20  lready within a 
1a250 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68 65  transaction, the
1a260 6e 20 61 20 63 68 65 63 6b 70 6f 69 6e 74 0a 2a  n a checkpoint.*
1a270 2a 20 69 73 20 73 65 74 20 69 66 20 74 68 65 20  * is set if the 
1a280 73 65 74 53 74 61 74 65 6d 65 6e 74 20 70 61 72  setStatement par
1a290 61 6d 65 74 65 72 20 69 73 20 74 72 75 65 2e 20  ameter is true. 
1a2a0 20 41 20 63 68 65 63 6b 70 6f 69 6e 74 20 73 68   A checkpoint sh
1a2b0 6f 75 6c 64 0a 2a 2a 20 62 65 20 73 65 74 20 66  ould.** be set f
1a2c0 6f 72 20 6f 70 65 72 61 74 69 6f 6e 73 20 74 68  or operations th
1a2d0 61 74 20 6d 69 67 68 74 20 66 61 69 6c 20 28 64  at might fail (d
1a2e0 75 65 20 74 6f 20 61 20 63 6f 6e 73 74 72 61 69  ue to a constrai
1a2f0 6e 74 29 20 70 61 72 74 20 6f 66 0a 2a 2a 20 74  nt) part of.** t
1a300 68 65 20 77 61 79 20 74 68 72 6f 75 67 68 20 61  he way through a
1a310 6e 64 20 77 68 69 63 68 20 77 69 6c 6c 20 6e 65  nd which will ne
1a320 65 64 20 74 6f 20 75 6e 64 6f 20 73 6f 6d 65 20  ed to undo some 
1a330 77 72 69 74 65 73 20 77 69 74 68 6f 75 74 20 68  writes without h
1a340 61 76 69 6e 67 20 74 6f 0a 2a 2a 20 72 6f 6c 6c  aving to.** roll
1a350 62 61 63 6b 20 74 68 65 20 77 68 6f 6c 65 20 74  back the whole t
1a360 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 46 6f 72  ransaction.  For
1a370 20 6f 70 65 72 61 74 69 6f 6e 73 20 77 68 65 72   operations wher
1a380 65 20 61 6c 6c 20 63 6f 6e 73 74 72 61 69 6e 74  e all constraint
1a390 73 0a 2a 2a 20 63 61 6e 20 62 65 20 63 68 65 63  s.** can be chec
1a3a0 6b 65 64 20 62 65 66 6f 72 65 20 61 6e 79 20 63  ked before any c
1a3b0 68 61 6e 67 65 73 20 61 72 65 20 6d 61 64 65 20  hanges are made 
1a3c0 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 2c  to the database,
1a3d0 20 69 74 20 69 73 20 6e 65 76 65 72 0a 2a 2a 20   it is never.** 
1a3e0 6e 65 63 65 73 73 61 72 79 20 74 6f 20 75 6e 64  necessary to und
1a3f0 6f 20 61 20 77 72 69 74 65 20 61 6e 64 20 74 68  o a write and th
1a400 65 20 63 68 65 63 6b 70 6f 69 6e 74 20 73 68 6f  e checkpoint sho
1a410 75 6c 64 20 6e 6f 74 20 62 65 20 73 65 74 2e 0a  uld not be set..
1a420 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 64 61 74 61 62  **.** Only datab
1a430 61 73 65 20 69 44 62 20 61 6e 64 20 74 68 65 20  ase iDb and the 
1a440 74 65 6d 70 20 64 61 74 61 62 61 73 65 20 61 72  temp database ar
1a450 65 20 6d 61 64 65 20 77 72 69 74 61 62 6c 65 20  e made writable 
1a460 62 79 20 74 68 69 73 20 63 61 6c 6c 2e 0a 2a 2a  by this call..**
1a470 20 49 66 20 69 44 62 3d 3d 30 2c 20 74 68 65 6e   If iDb==0, then
1a480 20 74 68 65 20 6d 61 69 6e 20 61 6e 64 20 74 65   the main and te
1a490 6d 70 20 64 61 74 61 62 61 73 65 73 20 61 72 65  mp databases are
1a4a0 20 6d 61 64 65 20 77 72 69 74 61 62 6c 65 2e 20   made writable. 
1a4b0 20 20 49 66 0a 2a 2a 20 69 44 62 3d 3d 31 20 74    If.** iDb==1 t
1a4c0 68 65 6e 20 6f 6e 6c 79 20 74 68 65 20 74 65 6d  hen only the tem
1a4d0 70 20 64 61 74 61 62 61 73 65 20 69 73 20 6d 61  p database is ma
1a4e0 64 65 20 77 72 69 74 61 62 6c 65 2e 20 20 49 66  de writable.  If
1a4f0 20 69 44 62 3e 31 20 74 68 65 6e 20 74 68 65 0a   iDb>1 then the.
1a500 2a 2a 20 73 70 65 63 69 66 69 65 64 20 61 75 78  ** specified aux
1a510 69 6c 69 61 72 79 20 64 61 74 61 62 61 73 65 20  iliary database 
1a520 61 6e 64 20 74 68 65 20 74 65 6d 70 20 64 61 74  and the temp dat
1a530 61 62 61 73 65 20 61 72 65 20 6d 61 64 65 20 77  abase are made w
1a540 72 69 74 61 62 6c 65 2e 0a 2a 2f 0a 76 6f 69 64  ritable..*/.void
1a550 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69   sqlite3BeginWri
1a560 74 65 4f 70 65 72 61 74 69 6f 6e 28 50 61 72 73  teOperation(Pars
1a570 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 73  e *pParse, int s
1a580 65 74 53 74 61 74 65 6d 65 6e 74 2c 20 69 6e 74  etStatement, int
1a590 20 69 44 62 29 7b 0a 20 20 56 64 62 65 20 2a 76   iDb){.  Vdbe *v
1a5a0 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
1a5b0 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28  e(pParse);.  if(
1a5c0 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a   v==0 ) return;.
1a5d0 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72    sqlite3CodeVer
1a5e0 69 66 79 53 63 68 65 6d 61 28 70 50 61 72 73 65  ifySchema(pParse
1a5f0 2c 20 69 44 62 29 3b 0a 20 20 70 50 61 72 73 65  , iDb);.  pParse
1a600 2d 3e 77 72 69 74 65 4d 61 73 6b 20 7c 3d 20 31  ->writeMask |= 1
1a610 3c 3c 69 44 62 3b 0a 20 20 69 66 28 20 73 65 74  <<iDb;.  if( set
1a620 53 74 61 74 65 6d 65 6e 74 20 26 26 20 70 50 61  Statement && pPa
1a630 72 73 65 2d 3e 6e 65 73 74 65 64 3d 3d 30 20 29  rse->nested==0 )
1a640 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
1a650 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 53 74  eAddOp1(v, OP_St
1a660 61 74 65 6d 65 6e 74 2c 20 69 44 62 29 3b 0a 20  atement, iDb);. 
1a670 20 7d 0a 20 20 69 66 28 20 28 4f 4d 49 54 5f 54   }.  if( (OMIT_T
1a680 45 4d 50 44 42 20 7c 7c 20 69 44 62 21 3d 31 29  EMPDB || iDb!=1)
1a690 20 26 26 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e   && pParse->db->
1a6a0 61 44 62 5b 31 5d 2e 70 42 74 21 3d 30 20 29 7b  aDb[1].pBt!=0 ){
1a6b0 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69  .    sqlite3Begi
1a6c0 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28  nWriteOperation(
1a6d0 70 50 61 72 73 65 2c 20 73 65 74 53 74 61 74 65  pParse, setState
1a6e0 6d 65 6e 74 2c 20 31 29 3b 0a 20 20 7d 0a 7d 0a  ment, 1);.  }.}.
1a6f0 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20  ./*.** Check to 
1a700 73 65 65 20 69 66 20 70 49 6e 64 65 78 20 75 73  see if pIndex us
1a710 65 73 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67  es the collating
1a720 20 73 65 71 75 65 6e 63 65 20 70 43 6f 6c 6c 2e   sequence pColl.
1a730 20 20 52 65 74 75 72 6e 0a 2a 2a 20 74 72 75 65    Return.** true
1a740 20 69 66 20 69 74 20 64 6f 65 73 20 61 6e 64 20   if it does and 
1a750 66 61 6c 73 65 20 69 66 20 69 74 20 64 6f 65 73  false if it does
1a760 20 6e 6f 74 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66   not..*/.#ifndef
1a770 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 52 45 49   SQLITE_OMIT_REI
1a780 4e 44 45 58 0a 73 74 61 74 69 63 20 69 6e 74 20  NDEX.static int 
1a790 63 6f 6c 6c 61 74 69 6f 6e 4d 61 74 63 68 28 63  collationMatch(c
1a7a0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 6c  onst char *zColl
1a7b0 2c 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 29  , Index *pIndex)
1a7c0 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72  {.  int i;.  for
1a7d0 28 69 3d 30 3b 20 69 3c 70 49 6e 64 65 78 2d 3e  (i=0; i<pIndex->
1a7e0 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20  nColumn; i++){. 
1a7f0 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
1a800 20 3d 20 70 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c   = pIndex->azCol
1a810 6c 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 7a 3d  l[i];.    if( z=
1a820 3d 7a 43 6f 6c 6c 20 7c 7c 20 28 7a 20 26 26 20  =zColl || (z && 
1a830 7a 43 6f 6c 6c 20 26 26 20 30 3d 3d 73 71 6c 69  zColl && 0==sqli
1a840 74 65 33 53 74 72 49 43 6d 70 28 7a 2c 20 7a 43  te3StrICmp(z, zC
1a850 6f 6c 6c 29 29 20 29 7b 0a 20 20 20 20 20 20 72  oll)) ){.      r
1a860 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20  eturn 1;.    }. 
1a870 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
1a880 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52  .#endif../*.** R
1a890 65 63 6f 6d 70 75 74 65 20 61 6c 6c 20 69 6e 64  ecompute all ind
1a8a0 69 63 65 73 20 6f 66 20 70 54 61 62 20 74 68 61  ices of pTab tha
1a8b0 74 20 75 73 65 20 74 68 65 20 63 6f 6c 6c 61 74  t use the collat
1a8c0 69 6e 67 20 73 65 71 75 65 6e 63 65 20 70 43 6f  ing sequence pCo
1a8d0 6c 6c 2e 0a 2a 2a 20 49 66 20 70 43 6f 6c 6c 3d  ll..** If pColl=
1a8e0 3d 30 20 74 68 65 6e 20 72 65 63 6f 6d 70 75 74  =0 then recomput
1a8f0 65 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 6f 66  e all indices of
1a900 20 70 54 61 62 2e 0a 2a 2f 0a 23 69 66 6e 64 65   pTab..*/.#ifnde
1a910 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 52 45  f SQLITE_OMIT_RE
1a920 49 4e 44 45 58 0a 73 74 61 74 69 63 20 76 6f 69  INDEX.static voi
1a930 64 20 72 65 69 6e 64 65 78 54 61 62 6c 65 28 50  d reindexTable(P
1a940 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 61  arse *pParse, Ta
1a950 62 6c 65 20 2a 70 54 61 62 2c 20 63 68 61 72 20  ble *pTab, char 
1a960 63 6f 6e 73 74 20 2a 7a 43 6f 6c 6c 29 7b 0a 20  const *zColl){. 
1a970 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b 20   Index *pIndex; 
1a980 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1a990 41 6e 20 69 6e 64 65 78 20 61 73 73 6f 63 69 61  An index associa
1a9a0 74 65 64 20 77 69 74 68 20 70 54 61 62 20 2a 2f  ted with pTab */
1a9b0 0a 0a 20 20 66 6f 72 28 70 49 6e 64 65 78 3d 70  ..  for(pIndex=p
1a9c0 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 6e  Tab->pIndex; pIn
1a9d0 64 65 78 3b 20 70 49 6e 64 65 78 3d 70 49 6e 64  dex; pIndex=pInd
1a9e0 65 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  ex->pNext){.    
1a9f0 69 66 28 20 7a 43 6f 6c 6c 3d 3d 30 20 7c 7c 20  if( zColl==0 || 
1aa00 63 6f 6c 6c 61 74 69 6f 6e 4d 61 74 63 68 28 7a  collationMatch(z
1aa10 43 6f 6c 6c 2c 20 70 49 6e 64 65 78 29 20 29 7b  Coll, pIndex) ){
1aa20 0a 20 20 20 20 20 20 69 6e 74 20 69 44 62 20 3d  .      int iDb =
1aa30 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f   sqlite3SchemaTo
1aa40 49 6e 64 65 78 28 70 50 61 72 73 65 2d 3e 64 62  Index(pParse->db
1aa50 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29  , pTab->pSchema)
1aa60 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  ;.      sqlite3B
1aa70 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69  eginWriteOperati
1aa80 6f 6e 28 70 50 61 72 73 65 2c 20 30 2c 20 69 44  on(pParse, 0, iD
1aa90 62 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  b);.      sqlite
1aaa0 33 52 65 66 69 6c 6c 49 6e 64 65 78 28 70 50 61  3RefillIndex(pPa
1aab0 72 73 65 2c 20 70 49 6e 64 65 78 2c 20 2d 31 29  rse, pIndex, -1)
1aac0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65  ;.    }.  }.}.#e
1aad0 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6f  ndif../*.** Reco
1aae0 6d 70 75 74 65 20 61 6c 6c 20 69 6e 64 69 63 65  mpute all indice
1aaf0 73 20 6f 66 20 61 6c 6c 20 74 61 62 6c 65 73 20  s of all tables 
1ab00 69 6e 20 61 6c 6c 20 64 61 74 61 62 61 73 65 73  in all databases
1ab10 20 77 68 65 72 65 20 74 68 65 0a 2a 2a 20 69 6e   where the.** in
1ab20 64 69 63 65 73 20 75 73 65 20 74 68 65 20 63 6f  dices use the co
1ab30 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
1ab40 20 70 43 6f 6c 6c 2e 20 20 49 66 20 70 43 6f 6c   pColl.  If pCol
1ab50 6c 3d 3d 30 20 74 68 65 6e 20 72 65 63 6f 6d 70  l==0 then recomp
1ab60 75 74 65 0a 2a 2a 20 61 6c 6c 20 69 6e 64 69 63  ute.** all indic
1ab70 65 73 20 65 76 65 72 79 77 68 65 72 65 2e 0a 2a  es everywhere..*
1ab80 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
1ab90 5f 4f 4d 49 54 5f 52 45 49 4e 44 45 58 0a 73 74  _OMIT_REINDEX.st
1aba0 61 74 69 63 20 76 6f 69 64 20 72 65 69 6e 64 65  atic void reinde
1abb0 78 44 61 74 61 62 61 73 65 73 28 50 61 72 73 65  xDatabases(Parse
1abc0 20 2a 70 50 61 72 73 65 2c 20 63 68 61 72 20 63   *pParse, char c
1abd0 6f 6e 73 74 20 2a 7a 43 6f 6c 6c 29 7b 0a 20 20  onst *zColl){.  
1abe0 44 62 20 2a 70 44 62 3b 20 20 20 20 20 20 20 20  Db *pDb;        
1abf0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
1ac00 20 73 69 6e 67 6c 65 20 64 61 74 61 62 61 73 65   single database
1ac10 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62 3b 20 20   */.  int iDb;  
1ac20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ac30 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73    /* The databas
1ac40 65 20 69 6e 64 65 78 20 6e 75 6d 62 65 72 20 2a  e index number *
1ac50 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  /.  sqlite3 *db 
1ac60 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 20  = pParse->db;   
1ac70 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20  /* The database 
1ac80 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20  connection */.  
1ac90 48 61 73 68 45 6c 65 6d 20 2a 6b 3b 20 20 20 20  HashElem *k;    
1aca0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
1acb0 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20  or looping over 
1acc0 74 61 62 6c 65 73 20 69 6e 20 70 44 62 20 2a 2f  tables in pDb */
1acd0 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 20  .  Table *pTab; 
1ace0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1acf0 2a 20 41 20 74 61 62 6c 65 20 69 6e 20 74 68 65  * A table in the
1ad00 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 0a 20 20   database */..  
1ad10 66 6f 72 28 69 44 62 3d 30 2c 20 70 44 62 3d 64  for(iDb=0, pDb=d
1ad20 62 2d 3e 61 44 62 3b 20 69 44 62 3c 64 62 2d 3e  b->aDb; iDb<db->
1ad30 6e 44 62 3b 20 69 44 62 2b 2b 2c 20 70 44 62 2b  nDb; iDb++, pDb+
1ad40 2b 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  +){.    assert( 
1ad50 70 44 62 21 3d 30 20 29 3b 0a 20 20 20 20 66 6f  pDb!=0 );.    fo
1ad60 72 28 6b 3d 73 71 6c 69 74 65 48 61 73 68 46 69  r(k=sqliteHashFi
1ad70 72 73 74 28 26 70 44 62 2d 3e 70 53 63 68 65 6d  rst(&pDb->pSchem
1ad80 61 2d 3e 74 62 6c 48 61 73 68 29 3b 20 20 6b 3b  a->tblHash);  k;
1ad90 20 6b 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78   k=sqliteHashNex
1ada0 74 28 6b 29 29 7b 0a 20 20 20 20 20 20 70 54 61  t(k)){.      pTa
1adb0 62 20 3d 20 28 54 61 62 6c 65 2a 29 73 71 6c 69  b = (Table*)sqli
1adc0 74 65 48 61 73 68 44 61 74 61 28 6b 29 3b 0a 20  teHashData(k);. 
1add0 20 20 20 20 20 72 65 69 6e 64 65 78 54 61 62 6c       reindexTabl
1ade0 65 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20  e(pParse, pTab, 
1adf0 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20 7d 0a 20 20  zColl);.    }.  
1ae00 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  }.}.#endif../*.*
1ae10 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
1ae20 66 6f 72 20 74 68 65 20 52 45 49 4e 44 45 58 20  for the REINDEX 
1ae30 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 20  command..**.**  
1ae40 20 20 20 20 20 20 52 45 49 4e 44 45 58 20 20 20        REINDEX   
1ae50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ae60 20 20 20 20 20 20 20 20 20 2d 2d 20 31 0a 2a 2a           -- 1.**
1ae70 20 20 20 20 20 20 20 20 52 45 49 4e 44 45 58 20          REINDEX 
1ae80 20 3c 63 6f 6c 6c 61 74 69 6f 6e 3e 20 20 20 20   <collation>    
1ae90 20 20 20 20 20 20 20 20 20 20 20 2d 2d 20 32 0a             -- 2.
1aea0 2a 2a 20 20 20 20 20 20 20 20 52 45 49 4e 44 45  **        REINDE
1aeb0 58 20 20 3f 3c 64 61 74 61 62 61 73 65 3e 2e 3f  X  ?<database>.?
1aec0 3c 74 61 62 6c 65 6e 61 6d 65 3e 20 20 2d 2d 20  <tablename>  -- 
1aed0 33 0a 2a 2a 20 20 20 20 20 20 20 20 52 45 49 4e  3.**        REIN
1aee0 44 45 58 20 20 3f 3c 64 61 74 61 62 61 73 65 3e  DEX  ?<database>
1aef0 2e 3f 3c 69 6e 64 65 78 6e 61 6d 65 3e 20 20 2d  .?<indexname>  -
1af00 2d 20 34 0a 2a 2a 0a 2a 2a 20 46 6f 72 6d 20 31  - 4.**.** Form 1
1af10 20 63 61 75 73 65 73 20 61 6c 6c 20 69 6e 64 69   causes all indi
1af20 63 65 73 20 69 6e 20 61 6c 6c 20 61 74 74 61 63  ces in all attac
1af30 68 65 64 20 64 61 74 61 62 61 73 65 73 20 74 6f  hed databases to
1af40 20 62 65 20 72 65 62 75 69 6c 74 2e 0a 2a 2a 20   be rebuilt..** 
1af50 46 6f 72 6d 20 32 20 72 65 62 75 69 6c 64 73 20  Form 2 rebuilds 
1af60 61 6c 6c 20 69 6e 64 69 63 65 73 20 69 6e 20 61  all indices in a
1af70 6c 6c 20 64 61 74 61 62 61 73 65 73 20 74 68 61  ll databases tha
1af80 74 20 75 73 65 20 74 68 65 20 6e 61 6d 65 64 0a  t use the named.
1af90 2a 2a 20 63 6f 6c 6c 61 74 69 6e 67 20 66 75 6e  ** collating fun
1afa0 63 74 69 6f 6e 2e 20 20 46 6f 72 6d 73 20 33 20  ction.  Forms 3 
1afb0 61 6e 64 20 34 20 72 65 62 75 69 6c 64 20 74 68  and 4 rebuild th
1afc0 65 20 6e 61 6d 65 64 20 69 6e 64 65 78 20 6f 72  e named index or
1afd0 20 61 6c 6c 0a 2a 2a 20 69 6e 64 69 63 65 73 20   all.** indices 
1afe0 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
1aff0 74 68 65 20 6e 61 6d 65 64 20 74 61 62 6c 65 2e  the named table.
1b000 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .*/.#ifndef SQLI
1b010 54 45 5f 4f 4d 49 54 5f 52 45 49 4e 44 45 58 0a  TE_OMIT_REINDEX.
1b020 76 6f 69 64 20 73 71 6c 69 74 65 33 52 65 69 6e  void sqlite3Rein
1b030 64 65 78 28 50 61 72 73 65 20 2a 70 50 61 72 73  dex(Parse *pPars
1b040 65 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31  e, Token *pName1
1b050 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32 29  , Token *pName2)
1b060 7b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f  {.  CollSeq *pCo
1b070 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ll;             
1b080 2f 2a 20 43 6f 6c 6c 61 74 69 6e 67 20 73 65 71  /* Collating seq
1b090 75 65 6e 63 65 20 74 6f 20 62 65 20 72 65 69 6e  uence to be rein
1b0a0 64 65 78 65 64 2c 20 6f 72 20 4e 55 4c 4c 20 2a  dexed, or NULL *
1b0b0 2f 0a 20 20 63 68 61 72 20 2a 7a 3b 20 20 20 20  /.  char *z;    
1b0c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b0d0 2f 2a 20 4e 61 6d 65 20 6f 66 20 61 20 74 61 62  /* Name of a tab
1b0e0 6c 65 20 6f 72 20 69 6e 64 65 78 20 2a 2f 0a 20  le or index */. 
1b0f0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62   const char *zDb
1b100 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
1b110 4e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61  Name of the data
1b120 62 61 73 65 20 2a 2f 0a 20 20 54 61 62 6c 65 20  base */.  Table 
1b130 2a 70 54 61 62 3b 20 20 20 20 20 20 20 20 20 20  *pTab;          
1b140 20 20 20 20 20 20 2f 2a 20 41 20 74 61 62 6c 65        /* A table
1b150 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
1b160 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e   */.  Index *pIn
1b170 64 65 78 3b 20 20 20 20 20 20 20 20 20 20 20 20  dex;            
1b180 20 20 2f 2a 20 41 6e 20 69 6e 64 65 78 20 61 73    /* An index as
1b190 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 70 54  sociated with pT
1b1a0 61 62 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62 3b  ab */.  int iDb;
1b1b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b1c0 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62      /* The datab
1b1d0 61 73 65 20 69 6e 64 65 78 20 6e 75 6d 62 65 72  ase index number
1b1e0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
1b1f0 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20  b = pParse->db; 
1b200 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73    /* The databas
1b210 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a  e connection */.
1b220 20 20 54 6f 6b 65 6e 20 2a 70 4f 62 6a 4e 61 6d    Token *pObjNam
1b230 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e;            /*
1b240 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62   Name of the tab
1b250 6c 65 20 6f 72 20 69 6e 64 65 78 20 74 6f 20 62  le or index to b
1b260 65 20 72 65 69 6e 64 65 78 65 64 20 2a 2f 0a 0a  e reindexed */..
1b270 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 64 61    /* Read the da
1b280 74 61 62 61 73 65 20 73 63 68 65 6d 61 2e 20 49  tabase schema. I
1b290 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
1b2a0 73 2c 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f  s, leave an erro
1b2b0 72 20 6d 65 73 73 61 67 65 0a 20 20 2a 2a 20 61  r message.  ** a
1b2c0 6e 64 20 63 6f 64 65 20 69 6e 20 70 50 61 72 73  nd code in pPars
1b2d0 65 20 61 6e 64 20 72 65 74 75 72 6e 20 4e 55 4c  e and return NUL
1b2e0 4c 2e 20 2a 2f 0a 20 20 69 66 28 20 53 51 4c 49  L. */.  if( SQLI
1b2f0 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65  TE_OK!=sqlite3Re
1b300 61 64 53 63 68 65 6d 61 28 70 50 61 72 73 65 29  adSchema(pParse)
1b310 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a   ){.    return;.
1b320 20 20 7d 0a 0a 20 20 69 66 28 20 70 4e 61 6d 65    }..  if( pName
1b330 31 3d 3d 30 20 7c 7c 20 70 4e 61 6d 65 31 2d 3e  1==0 || pName1->
1b340 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 69 6e  z==0 ){.    rein
1b350 64 65 78 44 61 74 61 62 61 73 65 73 28 70 50 61  dexDatabases(pPa
1b360 72 73 65 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  rse, 0);.    ret
1b370 75 72 6e 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  urn;.  }else if(
1b380 20 70 4e 61 6d 65 32 3d 3d 30 20 7c 7c 20 70 4e   pName2==0 || pN
1b390 61 6d 65 32 2d 3e 7a 3d 3d 30 20 29 7b 0a 20 20  ame2->z==0 ){.  
1b3a0 20 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 3b 0a 20    char *zColl;. 
1b3b0 20 20 20 61 73 73 65 72 74 28 20 70 4e 61 6d 65     assert( pName
1b3c0 31 2d 3e 7a 20 29 3b 0a 20 20 20 20 7a 43 6f 6c  1->z );.    zCol
1b3d0 6c 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46  l = sqlite3NameF
1b3e0 72 6f 6d 54 6f 6b 65 6e 28 70 50 61 72 73 65 2d  romToken(pParse-
1b3f0 3e 64 62 2c 20 70 4e 61 6d 65 31 29 3b 0a 20 20  >db, pName1);.  
1b400 20 20 69 66 28 20 21 7a 43 6f 6c 6c 20 29 20 72    if( !zColl ) r
1b410 65 74 75 72 6e 3b 0a 20 20 20 20 70 43 6f 6c 6c  eturn;.    pColl
1b420 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f   = sqlite3FindCo
1b430 6c 6c 53 65 71 28 64 62 2c 20 45 4e 43 28 64 62  llSeq(db, ENC(db
1b440 29 2c 20 7a 43 6f 6c 6c 2c 20 2d 31 2c 20 30 29  ), zColl, -1, 0)
1b450 3b 0a 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 20  ;.    if( pColl 
1b460 29 7b 0a 20 20 20 20 20 20 69 66 28 20 7a 43 6f  ){.      if( zCo
1b470 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  ll ){.        re
1b480 69 6e 64 65 78 44 61 74 61 62 61 73 65 73 28 70  indexDatabases(p
1b490 50 61 72 73 65 2c 20 7a 43 6f 6c 6c 29 3b 0a 20  Parse, zColl);. 
1b4a0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62         sqlite3Db
1b4b0 46 72 65 65 28 64 62 2c 20 7a 43 6f 6c 6c 29 3b  Free(db, zColl);
1b4c0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
1b4d0 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20  eturn;.    }.   
1b4e0 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
1b4f0 62 2c 20 7a 43 6f 6c 6c 29 3b 0a 20 20 7d 0a 20  b, zColl);.  }. 
1b500 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 54 77   iDb = sqlite3Tw
1b510 6f 50 61 72 74 4e 61 6d 65 28 70 50 61 72 73 65  oPartName(pParse
1b520 2c 20 70 4e 61 6d 65 31 2c 20 70 4e 61 6d 65 32  , pName1, pName2
1b530 2c 20 26 70 4f 62 6a 4e 61 6d 65 29 3b 0a 20 20  , &pObjName);.  
1b540 69 66 28 20 69 44 62 3c 30 20 29 20 72 65 74 75  if( iDb<0 ) retu
1b550 72 6e 3b 0a 20 20 7a 20 3d 20 73 71 6c 69 74 65  rn;.  z = sqlite
1b560 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64  3NameFromToken(d
1b570 62 2c 20 70 4f 62 6a 4e 61 6d 65 29 3b 0a 20 20  b, pObjName);.  
1b580 69 66 28 20 7a 3d 3d 30 20 29 20 72 65 74 75 72  if( z==0 ) retur
1b590 6e 3b 0a 20 20 7a 44 62 20 3d 20 64 62 2d 3e 61  n;.  zDb = db->a
1b5a0 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20  Db[iDb].zName;. 
1b5b0 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33 46   pTab = sqlite3F
1b5c0 69 6e 64 54 61 62 6c 65 28 64 62 2c 20 7a 2c 20  indTable(db, z, 
1b5d0 7a 44 62 29 3b 0a 20 20 69 66 28 20 70 54 61 62  zDb);.  if( pTab
1b5e0 20 29 7b 0a 20 20 20 20 72 65 69 6e 64 65 78 54   ){.    reindexT
1b5f0 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70 54 61  able(pParse, pTa
1b600 62 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  b, 0);.    sqlit
1b610 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 29 3b  e3DbFree(db, z);
1b620 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
1b630 0a 20 20 70 49 6e 64 65 78 20 3d 20 73 71 6c 69  .  pIndex = sqli
1b640 74 65 33 46 69 6e 64 49 6e 64 65 78 28 64 62 2c  te3FindIndex(db,
1b650 20 7a 2c 20 7a 44 62 29 3b 0a 20 20 73 71 6c 69   z, zDb);.  sqli
1b660 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 29  te3DbFree(db, z)
1b670 3b 0a 20 20 69 66 28 20 70 49 6e 64 65 78 20 29  ;.  if( pIndex )
1b680 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65 67  {.    sqlite3Beg
1b690 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e  inWriteOperation
1b6a0 28 70 50 61 72 73 65 2c 20 30 2c 20 69 44 62 29  (pParse, 0, iDb)
1b6b0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 66  ;.    sqlite3Ref
1b6c0 69 6c 6c 49 6e 64 65 78 28 70 50 61 72 73 65 2c  illIndex(pParse,
1b6d0 20 70 49 6e 64 65 78 2c 20 2d 31 29 3b 0a 20 20   pIndex, -1);.  
1b6e0 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
1b6f0 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
1b700 70 50 61 72 73 65 2c 20 22 75 6e 61 62 6c 65 20  pParse, "unable 
1b710 74 6f 20 69 64 65 6e 74 69 66 79 20 74 68 65 20  to identify the 
1b720 6f 62 6a 65 63 74 20 74 6f 20 62 65 20 72 65 69  object to be rei
1b730 6e 64 65 78 65 64 22 29 3b 0a 7d 0a 23 65 6e 64  ndexed");.}.#end
1b740 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  if../*.** Return
1b750 20 61 20 64 79 6e 61 6d 69 63 6c 79 20 61 6c 6c   a dynamicly all
1b760 6f 63 61 74 65 64 20 4b 65 79 49 6e 66 6f 20 73  ocated KeyInfo s
1b770 74 72 75 63 74 75 72 65 20 74 68 61 74 20 63 61  tructure that ca
1b780 6e 20 62 65 20 75 73 65 64 0a 2a 2a 20 77 69 74  n be used.** wit
1b790 68 20 4f 50 5f 4f 70 65 6e 52 65 61 64 20 6f 72  h OP_OpenRead or
1b7a0 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65 20 74 6f   OP_OpenWrite to
1b7b0 20 61 63 63 65 73 73 20 64 61 74 61 62 61 73 65   access database
1b7c0 20 69 6e 64 65 78 20 70 49 64 78 2e 0a 2a 2a 0a   index pIdx..**.
1b7d0 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c  ** If successful
1b7e0 2c 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  , a pointer to t
1b7f0 68 65 20 6e 65 77 20 73 74 72 75 63 74 75 72 65  he new structure
1b800 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 6e   is returned. In
1b810 20 74 68 69 73 20 63 61 73 65 0a 2a 2a 20 74 68   this case.** th
1b820 65 20 63 61 6c 6c 65 72 20 69 73 20 72 65 73 70  e caller is resp
1b830 6f 6e 73 69 62 6c 65 20 66 6f 72 20 63 61 6c 6c  onsible for call
1b840 69 6e 67 20 73 71 6c 69 74 65 33 44 62 46 72 65  ing sqlite3DbFre
1b850 65 28 64 62 2c 20 29 20 6f 6e 20 74 68 65 20 72  e(db, ) on the r
1b860 65 74 75 72 6e 65 64 20 0a 2a 2a 20 70 6f 69 6e  eturned .** poin
1b870 74 65 72 2e 20 49 66 20 61 6e 20 65 72 72 6f 72  ter. If an error
1b880 20 6f 63 63 75 72 73 20 28 6f 75 74 20 6f 66 20   occurs (out of 
1b890 6d 65 6d 6f 72 79 20 6f 72 20 6d 69 73 73 69 6e  memory or missin
1b8a0 67 20 63 6f 6c 6c 61 74 69 6f 6e 20 0a 2a 2a 20  g collation .** 
1b8b0 73 65 71 75 65 6e 63 65 29 2c 20 4e 55 4c 4c 20  sequence), NULL 
1b8c0 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20  is returned and 
1b8d0 74 68 65 20 73 74 61 74 65 20 6f 66 20 70 50 61  the state of pPa
1b8e0 72 73 65 20 75 70 64 61 74 65 64 20 74 6f 20 72  rse updated to r
1b8f0 65 66 6c 65 63 74 0a 2a 2a 20 74 68 65 20 65 72  eflect.** the er
1b900 72 6f 72 2e 0a 2a 2f 0a 4b 65 79 49 6e 66 6f 20  ror..*/.KeyInfo 
1b910 2a 73 71 6c 69 74 65 33 49 6e 64 65 78 4b 65 79  *sqlite3IndexKey
1b920 69 6e 66 6f 28 50 61 72 73 65 20 2a 70 50 61 72  info(Parse *pPar
1b930 73 65 2c 20 49 6e 64 65 78 20 2a 70 49 64 78 29  se, Index *pIdx)
1b940 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74  {.  int i;.  int
1b950 20 6e 43 6f 6c 20 3d 20 70 49 64 78 2d 3e 6e 43   nCol = pIdx->nC
1b960 6f 6c 75 6d 6e 3b 0a 20 20 69 6e 74 20 6e 42 79  olumn;.  int nBy
1b970 74 65 73 20 3d 20 73 69 7a 65 6f 66 28 4b 65 79  tes = sizeof(Key
1b980 49 6e 66 6f 29 20 2b 20 28 6e 43 6f 6c 2d 31 29  Info) + (nCol-1)
1b990 2a 73 69 7a 65 6f 66 28 43 6f 6c 6c 53 65 71 2a  *sizeof(CollSeq*
1b9a0 29 20 2b 20 6e 43 6f 6c 3b 0a 20 20 73 71 6c 69  ) + nCol;.  sqli
1b9b0 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
1b9c0 2d 3e 64 62 3b 0a 20 20 4b 65 79 49 6e 66 6f 20  ->db;.  KeyInfo 
1b9d0 2a 70 4b 65 79 20 3d 20 28 4b 65 79 49 6e 66 6f  *pKey = (KeyInfo
1b9e0 20 2a 29 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   *)sqlite3DbMall
1b9f0 6f 63 5a 65 72 6f 28 64 62 2c 20 6e 42 79 74 65  ocZero(db, nByte
1ba00 73 29 3b 0a 0a 20 20 69 66 28 20 70 4b 65 79 20  s);..  if( pKey 
1ba10 29 7b 0a 20 20 20 20 70 4b 65 79 2d 3e 64 62 20  ){.    pKey->db 
1ba20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
1ba30 20 20 70 4b 65 79 2d 3e 61 53 6f 72 74 4f 72 64    pKey->aSortOrd
1ba40 65 72 20 3d 20 28 75 38 20 2a 29 26 28 70 4b 65  er = (u8 *)&(pKe
1ba50 79 2d 3e 61 43 6f 6c 6c 5b 6e 43 6f 6c 5d 29 3b  y->aColl[nCol]);
1ba60 0a 20 20 20 20 61 73 73 65 72 74 28 20 26 70 4b  .    assert( &pK
1ba70 65 79 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 6e  ey->aSortOrder[n
1ba80 43 6f 6c 5d 3d 3d 26 28 28 28 75 38 20 2a 29 70  Col]==&(((u8 *)p
1ba90 4b 65 79 29 5b 6e 42 79 74 65 73 5d 29 20 29 3b  Key)[nBytes]) );
1baa0 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
1bab0 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nCol; i++){.    
1bac0 20 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 20 3d 20    char *zColl = 
1bad0 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 3b  pIdx->azColl[i];
1bae0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 7a  .      assert( z
1baf0 43 6f 6c 6c 20 29 3b 0a 20 20 20 20 20 20 70 4b  Coll );.      pK
1bb00 65 79 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d 20 73  ey->aColl[i] = s
1bb10 71 6c 69 74 65 33 4c 6f 63 61 74 65 43 6f 6c 6c  qlite3LocateColl
1bb20 53 65 71 28 70 50 61 72 73 65 2c 20 7a 43 6f 6c  Seq(pParse, zCol
1bb30 6c 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20 70 4b  l, -1);.      pK
1bb40 65 79 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69  ey->aSortOrder[i
1bb50 5d 20 3d 20 70 49 64 78 2d 3e 61 53 6f 72 74 4f  ] = pIdx->aSortO
1bb60 72 64 65 72 5b 69 5d 3b 0a 20 20 20 20 7d 0a 20  rder[i];.    }. 
1bb70 20 20 20 70 4b 65 79 2d 3e 6e 46 69 65 6c 64 20     pKey->nField 
1bb80 3d 20 6e 43 6f 6c 3b 0a 20 20 7d 0a 0a 20 20 69  = nCol;.  }..  i
1bb90 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20  f( pParse->nErr 
1bba0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  ){.    sqlite3Db
1bbb0 46 72 65 65 28 64 62 2c 20 70 4b 65 79 29 3b 0a  Free(db, pKey);.
1bbc0 20 20 20 20 70 4b 65 79 20 3d 20 30 3b 0a 20 20      pKey = 0;.  
1bbd0 7d 0a 20 20 72 65 74 75 72 6e 20 70 4b 65 79 3b  }.  return pKey;
1bbe0 0a 7d 0a                                         .}.