/ Hex Artifact Content
Login

Artifact 353cce0f4e773b0889d94663dca6dc99598d6b3d:


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 36 34 20 32 30 30 38 2f 30 31 2f 31 32  1.464 2008/01/12
02f0: 20 31 32 3a 34 38 3a 30 38 20 64 72 68 20 45 78   12:48:08 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 69 66 28 20 70 2d 3e 69 73 57  ;.    if( p->isW
0cc0: 72 69 74 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20  riteLock ){.    
0cd0: 20 20 70 31 20 3d 20 2d 31 2a 28 70 31 2b 31 29    p1 = -1*(p1+1)
0ce0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
0cf0: 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 70 56  te3VdbeAddOp4(pV
0d00: 64 62 65 2c 20 4f 50 5f 54 61 62 6c 65 4c 6f 63  dbe, OP_TableLoc
0d10: 6b 2c 20 70 31 2c 20 70 2d 3e 69 54 61 62 2c 20  k, p1, p->iTab, 
0d20: 30 2c 20 70 2d 3e 7a 4e 61 6d 65 2c 20 50 34 5f  0, p->zName, P4_
0d30: 53 54 41 54 49 43 29 3b 0a 20 20 7d 0a 7d 0a 23  STATIC);.  }.}.#
0d40: 65 6c 73 65 0a 20 20 23 64 65 66 69 6e 65 20 63  else.  #define c
0d50: 6f 64 65 54 61 62 6c 65 4c 6f 63 6b 73 28 78 29  odeTableLocks(x)
0d60: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54  .#endif../*.** T
0d70: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
0d80: 61 6c 6c 65 64 20 61 66 74 65 72 20 61 20 73 69  alled after a si
0d90: 6e 67 6c 65 20 53 51 4c 20 73 74 61 74 65 6d 65  ngle SQL stateme
0da0: 6e 74 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20 70  nt has been.** p
0db0: 61 72 73 65 64 20 61 6e 64 20 61 20 56 44 42 45  arsed and a VDBE
0dc0: 20 70 72 6f 67 72 61 6d 20 74 6f 20 65 78 65 63   program to exec
0dd0: 75 74 65 20 74 68 61 74 20 73 74 61 74 65 6d 65  ute that stateme
0de0: 6e 74 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20 70  nt has been.** p
0df0: 72 65 70 61 72 65 64 2e 20 20 54 68 69 73 20 72  repared.  This r
0e00: 6f 75 74 69 6e 65 20 70 75 74 73 20 74 68 65 20  outine puts the 
0e10: 66 69 6e 69 73 68 69 6e 67 20 74 6f 75 63 68 65  finishing touche
0e20: 73 20 6f 6e 20 74 68 65 0a 2a 2a 20 56 44 42 45  s on the.** VDBE
0e30: 20 70 72 6f 67 72 61 6d 20 61 6e 64 20 72 65 73   program and res
0e40: 65 74 73 20 74 68 65 20 70 50 61 72 73 65 20 73  ets the pParse s
0e50: 74 72 75 63 74 75 72 65 20 66 6f 72 20 74 68 65  tructure for the
0e60: 20 6e 65 78 74 0a 2a 2a 20 70 61 72 73 65 2e 0a   next.** parse..
0e70: 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20  **.** Note that 
0e80: 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  if an error occu
0e90: 72 72 65 64 2c 20 69 74 20 6d 69 67 68 74 20 62  rred, it might b
0ea0: 65 20 74 68 65 20 63 61 73 65 20 74 68 61 74 0a  e the case that.
0eb0: 2a 2a 20 6e 6f 20 56 44 42 45 20 63 6f 64 65 20  ** no VDBE code 
0ec0: 77 61 73 20 67 65 6e 65 72 61 74 65 64 2e 0a 2a  was generated..*
0ed0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 46 69  /.void sqlite3Fi
0ee0: 6e 69 73 68 43 6f 64 69 6e 67 28 50 61 72 73 65  nishCoding(Parse
0ef0: 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 73 71 6c   *pParse){.  sql
0f00: 69 74 65 33 20 2a 64 62 3b 0a 20 20 56 64 62 65  ite3 *db;.  Vdbe
0f10: 20 2a 76 3b 0a 0a 20 20 64 62 20 3d 20 70 50 61   *v;..  db = pPa
0f20: 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20 64  rse->db;.  if( d
0f30: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
0f40: 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
0f50: 70 50 61 72 73 65 2d 3e 6e 65 73 74 65 64 20 29  pParse->nested )
0f60: 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 21   return;.  if( !
0f70: 70 50 61 72 73 65 2d 3e 70 56 64 62 65 20 29 7b  pParse->pVdbe ){
0f80: 0a 20 20 20 20 69 66 28 20 70 50 61 72 73 65 2d  .    if( pParse-
0f90: 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26  >rc==SQLITE_OK &
0fa0: 26 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29  & pParse->nErr )
0fb0: 7b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  {.      pParse->
0fc0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f  rc = SQLITE_ERRO
0fd0: 52 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b  R;.      return;
0fe0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
0ff0: 20 42 65 67 69 6e 20 62 79 20 67 65 6e 65 72 61   Begin by genera
1000: 74 69 6e 67 20 73 6f 6d 65 20 74 65 72 6d 69 6e  ting some termin
1010: 61 74 69 6f 6e 20 63 6f 64 65 20 61 74 20 74 68  ation code at th
1020: 65 20 65 6e 64 20 6f 66 20 74 68 65 0a 20 20 2a  e end of the.  *
1030: 2a 20 76 64 62 65 20 70 72 6f 67 72 61 6d 0a 20  * vdbe program. 
1040: 20 2a 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74 65   */.  v = sqlite
1050: 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
1060: 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20  ;.  if( v ){.   
1070: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1080: 70 30 28 76 2c 20 4f 50 5f 48 61 6c 74 29 3b 0a  p0(v, OP_Halt);.
1090: 0a 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6f 6b  .    /* The cook
10a0: 69 65 20 6d 61 73 6b 20 63 6f 6e 74 61 69 6e 73  ie mask contains
10b0: 20 6f 6e 65 20 62 69 74 20 66 6f 72 20 65 61 63   one bit for eac
10c0: 68 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  h database file 
10d0: 6f 70 65 6e 2e 0a 20 20 20 20 2a 2a 20 28 42 69  open..    ** (Bi
10e0: 74 20 30 20 69 73 20 66 6f 72 20 6d 61 69 6e 2c  t 0 is for main,
10f0: 20 62 69 74 20 31 20 69 73 20 66 6f 72 20 74 65   bit 1 is for te
1100: 6d 70 2c 20 61 6e 64 20 73 6f 20 66 6f 72 74 68  mp, and so forth
1110: 2e 29 20 20 42 69 74 73 20 61 72 65 0a 20 20 20  .)  Bits are.   
1120: 20 2a 2a 20 73 65 74 20 66 6f 72 20 65 61 63 68   ** set for each
1130: 20 64 61 74 61 62 61 73 65 20 74 68 61 74 20 69   database that i
1140: 73 20 75 73 65 64 2e 20 20 47 65 6e 65 72 61 74  s used.  Generat
1150: 65 20 63 6f 64 65 20 74 6f 20 73 74 61 72 74 20  e code to start 
1160: 61 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63  a.    ** transac
1170: 74 69 6f 6e 20 6f 6e 20 65 61 63 68 20 75 73 65  tion on each use
1180: 64 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 74  d database and t
1190: 6f 20 76 65 72 69 66 79 20 74 68 65 20 73 63 68  o verify the sch
11a0: 65 6d 61 20 63 6f 6f 6b 69 65 0a 20 20 20 20 2a  ema cookie.    *
11b0: 2a 20 6f 6e 20 65 61 63 68 20 75 73 65 64 20 64  * on each used d
11c0: 61 74 61 62 61 73 65 2e 0a 20 20 20 20 2a 2f 0a  atabase..    */.
11d0: 20 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e      if( pParse->
11e0: 63 6f 6f 6b 69 65 47 6f 74 6f 3e 30 20 29 7b 0a  cookieGoto>0 ){.
11f0: 20 20 20 20 20 20 75 33 32 20 6d 61 73 6b 3b 0a        u32 mask;.
1200: 20 20 20 20 20 20 69 6e 74 20 69 44 62 3b 0a 20        int iDb;. 
1210: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1220: 4a 75 6d 70 48 65 72 65 28 76 2c 20 70 50 61 72  JumpHere(v, pPar
1230: 73 65 2d 3e 63 6f 6f 6b 69 65 47 6f 74 6f 2d 31  se->cookieGoto-1
1240: 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 44 62  );.      for(iDb
1250: 3d 30 2c 20 6d 61 73 6b 3d 31 3b 20 69 44 62 3c  =0, mask=1; iDb<
1260: 64 62 2d 3e 6e 44 62 3b 20 6d 61 73 6b 3c 3c 3d  db->nDb; mask<<=
1270: 31 2c 20 69 44 62 2b 2b 29 7b 0a 20 20 20 20 20  1, iDb++){.     
1280: 20 20 20 69 66 28 20 28 6d 61 73 6b 20 26 20 70     if( (mask & p
1290: 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 4d 61 73  Parse->cookieMas
12a0: 6b 29 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  k)==0 ) continue
12b0: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
12c0: 33 56 64 62 65 55 73 65 73 42 74 72 65 65 28 76  3VdbeUsesBtree(v
12d0: 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20 20 20  , iDb);.        
12e0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
12f0: 32 28 76 2c 4f 50 5f 54 72 61 6e 73 61 63 74 69  2(v,OP_Transacti
1300: 6f 6e 2c 20 69 44 62 2c 20 28 6d 61 73 6b 20 26  on, iDb, (mask &
1310: 20 70 50 61 72 73 65 2d 3e 77 72 69 74 65 4d 61   pParse->writeMa
1320: 73 6b 29 21 3d 30 29 3b 0a 20 20 20 20 20 20 20  sk)!=0);.       
1330: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1340: 70 32 28 76 2c 4f 50 5f 56 65 72 69 66 79 43 6f  p2(v,OP_VerifyCo
1350: 6f 6b 69 65 2c 20 69 44 62 2c 20 70 50 61 72 73  okie, iDb, pPars
1360: 65 2d 3e 63 6f 6f 6b 69 65 56 61 6c 75 65 5b 69  e->cookieValue[i
1370: 44 62 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 23 69  Db]);.      }.#i
1380: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1390: 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20  T_VIRTUALTABLE. 
13a0: 20 20 20 20 20 69 66 28 20 70 50 61 72 73 65 2d       if( pParse-
13b0: 3e 70 56 69 72 74 75 61 6c 4c 6f 63 6b 20 29 7b  >pVirtualLock ){
13c0: 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 76  .        char *v
13d0: 74 61 62 20 3d 20 28 63 68 61 72 20 2a 29 70 50  tab = (char *)pP
13e0: 61 72 73 65 2d 3e 70 56 69 72 74 75 61 6c 4c 6f  arse->pVirtualLo
13f0: 63 6b 2d 3e 70 56 74 61 62 3b 0a 20 20 20 20 20  ck->pVtab;.     
1400: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1410: 64 4f 70 34 28 76 2c 20 4f 50 5f 56 42 65 67 69  dOp4(v, OP_VBegi
1420: 6e 2c 20 30 2c 20 30 2c 20 30 2c 20 76 74 61 62  n, 0, 0, 0, vtab
1430: 2c 20 50 34 5f 56 54 41 42 29 3b 0a 20 20 20 20  , P4_VTAB);.    
1440: 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20    }.#endif..    
1450: 20 20 2f 2a 20 4f 6e 63 65 20 61 6c 6c 20 74 68    /* Once all th
1460: 65 20 63 6f 6f 6b 69 65 73 20 68 61 76 65 20 62  e cookies have b
1470: 65 65 6e 20 76 65 72 69 66 69 65 64 20 61 6e 64  een verified and
1480: 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 6f 70   transactions op
1490: 65 6e 65 64 2c 20 0a 20 20 20 20 20 20 2a 2a 20  ened, .      ** 
14a0: 6f 62 74 61 69 6e 20 74 68 65 20 72 65 71 75 69  obtain the requi
14b0: 72 65 64 20 74 61 62 6c 65 2d 6c 6f 63 6b 73 2e  red table-locks.
14c0: 20 54 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70   This is a no-op
14d0: 20 75 6e 6c 65 73 73 20 74 68 65 20 0a 20 20 20   unless the .   
14e0: 20 20 20 2a 2a 20 73 68 61 72 65 64 2d 63 61 63     ** shared-cac
14f0: 68 65 20 66 65 61 74 75 72 65 20 69 73 20 65 6e  he feature is en
1500: 61 62 6c 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a  abled..      */.
1510: 20 20 20 20 20 20 63 6f 64 65 54 61 62 6c 65 4c        codeTableL
1520: 6f 63 6b 73 28 70 50 61 72 73 65 29 3b 0a 20 20  ocks(pParse);.  
1530: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1540: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f  ddOp2(v, OP_Goto
1550: 2c 20 30 2c 20 70 50 61 72 73 65 2d 3e 63 6f 6f  , 0, pParse->coo
1560: 6b 69 65 47 6f 74 6f 29 3b 0a 20 20 20 20 7d 0a  kieGoto);.    }.
1570: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1580: 4f 4d 49 54 5f 54 52 41 43 45 0a 20 20 20 20 2f  OMIT_TRACE.    /
1590: 2a 20 41 64 64 20 61 20 4e 6f 2d 6f 70 20 74 68  * Add a No-op th
15a0: 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  at contains the 
15b0: 63 6f 6d 70 6c 65 74 65 20 74 65 78 74 20 6f 66  complete text of
15c0: 20 74 68 65 20 63 6f 6d 70 69 6c 65 64 20 53 51   the compiled SQ
15d0: 4c 0a 20 20 20 20 2a 2a 20 73 74 61 74 65 6d 65  L.    ** stateme
15e0: 6e 74 20 61 73 20 69 74 73 20 50 34 20 61 72 67  nt as its P4 arg
15f0: 75 6d 65 6e 74 2e 20 20 54 68 69 73 20 64 6f 65  ument.  This doe
1600: 73 20 6e 6f 74 20 63 68 61 6e 67 65 20 74 68 65  s not change the
1610: 20 66 75 6e 63 74 69 6f 6e 61 6c 69 74 79 0a 20   functionality. 
1620: 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 70 72 6f     ** of the pro
1630: 67 72 61 6d 2e 20 0a 20 20 20 20 2a 2a 0a 20 20  gram. .    **.  
1640: 20 20 2a 2a 20 54 68 69 73 20 69 73 20 75 73 65    ** This is use
1650: 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 73  d to implement s
1660: 71 6c 69 74 65 33 5f 74 72 61 63 65 28 29 2e 0a  qlite3_trace()..
1670: 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74      */.    sqlit
1680: 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
1690: 4f 50 5f 4e 6f 6f 70 2c 20 30 2c 20 30 2c 20 30  OP_Noop, 0, 0, 0
16a0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
16b0: 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e          pParse->
16c0: 7a 53 71 6c 2c 20 70 50 61 72 73 65 2d 3e 7a 54  zSql, pParse->zT
16d0: 61 69 6c 2d 70 50 61 72 73 65 2d 3e 7a 53 71 6c  ail-pParse->zSql
16e0: 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  );.#endif /* SQL
16f0: 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 20 2a  ITE_OMIT_TRACE *
1700: 2f 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20 47 65 74  /.  }...  /* Get
1710: 20 74 68 65 20 56 44 42 45 20 70 72 6f 67 72 61   the VDBE progra
1720: 6d 20 72 65 61 64 79 20 66 6f 72 20 65 78 65 63  m ready for exec
1730: 75 74 69 6f 6e 0a 20 20 2a 2f 0a 20 20 69 66 28  ution.  */.  if(
1740: 20 76 20 26 26 20 70 50 61 72 73 65 2d 3e 6e 45   v && pParse->nE
1750: 72 72 3d 3d 30 20 26 26 20 21 64 62 2d 3e 6d 61  rr==0 && !db->ma
1760: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 23 69  llocFailed ){.#i
1770: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
1780: 47 0a 20 20 20 20 46 49 4c 45 20 2a 74 72 61 63  G.    FILE *trac
1790: 65 20 3d 20 28 64 62 2d 3e 66 6c 61 67 73 20 26  e = (db->flags &
17a0: 20 53 51 4c 49 54 45 5f 56 64 62 65 54 72 61 63   SQLITE_VdbeTrac
17b0: 65 29 21 3d 30 20 3f 20 73 74 64 6f 75 74 20 3a  e)!=0 ? stdout :
17c0: 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   0;.    sqlite3V
17d0: 64 62 65 54 72 61 63 65 28 76 2c 20 74 72 61 63  dbeTrace(v, trac
17e0: 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 73  e);.#endif.    s
17f0: 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 52 65  qlite3VdbeMakeRe
1800: 61 64 79 28 76 2c 20 70 50 61 72 73 65 2d 3e 6e  ady(v, pParse->n
1810: 56 61 72 2c 20 70 50 61 72 73 65 2d 3e 6e 4d 65  Var, pParse->nMe
1820: 6d 2b 33 2c 0a 20 20 20 20 20 20 20 20 20 20 20  m+3,.           
1830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 50                pP
1840: 61 72 73 65 2d 3e 6e 54 61 62 2b 33 2c 20 70 50  arse->nTab+3, pP
1850: 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 29 3b 0a  arse->explain);.
1860: 20 20 20 20 70 50 61 72 73 65 2d 3e 72 63 20 3d      pParse->rc =
1870: 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20   SQLITE_DONE;.  
1880: 20 20 70 50 61 72 73 65 2d 3e 63 6f 6c 4e 61 6d    pParse->colNam
1890: 65 73 53 65 74 20 3d 20 30 3b 0a 20 20 7d 65 6c  esSet = 0;.  }el
18a0: 73 65 20 69 66 28 20 70 50 61 72 73 65 2d 3e 72  se if( pParse->r
18b0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
18c0: 20 20 20 20 70 50 61 72 73 65 2d 3e 72 63 20 3d      pParse->rc =
18d0: 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
18e0: 20 7d 0a 20 20 70 50 61 72 73 65 2d 3e 6e 54 61   }.  pParse->nTa
18f0: 62 20 3d 20 30 3b 0a 20 20 70 50 61 72 73 65 2d  b = 0;.  pParse-
1900: 3e 6e 4d 65 6d 20 3d 20 30 3b 0a 20 20 70 50 61  >nMem = 0;.  pPa
1910: 72 73 65 2d 3e 6e 53 65 74 20 3d 20 30 3b 0a 20  rse->nSet = 0;. 
1920: 20 70 50 61 72 73 65 2d 3e 6e 56 61 72 20 3d 20   pParse->nVar = 
1930: 30 3b 0a 20 20 70 50 61 72 73 65 2d 3e 63 6f 6f  0;.  pParse->coo
1940: 6b 69 65 4d 61 73 6b 20 3d 20 30 3b 0a 20 20 70  kieMask = 0;.  p
1950: 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 47 6f 74  Parse->cookieGot
1960: 6f 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  o = 0;.}../*.** 
1970: 52 75 6e 20 74 68 65 20 70 61 72 73 65 72 20 61  Run the parser a
1980: 6e 64 20 63 6f 64 65 20 67 65 6e 65 72 61 74 6f  nd code generato
1990: 72 20 72 65 63 75 72 73 69 76 65 6c 79 20 69 6e  r recursively in
19a0: 20 6f 72 64 65 72 20 74 6f 20 67 65 6e 65 72 61   order to genera
19b0: 74 65 0a 2a 2a 20 63 6f 64 65 20 66 6f 72 20 74  te.** code for t
19c0: 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  he SQL statement
19d0: 20 67 69 76 65 6e 20 6f 6e 74 6f 20 74 68 65 20   given onto the 
19e0: 65 6e 64 20 6f 66 20 74 68 65 20 70 50 61 72 73  end of the pPars
19f0: 65 20 63 6f 6e 74 65 78 74 0a 2a 2a 20 63 75 72  e context.** cur
1a00: 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e  rently under con
1a10: 73 74 72 75 63 74 69 6f 6e 2e 20 20 57 68 65 6e  struction.  When
1a20: 20 74 68 65 20 70 61 72 73 65 72 20 69 73 20 72   the parser is r
1a30: 75 6e 20 72 65 63 75 72 73 69 76 65 6c 79 0a 2a  un recursively.*
1a40: 2a 20 74 68 69 73 20 77 61 79 2c 20 74 68 65 20  * this way, the 
1a50: 66 69 6e 61 6c 20 4f 50 5f 48 61 6c 74 20 69 73  final OP_Halt is
1a60: 20 6e 6f 74 20 61 70 70 65 6e 64 65 64 20 61 6e   not appended an
1a70: 64 20 6f 74 68 65 72 20 69 6e 69 74 69 61 6c 69  d other initiali
1a80: 7a 61 74 69 6f 6e 0a 2a 2a 20 61 6e 64 20 66 69  zation.** and fi
1a90: 6e 61 6c 69 7a 61 74 69 6f 6e 20 73 74 65 70 73  nalization steps
1aa0: 20 61 72 65 20 6f 6d 69 74 74 65 64 20 62 65 63   are omitted bec
1ab0: 61 75 73 65 20 74 68 6f 73 65 20 61 72 65 20 68  ause those are h
1ac0: 61 6e 64 6c 69 6e 67 20 62 79 20 74 68 65 0a 2a  andling by the.*
1ad0: 2a 20 6f 75 74 65 72 6d 6f 73 74 20 70 61 72 73  * outermost pars
1ae0: 65 72 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 20 65 76  er..**.** Not ev
1af0: 65 72 79 74 68 69 6e 67 20 69 73 20 6e 65 73 74  erything is nest
1b00: 61 62 6c 65 2e 20 20 54 68 69 73 20 66 61 63 69  able.  This faci
1b10: 6c 69 74 79 20 69 73 20 64 65 73 69 67 6e 65 64  lity is designed
1b20: 20 74 6f 20 70 65 72 6d 69 74 0a 2a 2a 20 49 4e   to permit.** IN
1b30: 53 45 52 54 2c 20 55 50 44 41 54 45 2c 20 61 6e  SERT, UPDATE, an
1b40: 64 20 44 45 4c 45 54 45 20 6f 70 65 72 61 74 69  d DELETE operati
1b50: 6f 6e 73 20 61 67 61 69 6e 73 74 20 53 51 4c 49  ons against SQLI
1b60: 54 45 5f 4d 41 53 54 45 52 2e 20 20 55 73 65 0a  TE_MASTER.  Use.
1b70: 2a 2a 20 63 61 72 65 20 69 66 20 79 6f 75 20 64  ** care if you d
1b80: 65 63 69 64 65 20 74 6f 20 74 72 79 20 74 6f 20  ecide to try to 
1b90: 75 73 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65  use this routine
1ba0: 20 66 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 20   for some other 
1bb0: 70 75 72 70 6f 73 65 73 2e 0a 2a 2f 0a 76 6f 69  purposes..*/.voi
1bc0: 64 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50  d sqlite3NestedP
1bd0: 61 72 73 65 28 50 61 72 73 65 20 2a 70 50 61 72  arse(Parse *pPar
1be0: 73 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  se, const char *
1bf0: 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20  zFormat, ...){. 
1c00: 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 63   va_list ap;.  c
1c10: 68 61 72 20 2a 7a 53 71 6c 3b 0a 23 20 64 65 66  har *zSql;.# def
1c20: 69 6e 65 20 53 41 56 45 5f 53 5a 20 20 28 73 69  ine SAVE_SZ  (si
1c30: 7a 65 6f 66 28 50 61 72 73 65 29 20 2d 20 6f 66  zeof(Parse) - of
1c40: 66 73 65 74 6f 66 28 50 61 72 73 65 2c 6e 56 61  fsetof(Parse,nVa
1c50: 72 29 29 0a 20 20 63 68 61 72 20 73 61 76 65 42  r)).  char saveB
1c60: 75 66 5b 53 41 56 45 5f 53 5a 5d 3b 0a 0a 20 20  uf[SAVE_SZ];..  
1c70: 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  if( pParse->nErr
1c80: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73   ) return;.  ass
1c90: 65 72 74 28 20 70 50 61 72 73 65 2d 3e 6e 65 73  ert( pParse->nes
1ca0: 74 65 64 3c 31 30 20 29 3b 20 20 2f 2a 20 4e 65  ted<10 );  /* Ne
1cb0: 73 74 69 6e 67 20 73 68 6f 75 6c 64 20 6f 6e 6c  sting should onl
1cc0: 79 20 62 65 20 6f 66 20 6c 69 6d 69 74 65 64 20  y be of limited 
1cd0: 64 65 70 74 68 20 2a 2f 0a 20 20 76 61 5f 73 74  depth */.  va_st
1ce0: 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61 74 29  art(ap, zFormat)
1cf0: 3b 0a 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74  ;.  zSql = sqlit
1d00: 65 33 56 4d 50 72 69 6e 74 66 28 70 50 61 72 73  e3VMPrintf(pPars
1d10: 65 2d 3e 64 62 2c 20 7a 46 6f 72 6d 61 74 2c 20  e->db, zFormat, 
1d20: 61 70 29 3b 0a 20 20 76 61 5f 65 6e 64 28 61 70  ap);.  va_end(ap
1d30: 29 3b 0a 20 20 69 66 28 20 7a 53 71 6c 3d 3d 30  );.  if( zSql==0
1d40: 20 29 7b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e   ){.    pParse->
1d50: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
1d60: 20 3d 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e   = 1;.    return
1d70: 3b 20 20 20 2f 2a 20 41 20 6d 61 6c 6c 6f 63 20  ;   /* A malloc 
1d80: 6d 75 73 74 20 68 61 76 65 20 66 61 69 6c 65 64  must have failed
1d90: 20 2a 2f 0a 20 20 7d 0a 20 20 70 50 61 72 73 65   */.  }.  pParse
1da0: 2d 3e 6e 65 73 74 65 64 2b 2b 3b 0a 20 20 6d 65  ->nested++;.  me
1db0: 6d 63 70 79 28 73 61 76 65 42 75 66 2c 20 26 70  mcpy(saveBuf, &p
1dc0: 50 61 72 73 65 2d 3e 6e 56 61 72 2c 20 53 41 56  Parse->nVar, SAV
1dd0: 45 5f 53 5a 29 3b 0a 20 20 6d 65 6d 73 65 74 28  E_SZ);.  memset(
1de0: 26 70 50 61 72 73 65 2d 3e 6e 56 61 72 2c 20 30  &pParse->nVar, 0
1df0: 2c 20 53 41 56 45 5f 53 5a 29 3b 0a 20 20 73 71  , SAVE_SZ);.  sq
1e00: 6c 69 74 65 33 52 75 6e 50 61 72 73 65 72 28 70  lite3RunParser(p
1e10: 50 61 72 73 65 2c 20 7a 53 71 6c 2c 20 30 29 3b  Parse, zSql, 0);
1e20: 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
1e30: 7a 53 71 6c 29 3b 0a 20 20 6d 65 6d 63 70 79 28  zSql);.  memcpy(
1e40: 26 70 50 61 72 73 65 2d 3e 6e 56 61 72 2c 20 73  &pParse->nVar, s
1e50: 61 76 65 42 75 66 2c 20 53 41 56 45 5f 53 5a 29  aveBuf, SAVE_SZ)
1e60: 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 65 73 74  ;.  pParse->nest
1e70: 65 64 2d 2d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c  ed--;.}../*.** L
1e80: 6f 63 61 74 65 20 74 68 65 20 69 6e 2d 6d 65 6d  ocate the in-mem
1e90: 6f 72 79 20 73 74 72 75 63 74 75 72 65 20 74 68  ory structure th
1ea0: 61 74 20 64 65 73 63 72 69 62 65 73 20 61 20 70  at describes a p
1eb0: 61 72 74 69 63 75 6c 61 72 20 64 61 74 61 62 61  articular databa
1ec0: 73 65 0a 2a 2a 20 74 61 62 6c 65 20 67 69 76 65  se.** table give
1ed0: 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  n the name of th
1ee0: 61 74 20 74 61 62 6c 65 20 61 6e 64 20 28 6f 70  at table and (op
1ef0: 74 69 6f 6e 61 6c 6c 79 29 20 74 68 65 20 6e 61  tionally) the na
1f00: 6d 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74  me of the.** dat
1f10: 61 62 61 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67  abase containing
1f20: 20 74 68 65 20 74 61 62 6c 65 2e 20 20 52 65 74   the table.  Ret
1f30: 75 72 6e 20 4e 55 4c 4c 20 69 66 20 6e 6f 74 20  urn NULL if not 
1f40: 66 6f 75 6e 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  found..**.** If 
1f50: 7a 44 61 74 61 62 61 73 65 20 69 73 20 30 2c 20  zDatabase is 0, 
1f60: 61 6c 6c 20 64 61 74 61 62 61 73 65 73 20 61 72  all databases ar
1f70: 65 20 73 65 61 72 63 68 65 64 20 66 6f 72 20 74  e searched for t
1f80: 68 65 20 74 61 62 6c 65 20 61 6e 64 20 74 68 65  he table and the
1f90: 0a 2a 2a 20 66 69 72 73 74 20 6d 61 74 63 68 69  .** first matchi
1fa0: 6e 67 20 74 61 62 6c 65 20 69 73 20 72 65 74 75  ng table is retu
1fb0: 72 6e 65 64 2e 20 20 28 4e 6f 20 63 68 65 63 6b  rned.  (No check
1fc0: 69 6e 67 20 66 6f 72 20 64 75 70 6c 69 63 61 74  ing for duplicat
1fd0: 65 20 74 61 62 6c 65 0a 2a 2a 20 6e 61 6d 65 73  e table.** names
1fe0: 20 69 73 20 64 6f 6e 65 2e 29 20 20 54 68 65 20   is done.)  The 
1ff0: 73 65 61 72 63 68 20 6f 72 64 65 72 20 69 73 20  search order is 
2000: 54 45 4d 50 20 66 69 72 73 74 2c 20 74 68 65 6e  TEMP first, then
2010: 20 4d 41 49 4e 2c 20 74 68 65 6e 20 61 6e 79 0a   MAIN, then any.
2020: 2a 2a 20 61 75 78 69 6c 69 61 72 79 20 64 61 74  ** auxiliary dat
2030: 61 62 61 73 65 73 20 61 64 64 65 64 20 75 73 69  abases added usi
2040: 6e 67 20 74 68 65 20 41 54 54 41 43 48 20 63 6f  ng the ATTACH co
2050: 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 53 65 65  mmand..**.** See
2060: 20 61 6c 73 6f 20 73 71 6c 69 74 65 33 4c 6f 63   also sqlite3Loc
2070: 61 74 65 54 61 62 6c 65 28 29 2e 0a 2a 2f 0a 54  ateTable()..*/.T
2080: 61 62 6c 65 20 2a 73 71 6c 69 74 65 33 46 69 6e  able *sqlite3Fin
2090: 64 54 61 62 6c 65 28 73 71 6c 69 74 65 33 20 2a  dTable(sqlite3 *
20a0: 64 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  db, const char *
20b0: 7a 4e 61 6d 65 2c 20 63 6f 6e 73 74 20 63 68 61  zName, const cha
20c0: 72 20 2a 7a 44 61 74 61 62 61 73 65 29 7b 0a 20  r *zDatabase){. 
20d0: 20 54 61 62 6c 65 20 2a 70 20 3d 20 30 3b 0a 20   Table *p = 0;. 
20e0: 20 69 6e 74 20 69 3b 0a 20 20 61 73 73 65 72 74   int i;.  assert
20f0: 28 20 7a 4e 61 6d 65 21 3d 30 20 29 3b 0a 20 20  ( zName!=0 );.  
2100: 66 6f 72 28 69 3d 4f 4d 49 54 5f 54 45 4d 50 44  for(i=OMIT_TEMPD
2110: 42 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b  B; i<db->nDb; i+
2120: 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6a 20 3d 20  +){.    int j = 
2130: 28 69 3c 32 29 20 3f 20 69 5e 31 20 3a 20 69 3b  (i<2) ? i^1 : i;
2140: 20 20 20 2f 2a 20 53 65 61 72 63 68 20 54 45 4d     /* Search TEM
2150: 50 20 62 65 66 6f 72 65 20 4d 41 49 4e 20 2a 2f  P before MAIN */
2160: 0a 20 20 20 20 69 66 28 20 7a 44 61 74 61 62 61  .    if( zDataba
2170: 73 65 21 3d 30 20 26 26 20 73 71 6c 69 74 65 33  se!=0 && sqlite3
2180: 53 74 72 49 43 6d 70 28 7a 44 61 74 61 62 61 73  StrICmp(zDatabas
2190: 65 2c 20 64 62 2d 3e 61 44 62 5b 6a 5d 2e 7a 4e  e, db->aDb[j].zN
21a0: 61 6d 65 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b  ame) ) continue;
21b0: 0a 20 20 20 20 70 20 3d 20 73 71 6c 69 74 65 33  .    p = sqlite3
21c0: 48 61 73 68 46 69 6e 64 28 26 64 62 2d 3e 61 44  HashFind(&db->aD
21d0: 62 5b 6a 5d 2e 70 53 63 68 65 6d 61 2d 3e 74 62  b[j].pSchema->tb
21e0: 6c 48 61 73 68 2c 20 7a 4e 61 6d 65 2c 20 73 74  lHash, zName, st
21f0: 72 6c 65 6e 28 7a 4e 61 6d 65 29 2b 31 29 3b 0a  rlen(zName)+1);.
2200: 20 20 20 20 69 66 28 20 70 20 29 20 62 72 65 61      if( p ) brea
2210: 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  k;.  }.  return 
2220: 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61  p;.}../*.** Loca
2230: 74 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79  te the in-memory
2240: 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20   structure that 
2250: 64 65 73 63 72 69 62 65 73 20 61 20 70 61 72 74  describes a part
2260: 69 63 75 6c 61 72 20 64 61 74 61 62 61 73 65 0a  icular database.
2270: 2a 2a 20 74 61 62 6c 65 20 67 69 76 65 6e 20 74  ** table given t
2280: 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 61 74 20  he name of that 
2290: 74 61 62 6c 65 20 61 6e 64 20 28 6f 70 74 69 6f  table and (optio
22a0: 6e 61 6c 6c 79 29 20 74 68 65 20 6e 61 6d 65 20  nally) the name 
22b0: 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61  of the.** databa
22c0: 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  se containing th
22d0: 65 20 74 61 62 6c 65 2e 20 20 52 65 74 75 72 6e  e table.  Return
22e0: 20 4e 55 4c 4c 20 69 66 20 6e 6f 74 20 66 6f 75   NULL if not fou
22f0: 6e 64 2e 20 20 41 6c 73 6f 20 6c 65 61 76 65 20  nd.  Also leave 
2300: 61 6e 0a 2a 2a 20 65 72 72 6f 72 20 6d 65 73 73  an.** error mess
2310: 61 67 65 20 69 6e 20 70 50 61 72 73 65 2d 3e 7a  age in pParse->z
2320: 45 72 72 4d 73 67 2e 0a 2a 2a 0a 2a 2a 20 54 68  ErrMsg..**.** Th
2330: 65 20 64 69 66 66 65 72 65 6e 63 65 20 62 65 74  e difference bet
2340: 77 65 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  ween this routin
2350: 65 20 61 6e 64 20 73 71 6c 69 74 65 33 46 69 6e  e and sqlite3Fin
2360: 64 54 61 62 6c 65 28 29 20 69 73 20 74 68 61 74  dTable() is that
2370: 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65   this.** routine
2380: 20 6c 65 61 76 65 73 20 61 6e 20 65 72 72 6f 72   leaves an error
2390: 20 6d 65 73 73 61 67 65 20 69 6e 20 70 50 61 72   message in pPar
23a0: 73 65 2d 3e 7a 45 72 72 4d 73 67 20 77 68 65 72  se->zErrMsg wher
23b0: 65 0a 2a 2a 20 73 71 6c 69 74 65 33 46 69 6e 64  e.** sqlite3Find
23c0: 54 61 62 6c 65 28 29 20 64 6f 65 73 20 6e 6f 74  Table() does not
23d0: 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a 73 71 6c 69  ..*/.Table *sqli
23e0: 74 65 33 4c 6f 63 61 74 65 54 61 62 6c 65 28 50  te3LocateTable(P
23f0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 63 6f  arse *pParse, co
2400: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c  nst char *zName,
2410: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62   const char *zDb
2420: 61 73 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70  ase){.  Table *p
2430: 3b 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74 68 65  ;..  /* Read the
2440: 20 64 61 74 61 62 61 73 65 20 73 63 68 65 6d 61   database schema
2450: 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  . If an error oc
2460: 63 75 72 73 2c 20 6c 65 61 76 65 20 61 6e 20 65  curs, leave an e
2470: 72 72 6f 72 20 6d 65 73 73 61 67 65 0a 20 20 2a  rror message.  *
2480: 2a 20 61 6e 64 20 63 6f 64 65 20 69 6e 20 70 50  * and code in pP
2490: 61 72 73 65 20 61 6e 64 20 72 65 74 75 72 6e 20  arse and return 
24a0: 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 69 66 28 20 53  NULL. */.  if( S
24b0: 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65  QLITE_OK!=sqlite
24c0: 33 52 65 61 64 53 63 68 65 6d 61 28 70 50 61 72  3ReadSchema(pPar
24d0: 73 65 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  se) ){.    retur
24e0: 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 70 20 3d 20  n 0;.  }..  p = 
24f0: 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65  sqlite3FindTable
2500: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 7a 4e 61  (pParse->db, zNa
2510: 6d 65 2c 20 7a 44 62 61 73 65 29 3b 0a 20 20 69  me, zDbase);.  i
2520: 66 28 20 70 3d 3d 30 20 29 7b 0a 20 20 20 20 69  f( p==0 ){.    i
2530: 66 28 20 7a 44 62 61 73 65 20 29 7b 0a 20 20 20  f( zDbase ){.   
2540: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
2550: 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 73  sg(pParse, "no s
2560: 75 63 68 20 74 61 62 6c 65 3a 20 25 73 2e 25 73  uch table: %s.%s
2570: 22 2c 20 7a 44 62 61 73 65 2c 20 7a 4e 61 6d 65  ", zDbase, zName
2580: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
2590: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
25a0: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 20  Msg(pParse, "no 
25b0: 73 75 63 68 20 74 61 62 6c 65 3a 20 25 73 22 2c  such table: %s",
25c0: 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20   zName);.    }. 
25d0: 20 20 20 70 50 61 72 73 65 2d 3e 63 68 65 63 6b     pParse->check
25e0: 53 63 68 65 6d 61 20 3d 20 31 3b 0a 20 20 7d 0a  Schema = 1;.  }.
25f0: 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f    return p;.}../
2600: 2a 0a 2a 2a 20 4c 6f 63 61 74 65 20 74 68 65 20  *.** Locate the 
2610: 69 6e 2d 6d 65 6d 6f 72 79 20 73 74 72 75 63 74  in-memory struct
2620: 75 72 65 20 74 68 61 74 20 64 65 73 63 72 69 62  ure that describ
2630: 65 73 20 0a 2a 2a 20 61 20 70 61 72 74 69 63 75  es .** a particu
2640: 6c 61 72 20 69 6e 64 65 78 20 67 69 76 65 6e 20  lar index given 
2650: 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 61 74  the name of that
2660: 20 69 6e 64 65 78 0a 2a 2a 20 61 6e 64 20 74 68   index.** and th
2670: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 61  e name of the da
2680: 74 61 62 61 73 65 20 74 68 61 74 20 63 6f 6e 74  tabase that cont
2690: 61 69 6e 73 20 74 68 65 20 69 6e 64 65 78 2e 0a  ains the index..
26a0: 2a 2a 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69  ** Return NULL i
26b0: 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2a 0a  f not found..**.
26c0: 2a 2a 20 49 66 20 7a 44 61 74 61 62 61 73 65 20  ** If zDatabase 
26d0: 69 73 20 30 2c 20 61 6c 6c 20 64 61 74 61 62 61  is 0, all databa
26e0: 73 65 73 20 61 72 65 20 73 65 61 72 63 68 65 64  ses are searched
26f0: 20 66 6f 72 20 74 68 65 0a 2a 2a 20 74 61 62 6c   for the.** tabl
2700: 65 20 61 6e 64 20 74 68 65 20 66 69 72 73 74 20  e and the first 
2710: 6d 61 74 63 68 69 6e 67 20 69 6e 64 65 78 20 69  matching index i
2720: 73 20 72 65 74 75 72 6e 65 64 2e 20 20 28 4e 6f  s returned.  (No
2730: 20 63 68 65 63 6b 69 6e 67 0a 2a 2a 20 66 6f 72   checking.** for
2740: 20 64 75 70 6c 69 63 61 74 65 20 69 6e 64 65 78   duplicate index
2750: 20 6e 61 6d 65 73 20 69 73 20 64 6f 6e 65 2e 29   names is done.)
2760: 20 20 54 68 65 20 73 65 61 72 63 68 20 6f 72 64    The search ord
2770: 65 72 20 69 73 0a 2a 2a 20 54 45 4d 50 20 66 69  er is.** TEMP fi
2780: 72 73 74 2c 20 74 68 65 6e 20 4d 41 49 4e 2c 20  rst, then MAIN, 
2790: 74 68 65 6e 20 61 6e 79 20 61 75 78 69 6c 69 61  then any auxilia
27a0: 72 79 20 64 61 74 61 62 61 73 65 73 20 61 64 64  ry databases add
27b0: 65 64 0a 2a 2a 20 75 73 69 6e 67 20 74 68 65 20  ed.** using the 
27c0: 41 54 54 41 43 48 20 63 6f 6d 6d 61 6e 64 2e 0a  ATTACH command..
27d0: 2a 2f 0a 49 6e 64 65 78 20 2a 73 71 6c 69 74 65  */.Index *sqlite
27e0: 33 46 69 6e 64 49 6e 64 65 78 28 73 71 6c 69 74  3FindIndex(sqlit
27f0: 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68  e3 *db, const ch
2800: 61 72 20 2a 7a 4e 61 6d 65 2c 20 63 6f 6e 73 74  ar *zName, const
2810: 20 63 68 61 72 20 2a 7a 44 62 29 7b 0a 20 20 49   char *zDb){.  I
2820: 6e 64 65 78 20 2a 70 20 3d 20 30 3b 0a 20 20 69  ndex *p = 0;.  i
2830: 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 4f 4d  nt i;.  for(i=OM
2840: 49 54 5f 54 45 4d 50 44 42 3b 20 69 3c 64 62 2d  IT_TEMPDB; i<db-
2850: 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nDb; i++){.    
2860: 69 6e 74 20 6a 20 3d 20 28 69 3c 32 29 20 3f 20  int j = (i<2) ? 
2870: 69 5e 31 20 3a 20 69 3b 20 20 2f 2a 20 53 65 61  i^1 : i;  /* Sea
2880: 72 63 68 20 54 45 4d 50 20 62 65 66 6f 72 65 20  rch TEMP before 
2890: 4d 41 49 4e 20 2a 2f 0a 20 20 20 20 53 63 68 65  MAIN */.    Sche
28a0: 6d 61 20 2a 70 53 63 68 65 6d 61 20 3d 20 64 62  ma *pSchema = db
28b0: 2d 3e 61 44 62 5b 6a 5d 2e 70 53 63 68 65 6d 61  ->aDb[j].pSchema
28c0: 3b 0a 20 20 20 20 69 66 28 20 7a 44 62 20 26 26  ;.    if( zDb &&
28d0: 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
28e0: 7a 44 62 2c 20 64 62 2d 3e 61 44 62 5b 6a 5d 2e  zDb, db->aDb[j].
28f0: 7a 4e 61 6d 65 29 20 29 20 63 6f 6e 74 69 6e 75  zName) ) continu
2900: 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  e;.    assert( p
2910: 53 63 68 65 6d 61 20 7c 7c 20 28 6a 3d 3d 31 20  Schema || (j==1 
2920: 26 26 20 21 64 62 2d 3e 61 44 62 5b 31 5d 2e 70  && !db->aDb[1].p
2930: 42 74 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70  Bt) );.    if( p
2940: 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 20 20  Schema ){.      
2950: 70 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68 46  p = sqlite3HashF
2960: 69 6e 64 28 26 70 53 63 68 65 6d 61 2d 3e 69 64  ind(&pSchema->id
2970: 78 48 61 73 68 2c 20 7a 4e 61 6d 65 2c 20 73 74  xHash, zName, st
2980: 72 6c 65 6e 28 7a 4e 61 6d 65 29 2b 31 29 3b 0a  rlen(zName)+1);.
2990: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 20      }.    if( p 
29a0: 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72  ) break;.  }.  r
29b0: 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn p;.}../*.*
29c0: 2a 20 52 65 63 6c 61 69 6d 20 74 68 65 20 6d 65  * Reclaim the me
29d0: 6d 6f 72 79 20 75 73 65 64 20 62 79 20 61 6e 20  mory used by an 
29e0: 69 6e 64 65 78 0a 2a 2f 0a 73 74 61 74 69 63 20  index.*/.static 
29f0: 76 6f 69 64 20 66 72 65 65 49 6e 64 65 78 28 49  void freeIndex(I
2a00: 6e 64 65 78 20 2a 70 29 7b 0a 20 20 73 71 6c 69  ndex *p){.  sqli
2a10: 74 65 33 5f 66 72 65 65 28 70 2d 3e 7a 43 6f 6c  te3_free(p->zCol
2a20: 41 66 66 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  Aff);.  sqlite3_
2a30: 66 72 65 65 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  free(p);.}../*.*
2a40: 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 67 69 76  * Remove the giv
2a50: 65 6e 20 69 6e 64 65 78 20 66 72 6f 6d 20 74 68  en index from th
2a60: 65 20 69 6e 64 65 78 20 68 61 73 68 20 74 61 62  e index hash tab
2a70: 6c 65 2c 20 61 6e 64 20 66 72 65 65 0a 2a 2a 20  le, and free.** 
2a80: 69 74 73 20 6d 65 6d 6f 72 79 20 73 74 72 75 63  its memory struc
2a90: 74 75 72 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  tures..**.** The
2aa0: 20 69 6e 64 65 78 20 69 73 20 72 65 6d 6f 76 65   index is remove
2ab0: 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62  d from the datab
2ac0: 61 73 65 20 68 61 73 68 20 74 61 62 6c 65 73 20  ase hash tables 
2ad0: 62 75 74 0a 2a 2a 20 69 74 20 69 73 20 6e 6f 74  but.** it is not
2ae0: 20 75 6e 6c 69 6e 6b 65 64 20 66 72 6f 6d 20 74   unlinked from t
2af0: 68 65 20 54 61 62 6c 65 20 74 68 61 74 20 69 74  he Table that it
2b00: 20 69 6e 64 65 78 65 73 2e 0a 2a 2a 20 55 6e 6c   indexes..** Unl
2b10: 69 6e 6b 69 6e 67 20 66 72 6f 6d 20 74 68 65 20  inking from the 
2b20: 54 61 62 6c 65 20 6d 75 73 74 20 62 65 20 64 6f  Table must be do
2b30: 6e 65 20 62 79 20 74 68 65 20 63 61 6c 6c 69 6e  ne by the callin
2b40: 67 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73  g function..*/.s
2b50: 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74  tatic void sqlit
2b60: 65 44 65 6c 65 74 65 49 6e 64 65 78 28 49 6e 64  eDeleteIndex(Ind
2b70: 65 78 20 2a 70 29 7b 0a 20 20 49 6e 64 65 78 20  ex *p){.  Index 
2b80: 2a 70 4f 6c 64 3b 0a 20 20 63 6f 6e 73 74 20 63  *pOld;.  const c
2b90: 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 70 2d 3e  har *zName = p->
2ba0: 7a 4e 61 6d 65 3b 0a 0a 20 20 70 4f 6c 64 20 3d  zName;..  pOld =
2bb0: 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65   sqlite3HashInse
2bc0: 72 74 28 26 70 2d 3e 70 53 63 68 65 6d 61 2d 3e  rt(&p->pSchema->
2bd0: 69 64 78 48 61 73 68 2c 20 7a 4e 61 6d 65 2c 20  idxHash, zName, 
2be0: 73 74 72 6c 65 6e 28 20 7a 4e 61 6d 65 29 2b 31  strlen( zName)+1
2bf0: 2c 20 30 29 3b 0a 20 20 61 73 73 65 72 74 28 20  , 0);.  assert( 
2c00: 70 4f 6c 64 3d 3d 30 20 7c 7c 20 70 4f 6c 64 3d  pOld==0 || pOld=
2c10: 3d 70 20 29 3b 0a 20 20 66 72 65 65 49 6e 64 65  =p );.  freeInde
2c20: 78 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  x(p);.}../*.** F
2c30: 6f 72 20 74 68 65 20 69 6e 64 65 78 20 63 61 6c  or the index cal
2c40: 6c 65 64 20 7a 49 64 78 4e 61 6d 65 20 77 68 69  led zIdxName whi
2c50: 63 68 20 69 73 20 66 6f 75 6e 64 20 69 6e 20 74  ch is found in t
2c60: 68 65 20 64 61 74 61 62 61 73 65 20 69 44 62 2c  he database iDb,
2c70: 0a 2a 2a 20 75 6e 6c 69 6b 65 20 74 68 61 74 20  .** unlike that 
2c80: 69 6e 64 65 78 20 66 72 6f 6d 20 69 74 73 20 54  index from its T
2c90: 61 62 6c 65 20 74 68 65 6e 20 72 65 6d 6f 76 65  able then remove
2ca0: 20 74 68 65 20 69 6e 64 65 78 20 66 72 6f 6d 0a   the index from.
2cb0: 2a 2a 20 74 68 65 20 69 6e 64 65 78 20 68 61 73  ** the index has
2cc0: 68 20 74 61 62 6c 65 20 61 6e 64 20 66 72 65 65  h table and free
2cd0: 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 73 74 72 75   all memory stru
2ce0: 63 74 75 72 65 73 20 61 73 73 6f 63 69 61 74 65  ctures associate
2cf0: 64 0a 2a 2a 20 77 69 74 68 20 74 68 65 20 69 6e  d.** with the in
2d00: 64 65 78 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  dex..*/.void sql
2d10: 69 74 65 33 55 6e 6c 69 6e 6b 41 6e 64 44 65 6c  ite3UnlinkAndDel
2d20: 65 74 65 49 6e 64 65 78 28 73 71 6c 69 74 65 33  eteIndex(sqlite3
2d30: 20 2a 64 62 2c 20 69 6e 74 20 69 44 62 2c 20 63   *db, int iDb, c
2d40: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 64 78 4e  onst char *zIdxN
2d50: 61 6d 65 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70  ame){.  Index *p
2d60: 49 6e 64 65 78 3b 0a 20 20 69 6e 74 20 6c 65 6e  Index;.  int len
2d70: 3b 0a 20 20 48 61 73 68 20 2a 70 48 61 73 68 20  ;.  Hash *pHash 
2d80: 3d 20 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e  = &db->aDb[iDb].
2d90: 70 53 63 68 65 6d 61 2d 3e 69 64 78 48 61 73 68  pSchema->idxHash
2da0: 3b 0a 0a 20 20 6c 65 6e 20 3d 20 73 74 72 6c 65  ;..  len = strle
2db0: 6e 28 7a 49 64 78 4e 61 6d 65 29 3b 0a 20 20 70  n(zIdxName);.  p
2dc0: 49 6e 64 65 78 20 3d 20 73 71 6c 69 74 65 33 48  Index = sqlite3H
2dd0: 61 73 68 49 6e 73 65 72 74 28 70 48 61 73 68 2c  ashInsert(pHash,
2de0: 20 7a 49 64 78 4e 61 6d 65 2c 20 6c 65 6e 2b 31   zIdxName, len+1
2df0: 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 49 6e 64  , 0);.  if( pInd
2e00: 65 78 20 29 7b 0a 20 20 20 20 69 66 28 20 70 49  ex ){.    if( pI
2e10: 6e 64 65 78 2d 3e 70 54 61 62 6c 65 2d 3e 70 49  ndex->pTable->pI
2e20: 6e 64 65 78 3d 3d 70 49 6e 64 65 78 20 29 7b 0a  ndex==pIndex ){.
2e30: 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 70 54        pIndex->pT
2e40: 61 62 6c 65 2d 3e 70 49 6e 64 65 78 20 3d 20 70  able->pIndex = p
2e50: 49 6e 64 65 78 2d 3e 70 4e 65 78 74 3b 0a 20 20  Index->pNext;.  
2e60: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 49    }else{.      I
2e70: 6e 64 65 78 20 2a 70 3b 0a 20 20 20 20 20 20 66  ndex *p;.      f
2e80: 6f 72 28 70 3d 70 49 6e 64 65 78 2d 3e 70 54 61  or(p=pIndex->pTa
2e90: 62 6c 65 2d 3e 70 49 6e 64 65 78 3b 20 70 20 26  ble->pIndex; p &
2ea0: 26 20 70 2d 3e 70 4e 65 78 74 21 3d 70 49 6e 64  & p->pNext!=pInd
2eb0: 65 78 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b  ex; p=p->pNext){
2ec0: 7d 0a 20 20 20 20 20 20 69 66 28 20 70 20 26 26  }.      if( p &&
2ed0: 20 70 2d 3e 70 4e 65 78 74 3d 3d 70 49 6e 64 65   p->pNext==pInde
2ee0: 78 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e  x ){.        p->
2ef0: 70 4e 65 78 74 20 3d 20 70 49 6e 64 65 78 2d 3e  pNext = pIndex->
2f00: 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20  pNext;.      }. 
2f10: 20 20 20 7d 0a 20 20 20 20 66 72 65 65 49 6e 64     }.    freeInd
2f20: 65 78 28 70 49 6e 64 65 78 29 3b 0a 20 20 7d 0a  ex(pIndex);.  }.
2f30: 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53    db->flags |= S
2f40: 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e  QLITE_InternChan
2f50: 67 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 72  ges;.}../*.** Er
2f60: 61 73 65 20 61 6c 6c 20 73 63 68 65 6d 61 20 69  ase all schema i
2f70: 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20  nformation from 
2f80: 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 68 61  the in-memory ha
2f90: 73 68 20 74 61 62 6c 65 73 20 6f 66 0a 2a 2a 20  sh tables of.** 
2fa0: 61 20 73 69 6e 67 6c 65 20 64 61 74 61 62 61 73  a single databas
2fb0: 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  e.  This routine
2fc0: 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 72 65   is called to re
2fd0: 63 6c 61 69 6d 20 6d 65 6d 6f 72 79 0a 2a 2a 20  claim memory.** 
2fe0: 62 65 66 6f 72 65 20 74 68 65 20 64 61 74 61 62  before the datab
2ff0: 61 73 65 20 63 6c 6f 73 65 73 2e 20 20 49 74 20  ase closes.  It 
3000: 69 73 20 61 6c 73 6f 20 63 61 6c 6c 65 64 20 64  is also called d
3010: 75 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b  uring a rollback
3020: 0a 2a 2a 20 69 66 20 74 68 65 72 65 20 77 65 72  .** if there wer
3030: 65 20 73 63 68 65 6d 61 20 63 68 61 6e 67 65 73  e schema changes
3040: 20 64 75 72 69 6e 67 20 74 68 65 20 74 72 61 6e   during the tran
3050: 73 61 63 74 69 6f 6e 20 6f 72 20 69 66 20 61 0a  saction or if a.
3060: 2a 2a 20 73 63 68 65 6d 61 2d 63 6f 6f 6b 69 65  ** schema-cookie
3070: 20 6d 69 73 6d 61 74 63 68 20 6f 63 63 75 72 73   mismatch occurs
3080: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 69 44 62 3c 3d  ..**.** If iDb<=
3090: 30 20 74 68 65 6e 20 72 65 73 65 74 20 74 68 65  0 then reset the
30a0: 20 69 6e 74 65 72 6e 61 6c 20 73 63 68 65 6d 61   internal schema
30b0: 20 74 61 62 6c 65 73 20 66 6f 72 20 61 6c 6c 20   tables for all 
30c0: 64 61 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65  database.** file
30d0: 73 2e 20 20 49 66 20 69 44 62 3e 3d 32 20 74 68  s.  If iDb>=2 th
30e0: 65 6e 20 72 65 73 65 74 20 74 68 65 20 69 6e 74  en reset the int
30f0: 65 72 6e 61 6c 20 73 63 68 65 6d 61 20 66 6f 72  ernal schema for
3100: 20 6f 6e 6c 79 20 74 68 65 0a 2a 2a 20 73 69 6e   only the.** sin
3110: 67 6c 65 20 66 69 6c 65 20 69 6e 64 69 63 61 74  gle file indicat
3120: 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ed..*/.void sqli
3130: 74 65 33 52 65 73 65 74 49 6e 74 65 72 6e 61 6c  te3ResetInternal
3140: 53 63 68 65 6d 61 28 73 71 6c 69 74 65 33 20 2a  Schema(sqlite3 *
3150: 64 62 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20 20  db, int iDb){.  
3160: 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 61 73 73 65  int i, j;.  asse
3170: 72 74 28 20 69 44 62 3e 3d 30 20 26 26 20 69 44  rt( iDb>=0 && iD
3180: 62 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 0a 20 20  b<db->nDb );..  
3190: 69 66 28 20 69 44 62 3d 3d 30 20 29 7b 0a 20 20  if( iDb==0 ){.  
31a0: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
31b0: 74 65 72 41 6c 6c 28 64 62 29 3b 0a 20 20 7d 0a  terAll(db);.  }.
31c0: 20 20 66 6f 72 28 69 3d 69 44 62 3b 20 69 3c 64    for(i=iDb; i<d
31d0: 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20  b->nDb; i++){.  
31e0: 20 20 44 62 20 2a 70 44 62 20 3d 20 26 64 62 2d    Db *pDb = &db-
31f0: 3e 61 44 62 5b 69 5d 3b 0a 20 20 20 20 69 66 28  >aDb[i];.    if(
3200: 20 70 44 62 2d 3e 70 53 63 68 65 6d 61 20 29 7b   pDb->pSchema ){
3210: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 69 3d  .      assert(i=
3220: 3d 31 20 7c 7c 20 28 70 44 62 2d 3e 70 42 74 20  =1 || (pDb->pBt 
3230: 26 26 20 73 71 6c 69 74 65 33 42 74 72 65 65 48  && sqlite3BtreeH
3240: 6f 6c 64 73 4d 75 74 65 78 28 70 44 62 2d 3e 70  oldsMutex(pDb->p
3250: 42 74 29 29 29 3b 0a 20 20 20 20 20 20 73 71 6c  Bt)));.      sql
3260: 69 74 65 33 53 63 68 65 6d 61 46 72 65 65 28 70  ite3SchemaFree(p
3270: 44 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20  Db->pSchema);.  
3280: 20 20 7d 0a 20 20 20 20 69 66 28 20 69 44 62 3e    }.    if( iDb>
3290: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a  0 ) return;.  }.
32a0: 20 20 61 73 73 65 72 74 28 20 69 44 62 3d 3d 30    assert( iDb==0
32b0: 20 29 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20   );.  db->flags 
32c0: 26 3d 20 7e 53 51 4c 49 54 45 5f 49 6e 74 65 72  &= ~SQLITE_Inter
32d0: 6e 43 68 61 6e 67 65 73 3b 0a 20 20 73 71 6c 69  nChanges;.  sqli
32e0: 74 65 33 42 74 72 65 65 4c 65 61 76 65 41 6c 6c  te3BtreeLeaveAll
32f0: 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 6f  (db);..  /* If o
3300: 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 66 20 74 68  ne or more of th
3310: 65 20 61 75 78 69 6c 69 61 72 79 20 64 61 74 61  e auxiliary data
3320: 62 61 73 65 20 66 69 6c 65 73 20 68 61 73 20 62  base files has b
3330: 65 65 6e 20 63 6c 6f 73 65 64 2c 0a 20 20 2a 2a  een closed,.  **
3340: 20 74 68 65 6e 20 72 65 6d 6f 76 65 20 74 68 65   then remove the
3350: 6d 20 66 72 6f 6d 20 74 68 65 20 61 75 78 69 6c  m from the auxil
3360: 69 61 72 79 20 64 61 74 61 62 61 73 65 20 6c 69  iary database li
3370: 73 74 2e 20 20 57 65 20 74 61 6b 65 20 74 68 65  st.  We take the
3380: 0a 20 20 2a 2a 20 6f 70 70 6f 72 74 75 6e 69 74  .  ** opportunit
3390: 79 20 74 6f 20 64 6f 20 74 68 69 73 20 68 65 72  y to do this her
33a0: 65 20 73 69 6e 63 65 20 77 65 20 68 61 76 65 20  e since we have 
33b0: 6a 75 73 74 20 64 65 6c 65 74 65 64 20 61 6c 6c  just deleted all
33c0: 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 73 63 68   of the.  ** sch
33d0: 65 6d 61 20 68 61 73 68 20 74 61 62 6c 65 73 20  ema hash tables 
33e0: 61 6e 64 20 74 68 65 72 65 66 6f 72 65 20 64 6f  and therefore do
33f0: 20 6e 6f 74 20 68 61 76 65 20 74 6f 20 6d 61 6b   not have to mak
3400: 65 20 61 6e 79 20 63 68 61 6e 67 65 73 0a 20 20  e any changes.  
3410: 2a 2a 20 74 6f 20 61 6e 79 20 6f 66 20 74 68 6f  ** to any of tho
3420: 73 65 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2f 0a  se tables..  */.
3430: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d    for(i=0; i<db-
3440: 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nDb; i++){.    
3450: 73 74 72 75 63 74 20 44 62 20 2a 70 44 62 20 3d  struct Db *pDb =
3460: 20 26 64 62 2d 3e 61 44 62 5b 69 5d 3b 0a 20 20   &db->aDb[i];.  
3470: 20 20 69 66 28 20 70 44 62 2d 3e 70 42 74 3d 3d    if( pDb->pBt==
3480: 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  0 ){.      if( p
3490: 44 62 2d 3e 70 41 75 78 20 26 26 20 70 44 62 2d  Db->pAux && pDb-
34a0: 3e 78 46 72 65 65 41 75 78 20 29 20 70 44 62 2d  >xFreeAux ) pDb-
34b0: 3e 78 46 72 65 65 41 75 78 28 70 44 62 2d 3e 70  >xFreeAux(pDb->p
34c0: 41 75 78 29 3b 0a 20 20 20 20 20 20 70 44 62 2d  Aux);.      pDb-
34d0: 3e 70 41 75 78 20 3d 20 30 3b 0a 20 20 20 20 7d  >pAux = 0;.    }
34e0: 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 6a 3d 32  .  }.  for(i=j=2
34f0: 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b  ; i<db->nDb; i++
3500: 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 44 62  ){.    struct Db
3510: 20 2a 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62   *pDb = &db->aDb
3520: 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 70 44 62  [i];.    if( pDb
3530: 2d 3e 70 42 74 3d 3d 30 20 29 7b 0a 20 20 20 20  ->pBt==0 ){.    
3540: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
3550: 44 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  Db->zName);.    
3560: 20 20 70 44 62 2d 3e 7a 4e 61 6d 65 20 3d 20 30    pDb->zName = 0
3570: 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65  ;.      continue
3580: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
3590: 6a 3c 69 20 29 7b 0a 20 20 20 20 20 20 64 62 2d  j<i ){.      db-
35a0: 3e 61 44 62 5b 6a 5d 20 3d 20 64 62 2d 3e 61 44  >aDb[j] = db->aD
35b0: 62 5b 69 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20  b[i];.    }.    
35c0: 6a 2b 2b 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65  j++;.  }.  memse
35d0: 74 28 26 64 62 2d 3e 61 44 62 5b 6a 5d 2c 20 30  t(&db->aDb[j], 0
35e0: 2c 20 28 64 62 2d 3e 6e 44 62 2d 6a 29 2a 73 69  , (db->nDb-j)*si
35f0: 7a 65 6f 66 28 64 62 2d 3e 61 44 62 5b 6a 5d 29  zeof(db->aDb[j])
3600: 29 3b 0a 20 20 64 62 2d 3e 6e 44 62 20 3d 20 6a  );.  db->nDb = j
3610: 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6e 44 62 3c  ;.  if( db->nDb<
3620: 3d 32 20 26 26 20 64 62 2d 3e 61 44 62 21 3d 64  =2 && db->aDb!=d
3630: 62 2d 3e 61 44 62 53 74 61 74 69 63 20 29 7b 0a  b->aDbStatic ){.
3640: 20 20 20 20 6d 65 6d 63 70 79 28 64 62 2d 3e 61      memcpy(db->a
3650: 44 62 53 74 61 74 69 63 2c 20 64 62 2d 3e 61 44  DbStatic, db->aD
3660: 62 2c 20 32 2a 73 69 7a 65 6f 66 28 64 62 2d 3e  b, 2*sizeof(db->
3670: 61 44 62 5b 30 5d 29 29 3b 0a 20 20 20 20 73 71  aDb[0]));.    sq
3680: 6c 69 74 65 33 5f 66 72 65 65 28 64 62 2d 3e 61  lite3_free(db->a
3690: 44 62 29 3b 0a 20 20 20 20 64 62 2d 3e 61 44 62  Db);.    db->aDb
36a0: 20 3d 20 64 62 2d 3e 61 44 62 53 74 61 74 69 63   = db->aDbStatic
36b0: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ;.  }.}../*.** T
36c0: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
36d0: 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 63 6f 6d  alled when a com
36e0: 6d 69 74 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 76  mit occurs..*/.v
36f0: 6f 69 64 20 73 71 6c 69 74 65 33 43 6f 6d 6d 69  oid sqlite3Commi
3700: 74 49 6e 74 65 72 6e 61 6c 43 68 61 6e 67 65 73  tInternalChanges
3710: 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20  (sqlite3 *db){. 
3720: 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53   db->flags &= ~S
3730: 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e  QLITE_InternChan
3740: 67 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c  ges;.}../*.** Cl
3750: 65 61 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e  ear the column n
3760: 61 6d 65 73 20 66 72 6f 6d 20 61 20 74 61 62 6c  ames from a tabl
3770: 65 20 6f 72 20 76 69 65 77 2e 0a 2a 2f 0a 73 74  e or view..*/.st
3780: 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65  atic void sqlite
3790: 52 65 73 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73  ResetColumnNames
37a0: 28 54 61 62 6c 65 20 2a 70 54 61 62 6c 65 29 7b  (Table *pTable){
37b0: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 43 6f 6c 75  .  int i;.  Colu
37c0: 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 61 73 73 65  mn *pCol;.  asse
37d0: 72 74 28 20 70 54 61 62 6c 65 21 3d 30 20 29 3b  rt( pTable!=0 );
37e0: 0a 20 20 69 66 28 20 28 70 43 6f 6c 20 3d 20 70  .  if( (pCol = p
37f0: 54 61 62 6c 65 2d 3e 61 43 6f 6c 29 21 3d 30 20  Table->aCol)!=0 
3800: 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  ){.    for(i=0; 
3810: 69 3c 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3b 20  i<pTable->nCol; 
3820: 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20  i++, pCol++){.  
3830: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
3840: 28 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  (pCol->zName);. 
3850: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
3860: 44 65 6c 65 74 65 28 70 43 6f 6c 2d 3e 70 44 66  Delete(pCol->pDf
3870: 6c 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  lt);.      sqlit
3880: 65 33 5f 66 72 65 65 28 70 43 6f 6c 2d 3e 7a 54  e3_free(pCol->zT
3890: 79 70 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ype);.      sqli
38a0: 74 65 33 5f 66 72 65 65 28 70 43 6f 6c 2d 3e 7a  te3_free(pCol->z
38b0: 43 6f 6c 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Coll);.    }.   
38c0: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 54   sqlite3_free(pT
38d0: 61 62 6c 65 2d 3e 61 43 6f 6c 29 3b 0a 20 20 7d  able->aCol);.  }
38e0: 0a 20 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 20  .  pTable->aCol 
38f0: 3d 20 30 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 6e  = 0;.  pTable->n
3900: 43 6f 6c 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  Col = 0;.}../*.*
3910: 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 6d 65 6d  * Remove the mem
3920: 6f 72 79 20 64 61 74 61 20 73 74 72 75 63 74 75  ory data structu
3930: 72 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  res associated w
3940: 69 74 68 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a  ith the given.**
3950: 20 54 61 62 6c 65 2e 20 20 4e 6f 20 63 68 61 6e   Table.  No chan
3960: 67 65 73 20 61 72 65 20 6d 61 64 65 20 74 6f 20  ges are made to 
3970: 64 69 73 6b 20 62 79 20 74 68 69 73 20 72 6f 75  disk by this rou
3980: 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  tine..**.** This
3990: 20 72 6f 75 74 69 6e 65 20 6a 75 73 74 20 64 65   routine just de
39a0: 6c 65 74 65 73 20 74 68 65 20 64 61 74 61 20 73  letes the data s
39b0: 74 72 75 63 74 75 72 65 2e 20 20 49 74 20 64 6f  tructure.  It do
39c0: 65 73 20 6e 6f 74 20 75 6e 6c 69 6e 6b 0a 2a 2a  es not unlink.**
39d0: 20 74 68 65 20 74 61 62 6c 65 20 64 61 74 61 20   the table data 
39e0: 73 74 72 75 63 74 75 72 65 20 66 72 6f 6d 20 74  structure from t
39f0: 68 65 20 68 61 73 68 20 74 61 62 6c 65 2e 20 20  he hash table.  
3a00: 4e 6f 72 20 64 6f 65 73 20 69 74 20 72 65 6d 6f  Nor does it remo
3a10: 76 65 0a 2a 2a 20 66 6f 72 65 69 67 6e 20 6b 65  ve.** foreign ke
3a20: 79 73 20 66 72 6f 6d 20 74 68 65 20 73 71 6c 69  ys from the sqli
3a30: 74 65 2e 61 46 4b 65 79 20 68 61 73 68 20 74 61  te.aFKey hash ta
3a40: 62 6c 65 2e 20 20 42 75 74 20 69 74 20 64 6f 65  ble.  But it doe
3a50: 73 20 64 65 73 74 72 6f 79 0a 2a 2a 20 6d 65 6d  s destroy.** mem
3a60: 6f 72 79 20 73 74 72 75 63 74 75 72 65 73 20 6f  ory structures o
3a70: 66 20 74 68 65 20 69 6e 64 69 63 65 73 20 61 6e  f the indices an
3a80: 64 20 66 6f 72 65 69 67 6e 20 6b 65 79 73 20 61  d foreign keys a
3a90: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 0a  ssociated with .
3aa0: 2a 2a 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2f  ** the table..*/
3ab0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 44 65 6c  .void sqlite3Del
3ac0: 65 74 65 54 61 62 6c 65 28 54 61 62 6c 65 20 2a  eteTable(Table *
3ad0: 70 54 61 62 6c 65 29 7b 0a 20 20 49 6e 64 65 78  pTable){.  Index
3ae0: 20 2a 70 49 6e 64 65 78 2c 20 2a 70 4e 65 78 74   *pIndex, *pNext
3af0: 3b 0a 20 20 46 4b 65 79 20 2a 70 46 4b 65 79 2c  ;.  FKey *pFKey,
3b00: 20 2a 70 4e 65 78 74 46 4b 65 79 3b 0a 0a 20 20   *pNextFKey;..  
3b10: 69 66 28 20 70 54 61 62 6c 65 3d 3d 30 20 29 20  if( pTable==0 ) 
3b20: 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 44 6f  return;..  /* Do
3b30: 20 6e 6f 74 20 64 65 6c 65 74 65 20 74 68 65 20   not delete the 
3b40: 74 61 62 6c 65 20 75 6e 74 69 6c 20 74 68 65 20  table until the 
3b50: 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20  reference count 
3b60: 72 65 61 63 68 65 73 20 7a 65 72 6f 2e 20 2a 2f  reaches zero. */
3b70: 0a 20 20 70 54 61 62 6c 65 2d 3e 6e 52 65 66 2d  .  pTable->nRef-
3b80: 2d 3b 0a 20 20 69 66 28 20 70 54 61 62 6c 65 2d  -;.  if( pTable-
3b90: 3e 6e 52 65 66 3e 30 20 29 7b 0a 20 20 20 20 72  >nRef>0 ){.    r
3ba0: 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 61 73 73  eturn;.  }.  ass
3bb0: 65 72 74 28 20 70 54 61 62 6c 65 2d 3e 6e 52 65  ert( pTable->nRe
3bc0: 66 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 44 65  f==0 );..  /* De
3bd0: 6c 65 74 65 20 61 6c 6c 20 69 6e 64 69 63 65 73  lete all indices
3be0: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
3bf0: 20 74 68 69 73 20 74 61 62 6c 65 0a 20 20 2a 2f   this table.  */
3c00: 0a 20 20 66 6f 72 28 70 49 6e 64 65 78 20 3d 20  .  for(pIndex = 
3c10: 70 54 61 62 6c 65 2d 3e 70 49 6e 64 65 78 3b 20  pTable->pIndex; 
3c20: 70 49 6e 64 65 78 3b 20 70 49 6e 64 65 78 3d 70  pIndex; pIndex=p
3c30: 4e 65 78 74 29 7b 0a 20 20 20 20 70 4e 65 78 74  Next){.    pNext
3c40: 20 3d 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74   = pIndex->pNext
3c50: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49  ;.    assert( pI
3c60: 6e 64 65 78 2d 3e 70 53 63 68 65 6d 61 3d 3d 70  ndex->pSchema==p
3c70: 54 61 62 6c 65 2d 3e 70 53 63 68 65 6d 61 20 29  Table->pSchema )
3c80: 3b 0a 20 20 20 20 73 71 6c 69 74 65 44 65 6c 65  ;.    sqliteDele
3c90: 74 65 49 6e 64 65 78 28 70 49 6e 64 65 78 29 3b  teIndex(pIndex);
3ca0: 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  .  }..#ifndef SQ
3cb0: 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47  LITE_OMIT_FOREIG
3cc0: 4e 5f 4b 45 59 0a 20 20 2f 2a 20 44 65 6c 65 74  N_KEY.  /* Delet
3cd0: 65 20 61 6c 6c 20 66 6f 72 65 69 67 6e 20 6b 65  e all foreign ke
3ce0: 79 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ys associated wi
3cf0: 74 68 20 74 68 69 73 20 74 61 62 6c 65 2e 20 20  th this table.  
3d00: 54 68 65 20 6b 65 79 73 0a 20 20 2a 2a 20 73 68  The keys.  ** sh
3d10: 6f 75 6c 64 20 68 61 76 65 20 61 6c 72 65 61 64  ould have alread
3d20: 79 20 62 65 65 6e 20 75 6e 6c 69 6e 6b 65 64 20  y been unlinked 
3d30: 66 72 6f 6d 20 74 68 65 20 70 53 63 68 65 6d 61  from the pSchema
3d40: 2d 3e 61 46 4b 65 79 20 68 61 73 68 20 74 61 62  ->aFKey hash tab
3d50: 6c 65 20 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 70  le .  */.  for(p
3d60: 46 4b 65 79 3d 70 54 61 62 6c 65 2d 3e 70 46 4b  FKey=pTable->pFK
3d70: 65 79 3b 20 70 46 4b 65 79 3b 20 70 46 4b 65 79  ey; pFKey; pFKey
3d80: 3d 70 4e 65 78 74 46 4b 65 79 29 7b 0a 20 20 20  =pNextFKey){.   
3d90: 20 70 4e 65 78 74 46 4b 65 79 20 3d 20 70 46 4b   pNextFKey = pFK
3da0: 65 79 2d 3e 70 4e 65 78 74 46 72 6f 6d 3b 0a 20  ey->pNextFrom;. 
3db0: 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
3dc0: 65 33 48 61 73 68 46 69 6e 64 28 26 70 54 61 62  e3HashFind(&pTab
3dd0: 6c 65 2d 3e 70 53 63 68 65 6d 61 2d 3e 61 46 4b  le->pSchema->aFK
3de0: 65 79 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ey,.            
3df0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
3e00: 46 4b 65 79 2d 3e 7a 54 6f 2c 20 73 74 72 6c 65  FKey->zTo, strle
3e10: 6e 28 70 46 4b 65 79 2d 3e 7a 54 6f 29 2b 31 29  n(pFKey->zTo)+1)
3e20: 21 3d 70 46 4b 65 79 20 29 3b 0a 20 20 20 20 73  !=pFKey );.    s
3e30: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 46 4b 65  qlite3_free(pFKe
3e40: 79 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  y);.  }.#endif..
3e50: 20 20 2f 2a 20 44 65 6c 65 74 65 20 74 68 65 20    /* Delete the 
3e60: 54 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20  Table structure 
3e70: 69 74 73 65 6c 66 2e 0a 20 20 2a 2f 0a 20 20 73  itself..  */.  s
3e80: 71 6c 69 74 65 52 65 73 65 74 43 6f 6c 75 6d 6e  qliteResetColumn
3e90: 4e 61 6d 65 73 28 70 54 61 62 6c 65 29 3b 0a 20  Names(pTable);. 
3ea0: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 54   sqlite3_free(pT
3eb0: 61 62 6c 65 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  able->zName);.  
3ec0: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 54 61  sqlite3_free(pTa
3ed0: 62 6c 65 2d 3e 7a 43 6f 6c 41 66 66 29 3b 0a 20  ble->zColAff);. 
3ee0: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
3ef0: 6c 65 74 65 28 70 54 61 62 6c 65 2d 3e 70 53 65  lete(pTable->pSe
3f00: 6c 65 63 74 29 3b 0a 23 69 66 6e 64 65 66 20 53  lect);.#ifndef S
3f10: 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 48 45 43 4b  QLITE_OMIT_CHECK
3f20: 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65  .  sqlite3ExprDe
3f30: 6c 65 74 65 28 70 54 61 62 6c 65 2d 3e 70 43 68  lete(pTable->pCh
3f40: 65 63 6b 29 3b 0a 23 65 6e 64 69 66 0a 20 20 73  eck);.#endif.  s
3f50: 71 6c 69 74 65 33 56 74 61 62 43 6c 65 61 72 28  qlite3VtabClear(
3f60: 70 54 61 62 6c 65 29 3b 0a 20 20 73 71 6c 69 74  pTable);.  sqlit
3f70: 65 33 5f 66 72 65 65 28 70 54 61 62 6c 65 29 3b  e3_free(pTable);
3f80: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 69 6e 6b  .}../*.** Unlink
3f90: 20 74 68 65 20 67 69 76 65 6e 20 74 61 62 6c 65   the given table
3fa0: 20 66 72 6f 6d 20 74 68 65 20 68 61 73 68 20 74   from the hash t
3fb0: 61 62 6c 65 73 20 61 6e 64 20 74 68 65 20 64 65  ables and the de
3fc0: 6c 65 74 65 20 74 68 65 0a 2a 2a 20 74 61 62 6c  lete the.** tabl
3fd0: 65 20 73 74 72 75 63 74 75 72 65 20 77 69 74 68  e structure with
3fe0: 20 61 6c 6c 20 69 74 73 20 69 6e 64 69 63 65 73   all its indices
3ff0: 20 61 6e 64 20 66 6f 72 65 69 67 6e 20 6b 65 79   and foreign key
4000: 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  s..*/.void sqlit
4010: 65 33 55 6e 6c 69 6e 6b 41 6e 64 44 65 6c 65 74  e3UnlinkAndDelet
4020: 65 54 61 62 6c 65 28 73 71 6c 69 74 65 33 20 2a  eTable(sqlite3 *
4030: 64 62 2c 20 69 6e 74 20 69 44 62 2c 20 63 6f 6e  db, int iDb, con
4040: 73 74 20 63 68 61 72 20 2a 7a 54 61 62 4e 61 6d  st char *zTabNam
4050: 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a  e){.  Table *p;.
4060: 20 20 46 4b 65 79 20 2a 70 46 31 2c 20 2a 70 46    FKey *pF1, *pF
4070: 32 3b 0a 20 20 44 62 20 2a 70 44 62 3b 0a 0a 20  2;.  Db *pDb;.. 
4080: 20 61 73 73 65 72 74 28 20 64 62 21 3d 30 20 29   assert( db!=0 )
4090: 3b 0a 20 20 61 73 73 65 72 74 28 20 69 44 62 3e  ;.  assert( iDb>
40a0: 3d 30 20 26 26 20 69 44 62 3c 64 62 2d 3e 6e 44  =0 && iDb<db->nD
40b0: 62 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 7a  b );.  assert( z
40c0: 54 61 62 4e 61 6d 65 20 26 26 20 7a 54 61 62 4e  TabName && zTabN
40d0: 61 6d 65 5b 30 5d 20 29 3b 0a 20 20 70 44 62 20  ame[0] );.  pDb 
40e0: 3d 20 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d 3b  = &db->aDb[iDb];
40f0: 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 48 61  .  p = sqlite3Ha
4100: 73 68 49 6e 73 65 72 74 28 26 70 44 62 2d 3e 70  shInsert(&pDb->p
4110: 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68 2c  Schema->tblHash,
4120: 20 7a 54 61 62 4e 61 6d 65 2c 20 73 74 72 6c 65   zTabName, strle
4130: 6e 28 7a 54 61 62 4e 61 6d 65 29 2b 31 2c 30 29  n(zTabName)+1,0)
4140: 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 23 69 66  ;.  if( p ){.#if
4150: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
4160: 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 0a 20 20 20  _FOREIGN_KEY.   
4170: 20 66 6f 72 28 70 46 31 3d 70 2d 3e 70 46 4b 65   for(pF1=p->pFKe
4180: 79 3b 20 70 46 31 3b 20 70 46 31 3d 70 46 31 2d  y; pF1; pF1=pF1-
4190: 3e 70 4e 65 78 74 46 72 6f 6d 29 7b 0a 20 20 20  >pNextFrom){.   
41a0: 20 20 20 69 6e 74 20 6e 54 6f 20 3d 20 73 74 72     int nTo = str
41b0: 6c 65 6e 28 70 46 31 2d 3e 7a 54 6f 29 20 2b 20  len(pF1->zTo) + 
41c0: 31 3b 0a 20 20 20 20 20 20 70 46 32 20 3d 20 73  1;.      pF2 = s
41d0: 71 6c 69 74 65 33 48 61 73 68 46 69 6e 64 28 26  qlite3HashFind(&
41e0: 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 61 46  pDb->pSchema->aF
41f0: 4b 65 79 2c 20 70 46 31 2d 3e 7a 54 6f 2c 20 6e  Key, pF1->zTo, n
4200: 54 6f 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  To);.      if( p
4210: 46 32 3d 3d 70 46 31 20 29 7b 0a 20 20 20 20 20  F2==pF1 ){.     
4220: 20 20 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e     sqlite3HashIn
4230: 73 65 72 74 28 26 70 44 62 2d 3e 70 53 63 68 65  sert(&pDb->pSche
4240: 6d 61 2d 3e 61 46 4b 65 79 2c 20 70 46 31 2d 3e  ma->aFKey, pF1->
4250: 7a 54 6f 2c 20 6e 54 6f 2c 20 70 46 31 2d 3e 70  zTo, nTo, pF1->p
4260: 4e 65 78 74 54 6f 29 3b 0a 20 20 20 20 20 20 7d  NextTo);.      }
4270: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 77 68  else{.        wh
4280: 69 6c 65 28 20 70 46 32 20 26 26 20 70 46 32 2d  ile( pF2 && pF2-
4290: 3e 70 4e 65 78 74 54 6f 21 3d 70 46 31 20 29 7b  >pNextTo!=pF1 ){
42a0: 20 70 46 32 3d 70 46 32 2d 3e 70 4e 65 78 74 54   pF2=pF2->pNextT
42b0: 6f 3b 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28  o; }.        if(
42c0: 20 70 46 32 20 29 7b 0a 20 20 20 20 20 20 20 20   pF2 ){.        
42d0: 20 20 70 46 32 2d 3e 70 4e 65 78 74 54 6f 20 3d    pF2->pNextTo =
42e0: 20 70 46 31 2d 3e 70 4e 65 78 74 54 6f 3b 0a 20   pF1->pNextTo;. 
42f0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
4300: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
4310: 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54    sqlite3DeleteT
4320: 61 62 6c 65 28 70 29 3b 0a 20 20 7d 0a 20 20 64  able(p);.  }.  d
4330: 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49  b->flags |= SQLI
4340: 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73  TE_InternChanges
4350: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e  ;.}../*.** Given
4360: 20 61 20 74 6f 6b 65 6e 2c 20 72 65 74 75 72 6e   a token, return
4370: 20 61 20 73 74 72 69 6e 67 20 74 68 61 74 20 63   a string that c
4380: 6f 6e 73 69 73 74 73 20 6f 66 20 74 68 65 20 74  onsists of the t
4390: 65 78 74 20 6f 66 20 74 68 61 74 0a 2a 2a 20 74  ext of that.** t
43a0: 6f 6b 65 6e 20 77 69 74 68 20 61 6e 79 20 71 75  oken with any qu
43b0: 6f 74 61 74 69 6f 6e 73 20 72 65 6d 6f 76 65 64  otations removed
43c0: 2e 20 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64  .  Space to hold
43d0: 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 73 74   the returned st
43e0: 72 69 6e 67 0a 2a 2a 20 69 73 20 6f 62 74 61 69  ring.** is obtai
43f0: 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 4d  ned from sqliteM
4400: 61 6c 6c 6f 63 28 29 20 61 6e 64 20 6d 75 73 74  alloc() and must
4410: 20 62 65 20 66 72 65 65 64 20 62 79 20 74 68 65   be freed by the
4420: 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 66 75 6e 63   calling.** func
4430: 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 6f 6b 65  tion..**.** Toke
4440: 6e 73 20 61 72 65 20 6f 66 74 65 6e 20 6a 75 73  ns are often jus
4450: 74 20 70 6f 69 6e 74 65 72 73 20 69 6e 74 6f 20  t pointers into 
4460: 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 53 51 4c  the original SQL
4470: 20 74 65 78 74 20 61 6e 64 20 73 6f 0a 2a 2a 20   text and so.** 
4480: 61 72 65 20 6e 6f 74 20 5c 30 30 30 20 74 65 72  are not \000 ter
4490: 6d 69 6e 61 74 65 64 20 61 6e 64 20 61 72 65 20  minated and are 
44a0: 6e 6f 74 20 70 65 72 73 69 73 74 65 6e 74 2e 20  not persistent. 
44b0: 20 54 68 65 20 72 65 74 75 72 6e 65 64 20 73 74   The returned st
44c0: 72 69 6e 67 0a 2a 2a 20 69 73 20 5c 30 30 30 20  ring.** is \000 
44d0: 74 65 72 6d 69 6e 61 74 65 64 20 61 6e 64 20 69  terminated and i
44e0: 73 20 70 65 72 73 69 73 74 65 6e 74 2e 0a 2a 2f  s persistent..*/
44f0: 0a 63 68 61 72 20 2a 73 71 6c 69 74 65 33 4e 61  .char *sqlite3Na
4500: 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 73 71 6c 69  meFromToken(sqli
4510: 74 65 33 20 2a 64 62 2c 20 54 6f 6b 65 6e 20 2a  te3 *db, Token *
4520: 70 4e 61 6d 65 29 7b 0a 20 20 63 68 61 72 20 2a  pName){.  char *
4530: 7a 4e 61 6d 65 3b 0a 20 20 69 66 28 20 70 4e 61  zName;.  if( pNa
4540: 6d 65 20 29 7b 0a 20 20 20 20 7a 4e 61 6d 65 20  me ){.    zName 
4550: 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 4e 44  = sqlite3DbStrND
4560: 75 70 28 64 62 2c 20 28 63 68 61 72 2a 29 70 4e  up(db, (char*)pN
4570: 61 6d 65 2d 3e 7a 2c 20 70 4e 61 6d 65 2d 3e 6e  ame->z, pName->n
4580: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65  );.    sqlite3De
4590: 71 75 6f 74 65 28 7a 4e 61 6d 65 29 3b 0a 20 20  quote(zName);.  
45a0: 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 4e 61 6d 65  }else{.    zName
45b0: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75   = 0;.  }.  retu
45c0: 72 6e 20 7a 4e 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a  rn zName;.}../*.
45d0: 2a 2a 20 4f 70 65 6e 20 74 68 65 20 73 71 6c 69  ** Open the sqli
45e0: 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20  te_master table 
45f0: 73 74 6f 72 65 64 20 69 6e 20 64 61 74 61 62 61  stored in databa
4600: 73 65 20 6e 75 6d 62 65 72 20 69 44 62 20 66 6f  se number iDb fo
4610: 72 0a 2a 2a 20 77 72 69 74 69 6e 67 2e 20 54 68  r.** writing. Th
4620: 65 20 74 61 62 6c 65 20 69 73 20 6f 70 65 6e 65  e table is opene
4630: 64 20 75 73 69 6e 67 20 63 75 72 73 6f 72 20 30  d using cursor 0
4640: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
4650: 33 4f 70 65 6e 4d 61 73 74 65 72 54 61 62 6c 65  3OpenMasterTable
4660: 28 50 61 72 73 65 20 2a 70 2c 20 69 6e 74 20 69  (Parse *p, int i
4670: 44 62 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  Db){.  Vdbe *v =
4680: 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
4690: 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 54 61 62  p);.  sqlite3Tab
46a0: 6c 65 4c 6f 63 6b 28 70 2c 20 69 44 62 2c 20 4d  leLock(p, iDb, M
46b0: 41 53 54 45 52 5f 52 4f 4f 54 2c 20 31 2c 20 53  ASTER_ROOT, 1, S
46c0: 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 44 62 29  CHEMA_TABLE(iDb)
46d0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
46e0: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65  AddOp3(v, OP_Ope
46f0: 6e 57 72 69 74 65 2c 20 30 2c 20 4d 41 53 54 45  nWrite, 0, MASTE
4700: 52 5f 52 4f 4f 54 2c 20 69 44 62 29 3b 0a 20 20  R_ROOT, iDb);.  
4710: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
4720: 32 28 76 2c 20 4f 50 5f 53 65 74 4e 75 6d 43 6f  2(v, OP_SetNumCo
4730: 6c 75 6d 6e 73 2c 20 30 2c 20 35 29 3b 20 2f 2a  lumns, 0, 5); /*
4740: 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 68   sqlite_master h
4750: 61 73 20 35 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a  as 5 columns */.
4760: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 74 6f 6b  }../*.** The tok
4770: 65 6e 20 2a 70 4e 61 6d 65 20 63 6f 6e 74 61 69  en *pName contai
4780: 6e 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61  ns the name of a
4790: 20 64 61 74 61 62 61 73 65 20 28 65 69 74 68 65   database (eithe
47a0: 72 20 22 6d 61 69 6e 22 20 6f 72 0a 2a 2a 20 22  r "main" or.** "
47b0: 74 65 6d 70 22 20 6f 72 20 74 68 65 20 6e 61 6d  temp" or the nam
47c0: 65 20 6f 66 20 61 6e 20 61 74 74 61 63 68 65 64  e of an attached
47d0: 20 64 62 29 2e 20 54 68 69 73 20 72 6f 75 74 69   db). This routi
47e0: 6e 65 20 72 65 74 75 72 6e 73 20 74 68 65 0a 2a  ne returns the.*
47f0: 2a 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20 6e  * index of the n
4800: 61 6d 65 64 20 64 61 74 61 62 61 73 65 20 69 6e  amed database in
4810: 20 64 62 2d 3e 61 44 62 5b 5d 2c 20 6f 72 20 2d   db->aDb[], or -
4820: 31 20 69 66 20 74 68 65 20 6e 61 6d 65 64 20 64  1 if the named d
4830: 62 20 0a 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 65  b .** does not e
4840: 78 69 73 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  xist..*/.int sql
4850: 69 74 65 33 46 69 6e 64 44 62 28 73 71 6c 69 74  ite3FindDb(sqlit
4860: 65 33 20 2a 64 62 2c 20 54 6f 6b 65 6e 20 2a 70  e3 *db, Token *p
4870: 4e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 69 20 3d  Name){.  int i =
4880: 20 2d 31 3b 20 20 20 20 2f 2a 20 44 61 74 61 62   -1;    /* Datab
4890: 61 73 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20  ase number */.  
48a0: 69 6e 74 20 6e 3b 20 20 20 20 20 20 20 20 20 2f  int n;         /
48b0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 68 61 72  * Number of char
48c0: 61 63 74 65 72 73 20 69 6e 20 74 68 65 20 6e 61  acters in the na
48d0: 6d 65 20 2a 2f 0a 20 20 44 62 20 2a 70 44 62 3b  me */.  Db *pDb;
48e0: 20 20 20 20 20 20 20 2f 2a 20 41 20 64 61 74 61         /* A data
48f0: 62 61 73 65 20 77 68 6f 73 65 20 6e 61 6d 65 20  base whose name 
4900: 73 70 61 63 65 20 69 73 20 62 65 69 6e 67 20 73  space is being s
4910: 65 61 72 63 68 65 64 20 2a 2f 0a 20 20 63 68 61  earched */.  cha
4920: 72 20 2a 7a 4e 61 6d 65 3b 20 20 20 2f 2a 20 4e  r *zName;   /* N
4930: 61 6d 65 20 77 65 20 61 72 65 20 73 65 61 72 63  ame we are searc
4940: 68 69 6e 67 20 66 6f 72 20 2a 2f 0a 0a 20 20 7a  hing for */..  z
4950: 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61  Name = sqlite3Na
4960: 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20  meFromToken(db, 
4970: 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a 4e  pName);.  if( zN
4980: 61 6d 65 20 29 7b 0a 20 20 20 20 6e 20 3d 20 73  ame ){.    n = s
4990: 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 3b 0a 20 20  trlen(zName);.  
49a0: 20 20 66 6f 72 28 69 3d 28 64 62 2d 3e 6e 44 62    for(i=(db->nDb
49b0: 2d 31 29 2c 20 70 44 62 3d 26 64 62 2d 3e 61 44  -1), pDb=&db->aD
49c0: 62 5b 69 5d 3b 20 69 3e 3d 30 3b 20 69 2d 2d 2c  b[i]; i>=0; i--,
49d0: 20 70 44 62 2d 2d 29 7b 0a 20 20 20 20 20 20 69   pDb--){.      i
49e0: 66 28 20 28 21 4f 4d 49 54 5f 54 45 4d 50 44 42  f( (!OMIT_TEMPDB
49f0: 20 7c 7c 20 69 21 3d 31 20 29 20 26 26 20 6e 3d   || i!=1 ) && n=
4a00: 3d 73 74 72 6c 65 6e 28 70 44 62 2d 3e 7a 4e 61  =strlen(pDb->zNa
4a10: 6d 65 29 20 26 26 20 0a 20 20 20 20 20 20 20 20  me) && .        
4a20: 20 20 30 3d 3d 73 71 6c 69 74 65 33 53 74 72 49    0==sqlite3StrI
4a30: 43 6d 70 28 70 44 62 2d 3e 7a 4e 61 6d 65 2c 20  Cmp(pDb->zName, 
4a40: 7a 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 20 20  zName) ){.      
4a50: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
4a60: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
4a70: 65 33 5f 66 72 65 65 28 7a 4e 61 6d 65 29 3b 0a  e3_free(zName);.
4a80: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a    }.  return i;.
4a90: 7d 0a 0a 2f 2a 20 54 68 65 20 74 61 62 6c 65 20  }../* The table 
4aa0: 6f 72 20 76 69 65 77 20 6f 72 20 74 72 69 67 67  or view or trigg
4ab0: 65 72 20 6e 61 6d 65 20 69 73 20 70 61 73 73 65  er name is passe
4ac0: 64 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e  d to this routin
4ad0: 65 20 76 69 61 20 74 6f 6b 65 6e 73 0a 2a 2a 20  e via tokens.** 
4ae0: 70 4e 61 6d 65 31 20 61 6e 64 20 70 4e 61 6d 65  pName1 and pName
4af0: 32 2e 20 49 66 20 74 68 65 20 74 61 62 6c 65 20  2. If the table 
4b00: 6e 61 6d 65 20 77 61 73 20 66 75 6c 6c 79 20 71  name was fully q
4b10: 75 61 6c 69 66 69 65 64 2c 20 66 6f 72 20 65 78  ualified, for ex
4b20: 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 43 52 45  ample:.**.** CRE
4b30: 41 54 45 20 54 41 42 4c 45 20 78 78 78 2e 79 79  ATE TABLE xxx.yy
4b40: 79 20 28 2e 2e 2e 29 3b 0a 2a 2a 20 0a 2a 2a 20  y (...);.** .** 
4b50: 54 68 65 6e 20 70 4e 61 6d 65 31 20 69 73 20 73  Then pName1 is s
4b60: 65 74 20 74 6f 20 22 78 78 78 22 20 61 6e 64 20  et to "xxx" and 
4b70: 70 4e 61 6d 65 32 20 22 79 79 79 22 2e 20 4f 6e  pName2 "yyy". On
4b80: 20 74 68 65 20 6f 74 68 65 72 20 68 61 6e 64 20   the other hand 
4b90: 69 66 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20  if.** the table 
4ba0: 6e 61 6d 65 20 69 73 20 6e 6f 74 20 66 75 6c 6c  name is not full
4bb0: 79 20 71 75 61 6c 69 66 69 65 64 2c 20 69 2e 65  y qualified, i.e
4bc0: 2e 3a 0a 2a 2a 0a 2a 2a 20 43 52 45 41 54 45 20  .:.**.** CREATE 
4bd0: 54 41 42 4c 45 20 79 79 79 28 2e 2e 2e 29 3b 0a  TABLE yyy(...);.
4be0: 2a 2a 0a 2a 2a 20 54 68 65 6e 20 70 4e 61 6d 65  **.** Then pName
4bf0: 31 20 69 73 20 73 65 74 20 74 6f 20 22 79 79 79  1 is set to "yyy
4c00: 22 20 61 6e 64 20 70 4e 61 6d 65 32 20 69 73 20  " and pName2 is 
4c10: 22 22 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ""..**.** This r
4c20: 6f 75 74 69 6e 65 20 73 65 74 73 20 74 68 65 20  outine sets the 
4c30: 2a 70 70 55 6e 71 75 61 6c 20 70 6f 69 6e 74 65  *ppUnqual pointe
4c40: 72 20 74 6f 20 70 6f 69 6e 74 20 61 74 20 74 68  r to point at th
4c50: 65 20 74 6f 6b 65 6e 20 28 70 4e 61 6d 65 31 20  e token (pName1 
4c60: 6f 72 0a 2a 2a 20 70 4e 61 6d 65 32 29 20 74 68  or.** pName2) th
4c70: 61 74 20 73 74 6f 72 65 73 20 74 68 65 20 75 6e  at stores the un
4c80: 71 75 61 6c 69 66 69 65 64 20 74 61 62 6c 65 20  qualified table 
4c90: 6e 61 6d 65 2e 20 20 54 68 65 20 69 6e 64 65 78  name.  The index
4ca0: 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74 61 62   of the.** datab
4cb0: 61 73 65 20 22 78 78 78 22 20 69 73 20 72 65 74  ase "xxx" is ret
4cc0: 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  urned..*/.int sq
4cd0: 6c 69 74 65 33 54 77 6f 50 61 72 74 4e 61 6d 65  lite3TwoPartName
4ce0: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
4cf0: 65 2c 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69  e,      /* Parsi
4d00: 6e 67 20 61 6e 64 20 63 6f 64 65 20 67 65 6e 65  ng and code gene
4d10: 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  rating context *
4d20: 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65  /.  Token *pName
4d30: 31 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 22  1,      /* The "
4d40: 78 78 78 22 20 69 6e 20 74 68 65 20 6e 61 6d 65  xxx" in the name
4d50: 20 22 78 78 78 2e 79 79 79 22 20 6f 72 20 22 78   "xxx.yyy" or "x
4d60: 78 78 22 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  xx" */.  Token *
4d70: 70 4e 61 6d 65 32 2c 20 20 20 20 20 20 2f 2a 20  pName2,      /* 
4d80: 54 68 65 20 22 79 79 79 22 20 69 6e 20 74 68 65  The "yyy" in the
4d90: 20 6e 61 6d 65 20 22 78 78 78 2e 79 79 79 22 20   name "xxx.yyy" 
4da0: 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 2a 70 55 6e  */.  Token **pUn
4db0: 71 75 61 6c 20 20 20 20 20 2f 2a 20 57 72 69 74  qual     /* Writ
4dc0: 65 20 74 68 65 20 75 6e 71 75 61 6c 69 66 69 65  e the unqualifie
4dd0: 64 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20 68 65  d object name he
4de0: 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69  re */.){.  int i
4df0: 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Db;             
4e00: 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
4e10: 73 65 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 6f  se holding the o
4e20: 62 6a 65 63 74 20 2a 2f 0a 20 20 73 71 6c 69 74  bject */.  sqlit
4e30: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
4e40: 3e 64 62 3b 0a 0a 20 20 69 66 28 20 70 4e 61 6d  >db;..  if( pNam
4e50: 65 32 20 26 26 20 70 4e 61 6d 65 32 2d 3e 6e 3e  e2 && pName2->n>
4e60: 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  0 ){.    assert(
4e70: 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20   !db->init.busy 
4e80: 29 3b 0a 20 20 20 20 2a 70 55 6e 71 75 61 6c 20  );.    *pUnqual 
4e90: 3d 20 70 4e 61 6d 65 32 3b 0a 20 20 20 20 69 44  = pName2;.    iD
4ea0: 62 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 44  b = sqlite3FindD
4eb0: 62 28 64 62 2c 20 70 4e 61 6d 65 31 29 3b 0a 20  b(db, pName1);. 
4ec0: 20 20 20 69 66 28 20 69 44 62 3c 30 20 29 7b 0a     if( iDb<0 ){.
4ed0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
4ee0: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 75  orMsg(pParse, "u
4ef0: 6e 6b 6e 6f 77 6e 20 64 61 74 61 62 61 73 65 20  nknown database 
4f00: 25 54 22 2c 20 70 4e 61 6d 65 31 29 3b 0a 20 20  %T", pName1);.  
4f10: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72      pParse->nErr
4f20: 2b 2b 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ++;.      return
4f30: 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c   -1;.    }.  }el
4f40: 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  se{.    assert( 
4f50: 64 62 2d 3e 69 6e 69 74 2e 69 44 62 3d 3d 30 20  db->init.iDb==0 
4f60: 7c 7c 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  || db->init.busy
4f70: 20 29 3b 0a 20 20 20 20 69 44 62 20 3d 20 64 62   );.    iDb = db
4f80: 2d 3e 69 6e 69 74 2e 69 44 62 3b 0a 20 20 20 20  ->init.iDb;.    
4f90: 2a 70 55 6e 71 75 61 6c 20 3d 20 70 4e 61 6d 65  *pUnqual = pName
4fa0: 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  1;.  }.  return 
4fb0: 69 44 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  iDb;.}../*.** Th
4fc0: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73  is routine is us
4fd0: 65 64 20 74 6f 20 63 68 65 63 6b 20 69 66 20 74  ed to check if t
4fe0: 68 65 20 55 54 46 2d 38 20 73 74 72 69 6e 67 20  he UTF-8 string 
4ff0: 7a 4e 61 6d 65 20 69 73 20 61 20 6c 65 67 61 6c  zName is a legal
5000: 0a 2a 2a 20 75 6e 71 75 61 6c 69 66 69 65 64 20  .** unqualified 
5010: 6e 61 6d 65 20 66 6f 72 20 61 20 6e 65 77 20 73  name for a new s
5020: 63 68 65 6d 61 20 6f 62 6a 65 63 74 20 28 74 61  chema object (ta
5030: 62 6c 65 2c 20 69 6e 64 65 78 2c 20 76 69 65 77  ble, index, view
5040: 20 6f 72 0a 2a 2a 20 74 72 69 67 67 65 72 29 2e   or.** trigger).
5050: 20 41 6c 6c 20 6e 61 6d 65 73 20 61 72 65 20 6c   All names are l
5060: 65 67 61 6c 20 65 78 63 65 70 74 20 74 68 6f 73  egal except thos
5070: 65 20 74 68 61 74 20 62 65 67 69 6e 20 77 69 74  e that begin wit
5080: 68 20 74 68 65 20 73 74 72 69 6e 67 0a 2a 2a 20  h the string.** 
5090: 22 73 71 6c 69 74 65 5f 22 20 28 69 6e 20 75 70  "sqlite_" (in up
50a0: 70 65 72 2c 20 6c 6f 77 65 72 20 6f 72 20 6d 69  per, lower or mi
50b0: 78 65 64 20 63 61 73 65 29 2e 20 54 68 69 73 20  xed case). This 
50c0: 70 6f 72 74 69 6f 6e 20 6f 66 20 74 68 65 20 6e  portion of the n
50d0: 61 6d 65 73 70 61 63 65 0a 2a 2a 20 69 73 20 72  amespace.** is r
50e0: 65 73 65 72 76 65 64 20 66 6f 72 20 69 6e 74 65  eserved for inte
50f0: 72 6e 61 6c 20 75 73 65 2e 0a 2a 2f 0a 69 6e 74  rnal use..*/.int
5100: 20 73 71 6c 69 74 65 33 43 68 65 63 6b 4f 62 6a   sqlite3CheckObj
5110: 65 63 74 4e 61 6d 65 28 50 61 72 73 65 20 2a 70  ectName(Parse *p
5120: 50 61 72 73 65 2c 20 63 6f 6e 73 74 20 63 68 61  Parse, const cha
5130: 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69 66 28  r *zName){.  if(
5140: 20 21 70 50 61 72 73 65 2d 3e 64 62 2d 3e 69 6e   !pParse->db->in
5150: 69 74 2e 62 75 73 79 20 26 26 20 70 50 61 72 73  it.busy && pPars
5160: 65 2d 3e 6e 65 73 74 65 64 3d 3d 30 20 0a 20 20  e->nested==0 .  
5170: 20 20 20 20 20 20 20 20 26 26 20 28 70 50 61 72          && (pPar
5180: 73 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20  se->db->flags & 
5190: 53 51 4c 49 54 45 5f 57 72 69 74 65 53 63 68 65  SQLITE_WriteSche
51a0: 6d 61 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20  ma)==0.         
51b0: 20 26 26 20 30 3d 3d 73 71 6c 69 74 65 33 53 74   && 0==sqlite3St
51c0: 72 4e 49 43 6d 70 28 7a 4e 61 6d 65 2c 20 22 73  rNICmp(zName, "s
51d0: 71 6c 69 74 65 5f 22 2c 20 37 29 20 29 7b 0a 20  qlite_", 7) ){. 
51e0: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
51f0: 73 67 28 70 50 61 72 73 65 2c 20 22 6f 62 6a 65  sg(pParse, "obje
5200: 63 74 20 6e 61 6d 65 20 72 65 73 65 72 76 65 64  ct name reserved
5210: 20 66 6f 72 20 69 6e 74 65 72 6e 61 6c 20 75 73   for internal us
5220: 65 3a 20 25 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a  e: %s", zName);.
5230: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
5240: 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72  E_ERROR;.  }.  r
5250: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
5260: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65 67 69 6e 20  .}../*.** Begin 
5270: 63 6f 6e 73 74 72 75 63 74 69 6e 67 20 61 20 6e  constructing a n
5280: 65 77 20 74 61 62 6c 65 20 72 65 70 72 65 73 65  ew table represe
5290: 6e 74 61 74 69 6f 6e 20 69 6e 20 6d 65 6d 6f 72  ntation in memor
52a0: 79 2e 20 20 54 68 69 73 20 69 73 0a 2a 2a 20 74  y.  This is.** t
52b0: 68 65 20 66 69 72 73 74 20 6f 66 20 73 65 76 65  he first of seve
52c0: 72 61 6c 20 61 63 74 69 6f 6e 20 72 6f 75 74 69  ral action routi
52d0: 6e 65 73 20 74 68 61 74 20 67 65 74 20 63 61 6c  nes that get cal
52e0: 6c 65 64 20 69 6e 20 72 65 73 70 6f 6e 73 65 0a  led in response.
52f0: 2a 2a 20 74 6f 20 61 20 43 52 45 41 54 45 20 54  ** to a CREATE T
5300: 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 20  ABLE statement. 
5310: 20 49 6e 20 70 61 72 74 69 63 75 6c 61 72 2c 20   In particular, 
5320: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
5330: 63 61 6c 6c 65 64 0a 2a 2a 20 61 66 74 65 72 20  called.** after 
5340: 73 65 65 69 6e 67 20 74 6f 6b 65 6e 73 20 22 43  seeing tokens "C
5350: 52 45 41 54 45 22 20 61 6e 64 20 22 54 41 42 4c  REATE" and "TABL
5360: 45 22 20 61 6e 64 20 74 68 65 20 74 61 62 6c 65  E" and the table
5370: 20 6e 61 6d 65 2e 20 54 68 65 20 69 73 54 65 6d   name. The isTem
5380: 70 0a 2a 2a 20 66 6c 61 67 20 69 73 20 74 72 75  p.** flag is tru
5390: 65 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 73  e if the table s
53a0: 68 6f 75 6c 64 20 62 65 20 73 74 6f 72 65 64 20  hould be stored 
53b0: 69 6e 20 74 68 65 20 61 75 78 69 6c 69 61 72 79  in the auxiliary
53c0: 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c   database.** fil
53d0: 65 20 69 6e 73 74 65 61 64 20 6f 66 20 69 6e 20  e instead of in 
53e0: 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73  the main databas
53f0: 65 20 66 69 6c 65 2e 20 20 54 68 69 73 20 69 73  e file.  This is
5400: 20 6e 6f 72 6d 61 6c 6c 79 20 74 68 65 20 63 61   normally the ca
5410: 73 65 0a 2a 2a 20 77 68 65 6e 20 74 68 65 20 22  se.** when the "
5420: 54 45 4d 50 22 20 6f 72 20 22 54 45 4d 50 4f 52  TEMP" or "TEMPOR
5430: 41 52 59 22 20 6b 65 79 77 6f 72 64 20 6f 63 63  ARY" keyword occ
5440: 75 72 73 20 69 6e 20 62 65 74 77 65 65 6e 0a 2a  urs in between.*
5450: 2a 20 43 52 45 41 54 45 20 61 6e 64 20 54 41 42  * CREATE and TAB
5460: 4c 45 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65  LE..**.** The ne
5470: 77 20 74 61 62 6c 65 20 72 65 63 6f 72 64 20 69  w table record i
5480: 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 61 6e  s initialized an
5490: 64 20 70 75 74 20 69 6e 20 70 50 61 72 73 65 2d  d put in pParse-
54a0: 3e 70 4e 65 77 54 61 62 6c 65 2e 0a 2a 2a 20 41  >pNewTable..** A
54b0: 73 20 6d 6f 72 65 20 6f 66 20 74 68 65 20 43 52  s more of the CR
54c0: 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65  EATE TABLE state
54d0: 6d 65 6e 74 20 69 73 20 70 61 72 73 65 64 2c 20  ment is parsed, 
54e0: 61 64 64 69 74 69 6f 6e 61 6c 20 61 63 74 69 6f  additional actio
54f0: 6e 0a 2a 2a 20 72 6f 75 74 69 6e 65 73 20 77 69  n.** routines wi
5500: 6c 6c 20 62 65 20 63 61 6c 6c 65 64 20 74 6f 20  ll be called to 
5510: 61 64 64 20 6d 6f 72 65 20 69 6e 66 6f 72 6d 61  add more informa
5520: 74 69 6f 6e 20 74 6f 20 74 68 69 73 20 72 65 63  tion to this rec
5530: 6f 72 64 2e 0a 2a 2a 20 41 74 20 74 68 65 20 65  ord..** At the e
5540: 6e 64 20 6f 66 20 74 68 65 20 43 52 45 41 54 45  nd of the CREATE
5550: 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74   TABLE statement
5560: 2c 20 74 68 65 20 73 71 6c 69 74 65 33 45 6e 64  , the sqlite3End
5570: 54 61 62 6c 65 28 29 20 72 6f 75 74 69 6e 65 0a  Table() routine.
5580: 2a 2a 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20  ** is called to 
5590: 63 6f 6d 70 6c 65 74 65 20 74 68 65 20 63 6f 6e  complete the con
55a0: 73 74 72 75 63 74 69 6f 6e 20 6f 66 20 74 68 65  struction of the
55b0: 20 6e 65 77 20 74 61 62 6c 65 20 72 65 63 6f 72   new table recor
55c0: 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  d..*/.void sqlit
55d0: 65 33 53 74 61 72 74 54 61 62 6c 65 28 0a 20 20  e3StartTable(.  
55e0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
55f0: 20 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e 74 65   /* Parser conte
5600: 78 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  xt */.  Token *p
5610: 4e 61 6d 65 31 2c 20 20 20 2f 2a 20 46 69 72 73  Name1,   /* Firs
5620: 74 20 70 61 72 74 20 6f 66 20 74 68 65 20 6e 61  t part of the na
5630: 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  me of the table 
5640: 6f 72 20 76 69 65 77 20 2a 2f 0a 20 20 54 6f 6b  or view */.  Tok
5650: 65 6e 20 2a 70 4e 61 6d 65 32 2c 20 20 20 2f 2a  en *pName2,   /*
5660: 20 53 65 63 6f 6e 64 20 70 61 72 74 20 6f 66 20   Second part of 
5670: 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
5680: 74 61 62 6c 65 20 6f 72 20 76 69 65 77 20 2a 2f  table or view */
5690: 0a 20 20 69 6e 74 20 69 73 54 65 6d 70 2c 20 20  .  int isTemp,  
56a0: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74      /* True if t
56b0: 68 69 73 20 69 73 20 61 20 54 45 4d 50 20 74 61  his is a TEMP ta
56c0: 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73 56  ble */.  int isV
56d0: 69 65 77 2c 20 20 20 20 20 20 2f 2a 20 54 72 75  iew,      /* Tru
56e0: 65 20 69 66 20 74 68 69 73 20 69 73 20 61 20 56  e if this is a V
56f0: 49 45 57 20 2a 2f 0a 20 20 69 6e 74 20 69 73 56  IEW */.  int isV
5700: 69 72 74 75 61 6c 2c 20 20 20 2f 2a 20 54 72 75  irtual,   /* Tru
5710: 65 20 69 66 20 74 68 69 73 20 69 73 20 61 20 56  e if this is a V
5720: 49 52 54 55 41 4c 20 74 61 62 6c 65 20 2a 2f 0a  IRTUAL table */.
5730: 20 20 69 6e 74 20 6e 6f 45 72 72 20 20 20 20 20    int noErr     
5740: 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 68 69 6e 67     /* Do nothing
5750: 20 69 66 20 74 61 62 6c 65 20 61 6c 72 65 61 64   if table alread
5760: 79 20 65 78 69 73 74 73 20 2a 2f 0a 29 7b 0a 20  y exists */.){. 
5770: 20 54 61 62 6c 65 20 2a 70 54 61 62 6c 65 3b 0a   Table *pTable;.
5780: 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20    char *zName = 
5790: 30 3b 20 2f 2a 20 54 68 65 20 6e 61 6d 65 20 6f  0; /* The name o
57a0: 66 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20  f the new table 
57b0: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
57c0: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
57d0: 20 56 64 62 65 20 2a 76 3b 0a 20 20 69 6e 74 20   Vdbe *v;.  int 
57e0: 69 44 62 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  iDb;         /* 
57f0: 44 61 74 61 62 61 73 65 20 6e 75 6d 62 65 72 20  Database number 
5800: 74 6f 20 63 72 65 61 74 65 20 74 68 65 20 74 61  to create the ta
5810: 62 6c 65 20 69 6e 20 2a 2f 0a 20 20 54 6f 6b 65  ble in */.  Toke
5820: 6e 20 2a 70 4e 61 6d 65 3b 20 20 20 20 2f 2a 20  n *pName;    /* 
5830: 55 6e 71 75 61 6c 69 66 69 65 64 20 6e 61 6d 65  Unqualified name
5840: 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74 6f   of the table to
5850: 20 63 72 65 61 74 65 20 2a 2f 0a 0a 20 20 2f 2a   create */..  /*
5860: 20 54 68 65 20 74 61 62 6c 65 20 6f 72 20 76 69   The table or vi
5870: 65 77 20 6e 61 6d 65 20 74 6f 20 63 72 65 61 74  ew name to creat
5880: 65 20 69 73 20 70 61 73 73 65 64 20 74 6f 20 74  e is passed to t
5890: 68 69 73 20 72 6f 75 74 69 6e 65 20 76 69 61 20  his routine via 
58a0: 74 6f 6b 65 6e 73 0a 20 20 2a 2a 20 70 4e 61 6d  tokens.  ** pNam
58b0: 65 31 20 61 6e 64 20 70 4e 61 6d 65 32 2e 20 49  e1 and pName2. I
58c0: 66 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65  f the table name
58d0: 20 77 61 73 20 66 75 6c 6c 79 20 71 75 61 6c 69   was fully quali
58e0: 66 69 65 64 2c 20 66 6f 72 20 65 78 61 6d 70 6c  fied, for exampl
58f0: 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43 52 45  e:.  **.  ** CRE
5900: 41 54 45 20 54 41 42 4c 45 20 78 78 78 2e 79 79  ATE TABLE xxx.yy
5910: 79 20 28 2e 2e 2e 29 3b 0a 20 20 2a 2a 20 0a 20  y (...);.  ** . 
5920: 20 2a 2a 20 54 68 65 6e 20 70 4e 61 6d 65 31 20   ** Then pName1 
5930: 69 73 20 73 65 74 20 74 6f 20 22 78 78 78 22 20  is set to "xxx" 
5940: 61 6e 64 20 70 4e 61 6d 65 32 20 22 79 79 79 22  and pName2 "yyy"
5950: 2e 20 4f 6e 20 74 68 65 20 6f 74 68 65 72 20 68  . On the other h
5960: 61 6e 64 20 69 66 0a 20 20 2a 2a 20 74 68 65 20  and if.  ** the 
5970: 74 61 62 6c 65 20 6e 61 6d 65 20 69 73 20 6e 6f  table name is no
5980: 74 20 66 75 6c 6c 79 20 71 75 61 6c 69 66 69 65  t fully qualifie
5990: 64 2c 20 69 2e 65 2e 3a 0a 20 20 2a 2a 0a 20 20  d, i.e.:.  **.  
59a0: 2a 2a 20 43 52 45 41 54 45 20 54 41 42 4c 45 20  ** CREATE TABLE 
59b0: 79 79 79 28 2e 2e 2e 29 3b 0a 20 20 2a 2a 0a 20  yyy(...);.  **. 
59c0: 20 2a 2a 20 54 68 65 6e 20 70 4e 61 6d 65 31 20   ** Then pName1 
59d0: 69 73 20 73 65 74 20 74 6f 20 22 79 79 79 22 20  is set to "yyy" 
59e0: 61 6e 64 20 70 4e 61 6d 65 32 20 69 73 20 22 22  and pName2 is ""
59f0: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20  ..  **.  ** The 
5a00: 63 61 6c 6c 20 62 65 6c 6f 77 20 73 65 74 73 20  call below sets 
5a10: 74 68 65 20 70 4e 61 6d 65 20 70 6f 69 6e 74 65  the pName pointe
5a20: 72 20 74 6f 20 70 6f 69 6e 74 20 61 74 20 74 68  r to point at th
5a30: 65 20 74 6f 6b 65 6e 20 28 70 4e 61 6d 65 31 20  e token (pName1 
5a40: 6f 72 0a 20 20 2a 2a 20 70 4e 61 6d 65 32 29 20  or.  ** pName2) 
5a50: 74 68 61 74 20 73 74 6f 72 65 73 20 74 68 65 20  that stores the 
5a60: 75 6e 71 75 61 6c 69 66 69 65 64 20 74 61 62 6c  unqualified tabl
5a70: 65 20 6e 61 6d 65 2e 20 54 68 65 20 76 61 72 69  e name. The vari
5a80: 61 62 6c 65 20 69 44 62 20 69 73 0a 20 20 2a 2a  able iDb is.  **
5a90: 20 73 65 74 20 74 6f 20 74 68 65 20 69 6e 64 65   set to the inde
5aa0: 78 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  x of the databas
5ab0: 65 20 74 68 61 74 20 74 68 65 20 74 61 62 6c 65  e that the table
5ac0: 20 6f 72 20 76 69 65 77 20 69 73 20 74 6f 20 62   or view is to b
5ad0: 65 0a 20 20 2a 2a 20 63 72 65 61 74 65 64 20 69  e.  ** created i
5ae0: 6e 2e 0a 20 20 2a 2f 0a 20 20 69 44 62 20 3d 20  n..  */.  iDb = 
5af0: 73 71 6c 69 74 65 33 54 77 6f 50 61 72 74 4e 61  sqlite3TwoPartNa
5b00: 6d 65 28 70 50 61 72 73 65 2c 20 70 4e 61 6d 65  me(pParse, pName
5b10: 31 2c 20 70 4e 61 6d 65 32 2c 20 26 70 4e 61 6d  1, pName2, &pNam
5b20: 65 29 3b 0a 20 20 69 66 28 20 69 44 62 3c 30 20  e);.  if( iDb<0 
5b30: 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
5b40: 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26 26 20  !OMIT_TEMPDB && 
5b50: 69 73 54 65 6d 70 20 26 26 20 69 44 62 3e 31 20  isTemp && iDb>1 
5b60: 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 63 72 65  ){.    /* If cre
5b70: 61 74 69 6e 67 20 61 20 74 65 6d 70 20 74 61 62  ating a temp tab
5b80: 6c 65 2c 20 74 68 65 20 6e 61 6d 65 20 6d 61 79  le, the name may
5b90: 20 6e 6f 74 20 62 65 20 71 75 61 6c 69 66 69 65   not be qualifie
5ba0: 64 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33  d */.    sqlite3
5bb0: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
5bc0: 20 22 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c   "temporary tabl
5bd0: 65 20 6e 61 6d 65 20 6d 75 73 74 20 62 65 20 75  e name must be u
5be0: 6e 71 75 61 6c 69 66 69 65 64 22 29 3b 0a 20 20  nqualified");.  
5bf0: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
5c00: 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42  if( !OMIT_TEMPDB
5c10: 20 26 26 20 69 73 54 65 6d 70 20 29 20 69 44 62   && isTemp ) iDb
5c20: 20 3d 20 31 3b 0a 0a 20 20 70 50 61 72 73 65 2d   = 1;..  pParse-
5c30: 3e 73 4e 61 6d 65 54 6f 6b 65 6e 20 3d 20 2a 70  >sNameToken = *p
5c40: 4e 61 6d 65 3b 0a 20 20 7a 4e 61 6d 65 20 3d 20  Name;.  zName = 
5c50: 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54  sqlite3NameFromT
5c60: 6f 6b 65 6e 28 64 62 2c 20 70 4e 61 6d 65 29 3b  oken(db, pName);
5c70: 0a 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20  .  if( zName==0 
5c80: 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
5c90: 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74  SQLITE_OK!=sqlit
5ca0: 65 33 43 68 65 63 6b 4f 62 6a 65 63 74 4e 61 6d  e3CheckObjectNam
5cb0: 65 28 70 50 61 72 73 65 2c 20 7a 4e 61 6d 65 29  e(pParse, zName)
5cc0: 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 62 65 67   ){.    goto beg
5cd0: 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b 0a  in_table_error;.
5ce0: 20 20 7d 0a 20 20 69 66 28 20 64 62 2d 3e 69 6e    }.  if( db->in
5cf0: 69 74 2e 69 44 62 3d 3d 31 20 29 20 69 73 54 65  it.iDb==1 ) isTe
5d00: 6d 70 20 3d 20 31 3b 0a 23 69 66 6e 64 65 66 20  mp = 1;.#ifndef 
5d10: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48  SQLITE_OMIT_AUTH
5d20: 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 61 73 73 65  ORIZATION.  asse
5d30: 72 74 28 20 28 69 73 54 65 6d 70 20 26 20 31 29  rt( (isTemp & 1)
5d40: 3d 3d 69 73 54 65 6d 70 20 29 3b 0a 20 20 7b 0a  ==isTemp );.  {.
5d50: 20 20 20 20 69 6e 74 20 63 6f 64 65 3b 0a 20 20      int code;.  
5d60: 20 20 63 68 61 72 20 2a 7a 44 62 20 3d 20 64 62    char *zDb = db
5d70: 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65  ->aDb[iDb].zName
5d80: 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
5d90: 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73  3AuthCheck(pPars
5da0: 65 2c 20 53 51 4c 49 54 45 5f 49 4e 53 45 52 54  e, SQLITE_INSERT
5db0: 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69  , SCHEMA_TABLE(i
5dc0: 73 54 65 6d 70 29 2c 20 30 2c 20 7a 44 62 29 20  sTemp), 0, zDb) 
5dd0: 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 62 65  ){.      goto be
5de0: 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b  gin_table_error;
5df0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69  .    }.    if( i
5e00: 73 56 69 65 77 20 29 7b 0a 20 20 20 20 20 20 69  sView ){.      i
5e10: 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20  f( !OMIT_TEMPDB 
5e20: 26 26 20 69 73 54 65 6d 70 20 29 7b 0a 20 20 20  && isTemp ){.   
5e30: 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49       code = SQLI
5e40: 54 45 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f 56  TE_CREATE_TEMP_V
5e50: 49 45 57 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  IEW;.      }else
5e60: 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20 3d  {.        code =
5e70: 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 56   SQLITE_CREATE_V
5e80: 49 45 57 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  IEW;.      }.   
5e90: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 66   }else{.      if
5ea0: 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26  ( !OMIT_TEMPDB &
5eb0: 26 20 69 73 54 65 6d 70 20 29 7b 0a 20 20 20 20  & isTemp ){.    
5ec0: 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54      code = SQLIT
5ed0: 45 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f 54 41  E_CREATE_TEMP_TA
5ee0: 42 4c 45 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  BLE;.      }else
5ef0: 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20 3d  {.        code =
5f00: 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54   SQLITE_CREATE_T
5f10: 41 42 4c 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ABLE;.      }.  
5f20: 20 20 7d 0a 20 20 20 20 69 66 28 20 21 69 73 56    }.    if( !isV
5f30: 69 72 74 75 61 6c 20 26 26 20 73 71 6c 69 74 65  irtual && sqlite
5f40: 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73  3AuthCheck(pPars
5f50: 65 2c 20 63 6f 64 65 2c 20 7a 4e 61 6d 65 2c 20  e, code, zName, 
5f60: 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20  0, zDb) ){.     
5f70: 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c   goto begin_tabl
5f80: 65 5f 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20  e_error;.    }. 
5f90: 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
5fa0: 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 6e 65  Make sure the ne
5fb0: 77 20 74 61 62 6c 65 20 6e 61 6d 65 20 64 6f 65  w table name doe
5fc0: 73 20 6e 6f 74 20 63 6f 6c 6c 69 64 65 20 77 69  s not collide wi
5fd0: 74 68 20 61 6e 20 65 78 69 73 74 69 6e 67 0a 20  th an existing. 
5fe0: 20 2a 2a 20 69 6e 64 65 78 20 6f 72 20 74 61 62   ** index or tab
5ff0: 6c 65 20 6e 61 6d 65 20 69 6e 20 74 68 65 20 73  le name in the s
6000: 61 6d 65 20 64 61 74 61 62 61 73 65 2e 20 20 49  ame database.  I
6010: 73 73 75 65 20 61 6e 20 65 72 72 6f 72 20 6d 65  ssue an error me
6020: 73 73 61 67 65 20 69 66 0a 20 20 2a 2a 20 69 74  ssage if.  ** it
6030: 20 64 6f 65 73 2e 20 54 68 65 20 65 78 63 65 70   does. The excep
6040: 74 69 6f 6e 20 69 73 20 69 66 20 74 68 65 20 73  tion is if the s
6050: 74 61 74 65 6d 65 6e 74 20 62 65 69 6e 67 20 70  tatement being p
6060: 61 72 73 65 64 20 77 61 73 20 70 61 73 73 65 64  arsed was passed
6070: 0a 20 20 2a 2a 20 74 6f 20 61 6e 20 73 71 6c 69  .  ** to an sqli
6080: 74 65 33 5f 64 65 63 6c 61 72 65 5f 76 74 61 62  te3_declare_vtab
6090: 28 29 20 63 61 6c 6c 2e 20 49 6e 20 74 68 61 74  () call. In that
60a0: 20 63 61 73 65 20 6f 6e 6c 79 20 74 68 65 20 63   case only the c
60b0: 6f 6c 75 6d 6e 20 6e 61 6d 65 73 0a 20 20 2a 2a  olumn names.  **
60c0: 20 61 6e 64 20 74 79 70 65 73 20 77 69 6c 6c 20   and types will 
60d0: 62 65 20 75 73 65 64 2c 20 73 6f 20 74 68 65 72  be used, so ther
60e0: 65 20 69 73 20 6e 6f 20 6e 65 65 64 20 74 6f 20  e is no need to 
60f0: 74 65 73 74 20 66 6f 72 20 6e 61 6d 65 73 70 61  test for namespa
6100: 63 65 0a 20 20 2a 2a 20 63 6f 6c 6c 69 73 69 6f  ce.  ** collisio
6110: 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21  ns..  */.  if( !
6120: 49 4e 5f 44 45 43 4c 41 52 45 5f 56 54 41 42 20  IN_DECLARE_VTAB 
6130: 29 7b 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54  ){.    if( SQLIT
6140: 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65 61  E_OK!=sqlite3Rea
6150: 64 53 63 68 65 6d 61 28 70 50 61 72 73 65 29 20  dSchema(pParse) 
6160: 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 62 65  ){.      goto be
6170: 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b  gin_table_error;
6180: 0a 20 20 20 20 7d 0a 20 20 20 20 70 54 61 62 6c  .    }.    pTabl
6190: 65 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 54  e = sqlite3FindT
61a0: 61 62 6c 65 28 64 62 2c 20 7a 4e 61 6d 65 2c 20  able(db, zName, 
61b0: 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61  db->aDb[iDb].zNa
61c0: 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 70 54 61  me);.    if( pTa
61d0: 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ble ){.      if(
61e0: 20 21 6e 6f 45 72 72 20 29 7b 0a 20 20 20 20 20   !noErr ){.     
61f0: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
6200: 73 67 28 70 50 61 72 73 65 2c 20 22 74 61 62 6c  sg(pParse, "tabl
6210: 65 20 25 54 20 61 6c 72 65 61 64 79 20 65 78 69  e %T already exi
6220: 73 74 73 22 2c 20 70 4e 61 6d 65 29 3b 0a 20 20  sts", pName);.  
6230: 20 20 20 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f      }.      goto
6240: 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72   begin_table_err
6250: 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  or;.    }.    if
6260: 28 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 64  ( sqlite3FindInd
6270: 65 78 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 30 29  ex(db, zName, 0)
6280: 21 3d 30 20 26 26 20 28 69 44 62 3d 3d 30 20 7c  !=0 && (iDb==0 |
6290: 7c 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  | !db->init.busy
62a0: 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ) ){.      sqlit
62b0: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
62c0: 65 2c 20 22 74 68 65 72 65 20 69 73 20 61 6c 72  e, "there is alr
62d0: 65 61 64 79 20 61 6e 20 69 6e 64 65 78 20 6e 61  eady an index na
62e0: 6d 65 64 20 25 73 22 2c 20 7a 4e 61 6d 65 29 3b  med %s", zName);
62f0: 0a 20 20 20 20 20 20 67 6f 74 6f 20 62 65 67 69  .      goto begi
6300: 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b 0a 20  n_table_error;. 
6310: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 54 61 62     }.  }..  pTab
6320: 6c 65 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  le = sqlite3DbMa
6330: 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a  llocZero(db, siz
6340: 65 6f 66 28 54 61 62 6c 65 29 29 3b 0a 20 20 69  eof(Table));.  i
6350: 66 28 20 70 54 61 62 6c 65 3d 3d 30 20 29 7b 0a  f( pTable==0 ){.
6360: 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61      db->mallocFa
6370: 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20 70 50  iled = 1;.    pP
6380: 61 72 73 65 2d 3e 72 63 20 3d 20 53 51 4c 49 54  arse->rc = SQLIT
6390: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 70 50 61  E_NOMEM;.    pPa
63a0: 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20  rse->nErr++;.   
63b0: 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c   goto begin_tabl
63c0: 65 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 70  e_error;.  }.  p
63d0: 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 20 3d 20 7a  Table->zName = z
63e0: 4e 61 6d 65 3b 0a 20 20 70 54 61 62 6c 65 2d 3e  Name;.  pTable->
63f0: 69 50 4b 65 79 20 3d 20 2d 31 3b 0a 20 20 70 54  iPKey = -1;.  pT
6400: 61 62 6c 65 2d 3e 70 53 63 68 65 6d 61 20 3d 20  able->pSchema = 
6410: 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53 63  db->aDb[iDb].pSc
6420: 68 65 6d 61 3b 0a 20 20 70 54 61 62 6c 65 2d 3e  hema;.  pTable->
6430: 6e 52 65 66 20 3d 20 31 3b 0a 20 20 69 66 28 20  nRef = 1;.  if( 
6440: 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
6450: 65 20 29 20 73 71 6c 69 74 65 33 44 65 6c 65 74  e ) sqlite3Delet
6460: 65 54 61 62 6c 65 28 70 50 61 72 73 65 2d 3e 70  eTable(pParse->p
6470: 4e 65 77 54 61 62 6c 65 29 3b 0a 20 20 70 50 61  NewTable);.  pPa
6480: 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 3d  rse->pNewTable =
6490: 20 70 54 61 62 6c 65 3b 0a 0a 20 20 2f 2a 20 49   pTable;..  /* I
64a0: 66 20 74 68 69 73 20 69 73 20 74 68 65 20 6d 61  f this is the ma
64b0: 67 69 63 20 73 71 6c 69 74 65 5f 73 65 71 75 65  gic sqlite_seque
64c0: 6e 63 65 20 74 61 62 6c 65 20 75 73 65 64 20 62  nce table used b
64d0: 79 20 61 75 74 6f 69 6e 63 72 65 6d 65 6e 74 2c  y autoincrement,
64e0: 0a 20 20 2a 2a 20 74 68 65 6e 20 72 65 63 6f 72  .  ** then recor
64f0: 64 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  d a pointer to t
6500: 68 69 73 20 74 61 62 6c 65 20 69 6e 20 74 68 65  his table in the
6510: 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 73   main database s
6520: 74 72 75 63 74 75 72 65 0a 20 20 2a 2a 20 73 6f  tructure.  ** so
6530: 20 74 68 61 74 20 49 4e 53 45 52 54 20 63 61 6e   that INSERT can
6540: 20 66 69 6e 64 20 74 68 65 20 74 61 62 6c 65 20   find the table 
6550: 65 61 73 69 6c 79 2e 0a 20 20 2a 2f 0a 23 69 66  easily..  */.#if
6560: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
6570: 5f 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 0a 20  _AUTOINCREMENT. 
6580: 20 69 66 28 20 21 70 50 61 72 73 65 2d 3e 6e 65   if( !pParse->ne
6590: 73 74 65 64 20 26 26 20 73 74 72 63 6d 70 28 7a  sted && strcmp(z
65a0: 4e 61 6d 65 2c 20 22 73 71 6c 69 74 65 5f 73 65  Name, "sqlite_se
65b0: 71 75 65 6e 63 65 22 29 3d 3d 30 20 29 7b 0a 20  quence")==0 ){. 
65c0: 20 20 20 70 54 61 62 6c 65 2d 3e 70 53 63 68 65     pTable->pSche
65d0: 6d 61 2d 3e 70 53 65 71 54 61 62 20 3d 20 70 54  ma->pSeqTab = pT
65e0: 61 62 6c 65 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  able;.  }.#endif
65f0: 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20 67 65 6e  ..  /* Begin gen
6600: 65 72 61 74 69 6e 67 20 74 68 65 20 63 6f 64 65  erating the code
6610: 20 74 68 61 74 20 77 69 6c 6c 20 69 6e 73 65 72   that will inser
6620: 74 20 74 68 65 20 74 61 62 6c 65 20 72 65 63 6f  t the table reco
6630: 72 64 20 69 6e 74 6f 0a 20 20 2a 2a 20 74 68 65  rd into.  ** the
6640: 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52 20 74   SQLITE_MASTER t
6650: 61 62 6c 65 2e 20 20 4e 6f 74 65 20 69 6e 20 70  able.  Note in p
6660: 61 72 74 69 63 75 6c 61 72 20 74 68 61 74 20 77  articular that w
6670: 65 20 6d 75 73 74 20 67 6f 20 61 68 65 61 64 0a  e must go ahead.
6680: 20 20 2a 2a 20 61 6e 64 20 61 6c 6c 6f 63 61 74    ** and allocat
6690: 65 20 74 68 65 20 72 65 63 6f 72 64 20 6e 75 6d  e the record num
66a0: 62 65 72 20 66 6f 72 20 74 68 65 20 74 61 62 6c  ber for the tabl
66b0: 65 20 65 6e 74 72 79 20 6e 6f 77 2e 20 20 42 65  e entry now.  Be
66c0: 66 6f 72 65 20 61 6e 79 0a 20 20 2a 2a 20 50 52  fore any.  ** PR
66d0: 49 4d 41 52 59 20 4b 45 59 20 6f 72 20 55 4e 49  IMARY KEY or UNI
66e0: 51 55 45 20 6b 65 79 77 6f 72 64 73 20 61 72 65  QUE keywords are
66f0: 20 70 61 72 73 65 64 2e 20 20 54 68 6f 73 65 20   parsed.  Those 
6700: 6b 65 79 77 6f 72 64 73 20 77 69 6c 6c 20 63 61  keywords will ca
6710: 75 73 65 0a 20 20 2a 2a 20 69 6e 64 69 63 65 73  use.  ** indices
6720: 20 74 6f 20 62 65 20 63 72 65 61 74 65 64 20 61   to be created a
6730: 6e 64 20 74 68 65 20 74 61 62 6c 65 20 72 65 63  nd the table rec
6740: 6f 72 64 20 6d 75 73 74 20 63 6f 6d 65 20 62 65  ord must come be
6750: 66 6f 72 65 20 74 68 65 20 0a 20 20 2a 2a 20 69  fore the .  ** i
6760: 6e 64 69 63 65 73 2e 20 20 48 65 6e 63 65 2c 20  ndices.  Hence, 
6770: 74 68 65 20 72 65 63 6f 72 64 20 6e 75 6d 62 65  the record numbe
6780: 72 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20  r for the table 
6790: 6d 75 73 74 20 62 65 20 61 6c 6c 6f 63 61 74 65  must be allocate
67a0: 64 0a 20 20 2a 2a 20 6e 6f 77 2e 0a 20 20 2a 2f  d.  ** now..  */
67b0: 0a 20 20 69 66 28 20 21 64 62 2d 3e 69 6e 69 74  .  if( !db->init
67c0: 2e 62 75 73 79 20 26 26 20 28 76 20 3d 20 73 71  .busy && (v = sq
67d0: 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
67e0: 72 73 65 29 29 21 3d 30 20 29 7b 0a 20 20 20 20  rse))!=0 ){.    
67f0: 69 6e 74 20 6a 31 3b 0a 20 20 20 20 69 6e 74 20  int j1;.    int 
6800: 66 69 6c 65 46 6f 72 6d 61 74 3b 0a 20 20 20 20  fileFormat;.    
6810: 69 6e 74 20 72 65 67 31 2c 20 72 65 67 32 2c 20  int reg1, reg2, 
6820: 72 65 67 33 3b 0a 20 20 20 20 73 71 6c 69 74 65  reg3;.    sqlite
6830: 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61  3BeginWriteOpera
6840: 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 30 2c 20  tion(pParse, 0, 
6850: 69 44 62 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53  iDb);..#ifndef S
6860: 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
6870: 41 4c 54 41 42 4c 45 0a 20 20 20 20 69 66 28 20  ALTABLE.    if( 
6880: 69 73 56 69 72 74 75 61 6c 20 29 7b 0a 20 20 20  isVirtual ){.   
6890: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
68a0: 64 4f 70 30 28 76 2c 20 4f 50 5f 56 42 65 67 69  dOp0(v, OP_VBegi
68b0: 6e 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  n);.    }.#endif
68c0: 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20  ..    /* If the 
68d0: 66 69 6c 65 20 66 6f 72 6d 61 74 20 61 6e 64 20  file format and 
68e0: 65 6e 63 6f 64 69 6e 67 20 69 6e 20 74 68 65 20  encoding in the 
68f0: 64 61 74 61 62 61 73 65 20 68 61 76 65 20 6e 6f  database have no
6900: 74 20 62 65 65 6e 20 73 65 74 2c 20 0a 20 20 20  t been set, .   
6910: 20 2a 2a 20 73 65 74 20 74 68 65 6d 20 6e 6f 77   ** set them now
6920: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 65 67  ..    */.    reg
6930: 31 20 3d 20 70 50 61 72 73 65 2d 3e 72 65 67 52  1 = pParse->regR
6940: 6f 77 69 64 20 3d 20 2b 2b 70 50 61 72 73 65 2d  owid = ++pParse-
6950: 3e 6e 4d 65 6d 3b 0a 20 20 20 20 72 65 67 32 20  >nMem;.    reg2 
6960: 3d 20 70 50 61 72 73 65 2d 3e 72 65 67 52 6f 6f  = pParse->regRoo
6970: 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  t = ++pParse->nM
6980: 65 6d 3b 0a 20 20 20 20 72 65 67 33 20 3d 20 2b  em;.    reg3 = +
6990: 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
69a0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
69b0: 64 4f 70 33 28 76 2c 20 4f 50 5f 52 65 61 64 43  dOp3(v, OP_ReadC
69c0: 6f 6f 6b 69 65 2c 20 69 44 62 2c 20 72 65 67 33  ookie, iDb, reg3
69d0: 2c 20 31 29 3b 20 20 20 2f 2a 20 66 69 6c 65 5f  , 1);   /* file_
69e0: 66 6f 72 6d 61 74 20 2a 2f 0a 20 20 20 20 73 71  format */.    sq
69f0: 6c 69 74 65 33 56 64 62 65 55 73 65 73 42 74 72  lite3VdbeUsesBtr
6a00: 65 65 28 76 2c 20 69 44 62 29 3b 0a 20 20 20 20  ee(v, iDb);.    
6a10: 6a 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  j1 = sqlite3Vdbe
6a20: 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 2c  AddOp1(v, OP_If,
6a30: 20 72 65 67 33 29 3b 0a 20 20 20 20 66 69 6c 65   reg3);.    file
6a40: 46 6f 72 6d 61 74 20 3d 20 28 64 62 2d 3e 66 6c  Format = (db->fl
6a50: 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4c 65 67  ags & SQLITE_Leg
6a60: 61 63 79 46 69 6c 65 46 6d 74 29 21 3d 30 20 3f  acyFileFmt)!=0 ?
6a70: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
6a80: 20 20 20 31 20 3a 20 53 51 4c 49 54 45 5f 4d 41     1 : SQLITE_MA
6a90: 58 5f 46 49 4c 45 5f 46 4f 52 4d 41 54 3b 0a 20  X_FILE_FORMAT;. 
6aa0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
6ab0: 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
6ac0: 65 72 2c 20 66 69 6c 65 46 6f 72 6d 61 74 2c 20  er, fileFormat, 
6ad0: 72 65 67 33 29 3b 0a 20 20 20 20 73 71 6c 69 74  reg3);.    sqlit
6ae0: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
6af0: 4f 50 5f 53 65 74 43 6f 6f 6b 69 65 2c 20 69 44  OP_SetCookie, iD
6b00: 62 2c 20 31 2c 20 72 65 67 33 29 3b 0a 20 20 20  b, 1, reg3);.   
6b10: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
6b20: 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
6b30: 2c 20 45 4e 43 28 64 62 29 2c 20 72 65 67 33 29  , ENC(db), reg3)
6b40: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
6b50: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53 65  eAddOp3(v, OP_Se
6b60: 74 43 6f 6f 6b 69 65 2c 20 69 44 62 2c 20 34 2c  tCookie, iDb, 4,
6b70: 20 72 65 67 33 29 3b 0a 20 20 20 20 73 71 6c 69   reg3);.    sqli
6b80: 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
6b90: 76 2c 20 6a 31 29 3b 0a 0a 20 20 20 20 2f 2a 20  v, j1);..    /* 
6ba0: 54 68 69 73 20 6a 75 73 74 20 63 72 65 61 74 65  This just create
6bb0: 73 20 61 20 70 6c 61 63 65 2d 68 6f 6c 64 65 72  s a place-holder
6bc0: 20 72 65 63 6f 72 64 20 69 6e 20 74 68 65 20 73   record in the s
6bd0: 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62  qlite_master tab
6be0: 6c 65 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 72  le..    ** The r
6bf0: 65 63 6f 72 64 20 63 72 65 61 74 65 64 20 64 6f  ecord created do
6c00: 65 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61  es not contain a
6c10: 6e 79 74 68 69 6e 67 20 79 65 74 2e 20 20 49 74  nything yet.  It
6c20: 20 77 69 6c 6c 20 62 65 20 72 65 70 6c 61 63 65   will be replace
6c30: 64 0a 20 20 20 20 2a 2a 20 62 79 20 74 68 65 20  d.    ** by the 
6c40: 72 65 61 6c 20 65 6e 74 72 79 20 69 6e 20 63 6f  real entry in co
6c50: 64 65 20 67 65 6e 65 72 61 74 65 64 20 61 74 20  de generated at 
6c60: 73 71 6c 69 74 65 33 45 6e 64 54 61 62 6c 65 28  sqlite3EndTable(
6c70: 29 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  )..    **.    **
6c80: 20 54 68 65 20 72 6f 77 69 64 20 66 6f 72 20 74   The rowid for t
6c90: 68 65 20 6e 65 77 20 65 6e 74 72 79 20 69 73 20  he new entry is 
6ca0: 6c 65 66 74 20 6f 6e 20 74 68 65 20 74 6f 70 20  left on the top 
6cb0: 6f 66 20 74 68 65 20 73 74 61 63 6b 2e 0a 20 20  of the stack..  
6cc0: 20 20 2a 2a 20 54 68 65 20 72 6f 77 69 64 20 76    ** The rowid v
6cd0: 61 6c 75 65 20 69 73 20 6e 65 65 64 65 64 20 62  alue is needed b
6ce0: 79 20 74 68 65 20 63 6f 64 65 20 74 68 61 74 20  y the code that 
6cf0: 73 71 6c 69 74 65 33 45 6e 64 54 61 62 6c 65 20  sqlite3EndTable 
6d00: 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 67 65 6e 65  will.    ** gene
6d10: 72 61 74 65 2e 0a 20 20 20 20 2a 2f 0a 23 69 66  rate..    */.#if
6d20: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
6d30: 5f 4f 4d 49 54 5f 56 49 45 57 29 20 7c 7c 20 21  _OMIT_VIEW) || !
6d40: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
6d50: 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
6d60: 29 0a 20 20 20 20 69 66 28 20 69 73 56 69 65 77  ).    if( isView
6d70: 20 7c 7c 20 69 73 56 69 72 74 75 61 6c 20 29 7b   || isVirtual ){
6d80: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
6d90: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
6da0: 6e 74 65 67 65 72 2c 20 30 2c 20 72 65 67 32 29  nteger, 0, reg2)
6db0: 3b 0a 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64  ;.    }else.#end
6dc0: 69 66 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 73  if.    {.      s
6dd0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
6de0: 28 76 2c 20 4f 50 5f 43 72 65 61 74 65 54 61 62  (v, OP_CreateTab
6df0: 6c 65 2c 20 69 44 62 2c 20 72 65 67 32 29 3b 0a  le, iDb, reg2);.
6e00: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
6e10: 33 4f 70 65 6e 4d 61 73 74 65 72 54 61 62 6c 65  3OpenMasterTable
6e20: 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20  (pParse, iDb);. 
6e30: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
6e40: 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 77 52 6f  dOp2(v, OP_NewRo
6e50: 77 69 64 2c 20 30 2c 20 72 65 67 31 29 3b 0a 20  wid, 0, reg1);. 
6e60: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
6e70: 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c  dOp2(v, OP_Null,
6e80: 20 30 2c 20 72 65 67 33 29 3b 0a 20 20 20 20 73   0, reg3);.    s
6e90: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
6ea0: 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20 30  (v, OP_Insert, 0
6eb0: 2c 20 72 65 67 33 2c 20 72 65 67 31 29 3b 0a 20  , reg3, reg1);. 
6ec0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
6ed0: 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47  angeP5(v, OPFLAG
6ee0: 5f 41 50 50 45 4e 44 29 3b 0a 20 20 20 20 73 71  _APPEND);.    sq
6ef0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 28  lite3VdbeAddOp0(
6f00: 76 2c 20 4f 50 5f 43 6c 6f 73 65 29 3b 0a 20 20  v, OP_Close);.  
6f10: 7d 0a 0a 20 20 2f 2a 20 4e 6f 72 6d 61 6c 20 28  }..  /* Normal (
6f20: 6e 6f 6e 2d 65 72 72 6f 72 29 20 72 65 74 75 72  non-error) retur
6f30: 6e 2e 20 2a 2f 0a 20 20 72 65 74 75 72 6e 3b 0a  n. */.  return;.
6f40: 0a 20 20 2f 2a 20 49 66 20 61 6e 20 65 72 72 6f  .  /* If an erro
6f50: 72 20 6f 63 63 75 72 73 2c 20 77 65 20 6a 75 6d  r occurs, we jum
6f60: 70 20 68 65 72 65 20 2a 2f 0a 62 65 67 69 6e 5f  p here */.begin_
6f70: 74 61 62 6c 65 5f 65 72 72 6f 72 3a 0a 20 20 73  table_error:.  s
6f80: 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4e 61 6d  qlite3_free(zNam
6f90: 65 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a  e);.  return;.}.
6fa0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 6d 61 63 72  ./*.** This macr
6fb0: 6f 20 69 73 20 75 73 65 64 20 74 6f 20 63 6f 6d  o is used to com
6fc0: 70 61 72 65 20 74 77 6f 20 73 74 72 69 6e 67 73  pare two strings
6fd0: 20 69 6e 20 61 20 63 61 73 65 2d 69 6e 73 65 6e   in a case-insen
6fe0: 73 69 74 69 76 65 20 6d 61 6e 6e 65 72 2e 0a 2a  sitive manner..*
6ff0: 2a 20 49 74 20 69 73 20 73 6c 69 67 68 74 6c 79  * It is slightly
7000: 20 66 61 73 74 65 72 20 74 68 61 6e 20 63 61 6c   faster than cal
7010: 6c 69 6e 67 20 73 71 6c 69 74 65 33 53 74 72 49  ling sqlite3StrI
7020: 43 6d 70 28 29 20 64 69 72 65 63 74 6c 79 2c 20  Cmp() directly, 
7030: 62 75 74 0a 2a 2a 20 70 72 6f 64 75 63 65 73 20  but.** produces 
7040: 6c 61 72 67 65 72 20 63 6f 64 65 2e 0a 2a 2a 0a  larger code..**.
7050: 2a 2a 20 57 41 52 4e 49 4e 47 3a 20 54 68 69 73  ** WARNING: This
7060: 20 6d 61 63 72 6f 20 69 73 20 6e 6f 74 20 63 6f   macro is not co
7070: 6d 70 61 74 69 62 6c 65 20 77 69 74 68 20 74 68  mpatible with th
7080: 65 20 73 74 72 63 6d 70 28 29 20 66 61 6d 69 6c  e strcmp() famil
7090: 79 2e 20 49 74 0a 2a 2a 20 72 65 74 75 72 6e 73  y. It.** returns
70a0: 20 74 72 75 65 20 69 66 20 74 68 65 20 74 77 6f   true if the two
70b0: 20 73 74 72 69 6e 67 73 20 61 72 65 20 65 71 75   strings are equ
70c0: 61 6c 2c 20 6f 74 68 65 72 77 69 73 65 20 66 61  al, otherwise fa
70d0: 6c 73 65 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  lse..*/.#define 
70e0: 53 54 52 49 43 4d 50 28 78 2c 20 79 29 20 28 5c  STRICMP(x, y) (\
70f0: 0a 73 71 6c 69 74 65 33 55 70 70 65 72 54 6f 4c  .sqlite3UpperToL
7100: 6f 77 65 72 5b 2a 28 75 6e 73 69 67 6e 65 64 20  ower[*(unsigned 
7110: 63 68 61 72 20 2a 29 28 78 29 5d 3d 3d 20 20 20  char *)(x)]==   
7120: 5c 0a 73 71 6c 69 74 65 33 55 70 70 65 72 54 6f  \.sqlite3UpperTo
7130: 4c 6f 77 65 72 5b 2a 28 75 6e 73 69 67 6e 65 64  Lower[*(unsigned
7140: 20 63 68 61 72 20 2a 29 28 79 29 5d 20 20 20 20   char *)(y)]    
7150: 20 5c 0a 26 26 20 73 71 6c 69 74 65 33 53 74 72   \.&& sqlite3Str
7160: 49 43 6d 70 28 28 78 29 2b 31 2c 28 79 29 2b 31  ICmp((x)+1,(y)+1
7170: 29 3d 3d 30 20 29 0a 0a 2f 2a 0a 2a 2a 20 41 64  )==0 )../*.** Ad
7180: 64 20 61 20 6e 65 77 20 63 6f 6c 75 6d 6e 20 74  d a new column t
7190: 6f 20 74 68 65 20 74 61 62 6c 65 20 63 75 72 72  o the table curr
71a0: 65 6e 74 6c 79 20 62 65 69 6e 67 20 63 6f 6e 73  ently being cons
71b0: 74 72 75 63 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  tructed..**.** T
71c0: 68 65 20 70 61 72 73 65 72 20 63 61 6c 6c 73 20  he parser calls 
71d0: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6f 6e 63  this routine onc
71e0: 65 20 66 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d  e for each colum
71f0: 6e 20 64 65 63 6c 61 72 61 74 69 6f 6e 0a 2a 2a  n declaration.**
7200: 20 69 6e 20 61 20 43 52 45 41 54 45 20 54 41 42   in a CREATE TAB
7210: 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 73  LE statement.  s
7220: 71 6c 69 74 65 33 53 74 61 72 74 54 61 62 6c 65  qlite3StartTable
7230: 28 29 20 67 65 74 73 20 63 61 6c 6c 65 64 0a 2a  () gets called.*
7240: 2a 20 66 69 72 73 74 20 74 6f 20 67 65 74 20 74  * first to get t
7250: 68 69 6e 67 73 20 67 6f 69 6e 67 2e 20 20 54 68  hings going.  Th
7260: 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
7270: 69 73 20 63 61 6c 6c 65 64 20 66 6f 72 20 65 61  is called for ea
7280: 63 68 0a 2a 2a 20 63 6f 6c 75 6d 6e 2e 0a 2a 2f  ch.** column..*/
7290: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 41 64 64  .void sqlite3Add
72a0: 43 6f 6c 75 6d 6e 28 50 61 72 73 65 20 2a 70 50  Column(Parse *pP
72b0: 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61  arse, Token *pNa
72c0: 6d 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b  me){.  Table *p;
72d0: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 68 61 72  .  int i;.  char
72e0: 20 2a 7a 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70   *z;.  Column *p
72f0: 43 6f 6c 3b 0a 20 20 69 66 28 20 28 70 20 3d 20  Col;.  if( (p = 
7300: 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
7310: 65 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  e)==0 ) return;.
7320: 20 20 69 66 28 20 70 2d 3e 6e 43 6f 6c 2b 31 3e    if( p->nCol+1>
7330: 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4c 55 4d  SQLITE_MAX_COLUM
7340: 4e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  N ){.    sqlite3
7350: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
7360: 20 22 74 6f 6f 20 6d 61 6e 79 20 63 6f 6c 75 6d   "too many colum
7370: 6e 73 20 6f 6e 20 25 73 22 2c 20 70 2d 3e 7a 4e  ns on %s", p->zN
7380: 61 6d 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ame);.    return
7390: 3b 0a 20 20 7d 0a 20 20 7a 20 3d 20 73 71 6c 69  ;.  }.  z = sqli
73a0: 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e  te3NameFromToken
73b0: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 4e 61  (pParse->db, pNa
73c0: 6d 65 29 3b 0a 20 20 69 66 28 20 7a 3d 3d 30 20  me);.  if( z==0 
73d0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28  ) return;.  for(
73e0: 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 3b 20  i=0; i<p->nCol; 
73f0: 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 53 54  i++){.    if( ST
7400: 52 49 43 4d 50 28 7a 2c 20 70 2d 3e 61 43 6f 6c  RICMP(z, p->aCol
7410: 5b 69 5d 2e 7a 4e 61 6d 65 29 20 29 7b 0a 20 20  [i].zName) ){.  
7420: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
7430: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 64 75 70  Msg(pParse, "dup
7440: 6c 69 63 61 74 65 20 63 6f 6c 75 6d 6e 20 6e 61  licate column na
7450: 6d 65 3a 20 25 73 22 2c 20 7a 29 3b 0a 20 20 20  me: %s", z);.   
7460: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
7470: 7a 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  z);.      return
7480: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
7490: 28 20 28 70 2d 3e 6e 43 6f 6c 20 26 20 30 78 37  ( (p->nCol & 0x7
74a0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 43 6f 6c 75  )==0 ){.    Colu
74b0: 6d 6e 20 2a 61 4e 65 77 3b 0a 20 20 20 20 61 4e  mn *aNew;.    aN
74c0: 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62 52 65  ew = sqlite3DbRe
74d0: 61 6c 6c 6f 63 28 70 50 61 72 73 65 2d 3e 64 62  alloc(pParse->db
74e0: 2c 70 2d 3e 61 43 6f 6c 2c 28 70 2d 3e 6e 43 6f  ,p->aCol,(p->nCo
74f0: 6c 2b 38 29 2a 73 69 7a 65 6f 66 28 70 2d 3e 61  l+8)*sizeof(p->a
7500: 43 6f 6c 5b 30 5d 29 29 3b 0a 20 20 20 20 69 66  Col[0]));.    if
7510: 28 20 61 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20  ( aNew==0 ){.   
7520: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
7530: 7a 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  z);.      return
7540: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 61  ;.    }.    p->a
7550: 43 6f 6c 20 3d 20 61 4e 65 77 3b 0a 20 20 7d 0a  Col = aNew;.  }.
7560: 20 20 70 43 6f 6c 20 3d 20 26 70 2d 3e 61 43 6f    pCol = &p->aCo
7570: 6c 5b 70 2d 3e 6e 43 6f 6c 5d 3b 0a 20 20 6d 65  l[p->nCol];.  me
7580: 6d 73 65 74 28 70 43 6f 6c 2c 20 30 2c 20 73 69  mset(pCol, 0, si
7590: 7a 65 6f 66 28 70 2d 3e 61 43 6f 6c 5b 30 5d 29  zeof(p->aCol[0])
75a0: 29 3b 0a 20 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65  );.  pCol->zName
75b0: 20 3d 20 7a 3b 0a 20 0a 20 20 2f 2a 20 49 66 20   = z;. .  /* If 
75c0: 74 68 65 72 65 20 69 73 20 6e 6f 20 74 79 70 65  there is no type
75d0: 20 73 70 65 63 69 66 69 65 64 2c 20 63 6f 6c 75   specified, colu
75e0: 6d 6e 73 20 68 61 76 65 20 74 68 65 20 64 65 66  mns have the def
75f0: 61 75 6c 74 20 61 66 66 69 6e 69 74 79 0a 20 20  ault affinity.  
7600: 2a 2a 20 27 4e 4f 4e 45 27 2e 20 49 66 20 74 68  ** 'NONE'. If th
7610: 65 72 65 20 69 73 20 61 20 74 79 70 65 20 73 70  ere is a type sp
7620: 65 63 69 66 69 65 64 2c 20 74 68 65 6e 20 73 71  ecified, then sq
7630: 6c 69 74 65 33 41 64 64 43 6f 6c 75 6d 6e 54 79  lite3AddColumnTy
7640: 70 65 28 29 20 77 69 6c 6c 0a 20 20 2a 2a 20 62  pe() will.  ** b
7650: 65 20 63 61 6c 6c 65 64 20 6e 65 78 74 20 74 6f  e called next to
7660: 20 73 65 74 20 70 43 6f 6c 2d 3e 61 66 66 69 6e   set pCol->affin
7670: 69 74 79 20 63 6f 72 72 65 63 74 6c 79 2e 0a 20  ity correctly.. 
7680: 20 2a 2f 0a 20 20 70 43 6f 6c 2d 3e 61 66 66 69   */.  pCol->affi
7690: 6e 69 74 79 20 3d 20 53 51 4c 49 54 45 5f 41 46  nity = SQLITE_AF
76a0: 46 5f 4e 4f 4e 45 3b 0a 20 20 70 2d 3e 6e 43 6f  F_NONE;.  p->nCo
76b0: 6c 2b 2b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  l++;.}../*.** Th
76c0: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
76d0: 6c 6c 65 64 20 62 79 20 74 68 65 20 70 61 72 73  lled by the pars
76e0: 65 72 20 77 68 69 6c 65 20 69 6e 20 74 68 65 20  er while in the 
76f0: 6d 69 64 64 6c 65 20 6f 66 0a 2a 2a 20 70 61 72  middle of.** par
7700: 73 69 6e 67 20 61 20 43 52 45 41 54 45 20 54 41  sing a CREATE TA
7710: 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 20 20  BLE statement.  
7720: 41 20 22 4e 4f 54 20 4e 55 4c 4c 22 20 63 6f 6e  A "NOT NULL" con
7730: 73 74 72 61 69 6e 74 20 68 61 73 0a 2a 2a 20 62  straint has.** b
7740: 65 65 6e 20 73 65 65 6e 20 6f 6e 20 61 20 63 6f  een seen on a co
7750: 6c 75 6d 6e 2e 20 20 54 68 69 73 20 72 6f 75 74  lumn.  This rout
7760: 69 6e 65 20 73 65 74 73 20 74 68 65 20 6e 6f 74  ine sets the not
7770: 4e 75 6c 6c 20 66 6c 61 67 20 6f 6e 0a 2a 2a 20  Null flag on.** 
7780: 74 68 65 20 63 6f 6c 75 6d 6e 20 63 75 72 72 65  the column curre
7790: 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74  ntly under const
77a0: 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64  ruction..*/.void
77b0: 20 73 71 6c 69 74 65 33 41 64 64 4e 6f 74 4e 75   sqlite3AddNotNu
77c0: 6c 6c 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ll(Parse *pParse
77d0: 2c 20 69 6e 74 20 6f 6e 45 72 72 6f 72 29 7b 0a  , int onError){.
77e0: 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 69 6e    Table *p;.  in
77f0: 74 20 69 3b 0a 20 20 69 66 28 20 28 70 20 3d 20  t i;.  if( (p = 
7800: 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
7810: 65 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  e)==0 ) return;.
7820: 20 20 69 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b    i = p->nCol-1;
7830: 0a 20 20 69 66 28 20 69 3e 3d 30 20 29 20 70 2d  .  if( i>=0 ) p-
7840: 3e 61 43 6f 6c 5b 69 5d 2e 6e 6f 74 4e 75 6c 6c  >aCol[i].notNull
7850: 20 3d 20 6f 6e 45 72 72 6f 72 3b 0a 7d 0a 0a 2f   = onError;.}../
7860: 2a 0a 2a 2a 20 53 63 61 6e 20 74 68 65 20 63 6f  *.** Scan the co
7870: 6c 75 6d 6e 20 74 79 70 65 20 6e 61 6d 65 20 7a  lumn type name z
7880: 54 79 70 65 20 28 6c 65 6e 67 74 68 20 6e 54 79  Type (length nTy
7890: 70 65 29 20 61 6e 64 20 72 65 74 75 72 6e 20 74  pe) and return t
78a0: 68 65 0a 2a 2a 20 61 73 73 6f 63 69 61 74 65 64  he.** associated
78b0: 20 61 66 66 69 6e 69 74 79 20 74 79 70 65 2e 0a   affinity type..
78c0: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
78d0: 6e 65 20 64 6f 65 73 20 61 20 63 61 73 65 2d 69  ne does a case-i
78e0: 6e 64 65 70 65 6e 64 65 6e 74 20 73 65 61 72 63  ndependent searc
78f0: 68 20 6f 66 20 7a 54 79 70 65 20 66 6f 72 20 74  h of zType for t
7900: 68 65 20 0a 2a 2a 20 73 75 62 73 74 72 69 6e 67  he .** substring
7910: 73 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69  s in the followi
7920: 6e 67 20 74 61 62 6c 65 2e 20 49 66 20 6f 6e 65  ng table. If one
7930: 20 6f 66 20 74 68 65 20 73 75 62 73 74 72 69 6e   of the substrin
7940: 67 73 20 69 73 0a 2a 2a 20 66 6f 75 6e 64 2c 20  gs is.** found, 
7950: 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  the correspondin
7960: 67 20 61 66 66 69 6e 69 74 79 20 69 73 20 72 65  g affinity is re
7970: 74 75 72 6e 65 64 2e 20 49 66 20 7a 54 79 70 65  turned. If zType
7980: 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 6d 6f 72   contains.** mor
7990: 65 20 74 68 61 6e 20 6f 6e 65 20 6f 66 20 74 68  e than one of th
79a0: 65 20 73 75 62 73 74 72 69 6e 67 73 2c 20 65 6e  e substrings, en
79b0: 74 72 69 65 73 20 74 6f 77 61 72 64 20 74 68 65  tries toward the
79c0: 20 74 6f 70 20 6f 66 20 0a 2a 2a 20 74 68 65 20   top of .** the 
79d0: 74 61 62 6c 65 20 74 61 6b 65 20 70 72 69 6f 72  table take prior
79e0: 69 74 79 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65  ity. For example
79f0: 2c 20 69 66 20 7a 54 79 70 65 20 69 73 20 27 42  , if zType is 'B
7a00: 4c 4f 42 49 4e 54 27 2c 20 0a 2a 2a 20 53 51 4c  LOBINT', .** SQL
7a10: 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 20  ITE_AFF_INTEGER 
7a20: 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a  is returned..**.
7a30: 2a 2a 20 53 75 62 73 74 72 69 6e 67 20 20 20 20  ** Substring    
7a40: 20 7c 20 41 66 66 69 6e 69 74 79 0a 2a 2a 20 2d   | Affinity.** -
7a50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7a60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
7a70: 2a 2a 20 27 49 4e 54 27 20 20 20 20 20 20 20 20  ** 'INT'        
7a80: 20 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e   | SQLITE_AFF_IN
7a90: 54 45 47 45 52 0a 2a 2a 20 27 43 48 41 52 27 20  TEGER.** 'CHAR' 
7aa0: 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f         | SQLITE_
7ab0: 41 46 46 5f 54 45 58 54 0a 2a 2a 20 27 43 4c 4f  AFF_TEXT.** 'CLO
7ac0: 42 27 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49  B'        | SQLI
7ad0: 54 45 5f 41 46 46 5f 54 45 58 54 0a 2a 2a 20 27  TE_AFF_TEXT.** '
7ae0: 54 45 58 54 27 20 20 20 20 20 20 20 20 7c 20 53  TEXT'        | S
7af0: 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 0a 2a  QLITE_AFF_TEXT.*
7b00: 2a 20 27 42 4c 4f 42 27 20 20 20 20 20 20 20 20  * 'BLOB'        
7b10: 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e  | SQLITE_AFF_NON
7b20: 45 0a 2a 2a 20 27 52 45 41 4c 27 20 20 20 20 20  E.** 'REAL'     
7b30: 20 20 20 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f     | SQLITE_AFF_
7b40: 52 45 41 4c 0a 2a 2a 20 27 46 4c 4f 41 27 20 20  REAL.** 'FLOA'  
7b50: 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 41        | SQLITE_A
7b60: 46 46 5f 52 45 41 4c 0a 2a 2a 20 27 44 4f 55 42  FF_REAL.** 'DOUB
7b70: 27 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54  '        | SQLIT
7b80: 45 5f 41 46 46 5f 52 45 41 4c 0a 2a 2a 0a 2a 2a  E_AFF_REAL.**.**
7b90: 20 49 66 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20   If none of the 
7ba0: 73 75 62 73 74 72 69 6e 67 73 20 69 6e 20 74 68  substrings in th
7bb0: 65 20 61 62 6f 76 65 20 74 61 62 6c 65 20 61 72  e above table ar
7bc0: 65 20 66 6f 75 6e 64 2c 0a 2a 2a 20 53 51 4c 49  e found,.** SQLI
7bd0: 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20 69  TE_AFF_NUMERIC i
7be0: 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 63  s returned..*/.c
7bf0: 68 61 72 20 73 71 6c 69 74 65 33 41 66 66 69 6e  har sqlite3Affin
7c00: 69 74 79 54 79 70 65 28 63 6f 6e 73 74 20 54 6f  ityType(const To
7c10: 6b 65 6e 20 2a 70 54 79 70 65 29 7b 0a 20 20 75  ken *pType){.  u
7c20: 33 32 20 68 20 3d 20 30 3b 0a 20 20 63 68 61 72  32 h = 0;.  char
7c30: 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46   aff = SQLITE_AF
7c40: 46 5f 4e 55 4d 45 52 49 43 3b 0a 20 20 63 6f 6e  F_NUMERIC;.  con
7c50: 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
7c60: 20 2a 7a 49 6e 20 3d 20 70 54 79 70 65 2d 3e 7a   *zIn = pType->z
7c70: 3b 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e  ;.  const unsign
7c80: 65 64 20 63 68 61 72 20 2a 7a 45 6e 64 20 3d 20  ed char *zEnd = 
7c90: 26 70 54 79 70 65 2d 3e 7a 5b 70 54 79 70 65 2d  &pType->z[pType-
7ca0: 3e 6e 5d 3b 0a 0a 20 20 77 68 69 6c 65 28 20 7a  >n];..  while( z
7cb0: 49 6e 21 3d 7a 45 6e 64 20 29 7b 0a 20 20 20 20  In!=zEnd ){.    
7cc0: 68 20 3d 20 28 68 3c 3c 38 29 20 2b 20 73 71 6c  h = (h<<8) + sql
7cd0: 69 74 65 33 55 70 70 65 72 54 6f 4c 6f 77 65 72  ite3UpperToLower
7ce0: 5b 2a 7a 49 6e 5d 3b 0a 20 20 20 20 7a 49 6e 2b  [*zIn];.    zIn+
7cf0: 2b 3b 0a 20 20 20 20 69 66 28 20 68 3d 3d 28 28  +;.    if( h==((
7d00: 27 63 27 3c 3c 32 34 29 2b 28 27 68 27 3c 3c 31  'c'<<24)+('h'<<1
7d10: 36 29 2b 28 27 61 27 3c 3c 38 29 2b 27 72 27 29  6)+('a'<<8)+'r')
7d20: 20 29 7b 20 20 20 20 20 20 20 20 20 20 20 20 20   ){             
7d30: 2f 2a 20 43 48 41 52 20 2a 2f 0a 20 20 20 20 20  /* CHAR */.     
7d40: 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46   aff = SQLITE_AF
7d50: 46 5f 54 45 58 54 3b 20 0a 20 20 20 20 7d 65 6c  F_TEXT; .    }el
7d60: 73 65 20 69 66 28 20 68 3d 3d 28 28 27 63 27 3c  se if( h==(('c'<
7d70: 3c 32 34 29 2b 28 27 6c 27 3c 3c 31 36 29 2b 28  <24)+('l'<<16)+(
7d80: 27 6f 27 3c 3c 38 29 2b 27 62 27 29 20 29 7b 20  'o'<<8)+'b') ){ 
7d90: 20 20 20 20 20 20 2f 2a 20 43 4c 4f 42 20 2a 2f        /* CLOB */
7da0: 0a 20 20 20 20 20 20 61 66 66 20 3d 20 53 51 4c  .      aff = SQL
7db0: 49 54 45 5f 41 46 46 5f 54 45 58 54 3b 0a 20 20  ITE_AFF_TEXT;.  
7dc0: 20 20 7d 65 6c 73 65 20 69 66 28 20 68 3d 3d 28    }else if( h==(
7dd0: 28 27 74 27 3c 3c 32 34 29 2b 28 27 65 27 3c 3c  ('t'<<24)+('e'<<
7de0: 31 36 29 2b 28 27 78 27 3c 3c 38 29 2b 27 74 27  16)+('x'<<8)+'t'
7df0: 29 20 29 7b 20 20 20 20 20 20 20 2f 2a 20 54 45  ) ){       /* TE
7e00: 58 54 20 2a 2f 0a 20 20 20 20 20 20 61 66 66 20  XT */.      aff 
7e10: 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58  = SQLITE_AFF_TEX
7e20: 54 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  T;.    }else if(
7e30: 20 68 3d 3d 28 28 27 62 27 3c 3c 32 34 29 2b 28   h==(('b'<<24)+(
7e40: 27 6c 27 3c 3c 31 36 29 2b 28 27 6f 27 3c 3c 38  'l'<<16)+('o'<<8
7e50: 29 2b 27 62 27 29 20 20 20 20 20 20 20 20 20 20  )+'b')          
7e60: 2f 2a 20 42 4c 4f 42 20 2a 2f 0a 20 20 20 20 20  /* BLOB */.     
7e70: 20 20 20 26 26 20 28 61 66 66 3d 3d 53 51 4c 49     && (aff==SQLI
7e80: 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20 7c  TE_AFF_NUMERIC |
7e90: 7c 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46  | aff==SQLITE_AF
7ea0: 46 5f 52 45 41 4c 29 20 29 7b 0a 20 20 20 20 20  F_REAL) ){.     
7eb0: 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46   aff = SQLITE_AF
7ec0: 46 5f 4e 4f 4e 45 3b 0a 23 69 66 6e 64 65 66 20  F_NONE;.#ifndef 
7ed0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41  SQLITE_OMIT_FLOA
7ee0: 54 49 4e 47 5f 50 4f 49 4e 54 0a 20 20 20 20 7d  TING_POINT.    }
7ef0: 65 6c 73 65 20 69 66 28 20 68 3d 3d 28 28 27 72  else if( h==(('r
7f00: 27 3c 3c 32 34 29 2b 28 27 65 27 3c 3c 31 36 29  '<<24)+('e'<<16)
7f10: 2b 28 27 61 27 3c 3c 38 29 2b 27 6c 27 29 20 20  +('a'<<8)+'l')  
7f20: 20 20 20 20 20 20 20 20 2f 2a 20 52 45 41 4c 20          /* REAL 
7f30: 2a 2f 0a 20 20 20 20 20 20 20 20 26 26 20 61 66  */.        && af
7f40: 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55  f==SQLITE_AFF_NU
7f50: 4d 45 52 49 43 20 29 7b 0a 20 20 20 20 20 20 61  MERIC ){.      a
7f60: 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f  ff = SQLITE_AFF_
7f70: 52 45 41 4c 3b 0a 20 20 20 20 7d 65 6c 73 65 20  REAL;.    }else 
7f80: 69 66 28 20 68 3d 3d 28 28 27 66 27 3c 3c 32 34  if( h==(('f'<<24
7f90: 29 2b 28 27 6c 27 3c 3c 31 36 29 2b 28 27 6f 27  )+('l'<<16)+('o'
7fa0: 3c 3c 38 29 2b 27 61 27 29 20 20 20 20 20 20 20  <<8)+'a')       
7fb0: 20 20 20 2f 2a 20 46 4c 4f 41 20 2a 2f 0a 20 20     /* FLOA */.  
7fc0: 20 20 20 20 20 20 26 26 20 61 66 66 3d 3d 53 51        && aff==SQ
7fd0: 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43  LITE_AFF_NUMERIC
7fe0: 20 29 7b 0a 20 20 20 20 20 20 61 66 66 20 3d 20   ){.      aff = 
7ff0: 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 3b  SQLITE_AFF_REAL;
8000: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 68  .    }else if( h
8010: 3d 3d 28 28 27 64 27 3c 3c 32 34 29 2b 28 27 6f  ==(('d'<<24)+('o
8020: 27 3c 3c 31 36 29 2b 28 27 75 27 3c 3c 38 29 2b  '<<16)+('u'<<8)+
8030: 27 62 27 29 20 20 20 20 20 20 20 20 20 20 2f 2a  'b')          /*
8040: 20 44 4f 55 42 20 2a 2f 0a 20 20 20 20 20 20 20   DOUB */.       
8050: 20 26 26 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f   && aff==SQLITE_
8060: 41 46 46 5f 4e 55 4d 45 52 49 43 20 29 7b 0a 20  AFF_NUMERIC ){. 
8070: 20 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49 54       aff = SQLIT
8080: 45 5f 41 46 46 5f 52 45 41 4c 3b 0a 23 65 6e 64  E_AFF_REAL;.#end
8090: 69 66 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  if.    }else if(
80a0: 20 28 68 26 30 78 30 30 46 46 46 46 46 46 29 3d   (h&0x00FFFFFF)=
80b0: 3d 28 28 27 69 27 3c 3c 31 36 29 2b 28 27 6e 27  =(('i'<<16)+('n'
80c0: 3c 3c 38 29 2b 27 74 27 29 20 29 7b 20 20 20 20  <<8)+'t') ){    
80d0: 2f 2a 20 49 4e 54 20 2a 2f 0a 20 20 20 20 20 20  /* INT */.      
80e0: 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46  aff = SQLITE_AFF
80f0: 5f 49 4e 54 45 47 45 52 3b 0a 20 20 20 20 20 20  _INTEGER;.      
8100: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
8110: 0a 0a 20 20 72 65 74 75 72 6e 20 61 66 66 3b 0a  ..  return aff;.
8120: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
8130: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
8140: 62 79 20 74 68 65 20 70 61 72 73 65 72 20 77 68  by the parser wh
8150: 69 6c 65 20 69 6e 20 74 68 65 20 6d 69 64 64 6c  ile in the middl
8160: 65 20 6f 66 0a 2a 2a 20 70 61 72 73 69 6e 67 20  e of.** parsing 
8170: 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73  a CREATE TABLE s
8180: 74 61 74 65 6d 65 6e 74 2e 20 20 54 68 65 20 70  tatement.  The p
8190: 46 69 72 73 74 20 74 6f 6b 65 6e 20 69 73 20 74  First token is t
81a0: 68 65 20 66 69 72 73 74 0a 2a 2a 20 74 6f 6b 65  he first.** toke
81b0: 6e 20 69 6e 20 74 68 65 20 73 65 71 75 65 6e 63  n in the sequenc
81c0: 65 20 6f 66 20 74 6f 6b 65 6e 73 20 74 68 61 74  e of tokens that
81d0: 20 64 65 73 63 72 69 62 65 20 74 68 65 20 74 79   describe the ty
81e0: 70 65 20 6f 66 20 74 68 65 0a 2a 2a 20 63 6f 6c  pe of the.** col
81f0: 75 6d 6e 20 63 75 72 72 65 6e 74 6c 79 20 75 6e  umn currently un
8200: 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e  der construction
8210: 2e 20 20 20 70 4c 61 73 74 20 69 73 20 74 68 65  .   pLast is the
8220: 20 6c 61 73 74 20 74 6f 6b 65 6e 0a 2a 2a 20 69   last token.** i
8230: 6e 20 74 68 65 20 73 65 71 75 65 6e 63 65 2e 20  n the sequence. 
8240: 20 55 73 65 20 74 68 69 73 20 69 6e 66 6f 72 6d   Use this inform
8250: 61 74 69 6f 6e 20 74 6f 20 63 6f 6e 73 74 72 75  ation to constru
8260: 63 74 20 61 20 73 74 72 69 6e 67 0a 2a 2a 20 74  ct a string.** t
8270: 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  hat contains the
8280: 20 74 79 70 65 6e 61 6d 65 20 6f 66 20 74 68 65   typename of the
8290: 20 63 6f 6c 75 6d 6e 20 61 6e 64 20 73 74 6f 72   column and stor
82a0: 65 20 74 68 61 74 20 73 74 72 69 6e 67 0a 2a 2a  e that string.**
82b0: 20 69 6e 20 7a 54 79 70 65 2e 0a 2a 2f 20 0a 76   in zType..*/ .v
82c0: 6f 69 64 20 73 71 6c 69 74 65 33 41 64 64 43 6f  oid sqlite3AddCo
82d0: 6c 75 6d 6e 54 79 70 65 28 50 61 72 73 65 20 2a  lumnType(Parse *
82e0: 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70  pParse, Token *p
82f0: 54 79 70 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a  Type){.  Table *
8300: 70 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 43 6f  p;.  int i;.  Co
8310: 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 0a 20 20 69  lumn *pCol;..  i
8320: 66 28 20 28 70 20 3d 20 70 50 61 72 73 65 2d 3e  f( (p = pParse->
8330: 70 4e 65 77 54 61 62 6c 65 29 3d 3d 30 20 29 20  pNewTable)==0 ) 
8340: 72 65 74 75 72 6e 3b 0a 20 20 69 20 3d 20 70 2d  return;.  i = p-
8350: 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 69 66 28 20 69  >nCol-1;.  if( i
8360: 3c 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70  <0 ) return;.  p
8370: 43 6f 6c 20 3d 20 26 70 2d 3e 61 43 6f 6c 5b 69  Col = &p->aCol[i
8380: 5d 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  ];.  sqlite3_fre
8390: 65 28 70 43 6f 6c 2d 3e 7a 54 79 70 65 29 3b 0a  e(pCol->zType);.
83a0: 20 20 70 43 6f 6c 2d 3e 7a 54 79 70 65 20 3d 20    pCol->zType = 
83b0: 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54  sqlite3NameFromT
83c0: 6f 6b 65 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c  oken(pParse->db,
83d0: 20 70 54 79 70 65 29 3b 0a 20 20 70 43 6f 6c 2d   pType);.  pCol-
83e0: 3e 61 66 66 69 6e 69 74 79 20 3d 20 73 71 6c 69  >affinity = sqli
83f0: 74 65 33 41 66 66 69 6e 69 74 79 54 79 70 65 28  te3AffinityType(
8400: 70 54 79 70 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pType);.}../*.**
8410: 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   The expression 
8420: 69 73 20 74 68 65 20 64 65 66 61 75 6c 74 20 76  is the default v
8430: 61 6c 75 65 20 66 6f 72 20 74 68 65 20 6d 6f 73  alue for the mos
8440: 74 20 72 65 63 65 6e 74 6c 79 20 61 64 64 65 64  t recently added
8450: 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 6f 66 20 74 68   column.** of th
8460: 65 20 74 61 62 6c 65 20 63 75 72 72 65 6e 74 6c  e table currentl
8470: 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63  y under construc
8480: 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 44 65 66 61  tion..**.** Defa
8490: 75 6c 74 20 76 61 6c 75 65 20 65 78 70 72 65 73  ult value expres
84a0: 73 69 6f 6e 73 20 6d 75 73 74 20 62 65 20 63 6f  sions must be co
84b0: 6e 73 74 61 6e 74 2e 20 20 52 61 69 73 65 20 61  nstant.  Raise a
84c0: 6e 20 65 78 63 65 70 74 69 6f 6e 20 69 66 20 74  n exception if t
84d0: 68 69 73 0a 2a 2a 20 69 73 20 6e 6f 74 20 74 68  his.** is not th
84e0: 65 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  e case..**.** Th
84f0: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
8500: 6c 6c 65 64 20 62 79 20 74 68 65 20 70 61 72 73  lled by the pars
8510: 65 72 20 77 68 69 6c 65 20 69 6e 20 74 68 65 20  er while in the 
8520: 6d 69 64 64 6c 65 20 6f 66 0a 2a 2a 20 70 61 72  middle of.** par
8530: 73 69 6e 67 20 61 20 43 52 45 41 54 45 20 54 41  sing a CREATE TA
8540: 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a  BLE statement..*
8550: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 41 64  /.void sqlite3Ad
8560: 64 44 65 66 61 75 6c 74 56 61 6c 75 65 28 50 61  dDefaultValue(Pa
8570: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70  rse *pParse, Exp
8580: 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 54 61 62  r *pExpr){.  Tab
8590: 6c 65 20 2a 70 3b 0a 20 20 43 6f 6c 75 6d 6e 20  le *p;.  Column 
85a0: 2a 70 43 6f 6c 3b 0a 20 20 69 66 28 20 28 70 20  *pCol;.  if( (p 
85b0: 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  = pParse->pNewTa
85c0: 62 6c 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 70  ble)!=0 ){.    p
85d0: 43 6f 6c 20 3d 20 26 28 70 2d 3e 61 43 6f 6c 5b  Col = &(p->aCol[
85e0: 70 2d 3e 6e 43 6f 6c 2d 31 5d 29 3b 0a 20 20 20  p->nCol-1]);.   
85f0: 20 69 66 28 20 21 73 71 6c 69 74 65 33 45 78 70   if( !sqlite3Exp
8600: 72 49 73 43 6f 6e 73 74 61 6e 74 4f 72 46 75 6e  rIsConstantOrFun
8610: 63 74 69 6f 6e 28 70 45 78 70 72 29 20 29 7b 0a  ction(pExpr) ){.
8620: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
8630: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 64  orMsg(pParse, "d
8640: 65 66 61 75 6c 74 20 76 61 6c 75 65 20 6f 66 20  efault value of 
8650: 63 6f 6c 75 6d 6e 20 5b 25 73 5d 20 69 73 20 6e  column [%s] is n
8660: 6f 74 20 63 6f 6e 73 74 61 6e 74 22 2c 0a 20 20  ot constant",.  
8670: 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 7a 4e          pCol->zN
8680: 61 6d 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ame);.    }else{
8690: 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 43 6f  .      Expr *pCo
86a0: 70 79 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  py;.      sqlite
86b0: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
86c0: 64 62 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  db;.      sqlite
86d0: 33 45 78 70 72 44 65 6c 65 74 65 28 70 43 6f 6c  3ExprDelete(pCol
86e0: 2d 3e 70 44 66 6c 74 29 3b 0a 20 20 20 20 20 20  ->pDflt);.      
86f0: 70 43 6f 6c 2d 3e 70 44 66 6c 74 20 3d 20 70 43  pCol->pDflt = pC
8700: 6f 70 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70  opy = sqlite3Exp
8710: 72 44 75 70 28 64 62 2c 20 70 45 78 70 72 29 3b  rDup(db, pExpr);
8720: 0a 20 20 20 20 20 20 69 66 28 20 70 43 6f 70 79  .      if( pCopy
8730: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
8740: 74 65 33 54 6f 6b 65 6e 43 6f 70 79 28 64 62 2c  te3TokenCopy(db,
8750: 20 26 70 43 6f 70 79 2d 3e 73 70 61 6e 2c 20 26   &pCopy->span, &
8760: 70 45 78 70 72 2d 3e 73 70 61 6e 29 3b 0a 20 20  pExpr->span);.  
8770: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
8780: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
8790: 65 74 65 28 70 45 78 70 72 29 3b 0a 7d 0a 0a 2f  ete(pExpr);.}../
87a0: 2a 0a 2a 2a 20 44 65 73 69 67 6e 61 74 65 20 74  *.** Designate t
87b0: 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 66  he PRIMARY KEY f
87c0: 6f 72 20 74 68 65 20 74 61 62 6c 65 2e 20 20 70  or the table.  p
87d0: 4c 69 73 74 20 69 73 20 61 20 6c 69 73 74 20 6f  List is a list o
87e0: 66 20 6e 61 6d 65 73 20 0a 2a 2a 20 6f 66 20 63  f names .** of c
87f0: 6f 6c 75 6d 6e 73 20 74 68 61 74 20 66 6f 72 6d  olumns that form
8800: 20 74 68 65 20 70 72 69 6d 61 72 79 20 6b 65 79   the primary key
8810: 2e 20 20 49 66 20 70 4c 69 73 74 20 69 73 20 4e  .  If pList is N
8820: 55 4c 4c 2c 20 74 68 65 6e 20 74 68 65 0a 2a 2a  ULL, then the.**
8830: 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 61   most recently a
8840: 64 64 65 64 20 63 6f 6c 75 6d 6e 20 6f 66 20 74  dded column of t
8850: 68 65 20 74 61 62 6c 65 20 69 73 20 74 68 65 20  he table is the 
8860: 70 72 69 6d 61 72 79 20 6b 65 79 2e 0a 2a 2a 0a  primary key..**.
8870: 2a 2a 20 41 20 74 61 62 6c 65 20 63 61 6e 20 68  ** A table can h
8880: 61 76 65 20 61 74 20 6d 6f 73 74 20 6f 6e 65 20  ave at most one 
8890: 70 72 69 6d 61 72 79 20 6b 65 79 2e 20 20 49 66  primary key.  If
88a0: 20 74 68 65 20 74 61 62 6c 65 20 61 6c 72 65 61   the table alrea
88b0: 64 79 20 68 61 73 0a 2a 2a 20 61 20 70 72 69 6d  dy has.** a prim
88c0: 61 72 79 20 6b 65 79 20 28 61 6e 64 20 74 68 69  ary key (and thi
88d0: 73 20 69 73 20 74 68 65 20 73 65 63 6f 6e 64 20  s is the second 
88e0: 70 72 69 6d 61 72 79 20 6b 65 79 29 20 74 68 65  primary key) the
88f0: 6e 20 63 72 65 61 74 65 20 61 6e 0a 2a 2a 20 65  n create an.** e
8900: 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  rror..**.** If t
8910: 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 69  he PRIMARY KEY i
8920: 73 20 6f 6e 20 61 20 73 69 6e 67 6c 65 20 63 6f  s on a single co
8930: 6c 75 6d 6e 20 77 68 6f 73 65 20 64 61 74 61 74  lumn whose datat
8940: 79 70 65 20 69 73 20 49 4e 54 45 47 45 52 2c 0a  ype is INTEGER,.
8950: 2a 2a 20 74 68 65 6e 20 77 65 20 77 69 6c 6c 20  ** then we will 
8960: 74 72 79 20 74 6f 20 75 73 65 20 74 68 61 74 20  try to use that 
8970: 63 6f 6c 75 6d 6e 20 61 73 20 74 68 65 20 72 6f  column as the ro
8980: 77 69 64 2e 20 20 53 65 74 20 74 68 65 20 54 61  wid.  Set the Ta
8990: 62 6c 65 2e 69 50 4b 65 79 0a 2a 2a 20 66 69 65  ble.iPKey.** fie
89a0: 6c 64 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  ld of the table 
89b0: 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69  under constructi
89c0: 6f 6e 20 74 6f 20 62 65 20 74 68 65 20 69 6e 64  on to be the ind
89d0: 65 78 20 6f 66 20 74 68 65 0a 2a 2a 20 49 4e 54  ex of the.** INT
89e0: 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59  EGER PRIMARY KEY
89f0: 20 63 6f 6c 75 6d 6e 2e 20 20 54 61 62 6c 65 2e   column.  Table.
8a00: 69 50 4b 65 79 20 69 73 20 73 65 74 20 74 6f 20  iPKey is set to 
8a10: 2d 31 20 69 66 20 74 68 65 72 65 20 69 73 0a 2a  -1 if there is.*
8a20: 2a 20 6e 6f 20 49 4e 54 45 47 45 52 20 50 52 49  * no INTEGER PRI
8a30: 4d 41 52 59 20 4b 45 59 2e 0a 2a 2a 0a 2a 2a 20  MARY KEY..**.** 
8a40: 49 66 20 74 68 65 20 6b 65 79 20 69 73 20 6e 6f  If the key is no
8a50: 74 20 61 6e 20 49 4e 54 45 47 45 52 20 50 52 49  t an INTEGER PRI
8a60: 4d 41 52 59 20 4b 45 59 2c 20 74 68 65 6e 20 63  MARY KEY, then c
8a70: 72 65 61 74 65 20 61 20 75 6e 69 71 75 65 0a 2a  reate a unique.*
8a80: 2a 20 69 6e 64 65 78 20 66 6f 72 20 74 68 65 20  * index for the 
8a90: 6b 65 79 2e 20 20 4e 6f 20 69 6e 64 65 78 20 69  key.  No index i
8aa0: 73 20 63 72 65 61 74 65 64 20 66 6f 72 20 49 4e  s created for IN
8ab0: 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45  TEGER PRIMARY KE
8ac0: 59 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  Ys..*/.void sqli
8ad0: 74 65 33 41 64 64 50 72 69 6d 61 72 79 4b 65 79  te3AddPrimaryKey
8ae0: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
8af0: 65 2c 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67  e,    /* Parsing
8b00: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78   context */.  Ex
8b10: 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20  prList *pList,  
8b20: 2f 2a 20 4c 69 73 74 20 6f 66 20 66 69 65 6c 64  /* List of field
8b30: 20 6e 61 6d 65 73 20 74 6f 20 62 65 20 69 6e 64   names to be ind
8b40: 65 78 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 6e  exed */.  int on
8b50: 45 72 72 6f 72 2c 20 20 20 20 20 20 2f 2a 20 57  Error,      /* W
8b60: 68 61 74 20 74 6f 20 64 6f 20 77 69 74 68 20 61  hat to do with a
8b70: 20 75 6e 69 71 75 65 6e 65 73 73 20 63 6f 6e 66   uniqueness conf
8b80: 6c 69 63 74 20 2a 2f 0a 20 20 69 6e 74 20 61 75  lict */.  int au
8b90: 74 6f 49 6e 63 2c 20 20 20 20 20 20 2f 2a 20 54  toInc,      /* T
8ba0: 72 75 65 20 69 66 20 74 68 65 20 41 55 54 4f 49  rue if the AUTOI
8bb0: 4e 43 52 45 4d 45 4e 54 20 6b 65 79 77 6f 72 64  NCREMENT keyword
8bc0: 20 69 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a 20   is present */. 
8bd0: 20 69 6e 74 20 73 6f 72 74 4f 72 64 65 72 20 20   int sortOrder  
8be0: 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 53 4f 5f     /* SQLITE_SO_
8bf0: 41 53 43 20 6f 72 20 53 51 4c 49 54 45 5f 53 4f  ASC or SQLITE_SO
8c00: 5f 44 45 53 43 20 2a 2f 0a 29 7b 0a 20 20 54 61  _DESC */.){.  Ta
8c10: 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 50 61 72  ble *pTab = pPar
8c20: 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20  se->pNewTable;. 
8c30: 20 63 68 61 72 20 2a 7a 54 79 70 65 20 3d 20 30   char *zType = 0
8c40: 3b 0a 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 2d  ;.  int iCol = -
8c50: 31 2c 20 69 3b 0a 20 20 69 66 28 20 70 54 61 62  1, i;.  if( pTab
8c60: 3d 3d 30 20 7c 7c 20 49 4e 5f 44 45 43 4c 41 52  ==0 || IN_DECLAR
8c70: 45 5f 56 54 41 42 20 29 20 67 6f 74 6f 20 70 72  E_VTAB ) goto pr
8c80: 69 6d 61 72 79 5f 6b 65 79 5f 65 78 69 74 3b 0a  imary_key_exit;.
8c90: 20 20 69 66 28 20 70 54 61 62 2d 3e 68 61 73 50    if( pTab->hasP
8ca0: 72 69 6d 4b 65 79 20 29 7b 0a 20 20 20 20 73 71  rimKey ){.    sq
8cb0: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
8cc0: 61 72 73 65 2c 20 0a 20 20 20 20 20 20 22 74 61  arse, .      "ta
8cd0: 62 6c 65 20 5c 22 25 73 5c 22 20 68 61 73 20 6d  ble \"%s\" has m
8ce0: 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 70 72 69  ore than one pri
8cf0: 6d 61 72 79 20 6b 65 79 22 2c 20 70 54 61 62 2d  mary key", pTab-
8d00: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 67 6f 74  >zName);.    got
8d10: 6f 20 70 72 69 6d 61 72 79 5f 6b 65 79 5f 65 78  o primary_key_ex
8d20: 69 74 3b 0a 20 20 7d 0a 20 20 70 54 61 62 2d 3e  it;.  }.  pTab->
8d30: 68 61 73 50 72 69 6d 4b 65 79 20 3d 20 31 3b 0a  hasPrimKey = 1;.
8d40: 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29    if( pList==0 )
8d50: 7b 0a 20 20 20 20 69 43 6f 6c 20 3d 20 70 54 61  {.    iCol = pTa
8d60: 62 2d 3e 6e 43 6f 6c 20 2d 20 31 3b 0a 20 20 20  b->nCol - 1;.   
8d70: 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c   pTab->aCol[iCol
8d80: 5d 2e 69 73 50 72 69 6d 4b 65 79 20 3d 20 31 3b  ].isPrimKey = 1;
8d90: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 6f  .  }else{.    fo
8da0: 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e  r(i=0; i<pList->
8db0: 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
8dc0: 20 20 20 66 6f 72 28 69 43 6f 6c 3d 30 3b 20 69     for(iCol=0; i
8dd0: 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20  Col<pTab->nCol; 
8de0: 69 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 20  iCol++){.       
8df0: 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49   if( sqlite3StrI
8e00: 43 6d 70 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  Cmp(pList->a[i].
8e10: 7a 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 61 43 6f  zName, pTab->aCo
8e20: 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 29 3d 3d  l[iCol].zName)==
8e30: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 62  0 ){.          b
8e40: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  reak;.        }.
8e50: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
8e60: 28 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f  ( iCol<pTab->nCo
8e70: 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 70 54 61  l ){.        pTa
8e80: 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 69 73  b->aCol[iCol].is
8e90: 50 72 69 6d 4b 65 79 20 3d 20 31 3b 0a 20 20 20  PrimKey = 1;.   
8ea0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
8eb0: 66 28 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3e  f( pList->nExpr>
8ec0: 31 20 29 20 69 43 6f 6c 20 3d 20 2d 31 3b 0a 20  1 ) iCol = -1;. 
8ed0: 20 7d 0a 20 20 69 66 28 20 69 43 6f 6c 3e 3d 30   }.  if( iCol>=0
8ee0: 20 26 26 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e   && iCol<pTab->n
8ef0: 43 6f 6c 20 29 7b 0a 20 20 20 20 7a 54 79 70 65  Col ){.    zType
8f00: 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43   = pTab->aCol[iC
8f10: 6f 6c 5d 2e 7a 54 79 70 65 3b 0a 20 20 7d 0a 20  ol].zType;.  }. 
8f20: 20 69 66 28 20 7a 54 79 70 65 20 26 26 20 73 71   if( zType && sq
8f30: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 54 79  lite3StrICmp(zTy
8f40: 70 65 2c 20 22 49 4e 54 45 47 45 52 22 29 3d 3d  pe, "INTEGER")==
8f50: 30 0a 20 20 20 20 20 20 20 20 26 26 20 73 6f 72  0.        && sor
8f60: 74 4f 72 64 65 72 3d 3d 53 51 4c 49 54 45 5f 53  tOrder==SQLITE_S
8f70: 4f 5f 41 53 43 20 29 7b 0a 20 20 20 20 70 54 61  O_ASC ){.    pTa
8f80: 62 2d 3e 69 50 4b 65 79 20 3d 20 69 43 6f 6c 3b  b->iPKey = iCol;
8f90: 0a 20 20 20 20 70 54 61 62 2d 3e 6b 65 79 43 6f  .    pTab->keyCo
8fa0: 6e 66 20 3d 20 6f 6e 45 72 72 6f 72 3b 0a 20 20  nf = onError;.  
8fb0: 20 20 70 54 61 62 2d 3e 61 75 74 6f 49 6e 63 20    pTab->autoInc 
8fc0: 3d 20 61 75 74 6f 49 6e 63 3b 0a 20 20 7d 65 6c  = autoInc;.  }el
8fd0: 73 65 20 69 66 28 20 61 75 74 6f 49 6e 63 20 29  se if( autoInc )
8fe0: 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  {.#ifndef SQLITE
8ff0: 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 43 52 45 4d  _OMIT_AUTOINCREM
9000: 45 4e 54 0a 20 20 20 20 73 71 6c 69 74 65 33 45  ENT.    sqlite3E
9010: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
9020: 22 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 20 69  "AUTOINCREMENT i
9030: 73 20 6f 6e 6c 79 20 61 6c 6c 6f 77 65 64 20 6f  s only allowed o
9040: 6e 20 61 6e 20 22 0a 20 20 20 20 20 20 20 22 49  n an ".       "I
9050: 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b  NTEGER PRIMARY K
9060: 45 59 22 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d  EY");.#endif.  }
9070: 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65  else{.    sqlite
9080: 33 43 72 65 61 74 65 49 6e 64 65 78 28 70 50 61  3CreateIndex(pPa
9090: 72 73 65 2c 20 30 2c 20 30 2c 20 30 2c 20 70 4c  rse, 0, 0, 0, pL
90a0: 69 73 74 2c 20 6f 6e 45 72 72 6f 72 2c 20 30 2c  ist, onError, 0,
90b0: 20 30 2c 20 73 6f 72 74 4f 72 64 65 72 2c 20 30   0, sortOrder, 0
90c0: 29 3b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 30  );.    pList = 0
90d0: 3b 0a 20 20 7d 0a 0a 70 72 69 6d 61 72 79 5f 6b  ;.  }..primary_k
90e0: 65 79 5f 65 78 69 74 3a 0a 20 20 73 71 6c 69 74  ey_exit:.  sqlit
90f0: 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65  e3ExprListDelete
9100: 28 70 4c 69 73 74 29 3b 0a 20 20 72 65 74 75 72  (pList);.  retur
9110: 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20  n;.}../*.** Add 
9120: 61 20 6e 65 77 20 43 48 45 43 4b 20 63 6f 6e 73  a new CHECK cons
9130: 74 72 61 69 6e 74 20 74 6f 20 74 68 65 20 74 61  traint to the ta
9140: 62 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 75 6e  ble currently un
9150: 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e  der construction
9160: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
9170: 33 41 64 64 43 68 65 63 6b 43 6f 6e 73 74 72 61  3AddCheckConstra
9180: 69 6e 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50  int(.  Parse *pP
9190: 61 72 73 65 2c 20 20 20 20 2f 2a 20 50 61 72 73  arse,    /* Pars
91a0: 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
91b0: 20 45 78 70 72 20 2a 70 43 68 65 63 6b 45 78 70   Expr *pCheckExp
91c0: 72 20 20 2f 2a 20 54 68 65 20 63 68 65 63 6b 20  r  /* The check 
91d0: 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 29 7b  expression */.){
91e0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
91f0: 4f 4d 49 54 5f 43 48 45 43 4b 0a 20 20 54 61 62  OMIT_CHECK.  Tab
9200: 6c 65 20 2a 70 54 61 62 20 3d 20 70 50 61 72 73  le *pTab = pPars
9210: 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20  e->pNewTable;.  
9220: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
9230: 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20  arse->db;.  if( 
9240: 70 54 61 62 20 26 26 20 21 49 4e 5f 44 45 43 4c  pTab && !IN_DECL
9250: 41 52 45 5f 56 54 41 42 20 29 7b 0a 20 20 20 20  ARE_VTAB ){.    
9260: 2f 2a 20 54 68 65 20 43 48 45 43 4b 20 65 78 70  /* The CHECK exp
9270: 72 65 73 73 69 6f 6e 20 6d 75 73 74 20 62 65 20  ression must be 
9280: 64 75 70 6c 69 63 61 74 65 64 20 73 6f 20 74 68  duplicated so th
9290: 61 74 20 74 6f 6b 65 6e 73 20 72 65 66 65 72 0a  at tokens refer.
92a0: 20 20 20 20 2a 2a 20 74 6f 20 6d 61 6c 6c 6f 63      ** to malloc
92b0: 65 64 20 73 70 61 63 65 20 61 6e 64 20 6e 6f 74  ed space and not
92c0: 20 74 68 65 20 28 65 70 68 65 6d 65 72 61 6c 29   the (ephemeral)
92d0: 20 74 65 78 74 20 6f 66 20 74 68 65 20 43 52 45   text of the CRE
92e0: 41 54 45 20 54 41 42 4c 45 0a 20 20 20 20 2a 2a  ATE TABLE.    **
92f0: 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20   statement */.  
9300: 20 20 70 54 61 62 2d 3e 70 43 68 65 63 6b 20 3d    pTab->pCheck =
9310: 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 64 28   sqlite3ExprAnd(
9320: 64 62 2c 20 70 54 61 62 2d 3e 70 43 68 65 63 6b  db, pTab->pCheck
9330: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
9340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9350: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
9360: 44 75 70 28 64 62 2c 20 70 43 68 65 63 6b 45 78  Dup(db, pCheckEx
9370: 70 72 29 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  pr));.  }.#endif
9380: 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65  .  sqlite3ExprDe
9390: 6c 65 74 65 28 70 43 68 65 63 6b 45 78 70 72 29  lete(pCheckExpr)
93a0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  ;.}../*.** Set t
93b0: 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 75 6e  he collation fun
93c0: 63 74 69 6f 6e 20 6f 66 20 74 68 65 20 6d 6f 73  ction of the mos
93d0: 74 20 72 65 63 65 6e 74 6c 79 20 70 61 72 73 65  t recently parse
93e0: 64 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 0a 2a  d table column.*
93f0: 2a 20 74 6f 20 74 68 65 20 43 6f 6c 6c 53 65 71  * to the CollSeq
9400: 20 67 69 76 65 6e 2e 0a 2a 2f 0a 76 6f 69 64 20   given..*/.void 
9410: 73 71 6c 69 74 65 33 41 64 64 43 6f 6c 6c 61 74  sqlite3AddCollat
9420: 65 54 79 70 65 28 50 61 72 73 65 20 2a 70 50 61  eType(Parse *pPa
9430: 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b  rse, Token *pTok
9440: 65 6e 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b  en){.  Table *p;
9450: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 68 61 72  .  int i;.  char
9460: 20 2a 7a 43 6f 6c 6c 3b 20 20 20 20 20 20 20 20   *zColl;        
9470: 20 20 20 20 20 20 2f 2a 20 44 65 71 75 6f 74 65        /* Dequote
9480: 64 20 6e 61 6d 65 20 6f 66 20 63 6f 6c 6c 61 74  d name of collat
9490: 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 2a 2f 0a  ion sequence */.
94a0: 0a 20 20 69 66 28 20 28 70 20 3d 20 70 50 61 72  .  if( (p = pPar
94b0: 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3d 3d  se->pNewTable)==
94c0: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 20  0 ) return;.  i 
94d0: 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 0a 20 20  = p->nCol-1;..  
94e0: 7a 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 4e  zColl = sqlite3N
94f0: 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 50 61  ameFromToken(pPa
9500: 72 73 65 2d 3e 64 62 2c 20 70 54 6f 6b 65 6e 29  rse->db, pToken)
9510: 3b 0a 20 20 69 66 28 20 21 7a 43 6f 6c 6c 20 29  ;.  if( !zColl )
9520: 20 72 65 74 75 72 6e 3b 0a 0a 20 20 69 66 28 20   return;..  if( 
9530: 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 43 6f 6c  sqlite3LocateCol
9540: 6c 53 65 71 28 70 50 61 72 73 65 2c 20 7a 43 6f  lSeq(pParse, zCo
9550: 6c 6c 2c 20 2d 31 29 20 29 7b 0a 20 20 20 20 49  ll, -1) ){.    I
9560: 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 20 20  ndex *pIdx;.    
9570: 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 43 6f 6c 6c  p->aCol[i].zColl
9580: 20 3d 20 7a 43 6f 6c 6c 3b 0a 20 20 0a 20 20 20   = zColl;.  .   
9590: 20 2f 2a 20 49 66 20 74 68 65 20 63 6f 6c 75 6d   /* If the colum
95a0: 6e 20 69 73 20 64 65 63 6c 61 72 65 64 20 61 73  n is declared as
95b0: 20 22 3c 6e 61 6d 65 3e 20 50 52 49 4d 41 52 59   "<name> PRIMARY
95c0: 20 4b 45 59 20 43 4f 4c 4c 41 54 45 20 3c 74 79   KEY COLLATE <ty
95d0: 70 65 3e 22 2c 0a 20 20 20 20 2a 2a 20 74 68 65  pe>",.    ** the
95e0: 6e 20 61 6e 20 69 6e 64 65 78 20 6d 61 79 20 68  n an index may h
95f0: 61 76 65 20 62 65 65 6e 20 63 72 65 61 74 65 64  ave been created
9600: 20 6f 6e 20 74 68 69 73 20 63 6f 6c 75 6d 6e 20   on this column 
9610: 62 65 66 6f 72 65 20 74 68 65 0a 20 20 20 20 2a  before the.    *
9620: 2a 20 63 6f 6c 6c 61 74 69 6f 6e 20 74 79 70 65  * collation type
9630: 20 77 61 73 20 61 64 64 65 64 2e 20 43 6f 72 72   was added. Corr
9640: 65 63 74 20 74 68 69 73 20 69 66 20 69 74 20 69  ect this if it i
9650: 73 20 74 68 65 20 63 61 73 65 2e 0a 20 20 20 20  s the case..    
9660: 2a 2f 0a 20 20 20 20 66 6f 72 28 70 49 64 78 3d  */.    for(pIdx=
9670: 70 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b  p->pIndex; pIdx;
9680: 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78   pIdx=pIdx->pNex
9690: 74 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  t){.      assert
96a0: 28 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3d  ( pIdx->nColumn=
96b0: 3d 31 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  =1 );.      if( 
96c0: 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 30  pIdx->aiColumn[0
96d0: 5d 3d 3d 69 20 29 7b 0a 20 20 20 20 20 20 20 20  ]==i ){.        
96e0: 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 30 5d 20  pIdx->azColl[0] 
96f0: 3d 20 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 43 6f  = p->aCol[i].zCo
9700: 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ll;.      }.    
9710: 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  }.  }else{.    s
9720: 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6c  qlite3_free(zCol
9730: 6c 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  l);.  }.}../*.**
9740: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   This function r
9750: 65 74 75 72 6e 73 20 74 68 65 20 63 6f 6c 6c 61  eturns the colla
9760: 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 66 6f  tion sequence fo
9770: 72 20 64 61 74 61 62 61 73 65 20 6e 61 74 69 76  r database nativ
9780: 65 20 74 65 78 74 0a 2a 2a 20 65 6e 63 6f 64 69  e text.** encodi
9790: 6e 67 20 69 64 65 6e 74 69 66 69 65 64 20 62 79  ng identified by
97a0: 20 74 68 65 20 73 74 72 69 6e 67 20 7a 4e 61 6d   the string zNam
97b0: 65 2c 20 6c 65 6e 67 74 68 20 6e 4e 61 6d 65 2e  e, length nName.
97c0: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 72 65  .**.** If the re
97d0: 71 75 65 73 74 65 64 20 63 6f 6c 6c 61 74 69 6f  quested collatio
97e0: 6e 20 73 65 71 75 65 6e 63 65 20 69 73 20 6e 6f  n sequence is no
97f0: 74 20 61 76 61 69 6c 61 62 6c 65 2c 20 6f 72 20  t available, or 
9800: 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 0a 2a 2a  not available.**
9810: 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
9820: 20 6e 61 74 69 76 65 20 65 6e 63 6f 64 69 6e 67   native encoding
9830: 2c 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20  , the collation 
9840: 66 61 63 74 6f 72 79 20 69 73 20 69 6e 76 6f 6b  factory is invok
9850: 65 64 20 74 6f 0a 2a 2a 20 72 65 71 75 65 73 74  ed to.** request
9860: 20 69 74 2e 20 49 66 20 74 68 65 20 63 6f 6c 6c   it. If the coll
9870: 61 74 69 6f 6e 20 66 61 63 74 6f 72 79 20 64 6f  ation factory do
9880: 65 73 20 6e 6f 74 20 73 75 70 70 6c 79 20 73 75  es not supply su
9890: 63 68 20 61 20 73 65 71 75 65 6e 63 65 2c 0a 2a  ch a sequence,.*
98a0: 2a 20 61 6e 64 20 74 68 65 20 73 65 71 75 65 6e  * and the sequen
98b0: 63 65 20 69 73 20 61 76 61 69 6c 61 62 6c 65 20  ce is available 
98c0: 69 6e 20 61 6e 6f 74 68 65 72 20 74 65 78 74 20  in another text 
98d0: 65 6e 63 6f 64 69 6e 67 2c 20 74 68 65 6e 20 74  encoding, then t
98e0: 68 61 74 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e  hat is.** return
98f0: 65 64 20 69 6e 73 74 65 61 64 2e 0a 2a 2a 0a 2a  ed instead..**.*
9900: 2a 20 49 66 20 6e 6f 20 76 65 72 73 69 6f 6e 73  * If no versions
9910: 20 6f 66 20 74 68 65 20 72 65 71 75 65 73 74 65   of the requeste
9920: 64 20 63 6f 6c 6c 61 74 69 6f 6e 73 20 73 65 71  d collations seq
9930: 75 65 6e 63 65 20 61 72 65 20 61 76 61 69 6c 61  uence are availa
9940: 62 6c 65 2c 20 6f 72 0a 2a 2a 20 61 6e 6f 74 68  ble, or.** anoth
9950: 65 72 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  er error occurs,
9960: 20 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65   NULL is returne
9970: 64 20 61 6e 64 20 61 6e 20 65 72 72 6f 72 20 6d  d and an error m
9980: 65 73 73 61 67 65 20 77 72 69 74 74 65 6e 20 69  essage written i
9990: 6e 74 6f 0a 2a 2a 20 70 50 61 72 73 65 2e 0a 2a  nto.** pParse..*
99a0: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
99b0: 65 20 69 73 20 61 20 77 72 61 70 70 65 72 20 61  e is a wrapper a
99c0: 72 6f 75 6e 64 20 73 71 6c 69 74 65 33 46 69 6e  round sqlite3Fin
99d0: 64 43 6f 6c 6c 53 65 71 28 29 2e 20 20 54 68 69  dCollSeq().  Thi
99e0: 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 6e 76  s routine.** inv
99f0: 6f 6b 65 73 20 74 68 65 20 63 6f 6c 6c 61 74 69  okes the collati
9a00: 6f 6e 20 66 61 63 74 6f 72 79 20 69 66 20 74 68  on factory if th
9a10: 65 20 6e 61 6d 65 64 20 63 6f 6c 6c 61 74 69 6f  e named collatio
9a20: 6e 20 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e  n cannot be foun
9a30: 64 0a 2a 2a 20 61 6e 64 20 67 65 6e 65 72 61 74  d.** and generat
9a40: 65 73 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73  es an error mess
9a50: 61 67 65 2e 0a 2a 2f 0a 43 6f 6c 6c 53 65 71 20  age..*/.CollSeq 
9a60: 2a 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 43 6f  *sqlite3LocateCo
9a70: 6c 6c 53 65 71 28 50 61 72 73 65 20 2a 70 50 61  llSeq(Parse *pPa
9a80: 72 73 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  rse, const char 
9a90: 2a 7a 4e 61 6d 65 2c 20 69 6e 74 20 6e 4e 61 6d  *zName, int nNam
9aa0: 65 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  e){.  sqlite3 *d
9ab0: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
9ac0: 20 20 75 38 20 65 6e 63 20 3d 20 45 4e 43 28 64    u8 enc = ENC(d
9ad0: 62 29 3b 0a 20 20 75 38 20 69 6e 69 74 62 75 73  b);.  u8 initbus
9ae0: 79 20 3d 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73  y = db->init.bus
9af0: 79 3b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43  y;.  CollSeq *pC
9b00: 6f 6c 6c 3b 0a 0a 20 20 70 43 6f 6c 6c 20 3d 20  oll;..  pColl = 
9b10: 73 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53  sqlite3FindCollS
9b20: 65 71 28 64 62 2c 20 65 6e 63 2c 20 7a 4e 61 6d  eq(db, enc, zNam
9b30: 65 2c 20 6e 4e 61 6d 65 2c 20 69 6e 69 74 62 75  e, nName, initbu
9b40: 73 79 29 3b 0a 20 20 69 66 28 20 21 69 6e 69 74  sy);.  if( !init
9b50: 62 75 73 79 20 26 26 20 28 21 70 43 6f 6c 6c 20  busy && (!pColl 
9b60: 7c 7c 20 21 70 43 6f 6c 6c 2d 3e 78 43 6d 70 29  || !pColl->xCmp)
9b70: 20 29 7b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20   ){.    pColl = 
9b80: 73 71 6c 69 74 65 33 47 65 74 43 6f 6c 6c 53 65  sqlite3GetCollSe
9b90: 71 28 64 62 2c 20 70 43 6f 6c 6c 2c 20 7a 4e 61  q(db, pColl, zNa
9ba0: 6d 65 2c 20 6e 4e 61 6d 65 29 3b 0a 20 20 20 20  me, nName);.    
9bb0: 69 66 28 20 21 70 43 6f 6c 6c 20 29 7b 0a 20 20  if( !pColl ){.  
9bc0: 20 20 20 20 69 66 28 20 6e 4e 61 6d 65 3c 30 20      if( nName<0 
9bd0: 29 7b 0a 20 20 20 20 20 20 20 20 6e 4e 61 6d 65  ){.        nName
9be0: 20 3d 20 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29   = strlen(zName)
9bf0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
9c00: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
9c10: 70 50 61 72 73 65 2c 20 22 6e 6f 20 73 75 63 68  pParse, "no such
9c20: 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
9c30: 6e 63 65 3a 20 25 2e 2a 73 22 2c 20 6e 4e 61 6d  nce: %.*s", nNam
9c40: 65 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  e, zName);.     
9c50: 20 70 43 6f 6c 6c 20 3d 20 30 3b 0a 20 20 20 20   pColl = 0;.    
9c60: 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  }.  }..  return 
9c70: 70 43 6f 6c 6c 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  pColl;.}.../*.**
9c80: 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
9c90: 68 61 74 20 77 69 6c 6c 20 69 6e 63 72 65 6d 65  hat will increme
9ca0: 6e 74 20 74 68 65 20 73 63 68 65 6d 61 20 63 6f  nt the schema co
9cb0: 6f 6b 69 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  okie..**.** The 
9cc0: 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 20 69 73  schema cookie is
9cd0: 20 75 73 65 64 20 74 6f 20 64 65 74 65 72 6d 69   used to determi
9ce0: 6e 65 20 77 68 65 6e 20 74 68 65 20 73 63 68 65  ne when the sche
9cf0: 6d 61 20 66 6f 72 20 74 68 65 0a 2a 2a 20 64 61  ma for the.** da
9d00: 74 61 62 61 73 65 20 63 68 61 6e 67 65 73 2e 20  tabase changes. 
9d10: 20 41 66 74 65 72 20 65 61 63 68 20 73 63 68 65   After each sche
9d20: 6d 61 20 63 68 61 6e 67 65 2c 20 74 68 65 20 63  ma change, the c
9d30: 6f 6f 6b 69 65 20 76 61 6c 75 65 0a 2a 2a 20 63  ookie value.** c
9d40: 68 61 6e 67 65 73 2e 20 20 57 68 65 6e 20 61 20  hanges.  When a 
9d50: 70 72 6f 63 65 73 73 20 66 69 72 73 74 20 72 65  process first re
9d60: 61 64 73 20 74 68 65 20 73 63 68 65 6d 61 20 69  ads the schema i
9d70: 74 20 72 65 63 6f 72 64 73 20 74 68 65 0a 2a 2a  t records the.**
9d80: 20 63 6f 6f 6b 69 65 2e 20 20 54 68 65 72 65 61   cookie.  Therea
9d90: 66 74 65 72 2c 20 77 68 65 6e 65 76 65 72 20 69  fter, whenever i
9da0: 74 20 67 6f 65 73 20 74 6f 20 61 63 63 65 73 73  t goes to access
9db0: 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 0a 2a   the database,.*
9dc0: 2a 20 69 74 20 63 68 65 63 6b 73 20 74 68 65 20  * it checks the 
9dd0: 63 6f 6f 6b 69 65 20 74 6f 20 6d 61 6b 65 20 73  cookie to make s
9de0: 75 72 65 20 74 68 65 20 73 63 68 65 6d 61 20 68  ure the schema h
9df0: 61 73 20 6e 6f 74 20 63 68 61 6e 67 65 64 0a 2a  as not changed.*
9e00: 2a 20 73 69 6e 63 65 20 69 74 20 77 61 73 20 6c  * since it was l
9e10: 61 73 74 20 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20  ast read..**.** 
9e20: 54 68 69 73 20 70 6c 61 6e 20 69 73 20 6e 6f 74  This plan is not
9e30: 20 63 6f 6d 70 6c 65 74 65 6c 79 20 62 75 6c 6c   completely bull
9e40: 65 74 2d 70 72 6f 6f 66 2e 20 20 49 74 20 69 73  et-proof.  It is
9e50: 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 0a 2a 2a   possible for.**
9e60: 20 74 68 65 20 73 63 68 65 6d 61 20 74 6f 20 63   the schema to c
9e70: 68 61 6e 67 65 20 6d 75 6c 74 69 70 6c 65 20 74  hange multiple t
9e80: 69 6d 65 73 20 61 6e 64 20 66 6f 72 20 74 68 65  imes and for the
9e90: 20 63 6f 6f 6b 69 65 20 74 6f 20 62 65 0a 2a 2a   cookie to be.**
9ea0: 20 73 65 74 20 62 61 63 6b 20 74 6f 20 70 72 69   set back to pri
9eb0: 6f 72 20 76 61 6c 75 65 2e 20 20 42 75 74 20 73  or value.  But s
9ec0: 63 68 65 6d 61 20 63 68 61 6e 67 65 73 20 61 72  chema changes ar
9ed0: 65 20 69 6e 66 72 65 71 75 65 6e 74 0a 2a 2a 20  e infrequent.** 
9ee0: 61 6e 64 20 74 68 65 20 70 72 6f 62 61 62 69 6c  and the probabil
9ef0: 69 74 79 20 6f 66 20 68 69 74 74 69 6e 67 20 74  ity of hitting t
9f00: 68 65 20 73 61 6d 65 20 63 6f 6f 6b 69 65 20 76  he same cookie v
9f10: 61 6c 75 65 20 69 73 20 6f 6e 6c 79 0a 2a 2a 20  alue is only.** 
9f20: 31 20 63 68 61 6e 63 65 20 69 6e 20 32 5e 33 32  1 chance in 2^32
9f30: 2e 20 20 53 6f 20 77 65 27 72 65 20 73 61 66 65  .  So we're safe
9f40: 20 65 6e 6f 75 67 68 2e 0a 2a 2f 0a 76 6f 69 64   enough..*/.void
9f50: 20 73 71 6c 69 74 65 33 43 68 61 6e 67 65 43 6f   sqlite3ChangeCo
9f60: 6f 6b 69 65 28 73 71 6c 69 74 65 33 20 2a 64 62  okie(sqlite3 *db
9f70: 2c 20 56 64 62 65 20 2a 76 2c 20 69 6e 74 20 69  , Vdbe *v, int i
9f80: 44 62 29 7b 0a 20 20 73 71 6c 69 74 65 33 56 64  Db){.  sqlite3Vd
9f90: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
9fa0: 6e 74 65 67 65 72 2c 20 64 62 2d 3e 61 44 62 5b  nteger, db->aDb[
9fb0: 69 44 62 5d 2e 70 53 63 68 65 6d 61 2d 3e 73 63  iDb].pSchema->sc
9fc0: 68 65 6d 61 5f 63 6f 6f 6b 69 65 2b 31 2c 20 30  hema_cookie+1, 0
9fd0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
9fe0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 65 74  AddOp2(v, OP_Set
9ff0: 43 6f 6f 6b 69 65 2c 20 69 44 62 2c 20 30 29 3b  Cookie, iDb, 0);
a000: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 65 61 73 75 72  .}../*.** Measur
a010: 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  e the number of 
a020: 63 68 61 72 61 63 74 65 72 73 20 6e 65 65 64 65  characters neede
a030: 64 20 74 6f 20 6f 75 74 70 75 74 20 74 68 65 20  d to output the 
a040: 67 69 76 65 6e 0a 2a 2a 20 69 64 65 6e 74 69 66  given.** identif
a050: 69 65 72 2e 20 20 54 68 65 20 6e 75 6d 62 65 72  ier.  The number
a060: 20 72 65 74 75 72 6e 65 64 20 69 6e 63 6c 75 64   returned includ
a070: 65 73 20 61 6e 79 20 71 75 6f 74 65 73 20 75 73  es any quotes us
a080: 65 64 0a 2a 2a 20 62 75 74 20 64 6f 65 73 20 6e  ed.** but does n
a090: 6f 74 20 69 6e 63 6c 75 64 65 20 74 68 65 20 6e  ot include the n
a0a0: 75 6c 6c 20 74 65 72 6d 69 6e 61 74 6f 72 2e 0a  ull terminator..
a0b0: 2a 2a 0a 2a 2a 20 54 68 65 20 65 73 74 69 6d 61  **.** The estima
a0c0: 74 65 20 69 73 20 63 6f 6e 73 65 72 76 61 74 69  te is conservati
a0d0: 76 65 2e 20 20 49 74 20 6d 69 67 68 74 20 62 65  ve.  It might be
a0e0: 20 6c 61 72 67 65 72 20 74 68 61 74 20 77 68 61   larger that wha
a0f0: 74 20 69 73 0a 2a 2a 20 72 65 61 6c 6c 79 20 6e  t is.** really n
a100: 65 65 64 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  eeded..*/.static
a110: 20 69 6e 74 20 69 64 65 6e 74 4c 65 6e 67 74 68   int identLength
a120: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b  (const char *z){
a130: 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 66 6f 72 28  .  int n;.  for(
a140: 6e 3d 30 3b 20 2a 7a 3b 20 6e 2b 2b 2c 20 7a 2b  n=0; *z; n++, z+
a150: 2b 29 7b 0a 20 20 20 20 69 66 28 20 2a 7a 3d 3d  +){.    if( *z==
a160: 27 22 27 20 29 7b 20 6e 2b 2b 3b 20 7d 0a 20 20  '"' ){ n++; }.  
a170: 7d 0a 20 20 72 65 74 75 72 6e 20 6e 20 2b 20 32  }.  return n + 2
a180: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65  ;.}../*.** Write
a190: 20 61 6e 20 69 64 65 6e 74 69 66 69 65 72 20 6f   an identifier o
a1a0: 6e 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74  nto the end of t
a1b0: 68 65 20 67 69 76 65 6e 20 73 74 72 69 6e 67 2e  he given string.
a1c0: 20 20 41 64 64 0a 2a 2a 20 71 75 6f 74 65 20 63    Add.** quote c
a1d0: 68 61 72 61 63 74 65 72 73 20 61 73 20 6e 65 65  haracters as nee
a1e0: 64 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ded..*/.static v
a1f0: 6f 69 64 20 69 64 65 6e 74 50 75 74 28 63 68 61  oid identPut(cha
a200: 72 20 2a 7a 2c 20 69 6e 74 20 2a 70 49 64 78 2c  r *z, int *pIdx,
a210: 20 63 68 61 72 20 2a 7a 53 69 67 6e 65 64 49 64   char *zSignedId
a220: 65 6e 74 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64  ent){.  unsigned
a230: 20 63 68 61 72 20 2a 7a 49 64 65 6e 74 20 3d 20   char *zIdent = 
a240: 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29  (unsigned char*)
a250: 7a 53 69 67 6e 65 64 49 64 65 6e 74 3b 0a 20 20  zSignedIdent;.  
a260: 69 6e 74 20 69 2c 20 6a 2c 20 6e 65 65 64 51 75  int i, j, needQu
a270: 6f 74 65 3b 0a 20 20 69 20 3d 20 2a 70 49 64 78  ote;.  i = *pIdx
a280: 3b 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 7a 49 64  ;.  for(j=0; zId
a290: 65 6e 74 5b 6a 5d 3b 20 6a 2b 2b 29 7b 0a 20 20  ent[j]; j++){.  
a2a0: 20 20 69 66 28 20 21 69 73 61 6c 6e 75 6d 28 7a    if( !isalnum(z
a2b0: 49 64 65 6e 74 5b 6a 5d 29 20 26 26 20 7a 49 64  Ident[j]) && zId
a2c0: 65 6e 74 5b 6a 5d 21 3d 27 5f 27 20 29 20 62 72  ent[j]!='_' ) br
a2d0: 65 61 6b 3b 0a 20 20 7d 0a 20 20 6e 65 65 64 51  eak;.  }.  needQ
a2e0: 75 6f 74 65 20 3d 20 20 7a 49 64 65 6e 74 5b 6a  uote =  zIdent[j
a2f0: 5d 21 3d 30 20 7c 7c 20 69 73 64 69 67 69 74 28  ]!=0 || isdigit(
a300: 7a 49 64 65 6e 74 5b 30 5d 29 0a 20 20 20 20 20  zIdent[0]).     
a310: 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20               || 
a320: 73 71 6c 69 74 65 33 4b 65 79 77 6f 72 64 43 6f  sqlite3KeywordCo
a330: 64 65 28 7a 49 64 65 6e 74 2c 20 6a 29 21 3d 54  de(zIdent, j)!=T
a340: 4b 5f 49 44 3b 0a 20 20 69 66 28 20 6e 65 65 64  K_ID;.  if( need
a350: 51 75 6f 74 65 20 29 20 7a 5b 69 2b 2b 5d 20 3d  Quote ) z[i++] =
a360: 20 27 22 27 3b 0a 20 20 66 6f 72 28 6a 3d 30 3b   '"';.  for(j=0;
a370: 20 7a 49 64 65 6e 74 5b 6a 5d 3b 20 6a 2b 2b 29   zIdent[j]; j++)
a380: 7b 0a 20 20 20 20 7a 5b 69 2b 2b 5d 20 3d 20 7a  {.    z[i++] = z
a390: 49 64 65 6e 74 5b 6a 5d 3b 0a 20 20 20 20 69 66  Ident[j];.    if
a3a0: 28 20 7a 49 64 65 6e 74 5b 6a 5d 3d 3d 27 22 27  ( zIdent[j]=='"'
a3b0: 20 29 20 7a 5b 69 2b 2b 5d 20 3d 20 27 22 27 3b   ) z[i++] = '"';
a3c0: 0a 20 20 7d 0a 20 20 69 66 28 20 6e 65 65 64 51  .  }.  if( needQ
a3d0: 75 6f 74 65 20 29 20 7a 5b 69 2b 2b 5d 20 3d 20  uote ) z[i++] = 
a3e0: 27 22 27 3b 0a 20 20 7a 5b 69 5d 20 3d 20 30 3b  '"';.  z[i] = 0;
a3f0: 0a 20 20 2a 70 49 64 78 20 3d 20 69 3b 0a 7d 0a  .  *pIdx = i;.}.
a400: 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
a410: 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73  a CREATE TABLE s
a420: 74 61 74 65 6d 65 6e 74 20 61 70 70 72 6f 70 72  tatement appropr
a430: 69 61 74 65 20 66 6f 72 20 74 68 65 20 67 69 76  iate for the giv
a440: 65 6e 0a 2a 2a 20 74 61 62 6c 65 2e 20 20 4d 65  en.** table.  Me
a450: 6d 6f 72 79 20 74 6f 20 68 6f 6c 64 20 74 68 65  mory to hold the
a460: 20 74 65 78 74 20 6f 66 20 74 68 65 20 73 74 61   text of the sta
a470: 74 65 6d 65 6e 74 20 69 73 20 6f 62 74 61 69 6e  tement is obtain
a480: 65 64 0a 2a 2a 20 66 72 6f 6d 20 73 71 6c 69 74  ed.** from sqlit
a490: 65 4d 61 6c 6c 6f 63 28 29 20 61 6e 64 20 6d 75  eMalloc() and mu
a4a0: 73 74 20 62 65 20 66 72 65 65 64 20 62 79 20 74  st be freed by t
a4b0: 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74  he calling funct
a4c0: 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  ion..*/.static c
a4d0: 68 61 72 20 2a 63 72 65 61 74 65 54 61 62 6c 65  har *createTable
a4e0: 53 74 6d 74 28 54 61 62 6c 65 20 2a 70 2c 20 69  Stmt(Table *p, i
a4f0: 6e 74 20 69 73 54 65 6d 70 29 7b 0a 20 20 69 6e  nt isTemp){.  in
a500: 74 20 69 2c 20 6b 2c 20 6e 3b 0a 20 20 63 68 61  t i, k, n;.  cha
a510: 72 20 2a 7a 53 74 6d 74 3b 0a 20 20 63 68 61 72  r *zStmt;.  char
a520: 20 2a 7a 53 65 70 2c 20 2a 7a 53 65 70 32 2c 20   *zSep, *zSep2, 
a530: 2a 7a 45 6e 64 2c 20 2a 7a 3b 0a 20 20 43 6f 6c  *zEnd, *z;.  Col
a540: 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 6e 20 3d  umn *pCol;.  n =
a550: 20 30 3b 0a 20 20 66 6f 72 28 70 43 6f 6c 20 3d   0;.  for(pCol =
a560: 20 70 2d 3e 61 43 6f 6c 2c 20 69 3d 30 3b 20 69   p->aCol, i=0; i
a570: 3c 70 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70  <p->nCol; i++, p
a580: 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 6e 20 2b 3d  Col++){.    n +=
a590: 20 69 64 65 6e 74 4c 65 6e 67 74 68 28 70 43 6f   identLength(pCo
a5a0: 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7a  l->zName);.    z
a5b0: 20 3d 20 70 43 6f 6c 2d 3e 7a 54 79 70 65 3b 0a   = pCol->zType;.
a5c0: 20 20 20 20 69 66 28 20 7a 20 29 7b 0a 20 20 20      if( z ){.   
a5d0: 20 20 20 6e 20 2b 3d 20 28 73 74 72 6c 65 6e 28     n += (strlen(
a5e0: 7a 29 20 2b 20 31 29 3b 0a 20 20 20 20 7d 0a 20  z) + 1);.    }. 
a5f0: 20 7d 0a 20 20 6e 20 2b 3d 20 69 64 65 6e 74 4c   }.  n += identL
a600: 65 6e 67 74 68 28 70 2d 3e 7a 4e 61 6d 65 29 3b  ength(p->zName);
a610: 0a 20 20 69 66 28 20 6e 3c 35 30 20 29 7b 0a 20  .  if( n<50 ){. 
a620: 20 20 20 7a 53 65 70 20 3d 20 22 22 3b 0a 20 20     zSep = "";.  
a630: 20 20 7a 53 65 70 32 20 3d 20 22 2c 22 3b 0a 20    zSep2 = ",";. 
a640: 20 20 20 7a 45 6e 64 20 3d 20 22 29 22 3b 0a 20     zEnd = ")";. 
a650: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 53 65 70   }else{.    zSep
a660: 20 3d 20 22 5c 6e 20 20 22 3b 0a 20 20 20 20 7a   = "\n  ";.    z
a670: 53 65 70 32 20 3d 20 22 2c 5c 6e 20 20 22 3b 0a  Sep2 = ",\n  ";.
a680: 20 20 20 20 7a 45 6e 64 20 3d 20 22 5c 6e 29 22      zEnd = "\n)"
a690: 3b 0a 20 20 7d 0a 20 20 6e 20 2b 3d 20 33 35 20  ;.  }.  n += 35 
a6a0: 2b 20 36 2a 70 2d 3e 6e 43 6f 6c 3b 0a 20 20 7a  + 6*p->nCol;.  z
a6b0: 53 74 6d 74 20 3d 20 73 71 6c 69 74 65 33 5f 6d  Stmt = sqlite3_m
a6c0: 61 6c 6c 6f 63 28 20 6e 20 29 3b 0a 20 20 69 66  alloc( n );.  if
a6d0: 28 20 7a 53 74 6d 74 3d 3d 30 20 29 20 72 65 74  ( zStmt==0 ) ret
a6e0: 75 72 6e 20 30 3b 0a 20 20 73 71 6c 69 74 65 33  urn 0;.  sqlite3
a6f0: 5f 73 6e 70 72 69 6e 74 66 28 6e 2c 20 7a 53 74  _snprintf(n, zSt
a700: 6d 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  mt,.            
a710: 20 20 20 20 20 20 21 4f 4d 49 54 5f 54 45 4d 50        !OMIT_TEMP
a720: 44 42 26 26 69 73 54 65 6d 70 20 3f 20 22 43 52  DB&&isTemp ? "CR
a730: 45 41 54 45 20 54 45 4d 50 20 54 41 42 4c 45 20  EATE TEMP TABLE 
a740: 22 3a 22 43 52 45 41 54 45 20 54 41 42 4c 45 20  ":"CREATE TABLE 
a750: 22 29 3b 0a 20 20 6b 20 3d 20 73 74 72 6c 65 6e  ");.  k = strlen
a760: 28 7a 53 74 6d 74 29 3b 0a 20 20 69 64 65 6e 74  (zStmt);.  ident
a770: 50 75 74 28 7a 53 74 6d 74 2c 20 26 6b 2c 20 70  Put(zStmt, &k, p
a780: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 7a 53 74 6d  ->zName);.  zStm
a790: 74 5b 6b 2b 2b 5d 20 3d 20 27 28 27 3b 0a 20 20  t[k++] = '(';.  
a7a0: 66 6f 72 28 70 43 6f 6c 3d 70 2d 3e 61 43 6f 6c  for(pCol=p->aCol
a7b0: 2c 20 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6c  , i=0; i<p->nCol
a7c0: 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a  ; i++, pCol++){.
a7d0: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
a7e0: 69 6e 74 66 28 6e 2d 6b 2c 20 26 7a 53 74 6d 74  intf(n-k, &zStmt
a7f0: 5b 6b 5d 2c 20 7a 53 65 70 29 3b 0a 20 20 20 20  [k], zSep);.    
a800: 6b 20 2b 3d 20 73 74 72 6c 65 6e 28 26 7a 53 74  k += strlen(&zSt
a810: 6d 74 5b 6b 5d 29 3b 0a 20 20 20 20 7a 53 65 70  mt[k]);.    zSep
a820: 20 3d 20 7a 53 65 70 32 3b 0a 20 20 20 20 69 64   = zSep2;.    id
a830: 65 6e 74 50 75 74 28 7a 53 74 6d 74 2c 20 26 6b  entPut(zStmt, &k
a840: 2c 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a  , pCol->zName);.
a850: 20 20 20 20 69 66 28 20 28 7a 20 3d 20 70 43 6f      if( (z = pCo
a860: 6c 2d 3e 7a 54 79 70 65 29 21 3d 30 20 29 7b 0a  l->zType)!=0 ){.
a870: 20 20 20 20 20 20 7a 53 74 6d 74 5b 6b 2b 2b 5d        zStmt[k++]
a880: 20 3d 20 27 20 27 3b 0a 20 20 20 20 20 20 61 73   = ' ';.      as
a890: 73 65 72 74 28 20 73 74 72 6c 65 6e 28 7a 29 2b  sert( strlen(z)+
a8a0: 6b 2b 31 3c 3d 6e 20 29 3b 0a 20 20 20 20 20 20  k+1<=n );.      
a8b0: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
a8c0: 28 6e 2d 6b 2c 20 26 7a 53 74 6d 74 5b 6b 5d 2c  (n-k, &zStmt[k],
a8d0: 20 22 25 73 22 2c 20 7a 29 3b 0a 20 20 20 20 20   "%s", z);.     
a8e0: 20 6b 20 2b 3d 20 73 74 72 6c 65 6e 28 7a 29 3b   k += strlen(z);
a8f0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c  .    }.  }.  sql
a900: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 2d  ite3_snprintf(n-
a910: 6b 2c 20 26 7a 53 74 6d 74 5b 6b 5d 2c 20 22 25  k, &zStmt[k], "%
a920: 73 22 2c 20 7a 45 6e 64 29 3b 0a 20 20 72 65 74  s", zEnd);.  ret
a930: 75 72 6e 20 7a 53 74 6d 74 3b 0a 7d 0a 0a 2f 2a  urn zStmt;.}../*
a940: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
a950: 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 72 65   is called to re
a960: 70 6f 72 74 20 74 68 65 20 66 69 6e 61 6c 20 22  port the final "
a970: 29 22 20 74 68 61 74 20 74 65 72 6d 69 6e 61 74  )" that terminat
a980: 65 73 0a 2a 2a 20 61 20 43 52 45 41 54 45 20 54  es.** a CREATE T
a990: 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a  ABLE statement..
a9a0: 2a 2a 0a 2a 2a 20 54 68 65 20 74 61 62 6c 65 20  **.** The table 
a9b0: 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20 6f  structure that o
a9c0: 74 68 65 72 20 61 63 74 69 6f 6e 20 72 6f 75 74  ther action rout
a9d0: 69 6e 65 73 20 68 61 76 65 20 62 65 65 6e 20 62  ines have been b
a9e0: 75 69 6c 64 69 6e 67 0a 2a 2a 20 69 73 20 61 64  uilding.** is ad
a9f0: 64 65 64 20 74 6f 20 74 68 65 20 69 6e 74 65 72  ded to the inter
aa00: 6e 61 6c 20 68 61 73 68 20 74 61 62 6c 65 73 2c  nal hash tables,
aa10: 20 61 73 73 75 6d 69 6e 67 20 6e 6f 20 65 72 72   assuming no err
aa20: 6f 72 73 20 68 61 76 65 0a 2a 2a 20 6f 63 63 75  ors have.** occu
aa30: 72 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 65  rred..**.** An e
aa40: 6e 74 72 79 20 66 6f 72 20 74 68 65 20 74 61 62  ntry for the tab
aa50: 6c 65 20 69 73 20 6d 61 64 65 20 69 6e 20 74 68  le is made in th
aa60: 65 20 6d 61 73 74 65 72 20 74 61 62 6c 65 20 6f  e master table o
aa70: 6e 20 64 69 73 6b 2c 20 75 6e 6c 65 73 73 0a 2a  n disk, unless.*
aa80: 2a 20 74 68 69 73 20 69 73 20 61 20 74 65 6d 70  * this is a temp
aa90: 6f 72 61 72 79 20 74 61 62 6c 65 20 6f 72 20 64  orary table or d
aaa0: 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d 31 2e  b->init.busy==1.
aab0: 20 20 57 68 65 6e 20 64 62 2d 3e 69 6e 69 74 2e    When db->init.
aac0: 62 75 73 79 3d 3d 31 0a 2a 2a 20 69 74 20 6d 65  busy==1.** it me
aad0: 61 6e 73 20 77 65 20 61 72 65 20 72 65 61 64 69  ans we are readi
aae0: 6e 67 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61  ng the sqlite_ma
aaf0: 73 74 65 72 20 74 61 62 6c 65 20 62 65 63 61 75  ster table becau
ab00: 73 65 20 77 65 20 6a 75 73 74 0a 2a 2a 20 63 6f  se we just.** co
ab10: 6e 6e 65 63 74 65 64 20 74 6f 20 74 68 65 20 64  nnected to the d
ab20: 61 74 61 62 61 73 65 20 6f 72 20 62 65 63 61 75  atabase or becau
ab30: 73 65 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61  se the sqlite_ma
ab40: 73 74 65 72 20 74 61 62 6c 65 20 68 61 73 0a 2a  ster table has.*
ab50: 2a 20 72 65 63 65 6e 74 6c 79 20 63 68 61 6e 67  * recently chang
ab60: 65 64 2c 20 73 6f 20 74 68 65 20 65 6e 74 72 79  ed, so the entry
ab70: 20 66 6f 72 20 74 68 69 73 20 74 61 62 6c 65 20   for this table 
ab80: 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 20 69  already exists i
ab90: 6e 0a 2a 2a 20 74 68 65 20 73 71 6c 69 74 65 5f  n.** the sqlite_
aba0: 6d 61 73 74 65 72 20 74 61 62 6c 65 2e 20 20 57  master table.  W
abb0: 65 20 64 6f 20 6e 6f 74 20 77 61 6e 74 20 74 6f  e do not want to
abc0: 20 63 72 65 61 74 65 20 69 74 20 61 67 61 69 6e   create it again
abd0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70  ..**.** If the p
abe0: 53 65 6c 65 63 74 20 61 72 67 75 6d 65 6e 74 20  Select argument 
abf0: 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 69 74 20  is not NULL, it 
ac00: 6d 65 61 6e 73 20 74 68 61 74 20 74 68 69 73 20  means that this 
ac10: 72 6f 75 74 69 6e 65 0a 2a 2a 20 77 61 73 20 63  routine.** was c
ac20: 61 6c 6c 65 64 20 74 6f 20 63 72 65 61 74 65 20  alled to create 
ac30: 61 20 74 61 62 6c 65 20 67 65 6e 65 72 61 74 65  a table generate
ac40: 64 20 66 72 6f 6d 20 61 20 0a 2a 2a 20 22 43 52  d from a .** "CR
ac50: 45 41 54 45 20 54 41 42 4c 45 20 2e 2e 2e 20 41  EATE TABLE ... A
ac60: 53 20 53 45 4c 45 43 54 20 2e 2e 2e 22 20 73 74  S SELECT ..." st
ac70: 61 74 65 6d 65 6e 74 2e 20 20 54 68 65 20 63 6f  atement.  The co
ac80: 6c 75 6d 6e 20 6e 61 6d 65 73 20 6f 66 0a 2a 2a  lumn names of.**
ac90: 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20 77   the new table w
aca0: 69 6c 6c 20 6d 61 74 63 68 20 74 68 65 20 72 65  ill match the re
acb0: 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68 65 20  sult set of the 
acc0: 53 45 4c 45 43 54 2e 0a 2a 2f 0a 76 6f 69 64 20  SELECT..*/.void 
acd0: 73 71 6c 69 74 65 33 45 6e 64 54 61 62 6c 65 28  sqlite3EndTable(
ace0: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
acf0: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61  ,          /* Pa
ad00: 72 73 65 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  rse context */. 
ad10: 20 54 6f 6b 65 6e 20 2a 70 43 6f 6e 73 2c 20 20   Token *pCons,  
ad20: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
ad30: 27 2c 27 20 74 6f 6b 65 6e 20 61 66 74 65 72 20  ',' token after 
ad40: 74 68 65 20 6c 61 73 74 20 63 6f 6c 75 6d 6e 20  the last column 
ad50: 64 65 66 6e 2e 20 2a 2f 0a 20 20 54 6f 6b 65 6e  defn. */.  Token
ad60: 20 2a 70 45 6e 64 2c 20 20 20 20 20 20 20 20 20   *pEnd,         
ad70: 20 20 20 2f 2a 20 54 68 65 20 66 69 6e 61 6c 20     /* The final 
ad80: 27 29 27 20 74 6f 6b 65 6e 20 69 6e 20 74 68 65  ')' token in the
ad90: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 2a 2f   CREATE TABLE */
ada0: 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65  .  Select *pSele
adb0: 63 74 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65  ct         /* Se
adc0: 6c 65 63 74 20 66 72 6f 6d 20 61 20 22 43 52 45  lect from a "CRE
add0: 41 54 45 20 2e 2e 2e 20 41 53 20 53 45 4c 45 43  ATE ... AS SELEC
ade0: 54 22 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65  T" */.){.  Table
adf0: 20 2a 70 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a   *p;.  sqlite3 *
ae00: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
ae10: 0a 20 20 69 6e 74 20 69 44 62 3b 0a 0a 20 20 69  .  int iDb;..  i
ae20: 66 28 20 28 70 45 6e 64 3d 3d 30 20 26 26 20 70  f( (pEnd==0 && p
ae30: 53 65 6c 65 63 74 3d 3d 30 29 20 7c 7c 20 70 50  Select==0) || pP
ae40: 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 64 62  arse->nErr || db
ae50: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
ae60: 20 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20   {.    return;. 
ae70: 20 7d 0a 20 20 70 20 3d 20 70 50 61 72 73 65 2d   }.  p = pParse-
ae80: 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 69 66  >pNewTable;.  if
ae90: 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ( p==0 ) return;
aea0: 0a 0a 20 20 61 73 73 65 72 74 28 20 21 64 62 2d  ..  assert( !db-
aeb0: 3e 69 6e 69 74 2e 62 75 73 79 20 7c 7c 20 21 70  >init.busy || !p
aec0: 53 65 6c 65 63 74 20 29 3b 0a 0a 20 20 69 44 62  Select );..  iDb
aed0: 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61   = sqlite3Schema
aee0: 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 2d 3e 70  ToIndex(db, p->p
aef0: 53 63 68 65 6d 61 29 3b 0a 0a 23 69 66 6e 64 65  Schema);..#ifnde
af00: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 48  f SQLITE_OMIT_CH
af10: 45 43 4b 0a 20 20 2f 2a 20 52 65 73 6f 6c 76 65  ECK.  /* Resolve
af20: 20 6e 61 6d 65 73 20 69 6e 20 61 6c 6c 20 43 48   names in all CH
af30: 45 43 4b 20 63 6f 6e 73 74 72 61 69 6e 74 20 65  ECK constraint e
af40: 78 70 72 65 73 73 69 6f 6e 73 2e 0a 20 20 2a 2f  xpressions..  */
af50: 0a 20 20 69 66 28 20 70 2d 3e 70 43 68 65 63 6b  .  if( p->pCheck
af60: 20 29 7b 0a 20 20 20 20 53 72 63 4c 69 73 74 20   ){.    SrcList 
af70: 73 53 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  sSrc;           
af80: 20 20 20 20 20 20 20 20 2f 2a 20 46 61 6b 65 20          /* Fake 
af90: 53 72 63 4c 69 73 74 20 66 6f 72 20 70 50 61 72  SrcList for pPar
afa0: 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 2a 2f  se->pNewTable */
afb0: 0a 20 20 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74  .    NameContext
afc0: 20 73 4e 43 3b 20 20 20 20 20 20 20 20 20 20 20   sNC;           
afd0: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 63 6f 6e       /* Name con
afe0: 74 65 78 74 20 66 6f 72 20 70 50 61 72 73 65 2d  text for pParse-
aff0: 3e 70 4e 65 77 54 61 62 6c 65 20 2a 2f 0a 0a 20  >pNewTable */.. 
b000: 20 20 20 6d 65 6d 73 65 74 28 26 73 4e 43 2c 20     memset(&sNC, 
b010: 30 2c 20 73 69 7a 65 6f 66 28 73 4e 43 29 29 3b  0, sizeof(sNC));
b020: 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 73 53 72  .    memset(&sSr
b030: 63 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 53 72  c, 0, sizeof(sSr
b040: 63 29 29 3b 0a 20 20 20 20 73 53 72 63 2e 6e 53  c));.    sSrc.nS
b050: 72 63 20 3d 20 31 3b 0a 20 20 20 20 73 53 72 63  rc = 1;.    sSrc
b060: 2e 61 5b 30 5d 2e 7a 4e 61 6d 65 20 3d 20 70 2d  .a[0].zName = p-
b070: 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 73 53 72 63  >zName;.    sSrc
b080: 2e 61 5b 30 5d 2e 70 54 61 62 20 3d 20 70 3b 0a  .a[0].pTab = p;.
b090: 20 20 20 20 73 53 72 63 2e 61 5b 30 5d 2e 69 43      sSrc.a[0].iC
b0a0: 75 72 73 6f 72 20 3d 20 2d 31 3b 0a 20 20 20 20  ursor = -1;.    
b0b0: 73 4e 43 2e 70 50 61 72 73 65 20 3d 20 70 50 61  sNC.pParse = pPa
b0c0: 72 73 65 3b 0a 20 20 20 20 73 4e 43 2e 70 53 72  rse;.    sNC.pSr
b0d0: 63 4c 69 73 74 20 3d 20 26 73 53 72 63 3b 0a 20  cList = &sSrc;. 
b0e0: 20 20 20 73 4e 43 2e 69 73 43 68 65 63 6b 20 3d     sNC.isCheck =
b0f0: 20 31 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69   1;.    if( sqli
b100: 74 65 33 45 78 70 72 52 65 73 6f 6c 76 65 4e 61  te3ExprResolveNa
b110: 6d 65 73 28 26 73 4e 43 2c 20 70 2d 3e 70 43 68  mes(&sNC, p->pCh
b120: 65 63 6b 29 20 29 7b 0a 20 20 20 20 20 20 72 65  eck) ){.      re
b130: 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  turn;.    }.  }.
b140: 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e  #endif /* !defin
b150: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  ed(SQLITE_OMIT_C
b160: 48 45 43 4b 29 20 2a 2f 0a 0a 20 20 2f 2a 20 49  HECK) */..  /* I
b170: 66 20 74 68 65 20 64 62 2d 3e 69 6e 69 74 2e 62  f the db->init.b
b180: 75 73 79 20 69 73 20 31 20 69 74 20 6d 65 61 6e  usy is 1 it mean
b190: 73 20 77 65 20 61 72 65 20 72 65 61 64 69 6e 67  s we are reading
b1a0: 20 74 68 65 20 53 51 4c 20 6f 66 66 20 74 68 65   the SQL off the
b1b0: 0a 20 20 2a 2a 20 22 73 71 6c 69 74 65 5f 6d 61  .  ** "sqlite_ma
b1c0: 73 74 65 72 22 20 6f 72 20 22 73 71 6c 69 74 65  ster" or "sqlite
b1d0: 5f 74 65 6d 70 5f 6d 61 73 74 65 72 22 20 74 61  _temp_master" ta
b1e0: 62 6c 65 20 6f 6e 20 74 68 65 20 64 69 73 6b 2e  ble on the disk.
b1f0: 0a 20 20 2a 2a 20 53 6f 20 64 6f 20 6e 6f 74 20  .  ** So do not 
b200: 77 72 69 74 65 20 74 6f 20 74 68 65 20 64 69 73  write to the dis
b210: 6b 20 61 67 61 69 6e 2e 20 20 45 78 74 72 61 63  k again.  Extrac
b220: 74 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20  t the root page 
b230: 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 66 6f 72 20  number.  ** for 
b240: 74 68 65 20 74 61 62 6c 65 20 66 72 6f 6d 20 74  the table from t
b250: 68 65 20 64 62 2d 3e 69 6e 69 74 2e 6e 65 77 54  he db->init.newT
b260: 6e 75 6d 20 66 69 65 6c 64 2e 20 20 28 54 68 65  num field.  (The
b270: 20 70 61 67 65 20 6e 75 6d 62 65 72 0a 20 20 2a   page number.  *
b280: 2a 20 73 68 6f 75 6c 64 20 68 61 76 65 20 62 65  * should have be
b290: 65 6e 20 70 75 74 20 74 68 65 72 65 20 62 79 20  en put there by 
b2a0: 74 68 65 20 73 71 6c 69 74 65 4f 70 65 6e 43 62  the sqliteOpenCb
b2b0: 20 72 6f 75 74 69 6e 65 2e 29 0a 20 20 2a 2f 0a   routine.).  */.
b2c0: 20 20 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62    if( db->init.b
b2d0: 75 73 79 20 29 7b 0a 20 20 20 20 70 2d 3e 74 6e  usy ){.    p->tn
b2e0: 75 6d 20 3d 20 64 62 2d 3e 69 6e 69 74 2e 6e 65  um = db->init.ne
b2f0: 77 54 6e 75 6d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  wTnum;.  }..  /*
b300: 20 49 66 20 6e 6f 74 20 69 6e 69 74 69 61 6c 69   If not initiali
b310: 7a 69 6e 67 2c 20 74 68 65 6e 20 63 72 65 61 74  zing, then creat
b320: 65 20 61 20 72 65 63 6f 72 64 20 66 6f 72 20 74  e a record for t
b330: 68 65 20 6e 65 77 20 74 61 62 6c 65 0a 20 20 2a  he new table.  *
b340: 2a 20 69 6e 20 74 68 65 20 53 51 4c 49 54 45 5f  * in the SQLITE_
b350: 4d 41 53 54 45 52 20 74 61 62 6c 65 20 6f 66 20  MASTER table of 
b360: 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 54  the database.  T
b370: 68 65 20 72 65 63 6f 72 64 20 6e 75 6d 62 65 72  he record number
b380: 0a 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 6e 65  .  ** for the ne
b390: 77 20 74 61 62 6c 65 20 65 6e 74 72 79 20 73 68  w table entry sh
b3a0: 6f 75 6c 64 20 61 6c 72 65 61 64 79 20 62 65 20  ould already be 
b3b0: 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e 0a 20 20  on the stack..  
b3c0: 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68 69 73 20  **.  ** If this 
b3d0: 69 73 20 61 20 54 45 4d 50 4f 52 41 52 59 20 74  is a TEMPORARY t
b3e0: 61 62 6c 65 2c 20 77 72 69 74 65 20 74 68 65 20  able, write the 
b3f0: 65 6e 74 72 79 20 69 6e 74 6f 20 74 68 65 20 61  entry into the a
b400: 75 78 69 6c 69 61 72 79 0a 20 20 2a 2a 20 66 69  uxiliary.  ** fi
b410: 6c 65 20 69 6e 73 74 65 61 64 20 6f 66 20 69 6e  le instead of in
b420: 74 6f 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61  to the main data
b430: 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a  base file..  */.
b440: 20 20 69 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e    if( !db->init.
b450: 62 75 73 79 20 29 7b 0a 20 20 20 20 69 6e 74 20  busy ){.    int 
b460: 6e 3b 0a 20 20 20 20 56 64 62 65 20 2a 76 3b 0a  n;.    Vdbe *v;.
b470: 20 20 20 20 63 68 61 72 20 2a 7a 54 79 70 65 3b      char *zType;
b480: 20 20 20 20 2f 2a 20 22 76 69 65 77 22 20 6f 72      /* "view" or
b490: 20 22 74 61 62 6c 65 22 20 2a 2f 0a 20 20 20 20   "table" */.    
b4a0: 63 68 61 72 20 2a 7a 54 79 70 65 32 3b 20 20 20  char *zType2;   
b4b0: 2f 2a 20 22 56 49 45 57 22 20 6f 72 20 22 54 41  /* "VIEW" or "TA
b4c0: 42 4c 45 22 20 2a 2f 0a 20 20 20 20 63 68 61 72  BLE" */.    char
b4d0: 20 2a 7a 53 74 6d 74 3b 20 20 20 20 2f 2a 20 54   *zStmt;    /* T
b4e0: 65 78 74 20 6f 66 20 74 68 65 20 43 52 45 41 54  ext of the CREAT
b4f0: 45 20 54 41 42 4c 45 20 6f 72 20 43 52 45 41 54  E TABLE or CREAT
b500: 45 20 56 49 45 57 20 73 74 61 74 65 6d 65 6e 74  E VIEW statement
b510: 20 2a 2f 0a 0a 20 20 20 20 76 20 3d 20 73 71 6c   */..    v = sql
b520: 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
b530: 73 65 29 3b 0a 20 20 20 20 69 66 28 20 76 3d 3d  se);.    if( v==
b540: 30 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 20  0 ) return;..   
b550: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
b560: 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20  p1(v, OP_Close, 
b570: 30 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61  0);..    /* Crea
b580: 74 65 20 74 68 65 20 72 6f 6f 74 70 61 67 65 20  te the rootpage 
b590: 66 6f 72 20 74 68 65 20 6e 65 77 20 74 61 62 6c  for the new tabl
b5a0: 65 20 61 6e 64 20 70 75 73 68 20 69 74 20 6f 6e  e and push it on
b5b0: 74 6f 20 74 68 65 20 73 74 61 63 6b 2e 0a 20 20  to the stack..  
b5c0: 20 20 2a 2a 20 41 20 76 69 65 77 20 68 61 73 20    ** A view has 
b5d0: 6e 6f 20 72 6f 6f 74 70 61 67 65 2c 20 73 6f 20  no rootpage, so 
b5e0: 6a 75 73 74 20 70 75 73 68 20 61 20 7a 65 72 6f  just push a zero
b5f0: 20 6f 6e 74 6f 20 74 68 65 20 73 74 61 63 6b 20   onto the stack 
b600: 66 6f 72 0a 20 20 20 20 2a 2a 20 76 69 65 77 73  for.    ** views
b610: 2e 20 20 49 6e 69 74 69 61 6c 69 7a 65 20 7a 54  .  Initialize zT
b620: 79 70 65 20 61 74 20 74 68 65 20 73 61 6d 65 20  ype at the same 
b630: 74 69 6d 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  time..    */.   
b640: 20 69 66 28 20 70 2d 3e 70 53 65 6c 65 63 74 3d   if( p->pSelect=
b650: 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41  =0 ){.      /* A
b660: 20 72 65 67 75 6c 61 72 20 74 61 62 6c 65 20 2a   regular table *
b670: 2f 0a 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20  /.      zType = 
b680: 22 74 61 62 6c 65 22 3b 0a 20 20 20 20 20 20 7a  "table";.      z
b690: 54 79 70 65 32 20 3d 20 22 54 41 42 4c 45 22 3b  Type2 = "TABLE";
b6a0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
b6b0: 4f 4d 49 54 5f 56 49 45 57 0a 20 20 20 20 7d 65  OMIT_VIEW.    }e
b6c0: 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 41 20  lse{.      /* A 
b6d0: 76 69 65 77 20 2a 2f 0a 20 20 20 20 20 20 7a 54  view */.      zT
b6e0: 79 70 65 20 3d 20 22 76 69 65 77 22 3b 0a 20 20  ype = "view";.  
b6f0: 20 20 20 20 7a 54 79 70 65 32 20 3d 20 22 56 49      zType2 = "VI
b700: 45 57 22 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  EW";.#endif.    
b710: 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69  }..    /* If thi
b720: 73 20 69 73 20 61 20 43 52 45 41 54 45 20 54 41  s is a CREATE TA
b730: 42 4c 45 20 78 78 20 41 53 20 53 45 4c 45 43 54  BLE xx AS SELECT
b740: 20 2e 2e 2e 2c 20 65 78 65 63 75 74 65 20 74 68   ..., execute th
b750: 65 20 53 45 4c 45 43 54 0a 20 20 20 20 2a 2a 20  e SELECT.    ** 
b760: 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 70 6f 70  statement to pop
b770: 75 6c 61 74 65 20 74 68 65 20 6e 65 77 20 74 61  ulate the new ta
b780: 62 6c 65 2e 20 54 68 65 20 72 6f 6f 74 2d 70 61  ble. The root-pa
b790: 67 65 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68  ge number for th
b7a0: 65 0a 20 20 20 20 2a 2a 20 6e 65 77 20 74 61 62  e.    ** new tab
b7b0: 6c 65 20 69 73 20 6f 6e 20 74 68 65 20 74 6f 70  le is on the top
b7c0: 20 6f 66 20 74 68 65 20 76 64 62 65 20 73 74 61   of the vdbe sta
b7d0: 63 6b 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ck..    **.    *
b7e0: 2a 20 4f 6e 63 65 20 74 68 65 20 53 45 4c 45 43  * Once the SELEC
b7f0: 54 20 68 61 73 20 62 65 65 6e 20 63 6f 64 65 64  T has been coded
b800: 20 62 79 20 73 71 6c 69 74 65 33 53 65 6c 65 63   by sqlite3Selec
b810: 74 28 29 2c 20 69 74 20 69 73 20 69 6e 20 61 0a  t(), it is in a.
b820: 20 20 20 20 2a 2a 20 73 75 69 74 61 62 6c 65 20      ** suitable 
b830: 73 74 61 74 65 20 74 6f 20 71 75 65 72 79 20 66  state to query f
b840: 6f 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61  or the column na
b850: 6d 65 73 20 61 6e 64 20 74 79 70 65 73 20 74 6f  mes and types to
b860: 20 62 65 20 75 73 65 64 0a 20 20 20 20 2a 2a 20   be used.    ** 
b870: 62 79 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65  by the new table
b880: 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
b890: 41 20 73 68 61 72 65 64 2d 63 61 63 68 65 20 77  A shared-cache w
b8a0: 72 69 74 65 2d 6c 6f 63 6b 20 69 73 20 6e 6f 74  rite-lock is not
b8b0: 20 72 65 71 75 69 72 65 64 20 74 6f 20 77 72 69   required to wri
b8c0: 74 65 20 74 6f 20 74 68 65 20 6e 65 77 20 74 61  te to the new ta
b8d0: 62 6c 65 2c 0a 20 20 20 20 2a 2a 20 61 73 20 61  ble,.    ** as a
b8e0: 20 73 63 68 65 6d 61 2d 6c 6f 63 6b 20 6d 75 73   schema-lock mus
b8f0: 74 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62  t have already b
b900: 65 65 6e 20 6f 62 74 61 69 6e 65 64 20 74 6f 20  een obtained to 
b910: 63 72 65 61 74 65 20 69 74 2e 20 53 69 6e 63 65  create it. Since
b920: 0a 20 20 20 20 2a 2a 20 61 20 73 63 68 65 6d 61  .    ** a schema
b930: 2d 6c 6f 63 6b 20 65 78 63 6c 75 64 65 73 20 61  -lock excludes a
b940: 6c 6c 20 6f 74 68 65 72 20 64 61 74 61 62 61 73  ll other databas
b950: 65 20 75 73 65 72 73 2c 20 74 68 65 20 77 72 69  e users, the wri
b960: 74 65 2d 6c 6f 63 6b 20 77 6f 75 6c 64 0a 20 20  te-lock would.  
b970: 20 20 2a 2a 20 62 65 20 72 65 64 75 6e 64 61 6e    ** be redundan
b980: 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  t..    */.    if
b990: 28 20 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20  ( pSelect ){.   
b9a0: 20 20 20 53 65 6c 65 63 74 44 65 73 74 20 64 65     SelectDest de
b9b0: 73 74 3b 0a 20 20 20 20 20 20 54 61 62 6c 65 20  st;.      Table 
b9c0: 2a 70 53 65 6c 54 61 62 3b 0a 0a 20 20 20 20 20  *pSelTab;..     
b9d0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
b9e0: 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 57 72 69  p3(v, OP_OpenWri
b9f0: 74 65 2c 20 31 2c 20 70 50 61 72 73 65 2d 3e 72  te, 1, pParse->r
ba00: 65 67 52 6f 6f 74 2c 20 69 44 62 29 3b 0a 20 20  egRoot, iDb);.  
ba10: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
ba20: 68 61 6e 67 65 50 35 28 76 2c 20 31 29 3b 0a 20  hangeP5(v, 1);. 
ba30: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 54 61       pParse->nTa
ba40: 62 20 3d 20 32 3b 0a 20 20 20 20 20 20 73 71 6c  b = 2;.      sql
ba50: 69 74 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e  ite3SelectDestIn
ba60: 69 74 28 26 64 65 73 74 2c 20 53 52 54 5f 54 61  it(&dest, SRT_Ta
ba70: 62 6c 65 2c 20 31 29 3b 0a 20 20 20 20 20 20 73  ble, 1);.      s
ba80: 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61  qlite3Select(pPa
ba90: 72 73 65 2c 20 70 53 65 6c 65 63 74 2c 20 26 64  rse, pSelect, &d
baa0: 65 73 74 2c 20 30 2c 20 30 2c 20 30 2c 20 30 29  est, 0, 0, 0, 0)
bab0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
bac0: 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
bad0: 43 6c 6f 73 65 2c 20 31 29 3b 0a 20 20 20 20 20  Close, 1);.     
bae0: 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72   if( pParse->nEr
baf0: 72 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  r==0 ){.        
bb00: 70 53 65 6c 54 61 62 20 3d 20 73 71 6c 69 74 65  pSelTab = sqlite
bb10: 33 52 65 73 75 6c 74 53 65 74 4f 66 53 65 6c 65  3ResultSetOfSele
bb20: 63 74 28 70 50 61 72 73 65 2c 20 30 2c 20 70 53  ct(pParse, 0, pS
bb30: 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 20 20  elect);.        
bb40: 69 66 28 20 70 53 65 6c 54 61 62 3d 3d 30 20 29  if( pSelTab==0 )
bb50: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 20   return;.       
bb60: 20 61 73 73 65 72 74 28 20 70 2d 3e 61 43 6f 6c   assert( p->aCol
bb70: 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 70  ==0 );.        p
bb80: 2d 3e 6e 43 6f 6c 20 3d 20 70 53 65 6c 54 61 62  ->nCol = pSelTab
bb90: 2d 3e 6e 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20  ->nCol;.        
bba0: 70 2d 3e 61 43 6f 6c 20 3d 20 70 53 65 6c 54 61  p->aCol = pSelTa
bbb0: 62 2d 3e 61 43 6f 6c 3b 0a 20 20 20 20 20 20 20  b->aCol;.       
bbc0: 20 70 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c 20 3d   pSelTab->nCol =
bbd0: 20 30 3b 0a 20 20 20 20 20 20 20 20 70 53 65 6c   0;.        pSel
bbe0: 54 61 62 2d 3e 61 43 6f 6c 20 3d 20 30 3b 0a 20  Tab->aCol = 0;. 
bbf0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65         sqlite3De
bc00: 6c 65 74 65 54 61 62 6c 65 28 70 53 65 6c 54 61  leteTable(pSelTa
bc10: 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  b);.      }.    
bc20: 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d 70 75 74  }..    /* Comput
bc30: 65 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 74  e the complete t
bc40: 65 78 74 20 6f 66 20 74 68 65 20 43 52 45 41 54  ext of the CREAT
bc50: 45 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20  E statement */. 
bc60: 20 20 20 69 66 28 20 70 53 65 6c 65 63 74 20 29     if( pSelect )
bc70: 7b 0a 20 20 20 20 20 20 7a 53 74 6d 74 20 3d 20  {.      zStmt = 
bc80: 63 72 65 61 74 65 54 61 62 6c 65 53 74 6d 74 28  createTableStmt(
bc90: 70 2c 20 70 2d 3e 70 53 63 68 65 6d 61 3d 3d 64  p, p->pSchema==d
bca0: 62 2d 3e 61 44 62 5b 31 5d 2e 70 53 63 68 65 6d  b->aDb[1].pSchem
bcb0: 61 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  a);.    }else{. 
bcc0: 20 20 20 20 20 6e 20 3d 20 70 45 6e 64 2d 3e 7a       n = pEnd->z
bcd0: 20 2d 20 70 50 61 72 73 65 2d 3e 73 4e 61 6d 65   - pParse->sName
bce0: 54 6f 6b 65 6e 2e 7a 20 2b 20 31 3b 0a 20 20 20  Token.z + 1;.   
bcf0: 20 20 20 7a 53 74 6d 74 20 3d 20 73 71 6c 69 74     zStmt = sqlit
bd00: 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 0a 20  e3MPrintf(db, . 
bd10: 20 20 20 20 20 20 20 20 20 22 43 52 45 41 54 45           "CREATE
bd20: 20 25 73 20 25 2e 2a 73 22 2c 20 7a 54 79 70 65   %s %.*s", zType
bd30: 32 2c 20 6e 2c 20 70 50 61 72 73 65 2d 3e 73 4e  2, n, pParse->sN
bd40: 61 6d 65 54 6f 6b 65 6e 2e 7a 0a 20 20 20 20 20  ameToken.z.     
bd50: 20 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f   );.    }..    /
bd60: 2a 20 41 20 73 6c 6f 74 20 66 6f 72 20 74 68 65  * A slot for the
bd70: 20 72 65 63 6f 72 64 20 68 61 73 20 61 6c 72 65   record has alre
bd80: 61 64 79 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74  ady been allocat
bd90: 65 64 20 69 6e 20 74 68 65 20 0a 20 20 20 20 2a  ed in the .    *
bda0: 2a 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52 20  * SQLITE_MASTER 
bdb0: 74 61 62 6c 65 2e 20 20 57 65 20 6a 75 73 74 20  table.  We just 
bdc0: 6e 65 65 64 20 74 6f 20 75 70 64 61 74 65 20 74  need to update t
bdd0: 68 61 74 20 73 6c 6f 74 20 77 69 74 68 20 61 6c  hat slot with al
bde0: 6c 0a 20 20 20 20 2a 2a 20 74 68 65 20 69 6e 66  l.    ** the inf
bdf0: 6f 72 6d 61 74 69 6f 6e 20 77 65 27 76 65 20 63  ormation we've c
be00: 6f 6c 6c 65 63 74 65 64 2e 20 20 54 68 65 20 72  ollected.  The r
be10: 6f 77 69 64 20 66 6f 72 20 74 68 65 20 70 72 65  owid for the pre
be20: 61 6c 6c 6f 63 61 74 65 64 0a 20 20 20 20 2a 2a  allocated.    **
be30: 20 73 6c 6f 74 20 69 73 20 74 68 65 20 32 6e 64   slot is the 2nd
be40: 20 69 74 65 6d 20 6f 6e 20 74 68 65 20 73 74 61   item on the sta
be50: 63 6b 2e 20 20 54 68 65 20 74 6f 70 20 6f 66 20  ck.  The top of 
be60: 74 68 65 20 73 74 61 63 6b 20 69 73 20 74 68 65  the stack is the
be70: 0a 20 20 20 20 2a 2a 20 72 6f 6f 74 20 70 61 67  .    ** root pag
be80: 65 20 66 6f 72 20 74 68 65 20 6e 65 77 20 74 61  e for the new ta
be90: 62 6c 65 20 28 6f 72 20 61 20 30 20 69 66 20 74  ble (or a 0 if t
bea0: 68 69 73 20 69 73 20 61 20 76 69 65 77 29 2e 0a  his is a view)..
beb0: 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74      */.    sqlit
bec0: 65 33 4e 65 73 74 65 64 50 61 72 73 65 28 70 50  e3NestedParse(pP
bed0: 61 72 73 65 2c 0a 20 20 20 20 20 20 22 55 50 44  arse,.      "UPD
bee0: 41 54 45 20 25 51 2e 25 73 20 22 0a 20 20 20 20  ATE %Q.%s ".    
bef0: 20 20 20 20 20 22 53 45 54 20 74 79 70 65 3d 27       "SET type='
bf00: 25 73 27 2c 20 6e 61 6d 65 3d 25 51 2c 20 74 62  %s', name=%Q, tb
bf10: 6c 5f 6e 61 6d 65 3d 25 51 2c 20 72 6f 6f 74 70  l_name=%Q, rootp
bf20: 61 67 65 3d 23 25 64 2c 20 73 71 6c 3d 25 51 20  age=#%d, sql=%Q 
bf30: 22 0a 20 20 20 20 20 20 20 22 57 48 45 52 45 20  ".       "WHERE 
bf40: 72 6f 77 69 64 3d 23 25 64 22 2c 0a 20 20 20 20  rowid=#%d",.    
bf50: 20 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a    db->aDb[iDb].z
bf60: 4e 61 6d 65 2c 20 53 43 48 45 4d 41 5f 54 41 42  Name, SCHEMA_TAB
bf70: 4c 45 28 69 44 62 29 2c 0a 20 20 20 20 20 20 7a  LE(iDb),.      z
bf80: 54 79 70 65 2c 0a 20 20 20 20 20 20 70 2d 3e 7a  Type,.      p->z
bf90: 4e 61 6d 65 2c 0a 20 20 20 20 20 20 70 2d 3e 7a  Name,.      p->z
bfa0: 4e 61 6d 65 2c 0a 20 20 20 20 20 20 70 50 61 72  Name,.      pPar
bfb0: 73 65 2d 3e 72 65 67 52 6f 6f 74 2c 0a 20 20 20  se->regRoot,.   
bfc0: 20 20 20 7a 53 74 6d 74 2c 0a 20 20 20 20 20 20     zStmt,.      
bfd0: 70 50 61 72 73 65 2d 3e 72 65 67 52 6f 77 69 64  pParse->regRowid
bfe0: 0a 20 20 20 20 29 3b 0a 20 20 20 20 73 71 6c 69  .    );.    sqli
bff0: 74 65 33 5f 66 72 65 65 28 7a 53 74 6d 74 29 3b  te3_free(zStmt);
c000: 0a 20 20 20 20 73 71 6c 69 74 65 33 43 68 61 6e  .    sqlite3Chan
c010: 67 65 43 6f 6f 6b 69 65 28 64 62 2c 20 76 2c 20  geCookie(db, v, 
c020: 69 44 62 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53  iDb);..#ifndef S
c030: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49  QLITE_OMIT_AUTOI
c040: 4e 43 52 45 4d 45 4e 54 0a 20 20 20 20 2f 2a 20  NCREMENT.    /* 
c050: 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  Check to see if 
c060: 77 65 20 6e 65 65 64 20 74 6f 20 63 72 65 61 74  we need to creat
c070: 65 20 61 6e 20 73 71 6c 69 74 65 5f 73 65 71 75  e an sqlite_sequ
c080: 65 6e 63 65 20 74 61 62 6c 65 20 66 6f 72 0a 20  ence table for. 
c090: 20 20 20 2a 2a 20 6b 65 65 70 69 6e 67 20 74 72     ** keeping tr
c0a0: 61 63 6b 20 6f 66 20 61 75 74 6f 69 6e 63 72 65  ack of autoincre
c0b0: 6d 65 6e 74 20 6b 65 79 73 2e 0a 20 20 20 20 2a  ment keys..    *
c0c0: 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 61 75 74  /.    if( p->aut
c0d0: 6f 49 6e 63 20 29 7b 0a 20 20 20 20 20 20 44 62  oInc ){.      Db
c0e0: 20 2a 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62   *pDb = &db->aDb
c0f0: 5b 69 44 62 5d 3b 0a 20 20 20 20 20 20 69 66 28  [iDb];.      if(
c100: 20 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 70   pDb->pSchema->p
c110: 53 65 71 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20  SeqTab==0 ){.   
c120: 20 20 20 20 20 73 71 6c 69 74 65 33 4e 65 73 74       sqlite3Nest
c130: 65 64 50 61 72 73 65 28 70 50 61 72 73 65 2c 0a  edParse(pParse,.
c140: 20 20 20 20 20 20 20 20 20 20 22 43 52 45 41 54            "CREAT
c150: 45 20 54 41 42 4c 45 20 25 51 2e 73 71 6c 69 74  E TABLE %Q.sqlit
c160: 65 5f 73 65 71 75 65 6e 63 65 28 6e 61 6d 65 2c  e_sequence(name,
c170: 73 65 71 29 22 2c 0a 20 20 20 20 20 20 20 20 20  seq)",.         
c180: 20 70 44 62 2d 3e 7a 4e 61 6d 65 0a 20 20 20 20   pDb->zName.    
c190: 20 20 20 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20      );.      }. 
c1a0: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20     }.#endif..   
c1b0: 20 2f 2a 20 52 65 70 61 72 73 65 20 65 76 65 72   /* Reparse ever
c1c0: 79 74 68 69 6e 67 20 74 6f 20 75 70 64 61 74 65  ything to update
c1d0: 20 6f 75 72 20 69 6e 74 65 72 6e 61 6c 20 64 61   our internal da
c1e0: 74 61 20 73 74 72 75 63 74 75 72 65 73 20 2a 2f  ta structures */
c1f0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
c200: 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 50 61 72  AddOp4(v, OP_Par
c210: 73 65 53 63 68 65 6d 61 2c 20 69 44 62 2c 20 30  seSchema, iDb, 0
c220: 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 73 71 6c  , 0,.        sql
c230: 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20  ite3MPrintf(db, 
c240: 22 74 62 6c 5f 6e 61 6d 65 3d 27 25 71 27 22 2c  "tbl_name='%q'",
c250: 70 2d 3e 7a 4e 61 6d 65 29 2c 20 50 34 5f 44 59  p->zName), P4_DY
c260: 4e 41 4d 49 43 29 3b 0a 20 20 7d 0a 0a 0a 20 20  NAMIC);.  }...  
c270: 2f 2a 20 41 64 64 20 74 68 65 20 74 61 62 6c 65  /* Add the table
c280: 20 74 6f 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72   to the in-memor
c290: 79 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e  y representation
c2a0: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
c2b0: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d  ..  */.  if( db-
c2c0: 3e 69 6e 69 74 2e 62 75 73 79 20 26 26 20 70 50  >init.busy && pP
c2d0: 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 29 7b  arse->nErr==0 ){
c2e0: 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 4f 6c 64  .    Table *pOld
c2f0: 3b 0a 20 20 20 20 46 4b 65 79 20 2a 70 46 4b 65  ;.    FKey *pFKe
c300: 79 3b 20 0a 20 20 20 20 53 63 68 65 6d 61 20 2a  y; .    Schema *
c310: 70 53 63 68 65 6d 61 20 3d 20 70 2d 3e 70 53 63  pSchema = p->pSc
c320: 68 65 6d 61 3b 0a 20 20 20 20 70 4f 6c 64 20 3d  hema;.    pOld =
c330: 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65   sqlite3HashInse
c340: 72 74 28 26 70 53 63 68 65 6d 61 2d 3e 74 62 6c  rt(&pSchema->tbl
c350: 48 61 73 68 2c 20 70 2d 3e 7a 4e 61 6d 65 2c 20  Hash, p->zName, 
c360: 73 74 72 6c 65 6e 28 70 2d 3e 7a 4e 61 6d 65 29  strlen(p->zName)
c370: 2b 31 2c 70 29 3b 0a 20 20 20 20 69 66 28 20 70  +1,p);.    if( p
c380: 4f 6c 64 20 29 7b 0a 20 20 20 20 20 20 61 73 73  Old ){.      ass
c390: 65 72 74 28 20 70 3d 3d 70 4f 6c 64 20 29 3b 20  ert( p==pOld ); 
c3a0: 20 2f 2a 20 4d 61 6c 6c 6f 63 20 6d 75 73 74 20   /* Malloc must 
c3b0: 68 61 76 65 20 66 61 69 6c 65 64 20 69 6e 73 69  have failed insi
c3c0: 64 65 20 48 61 73 68 49 6e 73 65 72 74 28 29 20  de HashInsert() 
c3d0: 2a 2f 0a 20 20 20 20 20 20 64 62 2d 3e 6d 61 6c  */.      db->mal
c3e0: 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20  locFailed = 1;. 
c3f0: 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20       return;.   
c400: 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
c410: 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b  E_OMIT_FOREIGN_K
c420: 45 59 0a 20 20 20 20 66 6f 72 28 70 46 4b 65 79  EY.    for(pFKey
c430: 3d 70 2d 3e 70 46 4b 65 79 3b 20 70 46 4b 65 79  =p->pFKey; pFKey
c440: 3b 20 70 46 4b 65 79 3d 70 46 4b 65 79 2d 3e 70  ; pFKey=pFKey->p
c450: 4e 65 78 74 46 72 6f 6d 29 7b 0a 20 20 20 20 20  NextFrom){.     
c460: 20 76 6f 69 64 20 2a 64 61 74 61 3b 0a 20 20 20   void *data;.   
c470: 20 20 20 69 6e 74 20 6e 54 6f 20 3d 20 73 74 72     int nTo = str
c480: 6c 65 6e 28 70 46 4b 65 79 2d 3e 7a 54 6f 29 20  len(pFKey->zTo) 
c490: 2b 20 31 3b 0a 20 20 20 20 20 20 70 46 4b 65 79  + 1;.      pFKey
c4a0: 2d 3e 70 4e 65 78 74 54 6f 20 3d 20 73 71 6c 69  ->pNextTo = sqli
c4b0: 74 65 33 48 61 73 68 46 69 6e 64 28 26 70 53 63  te3HashFind(&pSc
c4c0: 68 65 6d 61 2d 3e 61 46 4b 65 79 2c 20 70 46 4b  hema->aFKey, pFK
c4d0: 65 79 2d 3e 7a 54 6f 2c 20 6e 54 6f 29 3b 0a 20  ey->zTo, nTo);. 
c4e0: 20 20 20 20 20 64 61 74 61 20 3d 20 73 71 6c 69       data = sqli
c4f0: 74 65 33 48 61 73 68 49 6e 73 65 72 74 28 26 70  te3HashInsert(&p
c500: 53 63 68 65 6d 61 2d 3e 61 46 4b 65 79 2c 20 70  Schema->aFKey, p
c510: 46 4b 65 79 2d 3e 7a 54 6f 2c 20 6e 54 6f 2c 20  FKey->zTo, nTo, 
c520: 70 46 4b 65 79 29 3b 0a 20 20 20 20 20 20 69 66  pFKey);.      if
c530: 28 20 64 61 74 61 3d 3d 28 76 6f 69 64 20 2a 29  ( data==(void *)
c540: 70 46 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 20  pFKey ){.       
c550: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
c560: 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  d = 1;.      }. 
c570: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
c580: 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
c590: 65 20 3d 20 30 3b 0a 20 20 20 20 64 62 2d 3e 6e  e = 0;.    db->n
c5a0: 54 61 62 6c 65 2b 2b 3b 0a 20 20 20 20 64 62 2d  Table++;.    db-
c5b0: 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45  >flags |= SQLITE
c5c0: 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a  _InternChanges;.
c5d0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
c5e0: 4f 4d 49 54 5f 41 4c 54 45 52 54 41 42 4c 45 0a  OMIT_ALTERTABLE.
c5f0: 20 20 20 20 69 66 28 20 21 70 2d 3e 70 53 65 6c      if( !p->pSel
c600: 65 63 74 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e  ect ){.      con
c610: 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d  st char *zName =
c620: 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 70   (const char *)p
c630: 50 61 72 73 65 2d 3e 73 4e 61 6d 65 54 6f 6b 65  Parse->sNameToke
c640: 6e 2e 7a 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e  n.z;.      int n
c650: 4e 61 6d 65 3b 0a 20 20 20 20 20 20 61 73 73 65  Name;.      asse
c660: 72 74 28 20 21 70 53 65 6c 65 63 74 20 26 26 20  rt( !pSelect && 
c670: 70 43 6f 6e 73 20 26 26 20 70 45 6e 64 20 29 3b  pCons && pEnd );
c680: 0a 20 20 20 20 20 20 69 66 28 20 70 43 6f 6e 73  .      if( pCons
c690: 2d 3e 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ->z==0 ){.      
c6a0: 20 20 70 43 6f 6e 73 20 3d 20 70 45 6e 64 3b 0a    pCons = pEnd;.
c6b0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6e 4e        }.      nN
c6c0: 61 6d 65 20 3d 20 28 63 6f 6e 73 74 20 63 68 61  ame = (const cha
c6d0: 72 20 2a 29 70 43 6f 6e 73 2d 3e 7a 20 2d 20 7a  r *)pCons->z - z
c6e0: 4e 61 6d 65 3b 0a 20 20 20 20 20 20 70 2d 3e 61  Name;.      p->a
c6f0: 64 64 43 6f 6c 4f 66 66 73 65 74 20 3d 20 31 33  ddColOffset = 13
c700: 20 2b 20 73 71 6c 69 74 65 33 55 74 66 38 43 68   + sqlite3Utf8Ch
c710: 61 72 4c 65 6e 28 7a 4e 61 6d 65 2c 20 6e 4e 61  arLen(zName, nNa
c720: 6d 65 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  me);.    }.#endi
c730: 66 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66  f.  }.}..#ifndef
c740: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45   SQLITE_OMIT_VIE
c750: 57 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 61 72 73  W./*.** The pars
c760: 65 72 20 63 61 6c 6c 73 20 74 68 69 73 20 72 6f  er calls this ro
c770: 75 74 69 6e 65 20 69 6e 20 6f 72 64 65 72 20 74  utine in order t
c780: 6f 20 63 72 65 61 74 65 20 61 20 6e 65 77 20 56  o create a new V
c790: 49 45 57 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  IEW.*/.void sqli
c7a0: 74 65 33 43 72 65 61 74 65 56 69 65 77 28 0a 20  te3CreateView(. 
c7b0: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
c7c0: 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69      /* The parsi
c7d0: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
c7e0: 54 6f 6b 65 6e 20 2a 70 42 65 67 69 6e 2c 20 20  Token *pBegin,  
c7f0: 20 20 20 2f 2a 20 54 68 65 20 43 52 45 41 54 45     /* The CREATE
c800: 20 74 6f 6b 65 6e 20 74 68 61 74 20 62 65 67 69   token that begi
c810: 6e 73 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  ns the statement
c820: 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61   */.  Token *pNa
c830: 6d 65 31 2c 20 20 20 20 20 2f 2a 20 54 68 65 20  me1,     /* The 
c840: 74 6f 6b 65 6e 20 74 68 61 74 20 68 6f 6c 64 73  token that holds
c850: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
c860: 20 76 69 65 77 20 2a 2f 0a 20 20 54 6f 6b 65 6e   view */.  Token
c870: 20 2a 70 4e 61 6d 65 32 2c 20 20 20 20 20 2f 2a   *pName2,     /*
c880: 20 54 68 65 20 74 6f 6b 65 6e 20 74 68 61 74 20   The token that 
c890: 68 6f 6c 64 73 20 74 68 65 20 6e 61 6d 65 20 6f  holds the name o
c8a0: 66 20 74 68 65 20 76 69 65 77 20 2a 2f 0a 20 20  f the view */.  
c8b0: 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 2c  Select *pSelect,
c8c0: 20 20 20 2f 2a 20 41 20 53 45 4c 45 43 54 20 73     /* A SELECT s
c8d0: 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20 77 69  tatement that wi
c8e0: 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65 20 6e 65  ll become the ne
c8f0: 77 20 76 69 65 77 20 2a 2f 0a 20 20 69 6e 74 20  w view */.  int 
c900: 69 73 54 65 6d 70 2c 20 20 20 20 20 20 20 20 2f  isTemp,        /
c910: 2a 20 54 52 55 45 20 66 6f 72 20 61 20 54 45 4d  * TRUE for a TEM
c920: 50 4f 52 41 52 59 20 76 69 65 77 20 2a 2f 0a 20  PORARY view */. 
c930: 20 69 6e 74 20 6e 6f 45 72 72 20 20 20 20 20 20   int noErr      
c940: 20 20 20 20 2f 2a 20 53 75 70 70 72 65 73 73 20      /* Suppress 
c950: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73 20 69  error messages i
c960: 66 20 56 49 45 57 20 61 6c 72 65 61 64 79 20 65  f VIEW already e
c970: 78 69 73 74 73 20 2a 2f 0a 29 7b 0a 20 20 54 61  xists */.){.  Ta
c980: 62 6c 65 20 2a 70 3b 0a 20 20 69 6e 74 20 6e 3b  ble *p;.  int n;
c990: 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  .  const unsigne
c9a0: 64 20 63 68 61 72 20 2a 7a 3b 0a 20 20 54 6f 6b  d char *z;.  Tok
c9b0: 65 6e 20 73 45 6e 64 3b 0a 20 20 44 62 46 69 78  en sEnd;.  DbFix
c9c0: 65 72 20 73 46 69 78 3b 0a 20 20 54 6f 6b 65 6e  er sFix;.  Token
c9d0: 20 2a 70 4e 61 6d 65 3b 0a 20 20 69 6e 74 20 69   *pName;.  int i
c9e0: 44 62 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  Db;.  sqlite3 *d
c9f0: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
ca00: 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e  .  if( pParse->n
ca10: 56 61 72 3e 30 20 29 7b 0a 20 20 20 20 73 71 6c  Var>0 ){.    sql
ca20: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
ca30: 72 73 65 2c 20 22 70 61 72 61 6d 65 74 65 72 73  rse, "parameters
ca40: 20 61 72 65 20 6e 6f 74 20 61 6c 6c 6f 77 65 64   are not allowed
ca50: 20 69 6e 20 76 69 65 77 73 22 29 3b 0a 20 20 20   in views");.   
ca60: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
ca70: 6c 65 74 65 28 70 53 65 6c 65 63 74 29 3b 0a 20  lete(pSelect);. 
ca80: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
ca90: 20 73 71 6c 69 74 65 33 53 74 61 72 74 54 61 62   sqlite3StartTab
caa0: 6c 65 28 70 50 61 72 73 65 2c 20 70 4e 61 6d 65  le(pParse, pName
cab0: 31 2c 20 70 4e 61 6d 65 32 2c 20 69 73 54 65 6d  1, pName2, isTem
cac0: 70 2c 20 31 2c 20 30 2c 20 6e 6f 45 72 72 29 3b  p, 1, 0, noErr);
cad0: 0a 20 20 70 20 3d 20 70 50 61 72 73 65 2d 3e 70  .  p = pParse->p
cae0: 4e 65 77 54 61 62 6c 65 3b 0a 20 20 69 66 28 20  NewTable;.  if( 
caf0: 70 3d 3d 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e  p==0 || pParse->
cb00: 6e 45 72 72 20 29 7b 0a 20 20 20 20 73 71 6c 69  nErr ){.    sqli
cb10: 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28  te3SelectDelete(
cb20: 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 72 65  pSelect);.    re
cb30: 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  turn;.  }.  sqli
cb40: 74 65 33 54 77 6f 50 61 72 74 4e 61 6d 65 28 70  te3TwoPartName(p
cb50: 50 61 72 73 65 2c 20 70 4e 61 6d 65 31 2c 20 70  Parse, pName1, p
cb60: 4e 61 6d 65 32 2c 20 26 70 4e 61 6d 65 29 3b 0a  Name2, &pName);.
cb70: 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53    iDb = sqlite3S
cb80: 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c  chemaToIndex(db,
cb90: 20 70 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20   p->pSchema);.  
cba0: 69 66 28 20 73 71 6c 69 74 65 33 46 69 78 49 6e  if( sqlite3FixIn
cbb0: 69 74 28 26 73 46 69 78 2c 20 70 50 61 72 73 65  it(&sFix, pParse
cbc0: 2c 20 69 44 62 2c 20 22 76 69 65 77 22 2c 20 70  , iDb, "view", p
cbd0: 4e 61 6d 65 29 0a 20 20 20 20 26 26 20 73 71 6c  Name).    && sql
cbe0: 69 74 65 33 46 69 78 53 65 6c 65 63 74 28 26 73  ite3FixSelect(&s
cbf0: 46 69 78 2c 20 70 53 65 6c 65 63 74 29 0a 20 20  Fix, pSelect).  
cc00: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65  ){.    sqlite3Se
cc10: 6c 65 63 74 44 65 6c 65 74 65 28 70 53 65 6c 65  lectDelete(pSele
cc20: 63 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b  ct);.    return;
cc30: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20  .  }..  /* Make 
cc40: 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 65 6e  a copy of the en
cc50: 74 69 72 65 20 53 45 4c 45 43 54 20 73 74 61 74  tire SELECT stat
cc60: 65 6d 65 6e 74 20 74 68 61 74 20 64 65 66 69 6e  ement that defin
cc70: 65 73 20 74 68 65 20 76 69 65 77 2e 0a 20 20 2a  es the view..  *
cc80: 2a 20 54 68 69 73 20 77 69 6c 6c 20 66 6f 72 63  * This will forc
cc90: 65 20 61 6c 6c 20 74 68 65 20 45 78 70 72 2e 74  e all the Expr.t
cca0: 6f 6b 65 6e 2e 7a 20 76 61 6c 75 65 73 20 74 6f  oken.z values to
ccb0: 20 62 65 20 64 79 6e 61 6d 69 63 61 6c 6c 79 0a   be dynamically.
ccc0: 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 72    ** allocated r
ccd0: 61 74 68 65 72 20 74 68 61 6e 20 70 6f 69 6e 74  ather than point
cce0: 20 74 6f 20 74 68 65 20 69 6e 70 75 74 20 73 74   to the input st
ccf0: 72 69 6e 67 20 2d 20 77 68 69 63 68 20 6d 65 61  ring - which mea
cd00: 6e 73 20 74 68 61 74 0a 20 20 2a 2a 20 74 68 65  ns that.  ** the
cd10: 79 20 77 69 6c 6c 20 70 65 72 73 69 73 74 20 61  y will persist a
cd20: 66 74 65 72 20 74 68 65 20 63 75 72 72 65 6e 74  fter the current
cd30: 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 29 20   sqlite3_exec() 
cd40: 63 61 6c 6c 20 72 65 74 75 72 6e 73 2e 0a 20 20  call returns..  
cd50: 2a 2f 0a 20 20 70 2d 3e 70 53 65 6c 65 63 74 20  */.  p->pSelect 
cd60: 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44  = sqlite3SelectD
cd70: 75 70 28 64 62 2c 20 70 53 65 6c 65 63 74 29 3b  up(db, pSelect);
cd80: 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  .  sqlite3Select
cd90: 44 65 6c 65 74 65 28 70 53 65 6c 65 63 74 29 3b  Delete(pSelect);
cda0: 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f  .  if( db->mallo
cdb0: 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 72  cFailed ){.    r
cdc0: 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28  eturn;.  }.  if(
cdd0: 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20   !db->init.busy 
cde0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 69  ){.    sqlite3Vi
cdf0: 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73  ewGetColumnNames
ce00: 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 7d  (pParse, p);.  }
ce10: 0a 0a 20 20 2f 2a 20 4c 6f 63 61 74 65 20 74 68  ..  /* Locate th
ce20: 65 20 65 6e 64 20 6f 66 20 74 68 65 20 43 52 45  e end of the CRE
ce30: 41 54 45 20 56 49 45 57 20 73 74 61 74 65 6d 65  ATE VIEW stateme
ce40: 6e 74 2e 20 20 4d 61 6b 65 20 73 45 6e 64 20 70  nt.  Make sEnd p
ce50: 6f 69 6e 74 20 74 6f 0a 20 20 2a 2a 20 74 68 65  oint to.  ** the
ce60: 20 65 6e 64 2e 0a 20 20 2a 2f 0a 20 20 73 45 6e   end..  */.  sEn
ce70: 64 20 3d 20 70 50 61 72 73 65 2d 3e 73 4c 61 73  d = pParse->sLas
ce80: 74 54 6f 6b 65 6e 3b 0a 20 20 69 66 28 20 73 45  tToken;.  if( sE
ce90: 6e 64 2e 7a 5b 30 5d 21 3d 30 20 26 26 20 73 45  nd.z[0]!=0 && sE
cea0: 6e 64 2e 7a 5b 30 5d 21 3d 27 3b 27 20 29 7b 0a  nd.z[0]!=';' ){.
ceb0: 20 20 20 20 73 45 6e 64 2e 7a 20 2b 3d 20 73 45      sEnd.z += sE
cec0: 6e 64 2e 6e 3b 0a 20 20 7d 0a 20 20 73 45 6e 64  nd.n;.  }.  sEnd
ced0: 2e 6e 20 3d 20 30 3b 0a 20 20 6e 20 3d 20 73 45  .n = 0;.  n = sE
cee0: 6e 64 2e 7a 20 2d 20 70 42 65 67 69 6e 2d 3e 7a  nd.z - pBegin->z
cef0: 3b 0a 20 20 7a 20 3d 20 28 63 6f 6e 73 74 20 75  ;.  z = (const u
cf00: 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29 70 42  nsigned char*)pB
cf10: 65 67 69 6e 2d 3e 7a 3b 0a 20 20 77 68 69 6c 65  egin->z;.  while
cf20: 28 20 6e 3e 30 20 26 26 20 28 7a 5b 6e 2d 31 5d  ( n>0 && (z[n-1]
cf30: 3d 3d 27 3b 27 20 7c 7c 20 69 73 73 70 61 63 65  ==';' || isspace
cf40: 28 7a 5b 6e 2d 31 5d 29 29 20 29 7b 20 6e 2d 2d  (z[n-1])) ){ n--
cf50: 3b 20 7d 0a 20 20 73 45 6e 64 2e 7a 20 3d 20 26  ; }.  sEnd.z = &
cf60: 7a 5b 6e 2d 31 5d 3b 0a 20 20 73 45 6e 64 2e 6e  z[n-1];.  sEnd.n
cf70: 20 3d 20 31 3b 0a 0a 20 20 2f 2a 20 55 73 65 20   = 1;..  /* Use 
cf80: 73 71 6c 69 74 65 33 45 6e 64 54 61 62 6c 65 28  sqlite3EndTable(
cf90: 29 20 74 6f 20 61 64 64 20 74 68 65 20 76 69 65  ) to add the vie
cfa0: 77 20 74 6f 20 74 68 65 20 53 51 4c 49 54 45 5f  w to the SQLITE_
cfb0: 4d 41 53 54 45 52 20 74 61 62 6c 65 20 2a 2f 0a  MASTER table */.
cfc0: 20 20 73 71 6c 69 74 65 33 45 6e 64 54 61 62 6c    sqlite3EndTabl
cfd0: 65 28 70 50 61 72 73 65 2c 20 30 2c 20 26 73 45  e(pParse, 0, &sE
cfe0: 6e 64 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e  nd, 0);.  return
cff0: 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
d000: 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 20 2a  LITE_OMIT_VIEW *
d010: 2f 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  /..#if !defined(
d020: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57  SQLITE_OMIT_VIEW
d030: 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51  ) || !defined(SQ
d040: 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
d050: 4c 54 41 42 4c 45 29 0a 2f 2a 0a 2a 2a 20 54 68  LTABLE)./*.** Th
d060: 65 20 54 61 62 6c 65 20 73 74 72 75 63 74 75 72  e Table structur
d070: 65 20 70 54 61 62 6c 65 20 69 73 20 72 65 61 6c  e pTable is real
d080: 6c 79 20 61 20 56 49 45 57 2e 20 20 46 69 6c 6c  ly a VIEW.  Fill
d090: 20 69 6e 20 74 68 65 20 6e 61 6d 65 73 20 6f 66   in the names of
d0a0: 0a 2a 2a 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20  .** the columns 
d0b0: 6f 66 20 74 68 65 20 76 69 65 77 20 69 6e 20 74  of the view in t
d0c0: 68 65 20 70 54 61 62 6c 65 20 73 74 72 75 63 74  he pTable struct
d0d0: 75 72 65 2e 20 20 52 65 74 75 72 6e 20 74 68 65  ure.  Return the
d0e0: 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66 20 65 72   number.** of er
d0f0: 72 6f 72 73 2e 20 20 49 66 20 61 6e 20 65 72 72  rors.  If an err
d100: 6f 72 20 69 73 20 73 65 65 6e 20 6c 65 61 76 65  or is seen leave
d110: 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67   an error messag
d120: 65 20 69 6e 20 70 50 61 72 73 65 2d 3e 7a 45 72  e in pParse->zEr
d130: 72 4d 73 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  rMsg..*/.int sql
d140: 69 74 65 33 56 69 65 77 47 65 74 43 6f 6c 75 6d  ite3ViewGetColum
d150: 6e 4e 61 6d 65 73 28 50 61 72 73 65 20 2a 70 50  nNames(Parse *pP
d160: 61 72 73 65 2c 20 54 61 62 6c 65 20 2a 70 54 61  arse, Table *pTa
d170: 62 6c 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70  ble){.  Table *p
d180: 53 65 6c 54 61 62 3b 20 20 20 2f 2a 20 41 20 66  SelTab;   /* A f
d190: 61 6b 65 20 74 61 62 6c 65 20 66 72 6f 6d 20 77  ake table from w
d1a0: 68 69 63 68 20 77 65 20 67 65 74 20 74 68 65 20  hich we get the 
d1b0: 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 20 20  result set */.  
d1c0: 53 65 6c 65 63 74 20 2a 70 53 65 6c 3b 20 20 20  Select *pSel;   
d1d0: 20 20 2f 2a 20 43 6f 70 79 20 6f 66 20 74 68 65    /* Copy of the
d1e0: 20 53 45 4c 45 43 54 20 74 68 61 74 20 69 6d 70   SELECT that imp
d1f0: 6c 65 6d 65 6e 74 73 20 74 68 65 20 76 69 65 77  lements the view
d200: 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 72 72 20 3d   */.  int nErr =
d210: 20 30 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65   0;     /* Numbe
d220: 72 20 6f 66 20 65 72 72 6f 72 73 20 65 6e 63 6f  r of errors enco
d230: 75 6e 74 65 72 65 64 20 2a 2f 0a 20 20 69 6e 74  untered */.  int
d240: 20 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f   n;            /
d250: 2a 20 54 65 6d 70 6f 72 61 72 69 6c 79 20 68 6f  * Temporarily ho
d260: 6c 64 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  lds the number o
d270: 66 20 63 75 72 73 6f 72 73 20 61 73 73 69 67 6e  f cursors assign
d280: 65 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  ed */.  sqlite3 
d290: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
d2a0: 3b 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63  ;  /* Database c
d2b0: 6f 6e 6e 65 63 74 69 6f 6e 20 66 6f 72 20 6d 61  onnection for ma
d2c0: 6c 6c 6f 63 20 65 72 72 6f 72 73 20 2a 2f 0a 20  lloc errors */. 
d2d0: 20 69 6e 74 20 28 2a 78 41 75 74 68 29 28 76 6f   int (*xAuth)(vo
d2e0: 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 63 68  id*,int,const ch
d2f0: 61 72 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a 2c  ar*,const char*,
d300: 63 6f 6e 73 74 20 63 68 61 72 2a 2c 63 6f 6e 73  const char*,cons
d310: 74 20 63 68 61 72 2a 29 3b 0a 0a 20 20 61 73 73  t char*);..  ass
d320: 65 72 74 28 20 70 54 61 62 6c 65 20 29 3b 0a 0a  ert( pTable );..
d330: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
d340: 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
d350: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 56 74  .  if( sqlite3Vt
d360: 61 62 43 61 6c 6c 43 6f 6e 6e 65 63 74 28 70 50  abCallConnect(pP
d370: 61 72 73 65 2c 20 70 54 61 62 6c 65 29 20 29 7b  arse, pTable) ){
d380: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
d390: 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  TE_ERROR;.  }.  
d3a0: 69 66 28 20 49 73 56 69 72 74 75 61 6c 28 70 54  if( IsVirtual(pT
d3b0: 61 62 6c 65 29 20 29 20 72 65 74 75 72 6e 20 30  able) ) return 0
d3c0: 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65  ;.#endif..#ifnde
d3d0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
d3e0: 45 57 0a 20 20 2f 2a 20 41 20 70 6f 73 69 74 69  EW.  /* A positi
d3f0: 76 65 20 6e 43 6f 6c 20 6d 65 61 6e 73 20 74 68  ve nCol means th
d400: 65 20 63 6f 6c 75 6d 6e 73 20 6e 61 6d 65 73 20  e columns names 
d410: 66 6f 72 20 74 68 69 73 20 76 69 65 77 20 61 72  for this view ar
d420: 65 0a 20 20 2a 2a 20 61 6c 72 65 61 64 79 20 6b  e.  ** already k
d430: 6e 6f 77 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  nown..  */.  if(
d440: 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3e 30 20   pTable->nCol>0 
d450: 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20 2f  ) return 0;..  /
d460: 2a 20 41 20 6e 65 67 61 74 69 76 65 20 6e 43 6f  * A negative nCo
d470: 6c 20 69 73 20 61 20 73 70 65 63 69 61 6c 20 6d  l is a special m
d480: 61 72 6b 65 72 20 6d 65 61 6e 69 6e 67 20 74 68  arker meaning th
d490: 61 74 20 77 65 20 61 72 65 20 63 75 72 72 65 6e  at we are curren
d4a0: 74 6c 79 0a 20 20 2a 2a 20 74 72 79 69 6e 67 20  tly.  ** trying 
d4b0: 74 6f 20 63 6f 6d 70 75 74 65 20 74 68 65 20 63  to compute the c
d4c0: 6f 6c 75 6d 6e 20 6e 61 6d 65 73 2e 20 20 49 66  olumn names.  If
d4d0: 20 77 65 20 65 6e 74 65 72 20 74 68 69 73 20 72   we enter this r
d4e0: 6f 75 74 69 6e 65 20 77 69 74 68 0a 20 20 2a 2a  outine with.  **
d4f0: 20 61 20 6e 65 67 61 74 69 76 65 20 6e 43 6f 6c   a negative nCol
d500: 2c 20 69 74 20 6d 65 61 6e 73 20 74 77 6f 20 6f  , it means two o
d510: 72 20 6d 6f 72 65 20 76 69 65 77 73 20 66 6f 72  r more views for
d520: 6d 20 61 20 6c 6f 6f 70 2c 20 6c 69 6b 65 20 74  m a loop, like t
d530: 68 69 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  his:.  **.  **  
d540: 20 20 20 43 52 45 41 54 45 20 56 49 45 57 20 6f     CREATE VIEW o
d550: 6e 65 20 41 53 20 53 45 4c 45 43 54 20 2a 20 46  ne AS SELECT * F
d560: 52 4f 4d 20 74 77 6f 3b 0a 20 20 2a 2a 20 20 20  ROM two;.  **   
d570: 20 20 43 52 45 41 54 45 20 56 49 45 57 20 74 77    CREATE VIEW tw
d580: 6f 20 41 53 20 53 45 4c 45 43 54 20 2a 20 46 52  o AS SELECT * FR
d590: 4f 4d 20 6f 6e 65 3b 0a 20 20 2a 2a 0a 20 20 2a  OM one;.  **.  *
d5a0: 2a 20 41 63 74 75 61 6c 6c 79 2c 20 74 68 69 73  * Actually, this
d5b0: 20 65 72 72 6f 72 20 69 73 20 63 61 75 67 68 74   error is caught
d5c0: 20 70 72 65 76 69 6f 75 73 6c 79 20 61 6e 64 20   previously and 
d5d0: 73 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  so the following
d5e0: 20 74 65 73 74 0a 20 20 2a 2a 20 73 68 6f 75 6c   test.  ** shoul
d5f0: 64 20 61 6c 77 61 79 73 20 66 61 69 6c 2e 20 20  d always fail.  
d600: 42 75 74 20 77 65 20 77 69 6c 6c 20 6c 65 61 76  But we will leav
d610: 65 20 69 74 20 69 6e 20 70 6c 61 63 65 20 6a 75  e it in place ju
d620: 73 74 20 74 6f 20 62 65 20 73 61 66 65 2e 0a 20  st to be safe.. 
d630: 20 2a 2f 0a 20 20 69 66 28 20 70 54 61 62 6c 65   */.  if( pTable
d640: 2d 3e 6e 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20  ->nCol<0 ){.    
d650: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
d660: 70 50 61 72 73 65 2c 20 22 76 69 65 77 20 25 73  pParse, "view %s
d670: 20 69 73 20 63 69 72 63 75 6c 61 72 6c 79 20 64   is circularly d
d680: 65 66 69 6e 65 64 22 2c 20 70 54 61 62 6c 65 2d  efined", pTable-
d690: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72 65 74  >zName);.    ret
d6a0: 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 61 73 73  urn 1;.  }.  ass
d6b0: 65 72 74 28 20 70 54 61 62 6c 65 2d 3e 6e 43 6f  ert( pTable->nCo
d6c0: 6c 3e 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 49 66  l>=0 );..  /* If
d6d0: 20 77 65 20 67 65 74 20 74 68 69 73 20 66 61 72   we get this far
d6e0: 2c 20 69 74 20 6d 65 61 6e 73 20 77 65 20 6e 65  , it means we ne
d6f0: 65 64 20 74 6f 20 63 6f 6d 70 75 74 65 20 74 68  ed to compute th
d700: 65 20 74 61 62 6c 65 20 6e 61 6d 65 73 2e 0a 20  e table names.. 
d710: 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68   ** Note that th
d720: 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  e call to sqlite
d730: 33 52 65 73 75 6c 74 53 65 74 4f 66 53 65 6c 65  3ResultSetOfSele
d740: 63 74 28 29 20 77 69 6c 6c 20 65 78 70 61 6e 64  ct() will expand
d750: 20 61 6e 79 0a 20 20 2a 2a 20 22 2a 22 20 65 6c   any.  ** "*" el
d760: 65 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 72 65  ements in the re
d770: 73 75 6c 74 73 20 73 65 74 20 6f 66 20 74 68 65  sults set of the
d780: 20 76 69 65 77 20 61 6e 64 20 77 69 6c 6c 20 61   view and will a
d790: 73 73 69 67 6e 20 63 75 72 73 6f 72 73 0a 20 20  ssign cursors.  
d7a0: 2a 2a 20 74 6f 20 74 68 65 20 65 6c 65 6d 65 6e  ** to the elemen
d7b0: 74 73 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63  ts of the FROM c
d7c0: 6c 61 75 73 65 2e 20 20 42 75 74 20 77 65 20 64  lause.  But we d
d7d0: 6f 20 6e 6f 74 20 77 61 6e 74 20 74 68 65 73 65  o not want these
d7e0: 20 63 68 61 6e 67 65 73 0a 20 20 2a 2a 20 74 6f   changes.  ** to
d7f0: 20 62 65 20 70 65 72 6d 61 6e 65 6e 74 2e 20 20   be permanent.  
d800: 53 6f 20 74 68 65 20 63 6f 6d 70 75 74 61 74 69  So the computati
d810: 6f 6e 20 69 73 20 64 6f 6e 65 20 6f 6e 20 61 20  on is done on a 
d820: 63 6f 70 79 20 6f 66 20 74 68 65 20 53 45 4c 45  copy of the SELE
d830: 43 54 0a 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e  CT.  ** statemen
d840: 74 20 74 68 61 74 20 64 65 66 69 6e 65 73 20 74  t that defines t
d850: 68 65 20 76 69 65 77 2e 0a 20 20 2a 2f 0a 20 20  he view..  */.  
d860: 61 73 73 65 72 74 28 20 70 54 61 62 6c 65 2d 3e  assert( pTable->
d870: 70 53 65 6c 65 63 74 20 29 3b 0a 20 20 70 53 65  pSelect );.  pSe
d880: 6c 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63  l = sqlite3Selec
d890: 74 44 75 70 28 64 62 2c 20 70 54 61 62 6c 65 2d  tDup(db, pTable-
d8a0: 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20 69 66 28  >pSelect);.  if(
d8b0: 20 70 53 65 6c 20 29 7b 0a 20 20 20 20 6e 20 3d   pSel ){.    n =
d8c0: 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 3b 0a 20   pParse->nTab;. 
d8d0: 20 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73     sqlite3SrcLis
d8e0: 74 41 73 73 69 67 6e 43 75 72 73 6f 72 73 28 70  tAssignCursors(p
d8f0: 50 61 72 73 65 2c 20 70 53 65 6c 2d 3e 70 53 72  Parse, pSel->pSr
d900: 63 29 3b 0a 20 20 20 20 70 54 61 62 6c 65 2d 3e  c);.    pTable->
d910: 6e 43 6f 6c 20 3d 20 2d 31 3b 0a 23 69 66 6e 64  nCol = -1;.#ifnd
d920: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
d930: 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 20  UTHORIZATION.   
d940: 20 78 41 75 74 68 20 3d 20 64 62 2d 3e 78 41 75   xAuth = db->xAu
d950: 74 68 3b 0a 20 20 20 20 64 62 2d 3e 78 41 75 74  th;.    db->xAut
d960: 68 20 3d 20 30 3b 0a 20 20 20 20 70 53 65 6c 54  h = 0;.    pSelT
d970: 61 62 20 3d 20 73 71 6c 69 74 65 33 52 65 73 75  ab = sqlite3Resu
d980: 6c 74 53 65 74 4f 66 53 65 6c 65 63 74 28 70 50  ltSetOfSelect(pP
d990: 61 72 73 65 2c 20 30 2c 20 70 53 65 6c 29 3b 0a  arse, 0, pSel);.
d9a0: 20 20 20 20 64 62 2d 3e 78 41 75 74 68 20 3d 20      db->xAuth = 
d9b0: 78 41 75 74 68 3b 0a 23 65 6c 73 65 0a 20 20 20  xAuth;.#else.   
d9c0: 20 70 53 65 6c 54 61 62 20 3d 20 73 71 6c 69 74   pSelTab = sqlit
d9d0: 65 33 52 65 73 75 6c 74 53 65 74 4f 66 53 65 6c  e3ResultSetOfSel
d9e0: 65 63 74 28 70 50 61 72 73 65 2c 20 30 2c 20 70  ect(pParse, 0, p
d9f0: 53 65 6c 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  Sel);.#endif.   
da00: 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 20 3d 20   pParse->nTab = 
da10: 6e 3b 0a 20 20 20 20 69 66 28 20 70 53 65 6c 54  n;.    if( pSelT
da20: 61 62 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  ab ){.      asse
da30: 72 74 28 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c  rt( pTable->aCol
da40: 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 54 61  ==0 );.      pTa
da50: 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 70 53 65 6c  ble->nCol = pSel
da60: 54 61 62 2d 3e 6e 43 6f 6c 3b 0a 20 20 20 20 20  Tab->nCol;.     
da70: 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 20 3d 20   pTable->aCol = 
da80: 70 53 65 6c 54 61 62 2d 3e 61 43 6f 6c 3b 0a 20  pSelTab->aCol;. 
da90: 20 20 20 20 20 70 53 65 6c 54 61 62 2d 3e 6e 43       pSelTab->nC
daa0: 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 53  ol = 0;.      pS
dab0: 65 6c 54 61 62 2d 3e 61 43 6f 6c 20 3d 20 30 3b  elTab->aCol = 0;
dac0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65  .      sqlite3De
dad0: 6c 65 74 65 54 61 62 6c 65 28 70 53 65 6c 54 61  leteTable(pSelTa
dae0: 62 29 3b 0a 20 20 20 20 20 20 70 54 61 62 6c 65  b);.      pTable
daf0: 2d 3e 70 53 63 68 65 6d 61 2d 3e 66 6c 61 67 73  ->pSchema->flags
db00: 20 7c 3d 20 44 42 5f 55 6e 72 65 73 65 74 56 69   |= DB_UnresetVi
db10: 65 77 73 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ews;.    }else{.
db20: 20 20 20 20 20 20 70 54 61 62 6c 65 2d 3e 6e 43        pTable->nC
db30: 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 6e 45  ol = 0;.      nE
db40: 72 72 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rr++;.    }.    
db50: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c  sqlite3SelectDel
db60: 65 74 65 28 70 53 65 6c 29 3b 0a 20 20 7d 20 65  ete(pSel);.  } e
db70: 6c 73 65 20 7b 0a 20 20 20 20 6e 45 72 72 2b 2b  lse {.    nErr++
db80: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  ;.  }.#endif /* 
db90: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57  SQLITE_OMIT_VIEW
dba0: 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 6e 45 72   */.  return nEr
dbb0: 72 3b 20 20 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  r;  .}.#endif /*
dbc0: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
dbd0: 5f 4f 4d 49 54 5f 56 49 45 57 29 20 7c 7c 20 21  _OMIT_VIEW) || !
dbe0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
dbf0: 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
dc00: 29 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51  ) */..#ifndef SQ
dc10: 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 2f  LITE_OMIT_VIEW./
dc20: 2a 0a 2a 2a 20 43 6c 65 61 72 20 74 68 65 20 63  *.** Clear the c
dc30: 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 66 72 6f 6d  olumn names from
dc40: 20 65 76 65 72 79 20 56 49 45 57 20 69 6e 20 64   every VIEW in d
dc50: 61 74 61 62 61 73 65 20 69 64 78 2e 0a 2a 2f 0a  atabase idx..*/.
dc60: 73 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69  static void sqli
dc70: 74 65 56 69 65 77 52 65 73 65 74 41 6c 6c 28 73  teViewResetAll(s
dc80: 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20  qlite3 *db, int 
dc90: 69 64 78 29 7b 0a 20 20 48 61 73 68 45 6c 65 6d  idx){.  HashElem
dca0: 20 2a 69 3b 0a 20 20 69 66 28 20 21 44 62 48 61   *i;.  if( !DbHa
dcb0: 73 50 72 6f 70 65 72 74 79 28 64 62 2c 20 69 64  sProperty(db, id
dcc0: 78 2c 20 44 42 5f 55 6e 72 65 73 65 74 56 69 65  x, DB_UnresetVie
dcd0: 77 73 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ws) ) return;.  
dce0: 66 6f 72 28 69 3d 73 71 6c 69 74 65 48 61 73 68  for(i=sqliteHash
dcf0: 46 69 72 73 74 28 26 64 62 2d 3e 61 44 62 5b 69  First(&db->aDb[i
dd00: 64 78 5d 2e 70 53 63 68 65 6d 61 2d 3e 74 62 6c  dx].pSchema->tbl
dd10: 48 61 73 68 29 3b 20 69 3b 69 3d 73 71 6c 69 74  Hash); i;i=sqlit
dd20: 65 48 61 73 68 4e 65 78 74 28 69 29 29 7b 0a 20  eHashNext(i)){. 
dd30: 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d     Table *pTab =
dd40: 20 73 71 6c 69 74 65 48 61 73 68 44 61 74 61 28   sqliteHashData(
dd50: 69 29 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62  i);.    if( pTab
dd60: 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20  ->pSelect ){.   
dd70: 20 20 20 73 71 6c 69 74 65 52 65 73 65 74 43 6f     sqliteResetCo
dd80: 6c 75 6d 6e 4e 61 6d 65 73 28 70 54 61 62 29 3b  lumnNames(pTab);
dd90: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 44 62 43  .    }.  }.  DbC
dda0: 6c 65 61 72 50 72 6f 70 65 72 74 79 28 64 62 2c  learProperty(db,
ddb0: 20 69 64 78 2c 20 44 42 5f 55 6e 72 65 73 65 74   idx, DB_Unreset
ddc0: 56 69 65 77 73 29 3b 0a 7d 0a 23 65 6c 73 65 0a  Views);.}.#else.
ddd0: 23 20 64 65 66 69 6e 65 20 73 71 6c 69 74 65 56  # define sqliteV
dde0: 69 65 77 52 65 73 65 74 41 6c 6c 28 41 2c 42 29  iewResetAll(A,B)
ddf0: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
de00: 45 5f 4f 4d 49 54 5f 56 49 45 57 20 2a 2f 0a 0a  E_OMIT_VIEW */..
de10: 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
de20: 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 62 79  ion is called by
de30: 20 74 68 65 20 56 44 42 45 20 74 6f 20 61 64 6a   the VDBE to adj
de40: 75 73 74 20 74 68 65 20 69 6e 74 65 72 6e 61 6c  ust the internal
de50: 20 73 63 68 65 6d 61 0a 2a 2a 20 75 73 65 64 20   schema.** used 
de60: 62 79 20 53 51 4c 69 74 65 20 77 68 65 6e 20 74  by SQLite when t
de70: 68 65 20 62 74 72 65 65 20 6c 61 79 65 72 20 6d  he btree layer m
de80: 6f 76 65 73 20 61 20 74 61 62 6c 65 20 72 6f 6f  oves a table roo
de90: 74 20 70 61 67 65 2e 20 54 68 65 0a 2a 2a 20 72  t page. The.** r
dea0: 6f 6f 74 2d 70 61 67 65 20 6f 66 20 61 20 74 61  oot-page of a ta
deb0: 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 69 6e 20  ble or index in 
dec0: 64 61 74 61 62 61 73 65 20 69 44 62 20 68 61 73  database iDb has
ded0: 20 63 68 61 6e 67 65 64 20 66 72 6f 6d 20 69 46   changed from iF
dee0: 72 6f 6d 0a 2a 2a 20 74 6f 20 69 54 6f 2e 0a 2a  rom.** to iTo..*
def0: 2a 0a 2a 2a 20 54 69 63 6b 65 74 20 23 31 37 32  *.** Ticket #172
df00: 38 3a 20 20 54 68 65 20 73 79 6d 62 6f 6c 20 74  8:  The symbol t
df10: 61 62 6c 65 20 6d 69 67 68 74 20 73 74 69 6c 6c  able might still
df20: 20 63 6f 6e 74 61 69 6e 20 69 6e 66 6f 72 6d 61   contain informa
df30: 74 69 6f 6e 0a 2a 2a 20 6f 6e 20 74 61 62 6c 65  tion.** on table
df40: 73 20 61 6e 64 2f 6f 72 20 69 6e 64 69 63 65 73  s and/or indices
df50: 20 74 68 61 74 20 61 72 65 20 74 68 65 20 70 72   that are the pr
df60: 6f 63 65 73 73 20 6f 66 20 62 65 69 6e 67 20 64  ocess of being d
df70: 65 6c 65 74 65 64 2e 0a 2a 2a 20 49 66 20 79 6f  eleted..** If yo
df80: 75 20 61 72 65 20 75 6e 6c 75 63 6b 79 2c 20 6f  u are unlucky, o
df90: 6e 65 20 6f 66 20 74 68 6f 73 65 20 64 65 6c 65  ne of those dele
dfa0: 74 65 64 20 69 6e 64 69 63 65 73 20 6f 72 20 74  ted indices or t
dfb0: 61 62 6c 65 73 20 6d 69 67 68 74 0a 2a 2a 20 68  ables might.** h
dfc0: 61 76 65 20 74 68 65 20 73 61 6d 65 20 72 6f 6f  ave the same roo
dfd0: 74 70 61 67 65 20 6e 75 6d 62 65 72 20 61 73 20  tpage number as 
dfe0: 74 68 65 20 72 65 61 6c 20 74 61 62 6c 65 20 6f  the real table o
dff0: 72 20 69 6e 64 65 78 20 74 68 61 74 20 69 73 0a  r index that is.
e000: 2a 2a 20 62 65 69 6e 67 20 6d 6f 76 65 64 2e 20  ** being moved. 
e010: 20 53 6f 20 77 65 20 63 61 6e 6e 6f 74 20 73 74   So we cannot st
e020: 6f 70 20 73 65 61 72 63 68 69 6e 67 20 61 66 74  op searching aft
e030: 65 72 20 74 68 65 20 66 69 72 73 74 20 6d 61 74  er the first mat
e040: 63 68 20 0a 2a 2a 20 62 65 63 61 75 73 65 20 74  ch .** because t
e050: 68 65 20 66 69 72 73 74 20 6d 61 74 63 68 20 6d  he first match m
e060: 69 67 68 74 20 62 65 20 66 6f 72 20 6f 6e 65 20  ight be for one 
e070: 6f 66 20 74 68 65 20 64 65 6c 65 74 65 64 20 69  of the deleted i
e080: 6e 64 69 63 65 73 0a 2a 2a 20 6f 72 20 74 61 62  ndices.** or tab
e090: 6c 65 73 20 61 6e 64 20 6e 6f 74 20 74 68 65 20  les and not the 
e0a0: 74 61 62 6c 65 2f 69 6e 64 65 78 20 74 68 61 74  table/index that
e0b0: 20 69 73 20 61 63 74 75 61 6c 6c 79 20 62 65 69   is actually bei
e0c0: 6e 67 20 6d 6f 76 65 64 2e 0a 2a 2a 20 57 65 20  ng moved..** We 
e0d0: 6d 75 73 74 20 63 6f 6e 74 69 6e 75 65 20 6c 6f  must continue lo
e0e0: 6f 70 69 6e 67 20 75 6e 74 69 6c 20 61 6c 6c 20  oping until all 
e0f0: 74 61 62 6c 65 73 20 61 6e 64 20 69 6e 64 69 63  tables and indic
e100: 65 73 20 77 69 74 68 0a 2a 2a 20 72 6f 6f 74 70  es with.** rootp
e110: 61 67 65 3d 3d 69 46 72 6f 6d 20 68 61 76 65 20  age==iFrom have 
e120: 62 65 65 6e 20 63 6f 6e 76 65 72 74 65 64 20 74  been converted t
e130: 6f 20 68 61 76 65 20 61 20 72 6f 6f 74 70 61 67  o have a rootpag
e140: 65 20 6f 66 20 69 54 6f 0a 2a 2a 20 69 6e 20 6f  e of iTo.** in o
e150: 72 64 65 72 20 74 6f 20 62 65 20 63 65 72 74 61  rder to be certa
e160: 69 6e 20 74 68 61 74 20 77 65 20 67 6f 74 20 74  in that we got t
e170: 68 65 20 72 69 67 68 74 20 6f 6e 65 2e 0a 2a 2f  he right one..*/
e180: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
e190: 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
e1a0: 76 6f 69 64 20 73 71 6c 69 74 65 33 52 6f 6f 74  void sqlite3Root
e1b0: 50 61 67 65 4d 6f 76 65 64 28 44 62 20 2a 70 44  PageMoved(Db *pD
e1c0: 62 2c 20 69 6e 74 20 69 46 72 6f 6d 2c 20 69 6e  b, int iFrom, in
e1d0: 74 20 69 54 6f 29 7b 0a 20 20 48 61 73 68 45 6c  t iTo){.  HashEl
e1e0: 65 6d 20 2a 70 45 6c 65 6d 3b 0a 20 20 48 61 73  em *pElem;.  Has
e1f0: 68 20 2a 70 48 61 73 68 3b 0a 0a 20 20 70 48 61  h *pHash;..  pHa
e200: 73 68 20 3d 20 26 70 44 62 2d 3e 70 53 63 68 65  sh = &pDb->pSche
e210: 6d 61 2d 3e 74 62 6c 48 61 73 68 3b 0a 20 20 66  ma->tblHash;.  f
e220: 6f 72 28 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48  or(pElem=sqliteH
e230: 61 73 68 46 69 72 73 74 28 70 48 61 73 68 29 3b  ashFirst(pHash);
e240: 20 70 45 6c 65 6d 3b 20 70 45 6c 65 6d 3d 73 71   pElem; pElem=sq
e250: 6c 69 74 65 48 61 73 68 4e 65 78 74 28 70 45 6c  liteHashNext(pEl
e260: 65 6d 29 29 7b 0a 20 20 20 20 54 61 62 6c 65 20  em)){.    Table 
e270: 2a 70 54 61 62 20 3d 20 73 71 6c 69 74 65 48 61  *pTab = sqliteHa
e280: 73 68 44 61 74 61 28 70 45 6c 65 6d 29 3b 0a 20  shData(pElem);. 
e290: 20 20 20 69 66 28 20 70 54 61 62 2d 3e 74 6e 75     if( pTab->tnu
e2a0: 6d 3d 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20  m==iFrom ){.    
e2b0: 20 20 70 54 61 62 2d 3e 74 6e 75 6d 20 3d 20 69    pTab->tnum = i
e2c0: 54 6f 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  To;.    }.  }.  
e2d0: 70 48 61 73 68 20 3d 20 26 70 44 62 2d 3e 70 53  pHash = &pDb->pS
e2e0: 63 68 65 6d 61 2d 3e 69 64 78 48 61 73 68 3b 0a  chema->idxHash;.
e2f0: 20 20 66 6f 72 28 70 45 6c 65 6d 3d 73 71 6c 69    for(pElem=sqli
e300: 74 65 48 61 73 68 46 69 72 73 74 28 70 48 61 73  teHashFirst(pHas
e310: 68 29 3b 20 70 45 6c 65 6d 3b 20 70 45 6c 65 6d  h); pElem; pElem
e320: 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28  =sqliteHashNext(
e330: 70 45 6c 65 6d 29 29 7b 0a 20 20 20 20 49 6e 64  pElem)){.    Ind
e340: 65 78 20 2a 70 49 64 78 20 3d 20 73 71 6c 69 74  ex *pIdx = sqlit
e350: 65 48 61 73 68 44 61 74 61 28 70 45 6c 65 6d 29  eHashData(pElem)
e360: 3b 0a 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e  ;.    if( pIdx->
e370: 74 6e 75 6d 3d 3d 69 46 72 6f 6d 20 29 7b 0a 20  tnum==iFrom ){. 
e380: 20 20 20 20 20 70 49 64 78 2d 3e 74 6e 75 6d 20       pIdx->tnum 
e390: 3d 20 69 54 6f 3b 0a 20 20 20 20 7d 0a 20 20 7d  = iTo;.    }.  }
e3a0: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
e3b0: 20 57 72 69 74 65 20 63 6f 64 65 20 74 6f 20 65   Write code to e
e3c0: 72 61 73 65 20 74 68 65 20 74 61 62 6c 65 20 77  rase the table w
e3d0: 69 74 68 20 72 6f 6f 74 2d 70 61 67 65 20 69 54  ith root-page iT
e3e0: 61 62 6c 65 20 66 72 6f 6d 20 64 61 74 61 62 61  able from databa
e3f0: 73 65 20 69 44 62 2e 0a 2a 2a 20 41 6c 73 6f 20  se iDb..** Also 
e400: 77 72 69 74 65 20 63 6f 64 65 20 74 6f 20 6d 6f  write code to mo
e410: 64 69 66 79 20 74 68 65 20 73 71 6c 69 74 65 5f  dify the sqlite_
e420: 6d 61 73 74 65 72 20 74 61 62 6c 65 20 61 6e 64  master table and
e430: 20 69 6e 74 65 72 6e 61 6c 20 73 63 68 65 6d 61   internal schema
e440: 0a 2a 2a 20 69 66 20 61 20 72 6f 6f 74 2d 70 61  .** if a root-pa
e450: 67 65 20 6f 66 20 61 6e 6f 74 68 65 72 20 74 61  ge of another ta
e460: 62 6c 65 20 69 73 20 6d 6f 76 65 64 20 62 79 20  ble is moved by 
e470: 74 68 65 20 62 74 72 65 65 2d 6c 61 79 65 72 20  the btree-layer 
e480: 77 68 69 6c 73 74 0a 2a 2a 20 65 72 61 73 69 6e  whilst.** erasin
e490: 67 20 69 54 61 62 6c 65 20 28 74 68 69 73 20 63  g iTable (this c
e4a0: 61 6e 20 68 61 70 70 65 6e 20 77 69 74 68 20 61  an happen with a
e4b0: 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61  n auto-vacuum da
e4c0: 74 61 62 61 73 65 29 2e 0a 2a 2f 20 0a 73 74 61  tabase)..*/ .sta
e4d0: 74 69 63 20 76 6f 69 64 20 64 65 73 74 72 6f 79  tic void destroy
e4e0: 52 6f 6f 74 50 61 67 65 28 50 61 72 73 65 20 2a  RootPage(Parse *
e4f0: 70 50 61 72 73 65 2c 20 69 6e 74 20 69 54 61 62  pParse, int iTab
e500: 6c 65 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20 20  le, int iDb){.  
e510: 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65  Vdbe *v = sqlite
e520: 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
e530: 3b 0a 20 20 69 6e 74 20 72 31 20 3d 20 73 71 6c  ;.  int r1 = sql
e540: 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
e550: 50 61 72 73 65 29 3b 0a 20 20 73 71 6c 69 74 65  Parse);.  sqlite
e560: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
e570: 50 5f 44 65 73 74 72 6f 79 2c 20 69 54 61 62 6c  P_Destroy, iTabl
e580: 65 2c 20 72 31 2c 20 69 44 62 29 3b 0a 23 69 66  e, r1, iDb);.#if
e590: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
e5a0: 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 2f 2a  _AUTOVACUUM.  /*
e5b0: 20 4f 50 5f 44 65 73 74 72 6f 79 20 73 74 6f 72   OP_Destroy stor
e5c0: 65 73 20 61 6e 20 69 6e 20 69 6e 74 65 67 65 72  es an in integer
e5d0: 20 72 31 2e 20 49 66 20 74 68 69 73 20 69 6e 74   r1. If this int
e5e0: 65 67 65 72 0a 20 20 2a 2a 20 69 73 20 6e 6f 6e  eger.  ** is non
e5f0: 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 69 74 20 69  -zero, then it i
e600: 73 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20  s the root page 
e610: 6e 75 6d 62 65 72 20 6f 66 20 61 20 74 61 62 6c  number of a tabl
e620: 65 20 6d 6f 76 65 64 20 74 6f 0a 20 20 2a 2a 20  e moved to.  ** 
e630: 6c 6f 63 61 74 69 6f 6e 20 69 54 61 62 6c 65 2e  location iTable.
e640: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63   The following c
e650: 6f 64 65 20 6d 6f 64 69 66 69 65 73 20 74 68 65  ode modifies the
e660: 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74   sqlite_master t
e670: 61 62 6c 65 20 74 6f 0a 20 20 2a 2a 20 72 65 66  able to.  ** ref
e680: 6c 65 63 74 20 74 68 69 73 2e 0a 20 20 2a 2a 0a  lect this..  **.
e690: 20 20 2a 2a 20 54 68 65 20 22 23 25 64 22 20 69    ** The "#%d" i
e6a0: 6e 20 74 68 65 20 53 51 4c 20 69 73 20 61 20 73  n the SQL is a s
e6b0: 70 65 63 69 61 6c 20 63 6f 6e 73 74 61 6e 74 20  pecial constant 
e6c0: 74 68 61 74 20 6d 65 61 6e 73 20 77 68 61 74 65  that means whate
e6d0: 76 65 72 20 76 61 6c 75 65 0a 20 20 2a 2a 20 69  ver value.  ** i
e6e0: 73 20 6f 6e 20 74 68 65 20 74 6f 70 20 6f 66 20  s on the top of 
e6f0: 74 68 65 20 73 74 61 63 6b 2e 20 20 53 65 65 20  the stack.  See 
e700: 73 71 6c 69 74 65 33 52 65 67 69 73 74 65 72 45  sqlite3RegisterE
e710: 78 70 72 28 29 2e 0a 20 20 2a 2f 0a 20 20 73 71  xpr()..  */.  sq
e720: 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72 73 65  lite3NestedParse
e730: 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 22  (pParse, .     "
e740: 55 50 44 41 54 45 20 25 51 2e 25 73 20 53 45 54  UPDATE %Q.%s SET
e750: 20 72 6f 6f 74 70 61 67 65 3d 25 64 20 57 48 45   rootpage=%d WHE
e760: 52 45 20 23 25 64 20 41 4e 44 20 72 6f 6f 74 70  RE #%d AND rootp
e770: 61 67 65 3d 23 25 64 22 2c 0a 20 20 20 20 20 70  age=#%d",.     p
e780: 50 61 72 73 65 2d 3e 64 62 2d 3e 61 44 62 5b 69  Parse->db->aDb[i
e790: 44 62 5d 2e 7a 4e 61 6d 65 2c 20 53 43 48 45 4d  Db].zName, SCHEM
e7a0: 41 5f 54 41 42 4c 45 28 69 44 62 29 2c 20 69 54  A_TABLE(iDb), iT
e7b0: 61 62 6c 65 2c 20 72 31 2c 20 72 31 29 3b 0a 23  able, r1, r1);.#
e7c0: 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33 52  endif.  sqlite3R
e7d0: 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
e7e0: 61 72 73 65 2c 20 72 31 29 3b 0a 7d 0a 0a 2f 2a  arse, r1);.}../*
e7f0: 0a 2a 2a 20 57 72 69 74 65 20 56 44 42 45 20 63  .** Write VDBE c
e800: 6f 64 65 20 74 6f 20 65 72 61 73 65 20 74 61 62  ode to erase tab
e810: 6c 65 20 70 54 61 62 20 61 6e 64 20 61 6c 6c 20  le pTab and all 
e820: 61 73 73 6f 63 69 61 74 65 64 20 69 6e 64 69 63  associated indic
e830: 65 73 20 6f 6e 20 64 69 73 6b 2e 0a 2a 2a 20 43  es on disk..** C
e840: 6f 64 65 20 74 6f 20 75 70 64 61 74 65 20 74 68  ode to update th
e850: 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  e sqlite_master 
e860: 74 61 62 6c 65 73 20 61 6e 64 20 69 6e 74 65 72  tables and inter
e870: 6e 61 6c 20 73 63 68 65 6d 61 20 64 65 66 69 6e  nal schema defin
e880: 69 74 69 6f 6e 73 0a 2a 2a 20 69 6e 20 63 61 73  itions.** in cas
e890: 65 20 61 20 72 6f 6f 74 2d 70 61 67 65 20 62 65  e a root-page be
e8a0: 6c 6f 6e 67 69 6e 67 20 74 6f 20 61 6e 6f 74 68  longing to anoth
e8b0: 65 72 20 74 61 62 6c 65 20 69 73 20 6d 6f 76 65  er table is move
e8c0: 64 20 62 79 20 74 68 65 20 62 74 72 65 65 20 6c  d by the btree l
e8d0: 61 79 65 72 0a 2a 2a 20 69 73 20 61 6c 73 6f 20  ayer.** is also 
e8e0: 61 64 64 65 64 20 28 74 68 69 73 20 63 61 6e 20  added (this can 
e8f0: 68 61 70 70 65 6e 20 77 69 74 68 20 61 6e 20 61  happen with an a
e900: 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62  uto-vacuum datab
e910: 61 73 65 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ase)..*/.static 
e920: 76 6f 69 64 20 64 65 73 74 72 6f 79 54 61 62 6c  void destroyTabl
e930: 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
e940: 20 54 61 62 6c 65 20 2a 70 54 61 62 29 7b 0a 23   Table *pTab){.#
e950: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  ifdef SQLITE_OMI
e960: 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 49  T_AUTOVACUUM.  I
e970: 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 69 6e  ndex *pIdx;.  in
e980: 74 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53  t iDb = sqlite3S
e990: 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 70 50 61  chemaToIndex(pPa
e9a0: 72 73 65 2d 3e 64 62 2c 20 70 54 61 62 2d 3e 70  rse->db, pTab->p
e9b0: 53 63 68 65 6d 61 29 3b 0a 20 20 64 65 73 74 72  Schema);.  destr
e9c0: 6f 79 52 6f 6f 74 50 61 67 65 28 70 50 61 72 73  oyRootPage(pPars
e9d0: 65 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 2c 20 69  e, pTab->tnum, i
e9e0: 44 62 29 3b 0a 20 20 66 6f 72 28 70 49 64 78 3d  Db);.  for(pIdx=
e9f0: 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49  pTab->pIndex; pI
ea00: 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70  dx; pIdx=pIdx->p
ea10: 4e 65 78 74 29 7b 0a 20 20 20 20 64 65 73 74 72  Next){.    destr
ea20: 6f 79 52 6f 6f 74 50 61 67 65 28 70 50 61 72 73  oyRootPage(pPars
ea30: 65 2c 20 70 49 64 78 2d 3e 74 6e 75 6d 2c 20 69  e, pIdx->tnum, i
ea40: 44 62 29 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a 20  Db);.  }.#else. 
ea50: 20 2f 2a 20 49 66 20 74 68 65 20 64 61 74 61 62   /* If the datab
ea60: 61 73 65 20 6d 61 79 20 62 65 20 61 75 74 6f 2d  ase may be auto-
ea70: 76 61 63 75 75 6d 20 63 61 70 61 62 6c 65 20 28  vacuum capable (
ea80: 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  if SQLITE_OMIT_A
ea90: 55 54 4f 56 41 43 55 55 4d 0a 20 20 2a 2a 20 69  UTOVACUUM.  ** i
eaa0: 73 20 6e 6f 74 20 64 65 66 69 6e 65 64 29 2c 20  s not defined), 
eab0: 74 68 65 6e 20 69 74 20 69 73 20 69 6d 70 6f 72  then it is impor
eac0: 74 61 6e 74 20 74 6f 20 63 61 6c 6c 20 4f 50 5f  tant to call OP_
ead0: 44 65 73 74 72 6f 79 20 6f 6e 20 74 68 65 0a 20  Destroy on the. 
eae0: 20 2a 2a 20 74 61 62 6c 65 20 61 6e 64 20 69 6e   ** table and in
eaf0: 64 65 78 20 72 6f 6f 74 2d 70 61 67 65 73 20 69  dex root-pages i
eb00: 6e 20 6f 72 64 65 72 2c 20 73 74 61 72 74 69 6e  n order, startin
eb10: 67 20 77 69 74 68 20 74 68 65 20 6e 75 6d 65 72  g with the numer
eb20: 69 63 61 6c 6c 79 20 0a 20 20 2a 2a 20 6c 61 72  ically .  ** lar
eb30: 67 65 73 74 20 72 6f 6f 74 2d 70 61 67 65 20 6e  gest root-page n
eb40: 75 6d 62 65 72 2e 20 54 68 69 73 20 67 75 61 72  umber. This guar
eb50: 61 6e 74 65 65 73 20 74 68 61 74 20 6e 6f 6e 65  antees that none
eb60: 20 6f 66 20 74 68 65 20 72 6f 6f 74 2d 70 61 67   of the root-pag
eb70: 65 73 0a 20 20 2a 2a 20 74 6f 20 62 65 20 64 65  es.  ** to be de
eb80: 73 74 72 6f 79 65 64 20 69 73 20 72 65 6c 6f 63  stroyed is reloc
eb90: 61 74 65 64 20 62 79 20 61 6e 20 65 61 72 6c 69  ated by an earli
eba0: 65 72 20 4f 50 5f 44 65 73 74 72 6f 79 2e 20 69  er OP_Destroy. i
ebb0: 2e 65 2e 20 69 66 20 74 68 65 0a 20 20 2a 2a 20  .e. if the.  ** 
ebc0: 66 6f 6c 6c 6f 77 69 6e 67 20 77 65 72 65 20 63  following were c
ebd0: 6f 64 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  oded:.  **.  ** 
ebe0: 4f 50 5f 44 65 73 74 72 6f 79 20 34 20 30 0a 20  OP_Destroy 4 0. 
ebf0: 20 2a 2a 20 2e 2e 2e 0a 20 20 2a 2a 20 4f 50 5f   ** ....  ** OP_
ec00: 44 65 73 74 72 6f 79 20 35 20 30 0a 20 20 2a 2a  Destroy 5 0.  **
ec10: 0a 20 20 2a 2a 20 61 6e 64 20 72 6f 6f 74 20 70  .  ** and root p
ec20: 61 67 65 20 35 20 68 61 70 70 65 6e 65 64 20 74  age 5 happened t
ec30: 6f 20 62 65 20 74 68 65 20 6c 61 72 67 65 73 74  o be the largest
ec40: 20 72 6f 6f 74 2d 70 61 67 65 20 6e 75 6d 62 65   root-page numbe
ec50: 72 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20 64 61  r in the.  ** da
ec60: 74 61 62 61 73 65 2c 20 74 68 65 6e 20 72 6f 6f  tabase, then roo
ec70: 74 20 70 61 67 65 20 35 20 77 6f 75 6c 64 20 62  t page 5 would b
ec80: 65 20 6d 6f 76 65 64 20 74 6f 20 70 61 67 65 20  e moved to page 
ec90: 34 20 62 79 20 74 68 65 20 0a 20 20 2a 2a 20 22  4 by the .  ** "
eca0: 4f 50 5f 44 65 73 74 72 6f 79 20 34 20 30 22 20  OP_Destroy 4 0" 
ecb0: 6f 70 63 6f 64 65 2e 20 54 68 65 20 73 75 62 73  opcode. The subs
ecc0: 65 71 75 65 6e 74 20 22 4f 50 5f 44 65 73 74 72  equent "OP_Destr
ecd0: 6f 79 20 35 20 30 22 20 77 6f 75 6c 64 20 68 69  oy 5 0" would hi
ece0: 74 0a 20 20 2a 2a 20 61 20 66 72 65 65 2d 6c 69  t.  ** a free-li
ecf0: 73 74 20 70 61 67 65 2e 0a 20 20 2a 2f 0a 20 20  st page..  */.  
ed00: 69 6e 74 20 69 54 61 62 20 3d 20 70 54 61 62 2d  int iTab = pTab-
ed10: 3e 74 6e 75 6d 3b 0a 20 20 69 6e 74 20 69 44 65  >tnum;.  int iDe
ed20: 73 74 72 6f 79 65 64 20 3d 20 30 3b 0a 0a 20 20  stroyed = 0;..  
ed30: 77 68 69 6c 65 28 20 31 20 29 7b 0a 20 20 20 20  while( 1 ){.    
ed40: 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 20  Index *pIdx;.   
ed50: 20 69 6e 74 20 69 4c 61 72 67 65 73 74 20 3d 20   int iLargest = 
ed60: 30 3b 0a 0a 20 20 20 20 69 66 28 20 69 44 65 73  0;..    if( iDes
ed70: 74 72 6f 79 65 64 3d 3d 30 20 7c 7c 20 69 54 61  troyed==0 || iTa
ed80: 62 3c 69 44 65 73 74 72 6f 79 65 64 20 29 7b 0a  b<iDestroyed ){.
ed90: 20 20 20 20 20 20 69 4c 61 72 67 65 73 74 20 3d        iLargest =
eda0: 20 69 54 61 62 3b 0a 20 20 20 20 7d 0a 20 20 20   iTab;.    }.   
edb0: 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e   for(pIdx=pTab->
edc0: 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49  pIndex; pIdx; pI
edd0: 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b  dx=pIdx->pNext){
ede0: 0a 20 20 20 20 20 20 69 6e 74 20 69 49 64 78 20  .      int iIdx 
edf0: 3d 20 70 49 64 78 2d 3e 74 6e 75 6d 3b 0a 20 20  = pIdx->tnum;.  
ee00: 20 20 20 20 61 73 73 65 72 74 28 20 70 49 64 78      assert( pIdx
ee10: 2d 3e 70 53 63 68 65 6d 61 3d 3d 70 54 61 62 2d  ->pSchema==pTab-
ee20: 3e 70 53 63 68 65 6d 61 20 29 3b 0a 20 20 20 20  >pSchema );.    
ee30: 20 20 69 66 28 20 28 69 44 65 73 74 72 6f 79 65    if( (iDestroye
ee40: 64 3d 3d 30 20 7c 7c 20 28 69 49 64 78 3c 69 44  d==0 || (iIdx<iD
ee50: 65 73 74 72 6f 79 65 64 29 29 20 26 26 20 69 49  estroyed)) && iI
ee60: 64 78 3e 69 4c 61 72 67 65 73 74 20 29 7b 0a 20  dx>iLargest ){. 
ee70: 20 20 20 20 20 20 20 69 4c 61 72 67 65 73 74 20         iLargest 
ee80: 3d 20 69 49 64 78 3b 0a 20 20 20 20 20 20 7d 0a  = iIdx;.      }.
ee90: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 4c      }.    if( iL
eea0: 61 72 67 65 73 74 3d 3d 30 20 29 7b 0a 20 20 20  argest==0 ){.   
eeb0: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d     return;.    }
eec0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20  else{.      int 
eed0: 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68  iDb = sqlite3Sch
eee0: 65 6d 61 54 6f 49 6e 64 65 78 28 70 50 61 72 73  emaToIndex(pPars
eef0: 65 2d 3e 64 62 2c 20 70 54 61 62 2d 3e 70 53 63  e->db, pTab->pSc
ef00: 68 65 6d 61 29 3b 0a 20 20 20 20 20 20 64 65 73  hema);.      des
ef10: 74 72 6f 79 52 6f 6f 74 50 61 67 65 28 70 50 61  troyRootPage(pPa
ef20: 72 73 65 2c 20 69 4c 61 72 67 65 73 74 2c 20 69  rse, iLargest, i
ef30: 44 62 29 3b 0a 20 20 20 20 20 20 69 44 65 73 74  Db);.      iDest
ef40: 72 6f 79 65 64 20 3d 20 69 4c 61 72 67 65 73 74  royed = iLargest
ef50: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  ;.    }.  }.#end
ef60: 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  if.}../*.** This
ef70: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
ef80: 65 64 20 74 6f 20 64 6f 20 74 68 65 20 77 6f 72  ed to do the wor
ef90: 6b 20 6f 66 20 61 20 44 52 4f 50 20 54 41 42 4c  k of a DROP TABL
efa0: 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20  E statement..** 
efb0: 70 4e 61 6d 65 20 69 73 20 74 68 65 20 6e 61 6d  pName is the nam
efc0: 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74  e of the table t
efd0: 6f 20 62 65 20 64 72 6f 70 70 65 64 2e 0a 2a 2f  o be dropped..*/
efe0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 44 72 6f  .void sqlite3Dro
eff0: 70 54 61 62 6c 65 28 50 61 72 73 65 20 2a 70 50  pTable(Parse *pP
f000: 61 72 73 65 2c 20 53 72 63 4c 69 73 74 20 2a 70  arse, SrcList *p
f010: 4e 61 6d 65 2c 20 69 6e 74 20 69 73 56 69 65 77  Name, int isView
f020: 2c 20 69 6e 74 20 6e 6f 45 72 72 29 7b 0a 20 20  , int noErr){.  
f030: 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 56  Table *pTab;.  V
f040: 64 62 65 20 2a 76 3b 0a 20 20 73 71 6c 69 74 65  dbe *v;.  sqlite
f050: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
f060: 64 62 3b 0a 20 20 69 6e 74 20 69 44 62 3b 0a 0a  db;.  int iDb;..
f070: 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45    if( pParse->nE
f080: 72 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63  rr || db->malloc
f090: 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f  Failed ){.    go
f0a0: 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62  to exit_drop_tab
f0b0: 6c 65 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  le;.  }.  assert
f0c0: 28 20 70 4e 61 6d 65 2d 3e 6e 53 72 63 3d 3d 31  ( pName->nSrc==1
f0d0: 20 29 3b 0a 20 20 70 54 61 62 20 3d 20 73 71 6c   );.  pTab = sql
f0e0: 69 74 65 33 4c 6f 63 61 74 65 54 61 62 6c 65 28  ite3LocateTable(
f0f0: 70 50 61 72 73 65 2c 20 70 4e 61 6d 65 2d 3e 61  pParse, pName->a
f100: 5b 30 5d 2e 7a 4e 61 6d 65 2c 20 70 4e 61 6d 65  [0].zName, pName
f110: 2d 3e 61 5b 30 5d 2e 7a 44 61 74 61 62 61 73 65  ->a[0].zDatabase
f120: 29 3b 0a 0a 20 20 69 66 28 20 70 54 61 62 3d 3d  );..  if( pTab==
f130: 30 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 6f 45  0 ){.    if( noE
f140: 72 72 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  rr ){.      sqli
f150: 74 65 33 45 72 72 6f 72 43 6c 65 61 72 28 70 50  te3ErrorClear(pP
f160: 61 72 73 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  arse);.    }.   
f170: 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f   goto exit_drop_
f180: 74 61 62 6c 65 3b 0a 20 20 7d 0a 20 20 69 44 62  table;.  }.  iDb
f190: 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61   = sqlite3Schema
f1a0: 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 54 61 62  ToIndex(db, pTab
f1b0: 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 61 73  ->pSchema);.  as
f1c0: 73 65 72 74 28 20 69 44 62 3e 3d 30 20 26 26 20  sert( iDb>=0 && 
f1d0: 69 44 62 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 0a  iDb<db->nDb );..
f1e0: 20 20 2f 2a 20 49 66 20 70 54 61 62 20 69 73 20    /* If pTab is 
f1f0: 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2c  a virtual table,
f200: 20 63 61 6c 6c 20 56 69 65 77 47 65 74 43 6f 6c   call ViewGetCol
f210: 75 6d 6e 4e 61 6d 65 73 28 29 20 74 6f 20 65 6e  umnNames() to en
f220: 73 75 72 65 0a 20 20 2a 2a 20 69 74 20 69 73 20  sure.  ** it is 
f230: 69 6e 69 74 69 61 6c 69 7a 65 64 2e 0a 20 20 2a  initialized..  *
f240: 2f 0a 20 20 69 66 28 20 49 73 56 69 72 74 75 61  /.  if( IsVirtua
f250: 6c 28 70 54 61 62 29 20 26 26 20 73 71 6c 69 74  l(pTab) && sqlit
f260: 65 33 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e  e3ViewGetColumnN
f270: 61 6d 65 73 28 70 50 61 72 73 65 2c 20 70 54 61  ames(pParse, pTa
f280: 62 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65  b) ){.    goto e
f290: 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a  xit_drop_table;.
f2a0: 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
f2b0: 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a  TE_OMIT_AUTHORIZ
f2c0: 41 54 49 4f 4e 0a 20 20 7b 0a 20 20 20 20 69 6e  ATION.  {.    in
f2d0: 74 20 63 6f 64 65 3b 0a 20 20 20 20 63 6f 6e 73  t code;.    cons
f2e0: 74 20 63 68 61 72 20 2a 7a 54 61 62 20 3d 20 53  t char *zTab = S
f2f0: 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 44 62 29  CHEMA_TABLE(iDb)
f300: 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  ;.    const char
f310: 20 2a 7a 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b   *zDb = db->aDb[
f320: 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20  iDb].zName;.    
f330: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 72 67  const char *zArg
f340: 32 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 73  2 = 0;.    if( s
f350: 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28  qlite3AuthCheck(
f360: 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 44  pParse, SQLITE_D
f370: 45 4c 45 54 45 2c 20 7a 54 61 62 2c 20 30 2c 20  ELETE, zTab, 0, 
f380: 7a 44 62 29 29 7b 0a 20 20 20 20 20 20 67 6f 74  zDb)){.      got
f390: 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c  o exit_drop_tabl
f3a0: 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  e;.    }.    if(
f3b0: 20 69 73 56 69 65 77 20 29 7b 0a 20 20 20 20 20   isView ){.     
f3c0: 20 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44   if( !OMIT_TEMPD
f3d0: 42 20 26 26 20 69 44 62 3d 3d 31 20 29 7b 0a 20  B && iDb==1 ){. 
f3e0: 20 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51         code = SQ
f3f0: 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 56  LITE_DROP_TEMP_V
f400: 49 45 57 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  IEW;.      }else
f410: 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20 3d  {.        code =
f420: 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 56 49 45   SQLITE_DROP_VIE
f430: 57 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66 6e 64  W;.      }.#ifnd
f440: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
f450: 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20  IRTUALTABLE.    
f460: 7d 65 6c 73 65 20 69 66 28 20 49 73 56 69 72 74  }else if( IsVirt
f470: 75 61 6c 28 70 54 61 62 29 20 29 7b 0a 20 20 20  ual(pTab) ){.   
f480: 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45     code = SQLITE
f490: 5f 44 52 4f 50 5f 56 54 41 42 4c 45 3b 0a 20 20  _DROP_VTABLE;.  
f4a0: 20 20 20 20 7a 41 72 67 32 20 3d 20 70 54 61 62      zArg2 = pTab
f4b0: 2d 3e 70 4d 6f 64 2d 3e 7a 4e 61 6d 65 3b 0a 23  ->pMod->zName;.#
f4c0: 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c 73 65 7b  endif.    }else{
f4d0: 0a 20 20 20 20 20 20 69 66 28 20 21 4f 4d 49 54  .      if( !OMIT
f4e0: 5f 54 45 4d 50 44 42 20 26 26 20 69 44 62 3d 3d  _TEMPDB && iDb==
f4f0: 31 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 64  1 ){.        cod
f500: 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f  e = SQLITE_DROP_
f510: 54 45 4d 50 5f 54 41 42 4c 45 3b 0a 20 20 20 20  TEMP_TABLE;.    
f520: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
f530: 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44   code = SQLITE_D
f540: 52 4f 50 5f 54 41 42 4c 45 3b 0a 20 20 20 20 20  ROP_TABLE;.     
f550: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
f560: 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63   sqlite3AuthChec
f570: 6b 28 70 50 61 72 73 65 2c 20 63 6f 64 65 2c 20  k(pParse, code, 
f580: 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 41 72  pTab->zName, zAr
f590: 67 32 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20  g2, zDb) ){.    
f5a0: 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70    goto exit_drop
f5b0: 5f 74 61 62 6c 65 3b 0a 20 20 20 20 7d 0a 20 20  _table;.    }.  
f5c0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74    if( sqlite3Aut
f5d0: 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53  hCheck(pParse, S
f5e0: 51 4c 49 54 45 5f 44 45 4c 45 54 45 2c 20 70 54  QLITE_DELETE, pT
f5f0: 61 62 2d 3e 7a 4e 61 6d 65 2c 20 30 2c 20 7a 44  ab->zName, 0, zD
f600: 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  b) ){.      goto
f610: 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65   exit_drop_table
f620: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  ;.    }.  }.#end
f630: 69 66 0a 20 20 69 66 28 20 70 54 61 62 2d 3e 72  if.  if( pTab->r
f640: 65 61 64 4f 6e 6c 79 20 7c 7c 20 70 54 61 62 3d  eadOnly || pTab=
f650: 3d 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53  =db->aDb[iDb].pS
f660: 63 68 65 6d 61 2d 3e 70 53 65 71 54 61 62 20 29  chema->pSeqTab )
f670: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
f680: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74  orMsg(pParse, "t
f690: 61 62 6c 65 20 25 73 20 6d 61 79 20 6e 6f 74 20  able %s may not 
f6a0: 62 65 20 64 72 6f 70 70 65 64 22 2c 20 70 54 61  be dropped", pTa
f6b0: 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 67  b->zName);.    g
f6c0: 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61  oto exit_drop_ta
f6d0: 62 6c 65 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65  ble;.  }..#ifnde
f6e0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
f6f0: 45 57 0a 20 20 2f 2a 20 45 6e 73 75 72 65 20 44  EW.  /* Ensure D
f700: 52 4f 50 20 54 41 42 4c 45 20 69 73 20 6e 6f 74  ROP TABLE is not
f710: 20 75 73 65 64 20 6f 6e 20 61 20 76 69 65 77 2c   used on a view,
f720: 20 61 6e 64 20 44 52 4f 50 20 56 49 45 57 20 69   and DROP VIEW i
f730: 73 20 6e 6f 74 20 75 73 65 64 0a 20 20 2a 2a 20  s not used.  ** 
f740: 6f 6e 20 61 20 74 61 62 6c 65 2e 0a 20 20 2a 2f  on a table..  */
f750: 0a 20 20 69 66 28 20 69 73 56 69 65 77 20 26 26  .  if( isView &&
f760: 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 3d 3d   pTab->pSelect==
f770: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
f780: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
f790: 20 22 75 73 65 20 44 52 4f 50 20 54 41 42 4c 45   "use DROP TABLE
f7a0: 20 74 6f 20 64 65 6c 65 74 65 20 74 61 62 6c 65   to delete table
f7b0: 20 25 73 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d   %s", pTab->zNam
f7c0: 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69  e);.    goto exi
f7d0: 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20  t_drop_table;.  
f7e0: 7d 0a 20 20 69 66 28 20 21 69 73 56 69 65 77 20  }.  if( !isView 
f7f0: 26 26 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74  && pTab->pSelect
f800: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
f810: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
f820: 22 75 73 65 20 44 52 4f 50 20 56 49 45 57 20 74  "use DROP VIEW t
f830: 6f 20 64 65 6c 65 74 65 20 76 69 65 77 20 25 73  o delete view %s
f840: 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b  ", pTab->zName);
f850: 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64  .    goto exit_d
f860: 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 23  rop_table;.  }.#
f870: 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 47 65 6e 65  endif..  /* Gene
f880: 72 61 74 65 20 63 6f 64 65 20 74 6f 20 72 65 6d  rate code to rem
f890: 6f 76 65 20 74 68 65 20 74 61 62 6c 65 20 66 72  ove the table fr
f8a0: 6f 6d 20 74 68 65 20 6d 61 73 74 65 72 20 74 61  om the master ta
f8b0: 62 6c 65 0a 20 20 2a 2a 20 6f 6e 20 64 69 73 6b  ble.  ** on disk
f8c0: 2e 0a 20 20 2a 2f 0a 20 20 76 20 3d 20 73 71 6c  ..  */.  v = sql
f8d0: 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
f8e0: 73 65 29 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a  se);.  if( v ){.
f8f0: 20 20 20 20 54 72 69 67 67 65 72 20 2a 70 54 72      Trigger *pTr
f900: 69 67 67 65 72 3b 0a 20 20 20 20 44 62 20 2a 70  igger;.    Db *p
f910: 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 44  Db = &db->aDb[iD
f920: 62 5d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42  b];.    sqlite3B
f930: 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69  eginWriteOperati
f940: 6f 6e 28 70 50 61 72 73 65 2c 20 31 2c 20 69 44  on(pParse, 1, iD
f950: 62 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  b);..#ifndef SQL
f960: 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
f970: 54 41 42 4c 45 0a 20 20 20 20 69 66 28 20 49 73  TABLE.    if( Is
f980: 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 29 7b  Virtual(pTab) ){
f990: 0a 20 20 20 20 20 20 56 64 62 65 20 2a 76 20 3d  .      Vdbe *v =
f9a0: 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
f9b0: 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 69  pParse);.      i
f9c0: 66 28 20 76 20 29 7b 0a 20 20 20 20 20 20 20 20  f( v ){.        
f9d0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
f9e0: 30 28 76 2c 20 4f 50 5f 56 42 65 67 69 6e 29 3b  0(v, OP_VBegin);
f9f0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23  .      }.    }.#
fa00: 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 44 72  endif..    /* Dr
fa10: 6f 70 20 61 6c 6c 20 74 72 69 67 67 65 72 73 20  op all triggers 
fa20: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
fa30: 74 68 65 20 74 61 62 6c 65 20 62 65 69 6e 67 20  the table being 
fa40: 64 72 6f 70 70 65 64 2e 20 43 6f 64 65 0a 20 20  dropped. Code.  
fa50: 20 20 2a 2a 20 69 73 20 67 65 6e 65 72 61 74 65    ** is generate
fa60: 64 20 74 6f 20 72 65 6d 6f 76 65 20 65 6e 74 72  d to remove entr
fa70: 69 65 73 20 66 72 6f 6d 20 73 71 6c 69 74 65 5f  ies from sqlite_
fa80: 6d 61 73 74 65 72 20 61 6e 64 2f 6f 72 0a 20 20  master and/or.  
fa90: 20 20 2a 2a 20 73 71 6c 69 74 65 5f 74 65 6d 70    ** sqlite_temp
faa0: 5f 6d 61 73 74 65 72 20 69 66 20 72 65 71 75 69  _master if requi
fab0: 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  red..    */.    
fac0: 70 54 72 69 67 67 65 72 20 3d 20 70 54 61 62 2d  pTrigger = pTab-
fad0: 3e 70 54 72 69 67 67 65 72 3b 0a 20 20 20 20 77  >pTrigger;.    w
fae0: 68 69 6c 65 28 20 70 54 72 69 67 67 65 72 20 29  hile( pTrigger )
faf0: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
fb00: 70 54 72 69 67 67 65 72 2d 3e 70 53 63 68 65 6d  pTrigger->pSchem
fb10: 61 3d 3d 70 54 61 62 2d 3e 70 53 63 68 65 6d 61  a==pTab->pSchema
fb20: 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 20 20 70   || .          p
fb30: 54 72 69 67 67 65 72 2d 3e 70 53 63 68 65 6d 61  Trigger->pSchema
fb40: 3d 3d 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 53 63  ==db->aDb[1].pSc
fb50: 68 65 6d 61 20 29 3b 0a 20 20 20 20 20 20 73 71  hema );.      sq
fb60: 6c 69 74 65 33 44 72 6f 70 54 72 69 67 67 65 72  lite3DropTrigger
fb70: 50 74 72 28 70 50 61 72 73 65 2c 20 70 54 72 69  Ptr(pParse, pTri
fb80: 67 67 65 72 29 3b 0a 20 20 20 20 20 20 70 54 72  gger);.      pTr
fb90: 69 67 67 65 72 20 3d 20 70 54 72 69 67 67 65 72  igger = pTrigger
fba0: 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 0a  ->pNext;.    }..
fbb0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
fbc0: 4d 49 54 5f 41 55 54 4f 49 4e 43 52 45 4d 45 4e  MIT_AUTOINCREMEN
fbd0: 54 0a 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20  T.    /* Remove 
fbe0: 61 6e 79 20 65 6e 74 72 69 65 73 20 6f 66 20 74  any entries of t
fbf0: 68 65 20 73 71 6c 69 74 65 5f 73 65 71 75 65 6e  he sqlite_sequen
fc00: 63 65 20 74 61 62 6c 65 20 61 73 73 6f 63 69 61  ce table associa
fc10: 74 65 64 20 77 69 74 68 0a 20 20 20 20 2a 2a 20  ted with.    ** 
fc20: 74 68 65 20 74 61 62 6c 65 20 62 65 69 6e 67 20  the table being 
fc30: 64 72 6f 70 70 65 64 2e 20 54 68 69 73 20 69 73  dropped. This is
fc40: 20 64 6f 6e 65 20 62 65 66 6f 72 65 20 74 68 65   done before the
fc50: 20 74 61 62 6c 65 20 69 73 20 64 72 6f 70 70 65   table is droppe
fc60: 64 0a 20 20 20 20 2a 2a 20 61 74 20 74 68 65 20  d.    ** at the 
fc70: 62 74 72 65 65 20 6c 65 76 65 6c 2c 20 69 6e 20  btree level, in 
fc80: 63 61 73 65 20 74 68 65 20 73 71 6c 69 74 65 5f  case the sqlite_
fc90: 73 65 71 75 65 6e 63 65 20 74 61 62 6c 65 20 6e  sequence table n
fca0: 65 65 64 73 20 74 6f 0a 20 20 20 20 2a 2a 20 6d  eeds to.    ** m
fcb0: 6f 76 65 20 61 73 20 61 20 72 65 73 75 6c 74 20  ove as a result 
fcc0: 6f 66 20 74 68 65 20 64 72 6f 70 20 28 63 61 6e  of the drop (can
fcd0: 20 68 61 70 70 65 6e 20 69 6e 20 61 75 74 6f 2d   happen in auto-
fce0: 76 61 63 75 75 6d 20 6d 6f 64 65 29 2e 0a 20 20  vacuum mode)..  
fcf0: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 54 61    */.    if( pTa
fd00: 62 2d 3e 61 75 74 6f 49 6e 63 20 29 7b 0a 20 20  b->autoInc ){.  
fd10: 20 20 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65      sqlite3Neste
fd20: 64 50 61 72 73 65 28 70 50 61 72 73 65 2c 0a 20  dParse(pParse,. 
fd30: 20 20 20 20 20 20 20 22 44 45 4c 45 54 45 20 46         "DELETE F
fd40: 52 4f 4d 20 25 73 2e 73 71 6c 69 74 65 5f 73 65  ROM %s.sqlite_se
fd50: 71 75 65 6e 63 65 20 57 48 45 52 45 20 6e 61 6d  quence WHERE nam
fd60: 65 3d 25 51 22 2c 0a 20 20 20 20 20 20 20 20 70  e=%Q",.        p
fd70: 44 62 2d 3e 7a 4e 61 6d 65 2c 20 70 54 61 62 2d  Db->zName, pTab-
fd80: 3e 7a 4e 61 6d 65 0a 20 20 20 20 20 20 29 3b 0a  >zName.      );.
fd90: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20      }.#endif..  
fda0: 20 20 2f 2a 20 44 72 6f 70 20 61 6c 6c 20 53 51    /* Drop all SQ
fdb0: 4c 49 54 45 5f 4d 41 53 54 45 52 20 74 61 62 6c  LITE_MASTER tabl
fdc0: 65 20 61 6e 64 20 69 6e 64 65 78 20 65 6e 74 72  e and index entr
fdd0: 69 65 73 20 74 68 61 74 20 72 65 66 65 72 20 74  ies that refer t
fde0: 6f 20 74 68 65 0a 20 20 20 20 2a 2a 20 74 61 62  o the.    ** tab
fdf0: 6c 65 2e 20 54 68 65 20 70 72 6f 67 72 61 6d 20  le. The program 
fe00: 6e 61 6d 65 20 6c 6f 6f 70 73 20 74 68 72 6f 75  name loops throu
fe10: 67 68 20 74 68 65 20 6d 61 73 74 65 72 20 74 61  gh the master ta
fe20: 62 6c 65 20 61 6e 64 20 64 65 6c 65 74 65 73 0a  ble and deletes.
fe30: 20 20 20 20 2a 2a 20 65 76 65 72 79 20 72 6f 77      ** every row
fe40: 20 74 68 61 74 20 72 65 66 65 72 73 20 74 6f 20   that refers to 
fe50: 61 20 74 61 62 6c 65 20 6f 66 20 74 68 65 20 73  a table of the s
fe60: 61 6d 65 20 6e 61 6d 65 20 61 73 20 74 68 65 20  ame name as the 
fe70: 6f 6e 65 20 62 65 69 6e 67 0a 20 20 20 20 2a 2a  one being.    **
fe80: 20 64 72 6f 70 70 65 64 2e 20 54 72 69 67 67 65   dropped. Trigge
fe90: 72 73 20 61 72 65 20 68 61 6e 64 6c 65 64 20 73  rs are handled s
fea0: 65 70 65 72 61 74 65 6c 79 20 62 65 63 61 75 73  eperately becaus
feb0: 65 20 61 20 74 72 69 67 67 65 72 20 63 61 6e 20  e a trigger can 
fec0: 62 65 0a 20 20 20 20 2a 2a 20 63 72 65 61 74 65  be.    ** create
fed0: 64 20 69 6e 20 74 68 65 20 74 65 6d 70 20 64 61  d in the temp da
fee0: 74 61 62 61 73 65 20 74 68 61 74 20 72 65 66 65  tabase that refe
fef0: 72 73 20 74 6f 20 61 20 74 61 62 6c 65 20 69 6e  rs to a table in
ff00: 20 61 6e 6f 74 68 65 72 0a 20 20 20 20 2a 2a 20   another.    ** 
ff10: 64 61 74 61 62 61 73 65 2e 0a 20 20 20 20 2a 2f  database..    */
ff20: 0a 20 20 20 20 73 71 6c 69 74 65 33 4e 65 73 74  .    sqlite3Nest
ff30: 65 64 50 61 72 73 65 28 70 50 61 72 73 65 2c 20  edParse(pParse, 
ff40: 0a 20 20 20 20 20 20 20 20 22 44 45 4c 45 54 45  .        "DELETE
ff50: 20 46 52 4f 4d 20 25 51 2e 25 73 20 57 48 45 52   FROM %Q.%s WHER
ff60: 45 20 74 62 6c 5f 6e 61 6d 65 3d 25 51 20 61 6e  E tbl_name=%Q an
ff70: 64 20 74 79 70 65 21 3d 27 74 72 69 67 67 65 72  d type!='trigger
ff80: 27 22 2c 0a 20 20 20 20 20 20 20 20 70 44 62 2d  '",.        pDb-
ff90: 3e 7a 4e 61 6d 65 2c 20 53 43 48 45 4d 41 5f 54  >zName, SCHEMA_T
ffa0: 41 42 4c 45 28 69 44 62 29 2c 20 70 54 61 62 2d  ABLE(iDb), pTab-
ffb0: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28  >zName);.    if(
ffc0: 20 21 69 73 56 69 65 77 20 26 26 20 21 49 73 56   !isView && !IsV
ffd0: 69 72 74 75 61 6c 28 70 54 61 62 29 20 29 7b 0a  irtual(pTab) ){.
ffe0: 20 20 20 20 20 20 64 65 73 74 72 6f 79 54 61 62        destroyTab
fff0: 6c 65 28 70 50 61 72 73 65 2c 20 70 54 61 62 29  le(pParse, pTab)
10000 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
10010 52 65 6d 6f 76 65 20 74 68 65 20 74 61 62 6c 65  Remove the table
10020 20 65 6e 74 72 79 20 66 72 6f 6d 20 53 51 4c 69   entry from SQLi
10030 74 65 27 73 20 69 6e 74 65 72 6e 61 6c 20 73 63  te's internal sc
10040 68 65 6d 61 20 61 6e 64 20 6d 6f 64 69 66 79 0a  hema and modify.
10050 20 20 20 20 2a 2a 20 74 68 65 20 73 63 68 65 6d      ** the schem
10060 61 20 63 6f 6f 6b 69 65 2e 0a 20 20 20 20 2a 2f  a cookie..    */
10070 0a 20 20 20 20 69 66 28 20 49 73 56 69 72 74 75  .    if( IsVirtu
10080 61 6c 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20  al(pTab) ){.    
10090 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
100a0 4f 70 34 28 76 2c 20 4f 50 5f 56 44 65 73 74 72  Op4(v, OP_VDestr
100b0 6f 79 2c 20 69 44 62 2c 20 30 2c 20 30 2c 20 70  oy, iDb, 0, 0, p
100c0 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a  Tab->zName, 0);.
100d0 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
100e0 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
100f0 50 5f 44 72 6f 70 54 61 62 6c 65 2c 20 69 44 62  P_DropTable, iDb
10100 2c 20 30 2c 20 30 2c 20 70 54 61 62 2d 3e 7a 4e  , 0, 0, pTab->zN
10110 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  ame, 0);.    sql
10120 69 74 65 33 43 68 61 6e 67 65 43 6f 6f 6b 69 65  ite3ChangeCookie
10130 28 64 62 2c 20 76 2c 20 69 44 62 29 3b 0a 20 20  (db, v, iDb);.  
10140 7d 0a 20 20 73 71 6c 69 74 65 56 69 65 77 52 65  }.  sqliteViewRe
10150 73 65 74 41 6c 6c 28 64 62 2c 20 69 44 62 29 3b  setAll(db, iDb);
10160 0a 0a 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c  ..exit_drop_tabl
10170 65 3a 0a 20 20 73 71 6c 69 74 65 33 53 72 63 4c  e:.  sqlite3SrcL
10180 69 73 74 44 65 6c 65 74 65 28 70 4e 61 6d 65 29  istDelete(pName)
10190 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
101a0 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
101b0 64 20 74 6f 20 63 72 65 61 74 65 20 61 20 6e 65  d to create a ne
101c0 77 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 6f 6e  w foreign key on
101d0 20 74 68 65 20 74 61 62 6c 65 0a 2a 2a 20 63 75   the table.** cu
101e0 72 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f  rrently under co
101f0 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 70 46 72  nstruction.  pFr
10200 6f 6d 43 6f 6c 20 64 65 74 65 72 6d 69 6e 65 73  omCol determines
10210 20 77 68 69 63 68 20 63 6f 6c 75 6d 6e 73 0a 2a   which columns.*
10220 2a 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74  * in the current
10230 20 74 61 62 6c 65 20 70 6f 69 6e 74 20 74 6f 20   table point to 
10240 74 68 65 20 66 6f 72 65 69 67 6e 20 6b 65 79 2e  the foreign key.
10250 20 20 49 66 20 70 46 72 6f 6d 43 6f 6c 3d 3d 30    If pFromCol==0
10260 20 74 68 65 6e 0a 2a 2a 20 63 6f 6e 6e 65 63 74   then.** connect
10270 20 74 68 65 20 6b 65 79 20 74 6f 20 74 68 65 20   the key to the 
10280 6c 61 73 74 20 63 6f 6c 75 6d 6e 20 69 6e 73 65  last column inse
10290 72 74 65 64 2e 20 20 70 54 6f 20 69 73 20 74 68  rted.  pTo is th
102a0 65 20 6e 61 6d 65 20 6f 66 0a 2a 2a 20 74 68 65  e name of.** the
102b0 20 74 61 62 6c 65 20 72 65 66 65 72 72 65 64 20   table referred 
102c0 74 6f 2e 20 20 70 54 6f 43 6f 6c 20 69 73 20 61  to.  pToCol is a
102d0 20 6c 69 73 74 20 6f 66 20 74 61 62 6c 65 73 20   list of tables 
102e0 69 6e 20 74 68 65 20 6f 74 68 65 72 0a 2a 2a 20  in the other.** 
102f0 70 54 6f 20 74 61 62 6c 65 20 74 68 61 74 20 74  pTo table that t
10300 68 65 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 70  he foreign key p
10310 6f 69 6e 74 73 20 74 6f 2e 20 20 66 6c 61 67 73  oints to.  flags
10320 20 63 6f 6e 74 61 69 6e 73 20 61 6c 6c 0a 2a 2a   contains all.**
10330 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f   information abo
10340 75 74 20 74 68 65 20 63 6f 6e 66 6c 69 63 74 20  ut the conflict 
10350 72 65 73 6f 6c 75 74 69 6f 6e 20 61 6c 67 6f 72  resolution algor
10360 69 74 68 6d 73 20 73 70 65 63 69 66 69 65 64 0a  ithms specified.
10370 2a 2a 20 69 6e 20 74 68 65 20 4f 4e 20 44 45 4c  ** in the ON DEL
10380 45 54 45 2c 20 4f 4e 20 55 50 44 41 54 45 20 61  ETE, ON UPDATE a
10390 6e 64 20 4f 4e 20 49 4e 53 45 52 54 20 63 6c 61  nd ON INSERT cla
103a0 75 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 46  uses..**.** An F
103b0 4b 65 79 20 73 74 72 75 63 74 75 72 65 20 69 73  Key structure is
103c0 20 63 72 65 61 74 65 64 20 61 6e 64 20 61 64 64   created and add
103d0 65 64 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20  ed to the table 
103e0 63 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 75 6e 64  currently.** und
103f0 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20  er construction 
10400 69 6e 20 74 68 65 20 70 50 61 72 73 65 2d 3e 70  in the pParse->p
10410 4e 65 77 54 61 62 6c 65 20 66 69 65 6c 64 2e 20  NewTable field. 
10420 20 54 68 65 20 6e 65 77 20 46 4b 65 79 0a 2a 2a   The new FKey.**
10430 20 69 73 20 6e 6f 74 20 6c 69 6e 6b 65 64 20 69   is not linked i
10440 6e 74 6f 20 64 62 2d 3e 61 46 4b 65 79 20 61 74  nto db->aFKey at
10450 20 74 68 69 73 20 70 6f 69 6e 74 20 2d 20 74 68   this point - th
10460 61 74 20 64 6f 65 73 20 6e 6f 74 20 68 61 70 70  at does not happ
10470 65 6e 0a 2a 2a 20 75 6e 74 69 6c 20 73 71 6c 69  en.** until sqli
10480 74 65 33 45 6e 64 54 61 62 6c 65 28 29 2e 0a 2a  te3EndTable()..*
10490 2a 0a 2a 2a 20 54 68 65 20 66 6f 72 65 69 67 6e  *.** The foreign
104a0 20 6b 65 79 20 69 73 20 73 65 74 20 66 6f 72 20   key is set for 
104b0 49 4d 4d 45 44 49 41 54 45 20 70 72 6f 63 65 73  IMMEDIATE proces
104c0 73 69 6e 67 2e 20 20 41 20 73 75 62 73 65 71 75  sing.  A subsequ
104d0 65 6e 74 20 63 61 6c 6c 0a 2a 2a 20 74 6f 20 73  ent call.** to s
104e0 71 6c 69 74 65 33 44 65 66 65 72 46 6f 72 65 69  qlite3DeferForei
104f0 67 6e 4b 65 79 28 29 20 6d 69 67 68 74 20 63 68  gnKey() might ch
10500 61 6e 67 65 20 74 68 69 73 20 74 6f 20 44 45 46  ange this to DEF
10510 45 52 52 45 44 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ERRED..*/.void s
10520 71 6c 69 74 65 33 43 72 65 61 74 65 46 6f 72 65  qlite3CreateFore
10530 69 67 6e 4b 65 79 28 0a 20 20 50 61 72 73 65 20  ignKey(.  Parse 
10540 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f  *pParse,       /
10550 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
10560 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  t */.  ExprList 
10570 2a 70 46 72 6f 6d 43 6f 6c 2c 20 20 2f 2a 20 43  *pFromCol,  /* C
10580 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 69 73 20 74  olumns in this t
10590 61 62 6c 65 20 74 68 61 74 20 70 6f 69 6e 74 20  able that point 
105a0 74 6f 20 6f 74 68 65 72 20 74 61 62 6c 65 20 2a  to other table *
105b0 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 54 6f 2c 20  /.  Token *pTo, 
105c0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
105d0 20 6f 66 20 74 68 65 20 6f 74 68 65 72 20 74 61   of the other ta
105e0 62 6c 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ble */.  ExprLis
105f0 74 20 2a 70 54 6f 43 6f 6c 2c 20 20 20 20 2f 2a  t *pToCol,    /*
10600 20 43 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20   Columns in the 
10610 6f 74 68 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20  other table */. 
10620 20 69 6e 74 20 66 6c 61 67 73 20 20 20 20 20 20   int flags      
10630 20 20 20 20 20 20 2f 2a 20 43 6f 6e 66 6c 69 63        /* Conflic
10640 74 20 72 65 73 6f 6c 75 74 69 6f 6e 20 61 6c 67  t resolution alg
10650 6f 72 69 74 68 6d 73 2e 20 2a 2f 0a 29 7b 0a 23  orithms. */.){.#
10660 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
10670 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 0a 20  IT_FOREIGN_KEY. 
10680 20 46 4b 65 79 20 2a 70 46 4b 65 79 20 3d 20 30   FKey *pFKey = 0
10690 3b 0a 20 20 54 61 62 6c 65 20 2a 70 20 3d 20 70  ;.  Table *p = p
106a0 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
106b0 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20  ;.  int nByte;. 
106c0 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e 43   int i;.  int nC
106d0 6f 6c 3b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 0a  ol;.  char *z;..
106e0 20 20 61 73 73 65 72 74 28 20 70 54 6f 21 3d 30    assert( pTo!=0
106f0 20 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c   );.  if( p==0 |
10700 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c  | pParse->nErr |
10710 7c 20 49 4e 5f 44 45 43 4c 41 52 45 5f 56 54 41  | IN_DECLARE_VTA
10720 42 20 29 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b  B ) goto fk_end;
10730 0a 20 20 69 66 28 20 70 46 72 6f 6d 43 6f 6c 3d  .  if( pFromCol=
10740 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 43  =0 ){.    int iC
10750 6f 6c 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a  ol = p->nCol-1;.
10760 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29      if( iCol<0 )
10770 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20   goto fk_end;.  
10780 20 20 69 66 28 20 70 54 6f 43 6f 6c 20 26 26 20    if( pToCol && 
10790 70 54 6f 43 6f 6c 2d 3e 6e 45 78 70 72 21 3d 31  pToCol->nExpr!=1
107a0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
107b0 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
107c0 2c 20 22 66 6f 72 65 69 67 6e 20 6b 65 79 20 6f  , "foreign key o
107d0 6e 20 25 73 22 0a 20 20 20 20 20 20 20 20 20 22  n %s".         "
107e0 20 73 68 6f 75 6c 64 20 72 65 66 65 72 65 6e 63   should referenc
107f0 65 20 6f 6e 6c 79 20 6f 6e 65 20 63 6f 6c 75 6d  e only one colum
10800 6e 20 6f 66 20 74 61 62 6c 65 20 25 54 22 2c 0a  n of table %T",.
10810 20 20 20 20 20 20 20 20 20 70 2d 3e 61 43 6f 6c           p->aCol
10820 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 2c 20 70 54  [iCol].zName, pT
10830 6f 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 66  o);.      goto f
10840 6b 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 20  k_end;.    }.   
10850 20 6e 43 6f 6c 20 3d 20 31 3b 0a 20 20 7d 65 6c   nCol = 1;.  }el
10860 73 65 20 69 66 28 20 70 54 6f 43 6f 6c 20 26 26  se if( pToCol &&
10870 20 70 54 6f 43 6f 6c 2d 3e 6e 45 78 70 72 21 3d   pToCol->nExpr!=
10880 70 46 72 6f 6d 43 6f 6c 2d 3e 6e 45 78 70 72 20  pFromCol->nExpr 
10890 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
108a0 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 0a 20  rorMsg(pParse,. 
108b0 20 20 20 20 20 20 20 22 6e 75 6d 62 65 72 20 6f         "number o
108c0 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 66 6f 72  f columns in for
108d0 65 69 67 6e 20 6b 65 79 20 64 6f 65 73 20 6e 6f  eign key does no
108e0 74 20 6d 61 74 63 68 20 74 68 65 20 6e 75 6d 62  t match the numb
108f0 65 72 20 6f 66 20 22 0a 20 20 20 20 20 20 20 20  er of ".        
10900 22 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20  "columns in the 
10910 72 65 66 65 72 65 6e 63 65 64 20 74 61 62 6c 65  referenced table
10920 22 29 3b 0a 20 20 20 20 67 6f 74 6f 20 66 6b 5f  ");.    goto fk_
10930 65 6e 64 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  end;.  }else{.  
10940 20 20 6e 43 6f 6c 20 3d 20 70 46 72 6f 6d 43 6f    nCol = pFromCo
10950 6c 2d 3e 6e 45 78 70 72 3b 0a 20 20 7d 0a 20 20  l->nExpr;.  }.  
10960 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f 66 28 2a  nByte = sizeof(*
10970 70 46 4b 65 79 29 20 2b 20 6e 43 6f 6c 2a 73 69  pFKey) + nCol*si
10980 7a 65 6f 66 28 70 46 4b 65 79 2d 3e 61 43 6f 6c  zeof(pFKey->aCol
10990 5b 30 5d 29 20 2b 20 70 54 6f 2d 3e 6e 20 2b 20  [0]) + pTo->n + 
109a0 31 3b 0a 20 20 69 66 28 20 70 54 6f 43 6f 6c 20  1;.  if( pToCol 
109b0 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  ){.    for(i=0; 
109c0 69 3c 70 54 6f 43 6f 6c 2d 3e 6e 45 78 70 72 3b  i<pToCol->nExpr;
109d0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 6e 42 79   i++){.      nBy
109e0 74 65 20 2b 3d 20 73 74 72 6c 65 6e 28 70 54 6f  te += strlen(pTo
109f0 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29  Col->a[i].zName)
10a00 20 2b 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   + 1;.    }.  }.
10a10 20 20 70 46 4b 65 79 20 3d 20 73 71 6c 69 74 65    pFKey = sqlite
10a20 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 70 50  3DbMallocZero(pP
10a30 61 72 73 65 2d 3e 64 62 2c 20 6e 42 79 74 65 20  arse->db, nByte 
10a40 29 3b 0a 20 20 69 66 28 20 70 46 4b 65 79 3d 3d  );.  if( pFKey==
10a50 30 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 66 6b  0 ){.    goto fk
10a60 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 70 46 4b 65  _end;.  }.  pFKe
10a70 79 2d 3e 70 46 72 6f 6d 20 3d 20 70 3b 0a 20 20  y->pFrom = p;.  
10a80 70 46 4b 65 79 2d 3e 70 4e 65 78 74 46 72 6f 6d  pFKey->pNextFrom
10a90 20 3d 20 70 2d 3e 70 46 4b 65 79 3b 0a 20 20 7a   = p->pFKey;.  z
10aa0 20 3d 20 28 63 68 61 72 2a 29 26 70 46 4b 65 79   = (char*)&pFKey
10ab0 5b 31 5d 3b 0a 20 20 70 46 4b 65 79 2d 3e 61 43  [1];.  pFKey->aC
10ac0 6f 6c 20 3d 20 28 73 74 72 75 63 74 20 73 43 6f  ol = (struct sCo
10ad0 6c 4d 61 70 2a 29 7a 3b 0a 20 20 7a 20 2b 3d 20  lMap*)z;.  z += 
10ae0 73 69 7a 65 6f 66 28 73 74 72 75 63 74 20 73 43  sizeof(struct sC
10af0 6f 6c 4d 61 70 29 2a 6e 43 6f 6c 3b 0a 20 20 70  olMap)*nCol;.  p
10b00 46 4b 65 79 2d 3e 7a 54 6f 20 3d 20 7a 3b 0a 20  FKey->zTo = z;. 
10b10 20 6d 65 6d 63 70 79 28 7a 2c 20 70 54 6f 2d 3e   memcpy(z, pTo->
10b20 7a 2c 20 70 54 6f 2d 3e 6e 29 3b 0a 20 20 7a 5b  z, pTo->n);.  z[
10b30 70 54 6f 2d 3e 6e 5d 20 3d 20 30 3b 0a 20 20 7a  pTo->n] = 0;.  z
10b40 20 2b 3d 20 70 54 6f 2d 3e 6e 2b 31 3b 0a 20 20   += pTo->n+1;.  
10b50 70 46 4b 65 79 2d 3e 70 4e 65 78 74 54 6f 20 3d  pFKey->pNextTo =
10b60 20 30 3b 0a 20 20 70 46 4b 65 79 2d 3e 6e 43 6f   0;.  pFKey->nCo
10b70 6c 20 3d 20 6e 43 6f 6c 3b 0a 20 20 69 66 28 20  l = nCol;.  if( 
10b80 70 46 72 6f 6d 43 6f 6c 3d 3d 30 20 29 7b 0a 20  pFromCol==0 ){. 
10b90 20 20 20 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b 30     pFKey->aCol[0
10ba0 5d 2e 69 46 72 6f 6d 20 3d 20 70 2d 3e 6e 43 6f  ].iFrom = p->nCo
10bb0 6c 2d 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  l-1;.  }else{.  
10bc0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f    for(i=0; i<nCo
10bd0 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  l; i++){.      i
10be0 6e 74 20 6a 3b 0a 20 20 20 20 20 20 66 6f 72 28  nt j;.      for(
10bf0 6a 3d 30 3b 20 6a 3c 70 2d 3e 6e 43 6f 6c 3b 20  j=0; j<p->nCol; 
10c00 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66  j++){.        if
10c10 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ( sqlite3StrICmp
10c20 28 70 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d  (p->aCol[j].zNam
10c30 65 2c 20 70 46 72 6f 6d 43 6f 6c 2d 3e 61 5b 69  e, pFromCol->a[i
10c40 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20  ].zName)==0 ){. 
10c50 20 20 20 20 20 20 20 20 20 70 46 4b 65 79 2d 3e           pFKey->
10c60 61 43 6f 6c 5b 69 5d 2e 69 46 72 6f 6d 20 3d 20  aCol[i].iFrom = 
10c70 6a 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  j;.          bre
10c80 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
10c90 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
10ca0 6a 3e 3d 70 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20  j>=p->nCol ){.  
10cb0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
10cc0 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 0a 20  orMsg(pParse, . 
10cd0 20 20 20 20 20 20 20 20 20 22 75 6e 6b 6e 6f 77           "unknow
10ce0 6e 20 63 6f 6c 75 6d 6e 20 5c 22 25 73 5c 22 20  n column \"%s\" 
10cf0 69 6e 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 64  in foreign key d
10d00 65 66 69 6e 69 74 69 6f 6e 22 2c 20 0a 20 20 20  efinition", .   
10d10 20 20 20 20 20 20 20 70 46 72 6f 6d 43 6f 6c 2d         pFromCol-
10d20 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20  >a[i].zName);.  
10d30 20 20 20 20 20 20 67 6f 74 6f 20 66 6b 5f 65 6e        goto fk_en
10d40 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  d;.      }.    }
10d50 0a 20 20 7d 0a 20 20 69 66 28 20 70 54 6f 43 6f  .  }.  if( pToCo
10d60 6c 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30  l ){.    for(i=0
10d70 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a  ; i<nCol; i++){.
10d80 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 73 74        int n = st
10d90 72 6c 65 6e 28 70 54 6f 43 6f 6c 2d 3e 61 5b 69  rlen(pToCol->a[i
10da0 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ].zName);.      
10db0 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a  pFKey->aCol[i].z
10dc0 43 6f 6c 20 3d 20 7a 3b 0a 20 20 20 20 20 20 6d  Col = z;.      m
10dd0 65 6d 63 70 79 28 7a 2c 20 70 54 6f 43 6f 6c 2d  emcpy(z, pToCol-
10de0 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 6e 29 3b  >a[i].zName, n);
10df0 0a 20 20 20 20 20 20 7a 5b 6e 5d 20 3d 20 30 3b  .      z[n] = 0;
10e00 0a 20 20 20 20 20 20 7a 20 2b 3d 20 6e 2b 31 3b  .      z += n+1;
10e10 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 46 4b  .    }.  }.  pFK
10e20 65 79 2d 3e 69 73 44 65 66 65 72 72 65 64 20 3d  ey->isDeferred =
10e30 20 30 3b 0a 20 20 70 46 4b 65 79 2d 3e 64 65 6c   0;.  pFKey->del
10e40 65 74 65 43 6f 6e 66 20 3d 20 66 6c 61 67 73 20  eteConf = flags 
10e50 26 20 30 78 66 66 3b 0a 20 20 70 46 4b 65 79 2d  & 0xff;.  pFKey-
10e60 3e 75 70 64 61 74 65 43 6f 6e 66 20 3d 20 28 66  >updateConf = (f
10e70 6c 61 67 73 20 3e 3e 20 38 20 29 20 26 20 30 78  lags >> 8 ) & 0x
10e80 66 66 3b 0a 20 20 70 46 4b 65 79 2d 3e 69 6e 73  ff;.  pFKey->ins
10e90 65 72 74 43 6f 6e 66 20 3d 20 28 66 6c 61 67 73  ertConf = (flags
10ea0 20 3e 3e 20 31 36 20 29 20 26 20 30 78 66 66 3b   >> 16 ) & 0xff;
10eb0 0a 0a 20 20 2f 2a 20 4c 69 6e 6b 20 74 68 65 20  ..  /* Link the 
10ec0 66 6f 72 65 69 67 6e 20 6b 65 79 20 74 6f 20 74  foreign key to t
10ed0 68 65 20 74 61 62 6c 65 20 61 73 20 74 68 65 20  he table as the 
10ee0 6c 61 73 74 20 73 74 65 70 2e 0a 20 20 2a 2f 0a  last step..  */.
10ef0 20 20 70 2d 3e 70 46 4b 65 79 20 3d 20 70 46 4b    p->pFKey = pFK
10f00 65 79 3b 0a 20 20 70 46 4b 65 79 20 3d 20 30 3b  ey;.  pFKey = 0;
10f10 0a 0a 66 6b 5f 65 6e 64 3a 0a 20 20 73 71 6c 69  ..fk_end:.  sqli
10f20 74 65 33 5f 66 72 65 65 28 70 46 4b 65 79 29 3b  te3_free(pFKey);
10f30 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69  .#endif /* !defi
10f40 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
10f50 46 4f 52 45 49 47 4e 5f 4b 45 59 29 20 2a 2f 0a  FOREIGN_KEY) */.
10f60 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
10f70 74 44 65 6c 65 74 65 28 70 46 72 6f 6d 43 6f 6c  tDelete(pFromCol
10f80 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  );.  sqlite3Expr
10f90 4c 69 73 74 44 65 6c 65 74 65 28 70 54 6f 43 6f  ListDelete(pToCo
10fa0 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  l);.}../*.** Thi
10fb0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
10fc0 6c 65 64 20 77 68 65 6e 20 61 6e 20 49 4e 49 54  led when an INIT
10fd0 49 41 4c 4c 59 20 49 4d 4d 45 44 49 41 54 45 20  IALLY IMMEDIATE 
10fe0 6f 72 20 49 4e 49 54 49 41 4c 4c 59 20 44 45 46  or INITIALLY DEF
10ff0 45 52 52 45 44 0a 2a 2a 20 63 6c 61 75 73 65 20  ERRED.** clause 
11000 69 73 20 73 65 65 6e 20 61 73 20 70 61 72 74 20  is seen as part 
11010 6f 66 20 61 20 66 6f 72 65 69 67 6e 20 6b 65 79  of a foreign key
11020 20 64 65 66 69 6e 69 74 69 6f 6e 2e 20 20 54 68   definition.  Th
11030 65 20 69 73 44 65 66 65 72 72 65 64 0a 2a 2a 20  e isDeferred.** 
11040 70 61 72 61 6d 65 74 65 72 20 69 73 20 31 20 66  parameter is 1 f
11050 6f 72 20 49 4e 49 54 49 41 4c 4c 59 20 44 45 46  or INITIALLY DEF
11060 45 52 52 45 44 20 61 6e 64 20 30 20 66 6f 72 20  ERRED and 0 for 
11070 49 4e 49 54 49 41 4c 4c 59 20 49 4d 4d 45 44 49  INITIALLY IMMEDI
11080 41 54 45 2e 0a 2a 2a 20 54 68 65 20 62 65 68 61  ATE..** The beha
11090 76 69 6f 72 20 6f 66 20 74 68 65 20 6d 6f 73 74  vior of the most
110a0 20 72 65 63 65 6e 74 6c 79 20 63 72 65 61 74 65   recently create
110b0 64 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 69 73  d foreign key is
110c0 20 61 64 6a 75 73 74 65 64 0a 2a 2a 20 61 63 63   adjusted.** acc
110d0 6f 72 64 69 6e 67 6c 79 2e 0a 2a 2f 0a 76 6f 69  ordingly..*/.voi
110e0 64 20 73 71 6c 69 74 65 33 44 65 66 65 72 46 6f  d sqlite3DeferFo
110f0 72 65 69 67 6e 4b 65 79 28 50 61 72 73 65 20 2a  reignKey(Parse *
11100 70 50 61 72 73 65 2c 20 69 6e 74 20 69 73 44 65  pParse, int isDe
11110 66 65 72 72 65 64 29 7b 0a 23 69 66 6e 64 65 66  ferred){.#ifndef
11120 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52   SQLITE_OMIT_FOR
11130 45 49 47 4e 5f 4b 45 59 0a 20 20 54 61 62 6c 65  EIGN_KEY.  Table
11140 20 2a 70 54 61 62 3b 0a 20 20 46 4b 65 79 20 2a   *pTab;.  FKey *
11150 70 46 4b 65 79 3b 0a 20 20 69 66 28 20 28 70 54  pFKey;.  if( (pT
11160 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65  ab = pParse->pNe
11170 77 54 61 62 6c 65 29 3d 3d 30 20 7c 7c 20 28 70  wTable)==0 || (p
11180 46 4b 65 79 20 3d 20 70 54 61 62 2d 3e 70 46 4b  FKey = pTab->pFK
11190 65 79 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ey)==0 ) return;
111a0 0a 20 20 70 46 4b 65 79 2d 3e 69 73 44 65 66 65  .  pFKey->isDefe
111b0 72 72 65 64 20 3d 20 69 73 44 65 66 65 72 72 65  rred = isDeferre
111c0 64 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a  d;.#endif.}../*.
111d0 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
111e0 20 74 68 61 74 20 77 69 6c 6c 20 65 72 61 73 65   that will erase
111f0 20 61 6e 64 20 72 65 66 69 6c 6c 20 69 6e 64 65   and refill inde
11200 78 20 2a 70 49 64 78 2e 20 20 54 68 69 73 20 69  x *pIdx.  This i
11210 73 0a 2a 2a 20 75 73 65 64 20 74 6f 20 69 6e 69  s.** used to ini
11220 74 69 61 6c 69 7a 65 20 61 20 6e 65 77 6c 79 20  tialize a newly 
11230 63 72 65 61 74 65 64 20 69 6e 64 65 78 20 6f 72  created index or
11240 20 74 6f 20 72 65 63 6f 6d 70 75 74 65 20 74 68   to recompute th
11250 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20 6f 66 20  e.** content of 
11260 61 6e 20 69 6e 64 65 78 20 69 6e 20 72 65 73 70  an index in resp
11270 6f 6e 73 65 20 74 6f 20 61 20 52 45 49 4e 44 45  onse to a REINDE
11280 58 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a  X command..**.**
11290 20 69 66 20 6d 65 6d 52 6f 6f 74 50 61 67 65 20   if memRootPage 
112a0 69 73 20 6e 6f 74 20 6e 65 67 61 74 69 76 65 2c  is not negative,
112b0 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74   it means that t
112c0 68 65 20 69 6e 64 65 78 20 69 73 20 6e 65 77 6c  he index is newl
112d0 79 0a 2a 2a 20 63 72 65 61 74 65 64 2e 20 20 54  y.** created.  T
112e0 68 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 73  he memory cell s
112f0 70 65 63 69 66 69 65 64 20 62 79 20 6d 65 6d 52  pecified by memR
11300 6f 6f 74 50 61 67 65 20 63 6f 6e 74 61 69 6e 73  ootPage contains
11310 20 74 68 65 0a 2a 2a 20 72 6f 6f 74 20 70 61 67   the.** root pag
11320 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  e number of the 
11330 69 6e 64 65 78 2e 20 20 49 66 20 6d 65 6d 52 6f  index.  If memRo
11340 6f 74 50 61 67 65 20 69 73 20 6e 65 67 61 74 69  otPage is negati
11350 76 65 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20  ve, then.** the 
11360 69 6e 64 65 78 20 61 6c 72 65 61 64 79 20 65 78  index already ex
11370 69 73 74 73 20 61 6e 64 20 6d 75 73 74 20 62 65  ists and must be
11380 20 63 6c 65 61 72 65 64 20 62 65 66 6f 72 65 20   cleared before 
11390 62 65 69 6e 67 20 72 65 66 69 6c 6c 65 64 20 61  being refilled a
113a0 6e 64 0a 2a 2a 20 74 68 65 20 72 6f 6f 74 20 70  nd.** the root p
113b0 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68  age number of th
113c0 65 20 69 6e 64 65 78 20 69 73 20 74 61 6b 65 6e  e index is taken
113d0 20 66 72 6f 6d 20 70 49 6e 64 65 78 2d 3e 74 6e   from pIndex->tn
113e0 75 6d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  um..*/.static vo
113f0 69 64 20 73 71 6c 69 74 65 33 52 65 66 69 6c 6c  id sqlite3Refill
11400 49 6e 64 65 78 28 50 61 72 73 65 20 2a 70 50 61  Index(Parse *pPa
11410 72 73 65 2c 20 49 6e 64 65 78 20 2a 70 49 6e 64  rse, Index *pInd
11420 65 78 2c 20 69 6e 74 20 6d 65 6d 52 6f 6f 74 50  ex, int memRootP
11430 61 67 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70  age){.  Table *p
11440 54 61 62 20 3d 20 70 49 6e 64 65 78 2d 3e 70 54  Tab = pIndex->pT
11450 61 62 6c 65 3b 20 20 2f 2a 20 54 68 65 20 74 61  able;  /* The ta
11460 62 6c 65 20 74 68 61 74 20 69 73 20 69 6e 64 65  ble that is inde
11470 78 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61  xed */.  int iTa
11480 62 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  b = pParse->nTab
11490 3b 20 20 20 20 20 20 20 2f 2a 20 42 74 72 65 65  ;       /* Btree
114a0 20 63 75 72 73 6f 72 20 75 73 65 64 20 66 6f 72   cursor used for
114b0 20 70 54 61 62 20 2a 2f 0a 20 20 69 6e 74 20 69   pTab */.  int i
114c0 49 64 78 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  Idx = pParse->nT
114d0 61 62 2b 31 3b 20 20 20 20 20 2f 2a 20 42 74 72  ab+1;     /* Btr
114e0 65 65 20 63 75 72 73 6f 72 20 75 73 65 64 20 66  ee cursor used f
114f0 6f 72 20 70 49 6e 64 65 78 20 2a 2f 0a 20 20 69  or pIndex */.  i
11500 6e 74 20 61 64 64 72 31 3b 20 20 20 20 20 20 20  nt addr1;       
11510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
11520 20 41 64 64 72 65 73 73 20 6f 66 20 74 6f 70 20   Address of top 
11530 6f 66 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74  of loop */.  int
11540 20 74 6e 75 6d 3b 20 20 20 20 20 20 20 20 20 20   tnum;          
11550 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
11560 6f 6f 74 20 70 61 67 65 20 6f 66 20 69 6e 64 65  oot page of inde
11570 78 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20  x */.  Vdbe *v; 
11580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11590 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74        /* Generat
115a0 65 20 63 6f 64 65 20 69 6e 74 6f 20 74 68 69 73  e code into this
115b0 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65   virtual machine
115c0 20 2a 2f 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70   */.  KeyInfo *p
115d0 4b 65 79 3b 20 20 20 20 20 20 20 20 20 20 20 20  Key;            
115e0 20 20 20 20 20 2f 2a 20 4b 65 79 49 6e 66 6f 20       /* KeyInfo 
115f0 66 6f 72 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69  for index */.  i
11600 6e 74 20 72 65 67 49 64 78 4b 65 79 3b 20 20 20  nt regIdxKey;   
11610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
11620 20 52 65 67 69 73 74 65 72 73 20 63 6f 6e 74 61   Registers conta
11630 69 6e 69 6e 67 20 74 68 65 20 69 6e 64 65 78 20  ining the index 
11640 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  key */.  int reg
11650 52 65 63 6f 72 64 3b 20 20 20 20 20 20 20 20 20  Record;         
11660 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73          /* Regis
11670 74 65 72 20 68 6f 6c 64 69 6e 67 20 61 73 73 65  ter holding asse
11680 6d 62 6c 69 65 64 20 69 6e 64 65 78 20 72 65 63  mblied index rec
11690 6f 72 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ord */.  sqlite3
116a0 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
116b0 62 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64  b;      /* The d
116c0 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
116d0 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62 20  on */.  int iDb 
116e0 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54  = sqlite3SchemaT
116f0 6f 49 6e 64 65 78 28 64 62 2c 20 70 49 6e 64 65  oIndex(db, pInde
11700 78 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 0a 23 69  x->pSchema);..#i
11710 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
11720 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a  T_AUTHORIZATION.
11730 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74    if( sqlite3Aut
11740 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53  hCheck(pParse, S
11750 51 4c 49 54 45 5f 52 45 49 4e 44 45 58 2c 20 70  QLITE_REINDEX, p
11760 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 30 2c  Index->zName, 0,
11770 0a 20 20 20 20 20 20 64 62 2d 3e 61 44 62 5b 69  .      db->aDb[i
11780 44 62 5d 2e 7a 4e 61 6d 65 20 29 20 29 7b 0a 20  Db].zName ) ){. 
11790 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 23     return;.  }.#
117a0 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 52 65 71 75  endif..  /* Requ
117b0 69 72 65 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b  ire a write-lock
117c0 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 20 74 6f   on the table to
117d0 20 70 65 72 66 6f 72 6d 20 74 68 69 73 20 6f 70   perform this op
117e0 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 73 71 6c  eration */.  sql
117f0 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28 70 50  ite3TableLock(pP
11800 61 72 73 65 2c 20 69 44 62 2c 20 70 54 61 62 2d  arse, iDb, pTab-
11810 3e 74 6e 75 6d 2c 20 31 2c 20 70 54 61 62 2d 3e  >tnum, 1, pTab->
11820 7a 4e 61 6d 65 29 3b 0a 0a 20 20 76 20 3d 20 73  zName);..  v = s
11830 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
11840 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76 3d 3d  arse);.  if( v==
11850 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66  0 ) return;.  if
11860 28 20 6d 65 6d 52 6f 6f 74 50 61 67 65 3e 3d 30  ( memRootPage>=0
11870 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
11880 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
11890 53 43 6f 70 79 2c 20 6d 65 6d 52 6f 6f 74 50 61  SCopy, memRootPa
118a0 67 65 29 3b 0a 20 20 20 20 74 6e 75 6d 20 3d 20  ge);.    tnum = 
118b0 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  0;.  }else{.    
118c0 74 6e 75 6d 20 3d 20 70 49 6e 64 65 78 2d 3e 74  tnum = pIndex->t
118d0 6e 75 6d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  num;.    sqlite3
118e0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
118f0 5f 43 6c 65 61 72 2c 20 74 6e 75 6d 2c 20 69 44  _Clear, tnum, iD
11900 62 29 3b 0a 20 20 7d 0a 20 20 70 4b 65 79 20 3d  b);.  }.  pKey =
11910 20 73 71 6c 69 74 65 33 49 6e 64 65 78 4b 65 79   sqlite3IndexKey
11920 69 6e 66 6f 28 70 50 61 72 73 65 2c 20 70 49 6e  info(pParse, pIn
11930 64 65 78 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  dex);.  sqlite3V
11940 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
11950 4f 70 65 6e 57 72 69 74 65 2c 20 69 49 64 78 2c  OpenWrite, iIdx,
11960 20 74 6e 75 6d 2c 20 69 44 62 2c 20 0a 20 20 20   tnum, iDb, .   
11970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11980 20 28 63 68 61 72 20 2a 29 70 4b 65 79 2c 20 50   (char *)pKey, P
11990 34 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46  4_KEYINFO_HANDOF
119a0 46 29 3b 0a 20 20 69 66 28 20 6d 65 6d 52 6f 6f  F);.  if( memRoo
119b0 74 50 61 67 65 3e 3d 30 20 29 7b 0a 20 20 20 20  tPage>=0 ){.    
119c0 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
119d0 65 50 35 28 76 2c 20 31 29 3b 0a 20 20 7d 0a 20  eP5(v, 1);.  }. 
119e0 20 73 71 6c 69 74 65 33 4f 70 65 6e 54 61 62 6c   sqlite3OpenTabl
119f0 65 28 70 50 61 72 73 65 2c 20 69 54 61 62 2c 20  e(pParse, iTab, 
11a00 69 44 62 2c 20 70 54 61 62 2c 20 4f 50 5f 4f 70  iDb, pTab, OP_Op
11a10 65 6e 52 65 61 64 29 3b 0a 20 20 61 64 64 72 31  enRead);.  addr1
11a20 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
11a30 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e  dOp2(v, OP_Rewin
11a40 64 2c 20 69 54 61 62 2c 20 30 29 3b 0a 20 20 72  d, iTab, 0);.  r
11a50 65 67 52 65 63 6f 72 64 20 3d 20 73 71 6c 69 74  egRecord = sqlit
11a60 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
11a70 72 73 65 29 3b 0a 20 20 72 65 67 49 64 78 4b 65  rse);.  regIdxKe
11a80 79 20 3d 20 73 71 6c 69 74 65 33 47 65 6e 65 72  y = sqlite3Gener
11a90 61 74 65 49 6e 64 65 78 4b 65 79 28 70 50 61 72  ateIndexKey(pPar
11aa0 73 65 2c 20 70 49 6e 64 65 78 2c 20 69 54 61 62  se, pIndex, iTab
11ab0 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20  , regRecord);.  
11ac0 69 66 28 20 70 49 6e 64 65 78 2d 3e 6f 6e 45 72  if( pIndex->onEr
11ad0 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 20 29 7b 0a  ror!=OE_None ){.
11ae0 20 20 20 20 69 6e 74 20 6a 31 2c 20 6a 32 3b 0a      int j1, j2;.
11af0 20 20 20 20 69 6e 74 20 72 65 67 52 6f 77 69 64      int regRowid
11b00 3b 0a 0a 20 20 20 20 72 65 67 52 6f 77 69 64 20  ;..    regRowid 
11b10 3d 20 72 65 67 49 64 78 4b 65 79 20 2b 20 70 49  = regIdxKey + pI
11b20 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 0a 20  ndex->nColumn;. 
11b30 20 20 20 6a 31 20 3d 20 73 71 6c 69 74 65 33 56     j1 = sqlite3V
11b40 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
11b50 49 73 4e 75 6c 6c 2c 20 72 65 67 49 64 78 4b 65  IsNull, regIdxKe
11b60 79 2c 20 30 2c 20 70 49 6e 64 65 78 2d 3e 6e 43  y, 0, pIndex->nC
11b70 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 6a 32 20 3d  olumn);.    j2 =
11b80 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
11b90 70 34 28 76 2c 20 4f 50 5f 49 73 55 6e 69 71 75  p4(v, OP_IsUniqu
11ba0 65 2c 20 69 49 64 78 2c 0a 20 20 20 20 20 20 20  e, iIdx,.       
11bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11bc0 20 20 20 20 30 2c 20 72 65 67 52 6f 77 69 64 2c      0, regRowid,
11bd0 20 28 63 68 61 72 2a 29 72 65 67 52 65 63 6f 72   (char*)regRecor
11be0 64 2c 20 50 34 5f 49 4e 54 33 32 29 3b 0a 20 20  d, P4_INT32);.  
11bf0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
11c00 4f 70 34 28 76 2c 20 4f 50 5f 48 61 6c 74 2c 20  Op4(v, OP_Halt, 
11c10 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
11c20 54 2c 20 4f 45 5f 41 62 6f 72 74 2c 20 30 2c 0a  T, OE_Abort, 0,.
11c30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11c40 20 20 20 20 22 69 6e 64 65 78 65 64 20 63 6f 6c      "indexed col
11c50 75 6d 6e 73 20 61 72 65 20 6e 6f 74 20 75 6e 69  umns are not uni
11c60 71 75 65 22 2c 20 50 34 5f 53 54 41 54 49 43 29  que", P4_STATIC)
11c70 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
11c80 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a 31 29  eJumpHere(v, j1)
11c90 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
11ca0 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a 32 29  eJumpHere(v, j2)
11cb0 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56  ;.  }.  sqlite3V
11cc0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
11cd0 49 64 78 49 6e 73 65 72 74 2c 20 69 49 64 78 2c  IdxInsert, iIdx,
11ce0 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 73   regRecord);.  s
11cf0 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
11d00 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67  pReg(pParse, reg
11d10 52 65 63 6f 72 64 29 3b 0a 20 20 73 71 6c 69 74  Record);.  sqlit
11d20 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
11d30 4f 50 5f 4e 65 78 74 2c 20 69 54 61 62 2c 20 61  OP_Next, iTab, a
11d40 64 64 72 31 2b 31 29 3b 0a 20 20 73 71 6c 69 74  ddr1+1);.  sqlit
11d50 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
11d60 2c 20 61 64 64 72 31 29 3b 0a 20 20 73 71 6c 69  , addr1);.  sqli
11d70 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
11d80 20 4f 50 5f 43 6c 6f 73 65 2c 20 69 54 61 62 29   OP_Close, iTab)
11d90 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
11da0 64 64 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73  ddOp1(v, OP_Clos
11db0 65 2c 20 69 49 64 78 29 3b 0a 7d 0a 0a 2f 2a 0a  e, iIdx);.}../*.
11dc0 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20  ** Create a new 
11dd0 69 6e 64 65 78 20 66 6f 72 20 61 6e 20 53 51 4c  index for an SQL
11de0 20 74 61 62 6c 65 2e 20 20 70 4e 61 6d 65 31 2e   table.  pName1.
11df0 70 4e 61 6d 65 32 20 69 73 20 74 68 65 20 6e 61  pName2 is the na
11e00 6d 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20  me of the index 
11e10 0a 2a 2a 20 61 6e 64 20 70 54 62 6c 4c 69 73 74  .** and pTblList
11e20 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20   is the name of 
11e30 74 68 65 20 74 61 62 6c 65 20 74 68 61 74 20 69  the table that i
11e40 73 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64 2e  s to be indexed.
11e50 20 20 42 6f 74 68 20 77 69 6c 6c 20 0a 2a 2a 20    Both will .** 
11e60 62 65 20 4e 55 4c 4c 20 66 6f 72 20 61 20 70 72  be NULL for a pr
11e70 69 6d 61 72 79 20 6b 65 79 20 6f 72 20 61 6e 20  imary key or an 
11e80 69 6e 64 65 78 20 74 68 61 74 20 69 73 20 63 72  index that is cr
11e90 65 61 74 65 64 20 74 6f 20 73 61 74 69 73 66 79  eated to satisfy
11ea0 20 61 0a 2a 2a 20 55 4e 49 51 55 45 20 63 6f 6e   a.** UNIQUE con
11eb0 73 74 72 61 69 6e 74 2e 20 20 49 66 20 70 54 61  straint.  If pTa
11ec0 62 6c 65 20 61 6e 64 20 70 49 6e 64 65 78 20 61  ble and pIndex a
11ed0 72 65 20 4e 55 4c 4c 2c 20 75 73 65 20 70 50 61  re NULL, use pPa
11ee0 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 0a 2a  rse->pNewTable.*
11ef0 2a 20 61 73 20 74 68 65 20 74 61 62 6c 65 20 74  * as the table t
11f00 6f 20 62 65 20 69 6e 64 65 78 65 64 2e 20 20 70  o be indexed.  p
11f10 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
11f20 20 69 73 20 61 20 74 61 62 6c 65 20 74 68 61 74   is a table that
11f30 20 69 73 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79   is.** currently
11f40 20 62 65 69 6e 67 20 63 6f 6e 73 74 72 75 63 74   being construct
11f50 65 64 20 62 79 20 61 20 43 52 45 41 54 45 20 54  ed by a CREATE T
11f60 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a  ABLE statement..
11f70 2a 2a 0a 2a 2a 20 70 4c 69 73 74 20 69 73 20 61  **.** pList is a
11f80 20 6c 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73   list of columns
11f90 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64 2e 20   to be indexed. 
11fa0 20 70 4c 69 73 74 20 77 69 6c 6c 20 62 65 20 4e   pList will be N
11fb0 55 4c 4c 20 69 66 20 74 68 69 73 0a 2a 2a 20 69  ULL if this.** i
11fc0 73 20 61 20 70 72 69 6d 61 72 79 20 6b 65 79 20  s a primary key 
11fd0 6f 72 20 75 6e 69 71 75 65 2d 63 6f 6e 73 74 72  or unique-constr
11fe0 61 69 6e 74 20 6f 6e 20 74 68 65 20 6d 6f 73 74  aint on the most
11ff0 20 72 65 63 65 6e 74 20 63 6f 6c 75 6d 6e 20 61   recent column a
12000 64 64 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20 74  dded.** to the t
12010 61 62 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 75  able currently u
12020 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f  nder constructio
12030 6e 2e 20 20 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  n.  .*/.void sql
12040 69 74 65 33 43 72 65 61 74 65 49 6e 64 65 78 28  ite3CreateIndex(
12050 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
12060 2c 20 20 20 20 20 2f 2a 20 41 6c 6c 20 69 6e 66  ,     /* All inf
12070 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74  ormation about t
12080 68 69 73 20 70 61 72 73 65 20 2a 2f 0a 20 20 54  his parse */.  T
12090 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c 20 20 20  oken *pName1,   
120a0 20 20 2f 2a 20 46 69 72 73 74 20 70 61 72 74 20    /* First part 
120b0 6f 66 20 69 6e 64 65 78 20 6e 61 6d 65 2e 20 4d  of index name. M
120c0 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20  ay be NULL */.  
120d0 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32 2c 20 20  Token *pName2,  
120e0 20 20 20 2f 2a 20 53 65 63 6f 6e 64 20 70 61 72     /* Second par
120f0 74 20 6f 66 20 69 6e 64 65 78 20 6e 61 6d 65 2e  t of index name.
12100 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a   May be NULL */.
12110 20 20 53 72 63 4c 69 73 74 20 2a 70 54 62 6c 4e    SrcList *pTblN
12120 61 6d 65 2c 20 2f 2a 20 54 61 62 6c 65 20 74 6f  ame, /* Table to
12130 20 69 6e 64 65 78 2e 20 55 73 65 20 70 50 61 72   index. Use pPar
12140 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 69 66  se->pNewTable if
12150 20 30 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74   0 */.  ExprList
12160 20 2a 70 4c 69 73 74 2c 20 20 20 2f 2a 20 41 20   *pList,   /* A 
12170 6c 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  list of columns 
12180 74 6f 20 62 65 20 69 6e 64 65 78 65 64 20 2a 2f  to be indexed */
12190 0a 20 20 69 6e 74 20 6f 6e 45 72 72 6f 72 2c 20  .  int onError, 
121a0 20 20 20 20 20 20 2f 2a 20 4f 45 5f 41 62 6f 72        /* OE_Abor
121b0 74 2c 20 4f 45 5f 49 67 6e 6f 72 65 2c 20 4f 45  t, OE_Ignore, OE
121c0 5f 52 65 70 6c 61 63 65 2c 20 6f 72 20 4f 45 5f  _Replace, or OE_
121d0 4e 6f 6e 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  None */.  Token 
121e0 2a 70 53 74 61 72 74 2c 20 20 20 20 20 2f 2a 20  *pStart,     /* 
121f0 54 68 65 20 43 52 45 41 54 45 20 74 6f 6b 65 6e  The CREATE token
12200 20 74 68 61 74 20 62 65 67 69 6e 73 20 74 68 69   that begins thi
12210 73 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20  s statement */. 
12220 20 54 6f 6b 65 6e 20 2a 70 45 6e 64 2c 20 20 20   Token *pEnd,   
12230 20 20 20 20 2f 2a 20 54 68 65 20 22 29 22 20 74      /* The ")" t
12240 68 61 74 20 63 6c 6f 73 65 73 20 74 68 65 20 43  hat closes the C
12250 52 45 41 54 45 20 49 4e 44 45 58 20 73 74 61 74  REATE INDEX stat
12260 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 73  ement */.  int s
12270 6f 72 74 4f 72 64 65 72 2c 20 20 20 20 20 2f 2a  ortOrder,     /*
12280 20 53 6f 72 74 20 6f 72 64 65 72 20 6f 66 20 70   Sort order of p
12290 72 69 6d 61 72 79 20 6b 65 79 20 77 68 65 6e 20  rimary key when 
122a0 70 4c 69 73 74 3d 3d 4e 55 4c 4c 20 2a 2f 0a 20  pList==NULL */. 
122b0 20 69 6e 74 20 69 66 4e 6f 74 45 78 69 73 74 20   int ifNotExist 
122c0 20 20 20 20 2f 2a 20 4f 6d 69 74 20 65 72 72 6f      /* Omit erro
122d0 72 20 69 66 20 69 6e 64 65 78 20 61 6c 72 65 61  r if index alrea
122e0 64 79 20 65 78 69 73 74 73 20 2a 2f 0a 29 7b 0a  dy exists */.){.
122f0 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20    Table *pTab = 
12300 30 3b 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20  0;     /* Table 
12310 74 6f 20 62 65 20 69 6e 64 65 78 65 64 20 2a 2f  to be indexed */
12320 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78  .  Index *pIndex
12330 20 3d 20 30 3b 20 20 20 2f 2a 20 54 68 65 20 69   = 0;   /* The i
12340 6e 64 65 78 20 74 6f 20 62 65 20 63 72 65 61 74  ndex to be creat
12350 65 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4e  ed */.  char *zN
12360 61 6d 65 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20  ame = 0;     /* 
12370 4e 61 6d 65 20 6f 66 20 74 68 65 20 69 6e 64 65  Name of the inde
12380 78 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e 61 6d 65  x */.  int nName
12390 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  ;           /* N
123a0 75 6d 62 65 72 20 6f 66 20 63 68 61 72 61 63 74  umber of charact
123b0 65 72 73 20 69 6e 20 7a 4e 61 6d 65 20 2a 2f 0a  ers in zName */.
123c0 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 54 6f    int i, j;.  To
123d0 6b 65 6e 20 6e 75 6c 6c 49 64 3b 20 20 20 20 20  ken nullId;     
123e0 20 20 20 2f 2a 20 46 61 6b 65 20 74 6f 6b 65 6e     /* Fake token
123f0 20 66 6f 72 20 61 6e 20 65 6d 70 74 79 20 49 44   for an empty ID
12400 20 6c 69 73 74 20 2a 2f 0a 20 20 44 62 46 69 78   list */.  DbFix
12410 65 72 20 73 46 69 78 3b 20 20 20 20 20 20 20 20  er sFix;        
12420 2f 2a 20 46 6f 72 20 61 73 73 69 67 6e 69 6e 67  /* For assigning
12430 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 73 20   database names 
12440 74 6f 20 70 54 61 62 6c 65 20 2a 2f 0a 20 20 69  to pTable */.  i
12450 6e 74 20 73 6f 72 74 4f 72 64 65 72 4d 61 73 6b  nt sortOrderMask
12460 3b 20 20 20 2f 2a 20 31 20 74 6f 20 68 6f 6e 6f  ;   /* 1 to hono
12470 72 20 44 45 53 43 20 69 6e 20 69 6e 64 65 78 2e  r DESC in index.
12480 20 20 30 20 74 6f 20 69 67 6e 6f 72 65 2e 20 2a    0 to ignore. *
12490 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  /.  sqlite3 *db 
124a0 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
124b0 44 62 20 2a 70 44 62 3b 20 20 20 20 20 20 20 20  Db *pDb;        
124c0 20 20 20 20 20 2f 2a 20 54 68 65 20 73 70 65 63       /* The spec
124d0 69 66 69 63 20 74 61 62 6c 65 20 63 6f 6e 74 61  ific table conta
124e0 69 6e 69 6e 67 20 74 68 65 20 69 6e 64 65 78 65  ining the indexe
124f0 64 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20  d database */.  
12500 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20 20 20  int iDb;        
12510 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
12520 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74 68   the database th
12530 61 74 20 69 73 20 62 65 69 6e 67 20 77 72 69 74  at is being writ
12540 74 65 6e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  ten */.  Token *
12550 70 4e 61 6d 65 20 3d 20 30 3b 20 20 20 20 2f 2a  pName = 0;    /*
12560 20 55 6e 71 75 61 6c 69 66 69 65 64 20 6e 61 6d   Unqualified nam
12570 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 74  e of the index t
12580 6f 20 63 72 65 61 74 65 20 2a 2f 0a 20 20 73 74  o create */.  st
12590 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
125a0 65 6d 20 2a 70 4c 69 73 74 49 74 65 6d 3b 20 2f  em *pListItem; /
125b0 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76  * For looping ov
125c0 65 72 20 70 4c 69 73 74 20 2a 2f 0a 20 20 69 6e  er pList */.  in
125d0 74 20 6e 43 6f 6c 3b 0a 20 20 69 6e 74 20 6e 45  t nCol;.  int nE
125e0 78 74 72 61 20 3d 20 30 3b 0a 20 20 63 68 61 72  xtra = 0;.  char
125f0 20 2a 7a 45 78 74 72 61 3b 0a 0a 20 20 69 66 28   *zExtra;..  if(
12600 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c   pParse->nErr ||
12610 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
12620 64 20 7c 7c 20 49 4e 5f 44 45 43 4c 41 52 45 5f  d || IN_DECLARE_
12630 56 54 41 42 20 29 7b 0a 20 20 20 20 67 6f 74 6f  VTAB ){.    goto
12640 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
12650 65 78 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20  ex;.  }..  /*.  
12660 2a 2a 20 46 69 6e 64 20 74 68 65 20 74 61 62 6c  ** Find the tabl
12670 65 20 74 68 61 74 20 69 73 20 74 6f 20 62 65 20  e that is to be 
12680 69 6e 64 65 78 65 64 2e 20 20 52 65 74 75 72 6e  indexed.  Return
12690 20 65 61 72 6c 79 20 69 66 20 6e 6f 74 20 66 6f   early if not fo
126a0 75 6e 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  und..  */.  if( 
126b0 70 54 62 6c 4e 61 6d 65 21 3d 30 20 29 7b 0a 0a  pTblName!=0 ){..
126c0 20 20 20 20 2f 2a 20 55 73 65 20 74 68 65 20 74      /* Use the t
126d0 77 6f 2d 70 61 72 74 20 69 6e 64 65 78 20 6e 61  wo-part index na
126e0 6d 65 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  me to determine 
126f0 74 68 65 20 64 61 74 61 62 61 73 65 20 0a 20 20  the database .  
12700 20 20 2a 2a 20 74 6f 20 73 65 61 72 63 68 20 66    ** to search f
12710 6f 72 20 74 68 65 20 74 61 62 6c 65 2e 20 27 46  or the table. 'F
12720 69 78 27 20 74 68 65 20 74 61 62 6c 65 20 6e 61  ix' the table na
12730 6d 65 20 74 6f 20 74 68 69 73 20 64 62 0a 20 20  me to this db.  
12740 20 20 2a 2a 20 62 65 66 6f 72 65 20 6c 6f 6f 6b    ** before look
12750 69 6e 67 20 75 70 20 74 68 65 20 74 61 62 6c 65  ing up the table
12760 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73  ..    */.    ass
12770 65 72 74 28 20 70 4e 61 6d 65 31 20 26 26 20 70  ert( pName1 && p
12780 4e 61 6d 65 32 20 29 3b 0a 20 20 20 20 69 44 62  Name2 );.    iDb
12790 20 3d 20 73 71 6c 69 74 65 33 54 77 6f 50 61 72   = sqlite3TwoPar
127a0 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 70 4e  tName(pParse, pN
127b0 61 6d 65 31 2c 20 70 4e 61 6d 65 32 2c 20 26 70  ame1, pName2, &p
127c0 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 69  Name);.    if( i
127d0 44 62 3c 30 20 29 20 67 6f 74 6f 20 65 78 69 74  Db<0 ) goto exit
127e0 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 0a  _create_index;..
127f0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
12800 4d 49 54 5f 54 45 4d 50 44 42 0a 20 20 20 20 2f  MIT_TEMPDB.    /
12810 2a 20 49 66 20 74 68 65 20 69 6e 64 65 78 20 6e  * If the index n
12820 61 6d 65 20 77 61 73 20 75 6e 71 75 61 6c 69 66  ame was unqualif
12830 69 65 64 2c 20 63 68 65 63 6b 20 69 66 20 74 68  ied, check if th
12840 65 20 74 68 65 20 74 61 62 6c 65 0a 20 20 20 20  e the table.    
12850 2a 2a 20 69 73 20 61 20 74 65 6d 70 20 74 61 62  ** is a temp tab
12860 6c 65 2e 20 49 66 20 73 6f 2c 20 73 65 74 20 74  le. If so, set t
12870 68 65 20 64 61 74 61 62 61 73 65 20 74 6f 20 31  he database to 1
12880 2e 20 44 6f 20 6e 6f 74 20 64 6f 20 74 68 69 73  . Do not do this
12890 0a 20 20 20 20 2a 2a 20 69 66 20 69 6e 69 74 69  .    ** if initi
128a0 61 6c 69 73 69 6e 67 20 61 20 64 61 74 61 62 61  alising a databa
128b0 73 65 20 73 63 68 65 6d 61 2e 0a 20 20 20 20 2a  se schema..    *
128c0 2f 0a 20 20 20 20 69 66 28 20 21 64 62 2d 3e 69  /.    if( !db->i
128d0 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20 20 20 20  nit.busy ){.    
128e0 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33    pTab = sqlite3
128f0 53 72 63 4c 69 73 74 4c 6f 6f 6b 75 70 28 70 50  SrcListLookup(pP
12900 61 72 73 65 2c 20 70 54 62 6c 4e 61 6d 65 29 3b  arse, pTblName);
12910 0a 20 20 20 20 20 20 69 66 28 20 70 4e 61 6d 65  .      if( pName
12920 32 20 26 26 20 70 4e 61 6d 65 32 2d 3e 6e 3d 3d  2 && pName2->n==
12930 30 20 26 26 20 70 54 61 62 20 26 26 20 70 54 61  0 && pTab && pTa
12940 62 2d 3e 70 53 63 68 65 6d 61 3d 3d 64 62 2d 3e  b->pSchema==db->
12950 61 44 62 5b 31 5d 2e 70 53 63 68 65 6d 61 20 29  aDb[1].pSchema )
12960 7b 0a 20 20 20 20 20 20 20 20 69 44 62 20 3d 20  {.        iDb = 
12970 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  1;.      }.    }
12980 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 69 66 28  .#endif..    if(
12990 20 73 71 6c 69 74 65 33 46 69 78 49 6e 69 74 28   sqlite3FixInit(
129a0 26 73 46 69 78 2c 20 70 50 61 72 73 65 2c 20 69  &sFix, pParse, i
129b0 44 62 2c 20 22 69 6e 64 65 78 22 2c 20 70 4e 61  Db, "index", pNa
129c0 6d 65 29 20 26 26 0a 20 20 20 20 20 20 20 20 73  me) &&.        s
129d0 71 6c 69 74 65 33 46 69 78 53 72 63 4c 69 73 74  qlite3FixSrcList
129e0 28 26 73 46 69 78 2c 20 70 54 62 6c 4e 61 6d 65  (&sFix, pTblName
129f0 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 2f  ).    ){.      /
12a00 2a 20 42 65 63 61 75 73 65 20 74 68 65 20 70 61  * Because the pa
12a10 72 73 65 72 20 63 6f 6e 73 74 72 75 63 74 73 20  rser constructs 
12a20 70 54 62 6c 4e 61 6d 65 20 66 72 6f 6d 20 61 20  pTblName from a 
12a30 73 69 6e 67 6c 65 20 69 64 65 6e 74 69 66 69 65  single identifie
12a40 72 2c 0a 20 20 20 20 20 20 2a 2a 20 73 71 6c 69  r,.      ** sqli
12a50 74 65 33 46 69 78 53 72 63 4c 69 73 74 20 63 61  te3FixSrcList ca
12a60 6e 20 6e 65 76 65 72 20 66 61 69 6c 2e 20 2a 2f  n never fail. */
12a70 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 30 29  .      assert(0)
12a80 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 54 61 62  ;.    }.    pTab
12a90 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65   = sqlite3Locate
12aa0 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70 54  Table(pParse, pT
12ab0 62 6c 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 4e 61  blName->a[0].zNa
12ac0 6d 65 2c 20 0a 20 20 20 20 20 20 20 20 70 54 62  me, .        pTb
12ad0 6c 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 44 61 74  lName->a[0].zDat
12ae0 61 62 61 73 65 29 3b 0a 20 20 20 20 69 66 28 20  abase);.    if( 
12af0 21 70 54 61 62 20 29 20 67 6f 74 6f 20 65 78 69  !pTab ) goto exi
12b00 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
12b10 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e      assert( db->
12b20 61 44 62 5b 69 44 62 5d 2e 70 53 63 68 65 6d 61  aDb[iDb].pSchema
12b30 3d 3d 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 20  ==pTab->pSchema 
12b40 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
12b50 61 73 73 65 72 74 28 20 70 4e 61 6d 65 3d 3d 30  assert( pName==0
12b60 20 29 3b 0a 20 20 20 20 70 54 61 62 20 3d 20 70   );.    pTab = p
12b70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
12b80 3b 0a 20 20 20 20 69 66 28 20 21 70 54 61 62 20  ;.    if( !pTab 
12b90 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61  ) goto exit_crea
12ba0 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 69 44  te_index;.    iD
12bb0 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d  b = sqlite3Schem
12bc0 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 54 61  aToIndex(db, pTa
12bd0 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 7d  b->pSchema);.  }
12be0 0a 20 20 70 44 62 20 3d 20 26 64 62 2d 3e 61 44  .  pDb = &db->aD
12bf0 62 5b 69 44 62 5d 3b 0a 0a 20 20 69 66 28 20 70  b[iDb];..  if( p
12c00 54 61 62 3d 3d 30 20 7c 7c 20 70 50 61 72 73 65  Tab==0 || pParse
12c10 2d 3e 6e 45 72 72 20 29 20 67 6f 74 6f 20 65 78  ->nErr ) goto ex
12c20 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
12c30 0a 20 20 69 66 28 20 70 54 61 62 2d 3e 72 65 61  .  if( pTab->rea
12c40 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 73 71 6c  dOnly ){.    sql
12c50 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
12c60 72 73 65 2c 20 22 74 61 62 6c 65 20 25 73 20 6d  rse, "table %s m
12c70 61 79 20 6e 6f 74 20 62 65 20 69 6e 64 65 78 65  ay not be indexe
12c80 64 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29  d", pTab->zName)
12c90 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f  ;.    goto exit_
12ca0 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
12cb0 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
12cc0 5f 4f 4d 49 54 5f 56 49 45 57 0a 20 20 69 66 28  _OMIT_VIEW.  if(
12cd0 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 29   pTab->pSelect )
12ce0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
12cf0 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 76  orMsg(pParse, "v
12d00 69 65 77 73 20 6d 61 79 20 6e 6f 74 20 62 65 20  iews may not be 
12d10 69 6e 64 65 78 65 64 22 29 3b 0a 20 20 20 20 67  indexed");.    g
12d20 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
12d30 69 6e 64 65 78 3b 0a 20 20 7d 0a 23 65 6e 64 69  index;.  }.#endi
12d40 66 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  f.#ifndef SQLITE
12d50 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
12d60 4c 45 0a 20 20 69 66 28 20 49 73 56 69 72 74 75  LE.  if( IsVirtu
12d70 61 6c 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20  al(pTab) ){.    
12d80 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
12d90 70 50 61 72 73 65 2c 20 22 76 69 72 74 75 61 6c  pParse, "virtual
12da0 20 74 61 62 6c 65 73 20 6d 61 79 20 6e 6f 74 20   tables may not 
12db0 62 65 20 69 6e 64 65 78 65 64 22 29 3b 0a 20 20  be indexed");.  
12dc0 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61    goto exit_crea
12dd0 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 23 65  te_index;.  }.#e
12de0 6e 64 69 66 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  ndif..  /*.  ** 
12df0 46 69 6e 64 20 74 68 65 20 6e 61 6d 65 20 6f 66  Find the name of
12e00 20 74 68 65 20 69 6e 64 65 78 2e 20 20 4d 61 6b   the index.  Mak
12e10 65 20 73 75 72 65 20 74 68 65 72 65 20 69 73 20  e sure there is 
12e20 6e 6f 74 20 61 6c 72 65 61 64 79 20 61 6e 6f 74  not already anot
12e30 68 65 72 0a 20 20 2a 2a 20 69 6e 64 65 78 20 6f  her.  ** index o
12e40 72 20 74 61 62 6c 65 20 77 69 74 68 20 74 68 65  r table with the
12e50 20 73 61 6d 65 20 6e 61 6d 65 2e 20 20 0a 20 20   same name.  .  
12e60 2a 2a 0a 20 20 2a 2a 20 45 78 63 65 70 74 69 6f  **.  ** Exceptio
12e70 6e 3a 20 20 49 66 20 77 65 20 61 72 65 20 72 65  n:  If we are re
12e80 61 64 69 6e 67 20 74 68 65 20 6e 61 6d 65 73 20  ading the names 
12e90 6f 66 20 70 65 72 6d 61 6e 65 6e 74 20 69 6e 64  of permanent ind
12ea0 69 63 65 73 20 66 72 6f 6d 20 74 68 65 0a 20 20  ices from the.  
12eb0 2a 2a 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  ** sqlite_master
12ec0 20 74 61 62 6c 65 20 28 62 65 63 61 75 73 65 20   table (because 
12ed0 73 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f 63 65  some other proce
12ee0 73 73 20 63 68 61 6e 67 65 64 20 74 68 65 20 73  ss changed the s
12ef0 63 68 65 6d 61 29 20 61 6e 64 0a 20 20 2a 2a 20  chema) and.  ** 
12f00 6f 6e 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78  one of the index
12f10 20 6e 61 6d 65 73 20 63 6f 6c 6c 69 64 65 73 20   names collides 
12f20 77 69 74 68 20 74 68 65 20 6e 61 6d 65 20 6f 66  with the name of
12f30 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62   a temporary tab
12f40 6c 65 20 6f 72 0a 20 20 2a 2a 20 69 6e 64 65 78  le or.  ** index
12f50 2c 20 74 68 65 6e 20 77 65 20 77 69 6c 6c 20 63  , then we will c
12f60 6f 6e 74 69 6e 75 65 20 74 6f 20 70 72 6f 63 65  ontinue to proce
12f70 73 73 20 74 68 69 73 20 69 6e 64 65 78 2e 0a 20  ss this index.. 
12f80 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 70 4e 61 6d   **.  ** If pNam
12f90 65 3d 3d 30 20 69 74 20 6d 65 61 6e 73 20 74 68  e==0 it means th
12fa0 61 74 20 77 65 20 61 72 65 0a 20 20 2a 2a 20 64  at we are.  ** d
12fb0 65 61 6c 69 6e 67 20 77 69 74 68 20 61 20 70 72  ealing with a pr
12fc0 69 6d 61 72 79 20 6b 65 79 20 6f 72 20 55 4e 49  imary key or UNI
12fd0 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 2e 20  QUE constraint. 
12fe0 20 57 65 20 68 61 76 65 20 74 6f 20 69 6e 76 65   We have to inve
12ff0 6e 74 20 6f 75 72 0a 20 20 2a 2a 20 6f 77 6e 20  nt our.  ** own 
13000 6e 61 6d 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  name..  */.  if(
13010 20 70 4e 61 6d 65 20 29 7b 0a 20 20 20 20 7a 4e   pName ){.    zN
13020 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d  ame = sqlite3Nam
13030 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70  eFromToken(db, p
13040 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 53  Name);.    if( S
13050 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65  QLITE_OK!=sqlite
13060 33 52 65 61 64 53 63 68 65 6d 61 28 70 50 61 72  3ReadSchema(pPar
13070 73 65 29 20 29 20 67 6f 74 6f 20 65 78 69 74 5f  se) ) goto exit_
13080 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
13090 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29    if( zName==0 )
130a0 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
130b0 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 69 66 28  e_index;.    if(
130c0 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69   SQLITE_OK!=sqli
130d0 74 65 33 43 68 65 63 6b 4f 62 6a 65 63 74 4e 61  te3CheckObjectNa
130e0 6d 65 28 70 50 61 72 73 65 2c 20 7a 4e 61 6d 65  me(pParse, zName
130f0 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  ) ){.      goto 
13100 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
13110 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  x;.    }.    if(
13120 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20   !db->init.busy 
13130 29 7b 0a 20 20 20 20 20 20 69 66 28 20 53 51 4c  ){.      if( SQL
13140 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52  ITE_OK!=sqlite3R
13150 65 61 64 53 63 68 65 6d 61 28 70 50 61 72 73 65  eadSchema(pParse
13160 29 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72  ) ) goto exit_cr
13170 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20  eate_index;.    
13180 20 20 69 66 28 20 73 71 6c 69 74 65 33 46 69 6e    if( sqlite3Fin
13190 64 54 61 62 6c 65 28 64 62 2c 20 7a 4e 61 6d 65  dTable(db, zName
131a0 2c 20 30 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  , 0)!=0 ){.     
131b0 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
131c0 73 67 28 70 50 61 72 73 65 2c 20 22 74 68 65 72  sg(pParse, "ther
131d0 65 20 69 73 20 61 6c 72 65 61 64 79 20 61 20 74  e is already a t
131e0 61 62 6c 65 20 6e 61 6d 65 64 20 25 73 22 2c 20  able named %s", 
131f0 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  zName);.        
13200 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
13210 5f 69 6e 64 65 78 3b 0a 20 20 20 20 20 20 7d 0a  _index;.      }.
13220 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 71      }.    if( sq
13230 6c 69 74 65 33 46 69 6e 64 49 6e 64 65 78 28 64  lite3FindIndex(d
13240 62 2c 20 7a 4e 61 6d 65 2c 20 70 44 62 2d 3e 7a  b, zName, pDb->z
13250 4e 61 6d 65 29 21 3d 30 20 29 7b 0a 20 20 20 20  Name)!=0 ){.    
13260 20 20 69 66 28 20 21 69 66 4e 6f 74 45 78 69 73    if( !ifNotExis
13270 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  t ){.        sql
13280 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
13290 72 73 65 2c 20 22 69 6e 64 65 78 20 25 73 20 61  rse, "index %s a
132a0 6c 72 65 61 64 79 20 65 78 69 73 74 73 22 2c 20  lready exists", 
132b0 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a  zName);.      }.
132c0 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f        goto exit_
132d0 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
132e0 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
132f0 20 63 68 61 72 20 7a 42 75 66 5b 33 30 5d 3b 0a   char zBuf[30];.
13300 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 49      int n;.    I
13310 6e 64 65 78 20 2a 70 4c 6f 6f 70 3b 0a 20 20 20  ndex *pLoop;.   
13320 20 66 6f 72 28 70 4c 6f 6f 70 3d 70 54 61 62 2d   for(pLoop=pTab-
13330 3e 70 49 6e 64 65 78 2c 20 6e 3d 31 3b 20 70 4c  >pIndex, n=1; pL
13340 6f 6f 70 3b 20 70 4c 6f 6f 70 3d 70 4c 6f 6f 70  oop; pLoop=pLoop
13350 2d 3e 70 4e 65 78 74 2c 20 6e 2b 2b 29 7b 7d 0a  ->pNext, n++){}.
13360 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
13370 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 42 75 66  intf(sizeof(zBuf
13380 29 2c 7a 42 75 66 2c 22 5f 25 64 22 2c 6e 29 3b  ),zBuf,"_%d",n);
13390 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 30 3b 0a  .    zName = 0;.
133a0 20 20 20 20 73 71 6c 69 74 65 33 53 65 74 53 74      sqlite3SetSt
133b0 72 69 6e 67 28 26 7a 4e 61 6d 65 2c 20 22 73 71  ring(&zName, "sq
133c0 6c 69 74 65 5f 61 75 74 6f 69 6e 64 65 78 5f 22  lite_autoindex_"
133d0 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a  , pTab->zName, z
133e0 42 75 66 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a  Buf, (char*)0);.
133f0 20 20 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30      if( zName==0
13400 20 29 7b 0a 20 20 20 20 20 20 64 62 2d 3e 6d 61   ){.      db->ma
13410 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a  llocFailed = 1;.
13420 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f        goto exit_
13430 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
13440 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68    }.  }..  /* Ch
13450 65 63 6b 20 66 6f 72 20 61 75 74 68 6f 72 69 7a  eck for authoriz
13460 61 74 69 6f 6e 20 74 6f 20 63 72 65 61 74 65 20  ation to create 
13470 61 6e 20 69 6e 64 65 78 2e 0a 20 20 2a 2f 0a 23  an index..  */.#
13480 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
13490 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e  IT_AUTHORIZATION
134a0 0a 20 20 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63  .  {.    const c
134b0 68 61 72 20 2a 7a 44 62 20 3d 20 70 44 62 2d 3e  har *zDb = pDb->
134c0 7a 4e 61 6d 65 3b 0a 20 20 20 20 69 66 28 20 73  zName;.    if( s
134d0 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28  qlite3AuthCheck(
134e0 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 49  pParse, SQLITE_I
134f0 4e 53 45 52 54 2c 20 53 43 48 45 4d 41 5f 54 41  NSERT, SCHEMA_TA
13500 42 4c 45 28 69 44 62 29 2c 20 30 2c 20 7a 44 62  BLE(iDb), 0, zDb
13510 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  ) ){.      goto 
13520 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
13530 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 20 3d  x;.    }.    i =
13540 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 49   SQLITE_CREATE_I
13550 4e 44 45 58 3b 0a 20 20 20 20 69 66 28 20 21 4f  NDEX;.    if( !O
13560 4d 49 54 5f 54 45 4d 50 44 42 20 26 26 20 69 44  MIT_TEMPDB && iD
13570 62 3d 3d 31 20 29 20 69 20 3d 20 53 51 4c 49 54  b==1 ) i = SQLIT
13580 45 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f 49 4e  E_CREATE_TEMP_IN
13590 44 45 58 3b 0a 20 20 20 20 69 66 28 20 73 71 6c  DEX;.    if( sql
135a0 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50  ite3AuthCheck(pP
135b0 61 72 73 65 2c 20 69 2c 20 7a 4e 61 6d 65 2c 20  arse, i, zName, 
135c0 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 44 62  pTab->zName, zDb
135d0 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  ) ){.      goto 
135e0 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
135f0 78 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  x;.    }.  }.#en
13600 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20 70 4c 69  dif..  /* If pLi
13610 73 74 3d 3d 30 2c 20 69 74 20 6d 65 61 6e 73 20  st==0, it means 
13620 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 61 73  this routine was
13630 20 63 61 6c 6c 65 64 20 74 6f 20 6d 61 6b 65 20   called to make 
13640 61 20 70 72 69 6d 61 72 79 0a 20 20 2a 2a 20 6b  a primary.  ** k
13650 65 79 20 6f 75 74 20 6f 66 20 74 68 65 20 6c 61  ey out of the la
13660 73 74 20 63 6f 6c 75 6d 6e 20 61 64 64 65 64 20  st column added 
13670 74 6f 20 74 68 65 20 74 61 62 6c 65 20 75 6e 64  to the table und
13680 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e  er construction.
13690 0a 20 20 2a 2a 20 53 6f 20 63 72 65 61 74 65 20  .  ** So create 
136a0 61 20 66 61 6b 65 20 6c 69 73 74 20 74 6f 20 73  a fake list to s
136b0 69 6d 75 6c 61 74 65 20 74 68 69 73 2e 0a 20 20  imulate this..  
136c0 2a 2f 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d  */.  if( pList==
136d0 30 20 29 7b 0a 20 20 20 20 6e 75 6c 6c 49 64 2e  0 ){.    nullId.
136e0 7a 20 3d 20 28 75 38 2a 29 70 54 61 62 2d 3e 61  z = (u8*)pTab->a
136f0 43 6f 6c 5b 70 54 61 62 2d 3e 6e 43 6f 6c 2d 31  Col[pTab->nCol-1
13700 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 6e 75 6c  ].zName;.    nul
13710 6c 49 64 2e 6e 20 3d 20 73 74 72 6c 65 6e 28 28  lId.n = strlen((
13720 63 68 61 72 2a 29 6e 75 6c 6c 49 64 2e 7a 29 3b  char*)nullId.z);
13730 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 73 71 6c  .    pList = sql
13740 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65  ite3ExprListAppe
13750 6e 64 28 70 50 61 72 73 65 2c 20 30 2c 20 30 2c  nd(pParse, 0, 0,
13760 20 26 6e 75 6c 6c 49 64 29 3b 0a 20 20 20 20 69   &nullId);.    i
13770 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 67 6f  f( pList==0 ) go
13780 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
13790 6e 64 65 78 3b 0a 20 20 20 20 70 4c 69 73 74 2d  ndex;.    pList-
137a0 3e 61 5b 30 5d 2e 73 6f 72 74 4f 72 64 65 72 20  >a[0].sortOrder 
137b0 3d 20 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20 7d  = sortOrder;.  }
137c0 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75  ..  /* Figure ou
137d0 74 20 68 6f 77 20 6d 61 6e 79 20 62 79 74 65 73  t how many bytes
137e0 20 6f 66 20 73 70 61 63 65 20 61 72 65 20 72 65   of space are re
137f0 71 75 69 72 65 64 20 74 6f 20 73 74 6f 72 65 20  quired to store 
13800 65 78 70 6c 69 63 69 74 6c 79 0a 20 20 2a 2a 20  explicitly.  ** 
13810 73 70 65 63 69 66 69 65 64 20 63 6f 6c 6c 61 74  specified collat
13820 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 6e 61 6d  ion sequence nam
13830 65 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69  es..  */.  for(i
13840 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78  =0; i<pList->nEx
13850 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78  pr; i++){.    Ex
13860 70 72 20 2a 70 45 78 70 72 20 3d 20 70 4c 69 73  pr *pExpr = pLis
13870 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20  t->a[i].pExpr;. 
13880 20 20 20 69 66 28 20 70 45 78 70 72 20 29 7b 0a     if( pExpr ){.
13890 20 20 20 20 20 20 6e 45 78 74 72 61 20 2b 3d 20        nExtra += 
138a0 28 31 20 2b 20 73 74 72 6c 65 6e 28 70 45 78 70  (1 + strlen(pExp
138b0 72 2d 3e 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29  r->pColl->zName)
138c0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
138d0 2f 2a 20 0a 20 20 2a 2a 20 41 6c 6c 6f 63 61 74  /* .  ** Allocat
138e0 65 20 74 68 65 20 69 6e 64 65 78 20 73 74 72 75  e the index stru
138f0 63 74 75 72 65 2e 20 0a 20 20 2a 2f 0a 20 20 6e  cture. .  */.  n
13900 4e 61 6d 65 20 3d 20 73 74 72 6c 65 6e 28 7a 4e  Name = strlen(zN
13910 61 6d 65 29 3b 0a 20 20 6e 43 6f 6c 20 3d 20 70  ame);.  nCol = p
13920 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 70  List->nExpr;.  p
13930 49 6e 64 65 78 20 3d 20 73 71 6c 69 74 65 33 44  Index = sqlite3D
13940 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20  bMallocZero(db, 
13950 0a 20 20 20 20 20 20 73 69 7a 65 6f 66 28 49 6e  .      sizeof(In
13960 64 65 78 29 20 2b 20 20 20 20 20 20 20 20 20 20  dex) +          
13970 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 73 74 72      /* Index str
13980 75 63 74 75 72 65 20 20 2a 2f 0a 20 20 20 20 20  ucture  */.     
13990 20 73 69 7a 65 6f 66 28 69 6e 74 29 2a 6e 43 6f   sizeof(int)*nCo
139a0 6c 20 2b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  l +           /*
139b0 20 49 6e 64 65 78 2e 61 69 43 6f 6c 75 6d 6e 20   Index.aiColumn 
139c0 20 20 2a 2f 0a 20 20 20 20 20 20 73 69 7a 65 6f    */.      sizeo
139d0 66 28 69 6e 74 29 2a 28 6e 43 6f 6c 2b 31 29 20  f(int)*(nCol+1) 
139e0 2b 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78  +       /* Index
139f0 2e 61 69 52 6f 77 45 73 74 20 20 20 2a 2f 0a 20  .aiRowEst   */. 
13a00 20 20 20 20 20 73 69 7a 65 6f 66 28 63 68 61 72       sizeof(char
13a10 20 2a 29 2a 6e 43 6f 6c 20 2b 20 20 20 20 20 20   *)*nCol +      
13a20 20 20 2f 2a 20 49 6e 64 65 78 2e 61 7a 43 6f 6c    /* Index.azCol
13a30 6c 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73  l     */.      s
13a40 69 7a 65 6f 66 28 75 38 29 2a 6e 43 6f 6c 20 2b  izeof(u8)*nCol +
13a50 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
13a60 6e 64 65 78 2e 61 53 6f 72 74 4f 72 64 65 72 20  ndex.aSortOrder 
13a70 2a 2f 0a 20 20 20 20 20 20 6e 4e 61 6d 65 20 2b  */.      nName +
13a80 20 31 20 2b 20 20 20 20 20 20 20 20 20 20 20 20   1 +            
13a90 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 2e 7a        /* Index.z
13aa0 4e 61 6d 65 20 20 20 20 20 20 2a 2f 0a 20 20 20  Name      */.   
13ab0 20 20 20 6e 45 78 74 72 61 20 20 20 20 20 20 20     nExtra       
13ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13ad0 2f 2a 20 43 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  /* Collation seq
13ae0 75 65 6e 63 65 20 6e 61 6d 65 73 20 2a 2f 0a 20  uence names */. 
13af0 20 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61   );.  if( db->ma
13b00 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
13b10 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61    goto exit_crea
13b20 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20  te_index;.  }.  
13b30 70 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c 20 3d  pIndex->azColl =
13b40 20 28 63 68 61 72 2a 2a 29 28 26 70 49 6e 64 65   (char**)(&pInde
13b50 78 5b 31 5d 29 3b 0a 20 20 70 49 6e 64 65 78 2d  x[1]);.  pIndex-
13b60 3e 61 69 43 6f 6c 75 6d 6e 20 3d 20 28 69 6e 74  >aiColumn = (int
13b70 20 2a 29 28 26 70 49 6e 64 65 78 2d 3e 61 7a 43   *)(&pIndex->azC
13b80 6f 6c 6c 5b 6e 43 6f 6c 5d 29 3b 0a 20 20 70 49  oll[nCol]);.  pI
13b90 6e 64 65 78 2d 3e 61 69 52 6f 77 45 73 74 20 3d  ndex->aiRowEst =
13ba0 20 28 75 6e 73 69 67 6e 65 64 20 2a 29 28 26 70   (unsigned *)(&p
13bb0 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b  Index->aiColumn[
13bc0 6e 43 6f 6c 5d 29 3b 0a 20 20 70 49 6e 64 65 78  nCol]);.  pIndex
13bd0 2d 3e 61 53 6f 72 74 4f 72 64 65 72 20 3d 20 28  ->aSortOrder = (
13be0 75 38 20 2a 29 28 26 70 49 6e 64 65 78 2d 3e 61  u8 *)(&pIndex->a
13bf0 69 52 6f 77 45 73 74 5b 6e 43 6f 6c 2b 31 5d 29  iRowEst[nCol+1])
13c00 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d  ;.  pIndex->zNam
13c10 65 20 3d 20 28 63 68 61 72 20 2a 29 28 26 70 49  e = (char *)(&pI
13c20 6e 64 65 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72  ndex->aSortOrder
13c30 5b 6e 43 6f 6c 5d 29 3b 0a 20 20 7a 45 78 74 72  [nCol]);.  zExtr
13c40 61 20 3d 20 28 63 68 61 72 20 2a 29 28 26 70 49  a = (char *)(&pI
13c50 6e 64 65 78 2d 3e 7a 4e 61 6d 65 5b 6e 4e 61 6d  ndex->zName[nNam
13c60 65 2b 31 5d 29 3b 0a 20 20 6d 65 6d 63 70 79 28  e+1]);.  memcpy(
13c70 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 7a  pIndex->zName, z
13c80 4e 61 6d 65 2c 20 6e 4e 61 6d 65 2b 31 29 3b 0a  Name, nName+1);.
13c90 20 20 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65    pIndex->pTable
13ca0 20 3d 20 70 54 61 62 3b 0a 20 20 70 49 6e 64 65   = pTab;.  pInde
13cb0 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 3d 20 70 4c 69  x->nColumn = pLi
13cc0 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 70 49 6e  st->nExpr;.  pIn
13cd0 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 20 3d 20 6f  dex->onError = o
13ce0 6e 45 72 72 6f 72 3b 0a 20 20 70 49 6e 64 65 78  nError;.  pIndex
13cf0 2d 3e 61 75 74 6f 49 6e 64 65 78 20 3d 20 70 4e  ->autoIndex = pN
13d00 61 6d 65 3d 3d 30 3b 0a 20 20 70 49 6e 64 65 78  ame==0;.  pIndex
13d10 2d 3e 70 53 63 68 65 6d 61 20 3d 20 64 62 2d 3e  ->pSchema = db->
13d20 61 44 62 5b 69 44 62 5d 2e 70 53 63 68 65 6d 61  aDb[iDb].pSchema
13d30 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f  ;..  /* Check to
13d40 20 73 65 65 20 69 66 20 77 65 20 73 68 6f 75 6c   see if we shoul
13d50 64 20 68 6f 6e 6f 72 20 44 45 53 43 20 72 65 71  d honor DESC req
13d60 75 65 73 74 73 20 6f 6e 20 69 6e 64 65 78 20 63  uests on index c
13d70 6f 6c 75 6d 6e 73 0a 20 20 2a 2f 0a 20 20 69 66  olumns.  */.  if
13d80 28 20 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e  ( pDb->pSchema->
13d90 66 69 6c 65 5f 66 6f 72 6d 61 74 3e 3d 34 20 29  file_format>=4 )
13da0 7b 0a 20 20 20 20 73 6f 72 74 4f 72 64 65 72 4d  {.    sortOrderM
13db0 61 73 6b 20 3d 20 2d 31 3b 20 20 20 2f 2a 20 48  ask = -1;   /* H
13dc0 6f 6e 6f 72 20 44 45 53 43 20 2a 2f 0a 20 20 7d  onor DESC */.  }
13dd0 65 6c 73 65 7b 0a 20 20 20 20 73 6f 72 74 4f 72  else{.    sortOr
13de0 64 65 72 4d 61 73 6b 20 3d 20 30 3b 20 20 20 20  derMask = 0;    
13df0 2f 2a 20 49 67 6e 6f 72 65 20 44 45 53 43 20 2a  /* Ignore DESC *
13e00 2f 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 63 61 6e  /.  }..  /* Scan
13e10 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 74 68   the names of th
13e20 65 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65  e columns of the
13e30 20 74 61 62 6c 65 20 74 6f 20 62 65 20 69 6e 64   table to be ind
13e40 65 78 65 64 20 61 6e 64 0a 20 20 2a 2a 20 6c 6f  exed and.  ** lo
13e50 61 64 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69 6e  ad the column in
13e60 64 69 63 65 73 20 69 6e 74 6f 20 74 68 65 20 49  dices into the I
13e70 6e 64 65 78 20 73 74 72 75 63 74 75 72 65 2e 20  ndex structure. 
13e80 20 52 65 70 6f 72 74 20 61 6e 20 65 72 72 6f 72   Report an error
13e90 0a 20 20 2a 2a 20 69 66 20 61 6e 79 20 63 6f 6c  .  ** if any col
13ea0 75 6d 6e 20 69 73 20 6e 6f 74 20 66 6f 75 6e 64  umn is not found
13eb0 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30  ..  */.  for(i=0
13ec0 2c 20 70 4c 69 73 74 49 74 65 6d 3d 70 4c 69 73  , pListItem=pLis
13ed0 74 2d 3e 61 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e  t->a; i<pList->n
13ee0 45 78 70 72 3b 20 69 2b 2b 2c 20 70 4c 69 73 74  Expr; i++, pList
13ef0 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 63 6f 6e  Item++){.    con
13f00 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 4e 61 6d  st char *zColNam
13f10 65 20 3d 20 70 4c 69 73 74 49 74 65 6d 2d 3e 7a  e = pListItem->z
13f20 4e 61 6d 65 3b 0a 20 20 20 20 43 6f 6c 75 6d 6e  Name;.    Column
13f30 20 2a 70 54 61 62 43 6f 6c 3b 0a 20 20 20 20 69   *pTabCol;.    i
13f40 6e 74 20 72 65 71 75 65 73 74 65 64 53 6f 72 74  nt requestedSort
13f50 4f 72 64 65 72 3b 0a 20 20 20 20 63 68 61 72 20  Order;.    char 
13f60 2a 7a 43 6f 6c 6c 3b 20 20 20 20 20 20 20 20 20  *zColl;         
13f70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c            /* Col
13f80 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20  lation sequence 
13f90 6e 61 6d 65 20 2a 2f 0a 0a 20 20 20 20 66 6f 72  name */..    for
13fa0 28 6a 3d 30 2c 20 70 54 61 62 43 6f 6c 3d 70 54  (j=0, pTabCol=pT
13fb0 61 62 2d 3e 61 43 6f 6c 3b 20 6a 3c 70 54 61 62  ab->aCol; j<pTab
13fc0 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 2c 20 70 54 61  ->nCol; j++, pTa
13fd0 62 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 69  bCol++){.      i
13fe0 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  f( sqlite3StrICm
13ff0 70 28 7a 43 6f 6c 4e 61 6d 65 2c 20 70 54 61 62  p(zColName, pTab
14000 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 3d 3d 30 20 29  Col->zName)==0 )
14010 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
14020 20 20 69 66 28 20 6a 3e 3d 70 54 61 62 2d 3e 6e    if( j>=pTab->n
14030 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  Col ){.      sql
14040 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
14050 72 73 65 2c 20 22 74 61 62 6c 65 20 25 73 20 68  rse, "table %s h
14060 61 73 20 6e 6f 20 63 6f 6c 75 6d 6e 20 6e 61 6d  as no column nam
14070 65 64 20 25 73 22 2c 0a 20 20 20 20 20 20 20 20  ed %s",.        
14080 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 43 6f  pTab->zName, zCo
14090 6c 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 67 6f  lName);.      go
140a0 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
140b0 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ndex;.    }.    
140c0 2f 2a 20 54 4f 44 4f 3a 20 20 41 64 64 20 61 20  /* TODO:  Add a 
140d0 74 65 73 74 20 74 6f 20 6d 61 6b 65 20 73 75 72  test to make sur
140e0 65 20 74 68 61 74 20 74 68 65 20 73 61 6d 65 20  e that the same 
140f0 63 6f 6c 75 6d 6e 20 69 73 20 6e 6f 74 20 6e 61  column is not na
14100 6d 65 64 0a 20 20 20 20 2a 2a 20 6d 6f 72 65 20  med.    ** more 
14110 74 68 61 6e 20 6f 6e 63 65 20 77 69 74 68 69 6e  than once within
14120 20 74 68 65 20 73 61 6d 65 20 69 6e 64 65 78 2e   the same index.
14130 20 20 4f 6e 6c 79 20 74 68 65 20 66 69 72 73 74    Only the first
14140 20 69 6e 73 74 61 6e 63 65 20 6f 66 0a 20 20 20   instance of.   
14150 20 2a 2a 20 74 68 65 20 63 6f 6c 75 6d 6e 20 77   ** the column w
14160 69 6c 6c 20 65 76 65 72 20 62 65 20 75 73 65 64  ill ever be used
14170 20 62 79 20 74 68 65 20 6f 70 74 69 6d 69 7a 65   by the optimize
14180 72 2e 20 20 4e 6f 74 65 20 74 68 61 74 20 75 73  r.  Note that us
14190 69 6e 67 20 74 68 65 0a 20 20 20 20 2a 2a 20 73  ing the.    ** s
141a0 61 6d 65 20 63 6f 6c 75 6d 6e 20 6d 6f 72 65 20  ame column more 
141b0 74 68 61 6e 20 6f 6e 63 65 20 63 61 6e 6e 6f 74  than once cannot
141c0 20 62 65 20 61 6e 20 65 72 72 6f 72 20 62 65 63   be an error bec
141d0 61 75 73 65 20 74 68 61 74 20 77 6f 75 6c 64 20  ause that would 
141e0 0a 20 20 20 20 2a 2a 20 62 72 65 61 6b 20 62 61  .    ** break ba
141f0 63 6b 77 61 72 64 73 20 63 6f 6d 70 61 74 69 62  ckwards compatib
14200 69 6c 69 74 79 20 2d 20 69 74 20 6e 65 65 64 73  ility - it needs
14210 20 74 6f 20 62 65 20 61 20 77 61 72 6e 69 6e 67   to be a warning
14220 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 49 6e  ..    */.    pIn
14230 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d  dex->aiColumn[i]
14240 20 3d 20 6a 3b 0a 20 20 20 20 69 66 28 20 70 4c   = j;.    if( pL
14250 69 73 74 49 74 65 6d 2d 3e 70 45 78 70 72 20 29  istItem->pExpr )
14260 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
14270 70 4c 69 73 74 49 74 65 6d 2d 3e 70 45 78 70 72  pListItem->pExpr
14280 2d 3e 70 43 6f 6c 6c 20 29 3b 0a 20 20 20 20 20  ->pColl );.     
14290 20 7a 43 6f 6c 6c 20 3d 20 7a 45 78 74 72 61 3b   zColl = zExtra;
142a0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
142b0 6e 70 72 69 6e 74 66 28 6e 45 78 74 72 61 2c 20  nprintf(nExtra, 
142c0 7a 45 78 74 72 61 2c 20 22 25 73 22 2c 20 70 4c  zExtra, "%s", pL
142d0 69 73 74 49 74 65 6d 2d 3e 70 45 78 70 72 2d 3e  istItem->pExpr->
142e0 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  pColl->zName);. 
142f0 20 20 20 20 20 7a 45 78 74 72 61 20 2b 3d 20 28       zExtra += (
14300 73 74 72 6c 65 6e 28 7a 43 6f 6c 6c 29 20 2b 20  strlen(zColl) + 
14310 31 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  1);.    }else{. 
14320 20 20 20 20 20 7a 43 6f 6c 6c 20 3d 20 70 54 61       zColl = pTa
14330 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 43 6f 6c 6c  b->aCol[j].zColl
14340 3b 0a 20 20 20 20 20 20 69 66 28 20 21 7a 43 6f  ;.      if( !zCo
14350 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 43  ll ){.        zC
14360 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43  oll = db->pDfltC
14370 6f 6c 6c 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20  oll->zName;.    
14380 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
14390 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  ( !db->init.busy
143a0 20 26 26 20 21 73 71 6c 69 74 65 33 4c 6f 63 61   && !sqlite3Loca
143b0 74 65 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  teCollSeq(pParse
143c0 2c 20 7a 43 6f 6c 6c 2c 20 2d 31 29 20 29 7b 0a  , zColl, -1) ){.
143d0 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f        goto exit_
143e0 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
143f0 20 20 7d 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e    }.    pIndex->
14400 61 7a 43 6f 6c 6c 5b 69 5d 20 3d 20 7a 43 6f 6c  azColl[i] = zCol
14410 6c 3b 0a 20 20 20 20 72 65 71 75 65 73 74 65 64  l;.    requested
14420 53 6f 72 74 4f 72 64 65 72 20 3d 20 70 4c 69 73  SortOrder = pLis
14430 74 49 74 65 6d 2d 3e 73 6f 72 74 4f 72 64 65 72  tItem->sortOrder
14440 20 26 20 73 6f 72 74 4f 72 64 65 72 4d 61 73 6b   & sortOrderMask
14450 3b 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e 61 53  ;.    pIndex->aS
14460 6f 72 74 4f 72 64 65 72 5b 69 5d 20 3d 20 72 65  ortOrder[i] = re
14470 71 75 65 73 74 65 64 53 6f 72 74 4f 72 64 65 72  questedSortOrder
14480 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44  ;.  }.  sqlite3D
14490 65 66 61 75 6c 74 52 6f 77 45 73 74 28 70 49 6e  efaultRowEst(pIn
144a0 64 65 78 29 3b 0a 0a 20 20 69 66 28 20 70 54 61  dex);..  if( pTa
144b0 62 3d 3d 70 50 61 72 73 65 2d 3e 70 4e 65 77 54  b==pParse->pNewT
144c0 61 62 6c 65 20 29 7b 0a 20 20 20 20 2f 2a 20 54  able ){.    /* T
144d0 68 69 73 20 72 6f 75 74 69 6e 65 20 68 61 73 20  his routine has 
144e0 62 65 65 6e 20 63 61 6c 6c 65 64 20 74 6f 20 63  been called to c
144f0 72 65 61 74 65 20 61 6e 20 61 75 74 6f 6d 61 74  reate an automat
14500 69 63 20 69 6e 64 65 78 20 61 73 20 61 0a 20 20  ic index as a.  
14510 20 20 2a 2a 20 72 65 73 75 6c 74 20 6f 66 20 61    ** result of a
14520 20 50 52 49 4d 41 52 59 20 4b 45 59 20 6f 72 20   PRIMARY KEY or 
14530 55 4e 49 51 55 45 20 63 6c 61 75 73 65 20 6f 6e  UNIQUE clause on
14540 20 61 20 63 6f 6c 75 6d 6e 20 64 65 66 69 6e 69   a column defini
14550 74 69 6f 6e 2c 20 6f 72 0a 20 20 20 20 2a 2a 20  tion, or.    ** 
14560 61 20 50 52 49 4d 41 52 59 20 4b 45 59 20 6f 72  a PRIMARY KEY or
14570 20 55 4e 49 51 55 45 20 63 6c 61 75 73 65 20 66   UNIQUE clause f
14580 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 63 6f 6c  ollowing the col
14590 75 6d 6e 20 64 65 66 69 6e 69 74 69 6f 6e 73 2e  umn definitions.
145a0 0a 20 20 20 20 2a 2a 20 69 2e 65 2e 20 6f 6e 65  .    ** i.e. one
145b0 20 6f 66 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20   of:.    **.    
145c0 2a 2a 20 43 52 45 41 54 45 20 54 41 42 4c 45 20  ** CREATE TABLE 
145d0 74 28 78 20 50 52 49 4d 41 52 59 20 4b 45 59 2c  t(x PRIMARY KEY,
145e0 20 79 29 3b 0a 20 20 20 20 2a 2a 20 43 52 45 41   y);.    ** CREA
145f0 54 45 20 54 41 42 4c 45 20 74 28 78 2c 20 79 2c  TE TABLE t(x, y,
14600 20 55 4e 49 51 55 45 28 78 2c 20 79 29 29 3b 0a   UNIQUE(x, y));.
14610 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 45 69      **.    ** Ei
14620 74 68 65 72 20 77 61 79 2c 20 63 68 65 63 6b 20  ther way, check 
14630 74 6f 20 73 65 65 20 69 66 20 74 68 65 20 74 61  to see if the ta
14640 62 6c 65 20 61 6c 72 65 61 64 79 20 68 61 73 20  ble already has 
14650 73 75 63 68 20 61 6e 20 69 6e 64 65 78 2e 20 49  such an index. I
14660 66 0a 20 20 20 20 2a 2a 20 73 6f 2c 20 64 6f 6e  f.    ** so, don
14670 27 74 20 62 6f 74 68 65 72 20 63 72 65 61 74 69  't bother creati
14680 6e 67 20 74 68 69 73 20 6f 6e 65 2e 20 54 68 69  ng this one. Thi
14690 73 20 6f 6e 6c 79 20 61 70 70 6c 69 65 73 20 74  s only applies t
146a0 6f 0a 20 20 20 20 2a 2a 20 61 75 74 6f 6d 61 74  o.    ** automat
146b0 69 63 61 6c 6c 79 20 63 72 65 61 74 65 64 20 69  ically created i
146c0 6e 64 69 63 65 73 2e 20 55 73 65 72 73 20 63 61  ndices. Users ca
146d0 6e 20 64 6f 20 61 73 20 74 68 65 79 20 77 69 73  n do as they wis
146e0 68 20 77 69 74 68 0a 20 20 20 20 2a 2a 20 65 78  h with.    ** ex
146f0 70 6c 69 63 69 74 20 69 6e 64 69 63 65 73 2e 0a  plicit indices..
14700 20 20 20 20 2a 2f 0a 20 20 20 20 49 6e 64 65 78      */.    Index
14710 20 2a 70 49 64 78 3b 0a 20 20 20 20 66 6f 72 28   *pIdx;.    for(
14720 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65  pIdx=pTab->pInde
14730 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49  x; pIdx; pIdx=pI
14740 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  dx->pNext){.    
14750 20 20 69 6e 74 20 6b 3b 0a 20 20 20 20 20 20 61    int k;.      a
14760 73 73 65 72 74 28 20 70 49 64 78 2d 3e 6f 6e 45  ssert( pIdx->onE
14770 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 20 29 3b  rror!=OE_None );
14780 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
14790 49 64 78 2d 3e 61 75 74 6f 49 6e 64 65 78 20 29  Idx->autoIndex )
147a0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
147b0 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 21  pIndex->onError!
147c0 3d 4f 45 5f 4e 6f 6e 65 20 29 3b 0a 0a 20 20 20  =OE_None );..   
147d0 20 20 20 69 66 28 20 70 49 64 78 2d 3e 6e 43 6f     if( pIdx->nCo
147e0 6c 75 6d 6e 21 3d 70 49 6e 64 65 78 2d 3e 6e 43  lumn!=pIndex->nC
147f0 6f 6c 75 6d 6e 20 29 20 63 6f 6e 74 69 6e 75 65  olumn ) continue
14800 3b 0a 20 20 20 20 20 20 66 6f 72 28 6b 3d 30 3b  ;.      for(k=0;
14810 20 6b 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e   k<pIdx->nColumn
14820 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; k++){.        
14830 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 31 20 3d  const char *z1 =
14840 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6b 5d   pIdx->azColl[k]
14850 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20  ;.        const 
14860 63 68 61 72 20 2a 7a 32 20 3d 20 70 49 6e 64 65  char *z2 = pInde
14870 78 2d 3e 61 7a 43 6f 6c 6c 5b 6b 5d 3b 0a 20 20  x->azColl[k];.  
14880 20 20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e        if( pIdx->
14890 61 69 43 6f 6c 75 6d 6e 5b 6b 5d 21 3d 70 49 6e  aiColumn[k]!=pIn
148a0 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6b 5d  dex->aiColumn[k]
148b0 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
148c0 20 20 69 66 28 20 70 49 64 78 2d 3e 61 53 6f 72    if( pIdx->aSor
148d0 74 4f 72 64 65 72 5b 6b 5d 21 3d 70 49 6e 64 65  tOrder[k]!=pInde
148e0 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 6b 5d  x->aSortOrder[k]
148f0 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
14900 20 20 69 66 28 20 7a 31 21 3d 7a 32 20 26 26 20    if( z1!=z2 && 
14910 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a  sqlite3StrICmp(z
14920 31 2c 20 7a 32 29 20 29 20 62 72 65 61 6b 3b 0a  1, z2) ) break;.
14930 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
14940 28 20 6b 3d 3d 70 49 64 78 2d 3e 6e 43 6f 6c 75  ( k==pIdx->nColu
14950 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  mn ){.        if
14960 28 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 21  ( pIdx->onError!
14970 3d 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72  =pIndex->onError
14980 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   ){.          /*
14990 20 54 68 69 73 20 63 6f 6e 73 74 72 61 69 6e 74   This constraint
149a0 20 63 72 65 61 74 65 73 20 74 68 65 20 73 61 6d   creates the sam
149b0 65 20 69 6e 64 65 78 20 61 73 20 61 20 70 72 65  e index as a pre
149c0 76 69 6f 75 73 0a 20 20 20 20 20 20 20 20 20 20  vious.          
149d0 2a 2a 20 63 6f 6e 73 74 72 61 69 6e 74 20 73 70  ** constraint sp
149e0 65 63 69 66 69 65 64 20 73 6f 6d 65 77 68 65 72  ecified somewher
149f0 65 20 69 6e 20 74 68 65 20 43 52 45 41 54 45 20  e in the CREATE 
14a00 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e  TABLE statement.
14a10 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 48 6f  .          ** Ho
14a20 77 65 76 65 72 20 74 68 65 20 4f 4e 20 43 4f 4e  wever the ON CON
14a30 46 4c 49 43 54 20 63 6c 61 75 73 65 73 20 61 72  FLICT clauses ar
14a40 65 20 64 69 66 66 65 72 65 6e 74 2e 20 49 66 20  e different. If 
14a50 62 6f 74 68 20 74 68 69 73 20 0a 20 20 20 20 20  both this .     
14a60 20 20 20 20 20 2a 2a 20 63 6f 6e 73 74 72 61 69       ** constrai
14a70 6e 74 20 61 6e 64 20 74 68 65 20 70 72 65 76 69  nt and the previ
14a80 6f 75 73 20 65 71 75 69 76 61 6c 65 6e 74 20 63  ous equivalent c
14a90 6f 6e 73 74 72 61 69 6e 74 20 68 61 76 65 20 65  onstraint have e
14aa0 78 70 6c 69 63 69 74 0a 20 20 20 20 20 20 20 20  xplicit.        
14ab0 20 20 2a 2a 20 4f 4e 20 43 4f 4e 46 4c 49 43 54    ** ON CONFLICT
14ac0 20 63 6c 61 75 73 65 73 20 74 68 69 73 20 69 73   clauses this is
14ad0 20 61 6e 20 65 72 72 6f 72 2e 20 4f 74 68 65 72   an error. Other
14ae0 77 69 73 65 2c 20 75 73 65 20 74 68 65 0a 20 20  wise, use the.  
14af0 20 20 20 20 20 20 20 20 2a 2a 20 65 78 70 6c 69          ** expli
14b00 63 69 74 6c 79 20 73 70 65 63 69 66 69 65 64 20  citly specified 
14b10 62 65 68 61 76 69 6f 75 72 20 66 6f 72 20 74 68  behaviour for th
14b20 65 20 69 6e 64 65 78 2e 0a 20 20 20 20 20 20 20  e index..       
14b30 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20     */.          
14b40 69 66 28 20 21 28 70 49 64 78 2d 3e 6f 6e 45 72  if( !(pIdx->onEr
14b50 72 6f 72 3d 3d 4f 45 5f 44 65 66 61 75 6c 74 20  ror==OE_Default 
14b60 7c 7c 20 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72  || pIndex->onErr
14b70 6f 72 3d 3d 4f 45 5f 44 65 66 61 75 6c 74 29 20  or==OE_Default) 
14b80 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  ){.            s
14b90 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
14ba0 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20  Parse, .        
14bb0 20 20 20 20 20 20 20 20 22 63 6f 6e 66 6c 69 63          "conflic
14bc0 74 69 6e 67 20 4f 4e 20 43 4f 4e 46 4c 49 43 54  ting ON CONFLICT
14bd0 20 63 6c 61 75 73 65 73 20 73 70 65 63 69 66 69   clauses specifi
14be0 65 64 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  ed", 0);.       
14bf0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69     }.          i
14c00 66 28 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72  f( pIdx->onError
14c10 3d 3d 4f 45 5f 44 65 66 61 75 6c 74 20 29 7b 0a  ==OE_Default ){.
14c20 20 20 20 20 20 20 20 20 20 20 20 20 70 49 64 78              pIdx
14c30 2d 3e 6f 6e 45 72 72 6f 72 20 3d 20 70 49 6e 64  ->onError = pInd
14c40 65 78 2d 3e 6f 6e 45 72 72 6f 72 3b 0a 20 20 20  ex->onError;.   
14c50 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
14c60 20 7d 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20   }.        goto 
14c70 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
14c80 78 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  x;.      }.    }
14c90 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 69 6e 6b 20  .  }..  /* Link 
14ca0 74 68 65 20 6e 65 77 20 49 6e 64 65 78 20 73 74  the new Index st
14cb0 72 75 63 74 75 72 65 20 74 6f 20 69 74 73 20 74  ructure to its t
14cc0 61 62 6c 65 20 61 6e 64 20 74 6f 20 74 68 65 20  able and to the 
14cd0 6f 74 68 65 72 0a 20 20 2a 2a 20 69 6e 2d 6d 65  other.  ** in-me
14ce0 6d 6f 72 79 20 64 61 74 61 62 61 73 65 20 73 74  mory database st
14cf0 72 75 63 74 75 72 65 73 2e 20 0a 20 20 2a 2f 0a  ructures. .  */.
14d00 20 20 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62    if( db->init.b
14d10 75 73 79 20 29 7b 0a 20 20 20 20 49 6e 64 65 78  usy ){.    Index
14d20 20 2a 70 3b 0a 20 20 20 20 70 20 3d 20 73 71 6c   *p;.    p = sql
14d30 69 74 65 33 48 61 73 68 49 6e 73 65 72 74 28 26  ite3HashInsert(&
14d40 70 49 6e 64 65 78 2d 3e 70 53 63 68 65 6d 61 2d  pIndex->pSchema-
14d50 3e 69 64 78 48 61 73 68 2c 20 0a 20 20 20 20 20  >idxHash, .     
14d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14d70 20 20 20 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d      pIndex->zNam
14d80 65 2c 20 73 74 72 6c 65 6e 28 70 49 6e 64 65 78  e, strlen(pIndex
14d90 2d 3e 7a 4e 61 6d 65 29 2b 31 2c 20 70 49 6e 64  ->zName)+1, pInd
14da0 65 78 29 3b 0a 20 20 20 20 69 66 28 20 70 20 29  ex);.    if( p )
14db0 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
14dc0 70 3d 3d 70 49 6e 64 65 78 20 29 3b 20 20 2f 2a  p==pIndex );  /*
14dd0 20 4d 61 6c 6c 6f 63 20 6d 75 73 74 20 68 61 76   Malloc must hav
14de0 65 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20 20 20  e failed */.    
14df0 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c    db->mallocFail
14e00 65 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 67 6f  ed = 1;.      go
14e10 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
14e20 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ndex;.    }.    
14e30 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c  db->flags |= SQL
14e40 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65  ITE_InternChange
14e50 73 3b 0a 20 20 20 20 69 66 28 20 70 54 62 6c 4e  s;.    if( pTblN
14e60 61 6d 65 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  ame!=0 ){.      
14e70 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 20 3d 20 64  pIndex->tnum = d
14e80 62 2d 3e 69 6e 69 74 2e 6e 65 77 54 6e 75 6d 3b  b->init.newTnum;
14e90 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
14ea0 20 49 66 20 74 68 65 20 64 62 2d 3e 69 6e 69 74   If the db->init
14eb0 2e 62 75 73 79 20 69 73 20 30 20 74 68 65 6e 20  .busy is 0 then 
14ec0 63 72 65 61 74 65 20 74 68 65 20 69 6e 64 65 78  create the index
14ed0 20 6f 6e 20 64 69 73 6b 2e 20 20 54 68 69 73 0a   on disk.  This.
14ee0 20 20 2a 2a 20 69 6e 76 6f 6c 76 65 73 20 77 72    ** involves wr
14ef0 69 74 69 6e 67 20 74 68 65 20 69 6e 64 65 78 20  iting the index 
14f00 69 6e 74 6f 20 74 68 65 20 6d 61 73 74 65 72 20  into the master 
14f10 74 61 62 6c 65 20 61 6e 64 20 66 69 6c 6c 69 6e  table and fillin
14f20 67 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20 69 6e  g in the.  ** in
14f30 64 65 78 20 77 69 74 68 20 74 68 65 20 63 75 72  dex with the cur
14f40 72 65 6e 74 20 74 61 62 6c 65 20 63 6f 6e 74 65  rent table conte
14f50 6e 74 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  nts..  **.  ** T
14f60 68 65 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  he db->init.busy
14f70 20 69 73 20 30 20 77 68 65 6e 20 74 68 65 20 75   is 0 when the u
14f80 73 65 72 20 66 69 72 73 74 20 65 6e 74 65 72 73  ser first enters
14f90 20 61 20 43 52 45 41 54 45 20 49 4e 44 45 58 20   a CREATE INDEX 
14fa0 0a 20 20 2a 2a 20 63 6f 6d 6d 61 6e 64 2e 20 20  .  ** command.  
14fb0 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 69 73  db->init.busy is
14fc0 20 31 20 77 68 65 6e 20 61 20 64 61 74 61 62 61   1 when a databa
14fd0 73 65 20 69 73 20 6f 70 65 6e 65 64 20 61 6e 64  se is opened and
14fe0 20 0a 20 20 2a 2a 20 43 52 45 41 54 45 20 49 4e   .  ** CREATE IN
14ff0 44 45 58 20 73 74 61 74 65 6d 65 6e 74 73 20 61  DEX statements a
15000 72 65 20 72 65 61 64 20 6f 75 74 20 6f 66 20 74  re read out of t
15010 68 65 20 6d 61 73 74 65 72 20 74 61 62 6c 65 2e  he master table.
15020 20 20 49 6e 0a 20 20 2a 2a 20 74 68 65 20 6c 61    In.  ** the la
15030 74 74 65 72 20 63 61 73 65 20 74 68 65 20 69 6e  tter case the in
15040 64 65 78 20 61 6c 72 65 61 64 79 20 65 78 69 73  dex already exis
15050 74 73 20 6f 6e 20 64 69 73 6b 2c 20 77 68 69 63  ts on disk, whic
15060 68 20 69 73 20 77 68 79 0a 20 20 2a 2a 20 77 65  h is why.  ** we
15070 20 64 6f 6e 27 74 20 77 61 6e 74 20 74 6f 20 72   don't want to r
15080 65 63 72 65 61 74 65 20 69 74 2e 0a 20 20 2a 2a  ecreate it..  **
15090 0a 20 20 2a 2a 20 49 66 20 70 54 62 6c 4e 61 6d  .  ** If pTblNam
150a0 65 3d 3d 30 20 69 74 20 6d 65 61 6e 73 20 74 68  e==0 it means th
150b0 69 73 20 69 6e 64 65 78 20 69 73 20 67 65 6e 65  is index is gene
150c0 72 61 74 65 64 20 61 73 20 61 20 70 72 69 6d 61  rated as a prima
150d0 72 79 20 6b 65 79 0a 20 20 2a 2a 20 6f 72 20 55  ry key.  ** or U
150e0 4e 49 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74  NIQUE constraint
150f0 20 6f 66 20 61 20 43 52 45 41 54 45 20 54 41 42   of a CREATE TAB
15100 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 53  LE statement.  S
15110 69 6e 63 65 20 74 68 65 20 74 61 62 6c 65 0a 20  ince the table. 
15120 20 2a 2a 20 68 61 73 20 6a 75 73 74 20 62 65 65   ** has just bee
15130 6e 20 63 72 65 61 74 65 64 2c 20 69 74 20 63 6f  n created, it co
15140 6e 74 61 69 6e 73 20 6e 6f 20 64 61 74 61 20 61  ntains no data a
15150 6e 64 20 74 68 65 20 69 6e 64 65 78 20 69 6e 69  nd the index ini
15160 74 69 61 6c 69 7a 61 74 69 6f 6e 0a 20 20 2a 2a  tialization.  **
15170 20 73 74 65 70 20 63 61 6e 20 62 65 20 73 6b 69   step can be ski
15180 70 70 65 64 2e 0a 20 20 2a 2f 0a 20 20 65 6c 73  pped..  */.  els
15190 65 20 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62  e if( db->init.b
151a0 75 73 79 3d 3d 30 20 29 7b 0a 20 20 20 20 56 64  usy==0 ){.    Vd
151b0 62 65 20 2a 76 3b 0a 20 20 20 20 63 68 61 72 20  be *v;.    char 
151c0 2a 7a 53 74 6d 74 3b 0a 20 20 20 20 69 6e 74 20  *zStmt;.    int 
151d0 69 4d 65 6d 20 3d 20 2b 2b 70 50 61 72 73 65 2d  iMem = ++pParse-
151e0 3e 6e 4d 65 6d 3b 0a 0a 20 20 20 20 76 20 3d 20  >nMem;..    v = 
151f0 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
15200 50 61 72 73 65 29 3b 0a 20 20 20 20 69 66 28 20  Parse);.    if( 
15210 76 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78 69 74  v==0 ) goto exit
15220 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 0a  _create_index;..
15230 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 74  .    /* Create t
15240 68 65 20 72 6f 6f 74 70 61 67 65 20 66 6f 72 20  he rootpage for 
15250 74 68 65 20 69 6e 64 65 78 0a 20 20 20 20 2a 2f  the index.    */
15260 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69  .    sqlite3Begi
15270 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28  nWriteOperation(
15280 70 50 61 72 73 65 2c 20 31 2c 20 69 44 62 29 3b  pParse, 1, iDb);
15290 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
152a0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 72 65  AddOp2(v, OP_Cre
152b0 61 74 65 49 6e 64 65 78 2c 20 69 44 62 2c 20 69  ateIndex, iDb, i
152c0 4d 65 6d 29 3b 0a 0a 20 20 20 20 2f 2a 20 47 61  Mem);..    /* Ga
152d0 74 68 65 72 20 74 68 65 20 63 6f 6d 70 6c 65 74  ther the complet
152e0 65 20 74 65 78 74 20 6f 66 20 74 68 65 20 43 52  e text of the CR
152f0 45 41 54 45 20 49 4e 44 45 58 20 73 74 61 74 65  EATE INDEX state
15300 6d 65 6e 74 20 69 6e 74 6f 0a 20 20 20 20 2a 2a  ment into.    **
15310 20 74 68 65 20 7a 53 74 6d 74 20 76 61 72 69 61   the zStmt varia
15320 62 6c 65 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ble.    */.    i
15330 66 28 20 70 53 74 61 72 74 20 26 26 20 70 45 6e  f( pStart && pEn
15340 64 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 20  d ){.      /* A 
15350 6e 61 6d 65 64 20 69 6e 64 65 78 20 77 69 74 68  named index with
15360 20 61 6e 20 65 78 70 6c 69 63 69 74 20 43 52 45   an explicit CRE
15370 41 54 45 20 49 4e 44 45 58 20 73 74 61 74 65 6d  ATE INDEX statem
15380 65 6e 74 20 2a 2f 0a 20 20 20 20 20 20 7a 53 74  ent */.      zSt
15390 6d 74 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69  mt = sqlite3MPri
153a0 6e 74 66 28 64 62 2c 20 22 43 52 45 41 54 45 25  ntf(db, "CREATE%
153b0 73 20 49 4e 44 45 58 20 25 2e 2a 73 22 2c 0a 20  s INDEX %.*s",. 
153c0 20 20 20 20 20 20 20 6f 6e 45 72 72 6f 72 3d 3d         onError==
153d0 4f 45 5f 4e 6f 6e 65 20 3f 20 22 22 20 3a 20 22  OE_None ? "" : "
153e0 20 55 4e 49 51 55 45 22 2c 0a 20 20 20 20 20 20   UNIQUE",.      
153f0 20 20 70 45 6e 64 2d 3e 7a 20 2d 20 70 4e 61 6d    pEnd->z - pNam
15400 65 2d 3e 7a 20 2b 20 31 2c 0a 20 20 20 20 20 20  e->z + 1,.      
15410 20 20 70 4e 61 6d 65 2d 3e 7a 29 3b 0a 20 20 20    pName->z);.   
15420 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a   }else{.      /*
15430 20 41 6e 20 61 75 74 6f 6d 61 74 69 63 20 69 6e   An automatic in
15440 64 65 78 20 63 72 65 61 74 65 64 20 62 79 20 61  dex created by a
15450 20 50 52 49 4d 41 52 59 20 4b 45 59 20 6f 72 20   PRIMARY KEY or 
15460 55 4e 49 51 55 45 20 63 6f 6e 73 74 72 61 69 6e  UNIQUE constrain
15470 74 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 7a 53  t */.      /* zS
15480 74 6d 74 20 3d 20 73 71 6c 69 74 65 33 4d 50 72  tmt = sqlite3MPr
15490 69 6e 74 66 28 22 22 29 3b 20 2a 2f 0a 20 20 20  intf(""); */.   
154a0 20 20 20 7a 53 74 6d 74 20 3d 20 30 3b 0a 20 20     zStmt = 0;.  
154b0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 64 64 20    }..    /* Add 
154c0 61 6e 20 65 6e 74 72 79 20 69 6e 20 73 71 6c 69  an entry in sqli
154d0 74 65 5f 6d 61 73 74 65 72 20 66 6f 72 20 74 68  te_master for th
154e0 69 73 20 69 6e 64 65 78 0a 20 20 20 20 2a 2f 0a  is index.    */.
154f0 20 20 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65      sqlite3Neste
15500 64 50 61 72 73 65 28 70 50 61 72 73 65 2c 20 0a  dParse(pParse, .
15510 20 20 20 20 20 20 20 20 22 49 4e 53 45 52 54 20          "INSERT 
15520 49 4e 54 4f 20 25 51 2e 25 73 20 56 41 4c 55 45  INTO %Q.%s VALUE
15530 53 28 27 69 6e 64 65 78 27 2c 25 51 2c 25 51 2c  S('index',%Q,%Q,
15540 23 25 64 2c 25 51 29 3b 22 2c 0a 20 20 20 20 20  #%d,%Q);",.     
15550 20 20 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e     db->aDb[iDb].
15560 7a 4e 61 6d 65 2c 20 53 43 48 45 4d 41 5f 54 41  zName, SCHEMA_TA
15570 42 4c 45 28 69 44 62 29 2c 0a 20 20 20 20 20 20  BLE(iDb),.      
15580 20 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c    pIndex->zName,
15590 0a 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e 7a  .        pTab->z
155a0 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 69 4d  Name,.        iM
155b0 65 6d 2c 0a 20 20 20 20 20 20 20 20 7a 53 74 6d  em,.        zStm
155c0 74 0a 20 20 20 20 29 3b 0a 20 20 20 20 73 71 6c  t.    );.    sql
155d0 69 74 65 33 5f 66 72 65 65 28 7a 53 74 6d 74 29  ite3_free(zStmt)
155e0 3b 0a 0a 20 20 20 20 2f 2a 20 46 69 6c 6c 20 74  ;..    /* Fill t
155f0 68 65 20 69 6e 64 65 78 20 77 69 74 68 20 64 61  he index with da
15600 74 61 20 61 6e 64 20 72 65 70 61 72 73 65 20 74  ta and reparse t
15610 68 65 20 73 63 68 65 6d 61 2e 20 43 6f 64 65 20  he schema. Code 
15620 61 6e 20 4f 50 5f 45 78 70 69 72 65 0a 20 20 20  an OP_Expire.   
15630 20 2a 2a 20 74 6f 20 69 6e 76 61 6c 69 64 61 74   ** to invalidat
15640 65 20 61 6c 6c 20 70 72 65 2d 63 6f 6d 70 69 6c  e all pre-compil
15650 65 64 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 20  ed statements.. 
15660 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 54     */.    if( pT
15670 62 6c 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20  blName ){.      
15680 73 71 6c 69 74 65 33 52 65 66 69 6c 6c 49 6e 64  sqlite3RefillInd
15690 65 78 28 70 50 61 72 73 65 2c 20 70 49 6e 64 65  ex(pParse, pInde
156a0 78 2c 20 69 4d 65 6d 29 3b 0a 20 20 20 20 20 20  x, iMem);.      
156b0 73 71 6c 69 74 65 33 43 68 61 6e 67 65 43 6f 6f  sqlite3ChangeCoo
156c0 6b 69 65 28 64 62 2c 20 76 2c 20 69 44 62 29 3b  kie(db, v, iDb);
156d0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
156e0 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 50  beAddOp4(v, OP_P
156f0 61 72 73 65 53 63 68 65 6d 61 2c 20 69 44 62 2c  arseSchema, iDb,
15700 20 30 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20   0, 0,.         
15710 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64  sqlite3MPrintf(d
15720 62 2c 20 22 6e 61 6d 65 3d 27 25 71 27 22 2c 20  b, "name='%q'", 
15730 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 29 2c 20  pIndex->zName), 
15740 50 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20  P4_DYNAMIC);.   
15750 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
15760 64 4f 70 31 28 76 2c 20 4f 50 5f 45 78 70 69 72  dOp1(v, OP_Expir
15770 65 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  e, 0);.    }.  }
15780 0a 0a 20 20 2f 2a 20 57 68 65 6e 20 61 64 64 69  ..  /* When addi
15790 6e 67 20 61 6e 20 69 6e 64 65 78 20 74 6f 20 74  ng an index to t
157a0 68 65 20 6c 69 73 74 20 6f 66 20 69 6e 64 69 63  he list of indic
157b0 65 73 20 66 6f 72 20 61 20 74 61 62 6c 65 2c 20  es for a table, 
157c0 6d 61 6b 65 0a 20 20 2a 2a 20 73 75 72 65 20 61  make.  ** sure a
157d0 6c 6c 20 69 6e 64 69 63 65 73 20 6c 61 62 65 6c  ll indices label
157e0 65 64 20 4f 45 5f 52 65 70 6c 61 63 65 20 63 6f  ed OE_Replace co
157f0 6d 65 20 61 66 74 65 72 20 61 6c 6c 20 74 68 6f  me after all tho
15800 73 65 20 6c 61 62 65 6c 65 64 0a 20 20 2a 2a 20  se labeled.  ** 
15810 4f 45 5f 49 67 6e 6f 72 65 2e 20 20 54 68 69 73  OE_Ignore.  This
15820 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 66 6f   is necessary fo
15830 72 20 74 68 65 20 63 6f 72 72 65 63 74 20 6f 70  r the correct op
15840 65 72 61 74 69 6f 6e 20 6f 66 20 55 50 44 41 54  eration of UPDAT
15850 45 0a 20 20 2a 2a 20 61 6e 64 20 49 4e 53 45 52  E.  ** and INSER
15860 54 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62  T..  */.  if( db
15870 2d 3e 69 6e 69 74 2e 62 75 73 79 20 7c 7c 20 70  ->init.busy || p
15880 54 62 6c 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20  TblName==0 ){.  
15890 20 20 69 66 28 20 6f 6e 45 72 72 6f 72 21 3d 4f    if( onError!=O
158a0 45 5f 52 65 70 6c 61 63 65 20 7c 7c 20 70 54 61  E_Replace || pTa
158b0 62 2d 3e 70 49 6e 64 65 78 3d 3d 30 0a 20 20 20  b->pIndex==0.   
158c0 20 20 20 20 20 20 7c 7c 20 70 54 61 62 2d 3e 70        || pTab->p
158d0 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d  Index->onError==
158e0 4f 45 5f 52 65 70 6c 61 63 65 29 7b 0a 20 20 20  OE_Replace){.   
158f0 20 20 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74     pIndex->pNext
15900 20 3d 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b   = pTab->pIndex;
15910 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 70 49 6e  .      pTab->pIn
15920 64 65 78 20 3d 20 70 49 6e 64 65 78 3b 0a 20 20  dex = pIndex;.  
15930 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 49    }else{.      I
15940 6e 64 65 78 20 2a 70 4f 74 68 65 72 20 3d 20 70  ndex *pOther = p
15950 54 61 62 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20  Tab->pIndex;.   
15960 20 20 20 77 68 69 6c 65 28 20 70 4f 74 68 65 72     while( pOther
15970 2d 3e 70 4e 65 78 74 20 26 26 20 70 4f 74 68 65  ->pNext && pOthe
15980 72 2d 3e 70 4e 65 78 74 2d 3e 6f 6e 45 72 72 6f  r->pNext->onErro
15990 72 21 3d 4f 45 5f 52 65 70 6c 61 63 65 20 29 7b  r!=OE_Replace ){
159a0 0a 20 20 20 20 20 20 20 20 70 4f 74 68 65 72 20  .        pOther 
159b0 3d 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74 3b  = pOther->pNext;
159c0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
159d0 49 6e 64 65 78 2d 3e 70 4e 65 78 74 20 3d 20 70  Index->pNext = p
159e0 4f 74 68 65 72 2d 3e 70 4e 65 78 74 3b 0a 20 20  Other->pNext;.  
159f0 20 20 20 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78      pOther->pNex
15a00 74 20 3d 20 70 49 6e 64 65 78 3b 0a 20 20 20 20  t = pIndex;.    
15a10 7d 0a 20 20 20 20 70 49 6e 64 65 78 20 3d 20 30  }.    pIndex = 0
15a20 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6c 65 61  ;.  }..  /* Clea
15a30 6e 20 75 70 20 62 65 66 6f 72 65 20 65 78 69 74  n up before exit
15a40 69 6e 67 20 2a 2f 0a 65 78 69 74 5f 63 72 65 61  ing */.exit_crea
15a50 74 65 5f 69 6e 64 65 78 3a 0a 20 20 69 66 28 20  te_index:.  if( 
15a60 70 49 6e 64 65 78 20 29 7b 0a 20 20 20 20 66 72  pIndex ){.    fr
15a70 65 65 49 6e 64 65 78 28 70 49 6e 64 65 78 29 3b  eeIndex(pIndex);
15a80 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 78  .  }.  sqlite3Ex
15a90 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70 4c 69  prListDelete(pLi
15aa0 73 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 72  st);.  sqlite3Sr
15ab0 63 4c 69 73 74 44 65 6c 65 74 65 28 70 54 62 6c  cListDelete(pTbl
15ac0 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65 33  Name);.  sqlite3
15ad0 5f 66 72 65 65 28 7a 4e 61 6d 65 29 3b 0a 20 20  _free(zName);.  
15ae0 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  return;.}../*.**
15af0 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
15b00 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20  o make sure the 
15b10 66 69 6c 65 20 66 6f 72 6d 61 74 20 6e 75 6d 62  file format numb
15b20 65 72 20 69 73 20 61 74 20 6c 65 61 73 74 20 6d  er is at least m
15b30 69 6e 46 6f 72 6d 61 74 2e 0a 2a 2a 20 54 68 65  inFormat..** The
15b40 20 67 65 6e 65 72 61 74 65 64 20 63 6f 64 65 20   generated code 
15b50 77 69 6c 6c 20 69 6e 63 72 65 61 73 65 20 74 68  will increase th
15b60 65 20 66 69 6c 65 20 66 6f 72 6d 61 74 20 6e 75  e file format nu
15b70 6d 62 65 72 20 69 66 20 6e 65 63 65 73 73 61 72  mber if necessar
15b80 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  y..*/.void sqlit
15b90 65 33 4d 69 6e 69 6d 75 6d 46 69 6c 65 46 6f 72  e3MinimumFileFor
15ba0 6d 61 74 28 50 61 72 73 65 20 2a 70 50 61 72 73  mat(Parse *pPars
15bb0 65 2c 20 69 6e 74 20 69 44 62 2c 20 69 6e 74 20  e, int iDb, int 
15bc0 6d 69 6e 46 6f 72 6d 61 74 29 7b 0a 20 20 56 64  minFormat){.  Vd
15bd0 62 65 20 2a 76 3b 0a 20 20 76 20 3d 20 73 71 6c  be *v;.  v = sql
15be0 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
15bf0 73 65 29 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a  se);.  if( v ){.
15c00 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
15c10 64 64 4f 70 33 28 76 2c 20 4f 50 5f 52 65 61 64  ddOp3(v, OP_Read
15c20 43 6f 6f 6b 69 65 2c 20 69 44 62 2c 20 30 2c 20  Cookie, iDb, 0, 
15c30 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  1);.    sqlite3V
15c40 64 62 65 55 73 65 73 42 74 72 65 65 28 76 2c 20  dbeUsesBtree(v, 
15c50 69 44 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  iDb);.    sqlite
15c60 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
15c70 50 5f 49 6e 74 65 67 65 72 2c 20 6d 69 6e 46 6f  P_Integer, minFo
15c80 72 6d 61 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  rmat);.    sqlit
15c90 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
15ca0 4f 50 5f 47 65 2c 20 30 2c 20 73 71 6c 69 74 65  OP_Ge, 0, sqlite
15cb0 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
15cc0 28 76 29 2b 33 29 3b 0a 20 20 20 20 73 71 6c 69  (v)+3);.    sqli
15cd0 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
15ce0 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 6d 69 6e   OP_Integer, min
15cf0 46 6f 72 6d 61 74 29 3b 0a 20 20 20 20 73 71 6c  Format);.    sql
15d00 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
15d10 2c 20 4f 50 5f 53 65 74 43 6f 6f 6b 69 65 2c 20  , OP_SetCookie, 
15d20 69 44 62 2c 20 31 29 3b 0a 20 20 7d 0a 7d 0a 0a  iDb, 1);.  }.}..
15d30 2f 2a 0a 2a 2a 20 46 69 6c 6c 20 74 68 65 20 49  /*.** Fill the I
15d40 6e 64 65 78 2e 61 69 52 6f 77 45 73 74 5b 5d 20  ndex.aiRowEst[] 
15d50 61 72 72 61 79 20 77 69 74 68 20 64 65 66 61 75  array with defau
15d60 6c 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2d  lt information -
15d70 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20   information.** 
15d80 74 6f 20 62 65 20 75 73 65 64 20 77 68 65 6e 20  to be used when 
15d90 77 65 20 68 61 76 65 20 6e 6f 74 20 72 75 6e 20  we have not run 
15da0 74 68 65 20 41 4e 41 4c 59 5a 45 20 63 6f 6d 6d  the ANALYZE comm
15db0 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 61 69 52 6f 77  and..**.** aiRow
15dc0 45 73 74 5b 30 5d 20 69 73 20 73 75 70 70 6f 73  Est[0] is suppos
15dd0 65 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65  e to contain the
15de0 20 6e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65   number of eleme
15df0 6e 74 73 20 69 6e 20 74 68 65 20 69 6e 64 65 78  nts in the index
15e00 2e 0a 2a 2a 20 53 69 6e 63 65 20 77 65 20 64 6f  ..** Since we do
15e10 20 6e 6f 74 20 6b 6e 6f 77 2c 20 67 75 65 73 73   not know, guess
15e20 20 31 20 6d 69 6c 6c 69 6f 6e 2e 20 20 61 69 52   1 million.  aiR
15e30 6f 77 45 73 74 5b 31 5d 20 69 73 20 61 6e 20 65  owEst[1] is an e
15e40 73 74 69 6d 61 74 65 20 6f 66 20 74 68 65 0a 2a  stimate of the.*
15e50 2a 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  * number of rows
15e60 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 74 68   in the table th
15e70 61 74 20 6d 61 74 63 68 20 61 6e 79 20 70 61 72  at match any par
15e80 74 69 63 75 6c 61 72 20 76 61 6c 75 65 20 6f 66  ticular value of
15e90 20 74 68 65 0a 2a 2a 20 66 69 72 73 74 20 63 6f   the.** first co
15ea0 6c 75 6d 6e 20 6f 66 20 74 68 65 20 69 6e 64 65  lumn of the inde
15eb0 78 2e 20 20 61 69 52 6f 77 45 73 74 5b 32 5d 20  x.  aiRowEst[2] 
15ec0 69 73 20 61 6e 20 65 73 74 69 6d 61 74 65 20 6f  is an estimate o
15ed0 66 20 74 68 65 20 6e 75 6d 62 65 72 0a 2a 2a 20  f the number.** 
15ee0 6f 66 20 72 6f 77 73 20 74 68 61 74 20 6d 61 74  of rows that mat
15ef0 63 68 20 61 6e 79 20 70 61 72 74 69 63 75 6c 61  ch any particula
15f00 72 20 63 6f 6d 62 69 6e 69 61 74 69 6f 6e 20 6f  r combiniation o
15f10 66 20 74 68 65 20 66 69 72 73 74 20 32 20 63 6f  f the first 2 co
15f20 6c 75 6d 6e 73 0a 2a 2a 20 6f 66 20 74 68 65 20  lumns.** of the 
15f30 69 6e 64 65 78 2e 20 20 41 6e 64 20 73 6f 20 66  index.  And so f
15f40 6f 72 74 68 2e 20 20 49 74 20 6d 75 73 74 20 61  orth.  It must a
15f50 6c 77 61 79 73 20 62 65 20 74 68 65 20 63 61 73  lways be the cas
15f60 65 20 74 68 61 74 0a 2a 0a 2a 2a 20 20 20 20 20  e that.*.**     
15f70 20 20 20 20 20 20 61 69 52 6f 77 45 73 74 5b 4e        aiRowEst[N
15f80 5d 3c 3d 61 69 52 6f 77 45 73 74 5b 4e 2d 31 5d  ]<=aiRowEst[N-1]
15f90 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 61 69  .**           ai
15fa0 52 6f 77 45 73 74 5b 4e 5d 3e 3d 31 0a 2a 2a 0a  RowEst[N]>=1.**.
15fb0 2a 2a 20 41 70 61 72 74 20 66 72 6f 6d 20 74 68  ** Apart from th
15fc0 61 74 2c 20 77 65 20 68 61 76 65 20 6c 69 74 74  at, we have litt
15fd0 6c 65 20 74 6f 20 67 6f 20 6f 6e 20 62 65 73 69  le to go on besi
15fe0 64 65 73 20 69 6e 74 75 69 74 69 6f 6e 20 61 73  des intuition as
15ff0 20 74 6f 0a 2a 2a 20 68 6f 77 20 61 69 52 6f 77   to.** how aiRow
16000 45 73 74 5b 5d 20 73 68 6f 75 6c 64 20 62 65 20  Est[] should be 
16010 69 6e 69 74 69 61 6c 69 7a 65 64 2e 20 20 54 68  initialized.  Th
16020 65 20 6e 75 6d 62 65 72 73 20 67 65 6e 65 72 61  e numbers genera
16030 74 65 64 20 68 65 72 65 0a 2a 2a 20 61 72 65 20  ted here.** are 
16040 62 61 73 65 64 20 6f 6e 20 74 79 70 69 63 61 6c  based on typical
16050 20 76 61 6c 75 65 73 20 66 6f 75 6e 64 20 69 6e   values found in
16060 20 61 63 74 75 61 6c 20 69 6e 64 69 63 65 73 2e   actual indices.
16070 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
16080 44 65 66 61 75 6c 74 52 6f 77 45 73 74 28 49 6e  DefaultRowEst(In
16090 64 65 78 20 2a 70 49 64 78 29 7b 0a 20 20 75 6e  dex *pIdx){.  un
160a0 73 69 67 6e 65 64 20 2a 61 20 3d 20 70 49 64 78  signed *a = pIdx
160b0 2d 3e 61 69 52 6f 77 45 73 74 3b 0a 20 20 69 6e  ->aiRowEst;.  in
160c0 74 20 69 3b 0a 20 20 61 73 73 65 72 74 28 20 61  t i;.  assert( a
160d0 21 3d 30 20 29 3b 0a 20 20 61 5b 30 5d 20 3d 20  !=0 );.  a[0] = 
160e0 31 30 30 30 30 30 30 3b 0a 20 20 66 6f 72 28 69  1000000;.  for(i
160f0 3d 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20  =pIdx->nColumn; 
16100 69 3e 3d 35 3b 20 69 2d 2d 29 7b 0a 20 20 20 20  i>=5; i--){.    
16110 61 5b 69 5d 20 3d 20 35 3b 0a 20 20 7d 0a 20 20  a[i] = 5;.  }.  
16120 77 68 69 6c 65 28 20 69 3e 3d 31 20 29 7b 0a 20  while( i>=1 ){. 
16130 20 20 20 61 5b 69 5d 20 3d 20 31 31 20 2d 20 69     a[i] = 11 - i
16140 3b 0a 20 20 20 20 69 2d 2d 3b 0a 20 20 7d 0a 20  ;.    i--;.  }. 
16150 20 69 66 28 20 70 49 64 78 2d 3e 6f 6e 45 72 72   if( pIdx->onErr
16160 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 20 29 7b 0a 20  or!=OE_None ){. 
16170 20 20 20 61 5b 70 49 64 78 2d 3e 6e 43 6f 6c 75     a[pIdx->nColu
16180 6d 6e 5d 20 3d 20 31 3b 0a 20 20 7d 0a 7d 0a 0a  mn] = 1;.  }.}..
16190 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
161a0 6e 65 20 77 69 6c 6c 20 64 72 6f 70 20 61 6e 20  ne will drop an 
161b0 65 78 69 73 74 69 6e 67 20 6e 61 6d 65 64 20 69  existing named i
161c0 6e 64 65 78 2e 20 20 54 68 69 73 20 72 6f 75 74  ndex.  This rout
161d0 69 6e 65 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74  ine.** implement
161e0 73 20 74 68 65 20 44 52 4f 50 20 49 4e 44 45 58  s the DROP INDEX
161f0 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 76   statement..*/.v
16200 6f 69 64 20 73 71 6c 69 74 65 33 44 72 6f 70 49  oid sqlite3DropI
16210 6e 64 65 78 28 50 61 72 73 65 20 2a 70 50 61 72  ndex(Parse *pPar
16220 73 65 2c 20 53 72 63 4c 69 73 74 20 2a 70 4e 61  se, SrcList *pNa
16230 6d 65 2c 20 69 6e 74 20 69 66 45 78 69 73 74 73  me, int ifExists
16240 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64  ){.  Index *pInd
16250 65 78 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20  ex;.  Vdbe *v;. 
16260 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
16270 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74  Parse->db;.  int
16280 20 69 44 62 3b 0a 0a 20 20 69 66 28 20 70 50 61   iDb;..  if( pPa
16290 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 64 62 2d  rse->nErr || db-
162a0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
162b0 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64  .    goto exit_d
162c0 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20  rop_index;.  }. 
162d0 20 61 73 73 65 72 74 28 20 70 4e 61 6d 65 2d 3e   assert( pName->
162e0 6e 53 72 63 3d 3d 31 20 29 3b 0a 20 20 69 66 28  nSrc==1 );.  if(
162f0 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69   SQLITE_OK!=sqli
16300 74 65 33 52 65 61 64 53 63 68 65 6d 61 28 70 50  te3ReadSchema(pP
16310 61 72 73 65 29 20 29 7b 0a 20 20 20 20 67 6f 74  arse) ){.    got
16320 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65  o exit_drop_inde
16330 78 3b 0a 20 20 7d 0a 20 20 70 49 6e 64 65 78 20  x;.  }.  pIndex 
16340 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 64  = sqlite3FindInd
16350 65 78 28 64 62 2c 20 70 4e 61 6d 65 2d 3e 61 5b  ex(db, pName->a[
16360 30 5d 2e 7a 4e 61 6d 65 2c 20 70 4e 61 6d 65 2d  0].zName, pName-
16370 3e 61 5b 30 5d 2e 7a 44 61 74 61 62 61 73 65 29  >a[0].zDatabase)
16380 3b 0a 20 20 69 66 28 20 70 49 6e 64 65 78 3d 3d  ;.  if( pIndex==
16390 30 20 29 7b 0a 20 20 20 20 69 66 28 20 21 69 66  0 ){.    if( !if
163a0 45 78 69 73 74 73 20 29 7b 0a 20 20 20 20 20 20  Exists ){.      
163b0 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
163c0 70 50 61 72 73 65 2c 20 22 6e 6f 20 73 75 63 68  pParse, "no such
163d0 20 69 6e 64 65 78 3a 20 25 53 22 2c 20 70 4e 61   index: %S", pNa
163e0 6d 65 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20  me, 0);.    }.  
163f0 20 20 70 50 61 72 73 65 2d 3e 63 68 65 63 6b 53    pParse->checkS
16400 63 68 65 6d 61 20 3d 20 31 3b 0a 20 20 20 20 67  chema = 1;.    g
16410 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e  oto exit_drop_in
16420 64 65 78 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  dex;.  }.  if( p
16430 49 6e 64 65 78 2d 3e 61 75 74 6f 49 6e 64 65 78  Index->autoIndex
16440 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
16450 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
16460 22 69 6e 64 65 78 20 61 73 73 6f 63 69 61 74 65  "index associate
16470 64 20 77 69 74 68 20 55 4e 49 51 55 45 20 22 0a  d with UNIQUE ".
16480 20 20 20 20 20 20 22 6f 72 20 50 52 49 4d 41 52        "or PRIMAR
16490 59 20 4b 45 59 20 63 6f 6e 73 74 72 61 69 6e 74  Y KEY constraint
164a0 20 63 61 6e 6e 6f 74 20 62 65 20 64 72 6f 70 70   cannot be dropp
164b0 65 64 22 2c 20 30 29 3b 0a 20 20 20 20 67 6f 74  ed", 0);.    got
164c0 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65  o exit_drop_inde
164d0 78 3b 0a 20 20 7d 0a 20 20 69 44 62 20 3d 20 73  x;.  }.  iDb = s
164e0 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e  qlite3SchemaToIn
164f0 64 65 78 28 64 62 2c 20 70 49 6e 64 65 78 2d 3e  dex(db, pIndex->
16500 70 53 63 68 65 6d 61 29 3b 0a 23 69 66 6e 64 65  pSchema);.#ifnde
16510 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
16520 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 7b 0a  THORIZATION.  {.
16530 20 20 20 20 69 6e 74 20 63 6f 64 65 20 3d 20 53      int code = S
16540 51 4c 49 54 45 5f 44 52 4f 50 5f 49 4e 44 45 58  QLITE_DROP_INDEX
16550 3b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61  ;.    Table *pTa
16560 62 20 3d 20 70 49 6e 64 65 78 2d 3e 70 54 61 62  b = pIndex->pTab
16570 6c 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  le;.    const ch
16580 61 72 20 2a 7a 44 62 20 3d 20 64 62 2d 3e 61 44  ar *zDb = db->aD
16590 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20  b[iDb].zName;.  
165a0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54    const char *zT
165b0 61 62 20 3d 20 53 43 48 45 4d 41 5f 54 41 42 4c  ab = SCHEMA_TABL
165c0 45 28 69 44 62 29 3b 0a 20 20 20 20 69 66 28 20  E(iDb);.    if( 
165d0 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b  sqlite3AuthCheck
165e0 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f  (pParse, SQLITE_
165f0 44 45 4c 45 54 45 2c 20 7a 54 61 62 2c 20 30 2c  DELETE, zTab, 0,
16600 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20 67   zDb) ){.      g
16610 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e  oto exit_drop_in
16620 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  dex;.    }.    i
16630 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20  f( !OMIT_TEMPDB 
16640 26 26 20 69 44 62 20 29 20 63 6f 64 65 20 3d 20  && iDb ) code = 
16650 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50  SQLITE_DROP_TEMP
16660 5f 49 4e 44 45 58 3b 0a 20 20 20 20 69 66 28 20  _INDEX;.    if( 
16670 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b  sqlite3AuthCheck
16680 28 70 50 61 72 73 65 2c 20 63 6f 64 65 2c 20 70  (pParse, code, p
16690 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 70 54  Index->zName, pT
166a0 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 44 62 29 20  ab->zName, zDb) 
166b0 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78  ){.      goto ex
166c0 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20  it_drop_index;. 
166d0 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
166e0 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63  .  /* Generate c
166f0 6f 64 65 20 74 6f 20 72 65 6d 6f 76 65 20 74 68  ode to remove th
16700 65 20 69 6e 64 65 78 20 61 6e 64 20 66 72 6f 6d  e index and from
16710 20 74 68 65 20 6d 61 73 74 65 72 20 74 61 62 6c   the master tabl
16720 65 20 2a 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74  e */.  v = sqlit
16730 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
16740 29 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a 20 20  );.  if( v ){.  
16750 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72    sqlite3BeginWr
16760 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61  iteOperation(pPa
16770 72 73 65 2c 20 31 2c 20 69 44 62 29 3b 0a 20 20  rse, 1, iDb);.  
16780 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50    sqlite3NestedP
16790 61 72 73 65 28 70 50 61 72 73 65 2c 0a 20 20 20  arse(pParse,.   
167a0 20 20 20 20 22 44 45 4c 45 54 45 20 46 52 4f 4d      "DELETE FROM
167b0 20 25 51 2e 25 73 20 57 48 45 52 45 20 6e 61 6d   %Q.%s WHERE nam
167c0 65 3d 25 51 22 2c 0a 20 20 20 20 20 20 20 64 62  e=%Q",.       db
167d0 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65  ->aDb[iDb].zName
167e0 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69  , SCHEMA_TABLE(i
167f0 44 62 29 2c 0a 20 20 20 20 20 20 20 70 49 6e 64  Db),.       pInd
16800 65 78 2d 3e 7a 4e 61 6d 65 0a 20 20 20 20 29 3b  ex->zName.    );
16810 0a 20 20 20 20 73 71 6c 69 74 65 33 43 68 61 6e  .    sqlite3Chan
16820 67 65 43 6f 6f 6b 69 65 28 64 62 2c 20 76 2c 20  geCookie(db, v, 
16830 69 44 62 29 3b 0a 20 20 20 20 64 65 73 74 72 6f  iDb);.    destro
16840 79 52 6f 6f 74 50 61 67 65 28 70 50 61 72 73 65  yRootPage(pParse
16850 2c 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 2c 20  , pIndex->tnum, 
16860 69 44 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  iDb);.    sqlite
16870 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
16880 50 5f 44 72 6f 70 49 6e 64 65 78 2c 20 69 44 62  P_DropIndex, iDb
16890 2c 20 30 2c 20 30 2c 20 70 49 6e 64 65 78 2d 3e  , 0, 0, pIndex->
168a0 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 7d 0a 0a  zName, 0);.  }..
168b0 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3a  exit_drop_index:
168c0 0a 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73  .  sqlite3SrcLis
168d0 74 44 65 6c 65 74 65 28 70 4e 61 6d 65 29 3b 0a  tDelete(pName);.
168e0 7d 0a 0a 2f 2a 0a 2a 2a 20 70 41 72 72 61 79 20  }../*.** pArray 
168f0 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  is a pointer to 
16900 61 6e 20 61 72 72 61 79 20 6f 66 20 6f 62 6a 65  an array of obje
16910 63 74 73 2e 20 20 45 61 63 68 20 6f 62 6a 65 63  cts.  Each objec
16920 74 20 69 6e 20 74 68 65 0a 2a 2a 20 61 72 72 61  t in the.** arra
16930 79 20 69 73 20 73 7a 45 6e 74 72 79 20 62 79 74  y is szEntry byt
16940 65 73 20 69 6e 20 73 69 7a 65 2e 20 20 54 68 69  es in size.  Thi
16950 73 20 72 6f 75 74 69 6e 65 20 61 6c 6c 6f 63 61  s routine alloca
16960 74 65 73 20 61 20 6e 65 77 0a 2a 2a 20 6f 62 6a  tes a new.** obj
16970 65 63 74 20 6f 6e 20 74 68 65 20 65 6e 64 20 6f  ect on the end o
16980 66 20 74 68 65 20 61 72 72 61 79 2e 0a 2a 2a 0a  f the array..**.
16990 2a 2a 20 2a 70 6e 45 6e 74 72 79 20 69 73 20 74  ** *pnEntry is t
169a0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6e 74  he number of ent
169b0 72 69 65 73 20 61 6c 72 65 61 64 79 20 69 6e 20  ries already in 
169c0 75 73 65 2e 20 20 2a 70 6e 41 6c 6c 6f 63 20 69  use.  *pnAlloc i
169d0 73 0a 2a 2a 20 74 68 65 20 70 72 65 76 69 6f 75  s.** the previou
169e0 73 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 73 69  sly allocated si
169f0 7a 65 20 6f 66 20 74 68 65 20 61 72 72 61 79 2e  ze of the array.
16a00 20 20 69 6e 69 74 53 69 7a 65 20 69 73 20 74 68    initSize is th
16a10 65 0a 2a 2a 20 73 75 67 67 65 73 74 65 64 20 69  e.** suggested i
16a20 6e 69 74 69 61 6c 20 61 72 72 61 79 20 73 69 7a  nitial array siz
16a30 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e 0a 2a 2a  e allocation..**
16a40 0a 2a 2a 20 54 68 65 20 69 6e 64 65 78 20 6f 66  .** The index of
16a50 20 74 68 65 20 6e 65 77 20 65 6e 74 72 79 20 69   the new entry i
16a60 73 20 72 65 74 75 72 6e 65 64 20 69 6e 20 2a 70  s returned in *p
16a70 49 64 78 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  Idx..**.** This 
16a80 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20  routine returns 
16a90 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
16aa0 20 61 72 72 61 79 20 6f 66 20 6f 62 6a 65 63 74   array of object
16ab0 73 2e 20 20 54 68 69 73 0a 2a 2a 20 6d 69 67 68  s.  This.** migh
16ac0 74 20 62 65 20 74 68 65 20 73 61 6d 65 20 61 73  t be the same as
16ad0 20 74 68 65 20 70 41 72 72 61 79 20 70 61 72 61   the pArray para
16ae0 6d 65 74 65 72 20 6f 72 20 69 74 20 6d 69 67 68  meter or it migh
16af0 74 20 62 65 20 61 20 64 69 66 66 65 72 65 6e 74  t be a different
16b00 0a 2a 2a 20 70 6f 69 6e 74 65 72 20 69 66 20 74  .** pointer if t
16b10 68 65 20 61 72 72 61 79 20 77 61 73 20 72 65 73  he array was res
16b20 69 7a 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73  ized..*/.void *s
16b30 71 6c 69 74 65 33 41 72 72 61 79 41 6c 6c 6f 63  qlite3ArrayAlloc
16b40 61 74 65 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  ate(.  sqlite3 *
16b50 64 62 2c 20 20 20 20 20 20 2f 2a 20 43 6f 6e 6e  db,      /* Conn
16b60 65 63 74 69 6f 6e 20 74 6f 20 6e 6f 74 69 66 79  ection to notify
16b70 20 6f 66 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75   of malloc failu
16b80 72 65 73 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70  res */.  void *p
16b90 41 72 72 61 79 2c 20 20 20 20 20 2f 2a 20 41 72  Array,     /* Ar
16ba0 72 61 79 20 6f 66 20 6f 62 6a 65 63 74 73 2e 20  ray of objects. 
16bb0 20 4d 69 67 68 74 20 62 65 20 72 65 61 6c 6c 6f   Might be reallo
16bc0 63 61 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 73  cated */.  int s
16bd0 7a 45 6e 74 72 79 2c 20 20 20 20 20 20 2f 2a 20  zEntry,      /* 
16be0 53 69 7a 65 20 6f 66 20 65 61 63 68 20 6f 62 6a  Size of each obj
16bf0 65 63 74 20 69 6e 20 74 68 65 20 61 72 72 61 79  ect in the array
16c00 20 2a 2f 0a 20 20 69 6e 74 20 69 6e 69 74 53 69   */.  int initSi
16c10 7a 65 2c 20 20 20 20 20 2f 2a 20 53 75 67 67 65  ze,     /* Sugge
16c20 73 74 65 64 20 69 6e 69 74 69 61 6c 20 61 6c 6c  sted initial all
16c30 6f 63 61 74 69 6f 6e 2c 20 69 6e 20 65 6c 65 6d  ocation, in elem
16c40 65 6e 74 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  ents */.  int *p
16c50 6e 45 6e 74 72 79 2c 20 20 20 20 20 2f 2a 20 4e  nEntry,     /* N
16c60 75 6d 62 65 72 20 6f 66 20 6f 62 6a 65 63 74 73  umber of objects
16c70 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 75 73   currently in us
16c80 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 41 6c  e */.  int *pnAl
16c90 6c 6f 63 2c 20 20 20 20 20 2f 2a 20 43 75 72 72  loc,     /* Curr
16ca0 65 6e 74 20 73 69 7a 65 20 6f 66 20 74 68 65 20  ent size of the 
16cb0 61 6c 6c 6f 63 61 74 69 6f 6e 2c 20 69 6e 20 65  allocation, in e
16cc0 6c 65 6d 65 6e 74 73 20 2a 2f 0a 20 20 69 6e 74  lements */.  int
16cd0 20 2a 70 49 64 78 20 20 20 20 20 20 20 20 20 2f   *pIdx         /
16ce0 2a 20 57 72 69 74 65 20 74 68 65 20 69 6e 64 65  * Write the inde
16cf0 78 20 6f 66 20 61 20 6e 65 77 20 73 6c 6f 74 20  x of a new slot 
16d00 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 63 68 61  here */.){.  cha
16d10 72 20 2a 7a 3b 0a 20 20 69 66 28 20 2a 70 6e 45  r *z;.  if( *pnE
16d20 6e 74 72 79 20 3e 3d 20 2a 70 6e 41 6c 6c 6f 63  ntry >= *pnAlloc
16d30 20 29 7b 0a 20 20 20 20 76 6f 69 64 20 2a 70 4e   ){.    void *pN
16d40 65 77 3b 0a 20 20 20 20 69 6e 74 20 6e 65 77 53  ew;.    int newS
16d50 69 7a 65 3b 0a 20 20 20 20 6e 65 77 53 69 7a 65  ize;.    newSize
16d60 20 3d 20 28 2a 70 6e 41 6c 6c 6f 63 29 2a 32 20   = (*pnAlloc)*2 
16d70 2b 20 69 6e 69 74 53 69 7a 65 3b 0a 20 20 20 20  + initSize;.    
16d80 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62  pNew = sqlite3Db
16d90 52 65 61 6c 6c 6f 63 28 64 62 2c 20 70 41 72 72  Realloc(db, pArr
16da0 61 79 2c 20 6e 65 77 53 69 7a 65 2a 73 7a 45 6e  ay, newSize*szEn
16db0 74 72 79 29 3b 0a 20 20 20 20 69 66 28 20 70 4e  try);.    if( pN
16dc0 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2a  ew==0 ){.      *
16dd0 70 49 64 78 20 3d 20 2d 31 3b 0a 20 20 20 20 20  pIdx = -1;.     
16de0 20 72 65 74 75 72 6e 20 70 41 72 72 61 79 3b 0a   return pArray;.
16df0 20 20 20 20 7d 0a 20 20 20 20 2a 70 6e 41 6c 6c      }.    *pnAll
16e00 6f 63 20 3d 20 6e 65 77 53 69 7a 65 3b 0a 20 20  oc = newSize;.  
16e10 20 20 70 41 72 72 61 79 20 3d 20 70 4e 65 77 3b    pArray = pNew;
16e20 0a 20 20 7d 0a 20 20 7a 20 3d 20 28 63 68 61 72  .  }.  z = (char
16e30 2a 29 70 41 72 72 61 79 3b 0a 20 20 6d 65 6d 73  *)pArray;.  mems
16e40 65 74 28 26 7a 5b 2a 70 6e 45 6e 74 72 79 20 2a  et(&z[*pnEntry *
16e50 20 73 7a 45 6e 74 72 79 5d 2c 20 30 2c 20 73 7a   szEntry], 0, sz
16e60 45 6e 74 72 79 29 3b 0a 20 20 2a 70 49 64 78 20  Entry);.  *pIdx 
16e70 3d 20 2a 70 6e 45 6e 74 72 79 3b 0a 20 20 2b 2b  = *pnEntry;.  ++
16e80 2a 70 6e 45 6e 74 72 79 3b 0a 20 20 72 65 74 75  *pnEntry;.  retu
16e90 72 6e 20 70 41 72 72 61 79 3b 0a 7d 0a 0a 2f 2a  rn pArray;.}../*
16ea0 0a 2a 2a 20 41 70 70 65 6e 64 20 61 20 6e 65 77  .** Append a new
16eb0 20 65 6c 65 6d 65 6e 74 20 74 6f 20 74 68 65 20   element to the 
16ec0 67 69 76 65 6e 20 49 64 4c 69 73 74 2e 20 20 43  given IdList.  C
16ed0 72 65 61 74 65 20 61 20 6e 65 77 20 49 64 4c 69  reate a new IdLi
16ee0 73 74 20 69 66 0a 2a 2a 20 6e 65 65 64 20 62 65  st if.** need be
16ef0 2e 0a 2a 2a 0a 2a 2a 20 41 20 6e 65 77 20 49 64  ..**.** A new Id
16f00 4c 69 73 74 20 69 73 20 72 65 74 75 72 6e 65 64  List is returned
16f10 2c 20 6f 72 20 4e 55 4c 4c 20 69 66 20 6d 61 6c  , or NULL if mal
16f20 6c 6f 63 28 29 20 66 61 69 6c 73 2e 0a 2a 2f 0a  loc() fails..*/.
16f30 49 64 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 49  IdList *sqlite3I
16f40 64 4c 69 73 74 41 70 70 65 6e 64 28 73 71 6c 69  dListAppend(sqli
16f50 74 65 33 20 2a 64 62 2c 20 49 64 4c 69 73 74 20  te3 *db, IdList 
16f60 2a 70 4c 69 73 74 2c 20 54 6f 6b 65 6e 20 2a 70  *pList, Token *p
16f70 54 6f 6b 65 6e 29 7b 0a 20 20 69 6e 74 20 69 3b  Token){.  int i;
16f80 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20  .  if( pList==0 
16f90 29 7b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 73  ){.    pList = s
16fa0 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
16fb0 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 49 64  ro(db, sizeof(Id
16fc0 4c 69 73 74 29 20 29 3b 0a 20 20 20 20 69 66 28  List) );.    if(
16fd0 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75   pList==0 ) retu
16fe0 72 6e 20 30 3b 0a 20 20 20 20 70 4c 69 73 74 2d  rn 0;.    pList-
16ff0 3e 6e 41 6c 6c 6f 63 20 3d 20 30 3b 0a 20 20 7d  >nAlloc = 0;.  }
17000 0a 20 20 70 4c 69 73 74 2d 3e 61 20 3d 20 73 71  .  pList->a = sq
17010 6c 69 74 65 33 41 72 72 61 79 41 6c 6c 6f 63 61  lite3ArrayAlloca
17020 74 65 28 0a 20 20 20 20 20 20 64 62 2c 0a 20 20  te(.      db,.  
17030 20 20 20 20 70 4c 69 73 74 2d 3e 61 2c 0a 20 20      pList->a,.  
17040 20 20 20 20 73 69 7a 65 6f 66 28 70 4c 69 73 74      sizeof(pList
17050 2d 3e 61 5b 30 5d 29 2c 0a 20 20 20 20 20 20 35  ->a[0]),.      5
17060 2c 0a 20 20 20 20 20 20 26 70 4c 69 73 74 2d 3e  ,.      &pList->
17070 6e 49 64 2c 0a 20 20 20 20 20 20 26 70 4c 69 73  nId,.      &pLis
17080 74 2d 3e 6e 41 6c 6c 6f 63 2c 0a 20 20 20 20 20  t->nAlloc,.     
17090 20 26 69 0a 20 20 29 3b 0a 20 20 69 66 28 20 69   &i.  );.  if( i
170a0 3c 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  <0 ){.    sqlite
170b0 33 49 64 4c 69 73 74 44 65 6c 65 74 65 28 70 4c  3IdListDelete(pL
170c0 69 73 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ist);.    return
170d0 20 30 3b 0a 20 20 7d 0a 20 20 70 4c 69 73 74 2d   0;.  }.  pList-
170e0 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20 3d 20 73 71  >a[i].zName = sq
170f0 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b  lite3NameFromTok
17100 65 6e 28 64 62 2c 20 70 54 6f 6b 65 6e 29 3b 0a  en(db, pToken);.
17110 20 20 72 65 74 75 72 6e 20 70 4c 69 73 74 3b 0a    return pList;.
17120 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20  }../*.** Delete 
17130 61 6e 20 49 64 4c 69 73 74 2e 0a 2a 2f 0a 76 6f  an IdList..*/.vo
17140 69 64 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74  id sqlite3IdList
17150 44 65 6c 65 74 65 28 49 64 4c 69 73 74 20 2a 70  Delete(IdList *p
17160 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  List){.  int i;.
17170 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29    if( pList==0 )
17180 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69   return;.  for(i
17190 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 49 64  =0; i<pList->nId
171a0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69  ; i++){.    sqli
171b0 74 65 33 5f 66 72 65 65 28 70 4c 69 73 74 2d 3e  te3_free(pList->
171c0 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 7d  a[i].zName);.  }
171d0 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
171e0 70 4c 69 73 74 2d 3e 61 29 3b 0a 20 20 73 71 6c  pList->a);.  sql
171f0 69 74 65 33 5f 66 72 65 65 28 70 4c 69 73 74 29  ite3_free(pList)
17200 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
17210 6e 20 74 68 65 20 69 6e 64 65 78 20 69 6e 20 70  n the index in p
17220 4c 69 73 74 20 6f 66 20 74 68 65 20 69 64 65 6e  List of the iden
17230 74 69 66 69 65 72 20 6e 61 6d 65 64 20 7a 49 64  tifier named zId
17240 2e 20 20 52 65 74 75 72 6e 20 2d 31 0a 2a 2a 20  .  Return -1.** 
17250 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2f  if not found..*/
17260 0a 69 6e 74 20 73 71 6c 69 74 65 33 49 64 4c 69  .int sqlite3IdLi
17270 73 74 49 6e 64 65 78 28 49 64 4c 69 73 74 20 2a  stIndex(IdList *
17280 70 4c 69 73 74 2c 20 63 6f 6e 73 74 20 63 68 61  pList, const cha
17290 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69 6e 74  r *zName){.  int
172a0 20 69 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d   i;.  if( pList=
172b0 3d 30 20 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a  =0 ) return -1;.
172c0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69    for(i=0; i<pLi
172d0 73 74 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20  st->nId; i++){. 
172e0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74     if( sqlite3St
172f0 72 49 43 6d 70 28 70 4c 69 73 74 2d 3e 61 5b 69  rICmp(pList->a[i
17300 5d 2e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29 3d  ].zName, zName)=
17310 3d 30 20 29 20 72 65 74 75 72 6e 20 69 3b 0a 20  =0 ) return i;. 
17320 20 7d 0a 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a   }.  return -1;.
17330 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20  }../*.** Append 
17340 61 20 6e 65 77 20 74 61 62 6c 65 20 6e 61 6d 65  a new table name
17350 20 74 6f 20 74 68 65 20 67 69 76 65 6e 20 53 72   to the given Sr
17360 63 4c 69 73 74 2e 20 20 43 72 65 61 74 65 20 61  cList.  Create a
17370 20 6e 65 77 20 53 72 63 4c 69 73 74 20 69 66 0a   new SrcList if.
17380 2a 2a 20 6e 65 65 64 20 62 65 2e 20 20 41 20 6e  ** need be.  A n
17390 65 77 20 65 6e 74 72 79 20 69 73 20 63 72 65 61  ew entry is crea
173a0 74 65 64 20 69 6e 20 74 68 65 20 53 72 63 4c 69  ted in the SrcLi
173b0 73 74 20 65 76 65 6e 20 69 66 20 70 54 6f 6b 65  st even if pToke
173c0 6e 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a  n is NULL..**.**
173d0 20 41 20 6e 65 77 20 53 72 63 4c 69 73 74 20 69   A new SrcList i
173e0 73 20 72 65 74 75 72 6e 65 64 2c 20 6f 72 20 4e  s returned, or N
173f0 55 4c 4c 20 69 66 20 6d 61 6c 6c 6f 63 28 29 20  ULL if malloc() 
17400 66 61 69 6c 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  fails..**.** If 
17410 70 44 61 74 61 62 61 73 65 20 69 73 20 6e 6f 74  pDatabase is not
17420 20 6e 75 6c 6c 2c 20 69 74 20 6d 65 61 6e 73 20   null, it means 
17430 74 68 61 74 20 74 68 65 20 74 61 62 6c 65 20 68  that the table h
17440 61 73 20 61 6e 20 6f 70 74 69 6f 6e 61 6c 0a 2a  as an optional.*
17450 2a 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 20  * database name 
17460 70 72 65 66 69 78 2e 20 20 4c 69 6b 65 20 74 68  prefix.  Like th
17470 69 73 3a 20 20 22 64 61 74 61 62 61 73 65 2e 74  is:  "database.t
17480 61 62 6c 65 22 2e 20 20 54 68 65 20 70 44 61 74  able".  The pDat
17490 61 62 61 73 65 0a 2a 2a 20 70 6f 69 6e 74 73 20  abase.** points 
174a0 74 6f 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d  to the table nam
174b0 65 20 61 6e 64 20 74 68 65 20 70 54 61 62 6c 65  e and the pTable
174c0 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 64   points to the d
174d0 61 74 61 62 61 73 65 20 6e 61 6d 65 2e 0a 2a 2a  atabase name..**
174e0 20 54 68 65 20 53 72 63 4c 69 73 74 2e 61 5b 5d   The SrcList.a[]
174f0 2e 7a 4e 61 6d 65 20 66 69 65 6c 64 20 69 73 20  .zName field is 
17500 66 69 6c 6c 65 64 20 77 69 74 68 20 74 68 65 20  filled with the 
17510 74 61 62 6c 65 20 6e 61 6d 65 20 77 68 69 63 68  table name which
17520 20 6d 69 67 68 74 0a 2a 2a 20 63 6f 6d 65 20 66   might.** come f
17530 72 6f 6d 20 70 54 61 62 6c 65 20 28 69 66 20 70  rom pTable (if p
17540 44 61 74 61 62 61 73 65 20 69 73 20 4e 55 4c 4c  Database is NULL
17550 29 20 6f 72 20 66 72 6f 6d 20 70 44 61 74 61 62  ) or from pDatab
17560 61 73 65 2e 20 20 0a 2a 2a 20 53 72 63 4c 69 73  ase.  .** SrcLis
17570 74 2e 61 5b 5d 2e 7a 44 61 74 61 62 61 73 65 20  t.a[].zDatabase 
17580 69 73 20 66 69 6c 6c 65 64 20 77 69 74 68 20 74  is filled with t
17590 68 65 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65  he database name
175a0 20 66 72 6f 6d 20 70 54 61 62 6c 65 2c 0a 2a 2a   from pTable,.**
175b0 20 6f 72 20 77 69 74 68 20 4e 55 4c 4c 20 69 66   or with NULL if
175c0 20 6e 6f 20 64 61 74 61 62 61 73 65 20 69 73 20   no database is 
175d0 73 70 65 63 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a  specified..**.**
175e0 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c   In other words,
175f0 20 69 66 20 63 61 6c 6c 20 6c 69 6b 65 20 74 68   if call like th
17600 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  is:.**.**       
17610 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74    sqlite3SrcList
17620 41 70 70 65 6e 64 28 44 2c 41 2c 42 2c 30 29 3b  Append(D,A,B,0);
17630 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 42 20 69 73  .**.** Then B is
17640 20 61 20 74 61 62 6c 65 20 6e 61 6d 65 20 61 6e   a table name an
17650 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6e  d the database n
17660 61 6d 65 20 69 73 20 75 6e 73 70 65 63 69 66 69  ame is unspecifi
17670 65 64 2e 20 20 49 66 20 63 61 6c 6c 65 64 0a 2a  ed.  If called.*
17680 2a 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a  * like this:.**.
17690 2a 2a 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  **         sqlit
176a0 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64 28  e3SrcListAppend(
176b0 44 2c 41 2c 42 2c 43 29 3b 0a 2a 2a 0a 2a 2a 20  D,A,B,C);.**.** 
176c0 54 68 65 6e 20 43 20 69 73 20 74 68 65 20 74 61  Then C is the ta
176d0 62 6c 65 20 6e 61 6d 65 20 61 6e 64 20 42 20 69  ble name and B i
176e0 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6e  s the database n
176f0 61 6d 65 2e 0a 2a 2f 0a 53 72 63 4c 69 73 74 20  ame..*/.SrcList 
17700 2a 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41  *sqlite3SrcListA
17710 70 70 65 6e 64 28 0a 20 20 73 71 6c 69 74 65 33  ppend(.  sqlite3
17720 20 2a 64 62 2c 20 20 20 20 20 20 20 20 2f 2a 20   *db,        /* 
17730 43 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 6e 6f  Connection to no
17740 74 69 66 79 20 6f 66 20 6d 61 6c 6c 6f 63 20 66  tify of malloc f
17750 61 69 6c 75 72 65 73 20 2a 2f 0a 20 20 53 72 63  ailures */.  Src
17760 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 20  List *pList,    
17770 20 2f 2a 20 41 70 70 65 6e 64 20 74 6f 20 74 68   /* Append to th
17780 69 73 20 53 72 63 4c 69 73 74 2e 20 4e 55 4c 4c  is SrcList. NULL
17790 20 63 72 65 61 74 65 73 20 61 20 6e 65 77 20 53   creates a new S
177a0 72 63 4c 69 73 74 20 2a 2f 0a 20 20 54 6f 6b 65  rcList */.  Toke
177b0 6e 20 2a 70 54 61 62 6c 65 2c 20 20 20 20 20 20  n *pTable,      
177c0 2f 2a 20 54 61 62 6c 65 20 74 6f 20 61 70 70 65  /* Table to appe
177d0 6e 64 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  nd */.  Token *p
177e0 44 61 74 61 62 61 73 65 20 20 20 20 2f 2a 20 44  Database    /* D
177f0 61 74 61 62 61 73 65 20 6f 66 20 74 68 65 20 74  atabase of the t
17800 61 62 6c 65 20 2a 2f 0a 29 7b 0a 20 20 73 74 72  able */.){.  str
17810 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
17820 20 2a 70 49 74 65 6d 3b 0a 20 20 69 66 28 20 70   *pItem;.  if( p
17830 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70  List==0 ){.    p
17840 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 44 62  List = sqlite3Db
17850 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73  MallocZero(db, s
17860 69 7a 65 6f 66 28 53 72 63 4c 69 73 74 29 20 29  izeof(SrcList) )
17870 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 3d  ;.    if( pList=
17880 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
17890 20 20 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63     pList->nAlloc
178a0 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20   = 1;.  }.  if( 
178b0 70 4c 69 73 74 2d 3e 6e 53 72 63 3e 3d 70 4c 69  pList->nSrc>=pLi
178c0 73 74 2d 3e 6e 41 6c 6c 6f 63 20 29 7b 0a 20 20  st->nAlloc ){.  
178d0 20 20 53 72 63 4c 69 73 74 20 2a 70 4e 65 77 3b    SrcList *pNew;
178e0 0a 20 20 20 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c  .    pList->nAll
178f0 6f 63 20 2a 3d 20 32 3b 0a 20 20 20 20 70 4e 65  oc *= 2;.    pNe
17900 77 20 3d 20 73 71 6c 69 74 65 33 44 62 52 65 61  w = sqlite3DbRea
17910 6c 6c 6f 63 28 64 62 2c 20 70 4c 69 73 74 2c 0a  lloc(db, pList,.
17920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
17930 69 7a 65 6f 66 28 2a 70 4c 69 73 74 29 20 2b 20  izeof(*pList) + 
17940 28 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 2d 31  (pList->nAlloc-1
17950 29 2a 73 69 7a 65 6f 66 28 70 4c 69 73 74 2d 3e  )*sizeof(pList->
17960 61 5b 30 5d 29 20 29 3b 0a 20 20 20 20 69 66 28  a[0]) );.    if(
17970 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20   pNew==0 ){.    
17980 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74    sqlite3SrcList
17990 44 65 6c 65 74 65 28 70 4c 69 73 74 29 3b 0a 20  Delete(pList);. 
179a0 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
179b0 20 20 20 7d 0a 20 20 20 20 70 4c 69 73 74 20 3d     }.    pList =
179c0 20 70 4e 65 77 3b 0a 20 20 7d 0a 20 20 70 49 74   pNew;.  }.  pIt
179d0 65 6d 20 3d 20 26 70 4c 69 73 74 2d 3e 61 5b 70  em = &pList->a[p
179e0 4c 69 73 74 2d 3e 6e 53 72 63 5d 3b 0a 20 20 6d  List->nSrc];.  m
179f0 65 6d 73 65 74 28 70 49 74 65 6d 2c 20 30 2c 20  emset(pItem, 0, 
17a00 73 69 7a 65 6f 66 28 70 4c 69 73 74 2d 3e 61 5b  sizeof(pList->a[
17a10 30 5d 29 29 3b 0a 20 20 69 66 28 20 70 44 61 74  0]));.  if( pDat
17a20 61 62 61 73 65 20 26 26 20 70 44 61 74 61 62 61  abase && pDataba
17a30 73 65 2d 3e 7a 3d 3d 30 20 29 7b 0a 20 20 20 20  se->z==0 ){.    
17a40 70 44 61 74 61 62 61 73 65 20 3d 20 30 3b 0a 20  pDatabase = 0;. 
17a50 20 7d 0a 20 20 69 66 28 20 70 44 61 74 61 62 61   }.  if( pDataba
17a60 73 65 20 26 26 20 70 54 61 62 6c 65 20 29 7b 0a  se && pTable ){.
17a70 20 20 20 20 54 6f 6b 65 6e 20 2a 70 54 65 6d 70      Token *pTemp
17a80 20 3d 20 70 44 61 74 61 62 61 73 65 3b 0a 20 20   = pDatabase;.  
17a90 20 20 70 44 61 74 61 62 61 73 65 20 3d 20 70 54    pDatabase = pT
17aa0 61 62 6c 65 3b 0a 20 20 20 20 70 54 61 62 6c 65  able;.    pTable
17ab0 20 3d 20 70 54 65 6d 70 3b 0a 20 20 7d 0a 20 20   = pTemp;.  }.  
17ac0 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73  pItem->zName = s
17ad0 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f  qlite3NameFromTo
17ae0 6b 65 6e 28 64 62 2c 20 70 54 61 62 6c 65 29 3b  ken(db, pTable);
17af0 0a 20 20 70 49 74 65 6d 2d 3e 7a 44 61 74 61 62  .  pItem->zDatab
17b00 61 73 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d  ase = sqlite3Nam
17b10 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70  eFromToken(db, p
17b20 44 61 74 61 62 61 73 65 29 3b 0a 20 20 70 49 74  Database);.  pIt
17b30 65 6d 2d 3e 69 43 75 72 73 6f 72 20 3d 20 2d 31  em->iCursor = -1
17b40 3b 0a 20 20 70 49 74 65 6d 2d 3e 69 73 50 6f 70  ;.  pItem->isPop
17b50 75 6c 61 74 65 64 20 3d 20 30 3b 0a 20 20 70 4c  ulated = 0;.  pL
17b60 69 73 74 2d 3e 6e 53 72 63 2b 2b 3b 0a 20 20 72  ist->nSrc++;.  r
17b70 65 74 75 72 6e 20 70 4c 69 73 74 3b 0a 7d 0a 0a  eturn pList;.}..
17b80 2f 2a 0a 2a 2a 20 41 73 73 69 67 6e 20 63 75 72  /*.** Assign cur
17b90 73 6f 72 73 20 74 6f 20 61 6c 6c 20 74 61 62 6c  sors to all tabl
17ba0 65 73 20 69 6e 20 61 20 53 72 63 4c 69 73 74 0a  es in a SrcList.
17bb0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53  */.void sqlite3S
17bc0 72 63 4c 69 73 74 41 73 73 69 67 6e 43 75 72 73  rcListAssignCurs
17bd0 6f 72 73 28 50 61 72 73 65 20 2a 70 50 61 72 73  ors(Parse *pPars
17be0 65 2c 20 53 72 63 4c 69 73 74 20 2a 70 4c 69 73  e, SrcList *pLis
17bf0 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73  t){.  int i;.  s
17c00 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
17c10 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 61 73 73  em *pItem;.  ass
17c20 65 72 74 28 70 4c 69 73 74 20 7c 7c 20 70 50 61  ert(pList || pPa
17c30 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rse->db->mallocF
17c40 61 69 6c 65 64 20 29 3b 0a 20 20 69 66 28 20 70  ailed );.  if( p
17c50 4c 69 73 74 20 29 7b 0a 20 20 20 20 66 6f 72 28  List ){.    for(
17c60 69 3d 30 2c 20 70 49 74 65 6d 3d 70 4c 69 73 74  i=0, pItem=pList
17c70 2d 3e 61 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 53  ->a; i<pList->nS
17c80 72 63 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b  rc; i++, pItem++
17c90 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 49 74  ){.      if( pIt
17ca0 65 6d 2d 3e 69 43 75 72 73 6f 72 3e 3d 30 20 29  em->iCursor>=0 )
17cb0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 70 49   break;.      pI
17cc0 74 65 6d 2d 3e 69 43 75 72 73 6f 72 20 3d 20 70  tem->iCursor = p
17cd0 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20  Parse->nTab++;. 
17ce0 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e       if( pItem->
17cf0 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20  pSelect ){.     
17d00 20 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73     sqlite3SrcLis
17d10 74 41 73 73 69 67 6e 43 75 72 73 6f 72 73 28 70  tAssignCursors(p
17d20 50 61 72 73 65 2c 20 70 49 74 65 6d 2d 3e 70 53  Parse, pItem->pS
17d30 65 6c 65 63 74 2d 3e 70 53 72 63 29 3b 0a 20 20  elect->pSrc);.  
17d40 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
17d50 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20  }../*.** Delete 
17d60 61 6e 20 65 6e 74 69 72 65 20 53 72 63 4c 69 73  an entire SrcLis
17d70 74 20 69 6e 63 6c 75 64 69 6e 67 20 61 6c 6c 20  t including all 
17d80 69 74 73 20 73 75 62 73 74 72 75 63 74 75 72 65  its substructure
17d90 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
17da0 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28 53  3SrcListDelete(S
17db0 72 63 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a  rcList *pList){.
17dc0 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63    int i;.  struc
17dd0 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
17de0 70 49 74 65 6d 3b 0a 20 20 69 66 28 20 70 4c 69  pItem;.  if( pLi
17df0 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  st==0 ) return;.
17e00 20 20 66 6f 72 28 70 49 74 65 6d 3d 70 4c 69 73    for(pItem=pLis
17e10 74 2d 3e 61 2c 20 69 3d 30 3b 20 69 3c 70 4c 69  t->a, i=0; i<pLi
17e20 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70  st->nSrc; i++, p
17e30 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 73 71 6c  Item++){.    sql
17e40 69 74 65 33 5f 66 72 65 65 28 70 49 74 65 6d 2d  ite3_free(pItem-
17e50 3e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20 20  >zDatabase);.   
17e60 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 49   sqlite3_free(pI
17e70 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  tem->zName);.   
17e80 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 49   sqlite3_free(pI
17e90 74 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20 20  tem->zAlias);.  
17ea0 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54    sqlite3DeleteT
17eb0 61 62 6c 65 28 70 49 74 65 6d 2d 3e 70 54 61 62  able(pItem->pTab
17ec0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65  );.    sqlite3Se
17ed0 6c 65 63 74 44 65 6c 65 74 65 28 70 49 74 65 6d  lectDelete(pItem
17ee0 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20  ->pSelect);.    
17ef0 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
17f00 65 28 70 49 74 65 6d 2d 3e 70 4f 6e 29 3b 0a 20  e(pItem->pOn);. 
17f10 20 20 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74     sqlite3IdList
17f20 44 65 6c 65 74 65 28 70 49 74 65 6d 2d 3e 70 55  Delete(pItem->pU
17f30 73 69 6e 67 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  sing);.  }.  sql
17f40 69 74 65 33 5f 66 72 65 65 28 70 4c 69 73 74 29  ite3_free(pList)
17f50 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
17f60 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
17f70 64 20 62 79 20 74 68 65 20 70 61 72 73 65 72 20  d by the parser 
17f80 74 6f 20 61 64 64 20 61 20 6e 65 77 20 74 65 72  to add a new ter
17f90 6d 20 74 6f 20 74 68 65 0a 2a 2a 20 65 6e 64 20  m to the.** end 
17fa0 6f 66 20 61 20 67 72 6f 77 69 6e 67 20 46 52 4f  of a growing FRO
17fb0 4d 20 63 6c 61 75 73 65 2e 20 20 54 68 65 20 22  M clause.  The "
17fc0 70 22 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  p" parameter is 
17fd0 74 68 65 20 70 61 72 74 20 6f 66 0a 2a 2a 20 74  the part of.** t
17fe0 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74  he FROM clause t
17ff0 68 61 74 20 68 61 73 20 61 6c 72 65 61 64 79 20  hat has already 
18000 62 65 65 6e 20 63 6f 6e 73 74 72 75 63 74 65 64  been constructed
18010 2e 20 20 22 70 22 20 69 73 20 4e 55 4c 4c 0a 2a  .  "p" is NULL.*
18020 2a 20 69 66 20 74 68 69 73 20 69 73 20 74 68 65  * if this is the
18030 20 66 69 72 73 74 20 74 65 72 6d 20 6f 66 20 74   first term of t
18040 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20  he FROM clause. 
18050 20 70 54 61 62 6c 65 20 61 6e 64 20 70 44 61 74   pTable and pDat
18060 61 62 61 73 65 0a 2a 2a 20 61 72 65 20 74 68 65  abase.** are the
18070 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62   name of the tab
18080 6c 65 20 61 6e 64 20 64 61 74 61 62 61 73 65 20  le and database 
18090 6e 61 6d 65 64 20 69 6e 20 74 68 65 20 46 52 4f  named in the FRO
180a0 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 2e 0a 2a  M clause term..*
180b0 2a 20 70 44 61 74 61 62 61 73 65 20 69 73 20 4e  * pDatabase is N
180c0 55 4c 4c 20 69 66 20 74 68 65 20 64 61 74 61 62  ULL if the datab
180d0 61 73 65 20 6e 61 6d 65 20 71 75 61 6c 69 66 69  ase name qualifi
180e0 65 72 20 69 73 20 6d 69 73 73 69 6e 67 20 2d 20  er is missing - 
180f0 74 68 65 0a 2a 2a 20 75 73 75 61 6c 20 63 61 73  the.** usual cas
18100 65 2e 20 20 49 66 20 74 68 65 20 74 65 72 6d 20  e.  If the term 
18110 68 61 73 20 61 20 61 6c 69 61 73 2c 20 74 68 65  has a alias, the
18120 6e 20 70 41 6c 69 61 73 20 70 6f 69 6e 74 73 20  n pAlias points 
18130 74 6f 20 74 68 65 0a 2a 2a 20 61 6c 69 61 73 20  to the.** alias 
18140 74 6f 6b 65 6e 2e 20 20 49 66 20 74 68 65 20 74  token.  If the t
18150 65 72 6d 20 69 73 20 61 20 73 75 62 71 75 65 72  erm is a subquer
18160 79 2c 20 74 68 65 6e 20 70 53 75 62 71 75 65 72  y, then pSubquer
18170 79 20 69 73 20 74 68 65 0a 2a 2a 20 53 45 4c 45  y is the.** SELE
18180 43 54 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61  CT statement tha
18190 74 20 74 68 65 20 73 75 62 71 75 65 72 79 20 65  t the subquery e
181a0 6e 63 6f 64 65 73 2e 20 20 54 68 65 20 70 54 61  ncodes.  The pTa
181b0 62 6c 65 20 61 6e 64 0a 2a 2a 20 70 44 61 74 61  ble and.** pData
181c0 62 61 73 65 20 70 61 72 61 6d 65 74 65 72 73 20  base parameters 
181d0 61 72 65 20 4e 55 4c 4c 20 66 6f 72 20 73 75 62  are NULL for sub
181e0 71 75 65 72 69 65 73 2e 20 20 54 68 65 20 70 4f  queries.  The pO
181f0 6e 20 61 6e 64 20 70 55 73 69 6e 67 0a 2a 2a 20  n and pUsing.** 
18200 70 61 72 61 6d 65 74 65 72 73 20 61 72 65 20 74  parameters are t
18210 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68  he content of th
18220 65 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 63  e ON and USING c
18230 6c 61 75 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 52 65  lauses..**.** Re
18240 74 75 72 6e 20 61 20 6e 65 77 20 53 72 63 4c 69  turn a new SrcLi
18250 73 74 20 77 68 69 63 68 20 65 6e 63 6f 64 65 73  st which encodes
18260 20 69 73 20 74 68 65 20 46 52 4f 4d 20 77 69 74   is the FROM wit
18270 68 20 74 68 65 20 6e 65 77 0a 2a 2a 20 74 65 72  h the new.** ter
18280 6d 20 61 64 64 65 64 2e 0a 2a 2f 0a 53 72 63 4c  m added..*/.SrcL
18290 69 73 74 20 2a 73 71 6c 69 74 65 33 53 72 63 4c  ist *sqlite3SrcL
182a0 69 73 74 41 70 70 65 6e 64 46 72 6f 6d 54 65 72  istAppendFromTer
182b0 6d 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  m(.  Parse *pPar
182c0 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  se,          /* 
182d0 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
182e0 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 2c  */.  SrcList *p,
182f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
18300 54 68 65 20 6c 65 66 74 20 70 61 72 74 20 6f 66  The left part of
18310 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
18320 20 61 6c 72 65 61 64 79 20 73 65 65 6e 20 2a 2f   already seen */
18330 0a 20 20 54 6f 6b 65 6e 20 2a 70 54 61 62 6c 65  .  Token *pTable
18340 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61  ,          /* Na
18350 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  me of the table 
18360 74 6f 20 61 64 64 20 74 6f 20 74 68 65 20 46 52  to add to the FR
18370 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 54  OM clause */.  T
18380 6f 6b 65 6e 20 2a 70 44 61 74 61 62 61 73 65 2c  oken *pDatabase,
18390 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
183a0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63  f the database c
183b0 6f 6e 74 61 69 6e 69 6e 67 20 70 54 61 62 6c 65  ontaining pTable
183c0 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 41 6c   */.  Token *pAl
183d0 69 61 73 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  ias,          /*
183e0 20 54 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20   The right-hand 
183f0 73 69 64 65 20 6f 66 20 74 68 65 20 41 53 20 73  side of the AS s
18400 75 62 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a  ubexpression */.
18410 20 20 53 65 6c 65 63 74 20 2a 70 53 75 62 71 75    Select *pSubqu
18420 65 72 79 2c 20 20 20 20 20 20 2f 2a 20 41 20 73  ery,      /* A s
18430 75 62 71 75 65 72 79 20 75 73 65 64 20 69 6e 20  ubquery used in 
18440 70 6c 61 63 65 20 6f 66 20 61 20 74 61 62 6c 65  place of a table
18450 20 6e 61 6d 65 20 2a 2f 0a 20 20 45 78 70 72 20   name */.  Expr 
18460 2a 70 4f 6e 2c 20 20 20 20 20 20 20 20 20 20 20  *pOn,           
18470 20 20 20 2f 2a 20 54 68 65 20 4f 4e 20 63 6c 61     /* The ON cla
18480 75 73 65 20 6f 66 20 61 20 6a 6f 69 6e 20 2a 2f  use of a join */
18490 0a 20 20 49 64 4c 69 73 74 20 2a 70 55 73 69 6e  .  IdList *pUsin
184a0 67 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  g          /* Th
184b0 65 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20 6f  e USING clause o
184c0 66 20 61 20 6a 6f 69 6e 20 2a 2f 0a 29 7b 0a 20  f a join */.){. 
184d0 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
184e0 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 73  item *pItem;.  s
184f0 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
18500 72 73 65 2d 3e 64 62 3b 0a 20 20 70 20 3d 20 73  rse->db;.  p = s
18510 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70 70  qlite3SrcListApp
18520 65 6e 64 28 64 62 2c 20 70 2c 20 70 54 61 62 6c  end(db, p, pTabl
18530 65 2c 20 70 44 61 74 61 62 61 73 65 29 3b 0a 20  e, pDatabase);. 
18540 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20 70 2d 3e   if( p==0 || p->
18550 6e 53 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20 73  nSrc==0 ){.    s
18560 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
18570 28 70 4f 6e 29 3b 0a 20 20 20 20 73 71 6c 69 74  (pOn);.    sqlit
18580 65 33 49 64 4c 69 73 74 44 65 6c 65 74 65 28 70  e3IdListDelete(p
18590 55 73 69 6e 67 29 3b 0a 20 20 20 20 73 71 6c 69  Using);.    sqli
185a0 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28  te3SelectDelete(
185b0 70 53 75 62 71 75 65 72 79 29 3b 0a 20 20 20 20  pSubquery);.    
185c0 72 65 74 75 72 6e 20 70 3b 0a 20 20 7d 0a 20 20  return p;.  }.  
185d0 70 49 74 65 6d 20 3d 20 26 70 2d 3e 61 5b 70 2d  pItem = &p->a[p-
185e0 3e 6e 53 72 63 2d 31 5d 3b 0a 20 20 69 66 28 20  >nSrc-1];.  if( 
185f0 70 41 6c 69 61 73 20 26 26 20 70 41 6c 69 61 73  pAlias && pAlias
18600 2d 3e 6e 20 29 7b 0a 20 20 20 20 70 49 74 65 6d  ->n ){.    pItem
18610 2d 3e 7a 41 6c 69 61 73 20 3d 20 73 71 6c 69 74  ->zAlias = sqlit
18620 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28  e3NameFromToken(
18630 64 62 2c 20 70 41 6c 69 61 73 29 3b 0a 20 20 7d  db, pAlias);.  }
18640 0a 20 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63  .  pItem->pSelec
18650 74 20 3d 20 70 53 75 62 71 75 65 72 79 3b 0a 20  t = pSubquery;. 
18660 20 70 49 74 65 6d 2d 3e 70 4f 6e 20 3d 20 70 4f   pItem->pOn = pO
18670 6e 3b 0a 20 20 70 49 74 65 6d 2d 3e 70 55 73 69  n;.  pItem->pUsi
18680 6e 67 20 3d 20 70 55 73 69 6e 67 3b 0a 20 20 72  ng = pUsing;.  r
18690 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn p;.}../*.*
186a0 2a 20 57 68 65 6e 20 62 75 69 6c 64 69 6e 67 20  * When building 
186b0 75 70 20 61 20 46 52 4f 4d 20 63 6c 61 75 73 65  up a FROM clause
186c0 20 69 6e 20 74 68 65 20 70 61 72 73 65 72 2c 20   in the parser, 
186d0 74 68 65 20 6a 6f 69 6e 20 6f 70 65 72 61 74 6f  the join operato
186e0 72 0a 2a 2a 20 69 73 20 69 6e 69 74 69 61 6c 6c  r.** is initiall
186f0 79 20 61 74 74 61 63 68 65 64 20 74 6f 20 74 68  y attached to th
18700 65 20 6c 65 66 74 20 6f 70 65 72 61 6e 64 2e 20  e left operand. 
18710 20 42 75 74 20 74 68 65 20 63 6f 64 65 20 67 65   But the code ge
18720 6e 65 72 61 74 6f 72 0a 2a 2a 20 65 78 70 65 63  nerator.** expec
18730 74 73 20 74 68 65 20 6a 6f 69 6e 20 6f 70 65 72  ts the join oper
18740 61 74 6f 72 20 74 6f 20 62 65 20 6f 6e 20 74 68  ator to be on th
18750 65 20 72 69 67 68 74 20 6f 70 65 72 61 6e 64 2e  e right operand.
18760 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a    This routine.*
18770 2a 20 53 68 69 66 74 73 20 61 6c 6c 20 6a 6f 69  * Shifts all joi
18780 6e 20 6f 70 65 72 61 74 6f 72 73 20 66 72 6f 6d  n operators from
18790 20 6c 65 66 74 20 74 6f 20 72 69 67 68 74 20 66   left to right f
187a0 6f 72 20 61 6e 20 65 6e 74 69 72 65 20 46 52 4f  or an entire FRO
187b0 4d 0a 2a 2a 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a  M.** clause..**.
187c0 2a 2a 20 45 78 61 6d 70 6c 65 3a 20 53 75 70 70  ** Example: Supp
187d0 6f 73 65 20 74 68 65 20 6a 6f 69 6e 20 69 73 20  ose the join is 
187e0 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a  like this:.**.**
187f0 20 20 20 20 20 20 20 20 20 20 20 41 20 6e 61 74             A nat
18800 75 72 61 6c 20 63 72 6f 73 73 20 6a 6f 69 6e 20  ural cross join 
18810 42 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 70 65 72  B.**.** The oper
18820 61 74 6f 72 20 69 73 20 22 6e 61 74 75 72 61 6c  ator is "natural
18830 20 63 72 6f 73 73 20 6a 6f 69 6e 22 2e 20 20 54   cross join".  T
18840 68 65 20 41 20 61 6e 64 20 42 20 6f 70 65 72 61  he A and B opera
18850 6e 64 73 20 61 72 65 20 73 74 6f 72 65 64 0a 2a  nds are stored.*
18860 2a 20 69 6e 20 70 2d 3e 61 5b 30 5d 20 61 6e 64  * in p->a[0] and
18870 20 70 2d 3e 61 5b 31 5d 2c 20 72 65 73 70 65 63   p->a[1], respec
18880 74 69 76 65 6c 79 2e 20 20 54 68 65 20 70 61 72  tively.  The par
18890 73 65 72 20 69 6e 69 74 69 61 6c 6c 79 20 73 74  ser initially st
188a0 6f 72 65 73 20 74 68 65 0a 2a 2a 20 6f 70 65 72  ores the.** oper
188b0 61 74 6f 72 20 77 69 74 68 20 41 2e 20 20 54 68  ator with A.  Th
188c0 69 73 20 72 6f 75 74 69 6e 65 20 73 68 69 66 74  is routine shift
188d0 73 20 74 68 61 74 20 6f 70 65 72 61 74 6f 72 20  s that operator 
188e0 6f 76 65 72 20 74 6f 20 42 2e 0a 2a 2f 0a 76 6f  over to B..*/.vo
188f0 69 64 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73  id sqlite3SrcLis
18900 74 53 68 69 66 74 4a 6f 69 6e 54 79 70 65 28 53  tShiftJoinType(S
18910 72 63 4c 69 73 74 20 2a 70 29 7b 0a 20 20 69 66  rcList *p){.  if
18920 28 20 70 20 26 26 20 70 2d 3e 61 20 29 7b 0a 20  ( p && p->a ){. 
18930 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f     int i;.    fo
18940 72 28 69 3d 70 2d 3e 6e 53 72 63 2d 31 3b 20 69  r(i=p->nSrc-1; i
18950 3e 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 20 20  >0; i--){.      
18960 70 2d 3e 61 5b 69 5d 2e 6a 6f 69 6e 74 79 70 65  p->a[i].jointype
18970 20 3d 20 70 2d 3e 61 5b 69 2d 31 5d 2e 6a 6f 69   = p->a[i-1].joi
18980 6e 74 79 70 65 3b 0a 20 20 20 20 7d 0a 20 20 20  ntype;.    }.   
18990 20 70 2d 3e 61 5b 30 5d 2e 6a 6f 69 6e 74 79 70   p->a[0].jointyp
189a0 65 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  e = 0;.  }.}../*
189b0 0a 2a 2a 20 42 65 67 69 6e 20 61 20 74 72 61 6e  .** Begin a tran
189c0 73 61 63 74 69 6f 6e 0a 2a 2f 0a 76 6f 69 64 20  saction.*/.void 
189d0 73 71 6c 69 74 65 33 42 65 67 69 6e 54 72 61 6e  sqlite3BeginTran
189e0 73 61 63 74 69 6f 6e 28 50 61 72 73 65 20 2a 70  saction(Parse *p
189f0 50 61 72 73 65 2c 20 69 6e 74 20 74 79 70 65 29  Parse, int type)
18a00 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  {.  sqlite3 *db;
18a10 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 69 6e  .  Vdbe *v;.  in
18a20 74 20 69 3b 0a 0a 20 20 69 66 28 20 70 50 61 72  t i;..  if( pPar
18a30 73 65 3d 3d 30 20 7c 7c 20 28 64 62 3d 70 50 61  se==0 || (db=pPa
18a40 72 73 65 2d 3e 64 62 29 3d 3d 30 20 7c 7c 20 64  rse->db)==0 || d
18a50 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 3d 3d 30  b->aDb[0].pBt==0
18a60 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
18a70 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c   pParse->nErr ||
18a80 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
18a90 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66  d ) return;.  if
18aa0 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65  ( sqlite3AuthChe
18ab0 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54  ck(pParse, SQLIT
18ac0 45 5f 54 52 41 4e 53 41 43 54 49 4f 4e 2c 20 22  E_TRANSACTION, "
18ad0 42 45 47 49 4e 22 2c 20 30 2c 20 30 29 20 29 20  BEGIN", 0, 0) ) 
18ae0 72 65 74 75 72 6e 3b 0a 0a 20 20 76 20 3d 20 73  return;..  v = s
18af0 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
18b00 61 72 73 65 29 3b 0a 20 20 69 66 28 20 21 76 20  arse);.  if( !v 
18b10 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
18b20 74 79 70 65 21 3d 54 4b 5f 44 45 46 45 52 52 45  type!=TK_DEFERRE
18b30 44 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30  D ){.    for(i=0
18b40 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b  ; i<db->nDb; i++
18b50 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
18b60 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
18b70 5f 54 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69 2c  _Transaction, i,
18b80 20 28 74 79 70 65 3d 3d 54 4b 5f 45 58 43 4c 55   (type==TK_EXCLU
18b90 53 49 56 45 29 2b 31 29 3b 0a 20 20 20 20 20 20  SIVE)+1);.      
18ba0 73 71 6c 69 74 65 33 56 64 62 65 55 73 65 73 42  sqlite3VdbeUsesB
18bb0 74 72 65 65 28 76 2c 20 69 29 3b 0a 20 20 20 20  tree(v, i);.    
18bc0 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56  }.  }.  sqlite3V
18bd0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
18be0 41 75 74 6f 43 6f 6d 6d 69 74 2c 20 30 2c 20 30  AutoCommit, 0, 0
18bf0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d  );.}../*.** Comm
18c00 69 74 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  it a transaction
18c10 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
18c20 43 6f 6d 6d 69 74 54 72 61 6e 73 61 63 74 69 6f  CommitTransactio
18c30 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29  n(Parse *pParse)
18c40 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  {.  sqlite3 *db;
18c50 0a 20 20 56 64 62 65 20 2a 76 3b 0a 0a 20 20 69  .  Vdbe *v;..  i
18c60 66 28 20 70 50 61 72 73 65 3d 3d 30 20 7c 7c 20  f( pParse==0 || 
18c70 28 64 62 3d 70 50 61 72 73 65 2d 3e 64 62 29 3d  (db=pParse->db)=
18c80 3d 30 20 7c 7c 20 64 62 2d 3e 61 44 62 5b 30 5d  =0 || db->aDb[0]
18c90 2e 70 42 74 3d 3d 30 20 29 20 72 65 74 75 72 6e  .pBt==0 ) return
18ca0 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  ;.  if( pParse->
18cb0 6e 45 72 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c  nErr || db->mall
18cc0 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74 75 72  ocFailed ) retur
18cd0 6e 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  n;.  if( sqlite3
18ce0 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65  AuthCheck(pParse
18cf0 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 41 43  , SQLITE_TRANSAC
18d00 54 49 4f 4e 2c 20 22 43 4f 4d 4d 49 54 22 2c 20  TION, "COMMIT", 
18d10 30 2c 20 30 29 20 29 20 72 65 74 75 72 6e 3b 0a  0, 0) ) return;.
18d20 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65  .  v = sqlite3Ge
18d30 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
18d40 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20 73 71   if( v ){.    sq
18d50 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
18d60 76 2c 20 4f 50 5f 41 75 74 6f 43 6f 6d 6d 69 74  v, OP_AutoCommit
18d70 2c 20 31 2c 20 30 29 3b 0a 20 20 7d 0a 7d 0a 0a  , 1, 0);.  }.}..
18d80 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 61  /*.** Rollback a
18d90 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2f 0a   transaction.*/.
18da0 76 6f 69 64 20 73 71 6c 69 74 65 33 52 6f 6c 6c  void sqlite3Roll
18db0 62 61 63 6b 54 72 61 6e 73 61 63 74 69 6f 6e 28  backTransaction(
18dc0 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a  Parse *pParse){.
18dd0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
18de0 20 56 64 62 65 20 2a 76 3b 0a 0a 20 20 69 66 28   Vdbe *v;..  if(
18df0 20 70 50 61 72 73 65 3d 3d 30 20 7c 7c 20 28 64   pParse==0 || (d
18e00 62 3d 70 50 61 72 73 65 2d 3e 64 62 29 3d 3d 30  b=pParse->db)==0
18e10 20 7c 7c 20 64 62 2d 3e 61 44 62 5b 30 5d 2e 70   || db->aDb[0].p
18e20 42 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  Bt==0 ) return;.
18e30 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45    if( pParse->nE
18e40 72 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63  rr || db->malloc
18e50 46 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b  Failed ) return;
18e60 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75  .  if( sqlite3Au
18e70 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  thCheck(pParse, 
18e80 53 51 4c 49 54 45 5f 54 52 41 4e 53 41 43 54 49  SQLITE_TRANSACTI
18e90 4f 4e 2c 20 22 52 4f 4c 4c 42 41 43 4b 22 2c 20  ON, "ROLLBACK", 
18ea0 30 2c 20 30 29 20 29 20 72 65 74 75 72 6e 3b 0a  0, 0) ) return;.
18eb0 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65  .  v = sqlite3Ge
18ec0 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
18ed0 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20 73 71   if( v ){.    sq
18ee0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
18ef0 76 2c 20 4f 50 5f 41 75 74 6f 43 6f 6d 6d 69 74  v, OP_AutoCommit
18f00 2c 20 31 2c 20 31 29 3b 0a 20 20 7d 0a 7d 0a 0a  , 1, 1);.  }.}..
18f10 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20  /*.** Make sure 
18f20 74 68 65 20 54 45 4d 50 20 64 61 74 61 62 61 73  the TEMP databas
18f30 65 20 69 73 20 6f 70 65 6e 20 61 6e 64 20 61 76  e is open and av
18f40 61 69 6c 61 62 6c 65 20 66 6f 72 20 75 73 65 2e  ailable for use.
18f50 20 20 52 65 74 75 72 6e 0a 2a 2a 20 74 68 65 20    Return.** the 
18f60 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73  number of errors
18f70 2e 20 20 4c 65 61 76 65 20 61 6e 79 20 65 72 72  .  Leave any err
18f80 6f 72 20 6d 65 73 73 61 67 65 73 20 69 6e 20 74  or messages in t
18f90 68 65 20 70 50 61 72 73 65 20 73 74 72 75 63 74  he pParse struct
18fa0 75 72 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ure..*/.int sqli
18fb0 74 65 33 4f 70 65 6e 54 65 6d 70 44 61 74 61 62  te3OpenTempDatab
18fc0 61 73 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  ase(Parse *pPars
18fd0 65 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  e){.  sqlite3 *d
18fe0 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
18ff0 20 20 69 66 28 20 64 62 2d 3e 61 44 62 5b 31 5d    if( db->aDb[1]
19000 2e 70 42 74 3d 3d 30 20 26 26 20 21 70 50 61 72  .pBt==0 && !pPar
19010 73 65 2d 3e 65 78 70 6c 61 69 6e 20 29 7b 0a 20  se->explain ){. 
19020 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 73     int rc;.    s
19030 74 61 74 69 63 20 63 6f 6e 73 74 20 69 6e 74 20  tatic const int 
19040 66 6c 61 67 73 20 3d 20 0a 20 20 20 20 20 20 20  flags = .       
19050 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52     SQLITE_OPEN_R
19060 45 41 44 57 52 49 54 45 20 7c 0a 20 20 20 20 20  EADWRITE |.     
19070 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e       SQLITE_OPEN
19080 5f 43 52 45 41 54 45 20 7c 0a 20 20 20 20 20 20  _CREATE |.      
19090 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f      SQLITE_OPEN_
190a0 45 58 43 4c 55 53 49 56 45 20 7c 0a 20 20 20 20  EXCLUSIVE |.    
190b0 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45        SQLITE_OPE
190c0 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 20  N_DELETEONCLOSE 
190d0 7c 0a 20 20 20 20 20 20 20 20 20 20 53 51 4c 49  |.          SQLI
190e0 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 44 42 3b  TE_OPEN_TEMP_DB;
190f0 0a 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ..    rc = sqlit
19100 65 33 42 74 72 65 65 46 61 63 74 6f 72 79 28 64  e3BtreeFactory(d
19110 62 2c 20 30 2c 20 30 2c 20 53 51 4c 49 54 45 5f  b, 0, 0, SQLITE_
19120 44 45 46 41 55 4c 54 5f 43 41 43 48 45 5f 53 49  DEFAULT_CACHE_SI
19130 5a 45 2c 20 66 6c 61 67 73 2c 0a 20 20 20 20 20  ZE, flags,.     
19140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19150 20 20 20 20 20 20 20 20 20 20 20 20 26 64 62 2d              &db-
19160 3e 61 44 62 5b 31 5d 2e 70 42 74 29 3b 0a 20 20  >aDb[1].pBt);.  
19170 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
19180 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  _OK ){.      sql
19190 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
191a0 72 73 65 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20  rse, "unable to 
191b0 6f 70 65 6e 20 61 20 74 65 6d 70 6f 72 61 72 79  open a temporary
191c0 20 64 61 74 61 62 61 73 65 20 22 0a 20 20 20 20   database ".    
191d0 20 20 20 20 22 66 69 6c 65 20 66 6f 72 20 73 74      "file for st
191e0 6f 72 69 6e 67 20 74 65 6d 70 6f 72 61 72 79 20  oring temporary 
191f0 74 61 62 6c 65 73 22 29 3b 0a 20 20 20 20 20 20  tables");.      
19200 70 50 61 72 73 65 2d 3e 72 63 20 3d 20 72 63 3b  pParse->rc = rc;
19210 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b  .      return 1;
19220 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 64  .    }.    if( d
19230 62 2d 3e 66 6c 61 67 73 20 26 20 21 64 62 2d 3e  b->flags & !db->
19240 61 75 74 6f 43 6f 6d 6d 69 74 20 29 7b 0a 20 20  autoCommit ){.  
19250 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
19260 42 74 72 65 65 42 65 67 69 6e 54 72 61 6e 73 28  BtreeBeginTrans(
19270 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 42 74 2c 20  db->aDb[1].pBt, 
19280 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  1);.      if( rc
19290 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
192a0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
192b0 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
192c0 75 6e 61 62 6c 65 20 74 6f 20 67 65 74 20 61 20  unable to get a 
192d0 77 72 69 74 65 20 6c 6f 63 6b 20 6f 6e 20 22 0a  write lock on ".
192e0 20 20 20 20 20 20 20 20 20 20 22 74 68 65 20 74            "the t
192f0 65 6d 70 6f 72 61 72 79 20 64 61 74 61 62 61 73  emporary databas
19300 65 20 66 69 6c 65 22 29 3b 0a 20 20 20 20 20 20  e file");.      
19310 20 20 70 50 61 72 73 65 2d 3e 72 63 20 3d 20 72    pParse->rc = r
19320 63 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  c;.        retur
19330 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  n 1;.      }.   
19340 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 64   }.    assert( d
19350 62 2d 3e 61 44 62 5b 31 5d 2e 70 53 63 68 65 6d  b->aDb[1].pSchem
19360 61 20 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  a );.  }.  retur
19370 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  n 0;.}../*.** Ge
19380 6e 65 72 61 74 65 20 56 44 42 45 20 63 6f 64 65  nerate VDBE code
19390 20 74 68 61 74 20 77 69 6c 6c 20 76 65 72 69 66   that will verif
193a0 79 20 74 68 65 20 73 63 68 65 6d 61 20 63 6f 6f  y the schema coo
193b0 6b 69 65 20 61 6e 64 20 73 74 61 72 74 0a 2a 2a  kie and start.**
193c0 20 61 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74   a read-transact
193d0 69 6f 6e 20 66 6f 72 20 61 6c 6c 20 6e 61 6d 65  ion for all name
193e0 64 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73  d database files
193f0 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 69 6d  ..**.** It is im
19400 70 6f 72 74 61 6e 74 20 74 68 61 74 20 61 6c 6c  portant that all
19410 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 73 20   schema cookies 
19420 62 65 20 76 65 72 69 66 69 65 64 20 61 6e 64 20  be verified and 
19430 61 6c 6c 0a 2a 2a 20 72 65 61 64 20 74 72 61 6e  all.** read tran
19440 73 61 63 74 69 6f 6e 73 20 62 65 20 73 74 61 72  sactions be star
19450 74 65 64 20 62 65 66 6f 72 65 20 61 6e 79 74 68  ted before anyth
19460 69 6e 67 20 65 6c 73 65 20 68 61 70 70 65 6e 73  ing else happens
19470 20 69 6e 0a 2a 2a 20 74 68 65 20 56 44 42 45 20   in.** the VDBE 
19480 70 72 6f 67 72 61 6d 2e 20 20 42 75 74 20 74 68  program.  But th
19490 69 73 20 72 6f 75 74 69 6e 65 20 63 61 6e 20 62  is routine can b
194a0 65 20 63 61 6c 6c 65 64 20 61 66 74 65 72 20 6d  e called after m
194b0 75 63 68 20 6f 74 68 65 72 0a 2a 2a 20 63 6f 64  uch other.** cod
194c0 65 20 68 61 73 20 62 65 65 6e 20 67 65 6e 65 72  e has been gener
194d0 61 74 65 64 2e 20 20 53 6f 20 68 65 72 65 20 69  ated.  So here i
194e0 73 20 77 68 61 74 20 77 65 20 64 6f 3a 0a 2a 2a  s what we do:.**
194f0 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 74 69  .** The first ti
19500 6d 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  me this routine 
19510 69 73 20 63 61 6c 6c 65 64 2c 20 77 65 20 63 6f  is called, we co
19520 64 65 20 61 6e 20 4f 50 5f 47 6f 74 6f 20 74 68  de an OP_Goto th
19530 61 74 0a 2a 2a 20 77 69 6c 6c 20 6a 75 6d 70 20  at.** will jump 
19540 74 6f 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20  to a subroutine 
19550 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  at the end of th
19560 65 20 70 72 6f 67 72 61 6d 2e 20 20 54 68 65 6e  e program.  Then
19570 20 77 65 0a 2a 2a 20 72 65 63 6f 72 64 20 65 76   we.** record ev
19580 65 72 79 20 64 61 74 61 62 61 73 65 20 74 68 61  ery database tha
19590 74 20 6e 65 65 64 73 20 69 74 73 20 73 63 68 65  t needs its sche
195a0 6d 61 20 76 65 72 69 66 69 65 64 20 69 6e 20 74  ma verified in t
195b0 68 65 0a 2a 2a 20 70 50 61 72 73 65 2d 3e 63 6f  he.** pParse->co
195c0 6f 6b 69 65 4d 61 73 6b 20 66 69 65 6c 64 2e 20  okieMask field. 
195d0 20 4c 61 74 65 72 2c 20 61 66 74 65 72 20 61 6c   Later, after al
195e0 6c 20 6f 74 68 65 72 20 63 6f 64 65 20 68 61 73  l other code has
195f0 20 62 65 65 6e 0a 2a 2a 20 67 65 6e 65 72 61 74   been.** generat
19600 65 64 2c 20 74 68 65 20 73 75 62 72 6f 75 74 69  ed, the subrouti
19610 6e 65 20 74 68 61 74 20 64 6f 65 73 20 74 68 65  ne that does the
19620 20 63 6f 6f 6b 69 65 20 76 65 72 69 66 69 63 61   cookie verifica
19630 74 69 6f 6e 73 20 61 6e 64 0a 2a 2a 20 73 74 61  tions and.** sta
19640 72 74 73 20 74 68 65 20 74 72 61 6e 73 61 63 74  rts the transact
19650 69 6f 6e 73 20 77 69 6c 6c 20 62 65 20 63 6f 64  ions will be cod
19660 65 64 20 61 6e 64 20 74 68 65 20 4f 50 5f 47 6f  ed and the OP_Go
19670 74 6f 20 50 32 20 76 61 6c 75 65 0a 2a 2a 20 77  to P2 value.** w
19680 69 6c 6c 20 62 65 20 6d 61 64 65 20 74 6f 20 70  ill be made to p
19690 6f 69 6e 74 20 74 6f 20 74 68 61 74 20 73 75 62  oint to that sub
196a0 72 6f 75 74 69 6e 65 2e 20 20 54 68 65 20 67 65  routine.  The ge
196b0 6e 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 0a  neration of the.
196c0 2a 2a 20 63 6f 6f 6b 69 65 20 76 65 72 69 66 69  ** cookie verifi
196d0 63 61 74 69 6f 6e 20 73 75 62 72 6f 75 74 69 6e  cation subroutin
196e0 65 20 63 6f 64 65 20 68 61 70 70 65 6e 73 20 69  e code happens i
196f0 6e 20 73 71 6c 69 74 65 33 46 69 6e 69 73 68 43  n sqlite3FinishC
19700 6f 64 69 6e 67 28 29 2e 0a 2a 2a 0a 2a 2a 20 49  oding()..**.** I
19710 66 20 69 44 62 3c 30 20 74 68 65 6e 20 63 6f 64  f iDb<0 then cod
19720 65 20 74 68 65 20 4f 50 5f 47 6f 74 6f 20 6f 6e  e the OP_Goto on
19730 6c 79 20 2d 20 64 6f 6e 27 74 20 73 65 74 20 66  ly - don't set f
19740 6c 61 67 20 74 6f 20 76 65 72 69 66 79 20 74 68  lag to verify th
19750 65 0a 2a 2a 20 73 63 68 65 6d 61 20 6f 6e 20 61  e.** schema on a
19760 6e 79 20 64 61 74 61 62 61 73 65 73 2e 20 20 54  ny databases.  T
19770 68 69 73 20 63 61 6e 20 62 65 20 75 73 65 64 20  his can be used 
19780 74 6f 20 70 6f 73 69 74 69 6f 6e 20 74 68 65 20  to position the 
19790 4f 50 5f 47 6f 74 6f 0a 2a 2a 20 65 61 72 6c 79  OP_Goto.** early
197a0 20 69 6e 20 74 68 65 20 63 6f 64 65 2c 20 62 65   in the code, be
197b0 66 6f 72 65 20 77 65 20 6b 6e 6f 77 20 69 66 20  fore we know if 
197c0 61 6e 79 20 64 61 74 61 62 61 73 65 20 74 61 62  any database tab
197d0 6c 65 73 20 77 69 6c 6c 20 62 65 20 75 73 65 64  les will be used
197e0 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
197f0 33 43 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d  3CodeVerifySchem
19800 61 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  a(Parse *pParse,
19810 20 69 6e 74 20 69 44 62 29 7b 0a 20 20 73 71 6c   int iDb){.  sql
19820 69 74 65 33 20 2a 64 62 3b 0a 20 20 56 64 62 65  ite3 *db;.  Vdbe
19830 20 2a 76 3b 0a 20 20 69 6e 74 20 6d 61 73 6b 3b   *v;.  int mask;
19840 0a 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47  ..  v = sqlite3G
19850 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
19860 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72 65 74    if( v==0 ) ret
19870 75 72 6e 3b 20 20 2f 2a 20 54 68 69 73 20 6f 6e  urn;  /* This on
19880 6c 79 20 68 61 70 70 65 6e 73 20 69 66 20 74 68  ly happens if th
19890 65 72 65 20 77 61 73 20 61 20 70 72 69 6f 72 20  ere was a prior 
198a0 65 72 72 6f 72 20 2a 2f 0a 20 20 64 62 20 3d 20  error */.  db = 
198b0 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66  pParse->db;.  if
198c0 28 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65  ( pParse->cookie
198d0 47 6f 74 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 70  Goto==0 ){.    p
198e0 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 47 6f 74  Parse->cookieGot
198f0 6f 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  o = sqlite3VdbeA
19900 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f  ddOp2(v, OP_Goto
19910 2c 20 30 2c 20 30 29 2b 31 3b 0a 20 20 7d 0a 20  , 0, 0)+1;.  }. 
19920 20 69 66 28 20 69 44 62 3e 3d 30 20 29 7b 0a 20   if( iDb>=0 ){. 
19930 20 20 20 61 73 73 65 72 74 28 20 69 44 62 3c 64     assert( iDb<d
19940 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 20 20 61 73  b->nDb );.    as
19950 73 65 72 74 28 20 64 62 2d 3e 61 44 62 5b 69 44  sert( db->aDb[iD
19960 62 5d 2e 70 42 74 21 3d 30 20 7c 7c 20 69 44 62  b].pBt!=0 || iDb
19970 3d 3d 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==1 );.    asser
19980 74 28 20 69 44 62 3c 53 51 4c 49 54 45 5f 4d 41  t( iDb<SQLITE_MA
19990 58 5f 41 54 54 41 43 48 45 44 2b 32 20 29 3b 0a  X_ATTACHED+2 );.
199a0 20 20 20 20 6d 61 73 6b 20 3d 20 31 3c 3c 69 44      mask = 1<<iD
199b0 62 3b 0a 20 20 20 20 69 66 28 20 28 70 50 61 72  b;.    if( (pPar
199c0 73 65 2d 3e 63 6f 6f 6b 69 65 4d 61 73 6b 20 26  se->cookieMask &
199d0 20 6d 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20   mask)==0 ){.   
199e0 20 20 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69     pParse->cooki
199f0 65 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a 20  eMask |= mask;. 
19a00 20 20 20 20 20 70 50 61 72 73 65 2d 3e 63 6f 6f       pParse->coo
19a10 6b 69 65 56 61 6c 75 65 5b 69 44 62 5d 20 3d 20  kieValue[iDb] = 
19a20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53 63  db->aDb[iDb].pSc
19a30 68 65 6d 61 2d 3e 73 63 68 65 6d 61 5f 63 6f 6f  hema->schema_coo
19a40 6b 69 65 3b 0a 20 20 20 20 20 20 69 66 28 20 21  kie;.      if( !
19a50 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26 26 20 69  OMIT_TEMPDB && i
19a60 44 62 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 20  Db==1 ){.       
19a70 20 73 71 6c 69 74 65 33 4f 70 65 6e 54 65 6d 70   sqlite3OpenTemp
19a80 44 61 74 61 62 61 73 65 28 70 50 61 72 73 65 29  Database(pParse)
19a90 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
19aa0 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e    }.}../*.** Gen
19ab0 65 72 61 74 65 20 56 44 42 45 20 63 6f 64 65 20  erate VDBE code 
19ac0 74 68 61 74 20 70 72 65 70 61 72 65 73 20 66 6f  that prepares fo
19ad0 72 20 64 6f 69 6e 67 20 61 6e 20 6f 70 65 72 61  r doing an opera
19ae0 74 69 6f 6e 20 74 68 61 74 0a 2a 2a 20 6d 69 67  tion that.** mig
19af0 68 74 20 63 68 61 6e 67 65 20 74 68 65 20 64 61  ht change the da
19b00 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  tabase..**.** Th
19b10 69 73 20 72 6f 75 74 69 6e 65 20 73 74 61 72 74  is routine start
19b20 73 20 61 20 6e 65 77 20 74 72 61 6e 73 61 63 74  s a new transact
19b30 69 6f 6e 20 69 66 20 77 65 20 61 72 65 20 6e 6f  ion if we are no
19b40 74 20 61 6c 72 65 61 64 79 20 77 69 74 68 69 6e  t already within
19b50 0a 2a 2a 20 61 20 74 72 61 6e 73 61 63 74 69 6f  .** a transactio
19b60 6e 2e 20 20 49 66 20 77 65 20 61 72 65 20 61 6c  n.  If we are al
19b70 72 65 61 64 79 20 77 69 74 68 69 6e 20 61 20 74  ready within a t
19b80 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68 65 6e  ransaction, then
19b90 20 61 20 63 68 65 63 6b 70 6f 69 6e 74 0a 2a 2a   a checkpoint.**
19ba0 20 69 73 20 73 65 74 20 69 66 20 74 68 65 20 73   is set if the s
19bb0 65 74 53 74 61 74 65 6d 65 6e 74 20 70 61 72 61  etStatement para
19bc0 6d 65 74 65 72 20 69 73 20 74 72 75 65 2e 20 20  meter is true.  
19bd0 41 20 63 68 65 63 6b 70 6f 69 6e 74 20 73 68 6f  A checkpoint sho
19be0 75 6c 64 0a 2a 2a 20 62 65 20 73 65 74 20 66 6f  uld.** be set fo
19bf0 72 20 6f 70 65 72 61 74 69 6f 6e 73 20 74 68 61  r operations tha
19c00 74 20 6d 69 67 68 74 20 66 61 69 6c 20 28 64 75  t might fail (du
19c10 65 20 74 6f 20 61 20 63 6f 6e 73 74 72 61 69 6e  e to a constrain
19c20 74 29 20 70 61 72 74 20 6f 66 0a 2a 2a 20 74 68  t) part of.** th
19c30 65 20 77 61 79 20 74 68 72 6f 75 67 68 20 61 6e  e way through an
19c40 64 20 77 68 69 63 68 20 77 69 6c 6c 20 6e 65 65  d which will nee
19c50 64 20 74 6f 20 75 6e 64 6f 20 73 6f 6d 65 20 77  d to undo some w
19c60 72 69 74 65 73 20 77 69 74 68 6f 75 74 20 68 61  rites without ha
19c70 76 69 6e 67 20 74 6f 0a 2a 2a 20 72 6f 6c 6c 62  ving to.** rollb
19c80 61 63 6b 20 74 68 65 20 77 68 6f 6c 65 20 74 72  ack the whole tr
19c90 61 6e 73 61 63 74 69 6f 6e 2e 20 20 46 6f 72 20  ansaction.  For 
19ca0 6f 70 65 72 61 74 69 6f 6e 73 20 77 68 65 72 65  operations where
19cb0 20 61 6c 6c 20 63 6f 6e 73 74 72 61 69 6e 74 73   all constraints
19cc0 0a 2a 2a 20 63 61 6e 20 62 65 20 63 68 65 63 6b  .** can be check
19cd0 65 64 20 62 65 66 6f 72 65 20 61 6e 79 20 63 68  ed before any ch
19ce0 61 6e 67 65 73 20 61 72 65 20 6d 61 64 65 20 74  anges are made t
19cf0 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 20  o the database, 
19d00 69 74 20 69 73 20 6e 65 76 65 72 0a 2a 2a 20 6e  it is never.** n
19d10 65 63 65 73 73 61 72 79 20 74 6f 20 75 6e 64 6f  ecessary to undo
19d20 20 61 20 77 72 69 74 65 20 61 6e 64 20 74 68 65   a write and the
19d30 20 63 68 65 63 6b 70 6f 69 6e 74 20 73 68 6f 75   checkpoint shou
19d40 6c 64 20 6e 6f 74 20 62 65 20 73 65 74 2e 0a 2a  ld not be set..*
19d50 2a 0a 2a 2a 20 4f 6e 6c 79 20 64 61 74 61 62 61  *.** Only databa
19d60 73 65 20 69 44 62 20 61 6e 64 20 74 68 65 20 74  se iDb and the t
19d70 65 6d 70 20 64 61 74 61 62 61 73 65 20 61 72 65  emp database are
19d80 20 6d 61 64 65 20 77 72 69 74 61 62 6c 65 20 62   made writable b
19d90 79 20 74 68 69 73 20 63 61 6c 6c 2e 0a 2a 2a 20  y this call..** 
19da0 49 66 20 69 44 62 3d 3d 30 2c 20 74 68 65 6e 20  If iDb==0, then 
19db0 74 68 65 20 6d 61 69 6e 20 61 6e 64 20 74 65 6d  the main and tem
19dc0 70 20 64 61 74 61 62 61 73 65 73 20 61 72 65 20  p databases are 
19dd0 6d 61 64 65 20 77 72 69 74 61 62 6c 65 2e 20 20  made writable.  
19de0 20 49 66 0a 2a 2a 20 69 44 62 3d 3d 31 20 74 68   If.** iDb==1 th
19df0 65 6e 20 6f 6e 6c 79 20 74 68 65 20 74 65 6d 70  en only the temp
19e00 20 64 61 74 61 62 61 73 65 20 69 73 20 6d 61 64   database is mad
19e10 65 20 77 72 69 74 61 62 6c 65 2e 20 20 49 66 20  e writable.  If 
19e20 69 44 62 3e 31 20 74 68 65 6e 20 74 68 65 0a 2a  iDb>1 then the.*
19e30 2a 20 73 70 65 63 69 66 69 65 64 20 61 75 78 69  * specified auxi
19e40 6c 69 61 72 79 20 64 61 74 61 62 61 73 65 20 61  liary database a
19e50 6e 64 20 74 68 65 20 74 65 6d 70 20 64 61 74 61  nd the temp data
19e60 62 61 73 65 20 61 72 65 20 6d 61 64 65 20 77 72  base are made wr
19e70 69 74 61 62 6c 65 2e 0a 2a 2f 0a 76 6f 69 64 20  itable..*/.void 
19e80 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74  sqlite3BeginWrit
19e90 65 4f 70 65 72 61 74 69 6f 6e 28 50 61 72 73 65  eOperation(Parse
19ea0 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 73 65   *pParse, int se
19eb0 74 53 74 61 74 65 6d 65 6e 74 2c 20 69 6e 74 20  tStatement, int 
19ec0 69 44 62 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  iDb){.  Vdbe *v 
19ed0 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
19ee0 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20  (pParse);.  if( 
19ef0 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  v==0 ) return;. 
19f00 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69   sqlite3CodeVeri
19f10 66 79 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c  fySchema(pParse,
19f20 20 69 44 62 29 3b 0a 20 20 70 50 61 72 73 65 2d   iDb);.  pParse-
19f30 3e 77 72 69 74 65 4d 61 73 6b 20 7c 3d 20 31 3c  >writeMask |= 1<
19f40 3c 69 44 62 3b 0a 20 20 69 66 28 20 73 65 74 53  <iDb;.  if( setS
19f50 74 61 74 65 6d 65 6e 74 20 26 26 20 70 50 61 72  tatement && pPar
19f60 73 65 2d 3e 6e 65 73 74 65 64 3d 3d 30 20 29 7b  se->nested==0 ){
19f70 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
19f80 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 53 74 61  AddOp1(v, OP_Sta
19f90 74 65 6d 65 6e 74 2c 20 69 44 62 29 3b 0a 20 20  tement, iDb);.  
19fa0 7d 0a 20 20 69 66 28 20 28 4f 4d 49 54 5f 54 45  }.  if( (OMIT_TE
19fb0 4d 50 44 42 20 7c 7c 20 69 44 62 21 3d 31 29 20  MPDB || iDb!=1) 
19fc0 26 26 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61  && pParse->db->a
19fd0 44 62 5b 31 5d 2e 70 42 74 21 3d 30 20 29 7b 0a  Db[1].pBt!=0 ){.
19fe0 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e      sqlite3Begin
19ff0 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70  WriteOperation(p
1a000 50 61 72 73 65 2c 20 73 65 74 53 74 61 74 65 6d  Parse, setStatem
1a010 65 6e 74 2c 20 31 29 3b 0a 20 20 7d 0a 7d 0a 0a  ent, 1);.  }.}..
1a020 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73  /*.** Check to s
1a030 65 65 20 69 66 20 70 49 6e 64 65 78 20 75 73 65  ee if pIndex use
1a040 73 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20  s the collating 
1a050 73 65 71 75 65 6e 63 65 20 70 43 6f 6c 6c 2e 20  sequence pColl. 
1a060 20 52 65 74 75 72 6e 0a 2a 2a 20 74 72 75 65 20   Return.** true 
1a070 69 66 20 69 74 20 64 6f 65 73 20 61 6e 64 20 66  if it does and f
1a080 61 6c 73 65 20 69 66 20 69 74 20 64 6f 65 73 20  alse if it does 
1a090 6e 6f 74 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  not..*/.#ifndef 
1a0a0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 52 45 49 4e  SQLITE_OMIT_REIN
1a0b0 44 45 58 0a 73 74 61 74 69 63 20 69 6e 74 20 63  DEX.static int c
1a0c0 6f 6c 6c 61 74 69 6f 6e 4d 61 74 63 68 28 63 6f  ollationMatch(co
1a0d0 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 2c  nst char *zColl,
1a0e0 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 29 7b   Index *pIndex){
1a0f0 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28  .  int i;.  for(
1a100 69 3d 30 3b 20 69 3c 70 49 6e 64 65 78 2d 3e 6e  i=0; i<pIndex->n
1a110 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20  Column; i++){.  
1a120 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20    const char *z 
1a130 3d 20 70 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c  = pIndex->azColl
1a140 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 7a 3d 3d  [i];.    if( z==
1a150 7a 43 6f 6c 6c 20 7c 7c 20 28 7a 20 26 26 20 7a  zColl || (z && z
1a160 43 6f 6c 6c 20 26 26 20 30 3d 3d 73 71 6c 69 74  Coll && 0==sqlit
1a170 65 33 53 74 72 49 43 6d 70 28 7a 2c 20 7a 43 6f  e3StrICmp(z, zCo
1a180 6c 6c 29 29 20 29 7b 0a 20 20 20 20 20 20 72 65  ll)) ){.      re
1a190 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20  turn 1;.    }.  
1a1a0 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
1a1b0 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65  #endif../*.** Re
1a1c0 63 6f 6d 70 75 74 65 20 61 6c 6c 20 69 6e 64 69  compute all indi
1a1d0 63 65 73 20 6f 66 20 70 54 61 62 20 74 68 61 74  ces of pTab that
1a1e0 20 75 73 65 20 74 68 65 20 63 6f 6c 6c 61 74 69   use the collati
1a1f0 6e 67 20 73 65 71 75 65 6e 63 65 20 70 43 6f 6c  ng sequence pCol
1a200 6c 2e 0a 2a 2a 20 49 66 20 70 43 6f 6c 6c 3d 3d  l..** If pColl==
1a210 30 20 74 68 65 6e 20 72 65 63 6f 6d 70 75 74 65  0 then recompute
1a220 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 6f 66 20   all indices of 
1a230 70 54 61 62 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  pTab..*/.#ifndef
1a240 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 52 45 49   SQLITE_OMIT_REI
1a250 4e 44 45 58 0a 73 74 61 74 69 63 20 76 6f 69 64  NDEX.static void
1a260 20 72 65 69 6e 64 65 78 54 61 62 6c 65 28 50 61   reindexTable(Pa
1a270 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 61 62  rse *pParse, Tab
1a280 6c 65 20 2a 70 54 61 62 2c 20 63 68 61 72 20 63  le *pTab, char c
1a290 6f 6e 73 74 20 2a 7a 43 6f 6c 6c 29 7b 0a 20 20  onst *zColl){.  
1a2a0 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b 20 20  Index *pIndex;  
1a2b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
1a2c0 6e 20 69 6e 64 65 78 20 61 73 73 6f 63 69 61 74  n index associat
1a2d0 65 64 20 77 69 74 68 20 70 54 61 62 20 2a 2f 0a  ed with pTab */.
1a2e0 0a 20 20 66 6f 72 28 70 49 6e 64 65 78 3d 70 54  .  for(pIndex=pT
1a2f0 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 6e 64  ab->pIndex; pInd
1a300 65 78 3b 20 70 49 6e 64 65 78 3d 70 49 6e 64 65  ex; pIndex=pInde
1a310 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69  x->pNext){.    i
1a320 66 28 20 7a 43 6f 6c 6c 3d 3d 30 20 7c 7c 20 63  f( zColl==0 || c
1a330 6f 6c 6c 61 74 69 6f 6e 4d 61 74 63 68 28 7a 43  ollationMatch(zC
1a340 6f 6c 6c 2c 20 70 49 6e 64 65 78 29 20 29 7b 0a  oll, pIndex) ){.
1a350 20 20 20 20 20 20 69 6e 74 20 69 44 62 20 3d 20        int iDb = 
1a360 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49  sqlite3SchemaToI
1a370 6e 64 65 78 28 70 50 61 72 73 65 2d 3e 64 62 2c  ndex(pParse->db,
1a380 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b   pTab->pSchema);
1a390 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 65  .      sqlite3Be
1a3a0 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f  ginWriteOperatio
1a3b0 6e 28 70 50 61 72 73 65 2c 20 30 2c 20 69 44 62  n(pParse, 0, iDb
1a3c0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1a3d0 52 65 66 69 6c 6c 49 6e 64 65 78 28 70 50 61 72  RefillIndex(pPar
1a3e0 73 65 2c 20 70 49 6e 64 65 78 2c 20 2d 31 29 3b  se, pIndex, -1);
1a3f0 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e  .    }.  }.}.#en
1a400 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6f 6d  dif../*.** Recom
1a410 70 75 74 65 20 61 6c 6c 20 69 6e 64 69 63 65 73  pute all indices
1a420 20 6f 66 20 61 6c 6c 20 74 61 62 6c 65 73 20 69   of all tables i
1a430 6e 20 61 6c 6c 20 64 61 74 61 62 61 73 65 73 20  n all databases 
1a440 77 68 65 72 65 20 74 68 65 0a 2a 2a 20 69 6e 64  where the.** ind
1a450 69 63 65 73 20 75 73 65 20 74 68 65 20 63 6f 6c  ices use the col
1a460 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20  lating sequence 
1a470 70 43 6f 6c 6c 2e 20 20 49 66 20 70 43 6f 6c 6c  pColl.  If pColl
1a480 3d 3d 30 20 74 68 65 6e 20 72 65 63 6f 6d 70 75  ==0 then recompu
1a490 74 65 0a 2a 2a 20 61 6c 6c 20 69 6e 64 69 63 65  te.** all indice
1a4a0 73 20 65 76 65 72 79 77 68 65 72 65 2e 0a 2a 2f  s everywhere..*/
1a4b0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1a4c0 4f 4d 49 54 5f 52 45 49 4e 44 45 58 0a 73 74 61  OMIT_REINDEX.sta
1a4d0 74 69 63 20 76 6f 69 64 20 72 65 69 6e 64 65 78  tic void reindex
1a4e0 44 61 74 61 62 61 73 65 73 28 50 61 72 73 65 20  Databases(Parse 
1a4f0 2a 70 50 61 72 73 65 2c 20 63 68 61 72 20 63 6f  *pParse, char co
1a500 6e 73 74 20 2a 7a 43 6f 6c 6c 29 7b 0a 20 20 44  nst *zColl){.  D
1a510 62 20 2a 70 44 62 3b 20 20 20 20 20 20 20 20 20  b *pDb;         
1a520 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20             /* A 
1a530 73 69 6e 67 6c 65 20 64 61 74 61 62 61 73 65 20  single database 
1a540 2a 2f 0a 20 20 69 6e 74 20 69 44 62 3b 20 20 20  */.  int iDb;   
1a550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a560 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65   /* The database
1a570 20 69 6e 64 65 78 20 6e 75 6d 62 65 72 20 2a 2f   index number */
1a580 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
1a590 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 20 2f   pParse->db;   /
1a5a0 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 63  * The database c
1a5b0 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 48  onnection */.  H
1a5c0 61 73 68 45 6c 65 6d 20 2a 6b 3b 20 20 20 20 20  ashElem *k;     
1a5d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f             /* Fo
1a5e0 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 74  r looping over t
1a5f0 61 62 6c 65 73 20 69 6e 20 70 44 62 20 2a 2f 0a  ables in pDb */.
1a600 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 20 20    Table *pTab;  
1a610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1a620 20 41 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20   A table in the 
1a630 64 61 74 61 62 61 73 65 20 2a 2f 0a 0a 20 20 66  database */..  f
1a640 6f 72 28 69 44 62 3d 30 2c 20 70 44 62 3d 64 62  or(iDb=0, pDb=db
1a650 2d 3e 61 44 62 3b 20 69 44 62 3c 64 62 2d 3e 6e  ->aDb; iDb<db->n
1a660 44 62 3b 20 69 44 62 2b 2b 2c 20 70 44 62 2b 2b  Db; iDb++, pDb++
1a670 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
1a680 44 62 21 3d 30 20 29 3b 0a 20 20 20 20 66 6f 72  Db!=0 );.    for
1a690 28 6b 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72  (k=sqliteHashFir
1a6a0 73 74 28 26 70 44 62 2d 3e 70 53 63 68 65 6d 61  st(&pDb->pSchema
1a6b0 2d 3e 74 62 6c 48 61 73 68 29 3b 20 20 6b 3b 20  ->tblHash);  k; 
1a6c0 6b 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74  k=sqliteHashNext
1a6d0 28 6b 29 29 7b 0a 20 20 20 20 20 20 70 54 61 62  (k)){.      pTab
1a6e0 20 3d 20 28 54 61 62 6c 65 2a 29 73 71 6c 69 74   = (Table*)sqlit
1a6f0 65 48 61 73 68 44 61 74 61 28 6b 29 3b 0a 20 20  eHashData(k);.  
1a700 20 20 20 20 72 65 69 6e 64 65 78 54 61 62 6c 65      reindexTable
1a710 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20 7a  (pParse, pTab, z
1a720 43 6f 6c 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  Coll);.    }.  }
1a730 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
1a740 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66   Generate code f
1a750 6f 72 20 74 68 65 20 52 45 49 4e 44 45 58 20 63  or the REINDEX c
1a760 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 20 20  ommand..**.**   
1a770 20 20 20 20 20 52 45 49 4e 44 45 58 20 20 20 20       REINDEX    
1a780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a790 20 20 20 20 20 20 20 20 2d 2d 20 31 0a 2a 2a 20          -- 1.** 
1a7a0 20 20 20 20 20 20 20 52 45 49 4e 44 45 58 20 20         REINDEX  
1a7b0 3c 63 6f 6c 6c 61 74 69 6f 6e 3e 20 20 20 20 20  <collation>     
1a7c0 20 20 20 20 20 20 20 20 20 20 2d 2d 20 32 0a 2a            -- 2.*
1a7d0 2a 20 20 20 20 20 20 20 20 52 45 49 4e 44 45 58  *        REINDEX
1a7e0 20 20 3f 3c 64 61 74 61 62 61 73 65 3e 2e 3f 3c    ?<database>.?<
1a7f0 74 61 62 6c 65 6e 61 6d 65 3e 20 20 2d 2d 20 33  tablename>  -- 3
1a800 0a 2a 2a 20 20 20 20 20 20 20 20 52 45 49 4e 44  .**        REIND
1a810 45 58 20 20 3f 3c 64 61 74 61 62 61 73 65 3e 2e  EX  ?<database>.
1a820 3f 3c 69 6e 64 65 78 6e 61 6d 65 3e 20 20 2d 2d  ?<indexname>  --
1a830 20 34 0a 2a 2a 0a 2a 2a 20 46 6f 72 6d 20 31 20   4.**.** Form 1 
1a840 63 61 75 73 65 73 20 61 6c 6c 20 69 6e 64 69 63  causes all indic
1a850 65 73 20 69 6e 20 61 6c 6c 20 61 74 74 61 63 68  es in all attach
1a860 65 64 20 64 61 74 61 62 61 73 65 73 20 74 6f 20  ed databases to 
1a870 62 65 20 72 65 62 75 69 6c 74 2e 0a 2a 2a 20 46  be rebuilt..** F
1a880 6f 72 6d 20 32 20 72 65 62 75 69 6c 64 73 20 61  orm 2 rebuilds a
1a890 6c 6c 20 69 6e 64 69 63 65 73 20 69 6e 20 61 6c  ll indices in al
1a8a0 6c 20 64 61 74 61 62 61 73 65 73 20 74 68 61 74  l databases that
1a8b0 20 75 73 65 20 74 68 65 20 6e 61 6d 65 64 0a 2a   use the named.*
1a8c0 2a 20 63 6f 6c 6c 61 74 69 6e 67 20 66 75 6e 63  * collating func
1a8d0 74 69 6f 6e 2e 20 20 46 6f 72 6d 73 20 33 20 61  tion.  Forms 3 a
1a8e0 6e 64 20 34 20 72 65 62 75 69 6c 64 20 74 68 65  nd 4 rebuild the
1a8f0 20 6e 61 6d 65 64 20 69 6e 64 65 78 20 6f 72 20   named index or 
1a900 61 6c 6c 0a 2a 2a 20 69 6e 64 69 63 65 73 20 61  all.** indices a
1a910 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
1a920 68 65 20 6e 61 6d 65 64 20 74 61 62 6c 65 2e 0a  he named table..
1a930 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
1a940 45 5f 4f 4d 49 54 5f 52 45 49 4e 44 45 58 0a 76  E_OMIT_REINDEX.v
1a950 6f 69 64 20 73 71 6c 69 74 65 33 52 65 69 6e 64  oid sqlite3Reind
1a960 65 78 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ex(Parse *pParse
1a970 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c  , Token *pName1,
1a980 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32 29 7b   Token *pName2){
1a990 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c  .  CollSeq *pCol
1a9a0 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  l;             /
1a9b0 2a 20 43 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  * Collating sequ
1a9c0 65 6e 63 65 20 74 6f 20 62 65 20 72 65 69 6e 64  ence to be reind
1a9d0 65 78 65 64 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f  exed, or NULL */
1a9e0 0a 20 20 63 68 61 72 20 2a 7a 3b 20 20 20 20 20  .  char *z;     
1a9f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1aa00 2a 20 4e 61 6d 65 20 6f 66 20 61 20 74 61 62 6c  * Name of a tabl
1aa10 65 20 6f 72 20 69 6e 64 65 78 20 2a 2f 0a 20 20  e or index */.  
1aa20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 3b  const char *zDb;
1aa30 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
1aa40 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ame of the datab
1aa50 61 73 65 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a  ase */.  Table *
1aa60 70 54 61 62 3b 20 20 20 20 20 20 20 20 20 20 20  pTab;           
1aa70 20 20 20 20 20 2f 2a 20 41 20 74 61 62 6c 65 20       /* A table 
1aa80 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
1aa90 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64  */.  Index *pInd
1aaa0 65 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ex;             
1aab0 20 2f 2a 20 41 6e 20 69 6e 64 65 78 20 61 73 73   /* An index ass
1aac0 6f 63 69 61 74 65 64 20 77 69 74 68 20 70 54 61  ociated with pTa
1aad0 62 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62 3b 20  b */.  int iDb; 
1aae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1aaf0 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61     /* The databa
1ab00 73 65 20 69 6e 64 65 78 20 6e 75 6d 62 65 72 20  se index number 
1ab10 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
1ab20 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20   = pParse->db;  
1ab30 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65   /* The database
1ab40 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20   connection */. 
1ab50 20 54 6f 6b 65 6e 20 2a 70 4f 62 6a 4e 61 6d 65   Token *pObjName
1ab60 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
1ab70 4e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c  Name of the tabl
1ab80 65 20 6f 72 20 69 6e 64 65 78 20 74 6f 20 62 65  e or index to be
1ab90 20 72 65 69 6e 64 65 78 65 64 20 2a 2f 0a 0a 20   reindexed */.. 
1aba0 20 2f 2a 20 52 65 61 64 20 74 68 65 20 64 61 74   /* Read the dat
1abb0 61 62 61 73 65 20 73 63 68 65 6d 61 2e 20 49 66  abase schema. If
1abc0 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
1abd0 2c 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72  , leave an error
1abe0 20 6d 65 73 73 61 67 65 0a 20 20 2a 2a 20 61 6e   message.  ** an
1abf0 64 20 63 6f 64 65 20 69 6e 20 70 50 61 72 73 65  d code in pParse
1ac00 20 61 6e 64 20 72 65 74 75 72 6e 20 4e 55 4c 4c   and return NULL
1ac10 2e 20 2a 2f 0a 20 20 69 66 28 20 53 51 4c 49 54  . */.  if( SQLIT
1ac20 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65 61  E_OK!=sqlite3Rea
1ac30 64 53 63 68 65 6d 61 28 70 50 61 72 73 65 29 20  dSchema(pParse) 
1ac40 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  ){.    return;. 
1ac50 20 7d 0a 0a 20 20 69 66 28 20 70 4e 61 6d 65 31   }..  if( pName1
1ac60 3d 3d 30 20 7c 7c 20 70 4e 61 6d 65 31 2d 3e 7a  ==0 || pName1->z
1ac70 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 69 6e 64  ==0 ){.    reind
1ac80 65 78 44 61 74 61 62 61 73 65 73 28 70 50 61 72  exDatabases(pPar
1ac90 73 65 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  se, 0);.    retu
1aca0 72 6e 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  rn;.  }else if( 
1acb0 70 4e 61 6d 65 32 3d 3d 30 20 7c 7c 20 70 4e 61  pName2==0 || pNa
1acc0 6d 65 32 2d 3e 7a 3d 3d 30 20 29 7b 0a 20 20 20  me2->z==0 ){.   
1acd0 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 3b 0a 20 20   char *zColl;.  
1ace0 20 20 61 73 73 65 72 74 28 20 70 4e 61 6d 65 31    assert( pName1
1acf0 2d 3e 7a 20 29 3b 0a 20 20 20 20 7a 43 6f 6c 6c  ->z );.    zColl
1ad00 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72   = sqlite3NameFr
1ad10 6f 6d 54 6f 6b 65 6e 28 70 50 61 72 73 65 2d 3e  omToken(pParse->
1ad20 64 62 2c 20 70 4e 61 6d 65 31 29 3b 0a 20 20 20  db, pName1);.   
1ad30 20 69 66 28 20 21 7a 43 6f 6c 6c 20 29 20 72 65   if( !zColl ) re
1ad40 74 75 72 6e 3b 0a 20 20 20 20 70 43 6f 6c 6c 20  turn;.    pColl 
1ad50 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c  = sqlite3FindCol
1ad60 6c 53 65 71 28 64 62 2c 20 45 4e 43 28 64 62 29  lSeq(db, ENC(db)
1ad70 2c 20 7a 43 6f 6c 6c 2c 20 2d 31 2c 20 30 29 3b  , zColl, -1, 0);
1ad80 0a 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 20 29  .    if( pColl )
1ad90 7b 0a 20 20 20 20 20 20 69 66 28 20 7a 43 6f 6c  {.      if( zCol
1ada0 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 69  l ){.        rei
1adb0 6e 64 65 78 44 61 74 61 62 61 73 65 73 28 70 50  ndexDatabases(pP
1adc0 61 72 73 65 2c 20 7a 43 6f 6c 6c 29 3b 0a 20 20  arse, zColl);.  
1add0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
1ade0 65 65 28 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20 20  ee(zColl);.     
1adf0 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b   }.      return;
1ae00 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
1ae10 65 33 5f 66 72 65 65 28 7a 43 6f 6c 6c 29 3b 0a  e3_free(zColl);.
1ae20 20 20 7d 0a 20 20 69 44 62 20 3d 20 73 71 6c 69    }.  iDb = sqli
1ae30 74 65 33 54 77 6f 50 61 72 74 4e 61 6d 65 28 70  te3TwoPartName(p
1ae40 50 61 72 73 65 2c 20 70 4e 61 6d 65 31 2c 20 70  Parse, pName1, p
1ae50 4e 61 6d 65 32 2c 20 26 70 4f 62 6a 4e 61 6d 65  Name2, &pObjName
1ae60 29 3b 0a 20 20 69 66 28 20 69 44 62 3c 30 20 29  );.  if( iDb<0 )
1ae70 20 72 65 74 75 72 6e 3b 0a 20 20 7a 20 3d 20 73   return;.  z = s
1ae80 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f  qlite3NameFromTo
1ae90 6b 65 6e 28 64 62 2c 20 70 4f 62 6a 4e 61 6d 65  ken(db, pObjName
1aea0 29 3b 0a 20 20 69 66 28 20 7a 3d 3d 30 20 29 20  );.  if( z==0 ) 
1aeb0 72 65 74 75 72 6e 3b 0a 20 20 7a 44 62 20 3d 20  return;.  zDb = 
1aec0 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61  db->aDb[iDb].zNa
1aed0 6d 65 3b 0a 20 20 70 54 61 62 20 3d 20 73 71 6c  me;.  pTab = sql
1aee0 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28 64 62  ite3FindTable(db
1aef0 2c 20 7a 2c 20 7a 44 62 29 3b 0a 20 20 69 66 28  , z, zDb);.  if(
1af00 20 70 54 61 62 20 29 7b 0a 20 20 20 20 72 65 69   pTab ){.    rei
1af10 6e 64 65 78 54 61 62 6c 65 28 70 50 61 72 73 65  ndexTable(pParse
1af20 2c 20 70 54 61 62 2c 20 30 29 3b 0a 20 20 20 20  , pTab, 0);.    
1af30 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 29 3b  sqlite3_free(z);
1af40 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
1af50 0a 20 20 70 49 6e 64 65 78 20 3d 20 73 71 6c 69  .  pIndex = sqli
1af60 74 65 33 46 69 6e 64 49 6e 64 65 78 28 64 62 2c  te3FindIndex(db,
1af70 20 7a 2c 20 7a 44 62 29 3b 0a 20 20 73 71 6c 69   z, zDb);.  sqli
1af80 74 65 33 5f 66 72 65 65 28 7a 29 3b 0a 20 20 69  te3_free(z);.  i
1af90 66 28 20 70 49 6e 64 65 78 20 29 7b 0a 20 20 20  f( pIndex ){.   
1afa0 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69   sqlite3BeginWri
1afb0 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72  teOperation(pPar
1afc0 73 65 2c 20 30 2c 20 69 44 62 29 3b 0a 20 20 20  se, 0, iDb);.   
1afd0 20 73 71 6c 69 74 65 33 52 65 66 69 6c 6c 49 6e   sqlite3RefillIn
1afe0 64 65 78 28 70 50 61 72 73 65 2c 20 70 49 6e 64  dex(pParse, pInd
1aff0 65 78 2c 20 2d 31 29 3b 0a 20 20 20 20 72 65 74  ex, -1);.    ret
1b000 75 72 6e 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  urn;.  }.  sqlit
1b010 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
1b020 65 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20 69 64  e, "unable to id
1b030 65 6e 74 69 66 79 20 74 68 65 20 6f 62 6a 65 63  entify the objec
1b040 74 20 74 6f 20 62 65 20 72 65 69 6e 64 65 78 65  t to be reindexe
1b050 64 22 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  d");.}.#endif../
1b060 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 64 79  *.** Return a dy
1b070 6e 61 6d 69 63 6c 79 20 61 6c 6c 6f 63 61 74 65  namicly allocate
1b080 64 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74  d KeyInfo struct
1b090 75 72 65 20 74 68 61 74 20 63 61 6e 20 62 65 20  ure that can be 
1b0a0 75 73 65 64 0a 2a 2a 20 77 69 74 68 20 4f 50 5f  used.** with OP_
1b0b0 4f 70 65 6e 52 65 61 64 20 6f 72 20 4f 50 5f 4f  OpenRead or OP_O
1b0c0 70 65 6e 57 72 69 74 65 20 74 6f 20 61 63 63 65  penWrite to acce
1b0d0 73 73 20 64 61 74 61 62 61 73 65 20 69 6e 64 65  ss database inde
1b0e0 78 20 70 49 64 78 2e 0a 2a 2a 0a 2a 2a 20 49 66  x pIdx..**.** If
1b0f0 20 73 75 63 63 65 73 73 66 75 6c 2c 20 61 20 70   successful, a p
1b100 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 6e 65  ointer to the ne
1b110 77 20 73 74 72 75 63 74 75 72 65 20 69 73 20 72  w structure is r
1b120 65 74 75 72 6e 65 64 2e 20 49 6e 20 74 68 69 73  eturned. In this
1b130 20 63 61 73 65 0a 2a 2a 20 74 68 65 20 63 61 6c   case.** the cal
1b140 6c 65 72 20 69 73 20 72 65 73 70 6f 6e 73 69 62  ler is responsib
1b150 6c 65 20 66 6f 72 20 63 61 6c 6c 69 6e 67 20 73  le for calling s
1b160 71 6c 69 74 65 33 5f 66 72 65 65 28 29 20 6f 6e  qlite3_free() on
1b170 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 0a 2a   the returned .*
1b180 2a 20 70 6f 69 6e 74 65 72 2e 20 49 66 20 61 6e  * pointer. If an
1b190 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 28 6f   error occurs (o
1b1a0 75 74 20 6f 66 20 6d 65 6d 6f 72 79 20 6f 72 20  ut of memory or 
1b1b0 6d 69 73 73 69 6e 67 20 63 6f 6c 6c 61 74 69 6f  missing collatio
1b1c0 6e 20 0a 2a 2a 20 73 65 71 75 65 6e 63 65 29 2c  n .** sequence),
1b1d0 20 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65   NULL is returne
1b1e0 64 20 61 6e 64 20 74 68 65 20 73 74 61 74 65 20  d and the state 
1b1f0 6f 66 20 70 50 61 72 73 65 20 75 70 64 61 74 65  of pParse update
1b200 64 20 74 6f 20 72 65 66 6c 65 63 74 0a 2a 2a 20  d to reflect.** 
1b210 74 68 65 20 65 72 72 6f 72 2e 0a 2a 2f 0a 4b 65  the error..*/.Ke
1b220 79 49 6e 66 6f 20 2a 73 71 6c 69 74 65 33 49 6e  yInfo *sqlite3In
1b230 64 65 78 4b 65 79 69 6e 66 6f 28 50 61 72 73 65  dexKeyinfo(Parse
1b240 20 2a 70 50 61 72 73 65 2c 20 49 6e 64 65 78 20   *pParse, Index 
1b250 2a 70 49 64 78 29 7b 0a 20 20 69 6e 74 20 69 3b  *pIdx){.  int i;
1b260 0a 20 20 69 6e 74 20 6e 43 6f 6c 20 3d 20 70 49  .  int nCol = pI
1b270 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 69  dx->nColumn;.  i
1b280 6e 74 20 6e 42 79 74 65 73 20 3d 20 73 69 7a 65  nt nBytes = size
1b290 6f 66 28 4b 65 79 49 6e 66 6f 29 20 2b 20 28 6e  of(KeyInfo) + (n
1b2a0 43 6f 6c 2d 31 29 2a 73 69 7a 65 6f 66 28 43 6f  Col-1)*sizeof(Co
1b2b0 6c 6c 53 65 71 2a 29 20 2b 20 6e 43 6f 6c 3b 0a  llSeq*) + nCol;.
1b2c0 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 20    KeyInfo *pKey 
1b2d0 3d 20 28 4b 65 79 49 6e 66 6f 20 2a 29 73 71 6c  = (KeyInfo *)sql
1b2e0 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f  ite3DbMallocZero
1b2f0 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 6e 42 79  (pParse->db, nBy
1b300 74 65 73 29 3b 0a 0a 20 20 69 66 28 20 70 4b 65  tes);..  if( pKe
1b310 79 20 29 7b 0a 20 20 20 20 70 4b 65 79 2d 3e 64  y ){.    pKey->d
1b320 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
1b330 20 20 20 20 70 4b 65 79 2d 3e 61 53 6f 72 74 4f      pKey->aSortO
1b340 72 64 65 72 20 3d 20 28 75 38 20 2a 29 26 28 70  rder = (u8 *)&(p
1b350 4b 65 79 2d 3e 61 43 6f 6c 6c 5b 6e 43 6f 6c 5d  Key->aColl[nCol]
1b360 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 26  );.    assert( &
1b370 70 4b 65 79 2d 3e 61 53 6f 72 74 4f 72 64 65 72  pKey->aSortOrder
1b380 5b 6e 43 6f 6c 5d 3d 3d 26 28 28 28 75 38 20 2a  [nCol]==&(((u8 *
1b390 29 70 4b 65 79 29 5b 6e 42 79 74 65 73 5d 29 20  )pKey)[nBytes]) 
1b3a0 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  );.    for(i=0; 
1b3b0 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  i<nCol; i++){.  
1b3c0 20 20 20 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 20      char *zColl 
1b3d0 3d 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 69  = pIdx->azColl[i
1b3e0 5d 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ];.      assert(
1b3f0 20 7a 43 6f 6c 6c 20 29 3b 0a 20 20 20 20 20 20   zColl );.      
1b400 70 4b 65 79 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d  pKey->aColl[i] =
1b410 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 43 6f   sqlite3LocateCo
1b420 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 7a 43  llSeq(pParse, zC
1b430 6f 6c 6c 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20  oll, -1);.      
1b440 70 4b 65 79 2d 3e 61 53 6f 72 74 4f 72 64 65 72  pKey->aSortOrder
1b450 5b 69 5d 20 3d 20 70 49 64 78 2d 3e 61 53 6f 72  [i] = pIdx->aSor
1b460 74 4f 72 64 65 72 5b 69 5d 3b 0a 20 20 20 20 7d  tOrder[i];.    }
1b470 0a 20 20 20 20 70 4b 65 79 2d 3e 6e 46 69 65 6c  .    pKey->nFiel
1b480 64 20 3d 20 6e 43 6f 6c 3b 0a 20 20 7d 0a 0a 20  d = nCol;.  }.. 
1b490 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72   if( pParse->nEr
1b4a0 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  r ){.    sqlite3
1b4b0 5f 66 72 65 65 28 70 4b 65 79 29 3b 0a 20 20 20  _free(pKey);.   
1b4c0 20 70 4b 65 79 20 3d 20 30 3b 0a 20 20 7d 0a 20   pKey = 0;.  }. 
1b4d0 20 72 65 74 75 72 6e 20 70 4b 65 79 3b 0a 7d 0a   return pKey;.}.