/ Hex Artifact Content
Login

Artifact f6a74df6d888a00ac91cec332d41f2292a002767:


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 38 38 20 32 30 30 38 2f 30 37 2f 30 38  1.488 2008/07/08
02f0: 20 31 39 3a 33 34 3a 30 37 20 64 72 68 20 45 78   19:34:07 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 23 20 64 65 66 69  rMsg = 0;.# defi
1cf0: 6e 65 20 53 41 56 45 5f 53 5a 20 20 28 73 69 7a  ne SAVE_SZ  (siz
1d00: 65 6f 66 28 50 61 72 73 65 29 20 2d 20 6f 66 66  eof(Parse) - off
1d10: 73 65 74 6f 66 28 50 61 72 73 65 2c 6e 56 61 72  setof(Parse,nVar
1d20: 29 29 0a 20 20 63 68 61 72 20 73 61 76 65 42 75  )).  char saveBu
1d30: 66 5b 53 41 56 45 5f 53 5a 5d 3b 0a 0a 20 20 69  f[SAVE_SZ];..  i
1d40: 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20  f( pParse->nErr 
1d50: 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65  ) return;.  asse
1d60: 72 74 28 20 70 50 61 72 73 65 2d 3e 6e 65 73 74  rt( pParse->nest
1d70: 65 64 3c 31 30 20 29 3b 20 20 2f 2a 20 4e 65 73  ed<10 );  /* Nes
1d80: 74 69 6e 67 20 73 68 6f 75 6c 64 20 6f 6e 6c 79  ting should only
1d90: 20 62 65 20 6f 66 20 6c 69 6d 69 74 65 64 20 64   be of limited d
1da0: 65 70 74 68 20 2a 2f 0a 20 20 76 61 5f 73 74 61  epth */.  va_sta
1db0: 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61 74 29 3b  rt(ap, zFormat);
1dc0: 0a 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65  .  zSql = sqlite
1dd0: 33 56 4d 50 72 69 6e 74 66 28 70 50 61 72 73 65  3VMPrintf(pParse
1de0: 2d 3e 64 62 2c 20 7a 46 6f 72 6d 61 74 2c 20 61  ->db, zFormat, a
1df0: 70 29 3b 0a 20 20 76 61 5f 65 6e 64 28 61 70 29  p);.  va_end(ap)
1e00: 3b 0a 20 20 69 66 28 20 7a 53 71 6c 3d 3d 30 20  ;.  if( zSql==0 
1e10: 29 7b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 64  ){.    pParse->d
1e20: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
1e30: 3d 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b  = 1;.    return;
1e40: 20 20 20 2f 2a 20 41 20 6d 61 6c 6c 6f 63 20 6d     /* A malloc m
1e50: 75 73 74 20 68 61 76 65 20 66 61 69 6c 65 64 20  ust have failed 
1e60: 2a 2f 0a 20 20 7d 0a 20 20 70 50 61 72 73 65 2d  */.  }.  pParse-
1e70: 3e 6e 65 73 74 65 64 2b 2b 3b 0a 20 20 6d 65 6d  >nested++;.  mem
1e80: 63 70 79 28 73 61 76 65 42 75 66 2c 20 26 70 50  cpy(saveBuf, &pP
1e90: 61 72 73 65 2d 3e 6e 56 61 72 2c 20 53 41 56 45  arse->nVar, SAVE
1ea0: 5f 53 5a 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26  _SZ);.  memset(&
1eb0: 70 50 61 72 73 65 2d 3e 6e 56 61 72 2c 20 30 2c  pParse->nVar, 0,
1ec0: 20 53 41 56 45 5f 53 5a 29 3b 0a 20 20 73 71 6c   SAVE_SZ);.  sql
1ed0: 69 74 65 33 52 75 6e 50 61 72 73 65 72 28 70 50  ite3RunParser(pP
1ee0: 61 72 73 65 2c 20 7a 53 71 6c 2c 20 26 7a 45 72  arse, zSql, &zEr
1ef0: 72 4d 73 67 29 3b 0a 20 20 73 71 6c 69 74 65 33  rMsg);.  sqlite3
1f00: 5f 66 72 65 65 28 7a 45 72 72 4d 73 67 29 3b 0a  _free(zErrMsg);.
1f10: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
1f20: 53 71 6c 29 3b 0a 20 20 6d 65 6d 63 70 79 28 26  Sql);.  memcpy(&
1f30: 70 50 61 72 73 65 2d 3e 6e 56 61 72 2c 20 73 61  pParse->nVar, sa
1f40: 76 65 42 75 66 2c 20 53 41 56 45 5f 53 5a 29 3b  veBuf, SAVE_SZ);
1f50: 0a 20 20 70 50 61 72 73 65 2d 3e 6e 65 73 74 65  .  pParse->neste
1f60: 64 2d 2d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f  d--;.}../*.** Lo
1f70: 63 61 74 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f  cate the in-memo
1f80: 72 79 20 73 74 72 75 63 74 75 72 65 20 74 68 61  ry structure tha
1f90: 74 20 64 65 73 63 72 69 62 65 73 20 61 20 70 61  t describes a pa
1fa0: 72 74 69 63 75 6c 61 72 20 64 61 74 61 62 61 73  rticular databas
1fb0: 65 0a 2a 2a 20 74 61 62 6c 65 20 67 69 76 65 6e  e.** table given
1fc0: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 61   the name of tha
1fd0: 74 20 74 61 62 6c 65 20 61 6e 64 20 28 6f 70 74  t table and (opt
1fe0: 69 6f 6e 61 6c 6c 79 29 20 74 68 65 20 6e 61 6d  ionally) the nam
1ff0: 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74 61  e of the.** data
2000: 62 61 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20  base containing 
2010: 74 68 65 20 74 61 62 6c 65 2e 20 20 52 65 74 75  the table.  Retu
2020: 72 6e 20 4e 55 4c 4c 20 69 66 20 6e 6f 74 20 66  rn NULL if not f
2030: 6f 75 6e 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a  ound..**.** If z
2040: 44 61 74 61 62 61 73 65 20 69 73 20 30 2c 20 61  Database is 0, a
2050: 6c 6c 20 64 61 74 61 62 61 73 65 73 20 61 72 65  ll databases are
2060: 20 73 65 61 72 63 68 65 64 20 66 6f 72 20 74 68   searched for th
2070: 65 20 74 61 62 6c 65 20 61 6e 64 20 74 68 65 0a  e table and the.
2080: 2a 2a 20 66 69 72 73 74 20 6d 61 74 63 68 69 6e  ** first matchin
2090: 67 20 74 61 62 6c 65 20 69 73 20 72 65 74 75 72  g table is retur
20a0: 6e 65 64 2e 20 20 28 4e 6f 20 63 68 65 63 6b 69  ned.  (No checki
20b0: 6e 67 20 66 6f 72 20 64 75 70 6c 69 63 61 74 65  ng for duplicate
20c0: 20 74 61 62 6c 65 0a 2a 2a 20 6e 61 6d 65 73 20   table.** names 
20d0: 69 73 20 64 6f 6e 65 2e 29 20 20 54 68 65 20 73  is done.)  The s
20e0: 65 61 72 63 68 20 6f 72 64 65 72 20 69 73 20 54  earch order is T
20f0: 45 4d 50 20 66 69 72 73 74 2c 20 74 68 65 6e 20  EMP first, then 
2100: 4d 41 49 4e 2c 20 74 68 65 6e 20 61 6e 79 0a 2a  MAIN, then any.*
2110: 2a 20 61 75 78 69 6c 69 61 72 79 20 64 61 74 61  * auxiliary data
2120: 62 61 73 65 73 20 61 64 64 65 64 20 75 73 69 6e  bases added usin
2130: 67 20 74 68 65 20 41 54 54 41 43 48 20 63 6f 6d  g the ATTACH com
2140: 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20  mand..**.** See 
2150: 61 6c 73 6f 20 73 71 6c 69 74 65 33 4c 6f 63 61  also sqlite3Loca
2160: 74 65 54 61 62 6c 65 28 29 2e 0a 2a 2f 0a 54 61  teTable()..*/.Ta
2170: 62 6c 65 20 2a 73 71 6c 69 74 65 33 46 69 6e 64  ble *sqlite3Find
2180: 54 61 62 6c 65 28 73 71 6c 69 74 65 33 20 2a 64  Table(sqlite3 *d
2190: 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  b, const char *z
21a0: 4e 61 6d 65 2c 20 63 6f 6e 73 74 20 63 68 61 72  Name, const char
21b0: 20 2a 7a 44 61 74 61 62 61 73 65 29 7b 0a 20 20   *zDatabase){.  
21c0: 54 61 62 6c 65 20 2a 70 20 3d 20 30 3b 0a 20 20  Table *p = 0;.  
21d0: 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e 4e 61  int i;.  int nNa
21e0: 6d 65 3b 0a 20 20 61 73 73 65 72 74 28 20 7a 4e  me;.  assert( zN
21f0: 61 6d 65 21 3d 30 20 29 3b 0a 20 20 6e 4e 61 6d  ame!=0 );.  nNam
2200: 65 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  e = sqlite3Strle
2210: 6e 28 64 62 2c 20 7a 4e 61 6d 65 29 20 2b 20 31  n(db, zName) + 1
2220: 3b 0a 20 20 66 6f 72 28 69 3d 4f 4d 49 54 5f 54  ;.  for(i=OMIT_T
2230: 45 4d 50 44 42 3b 20 69 3c 64 62 2d 3e 6e 44 62  EMPDB; i<db->nDb
2240: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20  ; i++){.    int 
2250: 6a 20 3d 20 28 69 3c 32 29 20 3f 20 69 5e 31 20  j = (i<2) ? i^1 
2260: 3a 20 69 3b 20 20 20 2f 2a 20 53 65 61 72 63 68  : i;   /* Search
2270: 20 54 45 4d 50 20 62 65 66 6f 72 65 20 4d 41 49   TEMP before MAI
2280: 4e 20 2a 2f 0a 20 20 20 20 69 66 28 20 7a 44 61  N */.    if( zDa
2290: 74 61 62 61 73 65 21 3d 30 20 26 26 20 73 71 6c  tabase!=0 && sql
22a0: 69 74 65 33 53 74 72 49 43 6d 70 28 7a 44 61 74  ite3StrICmp(zDat
22b0: 61 62 61 73 65 2c 20 64 62 2d 3e 61 44 62 5b 6a  abase, db->aDb[j
22c0: 5d 2e 7a 4e 61 6d 65 29 20 29 20 63 6f 6e 74 69  ].zName) ) conti
22d0: 6e 75 65 3b 0a 20 20 20 20 70 20 3d 20 73 71 6c  nue;.    p = sql
22e0: 69 74 65 33 48 61 73 68 46 69 6e 64 28 26 64 62  ite3HashFind(&db
22f0: 2d 3e 61 44 62 5b 6a 5d 2e 70 53 63 68 65 6d 61  ->aDb[j].pSchema
2300: 2d 3e 74 62 6c 48 61 73 68 2c 20 7a 4e 61 6d 65  ->tblHash, zName
2310: 2c 20 6e 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66  , nName);.    if
2320: 28 20 70 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d  ( p ) break;.  }
2330: 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a  .  return p;.}..
2340: 2f 2a 0a 2a 2a 20 4c 6f 63 61 74 65 20 74 68 65  /*.** Locate the
2350: 20 69 6e 2d 6d 65 6d 6f 72 79 20 73 74 72 75 63   in-memory struc
2360: 74 75 72 65 20 74 68 61 74 20 64 65 73 63 72 69  ture that descri
2370: 62 65 73 20 61 20 70 61 72 74 69 63 75 6c 61 72  bes a particular
2380: 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 74 61 62   database.** tab
2390: 6c 65 20 67 69 76 65 6e 20 74 68 65 20 6e 61 6d  le given the nam
23a0: 65 20 6f 66 20 74 68 61 74 20 74 61 62 6c 65 20  e of that table 
23b0: 61 6e 64 20 28 6f 70 74 69 6f 6e 61 6c 6c 79 29  and (optionally)
23c0: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
23d0: 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 63 6f 6e  .** database con
23e0: 74 61 69 6e 69 6e 67 20 74 68 65 20 74 61 62 6c  taining the tabl
23f0: 65 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20  e.  Return NULL 
2400: 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 20 20 41  if not found.  A
2410: 6c 73 6f 20 6c 65 61 76 65 20 61 6e 0a 2a 2a 20  lso leave an.** 
2420: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e  error message in
2430: 20 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67   pParse->zErrMsg
2440: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 69 66 66  ..**.** The diff
2450: 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20 74  erence between t
2460: 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6e 64 20  his routine and 
2470: 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65  sqlite3FindTable
2480: 28 29 20 69 73 20 74 68 61 74 20 74 68 69 73 0a  () is that this.
2490: 2a 2a 20 72 6f 75 74 69 6e 65 20 6c 65 61 76 65  ** routine leave
24a0: 73 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61  s an error messa
24b0: 67 65 20 69 6e 20 70 50 61 72 73 65 2d 3e 7a 45  ge in pParse->zE
24c0: 72 72 4d 73 67 20 77 68 65 72 65 0a 2a 2a 20 73  rrMsg where.** s
24d0: 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28  qlite3FindTable(
24e0: 29 20 64 6f 65 73 20 6e 6f 74 2e 0a 2a 2f 0a 54  ) does not..*/.T
24f0: 61 62 6c 65 20 2a 73 71 6c 69 74 65 33 4c 6f 63  able *sqlite3Loc
2500: 61 74 65 54 61 62 6c 65 28 0a 20 20 50 61 72 73  ateTable(.  Pars
2510: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
2520: 20 20 20 2f 2a 20 63 6f 6e 74 65 78 74 20 69 6e     /* context in
2530: 20 77 68 69 63 68 20 74 6f 20 72 65 70 6f 72 74   which to report
2540: 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20 69 6e 74   errors */.  int
2550: 20 69 73 56 69 65 77 2c 20 20 20 20 20 20 20 20   isView,        
2560: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6c      /* True if l
2570: 6f 6f 6b 69 6e 67 20 66 6f 72 20 61 20 56 49 45  ooking for a VIE
2580: 57 20 72 61 74 68 65 72 20 74 68 61 6e 20 61 20  W rather than a 
2590: 54 41 42 4c 45 20 2a 2f 0a 20 20 63 6f 6e 73 74  TABLE */.  const
25a0: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 20 20   char *zName,   
25b0: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
25c0: 20 74 61 62 6c 65 20 77 65 20 61 72 65 20 6c 6f   table we are lo
25d0: 6f 6b 69 6e 67 20 66 6f 72 20 2a 2f 0a 20 20 63  oking for */.  c
25e0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 61 73  onst char *zDbas
25f0: 65 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66  e     /* Name of
2600: 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20   the database.  
2610: 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f  Might be NULL */
2620: 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a  .){.  Table *p;.
2630: 0a 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 64  .  /* Read the d
2640: 61 74 61 62 61 73 65 20 73 63 68 65 6d 61 2e 20  atabase schema. 
2650: 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
2660: 72 73 2c 20 6c 65 61 76 65 20 61 6e 20 65 72 72  rs, leave an err
2670: 6f 72 20 6d 65 73 73 61 67 65 0a 20 20 2a 2a 20  or message.  ** 
2680: 61 6e 64 20 63 6f 64 65 20 69 6e 20 70 50 61 72  and code in pPar
2690: 73 65 20 61 6e 64 20 72 65 74 75 72 6e 20 4e 55  se and return NU
26a0: 4c 4c 2e 20 2a 2f 0a 20 20 69 66 28 20 53 51 4c  LL. */.  if( SQL
26b0: 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52  ITE_OK!=sqlite3R
26c0: 65 61 64 53 63 68 65 6d 61 28 70 50 61 72 73 65  eadSchema(pParse
26d0: 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
26e0: 30 3b 0a 20 20 7d 0a 0a 20 20 70 20 3d 20 73 71  0;.  }..  p = sq
26f0: 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28 70  lite3FindTable(p
2700: 50 61 72 73 65 2d 3e 64 62 2c 20 7a 4e 61 6d 65  Parse->db, zName
2710: 2c 20 7a 44 62 61 73 65 29 3b 0a 20 20 69 66 28  , zDbase);.  if(
2720: 20 70 3d 3d 30 20 29 7b 0a 20 20 20 20 63 6f 6e   p==0 ){.    con
2730: 73 74 20 63 68 61 72 20 2a 7a 4d 73 67 20 3d 20  st char *zMsg = 
2740: 69 73 56 69 65 77 20 3f 20 22 6e 6f 20 73 75 63  isView ? "no suc
2750: 68 20 76 69 65 77 22 20 3a 20 22 6e 6f 20 73 75  h view" : "no su
2760: 63 68 20 74 61 62 6c 65 22 3b 0a 20 20 20 20 69  ch table";.    i
2770: 66 28 20 7a 44 62 61 73 65 20 29 7b 0a 20 20 20  f( zDbase ){.   
2780: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
2790: 73 67 28 70 50 61 72 73 65 2c 20 22 25 73 3a 20  sg(pParse, "%s: 
27a0: 25 73 2e 25 73 22 2c 20 7a 4d 73 67 2c 20 7a 44  %s.%s", zMsg, zD
27b0: 62 61 73 65 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20  base, zName);.  
27c0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73    }else{.      s
27d0: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
27e0: 50 61 72 73 65 2c 20 22 25 73 3a 20 25 73 22 2c  Parse, "%s: %s",
27f0: 20 7a 4d 73 67 2c 20 7a 4e 61 6d 65 29 3b 0a 20   zMsg, zName);. 
2800: 20 20 20 7d 0a 20 20 20 20 70 50 61 72 73 65 2d     }.    pParse-
2810: 3e 63 68 65 63 6b 53 63 68 65 6d 61 20 3d 20 31  >checkSchema = 1
2820: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
2830: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61 74  ;.}../*.** Locat
2840: 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20  e the in-memory 
2850: 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20 64  structure that d
2860: 65 73 63 72 69 62 65 73 20 0a 2a 2a 20 61 20 70  escribes .** a p
2870: 61 72 74 69 63 75 6c 61 72 20 69 6e 64 65 78 20  articular index 
2880: 67 69 76 65 6e 20 74 68 65 20 6e 61 6d 65 20 6f  given the name o
2890: 66 20 74 68 61 74 20 69 6e 64 65 78 0a 2a 2a 20  f that index.** 
28a0: 61 6e 64 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  and the name of 
28b0: 74 68 65 20 64 61 74 61 62 61 73 65 20 74 68 61  the database tha
28c0: 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 69  t contains the i
28d0: 6e 64 65 78 2e 0a 2a 2a 20 52 65 74 75 72 6e 20  ndex..** Return 
28e0: 4e 55 4c 4c 20 69 66 20 6e 6f 74 20 66 6f 75 6e  NULL if not foun
28f0: 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 44 61 74  d..**.** If zDat
2900: 61 62 61 73 65 20 69 73 20 30 2c 20 61 6c 6c 20  abase is 0, all 
2910: 64 61 74 61 62 61 73 65 73 20 61 72 65 20 73 65  databases are se
2920: 61 72 63 68 65 64 20 66 6f 72 20 74 68 65 0a 2a  arched for the.*
2930: 2a 20 74 61 62 6c 65 20 61 6e 64 20 74 68 65 20  * table and the 
2940: 66 69 72 73 74 20 6d 61 74 63 68 69 6e 67 20 69  first matching i
2950: 6e 64 65 78 20 69 73 20 72 65 74 75 72 6e 65 64  ndex is returned
2960: 2e 20 20 28 4e 6f 20 63 68 65 63 6b 69 6e 67 0a  .  (No checking.
2970: 2a 2a 20 66 6f 72 20 64 75 70 6c 69 63 61 74 65  ** for duplicate
2980: 20 69 6e 64 65 78 20 6e 61 6d 65 73 20 69 73 20   index names is 
2990: 64 6f 6e 65 2e 29 20 20 54 68 65 20 73 65 61 72  done.)  The sear
29a0: 63 68 20 6f 72 64 65 72 20 69 73 0a 2a 2a 20 54  ch order is.** T
29b0: 45 4d 50 20 66 69 72 73 74 2c 20 74 68 65 6e 20  EMP first, then 
29c0: 4d 41 49 4e 2c 20 74 68 65 6e 20 61 6e 79 20 61  MAIN, then any a
29d0: 75 78 69 6c 69 61 72 79 20 64 61 74 61 62 61 73  uxiliary databas
29e0: 65 73 20 61 64 64 65 64 0a 2a 2a 20 75 73 69 6e  es added.** usin
29f0: 67 20 74 68 65 20 41 54 54 41 43 48 20 63 6f 6d  g the ATTACH com
2a00: 6d 61 6e 64 2e 0a 2a 2f 0a 49 6e 64 65 78 20 2a  mand..*/.Index *
2a10: 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 64 65 78  sqlite3FindIndex
2a20: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f  (sqlite3 *db, co
2a30: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c  nst char *zName,
2a40: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62   const char *zDb
2a50: 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 20 3d 20  ){.  Index *p = 
2a60: 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e  0;.  int i;.  in
2a70: 74 20 6e 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65  t nName = sqlite
2a80: 33 53 74 72 6c 65 6e 28 64 62 2c 20 7a 4e 61 6d  3Strlen(db, zNam
2a90: 65 29 2b 31 3b 0a 20 20 66 6f 72 28 69 3d 4f 4d  e)+1;.  for(i=OM
2aa0: 49 54 5f 54 45 4d 50 44 42 3b 20 69 3c 64 62 2d  IT_TEMPDB; i<db-
2ab0: 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nDb; i++){.    
2ac0: 69 6e 74 20 6a 20 3d 20 28 69 3c 32 29 20 3f 20  int j = (i<2) ? 
2ad0: 69 5e 31 20 3a 20 69 3b 20 20 2f 2a 20 53 65 61  i^1 : i;  /* Sea
2ae0: 72 63 68 20 54 45 4d 50 20 62 65 66 6f 72 65 20  rch TEMP before 
2af0: 4d 41 49 4e 20 2a 2f 0a 20 20 20 20 53 63 68 65  MAIN */.    Sche
2b00: 6d 61 20 2a 70 53 63 68 65 6d 61 20 3d 20 64 62  ma *pSchema = db
2b10: 2d 3e 61 44 62 5b 6a 5d 2e 70 53 63 68 65 6d 61  ->aDb[j].pSchema
2b20: 3b 0a 20 20 20 20 69 66 28 20 7a 44 62 20 26 26  ;.    if( zDb &&
2b30: 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
2b40: 7a 44 62 2c 20 64 62 2d 3e 61 44 62 5b 6a 5d 2e  zDb, db->aDb[j].
2b50: 7a 4e 61 6d 65 29 20 29 20 63 6f 6e 74 69 6e 75  zName) ) continu
2b60: 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  e;.    assert( p
2b70: 53 63 68 65 6d 61 20 7c 7c 20 28 6a 3d 3d 31 20  Schema || (j==1 
2b80: 26 26 20 21 64 62 2d 3e 61 44 62 5b 31 5d 2e 70  && !db->aDb[1].p
2b90: 42 74 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70  Bt) );.    if( p
2ba0: 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 20 20  Schema ){.      
2bb0: 70 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68 46  p = sqlite3HashF
2bc0: 69 6e 64 28 26 70 53 63 68 65 6d 61 2d 3e 69 64  ind(&pSchema->id
2bd0: 78 48 61 73 68 2c 20 7a 4e 61 6d 65 2c 20 6e 4e  xHash, zName, nN
2be0: 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ame);.    }.    
2bf0: 69 66 28 20 70 20 29 20 62 72 65 61 6b 3b 0a 20  if( p ) break;. 
2c00: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d   }.  return p;.}
2c10: 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6c 61 69 6d 20  ../*.** Reclaim 
2c20: 74 68 65 20 6d 65 6d 6f 72 79 20 75 73 65 64 20  the memory used 
2c30: 62 79 20 61 6e 20 69 6e 64 65 78 0a 2a 2f 0a 73  by an index.*/.s
2c40: 74 61 74 69 63 20 76 6f 69 64 20 66 72 65 65 49  tatic void freeI
2c50: 6e 64 65 78 28 49 6e 64 65 78 20 2a 70 29 7b 0a  ndex(Index *p){.
2c60: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
2c70: 2d 3e 7a 43 6f 6c 41 66 66 29 3b 0a 20 20 73 71  ->zColAff);.  sq
2c80: 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 7d  lite3_free(p);.}
2c90: 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 74  ../*.** Remove t
2ca0: 68 65 20 67 69 76 65 6e 20 69 6e 64 65 78 20 66  he given index f
2cb0: 72 6f 6d 20 74 68 65 20 69 6e 64 65 78 20 68 61  rom the index ha
2cc0: 73 68 20 74 61 62 6c 65 2c 20 61 6e 64 20 66 72  sh table, and fr
2cd0: 65 65 0a 2a 2a 20 69 74 73 20 6d 65 6d 6f 72 79  ee.** its memory
2ce0: 20 73 74 72 75 63 74 75 72 65 73 2e 0a 2a 2a 0a   structures..**.
2cf0: 2a 2a 20 54 68 65 20 69 6e 64 65 78 20 69 73 20  ** The index is 
2d00: 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65  removed from the
2d10: 20 64 61 74 61 62 61 73 65 20 68 61 73 68 20 74   database hash t
2d20: 61 62 6c 65 73 20 62 75 74 0a 2a 2a 20 69 74 20  ables but.** it 
2d30: 69 73 20 6e 6f 74 20 75 6e 6c 69 6e 6b 65 64 20  is not unlinked 
2d40: 66 72 6f 6d 20 74 68 65 20 54 61 62 6c 65 20 74  from the Table t
2d50: 68 61 74 20 69 74 20 69 6e 64 65 78 65 73 2e 0a  hat it indexes..
2d60: 2a 2a 20 55 6e 6c 69 6e 6b 69 6e 67 20 66 72 6f  ** Unlinking fro
2d70: 6d 20 74 68 65 20 54 61 62 6c 65 20 6d 75 73 74  m the Table must
2d80: 20 62 65 20 64 6f 6e 65 20 62 79 20 74 68 65 20   be done by the 
2d90: 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e  calling function
2da0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
2db0: 20 73 71 6c 69 74 65 44 65 6c 65 74 65 49 6e 64   sqliteDeleteInd
2dc0: 65 78 28 49 6e 64 65 78 20 2a 70 29 7b 0a 20 20  ex(Index *p){.  
2dd0: 49 6e 64 65 78 20 2a 70 4f 6c 64 3b 0a 20 20 63  Index *pOld;.  c
2de0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
2df0: 20 3d 20 70 2d 3e 7a 4e 61 6d 65 3b 0a 0a 20 20   = p->zName;..  
2e00: 70 4f 6c 64 20 3d 20 73 71 6c 69 74 65 33 48 61  pOld = sqlite3Ha
2e10: 73 68 49 6e 73 65 72 74 28 26 70 2d 3e 70 53 63  shInsert(&p->pSc
2e20: 68 65 6d 61 2d 3e 69 64 78 48 61 73 68 2c 20 7a  hema->idxHash, z
2e30: 4e 61 6d 65 2c 20 73 74 72 6c 65 6e 28 7a 4e 61  Name, strlen(zNa
2e40: 6d 65 29 2b 31 2c 20 30 29 3b 0a 20 20 61 73 73  me)+1, 0);.  ass
2e50: 65 72 74 28 20 70 4f 6c 64 3d 3d 30 20 7c 7c 20  ert( pOld==0 || 
2e60: 70 4f 6c 64 3d 3d 70 20 29 3b 0a 20 20 66 72 65  pOld==p );.  fre
2e70: 65 49 6e 64 65 78 28 70 29 3b 0a 7d 0a 0a 2f 2a  eIndex(p);.}../*
2e80: 0a 2a 2a 20 46 6f 72 20 74 68 65 20 69 6e 64 65  .** For the inde
2e90: 78 20 63 61 6c 6c 65 64 20 7a 49 64 78 4e 61 6d  x called zIdxNam
2ea0: 65 20 77 68 69 63 68 20 69 73 20 66 6f 75 6e 64  e which is found
2eb0: 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
2ec0: 20 69 44 62 2c 0a 2a 2a 20 75 6e 6c 69 6b 65 20   iDb,.** unlike 
2ed0: 74 68 61 74 20 69 6e 64 65 78 20 66 72 6f 6d 20  that index from 
2ee0: 69 74 73 20 54 61 62 6c 65 20 74 68 65 6e 20 72  its Table then r
2ef0: 65 6d 6f 76 65 20 74 68 65 20 69 6e 64 65 78 20  emove the index 
2f00: 66 72 6f 6d 0a 2a 2a 20 74 68 65 20 69 6e 64 65  from.** the inde
2f10: 78 20 68 61 73 68 20 74 61 62 6c 65 20 61 6e 64  x hash table and
2f20: 20 66 72 65 65 20 61 6c 6c 20 6d 65 6d 6f 72 79   free all memory
2f30: 20 73 74 72 75 63 74 75 72 65 73 20 61 73 73 6f   structures asso
2f40: 63 69 61 74 65 64 0a 2a 2a 20 77 69 74 68 20 74  ciated.** with t
2f50: 68 65 20 69 6e 64 65 78 2e 0a 2a 2f 0a 76 6f 69  he index..*/.voi
2f60: 64 20 73 71 6c 69 74 65 33 55 6e 6c 69 6e 6b 41  d sqlite3UnlinkA
2f70: 6e 64 44 65 6c 65 74 65 49 6e 64 65 78 28 73 71  ndDeleteIndex(sq
2f80: 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 69  lite3 *db, int i
2f90: 44 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  Db, const char *
2fa0: 7a 49 64 78 4e 61 6d 65 29 7b 0a 20 20 49 6e 64  zIdxName){.  Ind
2fb0: 65 78 20 2a 70 49 6e 64 65 78 3b 0a 20 20 69 6e  ex *pIndex;.  in
2fc0: 74 20 6c 65 6e 3b 0a 20 20 48 61 73 68 20 2a 70  t len;.  Hash *p
2fd0: 48 61 73 68 20 3d 20 26 64 62 2d 3e 61 44 62 5b  Hash = &db->aDb[
2fe0: 69 44 62 5d 2e 70 53 63 68 65 6d 61 2d 3e 69 64  iDb].pSchema->id
2ff0: 78 48 61 73 68 3b 0a 0a 20 20 6c 65 6e 20 3d 20  xHash;..  len = 
3000: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 28 64 62  sqlite3Strlen(db
3010: 2c 20 7a 49 64 78 4e 61 6d 65 29 3b 0a 20 20 70  , zIdxName);.  p
3020: 49 6e 64 65 78 20 3d 20 73 71 6c 69 74 65 33 48  Index = sqlite3H
3030: 61 73 68 49 6e 73 65 72 74 28 70 48 61 73 68 2c  ashInsert(pHash,
3040: 20 7a 49 64 78 4e 61 6d 65 2c 20 6c 65 6e 2b 31   zIdxName, len+1
3050: 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 49 6e 64  , 0);.  if( pInd
3060: 65 78 20 29 7b 0a 20 20 20 20 69 66 28 20 70 49  ex ){.    if( pI
3070: 6e 64 65 78 2d 3e 70 54 61 62 6c 65 2d 3e 70 49  ndex->pTable->pI
3080: 6e 64 65 78 3d 3d 70 49 6e 64 65 78 20 29 7b 0a  ndex==pIndex ){.
3090: 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 70 54        pIndex->pT
30a0: 61 62 6c 65 2d 3e 70 49 6e 64 65 78 20 3d 20 70  able->pIndex = p
30b0: 49 6e 64 65 78 2d 3e 70 4e 65 78 74 3b 0a 20 20  Index->pNext;.  
30c0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 49    }else{.      I
30d0: 6e 64 65 78 20 2a 70 3b 0a 20 20 20 20 20 20 66  ndex *p;.      f
30e0: 6f 72 28 70 3d 70 49 6e 64 65 78 2d 3e 70 54 61  or(p=pIndex->pTa
30f0: 62 6c 65 2d 3e 70 49 6e 64 65 78 3b 20 70 20 26  ble->pIndex; p &
3100: 26 20 70 2d 3e 70 4e 65 78 74 21 3d 70 49 6e 64  & p->pNext!=pInd
3110: 65 78 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b  ex; p=p->pNext){
3120: 7d 0a 20 20 20 20 20 20 69 66 28 20 70 20 26 26  }.      if( p &&
3130: 20 70 2d 3e 70 4e 65 78 74 3d 3d 70 49 6e 64 65   p->pNext==pInde
3140: 78 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e  x ){.        p->
3150: 70 4e 65 78 74 20 3d 20 70 49 6e 64 65 78 2d 3e  pNext = pIndex->
3160: 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20  pNext;.      }. 
3170: 20 20 20 7d 0a 20 20 20 20 66 72 65 65 49 6e 64     }.    freeInd
3180: 65 78 28 70 49 6e 64 65 78 29 3b 0a 20 20 7d 0a  ex(pIndex);.  }.
3190: 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53    db->flags |= S
31a0: 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e  QLITE_InternChan
31b0: 67 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 72  ges;.}../*.** Er
31c0: 61 73 65 20 61 6c 6c 20 73 63 68 65 6d 61 20 69  ase all schema i
31d0: 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20  nformation from 
31e0: 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 68 61  the in-memory ha
31f0: 73 68 20 74 61 62 6c 65 73 20 6f 66 0a 2a 2a 20  sh tables of.** 
3200: 61 20 73 69 6e 67 6c 65 20 64 61 74 61 62 61 73  a single databas
3210: 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  e.  This routine
3220: 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 72 65   is called to re
3230: 63 6c 61 69 6d 20 6d 65 6d 6f 72 79 0a 2a 2a 20  claim memory.** 
3240: 62 65 66 6f 72 65 20 74 68 65 20 64 61 74 61 62  before the datab
3250: 61 73 65 20 63 6c 6f 73 65 73 2e 20 20 49 74 20  ase closes.  It 
3260: 69 73 20 61 6c 73 6f 20 63 61 6c 6c 65 64 20 64  is also called d
3270: 75 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b  uring a rollback
3280: 0a 2a 2a 20 69 66 20 74 68 65 72 65 20 77 65 72  .** if there wer
3290: 65 20 73 63 68 65 6d 61 20 63 68 61 6e 67 65 73  e schema changes
32a0: 20 64 75 72 69 6e 67 20 74 68 65 20 74 72 61 6e   during the tran
32b0: 73 61 63 74 69 6f 6e 20 6f 72 20 69 66 20 61 0a  saction or if a.
32c0: 2a 2a 20 73 63 68 65 6d 61 2d 63 6f 6f 6b 69 65  ** schema-cookie
32d0: 20 6d 69 73 6d 61 74 63 68 20 6f 63 63 75 72 73   mismatch occurs
32e0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 69 44 62 3c 3d  ..**.** If iDb<=
32f0: 30 20 74 68 65 6e 20 72 65 73 65 74 20 74 68 65  0 then reset the
3300: 20 69 6e 74 65 72 6e 61 6c 20 73 63 68 65 6d 61   internal schema
3310: 20 74 61 62 6c 65 73 20 66 6f 72 20 61 6c 6c 20   tables for all 
3320: 64 61 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65  database.** file
3330: 73 2e 20 20 49 66 20 69 44 62 3e 3d 32 20 74 68  s.  If iDb>=2 th
3340: 65 6e 20 72 65 73 65 74 20 74 68 65 20 69 6e 74  en reset the int
3350: 65 72 6e 61 6c 20 73 63 68 65 6d 61 20 66 6f 72  ernal schema for
3360: 20 6f 6e 6c 79 20 74 68 65 0a 2a 2a 20 73 69 6e   only the.** sin
3370: 67 6c 65 20 66 69 6c 65 20 69 6e 64 69 63 61 74  gle file indicat
3380: 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ed..*/.void sqli
3390: 74 65 33 52 65 73 65 74 49 6e 74 65 72 6e 61 6c  te3ResetInternal
33a0: 53 63 68 65 6d 61 28 73 71 6c 69 74 65 33 20 2a  Schema(sqlite3 *
33b0: 64 62 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20 20  db, int iDb){.  
33c0: 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 61 73 73 65  int i, j;.  asse
33d0: 72 74 28 20 69 44 62 3e 3d 30 20 26 26 20 69 44  rt( iDb>=0 && iD
33e0: 62 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 0a 20 20  b<db->nDb );..  
33f0: 69 66 28 20 69 44 62 3d 3d 30 20 29 7b 0a 20 20  if( iDb==0 ){.  
3400: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
3410: 74 65 72 41 6c 6c 28 64 62 29 3b 0a 20 20 7d 0a  terAll(db);.  }.
3420: 20 20 66 6f 72 28 69 3d 69 44 62 3b 20 69 3c 64    for(i=iDb; i<d
3430: 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20  b->nDb; i++){.  
3440: 20 20 44 62 20 2a 70 44 62 20 3d 20 26 64 62 2d    Db *pDb = &db-
3450: 3e 61 44 62 5b 69 5d 3b 0a 20 20 20 20 69 66 28  >aDb[i];.    if(
3460: 20 70 44 62 2d 3e 70 53 63 68 65 6d 61 20 29 7b   pDb->pSchema ){
3470: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 69 3d  .      assert(i=
3480: 3d 31 20 7c 7c 20 28 70 44 62 2d 3e 70 42 74 20  =1 || (pDb->pBt 
3490: 26 26 20 73 71 6c 69 74 65 33 42 74 72 65 65 48  && sqlite3BtreeH
34a0: 6f 6c 64 73 4d 75 74 65 78 28 70 44 62 2d 3e 70  oldsMutex(pDb->p
34b0: 42 74 29 29 29 3b 0a 20 20 20 20 20 20 73 71 6c  Bt)));.      sql
34c0: 69 74 65 33 53 63 68 65 6d 61 46 72 65 65 28 70  ite3SchemaFree(p
34d0: 44 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20  Db->pSchema);.  
34e0: 20 20 7d 0a 20 20 20 20 69 66 28 20 69 44 62 3e    }.    if( iDb>
34f0: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a  0 ) return;.  }.
3500: 20 20 61 73 73 65 72 74 28 20 69 44 62 3d 3d 30    assert( iDb==0
3510: 20 29 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20   );.  db->flags 
3520: 26 3d 20 7e 53 51 4c 49 54 45 5f 49 6e 74 65 72  &= ~SQLITE_Inter
3530: 6e 43 68 61 6e 67 65 73 3b 0a 20 20 73 71 6c 69  nChanges;.  sqli
3540: 74 65 33 42 74 72 65 65 4c 65 61 76 65 41 6c 6c  te3BtreeLeaveAll
3550: 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 6f  (db);..  /* If o
3560: 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 66 20 74 68  ne or more of th
3570: 65 20 61 75 78 69 6c 69 61 72 79 20 64 61 74 61  e auxiliary data
3580: 62 61 73 65 20 66 69 6c 65 73 20 68 61 73 20 62  base files has b
3590: 65 65 6e 20 63 6c 6f 73 65 64 2c 0a 20 20 2a 2a  een closed,.  **
35a0: 20 74 68 65 6e 20 72 65 6d 6f 76 65 20 74 68 65   then remove the
35b0: 6d 20 66 72 6f 6d 20 74 68 65 20 61 75 78 69 6c  m from the auxil
35c0: 69 61 72 79 20 64 61 74 61 62 61 73 65 20 6c 69  iary database li
35d0: 73 74 2e 20 20 57 65 20 74 61 6b 65 20 74 68 65  st.  We take the
35e0: 0a 20 20 2a 2a 20 6f 70 70 6f 72 74 75 6e 69 74  .  ** opportunit
35f0: 79 20 74 6f 20 64 6f 20 74 68 69 73 20 68 65 72  y to do this her
3600: 65 20 73 69 6e 63 65 20 77 65 20 68 61 76 65 20  e since we have 
3610: 6a 75 73 74 20 64 65 6c 65 74 65 64 20 61 6c 6c  just deleted all
3620: 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 73 63 68   of the.  ** sch
3630: 65 6d 61 20 68 61 73 68 20 74 61 62 6c 65 73 20  ema hash tables 
3640: 61 6e 64 20 74 68 65 72 65 66 6f 72 65 20 64 6f  and therefore do
3650: 20 6e 6f 74 20 68 61 76 65 20 74 6f 20 6d 61 6b   not have to mak
3660: 65 20 61 6e 79 20 63 68 61 6e 67 65 73 0a 20 20  e any changes.  
3670: 2a 2a 20 74 6f 20 61 6e 79 20 6f 66 20 74 68 6f  ** to any of tho
3680: 73 65 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2f 0a  se tables..  */.
3690: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d    for(i=0; i<db-
36a0: 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nDb; i++){.    
36b0: 73 74 72 75 63 74 20 44 62 20 2a 70 44 62 20 3d  struct Db *pDb =
36c0: 20 26 64 62 2d 3e 61 44 62 5b 69 5d 3b 0a 20 20   &db->aDb[i];.  
36d0: 20 20 69 66 28 20 70 44 62 2d 3e 70 42 74 3d 3d    if( pDb->pBt==
36e0: 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  0 ){.      if( p
36f0: 44 62 2d 3e 70 41 75 78 20 26 26 20 70 44 62 2d  Db->pAux && pDb-
3700: 3e 78 46 72 65 65 41 75 78 20 29 20 70 44 62 2d  >xFreeAux ) pDb-
3710: 3e 78 46 72 65 65 41 75 78 28 70 44 62 2d 3e 70  >xFreeAux(pDb->p
3720: 41 75 78 29 3b 0a 20 20 20 20 20 20 70 44 62 2d  Aux);.      pDb-
3730: 3e 70 41 75 78 20 3d 20 30 3b 0a 20 20 20 20 7d  >pAux = 0;.    }
3740: 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 6a 3d 32  .  }.  for(i=j=2
3750: 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b  ; i<db->nDb; i++
3760: 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 44 62  ){.    struct Db
3770: 20 2a 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62   *pDb = &db->aDb
3780: 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 70 44 62  [i];.    if( pDb
3790: 2d 3e 70 42 74 3d 3d 30 20 29 7b 0a 20 20 20 20  ->pBt==0 ){.    
37a0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
37b0: 44 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  Db->zName);.    
37c0: 20 20 70 44 62 2d 3e 7a 4e 61 6d 65 20 3d 20 30    pDb->zName = 0
37d0: 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65  ;.      continue
37e0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
37f0: 6a 3c 69 20 29 7b 0a 20 20 20 20 20 20 64 62 2d  j<i ){.      db-
3800: 3e 61 44 62 5b 6a 5d 20 3d 20 64 62 2d 3e 61 44  >aDb[j] = db->aD
3810: 62 5b 69 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20  b[i];.    }.    
3820: 6a 2b 2b 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65  j++;.  }.  memse
3830: 74 28 26 64 62 2d 3e 61 44 62 5b 6a 5d 2c 20 30  t(&db->aDb[j], 0
3840: 2c 20 28 64 62 2d 3e 6e 44 62 2d 6a 29 2a 73 69  , (db->nDb-j)*si
3850: 7a 65 6f 66 28 64 62 2d 3e 61 44 62 5b 6a 5d 29  zeof(db->aDb[j])
3860: 29 3b 0a 20 20 64 62 2d 3e 6e 44 62 20 3d 20 6a  );.  db->nDb = j
3870: 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6e 44 62 3c  ;.  if( db->nDb<
3880: 3d 32 20 26 26 20 64 62 2d 3e 61 44 62 21 3d 64  =2 && db->aDb!=d
3890: 62 2d 3e 61 44 62 53 74 61 74 69 63 20 29 7b 0a  b->aDbStatic ){.
38a0: 20 20 20 20 6d 65 6d 63 70 79 28 64 62 2d 3e 61      memcpy(db->a
38b0: 44 62 53 74 61 74 69 63 2c 20 64 62 2d 3e 61 44  DbStatic, db->aD
38c0: 62 2c 20 32 2a 73 69 7a 65 6f 66 28 64 62 2d 3e  b, 2*sizeof(db->
38d0: 61 44 62 5b 30 5d 29 29 3b 0a 20 20 20 20 73 71  aDb[0]));.    sq
38e0: 6c 69 74 65 33 5f 66 72 65 65 28 64 62 2d 3e 61  lite3_free(db->a
38f0: 44 62 29 3b 0a 20 20 20 20 64 62 2d 3e 61 44 62  Db);.    db->aDb
3900: 20 3d 20 64 62 2d 3e 61 44 62 53 74 61 74 69 63   = db->aDbStatic
3910: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ;.  }.}../*.** T
3920: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
3930: 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 63 6f 6d  alled when a com
3940: 6d 69 74 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 76  mit occurs..*/.v
3950: 6f 69 64 20 73 71 6c 69 74 65 33 43 6f 6d 6d 69  oid sqlite3Commi
3960: 74 49 6e 74 65 72 6e 61 6c 43 68 61 6e 67 65 73  tInternalChanges
3970: 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20  (sqlite3 *db){. 
3980: 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53   db->flags &= ~S
3990: 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e  QLITE_InternChan
39a0: 67 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c  ges;.}../*.** Cl
39b0: 65 61 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e  ear the column n
39c0: 61 6d 65 73 20 66 72 6f 6d 20 61 20 74 61 62 6c  ames from a tabl
39d0: 65 20 6f 72 20 76 69 65 77 2e 0a 2a 2f 0a 73 74  e or view..*/.st
39e0: 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65  atic void sqlite
39f0: 52 65 73 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73  ResetColumnNames
3a00: 28 54 61 62 6c 65 20 2a 70 54 61 62 6c 65 29 7b  (Table *pTable){
3a10: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 43 6f 6c 75  .  int i;.  Colu
3a20: 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 61 73 73 65  mn *pCol;.  asse
3a30: 72 74 28 20 70 54 61 62 6c 65 21 3d 30 20 29 3b  rt( pTable!=0 );
3a40: 0a 20 20 69 66 28 20 28 70 43 6f 6c 20 3d 20 70  .  if( (pCol = p
3a50: 54 61 62 6c 65 2d 3e 61 43 6f 6c 29 21 3d 30 20  Table->aCol)!=0 
3a60: 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  ){.    for(i=0; 
3a70: 69 3c 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3b 20  i<pTable->nCol; 
3a80: 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20  i++, pCol++){.  
3a90: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
3aa0: 28 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  (pCol->zName);. 
3ab0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
3ac0: 44 65 6c 65 74 65 28 70 43 6f 6c 2d 3e 70 44 66  Delete(pCol->pDf
3ad0: 6c 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  lt);.      sqlit
3ae0: 65 33 5f 66 72 65 65 28 70 43 6f 6c 2d 3e 7a 54  e3_free(pCol->zT
3af0: 79 70 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ype);.      sqli
3b00: 74 65 33 5f 66 72 65 65 28 70 43 6f 6c 2d 3e 7a  te3_free(pCol->z
3b10: 43 6f 6c 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Coll);.    }.   
3b20: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 54   sqlite3_free(pT
3b30: 61 62 6c 65 2d 3e 61 43 6f 6c 29 3b 0a 20 20 7d  able->aCol);.  }
3b40: 0a 20 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 20  .  pTable->aCol 
3b50: 3d 20 30 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 6e  = 0;.  pTable->n
3b60: 43 6f 6c 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  Col = 0;.}../*.*
3b70: 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 6d 65 6d  * Remove the mem
3b80: 6f 72 79 20 64 61 74 61 20 73 74 72 75 63 74 75  ory data structu
3b90: 72 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  res associated w
3ba0: 69 74 68 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a  ith the given.**
3bb0: 20 54 61 62 6c 65 2e 20 20 4e 6f 20 63 68 61 6e   Table.  No chan
3bc0: 67 65 73 20 61 72 65 20 6d 61 64 65 20 74 6f 20  ges are made to 
3bd0: 64 69 73 6b 20 62 79 20 74 68 69 73 20 72 6f 75  disk by this rou
3be0: 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  tine..**.** This
3bf0: 20 72 6f 75 74 69 6e 65 20 6a 75 73 74 20 64 65   routine just de
3c00: 6c 65 74 65 73 20 74 68 65 20 64 61 74 61 20 73  letes the data s
3c10: 74 72 75 63 74 75 72 65 2e 20 20 49 74 20 64 6f  tructure.  It do
3c20: 65 73 20 6e 6f 74 20 75 6e 6c 69 6e 6b 0a 2a 2a  es not unlink.**
3c30: 20 74 68 65 20 74 61 62 6c 65 20 64 61 74 61 20   the table data 
3c40: 73 74 72 75 63 74 75 72 65 20 66 72 6f 6d 20 74  structure from t
3c50: 68 65 20 68 61 73 68 20 74 61 62 6c 65 2e 20 20  he hash table.  
3c60: 4e 6f 72 20 64 6f 65 73 20 69 74 20 72 65 6d 6f  Nor does it remo
3c70: 76 65 0a 2a 2a 20 66 6f 72 65 69 67 6e 20 6b 65  ve.** foreign ke
3c80: 79 73 20 66 72 6f 6d 20 74 68 65 20 73 71 6c 69  ys from the sqli
3c90: 74 65 2e 61 46 4b 65 79 20 68 61 73 68 20 74 61  te.aFKey hash ta
3ca0: 62 6c 65 2e 20 20 42 75 74 20 69 74 20 64 6f 65  ble.  But it doe
3cb0: 73 20 64 65 73 74 72 6f 79 0a 2a 2a 20 6d 65 6d  s destroy.** mem
3cc0: 6f 72 79 20 73 74 72 75 63 74 75 72 65 73 20 6f  ory structures o
3cd0: 66 20 74 68 65 20 69 6e 64 69 63 65 73 20 61 6e  f the indices an
3ce0: 64 20 66 6f 72 65 69 67 6e 20 6b 65 79 73 20 61  d foreign keys a
3cf0: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 0a  ssociated with .
3d00: 2a 2a 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2f  ** the table..*/
3d10: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 44 65 6c  .void sqlite3Del
3d20: 65 74 65 54 61 62 6c 65 28 54 61 62 6c 65 20 2a  eteTable(Table *
3d30: 70 54 61 62 6c 65 29 7b 0a 20 20 49 6e 64 65 78  pTable){.  Index
3d40: 20 2a 70 49 6e 64 65 78 2c 20 2a 70 4e 65 78 74   *pIndex, *pNext
3d50: 3b 0a 20 20 46 4b 65 79 20 2a 70 46 4b 65 79 2c  ;.  FKey *pFKey,
3d60: 20 2a 70 4e 65 78 74 46 4b 65 79 3b 0a 0a 20 20   *pNextFKey;..  
3d70: 69 66 28 20 70 54 61 62 6c 65 3d 3d 30 20 29 20  if( pTable==0 ) 
3d80: 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 44 6f  return;..  /* Do
3d90: 20 6e 6f 74 20 64 65 6c 65 74 65 20 74 68 65 20   not delete the 
3da0: 74 61 62 6c 65 20 75 6e 74 69 6c 20 74 68 65 20  table until the 
3db0: 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20  reference count 
3dc0: 72 65 61 63 68 65 73 20 7a 65 72 6f 2e 20 2a 2f  reaches zero. */
3dd0: 0a 20 20 70 54 61 62 6c 65 2d 3e 6e 52 65 66 2d  .  pTable->nRef-
3de0: 2d 3b 0a 20 20 69 66 28 20 70 54 61 62 6c 65 2d  -;.  if( pTable-
3df0: 3e 6e 52 65 66 3e 30 20 29 7b 0a 20 20 20 20 72  >nRef>0 ){.    r
3e00: 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 61 73 73  eturn;.  }.  ass
3e10: 65 72 74 28 20 70 54 61 62 6c 65 2d 3e 6e 52 65  ert( pTable->nRe
3e20: 66 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 44 65  f==0 );..  /* De
3e30: 6c 65 74 65 20 61 6c 6c 20 69 6e 64 69 63 65 73  lete all indices
3e40: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
3e50: 20 74 68 69 73 20 74 61 62 6c 65 0a 20 20 2a 2f   this table.  */
3e60: 0a 20 20 66 6f 72 28 70 49 6e 64 65 78 20 3d 20  .  for(pIndex = 
3e70: 70 54 61 62 6c 65 2d 3e 70 49 6e 64 65 78 3b 20  pTable->pIndex; 
3e80: 70 49 6e 64 65 78 3b 20 70 49 6e 64 65 78 3d 70  pIndex; pIndex=p
3e90: 4e 65 78 74 29 7b 0a 20 20 20 20 70 4e 65 78 74  Next){.    pNext
3ea0: 20 3d 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74   = pIndex->pNext
3eb0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49  ;.    assert( pI
3ec0: 6e 64 65 78 2d 3e 70 53 63 68 65 6d 61 3d 3d 70  ndex->pSchema==p
3ed0: 54 61 62 6c 65 2d 3e 70 53 63 68 65 6d 61 20 29  Table->pSchema )
3ee0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 44 65 6c 65  ;.    sqliteDele
3ef0: 74 65 49 6e 64 65 78 28 70 49 6e 64 65 78 29 3b  teIndex(pIndex);
3f00: 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  .  }..#ifndef SQ
3f10: 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47  LITE_OMIT_FOREIG
3f20: 4e 5f 4b 45 59 0a 20 20 2f 2a 20 44 65 6c 65 74  N_KEY.  /* Delet
3f30: 65 20 61 6c 6c 20 66 6f 72 65 69 67 6e 20 6b 65  e all foreign ke
3f40: 79 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ys associated wi
3f50: 74 68 20 74 68 69 73 20 74 61 62 6c 65 2e 20 20  th this table.  
3f60: 54 68 65 20 6b 65 79 73 0a 20 20 2a 2a 20 73 68  The keys.  ** sh
3f70: 6f 75 6c 64 20 68 61 76 65 20 61 6c 72 65 61 64  ould have alread
3f80: 79 20 62 65 65 6e 20 75 6e 6c 69 6e 6b 65 64 20  y been unlinked 
3f90: 66 72 6f 6d 20 74 68 65 20 70 53 63 68 65 6d 61  from the pSchema
3fa0: 2d 3e 61 46 4b 65 79 20 68 61 73 68 20 74 61 62  ->aFKey hash tab
3fb0: 6c 65 20 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 70  le .  */.  for(p
3fc0: 46 4b 65 79 3d 70 54 61 62 6c 65 2d 3e 70 46 4b  FKey=pTable->pFK
3fd0: 65 79 3b 20 70 46 4b 65 79 3b 20 70 46 4b 65 79  ey; pFKey; pFKey
3fe0: 3d 70 4e 65 78 74 46 4b 65 79 29 7b 0a 20 20 20  =pNextFKey){.   
3ff0: 20 70 4e 65 78 74 46 4b 65 79 20 3d 20 70 46 4b   pNextFKey = pFK
4000: 65 79 2d 3e 70 4e 65 78 74 46 72 6f 6d 3b 0a 20  ey->pNextFrom;. 
4010: 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
4020: 65 33 48 61 73 68 46 69 6e 64 28 26 70 54 61 62  e3HashFind(&pTab
4030: 6c 65 2d 3e 70 53 63 68 65 6d 61 2d 3e 61 46 4b  le->pSchema->aFK
4040: 65 79 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ey,.            
4050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
4060: 46 4b 65 79 2d 3e 7a 54 6f 2c 20 73 74 72 6c 65  FKey->zTo, strle
4070: 6e 28 70 46 4b 65 79 2d 3e 7a 54 6f 29 2b 31 29  n(pFKey->zTo)+1)
4080: 21 3d 70 46 4b 65 79 20 29 3b 0a 20 20 20 20 73  !=pFKey );.    s
4090: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 46 4b 65  qlite3_free(pFKe
40a0: 79 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  y);.  }.#endif..
40b0: 20 20 2f 2a 20 44 65 6c 65 74 65 20 74 68 65 20    /* Delete the 
40c0: 54 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20  Table structure 
40d0: 69 74 73 65 6c 66 2e 0a 20 20 2a 2f 0a 20 20 73  itself..  */.  s
40e0: 71 6c 69 74 65 52 65 73 65 74 43 6f 6c 75 6d 6e  qliteResetColumn
40f0: 4e 61 6d 65 73 28 70 54 61 62 6c 65 29 3b 0a 20  Names(pTable);. 
4100: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 54   sqlite3_free(pT
4110: 61 62 6c 65 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  able->zName);.  
4120: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 54 61  sqlite3_free(pTa
4130: 62 6c 65 2d 3e 7a 43 6f 6c 41 66 66 29 3b 0a 20  ble->zColAff);. 
4140: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
4150: 6c 65 74 65 28 70 54 61 62 6c 65 2d 3e 70 53 65  lete(pTable->pSe
4160: 6c 65 63 74 29 3b 0a 23 69 66 6e 64 65 66 20 53  lect);.#ifndef S
4170: 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 48 45 43 4b  QLITE_OMIT_CHECK
4180: 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65  .  sqlite3ExprDe
4190: 6c 65 74 65 28 70 54 61 62 6c 65 2d 3e 70 43 68  lete(pTable->pCh
41a0: 65 63 6b 29 3b 0a 23 65 6e 64 69 66 0a 20 20 73  eck);.#endif.  s
41b0: 71 6c 69 74 65 33 56 74 61 62 43 6c 65 61 72 28  qlite3VtabClear(
41c0: 70 54 61 62 6c 65 29 3b 0a 20 20 73 71 6c 69 74  pTable);.  sqlit
41d0: 65 33 5f 66 72 65 65 28 70 54 61 62 6c 65 29 3b  e3_free(pTable);
41e0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 69 6e 6b  .}../*.** Unlink
41f0: 20 74 68 65 20 67 69 76 65 6e 20 74 61 62 6c 65   the given table
4200: 20 66 72 6f 6d 20 74 68 65 20 68 61 73 68 20 74   from the hash t
4210: 61 62 6c 65 73 20 61 6e 64 20 74 68 65 20 64 65  ables and the de
4220: 6c 65 74 65 20 74 68 65 0a 2a 2a 20 74 61 62 6c  lete the.** tabl
4230: 65 20 73 74 72 75 63 74 75 72 65 20 77 69 74 68  e structure with
4240: 20 61 6c 6c 20 69 74 73 20 69 6e 64 69 63 65 73   all its indices
4250: 20 61 6e 64 20 66 6f 72 65 69 67 6e 20 6b 65 79   and foreign key
4260: 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  s..*/.void sqlit
4270: 65 33 55 6e 6c 69 6e 6b 41 6e 64 44 65 6c 65 74  e3UnlinkAndDelet
4280: 65 54 61 62 6c 65 28 73 71 6c 69 74 65 33 20 2a  eTable(sqlite3 *
4290: 64 62 2c 20 69 6e 74 20 69 44 62 2c 20 63 6f 6e  db, int iDb, con
42a0: 73 74 20 63 68 61 72 20 2a 7a 54 61 62 4e 61 6d  st char *zTabNam
42b0: 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a  e){.  Table *p;.
42c0: 20 20 46 4b 65 79 20 2a 70 46 31 2c 20 2a 70 46    FKey *pF1, *pF
42d0: 32 3b 0a 20 20 44 62 20 2a 70 44 62 3b 0a 0a 20  2;.  Db *pDb;.. 
42e0: 20 61 73 73 65 72 74 28 20 64 62 21 3d 30 20 29   assert( db!=0 )
42f0: 3b 0a 20 20 61 73 73 65 72 74 28 20 69 44 62 3e  ;.  assert( iDb>
4300: 3d 30 20 26 26 20 69 44 62 3c 64 62 2d 3e 6e 44  =0 && iDb<db->nD
4310: 62 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 7a  b );.  assert( z
4320: 54 61 62 4e 61 6d 65 20 26 26 20 7a 54 61 62 4e  TabName && zTabN
4330: 61 6d 65 5b 30 5d 20 29 3b 0a 20 20 70 44 62 20  ame[0] );.  pDb 
4340: 3d 20 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d 3b  = &db->aDb[iDb];
4350: 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 48 61  .  p = sqlite3Ha
4360: 73 68 49 6e 73 65 72 74 28 26 70 44 62 2d 3e 70  shInsert(&pDb->p
4370: 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68 2c  Schema->tblHash,
4380: 20 7a 54 61 62 4e 61 6d 65 2c 20 73 74 72 6c 65   zTabName, strle
4390: 6e 28 7a 54 61 62 4e 61 6d 65 29 2b 31 2c 30 29  n(zTabName)+1,0)
43a0: 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 23 69 66  ;.  if( p ){.#if
43b0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
43c0: 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 0a 20 20 20  _FOREIGN_KEY.   
43d0: 20 66 6f 72 28 70 46 31 3d 70 2d 3e 70 46 4b 65   for(pF1=p->pFKe
43e0: 79 3b 20 70 46 31 3b 20 70 46 31 3d 70 46 31 2d  y; pF1; pF1=pF1-
43f0: 3e 70 4e 65 78 74 46 72 6f 6d 29 7b 0a 20 20 20  >pNextFrom){.   
4400: 20 20 20 69 6e 74 20 6e 54 6f 20 3d 20 73 74 72     int nTo = str
4410: 6c 65 6e 28 70 46 31 2d 3e 7a 54 6f 29 20 2b 20  len(pF1->zTo) + 
4420: 31 3b 0a 20 20 20 20 20 20 70 46 32 20 3d 20 73  1;.      pF2 = s
4430: 71 6c 69 74 65 33 48 61 73 68 46 69 6e 64 28 26  qlite3HashFind(&
4440: 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 61 46  pDb->pSchema->aF
4450: 4b 65 79 2c 20 70 46 31 2d 3e 7a 54 6f 2c 20 6e  Key, pF1->zTo, n
4460: 54 6f 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  To);.      if( p
4470: 46 32 3d 3d 70 46 31 20 29 7b 0a 20 20 20 20 20  F2==pF1 ){.     
4480: 20 20 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e     sqlite3HashIn
4490: 73 65 72 74 28 26 70 44 62 2d 3e 70 53 63 68 65  sert(&pDb->pSche
44a0: 6d 61 2d 3e 61 46 4b 65 79 2c 20 70 46 31 2d 3e  ma->aFKey, pF1->
44b0: 7a 54 6f 2c 20 6e 54 6f 2c 20 70 46 31 2d 3e 70  zTo, nTo, pF1->p
44c0: 4e 65 78 74 54 6f 29 3b 0a 20 20 20 20 20 20 7d  NextTo);.      }
44d0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 77 68  else{.        wh
44e0: 69 6c 65 28 20 70 46 32 20 26 26 20 70 46 32 2d  ile( pF2 && pF2-
44f0: 3e 70 4e 65 78 74 54 6f 21 3d 70 46 31 20 29 7b  >pNextTo!=pF1 ){
4500: 20 70 46 32 3d 70 46 32 2d 3e 70 4e 65 78 74 54   pF2=pF2->pNextT
4510: 6f 3b 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28  o; }.        if(
4520: 20 70 46 32 20 29 7b 0a 20 20 20 20 20 20 20 20   pF2 ){.        
4530: 20 20 70 46 32 2d 3e 70 4e 65 78 74 54 6f 20 3d    pF2->pNextTo =
4540: 20 70 46 31 2d 3e 70 4e 65 78 74 54 6f 3b 0a 20   pF1->pNextTo;. 
4550: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
4560: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
4570: 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54    sqlite3DeleteT
4580: 61 62 6c 65 28 70 29 3b 0a 20 20 7d 0a 20 20 64  able(p);.  }.  d
4590: 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49  b->flags |= SQLI
45a0: 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73  TE_InternChanges
45b0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e  ;.}../*.** Given
45c0: 20 61 20 74 6f 6b 65 6e 2c 20 72 65 74 75 72 6e   a token, return
45d0: 20 61 20 73 74 72 69 6e 67 20 74 68 61 74 20 63   a string that c
45e0: 6f 6e 73 69 73 74 73 20 6f 66 20 74 68 65 20 74  onsists of the t
45f0: 65 78 74 20 6f 66 20 74 68 61 74 0a 2a 2a 20 74  ext of that.** t
4600: 6f 6b 65 6e 20 77 69 74 68 20 61 6e 79 20 71 75  oken with any qu
4610: 6f 74 61 74 69 6f 6e 73 20 72 65 6d 6f 76 65 64  otations removed
4620: 2e 20 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64  .  Space to hold
4630: 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 73 74   the returned st
4640: 72 69 6e 67 0a 2a 2a 20 69 73 20 6f 62 74 61 69  ring.** is obtai
4650: 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 4d  ned from sqliteM
4660: 61 6c 6c 6f 63 28 29 20 61 6e 64 20 6d 75 73 74  alloc() and must
4670: 20 62 65 20 66 72 65 65 64 20 62 79 20 74 68 65   be freed by the
4680: 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 66 75 6e 63   calling.** func
4690: 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 6f 6b 65  tion..**.** Toke
46a0: 6e 73 20 61 72 65 20 6f 66 74 65 6e 20 6a 75 73  ns are often jus
46b0: 74 20 70 6f 69 6e 74 65 72 73 20 69 6e 74 6f 20  t pointers into 
46c0: 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 53 51 4c  the original SQL
46d0: 20 74 65 78 74 20 61 6e 64 20 73 6f 0a 2a 2a 20   text and so.** 
46e0: 61 72 65 20 6e 6f 74 20 5c 30 30 30 20 74 65 72  are not \000 ter
46f0: 6d 69 6e 61 74 65 64 20 61 6e 64 20 61 72 65 20  minated and are 
4700: 6e 6f 74 20 70 65 72 73 69 73 74 65 6e 74 2e 20  not persistent. 
4710: 20 54 68 65 20 72 65 74 75 72 6e 65 64 20 73 74   The returned st
4720: 72 69 6e 67 0a 2a 2a 20 69 73 20 5c 30 30 30 20  ring.** is \000 
4730: 74 65 72 6d 69 6e 61 74 65 64 20 61 6e 64 20 69  terminated and i
4740: 73 20 70 65 72 73 69 73 74 65 6e 74 2e 0a 2a 2f  s persistent..*/
4750: 0a 63 68 61 72 20 2a 73 71 6c 69 74 65 33 4e 61  .char *sqlite3Na
4760: 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 73 71 6c 69  meFromToken(sqli
4770: 74 65 33 20 2a 64 62 2c 20 54 6f 6b 65 6e 20 2a  te3 *db, Token *
4780: 70 4e 61 6d 65 29 7b 0a 20 20 63 68 61 72 20 2a  pName){.  char *
4790: 7a 4e 61 6d 65 3b 0a 20 20 69 66 28 20 70 4e 61  zName;.  if( pNa
47a0: 6d 65 20 29 7b 0a 20 20 20 20 7a 4e 61 6d 65 20  me ){.    zName 
47b0: 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 4e 44  = sqlite3DbStrND
47c0: 75 70 28 64 62 2c 20 28 63 68 61 72 2a 29 70 4e  up(db, (char*)pN
47d0: 61 6d 65 2d 3e 7a 2c 20 70 4e 61 6d 65 2d 3e 6e  ame->z, pName->n
47e0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65  );.    sqlite3De
47f0: 71 75 6f 74 65 28 7a 4e 61 6d 65 29 3b 0a 20 20  quote(zName);.  
4800: 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 4e 61 6d 65  }else{.    zName
4810: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75   = 0;.  }.  retu
4820: 72 6e 20 7a 4e 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a  rn zName;.}../*.
4830: 2a 2a 20 4f 70 65 6e 20 74 68 65 20 73 71 6c 69  ** Open the sqli
4840: 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20  te_master table 
4850: 73 74 6f 72 65 64 20 69 6e 20 64 61 74 61 62 61  stored in databa
4860: 73 65 20 6e 75 6d 62 65 72 20 69 44 62 20 66 6f  se number iDb fo
4870: 72 0a 2a 2a 20 77 72 69 74 69 6e 67 2e 20 54 68  r.** writing. Th
4880: 65 20 74 61 62 6c 65 20 69 73 20 6f 70 65 6e 65  e table is opene
4890: 64 20 75 73 69 6e 67 20 63 75 72 73 6f 72 20 30  d using cursor 0
48a0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
48b0: 33 4f 70 65 6e 4d 61 73 74 65 72 54 61 62 6c 65  3OpenMasterTable
48c0: 28 50 61 72 73 65 20 2a 70 2c 20 69 6e 74 20 69  (Parse *p, int i
48d0: 44 62 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  Db){.  Vdbe *v =
48e0: 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
48f0: 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 54 61 62  p);.  sqlite3Tab
4900: 6c 65 4c 6f 63 6b 28 70 2c 20 69 44 62 2c 20 4d  leLock(p, iDb, M
4910: 41 53 54 45 52 5f 52 4f 4f 54 2c 20 31 2c 20 53  ASTER_ROOT, 1, S
4920: 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 44 62 29  CHEMA_TABLE(iDb)
4930: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
4940: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 65 74  AddOp2(v, OP_Set
4950: 4e 75 6d 43 6f 6c 75 6d 6e 73 2c 20 30 2c 20 35  NumColumns, 0, 5
4960: 29 3b 2f 2a 20 73 71 6c 69 74 65 5f 6d 61 73 74  );/* sqlite_mast
4970: 65 72 20 68 61 73 20 35 20 63 6f 6c 75 6d 6e 73  er has 5 columns
4980: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62   */.  sqlite3Vdb
4990: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4f 70  eAddOp3(v, OP_Op
49a0: 65 6e 57 72 69 74 65 2c 20 30 2c 20 4d 41 53 54  enWrite, 0, MAST
49b0: 45 52 5f 52 4f 4f 54 2c 20 69 44 62 29 3b 0a 7d  ER_ROOT, iDb);.}
49c0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 74 6f 6b 65  ../*.** The toke
49d0: 6e 20 2a 70 4e 61 6d 65 20 63 6f 6e 74 61 69 6e  n *pName contain
49e0: 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20  s the name of a 
49f0: 64 61 74 61 62 61 73 65 20 28 65 69 74 68 65 72  database (either
4a00: 20 22 6d 61 69 6e 22 20 6f 72 0a 2a 2a 20 22 74   "main" or.** "t
4a10: 65 6d 70 22 20 6f 72 20 74 68 65 20 6e 61 6d 65  emp" or the name
4a20: 20 6f 66 20 61 6e 20 61 74 74 61 63 68 65 64 20   of an attached 
4a30: 64 62 29 2e 20 54 68 69 73 20 72 6f 75 74 69 6e  db). This routin
4a40: 65 20 72 65 74 75 72 6e 73 20 74 68 65 0a 2a 2a  e returns the.**
4a50: 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20 6e 61   index of the na
4a60: 6d 65 64 20 64 61 74 61 62 61 73 65 20 69 6e 20  med database in 
4a70: 64 62 2d 3e 61 44 62 5b 5d 2c 20 6f 72 20 2d 31  db->aDb[], or -1
4a80: 20 69 66 20 74 68 65 20 6e 61 6d 65 64 20 64 62   if the named db
4a90: 20 0a 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 65 78   .** does not ex
4aa0: 69 73 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ist..*/.int sqli
4ab0: 74 65 33 46 69 6e 64 44 62 28 73 71 6c 69 74 65  te3FindDb(sqlite
4ac0: 33 20 2a 64 62 2c 20 54 6f 6b 65 6e 20 2a 70 4e  3 *db, Token *pN
4ad0: 61 6d 65 29 7b 0a 20 20 69 6e 74 20 69 20 3d 20  ame){.  int i = 
4ae0: 2d 31 3b 20 20 20 20 2f 2a 20 44 61 74 61 62 61  -1;    /* Databa
4af0: 73 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 69  se number */.  i
4b00: 6e 74 20 6e 3b 20 20 20 20 20 20 20 20 20 2f 2a  nt n;         /*
4b10: 20 4e 75 6d 62 65 72 20 6f 66 20 63 68 61 72 61   Number of chara
4b20: 63 74 65 72 73 20 69 6e 20 74 68 65 20 6e 61 6d  cters in the nam
4b30: 65 20 2a 2f 0a 20 20 44 62 20 2a 70 44 62 3b 20  e */.  Db *pDb; 
4b40: 20 20 20 20 20 20 2f 2a 20 41 20 64 61 74 61 62        /* A datab
4b50: 61 73 65 20 77 68 6f 73 65 20 6e 61 6d 65 20 73  ase whose name s
4b60: 70 61 63 65 20 69 73 20 62 65 69 6e 67 20 73 65  pace is being se
4b70: 61 72 63 68 65 64 20 2a 2f 0a 20 20 63 68 61 72  arched */.  char
4b80: 20 2a 7a 4e 61 6d 65 3b 20 20 20 2f 2a 20 4e 61   *zName;   /* Na
4b90: 6d 65 20 77 65 20 61 72 65 20 73 65 61 72 63 68  me we are search
4ba0: 69 6e 67 20 66 6f 72 20 2a 2f 0a 0a 20 20 7a 4e  ing for */..  zN
4bb0: 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d  ame = sqlite3Nam
4bc0: 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70  eFromToken(db, p
4bd0: 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a 4e 61  Name);.  if( zNa
4be0: 6d 65 20 29 7b 0a 20 20 20 20 6e 20 3d 20 73 74  me ){.    n = st
4bf0: 72 6c 65 6e 28 7a 4e 61 6d 65 29 3b 0a 20 20 20  rlen(zName);.   
4c00: 20 66 6f 72 28 69 3d 28 64 62 2d 3e 6e 44 62 2d   for(i=(db->nDb-
4c10: 31 29 2c 20 70 44 62 3d 26 64 62 2d 3e 61 44 62  1), pDb=&db->aDb
4c20: 5b 69 5d 3b 20 69 3e 3d 30 3b 20 69 2d 2d 2c 20  [i]; i>=0; i--, 
4c30: 70 44 62 2d 2d 29 7b 0a 20 20 20 20 20 20 69 66  pDb--){.      if
4c40: 28 20 28 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20  ( (!OMIT_TEMPDB 
4c50: 7c 7c 20 69 21 3d 31 20 29 20 26 26 20 6e 3d 3d  || i!=1 ) && n==
4c60: 73 74 72 6c 65 6e 28 70 44 62 2d 3e 7a 4e 61 6d  strlen(pDb->zNam
4c70: 65 29 20 26 26 20 0a 20 20 20 20 20 20 20 20 20  e) && .         
4c80: 20 30 3d 3d 73 71 6c 69 74 65 33 53 74 72 49 43   0==sqlite3StrIC
4c90: 6d 70 28 70 44 62 2d 3e 7a 4e 61 6d 65 2c 20 7a  mp(pDb->zName, z
4ca0: 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 20 20 20  Name) ){.       
4cb0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
4cc0: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
4cd0: 33 5f 66 72 65 65 28 7a 4e 61 6d 65 29 3b 0a 20  3_free(zName);. 
4ce0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d   }.  return i;.}
4cf0: 0a 0a 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 6f  ../* The table o
4d00: 72 20 76 69 65 77 20 6f 72 20 74 72 69 67 67 65  r view or trigge
4d10: 72 20 6e 61 6d 65 20 69 73 20 70 61 73 73 65 64  r name is passed
4d20: 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65   to this routine
4d30: 20 76 69 61 20 74 6f 6b 65 6e 73 0a 2a 2a 20 70   via tokens.** p
4d40: 4e 61 6d 65 31 20 61 6e 64 20 70 4e 61 6d 65 32  Name1 and pName2
4d50: 2e 20 49 66 20 74 68 65 20 74 61 62 6c 65 20 6e  . If the table n
4d60: 61 6d 65 20 77 61 73 20 66 75 6c 6c 79 20 71 75  ame was fully qu
4d70: 61 6c 69 66 69 65 64 2c 20 66 6f 72 20 65 78 61  alified, for exa
4d80: 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 43 52 45 41  mple:.**.** CREA
4d90: 54 45 20 54 41 42 4c 45 20 78 78 78 2e 79 79 79  TE TABLE xxx.yyy
4da0: 20 28 2e 2e 2e 29 3b 0a 2a 2a 20 0a 2a 2a 20 54   (...);.** .** T
4db0: 68 65 6e 20 70 4e 61 6d 65 31 20 69 73 20 73 65  hen pName1 is se
4dc0: 74 20 74 6f 20 22 78 78 78 22 20 61 6e 64 20 70  t to "xxx" and p
4dd0: 4e 61 6d 65 32 20 22 79 79 79 22 2e 20 4f 6e 20  Name2 "yyy". On 
4de0: 74 68 65 20 6f 74 68 65 72 20 68 61 6e 64 20 69  the other hand i
4df0: 66 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 6e  f.** the table n
4e00: 61 6d 65 20 69 73 20 6e 6f 74 20 66 75 6c 6c 79  ame is not fully
4e10: 20 71 75 61 6c 69 66 69 65 64 2c 20 69 2e 65 2e   qualified, i.e.
4e20: 3a 0a 2a 2a 0a 2a 2a 20 43 52 45 41 54 45 20 54  :.**.** CREATE T
4e30: 41 42 4c 45 20 79 79 79 28 2e 2e 2e 29 3b 0a 2a  ABLE yyy(...);.*
4e40: 2a 0a 2a 2a 20 54 68 65 6e 20 70 4e 61 6d 65 31  *.** Then pName1
4e50: 20 69 73 20 73 65 74 20 74 6f 20 22 79 79 79 22   is set to "yyy"
4e60: 20 61 6e 64 20 70 4e 61 6d 65 32 20 69 73 20 22   and pName2 is "
4e70: 22 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  "..**.** This ro
4e80: 75 74 69 6e 65 20 73 65 74 73 20 74 68 65 20 2a  utine sets the *
4e90: 70 70 55 6e 71 75 61 6c 20 70 6f 69 6e 74 65 72  ppUnqual pointer
4ea0: 20 74 6f 20 70 6f 69 6e 74 20 61 74 20 74 68 65   to point at the
4eb0: 20 74 6f 6b 65 6e 20 28 70 4e 61 6d 65 31 20 6f   token (pName1 o
4ec0: 72 0a 2a 2a 20 70 4e 61 6d 65 32 29 20 74 68 61  r.** pName2) tha
4ed0: 74 20 73 74 6f 72 65 73 20 74 68 65 20 75 6e 71  t stores the unq
4ee0: 75 61 6c 69 66 69 65 64 20 74 61 62 6c 65 20 6e  ualified table n
4ef0: 61 6d 65 2e 20 20 54 68 65 20 69 6e 64 65 78 20  ame.  The index 
4f00: 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61  of the.** databa
4f10: 73 65 20 22 78 78 78 22 20 69 73 20 72 65 74 75  se "xxx" is retu
4f20: 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  rned..*/.int sql
4f30: 69 74 65 33 54 77 6f 50 61 72 74 4e 61 6d 65 28  ite3TwoPartName(
4f40: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
4f50: 2c 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e  ,      /* Parsin
4f60: 67 20 61 6e 64 20 63 6f 64 65 20 67 65 6e 65 72  g and code gener
4f70: 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  ating context */
4f80: 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31  .  Token *pName1
4f90: 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 22 78  ,      /* The "x
4fa0: 78 78 22 20 69 6e 20 74 68 65 20 6e 61 6d 65 20  xx" in the name 
4fb0: 22 78 78 78 2e 79 79 79 22 20 6f 72 20 22 78 78  "xxx.yyy" or "xx
4fc0: 78 22 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  x" */.  Token *p
4fd0: 4e 61 6d 65 32 2c 20 20 20 20 20 20 2f 2a 20 54  Name2,      /* T
4fe0: 68 65 20 22 79 79 79 22 20 69 6e 20 74 68 65 20  he "yyy" in the 
4ff0: 6e 61 6d 65 20 22 78 78 78 2e 79 79 79 22 20 2a  name "xxx.yyy" *
5000: 2f 0a 20 20 54 6f 6b 65 6e 20 2a 2a 70 55 6e 71  /.  Token **pUnq
5010: 75 61 6c 20 20 20 20 20 2f 2a 20 57 72 69 74 65  ual     /* Write
5020: 20 74 68 65 20 75 6e 71 75 61 6c 69 66 69 65 64   the unqualified
5030: 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20 68 65 72   object name her
5040: 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 44  e */.){.  int iD
5050: 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
5060: 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
5070: 65 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 6f 62  e holding the ob
5080: 6a 65 63 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ject */.  sqlite
5090: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
50a0: 64 62 3b 0a 0a 20 20 69 66 28 20 70 4e 61 6d 65  db;..  if( pName
50b0: 32 20 26 26 20 70 4e 61 6d 65 32 2d 3e 6e 3e 30  2 && pName2->n>0
50c0: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
50d0: 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29  !db->init.busy )
50e0: 3b 0a 20 20 20 20 2a 70 55 6e 71 75 61 6c 20 3d  ;.    *pUnqual =
50f0: 20 70 4e 61 6d 65 32 3b 0a 20 20 20 20 69 44 62   pName2;.    iDb
5100: 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 44 62   = sqlite3FindDb
5110: 28 64 62 2c 20 70 4e 61 6d 65 31 29 3b 0a 20 20  (db, pName1);.  
5120: 20 20 69 66 28 20 69 44 62 3c 30 20 29 7b 0a 20    if( iDb<0 ){. 
5130: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
5140: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 75 6e  rMsg(pParse, "un
5150: 6b 6e 6f 77 6e 20 64 61 74 61 62 61 73 65 20 25  known database %
5160: 54 22 2c 20 70 4e 61 6d 65 31 29 3b 0a 20 20 20  T", pName1);.   
5170: 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b     pParse->nErr+
5180: 2b 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  +;.      return 
5190: 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  -1;.    }.  }els
51a0: 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 64  e{.    assert( d
51b0: 62 2d 3e 69 6e 69 74 2e 69 44 62 3d 3d 30 20 7c  b->init.iDb==0 |
51c0: 7c 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20  | db->init.busy 
51d0: 29 3b 0a 20 20 20 20 69 44 62 20 3d 20 64 62 2d  );.    iDb = db-
51e0: 3e 69 6e 69 74 2e 69 44 62 3b 0a 20 20 20 20 2a  >init.iDb;.    *
51f0: 70 55 6e 71 75 61 6c 20 3d 20 70 4e 61 6d 65 31  pUnqual = pName1
5200: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 69  ;.  }.  return i
5210: 44 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  Db;.}../*.** Thi
5220: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65  s routine is use
5230: 64 20 74 6f 20 63 68 65 63 6b 20 69 66 20 74 68  d to check if th
5240: 65 20 55 54 46 2d 38 20 73 74 72 69 6e 67 20 7a  e UTF-8 string z
5250: 4e 61 6d 65 20 69 73 20 61 20 6c 65 67 61 6c 0a  Name is a legal.
5260: 2a 2a 20 75 6e 71 75 61 6c 69 66 69 65 64 20 6e  ** unqualified n
5270: 61 6d 65 20 66 6f 72 20 61 20 6e 65 77 20 73 63  ame for a new sc
5280: 68 65 6d 61 20 6f 62 6a 65 63 74 20 28 74 61 62  hema object (tab
5290: 6c 65 2c 20 69 6e 64 65 78 2c 20 76 69 65 77 20  le, index, view 
52a0: 6f 72 0a 2a 2a 20 74 72 69 67 67 65 72 29 2e 20  or.** trigger). 
52b0: 41 6c 6c 20 6e 61 6d 65 73 20 61 72 65 20 6c 65  All names are le
52c0: 67 61 6c 20 65 78 63 65 70 74 20 74 68 6f 73 65  gal except those
52d0: 20 74 68 61 74 20 62 65 67 69 6e 20 77 69 74 68   that begin with
52e0: 20 74 68 65 20 73 74 72 69 6e 67 0a 2a 2a 20 22   the string.** "
52f0: 73 71 6c 69 74 65 5f 22 20 28 69 6e 20 75 70 70  sqlite_" (in upp
5300: 65 72 2c 20 6c 6f 77 65 72 20 6f 72 20 6d 69 78  er, lower or mix
5310: 65 64 20 63 61 73 65 29 2e 20 54 68 69 73 20 70  ed case). This p
5320: 6f 72 74 69 6f 6e 20 6f 66 20 74 68 65 20 6e 61  ortion of the na
5330: 6d 65 73 70 61 63 65 0a 2a 2a 20 69 73 20 72 65  mespace.** is re
5340: 73 65 72 76 65 64 20 66 6f 72 20 69 6e 74 65 72  served for inter
5350: 6e 61 6c 20 75 73 65 2e 0a 2a 2f 0a 69 6e 74 20  nal use..*/.int 
5360: 73 71 6c 69 74 65 33 43 68 65 63 6b 4f 62 6a 65  sqlite3CheckObje
5370: 63 74 4e 61 6d 65 28 50 61 72 73 65 20 2a 70 50  ctName(Parse *pP
5380: 61 72 73 65 2c 20 63 6f 6e 73 74 20 63 68 61 72  arse, const char
5390: 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69 66 28 20   *zName){.  if( 
53a0: 21 70 50 61 72 73 65 2d 3e 64 62 2d 3e 69 6e 69  !pParse->db->ini
53b0: 74 2e 62 75 73 79 20 26 26 20 70 50 61 72 73 65  t.busy && pParse
53c0: 2d 3e 6e 65 73 74 65 64 3d 3d 30 20 0a 20 20 20  ->nested==0 .   
53d0: 20 20 20 20 20 20 20 26 26 20 28 70 50 61 72 73         && (pPars
53e0: 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  e->db->flags & S
53f0: 51 4c 49 54 45 5f 57 72 69 74 65 53 63 68 65 6d  QLITE_WriteSchem
5400: 61 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20  a)==0.          
5410: 26 26 20 30 3d 3d 73 71 6c 69 74 65 33 53 74 72  && 0==sqlite3Str
5420: 4e 49 43 6d 70 28 7a 4e 61 6d 65 2c 20 22 73 71  NICmp(zName, "sq
5430: 6c 69 74 65 5f 22 2c 20 37 29 20 29 7b 0a 20 20  lite_", 7) ){.  
5440: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
5450: 67 28 70 50 61 72 73 65 2c 20 22 6f 62 6a 65 63  g(pParse, "objec
5460: 74 20 6e 61 6d 65 20 72 65 73 65 72 76 65 64 20  t name reserved 
5470: 66 6f 72 20 69 6e 74 65 72 6e 61 6c 20 75 73 65  for internal use
5480: 3a 20 25 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20  : %s", zName);. 
5490: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
54a0: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65  _ERROR;.  }.  re
54b0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
54c0: 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65 67 69 6e 20 63  }../*.** Begin c
54d0: 6f 6e 73 74 72 75 63 74 69 6e 67 20 61 20 6e 65  onstructing a ne
54e0: 77 20 74 61 62 6c 65 20 72 65 70 72 65 73 65 6e  w table represen
54f0: 74 61 74 69 6f 6e 20 69 6e 20 6d 65 6d 6f 72 79  tation in memory
5500: 2e 20 20 54 68 69 73 20 69 73 0a 2a 2a 20 74 68  .  This is.** th
5510: 65 20 66 69 72 73 74 20 6f 66 20 73 65 76 65 72  e first of sever
5520: 61 6c 20 61 63 74 69 6f 6e 20 72 6f 75 74 69 6e  al action routin
5530: 65 73 20 74 68 61 74 20 67 65 74 20 63 61 6c 6c  es that get call
5540: 65 64 20 69 6e 20 72 65 73 70 6f 6e 73 65 0a 2a  ed in response.*
5550: 2a 20 74 6f 20 61 20 43 52 45 41 54 45 20 54 41  * to a CREATE TA
5560: 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 20 20  BLE statement.  
5570: 49 6e 20 70 61 72 74 69 63 75 6c 61 72 2c 20 74  In particular, t
5580: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
5590: 61 6c 6c 65 64 0a 2a 2a 20 61 66 74 65 72 20 73  alled.** after s
55a0: 65 65 69 6e 67 20 74 6f 6b 65 6e 73 20 22 43 52  eeing tokens "CR
55b0: 45 41 54 45 22 20 61 6e 64 20 22 54 41 42 4c 45  EATE" and "TABLE
55c0: 22 20 61 6e 64 20 74 68 65 20 74 61 62 6c 65 20  " and the table 
55d0: 6e 61 6d 65 2e 20 54 68 65 20 69 73 54 65 6d 70  name. The isTemp
55e0: 0a 2a 2a 20 66 6c 61 67 20 69 73 20 74 72 75 65  .** flag is true
55f0: 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 73 68   if the table sh
5600: 6f 75 6c 64 20 62 65 20 73 74 6f 72 65 64 20 69  ould be stored i
5610: 6e 20 74 68 65 20 61 75 78 69 6c 69 61 72 79 20  n the auxiliary 
5620: 64 61 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65  database.** file
5630: 20 69 6e 73 74 65 61 64 20 6f 66 20 69 6e 20 74   instead of in t
5640: 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65  he main database
5650: 20 66 69 6c 65 2e 20 20 54 68 69 73 20 69 73 20   file.  This is 
5660: 6e 6f 72 6d 61 6c 6c 79 20 74 68 65 20 63 61 73  normally the cas
5670: 65 0a 2a 2a 20 77 68 65 6e 20 74 68 65 20 22 54  e.** when the "T
5680: 45 4d 50 22 20 6f 72 20 22 54 45 4d 50 4f 52 41  EMP" or "TEMPORA
5690: 52 59 22 20 6b 65 79 77 6f 72 64 20 6f 63 63 75  RY" keyword occu
56a0: 72 73 20 69 6e 20 62 65 74 77 65 65 6e 0a 2a 2a  rs in between.**
56b0: 20 43 52 45 41 54 45 20 61 6e 64 20 54 41 42 4c   CREATE and TABL
56c0: 45 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65 77  E..**.** The new
56d0: 20 74 61 62 6c 65 20 72 65 63 6f 72 64 20 69 73   table record is
56e0: 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 61 6e 64   initialized and
56f0: 20 70 75 74 20 69 6e 20 70 50 61 72 73 65 2d 3e   put in pParse->
5700: 70 4e 65 77 54 61 62 6c 65 2e 0a 2a 2a 20 41 73  pNewTable..** As
5710: 20 6d 6f 72 65 20 6f 66 20 74 68 65 20 43 52 45   more of the CRE
5720: 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d  ATE TABLE statem
5730: 65 6e 74 20 69 73 20 70 61 72 73 65 64 2c 20 61  ent is parsed, a
5740: 64 64 69 74 69 6f 6e 61 6c 20 61 63 74 69 6f 6e  dditional action
5750: 0a 2a 2a 20 72 6f 75 74 69 6e 65 73 20 77 69 6c  .** routines wil
5760: 6c 20 62 65 20 63 61 6c 6c 65 64 20 74 6f 20 61  l be called to a
5770: 64 64 20 6d 6f 72 65 20 69 6e 66 6f 72 6d 61 74  dd more informat
5780: 69 6f 6e 20 74 6f 20 74 68 69 73 20 72 65 63 6f  ion to this reco
5790: 72 64 2e 0a 2a 2a 20 41 74 20 74 68 65 20 65 6e  rd..** At the en
57a0: 64 20 6f 66 20 74 68 65 20 43 52 45 41 54 45 20  d of the CREATE 
57b0: 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2c  TABLE statement,
57c0: 20 74 68 65 20 73 71 6c 69 74 65 33 45 6e 64 54   the sqlite3EndT
57d0: 61 62 6c 65 28 29 20 72 6f 75 74 69 6e 65 0a 2a  able() routine.*
57e0: 2a 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 63  * is called to c
57f0: 6f 6d 70 6c 65 74 65 20 74 68 65 20 63 6f 6e 73  omplete the cons
5800: 74 72 75 63 74 69 6f 6e 20 6f 66 20 74 68 65 20  truction of the 
5810: 6e 65 77 20 74 61 62 6c 65 20 72 65 63 6f 72 64  new table record
5820: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
5830: 33 53 74 61 72 74 54 61 62 6c 65 28 0a 20 20 50  3StartTable(.  P
5840: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
5850: 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e 74 65 78  /* Parser contex
5860: 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e  t */.  Token *pN
5870: 61 6d 65 31 2c 20 20 20 2f 2a 20 46 69 72 73 74  ame1,   /* First
5880: 20 70 61 72 74 20 6f 66 20 74 68 65 20 6e 61 6d   part of the nam
5890: 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 6f  e of the table o
58a0: 72 20 76 69 65 77 20 2a 2f 0a 20 20 54 6f 6b 65  r view */.  Toke
58b0: 6e 20 2a 70 4e 61 6d 65 32 2c 20 20 20 2f 2a 20  n *pName2,   /* 
58c0: 53 65 63 6f 6e 64 20 70 61 72 74 20 6f 66 20 74  Second part of t
58d0: 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74  he name of the t
58e0: 61 62 6c 65 20 6f 72 20 76 69 65 77 20 2a 2f 0a  able or view */.
58f0: 20 20 69 6e 74 20 69 73 54 65 6d 70 2c 20 20 20    int isTemp,   
5900: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68     /* True if th
5910: 69 73 20 69 73 20 61 20 54 45 4d 50 20 74 61 62  is is a TEMP tab
5920: 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73 56 69  le */.  int isVi
5930: 65 77 2c 20 20 20 20 20 20 2f 2a 20 54 72 75 65  ew,      /* True
5940: 20 69 66 20 74 68 69 73 20 69 73 20 61 20 56 49   if this is a VI
5950: 45 57 20 2a 2f 0a 20 20 69 6e 74 20 69 73 56 69  EW */.  int isVi
5960: 72 74 75 61 6c 2c 20 20 20 2f 2a 20 54 72 75 65  rtual,   /* True
5970: 20 69 66 20 74 68 69 73 20 69 73 20 61 20 56 49   if this is a VI
5980: 52 54 55 41 4c 20 74 61 62 6c 65 20 2a 2f 0a 20  RTUAL table */. 
5990: 20 69 6e 74 20 6e 6f 45 72 72 20 20 20 20 20 20   int noErr      
59a0: 20 20 2f 2a 20 44 6f 20 6e 6f 74 68 69 6e 67 20    /* Do nothing 
59b0: 69 66 20 74 61 62 6c 65 20 61 6c 72 65 61 64 79  if table already
59c0: 20 65 78 69 73 74 73 20 2a 2f 0a 29 7b 0a 20 20   exists */.){.  
59d0: 54 61 62 6c 65 20 2a 70 54 61 62 6c 65 3b 0a 20  Table *pTable;. 
59e0: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 30   char *zName = 0
59f0: 3b 20 2f 2a 20 54 68 65 20 6e 61 6d 65 20 6f 66  ; /* The name of
5a00: 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20 2a   the new table *
5a10: 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  /.  sqlite3 *db 
5a20: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
5a30: 56 64 62 65 20 2a 76 3b 0a 20 20 69 6e 74 20 69  Vdbe *v;.  int i
5a40: 44 62 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 44  Db;         /* D
5a50: 61 74 61 62 61 73 65 20 6e 75 6d 62 65 72 20 74  atabase number t
5a60: 6f 20 63 72 65 61 74 65 20 74 68 65 20 74 61 62  o create the tab
5a70: 6c 65 20 69 6e 20 2a 2f 0a 20 20 54 6f 6b 65 6e  le in */.  Token
5a80: 20 2a 70 4e 61 6d 65 3b 20 20 20 20 2f 2a 20 55   *pName;    /* U
5a90: 6e 71 75 61 6c 69 66 69 65 64 20 6e 61 6d 65 20  nqualified name 
5aa0: 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20  of the table to 
5ab0: 63 72 65 61 74 65 20 2a 2f 0a 0a 20 20 2f 2a 20  create */..  /* 
5ac0: 54 68 65 20 74 61 62 6c 65 20 6f 72 20 76 69 65  The table or vie
5ad0: 77 20 6e 61 6d 65 20 74 6f 20 63 72 65 61 74 65  w name to create
5ae0: 20 69 73 20 70 61 73 73 65 64 20 74 6f 20 74 68   is passed to th
5af0: 69 73 20 72 6f 75 74 69 6e 65 20 76 69 61 20 74  is routine via t
5b00: 6f 6b 65 6e 73 0a 20 20 2a 2a 20 70 4e 61 6d 65  okens.  ** pName
5b10: 31 20 61 6e 64 20 70 4e 61 6d 65 32 2e 20 49 66  1 and pName2. If
5b20: 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20   the table name 
5b30: 77 61 73 20 66 75 6c 6c 79 20 71 75 61 6c 69 66  was fully qualif
5b40: 69 65 64 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65  ied, for example
5b50: 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43 52 45 41  :.  **.  ** CREA
5b60: 54 45 20 54 41 42 4c 45 20 78 78 78 2e 79 79 79  TE TABLE xxx.yyy
5b70: 20 28 2e 2e 2e 29 3b 0a 20 20 2a 2a 20 0a 20 20   (...);.  ** .  
5b80: 2a 2a 20 54 68 65 6e 20 70 4e 61 6d 65 31 20 69  ** Then pName1 i
5b90: 73 20 73 65 74 20 74 6f 20 22 78 78 78 22 20 61  s set to "xxx" a
5ba0: 6e 64 20 70 4e 61 6d 65 32 20 22 79 79 79 22 2e  nd pName2 "yyy".
5bb0: 20 4f 6e 20 74 68 65 20 6f 74 68 65 72 20 68 61   On the other ha
5bc0: 6e 64 20 69 66 0a 20 20 2a 2a 20 74 68 65 20 74  nd if.  ** the t
5bd0: 61 62 6c 65 20 6e 61 6d 65 20 69 73 20 6e 6f 74  able name is not
5be0: 20 66 75 6c 6c 79 20 71 75 61 6c 69 66 69 65 64   fully qualified
5bf0: 2c 20 69 2e 65 2e 3a 0a 20 20 2a 2a 0a 20 20 2a  , i.e.:.  **.  *
5c00: 2a 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 79  * CREATE TABLE y
5c10: 79 79 28 2e 2e 2e 29 3b 0a 20 20 2a 2a 0a 20 20  yy(...);.  **.  
5c20: 2a 2a 20 54 68 65 6e 20 70 4e 61 6d 65 31 20 69  ** Then pName1 i
5c30: 73 20 73 65 74 20 74 6f 20 22 79 79 79 22 20 61  s set to "yyy" a
5c40: 6e 64 20 70 4e 61 6d 65 32 20 69 73 20 22 22 2e  nd pName2 is "".
5c50: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 63  .  **.  ** The c
5c60: 61 6c 6c 20 62 65 6c 6f 77 20 73 65 74 73 20 74  all below sets t
5c70: 68 65 20 70 4e 61 6d 65 20 70 6f 69 6e 74 65 72  he pName pointer
5c80: 20 74 6f 20 70 6f 69 6e 74 20 61 74 20 74 68 65   to point at the
5c90: 20 74 6f 6b 65 6e 20 28 70 4e 61 6d 65 31 20 6f   token (pName1 o
5ca0: 72 0a 20 20 2a 2a 20 70 4e 61 6d 65 32 29 20 74  r.  ** pName2) t
5cb0: 68 61 74 20 73 74 6f 72 65 73 20 74 68 65 20 75  hat stores the u
5cc0: 6e 71 75 61 6c 69 66 69 65 64 20 74 61 62 6c 65  nqualified table
5cd0: 20 6e 61 6d 65 2e 20 54 68 65 20 76 61 72 69 61   name. The varia
5ce0: 62 6c 65 20 69 44 62 20 69 73 0a 20 20 2a 2a 20  ble iDb is.  ** 
5cf0: 73 65 74 20 74 6f 20 74 68 65 20 69 6e 64 65 78  set to the index
5d00: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
5d10: 20 74 68 61 74 20 74 68 65 20 74 61 62 6c 65 20   that the table 
5d20: 6f 72 20 76 69 65 77 20 69 73 20 74 6f 20 62 65  or view is to be
5d30: 0a 20 20 2a 2a 20 63 72 65 61 74 65 64 20 69 6e  .  ** created in
5d40: 2e 0a 20 20 2a 2f 0a 20 20 69 44 62 20 3d 20 73  ..  */.  iDb = s
5d50: 71 6c 69 74 65 33 54 77 6f 50 61 72 74 4e 61 6d  qlite3TwoPartNam
5d60: 65 28 70 50 61 72 73 65 2c 20 70 4e 61 6d 65 31  e(pParse, pName1
5d70: 2c 20 70 4e 61 6d 65 32 2c 20 26 70 4e 61 6d 65  , pName2, &pName
5d80: 29 3b 0a 20 20 69 66 28 20 69 44 62 3c 30 20 29  );.  if( iDb<0 )
5d90: 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 21   return;.  if( !
5da0: 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26 26 20 69  OMIT_TEMPDB && i
5db0: 73 54 65 6d 70 20 26 26 20 69 44 62 3e 31 20 29  sTemp && iDb>1 )
5dc0: 7b 0a 20 20 20 20 2f 2a 20 49 66 20 63 72 65 61  {.    /* If crea
5dd0: 74 69 6e 67 20 61 20 74 65 6d 70 20 74 61 62 6c  ting a temp tabl
5de0: 65 2c 20 74 68 65 20 6e 61 6d 65 20 6d 61 79 20  e, the name may 
5df0: 6e 6f 74 20 62 65 20 71 75 61 6c 69 66 69 65 64  not be qualified
5e00: 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 45   */.    sqlite3E
5e10: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
5e20: 22 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65  "temporary table
5e30: 20 6e 61 6d 65 20 6d 75 73 74 20 62 65 20 75 6e   name must be un
5e40: 71 75 61 6c 69 66 69 65 64 22 29 3b 0a 20 20 20  qualified");.   
5e50: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69   return;.  }.  i
5e60: 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20  f( !OMIT_TEMPDB 
5e70: 26 26 20 69 73 54 65 6d 70 20 29 20 69 44 62 20  && isTemp ) iDb 
5e80: 3d 20 31 3b 0a 0a 20 20 70 50 61 72 73 65 2d 3e  = 1;..  pParse->
5e90: 73 4e 61 6d 65 54 6f 6b 65 6e 20 3d 20 2a 70 4e  sNameToken = *pN
5ea0: 61 6d 65 3b 0a 20 20 7a 4e 61 6d 65 20 3d 20 73  ame;.  zName = s
5eb0: 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f  qlite3NameFromTo
5ec0: 6b 65 6e 28 64 62 2c 20 70 4e 61 6d 65 29 3b 0a  ken(db, pName);.
5ed0: 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29    if( zName==0 )
5ee0: 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 53   return;.  if( S
5ef0: 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65  QLITE_OK!=sqlite
5f00: 33 43 68 65 63 6b 4f 62 6a 65 63 74 4e 61 6d 65  3CheckObjectName
5f10: 28 70 50 61 72 73 65 2c 20 7a 4e 61 6d 65 29 20  (pParse, zName) 
5f20: 29 7b 0a 20 20 20 20 67 6f 74 6f 20 62 65 67 69  ){.    goto begi
5f30: 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b 0a 20  n_table_error;. 
5f40: 20 7d 0a 20 20 69 66 28 20 64 62 2d 3e 69 6e 69   }.  if( db->ini
5f50: 74 2e 69 44 62 3d 3d 31 20 29 20 69 73 54 65 6d  t.iDb==1 ) isTem
5f60: 70 20 3d 20 31 3b 0a 23 69 66 6e 64 65 66 20 53  p = 1;.#ifndef S
5f70: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f  QLITE_OMIT_AUTHO
5f80: 52 49 5a 41 54 49 4f 4e 0a 20 20 61 73 73 65 72  RIZATION.  asser
5f90: 74 28 20 28 69 73 54 65 6d 70 20 26 20 31 29 3d  t( (isTemp & 1)=
5fa0: 3d 69 73 54 65 6d 70 20 29 3b 0a 20 20 7b 0a 20  =isTemp );.  {. 
5fb0: 20 20 20 69 6e 74 20 63 6f 64 65 3b 0a 20 20 20     int code;.   
5fc0: 20 63 68 61 72 20 2a 7a 44 62 20 3d 20 64 62 2d   char *zDb = db-
5fd0: 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 3b  >aDb[iDb].zName;
5fe0: 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
5ff0: 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65  AuthCheck(pParse
6000: 2c 20 53 51 4c 49 54 45 5f 49 4e 53 45 52 54 2c  , SQLITE_INSERT,
6010: 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 73   SCHEMA_TABLE(is
6020: 54 65 6d 70 29 2c 20 30 2c 20 7a 44 62 29 20 29  Temp), 0, zDb) )
6030: 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 62 65 67  {.      goto beg
6040: 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b 0a  in_table_error;.
6050: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 73      }.    if( is
6060: 56 69 65 77 20 29 7b 0a 20 20 20 20 20 20 69 66  View ){.      if
6070: 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26  ( !OMIT_TEMPDB &
6080: 26 20 69 73 54 65 6d 70 20 29 7b 0a 20 20 20 20  & isTemp ){.    
6090: 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54      code = SQLIT
60a0: 45 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f 56 49  E_CREATE_TEMP_VI
60b0: 45 57 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  EW;.      }else{
60c0: 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20 3d 20  .        code = 
60d0: 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 56 49  SQLITE_CREATE_VI
60e0: 45 57 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  EW;.      }.    
60f0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 66 28  }else{.      if(
6100: 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26 26   !OMIT_TEMPDB &&
6110: 20 69 73 54 65 6d 70 20 29 7b 0a 20 20 20 20 20   isTemp ){.     
6120: 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45     code = SQLITE
6130: 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f 54 41 42  _CREATE_TEMP_TAB
6140: 4c 45 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  LE;.      }else{
6150: 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20 3d 20  .        code = 
6160: 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 41  SQLITE_CREATE_TA
6170: 42 4c 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  BLE;.      }.   
6180: 20 7d 0a 20 20 20 20 69 66 28 20 21 69 73 56 69   }.    if( !isVi
6190: 72 74 75 61 6c 20 26 26 20 73 71 6c 69 74 65 33  rtual && sqlite3
61a0: 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65  AuthCheck(pParse
61b0: 2c 20 63 6f 64 65 2c 20 7a 4e 61 6d 65 2c 20 30  , code, zName, 0
61c0: 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20  , zDb) ){.      
61d0: 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65  goto begin_table
61e0: 5f 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20  _error;.    }.  
61f0: 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 4d  }.#endif..  /* M
6200: 61 6b 65 20 73 75 72 65 20 74 68 65 20 6e 65 77  ake sure the new
6210: 20 74 61 62 6c 65 20 6e 61 6d 65 20 64 6f 65 73   table name does
6220: 20 6e 6f 74 20 63 6f 6c 6c 69 64 65 20 77 69 74   not collide wit
6230: 68 20 61 6e 20 65 78 69 73 74 69 6e 67 0a 20 20  h an existing.  
6240: 2a 2a 20 69 6e 64 65 78 20 6f 72 20 74 61 62 6c  ** index or tabl
6250: 65 20 6e 61 6d 65 20 69 6e 20 74 68 65 20 73 61  e name in the sa
6260: 6d 65 20 64 61 74 61 62 61 73 65 2e 20 20 49 73  me database.  Is
6270: 73 75 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73  sue an error mes
6280: 73 61 67 65 20 69 66 0a 20 20 2a 2a 20 69 74 20  sage if.  ** it 
6290: 64 6f 65 73 2e 20 54 68 65 20 65 78 63 65 70 74  does. The except
62a0: 69 6f 6e 20 69 73 20 69 66 20 74 68 65 20 73 74  ion is if the st
62b0: 61 74 65 6d 65 6e 74 20 62 65 69 6e 67 20 70 61  atement being pa
62c0: 72 73 65 64 20 77 61 73 20 70 61 73 73 65 64 0a  rsed was passed.
62d0: 20 20 2a 2a 20 74 6f 20 61 6e 20 73 71 6c 69 74    ** to an sqlit
62e0: 65 33 5f 64 65 63 6c 61 72 65 5f 76 74 61 62 28  e3_declare_vtab(
62f0: 29 20 63 61 6c 6c 2e 20 49 6e 20 74 68 61 74 20  ) call. In that 
6300: 63 61 73 65 20 6f 6e 6c 79 20 74 68 65 20 63 6f  case only the co
6310: 6c 75 6d 6e 20 6e 61 6d 65 73 0a 20 20 2a 2a 20  lumn names.  ** 
6320: 61 6e 64 20 74 79 70 65 73 20 77 69 6c 6c 20 62  and types will b
6330: 65 20 75 73 65 64 2c 20 73 6f 20 74 68 65 72 65  e used, so there
6340: 20 69 73 20 6e 6f 20 6e 65 65 64 20 74 6f 20 74   is no need to t
6350: 65 73 74 20 66 6f 72 20 6e 61 6d 65 73 70 61 63  est for namespac
6360: 65 0a 20 20 2a 2a 20 63 6f 6c 6c 69 73 69 6f 6e  e.  ** collision
6370: 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 49  s..  */.  if( !I
6380: 4e 5f 44 45 43 4c 41 52 45 5f 56 54 41 42 20 29  N_DECLARE_VTAB )
6390: 7b 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54 45  {.    if( SQLITE
63a0: 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65 61 64  _OK!=sqlite3Read
63b0: 53 63 68 65 6d 61 28 70 50 61 72 73 65 29 20 29  Schema(pParse) )
63c0: 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 62 65 67  {.      goto beg
63d0: 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b 0a  in_table_error;.
63e0: 20 20 20 20 7d 0a 20 20 20 20 70 54 61 62 6c 65      }.    pTable
63f0: 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61   = sqlite3FindTa
6400: 62 6c 65 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 64  ble(db, zName, d
6410: 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d  b->aDb[iDb].zNam
6420: 65 29 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62  e);.    if( pTab
6430: 6c 65 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  le ){.      if( 
6440: 21 6e 6f 45 72 72 20 29 7b 0a 20 20 20 20 20 20  !noErr ){.      
6450: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
6460: 67 28 70 50 61 72 73 65 2c 20 22 74 61 62 6c 65  g(pParse, "table
6470: 20 25 54 20 61 6c 72 65 61 64 79 20 65 78 69 73   %T already exis
6480: 74 73 22 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 20  ts", pName);.   
6490: 20 20 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20     }.      goto 
64a0: 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f  begin_table_erro
64b0: 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  r;.    }.    if(
64c0: 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 64 65   sqlite3FindInde
64d0: 78 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 30 29 21  x(db, zName, 0)!
64e0: 3d 30 20 26 26 20 28 69 44 62 3d 3d 30 20 7c 7c  =0 && (iDb==0 ||
64f0: 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 29   !db->init.busy)
6500: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
6510: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
6520: 2c 20 22 74 68 65 72 65 20 69 73 20 61 6c 72 65  , "there is alre
6530: 61 64 79 20 61 6e 20 69 6e 64 65 78 20 6e 61 6d  ady an index nam
6540: 65 64 20 25 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a  ed %s", zName);.
6550: 20 20 20 20 20 20 67 6f 74 6f 20 62 65 67 69 6e        goto begin
6560: 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b 0a 20 20  _table_error;.  
6570: 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 54 61 62 6c    }.  }..  pTabl
6580: 65 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  e = sqlite3DbMal
6590: 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65  locZero(db, size
65a0: 6f 66 28 54 61 62 6c 65 29 29 3b 0a 20 20 69 66  of(Table));.  if
65b0: 28 20 70 54 61 62 6c 65 3d 3d 30 20 29 7b 0a 20  ( pTable==0 ){. 
65c0: 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69     db->mallocFai
65d0: 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20 70 50 61  led = 1;.    pPa
65e0: 72 73 65 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45  rse->rc = SQLITE
65f0: 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 70 50 61 72  _NOMEM;.    pPar
6600: 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20  se->nErr++;.    
6610: 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65  goto begin_table
6620: 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 70 54  _error;.  }.  pT
6630: 61 62 6c 65 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 4e  able->zName = zN
6640: 61 6d 65 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 69  ame;.  pTable->i
6650: 50 4b 65 79 20 3d 20 2d 31 3b 0a 20 20 70 54 61  PKey = -1;.  pTa
6660: 62 6c 65 2d 3e 70 53 63 68 65 6d 61 20 3d 20 64  ble->pSchema = d
6670: 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53 63 68  b->aDb[iDb].pSch
6680: 65 6d 61 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 6e  ema;.  pTable->n
6690: 52 65 66 20 3d 20 31 3b 0a 20 20 69 66 28 20 70  Ref = 1;.  if( p
66a0: 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
66b0: 20 29 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65   ) sqlite3Delete
66c0: 54 61 62 6c 65 28 70 50 61 72 73 65 2d 3e 70 4e  Table(pParse->pN
66d0: 65 77 54 61 62 6c 65 29 3b 0a 20 20 70 50 61 72  ewTable);.  pPar
66e0: 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 3d 20  se->pNewTable = 
66f0: 70 54 61 62 6c 65 3b 0a 0a 20 20 2f 2a 20 49 66  pTable;..  /* If
6700: 20 74 68 69 73 20 69 73 20 74 68 65 20 6d 61 67   this is the mag
6710: 69 63 20 73 71 6c 69 74 65 5f 73 65 71 75 65 6e  ic sqlite_sequen
6720: 63 65 20 74 61 62 6c 65 20 75 73 65 64 20 62 79  ce table used by
6730: 20 61 75 74 6f 69 6e 63 72 65 6d 65 6e 74 2c 0a   autoincrement,.
6740: 20 20 2a 2a 20 74 68 65 6e 20 72 65 63 6f 72 64    ** then record
6750: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
6760: 69 73 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20  is table in the 
6770: 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 73 74  main database st
6780: 72 75 63 74 75 72 65 0a 20 20 2a 2a 20 73 6f 20  ructure.  ** so 
6790: 74 68 61 74 20 49 4e 53 45 52 54 20 63 61 6e 20  that INSERT can 
67a0: 66 69 6e 64 20 74 68 65 20 74 61 62 6c 65 20 65  find the table e
67b0: 61 73 69 6c 79 2e 0a 20 20 2a 2f 0a 23 69 66 6e  asily..  */.#ifn
67c0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
67d0: 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 0a 20 20  AUTOINCREMENT.  
67e0: 69 66 28 20 21 70 50 61 72 73 65 2d 3e 6e 65 73  if( !pParse->nes
67f0: 74 65 64 20 26 26 20 73 74 72 63 6d 70 28 7a 4e  ted && strcmp(zN
6800: 61 6d 65 2c 20 22 73 71 6c 69 74 65 5f 73 65 71  ame, "sqlite_seq
6810: 75 65 6e 63 65 22 29 3d 3d 30 20 29 7b 0a 20 20  uence")==0 ){.  
6820: 20 20 70 54 61 62 6c 65 2d 3e 70 53 63 68 65 6d    pTable->pSchem
6830: 61 2d 3e 70 53 65 71 54 61 62 20 3d 20 70 54 61  a->pSeqTab = pTa
6840: 62 6c 65 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  ble;.  }.#endif.
6850: 0a 20 20 2f 2a 20 42 65 67 69 6e 20 67 65 6e 65  .  /* Begin gene
6860: 72 61 74 69 6e 67 20 74 68 65 20 63 6f 64 65 20  rating the code 
6870: 74 68 61 74 20 77 69 6c 6c 20 69 6e 73 65 72 74  that will insert
6880: 20 74 68 65 20 74 61 62 6c 65 20 72 65 63 6f 72   the table recor
6890: 64 20 69 6e 74 6f 0a 20 20 2a 2a 20 74 68 65 20  d into.  ** the 
68a0: 53 51 4c 49 54 45 5f 4d 41 53 54 45 52 20 74 61  SQLITE_MASTER ta
68b0: 62 6c 65 2e 20 20 4e 6f 74 65 20 69 6e 20 70 61  ble.  Note in pa
68c0: 72 74 69 63 75 6c 61 72 20 74 68 61 74 20 77 65  rticular that we
68d0: 20 6d 75 73 74 20 67 6f 20 61 68 65 61 64 0a 20   must go ahead. 
68e0: 20 2a 2a 20 61 6e 64 20 61 6c 6c 6f 63 61 74 65   ** and allocate
68f0: 20 74 68 65 20 72 65 63 6f 72 64 20 6e 75 6d 62   the record numb
6900: 65 72 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65  er for the table
6910: 20 65 6e 74 72 79 20 6e 6f 77 2e 20 20 42 65 66   entry now.  Bef
6920: 6f 72 65 20 61 6e 79 0a 20 20 2a 2a 20 50 52 49  ore any.  ** PRI
6930: 4d 41 52 59 20 4b 45 59 20 6f 72 20 55 4e 49 51  MARY KEY or UNIQ
6940: 55 45 20 6b 65 79 77 6f 72 64 73 20 61 72 65 20  UE keywords are 
6950: 70 61 72 73 65 64 2e 20 20 54 68 6f 73 65 20 6b  parsed.  Those k
6960: 65 79 77 6f 72 64 73 20 77 69 6c 6c 20 63 61 75  eywords will cau
6970: 73 65 0a 20 20 2a 2a 20 69 6e 64 69 63 65 73 20  se.  ** indices 
6980: 74 6f 20 62 65 20 63 72 65 61 74 65 64 20 61 6e  to be created an
6990: 64 20 74 68 65 20 74 61 62 6c 65 20 72 65 63 6f  d the table reco
69a0: 72 64 20 6d 75 73 74 20 63 6f 6d 65 20 62 65 66  rd must come bef
69b0: 6f 72 65 20 74 68 65 20 0a 20 20 2a 2a 20 69 6e  ore the .  ** in
69c0: 64 69 63 65 73 2e 20 20 48 65 6e 63 65 2c 20 74  dices.  Hence, t
69d0: 68 65 20 72 65 63 6f 72 64 20 6e 75 6d 62 65 72  he record number
69e0: 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20 6d   for the table m
69f0: 75 73 74 20 62 65 20 61 6c 6c 6f 63 61 74 65 64  ust be allocated
6a00: 0a 20 20 2a 2a 20 6e 6f 77 2e 0a 20 20 2a 2f 0a  .  ** now..  */.
6a10: 20 20 69 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e    if( !db->init.
6a20: 62 75 73 79 20 26 26 20 28 76 20 3d 20 73 71 6c  busy && (v = sql
6a30: 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
6a40: 73 65 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 69  se))!=0 ){.    i
6a50: 6e 74 20 6a 31 3b 0a 20 20 20 20 69 6e 74 20 66  nt j1;.    int f
6a60: 69 6c 65 46 6f 72 6d 61 74 3b 0a 20 20 20 20 69  ileFormat;.    i
6a70: 6e 74 20 72 65 67 31 2c 20 72 65 67 32 2c 20 72  nt reg1, reg2, r
6a80: 65 67 33 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  eg3;.    sqlite3
6a90: 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74  BeginWriteOperat
6aa0: 69 6f 6e 28 70 50 61 72 73 65 2c 20 30 2c 20 69  ion(pParse, 0, i
6ab0: 44 62 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51  Db);..#ifndef SQ
6ac0: 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
6ad0: 4c 54 41 42 4c 45 0a 20 20 20 20 69 66 28 20 69  LTABLE.    if( i
6ae0: 73 56 69 72 74 75 61 6c 20 29 7b 0a 20 20 20 20  sVirtual ){.    
6af0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
6b00: 4f 70 30 28 76 2c 20 4f 50 5f 56 42 65 67 69 6e  Op0(v, OP_VBegin
6b10: 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  );.    }.#endif.
6b20: 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 66  .    /* If the f
6b30: 69 6c 65 20 66 6f 72 6d 61 74 20 61 6e 64 20 65  ile format and e
6b40: 6e 63 6f 64 69 6e 67 20 69 6e 20 74 68 65 20 64  ncoding in the d
6b50: 61 74 61 62 61 73 65 20 68 61 76 65 20 6e 6f 74  atabase have not
6b60: 20 62 65 65 6e 20 73 65 74 2c 20 0a 20 20 20 20   been set, .    
6b70: 2a 2a 20 73 65 74 20 74 68 65 6d 20 6e 6f 77 2e  ** set them now.
6b80: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 65 67 31  .    */.    reg1
6b90: 20 3d 20 70 50 61 72 73 65 2d 3e 72 65 67 52 6f   = pParse->regRo
6ba0: 77 69 64 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  wid = ++pParse->
6bb0: 6e 4d 65 6d 3b 0a 20 20 20 20 72 65 67 32 20 3d  nMem;.    reg2 =
6bc0: 20 70 50 61 72 73 65 2d 3e 72 65 67 52 6f 6f 74   pParse->regRoot
6bd0: 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
6be0: 6d 3b 0a 20 20 20 20 72 65 67 33 20 3d 20 2b 2b  m;.    reg3 = ++
6bf0: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
6c00: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
6c10: 4f 70 33 28 76 2c 20 4f 50 5f 52 65 61 64 43 6f  Op3(v, OP_ReadCo
6c20: 6f 6b 69 65 2c 20 69 44 62 2c 20 72 65 67 33 2c  okie, iDb, reg3,
6c30: 20 31 29 3b 20 20 20 2f 2a 20 66 69 6c 65 5f 66   1);   /* file_f
6c40: 6f 72 6d 61 74 20 2a 2f 0a 20 20 20 20 73 71 6c  ormat */.    sql
6c50: 69 74 65 33 56 64 62 65 55 73 65 73 42 74 72 65  ite3VdbeUsesBtre
6c60: 65 28 76 2c 20 69 44 62 29 3b 0a 20 20 20 20 6a  e(v, iDb);.    j
6c70: 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  1 = sqlite3VdbeA
6c80: 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 2c 20  ddOp1(v, OP_If, 
6c90: 72 65 67 33 29 3b 0a 20 20 20 20 66 69 6c 65 46  reg3);.    fileF
6ca0: 6f 72 6d 61 74 20 3d 20 28 64 62 2d 3e 66 6c 61  ormat = (db->fla
6cb0: 67 73 20 26 20 53 51 4c 49 54 45 5f 4c 65 67 61  gs & SQLITE_Lega
6cc0: 63 79 46 69 6c 65 46 6d 74 29 21 3d 30 20 3f 0a  cyFileFmt)!=0 ?.
6cd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6ce0: 20 20 31 20 3a 20 53 51 4c 49 54 45 5f 4d 41 58    1 : SQLITE_MAX
6cf0: 5f 46 49 4c 45 5f 46 4f 52 4d 41 54 3b 0a 20 20  _FILE_FORMAT;.  
6d00: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
6d10: 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
6d20: 72 2c 20 66 69 6c 65 46 6f 72 6d 61 74 2c 20 72  r, fileFormat, r
6d30: 65 67 33 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  eg3);.    sqlite
6d40: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
6d50: 50 5f 53 65 74 43 6f 6f 6b 69 65 2c 20 69 44 62  P_SetCookie, iDb
6d60: 2c 20 31 2c 20 72 65 67 33 29 3b 0a 20 20 20 20  , 1, reg3);.    
6d70: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
6d80: 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
6d90: 20 45 4e 43 28 64 62 29 2c 20 72 65 67 33 29 3b   ENC(db), reg3);
6da0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
6db0: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53 65 74  AddOp3(v, OP_Set
6dc0: 43 6f 6f 6b 69 65 2c 20 69 44 62 2c 20 34 2c 20  Cookie, iDb, 4, 
6dd0: 72 65 67 33 29 3b 0a 20 20 20 20 73 71 6c 69 74  reg3);.    sqlit
6de0: 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
6df0: 2c 20 6a 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 54  , j1);..    /* T
6e00: 68 69 73 20 6a 75 73 74 20 63 72 65 61 74 65 73  his just creates
6e10: 20 61 20 70 6c 61 63 65 2d 68 6f 6c 64 65 72 20   a place-holder 
6e20: 72 65 63 6f 72 64 20 69 6e 20 74 68 65 20 73 71  record in the sq
6e30: 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c  lite_master tabl
6e40: 65 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 72 65  e..    ** The re
6e50: 63 6f 72 64 20 63 72 65 61 74 65 64 20 64 6f 65  cord created doe
6e60: 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61 6e  s not contain an
6e70: 79 74 68 69 6e 67 20 79 65 74 2e 20 20 49 74 20  ything yet.  It 
6e80: 77 69 6c 6c 20 62 65 20 72 65 70 6c 61 63 65 64  will be replaced
6e90: 0a 20 20 20 20 2a 2a 20 62 79 20 74 68 65 20 72  .    ** by the r
6ea0: 65 61 6c 20 65 6e 74 72 79 20 69 6e 20 63 6f 64  eal entry in cod
6eb0: 65 20 67 65 6e 65 72 61 74 65 64 20 61 74 20 73  e generated at s
6ec0: 71 6c 69 74 65 33 45 6e 64 54 61 62 6c 65 28 29  qlite3EndTable()
6ed0: 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
6ee0: 54 68 65 20 72 6f 77 69 64 20 66 6f 72 20 74 68  The rowid for th
6ef0: 65 20 6e 65 77 20 65 6e 74 72 79 20 69 73 20 6c  e new entry is l
6f00: 65 66 74 20 6f 6e 20 74 68 65 20 74 6f 70 20 6f  eft on the top o
6f10: 66 20 74 68 65 20 73 74 61 63 6b 2e 0a 20 20 20  f the stack..   
6f20: 20 2a 2a 20 54 68 65 20 72 6f 77 69 64 20 76 61   ** The rowid va
6f30: 6c 75 65 20 69 73 20 6e 65 65 64 65 64 20 62 79  lue is needed by
6f40: 20 74 68 65 20 63 6f 64 65 20 74 68 61 74 20 73   the code that s
6f50: 71 6c 69 74 65 33 45 6e 64 54 61 62 6c 65 20 77  qlite3EndTable w
6f60: 69 6c 6c 0a 20 20 20 20 2a 2a 20 67 65 6e 65 72  ill.    ** gener
6f70: 61 74 65 2e 0a 20 20 20 20 2a 2f 0a 23 69 66 20  ate..    */.#if 
6f80: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
6f90: 4f 4d 49 54 5f 56 49 45 57 29 20 7c 7c 20 21 64  OMIT_VIEW) || !d
6fa0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
6fb0: 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29  IT_VIRTUALTABLE)
6fc0: 0a 20 20 20 20 69 66 28 20 69 73 56 69 65 77 20  .    if( isView 
6fd0: 7c 7c 20 69 73 56 69 72 74 75 61 6c 20 29 7b 0a  || isVirtual ){.
6fe0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
6ff0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
7000: 74 65 67 65 72 2c 20 30 2c 20 72 65 67 32 29 3b  teger, 0, reg2);
7010: 0a 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69  .    }else.#endi
7020: 66 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 73 71  f.    {.      sq
7030: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
7040: 76 2c 20 4f 50 5f 43 72 65 61 74 65 54 61 62 6c  v, OP_CreateTabl
7050: 65 2c 20 69 44 62 2c 20 72 65 67 32 29 3b 0a 20  e, iDb, reg2);. 
7060: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
7070: 4f 70 65 6e 4d 61 73 74 65 72 54 61 62 6c 65 28  OpenMasterTable(
7080: 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20  pParse, iDb);.  
7090: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
70a0: 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77  Op2(v, OP_NewRow
70b0: 69 64 2c 20 30 2c 20 72 65 67 31 29 3b 0a 20 20  id, 0, reg1);.  
70c0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
70d0: 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20  Op2(v, OP_Null, 
70e0: 30 2c 20 72 65 67 33 29 3b 0a 20 20 20 20 73 71  0, reg3);.    sq
70f0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
7100: 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20 30 2c  v, OP_Insert, 0,
7110: 20 72 65 67 33 2c 20 72 65 67 31 29 3b 0a 20 20   reg3, reg1);.  
7120: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
7130: 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f  ngeP5(v, OPFLAG_
7140: 41 50 50 45 4e 44 29 3b 0a 20 20 20 20 73 71 6c  APPEND);.    sql
7150: 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 28 76  ite3VdbeAddOp0(v
7160: 2c 20 4f 50 5f 43 6c 6f 73 65 29 3b 0a 20 20 7d  , OP_Close);.  }
7170: 0a 0a 20 20 2f 2a 20 4e 6f 72 6d 61 6c 20 28 6e  ..  /* Normal (n
7180: 6f 6e 2d 65 72 72 6f 72 29 20 72 65 74 75 72 6e  on-error) return
7190: 2e 20 2a 2f 0a 20 20 72 65 74 75 72 6e 3b 0a 0a  . */.  return;..
71a0: 20 20 2f 2a 20 49 66 20 61 6e 20 65 72 72 6f 72    /* If an error
71b0: 20 6f 63 63 75 72 73 2c 20 77 65 20 6a 75 6d 70   occurs, we jump
71c0: 20 68 65 72 65 20 2a 2f 0a 62 65 67 69 6e 5f 74   here */.begin_t
71d0: 61 62 6c 65 5f 65 72 72 6f 72 3a 0a 20 20 73 71  able_error:.  sq
71e0: 6c 69 74 65 33 5f 66 72 65 65 28 7a 4e 61 6d 65  lite3_free(zName
71f0: 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a  );.  return;.}..
7200: 2f 2a 0a 2a 2a 20 54 68 69 73 20 6d 61 63 72 6f  /*.** This macro
7210: 20 69 73 20 75 73 65 64 20 74 6f 20 63 6f 6d 70   is used to comp
7220: 61 72 65 20 74 77 6f 20 73 74 72 69 6e 67 73 20  are two strings 
7230: 69 6e 20 61 20 63 61 73 65 2d 69 6e 73 65 6e 73  in a case-insens
7240: 69 74 69 76 65 20 6d 61 6e 6e 65 72 2e 0a 2a 2a  itive manner..**
7250: 20 49 74 20 69 73 20 73 6c 69 67 68 74 6c 79 20   It is slightly 
7260: 66 61 73 74 65 72 20 74 68 61 6e 20 63 61 6c 6c  faster than call
7270: 69 6e 67 20 73 71 6c 69 74 65 33 53 74 72 49 43  ing sqlite3StrIC
7280: 6d 70 28 29 20 64 69 72 65 63 74 6c 79 2c 20 62  mp() directly, b
7290: 75 74 0a 2a 2a 20 70 72 6f 64 75 63 65 73 20 6c  ut.** produces l
72a0: 61 72 67 65 72 20 63 6f 64 65 2e 0a 2a 2a 0a 2a  arger code..**.*
72b0: 2a 20 57 41 52 4e 49 4e 47 3a 20 54 68 69 73 20  * WARNING: This 
72c0: 6d 61 63 72 6f 20 69 73 20 6e 6f 74 20 63 6f 6d  macro is not com
72d0: 70 61 74 69 62 6c 65 20 77 69 74 68 20 74 68 65  patible with the
72e0: 20 73 74 72 63 6d 70 28 29 20 66 61 6d 69 6c 79   strcmp() family
72f0: 2e 20 49 74 0a 2a 2a 20 72 65 74 75 72 6e 73 20  . It.** returns 
7300: 74 72 75 65 20 69 66 20 74 68 65 20 74 77 6f 20  true if the two 
7310: 73 74 72 69 6e 67 73 20 61 72 65 20 65 71 75 61  strings are equa
7320: 6c 2c 20 6f 74 68 65 72 77 69 73 65 20 66 61 6c  l, otherwise fal
7330: 73 65 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 53  se..*/.#define S
7340: 54 52 49 43 4d 50 28 78 2c 20 79 29 20 28 5c 0a  TRICMP(x, y) (\.
7350: 73 71 6c 69 74 65 33 55 70 70 65 72 54 6f 4c 6f  sqlite3UpperToLo
7360: 77 65 72 5b 2a 28 75 6e 73 69 67 6e 65 64 20 63  wer[*(unsigned c
7370: 68 61 72 20 2a 29 28 78 29 5d 3d 3d 20 20 20 5c  har *)(x)]==   \
7380: 0a 73 71 6c 69 74 65 33 55 70 70 65 72 54 6f 4c  .sqlite3UpperToL
7390: 6f 77 65 72 5b 2a 28 75 6e 73 69 67 6e 65 64 20  ower[*(unsigned 
73a0: 63 68 61 72 20 2a 29 28 79 29 5d 20 20 20 20 20  char *)(y)]     
73b0: 5c 0a 26 26 20 73 71 6c 69 74 65 33 53 74 72 49  \.&& sqlite3StrI
73c0: 43 6d 70 28 28 78 29 2b 31 2c 28 79 29 2b 31 29  Cmp((x)+1,(y)+1)
73d0: 3d 3d 30 20 29 0a 0a 2f 2a 0a 2a 2a 20 41 64 64  ==0 )../*.** Add
73e0: 20 61 20 6e 65 77 20 63 6f 6c 75 6d 6e 20 74 6f   a new column to
73f0: 20 74 68 65 20 74 61 62 6c 65 20 63 75 72 72 65   the table curre
7400: 6e 74 6c 79 20 62 65 69 6e 67 20 63 6f 6e 73 74  ntly being const
7410: 72 75 63 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  ructed..**.** Th
7420: 65 20 70 61 72 73 65 72 20 63 61 6c 6c 73 20 74  e parser calls t
7430: 68 69 73 20 72 6f 75 74 69 6e 65 20 6f 6e 63 65  his routine once
7440: 20 66 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e   for each column
7450: 20 64 65 63 6c 61 72 61 74 69 6f 6e 0a 2a 2a 20   declaration.** 
7460: 69 6e 20 61 20 43 52 45 41 54 45 20 54 41 42 4c  in a CREATE TABL
7470: 45 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 73 71  E statement.  sq
7480: 6c 69 74 65 33 53 74 61 72 74 54 61 62 6c 65 28  lite3StartTable(
7490: 29 20 67 65 74 73 20 63 61 6c 6c 65 64 0a 2a 2a  ) gets called.**
74a0: 20 66 69 72 73 74 20 74 6f 20 67 65 74 20 74 68   first to get th
74b0: 69 6e 67 73 20 67 6f 69 6e 67 2e 20 20 54 68 65  ings going.  The
74c0: 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  n this routine i
74d0: 73 20 63 61 6c 6c 65 64 20 66 6f 72 20 65 61 63  s called for eac
74e0: 68 0a 2a 2a 20 63 6f 6c 75 6d 6e 2e 0a 2a 2f 0a  h.** column..*/.
74f0: 76 6f 69 64 20 73 71 6c 69 74 65 33 41 64 64 43  void sqlite3AddC
7500: 6f 6c 75 6d 6e 28 50 61 72 73 65 20 2a 70 50 61  olumn(Parse *pPa
7510: 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d  rse, Token *pNam
7520: 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a  e){.  Table *p;.
7530: 20 20 69 6e 74 20 69 3b 0a 20 20 63 68 61 72 20    int i;.  char 
7540: 2a 7a 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43  *z;.  Column *pC
7550: 6f 6c 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  ol;.  sqlite3 *d
7560: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
7570: 20 20 69 66 28 20 28 70 20 3d 20 70 50 61 72 73    if( (p = pPars
7580: 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3d 3d 30  e->pNewTable)==0
7590: 20 29 20 72 65 74 75 72 6e 3b 0a 23 69 66 20 53   ) return;.#if S
75a0: 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4c 55 4d 4e  QLITE_MAX_COLUMN
75b0: 0a 20 20 69 66 28 20 70 2d 3e 6e 43 6f 6c 2b 31  .  if( p->nCol+1
75c0: 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49  >db->aLimit[SQLI
75d0: 54 45 5f 4c 49 4d 49 54 5f 43 4f 4c 55 4d 4e 5d  TE_LIMIT_COLUMN]
75e0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
75f0: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
7600: 22 74 6f 6f 20 6d 61 6e 79 20 63 6f 6c 75 6d 6e  "too many column
7610: 73 20 6f 6e 20 25 73 22 2c 20 70 2d 3e 7a 4e 61  s on %s", p->zNa
7620: 6d 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b  me);.    return;
7630: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7a 20  .  }.#endif.  z 
7640: 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f  = sqlite3NameFro
7650: 6d 54 6f 6b 65 6e 28 70 50 61 72 73 65 2d 3e 64  mToken(pParse->d
7660: 62 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28  b, pName);.  if(
7670: 20 7a 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a   z==0 ) return;.
7680: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
7690: 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nCol; i++){.    
76a0: 69 66 28 20 53 54 52 49 43 4d 50 28 7a 2c 20 70  if( STRICMP(z, p
76b0: 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65 29  ->aCol[i].zName)
76c0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
76d0: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
76e0: 2c 20 22 64 75 70 6c 69 63 61 74 65 20 63 6f 6c  , "duplicate col
76f0: 75 6d 6e 20 6e 61 6d 65 3a 20 25 73 22 2c 20 7a  umn name: %s", z
7700: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
7710: 5f 66 72 65 65 28 7a 29 3b 0a 20 20 20 20 20 20  _free(z);.      
7720: 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20  return;.    }.  
7730: 7d 0a 20 20 69 66 28 20 28 70 2d 3e 6e 43 6f 6c  }.  if( (p->nCol
7740: 20 26 20 30 78 37 29 3d 3d 30 20 29 7b 0a 20 20   & 0x7)==0 ){.  
7750: 20 20 43 6f 6c 75 6d 6e 20 2a 61 4e 65 77 3b 0a    Column *aNew;.
7760: 20 20 20 20 61 4e 65 77 20 3d 20 73 71 6c 69 74      aNew = sqlit
7770: 65 33 44 62 52 65 61 6c 6c 6f 63 28 70 50 61 72  e3DbRealloc(pPar
7780: 73 65 2d 3e 64 62 2c 70 2d 3e 61 43 6f 6c 2c 28  se->db,p->aCol,(
7790: 70 2d 3e 6e 43 6f 6c 2b 38 29 2a 73 69 7a 65 6f  p->nCol+8)*sizeo
77a0: 66 28 70 2d 3e 61 43 6f 6c 5b 30 5d 29 29 3b 0a  f(p->aCol[0]));.
77b0: 20 20 20 20 69 66 28 20 61 4e 65 77 3d 3d 30 20      if( aNew==0 
77c0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
77d0: 5f 66 72 65 65 28 7a 29 3b 0a 20 20 20 20 20 20  _free(z);.      
77e0: 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20  return;.    }.  
77f0: 20 20 70 2d 3e 61 43 6f 6c 20 3d 20 61 4e 65 77    p->aCol = aNew
7800: 3b 0a 20 20 7d 0a 20 20 70 43 6f 6c 20 3d 20 26  ;.  }.  pCol = &
7810: 70 2d 3e 61 43 6f 6c 5b 70 2d 3e 6e 43 6f 6c 5d  p->aCol[p->nCol]
7820: 3b 0a 20 20 6d 65 6d 73 65 74 28 70 43 6f 6c 2c  ;.  memset(pCol,
7830: 20 30 2c 20 73 69 7a 65 6f 66 28 70 2d 3e 61 43   0, sizeof(p->aC
7840: 6f 6c 5b 30 5d 29 29 3b 0a 20 20 70 43 6f 6c 2d  ol[0]));.  pCol-
7850: 3e 7a 4e 61 6d 65 20 3d 20 7a 3b 0a 20 0a 20 20  >zName = z;. .  
7860: 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 6e  /* If there is n
7870: 6f 20 74 79 70 65 20 73 70 65 63 69 66 69 65 64  o type specified
7880: 2c 20 63 6f 6c 75 6d 6e 73 20 68 61 76 65 20 74  , columns have t
7890: 68 65 20 64 65 66 61 75 6c 74 20 61 66 66 69 6e  he default affin
78a0: 69 74 79 0a 20 20 2a 2a 20 27 4e 4f 4e 45 27 2e  ity.  ** 'NONE'.
78b0: 20 49 66 20 74 68 65 72 65 20 69 73 20 61 20 74   If there is a t
78c0: 79 70 65 20 73 70 65 63 69 66 69 65 64 2c 20 74  ype specified, t
78d0: 68 65 6e 20 73 71 6c 69 74 65 33 41 64 64 43 6f  hen sqlite3AddCo
78e0: 6c 75 6d 6e 54 79 70 65 28 29 20 77 69 6c 6c 0a  lumnType() will.
78f0: 20 20 2a 2a 20 62 65 20 63 61 6c 6c 65 64 20 6e    ** be called n
7900: 65 78 74 20 74 6f 20 73 65 74 20 70 43 6f 6c 2d  ext to set pCol-
7910: 3e 61 66 66 69 6e 69 74 79 20 63 6f 72 72 65 63  >affinity correc
7920: 74 6c 79 2e 0a 20 20 2a 2f 0a 20 20 70 43 6f 6c  tly..  */.  pCol
7930: 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20 53 51 4c  ->affinity = SQL
7940: 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20  ITE_AFF_NONE;.  
7950: 70 2d 3e 6e 43 6f 6c 2b 2b 3b 0a 7d 0a 0a 2f 2a  p->nCol++;.}../*
7960: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
7970: 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68   is called by th
7980: 65 20 70 61 72 73 65 72 20 77 68 69 6c 65 20 69  e parser while i
7990: 6e 20 74 68 65 20 6d 69 64 64 6c 65 20 6f 66 0a  n the middle of.
79a0: 2a 2a 20 70 61 72 73 69 6e 67 20 61 20 43 52 45  ** parsing a CRE
79b0: 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d  ATE TABLE statem
79c0: 65 6e 74 2e 20 20 41 20 22 4e 4f 54 20 4e 55 4c  ent.  A "NOT NUL
79d0: 4c 22 20 63 6f 6e 73 74 72 61 69 6e 74 20 68 61  L" constraint ha
79e0: 73 0a 2a 2a 20 62 65 65 6e 20 73 65 65 6e 20 6f  s.** been seen o
79f0: 6e 20 61 20 63 6f 6c 75 6d 6e 2e 20 20 54 68 69  n a column.  Thi
7a00: 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20 74  s routine sets t
7a10: 68 65 20 6e 6f 74 4e 75 6c 6c 20 66 6c 61 67 20  he notNull flag 
7a20: 6f 6e 0a 2a 2a 20 74 68 65 20 63 6f 6c 75 6d 6e  on.** the column
7a30: 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72   currently under
7a40: 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a   construction..*
7a50: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 41 64  /.void sqlite3Ad
7a60: 64 4e 6f 74 4e 75 6c 6c 28 50 61 72 73 65 20 2a  dNotNull(Parse *
7a70: 70 50 61 72 73 65 2c 20 69 6e 74 20 6f 6e 45 72  pParse, int onEr
7a80: 72 6f 72 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70  ror){.  Table *p
7a90: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28  ;.  int i;.  if(
7aa0: 20 28 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e   (p = pParse->pN
7ab0: 65 77 54 61 62 6c 65 29 3d 3d 30 20 29 20 72 65  ewTable)==0 ) re
7ac0: 74 75 72 6e 3b 0a 20 20 69 20 3d 20 70 2d 3e 6e  turn;.  i = p->n
7ad0: 43 6f 6c 2d 31 3b 0a 20 20 69 66 28 20 69 3e 3d  Col-1;.  if( i>=
7ae0: 30 20 29 20 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 6e  0 ) p->aCol[i].n
7af0: 6f 74 4e 75 6c 6c 20 3d 20 6f 6e 45 72 72 6f 72  otNull = onError
7b00: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 63 61 6e 20  ;.}../*.** Scan 
7b10: 74 68 65 20 63 6f 6c 75 6d 6e 20 74 79 70 65 20  the column type 
7b20: 6e 61 6d 65 20 7a 54 79 70 65 20 28 6c 65 6e 67  name zType (leng
7b30: 74 68 20 6e 54 79 70 65 29 20 61 6e 64 20 72 65  th nType) and re
7b40: 74 75 72 6e 20 74 68 65 0a 2a 2a 20 61 73 73 6f  turn the.** asso
7b50: 63 69 61 74 65 64 20 61 66 66 69 6e 69 74 79 20  ciated affinity 
7b60: 74 79 70 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  type..**.** This
7b70: 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 61 20   routine does a 
7b80: 63 61 73 65 2d 69 6e 64 65 70 65 6e 64 65 6e 74  case-independent
7b90: 20 73 65 61 72 63 68 20 6f 66 20 7a 54 79 70 65   search of zType
7ba0: 20 66 6f 72 20 74 68 65 20 0a 2a 2a 20 73 75 62   for the .** sub
7bb0: 73 74 72 69 6e 67 73 20 69 6e 20 74 68 65 20 66  strings in the f
7bc0: 6f 6c 6c 6f 77 69 6e 67 20 74 61 62 6c 65 2e 20  ollowing table. 
7bd0: 49 66 20 6f 6e 65 20 6f 66 20 74 68 65 20 73 75  If one of the su
7be0: 62 73 74 72 69 6e 67 73 20 69 73 0a 2a 2a 20 66  bstrings is.** f
7bf0: 6f 75 6e 64 2c 20 74 68 65 20 63 6f 72 72 65 73  ound, the corres
7c00: 70 6f 6e 64 69 6e 67 20 61 66 66 69 6e 69 74 79  ponding affinity
7c10: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66   is returned. If
7c20: 20 7a 54 79 70 65 20 63 6f 6e 74 61 69 6e 73 0a   zType contains.
7c30: 2a 2a 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65  ** more than one
7c40: 20 6f 66 20 74 68 65 20 73 75 62 73 74 72 69 6e   of the substrin
7c50: 67 73 2c 20 65 6e 74 72 69 65 73 20 74 6f 77 61  gs, entries towa
7c60: 72 64 20 74 68 65 20 74 6f 70 20 6f 66 20 0a 2a  rd the top of .*
7c70: 2a 20 74 68 65 20 74 61 62 6c 65 20 74 61 6b 65  * the table take
7c80: 20 70 72 69 6f 72 69 74 79 2e 20 46 6f 72 20 65   priority. For e
7c90: 78 61 6d 70 6c 65 2c 20 69 66 20 7a 54 79 70 65  xample, if zType
7ca0: 20 69 73 20 27 42 4c 4f 42 49 4e 54 27 2c 20 0a   is 'BLOBINT', .
7cb0: 2a 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e  ** SQLITE_AFF_IN
7cc0: 54 45 47 45 52 20 69 73 20 72 65 74 75 72 6e 65  TEGER is returne
7cd0: 64 2e 0a 2a 2a 0a 2a 2a 20 53 75 62 73 74 72 69  d..**.** Substri
7ce0: 6e 67 20 20 20 20 20 7c 20 41 66 66 69 6e 69 74  ng     | Affinit
7cf0: 79 0a 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  y.** -----------
7d00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7d10: 2d 2d 2d 2d 2d 0a 2a 2a 20 27 49 4e 54 27 20 20  -----.** 'INT'  
7d20: 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f         | SQLITE_
7d30: 41 46 46 5f 49 4e 54 45 47 45 52 0a 2a 2a 20 27  AFF_INTEGER.** '
7d40: 43 48 41 52 27 20 20 20 20 20 20 20 20 7c 20 53  CHAR'        | S
7d50: 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 0a 2a  QLITE_AFF_TEXT.*
7d60: 2a 20 27 43 4c 4f 42 27 20 20 20 20 20 20 20 20  * 'CLOB'        
7d70: 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58  | SQLITE_AFF_TEX
7d80: 54 0a 2a 2a 20 27 54 45 58 54 27 20 20 20 20 20  T.** 'TEXT'     
7d90: 20 20 20 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f     | SQLITE_AFF_
7da0: 54 45 58 54 0a 2a 2a 20 27 42 4c 4f 42 27 20 20  TEXT.** 'BLOB'  
7db0: 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 41        | SQLITE_A
7dc0: 46 46 5f 4e 4f 4e 45 0a 2a 2a 20 27 52 45 41 4c  FF_NONE.** 'REAL
7dd0: 27 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54  '        | SQLIT
7de0: 45 5f 41 46 46 5f 52 45 41 4c 0a 2a 2a 20 27 46  E_AFF_REAL.** 'F
7df0: 4c 4f 41 27 20 20 20 20 20 20 20 20 7c 20 53 51  LOA'        | SQ
7e00: 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 0a 2a 2a  LITE_AFF_REAL.**
7e10: 20 27 44 4f 55 42 27 20 20 20 20 20 20 20 20 7c   'DOUB'        |
7e20: 20 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c   SQLITE_AFF_REAL
7e30: 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 6e 65 20 6f  .**.** If none o
7e40: 66 20 74 68 65 20 73 75 62 73 74 72 69 6e 67 73  f the substrings
7e50: 20 69 6e 20 74 68 65 20 61 62 6f 76 65 20 74 61   in the above ta
7e60: 62 6c 65 20 61 72 65 20 66 6f 75 6e 64 2c 0a 2a  ble are found,.*
7e70: 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d  * SQLITE_AFF_NUM
7e80: 45 52 49 43 20 69 73 20 72 65 74 75 72 6e 65 64  ERIC is returned
7e90: 2e 0a 2a 2f 0a 63 68 61 72 20 73 71 6c 69 74 65  ..*/.char sqlite
7ea0: 33 41 66 66 69 6e 69 74 79 54 79 70 65 28 63 6f  3AffinityType(co
7eb0: 6e 73 74 20 54 6f 6b 65 6e 20 2a 70 54 79 70 65  nst Token *pType
7ec0: 29 7b 0a 20 20 75 33 32 20 68 20 3d 20 30 3b 0a  ){.  u32 h = 0;.
7ed0: 20 20 63 68 61 72 20 61 66 66 20 3d 20 53 51 4c    char aff = SQL
7ee0: 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 3b  ITE_AFF_NUMERIC;
7ef0: 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  .  const unsigne
7f00: 64 20 63 68 61 72 20 2a 7a 49 6e 20 3d 20 70 54  d char *zIn = pT
7f10: 79 70 65 2d 3e 7a 3b 0a 20 20 63 6f 6e 73 74 20  ype->z;.  const 
7f20: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a  unsigned char *z
7f30: 45 6e 64 20 3d 20 26 70 54 79 70 65 2d 3e 7a 5b  End = &pType->z[
7f40: 70 54 79 70 65 2d 3e 6e 5d 3b 0a 0a 20 20 77 68  pType->n];..  wh
7f50: 69 6c 65 28 20 7a 49 6e 21 3d 7a 45 6e 64 20 29  ile( zIn!=zEnd )
7f60: 7b 0a 20 20 20 20 68 20 3d 20 28 68 3c 3c 38 29  {.    h = (h<<8)
7f70: 20 2b 20 73 71 6c 69 74 65 33 55 70 70 65 72 54   + sqlite3UpperT
7f80: 6f 4c 6f 77 65 72 5b 2a 7a 49 6e 5d 3b 0a 20 20  oLower[*zIn];.  
7f90: 20 20 7a 49 6e 2b 2b 3b 0a 20 20 20 20 69 66 28    zIn++;.    if(
7fa0: 20 68 3d 3d 28 28 27 63 27 3c 3c 32 34 29 2b 28   h==(('c'<<24)+(
7fb0: 27 68 27 3c 3c 31 36 29 2b 28 27 61 27 3c 3c 38  'h'<<16)+('a'<<8
7fc0: 29 2b 27 72 27 29 20 29 7b 20 20 20 20 20 20 20  )+'r') ){       
7fd0: 20 20 20 20 20 20 2f 2a 20 43 48 41 52 20 2a 2f        /* CHAR */
7fe0: 0a 20 20 20 20 20 20 61 66 66 20 3d 20 53 51 4c  .      aff = SQL
7ff0: 49 54 45 5f 41 46 46 5f 54 45 58 54 3b 20 0a 20  ITE_AFF_TEXT; . 
8000: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 68 3d 3d     }else if( h==
8010: 28 28 27 63 27 3c 3c 32 34 29 2b 28 27 6c 27 3c  (('c'<<24)+('l'<
8020: 3c 31 36 29 2b 28 27 6f 27 3c 3c 38 29 2b 27 62  <16)+('o'<<8)+'b
8030: 27 29 20 29 7b 20 20 20 20 20 20 20 2f 2a 20 43  ') ){       /* C
8040: 4c 4f 42 20 2a 2f 0a 20 20 20 20 20 20 61 66 66  LOB */.      aff
8050: 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45   = SQLITE_AFF_TE
8060: 58 54 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  XT;.    }else if
8070: 28 20 68 3d 3d 28 28 27 74 27 3c 3c 32 34 29 2b  ( h==(('t'<<24)+
8080: 28 27 65 27 3c 3c 31 36 29 2b 28 27 78 27 3c 3c  ('e'<<16)+('x'<<
8090: 38 29 2b 27 74 27 29 20 29 7b 20 20 20 20 20 20  8)+'t') ){      
80a0: 20 2f 2a 20 54 45 58 54 20 2a 2f 0a 20 20 20 20   /* TEXT */.    
80b0: 20 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41    aff = SQLITE_A
80c0: 46 46 5f 54 45 58 54 3b 0a 20 20 20 20 7d 65 6c  FF_TEXT;.    }el
80d0: 73 65 20 69 66 28 20 68 3d 3d 28 28 27 62 27 3c  se if( h==(('b'<
80e0: 3c 32 34 29 2b 28 27 6c 27 3c 3c 31 36 29 2b 28  <24)+('l'<<16)+(
80f0: 27 6f 27 3c 3c 38 29 2b 27 62 27 29 20 20 20 20  'o'<<8)+'b')    
8100: 20 20 20 20 20 20 2f 2a 20 42 4c 4f 42 20 2a 2f        /* BLOB */
8110: 0a 20 20 20 20 20 20 20 20 26 26 20 28 61 66 66  .        && (aff
8120: 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d  ==SQLITE_AFF_NUM
8130: 45 52 49 43 20 7c 7c 20 61 66 66 3d 3d 53 51 4c  ERIC || aff==SQL
8140: 49 54 45 5f 41 46 46 5f 52 45 41 4c 29 20 29 7b  ITE_AFF_REAL) ){
8150: 0a 20 20 20 20 20 20 61 66 66 20 3d 20 53 51 4c  .      aff = SQL
8160: 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 23 69  ITE_AFF_NONE;.#i
8170: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
8180: 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54  T_FLOATING_POINT
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 72 27 3c 3c 32 34 29 2b 28 27 65  ==(('r'<<24)+('e
81b0: 27 3c 3c 31 36 29 2b 28 27 61 27 3c 3c 38 29 2b  '<<16)+('a'<<8)+
81c0: 27 6c 27 29 20 20 20 20 20 20 20 20 20 20 2f 2a  'l')          /*
81d0: 20 52 45 41 4c 20 2a 2f 0a 20 20 20 20 20 20 20   REAL */.       
81e0: 20 26 26 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f   && aff==SQLITE_
81f0: 41 46 46 5f 4e 55 4d 45 52 49 43 20 29 7b 0a 20  AFF_NUMERIC ){. 
8200: 20 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49 54       aff = SQLIT
8210: 45 5f 41 46 46 5f 52 45 41 4c 3b 0a 20 20 20 20  E_AFF_REAL;.    
8220: 7d 65 6c 73 65 20 69 66 28 20 68 3d 3d 28 28 27  }else if( h==(('
8230: 66 27 3c 3c 32 34 29 2b 28 27 6c 27 3c 3c 31 36  f'<<24)+('l'<<16
8240: 29 2b 28 27 6f 27 3c 3c 38 29 2b 27 61 27 29 20  )+('o'<<8)+'a') 
8250: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 4c 4f 41           /* FLOA
8260: 20 2a 2f 0a 20 20 20 20 20 20 20 20 26 26 20 61   */.        && a
8270: 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e  ff==SQLITE_AFF_N
8280: 55 4d 45 52 49 43 20 29 7b 0a 20 20 20 20 20 20  UMERIC ){.      
8290: 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46  aff = SQLITE_AFF
82a0: 5f 52 45 41 4c 3b 0a 20 20 20 20 7d 65 6c 73 65  _REAL;.    }else
82b0: 20 69 66 28 20 68 3d 3d 28 28 27 64 27 3c 3c 32   if( h==(('d'<<2
82c0: 34 29 2b 28 27 6f 27 3c 3c 31 36 29 2b 28 27 75  4)+('o'<<16)+('u
82d0: 27 3c 3c 38 29 2b 27 62 27 29 20 20 20 20 20 20  '<<8)+'b')      
82e0: 20 20 20 20 2f 2a 20 44 4f 55 42 20 2a 2f 0a 20      /* DOUB */. 
82f0: 20 20 20 20 20 20 20 26 26 20 61 66 66 3d 3d 53         && aff==S
8300: 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49  QLITE_AFF_NUMERI
8310: 43 20 29 7b 0a 20 20 20 20 20 20 61 66 66 20 3d  C ){.      aff =
8320: 20 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c   SQLITE_AFF_REAL
8330: 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c  ;.#endif.    }el
8340: 73 65 20 69 66 28 20 28 68 26 30 78 30 30 46 46  se if( (h&0x00FF
8350: 46 46 46 46 29 3d 3d 28 28 27 69 27 3c 3c 31 36  FFFF)==(('i'<<16
8360: 29 2b 28 27 6e 27 3c 3c 38 29 2b 27 74 27 29 20  )+('n'<<8)+'t') 
8370: 29 7b 20 20 20 20 2f 2a 20 49 4e 54 20 2a 2f 0a  ){    /* INT */.
8380: 20 20 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49        aff = SQLI
8390: 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 3b 0a  TE_AFF_INTEGER;.
83a0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
83b0: 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e   }.  }..  return
83c0: 20 61 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54   aff;.}../*.** T
83d0: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
83e0: 61 6c 6c 65 64 20 62 79 20 74 68 65 20 70 61 72  alled by the par
83f0: 73 65 72 20 77 68 69 6c 65 20 69 6e 20 74 68 65  ser while in the
8400: 20 6d 69 64 64 6c 65 20 6f 66 0a 2a 2a 20 70 61   middle of.** pa
8410: 72 73 69 6e 67 20 61 20 43 52 45 41 54 45 20 54  rsing a CREATE T
8420: 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 20  ABLE statement. 
8430: 20 54 68 65 20 70 46 69 72 73 74 20 74 6f 6b 65   The pFirst toke
8440: 6e 20 69 73 20 74 68 65 20 66 69 72 73 74 0a 2a  n is the first.*
8450: 2a 20 74 6f 6b 65 6e 20 69 6e 20 74 68 65 20 73  * token in the s
8460: 65 71 75 65 6e 63 65 20 6f 66 20 74 6f 6b 65 6e  equence of token
8470: 73 20 74 68 61 74 20 64 65 73 63 72 69 62 65 20  s that describe 
8480: 74 68 65 20 74 79 70 65 20 6f 66 20 74 68 65 0a  the type of the.
8490: 2a 2a 20 63 6f 6c 75 6d 6e 20 63 75 72 72 65 6e  ** column curren
84a0: 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72  tly under constr
84b0: 75 63 74 69 6f 6e 2e 20 20 20 70 4c 61 73 74 20  uction.   pLast 
84c0: 69 73 20 74 68 65 20 6c 61 73 74 20 74 6f 6b 65  is the last toke
84d0: 6e 0a 2a 2a 20 69 6e 20 74 68 65 20 73 65 71 75  n.** in the sequ
84e0: 65 6e 63 65 2e 20 20 55 73 65 20 74 68 69 73 20  ence.  Use this 
84f0: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20 63  information to c
8500: 6f 6e 73 74 72 75 63 74 20 61 20 73 74 72 69 6e  onstruct a strin
8510: 67 0a 2a 2a 20 74 68 61 74 20 63 6f 6e 74 61 69  g.** that contai
8520: 6e 73 20 74 68 65 20 74 79 70 65 6e 61 6d 65 20  ns the typename 
8530: 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 61 6e  of the column an
8540: 64 20 73 74 6f 72 65 20 74 68 61 74 20 73 74 72  d store that str
8550: 69 6e 67 0a 2a 2a 20 69 6e 20 7a 54 79 70 65 2e  ing.** in zType.
8560: 0a 2a 2f 20 0a 76 6f 69 64 20 73 71 6c 69 74 65  .*/ .void sqlite
8570: 33 41 64 64 43 6f 6c 75 6d 6e 54 79 70 65 28 50  3AddColumnType(P
8580: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 6f  arse *pParse, To
8590: 6b 65 6e 20 2a 70 54 79 70 65 29 7b 0a 20 20 54  ken *pType){.  T
85a0: 61 62 6c 65 20 2a 70 3b 0a 20 20 69 6e 74 20 69  able *p;.  int i
85b0: 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c  ;.  Column *pCol
85c0: 3b 0a 0a 20 20 69 66 28 20 28 70 20 3d 20 70 50  ;..  if( (p = pP
85d0: 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29  arse->pNewTable)
85e0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
85f0: 69 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20  i = p->nCol-1;. 
8600: 20 69 66 28 20 69 3c 30 20 29 20 72 65 74 75 72   if( i<0 ) retur
8610: 6e 3b 0a 20 20 70 43 6f 6c 20 3d 20 26 70 2d 3e  n;.  pCol = &p->
8620: 61 43 6f 6c 5b 69 5d 3b 0a 20 20 73 71 6c 69 74  aCol[i];.  sqlit
8630: 65 33 5f 66 72 65 65 28 70 43 6f 6c 2d 3e 7a 54  e3_free(pCol->zT
8640: 79 70 65 29 3b 0a 20 20 70 43 6f 6c 2d 3e 7a 54  ype);.  pCol->zT
8650: 79 70 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d  ype = sqlite3Nam
8660: 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 50 61 72 73  eFromToken(pPars
8670: 65 2d 3e 64 62 2c 20 70 54 79 70 65 29 3b 0a 20  e->db, pType);. 
8680: 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 20   pCol->affinity 
8690: 3d 20 73 71 6c 69 74 65 33 41 66 66 69 6e 69 74  = sqlite3Affinit
86a0: 79 54 79 70 65 28 70 54 79 70 65 29 3b 0a 7d 0a  yType(pType);.}.
86b0: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 65 78 70 72 65  ./*.** The expre
86c0: 73 73 69 6f 6e 20 69 73 20 74 68 65 20 64 65 66  ssion is the def
86d0: 61 75 6c 74 20 76 61 6c 75 65 20 66 6f 72 20 74  ault value for t
86e0: 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79  he most recently
86f0: 20 61 64 64 65 64 20 63 6f 6c 75 6d 6e 0a 2a 2a   added column.**
8700: 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 63 75   of the table cu
8710: 72 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f  rrently under co
8720: 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  nstruction..**.*
8730: 2a 20 44 65 66 61 75 6c 74 20 76 61 6c 75 65 20  * Default value 
8740: 65 78 70 72 65 73 73 69 6f 6e 73 20 6d 75 73 74  expressions must
8750: 20 62 65 20 63 6f 6e 73 74 61 6e 74 2e 20 20 52   be constant.  R
8760: 61 69 73 65 20 61 6e 20 65 78 63 65 70 74 69 6f  aise an exceptio
8770: 6e 20 69 66 20 74 68 69 73 0a 2a 2a 20 69 73 20  n if this.** is 
8780: 6e 6f 74 20 74 68 65 20 63 61 73 65 2e 0a 2a 2a  not the case..**
8790: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
87a0: 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68   is called by th
87b0: 65 20 70 61 72 73 65 72 20 77 68 69 6c 65 20 69  e parser while i
87c0: 6e 20 74 68 65 20 6d 69 64 64 6c 65 20 6f 66 0a  n the middle of.
87d0: 2a 2a 20 70 61 72 73 69 6e 67 20 61 20 43 52 45  ** parsing a CRE
87e0: 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d  ATE TABLE statem
87f0: 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ent..*/.void sql
8800: 69 74 65 33 41 64 64 44 65 66 61 75 6c 74 56 61  ite3AddDefaultVa
8810: 6c 75 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  lue(Parse *pPars
8820: 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b  e, Expr *pExpr){
8830: 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 43  .  Table *p;.  C
8840: 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 69  olumn *pCol;.  i
8850: 66 28 20 28 70 20 3d 20 70 50 61 72 73 65 2d 3e  f( (p = pParse->
8860: 70 4e 65 77 54 61 62 6c 65 29 21 3d 30 20 29 7b  pNewTable)!=0 ){
8870: 0a 20 20 20 20 70 43 6f 6c 20 3d 20 26 28 70 2d  .    pCol = &(p-
8880: 3e 61 43 6f 6c 5b 70 2d 3e 6e 43 6f 6c 2d 31 5d  >aCol[p->nCol-1]
8890: 29 3b 0a 20 20 20 20 69 66 28 20 21 73 71 6c 69  );.    if( !sqli
88a0: 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e  te3ExprIsConstan
88b0: 74 4f 72 46 75 6e 63 74 69 6f 6e 28 70 45 78 70  tOrFunction(pExp
88c0: 72 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  r) ){.      sqli
88d0: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
88e0: 73 65 2c 20 22 64 65 66 61 75 6c 74 20 76 61 6c  se, "default val
88f0: 75 65 20 6f 66 20 63 6f 6c 75 6d 6e 20 5b 25 73  ue of column [%s
8900: 5d 20 69 73 20 6e 6f 74 20 63 6f 6e 73 74 61 6e  ] is not constan
8910: 74 22 2c 0a 20 20 20 20 20 20 20 20 20 20 70 43  t",.          pC
8920: 6f 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ol->zName);.    
8930: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 45 78 70  }else{.      Exp
8940: 72 20 2a 70 43 6f 70 79 3b 0a 20 20 20 20 20 20  r *pCopy;.      
8950: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
8960: 61 72 73 65 2d 3e 64 62 3b 0a 20 20 20 20 20 20  arse->db;.      
8970: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
8980: 65 28 70 43 6f 6c 2d 3e 70 44 66 6c 74 29 3b 0a  e(pCol->pDflt);.
8990: 20 20 20 20 20 20 70 43 6f 6c 2d 3e 70 44 66 6c        pCol->pDfl
89a0: 74 20 3d 20 70 43 6f 70 79 20 3d 20 73 71 6c 69  t = pCopy = sqli
89b0: 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70  te3ExprDup(db, p
89c0: 45 78 70 72 29 3b 0a 20 20 20 20 20 20 69 66 28  Expr);.      if(
89d0: 20 70 43 6f 70 79 20 29 7b 0a 20 20 20 20 20 20   pCopy ){.      
89e0: 20 20 73 71 6c 69 74 65 33 54 6f 6b 65 6e 43 6f    sqlite3TokenCo
89f0: 70 79 28 64 62 2c 20 26 70 43 6f 70 79 2d 3e 73  py(db, &pCopy->s
8a00: 70 61 6e 2c 20 26 70 45 78 70 72 2d 3e 73 70 61  pan, &pExpr->spa
8a10: 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  n);.      }.    
8a20: 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45  }.  }.  sqlite3E
8a30: 78 70 72 44 65 6c 65 74 65 28 70 45 78 70 72 29  xprDelete(pExpr)
8a40: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 73 69 67  ;.}../*.** Desig
8a50: 6e 61 74 65 20 74 68 65 20 50 52 49 4d 41 52 59  nate the PRIMARY
8a60: 20 4b 45 59 20 66 6f 72 20 74 68 65 20 74 61 62   KEY for the tab
8a70: 6c 65 2e 20 20 70 4c 69 73 74 20 69 73 20 61 20  le.  pList is a 
8a80: 6c 69 73 74 20 6f 66 20 6e 61 6d 65 73 20 0a 2a  list of names .*
8a90: 2a 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 68 61  * of columns tha
8aa0: 74 20 66 6f 72 6d 20 74 68 65 20 70 72 69 6d 61  t form the prima
8ab0: 72 79 20 6b 65 79 2e 20 20 49 66 20 70 4c 69 73  ry key.  If pLis
8ac0: 74 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20  t is NULL, then 
8ad0: 74 68 65 0a 2a 2a 20 6d 6f 73 74 20 72 65 63 65  the.** most rece
8ae0: 6e 74 6c 79 20 61 64 64 65 64 20 63 6f 6c 75 6d  ntly added colum
8af0: 6e 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 69  n of the table i
8b00: 73 20 74 68 65 20 70 72 69 6d 61 72 79 20 6b 65  s the primary ke
8b10: 79 2e 0a 2a 2a 0a 2a 2a 20 41 20 74 61 62 6c 65  y..**.** A table
8b20: 20 63 61 6e 20 68 61 76 65 20 61 74 20 6d 6f 73   can have at mos
8b30: 74 20 6f 6e 65 20 70 72 69 6d 61 72 79 20 6b 65  t one primary ke
8b40: 79 2e 20 20 49 66 20 74 68 65 20 74 61 62 6c 65  y.  If the table
8b50: 20 61 6c 72 65 61 64 79 20 68 61 73 0a 2a 2a 20   already has.** 
8b60: 61 20 70 72 69 6d 61 72 79 20 6b 65 79 20 28 61  a primary key (a
8b70: 6e 64 20 74 68 69 73 20 69 73 20 74 68 65 20 73  nd this is the s
8b80: 65 63 6f 6e 64 20 70 72 69 6d 61 72 79 20 6b 65  econd primary ke
8b90: 79 29 20 74 68 65 6e 20 63 72 65 61 74 65 20 61  y) then create a
8ba0: 6e 0a 2a 2a 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a  n.** error..**.*
8bb0: 2a 20 49 66 20 74 68 65 20 50 52 49 4d 41 52 59  * If the PRIMARY
8bc0: 20 4b 45 59 20 69 73 20 6f 6e 20 61 20 73 69 6e   KEY is on a sin
8bd0: 67 6c 65 20 63 6f 6c 75 6d 6e 20 77 68 6f 73 65  gle column whose
8be0: 20 64 61 74 61 74 79 70 65 20 69 73 20 49 4e 54   datatype is INT
8bf0: 45 47 45 52 2c 0a 2a 2a 20 74 68 65 6e 20 77 65  EGER,.** then we
8c00: 20 77 69 6c 6c 20 74 72 79 20 74 6f 20 75 73 65   will try to use
8c10: 20 74 68 61 74 20 63 6f 6c 75 6d 6e 20 61 73 20   that column as 
8c20: 74 68 65 20 72 6f 77 69 64 2e 20 20 53 65 74 20  the rowid.  Set 
8c30: 74 68 65 20 54 61 62 6c 65 2e 69 50 4b 65 79 0a  the Table.iPKey.
8c40: 2a 2a 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20  ** field of the 
8c50: 74 61 62 6c 65 20 75 6e 64 65 72 20 63 6f 6e 73  table under cons
8c60: 74 72 75 63 74 69 6f 6e 20 74 6f 20 62 65 20 74  truction to be t
8c70: 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 0a  he index of the.
8c80: 2a 2a 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41  ** INTEGER PRIMA
8c90: 52 59 20 4b 45 59 20 63 6f 6c 75 6d 6e 2e 20 20  RY KEY column.  
8ca0: 54 61 62 6c 65 2e 69 50 4b 65 79 20 69 73 20 73  Table.iPKey is s
8cb0: 65 74 20 74 6f 20 2d 31 20 69 66 20 74 68 65 72  et to -1 if ther
8cc0: 65 20 69 73 0a 2a 2a 20 6e 6f 20 49 4e 54 45 47  e is.** no INTEG
8cd0: 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2e 0a  ER PRIMARY KEY..
8ce0: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6b 65 79  **.** If the key
8cf0: 20 69 73 20 6e 6f 74 20 61 6e 20 49 4e 54 45 47   is not an INTEG
8d00: 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20  ER PRIMARY KEY, 
8d10: 74 68 65 6e 20 63 72 65 61 74 65 20 61 20 75 6e  then create a un
8d20: 69 71 75 65 0a 2a 2a 20 69 6e 64 65 78 20 66 6f  ique.** index fo
8d30: 72 20 74 68 65 20 6b 65 79 2e 20 20 4e 6f 20 69  r the key.  No i
8d40: 6e 64 65 78 20 69 73 20 63 72 65 61 74 65 64 20  ndex is created 
8d50: 66 6f 72 20 49 4e 54 45 47 45 52 20 50 52 49 4d  for INTEGER PRIM
8d60: 41 52 59 20 4b 45 59 73 2e 0a 2a 2f 0a 76 6f 69  ARY KEYs..*/.voi
8d70: 64 20 73 71 6c 69 74 65 33 41 64 64 50 72 69 6d  d sqlite3AddPrim
8d80: 61 72 79 4b 65 79 28 0a 20 20 50 61 72 73 65 20  aryKey(.  Parse 
8d90: 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a 20 50  *pParse,    /* P
8da0: 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
8db0: 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c  /.  ExprList *pL
8dc0: 69 73 74 2c 20 20 2f 2a 20 4c 69 73 74 20 6f 66  ist,  /* List of
8dd0: 20 66 69 65 6c 64 20 6e 61 6d 65 73 20 74 6f 20   field names to 
8de0: 62 65 20 69 6e 64 65 78 65 64 20 2a 2f 0a 20 20  be indexed */.  
8df0: 69 6e 74 20 6f 6e 45 72 72 6f 72 2c 20 20 20 20  int onError,    
8e00: 20 20 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20    /* What to do 
8e10: 77 69 74 68 20 61 20 75 6e 69 71 75 65 6e 65 73  with a uniquenes
8e20: 73 20 63 6f 6e 66 6c 69 63 74 20 2a 2f 0a 20 20  s conflict */.  
8e30: 69 6e 74 20 61 75 74 6f 49 6e 63 2c 20 20 20 20  int autoInc,    
8e40: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65    /* True if the
8e50: 20 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 20 6b   AUTOINCREMENT k
8e60: 65 79 77 6f 72 64 20 69 73 20 70 72 65 73 65 6e  eyword is presen
8e70: 74 20 2a 2f 0a 20 20 69 6e 74 20 73 6f 72 74 4f  t */.  int sortO
8e80: 72 64 65 72 20 20 20 20 20 2f 2a 20 53 51 4c 49  rder     /* SQLI
8e90: 54 45 5f 53 4f 5f 41 53 43 20 6f 72 20 53 51 4c  TE_SO_ASC or SQL
8ea0: 49 54 45 5f 53 4f 5f 44 45 53 43 20 2a 2f 0a 29  ITE_SO_DESC */.)
8eb0: 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20  {.  Table *pTab 
8ec0: 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  = pParse->pNewTa
8ed0: 62 6c 65 3b 0a 20 20 63 68 61 72 20 2a 7a 54 79  ble;.  char *zTy
8ee0: 70 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 43  pe = 0;.  int iC
8ef0: 6f 6c 20 3d 20 2d 31 2c 20 69 3b 0a 20 20 69 66  ol = -1, i;.  if
8f00: 28 20 70 54 61 62 3d 3d 30 20 7c 7c 20 49 4e 5f  ( pTab==0 || IN_
8f10: 44 45 43 4c 41 52 45 5f 56 54 41 42 20 29 20 67  DECLARE_VTAB ) g
8f20: 6f 74 6f 20 70 72 69 6d 61 72 79 5f 6b 65 79 5f  oto primary_key_
8f30: 65 78 69 74 3b 0a 20 20 69 66 28 20 70 54 61 62  exit;.  if( pTab
8f40: 2d 3e 68 61 73 50 72 69 6d 4b 65 79 20 29 7b 0a  ->hasPrimKey ){.
8f50: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
8f60: 4d 73 67 28 70 50 61 72 73 65 2c 20 0a 20 20 20  Msg(pParse, .   
8f70: 20 20 20 22 74 61 62 6c 65 20 5c 22 25 73 5c 22     "table \"%s\"
8f80: 20 68 61 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f   has more than o
8f90: 6e 65 20 70 72 69 6d 61 72 79 20 6b 65 79 22 2c  ne primary key",
8fa0: 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20   pTab->zName);. 
8fb0: 20 20 20 67 6f 74 6f 20 70 72 69 6d 61 72 79 5f     goto primary_
8fc0: 6b 65 79 5f 65 78 69 74 3b 0a 20 20 7d 0a 20 20  key_exit;.  }.  
8fd0: 70 54 61 62 2d 3e 68 61 73 50 72 69 6d 4b 65 79  pTab->hasPrimKey
8fe0: 20 3d 20 31 3b 0a 20 20 69 66 28 20 70 4c 69 73   = 1;.  if( pLis
8ff0: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 69 43 6f 6c  t==0 ){.    iCol
9000: 20 3d 20 70 54 61 62 2d 3e 6e 43 6f 6c 20 2d 20   = pTab->nCol - 
9010: 31 3b 0a 20 20 20 20 70 54 61 62 2d 3e 61 43 6f  1;.    pTab->aCo
9020: 6c 5b 69 43 6f 6c 5d 2e 69 73 50 72 69 6d 4b 65  l[iCol].isPrimKe
9030: 79 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a  y = 1;.  }else{.
9040: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
9050: 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  List->nExpr; i++
9060: 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 69 43 6f  ){.      for(iCo
9070: 6c 3d 30 3b 20 69 43 6f 6c 3c 70 54 61 62 2d 3e  l=0; iCol<pTab->
9080: 6e 43 6f 6c 3b 20 69 43 6f 6c 2b 2b 29 7b 0a 20  nCol; iCol++){. 
9090: 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
90a0: 65 33 53 74 72 49 43 6d 70 28 70 4c 69 73 74 2d  e3StrICmp(pList-
90b0: 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 70 54 61  >a[i].zName, pTa
90c0: 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e  b->aCol[iCol].zN
90d0: 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ame)==0 ){.     
90e0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
90f0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
9100: 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 70 54 61      if( iCol<pTa
9110: 62 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 20  b->nCol ){.     
9120: 20 20 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43     pTab->aCol[iC
9130: 6f 6c 5d 2e 69 73 50 72 69 6d 4b 65 79 20 3d 20  ol].isPrimKey = 
9140: 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  1;.      }.    }
9150: 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 2d 3e  .    if( pList->
9160: 6e 45 78 70 72 3e 31 20 29 20 69 43 6f 6c 20 3d  nExpr>1 ) iCol =
9170: 20 2d 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69   -1;.  }.  if( i
9180: 43 6f 6c 3e 3d 30 20 26 26 20 69 43 6f 6c 3c 70  Col>=0 && iCol<p
9190: 54 61 62 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20  Tab->nCol ){.   
91a0: 20 7a 54 79 70 65 20 3d 20 70 54 61 62 2d 3e 61   zType = pTab->a
91b0: 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 54 79 70 65 3b  Col[iCol].zType;
91c0: 0a 20 20 7d 0a 20 20 69 66 28 20 7a 54 79 70 65  .  }.  if( zType
91d0: 20 26 26 20 73 71 6c 69 74 65 33 53 74 72 49 43   && sqlite3StrIC
91e0: 6d 70 28 7a 54 79 70 65 2c 20 22 49 4e 54 45 47  mp(zType, "INTEG
91f0: 45 52 22 29 3d 3d 30 0a 20 20 20 20 20 20 20 20  ER")==0.        
9200: 26 26 20 73 6f 72 74 4f 72 64 65 72 3d 3d 53 51  && sortOrder==SQ
9210: 4c 49 54 45 5f 53 4f 5f 41 53 43 20 29 7b 0a 20  LITE_SO_ASC ){. 
9220: 20 20 20 70 54 61 62 2d 3e 69 50 4b 65 79 20 3d     pTab->iPKey =
9230: 20 69 43 6f 6c 3b 0a 20 20 20 20 70 54 61 62 2d   iCol;.    pTab-
9240: 3e 6b 65 79 43 6f 6e 66 20 3d 20 6f 6e 45 72 72  >keyConf = onErr
9250: 6f 72 3b 0a 20 20 20 20 70 54 61 62 2d 3e 61 75  or;.    pTab->au
9260: 74 6f 49 6e 63 20 3d 20 61 75 74 6f 49 6e 63 3b  toInc = autoInc;
9270: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 61 75 74  .  }else if( aut
9280: 6f 49 6e 63 20 29 7b 0a 23 69 66 6e 64 65 66 20  oInc ){.#ifndef 
9290: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
92a0: 49 4e 43 52 45 4d 45 4e 54 0a 20 20 20 20 73 71  INCREMENT.    sq
92b0: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
92c0: 61 72 73 65 2c 20 22 41 55 54 4f 49 4e 43 52 45  arse, "AUTOINCRE
92d0: 4d 45 4e 54 20 69 73 20 6f 6e 6c 79 20 61 6c 6c  MENT is only all
92e0: 6f 77 65 64 20 6f 6e 20 61 6e 20 22 0a 20 20 20  owed on an ".   
92f0: 20 20 20 20 22 49 4e 54 45 47 45 52 20 50 52 49      "INTEGER PRI
9300: 4d 41 52 59 20 4b 45 59 22 29 3b 0a 23 65 6e 64  MARY KEY");.#end
9310: 69 66 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  if.  }else{.    
9320: 73 71 6c 69 74 65 33 43 72 65 61 74 65 49 6e 64  sqlite3CreateInd
9330: 65 78 28 70 50 61 72 73 65 2c 20 30 2c 20 30 2c  ex(pParse, 0, 0,
9340: 20 30 2c 20 70 4c 69 73 74 2c 20 6f 6e 45 72 72   0, pList, onErr
9350: 6f 72 2c 20 30 2c 20 30 2c 20 73 6f 72 74 4f 72  or, 0, 0, sortOr
9360: 64 65 72 2c 20 30 29 3b 0a 20 20 20 20 70 4c 69  der, 0);.    pLi
9370: 73 74 20 3d 20 30 3b 0a 20 20 7d 0a 0a 70 72 69  st = 0;.  }..pri
9380: 6d 61 72 79 5f 6b 65 79 5f 65 78 69 74 3a 0a 20  mary_key_exit:. 
9390: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
93a0: 44 65 6c 65 74 65 28 70 4c 69 73 74 29 3b 0a 20  Delete(pList);. 
93b0: 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a   return;.}../*.*
93c0: 2a 20 41 64 64 20 61 20 6e 65 77 20 43 48 45 43  * Add a new CHEC
93d0: 4b 20 63 6f 6e 73 74 72 61 69 6e 74 20 74 6f 20  K constraint to 
93e0: 74 68 65 20 74 61 62 6c 65 20 63 75 72 72 65 6e  the table curren
93f0: 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72  tly under constr
9400: 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20  uction..*/.void 
9410: 73 71 6c 69 74 65 33 41 64 64 43 68 65 63 6b 43  sqlite3AddCheckC
9420: 6f 6e 73 74 72 61 69 6e 74 28 0a 20 20 50 61 72  onstraint(.  Par
9430: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f  se *pParse,    /
9440: 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
9450: 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 43 68  t */.  Expr *pCh
9460: 65 63 6b 45 78 70 72 20 20 2f 2a 20 54 68 65 20  eckExpr  /* The 
9470: 63 68 65 63 6b 20 65 78 70 72 65 73 73 69 6f 6e  check expression
9480: 20 2a 2f 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53   */.){.#ifndef S
9490: 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 48 45 43 4b  QLITE_OMIT_CHECK
94a0: 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d  .  Table *pTab =
94b0: 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
94c0: 6c 65 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  le;.  sqlite3 *d
94d0: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
94e0: 20 20 69 66 28 20 70 54 61 62 20 26 26 20 21 49    if( pTab && !I
94f0: 4e 5f 44 45 43 4c 41 52 45 5f 56 54 41 42 20 29  N_DECLARE_VTAB )
9500: 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 43 48 45  {.    /* The CHE
9510: 43 4b 20 65 78 70 72 65 73 73 69 6f 6e 20 6d 75  CK expression mu
9520: 73 74 20 62 65 20 64 75 70 6c 69 63 61 74 65 64  st be duplicated
9530: 20 73 6f 20 74 68 61 74 20 74 6f 6b 65 6e 73 20   so that tokens 
9540: 72 65 66 65 72 0a 20 20 20 20 2a 2a 20 74 6f 20  refer.    ** to 
9550: 6d 61 6c 6c 6f 63 65 64 20 73 70 61 63 65 20 61  malloced space a
9560: 6e 64 20 6e 6f 74 20 74 68 65 20 28 65 70 68 65  nd not the (ephe
9570: 6d 65 72 61 6c 29 20 74 65 78 74 20 6f 66 20 74  meral) text of t
9580: 68 65 20 43 52 45 41 54 45 20 54 41 42 4c 45 0a  he CREATE TABLE.
9590: 20 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74      ** statement
95a0: 20 2a 2f 0a 20 20 20 20 70 54 61 62 2d 3e 70 43   */.    pTab->pC
95b0: 68 65 63 6b 20 3d 20 73 71 6c 69 74 65 33 45 78  heck = sqlite3Ex
95c0: 70 72 41 6e 64 28 64 62 2c 20 70 54 61 62 2d 3e  prAnd(db, pTab->
95d0: 70 43 68 65 63 6b 2c 20 0a 20 20 20 20 20 20 20  pCheck, .       
95e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
95f0: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
9600: 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 43  e3ExprDup(db, pC
9610: 68 65 63 6b 45 78 70 72 29 29 3b 0a 20 20 7d 0a  heckExpr));.  }.
9620: 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33  #endif.  sqlite3
9630: 45 78 70 72 44 65 6c 65 74 65 28 70 43 68 65 63  ExprDelete(pChec
9640: 6b 45 78 70 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  kExpr);.}../*.**
9650: 20 53 65 74 20 74 68 65 20 63 6f 6c 6c 61 74 69   Set the collati
9660: 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 6f 66 20 74  on function of t
9670: 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79  he most recently
9680: 20 70 61 72 73 65 64 20 74 61 62 6c 65 20 63 6f   parsed table co
9690: 6c 75 6d 6e 0a 2a 2a 20 74 6f 20 74 68 65 20 43  lumn.** to the C
96a0: 6f 6c 6c 53 65 71 20 67 69 76 65 6e 2e 0a 2a 2f  ollSeq given..*/
96b0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 41 64 64  .void sqlite3Add
96c0: 43 6f 6c 6c 61 74 65 54 79 70 65 28 50 61 72 73  CollateType(Pars
96d0: 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e  e *pParse, Token
96e0: 20 2a 70 54 6f 6b 65 6e 29 7b 0a 20 20 54 61 62   *pToken){.  Tab
96f0: 6c 65 20 2a 70 3b 0a 20 20 69 6e 74 20 69 3b 0a  le *p;.  int i;.
9700: 20 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 3b 20 20    char *zColl;  
9710: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
9720: 65 71 75 6f 74 65 64 20 6e 61 6d 65 20 6f 66 20  equoted name of 
9730: 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
9740: 63 65 20 2a 2f 0a 0a 20 20 69 66 28 20 28 70 20  ce */..  if( (p 
9750: 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  = pParse->pNewTa
9760: 62 6c 65 29 3d 3d 30 20 29 20 72 65 74 75 72 6e  ble)==0 ) return
9770: 3b 0a 20 20 69 20 3d 20 70 2d 3e 6e 43 6f 6c 2d  ;.  i = p->nCol-
9780: 31 3b 0a 0a 20 20 7a 43 6f 6c 6c 20 3d 20 73 71  1;..  zColl = sq
9790: 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b  lite3NameFromTok
97a0: 65 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  en(pParse->db, p
97b0: 54 6f 6b 65 6e 29 3b 0a 20 20 69 66 28 20 21 7a  Token);.  if( !z
97c0: 43 6f 6c 6c 20 29 20 72 65 74 75 72 6e 3b 0a 0a  Coll ) return;..
97d0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 4c 6f 63    if( sqlite3Loc
97e0: 61 74 65 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  ateCollSeq(pPars
97f0: 65 2c 20 7a 43 6f 6c 6c 2c 20 2d 31 29 20 29 7b  e, zColl, -1) ){
9800: 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78  .    Index *pIdx
9810: 3b 0a 20 20 20 20 70 2d 3e 61 43 6f 6c 5b 69 5d  ;.    p->aCol[i]
9820: 2e 7a 43 6f 6c 6c 20 3d 20 7a 43 6f 6c 6c 3b 0a  .zColl = zColl;.
9830: 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65    .    /* If the
9840: 20 63 6f 6c 75 6d 6e 20 69 73 20 64 65 63 6c 61   column is decla
9850: 72 65 64 20 61 73 20 22 3c 6e 61 6d 65 3e 20 50  red as "<name> P
9860: 52 49 4d 41 52 59 20 4b 45 59 20 43 4f 4c 4c 41  RIMARY KEY COLLA
9870: 54 45 20 3c 74 79 70 65 3e 22 2c 0a 20 20 20 20  TE <type>",.    
9880: 2a 2a 20 74 68 65 6e 20 61 6e 20 69 6e 64 65 78  ** then an index
9890: 20 6d 61 79 20 68 61 76 65 20 62 65 65 6e 20 63   may have been c
98a0: 72 65 61 74 65 64 20 6f 6e 20 74 68 69 73 20 63  reated on this c
98b0: 6f 6c 75 6d 6e 20 62 65 66 6f 72 65 20 74 68 65  olumn before the
98c0: 0a 20 20 20 20 2a 2a 20 63 6f 6c 6c 61 74 69 6f  .    ** collatio
98d0: 6e 20 74 79 70 65 20 77 61 73 20 61 64 64 65 64  n type was added
98e0: 2e 20 43 6f 72 72 65 63 74 20 74 68 69 73 20 69  . Correct this i
98f0: 66 20 69 74 20 69 73 20 74 68 65 20 63 61 73 65  f it is the case
9900: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72  ..    */.    for
9910: 28 70 49 64 78 3d 70 2d 3e 70 49 6e 64 65 78 3b  (pIdx=p->pIndex;
9920: 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78   pIdx; pIdx=pIdx
9930: 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20  ->pNext){.      
9940: 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e 6e 43  assert( pIdx->nC
9950: 6f 6c 75 6d 6e 3d 3d 31 20 29 3b 0a 20 20 20 20  olumn==1 );.    
9960: 20 20 69 66 28 20 70 49 64 78 2d 3e 61 69 43 6f    if( pIdx->aiCo
9970: 6c 75 6d 6e 5b 30 5d 3d 3d 69 20 29 7b 0a 20 20  lumn[0]==i ){.  
9980: 20 20 20 20 20 20 70 49 64 78 2d 3e 61 7a 43 6f        pIdx->azCo
9990: 6c 6c 5b 30 5d 20 3d 20 70 2d 3e 61 43 6f 6c 5b  ll[0] = p->aCol[
99a0: 69 5d 2e 7a 43 6f 6c 6c 3b 0a 20 20 20 20 20 20  i].zColl;.      
99b0: 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  }.    }.  }else{
99c0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
99d0: 65 28 7a 43 6f 6c 6c 29 3b 0a 20 20 7d 0a 7d 0a  e(zColl);.  }.}.
99e0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
99f0: 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 74 68 65  tion returns the
9a00: 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
9a10: 6e 63 65 20 66 6f 72 20 64 61 74 61 62 61 73 65  nce for database
9a20: 20 6e 61 74 69 76 65 20 74 65 78 74 0a 2a 2a 20   native text.** 
9a30: 65 6e 63 6f 64 69 6e 67 20 69 64 65 6e 74 69 66  encoding identif
9a40: 69 65 64 20 62 79 20 74 68 65 20 73 74 72 69 6e  ied by the strin
9a50: 67 20 7a 4e 61 6d 65 2c 20 6c 65 6e 67 74 68 20  g zName, length 
9a60: 6e 4e 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  nName..**.** If 
9a70: 74 68 65 20 72 65 71 75 65 73 74 65 64 20 63 6f  the requested co
9a80: 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
9a90: 20 69 73 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c   is not availabl
9aa0: 65 2c 20 6f 72 20 6e 6f 74 20 61 76 61 69 6c 61  e, or not availa
9ab0: 62 6c 65 0a 2a 2a 20 69 6e 20 74 68 65 20 64 61  ble.** in the da
9ac0: 74 61 62 61 73 65 20 6e 61 74 69 76 65 20 65 6e  tabase native en
9ad0: 63 6f 64 69 6e 67 2c 20 74 68 65 20 63 6f 6c 6c  coding, the coll
9ae0: 61 74 69 6f 6e 20 66 61 63 74 6f 72 79 20 69 73  ation factory is
9af0: 20 69 6e 76 6f 6b 65 64 20 74 6f 0a 2a 2a 20 72   invoked to.** r
9b00: 65 71 75 65 73 74 20 69 74 2e 20 49 66 20 74 68  equest it. If th
9b10: 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 61 63 74  e collation fact
9b20: 6f 72 79 20 64 6f 65 73 20 6e 6f 74 20 73 75 70  ory does not sup
9b30: 70 6c 79 20 73 75 63 68 20 61 20 73 65 71 75 65  ply such a seque
9b40: 6e 63 65 2c 0a 2a 2a 20 61 6e 64 20 74 68 65 20  nce,.** and the 
9b50: 73 65 71 75 65 6e 63 65 20 69 73 20 61 76 61 69  sequence is avai
9b60: 6c 61 62 6c 65 20 69 6e 20 61 6e 6f 74 68 65 72  lable in another
9b70: 20 74 65 78 74 20 65 6e 63 6f 64 69 6e 67 2c 20   text encoding, 
9b80: 74 68 65 6e 20 74 68 61 74 20 69 73 0a 2a 2a 20  then that is.** 
9b90: 72 65 74 75 72 6e 65 64 20 69 6e 73 74 65 61 64  returned instead
9ba0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 20 76 65  ..**.** If no ve
9bb0: 72 73 69 6f 6e 73 20 6f 66 20 74 68 65 20 72 65  rsions of the re
9bc0: 71 75 65 73 74 65 64 20 63 6f 6c 6c 61 74 69 6f  quested collatio
9bd0: 6e 73 20 73 65 71 75 65 6e 63 65 20 61 72 65 20  ns sequence are 
9be0: 61 76 61 69 6c 61 62 6c 65 2c 20 6f 72 0a 2a 2a  available, or.**
9bf0: 20 61 6e 6f 74 68 65 72 20 65 72 72 6f 72 20 6f   another error o
9c00: 63 63 75 72 73 2c 20 4e 55 4c 4c 20 69 73 20 72  ccurs, NULL is r
9c10: 65 74 75 72 6e 65 64 20 61 6e 64 20 61 6e 20 65  eturned and an e
9c20: 72 72 6f 72 20 6d 65 73 73 61 67 65 20 77 72 69  rror message wri
9c30: 74 74 65 6e 20 69 6e 74 6f 0a 2a 2a 20 70 50 61  tten into.** pPa
9c40: 72 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  rse..**.** This 
9c50: 72 6f 75 74 69 6e 65 20 69 73 20 61 20 77 72 61  routine is a wra
9c60: 70 70 65 72 20 61 72 6f 75 6e 64 20 73 71 6c 69  pper around sqli
9c70: 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28 29  te3FindCollSeq()
9c80: 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a  .  This routine.
9c90: 2a 2a 20 69 6e 76 6f 6b 65 73 20 74 68 65 20 63  ** invokes the c
9ca0: 6f 6c 6c 61 74 69 6f 6e 20 66 61 63 74 6f 72 79  ollation factory
9cb0: 20 69 66 20 74 68 65 20 6e 61 6d 65 64 20 63 6f   if the named co
9cc0: 6c 6c 61 74 69 6f 6e 20 63 61 6e 6e 6f 74 20 62  llation cannot b
9cd0: 65 20 66 6f 75 6e 64 0a 2a 2a 20 61 6e 64 20 67  e found.** and g
9ce0: 65 6e 65 72 61 74 65 73 20 61 6e 20 65 72 72 6f  enerates an erro
9cf0: 72 20 6d 65 73 73 61 67 65 2e 0a 2a 2f 0a 43 6f  r message..*/.Co
9d00: 6c 6c 53 65 71 20 2a 73 71 6c 69 74 65 33 4c 6f  llSeq *sqlite3Lo
9d10: 63 61 74 65 43 6f 6c 6c 53 65 71 28 50 61 72 73  cateCollSeq(Pars
9d20: 65 20 2a 70 50 61 72 73 65 2c 20 63 6f 6e 73 74  e *pParse, const
9d30: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 69 6e   char *zName, in
9d40: 74 20 6e 4e 61 6d 65 29 7b 0a 20 20 73 71 6c 69  t nName){.  sqli
9d50: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
9d60: 2d 3e 64 62 3b 0a 20 20 75 38 20 65 6e 63 20 3d  ->db;.  u8 enc =
9d70: 20 45 4e 43 28 64 62 29 3b 0a 20 20 75 38 20 69   ENC(db);.  u8 i
9d80: 6e 69 74 62 75 73 79 20 3d 20 64 62 2d 3e 69 6e  nitbusy = db->in
9d90: 69 74 2e 62 75 73 79 3b 0a 20 20 43 6f 6c 6c 53  it.busy;.  CollS
9da0: 65 71 20 2a 70 43 6f 6c 6c 3b 0a 0a 20 20 70 43  eq *pColl;..  pC
9db0: 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 46 69 6e  oll = sqlite3Fin
9dc0: 64 43 6f 6c 6c 53 65 71 28 64 62 2c 20 65 6e 63  dCollSeq(db, enc
9dd0: 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 2c 20  , zName, nName, 
9de0: 69 6e 69 74 62 75 73 79 29 3b 0a 20 20 69 66 28  initbusy);.  if(
9df0: 20 21 69 6e 69 74 62 75 73 79 20 26 26 20 28 21   !initbusy && (!
9e00: 70 43 6f 6c 6c 20 7c 7c 20 21 70 43 6f 6c 6c 2d  pColl || !pColl-
9e10: 3e 78 43 6d 70 29 20 29 7b 0a 20 20 20 20 70 43  >xCmp) ){.    pC
9e20: 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 47 65 74  oll = sqlite3Get
9e30: 43 6f 6c 6c 53 65 71 28 64 62 2c 20 70 43 6f 6c  CollSeq(db, pCol
9e40: 6c 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 29  l, zName, nName)
9e50: 3b 0a 20 20 20 20 69 66 28 20 21 70 43 6f 6c 6c  ;.    if( !pColl
9e60: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 4e   ){.      if( nN
9e70: 61 6d 65 3c 30 20 29 7b 0a 20 20 20 20 20 20 20  ame<0 ){.       
9e80: 20 6e 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33   nName = sqlite3
9e90: 53 74 72 6c 65 6e 28 64 62 2c 20 7a 4e 61 6d 65  Strlen(db, zName
9ea0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
9eb0: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
9ec0: 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 73 75 63  (pParse, "no suc
9ed0: 68 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  h collation sequ
9ee0: 65 6e 63 65 3a 20 25 2e 2a 73 22 2c 20 6e 4e 61  ence: %.*s", nNa
9ef0: 6d 65 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  me, zName);.    
9f00: 20 20 70 43 6f 6c 6c 20 3d 20 30 3b 0a 20 20 20    pColl = 0;.   
9f10: 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e   }.  }..  return
9f20: 20 70 43 6f 6c 6c 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a   pColl;.}.../*.*
9f30: 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
9f40: 74 68 61 74 20 77 69 6c 6c 20 69 6e 63 72 65 6d  that will increm
9f50: 65 6e 74 20 74 68 65 20 73 63 68 65 6d 61 20 63  ent the schema c
9f60: 6f 6f 6b 69 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ookie..**.** The
9f70: 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 20 69   schema cookie i
9f80: 73 20 75 73 65 64 20 74 6f 20 64 65 74 65 72 6d  s used to determ
9f90: 69 6e 65 20 77 68 65 6e 20 74 68 65 20 73 63 68  ine when the sch
9fa0: 65 6d 61 20 66 6f 72 20 74 68 65 0a 2a 2a 20 64  ema for the.** d
9fb0: 61 74 61 62 61 73 65 20 63 68 61 6e 67 65 73 2e  atabase changes.
9fc0: 20 20 41 66 74 65 72 20 65 61 63 68 20 73 63 68    After each sch
9fd0: 65 6d 61 20 63 68 61 6e 67 65 2c 20 74 68 65 20  ema change, the 
9fe0: 63 6f 6f 6b 69 65 20 76 61 6c 75 65 0a 2a 2a 20  cookie value.** 
9ff0: 63 68 61 6e 67 65 73 2e 20 20 57 68 65 6e 20 61  changes.  When a
a000: 20 70 72 6f 63 65 73 73 20 66 69 72 73 74 20 72   process first r
a010: 65 61 64 73 20 74 68 65 20 73 63 68 65 6d 61 20  eads the schema 
a020: 69 74 20 72 65 63 6f 72 64 73 20 74 68 65 0a 2a  it records the.*
a030: 2a 20 63 6f 6f 6b 69 65 2e 20 20 54 68 65 72 65  * cookie.  There
a040: 61 66 74 65 72 2c 20 77 68 65 6e 65 76 65 72 20  after, whenever 
a050: 69 74 20 67 6f 65 73 20 74 6f 20 61 63 63 65 73  it goes to acces
a060: 73 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 0a  s the database,.
a070: 2a 2a 20 69 74 20 63 68 65 63 6b 73 20 74 68 65  ** it checks the
a080: 20 63 6f 6f 6b 69 65 20 74 6f 20 6d 61 6b 65 20   cookie to make 
a090: 73 75 72 65 20 74 68 65 20 73 63 68 65 6d 61 20  sure the schema 
a0a0: 68 61 73 20 6e 6f 74 20 63 68 61 6e 67 65 64 0a  has not changed.
a0b0: 2a 2a 20 73 69 6e 63 65 20 69 74 20 77 61 73 20  ** since it was 
a0c0: 6c 61 73 74 20 72 65 61 64 2e 0a 2a 2a 0a 2a 2a  last read..**.**
a0d0: 20 54 68 69 73 20 70 6c 61 6e 20 69 73 20 6e 6f   This plan is no
a0e0: 74 20 63 6f 6d 70 6c 65 74 65 6c 79 20 62 75 6c  t completely bul
a0f0: 6c 65 74 2d 70 72 6f 6f 66 2e 20 20 49 74 20 69  let-proof.  It i
a100: 73 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 0a 2a  s possible for.*
a110: 2a 20 74 68 65 20 73 63 68 65 6d 61 20 74 6f 20  * the schema to 
a120: 63 68 61 6e 67 65 20 6d 75 6c 74 69 70 6c 65 20  change multiple 
a130: 74 69 6d 65 73 20 61 6e 64 20 66 6f 72 20 74 68  times and for th
a140: 65 20 63 6f 6f 6b 69 65 20 74 6f 20 62 65 0a 2a  e cookie to be.*
a150: 2a 20 73 65 74 20 62 61 63 6b 20 74 6f 20 70 72  * set back to pr
a160: 69 6f 72 20 76 61 6c 75 65 2e 20 20 42 75 74 20  ior value.  But 
a170: 73 63 68 65 6d 61 20 63 68 61 6e 67 65 73 20 61  schema changes a
a180: 72 65 20 69 6e 66 72 65 71 75 65 6e 74 0a 2a 2a  re infrequent.**
a190: 20 61 6e 64 20 74 68 65 20 70 72 6f 62 61 62 69   and the probabi
a1a0: 6c 69 74 79 20 6f 66 20 68 69 74 74 69 6e 67 20  lity of hitting 
a1b0: 74 68 65 20 73 61 6d 65 20 63 6f 6f 6b 69 65 20  the same cookie 
a1c0: 76 61 6c 75 65 20 69 73 20 6f 6e 6c 79 0a 2a 2a  value is only.**
a1d0: 20 31 20 63 68 61 6e 63 65 20 69 6e 20 32 5e 33   1 chance in 2^3
a1e0: 32 2e 20 20 53 6f 20 77 65 27 72 65 20 73 61 66  2.  So we're saf
a1f0: 65 20 65 6e 6f 75 67 68 2e 0a 2a 2f 0a 76 6f 69  e enough..*/.voi
a200: 64 20 73 71 6c 69 74 65 33 43 68 61 6e 67 65 43  d sqlite3ChangeC
a210: 6f 6f 6b 69 65 28 50 61 72 73 65 20 2a 70 50 61  ookie(Parse *pPa
a220: 72 73 65 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20  rse, int iDb){. 
a230: 20 69 6e 74 20 72 31 20 3d 20 73 71 6c 69 74 65   int r1 = sqlite
a240: 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
a250: 73 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  se);.  sqlite3 *
a260: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
a270: 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
a280: 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 73 71  rse->pVdbe;.  sq
a290: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
a2a0: 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 64  v, OP_Integer, d
a2b0: 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53 63 68  b->aDb[iDb].pSch
a2c0: 65 6d 61 2d 3e 73 63 68 65 6d 61 5f 63 6f 6f 6b  ema->schema_cook
a2d0: 69 65 2b 31 2c 20 72 31 29 3b 0a 20 20 73 71 6c  ie+1, r1);.  sql
a2e0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
a2f0: 2c 20 4f 50 5f 53 65 74 43 6f 6f 6b 69 65 2c 20  , OP_SetCookie, 
a300: 69 44 62 2c 20 30 2c 20 72 31 29 3b 0a 20 20 73  iDb, 0, r1);.  s
a310: 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
a320: 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29  pReg(pParse, r1)
a330: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 65 61 73 75  ;.}../*.** Measu
a340: 72 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  re the number of
a350: 20 63 68 61 72 61 63 74 65 72 73 20 6e 65 65 64   characters need
a360: 65 64 20 74 6f 20 6f 75 74 70 75 74 20 74 68 65  ed to output the
a370: 20 67 69 76 65 6e 0a 2a 2a 20 69 64 65 6e 74 69   given.** identi
a380: 66 69 65 72 2e 20 20 54 68 65 20 6e 75 6d 62 65  fier.  The numbe
a390: 72 20 72 65 74 75 72 6e 65 64 20 69 6e 63 6c 75  r returned inclu
a3a0: 64 65 73 20 61 6e 79 20 71 75 6f 74 65 73 20 75  des any quotes u
a3b0: 73 65 64 0a 2a 2a 20 62 75 74 20 64 6f 65 73 20  sed.** but does 
a3c0: 6e 6f 74 20 69 6e 63 6c 75 64 65 20 74 68 65 20  not include the 
a3d0: 6e 75 6c 6c 20 74 65 72 6d 69 6e 61 74 6f 72 2e  null terminator.
a3e0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 65 73 74 69 6d  .**.** The estim
a3f0: 61 74 65 20 69 73 20 63 6f 6e 73 65 72 76 61 74  ate is conservat
a400: 69 76 65 2e 20 20 49 74 20 6d 69 67 68 74 20 62  ive.  It might b
a410: 65 20 6c 61 72 67 65 72 20 74 68 61 74 20 77 68  e larger that wh
a420: 61 74 20 69 73 0a 2a 2a 20 72 65 61 6c 6c 79 20  at is.** really 
a430: 6e 65 65 64 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  needed..*/.stati
a440: 63 20 69 6e 74 20 69 64 65 6e 74 4c 65 6e 67 74  c int identLengt
a450: 68 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29  h(const char *z)
a460: 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 66 6f 72  {.  int n;.  for
a470: 28 6e 3d 30 3b 20 2a 7a 3b 20 6e 2b 2b 2c 20 7a  (n=0; *z; n++, z
a480: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 2a 7a 3d  ++){.    if( *z=
a490: 3d 27 22 27 20 29 7b 20 6e 2b 2b 3b 20 7d 0a 20  ='"' ){ n++; }. 
a4a0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 20 2b 20   }.  return n + 
a4b0: 32 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74  2;.}../*.** Writ
a4c0: 65 20 61 6e 20 69 64 65 6e 74 69 66 69 65 72 20  e an identifier 
a4d0: 6f 6e 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20  onto the end of 
a4e0: 74 68 65 20 67 69 76 65 6e 20 73 74 72 69 6e 67  the given string
a4f0: 2e 20 20 41 64 64 0a 2a 2a 20 71 75 6f 74 65 20  .  Add.** quote 
a500: 63 68 61 72 61 63 74 65 72 73 20 61 73 20 6e 65  characters as ne
a510: 65 64 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  eded..*/.static 
a520: 76 6f 69 64 20 69 64 65 6e 74 50 75 74 28 63 68  void identPut(ch
a530: 61 72 20 2a 7a 2c 20 69 6e 74 20 2a 70 49 64 78  ar *z, int *pIdx
a540: 2c 20 63 68 61 72 20 2a 7a 53 69 67 6e 65 64 49  , char *zSignedI
a550: 64 65 6e 74 29 7b 0a 20 20 75 6e 73 69 67 6e 65  dent){.  unsigne
a560: 64 20 63 68 61 72 20 2a 7a 49 64 65 6e 74 20 3d  d char *zIdent =
a570: 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a   (unsigned char*
a580: 29 7a 53 69 67 6e 65 64 49 64 65 6e 74 3b 0a 20  )zSignedIdent;. 
a590: 20 69 6e 74 20 69 2c 20 6a 2c 20 6e 65 65 64 51   int i, j, needQ
a5a0: 75 6f 74 65 3b 0a 20 20 69 20 3d 20 2a 70 49 64  uote;.  i = *pId
a5b0: 78 3b 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 7a 49  x;.  for(j=0; zI
a5c0: 64 65 6e 74 5b 6a 5d 3b 20 6a 2b 2b 29 7b 0a 20  dent[j]; j++){. 
a5d0: 20 20 20 69 66 28 20 21 69 73 61 6c 6e 75 6d 28     if( !isalnum(
a5e0: 7a 49 64 65 6e 74 5b 6a 5d 29 20 26 26 20 7a 49  zIdent[j]) && zI
a5f0: 64 65 6e 74 5b 6a 5d 21 3d 27 5f 27 20 29 20 62  dent[j]!='_' ) b
a600: 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 6e 65 65 64  reak;.  }.  need
a610: 51 75 6f 74 65 20 3d 20 20 7a 49 64 65 6e 74 5b  Quote =  zIdent[
a620: 6a 5d 21 3d 30 20 7c 7c 20 69 73 64 69 67 69 74  j]!=0 || isdigit
a630: 28 7a 49 64 65 6e 74 5b 30 5d 29 0a 20 20 20 20  (zIdent[0]).    
a640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c                ||
a650: 20 73 71 6c 69 74 65 33 4b 65 79 77 6f 72 64 43   sqlite3KeywordC
a660: 6f 64 65 28 7a 49 64 65 6e 74 2c 20 6a 29 21 3d  ode(zIdent, j)!=
a670: 54 4b 5f 49 44 3b 0a 20 20 69 66 28 20 6e 65 65  TK_ID;.  if( nee
a680: 64 51 75 6f 74 65 20 29 20 7a 5b 69 2b 2b 5d 20  dQuote ) z[i++] 
a690: 3d 20 27 22 27 3b 0a 20 20 66 6f 72 28 6a 3d 30  = '"';.  for(j=0
a6a0: 3b 20 7a 49 64 65 6e 74 5b 6a 5d 3b 20 6a 2b 2b  ; zIdent[j]; j++
a6b0: 29 7b 0a 20 20 20 20 7a 5b 69 2b 2b 5d 20 3d 20  ){.    z[i++] = 
a6c0: 7a 49 64 65 6e 74 5b 6a 5d 3b 0a 20 20 20 20 69  zIdent[j];.    i
a6d0: 66 28 20 7a 49 64 65 6e 74 5b 6a 5d 3d 3d 27 22  f( zIdent[j]=='"
a6e0: 27 20 29 20 7a 5b 69 2b 2b 5d 20 3d 20 27 22 27  ' ) z[i++] = '"'
a6f0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 65 65 64  ;.  }.  if( need
a700: 51 75 6f 74 65 20 29 20 7a 5b 69 2b 2b 5d 20 3d  Quote ) z[i++] =
a710: 20 27 22 27 3b 0a 20 20 7a 5b 69 5d 20 3d 20 30   '"';.  z[i] = 0
a720: 3b 0a 20 20 2a 70 49 64 78 20 3d 20 69 3b 0a 7d  ;.  *pIdx = i;.}
a730: 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
a740: 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20   a CREATE TABLE 
a750: 73 74 61 74 65 6d 65 6e 74 20 61 70 70 72 6f 70  statement approp
a760: 72 69 61 74 65 20 66 6f 72 20 74 68 65 20 67 69  riate for the gi
a770: 76 65 6e 0a 2a 2a 20 74 61 62 6c 65 2e 20 20 4d  ven.** table.  M
a780: 65 6d 6f 72 79 20 74 6f 20 68 6f 6c 64 20 74 68  emory to hold th
a790: 65 20 74 65 78 74 20 6f 66 20 74 68 65 20 73 74  e text of the st
a7a0: 61 74 65 6d 65 6e 74 20 69 73 20 6f 62 74 61 69  atement is obtai
a7b0: 6e 65 64 0a 2a 2a 20 66 72 6f 6d 20 73 71 6c 69  ned.** from sqli
a7c0: 74 65 4d 61 6c 6c 6f 63 28 29 20 61 6e 64 20 6d  teMalloc() and m
a7d0: 75 73 74 20 62 65 20 66 72 65 65 64 20 62 79 20  ust be freed by 
a7e0: 74 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63  the calling func
a7f0: 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
a800: 63 68 61 72 20 2a 63 72 65 61 74 65 54 61 62 6c  char *createTabl
a810: 65 53 74 6d 74 28 73 71 6c 69 74 65 33 20 2a 64  eStmt(sqlite3 *d
a820: 62 2c 20 54 61 62 6c 65 20 2a 70 2c 20 69 6e 74  b, Table *p, int
a830: 20 69 73 54 65 6d 70 29 7b 0a 20 20 69 6e 74 20   isTemp){.  int 
a840: 69 2c 20 6b 2c 20 6e 3b 0a 20 20 63 68 61 72 20  i, k, n;.  char 
a850: 2a 7a 53 74 6d 74 3b 0a 20 20 63 68 61 72 20 2a  *zStmt;.  char *
a860: 7a 53 65 70 2c 20 2a 7a 53 65 70 32 2c 20 2a 7a  zSep, *zSep2, *z
a870: 45 6e 64 2c 20 2a 7a 3b 0a 20 20 43 6f 6c 75 6d  End, *z;.  Colum
a880: 6e 20 2a 70 43 6f 6c 3b 0a 20 20 6e 20 3d 20 30  n *pCol;.  n = 0
a890: 3b 0a 20 20 66 6f 72 28 70 43 6f 6c 20 3d 20 70  ;.  for(pCol = p
a8a0: 2d 3e 61 43 6f 6c 2c 20 69 3d 30 3b 20 69 3c 70  ->aCol, i=0; i<p
a8b0: 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f  ->nCol; i++, pCo
a8c0: 6c 2b 2b 29 7b 0a 20 20 20 20 6e 20 2b 3d 20 69  l++){.    n += i
a8d0: 64 65 6e 74 4c 65 6e 67 74 68 28 70 43 6f 6c 2d  dentLength(pCol-
a8e0: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7a 20 3d  >zName);.    z =
a8f0: 20 70 43 6f 6c 2d 3e 7a 54 79 70 65 3b 0a 20 20   pCol->zType;.  
a900: 20 20 69 66 28 20 7a 20 29 7b 0a 20 20 20 20 20    if( z ){.     
a910: 20 6e 20 2b 3d 20 28 73 74 72 6c 65 6e 28 7a 29   n += (strlen(z)
a920: 20 2b 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d   + 1);.    }.  }
a930: 0a 20 20 6e 20 2b 3d 20 69 64 65 6e 74 4c 65 6e  .  n += identLen
a940: 67 74 68 28 70 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  gth(p->zName);. 
a950: 20 69 66 28 20 6e 3c 35 30 20 29 7b 0a 20 20 20   if( n<50 ){.   
a960: 20 7a 53 65 70 20 3d 20 22 22 3b 0a 20 20 20 20   zSep = "";.    
a970: 7a 53 65 70 32 20 3d 20 22 2c 22 3b 0a 20 20 20  zSep2 = ",";.   
a980: 20 7a 45 6e 64 20 3d 20 22 29 22 3b 0a 20 20 7d   zEnd = ")";.  }
a990: 65 6c 73 65 7b 0a 20 20 20 20 7a 53 65 70 20 3d  else{.    zSep =
a9a0: 20 22 5c 6e 20 20 22 3b 0a 20 20 20 20 7a 53 65   "\n  ";.    zSe
a9b0: 70 32 20 3d 20 22 2c 5c 6e 20 20 22 3b 0a 20 20  p2 = ",\n  ";.  
a9c0: 20 20 7a 45 6e 64 20 3d 20 22 5c 6e 29 22 3b 0a    zEnd = "\n)";.
a9d0: 20 20 7d 0a 20 20 6e 20 2b 3d 20 33 35 20 2b 20    }.  n += 35 + 
a9e0: 36 2a 70 2d 3e 6e 43 6f 6c 3b 0a 20 20 7a 53 74  6*p->nCol;.  zSt
a9f0: 6d 74 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c  mt = sqlite3Mall
aa00: 6f 63 28 20 6e 20 29 3b 0a 20 20 69 66 28 20 7a  oc( n );.  if( z
aa10: 53 74 6d 74 3d 3d 30 20 29 7b 0a 20 20 20 20 64  Stmt==0 ){.    d
aa20: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
aa30: 3d 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  = 1;.    return 
aa40: 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  0;.  }.  sqlite3
aa50: 5f 73 6e 70 72 69 6e 74 66 28 6e 2c 20 7a 53 74  _snprintf(n, zSt
aa60: 6d 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  mt,.            
aa70: 20 20 20 20 20 20 21 4f 4d 49 54 5f 54 45 4d 50        !OMIT_TEMP
aa80: 44 42 26 26 69 73 54 65 6d 70 20 3f 20 22 43 52  DB&&isTemp ? "CR
aa90: 45 41 54 45 20 54 45 4d 50 20 54 41 42 4c 45 20  EATE TEMP TABLE 
aaa0: 22 3a 22 43 52 45 41 54 45 20 54 41 42 4c 45 20  ":"CREATE TABLE 
aab0: 22 29 3b 0a 20 20 6b 20 3d 20 73 74 72 6c 65 6e  ");.  k = strlen
aac0: 28 7a 53 74 6d 74 29 3b 0a 20 20 69 64 65 6e 74  (zStmt);.  ident
aad0: 50 75 74 28 7a 53 74 6d 74 2c 20 26 6b 2c 20 70  Put(zStmt, &k, p
aae0: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 7a 53 74 6d  ->zName);.  zStm
aaf0: 74 5b 6b 2b 2b 5d 20 3d 20 27 28 27 3b 0a 20 20  t[k++] = '(';.  
ab00: 66 6f 72 28 70 43 6f 6c 3d 70 2d 3e 61 43 6f 6c  for(pCol=p->aCol
ab10: 2c 20 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6c  , i=0; i<p->nCol
ab20: 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a  ; i++, pCol++){.
ab30: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
ab40: 69 6e 74 66 28 6e 2d 6b 2c 20 26 7a 53 74 6d 74  intf(n-k, &zStmt
ab50: 5b 6b 5d 2c 20 7a 53 65 70 29 3b 0a 20 20 20 20  [k], zSep);.    
ab60: 6b 20 2b 3d 20 73 74 72 6c 65 6e 28 26 7a 53 74  k += strlen(&zSt
ab70: 6d 74 5b 6b 5d 29 3b 0a 20 20 20 20 7a 53 65 70  mt[k]);.    zSep
ab80: 20 3d 20 7a 53 65 70 32 3b 0a 20 20 20 20 69 64   = zSep2;.    id
ab90: 65 6e 74 50 75 74 28 7a 53 74 6d 74 2c 20 26 6b  entPut(zStmt, &k
aba0: 2c 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a  , pCol->zName);.
abb0: 20 20 20 20 69 66 28 20 28 7a 20 3d 20 70 43 6f      if( (z = pCo
abc0: 6c 2d 3e 7a 54 79 70 65 29 21 3d 30 20 29 7b 0a  l->zType)!=0 ){.
abd0: 20 20 20 20 20 20 7a 53 74 6d 74 5b 6b 2b 2b 5d        zStmt[k++]
abe0: 20 3d 20 27 20 27 3b 0a 20 20 20 20 20 20 61 73   = ' ';.      as
abf0: 73 65 72 74 28 20 73 74 72 6c 65 6e 28 7a 29 2b  sert( strlen(z)+
ac00: 6b 2b 31 3c 3d 6e 20 29 3b 0a 20 20 20 20 20 20  k+1<=n );.      
ac10: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
ac20: 28 6e 2d 6b 2c 20 26 7a 53 74 6d 74 5b 6b 5d 2c  (n-k, &zStmt[k],
ac30: 20 22 25 73 22 2c 20 7a 29 3b 0a 20 20 20 20 20   "%s", z);.     
ac40: 20 6b 20 2b 3d 20 73 74 72 6c 65 6e 28 7a 29 3b   k += strlen(z);
ac50: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c  .    }.  }.  sql
ac60: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 2d  ite3_snprintf(n-
ac70: 6b 2c 20 26 7a 53 74 6d 74 5b 6b 5d 2c 20 22 25  k, &zStmt[k], "%
ac80: 73 22 2c 20 7a 45 6e 64 29 3b 0a 20 20 72 65 74  s", zEnd);.  ret
ac90: 75 72 6e 20 7a 53 74 6d 74 3b 0a 7d 0a 0a 2f 2a  urn zStmt;.}../*
aca0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
acb0: 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 72 65   is called to re
acc0: 70 6f 72 74 20 74 68 65 20 66 69 6e 61 6c 20 22  port the final "
acd0: 29 22 20 74 68 61 74 20 74 65 72 6d 69 6e 61 74  )" that terminat
ace0: 65 73 0a 2a 2a 20 61 20 43 52 45 41 54 45 20 54  es.** a CREATE T
acf0: 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a  ABLE statement..
ad00: 2a 2a 0a 2a 2a 20 54 68 65 20 74 61 62 6c 65 20  **.** The table 
ad10: 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20 6f  structure that o
ad20: 74 68 65 72 20 61 63 74 69 6f 6e 20 72 6f 75 74  ther action rout
ad30: 69 6e 65 73 20 68 61 76 65 20 62 65 65 6e 20 62  ines have been b
ad40: 75 69 6c 64 69 6e 67 0a 2a 2a 20 69 73 20 61 64  uilding.** is ad
ad50: 64 65 64 20 74 6f 20 74 68 65 20 69 6e 74 65 72  ded to the inter
ad60: 6e 61 6c 20 68 61 73 68 20 74 61 62 6c 65 73 2c  nal hash tables,
ad70: 20 61 73 73 75 6d 69 6e 67 20 6e 6f 20 65 72 72   assuming no err
ad80: 6f 72 73 20 68 61 76 65 0a 2a 2a 20 6f 63 63 75  ors have.** occu
ad90: 72 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 65  rred..**.** An e
ada0: 6e 74 72 79 20 66 6f 72 20 74 68 65 20 74 61 62  ntry for the tab
adb0: 6c 65 20 69 73 20 6d 61 64 65 20 69 6e 20 74 68  le is made in th
adc0: 65 20 6d 61 73 74 65 72 20 74 61 62 6c 65 20 6f  e master table o
add0: 6e 20 64 69 73 6b 2c 20 75 6e 6c 65 73 73 0a 2a  n disk, unless.*
ade0: 2a 20 74 68 69 73 20 69 73 20 61 20 74 65 6d 70  * this is a temp
adf0: 6f 72 61 72 79 20 74 61 62 6c 65 20 6f 72 20 64  orary table or d
ae00: 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d 31 2e  b->init.busy==1.
ae10: 20 20 57 68 65 6e 20 64 62 2d 3e 69 6e 69 74 2e    When db->init.
ae20: 62 75 73 79 3d 3d 31 0a 2a 2a 20 69 74 20 6d 65  busy==1.** it me
ae30: 61 6e 73 20 77 65 20 61 72 65 20 72 65 61 64 69  ans we are readi
ae40: 6e 67 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61  ng the sqlite_ma
ae50: 73 74 65 72 20 74 61 62 6c 65 20 62 65 63 61 75  ster table becau
ae60: 73 65 20 77 65 20 6a 75 73 74 0a 2a 2a 20 63 6f  se we just.** co
ae70: 6e 6e 65 63 74 65 64 20 74 6f 20 74 68 65 20 64  nnected to the d
ae80: 61 74 61 62 61 73 65 20 6f 72 20 62 65 63 61 75  atabase or becau
ae90: 73 65 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61  se the sqlite_ma
aea0: 73 74 65 72 20 74 61 62 6c 65 20 68 61 73 0a 2a  ster table has.*
aeb0: 2a 20 72 65 63 65 6e 74 6c 79 20 63 68 61 6e 67  * recently chang
aec0: 65 64 2c 20 73 6f 20 74 68 65 20 65 6e 74 72 79  ed, so the entry
aed0: 20 66 6f 72 20 74 68 69 73 20 74 61 62 6c 65 20   for this table 
aee0: 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 20 69  already exists i
aef0: 6e 0a 2a 2a 20 74 68 65 20 73 71 6c 69 74 65 5f  n.** the sqlite_
af00: 6d 61 73 74 65 72 20 74 61 62 6c 65 2e 20 20 57  master table.  W
af10: 65 20 64 6f 20 6e 6f 74 20 77 61 6e 74 20 74 6f  e do not want to
af20: 20 63 72 65 61 74 65 20 69 74 20 61 67 61 69 6e   create it again
af30: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70  ..**.** If the p
af40: 53 65 6c 65 63 74 20 61 72 67 75 6d 65 6e 74 20  Select argument 
af50: 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 69 74 20  is not NULL, it 
af60: 6d 65 61 6e 73 20 74 68 61 74 20 74 68 69 73 20  means that this 
af70: 72 6f 75 74 69 6e 65 0a 2a 2a 20 77 61 73 20 63  routine.** was c
af80: 61 6c 6c 65 64 20 74 6f 20 63 72 65 61 74 65 20  alled to create 
af90: 61 20 74 61 62 6c 65 20 67 65 6e 65 72 61 74 65  a table generate
afa0: 64 20 66 72 6f 6d 20 61 20 0a 2a 2a 20 22 43 52  d from a .** "CR
afb0: 45 41 54 45 20 54 41 42 4c 45 20 2e 2e 2e 20 41  EATE TABLE ... A
afc0: 53 20 53 45 4c 45 43 54 20 2e 2e 2e 22 20 73 74  S SELECT ..." st
afd0: 61 74 65 6d 65 6e 74 2e 20 20 54 68 65 20 63 6f  atement.  The co
afe0: 6c 75 6d 6e 20 6e 61 6d 65 73 20 6f 66 0a 2a 2a  lumn names of.**
aff0: 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20 77   the new table w
b000: 69 6c 6c 20 6d 61 74 63 68 20 74 68 65 20 72 65  ill match the re
b010: 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68 65 20  sult set of the 
b020: 53 45 4c 45 43 54 2e 0a 2a 2f 0a 76 6f 69 64 20  SELECT..*/.void 
b030: 73 71 6c 69 74 65 33 45 6e 64 54 61 62 6c 65 28  sqlite3EndTable(
b040: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
b050: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61  ,          /* Pa
b060: 72 73 65 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  rse context */. 
b070: 20 54 6f 6b 65 6e 20 2a 70 43 6f 6e 73 2c 20 20   Token *pCons,  
b080: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
b090: 27 2c 27 20 74 6f 6b 65 6e 20 61 66 74 65 72 20  ',' token after 
b0a0: 74 68 65 20 6c 61 73 74 20 63 6f 6c 75 6d 6e 20  the last column 
b0b0: 64 65 66 6e 2e 20 2a 2f 0a 20 20 54 6f 6b 65 6e  defn. */.  Token
b0c0: 20 2a 70 45 6e 64 2c 20 20 20 20 20 20 20 20 20   *pEnd,         
b0d0: 20 20 20 2f 2a 20 54 68 65 20 66 69 6e 61 6c 20     /* The final 
b0e0: 27 29 27 20 74 6f 6b 65 6e 20 69 6e 20 74 68 65  ')' token in the
b0f0: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 2a 2f   CREATE TABLE */
b100: 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65  .  Select *pSele
b110: 63 74 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65  ct         /* Se
b120: 6c 65 63 74 20 66 72 6f 6d 20 61 20 22 43 52 45  lect from a "CRE
b130: 41 54 45 20 2e 2e 2e 20 41 53 20 53 45 4c 45 43  ATE ... AS SELEC
b140: 54 22 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65  T" */.){.  Table
b150: 20 2a 70 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a   *p;.  sqlite3 *
b160: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
b170: 0a 20 20 69 6e 74 20 69 44 62 3b 0a 0a 20 20 69  .  int iDb;..  i
b180: 66 28 20 28 70 45 6e 64 3d 3d 30 20 26 26 20 70  f( (pEnd==0 && p
b190: 53 65 6c 65 63 74 3d 3d 30 29 20 7c 7c 20 70 50  Select==0) || pP
b1a0: 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 64 62  arse->nErr || db
b1b0: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
b1c0: 20 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20   {.    return;. 
b1d0: 20 7d 0a 20 20 70 20 3d 20 70 50 61 72 73 65 2d   }.  p = pParse-
b1e0: 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 69 66  >pNewTable;.  if
b1f0: 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ( p==0 ) return;
b200: 0a 0a 20 20 61 73 73 65 72 74 28 20 21 64 62 2d  ..  assert( !db-
b210: 3e 69 6e 69 74 2e 62 75 73 79 20 7c 7c 20 21 70  >init.busy || !p
b220: 53 65 6c 65 63 74 20 29 3b 0a 0a 20 20 69 44 62  Select );..  iDb
b230: 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61   = sqlite3Schema
b240: 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 2d 3e 70  ToIndex(db, p->p
b250: 53 63 68 65 6d 61 29 3b 0a 0a 23 69 66 6e 64 65  Schema);..#ifnde
b260: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 48  f SQLITE_OMIT_CH
b270: 45 43 4b 0a 20 20 2f 2a 20 52 65 73 6f 6c 76 65  ECK.  /* Resolve
b280: 20 6e 61 6d 65 73 20 69 6e 20 61 6c 6c 20 43 48   names in all CH
b290: 45 43 4b 20 63 6f 6e 73 74 72 61 69 6e 74 20 65  ECK constraint e
b2a0: 78 70 72 65 73 73 69 6f 6e 73 2e 0a 20 20 2a 2f  xpressions..  */
b2b0: 0a 20 20 69 66 28 20 70 2d 3e 70 43 68 65 63 6b  .  if( p->pCheck
b2c0: 20 29 7b 0a 20 20 20 20 53 72 63 4c 69 73 74 20   ){.    SrcList 
b2d0: 73 53 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  sSrc;           
b2e0: 20 20 20 20 20 20 20 20 2f 2a 20 46 61 6b 65 20          /* Fake 
b2f0: 53 72 63 4c 69 73 74 20 66 6f 72 20 70 50 61 72  SrcList for pPar
b300: 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 2a 2f  se->pNewTable */
b310: 0a 20 20 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74  .    NameContext
b320: 20 73 4e 43 3b 20 20 20 20 20 20 20 20 20 20 20   sNC;           
b330: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 63 6f 6e       /* Name con
b340: 74 65 78 74 20 66 6f 72 20 70 50 61 72 73 65 2d  text for pParse-
b350: 3e 70 4e 65 77 54 61 62 6c 65 20 2a 2f 0a 0a 20  >pNewTable */.. 
b360: 20 20 20 6d 65 6d 73 65 74 28 26 73 4e 43 2c 20     memset(&sNC, 
b370: 30 2c 20 73 69 7a 65 6f 66 28 73 4e 43 29 29 3b  0, sizeof(sNC));
b380: 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 73 53 72  .    memset(&sSr
b390: 63 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 53 72  c, 0, sizeof(sSr
b3a0: 63 29 29 3b 0a 20 20 20 20 73 53 72 63 2e 6e 53  c));.    sSrc.nS
b3b0: 72 63 20 3d 20 31 3b 0a 20 20 20 20 73 53 72 63  rc = 1;.    sSrc
b3c0: 2e 61 5b 30 5d 2e 7a 4e 61 6d 65 20 3d 20 70 2d  .a[0].zName = p-
b3d0: 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 73 53 72 63  >zName;.    sSrc
b3e0: 2e 61 5b 30 5d 2e 70 54 61 62 20 3d 20 70 3b 0a  .a[0].pTab = p;.
b3f0: 20 20 20 20 73 53 72 63 2e 61 5b 30 5d 2e 69 43      sSrc.a[0].iC
b400: 75 72 73 6f 72 20 3d 20 2d 31 3b 0a 20 20 20 20  ursor = -1;.    
b410: 73 4e 43 2e 70 50 61 72 73 65 20 3d 20 70 50 61  sNC.pParse = pPa
b420: 72 73 65 3b 0a 20 20 20 20 73 4e 43 2e 70 53 72  rse;.    sNC.pSr
b430: 63 4c 69 73 74 20 3d 20 26 73 53 72 63 3b 0a 20  cList = &sSrc;. 
b440: 20 20 20 73 4e 43 2e 69 73 43 68 65 63 6b 20 3d     sNC.isCheck =
b450: 20 31 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69   1;.    if( sqli
b460: 74 65 33 45 78 70 72 52 65 73 6f 6c 76 65 4e 61  te3ExprResolveNa
b470: 6d 65 73 28 26 73 4e 43 2c 20 70 2d 3e 70 43 68  mes(&sNC, p->pCh
b480: 65 63 6b 29 20 29 7b 0a 20 20 20 20 20 20 72 65  eck) ){.      re
b490: 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  turn;.    }.  }.
b4a0: 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e  #endif /* !defin
b4b0: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  ed(SQLITE_OMIT_C
b4c0: 48 45 43 4b 29 20 2a 2f 0a 0a 20 20 2f 2a 20 49  HECK) */..  /* I
b4d0: 66 20 74 68 65 20 64 62 2d 3e 69 6e 69 74 2e 62  f the db->init.b
b4e0: 75 73 79 20 69 73 20 31 20 69 74 20 6d 65 61 6e  usy is 1 it mean
b4f0: 73 20 77 65 20 61 72 65 20 72 65 61 64 69 6e 67  s we are reading
b500: 20 74 68 65 20 53 51 4c 20 6f 66 66 20 74 68 65   the SQL off the
b510: 0a 20 20 2a 2a 20 22 73 71 6c 69 74 65 5f 6d 61  .  ** "sqlite_ma
b520: 73 74 65 72 22 20 6f 72 20 22 73 71 6c 69 74 65  ster" or "sqlite
b530: 5f 74 65 6d 70 5f 6d 61 73 74 65 72 22 20 74 61  _temp_master" ta
b540: 62 6c 65 20 6f 6e 20 74 68 65 20 64 69 73 6b 2e  ble on the disk.
b550: 0a 20 20 2a 2a 20 53 6f 20 64 6f 20 6e 6f 74 20  .  ** So do not 
b560: 77 72 69 74 65 20 74 6f 20 74 68 65 20 64 69 73  write to the dis
b570: 6b 20 61 67 61 69 6e 2e 20 20 45 78 74 72 61 63  k again.  Extrac
b580: 74 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20  t the root page 
b590: 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 66 6f 72 20  number.  ** for 
b5a0: 74 68 65 20 74 61 62 6c 65 20 66 72 6f 6d 20 74  the table from t
b5b0: 68 65 20 64 62 2d 3e 69 6e 69 74 2e 6e 65 77 54  he db->init.newT
b5c0: 6e 75 6d 20 66 69 65 6c 64 2e 20 20 28 54 68 65  num field.  (The
b5d0: 20 70 61 67 65 20 6e 75 6d 62 65 72 0a 20 20 2a   page number.  *
b5e0: 2a 20 73 68 6f 75 6c 64 20 68 61 76 65 20 62 65  * should have be
b5f0: 65 6e 20 70 75 74 20 74 68 65 72 65 20 62 79 20  en put there by 
b600: 74 68 65 20 73 71 6c 69 74 65 4f 70 65 6e 43 62  the sqliteOpenCb
b610: 20 72 6f 75 74 69 6e 65 2e 29 0a 20 20 2a 2f 0a   routine.).  */.
b620: 20 20 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62    if( db->init.b
b630: 75 73 79 20 29 7b 0a 20 20 20 20 70 2d 3e 74 6e  usy ){.    p->tn
b640: 75 6d 20 3d 20 64 62 2d 3e 69 6e 69 74 2e 6e 65  um = db->init.ne
b650: 77 54 6e 75 6d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  wTnum;.  }..  /*
b660: 20 49 66 20 6e 6f 74 20 69 6e 69 74 69 61 6c 69   If not initiali
b670: 7a 69 6e 67 2c 20 74 68 65 6e 20 63 72 65 61 74  zing, then creat
b680: 65 20 61 20 72 65 63 6f 72 64 20 66 6f 72 20 74  e a record for t
b690: 68 65 20 6e 65 77 20 74 61 62 6c 65 0a 20 20 2a  he new table.  *
b6a0: 2a 20 69 6e 20 74 68 65 20 53 51 4c 49 54 45 5f  * in the SQLITE_
b6b0: 4d 41 53 54 45 52 20 74 61 62 6c 65 20 6f 66 20  MASTER table of 
b6c0: 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 54  the database.  T
b6d0: 68 65 20 72 65 63 6f 72 64 20 6e 75 6d 62 65 72  he record number
b6e0: 0a 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 6e 65  .  ** for the ne
b6f0: 77 20 74 61 62 6c 65 20 65 6e 74 72 79 20 73 68  w table entry sh
b700: 6f 75 6c 64 20 61 6c 72 65 61 64 79 20 62 65 20  ould already be 
b710: 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e 0a 20 20  on the stack..  
b720: 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68 69 73 20  **.  ** If this 
b730: 69 73 20 61 20 54 45 4d 50 4f 52 41 52 59 20 74  is a TEMPORARY t
b740: 61 62 6c 65 2c 20 77 72 69 74 65 20 74 68 65 20  able, write the 
b750: 65 6e 74 72 79 20 69 6e 74 6f 20 74 68 65 20 61  entry into the a
b760: 75 78 69 6c 69 61 72 79 0a 20 20 2a 2a 20 66 69  uxiliary.  ** fi
b770: 6c 65 20 69 6e 73 74 65 61 64 20 6f 66 20 69 6e  le instead of in
b780: 74 6f 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61  to the main data
b790: 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a  base file..  */.
b7a0: 20 20 69 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e    if( !db->init.
b7b0: 62 75 73 79 20 29 7b 0a 20 20 20 20 69 6e 74 20  busy ){.    int 
b7c0: 6e 3b 0a 20 20 20 20 56 64 62 65 20 2a 76 3b 0a  n;.    Vdbe *v;.
b7d0: 20 20 20 20 63 68 61 72 20 2a 7a 54 79 70 65 3b      char *zType;
b7e0: 20 20 20 20 2f 2a 20 22 76 69 65 77 22 20 6f 72      /* "view" or
b7f0: 20 22 74 61 62 6c 65 22 20 2a 2f 0a 20 20 20 20   "table" */.    
b800: 63 68 61 72 20 2a 7a 54 79 70 65 32 3b 20 20 20  char *zType2;   
b810: 2f 2a 20 22 56 49 45 57 22 20 6f 72 20 22 54 41  /* "VIEW" or "TA
b820: 42 4c 45 22 20 2a 2f 0a 20 20 20 20 63 68 61 72  BLE" */.    char
b830: 20 2a 7a 53 74 6d 74 3b 20 20 20 20 2f 2a 20 54   *zStmt;    /* T
b840: 65 78 74 20 6f 66 20 74 68 65 20 43 52 45 41 54  ext of the CREAT
b850: 45 20 54 41 42 4c 45 20 6f 72 20 43 52 45 41 54  E TABLE or CREAT
b860: 45 20 56 49 45 57 20 73 74 61 74 65 6d 65 6e 74  E VIEW statement
b870: 20 2a 2f 0a 0a 20 20 20 20 76 20 3d 20 73 71 6c   */..    v = sql
b880: 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
b890: 73 65 29 3b 0a 20 20 20 20 69 66 28 20 76 3d 3d  se);.    if( v==
b8a0: 30 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 20  0 ) return;..   
b8b0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
b8c0: 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20  p1(v, OP_Close, 
b8d0: 30 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61  0);..    /* Crea
b8e0: 74 65 20 74 68 65 20 72 6f 6f 74 70 61 67 65 20  te the rootpage 
b8f0: 66 6f 72 20 74 68 65 20 6e 65 77 20 74 61 62 6c  for the new tabl
b900: 65 20 61 6e 64 20 70 75 73 68 20 69 74 20 6f 6e  e and push it on
b910: 74 6f 20 74 68 65 20 73 74 61 63 6b 2e 0a 20 20  to the stack..  
b920: 20 20 2a 2a 20 41 20 76 69 65 77 20 68 61 73 20    ** A view has 
b930: 6e 6f 20 72 6f 6f 74 70 61 67 65 2c 20 73 6f 20  no rootpage, so 
b940: 6a 75 73 74 20 70 75 73 68 20 61 20 7a 65 72 6f  just push a zero
b950: 20 6f 6e 74 6f 20 74 68 65 20 73 74 61 63 6b 20   onto the stack 
b960: 66 6f 72 0a 20 20 20 20 2a 2a 20 76 69 65 77 73  for.    ** views
b970: 2e 20 20 49 6e 69 74 69 61 6c 69 7a 65 20 7a 54  .  Initialize zT
b980: 79 70 65 20 61 74 20 74 68 65 20 73 61 6d 65 20  ype at the same 
b990: 74 69 6d 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  time..    */.   
b9a0: 20 69 66 28 20 70 2d 3e 70 53 65 6c 65 63 74 3d   if( p->pSelect=
b9b0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41  =0 ){.      /* A
b9c0: 20 72 65 67 75 6c 61 72 20 74 61 62 6c 65 20 2a   regular table *
b9d0: 2f 0a 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20  /.      zType = 
b9e0: 22 74 61 62 6c 65 22 3b 0a 20 20 20 20 20 20 7a  "table";.      z
b9f0: 54 79 70 65 32 20 3d 20 22 54 41 42 4c 45 22 3b  Type2 = "TABLE";
ba00: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
ba10: 4f 4d 49 54 5f 56 49 45 57 0a 20 20 20 20 7d 65  OMIT_VIEW.    }e
ba20: 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 41 20  lse{.      /* A 
ba30: 76 69 65 77 20 2a 2f 0a 20 20 20 20 20 20 7a 54  view */.      zT
ba40: 79 70 65 20 3d 20 22 76 69 65 77 22 3b 0a 20 20  ype = "view";.  
ba50: 20 20 20 20 7a 54 79 70 65 32 20 3d 20 22 56 49      zType2 = "VI
ba60: 45 57 22 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  EW";.#endif.    
ba70: 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69  }..    /* If thi
ba80: 73 20 69 73 20 61 20 43 52 45 41 54 45 20 54 41  s is a CREATE TA
ba90: 42 4c 45 20 78 78 20 41 53 20 53 45 4c 45 43 54  BLE xx AS SELECT
baa0: 20 2e 2e 2e 2c 20 65 78 65 63 75 74 65 20 74 68   ..., execute th
bab0: 65 20 53 45 4c 45 43 54 0a 20 20 20 20 2a 2a 20  e SELECT.    ** 
bac0: 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 70 6f 70  statement to pop
bad0: 75 6c 61 74 65 20 74 68 65 20 6e 65 77 20 74 61  ulate the new ta
bae0: 62 6c 65 2e 20 54 68 65 20 72 6f 6f 74 2d 70 61  ble. The root-pa
baf0: 67 65 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68  ge number for th
bb00: 65 0a 20 20 20 20 2a 2a 20 6e 65 77 20 74 61 62  e.    ** new tab
bb10: 6c 65 20 69 73 20 6f 6e 20 74 68 65 20 74 6f 70  le is on the top
bb20: 20 6f 66 20 74 68 65 20 76 64 62 65 20 73 74 61   of the vdbe sta
bb30: 63 6b 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ck..    **.    *
bb40: 2a 20 4f 6e 63 65 20 74 68 65 20 53 45 4c 45 43  * Once the SELEC
bb50: 54 20 68 61 73 20 62 65 65 6e 20 63 6f 64 65 64  T has been coded
bb60: 20 62 79 20 73 71 6c 69 74 65 33 53 65 6c 65 63   by sqlite3Selec
bb70: 74 28 29 2c 20 69 74 20 69 73 20 69 6e 20 61 0a  t(), it is in a.
bb80: 20 20 20 20 2a 2a 20 73 75 69 74 61 62 6c 65 20      ** suitable 
bb90: 73 74 61 74 65 20 74 6f 20 71 75 65 72 79 20 66  state to query f
bba0: 6f 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61  or the column na
bbb0: 6d 65 73 20 61 6e 64 20 74 79 70 65 73 20 74 6f  mes and types to
bbc0: 20 62 65 20 75 73 65 64 0a 20 20 20 20 2a 2a 20   be used.    ** 
bbd0: 62 79 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65  by the new table
bbe0: 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
bbf0: 41 20 73 68 61 72 65 64 2d 63 61 63 68 65 20 77  A shared-cache w
bc00: 72 69 74 65 2d 6c 6f 63 6b 20 69 73 20 6e 6f 74  rite-lock is not
bc10: 20 72 65 71 75 69 72 65 64 20 74 6f 20 77 72 69   required to wri
bc20: 74 65 20 74 6f 20 74 68 65 20 6e 65 77 20 74 61  te to the new ta
bc30: 62 6c 65 2c 0a 20 20 20 20 2a 2a 20 61 73 20 61  ble,.    ** as a
bc40: 20 73 63 68 65 6d 61 2d 6c 6f 63 6b 20 6d 75 73   schema-lock mus
bc50: 74 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62  t have already b
bc60: 65 65 6e 20 6f 62 74 61 69 6e 65 64 20 74 6f 20  een obtained to 
bc70: 63 72 65 61 74 65 20 69 74 2e 20 53 69 6e 63 65  create it. Since
bc80: 0a 20 20 20 20 2a 2a 20 61 20 73 63 68 65 6d 61  .    ** a schema
bc90: 2d 6c 6f 63 6b 20 65 78 63 6c 75 64 65 73 20 61  -lock excludes a
bca0: 6c 6c 20 6f 74 68 65 72 20 64 61 74 61 62 61 73  ll other databas
bcb0: 65 20 75 73 65 72 73 2c 20 74 68 65 20 77 72 69  e users, the wri
bcc0: 74 65 2d 6c 6f 63 6b 20 77 6f 75 6c 64 0a 20 20  te-lock would.  
bcd0: 20 20 2a 2a 20 62 65 20 72 65 64 75 6e 64 61 6e    ** be redundan
bce0: 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  t..    */.    if
bcf0: 28 20 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20  ( pSelect ){.   
bd00: 20 20 20 53 65 6c 65 63 74 44 65 73 74 20 64 65     SelectDest de
bd10: 73 74 3b 0a 20 20 20 20 20 20 54 61 62 6c 65 20  st;.      Table 
bd20: 2a 70 53 65 6c 54 61 62 3b 0a 0a 20 20 20 20 20  *pSelTab;..     
bd30: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
bd40: 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 57 72 69  p3(v, OP_OpenWri
bd50: 74 65 2c 20 31 2c 20 70 50 61 72 73 65 2d 3e 72  te, 1, pParse->r
bd60: 65 67 52 6f 6f 74 2c 20 69 44 62 29 3b 0a 20 20  egRoot, iDb);.  
bd70: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
bd80: 68 61 6e 67 65 50 35 28 76 2c 20 31 29 3b 0a 20  hangeP5(v, 1);. 
bd90: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 54 61       pParse->nTa
bda0: 62 20 3d 20 32 3b 0a 20 20 20 20 20 20 73 71 6c  b = 2;.      sql
bdb0: 69 74 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e  ite3SelectDestIn
bdc0: 69 74 28 26 64 65 73 74 2c 20 53 52 54 5f 54 61  it(&dest, SRT_Ta
bdd0: 62 6c 65 2c 20 31 29 3b 0a 20 20 20 20 20 20 73  ble, 1);.      s
bde0: 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61  qlite3Select(pPa
bdf0: 72 73 65 2c 20 70 53 65 6c 65 63 74 2c 20 26 64  rse, pSelect, &d
be00: 65 73 74 2c 20 30 2c 20 30 2c 20 30 2c 20 30 29  est, 0, 0, 0, 0)
be10: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
be20: 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
be30: 43 6c 6f 73 65 2c 20 31 29 3b 0a 20 20 20 20 20  Close, 1);.     
be40: 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72   if( pParse->nEr
be50: 72 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  r==0 ){.        
be60: 70 53 65 6c 54 61 62 20 3d 20 73 71 6c 69 74 65  pSelTab = sqlite
be70: 33 52 65 73 75 6c 74 53 65 74 4f 66 53 65 6c 65  3ResultSetOfSele
be80: 63 74 28 70 50 61 72 73 65 2c 20 30 2c 20 70 53  ct(pParse, 0, pS
be90: 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 20 20  elect);.        
bea0: 69 66 28 20 70 53 65 6c 54 61 62 3d 3d 30 20 29  if( pSelTab==0 )
beb0: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 20   return;.       
bec0: 20 61 73 73 65 72 74 28 20 70 2d 3e 61 43 6f 6c   assert( p->aCol
bed0: 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 70  ==0 );.        p
bee0: 2d 3e 6e 43 6f 6c 20 3d 20 70 53 65 6c 54 61 62  ->nCol = pSelTab
bef0: 2d 3e 6e 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20  ->nCol;.        
bf00: 70 2d 3e 61 43 6f 6c 20 3d 20 70 53 65 6c 54 61  p->aCol = pSelTa
bf10: 62 2d 3e 61 43 6f 6c 3b 0a 20 20 20 20 20 20 20  b->aCol;.       
bf20: 20 70 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c 20 3d   pSelTab->nCol =
bf30: 20 30 3b 0a 20 20 20 20 20 20 20 20 70 53 65 6c   0;.        pSel
bf40: 54 61 62 2d 3e 61 43 6f 6c 20 3d 20 30 3b 0a 20  Tab->aCol = 0;. 
bf50: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65         sqlite3De
bf60: 6c 65 74 65 54 61 62 6c 65 28 70 53 65 6c 54 61  leteTable(pSelTa
bf70: 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  b);.      }.    
bf80: 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d 70 75 74  }..    /* Comput
bf90: 65 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 74  e the complete t
bfa0: 65 78 74 20 6f 66 20 74 68 65 20 43 52 45 41 54  ext of the CREAT
bfb0: 45 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20  E statement */. 
bfc0: 20 20 20 69 66 28 20 70 53 65 6c 65 63 74 20 29     if( pSelect )
bfd0: 7b 0a 20 20 20 20 20 20 7a 53 74 6d 74 20 3d 20  {.      zStmt = 
bfe0: 63 72 65 61 74 65 54 61 62 6c 65 53 74 6d 74 28  createTableStmt(
bff0: 64 62 2c 20 70 2c 20 70 2d 3e 70 53 63 68 65 6d  db, p, p->pSchem
c000: 61 3d 3d 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 53  a==db->aDb[1].pS
c010: 63 68 65 6d 61 29 3b 0a 20 20 20 20 7d 65 6c 73  chema);.    }els
c020: 65 7b 0a 20 20 20 20 20 20 6e 20 3d 20 70 45 6e  e{.      n = pEn
c030: 64 2d 3e 7a 20 2d 20 70 50 61 72 73 65 2d 3e 73  d->z - pParse->s
c040: 4e 61 6d 65 54 6f 6b 65 6e 2e 7a 20 2b 20 31 3b  NameToken.z + 1;
c050: 0a 20 20 20 20 20 20 7a 53 74 6d 74 20 3d 20 73  .      zStmt = s
c060: 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62  qlite3MPrintf(db
c070: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 22 43 52  , .          "CR
c080: 45 41 54 45 20 25 73 20 25 2e 2a 73 22 2c 20 7a  EATE %s %.*s", z
c090: 54 79 70 65 32 2c 20 6e 2c 20 70 50 61 72 73 65  Type2, n, pParse
c0a0: 2d 3e 73 4e 61 6d 65 54 6f 6b 65 6e 2e 7a 0a 20  ->sNameToken.z. 
c0b0: 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 0a 20       );.    }.. 
c0c0: 20 20 20 2f 2a 20 41 20 73 6c 6f 74 20 66 6f 72     /* A slot for
c0d0: 20 74 68 65 20 72 65 63 6f 72 64 20 68 61 73 20   the record has 
c0e0: 61 6c 72 65 61 64 79 20 62 65 65 6e 20 61 6c 6c  already been all
c0f0: 6f 63 61 74 65 64 20 69 6e 20 74 68 65 20 0a 20  ocated in the . 
c100: 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 4d 41 53     ** SQLITE_MAS
c110: 54 45 52 20 74 61 62 6c 65 2e 20 20 57 65 20 6a  TER table.  We j
c120: 75 73 74 20 6e 65 65 64 20 74 6f 20 75 70 64 61  ust need to upda
c130: 74 65 20 74 68 61 74 20 73 6c 6f 74 20 77 69 74  te that slot wit
c140: 68 20 61 6c 6c 0a 20 20 20 20 2a 2a 20 74 68 65  h all.    ** the
c150: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 77 65 27   information we'
c160: 76 65 20 63 6f 6c 6c 65 63 74 65 64 2e 20 20 54  ve collected.  T
c170: 68 65 20 72 6f 77 69 64 20 66 6f 72 20 74 68 65  he rowid for the
c180: 20 70 72 65 61 6c 6c 6f 63 61 74 65 64 0a 20 20   preallocated.  
c190: 20 20 2a 2a 20 73 6c 6f 74 20 69 73 20 74 68 65    ** slot is the
c1a0: 20 32 6e 64 20 69 74 65 6d 20 6f 6e 20 74 68 65   2nd item on the
c1b0: 20 73 74 61 63 6b 2e 20 20 54 68 65 20 74 6f 70   stack.  The top
c1c0: 20 6f 66 20 74 68 65 20 73 74 61 63 6b 20 69 73   of the stack is
c1d0: 20 74 68 65 0a 20 20 20 20 2a 2a 20 72 6f 6f 74   the.    ** root
c1e0: 20 70 61 67 65 20 66 6f 72 20 74 68 65 20 6e 65   page for the ne
c1f0: 77 20 74 61 62 6c 65 20 28 6f 72 20 61 20 30 20  w table (or a 0 
c200: 69 66 20 74 68 69 73 20 69 73 20 61 20 76 69 65  if this is a vie
c210: 77 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73  w)..    */.    s
c220: 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72 73  qlite3NestedPars
c230: 65 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20  e(pParse,.      
c240: 22 55 50 44 41 54 45 20 25 51 2e 25 73 20 22 0a  "UPDATE %Q.%s ".
c250: 20 20 20 20 20 20 20 20 20 22 53 45 54 20 74 79           "SET ty
c260: 70 65 3d 27 25 73 27 2c 20 6e 61 6d 65 3d 25 51  pe='%s', name=%Q
c270: 2c 20 74 62 6c 5f 6e 61 6d 65 3d 25 51 2c 20 72  , tbl_name=%Q, r
c280: 6f 6f 74 70 61 67 65 3d 23 25 64 2c 20 73 71 6c  ootpage=#%d, sql
c290: 3d 25 51 20 22 0a 20 20 20 20 20 20 20 22 57 48  =%Q ".       "WH
c2a0: 45 52 45 20 72 6f 77 69 64 3d 23 25 64 22 2c 0a  ERE rowid=#%d",.
c2b0: 20 20 20 20 20 20 64 62 2d 3e 61 44 62 5b 69 44        db->aDb[iD
c2c0: 62 5d 2e 7a 4e 61 6d 65 2c 20 53 43 48 45 4d 41  b].zName, SCHEMA
c2d0: 5f 54 41 42 4c 45 28 69 44 62 29 2c 0a 20 20 20  _TABLE(iDb),.   
c2e0: 20 20 20 7a 54 79 70 65 2c 0a 20 20 20 20 20 20     zType,.      
c2f0: 70 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20  p->zName,.      
c300: 70 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20  p->zName,.      
c310: 70 50 61 72 73 65 2d 3e 72 65 67 52 6f 6f 74 2c  pParse->regRoot,
c320: 0a 20 20 20 20 20 20 7a 53 74 6d 74 2c 0a 20 20  .      zStmt,.  
c330: 20 20 20 20 70 50 61 72 73 65 2d 3e 72 65 67 52      pParse->regR
c340: 6f 77 69 64 0a 20 20 20 20 29 3b 0a 20 20 20 20  owid.    );.    
c350: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 53 74  sqlite3_free(zSt
c360: 6d 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  mt);.    sqlite3
c370: 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28 70 50 61  ChangeCookie(pPa
c380: 72 73 65 2c 20 69 44 62 29 3b 0a 0a 23 69 66 6e  rse, iDb);..#ifn
c390: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
c3a0: 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 0a 20 20  AUTOINCREMENT.  
c3b0: 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65    /* Check to se
c3c0: 65 20 69 66 20 77 65 20 6e 65 65 64 20 74 6f 20  e if we need to 
c3d0: 63 72 65 61 74 65 20 61 6e 20 73 71 6c 69 74 65  create an sqlite
c3e0: 5f 73 65 71 75 65 6e 63 65 20 74 61 62 6c 65 20  _sequence table 
c3f0: 66 6f 72 0a 20 20 20 20 2a 2a 20 6b 65 65 70 69  for.    ** keepi
c400: 6e 67 20 74 72 61 63 6b 20 6f 66 20 61 75 74 6f  ng track of auto
c410: 69 6e 63 72 65 6d 65 6e 74 20 6b 65 79 73 2e 0a  increment keys..
c420: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
c430: 2d 3e 61 75 74 6f 49 6e 63 20 29 7b 0a 20 20 20  ->autoInc ){.   
c440: 20 20 20 44 62 20 2a 70 44 62 20 3d 20 26 64 62     Db *pDb = &db
c450: 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a 20 20 20 20  ->aDb[iDb];.    
c460: 20 20 69 66 28 20 70 44 62 2d 3e 70 53 63 68 65    if( pDb->pSche
c470: 6d 61 2d 3e 70 53 65 71 54 61 62 3d 3d 30 20 29  ma->pSeqTab==0 )
c480: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
c490: 33 4e 65 73 74 65 64 50 61 72 73 65 28 70 50 61  3NestedParse(pPa
c4a0: 72 73 65 2c 0a 20 20 20 20 20 20 20 20 20 20 22  rse,.          "
c4b0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 25 51 2e  CREATE TABLE %Q.
c4c0: 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 28  sqlite_sequence(
c4d0: 6e 61 6d 65 2c 73 65 71 29 22 2c 0a 20 20 20 20  name,seq)",.    
c4e0: 20 20 20 20 20 20 70 44 62 2d 3e 7a 4e 61 6d 65        pDb->zName
c4f0: 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20  .        );.    
c500: 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66    }.    }.#endif
c510: 0a 0a 20 20 20 20 2f 2a 20 52 65 70 61 72 73 65  ..    /* Reparse
c520: 20 65 76 65 72 79 74 68 69 6e 67 20 74 6f 20 75   everything to u
c530: 70 64 61 74 65 20 6f 75 72 20 69 6e 74 65 72 6e  pdate our intern
c540: 61 6c 20 64 61 74 61 20 73 74 72 75 63 74 75 72  al data structur
c550: 65 73 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65  es */.    sqlite
c560: 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
c570: 50 5f 50 61 72 73 65 53 63 68 65 6d 61 2c 20 69  P_ParseSchema, i
c580: 44 62 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20 20  Db, 0, 0,.      
c590: 20 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66    sqlite3MPrintf
c5a0: 28 64 62 2c 20 22 74 62 6c 5f 6e 61 6d 65 3d 27  (db, "tbl_name='
c5b0: 25 71 27 22 2c 70 2d 3e 7a 4e 61 6d 65 29 2c 20  %q'",p->zName), 
c5c0: 50 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 7d  P4_DYNAMIC);.  }
c5d0: 0a 0a 0a 20 20 2f 2a 20 41 64 64 20 74 68 65 20  ...  /* Add the 
c5e0: 74 61 62 6c 65 20 74 6f 20 74 68 65 20 69 6e 2d  table to the in-
c5f0: 6d 65 6d 6f 72 79 20 72 65 70 72 65 73 65 6e 74  memory represent
c600: 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 64 61 74  ation of the dat
c610: 61 62 61 73 65 2e 0a 20 20 2a 2f 0a 20 20 69 66  abase..  */.  if
c620: 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20  ( db->init.busy 
c630: 26 26 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d  && pParse->nErr=
c640: 3d 30 20 29 7b 0a 20 20 20 20 54 61 62 6c 65 20  =0 ){.    Table 
c650: 2a 70 4f 6c 64 3b 0a 20 20 20 20 46 4b 65 79 20  *pOld;.    FKey 
c660: 2a 70 46 4b 65 79 3b 20 0a 20 20 20 20 53 63 68  *pFKey; .    Sch
c670: 65 6d 61 20 2a 70 53 63 68 65 6d 61 20 3d 20 70  ema *pSchema = p
c680: 2d 3e 70 53 63 68 65 6d 61 3b 0a 20 20 20 20 70  ->pSchema;.    p
c690: 4f 6c 64 20 3d 20 73 71 6c 69 74 65 33 48 61 73  Old = sqlite3Has
c6a0: 68 49 6e 73 65 72 74 28 26 70 53 63 68 65 6d 61  hInsert(&pSchema
c6b0: 2d 3e 74 62 6c 48 61 73 68 2c 20 70 2d 3e 7a 4e  ->tblHash, p->zN
c6c0: 61 6d 65 2c 20 73 74 72 6c 65 6e 28 70 2d 3e 7a  ame, strlen(p->z
c6d0: 4e 61 6d 65 29 2b 31 2c 70 29 3b 0a 20 20 20 20  Name)+1,p);.    
c6e0: 69 66 28 20 70 4f 6c 64 20 29 7b 0a 20 20 20 20  if( pOld ){.    
c6f0: 20 20 61 73 73 65 72 74 28 20 70 3d 3d 70 4f 6c    assert( p==pOl
c700: 64 20 29 3b 20 20 2f 2a 20 4d 61 6c 6c 6f 63 20  d );  /* Malloc 
c710: 6d 75 73 74 20 68 61 76 65 20 66 61 69 6c 65 64  must have failed
c720: 20 69 6e 73 69 64 65 20 48 61 73 68 49 6e 73 65   inside HashInse
c730: 72 74 28 29 20 2a 2f 0a 20 20 20 20 20 20 64 62  rt() */.      db
c740: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d  ->mallocFailed =
c750: 20 31 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   1;.      return
c760: 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20  ;.    }.#ifndef 
c770: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45  SQLITE_OMIT_FORE
c780: 49 47 4e 5f 4b 45 59 0a 20 20 20 20 66 6f 72 28  IGN_KEY.    for(
c790: 70 46 4b 65 79 3d 70 2d 3e 70 46 4b 65 79 3b 20  pFKey=p->pFKey; 
c7a0: 70 46 4b 65 79 3b 20 70 46 4b 65 79 3d 70 46 4b  pFKey; pFKey=pFK
c7b0: 65 79 2d 3e 70 4e 65 78 74 46 72 6f 6d 29 7b 0a  ey->pNextFrom){.
c7c0: 20 20 20 20 20 20 76 6f 69 64 20 2a 64 61 74 61        void *data
c7d0: 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 54 6f 20  ;.      int nTo 
c7e0: 3d 20 73 74 72 6c 65 6e 28 70 46 4b 65 79 2d 3e  = strlen(pFKey->
c7f0: 7a 54 6f 29 20 2b 20 31 3b 0a 20 20 20 20 20 20  zTo) + 1;.      
c800: 70 46 4b 65 79 2d 3e 70 4e 65 78 74 54 6f 20 3d  pFKey->pNextTo =
c810: 20 73 71 6c 69 74 65 33 48 61 73 68 46 69 6e 64   sqlite3HashFind
c820: 28 26 70 53 63 68 65 6d 61 2d 3e 61 46 4b 65 79  (&pSchema->aFKey
c830: 2c 20 70 46 4b 65 79 2d 3e 7a 54 6f 2c 20 6e 54  , pFKey->zTo, nT
c840: 6f 29 3b 0a 20 20 20 20 20 20 64 61 74 61 20 3d  o);.      data =
c850: 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65   sqlite3HashInse
c860: 72 74 28 26 70 53 63 68 65 6d 61 2d 3e 61 46 4b  rt(&pSchema->aFK
c870: 65 79 2c 20 70 46 4b 65 79 2d 3e 7a 54 6f 2c 20  ey, pFKey->zTo, 
c880: 6e 54 6f 2c 20 70 46 4b 65 79 29 3b 0a 20 20 20  nTo, pFKey);.   
c890: 20 20 20 69 66 28 20 64 61 74 61 3d 3d 28 76 6f     if( data==(vo
c8a0: 69 64 20 2a 29 70 46 4b 65 79 20 29 7b 0a 20 20  id *)pFKey ){.  
c8b0: 20 20 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63        db->malloc
c8c0: 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20  Failed = 1;.    
c8d0: 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66    }.    }.#endif
c8e0: 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 70 4e 65  .    pParse->pNe
c8f0: 77 54 61 62 6c 65 20 3d 20 30 3b 0a 20 20 20 20  wTable = 0;.    
c900: 64 62 2d 3e 6e 54 61 62 6c 65 2b 2b 3b 0a 20 20  db->nTable++;.  
c910: 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53    db->flags |= S
c920: 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e  QLITE_InternChan
c930: 67 65 73 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51  ges;..#ifndef SQ
c940: 4c 49 54 45 5f 4f 4d 49 54 5f 41 4c 54 45 52 54  LITE_OMIT_ALTERT
c950: 41 42 4c 45 0a 20 20 20 20 69 66 28 20 21 70 2d  ABLE.    if( !p-
c960: 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20  >pSelect ){.    
c970: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e    const char *zN
c980: 61 6d 65 20 3d 20 28 63 6f 6e 73 74 20 63 68 61  ame = (const cha
c990: 72 20 2a 29 70 50 61 72 73 65 2d 3e 73 4e 61 6d  r *)pParse->sNam
c9a0: 65 54 6f 6b 65 6e 2e 7a 3b 0a 20 20 20 20 20 20  eToken.z;.      
c9b0: 69 6e 74 20 6e 4e 61 6d 65 3b 0a 20 20 20 20 20  int nName;.     
c9c0: 20 61 73 73 65 72 74 28 20 21 70 53 65 6c 65 63   assert( !pSelec
c9d0: 74 20 26 26 20 70 43 6f 6e 73 20 26 26 20 70 45  t && pCons && pE
c9e0: 6e 64 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  nd );.      if( 
c9f0: 70 43 6f 6e 73 2d 3e 7a 3d 3d 30 20 29 7b 0a 20  pCons->z==0 ){. 
ca00: 20 20 20 20 20 20 20 70 43 6f 6e 73 20 3d 20 70         pCons = p
ca10: 45 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  End;.      }.   
ca20: 20 20 20 6e 4e 61 6d 65 20 3d 20 28 63 6f 6e 73     nName = (cons
ca30: 74 20 63 68 61 72 20 2a 29 70 43 6f 6e 73 2d 3e  t char *)pCons->
ca40: 7a 20 2d 20 7a 4e 61 6d 65 3b 0a 20 20 20 20 20  z - zName;.     
ca50: 20 70 2d 3e 61 64 64 43 6f 6c 4f 66 66 73 65 74   p->addColOffset
ca60: 20 3d 20 31 33 20 2b 20 73 71 6c 69 74 65 33 55   = 13 + sqlite3U
ca70: 74 66 38 43 68 61 72 4c 65 6e 28 7a 4e 61 6d 65  tf8CharLen(zName
ca80: 2c 20 6e 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a  , nName);.    }.
ca90: 23 65 6e 64 69 66 0a 20 20 7d 0a 7d 0a 0a 23 69  #endif.  }.}..#i
caa0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
cab0: 54 5f 56 49 45 57 0a 2f 2a 0a 2a 2a 20 54 68 65  T_VIEW./*.** The
cac0: 20 70 61 72 73 65 72 20 63 61 6c 6c 73 20 74 68   parser calls th
cad0: 69 73 20 72 6f 75 74 69 6e 65 20 69 6e 20 6f 72  is routine in or
cae0: 64 65 72 20 74 6f 20 63 72 65 61 74 65 20 61 20  der to create a 
caf0: 6e 65 77 20 56 49 45 57 0a 2a 2f 0a 76 6f 69 64  new VIEW.*/.void
cb00: 20 73 71 6c 69 74 65 33 43 72 65 61 74 65 56 69   sqlite3CreateVi
cb10: 65 77 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ew(.  Parse *pPa
cb20: 72 73 65 2c 20 20 20 20 20 2f 2a 20 54 68 65 20  rse,     /* The 
cb30: 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  parsing context 
cb40: 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 42 65 67  */.  Token *pBeg
cb50: 69 6e 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 43  in,     /* The C
cb60: 52 45 41 54 45 20 74 6f 6b 65 6e 20 74 68 61 74  REATE token that
cb70: 20 62 65 67 69 6e 73 20 74 68 65 20 73 74 61 74   begins the stat
cb80: 65 6d 65 6e 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e  ement */.  Token
cb90: 20 2a 70 4e 61 6d 65 31 2c 20 20 20 20 20 2f 2a   *pName1,     /*
cba0: 20 54 68 65 20 74 6f 6b 65 6e 20 74 68 61 74 20   The token that 
cbb0: 68 6f 6c 64 73 20 74 68 65 20 6e 61 6d 65 20 6f  holds the name o
cbc0: 66 20 74 68 65 20 76 69 65 77 20 2a 2f 0a 20 20  f the view */.  
cbd0: 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32 2c 20 20  Token *pName2,  
cbe0: 20 20 20 2f 2a 20 54 68 65 20 74 6f 6b 65 6e 20     /* The token 
cbf0: 74 68 61 74 20 68 6f 6c 64 73 20 74 68 65 20 6e  that holds the n
cc00: 61 6d 65 20 6f 66 20 74 68 65 20 76 69 65 77 20  ame of the view 
cc10: 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65  */.  Select *pSe
cc20: 6c 65 63 74 2c 20 20 20 2f 2a 20 41 20 53 45 4c  lect,   /* A SEL
cc30: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 74 68  ECT statement th
cc40: 61 74 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74  at will become t
cc50: 68 65 20 6e 65 77 20 76 69 65 77 20 2a 2f 0a 20  he new view */. 
cc60: 20 69 6e 74 20 69 73 54 65 6d 70 2c 20 20 20 20   int isTemp,    
cc70: 20 20 20 20 2f 2a 20 54 52 55 45 20 66 6f 72 20      /* TRUE for 
cc80: 61 20 54 45 4d 50 4f 52 41 52 59 20 76 69 65 77  a TEMPORARY view
cc90: 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 45 72 72 20   */.  int noErr 
cca0: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 75 70 70           /* Supp
ccb0: 72 65 73 73 20 65 72 72 6f 72 20 6d 65 73 73 61  ress error messa
ccc0: 67 65 73 20 69 66 20 56 49 45 57 20 61 6c 72 65  ges if VIEW alre
ccd0: 61 64 79 20 65 78 69 73 74 73 20 2a 2f 0a 29 7b  ady exists */.){
cce0: 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 69  .  Table *p;.  i
ccf0: 6e 74 20 6e 3b 0a 20 20 63 6f 6e 73 74 20 75 6e  nt n;.  const un
cd00: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a 3b 0a  signed char *z;.
cd10: 20 20 54 6f 6b 65 6e 20 73 45 6e 64 3b 0a 20 20    Token sEnd;.  
cd20: 44 62 46 69 78 65 72 20 73 46 69 78 3b 0a 20 20  DbFixer sFix;.  
cd30: 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 3b 0a 20 20  Token *pName;.  
cd40: 69 6e 74 20 69 44 62 3b 0a 20 20 73 71 6c 69 74  int iDb;.  sqlit
cd50: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
cd60: 3e 64 62 3b 0a 0a 20 20 69 66 28 20 70 50 61 72  >db;..  if( pPar
cd70: 73 65 2d 3e 6e 56 61 72 3e 30 20 29 7b 0a 20 20  se->nVar>0 ){.  
cd80: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
cd90: 67 28 70 50 61 72 73 65 2c 20 22 70 61 72 61 6d  g(pParse, "param
cda0: 65 74 65 72 73 20 61 72 65 20 6e 6f 74 20 61 6c  eters are not al
cdb0: 6c 6f 77 65 64 20 69 6e 20 76 69 65 77 73 22 29  lowed in views")
cdc0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c  ;.    sqlite3Sel
cdd0: 65 63 74 44 65 6c 65 74 65 28 70 53 65 6c 65 63  ectDelete(pSelec
cde0: 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  t);.    return;.
cdf0: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 53 74 61    }.  sqlite3Sta
ce00: 72 74 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20  rtTable(pParse, 
ce10: 70 4e 61 6d 65 31 2c 20 70 4e 61 6d 65 32 2c 20  pName1, pName2, 
ce20: 69 73 54 65 6d 70 2c 20 31 2c 20 30 2c 20 6e 6f  isTemp, 1, 0, no
ce30: 45 72 72 29 3b 0a 20 20 70 20 3d 20 70 50 61 72  Err);.  p = pPar
ce40: 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20  se->pNewTable;. 
ce50: 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20 70 50 61   if( p==0 || pPa
ce60: 72 73 65 2d 3e 6e 45 72 72 20 29 7b 0a 20 20 20  rse->nErr ){.   
ce70: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
ce80: 6c 65 74 65 28 70 53 65 6c 65 63 74 29 3b 0a 20  lete(pSelect);. 
ce90: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
cea0: 20 73 71 6c 69 74 65 33 54 77 6f 50 61 72 74 4e   sqlite3TwoPartN
ceb0: 61 6d 65 28 70 50 61 72 73 65 2c 20 70 4e 61 6d  ame(pParse, pNam
cec0: 65 31 2c 20 70 4e 61 6d 65 32 2c 20 26 70 4e 61  e1, pName2, &pNa
ced0: 6d 65 29 3b 0a 20 20 69 44 62 20 3d 20 73 71 6c  me);.  iDb = sql
cee0: 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65  ite3SchemaToInde
cef0: 78 28 64 62 2c 20 70 2d 3e 70 53 63 68 65 6d 61  x(db, p->pSchema
cf00: 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  );.  if( sqlite3
cf10: 46 69 78 49 6e 69 74 28 26 73 46 69 78 2c 20 70  FixInit(&sFix, p
cf20: 50 61 72 73 65 2c 20 69 44 62 2c 20 22 76 69 65  Parse, iDb, "vie
cf30: 77 22 2c 20 70 4e 61 6d 65 29 0a 20 20 20 20 26  w", pName).    &
cf40: 26 20 73 71 6c 69 74 65 33 46 69 78 53 65 6c 65  & sqlite3FixSele
cf50: 63 74 28 26 73 46 69 78 2c 20 70 53 65 6c 65 63  ct(&sFix, pSelec
cf60: 74 29 0a 20 20 29 7b 0a 20 20 20 20 73 71 6c 69  t).  ){.    sqli
cf70: 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28  te3SelectDelete(
cf80: 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 72 65  pSelect);.    re
cf90: 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  turn;.  }..  /* 
cfa0: 4d 61 6b 65 20 61 20 63 6f 70 79 20 6f 66 20 74  Make a copy of t
cfb0: 68 65 20 65 6e 74 69 72 65 20 53 45 4c 45 43 54  he entire SELECT
cfc0: 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20   statement that 
cfd0: 64 65 66 69 6e 65 73 20 74 68 65 20 76 69 65 77  defines the view
cfe0: 2e 0a 20 20 2a 2a 20 54 68 69 73 20 77 69 6c 6c  ..  ** This will
cff0: 20 66 6f 72 63 65 20 61 6c 6c 20 74 68 65 20 45   force all the E
d000: 78 70 72 2e 74 6f 6b 65 6e 2e 7a 20 76 61 6c 75  xpr.token.z valu
d010: 65 73 20 74 6f 20 62 65 20 64 79 6e 61 6d 69 63  es to be dynamic
d020: 61 6c 6c 79 0a 20 20 2a 2a 20 61 6c 6c 6f 63 61  ally.  ** alloca
d030: 74 65 64 20 72 61 74 68 65 72 20 74 68 61 6e 20  ted rather than 
d040: 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 69 6e 70  point to the inp
d050: 75 74 20 73 74 72 69 6e 67 20 2d 20 77 68 69 63  ut string - whic
d060: 68 20 6d 65 61 6e 73 20 74 68 61 74 0a 20 20 2a  h means that.  *
d070: 2a 20 74 68 65 79 20 77 69 6c 6c 20 70 65 72 73  * they will pers
d080: 69 73 74 20 61 66 74 65 72 20 74 68 65 20 63 75  ist after the cu
d090: 72 72 65 6e 74 20 73 71 6c 69 74 65 33 5f 65 78  rrent sqlite3_ex
d0a0: 65 63 28 29 20 63 61 6c 6c 20 72 65 74 75 72 6e  ec() call return
d0b0: 73 2e 0a 20 20 2a 2f 0a 20 20 70 2d 3e 70 53 65  s..  */.  p->pSe
d0c0: 6c 65 63 74 20 3d 20 73 71 6c 69 74 65 33 53 65  lect = sqlite3Se
d0d0: 6c 65 63 74 44 75 70 28 64 62 2c 20 70 53 65 6c  lectDup(db, pSel
d0e0: 65 63 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 53  ect);.  sqlite3S
d0f0: 65 6c 65 63 74 44 65 6c 65 74 65 28 70 53 65 6c  electDelete(pSel
d100: 65 63 74 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e  ect);.  if( db->
d110: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
d120: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
d130: 20 20 69 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e    if( !db->init.
d140: 62 75 73 79 20 29 7b 0a 20 20 20 20 73 71 6c 69  busy ){.    sqli
d150: 74 65 33 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e  te3ViewGetColumn
d160: 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20 70 29  Names(pParse, p)
d170: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 63 61  ;.  }..  /* Loca
d180: 74 65 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  te the end of th
d190: 65 20 43 52 45 41 54 45 20 56 49 45 57 20 73 74  e CREATE VIEW st
d1a0: 61 74 65 6d 65 6e 74 2e 20 20 4d 61 6b 65 20 73  atement.  Make s
d1b0: 45 6e 64 20 70 6f 69 6e 74 20 74 6f 0a 20 20 2a  End point to.  *
d1c0: 2a 20 74 68 65 20 65 6e 64 2e 0a 20 20 2a 2f 0a  * the end..  */.
d1d0: 20 20 73 45 6e 64 20 3d 20 70 50 61 72 73 65 2d    sEnd = pParse-
d1e0: 3e 73 4c 61 73 74 54 6f 6b 65 6e 3b 0a 20 20 69  >sLastToken;.  i
d1f0: 66 28 20 73 45 6e 64 2e 7a 5b 30 5d 21 3d 30 20  f( sEnd.z[0]!=0 
d200: 26 26 20 73 45 6e 64 2e 7a 5b 30 5d 21 3d 27 3b  && sEnd.z[0]!=';
d210: 27 20 29 7b 0a 20 20 20 20 73 45 6e 64 2e 7a 20  ' ){.    sEnd.z 
d220: 2b 3d 20 73 45 6e 64 2e 6e 3b 0a 20 20 7d 0a 20  += sEnd.n;.  }. 
d230: 20 73 45 6e 64 2e 6e 20 3d 20 30 3b 0a 20 20 6e   sEnd.n = 0;.  n
d240: 20 3d 20 73 45 6e 64 2e 7a 20 2d 20 70 42 65 67   = sEnd.z - pBeg
d250: 69 6e 2d 3e 7a 3b 0a 20 20 7a 20 3d 20 28 63 6f  in->z;.  z = (co
d260: 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
d270: 72 2a 29 70 42 65 67 69 6e 2d 3e 7a 3b 0a 20 20  r*)pBegin->z;.  
d280: 77 68 69 6c 65 28 20 6e 3e 30 20 26 26 20 28 7a  while( n>0 && (z
d290: 5b 6e 2d 31 5d 3d 3d 27 3b 27 20 7c 7c 20 69 73  [n-1]==';' || is
d2a0: 73 70 61 63 65 28 7a 5b 6e 2d 31 5d 29 29 20 29  space(z[n-1])) )
d2b0: 7b 20 6e 2d 2d 3b 20 7d 0a 20 20 73 45 6e 64 2e  { n--; }.  sEnd.
d2c0: 7a 20 3d 20 26 7a 5b 6e 2d 31 5d 3b 0a 20 20 73  z = &z[n-1];.  s
d2d0: 45 6e 64 2e 6e 20 3d 20 31 3b 0a 0a 20 20 2f 2a  End.n = 1;..  /*
d2e0: 20 55 73 65 20 73 71 6c 69 74 65 33 45 6e 64 54   Use sqlite3EndT
d2f0: 61 62 6c 65 28 29 20 74 6f 20 61 64 64 20 74 68  able() to add th
d300: 65 20 76 69 65 77 20 74 6f 20 74 68 65 20 53 51  e view to the SQ
d310: 4c 49 54 45 5f 4d 41 53 54 45 52 20 74 61 62 6c  LITE_MASTER tabl
d320: 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 45 6e  e */.  sqlite3En
d330: 64 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 30  dTable(pParse, 0
d340: 2c 20 26 73 45 6e 64 2c 20 30 29 3b 0a 20 20 72  , &sEnd, 0);.  r
d350: 65 74 75 72 6e 3b 0a 7d 0a 23 65 6e 64 69 66 20  eturn;.}.#endif 
d360: 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  /* SQLITE_OMIT_V
d370: 49 45 57 20 2a 2f 0a 0a 23 69 66 20 21 64 65 66  IEW */..#if !def
d380: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
d390: 5f 56 49 45 57 29 20 7c 7c 20 21 64 65 66 69 6e  _VIEW) || !defin
d3a0: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ed(SQLITE_OMIT_V
d3b0: 49 52 54 55 41 4c 54 41 42 4c 45 29 0a 2f 2a 0a  IRTUALTABLE)./*.
d3c0: 2a 2a 20 54 68 65 20 54 61 62 6c 65 20 73 74 72  ** The Table str
d3d0: 75 63 74 75 72 65 20 70 54 61 62 6c 65 20 69 73  ucture pTable is
d3e0: 20 72 65 61 6c 6c 79 20 61 20 56 49 45 57 2e 20   really a VIEW. 
d3f0: 20 46 69 6c 6c 20 69 6e 20 74 68 65 20 6e 61 6d   Fill in the nam
d400: 65 73 20 6f 66 0a 2a 2a 20 74 68 65 20 63 6f 6c  es of.** the col
d410: 75 6d 6e 73 20 6f 66 20 74 68 65 20 76 69 65 77  umns of the view
d420: 20 69 6e 20 74 68 65 20 70 54 61 62 6c 65 20 73   in the pTable s
d430: 74 72 75 63 74 75 72 65 2e 20 20 52 65 74 75 72  tructure.  Retur
d440: 6e 20 74 68 65 20 6e 75 6d 62 65 72 0a 2a 2a 20  n the number.** 
d450: 6f 66 20 65 72 72 6f 72 73 2e 20 20 49 66 20 61  of errors.  If a
d460: 6e 20 65 72 72 6f 72 20 69 73 20 73 65 65 6e 20  n error is seen 
d470: 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d  leave an error m
d480: 65 73 73 61 67 65 20 69 6e 20 70 50 61 72 73 65  essage in pParse
d490: 2d 3e 7a 45 72 72 4d 73 67 2e 0a 2a 2f 0a 69 6e  ->zErrMsg..*/.in
d4a0: 74 20 73 71 6c 69 74 65 33 56 69 65 77 47 65 74  t sqlite3ViewGet
d4b0: 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 50 61 72 73  ColumnNames(Pars
d4c0: 65 20 2a 70 50 61 72 73 65 2c 20 54 61 62 6c 65  e *pParse, Table
d4d0: 20 2a 70 54 61 62 6c 65 29 7b 0a 20 20 54 61 62   *pTable){.  Tab
d4e0: 6c 65 20 2a 70 53 65 6c 54 61 62 3b 20 20 20 2f  le *pSelTab;   /
d4f0: 2a 20 41 20 66 61 6b 65 20 74 61 62 6c 65 20 66  * A fake table f
d500: 72 6f 6d 20 77 68 69 63 68 20 77 65 20 67 65 74  rom which we get
d510: 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
d520: 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65  */.  Select *pSe
d530: 6c 3b 20 20 20 20 20 2f 2a 20 43 6f 70 79 20 6f  l;     /* Copy o
d540: 66 20 74 68 65 20 53 45 4c 45 43 54 20 74 68 61  f the SELECT tha
d550: 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65  t implements the
d560: 20 76 69 65 77 20 2a 2f 0a 20 20 69 6e 74 20 6e   view */.  int n
d570: 45 72 72 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20  Err = 0;     /* 
d580: 4e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73  Number of errors
d590: 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 2a 2f 0a   encountered */.
d5a0: 20 20 69 6e 74 20 6e 3b 20 20 20 20 20 20 20 20    int n;        
d5b0: 20 20 20 20 2f 2a 20 54 65 6d 70 6f 72 61 72 69      /* Temporari
d5c0: 6c 79 20 68 6f 6c 64 73 20 74 68 65 20 6e 75 6d  ly holds the num
d5d0: 62 65 72 20 6f 66 20 63 75 72 73 6f 72 73 20 61  ber of cursors a
d5e0: 73 73 69 67 6e 65 64 20 2a 2f 0a 20 20 73 71 6c  ssigned */.  sql
d5f0: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
d600: 65 2d 3e 64 62 3b 20 20 2f 2a 20 44 61 74 61 62  e->db;  /* Datab
d610: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 66  ase connection f
d620: 6f 72 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 73  or malloc errors
d630: 20 2a 2f 0a 20 20 69 6e 74 20 28 2a 78 41 75 74   */.  int (*xAut
d640: 68 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e  h)(void*,int,con
d650: 73 74 20 63 68 61 72 2a 2c 63 6f 6e 73 74 20 63  st char*,const c
d660: 68 61 72 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a  har*,const char*
d670: 2c 63 6f 6e 73 74 20 63 68 61 72 2a 29 3b 0a 0a  ,const char*);..
d680: 20 20 61 73 73 65 72 74 28 20 70 54 61 62 6c 65    assert( pTable
d690: 20 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c   );..#ifndef SQL
d6a0: 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
d6b0: 54 41 42 4c 45 0a 20 20 69 66 28 20 73 71 6c 69  TABLE.  if( sqli
d6c0: 74 65 33 56 74 61 62 43 61 6c 6c 43 6f 6e 6e 65  te3VtabCallConne
d6d0: 63 74 28 70 50 61 72 73 65 2c 20 70 54 61 62 6c  ct(pParse, pTabl
d6e0: 65 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  e) ){.    return
d6f0: 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
d700: 20 7d 0a 20 20 69 66 28 20 49 73 56 69 72 74 75   }.  if( IsVirtu
d710: 61 6c 28 70 54 61 62 6c 65 29 20 29 20 72 65 74  al(pTable) ) ret
d720: 75 72 6e 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 23  urn 0;.#endif..#
d730: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
d740: 49 54 5f 56 49 45 57 0a 20 20 2f 2a 20 41 20 70  IT_VIEW.  /* A p
d750: 6f 73 69 74 69 76 65 20 6e 43 6f 6c 20 6d 65 61  ositive nCol mea
d760: 6e 73 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 6e  ns the columns n
d770: 61 6d 65 73 20 66 6f 72 20 74 68 69 73 20 76 69  ames for this vi
d780: 65 77 20 61 72 65 0a 20 20 2a 2a 20 61 6c 72 65  ew are.  ** alre
d790: 61 64 79 20 6b 6e 6f 77 6e 2e 0a 20 20 2a 2f 0a  ady known..  */.
d7a0: 20 20 69 66 28 20 70 54 61 62 6c 65 2d 3e 6e 43    if( pTable->nC
d7b0: 6f 6c 3e 30 20 29 20 72 65 74 75 72 6e 20 30 3b  ol>0 ) return 0;
d7c0: 0a 0a 20 20 2f 2a 20 41 20 6e 65 67 61 74 69 76  ..  /* A negativ
d7d0: 65 20 6e 43 6f 6c 20 69 73 20 61 20 73 70 65 63  e nCol is a spec
d7e0: 69 61 6c 20 6d 61 72 6b 65 72 20 6d 65 61 6e 69  ial marker meani
d7f0: 6e 67 20 74 68 61 74 20 77 65 20 61 72 65 20 63  ng that we are c
d800: 75 72 72 65 6e 74 6c 79 0a 20 20 2a 2a 20 74 72  urrently.  ** tr
d810: 79 69 6e 67 20 74 6f 20 63 6f 6d 70 75 74 65 20  ying to compute 
d820: 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73  the column names
d830: 2e 20 20 49 66 20 77 65 20 65 6e 74 65 72 20 74  .  If we enter t
d840: 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 74 68  his routine with
d850: 0a 20 20 2a 2a 20 61 20 6e 65 67 61 74 69 76 65  .  ** a negative
d860: 20 6e 43 6f 6c 2c 20 69 74 20 6d 65 61 6e 73 20   nCol, it means 
d870: 74 77 6f 20 6f 72 20 6d 6f 72 65 20 76 69 65 77  two or more view
d880: 73 20 66 6f 72 6d 20 61 20 6c 6f 6f 70 2c 20 6c  s form a loop, l
d890: 69 6b 65 20 74 68 69 73 3a 0a 20 20 2a 2a 0a 20  ike this:.  **. 
d8a0: 20 2a 2a 20 20 20 20 20 43 52 45 41 54 45 20 56   **     CREATE V
d8b0: 49 45 57 20 6f 6e 65 20 41 53 20 53 45 4c 45 43  IEW one AS SELEC
d8c0: 54 20 2a 20 46 52 4f 4d 20 74 77 6f 3b 0a 20 20  T * FROM two;.  
d8d0: 2a 2a 20 20 20 20 20 43 52 45 41 54 45 20 56 49  **     CREATE VI
d8e0: 45 57 20 74 77 6f 20 41 53 20 53 45 4c 45 43 54  EW two AS SELECT
d8f0: 20 2a 20 46 52 4f 4d 20 6f 6e 65 3b 0a 20 20 2a   * FROM one;.  *
d900: 2a 0a 20 20 2a 2a 20 41 63 74 75 61 6c 6c 79 2c  *.  ** Actually,
d910: 20 74 68 69 73 20 65 72 72 6f 72 20 69 73 20 63   this error is c
d920: 61 75 67 68 74 20 70 72 65 76 69 6f 75 73 6c 79  aught previously
d930: 20 61 6e 64 20 73 6f 20 74 68 65 20 66 6f 6c 6c   and so the foll
d940: 6f 77 69 6e 67 20 74 65 73 74 0a 20 20 2a 2a 20  owing test.  ** 
d950: 73 68 6f 75 6c 64 20 61 6c 77 61 79 73 20 66 61  should always fa
d960: 69 6c 2e 20 20 42 75 74 20 77 65 20 77 69 6c 6c  il.  But we will
d970: 20 6c 65 61 76 65 20 69 74 20 69 6e 20 70 6c 61   leave it in pla
d980: 63 65 20 6a 75 73 74 20 74 6f 20 62 65 20 73 61  ce just to be sa
d990: 66 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  fe..  */.  if( p
d9a0: 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3c 30 20 29 7b  Table->nCol<0 ){
d9b0: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
d9c0: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 76 69  rMsg(pParse, "vi
d9d0: 65 77 20 25 73 20 69 73 20 63 69 72 63 75 6c 61  ew %s is circula
d9e0: 72 6c 79 20 64 65 66 69 6e 65 64 22 2c 20 70 54  rly defined", pT
d9f0: 61 62 6c 65 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  able->zName);.  
da00: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a    return 1;.  }.
da10: 20 20 61 73 73 65 72 74 28 20 70 54 61 62 6c 65    assert( pTable
da20: 2d 3e 6e 43 6f 6c 3e 3d 30 20 29 3b 0a 0a 20 20  ->nCol>=0 );..  
da30: 2f 2a 20 49 66 20 77 65 20 67 65 74 20 74 68 69  /* If we get thi
da40: 73 20 66 61 72 2c 20 69 74 20 6d 65 61 6e 73 20  s far, it means 
da50: 77 65 20 6e 65 65 64 20 74 6f 20 63 6f 6d 70 75  we need to compu
da60: 74 65 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d  te the table nam
da70: 65 73 2e 0a 20 20 2a 2a 20 4e 6f 74 65 20 74 68  es..  ** Note th
da80: 61 74 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 73  at the call to s
da90: 71 6c 69 74 65 33 52 65 73 75 6c 74 53 65 74 4f  qlite3ResultSetO
daa0: 66 53 65 6c 65 63 74 28 29 20 77 69 6c 6c 20 65  fSelect() will e
dab0: 78 70 61 6e 64 20 61 6e 79 0a 20 20 2a 2a 20 22  xpand any.  ** "
dac0: 2a 22 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 74  *" elements in t
dad0: 68 65 20 72 65 73 75 6c 74 73 20 73 65 74 20 6f  he results set o
dae0: 66 20 74 68 65 20 76 69 65 77 20 61 6e 64 20 77  f the view and w
daf0: 69 6c 6c 20 61 73 73 69 67 6e 20 63 75 72 73 6f  ill assign curso
db00: 72 73 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 65  rs.  ** to the e
db10: 6c 65 6d 65 6e 74 73 20 6f 66 20 74 68 65 20 46  lements of the F
db20: 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20 42 75 74  ROM clause.  But
db30: 20 77 65 20 64 6f 20 6e 6f 74 20 77 61 6e 74 20   we do not want 
db40: 74 68 65 73 65 20 63 68 61 6e 67 65 73 0a 20 20  these changes.  
db50: 2a 2a 20 74 6f 20 62 65 20 70 65 72 6d 61 6e 65  ** to be permane
db60: 6e 74 2e 20 20 53 6f 20 74 68 65 20 63 6f 6d 70  nt.  So the comp
db70: 75 74 61 74 69 6f 6e 20 69 73 20 64 6f 6e 65 20  utation is done 
db80: 6f 6e 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65  on a copy of the
db90: 20 53 45 4c 45 43 54 0a 20 20 2a 2a 20 73 74 61   SELECT.  ** sta
dba0: 74 65 6d 65 6e 74 20 74 68 61 74 20 64 65 66 69  tement that defi
dbb0: 6e 65 73 20 74 68 65 20 76 69 65 77 2e 0a 20 20  nes the view..  
dbc0: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 54 61  */.  assert( pTa
dbd0: 62 6c 65 2d 3e 70 53 65 6c 65 63 74 20 29 3b 0a  ble->pSelect );.
dbe0: 20 20 70 53 65 6c 20 3d 20 73 71 6c 69 74 65 33    pSel = sqlite3
dbf0: 53 65 6c 65 63 74 44 75 70 28 64 62 2c 20 70 54  SelectDup(db, pT
dc00: 61 62 6c 65 2d 3e 70 53 65 6c 65 63 74 29 3b 0a  able->pSelect);.
dc10: 20 20 69 66 28 20 70 53 65 6c 20 29 7b 0a 20 20    if( pSel ){.  
dc20: 20 20 6e 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54    n = pParse->nT
dc30: 61 62 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53  ab;.    sqlite3S
dc40: 72 63 4c 69 73 74 41 73 73 69 67 6e 43 75 72 73  rcListAssignCurs
dc50: 6f 72 73 28 70 50 61 72 73 65 2c 20 70 53 65 6c  ors(pParse, pSel
dc60: 2d 3e 70 53 72 63 29 3b 0a 20 20 20 20 70 54 61  ->pSrc);.    pTa
dc70: 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 2d 31 3b 0a  ble->nCol = -1;.
dc80: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
dc90: 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f  MIT_AUTHORIZATIO
dca0: 4e 0a 20 20 20 20 78 41 75 74 68 20 3d 20 64 62  N.    xAuth = db
dcb0: 2d 3e 78 41 75 74 68 3b 0a 20 20 20 20 64 62 2d  ->xAuth;.    db-
dcc0: 3e 78 41 75 74 68 20 3d 20 30 3b 0a 20 20 20 20  >xAuth = 0;.    
dcd0: 70 53 65 6c 54 61 62 20 3d 20 73 71 6c 69 74 65  pSelTab = sqlite
dce0: 33 52 65 73 75 6c 74 53 65 74 4f 66 53 65 6c 65  3ResultSetOfSele
dcf0: 63 74 28 70 50 61 72 73 65 2c 20 30 2c 20 70 53  ct(pParse, 0, pS
dd00: 65 6c 29 3b 0a 20 20 20 20 64 62 2d 3e 78 41 75  el);.    db->xAu
dd10: 74 68 20 3d 20 78 41 75 74 68 3b 0a 23 65 6c 73  th = xAuth;.#els
dd20: 65 0a 20 20 20 20 70 53 65 6c 54 61 62 20 3d 20  e.    pSelTab = 
dd30: 73 71 6c 69 74 65 33 52 65 73 75 6c 74 53 65 74  sqlite3ResultSet
dd40: 4f 66 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  OfSelect(pParse,
dd50: 20 30 2c 20 70 53 65 6c 29 3b 0a 23 65 6e 64 69   0, pSel);.#endi
dd60: 66 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 54  f.    pParse->nT
dd70: 61 62 20 3d 20 6e 3b 0a 20 20 20 20 69 66 28 20  ab = n;.    if( 
dd80: 70 53 65 6c 54 61 62 20 29 7b 0a 20 20 20 20 20  pSelTab ){.     
dd90: 20 61 73 73 65 72 74 28 20 70 54 61 62 6c 65 2d   assert( pTable-
dda0: 3e 61 43 6f 6c 3d 3d 30 20 29 3b 0a 20 20 20 20  >aCol==0 );.    
ddb0: 20 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d    pTable->nCol =
ddc0: 20 70 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c 3b 0a   pSelTab->nCol;.
ddd0: 20 20 20 20 20 20 70 54 61 62 6c 65 2d 3e 61 43        pTable->aC
dde0: 6f 6c 20 3d 20 70 53 65 6c 54 61 62 2d 3e 61 43  ol = pSelTab->aC
ddf0: 6f 6c 3b 0a 20 20 20 20 20 20 70 53 65 6c 54 61  ol;.      pSelTa
de00: 62 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20  b->nCol = 0;.   
de10: 20 20 20 70 53 65 6c 54 61 62 2d 3e 61 43 6f 6c     pSelTab->aCol
de20: 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 71 6c 69   = 0;.      sqli
de30: 74 65 33 44 65 6c 65 74 65 54 61 62 6c 65 28 70  te3DeleteTable(p
de40: 53 65 6c 54 61 62 29 3b 0a 20 20 20 20 20 20 70  SelTab);.      p
de50: 54 61 62 6c 65 2d 3e 70 53 63 68 65 6d 61 2d 3e  Table->pSchema->
de60: 66 6c 61 67 73 20 7c 3d 20 44 42 5f 55 6e 72 65  flags |= DB_Unre
de70: 73 65 74 56 69 65 77 73 3b 0a 20 20 20 20 7d 65  setViews;.    }e
de80: 6c 73 65 7b 0a 20 20 20 20 20 20 70 54 61 62 6c  lse{.      pTabl
de90: 65 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20  e->nCol = 0;.   
dea0: 20 20 20 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 7d     nErr++;.    }
deb0: 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65  .    sqlite3Sele
dec0: 63 74 44 65 6c 65 74 65 28 70 53 65 6c 29 3b 0a  ctDelete(pSel);.
ded0: 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 6e    } else {.    n
dee0: 45 72 72 2b 2b 3b 0a 20 20 7d 0a 23 65 6e 64 69  Err++;.  }.#endi
def0: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
df00: 5f 56 49 45 57 20 2a 2f 0a 20 20 72 65 74 75 72  _VIEW */.  retur
df10: 6e 20 6e 45 72 72 3b 20 20 0a 7d 0a 23 65 6e 64  n nErr;  .}.#end
df20: 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53  if /* !defined(S
df30: 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29  QLITE_OMIT_VIEW)
df40: 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c   || !defined(SQL
df50: 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
df60: 54 41 42 4c 45 29 20 2a 2f 0a 0a 23 69 66 6e 64  TABLE) */..#ifnd
df70: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
df80: 49 45 57 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20  IEW./*.** Clear 
df90: 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73  the column names
dfa0: 20 66 72 6f 6d 20 65 76 65 72 79 20 56 49 45 57   from every VIEW
dfb0: 20 69 6e 20 64 61 74 61 62 61 73 65 20 69 64 78   in database idx
dfc0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
dfd0: 20 73 71 6c 69 74 65 56 69 65 77 52 65 73 65 74   sqliteViewReset
dfe0: 41 6c 6c 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  All(sqlite3 *db,
dff0: 20 69 6e 74 20 69 64 78 29 7b 0a 20 20 48 61 73   int idx){.  Has
e000: 68 45 6c 65 6d 20 2a 69 3b 0a 20 20 69 66 28 20  hElem *i;.  if( 
e010: 21 44 62 48 61 73 50 72 6f 70 65 72 74 79 28 64  !DbHasProperty(d
e020: 62 2c 20 69 64 78 2c 20 44 42 5f 55 6e 72 65 73  b, idx, DB_Unres
e030: 65 74 56 69 65 77 73 29 20 29 20 72 65 74 75 72  etViews) ) retur
e040: 6e 3b 0a 20 20 66 6f 72 28 69 3d 73 71 6c 69 74  n;.  for(i=sqlit
e050: 65 48 61 73 68 46 69 72 73 74 28 26 64 62 2d 3e  eHashFirst(&db->
e060: 61 44 62 5b 69 64 78 5d 2e 70 53 63 68 65 6d 61  aDb[idx].pSchema
e070: 2d 3e 74 62 6c 48 61 73 68 29 3b 20 69 3b 69 3d  ->tblHash); i;i=
e080: 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28 69  sqliteHashNext(i
e090: 29 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70  )){.    Table *p
e0a0: 54 61 62 20 3d 20 73 71 6c 69 74 65 48 61 73 68  Tab = sqliteHash
e0b0: 44 61 74 61 28 69 29 3b 0a 20 20 20 20 69 66 28  Data(i);.    if(
e0c0: 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 29   pTab->pSelect )
e0d0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 52 65  {.      sqliteRe
e0e0: 73 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70  setColumnNames(p
e0f0: 54 61 62 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Tab);.    }.  }.
e100: 20 20 44 62 43 6c 65 61 72 50 72 6f 70 65 72 74    DbClearPropert
e110: 79 28 64 62 2c 20 69 64 78 2c 20 44 42 5f 55 6e  y(db, idx, DB_Un
e120: 72 65 73 65 74 56 69 65 77 73 29 3b 0a 7d 0a 23  resetViews);.}.#
e130: 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 73 71  else.# define sq
e140: 6c 69 74 65 56 69 65 77 52 65 73 65 74 41 6c 6c  liteViewResetAll
e150: 28 41 2c 42 29 0a 23 65 6e 64 69 66 20 2f 2a 20  (A,B).#endif /* 
e160: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57  SQLITE_OMIT_VIEW
e170: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20   */../*.** This 
e180: 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
e190: 65 64 20 62 79 20 74 68 65 20 56 44 42 45 20 74  ed by the VDBE t
e1a0: 6f 20 61 64 6a 75 73 74 20 74 68 65 20 69 6e 74  o adjust the int
e1b0: 65 72 6e 61 6c 20 73 63 68 65 6d 61 0a 2a 2a 20  ernal schema.** 
e1c0: 75 73 65 64 20 62 79 20 53 51 4c 69 74 65 20 77  used by SQLite w
e1d0: 68 65 6e 20 74 68 65 20 62 74 72 65 65 20 6c 61  hen the btree la
e1e0: 79 65 72 20 6d 6f 76 65 73 20 61 20 74 61 62 6c  yer moves a tabl
e1f0: 65 20 72 6f 6f 74 20 70 61 67 65 2e 20 54 68 65  e root page. The
e200: 0a 2a 2a 20 72 6f 6f 74 2d 70 61 67 65 20 6f 66  .** root-page of
e210: 20 61 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65   a table or inde
e220: 78 20 69 6e 20 64 61 74 61 62 61 73 65 20 69 44  x in database iD
e230: 62 20 68 61 73 20 63 68 61 6e 67 65 64 20 66 72  b has changed fr
e240: 6f 6d 20 69 46 72 6f 6d 0a 2a 2a 20 74 6f 20 69  om iFrom.** to i
e250: 54 6f 2e 0a 2a 2a 0a 2a 2a 20 54 69 63 6b 65 74  To..**.** Ticket
e260: 20 23 31 37 32 38 3a 20 20 54 68 65 20 73 79 6d   #1728:  The sym
e270: 62 6f 6c 20 74 61 62 6c 65 20 6d 69 67 68 74 20  bol table might 
e280: 73 74 69 6c 6c 20 63 6f 6e 74 61 69 6e 20 69 6e  still contain in
e290: 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20 6f 6e 20  formation.** on 
e2a0: 74 61 62 6c 65 73 20 61 6e 64 2f 6f 72 20 69 6e  tables and/or in
e2b0: 64 69 63 65 73 20 74 68 61 74 20 61 72 65 20 74  dices that are t
e2c0: 68 65 20 70 72 6f 63 65 73 73 20 6f 66 20 62 65  he process of be
e2d0: 69 6e 67 20 64 65 6c 65 74 65 64 2e 0a 2a 2a 20  ing deleted..** 
e2e0: 49 66 20 79 6f 75 20 61 72 65 20 75 6e 6c 75 63  If you are unluc
e2f0: 6b 79 2c 20 6f 6e 65 20 6f 66 20 74 68 6f 73 65  ky, one of those
e300: 20 64 65 6c 65 74 65 64 20 69 6e 64 69 63 65 73   deleted indices
e310: 20 6f 72 20 74 61 62 6c 65 73 20 6d 69 67 68 74   or tables might
e320: 0a 2a 2a 20 68 61 76 65 20 74 68 65 20 73 61 6d  .** have the sam
e330: 65 20 72 6f 6f 74 70 61 67 65 20 6e 75 6d 62 65  e rootpage numbe
e340: 72 20 61 73 20 74 68 65 20 72 65 61 6c 20 74 61  r as the real ta
e350: 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 74 68 61  ble or index tha
e360: 74 20 69 73 0a 2a 2a 20 62 65 69 6e 67 20 6d 6f  t is.** being mo
e370: 76 65 64 2e 20 20 53 6f 20 77 65 20 63 61 6e 6e  ved.  So we cann
e380: 6f 74 20 73 74 6f 70 20 73 65 61 72 63 68 69 6e  ot stop searchin
e390: 67 20 61 66 74 65 72 20 74 68 65 20 66 69 72 73  g after the firs
e3a0: 74 20 6d 61 74 63 68 20 0a 2a 2a 20 62 65 63 61  t match .** beca
e3b0: 75 73 65 20 74 68 65 20 66 69 72 73 74 20 6d 61  use the first ma
e3c0: 74 63 68 20 6d 69 67 68 74 20 62 65 20 66 6f 72  tch might be for
e3d0: 20 6f 6e 65 20 6f 66 20 74 68 65 20 64 65 6c 65   one of the dele
e3e0: 74 65 64 20 69 6e 64 69 63 65 73 0a 2a 2a 20 6f  ted indices.** o
e3f0: 72 20 74 61 62 6c 65 73 20 61 6e 64 20 6e 6f 74  r tables and not
e400: 20 74 68 65 20 74 61 62 6c 65 2f 69 6e 64 65 78   the table/index
e410: 20 74 68 61 74 20 69 73 20 61 63 74 75 61 6c 6c   that is actuall
e420: 79 20 62 65 69 6e 67 20 6d 6f 76 65 64 2e 0a 2a  y being moved..*
e430: 2a 20 57 65 20 6d 75 73 74 20 63 6f 6e 74 69 6e  * We must contin
e440: 75 65 20 6c 6f 6f 70 69 6e 67 20 75 6e 74 69 6c  ue looping until
e450: 20 61 6c 6c 20 74 61 62 6c 65 73 20 61 6e 64 20   all tables and 
e460: 69 6e 64 69 63 65 73 20 77 69 74 68 0a 2a 2a 20  indices with.** 
e470: 72 6f 6f 74 70 61 67 65 3d 3d 69 46 72 6f 6d 20  rootpage==iFrom 
e480: 68 61 76 65 20 62 65 65 6e 20 63 6f 6e 76 65 72  have been conver
e490: 74 65 64 20 74 6f 20 68 61 76 65 20 61 20 72 6f  ted to have a ro
e4a0: 6f 74 70 61 67 65 20 6f 66 20 69 54 6f 0a 2a 2a  otpage of iTo.**
e4b0: 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 62 65 20   in order to be 
e4c0: 63 65 72 74 61 69 6e 20 74 68 61 74 20 77 65 20  certain that we 
e4d0: 67 6f 74 20 74 68 65 20 72 69 67 68 74 20 6f 6e  got the right on
e4e0: 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  e..*/.#ifndef SQ
e4f0: 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
e500: 43 55 55 4d 0a 76 6f 69 64 20 73 71 6c 69 74 65  CUUM.void sqlite
e510: 33 52 6f 6f 74 50 61 67 65 4d 6f 76 65 64 28 44  3RootPageMoved(D
e520: 62 20 2a 70 44 62 2c 20 69 6e 74 20 69 46 72 6f  b *pDb, int iFro
e530: 6d 2c 20 69 6e 74 20 69 54 6f 29 7b 0a 20 20 48  m, int iTo){.  H
e540: 61 73 68 45 6c 65 6d 20 2a 70 45 6c 65 6d 3b 0a  ashElem *pElem;.
e550: 20 20 48 61 73 68 20 2a 70 48 61 73 68 3b 0a 0a    Hash *pHash;..
e560: 20 20 70 48 61 73 68 20 3d 20 26 70 44 62 2d 3e    pHash = &pDb->
e570: 70 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68  pSchema->tblHash
e580: 3b 0a 20 20 66 6f 72 28 70 45 6c 65 6d 3d 73 71  ;.  for(pElem=sq
e590: 6c 69 74 65 48 61 73 68 46 69 72 73 74 28 70 48  liteHashFirst(pH
e5a0: 61 73 68 29 3b 20 70 45 6c 65 6d 3b 20 70 45 6c  ash); pElem; pEl
e5b0: 65 6d 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78  em=sqliteHashNex
e5c0: 74 28 70 45 6c 65 6d 29 29 7b 0a 20 20 20 20 54  t(pElem)){.    T
e5d0: 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 73 71 6c  able *pTab = sql
e5e0: 69 74 65 48 61 73 68 44 61 74 61 28 70 45 6c 65  iteHashData(pEle
e5f0: 6d 29 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62  m);.    if( pTab
e600: 2d 3e 74 6e 75 6d 3d 3d 69 46 72 6f 6d 20 29 7b  ->tnum==iFrom ){
e610: 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 74 6e 75  .      pTab->tnu
e620: 6d 20 3d 20 69 54 6f 3b 0a 20 20 20 20 7d 0a 20  m = iTo;.    }. 
e630: 20 7d 0a 20 20 70 48 61 73 68 20 3d 20 26 70 44   }.  pHash = &pD
e640: 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 69 64 78 48  b->pSchema->idxH
e650: 61 73 68 3b 0a 20 20 66 6f 72 28 70 45 6c 65 6d  ash;.  for(pElem
e660: 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72 73 74  =sqliteHashFirst
e670: 28 70 48 61 73 68 29 3b 20 70 45 6c 65 6d 3b 20  (pHash); pElem; 
e680: 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73 68  pElem=sqliteHash
e690: 4e 65 78 74 28 70 45 6c 65 6d 29 29 7b 0a 20 20  Next(pElem)){.  
e6a0: 20 20 49 6e 64 65 78 20 2a 70 49 64 78 20 3d 20    Index *pIdx = 
e6b0: 73 71 6c 69 74 65 48 61 73 68 44 61 74 61 28 70  sqliteHashData(p
e6c0: 45 6c 65 6d 29 3b 0a 20 20 20 20 69 66 28 20 70  Elem);.    if( p
e6d0: 49 64 78 2d 3e 74 6e 75 6d 3d 3d 69 46 72 6f 6d  Idx->tnum==iFrom
e6e0: 20 29 7b 0a 20 20 20 20 20 20 70 49 64 78 2d 3e   ){.      pIdx->
e6f0: 74 6e 75 6d 20 3d 20 69 54 6f 3b 0a 20 20 20 20  tnum = iTo;.    
e700: 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a  }.  }.}.#endif..
e710: 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 63 6f 64 65  /*.** Write code
e720: 20 74 6f 20 65 72 61 73 65 20 74 68 65 20 74 61   to erase the ta
e730: 62 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d 70 61  ble with root-pa
e740: 67 65 20 69 54 61 62 6c 65 20 66 72 6f 6d 20 64  ge iTable from d
e750: 61 74 61 62 61 73 65 20 69 44 62 2e 0a 2a 2a 20  atabase iDb..** 
e760: 41 6c 73 6f 20 77 72 69 74 65 20 63 6f 64 65 20  Also write code 
e770: 74 6f 20 6d 6f 64 69 66 79 20 74 68 65 20 73 71  to modify the sq
e780: 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c  lite_master tabl
e790: 65 20 61 6e 64 20 69 6e 74 65 72 6e 61 6c 20 73  e and internal s
e7a0: 63 68 65 6d 61 0a 2a 2a 20 69 66 20 61 20 72 6f  chema.** if a ro
e7b0: 6f 74 2d 70 61 67 65 20 6f 66 20 61 6e 6f 74 68  ot-page of anoth
e7c0: 65 72 20 74 61 62 6c 65 20 69 73 20 6d 6f 76 65  er table is move
e7d0: 64 20 62 79 20 74 68 65 20 62 74 72 65 65 2d 6c  d by the btree-l
e7e0: 61 79 65 72 20 77 68 69 6c 73 74 0a 2a 2a 20 65  ayer whilst.** e
e7f0: 72 61 73 69 6e 67 20 69 54 61 62 6c 65 20 28 74  rasing iTable (t
e800: 68 69 73 20 63 61 6e 20 68 61 70 70 65 6e 20 77  his can happen w
e810: 69 74 68 20 61 6e 20 61 75 74 6f 2d 76 61 63 75  ith an auto-vacu
e820: 75 6d 20 64 61 74 61 62 61 73 65 29 2e 0a 2a 2f  um database)..*/
e830: 20 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64 65   .static void de
e840: 73 74 72 6f 79 52 6f 6f 74 50 61 67 65 28 50 61  stroyRootPage(Pa
e850: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74  rse *pParse, int
e860: 20 69 54 61 62 6c 65 2c 20 69 6e 74 20 69 44 62   iTable, int iDb
e870: 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 73  ){.  Vdbe *v = s
e880: 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
e890: 61 72 73 65 29 3b 0a 20 20 69 6e 74 20 72 31 20  arse);.  int r1 
e8a0: 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
e8b0: 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 73  Reg(pParse);.  s
e8c0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
e8d0: 28 76 2c 20 4f 50 5f 44 65 73 74 72 6f 79 2c 20  (v, OP_Destroy, 
e8e0: 69 54 61 62 6c 65 2c 20 72 31 2c 20 69 44 62 29  iTable, r1, iDb)
e8f0: 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
e900: 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
e910: 0a 20 20 2f 2a 20 4f 50 5f 44 65 73 74 72 6f 79  .  /* OP_Destroy
e920: 20 73 74 6f 72 65 73 20 61 6e 20 69 6e 20 69 6e   stores an in in
e930: 74 65 67 65 72 20 72 31 2e 20 49 66 20 74 68 69  teger r1. If thi
e940: 73 20 69 6e 74 65 67 65 72 0a 20 20 2a 2a 20 69  s integer.  ** i
e950: 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e  s non-zero, then
e960: 20 69 74 20 69 73 20 74 68 65 20 72 6f 6f 74 20   it is the root 
e970: 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 61  page number of a
e980: 20 74 61 62 6c 65 20 6d 6f 76 65 64 20 74 6f 0a   table moved to.
e990: 20 20 2a 2a 20 6c 6f 63 61 74 69 6f 6e 20 69 54    ** location iT
e9a0: 61 62 6c 65 2e 20 54 68 65 20 66 6f 6c 6c 6f 77  able. The follow
e9b0: 69 6e 67 20 63 6f 64 65 20 6d 6f 64 69 66 69 65  ing code modifie
e9c0: 73 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73  s the sqlite_mas
e9d0: 74 65 72 20 74 61 62 6c 65 20 74 6f 0a 20 20 2a  ter table to.  *
e9e0: 2a 20 72 65 66 6c 65 63 74 20 74 68 69 73 2e 0a  * reflect this..
e9f0: 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 22 23    **.  ** The "#
ea00: 25 64 22 20 69 6e 20 74 68 65 20 53 51 4c 20 69  %d" in the SQL i
ea10: 73 20 61 20 73 70 65 63 69 61 6c 20 63 6f 6e 73  s a special cons
ea20: 74 61 6e 74 20 74 68 61 74 20 6d 65 61 6e 73 20  tant that means 
ea30: 77 68 61 74 65 76 65 72 20 76 61 6c 75 65 0a 20  whatever value. 
ea40: 20 2a 2a 20 69 73 20 6f 6e 20 74 68 65 20 74 6f   ** is on the to
ea50: 70 20 6f 66 20 74 68 65 20 73 74 61 63 6b 2e 20  p of the stack. 
ea60: 20 53 65 65 20 73 71 6c 69 74 65 33 52 65 67 69   See sqlite3Regi
ea70: 73 74 65 72 45 78 70 72 28 29 2e 0a 20 20 2a 2f  sterExpr()..  */
ea80: 0a 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64  .  sqlite3Nested
ea90: 50 61 72 73 65 28 70 50 61 72 73 65 2c 20 0a 20  Parse(pParse, . 
eaa0: 20 20 20 20 22 55 50 44 41 54 45 20 25 51 2e 25      "UPDATE %Q.%
eab0: 73 20 53 45 54 20 72 6f 6f 74 70 61 67 65 3d 25  s SET rootpage=%
eac0: 64 20 57 48 45 52 45 20 23 25 64 20 41 4e 44 20  d WHERE #%d AND 
ead0: 72 6f 6f 74 70 61 67 65 3d 23 25 64 22 2c 0a 20  rootpage=#%d",. 
eae0: 20 20 20 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e      pParse->db->
eaf0: 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 2c 20  aDb[iDb].zName, 
eb00: 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 44 62  SCHEMA_TABLE(iDb
eb10: 29 2c 20 69 54 61 62 6c 65 2c 20 72 31 2c 20 72  ), iTable, r1, r
eb20: 31 29 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c  1);.#endif.  sql
eb30: 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
eb40: 65 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a  eg(pParse, r1);.
eb50: 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 56  }../*.** Write V
eb60: 44 42 45 20 63 6f 64 65 20 74 6f 20 65 72 61 73  DBE code to eras
eb70: 65 20 74 61 62 6c 65 20 70 54 61 62 20 61 6e 64  e table pTab and
eb80: 20 61 6c 6c 20 61 73 73 6f 63 69 61 74 65 64 20   all associated 
eb90: 69 6e 64 69 63 65 73 20 6f 6e 20 64 69 73 6b 2e  indices on disk.
eba0: 0a 2a 2a 20 43 6f 64 65 20 74 6f 20 75 70 64 61  .** Code to upda
ebb0: 74 65 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61  te the sqlite_ma
ebc0: 73 74 65 72 20 74 61 62 6c 65 73 20 61 6e 64 20  ster tables and 
ebd0: 69 6e 74 65 72 6e 61 6c 20 73 63 68 65 6d 61 20  internal schema 
ebe0: 64 65 66 69 6e 69 74 69 6f 6e 73 0a 2a 2a 20 69  definitions.** i
ebf0: 6e 20 63 61 73 65 20 61 20 72 6f 6f 74 2d 70 61  n case a root-pa
ec00: 67 65 20 62 65 6c 6f 6e 67 69 6e 67 20 74 6f 20  ge belonging to 
ec10: 61 6e 6f 74 68 65 72 20 74 61 62 6c 65 20 69 73  another table is
ec20: 20 6d 6f 76 65 64 20 62 79 20 74 68 65 20 62 74   moved by the bt
ec30: 72 65 65 20 6c 61 79 65 72 0a 2a 2a 20 69 73 20  ree layer.** is 
ec40: 61 6c 73 6f 20 61 64 64 65 64 20 28 74 68 69 73  also added (this
ec50: 20 63 61 6e 20 68 61 70 70 65 6e 20 77 69 74 68   can happen with
ec60: 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20   an auto-vacuum 
ec70: 64 61 74 61 62 61 73 65 29 2e 0a 2a 2f 0a 73 74  database)..*/.st
ec80: 61 74 69 63 20 76 6f 69 64 20 64 65 73 74 72 6f  atic void destro
ec90: 79 54 61 62 6c 65 28 50 61 72 73 65 20 2a 70 50  yTable(Parse *pP
eca0: 61 72 73 65 2c 20 54 61 62 6c 65 20 2a 70 54 61  arse, Table *pTa
ecb0: 62 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  b){.#ifdef SQLIT
ecc0: 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
ecd0: 4d 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b  M.  Index *pIdx;
ece0: 0a 20 20 69 6e 74 20 69 44 62 20 3d 20 73 71 6c  .  int iDb = sql
ecf0: 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65  ite3SchemaToInde
ed00: 78 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 54  x(pParse->db, pT
ed10: 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20  ab->pSchema);.  
ed20: 64 65 73 74 72 6f 79 52 6f 6f 74 50 61 67 65 28  destroyRootPage(
ed30: 70 50 61 72 73 65 2c 20 70 54 61 62 2d 3e 74 6e  pParse, pTab->tn
ed40: 75 6d 2c 20 69 44 62 29 3b 0a 20 20 66 6f 72 28  um, iDb);.  for(
ed50: 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65  pIdx=pTab->pInde
ed60: 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49  x; pIdx; pIdx=pI
ed70: 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  dx->pNext){.    
ed80: 64 65 73 74 72 6f 79 52 6f 6f 74 50 61 67 65 28  destroyRootPage(
ed90: 70 50 61 72 73 65 2c 20 70 49 64 78 2d 3e 74 6e  pParse, pIdx->tn
eda0: 75 6d 2c 20 69 44 62 29 3b 0a 20 20 7d 0a 23 65  um, iDb);.  }.#e
edb0: 6c 73 65 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  lse.  /* If the 
edc0: 64 61 74 61 62 61 73 65 20 6d 61 79 20 62 65 20  database may be 
edd0: 61 75 74 6f 2d 76 61 63 75 75 6d 20 63 61 70 61  auto-vacuum capa
ede0: 62 6c 65 20 28 69 66 20 53 51 4c 49 54 45 5f 4f  ble (if SQLITE_O
edf0: 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
ee00: 20 2a 2a 20 69 73 20 6e 6f 74 20 64 65 66 69 6e   ** is not defin
ee10: 65 64 29 2c 20 74 68 65 6e 20 69 74 20 69 73 20  ed), then it is 
ee20: 69 6d 70 6f 72 74 61 6e 74 20 74 6f 20 63 61 6c  important to cal
ee30: 6c 20 4f 50 5f 44 65 73 74 72 6f 79 20 6f 6e 20  l OP_Destroy on 
ee40: 74 68 65 0a 20 20 2a 2a 20 74 61 62 6c 65 20 61  the.  ** table a
ee50: 6e 64 20 69 6e 64 65 78 20 72 6f 6f 74 2d 70 61  nd index root-pa
ee60: 67 65 73 20 69 6e 20 6f 72 64 65 72 2c 20 73 74  ges in order, st
ee70: 61 72 74 69 6e 67 20 77 69 74 68 20 74 68 65 20  arting with the 
ee80: 6e 75 6d 65 72 69 63 61 6c 6c 79 20 0a 20 20 2a  numerically .  *
ee90: 2a 20 6c 61 72 67 65 73 74 20 72 6f 6f 74 2d 70  * largest root-p
eea0: 61 67 65 20 6e 75 6d 62 65 72 2e 20 54 68 69 73  age number. This
eeb0: 20 67 75 61 72 61 6e 74 65 65 73 20 74 68 61 74   guarantees that
eec0: 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20 72 6f 6f   none of the roo
eed0: 74 2d 70 61 67 65 73 0a 20 20 2a 2a 20 74 6f 20  t-pages.  ** to 
eee0: 62 65 20 64 65 73 74 72 6f 79 65 64 20 69 73 20  be destroyed is 
eef0: 72 65 6c 6f 63 61 74 65 64 20 62 79 20 61 6e 20  relocated by an 
ef00: 65 61 72 6c 69 65 72 20 4f 50 5f 44 65 73 74 72  earlier OP_Destr
ef10: 6f 79 2e 20 69 2e 65 2e 20 69 66 20 74 68 65 0a  oy. i.e. if the.
ef20: 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 77    ** following w
ef30: 65 72 65 20 63 6f 64 65 64 3a 0a 20 20 2a 2a 0a  ere coded:.  **.
ef40: 20 20 2a 2a 20 4f 50 5f 44 65 73 74 72 6f 79 20    ** OP_Destroy 
ef50: 34 20 30 0a 20 20 2a 2a 20 2e 2e 2e 0a 20 20 2a  4 0.  ** ....  *
ef60: 2a 20 4f 50 5f 44 65 73 74 72 6f 79 20 35 20 30  * OP_Destroy 5 0
ef70: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 61 6e 64 20 72  .  **.  ** and r
ef80: 6f 6f 74 20 70 61 67 65 20 35 20 68 61 70 70 65  oot page 5 happe
ef90: 6e 65 64 20 74 6f 20 62 65 20 74 68 65 20 6c 61  ned to be the la
efa0: 72 67 65 73 74 20 72 6f 6f 74 2d 70 61 67 65 20  rgest root-page 
efb0: 6e 75 6d 62 65 72 20 69 6e 20 74 68 65 0a 20 20  number in the.  
efc0: 2a 2a 20 64 61 74 61 62 61 73 65 2c 20 74 68 65  ** database, the
efd0: 6e 20 72 6f 6f 74 20 70 61 67 65 20 35 20 77 6f  n root page 5 wo
efe0: 75 6c 64 20 62 65 20 6d 6f 76 65 64 20 74 6f 20  uld be moved to 
eff0: 70 61 67 65 20 34 20 62 79 20 74 68 65 20 0a 20  page 4 by the . 
f000: 20 2a 2a 20 22 4f 50 5f 44 65 73 74 72 6f 79 20   ** "OP_Destroy 
f010: 34 20 30 22 20 6f 70 63 6f 64 65 2e 20 54 68 65  4 0" opcode. The
f020: 20 73 75 62 73 65 71 75 65 6e 74 20 22 4f 50 5f   subsequent "OP_
f030: 44 65 73 74 72 6f 79 20 35 20 30 22 20 77 6f 75  Destroy 5 0" wou
f040: 6c 64 20 68 69 74 0a 20 20 2a 2a 20 61 20 66 72  ld hit.  ** a fr
f050: 65 65 2d 6c 69 73 74 20 70 61 67 65 2e 0a 20 20  ee-list page..  
f060: 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 20 3d 20  */.  int iTab = 
f070: 70 54 61 62 2d 3e 74 6e 75 6d 3b 0a 20 20 69 6e  pTab->tnum;.  in
f080: 74 20 69 44 65 73 74 72 6f 79 65 64 20 3d 20 30  t iDestroyed = 0
f090: 3b 0a 0a 20 20 77 68 69 6c 65 28 20 31 20 29 7b  ;..  while( 1 ){
f0a0: 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78  .    Index *pIdx
f0b0: 3b 0a 20 20 20 20 69 6e 74 20 69 4c 61 72 67 65  ;.    int iLarge
f0c0: 73 74 20 3d 20 30 3b 0a 0a 20 20 20 20 69 66 28  st = 0;..    if(
f0d0: 20 69 44 65 73 74 72 6f 79 65 64 3d 3d 30 20 7c   iDestroyed==0 |
f0e0: 7c 20 69 54 61 62 3c 69 44 65 73 74 72 6f 79 65  | iTab<iDestroye
f0f0: 64 20 29 7b 0a 20 20 20 20 20 20 69 4c 61 72 67  d ){.      iLarg
f100: 65 73 74 20 3d 20 69 54 61 62 3b 0a 20 20 20 20  est = iTab;.    
f110: 7d 0a 20 20 20 20 66 6f 72 28 70 49 64 78 3d 70  }.    for(pIdx=p
f120: 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64  Tab->pIndex; pId
f130: 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e  x; pIdx=pIdx->pN
f140: 65 78 74 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  ext){.      int 
f150: 69 49 64 78 20 3d 20 70 49 64 78 2d 3e 74 6e 75  iIdx = pIdx->tnu
f160: 6d 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  m;.      assert(
f170: 20 70 49 64 78 2d 3e 70 53 63 68 65 6d 61 3d 3d   pIdx->pSchema==
f180: 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 20 29 3b  pTab->pSchema );
f190: 0a 20 20 20 20 20 20 69 66 28 20 28 69 44 65 73  .      if( (iDes
f1a0: 74 72 6f 79 65 64 3d 3d 30 20 7c 7c 20 28 69 49  troyed==0 || (iI
f1b0: 64 78 3c 69 44 65 73 74 72 6f 79 65 64 29 29 20  dx<iDestroyed)) 
f1c0: 26 26 20 69 49 64 78 3e 69 4c 61 72 67 65 73 74  && iIdx>iLargest
f1d0: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 4c 61 72   ){.        iLar
f1e0: 67 65 73 74 20 3d 20 69 49 64 78 3b 0a 20 20 20  gest = iIdx;.   
f1f0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
f200: 66 28 20 69 4c 61 72 67 65 73 74 3d 3d 30 20 29  f( iLargest==0 )
f210: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a  {.      return;.
f220: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
f230: 20 69 6e 74 20 69 44 62 20 3d 20 73 71 6c 69 74   int iDb = sqlit
f240: 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28  e3SchemaToIndex(
f250: 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 54 61 62  pParse->db, pTab
f260: 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20  ->pSchema);.    
f270: 20 20 64 65 73 74 72 6f 79 52 6f 6f 74 50 61 67    destroyRootPag
f280: 65 28 70 50 61 72 73 65 2c 20 69 4c 61 72 67 65  e(pParse, iLarge
f290: 73 74 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20  st, iDb);.      
f2a0: 69 44 65 73 74 72 6f 79 65 64 20 3d 20 69 4c 61  iDestroyed = iLa
f2b0: 72 67 65 73 74 3b 0a 20 20 20 20 7d 0a 20 20 7d  rgest;.    }.  }
f2c0: 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a  .#endif.}../*.**
f2d0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
f2e0: 20 63 61 6c 6c 65 64 20 74 6f 20 64 6f 20 74 68   called to do th
f2f0: 65 20 77 6f 72 6b 20 6f 66 20 61 20 44 52 4f 50  e work of a DROP
f300: 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74   TABLE statement
f310: 2e 0a 2a 2a 20 70 4e 61 6d 65 20 69 73 20 74 68  ..** pName is th
f320: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61  e name of the ta
f330: 62 6c 65 20 74 6f 20 62 65 20 64 72 6f 70 70 65  ble to be droppe
f340: 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  d..*/.void sqlit
f350: 65 33 44 72 6f 70 54 61 62 6c 65 28 50 61 72 73  e3DropTable(Pars
f360: 65 20 2a 70 50 61 72 73 65 2c 20 53 72 63 4c 69  e *pParse, SrcLi
f370: 73 74 20 2a 70 4e 61 6d 65 2c 20 69 6e 74 20 69  st *pName, int i
f380: 73 56 69 65 77 2c 20 69 6e 74 20 6e 6f 45 72 72  sView, int noErr
f390: 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  ){.  Table *pTab
f3a0: 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 73  ;.  Vdbe *v;.  s
f3b0: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
f3c0: 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 69  rse->db;.  int i
f3d0: 44 62 3b 0a 0a 20 20 69 66 28 20 70 50 61 72 73  Db;..  if( pPars
f3e0: 65 2d 3e 6e 45 72 72 20 7c 7c 20 64 62 2d 3e 6d  e->nErr || db->m
f3f0: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
f400: 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f     goto exit_dro
f410: 70 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 20 20 61  p_table;.  }.  a
f420: 73 73 65 72 74 28 20 70 4e 61 6d 65 2d 3e 6e 53  ssert( pName->nS
f430: 72 63 3d 3d 31 20 29 3b 0a 20 20 70 54 61 62 20  rc==1 );.  pTab 
f440: 3d 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54  = sqlite3LocateT
f450: 61 62 6c 65 28 70 50 61 72 73 65 2c 20 69 73 56  able(pParse, isV
f460: 69 65 77 2c 20 0a 20 20 20 20 20 20 20 20 20 20  iew, .          
f470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f480: 20 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 4e    pName->a[0].zN
f490: 61 6d 65 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d  ame, pName->a[0]
f4a0: 2e 7a 44 61 74 61 62 61 73 65 29 3b 0a 0a 20 20  .zDatabase);..  
f4b0: 69 66 28 20 70 54 61 62 3d 3d 30 20 29 7b 0a 20  if( pTab==0 ){. 
f4c0: 20 20 20 69 66 28 20 6e 6f 45 72 72 20 29 7b 0a     if( noErr ){.
f4d0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
f4e0: 6f 72 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b  orClear(pParse);
f4f0: 0a 20 20 20 20 7d 0a 20 20 20 20 67 6f 74 6f 20  .    }.    goto 
f500: 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b  exit_drop_table;
f510: 0a 20 20 7d 0a 20 20 69 44 62 20 3d 20 73 71 6c  .  }.  iDb = sql
f520: 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65  ite3SchemaToInde
f530: 78 28 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68  x(db, pTab->pSch
f540: 65 6d 61 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ema);.  assert( 
f550: 69 44 62 3e 3d 30 20 26 26 20 69 44 62 3c 64 62  iDb>=0 && iDb<db
f560: 2d 3e 6e 44 62 20 29 3b 0a 0a 20 20 2f 2a 20 49  ->nDb );..  /* I
f570: 66 20 70 54 61 62 20 69 73 20 61 20 76 69 72 74  f pTab is a virt
f580: 75 61 6c 20 74 61 62 6c 65 2c 20 63 61 6c 6c 20  ual table, call 
f590: 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d  ViewGetColumnNam
f5a0: 65 73 28 29 20 74 6f 20 65 6e 73 75 72 65 0a 20  es() to ensure. 
f5b0: 20 2a 2a 20 69 74 20 69 73 20 69 6e 69 74 69 61   ** it is initia
f5c0: 6c 69 7a 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66  lized..  */.  if
f5d0: 28 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62  ( IsVirtual(pTab
f5e0: 29 20 26 26 20 73 71 6c 69 74 65 33 56 69 65 77  ) && sqlite3View
f5f0: 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70  GetColumnNames(p
f600: 50 61 72 73 65 2c 20 70 54 61 62 29 20 29 7b 0a  Parse, pTab) ){.
f610: 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72      goto exit_dr
f620: 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 23 69  op_table;.  }.#i
f630: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
f640: 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a  T_AUTHORIZATION.
f650: 20 20 7b 0a 20 20 20 20 69 6e 74 20 63 6f 64 65    {.    int code
f660: 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  ;.    const char
f670: 20 2a 7a 54 61 62 20 3d 20 53 43 48 45 4d 41 5f   *zTab = SCHEMA_
f680: 54 41 42 4c 45 28 69 44 62 29 3b 0a 20 20 20 20  TABLE(iDb);.    
f690: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 20  const char *zDb 
f6a0: 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a  = db->aDb[iDb].z
f6b0: 4e 61 6d 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20  Name;.    const 
f6c0: 63 68 61 72 20 2a 7a 41 72 67 32 20 3d 20 30 3b  char *zArg2 = 0;
f6d0: 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
f6e0: 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65  AuthCheck(pParse
f6f0: 2c 20 53 51 4c 49 54 45 5f 44 45 4c 45 54 45 2c  , SQLITE_DELETE,
f700: 20 7a 54 61 62 2c 20 30 2c 20 7a 44 62 29 29 7b   zTab, 0, zDb)){
f710: 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74  .      goto exit
f720: 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 20  _drop_table;.   
f730: 20 7d 0a 20 20 20 20 69 66 28 20 69 73 56 69 65   }.    if( isVie
f740: 77 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 21  w ){.      if( !
f750: 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26 26 20 69  OMIT_TEMPDB && i
f760: 44 62 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 20  Db==1 ){.       
f770: 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44   code = SQLITE_D
f780: 52 4f 50 5f 54 45 4d 50 5f 56 49 45 57 3b 0a 20  ROP_TEMP_VIEW;. 
f790: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
f7a0: 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54      code = SQLIT
f7b0: 45 5f 44 52 4f 50 5f 56 49 45 57 3b 0a 20 20 20  E_DROP_VIEW;.   
f7c0: 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c     }.#ifndef SQL
f7d0: 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
f7e0: 54 41 42 4c 45 0a 20 20 20 20 7d 65 6c 73 65 20  TABLE.    }else 
f7f0: 69 66 28 20 49 73 56 69 72 74 75 61 6c 28 70 54  if( IsVirtual(pT
f800: 61 62 29 20 29 7b 0a 20 20 20 20 20 20 63 6f 64  ab) ){.      cod
f810: 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f  e = SQLITE_DROP_
f820: 56 54 41 42 4c 45 3b 0a 20 20 20 20 20 20 7a 41  VTABLE;.      zA
f830: 72 67 32 20 3d 20 70 54 61 62 2d 3e 70 4d 6f 64  rg2 = pTab->pMod
f840: 2d 3e 7a 4e 61 6d 65 3b 0a 23 65 6e 64 69 66 0a  ->zName;.#endif.
f850: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
f860: 20 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44   if( !OMIT_TEMPD
f870: 42 20 26 26 20 69 44 62 3d 3d 31 20 29 7b 0a 20  B && iDb==1 ){. 
f880: 20 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51         code = SQ
f890: 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 54  LITE_DROP_TEMP_T
f8a0: 41 42 4c 45 3b 0a 20 20 20 20 20 20 7d 65 6c 73  ABLE;.      }els
f8b0: 65 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20  e{.        code 
f8c0: 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 41  = SQLITE_DROP_TA
f8d0: 42 4c 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  BLE;.      }.   
f8e0: 20 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74   }.    if( sqlit
f8f0: 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72  e3AuthCheck(pPar
f900: 73 65 2c 20 63 6f 64 65 2c 20 70 54 61 62 2d 3e  se, code, pTab->
f910: 7a 4e 61 6d 65 2c 20 7a 41 72 67 32 2c 20 7a 44  zName, zArg2, zD
f920: 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  b) ){.      goto
f930: 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65   exit_drop_table
f940: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
f950: 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b  sqlite3AuthCheck
f960: 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f  (pParse, SQLITE_
f970: 44 45 4c 45 54 45 2c 20 70 54 61 62 2d 3e 7a 4e  DELETE, pTab->zN
f980: 61 6d 65 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a  ame, 0, zDb) ){.
f990: 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f        goto exit_
f9a0: 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 20 20  drop_table;.    
f9b0: 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69  }.  }.#endif.  i
f9c0: 66 28 20 70 54 61 62 2d 3e 72 65 61 64 4f 6e 6c  f( pTab->readOnl
f9d0: 79 20 7c 7c 20 70 54 61 62 3d 3d 64 62 2d 3e 61  y || pTab==db->a
f9e0: 44 62 5b 69 44 62 5d 2e 70 53 63 68 65 6d 61 2d  Db[iDb].pSchema-
f9f0: 3e 70 53 65 71 54 61 62 20 29 7b 0a 20 20 20 20  >pSeqTab ){.    
fa00: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
fa10: 70 50 61 72 73 65 2c 20 22 74 61 62 6c 65 20 25  pParse, "table %
fa20: 73 20 6d 61 79 20 6e 6f 74 20 62 65 20 64 72 6f  s may not be dro
fa30: 70 70 65 64 22 2c 20 70 54 61 62 2d 3e 7a 4e 61  pped", pTab->zNa
fa40: 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78  me);.    goto ex
fa50: 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20  it_drop_table;. 
fa60: 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   }..#ifndef SQLI
fa70: 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 20 20 2f  TE_OMIT_VIEW.  /
fa80: 2a 20 45 6e 73 75 72 65 20 44 52 4f 50 20 54 41  * Ensure DROP TA
fa90: 42 4c 45 20 69 73 20 6e 6f 74 20 75 73 65 64 20  BLE is not used 
faa0: 6f 6e 20 61 20 76 69 65 77 2c 20 61 6e 64 20 44  on a view, and D
fab0: 52 4f 50 20 56 49 45 57 20 69 73 20 6e 6f 74 20  ROP VIEW is not 
fac0: 75 73 65 64 0a 20 20 2a 2a 20 6f 6e 20 61 20 74  used.  ** on a t
fad0: 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  able..  */.  if(
fae0: 20 69 73 56 69 65 77 20 26 26 20 70 54 61 62 2d   isView && pTab-
faf0: 3e 70 53 65 6c 65 63 74 3d 3d 30 20 29 7b 0a 20  >pSelect==0 ){. 
fb00: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
fb10: 73 67 28 70 50 61 72 73 65 2c 20 22 75 73 65 20  sg(pParse, "use 
fb20: 44 52 4f 50 20 54 41 42 4c 45 20 74 6f 20 64 65  DROP TABLE to de
fb30: 6c 65 74 65 20 74 61 62 6c 65 20 25 73 22 2c 20  lete table %s", 
fb40: 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pTab->zName);.  
fb50: 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70    goto exit_drop
fb60: 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 20 20 69 66  _table;.  }.  if
fb70: 28 20 21 69 73 56 69 65 77 20 26 26 20 70 54 61  ( !isView && pTa
fb80: 62 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20  b->pSelect ){.  
fb90: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
fba0: 67 28 70 50 61 72 73 65 2c 20 22 75 73 65 20 44  g(pParse, "use D
fbb0: 52 4f 50 20 56 49 45 57 20 74 6f 20 64 65 6c 65  ROP VIEW to dele
fbc0: 74 65 20 76 69 65 77 20 25 73 22 2c 20 70 54 61  te view %s", pTa
fbd0: 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 67  b->zName);.    g
fbe0: 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61  oto exit_drop_ta
fbf0: 62 6c 65 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  ble;.  }.#endif.
fc00: 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63  .  /* Generate c
fc10: 6f 64 65 20 74 6f 20 72 65 6d 6f 76 65 20 74 68  ode to remove th
fc20: 65 20 74 61 62 6c 65 20 66 72 6f 6d 20 74 68 65  e table from the
fc30: 20 6d 61 73 74 65 72 20 74 61 62 6c 65 0a 20 20   master table.  
fc40: 2a 2a 20 6f 6e 20 64 69 73 6b 2e 0a 20 20 2a 2f  ** on disk..  */
fc50: 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65  .  v = sqlite3Ge
fc60: 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
fc70: 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20 54 72   if( v ){.    Tr
fc80: 69 67 67 65 72 20 2a 70 54 72 69 67 67 65 72 3b  igger *pTrigger;
fc90: 0a 20 20 20 20 44 62 20 2a 70 44 62 20 3d 20 26  .    Db *pDb = &
fca0: 64 62 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a 20 20  db->aDb[iDb];.  
fcb0: 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72    sqlite3BeginWr
fcc0: 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61  iteOperation(pPa
fcd0: 72 73 65 2c 20 31 2c 20 69 44 62 29 3b 0a 0a 23  rse, 1, iDb);..#
fce0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
fcf0: 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
fd00: 20 20 20 20 69 66 28 20 49 73 56 69 72 74 75 61      if( IsVirtua
fd10: 6c 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20  l(pTab) ){.     
fd20: 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74   Vdbe *v = sqlit
fd30: 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
fd40: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 76 20 29  );.      if( v )
fd50: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
fd60: 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f  3VdbeAddOp0(v, O
fd70: 50 5f 56 42 65 67 69 6e 29 3b 0a 20 20 20 20 20  P_VBegin);.     
fd80: 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a   }.    }.#endif.
fd90: 0a 20 20 20 20 2f 2a 20 44 72 6f 70 20 61 6c 6c  .    /* Drop all
fda0: 20 74 72 69 67 67 65 72 73 20 61 73 73 6f 63 69   triggers associ
fdb0: 61 74 65 64 20 77 69 74 68 20 74 68 65 20 74 61  ated with the ta
fdc0: 62 6c 65 20 62 65 69 6e 67 20 64 72 6f 70 70 65  ble being droppe
fdd0: 64 2e 20 43 6f 64 65 0a 20 20 20 20 2a 2a 20 69  d. Code.    ** i
fde0: 73 20 67 65 6e 65 72 61 74 65 64 20 74 6f 20 72  s generated to r
fdf0: 65 6d 6f 76 65 20 65 6e 74 72 69 65 73 20 66 72  emove entries fr
fe00: 6f 6d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  om sqlite_master
fe10: 20 61 6e 64 2f 6f 72 0a 20 20 20 20 2a 2a 20 73   and/or.    ** s
fe20: 71 6c 69 74 65 5f 74 65 6d 70 5f 6d 61 73 74 65  qlite_temp_maste
fe30: 72 20 69 66 20 72 65 71 75 69 72 65 64 2e 0a 20  r if required.. 
fe40: 20 20 20 2a 2f 0a 20 20 20 20 70 54 72 69 67 67     */.    pTrigg
fe50: 65 72 20 3d 20 70 54 61 62 2d 3e 70 54 72 69 67  er = pTab->pTrig
fe60: 67 65 72 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  ger;.    while( 
fe70: 70 54 72 69 67 67 65 72 20 29 7b 0a 20 20 20 20  pTrigger ){.    
fe80: 20 20 61 73 73 65 72 74 28 20 70 54 72 69 67 67    assert( pTrigg
fe90: 65 72 2d 3e 70 53 63 68 65 6d 61 3d 3d 70 54 61  er->pSchema==pTa
fea0: 62 2d 3e 70 53 63 68 65 6d 61 20 7c 7c 20 0a 20  b->pSchema || . 
feb0: 20 20 20 20 20 20 20 20 20 70 54 72 69 67 67 65           pTrigge
fec0: 72 2d 3e 70 53 63 68 65 6d 61 3d 3d 64 62 2d 3e  r->pSchema==db->
fed0: 61 44 62 5b 31 5d 2e 70 53 63 68 65 6d 61 20 29  aDb[1].pSchema )
fee0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  ;.      sqlite3D
fef0: 72 6f 70 54 72 69 67 67 65 72 50 74 72 28 70 50  ropTriggerPtr(pP
ff00: 61 72 73 65 2c 20 70 54 72 69 67 67 65 72 29 3b  arse, pTrigger);
ff10: 0a 20 20 20 20 20 20 70 54 72 69 67 67 65 72 20  .      pTrigger 
ff20: 3d 20 70 54 72 69 67 67 65 72 2d 3e 70 4e 65 78  = pTrigger->pNex
ff30: 74 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 6e 64 65  t;.    }..#ifnde
ff40: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
ff50: 54 4f 49 4e 43 52 45 4d 45 4e 54 0a 20 20 20 20  TOINCREMENT.    
ff60: 2f 2a 20 52 65 6d 6f 76 65 20 61 6e 79 20 65 6e  /* Remove any en
ff70: 74 72 69 65 73 20 6f 66 20 74 68 65 20 73 71 6c  tries of the sql
ff80: 69 74 65 5f 73 65 71 75 65 6e 63 65 20 74 61 62  ite_sequence tab
ff90: 6c 65 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  le associated wi
ffa0: 74 68 0a 20 20 20 20 2a 2a 20 74 68 65 20 74 61  th.    ** the ta
ffb0: 62 6c 65 20 62 65 69 6e 67 20 64 72 6f 70 70 65  ble being droppe
ffc0: 64 2e 20 54 68 69 73 20 69 73 20 64 6f 6e 65 20  d. This is done 
ffd0: 62 65 66 6f 72 65 20 74 68 65 20 74 61 62 6c 65  before the table
ffe0: 20 69 73 20 64 72 6f 70 70 65 64 0a 20 20 20 20   is dropped.    
fff0: 2a 2a 20 61 74 20 74 68 65 20 62 74 72 65 65 20  ** at the btree 
10000 6c 65 76 65 6c 2c 20 69 6e 20 63 61 73 65 20 74  level, in case t
10010 68 65 20 73 71 6c 69 74 65 5f 73 65 71 75 65 6e  he sqlite_sequen
10020 63 65 20 74 61 62 6c 65 20 6e 65 65 64 73 20 74  ce table needs t
10030 6f 0a 20 20 20 20 2a 2a 20 6d 6f 76 65 20 61 73  o.    ** move as
10040 20 61 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65   a result of the
10050 20 64 72 6f 70 20 28 63 61 6e 20 68 61 70 70 65   drop (can happe
10060 6e 20 69 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d  n in auto-vacuum
10070 20 6d 6f 64 65 29 2e 0a 20 20 20 20 2a 2f 0a 20   mode)..    */. 
10080 20 20 20 69 66 28 20 70 54 61 62 2d 3e 61 75 74     if( pTab->aut
10090 6f 49 6e 63 20 29 7b 0a 20 20 20 20 20 20 73 71  oInc ){.      sq
100a0 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72 73 65  lite3NestedParse
100b0 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20  (pParse,.       
100c0 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 25 73   "DELETE FROM %s
100d0 2e 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65  .sqlite_sequence
100e0 20 57 48 45 52 45 20 6e 61 6d 65 3d 25 51 22 2c   WHERE name=%Q",
100f0 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 4e  .        pDb->zN
10100 61 6d 65 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  ame, pTab->zName
10110 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a  .      );.    }.
10120 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 44  #endif..    /* D
10130 72 6f 70 20 61 6c 6c 20 53 51 4c 49 54 45 5f 4d  rop all SQLITE_M
10140 41 53 54 45 52 20 74 61 62 6c 65 20 61 6e 64 20  ASTER table and 
10150 69 6e 64 65 78 20 65 6e 74 72 69 65 73 20 74 68  index entries th
10160 61 74 20 72 65 66 65 72 20 74 6f 20 74 68 65 0a  at refer to the.
10170 20 20 20 20 2a 2a 20 74 61 62 6c 65 2e 20 54 68      ** table. Th
10180 65 20 70 72 6f 67 72 61 6d 20 6e 61 6d 65 20 6c  e program name l
10190 6f 6f 70 73 20 74 68 72 6f 75 67 68 20 74 68 65  oops through the
101a0 20 6d 61 73 74 65 72 20 74 61 62 6c 65 20 61 6e   master table an
101b0 64 20 64 65 6c 65 74 65 73 0a 20 20 20 20 2a 2a  d deletes.    **
101c0 20 65 76 65 72 79 20 72 6f 77 20 74 68 61 74 20   every row that 
101d0 72 65 66 65 72 73 20 74 6f 20 61 20 74 61 62 6c  refers to a tabl
101e0 65 20 6f 66 20 74 68 65 20 73 61 6d 65 20 6e 61  e of the same na
101f0 6d 65 20 61 73 20 74 68 65 20 6f 6e 65 20 62 65  me as the one be
10200 69 6e 67 0a 20 20 20 20 2a 2a 20 64 72 6f 70 70  ing.    ** dropp
10210 65 64 2e 20 54 72 69 67 67 65 72 73 20 61 72 65  ed. Triggers are
10220 20 68 61 6e 64 6c 65 64 20 73 65 70 65 72 61 74   handled seperat
10230 65 6c 79 20 62 65 63 61 75 73 65 20 61 20 74 72  ely because a tr
10240 69 67 67 65 72 20 63 61 6e 20 62 65 0a 20 20 20  igger can be.   
10250 20 2a 2a 20 63 72 65 61 74 65 64 20 69 6e 20 74   ** created in t
10260 68 65 20 74 65 6d 70 20 64 61 74 61 62 61 73 65  he temp database
10270 20 74 68 61 74 20 72 65 66 65 72 73 20 74 6f 20   that refers to 
10280 61 20 74 61 62 6c 65 20 69 6e 20 61 6e 6f 74 68  a table in anoth
10290 65 72 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61  er.    ** databa
102a0 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73  se..    */.    s
102b0 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72 73  qlite3NestedPars
102c0 65 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20  e(pParse, .     
102d0 20 20 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20     "DELETE FROM 
102e0 25 51 2e 25 73 20 57 48 45 52 45 20 74 62 6c 5f  %Q.%s WHERE tbl_
102f0 6e 61 6d 65 3d 25 51 20 61 6e 64 20 74 79 70 65  name=%Q and type
10300 21 3d 27 74 72 69 67 67 65 72 27 22 2c 0a 20 20  !='trigger'",.  
10310 20 20 20 20 20 20 70 44 62 2d 3e 7a 4e 61 6d 65        pDb->zName
10320 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69  , SCHEMA_TABLE(i
10330 44 62 29 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  Db), pTab->zName
10340 29 3b 0a 0a 20 20 20 20 2f 2a 20 44 72 6f 70 20  );..    /* Drop 
10350 61 6e 79 20 73 74 61 74 69 73 74 69 63 73 20 66  any statistics f
10360 72 6f 6d 20 74 68 65 20 73 71 6c 69 74 65 5f 73  rom the sqlite_s
10370 74 61 74 31 20 74 61 62 6c 65 2c 20 69 66 20 69  tat1 table, if i
10380 74 20 65 78 69 73 74 73 20 2a 2f 0a 20 20 20 20  t exists */.    
10390 69 66 28 20 73 71 6c 69 74 65 33 46 69 6e 64 54  if( sqlite3FindT
103a0 61 62 6c 65 28 64 62 2c 20 22 73 71 6c 69 74 65  able(db, "sqlite
103b0 5f 73 74 61 74 31 22 2c 20 64 62 2d 3e 61 44 62  _stat1", db->aDb
103c0 5b 69 44 62 5d 2e 7a 4e 61 6d 65 29 20 29 7b 0a  [iDb].zName) ){.
103d0 20 20 20 20 20 20 73 71 6c 69 74 65 33 4e 65 73        sqlite3Nes
103e0 74 65 64 50 61 72 73 65 28 70 50 61 72 73 65 2c  tedParse(pParse,
103f0 0a 20 20 20 20 20 20 20 20 22 44 45 4c 45 54 45  .        "DELETE
10400 20 46 52 4f 4d 20 25 51 2e 73 71 6c 69 74 65 5f   FROM %Q.sqlite_
10410 73 74 61 74 31 20 57 48 45 52 45 20 74 62 6c 3d  stat1 WHERE tbl=
10420 25 51 22 2c 20 70 44 62 2d 3e 7a 4e 61 6d 65 2c  %Q", pDb->zName,
10430 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 0a 20 20 20   pTab->zName.   
10440 20 20 20 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20     );.    }..   
10450 20 69 66 28 20 21 69 73 56 69 65 77 20 26 26 20   if( !isView && 
10460 21 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29  !IsVirtual(pTab)
10470 20 29 7b 0a 20 20 20 20 20 20 64 65 73 74 72 6f   ){.      destro
10480 79 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70  yTable(pParse, p
10490 54 61 62 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  Tab);.    }..   
104a0 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 74   /* Remove the t
104b0 61 62 6c 65 20 65 6e 74 72 79 20 66 72 6f 6d 20  able entry from 
104c0 53 51 4c 69 74 65 27 73 20 69 6e 74 65 72 6e 61  SQLite's interna
104d0 6c 20 73 63 68 65 6d 61 20 61 6e 64 20 6d 6f 64  l schema and mod
104e0 69 66 79 0a 20 20 20 20 2a 2a 20 74 68 65 20 73  ify.    ** the s
104f0 63 68 65 6d 61 20 63 6f 6f 6b 69 65 2e 0a 20 20  chema cookie..  
10500 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 49 73 56    */.    if( IsV
10510 69 72 74 75 61 6c 28 70 54 61 62 29 20 29 7b 0a  irtual(pTab) ){.
10520 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
10530 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 56 44  eAddOp4(v, OP_VD
10540 65 73 74 72 6f 79 2c 20 69 44 62 2c 20 30 2c 20  estroy, iDb, 0, 
10550 30 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20  0, pTab->zName, 
10560 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  0);.    }.    sq
10570 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
10580 76 2c 20 4f 50 5f 44 72 6f 70 54 61 62 6c 65 2c  v, OP_DropTable,
10590 20 69 44 62 2c 20 30 2c 20 30 2c 20 70 54 61 62   iDb, 0, 0, pTab
105a0 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20  ->zName, 0);.   
105b0 20 73 71 6c 69 74 65 33 43 68 61 6e 67 65 43 6f   sqlite3ChangeCo
105c0 6f 6b 69 65 28 70 50 61 72 73 65 2c 20 69 44 62  okie(pParse, iDb
105d0 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 56  );.  }.  sqliteV
105e0 69 65 77 52 65 73 65 74 41 6c 6c 28 64 62 2c 20  iewResetAll(db, 
105f0 69 44 62 29 3b 0a 0a 65 78 69 74 5f 64 72 6f 70  iDb);..exit_drop
10600 5f 74 61 62 6c 65 3a 0a 20 20 73 71 6c 69 74 65  _table:.  sqlite
10610 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28 70  3SrcListDelete(p
10620 4e 61 6d 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Name);.}../*.** 
10630 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
10640 63 61 6c 6c 65 64 20 74 6f 20 63 72 65 61 74 65  called to create
10650 20 61 20 6e 65 77 20 66 6f 72 65 69 67 6e 20 6b   a new foreign k
10660 65 79 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 0a  ey on the table.
10670 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64  ** currently und
10680 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e  er construction.
10690 20 20 70 46 72 6f 6d 43 6f 6c 20 64 65 74 65 72    pFromCol deter
106a0 6d 69 6e 65 73 20 77 68 69 63 68 20 63 6f 6c 75  mines which colu
106b0 6d 6e 73 0a 2a 2a 20 69 6e 20 74 68 65 20 63 75  mns.** in the cu
106c0 72 72 65 6e 74 20 74 61 62 6c 65 20 70 6f 69 6e  rrent table poin
106d0 74 20 74 6f 20 74 68 65 20 66 6f 72 65 69 67 6e  t to the foreign
106e0 20 6b 65 79 2e 20 20 49 66 20 70 46 72 6f 6d 43   key.  If pFromC
106f0 6f 6c 3d 3d 30 20 74 68 65 6e 0a 2a 2a 20 63 6f  ol==0 then.** co
10700 6e 6e 65 63 74 20 74 68 65 20 6b 65 79 20 74 6f  nnect the key to
10710 20 74 68 65 20 6c 61 73 74 20 63 6f 6c 75 6d 6e   the last column
10720 20 69 6e 73 65 72 74 65 64 2e 20 20 70 54 6f 20   inserted.  pTo 
10730 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 0a 2a  is the name of.*
10740 2a 20 74 68 65 20 74 61 62 6c 65 20 72 65 66 65  * the table refe
10750 72 72 65 64 20 74 6f 2e 20 20 70 54 6f 43 6f 6c  rred to.  pToCol
10760 20 69 73 20 61 20 6c 69 73 74 20 6f 66 20 74 61   is a list of ta
10770 62 6c 65 73 20 69 6e 20 74 68 65 20 6f 74 68 65  bles in the othe
10780 72 0a 2a 2a 20 70 54 6f 20 74 61 62 6c 65 20 74  r.** pTo table t
10790 68 61 74 20 74 68 65 20 66 6f 72 65 69 67 6e 20  hat the foreign 
107a0 6b 65 79 20 70 6f 69 6e 74 73 20 74 6f 2e 20 20  key points to.  
107b0 66 6c 61 67 73 20 63 6f 6e 74 61 69 6e 73 20 61  flags contains a
107c0 6c 6c 0a 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f  ll.** informatio
107d0 6e 20 61 62 6f 75 74 20 74 68 65 20 63 6f 6e 66  n about the conf
107e0 6c 69 63 74 20 72 65 73 6f 6c 75 74 69 6f 6e 20  lict resolution 
107f0 61 6c 67 6f 72 69 74 68 6d 73 20 73 70 65 63 69  algorithms speci
10800 66 69 65 64 0a 2a 2a 20 69 6e 20 74 68 65 20 4f  fied.** in the O
10810 4e 20 44 45 4c 45 54 45 2c 20 4f 4e 20 55 50 44  N DELETE, ON UPD
10820 41 54 45 20 61 6e 64 20 4f 4e 20 49 4e 53 45 52  ATE and ON INSER
10830 54 20 63 6c 61 75 73 65 73 2e 0a 2a 2a 0a 2a 2a  T clauses..**.**
10840 20 41 6e 20 46 4b 65 79 20 73 74 72 75 63 74 75   An FKey structu
10850 72 65 20 69 73 20 63 72 65 61 74 65 64 20 61 6e  re is created an
10860 64 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 74  d added to the t
10870 61 62 6c 65 20 63 75 72 72 65 6e 74 6c 79 0a 2a  able currently.*
10880 2a 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63  * under construc
10890 74 69 6f 6e 20 69 6e 20 74 68 65 20 70 50 61 72  tion in the pPar
108a0 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 66 69  se->pNewTable fi
108b0 65 6c 64 2e 20 20 54 68 65 20 6e 65 77 20 46 4b  eld.  The new FK
108c0 65 79 0a 2a 2a 20 69 73 20 6e 6f 74 20 6c 69 6e  ey.** is not lin
108d0 6b 65 64 20 69 6e 74 6f 20 64 62 2d 3e 61 46 4b  ked into db->aFK
108e0 65 79 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74  ey at this point
108f0 20 2d 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74   - that does not
10900 20 68 61 70 70 65 6e 0a 2a 2a 20 75 6e 74 69 6c   happen.** until
10910 20 73 71 6c 69 74 65 33 45 6e 64 54 61 62 6c 65   sqlite3EndTable
10920 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f  ()..**.** The fo
10930 72 65 69 67 6e 20 6b 65 79 20 69 73 20 73 65 74  reign key is set
10940 20 66 6f 72 20 49 4d 4d 45 44 49 41 54 45 20 70   for IMMEDIATE p
10950 72 6f 63 65 73 73 69 6e 67 2e 20 20 41 20 73 75  rocessing.  A su
10960 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 0a 2a 2a  bsequent call.**
10970 20 74 6f 20 73 71 6c 69 74 65 33 44 65 66 65 72   to sqlite3Defer
10980 46 6f 72 65 69 67 6e 4b 65 79 28 29 20 6d 69 67  ForeignKey() mig
10990 68 74 20 63 68 61 6e 67 65 20 74 68 69 73 20 74  ht change this t
109a0 6f 20 44 45 46 45 52 52 45 44 2e 0a 2a 2f 0a 76  o DEFERRED..*/.v
109b0 6f 69 64 20 73 71 6c 69 74 65 33 43 72 65 61 74  oid sqlite3Creat
109c0 65 46 6f 72 65 69 67 6e 4b 65 79 28 0a 20 20 50  eForeignKey(.  P
109d0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
109e0 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
109f0 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72  ontext */.  Expr
10a00 4c 69 73 74 20 2a 70 46 72 6f 6d 43 6f 6c 2c 20  List *pFromCol, 
10a10 20 2f 2a 20 43 6f 6c 75 6d 6e 73 20 69 6e 20 74   /* Columns in t
10a20 68 69 73 20 74 61 62 6c 65 20 74 68 61 74 20 70  his table that p
10a30 6f 69 6e 74 20 74 6f 20 6f 74 68 65 72 20 74 61  oint to other ta
10a40 62 6c 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  ble */.  Token *
10a50 70 54 6f 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  pTo,          /*
10a60 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 6f 74 68   Name of the oth
10a70 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20 45 78  er table */.  Ex
10a80 70 72 4c 69 73 74 20 2a 70 54 6f 43 6f 6c 2c 20  prList *pToCol, 
10a90 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 73 20 69 6e     /* Columns in
10aa0 20 74 68 65 20 6f 74 68 65 72 20 74 61 62 6c 65   the other table
10ab0 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 20   */.  int flags 
10ac0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
10ad0 6e 66 6c 69 63 74 20 72 65 73 6f 6c 75 74 69 6f  nflict resolutio
10ae0 6e 20 61 6c 67 6f 72 69 74 68 6d 73 2e 20 2a 2f  n algorithms. */
10af0 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .){.#ifndef SQLI
10b00 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f  TE_OMIT_FOREIGN_
10b10 4b 45 59 0a 20 20 46 4b 65 79 20 2a 70 46 4b 65  KEY.  FKey *pFKe
10b20 79 20 3d 20 30 3b 0a 20 20 54 61 62 6c 65 20 2a  y = 0;.  Table *
10b30 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  p = pParse->pNew
10b40 54 61 62 6c 65 3b 0a 20 20 69 6e 74 20 6e 42 79  Table;.  int nBy
10b50 74 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  te;.  int i;.  i
10b60 6e 74 20 6e 43 6f 6c 3b 0a 20 20 63 68 61 72 20  nt nCol;.  char 
10b70 2a 7a 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  *z;..  assert( p
10b80 54 6f 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  To!=0 );.  if( p
10b90 3d 3d 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e  ==0 || pParse->n
10ba0 45 72 72 20 7c 7c 20 49 4e 5f 44 45 43 4c 41 52  Err || IN_DECLAR
10bb0 45 5f 56 54 41 42 20 29 20 67 6f 74 6f 20 66 6b  E_VTAB ) goto fk
10bc0 5f 65 6e 64 3b 0a 20 20 69 66 28 20 70 46 72 6f  _end;.  if( pFro
10bd0 6d 43 6f 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 69  mCol==0 ){.    i
10be0 6e 74 20 69 43 6f 6c 20 3d 20 70 2d 3e 6e 43 6f  nt iCol = p->nCo
10bf0 6c 2d 31 3b 0a 20 20 20 20 69 66 28 20 69 43 6f  l-1;.    if( iCo
10c00 6c 3c 30 20 29 20 67 6f 74 6f 20 66 6b 5f 65 6e  l<0 ) goto fk_en
10c10 64 3b 0a 20 20 20 20 69 66 28 20 70 54 6f 43 6f  d;.    if( pToCo
10c20 6c 20 26 26 20 70 54 6f 43 6f 6c 2d 3e 6e 45 78  l && pToCol->nEx
10c30 70 72 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 73  pr!=1 ){.      s
10c40 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
10c50 50 61 72 73 65 2c 20 22 66 6f 72 65 69 67 6e 20  Parse, "foreign 
10c60 6b 65 79 20 6f 6e 20 25 73 22 0a 20 20 20 20 20  key on %s".     
10c70 20 20 20 20 22 20 73 68 6f 75 6c 64 20 72 65 66      " should ref
10c80 65 72 65 6e 63 65 20 6f 6e 6c 79 20 6f 6e 65 20  erence only one 
10c90 63 6f 6c 75 6d 6e 20 6f 66 20 74 61 62 6c 65 20  column of table 
10ca0 25 54 22 2c 0a 20 20 20 20 20 20 20 20 20 70 2d  %T",.         p-
10cb0 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d  >aCol[iCol].zNam
10cc0 65 2c 20 70 54 6f 29 3b 0a 20 20 20 20 20 20 67  e, pTo);.      g
10cd0 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 20 20  oto fk_end;.    
10ce0 7d 0a 20 20 20 20 6e 43 6f 6c 20 3d 20 31 3b 0a  }.    nCol = 1;.
10cf0 20 20 7d 65 6c 73 65 20 69 66 28 20 70 54 6f 43    }else if( pToC
10d00 6f 6c 20 26 26 20 70 54 6f 43 6f 6c 2d 3e 6e 45  ol && pToCol->nE
10d10 78 70 72 21 3d 70 46 72 6f 6d 43 6f 6c 2d 3e 6e  xpr!=pFromCol->n
10d20 45 78 70 72 20 29 7b 0a 20 20 20 20 73 71 6c 69  Expr ){.    sqli
10d30 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
10d40 73 65 2c 0a 20 20 20 20 20 20 20 20 22 6e 75 6d  se,.        "num
10d50 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69  ber of columns i
10d60 6e 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 64 6f  n foreign key do
10d70 65 73 20 6e 6f 74 20 6d 61 74 63 68 20 74 68 65  es not match the
10d80 20 6e 75 6d 62 65 72 20 6f 66 20 22 0a 20 20 20   number of ".   
10d90 20 20 20 20 20 22 63 6f 6c 75 6d 6e 73 20 69 6e       "columns in
10da0 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 64 20   the referenced 
10db0 74 61 62 6c 65 22 29 3b 0a 20 20 20 20 67 6f 74  table");.    got
10dc0 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 7d 65 6c 73  o fk_end;.  }els
10dd0 65 7b 0a 20 20 20 20 6e 43 6f 6c 20 3d 20 70 46  e{.    nCol = pF
10de0 72 6f 6d 43 6f 6c 2d 3e 6e 45 78 70 72 3b 0a 20  romCol->nExpr;. 
10df0 20 7d 0a 20 20 6e 42 79 74 65 20 3d 20 73 69 7a   }.  nByte = siz
10e00 65 6f 66 28 2a 70 46 4b 65 79 29 20 2b 20 6e 43  eof(*pFKey) + nC
10e10 6f 6c 2a 73 69 7a 65 6f 66 28 70 46 4b 65 79 2d  ol*sizeof(pFKey-
10e20 3e 61 43 6f 6c 5b 30 5d 29 20 2b 20 70 54 6f 2d  >aCol[0]) + pTo-
10e30 3e 6e 20 2b 20 31 3b 0a 20 20 69 66 28 20 70 54  >n + 1;.  if( pT
10e40 6f 43 6f 6c 20 29 7b 0a 20 20 20 20 66 6f 72 28  oCol ){.    for(
10e50 69 3d 30 3b 20 69 3c 70 54 6f 43 6f 6c 2d 3e 6e  i=0; i<pToCol->n
10e60 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
10e70 20 20 6e 42 79 74 65 20 2b 3d 20 73 74 72 6c 65    nByte += strle
10e80 6e 28 70 54 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a  n(pToCol->a[i].z
10e90 4e 61 6d 65 29 20 2b 20 31 3b 0a 20 20 20 20 7d  Name) + 1;.    }
10ea0 0a 20 20 7d 0a 20 20 70 46 4b 65 79 20 3d 20 73  .  }.  pFKey = s
10eb0 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
10ec0 72 6f 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 6e  ro(pParse->db, n
10ed0 42 79 74 65 20 29 3b 0a 20 20 69 66 28 20 70 46  Byte );.  if( pF
10ee0 4b 65 79 3d 3d 30 20 29 7b 0a 20 20 20 20 67 6f  Key==0 ){.    go
10ef0 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 7d 0a 20  to fk_end;.  }. 
10f00 20 70 46 4b 65 79 2d 3e 70 46 72 6f 6d 20 3d 20   pFKey->pFrom = 
10f10 70 3b 0a 20 20 70 46 4b 65 79 2d 3e 70 4e 65 78  p;.  pFKey->pNex
10f20 74 46 72 6f 6d 20 3d 20 70 2d 3e 70 46 4b 65 79  tFrom = p->pFKey
10f30 3b 0a 20 20 7a 20 3d 20 28 63 68 61 72 2a 29 26  ;.  z = (char*)&
10f40 70 46 4b 65 79 5b 31 5d 3b 0a 20 20 70 46 4b 65  pFKey[1];.  pFKe
10f50 79 2d 3e 61 43 6f 6c 20 3d 20 28 73 74 72 75 63  y->aCol = (struc
10f60 74 20 73 43 6f 6c 4d 61 70 2a 29 7a 3b 0a 20 20  t sColMap*)z;.  
10f70 7a 20 2b 3d 20 73 69 7a 65 6f 66 28 73 74 72 75  z += sizeof(stru
10f80 63 74 20 73 43 6f 6c 4d 61 70 29 2a 6e 43 6f 6c  ct sColMap)*nCol
10f90 3b 0a 20 20 70 46 4b 65 79 2d 3e 7a 54 6f 20 3d  ;.  pFKey->zTo =
10fa0 20 7a 3b 0a 20 20 6d 65 6d 63 70 79 28 7a 2c 20   z;.  memcpy(z, 
10fb0 70 54 6f 2d 3e 7a 2c 20 70 54 6f 2d 3e 6e 29 3b  pTo->z, pTo->n);
10fc0 0a 20 20 7a 5b 70 54 6f 2d 3e 6e 5d 20 3d 20 30  .  z[pTo->n] = 0
10fd0 3b 0a 20 20 7a 20 2b 3d 20 70 54 6f 2d 3e 6e 2b  ;.  z += pTo->n+
10fe0 31 3b 0a 20 20 70 46 4b 65 79 2d 3e 70 4e 65 78  1;.  pFKey->pNex
10ff0 74 54 6f 20 3d 20 30 3b 0a 20 20 70 46 4b 65 79  tTo = 0;.  pFKey
11000 2d 3e 6e 43 6f 6c 20 3d 20 6e 43 6f 6c 3b 0a 20  ->nCol = nCol;. 
11010 20 69 66 28 20 70 46 72 6f 6d 43 6f 6c 3d 3d 30   if( pFromCol==0
11020 20 29 7b 0a 20 20 20 20 70 46 4b 65 79 2d 3e 61   ){.    pFKey->a
11030 43 6f 6c 5b 30 5d 2e 69 46 72 6f 6d 20 3d 20 70  Col[0].iFrom = p
11040 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 7d 65 6c 73  ->nCol-1;.  }els
11050 65 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  e{.    for(i=0; 
11060 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  i<nCol; i++){.  
11070 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20      int j;.     
11080 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 2d 3e 6e   for(j=0; j<p->n
11090 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  Col; j++){.     
110a0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74     if( sqlite3St
110b0 72 49 43 6d 70 28 70 2d 3e 61 43 6f 6c 5b 6a 5d  rICmp(p->aCol[j]
110c0 2e 7a 4e 61 6d 65 2c 20 70 46 72 6f 6d 43 6f 6c  .zName, pFromCol
110d0 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30  ->a[i].zName)==0
110e0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 46   ){.          pF
110f0 4b 65 79 2d 3e 61 43 6f 6c 5b 69 5d 2e 69 46 72  Key->aCol[i].iFr
11100 6f 6d 20 3d 20 6a 3b 0a 20 20 20 20 20 20 20 20  om = j;.        
11110 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
11120 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
11130 20 69 66 28 20 6a 3e 3d 70 2d 3e 6e 43 6f 6c 20   if( j>=p->nCol 
11140 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
11150 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
11160 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20 22 75  e, .          "u
11170 6e 6b 6e 6f 77 6e 20 63 6f 6c 75 6d 6e 20 5c 22  nknown column \"
11180 25 73 5c 22 20 69 6e 20 66 6f 72 65 69 67 6e 20  %s\" in foreign 
11190 6b 65 79 20 64 65 66 69 6e 69 74 69 6f 6e 22 2c  key definition",
111a0 20 0a 20 20 20 20 20 20 20 20 20 20 70 46 72 6f   .          pFro
111b0 6d 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  mCol->a[i].zName
111c0 29 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  );.        goto 
111d0 66 6b 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a  fk_end;.      }.
111e0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
111f0 70 54 6f 43 6f 6c 20 29 7b 0a 20 20 20 20 66 6f  pToCol ){.    fo
11200 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69  r(i=0; i<nCol; i
11210 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e  ++){.      int n
11220 20 3d 20 73 74 72 6c 65 6e 28 70 54 6f 43 6f 6c   = strlen(pToCol
11230 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20  ->a[i].zName);. 
11240 20 20 20 20 20 70 46 4b 65 79 2d 3e 61 43 6f 6c       pFKey->aCol
11250 5b 69 5d 2e 7a 43 6f 6c 20 3d 20 7a 3b 0a 20 20  [i].zCol = z;.  
11260 20 20 20 20 6d 65 6d 63 70 79 28 7a 2c 20 70 54      memcpy(z, pT
11270 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  oCol->a[i].zName
11280 2c 20 6e 29 3b 0a 20 20 20 20 20 20 7a 5b 6e 5d  , n);.      z[n]
11290 20 3d 20 30 3b 0a 20 20 20 20 20 20 7a 20 2b 3d   = 0;.      z +=
112a0 20 6e 2b 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   n+1;.    }.  }.
112b0 20 20 70 46 4b 65 79 2d 3e 69 73 44 65 66 65 72    pFKey->isDefer
112c0 72 65 64 20 3d 20 30 3b 0a 20 20 70 46 4b 65 79  red = 0;.  pFKey
112d0 2d 3e 64 65 6c 65 74 65 43 6f 6e 66 20 3d 20 66  ->deleteConf = f
112e0 6c 61 67 73 20 26 20 30 78 66 66 3b 0a 20 20 70  lags & 0xff;.  p
112f0 46 4b 65 79 2d 3e 75 70 64 61 74 65 43 6f 6e 66  FKey->updateConf
11300 20 3d 20 28 66 6c 61 67 73 20 3e 3e 20 38 20 29   = (flags >> 8 )
11310 20 26 20 30 78 66 66 3b 0a 20 20 70 46 4b 65 79   & 0xff;.  pFKey
11320 2d 3e 69 6e 73 65 72 74 43 6f 6e 66 20 3d 20 28  ->insertConf = (
11330 66 6c 61 67 73 20 3e 3e 20 31 36 20 29 20 26 20  flags >> 16 ) & 
11340 30 78 66 66 3b 0a 0a 20 20 2f 2a 20 4c 69 6e 6b  0xff;..  /* Link
11350 20 74 68 65 20 66 6f 72 65 69 67 6e 20 6b 65 79   the foreign key
11360 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 61 73   to the table as
11370 20 74 68 65 20 6c 61 73 74 20 73 74 65 70 2e 0a   the last step..
11380 20 20 2a 2f 0a 20 20 70 2d 3e 70 46 4b 65 79 20    */.  p->pFKey 
11390 3d 20 70 46 4b 65 79 3b 0a 20 20 70 46 4b 65 79  = pFKey;.  pFKey
113a0 20 3d 20 30 3b 0a 0a 66 6b 5f 65 6e 64 3a 0a 20   = 0;..fk_end:. 
113b0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 46   sqlite3_free(pF
113c0 4b 65 79 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20  Key);.#endif /* 
113d0 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
113e0 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59  OMIT_FOREIGN_KEY
113f0 29 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 45 78  ) */.  sqlite3Ex
11400 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70 46 72  prListDelete(pFr
11410 6f 6d 43 6f 6c 29 3b 0a 20 20 73 71 6c 69 74 65  omCol);.  sqlite
11420 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
11430 70 54 6f 43 6f 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  pToCol);.}../*.*
11440 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
11450 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 6e  s called when an
11460 20 49 4e 49 54 49 41 4c 4c 59 20 49 4d 4d 45 44   INITIALLY IMMED
11470 49 41 54 45 20 6f 72 20 49 4e 49 54 49 41 4c 4c  IATE or INITIALL
11480 59 20 44 45 46 45 52 52 45 44 0a 2a 2a 20 63 6c  Y DEFERRED.** cl
11490 61 75 73 65 20 69 73 20 73 65 65 6e 20 61 73 20  ause is seen as 
114a0 70 61 72 74 20 6f 66 20 61 20 66 6f 72 65 69 67  part of a foreig
114b0 6e 20 6b 65 79 20 64 65 66 69 6e 69 74 69 6f 6e  n key definition
114c0 2e 20 20 54 68 65 20 69 73 44 65 66 65 72 72 65  .  The isDeferre
114d0 64 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 69  d.** parameter i
114e0 73 20 31 20 66 6f 72 20 49 4e 49 54 49 41 4c 4c  s 1 for INITIALL
114f0 59 20 44 45 46 45 52 52 45 44 20 61 6e 64 20 30  Y DEFERRED and 0
11500 20 66 6f 72 20 49 4e 49 54 49 41 4c 4c 59 20 49   for INITIALLY I
11510 4d 4d 45 44 49 41 54 45 2e 0a 2a 2a 20 54 68 65  MMEDIATE..** The
11520 20 62 65 68 61 76 69 6f 72 20 6f 66 20 74 68 65   behavior of the
11530 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 63   most recently c
11540 72 65 61 74 65 64 20 66 6f 72 65 69 67 6e 20 6b  reated foreign k
11550 65 79 20 69 73 20 61 64 6a 75 73 74 65 64 0a 2a  ey is adjusted.*
11560 2a 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e 0a 2a  * accordingly..*
11570 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 44 65  /.void sqlite3De
11580 66 65 72 46 6f 72 65 69 67 6e 4b 65 79 28 50 61  ferForeignKey(Pa
11590 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74  rse *pParse, int
115a0 20 69 73 44 65 66 65 72 72 65 64 29 7b 0a 23 69   isDeferred){.#i
115b0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
115c0 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 0a 20 20  T_FOREIGN_KEY.  
115d0 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 46  Table *pTab;.  F
115e0 4b 65 79 20 2a 70 46 4b 65 79 3b 0a 20 20 69 66  Key *pFKey;.  if
115f0 28 20 28 70 54 61 62 20 3d 20 70 50 61 72 73 65  ( (pTab = pParse
11600 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3d 3d 30 20  ->pNewTable)==0 
11610 7c 7c 20 28 70 46 4b 65 79 20 3d 20 70 54 61 62  || (pFKey = pTab
11620 2d 3e 70 46 4b 65 79 29 3d 3d 30 20 29 20 72 65  ->pFKey)==0 ) re
11630 74 75 72 6e 3b 0a 20 20 70 46 4b 65 79 2d 3e 69  turn;.  pFKey->i
11640 73 44 65 66 65 72 72 65 64 20 3d 20 69 73 44 65  sDeferred = isDe
11650 66 65 72 72 65 64 3b 0a 23 65 6e 64 69 66 0a 7d  ferred;.#endif.}
11660 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
11670 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20   code that will 
11680 65 72 61 73 65 20 61 6e 64 20 72 65 66 69 6c 6c  erase and refill
11690 20 69 6e 64 65 78 20 2a 70 49 64 78 2e 20 20 54   index *pIdx.  T
116a0 68 69 73 20 69 73 0a 2a 2a 20 75 73 65 64 20 74  his is.** used t
116b0 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 61 20 6e  o initialize a n
116c0 65 77 6c 79 20 63 72 65 61 74 65 64 20 69 6e 64  ewly created ind
116d0 65 78 20 6f 72 20 74 6f 20 72 65 63 6f 6d 70 75  ex or to recompu
116e0 74 65 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e  te the.** conten
116f0 74 20 6f 66 20 61 6e 20 69 6e 64 65 78 20 69 6e  t of an index in
11700 20 72 65 73 70 6f 6e 73 65 20 74 6f 20 61 20 52   response to a R
11710 45 49 4e 44 45 58 20 63 6f 6d 6d 61 6e 64 2e 0a  EINDEX command..
11720 2a 2a 0a 2a 2a 20 69 66 20 6d 65 6d 52 6f 6f 74  **.** if memRoot
11730 50 61 67 65 20 69 73 20 6e 6f 74 20 6e 65 67 61  Page is not nega
11740 74 69 76 65 2c 20 69 74 20 6d 65 61 6e 73 20 74  tive, it means t
11750 68 61 74 20 74 68 65 20 69 6e 64 65 78 20 69 73  hat the index is
11760 20 6e 65 77 6c 79 0a 2a 2a 20 63 72 65 61 74 65   newly.** create
11770 64 2e 20 20 54 68 65 20 72 65 67 69 73 74 65 72  d.  The register
11780 20 73 70 65 63 69 66 69 65 64 20 62 79 20 6d 65   specified by me
11790 6d 52 6f 6f 74 50 61 67 65 20 63 6f 6e 74 61 69  mRootPage contai
117a0 6e 73 20 74 68 65 0a 2a 2a 20 72 6f 6f 74 20 70  ns the.** root p
117b0 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68  age number of th
117c0 65 20 69 6e 64 65 78 2e 20 20 49 66 20 6d 65 6d  e index.  If mem
117d0 52 6f 6f 74 50 61 67 65 20 69 73 20 6e 65 67 61  RootPage is nega
117e0 74 69 76 65 2c 20 74 68 65 6e 0a 2a 2a 20 74 68  tive, then.** th
117f0 65 20 69 6e 64 65 78 20 61 6c 72 65 61 64 79 20  e index already 
11800 65 78 69 73 74 73 20 61 6e 64 20 6d 75 73 74 20  exists and must 
11810 62 65 20 63 6c 65 61 72 65 64 20 62 65 66 6f 72  be cleared befor
11820 65 20 62 65 69 6e 67 20 72 65 66 69 6c 6c 65 64  e being refilled
11830 20 61 6e 64 0a 2a 2a 20 74 68 65 20 72 6f 6f 74   and.** the root
11840 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
11850 74 68 65 20 69 6e 64 65 78 20 69 73 20 74 61 6b  the index is tak
11860 65 6e 20 66 72 6f 6d 20 70 49 6e 64 65 78 2d 3e  en from pIndex->
11870 74 6e 75 6d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tnum..*/.static 
11880 76 6f 69 64 20 73 71 6c 69 74 65 33 52 65 66 69  void sqlite3Refi
11890 6c 6c 49 6e 64 65 78 28 50 61 72 73 65 20 2a 70  llIndex(Parse *p
118a0 50 61 72 73 65 2c 20 49 6e 64 65 78 20 2a 70 49  Parse, Index *pI
118b0 6e 64 65 78 2c 20 69 6e 74 20 6d 65 6d 52 6f 6f  ndex, int memRoo
118c0 74 50 61 67 65 29 7b 0a 20 20 54 61 62 6c 65 20  tPage){.  Table 
118d0 2a 70 54 61 62 20 3d 20 70 49 6e 64 65 78 2d 3e  *pTab = pIndex->
118e0 70 54 61 62 6c 65 3b 20 20 2f 2a 20 54 68 65 20  pTable;  /* The 
118f0 74 61 62 6c 65 20 74 68 61 74 20 69 73 20 69 6e  table that is in
11900 64 65 78 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69  dexed */.  int i
11910 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  Tab = pParse->nT
11920 61 62 3b 20 20 20 20 20 20 20 2f 2a 20 42 74 72  ab;       /* Btr
11930 65 65 20 63 75 72 73 6f 72 20 75 73 65 64 20 66  ee cursor used f
11940 6f 72 20 70 54 61 62 20 2a 2f 0a 20 20 69 6e 74  or pTab */.  int
11950 20 69 49 64 78 20 3d 20 70 50 61 72 73 65 2d 3e   iIdx = pParse->
11960 6e 54 61 62 2b 31 3b 20 20 20 20 20 2f 2a 20 42  nTab+1;     /* B
11970 74 72 65 65 20 63 75 72 73 6f 72 20 75 73 65 64  tree cursor used
11980 20 66 6f 72 20 70 49 6e 64 65 78 20 2a 2f 0a 20   for pIndex */. 
11990 20 69 6e 74 20 61 64 64 72 31 3b 20 20 20 20 20   int addr1;     
119a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
119b0 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 6f  /* Address of to
119c0 70 20 6f 66 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69  p of loop */.  i
119d0 6e 74 20 74 6e 75 6d 3b 20 20 20 20 20 20 20 20  nt tnum;        
119e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
119f0 20 52 6f 6f 74 20 70 61 67 65 20 6f 66 20 69 6e   Root page of in
11a00 64 65 78 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76  dex */.  Vdbe *v
11a10 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
11a20 20 20 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72          /* Gener
11a30 61 74 65 20 63 6f 64 65 20 69 6e 74 6f 20 74 68  ate code into th
11a40 69 73 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69  is virtual machi
11a50 6e 65 20 2a 2f 0a 20 20 4b 65 79 49 6e 66 6f 20  ne */.  KeyInfo 
11a60 2a 70 4b 65 79 3b 20 20 20 20 20 20 20 20 20 20  *pKey;          
11a70 20 20 20 20 20 20 20 2f 2a 20 4b 65 79 49 6e 66         /* KeyInf
11a80 6f 20 66 6f 72 20 69 6e 64 65 78 20 2a 2f 0a 20  o for index */. 
11a90 20 69 6e 74 20 72 65 67 49 64 78 4b 65 79 3b 20   int regIdxKey; 
11aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11ab0 2f 2a 20 52 65 67 69 73 74 65 72 73 20 63 6f 6e  /* Registers con
11ac0 74 61 69 6e 69 6e 67 20 74 68 65 20 69 6e 64 65  taining the inde
11ad0 78 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20 72  x key */.  int r
11ae0 65 67 52 65 63 6f 72 64 3b 20 20 20 20 20 20 20  egRecord;       
11af0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67            /* Reg
11b00 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 61 73  ister holding as
11b10 73 65 6d 62 6c 69 65 64 20 69 6e 64 65 78 20 72  semblied index r
11b20 65 63 6f 72 64 20 2a 2f 0a 20 20 73 71 6c 69 74  ecord */.  sqlit
11b30 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
11b40 3e 64 62 3b 20 20 20 20 20 20 2f 2a 20 54 68 65  >db;      /* The
11b50 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
11b60 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 44  tion */.  int iD
11b70 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d  b = sqlite3Schem
11b80 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 49 6e  aToIndex(db, pIn
11b90 64 65 78 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 0a  dex->pSchema);..
11ba0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
11bb0 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f  MIT_AUTHORIZATIO
11bc0 4e 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 41  N.  if( sqlite3A
11bd0 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c  uthCheck(pParse,
11be0 20 53 51 4c 49 54 45 5f 52 45 49 4e 44 45 58 2c   SQLITE_REINDEX,
11bf0 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20   pIndex->zName, 
11c00 30 2c 0a 20 20 20 20 20 20 64 62 2d 3e 61 44 62  0,.      db->aDb
11c10 5b 69 44 62 5d 2e 7a 4e 61 6d 65 20 29 20 29 7b  [iDb].zName ) ){
11c20 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
11c30 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 52 65  .#endif..  /* Re
11c40 71 75 69 72 65 20 61 20 77 72 69 74 65 2d 6c 6f  quire a write-lo
11c50 63 6b 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 20  ck on the table 
11c60 74 6f 20 70 65 72 66 6f 72 6d 20 74 68 69 73 20  to perform this 
11c70 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 73  operation */.  s
11c80 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28  qlite3TableLock(
11c90 70 50 61 72 73 65 2c 20 69 44 62 2c 20 70 54 61  pParse, iDb, pTa
11ca0 62 2d 3e 74 6e 75 6d 2c 20 31 2c 20 70 54 61 62  b->tnum, 1, pTab
11cb0 2d 3e 7a 4e 61 6d 65 29 3b 0a 0a 20 20 76 20 3d  ->zName);..  v =
11cc0 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
11cd0 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76  pParse);.  if( v
11ce0 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
11cf0 69 66 28 20 6d 65 6d 52 6f 6f 74 50 61 67 65 3e  if( memRootPage>
11d00 3d 30 20 29 7b 0a 20 20 20 20 74 6e 75 6d 20 3d  =0 ){.    tnum =
11d10 20 6d 65 6d 52 6f 6f 74 50 61 67 65 3b 0a 20 20   memRootPage;.  
11d20 7d 65 6c 73 65 7b 0a 20 20 20 20 74 6e 75 6d 20  }else{.    tnum 
11d30 3d 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 3b 0a  = pIndex->tnum;.
11d40 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
11d50 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6c 65 61  ddOp2(v, OP_Clea
11d60 72 2c 20 74 6e 75 6d 2c 20 69 44 62 29 3b 0a 20  r, tnum, iDb);. 
11d70 20 7d 0a 20 20 70 4b 65 79 20 3d 20 73 71 6c 69   }.  pKey = sqli
11d80 74 65 33 49 6e 64 65 78 4b 65 79 69 6e 66 6f 28  te3IndexKeyinfo(
11d90 70 50 61 72 73 65 2c 20 70 49 6e 64 65 78 29 3b  pParse, pIndex);
11da0 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
11db0 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70 65 6e 57  dOp4(v, OP_OpenW
11dc0 72 69 74 65 2c 20 69 49 64 78 2c 20 74 6e 75 6d  rite, iIdx, tnum
11dd0 2c 20 69 44 62 2c 20 0a 20 20 20 20 20 20 20 20  , iDb, .        
11de0 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61              (cha
11df0 72 20 2a 29 70 4b 65 79 2c 20 50 34 5f 4b 45 59  r *)pKey, P4_KEY
11e00 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a 20  INFO_HANDOFF);. 
11e10 20 69 66 28 20 6d 65 6d 52 6f 6f 74 50 61 67 65   if( memRootPage
11e20 3e 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  >=0 ){.    sqlit
11e30 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76  e3VdbeChangeP5(v
11e40 2c 20 31 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  , 1);.  }.  sqli
11e50 74 65 33 4f 70 65 6e 54 61 62 6c 65 28 70 50 61  te3OpenTable(pPa
11e60 72 73 65 2c 20 69 54 61 62 2c 20 69 44 62 2c 20  rse, iTab, iDb, 
11e70 70 54 61 62 2c 20 4f 50 5f 4f 70 65 6e 52 65 61  pTab, OP_OpenRea
11e80 64 29 3b 0a 20 20 61 64 64 72 31 20 3d 20 73 71  d);.  addr1 = sq
11e90 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
11ea0 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 69 54  v, OP_Rewind, iT
11eb0 61 62 2c 20 30 29 3b 0a 20 20 72 65 67 52 65 63  ab, 0);.  regRec
11ec0 6f 72 64 20 3d 20 73 71 6c 69 74 65 33 47 65 74  ord = sqlite3Get
11ed0 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
11ee0 0a 20 20 72 65 67 49 64 78 4b 65 79 20 3d 20 73  .  regIdxKey = s
11ef0 71 6c 69 74 65 33 47 65 6e 65 72 61 74 65 49 6e  qlite3GenerateIn
11f00 64 65 78 4b 65 79 28 70 50 61 72 73 65 2c 20 70  dexKey(pParse, p
11f10 49 6e 64 65 78 2c 20 69 54 61 62 2c 20 72 65 67  Index, iTab, reg
11f20 52 65 63 6f 72 64 2c 20 31 29 3b 0a 20 20 69 66  Record, 1);.  if
11f30 28 20 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f  ( pIndex->onErro
11f40 72 21 3d 4f 45 5f 4e 6f 6e 65 20 29 7b 0a 20 20  r!=OE_None ){.  
11f50 20 20 69 6e 74 20 6a 31 2c 20 6a 32 3b 0a 20 20    int j1, j2;.  
11f60 20 20 69 6e 74 20 72 65 67 52 6f 77 69 64 3b 0a    int regRowid;.
11f70 0a 20 20 20 20 72 65 67 52 6f 77 69 64 20 3d 20  .    regRowid = 
11f80 72 65 67 49 64 78 4b 65 79 20 2b 20 70 49 6e 64  regIdxKey + pInd
11f90 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 20  ex->nColumn;.   
11fa0 20 6a 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62   j1 = sqlite3Vdb
11fb0 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 73  eAddOp3(v, OP_Is
11fc0 4e 75 6c 6c 2c 20 72 65 67 49 64 78 4b 65 79 2c  Null, regIdxKey,
11fd0 20 30 2c 20 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c   0, pIndex->nCol
11fe0 75 6d 6e 29 3b 0a 20 20 20 20 6a 32 20 3d 20 73  umn);.    j2 = s
11ff0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
12000 28 76 2c 20 4f 50 5f 49 73 55 6e 69 71 75 65 2c  (v, OP_IsUnique,
12010 20 69 49 64 78 2c 0a 20 20 20 20 20 20 20 20 20   iIdx,.         
12020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12030 20 20 30 2c 20 72 65 67 52 6f 77 69 64 2c 20 28    0, regRowid, (
12040 63 68 61 72 2a 29 72 65 67 52 65 63 6f 72 64 2c  char*)regRecord,
12050 20 50 34 5f 49 4e 54 33 32 29 3b 0a 20 20 20 20   P4_INT32);.    
12060 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
12070 34 28 76 2c 20 4f 50 5f 48 61 6c 74 2c 20 53 51  4(v, OP_Halt, SQ
12080 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 2c  LITE_CONSTRAINT,
12090 20 4f 45 5f 41 62 6f 72 74 2c 20 30 2c 0a 20 20   OE_Abort, 0,.  
120a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
120b0 20 20 22 69 6e 64 65 78 65 64 20 63 6f 6c 75 6d    "indexed colum
120c0 6e 73 20 61 72 65 20 6e 6f 74 20 75 6e 69 71 75  ns are not uniqu
120d0 65 22 2c 20 50 34 5f 53 54 41 54 49 43 29 3b 0a  e", P4_STATIC);.
120e0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
120f0 75 6d 70 48 65 72 65 28 76 2c 20 6a 31 29 3b 0a  umpHere(v, j1);.
12100 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
12110 75 6d 70 48 65 72 65 28 76 2c 20 6a 32 29 3b 0a  umpHere(v, j2);.
12120 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62    }.  sqlite3Vdb
12130 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64  eAddOp2(v, OP_Id
12140 78 49 6e 73 65 72 74 2c 20 69 49 64 78 2c 20 72  xInsert, iIdx, r
12150 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 73 71 6c  egRecord);.  sql
12160 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
12170 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 52 65  eg(pParse, regRe
12180 63 6f 72 64 29 3b 0a 20 20 73 71 6c 69 74 65 33  cord);.  sqlite3
12190 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
121a0 5f 4e 65 78 74 2c 20 69 54 61 62 2c 20 61 64 64  _Next, iTab, add
121b0 72 31 2b 31 29 3b 0a 20 20 73 71 6c 69 74 65 33  r1+1);.  sqlite3
121c0 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
121d0 61 64 64 72 31 29 3b 0a 20 20 73 71 6c 69 74 65  addr1);.  sqlite
121e0 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
121f0 50 5f 43 6c 6f 73 65 2c 20 69 54 61 62 29 3b 0a  P_Close, iTab);.
12200 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
12210 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c  Op1(v, OP_Close,
12220 20 69 49 64 78 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   iIdx);.}../*.**
12230 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 69 6e   Create a new in
12240 64 65 78 20 66 6f 72 20 61 6e 20 53 51 4c 20 74  dex for an SQL t
12250 61 62 6c 65 2e 20 20 70 4e 61 6d 65 31 2e 70 4e  able.  pName1.pN
12260 61 6d 65 32 20 69 73 20 74 68 65 20 6e 61 6d 65  ame2 is the name
12270 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 0a 2a   of the index .*
12280 2a 20 61 6e 64 20 70 54 62 6c 4c 69 73 74 20 69  * and pTblList i
12290 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  s the name of th
122a0 65 20 74 61 62 6c 65 20 74 68 61 74 20 69 73 20  e table that is 
122b0 74 6f 20 62 65 20 69 6e 64 65 78 65 64 2e 20 20  to be indexed.  
122c0 42 6f 74 68 20 77 69 6c 6c 20 0a 2a 2a 20 62 65  Both will .** be
122d0 20 4e 55 4c 4c 20 66 6f 72 20 61 20 70 72 69 6d   NULL for a prim
122e0 61 72 79 20 6b 65 79 20 6f 72 20 61 6e 20 69 6e  ary key or an in
122f0 64 65 78 20 74 68 61 74 20 69 73 20 63 72 65 61  dex that is crea
12300 74 65 64 20 74 6f 20 73 61 74 69 73 66 79 20 61  ted to satisfy a
12310 0a 2a 2a 20 55 4e 49 51 55 45 20 63 6f 6e 73 74  .** UNIQUE const
12320 72 61 69 6e 74 2e 20 20 49 66 20 70 54 61 62 6c  raint.  If pTabl
12330 65 20 61 6e 64 20 70 49 6e 64 65 78 20 61 72 65  e and pIndex are
12340 20 4e 55 4c 4c 2c 20 75 73 65 20 70 50 61 72 73   NULL, use pPars
12350 65 2d 3e 70 4e 65 77 54 61 62 6c 65 0a 2a 2a 20  e->pNewTable.** 
12360 61 73 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20  as the table to 
12370 62 65 20 69 6e 64 65 78 65 64 2e 20 20 70 50 61  be indexed.  pPa
12380 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 69  rse->pNewTable i
12390 73 20 61 20 74 61 62 6c 65 20 74 68 61 74 20 69  s a table that i
123a0 73 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 62  s.** currently b
123b0 65 69 6e 67 20 63 6f 6e 73 74 72 75 63 74 65 64  eing constructed
123c0 20 62 79 20 61 20 43 52 45 41 54 45 20 54 41 42   by a CREATE TAB
123d0 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a  LE statement..**
123e0 0a 2a 2a 20 70 4c 69 73 74 20 69 73 20 61 20 6c  .** pList is a l
123f0 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74  ist of columns t
12400 6f 20 62 65 20 69 6e 64 65 78 65 64 2e 20 20 70  o be indexed.  p
12410 4c 69 73 74 20 77 69 6c 6c 20 62 65 20 4e 55 4c  List will be NUL
12420 4c 20 69 66 20 74 68 69 73 0a 2a 2a 20 69 73 20  L if this.** is 
12430 61 20 70 72 69 6d 61 72 79 20 6b 65 79 20 6f 72  a primary key or
12440 20 75 6e 69 71 75 65 2d 63 6f 6e 73 74 72 61 69   unique-constrai
12450 6e 74 20 6f 6e 20 74 68 65 20 6d 6f 73 74 20 72  nt on the most r
12460 65 63 65 6e 74 20 63 6f 6c 75 6d 6e 20 61 64 64  ecent column add
12470 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20 74 61 62  ed.** to the tab
12480 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64  le currently und
12490 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e  er construction.
124a0 20 20 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74    .*/.void sqlit
124b0 65 33 43 72 65 61 74 65 49 6e 64 65 78 28 0a 20  e3CreateIndex(. 
124c0 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
124d0 20 20 20 20 2f 2a 20 41 6c 6c 20 69 6e 66 6f 72      /* All infor
124e0 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 69  mation about thi
124f0 73 20 70 61 72 73 65 20 2a 2f 0a 20 20 54 6f 6b  s parse */.  Tok
12500 65 6e 20 2a 70 4e 61 6d 65 31 2c 20 20 20 20 20  en *pName1,     
12510 2f 2a 20 46 69 72 73 74 20 70 61 72 74 20 6f 66  /* First part of
12520 20 69 6e 64 65 78 20 6e 61 6d 65 2e 20 4d 61 79   index name. May
12530 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 54 6f   be NULL */.  To
12540 6b 65 6e 20 2a 70 4e 61 6d 65 32 2c 20 20 20 20  ken *pName2,    
12550 20 2f 2a 20 53 65 63 6f 6e 64 20 70 61 72 74 20   /* Second part 
12560 6f 66 20 69 6e 64 65 78 20 6e 61 6d 65 2e 20 4d  of index name. M
12570 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20  ay be NULL */.  
12580 53 72 63 4c 69 73 74 20 2a 70 54 62 6c 4e 61 6d  SrcList *pTblNam
12590 65 2c 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20 69  e, /* Table to i
125a0 6e 64 65 78 2e 20 55 73 65 20 70 50 61 72 73 65  ndex. Use pParse
125b0 2d 3e 70 4e 65 77 54 61 62 6c 65 20 69 66 20 30  ->pNewTable if 0
125c0 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
125d0 70 4c 69 73 74 2c 20 20 20 2f 2a 20 41 20 6c 69  pList,   /* A li
125e0 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 6f  st of columns to
125f0 20 62 65 20 69 6e 64 65 78 65 64 20 2a 2f 0a 20   be indexed */. 
12600 20 69 6e 74 20 6f 6e 45 72 72 6f 72 2c 20 20 20   int onError,   
12610 20 20 20 20 2f 2a 20 4f 45 5f 41 62 6f 72 74 2c      /* OE_Abort,
12620 20 4f 45 5f 49 67 6e 6f 72 65 2c 20 4f 45 5f 52   OE_Ignore, OE_R
12630 65 70 6c 61 63 65 2c 20 6f 72 20 4f 45 5f 4e 6f  eplace, or OE_No
12640 6e 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  ne */.  Token *p
12650 53 74 61 72 74 2c 20 20 20 20 20 2f 2a 20 54 68  Start,     /* Th
12660 65 20 43 52 45 41 54 45 20 74 6f 6b 65 6e 20 74  e CREATE token t
12670 68 61 74 20 62 65 67 69 6e 73 20 74 68 69 73 20  hat begins this 
12680 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 54  statement */.  T
12690 6f 6b 65 6e 20 2a 70 45 6e 64 2c 20 20 20 20 20  oken *pEnd,     
126a0 20 20 2f 2a 20 54 68 65 20 22 29 22 20 74 68 61    /* The ")" tha
126b0 74 20 63 6c 6f 73 65 73 20 74 68 65 20 43 52 45  t closes the CRE
126c0 41 54 45 20 49 4e 44 45 58 20 73 74 61 74 65 6d  ATE INDEX statem
126d0 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 73 6f 72  ent */.  int sor
126e0 74 4f 72 64 65 72 2c 20 20 20 20 20 2f 2a 20 53  tOrder,     /* S
126f0 6f 72 74 20 6f 72 64 65 72 20 6f 66 20 70 72 69  ort order of pri
12700 6d 61 72 79 20 6b 65 79 20 77 68 65 6e 20 70 4c  mary key when pL
12710 69 73 74 3d 3d 4e 55 4c 4c 20 2a 2f 0a 20 20 69  ist==NULL */.  i
12720 6e 74 20 69 66 4e 6f 74 45 78 69 73 74 20 20 20  nt ifNotExist   
12730 20 20 2f 2a 20 4f 6d 69 74 20 65 72 72 6f 72 20    /* Omit error 
12740 69 66 20 69 6e 64 65 78 20 61 6c 72 65 61 64 79  if index already
12750 20 65 78 69 73 74 73 20 2a 2f 0a 29 7b 0a 20 20   exists */.){.  
12760 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 30 3b  Table *pTab = 0;
12770 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 74 6f       /* Table to
12780 20 62 65 20 69 6e 64 65 78 65 64 20 2a 2f 0a 20   be indexed */. 
12790 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 20 3d   Index *pIndex =
127a0 20 30 3b 20 20 20 2f 2a 20 54 68 65 20 69 6e 64   0;   /* The ind
127b0 65 78 20 74 6f 20 62 65 20 63 72 65 61 74 65 64  ex to be created
127c0 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d   */.  char *zNam
127d0 65 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 4e 61  e = 0;     /* Na
127e0 6d 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20  me of the index 
127f0 2a 2f 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 3b 20  */.  int nName; 
12800 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
12810 62 65 72 20 6f 66 20 63 68 61 72 61 63 74 65 72  ber of character
12820 73 20 69 6e 20 7a 4e 61 6d 65 20 2a 2f 0a 20 20  s in zName */.  
12830 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 54 6f 6b 65  int i, j;.  Toke
12840 6e 20 6e 75 6c 6c 49 64 3b 20 20 20 20 20 20 20  n nullId;       
12850 20 2f 2a 20 46 61 6b 65 20 74 6f 6b 65 6e 20 66   /* Fake token f
12860 6f 72 20 61 6e 20 65 6d 70 74 79 20 49 44 20 6c  or an empty ID l
12870 69 73 74 20 2a 2f 0a 20 20 44 62 46 69 78 65 72  ist */.  DbFixer
12880 20 73 46 69 78 3b 20 20 20 20 20 20 20 20 2f 2a   sFix;        /*
12890 20 46 6f 72 20 61 73 73 69 67 6e 69 6e 67 20 64   For assigning d
128a0 61 74 61 62 61 73 65 20 6e 61 6d 65 73 20 74 6f  atabase names to
128b0 20 70 54 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74   pTable */.  int
128c0 20 73 6f 72 74 4f 72 64 65 72 4d 61 73 6b 3b 20   sortOrderMask; 
128d0 20 20 2f 2a 20 31 20 74 6f 20 68 6f 6e 6f 72 20    /* 1 to honor 
128e0 44 45 53 43 20 69 6e 20 69 6e 64 65 78 2e 20 20  DESC in index.  
128f0 30 20 74 6f 20 69 67 6e 6f 72 65 2e 20 2a 2f 0a  0 to ignore. */.
12900 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
12910 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 44 62  pParse->db;.  Db
12920 20 2a 70 44 62 3b 20 20 20 20 20 20 20 20 20 20   *pDb;          
12930 20 20 20 2f 2a 20 54 68 65 20 73 70 65 63 69 66     /* The specif
12940 69 63 20 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e  ic table contain
12950 69 6e 67 20 74 68 65 20 69 6e 64 65 78 65 64 20  ing the indexed 
12960 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 69 6e  database */.  in
12970 74 20 69 44 62 3b 20 20 20 20 20 20 20 20 20 20  t iDb;          
12980 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74     /* Index of t
12990 68 65 20 64 61 74 61 62 61 73 65 20 74 68 61 74  he database that
129a0 20 69 73 20 62 65 69 6e 67 20 77 72 69 74 74 65   is being writte
129b0 6e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e  n */.  Token *pN
129c0 61 6d 65 20 3d 20 30 3b 20 20 20 20 2f 2a 20 55  ame = 0;    /* U
129d0 6e 71 75 61 6c 69 66 69 65 64 20 6e 61 6d 65 20  nqualified name 
129e0 6f 66 20 74 68 65 20 69 6e 64 65 78 20 74 6f 20  of the index to 
129f0 63 72 65 61 74 65 20 2a 2f 0a 20 20 73 74 72 75  create */.  stru
12a00 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
12a10 20 2a 70 4c 69 73 74 49 74 65 6d 3b 20 2f 2a 20   *pListItem; /* 
12a20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72  For looping over
12a30 20 70 4c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20   pList */.  int 
12a40 6e 43 6f 6c 3b 0a 20 20 69 6e 74 20 6e 45 78 74  nCol;.  int nExt
12a50 72 61 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a  ra = 0;.  char *
12a60 7a 45 78 74 72 61 3b 0a 0a 20 20 69 66 28 20 70  zExtra;..  if( p
12a70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 64  Parse->nErr || d
12a80 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
12a90 7c 7c 20 49 4e 5f 44 45 43 4c 41 52 45 5f 56 54  || IN_DECLARE_VT
12aa0 41 42 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65  AB ){.    goto e
12ab0 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
12ac0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a  ;.  }..  /*.  **
12ad0 20 46 69 6e 64 20 74 68 65 20 74 61 62 6c 65 20   Find the table 
12ae0 74 68 61 74 20 69 73 20 74 6f 20 62 65 20 69 6e  that is to be in
12af0 64 65 78 65 64 2e 20 20 52 65 74 75 72 6e 20 65  dexed.  Return e
12b00 61 72 6c 79 20 69 66 20 6e 6f 74 20 66 6f 75 6e  arly if not foun
12b10 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 54  d..  */.  if( pT
12b20 62 6c 4e 61 6d 65 21 3d 30 20 29 7b 0a 0a 20 20  blName!=0 ){..  
12b30 20 20 2f 2a 20 55 73 65 20 74 68 65 20 74 77 6f    /* Use the two
12b40 2d 70 61 72 74 20 69 6e 64 65 78 20 6e 61 6d 65  -part index name
12b50 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68   to determine th
12b60 65 20 64 61 74 61 62 61 73 65 20 0a 20 20 20 20  e database .    
12b70 2a 2a 20 74 6f 20 73 65 61 72 63 68 20 66 6f 72  ** to search for
12b80 20 74 68 65 20 74 61 62 6c 65 2e 20 27 46 69 78   the table. 'Fix
12b90 27 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65  ' the table name
12ba0 20 74 6f 20 74 68 69 73 20 64 62 0a 20 20 20 20   to this db.    
12bb0 2a 2a 20 62 65 66 6f 72 65 20 6c 6f 6f 6b 69 6e  ** before lookin
12bc0 67 20 75 70 20 74 68 65 20 74 61 62 6c 65 2e 0a  g up the table..
12bd0 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72      */.    asser
12be0 74 28 20 70 4e 61 6d 65 31 20 26 26 20 70 4e 61  t( pName1 && pNa
12bf0 6d 65 32 20 29 3b 0a 20 20 20 20 69 44 62 20 3d  me2 );.    iDb =
12c00 20 73 71 6c 69 74 65 33 54 77 6f 50 61 72 74 4e   sqlite3TwoPartN
12c10 61 6d 65 28 70 50 61 72 73 65 2c 20 70 4e 61 6d  ame(pParse, pNam
12c20 65 31 2c 20 70 4e 61 6d 65 32 2c 20 26 70 4e 61  e1, pName2, &pNa
12c30 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 69 44 62  me);.    if( iDb
12c40 3c 30 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63  <0 ) goto exit_c
12c50 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 0a 23 69  reate_index;..#i
12c60 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
12c70 54 5f 54 45 4d 50 44 42 0a 20 20 20 20 2f 2a 20  T_TEMPDB.    /* 
12c80 49 66 20 74 68 65 20 69 6e 64 65 78 20 6e 61 6d  If the index nam
12c90 65 20 77 61 73 20 75 6e 71 75 61 6c 69 66 69 65  e was unqualifie
12ca0 64 2c 20 63 68 65 63 6b 20 69 66 20 74 68 65 20  d, check if the 
12cb0 74 68 65 20 74 61 62 6c 65 0a 20 20 20 20 2a 2a  the table.    **
12cc0 20 69 73 20 61 20 74 65 6d 70 20 74 61 62 6c 65   is a temp table
12cd0 2e 20 49 66 20 73 6f 2c 20 73 65 74 20 74 68 65  . If so, set the
12ce0 20 64 61 74 61 62 61 73 65 20 74 6f 20 31 2e 20   database to 1. 
12cf0 44 6f 20 6e 6f 74 20 64 6f 20 74 68 69 73 0a 20  Do not do this. 
12d00 20 20 20 2a 2a 20 69 66 20 69 6e 69 74 69 61 6c     ** if initial
12d10 69 73 69 6e 67 20 61 20 64 61 74 61 62 61 73 65  ising a database
12d20 20 73 63 68 65 6d 61 2e 0a 20 20 20 20 2a 2f 0a   schema..    */.
12d30 20 20 20 20 69 66 28 20 21 64 62 2d 3e 69 6e 69      if( !db->ini
12d40 74 2e 62 75 73 79 20 29 7b 0a 20 20 20 20 20 20  t.busy ){.      
12d50 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33 53 72  pTab = sqlite3Sr
12d60 63 4c 69 73 74 4c 6f 6f 6b 75 70 28 70 50 61 72  cListLookup(pPar
12d70 73 65 2c 20 70 54 62 6c 4e 61 6d 65 29 3b 0a 20  se, pTblName);. 
12d80 20 20 20 20 20 69 66 28 20 70 4e 61 6d 65 32 20       if( pName2 
12d90 26 26 20 70 4e 61 6d 65 32 2d 3e 6e 3d 3d 30 20  && pName2->n==0 
12da0 26 26 20 70 54 61 62 20 26 26 20 70 54 61 62 2d  && pTab && pTab-
12db0 3e 70 53 63 68 65 6d 61 3d 3d 64 62 2d 3e 61 44  >pSchema==db->aD
12dc0 62 5b 31 5d 2e 70 53 63 68 65 6d 61 20 29 7b 0a  b[1].pSchema ){.
12dd0 20 20 20 20 20 20 20 20 69 44 62 20 3d 20 31 3b          iDb = 1;
12de0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23  .      }.    }.#
12df0 65 6e 64 69 66 0a 0a 20 20 20 20 69 66 28 20 73  endif..    if( s
12e00 71 6c 69 74 65 33 46 69 78 49 6e 69 74 28 26 73  qlite3FixInit(&s
12e10 46 69 78 2c 20 70 50 61 72 73 65 2c 20 69 44 62  Fix, pParse, iDb
12e20 2c 20 22 69 6e 64 65 78 22 2c 20 70 4e 61 6d 65  , "index", pName
12e30 29 20 26 26 0a 20 20 20 20 20 20 20 20 73 71 6c  ) &&.        sql
12e40 69 74 65 33 46 69 78 53 72 63 4c 69 73 74 28 26  ite3FixSrcList(&
12e50 73 46 69 78 2c 20 70 54 62 6c 4e 61 6d 65 29 0a  sFix, pTblName).
12e60 20 20 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20      ){.      /* 
12e70 42 65 63 61 75 73 65 20 74 68 65 20 70 61 72 73  Because the pars
12e80 65 72 20 63 6f 6e 73 74 72 75 63 74 73 20 70 54  er constructs pT
12e90 62 6c 4e 61 6d 65 20 66 72 6f 6d 20 61 20 73 69  blName from a si
12ea0 6e 67 6c 65 20 69 64 65 6e 74 69 66 69 65 72 2c  ngle identifier,
12eb0 0a 20 20 20 20 20 20 2a 2a 20 73 71 6c 69 74 65  .      ** sqlite
12ec0 33 46 69 78 53 72 63 4c 69 73 74 20 63 61 6e 20  3FixSrcList can 
12ed0 6e 65 76 65 72 20 66 61 69 6c 2e 20 2a 2f 0a 20  never fail. */. 
12ee0 20 20 20 20 20 61 73 73 65 72 74 28 30 29 3b 0a       assert(0);.
12ef0 20 20 20 20 7d 0a 20 20 20 20 70 54 61 62 20 3d      }.    pTab =
12f00 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61   sqlite3LocateTa
12f10 62 6c 65 28 70 50 61 72 73 65 2c 20 30 2c 20 70  ble(pParse, 0, p
12f20 54 62 6c 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 4e  TblName->a[0].zN
12f30 61 6d 65 2c 20 0a 20 20 20 20 20 20 20 20 70 54  ame, .        pT
12f40 62 6c 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 44 61  blName->a[0].zDa
12f50 74 61 62 61 73 65 29 3b 0a 20 20 20 20 69 66 28  tabase);.    if(
12f60 20 21 70 54 61 62 20 29 20 67 6f 74 6f 20 65 78   !pTab ) goto ex
12f70 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
12f80 0a 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d  .    assert( db-
12f90 3e 61 44 62 5b 69 44 62 5d 2e 70 53 63 68 65 6d  >aDb[iDb].pSchem
12fa0 61 3d 3d 70 54 61 62 2d 3e 70 53 63 68 65 6d 61  a==pTab->pSchema
12fb0 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   );.  }else{.   
12fc0 20 61 73 73 65 72 74 28 20 70 4e 61 6d 65 3d 3d   assert( pName==
12fd0 30 20 29 3b 0a 20 20 20 20 70 54 61 62 20 3d 20  0 );.    pTab = 
12fe0 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
12ff0 65 3b 0a 20 20 20 20 69 66 28 20 21 70 54 61 62  e;.    if( !pTab
13000 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65   ) goto exit_cre
13010 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 69  ate_index;.    i
13020 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65  Db = sqlite3Sche
13030 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 54  maToIndex(db, pT
13040 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20  ab->pSchema);.  
13050 7d 0a 20 20 70 44 62 20 3d 20 26 64 62 2d 3e 61  }.  pDb = &db->a
13060 44 62 5b 69 44 62 5d 3b 0a 0a 20 20 69 66 28 20  Db[iDb];..  if( 
13070 70 54 61 62 3d 3d 30 20 7c 7c 20 70 50 61 72 73  pTab==0 || pPars
13080 65 2d 3e 6e 45 72 72 20 29 20 67 6f 74 6f 20 65  e->nErr ) goto e
13090 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
130a0 3b 0a 20 20 69 66 28 20 70 54 61 62 2d 3e 72 65  ;.  if( pTab->re
130b0 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 73 71  adOnly ){.    sq
130c0 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
130d0 61 72 73 65 2c 20 22 74 61 62 6c 65 20 25 73 20  arse, "table %s 
130e0 6d 61 79 20 6e 6f 74 20 62 65 20 69 6e 64 65 78  may not be index
130f0 65 64 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  ed", pTab->zName
13100 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74  );.    goto exit
13110 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
13120 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
13130 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 20 20 69 66  E_OMIT_VIEW.  if
13140 28 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20  ( pTab->pSelect 
13150 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
13160 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
13170 76 69 65 77 73 20 6d 61 79 20 6e 6f 74 20 62 65  views may not be
13180 20 69 6e 64 65 78 65 64 22 29 3b 0a 20 20 20 20   indexed");.    
13190 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
131a0 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 23 65 6e 64  _index;.  }.#end
131b0 69 66 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  if.#ifndef SQLIT
131c0 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
131d0 42 4c 45 0a 20 20 69 66 28 20 49 73 56 69 72 74  BLE.  if( IsVirt
131e0 75 61 6c 28 70 54 61 62 29 20 29 7b 0a 20 20 20  ual(pTab) ){.   
131f0 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
13200 28 70 50 61 72 73 65 2c 20 22 76 69 72 74 75 61  (pParse, "virtua
13210 6c 20 74 61 62 6c 65 73 20 6d 61 79 20 6e 6f 74  l tables may not
13220 20 62 65 20 69 6e 64 65 78 65 64 22 29 3b 0a 20   be indexed");. 
13230 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65     goto exit_cre
13240 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 23  ate_index;.  }.#
13250 65 6e 64 69 66 0a 0a 20 20 2f 2a 0a 20 20 2a 2a  endif..  /*.  **
13260 20 46 69 6e 64 20 74 68 65 20 6e 61 6d 65 20 6f   Find the name o
13270 66 20 74 68 65 20 69 6e 64 65 78 2e 20 20 4d 61  f the index.  Ma
13280 6b 65 20 73 75 72 65 20 74 68 65 72 65 20 69 73  ke sure there is
13290 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 61 6e 6f   not already ano
132a0 74 68 65 72 0a 20 20 2a 2a 20 69 6e 64 65 78 20  ther.  ** index 
132b0 6f 72 20 74 61 62 6c 65 20 77 69 74 68 20 74 68  or table with th
132c0 65 20 73 61 6d 65 20 6e 61 6d 65 2e 20 20 0a 20  e same name.  . 
132d0 20 2a 2a 0a 20 20 2a 2a 20 45 78 63 65 70 74 69   **.  ** Excepti
132e0 6f 6e 3a 20 20 49 66 20 77 65 20 61 72 65 20 72  on:  If we are r
132f0 65 61 64 69 6e 67 20 74 68 65 20 6e 61 6d 65 73  eading the names
13300 20 6f 66 20 70 65 72 6d 61 6e 65 6e 74 20 69 6e   of permanent in
13310 64 69 63 65 73 20 66 72 6f 6d 20 74 68 65 0a 20  dices from the. 
13320 20 2a 2a 20 73 71 6c 69 74 65 5f 6d 61 73 74 65   ** sqlite_maste
13330 72 20 74 61 62 6c 65 20 28 62 65 63 61 75 73 65  r table (because
13340 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f 63   some other proc
13350 65 73 73 20 63 68 61 6e 67 65 64 20 74 68 65 20  ess changed the 
13360 73 63 68 65 6d 61 29 20 61 6e 64 0a 20 20 2a 2a  schema) and.  **
13370 20 6f 6e 65 20 6f 66 20 74 68 65 20 69 6e 64 65   one of the inde
13380 78 20 6e 61 6d 65 73 20 63 6f 6c 6c 69 64 65 73  x names collides
13390 20 77 69 74 68 20 74 68 65 20 6e 61 6d 65 20 6f   with the name o
133a0 66 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61  f a temporary ta
133b0 62 6c 65 20 6f 72 0a 20 20 2a 2a 20 69 6e 64 65  ble or.  ** inde
133c0 78 2c 20 74 68 65 6e 20 77 65 20 77 69 6c 6c 20  x, then we will 
133d0 63 6f 6e 74 69 6e 75 65 20 74 6f 20 70 72 6f 63  continue to proc
133e0 65 73 73 20 74 68 69 73 20 69 6e 64 65 78 2e 0a  ess this index..
133f0 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 70 4e 61    **.  ** If pNa
13400 6d 65 3d 3d 30 20 69 74 20 6d 65 61 6e 73 20 74  me==0 it means t
13410 68 61 74 20 77 65 20 61 72 65 0a 20 20 2a 2a 20  hat we are.  ** 
13420 64 65 61 6c 69 6e 67 20 77 69 74 68 20 61 20 70  dealing with a p
13430 72 69 6d 61 72 79 20 6b 65 79 20 6f 72 20 55 4e  rimary key or UN
13440 49 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 2e  IQUE constraint.
13450 20 20 57 65 20 68 61 76 65 20 74 6f 20 69 6e 76    We have to inv
13460 65 6e 74 20 6f 75 72 0a 20 20 2a 2a 20 6f 77 6e  ent our.  ** own
13470 20 6e 61 6d 65 2e 0a 20 20 2a 2f 0a 20 20 69 66   name..  */.  if
13480 28 20 70 4e 61 6d 65 20 29 7b 0a 20 20 20 20 7a  ( pName ){.    z
13490 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61  Name = sqlite3Na
134a0 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20  meFromToken(db, 
134b0 70 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20  pName);.    if( 
134c0 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74  SQLITE_OK!=sqlit
134d0 65 33 52 65 61 64 53 63 68 65 6d 61 28 70 50 61  e3ReadSchema(pPa
134e0 72 73 65 29 20 29 20 67 6f 74 6f 20 65 78 69 74  rse) ) goto exit
134f0 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
13500 20 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20     if( zName==0 
13510 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61  ) goto exit_crea
13520 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 69 66  te_index;.    if
13530 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c  ( SQLITE_OK!=sql
13540 69 74 65 33 43 68 65 63 6b 4f 62 6a 65 63 74 4e  ite3CheckObjectN
13550 61 6d 65 28 70 50 61 72 73 65 2c 20 7a 4e 61 6d  ame(pParse, zNam
13560 65 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  e) ){.      goto
13570 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
13580 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ex;.    }.    if
13590 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  ( !db->init.busy
135a0 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 53 51   ){.      if( SQ
135b0 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33  LITE_OK!=sqlite3
135c0 52 65 61 64 53 63 68 65 6d 61 28 70 50 61 72 73  ReadSchema(pPars
135d0 65 29 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63  e) ) goto exit_c
135e0 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20  reate_index;.   
135f0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 46 69     if( sqlite3Fi
13600 6e 64 54 61 62 6c 65 28 64 62 2c 20 7a 4e 61 6d  ndTable(db, zNam
13610 65 2c 20 30 29 21 3d 30 20 29 7b 0a 20 20 20 20  e, 0)!=0 ){.    
13620 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
13630 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 68 65  Msg(pParse, "the
13640 72 65 20 69 73 20 61 6c 72 65 61 64 79 20 61 20  re is already a 
13650 74 61 62 6c 65 20 6e 61 6d 65 64 20 25 73 22 2c  table named %s",
13660 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20   zName);.       
13670 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
13680 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 20 20 7d  e_index;.      }
13690 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73  .    }.    if( s
136a0 71 6c 69 74 65 33 46 69 6e 64 49 6e 64 65 78 28  qlite3FindIndex(
136b0 64 62 2c 20 7a 4e 61 6d 65 2c 20 70 44 62 2d 3e  db, zName, pDb->
136c0 7a 4e 61 6d 65 29 21 3d 30 20 29 7b 0a 20 20 20  zName)!=0 ){.   
136d0 20 20 20 69 66 28 20 21 69 66 4e 6f 74 45 78 69     if( !ifNotExi
136e0 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  st ){.        sq
136f0 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
13700 61 72 73 65 2c 20 22 69 6e 64 65 78 20 25 73 20  arse, "index %s 
13710 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 22 2c  already exists",
13720 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d   zName);.      }
13730 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74  .      goto exit
13740 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
13750 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
13760 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 49 6e 64    int n;.    Ind
13770 65 78 20 2a 70 4c 6f 6f 70 3b 0a 20 20 20 20 66  ex *pLoop;.    f
13780 6f 72 28 70 4c 6f 6f 70 3d 70 54 61 62 2d 3e 70  or(pLoop=pTab->p
13790 49 6e 64 65 78 2c 20 6e 3d 31 3b 20 70 4c 6f 6f  Index, n=1; pLoo
137a0 70 3b 20 70 4c 6f 6f 70 3d 70 4c 6f 6f 70 2d 3e  p; pLoop=pLoop->
137b0 70 4e 65 78 74 2c 20 6e 2b 2b 29 7b 7d 0a 20 20  pNext, n++){}.  
137c0 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65    zName = sqlite
137d0 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 73 71  3MPrintf(db, "sq
137e0 6c 69 74 65 5f 61 75 74 6f 69 6e 64 65 78 5f 25  lite_autoindex_%
137f0 73 5f 25 64 22 2c 20 70 54 61 62 2d 3e 7a 4e 61  s_%d", pTab->zNa
13800 6d 65 2c 20 6e 29 3b 0a 20 20 20 20 69 66 28 20  me, n);.    if( 
13810 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20  zName==0 ){.    
13820 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61    goto exit_crea
13830 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a  te_index;.    }.
13840 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20    }..  /* Check 
13850 66 6f 72 20 61 75 74 68 6f 72 69 7a 61 74 69 6f  for authorizatio
13860 6e 20 74 6f 20 63 72 65 61 74 65 20 61 6e 20 69  n to create an i
13870 6e 64 65 78 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64  ndex..  */.#ifnd
13880 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
13890 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 7b  UTHORIZATION.  {
138a0 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
138b0 2a 7a 44 62 20 3d 20 70 44 62 2d 3e 7a 4e 61 6d  *zDb = pDb->zNam
138c0 65 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  e;.    if( sqlit
138d0 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72  e3AuthCheck(pPar
138e0 73 65 2c 20 53 51 4c 49 54 45 5f 49 4e 53 45 52  se, SQLITE_INSER
138f0 54 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28  T, SCHEMA_TABLE(
13900 69 44 62 29 2c 20 30 2c 20 7a 44 62 29 20 29 7b  iDb), 0, zDb) ){
13910 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74  .      goto exit
13920 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
13930 20 20 20 7d 0a 20 20 20 20 69 20 3d 20 53 51 4c     }.    i = SQL
13940 49 54 45 5f 43 52 45 41 54 45 5f 49 4e 44 45 58  ITE_CREATE_INDEX
13950 3b 0a 20 20 20 20 69 66 28 20 21 4f 4d 49 54 5f  ;.    if( !OMIT_
13960 54 45 4d 50 44 42 20 26 26 20 69 44 62 3d 3d 31  TEMPDB && iDb==1
13970 20 29 20 69 20 3d 20 53 51 4c 49 54 45 5f 43 52   ) i = SQLITE_CR
13980 45 41 54 45 5f 54 45 4d 50 5f 49 4e 44 45 58 3b  EATE_TEMP_INDEX;
13990 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
139a0 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65  AuthCheck(pParse
139b0 2c 20 69 2c 20 7a 4e 61 6d 65 2c 20 70 54 61 62  , i, zName, pTab
139c0 2d 3e 7a 4e 61 6d 65 2c 20 7a 44 62 29 20 29 7b  ->zName, zDb) ){
139d0 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74  .      goto exit
139e0 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
139f0 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
13a00 0a 20 20 2f 2a 20 49 66 20 70 4c 69 73 74 3d 3d  .  /* If pList==
13a10 30 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 69 73  0, it means this
13a20 20 72 6f 75 74 69 6e 65 20 77 61 73 20 63 61 6c   routine was cal
13a30 6c 65 64 20 74 6f 20 6d 61 6b 65 20 61 20 70 72  led to make a pr
13a40 69 6d 61 72 79 0a 20 20 2a 2a 20 6b 65 79 20 6f  imary.  ** key o
13a50 75 74 20 6f 66 20 74 68 65 20 6c 61 73 74 20 63  ut of the last c
13a60 6f 6c 75 6d 6e 20 61 64 64 65 64 20 74 6f 20 74  olumn added to t
13a70 68 65 20 74 61 62 6c 65 20 75 6e 64 65 72 20 63  he table under c
13a80 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 20 20 2a  onstruction..  *
13a90 2a 20 53 6f 20 63 72 65 61 74 65 20 61 20 66 61  * So create a fa
13aa0 6b 65 20 6c 69 73 74 20 74 6f 20 73 69 6d 75 6c  ke list to simul
13ab0 61 74 65 20 74 68 69 73 2e 0a 20 20 2a 2f 0a 20  ate this..  */. 
13ac0 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b   if( pList==0 ){
13ad0 0a 20 20 20 20 6e 75 6c 6c 49 64 2e 7a 20 3d 20  .    nullId.z = 
13ae0 28 75 38 2a 29 70 54 61 62 2d 3e 61 43 6f 6c 5b  (u8*)pTab->aCol[
13af0 70 54 61 62 2d 3e 6e 43 6f 6c 2d 31 5d 2e 7a 4e  pTab->nCol-1].zN
13b00 61 6d 65 3b 0a 20 20 20 20 6e 75 6c 6c 49 64 2e  ame;.    nullId.
13b10 6e 20 3d 20 73 74 72 6c 65 6e 28 28 63 68 61 72  n = strlen((char
13b20 2a 29 6e 75 6c 6c 49 64 2e 7a 29 3b 0a 20 20 20  *)nullId.z);.   
13b30 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33   pList = sqlite3
13b40 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70  ExprListAppend(p
13b50 50 61 72 73 65 2c 20 30 2c 20 30 2c 20 26 6e 75  Parse, 0, 0, &nu
13b60 6c 6c 49 64 29 3b 0a 20 20 20 20 69 66 28 20 70  llId);.    if( p
13b70 4c 69 73 74 3d 3d 30 20 29 20 67 6f 74 6f 20 65  List==0 ) goto e
13b80 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
13b90 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 61 5b 30  ;.    pList->a[0
13ba0 5d 2e 73 6f 72 74 4f 72 64 65 72 20 3d 20 73 6f  ].sortOrder = so
13bb0 72 74 4f 72 64 65 72 3b 0a 20 20 7d 0a 0a 20 20  rtOrder;.  }..  
13bc0 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68 6f  /* Figure out ho
13bd0 77 20 6d 61 6e 79 20 62 79 74 65 73 20 6f 66 20  w many bytes of 
13be0 73 70 61 63 65 20 61 72 65 20 72 65 71 75 69 72  space are requir
13bf0 65 64 20 74 6f 20 73 74 6f 72 65 20 65 78 70 6c  ed to store expl
13c00 69 63 69 74 6c 79 0a 20 20 2a 2a 20 73 70 65 63  icitly.  ** spec
13c10 69 66 69 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 20  ified collation 
13c20 73 65 71 75 65 6e 63 65 20 6e 61 6d 65 73 2e 0a  sequence names..
13c30 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20    */.  for(i=0; 
13c40 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20  i<pList->nExpr; 
13c50 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a  i++){.    Expr *
13c60 70 45 78 70 72 20 3d 20 70 4c 69 73 74 2d 3e 61  pExpr = pList->a
13c70 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 69  [i].pExpr;.    i
13c80 66 28 20 70 45 78 70 72 20 29 7b 0a 20 20 20 20  f( pExpr ){.    
13c90 20 20 6e 45 78 74 72 61 20 2b 3d 20 28 31 20 2b    nExtra += (1 +
13ca0 20 73 74 72 6c 65 6e 28 70 45 78 70 72 2d 3e 70   strlen(pExpr->p
13cb0 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20  Coll->zName));. 
13cc0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 0a     }.  }..  /* .
13cd0 20 20 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 74 68    ** Allocate th
13ce0 65 20 69 6e 64 65 78 20 73 74 72 75 63 74 75 72  e index structur
13cf0 65 2e 20 0a 20 20 2a 2f 0a 20 20 6e 4e 61 6d 65  e. .  */.  nName
13d00 20 3d 20 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29   = strlen(zName)
13d10 3b 0a 20 20 6e 43 6f 6c 20 3d 20 70 4c 69 73 74  ;.  nCol = pList
13d20 2d 3e 6e 45 78 70 72 3b 0a 20 20 70 49 6e 64 65  ->nExpr;.  pInde
13d30 78 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  x = sqlite3DbMal
13d40 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 0a 20 20 20  locZero(db, .   
13d50 20 20 20 73 69 7a 65 6f 66 28 49 6e 64 65 78 29     sizeof(Index)
13d60 20 2b 20 20 20 20 20 20 20 20 20 20 20 20 20 20   +              
13d70 2f 2a 20 49 6e 64 65 78 20 73 74 72 75 63 74 75  /* Index structu
13d80 72 65 20 20 2a 2f 0a 20 20 20 20 20 20 73 69 7a  re  */.      siz
13d90 65 6f 66 28 69 6e 74 29 2a 6e 43 6f 6c 20 2b 20  eof(int)*nCol + 
13da0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
13db0 65 78 2e 61 69 43 6f 6c 75 6d 6e 20 20 20 2a 2f  ex.aiColumn   */
13dc0 0a 20 20 20 20 20 20 73 69 7a 65 6f 66 28 69 6e  .      sizeof(in
13dd0 74 29 2a 28 6e 43 6f 6c 2b 31 29 20 2b 20 20 20  t)*(nCol+1) +   
13de0 20 20 20 20 2f 2a 20 49 6e 64 65 78 2e 61 69 52      /* Index.aiR
13df0 6f 77 45 73 74 20 20 20 2a 2f 0a 20 20 20 20 20  owEst   */.     
13e00 20 73 69 7a 65 6f 66 28 63 68 61 72 20 2a 29 2a   sizeof(char *)*
13e10 6e 43 6f 6c 20 2b 20 20 20 20 20 20 20 20 2f 2a  nCol +        /*
13e20 20 49 6e 64 65 78 2e 61 7a 43 6f 6c 6c 20 20 20   Index.azColl   
13e30 20 20 2a 2f 0a 20 20 20 20 20 20 73 69 7a 65 6f    */.      sizeo
13e40 66 28 75 38 29 2a 6e 43 6f 6c 20 2b 20 20 20 20  f(u8)*nCol +    
13e50 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
13e60 2e 61 53 6f 72 74 4f 72 64 65 72 20 2a 2f 0a 20  .aSortOrder */. 
13e70 20 20 20 20 20 6e 4e 61 6d 65 20 2b 20 31 20 2b       nName + 1 +
13e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13e90 20 20 2f 2a 20 49 6e 64 65 78 2e 7a 4e 61 6d 65    /* Index.zName
13ea0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 6e        */.      n
13eb0 45 78 74 72 61 20 20 20 20 20 20 20 20 20 20 20  Extra           
13ec0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
13ed0 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
13ee0 65 20 6e 61 6d 65 73 20 2a 2f 0a 20 20 29 3b 0a  e names */.  );.
13ef0 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
13f00 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f  Failed ){.    go
13f10 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
13f20 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 70 49 6e 64  ndex;.  }.  pInd
13f30 65 78 2d 3e 61 7a 43 6f 6c 6c 20 3d 20 28 63 68  ex->azColl = (ch
13f40 61 72 2a 2a 29 28 26 70 49 6e 64 65 78 5b 31 5d  ar**)(&pIndex[1]
13f50 29 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 61 69 43  );.  pIndex->aiC
13f60 6f 6c 75 6d 6e 20 3d 20 28 69 6e 74 20 2a 29 28  olumn = (int *)(
13f70 26 70 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c 5b  &pIndex->azColl[
13f80 6e 43 6f 6c 5d 29 3b 0a 20 20 70 49 6e 64 65 78  nCol]);.  pIndex
13f90 2d 3e 61 69 52 6f 77 45 73 74 20 3d 20 28 75 6e  ->aiRowEst = (un
13fa0 73 69 67 6e 65 64 20 2a 29 28 26 70 49 6e 64 65  signed *)(&pInde
13fb0 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 43 6f 6c  x->aiColumn[nCol
13fc0 5d 29 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 61 53  ]);.  pIndex->aS
13fd0 6f 72 74 4f 72 64 65 72 20 3d 20 28 75 38 20 2a  ortOrder = (u8 *
13fe0 29 28 26 70 49 6e 64 65 78 2d 3e 61 69 52 6f 77  )(&pIndex->aiRow
13ff0 45 73 74 5b 6e 43 6f 6c 2b 31 5d 29 3b 0a 20 20  Est[nCol+1]);.  
14000 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 20 3d 20  pIndex->zName = 
14010 28 63 68 61 72 20 2a 29 28 26 70 49 6e 64 65 78  (char *)(&pIndex
14020 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 6e 43 6f  ->aSortOrder[nCo
14030 6c 5d 29 3b 0a 20 20 7a 45 78 74 72 61 20 3d 20  l]);.  zExtra = 
14040 28 63 68 61 72 20 2a 29 28 26 70 49 6e 64 65 78  (char *)(&pIndex
14050 2d 3e 7a 4e 61 6d 65 5b 6e 4e 61 6d 65 2b 31 5d  ->zName[nName+1]
14060 29 3b 0a 20 20 6d 65 6d 63 70 79 28 70 49 6e 64  );.  memcpy(pInd
14070 65 78 2d 3e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65  ex->zName, zName
14080 2c 20 6e 4e 61 6d 65 2b 31 29 3b 0a 20 20 70 49  , nName+1);.  pI
14090 6e 64 65 78 2d 3e 70 54 61 62 6c 65 20 3d 20 70  ndex->pTable = p
140a0 54 61 62 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 6e  Tab;.  pIndex->n
140b0 43 6f 6c 75 6d 6e 20 3d 20 70 4c 69 73 74 2d 3e  Column = pList->
140c0 6e 45 78 70 72 3b 0a 20 20 70 49 6e 64 65 78 2d  nExpr;.  pIndex-
140d0 3e 6f 6e 45 72 72 6f 72 20 3d 20 6f 6e 45 72 72  >onError = onErr
140e0 6f 72 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 61 75  or;.  pIndex->au
140f0 74 6f 49 6e 64 65 78 20 3d 20 70 4e 61 6d 65 3d  toIndex = pName=
14100 3d 30 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 70 53  =0;.  pIndex->pS
14110 63 68 65 6d 61 20 3d 20 64 62 2d 3e 61 44 62 5b  chema = db->aDb[
14120 69 44 62 5d 2e 70 53 63 68 65 6d 61 3b 0a 0a 20  iDb].pSchema;.. 
14130 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65   /* Check to see
14140 20 69 66 20 77 65 20 73 68 6f 75 6c 64 20 68 6f   if we should ho
14150 6e 6f 72 20 44 45 53 43 20 72 65 71 75 65 73 74  nor DESC request
14160 73 20 6f 6e 20 69 6e 64 65 78 20 63 6f 6c 75 6d  s on index colum
14170 6e 73 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 44  ns.  */.  if( pD
14180 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 66 69 6c 65  b->pSchema->file
14190 5f 66 6f 72 6d 61 74 3e 3d 34 20 29 7b 0a 20 20  _format>=4 ){.  
141a0 20 20 73 6f 72 74 4f 72 64 65 72 4d 61 73 6b 20    sortOrderMask 
141b0 3d 20 2d 31 3b 20 20 20 2f 2a 20 48 6f 6e 6f 72  = -1;   /* Honor
141c0 20 44 45 53 43 20 2a 2f 0a 20 20 7d 65 6c 73 65   DESC */.  }else
141d0 7b 0a 20 20 20 20 73 6f 72 74 4f 72 64 65 72 4d  {.    sortOrderM
141e0 61 73 6b 20 3d 20 30 3b 20 20 20 20 2f 2a 20 49  ask = 0;    /* I
141f0 67 6e 6f 72 65 20 44 45 53 43 20 2a 2f 0a 20 20  gnore DESC */.  
14200 7d 0a 0a 20 20 2f 2a 20 53 63 61 6e 20 74 68 65  }..  /* Scan the
14210 20 6e 61 6d 65 73 20 6f 66 20 74 68 65 20 63 6f   names of the co
14220 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 74 61 62  lumns of the tab
14230 6c 65 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64  le to be indexed
14240 20 61 6e 64 0a 20 20 2a 2a 20 6c 6f 61 64 20 74   and.  ** load t
14250 68 65 20 63 6f 6c 75 6d 6e 20 69 6e 64 69 63 65  he column indice
14260 73 20 69 6e 74 6f 20 74 68 65 20 49 6e 64 65 78  s into the Index
14270 20 73 74 72 75 63 74 75 72 65 2e 20 20 52 65 70   structure.  Rep
14280 6f 72 74 20 61 6e 20 65 72 72 6f 72 0a 20 20 2a  ort an error.  *
14290 2a 20 69 66 20 61 6e 79 20 63 6f 6c 75 6d 6e 20  * if any column 
142a0 69 73 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 20 20  is not found..  
142b0 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 4c  */.  for(i=0, pL
142c0 69 73 74 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61  istItem=pList->a
142d0 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72  ; i<pList->nExpr
142e0 3b 20 69 2b 2b 2c 20 70 4c 69 73 74 49 74 65 6d  ; i++, pListItem
142f0 2b 2b 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63  ++){.    const c
14300 68 61 72 20 2a 7a 43 6f 6c 4e 61 6d 65 20 3d 20  har *zColName = 
14310 70 4c 69 73 74 49 74 65 6d 2d 3e 7a 4e 61 6d 65  pListItem->zName
14320 3b 0a 20 20 20 20 43 6f 6c 75 6d 6e 20 2a 70 54  ;.    Column *pT
14330 61 62 43 6f 6c 3b 0a 20 20 20 20 69 6e 74 20 72  abCol;.    int r
14340 65 71 75 65 73 74 65 64 53 6f 72 74 4f 72 64 65  equestedSortOrde
14350 72 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 43 6f  r;.    char *zCo
14360 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ll;             
14370 20 20 20 20 20 20 2f 2a 20 43 6f 6c 6c 61 74 69        /* Collati
14380 6f 6e 20 73 65 71 75 65 6e 63 65 20 6e 61 6d 65  on sequence name
14390 20 2a 2f 0a 0a 20 20 20 20 66 6f 72 28 6a 3d 30   */..    for(j=0
143a0 2c 20 70 54 61 62 43 6f 6c 3d 70 54 61 62 2d 3e  , pTabCol=pTab->
143b0 61 43 6f 6c 3b 20 6a 3c 70 54 61 62 2d 3e 6e 43  aCol; j<pTab->nC
143c0 6f 6c 3b 20 6a 2b 2b 2c 20 70 54 61 62 43 6f 6c  ol; j++, pTabCol
143d0 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73  ++){.      if( s
143e0 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 43  qlite3StrICmp(zC
143f0 6f 6c 4e 61 6d 65 2c 20 70 54 61 62 43 6f 6c 2d  olName, pTabCol-
14400 3e 7a 4e 61 6d 65 29 3d 3d 30 20 29 20 62 72 65  >zName)==0 ) bre
14410 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ak;.    }.    if
14420 28 20 6a 3e 3d 70 54 61 62 2d 3e 6e 43 6f 6c 20  ( j>=pTab->nCol 
14430 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
14440 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
14450 20 22 74 61 62 6c 65 20 25 73 20 68 61 73 20 6e   "table %s has n
14460 6f 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 64 20 25  o column named %
14470 73 22 2c 0a 20 20 20 20 20 20 20 20 70 54 61 62  s",.        pTab
14480 2d 3e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 4e 61 6d  ->zName, zColNam
14490 65 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65  e);.      goto e
144a0 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
144b0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 54  ;.    }.    /* T
144c0 4f 44 4f 3a 20 20 41 64 64 20 61 20 74 65 73 74  ODO:  Add a test
144d0 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68   to make sure th
144e0 61 74 20 74 68 65 20 73 61 6d 65 20 63 6f 6c 75  at the same colu
144f0 6d 6e 20 69 73 20 6e 6f 74 20 6e 61 6d 65 64 0a  mn is not named.
14500 20 20 20 20 2a 2a 20 6d 6f 72 65 20 74 68 61 6e      ** more than
14510 20 6f 6e 63 65 20 77 69 74 68 69 6e 20 74 68 65   once within the
14520 20 73 61 6d 65 20 69 6e 64 65 78 2e 20 20 4f 6e   same index.  On
14530 6c 79 20 74 68 65 20 66 69 72 73 74 20 69 6e 73  ly the first ins
14540 74 61 6e 63 65 20 6f 66 0a 20 20 20 20 2a 2a 20  tance of.    ** 
14550 74 68 65 20 63 6f 6c 75 6d 6e 20 77 69 6c 6c 20  the column will 
14560 65 76 65 72 20 62 65 20 75 73 65 64 20 62 79 20  ever be used by 
14570 74 68 65 20 6f 70 74 69 6d 69 7a 65 72 2e 20 20  the optimizer.  
14580 4e 6f 74 65 20 74 68 61 74 20 75 73 69 6e 67 20  Note that using 
14590 74 68 65 0a 20 20 20 20 2a 2a 20 73 61 6d 65 20  the.    ** same 
145a0 63 6f 6c 75 6d 6e 20 6d 6f 72 65 20 74 68 61 6e  column more than
145b0 20 6f 6e 63 65 20 63 61 6e 6e 6f 74 20 62 65 20   once cannot be 
145c0 61 6e 20 65 72 72 6f 72 20 62 65 63 61 75 73 65  an error because
145d0 20 74 68 61 74 20 77 6f 75 6c 64 20 0a 20 20 20   that would .   
145e0 20 2a 2a 20 62 72 65 61 6b 20 62 61 63 6b 77 61   ** break backwa
145f0 72 64 73 20 63 6f 6d 70 61 74 69 62 69 6c 69 74  rds compatibilit
14600 79 20 2d 20 69 74 20 6e 65 65 64 73 20 74 6f 20  y - it needs to 
14610 62 65 20 61 20 77 61 72 6e 69 6e 67 2e 0a 20 20  be a warning..  
14620 20 20 2a 2f 0a 20 20 20 20 70 49 6e 64 65 78 2d    */.    pIndex-
14630 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 20 3d 20 6a  >aiColumn[i] = j
14640 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 49  ;.    if( pListI
14650 74 65 6d 2d 3e 70 45 78 70 72 20 29 7b 0a 20 20  tem->pExpr ){.  
14660 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 69 73      assert( pLis
14670 74 49 74 65 6d 2d 3e 70 45 78 70 72 2d 3e 70 43  tItem->pExpr->pC
14680 6f 6c 6c 20 29 3b 0a 20 20 20 20 20 20 7a 43 6f  oll );.      zCo
14690 6c 6c 20 3d 20 7a 45 78 74 72 61 3b 0a 20 20 20  ll = zExtra;.   
146a0 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
146b0 6e 74 66 28 6e 45 78 74 72 61 2c 20 7a 45 78 74  ntf(nExtra, zExt
146c0 72 61 2c 20 22 25 73 22 2c 20 70 4c 69 73 74 49  ra, "%s", pListI
146d0 74 65 6d 2d 3e 70 45 78 70 72 2d 3e 70 43 6f 6c  tem->pExpr->pCol
146e0 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  l->zName);.     
146f0 20 7a 45 78 74 72 61 20 2b 3d 20 28 73 74 72 6c   zExtra += (strl
14700 65 6e 28 7a 43 6f 6c 6c 29 20 2b 20 31 29 3b 0a  en(zColl) + 1);.
14710 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
14720 20 7a 43 6f 6c 6c 20 3d 20 70 54 61 62 2d 3e 61   zColl = pTab->a
14730 43 6f 6c 5b 6a 5d 2e 7a 43 6f 6c 6c 3b 0a 20 20  Col[j].zColl;.  
14740 20 20 20 20 69 66 28 20 21 7a 43 6f 6c 6c 20 29      if( !zColl )
14750 7b 0a 20 20 20 20 20 20 20 20 7a 43 6f 6c 6c 20  {.        zColl 
14760 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 2d  = db->pDfltColl-
14770 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 7d 0a  >zName;.      }.
14780 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21 64      }.    if( !d
14790 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 26 26 20  b->init.busy && 
147a0 21 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 43 6f  !sqlite3LocateCo
147b0 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 7a 43  llSeq(pParse, zC
147c0 6f 6c 6c 2c 20 2d 31 29 20 29 7b 0a 20 20 20 20  oll, -1) ){.    
147d0 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61    goto exit_crea
147e0 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a  te_index;.    }.
147f0 20 20 20 20 70 49 6e 64 65 78 2d 3e 61 7a 43 6f      pIndex->azCo
14800 6c 6c 5b 69 5d 20 3d 20 7a 43 6f 6c 6c 3b 0a 20  ll[i] = zColl;. 
14810 20 20 20 72 65 71 75 65 73 74 65 64 53 6f 72 74     requestedSort
14820 4f 72 64 65 72 20 3d 20 70 4c 69 73 74 49 74 65  Order = pListIte
14830 6d 2d 3e 73 6f 72 74 4f 72 64 65 72 20 26 20 73  m->sortOrder & s
14840 6f 72 74 4f 72 64 65 72 4d 61 73 6b 3b 0a 20 20  ortOrderMask;.  
14850 20 20 70 49 6e 64 65 78 2d 3e 61 53 6f 72 74 4f    pIndex->aSortO
14860 72 64 65 72 5b 69 5d 20 3d 20 72 65 71 75 65 73  rder[i] = reques
14870 74 65 64 53 6f 72 74 4f 72 64 65 72 3b 0a 20 20  tedSortOrder;.  
14880 7d 0a 20 20 73 71 6c 69 74 65 33 44 65 66 61 75  }.  sqlite3Defau
14890 6c 74 52 6f 77 45 73 74 28 70 49 6e 64 65 78 29  ltRowEst(pIndex)
148a0 3b 0a 0a 20 20 69 66 28 20 70 54 61 62 3d 3d 70  ;..  if( pTab==p
148b0 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
148c0 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20   ){.    /* This 
148d0 72 6f 75 74 69 6e 65 20 68 61 73 20 62 65 65 6e  routine has been
148e0 20 63 61 6c 6c 65 64 20 74 6f 20 63 72 65 61 74   called to creat
148f0 65 20 61 6e 20 61 75 74 6f 6d 61 74 69 63 20 69  e an automatic i
14900 6e 64 65 78 20 61 73 20 61 0a 20 20 20 20 2a 2a  ndex as a.    **
14910 20 72 65 73 75 6c 74 20 6f 66 20 61 20 50 52 49   result of a PRI
14920 4d 41 52 59 20 4b 45 59 20 6f 72 20 55 4e 49 51  MARY KEY or UNIQ
14930 55 45 20 63 6c 61 75 73 65 20 6f 6e 20 61 20 63  UE clause on a c
14940 6f 6c 75 6d 6e 20 64 65 66 69 6e 69 74 69 6f 6e  olumn definition
14950 2c 20 6f 72 0a 20 20 20 20 2a 2a 20 61 20 50 52  , or.    ** a PR
14960 49 4d 41 52 59 20 4b 45 59 20 6f 72 20 55 4e 49  IMARY KEY or UNI
14970 51 55 45 20 63 6c 61 75 73 65 20 66 6f 6c 6c 6f  QUE clause follo
14980 77 69 6e 67 20 74 68 65 20 63 6f 6c 75 6d 6e 20  wing the column 
14990 64 65 66 69 6e 69 74 69 6f 6e 73 2e 0a 20 20 20  definitions..   
149a0 20 2a 2a 20 69 2e 65 2e 20 6f 6e 65 20 6f 66 3a   ** i.e. one of:
149b0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 43  .    **.    ** C
149c0 52 45 41 54 45 20 54 41 42 4c 45 20 74 28 78 20  REATE TABLE t(x 
149d0 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 79 29 3b  PRIMARY KEY, y);
149e0 0a 20 20 20 20 2a 2a 20 43 52 45 41 54 45 20 54  .    ** CREATE T
149f0 41 42 4c 45 20 74 28 78 2c 20 79 2c 20 55 4e 49  ABLE t(x, y, UNI
14a00 51 55 45 28 78 2c 20 79 29 29 3b 0a 20 20 20 20  QUE(x, y));.    
14a10 2a 2a 0a 20 20 20 20 2a 2a 20 45 69 74 68 65 72  **.    ** Either
14a20 20 77 61 79 2c 20 63 68 65 63 6b 20 74 6f 20 73   way, check to s
14a30 65 65 20 69 66 20 74 68 65 20 74 61 62 6c 65 20  ee if the table 
14a40 61 6c 72 65 61 64 79 20 68 61 73 20 73 75 63 68  already has such
14a50 20 61 6e 20 69 6e 64 65 78 2e 20 49 66 0a 20 20   an index. If.  
14a60 20 20 2a 2a 20 73 6f 2c 20 64 6f 6e 27 74 20 62    ** so, don't b
14a70 6f 74 68 65 72 20 63 72 65 61 74 69 6e 67 20 74  other creating t
14a80 68 69 73 20 6f 6e 65 2e 20 54 68 69 73 20 6f 6e  his one. This on
14a90 6c 79 20 61 70 70 6c 69 65 73 20 74 6f 0a 20 20  ly applies to.  
14aa0 20 20 2a 2a 20 61 75 74 6f 6d 61 74 69 63 61 6c    ** automatical
14ab0 6c 79 20 63 72 65 61 74 65 64 20 69 6e 64 69 63  ly created indic
14ac0 65 73 2e 20 55 73 65 72 73 20 63 61 6e 20 64 6f  es. Users can do
14ad0 20 61 73 20 74 68 65 79 20 77 69 73 68 20 77 69   as they wish wi
14ae0 74 68 0a 20 20 20 20 2a 2a 20 65 78 70 6c 69 63  th.    ** explic
14af0 69 74 20 69 6e 64 69 63 65 73 2e 0a 20 20 20 20  it indices..    
14b00 2a 2f 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49  */.    Index *pI
14b10 64 78 3b 0a 20 20 20 20 66 6f 72 28 70 49 64 78  dx;.    for(pIdx
14b20 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70  =pTab->pIndex; p
14b30 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e  Idx; pIdx=pIdx->
14b40 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 6e  pNext){.      in
14b50 74 20 6b 3b 0a 20 20 20 20 20 20 61 73 73 65 72  t k;.      asser
14b60 74 28 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72  t( pIdx->onError
14b70 21 3d 4f 45 5f 4e 6f 6e 65 20 29 3b 0a 20 20 20  !=OE_None );.   
14b80 20 20 20 61 73 73 65 72 74 28 20 70 49 64 78 2d     assert( pIdx-
14b90 3e 61 75 74 6f 49 6e 64 65 78 20 29 3b 0a 20 20  >autoIndex );.  
14ba0 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 64      assert( pInd
14bb0 65 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f  ex->onError!=OE_
14bc0 4e 6f 6e 65 20 29 3b 0a 0a 20 20 20 20 20 20 69  None );..      i
14bd0 66 28 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e  f( pIdx->nColumn
14be0 21 3d 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d  !=pIndex->nColum
14bf0 6e 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  n ) continue;.  
14c00 20 20 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70      for(k=0; k<p
14c10 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 6b 2b  Idx->nColumn; k+
14c20 2b 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73  +){.        cons
14c30 74 20 63 68 61 72 20 2a 7a 31 20 3d 20 70 49 64  t char *z1 = pId
14c40 78 2d 3e 61 7a 43 6f 6c 6c 5b 6b 5d 3b 0a 20 20  x->azColl[k];.  
14c50 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
14c60 20 2a 7a 32 20 3d 20 70 49 6e 64 65 78 2d 3e 61   *z2 = pIndex->a
14c70 7a 43 6f 6c 6c 5b 6b 5d 3b 0a 20 20 20 20 20 20  zColl[k];.      
14c80 20 20 69 66 28 20 70 49 64 78 2d 3e 61 69 43 6f    if( pIdx->aiCo
14c90 6c 75 6d 6e 5b 6b 5d 21 3d 70 49 6e 64 65 78 2d  lumn[k]!=pIndex-
14ca0 3e 61 69 43 6f 6c 75 6d 6e 5b 6b 5d 20 29 20 62  >aiColumn[k] ) b
14cb0 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 69 66  reak;.        if
14cc0 28 20 70 49 64 78 2d 3e 61 53 6f 72 74 4f 72 64  ( pIdx->aSortOrd
14cd0 65 72 5b 6b 5d 21 3d 70 49 6e 64 65 78 2d 3e 61  er[k]!=pIndex->a
14ce0 53 6f 72 74 4f 72 64 65 72 5b 6b 5d 20 29 20 62  SortOrder[k] ) b
14cf0 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 69 66  reak;.        if
14d00 28 20 7a 31 21 3d 7a 32 20 26 26 20 73 71 6c 69  ( z1!=z2 && sqli
14d10 74 65 33 53 74 72 49 43 6d 70 28 7a 31 2c 20 7a  te3StrICmp(z1, z
14d20 32 29 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  2) ) break;.    
14d30 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6b 3d    }.      if( k=
14d40 3d 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 29  =pIdx->nColumn )
14d50 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 49  {.        if( pI
14d60 64 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d 70 49 6e  dx->onError!=pIn
14d70 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 20 29 7b 0a  dex->onError ){.
14d80 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69            /* Thi
14d90 73 20 63 6f 6e 73 74 72 61 69 6e 74 20 63 72 65  s constraint cre
14da0 61 74 65 73 20 74 68 65 20 73 61 6d 65 20 69 6e  ates the same in
14db0 64 65 78 20 61 73 20 61 20 70 72 65 76 69 6f 75  dex as a previou
14dc0 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63  s.          ** c
14dd0 6f 6e 73 74 72 61 69 6e 74 20 73 70 65 63 69 66  onstraint specif
14de0 69 65 64 20 73 6f 6d 65 77 68 65 72 65 20 69 6e  ied somewhere in
14df0 20 74 68 65 20 43 52 45 41 54 45 20 54 41 42 4c   the CREATE TABL
14e00 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20 20  E statement..   
14e10 20 20 20 20 20 20 20 2a 2a 20 48 6f 77 65 76 65         ** Howeve
14e20 72 20 74 68 65 20 4f 4e 20 43 4f 4e 46 4c 49 43  r the ON CONFLIC
14e30 54 20 63 6c 61 75 73 65 73 20 61 72 65 20 64 69  T clauses are di
14e40 66 66 65 72 65 6e 74 2e 20 49 66 20 62 6f 74 68  fferent. If both
14e50 20 74 68 69 73 20 0a 20 20 20 20 20 20 20 20 20   this .         
14e60 20 2a 2a 20 63 6f 6e 73 74 72 61 69 6e 74 20 61   ** constraint a
14e70 6e 64 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  nd the previous 
14e80 65 71 75 69 76 61 6c 65 6e 74 20 63 6f 6e 73 74  equivalent const
14e90 72 61 69 6e 74 20 68 61 76 65 20 65 78 70 6c 69  raint have expli
14ea0 63 69 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  cit.          **
14eb0 20 4f 4e 20 43 4f 4e 46 4c 49 43 54 20 63 6c 61   ON CONFLICT cla
14ec0 75 73 65 73 20 74 68 69 73 20 69 73 20 61 6e 20  uses this is an 
14ed0 65 72 72 6f 72 2e 20 4f 74 68 65 72 77 69 73 65  error. Otherwise
14ee0 2c 20 75 73 65 20 74 68 65 0a 20 20 20 20 20 20  , use the.      
14ef0 20 20 20 20 2a 2a 20 65 78 70 6c 69 63 69 74 6c      ** explicitl
14f00 79 20 73 70 65 63 69 66 69 65 64 20 62 65 68 61  y specified beha
14f10 76 69 6f 75 72 20 66 6f 72 20 74 68 65 20 69 6e  viour for the in
14f20 64 65 78 2e 0a 20 20 20 20 20 20 20 20 20 20 2a  dex..          *
14f30 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  /.          if( 
14f40 21 28 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 3d  !(pIdx->onError=
14f50 3d 4f 45 5f 44 65 66 61 75 6c 74 20 7c 7c 20 70  =OE_Default || p
14f60 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d  Index->onError==
14f70 4f 45 5f 44 65 66 61 75 6c 74 29 20 29 7b 0a 20  OE_Default) ){. 
14f80 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
14f90 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
14fa0 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  e, .            
14fb0 20 20 20 20 22 63 6f 6e 66 6c 69 63 74 69 6e 67      "conflicting
14fc0 20 4f 4e 20 43 4f 4e 46 4c 49 43 54 20 63 6c 61   ON CONFLICT cla
14fd0 75 73 65 73 20 73 70 65 63 69 66 69 65 64 22 2c  uses specified",
14fe0 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d   0);.          }
14ff0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
15000 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45  Idx->onError==OE
15010 5f 44 65 66 61 75 6c 74 20 29 7b 0a 20 20 20 20  _Default ){.    
15020 20 20 20 20 20 20 20 20 70 49 64 78 2d 3e 6f 6e          pIdx->on
15030 45 72 72 6f 72 20 3d 20 70 49 6e 64 65 78 2d 3e  Error = pIndex->
15040 6f 6e 45 72 72 6f 72 3b 0a 20 20 20 20 20 20 20  onError;.       
15050 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
15060 20 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74         goto exit
15070 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
15080 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
15090 0a 0a 20 20 2f 2a 20 4c 69 6e 6b 20 74 68 65 20  ..  /* Link the 
150a0 6e 65 77 20 49 6e 64 65 78 20 73 74 72 75 63 74  new Index struct
150b0 75 72 65 20 74 6f 20 69 74 73 20 74 61 62 6c 65  ure to its table
150c0 20 61 6e 64 20 74 6f 20 74 68 65 20 6f 74 68 65   and to the othe
150d0 72 0a 20 20 2a 2a 20 69 6e 2d 6d 65 6d 6f 72 79  r.  ** in-memory
150e0 20 64 61 74 61 62 61 73 65 20 73 74 72 75 63 74   database struct
150f0 75 72 65 73 2e 20 0a 20 20 2a 2f 0a 20 20 69 66  ures. .  */.  if
15100 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20  ( db->init.busy 
15110 29 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 3b  ){.    Index *p;
15120 0a 20 20 20 20 70 20 3d 20 73 71 6c 69 74 65 33  .    p = sqlite3
15130 48 61 73 68 49 6e 73 65 72 74 28 26 70 49 6e 64  HashInsert(&pInd
15140 65 78 2d 3e 70 53 63 68 65 6d 61 2d 3e 69 64 78  ex->pSchema->idx
15150 48 61 73 68 2c 20 0a 20 20 20 20 20 20 20 20 20  Hash, .         
15160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15170 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 73  pIndex->zName, s
15180 74 72 6c 65 6e 28 70 49 6e 64 65 78 2d 3e 7a 4e  trlen(pIndex->zN
15190 61 6d 65 29 2b 31 2c 20 70 49 6e 64 65 78 29 3b  ame)+1, pIndex);
151a0 0a 20 20 20 20 69 66 28 20 70 20 29 7b 0a 20 20  .    if( p ){.  
151b0 20 20 20 20 61 73 73 65 72 74 28 20 70 3d 3d 70      assert( p==p
151c0 49 6e 64 65 78 20 29 3b 20 20 2f 2a 20 4d 61 6c  Index );  /* Mal
151d0 6c 6f 63 20 6d 75 73 74 20 68 61 76 65 20 66 61  loc must have fa
151e0 69 6c 65 64 20 2a 2f 0a 20 20 20 20 20 20 64 62  iled */.      db
151f0 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d  ->mallocFailed =
15200 20 31 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65   1;.      goto e
15210 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
15220 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 62 2d 3e  ;.    }.    db->
15230 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f  flags |= SQLITE_
15240 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a 20  InternChanges;. 
15250 20 20 20 69 66 28 20 70 54 62 6c 4e 61 6d 65 21     if( pTblName!
15260 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 49 6e 64  =0 ){.      pInd
15270 65 78 2d 3e 74 6e 75 6d 20 3d 20 64 62 2d 3e 69  ex->tnum = db->i
15280 6e 69 74 2e 6e 65 77 54 6e 75 6d 3b 0a 20 20 20  nit.newTnum;.   
15290 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20   }.  }..  /* If 
152a0 74 68 65 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73  the db->init.bus
152b0 79 20 69 73 20 30 20 74 68 65 6e 20 63 72 65 61  y is 0 then crea
152c0 74 65 20 74 68 65 20 69 6e 64 65 78 20 6f 6e 20  te the index on 
152d0 64 69 73 6b 2e 20 20 54 68 69 73 0a 20 20 2a 2a  disk.  This.  **
152e0 20 69 6e 76 6f 6c 76 65 73 20 77 72 69 74 69 6e   involves writin
152f0 67 20 74 68 65 20 69 6e 64 65 78 20 69 6e 74 6f  g the index into
15300 20 74 68 65 20 6d 61 73 74 65 72 20 74 61 62 6c   the master tabl
15310 65 20 61 6e 64 20 66 69 6c 6c 69 6e 67 20 69 6e  e and filling in
15320 20 74 68 65 0a 20 20 2a 2a 20 69 6e 64 65 78 20   the.  ** index 
15330 77 69 74 68 20 74 68 65 20 63 75 72 72 65 6e 74  with the current
15340 20 74 61 62 6c 65 20 63 6f 6e 74 65 6e 74 73 2e   table contents.
15350 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 64  .  **.  ** The d
15360 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 69 73 20  b->init.busy is 
15370 30 20 77 68 65 6e 20 74 68 65 20 75 73 65 72 20  0 when the user 
15380 66 69 72 73 74 20 65 6e 74 65 72 73 20 61 20 43  first enters a C
15390 52 45 41 54 45 20 49 4e 44 45 58 20 0a 20 20 2a  REATE INDEX .  *
153a0 2a 20 63 6f 6d 6d 61 6e 64 2e 20 20 64 62 2d 3e  * command.  db->
153b0 69 6e 69 74 2e 62 75 73 79 20 69 73 20 31 20 77  init.busy is 1 w
153c0 68 65 6e 20 61 20 64 61 74 61 62 61 73 65 20 69  hen a database i
153d0 73 20 6f 70 65 6e 65 64 20 61 6e 64 20 0a 20 20  s opened and .  
153e0 2a 2a 20 43 52 45 41 54 45 20 49 4e 44 45 58 20  ** CREATE INDEX 
153f0 73 74 61 74 65 6d 65 6e 74 73 20 61 72 65 20 72  statements are r
15400 65 61 64 20 6f 75 74 20 6f 66 20 74 68 65 20 6d  ead out of the m
15410 61 73 74 65 72 20 74 61 62 6c 65 2e 20 20 49 6e  aster table.  In
15420 0a 20 20 2a 2a 20 74 68 65 20 6c 61 74 74 65 72  .  ** the latter
15430 20 63 61 73 65 20 74 68 65 20 69 6e 64 65 78 20   case the index 
15440 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 20 6f  already exists o
15450 6e 20 64 69 73 6b 2c 20 77 68 69 63 68 20 69 73  n disk, which is
15460 20 77 68 79 0a 20 20 2a 2a 20 77 65 20 64 6f 6e   why.  ** we don
15470 27 74 20 77 61 6e 74 20 74 6f 20 72 65 63 72 65  't want to recre
15480 61 74 65 20 69 74 2e 0a 20 20 2a 2a 0a 20 20 2a  ate it..  **.  *
15490 2a 20 49 66 20 70 54 62 6c 4e 61 6d 65 3d 3d 30  * If pTblName==0
154a0 20 69 74 20 6d 65 61 6e 73 20 74 68 69 73 20 69   it means this i
154b0 6e 64 65 78 20 69 73 20 67 65 6e 65 72 61 74 65  ndex is generate
154c0 64 20 61 73 20 61 20 70 72 69 6d 61 72 79 20 6b  d as a primary k
154d0 65 79 0a 20 20 2a 2a 20 6f 72 20 55 4e 49 51 55  ey.  ** or UNIQU
154e0 45 20 63 6f 6e 73 74 72 61 69 6e 74 20 6f 66 20  E constraint of 
154f0 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73  a CREATE TABLE s
15500 74 61 74 65 6d 65 6e 74 2e 20 20 53 69 6e 63 65  tatement.  Since
15510 20 74 68 65 20 74 61 62 6c 65 0a 20 20 2a 2a 20   the table.  ** 
15520 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20 63 72  has just been cr
15530 65 61 74 65 64 2c 20 69 74 20 63 6f 6e 74 61 69  eated, it contai
15540 6e 73 20 6e 6f 20 64 61 74 61 20 61 6e 64 20 74  ns no data and t
15550 68 65 20 69 6e 64 65 78 20 69 6e 69 74 69 61 6c  he index initial
15560 69 7a 61 74 69 6f 6e 0a 20 20 2a 2a 20 73 74 65  ization.  ** ste
15570 70 20 63 61 6e 20 62 65 20 73 6b 69 70 70 65 64  p can be skipped
15580 2e 0a 20 20 2a 2f 0a 20 20 65 6c 73 65 20 69 66  ..  */.  else if
15590 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d  ( db->init.busy=
155a0 3d 30 20 29 7b 0a 20 20 20 20 56 64 62 65 20 2a  =0 ){.    Vdbe *
155b0 76 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 53 74  v;.    char *zSt
155c0 6d 74 3b 0a 20 20 20 20 69 6e 74 20 69 4d 65 6d  mt;.    int iMem
155d0 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
155e0 6d 3b 0a 0a 20 20 20 20 76 20 3d 20 73 71 6c 69  m;..    v = sqli
155f0 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
15600 65 29 3b 0a 20 20 20 20 69 66 28 20 76 3d 3d 30  e);.    if( v==0
15610 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65   ) goto exit_cre
15620 61 74 65 5f 69 6e 64 65 78 3b 0a 0a 0a 20 20 20  ate_index;...   
15630 20 2f 2a 20 43 72 65 61 74 65 20 74 68 65 20 72   /* Create the r
15640 6f 6f 74 70 61 67 65 20 66 6f 72 20 74 68 65 20  ootpage for the 
15650 69 6e 64 65 78 0a 20 20 20 20 2a 2f 0a 20 20 20  index.    */.   
15660 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69   sqlite3BeginWri
15670 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72  teOperation(pPar
15680 73 65 2c 20 31 2c 20 69 44 62 29 3b 0a 20 20 20  se, 1, iDb);.   
15690 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
156a0 70 32 28 76 2c 20 4f 50 5f 43 72 65 61 74 65 49  p2(v, OP_CreateI
156b0 6e 64 65 78 2c 20 69 44 62 2c 20 69 4d 65 6d 29  ndex, iDb, iMem)
156c0 3b 0a 0a 20 20 20 20 2f 2a 20 47 61 74 68 65 72  ;..    /* Gather
156d0 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 74 65   the complete te
156e0 78 74 20 6f 66 20 74 68 65 20 43 52 45 41 54 45  xt of the CREATE
156f0 20 49 4e 44 45 58 20 73 74 61 74 65 6d 65 6e 74   INDEX statement
15700 20 69 6e 74 6f 0a 20 20 20 20 2a 2a 20 74 68 65   into.    ** the
15710 20 7a 53 74 6d 74 20 76 61 72 69 61 62 6c 65 0a   zStmt variable.
15720 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
15730 53 74 61 72 74 20 26 26 20 70 45 6e 64 20 29 7b  Start && pEnd ){
15740 0a 20 20 20 20 20 20 2f 2a 20 41 20 6e 61 6d 65  .      /* A name
15750 64 20 69 6e 64 65 78 20 77 69 74 68 20 61 6e 20  d index with an 
15760 65 78 70 6c 69 63 69 74 20 43 52 45 41 54 45 20  explicit CREATE 
15770 49 4e 44 45 58 20 73 74 61 74 65 6d 65 6e 74 20  INDEX statement 
15780 2a 2f 0a 20 20 20 20 20 20 7a 53 74 6d 74 20 3d  */.      zStmt =
15790 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
157a0 64 62 2c 20 22 43 52 45 41 54 45 25 73 20 49 4e  db, "CREATE%s IN
157b0 44 45 58 20 25 2e 2a 73 22 2c 0a 20 20 20 20 20  DEX %.*s",.     
157c0 20 20 20 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 4e     onError==OE_N
157d0 6f 6e 65 20 3f 20 22 22 20 3a 20 22 20 55 4e 49  one ? "" : " UNI
157e0 51 55 45 22 2c 0a 20 20 20 20 20 20 20 20 70 45  QUE",.        pE
157f0 6e 64 2d 3e 7a 20 2d 20 70 4e 61 6d 65 2d 3e 7a  nd->z - pName->z
15800 20 2b 20 31 2c 0a 20 20 20 20 20 20 20 20 70 4e   + 1,.        pN
15810 61 6d 65 2d 3e 7a 29 3b 0a 20 20 20 20 7d 65 6c  ame->z);.    }el
15820 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 41 6e 20  se{.      /* An 
15830 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20  automatic index 
15840 63 72 65 61 74 65 64 20 62 79 20 61 20 50 52 49  created by a PRI
15850 4d 41 52 59 20 4b 45 59 20 6f 72 20 55 4e 49 51  MARY KEY or UNIQ
15860 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a 2f  UE constraint */
15870 0a 20 20 20 20 20 20 2f 2a 20 7a 53 74 6d 74 20  .      /* zStmt 
15880 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66  = sqlite3MPrintf
15890 28 22 22 29 3b 20 2a 2f 0a 20 20 20 20 20 20 7a  (""); */.      z
158a0 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  Stmt = 0;.    }.
158b0 0a 20 20 20 20 2f 2a 20 41 64 64 20 61 6e 20 65  .    /* Add an e
158c0 6e 74 72 79 20 69 6e 20 73 71 6c 69 74 65 5f 6d  ntry in sqlite_m
158d0 61 73 74 65 72 20 66 6f 72 20 74 68 69 73 20 69  aster for this i
158e0 6e 64 65 78 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ndex.    */.    
158f0 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72  sqlite3NestedPar
15900 73 65 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20  se(pParse, .    
15910 20 20 20 20 22 49 4e 53 45 52 54 20 49 4e 54 4f      "INSERT INTO
15920 20 25 51 2e 25 73 20 56 41 4c 55 45 53 28 27 69   %Q.%s VALUES('i
15930 6e 64 65 78 27 2c 25 51 2c 25 51 2c 23 25 64 2c  ndex',%Q,%Q,#%d,
15940 25 51 29 3b 22 2c 0a 20 20 20 20 20 20 20 20 64  %Q);",.        d
15950 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d  b->aDb[iDb].zNam
15960 65 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28  e, SCHEMA_TABLE(
15970 69 44 62 29 2c 0a 20 20 20 20 20 20 20 20 70 49  iDb),.        pI
15980 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20  ndex->zName,.   
15990 20 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65       pTab->zName
159a0 2c 0a 20 20 20 20 20 20 20 20 69 4d 65 6d 2c 0a  ,.        iMem,.
159b0 20 20 20 20 20 20 20 20 7a 53 74 6d 74 0a 20 20          zStmt.  
159c0 20 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33    );.    sqlite3
159d0 5f 66 72 65 65 28 7a 53 74 6d 74 29 3b 0a 0a 20  _free(zStmt);.. 
159e0 20 20 20 2f 2a 20 46 69 6c 6c 20 74 68 65 20 69     /* Fill the i
159f0 6e 64 65 78 20 77 69 74 68 20 64 61 74 61 20 61  ndex with data a
15a00 6e 64 20 72 65 70 61 72 73 65 20 74 68 65 20 73  nd reparse the s
15a10 63 68 65 6d 61 2e 20 43 6f 64 65 20 61 6e 20 4f  chema. Code an O
15a20 50 5f 45 78 70 69 72 65 0a 20 20 20 20 2a 2a 20  P_Expire.    ** 
15a30 74 6f 20 69 6e 76 61 6c 69 64 61 74 65 20 61 6c  to invalidate al
15a40 6c 20 70 72 65 2d 63 6f 6d 70 69 6c 65 64 20 73  l pre-compiled s
15a50 74 61 74 65 6d 65 6e 74 73 2e 0a 20 20 20 20 2a  tatements..    *
15a60 2f 0a 20 20 20 20 69 66 28 20 70 54 62 6c 4e 61  /.    if( pTblNa
15a70 6d 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  me ){.      sqli
15a80 74 65 33 52 65 66 69 6c 6c 49 6e 64 65 78 28 70  te3RefillIndex(p
15a90 50 61 72 73 65 2c 20 70 49 6e 64 65 78 2c 20 69  Parse, pIndex, i
15aa0 4d 65 6d 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  Mem);.      sqli
15ab0 74 65 33 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28  te3ChangeCookie(
15ac0 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20  pParse, iDb);.  
15ad0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
15ae0 64 64 4f 70 34 28 76 2c 20 4f 50 5f 50 61 72 73  ddOp4(v, OP_Pars
15af0 65 53 63 68 65 6d 61 2c 20 69 44 62 2c 20 30 2c  eSchema, iDb, 0,
15b00 20 30 2c 0a 20 20 20 20 20 20 20 20 20 73 71 6c   0,.         sql
15b10 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20  ite3MPrintf(db, 
15b20 22 6e 61 6d 65 3d 27 25 71 27 22 2c 20 70 49 6e  "name='%q'", pIn
15b30 64 65 78 2d 3e 7a 4e 61 6d 65 29 2c 20 50 34 5f  dex->zName), P4_
15b40 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20 20  DYNAMIC);.      
15b50 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
15b60 31 28 76 2c 20 4f 50 5f 45 78 70 69 72 65 2c 20  1(v, OP_Expire, 
15b70 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  0);.    }.  }.. 
15b80 20 2f 2a 20 57 68 65 6e 20 61 64 64 69 6e 67 20   /* When adding 
15b90 61 6e 20 69 6e 64 65 78 20 74 6f 20 74 68 65 20  an index to the 
15ba0 6c 69 73 74 20 6f 66 20 69 6e 64 69 63 65 73 20  list of indices 
15bb0 66 6f 72 20 61 20 74 61 62 6c 65 2c 20 6d 61 6b  for a table, mak
15bc0 65 0a 20 20 2a 2a 20 73 75 72 65 20 61 6c 6c 20  e.  ** sure all 
15bd0 69 6e 64 69 63 65 73 20 6c 61 62 65 6c 65 64 20  indices labeled 
15be0 4f 45 5f 52 65 70 6c 61 63 65 20 63 6f 6d 65 20  OE_Replace come 
15bf0 61 66 74 65 72 20 61 6c 6c 20 74 68 6f 73 65 20  after all those 
15c00 6c 61 62 65 6c 65 64 0a 20 20 2a 2a 20 4f 45 5f  labeled.  ** OE_
15c10 49 67 6e 6f 72 65 2e 20 20 54 68 69 73 20 69 73  Ignore.  This is
15c20 20 6e 65 63 65 73 73 61 72 79 20 66 6f 72 20 74   necessary for t
15c30 68 65 20 63 6f 72 72 65 63 74 20 6f 70 65 72 61  he correct opera
15c40 74 69 6f 6e 20 6f 66 20 55 50 44 41 54 45 0a 20  tion of UPDATE. 
15c50 20 2a 2a 20 61 6e 64 20 49 4e 53 45 52 54 2e 0a   ** and INSERT..
15c60 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 69    */.  if( db->i
15c70 6e 69 74 2e 62 75 73 79 20 7c 7c 20 70 54 62 6c  nit.busy || pTbl
15c80 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 69  Name==0 ){.    i
15c90 66 28 20 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 52  f( onError!=OE_R
15ca0 65 70 6c 61 63 65 20 7c 7c 20 70 54 61 62 2d 3e  eplace || pTab->
15cb0 70 49 6e 64 65 78 3d 3d 30 0a 20 20 20 20 20 20  pIndex==0.      
15cc0 20 20 20 7c 7c 20 70 54 61 62 2d 3e 70 49 6e 64     || pTab->pInd
15cd0 65 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f  ex->onError==OE_
15ce0 52 65 70 6c 61 63 65 29 7b 0a 20 20 20 20 20 20  Replace){.      
15cf0 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74 20 3d 20  pIndex->pNext = 
15d00 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 0a 20 20  pTab->pIndex;.  
15d10 20 20 20 20 70 54 61 62 2d 3e 70 49 6e 64 65 78      pTab->pIndex
15d20 20 3d 20 70 49 6e 64 65 78 3b 0a 20 20 20 20 7d   = pIndex;.    }
15d30 65 6c 73 65 7b 0a 20 20 20 20 20 20 49 6e 64 65  else{.      Inde
15d40 78 20 2a 70 4f 74 68 65 72 20 3d 20 70 54 61 62  x *pOther = pTab
15d50 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20 20 20 20  ->pIndex;.      
15d60 77 68 69 6c 65 28 20 70 4f 74 68 65 72 2d 3e 70  while( pOther->p
15d70 4e 65 78 74 20 26 26 20 70 4f 74 68 65 72 2d 3e  Next && pOther->
15d80 70 4e 65 78 74 2d 3e 6f 6e 45 72 72 6f 72 21 3d  pNext->onError!=
15d90 4f 45 5f 52 65 70 6c 61 63 65 20 29 7b 0a 20 20  OE_Replace ){.  
15da0 20 20 20 20 20 20 70 4f 74 68 65 72 20 3d 20 70        pOther = p
15db0 4f 74 68 65 72 2d 3e 70 4e 65 78 74 3b 0a 20 20  Other->pNext;.  
15dc0 20 20 20 20 7d 0a 20 20 20 20 20 20 70 49 6e 64      }.      pInd
15dd0 65 78 2d 3e 70 4e 65 78 74 20 3d 20 70 4f 74 68  ex->pNext = pOth
15de0 65 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20  er->pNext;.     
15df0 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74 20 3d   pOther->pNext =
15e00 20 70 49 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20   pIndex;.    }. 
15e10 20 20 20 70 49 6e 64 65 78 20 3d 20 30 3b 0a 20     pIndex = 0;. 
15e20 20 7d 0a 0a 20 20 2f 2a 20 43 6c 65 61 6e 20 75   }..  /* Clean u
15e30 70 20 62 65 66 6f 72 65 20 65 78 69 74 69 6e 67  p before exiting
15e40 20 2a 2f 0a 65 78 69 74 5f 63 72 65 61 74 65 5f   */.exit_create_
15e50 69 6e 64 65 78 3a 0a 20 20 69 66 28 20 70 49 6e  index:.  if( pIn
15e60 64 65 78 20 29 7b 0a 20 20 20 20 66 72 65 65 49  dex ){.    freeI
15e70 6e 64 65 78 28 70 49 6e 64 65 78 29 3b 0a 20 20  ndex(pIndex);.  
15e80 7d 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c  }.  sqlite3ExprL
15e90 69 73 74 44 65 6c 65 74 65 28 70 4c 69 73 74 29  istDelete(pList)
15ea0 3b 0a 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69  ;.  sqlite3SrcLi
15eb0 73 74 44 65 6c 65 74 65 28 70 54 62 6c 4e 61 6d  stDelete(pTblNam
15ec0 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  e);.  sqlite3_fr
15ed0 65 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 72 65 74  ee(zName);.  ret
15ee0 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  urn;.}../*.** Ge
15ef0 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 6d  nerate code to m
15f00 61 6b 65 20 73 75 72 65 20 74 68 65 20 66 69 6c  ake sure the fil
15f10 65 20 66 6f 72 6d 61 74 20 6e 75 6d 62 65 72 20  e format number 
15f20 69 73 20 61 74 20 6c 65 61 73 74 20 6d 69 6e 46  is at least minF
15f30 6f 72 6d 61 74 2e 0a 2a 2a 20 54 68 65 20 67 65  ormat..** The ge
15f40 6e 65 72 61 74 65 64 20 63 6f 64 65 20 77 69 6c  nerated code wil
15f50 6c 20 69 6e 63 72 65 61 73 65 20 74 68 65 20 66  l increase the f
15f60 69 6c 65 20 66 6f 72 6d 61 74 20 6e 75 6d 62 65  ile format numbe
15f70 72 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e 0a  r if necessary..
15f80 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 4d  */.void sqlite3M
15f90 69 6e 69 6d 75 6d 46 69 6c 65 46 6f 72 6d 61 74  inimumFileFormat
15fa0 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
15fb0 69 6e 74 20 69 44 62 2c 20 69 6e 74 20 6d 69 6e  int iDb, int min
15fc0 46 6f 72 6d 61 74 29 7b 0a 20 20 56 64 62 65 20  Format){.  Vdbe 
15fd0 2a 76 3b 0a 20 20 76 20 3d 20 73 71 6c 69 74 65  *v;.  v = sqlite
15fe0 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
15ff0 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20  ;.  if( v ){.   
16000 20 69 6e 74 20 72 31 20 3d 20 73 71 6c 69 74 65   int r1 = sqlite
16010 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
16020 73 65 29 3b 0a 20 20 20 20 69 6e 74 20 72 32 20  se);.    int r2 
16030 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
16040 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20  Reg(pParse);.   
16050 20 69 6e 74 20 6a 31 3b 0a 20 20 20 20 73 71 6c   int j1;.    sql
16060 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
16070 2c 20 4f 50 5f 52 65 61 64 43 6f 6f 6b 69 65 2c  , OP_ReadCookie,
16080 20 69 44 62 2c 20 72 31 2c 20 31 29 3b 0a 20 20   iDb, r1, 1);.  
16090 20 20 73 71 6c 69 74 65 33 56 64 62 65 55 73 65    sqlite3VdbeUse
160a0 73 42 74 72 65 65 28 76 2c 20 69 44 62 29 3b 0a  sBtree(v, iDb);.
160b0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
160c0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
160d0 67 65 72 2c 20 6d 69 6e 46 6f 72 6d 61 74 2c 20  ger, minFormat, 
160e0 72 32 29 3b 0a 20 20 20 20 6a 31 20 3d 20 73 71  r2);.    j1 = sq
160f0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
16100 76 2c 20 4f 50 5f 47 65 2c 20 72 32 2c 20 30 2c  v, OP_Ge, r2, 0,
16110 20 72 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65   r1);.    sqlite
16120 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
16130 50 5f 53 65 74 43 6f 6f 6b 69 65 2c 20 69 44 62  P_SetCookie, iDb
16140 2c 20 31 2c 20 72 32 29 3b 0a 20 20 20 20 73 71  , 1, r2);.    sq
16150 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
16160 65 28 76 2c 20 6a 31 29 3b 0a 20 20 20 20 73 71  e(v, j1);.    sq
16170 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
16180 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b  Reg(pParse, r1);
16190 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65  .    sqlite3Rele
161a0 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
161b0 65 2c 20 72 32 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  e, r2);.  }.}../
161c0 2a 0a 2a 2a 20 46 69 6c 6c 20 74 68 65 20 49 6e  *.** Fill the In
161d0 64 65 78 2e 61 69 52 6f 77 45 73 74 5b 5d 20 61  dex.aiRowEst[] a
161e0 72 72 61 79 20 77 69 74 68 20 64 65 66 61 75 6c  rray with defaul
161f0 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2d 20  t information - 
16200 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20 74  information.** t
16210 6f 20 62 65 20 75 73 65 64 20 77 68 65 6e 20 77  o be used when w
16220 65 20 68 61 76 65 20 6e 6f 74 20 72 75 6e 20 74  e have not run t
16230 68 65 20 41 4e 41 4c 59 5a 45 20 63 6f 6d 6d 61  he ANALYZE comma
16240 6e 64 2e 0a 2a 2a 0a 2a 2a 20 61 69 52 6f 77 45  nd..**.** aiRowE
16250 73 74 5b 30 5d 20 69 73 20 73 75 70 70 6f 73 65  st[0] is suppose
16260 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65 20   to contain the 
16270 6e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e  number of elemen
16280 74 73 20 69 6e 20 74 68 65 20 69 6e 64 65 78 2e  ts in the index.
16290 0a 2a 2a 20 53 69 6e 63 65 20 77 65 20 64 6f 20  .** Since we do 
162a0 6e 6f 74 20 6b 6e 6f 77 2c 20 67 75 65 73 73 20  not know, guess 
162b0 31 20 6d 69 6c 6c 69 6f 6e 2e 20 20 61 69 52 6f  1 million.  aiRo
162c0 77 45 73 74 5b 31 5d 20 69 73 20 61 6e 20 65 73  wEst[1] is an es
162d0 74 69 6d 61 74 65 20 6f 66 20 74 68 65 0a 2a 2a  timate of the.**
162e0 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   number of rows 
162f0 69 6e 20 74 68 65 20 74 61 62 6c 65 20 74 68 61  in the table tha
16300 74 20 6d 61 74 63 68 20 61 6e 79 20 70 61 72 74  t match any part
16310 69 63 75 6c 61 72 20 76 61 6c 75 65 20 6f 66 20  icular value of 
16320 74 68 65 0a 2a 2a 20 66 69 72 73 74 20 63 6f 6c  the.** first col
16330 75 6d 6e 20 6f 66 20 74 68 65 20 69 6e 64 65 78  umn of the index
16340 2e 20 20 61 69 52 6f 77 45 73 74 5b 32 5d 20 69  .  aiRowEst[2] i
16350 73 20 61 6e 20 65 73 74 69 6d 61 74 65 20 6f 66  s an estimate of
16360 20 74 68 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f   the number.** o
16370 66 20 72 6f 77 73 20 74 68 61 74 20 6d 61 74 63  f rows that matc
16380 68 20 61 6e 79 20 70 61 72 74 69 63 75 6c 61 72  h any particular
16390 20 63 6f 6d 62 69 6e 69 61 74 69 6f 6e 20 6f 66   combiniation of
163a0 20 74 68 65 20 66 69 72 73 74 20 32 20 63 6f 6c   the first 2 col
163b0 75 6d 6e 73 0a 2a 2a 20 6f 66 20 74 68 65 20 69  umns.** of the i
163c0 6e 64 65 78 2e 20 20 41 6e 64 20 73 6f 20 66 6f  ndex.  And so fo
163d0 72 74 68 2e 20 20 49 74 20 6d 75 73 74 20 61 6c  rth.  It must al
163e0 77 61 79 73 20 62 65 20 74 68 65 20 63 61 73 65  ways be the case
163f0 20 74 68 61 74 0a 2a 0a 2a 2a 20 20 20 20 20 20   that.*.**      
16400 20 20 20 20 20 61 69 52 6f 77 45 73 74 5b 4e 5d       aiRowEst[N]
16410 3c 3d 61 69 52 6f 77 45 73 74 5b 4e 2d 31 5d 0a  <=aiRowEst[N-1].
16420 2a 2a 20 20 20 20 20 20 20 20 20 20 20 61 69 52  **           aiR
16430 6f 77 45 73 74 5b 4e 5d 3e 3d 31 0a 2a 2a 0a 2a  owEst[N]>=1.**.*
16440 2a 20 41 70 61 72 74 20 66 72 6f 6d 20 74 68 61  * Apart from tha
16450 74 2c 20 77 65 20 68 61 76 65 20 6c 69 74 74 6c  t, we have littl
16460 65 20 74 6f 20 67 6f 20 6f 6e 20 62 65 73 69 64  e to go on besid
16470 65 73 20 69 6e 74 75 69 74 69 6f 6e 20 61 73 20  es intuition as 
16480 74 6f 0a 2a 2a 20 68 6f 77 20 61 69 52 6f 77 45  to.** how aiRowE
16490 73 74 5b 5d 20 73 68 6f 75 6c 64 20 62 65 20 69  st[] should be i
164a0 6e 69 74 69 61 6c 69 7a 65 64 2e 20 20 54 68 65  nitialized.  The
164b0 20 6e 75 6d 62 65 72 73 20 67 65 6e 65 72 61 74   numbers generat
164c0 65 64 20 68 65 72 65 0a 2a 2a 20 61 72 65 20 62  ed here.** are b
164d0 61 73 65 64 20 6f 6e 20 74 79 70 69 63 61 6c 20  ased on typical 
164e0 76 61 6c 75 65 73 20 66 6f 75 6e 64 20 69 6e 20  values found in 
164f0 61 63 74 75 61 6c 20 69 6e 64 69 63 65 73 2e 0a  actual indices..
16500 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 44  */.void sqlite3D
16510 65 66 61 75 6c 74 52 6f 77 45 73 74 28 49 6e 64  efaultRowEst(Ind
16520 65 78 20 2a 70 49 64 78 29 7b 0a 20 20 75 6e 73  ex *pIdx){.  uns
16530 69 67 6e 65 64 20 2a 61 20 3d 20 70 49 64 78 2d  igned *a = pIdx-
16540 3e 61 69 52 6f 77 45 73 74 3b 0a 20 20 69 6e 74  >aiRowEst;.  int
16550 20 69 3b 0a 20 20 61 73 73 65 72 74 28 20 61 21   i;.  assert( a!
16560 3d 30 20 29 3b 0a 20 20 61 5b 30 5d 20 3d 20 31  =0 );.  a[0] = 1
16570 30 30 30 30 30 30 3b 0a 20 20 66 6f 72 28 69 3d  000000;.  for(i=
16580 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69  pIdx->nColumn; i
16590 3e 3d 35 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 61  >=5; i--){.    a
165a0 5b 69 5d 20 3d 20 35 3b 0a 20 20 7d 0a 20 20 77  [i] = 5;.  }.  w
165b0 68 69 6c 65 28 20 69 3e 3d 31 20 29 7b 0a 20 20  hile( i>=1 ){.  
165c0 20 20 61 5b 69 5d 20 3d 20 31 31 20 2d 20 69 3b    a[i] = 11 - i;
165d0 0a 20 20 20 20 69 2d 2d 3b 0a 20 20 7d 0a 20 20  .    i--;.  }.  
165e0 69 66 28 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f  if( pIdx->onErro
165f0 72 21 3d 4f 45 5f 4e 6f 6e 65 20 29 7b 0a 20 20  r!=OE_None ){.  
16600 20 20 61 5b 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d    a[pIdx->nColum
16610 6e 5d 20 3d 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f  n] = 1;.  }.}../
16620 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
16630 65 20 77 69 6c 6c 20 64 72 6f 70 20 61 6e 20 65  e will drop an e
16640 78 69 73 74 69 6e 67 20 6e 61 6d 65 64 20 69 6e  xisting named in
16650 64 65 78 2e 20 20 54 68 69 73 20 72 6f 75 74 69  dex.  This routi
16660 6e 65 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 73  ne.** implements
16670 20 74 68 65 20 44 52 4f 50 20 49 4e 44 45 58 20   the DROP INDEX 
16680 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f  statement..*/.vo
16690 69 64 20 73 71 6c 69 74 65 33 44 72 6f 70 49 6e  id sqlite3DropIn
166a0 64 65 78 28 50 61 72 73 65 20 2a 70 50 61 72 73  dex(Parse *pPars
166b0 65 2c 20 53 72 63 4c 69 73 74 20 2a 70 4e 61 6d  e, SrcList *pNam
166c0 65 2c 20 69 6e 74 20 69 66 45 78 69 73 74 73 29  e, int ifExists)
166d0 7b 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65  {.  Index *pInde
166e0 78 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20  x;.  Vdbe *v;.  
166f0 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
16700 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20  arse->db;.  int 
16710 69 44 62 3b 0a 0a 20 20 69 66 28 20 70 50 61 72  iDb;..  if( pPar
16720 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 64 62 2d 3e  se->nErr || db->
16730 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
16740 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72      goto exit_dr
16750 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20  op_index;.  }.  
16760 61 73 73 65 72 74 28 20 70 4e 61 6d 65 2d 3e 6e  assert( pName->n
16770 53 72 63 3d 3d 31 20 29 3b 0a 20 20 69 66 28 20  Src==1 );.  if( 
16780 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74  SQLITE_OK!=sqlit
16790 65 33 52 65 61 64 53 63 68 65 6d 61 28 70 50 61  e3ReadSchema(pPa
167a0 72 73 65 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f  rse) ){.    goto
167b0 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78   exit_drop_index
167c0 3b 0a 20 20 7d 0a 20 20 70 49 6e 64 65 78 20 3d  ;.  }.  pIndex =
167d0 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 64 65   sqlite3FindInde
167e0 78 28 64 62 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30  x(db, pName->a[0
167f0 5d 2e 7a 4e 61 6d 65 2c 20 70 4e 61 6d 65 2d 3e  ].zName, pName->
16800 61 5b 30 5d 2e 7a 44 61 74 61 62 61 73 65 29 3b  a[0].zDatabase);
16810 0a 20 20 69 66 28 20 70 49 6e 64 65 78 3d 3d 30  .  if( pIndex==0
16820 20 29 7b 0a 20 20 20 20 69 66 28 20 21 69 66 45   ){.    if( !ifE
16830 78 69 73 74 73 20 29 7b 0a 20 20 20 20 20 20 73  xists ){.      s
16840 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
16850 50 61 72 73 65 2c 20 22 6e 6f 20 73 75 63 68 20  Parse, "no such 
16860 69 6e 64 65 78 3a 20 25 53 22 2c 20 70 4e 61 6d  index: %S", pNam
16870 65 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20  e, 0);.    }.   
16880 20 70 50 61 72 73 65 2d 3e 63 68 65 63 6b 53 63   pParse->checkSc
16890 68 65 6d 61 20 3d 20 31 3b 0a 20 20 20 20 67 6f  hema = 1;.    go
168a0 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64  to exit_drop_ind
168b0 65 78 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 49  ex;.  }.  if( pI
168c0 6e 64 65 78 2d 3e 61 75 74 6f 49 6e 64 65 78 20  ndex->autoIndex 
168d0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
168e0 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
168f0 69 6e 64 65 78 20 61 73 73 6f 63 69 61 74 65 64  index associated
16900 20 77 69 74 68 20 55 4e 49 51 55 45 20 22 0a 20   with UNIQUE ". 
16910 20 20 20 20 20 22 6f 72 20 50 52 49 4d 41 52 59       "or PRIMARY
16920 20 4b 45 59 20 63 6f 6e 73 74 72 61 69 6e 74 20   KEY constraint 
16930 63 61 6e 6e 6f 74 20 62 65 20 64 72 6f 70 70 65  cannot be droppe
16940 64 22 2c 20 30 29 3b 0a 20 20 20 20 67 6f 74 6f  d", 0);.    goto
16950 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78   exit_drop_index
16960 3b 0a 20 20 7d 0a 20 20 69 44 62 20 3d 20 73 71  ;.  }.  iDb = sq
16970 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64  lite3SchemaToInd
16980 65 78 28 64 62 2c 20 70 49 6e 64 65 78 2d 3e 70  ex(db, pIndex->p
16990 53 63 68 65 6d 61 29 3b 0a 23 69 66 6e 64 65 66  Schema);.#ifndef
169a0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
169b0 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 7b 0a 20  HORIZATION.  {. 
169c0 20 20 20 69 6e 74 20 63 6f 64 65 20 3d 20 53 51     int code = SQ
169d0 4c 49 54 45 5f 44 52 4f 50 5f 49 4e 44 45 58 3b  LITE_DROP_INDEX;
169e0 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62  .    Table *pTab
169f0 20 3d 20 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c   = pIndex->pTabl
16a00 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  e;.    const cha
16a10 72 20 2a 7a 44 62 20 3d 20 64 62 2d 3e 61 44 62  r *zDb = db->aDb
16a20 5b 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20  [iDb].zName;.   
16a30 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61   const char *zTa
16a40 62 20 3d 20 53 43 48 45 4d 41 5f 54 41 42 4c 45  b = SCHEMA_TABLE
16a50 28 69 44 62 29 3b 0a 20 20 20 20 69 66 28 20 73  (iDb);.    if( s
16a60 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28  qlite3AuthCheck(
16a70 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 44  pParse, SQLITE_D
16a80 45 4c 45 54 45 2c 20 7a 54 61 62 2c 20 30 2c 20  ELETE, zTab, 0, 
16a90 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f  zDb) ){.      go
16aa0 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64  to exit_drop_ind
16ab0 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ex;.    }.    if
16ac0 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26  ( !OMIT_TEMPDB &
16ad0 26 20 69 44 62 20 29 20 63 6f 64 65 20 3d 20 53  & iDb ) code = S
16ae0 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f  QLITE_DROP_TEMP_
16af0 49 4e 44 45 58 3b 0a 20 20 20 20 69 66 28 20 73  INDEX;.    if( s
16b00 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28  qlite3AuthCheck(
16b10 70 50 61 72 73 65 2c 20 63 6f 64 65 2c 20 70 49  pParse, code, pI
16b20 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 70 54 61  ndex->zName, pTa
16b30 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 44 62 29 20 29  b->zName, zDb) )
16b40 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69  {.      goto exi
16b50 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20  t_drop_index;.  
16b60 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a    }.  }.#endif..
16b70 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f    /* Generate co
16b80 64 65 20 74 6f 20 72 65 6d 6f 76 65 20 74 68 65  de to remove the
16b90 20 69 6e 64 65 78 20 61 6e 64 20 66 72 6f 6d 20   index and from 
16ba0 74 68 65 20 6d 61 73 74 65 72 20 74 61 62 6c 65  the master table
16bb0 20 2a 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74 65   */.  v = sqlite
16bc0 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
16bd0 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20  ;.  if( v ){.   
16be0 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69   sqlite3BeginWri
16bf0 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72  teOperation(pPar
16c00 73 65 2c 20 31 2c 20 69 44 62 29 3b 0a 20 20 20  se, 1, iDb);.   
16c10 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61   sqlite3NestedPa
16c20 72 73 65 28 70 50 61 72 73 65 2c 0a 20 20 20 20  rse(pParse,.    
16c30 20 20 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20     "DELETE FROM 
16c40 25 51 2e 25 73 20 57 48 45 52 45 20 6e 61 6d 65  %Q.%s WHERE name
16c50 3d 25 51 22 2c 0a 20 20 20 20 20 20 20 64 62 2d  =%Q",.       db-
16c60 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 2c  >aDb[iDb].zName,
16c70 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 44   SCHEMA_TABLE(iD
16c80 62 29 2c 0a 20 20 20 20 20 20 20 70 49 6e 64 65  b),.       pInde
16c90 78 2d 3e 7a 4e 61 6d 65 0a 20 20 20 20 29 3b 0a  x->zName.    );.
16ca0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 46      if( sqlite3F
16cb0 69 6e 64 54 61 62 6c 65 28 64 62 2c 20 22 73 71  indTable(db, "sq
16cc0 6c 69 74 65 5f 73 74 61 74 31 22 2c 20 64 62 2d  lite_stat1", db-
16cd0 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 29  >aDb[iDb].zName)
16ce0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
16cf0 33 4e 65 73 74 65 64 50 61 72 73 65 28 70 50 61  3NestedParse(pPa
16d00 72 73 65 2c 0a 20 20 20 20 20 20 20 20 22 44 45  rse,.        "DE
16d10 4c 45 54 45 20 46 52 4f 4d 20 25 51 2e 73 71 6c  LETE FROM %Q.sql
16d20 69 74 65 5f 73 74 61 74 31 20 57 48 45 52 45 20  ite_stat1 WHERE 
16d30 69 64 78 3d 25 51 22 2c 0a 20 20 20 20 20 20 20  idx=%Q",.       
16d40 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e   db->aDb[iDb].zN
16d50 61 6d 65 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61  ame, pIndex->zNa
16d60 6d 65 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20  me.      );.    
16d70 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 43 68 61  }.    sqlite3Cha
16d80 6e 67 65 43 6f 6f 6b 69 65 28 70 50 61 72 73 65  ngeCookie(pParse
16d90 2c 20 69 44 62 29 3b 0a 20 20 20 20 64 65 73 74  , iDb);.    dest
16da0 72 6f 79 52 6f 6f 74 50 61 67 65 28 70 50 61 72  royRootPage(pPar
16db0 73 65 2c 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d  se, pIndex->tnum
16dc0 2c 20 69 44 62 29 3b 0a 20 20 20 20 73 71 6c 69  , iDb);.    sqli
16dd0 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
16de0 20 4f 50 5f 44 72 6f 70 49 6e 64 65 78 2c 20 69   OP_DropIndex, i
16df0 44 62 2c 20 30 2c 20 30 2c 20 70 49 6e 64 65 78  Db, 0, 0, pIndex
16e00 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 7d  ->zName, 0);.  }
16e10 0a 0a 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65  ..exit_drop_inde
16e20 78 3a 0a 20 20 73 71 6c 69 74 65 33 53 72 63 4c  x:.  sqlite3SrcL
16e30 69 73 74 44 65 6c 65 74 65 28 70 4e 61 6d 65 29  istDelete(pName)
16e40 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 41 72 72 61  ;.}../*.** pArra
16e50 79 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  y is a pointer t
16e60 6f 20 61 6e 20 61 72 72 61 79 20 6f 66 20 6f 62  o an array of ob
16e70 6a 65 63 74 73 2e 20 20 45 61 63 68 20 6f 62 6a  jects.  Each obj
16e80 65 63 74 20 69 6e 20 74 68 65 0a 2a 2a 20 61 72  ect in the.** ar
16e90 72 61 79 20 69 73 20 73 7a 45 6e 74 72 79 20 62  ray is szEntry b
16ea0 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 20 20 54  ytes in size.  T
16eb0 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6c 6c 6f  his routine allo
16ec0 63 61 74 65 73 20 61 20 6e 65 77 0a 2a 2a 20 6f  cates a new.** o
16ed0 62 6a 65 63 74 20 6f 6e 20 74 68 65 20 65 6e 64  bject on the end
16ee0 20 6f 66 20 74 68 65 20 61 72 72 61 79 2e 0a 2a   of the array..*
16ef0 2a 0a 2a 2a 20 2a 70 6e 45 6e 74 72 79 20 69 73  *.** *pnEntry is
16f00 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65   the number of e
16f10 6e 74 72 69 65 73 20 61 6c 72 65 61 64 79 20 69  ntries already i
16f20 6e 20 75 73 65 2e 20 20 2a 70 6e 41 6c 6c 6f 63  n use.  *pnAlloc
16f30 20 69 73 0a 2a 2a 20 74 68 65 20 70 72 65 76 69   is.** the previ
16f40 6f 75 73 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20  ously allocated 
16f50 73 69 7a 65 20 6f 66 20 74 68 65 20 61 72 72 61  size of the arra
16f60 79 2e 20 20 69 6e 69 74 53 69 7a 65 20 69 73 20  y.  initSize is 
16f70 74 68 65 0a 2a 2a 20 73 75 67 67 65 73 74 65 64  the.** suggested
16f80 20 69 6e 69 74 69 61 6c 20 61 72 72 61 79 20 73   initial array s
16f90 69 7a 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e 0a  ize allocation..
16fa0 2a 2a 0a 2a 2a 20 54 68 65 20 69 6e 64 65 78 20  **.** The index 
16fb0 6f 66 20 74 68 65 20 6e 65 77 20 65 6e 74 72 79  of the new entry
16fc0 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 6e 20   is returned in 
16fd0 2a 70 49 64 78 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  *pIdx..**.** Thi
16fe0 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  s routine return
16ff0 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  s a pointer to t
17000 68 65 20 61 72 72 61 79 20 6f 66 20 6f 62 6a 65  he array of obje
17010 63 74 73 2e 20 20 54 68 69 73 0a 2a 2a 20 6d 69  cts.  This.** mi
17020 67 68 74 20 62 65 20 74 68 65 20 73 61 6d 65 20  ght be the same 
17030 61 73 20 74 68 65 20 70 41 72 72 61 79 20 70 61  as the pArray pa
17040 72 61 6d 65 74 65 72 20 6f 72 20 69 74 20 6d 69  rameter or it mi
17050 67 68 74 20 62 65 20 61 20 64 69 66 66 65 72 65  ght be a differe
17060 6e 74 0a 2a 2a 20 70 6f 69 6e 74 65 72 20 69 66  nt.** pointer if
17070 20 74 68 65 20 61 72 72 61 79 20 77 61 73 20 72   the array was r
17080 65 73 69 7a 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20  esized..*/.void 
17090 2a 73 71 6c 69 74 65 33 41 72 72 61 79 41 6c 6c  *sqlite3ArrayAll
170a0 6f 63 61 74 65 28 0a 20 20 73 71 6c 69 74 65 33  ocate(.  sqlite3
170b0 20 2a 64 62 2c 20 20 20 20 20 20 2f 2a 20 43 6f   *db,      /* Co
170c0 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 6e 6f 74 69  nnection to noti
170d0 66 79 20 6f 66 20 6d 61 6c 6c 6f 63 20 66 61 69  fy of malloc fai
170e0 6c 75 72 65 73 20 2a 2f 0a 20 20 76 6f 69 64 20  lures */.  void 
170f0 2a 70 41 72 72 61 79 2c 20 20 20 20 20 2f 2a 20  *pArray,     /* 
17100 41 72 72 61 79 20 6f 66 20 6f 62 6a 65 63 74 73  Array of objects
17110 2e 20 20 4d 69 67 68 74 20 62 65 20 72 65 61 6c  .  Might be real
17120 6c 6f 63 61 74 65 64 20 2a 2f 0a 20 20 69 6e 74  located */.  int
17130 20 73 7a 45 6e 74 72 79 2c 20 20 20 20 20 20 2f   szEntry,      /
17140 2a 20 53 69 7a 65 20 6f 66 20 65 61 63 68 20 6f  * Size of each o
17150 62 6a 65 63 74 20 69 6e 20 74 68 65 20 61 72 72  bject in the arr
17160 61 79 20 2a 2f 0a 20 20 69 6e 74 20 69 6e 69 74  ay */.  int init
17170 53 69 7a 65 2c 20 20 20 20 20 2f 2a 20 53 75 67  Size,     /* Sug
17180 67 65 73 74 65 64 20 69 6e 69 74 69 61 6c 20 61  gested initial a
17190 6c 6c 6f 63 61 74 69 6f 6e 2c 20 69 6e 20 65 6c  llocation, in el
171a0 65 6d 65 6e 74 73 20 2a 2f 0a 20 20 69 6e 74 20  ements */.  int 
171b0 2a 70 6e 45 6e 74 72 79 2c 20 20 20 20 20 2f 2a  *pnEntry,     /*
171c0 20 4e 75 6d 62 65 72 20 6f 66 20 6f 62 6a 65 63   Number of objec
171d0 74 73 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20  ts currently in 
171e0 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e  use */.  int *pn
171f0 41 6c 6c 6f 63 2c 20 20 20 20 20 2f 2a 20 43 75  Alloc,     /* Cu
17200 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 20 74 68  rrent size of th
17210 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 2c 20 69 6e  e allocation, in
17220 20 65 6c 65 6d 65 6e 74 73 20 2a 2f 0a 20 20 69   elements */.  i
17230 6e 74 20 2a 70 49 64 78 20 20 20 20 20 20 20 20  nt *pIdx        
17240 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 69 6e   /* Write the in
17250 64 65 78 20 6f 66 20 61 20 6e 65 77 20 73 6c 6f  dex of a new slo
17260 74 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 63  t here */.){.  c
17270 68 61 72 20 2a 7a 3b 0a 20 20 69 66 28 20 2a 70  har *z;.  if( *p
17280 6e 45 6e 74 72 79 20 3e 3d 20 2a 70 6e 41 6c 6c  nEntry >= *pnAll
17290 6f 63 20 29 7b 0a 20 20 20 20 76 6f 69 64 20 2a  oc ){.    void *
172a0 70 4e 65 77 3b 0a 20 20 20 20 69 6e 74 20 6e 65  pNew;.    int ne
172b0 77 53 69 7a 65 3b 0a 20 20 20 20 6e 65 77 53 69  wSize;.    newSi
172c0 7a 65 20 3d 20 28 2a 70 6e 41 6c 6c 6f 63 29 2a  ze = (*pnAlloc)*
172d0 32 20 2b 20 69 6e 69 74 53 69 7a 65 3b 0a 20 20  2 + initSize;.  
172e0 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33    pNew = sqlite3
172f0 44 62 52 65 61 6c 6c 6f 63 28 64 62 2c 20 70 41  DbRealloc(db, pA
17300 72 72 61 79 2c 20 6e 65 77 53 69 7a 65 2a 73 7a  rray, newSize*sz
17310 45 6e 74 72 79 29 3b 0a 20 20 20 20 69 66 28 20  Entry);.    if( 
17320 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20  pNew==0 ){.     
17330 20 2a 70 49 64 78 20 3d 20 2d 31 3b 0a 20 20 20   *pIdx = -1;.   
17340 20 20 20 72 65 74 75 72 6e 20 70 41 72 72 61 79     return pArray
17350 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2a 70 6e 41  ;.    }.    *pnA
17360 6c 6c 6f 63 20 3d 20 6e 65 77 53 69 7a 65 3b 0a  lloc = newSize;.
17370 20 20 20 20 70 41 72 72 61 79 20 3d 20 70 4e 65      pArray = pNe
17380 77 3b 0a 20 20 7d 0a 20 20 7a 20 3d 20 28 63 68  w;.  }.  z = (ch
17390 61 72 2a 29 70 41 72 72 61 79 3b 0a 20 20 6d 65  ar*)pArray;.  me
173a0 6d 73 65 74 28 26 7a 5b 2a 70 6e 45 6e 74 72 79  mset(&z[*pnEntry
173b0 20 2a 20 73 7a 45 6e 74 72 79 5d 2c 20 30 2c 20   * szEntry], 0, 
173c0 73 7a 45 6e 74 72 79 29 3b 0a 20 20 2a 70 49 64  szEntry);.  *pId
173d0 78 20 3d 20 2a 70 6e 45 6e 74 72 79 3b 0a 20 20  x = *pnEntry;.  
173e0 2b 2b 2a 70 6e 45 6e 74 72 79 3b 0a 20 20 72 65  ++*pnEntry;.  re
173f0 74 75 72 6e 20 70 41 72 72 61 79 3b 0a 7d 0a 0a  turn pArray;.}..
17400 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 61 20 6e  /*.** Append a n
17410 65 77 20 65 6c 65 6d 65 6e 74 20 74 6f 20 74 68  ew element to th
17420 65 20 67 69 76 65 6e 20 49 64 4c 69 73 74 2e 20  e given IdList. 
17430 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 49 64   Create a new Id
17440 4c 69 73 74 20 69 66 0a 2a 2a 20 6e 65 65 64 20  List if.** need 
17450 62 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 6e 65 77 20  be..**.** A new 
17460 49 64 4c 69 73 74 20 69 73 20 72 65 74 75 72 6e  IdList is return
17470 65 64 2c 20 6f 72 20 4e 55 4c 4c 20 69 66 20 6d  ed, or NULL if m
17480 61 6c 6c 6f 63 28 29 20 66 61 69 6c 73 2e 0a 2a  alloc() fails..*
17490 2f 0a 49 64 4c 69 73 74 20 2a 73 71 6c 69 74 65  /.IdList *sqlite
174a0 33 49 64 4c 69 73 74 41 70 70 65 6e 64 28 73 71  3IdListAppend(sq
174b0 6c 69 74 65 33 20 2a 64 62 2c 20 49 64 4c 69 73  lite3 *db, IdLis
174c0 74 20 2a 70 4c 69 73 74 2c 20 54 6f 6b 65 6e 20  t *pList, Token 
174d0 2a 70 54 6f 6b 65 6e 29 7b 0a 20 20 69 6e 74 20  *pToken){.  int 
174e0 69 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d  i;.  if( pList==
174f0 30 20 29 7b 0a 20 20 20 20 70 4c 69 73 74 20 3d  0 ){.    pList =
17500 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
17510 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28  Zero(db, sizeof(
17520 49 64 4c 69 73 74 29 20 29 3b 0a 20 20 20 20 69  IdList) );.    i
17530 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65  f( pList==0 ) re
17540 74 75 72 6e 20 30 3b 0a 20 20 20 20 70 4c 69 73  turn 0;.    pLis
17550 74 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 30 3b 0a 20  t->nAlloc = 0;. 
17560 20 7d 0a 20 20 70 4c 69 73 74 2d 3e 61 20 3d 20   }.  pList->a = 
17570 73 71 6c 69 74 65 33 41 72 72 61 79 41 6c 6c 6f  sqlite3ArrayAllo
17580 63 61 74 65 28 0a 20 20 20 20 20 20 64 62 2c 0a  cate(.      db,.
17590 20 20 20 20 20 20 70 4c 69 73 74 2d 3e 61 2c 0a        pList->a,.
175a0 20 20 20 20 20 20 73 69 7a 65 6f 66 28 70 4c 69        sizeof(pLi
175b0 73 74 2d 3e 61 5b 30 5d 29 2c 0a 20 20 20 20 20  st->a[0]),.     
175c0 20 35 2c 0a 20 20 20 20 20 20 26 70 4c 69 73 74   5,.      &pList
175d0 2d 3e 6e 49 64 2c 0a 20 20 20 20 20 20 26 70 4c  ->nId,.      &pL
175e0 69 73 74 2d 3e 6e 41 6c 6c 6f 63 2c 0a 20 20 20  ist->nAlloc,.   
175f0 20 20 20 26 69 0a 20 20 29 3b 0a 20 20 69 66 28     &i.  );.  if(
17600 20 69 3c 30 20 29 7b 0a 20 20 20 20 73 71 6c 69   i<0 ){.    sqli
17610 74 65 33 49 64 4c 69 73 74 44 65 6c 65 74 65 28  te3IdListDelete(
17620 70 4c 69 73 74 29 3b 0a 20 20 20 20 72 65 74 75  pList);.    retu
17630 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 4c 69 73  rn 0;.  }.  pLis
17640 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20 3d 20  t->a[i].zName = 
17650 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54  sqlite3NameFromT
17660 6f 6b 65 6e 28 64 62 2c 20 70 54 6f 6b 65 6e 29  oken(db, pToken)
17670 3b 0a 20 20 72 65 74 75 72 6e 20 70 4c 69 73 74  ;.  return pList
17680 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74  ;.}../*.** Delet
17690 65 20 61 6e 20 49 64 4c 69 73 74 2e 0a 2a 2f 0a  e an IdList..*/.
176a0 76 6f 69 64 20 73 71 6c 69 74 65 33 49 64 4c 69  void sqlite3IdLi
176b0 73 74 44 65 6c 65 74 65 28 49 64 4c 69 73 74 20  stDelete(IdList 
176c0 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 69  *pList){.  int i
176d0 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30  ;.  if( pList==0
176e0 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72   ) return;.  for
176f0 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e  (i=0; i<pList->n
17700 49 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71  Id; i++){.    sq
17710 6c 69 74 65 33 5f 66 72 65 65 28 70 4c 69 73 74  lite3_free(pList
17720 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20  ->a[i].zName);. 
17730 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65   }.  sqlite3_fre
17740 65 28 70 4c 69 73 74 2d 3e 61 29 3b 0a 20 20 73  e(pList->a);.  s
17750 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4c 69 73  qlite3_free(pLis
17760 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  t);.}../*.** Ret
17770 75 72 6e 20 74 68 65 20 69 6e 64 65 78 20 69 6e  urn the index in
17780 20 70 4c 69 73 74 20 6f 66 20 74 68 65 20 69 64   pList of the id
17790 65 6e 74 69 66 69 65 72 20 6e 61 6d 65 64 20 7a  entifier named z
177a0 49 64 2e 20 20 52 65 74 75 72 6e 20 2d 31 0a 2a  Id.  Return -1.*
177b0 2a 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a  * if not found..
177c0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 49 64  */.int sqlite3Id
177d0 4c 69 73 74 49 6e 64 65 78 28 49 64 4c 69 73 74  ListIndex(IdList
177e0 20 2a 70 4c 69 73 74 2c 20 63 6f 6e 73 74 20 63   *pList, const c
177f0 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69  har *zName){.  i
17800 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 4c 69 73  nt i;.  if( pLis
17810 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 2d 31  t==0 ) return -1
17820 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
17830 4c 69 73 74 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b  List->nId; i++){
17840 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
17850 53 74 72 49 43 6d 70 28 70 4c 69 73 74 2d 3e 61  StrICmp(pList->a
17860 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65  [i].zName, zName
17870 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 69 3b  )==0 ) return i;
17880 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 2d 31  .  }.  return -1
17890 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e  ;.}../*.** Appen
178a0 64 20 61 20 6e 65 77 20 74 61 62 6c 65 20 6e 61  d a new table na
178b0 6d 65 20 74 6f 20 74 68 65 20 67 69 76 65 6e 20  me to the given 
178c0 53 72 63 4c 69 73 74 2e 20 20 43 72 65 61 74 65  SrcList.  Create
178d0 20 61 20 6e 65 77 20 53 72 63 4c 69 73 74 20 69   a new SrcList i
178e0 66 0a 2a 2a 20 6e 65 65 64 20 62 65 2e 20 20 41  f.** need be.  A
178f0 20 6e 65 77 20 65 6e 74 72 79 20 69 73 20 63 72   new entry is cr
17900 65 61 74 65 64 20 69 6e 20 74 68 65 20 53 72 63  eated in the Src
17910 4c 69 73 74 20 65 76 65 6e 20 69 66 20 70 54 6f  List even if pTo
17920 6b 65 6e 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a  ken is NULL..**.
17930 2a 2a 20 41 20 6e 65 77 20 53 72 63 4c 69 73 74  ** A new SrcList
17940 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20 6f 72   is returned, or
17950 20 4e 55 4c 4c 20 69 66 20 6d 61 6c 6c 6f 63 28   NULL if malloc(
17960 29 20 66 61 69 6c 73 2e 0a 2a 2a 0a 2a 2a 20 49  ) fails..**.** I
17970 66 20 70 44 61 74 61 62 61 73 65 20 69 73 20 6e  f pDatabase is n
17980 6f 74 20 6e 75 6c 6c 2c 20 69 74 20 6d 65 61 6e  ot null, it mean
17990 73 20 74 68 61 74 20 74 68 65 20 74 61 62 6c 65  s that the table
179a0 20 68 61 73 20 61 6e 20 6f 70 74 69 6f 6e 61 6c   has an optional
179b0 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 6e 61 6d  .** database nam
179c0 65 20 70 72 65 66 69 78 2e 20 20 4c 69 6b 65 20  e prefix.  Like 
179d0 74 68 69 73 3a 20 20 22 64 61 74 61 62 61 73 65  this:  "database
179e0 2e 74 61 62 6c 65 22 2e 20 20 54 68 65 20 70 44  .table".  The pD
179f0 61 74 61 62 61 73 65 0a 2a 2a 20 70 6f 69 6e 74  atabase.** point
17a00 73 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 6e  s to the table n
17a10 61 6d 65 20 61 6e 64 20 74 68 65 20 70 54 61 62  ame and the pTab
17a20 6c 65 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65  le points to the
17a30 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 2e 0a   database name..
17a40 2a 2a 20 54 68 65 20 53 72 63 4c 69 73 74 2e 61  ** The SrcList.a
17a50 5b 5d 2e 7a 4e 61 6d 65 20 66 69 65 6c 64 20 69  [].zName field i
17a60 73 20 66 69 6c 6c 65 64 20 77 69 74 68 20 74 68  s filled with th
17a70 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 77 68 69  e table name whi
17a80 63 68 20 6d 69 67 68 74 0a 2a 2a 20 63 6f 6d 65  ch might.** come
17a90 20 66 72 6f 6d 20 70 54 61 62 6c 65 20 28 69 66   from pTable (if
17aa0 20 70 44 61 74 61 62 61 73 65 20 69 73 20 4e 55   pDatabase is NU
17ab0 4c 4c 29 20 6f 72 20 66 72 6f 6d 20 70 44 61 74  LL) or from pDat
17ac0 61 62 61 73 65 2e 20 20 0a 2a 2a 20 53 72 63 4c  abase.  .** SrcL
17ad0 69 73 74 2e 61 5b 5d 2e 7a 44 61 74 61 62 61 73  ist.a[].zDatabas
17ae0 65 20 69 73 20 66 69 6c 6c 65 64 20 77 69 74 68  e is filled with
17af0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6e 61   the database na
17b00 6d 65 20 66 72 6f 6d 20 70 54 61 62 6c 65 2c 0a  me from pTable,.
17b10 2a 2a 20 6f 72 20 77 69 74 68 20 4e 55 4c 4c 20  ** or with NULL 
17b20 69 66 20 6e 6f 20 64 61 74 61 62 61 73 65 20 69  if no database i
17b30 73 20 73 70 65 63 69 66 69 65 64 2e 0a 2a 2a 0a  s specified..**.
17b40 2a 2a 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64  ** In other word
17b50 73 2c 20 69 66 20 63 61 6c 6c 20 6c 69 6b 65 20  s, if call like 
17b60 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  this:.**.**     
17b70 20 20 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69      sqlite3SrcLi
17b80 73 74 41 70 70 65 6e 64 28 44 2c 41 2c 42 2c 30  stAppend(D,A,B,0
17b90 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 42 20  );.**.** Then B 
17ba0 69 73 20 61 20 74 61 62 6c 65 20 6e 61 6d 65 20  is a table name 
17bb0 61 6e 64 20 74 68 65 20 64 61 74 61 62 61 73 65  and the database
17bc0 20 6e 61 6d 65 20 69 73 20 75 6e 73 70 65 63 69   name is unspeci
17bd0 66 69 65 64 2e 20 20 49 66 20 63 61 6c 6c 65 64  fied.  If called
17be0 0a 2a 2a 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a  .** like this:.*
17bf0 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 73 71 6c  *.**         sql
17c00 69 74 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e  ite3SrcListAppen
17c10 64 28 44 2c 41 2c 42 2c 43 29 3b 0a 2a 2a 0a 2a  d(D,A,B,C);.**.*
17c20 2a 20 54 68 65 6e 20 43 20 69 73 20 74 68 65 20  * Then C is the 
17c30 74 61 62 6c 65 20 6e 61 6d 65 20 61 6e 64 20 42  table name and B
17c40 20 69 73 20 74 68 65 20 64 61 74 61 62 61 73 65   is the database
17c50 20 6e 61 6d 65 2e 0a 2a 2f 0a 53 72 63 4c 69 73   name..*/.SrcLis
17c60 74 20 2a 73 71 6c 69 74 65 33 53 72 63 4c 69 73  t *sqlite3SrcLis
17c70 74 41 70 70 65 6e 64 28 0a 20 20 73 71 6c 69 74  tAppend(.  sqlit
17c80 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 2f  e3 *db,        /
17c90 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20  * Connection to 
17ca0 6e 6f 74 69 66 79 20 6f 66 20 6d 61 6c 6c 6f 63  notify of malloc
17cb0 20 66 61 69 6c 75 72 65 73 20 2a 2f 0a 20 20 53   failures */.  S
17cc0 72 63 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20  rcList *pList,  
17cd0 20 20 20 2f 2a 20 41 70 70 65 6e 64 20 74 6f 20     /* Append to 
17ce0 74 68 69 73 20 53 72 63 4c 69 73 74 2e 20 4e 55  this SrcList. NU
17cf0 4c 4c 20 63 72 65 61 74 65 73 20 61 20 6e 65 77  LL creates a new
17d00 20 53 72 63 4c 69 73 74 20 2a 2f 0a 20 20 54 6f   SrcList */.  To
17d10 6b 65 6e 20 2a 70 54 61 62 6c 65 2c 20 20 20 20  ken *pTable,    
17d20 20 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20 61 70    /* Table to ap
17d30 70 65 6e 64 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  pend */.  Token 
17d40 2a 70 44 61 74 61 62 61 73 65 20 20 20 20 2f 2a  *pDatabase    /*
17d50 20 44 61 74 61 62 61 73 65 20 6f 66 20 74 68 65   Database of the
17d60 20 74 61 62 6c 65 20 2a 2f 0a 29 7b 0a 20 20 73   table */.){.  s
17d70 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
17d80 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69 66 28  em *pItem;.  if(
17d90 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20   pList==0 ){.   
17da0 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33   pList = sqlite3
17db0 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c  DbMallocZero(db,
17dc0 20 73 69 7a 65 6f 66 28 53 72 63 4c 69 73 74 29   sizeof(SrcList)
17dd0 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73   );.    if( pLis
17de0 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  t==0 ) return 0;
17df0 0a 20 20 20 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c  .    pList->nAll
17e00 6f 63 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 69 66  oc = 1;.  }.  if
17e10 28 20 70 4c 69 73 74 2d 3e 6e 53 72 63 3e 3d 70  ( pList->nSrc>=p
17e20 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20 29 7b 0a  List->nAlloc ){.
17e30 20 20 20 20 53 72 63 4c 69 73 74 20 2a 70 4e 65      SrcList *pNe
17e40 77 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 6e 41  w;.    pList->nA
17e50 6c 6c 6f 63 20 2a 3d 20 32 3b 0a 20 20 20 20 70  lloc *= 2;.    p
17e60 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62 52  New = sqlite3DbR
17e70 65 61 6c 6c 6f 63 28 64 62 2c 20 70 4c 69 73 74  ealloc(db, pList
17e80 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
17e90 20 73 69 7a 65 6f 66 28 2a 70 4c 69 73 74 29 20   sizeof(*pList) 
17ea0 2b 20 28 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63  + (pList->nAlloc
17eb0 2d 31 29 2a 73 69 7a 65 6f 66 28 70 4c 69 73 74  -1)*sizeof(pList
17ec0 2d 3e 61 5b 30 5d 29 20 29 3b 0a 20 20 20 20 69  ->a[0]) );.    i
17ed0 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20  f( pNew==0 ){.  
17ee0 20 20 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69      sqlite3SrcLi
17ef0 73 74 44 65 6c 65 74 65 28 70 4c 69 73 74 29 3b  stDelete(pList);
17f00 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  .      return 0;
17f10 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c 69 73 74  .    }.    pList
17f20 20 3d 20 70 4e 65 77 3b 0a 20 20 7d 0a 20 20 70   = pNew;.  }.  p
17f30 49 74 65 6d 20 3d 20 26 70 4c 69 73 74 2d 3e 61  Item = &pList->a
17f40 5b 70 4c 69 73 74 2d 3e 6e 53 72 63 5d 3b 0a 20  [pList->nSrc];. 
17f50 20 6d 65 6d 73 65 74 28 70 49 74 65 6d 2c 20 30   memset(pItem, 0
17f60 2c 20 73 69 7a 65 6f 66 28 70 4c 69 73 74 2d 3e  , sizeof(pList->
17f70 61 5b 30 5d 29 29 3b 0a 20 20 69 66 28 20 70 44  a[0]));.  if( pD
17f80 61 74 61 62 61 73 65 20 26 26 20 70 44 61 74 61  atabase && pData
17f90 62 61 73 65 2d 3e 7a 3d 3d 30 20 29 7b 0a 20 20  base->z==0 ){.  
17fa0 20 20 70 44 61 74 61 62 61 73 65 20 3d 20 30 3b    pDatabase = 0;
17fb0 0a 20 20 7d 0a 20 20 69 66 28 20 70 44 61 74 61  .  }.  if( pData
17fc0 62 61 73 65 20 26 26 20 70 54 61 62 6c 65 20 29  base && pTable )
17fd0 7b 0a 20 20 20 20 54 6f 6b 65 6e 20 2a 70 54 65  {.    Token *pTe
17fe0 6d 70 20 3d 20 70 44 61 74 61 62 61 73 65 3b 0a  mp = pDatabase;.
17ff0 20 20 20 20 70 44 61 74 61 62 61 73 65 20 3d 20      pDatabase = 
18000 70 54 61 62 6c 65 3b 0a 20 20 20 20 70 54 61 62  pTable;.    pTab
18010 6c 65 20 3d 20 70 54 65 6d 70 3b 0a 20 20 7d 0a  le = pTemp;.  }.
18020 20 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d    pItem->zName =
18030 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d   sqlite3NameFrom
18040 54 6f 6b 65 6e 28 64 62 2c 20 70 54 61 62 6c 65  Token(db, pTable
18050 29 3b 0a 20 20 70 49 74 65 6d 2d 3e 7a 44 61 74  );.  pItem->zDat
18060 61 62 61 73 65 20 3d 20 73 71 6c 69 74 65 33 4e  abase = sqlite3N
18070 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c  ameFromToken(db,
18080 20 70 44 61 74 61 62 61 73 65 29 3b 0a 20 20 70   pDatabase);.  p
18090 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 20 3d 20  Item->iCursor = 
180a0 2d 31 3b 0a 20 20 70 49 74 65 6d 2d 3e 69 73 50  -1;.  pItem->isP
180b0 6f 70 75 6c 61 74 65 64 20 3d 20 30 3b 0a 20 20  opulated = 0;.  
180c0 70 4c 69 73 74 2d 3e 6e 53 72 63 2b 2b 3b 0a 20  pList->nSrc++;. 
180d0 20 72 65 74 75 72 6e 20 70 4c 69 73 74 3b 0a 7d   return pList;.}
180e0 0a 0a 2f 2a 0a 2a 2a 20 41 73 73 69 67 6e 20 63  ../*.** Assign c
180f0 75 72 73 6f 72 73 20 74 6f 20 61 6c 6c 20 74 61  ursors to all ta
18100 62 6c 65 73 20 69 6e 20 61 20 53 72 63 4c 69 73  bles in a SrcLis
18110 74 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  t.*/.void sqlite
18120 33 53 72 63 4c 69 73 74 41 73 73 69 67 6e 43 75  3SrcListAssignCu
18130 72 73 6f 72 73 28 50 61 72 73 65 20 2a 70 50 61  rsors(Parse *pPa
18140 72 73 65 2c 20 53 72 63 4c 69 73 74 20 2a 70 4c  rse, SrcList *pL
18150 69 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  ist){.  int i;. 
18160 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
18170 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 61  item *pItem;.  a
18180 73 73 65 72 74 28 70 4c 69 73 74 20 7c 7c 20 70  ssert(pList || p
18190 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  Parse->db->mallo
181a0 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 69 66 28  cFailed );.  if(
181b0 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 66 6f   pList ){.    fo
181c0 72 28 69 3d 30 2c 20 70 49 74 65 6d 3d 70 4c 69  r(i=0, pItem=pLi
181d0 73 74 2d 3e 61 3b 20 69 3c 70 4c 69 73 74 2d 3e  st->a; i<pList->
181e0 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 49 74 65 6d  nSrc; i++, pItem
181f0 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  ++){.      if( p
18200 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3e 3d 30  Item->iCursor>=0
18210 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
18220 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 20 3d  pItem->iCursor =
18230 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b   pParse->nTab++;
18240 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65 6d  .      if( pItem
18250 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20  ->pSelect ){.   
18260 20 20 20 20 20 73 71 6c 69 74 65 33 53 72 63 4c       sqlite3SrcL
18270 69 73 74 41 73 73 69 67 6e 43 75 72 73 6f 72 73  istAssignCursors
18280 28 70 50 61 72 73 65 2c 20 70 49 74 65 6d 2d 3e  (pParse, pItem->
18290 70 53 65 6c 65 63 74 2d 3e 70 53 72 63 29 3b 0a  pSelect->pSrc);.
182a0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
182b0 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74  }.}../*.** Delet
182c0 65 20 61 6e 20 65 6e 74 69 72 65 20 53 72 63 4c  e an entire SrcL
182d0 69 73 74 20 69 6e 63 6c 75 64 69 6e 67 20 61 6c  ist including al
182e0 6c 20 69 74 73 20 73 75 62 73 74 72 75 63 74 75  l its substructu
182f0 72 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  re..*/.void sqli
18300 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65  te3SrcListDelete
18310 28 53 72 63 4c 69 73 74 20 2a 70 4c 69 73 74 29  (SrcList *pList)
18320 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72  {.  int i;.  str
18330 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
18340 20 2a 70 49 74 65 6d 3b 0a 20 20 69 66 28 20 70   *pItem;.  if( p
18350 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e  List==0 ) return
18360 3b 0a 20 20 66 6f 72 28 70 49 74 65 6d 3d 70 4c  ;.  for(pItem=pL
18370 69 73 74 2d 3e 61 2c 20 69 3d 30 3b 20 69 3c 70  ist->a, i=0; i<p
18380 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c  List->nSrc; i++,
18390 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 73   pItem++){.    s
183a0 71 6c 69 74 65 33 5f 66 72 65 65 28 70 49 74 65  qlite3_free(pIte
183b0 6d 2d 3e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20  m->zDatabase);. 
183c0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
183d0 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  pItem->zName);. 
183e0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
183f0 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a  pItem->zAlias);.
18400 20 20 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74      sqlite3Delet
18410 65 54 61 62 6c 65 28 70 49 74 65 6d 2d 3e 70 54  eTable(pItem->pT
18420 61 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ab);.    sqlite3
18430 53 65 6c 65 63 74 44 65 6c 65 74 65 28 70 49 74  SelectDelete(pIt
18440 65 6d 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20  em->pSelect);.  
18450 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
18460 65 74 65 28 70 49 74 65 6d 2d 3e 70 4f 6e 29 3b  ete(pItem->pOn);
18470 0a 20 20 20 20 73 71 6c 69 74 65 33 49 64 4c 69  .    sqlite3IdLi
18480 73 74 44 65 6c 65 74 65 28 70 49 74 65 6d 2d 3e  stDelete(pItem->
18490 70 55 73 69 6e 67 29 3b 0a 20 20 7d 0a 20 20 73  pUsing);.  }.  s
184a0 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4c 69 73  qlite3_free(pLis
184b0 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  t);.}../*.** Thi
184c0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
184d0 6c 65 64 20 62 79 20 74 68 65 20 70 61 72 73 65  led by the parse
184e0 72 20 74 6f 20 61 64 64 20 61 20 6e 65 77 20 74  r to add a new t
184f0 65 72 6d 20 74 6f 20 74 68 65 0a 2a 2a 20 65 6e  erm to the.** en
18500 64 20 6f 66 20 61 20 67 72 6f 77 69 6e 67 20 46  d of a growing F
18510 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20 54 68 65  ROM clause.  The
18520 20 22 70 22 20 70 61 72 61 6d 65 74 65 72 20 69   "p" parameter i
18530 73 20 74 68 65 20 70 61 72 74 20 6f 66 0a 2a 2a  s the part of.**
18540 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
18550 20 74 68 61 74 20 68 61 73 20 61 6c 72 65 61 64   that has alread
18560 79 20 62 65 65 6e 20 63 6f 6e 73 74 72 75 63 74  y been construct
18570 65 64 2e 20 20 22 70 22 20 69 73 20 4e 55 4c 4c  ed.  "p" is NULL
18580 0a 2a 2a 20 69 66 20 74 68 69 73 20 69 73 20 74  .** if this is t
18590 68 65 20 66 69 72 73 74 20 74 65 72 6d 20 6f 66  he first term of
185a0 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
185b0 2e 20 20 70 54 61 62 6c 65 20 61 6e 64 20 70 44  .  pTable and pD
185c0 61 74 61 62 61 73 65 0a 2a 2a 20 61 72 65 20 74  atabase.** are t
185d0 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74  he name of the t
185e0 61 62 6c 65 20 61 6e 64 20 64 61 74 61 62 61 73  able and databas
185f0 65 20 6e 61 6d 65 64 20 69 6e 20 74 68 65 20 46  e named in the F
18600 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 2e  ROM clause term.
18610 0a 2a 2a 20 70 44 61 74 61 62 61 73 65 20 69 73  .** pDatabase is
18620 20 4e 55 4c 4c 20 69 66 20 74 68 65 20 64 61 74   NULL if the dat
18630 61 62 61 73 65 20 6e 61 6d 65 20 71 75 61 6c 69  abase name quali
18640 66 69 65 72 20 69 73 20 6d 69 73 73 69 6e 67 20  fier is missing 
18650 2d 20 74 68 65 0a 2a 2a 20 75 73 75 61 6c 20 63  - the.** usual c
18660 61 73 65 2e 20 20 49 66 20 74 68 65 20 74 65 72  ase.  If the ter
18670 6d 20 68 61 73 20 61 20 61 6c 69 61 73 2c 20 74  m has a alias, t
18680 68 65 6e 20 70 41 6c 69 61 73 20 70 6f 69 6e 74  hen pAlias point
18690 73 20 74 6f 20 74 68 65 0a 2a 2a 20 61 6c 69 61  s to the.** alia
186a0 73 20 74 6f 6b 65 6e 2e 20 20 49 66 20 74 68 65  s token.  If the
186b0 20 74 65 72 6d 20 69 73 20 61 20 73 75 62 71 75   term is a subqu
186c0 65 72 79 2c 20 74 68 65 6e 20 70 53 75 62 71 75  ery, then pSubqu
186d0 65 72 79 20 69 73 20 74 68 65 0a 2a 2a 20 53 45  ery is the.** SE
186e0 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 74  LECT statement t
186f0 68 61 74 20 74 68 65 20 73 75 62 71 75 65 72 79  hat the subquery
18700 20 65 6e 63 6f 64 65 73 2e 20 20 54 68 65 20 70   encodes.  The p
18710 54 61 62 6c 65 20 61 6e 64 0a 2a 2a 20 70 44 61  Table and.** pDa
18720 74 61 62 61 73 65 20 70 61 72 61 6d 65 74 65 72  tabase parameter
18730 73 20 61 72 65 20 4e 55 4c 4c 20 66 6f 72 20 73  s are NULL for s
18740 75 62 71 75 65 72 69 65 73 2e 20 20 54 68 65 20  ubqueries.  The 
18750 70 4f 6e 20 61 6e 64 20 70 55 73 69 6e 67 0a 2a  pOn and pUsing.*
18760 2a 20 70 61 72 61 6d 65 74 65 72 73 20 61 72 65  * parameters are
18770 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20   the content of 
18780 74 68 65 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47  the ON and USING
18790 20 63 6c 61 75 73 65 73 2e 0a 2a 2a 0a 2a 2a 20   clauses..**.** 
187a0 52 65 74 75 72 6e 20 61 20 6e 65 77 20 53 72 63  Return a new Src
187b0 4c 69 73 74 20 77 68 69 63 68 20 65 6e 63 6f 64  List which encod
187c0 65 73 20 69 73 20 74 68 65 20 46 52 4f 4d 20 77  es is the FROM w
187d0 69 74 68 20 74 68 65 20 6e 65 77 0a 2a 2a 20 74  ith the new.** t
187e0 65 72 6d 20 61 64 64 65 64 2e 0a 2a 2f 0a 53 72  erm added..*/.Sr
187f0 63 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 53 72  cList *sqlite3Sr
18800 63 4c 69 73 74 41 70 70 65 6e 64 46 72 6f 6d 54  cListAppendFromT
18810 65 72 6d 28 0a 20 20 50 61 72 73 65 20 2a 70 50  erm(.  Parse *pP
18820 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f  arse,          /
18830 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
18840 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a  t */.  SrcList *
18850 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  p,             /
18860 2a 20 54 68 65 20 6c 65 66 74 20 70 61 72 74 20  * The left part 
18870 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  of the FROM clau
18880 73 65 20 61 6c 72 65 61 64 79 20 73 65 65 6e 20  se already seen 
18890 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 54 61 62  */.  Token *pTab
188a0 6c 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  le,          /* 
188b0 4e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c  Name of the tabl
188c0 65 20 74 6f 20 61 64 64 20 74 6f 20 74 68 65 20  e to add to the 
188d0 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20  FROM clause */. 
188e0 20 54 6f 6b 65 6e 20 2a 70 44 61 74 61 62 61 73   Token *pDatabas
188f0 65 2c 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65  e,       /* Name
18900 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
18910 20 63 6f 6e 74 61 69 6e 69 6e 67 20 70 54 61 62   containing pTab
18920 6c 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  le */.  Token *p
18930 41 6c 69 61 73 2c 20 20 20 20 20 20 20 20 20 20  Alias,          
18940 2f 2a 20 54 68 65 20 72 69 67 68 74 2d 68 61 6e  /* The right-han
18950 64 20 73 69 64 65 20 6f 66 20 74 68 65 20 41 53  d side of the AS
18960 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 20 2a   subexpression *
18970 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 75 62  /.  Select *pSub
18980 71 75 65 72 79 2c 20 20 20 20 20 20 2f 2a 20 41  query,      /* A
18990 20 73 75 62 71 75 65 72 79 20 75 73 65 64 20 69   subquery used i
189a0 6e 20 70 6c 61 63 65 20 6f 66 20 61 20 74 61 62  n place of a tab
189b0 6c 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 45 78 70  le name */.  Exp
189c0 72 20 2a 70 4f 6e 2c 20 20 20 20 20 20 20 20 20  r *pOn,         
189d0 20 20 20 20 20 2f 2a 20 54 68 65 20 4f 4e 20 63       /* The ON c
189e0 6c 61 75 73 65 20 6f 66 20 61 20 6a 6f 69 6e 20  lause of a join 
189f0 2a 2f 0a 20 20 49 64 4c 69 73 74 20 2a 70 55 73  */.  IdList *pUs
18a00 69 6e 67 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ing          /* 
18a10 54 68 65 20 55 53 49 4e 47 20 63 6c 61 75 73 65  The USING clause
18a20 20 6f 66 20 61 20 6a 6f 69 6e 20 2a 2f 0a 29 7b   of a join */.){
18a30 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73  .  struct SrcLis
18a40 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20  t_item *pItem;. 
18a50 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
18a60 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 70 20 3d  Parse->db;.  p =
18a70 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41   sqlite3SrcListA
18a80 70 70 65 6e 64 28 64 62 2c 20 70 2c 20 70 54 61  ppend(db, p, pTa
18a90 62 6c 65 2c 20 70 44 61 74 61 62 61 73 65 29 3b  ble, pDatabase);
18aa0 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20 70  .  if( p==0 || p
18ab0 2d 3e 6e 53 72 63 3d 3d 30 20 29 7b 0a 20 20 20  ->nSrc==0 ){.   
18ac0 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
18ad0 74 65 28 70 4f 6e 29 3b 0a 20 20 20 20 73 71 6c  te(pOn);.    sql
18ae0 69 74 65 33 49 64 4c 69 73 74 44 65 6c 65 74 65  ite3IdListDelete
18af0 28 70 55 73 69 6e 67 29 3b 0a 20 20 20 20 73 71  (pUsing);.    sq
18b00 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74  lite3SelectDelet
18b10 65 28 70 53 75 62 71 75 65 72 79 29 3b 0a 20 20  e(pSubquery);.  
18b20 20 20 72 65 74 75 72 6e 20 70 3b 0a 20 20 7d 0a    return p;.  }.
18b30 20 20 70 49 74 65 6d 20 3d 20 26 70 2d 3e 61 5b    pItem = &p->a[
18b40 70 2d 3e 6e 53 72 63 2d 31 5d 3b 0a 20 20 69 66  p->nSrc-1];.  if
18b50 28 20 70 41 6c 69 61 73 20 26 26 20 70 41 6c 69  ( pAlias && pAli
18b60 61 73 2d 3e 6e 20 29 7b 0a 20 20 20 20 70 49 74  as->n ){.    pIt
18b70 65 6d 2d 3e 7a 41 6c 69 61 73 20 3d 20 73 71 6c  em->zAlias = sql
18b80 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65  ite3NameFromToke
18b90 6e 28 64 62 2c 20 70 41 6c 69 61 73 29 3b 0a 20  n(db, pAlias);. 
18ba0 20 7d 0a 20 20 70 49 74 65 6d 2d 3e 70 53 65 6c   }.  pItem->pSel
18bb0 65 63 74 20 3d 20 70 53 75 62 71 75 65 72 79 3b  ect = pSubquery;
18bc0 0a 20 20 70 49 74 65 6d 2d 3e 70 4f 6e 20 3d 20  .  pItem->pOn = 
18bd0 70 4f 6e 3b 0a 20 20 70 49 74 65 6d 2d 3e 70 55  pOn;.  pItem->pU
18be0 73 69 6e 67 20 3d 20 70 55 73 69 6e 67 3b 0a 20  sing = pUsing;. 
18bf0 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a   return p;.}../*
18c00 0a 2a 2a 20 57 68 65 6e 20 62 75 69 6c 64 69 6e  .** When buildin
18c10 67 20 75 70 20 61 20 46 52 4f 4d 20 63 6c 61 75  g up a FROM clau
18c20 73 65 20 69 6e 20 74 68 65 20 70 61 72 73 65 72  se in the parser
18c30 2c 20 74 68 65 20 6a 6f 69 6e 20 6f 70 65 72 61  , the join opera
18c40 74 6f 72 0a 2a 2a 20 69 73 20 69 6e 69 74 69 61  tor.** is initia
18c50 6c 6c 79 20 61 74 74 61 63 68 65 64 20 74 6f 20  lly attached to 
18c60 74 68 65 20 6c 65 66 74 20 6f 70 65 72 61 6e 64  the left operand
18c70 2e 20 20 42 75 74 20 74 68 65 20 63 6f 64 65 20  .  But the code 
18c80 67 65 6e 65 72 61 74 6f 72 0a 2a 2a 20 65 78 70  generator.** exp
18c90 65 63 74 73 20 74 68 65 20 6a 6f 69 6e 20 6f 70  ects the join op
18ca0 65 72 61 74 6f 72 20 74 6f 20 62 65 20 6f 6e 20  erator to be on 
18cb0 74 68 65 20 72 69 67 68 74 20 6f 70 65 72 61 6e  the right operan
18cc0 64 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  d.  This routine
18cd0 0a 2a 2a 20 53 68 69 66 74 73 20 61 6c 6c 20 6a  .** Shifts all j
18ce0 6f 69 6e 20 6f 70 65 72 61 74 6f 72 73 20 66 72  oin operators fr
18cf0 6f 6d 20 6c 65 66 74 20 74 6f 20 72 69 67 68 74  om left to right
18d00 20 66 6f 72 20 61 6e 20 65 6e 74 69 72 65 20 46   for an entire F
18d10 52 4f 4d 0a 2a 2a 20 63 6c 61 75 73 65 2e 0a 2a  ROM.** clause..*
18d20 2a 0a 2a 2a 20 45 78 61 6d 70 6c 65 3a 20 53 75  *.** Example: Su
18d30 70 70 6f 73 65 20 74 68 65 20 6a 6f 69 6e 20 69  ppose the join i
18d40 73 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a  s like this:.**.
18d50 2a 2a 20 20 20 20 20 20 20 20 20 20 20 41 20 6e  **           A n
18d60 61 74 75 72 61 6c 20 63 72 6f 73 73 20 6a 6f 69  atural cross joi
18d70 6e 20 42 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 70  n B.**.** The op
18d80 65 72 61 74 6f 72 20 69 73 20 22 6e 61 74 75 72  erator is "natur
18d90 61 6c 20 63 72 6f 73 73 20 6a 6f 69 6e 22 2e 20  al cross join". 
18da0 20 54 68 65 20 41 20 61 6e 64 20 42 20 6f 70 65   The A and B ope
18db0 72 61 6e 64 73 20 61 72 65 20 73 74 6f 72 65 64  rands are stored
18dc0 0a 2a 2a 20 69 6e 20 70 2d 3e 61 5b 30 5d 20 61  .** in p->a[0] a
18dd0 6e 64 20 70 2d 3e 61 5b 31 5d 2c 20 72 65 73 70  nd p->a[1], resp
18de0 65 63 74 69 76 65 6c 79 2e 20 20 54 68 65 20 70  ectively.  The p
18df0 61 72 73 65 72 20 69 6e 69 74 69 61 6c 6c 79 20  arser initially 
18e00 73 74 6f 72 65 73 20 74 68 65 0a 2a 2a 20 6f 70  stores the.** op
18e10 65 72 61 74 6f 72 20 77 69 74 68 20 41 2e 20 20  erator with A.  
18e20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 68 69  This routine shi
18e30 66 74 73 20 74 68 61 74 20 6f 70 65 72 61 74 6f  fts that operato
18e40 72 20 6f 76 65 72 20 74 6f 20 42 2e 0a 2a 2f 0a  r over to B..*/.
18e50 76 6f 69 64 20 73 71 6c 69 74 65 33 53 72 63 4c  void sqlite3SrcL
18e60 69 73 74 53 68 69 66 74 4a 6f 69 6e 54 79 70 65  istShiftJoinType
18e70 28 53 72 63 4c 69 73 74 20 2a 70 29 7b 0a 20 20  (SrcList *p){.  
18e80 69 66 28 20 70 20 26 26 20 70 2d 3e 61 20 29 7b  if( p && p->a ){
18e90 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
18ea0 66 6f 72 28 69 3d 70 2d 3e 6e 53 72 63 2d 31 3b  for(i=p->nSrc-1;
18eb0 20 69 3e 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20   i>0; i--){.    
18ec0 20 20 70 2d 3e 61 5b 69 5d 2e 6a 6f 69 6e 74 79    p->a[i].jointy
18ed0 70 65 20 3d 20 70 2d 3e 61 5b 69 2d 31 5d 2e 6a  pe = p->a[i-1].j
18ee0 6f 69 6e 74 79 70 65 3b 0a 20 20 20 20 7d 0a 20  ointype;.    }. 
18ef0 20 20 20 70 2d 3e 61 5b 30 5d 2e 6a 6f 69 6e 74     p->a[0].joint
18f00 79 70 65 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a  ype = 0;.  }.}..
18f10 2f 2a 0a 2a 2a 20 42 65 67 69 6e 20 61 20 74 72  /*.** Begin a tr
18f20 61 6e 73 61 63 74 69 6f 6e 0a 2a 2f 0a 76 6f 69  ansaction.*/.voi
18f30 64 20 73 71 6c 69 74 65 33 42 65 67 69 6e 54 72  d sqlite3BeginTr
18f40 61 6e 73 61 63 74 69 6f 6e 28 50 61 72 73 65 20  ansaction(Parse 
18f50 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 74 79 70  *pParse, int typ
18f60 65 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  e){.  sqlite3 *d
18f70 62 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20  b;.  Vdbe *v;.  
18f80 69 6e 74 20 69 3b 0a 0a 20 20 69 66 28 20 70 50  int i;..  if( pP
18f90 61 72 73 65 3d 3d 30 20 7c 7c 20 28 64 62 3d 70  arse==0 || (db=p
18fa0 50 61 72 73 65 2d 3e 64 62 29 3d 3d 30 20 7c 7c  Parse->db)==0 ||
18fb0 20 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 3d   db->aDb[0].pBt=
18fc0 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69  =0 ) return;.  i
18fd0 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20  f( pParse->nErr 
18fe0 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  || db->mallocFai
18ff0 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  led ) return;.  
19000 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43  if( sqlite3AuthC
19010 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c  heck(pParse, SQL
19020 49 54 45 5f 54 52 41 4e 53 41 43 54 49 4f 4e 2c  ITE_TRANSACTION,
19030 20 22 42 45 47 49 4e 22 2c 20 30 2c 20 30 29 20   "BEGIN", 0, 0) 
19040 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 76 20 3d  ) return;..  v =
19050 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
19060 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 21  pParse);.  if( !
19070 76 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66  v ) return;.  if
19080 28 20 74 79 70 65 21 3d 54 4b 5f 44 45 46 45 52  ( type!=TK_DEFER
19090 52 45 44 20 29 7b 0a 20 20 20 20 66 6f 72 28 69  RED ){.    for(i
190a0 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69  =0; i<db->nDb; i
190b0 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ++){.      sqlit
190c0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
190d0 4f 50 5f 54 72 61 6e 73 61 63 74 69 6f 6e 2c 20  OP_Transaction, 
190e0 69 2c 20 28 74 79 70 65 3d 3d 54 4b 5f 45 58 43  i, (type==TK_EXC
190f0 4c 55 53 49 56 45 29 2b 31 29 3b 0a 20 20 20 20  LUSIVE)+1);.    
19100 20 20 73 71 6c 69 74 65 33 56 64 62 65 55 73 65    sqlite3VdbeUse
19110 73 42 74 72 65 65 28 76 2c 20 69 29 3b 0a 20 20  sBtree(v, i);.  
19120 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65    }.  }.  sqlite
19130 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
19140 50 5f 41 75 74 6f 43 6f 6d 6d 69 74 2c 20 30 2c  P_AutoCommit, 0,
19150 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f   0);.}../*.** Co
19160 6d 6d 69 74 20 61 20 74 72 61 6e 73 61 63 74 69  mmit a transacti
19170 6f 6e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  on.*/.void sqlit
19180 65 33 43 6f 6d 6d 69 74 54 72 61 6e 73 61 63 74  e3CommitTransact
19190 69 6f 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73  ion(Parse *pPars
191a0 65 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  e){.  sqlite3 *d
191b0 62 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 0a 20  b;.  Vdbe *v;.. 
191c0 20 69 66 28 20 70 50 61 72 73 65 3d 3d 30 20 7c   if( pParse==0 |
191d0 7c 20 28 64 62 3d 70 50 61 72 73 65 2d 3e 64 62  | (db=pParse->db
191e0 29 3d 3d 30 20 7c 7c 20 64 62 2d 3e 61 44 62 5b  )==0 || db->aDb[
191f0 30 5d 2e 70 42 74 3d 3d 30 20 29 20 72 65 74 75  0].pBt==0 ) retu
19200 72 6e 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65  rn;.  if( pParse
19210 2d 3e 6e 45 72 72 20 7c 7c 20 64 62 2d 3e 6d 61  ->nErr || db->ma
19220 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74  llocFailed ) ret
19230 75 72 6e 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  urn;.  if( sqlit
19240 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72  e3AuthCheck(pPar
19250 73 65 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53  se, SQLITE_TRANS
19260 41 43 54 49 4f 4e 2c 20 22 43 4f 4d 4d 49 54 22  ACTION, "COMMIT"
19270 2c 20 30 2c 20 30 29 20 29 20 72 65 74 75 72 6e  , 0, 0) ) return
19280 3b 0a 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33  ;..  v = sqlite3
19290 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
192a0 0a 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20  .  if( v ){.    
192b0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
192c0 32 28 76 2c 20 4f 50 5f 41 75 74 6f 43 6f 6d 6d  2(v, OP_AutoComm
192d0 69 74 2c 20 31 2c 20 30 29 3b 0a 20 20 7d 0a 7d  it, 1, 0);.  }.}
192e0 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b  ../*.** Rollback
192f0 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a   a transaction.*
19300 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52 6f  /.void sqlite3Ro
19310 6c 6c 62 61 63 6b 54 72 61 6e 73 61 63 74 69 6f  llbackTransactio
19320 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29  n(Parse *pParse)
19330 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  {.  sqlite3 *db;
19340 0a 20 20 56 64 62 65 20 2a 76 3b 0a 0a 20 20 69  .  Vdbe *v;..  i
19350 66 28 20 70 50 61 72 73 65 3d 3d 30 20 7c 7c 20  f( pParse==0 || 
19360 28 64 62 3d 70 50 61 72 73 65 2d 3e 64 62 29 3d  (db=pParse->db)=
19370 3d 30 20 7c 7c 20 64 62 2d 3e 61 44 62 5b 30 5d  =0 || db->aDb[0]
19380 2e 70 42 74 3d 3d 30 20 29 20 72 65 74 75 72 6e  .pBt==0 ) return
19390 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  ;.  if( pParse->
193a0 6e 45 72 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c  nErr || db->mall
193b0 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74 75 72  ocFailed ) retur
193c0 6e 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  n;.  if( sqlite3
193d0 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65  AuthCheck(pParse
193e0 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 41 43  , SQLITE_TRANSAC
193f0 54 49 4f 4e 2c 20 22 52 4f 4c 4c 42 41 43 4b 22  TION, "ROLLBACK"
19400 2c 20 30 2c 20 30 29 20 29 20 72 65 74 75 72 6e  , 0, 0) ) return
19410 3b 0a 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33  ;..  v = sqlite3
19420 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
19430 0a 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20  .  if( v ){.    
19440 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
19450 32 28 76 2c 20 4f 50 5f 41 75 74 6f 43 6f 6d 6d  2(v, OP_AutoComm
19460 69 74 2c 20 31 2c 20 31 29 3b 0a 20 20 7d 0a 7d  it, 1, 1);.  }.}
19470 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72  ../*.** Make sur
19480 65 20 74 68 65 20 54 45 4d 50 20 64 61 74 61 62  e the TEMP datab
19490 61 73 65 20 69 73 20 6f 70 65 6e 20 61 6e 64 20  ase is open and 
194a0 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 75 73  available for us
194b0 65 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20 74 68  e.  Return.** th
194c0 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f  e number of erro
194d0 72 73 2e 20 20 4c 65 61 76 65 20 61 6e 79 20 65  rs.  Leave any e
194e0 72 72 6f 72 20 6d 65 73 73 61 67 65 73 20 69 6e  rror messages in
194f0 20 74 68 65 20 70 50 61 72 73 65 20 73 74 72 75   the pParse stru
19500 63 74 75 72 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71  cture..*/.int sq
19510 6c 69 74 65 33 4f 70 65 6e 54 65 6d 70 44 61 74  lite3OpenTempDat
19520 61 62 61 73 65 28 50 61 72 73 65 20 2a 70 50 61  abase(Parse *pPa
19530 72 73 65 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  rse){.  sqlite3 
19540 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
19550 3b 0a 20 20 69 66 28 20 64 62 2d 3e 61 44 62 5b  ;.  if( db->aDb[
19560 31 5d 2e 70 42 74 3d 3d 30 20 26 26 20 21 70 50  1].pBt==0 && !pP
19570 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 20 29 7b  arse->explain ){
19580 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20  .    int rc;.   
19590 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 69 6e   static const in
195a0 74 20 66 6c 61 67 73 20 3d 20 0a 20 20 20 20 20  t flags = .     
195b0 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e       SQLITE_OPEN
195c0 5f 52 45 41 44 57 52 49 54 45 20 7c 0a 20 20 20  _READWRITE |.   
195d0 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50         SQLITE_OP
195e0 45 4e 5f 43 52 45 41 54 45 20 7c 0a 20 20 20 20  EN_CREATE |.    
195f0 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45        SQLITE_OPE
19600 4e 5f 45 58 43 4c 55 53 49 56 45 20 7c 0a 20 20  N_EXCLUSIVE |.  
19610 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f          SQLITE_O
19620 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53  PEN_DELETEONCLOS
19630 45 20 7c 0a 20 20 20 20 20 20 20 20 20 20 53 51  E |.          SQ
19640 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 44  LITE_OPEN_TEMP_D
19650 42 3b 0a 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  B;..    rc = sql
19660 69 74 65 33 42 74 72 65 65 46 61 63 74 6f 72 79  ite3BtreeFactory
19670 28 64 62 2c 20 30 2c 20 30 2c 20 53 51 4c 49 54  (db, 0, 0, SQLIT
19680 45 5f 44 45 46 41 55 4c 54 5f 43 41 43 48 45 5f  E_DEFAULT_CACHE_
19690 53 49 5a 45 2c 20 66 6c 61 67 73 2c 0a 20 20 20  SIZE, flags,.   
196a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
196b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26 64                &d
196c0 62 2d 3e 61 44 62 5b 31 5d 2e 70 42 74 29 3b 0a  b->aDb[1].pBt);.
196d0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
196e0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73  TE_OK ){.      s
196f0 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
19700 50 61 72 73 65 2c 20 22 75 6e 61 62 6c 65 20 74  Parse, "unable t
19710 6f 20 6f 70 65 6e 20 61 20 74 65 6d 70 6f 72 61  o open a tempora
19720 72 79 20 64 61 74 61 62 61 73 65 20 22 0a 20 20  ry database ".  
19730 20 20 20 20 20 20 22 66 69 6c 65 20 66 6f 72 20        "file for 
19740 73 74 6f 72 69 6e 67 20 74 65 6d 70 6f 72 61 72  storing temporar
19750 79 20 74 61 62 6c 65 73 22 29 3b 0a 20 20 20 20  y tables");.    
19760 20 20 70 50 61 72 73 65 2d 3e 72 63 20 3d 20 72    pParse->rc = r
19770 63 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  c;.      return 
19780 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  1;.    }.    ass
19790 65 72 74 28 20 28 64 62 2d 3e 66 6c 61 67 73 20  ert( (db->flags 
197a0 26 20 53 51 4c 49 54 45 5f 49 6e 54 72 61 6e 73  & SQLITE_InTrans
197b0 29 3d 3d 30 20 7c 7c 20 64 62 2d 3e 61 75 74 6f  )==0 || db->auto
197c0 43 6f 6d 6d 69 74 20 29 3b 0a 20 20 20 20 61 73  Commit );.    as
197d0 73 65 72 74 28 20 64 62 2d 3e 61 44 62 5b 31 5d  sert( db->aDb[1]
197e0 2e 70 53 63 68 65 6d 61 20 29 3b 0a 20 20 20 20  .pSchema );.    
197f0 73 71 6c 69 74 65 33 50 61 67 65 72 4a 6f 75 72  sqlite3PagerJour
19800 6e 61 6c 4d 6f 64 65 28 73 71 6c 69 74 65 33 42  nalMode(sqlite3B
19810 74 72 65 65 50 61 67 65 72 28 64 62 2d 3e 61 44  treePager(db->aD
19820 62 5b 31 5d 2e 70 42 74 29 2c 0a 20 20 20 20 20  b[1].pBt),.     
19830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19840 20 20 20 20 20 20 20 64 62 2d 3e 64 66 6c 74 4a         db->dfltJ
19850 6f 75 72 6e 61 6c 4d 6f 64 65 29 3b 0a 20 20 7d  ournalMode);.  }
19860 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
19870 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 56  /*.** Generate V
19880 44 42 45 20 63 6f 64 65 20 74 68 61 74 20 77 69  DBE code that wi
19890 6c 6c 20 76 65 72 69 66 79 20 74 68 65 20 73 63  ll verify the sc
198a0 68 65 6d 61 20 63 6f 6f 6b 69 65 20 61 6e 64 20  hema cookie and 
198b0 73 74 61 72 74 0a 2a 2a 20 61 20 72 65 61 64 2d  start.** a read-
198c0 74 72 61 6e 73 61 63 74 69 6f 6e 20 66 6f 72 20  transaction for 
198d0 61 6c 6c 20 6e 61 6d 65 64 20 64 61 74 61 62 61  all named databa
198e0 73 65 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20  se files..**.** 
198f0 49 74 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20  It is important 
19900 74 68 61 74 20 61 6c 6c 20 73 63 68 65 6d 61 20  that all schema 
19910 63 6f 6f 6b 69 65 73 20 62 65 20 76 65 72 69 66  cookies be verif
19920 69 65 64 20 61 6e 64 20 61 6c 6c 0a 2a 2a 20 72  ied and all.** r
19930 65 61 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 73  ead transactions
19940 20 62 65 20 73 74 61 72 74 65 64 20 62 65 66 6f   be started befo
19950 72 65 20 61 6e 79 74 68 69 6e 67 20 65 6c 73 65  re anything else
19960 20 68 61 70 70 65 6e 73 20 69 6e 0a 2a 2a 20 74   happens in.** t
19970 68 65 20 56 44 42 45 20 70 72 6f 67 72 61 6d 2e  he VDBE program.
19980 20 20 42 75 74 20 74 68 69 73 20 72 6f 75 74 69    But this routi
19990 6e 65 20 63 61 6e 20 62 65 20 63 61 6c 6c 65 64  ne can be called
199a0 20 61 66 74 65 72 20 6d 75 63 68 20 6f 74 68 65   after much othe
199b0 72 0a 2a 2a 20 63 6f 64 65 20 68 61 73 20 62 65  r.** code has be
199c0 65 6e 20 67 65 6e 65 72 61 74 65 64 2e 20 20 53  en generated.  S
199d0 6f 20 68 65 72 65 20 69 73 20 77 68 61 74 20 77  o here is what w
199e0 65 20 64 6f 3a 0a 2a 2a 0a 2a 2a 20 54 68 65 20  e do:.**.** The 
199f0 66 69 72 73 74 20 74 69 6d 65 20 74 68 69 73 20  first time this 
19a00 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
19a10 64 2c 20 77 65 20 63 6f 64 65 20 61 6e 20 4f 50  d, we code an OP
19a20 5f 47 6f 74 6f 20 74 68 61 74 0a 2a 2a 20 77 69  _Goto that.** wi
19a30 6c 6c 20 6a 75 6d 70 20 74 6f 20 61 20 73 75 62  ll jump to a sub
19a40 72 6f 75 74 69 6e 65 20 61 74 20 74 68 65 20 65  routine at the e
19a50 6e 64 20 6f 66 20 74 68 65 20 70 72 6f 67 72 61  nd of the progra
19a60 6d 2e 20 20 54 68 65 6e 20 77 65 0a 2a 2a 20 72  m.  Then we.** r
19a70 65 63 6f 72 64 20 65 76 65 72 79 20 64 61 74 61  ecord every data
19a80 62 61 73 65 20 74 68 61 74 20 6e 65 65 64 73 20  base that needs 
19a90 69 74 73 20 73 63 68 65 6d 61 20 76 65 72 69 66  its schema verif
19aa0 69 65 64 20 69 6e 20 74 68 65 0a 2a 2a 20 70 50  ied in the.** pP
19ab0 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 4d 61 73 6b  arse->cookieMask
19ac0 20 66 69 65 6c 64 2e 20 20 4c 61 74 65 72 2c 20   field.  Later, 
19ad0 61 66 74 65 72 20 61 6c 6c 20 6f 74 68 65 72 20  after all other 
19ae0 63 6f 64 65 20 68 61 73 20 62 65 65 6e 0a 2a 2a  code has been.**
19af0 20 67 65 6e 65 72 61 74 65 64 2c 20 74 68 65 20   generated, the 
19b00 73 75 62 72 6f 75 74 69 6e 65 20 74 68 61 74 20  subroutine that 
19b10 64 6f 65 73 20 74 68 65 20 63 6f 6f 6b 69 65 20  does the cookie 
19b20 76 65 72 69 66 69 63 61 74 69 6f 6e 73 20 61 6e  verifications an
19b30 64 0a 2a 2a 20 73 74 61 72 74 73 20 74 68 65 20  d.** starts the 
19b40 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 77 69 6c  transactions wil
19b50 6c 20 62 65 20 63 6f 64 65 64 20 61 6e 64 20 74  l be coded and t
19b60 68 65 20 4f 50 5f 47 6f 74 6f 20 50 32 20 76 61  he OP_Goto P2 va
19b70 6c 75 65 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 6d  lue.** will be m
19b80 61 64 65 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20  ade to point to 
19b90 74 68 61 74 20 73 75 62 72 6f 75 74 69 6e 65 2e  that subroutine.
19ba0 20 20 54 68 65 20 67 65 6e 65 72 61 74 69 6f 6e    The generation
19bb0 20 6f 66 20 74 68 65 0a 2a 2a 20 63 6f 6f 6b 69   of the.** cooki
19bc0 65 20 76 65 72 69 66 69 63 61 74 69 6f 6e 20 73  e verification s
19bd0 75 62 72 6f 75 74 69 6e 65 20 63 6f 64 65 20 68  ubroutine code h
19be0 61 70 70 65 6e 73 20 69 6e 20 73 71 6c 69 74 65  appens in sqlite
19bf0 33 46 69 6e 69 73 68 43 6f 64 69 6e 67 28 29 2e  3FinishCoding().
19c00 0a 2a 2a 0a 2a 2a 20 49 66 20 69 44 62 3c 30 20  .**.** If iDb<0 
19c10 74 68 65 6e 20 63 6f 64 65 20 74 68 65 20 4f 50  then code the OP
19c20 5f 47 6f 74 6f 20 6f 6e 6c 79 20 2d 20 64 6f 6e  _Goto only - don
19c30 27 74 20 73 65 74 20 66 6c 61 67 20 74 6f 20 76  't set flag to v
19c40 65 72 69 66 79 20 74 68 65 0a 2a 2a 20 73 63 68  erify the.** sch
19c50 65 6d 61 20 6f 6e 20 61 6e 79 20 64 61 74 61 62  ema on any datab
19c60 61 73 65 73 2e 20 20 54 68 69 73 20 63 61 6e 20  ases.  This can 
19c70 62 65 20 75 73 65 64 20 74 6f 20 70 6f 73 69 74  be used to posit
19c80 69 6f 6e 20 74 68 65 20 4f 50 5f 47 6f 74 6f 0a  ion the OP_Goto.
19c90 2a 2a 20 65 61 72 6c 79 20 69 6e 20 74 68 65 20  ** early in the 
19ca0 63 6f 64 65 2c 20 62 65 66 6f 72 65 20 77 65 20  code, before we 
19cb0 6b 6e 6f 77 20 69 66 20 61 6e 79 20 64 61 74 61  know if any data
19cc0 62 61 73 65 20 74 61 62 6c 65 73 20 77 69 6c 6c  base tables will
19cd0 20 62 65 20 75 73 65 64 2e 0a 2a 2f 0a 76 6f 69   be used..*/.voi
19ce0 64 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72  d sqlite3CodeVer
19cf0 69 66 79 53 63 68 65 6d 61 28 50 61 72 73 65 20  ifySchema(Parse 
19d00 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69 44 62  *pParse, int iDb
19d10 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
19d20 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 69  ;.  Vdbe *v;.  i
19d30 6e 74 20 6d 61 73 6b 3b 0a 0a 20 20 76 20 3d 20  nt mask;..  v = 
19d40 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
19d50 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76 3d  Parse);.  if( v=
19d60 3d 30 20 29 20 72 65 74 75 72 6e 3b 20 20 2f 2a  =0 ) return;  /*
19d70 20 54 68 69 73 20 6f 6e 6c 79 20 68 61 70 70 65   This only happe
19d80 6e 73 20 69 66 20 74 68 65 72 65 20 77 61 73 20  ns if there was 
19d90 61 20 70 72 69 6f 72 20 65 72 72 6f 72 20 2a 2f  a prior error */
19da0 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  .  db = pParse->
19db0 64 62 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65  db;.  if( pParse
19dc0 2d 3e 63 6f 6f 6b 69 65 47 6f 74 6f 3d 3d 30 20  ->cookieGoto==0 
19dd0 29 7b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 63  ){.    pParse->c
19de0 6f 6f 6b 69 65 47 6f 74 6f 20 3d 20 73 71 6c 69  ookieGoto = sqli
19df0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
19e00 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 30 29 2b   OP_Goto, 0, 0)+
19e10 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 44 62  1;.  }.  if( iDb
19e20 3e 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72  >=0 ){.    asser
19e30 74 28 20 69 44 62 3c 64 62 2d 3e 6e 44 62 20 29  t( iDb<db->nDb )
19e40 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 64 62  ;.    assert( db
19e50 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 42 74 21 3d  ->aDb[iDb].pBt!=
19e60 30 20 7c 7c 20 69 44 62 3d 3d 31 20 29 3b 0a 20  0 || iDb==1 );. 
19e70 20 20 20 61 73 73 65 72 74 28 20 69 44 62 3c 53     assert( iDb<S
19e80 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41 43 48  QLITE_MAX_ATTACH
19e90 45 44 2b 32 20 29 3b 0a 20 20 20 20 6d 61 73 6b  ED+2 );.    mask
19ea0 20 3d 20 31 3c 3c 69 44 62 3b 0a 20 20 20 20 69   = 1<<iDb;.    i
19eb0 66 28 20 28 70 50 61 72 73 65 2d 3e 63 6f 6f 6b  f( (pParse->cook
19ec0 69 65 4d 61 73 6b 20 26 20 6d 61 73 6b 29 3d 3d  ieMask & mask)==
19ed0 30 20 29 7b 0a 20 20 20 20 20 20 70 50 61 72 73  0 ){.      pPars
19ee0 65 2d 3e 63 6f 6f 6b 69 65 4d 61 73 6b 20 7c 3d  e->cookieMask |=
19ef0 20 6d 61 73 6b 3b 0a 20 20 20 20 20 20 70 50 61   mask;.      pPa
19f00 72 73 65 2d 3e 63 6f 6f 6b 69 65 56 61 6c 75 65  rse->cookieValue
19f10 5b 69 44 62 5d 20 3d 20 64 62 2d 3e 61 44 62 5b  [iDb] = db->aDb[
19f20 69 44 62 5d 2e 70 53 63 68 65 6d 61 2d 3e 73 63  iDb].pSchema->sc
19f30 68 65 6d 61 5f 63 6f 6f 6b 69 65 3b 0a 20 20 20  hema_cookie;.   
19f40 20 20 20 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d     if( !OMIT_TEM
19f50 50 44 42 20 26 26 20 69 44 62 3d 3d 31 20 29 7b  PDB && iDb==1 ){
19f60 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
19f70 4f 70 65 6e 54 65 6d 70 44 61 74 61 62 61 73 65  OpenTempDatabase
19f80 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
19f90 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  }.    }.  }.}../
19fa0 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 56 44  *.** Generate VD
19fb0 42 45 20 63 6f 64 65 20 74 68 61 74 20 70 72 65  BE code that pre
19fc0 70 61 72 65 73 20 66 6f 72 20 64 6f 69 6e 67 20  pares for doing 
19fd0 61 6e 20 6f 70 65 72 61 74 69 6f 6e 20 74 68 61  an operation tha
19fe0 74 0a 2a 2a 20 6d 69 67 68 74 20 63 68 61 6e 67  t.** might chang
19ff0 65 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a  e the database..
1a000 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
1a010 6e 65 20 73 74 61 72 74 73 20 61 20 6e 65 77 20  ne starts a new 
1a020 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 66 20 77  transaction if w
1a030 65 20 61 72 65 20 6e 6f 74 20 61 6c 72 65 61 64  e are not alread
1a040 79 20 77 69 74 68 69 6e 0a 2a 2a 20 61 20 74 72  y within.** a tr
1a050 61 6e 73 61 63 74 69 6f 6e 2e 20 20 49 66 20 77  ansaction.  If w
1a060 65 20 61 72 65 20 61 6c 72 65 61 64 79 20 77 69  e are already wi
1a070 74 68 69 6e 20 61 20 74 72 61 6e 73 61 63 74 69  thin a transacti
1a080 6f 6e 2c 20 74 68 65 6e 20 61 20 63 68 65 63 6b  on, then a check
1a090 70 6f 69 6e 74 0a 2a 2a 20 69 73 20 73 65 74 20  point.** is set 
1a0a0 69 66 20 74 68 65 20 73 65 74 53 74 61 74 65 6d  if the setStatem
1a0b0 65 6e 74 20 70 61 72 61 6d 65 74 65 72 20 69 73  ent parameter is
1a0c0 20 74 72 75 65 2e 20 20 41 20 63 68 65 63 6b 70   true.  A checkp
1a0d0 6f 69 6e 74 20 73 68 6f 75 6c 64 0a 2a 2a 20 62  oint should.** b
1a0e0 65 20 73 65 74 20 66 6f 72 20 6f 70 65 72 61 74  e set for operat
1a0f0 69 6f 6e 73 20 74 68 61 74 20 6d 69 67 68 74 20  ions that might 
1a100 66 61 69 6c 20 28 64 75 65 20 74 6f 20 61 20 63  fail (due to a c
1a110 6f 6e 73 74 72 61 69 6e 74 29 20 70 61 72 74 20  onstraint) part 
1a120 6f 66 0a 2a 2a 20 74 68 65 20 77 61 79 20 74 68  of.** the way th
1a130 72 6f 75 67 68 20 61 6e 64 20 77 68 69 63 68 20  rough and which 
1a140 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20 75 6e 64  will need to und
1a150 6f 20 73 6f 6d 65 20 77 72 69 74 65 73 20 77 69  o some writes wi
1a160 74 68 6f 75 74 20 68 61 76 69 6e 67 20 74 6f 0a  thout having to.
1a170 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20  ** rollback the 
1a180 77 68 6f 6c 65 20 74 72 61 6e 73 61 63 74 69 6f  whole transactio
1a190 6e 2e 20 20 46 6f 72 20 6f 70 65 72 61 74 69 6f  n.  For operatio
1a1a0 6e 73 20 77 68 65 72 65 20 61 6c 6c 20 63 6f 6e  ns where all con
1a1b0 73 74 72 61 69 6e 74 73 0a 2a 2a 20 63 61 6e 20  straints.** can 
1a1c0 62 65 20 63 68 65 63 6b 65 64 20 62 65 66 6f 72  be checked befor
1a1d0 65 20 61 6e 79 20 63 68 61 6e 67 65 73 20 61 72  e any changes ar
1a1e0 65 20 6d 61 64 65 20 74 6f 20 74 68 65 20 64 61  e made to the da
1a1f0 74 61 62 61 73 65 2c 20 69 74 20 69 73 20 6e 65  tabase, it is ne
1a200 76 65 72 0a 2a 2a 20 6e 65 63 65 73 73 61 72 79  ver.** necessary
1a210 20 74 6f 20 75 6e 64 6f 20 61 20 77 72 69 74 65   to undo a write
1a220 20 61 6e 64 20 74 68 65 20 63 68 65 63 6b 70 6f   and the checkpo
1a230 69 6e 74 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62  int should not b
1a240 65 20 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c  e set..**.** Onl
1a250 79 20 64 61 74 61 62 61 73 65 20 69 44 62 20 61  y database iDb a
1a260 6e 64 20 74 68 65 20 74 65 6d 70 20 64 61 74 61  nd the temp data
1a270 62 61 73 65 20 61 72 65 20 6d 61 64 65 20 77 72  base are made wr
1a280 69 74 61 62 6c 65 20 62 79 20 74 68 69 73 20 63  itable by this c
1a290 61 6c 6c 2e 0a 2a 2a 20 49 66 20 69 44 62 3d 3d  all..** If iDb==
1a2a0 30 2c 20 74 68 65 6e 20 74 68 65 20 6d 61 69 6e  0, then the main
1a2b0 20 61 6e 64 20 74 65 6d 70 20 64 61 74 61 62 61   and temp databa
1a2c0 73 65 73 20 61 72 65 20 6d 61 64 65 20 77 72 69  ses are made wri
1a2d0 74 61 62 6c 65 2e 20 20 20 49 66 0a 2a 2a 20 69  table.   If.** i
1a2e0 44 62 3d 3d 31 20 74 68 65 6e 20 6f 6e 6c 79 20  Db==1 then only 
1a2f0 74 68 65 20 74 65 6d 70 20 64 61 74 61 62 61 73  the temp databas
1a300 65 20 69 73 20 6d 61 64 65 20 77 72 69 74 61 62  e is made writab
1a310 6c 65 2e 20 20 49 66 20 69 44 62 3e 31 20 74 68  le.  If iDb>1 th
1a320 65 6e 20 74 68 65 0a 2a 2a 20 73 70 65 63 69 66  en the.** specif
1a330 69 65 64 20 61 75 78 69 6c 69 61 72 79 20 64 61  ied auxiliary da
1a340 74 61 62 61 73 65 20 61 6e 64 20 74 68 65 20 74  tabase and the t
1a350 65 6d 70 20 64 61 74 61 62 61 73 65 20 61 72 65  emp database are
1a360 20 6d 61 64 65 20 77 72 69 74 61 62 6c 65 2e 0a   made writable..
1a370 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42  */.void sqlite3B
1a380 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69  eginWriteOperati
1a390 6f 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  on(Parse *pParse
1a3a0 2c 20 69 6e 74 20 73 65 74 53 74 61 74 65 6d 65  , int setStateme
1a3b0 6e 74 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20 20  nt, int iDb){.  
1a3c0 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65  Vdbe *v = sqlite
1a3d0 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
1a3e0 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72  ;.  if( v==0 ) r
1a3f0 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65 33  eturn;.  sqlite3
1a400 43 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d 61  CodeVerifySchema
1a410 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20  (pParse, iDb);. 
1a420 20 70 50 61 72 73 65 2d 3e 77 72 69 74 65 4d 61   pParse->writeMa
1a430 73 6b 20 7c 3d 20 31 3c 3c 69 44 62 3b 0a 20 20  sk |= 1<<iDb;.  
1a440 69 66 28 20 73 65 74 53 74 61 74 65 6d 65 6e 74  if( setStatement
1a450 20 26 26 20 70 50 61 72 73 65 2d 3e 6e 65 73 74   && pParse->nest
1a460 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  ed==0 ){.    sql
1a470 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
1a480 2c 20 4f 50 5f 53 74 61 74 65 6d 65 6e 74 2c 20  , OP_Statement, 
1a490 69 44 62 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  iDb);.  }.  if( 
1a4a0 28 4f 4d 49 54 5f 54 45 4d 50 44 42 20 7c 7c 20  (OMIT_TEMPDB || 
1a4b0 69 44 62 21 3d 31 29 20 26 26 20 70 50 61 72 73  iDb!=1) && pPars
1a4c0 65 2d 3e 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 42  e->db->aDb[1].pB
1a4d0 74 21 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  t!=0 ){.    sqli
1a4e0 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65  te3BeginWriteOpe
1a4f0 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 73  ration(pParse, s
1a500 65 74 53 74 61 74 65 6d 65 6e 74 2c 20 31 29 3b  etStatement, 1);
1a510 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68  .  }.}../*.** Ch
1a520 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 70 49  eck to see if pI
1a530 6e 64 65 78 20 75 73 65 73 20 74 68 65 20 63 6f  ndex uses the co
1a540 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
1a550 20 70 43 6f 6c 6c 2e 20 20 52 65 74 75 72 6e 0a   pColl.  Return.
1a560 2a 2a 20 74 72 75 65 20 69 66 20 69 74 20 64 6f  ** true if it do
1a570 65 73 20 61 6e 64 20 66 61 6c 73 65 20 69 66 20  es and false if 
1a580 69 74 20 64 6f 65 73 20 6e 6f 74 2e 0a 2a 2f 0a  it does not..*/.
1a590 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1a5a0 4d 49 54 5f 52 45 49 4e 44 45 58 0a 73 74 61 74  MIT_REINDEX.stat
1a5b0 69 63 20 69 6e 74 20 63 6f 6c 6c 61 74 69 6f 6e  ic int collation
1a5c0 4d 61 74 63 68 28 63 6f 6e 73 74 20 63 68 61 72  Match(const char
1a5d0 20 2a 7a 43 6f 6c 6c 2c 20 49 6e 64 65 78 20 2a   *zColl, Index *
1a5e0 70 49 6e 64 65 78 29 7b 0a 20 20 69 6e 74 20 69  pIndex){.  int i
1a5f0 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
1a600 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20  Index->nColumn; 
1a610 69 2b 2b 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20  i++){.    const 
1a620 63 68 61 72 20 2a 7a 20 3d 20 70 49 6e 64 65 78  char *z = pIndex
1a630 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 3b 0a 20 20 20  ->azColl[i];.   
1a640 20 69 66 28 20 7a 3d 3d 7a 43 6f 6c 6c 20 7c 7c   if( z==zColl ||
1a650 20 28 7a 20 26 26 20 7a 43 6f 6c 6c 20 26 26 20   (z && zColl && 
1a660 30 3d 3d 73 71 6c 69 74 65 33 53 74 72 49 43 6d  0==sqlite3StrICm
1a670 70 28 7a 2c 20 7a 43 6f 6c 6c 29 29 20 29 7b 0a  p(z, zColl)) ){.
1a680 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
1a690 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
1a6a0 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  rn 0;.}.#endif..
1a6b0 2f 2a 0a 2a 2a 20 52 65 63 6f 6d 70 75 74 65 20  /*.** Recompute 
1a6c0 61 6c 6c 20 69 6e 64 69 63 65 73 20 6f 66 20 70  all indices of p
1a6d0 54 61 62 20 74 68 61 74 20 75 73 65 20 74 68 65  Tab that use the
1a6e0 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
1a6f0 6e 63 65 20 70 43 6f 6c 6c 2e 0a 2a 2a 20 49 66  nce pColl..** If
1a700 20 70 43 6f 6c 6c 3d 3d 30 20 74 68 65 6e 20 72   pColl==0 then r
1a710 65 63 6f 6d 70 75 74 65 20 61 6c 6c 20 69 6e 64  ecompute all ind
1a720 69 63 65 73 20 6f 66 20 70 54 61 62 2e 0a 2a 2f  ices of pTab..*/
1a730 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1a740 4f 4d 49 54 5f 52 45 49 4e 44 45 58 0a 73 74 61  OMIT_REINDEX.sta
1a750 74 69 63 20 76 6f 69 64 20 72 65 69 6e 64 65 78  tic void reindex
1a760 54 61 62 6c 65 28 50 61 72 73 65 20 2a 70 50 61  Table(Parse *pPa
1a770 72 73 65 2c 20 54 61 62 6c 65 20 2a 70 54 61 62  rse, Table *pTab
1a780 2c 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 43  , char const *zC
1a790 6f 6c 6c 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70  oll){.  Index *p
1a7a0 49 6e 64 65 78 3b 20 20 20 20 20 20 20 20 20 20  Index;          
1a7b0 20 20 20 20 2f 2a 20 41 6e 20 69 6e 64 65 78 20      /* An index 
1a7c0 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
1a7d0 70 54 61 62 20 2a 2f 0a 0a 20 20 66 6f 72 28 70  pTab */..  for(p
1a7e0 49 6e 64 65 78 3d 70 54 61 62 2d 3e 70 49 6e 64  Index=pTab->pInd
1a7f0 65 78 3b 20 70 49 6e 64 65 78 3b 20 70 49 6e 64  ex; pIndex; pInd
1a800 65 78 3d 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74  ex=pIndex->pNext
1a810 29 7b 0a 20 20 20 20 69 66 28 20 7a 43 6f 6c 6c  ){.    if( zColl
1a820 3d 3d 30 20 7c 7c 20 63 6f 6c 6c 61 74 69 6f 6e  ==0 || collation
1a830 4d 61 74 63 68 28 7a 43 6f 6c 6c 2c 20 70 49 6e  Match(zColl, pIn
1a840 64 65 78 29 20 29 7b 0a 20 20 20 20 20 20 69 6e  dex) ){.      in
1a850 74 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53  t iDb = sqlite3S
1a860 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 70 50 61  chemaToIndex(pPa
1a870 72 73 65 2d 3e 64 62 2c 20 70 54 61 62 2d 3e 70  rse->db, pTab->p
1a880 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 20 20 73  Schema);.      s
1a890 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74 65  qlite3BeginWrite
1a8a0 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65  Operation(pParse
1a8b0 2c 20 30 2c 20 69 44 62 29 3b 0a 20 20 20 20 20  , 0, iDb);.     
1a8c0 20 73 71 6c 69 74 65 33 52 65 66 69 6c 6c 49 6e   sqlite3RefillIn
1a8d0 64 65 78 28 70 50 61 72 73 65 2c 20 70 49 6e 64  dex(pParse, pInd
1a8e0 65 78 2c 20 2d 31 29 3b 0a 20 20 20 20 7d 0a 20  ex, -1);.    }. 
1a8f0 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a   }.}.#endif../*.
1a900 2a 2a 20 52 65 63 6f 6d 70 75 74 65 20 61 6c 6c  ** Recompute all
1a910 20 69 6e 64 69 63 65 73 20 6f 66 20 61 6c 6c 20   indices of all 
1a920 74 61 62 6c 65 73 20 69 6e 20 61 6c 6c 20 64 61  tables in all da
1a930 74 61 62 61 73 65 73 20 77 68 65 72 65 20 74 68  tabases where th
1a940 65 0a 2a 2a 20 69 6e 64 69 63 65 73 20 75 73 65  e.** indices use
1a950 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73   the collating s
1a960 65 71 75 65 6e 63 65 20 70 43 6f 6c 6c 2e 20 20  equence pColl.  
1a970 49 66 20 70 43 6f 6c 6c 3d 3d 30 20 74 68 65 6e  If pColl==0 then
1a980 20 72 65 63 6f 6d 70 75 74 65 0a 2a 2a 20 61 6c   recompute.** al
1a990 6c 20 69 6e 64 69 63 65 73 20 65 76 65 72 79 77  l indices everyw
1a9a0 68 65 72 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  here..*/.#ifndef
1a9b0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 52 45 49   SQLITE_OMIT_REI
1a9c0 4e 44 45 58 0a 73 74 61 74 69 63 20 76 6f 69 64  NDEX.static void
1a9d0 20 72 65 69 6e 64 65 78 44 61 74 61 62 61 73 65   reindexDatabase
1a9e0 73 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  s(Parse *pParse,
1a9f0 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 43 6f   char const *zCo
1aa00 6c 6c 29 7b 0a 20 20 44 62 20 2a 70 44 62 3b 20  ll){.  Db *pDb; 
1aa10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1aa20 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20 64     /* A single d
1aa30 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 69 6e 74  atabase */.  int
1aa40 20 69 44 62 3b 20 20 20 20 20 20 20 20 20 20 20   iDb;           
1aa50 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1aa60 64 61 74 61 62 61 73 65 20 69 6e 64 65 78 20 6e  database index n
1aa70 75 6d 62 65 72 20 2a 2f 0a 20 20 73 71 6c 69 74  umber */.  sqlit
1aa80 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
1aa90 3e 64 62 3b 20 20 20 2f 2a 20 54 68 65 20 64 61  >db;   /* The da
1aaa0 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
1aab0 6e 20 2a 2f 0a 20 20 48 61 73 68 45 6c 65 6d 20  n */.  HashElem 
1aac0 2a 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  *k;             
1aad0 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e     /* For loopin
1aae0 67 20 6f 76 65 72 20 74 61 62 6c 65 73 20 69 6e  g over tables in
1aaf0 20 70 44 62 20 2a 2f 0a 20 20 54 61 62 6c 65 20   pDb */.  Table 
1ab00 2a 70 54 61 62 3b 20 20 20 20 20 20 20 20 20 20  *pTab;          
1ab10 20 20 20 20 20 20 2f 2a 20 41 20 74 61 62 6c 65        /* A table
1ab20 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
1ab30 20 2a 2f 0a 0a 20 20 66 6f 72 28 69 44 62 3d 30   */..  for(iDb=0
1ab40 2c 20 70 44 62 3d 64 62 2d 3e 61 44 62 3b 20 69  , pDb=db->aDb; i
1ab50 44 62 3c 64 62 2d 3e 6e 44 62 3b 20 69 44 62 2b  Db<db->nDb; iDb+
1ab60 2b 2c 20 70 44 62 2b 2b 29 7b 0a 20 20 20 20 61  +, pDb++){.    a
1ab70 73 73 65 72 74 28 20 70 44 62 21 3d 30 20 29 3b  ssert( pDb!=0 );
1ab80 0a 20 20 20 20 66 6f 72 28 6b 3d 73 71 6c 69 74  .    for(k=sqlit
1ab90 65 48 61 73 68 46 69 72 73 74 28 26 70 44 62 2d  eHashFirst(&pDb-
1aba0 3e 70 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73  >pSchema->tblHas
1abb0 68 29 3b 20 20 6b 3b 20 6b 3d 73 71 6c 69 74 65  h);  k; k=sqlite
1abc0 48 61 73 68 4e 65 78 74 28 6b 29 29 7b 0a 20 20  HashNext(k)){.  
1abd0 20 20 20 20 70 54 61 62 20 3d 20 28 54 61 62 6c      pTab = (Tabl
1abe0 65 2a 29 73 71 6c 69 74 65 48 61 73 68 44 61 74  e*)sqliteHashDat
1abf0 61 28 6b 29 3b 0a 20 20 20 20 20 20 72 65 69 6e  a(k);.      rein
1ac00 64 65 78 54 61 62 6c 65 28 70 50 61 72 73 65 2c  dexTable(pParse,
1ac10 20 70 54 61 62 2c 20 7a 43 6f 6c 6c 29 3b 0a 20   pTab, zColl);. 
1ac20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69     }.  }.}.#endi
1ac30 66 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  f../*.** Generat
1ac40 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20 52  e code for the R
1ac50 45 49 4e 44 45 58 20 63 6f 6d 6d 61 6e 64 2e 0a  EINDEX command..
1ac60 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 52 45 49  **.**        REI
1ac70 4e 44 45 58 20 20 20 20 20 20 20 20 20 20 20 20  NDEX            
1ac80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ac90 2d 2d 20 31 0a 2a 2a 20 20 20 20 20 20 20 20 52  -- 1.**        R
1aca0 45 49 4e 44 45 58 20 20 3c 63 6f 6c 6c 61 74 69  EINDEX  <collati
1acb0 6f 6e 3e 20 20 20 20 20 20 20 20 20 20 20 20 20  on>             
1acc0 20 20 2d 2d 20 32 0a 2a 2a 20 20 20 20 20 20 20    -- 2.**       
1acd0 20 52 45 49 4e 44 45 58 20 20 3f 3c 64 61 74 61   REINDEX  ?<data
1ace0 62 61 73 65 3e 2e 3f 3c 74 61 62 6c 65 6e 61 6d  base>.?<tablenam
1acf0 65 3e 20 20 2d 2d 20 33 0a 2a 2a 20 20 20 20 20  e>  -- 3.**     
1ad00 20 20 20 52 45 49 4e 44 45 58 20 20 3f 3c 64 61     REINDEX  ?<da
1ad10 74 61 62 61 73 65 3e 2e 3f 3c 69 6e 64 65 78 6e  tabase>.?<indexn
1ad20 61 6d 65 3e 20 20 2d 2d 20 34 0a 2a 2a 0a 2a 2a  ame>  -- 4.**.**
1ad30 20 46 6f 72 6d 20 31 20 63 61 75 73 65 73 20 61   Form 1 causes a
1ad40 6c 6c 20 69 6e 64 69 63 65 73 20 69 6e 20 61 6c  ll indices in al
1ad50 6c 20 61 74 74 61 63 68 65 64 20 64 61 74 61 62  l attached datab
1ad60 61 73 65 73 20 74 6f 20 62 65 20 72 65 62 75 69  ases to be rebui
1ad70 6c 74 2e 0a 2a 2a 20 46 6f 72 6d 20 32 20 72 65  lt..** Form 2 re
1ad80 62 75 69 6c 64 73 20 61 6c 6c 20 69 6e 64 69 63  builds all indic
1ad90 65 73 20 69 6e 20 61 6c 6c 20 64 61 74 61 62 61  es in all databa
1ada0 73 65 73 20 74 68 61 74 20 75 73 65 20 74 68 65  ses that use the
1adb0 20 6e 61 6d 65 64 0a 2a 2a 20 63 6f 6c 6c 61 74   named.** collat
1adc0 69 6e 67 20 66 75 6e 63 74 69 6f 6e 2e 20 20 46  ing function.  F
1add0 6f 72 6d 73 20 33 20 61 6e 64 20 34 20 72 65 62  orms 3 and 4 reb
1ade0 75 69 6c 64 20 74 68 65 20 6e 61 6d 65 64 20 69  uild the named i
1adf0 6e 64 65 78 20 6f 72 20 61 6c 6c 0a 2a 2a 20 69  ndex or all.** i
1ae00 6e 64 69 63 65 73 20 61 73 73 6f 63 69 61 74 65  ndices associate
1ae10 64 20 77 69 74 68 20 74 68 65 20 6e 61 6d 65 64  d with the named
1ae20 20 74 61 62 6c 65 2e 0a 2a 2f 0a 23 69 66 6e 64   table..*/.#ifnd
1ae30 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 52  ef SQLITE_OMIT_R
1ae40 45 49 4e 44 45 58 0a 76 6f 69 64 20 73 71 6c 69  EINDEX.void sqli
1ae50 74 65 33 52 65 69 6e 64 65 78 28 50 61 72 73 65  te3Reindex(Parse
1ae60 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20   *pParse, Token 
1ae70 2a 70 4e 61 6d 65 31 2c 20 54 6f 6b 65 6e 20 2a  *pName1, Token *
1ae80 70 4e 61 6d 65 32 29 7b 0a 20 20 43 6f 6c 6c 53  pName2){.  CollS
1ae90 65 71 20 2a 70 43 6f 6c 6c 3b 20 20 20 20 20 20  eq *pColl;      
1aea0 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 6c 61 74         /* Collat
1aeb0 69 6e 67 20 73 65 71 75 65 6e 63 65 20 74 6f 20  ing sequence to 
1aec0 62 65 20 72 65 69 6e 64 65 78 65 64 2c 20 6f 72  be reindexed, or
1aed0 20 4e 55 4c 4c 20 2a 2f 0a 20 20 63 68 61 72 20   NULL */.  char 
1aee0 2a 7a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  *z;             
1aef0 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
1af00 66 20 61 20 74 61 62 6c 65 20 6f 72 20 69 6e 64  f a table or ind
1af10 65 78 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  ex */.  const ch
1af20 61 72 20 2a 7a 44 62 3b 20 20 20 20 20 20 20 20  ar *zDb;        
1af30 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
1af40 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  he database */. 
1af50 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 20 20 20   Table *pTab;   
1af60 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1af70 41 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20 64  A table in the d
1af80 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 49 6e 64  atabase */.  Ind
1af90 65 78 20 2a 70 49 6e 64 65 78 3b 20 20 20 20 20  ex *pIndex;     
1afa0 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 69           /* An i
1afb0 6e 64 65 78 20 61 73 73 6f 63 69 61 74 65 64 20  ndex associated 
1afc0 77 69 74 68 20 70 54 61 62 20 2a 2f 0a 20 20 69  with pTab */.  i
1afd0 6e 74 20 69 44 62 3b 20 20 20 20 20 20 20 20 20  nt iDb;         
1afe0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
1aff0 65 20 64 61 74 61 62 61 73 65 20 69 6e 64 65 78  e database index
1b000 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 73 71 6c   number */.  sql
1b010 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
1b020 65 2d 3e 64 62 3b 20 20 20 2f 2a 20 54 68 65 20  e->db;   /* The 
1b030 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
1b040 69 6f 6e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  ion */.  Token *
1b050 70 4f 62 6a 4e 61 6d 65 3b 20 20 20 20 20 20 20  pObjName;       
1b060 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
1b070 74 68 65 20 74 61 62 6c 65 20 6f 72 20 69 6e 64  the table or ind
1b080 65 78 20 74 6f 20 62 65 20 72 65 69 6e 64 65 78  ex to be reindex
1b090 65 64 20 2a 2f 0a 0a 20 20 2f 2a 20 52 65 61 64  ed */..  /* Read
1b0a0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 63   the database sc
1b0b0 68 65 6d 61 2e 20 49 66 20 61 6e 20 65 72 72 6f  hema. If an erro
1b0c0 72 20 6f 63 63 75 72 73 2c 20 6c 65 61 76 65 20  r occurs, leave 
1b0d0 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  an error message
1b0e0 0a 20 20 2a 2a 20 61 6e 64 20 63 6f 64 65 20 69  .  ** and code i
1b0f0 6e 20 70 50 61 72 73 65 20 61 6e 64 20 72 65 74  n pParse and ret
1b100 75 72 6e 20 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 69  urn NULL. */.  i
1b110 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71  f( SQLITE_OK!=sq
1b120 6c 69 74 65 33 52 65 61 64 53 63 68 65 6d 61 28  lite3ReadSchema(
1b130 70 50 61 72 73 65 29 20 29 7b 0a 20 20 20 20 72  pParse) ){.    r
1b140 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 69 66  eturn;.  }..  if
1b150 28 20 70 4e 61 6d 65 31 3d 3d 30 20 7c 7c 20 70  ( pName1==0 || p
1b160 4e 61 6d 65 31 2d 3e 7a 3d 3d 30 20 29 7b 0a 20  Name1->z==0 ){. 
1b170 20 20 20 72 65 69 6e 64 65 78 44 61 74 61 62 61     reindexDataba
1b180 73 65 73 28 70 50 61 72 73 65 2c 20 30 29 3b 0a  ses(pParse, 0);.
1b190 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 65      return;.  }e
1b1a0 6c 73 65 20 69 66 28 20 70 4e 61 6d 65 32 3d 3d  lse if( pName2==
1b1b0 30 20 7c 7c 20 70 4e 61 6d 65 32 2d 3e 7a 3d 3d  0 || pName2->z==
1b1c0 30 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a  0 ){.    char *z
1b1d0 43 6f 6c 6c 3b 0a 20 20 20 20 61 73 73 65 72 74  Coll;.    assert
1b1e0 28 20 70 4e 61 6d 65 31 2d 3e 7a 20 29 3b 0a 20  ( pName1->z );. 
1b1f0 20 20 20 7a 43 6f 6c 6c 20 3d 20 73 71 6c 69 74     zColl = sqlit
1b200 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28  e3NameFromToken(
1b210 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 4e 61 6d  pParse->db, pNam
1b220 65 31 29 3b 0a 20 20 20 20 69 66 28 20 21 7a 43  e1);.    if( !zC
1b230 6f 6c 6c 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  oll ) return;.  
1b240 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65    pColl = sqlite
1b250 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28 64 62 2c  3FindCollSeq(db,
1b260 20 45 4e 43 28 64 62 29 2c 20 7a 43 6f 6c 6c 2c   ENC(db), zColl,
1b270 20 2d 31 2c 20 30 29 3b 0a 20 20 20 20 69 66 28   -1, 0);.    if(
1b280 20 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20   pColl ){.      
1b290 69 66 28 20 7a 43 6f 6c 6c 20 29 7b 0a 20 20 20  if( zColl ){.   
1b2a0 20 20 20 20 20 72 65 69 6e 64 65 78 44 61 74 61       reindexData
1b2b0 62 61 73 65 73 28 70 50 61 72 73 65 2c 20 7a 43  bases(pParse, zC
1b2c0 6f 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71  oll);.        sq
1b2d0 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6c 6c  lite3_free(zColl
1b2e0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
1b2f0 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20   return;.    }. 
1b300 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
1b310 7a 43 6f 6c 6c 29 3b 0a 20 20 7d 0a 20 20 69 44  zColl);.  }.  iD
1b320 62 20 3d 20 73 71 6c 69 74 65 33 54 77 6f 50 61  b = sqlite3TwoPa
1b330 72 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 70  rtName(pParse, p
1b340 4e 61 6d 65 31 2c 20 70 4e 61 6d 65 32 2c 20 26  Name1, pName2, &
1b350 70 4f 62 6a 4e 61 6d 65 29 3b 0a 20 20 69 66 28  pObjName);.  if(
1b360 20 69 44 62 3c 30 20 29 20 72 65 74 75 72 6e 3b   iDb<0 ) return;
1b370 0a 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 4e 61  .  z = sqlite3Na
1b380 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20  meFromToken(db, 
1b390 70 4f 62 6a 4e 61 6d 65 29 3b 0a 20 20 69 66 28  pObjName);.  if(
1b3a0 20 7a 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a   z==0 ) return;.
1b3b0 20 20 7a 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b    zDb = db->aDb[
1b3c0 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 70 54  iDb].zName;.  pT
1b3d0 61 62 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64  ab = sqlite3Find
1b3e0 54 61 62 6c 65 28 64 62 2c 20 7a 2c 20 7a 44 62  Table(db, z, zDb
1b3f0 29 3b 0a 20 20 69 66 28 20 70 54 61 62 20 29 7b  );.  if( pTab ){
1b400 0a 20 20 20 20 72 65 69 6e 64 65 78 54 61 62 6c  .    reindexTabl
1b410 65 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20  e(pParse, pTab, 
1b420 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  0);.    sqlite3_
1b430 66 72 65 65 28 7a 29 3b 0a 20 20 20 20 72 65 74  free(z);.    ret
1b440 75 72 6e 3b 0a 20 20 7d 0a 20 20 70 49 6e 64 65  urn;.  }.  pInde
1b450 78 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 49  x = sqlite3FindI
1b460 6e 64 65 78 28 64 62 2c 20 7a 2c 20 7a 44 62 29  ndex(db, z, zDb)
1b470 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ;.  sqlite3_free
1b480 28 7a 29 3b 0a 20 20 69 66 28 20 70 49 6e 64 65  (z);.  if( pInde
1b490 78 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  x ){.    sqlite3
1b4a0 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74  BeginWriteOperat
1b4b0 69 6f 6e 28 70 50 61 72 73 65 2c 20 30 2c 20 69  ion(pParse, 0, i
1b4c0 44 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Db);.    sqlite3
1b4d0 52 65 66 69 6c 6c 49 6e 64 65 78 28 70 50 61 72  RefillIndex(pPar
1b4e0 73 65 2c 20 70 49 6e 64 65 78 2c 20 2d 31 29 3b  se, pIndex, -1);
1b4f0 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
1b500 0a 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d  .  sqlite3ErrorM
1b510 73 67 28 70 50 61 72 73 65 2c 20 22 75 6e 61 62  sg(pParse, "unab
1b520 6c 65 20 74 6f 20 69 64 65 6e 74 69 66 79 20 74  le to identify t
1b530 68 65 20 6f 62 6a 65 63 74 20 74 6f 20 62 65 20  he object to be 
1b540 72 65 69 6e 64 65 78 65 64 22 29 3b 0a 7d 0a 23  reindexed");.}.#
1b550 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  endif../*.** Ret
1b560 75 72 6e 20 61 20 64 79 6e 61 6d 69 63 6c 79 20  urn a dynamicly 
1b570 61 6c 6c 6f 63 61 74 65 64 20 4b 65 79 49 6e 66  allocated KeyInf
1b580 6f 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74  o structure that
1b590 20 63 61 6e 20 62 65 20 75 73 65 64 0a 2a 2a 20   can be used.** 
1b5a0 77 69 74 68 20 4f 50 5f 4f 70 65 6e 52 65 61 64  with OP_OpenRead
1b5b0 20 6f 72 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65   or OP_OpenWrite
1b5c0 20 74 6f 20 61 63 63 65 73 73 20 64 61 74 61 62   to access datab
1b5d0 61 73 65 20 69 6e 64 65 78 20 70 49 64 78 2e 0a  ase index pIdx..
1b5e0 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73  **.** If success
1b5f0 66 75 6c 2c 20 61 20 70 6f 69 6e 74 65 72 20 74  ful, a pointer t
1b600 6f 20 74 68 65 20 6e 65 77 20 73 74 72 75 63 74  o the new struct
1b610 75 72 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ure is returned.
1b620 20 49 6e 20 74 68 69 73 20 63 61 73 65 0a 2a 2a   In this case.**
1b630 20 74 68 65 20 63 61 6c 6c 65 72 20 69 73 20 72   the caller is r
1b640 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 63  esponsible for c
1b650 61 6c 6c 69 6e 67 20 73 71 6c 69 74 65 33 5f 66  alling sqlite3_f
1b660 72 65 65 28 29 20 6f 6e 20 74 68 65 20 72 65 74  ree() on the ret
1b670 75 72 6e 65 64 20 0a 2a 2a 20 70 6f 69 6e 74 65  urned .** pointe
1b680 72 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  r. If an error o
1b690 63 63 75 72 73 20 28 6f 75 74 20 6f 66 20 6d 65  ccurs (out of me
1b6a0 6d 6f 72 79 20 6f 72 20 6d 69 73 73 69 6e 67 20  mory or missing 
1b6b0 63 6f 6c 6c 61 74 69 6f 6e 20 0a 2a 2a 20 73 65  collation .** se
1b6c0 71 75 65 6e 63 65 29 2c 20 4e 55 4c 4c 20 69 73  quence), NULL is
1b6d0 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 74 68   returned and th
1b6e0 65 20 73 74 61 74 65 20 6f 66 20 70 50 61 72 73  e state of pPars
1b6f0 65 20 75 70 64 61 74 65 64 20 74 6f 20 72 65 66  e updated to ref
1b700 6c 65 63 74 0a 2a 2a 20 74 68 65 20 65 72 72 6f  lect.** the erro
1b710 72 2e 0a 2a 2f 0a 4b 65 79 49 6e 66 6f 20 2a 73  r..*/.KeyInfo *s
1b720 71 6c 69 74 65 33 49 6e 64 65 78 4b 65 79 69 6e  qlite3IndexKeyin
1b730 66 6f 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  fo(Parse *pParse
1b740 2c 20 49 6e 64 65 78 20 2a 70 49 64 78 29 7b 0a  , Index *pIdx){.
1b750 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e    int i;.  int n
1b760 43 6f 6c 20 3d 20 70 49 64 78 2d 3e 6e 43 6f 6c  Col = pIdx->nCol
1b770 75 6d 6e 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65  umn;.  int nByte
1b780 73 20 3d 20 73 69 7a 65 6f 66 28 4b 65 79 49 6e  s = sizeof(KeyIn
1b790 66 6f 29 20 2b 20 28 6e 43 6f 6c 2d 31 29 2a 73  fo) + (nCol-1)*s
1b7a0 69 7a 65 6f 66 28 43 6f 6c 6c 53 65 71 2a 29 20  izeof(CollSeq*) 
1b7b0 2b 20 6e 43 6f 6c 3b 0a 20 20 4b 65 79 49 6e 66  + nCol;.  KeyInf
1b7c0 6f 20 2a 70 4b 65 79 20 3d 20 28 4b 65 79 49 6e  o *pKey = (KeyIn
1b7d0 66 6f 20 2a 29 73 71 6c 69 74 65 33 44 62 4d 61  fo *)sqlite3DbMa
1b7e0 6c 6c 6f 63 5a 65 72 6f 28 70 50 61 72 73 65 2d  llocZero(pParse-
1b7f0 3e 64 62 2c 20 6e 42 79 74 65 73 29 3b 0a 0a 20  >db, nBytes);.. 
1b800 20 69 66 28 20 70 4b 65 79 20 29 7b 0a 20 20 20   if( pKey ){.   
1b810 20 70 4b 65 79 2d 3e 64 62 20 3d 20 70 50 61 72   pKey->db = pPar
1b820 73 65 2d 3e 64 62 3b 0a 20 20 20 20 70 4b 65 79  se->db;.    pKey
1b830 2d 3e 61 53 6f 72 74 4f 72 64 65 72 20 3d 20 28  ->aSortOrder = (
1b840 75 38 20 2a 29 26 28 70 4b 65 79 2d 3e 61 43 6f  u8 *)&(pKey->aCo
1b850 6c 6c 5b 6e 43 6f 6c 5d 29 3b 0a 20 20 20 20 61  ll[nCol]);.    a
1b860 73 73 65 72 74 28 20 26 70 4b 65 79 2d 3e 61 53  ssert( &pKey->aS
1b870 6f 72 74 4f 72 64 65 72 5b 6e 43 6f 6c 5d 3d 3d  ortOrder[nCol]==
1b880 26 28 28 28 75 38 20 2a 29 70 4b 65 79 29 5b 6e  &(((u8 *)pKey)[n
1b890 42 79 74 65 73 5d 29 20 29 3b 0a 20 20 20 20 66  Bytes]) );.    f
1b8a0 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20  or(i=0; i<nCol; 
1b8b0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 63 68 61 72  i++){.      char
1b8c0 20 2a 7a 43 6f 6c 6c 20 3d 20 70 49 64 78 2d 3e   *zColl = pIdx->
1b8d0 61 7a 43 6f 6c 6c 5b 69 5d 3b 0a 20 20 20 20 20  azColl[i];.     
1b8e0 20 61 73 73 65 72 74 28 20 7a 43 6f 6c 6c 20 29   assert( zColl )
1b8f0 3b 0a 20 20 20 20 20 20 70 4b 65 79 2d 3e 61 43  ;.      pKey->aC
1b900 6f 6c 6c 5b 69 5d 20 3d 20 73 71 6c 69 74 65 33  oll[i] = sqlite3
1b910 4c 6f 63 61 74 65 43 6f 6c 6c 53 65 71 28 70 50  LocateCollSeq(pP
1b920 61 72 73 65 2c 20 7a 43 6f 6c 6c 2c 20 2d 31 29  arse, zColl, -1)
1b930 3b 0a 20 20 20 20 20 20 70 4b 65 79 2d 3e 61 53  ;.      pKey->aS
1b940 6f 72 74 4f 72 64 65 72 5b 69 5d 20 3d 20 70 49  ortOrder[i] = pI
1b950 64 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69  dx->aSortOrder[i
1b960 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4b 65  ];.    }.    pKe
1b970 79 2d 3e 6e 46 69 65 6c 64 20 3d 20 6e 43 6f 6c  y->nField = nCol
1b980 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 50 61  ;.  }..  if( pPa
1b990 72 73 65 2d 3e 6e 45 72 72 20 29 7b 0a 20 20 20  rse->nErr ){.   
1b9a0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4b   sqlite3_free(pK
1b9b0 65 79 29 3b 0a 20 20 20 20 70 4b 65 79 20 3d 20  ey);.    pKey = 
1b9c0 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
1b9d0 70 4b 65 79 3b 0a 7d 0a                          pKey;.}.