/ Hex Artifact Content
Login

Artifact f8eeec5c71e8bab41b6cfcac79d56c9103a26a91:


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 34 33 20 32 30 30 37 2f 30 38 2f 33 30  1.443 2007/08/30
02f0: 20 30 31 3a 31 39 3a 35 39 20 64 72 68 20 45 78   01:19:59 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 4f 70 33 28 70 56 64 62 65  te3VdbeOp3(pVdbe
0d00: 2c 20 4f 50 5f 54 61 62 6c 65 4c 6f 63 6b 2c 20  , OP_TableLock, 
0d10: 70 31 2c 20 70 2d 3e 69 54 61 62 2c 20 70 2d 3e  p1, p->iTab, p->
0d20: 7a 4e 61 6d 65 2c 20 50 33 5f 53 54 41 54 49 43  zName, P3_STATIC
0d30: 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 20  );.  }.}.#else. 
0d40: 20 23 64 65 66 69 6e 65 20 63 6f 64 65 54 61 62   #define codeTab
0d50: 6c 65 4c 6f 63 6b 73 28 78 29 0a 23 65 6e 64 69  leLocks(x).#endi
0d60: 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  f../*.** This ro
0d70: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
0d80: 61 66 74 65 72 20 61 20 73 69 6e 67 6c 65 20 53  after a single S
0d90: 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 68 61 73  QL statement has
0da0: 20 62 65 65 6e 0a 2a 2a 20 70 61 72 73 65 64 20   been.** parsed 
0db0: 61 6e 64 20 61 20 56 44 42 45 20 70 72 6f 67 72  and a VDBE progr
0dc0: 61 6d 20 74 6f 20 65 78 65 63 75 74 65 20 74 68  am to execute th
0dd0: 61 74 20 73 74 61 74 65 6d 65 6e 74 20 68 61 73  at statement has
0de0: 20 62 65 65 6e 0a 2a 2a 20 70 72 65 70 61 72 65   been.** prepare
0df0: 64 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  d.  This routine
0e00: 20 70 75 74 73 20 74 68 65 20 66 69 6e 69 73 68   puts the finish
0e10: 69 6e 67 20 74 6f 75 63 68 65 73 20 6f 6e 20 74  ing touches on t
0e20: 68 65 0a 2a 2a 20 56 44 42 45 20 70 72 6f 67 72  he.** VDBE progr
0e30: 61 6d 20 61 6e 64 20 72 65 73 65 74 73 20 74 68  am and resets th
0e40: 65 20 70 50 61 72 73 65 20 73 74 72 75 63 74 75  e pParse structu
0e50: 72 65 20 66 6f 72 20 74 68 65 20 6e 65 78 74 0a  re for the next.
0e60: 2a 2a 20 70 61 72 73 65 2e 0a 2a 2a 0a 2a 2a 20  ** parse..**.** 
0e70: 4e 6f 74 65 20 74 68 61 74 20 69 66 20 61 6e 20  Note that if an 
0e80: 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64 2c 20  error occurred, 
0e90: 69 74 20 6d 69 67 68 74 20 62 65 20 74 68 65 20  it might be the 
0ea0: 63 61 73 65 20 74 68 61 74 0a 2a 2a 20 6e 6f 20  case that.** no 
0eb0: 56 44 42 45 20 63 6f 64 65 20 77 61 73 20 67 65  VDBE code was ge
0ec0: 6e 65 72 61 74 65 64 2e 0a 2a 2f 0a 76 6f 69 64  nerated..*/.void
0ed0: 20 73 71 6c 69 74 65 33 46 69 6e 69 73 68 43 6f   sqlite3FinishCo
0ee0: 64 69 6e 67 28 50 61 72 73 65 20 2a 70 50 61 72  ding(Parse *pPar
0ef0: 73 65 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  se){.  sqlite3 *
0f00: 64 62 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 0a  db;.  Vdbe *v;..
0f10: 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64    db = pParse->d
0f20: 62 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  b;.  if( db->mal
0f30: 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74 75  locFailed ) retu
0f40: 72 6e 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65  rn;.  if( pParse
0f50: 2d 3e 6e 65 73 74 65 64 20 29 20 72 65 74 75 72  ->nested ) retur
0f60: 6e 3b 0a 20 20 69 66 28 20 21 70 50 61 72 73 65  n;.  if( !pParse
0f70: 2d 3e 70 56 64 62 65 20 29 7b 0a 20 20 20 20 69  ->pVdbe ){.    i
0f80: 66 28 20 70 50 61 72 73 65 2d 3e 72 63 3d 3d 53  f( pParse->rc==S
0f90: 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 61 72  QLITE_OK && pPar
0fa0: 73 65 2d 3e 6e 45 72 72 20 29 7b 0a 20 20 20 20  se->nErr ){.    
0fb0: 20 20 70 50 61 72 73 65 2d 3e 72 63 20 3d 20 53    pParse->rc = S
0fc0: 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20  QLITE_ERROR;.   
0fd0: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d     return;.    }
0fe0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42 65 67 69 6e  .  }..  /* Begin
0ff0: 20 62 79 20 67 65 6e 65 72 61 74 69 6e 67 20 73   by generating s
1000: 6f 6d 65 20 74 65 72 6d 69 6e 61 74 69 6f 6e 20  ome termination 
1010: 63 6f 64 65 20 61 74 20 74 68 65 20 65 6e 64 20  code at the end 
1020: 6f 66 20 74 68 65 0a 20 20 2a 2a 20 76 64 62 65  of the.  ** vdbe
1030: 20 70 72 6f 67 72 61 6d 0a 20 20 2a 2f 0a 20 20   program.  */.  
1040: 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
1050: 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66  be(pParse);.  if
1060: 28 20 76 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ( v ){.    sqlit
1070: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
1080: 50 5f 48 61 6c 74 2c 20 30 2c 20 30 29 3b 0a 0a  P_Halt, 0, 0);..
1090: 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6f 6b 69      /* The cooki
10a0: 65 20 6d 61 73 6b 20 63 6f 6e 74 61 69 6e 73 20  e mask contains 
10b0: 6f 6e 65 20 62 69 74 20 66 6f 72 20 65 61 63 68  one bit for each
10c0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6f   database file o
10d0: 70 65 6e 2e 0a 20 20 20 20 2a 2a 20 28 42 69 74  pen..    ** (Bit
10e0: 20 30 20 69 73 20 66 6f 72 20 6d 61 69 6e 2c 20   0 is for main, 
10f0: 62 69 74 20 31 20 69 73 20 66 6f 72 20 74 65 6d  bit 1 is for tem
1100: 70 2c 20 61 6e 64 20 73 6f 20 66 6f 72 74 68 2e  p, and so forth.
1110: 29 20 20 42 69 74 73 20 61 72 65 0a 20 20 20 20  )  Bits are.    
1120: 2a 2a 20 73 65 74 20 66 6f 72 20 65 61 63 68 20  ** set for each 
1130: 64 61 74 61 62 61 73 65 20 74 68 61 74 20 69 73  database that is
1140: 20 75 73 65 64 2e 20 20 47 65 6e 65 72 61 74 65   used.  Generate
1150: 20 63 6f 64 65 20 74 6f 20 73 74 61 72 74 20 61   code to start a
1160: 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74  .    ** transact
1170: 69 6f 6e 20 6f 6e 20 65 61 63 68 20 75 73 65 64  ion on each used
1180: 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 74 6f   database and to
1190: 20 76 65 72 69 66 79 20 74 68 65 20 73 63 68 65   verify the sche
11a0: 6d 61 20 63 6f 6f 6b 69 65 0a 20 20 20 20 2a 2a  ma cookie.    **
11b0: 20 6f 6e 20 65 61 63 68 20 75 73 65 64 20 64 61   on each used da
11c0: 74 61 62 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20  tabase..    */. 
11d0: 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 63     if( pParse->c
11e0: 6f 6f 6b 69 65 47 6f 74 6f 3e 30 20 29 7b 0a 20  ookieGoto>0 ){. 
11f0: 20 20 20 20 20 75 33 32 20 6d 61 73 6b 3b 0a 20       u32 mask;. 
1200: 20 20 20 20 20 69 6e 74 20 69 44 62 3b 0a 20 20       int iDb;.  
1210: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
1220: 75 6d 70 48 65 72 65 28 76 2c 20 70 50 61 72 73  umpHere(v, pPars
1230: 65 2d 3e 63 6f 6f 6b 69 65 47 6f 74 6f 2d 31 29  e->cookieGoto-1)
1240: 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 44 62 3d  ;.      for(iDb=
1250: 30 2c 20 6d 61 73 6b 3d 31 3b 20 69 44 62 3c 64  0, mask=1; iDb<d
1260: 62 2d 3e 6e 44 62 3b 20 6d 61 73 6b 3c 3c 3d 31  b->nDb; mask<<=1
1270: 2c 20 69 44 62 2b 2b 29 7b 0a 20 20 20 20 20 20  , iDb++){.      
1280: 20 20 69 66 28 20 28 6d 61 73 6b 20 26 20 70 50    if( (mask & pP
1290: 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 4d 61 73 6b  arse->cookieMask
12a0: 29 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  )==0 ) continue;
12b0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
12c0: 56 64 62 65 55 73 65 73 42 74 72 65 65 28 76 2c  VdbeUsesBtree(v,
12d0: 20 69 44 62 29 3b 0a 20 20 20 20 20 20 20 20 73   iDb);.        s
12e0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
12f0: 76 2c 20 4f 50 5f 54 72 61 6e 73 61 63 74 69 6f  v, OP_Transactio
1300: 6e 2c 20 69 44 62 2c 20 28 6d 61 73 6b 20 26 20  n, iDb, (mask & 
1310: 70 50 61 72 73 65 2d 3e 77 72 69 74 65 4d 61 73  pParse->writeMas
1320: 6b 29 21 3d 30 29 3b 0a 20 20 20 20 20 20 20 20  k)!=0);.        
1330: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1340: 28 76 2c 20 4f 50 5f 56 65 72 69 66 79 43 6f 6f  (v, OP_VerifyCoo
1350: 6b 69 65 2c 20 69 44 62 2c 20 70 50 61 72 73 65  kie, iDb, pParse
1360: 2d 3e 63 6f 6f 6b 69 65 56 61 6c 75 65 5b 69 44  ->cookieValue[iD
1370: 62 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66  b]);.      }.#if
1380: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1390: 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20  _VIRTUALTABLE.  
13a0: 20 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e      if( pParse->
13b0: 70 56 69 72 74 75 61 6c 4c 6f 63 6b 20 29 7b 0a  pVirtualLock ){.
13c0: 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 76 74          char *vt
13d0: 61 62 20 3d 20 28 63 68 61 72 20 2a 29 70 50 61  ab = (char *)pPa
13e0: 72 73 65 2d 3e 70 56 69 72 74 75 61 6c 4c 6f 63  rse->pVirtualLoc
13f0: 6b 2d 3e 70 56 74 61 62 3b 0a 20 20 20 20 20 20  k->pVtab;.      
1400: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33    sqlite3VdbeOp3
1410: 28 76 2c 20 4f 50 5f 56 42 65 67 69 6e 2c 20 30  (v, OP_VBegin, 0
1420: 2c 20 30 2c 20 76 74 61 62 2c 20 50 33 5f 56 54  , 0, vtab, P3_VT
1430: 41 42 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e  AB);.      }.#en
1440: 64 69 66 0a 0a 20 20 20 20 20 20 2f 2a 20 4f 6e  dif..      /* On
1450: 63 65 20 61 6c 6c 20 74 68 65 20 63 6f 6f 6b 69  ce all the cooki
1460: 65 73 20 68 61 76 65 20 62 65 65 6e 20 76 65 72  es have been ver
1470: 69 66 69 65 64 20 61 6e 64 20 74 72 61 6e 73 61  ified and transa
1480: 63 74 69 6f 6e 73 20 6f 70 65 6e 65 64 2c 20 0a  ctions opened, .
1490: 20 20 20 20 20 20 2a 2a 20 6f 62 74 61 69 6e 20        ** obtain 
14a0: 74 68 65 20 72 65 71 75 69 72 65 64 20 74 61 62  the required tab
14b0: 6c 65 2d 6c 6f 63 6b 73 2e 20 54 68 69 73 20 69  le-locks. This i
14c0: 73 20 61 20 6e 6f 2d 6f 70 20 75 6e 6c 65 73 73  s a no-op unless
14d0: 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 73   the .      ** s
14e0: 68 61 72 65 64 2d 63 61 63 68 65 20 66 65 61 74  hared-cache feat
14f0: 75 72 65 20 69 73 20 65 6e 61 62 6c 65 64 2e 0a  ure is enabled..
1500: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 63        */.      c
1510: 6f 64 65 54 61 62 6c 65 4c 6f 63 6b 73 28 70 50  odeTableLocks(pP
1520: 61 72 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c  arse);.      sql
1530: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
1540: 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 70 50 61   OP_Goto, 0, pPa
1550: 72 73 65 2d 3e 63 6f 6f 6b 69 65 47 6f 74 6f 29  rse->cookieGoto)
1560: 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 6e 64 65 66  ;.    }..#ifndef
1570: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41   SQLITE_OMIT_TRA
1580: 43 45 0a 20 20 20 20 2f 2a 20 41 64 64 20 61 20  CE.    /* Add a 
1590: 4e 6f 2d 6f 70 20 74 68 61 74 20 63 6f 6e 74 61  No-op that conta
15a0: 69 6e 73 20 74 68 65 20 63 6f 6d 70 6c 65 74 65  ins the complete
15b0: 20 74 65 78 74 20 6f 66 20 74 68 65 20 63 6f 6d   text of the com
15c0: 70 69 6c 65 64 20 53 51 4c 0a 20 20 20 20 2a 2a  piled SQL.    **
15d0: 20 73 74 61 74 65 6d 65 6e 74 20 61 73 20 69 74   statement as it
15e0: 73 20 50 33 20 61 72 67 75 6d 65 6e 74 2e 20 20  s P3 argument.  
15f0: 54 68 69 73 20 64 6f 65 73 20 6e 6f 74 20 63 68  This does not ch
1600: 61 6e 67 65 20 74 68 65 20 66 75 6e 63 74 69 6f  ange the functio
1610: 6e 61 6c 69 74 79 0a 20 20 20 20 2a 2a 20 6f 66  nality.    ** of
1620: 20 74 68 65 20 70 72 6f 67 72 61 6d 2e 20 0a 20   the program. . 
1630: 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 69     **.    ** Thi
1640: 73 20 69 73 20 75 73 65 64 20 74 6f 20 69 6d 70  s is used to imp
1650: 6c 65 6d 65 6e 74 20 73 71 6c 69 74 65 33 5f 74  lement sqlite3_t
1660: 72 61 63 65 28 29 2e 0a 20 20 20 20 2a 2f 0a 20  race()..    */. 
1670: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70     sqlite3VdbeOp
1680: 33 28 76 2c 20 4f 50 5f 4e 6f 6f 70 2c 20 30 2c  3(v, OP_Noop, 0,
1690: 20 30 2c 20 70 50 61 72 73 65 2d 3e 7a 53 71 6c   0, pParse->zSql
16a0: 2c 20 70 50 61 72 73 65 2d 3e 7a 54 61 69 6c 2d  , pParse->zTail-
16b0: 70 50 61 72 73 65 2d 3e 7a 53 71 6c 29 3b 0a 23  pParse->zSql);.#
16c0: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
16d0: 4f 4d 49 54 5f 54 52 41 43 45 20 2a 2f 0a 20 20  OMIT_TRACE */.  
16e0: 7d 0a 0a 0a 20 20 2f 2a 20 47 65 74 20 74 68 65  }...  /* Get the
16f0: 20 56 44 42 45 20 70 72 6f 67 72 61 6d 20 72 65   VDBE program re
1700: 61 64 79 20 66 6f 72 20 65 78 65 63 75 74 69 6f  ady for executio
1710: 6e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 76 20 26  n.  */.  if( v &
1720: 26 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d  & pParse->nErr==
1730: 30 20 26 26 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63  0 && !db->malloc
1740: 46 61 69 6c 65 64 20 29 7b 0a 23 69 66 64 65 66  Failed ){.#ifdef
1750: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
1760: 20 20 46 49 4c 45 20 2a 74 72 61 63 65 20 3d 20    FILE *trace = 
1770: 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c  (db->flags & SQL
1780: 49 54 45 5f 56 64 62 65 54 72 61 63 65 29 21 3d  ITE_VdbeTrace)!=
1790: 30 20 3f 20 73 74 64 6f 75 74 20 3a 20 30 3b 0a  0 ? stdout : 0;.
17a0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 54      sqlite3VdbeT
17b0: 72 61 63 65 28 76 2c 20 74 72 61 63 65 29 3b 0a  race(v, trace);.
17c0: 23 65 6e 64 69 66 0a 20 20 20 20 73 71 6c 69 74  #endif.    sqlit
17d0: 65 33 56 64 62 65 4d 61 6b 65 52 65 61 64 79 28  e3VdbeMakeReady(
17e0: 76 2c 20 70 50 61 72 73 65 2d 3e 6e 56 61 72 2c  v, pParse->nVar,
17f0: 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 33 2c   pParse->nMem+3,
1800: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1810: 20 20 20 20 20 20 20 20 20 20 70 50 61 72 73 65            pParse
1820: 2d 3e 6e 54 61 62 2b 33 2c 20 70 50 61 72 73 65  ->nTab+3, pParse
1830: 2d 3e 65 78 70 6c 61 69 6e 29 3b 0a 20 20 20 20  ->explain);.    
1840: 70 50 61 72 73 65 2d 3e 72 63 20 3d 20 53 51 4c  pParse->rc = SQL
1850: 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 70 50  ITE_DONE;.    pP
1860: 61 72 73 65 2d 3e 63 6f 6c 4e 61 6d 65 73 53 65  arse->colNamesSe
1870: 74 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69  t = 0;.  }else i
1880: 66 28 20 70 50 61 72 73 65 2d 3e 72 63 3d 3d 53  f( pParse->rc==S
1890: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
18a0: 70 50 61 72 73 65 2d 3e 72 63 20 3d 20 53 51 4c  pParse->rc = SQL
18b0: 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  ITE_ERROR;.  }. 
18c0: 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 20 3d 20   pParse->nTab = 
18d0: 30 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65  0;.  pParse->nMe
18e0: 6d 20 3d 20 30 3b 0a 20 20 70 50 61 72 73 65 2d  m = 0;.  pParse-
18f0: 3e 6e 53 65 74 20 3d 20 30 3b 0a 20 20 70 50 61  >nSet = 0;.  pPa
1900: 72 73 65 2d 3e 6e 56 61 72 20 3d 20 30 3b 0a 20  rse->nVar = 0;. 
1910: 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 4d   pParse->cookieM
1920: 61 73 6b 20 3d 20 30 3b 0a 20 20 70 50 61 72 73  ask = 0;.  pPars
1930: 65 2d 3e 63 6f 6f 6b 69 65 47 6f 74 6f 20 3d 20  e->cookieGoto = 
1940: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 75 6e 20  0;.}../*.** Run 
1950: 74 68 65 20 70 61 72 73 65 72 20 61 6e 64 20 63  the parser and c
1960: 6f 64 65 20 67 65 6e 65 72 61 74 6f 72 20 72 65  ode generator re
1970: 63 75 72 73 69 76 65 6c 79 20 69 6e 20 6f 72 64  cursively in ord
1980: 65 72 20 74 6f 20 67 65 6e 65 72 61 74 65 0a 2a  er to generate.*
1990: 2a 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20 53  * code for the S
19a0: 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 67 69 76  QL statement giv
19b0: 65 6e 20 6f 6e 74 6f 20 74 68 65 20 65 6e 64 20  en onto the end 
19c0: 6f 66 20 74 68 65 20 70 50 61 72 73 65 20 63 6f  of the pParse co
19d0: 6e 74 65 78 74 0a 2a 2a 20 63 75 72 72 65 6e 74  ntext.** current
19e0: 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75  ly under constru
19f0: 63 74 69 6f 6e 2e 20 20 57 68 65 6e 20 74 68 65  ction.  When the
1a00: 20 70 61 72 73 65 72 20 69 73 20 72 75 6e 20 72   parser is run r
1a10: 65 63 75 72 73 69 76 65 6c 79 0a 2a 2a 20 74 68  ecursively.** th
1a20: 69 73 20 77 61 79 2c 20 74 68 65 20 66 69 6e 61  is way, the fina
1a30: 6c 20 4f 50 5f 48 61 6c 74 20 69 73 20 6e 6f 74  l OP_Halt is not
1a40: 20 61 70 70 65 6e 64 65 64 20 61 6e 64 20 6f 74   appended and ot
1a50: 68 65 72 20 69 6e 69 74 69 61 6c 69 7a 61 74 69  her initializati
1a60: 6f 6e 0a 2a 2a 20 61 6e 64 20 66 69 6e 61 6c 69  on.** and finali
1a70: 7a 61 74 69 6f 6e 20 73 74 65 70 73 20 61 72 65  zation steps are
1a80: 20 6f 6d 69 74 74 65 64 20 62 65 63 61 75 73 65   omitted because
1a90: 20 74 68 6f 73 65 20 61 72 65 20 68 61 6e 64 6c   those are handl
1aa0: 69 6e 67 20 62 79 20 74 68 65 0a 2a 2a 20 6f 75  ing by the.** ou
1ab0: 74 65 72 6d 6f 73 74 20 70 61 72 73 65 72 2e 0a  termost parser..
1ac0: 2a 2a 0a 2a 2a 20 4e 6f 74 20 65 76 65 72 79 74  **.** Not everyt
1ad0: 68 69 6e 67 20 69 73 20 6e 65 73 74 61 62 6c 65  hing is nestable
1ae0: 2e 20 20 54 68 69 73 20 66 61 63 69 6c 69 74 79  .  This facility
1af0: 20 69 73 20 64 65 73 69 67 6e 65 64 20 74 6f 20   is designed to 
1b00: 70 65 72 6d 69 74 0a 2a 2a 20 49 4e 53 45 52 54  permit.** INSERT
1b10: 2c 20 55 50 44 41 54 45 2c 20 61 6e 64 20 44 45  , UPDATE, and DE
1b20: 4c 45 54 45 20 6f 70 65 72 61 74 69 6f 6e 73 20  LETE operations 
1b30: 61 67 61 69 6e 73 74 20 53 51 4c 49 54 45 5f 4d  against SQLITE_M
1b40: 41 53 54 45 52 2e 20 20 55 73 65 0a 2a 2a 20 63  ASTER.  Use.** c
1b50: 61 72 65 20 69 66 20 79 6f 75 20 64 65 63 69 64  are if you decid
1b60: 65 20 74 6f 20 74 72 79 20 74 6f 20 75 73 65 20  e to try to use 
1b70: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 66 6f 72  this routine for
1b80: 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 75 72 70   some other purp
1b90: 6f 73 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  oses..*/.void sq
1ba0: 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72 73 65  lite3NestedParse
1bb0: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
1bc0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f 72  const char *zFor
1bd0: 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f  mat, ...){.  va_
1be0: 6c 69 73 74 20 61 70 3b 0a 20 20 63 68 61 72 20  list ap;.  char 
1bf0: 2a 7a 53 71 6c 3b 0a 23 20 64 65 66 69 6e 65 20  *zSql;.# define 
1c00: 53 41 56 45 5f 53 5a 20 20 28 73 69 7a 65 6f 66  SAVE_SZ  (sizeof
1c10: 28 50 61 72 73 65 29 20 2d 20 6f 66 66 73 65 74  (Parse) - offset
1c20: 6f 66 28 50 61 72 73 65 2c 6e 56 61 72 29 29 0a  of(Parse,nVar)).
1c30: 20 20 63 68 61 72 20 73 61 76 65 42 75 66 5b 53    char saveBuf[S
1c40: 41 56 45 5f 53 5a 5d 3b 0a 0a 20 20 69 66 28 20  AVE_SZ];..  if( 
1c50: 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 20 72  pParse->nErr ) r
1c60: 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28  eturn;.  assert(
1c70: 20 70 50 61 72 73 65 2d 3e 6e 65 73 74 65 64 3c   pParse->nested<
1c80: 31 30 20 29 3b 20 20 2f 2a 20 4e 65 73 74 69 6e  10 );  /* Nestin
1c90: 67 20 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 62 65  g should only be
1ca0: 20 6f 66 20 6c 69 6d 69 74 65 64 20 64 65 70 74   of limited dept
1cb0: 68 20 2a 2f 0a 20 20 76 61 5f 73 74 61 72 74 28  h */.  va_start(
1cc0: 61 70 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a 20 20  ap, zFormat);.  
1cd0: 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 56 4d  zSql = sqlite3VM
1ce0: 50 72 69 6e 74 66 28 70 50 61 72 73 65 2d 3e 64  Printf(pParse->d
1cf0: 62 2c 20 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b  b, zFormat, ap);
1d00: 0a 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20  .  va_end(ap);. 
1d10: 20 69 66 28 20 7a 53 71 6c 3d 3d 30 20 29 7b 0a   if( zSql==0 ){.
1d20: 20 20 20 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e      pParse->db->
1d30: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31  mallocFailed = 1
1d40: 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 20 20 20  ;.    return;   
1d50: 2f 2a 20 41 20 6d 61 6c 6c 6f 63 20 6d 75 73 74  /* A malloc must
1d60: 20 68 61 76 65 20 66 61 69 6c 65 64 20 2a 2f 0a   have failed */.
1d70: 20 20 7d 0a 20 20 70 50 61 72 73 65 2d 3e 6e 65    }.  pParse->ne
1d80: 73 74 65 64 2b 2b 3b 0a 20 20 6d 65 6d 63 70 79  sted++;.  memcpy
1d90: 28 73 61 76 65 42 75 66 2c 20 26 70 50 61 72 73  (saveBuf, &pPars
1da0: 65 2d 3e 6e 56 61 72 2c 20 53 41 56 45 5f 53 5a  e->nVar, SAVE_SZ
1db0: 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26 70 50 61  );.  memset(&pPa
1dc0: 72 73 65 2d 3e 6e 56 61 72 2c 20 30 2c 20 53 41  rse->nVar, 0, SA
1dd0: 56 45 5f 53 5a 29 3b 0a 20 20 73 71 6c 69 74 65  VE_SZ);.  sqlite
1de0: 33 52 75 6e 50 61 72 73 65 72 28 70 50 61 72 73  3RunParser(pPars
1df0: 65 2c 20 7a 53 71 6c 2c 20 30 29 3b 0a 20 20 73  e, zSql, 0);.  s
1e00: 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 53 71 6c  qlite3_free(zSql
1e10: 29 3b 0a 20 20 6d 65 6d 63 70 79 28 26 70 50 61  );.  memcpy(&pPa
1e20: 72 73 65 2d 3e 6e 56 61 72 2c 20 73 61 76 65 42  rse->nVar, saveB
1e30: 75 66 2c 20 53 41 56 45 5f 53 5a 29 3b 0a 20 20  uf, SAVE_SZ);.  
1e40: 70 50 61 72 73 65 2d 3e 6e 65 73 74 65 64 2d 2d  pParse->nested--
1e50: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61 74  ;.}../*.** Locat
1e60: 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20  e the in-memory 
1e70: 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20 64  structure that d
1e80: 65 73 63 72 69 62 65 73 20 61 20 70 61 72 74 69  escribes a parti
1e90: 63 75 6c 61 72 20 64 61 74 61 62 61 73 65 0a 2a  cular database.*
1ea0: 2a 20 74 61 62 6c 65 20 67 69 76 65 6e 20 74 68  * table given th
1eb0: 65 20 6e 61 6d 65 20 6f 66 20 74 68 61 74 20 74  e name of that t
1ec0: 61 62 6c 65 20 61 6e 64 20 28 6f 70 74 69 6f 6e  able and (option
1ed0: 61 6c 6c 79 29 20 74 68 65 20 6e 61 6d 65 20 6f  ally) the name o
1ee0: 66 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73  f the.** databas
1ef0: 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  e containing the
1f00: 20 74 61 62 6c 65 2e 20 20 52 65 74 75 72 6e 20   table.  Return 
1f10: 4e 55 4c 4c 20 69 66 20 6e 6f 74 20 66 6f 75 6e  NULL if not foun
1f20: 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 44 61 74  d..**.** If zDat
1f30: 61 62 61 73 65 20 69 73 20 30 2c 20 61 6c 6c 20  abase is 0, all 
1f40: 64 61 74 61 62 61 73 65 73 20 61 72 65 20 73 65  databases are se
1f50: 61 72 63 68 65 64 20 66 6f 72 20 74 68 65 20 74  arched for the t
1f60: 61 62 6c 65 20 61 6e 64 20 74 68 65 0a 2a 2a 20  able and the.** 
1f70: 66 69 72 73 74 20 6d 61 74 63 68 69 6e 67 20 74  first matching t
1f80: 61 62 6c 65 20 69 73 20 72 65 74 75 72 6e 65 64  able is returned
1f90: 2e 20 20 28 4e 6f 20 63 68 65 63 6b 69 6e 67 20  .  (No checking 
1fa0: 66 6f 72 20 64 75 70 6c 69 63 61 74 65 20 74 61  for duplicate ta
1fb0: 62 6c 65 0a 2a 2a 20 6e 61 6d 65 73 20 69 73 20  ble.** names is 
1fc0: 64 6f 6e 65 2e 29 20 20 54 68 65 20 73 65 61 72  done.)  The sear
1fd0: 63 68 20 6f 72 64 65 72 20 69 73 20 54 45 4d 50  ch order is TEMP
1fe0: 20 66 69 72 73 74 2c 20 74 68 65 6e 20 4d 41 49   first, then MAI
1ff0: 4e 2c 20 74 68 65 6e 20 61 6e 79 0a 2a 2a 20 61  N, then any.** a
2000: 75 78 69 6c 69 61 72 79 20 64 61 74 61 62 61 73  uxiliary databas
2010: 65 73 20 61 64 64 65 64 20 75 73 69 6e 67 20 74  es added using t
2020: 68 65 20 41 54 54 41 43 48 20 63 6f 6d 6d 61 6e  he ATTACH comman
2030: 64 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73  d..**.** See als
2040: 6f 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54  o sqlite3LocateT
2050: 61 62 6c 65 28 29 2e 0a 2a 2f 0a 54 61 62 6c 65  able()..*/.Table
2060: 20 2a 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62   *sqlite3FindTab
2070: 6c 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  le(sqlite3 *db, 
2080: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
2090: 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  e, const char *z
20a0: 44 61 74 61 62 61 73 65 29 7b 0a 20 20 54 61 62  Database){.  Tab
20b0: 6c 65 20 2a 70 20 3d 20 30 3b 0a 20 20 69 6e 74  le *p = 0;.  int
20c0: 20 69 3b 0a 20 20 61 73 73 65 72 74 28 20 7a 4e   i;.  assert( zN
20d0: 61 6d 65 21 3d 30 20 29 3b 0a 20 20 66 6f 72 28  ame!=0 );.  for(
20e0: 69 3d 4f 4d 49 54 5f 54 45 4d 50 44 42 3b 20 69  i=OMIT_TEMPDB; i
20f0: 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a  <db->nDb; i++){.
2100: 20 20 20 20 69 6e 74 20 6a 20 3d 20 28 69 3c 32      int j = (i<2
2110: 29 20 3f 20 69 5e 31 20 3a 20 69 3b 20 20 20 2f  ) ? i^1 : i;   /
2120: 2a 20 53 65 61 72 63 68 20 54 45 4d 50 20 62 65  * Search TEMP be
2130: 66 6f 72 65 20 4d 41 49 4e 20 2a 2f 0a 20 20 20  fore MAIN */.   
2140: 20 69 66 28 20 7a 44 61 74 61 62 61 73 65 21 3d   if( zDatabase!=
2150: 30 20 26 26 20 73 71 6c 69 74 65 33 53 74 72 49  0 && sqlite3StrI
2160: 43 6d 70 28 7a 44 61 74 61 62 61 73 65 2c 20 64  Cmp(zDatabase, d
2170: 62 2d 3e 61 44 62 5b 6a 5d 2e 7a 4e 61 6d 65 29  b->aDb[j].zName)
2180: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
2190: 20 70 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68   p = sqlite3Hash
21a0: 46 69 6e 64 28 26 64 62 2d 3e 61 44 62 5b 6a 5d  Find(&db->aDb[j]
21b0: 2e 70 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73  .pSchema->tblHas
21c0: 68 2c 20 7a 4e 61 6d 65 2c 20 73 74 72 6c 65 6e  h, zName, strlen
21d0: 28 7a 4e 61 6d 65 29 2b 31 29 3b 0a 20 20 20 20  (zName)+1);.    
21e0: 69 66 28 20 70 20 29 20 62 72 65 61 6b 3b 0a 20  if( p ) break;. 
21f0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d   }.  return p;.}
2200: 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61 74 65 20 74  ../*.** Locate t
2210: 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 73 74 72  he in-memory str
2220: 75 63 74 75 72 65 20 74 68 61 74 20 64 65 73 63  ucture that desc
2230: 72 69 62 65 73 20 61 20 70 61 72 74 69 63 75 6c  ribes a particul
2240: 61 72 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 74  ar database.** t
2250: 61 62 6c 65 20 67 69 76 65 6e 20 74 68 65 20 6e  able given the n
2260: 61 6d 65 20 6f 66 20 74 68 61 74 20 74 61 62 6c  ame of that tabl
2270: 65 20 61 6e 64 20 28 6f 70 74 69 6f 6e 61 6c 6c  e and (optionall
2280: 79 29 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  y) the name of t
2290: 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 63  he.** database c
22a0: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 74 61  ontaining the ta
22b0: 62 6c 65 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c  ble.  Return NUL
22c0: 4c 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 20  L if not found. 
22d0: 20 41 6c 73 6f 20 6c 65 61 76 65 20 61 6e 0a 2a   Also leave an.*
22e0: 2a 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  * error message 
22f0: 69 6e 20 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d  in pParse->zErrM
2300: 73 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 69  sg..**.** The di
2310: 66 66 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e  fference between
2320: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6e   this routine an
2330: 64 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62  d sqlite3FindTab
2340: 6c 65 28 29 20 69 73 20 74 68 61 74 20 74 68 69  le() is that thi
2350: 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 6c 65 61  s.** routine lea
2360: 76 65 73 20 61 6e 20 65 72 72 6f 72 20 6d 65 73  ves an error mes
2370: 73 61 67 65 20 69 6e 20 70 50 61 72 73 65 2d 3e  sage in pParse->
2380: 7a 45 72 72 4d 73 67 20 77 68 65 72 65 0a 2a 2a  zErrMsg where.**
2390: 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c   sqlite3FindTabl
23a0: 65 28 29 20 64 6f 65 73 20 6e 6f 74 2e 0a 2a 2f  e() does not..*/
23b0: 0a 54 61 62 6c 65 20 2a 73 71 6c 69 74 65 33 4c  .Table *sqlite3L
23c0: 6f 63 61 74 65 54 61 62 6c 65 28 50 61 72 73 65  ocateTable(Parse
23d0: 20 2a 70 50 61 72 73 65 2c 20 63 6f 6e 73 74 20   *pParse, const 
23e0: 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 63 6f 6e  char *zName, con
23f0: 73 74 20 63 68 61 72 20 2a 7a 44 62 61 73 65 29  st char *zDbase)
2400: 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 0a 20  {.  Table *p;.. 
2410: 20 2f 2a 20 52 65 61 64 20 74 68 65 20 64 61 74   /* Read the dat
2420: 61 62 61 73 65 20 73 63 68 65 6d 61 2e 20 49 66  abase schema. If
2430: 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
2440: 2c 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72  , leave an error
2450: 20 6d 65 73 73 61 67 65 0a 20 20 2a 2a 20 61 6e   message.  ** an
2460: 64 20 63 6f 64 65 20 69 6e 20 70 50 61 72 73 65  d code in pParse
2470: 20 61 6e 64 20 72 65 74 75 72 6e 20 4e 55 4c 4c   and return NULL
2480: 2e 20 2a 2f 0a 20 20 69 66 28 20 53 51 4c 49 54  . */.  if( SQLIT
2490: 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65 61  E_OK!=sqlite3Rea
24a0: 64 53 63 68 65 6d 61 28 70 50 61 72 73 65 29 20  dSchema(pParse) 
24b0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
24c0: 0a 20 20 7d 0a 0a 20 20 70 20 3d 20 73 71 6c 69  .  }..  p = sqli
24d0: 74 65 33 46 69 6e 64 54 61 62 6c 65 28 70 50 61  te3FindTable(pPa
24e0: 72 73 65 2d 3e 64 62 2c 20 7a 4e 61 6d 65 2c 20  rse->db, zName, 
24f0: 7a 44 62 61 73 65 29 3b 0a 20 20 69 66 28 20 70  zDbase);.  if( p
2500: 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 7a  ==0 ){.    if( z
2510: 44 62 61 73 65 20 29 7b 0a 20 20 20 20 20 20 73  Dbase ){.      s
2520: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
2530: 50 61 72 73 65 2c 20 22 6e 6f 20 73 75 63 68 20  Parse, "no such 
2540: 74 61 62 6c 65 3a 20 25 73 2e 25 73 22 2c 20 7a  table: %s.%s", z
2550: 44 62 61 73 65 2c 20 7a 4e 61 6d 65 29 3b 0a 20  Dbase, zName);. 
2560: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2570: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
2580: 70 50 61 72 73 65 2c 20 22 6e 6f 20 73 75 63 68  pParse, "no such
2590: 20 74 61 62 6c 65 3a 20 25 73 22 2c 20 7a 4e 61   table: %s", zNa
25a0: 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  me);.    }.    p
25b0: 50 61 72 73 65 2d 3e 63 68 65 63 6b 53 63 68 65  Parse->checkSche
25c0: 6d 61 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 72 65  ma = 1;.  }.  re
25d0: 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn p;.}../*.**
25e0: 20 4c 6f 63 61 74 65 20 74 68 65 20 69 6e 2d 6d   Locate the in-m
25f0: 65 6d 6f 72 79 20 73 74 72 75 63 74 75 72 65 20  emory structure 
2600: 74 68 61 74 20 64 65 73 63 72 69 62 65 73 20 0a  that describes .
2610: 2a 2a 20 61 20 70 61 72 74 69 63 75 6c 61 72 20  ** a particular 
2620: 69 6e 64 65 78 20 67 69 76 65 6e 20 74 68 65 20  index given the 
2630: 6e 61 6d 65 20 6f 66 20 74 68 61 74 20 69 6e 64  name of that ind
2640: 65 78 0a 2a 2a 20 61 6e 64 20 74 68 65 20 6e 61  ex.** and the na
2650: 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  me of the databa
2660: 73 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73  se that contains
2670: 20 74 68 65 20 69 6e 64 65 78 2e 0a 2a 2a 20 52   the index..** R
2680: 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 6e 6f  eturn NULL if no
2690: 74 20 66 6f 75 6e 64 2e 0a 2a 2a 0a 2a 2a 20 49  t found..**.** I
26a0: 66 20 7a 44 61 74 61 62 61 73 65 20 69 73 20 30  f zDatabase is 0
26b0: 2c 20 61 6c 6c 20 64 61 74 61 62 61 73 65 73 20  , all databases 
26c0: 61 72 65 20 73 65 61 72 63 68 65 64 20 66 6f 72  are searched for
26d0: 20 74 68 65 0a 2a 2a 20 74 61 62 6c 65 20 61 6e   the.** table an
26e0: 64 20 74 68 65 20 66 69 72 73 74 20 6d 61 74 63  d the first matc
26f0: 68 69 6e 67 20 69 6e 64 65 78 20 69 73 20 72 65  hing index is re
2700: 74 75 72 6e 65 64 2e 20 20 28 4e 6f 20 63 68 65  turned.  (No che
2710: 63 6b 69 6e 67 0a 2a 2a 20 66 6f 72 20 64 75 70  cking.** for dup
2720: 6c 69 63 61 74 65 20 69 6e 64 65 78 20 6e 61 6d  licate index nam
2730: 65 73 20 69 73 20 64 6f 6e 65 2e 29 20 20 54 68  es is done.)  Th
2740: 65 20 73 65 61 72 63 68 20 6f 72 64 65 72 20 69  e search order i
2750: 73 0a 2a 2a 20 54 45 4d 50 20 66 69 72 73 74 2c  s.** TEMP first,
2760: 20 74 68 65 6e 20 4d 41 49 4e 2c 20 74 68 65 6e   then MAIN, then
2770: 20 61 6e 79 20 61 75 78 69 6c 69 61 72 79 20 64   any auxiliary d
2780: 61 74 61 62 61 73 65 73 20 61 64 64 65 64 0a 2a  atabases added.*
2790: 2a 20 75 73 69 6e 67 20 74 68 65 20 41 54 54 41  * using the ATTA
27a0: 43 48 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2f 0a 49  CH command..*/.I
27b0: 6e 64 65 78 20 2a 73 71 6c 69 74 65 33 46 69 6e  ndex *sqlite3Fin
27c0: 64 49 6e 64 65 78 28 73 71 6c 69 74 65 33 20 2a  dIndex(sqlite3 *
27d0: 64 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  db, const char *
27e0: 7a 4e 61 6d 65 2c 20 63 6f 6e 73 74 20 63 68 61  zName, const cha
27f0: 72 20 2a 7a 44 62 29 7b 0a 20 20 49 6e 64 65 78  r *zDb){.  Index
2800: 20 2a 70 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69   *p = 0;.  int i
2810: 3b 0a 20 20 66 6f 72 28 69 3d 4f 4d 49 54 5f 54  ;.  for(i=OMIT_T
2820: 45 4d 50 44 42 3b 20 69 3c 64 62 2d 3e 6e 44 62  EMPDB; i<db->nDb
2830: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20  ; i++){.    int 
2840: 6a 20 3d 20 28 69 3c 32 29 20 3f 20 69 5e 31 20  j = (i<2) ? i^1 
2850: 3a 20 69 3b 20 20 2f 2a 20 53 65 61 72 63 68 20  : i;  /* Search 
2860: 54 45 4d 50 20 62 65 66 6f 72 65 20 4d 41 49 4e  TEMP before MAIN
2870: 20 2a 2f 0a 20 20 20 20 53 63 68 65 6d 61 20 2a   */.    Schema *
2880: 70 53 63 68 65 6d 61 20 3d 20 64 62 2d 3e 61 44  pSchema = db->aD
2890: 62 5b 6a 5d 2e 70 53 63 68 65 6d 61 3b 0a 20 20  b[j].pSchema;.  
28a0: 20 20 69 66 28 20 7a 44 62 20 26 26 20 73 71 6c    if( zDb && sql
28b0: 69 74 65 33 53 74 72 49 43 6d 70 28 7a 44 62 2c  ite3StrICmp(zDb,
28c0: 20 64 62 2d 3e 61 44 62 5b 6a 5d 2e 7a 4e 61 6d   db->aDb[j].zNam
28d0: 65 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  e) ) continue;. 
28e0: 20 20 20 61 73 73 65 72 74 28 20 70 53 63 68 65     assert( pSche
28f0: 6d 61 20 7c 7c 20 28 6a 3d 3d 31 20 26 26 20 21  ma || (j==1 && !
2900: 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 42 74 29 20  db->aDb[1].pBt) 
2910: 29 3b 0a 20 20 20 20 69 66 28 20 70 53 63 68 65  );.    if( pSche
2920: 6d 61 20 29 7b 0a 20 20 20 20 20 20 70 20 3d 20  ma ){.      p = 
2930: 73 71 6c 69 74 65 33 48 61 73 68 46 69 6e 64 28  sqlite3HashFind(
2940: 26 70 53 63 68 65 6d 61 2d 3e 69 64 78 48 61 73  &pSchema->idxHas
2950: 68 2c 20 7a 4e 61 6d 65 2c 20 73 74 72 6c 65 6e  h, zName, strlen
2960: 28 7a 4e 61 6d 65 29 2b 31 29 3b 0a 20 20 20 20  (zName)+1);.    
2970: 7d 0a 20 20 20 20 69 66 28 20 70 20 29 20 62 72  }.    if( p ) br
2980: 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  eak;.  }.  retur
2990: 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  n p;.}../*.** Re
29a0: 63 6c 61 69 6d 20 74 68 65 20 6d 65 6d 6f 72 79  claim the memory
29b0: 20 75 73 65 64 20 62 79 20 61 6e 20 69 6e 64 65   used by an inde
29c0: 78 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  x.*/.static void
29d0: 20 66 72 65 65 49 6e 64 65 78 28 49 6e 64 65 78   freeIndex(Index
29e0: 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f   *p){.  sqlite3_
29f0: 66 72 65 65 28 70 2d 3e 7a 43 6f 6c 41 66 66 29  free(p->zColAff)
2a00: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ;.  sqlite3_free
2a10: 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  (p);.}../*.** Re
2a20: 6d 6f 76 65 20 74 68 65 20 67 69 76 65 6e 20 69  move the given i
2a30: 6e 64 65 78 20 66 72 6f 6d 20 74 68 65 20 69 6e  ndex from the in
2a40: 64 65 78 20 68 61 73 68 20 74 61 62 6c 65 2c 20  dex hash table, 
2a50: 61 6e 64 20 66 72 65 65 0a 2a 2a 20 69 74 73 20  and free.** its 
2a60: 6d 65 6d 6f 72 79 20 73 74 72 75 63 74 75 72 65  memory structure
2a70: 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6e 64  s..**.** The ind
2a80: 65 78 20 69 73 20 72 65 6d 6f 76 65 64 20 66 72  ex is removed fr
2a90: 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 20  om the database 
2aa0: 68 61 73 68 20 74 61 62 6c 65 73 20 62 75 74 0a  hash tables but.
2ab0: 2a 2a 20 69 74 20 69 73 20 6e 6f 74 20 75 6e 6c  ** it is not unl
2ac0: 69 6e 6b 65 64 20 66 72 6f 6d 20 74 68 65 20 54  inked from the T
2ad0: 61 62 6c 65 20 74 68 61 74 20 69 74 20 69 6e 64  able that it ind
2ae0: 65 78 65 73 2e 0a 2a 2a 20 55 6e 6c 69 6e 6b 69  exes..** Unlinki
2af0: 6e 67 20 66 72 6f 6d 20 74 68 65 20 54 61 62 6c  ng from the Tabl
2b00: 65 20 6d 75 73 74 20 62 65 20 64 6f 6e 65 20 62  e must be done b
2b10: 79 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 66 75  y the calling fu
2b20: 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  nction..*/.stati
2b30: 63 20 76 6f 69 64 20 73 71 6c 69 74 65 44 65 6c  c void sqliteDel
2b40: 65 74 65 49 6e 64 65 78 28 49 6e 64 65 78 20 2a  eteIndex(Index *
2b50: 70 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 4f 6c  p){.  Index *pOl
2b60: 64 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  d;.  const char 
2b70: 2a 7a 4e 61 6d 65 20 3d 20 70 2d 3e 7a 4e 61 6d  *zName = p->zNam
2b80: 65 3b 0a 0a 20 20 70 4f 6c 64 20 3d 20 73 71 6c  e;..  pOld = sql
2b90: 69 74 65 33 48 61 73 68 49 6e 73 65 72 74 28 26  ite3HashInsert(&
2ba0: 70 2d 3e 70 53 63 68 65 6d 61 2d 3e 69 64 78 48  p->pSchema->idxH
2bb0: 61 73 68 2c 20 7a 4e 61 6d 65 2c 20 73 74 72 6c  ash, zName, strl
2bc0: 65 6e 28 20 7a 4e 61 6d 65 29 2b 31 2c 20 30 29  en( zName)+1, 0)
2bd0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 6c 64  ;.  assert( pOld
2be0: 3d 3d 30 20 7c 7c 20 70 4f 6c 64 3d 3d 70 20 29  ==0 || pOld==p )
2bf0: 3b 0a 20 20 66 72 65 65 49 6e 64 65 78 28 70 29  ;.  freeIndex(p)
2c00: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 20 74  ;.}../*.** For t
2c10: 68 65 20 69 6e 64 65 78 20 63 61 6c 6c 65 64 20  he index called 
2c20: 7a 49 64 78 4e 61 6d 65 20 77 68 69 63 68 20 69  zIdxName which i
2c30: 73 20 66 6f 75 6e 64 20 69 6e 20 74 68 65 20 64  s found in the d
2c40: 61 74 61 62 61 73 65 20 69 44 62 2c 0a 2a 2a 20  atabase iDb,.** 
2c50: 75 6e 6c 69 6b 65 20 74 68 61 74 20 69 6e 64 65  unlike that inde
2c60: 78 20 66 72 6f 6d 20 69 74 73 20 54 61 62 6c 65  x from its Table
2c70: 20 74 68 65 6e 20 72 65 6d 6f 76 65 20 74 68 65   then remove the
2c80: 20 69 6e 64 65 78 20 66 72 6f 6d 0a 2a 2a 20 74   index from.** t
2c90: 68 65 20 69 6e 64 65 78 20 68 61 73 68 20 74 61  he index hash ta
2ca0: 62 6c 65 20 61 6e 64 20 66 72 65 65 20 61 6c 6c  ble and free all
2cb0: 20 6d 65 6d 6f 72 79 20 73 74 72 75 63 74 75 72   memory structur
2cc0: 65 73 20 61 73 73 6f 63 69 61 74 65 64 0a 2a 2a  es associated.**
2cd0: 20 77 69 74 68 20 74 68 65 20 69 6e 64 65 78 2e   with the index.
2ce0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
2cf0: 55 6e 6c 69 6e 6b 41 6e 64 44 65 6c 65 74 65 49  UnlinkAndDeleteI
2d00: 6e 64 65 78 28 73 71 6c 69 74 65 33 20 2a 64 62  ndex(sqlite3 *db
2d10: 2c 20 69 6e 74 20 69 44 62 2c 20 63 6f 6e 73 74  , int iDb, const
2d20: 20 63 68 61 72 20 2a 7a 49 64 78 4e 61 6d 65 29   char *zIdxName)
2d30: 7b 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65  {.  Index *pInde
2d40: 78 3b 0a 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20  x;.  int len;.  
2d50: 48 61 73 68 20 2a 70 48 61 73 68 20 3d 20 26 64  Hash *pHash = &d
2d60: 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53 63 68  b->aDb[iDb].pSch
2d70: 65 6d 61 2d 3e 69 64 78 48 61 73 68 3b 0a 0a 20  ema->idxHash;.. 
2d80: 20 6c 65 6e 20 3d 20 73 74 72 6c 65 6e 28 7a 49   len = strlen(zI
2d90: 64 78 4e 61 6d 65 29 3b 0a 20 20 70 49 6e 64 65  dxName);.  pInde
2da0: 78 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68 49  x = sqlite3HashI
2db0: 6e 73 65 72 74 28 70 48 61 73 68 2c 20 7a 49 64  nsert(pHash, zId
2dc0: 78 4e 61 6d 65 2c 20 6c 65 6e 2b 31 2c 20 30 29  xName, len+1, 0)
2dd0: 3b 0a 20 20 69 66 28 20 70 49 6e 64 65 78 20 29  ;.  if( pIndex )
2de0: 7b 0a 20 20 20 20 69 66 28 20 70 49 6e 64 65 78  {.    if( pIndex
2df0: 2d 3e 70 54 61 62 6c 65 2d 3e 70 49 6e 64 65 78  ->pTable->pIndex
2e00: 3d 3d 70 49 6e 64 65 78 20 29 7b 0a 20 20 20 20  ==pIndex ){.    
2e10: 20 20 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65    pIndex->pTable
2e20: 2d 3e 70 49 6e 64 65 78 20 3d 20 70 49 6e 64 65  ->pIndex = pInde
2e30: 78 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 65  x->pNext;.    }e
2e40: 6c 73 65 7b 0a 20 20 20 20 20 20 49 6e 64 65 78  lse{.      Index
2e50: 20 2a 70 3b 0a 20 20 20 20 20 20 66 6f 72 28 70   *p;.      for(p
2e60: 3d 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 2d  =pIndex->pTable-
2e70: 3e 70 49 6e 64 65 78 3b 20 70 20 26 26 20 70 2d  >pIndex; p && p-
2e80: 3e 70 4e 65 78 74 21 3d 70 49 6e 64 65 78 3b 20  >pNext!=pIndex; 
2e90: 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 7d 0a 20 20  p=p->pNext){}.  
2ea0: 20 20 20 20 69 66 28 20 70 20 26 26 20 70 2d 3e      if( p && p->
2eb0: 70 4e 65 78 74 3d 3d 70 49 6e 64 65 78 20 29 7b  pNext==pIndex ){
2ec0: 0a 20 20 20 20 20 20 20 20 70 2d 3e 70 4e 65 78  .        p->pNex
2ed0: 74 20 3d 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78  t = pIndex->pNex
2ee0: 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  t;.      }.    }
2ef0: 0a 20 20 20 20 66 72 65 65 49 6e 64 65 78 28 70  .    freeIndex(p
2f00: 49 6e 64 65 78 29 3b 0a 20 20 7d 0a 20 20 64 62  Index);.  }.  db
2f10: 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54  ->flags |= SQLIT
2f20: 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b  E_InternChanges;
2f30: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 72 61 73 65 20  .}../*.** Erase 
2f40: 61 6c 6c 20 73 63 68 65 6d 61 20 69 6e 66 6f 72  all schema infor
2f50: 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20  mation from the 
2f60: 69 6e 2d 6d 65 6d 6f 72 79 20 68 61 73 68 20 74  in-memory hash t
2f70: 61 62 6c 65 73 20 6f 66 0a 2a 2a 20 61 20 73 69  ables of.** a si
2f80: 6e 67 6c 65 20 64 61 74 61 62 61 73 65 2e 20 20  ngle database.  
2f90: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
2fa0: 63 61 6c 6c 65 64 20 74 6f 20 72 65 63 6c 61 69  called to reclai
2fb0: 6d 20 6d 65 6d 6f 72 79 0a 2a 2a 20 62 65 66 6f  m memory.** befo
2fc0: 72 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20  re the database 
2fd0: 63 6c 6f 73 65 73 2e 20 20 49 74 20 69 73 20 61  closes.  It is a
2fe0: 6c 73 6f 20 63 61 6c 6c 65 64 20 64 75 72 69 6e  lso called durin
2ff0: 67 20 61 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20  g a rollback.** 
3000: 69 66 20 74 68 65 72 65 20 77 65 72 65 20 73 63  if there were sc
3010: 68 65 6d 61 20 63 68 61 6e 67 65 73 20 64 75 72  hema changes dur
3020: 69 6e 67 20 74 68 65 20 74 72 61 6e 73 61 63 74  ing the transact
3030: 69 6f 6e 20 6f 72 20 69 66 20 61 0a 2a 2a 20 73  ion or if a.** s
3040: 63 68 65 6d 61 2d 63 6f 6f 6b 69 65 20 6d 69 73  chema-cookie mis
3050: 6d 61 74 63 68 20 6f 63 63 75 72 73 2e 0a 2a 2a  match occurs..**
3060: 0a 2a 2a 20 49 66 20 69 44 62 3c 3d 30 20 74 68  .** If iDb<=0 th
3070: 65 6e 20 72 65 73 65 74 20 74 68 65 20 69 6e 74  en reset the int
3080: 65 72 6e 61 6c 20 73 63 68 65 6d 61 20 74 61 62  ernal schema tab
3090: 6c 65 73 20 66 6f 72 20 61 6c 6c 20 64 61 74 61  les for all data
30a0: 62 61 73 65 0a 2a 2a 20 66 69 6c 65 73 2e 20 20  base.** files.  
30b0: 49 66 20 69 44 62 3e 3d 32 20 74 68 65 6e 20 72  If iDb>=2 then r
30c0: 65 73 65 74 20 74 68 65 20 69 6e 74 65 72 6e 61  eset the interna
30d0: 6c 20 73 63 68 65 6d 61 20 66 6f 72 20 6f 6e 6c  l schema for onl
30e0: 79 20 74 68 65 0a 2a 2a 20 73 69 6e 67 6c 65 20  y the.** single 
30f0: 66 69 6c 65 20 69 6e 64 69 63 61 74 65 64 2e 0a  file indicated..
3100: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52  */.void sqlite3R
3110: 65 73 65 74 49 6e 74 65 72 6e 61 6c 53 63 68 65  esetInternalSche
3120: 6d 61 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  ma(sqlite3 *db, 
3130: 69 6e 74 20 69 44 62 29 7b 0a 20 20 69 6e 74 20  int iDb){.  int 
3140: 69 2c 20 6a 3b 0a 0a 20 20 61 73 73 65 72 74 28  i, j;..  assert(
3150: 20 69 44 62 3e 3d 30 20 26 26 20 69 44 62 3c 64   iDb>=0 && iDb<d
3160: 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 66 6f 72 28  b->nDb );.  for(
3170: 69 3d 69 44 62 3b 20 69 3c 64 62 2d 3e 6e 44 62  i=iDb; i<db->nDb
3180: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 44 62 20 2a  ; i++){.    Db *
3190: 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69  pDb = &db->aDb[i
31a0: 5d 3b 0a 20 20 20 20 69 66 28 20 70 44 62 2d 3e  ];.    if( pDb->
31b0: 70 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 20  pSchema ){.     
31c0: 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 46 72   sqlite3SchemaFr
31d0: 65 65 28 70 44 62 2d 3e 70 53 63 68 65 6d 61 29  ee(pDb->pSchema)
31e0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
31f0: 69 44 62 3e 30 20 29 20 72 65 74 75 72 6e 3b 0a  iDb>0 ) return;.
3200: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 69 44    }.  assert( iD
3210: 62 3d 3d 30 20 29 3b 0a 20 20 64 62 2d 3e 66 6c  b==0 );.  db->fl
3220: 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 49  ags &= ~SQLITE_I
3230: 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a 0a 20  nternChanges;.. 
3240: 20 2f 2a 20 49 66 20 6f 6e 65 20 6f 72 20 6d 6f   /* If one or mo
3250: 72 65 20 6f 66 20 74 68 65 20 61 75 78 69 6c 69  re of the auxili
3260: 61 72 79 20 64 61 74 61 62 61 73 65 20 66 69 6c  ary database fil
3270: 65 73 20 68 61 73 20 62 65 65 6e 20 63 6c 6f 73  es has been clos
3280: 65 64 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 72 65  ed,.  ** then re
3290: 6d 6f 76 65 20 74 68 65 6d 20 66 72 6f 6d 20 74  move them from t
32a0: 68 65 20 61 75 78 69 6c 69 61 72 79 20 64 61 74  he auxiliary dat
32b0: 61 62 61 73 65 20 6c 69 73 74 2e 20 20 57 65 20  abase list.  We 
32c0: 74 61 6b 65 20 74 68 65 0a 20 20 2a 2a 20 6f 70  take the.  ** op
32d0: 70 6f 72 74 75 6e 69 74 79 20 74 6f 20 64 6f 20  portunity to do 
32e0: 74 68 69 73 20 68 65 72 65 20 73 69 6e 63 65 20  this here since 
32f0: 77 65 20 68 61 76 65 20 6a 75 73 74 20 64 65 6c  we have just del
3300: 65 74 65 64 20 61 6c 6c 20 6f 66 20 74 68 65 0a  eted all of the.
3310: 20 20 2a 2a 20 73 63 68 65 6d 61 20 68 61 73 68    ** schema hash
3320: 20 74 61 62 6c 65 73 20 61 6e 64 20 74 68 65 72   tables and ther
3330: 65 66 6f 72 65 20 64 6f 20 6e 6f 74 20 68 61 76  efore do not hav
3340: 65 20 74 6f 20 6d 61 6b 65 20 61 6e 79 20 63 68  e to make any ch
3350: 61 6e 67 65 73 0a 20 20 2a 2a 20 74 6f 20 61 6e  anges.  ** to an
3360: 79 20 6f 66 20 74 68 6f 73 65 20 74 61 62 6c 65  y of those table
3370: 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  s..  */.  for(i=
3380: 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b  0; i<db->nDb; i+
3390: 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 44  +){.    struct D
33a0: 62 20 2a 70 44 62 20 3d 20 26 64 62 2d 3e 61 44  b *pDb = &db->aD
33b0: 62 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 70 44  b[i];.    if( pD
33c0: 62 2d 3e 70 42 74 3d 3d 30 20 29 7b 0a 20 20 20  b->pBt==0 ){.   
33d0: 20 20 20 69 66 28 20 70 44 62 2d 3e 70 41 75 78     if( pDb->pAux
33e0: 20 26 26 20 70 44 62 2d 3e 78 46 72 65 65 41 75   && pDb->xFreeAu
33f0: 78 20 29 20 70 44 62 2d 3e 78 46 72 65 65 41 75  x ) pDb->xFreeAu
3400: 78 28 70 44 62 2d 3e 70 41 75 78 29 3b 0a 20 20  x(pDb->pAux);.  
3410: 20 20 20 20 70 44 62 2d 3e 70 41 75 78 20 3d 20      pDb->pAux = 
3420: 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66  0;.    }.  }.  f
3430: 6f 72 28 69 3d 6a 3d 32 3b 20 69 3c 64 62 2d 3e  or(i=j=2; i<db->
3440: 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73  nDb; i++){.    s
3450: 74 72 75 63 74 20 44 62 20 2a 70 44 62 20 3d 20  truct Db *pDb = 
3460: 26 64 62 2d 3e 61 44 62 5b 69 5d 3b 0a 20 20 20  &db->aDb[i];.   
3470: 20 69 66 28 20 70 44 62 2d 3e 70 42 74 3d 3d 30   if( pDb->pBt==0
3480: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
3490: 33 5f 66 72 65 65 28 70 44 62 2d 3e 7a 4e 61 6d  3_free(pDb->zNam
34a0: 65 29 3b 0a 20 20 20 20 20 20 70 44 62 2d 3e 7a  e);.      pDb->z
34b0: 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  Name = 0;.      
34c0: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a  continue;.    }.
34d0: 20 20 20 20 69 66 28 20 6a 3c 69 20 29 7b 0a 20      if( j<i ){. 
34e0: 20 20 20 20 20 64 62 2d 3e 61 44 62 5b 6a 5d 20       db->aDb[j] 
34f0: 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 3b 0a 20 20  = db->aDb[i];.  
3500: 20 20 7d 0a 20 20 20 20 6a 2b 2b 3b 0a 20 20 7d    }.    j++;.  }
3510: 0a 20 20 6d 65 6d 73 65 74 28 26 64 62 2d 3e 61  .  memset(&db->a
3520: 44 62 5b 6a 5d 2c 20 30 2c 20 28 64 62 2d 3e 6e  Db[j], 0, (db->n
3530: 44 62 2d 6a 29 2a 73 69 7a 65 6f 66 28 64 62 2d  Db-j)*sizeof(db-
3540: 3e 61 44 62 5b 6a 5d 29 29 3b 0a 20 20 64 62 2d  >aDb[j]));.  db-
3550: 3e 6e 44 62 20 3d 20 6a 3b 0a 20 20 69 66 28 20  >nDb = j;.  if( 
3560: 64 62 2d 3e 6e 44 62 3c 3d 32 20 26 26 20 64 62  db->nDb<=2 && db
3570: 2d 3e 61 44 62 21 3d 64 62 2d 3e 61 44 62 53 74  ->aDb!=db->aDbSt
3580: 61 74 69 63 20 29 7b 0a 20 20 20 20 6d 65 6d 63  atic ){.    memc
3590: 70 79 28 64 62 2d 3e 61 44 62 53 74 61 74 69 63  py(db->aDbStatic
35a0: 2c 20 64 62 2d 3e 61 44 62 2c 20 32 2a 73 69 7a  , db->aDb, 2*siz
35b0: 65 6f 66 28 64 62 2d 3e 61 44 62 5b 30 5d 29 29  eof(db->aDb[0]))
35c0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
35d0: 65 65 28 64 62 2d 3e 61 44 62 29 3b 0a 20 20 20  ee(db->aDb);.   
35e0: 20 64 62 2d 3e 61 44 62 20 3d 20 64 62 2d 3e 61   db->aDb = db->a
35f0: 44 62 53 74 61 74 69 63 3b 0a 20 20 7d 0a 7d 0a  DbStatic;.  }.}.
3600: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
3610: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77 68  ine is called wh
3620: 65 6e 20 61 20 63 6f 6d 6d 69 74 20 6f 63 63 75  en a commit occu
3630: 72 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  rs..*/.void sqli
3640: 74 65 33 43 6f 6d 6d 69 74 49 6e 74 65 72 6e 61  te3CommitInterna
3650: 6c 43 68 61 6e 67 65 73 28 73 71 6c 69 74 65 33  lChanges(sqlite3
3660: 20 2a 64 62 29 7b 0a 20 20 64 62 2d 3e 66 6c 61   *db){.  db->fla
3670: 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 49 6e  gs &= ~SQLITE_In
3680: 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a 7d 0a 0a  ternChanges;.}..
3690: 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 74 68 65 20  /*.** Clear the 
36a0: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 66 72 6f  column names fro
36b0: 6d 20 61 20 74 61 62 6c 65 20 6f 72 20 76 69 65  m a table or vie
36c0: 77 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  w..*/.static voi
36d0: 64 20 73 71 6c 69 74 65 52 65 73 65 74 43 6f 6c  d sqliteResetCol
36e0: 75 6d 6e 4e 61 6d 65 73 28 54 61 62 6c 65 20 2a  umnNames(Table *
36f0: 70 54 61 62 6c 65 29 7b 0a 20 20 69 6e 74 20 69  pTable){.  int i
3700: 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c  ;.  Column *pCol
3710: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54 61 62  ;.  assert( pTab
3720: 6c 65 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 28  le!=0 );.  if( (
3730: 70 43 6f 6c 20 3d 20 70 54 61 62 6c 65 2d 3e 61  pCol = pTable->a
3740: 43 6f 6c 29 21 3d 30 20 29 7b 0a 20 20 20 20 66  Col)!=0 ){.    f
3750: 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61 62 6c 65  or(i=0; i<pTable
3760: 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f  ->nCol; i++, pCo
3770: 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  l++){.      sqli
3780: 74 65 33 5f 66 72 65 65 28 70 43 6f 6c 2d 3e 7a  te3_free(pCol->z
3790: 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 73 71 6c  Name);.      sql
37a0: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 70  ite3ExprDelete(p
37b0: 43 6f 6c 2d 3e 70 44 66 6c 74 29 3b 0a 20 20 20  Col->pDflt);.   
37c0: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
37d0: 70 43 6f 6c 2d 3e 7a 54 79 70 65 29 3b 0a 20 20  pCol->zType);.  
37e0: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
37f0: 28 70 43 6f 6c 2d 3e 7a 43 6f 6c 6c 29 3b 0a 20  (pCol->zColl);. 
3800: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
3810: 5f 66 72 65 65 28 70 54 61 62 6c 65 2d 3e 61 43  _free(pTable->aC
3820: 6f 6c 29 3b 0a 20 20 7d 0a 20 20 70 54 61 62 6c  ol);.  }.  pTabl
3830: 65 2d 3e 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 70  e->aCol = 0;.  p
3840: 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 30 3b  Table->nCol = 0;
3850: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65  .}../*.** Remove
3860: 20 74 68 65 20 6d 65 6d 6f 72 79 20 64 61 74 61   the memory data
3870: 20 73 74 72 75 63 74 75 72 65 73 20 61 73 73 6f   structures asso
3880: 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20  ciated with the 
3890: 67 69 76 65 6e 0a 2a 2a 20 54 61 62 6c 65 2e 20  given.** Table. 
38a0: 20 4e 6f 20 63 68 61 6e 67 65 73 20 61 72 65 20   No changes are 
38b0: 6d 61 64 65 20 74 6f 20 64 69 73 6b 20 62 79 20  made to disk by 
38c0: 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a  this routine..**
38d0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
38e0: 20 6a 75 73 74 20 64 65 6c 65 74 65 73 20 74 68   just deletes th
38f0: 65 20 64 61 74 61 20 73 74 72 75 63 74 75 72 65  e data structure
3900: 2e 20 20 49 74 20 64 6f 65 73 20 6e 6f 74 20 75  .  It does not u
3910: 6e 6c 69 6e 6b 0a 2a 2a 20 74 68 65 20 74 61 62  nlink.** the tab
3920: 6c 65 20 64 61 74 61 20 73 74 72 75 63 74 75 72  le data structur
3930: 65 20 66 72 6f 6d 20 74 68 65 20 68 61 73 68 20  e from the hash 
3940: 74 61 62 6c 65 2e 20 20 4e 6f 72 20 64 6f 65 73  table.  Nor does
3950: 20 69 74 20 72 65 6d 6f 76 65 0a 2a 2a 20 66 6f   it remove.** fo
3960: 72 65 69 67 6e 20 6b 65 79 73 20 66 72 6f 6d 20  reign keys from 
3970: 74 68 65 20 73 71 6c 69 74 65 2e 61 46 4b 65 79  the sqlite.aFKey
3980: 20 68 61 73 68 20 74 61 62 6c 65 2e 20 20 42 75   hash table.  Bu
3990: 74 20 69 74 20 64 6f 65 73 20 64 65 73 74 72 6f  t it does destro
39a0: 79 0a 2a 2a 20 6d 65 6d 6f 72 79 20 73 74 72 75  y.** memory stru
39b0: 63 74 75 72 65 73 20 6f 66 20 74 68 65 20 69 6e  ctures of the in
39c0: 64 69 63 65 73 20 61 6e 64 20 66 6f 72 65 69 67  dices and foreig
39d0: 6e 20 6b 65 79 73 20 61 73 73 6f 63 69 61 74 65  n keys associate
39e0: 64 20 77 69 74 68 20 0a 2a 2a 20 74 68 65 20 74  d with .** the t
39f0: 61 62 6c 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  able..*/.void sq
3a00: 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62 6c 65  lite3DeleteTable
3a10: 28 54 61 62 6c 65 20 2a 70 54 61 62 6c 65 29 7b  (Table *pTable){
3a20: 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78  .  Index *pIndex
3a30: 2c 20 2a 70 4e 65 78 74 3b 0a 20 20 46 4b 65 79  , *pNext;.  FKey
3a40: 20 2a 70 46 4b 65 79 2c 20 2a 70 4e 65 78 74 46   *pFKey, *pNextF
3a50: 4b 65 79 3b 0a 0a 20 20 69 66 28 20 70 54 61 62  Key;..  if( pTab
3a60: 6c 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  le==0 ) return;.
3a70: 0a 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 64 65 6c  .  /* Do not del
3a80: 65 74 65 20 74 68 65 20 74 61 62 6c 65 20 75 6e  ete the table un
3a90: 74 69 6c 20 74 68 65 20 72 65 66 65 72 65 6e 63  til the referenc
3aa0: 65 20 63 6f 75 6e 74 20 72 65 61 63 68 65 73 20  e count reaches 
3ab0: 7a 65 72 6f 2e 20 2a 2f 0a 20 20 70 54 61 62 6c  zero. */.  pTabl
3ac0: 65 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 69 66 28  e->nRef--;.  if(
3ad0: 20 70 54 61 62 6c 65 2d 3e 6e 52 65 66 3e 30 20   pTable->nRef>0 
3ae0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  ){.    return;. 
3af0: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 54 61   }.  assert( pTa
3b00: 62 6c 65 2d 3e 6e 52 65 66 3d 3d 30 20 29 3b 0a  ble->nRef==0 );.
3b10: 0a 20 20 2f 2a 20 44 65 6c 65 74 65 20 61 6c 6c  .  /* Delete all
3b20: 20 69 6e 64 69 63 65 73 20 61 73 73 6f 63 69 61   indices associa
3b30: 74 65 64 20 77 69 74 68 20 74 68 69 73 20 74 61  ted with this ta
3b40: 62 6c 65 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 70  ble.  */.  for(p
3b50: 49 6e 64 65 78 20 3d 20 70 54 61 62 6c 65 2d 3e  Index = pTable->
3b60: 70 49 6e 64 65 78 3b 20 70 49 6e 64 65 78 3b 20  pIndex; pIndex; 
3b70: 70 49 6e 64 65 78 3d 70 4e 65 78 74 29 7b 0a 20  pIndex=pNext){. 
3b80: 20 20 20 70 4e 65 78 74 20 3d 20 70 49 6e 64 65     pNext = pInde
3b90: 78 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 61 73  x->pNext;.    as
3ba0: 73 65 72 74 28 20 70 49 6e 64 65 78 2d 3e 70 53  sert( pIndex->pS
3bb0: 63 68 65 6d 61 3d 3d 70 54 61 62 6c 65 2d 3e 70  chema==pTable->p
3bc0: 53 63 68 65 6d 61 20 29 3b 0a 20 20 20 20 73 71  Schema );.    sq
3bd0: 6c 69 74 65 44 65 6c 65 74 65 49 6e 64 65 78 28  liteDeleteIndex(
3be0: 70 49 6e 64 65 78 29 3b 0a 20 20 7d 0a 0a 23 69  pIndex);.  }..#i
3bf0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
3c00: 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 0a 20 20  T_FOREIGN_KEY.  
3c10: 2f 2a 20 44 65 6c 65 74 65 20 61 6c 6c 20 66 6f  /* Delete all fo
3c20: 72 65 69 67 6e 20 6b 65 79 73 20 61 73 73 6f 63  reign keys assoc
3c30: 69 61 74 65 64 20 77 69 74 68 20 74 68 69 73 20  iated with this 
3c40: 74 61 62 6c 65 2e 20 20 54 68 65 20 6b 65 79 73  table.  The keys
3c50: 0a 20 20 2a 2a 20 73 68 6f 75 6c 64 20 68 61 76  .  ** should hav
3c60: 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 75  e already been u
3c70: 6e 6c 69 6e 6b 65 64 20 66 72 6f 6d 20 74 68 65  nlinked from the
3c80: 20 70 53 63 68 65 6d 61 2d 3e 61 46 4b 65 79 20   pSchema->aFKey 
3c90: 68 61 73 68 20 74 61 62 6c 65 20 0a 20 20 2a 2f  hash table .  */
3ca0: 0a 20 20 66 6f 72 28 70 46 4b 65 79 3d 70 54 61  .  for(pFKey=pTa
3cb0: 62 6c 65 2d 3e 70 46 4b 65 79 3b 20 70 46 4b 65  ble->pFKey; pFKe
3cc0: 79 3b 20 70 46 4b 65 79 3d 70 4e 65 78 74 46 4b  y; pFKey=pNextFK
3cd0: 65 79 29 7b 0a 20 20 20 20 70 4e 65 78 74 46 4b  ey){.    pNextFK
3ce0: 65 79 20 3d 20 70 46 4b 65 79 2d 3e 70 4e 65 78  ey = pFKey->pNex
3cf0: 74 46 72 6f 6d 3b 0a 20 20 20 20 61 73 73 65 72  tFrom;.    asser
3d00: 74 28 20 73 71 6c 69 74 65 33 48 61 73 68 46 69  t( sqlite3HashFi
3d10: 6e 64 28 26 70 54 61 62 6c 65 2d 3e 70 53 63 68  nd(&pTable->pSch
3d20: 65 6d 61 2d 3e 61 46 4b 65 79 2c 0a 20 20 20 20  ema->aFKey,.    
3d30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3d40: 20 20 20 20 20 20 20 70 46 4b 65 79 2d 3e 7a 54         pFKey->zT
3d50: 6f 2c 20 73 74 72 6c 65 6e 28 70 46 4b 65 79 2d  o, strlen(pFKey-
3d60: 3e 7a 54 6f 29 2b 31 29 21 3d 70 46 4b 65 79 20  >zTo)+1)!=pFKey 
3d70: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
3d80: 72 65 65 28 70 46 4b 65 79 29 3b 0a 20 20 7d 0a  ree(pFKey);.  }.
3d90: 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 44 65 6c  #endif..  /* Del
3da0: 65 74 65 20 74 68 65 20 54 61 62 6c 65 20 73 74  ete the Table st
3db0: 72 75 63 74 75 72 65 20 69 74 73 65 6c 66 2e 0a  ructure itself..
3dc0: 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 52 65 73    */.  sqliteRes
3dd0: 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 54  etColumnNames(pT
3de0: 61 62 6c 65 29 3b 0a 20 20 73 71 6c 69 74 65 33  able);.  sqlite3
3df0: 5f 66 72 65 65 28 70 54 61 62 6c 65 2d 3e 7a 4e  _free(pTable->zN
3e00: 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  ame);.  sqlite3_
3e10: 66 72 65 65 28 70 54 61 62 6c 65 2d 3e 7a 43 6f  free(pTable->zCo
3e20: 6c 41 66 66 29 3b 0a 20 20 73 71 6c 69 74 65 33  lAff);.  sqlite3
3e30: 53 65 6c 65 63 74 44 65 6c 65 74 65 28 70 54 61  SelectDelete(pTa
3e40: 62 6c 65 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 23  ble->pSelect);.#
3e50: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
3e60: 49 54 5f 43 48 45 43 4b 0a 20 20 73 71 6c 69 74  IT_CHECK.  sqlit
3e70: 65 33 45 78 70 72 44 65 6c 65 74 65 28 70 54 61  e3ExprDelete(pTa
3e80: 62 6c 65 2d 3e 70 43 68 65 63 6b 29 3b 0a 23 65  ble->pCheck);.#e
3e90: 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33 56 74  ndif.  sqlite3Vt
3ea0: 61 62 43 6c 65 61 72 28 70 54 61 62 6c 65 29 3b  abClear(pTable);
3eb0: 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
3ec0: 70 54 61 62 6c 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  pTable);.}../*.*
3ed0: 2a 20 55 6e 6c 69 6e 6b 20 74 68 65 20 67 69 76  * Unlink the giv
3ee0: 65 6e 20 74 61 62 6c 65 20 66 72 6f 6d 20 74 68  en table from th
3ef0: 65 20 68 61 73 68 20 74 61 62 6c 65 73 20 61 6e  e hash tables an
3f00: 64 20 74 68 65 20 64 65 6c 65 74 65 20 74 68 65  d the delete the
3f10: 0a 2a 2a 20 74 61 62 6c 65 20 73 74 72 75 63 74  .** table struct
3f20: 75 72 65 20 77 69 74 68 20 61 6c 6c 20 69 74 73  ure with all its
3f30: 20 69 6e 64 69 63 65 73 20 61 6e 64 20 66 6f 72   indices and for
3f40: 65 69 67 6e 20 6b 65 79 73 2e 0a 2a 2f 0a 76 6f  eign keys..*/.vo
3f50: 69 64 20 73 71 6c 69 74 65 33 55 6e 6c 69 6e 6b  id sqlite3Unlink
3f60: 41 6e 64 44 65 6c 65 74 65 54 61 62 6c 65 28 73  AndDeleteTable(s
3f70: 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20  qlite3 *db, int 
3f80: 69 44 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  iDb, const char 
3f90: 2a 7a 54 61 62 4e 61 6d 65 29 7b 0a 20 20 54 61  *zTabName){.  Ta
3fa0: 62 6c 65 20 2a 70 3b 0a 20 20 46 4b 65 79 20 2a  ble *p;.  FKey *
3fb0: 70 46 31 2c 20 2a 70 46 32 3b 0a 20 20 44 62 20  pF1, *pF2;.  Db 
3fc0: 2a 70 44 62 3b 0a 0a 20 20 61 73 73 65 72 74 28  *pDb;..  assert(
3fd0: 20 64 62 21 3d 30 20 29 3b 0a 20 20 61 73 73 65   db!=0 );.  asse
3fe0: 72 74 28 20 69 44 62 3e 3d 30 20 26 26 20 69 44  rt( iDb>=0 && iD
3ff0: 62 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 61  b<db->nDb );.  a
4000: 73 73 65 72 74 28 20 7a 54 61 62 4e 61 6d 65 20  ssert( zTabName 
4010: 26 26 20 7a 54 61 62 4e 61 6d 65 5b 30 5d 20 29  && zTabName[0] )
4020: 3b 0a 20 20 70 44 62 20 3d 20 26 64 62 2d 3e 61  ;.  pDb = &db->a
4030: 44 62 5b 69 44 62 5d 3b 0a 20 20 70 20 3d 20 73  Db[iDb];.  p = s
4040: 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72 74  qlite3HashInsert
4050: 28 26 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e  (&pDb->pSchema->
4060: 74 62 6c 48 61 73 68 2c 20 7a 54 61 62 4e 61 6d  tblHash, zTabNam
4070: 65 2c 20 73 74 72 6c 65 6e 28 7a 54 61 62 4e 61  e, strlen(zTabNa
4080: 6d 65 29 2b 31 2c 30 29 3b 0a 20 20 69 66 28 20  me)+1,0);.  if( 
4090: 70 20 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c  p ){.#ifndef SQL
40a0: 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e  ITE_OMIT_FOREIGN
40b0: 5f 4b 45 59 0a 20 20 20 20 66 6f 72 28 70 46 31  _KEY.    for(pF1
40c0: 3d 70 2d 3e 70 46 4b 65 79 3b 20 70 46 31 3b 20  =p->pFKey; pF1; 
40d0: 70 46 31 3d 70 46 31 2d 3e 70 4e 65 78 74 46 72  pF1=pF1->pNextFr
40e0: 6f 6d 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e  om){.      int n
40f0: 54 6f 20 3d 20 73 74 72 6c 65 6e 28 70 46 31 2d  To = strlen(pF1-
4100: 3e 7a 54 6f 29 20 2b 20 31 3b 0a 20 20 20 20 20  >zTo) + 1;.     
4110: 20 70 46 32 20 3d 20 73 71 6c 69 74 65 33 48 61   pF2 = sqlite3Ha
4120: 73 68 46 69 6e 64 28 26 70 44 62 2d 3e 70 53 63  shFind(&pDb->pSc
4130: 68 65 6d 61 2d 3e 61 46 4b 65 79 2c 20 70 46 31  hema->aFKey, pF1
4140: 2d 3e 7a 54 6f 2c 20 6e 54 6f 29 3b 0a 20 20 20  ->zTo, nTo);.   
4150: 20 20 20 69 66 28 20 70 46 32 3d 3d 70 46 31 20     if( pF2==pF1 
4160: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
4170: 65 33 48 61 73 68 49 6e 73 65 72 74 28 26 70 44  e3HashInsert(&pD
4180: 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 61 46 4b 65  b->pSchema->aFKe
4190: 79 2c 20 70 46 31 2d 3e 7a 54 6f 2c 20 6e 54 6f  y, pF1->zTo, nTo
41a0: 2c 20 70 46 31 2d 3e 70 4e 65 78 74 54 6f 29 3b  , pF1->pNextTo);
41b0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
41c0: 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 46 32        while( pF2
41d0: 20 26 26 20 70 46 32 2d 3e 70 4e 65 78 74 54 6f   && pF2->pNextTo
41e0: 21 3d 70 46 31 20 29 7b 20 70 46 32 3d 70 46 32  !=pF1 ){ pF2=pF2
41f0: 2d 3e 70 4e 65 78 74 54 6f 3b 20 7d 0a 20 20 20  ->pNextTo; }.   
4200: 20 20 20 20 20 69 66 28 20 70 46 32 20 29 7b 0a       if( pF2 ){.
4210: 20 20 20 20 20 20 20 20 20 20 70 46 32 2d 3e 70            pF2->p
4220: 4e 65 78 74 54 6f 20 3d 20 70 46 31 2d 3e 70 4e  NextTo = pF1->pN
4230: 65 78 74 54 6f 3b 0a 20 20 20 20 20 20 20 20 7d  extTo;.        }
4240: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23  .      }.    }.#
4250: 65 6e 64 69 66 0a 20 20 20 20 73 71 6c 69 74 65  endif.    sqlite
4260: 33 44 65 6c 65 74 65 54 61 62 6c 65 28 70 29 3b  3DeleteTable(p);
4270: 0a 20 20 7d 0a 20 20 64 62 2d 3e 66 6c 61 67 73  .  }.  db->flags
4280: 20 7c 3d 20 53 51 4c 49 54 45 5f 49 6e 74 65 72   |= SQLITE_Inter
4290: 6e 43 68 61 6e 67 65 73 3b 0a 7d 0a 0a 2f 2a 0a  nChanges;.}../*.
42a0: 2a 2a 20 47 69 76 65 6e 20 61 20 74 6f 6b 65 6e  ** Given a token
42b0: 2c 20 72 65 74 75 72 6e 20 61 20 73 74 72 69 6e  , return a strin
42c0: 67 20 74 68 61 74 20 63 6f 6e 73 69 73 74 73 20  g that consists 
42d0: 6f 66 20 74 68 65 20 74 65 78 74 20 6f 66 20 74  of the text of t
42e0: 68 61 74 0a 2a 2a 20 74 6f 6b 65 6e 20 77 69 74  hat.** token wit
42f0: 68 20 61 6e 79 20 71 75 6f 74 61 74 69 6f 6e 73  h any quotations
4300: 20 72 65 6d 6f 76 65 64 2e 20 20 53 70 61 63 65   removed.  Space
4310: 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 72 65 74   to hold the ret
4320: 75 72 6e 65 64 20 73 74 72 69 6e 67 0a 2a 2a 20  urned string.** 
4330: 69 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  is obtained from
4340: 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 20   sqliteMalloc() 
4350: 61 6e 64 20 6d 75 73 74 20 62 65 20 66 72 65 65  and must be free
4360: 64 20 62 79 20 74 68 65 20 63 61 6c 6c 69 6e 67  d by the calling
4370: 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a  .** function..**
4380: 0a 2a 2a 20 54 6f 6b 65 6e 73 20 61 72 65 20 6f  .** Tokens are o
4390: 66 74 65 6e 20 6a 75 73 74 20 70 6f 69 6e 74 65  ften just pointe
43a0: 72 73 20 69 6e 74 6f 20 74 68 65 20 6f 72 69 67  rs into the orig
43b0: 69 6e 61 6c 20 53 51 4c 20 74 65 78 74 20 61 6e  inal SQL text an
43c0: 64 20 73 6f 0a 2a 2a 20 61 72 65 20 6e 6f 74 20  d so.** are not 
43d0: 5c 30 30 30 20 74 65 72 6d 69 6e 61 74 65 64 20  \000 terminated 
43e0: 61 6e 64 20 61 72 65 20 6e 6f 74 20 70 65 72 73  and are not pers
43f0: 69 73 74 65 6e 74 2e 20 20 54 68 65 20 72 65 74  istent.  The ret
4400: 75 72 6e 65 64 20 73 74 72 69 6e 67 0a 2a 2a 20  urned string.** 
4410: 69 73 20 5c 30 30 30 20 74 65 72 6d 69 6e 61 74  is \000 terminat
4420: 65 64 20 61 6e 64 20 69 73 20 70 65 72 73 69 73  ed and is persis
4430: 74 65 6e 74 2e 0a 2a 2f 0a 63 68 61 72 20 2a 73  tent..*/.char *s
4440: 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f  qlite3NameFromTo
4450: 6b 65 6e 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  ken(sqlite3 *db,
4460: 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 29 7b 0a   Token *pName){.
4470: 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20    char *zName;. 
4480: 20 69 66 28 20 70 4e 61 6d 65 20 29 7b 0a 20 20   if( pName ){.  
4490: 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65    zName = sqlite
44a0: 33 44 62 53 74 72 4e 44 75 70 28 64 62 2c 20 28  3DbStrNDup(db, (
44b0: 63 68 61 72 2a 29 70 4e 61 6d 65 2d 3e 7a 2c 20  char*)pName->z, 
44c0: 70 4e 61 6d 65 2d 3e 6e 29 3b 0a 20 20 20 20 73  pName->n);.    s
44d0: 71 6c 69 74 65 33 44 65 71 75 6f 74 65 28 7a 4e  qlite3Dequote(zN
44e0: 61 6d 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ame);.  }else{. 
44f0: 20 20 20 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20     zName = 0;.  
4500: 7d 0a 20 20 72 65 74 75 72 6e 20 7a 4e 61 6d 65  }.  return zName
4510: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20  ;.}../*.** Open 
4520: 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  the sqlite_maste
4530: 72 20 74 61 62 6c 65 20 73 74 6f 72 65 64 20 69  r table stored i
4540: 6e 20 64 61 74 61 62 61 73 65 20 6e 75 6d 62 65  n database numbe
4550: 72 20 69 44 62 20 66 6f 72 0a 2a 2a 20 77 72 69  r iDb for.** wri
4560: 74 69 6e 67 2e 20 54 68 65 20 74 61 62 6c 65 20  ting. The table 
4570: 69 73 20 6f 70 65 6e 65 64 20 75 73 69 6e 67 20  is opened using 
4580: 63 75 72 73 6f 72 20 30 2e 0a 2a 2f 0a 76 6f 69  cursor 0..*/.voi
4590: 64 20 73 71 6c 69 74 65 33 4f 70 65 6e 4d 61 73  d sqlite3OpenMas
45a0: 74 65 72 54 61 62 6c 65 28 50 61 72 73 65 20 2a  terTable(Parse *
45b0: 70 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20 20 56  p, int iDb){.  V
45c0: 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33  dbe *v = sqlite3
45d0: 47 65 74 56 64 62 65 28 70 29 3b 0a 20 20 73 71  GetVdbe(p);.  sq
45e0: 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28 70  lite3TableLock(p
45f0: 2c 20 69 44 62 2c 20 4d 41 53 54 45 52 5f 52 4f  , iDb, MASTER_RO
4600: 4f 54 2c 20 31 2c 20 53 43 48 45 4d 41 5f 54 41  OT, 1, SCHEMA_TA
4610: 42 4c 45 28 69 44 62 29 29 3b 0a 20 20 73 71 6c  BLE(iDb));.  sql
4620: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
4630: 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 69 44 62   OP_Integer, iDb
4640: 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  , 0);.  sqlite3V
4650: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f  dbeAddOp(v, OP_O
4660: 70 65 6e 57 72 69 74 65 2c 20 30 2c 20 4d 41 53  penWrite, 0, MAS
4670: 54 45 52 5f 52 4f 4f 54 29 3b 0a 20 20 73 71 6c  TER_ROOT);.  sql
4680: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
4690: 20 4f 50 5f 53 65 74 4e 75 6d 43 6f 6c 75 6d 6e   OP_SetNumColumn
46a0: 73 2c 20 30 2c 20 35 29 3b 20 2f 2a 20 73 71 6c  s, 0, 5); /* sql
46b0: 69 74 65 5f 6d 61 73 74 65 72 20 68 61 73 20 35  ite_master has 5
46c0: 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 7d 0a 0a 2f   columns */.}../
46d0: 2a 0a 2a 2a 20 54 68 65 20 74 6f 6b 65 6e 20 2a  *.** The token *
46e0: 70 4e 61 6d 65 20 63 6f 6e 74 61 69 6e 73 20 74  pName contains t
46f0: 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 64 61 74  he name of a dat
4700: 61 62 61 73 65 20 28 65 69 74 68 65 72 20 22 6d  abase (either "m
4710: 61 69 6e 22 20 6f 72 0a 2a 2a 20 22 74 65 6d 70  ain" or.** "temp
4720: 22 20 6f 72 20 74 68 65 20 6e 61 6d 65 20 6f 66  " or the name of
4730: 20 61 6e 20 61 74 74 61 63 68 65 64 20 64 62 29   an attached db)
4740: 2e 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72  . This routine r
4750: 65 74 75 72 6e 73 20 74 68 65 0a 2a 2a 20 69 6e  eturns the.** in
4760: 64 65 78 20 6f 66 20 74 68 65 20 6e 61 6d 65 64  dex of the named
4770: 20 64 61 74 61 62 61 73 65 20 69 6e 20 64 62 2d   database in db-
4780: 3e 61 44 62 5b 5d 2c 20 6f 72 20 2d 31 20 69 66  >aDb[], or -1 if
4790: 20 74 68 65 20 6e 61 6d 65 64 20 64 62 20 0a 2a   the named db .*
47a0: 2a 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74  * does not exist
47b0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
47c0: 46 69 6e 64 44 62 28 73 71 6c 69 74 65 33 20 2a  FindDb(sqlite3 *
47d0: 64 62 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65  db, Token *pName
47e0: 29 7b 0a 20 20 69 6e 74 20 69 20 3d 20 2d 31 3b  ){.  int i = -1;
47f0: 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
4800: 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 69 6e 74 20  number */.  int 
4810: 6e 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75  n;         /* Nu
4820: 6d 62 65 72 20 6f 66 20 63 68 61 72 61 63 74 65  mber of characte
4830: 72 73 20 69 6e 20 74 68 65 20 6e 61 6d 65 20 2a  rs in the name *
4840: 2f 0a 20 20 44 62 20 2a 70 44 62 3b 20 20 20 20  /.  Db *pDb;    
4850: 20 20 20 2f 2a 20 41 20 64 61 74 61 62 61 73 65     /* A database
4860: 20 77 68 6f 73 65 20 6e 61 6d 65 20 73 70 61 63   whose name spac
4870: 65 20 69 73 20 62 65 69 6e 67 20 73 65 61 72 63  e is being searc
4880: 68 65 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  hed */.  char *z
4890: 4e 61 6d 65 3b 20 20 20 2f 2a 20 4e 61 6d 65 20  Name;   /* Name 
48a0: 77 65 20 61 72 65 20 73 65 61 72 63 68 69 6e 67  we are searching
48b0: 20 66 6f 72 20 2a 2f 0a 0a 20 20 7a 4e 61 6d 65   for */..  zName
48c0: 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72   = sqlite3NameFr
48d0: 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 4e 61 6d  omToken(db, pNam
48e0: 65 29 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65 20  e);.  if( zName 
48f0: 29 7b 0a 20 20 20 20 6e 20 3d 20 73 74 72 6c 65  ){.    n = strle
4900: 6e 28 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 66 6f  n(zName);.    fo
4910: 72 28 69 3d 28 64 62 2d 3e 6e 44 62 2d 31 29 2c  r(i=(db->nDb-1),
4920: 20 70 44 62 3d 26 64 62 2d 3e 61 44 62 5b 69 5d   pDb=&db->aDb[i]
4930: 3b 20 69 3e 3d 30 3b 20 69 2d 2d 2c 20 70 44 62  ; i>=0; i--, pDb
4940: 2d 2d 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28  --){.      if( (
4950: 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20 7c 7c 20  !OMIT_TEMPDB || 
4960: 69 21 3d 31 20 29 20 26 26 20 6e 3d 3d 73 74 72  i!=1 ) && n==str
4970: 6c 65 6e 28 70 44 62 2d 3e 7a 4e 61 6d 65 29 20  len(pDb->zName) 
4980: 26 26 20 0a 20 20 20 20 20 20 20 20 20 20 30 3d  && .          0=
4990: 3d 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28  =sqlite3StrICmp(
49a0: 70 44 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d  pDb->zName, zNam
49b0: 65 29 20 29 7b 0a 20 20 20 20 20 20 20 20 62 72  e) ){.        br
49c0: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
49d0: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66   }.    sqlite3_f
49e0: 72 65 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a  ree(zName);.  }.
49f0: 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d 0a 0a 2f    return i;.}../
4a00: 2a 20 54 68 65 20 74 61 62 6c 65 20 6f 72 20 76  * The table or v
4a10: 69 65 77 20 6f 72 20 74 72 69 67 67 65 72 20 6e  iew or trigger n
4a20: 61 6d 65 20 69 73 20 70 61 73 73 65 64 20 74 6f  ame is passed to
4a30: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 76 69   this routine vi
4a40: 61 20 74 6f 6b 65 6e 73 0a 2a 2a 20 70 4e 61 6d  a tokens.** pNam
4a50: 65 31 20 61 6e 64 20 70 4e 61 6d 65 32 2e 20 49  e1 and pName2. I
4a60: 66 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65  f the table name
4a70: 20 77 61 73 20 66 75 6c 6c 79 20 71 75 61 6c 69   was fully quali
4a80: 66 69 65 64 2c 20 66 6f 72 20 65 78 61 6d 70 6c  fied, for exampl
4a90: 65 3a 0a 2a 2a 0a 2a 2a 20 43 52 45 41 54 45 20  e:.**.** CREATE 
4aa0: 54 41 42 4c 45 20 78 78 78 2e 79 79 79 20 28 2e  TABLE xxx.yyy (.
4ab0: 2e 2e 29 3b 0a 2a 2a 20 0a 2a 2a 20 54 68 65 6e  ..);.** .** Then
4ac0: 20 70 4e 61 6d 65 31 20 69 73 20 73 65 74 20 74   pName1 is set t
4ad0: 6f 20 22 78 78 78 22 20 61 6e 64 20 70 4e 61 6d  o "xxx" and pNam
4ae0: 65 32 20 22 79 79 79 22 2e 20 4f 6e 20 74 68 65  e2 "yyy". On the
4af0: 20 6f 74 68 65 72 20 68 61 6e 64 20 69 66 0a 2a   other hand if.*
4b00: 2a 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65  * the table name
4b10: 20 69 73 20 6e 6f 74 20 66 75 6c 6c 79 20 71 75   is not fully qu
4b20: 61 6c 69 66 69 65 64 2c 20 69 2e 65 2e 3a 0a 2a  alified, i.e.:.*
4b30: 2a 0a 2a 2a 20 43 52 45 41 54 45 20 54 41 42 4c  *.** CREATE TABL
4b40: 45 20 79 79 79 28 2e 2e 2e 29 3b 0a 2a 2a 0a 2a  E yyy(...);.**.*
4b50: 2a 20 54 68 65 6e 20 70 4e 61 6d 65 31 20 69 73  * Then pName1 is
4b60: 20 73 65 74 20 74 6f 20 22 79 79 79 22 20 61 6e   set to "yyy" an
4b70: 64 20 70 4e 61 6d 65 32 20 69 73 20 22 22 2e 0a  d pName2 is ""..
4b80: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
4b90: 6e 65 20 73 65 74 73 20 74 68 65 20 2a 70 70 55  ne sets the *ppU
4ba0: 6e 71 75 61 6c 20 70 6f 69 6e 74 65 72 20 74 6f  nqual pointer to
4bb0: 20 70 6f 69 6e 74 20 61 74 20 74 68 65 20 74 6f   point at the to
4bc0: 6b 65 6e 20 28 70 4e 61 6d 65 31 20 6f 72 0a 2a  ken (pName1 or.*
4bd0: 2a 20 70 4e 61 6d 65 32 29 20 74 68 61 74 20 73  * pName2) that s
4be0: 74 6f 72 65 73 20 74 68 65 20 75 6e 71 75 61 6c  tores the unqual
4bf0: 69 66 69 65 64 20 74 61 62 6c 65 20 6e 61 6d 65  ified table name
4c00: 2e 20 20 54 68 65 20 69 6e 64 65 78 20 6f 66 20  .  The index of 
4c10: 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  the.** database 
4c20: 22 78 78 78 22 20 69 73 20 72 65 74 75 72 6e 65  "xxx" is returne
4c30: 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
4c40: 33 54 77 6f 50 61 72 74 4e 61 6d 65 28 0a 20 20  3TwoPartName(.  
4c50: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
4c60: 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 61      /* Parsing a
4c70: 6e 64 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69  nd code generati
4c80: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
4c90: 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c 20 20  Token *pName1,  
4ca0: 20 20 20 20 2f 2a 20 54 68 65 20 22 78 78 78 22      /* The "xxx"
4cb0: 20 69 6e 20 74 68 65 20 6e 61 6d 65 20 22 78 78   in the name "xx
4cc0: 78 2e 79 79 79 22 20 6f 72 20 22 78 78 78 22 20  x.yyy" or "xxx" 
4cd0: 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d  */.  Token *pNam
4ce0: 65 32 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20  e2,      /* The 
4cf0: 22 79 79 79 22 20 69 6e 20 74 68 65 20 6e 61 6d  "yyy" in the nam
4d00: 65 20 22 78 78 78 2e 79 79 79 22 20 2a 2f 0a 20  e "xxx.yyy" */. 
4d10: 20 54 6f 6b 65 6e 20 2a 2a 70 55 6e 71 75 61 6c   Token **pUnqual
4d20: 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68       /* Write th
4d30: 65 20 75 6e 71 75 61 6c 69 66 69 65 64 20 6f 62  e unqualified ob
4d40: 6a 65 63 74 20 6e 61 6d 65 20 68 65 72 65 20 2a  ject name here *
4d50: 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 44 62 3b 20  /.){.  int iDb; 
4d60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4d70: 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 68     /* Database h
4d80: 6f 6c 64 69 6e 67 20 74 68 65 20 6f 62 6a 65 63  olding the objec
4d90: 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a  t */.  sqlite3 *
4da0: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
4db0: 0a 0a 20 20 69 66 28 20 70 4e 61 6d 65 32 20 26  ..  if( pName2 &
4dc0: 26 20 70 4e 61 6d 65 32 2d 3e 6e 3e 30 20 29 7b  & pName2->n>0 ){
4dd0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 64 62  .    assert( !db
4de0: 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 3b 0a 20  ->init.busy );. 
4df0: 20 20 20 2a 70 55 6e 71 75 61 6c 20 3d 20 70 4e     *pUnqual = pN
4e00: 61 6d 65 32 3b 0a 20 20 20 20 69 44 62 20 3d 20  ame2;.    iDb = 
4e10: 73 71 6c 69 74 65 33 46 69 6e 64 44 62 28 64 62  sqlite3FindDb(db
4e20: 2c 20 70 4e 61 6d 65 31 29 3b 0a 20 20 20 20 69  , pName1);.    i
4e30: 66 28 20 69 44 62 3c 30 20 29 7b 0a 20 20 20 20  f( iDb<0 ){.    
4e40: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
4e50: 67 28 70 50 61 72 73 65 2c 20 22 75 6e 6b 6e 6f  g(pParse, "unkno
4e60: 77 6e 20 64 61 74 61 62 61 73 65 20 25 54 22 2c  wn database %T",
4e70: 20 70 4e 61 6d 65 31 29 3b 0a 20 20 20 20 20 20   pName1);.      
4e80: 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a  pParse->nErr++;.
4e90: 20 20 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b        return -1;
4ea0: 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
4eb0: 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e      assert( db->
4ec0: 69 6e 69 74 2e 69 44 62 3d 3d 30 20 7c 7c 20 64  init.iDb==0 || d
4ed0: 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 3b 0a  b->init.busy );.
4ee0: 20 20 20 20 69 44 62 20 3d 20 64 62 2d 3e 69 6e      iDb = db->in
4ef0: 69 74 2e 69 44 62 3b 0a 20 20 20 20 2a 70 55 6e  it.iDb;.    *pUn
4f00: 71 75 61 6c 20 3d 20 70 4e 61 6d 65 31 3b 0a 20  qual = pName1;. 
4f10: 20 7d 0a 20 20 72 65 74 75 72 6e 20 69 44 62 3b   }.  return iDb;
4f20: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
4f30: 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 74  outine is used t
4f40: 6f 20 63 68 65 63 6b 20 69 66 20 74 68 65 20 55  o check if the U
4f50: 54 46 2d 38 20 73 74 72 69 6e 67 20 7a 4e 61 6d  TF-8 string zNam
4f60: 65 20 69 73 20 61 20 6c 65 67 61 6c 0a 2a 2a 20  e is a legal.** 
4f70: 75 6e 71 75 61 6c 69 66 69 65 64 20 6e 61 6d 65  unqualified name
4f80: 20 66 6f 72 20 61 20 6e 65 77 20 73 63 68 65 6d   for a new schem
4f90: 61 20 6f 62 6a 65 63 74 20 28 74 61 62 6c 65 2c  a object (table,
4fa0: 20 69 6e 64 65 78 2c 20 76 69 65 77 20 6f 72 0a   index, view or.
4fb0: 2a 2a 20 74 72 69 67 67 65 72 29 2e 20 41 6c 6c  ** trigger). All
4fc0: 20 6e 61 6d 65 73 20 61 72 65 20 6c 65 67 61 6c   names are legal
4fd0: 20 65 78 63 65 70 74 20 74 68 6f 73 65 20 74 68   except those th
4fe0: 61 74 20 62 65 67 69 6e 20 77 69 74 68 20 74 68  at begin with th
4ff0: 65 20 73 74 72 69 6e 67 0a 2a 2a 20 22 73 71 6c  e string.** "sql
5000: 69 74 65 5f 22 20 28 69 6e 20 75 70 70 65 72 2c  ite_" (in upper,
5010: 20 6c 6f 77 65 72 20 6f 72 20 6d 69 78 65 64 20   lower or mixed 
5020: 63 61 73 65 29 2e 20 54 68 69 73 20 70 6f 72 74  case). This port
5030: 69 6f 6e 20 6f 66 20 74 68 65 20 6e 61 6d 65 73  ion of the names
5040: 70 61 63 65 0a 2a 2a 20 69 73 20 72 65 73 65 72  pace.** is reser
5050: 76 65 64 20 66 6f 72 20 69 6e 74 65 72 6e 61 6c  ved for internal
5060: 20 75 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c   use..*/.int sql
5070: 69 74 65 33 43 68 65 63 6b 4f 62 6a 65 63 74 4e  ite3CheckObjectN
5080: 61 6d 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  ame(Parse *pPars
5090: 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  e, const char *z
50a0: 4e 61 6d 65 29 7b 0a 20 20 69 66 28 20 21 70 50  Name){.  if( !pP
50b0: 61 72 73 65 2d 3e 64 62 2d 3e 69 6e 69 74 2e 62  arse->db->init.b
50c0: 75 73 79 20 26 26 20 70 50 61 72 73 65 2d 3e 6e  usy && pParse->n
50d0: 65 73 74 65 64 3d 3d 30 20 0a 20 20 20 20 20 20  ested==0 .      
50e0: 20 20 20 20 26 26 20 28 70 50 61 72 73 65 2d 3e      && (pParse->
50f0: 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  db->flags & SQLI
5100: 54 45 5f 57 72 69 74 65 53 63 68 65 6d 61 29 3d  TE_WriteSchema)=
5110: 3d 30 0a 20 20 20 20 20 20 20 20 20 20 26 26 20  =0.          && 
5120: 30 3d 3d 73 71 6c 69 74 65 33 53 74 72 4e 49 43  0==sqlite3StrNIC
5130: 6d 70 28 7a 4e 61 6d 65 2c 20 22 73 71 6c 69 74  mp(zName, "sqlit
5140: 65 5f 22 2c 20 37 29 20 29 7b 0a 20 20 20 20 73  e_", 7) ){.    s
5150: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
5160: 50 61 72 73 65 2c 20 22 6f 62 6a 65 63 74 20 6e  Parse, "object n
5170: 61 6d 65 20 72 65 73 65 72 76 65 64 20 66 6f 72  ame reserved for
5180: 20 69 6e 74 65 72 6e 61 6c 20 75 73 65 3a 20 25   internal use: %
5190: 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  s", zName);.    
51a0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
51b0: 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ROR;.  }.  retur
51c0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
51d0: 2f 2a 0a 2a 2a 20 42 65 67 69 6e 20 63 6f 6e 73  /*.** Begin cons
51e0: 74 72 75 63 74 69 6e 67 20 61 20 6e 65 77 20 74  tructing a new t
51f0: 61 62 6c 65 20 72 65 70 72 65 73 65 6e 74 61 74  able representat
5200: 69 6f 6e 20 69 6e 20 6d 65 6d 6f 72 79 2e 20 20  ion in memory.  
5210: 54 68 69 73 20 69 73 0a 2a 2a 20 74 68 65 20 66  This is.** the f
5220: 69 72 73 74 20 6f 66 20 73 65 76 65 72 61 6c 20  irst of several 
5230: 61 63 74 69 6f 6e 20 72 6f 75 74 69 6e 65 73 20  action routines 
5240: 74 68 61 74 20 67 65 74 20 63 61 6c 6c 65 64 20  that get called 
5250: 69 6e 20 72 65 73 70 6f 6e 73 65 0a 2a 2a 20 74  in response.** t
5260: 6f 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45  o a CREATE TABLE
5270: 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 49 6e 20   statement.  In 
5280: 70 61 72 74 69 63 75 6c 61 72 2c 20 74 68 69 73  particular, this
5290: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
52a0: 65 64 0a 2a 2a 20 61 66 74 65 72 20 73 65 65 69  ed.** after seei
52b0: 6e 67 20 74 6f 6b 65 6e 73 20 22 43 52 45 41 54  ng tokens "CREAT
52c0: 45 22 20 61 6e 64 20 22 54 41 42 4c 45 22 20 61  E" and "TABLE" a
52d0: 6e 64 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d  nd the table nam
52e0: 65 2e 20 54 68 65 20 69 73 54 65 6d 70 0a 2a 2a  e. The isTemp.**
52f0: 20 66 6c 61 67 20 69 73 20 74 72 75 65 20 69 66   flag is true if
5300: 20 74 68 65 20 74 61 62 6c 65 20 73 68 6f 75 6c   the table shoul
5310: 64 20 62 65 20 73 74 6f 72 65 64 20 69 6e 20 74  d be stored in t
5320: 68 65 20 61 75 78 69 6c 69 61 72 79 20 64 61 74  he auxiliary dat
5330: 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65 20 69 6e  abase.** file in
5340: 73 74 65 61 64 20 6f 66 20 69 6e 20 74 68 65 20  stead of in the 
5350: 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 66 69  main database fi
5360: 6c 65 2e 20 20 54 68 69 73 20 69 73 20 6e 6f 72  le.  This is nor
5370: 6d 61 6c 6c 79 20 74 68 65 20 63 61 73 65 0a 2a  mally the case.*
5380: 2a 20 77 68 65 6e 20 74 68 65 20 22 54 45 4d 50  * when the "TEMP
5390: 22 20 6f 72 20 22 54 45 4d 50 4f 52 41 52 59 22  " or "TEMPORARY"
53a0: 20 6b 65 79 77 6f 72 64 20 6f 63 63 75 72 73 20   keyword occurs 
53b0: 69 6e 20 62 65 74 77 65 65 6e 0a 2a 2a 20 43 52  in between.** CR
53c0: 45 41 54 45 20 61 6e 64 20 54 41 42 4c 45 2e 0a  EATE and TABLE..
53d0: 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65 77 20 74 61  **.** The new ta
53e0: 62 6c 65 20 72 65 63 6f 72 64 20 69 73 20 69 6e  ble record is in
53f0: 69 74 69 61 6c 69 7a 65 64 20 61 6e 64 20 70 75  itialized and pu
5400: 74 20 69 6e 20 70 50 61 72 73 65 2d 3e 70 4e 65  t in pParse->pNe
5410: 77 54 61 62 6c 65 2e 0a 2a 2a 20 41 73 20 6d 6f  wTable..** As mo
5420: 72 65 20 6f 66 20 74 68 65 20 43 52 45 41 54 45  re of the CREATE
5430: 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74   TABLE statement
5440: 20 69 73 20 70 61 72 73 65 64 2c 20 61 64 64 69   is parsed, addi
5450: 74 69 6f 6e 61 6c 20 61 63 74 69 6f 6e 0a 2a 2a  tional action.**
5460: 20 72 6f 75 74 69 6e 65 73 20 77 69 6c 6c 20 62   routines will b
5470: 65 20 63 61 6c 6c 65 64 20 74 6f 20 61 64 64 20  e called to add 
5480: 6d 6f 72 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  more information
5490: 20 74 6f 20 74 68 69 73 20 72 65 63 6f 72 64 2e   to this record.
54a0: 0a 2a 2a 20 41 74 20 74 68 65 20 65 6e 64 20 6f  .** At the end o
54b0: 66 20 74 68 65 20 43 52 45 41 54 45 20 54 41 42  f the CREATE TAB
54c0: 4c 45 20 73 74 61 74 65 6d 65 6e 74 2c 20 74 68  LE statement, th
54d0: 65 20 73 71 6c 69 74 65 33 45 6e 64 54 61 62 6c  e sqlite3EndTabl
54e0: 65 28 29 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69  e() routine.** i
54f0: 73 20 63 61 6c 6c 65 64 20 74 6f 20 63 6f 6d 70  s called to comp
5500: 6c 65 74 65 20 74 68 65 20 63 6f 6e 73 74 72 75  lete the constru
5510: 63 74 69 6f 6e 20 6f 66 20 74 68 65 20 6e 65 77  ction of the new
5520: 20 74 61 62 6c 65 20 72 65 63 6f 72 64 2e 0a 2a   table record..*
5530: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53 74  /.void sqlite3St
5540: 61 72 74 54 61 62 6c 65 28 0a 20 20 50 61 72 73  artTable(.  Pars
5550: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 2f 2a 20  e *pParse,   /* 
5560: 50 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a  Parser context *
5570: 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65  /.  Token *pName
5580: 31 2c 20 20 20 2f 2a 20 46 69 72 73 74 20 70 61  1,   /* First pa
5590: 72 74 20 6f 66 20 74 68 65 20 6e 61 6d 65 20 6f  rt of the name o
55a0: 66 20 74 68 65 20 74 61 62 6c 65 20 6f 72 20 76  f the table or v
55b0: 69 65 77 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  iew */.  Token *
55c0: 70 4e 61 6d 65 32 2c 20 20 20 2f 2a 20 53 65 63  pName2,   /* Sec
55d0: 6f 6e 64 20 70 61 72 74 20 6f 66 20 74 68 65 20  ond part of the 
55e0: 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c  name of the tabl
55f0: 65 20 6f 72 20 76 69 65 77 20 2a 2f 0a 20 20 69  e or view */.  i
5600: 6e 74 20 69 73 54 65 6d 70 2c 20 20 20 20 20 20  nt isTemp,      
5610: 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69 73 20  /* True if this 
5620: 69 73 20 61 20 54 45 4d 50 20 74 61 62 6c 65 20  is a TEMP table 
5630: 2a 2f 0a 20 20 69 6e 74 20 69 73 56 69 65 77 2c  */.  int isView,
5640: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
5650: 20 74 68 69 73 20 69 73 20 61 20 56 49 45 57 20   this is a VIEW 
5660: 2a 2f 0a 20 20 69 6e 74 20 69 73 56 69 72 74 75  */.  int isVirtu
5670: 61 6c 2c 20 20 20 2f 2a 20 54 72 75 65 20 69 66  al,   /* True if
5680: 20 74 68 69 73 20 69 73 20 61 20 56 49 52 54 55   this is a VIRTU
5690: 41 4c 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e  AL table */.  in
56a0: 74 20 6e 6f 45 72 72 20 20 20 20 20 20 20 20 2f  t noErr        /
56b0: 2a 20 44 6f 20 6e 6f 74 68 69 6e 67 20 69 66 20  * Do nothing if 
56c0: 74 61 62 6c 65 20 61 6c 72 65 61 64 79 20 65 78  table already ex
56d0: 69 73 74 73 20 2a 2f 0a 29 7b 0a 20 20 54 61 62  ists */.){.  Tab
56e0: 6c 65 20 2a 70 54 61 62 6c 65 3b 0a 20 20 63 68  le *pTable;.  ch
56f0: 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b 20 2f  ar *zName = 0; /
5700: 2a 20 54 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  * The name of th
5710: 65 20 6e 65 77 20 74 61 62 6c 65 20 2a 2f 0a 20  e new table */. 
5720: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
5730: 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 56 64 62  Parse->db;.  Vdb
5740: 65 20 2a 76 3b 0a 20 20 69 6e 74 20 69 44 62 3b  e *v;.  int iDb;
5750: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
5760: 62 61 73 65 20 6e 75 6d 62 65 72 20 74 6f 20 63  base number to c
5770: 72 65 61 74 65 20 74 68 65 20 74 61 62 6c 65 20  reate the table 
5780: 69 6e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  in */.  Token *p
5790: 4e 61 6d 65 3b 20 20 20 20 2f 2a 20 55 6e 71 75  Name;    /* Unqu
57a0: 61 6c 69 66 69 65 64 20 6e 61 6d 65 20 6f 66 20  alified name of 
57b0: 74 68 65 20 74 61 62 6c 65 20 74 6f 20 63 72 65  the table to cre
57c0: 61 74 65 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 65  ate */..  /* The
57d0: 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77 20 6e   table or view n
57e0: 61 6d 65 20 74 6f 20 63 72 65 61 74 65 20 69 73  ame to create is
57f0: 20 70 61 73 73 65 64 20 74 6f 20 74 68 69 73 20   passed to this 
5800: 72 6f 75 74 69 6e 65 20 76 69 61 20 74 6f 6b 65  routine via toke
5810: 6e 73 0a 20 20 2a 2a 20 70 4e 61 6d 65 31 20 61  ns.  ** pName1 a
5820: 6e 64 20 70 4e 61 6d 65 32 2e 20 49 66 20 74 68  nd pName2. If th
5830: 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 77 61 73  e table name was
5840: 20 66 75 6c 6c 79 20 71 75 61 6c 69 66 69 65 64   fully qualified
5850: 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 20  , for example:. 
5860: 20 2a 2a 0a 20 20 2a 2a 20 43 52 45 41 54 45 20   **.  ** CREATE 
5870: 54 41 42 4c 45 20 78 78 78 2e 79 79 79 20 28 2e  TABLE xxx.yyy (.
5880: 2e 2e 29 3b 0a 20 20 2a 2a 20 0a 20 20 2a 2a 20  ..);.  ** .  ** 
5890: 54 68 65 6e 20 70 4e 61 6d 65 31 20 69 73 20 73  Then pName1 is s
58a0: 65 74 20 74 6f 20 22 78 78 78 22 20 61 6e 64 20  et to "xxx" and 
58b0: 70 4e 61 6d 65 32 20 22 79 79 79 22 2e 20 4f 6e  pName2 "yyy". On
58c0: 20 74 68 65 20 6f 74 68 65 72 20 68 61 6e 64 20   the other hand 
58d0: 69 66 0a 20 20 2a 2a 20 74 68 65 20 74 61 62 6c  if.  ** the tabl
58e0: 65 20 6e 61 6d 65 20 69 73 20 6e 6f 74 20 66 75  e name is not fu
58f0: 6c 6c 79 20 71 75 61 6c 69 66 69 65 64 2c 20 69  lly qualified, i
5900: 2e 65 2e 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43  .e.:.  **.  ** C
5910: 52 45 41 54 45 20 54 41 42 4c 45 20 79 79 79 28  REATE TABLE yyy(
5920: 2e 2e 2e 29 3b 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ...);.  **.  ** 
5930: 54 68 65 6e 20 70 4e 61 6d 65 31 20 69 73 20 73  Then pName1 is s
5940: 65 74 20 74 6f 20 22 79 79 79 22 20 61 6e 64 20  et to "yyy" and 
5950: 70 4e 61 6d 65 32 20 69 73 20 22 22 2e 0a 20 20  pName2 is ""..  
5960: 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 63 61 6c 6c  **.  ** The call
5970: 20 62 65 6c 6f 77 20 73 65 74 73 20 74 68 65 20   below sets the 
5980: 70 4e 61 6d 65 20 70 6f 69 6e 74 65 72 20 74 6f  pName pointer to
5990: 20 70 6f 69 6e 74 20 61 74 20 74 68 65 20 74 6f   point at the to
59a0: 6b 65 6e 20 28 70 4e 61 6d 65 31 20 6f 72 0a 20  ken (pName1 or. 
59b0: 20 2a 2a 20 70 4e 61 6d 65 32 29 20 74 68 61 74   ** pName2) that
59c0: 20 73 74 6f 72 65 73 20 74 68 65 20 75 6e 71 75   stores the unqu
59d0: 61 6c 69 66 69 65 64 20 74 61 62 6c 65 20 6e 61  alified table na
59e0: 6d 65 2e 20 54 68 65 20 76 61 72 69 61 62 6c 65  me. The variable
59f0: 20 69 44 62 20 69 73 0a 20 20 2a 2a 20 73 65 74   iDb is.  ** set
5a00: 20 74 6f 20 74 68 65 20 69 6e 64 65 78 20 6f 66   to the index of
5a10: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74 68   the database th
5a20: 61 74 20 74 68 65 20 74 61 62 6c 65 20 6f 72 20  at the table or 
5a30: 76 69 65 77 20 69 73 20 74 6f 20 62 65 0a 20 20  view is to be.  
5a40: 2a 2a 20 63 72 65 61 74 65 64 20 69 6e 2e 0a 20  ** created in.. 
5a50: 20 2a 2f 0a 20 20 69 44 62 20 3d 20 73 71 6c 69   */.  iDb = sqli
5a60: 74 65 33 54 77 6f 50 61 72 74 4e 61 6d 65 28 70  te3TwoPartName(p
5a70: 50 61 72 73 65 2c 20 70 4e 61 6d 65 31 2c 20 70  Parse, pName1, p
5a80: 4e 61 6d 65 32 2c 20 26 70 4e 61 6d 65 29 3b 0a  Name2, &pName);.
5a90: 20 20 69 66 28 20 69 44 62 3c 30 20 29 20 72 65    if( iDb<0 ) re
5aa0: 74 75 72 6e 3b 0a 20 20 69 66 28 20 21 4f 4d 49  turn;.  if( !OMI
5ab0: 54 5f 54 45 4d 50 44 42 20 26 26 20 69 73 54 65  T_TEMPDB && isTe
5ac0: 6d 70 20 26 26 20 69 44 62 3e 31 20 29 7b 0a 20  mp && iDb>1 ){. 
5ad0: 20 20 20 2f 2a 20 49 66 20 63 72 65 61 74 69 6e     /* If creatin
5ae0: 67 20 61 20 74 65 6d 70 20 74 61 62 6c 65 2c 20  g a temp table, 
5af0: 74 68 65 20 6e 61 6d 65 20 6d 61 79 20 6e 6f 74  the name may not
5b00: 20 62 65 20 71 75 61 6c 69 66 69 65 64 20 2a 2f   be qualified */
5b10: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
5b20: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 65  rMsg(pParse, "te
5b30: 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 6e 61  mporary table na
5b40: 6d 65 20 6d 75 73 74 20 62 65 20 75 6e 71 75 61  me must be unqua
5b50: 6c 69 66 69 65 64 22 29 3b 0a 20 20 20 20 72 65  lified");.    re
5b60: 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20  turn;.  }.  if( 
5b70: 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26 26 20  !OMIT_TEMPDB && 
5b80: 69 73 54 65 6d 70 20 29 20 69 44 62 20 3d 20 31  isTemp ) iDb = 1
5b90: 3b 0a 0a 20 20 70 50 61 72 73 65 2d 3e 73 4e 61  ;..  pParse->sNa
5ba0: 6d 65 54 6f 6b 65 6e 20 3d 20 2a 70 4e 61 6d 65  meToken = *pName
5bb0: 3b 0a 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69  ;.  zName = sqli
5bc0: 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e  te3NameFromToken
5bd0: 28 64 62 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 69  (db, pName);.  i
5be0: 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 20 72 65  f( zName==0 ) re
5bf0: 74 75 72 6e 3b 0a 20 20 69 66 28 20 53 51 4c 49  turn;.  if( SQLI
5c00: 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 43 68  TE_OK!=sqlite3Ch
5c10: 65 63 6b 4f 62 6a 65 63 74 4e 61 6d 65 28 70 50  eckObjectName(pP
5c20: 61 72 73 65 2c 20 7a 4e 61 6d 65 29 20 29 7b 0a  arse, zName) ){.
5c30: 20 20 20 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74      goto begin_t
5c40: 61 62 6c 65 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a  able_error;.  }.
5c50: 20 20 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 69    if( db->init.i
5c60: 44 62 3d 3d 31 20 29 20 69 73 54 65 6d 70 20 3d  Db==1 ) isTemp =
5c70: 20 31 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   1;.#ifndef SQLI
5c80: 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a  TE_OMIT_AUTHORIZ
5c90: 41 54 49 4f 4e 0a 20 20 61 73 73 65 72 74 28 20  ATION.  assert( 
5ca0: 28 69 73 54 65 6d 70 20 26 20 31 29 3d 3d 69 73  (isTemp & 1)==is
5cb0: 54 65 6d 70 20 29 3b 0a 20 20 7b 0a 20 20 20 20  Temp );.  {.    
5cc0: 69 6e 74 20 63 6f 64 65 3b 0a 20 20 20 20 63 68  int code;.    ch
5cd0: 61 72 20 2a 7a 44 62 20 3d 20 64 62 2d 3e 61 44  ar *zDb = db->aD
5ce0: 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20  b[iDb].zName;.  
5cf0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74    if( sqlite3Aut
5d00: 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53  hCheck(pParse, S
5d10: 51 4c 49 54 45 5f 49 4e 53 45 52 54 2c 20 53 43  QLITE_INSERT, SC
5d20: 48 45 4d 41 5f 54 41 42 4c 45 28 69 73 54 65 6d  HEMA_TABLE(isTem
5d30: 70 29 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20  p), 0, zDb) ){. 
5d40: 20 20 20 20 20 67 6f 74 6f 20 62 65 67 69 6e 5f       goto begin_
5d50: 74 61 62 6c 65 5f 65 72 72 6f 72 3b 0a 20 20 20  table_error;.   
5d60: 20 7d 0a 20 20 20 20 69 66 28 20 69 73 56 69 65   }.    if( isVie
5d70: 77 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 21  w ){.      if( !
5d80: 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26 26 20 69  OMIT_TEMPDB && i
5d90: 73 54 65 6d 70 20 29 7b 0a 20 20 20 20 20 20 20  sTemp ){.       
5da0: 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 43   code = SQLITE_C
5db0: 52 45 41 54 45 5f 54 45 4d 50 5f 56 49 45 57 3b  REATE_TEMP_VIEW;
5dc0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
5dd0: 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c        code = SQL
5de0: 49 54 45 5f 43 52 45 41 54 45 5f 56 49 45 57 3b  ITE_CREATE_VIEW;
5df0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
5e00: 73 65 7b 0a 20 20 20 20 20 20 69 66 28 20 21 4f  se{.      if( !O
5e10: 4d 49 54 5f 54 45 4d 50 44 42 20 26 26 20 69 73  MIT_TEMPDB && is
5e20: 54 65 6d 70 20 29 7b 0a 20 20 20 20 20 20 20 20  Temp ){.        
5e30: 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 43 52  code = SQLITE_CR
5e40: 45 41 54 45 5f 54 45 4d 50 5f 54 41 42 4c 45 3b  EATE_TEMP_TABLE;
5e50: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
5e60: 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c        code = SQL
5e70: 49 54 45 5f 43 52 45 41 54 45 5f 54 41 42 4c 45  ITE_CREATE_TABLE
5e80: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
5e90: 20 20 20 20 69 66 28 20 21 69 73 56 69 72 74 75      if( !isVirtu
5ea0: 61 6c 20 26 26 20 73 71 6c 69 74 65 33 41 75 74  al && sqlite3Aut
5eb0: 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 63  hCheck(pParse, c
5ec0: 6f 64 65 2c 20 7a 4e 61 6d 65 2c 20 30 2c 20 7a  ode, zName, 0, z
5ed0: 44 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  Db) ){.      got
5ee0: 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72  o begin_table_er
5ef0: 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  ror;.    }.  }.#
5f00: 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 4d 61 6b 65  endif..  /* Make
5f10: 20 73 75 72 65 20 74 68 65 20 6e 65 77 20 74 61   sure the new ta
5f20: 62 6c 65 20 6e 61 6d 65 20 64 6f 65 73 20 6e 6f  ble name does no
5f30: 74 20 63 6f 6c 6c 69 64 65 20 77 69 74 68 20 61  t collide with a
5f40: 6e 20 65 78 69 73 74 69 6e 67 0a 20 20 2a 2a 20  n existing.  ** 
5f50: 69 6e 64 65 78 20 6f 72 20 74 61 62 6c 65 20 6e  index or table n
5f60: 61 6d 65 20 69 6e 20 74 68 65 20 73 61 6d 65 20  ame in the same 
5f70: 64 61 74 61 62 61 73 65 2e 20 20 49 73 73 75 65  database.  Issue
5f80: 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67   an error messag
5f90: 65 20 69 66 0a 20 20 2a 2a 20 69 74 20 64 6f 65  e if.  ** it doe
5fa0: 73 2e 20 54 68 65 20 65 78 63 65 70 74 69 6f 6e  s. The exception
5fb0: 20 69 73 20 69 66 20 74 68 65 20 73 74 61 74 65   is if the state
5fc0: 6d 65 6e 74 20 62 65 69 6e 67 20 70 61 72 73 65  ment being parse
5fd0: 64 20 77 61 73 20 70 61 73 73 65 64 0a 20 20 2a  d was passed.  *
5fe0: 2a 20 74 6f 20 61 6e 20 73 71 6c 69 74 65 33 5f  * to an sqlite3_
5ff0: 64 65 63 6c 61 72 65 5f 76 74 61 62 28 29 20 63  declare_vtab() c
6000: 61 6c 6c 2e 20 49 6e 20 74 68 61 74 20 63 61 73  all. In that cas
6010: 65 20 6f 6e 6c 79 20 74 68 65 20 63 6f 6c 75 6d  e only the colum
6020: 6e 20 6e 61 6d 65 73 0a 20 20 2a 2a 20 61 6e 64  n names.  ** and
6030: 20 74 79 70 65 73 20 77 69 6c 6c 20 62 65 20 75   types will be u
6040: 73 65 64 2c 20 73 6f 20 74 68 65 72 65 20 69 73  sed, so there is
6050: 20 6e 6f 20 6e 65 65 64 20 74 6f 20 74 65 73 74   no need to test
6060: 20 66 6f 72 20 6e 61 6d 65 73 70 61 63 65 0a 20   for namespace. 
6070: 20 2a 2a 20 63 6f 6c 6c 69 73 69 6f 6e 73 2e 0a   ** collisions..
6080: 20 20 2a 2f 0a 20 20 69 66 28 20 21 49 4e 5f 44    */.  if( !IN_D
6090: 45 43 4c 41 52 45 5f 56 54 41 42 20 29 7b 0a 20  ECLARE_VTAB ){. 
60a0: 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b     if( SQLITE_OK
60b0: 21 3d 73 71 6c 69 74 65 33 52 65 61 64 53 63 68  !=sqlite3ReadSch
60c0: 65 6d 61 28 70 50 61 72 73 65 29 20 29 7b 0a 20  ema(pParse) ){. 
60d0: 20 20 20 20 20 67 6f 74 6f 20 62 65 67 69 6e 5f       goto begin_
60e0: 74 61 62 6c 65 5f 65 72 72 6f 72 3b 0a 20 20 20  table_error;.   
60f0: 20 7d 0a 20 20 20 20 70 54 61 62 6c 65 20 3d 20   }.    pTable = 
6100: 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65  sqlite3FindTable
6110: 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 64 62 2d 3e  (db, zName, db->
6120: 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 29 3b  aDb[iDb].zName);
6130: 0a 20 20 20 20 69 66 28 20 70 54 61 62 6c 65 20  .    if( pTable 
6140: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 21 6e 6f  ){.      if( !no
6150: 45 72 72 20 29 7b 0a 20 20 20 20 20 20 20 20 73  Err ){.        s
6160: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
6170: 50 61 72 73 65 2c 20 22 74 61 62 6c 65 20 25 54  Parse, "table %T
6180: 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 22   already exists"
6190: 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  , pName);.      
61a0: 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20 62 65 67  }.      goto beg
61b0: 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b 0a  in_table_error;.
61c0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 71      }.    if( sq
61d0: 6c 69 74 65 33 46 69 6e 64 49 6e 64 65 78 28 64  lite3FindIndex(d
61e0: 62 2c 20 7a 4e 61 6d 65 2c 20 30 29 21 3d 30 20  b, zName, 0)!=0 
61f0: 26 26 20 28 69 44 62 3d 3d 30 20 7c 7c 20 21 64  && (iDb==0 || !d
6200: 62 2d 3e 69 6e 69 74 2e 62 75 73 79 29 20 29 7b  b->init.busy) ){
6210: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
6220: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
6230: 74 68 65 72 65 20 69 73 20 61 6c 72 65 61 64 79  there is already
6240: 20 61 6e 20 69 6e 64 65 78 20 6e 61 6d 65 64 20   an index named 
6250: 25 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20  %s", zName);.   
6260: 20 20 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61     goto begin_ta
6270: 62 6c 65 5f 65 72 72 6f 72 3b 0a 20 20 20 20 7d  ble_error;.    }
6280: 0a 20 20 7d 0a 0a 20 20 70 54 61 62 6c 65 20 3d  .  }..  pTable =
6290: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
62a0: 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28  Zero(db, sizeof(
62b0: 54 61 62 6c 65 29 29 3b 0a 20 20 69 66 28 20 70  Table));.  if( p
62c0: 54 61 62 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20  Table==0 ){.    
62d0: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
62e0: 20 3d 20 31 3b 0a 20 20 20 20 70 50 61 72 73 65   = 1;.    pParse
62f0: 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f  ->rc = SQLITE_NO
6300: 4d 45 4d 3b 0a 20 20 20 20 70 50 61 72 73 65 2d  MEM;.    pParse-
6310: 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 67 6f 74  >nErr++;.    got
6320: 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72  o begin_table_er
6330: 72 6f 72 3b 0a 20 20 7d 0a 20 20 70 54 61 62 6c  ror;.  }.  pTabl
6340: 65 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65  e->zName = zName
6350: 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 69 50 4b 65  ;.  pTable->iPKe
6360: 79 20 3d 20 2d 31 3b 0a 20 20 70 54 61 62 6c 65  y = -1;.  pTable
6370: 2d 3e 70 53 63 68 65 6d 61 20 3d 20 64 62 2d 3e  ->pSchema = db->
6380: 61 44 62 5b 69 44 62 5d 2e 70 53 63 68 65 6d 61  aDb[iDb].pSchema
6390: 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 6e 52 65 66  ;.  pTable->nRef
63a0: 20 3d 20 31 3b 0a 20 20 69 66 28 20 70 50 61 72   = 1;.  if( pPar
63b0: 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 29 20  se->pNewTable ) 
63c0: 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62  sqlite3DeleteTab
63d0: 6c 65 28 70 50 61 72 73 65 2d 3e 70 4e 65 77 54  le(pParse->pNewT
63e0: 61 62 6c 65 29 3b 0a 20 20 70 50 61 72 73 65 2d  able);.  pParse-
63f0: 3e 70 4e 65 77 54 61 62 6c 65 20 3d 20 70 54 61  >pNewTable = pTa
6400: 62 6c 65 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  ble;..  /* If th
6410: 69 73 20 69 73 20 74 68 65 20 6d 61 67 69 63 20  is is the magic 
6420: 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 20  sqlite_sequence 
6430: 74 61 62 6c 65 20 75 73 65 64 20 62 79 20 61 75  table used by au
6440: 74 6f 69 6e 63 72 65 6d 65 6e 74 2c 0a 20 20 2a  toincrement,.  *
6450: 2a 20 74 68 65 6e 20 72 65 63 6f 72 64 20 61 20  * then record a 
6460: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 69 73 20  pointer to this 
6470: 74 61 62 6c 65 20 69 6e 20 74 68 65 20 6d 61 69  table in the mai
6480: 6e 20 64 61 74 61 62 61 73 65 20 73 74 72 75 63  n database struc
6490: 74 75 72 65 0a 20 20 2a 2a 20 73 6f 20 74 68 61  ture.  ** so tha
64a0: 74 20 49 4e 53 45 52 54 20 63 61 6e 20 66 69 6e  t INSERT can fin
64b0: 64 20 74 68 65 20 74 61 62 6c 65 20 65 61 73 69  d the table easi
64c0: 6c 79 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66  ly..  */.#ifndef
64d0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
64e0: 4f 49 4e 43 52 45 4d 45 4e 54 0a 20 20 69 66 28  OINCREMENT.  if(
64f0: 20 21 70 50 61 72 73 65 2d 3e 6e 65 73 74 65 64   !pParse->nested
6500: 20 26 26 20 73 74 72 63 6d 70 28 7a 4e 61 6d 65   && strcmp(zName
6510: 2c 20 22 73 71 6c 69 74 65 5f 73 65 71 75 65 6e  , "sqlite_sequen
6520: 63 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70  ce")==0 ){.    p
6530: 54 61 62 6c 65 2d 3e 70 53 63 68 65 6d 61 2d 3e  Table->pSchema->
6540: 70 53 65 71 54 61 62 20 3d 20 70 54 61 62 6c 65  pSeqTab = pTable
6550: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
6560: 2f 2a 20 42 65 67 69 6e 20 67 65 6e 65 72 61 74  /* Begin generat
6570: 69 6e 67 20 74 68 65 20 63 6f 64 65 20 74 68 61  ing the code tha
6580: 74 20 77 69 6c 6c 20 69 6e 73 65 72 74 20 74 68  t will insert th
6590: 65 20 74 61 62 6c 65 20 72 65 63 6f 72 64 20 69  e table record i
65a0: 6e 74 6f 0a 20 20 2a 2a 20 74 68 65 20 53 51 4c  nto.  ** the SQL
65b0: 49 54 45 5f 4d 41 53 54 45 52 20 74 61 62 6c 65  ITE_MASTER table
65c0: 2e 20 20 4e 6f 74 65 20 69 6e 20 70 61 72 74 69  .  Note in parti
65d0: 63 75 6c 61 72 20 74 68 61 74 20 77 65 20 6d 75  cular that we mu
65e0: 73 74 20 67 6f 20 61 68 65 61 64 0a 20 20 2a 2a  st go ahead.  **
65f0: 20 61 6e 64 20 61 6c 6c 6f 63 61 74 65 20 74 68   and allocate th
6600: 65 20 72 65 63 6f 72 64 20 6e 75 6d 62 65 72 20  e record number 
6610: 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20 65 6e  for the table en
6620: 74 72 79 20 6e 6f 77 2e 20 20 42 65 66 6f 72 65  try now.  Before
6630: 20 61 6e 79 0a 20 20 2a 2a 20 50 52 49 4d 41 52   any.  ** PRIMAR
6640: 59 20 4b 45 59 20 6f 72 20 55 4e 49 51 55 45 20  Y KEY or UNIQUE 
6650: 6b 65 79 77 6f 72 64 73 20 61 72 65 20 70 61 72  keywords are par
6660: 73 65 64 2e 20 20 54 68 6f 73 65 20 6b 65 79 77  sed.  Those keyw
6670: 6f 72 64 73 20 77 69 6c 6c 20 63 61 75 73 65 0a  ords will cause.
6680: 20 20 2a 2a 20 69 6e 64 69 63 65 73 20 74 6f 20    ** indices to 
6690: 62 65 20 63 72 65 61 74 65 64 20 61 6e 64 20 74  be created and t
66a0: 68 65 20 74 61 62 6c 65 20 72 65 63 6f 72 64 20  he table record 
66b0: 6d 75 73 74 20 63 6f 6d 65 20 62 65 66 6f 72 65  must come before
66c0: 20 74 68 65 20 0a 20 20 2a 2a 20 69 6e 64 69 63   the .  ** indic
66d0: 65 73 2e 20 20 48 65 6e 63 65 2c 20 74 68 65 20  es.  Hence, the 
66e0: 72 65 63 6f 72 64 20 6e 75 6d 62 65 72 20 66 6f  record number fo
66f0: 72 20 74 68 65 20 74 61 62 6c 65 20 6d 75 73 74  r the table must
6700: 20 62 65 20 61 6c 6c 6f 63 61 74 65 64 0a 20 20   be allocated.  
6710: 2a 2a 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 69  ** now..  */.  i
6720: 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73  f( !db->init.bus
6730: 79 20 26 26 20 28 76 20 3d 20 73 71 6c 69 74 65  y && (v = sqlite
6740: 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
6750: 29 21 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20  )!=0 ){.    int 
6760: 6c 62 6c 3b 0a 20 20 20 20 69 6e 74 20 66 69 6c  lbl;.    int fil
6770: 65 46 6f 72 6d 61 74 3b 0a 20 20 20 20 73 71 6c  eFormat;.    sql
6780: 69 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70  ite3BeginWriteOp
6790: 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20  eration(pParse, 
67a0: 30 2c 20 69 44 62 29 3b 0a 0a 23 69 66 6e 64 65  0, iDb);..#ifnde
67b0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
67c0: 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 69  RTUALTABLE.    i
67d0: 66 28 20 69 73 56 69 72 74 75 61 6c 20 29 7b 0a  f( isVirtual ){.
67e0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
67f0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 56 42 65  eAddOp(v, OP_VBe
6800: 67 69 6e 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  gin, 0, 0);.    
6810: 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a  }.#endif..    /*
6820: 20 49 66 20 74 68 65 20 66 69 6c 65 20 66 6f 72   If the file for
6830: 6d 61 74 20 61 6e 64 20 65 6e 63 6f 64 69 6e 67  mat and encoding
6840: 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
6850: 20 68 61 76 65 20 6e 6f 74 20 62 65 65 6e 20 73   have not been s
6860: 65 74 2c 20 0a 20 20 20 20 2a 2a 20 73 65 74 20  et, .    ** set 
6870: 74 68 65 6d 20 6e 6f 77 2e 0a 20 20 20 20 2a 2f  them now..    */
6880: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
6890: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52 65 61 64  AddOp(v, OP_Read
68a0: 43 6f 6f 6b 69 65 2c 20 69 44 62 2c 20 31 29 3b  Cookie, iDb, 1);
68b0: 20 20 20 2f 2a 20 66 69 6c 65 5f 66 6f 72 6d 61     /* file_forma
68c0: 74 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33  t */.    sqlite3
68d0: 56 64 62 65 55 73 65 73 42 74 72 65 65 28 76 2c  VdbeUsesBtree(v,
68e0: 20 69 44 62 29 3b 0a 20 20 20 20 6c 62 6c 20 3d   iDb);.    lbl =
68f0: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
6900: 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 73 71  Label(v);.    sq
6910: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
6920: 2c 20 4f 50 5f 49 66 2c 20 30 2c 20 6c 62 6c 29  , OP_If, 0, lbl)
6930: 3b 0a 20 20 20 20 66 69 6c 65 46 6f 72 6d 61 74  ;.    fileFormat
6940: 20 3d 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20   = (db->flags & 
6950: 53 51 4c 49 54 45 5f 4c 65 67 61 63 79 46 69 6c  SQLITE_LegacyFil
6960: 65 46 6d 74 29 21 3d 30 20 3f 0a 20 20 20 20 20  eFmt)!=0 ?.     
6970: 20 20 20 20 20 20 20 20 20 20 20 20 20 31 20 3a               1 :
6980: 20 53 51 4c 49 54 45 5f 4d 41 58 5f 46 49 4c 45   SQLITE_MAX_FILE
6990: 5f 46 4f 52 4d 41 54 3b 0a 20 20 20 20 73 71 6c  _FORMAT;.    sql
69a0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
69b0: 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 66 69 6c   OP_Integer, fil
69c0: 65 46 6f 72 6d 61 74 2c 20 30 29 3b 0a 20 20 20  eFormat, 0);.   
69d0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
69e0: 70 28 76 2c 20 4f 50 5f 53 65 74 43 6f 6f 6b 69  p(v, OP_SetCooki
69f0: 65 2c 20 69 44 62 2c 20 31 29 3b 0a 20 20 20 20  e, iDb, 1);.    
6a00: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
6a10: 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
6a20: 45 4e 43 28 64 62 29 2c 20 30 29 3b 0a 20 20 20  ENC(db), 0);.   
6a30: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
6a40: 70 28 76 2c 20 4f 50 5f 53 65 74 43 6f 6f 6b 69  p(v, OP_SetCooki
6a50: 65 2c 20 69 44 62 2c 20 34 29 3b 0a 20 20 20 20  e, iDb, 4);.    
6a60: 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
6a70: 76 65 4c 61 62 65 6c 28 76 2c 20 6c 62 6c 29 3b  veLabel(v, lbl);
6a80: 0a 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 6a 75  ..    /* This ju
6a90: 73 74 20 63 72 65 61 74 65 73 20 61 20 70 6c 61  st creates a pla
6aa0: 63 65 2d 68 6f 6c 64 65 72 20 72 65 63 6f 72 64  ce-holder record
6ab0: 20 69 6e 20 74 68 65 20 73 71 6c 69 74 65 5f 6d   in the sqlite_m
6ac0: 61 73 74 65 72 20 74 61 62 6c 65 2e 0a 20 20 20  aster table..   
6ad0: 20 2a 2a 20 54 68 65 20 72 65 63 6f 72 64 20 63   ** The record c
6ae0: 72 65 61 74 65 64 20 64 6f 65 73 20 6e 6f 74 20  reated does not 
6af0: 63 6f 6e 74 61 69 6e 20 61 6e 79 74 68 69 6e 67  contain anything
6b00: 20 79 65 74 2e 20 20 49 74 20 77 69 6c 6c 20 62   yet.  It will b
6b10: 65 20 72 65 70 6c 61 63 65 64 0a 20 20 20 20 2a  e replaced.    *
6b20: 2a 20 62 79 20 74 68 65 20 72 65 61 6c 20 65 6e  * by the real en
6b30: 74 72 79 20 69 6e 20 63 6f 64 65 20 67 65 6e 65  try in code gene
6b40: 72 61 74 65 64 20 61 74 20 73 71 6c 69 74 65 33  rated at sqlite3
6b50: 45 6e 64 54 61 62 6c 65 28 29 2e 0a 20 20 20 20  EndTable()..    
6b60: 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 72 6f  **.    ** The ro
6b70: 77 69 64 20 66 6f 72 20 74 68 65 20 6e 65 77 20  wid for the new 
6b80: 65 6e 74 72 79 20 69 73 20 6c 65 66 74 20 6f 6e  entry is left on
6b90: 20 74 68 65 20 74 6f 70 20 6f 66 20 74 68 65 20   the top of the 
6ba0: 73 74 61 63 6b 2e 0a 20 20 20 20 2a 2a 20 54 68  stack..    ** Th
6bb0: 65 20 72 6f 77 69 64 20 76 61 6c 75 65 20 69 73  e rowid value is
6bc0: 20 6e 65 65 64 65 64 20 62 79 20 74 68 65 20 63   needed by the c
6bd0: 6f 64 65 20 74 68 61 74 20 73 71 6c 69 74 65 33  ode that sqlite3
6be0: 45 6e 64 54 61 62 6c 65 20 77 69 6c 6c 0a 20 20  EndTable will.  
6bf0: 20 20 2a 2a 20 67 65 6e 65 72 61 74 65 2e 0a 20    ** generate.. 
6c00: 20 20 20 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e     */.#if !defin
6c10: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ed(SQLITE_OMIT_V
6c20: 49 45 57 29 20 7c 7c 20 21 64 65 66 69 6e 65 64  IEW) || !defined
6c30: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52  (SQLITE_OMIT_VIR
6c40: 54 55 41 4c 54 41 42 4c 45 29 0a 20 20 20 20 69  TUALTABLE).    i
6c50: 66 28 20 69 73 56 69 65 77 20 7c 7c 20 69 73 56  f( isView || isV
6c60: 69 72 74 75 61 6c 20 29 7b 0a 20 20 20 20 20 20  irtual ){.      
6c70: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
6c80: 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
6c90: 30 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65  0, 0);.    }else
6ca0: 0a 23 65 6e 64 69 66 0a 20 20 20 20 7b 0a 20 20  .#endif.    {.  
6cb0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
6cc0: 64 64 4f 70 28 76 2c 20 4f 50 5f 43 72 65 61 74  ddOp(v, OP_Creat
6cd0: 65 54 61 62 6c 65 2c 20 69 44 62 2c 20 30 29 3b  eTable, iDb, 0);
6ce0: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
6cf0: 65 33 4f 70 65 6e 4d 61 73 74 65 72 54 61 62 6c  e3OpenMasterTabl
6d00: 65 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a  e(pParse, iDb);.
6d10: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
6d20: 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 65 77 52 6f  ddOp(v, OP_NewRo
6d30: 77 69 64 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  wid, 0, 0);.    
6d40: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
6d50: 28 76 2c 20 4f 50 5f 44 75 70 2c 20 30 2c 20 30  (v, OP_Dup, 0, 0
6d60: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
6d70: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 75  beAddOp(v, OP_Nu
6d80: 6c 6c 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73  ll, 0, 0);.    s
6d90: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
6da0: 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20 30 2c  v, OP_Insert, 0,
6db0: 20 4f 50 46 4c 41 47 5f 41 50 50 45 4e 44 29 3b   OPFLAG_APPEND);
6dc0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
6dd0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73  AddOp(v, OP_Clos
6de0: 65 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71  e, 0, 0);.    sq
6df0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
6e00: 2c 20 4f 50 5f 50 75 6c 6c 2c 20 31 2c 20 30 29  , OP_Pull, 1, 0)
6e10: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 72 6d  ;.  }..  /* Norm
6e20: 61 6c 20 28 6e 6f 6e 2d 65 72 72 6f 72 29 20 72  al (non-error) r
6e30: 65 74 75 72 6e 2e 20 2a 2f 0a 20 20 72 65 74 75  eturn. */.  retu
6e40: 72 6e 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 20  rn;..  /* If an 
6e50: 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 77 65  error occurs, we
6e60: 20 6a 75 6d 70 20 68 65 72 65 20 2a 2f 0a 62 65   jump here */.be
6e70: 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3a  gin_table_error:
6e80: 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
6e90: 7a 4e 61 6d 65 29 3b 0a 20 20 72 65 74 75 72 6e  zName);.  return
6ea0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
6eb0: 6d 61 63 72 6f 20 69 73 20 75 73 65 64 20 74 6f  macro is used to
6ec0: 20 63 6f 6d 70 61 72 65 20 74 77 6f 20 73 74 72   compare two str
6ed0: 69 6e 67 73 20 69 6e 20 61 20 63 61 73 65 2d 69  ings in a case-i
6ee0: 6e 73 65 6e 73 69 74 69 76 65 20 6d 61 6e 6e 65  nsensitive manne
6ef0: 72 2e 0a 2a 2a 20 49 74 20 69 73 20 73 6c 69 67  r..** It is slig
6f00: 68 74 6c 79 20 66 61 73 74 65 72 20 74 68 61 6e  htly faster than
6f10: 20 63 61 6c 6c 69 6e 67 20 73 71 6c 69 74 65 33   calling sqlite3
6f20: 53 74 72 49 43 6d 70 28 29 20 64 69 72 65 63 74  StrICmp() direct
6f30: 6c 79 2c 20 62 75 74 0a 2a 2a 20 70 72 6f 64 75  ly, but.** produ
6f40: 63 65 73 20 6c 61 72 67 65 72 20 63 6f 64 65 2e  ces larger code.
6f50: 0a 2a 2a 0a 2a 2a 20 57 41 52 4e 49 4e 47 3a 20  .**.** WARNING: 
6f60: 54 68 69 73 20 6d 61 63 72 6f 20 69 73 20 6e 6f  This macro is no
6f70: 74 20 63 6f 6d 70 61 74 69 62 6c 65 20 77 69 74  t compatible wit
6f80: 68 20 74 68 65 20 73 74 72 63 6d 70 28 29 20 66  h the strcmp() f
6f90: 61 6d 69 6c 79 2e 20 49 74 0a 2a 2a 20 72 65 74  amily. It.** ret
6fa0: 75 72 6e 73 20 74 72 75 65 20 69 66 20 74 68 65  urns true if the
6fb0: 20 74 77 6f 20 73 74 72 69 6e 67 73 20 61 72 65   two strings are
6fc0: 20 65 71 75 61 6c 2c 20 6f 74 68 65 72 77 69 73   equal, otherwis
6fd0: 65 20 66 61 6c 73 65 2e 0a 2a 2f 0a 23 64 65 66  e false..*/.#def
6fe0: 69 6e 65 20 53 54 52 49 43 4d 50 28 78 2c 20 79  ine STRICMP(x, y
6ff0: 29 20 28 5c 0a 73 71 6c 69 74 65 33 55 70 70 65  ) (\.sqlite3Uppe
7000: 72 54 6f 4c 6f 77 65 72 5b 2a 28 75 6e 73 69 67  rToLower[*(unsig
7010: 6e 65 64 20 63 68 61 72 20 2a 29 28 78 29 5d 3d  ned char *)(x)]=
7020: 3d 20 20 20 5c 0a 73 71 6c 69 74 65 33 55 70 70  =   \.sqlite3Upp
7030: 65 72 54 6f 4c 6f 77 65 72 5b 2a 28 75 6e 73 69  erToLower[*(unsi
7040: 67 6e 65 64 20 63 68 61 72 20 2a 29 28 79 29 5d  gned char *)(y)]
7050: 20 20 20 20 20 5c 0a 26 26 20 73 71 6c 69 74 65       \.&& sqlite
7060: 33 53 74 72 49 43 6d 70 28 28 78 29 2b 31 2c 28  3StrICmp((x)+1,(
7070: 79 29 2b 31 29 3d 3d 30 20 29 0a 0a 2f 2a 0a 2a  y)+1)==0 )../*.*
7080: 2a 20 41 64 64 20 61 20 6e 65 77 20 63 6f 6c 75  * Add a new colu
7090: 6d 6e 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20  mn to the table 
70a0: 63 75 72 72 65 6e 74 6c 79 20 62 65 69 6e 67 20  currently being 
70b0: 63 6f 6e 73 74 72 75 63 74 65 64 2e 0a 2a 2a 0a  constructed..**.
70c0: 2a 2a 20 54 68 65 20 70 61 72 73 65 72 20 63 61  ** The parser ca
70d0: 6c 6c 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65  lls this routine
70e0: 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20 63   once for each c
70f0: 6f 6c 75 6d 6e 20 64 65 63 6c 61 72 61 74 69 6f  olumn declaratio
7100: 6e 0a 2a 2a 20 69 6e 20 61 20 43 52 45 41 54 45  n.** in a CREATE
7110: 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74   TABLE statement
7120: 2e 20 20 73 71 6c 69 74 65 33 53 74 61 72 74 54  .  sqlite3StartT
7130: 61 62 6c 65 28 29 20 67 65 74 73 20 63 61 6c 6c  able() gets call
7140: 65 64 0a 2a 2a 20 66 69 72 73 74 20 74 6f 20 67  ed.** first to g
7150: 65 74 20 74 68 69 6e 67 73 20 67 6f 69 6e 67 2e  et things going.
7160: 20 20 54 68 65 6e 20 74 68 69 73 20 72 6f 75 74    Then this rout
7170: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 66 6f  ine is called fo
7180: 72 20 65 61 63 68 0a 2a 2a 20 63 6f 6c 75 6d 6e  r each.** column
7190: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
71a0: 33 41 64 64 43 6f 6c 75 6d 6e 28 50 61 72 73 65  3AddColumn(Parse
71b0: 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20   *pParse, Token 
71c0: 2a 70 4e 61 6d 65 29 7b 0a 20 20 54 61 62 6c 65  *pName){.  Table
71d0: 20 2a 70 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20   *p;.  int i;.  
71e0: 63 68 61 72 20 2a 7a 3b 0a 20 20 43 6f 6c 75 6d  char *z;.  Colum
71f0: 6e 20 2a 70 43 6f 6c 3b 0a 20 20 69 66 28 20 28  n *pCol;.  if( (
7200: 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  p = pParse->pNew
7210: 54 61 62 6c 65 29 3d 3d 30 20 29 20 72 65 74 75  Table)==0 ) retu
7220: 72 6e 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 43 6f  rn;.  if( p->nCo
7230: 6c 2b 31 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 43  l+1>SQLITE_MAX_C
7240: 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 73 71 6c  OLUMN ){.    sql
7250: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
7260: 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79 20 63  rse, "too many c
7270: 6f 6c 75 6d 6e 73 20 6f 6e 20 25 73 22 2c 20 70  olumns on %s", p
7280: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72 65  ->zName);.    re
7290: 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 7a 20 3d 20  turn;.  }.  z = 
72a0: 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54  sqlite3NameFromT
72b0: 6f 6b 65 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c  oken(pParse->db,
72c0: 20 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a   pName);.  if( z
72d0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
72e0: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43  for(i=0; i<p->nC
72f0: 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  ol; i++){.    if
7300: 28 20 53 54 52 49 43 4d 50 28 7a 2c 20 70 2d 3e  ( STRICMP(z, p->
7310: 61 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 20 29  aCol[i].zName) )
7320: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
7330: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
7340: 22 64 75 70 6c 69 63 61 74 65 20 63 6f 6c 75 6d  "duplicate colum
7350: 6e 20 6e 61 6d 65 3a 20 25 73 22 2c 20 7a 29 3b  n name: %s", z);
7360: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
7370: 72 65 65 28 7a 29 3b 0a 20 20 20 20 20 20 72 65  ree(z);.      re
7380: 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  turn;.    }.  }.
7390: 20 20 69 66 28 20 28 70 2d 3e 6e 43 6f 6c 20 26    if( (p->nCol &
73a0: 20 30 78 37 29 3d 3d 30 20 29 7b 0a 20 20 20 20   0x7)==0 ){.    
73b0: 43 6f 6c 75 6d 6e 20 2a 61 4e 65 77 3b 0a 20 20  Column *aNew;.  
73c0: 20 20 61 4e 65 77 20 3d 20 73 71 6c 69 74 65 33    aNew = sqlite3
73d0: 44 62 52 65 61 6c 6c 6f 63 28 70 50 61 72 73 65  DbRealloc(pParse
73e0: 2d 3e 64 62 2c 70 2d 3e 61 43 6f 6c 2c 28 70 2d  ->db,p->aCol,(p-
73f0: 3e 6e 43 6f 6c 2b 38 29 2a 73 69 7a 65 6f 66 28  >nCol+8)*sizeof(
7400: 70 2d 3e 61 43 6f 6c 5b 30 5d 29 29 3b 0a 20 20  p->aCol[0]));.  
7410: 20 20 69 66 28 20 61 4e 65 77 3d 3d 30 20 29 7b    if( aNew==0 ){
7420: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
7430: 72 65 65 28 7a 29 3b 0a 20 20 20 20 20 20 72 65  ree(z);.      re
7440: 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20  turn;.    }.    
7450: 70 2d 3e 61 43 6f 6c 20 3d 20 61 4e 65 77 3b 0a  p->aCol = aNew;.
7460: 20 20 7d 0a 20 20 70 43 6f 6c 20 3d 20 26 70 2d    }.  pCol = &p-
7470: 3e 61 43 6f 6c 5b 70 2d 3e 6e 43 6f 6c 5d 3b 0a  >aCol[p->nCol];.
7480: 20 20 6d 65 6d 73 65 74 28 70 43 6f 6c 2c 20 30    memset(pCol, 0
7490: 2c 20 73 69 7a 65 6f 66 28 70 2d 3e 61 43 6f 6c  , sizeof(p->aCol
74a0: 5b 30 5d 29 29 3b 0a 20 20 70 43 6f 6c 2d 3e 7a  [0]));.  pCol->z
74b0: 4e 61 6d 65 20 3d 20 7a 3b 0a 20 0a 20 20 2f 2a  Name = z;. .  /*
74c0: 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20   If there is no 
74d0: 74 79 70 65 20 73 70 65 63 69 66 69 65 64 2c 20  type specified, 
74e0: 63 6f 6c 75 6d 6e 73 20 68 61 76 65 20 74 68 65  columns have the
74f0: 20 64 65 66 61 75 6c 74 20 61 66 66 69 6e 69 74   default affinit
7500: 79 0a 20 20 2a 2a 20 27 4e 4f 4e 45 27 2e 20 49  y.  ** 'NONE'. I
7510: 66 20 74 68 65 72 65 20 69 73 20 61 20 74 79 70  f there is a typ
7520: 65 20 73 70 65 63 69 66 69 65 64 2c 20 74 68 65  e specified, the
7530: 6e 20 73 71 6c 69 74 65 33 41 64 64 43 6f 6c 75  n sqlite3AddColu
7540: 6d 6e 54 79 70 65 28 29 20 77 69 6c 6c 0a 20 20  mnType() will.  
7550: 2a 2a 20 62 65 20 63 61 6c 6c 65 64 20 6e 65 78  ** be called nex
7560: 74 20 74 6f 20 73 65 74 20 70 43 6f 6c 2d 3e 61  t to set pCol->a
7570: 66 66 69 6e 69 74 79 20 63 6f 72 72 65 63 74 6c  ffinity correctl
7580: 79 2e 0a 20 20 2a 2f 0a 20 20 70 43 6f 6c 2d 3e  y..  */.  pCol->
7590: 61 66 66 69 6e 69 74 79 20 3d 20 53 51 4c 49 54  affinity = SQLIT
75a0: 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 70 2d  E_AFF_NONE;.  p-
75b0: 3e 6e 43 6f 6c 2b 2b 3b 0a 7d 0a 0a 2f 2a 0a 2a  >nCol++;.}../*.*
75c0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
75d0: 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20  s called by the 
75e0: 70 61 72 73 65 72 20 77 68 69 6c 65 20 69 6e 20  parser while in 
75f0: 74 68 65 20 6d 69 64 64 6c 65 20 6f 66 0a 2a 2a  the middle of.**
7600: 20 70 61 72 73 69 6e 67 20 61 20 43 52 45 41 54   parsing a CREAT
7610: 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e  E TABLE statemen
7620: 74 2e 20 20 41 20 22 4e 4f 54 20 4e 55 4c 4c 22  t.  A "NOT NULL"
7630: 20 63 6f 6e 73 74 72 61 69 6e 74 20 68 61 73 0a   constraint has.
7640: 2a 2a 20 62 65 65 6e 20 73 65 65 6e 20 6f 6e 20  ** been seen on 
7650: 61 20 63 6f 6c 75 6d 6e 2e 20 20 54 68 69 73 20  a column.  This 
7660: 72 6f 75 74 69 6e 65 20 73 65 74 73 20 74 68 65  routine sets the
7670: 20 6e 6f 74 4e 75 6c 6c 20 66 6c 61 67 20 6f 6e   notNull flag on
7680: 0a 2a 2a 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63  .** the column c
7690: 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63  urrently under c
76a0: 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a  onstruction..*/.
76b0: 76 6f 69 64 20 73 71 6c 69 74 65 33 41 64 64 4e  void sqlite3AddN
76c0: 6f 74 4e 75 6c 6c 28 50 61 72 73 65 20 2a 70 50  otNull(Parse *pP
76d0: 61 72 73 65 2c 20 69 6e 74 20 6f 6e 45 72 72 6f  arse, int onErro
76e0: 72 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a  r){.  Table *p;.
76f0: 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 28    int i;.  if( (
7700: 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  p = pParse->pNew
7710: 54 61 62 6c 65 29 3d 3d 30 20 29 20 72 65 74 75  Table)==0 ) retu
7720: 72 6e 3b 0a 20 20 69 20 3d 20 70 2d 3e 6e 43 6f  rn;.  i = p->nCo
7730: 6c 2d 31 3b 0a 20 20 69 66 28 20 69 3e 3d 30 20  l-1;.  if( i>=0 
7740: 29 20 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 6e 6f 74  ) p->aCol[i].not
7750: 4e 75 6c 6c 20 3d 20 6f 6e 45 72 72 6f 72 3b 0a  Null = onError;.
7760: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 63 61 6e 20 74 68  }../*.** Scan th
7770: 65 20 63 6f 6c 75 6d 6e 20 74 79 70 65 20 6e 61  e column type na
7780: 6d 65 20 7a 54 79 70 65 20 28 6c 65 6e 67 74 68  me zType (length
7790: 20 6e 54 79 70 65 29 20 61 6e 64 20 72 65 74 75   nType) and retu
77a0: 72 6e 20 74 68 65 0a 2a 2a 20 61 73 73 6f 63 69  rn the.** associ
77b0: 61 74 65 64 20 61 66 66 69 6e 69 74 79 20 74 79  ated affinity ty
77c0: 70 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  pe..**.** This r
77d0: 6f 75 74 69 6e 65 20 64 6f 65 73 20 61 20 63 61  outine does a ca
77e0: 73 65 2d 69 6e 64 65 70 65 6e 64 65 6e 74 20 73  se-independent s
77f0: 65 61 72 63 68 20 6f 66 20 7a 54 79 70 65 20 66  earch of zType f
7800: 6f 72 20 74 68 65 20 0a 2a 2a 20 73 75 62 73 74  or the .** subst
7810: 72 69 6e 67 73 20 69 6e 20 74 68 65 20 66 6f 6c  rings in the fol
7820: 6c 6f 77 69 6e 67 20 74 61 62 6c 65 2e 20 49 66  lowing table. If
7830: 20 6f 6e 65 20 6f 66 20 74 68 65 20 73 75 62 73   one of the subs
7840: 74 72 69 6e 67 73 20 69 73 0a 2a 2a 20 66 6f 75  trings is.** fou
7850: 6e 64 2c 20 74 68 65 20 63 6f 72 72 65 73 70 6f  nd, the correspo
7860: 6e 64 69 6e 67 20 61 66 66 69 6e 69 74 79 20 69  nding affinity i
7870: 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 7a  s returned. If z
7880: 54 79 70 65 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a  Type contains.**
7890: 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 6f   more than one o
78a0: 66 20 74 68 65 20 73 75 62 73 74 72 69 6e 67 73  f the substrings
78b0: 2c 20 65 6e 74 72 69 65 73 20 74 6f 77 61 72 64  , entries toward
78c0: 20 74 68 65 20 74 6f 70 20 6f 66 20 0a 2a 2a 20   the top of .** 
78d0: 74 68 65 20 74 61 62 6c 65 20 74 61 6b 65 20 70  the table take p
78e0: 72 69 6f 72 69 74 79 2e 20 46 6f 72 20 65 78 61  riority. For exa
78f0: 6d 70 6c 65 2c 20 69 66 20 7a 54 79 70 65 20 69  mple, if zType i
7900: 73 20 27 42 4c 4f 42 49 4e 54 27 2c 20 0a 2a 2a  s 'BLOBINT', .**
7910: 20 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45   SQLITE_AFF_INTE
7920: 47 45 52 20 69 73 20 72 65 74 75 72 6e 65 64 2e  GER is returned.
7930: 0a 2a 2a 0a 2a 2a 20 53 75 62 73 74 72 69 6e 67  .**.** Substring
7940: 20 20 20 20 20 7c 20 41 66 66 69 6e 69 74 79 0a       | Affinity.
7950: 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ** -------------
7960: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7970: 2d 2d 2d 0a 2a 2a 20 27 49 4e 54 27 20 20 20 20  ---.** 'INT'    
7980: 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 41 46       | SQLITE_AF
7990: 46 5f 49 4e 54 45 47 45 52 0a 2a 2a 20 27 43 48  F_INTEGER.** 'CH
79a0: 41 52 27 20 20 20 20 20 20 20 20 7c 20 53 51 4c  AR'        | SQL
79b0: 49 54 45 5f 41 46 46 5f 54 45 58 54 0a 2a 2a 20  ITE_AFF_TEXT.** 
79c0: 27 43 4c 4f 42 27 20 20 20 20 20 20 20 20 7c 20  'CLOB'        | 
79d0: 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 0a  SQLITE_AFF_TEXT.
79e0: 2a 2a 20 27 54 45 58 54 27 20 20 20 20 20 20 20  ** 'TEXT'       
79f0: 20 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45   | SQLITE_AFF_TE
7a00: 58 54 0a 2a 2a 20 27 42 4c 4f 42 27 20 20 20 20  XT.** 'BLOB'    
7a10: 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 41 46 46      | SQLITE_AFF
7a20: 5f 4e 4f 4e 45 0a 2a 2a 20 27 52 45 41 4c 27 20  _NONE.** 'REAL' 
7a30: 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f         | SQLITE_
7a40: 41 46 46 5f 52 45 41 4c 0a 2a 2a 20 27 46 4c 4f  AFF_REAL.** 'FLO
7a50: 41 27 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49  A'        | SQLI
7a60: 54 45 5f 41 46 46 5f 52 45 41 4c 0a 2a 2a 20 27  TE_AFF_REAL.** '
7a70: 44 4f 55 42 27 20 20 20 20 20 20 20 20 7c 20 53  DOUB'        | S
7a80: 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 0a 2a  QLITE_AFF_REAL.*
7a90: 2a 0a 2a 2a 20 49 66 20 6e 6f 6e 65 20 6f 66 20  *.** If none of 
7aa0: 74 68 65 20 73 75 62 73 74 72 69 6e 67 73 20 69  the substrings i
7ab0: 6e 20 74 68 65 20 61 62 6f 76 65 20 74 61 62 6c  n the above tabl
7ac0: 65 20 61 72 65 20 66 6f 75 6e 64 2c 0a 2a 2a 20  e are found,.** 
7ad0: 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52  SQLITE_AFF_NUMER
7ae0: 49 43 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  IC is returned..
7af0: 2a 2f 0a 63 68 61 72 20 73 71 6c 69 74 65 33 41  */.char sqlite3A
7b00: 66 66 69 6e 69 74 79 54 79 70 65 28 63 6f 6e 73  ffinityType(cons
7b10: 74 20 54 6f 6b 65 6e 20 2a 70 54 79 70 65 29 7b  t Token *pType){
7b20: 0a 20 20 75 33 32 20 68 20 3d 20 30 3b 0a 20 20  .  u32 h = 0;.  
7b30: 63 68 61 72 20 61 66 66 20 3d 20 53 51 4c 49 54  char aff = SQLIT
7b40: 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 3b 0a 20  E_AFF_NUMERIC;. 
7b50: 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20   const unsigned 
7b60: 63 68 61 72 20 2a 7a 49 6e 20 3d 20 70 54 79 70  char *zIn = pTyp
7b70: 65 2d 3e 7a 3b 0a 20 20 63 6f 6e 73 74 20 75 6e  e->z;.  const un
7b80: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a 45 6e  signed char *zEn
7b90: 64 20 3d 20 26 70 54 79 70 65 2d 3e 7a 5b 70 54  d = &pType->z[pT
7ba0: 79 70 65 2d 3e 6e 5d 3b 0a 0a 20 20 77 68 69 6c  ype->n];..  whil
7bb0: 65 28 20 7a 49 6e 21 3d 7a 45 6e 64 20 29 7b 0a  e( zIn!=zEnd ){.
7bc0: 20 20 20 20 68 20 3d 20 28 68 3c 3c 38 29 20 2b      h = (h<<8) +
7bd0: 20 73 71 6c 69 74 65 33 55 70 70 65 72 54 6f 4c   sqlite3UpperToL
7be0: 6f 77 65 72 5b 2a 7a 49 6e 5d 3b 0a 20 20 20 20  ower[*zIn];.    
7bf0: 7a 49 6e 2b 2b 3b 0a 20 20 20 20 69 66 28 20 68  zIn++;.    if( h
7c00: 3d 3d 28 28 27 63 27 3c 3c 32 34 29 2b 28 27 68  ==(('c'<<24)+('h
7c10: 27 3c 3c 31 36 29 2b 28 27 61 27 3c 3c 38 29 2b  '<<16)+('a'<<8)+
7c20: 27 72 27 29 20 29 7b 20 20 20 20 20 20 20 20 20  'r') ){         
7c30: 20 20 20 20 2f 2a 20 43 48 41 52 20 2a 2f 0a 20      /* CHAR */. 
7c40: 20 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49 54       aff = SQLIT
7c50: 45 5f 41 46 46 5f 54 45 58 54 3b 20 0a 20 20 20  E_AFF_TEXT; .   
7c60: 20 7d 65 6c 73 65 20 69 66 28 20 68 3d 3d 28 28   }else if( h==((
7c70: 27 63 27 3c 3c 32 34 29 2b 28 27 6c 27 3c 3c 31  'c'<<24)+('l'<<1
7c80: 36 29 2b 28 27 6f 27 3c 3c 38 29 2b 27 62 27 29  6)+('o'<<8)+'b')
7c90: 20 29 7b 20 20 20 20 20 20 20 2f 2a 20 43 4c 4f   ){       /* CLO
7ca0: 42 20 2a 2f 0a 20 20 20 20 20 20 61 66 66 20 3d  B */.      aff =
7cb0: 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54   SQLITE_AFF_TEXT
7cc0: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
7cd0: 68 3d 3d 28 28 27 74 27 3c 3c 32 34 29 2b 28 27  h==(('t'<<24)+('
7ce0: 65 27 3c 3c 31 36 29 2b 28 27 78 27 3c 3c 38 29  e'<<16)+('x'<<8)
7cf0: 2b 27 74 27 29 20 29 7b 20 20 20 20 20 20 20 2f  +'t') ){       /
7d00: 2a 20 54 45 58 54 20 2a 2f 0a 20 20 20 20 20 20  * TEXT */.      
7d10: 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46  aff = SQLITE_AFF
7d20: 5f 54 45 58 54 3b 0a 20 20 20 20 7d 65 6c 73 65  _TEXT;.    }else
7d30: 20 69 66 28 20 68 3d 3d 28 28 27 62 27 3c 3c 32   if( h==(('b'<<2
7d40: 34 29 2b 28 27 6c 27 3c 3c 31 36 29 2b 28 27 6f  4)+('l'<<16)+('o
7d50: 27 3c 3c 38 29 2b 27 62 27 29 20 20 20 20 20 20  '<<8)+'b')      
7d60: 20 20 20 20 2f 2a 20 42 4c 4f 42 20 2a 2f 0a 20      /* BLOB */. 
7d70: 20 20 20 20 20 20 20 26 26 20 28 61 66 66 3d 3d         && (aff==
7d80: 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52  SQLITE_AFF_NUMER
7d90: 49 43 20 7c 7c 20 61 66 66 3d 3d 53 51 4c 49 54  IC || aff==SQLIT
7da0: 45 5f 41 46 46 5f 52 45 41 4c 29 20 29 7b 0a 20  E_AFF_REAL) ){. 
7db0: 20 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49 54       aff = SQLIT
7dc0: 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 23 69 66 6e  E_AFF_NONE;.#ifn
7dd0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
7de0: 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 20  FLOATING_POINT. 
7df0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 68 3d 3d     }else if( h==
7e00: 28 28 27 72 27 3c 3c 32 34 29 2b 28 27 65 27 3c  (('r'<<24)+('e'<
7e10: 3c 31 36 29 2b 28 27 61 27 3c 3c 38 29 2b 27 6c  <16)+('a'<<8)+'l
7e20: 27 29 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52  ')          /* R
7e30: 45 41 4c 20 2a 2f 0a 20 20 20 20 20 20 20 20 26  EAL */.        &
7e40: 26 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46  & aff==SQLITE_AF
7e50: 46 5f 4e 55 4d 45 52 49 43 20 29 7b 0a 20 20 20  F_NUMERIC ){.   
7e60: 20 20 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f     aff = SQLITE_
7e70: 41 46 46 5f 52 45 41 4c 3b 0a 20 20 20 20 7d 65  AFF_REAL;.    }e
7e80: 6c 73 65 20 69 66 28 20 68 3d 3d 28 28 27 66 27  lse if( h==(('f'
7e90: 3c 3c 32 34 29 2b 28 27 6c 27 3c 3c 31 36 29 2b  <<24)+('l'<<16)+
7ea0: 28 27 6f 27 3c 3c 38 29 2b 27 61 27 29 20 20 20  ('o'<<8)+'a')   
7eb0: 20 20 20 20 20 20 20 2f 2a 20 46 4c 4f 41 20 2a         /* FLOA *
7ec0: 2f 0a 20 20 20 20 20 20 20 20 26 26 20 61 66 66  /.        && aff
7ed0: 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d  ==SQLITE_AFF_NUM
7ee0: 45 52 49 43 20 29 7b 0a 20 20 20 20 20 20 61 66  ERIC ){.      af
7ef0: 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 52  f = SQLITE_AFF_R
7f00: 45 41 4c 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  EAL;.    }else i
7f10: 66 28 20 68 3d 3d 28 28 27 64 27 3c 3c 32 34 29  f( h==(('d'<<24)
7f20: 2b 28 27 6f 27 3c 3c 31 36 29 2b 28 27 75 27 3c  +('o'<<16)+('u'<
7f30: 3c 38 29 2b 27 62 27 29 20 20 20 20 20 20 20 20  <8)+'b')        
7f40: 20 20 2f 2a 20 44 4f 55 42 20 2a 2f 0a 20 20 20    /* DOUB */.   
7f50: 20 20 20 20 20 26 26 20 61 66 66 3d 3d 53 51 4c       && aff==SQL
7f60: 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20  ITE_AFF_NUMERIC 
7f70: 29 7b 0a 20 20 20 20 20 20 61 66 66 20 3d 20 53  ){.      aff = S
7f80: 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 3b 0a  QLITE_AFF_REAL;.
7f90: 23 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c 73 65  #endif.    }else
7fa0: 20 69 66 28 20 28 68 26 30 78 30 30 46 46 46 46   if( (h&0x00FFFF
7fb0: 46 46 29 3d 3d 28 28 27 69 27 3c 3c 31 36 29 2b  FF)==(('i'<<16)+
7fc0: 28 27 6e 27 3c 3c 38 29 2b 27 74 27 29 20 29 7b  ('n'<<8)+'t') ){
7fd0: 20 20 20 20 2f 2a 20 49 4e 54 20 2a 2f 0a 20 20      /* INT */.  
7fe0: 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49 54 45      aff = SQLITE
7ff0: 5f 41 46 46 5f 49 4e 54 45 47 45 52 3b 0a 20 20  _AFF_INTEGER;.  
8000: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
8010: 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 61  .  }..  return a
8020: 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  ff;.}../*.** Thi
8030: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
8040: 6c 65 64 20 62 79 20 74 68 65 20 70 61 72 73 65  led by the parse
8050: 72 20 77 68 69 6c 65 20 69 6e 20 74 68 65 20 6d  r while in the m
8060: 69 64 64 6c 65 20 6f 66 0a 2a 2a 20 70 61 72 73  iddle of.** pars
8070: 69 6e 67 20 61 20 43 52 45 41 54 45 20 54 41 42  ing a CREATE TAB
8080: 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 54  LE statement.  T
8090: 68 65 20 70 46 69 72 73 74 20 74 6f 6b 65 6e 20  he pFirst token 
80a0: 69 73 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20  is the first.** 
80b0: 74 6f 6b 65 6e 20 69 6e 20 74 68 65 20 73 65 71  token in the seq
80c0: 75 65 6e 63 65 20 6f 66 20 74 6f 6b 65 6e 73 20  uence of tokens 
80d0: 74 68 61 74 20 64 65 73 63 72 69 62 65 20 74 68  that describe th
80e0: 65 20 74 79 70 65 20 6f 66 20 74 68 65 0a 2a 2a  e type of the.**
80f0: 20 63 6f 6c 75 6d 6e 20 63 75 72 72 65 6e 74 6c   column currentl
8100: 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63  y under construc
8110: 74 69 6f 6e 2e 20 20 20 70 4c 61 73 74 20 69 73  tion.   pLast is
8120: 20 74 68 65 20 6c 61 73 74 20 74 6f 6b 65 6e 0a   the last token.
8130: 2a 2a 20 69 6e 20 74 68 65 20 73 65 71 75 65 6e  ** in the sequen
8140: 63 65 2e 20 20 55 73 65 20 74 68 69 73 20 69 6e  ce.  Use this in
8150: 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20 63 6f 6e  formation to con
8160: 73 74 72 75 63 74 20 61 20 73 74 72 69 6e 67 0a  struct a string.
8170: 2a 2a 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73  ** that contains
8180: 20 74 68 65 20 74 79 70 65 6e 61 6d 65 20 6f 66   the typename of
8190: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 61 6e 64 20   the column and 
81a0: 73 74 6f 72 65 20 74 68 61 74 20 73 74 72 69 6e  store that strin
81b0: 67 0a 2a 2a 20 69 6e 20 7a 54 79 70 65 2e 0a 2a  g.** in zType..*
81c0: 2f 20 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 41  / .void sqlite3A
81d0: 64 64 43 6f 6c 75 6d 6e 54 79 70 65 28 50 61 72  ddColumnType(Par
81e0: 73 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65  se *pParse, Toke
81f0: 6e 20 2a 70 54 79 70 65 29 7b 0a 20 20 54 61 62  n *pType){.  Tab
8200: 6c 65 20 2a 70 3b 0a 20 20 69 6e 74 20 69 3b 0a  le *p;.  int i;.
8210: 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a    Column *pCol;.
8220: 0a 20 20 69 66 28 20 28 70 20 3d 20 70 50 61 72  .  if( (p = pPar
8230: 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3d 3d  se->pNewTable)==
8240: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 20  0 ) return;.  i 
8250: 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 69  = p->nCol-1;.  i
8260: 66 28 20 69 3c 30 20 29 20 72 65 74 75 72 6e 3b  f( i<0 ) return;
8270: 0a 20 20 70 43 6f 6c 20 3d 20 26 70 2d 3e 61 43  .  pCol = &p->aC
8280: 6f 6c 5b 69 5d 3b 0a 20 20 73 71 6c 69 74 65 33  ol[i];.  sqlite3
8290: 5f 66 72 65 65 28 70 43 6f 6c 2d 3e 7a 54 79 70  _free(pCol->zTyp
82a0: 65 29 3b 0a 20 20 70 43 6f 6c 2d 3e 7a 54 79 70  e);.  pCol->zTyp
82b0: 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46  e = sqlite3NameF
82c0: 72 6f 6d 54 6f 6b 65 6e 28 70 50 61 72 73 65 2d  romToken(pParse-
82d0: 3e 64 62 2c 20 70 54 79 70 65 29 3b 0a 20 20 70  >db, pType);.  p
82e0: 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20  Col->affinity = 
82f0: 73 71 6c 69 74 65 33 41 66 66 69 6e 69 74 79 54  sqlite3AffinityT
8300: 79 70 65 28 70 54 79 70 65 29 3b 0a 7d 0a 0a 2f  ype(pType);.}../
8310: 2a 0a 2a 2a 20 54 68 65 20 65 78 70 72 65 73 73  *.** The express
8320: 69 6f 6e 20 69 73 20 74 68 65 20 64 65 66 61 75  ion is the defau
8330: 6c 74 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65  lt value for the
8340: 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 61   most recently a
8350: 64 64 65 64 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 6f  dded column.** o
8360: 66 20 74 68 65 20 74 61 62 6c 65 20 63 75 72 72  f the table curr
8370: 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73  ently under cons
8380: 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  truction..**.** 
8390: 44 65 66 61 75 6c 74 20 76 61 6c 75 65 20 65 78  Default value ex
83a0: 70 72 65 73 73 69 6f 6e 73 20 6d 75 73 74 20 62  pressions must b
83b0: 65 20 63 6f 6e 73 74 61 6e 74 2e 20 20 52 61 69  e constant.  Rai
83c0: 73 65 20 61 6e 20 65 78 63 65 70 74 69 6f 6e 20  se an exception 
83d0: 69 66 20 74 68 69 73 0a 2a 2a 20 69 73 20 6e 6f  if this.** is no
83e0: 74 20 74 68 65 20 63 61 73 65 2e 0a 2a 2a 0a 2a  t the case..**.*
83f0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
8400: 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20  s called by the 
8410: 70 61 72 73 65 72 20 77 68 69 6c 65 20 69 6e 20  parser while in 
8420: 74 68 65 20 6d 69 64 64 6c 65 20 6f 66 0a 2a 2a  the middle of.**
8430: 20 70 61 72 73 69 6e 67 20 61 20 43 52 45 41 54   parsing a CREAT
8440: 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e  E TABLE statemen
8450: 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  t..*/.void sqlit
8460: 65 33 41 64 64 44 65 66 61 75 6c 74 56 61 6c 75  e3AddDefaultValu
8470: 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
8480: 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20   Expr *pExpr){. 
8490: 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 43 6f 6c   Table *p;.  Col
84a0: 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 69 66 28  umn *pCol;.  if(
84b0: 20 28 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e   (p = pParse->pN
84c0: 65 77 54 61 62 6c 65 29 21 3d 30 20 29 7b 0a 20  ewTable)!=0 ){. 
84d0: 20 20 20 70 43 6f 6c 20 3d 20 26 28 70 2d 3e 61     pCol = &(p->a
84e0: 43 6f 6c 5b 70 2d 3e 6e 43 6f 6c 2d 31 5d 29 3b  Col[p->nCol-1]);
84f0: 0a 20 20 20 20 69 66 28 20 21 73 71 6c 69 74 65  .    if( !sqlite
8500: 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4f  3ExprIsConstantO
8510: 72 46 75 6e 63 74 69 6f 6e 28 70 45 78 70 72 29  rFunction(pExpr)
8520: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
8530: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
8540: 2c 20 22 64 65 66 61 75 6c 74 20 76 61 6c 75 65  , "default value
8550: 20 6f 66 20 63 6f 6c 75 6d 6e 20 5b 25 73 5d 20   of column [%s] 
8560: 69 73 20 6e 6f 74 20 63 6f 6e 73 74 61 6e 74 22  is not constant"
8570: 2c 0a 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c  ,.          pCol
8580: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 65  ->zName);.    }e
8590: 6c 73 65 7b 0a 20 20 20 20 20 20 45 78 70 72 20  lse{.      Expr 
85a0: 2a 70 43 6f 70 79 3b 0a 20 20 20 20 20 20 73 71  *pCopy;.      sq
85b0: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
85c0: 73 65 2d 3e 64 62 3b 0a 20 20 20 20 20 20 73 71  se->db;.      sq
85d0: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
85e0: 70 43 6f 6c 2d 3e 70 44 66 6c 74 29 3b 0a 20 20  pCol->pDflt);.  
85f0: 20 20 20 20 70 43 6f 6c 2d 3e 70 44 66 6c 74 20      pCol->pDflt 
8600: 3d 20 70 43 6f 70 79 20 3d 20 73 71 6c 69 74 65  = pCopy = sqlite
8610: 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 45 78  3ExprDup(db, pEx
8620: 70 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  pr);.      if( p
8630: 43 6f 70 79 20 29 7b 0a 20 20 20 20 20 20 20 20  Copy ){.        
8640: 73 71 6c 69 74 65 33 54 6f 6b 65 6e 43 6f 70 79  sqlite3TokenCopy
8650: 28 64 62 2c 20 26 70 43 6f 70 79 2d 3e 73 70 61  (db, &pCopy->spa
8660: 6e 2c 20 26 70 45 78 70 72 2d 3e 73 70 61 6e 29  n, &pExpr->span)
8670: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
8680: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 78 70    }.  sqlite3Exp
8690: 72 44 65 6c 65 74 65 28 70 45 78 70 72 29 3b 0a  rDelete(pExpr);.
86a0: 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 73 69 67 6e 61  }../*.** Designa
86b0: 74 65 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b  te the PRIMARY K
86c0: 45 59 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65  EY for the table
86d0: 2e 20 20 70 4c 69 73 74 20 69 73 20 61 20 6c 69  .  pList is a li
86e0: 73 74 20 6f 66 20 6e 61 6d 65 73 20 0a 2a 2a 20  st of names .** 
86f0: 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 68 61 74 20  of columns that 
8700: 66 6f 72 6d 20 74 68 65 20 70 72 69 6d 61 72 79  form the primary
8710: 20 6b 65 79 2e 20 20 49 66 20 70 4c 69 73 74 20   key.  If pList 
8720: 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68  is NULL, then th
8730: 65 0a 2a 2a 20 6d 6f 73 74 20 72 65 63 65 6e 74  e.** most recent
8740: 6c 79 20 61 64 64 65 64 20 63 6f 6c 75 6d 6e 20  ly added column 
8750: 6f 66 20 74 68 65 20 74 61 62 6c 65 20 69 73 20  of the table is 
8760: 74 68 65 20 70 72 69 6d 61 72 79 20 6b 65 79 2e  the primary key.
8770: 0a 2a 2a 0a 2a 2a 20 41 20 74 61 62 6c 65 20 63  .**.** A table c
8780: 61 6e 20 68 61 76 65 20 61 74 20 6d 6f 73 74 20  an have at most 
8790: 6f 6e 65 20 70 72 69 6d 61 72 79 20 6b 65 79 2e  one primary key.
87a0: 20 20 49 66 20 74 68 65 20 74 61 62 6c 65 20 61    If the table a
87b0: 6c 72 65 61 64 79 20 68 61 73 0a 2a 2a 20 61 20  lready has.** a 
87c0: 70 72 69 6d 61 72 79 20 6b 65 79 20 28 61 6e 64  primary key (and
87d0: 20 74 68 69 73 20 69 73 20 74 68 65 20 73 65 63   this is the sec
87e0: 6f 6e 64 20 70 72 69 6d 61 72 79 20 6b 65 79 29  ond primary key)
87f0: 20 74 68 65 6e 20 63 72 65 61 74 65 20 61 6e 0a   then create an.
8800: 2a 2a 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20  ** error..**.** 
8810: 49 66 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b  If the PRIMARY K
8820: 45 59 20 69 73 20 6f 6e 20 61 20 73 69 6e 67 6c  EY is on a singl
8830: 65 20 63 6f 6c 75 6d 6e 20 77 68 6f 73 65 20 64  e column whose d
8840: 61 74 61 74 79 70 65 20 69 73 20 49 4e 54 45 47  atatype is INTEG
8850: 45 52 2c 0a 2a 2a 20 74 68 65 6e 20 77 65 20 77  ER,.** then we w
8860: 69 6c 6c 20 74 72 79 20 74 6f 20 75 73 65 20 74  ill try to use t
8870: 68 61 74 20 63 6f 6c 75 6d 6e 20 61 73 20 74 68  hat column as th
8880: 65 20 72 6f 77 69 64 2e 20 20 53 65 74 20 74 68  e rowid.  Set th
8890: 65 20 54 61 62 6c 65 2e 69 50 4b 65 79 0a 2a 2a  e Table.iPKey.**
88a0: 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 74 61   field of the ta
88b0: 62 6c 65 20 75 6e 64 65 72 20 63 6f 6e 73 74 72  ble under constr
88c0: 75 63 74 69 6f 6e 20 74 6f 20 62 65 20 74 68 65  uction to be the
88d0: 20 69 6e 64 65 78 20 6f 66 20 74 68 65 0a 2a 2a   index of the.**
88e0: 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59   INTEGER PRIMARY
88f0: 20 4b 45 59 20 63 6f 6c 75 6d 6e 2e 20 20 54 61   KEY column.  Ta
8900: 62 6c 65 2e 69 50 4b 65 79 20 69 73 20 73 65 74  ble.iPKey is set
8910: 20 74 6f 20 2d 31 20 69 66 20 74 68 65 72 65 20   to -1 if there 
8920: 69 73 0a 2a 2a 20 6e 6f 20 49 4e 54 45 47 45 52  is.** no INTEGER
8930: 20 50 52 49 4d 41 52 59 20 4b 45 59 2e 0a 2a 2a   PRIMARY KEY..**
8940: 0a 2a 2a 20 49 66 20 74 68 65 20 6b 65 79 20 69  .** If the key i
8950: 73 20 6e 6f 74 20 61 6e 20 49 4e 54 45 47 45 52  s not an INTEGER
8960: 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 74 68   PRIMARY KEY, th
8970: 65 6e 20 63 72 65 61 74 65 20 61 20 75 6e 69 71  en create a uniq
8980: 75 65 0a 2a 2a 20 69 6e 64 65 78 20 66 6f 72 20  ue.** index for 
8990: 74 68 65 20 6b 65 79 2e 20 20 4e 6f 20 69 6e 64  the key.  No ind
89a0: 65 78 20 69 73 20 63 72 65 61 74 65 64 20 66 6f  ex is created fo
89b0: 72 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52  r INTEGER PRIMAR
89c0: 59 20 4b 45 59 73 2e 0a 2a 2f 0a 76 6f 69 64 20  Y KEYs..*/.void 
89d0: 73 71 6c 69 74 65 33 41 64 64 50 72 69 6d 61 72  sqlite3AddPrimar
89e0: 79 4b 65 79 28 0a 20 20 50 61 72 73 65 20 2a 70  yKey(.  Parse *p
89f0: 50 61 72 73 65 2c 20 20 20 20 2f 2a 20 50 61 72  Parse,    /* Par
8a00: 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
8a10: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73    ExprList *pLis
8a20: 74 2c 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 66  t,  /* List of f
8a30: 69 65 6c 64 20 6e 61 6d 65 73 20 74 6f 20 62 65  ield names to be
8a40: 20 69 6e 64 65 78 65 64 20 2a 2f 0a 20 20 69 6e   indexed */.  in
8a50: 74 20 6f 6e 45 72 72 6f 72 2c 20 20 20 20 20 20  t onError,      
8a60: 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69  /* What to do wi
8a70: 74 68 20 61 20 75 6e 69 71 75 65 6e 65 73 73 20  th a uniqueness 
8a80: 63 6f 6e 66 6c 69 63 74 20 2a 2f 0a 20 20 69 6e  conflict */.  in
8a90: 74 20 61 75 74 6f 49 6e 63 2c 20 20 20 20 20 20  t autoInc,      
8aa0: 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20 41  /* True if the A
8ab0: 55 54 4f 49 4e 43 52 45 4d 45 4e 54 20 6b 65 79  UTOINCREMENT key
8ac0: 77 6f 72 64 20 69 73 20 70 72 65 73 65 6e 74 20  word is present 
8ad0: 2a 2f 0a 20 20 69 6e 74 20 73 6f 72 74 4f 72 64  */.  int sortOrd
8ae0: 65 72 20 20 20 20 20 2f 2a 20 53 51 4c 49 54 45  er     /* SQLITE
8af0: 5f 53 4f 5f 41 53 43 20 6f 72 20 53 51 4c 49 54  _SO_ASC or SQLIT
8b00: 45 5f 53 4f 5f 44 45 53 43 20 2a 2f 0a 29 7b 0a  E_SO_DESC */.){.
8b10: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20    Table *pTab = 
8b20: 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
8b30: 65 3b 0a 20 20 63 68 61 72 20 2a 7a 54 79 70 65  e;.  char *zType
8b40: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 43 6f 6c   = 0;.  int iCol
8b50: 20 3d 20 2d 31 2c 20 69 3b 0a 20 20 69 66 28 20   = -1, i;.  if( 
8b60: 70 54 61 62 3d 3d 30 20 7c 7c 20 49 4e 5f 44 45  pTab==0 || IN_DE
8b70: 43 4c 41 52 45 5f 56 54 41 42 20 29 20 67 6f 74  CLARE_VTAB ) got
8b80: 6f 20 70 72 69 6d 61 72 79 5f 6b 65 79 5f 65 78  o primary_key_ex
8b90: 69 74 3b 0a 20 20 69 66 28 20 70 54 61 62 2d 3e  it;.  if( pTab->
8ba0: 68 61 73 50 72 69 6d 4b 65 79 20 29 7b 0a 20 20  hasPrimKey ){.  
8bb0: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
8bc0: 67 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20  g(pParse, .     
8bd0: 20 22 74 61 62 6c 65 20 5c 22 25 73 5c 22 20 68   "table \"%s\" h
8be0: 61 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65  as more than one
8bf0: 20 70 72 69 6d 61 72 79 20 6b 65 79 22 2c 20 70   primary key", p
8c00: 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  Tab->zName);.   
8c10: 20 67 6f 74 6f 20 70 72 69 6d 61 72 79 5f 6b 65   goto primary_ke
8c20: 79 5f 65 78 69 74 3b 0a 20 20 7d 0a 20 20 70 54  y_exit;.  }.  pT
8c30: 61 62 2d 3e 68 61 73 50 72 69 6d 4b 65 79 20 3d  ab->hasPrimKey =
8c40: 20 31 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d   1;.  if( pList=
8c50: 3d 30 20 29 7b 0a 20 20 20 20 69 43 6f 6c 20 3d  =0 ){.    iCol =
8c60: 20 70 54 61 62 2d 3e 6e 43 6f 6c 20 2d 20 31 3b   pTab->nCol - 1;
8c70: 0a 20 20 20 20 70 54 61 62 2d 3e 61 43 6f 6c 5b  .    pTab->aCol[
8c80: 69 43 6f 6c 5d 2e 69 73 50 72 69 6d 4b 65 79 20  iCol].isPrimKey 
8c90: 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 1;.  }else{.  
8ca0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69    for(i=0; i<pLi
8cb0: 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  st->nExpr; i++){
8cc0: 0a 20 20 20 20 20 20 66 6f 72 28 69 43 6f 6c 3d  .      for(iCol=
8cd0: 30 3b 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43  0; iCol<pTab->nC
8ce0: 6f 6c 3b 20 69 43 6f 6c 2b 2b 29 7b 0a 20 20 20  ol; iCol++){.   
8cf0: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
8d00: 53 74 72 49 43 6d 70 28 70 4c 69 73 74 2d 3e 61  StrICmp(pList->a
8d10: 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 70 54 61 62 2d  [i].zName, pTab-
8d20: 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d  >aCol[iCol].zNam
8d30: 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  e)==0 ){.       
8d40: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
8d50: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
8d60: 20 20 69 66 28 20 69 43 6f 6c 3c 70 54 61 62 2d    if( iCol<pTab-
8d70: 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 20  >nCol ){.       
8d80: 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c   pTab->aCol[iCol
8d90: 5d 2e 69 73 50 72 69 6d 4b 65 79 20 3d 20 31 3b  ].isPrimKey = 1;
8da0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
8db0: 20 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 6e 45     if( pList->nE
8dc0: 78 70 72 3e 31 20 29 20 69 43 6f 6c 20 3d 20 2d  xpr>1 ) iCol = -
8dd0: 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 43 6f  1;.  }.  if( iCo
8de0: 6c 3e 3d 30 20 26 26 20 69 43 6f 6c 3c 70 54 61  l>=0 && iCol<pTa
8df0: 62 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 7a  b->nCol ){.    z
8e00: 54 79 70 65 20 3d 20 70 54 61 62 2d 3e 61 43 6f  Type = pTab->aCo
8e10: 6c 5b 69 43 6f 6c 5d 2e 7a 54 79 70 65 3b 0a 20  l[iCol].zType;. 
8e20: 20 7d 0a 20 20 69 66 28 20 7a 54 79 70 65 20 26   }.  if( zType &
8e30: 26 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  & sqlite3StrICmp
8e40: 28 7a 54 79 70 65 2c 20 22 49 4e 54 45 47 45 52  (zType, "INTEGER
8e50: 22 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 26 26  ")==0.        &&
8e60: 20 73 6f 72 74 4f 72 64 65 72 3d 3d 53 51 4c 49   sortOrder==SQLI
8e70: 54 45 5f 53 4f 5f 41 53 43 20 29 7b 0a 20 20 20  TE_SO_ASC ){.   
8e80: 20 70 54 61 62 2d 3e 69 50 4b 65 79 20 3d 20 69   pTab->iPKey = i
8e90: 43 6f 6c 3b 0a 20 20 20 20 70 54 61 62 2d 3e 6b  Col;.    pTab->k
8ea0: 65 79 43 6f 6e 66 20 3d 20 6f 6e 45 72 72 6f 72  eyConf = onError
8eb0: 3b 0a 20 20 20 20 70 54 61 62 2d 3e 61 75 74 6f  ;.    pTab->auto
8ec0: 49 6e 63 20 3d 20 61 75 74 6f 49 6e 63 3b 0a 20  Inc = autoInc;. 
8ed0: 20 7d 65 6c 73 65 20 69 66 28 20 61 75 74 6f 49   }else if( autoI
8ee0: 6e 63 20 29 7b 0a 23 69 66 6e 64 65 66 20 53 51  nc ){.#ifndef SQ
8ef0: 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e  LITE_OMIT_AUTOIN
8f00: 43 52 45 4d 45 4e 54 0a 20 20 20 20 73 71 6c 69  CREMENT.    sqli
8f10: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
8f20: 73 65 2c 20 22 41 55 54 4f 49 4e 43 52 45 4d 45  se, "AUTOINCREME
8f30: 4e 54 20 69 73 20 6f 6e 6c 79 20 61 6c 6c 6f 77  NT is only allow
8f40: 65 64 20 6f 6e 20 61 6e 20 22 0a 20 20 20 20 20  ed on an ".     
8f50: 20 20 22 49 4e 54 45 47 45 52 20 50 52 49 4d 41    "INTEGER PRIMA
8f60: 52 59 20 4b 45 59 22 29 3b 0a 23 65 6e 64 69 66  RY KEY");.#endif
8f70: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71  .  }else{.    sq
8f80: 6c 69 74 65 33 43 72 65 61 74 65 49 6e 64 65 78  lite3CreateIndex
8f90: 28 70 50 61 72 73 65 2c 20 30 2c 20 30 2c 20 30  (pParse, 0, 0, 0
8fa0: 2c 20 70 4c 69 73 74 2c 20 6f 6e 45 72 72 6f 72  , pList, onError
8fb0: 2c 20 30 2c 20 30 2c 20 73 6f 72 74 4f 72 64 65  , 0, 0, sortOrde
8fc0: 72 2c 20 30 29 3b 0a 20 20 20 20 70 4c 69 73 74  r, 0);.    pList
8fd0: 20 3d 20 30 3b 0a 20 20 7d 0a 0a 70 72 69 6d 61   = 0;.  }..prima
8fe0: 72 79 5f 6b 65 79 5f 65 78 69 74 3a 0a 20 20 73  ry_key_exit:.  s
8ff0: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65  qlite3ExprListDe
9000: 6c 65 74 65 28 70 4c 69 73 74 29 3b 0a 20 20 72  lete(pList);.  r
9010: 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  eturn;.}../*.** 
9020: 41 64 64 20 61 20 6e 65 77 20 43 48 45 43 4b 20  Add a new CHECK 
9030: 63 6f 6e 73 74 72 61 69 6e 74 20 74 6f 20 74 68  constraint to th
9040: 65 20 74 61 62 6c 65 20 63 75 72 72 65 6e 74 6c  e table currentl
9050: 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63  y under construc
9060: 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  tion..*/.void sq
9070: 6c 69 74 65 33 41 64 64 43 68 65 63 6b 43 6f 6e  lite3AddCheckCon
9080: 73 74 72 61 69 6e 74 28 0a 20 20 50 61 72 73 65  straint(.  Parse
9090: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a 20   *pParse,    /* 
90a0: 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
90b0: 2a 2f 0a 20 20 45 78 70 72 20 2a 70 43 68 65 63  */.  Expr *pChec
90c0: 6b 45 78 70 72 20 20 2f 2a 20 54 68 65 20 63 68  kExpr  /* The ch
90d0: 65 63 6b 20 65 78 70 72 65 73 73 69 6f 6e 20 2a  eck expression *
90e0: 2f 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c  /.){.#ifndef SQL
90f0: 49 54 45 5f 4f 4d 49 54 5f 43 48 45 43 4b 0a 20  ITE_OMIT_CHECK. 
9100: 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70   Table *pTab = p
9110: 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
9120: 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
9130: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
9140: 69 66 28 20 70 54 61 62 20 26 26 20 21 49 4e 5f  if( pTab && !IN_
9150: 44 45 43 4c 41 52 45 5f 56 54 41 42 20 29 7b 0a  DECLARE_VTAB ){.
9160: 20 20 20 20 2f 2a 20 54 68 65 20 43 48 45 43 4b      /* The CHECK
9170: 20 65 78 70 72 65 73 73 69 6f 6e 20 6d 75 73 74   expression must
9180: 20 62 65 20 64 75 70 6c 69 63 61 74 65 64 20 73   be duplicated s
9190: 6f 20 74 68 61 74 20 74 6f 6b 65 6e 73 20 72 65  o that tokens re
91a0: 66 65 72 0a 20 20 20 20 2a 2a 20 74 6f 20 6d 61  fer.    ** to ma
91b0: 6c 6c 6f 63 65 64 20 73 70 61 63 65 20 61 6e 64  lloced space and
91c0: 20 6e 6f 74 20 74 68 65 20 28 65 70 68 65 6d 65   not the (epheme
91d0: 72 61 6c 29 20 74 65 78 74 20 6f 66 20 74 68 65  ral) text of the
91e0: 20 43 52 45 41 54 45 20 54 41 42 4c 45 0a 20 20   CREATE TABLE.  
91f0: 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 2a    ** statement *
9200: 2f 0a 20 20 20 20 70 54 61 62 2d 3e 70 43 68 65  /.    pTab->pChe
9210: 63 6b 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ck = sqlite3Expr
9220: 41 6e 64 28 64 62 2c 20 70 54 61 62 2d 3e 70 43  And(db, pTab->pC
9230: 68 65 63 6b 2c 20 0a 20 20 20 20 20 20 20 20 20  heck, .         
9240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9250: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
9260: 45 78 70 72 44 75 70 28 64 62 2c 20 70 43 68 65  ExprDup(db, pChe
9270: 63 6b 45 78 70 72 29 29 3b 0a 20 20 7d 0a 23 65  ckExpr));.  }.#e
9280: 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33 45 78  ndif.  sqlite3Ex
9290: 70 72 44 65 6c 65 74 65 28 70 43 68 65 63 6b 45  prDelete(pCheckE
92a0: 78 70 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  xpr);.}../*.** S
92b0: 65 74 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e  et the collation
92c0: 20 66 75 6e 63 74 69 6f 6e 20 6f 66 20 74 68 65   function of the
92d0: 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 70   most recently p
92e0: 61 72 73 65 64 20 74 61 62 6c 65 20 63 6f 6c 75  arsed table colu
92f0: 6d 6e 0a 2a 2a 20 74 6f 20 74 68 65 20 43 6f 6c  mn.** to the Col
9300: 6c 53 65 71 20 67 69 76 65 6e 2e 0a 2a 2f 0a 76  lSeq given..*/.v
9310: 6f 69 64 20 73 71 6c 69 74 65 33 41 64 64 43 6f  oid sqlite3AddCo
9320: 6c 6c 61 74 65 54 79 70 65 28 50 61 72 73 65 20  llateType(Parse 
9330: 2a 70 50 61 72 73 65 2c 20 63 6f 6e 73 74 20 63  *pParse, const c
9340: 68 61 72 20 2a 7a 54 79 70 65 2c 20 69 6e 74 20  har *zType, int 
9350: 6e 54 79 70 65 29 7b 0a 20 20 54 61 62 6c 65 20  nType){.  Table 
9360: 2a 70 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20  *p;.  int i;..  
9370: 69 66 28 20 28 70 20 3d 20 70 50 61 72 73 65 2d  if( (p = pParse-
9380: 3e 70 4e 65 77 54 61 62 6c 65 29 3d 3d 30 20 29  >pNewTable)==0 )
9390: 20 72 65 74 75 72 6e 3b 0a 20 20 69 20 3d 20 70   return;.  i = p
93a0: 2d 3e 6e 43 6f 6c 2d 31 3b 0a 0a 20 20 69 66 28  ->nCol-1;..  if(
93b0: 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 43 6f   sqlite3LocateCo
93c0: 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 7a 54  llSeq(pParse, zT
93d0: 79 70 65 2c 20 6e 54 79 70 65 29 20 29 7b 0a 20  ype, nType) ){. 
93e0: 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a     Index *pIdx;.
93f0: 20 20 20 20 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a      p->aCol[i].z
9400: 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 44 62  Coll = sqlite3Db
9410: 53 74 72 4e 44 75 70 28 70 50 61 72 73 65 2d 3e  StrNDup(pParse->
9420: 64 62 2c 20 7a 54 79 70 65 2c 20 6e 54 79 70 65  db, zType, nType
9430: 29 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20  );.  .    /* If 
9440: 74 68 65 20 63 6f 6c 75 6d 6e 20 69 73 20 64 65  the column is de
9450: 63 6c 61 72 65 64 20 61 73 20 22 3c 6e 61 6d 65  clared as "<name
9460: 3e 20 50 52 49 4d 41 52 59 20 4b 45 59 20 43 4f  > PRIMARY KEY CO
9470: 4c 4c 41 54 45 20 3c 74 79 70 65 3e 22 2c 0a 20  LLATE <type>",. 
9480: 20 20 20 2a 2a 20 74 68 65 6e 20 61 6e 20 69 6e     ** then an in
9490: 64 65 78 20 6d 61 79 20 68 61 76 65 20 62 65 65  dex may have bee
94a0: 6e 20 63 72 65 61 74 65 64 20 6f 6e 20 74 68 69  n created on thi
94b0: 73 20 63 6f 6c 75 6d 6e 20 62 65 66 6f 72 65 20  s column before 
94c0: 74 68 65 0a 20 20 20 20 2a 2a 20 63 6f 6c 6c 61  the.    ** colla
94d0: 74 69 6f 6e 20 74 79 70 65 20 77 61 73 20 61 64  tion type was ad
94e0: 64 65 64 2e 20 43 6f 72 72 65 63 74 20 74 68 69  ded. Correct thi
94f0: 73 20 69 66 20 69 74 20 69 73 20 74 68 65 20 63  s if it is the c
9500: 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ase..    */.    
9510: 66 6f 72 28 70 49 64 78 3d 70 2d 3e 70 49 6e 64  for(pIdx=p->pInd
9520: 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70  ex; pIdx; pIdx=p
9530: 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  Idx->pNext){.   
9540: 20 20 20 61 73 73 65 72 74 28 20 70 49 64 78 2d     assert( pIdx-
9550: 3e 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 29 3b 0a 20  >nColumn==1 );. 
9560: 20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 61       if( pIdx->a
9570: 69 43 6f 6c 75 6d 6e 5b 30 5d 3d 3d 69 20 29 7b  iColumn[0]==i ){
9580: 0a 20 20 20 20 20 20 20 20 70 49 64 78 2d 3e 61  .        pIdx->a
9590: 7a 43 6f 6c 6c 5b 30 5d 20 3d 20 70 2d 3e 61 43  zColl[0] = p->aC
95a0: 6f 6c 5b 69 5d 2e 7a 43 6f 6c 6c 3b 0a 20 20 20  ol[i].zColl;.   
95b0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d     }.    }.  }.}
95c0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
95d0: 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 74 68  ction returns th
95e0: 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  e collation sequ
95f0: 65 6e 63 65 20 66 6f 72 20 64 61 74 61 62 61 73  ence for databas
9600: 65 20 6e 61 74 69 76 65 20 74 65 78 74 0a 2a 2a  e native text.**
9610: 20 65 6e 63 6f 64 69 6e 67 20 69 64 65 6e 74 69   encoding identi
9620: 66 69 65 64 20 62 79 20 74 68 65 20 73 74 72 69  fied by the stri
9630: 6e 67 20 7a 4e 61 6d 65 2c 20 6c 65 6e 67 74 68  ng zName, length
9640: 20 6e 4e 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20 49 66   nName..**.** If
9650: 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 63   the requested c
9660: 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
9670: 65 20 69 73 20 6e 6f 74 20 61 76 61 69 6c 61 62  e is not availab
9680: 6c 65 2c 20 6f 72 20 6e 6f 74 20 61 76 61 69 6c  le, or not avail
9690: 61 62 6c 65 0a 2a 2a 20 69 6e 20 74 68 65 20 64  able.** in the d
96a0: 61 74 61 62 61 73 65 20 6e 61 74 69 76 65 20 65  atabase native e
96b0: 6e 63 6f 64 69 6e 67 2c 20 74 68 65 20 63 6f 6c  ncoding, the col
96c0: 6c 61 74 69 6f 6e 20 66 61 63 74 6f 72 79 20 69  lation factory i
96d0: 73 20 69 6e 76 6f 6b 65 64 20 74 6f 0a 2a 2a 20  s invoked to.** 
96e0: 72 65 71 75 65 73 74 20 69 74 2e 20 49 66 20 74  request it. If t
96f0: 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 61 63  he collation fac
9700: 74 6f 72 79 20 64 6f 65 73 20 6e 6f 74 20 73 75  tory does not su
9710: 70 70 6c 79 20 73 75 63 68 20 61 20 73 65 71 75  pply such a sequ
9720: 65 6e 63 65 2c 0a 2a 2a 20 61 6e 64 20 74 68 65  ence,.** and the
9730: 20 73 65 71 75 65 6e 63 65 20 69 73 20 61 76 61   sequence is ava
9740: 69 6c 61 62 6c 65 20 69 6e 20 61 6e 6f 74 68 65  ilable in anothe
9750: 72 20 74 65 78 74 20 65 6e 63 6f 64 69 6e 67 2c  r text encoding,
9760: 20 74 68 65 6e 20 74 68 61 74 20 69 73 0a 2a 2a   then that is.**
9770: 20 72 65 74 75 72 6e 65 64 20 69 6e 73 74 65 61   returned instea
9780: 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 20 76  d..**.** If no v
9790: 65 72 73 69 6f 6e 73 20 6f 66 20 74 68 65 20 72  ersions of the r
97a0: 65 71 75 65 73 74 65 64 20 63 6f 6c 6c 61 74 69  equested collati
97b0: 6f 6e 73 20 73 65 71 75 65 6e 63 65 20 61 72 65  ons sequence are
97c0: 20 61 76 61 69 6c 61 62 6c 65 2c 20 6f 72 0a 2a   available, or.*
97d0: 2a 20 61 6e 6f 74 68 65 72 20 65 72 72 6f 72 20  * another error 
97e0: 6f 63 63 75 72 73 2c 20 4e 55 4c 4c 20 69 73 20  occurs, NULL is 
97f0: 72 65 74 75 72 6e 65 64 20 61 6e 64 20 61 6e 20  returned and an 
9800: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 77 72  error message wr
9810: 69 74 74 65 6e 20 69 6e 74 6f 0a 2a 2a 20 70 50  itten into.** pP
9820: 61 72 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  arse..**.** This
9830: 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 77 72   routine is a wr
9840: 61 70 70 65 72 20 61 72 6f 75 6e 64 20 73 71 6c  apper around sql
9850: 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28  ite3FindCollSeq(
9860: 29 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  ).  This routine
9870: 0a 2a 2a 20 69 6e 76 6f 6b 65 73 20 74 68 65 20  .** invokes the 
9880: 63 6f 6c 6c 61 74 69 6f 6e 20 66 61 63 74 6f 72  collation factor
9890: 79 20 69 66 20 74 68 65 20 6e 61 6d 65 64 20 63  y if the named c
98a0: 6f 6c 6c 61 74 69 6f 6e 20 63 61 6e 6e 6f 74 20  ollation cannot 
98b0: 62 65 20 66 6f 75 6e 64 0a 2a 2a 20 61 6e 64 20  be found.** and 
98c0: 67 65 6e 65 72 61 74 65 73 20 61 6e 20 65 72 72  generates an err
98d0: 6f 72 20 6d 65 73 73 61 67 65 2e 0a 2a 2f 0a 43  or message..*/.C
98e0: 6f 6c 6c 53 65 71 20 2a 73 71 6c 69 74 65 33 4c  ollSeq *sqlite3L
98f0: 6f 63 61 74 65 43 6f 6c 6c 53 65 71 28 50 61 72  ocateCollSeq(Par
9900: 73 65 20 2a 70 50 61 72 73 65 2c 20 63 6f 6e 73  se *pParse, cons
9910: 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 69  t char *zName, i
9920: 6e 74 20 6e 4e 61 6d 65 29 7b 0a 20 20 73 71 6c  nt nName){.  sql
9930: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
9940: 65 2d 3e 64 62 3b 0a 20 20 75 38 20 65 6e 63 20  e->db;.  u8 enc 
9950: 3d 20 45 4e 43 28 64 62 29 3b 0a 20 20 75 38 20  = ENC(db);.  u8 
9960: 69 6e 69 74 62 75 73 79 20 3d 20 64 62 2d 3e 69  initbusy = db->i
9970: 6e 69 74 2e 62 75 73 79 3b 0a 20 20 43 6f 6c 6c  nit.busy;.  Coll
9980: 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 0a 20 20 70  Seq *pColl;..  p
9990: 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 46 69  Coll = sqlite3Fi
99a0: 6e 64 43 6f 6c 6c 53 65 71 28 64 62 2c 20 65 6e  ndCollSeq(db, en
99b0: 63 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 2c  c, zName, nName,
99c0: 20 69 6e 69 74 62 75 73 79 29 3b 0a 20 20 69 66   initbusy);.  if
99d0: 28 20 21 69 6e 69 74 62 75 73 79 20 26 26 20 28  ( !initbusy && (
99e0: 21 70 43 6f 6c 6c 20 7c 7c 20 21 70 43 6f 6c 6c  !pColl || !pColl
99f0: 2d 3e 78 43 6d 70 29 20 29 7b 0a 20 20 20 20 70  ->xCmp) ){.    p
9a00: 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 47 65  Coll = sqlite3Ge
9a10: 74 43 6f 6c 6c 53 65 71 28 64 62 2c 20 70 43 6f  tCollSeq(db, pCo
9a20: 6c 6c 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65  ll, zName, nName
9a30: 29 3b 0a 20 20 20 20 69 66 28 20 21 70 43 6f 6c  );.    if( !pCol
9a40: 6c 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e  l ){.      if( n
9a50: 4e 61 6d 65 3c 30 20 29 7b 0a 20 20 20 20 20 20  Name<0 ){.      
9a60: 20 20 6e 4e 61 6d 65 20 3d 20 73 74 72 6c 65 6e    nName = strlen
9a70: 28 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d  (zName);.      }
9a80: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
9a90: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
9aa0: 6e 6f 20 73 75 63 68 20 63 6f 6c 6c 61 74 69 6f  no such collatio
9ab0: 6e 20 73 65 71 75 65 6e 63 65 3a 20 25 2e 2a 73  n sequence: %.*s
9ac0: 22 2c 20 6e 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29  ", nName, zName)
9ad0: 3b 0a 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20  ;.      pColl = 
9ae0: 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  0;.    }.  }..  
9af0: 72 65 74 75 72 6e 20 70 43 6f 6c 6c 3b 0a 7d 0a  return pColl;.}.
9b00: 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
9b10: 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20   code that will 
9b20: 69 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 73 63  increment the sc
9b30: 68 65 6d 61 20 63 6f 6f 6b 69 65 2e 0a 2a 2a 0a  hema cookie..**.
9b40: 2a 2a 20 54 68 65 20 73 63 68 65 6d 61 20 63 6f  ** The schema co
9b50: 6f 6b 69 65 20 69 73 20 75 73 65 64 20 74 6f 20  okie is used to 
9b60: 64 65 74 65 72 6d 69 6e 65 20 77 68 65 6e 20 74  determine when t
9b70: 68 65 20 73 63 68 65 6d 61 20 66 6f 72 20 74 68  he schema for th
9b80: 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 63 68  e.** database ch
9b90: 61 6e 67 65 73 2e 20 20 41 66 74 65 72 20 65 61  anges.  After ea
9ba0: 63 68 20 73 63 68 65 6d 61 20 63 68 61 6e 67 65  ch schema change
9bb0: 2c 20 74 68 65 20 63 6f 6f 6b 69 65 20 76 61 6c  , the cookie val
9bc0: 75 65 0a 2a 2a 20 63 68 61 6e 67 65 73 2e 20 20  ue.** changes.  
9bd0: 57 68 65 6e 20 61 20 70 72 6f 63 65 73 73 20 66  When a process f
9be0: 69 72 73 74 20 72 65 61 64 73 20 74 68 65 20 73  irst reads the s
9bf0: 63 68 65 6d 61 20 69 74 20 72 65 63 6f 72 64 73  chema it records
9c00: 20 74 68 65 0a 2a 2a 20 63 6f 6f 6b 69 65 2e 20   the.** cookie. 
9c10: 20 54 68 65 72 65 61 66 74 65 72 2c 20 77 68 65   Thereafter, whe
9c20: 6e 65 76 65 72 20 69 74 20 67 6f 65 73 20 74 6f  never it goes to
9c30: 20 61 63 63 65 73 73 20 74 68 65 20 64 61 74 61   access the data
9c40: 62 61 73 65 2c 0a 2a 2a 20 69 74 20 63 68 65 63  base,.** it chec
9c50: 6b 73 20 74 68 65 20 63 6f 6f 6b 69 65 20 74 6f  ks the cookie to
9c60: 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20 73   make sure the s
9c70: 63 68 65 6d 61 20 68 61 73 20 6e 6f 74 20 63 68  chema has not ch
9c80: 61 6e 67 65 64 0a 2a 2a 20 73 69 6e 63 65 20 69  anged.** since i
9c90: 74 20 77 61 73 20 6c 61 73 74 20 72 65 61 64 2e  t was last read.
9ca0: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 70 6c 61 6e  .**.** This plan
9cb0: 20 69 73 20 6e 6f 74 20 63 6f 6d 70 6c 65 74 65   is not complete
9cc0: 6c 79 20 62 75 6c 6c 65 74 2d 70 72 6f 6f 66 2e  ly bullet-proof.
9cd0: 20 20 49 74 20 69 73 20 70 6f 73 73 69 62 6c 65    It is possible
9ce0: 20 66 6f 72 0a 2a 2a 20 74 68 65 20 73 63 68 65   for.** the sche
9cf0: 6d 61 20 74 6f 20 63 68 61 6e 67 65 20 6d 75 6c  ma to change mul
9d00: 74 69 70 6c 65 20 74 69 6d 65 73 20 61 6e 64 20  tiple times and 
9d10: 66 6f 72 20 74 68 65 20 63 6f 6f 6b 69 65 20 74  for the cookie t
9d20: 6f 20 62 65 0a 2a 2a 20 73 65 74 20 62 61 63 6b  o be.** set back
9d30: 20 74 6f 20 70 72 69 6f 72 20 76 61 6c 75 65 2e   to prior value.
9d40: 20 20 42 75 74 20 73 63 68 65 6d 61 20 63 68 61    But schema cha
9d50: 6e 67 65 73 20 61 72 65 20 69 6e 66 72 65 71 75  nges are infrequ
9d60: 65 6e 74 0a 2a 2a 20 61 6e 64 20 74 68 65 20 70  ent.** and the p
9d70: 72 6f 62 61 62 69 6c 69 74 79 20 6f 66 20 68 69  robability of hi
9d80: 74 74 69 6e 67 20 74 68 65 20 73 61 6d 65 20 63  tting the same c
9d90: 6f 6f 6b 69 65 20 76 61 6c 75 65 20 69 73 20 6f  ookie value is o
9da0: 6e 6c 79 0a 2a 2a 20 31 20 63 68 61 6e 63 65 20  nly.** 1 chance 
9db0: 69 6e 20 32 5e 33 32 2e 20 20 53 6f 20 77 65 27  in 2^32.  So we'
9dc0: 72 65 20 73 61 66 65 20 65 6e 6f 75 67 68 2e 0a  re safe enough..
9dd0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43  */.void sqlite3C
9de0: 68 61 6e 67 65 43 6f 6f 6b 69 65 28 73 71 6c 69  hangeCookie(sqli
9df0: 74 65 33 20 2a 64 62 2c 20 56 64 62 65 20 2a 76  te3 *db, Vdbe *v
9e00: 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20 20 73 71  , int iDb){.  sq
9e10: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
9e20: 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 64 62  , OP_Integer, db
9e30: 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53 63 68 65  ->aDb[iDb].pSche
9e40: 6d 61 2d 3e 73 63 68 65 6d 61 5f 63 6f 6f 6b 69  ma->schema_cooki
9e50: 65 2b 31 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74  e+1, 0);.  sqlit
9e60: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
9e70: 50 5f 53 65 74 43 6f 6f 6b 69 65 2c 20 69 44 62  P_SetCookie, iDb
9e80: 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d  , 0);.}../*.** M
9e90: 65 61 73 75 72 65 20 74 68 65 20 6e 75 6d 62 65  easure the numbe
9ea0: 72 20 6f 66 20 63 68 61 72 61 63 74 65 72 73 20  r of characters 
9eb0: 6e 65 65 64 65 64 20 74 6f 20 6f 75 74 70 75 74  needed to output
9ec0: 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20 69 64   the given.** id
9ed0: 65 6e 74 69 66 69 65 72 2e 20 20 54 68 65 20 6e  entifier.  The n
9ee0: 75 6d 62 65 72 20 72 65 74 75 72 6e 65 64 20 69  umber returned i
9ef0: 6e 63 6c 75 64 65 73 20 61 6e 79 20 71 75 6f 74  ncludes any quot
9f00: 65 73 20 75 73 65 64 0a 2a 2a 20 62 75 74 20 64  es used.** but d
9f10: 6f 65 73 20 6e 6f 74 20 69 6e 63 6c 75 64 65 20  oes not include 
9f20: 74 68 65 20 6e 75 6c 6c 20 74 65 72 6d 69 6e 61  the null termina
9f30: 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 65  tor..**.** The e
9f40: 73 74 69 6d 61 74 65 20 69 73 20 63 6f 6e 73 65  stimate is conse
9f50: 72 76 61 74 69 76 65 2e 20 20 49 74 20 6d 69 67  rvative.  It mig
9f60: 68 74 20 62 65 20 6c 61 72 67 65 72 20 74 68 61  ht be larger tha
9f70: 74 20 77 68 61 74 20 69 73 0a 2a 2a 20 72 65 61  t what is.** rea
9f80: 6c 6c 79 20 6e 65 65 64 65 64 2e 0a 2a 2f 0a 73  lly needed..*/.s
9f90: 74 61 74 69 63 20 69 6e 74 20 69 64 65 6e 74 4c  tatic int identL
9fa0: 65 6e 67 74 68 28 63 6f 6e 73 74 20 63 68 61 72  ength(const char
9fb0: 20 2a 7a 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20   *z){.  int n;. 
9fc0: 20 66 6f 72 28 6e 3d 30 3b 20 2a 7a 3b 20 6e 2b   for(n=0; *z; n+
9fd0: 2b 2c 20 7a 2b 2b 29 7b 0a 20 20 20 20 69 66 28  +, z++){.    if(
9fe0: 20 2a 7a 3d 3d 27 22 27 20 29 7b 20 6e 2b 2b 3b   *z=='"' ){ n++;
9ff0: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
a000: 6e 20 2b 20 32 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  n + 2;.}../*.** 
a010: 57 72 69 74 65 20 61 6e 20 69 64 65 6e 74 69 66  Write an identif
a020: 69 65 72 20 6f 6e 74 6f 20 74 68 65 20 65 6e 64  ier onto the end
a030: 20 6f 66 20 74 68 65 20 67 69 76 65 6e 20 73 74   of the given st
a040: 72 69 6e 67 2e 20 20 41 64 64 0a 2a 2a 20 71 75  ring.  Add.** qu
a050: 6f 74 65 20 63 68 61 72 61 63 74 65 72 73 20 61  ote characters a
a060: 73 20 6e 65 65 64 65 64 2e 0a 2a 2f 0a 73 74 61  s needed..*/.sta
a070: 74 69 63 20 76 6f 69 64 20 69 64 65 6e 74 50 75  tic void identPu
a080: 74 28 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20 2a  t(char *z, int *
a090: 70 49 64 78 2c 20 63 68 61 72 20 2a 7a 53 69 67  pIdx, char *zSig
a0a0: 6e 65 64 49 64 65 6e 74 29 7b 0a 20 20 75 6e 73  nedIdent){.  uns
a0b0: 69 67 6e 65 64 20 63 68 61 72 20 2a 7a 49 64 65  igned char *zIde
a0c0: 6e 74 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63  nt = (unsigned c
a0d0: 68 61 72 2a 29 7a 53 69 67 6e 65 64 49 64 65 6e  har*)zSignedIden
a0e0: 74 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6e  t;.  int i, j, n
a0f0: 65 65 64 51 75 6f 74 65 3b 0a 20 20 69 20 3d 20  eedQuote;.  i = 
a100: 2a 70 49 64 78 3b 0a 20 20 66 6f 72 28 6a 3d 30  *pIdx;.  for(j=0
a110: 3b 20 7a 49 64 65 6e 74 5b 6a 5d 3b 20 6a 2b 2b  ; zIdent[j]; j++
a120: 29 7b 0a 20 20 20 20 69 66 28 20 21 69 73 61 6c  ){.    if( !isal
a130: 6e 75 6d 28 7a 49 64 65 6e 74 5b 6a 5d 29 20 26  num(zIdent[j]) &
a140: 26 20 7a 49 64 65 6e 74 5b 6a 5d 21 3d 27 5f 27  & zIdent[j]!='_'
a150: 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20   ) break;.  }.  
a160: 6e 65 65 64 51 75 6f 74 65 20 3d 20 20 7a 49 64  needQuote =  zId
a170: 65 6e 74 5b 6a 5d 21 3d 30 20 7c 7c 20 69 73 64  ent[j]!=0 || isd
a180: 69 67 69 74 28 7a 49 64 65 6e 74 5b 30 5d 29 0a  igit(zIdent[0]).
a190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a1a0: 20 20 7c 7c 20 73 71 6c 69 74 65 33 4b 65 79 77    || sqlite3Keyw
a1b0: 6f 72 64 43 6f 64 65 28 7a 49 64 65 6e 74 2c 20  ordCode(zIdent, 
a1c0: 6a 29 21 3d 54 4b 5f 49 44 3b 0a 20 20 69 66 28  j)!=TK_ID;.  if(
a1d0: 20 6e 65 65 64 51 75 6f 74 65 20 29 20 7a 5b 69   needQuote ) z[i
a1e0: 2b 2b 5d 20 3d 20 27 22 27 3b 0a 20 20 66 6f 72  ++] = '"';.  for
a1f0: 28 6a 3d 30 3b 20 7a 49 64 65 6e 74 5b 6a 5d 3b  (j=0; zIdent[j];
a200: 20 6a 2b 2b 29 7b 0a 20 20 20 20 7a 5b 69 2b 2b   j++){.    z[i++
a210: 5d 20 3d 20 7a 49 64 65 6e 74 5b 6a 5d 3b 0a 20  ] = zIdent[j];. 
a220: 20 20 20 69 66 28 20 7a 49 64 65 6e 74 5b 6a 5d     if( zIdent[j]
a230: 3d 3d 27 22 27 20 29 20 7a 5b 69 2b 2b 5d 20 3d  =='"' ) z[i++] =
a240: 20 27 22 27 3b 0a 20 20 7d 0a 20 20 69 66 28 20   '"';.  }.  if( 
a250: 6e 65 65 64 51 75 6f 74 65 20 29 20 7a 5b 69 2b  needQuote ) z[i+
a260: 2b 5d 20 3d 20 27 22 27 3b 0a 20 20 7a 5b 69 5d  +] = '"';.  z[i]
a270: 20 3d 20 30 3b 0a 20 20 2a 70 49 64 78 20 3d 20   = 0;.  *pIdx = 
a280: 69 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  i;.}../*.** Gene
a290: 72 61 74 65 20 61 20 43 52 45 41 54 45 20 54 41  rate a CREATE TA
a2a0: 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 20 61 70  BLE statement ap
a2b0: 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20 74 68  propriate for th
a2c0: 65 20 67 69 76 65 6e 0a 2a 2a 20 74 61 62 6c 65  e given.** table
a2d0: 2e 20 20 4d 65 6d 6f 72 79 20 74 6f 20 68 6f 6c  .  Memory to hol
a2e0: 64 20 74 68 65 20 74 65 78 74 20 6f 66 20 74 68  d the text of th
a2f0: 65 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 6f  e statement is o
a300: 62 74 61 69 6e 65 64 0a 2a 2a 20 66 72 6f 6d 20  btained.** from 
a310: 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 20 61  sqliteMalloc() a
a320: 6e 64 20 6d 75 73 74 20 62 65 20 66 72 65 65 64  nd must be freed
a330: 20 62 79 20 74 68 65 20 63 61 6c 6c 69 6e 67 20   by the calling 
a340: 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  function..*/.sta
a350: 74 69 63 20 63 68 61 72 20 2a 63 72 65 61 74 65  tic char *create
a360: 54 61 62 6c 65 53 74 6d 74 28 54 61 62 6c 65 20  TableStmt(Table 
a370: 2a 70 2c 20 69 6e 74 20 69 73 54 65 6d 70 29 7b  *p, int isTemp){
a380: 0a 20 20 69 6e 74 20 69 2c 20 6b 2c 20 6e 3b 0a  .  int i, k, n;.
a390: 20 20 63 68 61 72 20 2a 7a 53 74 6d 74 3b 0a 20    char *zStmt;. 
a3a0: 20 63 68 61 72 20 2a 7a 53 65 70 2c 20 2a 7a 53   char *zSep, *zS
a3b0: 65 70 32 2c 20 2a 7a 45 6e 64 2c 20 2a 7a 3b 0a  ep2, *zEnd, *z;.
a3c0: 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a    Column *pCol;.
a3d0: 20 20 6e 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70    n = 0;.  for(p
a3e0: 43 6f 6c 20 3d 20 70 2d 3e 61 43 6f 6c 2c 20 69  Col = p->aCol, i
a3f0: 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 3b 20 69  =0; i<p->nCol; i
a400: 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20  ++, pCol++){.   
a410: 20 6e 20 2b 3d 20 69 64 65 6e 74 4c 65 6e 67 74   n += identLengt
a420: 68 28 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a  h(pCol->zName);.
a430: 20 20 20 20 7a 20 3d 20 70 43 6f 6c 2d 3e 7a 54      z = pCol->zT
a440: 79 70 65 3b 0a 20 20 20 20 69 66 28 20 7a 20 29  ype;.    if( z )
a450: 7b 0a 20 20 20 20 20 20 6e 20 2b 3d 20 28 73 74  {.      n += (st
a460: 72 6c 65 6e 28 7a 29 20 2b 20 31 29 3b 0a 20 20  rlen(z) + 1);.  
a470: 20 20 7d 0a 20 20 7d 0a 20 20 6e 20 2b 3d 20 69    }.  }.  n += i
a480: 64 65 6e 74 4c 65 6e 67 74 68 28 70 2d 3e 7a 4e  dentLength(p->zN
a490: 61 6d 65 29 3b 0a 20 20 69 66 28 20 6e 3c 35 30  ame);.  if( n<50
a4a0: 20 29 7b 0a 20 20 20 20 7a 53 65 70 20 3d 20 22   ){.    zSep = "
a4b0: 22 3b 0a 20 20 20 20 7a 53 65 70 32 20 3d 20 22  ";.    zSep2 = "
a4c0: 2c 22 3b 0a 20 20 20 20 7a 45 6e 64 20 3d 20 22  ,";.    zEnd = "
a4d0: 29 22 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  )";.  }else{.   
a4e0: 20 7a 53 65 70 20 3d 20 22 5c 6e 20 20 22 3b 0a   zSep = "\n  ";.
a4f0: 20 20 20 20 7a 53 65 70 32 20 3d 20 22 2c 5c 6e      zSep2 = ",\n
a500: 20 20 22 3b 0a 20 20 20 20 7a 45 6e 64 20 3d 20    ";.    zEnd = 
a510: 22 5c 6e 29 22 3b 0a 20 20 7d 0a 20 20 6e 20 2b  "\n)";.  }.  n +
a520: 3d 20 33 35 20 2b 20 36 2a 70 2d 3e 6e 43 6f 6c  = 35 + 6*p->nCol
a530: 3b 0a 20 20 7a 53 74 6d 74 20 3d 20 73 71 6c 69  ;.  zStmt = sqli
a540: 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 6e 20 29 3b  te3_malloc( n );
a550: 0a 20 20 69 66 28 20 7a 53 74 6d 74 3d 3d 30 20  .  if( zStmt==0 
a560: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 73 71  ) return 0;.  sq
a570: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e  lite3_snprintf(n
a580: 2c 20 7a 53 74 6d 74 2c 0a 20 20 20 20 20 20 20  , zStmt,.       
a590: 20 20 20 20 20 20 20 20 20 20 20 21 4f 4d 49 54             !OMIT
a5a0: 5f 54 45 4d 50 44 42 26 26 69 73 54 65 6d 70 20  _TEMPDB&&isTemp 
a5b0: 3f 20 22 43 52 45 41 54 45 20 54 45 4d 50 20 54  ? "CREATE TEMP T
a5c0: 41 42 4c 45 20 22 3a 22 43 52 45 41 54 45 20 54  ABLE ":"CREATE T
a5d0: 41 42 4c 45 20 22 29 3b 0a 20 20 6b 20 3d 20 73  ABLE ");.  k = s
a5e0: 74 72 6c 65 6e 28 7a 53 74 6d 74 29 3b 0a 20 20  trlen(zStmt);.  
a5f0: 69 64 65 6e 74 50 75 74 28 7a 53 74 6d 74 2c 20  identPut(zStmt, 
a600: 26 6b 2c 20 70 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  &k, p->zName);. 
a610: 20 7a 53 74 6d 74 5b 6b 2b 2b 5d 20 3d 20 27 28   zStmt[k++] = '(
a620: 27 3b 0a 20 20 66 6f 72 28 70 43 6f 6c 3d 70 2d  ';.  for(pCol=p-
a630: 3e 61 43 6f 6c 2c 20 69 3d 30 3b 20 69 3c 70 2d  >aCol, i=0; i<p-
a640: 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c  >nCol; i++, pCol
a650: 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ++){.    sqlite3
a660: 5f 73 6e 70 72 69 6e 74 66 28 6e 2d 6b 2c 20 26  _snprintf(n-k, &
a670: 7a 53 74 6d 74 5b 6b 5d 2c 20 7a 53 65 70 29 3b  zStmt[k], zSep);
a680: 0a 20 20 20 20 6b 20 2b 3d 20 73 74 72 6c 65 6e  .    k += strlen
a690: 28 26 7a 53 74 6d 74 5b 6b 5d 29 3b 0a 20 20 20  (&zStmt[k]);.   
a6a0: 20 7a 53 65 70 20 3d 20 7a 53 65 70 32 3b 0a 20   zSep = zSep2;. 
a6b0: 20 20 20 69 64 65 6e 74 50 75 74 28 7a 53 74 6d     identPut(zStm
a6c0: 74 2c 20 26 6b 2c 20 70 43 6f 6c 2d 3e 7a 4e 61  t, &k, pCol->zNa
a6d0: 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 28 7a 20  me);.    if( (z 
a6e0: 3d 20 70 43 6f 6c 2d 3e 7a 54 79 70 65 29 21 3d  = pCol->zType)!=
a6f0: 30 20 29 7b 0a 20 20 20 20 20 20 7a 53 74 6d 74  0 ){.      zStmt
a700: 5b 6b 2b 2b 5d 20 3d 20 27 20 27 3b 0a 20 20 20  [k++] = ' ';.   
a710: 20 20 20 61 73 73 65 72 74 28 20 73 74 72 6c 65     assert( strle
a720: 6e 28 7a 29 2b 6b 2b 31 3c 3d 6e 20 29 3b 0a 20  n(z)+k+1<=n );. 
a730: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
a740: 72 69 6e 74 66 28 6e 2d 6b 2c 20 26 7a 53 74 6d  rintf(n-k, &zStm
a750: 74 5b 6b 5d 2c 20 22 25 73 22 2c 20 7a 29 3b 0a  t[k], "%s", z);.
a760: 20 20 20 20 20 20 6b 20 2b 3d 20 73 74 72 6c 65        k += strle
a770: 6e 28 7a 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  n(z);.    }.  }.
a780: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
a790: 74 66 28 6e 2d 6b 2c 20 26 7a 53 74 6d 74 5b 6b  tf(n-k, &zStmt[k
a7a0: 5d 2c 20 22 25 73 22 2c 20 7a 45 6e 64 29 3b 0a  ], "%s", zEnd);.
a7b0: 20 20 72 65 74 75 72 6e 20 7a 53 74 6d 74 3b 0a    return zStmt;.
a7c0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
a7d0: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
a7e0: 74 6f 20 72 65 70 6f 72 74 20 74 68 65 20 66 69  to report the fi
a7f0: 6e 61 6c 20 22 29 22 20 74 68 61 74 20 74 65 72  nal ")" that ter
a800: 6d 69 6e 61 74 65 73 0a 2a 2a 20 61 20 43 52 45  minates.** a CRE
a810: 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d  ATE TABLE statem
a820: 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74  ent..**.** The t
a830: 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 74  able structure t
a840: 68 61 74 20 6f 74 68 65 72 20 61 63 74 69 6f 6e  hat other action
a850: 20 72 6f 75 74 69 6e 65 73 20 68 61 76 65 20 62   routines have b
a860: 65 65 6e 20 62 75 69 6c 64 69 6e 67 0a 2a 2a 20  een building.** 
a870: 69 73 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  is added to the 
a880: 69 6e 74 65 72 6e 61 6c 20 68 61 73 68 20 74 61  internal hash ta
a890: 62 6c 65 73 2c 20 61 73 73 75 6d 69 6e 67 20 6e  bles, assuming n
a8a0: 6f 20 65 72 72 6f 72 73 20 68 61 76 65 0a 2a 2a  o errors have.**
a8b0: 20 6f 63 63 75 72 72 65 64 2e 0a 2a 2a 0a 2a 2a   occurred..**.**
a8c0: 20 41 6e 20 65 6e 74 72 79 20 66 6f 72 20 74 68   An entry for th
a8d0: 65 20 74 61 62 6c 65 20 69 73 20 6d 61 64 65 20  e table is made 
a8e0: 69 6e 20 74 68 65 20 6d 61 73 74 65 72 20 74 61  in the master ta
a8f0: 62 6c 65 20 6f 6e 20 64 69 73 6b 2c 20 75 6e 6c  ble on disk, unl
a900: 65 73 73 0a 2a 2a 20 74 68 69 73 20 69 73 20 61  ess.** this is a
a910: 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
a920: 20 6f 72 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73   or db->init.bus
a930: 79 3d 3d 31 2e 20 20 57 68 65 6e 20 64 62 2d 3e  y==1.  When db->
a940: 69 6e 69 74 2e 62 75 73 79 3d 3d 31 0a 2a 2a 20  init.busy==1.** 
a950: 69 74 20 6d 65 61 6e 73 20 77 65 20 61 72 65 20  it means we are 
a960: 72 65 61 64 69 6e 67 20 74 68 65 20 73 71 6c 69  reading the sqli
a970: 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20  te_master table 
a980: 62 65 63 61 75 73 65 20 77 65 20 6a 75 73 74 0a  because we just.
a990: 2a 2a 20 63 6f 6e 6e 65 63 74 65 64 20 74 6f 20  ** connected to 
a9a0: 74 68 65 20 64 61 74 61 62 61 73 65 20 6f 72 20  the database or 
a9b0: 62 65 63 61 75 73 65 20 74 68 65 20 73 71 6c 69  because the sqli
a9c0: 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20  te_master table 
a9d0: 68 61 73 0a 2a 2a 20 72 65 63 65 6e 74 6c 79 20  has.** recently 
a9e0: 63 68 61 6e 67 65 64 2c 20 73 6f 20 74 68 65 20  changed, so the 
a9f0: 65 6e 74 72 79 20 66 6f 72 20 74 68 69 73 20 74  entry for this t
aa00: 61 62 6c 65 20 61 6c 72 65 61 64 79 20 65 78 69  able already exi
aa10: 73 74 73 20 69 6e 0a 2a 2a 20 74 68 65 20 73 71  sts in.** the sq
aa20: 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c  lite_master tabl
aa30: 65 2e 20 20 57 65 20 64 6f 20 6e 6f 74 20 77 61  e.  We do not wa
aa40: 6e 74 20 74 6f 20 63 72 65 61 74 65 20 69 74 20  nt to create it 
aa50: 61 67 61 69 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  again..**.** If 
aa60: 74 68 65 20 70 53 65 6c 65 63 74 20 61 72 67 75  the pSelect argu
aa70: 6d 65 6e 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c  ment is not NULL
aa80: 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20  , it means that 
aa90: 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  this routine.** 
aaa0: 77 61 73 20 63 61 6c 6c 65 64 20 74 6f 20 63 72  was called to cr
aab0: 65 61 74 65 20 61 20 74 61 62 6c 65 20 67 65 6e  eate a table gen
aac0: 65 72 61 74 65 64 20 66 72 6f 6d 20 61 20 0a 2a  erated from a .*
aad0: 2a 20 22 43 52 45 41 54 45 20 54 41 42 4c 45 20  * "CREATE TABLE 
aae0: 2e 2e 2e 20 41 53 20 53 45 4c 45 43 54 20 2e 2e  ... AS SELECT ..
aaf0: 2e 22 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 54  ." statement.  T
ab00: 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20  he column names 
ab10: 6f 66 0a 2a 2a 20 74 68 65 20 6e 65 77 20 74 61  of.** the new ta
ab20: 62 6c 65 20 77 69 6c 6c 20 6d 61 74 63 68 20 74  ble will match t
ab30: 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66  he result set of
ab40: 20 74 68 65 20 53 45 4c 45 43 54 2e 0a 2a 2f 0a   the SELECT..*/.
ab50: 76 6f 69 64 20 73 71 6c 69 74 65 33 45 6e 64 54  void sqlite3EndT
ab60: 61 62 6c 65 28 0a 20 20 50 61 72 73 65 20 2a 70  able(.  Parse *p
ab70: 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20  Parse,          
ab80: 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74 65 78 74  /* Parse context
ab90: 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 43 6f   */.  Token *pCo
aba0: 6e 73 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ns,           /*
abb0: 20 54 68 65 20 27 2c 27 20 74 6f 6b 65 6e 20 61   The ',' token a
abc0: 66 74 65 72 20 74 68 65 20 6c 61 73 74 20 63 6f  fter the last co
abd0: 6c 75 6d 6e 20 64 65 66 6e 2e 20 2a 2f 0a 20 20  lumn defn. */.  
abe0: 54 6f 6b 65 6e 20 2a 70 45 6e 64 2c 20 20 20 20  Token *pEnd,    
abf0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66          /* The f
ac00: 69 6e 61 6c 20 27 29 27 20 74 6f 6b 65 6e 20 69  inal ')' token i
ac10: 6e 20 74 68 65 20 43 52 45 41 54 45 20 54 41 42  n the CREATE TAB
ac20: 4c 45 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  LE */.  Select *
ac30: 70 53 65 6c 65 63 74 20 20 20 20 20 20 20 20 20  pSelect         
ac40: 2f 2a 20 53 65 6c 65 63 74 20 66 72 6f 6d 20 61  /* Select from a
ac50: 20 22 43 52 45 41 54 45 20 2e 2e 2e 20 41 53 20   "CREATE ... AS 
ac60: 53 45 4c 45 43 54 22 20 2a 2f 0a 29 7b 0a 20 20  SELECT" */.){.  
ac70: 54 61 62 6c 65 20 2a 70 3b 0a 20 20 73 71 6c 69  Table *p;.  sqli
ac80: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
ac90: 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 69 44 62 3b  ->db;.  int iDb;
aca0: 0a 0a 20 20 69 66 28 20 28 70 45 6e 64 3d 3d 30  ..  if( (pEnd==0
acb0: 20 26 26 20 70 53 65 6c 65 63 74 3d 3d 30 29 20   && pSelect==0) 
acc0: 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20  || pParse->nErr 
acd0: 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  || db->mallocFai
ace0: 6c 65 64 20 29 20 7b 0a 20 20 20 20 72 65 74 75  led ) {.    retu
acf0: 72 6e 3b 0a 20 20 7d 0a 20 20 70 20 3d 20 70 50  rn;.  }.  p = pP
ad00: 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b  arse->pNewTable;
ad10: 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65  .  if( p==0 ) re
ad20: 74 75 72 6e 3b 0a 0a 20 20 61 73 73 65 72 74 28  turn;..  assert(
ad30: 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20   !db->init.busy 
ad40: 7c 7c 20 21 70 53 65 6c 65 63 74 20 29 3b 0a 0a  || !pSelect );..
ad50: 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53    iDb = sqlite3S
ad60: 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c  chemaToIndex(db,
ad70: 20 70 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 0a 23   p->pSchema);..#
ad80: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
ad90: 49 54 5f 43 48 45 43 4b 0a 20 20 2f 2a 20 52 65  IT_CHECK.  /* Re
ada0: 73 6f 6c 76 65 20 6e 61 6d 65 73 20 69 6e 20 61  solve names in a
adb0: 6c 6c 20 43 48 45 43 4b 20 63 6f 6e 73 74 72 61  ll CHECK constra
adc0: 69 6e 74 20 65 78 70 72 65 73 73 69 6f 6e 73 2e  int expressions.
add0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70  .  */.  if( p->p
ade0: 43 68 65 63 6b 20 29 7b 0a 20 20 20 20 53 72 63  Check ){.    Src
adf0: 4c 69 73 74 20 73 53 72 63 3b 20 20 20 20 20 20  List sSrc;      
ae00: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
ae10: 46 61 6b 65 20 53 72 63 4c 69 73 74 20 66 6f 72  Fake SrcList for
ae20: 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
ae30: 6c 65 20 2a 2f 0a 20 20 20 20 4e 61 6d 65 43 6f  le */.    NameCo
ae40: 6e 74 65 78 74 20 73 4e 43 3b 20 20 20 20 20 20  ntext sNC;      
ae50: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
ae60: 65 20 63 6f 6e 74 65 78 74 20 66 6f 72 20 70 50  e context for pP
ae70: 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20  arse->pNewTable 
ae80: 2a 2f 0a 0a 20 20 20 20 6d 65 6d 73 65 74 28 26  */..    memset(&
ae90: 73 4e 43 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73  sNC, 0, sizeof(s
aea0: 4e 43 29 29 3b 0a 20 20 20 20 6d 65 6d 73 65 74  NC));.    memset
aeb0: 28 26 73 53 72 63 2c 20 30 2c 20 73 69 7a 65 6f  (&sSrc, 0, sizeo
aec0: 66 28 73 53 72 63 29 29 3b 0a 20 20 20 20 73 53  f(sSrc));.    sS
aed0: 72 63 2e 6e 53 72 63 20 3d 20 31 3b 0a 20 20 20  rc.nSrc = 1;.   
aee0: 20 73 53 72 63 2e 61 5b 30 5d 2e 7a 4e 61 6d 65   sSrc.a[0].zName
aef0: 20 3d 20 70 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20   = p->zName;.   
af00: 20 73 53 72 63 2e 61 5b 30 5d 2e 70 54 61 62 20   sSrc.a[0].pTab 
af10: 3d 20 70 3b 0a 20 20 20 20 73 53 72 63 2e 61 5b  = p;.    sSrc.a[
af20: 30 5d 2e 69 43 75 72 73 6f 72 20 3d 20 2d 31 3b  0].iCursor = -1;
af30: 0a 20 20 20 20 73 4e 43 2e 70 50 61 72 73 65 20  .    sNC.pParse 
af40: 3d 20 70 50 61 72 73 65 3b 0a 20 20 20 20 73 4e  = pParse;.    sN
af50: 43 2e 70 53 72 63 4c 69 73 74 20 3d 20 26 73 53  C.pSrcList = &sS
af60: 72 63 3b 0a 20 20 20 20 73 4e 43 2e 69 73 43 68  rc;.    sNC.isCh
af70: 65 63 6b 20 3d 20 31 3b 0a 20 20 20 20 69 66 28  eck = 1;.    if(
af80: 20 73 71 6c 69 74 65 33 45 78 70 72 52 65 73 6f   sqlite3ExprReso
af90: 6c 76 65 4e 61 6d 65 73 28 26 73 4e 43 2c 20 70  lveNames(&sNC, p
afa0: 2d 3e 70 43 68 65 63 6b 29 20 29 7b 0a 20 20 20  ->pCheck) ){.   
afb0: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d     return;.    }
afc0: 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21  .  }.#endif /* !
afd0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
afe0: 4d 49 54 5f 43 48 45 43 4b 29 20 2a 2f 0a 0a 20  MIT_CHECK) */.. 
aff0: 20 2f 2a 20 49 66 20 74 68 65 20 64 62 2d 3e 69   /* If the db->i
b000: 6e 69 74 2e 62 75 73 79 20 69 73 20 31 20 69 74  nit.busy is 1 it
b010: 20 6d 65 61 6e 73 20 77 65 20 61 72 65 20 72 65   means we are re
b020: 61 64 69 6e 67 20 74 68 65 20 53 51 4c 20 6f 66  ading the SQL of
b030: 66 20 74 68 65 0a 20 20 2a 2a 20 22 73 71 6c 69  f the.  ** "sqli
b040: 74 65 5f 6d 61 73 74 65 72 22 20 6f 72 20 22 73  te_master" or "s
b050: 71 6c 69 74 65 5f 74 65 6d 70 5f 6d 61 73 74 65  qlite_temp_maste
b060: 72 22 20 74 61 62 6c 65 20 6f 6e 20 74 68 65 20  r" table on the 
b070: 64 69 73 6b 2e 0a 20 20 2a 2a 20 53 6f 20 64 6f  disk..  ** So do
b080: 20 6e 6f 74 20 77 72 69 74 65 20 74 6f 20 74 68   not write to th
b090: 65 20 64 69 73 6b 20 61 67 61 69 6e 2e 20 20 45  e disk again.  E
b0a0: 78 74 72 61 63 74 20 74 68 65 20 72 6f 6f 74 20  xtract the root 
b0b0: 70 61 67 65 20 6e 75 6d 62 65 72 0a 20 20 2a 2a  page number.  **
b0c0: 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20 66   for the table f
b0d0: 72 6f 6d 20 74 68 65 20 64 62 2d 3e 69 6e 69 74  rom the db->init
b0e0: 2e 6e 65 77 54 6e 75 6d 20 66 69 65 6c 64 2e 20  .newTnum field. 
b0f0: 20 28 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65   (The page numbe
b100: 72 0a 20 20 2a 2a 20 73 68 6f 75 6c 64 20 68 61  r.  ** should ha
b110: 76 65 20 62 65 65 6e 20 70 75 74 20 74 68 65 72  ve been put ther
b120: 65 20 62 79 20 74 68 65 20 73 71 6c 69 74 65 4f  e by the sqliteO
b130: 70 65 6e 43 62 20 72 6f 75 74 69 6e 65 2e 29 0a  penCb routine.).
b140: 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 69    */.  if( db->i
b150: 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20 20 20 20  nit.busy ){.    
b160: 70 2d 3e 74 6e 75 6d 20 3d 20 64 62 2d 3e 69 6e  p->tnum = db->in
b170: 69 74 2e 6e 65 77 54 6e 75 6d 3b 0a 20 20 7d 0a  it.newTnum;.  }.
b180: 0a 20 20 2f 2a 20 49 66 20 6e 6f 74 20 69 6e 69  .  /* If not ini
b190: 74 69 61 6c 69 7a 69 6e 67 2c 20 74 68 65 6e 20  tializing, then 
b1a0: 63 72 65 61 74 65 20 61 20 72 65 63 6f 72 64 20  create a record 
b1b0: 66 6f 72 20 74 68 65 20 6e 65 77 20 74 61 62 6c  for the new tabl
b1c0: 65 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 53 51  e.  ** in the SQ
b1d0: 4c 49 54 45 5f 4d 41 53 54 45 52 20 74 61 62 6c  LITE_MASTER tabl
b1e0: 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
b1f0: 65 2e 20 20 54 68 65 20 72 65 63 6f 72 64 20 6e  e.  The record n
b200: 75 6d 62 65 72 0a 20 20 2a 2a 20 66 6f 72 20 74  umber.  ** for t
b210: 68 65 20 6e 65 77 20 74 61 62 6c 65 20 65 6e 74  he new table ent
b220: 72 79 20 73 68 6f 75 6c 64 20 61 6c 72 65 61 64  ry should alread
b230: 79 20 62 65 20 6f 6e 20 74 68 65 20 73 74 61 63  y be on the stac
b240: 6b 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20  k..  **.  ** If 
b250: 74 68 69 73 20 69 73 20 61 20 54 45 4d 50 4f 52  this is a TEMPOR
b260: 41 52 59 20 74 61 62 6c 65 2c 20 77 72 69 74 65  ARY table, write
b270: 20 74 68 65 20 65 6e 74 72 79 20 69 6e 74 6f 20   the entry into 
b280: 74 68 65 20 61 75 78 69 6c 69 61 72 79 0a 20 20  the auxiliary.  
b290: 2a 2a 20 66 69 6c 65 20 69 6e 73 74 65 61 64 20  ** file instead 
b2a0: 6f 66 20 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e  of into the main
b2b0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
b2c0: 20 20 2a 2f 0a 20 20 69 66 28 20 21 64 62 2d 3e    */.  if( !db->
b2d0: 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20 20 20  init.busy ){.   
b2e0: 20 69 6e 74 20 6e 3b 0a 20 20 20 20 56 64 62 65   int n;.    Vdbe
b2f0: 20 2a 76 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a   *v;.    char *z
b300: 54 79 70 65 3b 20 20 20 20 2f 2a 20 22 76 69 65  Type;    /* "vie
b310: 77 22 20 6f 72 20 22 74 61 62 6c 65 22 20 2a 2f  w" or "table" */
b320: 0a 20 20 20 20 63 68 61 72 20 2a 7a 54 79 70 65  .    char *zType
b330: 32 3b 20 20 20 2f 2a 20 22 56 49 45 57 22 20 6f  2;   /* "VIEW" o
b340: 72 20 22 54 41 42 4c 45 22 20 2a 2f 0a 20 20 20  r "TABLE" */.   
b350: 20 63 68 61 72 20 2a 7a 53 74 6d 74 3b 20 20 20   char *zStmt;   
b360: 20 2f 2a 20 54 65 78 74 20 6f 66 20 74 68 65 20   /* Text of the 
b370: 43 52 45 41 54 45 20 54 41 42 4c 45 20 6f 72 20  CREATE TABLE or 
b380: 43 52 45 41 54 45 20 56 49 45 57 20 73 74 61 74  CREATE VIEW stat
b390: 65 6d 65 6e 74 20 2a 2f 0a 0a 20 20 20 20 76 20  ement */..    v 
b3a0: 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
b3b0: 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 69 66  (pParse);.    if
b3c0: 28 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ( v==0 ) return;
b3d0: 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ..    sqlite3Vdb
b3e0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f  eAddOp(v, OP_Clo
b3f0: 73 65 2c 20 30 2c 20 30 29 3b 0a 0a 20 20 20 20  se, 0, 0);..    
b400: 2f 2a 20 43 72 65 61 74 65 20 74 68 65 20 72 6f  /* Create the ro
b410: 6f 74 70 61 67 65 20 66 6f 72 20 74 68 65 20 6e  otpage for the n
b420: 65 77 20 74 61 62 6c 65 20 61 6e 64 20 70 75 73  ew table and pus
b430: 68 20 69 74 20 6f 6e 74 6f 20 74 68 65 20 73 74  h it onto the st
b440: 61 63 6b 2e 0a 20 20 20 20 2a 2a 20 41 20 76 69  ack..    ** A vi
b450: 65 77 20 68 61 73 20 6e 6f 20 72 6f 6f 74 70 61  ew has no rootpa
b460: 67 65 2c 20 73 6f 20 6a 75 73 74 20 70 75 73 68  ge, so just push
b470: 20 61 20 7a 65 72 6f 20 6f 6e 74 6f 20 74 68 65   a zero onto the
b480: 20 73 74 61 63 6b 20 66 6f 72 0a 20 20 20 20 2a   stack for.    *
b490: 2a 20 76 69 65 77 73 2e 20 20 49 6e 69 74 69 61  * views.  Initia
b4a0: 6c 69 7a 65 20 7a 54 79 70 65 20 61 74 20 74 68  lize zType at th
b4b0: 65 20 73 61 6d 65 20 74 69 6d 65 2e 0a 20 20 20  e same time..   
b4c0: 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 70   */.    if( p->p
b4d0: 53 65 6c 65 63 74 3d 3d 30 20 29 7b 0a 20 20 20  Select==0 ){.   
b4e0: 20 20 20 2f 2a 20 41 20 72 65 67 75 6c 61 72 20     /* A regular 
b4f0: 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 7a  table */.      z
b500: 54 79 70 65 20 3d 20 22 74 61 62 6c 65 22 3b 0a  Type = "table";.
b510: 20 20 20 20 20 20 7a 54 79 70 65 32 20 3d 20 22        zType2 = "
b520: 54 41 42 4c 45 22 3b 0a 23 69 66 6e 64 65 66 20  TABLE";.#ifndef 
b530: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57  SQLITE_OMIT_VIEW
b540: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
b550: 20 20 2f 2a 20 41 20 76 69 65 77 20 2a 2f 0a 20    /* A view */. 
b560: 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22 76 69       zType = "vi
b570: 65 77 22 3b 0a 20 20 20 20 20 20 7a 54 79 70 65  ew";.      zType
b580: 32 20 3d 20 22 56 49 45 57 22 3b 0a 23 65 6e 64  2 = "VIEW";.#end
b590: 69 66 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  if.    }..    /*
b5a0: 20 49 66 20 74 68 69 73 20 69 73 20 61 20 43 52   If this is a CR
b5b0: 45 41 54 45 20 54 41 42 4c 45 20 78 78 20 41 53  EATE TABLE xx AS
b5c0: 20 53 45 4c 45 43 54 20 2e 2e 2e 2c 20 65 78 65   SELECT ..., exe
b5d0: 63 75 74 65 20 74 68 65 20 53 45 4c 45 43 54 0a  cute the SELECT.
b5e0: 20 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74      ** statement
b5f0: 20 74 6f 20 70 6f 70 75 6c 61 74 65 20 74 68 65   to populate the
b600: 20 6e 65 77 20 74 61 62 6c 65 2e 20 54 68 65 20   new table. The 
b610: 72 6f 6f 74 2d 70 61 67 65 20 6e 75 6d 62 65 72  root-page number
b620: 20 66 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a 20   for the.    ** 
b630: 6e 65 77 20 74 61 62 6c 65 20 69 73 20 6f 6e 20  new table is on 
b640: 74 68 65 20 74 6f 70 20 6f 66 20 74 68 65 20 76  the top of the v
b650: 64 62 65 20 73 74 61 63 6b 2e 0a 20 20 20 20 2a  dbe stack..    *
b660: 2a 0a 20 20 20 20 2a 2a 20 4f 6e 63 65 20 74 68  *.    ** Once th
b670: 65 20 53 45 4c 45 43 54 20 68 61 73 20 62 65 65  e SELECT has bee
b680: 6e 20 63 6f 64 65 64 20 62 79 20 73 71 6c 69 74  n coded by sqlit
b690: 65 33 53 65 6c 65 63 74 28 29 2c 20 69 74 20 69  e3Select(), it i
b6a0: 73 20 69 6e 20 61 0a 20 20 20 20 2a 2a 20 73 75  s in a.    ** su
b6b0: 69 74 61 62 6c 65 20 73 74 61 74 65 20 74 6f 20  itable state to 
b6c0: 71 75 65 72 79 20 66 6f 72 20 74 68 65 20 63 6f  query for the co
b6d0: 6c 75 6d 6e 20 6e 61 6d 65 73 20 61 6e 64 20 74  lumn names and t
b6e0: 79 70 65 73 20 74 6f 20 62 65 20 75 73 65 64 0a  ypes to be used.
b6f0: 20 20 20 20 2a 2a 20 62 79 20 74 68 65 20 6e 65      ** by the ne
b700: 77 20 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2a 0a  w table..    **.
b710: 20 20 20 20 2a 2a 20 41 20 73 68 61 72 65 64 2d      ** A shared-
b720: 63 61 63 68 65 20 77 72 69 74 65 2d 6c 6f 63 6b  cache write-lock
b730: 20 69 73 20 6e 6f 74 20 72 65 71 75 69 72 65 64   is not required
b740: 20 74 6f 20 77 72 69 74 65 20 74 6f 20 74 68 65   to write to the
b750: 20 6e 65 77 20 74 61 62 6c 65 2c 0a 20 20 20 20   new table,.    
b760: 2a 2a 20 61 73 20 61 20 73 63 68 65 6d 61 2d 6c  ** as a schema-l
b770: 6f 63 6b 20 6d 75 73 74 20 68 61 76 65 20 61 6c  ock must have al
b780: 72 65 61 64 79 20 62 65 65 6e 20 6f 62 74 61 69  ready been obtai
b790: 6e 65 64 20 74 6f 20 63 72 65 61 74 65 20 69 74  ned to create it
b7a0: 2e 20 53 69 6e 63 65 0a 20 20 20 20 2a 2a 20 61  . Since.    ** a
b7b0: 20 73 63 68 65 6d 61 2d 6c 6f 63 6b 20 65 78 63   schema-lock exc
b7c0: 6c 75 64 65 73 20 61 6c 6c 20 6f 74 68 65 72 20  ludes all other 
b7d0: 64 61 74 61 62 61 73 65 20 75 73 65 72 73 2c 20  database users, 
b7e0: 74 68 65 20 77 72 69 74 65 2d 6c 6f 63 6b 20 77  the write-lock w
b7f0: 6f 75 6c 64 0a 20 20 20 20 2a 2a 20 62 65 20 72  ould.    ** be r
b800: 65 64 75 6e 64 61 6e 74 2e 0a 20 20 20 20 2a 2f  edundant..    */
b810: 0a 20 20 20 20 69 66 28 20 70 53 65 6c 65 63 74  .    if( pSelect
b820: 20 29 7b 0a 20 20 20 20 20 20 54 61 62 6c 65 20   ){.      Table 
b830: 2a 70 53 65 6c 54 61 62 3b 0a 20 20 20 20 20 20  *pSelTab;.      
b840: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
b850: 28 76 2c 20 4f 50 5f 44 75 70 2c 20 30 2c 20 30  (v, OP_Dup, 0, 0
b860: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
b870: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
b880: 49 6e 74 65 67 65 72 2c 20 69 44 62 2c 20 30 29  Integer, iDb, 0)
b890: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
b8a0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f  dbeAddOp(v, OP_O
b8b0: 70 65 6e 57 72 69 74 65 2c 20 31 2c 20 30 29 3b  penWrite, 1, 0);
b8c0: 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  .      pParse->n
b8d0: 54 61 62 20 3d 20 32 3b 0a 20 20 20 20 20 20 73  Tab = 2;.      s
b8e0: 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61  qlite3Select(pPa
b8f0: 72 73 65 2c 20 70 53 65 6c 65 63 74 2c 20 53 52  rse, pSelect, SR
b900: 54 5f 54 61 62 6c 65 2c 20 31 2c 20 30 2c 20 30  T_Table, 1, 0, 0
b910: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  , 0, 0);.      s
b920: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
b930: 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 31 2c 20  v, OP_Close, 1, 
b940: 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50  0);.      if( pP
b950: 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 29 7b  arse->nErr==0 ){
b960: 0a 20 20 20 20 20 20 20 20 70 53 65 6c 54 61 62  .        pSelTab
b970: 20 3d 20 73 71 6c 69 74 65 33 52 65 73 75 6c 74   = sqlite3Result
b980: 53 65 74 4f 66 53 65 6c 65 63 74 28 70 50 61 72  SetOfSelect(pPar
b990: 73 65 2c 20 30 2c 20 70 53 65 6c 65 63 74 29 3b  se, 0, pSelect);
b9a0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 53 65  .        if( pSe
b9b0: 6c 54 61 62 3d 3d 30 20 29 20 72 65 74 75 72 6e  lTab==0 ) return
b9c0: 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
b9d0: 28 20 70 2d 3e 61 43 6f 6c 3d 3d 30 20 29 3b 0a  ( p->aCol==0 );.
b9e0: 20 20 20 20 20 20 20 20 70 2d 3e 6e 43 6f 6c 20          p->nCol 
b9f0: 3d 20 70 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c 3b  = pSelTab->nCol;
ba00: 0a 20 20 20 20 20 20 20 20 70 2d 3e 61 43 6f 6c  .        p->aCol
ba10: 20 3d 20 70 53 65 6c 54 61 62 2d 3e 61 43 6f 6c   = pSelTab->aCol
ba20: 3b 0a 20 20 20 20 20 20 20 20 70 53 65 6c 54 61  ;.        pSelTa
ba30: 62 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20  b->nCol = 0;.   
ba40: 20 20 20 20 20 70 53 65 6c 54 61 62 2d 3e 61 43       pSelTab->aC
ba50: 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ol = 0;.        
ba60: 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62  sqlite3DeleteTab
ba70: 6c 65 28 70 53 65 6c 54 61 62 29 3b 0a 20 20 20  le(pSelTab);.   
ba80: 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
ba90: 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 63  /* Compute the c
baa0: 6f 6d 70 6c 65 74 65 20 74 65 78 74 20 6f 66 20  omplete text of 
bab0: 74 68 65 20 43 52 45 41 54 45 20 73 74 61 74 65  the CREATE state
bac0: 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 69 66 28 20  ment */.    if( 
bad0: 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20  pSelect ){.     
bae0: 20 7a 53 74 6d 74 20 3d 20 63 72 65 61 74 65 54   zStmt = createT
baf0: 61 62 6c 65 53 74 6d 74 28 70 2c 20 70 2d 3e 70  ableStmt(p, p->p
bb00: 53 63 68 65 6d 61 3d 3d 64 62 2d 3e 61 44 62 5b  Schema==db->aDb[
bb10: 31 5d 2e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20  1].pSchema);.   
bb20: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 20   }else{.      n 
bb30: 3d 20 70 45 6e 64 2d 3e 7a 20 2d 20 70 50 61 72  = pEnd->z - pPar
bb40: 73 65 2d 3e 73 4e 61 6d 65 54 6f 6b 65 6e 2e 7a  se->sNameToken.z
bb50: 20 2b 20 31 3b 0a 20 20 20 20 20 20 7a 53 74 6d   + 1;.      zStm
bb60: 74 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e  t = sqlite3MPrin
bb70: 74 66 28 64 62 2c 20 0a 20 20 20 20 20 20 20 20  tf(db, .        
bb80: 20 20 22 43 52 45 41 54 45 20 25 73 20 25 2e 2a    "CREATE %s %.*
bb90: 73 22 2c 20 7a 54 79 70 65 32 2c 20 6e 2c 20 70  s", zType2, n, p
bba0: 50 61 72 73 65 2d 3e 73 4e 61 6d 65 54 6f 6b 65  Parse->sNameToke
bbb0: 6e 2e 7a 0a 20 20 20 20 20 20 29 3b 0a 20 20 20  n.z.      );.   
bbc0: 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 20 73 6c 6f   }..    /* A slo
bbd0: 74 20 66 6f 72 20 74 68 65 20 72 65 63 6f 72 64  t for the record
bbe0: 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
bbf0: 6e 20 61 6c 6c 6f 63 61 74 65 64 20 69 6e 20 74  n allocated in t
bc00: 68 65 20 0a 20 20 20 20 2a 2a 20 53 51 4c 49 54  he .    ** SQLIT
bc10: 45 5f 4d 41 53 54 45 52 20 74 61 62 6c 65 2e 20  E_MASTER table. 
bc20: 20 57 65 20 6a 75 73 74 20 6e 65 65 64 20 74 6f   We just need to
bc30: 20 75 70 64 61 74 65 20 74 68 61 74 20 73 6c 6f   update that slo
bc40: 74 20 77 69 74 68 20 61 6c 6c 0a 20 20 20 20 2a  t with all.    *
bc50: 2a 20 74 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f  * the informatio
bc60: 6e 20 77 65 27 76 65 20 63 6f 6c 6c 65 63 74 65  n we've collecte
bc70: 64 2e 20 20 54 68 65 20 72 6f 77 69 64 20 66 6f  d.  The rowid fo
bc80: 72 20 74 68 65 20 70 72 65 61 6c 6c 6f 63 61 74  r the preallocat
bc90: 65 64 0a 20 20 20 20 2a 2a 20 73 6c 6f 74 20 69  ed.    ** slot i
bca0: 73 20 74 68 65 20 32 6e 64 20 69 74 65 6d 20 6f  s the 2nd item o
bcb0: 6e 20 74 68 65 20 73 74 61 63 6b 2e 20 20 54 68  n the stack.  Th
bcc0: 65 20 74 6f 70 20 6f 66 20 74 68 65 20 73 74 61  e top of the sta
bcd0: 63 6b 20 69 73 20 74 68 65 0a 20 20 20 20 2a 2a  ck is the.    **
bce0: 20 72 6f 6f 74 20 70 61 67 65 20 66 6f 72 20 74   root page for t
bcf0: 68 65 20 6e 65 77 20 74 61 62 6c 65 20 28 6f 72  he new table (or
bd00: 20 61 20 30 20 69 66 20 74 68 69 73 20 69 73 20   a 0 if this is 
bd10: 61 20 76 69 65 77 29 2e 0a 20 20 20 20 2a 2f 0a  a view)..    */.
bd20: 20 20 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65      sqlite3Neste
bd30: 64 50 61 72 73 65 28 70 50 61 72 73 65 2c 0a 20  dParse(pParse,. 
bd40: 20 20 20 20 20 22 55 50 44 41 54 45 20 25 51 2e       "UPDATE %Q.
bd50: 25 73 20 22 0a 20 20 20 20 20 20 20 20 20 22 53  %s ".         "S
bd60: 45 54 20 74 79 70 65 3d 27 25 73 27 2c 20 6e 61  ET type='%s', na
bd70: 6d 65 3d 25 51 2c 20 74 62 6c 5f 6e 61 6d 65 3d  me=%Q, tbl_name=
bd80: 25 51 2c 20 72 6f 6f 74 70 61 67 65 3d 23 30 2c  %Q, rootpage=#0,
bd90: 20 73 71 6c 3d 25 51 20 22 0a 20 20 20 20 20 20   sql=%Q ".      
bda0: 20 22 57 48 45 52 45 20 72 6f 77 69 64 3d 23 31   "WHERE rowid=#1
bdb0: 22 2c 0a 20 20 20 20 20 20 64 62 2d 3e 61 44 62  ",.      db->aDb
bdc0: 5b 69 44 62 5d 2e 7a 4e 61 6d 65 2c 20 53 43 48  [iDb].zName, SCH
bdd0: 45 4d 41 5f 54 41 42 4c 45 28 69 44 62 29 2c 0a  EMA_TABLE(iDb),.
bde0: 20 20 20 20 20 20 7a 54 79 70 65 2c 0a 20 20 20        zType,.   
bdf0: 20 20 20 70 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20     p->zName,.   
be00: 20 20 20 70 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20     p->zName,.   
be10: 20 20 20 7a 53 74 6d 74 0a 20 20 20 20 29 3b 0a     zStmt.    );.
be20: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
be30: 28 7a 53 74 6d 74 29 3b 0a 20 20 20 20 73 71 6c  (zStmt);.    sql
be40: 69 74 65 33 43 68 61 6e 67 65 43 6f 6f 6b 69 65  ite3ChangeCookie
be50: 28 64 62 2c 20 76 2c 20 69 44 62 29 3b 0a 0a 23  (db, v, iDb);..#
be60: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
be70: 49 54 5f 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54  IT_AUTOINCREMENT
be80: 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f  .    /* Check to
be90: 20 73 65 65 20 69 66 20 77 65 20 6e 65 65 64 20   see if we need 
bea0: 74 6f 20 63 72 65 61 74 65 20 61 6e 20 73 71 6c  to create an sql
beb0: 69 74 65 5f 73 65 71 75 65 6e 63 65 20 74 61 62  ite_sequence tab
bec0: 6c 65 20 66 6f 72 0a 20 20 20 20 2a 2a 20 6b 65  le for.    ** ke
bed0: 65 70 69 6e 67 20 74 72 61 63 6b 20 6f 66 20 61  eping track of a
bee0: 75 74 6f 69 6e 63 72 65 6d 65 6e 74 20 6b 65 79  utoincrement key
bef0: 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  s..    */.    if
bf00: 28 20 70 2d 3e 61 75 74 6f 49 6e 63 20 29 7b 0a  ( p->autoInc ){.
bf10: 20 20 20 20 20 20 44 62 20 2a 70 44 62 20 3d 20        Db *pDb = 
bf20: 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a 20  &db->aDb[iDb];. 
bf30: 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e 70 53       if( pDb->pS
bf40: 63 68 65 6d 61 2d 3e 70 53 65 71 54 61 62 3d 3d  chema->pSeqTab==
bf50: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  0 ){.        sql
bf60: 69 74 65 33 4e 65 73 74 65 64 50 61 72 73 65 28  ite3NestedParse(
bf70: 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20  pParse,.        
bf80: 20 20 22 43 52 45 41 54 45 20 54 41 42 4c 45 20    "CREATE TABLE 
bf90: 25 51 2e 73 71 6c 69 74 65 5f 73 65 71 75 65 6e  %Q.sqlite_sequen
bfa0: 63 65 28 6e 61 6d 65 2c 73 65 71 29 22 2c 0a 20  ce(name,seq)",. 
bfb0: 20 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 4e           pDb->zN
bfc0: 61 6d 65 0a 20 20 20 20 20 20 20 20 29 3b 0a 20  ame.        );. 
bfd0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e       }.    }.#en
bfe0: 64 69 66 0a 0a 20 20 20 20 2f 2a 20 52 65 70 61  dif..    /* Repa
bff0: 72 73 65 20 65 76 65 72 79 74 68 69 6e 67 20 74  rse everything t
c000: 6f 20 75 70 64 61 74 65 20 6f 75 72 20 69 6e 74  o update our int
c010: 65 72 6e 61 6c 20 64 61 74 61 20 73 74 72 75 63  ernal data struc
c020: 74 75 72 65 73 20 2a 2f 0a 20 20 20 20 73 71 6c  tures */.    sql
c030: 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f  ite3VdbeOp3(v, O
c040: 50 5f 50 61 72 73 65 53 63 68 65 6d 61 2c 20 69  P_ParseSchema, i
c050: 44 62 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 73  Db, 0,.        s
c060: 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62  qlite3MPrintf(db
c070: 2c 20 22 74 62 6c 5f 6e 61 6d 65 3d 27 25 71 27  , "tbl_name='%q'
c080: 22 2c 70 2d 3e 7a 4e 61 6d 65 29 2c 20 50 33 5f  ",p->zName), P3_
c090: 44 59 4e 41 4d 49 43 29 3b 0a 20 20 7d 0a 0a 0a  DYNAMIC);.  }...
c0a0: 20 20 2f 2a 20 41 64 64 20 74 68 65 20 74 61 62    /* Add the tab
c0b0: 6c 65 20 74 6f 20 74 68 65 20 69 6e 2d 6d 65 6d  le to the in-mem
c0c0: 6f 72 79 20 72 65 70 72 65 73 65 6e 74 61 74 69  ory representati
c0d0: 6f 6e 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  on of the databa
c0e0: 73 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64  se..  */.  if( d
c0f0: 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 26 26 20  b->init.busy && 
c100: 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 20  pParse->nErr==0 
c110: 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 4f  ){.    Table *pO
c120: 6c 64 3b 0a 20 20 20 20 46 4b 65 79 20 2a 70 46  ld;.    FKey *pF
c130: 4b 65 79 3b 20 0a 20 20 20 20 53 63 68 65 6d 61  Key; .    Schema
c140: 20 2a 70 53 63 68 65 6d 61 20 3d 20 70 2d 3e 70   *pSchema = p->p
c150: 53 63 68 65 6d 61 3b 0a 20 20 20 20 70 4f 6c 64  Schema;.    pOld
c160: 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e   = sqlite3HashIn
c170: 73 65 72 74 28 26 70 53 63 68 65 6d 61 2d 3e 74  sert(&pSchema->t
c180: 62 6c 48 61 73 68 2c 20 70 2d 3e 7a 4e 61 6d 65  blHash, p->zName
c190: 2c 20 73 74 72 6c 65 6e 28 70 2d 3e 7a 4e 61 6d  , strlen(p->zNam
c1a0: 65 29 2b 31 2c 70 29 3b 0a 20 20 20 20 69 66 28  e)+1,p);.    if(
c1b0: 20 70 4f 6c 64 20 29 7b 0a 20 20 20 20 20 20 61   pOld ){.      a
c1c0: 73 73 65 72 74 28 20 70 3d 3d 70 4f 6c 64 20 29  ssert( p==pOld )
c1d0: 3b 20 20 2f 2a 20 4d 61 6c 6c 6f 63 20 6d 75 73  ;  /* Malloc mus
c1e0: 74 20 68 61 76 65 20 66 61 69 6c 65 64 20 69 6e  t have failed in
c1f0: 73 69 64 65 20 48 61 73 68 49 6e 73 65 72 74 28  side HashInsert(
c200: 29 20 2a 2f 0a 20 20 20 20 20 20 64 62 2d 3e 6d  ) */.      db->m
c210: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b  allocFailed = 1;
c220: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  .      return;. 
c230: 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c     }.#ifndef SQL
c240: 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e  ITE_OMIT_FOREIGN
c250: 5f 4b 45 59 0a 20 20 20 20 66 6f 72 28 70 46 4b  _KEY.    for(pFK
c260: 65 79 3d 70 2d 3e 70 46 4b 65 79 3b 20 70 46 4b  ey=p->pFKey; pFK
c270: 65 79 3b 20 70 46 4b 65 79 3d 70 46 4b 65 79 2d  ey; pFKey=pFKey-
c280: 3e 70 4e 65 78 74 46 72 6f 6d 29 7b 0a 20 20 20  >pNextFrom){.   
c290: 20 20 20 76 6f 69 64 20 2a 64 61 74 61 3b 0a 20     void *data;. 
c2a0: 20 20 20 20 20 69 6e 74 20 6e 54 6f 20 3d 20 73       int nTo = s
c2b0: 74 72 6c 65 6e 28 70 46 4b 65 79 2d 3e 7a 54 6f  trlen(pFKey->zTo
c2c0: 29 20 2b 20 31 3b 0a 20 20 20 20 20 20 70 46 4b  ) + 1;.      pFK
c2d0: 65 79 2d 3e 70 4e 65 78 74 54 6f 20 3d 20 73 71  ey->pNextTo = sq
c2e0: 6c 69 74 65 33 48 61 73 68 46 69 6e 64 28 26 70  lite3HashFind(&p
c2f0: 53 63 68 65 6d 61 2d 3e 61 46 4b 65 79 2c 20 70  Schema->aFKey, p
c300: 46 4b 65 79 2d 3e 7a 54 6f 2c 20 6e 54 6f 29 3b  FKey->zTo, nTo);
c310: 0a 20 20 20 20 20 20 64 61 74 61 20 3d 20 73 71  .      data = sq
c320: 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72 74 28  lite3HashInsert(
c330: 26 70 53 63 68 65 6d 61 2d 3e 61 46 4b 65 79 2c  &pSchema->aFKey,
c340: 20 70 46 4b 65 79 2d 3e 7a 54 6f 2c 20 6e 54 6f   pFKey->zTo, nTo
c350: 2c 20 70 46 4b 65 79 29 3b 0a 20 20 20 20 20 20  , pFKey);.      
c360: 69 66 28 20 64 61 74 61 3d 3d 28 76 6f 69 64 20  if( data==(void 
c370: 2a 29 70 46 4b 65 79 20 29 7b 0a 20 20 20 20 20  *)pFKey ){.     
c380: 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69     db->mallocFai
c390: 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d  led = 1;.      }
c3a0: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
c3b0: 20 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61    pParse->pNewTa
c3c0: 62 6c 65 20 3d 20 30 3b 0a 20 20 20 20 64 62 2d  ble = 0;.    db-
c3d0: 3e 6e 54 61 62 6c 65 2b 2b 3b 0a 20 20 20 20 64  >nTable++;.    d
c3e0: 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49  b->flags |= SQLI
c3f0: 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73  TE_InternChanges
c400: 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ;..#ifndef SQLIT
c410: 45 5f 4f 4d 49 54 5f 41 4c 54 45 52 54 41 42 4c  E_OMIT_ALTERTABL
c420: 45 0a 20 20 20 20 69 66 28 20 21 70 2d 3e 70 53  E.    if( !p->pS
c430: 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 63  elect ){.      c
c440: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
c450: 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a   = (const char *
c460: 29 70 50 61 72 73 65 2d 3e 73 4e 61 6d 65 54 6f  )pParse->sNameTo
c470: 6b 65 6e 2e 7a 3b 0a 20 20 20 20 20 20 69 6e 74  ken.z;.      int
c480: 20 6e 4e 61 6d 65 3b 0a 20 20 20 20 20 20 61 73   nName;.      as
c490: 73 65 72 74 28 20 21 70 53 65 6c 65 63 74 20 26  sert( !pSelect &
c4a0: 26 20 70 43 6f 6e 73 20 26 26 20 70 45 6e 64 20  & pCons && pEnd 
c4b0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 43 6f  );.      if( pCo
c4c0: 6e 73 2d 3e 7a 3d 3d 30 20 29 7b 0a 20 20 20 20  ns->z==0 ){.    
c4d0: 20 20 20 20 70 43 6f 6e 73 20 3d 20 70 45 6e 64      pCons = pEnd
c4e0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
c4f0: 6e 4e 61 6d 65 20 3d 20 28 63 6f 6e 73 74 20 63  nName = (const c
c500: 68 61 72 20 2a 29 70 43 6f 6e 73 2d 3e 7a 20 2d  har *)pCons->z -
c510: 20 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 70 2d   zName;.      p-
c520: 3e 61 64 64 43 6f 6c 4f 66 66 73 65 74 20 3d 20  >addColOffset = 
c530: 31 33 20 2b 20 73 71 6c 69 74 65 33 55 74 66 38  13 + sqlite3Utf8
c540: 43 68 61 72 4c 65 6e 28 7a 4e 61 6d 65 2c 20 6e  CharLen(zName, n
c550: 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 23 65 6e  Name);.    }.#en
c560: 64 69 66 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64  dif.  }.}..#ifnd
c570: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
c580: 49 45 57 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 61  IEW./*.** The pa
c590: 72 73 65 72 20 63 61 6c 6c 73 20 74 68 69 73 20  rser calls this 
c5a0: 72 6f 75 74 69 6e 65 20 69 6e 20 6f 72 64 65 72  routine in order
c5b0: 20 74 6f 20 63 72 65 61 74 65 20 61 20 6e 65 77   to create a new
c5c0: 20 56 49 45 57 0a 2a 2f 0a 76 6f 69 64 20 73 71   VIEW.*/.void sq
c5d0: 6c 69 74 65 33 43 72 65 61 74 65 56 69 65 77 28  lite3CreateView(
c5e0: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
c5f0: 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72  ,     /* The par
c600: 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
c610: 20 20 54 6f 6b 65 6e 20 2a 70 42 65 67 69 6e 2c    Token *pBegin,
c620: 20 20 20 20 20 2f 2a 20 54 68 65 20 43 52 45 41       /* The CREA
c630: 54 45 20 74 6f 6b 65 6e 20 74 68 61 74 20 62 65  TE token that be
c640: 67 69 6e 73 20 74 68 65 20 73 74 61 74 65 6d 65  gins the stateme
c650: 6e 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  nt */.  Token *p
c660: 4e 61 6d 65 31 2c 20 20 20 20 20 2f 2a 20 54 68  Name1,     /* Th
c670: 65 20 74 6f 6b 65 6e 20 74 68 61 74 20 68 6f 6c  e token that hol
c680: 64 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  ds the name of t
c690: 68 65 20 76 69 65 77 20 2a 2f 0a 20 20 54 6f 6b  he view */.  Tok
c6a0: 65 6e 20 2a 70 4e 61 6d 65 32 2c 20 20 20 20 20  en *pName2,     
c6b0: 2f 2a 20 54 68 65 20 74 6f 6b 65 6e 20 74 68 61  /* The token tha
c6c0: 74 20 68 6f 6c 64 73 20 74 68 65 20 6e 61 6d 65  t holds the name
c6d0: 20 6f 66 20 74 68 65 20 76 69 65 77 20 2a 2f 0a   of the view */.
c6e0: 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63    Select *pSelec
c6f0: 74 2c 20 20 20 2f 2a 20 41 20 53 45 4c 45 43 54  t,   /* A SELECT
c700: 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20   statement that 
c710: 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65 20  will become the 
c720: 6e 65 77 20 76 69 65 77 20 2a 2f 0a 20 20 69 6e  new view */.  in
c730: 74 20 69 73 54 65 6d 70 2c 20 20 20 20 20 20 20  t isTemp,       
c740: 20 2f 2a 20 54 52 55 45 20 66 6f 72 20 61 20 54   /* TRUE for a T
c750: 45 4d 50 4f 52 41 52 59 20 76 69 65 77 20 2a 2f  EMPORARY view */
c760: 0a 20 20 69 6e 74 20 6e 6f 45 72 72 20 20 20 20  .  int noErr    
c770: 20 20 20 20 20 20 2f 2a 20 53 75 70 70 72 65 73        /* Suppres
c780: 73 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73  s error messages
c790: 20 69 66 20 56 49 45 57 20 61 6c 72 65 61 64 79   if VIEW already
c7a0: 20 65 78 69 73 74 73 20 2a 2f 0a 29 7b 0a 20 20   exists */.){.  
c7b0: 54 61 62 6c 65 20 2a 70 3b 0a 20 20 69 6e 74 20  Table *p;.  int 
c7c0: 6e 3b 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67  n;.  const unsig
c7d0: 6e 65 64 20 63 68 61 72 20 2a 7a 3b 0a 20 20 54  ned char *z;.  T
c7e0: 6f 6b 65 6e 20 73 45 6e 64 3b 0a 20 20 44 62 46  oken sEnd;.  DbF
c7f0: 69 78 65 72 20 73 46 69 78 3b 0a 20 20 54 6f 6b  ixer sFix;.  Tok
c800: 65 6e 20 2a 70 4e 61 6d 65 3b 0a 20 20 69 6e 74  en *pName;.  int
c810: 20 69 44 62 3b 0a 20 20 73 71 6c 69 74 65 33 20   iDb;.  sqlite3 
c820: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
c830: 3b 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  ;..  if( pParse-
c840: 3e 6e 56 61 72 3e 30 20 29 7b 0a 20 20 20 20 73  >nVar>0 ){.    s
c850: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
c860: 50 61 72 73 65 2c 20 22 70 61 72 61 6d 65 74 65  Parse, "paramete
c870: 72 73 20 61 72 65 20 6e 6f 74 20 61 6c 6c 6f 77  rs are not allow
c880: 65 64 20 69 6e 20 76 69 65 77 73 22 29 3b 0a 20  ed in views");. 
c890: 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74     sqlite3Select
c8a0: 44 65 6c 65 74 65 28 70 53 65 6c 65 63 74 29 3b  Delete(pSelect);
c8b0: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
c8c0: 0a 20 20 73 71 6c 69 74 65 33 53 74 61 72 74 54  .  sqlite3StartT
c8d0: 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70 4e 61  able(pParse, pNa
c8e0: 6d 65 31 2c 20 70 4e 61 6d 65 32 2c 20 69 73 54  me1, pName2, isT
c8f0: 65 6d 70 2c 20 31 2c 20 30 2c 20 6e 6f 45 72 72  emp, 1, 0, noErr
c900: 29 3b 0a 20 20 70 20 3d 20 70 50 61 72 73 65 2d  );.  p = pParse-
c910: 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 69 66  >pNewTable;.  if
c920: 28 20 70 3d 3d 30 20 7c 7c 20 70 50 61 72 73 65  ( p==0 || pParse
c930: 2d 3e 6e 45 72 72 20 29 7b 0a 20 20 20 20 73 71  ->nErr ){.    sq
c940: 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74  lite3SelectDelet
c950: 65 28 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20  e(pSelect);.    
c960: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 73 71  return;.  }.  sq
c970: 6c 69 74 65 33 54 77 6f 50 61 72 74 4e 61 6d 65  lite3TwoPartName
c980: 28 70 50 61 72 73 65 2c 20 70 4e 61 6d 65 31 2c  (pParse, pName1,
c990: 20 70 4e 61 6d 65 32 2c 20 26 70 4e 61 6d 65 29   pName2, &pName)
c9a0: 3b 0a 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65  ;.  iDb = sqlite
c9b0: 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64  3SchemaToIndex(d
c9c0: 62 2c 20 70 2d 3e 70 53 63 68 65 6d 61 29 3b 0a  b, p->pSchema);.
c9d0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 46 69 78    if( sqlite3Fix
c9e0: 49 6e 69 74 28 26 73 46 69 78 2c 20 70 50 61 72  Init(&sFix, pPar
c9f0: 73 65 2c 20 69 44 62 2c 20 22 76 69 65 77 22 2c  se, iDb, "view",
ca00: 20 70 4e 61 6d 65 29 0a 20 20 20 20 26 26 20 73   pName).    && s
ca10: 71 6c 69 74 65 33 46 69 78 53 65 6c 65 63 74 28  qlite3FixSelect(
ca20: 26 73 46 69 78 2c 20 70 53 65 6c 65 63 74 29 0a  &sFix, pSelect).
ca30: 20 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33    ){.    sqlite3
ca40: 53 65 6c 65 63 74 44 65 6c 65 74 65 28 70 53 65  SelectDelete(pSe
ca50: 6c 65 63 74 29 3b 0a 20 20 20 20 72 65 74 75 72  lect);.    retur
ca60: 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b  n;.  }..  /* Mak
ca70: 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20  e a copy of the 
ca80: 65 6e 74 69 72 65 20 53 45 4c 45 43 54 20 73 74  entire SELECT st
ca90: 61 74 65 6d 65 6e 74 20 74 68 61 74 20 64 65 66  atement that def
caa0: 69 6e 65 73 20 74 68 65 20 76 69 65 77 2e 0a 20  ines the view.. 
cab0: 20 2a 2a 20 54 68 69 73 20 77 69 6c 6c 20 66 6f   ** This will fo
cac0: 72 63 65 20 61 6c 6c 20 74 68 65 20 45 78 70 72  rce all the Expr
cad0: 2e 74 6f 6b 65 6e 2e 7a 20 76 61 6c 75 65 73 20  .token.z values 
cae0: 74 6f 20 62 65 20 64 79 6e 61 6d 69 63 61 6c 6c  to be dynamicall
caf0: 79 0a 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 64  y.  ** allocated
cb00: 20 72 61 74 68 65 72 20 74 68 61 6e 20 70 6f 69   rather than poi
cb10: 6e 74 20 74 6f 20 74 68 65 20 69 6e 70 75 74 20  nt to the input 
cb20: 73 74 72 69 6e 67 20 2d 20 77 68 69 63 68 20 6d  string - which m
cb30: 65 61 6e 73 20 74 68 61 74 0a 20 20 2a 2a 20 74  eans that.  ** t
cb40: 68 65 79 20 77 69 6c 6c 20 70 65 72 73 69 73 74  hey will persist
cb50: 20 61 66 74 65 72 20 74 68 65 20 63 75 72 72 65   after the curre
cb60: 6e 74 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28  nt sqlite3_exec(
cb70: 29 20 63 61 6c 6c 20 72 65 74 75 72 6e 73 2e 0a  ) call returns..
cb80: 20 20 2a 2f 0a 20 20 70 2d 3e 70 53 65 6c 65 63    */.  p->pSelec
cb90: 74 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63  t = sqlite3Selec
cba0: 74 44 75 70 28 64 62 2c 20 70 53 65 6c 65 63 74  tDup(db, pSelect
cbb0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65  );.  sqlite3Sele
cbc0: 63 74 44 65 6c 65 74 65 28 70 53 65 6c 65 63 74  ctDelete(pSelect
cbd0: 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  );.  if( db->mal
cbe0: 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
cbf0: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69   return;.  }.  i
cc00: 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73  f( !db->init.bus
cc10: 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  y ){.    sqlite3
cc20: 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d  ViewGetColumnNam
cc30: 65 73 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20  es(pParse, p);. 
cc40: 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 63 61 74 65 20   }..  /* Locate 
cc50: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 43  the end of the C
cc60: 52 45 41 54 45 20 56 49 45 57 20 73 74 61 74 65  REATE VIEW state
cc70: 6d 65 6e 74 2e 20 20 4d 61 6b 65 20 73 45 6e 64  ment.  Make sEnd
cc80: 20 70 6f 69 6e 74 20 74 6f 0a 20 20 2a 2a 20 74   point to.  ** t
cc90: 68 65 20 65 6e 64 2e 0a 20 20 2a 2f 0a 20 20 73  he end..  */.  s
cca0: 45 6e 64 20 3d 20 70 50 61 72 73 65 2d 3e 73 4c  End = pParse->sL
ccb0: 61 73 74 54 6f 6b 65 6e 3b 0a 20 20 69 66 28 20  astToken;.  if( 
ccc0: 73 45 6e 64 2e 7a 5b 30 5d 21 3d 30 20 26 26 20  sEnd.z[0]!=0 && 
ccd0: 73 45 6e 64 2e 7a 5b 30 5d 21 3d 27 3b 27 20 29  sEnd.z[0]!=';' )
cce0: 7b 0a 20 20 20 20 73 45 6e 64 2e 7a 20 2b 3d 20  {.    sEnd.z += 
ccf0: 73 45 6e 64 2e 6e 3b 0a 20 20 7d 0a 20 20 73 45  sEnd.n;.  }.  sE
cd00: 6e 64 2e 6e 20 3d 20 30 3b 0a 20 20 6e 20 3d 20  nd.n = 0;.  n = 
cd10: 73 45 6e 64 2e 7a 20 2d 20 70 42 65 67 69 6e 2d  sEnd.z - pBegin-
cd20: 3e 7a 3b 0a 20 20 7a 20 3d 20 28 63 6f 6e 73 74  >z;.  z = (const
cd30: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29   unsigned char*)
cd40: 70 42 65 67 69 6e 2d 3e 7a 3b 0a 20 20 77 68 69  pBegin->z;.  whi
cd50: 6c 65 28 20 6e 3e 30 20 26 26 20 28 7a 5b 6e 2d  le( n>0 && (z[n-
cd60: 31 5d 3d 3d 27 3b 27 20 7c 7c 20 69 73 73 70 61  1]==';' || isspa
cd70: 63 65 28 7a 5b 6e 2d 31 5d 29 29 20 29 7b 20 6e  ce(z[n-1])) ){ n
cd80: 2d 2d 3b 20 7d 0a 20 20 73 45 6e 64 2e 7a 20 3d  --; }.  sEnd.z =
cd90: 20 26 7a 5b 6e 2d 31 5d 3b 0a 20 20 73 45 6e 64   &z[n-1];.  sEnd
cda0: 2e 6e 20 3d 20 31 3b 0a 0a 20 20 2f 2a 20 55 73  .n = 1;..  /* Us
cdb0: 65 20 73 71 6c 69 74 65 33 45 6e 64 54 61 62 6c  e sqlite3EndTabl
cdc0: 65 28 29 20 74 6f 20 61 64 64 20 74 68 65 20 76  e() to add the v
cdd0: 69 65 77 20 74 6f 20 74 68 65 20 53 51 4c 49 54  iew to the SQLIT
cde0: 45 5f 4d 41 53 54 45 52 20 74 61 62 6c 65 20 2a  E_MASTER table *
cdf0: 2f 0a 20 20 73 71 6c 69 74 65 33 45 6e 64 54 61  /.  sqlite3EndTa
ce00: 62 6c 65 28 70 50 61 72 73 65 2c 20 30 2c 20 26  ble(pParse, 0, &
ce10: 73 45 6e 64 2c 20 30 29 3b 0a 20 20 72 65 74 75  sEnd, 0);.  retu
ce20: 72 6e 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  rn;.}.#endif /* 
ce30: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57  SQLITE_OMIT_VIEW
ce40: 20 2a 2f 0a 0a 23 69 66 20 21 64 65 66 69 6e 65   */..#if !define
ce50: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  d(SQLITE_OMIT_VI
ce60: 45 57 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28  EW) || !defined(
ce70: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
ce80: 55 41 4c 54 41 42 4c 45 29 0a 2f 2a 0a 2a 2a 20  UALTABLE)./*.** 
ce90: 54 68 65 20 54 61 62 6c 65 20 73 74 72 75 63 74  The Table struct
cea0: 75 72 65 20 70 54 61 62 6c 65 20 69 73 20 72 65  ure pTable is re
ceb0: 61 6c 6c 79 20 61 20 56 49 45 57 2e 20 20 46 69  ally a VIEW.  Fi
cec0: 6c 6c 20 69 6e 20 74 68 65 20 6e 61 6d 65 73 20  ll in the names 
ced0: 6f 66 0a 2a 2a 20 74 68 65 20 63 6f 6c 75 6d 6e  of.** the column
cee0: 73 20 6f 66 20 74 68 65 20 76 69 65 77 20 69 6e  s of the view in
cef0: 20 74 68 65 20 70 54 61 62 6c 65 20 73 74 72 75   the pTable stru
cf00: 63 74 75 72 65 2e 20 20 52 65 74 75 72 6e 20 74  cture.  Return t
cf10: 68 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66 20  he number.** of 
cf20: 65 72 72 6f 72 73 2e 20 20 49 66 20 61 6e 20 65  errors.  If an e
cf30: 72 72 6f 72 20 69 73 20 73 65 65 6e 20 6c 65 61  rror is seen lea
cf40: 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73  ve an error mess
cf50: 61 67 65 20 69 6e 20 70 50 61 72 73 65 2d 3e 7a  age in pParse->z
cf60: 45 72 72 4d 73 67 2e 0a 2a 2f 0a 69 6e 74 20 73  ErrMsg..*/.int s
cf70: 71 6c 69 74 65 33 56 69 65 77 47 65 74 43 6f 6c  qlite3ViewGetCol
cf80: 75 6d 6e 4e 61 6d 65 73 28 50 61 72 73 65 20 2a  umnNames(Parse *
cf90: 70 50 61 72 73 65 2c 20 54 61 62 6c 65 20 2a 70  pParse, Table *p
cfa0: 54 61 62 6c 65 29 7b 0a 20 20 54 61 62 6c 65 20  Table){.  Table 
cfb0: 2a 70 53 65 6c 54 61 62 3b 20 20 20 2f 2a 20 41  *pSelTab;   /* A
cfc0: 20 66 61 6b 65 20 74 61 62 6c 65 20 66 72 6f 6d   fake table from
cfd0: 20 77 68 69 63 68 20 77 65 20 67 65 74 20 74 68   which we get th
cfe0: 65 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a  e result set */.
cff0: 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 3b 20    Select *pSel; 
d000: 20 20 20 20 2f 2a 20 43 6f 70 79 20 6f 66 20 74      /* Copy of t
d010: 68 65 20 53 45 4c 45 43 54 20 74 68 61 74 20 69  he SELECT that i
d020: 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 76 69  mplements the vi
d030: 65 77 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 72 72  ew */.  int nErr
d040: 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 4e 75 6d   = 0;     /* Num
d050: 62 65 72 20 6f 66 20 65 72 72 6f 72 73 20 65 6e  ber of errors en
d060: 63 6f 75 6e 74 65 72 65 64 20 2a 2f 0a 20 20 69  countered */.  i
d070: 6e 74 20 6e 3b 20 20 20 20 20 20 20 20 20 20 20  nt n;           
d080: 20 2f 2a 20 54 65 6d 70 6f 72 61 72 69 6c 79 20   /* Temporarily 
d090: 68 6f 6c 64 73 20 74 68 65 20 6e 75 6d 62 65 72  holds the number
d0a0: 20 6f 66 20 63 75 72 73 6f 72 73 20 61 73 73 69   of cursors assi
d0b0: 67 6e 65 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65  gned */.  sqlite
d0c0: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
d0d0: 64 62 3b 20 20 2f 2a 20 44 61 74 61 62 61 73 65  db;  /* Database
d0e0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 66 6f 72 20   connection for 
d0f0: 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 73 20 2a 2f  malloc errors */
d100: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 54 61 62  ..  assert( pTab
d110: 6c 65 20 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53  le );..#ifndef S
d120: 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
d130: 41 4c 54 41 42 4c 45 0a 20 20 69 66 28 20 73 71  ALTABLE.  if( sq
d140: 6c 69 74 65 33 56 74 61 62 43 61 6c 6c 43 6f 6e  lite3VtabCallCon
d150: 6e 65 63 74 28 70 50 61 72 73 65 2c 20 70 54 61  nect(pParse, pTa
d160: 62 6c 65 29 20 29 7b 0a 20 20 20 20 72 65 74 75  ble) ){.    retu
d170: 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b  rn SQLITE_ERROR;
d180: 0a 20 20 7d 0a 20 20 69 66 28 20 49 73 56 69 72  .  }.  if( IsVir
d190: 74 75 61 6c 28 70 54 61 62 6c 65 29 20 29 20 72  tual(pTable) ) r
d1a0: 65 74 75 72 6e 20 30 3b 0a 23 65 6e 64 69 66 0a  eturn 0;.#endif.
d1b0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
d1c0: 4f 4d 49 54 5f 56 49 45 57 0a 20 20 2f 2a 20 41  OMIT_VIEW.  /* A
d1d0: 20 70 6f 73 69 74 69 76 65 20 6e 43 6f 6c 20 6d   positive nCol m
d1e0: 65 61 6e 73 20 74 68 65 20 63 6f 6c 75 6d 6e 73  eans the columns
d1f0: 20 6e 61 6d 65 73 20 66 6f 72 20 74 68 69 73 20   names for this 
d200: 76 69 65 77 20 61 72 65 0a 20 20 2a 2a 20 61 6c  view are.  ** al
d210: 72 65 61 64 79 20 6b 6e 6f 77 6e 2e 0a 20 20 2a  ready known..  *
d220: 2f 0a 20 20 69 66 28 20 70 54 61 62 6c 65 2d 3e  /.  if( pTable->
d230: 6e 43 6f 6c 3e 30 20 29 20 72 65 74 75 72 6e 20  nCol>0 ) return 
d240: 30 3b 0a 0a 20 20 2f 2a 20 41 20 6e 65 67 61 74  0;..  /* A negat
d250: 69 76 65 20 6e 43 6f 6c 20 69 73 20 61 20 73 70  ive nCol is a sp
d260: 65 63 69 61 6c 20 6d 61 72 6b 65 72 20 6d 65 61  ecial marker mea
d270: 6e 69 6e 67 20 74 68 61 74 20 77 65 20 61 72 65  ning that we are
d280: 20 63 75 72 72 65 6e 74 6c 79 0a 20 20 2a 2a 20   currently.  ** 
d290: 74 72 79 69 6e 67 20 74 6f 20 63 6f 6d 70 75 74  trying to comput
d2a0: 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d  e the column nam
d2b0: 65 73 2e 20 20 49 66 20 77 65 20 65 6e 74 65 72  es.  If we enter
d2c0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69   this routine wi
d2d0: 74 68 0a 20 20 2a 2a 20 61 20 6e 65 67 61 74 69  th.  ** a negati
d2e0: 76 65 20 6e 43 6f 6c 2c 20 69 74 20 6d 65 61 6e  ve nCol, it mean
d2f0: 73 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 76 69  s two or more vi
d300: 65 77 73 20 66 6f 72 6d 20 61 20 6c 6f 6f 70 2c  ews form a loop,
d310: 20 6c 69 6b 65 20 74 68 69 73 3a 0a 20 20 2a 2a   like this:.  **
d320: 0a 20 20 2a 2a 20 20 20 20 20 43 52 45 41 54 45  .  **     CREATE
d330: 20 56 49 45 57 20 6f 6e 65 20 41 53 20 53 45 4c   VIEW one AS SEL
d340: 45 43 54 20 2a 20 46 52 4f 4d 20 74 77 6f 3b 0a  ECT * FROM two;.
d350: 20 20 2a 2a 20 20 20 20 20 43 52 45 41 54 45 20    **     CREATE 
d360: 56 49 45 57 20 74 77 6f 20 41 53 20 53 45 4c 45  VIEW two AS SELE
d370: 43 54 20 2a 20 46 52 4f 4d 20 6f 6e 65 3b 0a 20  CT * FROM one;. 
d380: 20 2a 2a 0a 20 20 2a 2a 20 41 63 74 75 61 6c 6c   **.  ** Actuall
d390: 79 2c 20 74 68 69 73 20 65 72 72 6f 72 20 69 73  y, this error is
d3a0: 20 63 61 75 67 68 74 20 70 72 65 76 69 6f 75 73   caught previous
d3b0: 6c 79 20 61 6e 64 20 73 6f 20 74 68 65 20 66 6f  ly and so the fo
d3c0: 6c 6c 6f 77 69 6e 67 20 74 65 73 74 0a 20 20 2a  llowing test.  *
d3d0: 2a 20 73 68 6f 75 6c 64 20 61 6c 77 61 79 73 20  * should always 
d3e0: 66 61 69 6c 2e 20 20 42 75 74 20 77 65 20 77 69  fail.  But we wi
d3f0: 6c 6c 20 6c 65 61 76 65 20 69 74 20 69 6e 20 70  ll leave it in p
d400: 6c 61 63 65 20 6a 75 73 74 20 74 6f 20 62 65 20  lace just to be 
d410: 73 61 66 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  safe..  */.  if(
d420: 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3c 30 20   pTable->nCol<0 
d430: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
d440: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
d450: 76 69 65 77 20 25 73 20 69 73 20 63 69 72 63 75  view %s is circu
d460: 6c 61 72 6c 79 20 64 65 66 69 6e 65 64 22 2c 20  larly defined", 
d470: 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 29 3b 0a  pTable->zName);.
d480: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
d490: 7d 0a 20 20 61 73 73 65 72 74 28 20 70 54 61 62  }.  assert( pTab
d4a0: 6c 65 2d 3e 6e 43 6f 6c 3e 3d 30 20 29 3b 0a 0a  le->nCol>=0 );..
d4b0: 20 20 2f 2a 20 49 66 20 77 65 20 67 65 74 20 74    /* If we get t
d4c0: 68 69 73 20 66 61 72 2c 20 69 74 20 6d 65 61 6e  his far, it mean
d4d0: 73 20 77 65 20 6e 65 65 64 20 74 6f 20 63 6f 6d  s we need to com
d4e0: 70 75 74 65 20 74 68 65 20 74 61 62 6c 65 20 6e  pute the table n
d4f0: 61 6d 65 73 2e 0a 20 20 2a 2a 20 4e 6f 74 65 20  ames..  ** Note 
d500: 74 68 61 74 20 74 68 65 20 63 61 6c 6c 20 74 6f  that the call to
d510: 20 73 71 6c 69 74 65 33 52 65 73 75 6c 74 53 65   sqlite3ResultSe
d520: 74 4f 66 53 65 6c 65 63 74 28 29 20 77 69 6c 6c  tOfSelect() will
d530: 20 65 78 70 61 6e 64 20 61 6e 79 0a 20 20 2a 2a   expand any.  **
d540: 20 22 2a 22 20 65 6c 65 6d 65 6e 74 73 20 69 6e   "*" elements in
d550: 20 74 68 65 20 72 65 73 75 6c 74 73 20 73 65 74   the results set
d560: 20 6f 66 20 74 68 65 20 76 69 65 77 20 61 6e 64   of the view and
d570: 20 77 69 6c 6c 20 61 73 73 69 67 6e 20 63 75 72   will assign cur
d580: 73 6f 72 73 0a 20 20 2a 2a 20 74 6f 20 74 68 65  sors.  ** to the
d590: 20 65 6c 65 6d 65 6e 74 73 20 6f 66 20 74 68 65   elements of the
d5a0: 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20 42   FROM clause.  B
d5b0: 75 74 20 77 65 20 64 6f 20 6e 6f 74 20 77 61 6e  ut we do not wan
d5c0: 74 20 74 68 65 73 65 20 63 68 61 6e 67 65 73 0a  t these changes.
d5d0: 20 20 2a 2a 20 74 6f 20 62 65 20 70 65 72 6d 61    ** to be perma
d5e0: 6e 65 6e 74 2e 20 20 53 6f 20 74 68 65 20 63 6f  nent.  So the co
d5f0: 6d 70 75 74 61 74 69 6f 6e 20 69 73 20 64 6f 6e  mputation is don
d600: 65 20 6f 6e 20 61 20 63 6f 70 79 20 6f 66 20 74  e on a copy of t
d610: 68 65 20 53 45 4c 45 43 54 0a 20 20 2a 2a 20 73  he SELECT.  ** s
d620: 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20 64 65  tatement that de
d630: 66 69 6e 65 73 20 74 68 65 20 76 69 65 77 2e 0a  fines the view..
d640: 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
d650: 54 61 62 6c 65 2d 3e 70 53 65 6c 65 63 74 20 29  Table->pSelect )
d660: 3b 0a 20 20 70 53 65 6c 20 3d 20 73 71 6c 69 74  ;.  pSel = sqlit
d670: 65 33 53 65 6c 65 63 74 44 75 70 28 64 62 2c 20  e3SelectDup(db, 
d680: 70 54 61 62 6c 65 2d 3e 70 53 65 6c 65 63 74 29  pTable->pSelect)
d690: 3b 0a 20 20 69 66 28 20 70 53 65 6c 20 29 7b 0a  ;.  if( pSel ){.
d6a0: 20 20 20 20 6e 20 3d 20 70 50 61 72 73 65 2d 3e      n = pParse->
d6b0: 6e 54 61 62 3b 0a 20 20 20 20 73 71 6c 69 74 65  nTab;.    sqlite
d6c0: 33 53 72 63 4c 69 73 74 41 73 73 69 67 6e 43 75  3SrcListAssignCu
d6d0: 72 73 6f 72 73 28 70 50 61 72 73 65 2c 20 70 53  rsors(pParse, pS
d6e0: 65 6c 2d 3e 70 53 72 63 29 3b 0a 20 20 20 20 70  el->pSrc);.    p
d6f0: 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 2d 31  Table->nCol = -1
d700: 3b 0a 20 20 20 20 70 53 65 6c 54 61 62 20 3d 20  ;.    pSelTab = 
d710: 73 71 6c 69 74 65 33 52 65 73 75 6c 74 53 65 74  sqlite3ResultSet
d720: 4f 66 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  OfSelect(pParse,
d730: 20 30 2c 20 70 53 65 6c 29 3b 0a 20 20 20 20 70   0, pSel);.    p
d740: 50 61 72 73 65 2d 3e 6e 54 61 62 20 3d 20 6e 3b  Parse->nTab = n;
d750: 0a 20 20 20 20 69 66 28 20 70 53 65 6c 54 61 62  .    if( pSelTab
d760: 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
d770: 28 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 3d 3d  ( pTable->aCol==
d780: 30 20 29 3b 0a 20 20 20 20 20 20 70 54 61 62 6c  0 );.      pTabl
d790: 65 2d 3e 6e 43 6f 6c 20 3d 20 70 53 65 6c 54 61  e->nCol = pSelTa
d7a0: 62 2d 3e 6e 43 6f 6c 3b 0a 20 20 20 20 20 20 70  b->nCol;.      p
d7b0: 54 61 62 6c 65 2d 3e 61 43 6f 6c 20 3d 20 70 53  Table->aCol = pS
d7c0: 65 6c 54 61 62 2d 3e 61 43 6f 6c 3b 0a 20 20 20  elTab->aCol;.   
d7d0: 20 20 20 70 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c     pSelTab->nCol
d7e0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 53 65 6c   = 0;.      pSel
d7f0: 54 61 62 2d 3e 61 43 6f 6c 20 3d 20 30 3b 0a 20  Tab->aCol = 0;. 
d800: 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 6c 65       sqlite3Dele
d810: 74 65 54 61 62 6c 65 28 70 53 65 6c 54 61 62 29  teTable(pSelTab)
d820: 3b 0a 20 20 20 20 20 20 70 54 61 62 6c 65 2d 3e  ;.      pTable->
d830: 70 53 63 68 65 6d 61 2d 3e 66 6c 61 67 73 20 7c  pSchema->flags |
d840: 3d 20 44 42 5f 55 6e 72 65 73 65 74 56 69 65 77  = DB_UnresetView
d850: 73 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  s;.    }else{.  
d860: 20 20 20 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c      pTable->nCol
d870: 20 3d 20 30 3b 0a 20 20 20 20 20 20 6e 45 72 72   = 0;.      nErr
d880: 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  ++;.    }.    sq
d890: 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74  lite3SelectDelet
d8a0: 65 28 70 53 65 6c 29 3b 0a 20 20 7d 20 65 6c 73  e(pSel);.  } els
d8b0: 65 20 7b 0a 20 20 20 20 6e 45 72 72 2b 2b 3b 0a  e {.    nErr++;.
d8c0: 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51    }.#endif /* SQ
d8d0: 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 20 2a  LITE_OMIT_VIEW *
d8e0: 2f 0a 20 20 72 65 74 75 72 6e 20 6e 45 72 72 3b  /.  return nErr;
d8f0: 20 20 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21    .}.#endif /* !
d900: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
d910: 4d 49 54 5f 56 49 45 57 29 20 7c 7c 20 21 64 65  MIT_VIEW) || !de
d920: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
d930: 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 20  T_VIRTUALTABLE) 
d940: 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
d950: 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 2f 2a 0a  TE_OMIT_VIEW./*.
d960: 2a 2a 20 43 6c 65 61 72 20 74 68 65 20 63 6f 6c  ** Clear the col
d970: 75 6d 6e 20 6e 61 6d 65 73 20 66 72 6f 6d 20 65  umn names from e
d980: 76 65 72 79 20 56 49 45 57 20 69 6e 20 64 61 74  very VIEW in dat
d990: 61 62 61 73 65 20 69 64 78 2e 0a 2a 2f 0a 73 74  abase idx..*/.st
d9a0: 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65  atic void sqlite
d9b0: 56 69 65 77 52 65 73 65 74 41 6c 6c 28 73 71 6c  ViewResetAll(sql
d9c0: 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 69 64  ite3 *db, int id
d9d0: 78 29 7b 0a 20 20 48 61 73 68 45 6c 65 6d 20 2a  x){.  HashElem *
d9e0: 69 3b 0a 20 20 69 66 28 20 21 44 62 48 61 73 50  i;.  if( !DbHasP
d9f0: 72 6f 70 65 72 74 79 28 64 62 2c 20 69 64 78 2c  roperty(db, idx,
da00: 20 44 42 5f 55 6e 72 65 73 65 74 56 69 65 77 73   DB_UnresetViews
da10: 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f  ) ) return;.  fo
da20: 72 28 69 3d 73 71 6c 69 74 65 48 61 73 68 46 69  r(i=sqliteHashFi
da30: 72 73 74 28 26 64 62 2d 3e 61 44 62 5b 69 64 78  rst(&db->aDb[idx
da40: 5d 2e 70 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61  ].pSchema->tblHa
da50: 73 68 29 3b 20 69 3b 69 3d 73 71 6c 69 74 65 48  sh); i;i=sqliteH
da60: 61 73 68 4e 65 78 74 28 69 29 29 7b 0a 20 20 20  ashNext(i)){.   
da70: 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 73   Table *pTab = s
da80: 71 6c 69 74 65 48 61 73 68 44 61 74 61 28 69 29  qliteHashData(i)
da90: 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e  ;.    if( pTab->
daa0: 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20  pSelect ){.     
dab0: 20 73 71 6c 69 74 65 52 65 73 65 74 43 6f 6c 75   sqliteResetColu
dac0: 6d 6e 4e 61 6d 65 73 28 70 54 61 62 29 3b 0a 20  mnNames(pTab);. 
dad0: 20 20 20 7d 0a 20 20 7d 0a 20 20 44 62 43 6c 65     }.  }.  DbCle
dae0: 61 72 50 72 6f 70 65 72 74 79 28 64 62 2c 20 69  arProperty(db, i
daf0: 64 78 2c 20 44 42 5f 55 6e 72 65 73 65 74 56 69  dx, DB_UnresetVi
db00: 65 77 73 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20  ews);.}.#else.# 
db10: 64 65 66 69 6e 65 20 73 71 6c 69 74 65 56 69 65  define sqliteVie
db20: 77 52 65 73 65 74 41 6c 6c 28 41 2c 42 29 0a 23  wResetAll(A,B).#
db30: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
db40: 4f 4d 49 54 5f 56 49 45 57 20 2a 2f 0a 0a 2f 2a  OMIT_VIEW */../*
db50: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
db60: 6e 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74  n is called by t
db70: 68 65 20 56 44 42 45 20 74 6f 20 61 64 6a 75 73  he VDBE to adjus
db80: 74 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 73  t the internal s
db90: 63 68 65 6d 61 0a 2a 2a 20 75 73 65 64 20 62 79  chema.** used by
dba0: 20 53 51 4c 69 74 65 20 77 68 65 6e 20 74 68 65   SQLite when the
dbb0: 20 62 74 72 65 65 20 6c 61 79 65 72 20 6d 6f 76   btree layer mov
dbc0: 65 73 20 61 20 74 61 62 6c 65 20 72 6f 6f 74 20  es a table root 
dbd0: 70 61 67 65 2e 20 54 68 65 0a 2a 2a 20 72 6f 6f  page. The.** roo
dbe0: 74 2d 70 61 67 65 20 6f 66 20 61 20 74 61 62 6c  t-page of a tabl
dbf0: 65 20 6f 72 20 69 6e 64 65 78 20 69 6e 20 64 61  e or index in da
dc00: 74 61 62 61 73 65 20 69 44 62 20 68 61 73 20 63  tabase iDb has c
dc10: 68 61 6e 67 65 64 20 66 72 6f 6d 20 69 46 72 6f  hanged from iFro
dc20: 6d 0a 2a 2a 20 74 6f 20 69 54 6f 2e 0a 2a 2a 0a  m.** to iTo..**.
dc30: 2a 2a 20 54 69 63 6b 65 74 20 23 31 37 32 38 3a  ** Ticket #1728:
dc40: 20 20 54 68 65 20 73 79 6d 62 6f 6c 20 74 61 62    The symbol tab
dc50: 6c 65 20 6d 69 67 68 74 20 73 74 69 6c 6c 20 63  le might still c
dc60: 6f 6e 74 61 69 6e 20 69 6e 66 6f 72 6d 61 74 69  ontain informati
dc70: 6f 6e 0a 2a 2a 20 6f 6e 20 74 61 62 6c 65 73 20  on.** on tables 
dc80: 61 6e 64 2f 6f 72 20 69 6e 64 69 63 65 73 20 74  and/or indices t
dc90: 68 61 74 20 61 72 65 20 74 68 65 20 70 72 6f 63  hat are the proc
dca0: 65 73 73 20 6f 66 20 62 65 69 6e 67 20 64 65 6c  ess of being del
dcb0: 65 74 65 64 2e 0a 2a 2a 20 49 66 20 79 6f 75 20  eted..** If you 
dcc0: 61 72 65 20 75 6e 6c 75 63 6b 79 2c 20 6f 6e 65  are unlucky, one
dcd0: 20 6f 66 20 74 68 6f 73 65 20 64 65 6c 65 74 65   of those delete
dce0: 64 20 69 6e 64 69 63 65 73 20 6f 72 20 74 61 62  d indices or tab
dcf0: 6c 65 73 20 6d 69 67 68 74 0a 2a 2a 20 68 61 76  les might.** hav
dd00: 65 20 74 68 65 20 73 61 6d 65 20 72 6f 6f 74 70  e the same rootp
dd10: 61 67 65 20 6e 75 6d 62 65 72 20 61 73 20 74 68  age number as th
dd20: 65 20 72 65 61 6c 20 74 61 62 6c 65 20 6f 72 20  e real table or 
dd30: 69 6e 64 65 78 20 74 68 61 74 20 69 73 0a 2a 2a  index that is.**
dd40: 20 62 65 69 6e 67 20 6d 6f 76 65 64 2e 20 20 53   being moved.  S
dd50: 6f 20 77 65 20 63 61 6e 6e 6f 74 20 73 74 6f 70  o we cannot stop
dd60: 20 73 65 61 72 63 68 69 6e 67 20 61 66 74 65 72   searching after
dd70: 20 74 68 65 20 66 69 72 73 74 20 6d 61 74 63 68   the first match
dd80: 20 0a 2a 2a 20 62 65 63 61 75 73 65 20 74 68 65   .** because the
dd90: 20 66 69 72 73 74 20 6d 61 74 63 68 20 6d 69 67   first match mig
dda0: 68 74 20 62 65 20 66 6f 72 20 6f 6e 65 20 6f 66  ht be for one of
ddb0: 20 74 68 65 20 64 65 6c 65 74 65 64 20 69 6e 64   the deleted ind
ddc0: 69 63 65 73 0a 2a 2a 20 6f 72 20 74 61 62 6c 65  ices.** or table
ddd0: 73 20 61 6e 64 20 6e 6f 74 20 74 68 65 20 74 61  s and not the ta
dde0: 62 6c 65 2f 69 6e 64 65 78 20 74 68 61 74 20 69  ble/index that i
ddf0: 73 20 61 63 74 75 61 6c 6c 79 20 62 65 69 6e 67  s actually being
de00: 20 6d 6f 76 65 64 2e 0a 2a 2a 20 57 65 20 6d 75   moved..** We mu
de10: 73 74 20 63 6f 6e 74 69 6e 75 65 20 6c 6f 6f 70  st continue loop
de20: 69 6e 67 20 75 6e 74 69 6c 20 61 6c 6c 20 74 61  ing until all ta
de30: 62 6c 65 73 20 61 6e 64 20 69 6e 64 69 63 65 73  bles and indices
de40: 20 77 69 74 68 0a 2a 2a 20 72 6f 6f 74 70 61 67   with.** rootpag
de50: 65 3d 3d 69 46 72 6f 6d 20 68 61 76 65 20 62 65  e==iFrom have be
de60: 65 6e 20 63 6f 6e 76 65 72 74 65 64 20 74 6f 20  en converted to 
de70: 68 61 76 65 20 61 20 72 6f 6f 74 70 61 67 65 20  have a rootpage 
de80: 6f 66 20 69 54 6f 0a 2a 2a 20 69 6e 20 6f 72 64  of iTo.** in ord
de90: 65 72 20 74 6f 20 62 65 20 63 65 72 74 61 69 6e  er to be certain
dea0: 20 74 68 61 74 20 77 65 20 67 6f 74 20 74 68 65   that we got the
deb0: 20 72 69 67 68 74 20 6f 6e 65 2e 0a 2a 2f 0a 23   right one..*/.#
dec0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
ded0: 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 76 6f  IT_AUTOVACUUM.vo
dee0: 69 64 20 73 71 6c 69 74 65 33 52 6f 6f 74 50 61  id sqlite3RootPa
def0: 67 65 4d 6f 76 65 64 28 44 62 20 2a 70 44 62 2c  geMoved(Db *pDb,
df00: 20 69 6e 74 20 69 46 72 6f 6d 2c 20 69 6e 74 20   int iFrom, int 
df10: 69 54 6f 29 7b 0a 20 20 48 61 73 68 45 6c 65 6d  iTo){.  HashElem
df20: 20 2a 70 45 6c 65 6d 3b 0a 20 20 48 61 73 68 20   *pElem;.  Hash 
df30: 2a 70 48 61 73 68 3b 0a 0a 20 20 70 48 61 73 68  *pHash;..  pHash
df40: 20 3d 20 26 70 44 62 2d 3e 70 53 63 68 65 6d 61   = &pDb->pSchema
df50: 2d 3e 74 62 6c 48 61 73 68 3b 0a 20 20 66 6f 72  ->tblHash;.  for
df60: 28 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73  (pElem=sqliteHas
df70: 68 46 69 72 73 74 28 70 48 61 73 68 29 3b 20 70  hFirst(pHash); p
df80: 45 6c 65 6d 3b 20 70 45 6c 65 6d 3d 73 71 6c 69  Elem; pElem=sqli
df90: 74 65 48 61 73 68 4e 65 78 74 28 70 45 6c 65 6d  teHashNext(pElem
dfa0: 29 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70  )){.    Table *p
dfb0: 54 61 62 20 3d 20 73 71 6c 69 74 65 48 61 73 68  Tab = sqliteHash
dfc0: 44 61 74 61 28 70 45 6c 65 6d 29 3b 0a 20 20 20  Data(pElem);.   
dfd0: 20 69 66 28 20 70 54 61 62 2d 3e 74 6e 75 6d 3d   if( pTab->tnum=
dfe0: 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20  =iFrom ){.      
dff0: 70 54 61 62 2d 3e 74 6e 75 6d 20 3d 20 69 54 6f  pTab->tnum = iTo
e000: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 48  ;.    }.  }.  pH
e010: 61 73 68 20 3d 20 26 70 44 62 2d 3e 70 53 63 68  ash = &pDb->pSch
e020: 65 6d 61 2d 3e 69 64 78 48 61 73 68 3b 0a 20 20  ema->idxHash;.  
e030: 66 6f 72 28 70 45 6c 65 6d 3d 73 71 6c 69 74 65  for(pElem=sqlite
e040: 48 61 73 68 46 69 72 73 74 28 70 48 61 73 68 29  HashFirst(pHash)
e050: 3b 20 70 45 6c 65 6d 3b 20 70 45 6c 65 6d 3d 73  ; pElem; pElem=s
e060: 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28 70 45  qliteHashNext(pE
e070: 6c 65 6d 29 29 7b 0a 20 20 20 20 49 6e 64 65 78  lem)){.    Index
e080: 20 2a 70 49 64 78 20 3d 20 73 71 6c 69 74 65 48   *pIdx = sqliteH
e090: 61 73 68 44 61 74 61 28 70 45 6c 65 6d 29 3b 0a  ashData(pElem);.
e0a0: 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 74 6e      if( pIdx->tn
e0b0: 75 6d 3d 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20  um==iFrom ){.   
e0c0: 20 20 20 70 49 64 78 2d 3e 74 6e 75 6d 20 3d 20     pIdx->tnum = 
e0d0: 69 54 6f 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  iTo;.    }.  }.}
e0e0: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57  .#endif../*.** W
e0f0: 72 69 74 65 20 63 6f 64 65 20 74 6f 20 65 72 61  rite code to era
e100: 73 65 20 74 68 65 20 74 61 62 6c 65 20 77 69 74  se the table wit
e110: 68 20 72 6f 6f 74 2d 70 61 67 65 20 69 54 61 62  h root-page iTab
e120: 6c 65 20 66 72 6f 6d 20 64 61 74 61 62 61 73 65  le from database
e130: 20 69 44 62 2e 0a 2a 2a 20 41 6c 73 6f 20 77 72   iDb..** Also wr
e140: 69 74 65 20 63 6f 64 65 20 74 6f 20 6d 6f 64 69  ite code to modi
e150: 66 79 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61  fy the sqlite_ma
e160: 73 74 65 72 20 74 61 62 6c 65 20 61 6e 64 20 69  ster table and i
e170: 6e 74 65 72 6e 61 6c 20 73 63 68 65 6d 61 0a 2a  nternal schema.*
e180: 2a 20 69 66 20 61 20 72 6f 6f 74 2d 70 61 67 65  * if a root-page
e190: 20 6f 66 20 61 6e 6f 74 68 65 72 20 74 61 62 6c   of another tabl
e1a0: 65 20 69 73 20 6d 6f 76 65 64 20 62 79 20 74 68  e is moved by th
e1b0: 65 20 62 74 72 65 65 2d 6c 61 79 65 72 20 77 68  e btree-layer wh
e1c0: 69 6c 73 74 0a 2a 2a 20 65 72 61 73 69 6e 67 20  ilst.** erasing 
e1d0: 69 54 61 62 6c 65 20 28 74 68 69 73 20 63 61 6e  iTable (this can
e1e0: 20 68 61 70 70 65 6e 20 77 69 74 68 20 61 6e 20   happen with an 
e1f0: 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61  auto-vacuum data
e200: 62 61 73 65 29 2e 0a 2a 2f 20 0a 73 74 61 74 69  base)..*/ .stati
e210: 63 20 76 6f 69 64 20 64 65 73 74 72 6f 79 52 6f  c void destroyRo
e220: 6f 74 50 61 67 65 28 50 61 72 73 65 20 2a 70 50  otPage(Parse *pP
e230: 61 72 73 65 2c 20 69 6e 74 20 69 54 61 62 6c 65  arse, int iTable
e240: 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20 20 56 64  , int iDb){.  Vd
e250: 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47  be *v = sqlite3G
e260: 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
e270: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
e280: 4f 70 28 76 2c 20 4f 50 5f 44 65 73 74 72 6f 79  Op(v, OP_Destroy
e290: 2c 20 69 54 61 62 6c 65 2c 20 69 44 62 29 3b 0a  , iTable, iDb);.
e2a0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
e2b0: 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
e2c0: 20 2f 2a 20 4f 50 5f 44 65 73 74 72 6f 79 20 70   /* OP_Destroy p
e2d0: 75 73 68 65 73 20 61 6e 20 69 6e 74 65 67 65 72  ushes an integer
e2e0: 20 6f 6e 74 6f 20 74 68 65 20 73 74 61 63 6b 2e   onto the stack.
e2f0: 20 49 66 20 74 68 69 73 20 69 6e 74 65 67 65 72   If this integer
e300: 0a 20 20 2a 2a 20 69 73 20 6e 6f 6e 2d 7a 65 72  .  ** is non-zer
e310: 6f 2c 20 74 68 65 6e 20 69 74 20 69 73 20 74 68  o, then it is th
e320: 65 20 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62  e root page numb
e330: 65 72 20 6f 66 20 61 20 74 61 62 6c 65 20 6d 6f  er of a table mo
e340: 76 65 64 20 74 6f 0a 20 20 2a 2a 20 6c 6f 63 61  ved to.  ** loca
e350: 74 69 6f 6e 20 69 54 61 62 6c 65 2e 20 54 68 65  tion iTable. The
e360: 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 64 65 20   following code 
e370: 6d 6f 64 69 66 69 65 73 20 74 68 65 20 73 71 6c  modifies the sql
e380: 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65  ite_master table
e390: 20 74 6f 0a 20 20 2a 2a 20 72 65 66 6c 65 63 74   to.  ** reflect
e3a0: 20 74 68 69 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a   this..  **.  **
e3b0: 20 54 68 65 20 22 23 30 22 20 69 6e 20 74 68 65   The "#0" in the
e3c0: 20 53 51 4c 20 69 73 20 61 20 73 70 65 63 69 61   SQL is a specia
e3d0: 6c 20 63 6f 6e 73 74 61 6e 74 20 74 68 61 74 20  l constant that 
e3e0: 6d 65 61 6e 73 20 77 68 61 74 65 76 65 72 20 76  means whatever v
e3f0: 61 6c 75 65 0a 20 20 2a 2a 20 69 73 20 6f 6e 20  alue.  ** is on 
e400: 74 68 65 20 74 6f 70 20 6f 66 20 74 68 65 20 73  the top of the s
e410: 74 61 63 6b 2e 20 20 53 65 65 20 73 71 6c 69 74  tack.  See sqlit
e420: 65 33 52 65 67 69 73 74 65 72 45 78 70 72 28 29  e3RegisterExpr()
e430: 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ..  */.  sqlite3
e440: 4e 65 73 74 65 64 50 61 72 73 65 28 70 50 61 72  NestedParse(pPar
e450: 73 65 2c 20 0a 20 20 20 20 20 22 55 50 44 41 54  se, .     "UPDAT
e460: 45 20 25 51 2e 25 73 20 53 45 54 20 72 6f 6f 74  E %Q.%s SET root
e470: 70 61 67 65 3d 25 64 20 57 48 45 52 45 20 23 30  page=%d WHERE #0
e480: 20 41 4e 44 20 72 6f 6f 74 70 61 67 65 3d 23 30   AND rootpage=#0
e490: 22 2c 0a 20 20 20 20 20 70 50 61 72 73 65 2d 3e  ",.     pParse->
e4a0: 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61  db->aDb[iDb].zNa
e4b0: 6d 65 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c 45  me, SCHEMA_TABLE
e4c0: 28 69 44 62 29 2c 20 69 54 61 62 6c 65 29 3b 0a  (iDb), iTable);.
e4d0: 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  #endif.}../*.** 
e4e0: 57 72 69 74 65 20 56 44 42 45 20 63 6f 64 65 20  Write VDBE code 
e4f0: 74 6f 20 65 72 61 73 65 20 74 61 62 6c 65 20 70  to erase table p
e500: 54 61 62 20 61 6e 64 20 61 6c 6c 20 61 73 73 6f  Tab and all asso
e510: 63 69 61 74 65 64 20 69 6e 64 69 63 65 73 20 6f  ciated indices o
e520: 6e 20 64 69 73 6b 2e 0a 2a 2a 20 43 6f 64 65 20  n disk..** Code 
e530: 74 6f 20 75 70 64 61 74 65 20 74 68 65 20 73 71  to update the sq
e540: 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c  lite_master tabl
e550: 65 73 20 61 6e 64 20 69 6e 74 65 72 6e 61 6c 20  es and internal 
e560: 73 63 68 65 6d 61 20 64 65 66 69 6e 69 74 69 6f  schema definitio
e570: 6e 73 0a 2a 2a 20 69 6e 20 63 61 73 65 20 61 20  ns.** in case a 
e580: 72 6f 6f 74 2d 70 61 67 65 20 62 65 6c 6f 6e 67  root-page belong
e590: 69 6e 67 20 74 6f 20 61 6e 6f 74 68 65 72 20 74  ing to another t
e5a0: 61 62 6c 65 20 69 73 20 6d 6f 76 65 64 20 62 79  able is moved by
e5b0: 20 74 68 65 20 62 74 72 65 65 20 6c 61 79 65 72   the btree layer
e5c0: 0a 2a 2a 20 69 73 20 61 6c 73 6f 20 61 64 64 65  .** is also adde
e5d0: 64 20 28 74 68 69 73 20 63 61 6e 20 68 61 70 70  d (this can happ
e5e0: 65 6e 20 77 69 74 68 20 61 6e 20 61 75 74 6f 2d  en with an auto-
e5f0: 76 61 63 75 75 6d 20 64 61 74 61 62 61 73 65 29  vacuum database)
e600: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
e610: 20 64 65 73 74 72 6f 79 54 61 62 6c 65 28 50 61   destroyTable(Pa
e620: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 61 62  rse *pParse, Tab
e630: 6c 65 20 2a 70 54 61 62 29 7b 0a 23 69 66 64 65  le *pTab){.#ifde
e640: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
e650: 54 4f 56 41 43 55 55 4d 0a 20 20 49 6e 64 65 78  TOVACUUM.  Index
e660: 20 2a 70 49 64 78 3b 0a 20 20 69 6e 74 20 69 44   *pIdx;.  int iD
e670: 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d  b = sqlite3Schem
e680: 61 54 6f 49 6e 64 65 78 28 70 50 61 72 73 65 2d  aToIndex(pParse-
e690: 3e 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65  >db, pTab->pSche
e6a0: 6d 61 29 3b 0a 20 20 64 65 73 74 72 6f 79 52 6f  ma);.  destroyRo
e6b0: 6f 74 50 61 67 65 28 70 50 61 72 73 65 2c 20 70  otPage(pParse, p
e6c0: 54 61 62 2d 3e 74 6e 75 6d 2c 20 69 44 62 29 3b  Tab->tnum, iDb);
e6d0: 0a 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62  .  for(pIdx=pTab
e6e0: 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20  ->pIndex; pIdx; 
e6f0: 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74  pIdx=pIdx->pNext
e700: 29 7b 0a 20 20 20 20 64 65 73 74 72 6f 79 52 6f  ){.    destroyRo
e710: 6f 74 50 61 67 65 28 70 50 61 72 73 65 2c 20 70  otPage(pParse, p
e720: 49 64 78 2d 3e 74 6e 75 6d 2c 20 69 44 62 29 3b  Idx->tnum, iDb);
e730: 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20 2f 2a 20  .  }.#else.  /* 
e740: 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  If the database 
e750: 6d 61 79 20 62 65 20 61 75 74 6f 2d 76 61 63 75  may be auto-vacu
e760: 75 6d 20 63 61 70 61 62 6c 65 20 28 69 66 20 53  um capable (if S
e770: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
e780: 41 43 55 55 4d 0a 20 20 2a 2a 20 69 73 20 6e 6f  ACUUM.  ** is no
e790: 74 20 64 65 66 69 6e 65 64 29 2c 20 74 68 65 6e  t defined), then
e7a0: 20 69 74 20 69 73 20 69 6d 70 6f 72 74 61 6e 74   it is important
e7b0: 20 74 6f 20 63 61 6c 6c 20 4f 50 5f 44 65 73 74   to call OP_Dest
e7c0: 72 6f 79 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20  roy on the.  ** 
e7d0: 74 61 62 6c 65 20 61 6e 64 20 69 6e 64 65 78 20  table and index 
e7e0: 72 6f 6f 74 2d 70 61 67 65 73 20 69 6e 20 6f 72  root-pages in or
e7f0: 64 65 72 2c 20 73 74 61 72 74 69 6e 67 20 77 69  der, starting wi
e800: 74 68 20 74 68 65 20 6e 75 6d 65 72 69 63 61 6c  th the numerical
e810: 6c 79 20 0a 20 20 2a 2a 20 6c 61 72 67 65 73 74  ly .  ** largest
e820: 20 72 6f 6f 74 2d 70 61 67 65 20 6e 75 6d 62 65   root-page numbe
e830: 72 2e 20 54 68 69 73 20 67 75 61 72 61 6e 74 65  r. This guarante
e840: 65 73 20 74 68 61 74 20 6e 6f 6e 65 20 6f 66 20  es that none of 
e850: 74 68 65 20 72 6f 6f 74 2d 70 61 67 65 73 0a 20  the root-pages. 
e860: 20 2a 2a 20 74 6f 20 62 65 20 64 65 73 74 72 6f   ** to be destro
e870: 79 65 64 20 69 73 20 72 65 6c 6f 63 61 74 65 64  yed is relocated
e880: 20 62 79 20 61 6e 20 65 61 72 6c 69 65 72 20 4f   by an earlier O
e890: 50 5f 44 65 73 74 72 6f 79 2e 20 69 2e 65 2e 20  P_Destroy. i.e. 
e8a0: 69 66 20 74 68 65 0a 20 20 2a 2a 20 66 6f 6c 6c  if the.  ** foll
e8b0: 6f 77 69 6e 67 20 77 65 72 65 20 63 6f 64 65 64  owing were coded
e8c0: 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4f 50 5f 44  :.  **.  ** OP_D
e8d0: 65 73 74 72 6f 79 20 34 20 30 0a 20 20 2a 2a 20  estroy 4 0.  ** 
e8e0: 2e 2e 2e 0a 20 20 2a 2a 20 4f 50 5f 44 65 73 74  ....  ** OP_Dest
e8f0: 72 6f 79 20 35 20 30 0a 20 20 2a 2a 0a 20 20 2a  roy 5 0.  **.  *
e900: 2a 20 61 6e 64 20 72 6f 6f 74 20 70 61 67 65 20  * and root page 
e910: 35 20 68 61 70 70 65 6e 65 64 20 74 6f 20 62 65  5 happened to be
e920: 20 74 68 65 20 6c 61 72 67 65 73 74 20 72 6f 6f   the largest roo
e930: 74 2d 70 61 67 65 20 6e 75 6d 62 65 72 20 69 6e  t-page number in
e940: 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61   the.  ** databa
e950: 73 65 2c 20 74 68 65 6e 20 72 6f 6f 74 20 70 61  se, then root pa
e960: 67 65 20 35 20 77 6f 75 6c 64 20 62 65 20 6d 6f  ge 5 would be mo
e970: 76 65 64 20 74 6f 20 70 61 67 65 20 34 20 62 79  ved to page 4 by
e980: 20 74 68 65 20 0a 20 20 2a 2a 20 22 4f 50 5f 44   the .  ** "OP_D
e990: 65 73 74 72 6f 79 20 34 20 30 22 20 6f 70 63 6f  estroy 4 0" opco
e9a0: 64 65 2e 20 54 68 65 20 73 75 62 73 65 71 75 65  de. The subseque
e9b0: 6e 74 20 22 4f 50 5f 44 65 73 74 72 6f 79 20 35  nt "OP_Destroy 5
e9c0: 20 30 22 20 77 6f 75 6c 64 20 68 69 74 0a 20 20   0" would hit.  
e9d0: 2a 2a 20 61 20 66 72 65 65 2d 6c 69 73 74 20 70  ** a free-list p
e9e0: 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 6e 74 20  age..  */.  int 
e9f0: 69 54 61 62 20 3d 20 70 54 61 62 2d 3e 74 6e 75  iTab = pTab->tnu
ea00: 6d 3b 0a 20 20 69 6e 74 20 69 44 65 73 74 72 6f  m;.  int iDestro
ea10: 79 65 64 20 3d 20 30 3b 0a 0a 20 20 77 68 69 6c  yed = 0;..  whil
ea20: 65 28 20 31 20 29 7b 0a 20 20 20 20 49 6e 64 65  e( 1 ){.    Inde
ea30: 78 20 2a 70 49 64 78 3b 0a 20 20 20 20 69 6e 74  x *pIdx;.    int
ea40: 20 69 4c 61 72 67 65 73 74 20 3d 20 30 3b 0a 0a   iLargest = 0;..
ea50: 20 20 20 20 69 66 28 20 69 44 65 73 74 72 6f 79      if( iDestroy
ea60: 65 64 3d 3d 30 20 7c 7c 20 69 54 61 62 3c 69 44  ed==0 || iTab<iD
ea70: 65 73 74 72 6f 79 65 64 20 29 7b 0a 20 20 20 20  estroyed ){.    
ea80: 20 20 69 4c 61 72 67 65 73 74 20 3d 20 69 54 61    iLargest = iTa
ea90: 62 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72  b;.    }.    for
eaa0: 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64  (pIdx=pTab->pInd
eab0: 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70  ex; pIdx; pIdx=p
eac0: 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  Idx->pNext){.   
ead0: 20 20 20 69 6e 74 20 69 49 64 78 20 3d 20 70 49     int iIdx = pI
eae0: 64 78 2d 3e 74 6e 75 6d 3b 0a 20 20 20 20 20 20  dx->tnum;.      
eaf0: 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e 70 53  assert( pIdx->pS
eb00: 63 68 65 6d 61 3d 3d 70 54 61 62 2d 3e 70 53 63  chema==pTab->pSc
eb10: 68 65 6d 61 20 29 3b 0a 20 20 20 20 20 20 69 66  hema );.      if
eb20: 28 20 28 69 44 65 73 74 72 6f 79 65 64 3d 3d 30  ( (iDestroyed==0
eb30: 20 7c 7c 20 28 69 49 64 78 3c 69 44 65 73 74 72   || (iIdx<iDestr
eb40: 6f 79 65 64 29 29 20 26 26 20 69 49 64 78 3e 69  oyed)) && iIdx>i
eb50: 4c 61 72 67 65 73 74 20 29 7b 0a 20 20 20 20 20  Largest ){.     
eb60: 20 20 20 69 4c 61 72 67 65 73 74 20 3d 20 69 49     iLargest = iI
eb70: 64 78 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  dx;.      }.    
eb80: 7d 0a 20 20 20 20 69 66 28 20 69 4c 61 72 67 65  }.    if( iLarge
eb90: 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  st==0 ){.      r
eba0: 65 74 75 72 6e 3b 0a 20 20 20 20 7d 65 6c 73 65  eturn;.    }else
ebb0: 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 44 62 20  {.      int iDb 
ebc0: 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54  = sqlite3SchemaT
ebd0: 6f 49 6e 64 65 78 28 70 50 61 72 73 65 2d 3e 64  oIndex(pParse->d
ebe0: 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61  b, pTab->pSchema
ebf0: 29 3b 0a 20 20 20 20 20 20 64 65 73 74 72 6f 79  );.      destroy
ec00: 52 6f 6f 74 50 61 67 65 28 70 50 61 72 73 65 2c  RootPage(pParse,
ec10: 20 69 4c 61 72 67 65 73 74 2c 20 69 44 62 29 3b   iLargest, iDb);
ec20: 0a 20 20 20 20 20 20 69 44 65 73 74 72 6f 79 65  .      iDestroye
ec30: 64 20 3d 20 69 4c 61 72 67 65 73 74 3b 0a 20 20  d = iLargest;.  
ec40: 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d    }.  }.#endif.}
ec50: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
ec60: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74  tine is called t
ec70: 6f 20 64 6f 20 74 68 65 20 77 6f 72 6b 20 6f 66  o do the work of
ec80: 20 61 20 44 52 4f 50 20 54 41 42 4c 45 20 73 74   a DROP TABLE st
ec90: 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 70 4e 61 6d  atement..** pNam
eca0: 65 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66  e is the name of
ecb0: 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65   the table to be
ecc0: 20 64 72 6f 70 70 65 64 2e 0a 2a 2f 0a 76 6f 69   dropped..*/.voi
ecd0: 64 20 73 71 6c 69 74 65 33 44 72 6f 70 54 61 62  d sqlite3DropTab
ece0: 6c 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  le(Parse *pParse
ecf0: 2c 20 53 72 63 4c 69 73 74 20 2a 70 4e 61 6d 65  , SrcList *pName
ed00: 2c 20 69 6e 74 20 69 73 56 69 65 77 2c 20 69 6e  , int isView, in
ed10: 74 20 6e 6f 45 72 72 29 7b 0a 20 20 54 61 62 6c  t noErr){.  Tabl
ed20: 65 20 2a 70 54 61 62 3b 0a 20 20 56 64 62 65 20  e *pTab;.  Vdbe 
ed30: 2a 76 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  *v;.  sqlite3 *d
ed40: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
ed50: 20 20 69 6e 74 20 69 44 62 3b 0a 0a 20 20 69 66    int iDb;..  if
ed60: 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c  ( pParse->nErr |
ed70: 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  | db->mallocFail
ed80: 65 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65  ed ){.    goto e
ed90: 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a  xit_drop_table;.
eda0: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 4e    }.  assert( pN
edb0: 61 6d 65 2d 3e 6e 53 72 63 3d 3d 31 20 29 3b 0a  ame->nSrc==1 );.
edc0: 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33    pTab = sqlite3
edd0: 4c 6f 63 61 74 65 54 61 62 6c 65 28 70 50 61 72  LocateTable(pPar
ede0: 73 65 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e  se, pName->a[0].
edf0: 7a 4e 61 6d 65 2c 20 70 4e 61 6d 65 2d 3e 61 5b  zName, pName->a[
ee00: 30 5d 2e 7a 44 61 74 61 62 61 73 65 29 3b 0a 0a  0].zDatabase);..
ee10: 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29 7b    if( pTab==0 ){
ee20: 0a 20 20 20 20 69 66 28 20 6e 6f 45 72 72 20 29  .    if( noErr )
ee30: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
ee40: 72 72 6f 72 43 6c 65 61 72 28 70 50 61 72 73 65  rrorClear(pParse
ee50: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 67 6f 74  );.    }.    got
ee60: 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c  o exit_drop_tabl
ee70: 65 3b 0a 20 20 7d 0a 20 20 69 44 62 20 3d 20 73  e;.  }.  iDb = s
ee80: 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e  qlite3SchemaToIn
ee90: 64 65 78 28 64 62 2c 20 70 54 61 62 2d 3e 70 53  dex(db, pTab->pS
eea0: 63 68 65 6d 61 29 3b 0a 20 20 61 73 73 65 72 74  chema);.  assert
eeb0: 28 20 69 44 62 3e 3d 30 20 26 26 20 69 44 62 3c  ( iDb>=0 && iDb<
eec0: 64 62 2d 3e 6e 44 62 20 29 3b 0a 23 69 66 6e 64  db->nDb );.#ifnd
eed0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
eee0: 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 7b  UTHORIZATION.  {
eef0: 0a 20 20 20 20 69 6e 74 20 63 6f 64 65 3b 0a 20  .    int code;. 
ef00: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
ef10: 54 61 62 20 3d 20 53 43 48 45 4d 41 5f 54 41 42  Tab = SCHEMA_TAB
ef20: 4c 45 28 69 44 62 29 3b 0a 20 20 20 20 63 6f 6e  LE(iDb);.    con
ef30: 73 74 20 63 68 61 72 20 2a 7a 44 62 20 3d 20 64  st char *zDb = d
ef40: 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d  b->aDb[iDb].zNam
ef50: 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  e;.    const cha
ef60: 72 20 2a 7a 41 72 67 32 20 3d 20 30 3b 0a 20 20  r *zArg2 = 0;.  
ef70: 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74    if( sqlite3Aut
ef80: 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53  hCheck(pParse, S
ef90: 51 4c 49 54 45 5f 44 45 4c 45 54 45 2c 20 7a 54  QLITE_DELETE, zT
efa0: 61 62 2c 20 30 2c 20 7a 44 62 29 29 7b 0a 20 20  ab, 0, zDb)){.  
efb0: 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72      goto exit_dr
efc0: 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 20 20 7d 0a  op_table;.    }.
efd0: 20 20 20 20 69 66 28 20 69 73 56 69 65 77 20 29      if( isView )
efe0: 7b 0a 20 20 20 20 20 20 69 66 28 20 21 4f 4d 49  {.      if( !OMI
eff0: 54 5f 54 45 4d 50 44 42 20 26 26 20 69 44 62 3d  T_TEMPDB && iDb=
f000: 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f  =1 ){.        co
f010: 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50  de = SQLITE_DROP
f020: 5f 54 45 4d 50 5f 56 49 45 57 3b 0a 20 20 20 20  _TEMP_VIEW;.    
f030: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
f040: 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44   code = SQLITE_D
f050: 52 4f 50 5f 56 49 45 57 3b 0a 20 20 20 20 20 20  ROP_VIEW;.      
f060: 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
f070: 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
f080: 4c 45 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  LE.    }else if(
f090: 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29   IsVirtual(pTab)
f0a0: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71   ){.      if( sq
f0b0: 6c 69 74 65 33 56 69 65 77 47 65 74 43 6f 6c 75  lite3ViewGetColu
f0c0: 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20  mnNames(pParse, 
f0d0: 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20 20  pTab) ){.       
f0e0: 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f   goto exit_drop_
f0f0: 74 61 62 6c 65 3b 0a 20 20 20 20 20 20 7d 0a 20  table;.      }. 
f100: 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49       code = SQLI
f110: 54 45 5f 44 52 4f 50 5f 56 54 41 42 4c 45 3b 0a  TE_DROP_VTABLE;.
f120: 20 20 20 20 20 20 7a 41 72 67 32 20 3d 20 70 54        zArg2 = pT
f130: 61 62 2d 3e 70 4d 6f 64 2d 3e 7a 4e 61 6d 65 3b  ab->pMod->zName;
f140: 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c 73  .#endif.    }els
f150: 65 7b 0a 20 20 20 20 20 20 69 66 28 20 21 4f 4d  e{.      if( !OM
f160: 49 54 5f 54 45 4d 50 44 42 20 26 26 20 69 44 62  IT_TEMPDB && iDb
f170: 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 63  ==1 ){.        c
f180: 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f  ode = SQLITE_DRO
f190: 50 5f 54 45 4d 50 5f 54 41 42 4c 45 3b 0a 20 20  P_TEMP_TABLE;.  
f1a0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
f1b0: 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45     code = SQLITE
f1c0: 5f 44 52 4f 50 5f 54 41 42 4c 45 3b 0a 20 20 20  _DROP_TABLE;.   
f1d0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
f1e0: 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68  f( sqlite3AuthCh
f1f0: 65 63 6b 28 70 50 61 72 73 65 2c 20 63 6f 64 65  eck(pParse, code
f200: 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a  , pTab->zName, z
f210: 41 72 67 32 2c 20 7a 44 62 29 20 29 7b 0a 20 20  Arg2, zDb) ){.  
f220: 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72      goto exit_dr
f230: 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 20 20 7d 0a  op_table;.    }.
f240: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 41      if( sqlite3A
f250: 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c  uthCheck(pParse,
f260: 20 53 51 4c 49 54 45 5f 44 45 4c 45 54 45 2c 20   SQLITE_DELETE, 
f270: 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 30 2c 20  pTab->zName, 0, 
f280: 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f  zDb) ){.      go
f290: 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62  to exit_drop_tab
f2a0: 6c 65 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65  le;.    }.  }.#e
f2b0: 6e 64 69 66 0a 20 20 69 66 28 20 70 54 61 62 2d  ndif.  if( pTab-
f2c0: 3e 72 65 61 64 4f 6e 6c 79 20 7c 7c 20 70 54 61  >readOnly || pTa
f2d0: 62 3d 3d 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e  b==db->aDb[iDb].
f2e0: 70 53 63 68 65 6d 61 2d 3e 70 53 65 71 54 61 62  pSchema->pSeqTab
f2f0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
f300: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
f310: 22 74 61 62 6c 65 20 25 73 20 6d 61 79 20 6e 6f  "table %s may no
f320: 74 20 62 65 20 64 72 6f 70 70 65 64 22 2c 20 70  t be dropped", p
f330: 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  Tab->zName);.   
f340: 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f   goto exit_drop_
f350: 74 61 62 6c 65 3b 0a 20 20 7d 0a 0a 23 69 66 6e  table;.  }..#ifn
f360: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
f370: 56 49 45 57 0a 20 20 2f 2a 20 45 6e 73 75 72 65  VIEW.  /* Ensure
f380: 20 44 52 4f 50 20 54 41 42 4c 45 20 69 73 20 6e   DROP TABLE is n
f390: 6f 74 20 75 73 65 64 20 6f 6e 20 61 20 76 69 65  ot used on a vie
f3a0: 77 2c 20 61 6e 64 20 44 52 4f 50 20 56 49 45 57  w, and DROP VIEW
f3b0: 20 69 73 20 6e 6f 74 20 75 73 65 64 0a 20 20 2a   is not used.  *
f3c0: 2a 20 6f 6e 20 61 20 74 61 62 6c 65 2e 0a 20 20  * on a table..  
f3d0: 2a 2f 0a 20 20 69 66 28 20 69 73 56 69 65 77 20  */.  if( isView 
f3e0: 26 26 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74  && pTab->pSelect
f3f0: 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
f400: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
f410: 65 2c 20 22 75 73 65 20 44 52 4f 50 20 54 41 42  e, "use DROP TAB
f420: 4c 45 20 74 6f 20 64 65 6c 65 74 65 20 74 61 62  LE to delete tab
f430: 6c 65 20 25 73 22 2c 20 70 54 61 62 2d 3e 7a 4e  le %s", pTab->zN
f440: 61 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65  ame);.    goto e
f450: 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a  xit_drop_table;.
f460: 20 20 7d 0a 20 20 69 66 28 20 21 69 73 56 69 65    }.  if( !isVie
f470: 77 20 26 26 20 70 54 61 62 2d 3e 70 53 65 6c 65  w && pTab->pSele
f480: 63 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ct ){.    sqlite
f490: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
f4a0: 2c 20 22 75 73 65 20 44 52 4f 50 20 56 49 45 57  , "use DROP VIEW
f4b0: 20 74 6f 20 64 65 6c 65 74 65 20 76 69 65 77 20   to delete view 
f4c0: 25 73 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  %s", pTab->zName
f4d0: 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74  );.    goto exit
f4e0: 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 7d  _drop_table;.  }
f4f0: 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 47 65  .#endif..  /* Ge
f500: 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 72  nerate code to r
f510: 65 6d 6f 76 65 20 74 68 65 20 74 61 62 6c 65 20  emove the table 
f520: 66 72 6f 6d 20 74 68 65 20 6d 61 73 74 65 72 20  from the master 
f530: 74 61 62 6c 65 0a 20 20 2a 2a 20 6f 6e 20 64 69  table.  ** on di
f540: 73 6b 2e 0a 20 20 2a 2f 0a 20 20 76 20 3d 20 73  sk..  */.  v = s
f550: 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
f560: 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76 20 29  arse);.  if( v )
f570: 7b 0a 20 20 20 20 54 72 69 67 67 65 72 20 2a 70  {.    Trigger *p
f580: 54 72 69 67 67 65 72 3b 0a 20 20 20 20 44 62 20  Trigger;.    Db 
f590: 2a 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b  *pDb = &db->aDb[
f5a0: 69 44 62 5d 3b 0a 20 20 20 20 73 71 6c 69 74 65  iDb];.    sqlite
f5b0: 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61  3BeginWriteOpera
f5c0: 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 30 2c 20  tion(pParse, 0, 
f5d0: 69 44 62 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53  iDb);..#ifndef S
f5e0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
f5f0: 41 4c 54 41 42 4c 45 0a 20 20 20 20 69 66 28 20  ALTABLE.    if( 
f600: 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20  IsVirtual(pTab) 
f610: 29 7b 0a 20 20 20 20 20 20 56 64 62 65 20 2a 76  ){.      Vdbe *v
f620: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
f630: 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  e(pParse);.     
f640: 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20 20 20   if( v ){.      
f650: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
f660: 4f 70 28 76 2c 20 4f 50 5f 56 42 65 67 69 6e 2c  Op(v, OP_VBegin,
f670: 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a   0, 0);.      }.
f680: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20      }.#endif..  
f690: 20 20 2f 2a 20 44 72 6f 70 20 61 6c 6c 20 74 72    /* Drop all tr
f6a0: 69 67 67 65 72 73 20 61 73 73 6f 63 69 61 74 65  iggers associate
f6b0: 64 20 77 69 74 68 20 74 68 65 20 74 61 62 6c 65  d with the table
f6c0: 20 62 65 69 6e 67 20 64 72 6f 70 70 65 64 2e 20   being dropped. 
f6d0: 43 6f 64 65 0a 20 20 20 20 2a 2a 20 69 73 20 67  Code.    ** is g
f6e0: 65 6e 65 72 61 74 65 64 20 74 6f 20 72 65 6d 6f  enerated to remo
f6f0: 76 65 20 65 6e 74 72 69 65 73 20 66 72 6f 6d 20  ve entries from 
f700: 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 61 6e  sqlite_master an
f710: 64 2f 6f 72 0a 20 20 20 20 2a 2a 20 73 71 6c 69  d/or.    ** sqli
f720: 74 65 5f 74 65 6d 70 5f 6d 61 73 74 65 72 20 69  te_temp_master i
f730: 66 20 72 65 71 75 69 72 65 64 2e 0a 20 20 20 20  f required..    
f740: 2a 2f 0a 20 20 20 20 70 54 72 69 67 67 65 72 20  */.    pTrigger 
f750: 3d 20 70 54 61 62 2d 3e 70 54 72 69 67 67 65 72  = pTab->pTrigger
f760: 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 70 54 72  ;.    while( pTr
f770: 69 67 67 65 72 20 29 7b 0a 20 20 20 20 20 20 61  igger ){.      a
f780: 73 73 65 72 74 28 20 70 54 72 69 67 67 65 72 2d  ssert( pTrigger-
f790: 3e 70 53 63 68 65 6d 61 3d 3d 70 54 61 62 2d 3e  >pSchema==pTab->
f7a0: 70 53 63 68 65 6d 61 20 7c 7c 20 0a 20 20 20 20  pSchema || .    
f7b0: 20 20 20 20 20 20 70 54 72 69 67 67 65 72 2d 3e        pTrigger->
f7c0: 70 53 63 68 65 6d 61 3d 3d 64 62 2d 3e 61 44 62  pSchema==db->aDb
f7d0: 5b 31 5d 2e 70 53 63 68 65 6d 61 20 29 3b 0a 20  [1].pSchema );. 
f7e0: 20 20 20 20 20 73 71 6c 69 74 65 33 44 72 6f 70       sqlite3Drop
f7f0: 54 72 69 67 67 65 72 50 74 72 28 70 50 61 72 73  TriggerPtr(pPars
f800: 65 2c 20 70 54 72 69 67 67 65 72 29 3b 0a 20 20  e, pTrigger);.  
f810: 20 20 20 20 70 54 72 69 67 67 65 72 20 3d 20 70      pTrigger = p
f820: 54 72 69 67 67 65 72 2d 3e 70 4e 65 78 74 3b 0a  Trigger->pNext;.
f830: 20 20 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53      }..#ifndef S
f840: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49  QLITE_OMIT_AUTOI
f850: 4e 43 52 45 4d 45 4e 54 0a 20 20 20 20 2f 2a 20  NCREMENT.    /* 
f860: 52 65 6d 6f 76 65 20 61 6e 79 20 65 6e 74 72 69  Remove any entri
f870: 65 73 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65  es of the sqlite
f880: 5f 73 65 71 75 65 6e 63 65 20 74 61 62 6c 65 20  _sequence table 
f890: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 0a  associated with.
f8a0: 20 20 20 20 2a 2a 20 74 68 65 20 74 61 62 6c 65      ** the table
f8b0: 20 62 65 69 6e 67 20 64 72 6f 70 70 65 64 2e 20   being dropped. 
f8c0: 54 68 69 73 20 69 73 20 64 6f 6e 65 20 62 65 66  This is done bef
f8d0: 6f 72 65 20 74 68 65 20 74 61 62 6c 65 20 69 73  ore the table is
f8e0: 20 64 72 6f 70 70 65 64 0a 20 20 20 20 2a 2a 20   dropped.    ** 
f8f0: 61 74 20 74 68 65 20 62 74 72 65 65 20 6c 65 76  at the btree lev
f900: 65 6c 2c 20 69 6e 20 63 61 73 65 20 74 68 65 20  el, in case the 
f910: 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 20  sqlite_sequence 
f920: 74 61 62 6c 65 20 6e 65 65 64 73 20 74 6f 0a 20  table needs to. 
f930: 20 20 20 2a 2a 20 6d 6f 76 65 20 61 73 20 61 20     ** move as a 
f940: 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20 64 72  result of the dr
f950: 6f 70 20 28 63 61 6e 20 68 61 70 70 65 6e 20 69  op (can happen i
f960: 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 6d 6f  n auto-vacuum mo
f970: 64 65 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  de)..    */.    
f980: 69 66 28 20 70 54 61 62 2d 3e 61 75 74 6f 49 6e  if( pTab->autoIn
f990: 63 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  c ){.      sqlit
f9a0: 65 33 4e 65 73 74 65 64 50 61 72 73 65 28 70 50  e3NestedParse(pP
f9b0: 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20 22 44  arse,.        "D
f9c0: 45 4c 45 54 45 20 46 52 4f 4d 20 25 73 2e 73 71  ELETE FROM %s.sq
f9d0: 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 20 57 48  lite_sequence WH
f9e0: 45 52 45 20 6e 61 6d 65 3d 25 51 22 2c 0a 20 20  ERE name=%Q",.  
f9f0: 20 20 20 20 20 20 70 44 62 2d 3e 7a 4e 61 6d 65        pDb->zName
fa00: 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 0a 20 20  , pTab->zName.  
fa10: 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 23 65 6e      );.    }.#en
fa20: 64 69 66 0a 0a 20 20 20 20 2f 2a 20 44 72 6f 70  dif..    /* Drop
fa30: 20 61 6c 6c 20 53 51 4c 49 54 45 5f 4d 41 53 54   all SQLITE_MAST
fa40: 45 52 20 74 61 62 6c 65 20 61 6e 64 20 69 6e 64  ER table and ind
fa50: 65 78 20 65 6e 74 72 69 65 73 20 74 68 61 74 20  ex entries that 
fa60: 72 65 66 65 72 20 74 6f 20 74 68 65 0a 20 20 20  refer to the.   
fa70: 20 2a 2a 20 74 61 62 6c 65 2e 20 54 68 65 20 70   ** table. The p
fa80: 72 6f 67 72 61 6d 20 6e 61 6d 65 20 6c 6f 6f 70  rogram name loop
fa90: 73 20 74 68 72 6f 75 67 68 20 74 68 65 20 6d 61  s through the ma
faa0: 73 74 65 72 20 74 61 62 6c 65 20 61 6e 64 20 64  ster table and d
fab0: 65 6c 65 74 65 73 0a 20 20 20 20 2a 2a 20 65 76  eletes.    ** ev
fac0: 65 72 79 20 72 6f 77 20 74 68 61 74 20 72 65 66  ery row that ref
fad0: 65 72 73 20 74 6f 20 61 20 74 61 62 6c 65 20 6f  ers to a table o
fae0: 66 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 20  f the same name 
faf0: 61 73 20 74 68 65 20 6f 6e 65 20 62 65 69 6e 67  as the one being
fb00: 0a 20 20 20 20 2a 2a 20 64 72 6f 70 70 65 64 2e  .    ** dropped.
fb10: 20 54 72 69 67 67 65 72 73 20 61 72 65 20 68 61   Triggers are ha
fb20: 6e 64 6c 65 64 20 73 65 70 65 72 61 74 65 6c 79  ndled seperately
fb30: 20 62 65 63 61 75 73 65 20 61 20 74 72 69 67 67   because a trigg
fb40: 65 72 20 63 61 6e 20 62 65 0a 20 20 20 20 2a 2a  er can be.    **
fb50: 20 63 72 65 61 74 65 64 20 69 6e 20 74 68 65 20   created in the 
fb60: 74 65 6d 70 20 64 61 74 61 62 61 73 65 20 74 68  temp database th
fb70: 61 74 20 72 65 66 65 72 73 20 74 6f 20 61 20 74  at refers to a t
fb80: 61 62 6c 65 20 69 6e 20 61 6e 6f 74 68 65 72 0a  able in another.
fb90: 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 2e      ** database.
fba0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69  .    */.    sqli
fbb0: 74 65 33 4e 65 73 74 65 64 50 61 72 73 65 28 70  te3NestedParse(p
fbc0: 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20  Parse, .        
fbd0: 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 25 51 2e  "DELETE FROM %Q.
fbe0: 25 73 20 57 48 45 52 45 20 74 62 6c 5f 6e 61 6d  %s WHERE tbl_nam
fbf0: 65 3d 25 51 20 61 6e 64 20 74 79 70 65 21 3d 27  e=%Q and type!='
fc00: 74 72 69 67 67 65 72 27 22 2c 0a 20 20 20 20 20  trigger'",.     
fc10: 20 20 20 70 44 62 2d 3e 7a 4e 61 6d 65 2c 20 53     pDb->zName, S
fc20: 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 44 62 29  CHEMA_TABLE(iDb)
fc30: 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a  , pTab->zName);.
fc40: 20 20 20 20 69 66 28 20 21 69 73 56 69 65 77 20      if( !isView 
fc50: 26 26 20 21 49 73 56 69 72 74 75 61 6c 28 70 54  && !IsVirtual(pT
fc60: 61 62 29 20 29 7b 0a 20 20 20 20 20 20 64 65 73  ab) ){.      des
fc70: 74 72 6f 79 54 61 62 6c 65 28 70 50 61 72 73 65  troyTable(pParse
fc80: 2c 20 70 54 61 62 29 3b 0a 20 20 20 20 7d 0a 0a  , pTab);.    }..
fc90: 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68      /* Remove th
fca0: 65 20 74 61 62 6c 65 20 65 6e 74 72 79 20 66 72  e table entry fr
fcb0: 6f 6d 20 53 51 4c 69 74 65 27 73 20 69 6e 74 65  om SQLite's inte
fcc0: 72 6e 61 6c 20 73 63 68 65 6d 61 20 61 6e 64 20  rnal schema and 
fcd0: 6d 6f 64 69 66 79 0a 20 20 20 20 2a 2a 20 74 68  modify.    ** th
fce0: 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 2e  e schema cookie.
fcf0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
fd00: 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20  IsVirtual(pTab) 
fd10: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
fd20: 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 56 44  VdbeOp3(v, OP_VD
fd30: 65 73 74 72 6f 79 2c 20 69 44 62 2c 20 30 2c 20  estroy, iDb, 0, 
fd40: 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b  pTab->zName, 0);
fd50: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
fd60: 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f  e3VdbeOp3(v, OP_
fd70: 44 72 6f 70 54 61 62 6c 65 2c 20 69 44 62 2c 20  DropTable, iDb, 
fd80: 30 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20  0, pTab->zName, 
fd90: 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 43  0);.    sqlite3C
fda0: 68 61 6e 67 65 43 6f 6f 6b 69 65 28 64 62 2c 20  hangeCookie(db, 
fdb0: 76 2c 20 69 44 62 29 3b 0a 20 20 7d 0a 20 20 73  v, iDb);.  }.  s
fdc0: 71 6c 69 74 65 56 69 65 77 52 65 73 65 74 41 6c  qliteViewResetAl
fdd0: 6c 28 64 62 2c 20 69 44 62 29 3b 0a 0a 65 78 69  l(db, iDb);..exi
fde0: 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3a 0a 20 20  t_drop_table:.  
fdf0: 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44 65  sqlite3SrcListDe
fe00: 6c 65 74 65 28 70 4e 61 6d 65 29 3b 0a 7d 0a 0a  lete(pName);.}..
fe10: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
fe20: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20  ne is called to 
fe30: 63 72 65 61 74 65 20 61 20 6e 65 77 20 66 6f 72  create a new for
fe40: 65 69 67 6e 20 6b 65 79 20 6f 6e 20 74 68 65 20  eign key on the 
fe50: 74 61 62 6c 65 0a 2a 2a 20 63 75 72 72 65 6e 74  table.** current
fe60: 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75  ly under constru
fe70: 63 74 69 6f 6e 2e 20 20 70 46 72 6f 6d 43 6f 6c  ction.  pFromCol
fe80: 20 64 65 74 65 72 6d 69 6e 65 73 20 77 68 69 63   determines whic
fe90: 68 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 69 6e 20  h columns.** in 
fea0: 74 68 65 20 63 75 72 72 65 6e 74 20 74 61 62 6c  the current tabl
feb0: 65 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 66  e point to the f
fec0: 6f 72 65 69 67 6e 20 6b 65 79 2e 20 20 49 66 20  oreign key.  If 
fed0: 70 46 72 6f 6d 43 6f 6c 3d 3d 30 20 74 68 65 6e  pFromCol==0 then
fee0: 0a 2a 2a 20 63 6f 6e 6e 65 63 74 20 74 68 65 20  .** connect the 
fef0: 6b 65 79 20 74 6f 20 74 68 65 20 6c 61 73 74 20  key to the last 
ff00: 63 6f 6c 75 6d 6e 20 69 6e 73 65 72 74 65 64 2e  column inserted.
ff10: 20 20 70 54 6f 20 69 73 20 74 68 65 20 6e 61 6d    pTo is the nam
ff20: 65 20 6f 66 0a 2a 2a 20 74 68 65 20 74 61 62 6c  e of.** the tabl
ff30: 65 20 72 65 66 65 72 72 65 64 20 74 6f 2e 20 20  e referred to.  
ff40: 70 54 6f 43 6f 6c 20 69 73 20 61 20 6c 69 73 74  pToCol is a list
ff50: 20 6f 66 20 74 61 62 6c 65 73 20 69 6e 20 74 68   of tables in th
ff60: 65 20 6f 74 68 65 72 0a 2a 2a 20 70 54 6f 20 74  e other.** pTo t
ff70: 61 62 6c 65 20 74 68 61 74 20 74 68 65 20 66 6f  able that the fo
ff80: 72 65 69 67 6e 20 6b 65 79 20 70 6f 69 6e 74 73  reign key points
ff90: 20 74 6f 2e 20 20 66 6c 61 67 73 20 63 6f 6e 74   to.  flags cont
ffa0: 61 69 6e 73 20 61 6c 6c 0a 2a 2a 20 69 6e 66 6f  ains all.** info
ffb0: 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68  rmation about th
ffc0: 65 20 63 6f 6e 66 6c 69 63 74 20 72 65 73 6f 6c  e conflict resol
ffd0: 75 74 69 6f 6e 20 61 6c 67 6f 72 69 74 68 6d 73  ution algorithms
ffe0: 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 69 6e   specified.** in
fff0: 20 74 68 65 20 4f 4e 20 44 45 4c 45 54 45 2c 20   the ON DELETE, 
10000 4f 4e 20 55 50 44 41 54 45 20 61 6e 64 20 4f 4e  ON UPDATE and ON
10010 20 49 4e 53 45 52 54 20 63 6c 61 75 73 65 73 2e   INSERT clauses.
10020 0a 2a 2a 0a 2a 2a 20 41 6e 20 46 4b 65 79 20 73  .**.** An FKey s
10030 74 72 75 63 74 75 72 65 20 69 73 20 63 72 65 61  tructure is crea
10040 74 65 64 20 61 6e 64 20 61 64 64 65 64 20 74 6f  ted and added to
10050 20 74 68 65 20 74 61 62 6c 65 20 63 75 72 72 65   the table curre
10060 6e 74 6c 79 0a 2a 2a 20 75 6e 64 65 72 20 63 6f  ntly.** under co
10070 6e 73 74 72 75 63 74 69 6f 6e 20 69 6e 20 74 68  nstruction in th
10080 65 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  e pParse->pNewTa
10090 62 6c 65 20 66 69 65 6c 64 2e 20 20 54 68 65 20  ble field.  The 
100a0 6e 65 77 20 46 4b 65 79 0a 2a 2a 20 69 73 20 6e  new FKey.** is n
100b0 6f 74 20 6c 69 6e 6b 65 64 20 69 6e 74 6f 20 64  ot linked into d
100c0 62 2d 3e 61 46 4b 65 79 20 61 74 20 74 68 69 73  b->aFKey at this
100d0 20 70 6f 69 6e 74 20 2d 20 74 68 61 74 20 64 6f   point - that do
100e0 65 73 20 6e 6f 74 20 68 61 70 70 65 6e 0a 2a 2a  es not happen.**
100f0 20 75 6e 74 69 6c 20 73 71 6c 69 74 65 33 45 6e   until sqlite3En
10100 64 54 61 62 6c 65 28 29 2e 0a 2a 2a 0a 2a 2a 20  dTable()..**.** 
10110 54 68 65 20 66 6f 72 65 69 67 6e 20 6b 65 79 20  The foreign key 
10120 69 73 20 73 65 74 20 66 6f 72 20 49 4d 4d 45 44  is set for IMMED
10130 49 41 54 45 20 70 72 6f 63 65 73 73 69 6e 67 2e  IATE processing.
10140 20 20 41 20 73 75 62 73 65 71 75 65 6e 74 20 63    A subsequent c
10150 61 6c 6c 0a 2a 2a 20 74 6f 20 73 71 6c 69 74 65  all.** to sqlite
10160 33 44 65 66 65 72 46 6f 72 65 69 67 6e 4b 65 79  3DeferForeignKey
10170 28 29 20 6d 69 67 68 74 20 63 68 61 6e 67 65 20  () might change 
10180 74 68 69 73 20 74 6f 20 44 45 46 45 52 52 45 44  this to DEFERRED
10190 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
101a0 33 43 72 65 61 74 65 46 6f 72 65 69 67 6e 4b 65  3CreateForeignKe
101b0 79 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  y(.  Parse *pPar
101c0 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 50 61 72  se,       /* Par
101d0 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
101e0 20 20 45 78 70 72 4c 69 73 74 20 2a 70 46 72 6f    ExprList *pFro
101f0 6d 43 6f 6c 2c 20 20 2f 2a 20 43 6f 6c 75 6d 6e  mCol,  /* Column
10200 73 20 69 6e 20 74 68 69 73 20 74 61 62 6c 65 20  s in this table 
10210 74 68 61 74 20 70 6f 69 6e 74 20 74 6f 20 6f 74  that point to ot
10220 68 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20 54  her table */.  T
10230 6f 6b 65 6e 20 2a 70 54 6f 2c 20 20 20 20 20 20  oken *pTo,      
10240 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
10250 68 65 20 6f 74 68 65 72 20 74 61 62 6c 65 20 2a  he other table *
10260 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 54  /.  ExprList *pT
10270 6f 43 6f 6c 2c 20 20 20 20 2f 2a 20 43 6f 6c 75  oCol,    /* Colu
10280 6d 6e 73 20 69 6e 20 74 68 65 20 6f 74 68 65 72  mns in the other
10290 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20   table */.  int 
102a0 66 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 20  flags           
102b0 20 2f 2a 20 43 6f 6e 66 6c 69 63 74 20 72 65 73   /* Conflict res
102c0 6f 6c 75 74 69 6f 6e 20 61 6c 67 6f 72 69 74 68  olution algorith
102d0 6d 73 2e 20 2a 2f 0a 29 7b 0a 23 69 66 6e 64 65  ms. */.){.#ifnde
102e0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f  f SQLITE_OMIT_FO
102f0 52 45 49 47 4e 5f 4b 45 59 0a 20 20 46 4b 65 79  REIGN_KEY.  FKey
10300 20 2a 70 46 4b 65 79 20 3d 20 30 3b 0a 20 20 54   *pFKey = 0;.  T
10310 61 62 6c 65 20 2a 70 20 3d 20 70 50 61 72 73 65  able *p = pParse
10320 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 69  ->pNewTable;.  i
10330 6e 74 20 6e 42 79 74 65 3b 0a 20 20 69 6e 74 20  nt nByte;.  int 
10340 69 3b 0a 20 20 69 6e 74 20 6e 43 6f 6c 3b 0a 20  i;.  int nCol;. 
10350 20 63 68 61 72 20 2a 7a 3b 0a 0a 20 20 61 73 73   char *z;..  ass
10360 65 72 74 28 20 70 54 6f 21 3d 30 20 29 3b 0a 20  ert( pTo!=0 );. 
10370 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20 70 50 61   if( p==0 || pPa
10380 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 49 4e 5f  rse->nErr || IN_
10390 44 45 43 4c 41 52 45 5f 56 54 41 42 20 29 20 67  DECLARE_VTAB ) g
103a0 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 69 66  oto fk_end;.  if
103b0 28 20 70 46 72 6f 6d 43 6f 6c 3d 3d 30 20 29 7b  ( pFromCol==0 ){
103c0 0a 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20  .    int iCol = 
103d0 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 20 20 69  p->nCol-1;.    i
103e0 66 28 20 69 43 6f 6c 3c 30 20 29 20 67 6f 74 6f  f( iCol<0 ) goto
103f0 20 66 6b 5f 65 6e 64 3b 0a 20 20 20 20 69 66 28   fk_end;.    if(
10400 20 70 54 6f 43 6f 6c 20 26 26 20 70 54 6f 43 6f   pToCol && pToCo
10410 6c 2d 3e 6e 45 78 70 72 21 3d 31 20 29 7b 0a 20  l->nExpr!=1 ){. 
10420 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
10430 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 66 6f  rMsg(pParse, "fo
10440 72 65 69 67 6e 20 6b 65 79 20 6f 6e 20 25 73 22  reign key on %s"
10450 0a 20 20 20 20 20 20 20 20 20 22 20 73 68 6f 75  .         " shou
10460 6c 64 20 72 65 66 65 72 65 6e 63 65 20 6f 6e 6c  ld reference onl
10470 79 20 6f 6e 65 20 63 6f 6c 75 6d 6e 20 6f 66 20  y one column of 
10480 74 61 62 6c 65 20 25 54 22 2c 0a 20 20 20 20 20  table %T",.     
10490 20 20 20 20 70 2d 3e 61 43 6f 6c 5b 69 43 6f 6c      p->aCol[iCol
104a0 5d 2e 7a 4e 61 6d 65 2c 20 70 54 6f 29 3b 0a 20  ].zName, pTo);. 
104b0 20 20 20 20 20 67 6f 74 6f 20 66 6b 5f 65 6e 64       goto fk_end
104c0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 43 6f 6c  ;.    }.    nCol
104d0 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 20 69 66   = 1;.  }else if
104e0 28 20 70 54 6f 43 6f 6c 20 26 26 20 70 54 6f 43  ( pToCol && pToC
104f0 6f 6c 2d 3e 6e 45 78 70 72 21 3d 70 46 72 6f 6d  ol->nExpr!=pFrom
10500 43 6f 6c 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20  Col->nExpr ){.  
10510 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
10520 67 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20  g(pParse,.      
10530 20 20 22 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c    "number of col
10540 75 6d 6e 73 20 69 6e 20 66 6f 72 65 69 67 6e 20  umns in foreign 
10550 6b 65 79 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74  key does not mat
10560 63 68 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ch the number of
10570 20 22 0a 20 20 20 20 20 20 20 20 22 63 6f 6c 75   ".        "colu
10580 6d 6e 73 20 69 6e 20 74 68 65 20 72 65 66 65 72  mns in the refer
10590 65 6e 63 65 64 20 74 61 62 6c 65 22 29 3b 0a 20  enced table");. 
105a0 20 20 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a     goto fk_end;.
105b0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 43 6f    }else{.    nCo
105c0 6c 20 3d 20 70 46 72 6f 6d 43 6f 6c 2d 3e 6e 45  l = pFromCol->nE
105d0 78 70 72 3b 0a 20 20 7d 0a 20 20 6e 42 79 74 65  xpr;.  }.  nByte
105e0 20 3d 20 73 69 7a 65 6f 66 28 2a 70 46 4b 65 79   = sizeof(*pFKey
105f0 29 20 2b 20 6e 43 6f 6c 2a 73 69 7a 65 6f 66 28  ) + nCol*sizeof(
10600 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b 30 5d 29 20  pFKey->aCol[0]) 
10610 2b 20 70 54 6f 2d 3e 6e 20 2b 20 31 3b 0a 20 20  + pTo->n + 1;.  
10620 69 66 28 20 70 54 6f 43 6f 6c 20 29 7b 0a 20 20  if( pToCol ){.  
10630 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 6f    for(i=0; i<pTo
10640 43 6f 6c 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  Col->nExpr; i++)
10650 7b 0a 20 20 20 20 20 20 6e 42 79 74 65 20 2b 3d  {.      nByte +=
10660 20 73 74 72 6c 65 6e 28 70 54 6f 43 6f 6c 2d 3e   strlen(pToCol->
10670 61 5b 69 5d 2e 7a 4e 61 6d 65 29 20 2b 20 31 3b  a[i].zName) + 1;
10680 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 46 4b  .    }.  }.  pFK
10690 65 79 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  ey = sqlite3DbMa
106a0 6c 6c 6f 63 5a 65 72 6f 28 70 50 61 72 73 65 2d  llocZero(pParse-
106b0 3e 64 62 2c 20 6e 42 79 74 65 20 29 3b 0a 20 20  >db, nByte );.  
106c0 69 66 28 20 70 46 4b 65 79 3d 3d 30 20 29 7b 0a  if( pFKey==0 ){.
106d0 20 20 20 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b      goto fk_end;
106e0 0a 20 20 7d 0a 20 20 70 46 4b 65 79 2d 3e 70 46  .  }.  pFKey->pF
106f0 72 6f 6d 20 3d 20 70 3b 0a 20 20 70 46 4b 65 79  rom = p;.  pFKey
10700 2d 3e 70 4e 65 78 74 46 72 6f 6d 20 3d 20 70 2d  ->pNextFrom = p-
10710 3e 70 46 4b 65 79 3b 0a 20 20 7a 20 3d 20 28 63  >pFKey;.  z = (c
10720 68 61 72 2a 29 26 70 46 4b 65 79 5b 31 5d 3b 0a  har*)&pFKey[1];.
10730 20 20 70 46 4b 65 79 2d 3e 61 43 6f 6c 20 3d 20    pFKey->aCol = 
10740 28 73 74 72 75 63 74 20 73 43 6f 6c 4d 61 70 2a  (struct sColMap*
10750 29 7a 3b 0a 20 20 7a 20 2b 3d 20 73 69 7a 65 6f  )z;.  z += sizeo
10760 66 28 73 74 72 75 63 74 20 73 43 6f 6c 4d 61 70  f(struct sColMap
10770 29 2a 6e 43 6f 6c 3b 0a 20 20 70 46 4b 65 79 2d  )*nCol;.  pFKey-
10780 3e 7a 54 6f 20 3d 20 7a 3b 0a 20 20 6d 65 6d 63  >zTo = z;.  memc
10790 70 79 28 7a 2c 20 70 54 6f 2d 3e 7a 2c 20 70 54  py(z, pTo->z, pT
107a0 6f 2d 3e 6e 29 3b 0a 20 20 7a 5b 70 54 6f 2d 3e  o->n);.  z[pTo->
107b0 6e 5d 20 3d 20 30 3b 0a 20 20 7a 20 2b 3d 20 70  n] = 0;.  z += p
107c0 54 6f 2d 3e 6e 2b 31 3b 0a 20 20 70 46 4b 65 79  To->n+1;.  pFKey
107d0 2d 3e 70 4e 65 78 74 54 6f 20 3d 20 30 3b 0a 20  ->pNextTo = 0;. 
107e0 20 70 46 4b 65 79 2d 3e 6e 43 6f 6c 20 3d 20 6e   pFKey->nCol = n
107f0 43 6f 6c 3b 0a 20 20 69 66 28 20 70 46 72 6f 6d  Col;.  if( pFrom
10800 43 6f 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 70 46  Col==0 ){.    pF
10810 4b 65 79 2d 3e 61 43 6f 6c 5b 30 5d 2e 69 46 72  Key->aCol[0].iFr
10820 6f 6d 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a  om = p->nCol-1;.
10830 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 6f 72    }else{.    for
10840 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b  (i=0; i<nCol; i+
10850 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b  +){.      int j;
10860 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20  .      for(j=0; 
10870 6a 3c 70 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b  j<p->nCol; j++){
10880 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c  .        if( sql
10890 69 74 65 33 53 74 72 49 43 6d 70 28 70 2d 3e 61  ite3StrICmp(p->a
108a0 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 2c 20 70 46  Col[j].zName, pF
108b0 72 6f 6d 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61  romCol->a[i].zNa
108c0 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  me)==0 ){.      
108d0 20 20 20 20 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b      pFKey->aCol[
108e0 69 5d 2e 69 46 72 6f 6d 20 3d 20 6a 3b 0a 20 20  i].iFrom = j;.  
108f0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
10900 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
10910 0a 20 20 20 20 20 20 69 66 28 20 6a 3e 3d 70 2d  .      if( j>=p-
10920 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 20  >nCol ){.       
10930 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
10940 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20  (pParse, .      
10950 20 20 20 20 22 75 6e 6b 6e 6f 77 6e 20 63 6f 6c      "unknown col
10960 75 6d 6e 20 5c 22 25 73 5c 22 20 69 6e 20 66 6f  umn \"%s\" in fo
10970 72 65 69 67 6e 20 6b 65 79 20 64 65 66 69 6e 69  reign key defini
10980 74 69 6f 6e 22 2c 20 0a 20 20 20 20 20 20 20 20  tion", .        
10990 20 20 70 46 72 6f 6d 43 6f 6c 2d 3e 61 5b 69 5d    pFromCol->a[i]
109a0 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20  .zName);.       
109b0 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20   goto fk_end;.  
109c0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
109d0 20 20 69 66 28 20 70 54 6f 43 6f 6c 20 29 7b 0a    if( pToCol ){.
109e0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
109f0 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Col; i++){.     
10a00 20 69 6e 74 20 6e 20 3d 20 73 74 72 6c 65 6e 28   int n = strlen(
10a10 70 54 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61  pToCol->a[i].zNa
10a20 6d 65 29 3b 0a 20 20 20 20 20 20 70 46 4b 65 79  me);.      pFKey
10a30 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 43 6f 6c 20 3d  ->aCol[i].zCol =
10a40 20 7a 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79   z;.      memcpy
10a50 28 7a 2c 20 70 54 6f 43 6f 6c 2d 3e 61 5b 69 5d  (z, pToCol->a[i]
10a60 2e 7a 4e 61 6d 65 2c 20 6e 29 3b 0a 20 20 20 20  .zName, n);.    
10a70 20 20 7a 5b 6e 5d 20 3d 20 30 3b 0a 20 20 20 20    z[n] = 0;.    
10a80 20 20 7a 20 2b 3d 20 6e 2b 31 3b 0a 20 20 20 20    z += n+1;.    
10a90 7d 0a 20 20 7d 0a 20 20 70 46 4b 65 79 2d 3e 69  }.  }.  pFKey->i
10aa0 73 44 65 66 65 72 72 65 64 20 3d 20 30 3b 0a 20  sDeferred = 0;. 
10ab0 20 70 46 4b 65 79 2d 3e 64 65 6c 65 74 65 43 6f   pFKey->deleteCo
10ac0 6e 66 20 3d 20 66 6c 61 67 73 20 26 20 30 78 66  nf = flags & 0xf
10ad0 66 3b 0a 20 20 70 46 4b 65 79 2d 3e 75 70 64 61  f;.  pFKey->upda
10ae0 74 65 43 6f 6e 66 20 3d 20 28 66 6c 61 67 73 20  teConf = (flags 
10af0 3e 3e 20 38 20 29 20 26 20 30 78 66 66 3b 0a 20  >> 8 ) & 0xff;. 
10b00 20 70 46 4b 65 79 2d 3e 69 6e 73 65 72 74 43 6f   pFKey->insertCo
10b10 6e 66 20 3d 20 28 66 6c 61 67 73 20 3e 3e 20 31  nf = (flags >> 1
10b20 36 20 29 20 26 20 30 78 66 66 3b 0a 0a 20 20 2f  6 ) & 0xff;..  /
10b30 2a 20 4c 69 6e 6b 20 74 68 65 20 66 6f 72 65 69  * Link the forei
10b40 67 6e 20 6b 65 79 20 74 6f 20 74 68 65 20 74 61  gn key to the ta
10b50 62 6c 65 20 61 73 20 74 68 65 20 6c 61 73 74 20  ble as the last 
10b60 73 74 65 70 2e 0a 20 20 2a 2f 0a 20 20 70 2d 3e  step..  */.  p->
10b70 70 46 4b 65 79 20 3d 20 70 46 4b 65 79 3b 0a 20  pFKey = pFKey;. 
10b80 20 70 46 4b 65 79 20 3d 20 30 3b 0a 0a 66 6b 5f   pFKey = 0;..fk_
10b90 65 6e 64 3a 0a 20 20 73 71 6c 69 74 65 33 5f 66  end:.  sqlite3_f
10ba0 72 65 65 28 70 46 4b 65 79 29 3b 0a 23 65 6e 64  ree(pFKey);.#end
10bb0 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53  if /* !defined(S
10bc0 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49  QLITE_OMIT_FOREI
10bd0 47 4e 5f 4b 45 59 29 20 2a 2f 0a 20 20 73 71 6c  GN_KEY) */.  sql
10be0 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65  ite3ExprListDele
10bf0 74 65 28 70 46 72 6f 6d 43 6f 6c 29 3b 0a 20 20  te(pFromCol);.  
10c00 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
10c10 65 6c 65 74 65 28 70 54 6f 43 6f 6c 29 3b 0a 7d  elete(pToCol);.}
10c20 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
10c30 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77  tine is called w
10c40 68 65 6e 20 61 6e 20 49 4e 49 54 49 41 4c 4c 59  hen an INITIALLY
10c50 20 49 4d 4d 45 44 49 41 54 45 20 6f 72 20 49 4e   IMMEDIATE or IN
10c60 49 54 49 41 4c 4c 59 20 44 45 46 45 52 52 45 44  ITIALLY DEFERRED
10c70 0a 2a 2a 20 63 6c 61 75 73 65 20 69 73 20 73 65  .** clause is se
10c80 65 6e 20 61 73 20 70 61 72 74 20 6f 66 20 61 20  en as part of a 
10c90 66 6f 72 65 69 67 6e 20 6b 65 79 20 64 65 66 69  foreign key defi
10ca0 6e 69 74 69 6f 6e 2e 20 20 54 68 65 20 69 73 44  nition.  The isD
10cb0 65 66 65 72 72 65 64 0a 2a 2a 20 70 61 72 61 6d  eferred.** param
10cc0 65 74 65 72 20 69 73 20 31 20 66 6f 72 20 49 4e  eter is 1 for IN
10cd0 49 54 49 41 4c 4c 59 20 44 45 46 45 52 52 45 44  ITIALLY DEFERRED
10ce0 20 61 6e 64 20 30 20 66 6f 72 20 49 4e 49 54 49   and 0 for INITI
10cf0 41 4c 4c 59 20 49 4d 4d 45 44 49 41 54 45 2e 0a  ALLY IMMEDIATE..
10d00 2a 2a 20 54 68 65 20 62 65 68 61 76 69 6f 72 20  ** The behavior 
10d10 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  of the most rece
10d20 6e 74 6c 79 20 63 72 65 61 74 65 64 20 66 6f 72  ntly created for
10d30 65 69 67 6e 20 6b 65 79 20 69 73 20 61 64 6a 75  eign key is adju
10d40 73 74 65 64 0a 2a 2a 20 61 63 63 6f 72 64 69 6e  sted.** accordin
10d50 67 6c 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  gly..*/.void sql
10d60 69 74 65 33 44 65 66 65 72 46 6f 72 65 69 67 6e  ite3DeferForeign
10d70 4b 65 79 28 50 61 72 73 65 20 2a 70 50 61 72 73  Key(Parse *pPars
10d80 65 2c 20 69 6e 74 20 69 73 44 65 66 65 72 72 65  e, int isDeferre
10d90 64 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  d){.#ifndef SQLI
10da0 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f  TE_OMIT_FOREIGN_
10db0 4b 45 59 0a 20 20 54 61 62 6c 65 20 2a 70 54 61  KEY.  Table *pTa
10dc0 62 3b 0a 20 20 46 4b 65 79 20 2a 70 46 4b 65 79  b;.  FKey *pFKey
10dd0 3b 0a 20 20 69 66 28 20 28 70 54 61 62 20 3d 20  ;.  if( (pTab = 
10de0 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
10df0 65 29 3d 3d 30 20 7c 7c 20 28 70 46 4b 65 79 20  e)==0 || (pFKey 
10e00 3d 20 70 54 61 62 2d 3e 70 46 4b 65 79 29 3d 3d  = pTab->pFKey)==
10e10 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 46  0 ) return;.  pF
10e20 4b 65 79 2d 3e 69 73 44 65 66 65 72 72 65 64 20  Key->isDeferred 
10e30 3d 20 69 73 44 65 66 65 72 72 65 64 3b 0a 23 65  = isDeferred;.#e
10e40 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  ndif.}../*.** Ge
10e50 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74  nerate code that
10e60 20 77 69 6c 6c 20 65 72 61 73 65 20 61 6e 64 20   will erase and 
10e70 72 65 66 69 6c 6c 20 69 6e 64 65 78 20 2a 70 49  refill index *pI
10e80 64 78 2e 20 20 54 68 69 73 20 69 73 0a 2a 2a 20  dx.  This is.** 
10e90 75 73 65 64 20 74 6f 20 69 6e 69 74 69 61 6c 69  used to initiali
10ea0 7a 65 20 61 20 6e 65 77 6c 79 20 63 72 65 61 74  ze a newly creat
10eb0 65 64 20 69 6e 64 65 78 20 6f 72 20 74 6f 20 72  ed index or to r
10ec0 65 63 6f 6d 70 75 74 65 20 74 68 65 0a 2a 2a 20  ecompute the.** 
10ed0 63 6f 6e 74 65 6e 74 20 6f 66 20 61 6e 20 69 6e  content of an in
10ee0 64 65 78 20 69 6e 20 72 65 73 70 6f 6e 73 65 20  dex in response 
10ef0 74 6f 20 61 20 52 45 49 4e 44 45 58 20 63 6f 6d  to a REINDEX com
10f00 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 69 66 20 6d  mand..**.** if m
10f10 65 6d 52 6f 6f 74 50 61 67 65 20 69 73 20 6e 6f  emRootPage is no
10f20 74 20 6e 65 67 61 74 69 76 65 2c 20 69 74 20 6d  t negative, it m
10f30 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 69 6e  eans that the in
10f40 64 65 78 20 69 73 20 6e 65 77 6c 79 0a 2a 2a 20  dex is newly.** 
10f50 63 72 65 61 74 65 64 2e 20 20 54 68 65 20 6d 65  created.  The me
10f60 6d 6f 72 79 20 63 65 6c 6c 20 73 70 65 63 69 66  mory cell specif
10f70 69 65 64 20 62 79 20 6d 65 6d 52 6f 6f 74 50 61  ied by memRootPa
10f80 67 65 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 0a  ge contains the.
10f90 2a 2a 20 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d  ** root page num
10fa0 62 65 72 20 6f 66 20 74 68 65 20 69 6e 64 65 78  ber of the index
10fb0 2e 20 20 49 66 20 6d 65 6d 52 6f 6f 74 50 61 67  .  If memRootPag
10fc0 65 20 69 73 20 6e 65 67 61 74 69 76 65 2c 20 74  e is negative, t
10fd0 68 65 6e 0a 2a 2a 20 74 68 65 20 69 6e 64 65 78  hen.** the index
10fe0 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 20   already exists 
10ff0 61 6e 64 20 6d 75 73 74 20 62 65 20 63 6c 65 61  and must be clea
11000 72 65 64 20 62 65 66 6f 72 65 20 62 65 69 6e 67  red before being
11010 20 72 65 66 69 6c 6c 65 64 20 61 6e 64 0a 2a 2a   refilled and.**
11020 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6e   the root page n
11030 75 6d 62 65 72 20 6f 66 20 74 68 65 20 69 6e 64  umber of the ind
11040 65 78 20 69 73 20 74 61 6b 65 6e 20 66 72 6f 6d  ex is taken from
11050 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 2e 0a 2a   pIndex->tnum..*
11060 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 71  /.static void sq
11070 6c 69 74 65 33 52 65 66 69 6c 6c 49 6e 64 65 78  lite3RefillIndex
11080 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
11090 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 2c 20 69  Index *pIndex, i
110a0 6e 74 20 6d 65 6d 52 6f 6f 74 50 61 67 65 29 7b  nt memRootPage){
110b0 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d  .  Table *pTab =
110c0 20 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 3b   pIndex->pTable;
110d0 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 74    /* The table t
110e0 68 61 74 20 69 73 20 69 6e 64 65 78 65 64 20 2a  hat is indexed *
110f0 2f 0a 20 20 69 6e 74 20 69 54 61 62 20 3d 20 70  /.  int iTab = p
11100 50 61 72 73 65 2d 3e 6e 54 61 62 3b 20 20 20 20  Parse->nTab;    
11110 20 20 20 2f 2a 20 42 74 72 65 65 20 63 75 72 73     /* Btree curs
11120 6f 72 20 75 73 65 64 20 66 6f 72 20 70 54 61 62  or used for pTab
11130 20 2a 2f 0a 20 20 69 6e 74 20 69 49 64 78 20 3d   */.  int iIdx =
11140 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 31 3b   pParse->nTab+1;
11150 20 20 20 20 20 2f 2a 20 42 74 72 65 65 20 63 75       /* Btree cu
11160 72 73 6f 72 20 75 73 65 64 20 66 6f 72 20 70 49  rsor used for pI
11170 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 61 64  ndex */.  int ad
11180 64 72 31 3b 20 20 20 20 20 20 20 20 20 20 20 20  dr1;            
11190 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72           /* Addr
111a0 65 73 73 20 6f 66 20 74 6f 70 20 6f 66 20 6c 6f  ess of top of lo
111b0 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 74 6e 75 6d  op */.  int tnum
111c0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
111d0 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70         /* Root p
111e0 61 67 65 20 6f 66 20 69 6e 64 65 78 20 2a 2f 0a  age of index */.
111f0 20 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20 20    Vdbe *v;      
11200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11210 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
11220 65 20 69 6e 74 6f 20 74 68 69 73 20 76 69 72 74  e into this virt
11230 75 61 6c 20 6d 61 63 68 69 6e 65 20 2a 2f 0a 20  ual machine */. 
11240 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 3b 20   KeyInfo *pKey; 
11250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11260 2f 2a 20 4b 65 79 49 6e 66 6f 20 66 6f 72 20 69  /* KeyInfo for i
11270 6e 64 65 78 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ndex */.  sqlite
11280 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
11290 64 62 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20  db;      /* The 
112a0 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
112b0 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62  ion */.  int iDb
112c0 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61   = sqlite3Schema
112d0 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 49 6e 64  ToIndex(db, pInd
112e0 65 78 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 0a 23  ex->pSchema);..#
112f0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
11300 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e  IT_AUTHORIZATION
11310 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75  .  if( sqlite3Au
11320 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  thCheck(pParse, 
11330 53 51 4c 49 54 45 5f 52 45 49 4e 44 45 58 2c 20  SQLITE_REINDEX, 
11340 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 30  pIndex->zName, 0
11350 2c 0a 20 20 20 20 20 20 64 62 2d 3e 61 44 62 5b  ,.      db->aDb[
11360 69 44 62 5d 2e 7a 4e 61 6d 65 20 29 20 29 7b 0a  iDb].zName ) ){.
11370 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
11380 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 52 65 71  #endif..  /* Req
11390 75 69 72 65 20 61 20 77 72 69 74 65 2d 6c 6f 63  uire a write-loc
113a0 6b 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 20 74  k on the table t
113b0 6f 20 70 65 72 66 6f 72 6d 20 74 68 69 73 20 6f  o perform this o
113c0 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 73 71  peration */.  sq
113d0 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28 70  lite3TableLock(p
113e0 50 61 72 73 65 2c 20 69 44 62 2c 20 70 54 61 62  Parse, iDb, pTab
113f0 2d 3e 74 6e 75 6d 2c 20 31 2c 20 70 54 61 62 2d  ->tnum, 1, pTab-
11400 3e 7a 4e 61 6d 65 29 3b 0a 0a 20 20 76 20 3d 20  >zName);..  v = 
11410 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
11420 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76 3d  Parse);.  if( v=
11430 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69  =0 ) return;.  i
11440 66 28 20 6d 65 6d 52 6f 6f 74 50 61 67 65 3e 3d  f( memRootPage>=
11450 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
11460 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
11470 4d 65 6d 4c 6f 61 64 2c 20 6d 65 6d 52 6f 6f 74  MemLoad, memRoot
11480 50 61 67 65 2c 20 30 29 3b 0a 20 20 20 20 74 6e  Page, 0);.    tn
11490 75 6d 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b  um = 0;.  }else{
114a0 0a 20 20 20 20 74 6e 75 6d 20 3d 20 70 49 6e 64  .    tnum = pInd
114b0 65 78 2d 3e 74 6e 75 6d 3b 0a 20 20 20 20 73 71  ex->tnum;.    sq
114c0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
114d0 2c 20 4f 50 5f 43 6c 65 61 72 2c 20 74 6e 75 6d  , OP_Clear, tnum
114e0 2c 20 69 44 62 29 3b 0a 20 20 7d 0a 20 20 73 71  , iDb);.  }.  sq
114f0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
11500 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 69 44  , OP_Integer, iD
11510 62 2c 20 30 29 3b 0a 20 20 70 4b 65 79 20 3d 20  b, 0);.  pKey = 
11520 73 71 6c 69 74 65 33 49 6e 64 65 78 4b 65 79 69  sqlite3IndexKeyi
11530 6e 66 6f 28 70 50 61 72 73 65 2c 20 70 49 6e 64  nfo(pParse, pInd
11540 65 78 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  ex);.  sqlite3Vd
11550 62 65 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e  beOp3(v, OP_Open
11560 57 72 69 74 65 2c 20 69 49 64 78 2c 20 74 6e 75  Write, iIdx, tnu
11570 6d 2c 20 28 63 68 61 72 20 2a 29 70 4b 65 79 2c  m, (char *)pKey,
11580 20 50 33 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44   P3_KEYINFO_HAND
11590 4f 46 46 29 3b 0a 20 20 73 71 6c 69 74 65 33 4f  OFF);.  sqlite3O
115a0 70 65 6e 54 61 62 6c 65 28 70 50 61 72 73 65 2c  penTable(pParse,
115b0 20 69 54 61 62 2c 20 69 44 62 2c 20 70 54 61 62   iTab, iDb, pTab
115c0 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64 29 3b 0a  , OP_OpenRead);.
115d0 20 20 61 64 64 72 31 20 3d 20 73 71 6c 69 74 65    addr1 = sqlite
115e0 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
115f0 5f 52 65 77 69 6e 64 2c 20 69 54 61 62 2c 20 30  _Rewind, iTab, 0
11600 29 3b 0a 20 20 73 71 6c 69 74 65 33 47 65 6e 65  );.  sqlite3Gene
11610 72 61 74 65 49 6e 64 65 78 4b 65 79 28 76 2c 20  rateIndexKey(v, 
11620 70 49 6e 64 65 78 2c 20 69 54 61 62 29 3b 0a 20  pIndex, iTab);. 
11630 20 69 66 28 20 70 49 6e 64 65 78 2d 3e 6f 6e 45   if( pIndex->onE
11640 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 20 29 7b  rror!=OE_None ){
11650 0a 20 20 20 20 69 6e 74 20 63 75 72 61 64 64 72  .    int curaddr
11660 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75   = sqlite3VdbeCu
11670 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20  rrentAddr(v);.  
11680 20 20 69 6e 74 20 61 64 64 72 32 20 3d 20 63 75    int addr2 = cu
11690 72 61 64 64 72 2b 34 3b 0a 20 20 20 20 73 71 6c  raddr+4;.    sql
116a0 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 32  ite3VdbeChangeP2
116b0 28 76 2c 20 63 75 72 61 64 64 72 2d 31 2c 20 61  (v, curaddr-1, a
116c0 64 64 72 32 29 3b 0a 20 20 20 20 73 71 6c 69 74  ddr2);.    sqlit
116d0 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
116e0 50 5f 52 6f 77 69 64 2c 20 69 54 61 62 2c 20 30  P_Rowid, iTab, 0
116f0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
11700 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 41 64  beAddOp(v, OP_Ad
11710 64 49 6d 6d 2c 20 31 2c 20 30 29 3b 0a 20 20 20  dImm, 1, 0);.   
11720 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
11730 70 28 76 2c 20 4f 50 5f 49 73 55 6e 69 71 75 65  p(v, OP_IsUnique
11740 2c 20 69 49 64 78 2c 20 61 64 64 72 32 29 3b 0a  , iIdx, addr2);.
11750 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f      sqlite3VdbeO
11760 70 33 28 76 2c 20 4f 50 5f 48 61 6c 74 2c 20 53  p3(v, OP_Halt, S
11770 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
11780 2c 20 4f 45 5f 41 62 6f 72 74 2c 0a 20 20 20 20  , OE_Abort,.    
11790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
117a0 22 69 6e 64 65 78 65 64 20 63 6f 6c 75 6d 6e 73  "indexed columns
117b0 20 61 72 65 20 6e 6f 74 20 75 6e 69 71 75 65 22   are not unique"
117c0 2c 20 50 33 5f 53 54 41 54 49 43 29 3b 0a 20 20  , P3_STATIC);.  
117d0 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6d 61    assert( db->ma
117e0 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20 61 64  llocFailed || ad
117f0 64 72 32 3d 3d 73 71 6c 69 74 65 33 56 64 62 65  dr2==sqlite3Vdbe
11800 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 20 29  CurrentAddr(v) )
11810 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56  ;.  }.  sqlite3V
11820 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49  dbeAddOp(v, OP_I
11830 64 78 49 6e 73 65 72 74 2c 20 69 49 64 78 2c 20  dxInsert, iIdx, 
11840 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  0);.  sqlite3Vdb
11850 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 65 78  eAddOp(v, OP_Nex
11860 74 2c 20 69 54 61 62 2c 20 61 64 64 72 31 2b 31  t, iTab, addr1+1
11870 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
11880 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
11890 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  1);.  sqlite3Vdb
118a0 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f  eAddOp(v, OP_Clo
118b0 73 65 2c 20 69 54 61 62 2c 20 30 29 3b 0a 20 20  se, iTab, 0);.  
118c0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
118d0 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 69 49  (v, OP_Close, iI
118e0 64 78 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  dx, 0);.}../*.**
118f0 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 69 6e   Create a new in
11900 64 65 78 20 66 6f 72 20 61 6e 20 53 51 4c 20 74  dex for an SQL t
11910 61 62 6c 65 2e 20 20 70 4e 61 6d 65 31 2e 70 4e  able.  pName1.pN
11920 61 6d 65 32 20 69 73 20 74 68 65 20 6e 61 6d 65  ame2 is the name
11930 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 0a 2a   of the index .*
11940 2a 20 61 6e 64 20 70 54 62 6c 4c 69 73 74 20 69  * and pTblList i
11950 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  s the name of th
11960 65 20 74 61 62 6c 65 20 74 68 61 74 20 69 73 20  e table that is 
11970 74 6f 20 62 65 20 69 6e 64 65 78 65 64 2e 20 20  to be indexed.  
11980 42 6f 74 68 20 77 69 6c 6c 20 0a 2a 2a 20 62 65  Both will .** be
11990 20 4e 55 4c 4c 20 66 6f 72 20 61 20 70 72 69 6d   NULL for a prim
119a0 61 72 79 20 6b 65 79 20 6f 72 20 61 6e 20 69 6e  ary key or an in
119b0 64 65 78 20 74 68 61 74 20 69 73 20 63 72 65 61  dex that is crea
119c0 74 65 64 20 74 6f 20 73 61 74 69 73 66 79 20 61  ted to satisfy a
119d0 0a 2a 2a 20 55 4e 49 51 55 45 20 63 6f 6e 73 74  .** UNIQUE const
119e0 72 61 69 6e 74 2e 20 20 49 66 20 70 54 61 62 6c  raint.  If pTabl
119f0 65 20 61 6e 64 20 70 49 6e 64 65 78 20 61 72 65  e and pIndex are
11a00 20 4e 55 4c 4c 2c 20 75 73 65 20 70 50 61 72 73   NULL, use pPars
11a10 65 2d 3e 70 4e 65 77 54 61 62 6c 65 0a 2a 2a 20  e->pNewTable.** 
11a20 61 73 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20  as the table to 
11a30 62 65 20 69 6e 64 65 78 65 64 2e 20 20 70 50 61  be indexed.  pPa
11a40 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 69  rse->pNewTable i
11a50 73 20 61 20 74 61 62 6c 65 20 74 68 61 74 20 69  s a table that i
11a60 73 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 62  s.** currently b
11a70 65 69 6e 67 20 63 6f 6e 73 74 72 75 63 74 65 64  eing constructed
11a80 20 62 79 20 61 20 43 52 45 41 54 45 20 54 41 42   by a CREATE TAB
11a90 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a  LE statement..**
11aa0 0a 2a 2a 20 70 4c 69 73 74 20 69 73 20 61 20 6c  .** pList is a l
11ab0 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74  ist of columns t
11ac0 6f 20 62 65 20 69 6e 64 65 78 65 64 2e 20 20 70  o be indexed.  p
11ad0 4c 69 73 74 20 77 69 6c 6c 20 62 65 20 4e 55 4c  List will be NUL
11ae0 4c 20 69 66 20 74 68 69 73 0a 2a 2a 20 69 73 20  L if this.** is 
11af0 61 20 70 72 69 6d 61 72 79 20 6b 65 79 20 6f 72  a primary key or
11b00 20 75 6e 69 71 75 65 2d 63 6f 6e 73 74 72 61 69   unique-constrai
11b10 6e 74 20 6f 6e 20 74 68 65 20 6d 6f 73 74 20 72  nt on the most r
11b20 65 63 65 6e 74 20 63 6f 6c 75 6d 6e 20 61 64 64  ecent column add
11b30 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20 74 61 62  ed.** to the tab
11b40 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64  le currently und
11b50 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e  er construction.
11b60 20 20 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74    .*/.void sqlit
11b70 65 33 43 72 65 61 74 65 49 6e 64 65 78 28 0a 20  e3CreateIndex(. 
11b80 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
11b90 20 20 20 20 2f 2a 20 41 6c 6c 20 69 6e 66 6f 72      /* All infor
11ba0 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 69  mation about thi
11bb0 73 20 70 61 72 73 65 20 2a 2f 0a 20 20 54 6f 6b  s parse */.  Tok
11bc0 65 6e 20 2a 70 4e 61 6d 65 31 2c 20 20 20 20 20  en *pName1,     
11bd0 2f 2a 20 46 69 72 73 74 20 70 61 72 74 20 6f 66  /* First part of
11be0 20 69 6e 64 65 78 20 6e 61 6d 65 2e 20 4d 61 79   index name. May
11bf0 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 54 6f   be NULL */.  To
11c00 6b 65 6e 20 2a 70 4e 61 6d 65 32 2c 20 20 20 20  ken *pName2,    
11c10 20 2f 2a 20 53 65 63 6f 6e 64 20 70 61 72 74 20   /* Second part 
11c20 6f 66 20 69 6e 64 65 78 20 6e 61 6d 65 2e 20 4d  of index name. M
11c30 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20  ay be NULL */.  
11c40 53 72 63 4c 69 73 74 20 2a 70 54 62 6c 4e 61 6d  SrcList *pTblNam
11c50 65 2c 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20 69  e, /* Table to i
11c60 6e 64 65 78 2e 20 55 73 65 20 70 50 61 72 73 65  ndex. Use pParse
11c70 2d 3e 70 4e 65 77 54 61 62 6c 65 20 69 66 20 30  ->pNewTable if 0
11c80 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
11c90 70 4c 69 73 74 2c 20 20 20 2f 2a 20 41 20 6c 69  pList,   /* A li
11ca0 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 6f  st of columns to
11cb0 20 62 65 20 69 6e 64 65 78 65 64 20 2a 2f 0a 20   be indexed */. 
11cc0 20 69 6e 74 20 6f 6e 45 72 72 6f 72 2c 20 20 20   int onError,   
11cd0 20 20 20 20 2f 2a 20 4f 45 5f 41 62 6f 72 74 2c      /* OE_Abort,
11ce0 20 4f 45 5f 49 67 6e 6f 72 65 2c 20 4f 45 5f 52   OE_Ignore, OE_R
11cf0 65 70 6c 61 63 65 2c 20 6f 72 20 4f 45 5f 4e 6f  eplace, or OE_No
11d00 6e 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  ne */.  Token *p
11d10 53 74 61 72 74 2c 20 20 20 20 20 2f 2a 20 54 68  Start,     /* Th
11d20 65 20 43 52 45 41 54 45 20 74 6f 6b 65 6e 20 74  e CREATE token t
11d30 68 61 74 20 62 65 67 69 6e 73 20 74 68 69 73 20  hat begins this 
11d40 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 54  statement */.  T
11d50 6f 6b 65 6e 20 2a 70 45 6e 64 2c 20 20 20 20 20  oken *pEnd,     
11d60 20 20 2f 2a 20 54 68 65 20 22 29 22 20 74 68 61    /* The ")" tha
11d70 74 20 63 6c 6f 73 65 73 20 74 68 65 20 43 52 45  t closes the CRE
11d80 41 54 45 20 49 4e 44 45 58 20 73 74 61 74 65 6d  ATE INDEX statem
11d90 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 73 6f 72  ent */.  int sor
11da0 74 4f 72 64 65 72 2c 20 20 20 20 20 2f 2a 20 53  tOrder,     /* S
11db0 6f 72 74 20 6f 72 64 65 72 20 6f 66 20 70 72 69  ort order of pri
11dc0 6d 61 72 79 20 6b 65 79 20 77 68 65 6e 20 70 4c  mary key when pL
11dd0 69 73 74 3d 3d 4e 55 4c 4c 20 2a 2f 0a 20 20 69  ist==NULL */.  i
11de0 6e 74 20 69 66 4e 6f 74 45 78 69 73 74 20 20 20  nt ifNotExist   
11df0 20 20 2f 2a 20 4f 6d 69 74 20 65 72 72 6f 72 20    /* Omit error 
11e00 69 66 20 69 6e 64 65 78 20 61 6c 72 65 61 64 79  if index already
11e10 20 65 78 69 73 74 73 20 2a 2f 0a 29 7b 0a 20 20   exists */.){.  
11e20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 30 3b  Table *pTab = 0;
11e30 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 74 6f       /* Table to
11e40 20 62 65 20 69 6e 64 65 78 65 64 20 2a 2f 0a 20   be indexed */. 
11e50 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 20 3d   Index *pIndex =
11e60 20 30 3b 20 20 20 2f 2a 20 54 68 65 20 69 6e 64   0;   /* The ind
11e70 65 78 20 74 6f 20 62 65 20 63 72 65 61 74 65 64  ex to be created
11e80 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d   */.  char *zNam
11e90 65 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 4e 61  e = 0;     /* Na
11ea0 6d 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20  me of the index 
11eb0 2a 2f 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 3b 20  */.  int nName; 
11ec0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
11ed0 62 65 72 20 6f 66 20 63 68 61 72 61 63 74 65 72  ber of character
11ee0 73 20 69 6e 20 7a 4e 61 6d 65 20 2a 2f 0a 20 20  s in zName */.  
11ef0 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 54 6f 6b 65  int i, j;.  Toke
11f00 6e 20 6e 75 6c 6c 49 64 3b 20 20 20 20 20 20 20  n nullId;       
11f10 20 2f 2a 20 46 61 6b 65 20 74 6f 6b 65 6e 20 66   /* Fake token f
11f20 6f 72 20 61 6e 20 65 6d 70 74 79 20 49 44 20 6c  or an empty ID l
11f30 69 73 74 20 2a 2f 0a 20 20 44 62 46 69 78 65 72  ist */.  DbFixer
11f40 20 73 46 69 78 3b 20 20 20 20 20 20 20 20 2f 2a   sFix;        /*
11f50 20 46 6f 72 20 61 73 73 69 67 6e 69 6e 67 20 64   For assigning d
11f60 61 74 61 62 61 73 65 20 6e 61 6d 65 73 20 74 6f  atabase names to
11f70 20 70 54 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74   pTable */.  int
11f80 20 73 6f 72 74 4f 72 64 65 72 4d 61 73 6b 3b 20   sortOrderMask; 
11f90 20 20 2f 2a 20 31 20 74 6f 20 68 6f 6e 6f 72 20    /* 1 to honor 
11fa0 44 45 53 43 20 69 6e 20 69 6e 64 65 78 2e 20 20  DESC in index.  
11fb0 30 20 74 6f 20 69 67 6e 6f 72 65 2e 20 2a 2f 0a  0 to ignore. */.
11fc0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
11fd0 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 44 62  pParse->db;.  Db
11fe0 20 2a 70 44 62 3b 20 20 20 20 20 20 20 20 20 20   *pDb;          
11ff0 20 20 20 2f 2a 20 54 68 65 20 73 70 65 63 69 66     /* The specif
12000 69 63 20 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e  ic table contain
12010 69 6e 67 20 74 68 65 20 69 6e 64 65 78 65 64 20  ing the indexed 
12020 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 69 6e  database */.  in
12030 74 20 69 44 62 3b 20 20 20 20 20 20 20 20 20 20  t iDb;          
12040 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74     /* Index of t
12050 68 65 20 64 61 74 61 62 61 73 65 20 74 68 61 74  he database that
12060 20 69 73 20 62 65 69 6e 67 20 77 72 69 74 74 65   is being writte
12070 6e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e  n */.  Token *pN
12080 61 6d 65 20 3d 20 30 3b 20 20 20 20 2f 2a 20 55  ame = 0;    /* U
12090 6e 71 75 61 6c 69 66 69 65 64 20 6e 61 6d 65 20  nqualified name 
120a0 6f 66 20 74 68 65 20 69 6e 64 65 78 20 74 6f 20  of the index to 
120b0 63 72 65 61 74 65 20 2a 2f 0a 20 20 73 74 72 75  create */.  stru
120c0 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
120d0 20 2a 70 4c 69 73 74 49 74 65 6d 3b 20 2f 2a 20   *pListItem; /* 
120e0 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72  For looping over
120f0 20 70 4c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20   pList */.  int 
12100 6e 43 6f 6c 3b 0a 20 20 69 6e 74 20 6e 45 78 74  nCol;.  int nExt
12110 72 61 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a  ra = 0;.  char *
12120 7a 45 78 74 72 61 3b 0a 0a 20 20 69 66 28 20 70  zExtra;..  if( p
12130 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 64  Parse->nErr || d
12140 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
12150 7c 7c 20 49 4e 5f 44 45 43 4c 41 52 45 5f 56 54  || IN_DECLARE_VT
12160 41 42 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65  AB ){.    goto e
12170 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
12180 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a  ;.  }..  /*.  **
12190 20 46 69 6e 64 20 74 68 65 20 74 61 62 6c 65 20   Find the table 
121a0 74 68 61 74 20 69 73 20 74 6f 20 62 65 20 69 6e  that is to be in
121b0 64 65 78 65 64 2e 20 20 52 65 74 75 72 6e 20 65  dexed.  Return e
121c0 61 72 6c 79 20 69 66 20 6e 6f 74 20 66 6f 75 6e  arly if not foun
121d0 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 54  d..  */.  if( pT
121e0 62 6c 4e 61 6d 65 21 3d 30 20 29 7b 0a 0a 20 20  blName!=0 ){..  
121f0 20 20 2f 2a 20 55 73 65 20 74 68 65 20 74 77 6f    /* Use the two
12200 2d 70 61 72 74 20 69 6e 64 65 78 20 6e 61 6d 65  -part index name
12210 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68   to determine th
12220 65 20 64 61 74 61 62 61 73 65 20 0a 20 20 20 20  e database .    
12230 2a 2a 20 74 6f 20 73 65 61 72 63 68 20 66 6f 72  ** to search for
12240 20 74 68 65 20 74 61 62 6c 65 2e 20 27 46 69 78   the table. 'Fix
12250 27 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65  ' the table name
12260 20 74 6f 20 74 68 69 73 20 64 62 0a 20 20 20 20   to this db.    
12270 2a 2a 20 62 65 66 6f 72 65 20 6c 6f 6f 6b 69 6e  ** before lookin
12280 67 20 75 70 20 74 68 65 20 74 61 62 6c 65 2e 0a  g up the table..
12290 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72      */.    asser
122a0 74 28 20 70 4e 61 6d 65 31 20 26 26 20 70 4e 61  t( pName1 && pNa
122b0 6d 65 32 20 29 3b 0a 20 20 20 20 69 44 62 20 3d  me2 );.    iDb =
122c0 20 73 71 6c 69 74 65 33 54 77 6f 50 61 72 74 4e   sqlite3TwoPartN
122d0 61 6d 65 28 70 50 61 72 73 65 2c 20 70 4e 61 6d  ame(pParse, pNam
122e0 65 31 2c 20 70 4e 61 6d 65 32 2c 20 26 70 4e 61  e1, pName2, &pNa
122f0 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 69 44 62  me);.    if( iDb
12300 3c 30 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63  <0 ) goto exit_c
12310 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 0a 23 69  reate_index;..#i
12320 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
12330 54 5f 54 45 4d 50 44 42 0a 20 20 20 20 2f 2a 20  T_TEMPDB.    /* 
12340 49 66 20 74 68 65 20 69 6e 64 65 78 20 6e 61 6d  If the index nam
12350 65 20 77 61 73 20 75 6e 71 75 61 6c 69 66 69 65  e was unqualifie
12360 64 2c 20 63 68 65 63 6b 20 69 66 20 74 68 65 20  d, check if the 
12370 74 68 65 20 74 61 62 6c 65 0a 20 20 20 20 2a 2a  the table.    **
12380 20 69 73 20 61 20 74 65 6d 70 20 74 61 62 6c 65   is a temp table
12390 2e 20 49 66 20 73 6f 2c 20 73 65 74 20 74 68 65  . If so, set the
123a0 20 64 61 74 61 62 61 73 65 20 74 6f 20 31 2e 0a   database to 1..
123b0 20 20 20 20 2a 2f 0a 20 20 20 20 70 54 61 62 20      */.    pTab 
123c0 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74  = sqlite3SrcList
123d0 4c 6f 6f 6b 75 70 28 70 50 61 72 73 65 2c 20 70  Lookup(pParse, p
123e0 54 62 6c 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66  TblName);.    if
123f0 28 20 70 4e 61 6d 65 32 20 26 26 20 70 4e 61 6d  ( pName2 && pNam
12400 65 32 2d 3e 6e 3d 3d 30 20 26 26 20 70 54 61 62  e2->n==0 && pTab
12410 20 26 26 20 70 54 61 62 2d 3e 70 53 63 68 65 6d   && pTab->pSchem
12420 61 3d 3d 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 53  a==db->aDb[1].pS
12430 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 20 20 69  chema ){.      i
12440 44 62 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 23 65  Db = 1;.    }.#e
12450 6e 64 69 66 0a 0a 20 20 20 20 69 66 28 20 73 71  ndif..    if( sq
12460 6c 69 74 65 33 46 69 78 49 6e 69 74 28 26 73 46  lite3FixInit(&sF
12470 69 78 2c 20 70 50 61 72 73 65 2c 20 69 44 62 2c  ix, pParse, iDb,
12480 20 22 69 6e 64 65 78 22 2c 20 70 4e 61 6d 65 29   "index", pName)
12490 20 26 26 0a 20 20 20 20 20 20 20 20 73 71 6c 69   &&.        sqli
124a0 74 65 33 46 69 78 53 72 63 4c 69 73 74 28 26 73  te3FixSrcList(&s
124b0 46 69 78 2c 20 70 54 62 6c 4e 61 6d 65 29 0a 20  Fix, pTblName). 
124c0 20 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 42     ){.      /* B
124d0 65 63 61 75 73 65 20 74 68 65 20 70 61 72 73 65  ecause the parse
124e0 72 20 63 6f 6e 73 74 72 75 63 74 73 20 70 54 62  r constructs pTb
124f0 6c 4e 61 6d 65 20 66 72 6f 6d 20 61 20 73 69 6e  lName from a sin
12500 67 6c 65 20 69 64 65 6e 74 69 66 69 65 72 2c 0a  gle identifier,.
12510 20 20 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33        ** sqlite3
12520 46 69 78 53 72 63 4c 69 73 74 20 63 61 6e 20 6e  FixSrcList can n
12530 65 76 65 72 20 66 61 69 6c 2e 20 2a 2f 0a 20 20  ever fail. */.  
12540 20 20 20 20 61 73 73 65 72 74 28 30 29 3b 0a 20      assert(0);. 
12550 20 20 20 7d 0a 20 20 20 20 70 54 61 62 20 3d 20     }.    pTab = 
12560 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62  sqlite3LocateTab
12570 6c 65 28 70 50 61 72 73 65 2c 20 70 54 62 6c 4e  le(pParse, pTblN
12580 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 4e 61 6d 65 2c  ame->a[0].zName,
12590 20 0a 20 20 20 20 20 20 20 20 70 54 62 6c 4e 61   .        pTblNa
125a0 6d 65 2d 3e 61 5b 30 5d 2e 7a 44 61 74 61 62 61  me->a[0].zDataba
125b0 73 65 29 3b 0a 20 20 20 20 69 66 28 20 21 70 54  se);.    if( !pT
125c0 61 62 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63  ab ) goto exit_c
125d0 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20  reate_index;.   
125e0 20 61 73 73 65 72 74 28 20 64 62 2d 3e 61 44 62   assert( db->aDb
125f0 5b 69 44 62 5d 2e 70 53 63 68 65 6d 61 3d 3d 70  [iDb].pSchema==p
12600 54 61 62 2d 3e 70 53 63 68 65 6d 61 20 29 3b 0a  Tab->pSchema );.
12610 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73    }else{.    ass
12620 65 72 74 28 20 70 4e 61 6d 65 3d 3d 30 20 29 3b  ert( pName==0 );
12630 0a 20 20 20 20 70 54 61 62 20 3d 20 70 50 61 72  .    pTab = pPar
12640 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20  se->pNewTable;. 
12650 20 20 20 69 66 28 20 21 70 54 61 62 20 29 20 67     if( !pTab ) g
12660 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
12670 69 6e 64 65 78 3b 0a 20 20 20 20 69 44 62 20 3d  index;.    iDb =
12680 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f   sqlite3SchemaTo
12690 49 6e 64 65 78 28 64 62 2c 20 70 54 61 62 2d 3e  Index(db, pTab->
126a0 70 53 63 68 65 6d 61 29 3b 0a 20 20 7d 0a 20 20  pSchema);.  }.  
126b0 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69  pDb = &db->aDb[i
126c0 44 62 5d 3b 0a 0a 20 20 69 66 28 20 70 54 61 62  Db];..  if( pTab
126d0 3d 3d 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e  ==0 || pParse->n
126e0 45 72 72 20 29 20 67 6f 74 6f 20 65 78 69 74 5f  Err ) goto exit_
126f0 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
12700 69 66 28 20 70 54 61 62 2d 3e 72 65 61 64 4f 6e  if( pTab->readOn
12710 6c 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ly ){.    sqlite
12720 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
12730 2c 20 22 74 61 62 6c 65 20 25 73 20 6d 61 79 20  , "table %s may 
12740 6e 6f 74 20 62 65 20 69 6e 64 65 78 65 64 22 2c  not be indexed",
12750 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20   pTab->zName);. 
12760 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65     goto exit_cre
12770 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 23  ate_index;.  }.#
12780 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
12790 49 54 5f 56 49 45 57 0a 20 20 69 66 28 20 70 54  IT_VIEW.  if( pT
127a0 61 62 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20  ab->pSelect ){. 
127b0 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
127c0 73 67 28 70 50 61 72 73 65 2c 20 22 76 69 65 77  sg(pParse, "view
127d0 73 20 6d 61 79 20 6e 6f 74 20 62 65 20 69 6e 64  s may not be ind
127e0 65 78 65 64 22 29 3b 0a 20 20 20 20 67 6f 74 6f  exed");.    goto
127f0 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
12800 65 78 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 23  ex;.  }.#endif.#
12810 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
12820 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
12830 20 20 69 66 28 20 49 73 56 69 72 74 75 61 6c 28    if( IsVirtual(
12840 70 54 61 62 29 20 29 7b 0a 20 20 20 20 73 71 6c  pTab) ){.    sql
12850 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
12860 72 73 65 2c 20 22 76 69 72 74 75 61 6c 20 74 61  rse, "virtual ta
12870 62 6c 65 73 20 6d 61 79 20 6e 6f 74 20 62 65 20  bles may not be 
12880 69 6e 64 65 78 65 64 22 29 3b 0a 20 20 20 20 67  indexed");.    g
12890 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
128a0 69 6e 64 65 78 3b 0a 20 20 7d 0a 23 65 6e 64 69  index;.  }.#endi
128b0 66 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46 69 6e  f..  /*.  ** Fin
128c0 64 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  d the name of th
128d0 65 20 69 6e 64 65 78 2e 20 20 4d 61 6b 65 20 73  e index.  Make s
128e0 75 72 65 20 74 68 65 72 65 20 69 73 20 6e 6f 74  ure there is not
128f0 20 61 6c 72 65 61 64 79 20 61 6e 6f 74 68 65 72   already another
12900 0a 20 20 2a 2a 20 69 6e 64 65 78 20 6f 72 20 74  .  ** index or t
12910 61 62 6c 65 20 77 69 74 68 20 74 68 65 20 73 61  able with the sa
12920 6d 65 20 6e 61 6d 65 2e 20 20 0a 20 20 2a 2a 0a  me name.  .  **.
12930 20 20 2a 2a 20 45 78 63 65 70 74 69 6f 6e 3a 20    ** Exception: 
12940 20 49 66 20 77 65 20 61 72 65 20 72 65 61 64 69   If we are readi
12950 6e 67 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20  ng the names of 
12960 70 65 72 6d 61 6e 65 6e 74 20 69 6e 64 69 63 65  permanent indice
12970 73 20 66 72 6f 6d 20 74 68 65 0a 20 20 2a 2a 20  s from the.  ** 
12980 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61  sqlite_master ta
12990 62 6c 65 20 28 62 65 63 61 75 73 65 20 73 6f 6d  ble (because som
129a0 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20  e other process 
129b0 63 68 61 6e 67 65 64 20 74 68 65 20 73 63 68 65  changed the sche
129c0 6d 61 29 20 61 6e 64 0a 20 20 2a 2a 20 6f 6e 65  ma) and.  ** one
129d0 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 6e 61   of the index na
129e0 6d 65 73 20 63 6f 6c 6c 69 64 65 73 20 77 69 74  mes collides wit
129f0 68 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20  h the name of a 
12a00 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20  temporary table 
12a10 6f 72 0a 20 20 2a 2a 20 69 6e 64 65 78 2c 20 74  or.  ** index, t
12a20 68 65 6e 20 77 65 20 77 69 6c 6c 20 63 6f 6e 74  hen we will cont
12a30 69 6e 75 65 20 74 6f 20 70 72 6f 63 65 73 73 20  inue to process 
12a40 74 68 69 73 20 69 6e 64 65 78 2e 0a 20 20 2a 2a  this index..  **
12a50 0a 20 20 2a 2a 20 49 66 20 70 4e 61 6d 65 3d 3d  .  ** If pName==
12a60 30 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20  0 it means that 
12a70 77 65 20 61 72 65 0a 20 20 2a 2a 20 64 65 61 6c  we are.  ** deal
12a80 69 6e 67 20 77 69 74 68 20 61 20 70 72 69 6d 61  ing with a prima
12a90 72 79 20 6b 65 79 20 6f 72 20 55 4e 49 51 55 45  ry key or UNIQUE
12aa0 20 63 6f 6e 73 74 72 61 69 6e 74 2e 20 20 57 65   constraint.  We
12ab0 20 68 61 76 65 20 74 6f 20 69 6e 76 65 6e 74 20   have to invent 
12ac0 6f 75 72 0a 20 20 2a 2a 20 6f 77 6e 20 6e 61 6d  our.  ** own nam
12ad0 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4e  e..  */.  if( pN
12ae0 61 6d 65 20 29 7b 0a 20 20 20 20 7a 4e 61 6d 65  ame ){.    zName
12af0 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72   = sqlite3NameFr
12b00 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 4e 61 6d  omToken(db, pNam
12b10 65 29 3b 0a 20 20 20 20 69 66 28 20 53 51 4c 49  e);.    if( SQLI
12b20 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65  TE_OK!=sqlite3Re
12b30 61 64 53 63 68 65 6d 61 28 70 50 61 72 73 65 29  adSchema(pParse)
12b40 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65   ) goto exit_cre
12b50 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 69  ate_index;.    i
12b60 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 20 67 6f  f( zName==0 ) go
12b70 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
12b80 6e 64 65 78 3b 0a 20 20 20 20 69 66 28 20 53 51  ndex;.    if( SQ
12b90 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33  LITE_OK!=sqlite3
12ba0 43 68 65 63 6b 4f 62 6a 65 63 74 4e 61 6d 65 28  CheckObjectName(
12bb0 70 50 61 72 73 65 2c 20 7a 4e 61 6d 65 29 20 29  pParse, zName) )
12bc0 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69  {.      goto exi
12bd0 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
12be0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21 64      }.    if( !d
12bf0 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a  b->init.busy ){.
12c00 20 20 20 20 20 20 69 66 28 20 53 51 4c 49 54 45        if( SQLITE
12c10 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65 61 64  _OK!=sqlite3Read
12c20 53 63 68 65 6d 61 28 70 50 61 72 73 65 29 20 29  Schema(pParse) )
12c30 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
12c40 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 20 20 69  e_index;.      i
12c50 66 28 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61  f( sqlite3FindTa
12c60 62 6c 65 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 30  ble(db, zName, 0
12c70 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
12c80 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
12c90 70 50 61 72 73 65 2c 20 22 74 68 65 72 65 20 69  pParse, "there i
12ca0 73 20 61 6c 72 65 61 64 79 20 61 20 74 61 62 6c  s already a tabl
12cb0 65 20 6e 61 6d 65 64 20 25 73 22 2c 20 7a 4e 61  e named %s", zNa
12cc0 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 67 6f 74  me);.        got
12cd0 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
12ce0 64 65 78 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  dex;.      }.   
12cf0 20 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74   }.    if( sqlit
12d00 65 33 46 69 6e 64 49 6e 64 65 78 28 64 62 2c 20  e3FindIndex(db, 
12d10 7a 4e 61 6d 65 2c 20 70 44 62 2d 3e 7a 4e 61 6d  zName, pDb->zNam
12d20 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  e)!=0 ){.      i
12d30 66 28 20 21 69 66 4e 6f 74 45 78 69 73 74 20 29  f( !ifNotExist )
12d40 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
12d50 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
12d60 2c 20 22 69 6e 64 65 78 20 25 73 20 61 6c 72 65  , "index %s alre
12d70 61 64 79 20 65 78 69 73 74 73 22 2c 20 7a 4e 61  ady exists", zNa
12d80 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  me);.      }.   
12d90 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65     goto exit_cre
12da0 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d  ate_index;.    }
12db0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63 68  .  }else{.    ch
12dc0 61 72 20 7a 42 75 66 5b 33 30 5d 3b 0a 20 20 20  ar zBuf[30];.   
12dd0 20 69 6e 74 20 6e 3b 0a 20 20 20 20 49 6e 64 65   int n;.    Inde
12de0 78 20 2a 70 4c 6f 6f 70 3b 0a 20 20 20 20 66 6f  x *pLoop;.    fo
12df0 72 28 70 4c 6f 6f 70 3d 70 54 61 62 2d 3e 70 49  r(pLoop=pTab->pI
12e00 6e 64 65 78 2c 20 6e 3d 31 3b 20 70 4c 6f 6f 70  ndex, n=1; pLoop
12e10 3b 20 70 4c 6f 6f 70 3d 70 4c 6f 6f 70 2d 3e 70  ; pLoop=pLoop->p
12e20 4e 65 78 74 2c 20 6e 2b 2b 29 7b 7d 0a 20 20 20  Next, n++){}.   
12e30 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
12e40 66 28 73 69 7a 65 6f 66 28 7a 42 75 66 29 2c 7a  f(sizeof(zBuf),z
12e50 42 75 66 2c 22 5f 25 64 22 2c 6e 29 3b 0a 20 20  Buf,"_%d",n);.  
12e60 20 20 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20    zName = 0;.   
12e70 20 73 71 6c 69 74 65 33 53 65 74 53 74 72 69 6e   sqlite3SetStrin
12e80 67 28 26 7a 4e 61 6d 65 2c 20 22 73 71 6c 69 74  g(&zName, "sqlit
12e90 65 5f 61 75 74 6f 69 6e 64 65 78 5f 22 2c 20 70  e_autoindex_", p
12ea0 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 42 75 66  Tab->zName, zBuf
12eb0 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20  , (char*)0);.   
12ec0 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 7b   if( zName==0 ){
12ed0 0a 20 20 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f  .      db->mallo
12ee0 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20  cFailed = 1;.   
12ef0 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65     goto exit_cre
12f00 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d  ate_index;.    }
12f10 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  .  }..  /* Check
12f20 20 66 6f 72 20 61 75 74 68 6f 72 69 7a 61 74 69   for authorizati
12f30 6f 6e 20 74 6f 20 63 72 65 61 74 65 20 61 6e 20  on to create an 
12f40 69 6e 64 65 78 2e 0a 20 20 2a 2f 0a 23 69 66 6e  index..  */.#ifn
12f50 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
12f60 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20  AUTHORIZATION.  
12f70 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  {.    const char
12f80 20 2a 7a 44 62 20 3d 20 70 44 62 2d 3e 7a 4e 61   *zDb = pDb->zNa
12f90 6d 65 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69  me;.    if( sqli
12fa0 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61  te3AuthCheck(pPa
12fb0 72 73 65 2c 20 53 51 4c 49 54 45 5f 49 4e 53 45  rse, SQLITE_INSE
12fc0 52 54 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c 45  RT, SCHEMA_TABLE
12fd0 28 69 44 62 29 2c 20 30 2c 20 7a 44 62 29 20 29  (iDb), 0, zDb) )
12fe0 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69  {.      goto exi
12ff0 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
13000 20 20 20 20 7d 0a 20 20 20 20 69 20 3d 20 53 51      }.    i = SQ
13010 4c 49 54 45 5f 43 52 45 41 54 45 5f 49 4e 44 45  LITE_CREATE_INDE
13020 58 3b 0a 20 20 20 20 69 66 28 20 21 4f 4d 49 54  X;.    if( !OMIT
13030 5f 54 45 4d 50 44 42 20 26 26 20 69 44 62 3d 3d  _TEMPDB && iDb==
13040 31 20 29 20 69 20 3d 20 53 51 4c 49 54 45 5f 43  1 ) i = SQLITE_C
13050 52 45 41 54 45 5f 54 45 4d 50 5f 49 4e 44 45 58  REATE_TEMP_INDEX
13060 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
13070 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73  3AuthCheck(pPars
13080 65 2c 20 69 2c 20 7a 4e 61 6d 65 2c 20 70 54 61  e, i, zName, pTa
13090 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 44 62 29 20 29  b->zName, zDb) )
130a0 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69  {.      goto exi
130b0 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
130c0 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
130d0 0a 0a 20 20 2f 2a 20 49 66 20 70 4c 69 73 74 3d  ..  /* If pList=
130e0 3d 30 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 69  =0, it means thi
130f0 73 20 72 6f 75 74 69 6e 65 20 77 61 73 20 63 61  s routine was ca
13100 6c 6c 65 64 20 74 6f 20 6d 61 6b 65 20 61 20 70  lled to make a p
13110 72 69 6d 61 72 79 0a 20 20 2a 2a 20 6b 65 79 20  rimary.  ** key 
13120 6f 75 74 20 6f 66 20 74 68 65 20 6c 61 73 74 20  out of the last 
13130 63 6f 6c 75 6d 6e 20 61 64 64 65 64 20 74 6f 20  column added to 
13140 74 68 65 20 74 61 62 6c 65 20 75 6e 64 65 72 20  the table under 
13150 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 20 20  construction..  
13160 2a 2a 20 53 6f 20 63 72 65 61 74 65 20 61 20 66  ** So create a f
13170 61 6b 65 20 6c 69 73 74 20 74 6f 20 73 69 6d 75  ake list to simu
13180 6c 61 74 65 20 74 68 69 73 2e 0a 20 20 2a 2f 0a  late this..  */.
13190 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29    if( pList==0 )
131a0 7b 0a 20 20 20 20 6e 75 6c 6c 49 64 2e 7a 20 3d  {.    nullId.z =
131b0 20 28 75 38 2a 29 70 54 61 62 2d 3e 61 43 6f 6c   (u8*)pTab->aCol
131c0 5b 70 54 61 62 2d 3e 6e 43 6f 6c 2d 31 5d 2e 7a  [pTab->nCol-1].z
131d0 4e 61 6d 65 3b 0a 20 20 20 20 6e 75 6c 6c 49 64  Name;.    nullId
131e0 2e 6e 20 3d 20 73 74 72 6c 65 6e 28 28 63 68 61  .n = strlen((cha
131f0 72 2a 29 6e 75 6c 6c 49 64 2e 7a 29 3b 0a 20 20  r*)nullId.z);.  
13200 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65    pList = sqlite
13210 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28  3ExprListAppend(
13220 70 50 61 72 73 65 2c 20 30 2c 20 30 2c 20 26 6e  pParse, 0, 0, &n
13230 75 6c 6c 49 64 29 3b 0a 20 20 20 20 69 66 28 20  ullId);.    if( 
13240 70 4c 69 73 74 3d 3d 30 20 29 20 67 6f 74 6f 20  pList==0 ) goto 
13250 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
13260 78 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 61 5b  x;.    pList->a[
13270 30 5d 2e 73 6f 72 74 4f 72 64 65 72 20 3d 20 73  0].sortOrder = s
13280 6f 72 74 4f 72 64 65 72 3b 0a 20 20 7d 0a 0a 20  ortOrder;.  }.. 
13290 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68   /* Figure out h
132a0 6f 77 20 6d 61 6e 79 20 62 79 74 65 73 20 6f 66  ow many bytes of
132b0 20 73 70 61 63 65 20 61 72 65 20 72 65 71 75 69   space are requi
132c0 72 65 64 20 74 6f 20 73 74 6f 72 65 20 65 78 70  red to store exp
132d0 6c 69 63 69 74 6c 79 0a 20 20 2a 2a 20 73 70 65  licitly.  ** spe
132e0 63 69 66 69 65 64 20 63 6f 6c 6c 61 74 69 6f 6e  cified collation
132f0 20 73 65 71 75 65 6e 63 65 20 6e 61 6d 65 73 2e   sequence names.
13300 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b  .  */.  for(i=0;
13310 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b   i<pList->nExpr;
13320 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20   i++){.    Expr 
13330 2a 70 45 78 70 72 20 3d 20 70 4c 69 73 74 2d 3e  *pExpr = pList->
13340 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[i].pExpr;.    
13350 69 66 28 20 70 45 78 70 72 20 29 7b 0a 20 20 20  if( pExpr ){.   
13360 20 20 20 6e 45 78 74 72 61 20 2b 3d 20 28 31 20     nExtra += (1 
13370 2b 20 73 74 72 6c 65 6e 28 70 45 78 70 72 2d 3e  + strlen(pExpr->
13380 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29 29 3b 0a  pColl->zName));.
13390 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
133a0 0a 20 20 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 74  .  ** Allocate t
133b0 68 65 20 69 6e 64 65 78 20 73 74 72 75 63 74 75  he index structu
133c0 72 65 2e 20 0a 20 20 2a 2f 0a 20 20 6e 4e 61 6d  re. .  */.  nNam
133d0 65 20 3d 20 73 74 72 6c 65 6e 28 7a 4e 61 6d 65  e = strlen(zName
133e0 29 3b 0a 20 20 6e 43 6f 6c 20 3d 20 70 4c 69 73  );.  nCol = pLis
133f0 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 70 49 6e 64  t->nExpr;.  pInd
13400 65 78 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  ex = sqlite3DbMa
13410 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 0a 20 20  llocZero(db, .  
13420 20 20 20 20 73 69 7a 65 6f 66 28 49 6e 64 65 78      sizeof(Index
13430 29 20 2b 20 20 20 20 20 20 20 20 20 20 20 20 20  ) +             
13440 20 2f 2a 20 49 6e 64 65 78 20 73 74 72 75 63 74   /* Index struct
13450 75 72 65 20 20 2a 2f 0a 20 20 20 20 20 20 73 69  ure  */.      si
13460 7a 65 6f 66 28 69 6e 74 29 2a 6e 43 6f 6c 20 2b  zeof(int)*nCol +
13470 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
13480 64 65 78 2e 61 69 43 6f 6c 75 6d 6e 20 20 20 2a  dex.aiColumn   *
13490 2f 0a 20 20 20 20 20 20 73 69 7a 65 6f 66 28 69  /.      sizeof(i
134a0 6e 74 29 2a 28 6e 43 6f 6c 2b 31 29 20 2b 20 20  nt)*(nCol+1) +  
134b0 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 2e 61 69       /* Index.ai
134c0 52 6f 77 45 73 74 20 20 20 2a 2f 0a 20 20 20 20  RowEst   */.    
134d0 20 20 73 69 7a 65 6f 66 28 63 68 61 72 20 2a 29    sizeof(char *)
134e0 2a 6e 43 6f 6c 20 2b 20 20 20 20 20 20 20 20 2f  *nCol +        /
134f0 2a 20 49 6e 64 65 78 2e 61 7a 43 6f 6c 6c 20 20  * Index.azColl  
13500 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 69 7a 65     */.      size
13510 6f 66 28 75 38 29 2a 6e 43 6f 6c 20 2b 20 20 20  of(u8)*nCol +   
13520 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
13530 78 2e 61 53 6f 72 74 4f 72 64 65 72 20 2a 2f 0a  x.aSortOrder */.
13540 20 20 20 20 20 20 6e 4e 61 6d 65 20 2b 20 31 20        nName + 1 
13550 2b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  +               
13560 20 20 20 2f 2a 20 49 6e 64 65 78 2e 7a 4e 61 6d     /* Index.zNam
13570 65 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  e      */.      
13580 6e 45 78 74 72 61 20 20 20 20 20 20 20 20 20 20  nExtra          
13590 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
135a0 43 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  Collation sequen
135b0 63 65 20 6e 61 6d 65 73 20 2a 2f 0a 20 20 29 3b  ce names */.  );
135c0 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f  .  if( db->mallo
135d0 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 67  cFailed ){.    g
135e0 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
135f0 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 70 49 6e  index;.  }.  pIn
13600 64 65 78 2d 3e 61 7a 43 6f 6c 6c 20 3d 20 28 63  dex->azColl = (c
13610 68 61 72 2a 2a 29 28 26 70 49 6e 64 65 78 5b 31  har**)(&pIndex[1
13620 5d 29 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 61 69  ]);.  pIndex->ai
13630 43 6f 6c 75 6d 6e 20 3d 20 28 69 6e 74 20 2a 29  Column = (int *)
13640 28 26 70 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c  (&pIndex->azColl
13650 5b 6e 43 6f 6c 5d 29 3b 0a 20 20 70 49 6e 64 65  [nCol]);.  pInde
13660 78 2d 3e 61 69 52 6f 77 45 73 74 20 3d 20 28 75  x->aiRowEst = (u
13670 6e 73 69 67 6e 65 64 20 2a 29 28 26 70 49 6e 64  nsigned *)(&pInd
13680 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 43 6f  ex->aiColumn[nCo
13690 6c 5d 29 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 61  l]);.  pIndex->a
136a0 53 6f 72 74 4f 72 64 65 72 20 3d 20 28 75 38 20  SortOrder = (u8 
136b0 2a 29 28 26 70 49 6e 64 65 78 2d 3e 61 69 52 6f  *)(&pIndex->aiRo
136c0 77 45 73 74 5b 6e 43 6f 6c 2b 31 5d 29 3b 0a 20  wEst[nCol+1]);. 
136d0 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 20 3d   pIndex->zName =
136e0 20 28 63 68 61 72 20 2a 29 28 26 70 49 6e 64 65   (char *)(&pInde
136f0 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 6e 43  x->aSortOrder[nC
13700 6f 6c 5d 29 3b 0a 20 20 7a 45 78 74 72 61 20 3d  ol]);.  zExtra =
13710 20 28 63 68 61 72 20 2a 29 28 26 70 49 6e 64 65   (char *)(&pInde
13720 78 2d 3e 7a 4e 61 6d 65 5b 6e 4e 61 6d 65 2b 31  x->zName[nName+1
13730 5d 29 3b 0a 20 20 6d 65 6d 63 70 79 28 70 49 6e  ]);.  memcpy(pIn
13740 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d  dex->zName, zNam
13750 65 2c 20 6e 4e 61 6d 65 2b 31 29 3b 0a 20 20 70  e, nName+1);.  p
13760 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 20 3d 20  Index->pTable = 
13770 70 54 61 62 3b 0a 20 20 70 49 6e 64 65 78 2d 3e  pTab;.  pIndex->
13780 6e 43 6f 6c 75 6d 6e 20 3d 20 70 4c 69 73 74 2d  nColumn = pList-
13790 3e 6e 45 78 70 72 3b 0a 20 20 70 49 6e 64 65 78  >nExpr;.  pIndex
137a0 2d 3e 6f 6e 45 72 72 6f 72 20 3d 20 6f 6e 45 72  ->onError = onEr
137b0 72 6f 72 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 61  ror;.  pIndex->a
137c0 75 74 6f 49 6e 64 65 78 20 3d 20 70 4e 61 6d 65  utoIndex = pName
137d0 3d 3d 30 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 70  ==0;.  pIndex->p
137e0 53 63 68 65 6d 61 20 3d 20 64 62 2d 3e 61 44 62  Schema = db->aDb
137f0 5b 69 44 62 5d 2e 70 53 63 68 65 6d 61 3b 0a 0a  [iDb].pSchema;..
13800 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65    /* Check to se
13810 65 20 69 66 20 77 65 20 73 68 6f 75 6c 64 20 68  e if we should h
13820 6f 6e 6f 72 20 44 45 53 43 20 72 65 71 75 65 73  onor DESC reques
13830 74 73 20 6f 6e 20 69 6e 64 65 78 20 63 6f 6c 75  ts on index colu
13840 6d 6e 73 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  mns.  */.  if( p
13850 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 66 69 6c  Db->pSchema->fil
13860 65 5f 66 6f 72 6d 61 74 3e 3d 34 20 29 7b 0a 20  e_format>=4 ){. 
13870 20 20 20 73 6f 72 74 4f 72 64 65 72 4d 61 73 6b     sortOrderMask
13880 20 3d 20 2d 31 3b 20 20 20 2f 2a 20 48 6f 6e 6f   = -1;   /* Hono
13890 72 20 44 45 53 43 20 2a 2f 0a 20 20 7d 65 6c 73  r DESC */.  }els
138a0 65 7b 0a 20 20 20 20 73 6f 72 74 4f 72 64 65 72  e{.    sortOrder
138b0 4d 61 73 6b 20 3d 20 30 3b 20 20 20 20 2f 2a 20  Mask = 0;    /* 
138c0 49 67 6e 6f 72 65 20 44 45 53 43 20 2a 2f 0a 20  Ignore DESC */. 
138d0 20 7d 0a 0a 20 20 2f 2a 20 53 63 61 6e 20 74 68   }..  /* Scan th
138e0 65 20 6e 61 6d 65 73 20 6f 66 20 74 68 65 20 63  e names of the c
138f0 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 74 61  olumns of the ta
13900 62 6c 65 20 74 6f 20 62 65 20 69 6e 64 65 78 65  ble to be indexe
13910 64 20 61 6e 64 0a 20 20 2a 2a 20 6c 6f 61 64 20  d and.  ** load 
13920 74 68 65 20 63 6f 6c 75 6d 6e 20 69 6e 64 69 63  the column indic
13930 65 73 20 69 6e 74 6f 20 74 68 65 20 49 6e 64 65  es into the Inde
13940 78 20 73 74 72 75 63 74 75 72 65 2e 20 20 52 65  x structure.  Re
13950 70 6f 72 74 20 61 6e 20 65 72 72 6f 72 0a 20 20  port an error.  
13960 2a 2a 20 69 66 20 61 6e 79 20 63 6f 6c 75 6d 6e  ** if any column
13970 20 69 73 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 20   is not found.. 
13980 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70   */.  for(i=0, p
13990 4c 69 73 74 49 74 65 6d 3d 70 4c 69 73 74 2d 3e  ListItem=pList->
139a0 61 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70  a; i<pList->nExp
139b0 72 3b 20 69 2b 2b 2c 20 70 4c 69 73 74 49 74 65  r; i++, pListIte
139c0 6d 2b 2b 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20  m++){.    const 
139d0 63 68 61 72 20 2a 7a 43 6f 6c 4e 61 6d 65 20 3d  char *zColName =
139e0 20 70 4c 69 73 74 49 74 65 6d 2d 3e 7a 4e 61 6d   pListItem->zNam
139f0 65 3b 0a 20 20 20 20 43 6f 6c 75 6d 6e 20 2a 70  e;.    Column *p
13a00 54 61 62 43 6f 6c 3b 0a 20 20 20 20 69 6e 74 20  TabCol;.    int 
13a10 72 65 71 75 65 73 74 65 64 53 6f 72 74 4f 72 64  requestedSortOrd
13a20 65 72 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 43  er;.    char *zC
13a30 6f 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  oll;            
13a40 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 6c 61 74         /* Collat
13a50 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 6e 61 6d  ion sequence nam
13a60 65 20 2a 2f 0a 0a 20 20 20 20 66 6f 72 28 6a 3d  e */..    for(j=
13a70 30 2c 20 70 54 61 62 43 6f 6c 3d 70 54 61 62 2d  0, pTabCol=pTab-
13a80 3e 61 43 6f 6c 3b 20 6a 3c 70 54 61 62 2d 3e 6e  >aCol; j<pTab->n
13a90 43 6f 6c 3b 20 6a 2b 2b 2c 20 70 54 61 62 43 6f  Col; j++, pTabCo
13aa0 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  l++){.      if( 
13ab0 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a  sqlite3StrICmp(z
13ac0 43 6f 6c 4e 61 6d 65 2c 20 70 54 61 62 43 6f 6c  ColName, pTabCol
13ad0 2d 3e 7a 4e 61 6d 65 29 3d 3d 30 20 29 20 62 72  ->zName)==0 ) br
13ae0 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  eak;.    }.    i
13af0 66 28 20 6a 3e 3d 70 54 61 62 2d 3e 6e 43 6f 6c  f( j>=pTab->nCol
13b00 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
13b10 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
13b20 2c 20 22 74 61 62 6c 65 20 25 73 20 68 61 73 20  , "table %s has 
13b30 6e 6f 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 64 20  no column named 
13b40 25 73 22 2c 0a 20 20 20 20 20 20 20 20 70 54 61  %s",.        pTa
13b50 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 4e 61  b->zName, zColNa
13b60 6d 65 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  me);.      goto 
13b70 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
13b80 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20  x;.    }.    /* 
13b90 54 4f 44 4f 3a 20 20 41 64 64 20 61 20 74 65 73  TODO:  Add a tes
13ba0 74 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74  t to make sure t
13bb0 68 61 74 20 74 68 65 20 73 61 6d 65 20 63 6f 6c  hat the same col
13bc0 75 6d 6e 20 69 73 20 6e 6f 74 20 6e 61 6d 65 64  umn is not named
13bd0 0a 20 20 20 20 2a 2a 20 6d 6f 72 65 20 74 68 61  .    ** more tha
13be0 6e 20 6f 6e 63 65 20 77 69 74 68 69 6e 20 74 68  n once within th
13bf0 65 20 73 61 6d 65 20 69 6e 64 65 78 2e 20 20 4f  e same index.  O
13c00 6e 6c 79 20 74 68 65 20 66 69 72 73 74 20 69 6e  nly the first in
13c10 73 74 61 6e 63 65 20 6f 66 0a 20 20 20 20 2a 2a  stance of.    **
13c20 20 74 68 65 20 63 6f 6c 75 6d 6e 20 77 69 6c 6c   the column will
13c30 20 65 76 65 72 20 62 65 20 75 73 65 64 20 62 79   ever be used by
13c40 20 74 68 65 20 6f 70 74 69 6d 69 7a 65 72 2e 20   the optimizer. 
13c50 20 4e 6f 74 65 20 74 68 61 74 20 75 73 69 6e 67   Note that using
13c60 20 74 68 65 0a 20 20 20 20 2a 2a 20 73 61 6d 65   the.    ** same
13c70 20 63 6f 6c 75 6d 6e 20 6d 6f 72 65 20 74 68 61   column more tha
13c80 6e 20 6f 6e 63 65 20 63 61 6e 6e 6f 74 20 62 65  n once cannot be
13c90 20 61 6e 20 65 72 72 6f 72 20 62 65 63 61 75 73   an error becaus
13ca0 65 20 74 68 61 74 20 77 6f 75 6c 64 20 0a 20 20  e that would .  
13cb0 20 20 2a 2a 20 62 72 65 61 6b 20 62 61 63 6b 77    ** break backw
13cc0 61 72 64 73 20 63 6f 6d 70 61 74 69 62 69 6c 69  ards compatibili
13cd0 74 79 20 2d 20 69 74 20 6e 65 65 64 73 20 74 6f  ty - it needs to
13ce0 20 62 65 20 61 20 77 61 72 6e 69 6e 67 2e 0a 20   be a warning.. 
13cf0 20 20 20 2a 2f 0a 20 20 20 20 70 49 6e 64 65 78     */.    pIndex
13d00 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 20 3d 20  ->aiColumn[i] = 
13d10 6a 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74  j;.    if( pList
13d20 49 74 65 6d 2d 3e 70 45 78 70 72 20 29 7b 0a 20  Item->pExpr ){. 
13d30 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 69       assert( pLi
13d40 73 74 49 74 65 6d 2d 3e 70 45 78 70 72 2d 3e 70  stItem->pExpr->p
13d50 43 6f 6c 6c 20 29 3b 0a 20 20 20 20 20 20 7a 43  Coll );.      zC
13d60 6f 6c 6c 20 3d 20 7a 45 78 74 72 61 3b 0a 20 20  oll = zExtra;.  
13d70 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
13d80 69 6e 74 66 28 6e 45 78 74 72 61 2c 20 7a 45 78  intf(nExtra, zEx
13d90 74 72 61 2c 20 22 25 73 22 2c 20 70 4c 69 73 74  tra, "%s", pList
13da0 49 74 65 6d 2d 3e 70 45 78 70 72 2d 3e 70 43 6f  Item->pExpr->pCo
13db0 6c 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ll->zName);.    
13dc0 20 20 7a 45 78 74 72 61 20 2b 3d 20 28 73 74 72    zExtra += (str
13dd0 6c 65 6e 28 7a 43 6f 6c 6c 29 20 2b 20 31 29 3b  len(zColl) + 1);
13de0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
13df0 20 20 7a 43 6f 6c 6c 20 3d 20 70 54 61 62 2d 3e    zColl = pTab->
13e00 61 43 6f 6c 5b 6a 5d 2e 7a 43 6f 6c 6c 3b 0a 20  aCol[j].zColl;. 
13e10 20 20 20 20 20 69 66 28 20 21 7a 43 6f 6c 6c 20       if( !zColl 
13e20 29 7b 0a 20 20 20 20 20 20 20 20 7a 43 6f 6c 6c  ){.        zColl
13e30 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c   = db->pDfltColl
13e40 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 7d  ->zName;.      }
13e50 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21  .    }.    if( !
13e60 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 26 26  db->init.busy &&
13e70 20 21 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 43   !sqlite3LocateC
13e80 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 7a  ollSeq(pParse, z
13e90 43 6f 6c 6c 2c 20 2d 31 29 20 29 7b 0a 20 20 20  Coll, -1) ){.   
13ea0 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65     goto exit_cre
13eb0 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d  ate_index;.    }
13ec0 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e 61 7a 43  .    pIndex->azC
13ed0 6f 6c 6c 5b 69 5d 20 3d 20 7a 43 6f 6c 6c 3b 0a  oll[i] = zColl;.
13ee0 20 20 20 20 72 65 71 75 65 73 74 65 64 53 6f 72      requestedSor
13ef0 74 4f 72 64 65 72 20 3d 20 70 4c 69 73 74 49 74  tOrder = pListIt
13f00 65 6d 2d 3e 73 6f 72 74 4f 72 64 65 72 20 26 20  em->sortOrder & 
13f10 73 6f 72 74 4f 72 64 65 72 4d 61 73 6b 3b 0a 20  sortOrderMask;. 
13f20 20 20 20 70 49 6e 64 65 78 2d 3e 61 53 6f 72 74     pIndex->aSort
13f30 4f 72 64 65 72 5b 69 5d 20 3d 20 72 65 71 75 65  Order[i] = reque
13f40 73 74 65 64 53 6f 72 74 4f 72 64 65 72 3b 0a 20  stedSortOrder;. 
13f50 20 7d 0a 20 20 73 71 6c 69 74 65 33 44 65 66 61   }.  sqlite3Defa
13f60 75 6c 74 52 6f 77 45 73 74 28 70 49 6e 64 65 78  ultRowEst(pIndex
13f70 29 3b 0a 0a 20 20 69 66 28 20 70 54 61 62 3d 3d  );..  if( pTab==
13f80 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
13f90 65 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73  e ){.    /* This
13fa0 20 72 6f 75 74 69 6e 65 20 68 61 73 20 62 65 65   routine has bee
13fb0 6e 20 63 61 6c 6c 65 64 20 74 6f 20 63 72 65 61  n called to crea
13fc0 74 65 20 61 6e 20 61 75 74 6f 6d 61 74 69 63 20  te an automatic 
13fd0 69 6e 64 65 78 20 61 73 20 61 0a 20 20 20 20 2a  index as a.    *
13fe0 2a 20 72 65 73 75 6c 74 20 6f 66 20 61 20 50 52  * result of a PR
13ff0 49 4d 41 52 59 20 4b 45 59 20 6f 72 20 55 4e 49  IMARY KEY or UNI
14000 51 55 45 20 63 6c 61 75 73 65 20 6f 6e 20 61 20  QUE clause on a 
14010 63 6f 6c 75 6d 6e 20 64 65 66 69 6e 69 74 69 6f  column definitio
14020 6e 2c 20 6f 72 0a 20 20 20 20 2a 2a 20 61 20 50  n, or.    ** a P
14030 52 49 4d 41 52 59 20 4b 45 59 20 6f 72 20 55 4e  RIMARY KEY or UN
14040 49 51 55 45 20 63 6c 61 75 73 65 20 66 6f 6c 6c  IQUE clause foll
14050 6f 77 69 6e 67 20 74 68 65 20 63 6f 6c 75 6d 6e  owing the column
14060 20 64 65 66 69 6e 69 74 69 6f 6e 73 2e 0a 20 20   definitions..  
14070 20 20 2a 2a 20 69 2e 65 2e 20 6f 6e 65 20 6f 66    ** i.e. one of
14080 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  :.    **.    ** 
14090 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 28 78  CREATE TABLE t(x
140a0 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 79 29   PRIMARY KEY, y)
140b0 3b 0a 20 20 20 20 2a 2a 20 43 52 45 41 54 45 20  ;.    ** CREATE 
140c0 54 41 42 4c 45 20 74 28 78 2c 20 79 2c 20 55 4e  TABLE t(x, y, UN
140d0 49 51 55 45 28 78 2c 20 79 29 29 3b 0a 20 20 20  IQUE(x, y));.   
140e0 20 2a 2a 0a 20 20 20 20 2a 2a 20 45 69 74 68 65   **.    ** Eithe
140f0 72 20 77 61 79 2c 20 63 68 65 63 6b 20 74 6f 20  r way, check to 
14100 73 65 65 20 69 66 20 74 68 65 20 74 61 62 6c 65  see if the table
14110 20 61 6c 72 65 61 64 79 20 68 61 73 20 73 75 63   already has suc
14120 68 20 61 6e 20 69 6e 64 65 78 2e 20 49 66 0a 20  h an index. If. 
14130 20 20 20 2a 2a 20 73 6f 2c 20 64 6f 6e 27 74 20     ** so, don't 
14140 62 6f 74 68 65 72 20 63 72 65 61 74 69 6e 67 20  bother creating 
14150 74 68 69 73 20 6f 6e 65 2e 20 54 68 69 73 20 6f  this one. This o
14160 6e 6c 79 20 61 70 70 6c 69 65 73 20 74 6f 0a 20  nly applies to. 
14170 20 20 20 2a 2a 20 61 75 74 6f 6d 61 74 69 63 61     ** automatica
14180 6c 6c 79 20 63 72 65 61 74 65 64 20 69 6e 64 69  lly created indi
14190 63 65 73 2e 20 55 73 65 72 73 20 63 61 6e 20 64  ces. Users can d
141a0 6f 20 61 73 20 74 68 65 79 20 77 69 73 68 20 77  o as they wish w
141b0 69 74 68 0a 20 20 20 20 2a 2a 20 65 78 70 6c 69  ith.    ** expli
141c0 63 69 74 20 69 6e 64 69 63 65 73 2e 0a 20 20 20  cit indices..   
141d0 20 2a 2f 0a 20 20 20 20 49 6e 64 65 78 20 2a 70   */.    Index *p
141e0 49 64 78 3b 0a 20 20 20 20 66 6f 72 28 70 49 64  Idx;.    for(pId
141f0 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20  x=pTab->pIndex; 
14200 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d  pIdx; pIdx=pIdx-
14210 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69  >pNext){.      i
14220 6e 74 20 6b 3b 0a 20 20 20 20 20 20 61 73 73 65  nt k;.      asse
14230 72 74 28 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f  rt( pIdx->onErro
14240 72 21 3d 4f 45 5f 4e 6f 6e 65 20 29 3b 0a 20 20  r!=OE_None );.  
14250 20 20 20 20 61 73 73 65 72 74 28 20 70 49 64 78      assert( pIdx
14260 2d 3e 61 75 74 6f 49 6e 64 65 78 20 29 3b 0a 20  ->autoIndex );. 
14270 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e       assert( pIn
14280 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45  dex->onError!=OE
14290 5f 4e 6f 6e 65 20 29 3b 0a 0a 20 20 20 20 20 20  _None );..      
142a0 69 66 28 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d  if( pIdx->nColum
142b0 6e 21 3d 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75  n!=pIndex->nColu
142c0 6d 6e 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  mn ) continue;. 
142d0 20 20 20 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c       for(k=0; k<
142e0 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 6b  pIdx->nColumn; k
142f0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e  ++){.        con
14300 73 74 20 63 68 61 72 20 2a 7a 31 20 3d 20 70 49  st char *z1 = pI
14310 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6b 5d 3b 0a 20  dx->azColl[k];. 
14320 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61         const cha
14330 72 20 2a 7a 32 20 3d 20 70 49 6e 64 65 78 2d 3e  r *z2 = pIndex->
14340 61 7a 43 6f 6c 6c 5b 6b 5d 3b 0a 20 20 20 20 20  azColl[k];.     
14350 20 20 20 69 66 28 20 70 49 64 78 2d 3e 61 69 43     if( pIdx->aiC
14360 6f 6c 75 6d 6e 5b 6b 5d 21 3d 70 49 6e 64 65 78  olumn[k]!=pIndex
14370 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6b 5d 20 29 20  ->aiColumn[k] ) 
14380 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 69  break;.        i
14390 66 28 20 70 49 64 78 2d 3e 61 53 6f 72 74 4f 72  f( pIdx->aSortOr
143a0 64 65 72 5b 6b 5d 21 3d 70 49 6e 64 65 78 2d 3e  der[k]!=pIndex->
143b0 61 53 6f 72 74 4f 72 64 65 72 5b 6b 5d 20 29 20  aSortOrder[k] ) 
143c0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 69  break;.        i
143d0 66 28 20 7a 31 21 3d 7a 32 20 26 26 20 73 71 6c  f( z1!=z2 && sql
143e0 69 74 65 33 53 74 72 49 43 6d 70 28 7a 31 2c 20  ite3StrICmp(z1, 
143f0 7a 32 29 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  z2) ) break;.   
14400 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6b     }.      if( k
14410 3d 3d 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 20  ==pIdx->nColumn 
14420 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ){.        if( p
14430 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d 70 49  Idx->onError!=pI
14440 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 20 29 7b  ndex->onError ){
14450 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  .          /* Th
14460 69 73 20 63 6f 6e 73 74 72 61 69 6e 74 20 63 72  is constraint cr
14470 65 61 74 65 73 20 74 68 65 20 73 61 6d 65 20 69  eates the same i
14480 6e 64 65 78 20 61 73 20 61 20 70 72 65 76 69 6f  ndex as a previo
14490 75 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  us.          ** 
144a0 63 6f 6e 73 74 72 61 69 6e 74 20 73 70 65 63 69  constraint speci
144b0 66 69 65 64 20 73 6f 6d 65 77 68 65 72 65 20 69  fied somewhere i
144c0 6e 20 74 68 65 20 43 52 45 41 54 45 20 54 41 42  n the CREATE TAB
144d0 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20  LE statement..  
144e0 20 20 20 20 20 20 20 20 2a 2a 20 48 6f 77 65 76          ** Howev
144f0 65 72 20 74 68 65 20 4f 4e 20 43 4f 4e 46 4c 49  er the ON CONFLI
14500 43 54 20 63 6c 61 75 73 65 73 20 61 72 65 20 64  CT clauses are d
14510 69 66 66 65 72 65 6e 74 2e 20 49 66 20 62 6f 74  ifferent. If bot
14520 68 20 74 68 69 73 20 0a 20 20 20 20 20 20 20 20  h this .        
14530 20 20 2a 2a 20 63 6f 6e 73 74 72 61 69 6e 74 20    ** constraint 
14540 61 6e 64 20 74 68 65 20 70 72 65 76 69 6f 75 73  and the previous
14550 20 65 71 75 69 76 61 6c 65 6e 74 20 63 6f 6e 73   equivalent cons
14560 74 72 61 69 6e 74 20 68 61 76 65 20 65 78 70 6c  traint have expl
14570 69 63 69 74 0a 20 20 20 20 20 20 20 20 20 20 2a  icit.          *
14580 2a 20 4f 4e 20 43 4f 4e 46 4c 49 43 54 20 63 6c  * ON CONFLICT cl
14590 61 75 73 65 73 20 74 68 69 73 20 69 73 20 61 6e  auses this is an
145a0 20 65 72 72 6f 72 2e 20 4f 74 68 65 72 77 69 73   error. Otherwis
145b0 65 2c 20 75 73 65 20 74 68 65 0a 20 20 20 20 20  e, use the.     
145c0 20 20 20 20 20 2a 2a 20 65 78 70 6c 69 63 69 74       ** explicit
145d0 6c 79 20 73 70 65 63 69 66 69 65 64 20 62 65 68  ly specified beh
145e0 61 76 69 6f 75 72 20 66 6f 72 20 74 68 65 20 69  aviour for the i
145f0 6e 64 65 78 2e 0a 20 20 20 20 20 20 20 20 20 20  ndex..          
14600 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  */.          if(
14610 20 21 28 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72   !(pIdx->onError
14620 3d 3d 4f 45 5f 44 65 66 61 75 6c 74 20 7c 7c 20  ==OE_Default || 
14630 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 3d  pIndex->onError=
14640 3d 4f 45 5f 44 65 66 61 75 6c 74 29 20 29 7b 0a  =OE_Default) ){.
14650 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
14660 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
14670 73 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  se, .           
14680 20 20 20 20 20 22 63 6f 6e 66 6c 69 63 74 69 6e       "conflictin
14690 67 20 4f 4e 20 43 4f 4e 46 4c 49 43 54 20 63 6c  g ON CONFLICT cl
146a0 61 75 73 65 73 20 73 70 65 63 69 66 69 65 64 22  auses specified"
146b0 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
146c0 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  }.          if( 
146d0 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f  pIdx->onError==O
146e0 45 5f 44 65 66 61 75 6c 74 20 29 7b 0a 20 20 20  E_Default ){.   
146f0 20 20 20 20 20 20 20 20 20 70 49 64 78 2d 3e 6f           pIdx->o
14700 6e 45 72 72 6f 72 20 3d 20 70 49 6e 64 65 78 2d  nError = pIndex-
14710 3e 6f 6e 45 72 72 6f 72 3b 0a 20 20 20 20 20 20  >onError;.      
14720 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
14730 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69          goto exi
14740 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
14750 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
14760 7d 0a 0a 20 20 2f 2a 20 4c 69 6e 6b 20 74 68 65  }..  /* Link the
14770 20 6e 65 77 20 49 6e 64 65 78 20 73 74 72 75 63   new Index struc
14780 74 75 72 65 20 74 6f 20 69 74 73 20 74 61 62 6c  ture to its tabl
14790 65 20 61 6e 64 20 74 6f 20 74 68 65 20 6f 74 68  e and to the oth
147a0 65 72 0a 20 20 2a 2a 20 69 6e 2d 6d 65 6d 6f 72  er.  ** in-memor
147b0 79 20 64 61 74 61 62 61 73 65 20 73 74 72 75 63  y database struc
147c0 74 75 72 65 73 2e 20 0a 20 20 2a 2f 0a 20 20 69  tures. .  */.  i
147d0 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  f( db->init.busy
147e0 20 29 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70   ){.    Index *p
147f0 3b 0a 20 20 20 20 70 20 3d 20 73 71 6c 69 74 65  ;.    p = sqlite
14800 33 48 61 73 68 49 6e 73 65 72 74 28 26 70 49 6e  3HashInsert(&pIn
14810 64 65 78 2d 3e 70 53 63 68 65 6d 61 2d 3e 69 64  dex->pSchema->id
14820 78 48 61 73 68 2c 20 0a 20 20 20 20 20 20 20 20  xHash, .        
14830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14840 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20   pIndex->zName, 
14850 73 74 72 6c 65 6e 28 70 49 6e 64 65 78 2d 3e 7a  strlen(pIndex->z
14860 4e 61 6d 65 29 2b 31 2c 20 70 49 6e 64 65 78 29  Name)+1, pIndex)
14870 3b 0a 20 20 20 20 69 66 28 20 70 20 29 7b 0a 20  ;.    if( p ){. 
14880 20 20 20 20 20 61 73 73 65 72 74 28 20 70 3d 3d       assert( p==
14890 70 49 6e 64 65 78 20 29 3b 20 20 2f 2a 20 4d 61  pIndex );  /* Ma
148a0 6c 6c 6f 63 20 6d 75 73 74 20 68 61 76 65 20 66  lloc must have f
148b0 61 69 6c 65 64 20 2a 2f 0a 20 20 20 20 20 20 64  ailed */.      d
148c0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
148d0 3d 20 31 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  = 1;.      goto 
148e0 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
148f0 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 62 2d  x;.    }.    db-
14900 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45  >flags |= SQLITE
14910 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a  _InternChanges;.
14920 20 20 20 20 69 66 28 20 70 54 62 6c 4e 61 6d 65      if( pTblName
14930 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 49 6e  !=0 ){.      pIn
14940 64 65 78 2d 3e 74 6e 75 6d 20 3d 20 64 62 2d 3e  dex->tnum = db->
14950 69 6e 69 74 2e 6e 65 77 54 6e 75 6d 3b 0a 20 20  init.newTnum;.  
14960 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66    }.  }..  /* If
14970 20 74 68 65 20 64 62 2d 3e 69 6e 69 74 2e 62 75   the db->init.bu
14980 73 79 20 69 73 20 30 20 74 68 65 6e 20 63 72 65  sy is 0 then cre
14990 61 74 65 20 74 68 65 20 69 6e 64 65 78 20 6f 6e  ate the index on
149a0 20 64 69 73 6b 2e 20 20 54 68 69 73 0a 20 20 2a   disk.  This.  *
149b0 2a 20 69 6e 76 6f 6c 76 65 73 20 77 72 69 74 69  * involves writi
149c0 6e 67 20 74 68 65 20 69 6e 64 65 78 20 69 6e 74  ng the index int
149d0 6f 20 74 68 65 20 6d 61 73 74 65 72 20 74 61 62  o the master tab
149e0 6c 65 20 61 6e 64 20 66 69 6c 6c 69 6e 67 20 69  le and filling i
149f0 6e 20 74 68 65 0a 20 20 2a 2a 20 69 6e 64 65 78  n the.  ** index
14a00 20 77 69 74 68 20 74 68 65 20 63 75 72 72 65 6e   with the curren
14a10 74 20 74 61 62 6c 65 20 63 6f 6e 74 65 6e 74 73  t table contents
14a20 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20  ..  **.  ** The 
14a30 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 69 73  db->init.busy is
14a40 20 30 20 77 68 65 6e 20 74 68 65 20 75 73 65 72   0 when the user
14a50 20 66 69 72 73 74 20 65 6e 74 65 72 73 20 61 20   first enters a 
14a60 43 52 45 41 54 45 20 49 4e 44 45 58 20 0a 20 20  CREATE INDEX .  
14a70 2a 2a 20 63 6f 6d 6d 61 6e 64 2e 20 20 64 62 2d  ** command.  db-
14a80 3e 69 6e 69 74 2e 62 75 73 79 20 69 73 20 31 20  >init.busy is 1 
14a90 77 68 65 6e 20 61 20 64 61 74 61 62 61 73 65 20  when a database 
14aa0 69 73 20 6f 70 65 6e 65 64 20 61 6e 64 20 0a 20  is opened and . 
14ab0 20 2a 2a 20 43 52 45 41 54 45 20 49 4e 44 45 58   ** CREATE INDEX
14ac0 20 73 74 61 74 65 6d 65 6e 74 73 20 61 72 65 20   statements are 
14ad0 72 65 61 64 20 6f 75 74 20 6f 66 20 74 68 65 20  read out of the 
14ae0 6d 61 73 74 65 72 20 74 61 62 6c 65 2e 20 20 49  master table.  I
14af0 6e 0a 20 20 2a 2a 20 74 68 65 20 6c 61 74 74 65  n.  ** the latte
14b00 72 20 63 61 73 65 20 74 68 65 20 69 6e 64 65 78  r case the index
14b10 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 20   already exists 
14b20 6f 6e 20 64 69 73 6b 2c 20 77 68 69 63 68 20 69  on disk, which i
14b30 73 20 77 68 79 0a 20 20 2a 2a 20 77 65 20 64 6f  s why.  ** we do
14b40 6e 27 74 20 77 61 6e 74 20 74 6f 20 72 65 63 72  n't want to recr
14b50 65 61 74 65 20 69 74 2e 0a 20 20 2a 2a 0a 20 20  eate it..  **.  
14b60 2a 2a 20 49 66 20 70 54 62 6c 4e 61 6d 65 3d 3d  ** If pTblName==
14b70 30 20 69 74 20 6d 65 61 6e 73 20 74 68 69 73 20  0 it means this 
14b80 69 6e 64 65 78 20 69 73 20 67 65 6e 65 72 61 74  index is generat
14b90 65 64 20 61 73 20 61 20 70 72 69 6d 61 72 79 20  ed as a primary 
14ba0 6b 65 79 0a 20 20 2a 2a 20 6f 72 20 55 4e 49 51  key.  ** or UNIQ
14bb0 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 20 6f 66  UE constraint of
14bc0 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20   a CREATE TABLE 
14bd0 73 74 61 74 65 6d 65 6e 74 2e 20 20 53 69 6e 63  statement.  Sinc
14be0 65 20 74 68 65 20 74 61 62 6c 65 0a 20 20 2a 2a  e the table.  **
14bf0 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20 63   has just been c
14c00 72 65 61 74 65 64 2c 20 69 74 20 63 6f 6e 74 61  reated, it conta
14c10 69 6e 73 20 6e 6f 20 64 61 74 61 20 61 6e 64 20  ins no data and 
14c20 74 68 65 20 69 6e 64 65 78 20 69 6e 69 74 69 61  the index initia
14c30 6c 69 7a 61 74 69 6f 6e 0a 20 20 2a 2a 20 73 74  lization.  ** st
14c40 65 70 20 63 61 6e 20 62 65 20 73 6b 69 70 70 65  ep can be skippe
14c50 64 2e 0a 20 20 2a 2f 0a 20 20 65 6c 73 65 20 69  d..  */.  else i
14c60 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  f( db->init.busy
14c70 3d 3d 30 20 29 7b 0a 20 20 20 20 56 64 62 65 20  ==0 ){.    Vdbe 
14c80 2a 76 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 53  *v;.    char *zS
14c90 74 6d 74 3b 0a 20 20 20 20 69 6e 74 20 69 4d 65  tmt;.    int iMe
14ca0 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  m = pParse->nMem
14cb0 2b 2b 3b 0a 0a 20 20 20 20 76 20 3d 20 73 71 6c  ++;..    v = sql
14cc0 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
14cd0 73 65 29 3b 0a 20 20 20 20 69 66 28 20 76 3d 3d  se);.    if( v==
14ce0 30 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72  0 ) goto exit_cr
14cf0 65 61 74 65 5f 69 6e 64 65 78 3b 0a 0a 0a 20 20  eate_index;...  
14d00 20 20 2f 2a 20 43 72 65 61 74 65 20 74 68 65 20    /* Create the 
14d10 72 6f 6f 74 70 61 67 65 20 66 6f 72 20 74 68 65  rootpage for the
14d20 20 69 6e 64 65 78 0a 20 20 20 20 2a 2f 0a 20 20   index.    */.  
14d30 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72    sqlite3BeginWr
14d40 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61  iteOperation(pPa
14d50 72 73 65 2c 20 31 2c 20 69 44 62 29 3b 0a 20 20  rse, 1, iDb);.  
14d60 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
14d70 4f 70 28 76 2c 20 4f 50 5f 43 72 65 61 74 65 49  Op(v, OP_CreateI
14d80 6e 64 65 78 2c 20 69 44 62 2c 20 30 29 3b 0a 20  ndex, iDb, 0);. 
14d90 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
14da0 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 53 74 6f  dOp(v, OP_MemSto
14db0 72 65 2c 20 69 4d 65 6d 2c 20 30 29 3b 0a 0a 20  re, iMem, 0);.. 
14dc0 20 20 20 2f 2a 20 47 61 74 68 65 72 20 74 68 65     /* Gather the
14dd0 20 63 6f 6d 70 6c 65 74 65 20 74 65 78 74 20 6f   complete text o
14de0 66 20 74 68 65 20 43 52 45 41 54 45 20 49 4e 44  f the CREATE IND
14df0 45 58 20 73 74 61 74 65 6d 65 6e 74 20 69 6e 74  EX statement int
14e00 6f 0a 20 20 20 20 2a 2a 20 74 68 65 20 7a 53 74  o.    ** the zSt
14e10 6d 74 20 76 61 72 69 61 62 6c 65 0a 20 20 20 20  mt variable.    
14e20 2a 2f 0a 20 20 20 20 69 66 28 20 70 53 74 61 72  */.    if( pStar
14e30 74 20 26 26 20 70 45 6e 64 20 29 7b 0a 20 20 20  t && pEnd ){.   
14e40 20 20 20 2f 2a 20 41 20 6e 61 6d 65 64 20 69 6e     /* A named in
14e50 64 65 78 20 77 69 74 68 20 61 6e 20 65 78 70 6c  dex with an expl
14e60 69 63 69 74 20 43 52 45 41 54 45 20 49 4e 44 45  icit CREATE INDE
14e70 58 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20  X statement */. 
14e80 20 20 20 20 20 7a 53 74 6d 74 20 3d 20 73 71 6c       zStmt = sql
14e90 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20  ite3MPrintf(db, 
14ea0 22 43 52 45 41 54 45 25 73 20 49 4e 44 45 58 20  "CREATE%s INDEX 
14eb0 25 2e 2a 73 22 2c 0a 20 20 20 20 20 20 20 20 6f  %.*s",.        o
14ec0 6e 45 72 72 6f 72 3d 3d 4f 45 5f 4e 6f 6e 65 20  nError==OE_None 
14ed0 3f 20 22 22 20 3a 20 22 20 55 4e 49 51 55 45 22  ? "" : " UNIQUE"
14ee0 2c 0a 20 20 20 20 20 20 20 20 70 45 6e 64 2d 3e  ,.        pEnd->
14ef0 7a 20 2d 20 70 4e 61 6d 65 2d 3e 7a 20 2b 20 31  z - pName->z + 1
14f00 2c 0a 20 20 20 20 20 20 20 20 70 4e 61 6d 65 2d  ,.        pName-
14f10 3e 7a 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  >z);.    }else{.
14f20 20 20 20 20 20 20 2f 2a 20 41 6e 20 61 75 74 6f        /* An auto
14f30 6d 61 74 69 63 20 69 6e 64 65 78 20 63 72 65 61  matic index crea
14f40 74 65 64 20 62 79 20 61 20 50 52 49 4d 41 52 59  ted by a PRIMARY
14f50 20 4b 45 59 20 6f 72 20 55 4e 49 51 55 45 20 63   KEY or UNIQUE c
14f60 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 20 20 20  onstraint */.   
14f70 20 20 20 2f 2a 20 7a 53 74 6d 74 20 3d 20 73 71     /* zStmt = sq
14f80 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 22 22 29  lite3MPrintf("")
14f90 3b 20 2a 2f 0a 20 20 20 20 20 20 7a 53 74 6d 74  ; */.      zStmt
14fa0 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20   = 0;.    }..   
14fb0 20 2f 2a 20 41 64 64 20 61 6e 20 65 6e 74 72 79   /* Add an entry
14fc0 20 69 6e 20 73 71 6c 69 74 65 5f 6d 61 73 74 65   in sqlite_maste
14fd0 72 20 66 6f 72 20 74 68 69 73 20 69 6e 64 65 78  r for this index
14fe0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69  .    */.    sqli
14ff0 74 65 33 4e 65 73 74 65 64 50 61 72 73 65 28 70  te3NestedParse(p
15000 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20  Parse, .        
15010 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 25 51 2e  "INSERT INTO %Q.
15020 25 73 20 56 41 4c 55 45 53 28 27 69 6e 64 65 78  %s VALUES('index
15030 27 2c 25 51 2c 25 51 2c 23 30 2c 25 51 29 3b 22  ',%Q,%Q,#0,%Q);"
15040 2c 0a 20 20 20 20 20 20 20 20 64 62 2d 3e 61 44  ,.        db->aD
15050 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 2c 20 53 43  b[iDb].zName, SC
15060 48 45 4d 41 5f 54 41 42 4c 45 28 69 44 62 29 2c  HEMA_TABLE(iDb),
15070 0a 20 20 20 20 20 20 20 20 70 49 6e 64 65 78 2d  .        pIndex-
15080 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20  >zName,.        
15090 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20  pTab->zName,.   
150a0 20 20 20 20 20 7a 53 74 6d 74 0a 20 20 20 20 29       zStmt.    )
150b0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
150c0 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 6f 70  eAddOp(v, OP_Pop
150d0 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  , 1, 0);.    sql
150e0 69 74 65 33 5f 66 72 65 65 28 7a 53 74 6d 74 29  ite3_free(zStmt)
150f0 3b 0a 0a 20 20 20 20 2f 2a 20 46 69 6c 6c 20 74  ;..    /* Fill t
15100 68 65 20 69 6e 64 65 78 20 77 69 74 68 20 64 61  he index with da
15110 74 61 20 61 6e 64 20 72 65 70 61 72 73 65 20 74  ta and reparse t
15120 68 65 20 73 63 68 65 6d 61 2e 20 43 6f 64 65 20  he schema. Code 
15130 61 6e 20 4f 50 5f 45 78 70 69 72 65 0a 20 20 20  an OP_Expire.   
15140 20 2a 2a 20 74 6f 20 69 6e 76 61 6c 69 64 61 74   ** to invalidat
15150 65 20 61 6c 6c 20 70 72 65 2d 63 6f 6d 70 69 6c  e all pre-compil
15160 65 64 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 20  ed statements.. 
15170 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 54     */.    if( pT
15180 62 6c 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20  blName ){.      
15190 73 71 6c 69 74 65 33 52 65 66 69 6c 6c 49 6e 64  sqlite3RefillInd
151a0 65 78 28 70 50 61 72 73 65 2c 20 70 49 6e 64 65  ex(pParse, pInde
151b0 78 2c 20 69 4d 65 6d 29 3b 0a 20 20 20 20 20 20  x, iMem);.      
151c0 73 71 6c 69 74 65 33 43 68 61 6e 67 65 43 6f 6f  sqlite3ChangeCoo
151d0 6b 69 65 28 64 62 2c 20 76 2c 20 69 44 62 29 3b  kie(db, v, iDb);
151e0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
151f0 62 65 4f 70 33 28 76 2c 20 4f 50 5f 50 61 72 73  beOp3(v, OP_Pars
15200 65 53 63 68 65 6d 61 2c 20 69 44 62 2c 20 30 2c  eSchema, iDb, 0,
15210 0a 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  .         sqlite
15220 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 6e 61  3MPrintf(db, "na
15230 6d 65 3d 27 25 71 27 22 2c 20 70 49 6e 64 65 78  me='%q'", pIndex
15240 2d 3e 7a 4e 61 6d 65 29 2c 20 50 33 5f 44 59 4e  ->zName), P3_DYN
15250 41 4d 49 43 29 3b 0a 20 20 20 20 20 20 73 71 6c  AMIC);.      sql
15260 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
15270 20 4f 50 5f 45 78 70 69 72 65 2c 20 30 2c 20 30   OP_Expire, 0, 0
15280 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
15290 2f 2a 20 57 68 65 6e 20 61 64 64 69 6e 67 20 61  /* When adding a
152a0 6e 20 69 6e 64 65 78 20 74 6f 20 74 68 65 20 6c  n index to the l
152b0 69 73 74 20 6f 66 20 69 6e 64 69 63 65 73 20 66  ist of indices f
152c0 6f 72 20 61 20 74 61 62 6c 65 2c 20 6d 61 6b 65  or a table, make
152d0 0a 20 20 2a 2a 20 73 75 72 65 20 61 6c 6c 20 69  .  ** sure all i
152e0 6e 64 69 63 65 73 20 6c 61 62 65 6c 65 64 20 4f  ndices labeled O
152f0 45 5f 52 65 70 6c 61 63 65 20 63 6f 6d 65 20 61  E_Replace come a
15300 66 74 65 72 20 61 6c 6c 20 74 68 6f 73 65 20 6c  fter all those l
15310 61 62 65 6c 65 64 0a 20 20 2a 2a 20 4f 45 5f 49  abeled.  ** OE_I
15320 67 6e 6f 72 65 2e 20 20 54 68 69 73 20 69 73 20  gnore.  This is 
15330 6e 65 63 65 73 73 61 72 79 20 66 6f 72 20 74 68  necessary for th
15340 65 20 63 6f 72 72 65 63 74 20 6f 70 65 72 61 74  e correct operat
15350 69 6f 6e 20 6f 66 20 55 50 44 41 54 45 0a 20 20  ion of UPDATE.  
15360 2a 2a 20 61 6e 64 20 49 4e 53 45 52 54 2e 0a 20  ** and INSERT.. 
15370 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 69 6e   */.  if( db->in
15380 69 74 2e 62 75 73 79 20 7c 7c 20 70 54 62 6c 4e  it.busy || pTblN
15390 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66  ame==0 ){.    if
153a0 28 20 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 52 65  ( onError!=OE_Re
153b0 70 6c 61 63 65 20 7c 7c 20 70 54 61 62 2d 3e 70  place || pTab->p
153c0 49 6e 64 65 78 3d 3d 30 0a 20 20 20 20 20 20 20  Index==0.       
153d0 20 20 7c 7c 20 70 54 61 62 2d 3e 70 49 6e 64 65    || pTab->pInde
153e0 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 52  x->onError==OE_R
153f0 65 70 6c 61 63 65 29 7b 0a 20 20 20 20 20 20 70  eplace){.      p
15400 49 6e 64 65 78 2d 3e 70 4e 65 78 74 20 3d 20 70  Index->pNext = p
15410 54 61 62 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20  Tab->pIndex;.   
15420 20 20 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 20     pTab->pIndex 
15430 3d 20 70 49 6e 64 65 78 3b 0a 20 20 20 20 7d 65  = pIndex;.    }e
15440 6c 73 65 7b 0a 20 20 20 20 20 20 49 6e 64 65 78  lse{.      Index
15450 20 2a 70 4f 74 68 65 72 20 3d 20 70 54 61 62 2d   *pOther = pTab-
15460 3e 70 49 6e 64 65 78 3b 0a 20 20 20 20 20 20 77  >pIndex;.      w
15470 68 69 6c 65 28 20 70 4f 74 68 65 72 2d 3e 70 4e  hile( pOther->pN
15480 65 78 74 20 26 26 20 70 4f 74 68 65 72 2d 3e 70  ext && pOther->p
15490 4e 65 78 74 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f  Next->onError!=O
154a0 45 5f 52 65 70 6c 61 63 65 20 29 7b 0a 20 20 20  E_Replace ){.   
154b0 20 20 20 20 20 70 4f 74 68 65 72 20 3d 20 70 4f       pOther = pO
154c0 74 68 65 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  ther->pNext;.   
154d0 20 20 20 7d 0a 20 20 20 20 20 20 70 49 6e 64 65     }.      pInde
154e0 78 2d 3e 70 4e 65 78 74 20 3d 20 70 4f 74 68 65  x->pNext = pOthe
154f0 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20  r->pNext;.      
15500 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74 20 3d 20  pOther->pNext = 
15510 70 49 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20  pIndex;.    }.  
15520 20 20 70 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20    pIndex = 0;.  
15530 7d 0a 0a 20 20 2f 2a 20 43 6c 65 61 6e 20 75 70  }..  /* Clean up
15540 20 62 65 66 6f 72 65 20 65 78 69 74 69 6e 67 20   before exiting 
15550 2a 2f 0a 65 78 69 74 5f 63 72 65 61 74 65 5f 69  */.exit_create_i
15560 6e 64 65 78 3a 0a 20 20 69 66 28 20 70 49 6e 64  ndex:.  if( pInd
15570 65 78 20 29 7b 0a 20 20 20 20 66 72 65 65 49 6e  ex ){.    freeIn
15580 64 65 78 28 70 49 6e 64 65 78 29 3b 0a 20 20 7d  dex(pIndex);.  }
15590 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69  .  sqlite3ExprLi
155a0 73 74 44 65 6c 65 74 65 28 70 4c 69 73 74 29 3b  stDelete(pList);
155b0 0a 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73  .  sqlite3SrcLis
155c0 74 44 65 6c 65 74 65 28 70 54 62 6c 4e 61 6d 65  tDelete(pTblName
155d0 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
155e0 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 72 65 74 75  e(zName);.  retu
155f0 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e  rn;.}../*.** Gen
15600 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 6d 61  erate code to ma
15610 6b 65 20 73 75 72 65 20 74 68 65 20 66 69 6c 65  ke sure the file
15620 20 66 6f 72 6d 61 74 20 6e 75 6d 62 65 72 20 69   format number i
15630 73 20 61 74 20 6c 65 61 73 74 20 6d 69 6e 46 6f  s at least minFo
15640 72 6d 61 74 2e 0a 2a 2a 20 54 68 65 20 67 65 6e  rmat..** The gen
15650 65 72 61 74 65 64 20 63 6f 64 65 20 77 69 6c 6c  erated code will
15660 20 69 6e 63 72 65 61 73 65 20 74 68 65 20 66 69   increase the fi
15670 6c 65 20 66 6f 72 6d 61 74 20 6e 75 6d 62 65 72  le format number
15680 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a   if necessary..*
15690 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 4d 69  /.void sqlite3Mi
156a0 6e 69 6d 75 6d 46 69 6c 65 46 6f 72 6d 61 74 28  nimumFileFormat(
156b0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69  Parse *pParse, i
156c0 6e 74 20 69 44 62 2c 20 69 6e 74 20 6d 69 6e 46  nt iDb, int minF
156d0 6f 72 6d 61 74 29 7b 0a 20 20 56 64 62 65 20 2a  ormat){.  Vdbe *
156e0 76 3b 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33  v;.  v = sqlite3
156f0 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
15700 0a 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20  .  if( v ){.    
15710 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
15720 28 76 2c 20 4f 50 5f 52 65 61 64 43 6f 6f 6b 69  (v, OP_ReadCooki
15730 65 2c 20 69 44 62 2c 20 31 29 3b 0a 20 20 20 20  e, iDb, 1);.    
15740 73 71 6c 69 74 65 33 56 64 62 65 55 73 65 73 42  sqlite3VdbeUsesB
15750 74 72 65 65 28 76 2c 20 69 44 62 29 3b 0a 20 20  tree(v, iDb);.  
15760 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
15770 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  Op(v, OP_Integer
15780 2c 20 6d 69 6e 46 6f 72 6d 61 74 2c 20 30 29 3b  , minFormat, 0);
15790 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
157a0 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47 65 2c 20  AddOp(v, OP_Ge, 
157b0 30 2c 20 73 71 6c 69 74 65 33 56 64 62 65 43 75  0, sqlite3VdbeCu
157c0 72 72 65 6e 74 41 64 64 72 28 76 29 2b 33 29 3b  rrentAddr(v)+3);
157d0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
157e0 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65  AddOp(v, OP_Inte
157f0 67 65 72 2c 20 6d 69 6e 46 6f 72 6d 61 74 2c 20  ger, minFormat, 
15800 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  0);.    sqlite3V
15810 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53  dbeAddOp(v, OP_S
15820 65 74 43 6f 6f 6b 69 65 2c 20 69 44 62 2c 20 31  etCookie, iDb, 1
15830 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
15840 46 69 6c 6c 20 74 68 65 20 49 6e 64 65 78 2e 61  Fill the Index.a
15850 69 52 6f 77 45 73 74 5b 5d 20 61 72 72 61 79 20  iRowEst[] array 
15860 77 69 74 68 20 64 65 66 61 75 6c 74 20 69 6e 66  with default inf
15870 6f 72 6d 61 74 69 6f 6e 20 2d 20 69 6e 66 6f 72  ormation - infor
15880 6d 61 74 69 6f 6e 0a 2a 2a 20 74 6f 20 62 65 20  mation.** to be 
15890 75 73 65 64 20 77 68 65 6e 20 77 65 20 68 61 76  used when we hav
158a0 65 20 6e 6f 74 20 72 75 6e 20 74 68 65 20 41 4e  e not run the AN
158b0 41 4c 59 5a 45 20 63 6f 6d 6d 61 6e 64 2e 0a 2a  ALYZE command..*
158c0 2a 0a 2a 2a 20 61 69 52 6f 77 45 73 74 5b 30 5d  *.** aiRowEst[0]
158d0 20 69 73 20 73 75 70 70 6f 73 65 20 74 6f 20 63   is suppose to c
158e0 6f 6e 74 61 69 6e 20 74 68 65 20 6e 75 6d 62 65  ontain the numbe
158f0 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20 69 6e  r of elements in
15900 20 74 68 65 20 69 6e 64 65 78 2e 0a 2a 2a 20 53   the index..** S
15910 69 6e 63 65 20 77 65 20 64 6f 20 6e 6f 74 20 6b  ince we do not k
15920 6e 6f 77 2c 20 67 75 65 73 73 20 31 20 6d 69 6c  now, guess 1 mil
15930 6c 69 6f 6e 2e 20 20 61 69 52 6f 77 45 73 74 5b  lion.  aiRowEst[
15940 31 5d 20 69 73 20 61 6e 20 65 73 74 69 6d 61 74  1] is an estimat
15950 65 20 6f 66 20 74 68 65 0a 2a 2a 20 6e 75 6d 62  e of the.** numb
15960 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74 68  er of rows in th
15970 65 20 74 61 62 6c 65 20 74 68 61 74 20 6d 61 74  e table that mat
15980 63 68 20 61 6e 79 20 70 61 72 74 69 63 75 6c 61  ch any particula
15990 72 20 76 61 6c 75 65 20 6f 66 20 74 68 65 0a 2a  r value of the.*
159a0 2a 20 66 69 72 73 74 20 63 6f 6c 75 6d 6e 20 6f  * first column o
159b0 66 20 74 68 65 20 69 6e 64 65 78 2e 20 20 61 69  f the index.  ai
159c0 52 6f 77 45 73 74 5b 32 5d 20 69 73 20 61 6e 20  RowEst[2] is an 
159d0 65 73 74 69 6d 61 74 65 20 6f 66 20 74 68 65 20  estimate of the 
159e0 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66 20 72 6f 77  number.** of row
159f0 73 20 74 68 61 74 20 6d 61 74 63 68 20 61 6e 79  s that match any
15a00 20 70 61 72 74 69 63 75 6c 61 72 20 63 6f 6d 62   particular comb
15a10 69 6e 69 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  iniation of the 
15a20 66 69 72 73 74 20 32 20 63 6f 6c 75 6d 6e 73 0a  first 2 columns.
15a30 2a 2a 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e  ** of the index.
15a40 20 20 41 6e 64 20 73 6f 20 66 6f 72 74 68 2e 20    And so forth. 
15a50 20 49 74 20 6d 75 73 74 20 61 6c 77 61 79 73 20   It must always 
15a60 62 65 20 74 68 65 20 63 61 73 65 20 74 68 61 74  be the case that
15a70 0a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  .*.**           
15a80 61 69 52 6f 77 45 73 74 5b 4e 5d 3c 3d 61 69 52  aiRowEst[N]<=aiR
15a90 6f 77 45 73 74 5b 4e 2d 31 5d 0a 2a 2a 20 20 20  owEst[N-1].**   
15aa0 20 20 20 20 20 20 20 20 61 69 52 6f 77 45 73 74          aiRowEst
15ab0 5b 4e 5d 3e 3d 31 0a 2a 2a 0a 2a 2a 20 41 70 61  [N]>=1.**.** Apa
15ac0 72 74 20 66 72 6f 6d 20 74 68 61 74 2c 20 77 65  rt from that, we
15ad0 20 68 61 76 65 20 6c 69 74 74 6c 65 20 74 6f 20   have little to 
15ae0 67 6f 20 6f 6e 20 62 65 73 69 64 65 73 20 69 6e  go on besides in
15af0 74 75 69 74 69 6f 6e 20 61 73 20 74 6f 0a 2a 2a  tuition as to.**
15b00 20 68 6f 77 20 61 69 52 6f 77 45 73 74 5b 5d 20   how aiRowEst[] 
15b10 73 68 6f 75 6c 64 20 62 65 20 69 6e 69 74 69 61  should be initia
15b20 6c 69 7a 65 64 2e 20 20 54 68 65 20 6e 75 6d 62  lized.  The numb
15b30 65 72 73 20 67 65 6e 65 72 61 74 65 64 20 68 65  ers generated he
15b40 72 65 0a 2a 2a 20 61 72 65 20 62 61 73 65 64 20  re.** are based 
15b50 6f 6e 20 74 79 70 69 63 61 6c 20 76 61 6c 75 65  on typical value
15b60 73 20 66 6f 75 6e 64 20 69 6e 20 61 63 74 75 61  s found in actua
15b70 6c 20 69 6e 64 69 63 65 73 2e 0a 2a 2f 0a 76 6f  l indices..*/.vo
15b80 69 64 20 73 71 6c 69 74 65 33 44 65 66 61 75 6c  id sqlite3Defaul
15b90 74 52 6f 77 45 73 74 28 49 6e 64 65 78 20 2a 70  tRowEst(Index *p
15ba0 49 64 78 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64  Idx){.  unsigned
15bb0 20 2a 61 20 3d 20 70 49 64 78 2d 3e 61 69 52 6f   *a = pIdx->aiRo
15bc0 77 45 73 74 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  wEst;.  int i;. 
15bd0 20 61 73 73 65 72 74 28 20 61 21 3d 30 20 29 3b   assert( a!=0 );
15be0 0a 20 20 61 5b 30 5d 20 3d 20 31 30 30 30 30 30  .  a[0] = 100000
15bf0 30 3b 0a 20 20 66 6f 72 28 69 3d 70 49 64 78 2d  0;.  for(i=pIdx-
15c00 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 3e 3d 35 3b 20  >nColumn; i>=5; 
15c10 69 2d 2d 29 7b 0a 20 20 20 20 61 5b 69 5d 20 3d  i--){.    a[i] =
15c20 20 35 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28   5;.  }.  while(
15c30 20 69 3e 3d 31 20 29 7b 0a 20 20 20 20 61 5b 69   i>=1 ){.    a[i
15c40 5d 20 3d 20 31 31 20 2d 20 69 3b 0a 20 20 20 20  ] = 11 - i;.    
15c50 69 2d 2d 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  i--;.  }.  if( p
15c60 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45  Idx->onError!=OE
15c70 5f 4e 6f 6e 65 20 29 7b 0a 20 20 20 20 61 5b 70  _None ){.    a[p
15c80 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 5d 20 3d 20  Idx->nColumn] = 
15c90 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  1;.  }.}../*.** 
15ca0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c  This routine wil
15cb0 6c 20 64 72 6f 70 20 61 6e 20 65 78 69 73 74 69  l drop an existi
15cc0 6e 67 20 6e 61 6d 65 64 20 69 6e 64 65 78 2e 20  ng named index. 
15cd0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a   This routine.**
15ce0 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20   implements the 
15cf0 44 52 4f 50 20 49 4e 44 45 58 20 73 74 61 74 65  DROP INDEX state
15d00 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ment..*/.void sq
15d10 6c 69 74 65 33 44 72 6f 70 49 6e 64 65 78 28 50  lite3DropIndex(P
15d20 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 72  arse *pParse, Sr
15d30 63 4c 69 73 74 20 2a 70 4e 61 6d 65 2c 20 69 6e  cList *pName, in
15d40 74 20 69 66 45 78 69 73 74 73 29 7b 0a 20 20 49  t ifExists){.  I
15d50 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b 0a 20 20  ndex *pIndex;.  
15d60 56 64 62 65 20 2a 76 3b 0a 20 20 73 71 6c 69 74  Vdbe *v;.  sqlit
15d70 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
15d80 3e 64 62 3b 0a 20 20 69 6e 74 20 69 44 62 3b 0a  >db;.  int iDb;.
15d90 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e  .  if( pParse->n
15da0 45 72 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f  Err || db->mallo
15db0 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 67  cFailed ){.    g
15dc0 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e  oto exit_drop_in
15dd0 64 65 78 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  dex;.  }.  asser
15de0 74 28 20 70 4e 61 6d 65 2d 3e 6e 53 72 63 3d 3d  t( pName->nSrc==
15df0 31 20 29 3b 0a 20 20 69 66 28 20 53 51 4c 49 54  1 );.  if( SQLIT
15e00 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65 61  E_OK!=sqlite3Rea
15e10 64 53 63 68 65 6d 61 28 70 50 61 72 73 65 29 20  dSchema(pParse) 
15e20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74  ){.    goto exit
15e30 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 7d  _drop_index;.  }
15e40 0a 20 20 70 49 6e 64 65 78 20 3d 20 73 71 6c 69  .  pIndex = sqli
15e50 74 65 33 46 69 6e 64 49 6e 64 65 78 28 64 62 2c  te3FindIndex(db,
15e60 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 4e 61   pName->a[0].zNa
15e70 6d 65 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e  me, pName->a[0].
15e80 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20 69 66  zDatabase);.  if
15e90 28 20 70 49 6e 64 65 78 3d 3d 30 20 29 7b 0a 20  ( pIndex==0 ){. 
15ea0 20 20 20 69 66 28 20 21 69 66 45 78 69 73 74 73     if( !ifExists
15eb0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
15ec0 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
15ed0 2c 20 22 6e 6f 20 73 75 63 68 20 69 6e 64 65 78  , "no such index
15ee0 3a 20 25 53 22 2c 20 70 4e 61 6d 65 2c 20 30 29  : %S", pName, 0)
15ef0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 72  ;.    }.    pPar
15f00 73 65 2d 3e 63 68 65 63 6b 53 63 68 65 6d 61 20  se->checkSchema 
15f10 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78  = 1;.    goto ex
15f20 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20  it_drop_index;. 
15f30 20 7d 0a 20 20 69 66 28 20 70 49 6e 64 65 78 2d   }.  if( pIndex-
15f40 3e 61 75 74 6f 49 6e 64 65 78 20 29 7b 0a 20 20  >autoIndex ){.  
15f50 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
15f60 67 28 70 50 61 72 73 65 2c 20 22 69 6e 64 65 78  g(pParse, "index
15f70 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
15f80 20 55 4e 49 51 55 45 20 22 0a 20 20 20 20 20 20   UNIQUE ".      
15f90 22 6f 72 20 50 52 49 4d 41 52 59 20 4b 45 59 20  "or PRIMARY KEY 
15fa0 63 6f 6e 73 74 72 61 69 6e 74 20 63 61 6e 6e 6f  constraint canno
15fb0 74 20 62 65 20 64 72 6f 70 70 65 64 22 2c 20 30  t be dropped", 0
15fc0 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74  );.    goto exit
15fd0 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 7d  _drop_index;.  }
15fe0 0a 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33  .  iDb = sqlite3
15ff0 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62  SchemaToIndex(db
16000 2c 20 70 49 6e 64 65 78 2d 3e 70 53 63 68 65 6d  , pIndex->pSchem
16010 61 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  a);.#ifndef SQLI
16020 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a  TE_OMIT_AUTHORIZ
16030 41 54 49 4f 4e 0a 20 20 7b 0a 20 20 20 20 69 6e  ATION.  {.    in
16040 74 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f  t code = SQLITE_
16050 44 52 4f 50 5f 49 4e 44 45 58 3b 0a 20 20 20 20  DROP_INDEX;.    
16060 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 49  Table *pTab = pI
16070 6e 64 65 78 2d 3e 70 54 61 62 6c 65 3b 0a 20 20  ndex->pTable;.  
16080 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44    const char *zD
16090 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d  b = db->aDb[iDb]
160a0 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 63 6f 6e 73  .zName;.    cons
160b0 74 20 63 68 61 72 20 2a 7a 54 61 62 20 3d 20 53  t char *zTab = S
160c0 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 44 62 29  CHEMA_TABLE(iDb)
160d0 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
160e0 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73  3AuthCheck(pPars
160f0 65 2c 20 53 51 4c 49 54 45 5f 44 45 4c 45 54 45  e, SQLITE_DELETE
16100 2c 20 7a 54 61 62 2c 20 30 2c 20 7a 44 62 29 20  , zTab, 0, zDb) 
16110 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78  ){.      goto ex
16120 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20  it_drop_index;. 
16130 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21 4f 4d     }.    if( !OM
16140 49 54 5f 54 45 4d 50 44 42 20 26 26 20 69 44 62  IT_TEMPDB && iDb
16150 20 29 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45   ) code = SQLITE
16160 5f 44 52 4f 50 5f 54 45 4d 50 5f 49 4e 44 45 58  _DROP_TEMP_INDEX
16170 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
16180 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73  3AuthCheck(pPars
16190 65 2c 20 63 6f 64 65 2c 20 70 49 6e 64 65 78 2d  e, code, pIndex-
161a0 3e 7a 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 7a 4e  >zName, pTab->zN
161b0 61 6d 65 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20  ame, zDb) ){.   
161c0 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f     goto exit_dro
161d0 70 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20  p_index;.    }. 
161e0 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
161f0 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  Generate code to
16200 20 72 65 6d 6f 76 65 20 74 68 65 20 69 6e 64 65   remove the inde
16210 78 20 61 6e 64 20 66 72 6f 6d 20 74 68 65 20 6d  x and from the m
16220 61 73 74 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20  aster table */. 
16230 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56   v = sqlite3GetV
16240 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69  dbe(pParse);.  i
16250 66 28 20 76 20 29 7b 0a 20 20 20 20 73 71 6c 69  f( v ){.    sqli
16260 74 65 33 4e 65 73 74 65 64 50 61 72 73 65 28 70  te3NestedParse(p
16270 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 22 44  Parse,.       "D
16280 45 4c 45 54 45 20 46 52 4f 4d 20 25 51 2e 25 73  ELETE FROM %Q.%s
16290 20 57 48 45 52 45 20 6e 61 6d 65 3d 25 51 22 2c   WHERE name=%Q",
162a0 0a 20 20 20 20 20 20 20 64 62 2d 3e 61 44 62 5b  .       db->aDb[
162b0 69 44 62 5d 2e 7a 4e 61 6d 65 2c 20 53 43 48 45  iDb].zName, SCHE
162c0 4d 41 5f 54 41 42 4c 45 28 69 44 62 29 2c 0a 20  MA_TABLE(iDb),. 
162d0 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 7a 4e        pIndex->zN
162e0 61 6d 65 0a 20 20 20 20 29 3b 0a 20 20 20 20 73  ame.    );.    s
162f0 71 6c 69 74 65 33 43 68 61 6e 67 65 43 6f 6f 6b  qlite3ChangeCook
16300 69 65 28 64 62 2c 20 76 2c 20 69 44 62 29 3b 0a  ie(db, v, iDb);.
16310 20 20 20 20 64 65 73 74 72 6f 79 52 6f 6f 74 50      destroyRootP
16320 61 67 65 28 70 50 61 72 73 65 2c 20 70 49 6e 64  age(pParse, pInd
16330 65 78 2d 3e 74 6e 75 6d 2c 20 69 44 62 29 3b 0a  ex->tnum, iDb);.
16340 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f      sqlite3VdbeO
16350 70 33 28 76 2c 20 4f 50 5f 44 72 6f 70 49 6e 64  p3(v, OP_DropInd
16360 65 78 2c 20 69 44 62 2c 20 30 2c 20 70 49 6e 64  ex, iDb, 0, pInd
16370 65 78 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20  ex->zName, 0);. 
16380 20 7d 0a 0a 65 78 69 74 5f 64 72 6f 70 5f 69 6e   }..exit_drop_in
16390 64 65 78 3a 0a 20 20 73 71 6c 69 74 65 33 53 72  dex:.  sqlite3Sr
163a0 63 4c 69 73 74 44 65 6c 65 74 65 28 70 4e 61 6d  cListDelete(pNam
163b0 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 41 72  e);.}../*.** pAr
163c0 72 61 79 20 69 73 20 61 20 70 6f 69 6e 74 65 72  ray is a pointer
163d0 20 74 6f 20 61 6e 20 61 72 72 61 79 20 6f 66 20   to an array of 
163e0 6f 62 6a 65 63 74 73 2e 20 20 45 61 63 68 20 6f  objects.  Each o
163f0 62 6a 65 63 74 20 69 6e 20 74 68 65 0a 2a 2a 20  bject in the.** 
16400 61 72 72 61 79 20 69 73 20 73 7a 45 6e 74 72 79  array is szEntry
16410 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 20   bytes in size. 
16420 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6c   This routine al
16430 6c 6f 63 61 74 65 73 20 61 20 6e 65 77 0a 2a 2a  locates a new.**
16440 20 6f 62 6a 65 63 74 20 6f 6e 20 74 68 65 20 65   object on the e
16450 6e 64 20 6f 66 20 74 68 65 20 61 72 72 61 79 2e  nd of the array.
16460 0a 2a 2a 0a 2a 2a 20 2a 70 6e 45 6e 74 72 79 20  .**.** *pnEntry 
16470 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
16480 20 65 6e 74 72 69 65 73 20 61 6c 72 65 61 64 79   entries already
16490 20 69 6e 20 75 73 65 2e 20 20 2a 70 6e 41 6c 6c   in use.  *pnAll
164a0 6f 63 20 69 73 0a 2a 2a 20 74 68 65 20 70 72 65  oc is.** the pre
164b0 76 69 6f 75 73 6c 79 20 61 6c 6c 6f 63 61 74 65  viously allocate
164c0 64 20 73 69 7a 65 20 6f 66 20 74 68 65 20 61 72  d size of the ar
164d0 72 61 79 2e 20 20 69 6e 69 74 53 69 7a 65 20 69  ray.  initSize i
164e0 73 20 74 68 65 0a 2a 2a 20 73 75 67 67 65 73 74  s the.** suggest
164f0 65 64 20 69 6e 69 74 69 61 6c 20 61 72 72 61 79  ed initial array
16500 20 73 69 7a 65 20 61 6c 6c 6f 63 61 74 69 6f 6e   size allocation
16510 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6e 64 65  ..**.** The inde
16520 78 20 6f 66 20 74 68 65 20 6e 65 77 20 65 6e 74  x of the new ent
16530 72 79 20 69 73 20 72 65 74 75 72 6e 65 64 20 69  ry is returned i
16540 6e 20 2a 70 49 64 78 2e 0a 2a 2a 0a 2a 2a 20 54  n *pIdx..**.** T
16550 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75  his routine retu
16560 72 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  rns a pointer to
16570 20 74 68 65 20 61 72 72 61 79 20 6f 66 20 6f 62   the array of ob
16580 6a 65 63 74 73 2e 20 20 54 68 69 73 0a 2a 2a 20  jects.  This.** 
16590 6d 69 67 68 74 20 62 65 20 74 68 65 20 73 61 6d  might be the sam
165a0 65 20 61 73 20 74 68 65 20 70 41 72 72 61 79 20  e as the pArray 
165b0 70 61 72 61 6d 65 74 65 72 20 6f 72 20 69 74 20  parameter or it 
165c0 6d 69 67 68 74 20 62 65 20 61 20 64 69 66 66 65  might be a diffe
165d0 72 65 6e 74 0a 2a 2a 20 70 6f 69 6e 74 65 72 20  rent.** pointer 
165e0 69 66 20 74 68 65 20 61 72 72 61 79 20 77 61 73  if the array was
165f0 20 72 65 73 69 7a 65 64 2e 0a 2a 2f 0a 76 6f 69   resized..*/.voi
16600 64 20 2a 73 71 6c 69 74 65 33 41 72 72 61 79 41  d *sqlite3ArrayA
16610 6c 6c 6f 63 61 74 65 28 0a 20 20 73 71 6c 69 74  llocate(.  sqlit
16620 65 33 20 2a 64 62 2c 20 20 20 20 20 20 2f 2a 20  e3 *db,      /* 
16630 43 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 6e 6f  Connection to no
16640 74 69 66 79 20 6f 66 20 6d 61 6c 6c 6f 63 20 66  tify of malloc f
16650 61 69 6c 75 72 65 73 20 2a 2f 0a 20 20 76 6f 69  ailures */.  voi
16660 64 20 2a 70 41 72 72 61 79 2c 20 20 20 20 20 2f  d *pArray,     /
16670 2a 20 41 72 72 61 79 20 6f 66 20 6f 62 6a 65 63  * Array of objec
16680 74 73 2e 20 20 4d 69 67 68 74 20 62 65 20 72 65  ts.  Might be re
16690 61 6c 6c 6f 63 61 74 65 64 20 2a 2f 0a 20 20 69  allocated */.  i
166a0 6e 74 20 73 7a 45 6e 74 72 79 2c 20 20 20 20 20  nt szEntry,     
166b0 20 2f 2a 20 53 69 7a 65 20 6f 66 20 65 61 63 68   /* Size of each
166c0 20 6f 62 6a 65 63 74 20 69 6e 20 74 68 65 20 61   object in the a
166d0 72 72 61 79 20 2a 2f 0a 20 20 69 6e 74 20 69 6e  rray */.  int in
166e0 69 74 53 69 7a 65 2c 20 20 20 20 20 2f 2a 20 53  itSize,     /* S
166f0 75 67 67 65 73 74 65 64 20 69 6e 69 74 69 61 6c  uggested initial
16700 20 61 6c 6c 6f 63 61 74 69 6f 6e 2c 20 69 6e 20   allocation, in 
16710 65 6c 65 6d 65 6e 74 73 20 2a 2f 0a 20 20 69 6e  elements */.  in
16720 74 20 2a 70 6e 45 6e 74 72 79 2c 20 20 20 20 20  t *pnEntry,     
16730 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6f 62 6a  /* Number of obj
16740 65 63 74 73 20 63 75 72 72 65 6e 74 6c 79 20 69  ects currently i
16750 6e 20 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 2a  n use */.  int *
16760 70 6e 41 6c 6c 6f 63 2c 20 20 20 20 20 2f 2a 20  pnAlloc,     /* 
16770 43 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 20  Current size of 
16780 74 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 2c 20  the allocation, 
16790 69 6e 20 65 6c 65 6d 65 6e 74 73 20 2a 2f 0a 20  in elements */. 
167a0 20 69 6e 74 20 2a 70 49 64 78 20 20 20 20 20 20   int *pIdx      
167b0 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20     /* Write the 
167c0 69 6e 64 65 78 20 6f 66 20 61 20 6e 65 77 20 73  index of a new s
167d0 6c 6f 74 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20  lot here */.){. 
167e0 20 63 68 61 72 20 2a 7a 3b 0a 20 20 69 66 28 20   char *z;.  if( 
167f0 2a 70 6e 45 6e 74 72 79 20 3e 3d 20 2a 70 6e 41  *pnEntry >= *pnA
16800 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 76 6f 69 64  lloc ){.    void
16810 20 2a 70 4e 65 77 3b 0a 20 20 20 20 69 6e 74 20   *pNew;.    int 
16820 6e 65 77 53 69 7a 65 3b 0a 20 20 20 20 6e 65 77  newSize;.    new
16830 53 69 7a 65 20 3d 20 28 2a 70 6e 41 6c 6c 6f 63  Size = (*pnAlloc
16840 29 2a 32 20 2b 20 69 6e 69 74 53 69 7a 65 3b 0a  )*2 + initSize;.
16850 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74      pNew = sqlit
16860 65 33 44 62 52 65 61 6c 6c 6f 63 28 64 62 2c 20  e3DbRealloc(db, 
16870 70 41 72 72 61 79 2c 20 6e 65 77 53 69 7a 65 2a  pArray, newSize*
16880 73 7a 45 6e 74 72 79 29 3b 0a 20 20 20 20 69 66  szEntry);.    if
16890 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20  ( pNew==0 ){.   
168a0 20 20 20 2a 70 49 64 78 20 3d 20 2d 31 3b 0a 20     *pIdx = -1;. 
168b0 20 20 20 20 20 72 65 74 75 72 6e 20 70 41 72 72       return pArr
168c0 61 79 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2a 70  ay;.    }.    *p
168d0 6e 41 6c 6c 6f 63 20 3d 20 6e 65 77 53 69 7a 65  nAlloc = newSize
168e0 3b 0a 20 20 20 20 70 41 72 72 61 79 20 3d 20 70  ;.    pArray = p
168f0 4e 65 77 3b 0a 20 20 7d 0a 20 20 7a 20 3d 20 28  New;.  }.  z = (
16900 63 68 61 72 2a 29 70 41 72 72 61 79 3b 0a 20 20  char*)pArray;.  
16910 6d 65 6d 73 65 74 28 26 7a 5b 2a 70 6e 45 6e 74  memset(&z[*pnEnt
16920 72 79 20 2a 20 73 7a 45 6e 74 72 79 5d 2c 20 30  ry * szEntry], 0
16930 2c 20 73 7a 45 6e 74 72 79 29 3b 0a 20 20 2a 70  , szEntry);.  *p
16940 49 64 78 20 3d 20 2a 70 6e 45 6e 74 72 79 3b 0a  Idx = *pnEntry;.
16950 20 20 2b 2b 2a 70 6e 45 6e 74 72 79 3b 0a 20 20    ++*pnEntry;.  
16960 72 65 74 75 72 6e 20 70 41 72 72 61 79 3b 0a 7d  return pArray;.}
16970 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 61  ../*.** Append a
16980 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20 74 6f 20   new element to 
16990 74 68 65 20 67 69 76 65 6e 20 49 64 4c 69 73 74  the given IdList
169a0 2e 20 20 43 72 65 61 74 65 20 61 20 6e 65 77 20  .  Create a new 
169b0 49 64 4c 69 73 74 20 69 66 0a 2a 2a 20 6e 65 65  IdList if.** nee
169c0 64 20 62 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 6e 65  d be..**.** A ne
169d0 77 20 49 64 4c 69 73 74 20 69 73 20 72 65 74 75  w IdList is retu
169e0 72 6e 65 64 2c 20 6f 72 20 4e 55 4c 4c 20 69 66  rned, or NULL if
169f0 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 73 2e   malloc() fails.
16a00 0a 2a 2f 0a 49 64 4c 69 73 74 20 2a 73 71 6c 69  .*/.IdList *sqli
16a10 74 65 33 49 64 4c 69 73 74 41 70 70 65 6e 64 28  te3IdListAppend(
16a20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 49 64 4c  sqlite3 *db, IdL
16a30 69 73 74 20 2a 70 4c 69 73 74 2c 20 54 6f 6b 65  ist *pList, Toke
16a40 6e 20 2a 70 54 6f 6b 65 6e 29 7b 0a 20 20 69 6e  n *pToken){.  in
16a50 74 20 69 3b 0a 20 20 69 66 28 20 70 4c 69 73 74  t i;.  if( pList
16a60 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4c 69 73 74  ==0 ){.    pList
16a70 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
16a80 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f  ocZero(db, sizeo
16a90 66 28 49 64 4c 69 73 74 29 20 29 3b 0a 20 20 20  f(IdList) );.   
16aa0 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20   if( pList==0 ) 
16ab0 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 70 4c  return 0;.    pL
16ac0 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 30 3b  ist->nAlloc = 0;
16ad0 0a 20 20 7d 0a 20 20 70 4c 69 73 74 2d 3e 61 20  .  }.  pList->a 
16ae0 3d 20 73 71 6c 69 74 65 33 41 72 72 61 79 41 6c  = sqlite3ArrayAl
16af0 6c 6f 63 61 74 65 28 0a 20 20 20 20 20 20 64 62  locate(.      db
16b00 2c 0a 20 20 20 20 20 20 70 4c 69 73 74 2d 3e 61  ,.      pList->a
16b10 2c 0a 20 20 20 20 20 20 73 69 7a 65 6f 66 28 70  ,.      sizeof(p
16b20 4c 69 73 74 2d 3e 61 5b 30 5d 29 2c 0a 20 20 20  List->a[0]),.   
16b30 20 20 20 35 2c 0a 20 20 20 20 20 20 26 70 4c 69     5,.      &pLi
16b40 73 74 2d 3e 6e 49 64 2c 0a 20 20 20 20 20 20 26  st->nId,.      &
16b50 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 2c 0a 20  pList->nAlloc,. 
16b60 20 20 20 20 20 26 69 0a 20 20 29 3b 0a 20 20 69       &i.  );.  i
16b70 66 28 20 69 3c 30 20 29 7b 0a 20 20 20 20 73 71  f( i<0 ){.    sq
16b80 6c 69 74 65 33 49 64 4c 69 73 74 44 65 6c 65 74  lite3IdListDelet
16b90 65 28 70 4c 69 73 74 29 3b 0a 20 20 20 20 72 65  e(pList);.    re
16ba0 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 4c  turn 0;.  }.  pL
16bb0 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20  ist->a[i].zName 
16bc0 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f  = sqlite3NameFro
16bd0 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 54 6f 6b 65  mToken(db, pToke
16be0 6e 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 4c 69  n);.  return pLi
16bf0 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c  st;.}../*.** Del
16c00 65 74 65 20 61 6e 20 49 64 4c 69 73 74 2e 0a 2a  ete an IdList..*
16c10 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 49 64  /.void sqlite3Id
16c20 4c 69 73 74 44 65 6c 65 74 65 28 49 64 4c 69 73  ListDelete(IdLis
16c30 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74  t *pList){.  int
16c40 20 69 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d   i;.  if( pList=
16c50 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66  =0 ) return;.  f
16c60 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d  or(i=0; i<pList-
16c70 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nId; i++){.    
16c80 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4c 69  sqlite3_free(pLi
16c90 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b  st->a[i].zName);
16ca0 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66  .  }.  sqlite3_f
16cb0 72 65 65 28 70 4c 69 73 74 2d 3e 61 29 3b 0a 20  ree(pList->a);. 
16cc0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4c   sqlite3_free(pL
16cd0 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ist);.}../*.** R
16ce0 65 74 75 72 6e 20 74 68 65 20 69 6e 64 65 78 20  eturn the index 
16cf0 69 6e 20 70 4c 69 73 74 20 6f 66 20 74 68 65 20  in pList of the 
16d00 69 64 65 6e 74 69 66 69 65 72 20 6e 61 6d 65 64  identifier named
16d10 20 7a 49 64 2e 20 20 52 65 74 75 72 6e 20 2d 31   zId.  Return -1
16d20 0a 2a 2a 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64  .** if not found
16d30 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
16d40 49 64 4c 69 73 74 49 6e 64 65 78 28 49 64 4c 69  IdListIndex(IdLi
16d50 73 74 20 2a 70 4c 69 73 74 2c 20 63 6f 6e 73 74  st *pList, const
16d60 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20   char *zName){. 
16d70 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 4c   int i;.  if( pL
16d80 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ist==0 ) return 
16d90 2d 31 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  -1;.  for(i=0; i
16da0 3c 70 4c 69 73 74 2d 3e 6e 49 64 3b 20 69 2b 2b  <pList->nId; i++
16db0 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  ){.    if( sqlit
16dc0 65 33 53 74 72 49 43 6d 70 28 70 4c 69 73 74 2d  e3StrICmp(pList-
16dd0 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 7a 4e 61  >a[i].zName, zNa
16de0 6d 65 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  me)==0 ) return 
16df0 69 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  i;.  }.  return 
16e00 2d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70  -1;.}../*.** App
16e10 65 6e 64 20 61 20 6e 65 77 20 74 61 62 6c 65 20  end a new table 
16e20 6e 61 6d 65 20 74 6f 20 74 68 65 20 67 69 76 65  name to the give
16e30 6e 20 53 72 63 4c 69 73 74 2e 20 20 43 72 65 61  n SrcList.  Crea
16e40 74 65 20 61 20 6e 65 77 20 53 72 63 4c 69 73 74  te a new SrcList
16e50 20 69 66 0a 2a 2a 20 6e 65 65 64 20 62 65 2e 20   if.** need be. 
16e60 20 41 20 6e 65 77 20 65 6e 74 72 79 20 69 73 20   A new entry is 
16e70 63 72 65 61 74 65 64 20 69 6e 20 74 68 65 20 53  created in the S
16e80 72 63 4c 69 73 74 20 65 76 65 6e 20 69 66 20 70  rcList even if p
16e90 54 6f 6b 65 6e 20 69 73 20 4e 55 4c 4c 2e 0a 2a  Token is NULL..*
16ea0 2a 0a 2a 2a 20 41 20 6e 65 77 20 53 72 63 4c 69  *.** A new SrcLi
16eb0 73 74 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20  st is returned, 
16ec0 6f 72 20 4e 55 4c 4c 20 69 66 20 6d 61 6c 6c 6f  or NULL if mallo
16ed0 63 28 29 20 66 61 69 6c 73 2e 0a 2a 2a 0a 2a 2a  c() fails..**.**
16ee0 20 49 66 20 70 44 61 74 61 62 61 73 65 20 69 73   If pDatabase is
16ef0 20 6e 6f 74 20 6e 75 6c 6c 2c 20 69 74 20 6d 65   not null, it me
16f00 61 6e 73 20 74 68 61 74 20 74 68 65 20 74 61 62  ans that the tab
16f10 6c 65 20 68 61 73 20 61 6e 20 6f 70 74 69 6f 6e  le has an option
16f20 61 6c 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 6e  al.** database n
16f30 61 6d 65 20 70 72 65 66 69 78 2e 20 20 4c 69 6b  ame prefix.  Lik
16f40 65 20 74 68 69 73 3a 20 20 22 64 61 74 61 62 61  e this:  "databa
16f50 73 65 2e 74 61 62 6c 65 22 2e 20 20 54 68 65 20  se.table".  The 
16f60 70 44 61 74 61 62 61 73 65 0a 2a 2a 20 70 6f 69  pDatabase.** poi
16f70 6e 74 73 20 74 6f 20 74 68 65 20 74 61 62 6c 65  nts to the table
16f80 20 6e 61 6d 65 20 61 6e 64 20 74 68 65 20 70 54   name and the pT
16f90 61 62 6c 65 20 70 6f 69 6e 74 73 20 74 6f 20 74  able points to t
16fa0 68 65 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65  he database name
16fb0 2e 0a 2a 2a 20 54 68 65 20 53 72 63 4c 69 73 74  ..** The SrcList
16fc0 2e 61 5b 5d 2e 7a 4e 61 6d 65 20 66 69 65 6c 64  .a[].zName field
16fd0 20 69 73 20 66 69 6c 6c 65 64 20 77 69 74 68 20   is filled with 
16fe0 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 77  the table name w
16ff0 68 69 63 68 20 6d 69 67 68 74 0a 2a 2a 20 63 6f  hich might.** co
17000 6d 65 20 66 72 6f 6d 20 70 54 61 62 6c 65 20 28  me from pTable (
17010 69 66 20 70 44 61 74 61 62 61 73 65 20 69 73 20  if pDatabase is 
17020 4e 55 4c 4c 29 20 6f 72 20 66 72 6f 6d 20 70 44  NULL) or from pD
17030 61 74 61 62 61 73 65 2e 20 20 0a 2a 2a 20 53 72  atabase.  .** Sr
17040 63 4c 69 73 74 2e 61 5b 5d 2e 7a 44 61 74 61 62  cList.a[].zDatab
17050 61 73 65 20 69 73 20 66 69 6c 6c 65 64 20 77 69  ase is filled wi
17060 74 68 20 74 68 65 20 64 61 74 61 62 61 73 65 20  th the database 
17070 6e 61 6d 65 20 66 72 6f 6d 20 70 54 61 62 6c 65  name from pTable
17080 2c 0a 2a 2a 20 6f 72 20 77 69 74 68 20 4e 55 4c  ,.** or with NUL
17090 4c 20 69 66 20 6e 6f 20 64 61 74 61 62 61 73 65  L if no database
170a0 20 69 73 20 73 70 65 63 69 66 69 65 64 2e 0a 2a   is specified..*
170b0 2a 0a 2a 2a 20 49 6e 20 6f 74 68 65 72 20 77 6f  *.** In other wo
170c0 72 64 73 2c 20 69 66 20 63 61 6c 6c 20 6c 69 6b  rds, if call lik
170d0 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  e this:.**.**   
170e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 72 63        sqlite3Src
170f0 4c 69 73 74 41 70 70 65 6e 64 28 44 2c 41 2c 42  ListAppend(D,A,B
17100 2c 30 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20  ,0);.**.** Then 
17110 42 20 69 73 20 61 20 74 61 62 6c 65 20 6e 61 6d  B is a table nam
17120 65 20 61 6e 64 20 74 68 65 20 64 61 74 61 62 61  e and the databa
17130 73 65 20 6e 61 6d 65 20 69 73 20 75 6e 73 70 65  se name is unspe
17140 63 69 66 69 65 64 2e 20 20 49 66 20 63 61 6c 6c  cified.  If call
17150 65 64 0a 2a 2a 20 6c 69 6b 65 20 74 68 69 73 3a  ed.** like this:
17160 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 73  .**.**         s
17170 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70 70  qlite3SrcListApp
17180 65 6e 64 28 44 2c 41 2c 42 2c 43 29 3b 0a 2a 2a  end(D,A,B,C);.**
17190 0a 2a 2a 20 54 68 65 6e 20 43 20 69 73 20 74 68  .** Then C is th
171a0 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 61 6e 64  e table name and
171b0 20 42 20 69 73 20 74 68 65 20 64 61 74 61 62 61   B is the databa
171c0 73 65 20 6e 61 6d 65 2e 0a 2a 2f 0a 53 72 63 4c  se name..*/.SrcL
171d0 69 73 74 20 2a 73 71 6c 69 74 65 33 53 72 63 4c  ist *sqlite3SrcL
171e0 69 73 74 41 70 70 65 6e 64 28 0a 20 20 73 71 6c  istAppend(.  sql
171f0 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20  ite3 *db,       
17200 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 74   /* Connection t
17210 6f 20 6e 6f 74 69 66 79 20 6f 66 20 6d 61 6c 6c  o notify of mall
17220 6f 63 20 66 61 69 6c 75 72 65 73 20 2a 2f 0a 20  oc failures */. 
17230 20 53 72 63 4c 69 73 74 20 2a 70 4c 69 73 74 2c   SrcList *pList,
17240 20 20 20 20 20 2f 2a 20 41 70 70 65 6e 64 20 74       /* Append t
17250 6f 20 74 68 69 73 20 53 72 63 4c 69 73 74 2e 20  o this SrcList. 
17260 4e 55 4c 4c 20 63 72 65 61 74 65 73 20 61 20 6e  NULL creates a n
17270 65 77 20 53 72 63 4c 69 73 74 20 2a 2f 0a 20 20  ew SrcList */.  
17280 54 6f 6b 65 6e 20 2a 70 54 61 62 6c 65 2c 20 20  Token *pTable,  
17290 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20      /* Table to 
172a0 61 70 70 65 6e 64 20 2a 2f 0a 20 20 54 6f 6b 65  append */.  Toke
172b0 6e 20 2a 70 44 61 74 61 62 61 73 65 20 20 20 20  n *pDatabase    
172c0 2f 2a 20 44 61 74 61 62 61 73 65 20 6f 66 20 74  /* Database of t
172d0 68 65 20 74 61 62 6c 65 20 2a 2f 0a 29 7b 0a 20  he table */.){. 
172e0 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
172f0 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69  item *pItem;.  i
17300 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20  f( pList==0 ){. 
17310 20 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74     pList = sqlit
17320 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64  e3DbMallocZero(d
17330 62 2c 20 73 69 7a 65 6f 66 28 53 72 63 4c 69 73  b, sizeof(SrcLis
17340 74 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c  t) );.    if( pL
17350 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ist==0 ) return 
17360 30 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 6e 41  0;.    pList->nA
17370 6c 6c 6f 63 20 3d 20 31 3b 0a 20 20 7d 0a 20 20  lloc = 1;.  }.  
17380 69 66 28 20 70 4c 69 73 74 2d 3e 6e 53 72 63 3e  if( pList->nSrc>
17390 3d 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20 29  =pList->nAlloc )
173a0 7b 0a 20 20 20 20 53 72 63 4c 69 73 74 20 2a 70  {.    SrcList *p
173b0 4e 65 77 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e  New;.    pList->
173c0 6e 41 6c 6c 6f 63 20 2a 3d 20 32 3b 0a 20 20 20  nAlloc *= 2;.   
173d0 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44   pNew = sqlite3D
173e0 62 52 65 61 6c 6c 6f 63 28 64 62 2c 20 70 4c 69  bRealloc(db, pLi
173f0 73 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  st,.            
17400 20 20 20 73 69 7a 65 6f 66 28 2a 70 4c 69 73 74     sizeof(*pList
17410 29 20 2b 20 28 70 4c 69 73 74 2d 3e 6e 41 6c 6c  ) + (pList->nAll
17420 6f 63 2d 31 29 2a 73 69 7a 65 6f 66 28 70 4c 69  oc-1)*sizeof(pLi
17430 73 74 2d 3e 61 5b 30 5d 29 20 29 3b 0a 20 20 20  st->a[0]) );.   
17440 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a   if( pNew==0 ){.
17450 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 72 63        sqlite3Src
17460 4c 69 73 74 44 65 6c 65 74 65 28 70 4c 69 73 74  ListDelete(pList
17470 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
17480 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c 69  0;.    }.    pLi
17490 73 74 20 3d 20 70 4e 65 77 3b 0a 20 20 7d 0a 20  st = pNew;.  }. 
174a0 20 70 49 74 65 6d 20 3d 20 26 70 4c 69 73 74 2d   pItem = &pList-
174b0 3e 61 5b 70 4c 69 73 74 2d 3e 6e 53 72 63 5d 3b  >a[pList->nSrc];
174c0 0a 20 20 6d 65 6d 73 65 74 28 70 49 74 65 6d 2c  .  memset(pItem,
174d0 20 30 2c 20 73 69 7a 65 6f 66 28 70 4c 69 73 74   0, sizeof(pList
174e0 2d 3e 61 5b 30 5d 29 29 3b 0a 20 20 69 66 28 20  ->a[0]));.  if( 
174f0 70 44 61 74 61 62 61 73 65 20 26 26 20 70 44 61  pDatabase && pDa
17500 74 61 62 61 73 65 2d 3e 7a 3d 3d 30 20 29 7b 0a  tabase->z==0 ){.
17510 20 20 20 20 70 44 61 74 61 62 61 73 65 20 3d 20      pDatabase = 
17520 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 44 61  0;.  }.  if( pDa
17530 74 61 62 61 73 65 20 26 26 20 70 54 61 62 6c 65  tabase && pTable
17540 20 29 7b 0a 20 20 20 20 54 6f 6b 65 6e 20 2a 70   ){.    Token *p
17550 54 65 6d 70 20 3d 20 70 44 61 74 61 62 61 73 65  Temp = pDatabase
17560 3b 0a 20 20 20 20 70 44 61 74 61 62 61 73 65 20  ;.    pDatabase 
17570 3d 20 70 54 61 62 6c 65 3b 0a 20 20 20 20 70 54  = pTable;.    pT
17580 61 62 6c 65 20 3d 20 70 54 65 6d 70 3b 0a 20 20  able = pTemp;.  
17590 7d 0a 20 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65  }.  pItem->zName
175a0 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72   = sqlite3NameFr
175b0 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 54 61 62  omToken(db, pTab
175c0 6c 65 29 3b 0a 20 20 70 49 74 65 6d 2d 3e 7a 44  le);.  pItem->zD
175d0 61 74 61 62 61 73 65 20 3d 20 73 71 6c 69 74 65  atabase = sqlite
175e0 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64  3NameFromToken(d
175f0 62 2c 20 70 44 61 74 61 62 61 73 65 29 3b 0a 20  b, pDatabase);. 
17600 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 20   pItem->iCursor 
17610 3d 20 2d 31 3b 0a 20 20 70 49 74 65 6d 2d 3e 69  = -1;.  pItem->i
17620 73 50 6f 70 75 6c 61 74 65 64 20 3d 20 30 3b 0a  sPopulated = 0;.
17630 20 20 70 4c 69 73 74 2d 3e 6e 53 72 63 2b 2b 3b    pList->nSrc++;
17640 0a 20 20 72 65 74 75 72 6e 20 70 4c 69 73 74 3b  .  return pList;
17650 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 73 73 69 67 6e  .}../*.** Assign
17660 20 63 75 72 73 6f 72 73 20 74 6f 20 61 6c 6c 20   cursors to all 
17670 74 61 62 6c 65 73 20 69 6e 20 61 20 53 72 63 4c  tables in a SrcL
17680 69 73 74 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ist.*/.void sqli
17690 74 65 33 53 72 63 4c 69 73 74 41 73 73 69 67 6e  te3SrcListAssign
176a0 43 75 72 73 6f 72 73 28 50 61 72 73 65 20 2a 70  Cursors(Parse *p
176b0 50 61 72 73 65 2c 20 53 72 63 4c 69 73 74 20 2a  Parse, SrcList *
176c0 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b  pList){.  int i;
176d0 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73  .  struct SrcLis
176e0 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20  t_item *pItem;. 
176f0 20 61 73 73 65 72 74 28 70 4c 69 73 74 20 7c 7c   assert(pList ||
17700 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c   pParse->db->mal
17710 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 69  locFailed );.  i
17720 66 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20  f( pList ){.    
17730 66 6f 72 28 69 3d 30 2c 20 70 49 74 65 6d 3d 70  for(i=0, pItem=p
17740 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 4c 69 73 74  List->a; i<pList
17750 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 49 74  ->nSrc; i++, pIt
17760 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28  em++){.      if(
17770 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3e   pItem->iCursor>
17780 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =0 ) break;.    
17790 20 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72    pItem->iCursor
177a0 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b   = pParse->nTab+
177b0 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49 74  +;.      if( pIt
177c0 65 6d 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20  em->pSelect ){. 
177d0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 72         sqlite3Sr
177e0 63 4c 69 73 74 41 73 73 69 67 6e 43 75 72 73 6f  cListAssignCurso
177f0 72 73 28 70 50 61 72 73 65 2c 20 70 49 74 65 6d  rs(pParse, pItem
17800 2d 3e 70 53 65 6c 65 63 74 2d 3e 70 53 72 63 29  ->pSelect->pSrc)
17810 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
17820 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c    }.}../*.** Del
17830 65 74 65 20 61 6e 20 65 6e 74 69 72 65 20 53 72  ete an entire Sr
17840 63 4c 69 73 74 20 69 6e 63 6c 75 64 69 6e 67 20  cList including 
17850 61 6c 6c 20 69 74 73 20 73 75 62 73 74 72 75 63  all its substruc
17860 74 75 72 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ture..*/.void sq
17870 6c 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65  lite3SrcListDele
17880 74 65 28 53 72 63 4c 69 73 74 20 2a 70 4c 69 73  te(SrcList *pLis
17890 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73  t){.  int i;.  s
178a0 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
178b0 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69 66 28  em *pItem;.  if(
178c0 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75   pList==0 ) retu
178d0 72 6e 3b 0a 20 20 66 6f 72 28 70 49 74 65 6d 3d  rn;.  for(pItem=
178e0 70 4c 69 73 74 2d 3e 61 2c 20 69 3d 30 3b 20 69  pList->a, i=0; i
178f0 3c 70 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b  <pList->nSrc; i+
17900 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20  +, pItem++){.   
17910 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 49   sqlite3_free(pI
17920 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 29 3b  tem->zDatabase);
17930 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
17940 65 28 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b  e(pItem->zName);
17950 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
17960 65 28 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 29  e(pItem->zAlias)
17970 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 6c  ;.    sqlite3Del
17980 65 74 65 54 61 62 6c 65 28 70 49 74 65 6d 2d 3e  eteTable(pItem->
17990 70 54 61 62 29 3b 0a 20 20 20 20 73 71 6c 69 74  pTab);.    sqlit
179a0 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 70  e3SelectDelete(p
179b0 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 29 3b 0a  Item->pSelect);.
179c0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
179d0 65 6c 65 74 65 28 70 49 74 65 6d 2d 3e 70 4f 6e  elete(pItem->pOn
179e0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 49 64  );.    sqlite3Id
179f0 4c 69 73 74 44 65 6c 65 74 65 28 70 49 74 65 6d  ListDelete(pItem
17a00 2d 3e 70 55 73 69 6e 67 29 3b 0a 20 20 7d 0a 20  ->pUsing);.  }. 
17a10 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4c   sqlite3_free(pL
17a20 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ist);.}../*.** T
17a30 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
17a40 61 6c 6c 65 64 20 62 79 20 74 68 65 20 70 61 72  alled by the par
17a50 73 65 72 20 74 6f 20 61 64 64 20 61 20 6e 65 77  ser to add a new
17a60 20 74 65 72 6d 20 74 6f 20 74 68 65 0a 2a 2a 20   term to the.** 
17a70 65 6e 64 20 6f 66 20 61 20 67 72 6f 77 69 6e 67  end of a growing
17a80 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20 54   FROM clause.  T
17a90 68 65 20 22 70 22 20 70 61 72 61 6d 65 74 65 72  he "p" parameter
17aa0 20 69 73 20 74 68 65 20 70 61 72 74 20 6f 66 0a   is the part of.
17ab0 2a 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  ** the FROM clau
17ac0 73 65 20 74 68 61 74 20 68 61 73 20 61 6c 72 65  se that has alre
17ad0 61 64 79 20 62 65 65 6e 20 63 6f 6e 73 74 72 75  ady been constru
17ae0 63 74 65 64 2e 20 20 22 70 22 20 69 73 20 4e 55  cted.  "p" is NU
17af0 4c 4c 0a 2a 2a 20 69 66 20 74 68 69 73 20 69 73  LL.** if this is
17b00 20 74 68 65 20 66 69 72 73 74 20 74 65 72 6d 20   the first term 
17b10 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  of the FROM clau
17b20 73 65 2e 20 20 70 54 61 62 6c 65 20 61 6e 64 20  se.  pTable and 
17b30 70 44 61 74 61 62 61 73 65 0a 2a 2a 20 61 72 65  pDatabase.** are
17b40 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
17b50 20 74 61 62 6c 65 20 61 6e 64 20 64 61 74 61 62   table and datab
17b60 61 73 65 20 6e 61 6d 65 64 20 69 6e 20 74 68 65  ase named in the
17b70 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72   FROM clause ter
17b80 6d 2e 0a 2a 2a 20 70 44 61 74 61 62 61 73 65 20  m..** pDatabase 
17b90 69 73 20 4e 55 4c 4c 20 69 66 20 74 68 65 20 64  is NULL if the d
17ba0 61 74 61 62 61 73 65 20 6e 61 6d 65 20 71 75 61  atabase name qua
17bb0 6c 69 66 69 65 72 20 69 73 20 6d 69 73 73 69 6e  lifier is missin
17bc0 67 20 2d 20 74 68 65 0a 2a 2a 20 75 73 75 61 6c  g - the.** usual
17bd0 20 63 61 73 65 2e 20 20 49 66 20 74 68 65 20 74   case.  If the t
17be0 65 72 6d 20 68 61 73 20 61 20 61 6c 69 61 73 2c  erm has a alias,
17bf0 20 74 68 65 6e 20 70 41 6c 69 61 73 20 70 6f 69   then pAlias poi
17c00 6e 74 73 20 74 6f 20 74 68 65 0a 2a 2a 20 61 6c  nts to the.** al
17c10 69 61 73 20 74 6f 6b 65 6e 2e 20 20 49 66 20 74  ias token.  If t
17c20 68 65 20 74 65 72 6d 20 69 73 20 61 20 73 75 62  he term is a sub
17c30 71 75 65 72 79 2c 20 74 68 65 6e 20 70 53 75 62  query, then pSub
17c40 71 75 65 72 79 20 69 73 20 74 68 65 0a 2a 2a 20  query is the.** 
17c50 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
17c60 20 74 68 61 74 20 74 68 65 20 73 75 62 71 75 65   that the subque
17c70 72 79 20 65 6e 63 6f 64 65 73 2e 20 20 54 68 65  ry encodes.  The
17c80 20 70 54 61 62 6c 65 20 61 6e 64 0a 2a 2a 20 70   pTable and.** p
17c90 44 61 74 61 62 61 73 65 20 70 61 72 61 6d 65 74  Database paramet
17ca0 65 72 73 20 61 72 65 20 4e 55 4c 4c 20 66 6f 72  ers are NULL for
17cb0 20 73 75 62 71 75 65 72 69 65 73 2e 20 20 54 68   subqueries.  Th
17cc0 65 20 70 4f 6e 20 61 6e 64 20 70 55 73 69 6e 67  e pOn and pUsing
17cd0 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 73 20 61  .** parameters a
17ce0 72 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f  re the content o
17cf0 66 20 74 68 65 20 4f 4e 20 61 6e 64 20 55 53 49  f the ON and USI
17d00 4e 47 20 63 6c 61 75 73 65 73 2e 0a 2a 2a 0a 2a  NG clauses..**.*
17d10 2a 20 52 65 74 75 72 6e 20 61 20 6e 65 77 20 53  * Return a new S
17d20 72 63 4c 69 73 74 20 77 68 69 63 68 20 65 6e 63  rcList which enc
17d30 6f 64 65 73 20 69 73 20 74 68 65 20 46 52 4f 4d  odes is the FROM
17d40 20 77 69 74 68 20 74 68 65 20 6e 65 77 0a 2a 2a   with the new.**
17d50 20 74 65 72 6d 20 61 64 64 65 64 2e 0a 2a 2f 0a   term added..*/.
17d60 53 72 63 4c 69 73 74 20 2a 73 71 6c 69 74 65 33  SrcList *sqlite3
17d70 53 72 63 4c 69 73 74 41 70 70 65 6e 64 46 72 6f  SrcListAppendFro
17d80 6d 54 65 72 6d 28 0a 20 20 50 61 72 73 65 20 2a  mTerm(.  Parse *
17d90 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
17da0 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
17db0 65 78 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74  ext */.  SrcList
17dc0 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
17dd0 20 2f 2a 20 54 68 65 20 6c 65 66 74 20 70 61 72   /* The left par
17de0 74 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c  t of the FROM cl
17df0 61 75 73 65 20 61 6c 72 65 61 64 79 20 73 65 65  ause already see
17e00 6e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 54  n */.  Token *pT
17e10 61 62 6c 65 2c 20 20 20 20 20 20 20 20 20 20 2f  able,          /
17e20 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 74 61  * Name of the ta
17e30 62 6c 65 20 74 6f 20 61 64 64 20 74 6f 20 74 68  ble to add to th
17e40 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f  e FROM clause */
17e50 0a 20 20 54 6f 6b 65 6e 20 2a 70 44 61 74 61 62  .  Token *pDatab
17e60 61 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 4e 61  ase,       /* Na
17e70 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  me of the databa
17e80 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 70 54  se containing pT
17e90 61 62 6c 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  able */.  Token 
17ea0 2a 70 41 6c 69 61 73 2c 20 20 20 20 20 20 20 20  *pAlias,        
17eb0 20 20 2f 2a 20 54 68 65 20 72 69 67 68 74 2d 68    /* The right-h
17ec0 61 6e 64 20 73 69 64 65 20 6f 66 20 74 68 65 20  and side of the 
17ed0 41 53 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e  AS subexpression
17ee0 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53   */.  Select *pS
17ef0 75 62 71 75 65 72 79 2c 20 20 20 20 20 20 2f 2a  ubquery,      /*
17f00 20 41 20 73 75 62 71 75 65 72 79 20 75 73 65 64   A subquery used
17f10 20 69 6e 20 70 6c 61 63 65 20 6f 66 20 61 20 74   in place of a t
17f20 61 62 6c 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 45  able name */.  E
17f30 78 70 72 20 2a 70 4f 6e 2c 20 20 20 20 20 20 20  xpr *pOn,       
17f40 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4f 4e         /* The ON
17f50 20 63 6c 61 75 73 65 20 6f 66 20 61 20 6a 6f 69   clause of a joi
17f60 6e 20 2a 2f 0a 20 20 49 64 4c 69 73 74 20 2a 70  n */.  IdList *p
17f70 55 73 69 6e 67 20 20 20 20 20 20 20 20 20 20 2f  Using          /
17f80 2a 20 54 68 65 20 55 53 49 4e 47 20 63 6c 61 75  * The USING clau
17f90 73 65 20 6f 66 20 61 20 6a 6f 69 6e 20 2a 2f 0a  se of a join */.
17fa0 29 7b 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  ){.  struct SrcL
17fb0 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b  ist_item *pItem;
17fc0 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
17fd0 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 70   pParse->db;.  p
17fe0 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73   = sqlite3SrcLis
17ff0 74 41 70 70 65 6e 64 28 64 62 2c 20 70 2c 20 70  tAppend(db, p, p
18000 54 61 62 6c 65 2c 20 70 44 61 74 61 62 61 73 65  Table, pDatabase
18010 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c  );.  if( p==0 ||
18020 20 70 2d 3e 6e 53 72 63 3d 3d 30 20 29 7b 0a 20   p->nSrc==0 ){. 
18030 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65     sqlite3ExprDe
18040 6c 65 74 65 28 70 4f 6e 29 3b 0a 20 20 20 20 73  lete(pOn);.    s
18050 71 6c 69 74 65 33 49 64 4c 69 73 74 44 65 6c 65  qlite3IdListDele
18060 74 65 28 70 55 73 69 6e 67 29 3b 0a 20 20 20 20  te(pUsing);.    
18070 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c  sqlite3SelectDel
18080 65 74 65 28 70 53 75 62 71 75 65 72 79 29 3b 0a  ete(pSubquery);.
18090 20 20 20 20 72 65 74 75 72 6e 20 70 3b 0a 20 20      return p;.  
180a0 7d 0a 20 20 70 49 74 65 6d 20 3d 20 26 70 2d 3e  }.  pItem = &p->
180b0 61 5b 70 2d 3e 6e 53 72 63 2d 31 5d 3b 0a 20 20  a[p->nSrc-1];.  
180c0 69 66 28 20 70 41 6c 69 61 73 20 26 26 20 70 41  if( pAlias && pA
180d0 6c 69 61 73 2d 3e 6e 20 29 7b 0a 20 20 20 20 70  lias->n ){.    p
180e0 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 3d 20 73  Item->zAlias = s
180f0 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f  qlite3NameFromTo
18100 6b 65 6e 28 64 62 2c 20 70 41 6c 69 61 73 29 3b  ken(db, pAlias);
18110 0a 20 20 7d 0a 20 20 70 49 74 65 6d 2d 3e 70 53  .  }.  pItem->pS
18120 65 6c 65 63 74 20 3d 20 70 53 75 62 71 75 65 72  elect = pSubquer
18130 79 3b 0a 20 20 70 49 74 65 6d 2d 3e 70 4f 6e 20  y;.  pItem->pOn 
18140 3d 20 70 4f 6e 3b 0a 20 20 70 49 74 65 6d 2d 3e  = pOn;.  pItem->
18150 70 55 73 69 6e 67 20 3d 20 70 55 73 69 6e 67 3b  pUsing = pUsing;
18160 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a  .  return p;.}..
18170 2f 2a 0a 2a 2a 20 57 68 65 6e 20 62 75 69 6c 64  /*.** When build
18180 69 6e 67 20 75 70 20 61 20 46 52 4f 4d 20 63 6c  ing up a FROM cl
18190 61 75 73 65 20 69 6e 20 74 68 65 20 70 61 72 73  ause in the pars
181a0 65 72 2c 20 74 68 65 20 6a 6f 69 6e 20 6f 70 65  er, the join ope
181b0 72 61 74 6f 72 0a 2a 2a 20 69 73 20 69 6e 69 74  rator.** is init
181c0 69 61 6c 6c 79 20 61 74 74 61 63 68 65 64 20 74  ially attached t
181d0 6f 20 74 68 65 20 6c 65 66 74 20 6f 70 65 72 61  o the left opera
181e0 6e 64 2e 20 20 42 75 74 20 74 68 65 20 63 6f 64  nd.  But the cod
181f0 65 20 67 65 6e 65 72 61 74 6f 72 0a 2a 2a 20 65  e generator.** e
18200 78 70 65 63 74 73 20 74 68 65 20 6a 6f 69 6e 20  xpects the join 
18210 6f 70 65 72 61 74 6f 72 20 74 6f 20 62 65 20 6f  operator to be o
18220 6e 20 74 68 65 20 72 69 67 68 74 20 6f 70 65 72  n the right oper
18230 61 6e 64 2e 20 20 54 68 69 73 20 72 6f 75 74 69  and.  This routi
18240 6e 65 0a 2a 2a 20 53 68 69 66 74 73 20 61 6c 6c  ne.** Shifts all
18250 20 6a 6f 69 6e 20 6f 70 65 72 61 74 6f 72 73 20   join operators 
18260 66 72 6f 6d 20 6c 65 66 74 20 74 6f 20 72 69 67  from left to rig
18270 68 74 20 66 6f 72 20 61 6e 20 65 6e 74 69 72 65  ht for an entire
18280 20 46 52 4f 4d 0a 2a 2a 20 63 6c 61 75 73 65 2e   FROM.** clause.
18290 0a 2a 2a 0a 2a 2a 20 45 78 61 6d 70 6c 65 3a 20  .**.** Example: 
182a0 53 75 70 70 6f 73 65 20 74 68 65 20 6a 6f 69 6e  Suppose the join
182b0 20 69 73 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a   is like this:.*
182c0 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 41  *.**           A
182d0 20 6e 61 74 75 72 61 6c 20 63 72 6f 73 73 20 6a   natural cross j
182e0 6f 69 6e 20 42 0a 2a 2a 0a 2a 2a 20 54 68 65 20  oin B.**.** The 
182f0 6f 70 65 72 61 74 6f 72 20 69 73 20 22 6e 61 74  operator is "nat
18300 75 72 61 6c 20 63 72 6f 73 73 20 6a 6f 69 6e 22  ural cross join"
18310 2e 20 20 54 68 65 20 41 20 61 6e 64 20 42 20 6f  .  The A and B o
18320 70 65 72 61 6e 64 73 20 61 72 65 20 73 74 6f 72  perands are stor
18330 65 64 0a 2a 2a 20 69 6e 20 70 2d 3e 61 5b 30 5d  ed.** in p->a[0]
18340 20 61 6e 64 20 70 2d 3e 61 5b 31 5d 2c 20 72 65   and p->a[1], re
18350 73 70 65 63 74 69 76 65 6c 79 2e 20 20 54 68 65  spectively.  The
18360 20 70 61 72 73 65 72 20 69 6e 69 74 69 61 6c 6c   parser initiall
18370 79 20 73 74 6f 72 65 73 20 74 68 65 0a 2a 2a 20  y stores the.** 
18380 6f 70 65 72 61 74 6f 72 20 77 69 74 68 20 41 2e  operator with A.
18390 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73    This routine s
183a0 68 69 66 74 73 20 74 68 61 74 20 6f 70 65 72 61  hifts that opera
183b0 74 6f 72 20 6f 76 65 72 20 74 6f 20 42 2e 0a 2a  tor over to B..*
183c0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53 72  /.void sqlite3Sr
183d0 63 4c 69 73 74 53 68 69 66 74 4a 6f 69 6e 54 79  cListShiftJoinTy
183e0 70 65 28 53 72 63 4c 69 73 74 20 2a 70 29 7b 0a  pe(SrcList *p){.
183f0 20 20 69 66 28 20 70 20 26 26 20 70 2d 3e 61 20    if( p && p->a 
18400 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  ){.    int i;.  
18410 20 20 66 6f 72 28 69 3d 70 2d 3e 6e 53 72 63 2d    for(i=p->nSrc-
18420 31 3b 20 69 3e 30 3b 20 69 2d 2d 29 7b 0a 20 20  1; i>0; i--){.  
18430 20 20 20 20 70 2d 3e 61 5b 69 5d 2e 6a 6f 69 6e      p->a[i].join
18440 74 79 70 65 20 3d 20 70 2d 3e 61 5b 69 2d 31 5d  type = p->a[i-1]
18450 2e 6a 6f 69 6e 74 79 70 65 3b 0a 20 20 20 20 7d  .jointype;.    }
18460 0a 20 20 20 20 70 2d 3e 61 5b 30 5d 2e 6a 6f 69  .    p->a[0].joi
18470 6e 74 79 70 65 20 3d 20 30 3b 0a 20 20 7d 0a 7d  ntype = 0;.  }.}
18480 0a 0a 2f 2a 0a 2a 2a 20 42 65 67 69 6e 20 61 20  ../*.** Begin a 
18490 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2f 0a 76  transaction.*/.v
184a0 6f 69 64 20 73 71 6c 69 74 65 33 42 65 67 69 6e  oid sqlite3Begin
184b0 54 72 61 6e 73 61 63 74 69 6f 6e 28 50 61 72 73  Transaction(Pars
184c0 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 74  e *pParse, int t
184d0 79 70 65 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  ype){.  sqlite3 
184e0 2a 64 62 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a  *db;.  Vdbe *v;.
184f0 20 20 69 6e 74 20 69 3b 0a 0a 20 20 69 66 28 20    int i;..  if( 
18500 70 50 61 72 73 65 3d 3d 30 20 7c 7c 20 28 64 62  pParse==0 || (db
18510 3d 70 50 61 72 73 65 2d 3e 64 62 29 3d 3d 30 20  =pParse->db)==0 
18520 7c 7c 20 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42  || db->aDb[0].pB
18530 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  t==0 ) return;. 
18540 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72   if( pParse->nEr
18550 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  r || db->mallocF
18560 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a  ailed ) return;.
18570 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74    if( sqlite3Aut
18580 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53  hCheck(pParse, S
18590 51 4c 49 54 45 5f 54 52 41 4e 53 41 43 54 49 4f  QLITE_TRANSACTIO
185a0 4e 2c 20 22 42 45 47 49 4e 22 2c 20 30 2c 20 30  N, "BEGIN", 0, 0
185b0 29 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 76  ) ) return;..  v
185c0 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
185d0 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28  e(pParse);.  if(
185e0 20 21 76 20 29 20 72 65 74 75 72 6e 3b 0a 20 20   !v ) return;.  
185f0 69 66 28 20 74 79 70 65 21 3d 54 4b 5f 44 45 46  if( type!=TK_DEF
18600 45 52 52 45 44 20 29 7b 0a 20 20 20 20 66 6f 72  ERRED ){.    for
18610 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b  (i=0; i<db->nDb;
18620 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c   i++){.      sql
18630 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
18640 20 4f 50 5f 54 72 61 6e 73 61 63 74 69 6f 6e 2c   OP_Transaction,
18650 20 69 2c 20 28 74 79 70 65 3d 3d 54 4b 5f 45 58   i, (type==TK_EX
18660 43 4c 55 53 49 56 45 29 2b 31 29 3b 0a 20 20 20  CLUSIVE)+1);.   
18670 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 55 73     sqlite3VdbeUs
18680 65 73 42 74 72 65 65 28 76 2c 20 69 29 3b 0a 20  esBtree(v, i);. 
18690 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74     }.  }.  sqlit
186a0 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
186b0 50 5f 41 75 74 6f 43 6f 6d 6d 69 74 2c 20 30 2c  P_AutoCommit, 0,
186c0 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f   0);.}../*.** Co
186d0 6d 6d 69 74 20 61 20 74 72 61 6e 73 61 63 74 69  mmit a transacti
186e0 6f 6e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  on.*/.void sqlit
186f0 65 33 43 6f 6d 6d 69 74 54 72 61 6e 73 61 63 74  e3CommitTransact
18700 69 6f 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73  ion(Parse *pPars
18710 65 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  e){.  sqlite3 *d
18720 62 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 0a 20  b;.  Vdbe *v;.. 
18730 20 69 66 28 20 70 50 61 72 73 65 3d 3d 30 20 7c   if( pParse==0 |
18740 7c 20 28 64 62 3d 70 50 61 72 73 65 2d 3e 64 62  | (db=pParse->db
18750 29 3d 3d 30 20 7c 7c 20 64 62 2d 3e 61 44 62 5b  )==0 || db->aDb[
18760 30 5d 2e 70 42 74 3d 3d 30 20 29 20 72 65 74 75  0].pBt==0 ) retu
18770 72 6e 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65  rn;.  if( pParse
18780 2d 3e 6e 45 72 72 20 7c 7c 20 64 62 2d 3e 6d 61  ->nErr || db->ma
18790 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74  llocFailed ) ret
187a0 75 72 6e 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  urn;.  if( sqlit
187b0 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72  e3AuthCheck(pPar
187c0 73 65 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53  se, SQLITE_TRANS
187d0 41 43 54 49 4f 4e 2c 20 22 43 4f 4d 4d 49 54 22  ACTION, "COMMIT"
187e0 2c 20 30 2c 20 30 29 20 29 20 72 65 74 75 72 6e  , 0, 0) ) return
187f0 3b 0a 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33  ;..  v = sqlite3
18800 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
18810 0a 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20  .  if( v ){.    
18820 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
18830 28 76 2c 20 4f 50 5f 41 75 74 6f 43 6f 6d 6d 69  (v, OP_AutoCommi
18840 74 2c 20 31 2c 20 30 29 3b 0a 20 20 7d 0a 7d 0a  t, 1, 0);.  }.}.
18850 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20  ./*.** Rollback 
18860 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2f  a transaction.*/
18870 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52 6f 6c  .void sqlite3Rol
18880 6c 62 61 63 6b 54 72 61 6e 73 61 63 74 69 6f 6e  lbackTransaction
18890 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b  (Parse *pParse){
188a0 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
188b0 20 20 56 64 62 65 20 2a 76 3b 0a 0a 20 20 69 66    Vdbe *v;..  if
188c0 28 20 70 50 61 72 73 65 3d 3d 30 20 7c 7c 20 28  ( pParse==0 || (
188d0 64 62 3d 70 50 61 72 73 65 2d 3e 64 62 29 3d 3d  db=pParse->db)==
188e0 30 20 7c 7c 20 64 62 2d 3e 61 44 62 5b 30 5d 2e  0 || db->aDb[0].
188f0 70 42 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  pBt==0 ) return;
18900 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e  .  if( pParse->n
18910 45 72 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f  Err || db->mallo
18920 63 46 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e  cFailed ) return
18930 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 41  ;.  if( sqlite3A
18940 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c  uthCheck(pParse,
18950 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 41 43 54   SQLITE_TRANSACT
18960 49 4f 4e 2c 20 22 52 4f 4c 4c 42 41 43 4b 22 2c  ION, "ROLLBACK",
18970 20 30 2c 20 30 29 20 29 20 72 65 74 75 72 6e 3b   0, 0) ) return;
18980 0a 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47  ..  v = sqlite3G
18990 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
189a0 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20 73    if( v ){.    s
189b0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
189c0 76 2c 20 4f 50 5f 41 75 74 6f 43 6f 6d 6d 69 74  v, OP_AutoCommit
189d0 2c 20 31 2c 20 31 29 3b 0a 20 20 7d 0a 7d 0a 0a  , 1, 1);.  }.}..
189e0 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20  /*.** Make sure 
189f0 74 68 65 20 54 45 4d 50 20 64 61 74 61 62 61 73  the TEMP databas
18a00 65 20 69 73 20 6f 70 65 6e 20 61 6e 64 20 61 76  e is open and av
18a10 61 69 6c 61 62 6c 65 20 66 6f 72 20 75 73 65 2e  ailable for use.
18a20 20 20 52 65 74 75 72 6e 0a 2a 2a 20 74 68 65 20    Return.** the 
18a30 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73  number of errors
18a40 2e 20 20 4c 65 61 76 65 20 61 6e 79 20 65 72 72  .  Leave any err
18a50 6f 72 20 6d 65 73 73 61 67 65 73 20 69 6e 20 74  or messages in t
18a60 68 65 20 70 50 61 72 73 65 20 73 74 72 75 63 74  he pParse struct
18a70 75 72 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ure..*/.int sqli
18a80 74 65 33 4f 70 65 6e 54 65 6d 70 44 61 74 61 62  te3OpenTempDatab
18a90 61 73 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  ase(Parse *pPars
18aa0 65 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  e){.  sqlite3 *d
18ab0 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
18ac0 20 20 69 66 28 20 64 62 2d 3e 61 44 62 5b 31 5d    if( db->aDb[1]
18ad0 2e 70 42 74 3d 3d 30 20 26 26 20 21 70 50 61 72  .pBt==0 && !pPar
18ae0 73 65 2d 3e 65 78 70 6c 61 69 6e 20 29 7b 0a 20  se->explain ){. 
18af0 20 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69     int rc = sqli
18b00 74 65 33 42 74 72 65 65 46 61 63 74 6f 72 79 28  te3BtreeFactory(
18b10 64 62 2c 20 30 2c 20 30 2c 20 53 51 4c 49 54 45  db, 0, 0, SQLITE
18b20 5f 44 45 46 41 55 4c 54 5f 43 41 43 48 45 5f 53  _DEFAULT_CACHE_S
18b30 49 5a 45 2c 0a 20 20 20 20 20 20 20 20 20 20 20  IZE,.           
18b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18b50 20 20 20 20 20 20 26 64 62 2d 3e 61 44 62 5b 31        &db->aDb[1
18b60 5d 2e 70 42 74 29 3b 0a 20 20 20 20 69 66 28 20  ].pBt);.    if( 
18b70 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
18b80 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
18b90 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
18ba0 75 6e 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 61  unable to open a
18bb0 20 74 65 6d 70 6f 72 61 72 79 20 64 61 74 61 62   temporary datab
18bc0 61 73 65 20 22 0a 20 20 20 20 20 20 20 20 22 66  ase ".        "f
18bd0 69 6c 65 20 66 6f 72 20 73 74 6f 72 69 6e 67 20  ile for storing 
18be0 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 73  temporary tables
18bf0 22 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65  ");.      pParse
18c00 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20 20 20 20  ->rc = rc;.     
18c10 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d   return 1;.    }
18c20 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 66 6c 61  .    if( db->fla
18c30 67 73 20 26 20 21 64 62 2d 3e 61 75 74 6f 43 6f  gs & !db->autoCo
18c40 6d 6d 69 74 20 29 7b 0a 20 20 20 20 20 20 72 63  mmit ){.      rc
18c50 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 42   = sqlite3BtreeB
18c60 65 67 69 6e 54 72 61 6e 73 28 64 62 2d 3e 61 44  eginTrans(db->aD
18c70 62 5b 31 5d 2e 70 42 74 2c 20 31 29 3b 0a 20 20  b[1].pBt, 1);.  
18c80 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
18c90 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
18ca0 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
18cb0 28 70 50 61 72 73 65 2c 20 22 75 6e 61 62 6c 65  (pParse, "unable
18cc0 20 74 6f 20 67 65 74 20 61 20 77 72 69 74 65 20   to get a write 
18cd0 6c 6f 63 6b 20 6f 6e 20 22 0a 20 20 20 20 20 20  lock on ".      
18ce0 20 20 20 20 22 74 68 65 20 74 65 6d 70 6f 72 61      "the tempora
18cf0 72 79 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ry database file
18d00 22 29 3b 0a 20 20 20 20 20 20 20 20 70 50 61 72  ");.        pPar
18d10 73 65 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20 20  se->rc = rc;.   
18d20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
18d30 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
18d40 20 61 73 73 65 72 74 28 20 64 62 2d 3e 61 44 62   assert( db->aDb
18d50 5b 31 5d 2e 70 53 63 68 65 6d 61 20 29 3b 0a 20  [1].pSchema );. 
18d60 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
18d70 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
18d80 20 56 44 42 45 20 63 6f 64 65 20 74 68 61 74 20   VDBE code that 
18d90 77 69 6c 6c 20 76 65 72 69 66 79 20 74 68 65 20  will verify the 
18da0 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 20 61 6e  schema cookie an
18db0 64 20 73 74 61 72 74 0a 2a 2a 20 61 20 72 65 61  d start.** a rea
18dc0 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 66 6f  d-transaction fo
18dd0 72 20 61 6c 6c 20 6e 61 6d 65 64 20 64 61 74 61  r all named data
18de0 62 61 73 65 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a  base files..**.*
18df0 2a 20 49 74 20 69 73 20 69 6d 70 6f 72 74 61 6e  * It is importan
18e00 74 20 74 68 61 74 20 61 6c 6c 20 73 63 68 65 6d  t that all schem
18e10 61 20 63 6f 6f 6b 69 65 73 20 62 65 20 76 65 72  a cookies be ver
18e20 69 66 69 65 64 20 61 6e 64 20 61 6c 6c 0a 2a 2a  ified and all.**
18e30 20 72 65 61 64 20 74 72 61 6e 73 61 63 74 69 6f   read transactio
18e40 6e 73 20 62 65 20 73 74 61 72 74 65 64 20 62 65  ns be started be
18e50 66 6f 72 65 20 61 6e 79 74 68 69 6e 67 20 65 6c  fore anything el
18e60 73 65 20 68 61 70 70 65 6e 73 20 69 6e 0a 2a 2a  se happens in.**
18e70 20 74 68 65 20 56 44 42 45 20 70 72 6f 67 72 61   the VDBE progra
18e80 6d 2e 20 20 42 75 74 20 74 68 69 73 20 72 6f 75  m.  But this rou
18e90 74 69 6e 65 20 63 61 6e 20 62 65 20 63 61 6c 6c  tine can be call
18ea0 65 64 20 61 66 74 65 72 20 6d 75 63 68 20 6f 74  ed after much ot
18eb0 68 65 72 0a 2a 2a 20 63 6f 64 65 20 68 61 73 20  her.** code has 
18ec0 62 65 65 6e 20 67 65 6e 65 72 61 74 65 64 2e 20  been generated. 
18ed0 20 53 6f 20 68 65 72 65 20 69 73 20 77 68 61 74   So here is what
18ee0 20 77 65 20 64 6f 3a 0a 2a 2a 0a 2a 2a 20 54 68   we do:.**.** Th
18ef0 65 20 66 69 72 73 74 20 74 69 6d 65 20 74 68 69  e first time thi
18f00 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
18f10 6c 65 64 2c 20 77 65 20 63 6f 64 65 20 61 6e 20  led, we code an 
18f20 4f 50 5f 47 6f 74 6f 20 74 68 61 74 0a 2a 2a 20  OP_Goto that.** 
18f30 77 69 6c 6c 20 6a 75 6d 70 20 74 6f 20 61 20 73  will jump to a s
18f40 75 62 72 6f 75 74 69 6e 65 20 61 74 20 74 68 65  ubroutine at the
18f50 20 65 6e 64 20 6f 66 20 74 68 65 20 70 72 6f 67   end of the prog
18f60 72 61 6d 2e 20 20 54 68 65 6e 20 77 65 0a 2a 2a  ram.  Then we.**
18f70 20 72 65 63 6f 72 64 20 65 76 65 72 79 20 64 61   record every da
18f80 74 61 62 61 73 65 20 74 68 61 74 20 6e 65 65 64  tabase that need
18f90 73 20 69 74 73 20 73 63 68 65 6d 61 20 76 65 72  s its schema ver
18fa0 69 66 69 65 64 20 69 6e 20 74 68 65 0a 2a 2a 20  ified in the.** 
18fb0 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 4d 61  pParse->cookieMa
18fc0 73 6b 20 66 69 65 6c 64 2e 20 20 4c 61 74 65 72  sk field.  Later
18fd0 2c 20 61 66 74 65 72 20 61 6c 6c 20 6f 74 68 65  , after all othe
18fe0 72 20 63 6f 64 65 20 68 61 73 20 62 65 65 6e 0a  r code has been.
18ff0 2a 2a 20 67 65 6e 65 72 61 74 65 64 2c 20 74 68  ** generated, th
19000 65 20 73 75 62 72 6f 75 74 69 6e 65 20 74 68 61  e subroutine tha
19010 74 20 64 6f 65 73 20 74 68 65 20 63 6f 6f 6b 69  t does the cooki
19020 65 20 76 65 72 69 66 69 63 61 74 69 6f 6e 73 20  e verifications 
19030 61 6e 64 0a 2a 2a 20 73 74 61 72 74 73 20 74 68  and.** starts th
19040 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 77  e transactions w
19050 69 6c 6c 20 62 65 20 63 6f 64 65 64 20 61 6e 64  ill be coded and
19060 20 74 68 65 20 4f 50 5f 47 6f 74 6f 20 50 32 20   the OP_Goto P2 
19070 76 61 6c 75 65 0a 2a 2a 20 77 69 6c 6c 20 62 65  value.** will be
19080 20 6d 61 64 65 20 74 6f 20 70 6f 69 6e 74 20 74   made to point t
19090 6f 20 74 68 61 74 20 73 75 62 72 6f 75 74 69 6e  o that subroutin
190a0 65 2e 20 20 54 68 65 20 67 65 6e 65 72 61 74 69  e.  The generati
190b0 6f 6e 20 6f 66 20 74 68 65 0a 2a 2a 20 63 6f 6f  on of the.** coo
190c0 6b 69 65 20 76 65 72 69 66 69 63 61 74 69 6f 6e  kie verification
190d0 20 73 75 62 72 6f 75 74 69 6e 65 20 63 6f 64 65   subroutine code
190e0 20 68 61 70 70 65 6e 73 20 69 6e 20 73 71 6c 69   happens in sqli
190f0 74 65 33 46 69 6e 69 73 68 43 6f 64 69 6e 67 28  te3FinishCoding(
19100 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 69 44 62 3c  )..**.** If iDb<
19110 30 20 74 68 65 6e 20 63 6f 64 65 20 74 68 65 20  0 then code the 
19120 4f 50 5f 47 6f 74 6f 20 6f 6e 6c 79 20 2d 20 64  OP_Goto only - d
19130 6f 6e 27 74 20 73 65 74 20 66 6c 61 67 20 74 6f  on't set flag to
19140 20 76 65 72 69 66 79 20 74 68 65 0a 2a 2a 20 73   verify the.** s
19150 63 68 65 6d 61 20 6f 6e 20 61 6e 79 20 64 61 74  chema on any dat
19160 61 62 61 73 65 73 2e 20 20 54 68 69 73 20 63 61  abases.  This ca
19170 6e 20 62 65 20 75 73 65 64 20 74 6f 20 70 6f 73  n be used to pos
19180 69 74 69 6f 6e 20 74 68 65 20 4f 50 5f 47 6f 74  ition the OP_Got
19190 6f 0a 2a 2a 20 65 61 72 6c 79 20 69 6e 20 74 68  o.** early in th
191a0 65 20 63 6f 64 65 2c 20 62 65 66 6f 72 65 20 77  e code, before w
191b0 65 20 6b 6e 6f 77 20 69 66 20 61 6e 79 20 64 61  e know if any da
191c0 74 61 62 61 73 65 20 74 61 62 6c 65 73 20 77 69  tabase tables wi
191d0 6c 6c 20 62 65 20 75 73 65 64 2e 0a 2a 2f 0a 76  ll be used..*/.v
191e0 6f 69 64 20 73 71 6c 69 74 65 33 43 6f 64 65 56  oid sqlite3CodeV
191f0 65 72 69 66 79 53 63 68 65 6d 61 28 50 61 72 73  erifySchema(Pars
19200 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69  e *pParse, int i
19210 44 62 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  Db){.  sqlite3 *
19220 64 62 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20  db;.  Vdbe *v;. 
19230 20 69 6e 74 20 6d 61 73 6b 3b 0a 0a 20 20 76 20   int mask;..  v 
19240 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
19250 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20  (pParse);.  if( 
19260 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 20 20  v==0 ) return;  
19270 2f 2a 20 54 68 69 73 20 6f 6e 6c 79 20 68 61 70  /* This only hap
19280 70 65 6e 73 20 69 66 20 74 68 65 72 65 20 77 61  pens if there wa
19290 73 20 61 20 70 72 69 6f 72 20 65 72 72 6f 72 20  s a prior error 
192a0 2a 2f 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65  */.  db = pParse
192b0 2d 3e 64 62 3b 0a 20 20 69 66 28 20 70 50 61 72  ->db;.  if( pPar
192c0 73 65 2d 3e 63 6f 6f 6b 69 65 47 6f 74 6f 3d 3d  se->cookieGoto==
192d0 30 20 29 7b 0a 20 20 20 20 70 50 61 72 73 65 2d  0 ){.    pParse-
192e0 3e 63 6f 6f 6b 69 65 47 6f 74 6f 20 3d 20 73 71  >cookieGoto = sq
192f0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
19300 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 30 29  , OP_Goto, 0, 0)
19310 2b 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 44  +1;.  }.  if( iD
19320 62 3e 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65  b>=0 ){.    asse
19330 72 74 28 20 69 44 62 3c 64 62 2d 3e 6e 44 62 20  rt( iDb<db->nDb 
19340 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 64  );.    assert( d
19350 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 42 74 21  b->aDb[iDb].pBt!
19360 3d 30 20 7c 7c 20 69 44 62 3d 3d 31 20 29 3b 0a  =0 || iDb==1 );.
19370 20 20 20 20 61 73 73 65 72 74 28 20 69 44 62 3c      assert( iDb<
19380 53 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41 43  SQLITE_MAX_ATTAC
19390 48 45 44 2b 32 20 29 3b 0a 20 20 20 20 6d 61 73  HED+2 );.    mas
193a0 6b 20 3d 20 31 3c 3c 69 44 62 3b 0a 20 20 20 20  k = 1<<iDb;.    
193b0 69 66 28 20 28 70 50 61 72 73 65 2d 3e 63 6f 6f  if( (pParse->coo
193c0 6b 69 65 4d 61 73 6b 20 26 20 6d 61 73 6b 29 3d  kieMask & mask)=
193d0 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 50 61 72  =0 ){.      pPar
193e0 73 65 2d 3e 63 6f 6f 6b 69 65 4d 61 73 6b 20 7c  se->cookieMask |
193f0 3d 20 6d 61 73 6b 3b 0a 20 20 20 20 20 20 70 50  = mask;.      pP
19400 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 56 61 6c 75  arse->cookieValu
19410 65 5b 69 44 62 5d 20 3d 20 64 62 2d 3e 61 44 62  e[iDb] = db->aDb
19420 5b 69 44 62 5d 2e 70 53 63 68 65 6d 61 2d 3e 73  [iDb].pSchema->s
19430 63 68 65 6d 61 5f 63 6f 6f 6b 69 65 3b 0a 20 20  chema_cookie;.  
19440 20 20 20 20 69 66 28 20 21 4f 4d 49 54 5f 54 45      if( !OMIT_TE
19450 4d 50 44 42 20 26 26 20 69 44 62 3d 3d 31 20 29  MPDB && iDb==1 )
19460 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
19470 33 4f 70 65 6e 54 65 6d 70 44 61 74 61 62 61 73  3OpenTempDatabas
19480 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  e(pParse);.     
19490 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a   }.    }.  }.}..
194a0 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 56  /*.** Generate V
194b0 44 42 45 20 63 6f 64 65 20 74 68 61 74 20 70 72  DBE code that pr
194c0 65 70 61 72 65 73 20 66 6f 72 20 64 6f 69 6e 67  epares for doing
194d0 20 61 6e 20 6f 70 65 72 61 74 69 6f 6e 20 74 68   an operation th
194e0 61 74 0a 2a 2a 20 6d 69 67 68 74 20 63 68 61 6e  at.** might chan
194f0 67 65 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  ge the database.
19500 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
19510 69 6e 65 20 73 74 61 72 74 73 20 61 20 6e 65 77  ine starts a new
19520 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 66 20   transaction if 
19530 77 65 20 61 72 65 20 6e 6f 74 20 61 6c 72 65 61  we are not alrea
19540 64 79 20 77 69 74 68 69 6e 0a 2a 2a 20 61 20 74  dy within.** a t
19550 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 49 66 20  ransaction.  If 
19560 77 65 20 61 72 65 20 61 6c 72 65 61 64 79 20 77  we are already w
19570 69 74 68 69 6e 20 61 20 74 72 61 6e 73 61 63 74  ithin a transact
19580 69 6f 6e 2c 20 74 68 65 6e 20 61 20 63 68 65 63  ion, then a chec
19590 6b 70 6f 69 6e 74 0a 2a 2a 20 69 73 20 73 65 74  kpoint.** is set
195a0 20 69 66 20 74 68 65 20 73 65 74 53 74 61 74 65   if the setState
195b0 6d 65 6e 74 20 70 61 72 61 6d 65 74 65 72 20 69  ment parameter i
195c0 73 20 74 72 75 65 2e 20 20 41 20 63 68 65 63 6b  s true.  A check
195d0 70 6f 69 6e 74 20 73 68 6f 75 6c 64 0a 2a 2a 20  point should.** 
195e0 62 65 20 73 65 74 20 66 6f 72 20 6f 70 65 72 61  be set for opera
195f0 74 69 6f 6e 73 20 74 68 61 74 20 6d 69 67 68 74  tions that might
19600 20 66 61 69 6c 20 28 64 75 65 20 74 6f 20 61 20   fail (due to a 
19610 63 6f 6e 73 74 72 61 69 6e 74 29 20 70 61 72 74  constraint) part
19620 20 6f 66 0a 2a 2a 20 74 68 65 20 77 61 79 20 74   of.** the way t
19630 68 72 6f 75 67 68 20 61 6e 64 20 77 68 69 63 68  hrough and which
19640 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20 75 6e   will need to un
19650 64 6f 20 73 6f 6d 65 20 77 72 69 74 65 73 20 77  do some writes w
19660 69 74 68 6f 75 74 20 68 61 76 69 6e 67 20 74 6f  ithout having to
19670 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65  .** rollback the
19680 20 77 68 6f 6c 65 20 74 72 61 6e 73 61 63 74 69   whole transacti
19690 6f 6e 2e 20 20 46 6f 72 20 6f 70 65 72 61 74 69  on.  For operati
196a0 6f 6e 73 20 77 68 65 72 65 20 61 6c 6c 20 63 6f  ons where all co
196b0 6e 73 74 72 61 69 6e 74 73 0a 2a 2a 20 63 61 6e  nstraints.** can
196c0 20 62 65 20 63 68 65 63 6b 65 64 20 62 65 66 6f   be checked befo
196d0 72 65 20 61 6e 79 20 63 68 61 6e 67 65 73 20 61  re any changes a
196e0 72 65 20 6d 61 64 65 20 74 6f 20 74 68 65 20 64  re made to the d
196f0 61 74 61 62 61 73 65 2c 20 69 74 20 69 73 20 6e  atabase, it is n
19700 65 76 65 72 0a 2a 2a 20 6e 65 63 65 73 73 61 72  ever.** necessar
19710 79 20 74 6f 20 75 6e 64 6f 20 61 20 77 72 69 74  y to undo a writ
19720 65 20 61 6e 64 20 74 68 65 20 63 68 65 63 6b 70  e and the checkp
19730 6f 69 6e 74 20 73 68 6f 75 6c 64 20 6e 6f 74 20  oint should not 
19740 62 65 20 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 4f 6e  be set..**.** On
19750 6c 79 20 64 61 74 61 62 61 73 65 20 69 44 62 20  ly database iDb 
19760 61 6e 64 20 74 68 65 20 74 65 6d 70 20 64 61 74  and the temp dat
19770 61 62 61 73 65 20 61 72 65 20 6d 61 64 65 20 77  abase are made w
19780 72 69 74 61 62 6c 65 20 62 79 20 74 68 69 73 20  ritable by this 
19790 63 61 6c 6c 2e 0a 2a 2a 20 49 66 20 69 44 62 3d  call..** If iDb=
197a0 3d 30 2c 20 74 68 65 6e 20 74 68 65 20 6d 61 69  =0, then the mai
197b0 6e 20 61 6e 64 20 74 65 6d 70 20 64 61 74 61 62  n and temp datab
197c0 61 73 65 73 20 61 72 65 20 6d 61 64 65 20 77 72  ases are made wr
197d0 69 74 61 62 6c 65 2e 20 20 20 49 66 0a 2a 2a 20  itable.   If.** 
197e0 69 44 62 3d 3d 31 20 74 68 65 6e 20 6f 6e 6c 79  iDb==1 then only
197f0 20 74 68 65 20 74 65 6d 70 20 64 61 74 61 62 61   the temp databa
19800 73 65 20 69 73 20 6d 61 64 65 20 77 72 69 74 61  se is made writa
19810 62 6c 65 2e 20 20 49 66 20 69 44 62 3e 31 20 74  ble.  If iDb>1 t
19820 68 65 6e 20 74 68 65 0a 2a 2a 20 73 70 65 63 69  hen the.** speci
19830 66 69 65 64 20 61 75 78 69 6c 69 61 72 79 20 64  fied auxiliary d
19840 61 74 61 62 61 73 65 20 61 6e 64 20 74 68 65 20  atabase and the 
19850 74 65 6d 70 20 64 61 74 61 62 61 73 65 20 61 72  temp database ar
19860 65 20 6d 61 64 65 20 77 72 69 74 61 62 6c 65 2e  e made writable.
19870 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
19880 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74  BeginWriteOperat
19890 69 6f 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73  ion(Parse *pPars
198a0 65 2c 20 69 6e 74 20 73 65 74 53 74 61 74 65 6d  e, int setStatem
198b0 65 6e 74 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20  ent, int iDb){. 
198c0 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74   Vdbe *v = sqlit
198d0 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
198e0 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20  );.  if( v==0 ) 
198f0 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65  return;.  sqlite
19900 33 43 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d  3CodeVerifySchem
19910 61 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a  a(pParse, iDb);.
19920 20 20 70 50 61 72 73 65 2d 3e 77 72 69 74 65 4d    pParse->writeM
19930 61 73 6b 20 7c 3d 20 31 3c 3c 69 44 62 3b 0a 20  ask |= 1<<iDb;. 
19940 20 69 66 28 20 73 65 74 53 74 61 74 65 6d 65 6e   if( setStatemen
19950 74 20 26 26 20 70 50 61 72 73 65 2d 3e 6e 65 73  t && pParse->nes
19960 74 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  ted==0 ){.    sq
19970 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
19980 2c 20 4f 50 5f 53 74 61 74 65 6d 65 6e 74 2c 20  , OP_Statement, 
19990 69 44 62 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69  iDb, 0);.  }.  i
199a0 66 28 20 28 4f 4d 49 54 5f 54 45 4d 50 44 42 20  f( (OMIT_TEMPDB 
199b0 7c 7c 20 69 44 62 21 3d 31 29 20 26 26 20 70 50  || iDb!=1) && pP
199c0 61 72 73 65 2d 3e 64 62 2d 3e 61 44 62 5b 31 5d  arse->db->aDb[1]
199d0 2e 70 42 74 21 3d 30 20 29 7b 0a 20 20 20 20 73  .pBt!=0 ){.    s
199e0 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74 65  qlite3BeginWrite
199f0 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65  Operation(pParse
19a00 2c 20 73 65 74 53 74 61 74 65 6d 65 6e 74 2c 20  , setStatement, 
19a10 31 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  1);.  }.}../*.**
19a20 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   Check to see if
19a30 20 70 49 6e 64 65 78 20 75 73 65 73 20 74 68 65   pIndex uses the
19a40 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
19a50 6e 63 65 20 70 43 6f 6c 6c 2e 20 20 52 65 74 75  nce pColl.  Retu
19a60 72 6e 0a 2a 2a 20 74 72 75 65 20 69 66 20 69 74  rn.** true if it
19a70 20 64 6f 65 73 20 61 6e 64 20 66 61 6c 73 65 20   does and false 
19a80 69 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 2e 0a  if it does not..
19a90 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
19aa0 45 5f 4f 4d 49 54 5f 52 45 49 4e 44 45 58 0a 73  E_OMIT_REINDEX.s
19ab0 74 61 74 69 63 20 69 6e 74 20 63 6f 6c 6c 61 74  tatic int collat
19ac0 69 6f 6e 4d 61 74 63 68 28 63 6f 6e 73 74 20 63  ionMatch(const c
19ad0 68 61 72 20 2a 7a 43 6f 6c 6c 2c 20 49 6e 64 65  har *zColl, Inde
19ae0 78 20 2a 70 49 6e 64 65 78 29 7b 0a 20 20 69 6e  x *pIndex){.  in
19af0 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  t i;.  for(i=0; 
19b00 69 3c 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d  i<pIndex->nColum
19b10 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 6f 6e  n; i++){.    con
19b20 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 70 49 6e  st char *z = pIn
19b30 64 65 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 3b 0a  dex->azColl[i];.
19b40 20 20 20 20 69 66 28 20 7a 3d 3d 7a 43 6f 6c 6c      if( z==zColl
19b50 20 7c 7c 20 28 7a 20 26 26 20 7a 43 6f 6c 6c 20   || (z && zColl 
19b60 26 26 20 30 3d 3d 73 71 6c 69 74 65 33 53 74 72  && 0==sqlite3Str
19b70 49 43 6d 70 28 7a 2c 20 7a 43 6f 6c 6c 29 29 20  ICmp(z, zColl)) 
19b80 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
19b90 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  1;.    }.  }.  r
19ba0 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69  eturn 0;.}.#endi
19bb0 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6f 6d 70 75  f../*.** Recompu
19bc0 74 65 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 6f  te all indices o
19bd0 66 20 70 54 61 62 20 74 68 61 74 20 75 73 65 20  f pTab that use 
19be0 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  the collating se
19bf0 71 75 65 6e 63 65 20 70 43 6f 6c 6c 2e 0a 2a 2a  quence pColl..**
19c00 20 49 66 20 70 43 6f 6c 6c 3d 3d 30 20 74 68 65   If pColl==0 the
19c10 6e 20 72 65 63 6f 6d 70 75 74 65 20 61 6c 6c 20  n recompute all 
19c20 69 6e 64 69 63 65 73 20 6f 66 20 70 54 61 62 2e  indices of pTab.
19c30 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .*/.#ifndef SQLI
19c40 54 45 5f 4f 4d 49 54 5f 52 45 49 4e 44 45 58 0a  TE_OMIT_REINDEX.
19c50 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 69 6e  static void rein
19c60 64 65 78 54 61 62 6c 65 28 50 61 72 73 65 20 2a  dexTable(Parse *
19c70 70 50 61 72 73 65 2c 20 54 61 62 6c 65 20 2a 70  pParse, Table *p
19c80 54 61 62 2c 20 63 68 61 72 20 63 6f 6e 73 74 20  Tab, char const 
19c90 2a 7a 43 6f 6c 6c 29 7b 0a 20 20 49 6e 64 65 78  *zColl){.  Index
19ca0 20 2a 70 49 6e 64 65 78 3b 20 20 20 20 20 20 20   *pIndex;       
19cb0 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 69 6e 64         /* An ind
19cc0 65 78 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ex associated wi
19cd0 74 68 20 70 54 61 62 20 2a 2f 0a 0a 20 20 66 6f  th pTab */..  fo
19ce0 72 28 70 49 6e 64 65 78 3d 70 54 61 62 2d 3e 70  r(pIndex=pTab->p
19cf0 49 6e 64 65 78 3b 20 70 49 6e 64 65 78 3b 20 70  Index; pIndex; p
19d00 49 6e 64 65 78 3d 70 49 6e 64 65 78 2d 3e 70 4e  Index=pIndex->pN
19d10 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 7a 43  ext){.    if( zC
19d20 6f 6c 6c 3d 3d 30 20 7c 7c 20 63 6f 6c 6c 61 74  oll==0 || collat
19d30 69 6f 6e 4d 61 74 63 68 28 7a 43 6f 6c 6c 2c 20  ionMatch(zColl, 
19d40 70 49 6e 64 65 78 29 20 29 7b 0a 20 20 20 20 20  pIndex) ){.     
19d50 20 69 6e 74 20 69 44 62 20 3d 20 73 71 6c 69 74   int iDb = sqlit
19d60 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28  e3SchemaToIndex(
19d70 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 54 61 62  pParse->db, pTab
19d80 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20  ->pSchema);.    
19d90 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72    sqlite3BeginWr
19da0 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61  iteOperation(pPa
19db0 72 73 65 2c 20 30 2c 20 69 44 62 29 3b 0a 20 20  rse, 0, iDb);.  
19dc0 20 20 20 20 73 71 6c 69 74 65 33 52 65 66 69 6c      sqlite3Refil
19dd0 6c 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70  lIndex(pParse, p
19de0 49 6e 64 65 78 2c 20 2d 31 29 3b 0a 20 20 20 20  Index, -1);.    
19df0 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a  }.  }.}.#endif..
19e00 2f 2a 0a 2a 2a 20 52 65 63 6f 6d 70 75 74 65 20  /*.** Recompute 
19e10 61 6c 6c 20 69 6e 64 69 63 65 73 20 6f 66 20 61  all indices of a
19e20 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20 61 6c 6c  ll tables in all
19e30 20 64 61 74 61 62 61 73 65 73 20 77 68 65 72 65   databases where
19e40 20 74 68 65 0a 2a 2a 20 69 6e 64 69 63 65 73 20   the.** indices 
19e50 75 73 65 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e  use the collatin
19e60 67 20 73 65 71 75 65 6e 63 65 20 70 43 6f 6c 6c  g sequence pColl
19e70 2e 20 20 49 66 20 70 43 6f 6c 6c 3d 3d 30 20 74  .  If pColl==0 t
19e80 68 65 6e 20 72 65 63 6f 6d 70 75 74 65 0a 2a 2a  hen recompute.**
19e90 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 65 76 65   all indices eve
19ea0 72 79 77 68 65 72 65 2e 0a 2a 2f 0a 23 69 66 6e  rywhere..*/.#ifn
19eb0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
19ec0 52 45 49 4e 44 45 58 0a 73 74 61 74 69 63 20 76  REINDEX.static v
19ed0 6f 69 64 20 72 65 69 6e 64 65 78 44 61 74 61 62  oid reindexDatab
19ee0 61 73 65 73 28 50 61 72 73 65 20 2a 70 50 61 72  ases(Parse *pPar
19ef0 73 65 2c 20 63 68 61 72 20 63 6f 6e 73 74 20 2a  se, char const *
19f00 7a 43 6f 6c 6c 29 7b 0a 20 20 44 62 20 2a 70 44  zColl){.  Db *pD
19f10 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
19f20 20 20 20 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c        /* A singl
19f30 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20  e database */.  
19f40 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20 20 20  int iDb;        
19f50 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
19f60 68 65 20 64 61 74 61 62 61 73 65 20 69 6e 64 65  he database inde
19f70 78 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 73 71  x number */.  sq
19f80 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
19f90 73 65 2d 3e 64 62 3b 20 20 20 2f 2a 20 54 68 65  se->db;   /* The
19fa0 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
19fb0 74 69 6f 6e 20 2a 2f 0a 20 20 48 61 73 68 45 6c  tion */.  HashEl
19fc0 65 6d 20 2a 6b 3b 20 20 20 20 20 20 20 20 20 20  em *k;          
19fd0 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f        /* For loo
19fe0 70 69 6e 67 20 6f 76 65 72 20 74 61 62 6c 65 73  ping over tables
19ff0 20 69 6e 20 70 44 62 20 2a 2f 0a 20 20 54 61 62   in pDb */.  Tab
1a000 6c 65 20 2a 70 54 61 62 3b 20 20 20 20 20 20 20  le *pTab;       
1a010 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 74 61           /* A ta
1a020 62 6c 65 20 69 6e 20 74 68 65 20 64 61 74 61 62  ble in the datab
1a030 61 73 65 20 2a 2f 0a 0a 20 20 66 6f 72 28 69 44  ase */..  for(iD
1a040 62 3d 30 2c 20 70 44 62 3d 64 62 2d 3e 61 44 62  b=0, pDb=db->aDb
1a050 3b 20 69 44 62 3c 64 62 2d 3e 6e 44 62 3b 20 69  ; iDb<db->nDb; i
1a060 44 62 2b 2b 2c 20 70 44 62 2b 2b 29 7b 0a 20 20  Db++, pDb++){.  
1a070 20 20 61 73 73 65 72 74 28 20 70 44 62 21 3d 30    assert( pDb!=0
1a080 20 29 3b 0a 20 20 20 20 66 6f 72 28 6b 3d 73 71   );.    for(k=sq
1a090 6c 69 74 65 48 61 73 68 46 69 72 73 74 28 26 70  liteHashFirst(&p
1a0a0 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 74 62 6c  Db->pSchema->tbl
1a0b0 48 61 73 68 29 3b 20 20 6b 3b 20 6b 3d 73 71 6c  Hash);  k; k=sql
1a0c0 69 74 65 48 61 73 68 4e 65 78 74 28 6b 29 29 7b  iteHashNext(k)){
1a0d0 0a 20 20 20 20 20 20 70 54 61 62 20 3d 20 28 54  .      pTab = (T
1a0e0 61 62 6c 65 2a 29 73 71 6c 69 74 65 48 61 73 68  able*)sqliteHash
1a0f0 44 61 74 61 28 6b 29 3b 0a 20 20 20 20 20 20 72  Data(k);.      r
1a100 65 69 6e 64 65 78 54 61 62 6c 65 28 70 50 61 72  eindexTable(pPar
1a110 73 65 2c 20 70 54 61 62 2c 20 7a 43 6f 6c 6c 29  se, pTab, zColl)
1a120 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65  ;.    }.  }.}.#e
1a130 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  ndif../*.** Gene
1a140 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 74 68  rate code for th
1a150 65 20 52 45 49 4e 44 45 58 20 63 6f 6d 6d 61 6e  e REINDEX comman
1a160 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20  d..**.**        
1a170 52 45 49 4e 44 45 58 20 20 20 20 20 20 20 20 20  REINDEX         
1a180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a190 20 20 20 2d 2d 20 31 0a 2a 2a 20 20 20 20 20 20     -- 1.**      
1a1a0 20 20 52 45 49 4e 44 45 58 20 20 3c 63 6f 6c 6c    REINDEX  <coll
1a1b0 61 74 69 6f 6e 3e 20 20 20 20 20 20 20 20 20 20  ation>          
1a1c0 20 20 20 20 20 2d 2d 20 32 0a 2a 2a 20 20 20 20       -- 2.**    
1a1d0 20 20 20 20 52 45 49 4e 44 45 58 20 20 3f 3c 64      REINDEX  ?<d
1a1e0 61 74 61 62 61 73 65 3e 2e 3f 3c 74 61 62 6c 65  atabase>.?<table
1a1f0 6e 61 6d 65 3e 20 20 2d 2d 20 33 0a 2a 2a 20 20  name>  -- 3.**  
1a200 20 20 20 20 20 20 52 45 49 4e 44 45 58 20 20 3f        REINDEX  ?
1a210 3c 64 61 74 61 62 61 73 65 3e 2e 3f 3c 69 6e 64  <database>.?<ind
1a220 65 78 6e 61 6d 65 3e 20 20 2d 2d 20 34 0a 2a 2a  exname>  -- 4.**
1a230 0a 2a 2a 20 46 6f 72 6d 20 31 20 63 61 75 73 65  .** Form 1 cause
1a240 73 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 69 6e  s all indices in
1a250 20 61 6c 6c 20 61 74 74 61 63 68 65 64 20 64 61   all attached da
1a260 74 61 62 61 73 65 73 20 74 6f 20 62 65 20 72 65  tabases to be re
1a270 62 75 69 6c 74 2e 0a 2a 2a 20 46 6f 72 6d 20 32  built..** Form 2
1a280 20 72 65 62 75 69 6c 64 73 20 61 6c 6c 20 69 6e   rebuilds all in
1a290 64 69 63 65 73 20 69 6e 20 61 6c 6c 20 64 61 74  dices in all dat
1a2a0 61 62 61 73 65 73 20 74 68 61 74 20 75 73 65 20  abases that use 
1a2b0 74 68 65 20 6e 61 6d 65 64 0a 2a 2a 20 63 6f 6c  the named.** col
1a2c0 6c 61 74 69 6e 67 20 66 75 6e 63 74 69 6f 6e 2e  lating function.
1a2d0 20 20 46 6f 72 6d 73 20 33 20 61 6e 64 20 34 20    Forms 3 and 4 
1a2e0 72 65 62 75 69 6c 64 20 74 68 65 20 6e 61 6d 65  rebuild the name
1a2f0 64 20 69 6e 64 65 78 20 6f 72 20 61 6c 6c 0a 2a  d index or all.*
1a300 2a 20 69 6e 64 69 63 65 73 20 61 73 73 6f 63 69  * indices associ
1a310 61 74 65 64 20 77 69 74 68 20 74 68 65 20 6e 61  ated with the na
1a320 6d 65 64 20 74 61 62 6c 65 2e 0a 2a 2f 0a 23 69  med table..*/.#i
1a330 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1a340 54 5f 52 45 49 4e 44 45 58 0a 76 6f 69 64 20 73  T_REINDEX.void s
1a350 71 6c 69 74 65 33 52 65 69 6e 64 65 78 28 50 61  qlite3Reindex(Pa
1a360 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b  rse *pParse, Tok
1a370 65 6e 20 2a 70 4e 61 6d 65 31 2c 20 54 6f 6b 65  en *pName1, Toke
1a380 6e 20 2a 70 4e 61 6d 65 32 29 7b 0a 20 20 43 6f  n *pName2){.  Co
1a390 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 20 20 20  llSeq *pColl;   
1a3a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c            /* Col
1a3b0 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20  lating sequence 
1a3c0 74 6f 20 62 65 20 72 65 69 6e 64 65 78 65 64 2c  to be reindexed,
1a3d0 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 63 68   or NULL */.  ch
1a3e0 61 72 20 2a 7a 3b 20 20 20 20 20 20 20 20 20 20  ar *z;          
1a3f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
1a400 65 20 6f 66 20 61 20 74 61 62 6c 65 20 6f 72 20  e of a table or 
1a410 69 6e 64 65 78 20 2a 2f 0a 20 20 63 6f 6e 73 74  index */.  const
1a420 20 63 68 61 72 20 2a 7a 44 62 3b 20 20 20 20 20   char *zDb;     
1a430 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
1a440 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 2a  f the database *
1a450 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b  /.  Table *pTab;
1a460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a470 2f 2a 20 41 20 74 61 62 6c 65 20 69 6e 20 74 68  /* A table in th
1a480 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20  e database */.  
1a490 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b 20 20  Index *pIndex;  
1a4a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
1a4b0 6e 20 69 6e 64 65 78 20 61 73 73 6f 63 69 61 74  n index associat
1a4c0 65 64 20 77 69 74 68 20 70 54 61 62 20 2a 2f 0a  ed with pTab */.
1a4d0 20 20 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20    int iDb;      
1a4e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1a4f0 20 54 68 65 20 64 61 74 61 62 61 73 65 20 69 6e   The database in
1a500 64 65 78 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20  dex number */.  
1a510 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
1a520 61 72 73 65 2d 3e 64 62 3b 20 20 20 2f 2a 20 54  arse->db;   /* T
1a530 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  he database conn
1a540 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 6f 6b 65  ection */.  Toke
1a550 6e 20 2a 70 4f 62 6a 4e 61 6d 65 3b 20 20 20 20  n *pObjName;    
1a560 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
1a570 6f 66 20 74 68 65 20 74 61 62 6c 65 20 6f 72 20  of the table or 
1a580 69 6e 64 65 78 20 74 6f 20 62 65 20 72 65 69 6e  index to be rein
1a590 64 65 78 65 64 20 2a 2f 0a 0a 20 20 2f 2a 20 52  dexed */..  /* R
1a5a0 65 61 64 20 74 68 65 20 64 61 74 61 62 61 73 65  ead the database
1a5b0 20 73 63 68 65 6d 61 2e 20 49 66 20 61 6e 20 65   schema. If an e
1a5c0 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 6c 65 61  rror occurs, lea
1a5d0 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73  ve an error mess
1a5e0 61 67 65 0a 20 20 2a 2a 20 61 6e 64 20 63 6f 64  age.  ** and cod
1a5f0 65 20 69 6e 20 70 50 61 72 73 65 20 61 6e 64 20  e in pParse and 
1a600 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 20 2a 2f 0a  return NULL. */.
1a610 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21    if( SQLITE_OK!
1a620 3d 73 71 6c 69 74 65 33 52 65 61 64 53 63 68 65  =sqlite3ReadSche
1a630 6d 61 28 70 50 61 72 73 65 29 20 29 7b 0a 20 20  ma(pParse) ){.  
1a640 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20    return;.  }.. 
1a650 20 69 66 28 20 70 4e 61 6d 65 31 3d 3d 30 20 7c   if( pName1==0 |
1a660 7c 20 70 4e 61 6d 65 31 2d 3e 7a 3d 3d 30 20 29  | pName1->z==0 )
1a670 7b 0a 20 20 20 20 72 65 69 6e 64 65 78 44 61 74  {.    reindexDat
1a680 61 62 61 73 65 73 28 70 50 61 72 73 65 2c 20 30  abases(pParse, 0
1a690 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  );.    return;. 
1a6a0 20 7d 65 6c 73 65 20 69 66 28 20 70 4e 61 6d 65   }else if( pName
1a6b0 32 3d 3d 30 20 7c 7c 20 70 4e 61 6d 65 32 2d 3e  2==0 || pName2->
1a6c0 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65  z==0 ){.    asse
1a6d0 72 74 28 20 70 4e 61 6d 65 31 2d 3e 7a 20 29 3b  rt( pName1->z );
1a6e0 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c  .    pColl = sql
1a6f0 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28  ite3FindCollSeq(
1a700 64 62 2c 20 45 4e 43 28 64 62 29 2c 20 28 63 68  db, ENC(db), (ch
1a710 61 72 2a 29 70 4e 61 6d 65 31 2d 3e 7a 2c 20 70  ar*)pName1->z, p
1a720 4e 61 6d 65 31 2d 3e 6e 2c 20 30 29 3b 0a 20 20  Name1->n, 0);.  
1a730 20 20 69 66 28 20 70 43 6f 6c 6c 20 29 7b 0a 20    if( pColl ){. 
1a740 20 20 20 20 20 63 68 61 72 20 2a 7a 43 6f 6c 6c       char *zColl
1a750 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 4e   = sqlite3DbStrN
1a760 44 75 70 28 64 62 2c 20 28 63 6f 6e 73 74 20 63  Dup(db, (const c
1a770 68 61 72 20 2a 29 70 4e 61 6d 65 31 2d 3e 7a 2c  har *)pName1->z,
1a780 20 70 4e 61 6d 65 31 2d 3e 6e 29 3b 0a 20 20 20   pName1->n);.   
1a790 20 20 20 69 66 28 20 7a 43 6f 6c 6c 20 29 7b 0a     if( zColl ){.
1a7a0 20 20 20 20 20 20 20 20 72 65 69 6e 64 65 78 44          reindexD
1a7b0 61 74 61 62 61 73 65 73 28 70 50 61 72 73 65 2c  atabases(pParse,
1a7c0 20 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20 20 20 20   zColl);.       
1a7d0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43   sqlite3_free(zC
1a7e0 6f 6c 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  oll);.      }.  
1a7f0 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
1a800 7d 0a 20 20 7d 0a 20 20 69 44 62 20 3d 20 73 71  }.  }.  iDb = sq
1a810 6c 69 74 65 33 54 77 6f 50 61 72 74 4e 61 6d 65  lite3TwoPartName
1a820 28 70 50 61 72 73 65 2c 20 70 4e 61 6d 65 31 2c  (pParse, pName1,
1a830 20 70 4e 61 6d 65 32 2c 20 26 70 4f 62 6a 4e 61   pName2, &pObjNa
1a840 6d 65 29 3b 0a 20 20 69 66 28 20 69 44 62 3c 30  me);.  if( iDb<0
1a850 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 7a 20 3d   ) return;.  z =
1a860 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d   sqlite3NameFrom
1a870 54 6f 6b 65 6e 28 64 62 2c 20 70 4f 62 6a 4e 61  Token(db, pObjNa
1a880 6d 65 29 3b 0a 20 20 69 66 28 20 7a 3d 3d 30 20  me);.  if( z==0 
1a890 29 20 72 65 74 75 72 6e 3b 0a 20 20 7a 44 62 20  ) return;.  zDb 
1a8a0 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a  = db->aDb[iDb].z
1a8b0 4e 61 6d 65 3b 0a 20 20 70 54 61 62 20 3d 20 73  Name;.  pTab = s
1a8c0 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28  qlite3FindTable(
1a8d0 64 62 2c 20 7a 2c 20 7a 44 62 29 3b 0a 20 20 69  db, z, zDb);.  i
1a8e0 66 28 20 70 54 61 62 20 29 7b 0a 20 20 20 20 72  f( pTab ){.    r
1a8f0 65 69 6e 64 65 78 54 61 62 6c 65 28 70 50 61 72  eindexTable(pPar
1a900 73 65 2c 20 70 54 61 62 2c 20 30 29 3b 0a 20 20  se, pTab, 0);.  
1a910 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
1a920 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  );.    return;. 
1a930 20 7d 0a 20 20 70 49 6e 64 65 78 20 3d 20 73 71   }.  pIndex = sq
1a940 6c 69 74 65 33 46 69 6e 64 49 6e 64 65 78 28 64  lite3FindIndex(d
1a950 62 2c 20 7a 2c 20 7a 44 62 29 3b 0a 20 20 73 71  b, z, zDb);.  sq
1a960 6c 69 74 65 33 5f 66 72 65 65 28 7a 29 3b 0a 20  lite3_free(z);. 
1a970 20 69 66 28 20 70 49 6e 64 65 78 20 29 7b 0a 20   if( pIndex ){. 
1a980 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57     sqlite3BeginW
1a990 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50  riteOperation(pP
1a9a0 61 72 73 65 2c 20 30 2c 20 69 44 62 29 3b 0a 20  arse, 0, iDb);. 
1a9b0 20 20 20 73 71 6c 69 74 65 33 52 65 66 69 6c 6c     sqlite3Refill
1a9c0 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70 49  Index(pParse, pI
1a9d0 6e 64 65 78 2c 20 2d 31 29 3b 0a 20 20 20 20 72  ndex, -1);.    r
1a9e0 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 73 71 6c  eturn;.  }.  sql
1a9f0 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
1aa00 72 73 65 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20  rse, "unable to 
1aa10 69 64 65 6e 74 69 66 79 20 74 68 65 20 6f 62 6a  identify the obj
1aa20 65 63 74 20 74 6f 20 62 65 20 72 65 69 6e 64 65  ect to be reinde
1aa30 78 65 64 22 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a  xed");.}.#endif.
1aa40 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
1aa50 64 79 6e 61 6d 69 63 6c 79 20 61 6c 6c 6f 63 61  dynamicly alloca
1aa60 74 65 64 20 4b 65 79 49 6e 66 6f 20 73 74 72 75  ted KeyInfo stru
1aa70 63 74 75 72 65 20 74 68 61 74 20 63 61 6e 20 62  cture that can b
1aa80 65 20 75 73 65 64 0a 2a 2a 20 77 69 74 68 20 4f  e used.** with O
1aa90 50 5f 4f 70 65 6e 52 65 61 64 20 6f 72 20 4f 50  P_OpenRead or OP
1aaa0 5f 4f 70 65 6e 57 72 69 74 65 20 74 6f 20 61 63  _OpenWrite to ac
1aab0 63 65 73 73 20 64 61 74 61 62 61 73 65 20 69 6e  cess database in
1aac0 64 65 78 20 70 49 64 78 2e 0a 2a 2a 0a 2a 2a 20  dex pIdx..**.** 
1aad0 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 61  If successful, a
1aae0 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
1aaf0 6e 65 77 20 73 74 72 75 63 74 75 72 65 20 69 73  new structure is
1ab00 20 72 65 74 75 72 6e 65 64 2e 20 49 6e 20 74 68   returned. In th
1ab10 69 73 20 63 61 73 65 0a 2a 2a 20 74 68 65 20 63  is case.** the c
1ab20 61 6c 6c 65 72 20 69 73 20 72 65 73 70 6f 6e 73  aller is respons
1ab30 69 62 6c 65 20 66 6f 72 20 63 61 6c 6c 69 6e 67  ible for calling
1ab40 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 29 20   sqlite3_free() 
1ab50 6f 6e 20 74 68 65 20 72 65 74 75 72 6e 65 64 20  on the returned 
1ab60 0a 2a 2a 20 70 6f 69 6e 74 65 72 2e 20 49 66 20  .** pointer. If 
1ab70 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  an error occurs 
1ab80 28 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 20 6f  (out of memory o
1ab90 72 20 6d 69 73 73 69 6e 67 20 63 6f 6c 6c 61 74  r missing collat
1aba0 69 6f 6e 20 0a 2a 2a 20 73 65 71 75 65 6e 63 65  ion .** sequence
1abb0 29 2c 20 4e 55 4c 4c 20 69 73 20 72 65 74 75 72  ), NULL is retur
1abc0 6e 65 64 20 61 6e 64 20 74 68 65 20 73 74 61 74  ned and the stat
1abd0 65 20 6f 66 20 70 50 61 72 73 65 20 75 70 64 61  e of pParse upda
1abe0 74 65 64 20 74 6f 20 72 65 66 6c 65 63 74 0a 2a  ted to reflect.*
1abf0 2a 20 74 68 65 20 65 72 72 6f 72 2e 0a 2a 2f 0a  * the error..*/.
1ac00 4b 65 79 49 6e 66 6f 20 2a 73 71 6c 69 74 65 33  KeyInfo *sqlite3
1ac10 49 6e 64 65 78 4b 65 79 69 6e 66 6f 28 50 61 72  IndexKeyinfo(Par
1ac20 73 65 20 2a 70 50 61 72 73 65 2c 20 49 6e 64 65  se *pParse, Inde
1ac30 78 20 2a 70 49 64 78 29 7b 0a 20 20 69 6e 74 20  x *pIdx){.  int 
1ac40 69 3b 0a 20 20 69 6e 74 20 6e 43 6f 6c 20 3d 20  i;.  int nCol = 
1ac50 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 0a 20  pIdx->nColumn;. 
1ac60 20 69 6e 74 20 6e 42 79 74 65 73 20 3d 20 73 69   int nBytes = si
1ac70 7a 65 6f 66 28 4b 65 79 49 6e 66 6f 29 20 2b 20  zeof(KeyInfo) + 
1ac80 28 6e 43 6f 6c 2d 31 29 2a 73 69 7a 65 6f 66 28  (nCol-1)*sizeof(
1ac90 43 6f 6c 6c 53 65 71 2a 29 20 2b 20 6e 43 6f 6c  CollSeq*) + nCol
1aca0 3b 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65  ;.  KeyInfo *pKe
1acb0 79 20 3d 20 28 4b 65 79 49 6e 66 6f 20 2a 29 73  y = (KeyInfo *)s
1acc0 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
1acd0 72 6f 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 6e  ro(pParse->db, n
1ace0 42 79 74 65 73 29 3b 0a 0a 20 20 69 66 28 20 70  Bytes);..  if( p
1acf0 4b 65 79 20 29 7b 0a 20 20 20 20 70 4b 65 79 2d  Key ){.    pKey-
1ad00 3e 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  >db = pParse->db
1ad10 3b 0a 20 20 20 20 70 4b 65 79 2d 3e 61 53 6f 72  ;.    pKey->aSor
1ad20 74 4f 72 64 65 72 20 3d 20 28 75 38 20 2a 29 26  tOrder = (u8 *)&
1ad30 28 70 4b 65 79 2d 3e 61 43 6f 6c 6c 5b 6e 43 6f  (pKey->aColl[nCo
1ad40 6c 5d 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  l]);.    assert(
1ad50 20 26 70 4b 65 79 2d 3e 61 53 6f 72 74 4f 72 64   &pKey->aSortOrd
1ad60 65 72 5b 6e 43 6f 6c 5d 3d 3d 26 28 28 28 75 38  er[nCol]==&(((u8
1ad70 20 2a 29 70 4b 65 79 29 5b 6e 42 79 74 65 73 5d   *)pKey)[nBytes]
1ad80 29 20 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  ) );.    for(i=0
1ad90 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a  ; i<nCol; i++){.
1ada0 20 20 20 20 20 20 63 68 61 72 20 2a 7a 43 6f 6c        char *zCol
1adb0 6c 20 3d 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c  l = pIdx->azColl
1adc0 5b 69 5d 3b 0a 20 20 20 20 20 20 61 73 73 65 72  [i];.      asser
1add0 74 28 20 7a 43 6f 6c 6c 20 29 3b 0a 20 20 20 20  t( zColl );.    
1ade0 20 20 70 4b 65 79 2d 3e 61 43 6f 6c 6c 5b 69 5d    pKey->aColl[i]
1adf0 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65   = sqlite3Locate
1ae00 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
1ae10 7a 43 6f 6c 6c 2c 20 2d 31 29 3b 0a 20 20 20 20  zColl, -1);.    
1ae20 20 20 70 4b 65 79 2d 3e 61 53 6f 72 74 4f 72 64    pKey->aSortOrd
1ae30 65 72 5b 69 5d 20 3d 20 70 49 64 78 2d 3e 61 53  er[i] = pIdx->aS
1ae40 6f 72 74 4f 72 64 65 72 5b 69 5d 3b 0a 20 20 20  ortOrder[i];.   
1ae50 20 7d 0a 20 20 20 20 70 4b 65 79 2d 3e 6e 46 69   }.    pKey->nFi
1ae60 65 6c 64 20 3d 20 6e 43 6f 6c 3b 0a 20 20 7d 0a  eld = nCol;.  }.
1ae70 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e  .  if( pParse->n
1ae80 45 72 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  Err ){.    sqlit
1ae90 65 33 5f 66 72 65 65 28 70 4b 65 79 29 3b 0a 20  e3_free(pKey);. 
1aea0 20 20 20 70 4b 65 79 20 3d 20 30 3b 0a 20 20 7d     pKey = 0;.  }
1aeb0 0a 20 20 72 65 74 75 72 6e 20 70 4b 65 79 3b 0a  .  return pKey;.
1aec0 7d 0a                                            }.