/ Hex Artifact Content
Login

Artifact 160c71acca8f643f436ed6c1ee2f684c88df4dfe:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43 20 63  ile contains C c
0190: 6f 64 65 20 72 6f 75 74 69 6e 65 73 20 74 68 61  ode routines tha
01a0: 74 20 61 72 65 20 63 61 6c 6c 65 64 20 62 79 20  t are called by 
01b0: 74 68 65 20 53 51 4c 69 74 65 20 70 61 72 73 65  the SQLite parse
01c0: 72 0a 2a 2a 20 77 68 65 6e 20 73 79 6e 74 61 78  r.** when syntax
01d0: 20 72 75 6c 65 73 20 61 72 65 20 72 65 64 75 63   rules are reduc
01e0: 65 64 2e 20 20 54 68 65 20 72 6f 75 74 69 6e 65  ed.  The routine
01f0: 73 20 69 6e 20 74 68 69 73 20 66 69 6c 65 20 68  s in this file h
0200: 61 6e 64 6c 65 20 74 68 65 0a 2a 2a 20 66 6f 6c  andle the.** fol
0210: 6c 6f 77 69 6e 67 20 6b 69 6e 64 73 20 6f 66 20  lowing kinds of 
0220: 53 51 4c 20 73 79 6e 74 61 78 3a 0a 2a 2a 0a 2a  SQL syntax:.**.*
0230: 2a 20 20 20 20 20 43 52 45 41 54 45 20 54 41 42  *     CREATE TAB
0240: 4c 45 0a 2a 2a 20 20 20 20 20 44 52 4f 50 20 54  LE.**     DROP T
0250: 41 42 4c 45 0a 2a 2a 20 20 20 20 20 43 52 45 41  ABLE.**     CREA
0260: 54 45 20 49 4e 44 45 58 0a 2a 2a 20 20 20 20 20  TE INDEX.**     
0270: 44 52 4f 50 20 49 4e 44 45 58 0a 2a 2a 20 20 20  DROP INDEX.**   
0280: 20 20 63 72 65 61 74 69 6e 67 20 49 44 20 6c 69    creating ID li
0290: 73 74 73 0a 2a 2a 20 20 20 20 20 42 45 47 49 4e  sts.**     BEGIN
02a0: 20 54 52 41 4e 53 41 43 54 49 4f 4e 0a 2a 2a 20   TRANSACTION.** 
02b0: 20 20 20 20 43 4f 4d 4d 49 54 0a 2a 2a 20 20 20      COMMIT.**   
02c0: 20 20 52 4f 4c 4c 42 41 43 4b 0a 2a 2a 0a 2a 2a    ROLLBACK.**.**
02d0: 20 24 49 64 3a 20 62 75 69 6c 64 2e 63 2c 76 20   $Id: build.c,v 
02e0: 31 2e 34 39 36 20 32 30 30 38 2f 30 38 2f 32 30  1.496 2008/08/20
02f0: 20 31 36 3a 33 35 3a 31 30 20 64 72 68 20 45 78   16:35:10 drh Ex
0300: 70 20 24 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20  p $.*/.#include 
0310: 22 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a 23 69  "sqliteInt.h".#i
0320: 6e 63 6c 75 64 65 20 3c 63 74 79 70 65 2e 68 3e  nclude <ctype.h>
0330: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
0340: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77  tine is called w
0350: 68 65 6e 20 61 20 6e 65 77 20 53 51 4c 20 73 74  hen a new SQL st
0360: 61 74 65 6d 65 6e 74 20 69 73 20 62 65 67 69 6e  atement is begin
0370: 6e 69 6e 67 20 74 6f 0a 2a 2a 20 62 65 20 70 61  ning to.** be pa
0380: 72 73 65 64 2e 20 20 49 6e 69 74 69 61 6c 69 7a  rsed.  Initializ
0390: 65 20 74 68 65 20 70 50 61 72 73 65 20 73 74 72  e the pParse str
03a0: 75 63 74 75 72 65 20 61 73 20 6e 65 65 64 65 64  ucture as needed
03b0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
03c0: 33 42 65 67 69 6e 50 61 72 73 65 28 50 61 72 73  3BeginParse(Pars
03d0: 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 65  e *pParse, int e
03e0: 78 70 6c 61 69 6e 46 6c 61 67 29 7b 0a 20 20 70  xplainFlag){.  p
03f0: 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 20 3d  Parse->explain =
0400: 20 65 78 70 6c 61 69 6e 46 6c 61 67 3b 0a 20 20   explainFlag;.  
0410: 70 50 61 72 73 65 2d 3e 6e 56 61 72 20 3d 20 30  pParse->nVar = 0
0420: 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ;.}..#ifndef SQL
0430: 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f  ITE_OMIT_SHARED_
0440: 43 41 43 48 45 0a 2f 2a 0a 2a 2a 20 54 68 65 20  CACHE./*.** The 
0450: 54 61 62 6c 65 4c 6f 63 6b 20 73 74 72 75 63 74  TableLock struct
0460: 75 72 65 20 69 73 20 6f 6e 6c 79 20 75 73 65 64  ure is only used
0470: 20 62 79 20 74 68 65 20 73 71 6c 69 74 65 33 54   by the sqlite3T
0480: 61 62 6c 65 4c 6f 63 6b 28 29 20 61 6e 64 0a 2a  ableLock() and.*
0490: 2a 20 63 6f 64 65 54 61 62 6c 65 4c 6f 63 6b 73  * codeTableLocks
04a0: 28 29 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 2a 2f  () functions..*/
04b0: 0a 73 74 72 75 63 74 20 54 61 62 6c 65 4c 6f 63  .struct TableLoc
04c0: 6b 20 7b 0a 20 20 69 6e 74 20 69 44 62 3b 20 20  k {.  int iDb;  
04d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
04e0: 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74 61  e database conta
04f0: 69 6e 69 6e 67 20 74 68 65 20 74 61 62 6c 65 20  ining the table 
0500: 74 6f 20 62 65 20 6c 6f 63 6b 65 64 20 2a 2f 0a  to be locked */.
0510: 20 20 69 6e 74 20 69 54 61 62 3b 20 20 20 20 20    int iTab;     
0520: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 6f         /* The ro
0530: 6f 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 74  ot page of the t
0540: 61 62 6c 65 20 74 6f 20 62 65 20 6c 6f 63 6b 65  able to be locke
0550: 64 20 2a 2f 0a 20 20 75 38 20 69 73 57 72 69 74  d */.  u8 isWrit
0560: 65 4c 6f 63 6b 3b 20 20 20 20 20 20 2f 2a 20 54  eLock;      /* T
0570: 72 75 65 20 66 6f 72 20 77 72 69 74 65 20 6c 6f  rue for write lo
0580: 63 6b 2e 20 20 46 61 6c 73 65 20 66 6f 72 20 61  ck.  False for a
0590: 20 72 65 61 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20   read lock */.  
05a0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
05b0: 65 3b 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20  e;   /* Name of 
05c0: 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 7d 3b 0a  the table */.};.
05d0: 0a 2f 2a 0a 2a 2a 20 52 65 63 6f 72 64 20 74 68  ./*.** Record th
05e0: 65 20 66 61 63 74 20 74 68 61 74 20 77 65 20 77  e fact that we w
05f0: 61 6e 74 20 74 6f 20 6c 6f 63 6b 20 61 20 74 61  ant to lock a ta
0600: 62 6c 65 20 61 74 20 72 75 6e 2d 74 69 6d 65 2e  ble at run-time.
0610: 20 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 61 62    .**.** The tab
0620: 6c 65 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64 20  le to be locked 
0630: 68 61 73 20 72 6f 6f 74 20 70 61 67 65 20 69 54  has root page iT
0640: 61 62 20 61 6e 64 20 69 73 20 66 6f 75 6e 64 20  ab and is found 
0650: 69 6e 20 64 61 74 61 62 61 73 65 20 69 44 62 2e  in database iDb.
0660: 0a 2a 2a 20 41 20 72 65 61 64 20 6f 72 20 61 20  .** A read or a 
0670: 77 72 69 74 65 20 6c 6f 63 6b 20 63 61 6e 20 62  write lock can b
0680: 65 20 74 61 6b 65 6e 20 64 65 70 65 6e 64 69 6e  e taken dependin
0690: 67 20 6f 6e 20 69 73 57 72 69 74 65 6c 6f 63 6b  g on isWritelock
06a0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
06b0: 74 69 6e 65 20 6a 75 73 74 20 72 65 63 6f 72 64  tine just record
06c0: 73 20 74 68 65 20 66 61 63 74 20 74 68 61 74 20  s the fact that 
06d0: 74 68 65 20 6c 6f 63 6b 20 69 73 20 64 65 73 69  the lock is desi
06e0: 72 65 64 2e 20 20 54 68 65 0a 2a 2a 20 63 6f 64  red.  The.** cod
06f0: 65 20 74 6f 20 6d 61 6b 65 20 74 68 65 20 6c 6f  e to make the lo
0700: 63 6b 20 6f 63 63 75 72 20 69 73 20 67 65 6e 65  ck occur is gene
0710: 72 61 74 65 64 20 62 79 20 61 20 6c 61 74 65 72  rated by a later
0720: 20 63 61 6c 6c 20 74 6f 0a 2a 2a 20 63 6f 64 65   call to.** code
0730: 54 61 62 6c 65 4c 6f 63 6b 73 28 29 20 77 68 69  TableLocks() whi
0740: 63 68 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67  ch occurs during
0750: 20 73 71 6c 69 74 65 33 46 69 6e 69 73 68 43 6f   sqlite3FinishCo
0760: 64 69 6e 67 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20  ding()..*/.void 
0770: 73 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b  sqlite3TableLock
0780: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
0790: 65 2c 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e  e,     /* Parsin
07a0: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69  g context */.  i
07b0: 6e 74 20 69 44 62 2c 20 20 20 20 20 20 20 20 20  nt iDb,         
07c0: 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74 68    /* Index of th
07d0: 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74 61  e database conta
07e0: 69 6e 69 6e 67 20 74 68 65 20 74 61 62 6c 65 20  ining the table 
07f0: 74 6f 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 6e 74  to lock */.  int
0800: 20 69 54 61 62 2c 20 20 20 20 20 20 20 20 20 20   iTab,          
0810: 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20 6e 75 6d  /* Root page num
0820: 62 65 72 20 6f 66 20 74 68 65 20 74 61 62 6c 65  ber of the table
0830: 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64 20 2a 2f   to be locked */
0840: 0a 20 20 75 38 20 69 73 57 72 69 74 65 4c 6f 63  .  u8 isWriteLoc
0850: 6b 2c 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f  k,    /* True fo
0860: 72 20 61 20 77 72 69 74 65 20 6c 6f 63 6b 20 2a  r a write lock *
0870: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
0880: 7a 4e 61 6d 65 20 20 2f 2a 20 4e 61 6d 65 20 6f  zName  /* Name o
0890: 66 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20 62  f the table to b
08a0: 65 20 6c 6f 63 6b 65 64 20 2a 2f 0a 29 7b 0a 20  e locked */.){. 
08b0: 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e 42   int i;.  int nB
08c0: 79 74 65 73 3b 0a 20 20 54 61 62 6c 65 4c 6f 63  ytes;.  TableLoc
08d0: 6b 20 2a 70 3b 0a 0a 20 20 69 66 28 20 69 44 62  k *p;..  if( iDb
08e0: 3c 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  <0 ){.    return
08f0: 3b 0a 20 20 7d 0a 0a 20 20 66 6f 72 28 69 3d 30  ;.  }..  for(i=0
0900: 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e 54 61 62  ; i<pParse->nTab
0910: 6c 65 4c 6f 63 6b 3b 20 69 2b 2b 29 7b 0a 20 20  leLock; i++){.  
0920: 20 20 70 20 3d 20 26 70 50 61 72 73 65 2d 3e 61    p = &pParse->a
0930: 54 61 62 6c 65 4c 6f 63 6b 5b 69 5d 3b 0a 20 20  TableLock[i];.  
0940: 20 20 69 66 28 20 70 2d 3e 69 44 62 3d 3d 69 44    if( p->iDb==iD
0950: 62 20 26 26 20 70 2d 3e 69 54 61 62 3d 3d 69 54  b && p->iTab==iT
0960: 61 62 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 69  ab ){.      p->i
0970: 73 57 72 69 74 65 4c 6f 63 6b 20 3d 20 28 70 2d  sWriteLock = (p-
0980: 3e 69 73 57 72 69 74 65 4c 6f 63 6b 20 7c 7c 20  >isWriteLock || 
0990: 69 73 57 72 69 74 65 4c 6f 63 6b 29 3b 0a 20 20  isWriteLock);.  
09a0: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
09b0: 7d 0a 20 20 7d 0a 0a 20 20 6e 42 79 74 65 73 20  }.  }..  nBytes 
09c0: 3d 20 73 69 7a 65 6f 66 28 54 61 62 6c 65 4c 6f  = sizeof(TableLo
09d0: 63 6b 29 20 2a 20 28 70 50 61 72 73 65 2d 3e 6e  ck) * (pParse->n
09e0: 54 61 62 6c 65 4c 6f 63 6b 2b 31 29 3b 0a 20 20  TableLock+1);.  
09f0: 70 50 61 72 73 65 2d 3e 61 54 61 62 6c 65 4c 6f  pParse->aTableLo
0a00: 63 6b 20 3d 20 0a 20 20 20 20 20 20 73 71 6c 69  ck = .      sqli
0a10: 74 65 33 44 62 52 65 61 6c 6c 6f 63 4f 72 46 72  te3DbReallocOrFr
0a20: 65 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  ee(pParse->db, p
0a30: 50 61 72 73 65 2d 3e 61 54 61 62 6c 65 4c 6f 63  Parse->aTableLoc
0a40: 6b 2c 20 6e 42 79 74 65 73 29 3b 0a 20 20 69 66  k, nBytes);.  if
0a50: 28 20 70 50 61 72 73 65 2d 3e 61 54 61 62 6c 65  ( pParse->aTable
0a60: 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 70 20 3d 20  Lock ){.    p = 
0a70: 26 70 50 61 72 73 65 2d 3e 61 54 61 62 6c 65 4c  &pParse->aTableL
0a80: 6f 63 6b 5b 70 50 61 72 73 65 2d 3e 6e 54 61 62  ock[pParse->nTab
0a90: 6c 65 4c 6f 63 6b 2b 2b 5d 3b 0a 20 20 20 20 70  leLock++];.    p
0aa0: 2d 3e 69 44 62 20 3d 20 69 44 62 3b 0a 20 20 20  ->iDb = iDb;.   
0ab0: 20 70 2d 3e 69 54 61 62 20 3d 20 69 54 61 62 3b   p->iTab = iTab;
0ac0: 0a 20 20 20 20 70 2d 3e 69 73 57 72 69 74 65 4c  .    p->isWriteL
0ad0: 6f 63 6b 20 3d 20 69 73 57 72 69 74 65 4c 6f 63  ock = isWriteLoc
0ae0: 6b 3b 0a 20 20 20 20 70 2d 3e 7a 4e 61 6d 65 20  k;.    p->zName 
0af0: 3d 20 7a 4e 61 6d 65 3b 0a 20 20 7d 65 6c 73 65  = zName;.  }else
0b00: 7b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 54  {.    pParse->nT
0b10: 61 62 6c 65 4c 6f 63 6b 20 3d 20 30 3b 0a 20 20  ableLock = 0;.  
0b20: 20 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61    pParse->db->ma
0b30: 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a  llocFailed = 1;.
0b40: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64    }.}../*.** Cod
0b50: 65 20 61 6e 20 4f 50 5f 54 61 62 6c 65 4c 6f 63  e an OP_TableLoc
0b60: 6b 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 66 6f  k instruction fo
0b70: 72 20 65 61 63 68 20 74 61 62 6c 65 20 6c 6f 63  r each table loc
0b80: 6b 65 64 20 62 79 20 74 68 65 0a 2a 2a 20 73 74  ked by the.** st
0b90: 61 74 65 6d 65 6e 74 20 28 63 6f 6e 66 69 67 75  atement (configu
0ba0: 72 65 64 20 62 79 20 63 61 6c 6c 73 20 74 6f 20  red by calls to 
0bb0: 73 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b  sqlite3TableLock
0bc0: 28 29 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ())..*/.static v
0bd0: 6f 69 64 20 63 6f 64 65 54 61 62 6c 65 4c 6f 63  oid codeTableLoc
0be0: 6b 73 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ks(Parse *pParse
0bf0: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 56 64  ){.  int i;.  Vd
0c00: 62 65 20 2a 70 56 64 62 65 3b 20 0a 0a 20 20 69  be *pVdbe; ..  i
0c10: 66 28 20 30 3d 3d 28 70 56 64 62 65 20 3d 20 73  f( 0==(pVdbe = s
0c20: 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
0c30: 61 72 73 65 29 29 20 29 7b 0a 20 20 20 20 72 65  arse)) ){.    re
0c40: 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 66 6f 72  turn;.  }..  for
0c50: 28 69 3d 30 3b 20 69 3c 70 50 61 72 73 65 2d 3e  (i=0; i<pParse->
0c60: 6e 54 61 62 6c 65 4c 6f 63 6b 3b 20 69 2b 2b 29  nTableLock; i++)
0c70: 7b 0a 20 20 20 20 54 61 62 6c 65 4c 6f 63 6b 20  {.    TableLock 
0c80: 2a 70 20 3d 20 26 70 50 61 72 73 65 2d 3e 61 54  *p = &pParse->aT
0c90: 61 62 6c 65 4c 6f 63 6b 5b 69 5d 3b 0a 20 20 20  ableLock[i];.   
0ca0: 20 69 6e 74 20 70 31 20 3d 20 70 2d 3e 69 44 62   int p1 = p->iDb
0cb0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
0cc0: 65 41 64 64 4f 70 34 28 70 56 64 62 65 2c 20 4f  eAddOp4(pVdbe, O
0cd0: 50 5f 54 61 62 6c 65 4c 6f 63 6b 2c 20 70 31 2c  P_TableLock, p1,
0ce0: 20 70 2d 3e 69 54 61 62 2c 20 70 2d 3e 69 73 57   p->iTab, p->isW
0cf0: 72 69 74 65 4c 6f 63 6b 2c 0a 20 20 20 20 20 20  riteLock,.      
0d00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0d10: 70 2d 3e 7a 4e 61 6d 65 2c 20 50 34 5f 53 54 41  p->zName, P4_STA
0d20: 54 49 43 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73  TIC);.  }.}.#els
0d30: 65 0a 20 20 23 64 65 66 69 6e 65 20 63 6f 64 65  e.  #define code
0d40: 54 61 62 6c 65 4c 6f 63 6b 73 28 78 29 0a 23 65  TableLocks(x).#e
0d50: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ndif../*.** This
0d60: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
0d70: 65 64 20 61 66 74 65 72 20 61 20 73 69 6e 67 6c  ed after a singl
0d80: 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20  e SQL statement 
0d90: 68 61 73 20 62 65 65 6e 0a 2a 2a 20 70 61 72 73  has been.** pars
0da0: 65 64 20 61 6e 64 20 61 20 56 44 42 45 20 70 72  ed and a VDBE pr
0db0: 6f 67 72 61 6d 20 74 6f 20 65 78 65 63 75 74 65  ogram to execute
0dc0: 20 74 68 61 74 20 73 74 61 74 65 6d 65 6e 74 20   that statement 
0dd0: 68 61 73 20 62 65 65 6e 0a 2a 2a 20 70 72 65 70  has been.** prep
0de0: 61 72 65 64 2e 20 20 54 68 69 73 20 72 6f 75 74  ared.  This rout
0df0: 69 6e 65 20 70 75 74 73 20 74 68 65 20 66 69 6e  ine puts the fin
0e00: 69 73 68 69 6e 67 20 74 6f 75 63 68 65 73 20 6f  ishing touches o
0e10: 6e 20 74 68 65 0a 2a 2a 20 56 44 42 45 20 70 72  n the.** VDBE pr
0e20: 6f 67 72 61 6d 20 61 6e 64 20 72 65 73 65 74 73  ogram and resets
0e30: 20 74 68 65 20 70 50 61 72 73 65 20 73 74 72 75   the pParse stru
0e40: 63 74 75 72 65 20 66 6f 72 20 74 68 65 20 6e 65  cture for the ne
0e50: 78 74 0a 2a 2a 20 70 61 72 73 65 2e 0a 2a 2a 0a  xt.** parse..**.
0e60: 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 69 66 20  ** Note that if 
0e70: 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65  an error occurre
0e80: 64 2c 20 69 74 20 6d 69 67 68 74 20 62 65 20 74  d, it might be t
0e90: 68 65 20 63 61 73 65 20 74 68 61 74 0a 2a 2a 20  he case that.** 
0ea0: 6e 6f 20 56 44 42 45 20 63 6f 64 65 20 77 61 73  no VDBE code was
0eb0: 20 67 65 6e 65 72 61 74 65 64 2e 0a 2a 2f 0a 76   generated..*/.v
0ec0: 6f 69 64 20 73 71 6c 69 74 65 33 46 69 6e 69 73  oid sqlite3Finis
0ed0: 68 43 6f 64 69 6e 67 28 50 61 72 73 65 20 2a 70  hCoding(Parse *p
0ee0: 50 61 72 73 65 29 7b 0a 20 20 73 71 6c 69 74 65  Parse){.  sqlite
0ef0: 33 20 2a 64 62 3b 0a 20 20 56 64 62 65 20 2a 76  3 *db;.  Vdbe *v
0f00: 3b 0a 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65  ;..  db = pParse
0f10: 2d 3e 64 62 3b 0a 20 20 69 66 28 20 64 62 2d 3e  ->db;.  if( db->
0f20: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72  mallocFailed ) r
0f30: 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 50 61  eturn;.  if( pPa
0f40: 72 73 65 2d 3e 6e 65 73 74 65 64 20 29 20 72 65  rse->nested ) re
0f50: 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 50 61 72  turn;.  if( pPar
0f60: 73 65 2d 3e 6e 45 72 72 20 29 20 72 65 74 75 72  se->nErr ) retur
0f70: 6e 3b 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20 62  n;..  /* Begin b
0f80: 79 20 67 65 6e 65 72 61 74 69 6e 67 20 73 6f 6d  y generating som
0f90: 65 20 74 65 72 6d 69 6e 61 74 69 6f 6e 20 63 6f  e termination co
0fa0: 64 65 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66  de at the end of
0fb0: 20 74 68 65 0a 20 20 2a 2a 20 76 64 62 65 20 70   the.  ** vdbe p
0fc0: 72 6f 67 72 61 6d 0a 20 20 2a 2f 0a 20 20 76 20  rogram.  */.  v 
0fd0: 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
0fe0: 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20  (pParse);.  if( 
0ff0: 76 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  v ){.    sqlite3
1000: 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50  VdbeAddOp0(v, OP
1010: 5f 48 61 6c 74 29 3b 0a 0a 20 20 20 20 2f 2a 20  _Halt);..    /* 
1020: 54 68 65 20 63 6f 6f 6b 69 65 20 6d 61 73 6b 20  The cookie mask 
1030: 63 6f 6e 74 61 69 6e 73 20 6f 6e 65 20 62 69 74  contains one bit
1040: 20 66 6f 72 20 65 61 63 68 20 64 61 74 61 62 61   for each databa
1050: 73 65 20 66 69 6c 65 20 6f 70 65 6e 2e 0a 20 20  se file open..  
1060: 20 20 2a 2a 20 28 42 69 74 20 30 20 69 73 20 66    ** (Bit 0 is f
1070: 6f 72 20 6d 61 69 6e 2c 20 62 69 74 20 31 20 69  or main, bit 1 i
1080: 73 20 66 6f 72 20 74 65 6d 70 2c 20 61 6e 64 20  s for temp, and 
1090: 73 6f 20 66 6f 72 74 68 2e 29 20 20 42 69 74 73  so forth.)  Bits
10a0: 20 61 72 65 0a 20 20 20 20 2a 2a 20 73 65 74 20   are.    ** set 
10b0: 66 6f 72 20 65 61 63 68 20 64 61 74 61 62 61 73  for each databas
10c0: 65 20 74 68 61 74 20 69 73 20 75 73 65 64 2e 20  e that is used. 
10d0: 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
10e0: 6f 20 73 74 61 72 74 20 61 0a 20 20 20 20 2a 2a  o start a.    **
10f0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20   transaction on 
1100: 65 61 63 68 20 75 73 65 64 20 64 61 74 61 62 61  each used databa
1110: 73 65 20 61 6e 64 20 74 6f 20 76 65 72 69 66 79  se and to verify
1120: 20 74 68 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b   the schema cook
1130: 69 65 0a 20 20 20 20 2a 2a 20 6f 6e 20 65 61 63  ie.    ** on eac
1140: 68 20 75 73 65 64 20 64 61 74 61 62 61 73 65 2e  h used database.
1150: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
1160: 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 47 6f  pParse->cookieGo
1170: 74 6f 3e 30 20 29 7b 0a 20 20 20 20 20 20 75 33  to>0 ){.      u3
1180: 32 20 6d 61 73 6b 3b 0a 20 20 20 20 20 20 69 6e  2 mask;.      in
1190: 74 20 69 44 62 3b 0a 20 20 20 20 20 20 73 71 6c  t iDb;.      sql
11a0: 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
11b0: 28 76 2c 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b  (v, pParse->cook
11c0: 69 65 47 6f 74 6f 2d 31 29 3b 0a 20 20 20 20 20  ieGoto-1);.     
11d0: 20 66 6f 72 28 69 44 62 3d 30 2c 20 6d 61 73 6b   for(iDb=0, mask
11e0: 3d 31 3b 20 69 44 62 3c 64 62 2d 3e 6e 44 62 3b  =1; iDb<db->nDb;
11f0: 20 6d 61 73 6b 3c 3c 3d 31 2c 20 69 44 62 2b 2b   mask<<=1, iDb++
1200: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28  ){.        if( (
1210: 6d 61 73 6b 20 26 20 70 50 61 72 73 65 2d 3e 63  mask & pParse->c
1220: 6f 6f 6b 69 65 4d 61 73 6b 29 3d 3d 30 20 29 20  ookieMask)==0 ) 
1230: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
1240: 20 20 73 71 6c 69 74 65 33 56 64 62 65 55 73 65    sqlite3VdbeUse
1250: 73 42 74 72 65 65 28 76 2c 20 69 44 62 29 3b 0a  sBtree(v, iDb);.
1260: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
1270: 64 62 65 41 64 64 4f 70 32 28 76 2c 4f 50 5f 54  dbeAddOp2(v,OP_T
1280: 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69 44 62 2c  ransaction, iDb,
1290: 20 28 6d 61 73 6b 20 26 20 70 50 61 72 73 65 2d   (mask & pParse-
12a0: 3e 77 72 69 74 65 4d 61 73 6b 29 21 3d 30 29 3b  >writeMask)!=0);
12b0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
12c0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 4f 50 5f  VdbeAddOp2(v,OP_
12d0: 56 65 72 69 66 79 43 6f 6f 6b 69 65 2c 20 69 44  VerifyCookie, iD
12e0: 62 2c 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69  b, pParse->cooki
12f0: 65 56 61 6c 75 65 5b 69 44 62 5d 29 3b 0a 20 20  eValue[iDb]);.  
1300: 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51      }.#ifndef SQ
1310: 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
1320: 4c 54 41 42 4c 45 0a 20 20 20 20 20 20 7b 0a 20  LTABLE.      {. 
1330: 20 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20         int i;.  
1340: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
1350: 3c 70 50 61 72 73 65 2d 3e 6e 56 74 61 62 4c 6f  <pParse->nVtabLo
1360: 63 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ck; i++){.      
1370: 20 20 20 20 63 68 61 72 20 2a 76 74 61 62 20 3d      char *vtab =
1380: 20 28 63 68 61 72 20 2a 29 70 50 61 72 73 65 2d   (char *)pParse-
1390: 3e 61 70 56 74 61 62 4c 6f 63 6b 5b 69 5d 2d 3e  >apVtabLock[i]->
13a0: 70 56 74 61 62 3b 0a 20 20 20 20 20 20 20 20 20  pVtab;.         
13b0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
13c0: 70 34 28 76 2c 20 4f 50 5f 56 42 65 67 69 6e 2c  p4(v, OP_VBegin,
13d0: 20 30 2c 20 30 2c 20 30 2c 20 76 74 61 62 2c 20   0, 0, 0, vtab, 
13e0: 50 34 5f 56 54 41 42 29 3b 0a 20 20 20 20 20 20  P4_VTAB);.      
13f0: 20 20 7d 0a 20 20 20 20 20 20 20 20 70 50 61 72    }.        pPar
1400: 73 65 2d 3e 6e 56 74 61 62 4c 6f 63 6b 20 3d 20  se->nVtabLock = 
1410: 30 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  0;.      }.#endi
1420: 66 0a 0a 20 20 20 20 20 20 2f 2a 20 4f 6e 63 65  f..      /* Once
1430: 20 61 6c 6c 20 74 68 65 20 63 6f 6f 6b 69 65 73   all the cookies
1440: 20 68 61 76 65 20 62 65 65 6e 20 76 65 72 69 66   have been verif
1450: 69 65 64 20 61 6e 64 20 74 72 61 6e 73 61 63 74  ied and transact
1460: 69 6f 6e 73 20 6f 70 65 6e 65 64 2c 20 0a 20 20  ions opened, .  
1470: 20 20 20 20 2a 2a 20 6f 62 74 61 69 6e 20 74 68      ** obtain th
1480: 65 20 72 65 71 75 69 72 65 64 20 74 61 62 6c 65  e required table
1490: 2d 6c 6f 63 6b 73 2e 20 54 68 69 73 20 69 73 20  -locks. This is 
14a0: 61 20 6e 6f 2d 6f 70 20 75 6e 6c 65 73 73 20 74  a no-op unless t
14b0: 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 73 68 61  he .      ** sha
14c0: 72 65 64 2d 63 61 63 68 65 20 66 65 61 74 75 72  red-cache featur
14d0: 65 20 69 73 20 65 6e 61 62 6c 65 64 2e 0a 20 20  e is enabled..  
14e0: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 63 6f 64      */.      cod
14f0: 65 54 61 62 6c 65 4c 6f 63 6b 73 28 70 50 61 72  eTableLocks(pPar
1500: 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  se);.      sqlit
1510: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1520: 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 70 50 61 72  OP_Goto, 0, pPar
1530: 73 65 2d 3e 63 6f 6f 6b 69 65 47 6f 74 6f 29 3b  se->cookieGoto);
1540: 0a 20 20 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20  .    }..#ifndef 
1550: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43  SQLITE_OMIT_TRAC
1560: 45 0a 20 20 20 20 69 66 28 20 21 64 62 2d 3e 69  E.    if( !db->i
1570: 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20 20 20 20  nit.busy ){.    
1580: 20 20 2f 2a 20 43 68 61 6e 67 65 20 74 68 65 20    /* Change the 
1590: 50 34 20 61 72 67 75 6d 65 6e 74 20 6f 66 20 74  P4 argument of t
15a0: 68 65 20 66 69 72 73 74 20 6f 70 63 6f 64 65 20  he first opcode 
15b0: 28 77 68 69 63 68 20 77 69 6c 6c 20 61 6c 77 61  (which will alwa
15c0: 79 73 20 62 65 0a 20 20 20 20 20 20 2a 2a 20 61  ys be.      ** a
15d0: 6e 20 4f 50 5f 54 72 61 63 65 29 20 74 6f 20 62  n OP_Trace) to b
15e0: 65 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 74  e the complete t
15f0: 65 78 74 20 6f 66 20 74 68 65 20 63 75 72 72 65  ext of the curre
1600: 6e 74 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  nt SQL statement
1610: 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
1620: 20 56 64 62 65 4f 70 20 2a 70 4f 70 20 3d 20 73   VdbeOp *pOp = s
1630: 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70 28  qlite3VdbeGetOp(
1640: 76 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28  v, 0);.      if(
1650: 20 70 4f 70 20 26 26 20 70 4f 70 2d 3e 6f 70 63   pOp && pOp->opc
1660: 6f 64 65 3d 3d 4f 50 5f 54 72 61 63 65 20 29 7b  ode==OP_Trace ){
1670: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1680: 56 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20  VdbeChangeP4(v, 
1690: 30 2c 20 70 50 61 72 73 65 2d 3e 7a 53 71 6c 2c  0, pParse->zSql,
16a0: 20 70 50 61 72 73 65 2d 3e 7a 54 61 69 6c 2d 70   pParse->zTail-p
16b0: 50 61 72 73 65 2d 3e 7a 53 71 6c 29 3b 0a 20 20  Parse->zSql);.  
16c0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64      }.    }.#end
16d0: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
16e0: 54 5f 54 52 41 43 45 20 2a 2f 0a 20 20 7d 0a 0a  T_TRACE */.  }..
16f0: 0a 20 20 2f 2a 20 47 65 74 20 74 68 65 20 56 44  .  /* Get the VD
1700: 42 45 20 70 72 6f 67 72 61 6d 20 72 65 61 64 79  BE program ready
1710: 20 66 6f 72 20 65 78 65 63 75 74 69 6f 6e 0a 20   for execution. 
1720: 20 2a 2f 0a 20 20 69 66 28 20 76 20 26 26 20 70   */.  if( v && p
1730: 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 26  Parse->nErr==0 &
1740: 26 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  & !db->mallocFai
1750: 6c 65 64 20 29 7b 0a 23 69 66 64 65 66 20 53 51  led ){.#ifdef SQ
1760: 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20 46  LITE_DEBUG.    F
1770: 49 4c 45 20 2a 74 72 61 63 65 20 3d 20 28 64 62  ILE *trace = (db
1780: 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ->flags & SQLITE
1790: 5f 56 64 62 65 54 72 61 63 65 29 21 3d 30 20 3f  _VdbeTrace)!=0 ?
17a0: 20 73 74 64 6f 75 74 20 3a 20 30 3b 0a 20 20 20   stdout : 0;.   
17b0: 20 73 71 6c 69 74 65 33 56 64 62 65 54 72 61 63   sqlite3VdbeTrac
17c0: 65 28 76 2c 20 74 72 61 63 65 29 3b 0a 23 65 6e  e(v, trace);.#en
17d0: 64 69 66 0a 20 20 20 20 61 73 73 65 72 74 28 20  dif.    assert( 
17e0: 70 50 61 72 73 65 2d 3e 64 69 73 61 62 6c 65 43  pParse->disableC
17f0: 6f 6c 43 61 63 68 65 3d 3d 30 20 29 3b 20 20 2f  olCache==0 );  /
1800: 2a 20 44 69 73 61 62 6c 65 73 20 61 6e 64 20 72  * Disables and r
1810: 65 2d 65 6e 61 62 6c 65 73 20 6d 61 74 63 68 20  e-enables match 
1820: 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  */.    sqlite3Vd
1830: 62 65 4d 61 6b 65 52 65 61 64 79 28 76 2c 20 70  beMakeReady(v, p
1840: 50 61 72 73 65 2d 3e 6e 56 61 72 2c 20 70 50 61  Parse->nVar, pPa
1850: 72 73 65 2d 3e 6e 4d 65 6d 2b 33 2c 0a 20 20 20  rse->nMem+3,.   
1860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1870: 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 54        pParse->nT
1880: 61 62 2b 33 2c 20 70 50 61 72 73 65 2d 3e 65 78  ab+3, pParse->ex
1890: 70 6c 61 69 6e 29 3b 0a 20 20 20 20 70 50 61 72  plain);.    pPar
18a0: 73 65 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f  se->rc = SQLITE_
18b0: 44 4f 4e 45 3b 0a 20 20 20 20 70 50 61 72 73 65  DONE;.    pParse
18c0: 2d 3e 63 6f 6c 4e 61 6d 65 73 53 65 74 20 3d 20  ->colNamesSet = 
18d0: 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  0;.  }else if( p
18e0: 50 61 72 73 65 2d 3e 72 63 3d 3d 53 51 4c 49 54  Parse->rc==SQLIT
18f0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 50 61 72  E_OK ){.    pPar
1900: 73 65 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f  se->rc = SQLITE_
1910: 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 70 50 61  ERROR;.  }.  pPa
1920: 72 73 65 2d 3e 6e 54 61 62 20 3d 20 30 3b 0a 20  rse->nTab = 0;. 
1930: 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 3d 20   pParse->nMem = 
1940: 30 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 53 65  0;.  pParse->nSe
1950: 74 20 3d 20 30 3b 0a 20 20 70 50 61 72 73 65 2d  t = 0;.  pParse-
1960: 3e 6e 56 61 72 20 3d 20 30 3b 0a 20 20 70 50 61  >nVar = 0;.  pPa
1970: 72 73 65 2d 3e 63 6f 6f 6b 69 65 4d 61 73 6b 20  rse->cookieMask 
1980: 3d 20 30 3b 0a 20 20 70 50 61 72 73 65 2d 3e 63  = 0;.  pParse->c
1990: 6f 6f 6b 69 65 47 6f 74 6f 20 3d 20 30 3b 0a 7d  ookieGoto = 0;.}
19a0: 0a 0a 2f 2a 0a 2a 2a 20 52 75 6e 20 74 68 65 20  ../*.** Run the 
19b0: 70 61 72 73 65 72 20 61 6e 64 20 63 6f 64 65 20  parser and code 
19c0: 67 65 6e 65 72 61 74 6f 72 20 72 65 63 75 72 73  generator recurs
19d0: 69 76 65 6c 79 20 69 6e 20 6f 72 64 65 72 20 74  ively in order t
19e0: 6f 20 67 65 6e 65 72 61 74 65 0a 2a 2a 20 63 6f  o generate.** co
19f0: 64 65 20 66 6f 72 20 74 68 65 20 53 51 4c 20 73  de for the SQL s
1a00: 74 61 74 65 6d 65 6e 74 20 67 69 76 65 6e 20 6f  tatement given o
1a10: 6e 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74  nto the end of t
1a20: 68 65 20 70 50 61 72 73 65 20 63 6f 6e 74 65 78  he pParse contex
1a30: 74 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 75  t.** currently u
1a40: 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f  nder constructio
1a50: 6e 2e 20 20 57 68 65 6e 20 74 68 65 20 70 61 72  n.  When the par
1a60: 73 65 72 20 69 73 20 72 75 6e 20 72 65 63 75 72  ser is run recur
1a70: 73 69 76 65 6c 79 0a 2a 2a 20 74 68 69 73 20 77  sively.** this w
1a80: 61 79 2c 20 74 68 65 20 66 69 6e 61 6c 20 4f 50  ay, the final OP
1a90: 5f 48 61 6c 74 20 69 73 20 6e 6f 74 20 61 70 70  _Halt is not app
1aa0: 65 6e 64 65 64 20 61 6e 64 20 6f 74 68 65 72 20  ended and other 
1ab0: 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 0a 2a  initialization.*
1ac0: 2a 20 61 6e 64 20 66 69 6e 61 6c 69 7a 61 74 69  * and finalizati
1ad0: 6f 6e 20 73 74 65 70 73 20 61 72 65 20 6f 6d 69  on steps are omi
1ae0: 74 74 65 64 20 62 65 63 61 75 73 65 20 74 68 6f  tted because tho
1af0: 73 65 20 61 72 65 20 68 61 6e 64 6c 69 6e 67 20  se are handling 
1b00: 62 79 20 74 68 65 0a 2a 2a 20 6f 75 74 65 72 6d  by the.** outerm
1b10: 6f 73 74 20 70 61 72 73 65 72 2e 0a 2a 2a 0a 2a  ost parser..**.*
1b20: 2a 20 4e 6f 74 20 65 76 65 72 79 74 68 69 6e 67  * Not everything
1b30: 20 69 73 20 6e 65 73 74 61 62 6c 65 2e 20 20 54   is nestable.  T
1b40: 68 69 73 20 66 61 63 69 6c 69 74 79 20 69 73 20  his facility is 
1b50: 64 65 73 69 67 6e 65 64 20 74 6f 20 70 65 72 6d  designed to perm
1b60: 69 74 0a 2a 2a 20 49 4e 53 45 52 54 2c 20 55 50  it.** INSERT, UP
1b70: 44 41 54 45 2c 20 61 6e 64 20 44 45 4c 45 54 45  DATE, and DELETE
1b80: 20 6f 70 65 72 61 74 69 6f 6e 73 20 61 67 61 69   operations agai
1b90: 6e 73 74 20 53 51 4c 49 54 45 5f 4d 41 53 54 45  nst SQLITE_MASTE
1ba0: 52 2e 20 20 55 73 65 0a 2a 2a 20 63 61 72 65 20  R.  Use.** care 
1bb0: 69 66 20 79 6f 75 20 64 65 63 69 64 65 20 74 6f  if you decide to
1bc0: 20 74 72 79 20 74 6f 20 75 73 65 20 74 68 69 73   try to use this
1bd0: 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 73 6f 6d   routine for som
1be0: 65 20 6f 74 68 65 72 20 70 75 72 70 6f 73 65 73  e other purposes
1bf0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
1c00: 33 4e 65 73 74 65 64 50 61 72 73 65 28 50 61 72  3NestedParse(Par
1c10: 73 65 20 2a 70 50 61 72 73 65 2c 20 63 6f 6e 73  se *pParse, cons
1c20: 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c  t char *zFormat,
1c30: 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74   ...){.  va_list
1c40: 20 61 70 3b 0a 20 20 63 68 61 72 20 2a 7a 53 71   ap;.  char *zSq
1c50: 6c 3b 0a 20 20 63 68 61 72 20 2a 7a 45 72 72 4d  l;.  char *zErrM
1c60: 73 67 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65  sg = 0;.  sqlite
1c70: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
1c80: 64 62 3b 0a 23 20 64 65 66 69 6e 65 20 53 41 56  db;.# define SAV
1c90: 45 5f 53 5a 20 20 28 73 69 7a 65 6f 66 28 50 61  E_SZ  (sizeof(Pa
1ca0: 72 73 65 29 20 2d 20 6f 66 66 73 65 74 6f 66 28  rse) - offsetof(
1cb0: 50 61 72 73 65 2c 6e 56 61 72 29 29 0a 20 20 63  Parse,nVar)).  c
1cc0: 68 61 72 20 73 61 76 65 42 75 66 5b 53 41 56 45  har saveBuf[SAVE
1cd0: 5f 53 5a 5d 3b 0a 0a 20 20 69 66 28 20 70 50 61  _SZ];..  if( pPa
1ce0: 72 73 65 2d 3e 6e 45 72 72 20 29 20 72 65 74 75  rse->nErr ) retu
1cf0: 72 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  rn;.  assert( pP
1d00: 61 72 73 65 2d 3e 6e 65 73 74 65 64 3c 31 30 20  arse->nested<10 
1d10: 29 3b 20 20 2f 2a 20 4e 65 73 74 69 6e 67 20 73  );  /* Nesting s
1d20: 68 6f 75 6c 64 20 6f 6e 6c 79 20 62 65 20 6f 66  hould only be of
1d30: 20 6c 69 6d 69 74 65 64 20 64 65 70 74 68 20 2a   limited depth *
1d40: 2f 0a 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c  /.  va_start(ap,
1d50: 20 7a 46 6f 72 6d 61 74 29 3b 0a 20 20 7a 53 71   zFormat);.  zSq
1d60: 6c 20 3d 20 73 71 6c 69 74 65 33 56 4d 50 72 69  l = sqlite3VMPri
1d70: 6e 74 66 28 64 62 2c 20 7a 46 6f 72 6d 61 74 2c  ntf(db, zFormat,
1d80: 20 61 70 29 3b 0a 20 20 76 61 5f 65 6e 64 28 61   ap);.  va_end(a
1d90: 70 29 3b 0a 20 20 69 66 28 20 7a 53 71 6c 3d 3d  p);.  if( zSql==
1da0: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b  0 ){.    return;
1db0: 20 20 20 2f 2a 20 41 20 6d 61 6c 6c 6f 63 20 6d     /* A malloc m
1dc0: 75 73 74 20 68 61 76 65 20 66 61 69 6c 65 64 20  ust have failed 
1dd0: 2a 2f 0a 20 20 7d 0a 20 20 70 50 61 72 73 65 2d  */.  }.  pParse-
1de0: 3e 6e 65 73 74 65 64 2b 2b 3b 0a 20 20 6d 65 6d  >nested++;.  mem
1df0: 63 70 79 28 73 61 76 65 42 75 66 2c 20 26 70 50  cpy(saveBuf, &pP
1e00: 61 72 73 65 2d 3e 6e 56 61 72 2c 20 53 41 56 45  arse->nVar, SAVE
1e10: 5f 53 5a 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26  _SZ);.  memset(&
1e20: 70 50 61 72 73 65 2d 3e 6e 56 61 72 2c 20 30 2c  pParse->nVar, 0,
1e30: 20 53 41 56 45 5f 53 5a 29 3b 0a 20 20 73 71 6c   SAVE_SZ);.  sql
1e40: 69 74 65 33 52 75 6e 50 61 72 73 65 72 28 70 50  ite3RunParser(pP
1e50: 61 72 73 65 2c 20 7a 53 71 6c 2c 20 26 7a 45 72  arse, zSql, &zEr
1e60: 72 4d 73 67 29 3b 0a 20 20 73 71 6c 69 74 65 33  rMsg);.  sqlite3
1e70: 44 62 46 72 65 65 28 64 62 2c 20 7a 45 72 72 4d  DbFree(db, zErrM
1e80: 73 67 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62  sg);.  sqlite3Db
1e90: 46 72 65 65 28 64 62 2c 20 7a 53 71 6c 29 3b 0a  Free(db, zSql);.
1ea0: 20 20 6d 65 6d 63 70 79 28 26 70 50 61 72 73 65    memcpy(&pParse
1eb0: 2d 3e 6e 56 61 72 2c 20 73 61 76 65 42 75 66 2c  ->nVar, saveBuf,
1ec0: 20 53 41 56 45 5f 53 5a 29 3b 0a 20 20 70 50 61   SAVE_SZ);.  pPa
1ed0: 72 73 65 2d 3e 6e 65 73 74 65 64 2d 2d 3b 0a 7d  rse->nested--;.}
1ee0: 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61 74 65 20 74  ../*.** Locate t
1ef0: 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 73 74 72  he in-memory str
1f00: 75 63 74 75 72 65 20 74 68 61 74 20 64 65 73 63  ucture that desc
1f10: 72 69 62 65 73 20 61 20 70 61 72 74 69 63 75 6c  ribes a particul
1f20: 61 72 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 74  ar database.** t
1f30: 61 62 6c 65 20 67 69 76 65 6e 20 74 68 65 20 6e  able given the n
1f40: 61 6d 65 20 6f 66 20 74 68 61 74 20 74 61 62 6c  ame of that tabl
1f50: 65 20 61 6e 64 20 28 6f 70 74 69 6f 6e 61 6c 6c  e and (optionall
1f60: 79 29 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  y) the name of t
1f70: 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 63  he.** database c
1f80: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 74 61  ontaining the ta
1f90: 62 6c 65 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c  ble.  Return NUL
1fa0: 4c 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a  L if not found..
1fb0: 2a 2a 0a 2a 2a 20 49 66 20 7a 44 61 74 61 62 61  **.** If zDataba
1fc0: 73 65 20 69 73 20 30 2c 20 61 6c 6c 20 64 61 74  se is 0, all dat
1fd0: 61 62 61 73 65 73 20 61 72 65 20 73 65 61 72 63  abases are searc
1fe0: 68 65 64 20 66 6f 72 20 74 68 65 20 74 61 62 6c  hed for the tabl
1ff0: 65 20 61 6e 64 20 74 68 65 0a 2a 2a 20 66 69 72  e and the.** fir
2000: 73 74 20 6d 61 74 63 68 69 6e 67 20 74 61 62 6c  st matching tabl
2010: 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 20  e is returned.  
2020: 28 4e 6f 20 63 68 65 63 6b 69 6e 67 20 66 6f 72  (No checking for
2030: 20 64 75 70 6c 69 63 61 74 65 20 74 61 62 6c 65   duplicate table
2040: 0a 2a 2a 20 6e 61 6d 65 73 20 69 73 20 64 6f 6e  .** names is don
2050: 65 2e 29 20 20 54 68 65 20 73 65 61 72 63 68 20  e.)  The search 
2060: 6f 72 64 65 72 20 69 73 20 54 45 4d 50 20 66 69  order is TEMP fi
2070: 72 73 74 2c 20 74 68 65 6e 20 4d 41 49 4e 2c 20  rst, then MAIN, 
2080: 74 68 65 6e 20 61 6e 79 0a 2a 2a 20 61 75 78 69  then any.** auxi
2090: 6c 69 61 72 79 20 64 61 74 61 62 61 73 65 73 20  liary databases 
20a0: 61 64 64 65 64 20 75 73 69 6e 67 20 74 68 65 20  added using the 
20b0: 41 54 54 41 43 48 20 63 6f 6d 6d 61 6e 64 2e 0a  ATTACH command..
20c0: 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20 73  **.** See also s
20d0: 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62 6c  qlite3LocateTabl
20e0: 65 28 29 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a 73  e()..*/.Table *s
20f0: 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28  qlite3FindTable(
2100: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e  sqlite3 *db, con
2110: 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20  st char *zName, 
2120: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 61 74  const char *zDat
2130: 61 62 61 73 65 29 7b 0a 20 20 54 61 62 6c 65 20  abase){.  Table 
2140: 2a 70 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b  *p = 0;.  int i;
2150: 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 3b 0a 20 20  .  int nName;.  
2160: 61 73 73 65 72 74 28 20 7a 4e 61 6d 65 21 3d 30  assert( zName!=0
2170: 20 29 3b 0a 20 20 6e 4e 61 6d 65 20 3d 20 73 71   );.  nName = sq
2180: 6c 69 74 65 33 53 74 72 6c 65 6e 28 64 62 2c 20  lite3Strlen(db, 
2190: 7a 4e 61 6d 65 29 20 2b 20 31 3b 0a 20 20 66 6f  zName) + 1;.  fo
21a0: 72 28 69 3d 4f 4d 49 54 5f 54 45 4d 50 44 42 3b  r(i=OMIT_TEMPDB;
21b0: 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29   i<db->nDb; i++)
21c0: 7b 0a 20 20 20 20 69 6e 74 20 6a 20 3d 20 28 69  {.    int j = (i
21d0: 3c 32 29 20 3f 20 69 5e 31 20 3a 20 69 3b 20 20  <2) ? i^1 : i;  
21e0: 20 2f 2a 20 53 65 61 72 63 68 20 54 45 4d 50 20   /* Search TEMP 
21f0: 62 65 66 6f 72 65 20 4d 41 49 4e 20 2a 2f 0a 20  before MAIN */. 
2200: 20 20 20 69 66 28 20 7a 44 61 74 61 62 61 73 65     if( zDatabase
2210: 21 3d 30 20 26 26 20 73 71 6c 69 74 65 33 53 74  !=0 && sqlite3St
2220: 72 49 43 6d 70 28 7a 44 61 74 61 62 61 73 65 2c  rICmp(zDatabase,
2230: 20 64 62 2d 3e 61 44 62 5b 6a 5d 2e 7a 4e 61 6d   db->aDb[j].zNam
2240: 65 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  e) ) continue;. 
2250: 20 20 20 70 20 3d 20 73 71 6c 69 74 65 33 48 61     p = sqlite3Ha
2260: 73 68 46 69 6e 64 28 26 64 62 2d 3e 61 44 62 5b  shFind(&db->aDb[
2270: 6a 5d 2e 70 53 63 68 65 6d 61 2d 3e 74 62 6c 48  j].pSchema->tblH
2280: 61 73 68 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61 6d  ash, zName, nNam
2290: 65 29 3b 0a 20 20 20 20 69 66 28 20 70 20 29 20  e);.    if( p ) 
22a0: 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74  break;.  }.  ret
22b0: 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn p;.}../*.** 
22c0: 4c 6f 63 61 74 65 20 74 68 65 20 69 6e 2d 6d 65  Locate the in-me
22d0: 6d 6f 72 79 20 73 74 72 75 63 74 75 72 65 20 74  mory structure t
22e0: 68 61 74 20 64 65 73 63 72 69 62 65 73 20 61 20  hat describes a 
22f0: 70 61 72 74 69 63 75 6c 61 72 20 64 61 74 61 62  particular datab
2300: 61 73 65 0a 2a 2a 20 74 61 62 6c 65 20 67 69 76  ase.** table giv
2310: 65 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  en the name of t
2320: 68 61 74 20 74 61 62 6c 65 20 61 6e 64 20 28 6f  hat table and (o
2330: 70 74 69 6f 6e 61 6c 6c 79 29 20 74 68 65 20 6e  ptionally) the n
2340: 61 6d 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61  ame of the.** da
2350: 74 61 62 61 73 65 20 63 6f 6e 74 61 69 6e 69 6e  tabase containin
2360: 67 20 74 68 65 20 74 61 62 6c 65 2e 20 20 52 65  g the table.  Re
2370: 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 6e 6f 74  turn NULL if not
2380: 20 66 6f 75 6e 64 2e 20 20 41 6c 73 6f 20 6c 65   found.  Also le
2390: 61 76 65 20 61 6e 0a 2a 2a 20 65 72 72 6f 72 20  ave an.** error 
23a0: 6d 65 73 73 61 67 65 20 69 6e 20 70 50 61 72 73  message in pPars
23b0: 65 2d 3e 7a 45 72 72 4d 73 67 2e 0a 2a 2a 0a 2a  e->zErrMsg..**.*
23c0: 2a 20 54 68 65 20 64 69 66 66 65 72 65 6e 63 65  * The difference
23d0: 20 62 65 74 77 65 65 6e 20 74 68 69 73 20 72 6f   between this ro
23e0: 75 74 69 6e 65 20 61 6e 64 20 73 71 6c 69 74 65  utine and sqlite
23f0: 33 46 69 6e 64 54 61 62 6c 65 28 29 20 69 73 20  3FindTable() is 
2400: 74 68 61 74 20 74 68 69 73 0a 2a 2a 20 72 6f 75  that this.** rou
2410: 74 69 6e 65 20 6c 65 61 76 65 73 20 61 6e 20 65  tine leaves an e
2420: 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e 20  rror message in 
2430: 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 20  pParse->zErrMsg 
2440: 77 68 65 72 65 0a 2a 2a 20 73 71 6c 69 74 65 33  where.** sqlite3
2450: 46 69 6e 64 54 61 62 6c 65 28 29 20 64 6f 65 73  FindTable() does
2460: 20 6e 6f 74 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a   not..*/.Table *
2470: 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62  sqlite3LocateTab
2480: 6c 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  le(.  Parse *pPa
2490: 72 73 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  rse,         /* 
24a0: 63 6f 6e 74 65 78 74 20 69 6e 20 77 68 69 63 68  context in which
24b0: 20 74 6f 20 72 65 70 6f 72 74 20 65 72 72 6f 72   to report error
24c0: 73 20 2a 2f 0a 20 20 69 6e 74 20 69 73 56 69 65  s */.  int isVie
24d0: 77 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  w,            /*
24e0: 20 54 72 75 65 20 69 66 20 6c 6f 6f 6b 69 6e 67   True if looking
24f0: 20 66 6f 72 20 61 20 56 49 45 57 20 72 61 74 68   for a VIEW rath
2500: 65 72 20 74 68 61 6e 20 61 20 54 41 42 4c 45 20  er than a TABLE 
2510: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
2520: 2a 7a 4e 61 6d 65 2c 20 20 20 20 20 2f 2a 20 4e  *zName,     /* N
2530: 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65  ame of the table
2540: 20 77 65 20 61 72 65 20 6c 6f 6f 6b 69 6e 67 20   we are looking 
2550: 66 6f 72 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  for */.  const c
2560: 68 61 72 20 2a 7a 44 62 61 73 65 20 20 20 20 20  har *zDbase     
2570: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64  /* Name of the d
2580: 61 74 61 62 61 73 65 2e 20 20 4d 69 67 68 74 20  atabase.  Might 
2590: 62 65 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20  be NULL */.){.  
25a0: 54 61 62 6c 65 20 2a 70 3b 0a 0a 20 20 2f 2a 20  Table *p;..  /* 
25b0: 52 65 61 64 20 74 68 65 20 64 61 74 61 62 61 73  Read the databas
25c0: 65 20 73 63 68 65 6d 61 2e 20 49 66 20 61 6e 20  e schema. If an 
25d0: 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 6c 65  error occurs, le
25e0: 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73  ave an error mes
25f0: 73 61 67 65 0a 20 20 2a 2a 20 61 6e 64 20 63 6f  sage.  ** and co
2600: 64 65 20 69 6e 20 70 50 61 72 73 65 20 61 6e 64  de in pParse and
2610: 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 20 2a 2f   return NULL. */
2620: 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b  .  if( SQLITE_OK
2630: 21 3d 73 71 6c 69 74 65 33 52 65 61 64 53 63 68  !=sqlite3ReadSch
2640: 65 6d 61 28 70 50 61 72 73 65 29 20 29 7b 0a 20  ema(pParse) ){. 
2650: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
2660: 0a 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 46  ..  p = sqlite3F
2670: 69 6e 64 54 61 62 6c 65 28 70 50 61 72 73 65 2d  indTable(pParse-
2680: 3e 64 62 2c 20 7a 4e 61 6d 65 2c 20 7a 44 62 61  >db, zName, zDba
2690: 73 65 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20  se);.  if( p==0 
26a0: 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  ){.    const cha
26b0: 72 20 2a 7a 4d 73 67 20 3d 20 69 73 56 69 65 77  r *zMsg = isView
26c0: 20 3f 20 22 6e 6f 20 73 75 63 68 20 76 69 65 77   ? "no such view
26d0: 22 20 3a 20 22 6e 6f 20 73 75 63 68 20 74 61 62  " : "no such tab
26e0: 6c 65 22 3b 0a 20 20 20 20 69 66 28 20 7a 44 62  le";.    if( zDb
26f0: 61 73 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ase ){.      sql
2700: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
2710: 72 73 65 2c 20 22 25 73 3a 20 25 73 2e 25 73 22  rse, "%s: %s.%s"
2720: 2c 20 7a 4d 73 67 2c 20 7a 44 62 61 73 65 2c 20  , zMsg, zDbase, 
2730: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 65 6c 73  zName);.    }els
2740: 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e{.      sqlite3
2750: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
2760: 20 22 25 73 3a 20 25 73 22 2c 20 7a 4d 73 67 2c   "%s: %s", zMsg,
2770: 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20   zName);.    }. 
2780: 20 20 20 70 50 61 72 73 65 2d 3e 63 68 65 63 6b     pParse->check
2790: 53 63 68 65 6d 61 20 3d 20 31 3b 0a 20 20 7d 0a  Schema = 1;.  }.
27a0: 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f    return p;.}../
27b0: 2a 0a 2a 2a 20 4c 6f 63 61 74 65 20 74 68 65 20  *.** Locate the 
27c0: 69 6e 2d 6d 65 6d 6f 72 79 20 73 74 72 75 63 74  in-memory struct
27d0: 75 72 65 20 74 68 61 74 20 64 65 73 63 72 69 62  ure that describ
27e0: 65 73 20 0a 2a 2a 20 61 20 70 61 72 74 69 63 75  es .** a particu
27f0: 6c 61 72 20 69 6e 64 65 78 20 67 69 76 65 6e 20  lar index given 
2800: 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 61 74  the name of that
2810: 20 69 6e 64 65 78 0a 2a 2a 20 61 6e 64 20 74 68   index.** and th
2820: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 61  e name of the da
2830: 74 61 62 61 73 65 20 74 68 61 74 20 63 6f 6e 74  tabase that cont
2840: 61 69 6e 73 20 74 68 65 20 69 6e 64 65 78 2e 0a  ains the index..
2850: 2a 2a 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69  ** Return NULL i
2860: 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2a 0a  f not found..**.
2870: 2a 2a 20 49 66 20 7a 44 61 74 61 62 61 73 65 20  ** If zDatabase 
2880: 69 73 20 30 2c 20 61 6c 6c 20 64 61 74 61 62 61  is 0, all databa
2890: 73 65 73 20 61 72 65 20 73 65 61 72 63 68 65 64  ses are searched
28a0: 20 66 6f 72 20 74 68 65 0a 2a 2a 20 74 61 62 6c   for the.** tabl
28b0: 65 20 61 6e 64 20 74 68 65 20 66 69 72 73 74 20  e and the first 
28c0: 6d 61 74 63 68 69 6e 67 20 69 6e 64 65 78 20 69  matching index i
28d0: 73 20 72 65 74 75 72 6e 65 64 2e 20 20 28 4e 6f  s returned.  (No
28e0: 20 63 68 65 63 6b 69 6e 67 0a 2a 2a 20 66 6f 72   checking.** for
28f0: 20 64 75 70 6c 69 63 61 74 65 20 69 6e 64 65 78   duplicate index
2900: 20 6e 61 6d 65 73 20 69 73 20 64 6f 6e 65 2e 29   names is done.)
2910: 20 20 54 68 65 20 73 65 61 72 63 68 20 6f 72 64    The search ord
2920: 65 72 20 69 73 0a 2a 2a 20 54 45 4d 50 20 66 69  er is.** TEMP fi
2930: 72 73 74 2c 20 74 68 65 6e 20 4d 41 49 4e 2c 20  rst, then MAIN, 
2940: 74 68 65 6e 20 61 6e 79 20 61 75 78 69 6c 69 61  then any auxilia
2950: 72 79 20 64 61 74 61 62 61 73 65 73 20 61 64 64  ry databases add
2960: 65 64 0a 2a 2a 20 75 73 69 6e 67 20 74 68 65 20  ed.** using the 
2970: 41 54 54 41 43 48 20 63 6f 6d 6d 61 6e 64 2e 0a  ATTACH command..
2980: 2a 2f 0a 49 6e 64 65 78 20 2a 73 71 6c 69 74 65  */.Index *sqlite
2990: 33 46 69 6e 64 49 6e 64 65 78 28 73 71 6c 69 74  3FindIndex(sqlit
29a0: 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68  e3 *db, const ch
29b0: 61 72 20 2a 7a 4e 61 6d 65 2c 20 63 6f 6e 73 74  ar *zName, const
29c0: 20 63 68 61 72 20 2a 7a 44 62 29 7b 0a 20 20 49   char *zDb){.  I
29d0: 6e 64 65 78 20 2a 70 20 3d 20 30 3b 0a 20 20 69  ndex *p = 0;.  i
29e0: 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e 4e 61 6d  nt i;.  int nNam
29f0: 65 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  e = sqlite3Strle
2a00: 6e 28 64 62 2c 20 7a 4e 61 6d 65 29 2b 31 3b 0a  n(db, zName)+1;.
2a10: 20 20 66 6f 72 28 69 3d 4f 4d 49 54 5f 54 45 4d    for(i=OMIT_TEM
2a20: 50 44 42 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20  PDB; i<db->nDb; 
2a30: 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6a 20  i++){.    int j 
2a40: 3d 20 28 69 3c 32 29 20 3f 20 69 5e 31 20 3a 20  = (i<2) ? i^1 : 
2a50: 69 3b 20 20 2f 2a 20 53 65 61 72 63 68 20 54 45  i;  /* Search TE
2a60: 4d 50 20 62 65 66 6f 72 65 20 4d 41 49 4e 20 2a  MP before MAIN *
2a70: 2f 0a 20 20 20 20 53 63 68 65 6d 61 20 2a 70 53  /.    Schema *pS
2a80: 63 68 65 6d 61 20 3d 20 64 62 2d 3e 61 44 62 5b  chema = db->aDb[
2a90: 6a 5d 2e 70 53 63 68 65 6d 61 3b 0a 20 20 20 20  j].pSchema;.    
2aa0: 69 66 28 20 7a 44 62 20 26 26 20 73 71 6c 69 74  if( zDb && sqlit
2ab0: 65 33 53 74 72 49 43 6d 70 28 7a 44 62 2c 20 64  e3StrICmp(zDb, d
2ac0: 62 2d 3e 61 44 62 5b 6a 5d 2e 7a 4e 61 6d 65 29  b->aDb[j].zName)
2ad0: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
2ae0: 20 61 73 73 65 72 74 28 20 70 53 63 68 65 6d 61   assert( pSchema
2af0: 20 7c 7c 20 28 6a 3d 3d 31 20 26 26 20 21 64 62   || (j==1 && !db
2b00: 2d 3e 61 44 62 5b 31 5d 2e 70 42 74 29 20 29 3b  ->aDb[1].pBt) );
2b10: 0a 20 20 20 20 69 66 28 20 70 53 63 68 65 6d 61  .    if( pSchema
2b20: 20 29 7b 0a 20 20 20 20 20 20 70 20 3d 20 73 71   ){.      p = sq
2b30: 6c 69 74 65 33 48 61 73 68 46 69 6e 64 28 26 70  lite3HashFind(&p
2b40: 53 63 68 65 6d 61 2d 3e 69 64 78 48 61 73 68 2c  Schema->idxHash,
2b50: 20 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 29 3b 0a   zName, nName);.
2b60: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 20      }.    if( p 
2b70: 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72  ) break;.  }.  r
2b80: 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn p;.}../*.*
2b90: 2a 20 52 65 63 6c 61 69 6d 20 74 68 65 20 6d 65  * Reclaim the me
2ba0: 6d 6f 72 79 20 75 73 65 64 20 62 79 20 61 6e 20  mory used by an 
2bb0: 69 6e 64 65 78 0a 2a 2f 0a 73 74 61 74 69 63 20  index.*/.static 
2bc0: 76 6f 69 64 20 66 72 65 65 49 6e 64 65 78 28 49  void freeIndex(I
2bd0: 6e 64 65 78 20 2a 70 29 7b 0a 20 20 73 71 6c 69  ndex *p){.  sqli
2be0: 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 70 54 61  te3 *db = p->pTa
2bf0: 62 6c 65 2d 3e 64 62 3b 0a 20 20 73 71 6c 69 74  ble->db;.  sqlit
2c00: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e  e3DbFree(db, p->
2c10: 7a 43 6f 6c 41 66 66 29 3b 0a 20 20 73 71 6c 69  zColAff);.  sqli
2c20: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 29  te3DbFree(db, p)
2c30: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76  ;.}../*.** Remov
2c40: 65 20 74 68 65 20 67 69 76 65 6e 20 69 6e 64 65  e the given inde
2c50: 78 20 66 72 6f 6d 20 74 68 65 20 69 6e 64 65 78  x from the index
2c60: 20 68 61 73 68 20 74 61 62 6c 65 2c 20 61 6e 64   hash table, and
2c70: 20 66 72 65 65 0a 2a 2a 20 69 74 73 20 6d 65 6d   free.** its mem
2c80: 6f 72 79 20 73 74 72 75 63 74 75 72 65 73 2e 0a  ory structures..
2c90: 2a 2a 0a 2a 2a 20 54 68 65 20 69 6e 64 65 78 20  **.** The index 
2ca0: 69 73 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20  is removed from 
2cb0: 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61 73  the database has
2cc0: 68 20 74 61 62 6c 65 73 20 62 75 74 0a 2a 2a 20  h tables but.** 
2cd0: 69 74 20 69 73 20 6e 6f 74 20 75 6e 6c 69 6e 6b  it is not unlink
2ce0: 65 64 20 66 72 6f 6d 20 74 68 65 20 54 61 62 6c  ed from the Tabl
2cf0: 65 20 74 68 61 74 20 69 74 20 69 6e 64 65 78 65  e that it indexe
2d00: 73 2e 0a 2a 2a 20 55 6e 6c 69 6e 6b 69 6e 67 20  s..** Unlinking 
2d10: 66 72 6f 6d 20 74 68 65 20 54 61 62 6c 65 20 6d  from the Table m
2d20: 75 73 74 20 62 65 20 64 6f 6e 65 20 62 79 20 74  ust be done by t
2d30: 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74  he calling funct
2d40: 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ion..*/.static v
2d50: 6f 69 64 20 73 71 6c 69 74 65 44 65 6c 65 74 65  oid sqliteDelete
2d60: 49 6e 64 65 78 28 49 6e 64 65 78 20 2a 70 29 7b  Index(Index *p){
2d70: 0a 20 20 49 6e 64 65 78 20 2a 70 4f 6c 64 3b 0a  .  Index *pOld;.
2d80: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e    const char *zN
2d90: 61 6d 65 20 3d 20 70 2d 3e 7a 4e 61 6d 65 3b 0a  ame = p->zName;.
2da0: 0a 20 20 70 4f 6c 64 20 3d 20 73 71 6c 69 74 65  .  pOld = sqlite
2db0: 33 48 61 73 68 49 6e 73 65 72 74 28 26 70 2d 3e  3HashInsert(&p->
2dc0: 70 53 63 68 65 6d 61 2d 3e 69 64 78 48 61 73 68  pSchema->idxHash
2dd0: 2c 20 7a 4e 61 6d 65 2c 20 73 74 72 6c 65 6e 28  , zName, strlen(
2de0: 7a 4e 61 6d 65 29 2b 31 2c 20 30 29 3b 0a 20 20  zName)+1, 0);.  
2df0: 61 73 73 65 72 74 28 20 70 4f 6c 64 3d 3d 30 20  assert( pOld==0 
2e00: 7c 7c 20 70 4f 6c 64 3d 3d 70 20 29 3b 0a 20 20  || pOld==p );.  
2e10: 66 72 65 65 49 6e 64 65 78 28 70 29 3b 0a 7d 0a  freeIndex(p);.}.
2e20: 0a 2f 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20 69  ./*.** For the i
2e30: 6e 64 65 78 20 63 61 6c 6c 65 64 20 7a 49 64 78  ndex called zIdx
2e40: 4e 61 6d 65 20 77 68 69 63 68 20 69 73 20 66 6f  Name which is fo
2e50: 75 6e 64 20 69 6e 20 74 68 65 20 64 61 74 61 62  und in the datab
2e60: 61 73 65 20 69 44 62 2c 0a 2a 2a 20 75 6e 6c 69  ase iDb,.** unli
2e70: 6b 65 20 74 68 61 74 20 69 6e 64 65 78 20 66 72  ke that index fr
2e80: 6f 6d 20 69 74 73 20 54 61 62 6c 65 20 74 68 65  om its Table the
2e90: 6e 20 72 65 6d 6f 76 65 20 74 68 65 20 69 6e 64  n remove the ind
2ea0: 65 78 20 66 72 6f 6d 0a 2a 2a 20 74 68 65 20 69  ex from.** the i
2eb0: 6e 64 65 78 20 68 61 73 68 20 74 61 62 6c 65 20  ndex hash table 
2ec0: 61 6e 64 20 66 72 65 65 20 61 6c 6c 20 6d 65 6d  and free all mem
2ed0: 6f 72 79 20 73 74 72 75 63 74 75 72 65 73 20 61  ory structures a
2ee0: 73 73 6f 63 69 61 74 65 64 0a 2a 2a 20 77 69 74  ssociated.** wit
2ef0: 68 20 74 68 65 20 69 6e 64 65 78 2e 0a 2a 2f 0a  h the index..*/.
2f00: 76 6f 69 64 20 73 71 6c 69 74 65 33 55 6e 6c 69  void sqlite3Unli
2f10: 6e 6b 41 6e 64 44 65 6c 65 74 65 49 6e 64 65 78  nkAndDeleteIndex
2f20: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e  (sqlite3 *db, in
2f30: 74 20 69 44 62 2c 20 63 6f 6e 73 74 20 63 68 61  t iDb, const cha
2f40: 72 20 2a 7a 49 64 78 4e 61 6d 65 29 7b 0a 20 20  r *zIdxName){.  
2f50: 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b 0a 20  Index *pIndex;. 
2f60: 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 48 61 73 68   int len;.  Hash
2f70: 20 2a 70 48 61 73 68 20 3d 20 26 64 62 2d 3e 61   *pHash = &db->a
2f80: 44 62 5b 69 44 62 5d 2e 70 53 63 68 65 6d 61 2d  Db[iDb].pSchema-
2f90: 3e 69 64 78 48 61 73 68 3b 0a 0a 20 20 6c 65 6e  >idxHash;..  len
2fa0: 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
2fb0: 28 64 62 2c 20 7a 49 64 78 4e 61 6d 65 29 3b 0a  (db, zIdxName);.
2fc0: 20 20 70 49 6e 64 65 78 20 3d 20 73 71 6c 69 74    pIndex = sqlit
2fd0: 65 33 48 61 73 68 49 6e 73 65 72 74 28 70 48 61  e3HashInsert(pHa
2fe0: 73 68 2c 20 7a 49 64 78 4e 61 6d 65 2c 20 6c 65  sh, zIdxName, le
2ff0: 6e 2b 31 2c 20 30 29 3b 0a 20 20 69 66 28 20 70  n+1, 0);.  if( p
3000: 49 6e 64 65 78 20 29 7b 0a 20 20 20 20 69 66 28  Index ){.    if(
3010: 20 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 2d   pIndex->pTable-
3020: 3e 70 49 6e 64 65 78 3d 3d 70 49 6e 64 65 78 20  >pIndex==pIndex 
3030: 29 7b 0a 20 20 20 20 20 20 70 49 6e 64 65 78 2d  ){.      pIndex-
3040: 3e 70 54 61 62 6c 65 2d 3e 70 49 6e 64 65 78 20  >pTable->pIndex 
3050: 3d 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74 3b  = pIndex->pNext;
3060: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
3070: 20 20 49 6e 64 65 78 20 2a 70 3b 0a 20 20 20 20    Index *p;.    
3080: 20 20 66 6f 72 28 70 3d 70 49 6e 64 65 78 2d 3e    for(p=pIndex->
3090: 70 54 61 62 6c 65 2d 3e 70 49 6e 64 65 78 3b 20  pTable->pIndex; 
30a0: 70 20 26 26 20 70 2d 3e 70 4e 65 78 74 21 3d 70  p && p->pNext!=p
30b0: 49 6e 64 65 78 3b 20 70 3d 70 2d 3e 70 4e 65 78  Index; p=p->pNex
30c0: 74 29 7b 7d 0a 20 20 20 20 20 20 69 66 28 20 70  t){}.      if( p
30d0: 20 26 26 20 70 2d 3e 70 4e 65 78 74 3d 3d 70 49   && p->pNext==pI
30e0: 6e 64 65 78 20 29 7b 0a 20 20 20 20 20 20 20 20  ndex ){.        
30f0: 70 2d 3e 70 4e 65 78 74 20 3d 20 70 49 6e 64 65  p->pNext = pInde
3100: 78 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20  x->pNext;.      
3110: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 66 72 65 65  }.    }.    free
3120: 49 6e 64 65 78 28 70 49 6e 64 65 78 29 3b 0a 20  Index(pIndex);. 
3130: 20 7d 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c   }.  db->flags |
3140: 3d 20 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43  = SQLITE_InternC
3150: 68 61 6e 67 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  hanges;.}../*.**
3160: 20 45 72 61 73 65 20 61 6c 6c 20 73 63 68 65 6d   Erase all schem
3170: 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72  a information fr
3180: 6f 6d 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79  om the in-memory
3190: 20 68 61 73 68 20 74 61 62 6c 65 73 20 6f 66 0a   hash tables of.
31a0: 2a 2a 20 61 20 73 69 6e 67 6c 65 20 64 61 74 61  ** a single data
31b0: 62 61 73 65 2e 20 20 54 68 69 73 20 72 6f 75 74  base.  This rout
31c0: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f  ine is called to
31d0: 20 72 65 63 6c 61 69 6d 20 6d 65 6d 6f 72 79 0a   reclaim memory.
31e0: 2a 2a 20 62 65 66 6f 72 65 20 74 68 65 20 64 61  ** before the da
31f0: 74 61 62 61 73 65 20 63 6c 6f 73 65 73 2e 20 20  tabase closes.  
3200: 49 74 20 69 73 20 61 6c 73 6f 20 63 61 6c 6c 65  It is also calle
3210: 64 20 64 75 72 69 6e 67 20 61 20 72 6f 6c 6c 62  d during a rollb
3220: 61 63 6b 0a 2a 2a 20 69 66 20 74 68 65 72 65 20  ack.** if there 
3230: 77 65 72 65 20 73 63 68 65 6d 61 20 63 68 61 6e  were schema chan
3240: 67 65 73 20 64 75 72 69 6e 67 20 74 68 65 20 74  ges during the t
3250: 72 61 6e 73 61 63 74 69 6f 6e 20 6f 72 20 69 66  ransaction or if
3260: 20 61 0a 2a 2a 20 73 63 68 65 6d 61 2d 63 6f 6f   a.** schema-coo
3270: 6b 69 65 20 6d 69 73 6d 61 74 63 68 20 6f 63 63  kie mismatch occ
3280: 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 69 44  urs..**.** If iD
3290: 62 3c 3d 30 20 74 68 65 6e 20 72 65 73 65 74 20  b<=0 then reset 
32a0: 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 73 63 68  the internal sch
32b0: 65 6d 61 20 74 61 62 6c 65 73 20 66 6f 72 20 61  ema tables for a
32c0: 6c 6c 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 66  ll database.** f
32d0: 69 6c 65 73 2e 20 20 49 66 20 69 44 62 3e 3d 32  iles.  If iDb>=2
32e0: 20 74 68 65 6e 20 72 65 73 65 74 20 74 68 65 20   then reset the 
32f0: 69 6e 74 65 72 6e 61 6c 20 73 63 68 65 6d 61 20  internal schema 
3300: 66 6f 72 20 6f 6e 6c 79 20 74 68 65 0a 2a 2a 20  for only the.** 
3310: 73 69 6e 67 6c 65 20 66 69 6c 65 20 69 6e 64 69  single file indi
3320: 63 61 74 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73  cated..*/.void s
3330: 71 6c 69 74 65 33 52 65 73 65 74 49 6e 74 65 72  qlite3ResetInter
3340: 6e 61 6c 53 63 68 65 6d 61 28 73 71 6c 69 74 65  nalSchema(sqlite
3350: 33 20 2a 64 62 2c 20 69 6e 74 20 69 44 62 29 7b  3 *db, int iDb){
3360: 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 61  .  int i, j;.  a
3370: 73 73 65 72 74 28 20 69 44 62 3e 3d 30 20 26 26  ssert( iDb>=0 &&
3380: 20 69 44 62 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a   iDb<db->nDb );.
3390: 0a 20 20 69 66 28 20 69 44 62 3d 3d 30 20 29 7b  .  if( iDb==0 ){
33a0: 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
33b0: 65 45 6e 74 65 72 41 6c 6c 28 64 62 29 3b 0a 20  eEnterAll(db);. 
33c0: 20 7d 0a 20 20 66 6f 72 28 69 3d 69 44 62 3b 20   }.  for(i=iDb; 
33d0: 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b  i<db->nDb; i++){
33e0: 0a 20 20 20 20 44 62 20 2a 70 44 62 20 3d 20 26  .    Db *pDb = &
33f0: 64 62 2d 3e 61 44 62 5b 69 5d 3b 0a 20 20 20 20  db->aDb[i];.    
3400: 69 66 28 20 70 44 62 2d 3e 70 53 63 68 65 6d 61  if( pDb->pSchema
3410: 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
3420: 28 69 3d 3d 31 20 7c 7c 20 28 70 44 62 2d 3e 70  (i==1 || (pDb->p
3430: 42 74 20 26 26 20 73 71 6c 69 74 65 33 42 74 72  Bt && sqlite3Btr
3440: 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 44 62  eeHoldsMutex(pDb
3450: 2d 3e 70 42 74 29 29 29 3b 0a 20 20 20 20 20 20  ->pBt)));.      
3460: 73 71 6c 69 74 65 33 53 63 68 65 6d 61 46 72 65  sqlite3SchemaFre
3470: 65 28 70 44 62 2d 3e 70 53 63 68 65 6d 61 29 3b  e(pDb->pSchema);
3480: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69  .    }.    if( i
3490: 44 62 3e 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  Db>0 ) return;. 
34a0: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 69 44 62   }.  assert( iDb
34b0: 3d 3d 30 20 29 3b 0a 20 20 64 62 2d 3e 66 6c 61  ==0 );.  db->fla
34c0: 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 49 6e  gs &= ~SQLITE_In
34d0: 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a 20 20 73  ternChanges;.  s
34e0: 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
34f0: 41 6c 6c 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 49  All(db);..  /* I
3500: 66 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 66  f one or more of
3510: 20 74 68 65 20 61 75 78 69 6c 69 61 72 79 20 64   the auxiliary d
3520: 61 74 61 62 61 73 65 20 66 69 6c 65 73 20 68 61  atabase files ha
3530: 73 20 62 65 65 6e 20 63 6c 6f 73 65 64 2c 0a 20  s been closed,. 
3540: 20 2a 2a 20 74 68 65 6e 20 72 65 6d 6f 76 65 20   ** then remove 
3550: 74 68 65 6d 20 66 72 6f 6d 20 74 68 65 20 61 75  them from the au
3560: 78 69 6c 69 61 72 79 20 64 61 74 61 62 61 73 65  xiliary database
3570: 20 6c 69 73 74 2e 20 20 57 65 20 74 61 6b 65 20   list.  We take 
3580: 74 68 65 0a 20 20 2a 2a 20 6f 70 70 6f 72 74 75  the.  ** opportu
3590: 6e 69 74 79 20 74 6f 20 64 6f 20 74 68 69 73 20  nity to do this 
35a0: 68 65 72 65 20 73 69 6e 63 65 20 77 65 20 68 61  here since we ha
35b0: 76 65 20 6a 75 73 74 20 64 65 6c 65 74 65 64 20  ve just deleted 
35c0: 61 6c 6c 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20  all of the.  ** 
35d0: 73 63 68 65 6d 61 20 68 61 73 68 20 74 61 62 6c  schema hash tabl
35e0: 65 73 20 61 6e 64 20 74 68 65 72 65 66 6f 72 65  es and therefore
35f0: 20 64 6f 20 6e 6f 74 20 68 61 76 65 20 74 6f 20   do not have to 
3600: 6d 61 6b 65 20 61 6e 79 20 63 68 61 6e 67 65 73  make any changes
3610: 0a 20 20 2a 2a 20 74 6f 20 61 6e 79 20 6f 66 20  .  ** to any of 
3620: 74 68 6f 73 65 20 74 61 62 6c 65 73 2e 0a 20 20  those tables..  
3630: 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  */.  for(i=0; i<
3640: 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20  db->nDb; i++){. 
3650: 20 20 20 73 74 72 75 63 74 20 44 62 20 2a 70 44     struct Db *pD
3660: 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 5d 3b  b = &db->aDb[i];
3670: 0a 20 20 20 20 69 66 28 20 70 44 62 2d 3e 70 42  .    if( pDb->pB
3680: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66  t==0 ){.      if
3690: 28 20 70 44 62 2d 3e 70 41 75 78 20 26 26 20 70  ( pDb->pAux && p
36a0: 44 62 2d 3e 78 46 72 65 65 41 75 78 20 29 20 70  Db->xFreeAux ) p
36b0: 44 62 2d 3e 78 46 72 65 65 41 75 78 28 70 44 62  Db->xFreeAux(pDb
36c0: 2d 3e 70 41 75 78 29 3b 0a 20 20 20 20 20 20 70  ->pAux);.      p
36d0: 44 62 2d 3e 70 41 75 78 20 3d 20 30 3b 0a 20 20  Db->pAux = 0;.  
36e0: 20 20 7d 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d    }.  }.  for(i=
36f0: 6a 3d 32 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20  j=2; i<db->nDb; 
3700: 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74  i++){.    struct
3710: 20 44 62 20 2a 70 44 62 20 3d 20 26 64 62 2d 3e   Db *pDb = &db->
3720: 61 44 62 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20  aDb[i];.    if( 
3730: 70 44 62 2d 3e 70 42 74 3d 3d 30 20 29 7b 0a 20  pDb->pBt==0 ){. 
3740: 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
3750: 65 65 28 64 62 2c 20 70 44 62 2d 3e 7a 4e 61 6d  ee(db, pDb->zNam
3760: 65 29 3b 0a 20 20 20 20 20 20 70 44 62 2d 3e 7a  e);.      pDb->z
3770: 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  Name = 0;.      
3780: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a  continue;.    }.
3790: 20 20 20 20 69 66 28 20 6a 3c 69 20 29 7b 0a 20      if( j<i ){. 
37a0: 20 20 20 20 20 64 62 2d 3e 61 44 62 5b 6a 5d 20       db->aDb[j] 
37b0: 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 3b 0a 20 20  = db->aDb[i];.  
37c0: 20 20 7d 0a 20 20 20 20 6a 2b 2b 3b 0a 20 20 7d    }.    j++;.  }
37d0: 0a 20 20 6d 65 6d 73 65 74 28 26 64 62 2d 3e 61  .  memset(&db->a
37e0: 44 62 5b 6a 5d 2c 20 30 2c 20 28 64 62 2d 3e 6e  Db[j], 0, (db->n
37f0: 44 62 2d 6a 29 2a 73 69 7a 65 6f 66 28 64 62 2d  Db-j)*sizeof(db-
3800: 3e 61 44 62 5b 6a 5d 29 29 3b 0a 20 20 64 62 2d  >aDb[j]));.  db-
3810: 3e 6e 44 62 20 3d 20 6a 3b 0a 20 20 69 66 28 20  >nDb = j;.  if( 
3820: 64 62 2d 3e 6e 44 62 3c 3d 32 20 26 26 20 64 62  db->nDb<=2 && db
3830: 2d 3e 61 44 62 21 3d 64 62 2d 3e 61 44 62 53 74  ->aDb!=db->aDbSt
3840: 61 74 69 63 20 29 7b 0a 20 20 20 20 6d 65 6d 63  atic ){.    memc
3850: 70 79 28 64 62 2d 3e 61 44 62 53 74 61 74 69 63  py(db->aDbStatic
3860: 2c 20 64 62 2d 3e 61 44 62 2c 20 32 2a 73 69 7a  , db->aDb, 2*siz
3870: 65 6f 66 28 64 62 2d 3e 61 44 62 5b 30 5d 29 29  eof(db->aDb[0]))
3880: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  ;.    sqlite3DbF
3890: 72 65 65 28 64 62 2c 20 64 62 2d 3e 61 44 62 29  ree(db, db->aDb)
38a0: 3b 0a 20 20 20 20 64 62 2d 3e 61 44 62 20 3d 20  ;.    db->aDb = 
38b0: 64 62 2d 3e 61 44 62 53 74 61 74 69 63 3b 0a 20  db->aDbStatic;. 
38c0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73   }.}../*.** This
38d0: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
38e0: 65 64 20 77 68 65 6e 20 61 20 63 6f 6d 6d 69 74  ed when a commit
38f0: 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 76 6f 69 64   occurs..*/.void
3900: 20 73 71 6c 69 74 65 33 43 6f 6d 6d 69 74 49 6e   sqlite3CommitIn
3910: 74 65 72 6e 61 6c 43 68 61 6e 67 65 73 28 73 71  ternalChanges(sq
3920: 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 64 62  lite3 *db){.  db
3930: 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49  ->flags &= ~SQLI
3940: 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73  TE_InternChanges
3950: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72  ;.}../*.** Clear
3960: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65   the column name
3970: 73 20 66 72 6f 6d 20 61 20 74 61 62 6c 65 20 6f  s from a table o
3980: 72 20 76 69 65 77 2e 0a 2a 2f 0a 73 74 61 74 69  r view..*/.stati
3990: 63 20 76 6f 69 64 20 73 71 6c 69 74 65 52 65 73  c void sqliteRes
39a0: 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 54 61  etColumnNames(Ta
39b0: 62 6c 65 20 2a 70 54 61 62 6c 65 29 7b 0a 20 20  ble *pTable){.  
39c0: 69 6e 74 20 69 3b 0a 20 20 43 6f 6c 75 6d 6e 20  int i;.  Column 
39d0: 2a 70 43 6f 6c 3b 0a 20 20 73 71 6c 69 74 65 33  *pCol;.  sqlite3
39e0: 20 2a 64 62 20 3d 20 70 54 61 62 6c 65 2d 3e 64   *db = pTable->d
39f0: 62 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54 61  b;.  assert( pTa
3a00: 62 6c 65 21 3d 30 20 29 3b 0a 20 20 69 66 28 20  ble!=0 );.  if( 
3a10: 28 70 43 6f 6c 20 3d 20 70 54 61 62 6c 65 2d 3e  (pCol = pTable->
3a20: 61 43 6f 6c 29 21 3d 30 20 29 7b 0a 20 20 20 20  aCol)!=0 ){.    
3a30: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61 62 6c  for(i=0; i<pTabl
3a40: 65 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70 43  e->nCol; i++, pC
3a50: 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c  ol++){.      sql
3a60: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
3a70: 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  Col->zName);.   
3a80: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65     sqlite3ExprDe
3a90: 6c 65 74 65 28 64 62 2c 20 70 43 6f 6c 2d 3e 70  lete(db, pCol->p
3aa0: 44 66 6c 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  Dflt);.      sql
3ab0: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
3ac0: 43 6f 6c 2d 3e 7a 54 79 70 65 29 3b 0a 20 20 20  Col->zType);.   
3ad0: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
3ae0: 28 64 62 2c 20 70 43 6f 6c 2d 3e 7a 43 6f 6c 6c  (db, pCol->zColl
3af0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
3b00: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
3b10: 54 61 62 6c 65 2d 3e 61 43 6f 6c 29 3b 0a 20 20  Table->aCol);.  
3b20: 7d 0a 20 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c  }.  pTable->aCol
3b30: 20 3d 20 30 3b 0a 20 20 70 54 61 62 6c 65 2d 3e   = 0;.  pTable->
3b40: 6e 43 6f 6c 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a  nCol = 0;.}../*.
3b50: 2a 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 6d 65  ** Remove the me
3b60: 6d 6f 72 79 20 64 61 74 61 20 73 74 72 75 63 74  mory data struct
3b70: 75 72 65 73 20 61 73 73 6f 63 69 61 74 65 64 20  ures associated 
3b80: 77 69 74 68 20 74 68 65 20 67 69 76 65 6e 0a 2a  with the given.*
3b90: 2a 20 54 61 62 6c 65 2e 20 20 4e 6f 20 63 68 61  * Table.  No cha
3ba0: 6e 67 65 73 20 61 72 65 20 6d 61 64 65 20 74 6f  nges are made to
3bb0: 20 64 69 73 6b 20 62 79 20 74 68 69 73 20 72 6f   disk by this ro
3bc0: 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  utine..**.** Thi
3bd0: 73 20 72 6f 75 74 69 6e 65 20 6a 75 73 74 20 64  s routine just d
3be0: 65 6c 65 74 65 73 20 74 68 65 20 64 61 74 61 20  eletes the data 
3bf0: 73 74 72 75 63 74 75 72 65 2e 20 20 49 74 20 64  structure.  It d
3c00: 6f 65 73 20 6e 6f 74 20 75 6e 6c 69 6e 6b 0a 2a  oes not unlink.*
3c10: 2a 20 74 68 65 20 74 61 62 6c 65 20 64 61 74 61  * the table data
3c20: 20 73 74 72 75 63 74 75 72 65 20 66 72 6f 6d 20   structure from 
3c30: 74 68 65 20 68 61 73 68 20 74 61 62 6c 65 2e 20  the hash table. 
3c40: 20 4e 6f 72 20 64 6f 65 73 20 69 74 20 72 65 6d   Nor does it rem
3c50: 6f 76 65 0a 2a 2a 20 66 6f 72 65 69 67 6e 20 6b  ove.** foreign k
3c60: 65 79 73 20 66 72 6f 6d 20 74 68 65 20 73 71 6c  eys from the sql
3c70: 69 74 65 2e 61 46 4b 65 79 20 68 61 73 68 20 74  ite.aFKey hash t
3c80: 61 62 6c 65 2e 20 20 42 75 74 20 69 74 20 64 6f  able.  But it do
3c90: 65 73 20 64 65 73 74 72 6f 79 0a 2a 2a 20 6d 65  es destroy.** me
3ca0: 6d 6f 72 79 20 73 74 72 75 63 74 75 72 65 73 20  mory structures 
3cb0: 6f 66 20 74 68 65 20 69 6e 64 69 63 65 73 20 61  of the indices a
3cc0: 6e 64 20 66 6f 72 65 69 67 6e 20 6b 65 79 73 20  nd foreign keys 
3cd0: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
3ce0: 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a  .** the table..*
3cf0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 44 65  /.void sqlite3De
3d00: 6c 65 74 65 54 61 62 6c 65 28 54 61 62 6c 65 20  leteTable(Table 
3d10: 2a 70 54 61 62 6c 65 29 7b 0a 20 20 49 6e 64 65  *pTable){.  Inde
3d20: 78 20 2a 70 49 6e 64 65 78 2c 20 2a 70 4e 65 78  x *pIndex, *pNex
3d30: 74 3b 0a 20 20 46 4b 65 79 20 2a 70 46 4b 65 79  t;.  FKey *pFKey
3d40: 2c 20 2a 70 4e 65 78 74 46 4b 65 79 3b 0a 20 20  , *pNextFKey;.  
3d50: 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 0a 20 20  sqlite3 *db;..  
3d60: 69 66 28 20 70 54 61 62 6c 65 3d 3d 30 20 29 20  if( pTable==0 ) 
3d70: 72 65 74 75 72 6e 3b 0a 20 20 64 62 20 3d 20 70  return;.  db = p
3d80: 54 61 62 6c 65 2d 3e 64 62 3b 0a 0a 20 20 2f 2a  Table->db;..  /*
3d90: 20 44 6f 20 6e 6f 74 20 64 65 6c 65 74 65 20 74   Do not delete t
3da0: 68 65 20 74 61 62 6c 65 20 75 6e 74 69 6c 20 74  he table until t
3db0: 68 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75  he reference cou
3dc0: 6e 74 20 72 65 61 63 68 65 73 20 7a 65 72 6f 2e  nt reaches zero.
3dd0: 20 2a 2f 0a 20 20 70 54 61 62 6c 65 2d 3e 6e 52   */.  pTable->nR
3de0: 65 66 2d 2d 3b 0a 20 20 69 66 28 20 70 54 61 62  ef--;.  if( pTab
3df0: 6c 65 2d 3e 6e 52 65 66 3e 30 20 29 7b 0a 20 20  le->nRef>0 ){.  
3e00: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
3e10: 61 73 73 65 72 74 28 20 70 54 61 62 6c 65 2d 3e  assert( pTable->
3e20: 6e 52 65 66 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a  nRef==0 );..  /*
3e30: 20 44 65 6c 65 74 65 20 61 6c 6c 20 69 6e 64 69   Delete all indi
3e40: 63 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  ces associated w
3e50: 69 74 68 20 74 68 69 73 20 74 61 62 6c 65 0a 20  ith this table. 
3e60: 20 2a 2f 0a 20 20 66 6f 72 28 70 49 6e 64 65 78   */.  for(pIndex
3e70: 20 3d 20 70 54 61 62 6c 65 2d 3e 70 49 6e 64 65   = pTable->pInde
3e80: 78 3b 20 70 49 6e 64 65 78 3b 20 70 49 6e 64 65  x; pIndex; pInde
3e90: 78 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20 70 4e  x=pNext){.    pN
3ea0: 65 78 74 20 3d 20 70 49 6e 64 65 78 2d 3e 70 4e  ext = pIndex->pN
3eb0: 65 78 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ext;.    assert(
3ec0: 20 70 49 6e 64 65 78 2d 3e 70 53 63 68 65 6d 61   pIndex->pSchema
3ed0: 3d 3d 70 54 61 62 6c 65 2d 3e 70 53 63 68 65 6d  ==pTable->pSchem
3ee0: 61 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 44  a );.    sqliteD
3ef0: 65 6c 65 74 65 49 6e 64 65 78 28 70 49 6e 64 65  eleteIndex(pInde
3f00: 78 29 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66  x);.  }..#ifndef
3f10: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52   SQLITE_OMIT_FOR
3f20: 45 49 47 4e 5f 4b 45 59 0a 20 20 2f 2a 20 44 65  EIGN_KEY.  /* De
3f30: 6c 65 74 65 20 61 6c 6c 20 66 6f 72 65 69 67 6e  lete all foreign
3f40: 20 6b 65 79 73 20 61 73 73 6f 63 69 61 74 65 64   keys associated
3f50: 20 77 69 74 68 20 74 68 69 73 20 74 61 62 6c 65   with this table
3f60: 2e 20 20 54 68 65 20 6b 65 79 73 0a 20 20 2a 2a  .  The keys.  **
3f70: 20 73 68 6f 75 6c 64 20 68 61 76 65 20 61 6c 72   should have alr
3f80: 65 61 64 79 20 62 65 65 6e 20 75 6e 6c 69 6e 6b  eady been unlink
3f90: 65 64 20 66 72 6f 6d 20 74 68 65 20 70 53 63 68  ed from the pSch
3fa0: 65 6d 61 2d 3e 61 46 4b 65 79 20 68 61 73 68 20  ema->aFKey hash 
3fb0: 74 61 62 6c 65 20 0a 20 20 2a 2f 0a 20 20 66 6f  table .  */.  fo
3fc0: 72 28 70 46 4b 65 79 3d 70 54 61 62 6c 65 2d 3e  r(pFKey=pTable->
3fd0: 70 46 4b 65 79 3b 20 70 46 4b 65 79 3b 20 70 46  pFKey; pFKey; pF
3fe0: 4b 65 79 3d 70 4e 65 78 74 46 4b 65 79 29 7b 0a  Key=pNextFKey){.
3ff0: 20 20 20 20 70 4e 65 78 74 46 4b 65 79 20 3d 20      pNextFKey = 
4000: 70 46 4b 65 79 2d 3e 70 4e 65 78 74 46 72 6f 6d  pFKey->pNextFrom
4010: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71  ;.    assert( sq
4020: 6c 69 74 65 33 48 61 73 68 46 69 6e 64 28 26 70  lite3HashFind(&p
4030: 54 61 62 6c 65 2d 3e 70 53 63 68 65 6d 61 2d 3e  Table->pSchema->
4040: 61 46 4b 65 79 2c 0a 20 20 20 20 20 20 20 20 20  aFKey,.         
4050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4060: 20 20 70 46 4b 65 79 2d 3e 7a 54 6f 2c 20 73 74    pFKey->zTo, st
4070: 72 6c 65 6e 28 70 46 4b 65 79 2d 3e 7a 54 6f 29  rlen(pFKey->zTo)
4080: 2b 31 29 21 3d 70 46 4b 65 79 20 29 3b 0a 20 20  +1)!=pFKey );.  
4090: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
40a0: 64 62 2c 20 70 46 4b 65 79 29 3b 0a 20 20 7d 0a  db, pFKey);.  }.
40b0: 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 44 65 6c  #endif..  /* Del
40c0: 65 74 65 20 74 68 65 20 54 61 62 6c 65 20 73 74  ete the Table st
40d0: 72 75 63 74 75 72 65 20 69 74 73 65 6c 66 2e 0a  ructure itself..
40e0: 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 52 65 73    */.  sqliteRes
40f0: 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 54  etColumnNames(pT
4100: 61 62 6c 65 29 3b 0a 20 20 73 71 6c 69 74 65 33  able);.  sqlite3
4110: 44 62 46 72 65 65 28 64 62 2c 20 70 54 61 62 6c  DbFree(db, pTabl
4120: 65 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 73 71 6c  e->zName);.  sql
4130: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
4140: 54 61 62 6c 65 2d 3e 7a 43 6f 6c 41 66 66 29 3b  Table->zColAff);
4150: 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  .  sqlite3Select
4160: 44 65 6c 65 74 65 28 64 62 2c 20 70 54 61 62 6c  Delete(db, pTabl
4170: 65 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 23 69 66  e->pSelect);.#if
4180: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
4190: 5f 43 48 45 43 4b 0a 20 20 73 71 6c 69 74 65 33  _CHECK.  sqlite3
41a0: 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70  ExprDelete(db, p
41b0: 54 61 62 6c 65 2d 3e 70 43 68 65 63 6b 29 3b 0a  Table->pCheck);.
41c0: 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33  #endif.  sqlite3
41d0: 56 74 61 62 43 6c 65 61 72 28 70 54 61 62 6c 65  VtabClear(pTable
41e0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  );.  sqlite3DbFr
41f0: 65 65 28 64 62 2c 20 70 54 61 62 6c 65 29 3b 0a  ee(db, pTable);.
4200: 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 69 6e 6b 20  }../*.** Unlink 
4210: 74 68 65 20 67 69 76 65 6e 20 74 61 62 6c 65 20  the given table 
4220: 66 72 6f 6d 20 74 68 65 20 68 61 73 68 20 74 61  from the hash ta
4230: 62 6c 65 73 20 61 6e 64 20 74 68 65 20 64 65 6c  bles and the del
4240: 65 74 65 20 74 68 65 0a 2a 2a 20 74 61 62 6c 65  ete the.** table
4250: 20 73 74 72 75 63 74 75 72 65 20 77 69 74 68 20   structure with 
4260: 61 6c 6c 20 69 74 73 20 69 6e 64 69 63 65 73 20  all its indices 
4270: 61 6e 64 20 66 6f 72 65 69 67 6e 20 6b 65 79 73  and foreign keys
4280: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
4290: 33 55 6e 6c 69 6e 6b 41 6e 64 44 65 6c 65 74 65  3UnlinkAndDelete
42a0: 54 61 62 6c 65 28 73 71 6c 69 74 65 33 20 2a 64  Table(sqlite3 *d
42b0: 62 2c 20 69 6e 74 20 69 44 62 2c 20 63 6f 6e 73  b, int iDb, cons
42c0: 74 20 63 68 61 72 20 2a 7a 54 61 62 4e 61 6d 65  t char *zTabName
42d0: 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20  ){.  Table *p;. 
42e0: 20 46 4b 65 79 20 2a 70 46 31 2c 20 2a 70 46 32   FKey *pF1, *pF2
42f0: 3b 0a 20 20 44 62 20 2a 70 44 62 3b 0a 0a 20 20  ;.  Db *pDb;..  
4300: 61 73 73 65 72 74 28 20 64 62 21 3d 30 20 29 3b  assert( db!=0 );
4310: 0a 20 20 61 73 73 65 72 74 28 20 69 44 62 3e 3d  .  assert( iDb>=
4320: 30 20 26 26 20 69 44 62 3c 64 62 2d 3e 6e 44 62  0 && iDb<db->nDb
4330: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 7a 54   );.  assert( zT
4340: 61 62 4e 61 6d 65 20 26 26 20 7a 54 61 62 4e 61  abName && zTabNa
4350: 6d 65 5b 30 5d 20 29 3b 0a 20 20 70 44 62 20 3d  me[0] );.  pDb =
4360: 20 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a   &db->aDb[iDb];.
4370: 20 20 70 20 3d 20 73 71 6c 69 74 65 33 48 61 73    p = sqlite3Has
4380: 68 49 6e 73 65 72 74 28 26 70 44 62 2d 3e 70 53  hInsert(&pDb->pS
4390: 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68 2c 20  chema->tblHash, 
43a0: 7a 54 61 62 4e 61 6d 65 2c 20 73 74 72 6c 65 6e  zTabName, strlen
43b0: 28 7a 54 61 62 4e 61 6d 65 29 2b 31 2c 30 29 3b  (zTabName)+1,0);
43c0: 0a 20 20 69 66 28 20 70 20 29 7b 0a 23 69 66 6e  .  if( p ){.#ifn
43d0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
43e0: 46 4f 52 45 49 47 4e 5f 4b 45 59 0a 20 20 20 20  FOREIGN_KEY.    
43f0: 66 6f 72 28 70 46 31 3d 70 2d 3e 70 46 4b 65 79  for(pF1=p->pFKey
4400: 3b 20 70 46 31 3b 20 70 46 31 3d 70 46 31 2d 3e  ; pF1; pF1=pF1->
4410: 70 4e 65 78 74 46 72 6f 6d 29 7b 0a 20 20 20 20  pNextFrom){.    
4420: 20 20 69 6e 74 20 6e 54 6f 20 3d 20 73 74 72 6c    int nTo = strl
4430: 65 6e 28 70 46 31 2d 3e 7a 54 6f 29 20 2b 20 31  en(pF1->zTo) + 1
4440: 3b 0a 20 20 20 20 20 20 70 46 32 20 3d 20 73 71  ;.      pF2 = sq
4450: 6c 69 74 65 33 48 61 73 68 46 69 6e 64 28 26 70  lite3HashFind(&p
4460: 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 61 46 4b  Db->pSchema->aFK
4470: 65 79 2c 20 70 46 31 2d 3e 7a 54 6f 2c 20 6e 54  ey, pF1->zTo, nT
4480: 6f 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 46  o);.      if( pF
4490: 32 3d 3d 70 46 31 20 29 7b 0a 20 20 20 20 20 20  2==pF1 ){.      
44a0: 20 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73    sqlite3HashIns
44b0: 65 72 74 28 26 70 44 62 2d 3e 70 53 63 68 65 6d  ert(&pDb->pSchem
44c0: 61 2d 3e 61 46 4b 65 79 2c 20 70 46 31 2d 3e 7a  a->aFKey, pF1->z
44d0: 54 6f 2c 20 6e 54 6f 2c 20 70 46 31 2d 3e 70 4e  To, nTo, pF1->pN
44e0: 65 78 74 54 6f 29 3b 0a 20 20 20 20 20 20 7d 65  extTo);.      }e
44f0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 77 68 69  lse{.        whi
4500: 6c 65 28 20 70 46 32 20 26 26 20 70 46 32 2d 3e  le( pF2 && pF2->
4510: 70 4e 65 78 74 54 6f 21 3d 70 46 31 20 29 7b 20  pNextTo!=pF1 ){ 
4520: 70 46 32 3d 70 46 32 2d 3e 70 4e 65 78 74 54 6f  pF2=pF2->pNextTo
4530: 3b 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20  ; }.        if( 
4540: 70 46 32 20 29 7b 0a 20 20 20 20 20 20 20 20 20  pF2 ){.         
4550: 20 70 46 32 2d 3e 70 4e 65 78 74 54 6f 20 3d 20   pF2->pNextTo = 
4560: 70 46 31 2d 3e 70 4e 65 78 74 54 6f 3b 0a 20 20  pF1->pNextTo;.  
4570: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
4580: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
4590: 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61   sqlite3DeleteTa
45a0: 62 6c 65 28 70 29 3b 0a 20 20 7d 0a 20 20 64 62  ble(p);.  }.  db
45b0: 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54  ->flags |= SQLIT
45c0: 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b  E_InternChanges;
45d0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20  .}../*.** Given 
45e0: 61 20 74 6f 6b 65 6e 2c 20 72 65 74 75 72 6e 20  a token, return 
45f0: 61 20 73 74 72 69 6e 67 20 74 68 61 74 20 63 6f  a string that co
4600: 6e 73 69 73 74 73 20 6f 66 20 74 68 65 20 74 65  nsists of the te
4610: 78 74 20 6f 66 20 74 68 61 74 0a 2a 2a 20 74 6f  xt of that.** to
4620: 6b 65 6e 20 77 69 74 68 20 61 6e 79 20 71 75 6f  ken with any quo
4630: 74 61 74 69 6f 6e 73 20 72 65 6d 6f 76 65 64 2e  tations removed.
4640: 20 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20    Space to hold 
4650: 74 68 65 20 72 65 74 75 72 6e 65 64 20 73 74 72  the returned str
4660: 69 6e 67 0a 2a 2a 20 69 73 20 6f 62 74 61 69 6e  ing.** is obtain
4670: 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 4d 61  ed from sqliteMa
4680: 6c 6c 6f 63 28 29 20 61 6e 64 20 6d 75 73 74 20  lloc() and must 
4690: 62 65 20 66 72 65 65 64 20 62 79 20 74 68 65 20  be freed by the 
46a0: 63 61 6c 6c 69 6e 67 0a 2a 2a 20 66 75 6e 63 74  calling.** funct
46b0: 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 6f 6b 65 6e  ion..**.** Token
46c0: 73 20 61 72 65 20 6f 66 74 65 6e 20 6a 75 73 74  s are often just
46d0: 20 70 6f 69 6e 74 65 72 73 20 69 6e 74 6f 20 74   pointers into t
46e0: 68 65 20 6f 72 69 67 69 6e 61 6c 20 53 51 4c 20  he original SQL 
46f0: 74 65 78 74 20 61 6e 64 20 73 6f 0a 2a 2a 20 61  text and so.** a
4700: 72 65 20 6e 6f 74 20 5c 30 30 30 20 74 65 72 6d  re not \000 term
4710: 69 6e 61 74 65 64 20 61 6e 64 20 61 72 65 20 6e  inated and are n
4720: 6f 74 20 70 65 72 73 69 73 74 65 6e 74 2e 20 20  ot persistent.  
4730: 54 68 65 20 72 65 74 75 72 6e 65 64 20 73 74 72  The returned str
4740: 69 6e 67 0a 2a 2a 20 69 73 20 5c 30 30 30 20 74  ing.** is \000 t
4750: 65 72 6d 69 6e 61 74 65 64 20 61 6e 64 20 69 73  erminated and is
4760: 20 70 65 72 73 69 73 74 65 6e 74 2e 0a 2a 2f 0a   persistent..*/.
4770: 63 68 61 72 20 2a 73 71 6c 69 74 65 33 4e 61 6d  char *sqlite3Nam
4780: 65 46 72 6f 6d 54 6f 6b 65 6e 28 73 71 6c 69 74  eFromToken(sqlit
4790: 65 33 20 2a 64 62 2c 20 54 6f 6b 65 6e 20 2a 70  e3 *db, Token *p
47a0: 4e 61 6d 65 29 7b 0a 20 20 63 68 61 72 20 2a 7a  Name){.  char *z
47b0: 4e 61 6d 65 3b 0a 20 20 69 66 28 20 70 4e 61 6d  Name;.  if( pNam
47c0: 65 20 29 7b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d  e ){.    zName =
47d0: 20 73 71 6c 69 74 65 33 44 62 53 74 72 4e 44 75   sqlite3DbStrNDu
47e0: 70 28 64 62 2c 20 28 63 68 61 72 2a 29 70 4e 61  p(db, (char*)pNa
47f0: 6d 65 2d 3e 7a 2c 20 70 4e 61 6d 65 2d 3e 6e 29  me->z, pName->n)
4800: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 71  ;.    sqlite3Deq
4810: 75 6f 74 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 7d  uote(zName);.  }
4820: 65 6c 73 65 7b 0a 20 20 20 20 7a 4e 61 6d 65 20  else{.    zName 
4830: 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 0;.  }.  retur
4840: 6e 20 7a 4e 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  n zName;.}../*.*
4850: 2a 20 4f 70 65 6e 20 74 68 65 20 73 71 6c 69 74  * Open the sqlit
4860: 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20 73  e_master table s
4870: 74 6f 72 65 64 20 69 6e 20 64 61 74 61 62 61 73  tored in databas
4880: 65 20 6e 75 6d 62 65 72 20 69 44 62 20 66 6f 72  e number iDb for
4890: 0a 2a 2a 20 77 72 69 74 69 6e 67 2e 20 54 68 65  .** writing. The
48a0: 20 74 61 62 6c 65 20 69 73 20 6f 70 65 6e 65 64   table is opened
48b0: 20 75 73 69 6e 67 20 63 75 72 73 6f 72 20 30 2e   using cursor 0.
48c0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
48d0: 4f 70 65 6e 4d 61 73 74 65 72 54 61 62 6c 65 28  OpenMasterTable(
48e0: 50 61 72 73 65 20 2a 70 2c 20 69 6e 74 20 69 44  Parse *p, int iD
48f0: 62 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  b){.  Vdbe *v = 
4900: 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
4910: 29 3b 0a 20 20 73 71 6c 69 74 65 33 54 61 62 6c  );.  sqlite3Tabl
4920: 65 4c 6f 63 6b 28 70 2c 20 69 44 62 2c 20 4d 41  eLock(p, iDb, MA
4930: 53 54 45 52 5f 52 4f 4f 54 2c 20 31 2c 20 53 43  STER_ROOT, 1, SC
4940: 48 45 4d 41 5f 54 41 42 4c 45 28 69 44 62 29 29  HEMA_TABLE(iDb))
4950: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
4960: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 65 74 4e  ddOp2(v, OP_SetN
4970: 75 6d 43 6f 6c 75 6d 6e 73 2c 20 30 2c 20 35 29  umColumns, 0, 5)
4980: 3b 2f 2a 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  ;/* sqlite_maste
4990: 72 20 68 61 73 20 35 20 63 6f 6c 75 6d 6e 73 20  r has 5 columns 
49a0: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  */.  sqlite3Vdbe
49b0: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65  AddOp3(v, OP_Ope
49c0: 6e 57 72 69 74 65 2c 20 30 2c 20 4d 41 53 54 45  nWrite, 0, MASTE
49d0: 52 5f 52 4f 4f 54 2c 20 69 44 62 29 3b 0a 7d 0a  R_ROOT, iDb);.}.
49e0: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 74 6f 6b 65 6e  ./*.** The token
49f0: 20 2a 70 4e 61 6d 65 20 63 6f 6e 74 61 69 6e 73   *pName contains
4a00: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 64   the name of a d
4a10: 61 74 61 62 61 73 65 20 28 65 69 74 68 65 72 20  atabase (either 
4a20: 22 6d 61 69 6e 22 20 6f 72 0a 2a 2a 20 22 74 65  "main" or.** "te
4a30: 6d 70 22 20 6f 72 20 74 68 65 20 6e 61 6d 65 20  mp" or the name 
4a40: 6f 66 20 61 6e 20 61 74 74 61 63 68 65 64 20 64  of an attached d
4a50: 62 29 2e 20 54 68 69 73 20 72 6f 75 74 69 6e 65  b). This routine
4a60: 20 72 65 74 75 72 6e 73 20 74 68 65 0a 2a 2a 20   returns the.** 
4a70: 69 6e 64 65 78 20 6f 66 20 74 68 65 20 6e 61 6d  index of the nam
4a80: 65 64 20 64 61 74 61 62 61 73 65 20 69 6e 20 64  ed database in d
4a90: 62 2d 3e 61 44 62 5b 5d 2c 20 6f 72 20 2d 31 20  b->aDb[], or -1 
4aa0: 69 66 20 74 68 65 20 6e 61 6d 65 64 20 64 62 20  if the named db 
4ab0: 0a 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 65 78 69  .** does not exi
4ac0: 73 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  st..*/.int sqlit
4ad0: 65 33 46 69 6e 64 44 62 28 73 71 6c 69 74 65 33  e3FindDb(sqlite3
4ae0: 20 2a 64 62 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61   *db, Token *pNa
4af0: 6d 65 29 7b 0a 20 20 69 6e 74 20 69 20 3d 20 2d  me){.  int i = -
4b00: 31 3b 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73  1;    /* Databas
4b10: 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 69 6e  e number */.  in
4b20: 74 20 6e 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  t n;         /* 
4b30: 4e 75 6d 62 65 72 20 6f 66 20 63 68 61 72 61 63  Number of charac
4b40: 74 65 72 73 20 69 6e 20 74 68 65 20 6e 61 6d 65  ters in the name
4b50: 20 2a 2f 0a 20 20 44 62 20 2a 70 44 62 3b 20 20   */.  Db *pDb;  
4b60: 20 20 20 20 20 2f 2a 20 41 20 64 61 74 61 62 61       /* A databa
4b70: 73 65 20 77 68 6f 73 65 20 6e 61 6d 65 20 73 70  se whose name sp
4b80: 61 63 65 20 69 73 20 62 65 69 6e 67 20 73 65 61  ace is being sea
4b90: 72 63 68 65 64 20 2a 2f 0a 20 20 63 68 61 72 20  rched */.  char 
4ba0: 2a 7a 4e 61 6d 65 3b 20 20 20 2f 2a 20 4e 61 6d  *zName;   /* Nam
4bb0: 65 20 77 65 20 61 72 65 20 73 65 61 72 63 68 69  e we are searchi
4bc0: 6e 67 20 66 6f 72 20 2a 2f 0a 0a 20 20 7a 4e 61  ng for */..  zNa
4bd0: 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65  me = sqlite3Name
4be0: 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 4e  FromToken(db, pN
4bf0: 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a 4e 61 6d  ame);.  if( zNam
4c00: 65 20 29 7b 0a 20 20 20 20 6e 20 3d 20 73 74 72  e ){.    n = str
4c10: 6c 65 6e 28 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  len(zName);.    
4c20: 66 6f 72 28 69 3d 28 64 62 2d 3e 6e 44 62 2d 31  for(i=(db->nDb-1
4c30: 29 2c 20 70 44 62 3d 26 64 62 2d 3e 61 44 62 5b  ), pDb=&db->aDb[
4c40: 69 5d 3b 20 69 3e 3d 30 3b 20 69 2d 2d 2c 20 70  i]; i>=0; i--, p
4c50: 44 62 2d 2d 29 7b 0a 20 20 20 20 20 20 69 66 28  Db--){.      if(
4c60: 20 28 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20 7c   (!OMIT_TEMPDB |
4c70: 7c 20 69 21 3d 31 20 29 20 26 26 20 6e 3d 3d 73  | i!=1 ) && n==s
4c80: 74 72 6c 65 6e 28 70 44 62 2d 3e 7a 4e 61 6d 65  trlen(pDb->zName
4c90: 29 20 26 26 20 0a 20 20 20 20 20 20 20 20 20 20  ) && .          
4ca0: 30 3d 3d 73 71 6c 69 74 65 33 53 74 72 49 43 6d  0==sqlite3StrICm
4cb0: 70 28 70 44 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 4e  p(pDb->zName, zN
4cc0: 61 6d 65 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ame) ){.        
4cd0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
4ce0: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
4cf0: 44 62 46 72 65 65 28 64 62 2c 20 7a 4e 61 6d 65  DbFree(db, zName
4d00: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
4d10: 69 3b 0a 7d 0a 0a 2f 2a 20 54 68 65 20 74 61 62  i;.}../* The tab
4d20: 6c 65 20 6f 72 20 76 69 65 77 20 6f 72 20 74 72  le or view or tr
4d30: 69 67 67 65 72 20 6e 61 6d 65 20 69 73 20 70 61  igger name is pa
4d40: 73 73 65 64 20 74 6f 20 74 68 69 73 20 72 6f 75  ssed to this rou
4d50: 74 69 6e 65 20 76 69 61 20 74 6f 6b 65 6e 73 0a  tine via tokens.
4d60: 2a 2a 20 70 4e 61 6d 65 31 20 61 6e 64 20 70 4e  ** pName1 and pN
4d70: 61 6d 65 32 2e 20 49 66 20 74 68 65 20 74 61 62  ame2. If the tab
4d80: 6c 65 20 6e 61 6d 65 20 77 61 73 20 66 75 6c 6c  le name was full
4d90: 79 20 71 75 61 6c 69 66 69 65 64 2c 20 66 6f 72  y qualified, for
4da0: 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20   example:.**.** 
4db0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 78 78 78  CREATE TABLE xxx
4dc0: 2e 79 79 79 20 28 2e 2e 2e 29 3b 0a 2a 2a 20 0a  .yyy (...);.** .
4dd0: 2a 2a 20 54 68 65 6e 20 70 4e 61 6d 65 31 20 69  ** Then pName1 i
4de0: 73 20 73 65 74 20 74 6f 20 22 78 78 78 22 20 61  s set to "xxx" a
4df0: 6e 64 20 70 4e 61 6d 65 32 20 22 79 79 79 22 2e  nd pName2 "yyy".
4e00: 20 4f 6e 20 74 68 65 20 6f 74 68 65 72 20 68 61   On the other ha
4e10: 6e 64 20 69 66 0a 2a 2a 20 74 68 65 20 74 61 62  nd if.** the tab
4e20: 6c 65 20 6e 61 6d 65 20 69 73 20 6e 6f 74 20 66  le name is not f
4e30: 75 6c 6c 79 20 71 75 61 6c 69 66 69 65 64 2c 20  ully qualified, 
4e40: 69 2e 65 2e 3a 0a 2a 2a 0a 2a 2a 20 43 52 45 41  i.e.:.**.** CREA
4e50: 54 45 20 54 41 42 4c 45 20 79 79 79 28 2e 2e 2e  TE TABLE yyy(...
4e60: 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 70 4e  );.**.** Then pN
4e70: 61 6d 65 31 20 69 73 20 73 65 74 20 74 6f 20 22  ame1 is set to "
4e80: 79 79 79 22 20 61 6e 64 20 70 4e 61 6d 65 32 20  yyy" and pName2 
4e90: 69 73 20 22 22 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  is ""..**.** Thi
4ea0: 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20 74  s routine sets t
4eb0: 68 65 20 2a 70 70 55 6e 71 75 61 6c 20 70 6f 69  he *ppUnqual poi
4ec0: 6e 74 65 72 20 74 6f 20 70 6f 69 6e 74 20 61 74  nter to point at
4ed0: 20 74 68 65 20 74 6f 6b 65 6e 20 28 70 4e 61 6d   the token (pNam
4ee0: 65 31 20 6f 72 0a 2a 2a 20 70 4e 61 6d 65 32 29  e1 or.** pName2)
4ef0: 20 74 68 61 74 20 73 74 6f 72 65 73 20 74 68 65   that stores the
4f00: 20 75 6e 71 75 61 6c 69 66 69 65 64 20 74 61 62   unqualified tab
4f10: 6c 65 20 6e 61 6d 65 2e 20 20 54 68 65 20 69 6e  le name.  The in
4f20: 64 65 78 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61  dex of the.** da
4f30: 74 61 62 61 73 65 20 22 78 78 78 22 20 69 73 20  tabase "xxx" is 
4f40: 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74  returned..*/.int
4f50: 20 73 71 6c 69 74 65 33 54 77 6f 50 61 72 74 4e   sqlite3TwoPartN
4f60: 61 6d 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ame(.  Parse *pP
4f70: 61 72 73 65 2c 20 20 20 20 20 20 2f 2a 20 50 61  arse,      /* Pa
4f80: 72 73 69 6e 67 20 61 6e 64 20 63 6f 64 65 20 67  rsing and code g
4f90: 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65 78  enerating contex
4fa0: 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e  t */.  Token *pN
4fb0: 61 6d 65 31 2c 20 20 20 20 20 20 2f 2a 20 54 68  ame1,      /* Th
4fc0: 65 20 22 78 78 78 22 20 69 6e 20 74 68 65 20 6e  e "xxx" in the n
4fd0: 61 6d 65 20 22 78 78 78 2e 79 79 79 22 20 6f 72  ame "xxx.yyy" or
4fe0: 20 22 78 78 78 22 20 2a 2f 0a 20 20 54 6f 6b 65   "xxx" */.  Toke
4ff0: 6e 20 2a 70 4e 61 6d 65 32 2c 20 20 20 20 20 20  n *pName2,      
5000: 2f 2a 20 54 68 65 20 22 79 79 79 22 20 69 6e 20  /* The "yyy" in 
5010: 74 68 65 20 6e 61 6d 65 20 22 78 78 78 2e 79 79  the name "xxx.yy
5020: 79 22 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 2a  y" */.  Token **
5030: 70 55 6e 71 75 61 6c 20 20 20 20 20 2f 2a 20 57  pUnqual     /* W
5040: 72 69 74 65 20 74 68 65 20 75 6e 71 75 61 6c 69  rite the unquali
5050: 66 69 65 64 20 6f 62 6a 65 63 74 20 6e 61 6d 65  fied object name
5060: 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e   here */.){.  in
5070: 74 20 69 44 62 3b 20 20 20 20 20 20 20 20 20 20  t iDb;          
5080: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74            /* Dat
5090: 61 62 61 73 65 20 68 6f 6c 64 69 6e 67 20 74 68  abase holding th
50a0: 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 73 71  e object */.  sq
50b0: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
50c0: 73 65 2d 3e 64 62 3b 0a 0a 20 20 69 66 28 20 70  se->db;..  if( p
50d0: 4e 61 6d 65 32 20 26 26 20 70 4e 61 6d 65 32 2d  Name2 && pName2-
50e0: 3e 6e 3e 30 20 29 7b 0a 20 20 20 20 61 73 73 65  >n>0 ){.    asse
50f0: 72 74 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75  rt( !db->init.bu
5100: 73 79 20 29 3b 0a 20 20 20 20 2a 70 55 6e 71 75  sy );.    *pUnqu
5110: 61 6c 20 3d 20 70 4e 61 6d 65 32 3b 0a 20 20 20  al = pName2;.   
5120: 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 46 69   iDb = sqlite3Fi
5130: 6e 64 44 62 28 64 62 2c 20 70 4e 61 6d 65 31 29  ndDb(db, pName1)
5140: 3b 0a 20 20 20 20 69 66 28 20 69 44 62 3c 30 20  ;.    if( iDb<0 
5150: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
5160: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
5170: 20 22 75 6e 6b 6e 6f 77 6e 20 64 61 74 61 62 61   "unknown databa
5180: 73 65 20 25 54 22 2c 20 70 4e 61 6d 65 31 29 3b  se %T", pName1);
5190: 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  .      pParse->n
51a0: 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 72 65 74  Err++;.      ret
51b0: 75 72 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20  urn -1;.    }.  
51c0: 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72  }else{.    asser
51d0: 74 28 20 64 62 2d 3e 69 6e 69 74 2e 69 44 62 3d  t( db->init.iDb=
51e0: 3d 30 20 7c 7c 20 64 62 2d 3e 69 6e 69 74 2e 62  =0 || db->init.b
51f0: 75 73 79 20 29 3b 0a 20 20 20 20 69 44 62 20 3d  usy );.    iDb =
5200: 20 64 62 2d 3e 69 6e 69 74 2e 69 44 62 3b 0a 20   db->init.iDb;. 
5210: 20 20 20 2a 70 55 6e 71 75 61 6c 20 3d 20 70 4e     *pUnqual = pN
5220: 61 6d 65 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75  ame1;.  }.  retu
5230: 72 6e 20 69 44 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  rn iDb;.}../*.**
5240: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
5250: 20 75 73 65 64 20 74 6f 20 63 68 65 63 6b 20 69   used to check i
5260: 66 20 74 68 65 20 55 54 46 2d 38 20 73 74 72 69  f the UTF-8 stri
5270: 6e 67 20 7a 4e 61 6d 65 20 69 73 20 61 20 6c 65  ng zName is a le
5280: 67 61 6c 0a 2a 2a 20 75 6e 71 75 61 6c 69 66 69  gal.** unqualifi
5290: 65 64 20 6e 61 6d 65 20 66 6f 72 20 61 20 6e 65  ed name for a ne
52a0: 77 20 73 63 68 65 6d 61 20 6f 62 6a 65 63 74 20  w schema object 
52b0: 28 74 61 62 6c 65 2c 20 69 6e 64 65 78 2c 20 76  (table, index, v
52c0: 69 65 77 20 6f 72 0a 2a 2a 20 74 72 69 67 67 65  iew or.** trigge
52d0: 72 29 2e 20 41 6c 6c 20 6e 61 6d 65 73 20 61 72  r). All names ar
52e0: 65 20 6c 65 67 61 6c 20 65 78 63 65 70 74 20 74  e legal except t
52f0: 68 6f 73 65 20 74 68 61 74 20 62 65 67 69 6e 20  hose that begin 
5300: 77 69 74 68 20 74 68 65 20 73 74 72 69 6e 67 0a  with the string.
5310: 2a 2a 20 22 73 71 6c 69 74 65 5f 22 20 28 69 6e  ** "sqlite_" (in
5320: 20 75 70 70 65 72 2c 20 6c 6f 77 65 72 20 6f 72   upper, lower or
5330: 20 6d 69 78 65 64 20 63 61 73 65 29 2e 20 54 68   mixed case). Th
5340: 69 73 20 70 6f 72 74 69 6f 6e 20 6f 66 20 74 68  is portion of th
5350: 65 20 6e 61 6d 65 73 70 61 63 65 0a 2a 2a 20 69  e namespace.** i
5360: 73 20 72 65 73 65 72 76 65 64 20 66 6f 72 20 69  s reserved for i
5370: 6e 74 65 72 6e 61 6c 20 75 73 65 2e 0a 2a 2f 0a  nternal use..*/.
5380: 69 6e 74 20 73 71 6c 69 74 65 33 43 68 65 63 6b  int sqlite3Check
5390: 4f 62 6a 65 63 74 4e 61 6d 65 28 50 61 72 73 65  ObjectName(Parse
53a0: 20 2a 70 50 61 72 73 65 2c 20 63 6f 6e 73 74 20   *pParse, const 
53b0: 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20  char *zName){.  
53c0: 69 66 28 20 21 70 50 61 72 73 65 2d 3e 64 62 2d  if( !pParse->db-
53d0: 3e 69 6e 69 74 2e 62 75 73 79 20 26 26 20 70 50  >init.busy && pP
53e0: 61 72 73 65 2d 3e 6e 65 73 74 65 64 3d 3d 30 20  arse->nested==0 
53f0: 0a 20 20 20 20 20 20 20 20 20 20 26 26 20 28 70  .          && (p
5400: 50 61 72 73 65 2d 3e 64 62 2d 3e 66 6c 61 67 73  Parse->db->flags
5410: 20 26 20 53 51 4c 49 54 45 5f 57 72 69 74 65 53   & SQLITE_WriteS
5420: 63 68 65 6d 61 29 3d 3d 30 0a 20 20 20 20 20 20  chema)==0.      
5430: 20 20 20 20 26 26 20 30 3d 3d 73 71 6c 69 74 65      && 0==sqlite
5440: 33 53 74 72 4e 49 43 6d 70 28 7a 4e 61 6d 65 2c  3StrNICmp(zName,
5450: 20 22 73 71 6c 69 74 65 5f 22 2c 20 37 29 20 29   "sqlite_", 7) )
5460: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
5470: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6f  orMsg(pParse, "o
5480: 62 6a 65 63 74 20 6e 61 6d 65 20 72 65 73 65 72  bject name reser
5490: 76 65 64 20 66 6f 72 20 69 6e 74 65 72 6e 61 6c  ved for internal
54a0: 20 75 73 65 3a 20 25 73 22 2c 20 7a 4e 61 6d 65   use: %s", zName
54b0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
54c0: 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a  LITE_ERROR;.  }.
54d0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
54e0: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65 67  OK;.}../*.** Beg
54f0: 69 6e 20 63 6f 6e 73 74 72 75 63 74 69 6e 67 20  in constructing 
5500: 61 20 6e 65 77 20 74 61 62 6c 65 20 72 65 70 72  a new table repr
5510: 65 73 65 6e 74 61 74 69 6f 6e 20 69 6e 20 6d 65  esentation in me
5520: 6d 6f 72 79 2e 20 20 54 68 69 73 20 69 73 0a 2a  mory.  This is.*
5530: 2a 20 74 68 65 20 66 69 72 73 74 20 6f 66 20 73  * the first of s
5540: 65 76 65 72 61 6c 20 61 63 74 69 6f 6e 20 72 6f  everal action ro
5550: 75 74 69 6e 65 73 20 74 68 61 74 20 67 65 74 20  utines that get 
5560: 63 61 6c 6c 65 64 20 69 6e 20 72 65 73 70 6f 6e  called in respon
5570: 73 65 0a 2a 2a 20 74 6f 20 61 20 43 52 45 41 54  se.** to a CREAT
5580: 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e  E TABLE statemen
5590: 74 2e 20 20 49 6e 20 70 61 72 74 69 63 75 6c 61  t.  In particula
55a0: 72 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  r, this routine 
55b0: 69 73 20 63 61 6c 6c 65 64 0a 2a 2a 20 61 66 74  is called.** aft
55c0: 65 72 20 73 65 65 69 6e 67 20 74 6f 6b 65 6e 73  er seeing tokens
55d0: 20 22 43 52 45 41 54 45 22 20 61 6e 64 20 22 54   "CREATE" and "T
55e0: 41 42 4c 45 22 20 61 6e 64 20 74 68 65 20 74 61  ABLE" and the ta
55f0: 62 6c 65 20 6e 61 6d 65 2e 20 54 68 65 20 69 73  ble name. The is
5600: 54 65 6d 70 0a 2a 2a 20 66 6c 61 67 20 69 73 20  Temp.** flag is 
5610: 74 72 75 65 20 69 66 20 74 68 65 20 74 61 62 6c  true if the tabl
5620: 65 20 73 68 6f 75 6c 64 20 62 65 20 73 74 6f 72  e should be stor
5630: 65 64 20 69 6e 20 74 68 65 20 61 75 78 69 6c 69  ed in the auxili
5640: 61 72 79 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  ary database.** 
5650: 66 69 6c 65 20 69 6e 73 74 65 61 64 20 6f 66 20  file instead of 
5660: 69 6e 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61  in the main data
5670: 62 61 73 65 20 66 69 6c 65 2e 20 20 54 68 69 73  base file.  This
5680: 20 69 73 20 6e 6f 72 6d 61 6c 6c 79 20 74 68 65   is normally the
5690: 20 63 61 73 65 0a 2a 2a 20 77 68 65 6e 20 74 68   case.** when th
56a0: 65 20 22 54 45 4d 50 22 20 6f 72 20 22 54 45 4d  e "TEMP" or "TEM
56b0: 50 4f 52 41 52 59 22 20 6b 65 79 77 6f 72 64 20  PORARY" keyword 
56c0: 6f 63 63 75 72 73 20 69 6e 20 62 65 74 77 65 65  occurs in betwee
56d0: 6e 0a 2a 2a 20 43 52 45 41 54 45 20 61 6e 64 20  n.** CREATE and 
56e0: 54 41 42 4c 45 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  TABLE..**.** The
56f0: 20 6e 65 77 20 74 61 62 6c 65 20 72 65 63 6f 72   new table recor
5700: 64 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64  d is initialized
5710: 20 61 6e 64 20 70 75 74 20 69 6e 20 70 50 61 72   and put in pPar
5720: 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 2e 0a 2a  se->pNewTable..*
5730: 2a 20 41 73 20 6d 6f 72 65 20 6f 66 20 74 68 65  * As more of the
5740: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74   CREATE TABLE st
5750: 61 74 65 6d 65 6e 74 20 69 73 20 70 61 72 73 65  atement is parse
5760: 64 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20 61 63  d, additional ac
5770: 74 69 6f 6e 0a 2a 2a 20 72 6f 75 74 69 6e 65 73  tion.** routines
5780: 20 77 69 6c 6c 20 62 65 20 63 61 6c 6c 65 64 20   will be called 
5790: 74 6f 20 61 64 64 20 6d 6f 72 65 20 69 6e 66 6f  to add more info
57a0: 72 6d 61 74 69 6f 6e 20 74 6f 20 74 68 69 73 20  rmation to this 
57b0: 72 65 63 6f 72 64 2e 0a 2a 2a 20 41 74 20 74 68  record..** At th
57c0: 65 20 65 6e 64 20 6f 66 20 74 68 65 20 43 52 45  e end of the CRE
57d0: 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d  ATE TABLE statem
57e0: 65 6e 74 2c 20 74 68 65 20 73 71 6c 69 74 65 33  ent, the sqlite3
57f0: 45 6e 64 54 61 62 6c 65 28 29 20 72 6f 75 74 69  EndTable() routi
5800: 6e 65 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64 20  ne.** is called 
5810: 74 6f 20 63 6f 6d 70 6c 65 74 65 20 74 68 65 20  to complete the 
5820: 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 6f 66 20  construction of 
5830: 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20 72 65  the new table re
5840: 63 6f 72 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  cord..*/.void sq
5850: 6c 69 74 65 33 53 74 61 72 74 54 61 62 6c 65 28  lite3StartTable(
5860: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
5870: 2c 20 20 20 2f 2a 20 50 61 72 73 65 72 20 63 6f  ,   /* Parser co
5880: 6e 74 65 78 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e  ntext */.  Token
5890: 20 2a 70 4e 61 6d 65 31 2c 20 20 20 2f 2a 20 46   *pName1,   /* F
58a0: 69 72 73 74 20 70 61 72 74 20 6f 66 20 74 68 65  irst part of the
58b0: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62   name of the tab
58c0: 6c 65 20 6f 72 20 76 69 65 77 20 2a 2f 0a 20 20  le or view */.  
58d0: 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32 2c 20 20  Token *pName2,  
58e0: 20 2f 2a 20 53 65 63 6f 6e 64 20 70 61 72 74 20   /* Second part 
58f0: 6f 66 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  of the name of t
5900: 68 65 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77  he table or view
5910: 20 2a 2f 0a 20 20 69 6e 74 20 69 73 54 65 6d 70   */.  int isTemp
5920: 2c 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69  ,      /* True i
5930: 66 20 74 68 69 73 20 69 73 20 61 20 54 45 4d 50  f this is a TEMP
5940: 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20   table */.  int 
5950: 69 73 56 69 65 77 2c 20 20 20 20 20 20 2f 2a 20  isView,      /* 
5960: 54 72 75 65 20 69 66 20 74 68 69 73 20 69 73 20  True if this is 
5970: 61 20 56 49 45 57 20 2a 2f 0a 20 20 69 6e 74 20  a VIEW */.  int 
5980: 69 73 56 69 72 74 75 61 6c 2c 20 20 20 2f 2a 20  isVirtual,   /* 
5990: 54 72 75 65 20 69 66 20 74 68 69 73 20 69 73 20  True if this is 
59a0: 61 20 56 49 52 54 55 41 4c 20 74 61 62 6c 65 20  a VIRTUAL table 
59b0: 2a 2f 0a 20 20 69 6e 74 20 6e 6f 45 72 72 20 20  */.  int noErr  
59c0: 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 68        /* Do noth
59d0: 69 6e 67 20 69 66 20 74 61 62 6c 65 20 61 6c 72  ing if table alr
59e0: 65 61 64 79 20 65 78 69 73 74 73 20 2a 2f 0a 29  eady exists */.)
59f0: 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 6c  {.  Table *pTabl
5a00: 65 3b 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65  e;.  char *zName
5a10: 20 3d 20 30 3b 20 2f 2a 20 54 68 65 20 6e 61 6d   = 0; /* The nam
5a20: 65 20 6f 66 20 74 68 65 20 6e 65 77 20 74 61 62  e of the new tab
5a30: 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  le */.  sqlite3 
5a40: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
5a50: 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 69  ;.  Vdbe *v;.  i
5a60: 6e 74 20 69 44 62 3b 20 20 20 20 20 20 20 20 20  nt iDb;         
5a70: 2f 2a 20 44 61 74 61 62 61 73 65 20 6e 75 6d 62  /* Database numb
5a80: 65 72 20 74 6f 20 63 72 65 61 74 65 20 74 68 65  er to create the
5a90: 20 74 61 62 6c 65 20 69 6e 20 2a 2f 0a 20 20 54   table in */.  T
5aa0: 6f 6b 65 6e 20 2a 70 4e 61 6d 65 3b 20 20 20 20  oken *pName;    
5ab0: 2f 2a 20 55 6e 71 75 61 6c 69 66 69 65 64 20 6e  /* Unqualified n
5ac0: 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65  ame of the table
5ad0: 20 74 6f 20 63 72 65 61 74 65 20 2a 2f 0a 0a 20   to create */.. 
5ae0: 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 6f 72   /* The table or
5af0: 20 76 69 65 77 20 6e 61 6d 65 20 74 6f 20 63 72   view name to cr
5b00: 65 61 74 65 20 69 73 20 70 61 73 73 65 64 20 74  eate is passed t
5b10: 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 76  o this routine v
5b20: 69 61 20 74 6f 6b 65 6e 73 0a 20 20 2a 2a 20 70  ia tokens.  ** p
5b30: 4e 61 6d 65 31 20 61 6e 64 20 70 4e 61 6d 65 32  Name1 and pName2
5b40: 2e 20 49 66 20 74 68 65 20 74 61 62 6c 65 20 6e  . If the table n
5b50: 61 6d 65 20 77 61 73 20 66 75 6c 6c 79 20 71 75  ame was fully qu
5b60: 61 6c 69 66 69 65 64 2c 20 66 6f 72 20 65 78 61  alified, for exa
5b70: 6d 70 6c 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  mple:.  **.  ** 
5b80: 43 52 45 41 54 45 20 54 41 42 4c 45 20 78 78 78  CREATE TABLE xxx
5b90: 2e 79 79 79 20 28 2e 2e 2e 29 3b 0a 20 20 2a 2a  .yyy (...);.  **
5ba0: 20 0a 20 20 2a 2a 20 54 68 65 6e 20 70 4e 61 6d   .  ** Then pNam
5bb0: 65 31 20 69 73 20 73 65 74 20 74 6f 20 22 78 78  e1 is set to "xx
5bc0: 78 22 20 61 6e 64 20 70 4e 61 6d 65 32 20 22 79  x" and pName2 "y
5bd0: 79 79 22 2e 20 4f 6e 20 74 68 65 20 6f 74 68 65  yy". On the othe
5be0: 72 20 68 61 6e 64 20 69 66 0a 20 20 2a 2a 20 74  r hand if.  ** t
5bf0: 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 69 73  he table name is
5c00: 20 6e 6f 74 20 66 75 6c 6c 79 20 71 75 61 6c 69   not fully quali
5c10: 66 69 65 64 2c 20 69 2e 65 2e 3a 0a 20 20 2a 2a  fied, i.e.:.  **
5c20: 0a 20 20 2a 2a 20 43 52 45 41 54 45 20 54 41 42  .  ** CREATE TAB
5c30: 4c 45 20 79 79 79 28 2e 2e 2e 29 3b 0a 20 20 2a  LE yyy(...);.  *
5c40: 2a 0a 20 20 2a 2a 20 54 68 65 6e 20 70 4e 61 6d  *.  ** Then pNam
5c50: 65 31 20 69 73 20 73 65 74 20 74 6f 20 22 79 79  e1 is set to "yy
5c60: 79 22 20 61 6e 64 20 70 4e 61 6d 65 32 20 69 73  y" and pName2 is
5c70: 20 22 22 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54   ""..  **.  ** T
5c80: 68 65 20 63 61 6c 6c 20 62 65 6c 6f 77 20 73 65  he call below se
5c90: 74 73 20 74 68 65 20 70 4e 61 6d 65 20 70 6f 69  ts the pName poi
5ca0: 6e 74 65 72 20 74 6f 20 70 6f 69 6e 74 20 61 74  nter to point at
5cb0: 20 74 68 65 20 74 6f 6b 65 6e 20 28 70 4e 61 6d   the token (pNam
5cc0: 65 31 20 6f 72 0a 20 20 2a 2a 20 70 4e 61 6d 65  e1 or.  ** pName
5cd0: 32 29 20 74 68 61 74 20 73 74 6f 72 65 73 20 74  2) that stores t
5ce0: 68 65 20 75 6e 71 75 61 6c 69 66 69 65 64 20 74  he unqualified t
5cf0: 61 62 6c 65 20 6e 61 6d 65 2e 20 54 68 65 20 76  able name. The v
5d00: 61 72 69 61 62 6c 65 20 69 44 62 20 69 73 0a 20  ariable iDb is. 
5d10: 20 2a 2a 20 73 65 74 20 74 6f 20 74 68 65 20 69   ** set to the i
5d20: 6e 64 65 78 20 6f 66 20 74 68 65 20 64 61 74 61  ndex of the data
5d30: 62 61 73 65 20 74 68 61 74 20 74 68 65 20 74 61  base that the ta
5d40: 62 6c 65 20 6f 72 20 76 69 65 77 20 69 73 20 74  ble or view is t
5d50: 6f 20 62 65 0a 20 20 2a 2a 20 63 72 65 61 74 65  o be.  ** create
5d60: 64 20 69 6e 2e 0a 20 20 2a 2f 0a 20 20 69 44 62  d in..  */.  iDb
5d70: 20 3d 20 73 71 6c 69 74 65 33 54 77 6f 50 61 72   = sqlite3TwoPar
5d80: 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 70 4e  tName(pParse, pN
5d90: 61 6d 65 31 2c 20 70 4e 61 6d 65 32 2c 20 26 70  ame1, pName2, &p
5da0: 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 69 44 62  Name);.  if( iDb
5db0: 3c 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69  <0 ) return;.  i
5dc0: 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20  f( !OMIT_TEMPDB 
5dd0: 26 26 20 69 73 54 65 6d 70 20 26 26 20 69 44 62  && isTemp && iDb
5de0: 3e 31 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20  >1 ){.    /* If 
5df0: 63 72 65 61 74 69 6e 67 20 61 20 74 65 6d 70 20  creating a temp 
5e00: 74 61 62 6c 65 2c 20 74 68 65 20 6e 61 6d 65 20  table, the name 
5e10: 6d 61 79 20 6e 6f 74 20 62 65 20 71 75 61 6c 69  may not be quali
5e20: 66 69 65 64 20 2a 2f 0a 20 20 20 20 73 71 6c 69  fied */.    sqli
5e30: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
5e40: 73 65 2c 20 22 74 65 6d 70 6f 72 61 72 79 20 74  se, "temporary t
5e50: 61 62 6c 65 20 6e 61 6d 65 20 6d 75 73 74 20 62  able name must b
5e60: 65 20 75 6e 71 75 61 6c 69 66 69 65 64 22 29 3b  e unqualified");
5e70: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
5e80: 0a 20 20 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d  .  if( !OMIT_TEM
5e90: 50 44 42 20 26 26 20 69 73 54 65 6d 70 20 29 20  PDB && isTemp ) 
5ea0: 69 44 62 20 3d 20 31 3b 0a 0a 20 20 70 50 61 72  iDb = 1;..  pPar
5eb0: 73 65 2d 3e 73 4e 61 6d 65 54 6f 6b 65 6e 20 3d  se->sNameToken =
5ec0: 20 2a 70 4e 61 6d 65 3b 0a 20 20 7a 4e 61 6d 65   *pName;.  zName
5ed0: 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72   = sqlite3NameFr
5ee0: 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 4e 61 6d  omToken(db, pNam
5ef0: 65 29 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65 3d  e);.  if( zName=
5f00: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69  =0 ) return;.  i
5f10: 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71  f( SQLITE_OK!=sq
5f20: 6c 69 74 65 33 43 68 65 63 6b 4f 62 6a 65 63 74  lite3CheckObject
5f30: 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 7a 4e 61  Name(pParse, zNa
5f40: 6d 65 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  me) ){.    goto 
5f50: 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f  begin_table_erro
5f60: 72 3b 0a 20 20 7d 0a 20 20 69 66 28 20 64 62 2d  r;.  }.  if( db-
5f70: 3e 69 6e 69 74 2e 69 44 62 3d 3d 31 20 29 20 69  >init.iDb==1 ) i
5f80: 73 54 65 6d 70 20 3d 20 31 3b 0a 23 69 66 6e 64  sTemp = 1;.#ifnd
5f90: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
5fa0: 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 61  UTHORIZATION.  a
5fb0: 73 73 65 72 74 28 20 28 69 73 54 65 6d 70 20 26  ssert( (isTemp &
5fc0: 20 31 29 3d 3d 69 73 54 65 6d 70 20 29 3b 0a 20   1)==isTemp );. 
5fd0: 20 7b 0a 20 20 20 20 69 6e 74 20 63 6f 64 65 3b   {.    int code;
5fe0: 0a 20 20 20 20 63 68 61 72 20 2a 7a 44 62 20 3d  .    char *zDb =
5ff0: 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e   db->aDb[iDb].zN
6000: 61 6d 65 3b 0a 20 20 20 20 69 66 28 20 73 71 6c  ame;.    if( sql
6010: 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50  ite3AuthCheck(pP
6020: 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 49 4e 53  arse, SQLITE_INS
6030: 45 52 54 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c  ERT, SCHEMA_TABL
6040: 45 28 69 73 54 65 6d 70 29 2c 20 30 2c 20 7a 44  E(isTemp), 0, zD
6050: 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  b) ){.      goto
6060: 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72   begin_table_err
6070: 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  or;.    }.    if
6080: 28 20 69 73 56 69 65 77 20 29 7b 0a 20 20 20 20  ( isView ){.    
6090: 20 20 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50    if( !OMIT_TEMP
60a0: 44 42 20 26 26 20 69 73 54 65 6d 70 20 29 7b 0a  DB && isTemp ){.
60b0: 20 20 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53          code = S
60c0: 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 45 4d  QLITE_CREATE_TEM
60d0: 50 5f 56 49 45 57 3b 0a 20 20 20 20 20 20 7d 65  P_VIEW;.      }e
60e0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 63 6f 64  lse{.        cod
60f0: 65 20 3d 20 53 51 4c 49 54 45 5f 43 52 45 41 54  e = SQLITE_CREAT
6100: 45 5f 56 49 45 57 3b 0a 20 20 20 20 20 20 7d 0a  E_VIEW;.      }.
6110: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
6120: 20 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44   if( !OMIT_TEMPD
6130: 42 20 26 26 20 69 73 54 65 6d 70 20 29 7b 0a 20  B && isTemp ){. 
6140: 20 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51         code = SQ
6150: 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 45 4d 50  LITE_CREATE_TEMP
6160: 5f 54 41 42 4c 45 3b 0a 20 20 20 20 20 20 7d 65  _TABLE;.      }e
6170: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 63 6f 64  lse{.        cod
6180: 65 20 3d 20 53 51 4c 49 54 45 5f 43 52 45 41 54  e = SQLITE_CREAT
6190: 45 5f 54 41 42 4c 45 3b 0a 20 20 20 20 20 20 7d  E_TABLE;.      }
61a0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21  .    }.    if( !
61b0: 69 73 56 69 72 74 75 61 6c 20 26 26 20 73 71 6c  isVirtual && sql
61c0: 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50  ite3AuthCheck(pP
61d0: 61 72 73 65 2c 20 63 6f 64 65 2c 20 7a 4e 61 6d  arse, code, zNam
61e0: 65 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20  e, 0, zDb) ){.  
61f0: 20 20 20 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74      goto begin_t
6200: 61 62 6c 65 5f 65 72 72 6f 72 3b 0a 20 20 20 20  able_error;.    
6210: 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  }.  }.#endif..  
6220: 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  /* Make sure the
6230: 20 6e 65 77 20 74 61 62 6c 65 20 6e 61 6d 65 20   new table name 
6240: 64 6f 65 73 20 6e 6f 74 20 63 6f 6c 6c 69 64 65  does not collide
6250: 20 77 69 74 68 20 61 6e 20 65 78 69 73 74 69 6e   with an existin
6260: 67 0a 20 20 2a 2a 20 69 6e 64 65 78 20 6f 72 20  g.  ** index or 
6270: 74 61 62 6c 65 20 6e 61 6d 65 20 69 6e 20 74 68  table name in th
6280: 65 20 73 61 6d 65 20 64 61 74 61 62 61 73 65 2e  e same database.
6290: 20 20 49 73 73 75 65 20 61 6e 20 65 72 72 6f 72    Issue an error
62a0: 20 6d 65 73 73 61 67 65 20 69 66 0a 20 20 2a 2a   message if.  **
62b0: 20 69 74 20 64 6f 65 73 2e 20 54 68 65 20 65 78   it does. The ex
62c0: 63 65 70 74 69 6f 6e 20 69 73 20 69 66 20 74 68  ception is if th
62d0: 65 20 73 74 61 74 65 6d 65 6e 74 20 62 65 69 6e  e statement bein
62e0: 67 20 70 61 72 73 65 64 20 77 61 73 20 70 61 73  g parsed was pas
62f0: 73 65 64 0a 20 20 2a 2a 20 74 6f 20 61 6e 20 73  sed.  ** to an s
6300: 71 6c 69 74 65 33 5f 64 65 63 6c 61 72 65 5f 76  qlite3_declare_v
6310: 74 61 62 28 29 20 63 61 6c 6c 2e 20 49 6e 20 74  tab() call. In t
6320: 68 61 74 20 63 61 73 65 20 6f 6e 6c 79 20 74 68  hat case only th
6330: 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 0a 20  e column names. 
6340: 20 2a 2a 20 61 6e 64 20 74 79 70 65 73 20 77 69   ** and types wi
6350: 6c 6c 20 62 65 20 75 73 65 64 2c 20 73 6f 20 74  ll be used, so t
6360: 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 20  here is no need 
6370: 74 6f 20 74 65 73 74 20 66 6f 72 20 6e 61 6d 65  to test for name
6380: 73 70 61 63 65 0a 20 20 2a 2a 20 63 6f 6c 6c 69  space.  ** colli
6390: 73 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66  sions..  */.  if
63a0: 28 20 21 49 4e 5f 44 45 43 4c 41 52 45 5f 56 54  ( !IN_DECLARE_VT
63b0: 41 42 20 29 7b 0a 20 20 20 20 69 66 28 20 53 51  AB ){.    if( SQ
63c0: 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33  LITE_OK!=sqlite3
63d0: 52 65 61 64 53 63 68 65 6d 61 28 70 50 61 72 73  ReadSchema(pPars
63e0: 65 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  e) ){.      goto
63f0: 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72   begin_table_err
6400: 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 54  or;.    }.    pT
6410: 61 62 6c 65 20 3d 20 73 71 6c 69 74 65 33 46 69  able = sqlite3Fi
6420: 6e 64 54 61 62 6c 65 28 64 62 2c 20 7a 4e 61 6d  ndTable(db, zNam
6430: 65 2c 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e  e, db->aDb[iDb].
6440: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20  zName);.    if( 
6450: 70 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20  pTable ){.      
6460: 69 66 28 20 21 6e 6f 45 72 72 20 29 7b 0a 20 20  if( !noErr ){.  
6470: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
6480: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74  orMsg(pParse, "t
6490: 61 62 6c 65 20 25 54 20 61 6c 72 65 61 64 79 20  able %T already 
64a0: 65 78 69 73 74 73 22 2c 20 70 4e 61 6d 65 29 3b  exists", pName);
64b0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 67  .      }.      g
64c0: 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f  oto begin_table_
64d0: 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 20  error;.    }.   
64e0: 20 69 66 28 20 73 71 6c 69 74 65 33 46 69 6e 64   if( sqlite3Find
64f0: 49 6e 64 65 78 28 64 62 2c 20 7a 4e 61 6d 65 2c  Index(db, zName,
6500: 20 30 29 21 3d 30 20 26 26 20 28 69 44 62 3d 3d   0)!=0 && (iDb==
6510: 30 20 7c 7c 20 21 64 62 2d 3e 69 6e 69 74 2e 62  0 || !db->init.b
6520: 75 73 79 29 20 29 7b 0a 20 20 20 20 20 20 73 71  usy) ){.      sq
6530: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
6540: 61 72 73 65 2c 20 22 74 68 65 72 65 20 69 73 20  arse, "there is 
6550: 61 6c 72 65 61 64 79 20 61 6e 20 69 6e 64 65 78  already an index
6560: 20 6e 61 6d 65 64 20 25 73 22 2c 20 7a 4e 61 6d   named %s", zNam
6570: 65 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 62  e);.      goto b
6580: 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72  egin_table_error
6590: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70  ;.    }.  }..  p
65a0: 54 61 62 6c 65 20 3d 20 73 71 6c 69 74 65 33 44  Table = sqlite3D
65b0: 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20  bMallocZero(db, 
65c0: 73 69 7a 65 6f 66 28 54 61 62 6c 65 29 29 3b 0a  sizeof(Table));.
65d0: 20 20 69 66 28 20 70 54 61 62 6c 65 3d 3d 30 20    if( pTable==0 
65e0: 29 7b 0a 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f  ){.    db->mallo
65f0: 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20  cFailed = 1;.   
6600: 20 70 50 61 72 73 65 2d 3e 72 63 20 3d 20 53 51   pParse->rc = SQ
6610: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
6620: 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a  pParse->nErr++;.
6630: 20 20 20 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74      goto begin_t
6640: 61 62 6c 65 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a  able_error;.  }.
6650: 20 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 20    pTable->zName 
6660: 3d 20 7a 4e 61 6d 65 3b 0a 20 20 70 54 61 62 6c  = zName;.  pTabl
6670: 65 2d 3e 69 50 4b 65 79 20 3d 20 2d 31 3b 0a 20  e->iPKey = -1;. 
6680: 20 70 54 61 62 6c 65 2d 3e 70 53 63 68 65 6d 61   pTable->pSchema
6690: 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e   = db->aDb[iDb].
66a0: 70 53 63 68 65 6d 61 3b 0a 20 20 70 54 61 62 6c  pSchema;.  pTabl
66b0: 65 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20 70  e->nRef = 1;.  p
66c0: 54 61 62 6c 65 2d 3e 64 62 20 3d 20 64 62 3b 0a  Table->db = db;.
66d0: 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 70 4e    if( pParse->pN
66e0: 65 77 54 61 62 6c 65 20 29 20 73 71 6c 69 74 65  ewTable ) sqlite
66f0: 33 44 65 6c 65 74 65 54 61 62 6c 65 28 70 50 61  3DeleteTable(pPa
6700: 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3b  rse->pNewTable);
6710: 0a 20 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54  .  pParse->pNewT
6720: 61 62 6c 65 20 3d 20 70 54 61 62 6c 65 3b 0a 0a  able = pTable;..
6730: 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20    /* If this is 
6740: 74 68 65 20 6d 61 67 69 63 20 73 71 6c 69 74 65  the magic sqlite
6750: 5f 73 65 71 75 65 6e 63 65 20 74 61 62 6c 65 20  _sequence table 
6760: 75 73 65 64 20 62 79 20 61 75 74 6f 69 6e 63 72  used by autoincr
6770: 65 6d 65 6e 74 2c 0a 20 20 2a 2a 20 74 68 65 6e  ement,.  ** then
6780: 20 72 65 63 6f 72 64 20 61 20 70 6f 69 6e 74 65   record a pointe
6790: 72 20 74 6f 20 74 68 69 73 20 74 61 62 6c 65 20  r to this table 
67a0: 69 6e 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61  in the main data
67b0: 62 61 73 65 20 73 74 72 75 63 74 75 72 65 0a 20  base structure. 
67c0: 20 2a 2a 20 73 6f 20 74 68 61 74 20 49 4e 53 45   ** so that INSE
67d0: 52 54 20 63 61 6e 20 66 69 6e 64 20 74 68 65 20  RT can find the 
67e0: 74 61 62 6c 65 20 65 61 73 69 6c 79 2e 0a 20 20  table easily..  
67f0: 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
6800: 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 43 52 45  E_OMIT_AUTOINCRE
6810: 4d 45 4e 54 0a 20 20 69 66 28 20 21 70 50 61 72  MENT.  if( !pPar
6820: 73 65 2d 3e 6e 65 73 74 65 64 20 26 26 20 73 74  se->nested && st
6830: 72 63 6d 70 28 7a 4e 61 6d 65 2c 20 22 73 71 6c  rcmp(zName, "sql
6840: 69 74 65 5f 73 65 71 75 65 6e 63 65 22 29 3d 3d  ite_sequence")==
6850: 30 20 29 7b 0a 20 20 20 20 70 54 61 62 6c 65 2d  0 ){.    pTable-
6860: 3e 70 53 63 68 65 6d 61 2d 3e 70 53 65 71 54 61  >pSchema->pSeqTa
6870: 62 20 3d 20 70 54 61 62 6c 65 3b 0a 20 20 7d 0a  b = pTable;.  }.
6880: 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 42 65 67  #endif..  /* Beg
6890: 69 6e 20 67 65 6e 65 72 61 74 69 6e 67 20 74 68  in generating th
68a0: 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c  e code that will
68b0: 20 69 6e 73 65 72 74 20 74 68 65 20 74 61 62 6c   insert the tabl
68c0: 65 20 72 65 63 6f 72 64 20 69 6e 74 6f 0a 20 20  e record into.  
68d0: 2a 2a 20 74 68 65 20 53 51 4c 49 54 45 5f 4d 41  ** the SQLITE_MA
68e0: 53 54 45 52 20 74 61 62 6c 65 2e 20 20 4e 6f 74  STER table.  Not
68f0: 65 20 69 6e 20 70 61 72 74 69 63 75 6c 61 72 20  e in particular 
6900: 74 68 61 74 20 77 65 20 6d 75 73 74 20 67 6f 20  that we must go 
6910: 61 68 65 61 64 0a 20 20 2a 2a 20 61 6e 64 20 61  ahead.  ** and a
6920: 6c 6c 6f 63 61 74 65 20 74 68 65 20 72 65 63 6f  llocate the reco
6930: 72 64 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68  rd number for th
6940: 65 20 74 61 62 6c 65 20 65 6e 74 72 79 20 6e 6f  e table entry no
6950: 77 2e 20 20 42 65 66 6f 72 65 20 61 6e 79 0a 20  w.  Before any. 
6960: 20 2a 2a 20 50 52 49 4d 41 52 59 20 4b 45 59 20   ** PRIMARY KEY 
6970: 6f 72 20 55 4e 49 51 55 45 20 6b 65 79 77 6f 72  or UNIQUE keywor
6980: 64 73 20 61 72 65 20 70 61 72 73 65 64 2e 20 20  ds are parsed.  
6990: 54 68 6f 73 65 20 6b 65 79 77 6f 72 64 73 20 77  Those keywords w
69a0: 69 6c 6c 20 63 61 75 73 65 0a 20 20 2a 2a 20 69  ill cause.  ** i
69b0: 6e 64 69 63 65 73 20 74 6f 20 62 65 20 63 72 65  ndices to be cre
69c0: 61 74 65 64 20 61 6e 64 20 74 68 65 20 74 61 62  ated and the tab
69d0: 6c 65 20 72 65 63 6f 72 64 20 6d 75 73 74 20 63  le record must c
69e0: 6f 6d 65 20 62 65 66 6f 72 65 20 74 68 65 20 0a  ome before the .
69f0: 20 20 2a 2a 20 69 6e 64 69 63 65 73 2e 20 20 48    ** indices.  H
6a00: 65 6e 63 65 2c 20 74 68 65 20 72 65 63 6f 72 64  ence, the record
6a10: 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20   number for the 
6a20: 74 61 62 6c 65 20 6d 75 73 74 20 62 65 20 61 6c  table must be al
6a30: 6c 6f 63 61 74 65 64 0a 20 20 2a 2a 20 6e 6f 77  located.  ** now
6a40: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 64 62  ..  */.  if( !db
6a50: 2d 3e 69 6e 69 74 2e 62 75 73 79 20 26 26 20 28  ->init.busy && (
6a60: 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
6a70: 62 65 28 70 50 61 72 73 65 29 29 21 3d 30 20 29  be(pParse))!=0 )
6a80: 7b 0a 20 20 20 20 69 6e 74 20 6a 31 3b 0a 20 20  {.    int j1;.  
6a90: 20 20 69 6e 74 20 66 69 6c 65 46 6f 72 6d 61 74    int fileFormat
6aa0: 3b 0a 20 20 20 20 69 6e 74 20 72 65 67 31 2c 20  ;.    int reg1, 
6ab0: 72 65 67 32 2c 20 72 65 67 33 3b 0a 20 20 20 20  reg2, reg3;.    
6ac0: 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74  sqlite3BeginWrit
6ad0: 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73  eOperation(pPars
6ae0: 65 2c 20 30 2c 20 69 44 62 29 3b 0a 0a 23 69 66  e, 0, iDb);..#if
6af0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
6b00: 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20  _VIRTUALTABLE.  
6b10: 20 20 69 66 28 20 69 73 56 69 72 74 75 61 6c 20    if( isVirtual 
6b20: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
6b30: 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50  VdbeAddOp0(v, OP
6b40: 5f 56 42 65 67 69 6e 29 3b 0a 20 20 20 20 7d 0a  _VBegin);.    }.
6b50: 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 49  #endif..    /* I
6b60: 66 20 74 68 65 20 66 69 6c 65 20 66 6f 72 6d 61  f the file forma
6b70: 74 20 61 6e 64 20 65 6e 63 6f 64 69 6e 67 20 69  t and encoding i
6b80: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68  n the database h
6b90: 61 76 65 20 6e 6f 74 20 62 65 65 6e 20 73 65 74  ave not been set
6ba0: 2c 20 0a 20 20 20 20 2a 2a 20 73 65 74 20 74 68  , .    ** set th
6bb0: 65 6d 20 6e 6f 77 2e 0a 20 20 20 20 2a 2f 0a 20  em now..    */. 
6bc0: 20 20 20 72 65 67 31 20 3d 20 70 50 61 72 73 65     reg1 = pParse
6bd0: 2d 3e 72 65 67 52 6f 77 69 64 20 3d 20 2b 2b 70  ->regRowid = ++p
6be0: 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
6bf0: 20 72 65 67 32 20 3d 20 70 50 61 72 73 65 2d 3e   reg2 = pParse->
6c00: 72 65 67 52 6f 6f 74 20 3d 20 2b 2b 70 50 61 72  regRoot = ++pPar
6c10: 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 72 65  se->nMem;.    re
6c20: 67 33 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  g3 = ++pParse->n
6c30: 4d 65 6d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Mem;.    sqlite3
6c40: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
6c50: 5f 52 65 61 64 43 6f 6f 6b 69 65 2c 20 69 44 62  _ReadCookie, iDb
6c60: 2c 20 72 65 67 33 2c 20 31 29 3b 20 20 20 2f 2a  , reg3, 1);   /*
6c70: 20 66 69 6c 65 5f 66 6f 72 6d 61 74 20 2a 2f 0a   file_format */.
6c80: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 55      sqlite3VdbeU
6c90: 73 65 73 42 74 72 65 65 28 76 2c 20 69 44 62 29  sesBtree(v, iDb)
6ca0: 3b 0a 20 20 20 20 6a 31 20 3d 20 73 71 6c 69 74  ;.    j1 = sqlit
6cb0: 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
6cc0: 4f 50 5f 49 66 2c 20 72 65 67 33 29 3b 0a 20 20  OP_If, reg3);.  
6cd0: 20 20 66 69 6c 65 46 6f 72 6d 61 74 20 3d 20 28    fileFormat = (
6ce0: 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  db->flags & SQLI
6cf0: 54 45 5f 4c 65 67 61 63 79 46 69 6c 65 46 6d 74  TE_LegacyFileFmt
6d00: 29 21 3d 30 20 3f 0a 20 20 20 20 20 20 20 20 20  )!=0 ?.         
6d10: 20 20 20 20 20 20 20 20 20 31 20 3a 20 53 51 4c           1 : SQL
6d20: 49 54 45 5f 4d 41 58 5f 46 49 4c 45 5f 46 4f 52  ITE_MAX_FILE_FOR
6d30: 4d 41 54 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  MAT;.    sqlite3
6d40: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
6d50: 5f 49 6e 74 65 67 65 72 2c 20 66 69 6c 65 46 6f  _Integer, fileFo
6d60: 72 6d 61 74 2c 20 72 65 67 33 29 3b 0a 20 20 20  rmat, reg3);.   
6d70: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
6d80: 70 33 28 76 2c 20 4f 50 5f 53 65 74 43 6f 6f 6b  p3(v, OP_SetCook
6d90: 69 65 2c 20 69 44 62 2c 20 31 2c 20 72 65 67 33  ie, iDb, 1, reg3
6da0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
6db0: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
6dc0: 6e 74 65 67 65 72 2c 20 45 4e 43 28 64 62 29 2c  nteger, ENC(db),
6dd0: 20 72 65 67 33 29 3b 0a 20 20 20 20 73 71 6c 69   reg3);.    sqli
6de0: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
6df0: 20 4f 50 5f 53 65 74 43 6f 6f 6b 69 65 2c 20 69   OP_SetCookie, i
6e00: 44 62 2c 20 34 2c 20 72 65 67 33 29 3b 0a 20 20  Db, 4, reg3);.  
6e10: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
6e20: 70 48 65 72 65 28 76 2c 20 6a 31 29 3b 0a 0a 20  pHere(v, j1);.. 
6e30: 20 20 20 2f 2a 20 54 68 69 73 20 6a 75 73 74 20     /* This just 
6e40: 63 72 65 61 74 65 73 20 61 20 70 6c 61 63 65 2d  creates a place-
6e50: 68 6f 6c 64 65 72 20 72 65 63 6f 72 64 20 69 6e  holder record in
6e60: 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74   the sqlite_mast
6e70: 65 72 20 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2a  er table..    **
6e80: 20 54 68 65 20 72 65 63 6f 72 64 20 63 72 65 61   The record crea
6e90: 74 65 64 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e  ted does not con
6ea0: 74 61 69 6e 20 61 6e 79 74 68 69 6e 67 20 79 65  tain anything ye
6eb0: 74 2e 20 20 49 74 20 77 69 6c 6c 20 62 65 20 72  t.  It will be r
6ec0: 65 70 6c 61 63 65 64 0a 20 20 20 20 2a 2a 20 62  eplaced.    ** b
6ed0: 79 20 74 68 65 20 72 65 61 6c 20 65 6e 74 72 79  y the real entry
6ee0: 20 69 6e 20 63 6f 64 65 20 67 65 6e 65 72 61 74   in code generat
6ef0: 65 64 20 61 74 20 73 71 6c 69 74 65 33 45 6e 64  ed at sqlite3End
6f00: 54 61 62 6c 65 28 29 2e 0a 20 20 20 20 2a 2a 0a  Table()..    **.
6f10: 20 20 20 20 2a 2a 20 54 68 65 20 72 6f 77 69 64      ** The rowid
6f20: 20 66 6f 72 20 74 68 65 20 6e 65 77 20 65 6e 74   for the new ent
6f30: 72 79 20 69 73 20 6c 65 66 74 20 6f 6e 20 74 68  ry is left on th
6f40: 65 20 74 6f 70 20 6f 66 20 74 68 65 20 73 74 61  e top of the sta
6f50: 63 6b 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 72  ck..    ** The r
6f60: 6f 77 69 64 20 76 61 6c 75 65 20 69 73 20 6e 65  owid value is ne
6f70: 65 64 65 64 20 62 79 20 74 68 65 20 63 6f 64 65  eded by the code
6f80: 20 74 68 61 74 20 73 71 6c 69 74 65 33 45 6e 64   that sqlite3End
6f90: 54 61 62 6c 65 20 77 69 6c 6c 0a 20 20 20 20 2a  Table will.    *
6fa0: 2a 20 67 65 6e 65 72 61 74 65 2e 0a 20 20 20 20  * generate..    
6fb0: 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  */.#if !defined(
6fc0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57  SQLITE_OMIT_VIEW
6fd0: 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51  ) || !defined(SQ
6fe0: 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
6ff0: 4c 54 41 42 4c 45 29 0a 20 20 20 20 69 66 28 20  LTABLE).    if( 
7000: 69 73 56 69 65 77 20 7c 7c 20 69 73 56 69 72 74  isView || isVirt
7010: 75 61 6c 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ual ){.      sql
7020: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
7030: 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c  , OP_Integer, 0,
7040: 20 72 65 67 32 29 3b 0a 20 20 20 20 7d 65 6c 73   reg2);.    }els
7050: 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 7b 0a 20  e.#endif.    {. 
7060: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
7070: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 72 65  AddOp2(v, OP_Cre
7080: 61 74 65 54 61 62 6c 65 2c 20 69 44 62 2c 20 72  ateTable, iDb, r
7090: 65 67 32 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  eg2);.    }.    
70a0: 73 71 6c 69 74 65 33 4f 70 65 6e 4d 61 73 74 65  sqlite3OpenMaste
70b0: 72 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 69  rTable(pParse, i
70c0: 44 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Db);.    sqlite3
70d0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
70e0: 5f 4e 65 77 52 6f 77 69 64 2c 20 30 2c 20 72 65  _NewRowid, 0, re
70f0: 67 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  g1);.    sqlite3
7100: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
7110: 5f 4e 75 6c 6c 2c 20 30 2c 20 72 65 67 33 29 3b  _Null, 0, reg3);
7120: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
7130: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 73  AddOp3(v, OP_Ins
7140: 65 72 74 2c 20 30 2c 20 72 65 67 33 2c 20 72 65  ert, 0, reg3, re
7150: 67 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  g1);.    sqlite3
7160: 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
7170: 4f 50 46 4c 41 47 5f 41 50 50 45 4e 44 29 3b 0a  OPFLAG_APPEND);.
7180: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
7190: 64 64 4f 70 30 28 76 2c 20 4f 50 5f 43 6c 6f 73  ddOp0(v, OP_Clos
71a0: 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f  e);.  }..  /* No
71b0: 72 6d 61 6c 20 28 6e 6f 6e 2d 65 72 72 6f 72 29  rmal (non-error)
71c0: 20 72 65 74 75 72 6e 2e 20 2a 2f 0a 20 20 72 65   return. */.  re
71d0: 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 49 66 20 61  turn;..  /* If a
71e0: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
71f0: 77 65 20 6a 75 6d 70 20 68 65 72 65 20 2a 2f 0a  we jump here */.
7200: 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f  begin_table_erro
7210: 72 3a 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  r:.  sqlite3DbFr
7220: 65 65 28 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20  ee(db, zName);. 
7230: 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a   return;.}../*.*
7240: 2a 20 54 68 69 73 20 6d 61 63 72 6f 20 69 73 20  * This macro is 
7250: 75 73 65 64 20 74 6f 20 63 6f 6d 70 61 72 65 20  used to compare 
7260: 74 77 6f 20 73 74 72 69 6e 67 73 20 69 6e 20 61  two strings in a
7270: 20 63 61 73 65 2d 69 6e 73 65 6e 73 69 74 69 76   case-insensitiv
7280: 65 20 6d 61 6e 6e 65 72 2e 0a 2a 2a 20 49 74 20  e manner..** It 
7290: 69 73 20 73 6c 69 67 68 74 6c 79 20 66 61 73 74  is slightly fast
72a0: 65 72 20 74 68 61 6e 20 63 61 6c 6c 69 6e 67 20  er than calling 
72b0: 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 29  sqlite3StrICmp()
72c0: 20 64 69 72 65 63 74 6c 79 2c 20 62 75 74 0a 2a   directly, but.*
72d0: 2a 20 70 72 6f 64 75 63 65 73 20 6c 61 72 67 65  * produces large
72e0: 72 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 57 41  r code..**.** WA
72f0: 52 4e 49 4e 47 3a 20 54 68 69 73 20 6d 61 63 72  RNING: This macr
7300: 6f 20 69 73 20 6e 6f 74 20 63 6f 6d 70 61 74 69  o is not compati
7310: 62 6c 65 20 77 69 74 68 20 74 68 65 20 73 74 72  ble with the str
7320: 63 6d 70 28 29 20 66 61 6d 69 6c 79 2e 20 49 74  cmp() family. It
7330: 0a 2a 2a 20 72 65 74 75 72 6e 73 20 74 72 75 65  .** returns true
7340: 20 69 66 20 74 68 65 20 74 77 6f 20 73 74 72 69   if the two stri
7350: 6e 67 73 20 61 72 65 20 65 71 75 61 6c 2c 20 6f  ngs are equal, o
7360: 74 68 65 72 77 69 73 65 20 66 61 6c 73 65 2e 0a  therwise false..
7370: 2a 2f 0a 23 64 65 66 69 6e 65 20 53 54 52 49 43  */.#define STRIC
7380: 4d 50 28 78 2c 20 79 29 20 28 5c 0a 73 71 6c 69  MP(x, y) (\.sqli
7390: 74 65 33 55 70 70 65 72 54 6f 4c 6f 77 65 72 5b  te3UpperToLower[
73a0: 2a 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  *(unsigned char 
73b0: 2a 29 28 78 29 5d 3d 3d 20 20 20 5c 0a 73 71 6c  *)(x)]==   \.sql
73c0: 69 74 65 33 55 70 70 65 72 54 6f 4c 6f 77 65 72  ite3UpperToLower
73d0: 5b 2a 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72  [*(unsigned char
73e0: 20 2a 29 28 79 29 5d 20 20 20 20 20 5c 0a 26 26   *)(y)]     \.&&
73f0: 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
7400: 28 78 29 2b 31 2c 28 79 29 2b 31 29 3d 3d 30 20  (x)+1,(y)+1)==0 
7410: 29 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e  )../*.** Add a n
7420: 65 77 20 63 6f 6c 75 6d 6e 20 74 6f 20 74 68 65  ew column to the
7430: 20 74 61 62 6c 65 20 63 75 72 72 65 6e 74 6c 79   table currently
7440: 20 62 65 69 6e 67 20 63 6f 6e 73 74 72 75 63 74   being construct
7450: 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61  ed..**.** The pa
7460: 72 73 65 72 20 63 61 6c 6c 73 20 74 68 69 73 20  rser calls this 
7470: 72 6f 75 74 69 6e 65 20 6f 6e 63 65 20 66 6f 72  routine once for
7480: 20 65 61 63 68 20 63 6f 6c 75 6d 6e 20 64 65 63   each column dec
7490: 6c 61 72 61 74 69 6f 6e 0a 2a 2a 20 69 6e 20 61  laration.** in a
74a0: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74   CREATE TABLE st
74b0: 61 74 65 6d 65 6e 74 2e 20 20 73 71 6c 69 74 65  atement.  sqlite
74c0: 33 53 74 61 72 74 54 61 62 6c 65 28 29 20 67 65  3StartTable() ge
74d0: 74 73 20 63 61 6c 6c 65 64 0a 2a 2a 20 66 69 72  ts called.** fir
74e0: 73 74 20 74 6f 20 67 65 74 20 74 68 69 6e 67 73  st to get things
74f0: 20 67 6f 69 6e 67 2e 20 20 54 68 65 6e 20 74 68   going.  Then th
7500: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
7510: 6c 6c 65 64 20 66 6f 72 20 65 61 63 68 0a 2a 2a  lled for each.**
7520: 20 63 6f 6c 75 6d 6e 2e 0a 2a 2f 0a 76 6f 69 64   column..*/.void
7530: 20 73 71 6c 69 74 65 33 41 64 64 43 6f 6c 75 6d   sqlite3AddColum
7540: 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  n(Parse *pParse,
7550: 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 29 7b 0a   Token *pName){.
7560: 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 69 6e    Table *p;.  in
7570: 74 20 69 3b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a  t i;.  char *z;.
7580: 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a    Column *pCol;.
7590: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
75a0: 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66  pParse->db;.  if
75b0: 28 20 28 70 20 3d 20 70 50 61 72 73 65 2d 3e 70  ( (p = pParse->p
75c0: 4e 65 77 54 61 62 6c 65 29 3d 3d 30 20 29 20 72  NewTable)==0 ) r
75d0: 65 74 75 72 6e 3b 0a 23 69 66 20 53 51 4c 49 54  eturn;.#if SQLIT
75e0: 45 5f 4d 41 58 5f 43 4f 4c 55 4d 4e 0a 20 20 69  E_MAX_COLUMN.  i
75f0: 66 28 20 70 2d 3e 6e 43 6f 6c 2b 31 3e 64 62 2d  f( p->nCol+1>db-
7600: 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c  >aLimit[SQLITE_L
7610: 49 4d 49 54 5f 43 4f 4c 55 4d 4e 5d 20 29 7b 0a  IMIT_COLUMN] ){.
7620: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
7630: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 6f 6f  Msg(pParse, "too
7640: 20 6d 61 6e 79 20 63 6f 6c 75 6d 6e 73 20 6f 6e   many columns on
7650: 20 25 73 22 2c 20 70 2d 3e 7a 4e 61 6d 65 29 3b   %s", p->zName);
7660: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
7670: 0a 23 65 6e 64 69 66 0a 20 20 7a 20 3d 20 73 71  .#endif.  z = sq
7680: 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b  lite3NameFromTok
7690: 65 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  en(pParse->db, p
76a0: 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a 3d 3d  Name);.  if( z==
76b0: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f  0 ) return;.  fo
76c0: 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6c  r(i=0; i<p->nCol
76d0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
76e0: 53 54 52 49 43 4d 50 28 7a 2c 20 70 2d 3e 61 43  STRICMP(z, p->aC
76f0: 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 20 29 7b 0a  ol[i].zName) ){.
7700: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
7710: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 64  orMsg(pParse, "d
7720: 75 70 6c 69 63 61 74 65 20 63 6f 6c 75 6d 6e 20  uplicate column 
7730: 6e 61 6d 65 3a 20 25 73 22 2c 20 7a 29 3b 0a 20  name: %s", z);. 
7740: 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
7750: 65 65 28 64 62 2c 20 7a 29 3b 0a 20 20 20 20 20  ee(db, z);.     
7760: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20   return;.    }. 
7770: 20 7d 0a 20 20 69 66 28 20 28 70 2d 3e 6e 43 6f   }.  if( (p->nCo
7780: 6c 20 26 20 30 78 37 29 3d 3d 30 20 29 7b 0a 20  l & 0x7)==0 ){. 
7790: 20 20 20 43 6f 6c 75 6d 6e 20 2a 61 4e 65 77 3b     Column *aNew;
77a0: 0a 20 20 20 20 61 4e 65 77 20 3d 20 73 71 6c 69  .    aNew = sqli
77b0: 74 65 33 44 62 52 65 61 6c 6c 6f 63 28 70 50 61  te3DbRealloc(pPa
77c0: 72 73 65 2d 3e 64 62 2c 70 2d 3e 61 43 6f 6c 2c  rse->db,p->aCol,
77d0: 28 70 2d 3e 6e 43 6f 6c 2b 38 29 2a 73 69 7a 65  (p->nCol+8)*size
77e0: 6f 66 28 70 2d 3e 61 43 6f 6c 5b 30 5d 29 29 3b  of(p->aCol[0]));
77f0: 0a 20 20 20 20 69 66 28 20 61 4e 65 77 3d 3d 30  .    if( aNew==0
7800: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
7810: 33 44 62 46 72 65 65 28 64 62 2c 20 7a 29 3b 0a  3DbFree(db, z);.
7820: 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20        return;.  
7830: 20 20 7d 0a 20 20 20 20 70 2d 3e 61 43 6f 6c 20    }.    p->aCol 
7840: 3d 20 61 4e 65 77 3b 0a 20 20 7d 0a 20 20 70 43  = aNew;.  }.  pC
7850: 6f 6c 20 3d 20 26 70 2d 3e 61 43 6f 6c 5b 70 2d  ol = &p->aCol[p-
7860: 3e 6e 43 6f 6c 5d 3b 0a 20 20 6d 65 6d 73 65 74  >nCol];.  memset
7870: 28 70 43 6f 6c 2c 20 30 2c 20 73 69 7a 65 6f 66  (pCol, 0, sizeof
7880: 28 70 2d 3e 61 43 6f 6c 5b 30 5d 29 29 3b 0a 20  (p->aCol[0]));. 
7890: 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 20 3d 20 7a   pCol->zName = z
78a0: 3b 0a 20 0a 20 20 2f 2a 20 49 66 20 74 68 65 72  ;. .  /* If ther
78b0: 65 20 69 73 20 6e 6f 20 74 79 70 65 20 73 70 65  e is no type spe
78c0: 63 69 66 69 65 64 2c 20 63 6f 6c 75 6d 6e 73 20  cified, columns 
78d0: 68 61 76 65 20 74 68 65 20 64 65 66 61 75 6c 74  have the default
78e0: 20 61 66 66 69 6e 69 74 79 0a 20 20 2a 2a 20 27   affinity.  ** '
78f0: 4e 4f 4e 45 27 2e 20 49 66 20 74 68 65 72 65 20  NONE'. If there 
7900: 69 73 20 61 20 74 79 70 65 20 73 70 65 63 69 66  is a type specif
7910: 69 65 64 2c 20 74 68 65 6e 20 73 71 6c 69 74 65  ied, then sqlite
7920: 33 41 64 64 43 6f 6c 75 6d 6e 54 79 70 65 28 29  3AddColumnType()
7930: 20 77 69 6c 6c 0a 20 20 2a 2a 20 62 65 20 63 61   will.  ** be ca
7940: 6c 6c 65 64 20 6e 65 78 74 20 74 6f 20 73 65 74  lled next to set
7950: 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 20   pCol->affinity 
7960: 63 6f 72 72 65 63 74 6c 79 2e 0a 20 20 2a 2f 0a  correctly..  */.
7970: 20 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79    pCol->affinity
7980: 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f   = SQLITE_AFF_NO
7990: 4e 45 3b 0a 20 20 70 2d 3e 6e 43 6f 6c 2b 2b 3b  NE;.  p->nCol++;
79a0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
79b0: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
79c0: 20 62 79 20 74 68 65 20 70 61 72 73 65 72 20 77   by the parser w
79d0: 68 69 6c 65 20 69 6e 20 74 68 65 20 6d 69 64 64  hile in the midd
79e0: 6c 65 20 6f 66 0a 2a 2a 20 70 61 72 73 69 6e 67  le of.** parsing
79f0: 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20   a CREATE TABLE 
7a00: 73 74 61 74 65 6d 65 6e 74 2e 20 20 41 20 22 4e  statement.  A "N
7a10: 4f 54 20 4e 55 4c 4c 22 20 63 6f 6e 73 74 72 61  OT NULL" constra
7a20: 69 6e 74 20 68 61 73 0a 2a 2a 20 62 65 65 6e 20  int has.** been 
7a30: 73 65 65 6e 20 6f 6e 20 61 20 63 6f 6c 75 6d 6e  seen on a column
7a40: 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
7a50: 73 65 74 73 20 74 68 65 20 6e 6f 74 4e 75 6c 6c  sets the notNull
7a60: 20 66 6c 61 67 20 6f 6e 0a 2a 2a 20 74 68 65 20   flag on.** the 
7a70: 63 6f 6c 75 6d 6e 20 63 75 72 72 65 6e 74 6c 79  column currently
7a80: 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74   under construct
7a90: 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ion..*/.void sql
7aa0: 69 74 65 33 41 64 64 4e 6f 74 4e 75 6c 6c 28 50  ite3AddNotNull(P
7ab0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e  arse *pParse, in
7ac0: 74 20 6f 6e 45 72 72 6f 72 29 7b 0a 20 20 54 61  t onError){.  Ta
7ad0: 62 6c 65 20 2a 70 3b 0a 20 20 69 6e 74 20 69 3b  ble *p;.  int i;
7ae0: 0a 20 20 69 66 28 20 28 70 20 3d 20 70 50 61 72  .  if( (p = pPar
7af0: 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3d 3d  se->pNewTable)==
7b00: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 20  0 ) return;.  i 
7b10: 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 69  = p->nCol-1;.  i
7b20: 66 28 20 69 3e 3d 30 20 29 20 70 2d 3e 61 43 6f  f( i>=0 ) p->aCo
7b30: 6c 5b 69 5d 2e 6e 6f 74 4e 75 6c 6c 20 3d 20 6f  l[i].notNull = o
7b40: 6e 45 72 72 6f 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  nError;.}../*.**
7b50: 20 53 63 61 6e 20 74 68 65 20 63 6f 6c 75 6d 6e   Scan the column
7b60: 20 74 79 70 65 20 6e 61 6d 65 20 7a 54 79 70 65   type name zType
7b70: 20 28 6c 65 6e 67 74 68 20 6e 54 79 70 65 29 20   (length nType) 
7b80: 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65 0a 2a  and return the.*
7b90: 2a 20 61 73 73 6f 63 69 61 74 65 64 20 61 66 66  * associated aff
7ba0: 69 6e 69 74 79 20 74 79 70 65 2e 0a 2a 2a 0a 2a  inity type..**.*
7bb0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64  * This routine d
7bc0: 6f 65 73 20 61 20 63 61 73 65 2d 69 6e 64 65 70  oes a case-indep
7bd0: 65 6e 64 65 6e 74 20 73 65 61 72 63 68 20 6f 66  endent search of
7be0: 20 7a 54 79 70 65 20 66 6f 72 20 74 68 65 20 0a   zType for the .
7bf0: 2a 2a 20 73 75 62 73 74 72 69 6e 67 73 20 69 6e  ** substrings in
7c00: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74   the following t
7c10: 61 62 6c 65 2e 20 49 66 20 6f 6e 65 20 6f 66 20  able. If one of 
7c20: 74 68 65 20 73 75 62 73 74 72 69 6e 67 73 20 69  the substrings i
7c30: 73 0a 2a 2a 20 66 6f 75 6e 64 2c 20 74 68 65 20  s.** found, the 
7c40: 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 61 66  corresponding af
7c50: 66 69 6e 69 74 79 20 69 73 20 72 65 74 75 72 6e  finity is return
7c60: 65 64 2e 20 49 66 20 7a 54 79 70 65 20 63 6f 6e  ed. If zType con
7c70: 74 61 69 6e 73 0a 2a 2a 20 6d 6f 72 65 20 74 68  tains.** more th
7c80: 61 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 73 75  an one of the su
7c90: 62 73 74 72 69 6e 67 73 2c 20 65 6e 74 72 69 65  bstrings, entrie
7ca0: 73 20 74 6f 77 61 72 64 20 74 68 65 20 74 6f 70  s toward the top
7cb0: 20 6f 66 20 0a 2a 2a 20 74 68 65 20 74 61 62 6c   of .** the tabl
7cc0: 65 20 74 61 6b 65 20 70 72 69 6f 72 69 74 79 2e  e take priority.
7cd0: 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69 66   For example, if
7ce0: 20 7a 54 79 70 65 20 69 73 20 27 42 4c 4f 42 49   zType is 'BLOBI
7cf0: 4e 54 27 2c 20 0a 2a 2a 20 53 51 4c 49 54 45 5f  NT', .** SQLITE_
7d00: 41 46 46 5f 49 4e 54 45 47 45 52 20 69 73 20 72  AFF_INTEGER is r
7d10: 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 53  eturned..**.** S
7d20: 75 62 73 74 72 69 6e 67 20 20 20 20 20 7c 20 41  ubstring     | A
7d30: 66 66 69 6e 69 74 79 0a 2a 2a 20 2d 2d 2d 2d 2d  ffinity.** -----
7d40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7d50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 27  -----------.** '
7d60: 49 4e 54 27 20 20 20 20 20 20 20 20 20 7c 20 53  INT'         | S
7d70: 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45  QLITE_AFF_INTEGE
7d80: 52 0a 2a 2a 20 27 43 48 41 52 27 20 20 20 20 20  R.** 'CHAR'     
7d90: 20 20 20 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f     | SQLITE_AFF_
7da0: 54 45 58 54 0a 2a 2a 20 27 43 4c 4f 42 27 20 20  TEXT.** 'CLOB'  
7db0: 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 41        | SQLITE_A
7dc0: 46 46 5f 54 45 58 54 0a 2a 2a 20 27 54 45 58 54  FF_TEXT.** 'TEXT
7dd0: 27 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54  '        | SQLIT
7de0: 45 5f 41 46 46 5f 54 45 58 54 0a 2a 2a 20 27 42  E_AFF_TEXT.** 'B
7df0: 4c 4f 42 27 20 20 20 20 20 20 20 20 7c 20 53 51  LOB'        | SQ
7e00: 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 0a 2a 2a  LITE_AFF_NONE.**
7e10: 20 27 52 45 41 4c 27 20 20 20 20 20 20 20 20 7c   'REAL'        |
7e20: 20 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c   SQLITE_AFF_REAL
7e30: 0a 2a 2a 20 27 46 4c 4f 41 27 20 20 20 20 20 20  .** 'FLOA'      
7e40: 20 20 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f 52    | SQLITE_AFF_R
7e50: 45 41 4c 0a 2a 2a 20 27 44 4f 55 42 27 20 20 20  EAL.** 'DOUB'   
7e60: 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 41 46       | SQLITE_AF
7e70: 46 5f 52 45 41 4c 0a 2a 2a 0a 2a 2a 20 49 66 20  F_REAL.**.** If 
7e80: 6e 6f 6e 65 20 6f 66 20 74 68 65 20 73 75 62 73  none of the subs
7e90: 74 72 69 6e 67 73 20 69 6e 20 74 68 65 20 61 62  trings in the ab
7ea0: 6f 76 65 20 74 61 62 6c 65 20 61 72 65 20 66 6f  ove table are fo
7eb0: 75 6e 64 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 41  und,.** SQLITE_A
7ec0: 46 46 5f 4e 55 4d 45 52 49 43 20 69 73 20 72 65  FF_NUMERIC is re
7ed0: 74 75 72 6e 65 64 2e 0a 2a 2f 0a 63 68 61 72 20  turned..*/.char 
7ee0: 73 71 6c 69 74 65 33 41 66 66 69 6e 69 74 79 54  sqlite3AffinityT
7ef0: 79 70 65 28 63 6f 6e 73 74 20 54 6f 6b 65 6e 20  ype(const Token 
7f00: 2a 70 54 79 70 65 29 7b 0a 20 20 75 33 32 20 68  *pType){.  u32 h
7f10: 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 61 66 66   = 0;.  char aff
7f20: 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55   = SQLITE_AFF_NU
7f30: 4d 45 52 49 43 3b 0a 20 20 63 6f 6e 73 74 20 75  MERIC;.  const u
7f40: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a 49  nsigned char *zI
7f50: 6e 20 3d 20 70 54 79 70 65 2d 3e 7a 3b 0a 20 20  n = pType->z;.  
7f60: 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
7f70: 68 61 72 20 2a 7a 45 6e 64 20 3d 20 26 70 54 79  har *zEnd = &pTy
7f80: 70 65 2d 3e 7a 5b 70 54 79 70 65 2d 3e 6e 5d 3b  pe->z[pType->n];
7f90: 0a 0a 20 20 77 68 69 6c 65 28 20 7a 49 6e 21 3d  ..  while( zIn!=
7fa0: 7a 45 6e 64 20 29 7b 0a 20 20 20 20 68 20 3d 20  zEnd ){.    h = 
7fb0: 28 68 3c 3c 38 29 20 2b 20 73 71 6c 69 74 65 33  (h<<8) + sqlite3
7fc0: 55 70 70 65 72 54 6f 4c 6f 77 65 72 5b 2a 7a 49  UpperToLower[*zI
7fd0: 6e 5d 3b 0a 20 20 20 20 7a 49 6e 2b 2b 3b 0a 20  n];.    zIn++;. 
7fe0: 20 20 20 69 66 28 20 68 3d 3d 28 28 27 63 27 3c     if( h==(('c'<
7ff0: 3c 32 34 29 2b 28 27 68 27 3c 3c 31 36 29 2b 28  <24)+('h'<<16)+(
8000: 27 61 27 3c 3c 38 29 2b 27 72 27 29 20 29 7b 20  'a'<<8)+'r') ){ 
8010: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
8020: 48 41 52 20 2a 2f 0a 20 20 20 20 20 20 61 66 66  HAR */.      aff
8030: 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45   = SQLITE_AFF_TE
8040: 58 54 3b 20 0a 20 20 20 20 7d 65 6c 73 65 20 69  XT; .    }else i
8050: 66 28 20 68 3d 3d 28 28 27 63 27 3c 3c 32 34 29  f( h==(('c'<<24)
8060: 2b 28 27 6c 27 3c 3c 31 36 29 2b 28 27 6f 27 3c  +('l'<<16)+('o'<
8070: 3c 38 29 2b 27 62 27 29 20 29 7b 20 20 20 20 20  <8)+'b') ){     
8080: 20 20 2f 2a 20 43 4c 4f 42 20 2a 2f 0a 20 20 20    /* CLOB */.   
8090: 20 20 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f     aff = SQLITE_
80a0: 41 46 46 5f 54 45 58 54 3b 0a 20 20 20 20 7d 65  AFF_TEXT;.    }e
80b0: 6c 73 65 20 69 66 28 20 68 3d 3d 28 28 27 74 27  lse if( h==(('t'
80c0: 3c 3c 32 34 29 2b 28 27 65 27 3c 3c 31 36 29 2b  <<24)+('e'<<16)+
80d0: 28 27 78 27 3c 3c 38 29 2b 27 74 27 29 20 29 7b  ('x'<<8)+'t') ){
80e0: 20 20 20 20 20 20 20 2f 2a 20 54 45 58 54 20 2a         /* TEXT *
80f0: 2f 0a 20 20 20 20 20 20 61 66 66 20 3d 20 53 51  /.      aff = SQ
8100: 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 3b 0a 20  LITE_AFF_TEXT;. 
8110: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 68 3d 3d     }else if( h==
8120: 28 28 27 62 27 3c 3c 32 34 29 2b 28 27 6c 27 3c  (('b'<<24)+('l'<
8130: 3c 31 36 29 2b 28 27 6f 27 3c 3c 38 29 2b 27 62  <16)+('o'<<8)+'b
8140: 27 29 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42  ')          /* B
8150: 4c 4f 42 20 2a 2f 0a 20 20 20 20 20 20 20 20 26  LOB */.        &
8160: 26 20 28 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41  & (aff==SQLITE_A
8170: 46 46 5f 4e 55 4d 45 52 49 43 20 7c 7c 20 61 66  FF_NUMERIC || af
8180: 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 52 45  f==SQLITE_AFF_RE
8190: 41 4c 29 20 29 7b 0a 20 20 20 20 20 20 61 66 66  AL) ){.      aff
81a0: 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f   = SQLITE_AFF_NO
81b0: 4e 45 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  NE;.#ifndef SQLI
81c0: 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47  TE_OMIT_FLOATING
81d0: 5f 50 4f 49 4e 54 0a 20 20 20 20 7d 65 6c 73 65  _POINT.    }else
81e0: 20 69 66 28 20 68 3d 3d 28 28 27 72 27 3c 3c 32   if( h==(('r'<<2
81f0: 34 29 2b 28 27 65 27 3c 3c 31 36 29 2b 28 27 61  4)+('e'<<16)+('a
8200: 27 3c 3c 38 29 2b 27 6c 27 29 20 20 20 20 20 20  '<<8)+'l')      
8210: 20 20 20 20 2f 2a 20 52 45 41 4c 20 2a 2f 0a 20      /* REAL */. 
8220: 20 20 20 20 20 20 20 26 26 20 61 66 66 3d 3d 53         && aff==S
8230: 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49  QLITE_AFF_NUMERI
8240: 43 20 29 7b 0a 20 20 20 20 20 20 61 66 66 20 3d  C ){.      aff =
8250: 20 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c   SQLITE_AFF_REAL
8260: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
8270: 68 3d 3d 28 28 27 66 27 3c 3c 32 34 29 2b 28 27  h==(('f'<<24)+('
8280: 6c 27 3c 3c 31 36 29 2b 28 27 6f 27 3c 3c 38 29  l'<<16)+('o'<<8)
8290: 2b 27 61 27 29 20 20 20 20 20 20 20 20 20 20 2f  +'a')          /
82a0: 2a 20 46 4c 4f 41 20 2a 2f 0a 20 20 20 20 20 20  * FLOA */.      
82b0: 20 20 26 26 20 61 66 66 3d 3d 53 51 4c 49 54 45    && aff==SQLITE
82c0: 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20 29 7b 0a  _AFF_NUMERIC ){.
82d0: 20 20 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49        aff = SQLI
82e0: 54 45 5f 41 46 46 5f 52 45 41 4c 3b 0a 20 20 20  TE_AFF_REAL;.   
82f0: 20 7d 65 6c 73 65 20 69 66 28 20 68 3d 3d 28 28   }else if( h==((
8300: 27 64 27 3c 3c 32 34 29 2b 28 27 6f 27 3c 3c 31  'd'<<24)+('o'<<1
8310: 36 29 2b 28 27 75 27 3c 3c 38 29 2b 27 62 27 29  6)+('u'<<8)+'b')
8320: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 4f 55            /* DOU
8330: 42 20 2a 2f 0a 20 20 20 20 20 20 20 20 26 26 20  B */.        && 
8340: 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f  aff==SQLITE_AFF_
8350: 4e 55 4d 45 52 49 43 20 29 7b 0a 20 20 20 20 20  NUMERIC ){.     
8360: 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46   aff = SQLITE_AF
8370: 46 5f 52 45 41 4c 3b 0a 23 65 6e 64 69 66 0a 20  F_REAL;.#endif. 
8380: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 68 26     }else if( (h&
8390: 30 78 30 30 46 46 46 46 46 46 29 3d 3d 28 28 27  0x00FFFFFF)==(('
83a0: 69 27 3c 3c 31 36 29 2b 28 27 6e 27 3c 3c 38 29  i'<<16)+('n'<<8)
83b0: 2b 27 74 27 29 20 29 7b 20 20 20 20 2f 2a 20 49  +'t') ){    /* I
83c0: 4e 54 20 2a 2f 0a 20 20 20 20 20 20 61 66 66 20  NT */.      aff 
83d0: 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54  = SQLITE_AFF_INT
83e0: 45 47 45 52 3b 0a 20 20 20 20 20 20 62 72 65 61  EGER;.      brea
83f0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  k;.    }.  }..  
8400: 72 65 74 75 72 6e 20 61 66 66 3b 0a 7d 0a 0a 2f  return aff;.}../
8410: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
8420: 65 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74  e is called by t
8430: 68 65 20 70 61 72 73 65 72 20 77 68 69 6c 65 20  he parser while 
8440: 69 6e 20 74 68 65 20 6d 69 64 64 6c 65 20 6f 66  in the middle of
8450: 0a 2a 2a 20 70 61 72 73 69 6e 67 20 61 20 43 52  .** parsing a CR
8460: 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65  EATE TABLE state
8470: 6d 65 6e 74 2e 20 20 54 68 65 20 70 46 69 72 73  ment.  The pFirs
8480: 74 20 74 6f 6b 65 6e 20 69 73 20 74 68 65 20 66  t token is the f
8490: 69 72 73 74 0a 2a 2a 20 74 6f 6b 65 6e 20 69 6e  irst.** token in
84a0: 20 74 68 65 20 73 65 71 75 65 6e 63 65 20 6f 66   the sequence of
84b0: 20 74 6f 6b 65 6e 73 20 74 68 61 74 20 64 65 73   tokens that des
84c0: 63 72 69 62 65 20 74 68 65 20 74 79 70 65 20 6f  cribe the type o
84d0: 66 20 74 68 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 20  f the.** column 
84e0: 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72 20  currently under 
84f0: 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 20  construction.   
8500: 70 4c 61 73 74 20 69 73 20 74 68 65 20 6c 61 73  pLast is the las
8510: 74 20 74 6f 6b 65 6e 0a 2a 2a 20 69 6e 20 74 68  t token.** in th
8520: 65 20 73 65 71 75 65 6e 63 65 2e 20 20 55 73 65  e sequence.  Use
8530: 20 74 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f   this informatio
8540: 6e 20 74 6f 20 63 6f 6e 73 74 72 75 63 74 20 61  n to construct a
8550: 20 73 74 72 69 6e 67 0a 2a 2a 20 74 68 61 74 20   string.** that 
8560: 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 74 79 70  contains the typ
8570: 65 6e 61 6d 65 20 6f 66 20 74 68 65 20 63 6f 6c  ename of the col
8580: 75 6d 6e 20 61 6e 64 20 73 74 6f 72 65 20 74 68  umn and store th
8590: 61 74 20 73 74 72 69 6e 67 0a 2a 2a 20 69 6e 20  at string.** in 
85a0: 7a 54 79 70 65 2e 0a 2a 2f 20 0a 76 6f 69 64 20  zType..*/ .void 
85b0: 73 71 6c 69 74 65 33 41 64 64 43 6f 6c 75 6d 6e  sqlite3AddColumn
85c0: 54 79 70 65 28 50 61 72 73 65 20 2a 70 50 61 72  Type(Parse *pPar
85d0: 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 54 79 70 65  se, Token *pType
85e0: 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20  ){.  Table *p;. 
85f0: 20 69 6e 74 20 69 3b 0a 20 20 43 6f 6c 75 6d 6e   int i;.  Column
8600: 20 2a 70 43 6f 6c 3b 0a 20 20 73 71 6c 69 74 65   *pCol;.  sqlite
8610: 33 20 2a 64 62 3b 0a 0a 20 20 69 66 28 20 28 70  3 *db;..  if( (p
8620: 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54   = pParse->pNewT
8630: 61 62 6c 65 29 3d 3d 30 20 29 20 72 65 74 75 72  able)==0 ) retur
8640: 6e 3b 0a 20 20 69 20 3d 20 70 2d 3e 6e 43 6f 6c  n;.  i = p->nCol
8650: 2d 31 3b 0a 20 20 69 66 28 20 69 3c 30 20 29 20  -1;.  if( i<0 ) 
8660: 72 65 74 75 72 6e 3b 0a 20 20 70 43 6f 6c 20 3d  return;.  pCol =
8670: 20 26 70 2d 3e 61 43 6f 6c 5b 69 5d 3b 0a 20 20   &p->aCol[i];.  
8680: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
8690: 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
86a0: 28 64 62 2c 20 70 43 6f 6c 2d 3e 7a 54 79 70 65  (db, pCol->zType
86b0: 29 3b 0a 20 20 70 43 6f 6c 2d 3e 7a 54 79 70 65  );.  pCol->zType
86c0: 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72   = sqlite3NameFr
86d0: 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 54 79 70  omToken(db, pTyp
86e0: 65 29 3b 0a 20 20 70 43 6f 6c 2d 3e 61 66 66 69  e);.  pCol->affi
86f0: 6e 69 74 79 20 3d 20 73 71 6c 69 74 65 33 41 66  nity = sqlite3Af
8700: 66 69 6e 69 74 79 54 79 70 65 28 70 54 79 70 65  finityType(pType
8710: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  );.}../*.** The 
8720: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 74 68  expression is th
8730: 65 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65 20  e default value 
8740: 66 6f 72 20 74 68 65 20 6d 6f 73 74 20 72 65 63  for the most rec
8750: 65 6e 74 6c 79 20 61 64 64 65 64 20 63 6f 6c 75  ently added colu
8760: 6d 6e 0a 2a 2a 20 6f 66 20 74 68 65 20 74 61 62  mn.** of the tab
8770: 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64  le currently und
8780: 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e  er construction.
8790: 0a 2a 2a 0a 2a 2a 20 44 65 66 61 75 6c 74 20 76  .**.** Default v
87a0: 61 6c 75 65 20 65 78 70 72 65 73 73 69 6f 6e 73  alue expressions
87b0: 20 6d 75 73 74 20 62 65 20 63 6f 6e 73 74 61 6e   must be constan
87c0: 74 2e 20 20 52 61 69 73 65 20 61 6e 20 65 78 63  t.  Raise an exc
87d0: 65 70 74 69 6f 6e 20 69 66 20 74 68 69 73 0a 2a  eption if this.*
87e0: 2a 20 69 73 20 6e 6f 74 20 74 68 65 20 63 61 73  * is not the cas
87f0: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  e..**.** This ro
8800: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
8810: 62 79 20 74 68 65 20 70 61 72 73 65 72 20 77 68  by the parser wh
8820: 69 6c 65 20 69 6e 20 74 68 65 20 6d 69 64 64 6c  ile in the middl
8830: 65 20 6f 66 0a 2a 2a 20 70 61 72 73 69 6e 67 20  e of.** parsing 
8840: 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73  a CREATE TABLE s
8850: 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69  tatement..*/.voi
8860: 64 20 73 71 6c 69 74 65 33 41 64 64 44 65 66 61  d sqlite3AddDefa
8870: 75 6c 74 56 61 6c 75 65 28 50 61 72 73 65 20 2a  ultValue(Parse *
8880: 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45  pParse, Expr *pE
8890: 78 70 72 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70  xpr){.  Table *p
88a0: 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c  ;.  Column *pCol
88b0: 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
88c0: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
88d0: 69 66 28 20 28 70 20 3d 20 70 50 61 72 73 65 2d  if( (p = pParse-
88e0: 3e 70 4e 65 77 54 61 62 6c 65 29 21 3d 30 20 29  >pNewTable)!=0 )
88f0: 7b 0a 20 20 20 20 70 43 6f 6c 20 3d 20 26 28 70  {.    pCol = &(p
8900: 2d 3e 61 43 6f 6c 5b 70 2d 3e 6e 43 6f 6c 2d 31  ->aCol[p->nCol-1
8910: 5d 29 3b 0a 20 20 20 20 69 66 28 20 21 73 71 6c  ]);.    if( !sql
8920: 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61  ite3ExprIsConsta
8930: 6e 74 4f 72 46 75 6e 63 74 69 6f 6e 28 70 45 78  ntOrFunction(pEx
8940: 70 72 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  pr) ){.      sql
8950: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
8960: 72 73 65 2c 20 22 64 65 66 61 75 6c 74 20 76 61  rse, "default va
8970: 6c 75 65 20 6f 66 20 63 6f 6c 75 6d 6e 20 5b 25  lue of column [%
8980: 73 5d 20 69 73 20 6e 6f 74 20 63 6f 6e 73 74 61  s] is not consta
8990: 6e 74 22 2c 0a 20 20 20 20 20 20 20 20 20 20 70  nt",.          p
89a0: 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  Col->zName);.   
89b0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 45 78   }else{.      Ex
89c0: 70 72 20 2a 70 43 6f 70 79 3b 0a 20 20 20 20 20  pr *pCopy;.     
89d0: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
89e0: 74 65 28 64 62 2c 20 70 43 6f 6c 2d 3e 70 44 66  te(db, pCol->pDf
89f0: 6c 74 29 3b 0a 20 20 20 20 20 20 70 43 6f 6c 2d  lt);.      pCol-
8a00: 3e 70 44 66 6c 74 20 3d 20 70 43 6f 70 79 20 3d  >pDflt = pCopy =
8a10: 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
8a20: 64 62 2c 20 70 45 78 70 72 29 3b 0a 20 20 20 20  db, pExpr);.    
8a30: 20 20 69 66 28 20 70 43 6f 70 79 20 29 7b 0a 20    if( pCopy ){. 
8a40: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 54 6f         sqlite3To
8a50: 6b 65 6e 43 6f 70 79 28 64 62 2c 20 26 70 43 6f  kenCopy(db, &pCo
8a60: 70 79 2d 3e 73 70 61 6e 2c 20 26 70 45 78 70 72  py->span, &pExpr
8a70: 2d 3e 73 70 61 6e 29 3b 0a 20 20 20 20 20 20 7d  ->span);.      }
8a80: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c  .    }.  }.  sql
8a90: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64  ite3ExprDelete(d
8aa0: 62 2c 20 70 45 78 70 72 29 3b 0a 7d 0a 0a 2f 2a  b, pExpr);.}../*
8ab0: 0a 2a 2a 20 44 65 73 69 67 6e 61 74 65 20 74 68  .** Designate th
8ac0: 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 66 6f  e PRIMARY KEY fo
8ad0: 72 20 74 68 65 20 74 61 62 6c 65 2e 20 20 70 4c  r the table.  pL
8ae0: 69 73 74 20 69 73 20 61 20 6c 69 73 74 20 6f 66  ist is a list of
8af0: 20 6e 61 6d 65 73 20 0a 2a 2a 20 6f 66 20 63 6f   names .** of co
8b00: 6c 75 6d 6e 73 20 74 68 61 74 20 66 6f 72 6d 20  lumns that form 
8b10: 74 68 65 20 70 72 69 6d 61 72 79 20 6b 65 79 2e  the primary key.
8b20: 20 20 49 66 20 70 4c 69 73 74 20 69 73 20 4e 55    If pList is NU
8b30: 4c 4c 2c 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20  LL, then the.** 
8b40: 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 61 64  most recently ad
8b50: 64 65 64 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68  ded column of th
8b60: 65 20 74 61 62 6c 65 20 69 73 20 74 68 65 20 70  e table is the p
8b70: 72 69 6d 61 72 79 20 6b 65 79 2e 0a 2a 2a 0a 2a  rimary key..**.*
8b80: 2a 20 41 20 74 61 62 6c 65 20 63 61 6e 20 68 61  * A table can ha
8b90: 76 65 20 61 74 20 6d 6f 73 74 20 6f 6e 65 20 70  ve at most one p
8ba0: 72 69 6d 61 72 79 20 6b 65 79 2e 20 20 49 66 20  rimary key.  If 
8bb0: 74 68 65 20 74 61 62 6c 65 20 61 6c 72 65 61 64  the table alread
8bc0: 79 20 68 61 73 0a 2a 2a 20 61 20 70 72 69 6d 61  y has.** a prima
8bd0: 72 79 20 6b 65 79 20 28 61 6e 64 20 74 68 69 73  ry key (and this
8be0: 20 69 73 20 74 68 65 20 73 65 63 6f 6e 64 20 70   is the second p
8bf0: 72 69 6d 61 72 79 20 6b 65 79 29 20 74 68 65 6e  rimary key) then
8c00: 20 63 72 65 61 74 65 20 61 6e 0a 2a 2a 20 65 72   create an.** er
8c10: 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ror..**.** If th
8c20: 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 69 73  e PRIMARY KEY is
8c30: 20 6f 6e 20 61 20 73 69 6e 67 6c 65 20 63 6f 6c   on a single col
8c40: 75 6d 6e 20 77 68 6f 73 65 20 64 61 74 61 74 79  umn whose dataty
8c50: 70 65 20 69 73 20 49 4e 54 45 47 45 52 2c 0a 2a  pe is INTEGER,.*
8c60: 2a 20 74 68 65 6e 20 77 65 20 77 69 6c 6c 20 74  * then we will t
8c70: 72 79 20 74 6f 20 75 73 65 20 74 68 61 74 20 63  ry to use that c
8c80: 6f 6c 75 6d 6e 20 61 73 20 74 68 65 20 72 6f 77  olumn as the row
8c90: 69 64 2e 20 20 53 65 74 20 74 68 65 20 54 61 62  id.  Set the Tab
8ca0: 6c 65 2e 69 50 4b 65 79 0a 2a 2a 20 66 69 65 6c  le.iPKey.** fiel
8cb0: 64 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 75  d of the table u
8cc0: 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f  nder constructio
8cd0: 6e 20 74 6f 20 62 65 20 74 68 65 20 69 6e 64 65  n to be the inde
8ce0: 78 20 6f 66 20 74 68 65 0a 2a 2a 20 49 4e 54 45  x of the.** INTE
8cf0: 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 20  GER PRIMARY KEY 
8d00: 63 6f 6c 75 6d 6e 2e 20 20 54 61 62 6c 65 2e 69  column.  Table.i
8d10: 50 4b 65 79 20 69 73 20 73 65 74 20 74 6f 20 2d  PKey is set to -
8d20: 31 20 69 66 20 74 68 65 72 65 20 69 73 0a 2a 2a  1 if there is.**
8d30: 20 6e 6f 20 49 4e 54 45 47 45 52 20 50 52 49 4d   no INTEGER PRIM
8d40: 41 52 59 20 4b 45 59 2e 0a 2a 2a 0a 2a 2a 20 49  ARY KEY..**.** I
8d50: 66 20 74 68 65 20 6b 65 79 20 69 73 20 6e 6f 74  f the key is not
8d60: 20 61 6e 20 49 4e 54 45 47 45 52 20 50 52 49 4d   an INTEGER PRIM
8d70: 41 52 59 20 4b 45 59 2c 20 74 68 65 6e 20 63 72  ARY KEY, then cr
8d80: 65 61 74 65 20 61 20 75 6e 69 71 75 65 0a 2a 2a  eate a unique.**
8d90: 20 69 6e 64 65 78 20 66 6f 72 20 74 68 65 20 6b   index for the k
8da0: 65 79 2e 20 20 4e 6f 20 69 6e 64 65 78 20 69 73  ey.  No index is
8db0: 20 63 72 65 61 74 65 64 20 66 6f 72 20 49 4e 54   created for INT
8dc0: 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59  EGER PRIMARY KEY
8dd0: 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  s..*/.void sqlit
8de0: 65 33 41 64 64 50 72 69 6d 61 72 79 4b 65 79 28  e3AddPrimaryKey(
8df0: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
8e00: 2c 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20  ,    /* Parsing 
8e10: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70  context */.  Exp
8e20: 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 2f  rList *pList,  /
8e30: 2a 20 4c 69 73 74 20 6f 66 20 66 69 65 6c 64 20  * List of field 
8e40: 6e 61 6d 65 73 20 74 6f 20 62 65 20 69 6e 64 65  names to be inde
8e50: 78 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 6e 45  xed */.  int onE
8e60: 72 72 6f 72 2c 20 20 20 20 20 20 2f 2a 20 57 68  rror,      /* Wh
8e70: 61 74 20 74 6f 20 64 6f 20 77 69 74 68 20 61 20  at to do with a 
8e80: 75 6e 69 71 75 65 6e 65 73 73 20 63 6f 6e 66 6c  uniqueness confl
8e90: 69 63 74 20 2a 2f 0a 20 20 69 6e 74 20 61 75 74  ict */.  int aut
8ea0: 6f 49 6e 63 2c 20 20 20 20 20 20 2f 2a 20 54 72  oInc,      /* Tr
8eb0: 75 65 20 69 66 20 74 68 65 20 41 55 54 4f 49 4e  ue if the AUTOIN
8ec0: 43 52 45 4d 45 4e 54 20 6b 65 79 77 6f 72 64 20  CREMENT keyword 
8ed0: 69 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a 20 20  is present */.  
8ee0: 69 6e 74 20 73 6f 72 74 4f 72 64 65 72 20 20 20  int sortOrder   
8ef0: 20 20 2f 2a 20 53 51 4c 49 54 45 5f 53 4f 5f 41    /* SQLITE_SO_A
8f00: 53 43 20 6f 72 20 53 51 4c 49 54 45 5f 53 4f 5f  SC or SQLITE_SO_
8f10: 44 45 53 43 20 2a 2f 0a 29 7b 0a 20 20 54 61 62  DESC */.){.  Tab
8f20: 6c 65 20 2a 70 54 61 62 20 3d 20 70 50 61 72 73  le *pTab = pPars
8f30: 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20  e->pNewTable;.  
8f40: 63 68 61 72 20 2a 7a 54 79 70 65 20 3d 20 30 3b  char *zType = 0;
8f50: 0a 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 2d 31  .  int iCol = -1
8f60: 2c 20 69 3b 0a 20 20 69 66 28 20 70 54 61 62 3d  , i;.  if( pTab=
8f70: 3d 30 20 7c 7c 20 49 4e 5f 44 45 43 4c 41 52 45  =0 || IN_DECLARE
8f80: 5f 56 54 41 42 20 29 20 67 6f 74 6f 20 70 72 69  _VTAB ) goto pri
8f90: 6d 61 72 79 5f 6b 65 79 5f 65 78 69 74 3b 0a 20  mary_key_exit;. 
8fa0: 20 69 66 28 20 70 54 61 62 2d 3e 74 61 62 46 6c   if( pTab->tabFl
8fb0: 61 67 73 20 26 20 54 46 5f 48 61 73 50 72 69 6d  ags & TF_HasPrim
8fc0: 61 72 79 4b 65 79 20 29 7b 0a 20 20 20 20 73 71  aryKey ){.    sq
8fd0: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
8fe0: 61 72 73 65 2c 20 0a 20 20 20 20 20 20 22 74 61  arse, .      "ta
8ff0: 62 6c 65 20 5c 22 25 73 5c 22 20 68 61 73 20 6d  ble \"%s\" has m
9000: 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 70 72 69  ore than one pri
9010: 6d 61 72 79 20 6b 65 79 22 2c 20 70 54 61 62 2d  mary key", pTab-
9020: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 67 6f 74  >zName);.    got
9030: 6f 20 70 72 69 6d 61 72 79 5f 6b 65 79 5f 65 78  o primary_key_ex
9040: 69 74 3b 0a 20 20 7d 0a 20 20 70 54 61 62 2d 3e  it;.  }.  pTab->
9050: 74 61 62 46 6c 61 67 73 20 7c 3d 20 54 46 5f 48  tabFlags |= TF_H
9060: 61 73 50 72 69 6d 61 72 79 4b 65 79 3b 0a 20 20  asPrimaryKey;.  
9070: 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a  if( pList==0 ){.
9080: 20 20 20 20 69 43 6f 6c 20 3d 20 70 54 61 62 2d      iCol = pTab-
9090: 3e 6e 43 6f 6c 20 2d 20 31 3b 0a 20 20 20 20 70  >nCol - 1;.    p
90a0: 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e  Tab->aCol[iCol].
90b0: 69 73 50 72 69 6d 4b 65 79 20 3d 20 31 3b 0a 20  isPrimKey = 1;. 
90c0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 6f 72 28   }else{.    for(
90d0: 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45  i=0; i<pList->nE
90e0: 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  xpr; i++){.     
90f0: 20 66 6f 72 28 69 43 6f 6c 3d 30 3b 20 69 43 6f   for(iCol=0; iCo
9100: 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 43  l<pTab->nCol; iC
9110: 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69  ol++){.        i
9120: 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  f( sqlite3StrICm
9130: 70 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e  p(pList->a[i].zN
9140: 61 6d 65 2c 20 70 54 61 62 2d 3e 61 43 6f 6c 5b  ame, pTab->aCol[
9150: 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20  iCol].zName)==0 
9160: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  ){.          bre
9170: 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
9180: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
9190: 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 20  iCol<pTab->nCol 
91a0: 29 7b 0a 20 20 20 20 20 20 20 20 70 54 61 62 2d  ){.        pTab-
91b0: 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 69 73 50 72  >aCol[iCol].isPr
91c0: 69 6d 4b 65 79 20 3d 20 31 3b 0a 20 20 20 20 20  imKey = 1;.     
91d0: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
91e0: 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 31 20   pList->nExpr>1 
91f0: 29 20 69 43 6f 6c 20 3d 20 2d 31 3b 0a 20 20 7d  ) iCol = -1;.  }
9200: 0a 20 20 69 66 28 20 69 43 6f 6c 3e 3d 30 20 26  .  if( iCol>=0 &
9210: 26 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f  & iCol<pTab->nCo
9220: 6c 20 29 7b 0a 20 20 20 20 7a 54 79 70 65 20 3d  l ){.    zType =
9230: 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c   pTab->aCol[iCol
9240: 5d 2e 7a 54 79 70 65 3b 0a 20 20 7d 0a 20 20 69  ].zType;.  }.  i
9250: 66 28 20 7a 54 79 70 65 20 26 26 20 73 71 6c 69  f( zType && sqli
9260: 74 65 33 53 74 72 49 43 6d 70 28 7a 54 79 70 65  te3StrICmp(zType
9270: 2c 20 22 49 4e 54 45 47 45 52 22 29 3d 3d 30 0a  , "INTEGER")==0.
9280: 20 20 20 20 20 20 20 20 26 26 20 73 6f 72 74 4f          && sortO
9290: 72 64 65 72 3d 3d 53 51 4c 49 54 45 5f 53 4f 5f  rder==SQLITE_SO_
92a0: 41 53 43 20 29 7b 0a 20 20 20 20 70 54 61 62 2d  ASC ){.    pTab-
92b0: 3e 69 50 4b 65 79 20 3d 20 69 43 6f 6c 3b 0a 20  >iPKey = iCol;. 
92c0: 20 20 20 70 54 61 62 2d 3e 6b 65 79 43 6f 6e 66     pTab->keyConf
92d0: 20 3d 20 6f 6e 45 72 72 6f 72 3b 0a 20 20 20 20   = onError;.    
92e0: 61 73 73 65 72 74 28 20 61 75 74 6f 49 6e 63 3d  assert( autoInc=
92f0: 3d 30 20 7c 7c 20 61 75 74 6f 49 6e 63 3d 3d 31  =0 || autoInc==1
9300: 20 29 3b 0a 20 20 20 20 70 54 61 62 2d 3e 74 61   );.    pTab->ta
9310: 62 46 6c 61 67 73 20 7c 3d 20 61 75 74 6f 49 6e  bFlags |= autoIn
9320: 63 2a 54 46 5f 41 75 74 6f 69 6e 63 72 65 6d 65  c*TF_Autoincreme
9330: 6e 74 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  nt;.  }else if( 
9340: 61 75 74 6f 49 6e 63 20 29 7b 0a 23 69 66 6e 64  autoInc ){.#ifnd
9350: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
9360: 55 54 4f 49 4e 43 52 45 4d 45 4e 54 0a 20 20 20  UTOINCREMENT.   
9370: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
9380: 28 70 50 61 72 73 65 2c 20 22 41 55 54 4f 49 4e  (pParse, "AUTOIN
9390: 43 52 45 4d 45 4e 54 20 69 73 20 6f 6e 6c 79 20  CREMENT is only 
93a0: 61 6c 6c 6f 77 65 64 20 6f 6e 20 61 6e 20 22 0a  allowed on an ".
93b0: 20 20 20 20 20 20 20 22 49 4e 54 45 47 45 52 20         "INTEGER 
93c0: 50 52 49 4d 41 52 59 20 4b 45 59 22 29 3b 0a 23  PRIMARY KEY");.#
93d0: 65 6e 64 69 66 0a 20 20 7d 65 6c 73 65 7b 0a 20  endif.  }else{. 
93e0: 20 20 20 73 71 6c 69 74 65 33 43 72 65 61 74 65     sqlite3Create
93f0: 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 30 2c  Index(pParse, 0,
9400: 20 30 2c 20 30 2c 20 70 4c 69 73 74 2c 20 6f 6e   0, 0, pList, on
9410: 45 72 72 6f 72 2c 20 30 2c 20 30 2c 20 73 6f 72  Error, 0, 0, sor
9420: 74 4f 72 64 65 72 2c 20 30 29 3b 0a 20 20 20 20  tOrder, 0);.    
9430: 70 4c 69 73 74 20 3d 20 30 3b 0a 20 20 7d 0a 0a  pList = 0;.  }..
9440: 70 72 69 6d 61 72 79 5f 6b 65 79 5f 65 78 69 74  primary_key_exit
9450: 3a 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c  :.  sqlite3ExprL
9460: 69 73 74 44 65 6c 65 74 65 28 70 50 61 72 73 65  istDelete(pParse
9470: 2d 3e 64 62 2c 20 70 4c 69 73 74 29 3b 0a 20 20  ->db, pList);.  
9480: 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  return;.}../*.**
9490: 20 41 64 64 20 61 20 6e 65 77 20 43 48 45 43 4b   Add a new CHECK
94a0: 20 63 6f 6e 73 74 72 61 69 6e 74 20 74 6f 20 74   constraint to t
94b0: 68 65 20 74 61 62 6c 65 20 63 75 72 72 65 6e 74  he table current
94c0: 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75  ly under constru
94d0: 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ction..*/.void s
94e0: 71 6c 69 74 65 33 41 64 64 43 68 65 63 6b 43 6f  qlite3AddCheckCo
94f0: 6e 73 74 72 61 69 6e 74 28 0a 20 20 50 61 72 73  nstraint(.  Pars
9500: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a  e *pParse,    /*
9510: 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
9520: 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 43 68 65   */.  Expr *pChe
9530: 63 6b 45 78 70 72 20 20 2f 2a 20 54 68 65 20 63  ckExpr  /* The c
9540: 68 65 63 6b 20 65 78 70 72 65 73 73 69 6f 6e 20  heck expression 
9550: 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  */.){.  sqlite3 
9560: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
9570: 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
9580: 5f 4f 4d 49 54 5f 43 48 45 43 4b 0a 20 20 54 61  _OMIT_CHECK.  Ta
9590: 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 50 61 72  ble *pTab = pPar
95a0: 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20  se->pNewTable;. 
95b0: 20 69 66 28 20 70 54 61 62 20 26 26 20 21 49 4e   if( pTab && !IN
95c0: 5f 44 45 43 4c 41 52 45 5f 56 54 41 42 20 29 7b  _DECLARE_VTAB ){
95d0: 0a 20 20 20 20 2f 2a 20 54 68 65 20 43 48 45 43  .    /* The CHEC
95e0: 4b 20 65 78 70 72 65 73 73 69 6f 6e 20 6d 75 73  K expression mus
95f0: 74 20 62 65 20 64 75 70 6c 69 63 61 74 65 64 20  t be duplicated 
9600: 73 6f 20 74 68 61 74 20 74 6f 6b 65 6e 73 20 72  so that tokens r
9610: 65 66 65 72 0a 20 20 20 20 2a 2a 20 74 6f 20 6d  efer.    ** to m
9620: 61 6c 6c 6f 63 65 64 20 73 70 61 63 65 20 61 6e  alloced space an
9630: 64 20 6e 6f 74 20 74 68 65 20 28 65 70 68 65 6d  d not the (ephem
9640: 65 72 61 6c 29 20 74 65 78 74 20 6f 66 20 74 68  eral) text of th
9650: 65 20 43 52 45 41 54 45 20 54 41 42 4c 45 0a 20  e CREATE TABLE. 
9660: 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20     ** statement 
9670: 2a 2f 0a 20 20 20 20 70 54 61 62 2d 3e 70 43 68  */.    pTab->pCh
9680: 65 63 6b 20 3d 20 73 71 6c 69 74 65 33 45 78 70  eck = sqlite3Exp
9690: 72 41 6e 64 28 64 62 2c 20 70 54 61 62 2d 3e 70  rAnd(db, pTab->p
96a0: 43 68 65 63 6b 2c 20 0a 20 20 20 20 20 20 20 20  Check, .        
96b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
96c0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
96d0: 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 43 68  3ExprDup(db, pCh
96e0: 65 63 6b 45 78 70 72 29 29 3b 0a 20 20 7d 0a 23  eckExpr));.  }.#
96f0: 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33 45  endif.  sqlite3E
9700: 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 43  xprDelete(db, pC
9710: 68 65 63 6b 45 78 70 72 29 3b 0a 7d 0a 0a 2f 2a  heckExpr);.}../*
9720: 0a 2a 2a 20 53 65 74 20 74 68 65 20 63 6f 6c 6c  .** Set the coll
9730: 61 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 6f  ation function o
9740: 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e  f the most recen
9750: 74 6c 79 20 70 61 72 73 65 64 20 74 61 62 6c 65  tly parsed table
9760: 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 74 6f 20 74 68   column.** to th
9770: 65 20 43 6f 6c 6c 53 65 71 20 67 69 76 65 6e 2e  e CollSeq given.
9780: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
9790: 41 64 64 43 6f 6c 6c 61 74 65 54 79 70 65 28 50  AddCollateType(P
97a0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 6f  arse *pParse, To
97b0: 6b 65 6e 20 2a 70 54 6f 6b 65 6e 29 7b 0a 20 20  ken *pToken){.  
97c0: 54 61 62 6c 65 20 2a 70 3b 0a 20 20 69 6e 74 20  Table *p;.  int 
97d0: 69 3b 0a 20 20 63 68 61 72 20 2a 7a 43 6f 6c 6c  i;.  char *zColl
97e0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
97f0: 2a 20 44 65 71 75 6f 74 65 64 20 6e 61 6d 65 20  * Dequoted name 
9800: 6f 66 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  of collation seq
9810: 75 65 6e 63 65 20 2a 2f 0a 20 20 73 71 6c 69 74  uence */.  sqlit
9820: 65 33 20 2a 64 62 3b 0a 0a 20 20 69 66 28 20 28  e3 *db;..  if( (
9830: 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  p = pParse->pNew
9840: 54 61 62 6c 65 29 3d 3d 30 20 29 20 72 65 74 75  Table)==0 ) retu
9850: 72 6e 3b 0a 20 20 69 20 3d 20 70 2d 3e 6e 43 6f  rn;.  i = p->nCo
9860: 6c 2d 31 3b 0a 20 20 64 62 20 3d 20 70 50 61 72  l-1;.  db = pPar
9870: 73 65 2d 3e 64 62 3b 0a 20 20 7a 43 6f 6c 6c 20  se->db;.  zColl 
9880: 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f  = sqlite3NameFro
9890: 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 54 6f 6b 65  mToken(db, pToke
98a0: 6e 29 3b 0a 20 20 69 66 28 20 21 7a 43 6f 6c 6c  n);.  if( !zColl
98b0: 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 69 66   ) return;..  if
98c0: 28 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 43  ( sqlite3LocateC
98d0: 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 7a  ollSeq(pParse, z
98e0: 43 6f 6c 6c 2c 20 2d 31 29 20 29 7b 0a 20 20 20  Coll, -1) ){.   
98f0: 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20   Index *pIdx;.  
9900: 20 20 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 43 6f    p->aCol[i].zCo
9910: 6c 6c 20 3d 20 7a 43 6f 6c 6c 3b 0a 20 20 0a 20  ll = zColl;.  . 
9920: 20 20 20 2f 2a 20 49 66 20 74 68 65 20 63 6f 6c     /* If the col
9930: 75 6d 6e 20 69 73 20 64 65 63 6c 61 72 65 64 20  umn is declared 
9940: 61 73 20 22 3c 6e 61 6d 65 3e 20 50 52 49 4d 41  as "<name> PRIMA
9950: 52 59 20 4b 45 59 20 43 4f 4c 4c 41 54 45 20 3c  RY KEY COLLATE <
9960: 74 79 70 65 3e 22 2c 0a 20 20 20 20 2a 2a 20 74  type>",.    ** t
9970: 68 65 6e 20 61 6e 20 69 6e 64 65 78 20 6d 61 79  hen an index may
9980: 20 68 61 76 65 20 62 65 65 6e 20 63 72 65 61 74   have been creat
9990: 65 64 20 6f 6e 20 74 68 69 73 20 63 6f 6c 75 6d  ed on this colum
99a0: 6e 20 62 65 66 6f 72 65 20 74 68 65 0a 20 20 20  n before the.   
99b0: 20 2a 2a 20 63 6f 6c 6c 61 74 69 6f 6e 20 74 79   ** collation ty
99c0: 70 65 20 77 61 73 20 61 64 64 65 64 2e 20 43 6f  pe was added. Co
99d0: 72 72 65 63 74 20 74 68 69 73 20 69 66 20 69 74  rrect this if it
99e0: 20 69 73 20 74 68 65 20 63 61 73 65 2e 0a 20 20   is the case..  
99f0: 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70 49 64    */.    for(pId
9a00: 78 3d 70 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64  x=p->pIndex; pId
9a10: 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e  x; pIdx=pIdx->pN
9a20: 65 78 74 29 7b 0a 20 20 20 20 20 20 61 73 73 65  ext){.      asse
9a30: 72 74 28 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d  rt( pIdx->nColum
9a40: 6e 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 69 66  n==1 );.      if
9a50: 28 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e  ( pIdx->aiColumn
9a60: 5b 30 5d 3d 3d 69 20 29 7b 0a 20 20 20 20 20 20  [0]==i ){.      
9a70: 20 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 30    pIdx->azColl[0
9a80: 5d 20 3d 20 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a  ] = p->aCol[i].z
9a90: 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Coll;.      }.  
9aa0: 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
9ab0: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
9ac0: 62 2c 20 7a 43 6f 6c 6c 29 3b 0a 20 20 7d 0a 7d  b, zColl);.  }.}
9ad0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
9ae0: 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 74 68  ction returns th
9af0: 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  e collation sequ
9b00: 65 6e 63 65 20 66 6f 72 20 64 61 74 61 62 61 73  ence for databas
9b10: 65 20 6e 61 74 69 76 65 20 74 65 78 74 0a 2a 2a  e native text.**
9b20: 20 65 6e 63 6f 64 69 6e 67 20 69 64 65 6e 74 69   encoding identi
9b30: 66 69 65 64 20 62 79 20 74 68 65 20 73 74 72 69  fied by the stri
9b40: 6e 67 20 7a 4e 61 6d 65 2c 20 6c 65 6e 67 74 68  ng zName, length
9b50: 20 6e 4e 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20 49 66   nName..**.** If
9b60: 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 63   the requested c
9b70: 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
9b80: 65 20 69 73 20 6e 6f 74 20 61 76 61 69 6c 61 62  e is not availab
9b90: 6c 65 2c 20 6f 72 20 6e 6f 74 20 61 76 61 69 6c  le, or not avail
9ba0: 61 62 6c 65 0a 2a 2a 20 69 6e 20 74 68 65 20 64  able.** in the d
9bb0: 61 74 61 62 61 73 65 20 6e 61 74 69 76 65 20 65  atabase native e
9bc0: 6e 63 6f 64 69 6e 67 2c 20 74 68 65 20 63 6f 6c  ncoding, the col
9bd0: 6c 61 74 69 6f 6e 20 66 61 63 74 6f 72 79 20 69  lation factory i
9be0: 73 20 69 6e 76 6f 6b 65 64 20 74 6f 0a 2a 2a 20  s invoked to.** 
9bf0: 72 65 71 75 65 73 74 20 69 74 2e 20 49 66 20 74  request it. If t
9c00: 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 61 63  he collation fac
9c10: 74 6f 72 79 20 64 6f 65 73 20 6e 6f 74 20 73 75  tory does not su
9c20: 70 70 6c 79 20 73 75 63 68 20 61 20 73 65 71 75  pply such a sequ
9c30: 65 6e 63 65 2c 0a 2a 2a 20 61 6e 64 20 74 68 65  ence,.** and the
9c40: 20 73 65 71 75 65 6e 63 65 20 69 73 20 61 76 61   sequence is ava
9c50: 69 6c 61 62 6c 65 20 69 6e 20 61 6e 6f 74 68 65  ilable in anothe
9c60: 72 20 74 65 78 74 20 65 6e 63 6f 64 69 6e 67 2c  r text encoding,
9c70: 20 74 68 65 6e 20 74 68 61 74 20 69 73 0a 2a 2a   then that is.**
9c80: 20 72 65 74 75 72 6e 65 64 20 69 6e 73 74 65 61   returned instea
9c90: 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 20 76  d..**.** If no v
9ca0: 65 72 73 69 6f 6e 73 20 6f 66 20 74 68 65 20 72  ersions of the r
9cb0: 65 71 75 65 73 74 65 64 20 63 6f 6c 6c 61 74 69  equested collati
9cc0: 6f 6e 73 20 73 65 71 75 65 6e 63 65 20 61 72 65  ons sequence are
9cd0: 20 61 76 61 69 6c 61 62 6c 65 2c 20 6f 72 0a 2a   available, or.*
9ce0: 2a 20 61 6e 6f 74 68 65 72 20 65 72 72 6f 72 20  * another error 
9cf0: 6f 63 63 75 72 73 2c 20 4e 55 4c 4c 20 69 73 20  occurs, NULL is 
9d00: 72 65 74 75 72 6e 65 64 20 61 6e 64 20 61 6e 20  returned and an 
9d10: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 77 72  error message wr
9d20: 69 74 74 65 6e 20 69 6e 74 6f 0a 2a 2a 20 70 50  itten into.** pP
9d30: 61 72 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  arse..**.** This
9d40: 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 77 72   routine is a wr
9d50: 61 70 70 65 72 20 61 72 6f 75 6e 64 20 73 71 6c  apper around sql
9d60: 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28  ite3FindCollSeq(
9d70: 29 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  ).  This routine
9d80: 0a 2a 2a 20 69 6e 76 6f 6b 65 73 20 74 68 65 20  .** invokes the 
9d90: 63 6f 6c 6c 61 74 69 6f 6e 20 66 61 63 74 6f 72  collation factor
9da0: 79 20 69 66 20 74 68 65 20 6e 61 6d 65 64 20 63  y if the named c
9db0: 6f 6c 6c 61 74 69 6f 6e 20 63 61 6e 6e 6f 74 20  ollation cannot 
9dc0: 62 65 20 66 6f 75 6e 64 0a 2a 2a 20 61 6e 64 20  be found.** and 
9dd0: 67 65 6e 65 72 61 74 65 73 20 61 6e 20 65 72 72  generates an err
9de0: 6f 72 20 6d 65 73 73 61 67 65 2e 0a 2a 2f 0a 43  or message..*/.C
9df0: 6f 6c 6c 53 65 71 20 2a 73 71 6c 69 74 65 33 4c  ollSeq *sqlite3L
9e00: 6f 63 61 74 65 43 6f 6c 6c 53 65 71 28 50 61 72  ocateCollSeq(Par
9e10: 73 65 20 2a 70 50 61 72 73 65 2c 20 63 6f 6e 73  se *pParse, cons
9e20: 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 69  t char *zName, i
9e30: 6e 74 20 6e 4e 61 6d 65 29 7b 0a 20 20 73 71 6c  nt nName){.  sql
9e40: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
9e50: 65 2d 3e 64 62 3b 0a 20 20 75 38 20 65 6e 63 20  e->db;.  u8 enc 
9e60: 3d 20 45 4e 43 28 64 62 29 3b 0a 20 20 75 38 20  = ENC(db);.  u8 
9e70: 69 6e 69 74 62 75 73 79 20 3d 20 64 62 2d 3e 69  initbusy = db->i
9e80: 6e 69 74 2e 62 75 73 79 3b 0a 20 20 43 6f 6c 6c  nit.busy;.  Coll
9e90: 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 0a 20 20 70  Seq *pColl;..  p
9ea0: 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 46 69  Coll = sqlite3Fi
9eb0: 6e 64 43 6f 6c 6c 53 65 71 28 64 62 2c 20 65 6e  ndCollSeq(db, en
9ec0: 63 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 2c  c, zName, nName,
9ed0: 20 69 6e 69 74 62 75 73 79 29 3b 0a 20 20 69 66   initbusy);.  if
9ee0: 28 20 21 69 6e 69 74 62 75 73 79 20 26 26 20 28  ( !initbusy && (
9ef0: 21 70 43 6f 6c 6c 20 7c 7c 20 21 70 43 6f 6c 6c  !pColl || !pColl
9f00: 2d 3e 78 43 6d 70 29 20 29 7b 0a 20 20 20 20 70  ->xCmp) ){.    p
9f10: 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 47 65  Coll = sqlite3Ge
9f20: 74 43 6f 6c 6c 53 65 71 28 64 62 2c 20 70 43 6f  tCollSeq(db, pCo
9f30: 6c 6c 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65  ll, zName, nName
9f40: 29 3b 0a 20 20 20 20 69 66 28 20 21 70 43 6f 6c  );.    if( !pCol
9f50: 6c 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e  l ){.      if( n
9f60: 4e 61 6d 65 3c 30 20 29 7b 0a 20 20 20 20 20 20  Name<0 ){.      
9f70: 20 20 6e 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65    nName = sqlite
9f80: 33 53 74 72 6c 65 6e 28 64 62 2c 20 7a 4e 61 6d  3Strlen(db, zNam
9f90: 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e);.      }.    
9fa0: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
9fb0: 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 73 75  g(pParse, "no su
9fc0: 63 68 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  ch collation seq
9fd0: 75 65 6e 63 65 3a 20 25 2e 2a 73 22 2c 20 6e 4e  uence: %.*s", nN
9fe0: 61 6d 65 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20  ame, zName);.   
9ff0: 20 20 20 70 43 6f 6c 6c 20 3d 20 30 3b 0a 20 20     pColl = 0;.  
a000: 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72    }.  }..  retur
a010: 6e 20 70 43 6f 6c 6c 3b 0a 7d 0a 0a 0a 2f 2a 0a  n pColl;.}.../*.
a020: 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
a030: 20 74 68 61 74 20 77 69 6c 6c 20 69 6e 63 72 65   that will incre
a040: 6d 65 6e 74 20 74 68 65 20 73 63 68 65 6d 61 20  ment the schema 
a050: 63 6f 6f 6b 69 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  cookie..**.** Th
a060: 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 20  e schema cookie 
a070: 69 73 20 75 73 65 64 20 74 6f 20 64 65 74 65 72  is used to deter
a080: 6d 69 6e 65 20 77 68 65 6e 20 74 68 65 20 73 63  mine when the sc
a090: 68 65 6d 61 20 66 6f 72 20 74 68 65 0a 2a 2a 20  hema for the.** 
a0a0: 64 61 74 61 62 61 73 65 20 63 68 61 6e 67 65 73  database changes
a0b0: 2e 20 20 41 66 74 65 72 20 65 61 63 68 20 73 63  .  After each sc
a0c0: 68 65 6d 61 20 63 68 61 6e 67 65 2c 20 74 68 65  hema change, the
a0d0: 20 63 6f 6f 6b 69 65 20 76 61 6c 75 65 0a 2a 2a   cookie value.**
a0e0: 20 63 68 61 6e 67 65 73 2e 20 20 57 68 65 6e 20   changes.  When 
a0f0: 61 20 70 72 6f 63 65 73 73 20 66 69 72 73 74 20  a process first 
a100: 72 65 61 64 73 20 74 68 65 20 73 63 68 65 6d 61  reads the schema
a110: 20 69 74 20 72 65 63 6f 72 64 73 20 74 68 65 0a   it records the.
a120: 2a 2a 20 63 6f 6f 6b 69 65 2e 20 20 54 68 65 72  ** cookie.  Ther
a130: 65 61 66 74 65 72 2c 20 77 68 65 6e 65 76 65 72  eafter, whenever
a140: 20 69 74 20 67 6f 65 73 20 74 6f 20 61 63 63 65   it goes to acce
a150: 73 73 20 74 68 65 20 64 61 74 61 62 61 73 65 2c  ss the database,
a160: 0a 2a 2a 20 69 74 20 63 68 65 63 6b 73 20 74 68  .** it checks th
a170: 65 20 63 6f 6f 6b 69 65 20 74 6f 20 6d 61 6b 65  e cookie to make
a180: 20 73 75 72 65 20 74 68 65 20 73 63 68 65 6d 61   sure the schema
a190: 20 68 61 73 20 6e 6f 74 20 63 68 61 6e 67 65 64   has not changed
a1a0: 0a 2a 2a 20 73 69 6e 63 65 20 69 74 20 77 61 73  .** since it was
a1b0: 20 6c 61 73 74 20 72 65 61 64 2e 0a 2a 2a 0a 2a   last read..**.*
a1c0: 2a 20 54 68 69 73 20 70 6c 61 6e 20 69 73 20 6e  * This plan is n
a1d0: 6f 74 20 63 6f 6d 70 6c 65 74 65 6c 79 20 62 75  ot completely bu
a1e0: 6c 6c 65 74 2d 70 72 6f 6f 66 2e 20 20 49 74 20  llet-proof.  It 
a1f0: 69 73 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 0a  is possible for.
a200: 2a 2a 20 74 68 65 20 73 63 68 65 6d 61 20 74 6f  ** the schema to
a210: 20 63 68 61 6e 67 65 20 6d 75 6c 74 69 70 6c 65   change multiple
a220: 20 74 69 6d 65 73 20 61 6e 64 20 66 6f 72 20 74   times and for t
a230: 68 65 20 63 6f 6f 6b 69 65 20 74 6f 20 62 65 0a  he cookie to be.
a240: 2a 2a 20 73 65 74 20 62 61 63 6b 20 74 6f 20 70  ** set back to p
a250: 72 69 6f 72 20 76 61 6c 75 65 2e 20 20 42 75 74  rior value.  But
a260: 20 73 63 68 65 6d 61 20 63 68 61 6e 67 65 73 20   schema changes 
a270: 61 72 65 20 69 6e 66 72 65 71 75 65 6e 74 0a 2a  are infrequent.*
a280: 2a 20 61 6e 64 20 74 68 65 20 70 72 6f 62 61 62  * and the probab
a290: 69 6c 69 74 79 20 6f 66 20 68 69 74 74 69 6e 67  ility of hitting
a2a0: 20 74 68 65 20 73 61 6d 65 20 63 6f 6f 6b 69 65   the same cookie
a2b0: 20 76 61 6c 75 65 20 69 73 20 6f 6e 6c 79 0a 2a   value is only.*
a2c0: 2a 20 31 20 63 68 61 6e 63 65 20 69 6e 20 32 5e  * 1 chance in 2^
a2d0: 33 32 2e 20 20 53 6f 20 77 65 27 72 65 20 73 61  32.  So we're sa
a2e0: 66 65 20 65 6e 6f 75 67 68 2e 0a 2a 2f 0a 76 6f  fe enough..*/.vo
a2f0: 69 64 20 73 71 6c 69 74 65 33 43 68 61 6e 67 65  id sqlite3Change
a300: 43 6f 6f 6b 69 65 28 50 61 72 73 65 20 2a 70 50  Cookie(Parse *pP
a310: 61 72 73 65 2c 20 69 6e 74 20 69 44 62 29 7b 0a  arse, int iDb){.
a320: 20 20 69 6e 74 20 72 31 20 3d 20 73 71 6c 69 74    int r1 = sqlit
a330: 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
a340: 72 73 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 20  rse);.  sqlite3 
a350: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
a360: 3b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  ;.  Vdbe *v = pP
a370: 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 73  arse->pVdbe;.  s
a380: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
a390: 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
a3a0: 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53 63  db->aDb[iDb].pSc
a3b0: 68 65 6d 61 2d 3e 73 63 68 65 6d 61 5f 63 6f 6f  hema->schema_coo
a3c0: 6b 69 65 2b 31 2c 20 72 31 29 3b 0a 20 20 73 71  kie+1, r1);.  sq
a3d0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
a3e0: 76 2c 20 4f 50 5f 53 65 74 43 6f 6f 6b 69 65 2c  v, OP_SetCookie,
a3f0: 20 69 44 62 2c 20 30 2c 20 72 31 29 3b 0a 20 20   iDb, 0, r1);.  
a400: 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
a410: 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 31  mpReg(pParse, r1
a420: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 65 61 73  );.}../*.** Meas
a430: 75 72 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ure the number o
a440: 66 20 63 68 61 72 61 63 74 65 72 73 20 6e 65 65  f characters nee
a450: 64 65 64 20 74 6f 20 6f 75 74 70 75 74 20 74 68  ded to output th
a460: 65 20 67 69 76 65 6e 0a 2a 2a 20 69 64 65 6e 74  e given.** ident
a470: 69 66 69 65 72 2e 20 20 54 68 65 20 6e 75 6d 62  ifier.  The numb
a480: 65 72 20 72 65 74 75 72 6e 65 64 20 69 6e 63 6c  er returned incl
a490: 75 64 65 73 20 61 6e 79 20 71 75 6f 74 65 73 20  udes any quotes 
a4a0: 75 73 65 64 0a 2a 2a 20 62 75 74 20 64 6f 65 73  used.** but does
a4b0: 20 6e 6f 74 20 69 6e 63 6c 75 64 65 20 74 68 65   not include the
a4c0: 20 6e 75 6c 6c 20 74 65 72 6d 69 6e 61 74 6f 72   null terminator
a4d0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 65 73 74 69  ..**.** The esti
a4e0: 6d 61 74 65 20 69 73 20 63 6f 6e 73 65 72 76 61  mate is conserva
a4f0: 74 69 76 65 2e 20 20 49 74 20 6d 69 67 68 74 20  tive.  It might 
a500: 62 65 20 6c 61 72 67 65 72 20 74 68 61 74 20 77  be larger that w
a510: 68 61 74 20 69 73 0a 2a 2a 20 72 65 61 6c 6c 79  hat is.** really
a520: 20 6e 65 65 64 65 64 2e 0a 2a 2f 0a 73 74 61 74   needed..*/.stat
a530: 69 63 20 69 6e 74 20 69 64 65 6e 74 4c 65 6e 67  ic int identLeng
a540: 74 68 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  th(const char *z
a550: 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 66 6f  ){.  int n;.  fo
a560: 72 28 6e 3d 30 3b 20 2a 7a 3b 20 6e 2b 2b 2c 20  r(n=0; *z; n++, 
a570: 7a 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 2a 7a  z++){.    if( *z
a580: 3d 3d 27 22 27 20 29 7b 20 6e 2b 2b 3b 20 7d 0a  =='"' ){ n++; }.
a590: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 20 2b    }.  return n +
a5a0: 20 32 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69   2;.}../*.** Wri
a5b0: 74 65 20 61 6e 20 69 64 65 6e 74 69 66 69 65 72  te an identifier
a5c0: 20 6f 6e 74 6f 20 74 68 65 20 65 6e 64 20 6f 66   onto the end of
a5d0: 20 74 68 65 20 67 69 76 65 6e 20 73 74 72 69 6e   the given strin
a5e0: 67 2e 20 20 41 64 64 0a 2a 2a 20 71 75 6f 74 65  g.  Add.** quote
a5f0: 20 63 68 61 72 61 63 74 65 72 73 20 61 73 20 6e   characters as n
a600: 65 65 64 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  eeded..*/.static
a610: 20 76 6f 69 64 20 69 64 65 6e 74 50 75 74 28 63   void identPut(c
a620: 68 61 72 20 2a 7a 2c 20 69 6e 74 20 2a 70 49 64  har *z, int *pId
a630: 78 2c 20 63 68 61 72 20 2a 7a 53 69 67 6e 65 64  x, char *zSigned
a640: 49 64 65 6e 74 29 7b 0a 20 20 75 6e 73 69 67 6e  Ident){.  unsign
a650: 65 64 20 63 68 61 72 20 2a 7a 49 64 65 6e 74 20  ed char *zIdent 
a660: 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72  = (unsigned char
a670: 2a 29 7a 53 69 67 6e 65 64 49 64 65 6e 74 3b 0a  *)zSignedIdent;.
a680: 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6e 65 65 64    int i, j, need
a690: 51 75 6f 74 65 3b 0a 20 20 69 20 3d 20 2a 70 49  Quote;.  i = *pI
a6a0: 64 78 3b 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 7a  dx;.  for(j=0; z
a6b0: 49 64 65 6e 74 5b 6a 5d 3b 20 6a 2b 2b 29 7b 0a  Ident[j]; j++){.
a6c0: 20 20 20 20 69 66 28 20 21 69 73 61 6c 6e 75 6d      if( !isalnum
a6d0: 28 7a 49 64 65 6e 74 5b 6a 5d 29 20 26 26 20 7a  (zIdent[j]) && z
a6e0: 49 64 65 6e 74 5b 6a 5d 21 3d 27 5f 27 20 29 20  Ident[j]!='_' ) 
a6f0: 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 6e 65 65  break;.  }.  nee
a700: 64 51 75 6f 74 65 20 3d 20 20 7a 49 64 65 6e 74  dQuote =  zIdent
a710: 5b 6a 5d 21 3d 30 20 7c 7c 20 69 73 64 69 67 69  [j]!=0 || isdigi
a720: 74 28 7a 49 64 65 6e 74 5b 30 5d 29 0a 20 20 20  t(zIdent[0]).   
a730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
a740: 7c 20 73 71 6c 69 74 65 33 4b 65 79 77 6f 72 64  | sqlite3Keyword
a750: 43 6f 64 65 28 7a 49 64 65 6e 74 2c 20 6a 29 21  Code(zIdent, j)!
a760: 3d 54 4b 5f 49 44 3b 0a 20 20 69 66 28 20 6e 65  =TK_ID;.  if( ne
a770: 65 64 51 75 6f 74 65 20 29 20 7a 5b 69 2b 2b 5d  edQuote ) z[i++]
a780: 20 3d 20 27 22 27 3b 0a 20 20 66 6f 72 28 6a 3d   = '"';.  for(j=
a790: 30 3b 20 7a 49 64 65 6e 74 5b 6a 5d 3b 20 6a 2b  0; zIdent[j]; j+
a7a0: 2b 29 7b 0a 20 20 20 20 7a 5b 69 2b 2b 5d 20 3d  +){.    z[i++] =
a7b0: 20 7a 49 64 65 6e 74 5b 6a 5d 3b 0a 20 20 20 20   zIdent[j];.    
a7c0: 69 66 28 20 7a 49 64 65 6e 74 5b 6a 5d 3d 3d 27  if( zIdent[j]=='
a7d0: 22 27 20 29 20 7a 5b 69 2b 2b 5d 20 3d 20 27 22  "' ) z[i++] = '"
a7e0: 27 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 65 65  ';.  }.  if( nee
a7f0: 64 51 75 6f 74 65 20 29 20 7a 5b 69 2b 2b 5d 20  dQuote ) z[i++] 
a800: 3d 20 27 22 27 3b 0a 20 20 7a 5b 69 5d 20 3d 20  = '"';.  z[i] = 
a810: 30 3b 0a 20 20 2a 70 49 64 78 20 3d 20 69 3b 0a  0;.  *pIdx = i;.
a820: 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
a830: 65 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45  e a CREATE TABLE
a840: 20 73 74 61 74 65 6d 65 6e 74 20 61 70 70 72 6f   statement appro
a850: 70 72 69 61 74 65 20 66 6f 72 20 74 68 65 20 67  priate for the g
a860: 69 76 65 6e 0a 2a 2a 20 74 61 62 6c 65 2e 20 20  iven.** table.  
a870: 4d 65 6d 6f 72 79 20 74 6f 20 68 6f 6c 64 20 74  Memory to hold t
a880: 68 65 20 74 65 78 74 20 6f 66 20 74 68 65 20 73  he text of the s
a890: 74 61 74 65 6d 65 6e 74 20 69 73 20 6f 62 74 61  tatement is obta
a8a0: 69 6e 65 64 0a 2a 2a 20 66 72 6f 6d 20 73 71 6c  ined.** from sql
a8b0: 69 74 65 4d 61 6c 6c 6f 63 28 29 20 61 6e 64 20  iteMalloc() and 
a8c0: 6d 75 73 74 20 62 65 20 66 72 65 65 64 20 62 79  must be freed by
a8d0: 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e   the calling fun
a8e0: 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ction..*/.static
a8f0: 20 63 68 61 72 20 2a 63 72 65 61 74 65 54 61 62   char *createTab
a900: 6c 65 53 74 6d 74 28 73 71 6c 69 74 65 33 20 2a  leStmt(sqlite3 *
a910: 64 62 2c 20 54 61 62 6c 65 20 2a 70 2c 20 69 6e  db, Table *p, in
a920: 74 20 69 73 54 65 6d 70 29 7b 0a 20 20 69 6e 74  t isTemp){.  int
a930: 20 69 2c 20 6b 2c 20 6e 3b 0a 20 20 63 68 61 72   i, k, n;.  char
a940: 20 2a 7a 53 74 6d 74 3b 0a 20 20 63 68 61 72 20   *zStmt;.  char 
a950: 2a 7a 53 65 70 2c 20 2a 7a 53 65 70 32 2c 20 2a  *zSep, *zSep2, *
a960: 7a 45 6e 64 2c 20 2a 7a 3b 0a 20 20 43 6f 6c 75  zEnd, *z;.  Colu
a970: 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 6e 20 3d 20  mn *pCol;.  n = 
a980: 30 3b 0a 20 20 66 6f 72 28 70 43 6f 6c 20 3d 20  0;.  for(pCol = 
a990: 70 2d 3e 61 43 6f 6c 2c 20 69 3d 30 3b 20 69 3c  p->aCol, i=0; i<
a9a0: 70 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70 43  p->nCol; i++, pC
a9b0: 6f 6c 2b 2b 29 7b 0a 20 20 20 20 6e 20 2b 3d 20  ol++){.    n += 
a9c0: 69 64 65 6e 74 4c 65 6e 67 74 68 28 70 43 6f 6c  identLength(pCol
a9d0: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7a 20  ->zName);.    z 
a9e0: 3d 20 70 43 6f 6c 2d 3e 7a 54 79 70 65 3b 0a 20  = pCol->zType;. 
a9f0: 20 20 20 69 66 28 20 7a 20 29 7b 0a 20 20 20 20     if( z ){.    
aa00: 20 20 6e 20 2b 3d 20 28 73 74 72 6c 65 6e 28 7a    n += (strlen(z
aa10: 29 20 2b 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20  ) + 1);.    }.  
aa20: 7d 0a 20 20 6e 20 2b 3d 20 69 64 65 6e 74 4c 65  }.  n += identLe
aa30: 6e 67 74 68 28 70 2d 3e 7a 4e 61 6d 65 29 3b 0a  ngth(p->zName);.
aa40: 20 20 69 66 28 20 6e 3c 35 30 20 29 7b 0a 20 20    if( n<50 ){.  
aa50: 20 20 7a 53 65 70 20 3d 20 22 22 3b 0a 20 20 20    zSep = "";.   
aa60: 20 7a 53 65 70 32 20 3d 20 22 2c 22 3b 0a 20 20   zSep2 = ",";.  
aa70: 20 20 7a 45 6e 64 20 3d 20 22 29 22 3b 0a 20 20    zEnd = ")";.  
aa80: 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 53 65 70 20  }else{.    zSep 
aa90: 3d 20 22 5c 6e 20 20 22 3b 0a 20 20 20 20 7a 53  = "\n  ";.    zS
aaa0: 65 70 32 20 3d 20 22 2c 5c 6e 20 20 22 3b 0a 20  ep2 = ",\n  ";. 
aab0: 20 20 20 7a 45 6e 64 20 3d 20 22 5c 6e 29 22 3b     zEnd = "\n)";
aac0: 0a 20 20 7d 0a 20 20 6e 20 2b 3d 20 33 35 20 2b  .  }.  n += 35 +
aad0: 20 36 2a 70 2d 3e 6e 43 6f 6c 3b 0a 20 20 7a 53   6*p->nCol;.  zS
aae0: 74 6d 74 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c  tmt = sqlite3Mal
aaf0: 6c 6f 63 28 20 6e 20 29 3b 0a 20 20 69 66 28 20  loc( n );.  if( 
ab00: 7a 53 74 6d 74 3d 3d 30 20 29 7b 0a 20 20 20 20  zStmt==0 ){.    
ab10: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
ab20: 20 3d 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e   = 1;.    return
ab30: 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65   0;.  }.  sqlite
ab40: 33 5f 73 6e 70 72 69 6e 74 66 28 6e 2c 20 7a 53  3_snprintf(n, zS
ab50: 74 6d 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20  tmt,.           
ab60: 20 20 20 20 20 20 20 21 4f 4d 49 54 5f 54 45 4d         !OMIT_TEM
ab70: 50 44 42 26 26 69 73 54 65 6d 70 20 3f 20 22 43  PDB&&isTemp ? "C
ab80: 52 45 41 54 45 20 54 45 4d 50 20 54 41 42 4c 45  REATE TEMP TABLE
ab90: 20 22 3a 22 43 52 45 41 54 45 20 54 41 42 4c 45   ":"CREATE TABLE
aba0: 20 22 29 3b 0a 20 20 6b 20 3d 20 73 74 72 6c 65   ");.  k = strle
abb0: 6e 28 7a 53 74 6d 74 29 3b 0a 20 20 69 64 65 6e  n(zStmt);.  iden
abc0: 74 50 75 74 28 7a 53 74 6d 74 2c 20 26 6b 2c 20  tPut(zStmt, &k, 
abd0: 70 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 7a 53 74  p->zName);.  zSt
abe0: 6d 74 5b 6b 2b 2b 5d 20 3d 20 27 28 27 3b 0a 20  mt[k++] = '(';. 
abf0: 20 66 6f 72 28 70 43 6f 6c 3d 70 2d 3e 61 43 6f   for(pCol=p->aCo
ac00: 6c 2c 20 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f  l, i=0; i<p->nCo
ac10: 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b  l; i++, pCol++){
ac20: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  .    sqlite3_snp
ac30: 72 69 6e 74 66 28 6e 2d 6b 2c 20 26 7a 53 74 6d  rintf(n-k, &zStm
ac40: 74 5b 6b 5d 2c 20 7a 53 65 70 29 3b 0a 20 20 20  t[k], zSep);.   
ac50: 20 6b 20 2b 3d 20 73 74 72 6c 65 6e 28 26 7a 53   k += strlen(&zS
ac60: 74 6d 74 5b 6b 5d 29 3b 0a 20 20 20 20 7a 53 65  tmt[k]);.    zSe
ac70: 70 20 3d 20 7a 53 65 70 32 3b 0a 20 20 20 20 69  p = zSep2;.    i
ac80: 64 65 6e 74 50 75 74 28 7a 53 74 6d 74 2c 20 26  dentPut(zStmt, &
ac90: 6b 2c 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 3b  k, pCol->zName);
aca0: 0a 20 20 20 20 69 66 28 20 28 7a 20 3d 20 70 43  .    if( (z = pC
acb0: 6f 6c 2d 3e 7a 54 79 70 65 29 21 3d 30 20 29 7b  ol->zType)!=0 ){
acc0: 0a 20 20 20 20 20 20 7a 53 74 6d 74 5b 6b 2b 2b  .      zStmt[k++
acd0: 5d 20 3d 20 27 20 27 3b 0a 20 20 20 20 20 20 61  ] = ' ';.      a
ace0: 73 73 65 72 74 28 20 73 74 72 6c 65 6e 28 7a 29  ssert( strlen(z)
acf0: 2b 6b 2b 31 3c 3d 6e 20 29 3b 0a 20 20 20 20 20  +k+1<=n );.     
ad00: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
ad10: 66 28 6e 2d 6b 2c 20 26 7a 53 74 6d 74 5b 6b 5d  f(n-k, &zStmt[k]
ad20: 2c 20 22 25 73 22 2c 20 7a 29 3b 0a 20 20 20 20  , "%s", z);.    
ad30: 20 20 6b 20 2b 3d 20 73 74 72 6c 65 6e 28 7a 29    k += strlen(z)
ad40: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71  ;.    }.  }.  sq
ad50: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e  lite3_snprintf(n
ad60: 2d 6b 2c 20 26 7a 53 74 6d 74 5b 6b 5d 2c 20 22  -k, &zStmt[k], "
ad70: 25 73 22 2c 20 7a 45 6e 64 29 3b 0a 20 20 72 65  %s", zEnd);.  re
ad80: 74 75 72 6e 20 7a 53 74 6d 74 3b 0a 7d 0a 0a 2f  turn zStmt;.}../
ad90: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
ada0: 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 72  e is called to r
adb0: 65 70 6f 72 74 20 74 68 65 20 66 69 6e 61 6c 20  eport the final 
adc0: 22 29 22 20 74 68 61 74 20 74 65 72 6d 69 6e 61  ")" that termina
add0: 74 65 73 0a 2a 2a 20 61 20 43 52 45 41 54 45 20  tes.** a CREATE 
ade0: 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e  TABLE statement.
adf0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 61 62 6c 65  .**.** The table
ae00: 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20   structure that 
ae10: 6f 74 68 65 72 20 61 63 74 69 6f 6e 20 72 6f 75  other action rou
ae20: 74 69 6e 65 73 20 68 61 76 65 20 62 65 65 6e 20  tines have been 
ae30: 62 75 69 6c 64 69 6e 67 0a 2a 2a 20 69 73 20 61  building.** is a
ae40: 64 64 65 64 20 74 6f 20 74 68 65 20 69 6e 74 65  dded to the inte
ae50: 72 6e 61 6c 20 68 61 73 68 20 74 61 62 6c 65 73  rnal hash tables
ae60: 2c 20 61 73 73 75 6d 69 6e 67 20 6e 6f 20 65 72  , assuming no er
ae70: 72 6f 72 73 20 68 61 76 65 0a 2a 2a 20 6f 63 63  rors have.** occ
ae80: 75 72 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20  urred..**.** An 
ae90: 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20 74 61  entry for the ta
aea0: 62 6c 65 20 69 73 20 6d 61 64 65 20 69 6e 20 74  ble is made in t
aeb0: 68 65 20 6d 61 73 74 65 72 20 74 61 62 6c 65 20  he master table 
aec0: 6f 6e 20 64 69 73 6b 2c 20 75 6e 6c 65 73 73 0a  on disk, unless.
aed0: 2a 2a 20 74 68 69 73 20 69 73 20 61 20 74 65 6d  ** this is a tem
aee0: 70 6f 72 61 72 79 20 74 61 62 6c 65 20 6f 72 20  porary table or 
aef0: 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d 31  db->init.busy==1
af00: 2e 20 20 57 68 65 6e 20 64 62 2d 3e 69 6e 69 74  .  When db->init
af10: 2e 62 75 73 79 3d 3d 31 0a 2a 2a 20 69 74 20 6d  .busy==1.** it m
af20: 65 61 6e 73 20 77 65 20 61 72 65 20 72 65 61 64  eans we are read
af30: 69 6e 67 20 74 68 65 20 73 71 6c 69 74 65 5f 6d  ing the sqlite_m
af40: 61 73 74 65 72 20 74 61 62 6c 65 20 62 65 63 61  aster table beca
af50: 75 73 65 20 77 65 20 6a 75 73 74 0a 2a 2a 20 63  use we just.** c
af60: 6f 6e 6e 65 63 74 65 64 20 74 6f 20 74 68 65 20  onnected to the 
af70: 64 61 74 61 62 61 73 65 20 6f 72 20 62 65 63 61  database or beca
af80: 75 73 65 20 74 68 65 20 73 71 6c 69 74 65 5f 6d  use the sqlite_m
af90: 61 73 74 65 72 20 74 61 62 6c 65 20 68 61 73 0a  aster table has.
afa0: 2a 2a 20 72 65 63 65 6e 74 6c 79 20 63 68 61 6e  ** recently chan
afb0: 67 65 64 2c 20 73 6f 20 74 68 65 20 65 6e 74 72  ged, so the entr
afc0: 79 20 66 6f 72 20 74 68 69 73 20 74 61 62 6c 65  y for this table
afd0: 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 20   already exists 
afe0: 69 6e 0a 2a 2a 20 74 68 65 20 73 71 6c 69 74 65  in.** the sqlite
aff0: 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 2e 20 20  _master table.  
b000: 57 65 20 64 6f 20 6e 6f 74 20 77 61 6e 74 20 74  We do not want t
b010: 6f 20 63 72 65 61 74 65 20 69 74 20 61 67 61 69  o create it agai
b020: 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  n..**.** If the 
b030: 70 53 65 6c 65 63 74 20 61 72 67 75 6d 65 6e 74  pSelect argument
b040: 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 69 74   is not NULL, it
b050: 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 69 73   means that this
b060: 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 77 61 73 20   routine.** was 
b070: 63 61 6c 6c 65 64 20 74 6f 20 63 72 65 61 74 65  called to create
b080: 20 61 20 74 61 62 6c 65 20 67 65 6e 65 72 61 74   a table generat
b090: 65 64 20 66 72 6f 6d 20 61 20 0a 2a 2a 20 22 43  ed from a .** "C
b0a0: 52 45 41 54 45 20 54 41 42 4c 45 20 2e 2e 2e 20  REATE TABLE ... 
b0b0: 41 53 20 53 45 4c 45 43 54 20 2e 2e 2e 22 20 73  AS SELECT ..." s
b0c0: 74 61 74 65 6d 65 6e 74 2e 20 20 54 68 65 20 63  tatement.  The c
b0d0: 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 6f 66 0a 2a  olumn names of.*
b0e0: 2a 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20  * the new table 
b0f0: 77 69 6c 6c 20 6d 61 74 63 68 20 74 68 65 20 72  will match the r
b100: 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68 65  esult set of the
b110: 20 53 45 4c 45 43 54 2e 0a 2a 2f 0a 76 6f 69 64   SELECT..*/.void
b120: 20 73 71 6c 69 74 65 33 45 6e 64 54 61 62 6c 65   sqlite3EndTable
b130: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
b140: 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  e,          /* P
b150: 61 72 73 65 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  arse context */.
b160: 20 20 54 6f 6b 65 6e 20 2a 70 43 6f 6e 73 2c 20    Token *pCons, 
b170: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
b180: 20 27 2c 27 20 74 6f 6b 65 6e 20 61 66 74 65 72   ',' token after
b190: 20 74 68 65 20 6c 61 73 74 20 63 6f 6c 75 6d 6e   the last column
b1a0: 20 64 65 66 6e 2e 20 2a 2f 0a 20 20 54 6f 6b 65   defn. */.  Toke
b1b0: 6e 20 2a 70 45 6e 64 2c 20 20 20 20 20 20 20 20  n *pEnd,        
b1c0: 20 20 20 20 2f 2a 20 54 68 65 20 66 69 6e 61 6c      /* The final
b1d0: 20 27 29 27 20 74 6f 6b 65 6e 20 69 6e 20 74 68   ')' token in th
b1e0: 65 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 2a  e CREATE TABLE *
b1f0: 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c  /.  Select *pSel
b200: 65 63 74 20 20 20 20 20 20 20 20 20 2f 2a 20 53  ect         /* S
b210: 65 6c 65 63 74 20 66 72 6f 6d 20 61 20 22 43 52  elect from a "CR
b220: 45 41 54 45 20 2e 2e 2e 20 41 53 20 53 45 4c 45  EATE ... AS SELE
b230: 43 54 22 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c  CT" */.){.  Tabl
b240: 65 20 2a 70 3b 0a 20 20 73 71 6c 69 74 65 33 20  e *p;.  sqlite3 
b250: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
b260: 3b 0a 20 20 69 6e 74 20 69 44 62 3b 0a 0a 20 20  ;.  int iDb;..  
b270: 69 66 28 20 28 70 45 6e 64 3d 3d 30 20 26 26 20  if( (pEnd==0 && 
b280: 70 53 65 6c 65 63 74 3d 3d 30 29 20 7c 7c 20 70  pSelect==0) || p
b290: 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 64  Parse->nErr || d
b2a0: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
b2b0: 29 20 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  ) {.    return;.
b2c0: 20 20 7d 0a 20 20 70 20 3d 20 70 50 61 72 73 65    }.  p = pParse
b2d0: 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 69  ->pNewTable;.  i
b2e0: 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( p==0 ) return
b2f0: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 21 64 62  ;..  assert( !db
b300: 2d 3e 69 6e 69 74 2e 62 75 73 79 20 7c 7c 20 21  ->init.busy || !
b310: 70 53 65 6c 65 63 74 20 29 3b 0a 0a 20 20 69 44  pSelect );..  iD
b320: 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d  b = sqlite3Schem
b330: 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 2d 3e  aToIndex(db, p->
b340: 70 53 63 68 65 6d 61 29 3b 0a 0a 23 69 66 6e 64  pSchema);..#ifnd
b350: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  ef SQLITE_OMIT_C
b360: 48 45 43 4b 0a 20 20 2f 2a 20 52 65 73 6f 6c 76  HECK.  /* Resolv
b370: 65 20 6e 61 6d 65 73 20 69 6e 20 61 6c 6c 20 43  e names in all C
b380: 48 45 43 4b 20 63 6f 6e 73 74 72 61 69 6e 74 20  HECK constraint 
b390: 65 78 70 72 65 73 73 69 6f 6e 73 2e 0a 20 20 2a  expressions..  *
b3a0: 2f 0a 20 20 69 66 28 20 70 2d 3e 70 43 68 65 63  /.  if( p->pChec
b3b0: 6b 20 29 7b 0a 20 20 20 20 53 72 63 4c 69 73 74  k ){.    SrcList
b3c0: 20 73 53 72 63 3b 20 20 20 20 20 20 20 20 20 20   sSrc;          
b3d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 61 6b 65           /* Fake
b3e0: 20 53 72 63 4c 69 73 74 20 66 6f 72 20 70 50 61   SrcList for pPa
b3f0: 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 2a  rse->pNewTable *
b400: 2f 0a 20 20 20 20 4e 61 6d 65 43 6f 6e 74 65 78  /.    NameContex
b410: 74 20 73 4e 43 3b 20 20 20 20 20 20 20 20 20 20  t sNC;          
b420: 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 63 6f        /* Name co
b430: 6e 74 65 78 74 20 66 6f 72 20 70 50 61 72 73 65  ntext for pParse
b440: 2d 3e 70 4e 65 77 54 61 62 6c 65 20 2a 2f 0a 0a  ->pNewTable */..
b450: 20 20 20 20 6d 65 6d 73 65 74 28 26 73 4e 43 2c      memset(&sNC,
b460: 20 30 2c 20 73 69 7a 65 6f 66 28 73 4e 43 29 29   0, sizeof(sNC))
b470: 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 73 53  ;.    memset(&sS
b480: 72 63 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 53  rc, 0, sizeof(sS
b490: 72 63 29 29 3b 0a 20 20 20 20 73 53 72 63 2e 6e  rc));.    sSrc.n
b4a0: 53 72 63 20 3d 20 31 3b 0a 20 20 20 20 73 53 72  Src = 1;.    sSr
b4b0: 63 2e 61 5b 30 5d 2e 7a 4e 61 6d 65 20 3d 20 70  c.a[0].zName = p
b4c0: 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 73 53 72  ->zName;.    sSr
b4d0: 63 2e 61 5b 30 5d 2e 70 54 61 62 20 3d 20 70 3b  c.a[0].pTab = p;
b4e0: 0a 20 20 20 20 73 53 72 63 2e 61 5b 30 5d 2e 69  .    sSrc.a[0].i
b4f0: 43 75 72 73 6f 72 20 3d 20 2d 31 3b 0a 20 20 20  Cursor = -1;.   
b500: 20 73 4e 43 2e 70 50 61 72 73 65 20 3d 20 70 50   sNC.pParse = pP
b510: 61 72 73 65 3b 0a 20 20 20 20 73 4e 43 2e 70 53  arse;.    sNC.pS
b520: 72 63 4c 69 73 74 20 3d 20 26 73 53 72 63 3b 0a  rcList = &sSrc;.
b530: 20 20 20 20 73 4e 43 2e 69 73 43 68 65 63 6b 20      sNC.isCheck 
b540: 3d 20 31 3b 0a 20 20 20 20 69 66 28 20 73 71 6c  = 1;.    if( sql
b550: 69 74 65 33 52 65 73 6f 6c 76 65 45 78 70 72 4e  ite3ResolveExprN
b560: 61 6d 65 73 28 26 73 4e 43 2c 20 70 2d 3e 70 43  ames(&sNC, p->pC
b570: 68 65 63 6b 29 20 29 7b 0a 20 20 20 20 20 20 72  heck) ){.      r
b580: 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d  eturn;.    }.  }
b590: 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69  .#endif /* !defi
b5a0: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
b5b0: 43 48 45 43 4b 29 20 2a 2f 0a 0a 20 20 2f 2a 20  CHECK) */..  /* 
b5c0: 49 66 20 74 68 65 20 64 62 2d 3e 69 6e 69 74 2e  If the db->init.
b5d0: 62 75 73 79 20 69 73 20 31 20 69 74 20 6d 65 61  busy is 1 it mea
b5e0: 6e 73 20 77 65 20 61 72 65 20 72 65 61 64 69 6e  ns we are readin
b5f0: 67 20 74 68 65 20 53 51 4c 20 6f 66 66 20 74 68  g the SQL off th
b600: 65 0a 20 20 2a 2a 20 22 73 71 6c 69 74 65 5f 6d  e.  ** "sqlite_m
b610: 61 73 74 65 72 22 20 6f 72 20 22 73 71 6c 69 74  aster" or "sqlit
b620: 65 5f 74 65 6d 70 5f 6d 61 73 74 65 72 22 20 74  e_temp_master" t
b630: 61 62 6c 65 20 6f 6e 20 74 68 65 20 64 69 73 6b  able on the disk
b640: 2e 0a 20 20 2a 2a 20 53 6f 20 64 6f 20 6e 6f 74  ..  ** So do not
b650: 20 77 72 69 74 65 20 74 6f 20 74 68 65 20 64 69   write to the di
b660: 73 6b 20 61 67 61 69 6e 2e 20 20 45 78 74 72 61  sk again.  Extra
b670: 63 74 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65  ct the root page
b680: 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 66 6f 72   number.  ** for
b690: 20 74 68 65 20 74 61 62 6c 65 20 66 72 6f 6d 20   the table from 
b6a0: 74 68 65 20 64 62 2d 3e 69 6e 69 74 2e 6e 65 77  the db->init.new
b6b0: 54 6e 75 6d 20 66 69 65 6c 64 2e 20 20 28 54 68  Tnum field.  (Th
b6c0: 65 20 70 61 67 65 20 6e 75 6d 62 65 72 0a 20 20  e page number.  
b6d0: 2a 2a 20 73 68 6f 75 6c 64 20 68 61 76 65 20 62  ** should have b
b6e0: 65 65 6e 20 70 75 74 20 74 68 65 72 65 20 62 79  een put there by
b6f0: 20 74 68 65 20 73 71 6c 69 74 65 4f 70 65 6e 43   the sqliteOpenC
b700: 62 20 72 6f 75 74 69 6e 65 2e 29 0a 20 20 2a 2f  b routine.).  */
b710: 0a 20 20 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e  .  if( db->init.
b720: 62 75 73 79 20 29 7b 0a 20 20 20 20 70 2d 3e 74  busy ){.    p->t
b730: 6e 75 6d 20 3d 20 64 62 2d 3e 69 6e 69 74 2e 6e  num = db->init.n
b740: 65 77 54 6e 75 6d 3b 0a 20 20 7d 0a 0a 20 20 2f  ewTnum;.  }..  /
b750: 2a 20 49 66 20 6e 6f 74 20 69 6e 69 74 69 61 6c  * If not initial
b760: 69 7a 69 6e 67 2c 20 74 68 65 6e 20 63 72 65 61  izing, then crea
b770: 74 65 20 61 20 72 65 63 6f 72 64 20 66 6f 72 20  te a record for 
b780: 74 68 65 20 6e 65 77 20 74 61 62 6c 65 0a 20 20  the new table.  
b790: 2a 2a 20 69 6e 20 74 68 65 20 53 51 4c 49 54 45  ** in the SQLITE
b7a0: 5f 4d 41 53 54 45 52 20 74 61 62 6c 65 20 6f 66  _MASTER table of
b7b0: 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20   the database.  
b7c0: 54 68 65 20 72 65 63 6f 72 64 20 6e 75 6d 62 65  The record numbe
b7d0: 72 0a 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 6e  r.  ** for the n
b7e0: 65 77 20 74 61 62 6c 65 20 65 6e 74 72 79 20 73  ew table entry s
b7f0: 68 6f 75 6c 64 20 61 6c 72 65 61 64 79 20 62 65  hould already be
b800: 20 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e 0a 20   on the stack.. 
b810: 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68 69 73   **.  ** If this
b820: 20 69 73 20 61 20 54 45 4d 50 4f 52 41 52 59 20   is a TEMPORARY 
b830: 74 61 62 6c 65 2c 20 77 72 69 74 65 20 74 68 65  table, write the
b840: 20 65 6e 74 72 79 20 69 6e 74 6f 20 74 68 65 20   entry into the 
b850: 61 75 78 69 6c 69 61 72 79 0a 20 20 2a 2a 20 66  auxiliary.  ** f
b860: 69 6c 65 20 69 6e 73 74 65 61 64 20 6f 66 20 69  ile instead of i
b870: 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20 64 61 74  nto the main dat
b880: 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 2a 2f  abase file..  */
b890: 0a 20 20 69 66 28 20 21 64 62 2d 3e 69 6e 69 74  .  if( !db->init
b8a0: 2e 62 75 73 79 20 29 7b 0a 20 20 20 20 69 6e 74  .busy ){.    int
b8b0: 20 6e 3b 0a 20 20 20 20 56 64 62 65 20 2a 76 3b   n;.    Vdbe *v;
b8c0: 0a 20 20 20 20 63 68 61 72 20 2a 7a 54 79 70 65  .    char *zType
b8d0: 3b 20 20 20 20 2f 2a 20 22 76 69 65 77 22 20 6f  ;    /* "view" o
b8e0: 72 20 22 74 61 62 6c 65 22 20 2a 2f 0a 20 20 20  r "table" */.   
b8f0: 20 63 68 61 72 20 2a 7a 54 79 70 65 32 3b 20 20   char *zType2;  
b900: 20 2f 2a 20 22 56 49 45 57 22 20 6f 72 20 22 54   /* "VIEW" or "T
b910: 41 42 4c 45 22 20 2a 2f 0a 20 20 20 20 63 68 61  ABLE" */.    cha
b920: 72 20 2a 7a 53 74 6d 74 3b 20 20 20 20 2f 2a 20  r *zStmt;    /* 
b930: 54 65 78 74 20 6f 66 20 74 68 65 20 43 52 45 41  Text of the CREA
b940: 54 45 20 54 41 42 4c 45 20 6f 72 20 43 52 45 41  TE TABLE or CREA
b950: 54 45 20 56 49 45 57 20 73 74 61 74 65 6d 65 6e  TE VIEW statemen
b960: 74 20 2a 2f 0a 0a 20 20 20 20 76 20 3d 20 73 71  t */..    v = sq
b970: 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
b980: 72 73 65 29 3b 0a 20 20 20 20 69 66 28 20 76 3d  rse);.    if( v=
b990: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20  =0 ) return;..  
b9a0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
b9b0: 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c  Op1(v, OP_Close,
b9c0: 20 30 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 72 65   0);..    /* Cre
b9d0: 61 74 65 20 74 68 65 20 72 6f 6f 74 70 61 67 65  ate the rootpage
b9e0: 20 66 6f 72 20 74 68 65 20 6e 65 77 20 74 61 62   for the new tab
b9f0: 6c 65 20 61 6e 64 20 70 75 73 68 20 69 74 20 6f  le and push it o
ba00: 6e 74 6f 20 74 68 65 20 73 74 61 63 6b 2e 0a 20  nto the stack.. 
ba10: 20 20 20 2a 2a 20 41 20 76 69 65 77 20 68 61 73     ** A view has
ba20: 20 6e 6f 20 72 6f 6f 74 70 61 67 65 2c 20 73 6f   no rootpage, so
ba30: 20 6a 75 73 74 20 70 75 73 68 20 61 20 7a 65 72   just push a zer
ba40: 6f 20 6f 6e 74 6f 20 74 68 65 20 73 74 61 63 6b  o onto the stack
ba50: 20 66 6f 72 0a 20 20 20 20 2a 2a 20 76 69 65 77   for.    ** view
ba60: 73 2e 20 20 49 6e 69 74 69 61 6c 69 7a 65 20 7a  s.  Initialize z
ba70: 54 79 70 65 20 61 74 20 74 68 65 20 73 61 6d 65  Type at the same
ba80: 20 74 69 6d 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   time..    */.  
ba90: 20 20 69 66 28 20 70 2d 3e 70 53 65 6c 65 63 74    if( p->pSelect
baa0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ==0 ){.      /* 
bab0: 41 20 72 65 67 75 6c 61 72 20 74 61 62 6c 65 20  A regular table 
bac0: 2a 2f 0a 20 20 20 20 20 20 7a 54 79 70 65 20 3d  */.      zType =
bad0: 20 22 74 61 62 6c 65 22 3b 0a 20 20 20 20 20 20   "table";.      
bae0: 7a 54 79 70 65 32 20 3d 20 22 54 41 42 4c 45 22  zType2 = "TABLE"
baf0: 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
bb00: 5f 4f 4d 49 54 5f 56 49 45 57 0a 20 20 20 20 7d  _OMIT_VIEW.    }
bb10: 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 41  else{.      /* A
bb20: 20 76 69 65 77 20 2a 2f 0a 20 20 20 20 20 20 7a   view */.      z
bb30: 54 79 70 65 20 3d 20 22 76 69 65 77 22 3b 0a 20  Type = "view";. 
bb40: 20 20 20 20 20 7a 54 79 70 65 32 20 3d 20 22 56       zType2 = "V
bb50: 49 45 57 22 3b 0a 23 65 6e 64 69 66 0a 20 20 20  IEW";.#endif.   
bb60: 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   }..    /* If th
bb70: 69 73 20 69 73 20 61 20 43 52 45 41 54 45 20 54  is is a CREATE T
bb80: 41 42 4c 45 20 78 78 20 41 53 20 53 45 4c 45 43  ABLE xx AS SELEC
bb90: 54 20 2e 2e 2e 2c 20 65 78 65 63 75 74 65 20 74  T ..., execute t
bba0: 68 65 20 53 45 4c 45 43 54 0a 20 20 20 20 2a 2a  he SELECT.    **
bbb0: 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 70 6f   statement to po
bbc0: 70 75 6c 61 74 65 20 74 68 65 20 6e 65 77 20 74  pulate the new t
bbd0: 61 62 6c 65 2e 20 54 68 65 20 72 6f 6f 74 2d 70  able. The root-p
bbe0: 61 67 65 20 6e 75 6d 62 65 72 20 66 6f 72 20 74  age number for t
bbf0: 68 65 0a 20 20 20 20 2a 2a 20 6e 65 77 20 74 61  he.    ** new ta
bc00: 62 6c 65 20 69 73 20 6f 6e 20 74 68 65 20 74 6f  ble is on the to
bc10: 70 20 6f 66 20 74 68 65 20 76 64 62 65 20 73 74  p of the vdbe st
bc20: 61 63 6b 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ack..    **.    
bc30: 2a 2a 20 4f 6e 63 65 20 74 68 65 20 53 45 4c 45  ** Once the SELE
bc40: 43 54 20 68 61 73 20 62 65 65 6e 20 63 6f 64 65  CT has been code
bc50: 64 20 62 79 20 73 71 6c 69 74 65 33 53 65 6c 65  d by sqlite3Sele
bc60: 63 74 28 29 2c 20 69 74 20 69 73 20 69 6e 20 61  ct(), it is in a
bc70: 0a 20 20 20 20 2a 2a 20 73 75 69 74 61 62 6c 65  .    ** suitable
bc80: 20 73 74 61 74 65 20 74 6f 20 71 75 65 72 79 20   state to query 
bc90: 66 6f 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e  for the column n
bca0: 61 6d 65 73 20 61 6e 64 20 74 79 70 65 73 20 74  ames and types t
bcb0: 6f 20 62 65 20 75 73 65 64 0a 20 20 20 20 2a 2a  o be used.    **
bcc0: 20 62 79 20 74 68 65 20 6e 65 77 20 74 61 62 6c   by the new tabl
bcd0: 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  e..    **.    **
bce0: 20 41 20 73 68 61 72 65 64 2d 63 61 63 68 65 20   A shared-cache 
bcf0: 77 72 69 74 65 2d 6c 6f 63 6b 20 69 73 20 6e 6f  write-lock is no
bd00: 74 20 72 65 71 75 69 72 65 64 20 74 6f 20 77 72  t required to wr
bd10: 69 74 65 20 74 6f 20 74 68 65 20 6e 65 77 20 74  ite to the new t
bd20: 61 62 6c 65 2c 0a 20 20 20 20 2a 2a 20 61 73 20  able,.    ** as 
bd30: 61 20 73 63 68 65 6d 61 2d 6c 6f 63 6b 20 6d 75  a schema-lock mu
bd40: 73 74 20 68 61 76 65 20 61 6c 72 65 61 64 79 20  st have already 
bd50: 62 65 65 6e 20 6f 62 74 61 69 6e 65 64 20 74 6f  been obtained to
bd60: 20 63 72 65 61 74 65 20 69 74 2e 20 53 69 6e 63   create it. Sinc
bd70: 65 0a 20 20 20 20 2a 2a 20 61 20 73 63 68 65 6d  e.    ** a schem
bd80: 61 2d 6c 6f 63 6b 20 65 78 63 6c 75 64 65 73 20  a-lock excludes 
bd90: 61 6c 6c 20 6f 74 68 65 72 20 64 61 74 61 62 61  all other databa
bda0: 73 65 20 75 73 65 72 73 2c 20 74 68 65 20 77 72  se users, the wr
bdb0: 69 74 65 2d 6c 6f 63 6b 20 77 6f 75 6c 64 0a 20  ite-lock would. 
bdc0: 20 20 20 2a 2a 20 62 65 20 72 65 64 75 6e 64 61     ** be redunda
bdd0: 6e 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  nt..    */.    i
bde0: 66 28 20 70 53 65 6c 65 63 74 20 29 7b 0a 20 20  f( pSelect ){.  
bdf0: 20 20 20 20 53 65 6c 65 63 74 44 65 73 74 20 64      SelectDest d
be00: 65 73 74 3b 0a 20 20 20 20 20 20 54 61 62 6c 65  est;.      Table
be10: 20 2a 70 53 65 6c 54 61 62 3b 0a 0a 20 20 20 20   *pSelTab;..    
be20: 20 20 61 73 73 65 72 74 28 70 50 61 72 73 65 2d    assert(pParse-
be30: 3e 6e 54 61 62 3d 3d 30 29 3b 0a 20 20 20 20 20  >nTab==0);.     
be40: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
be50: 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 57 72 69  p3(v, OP_OpenWri
be60: 74 65 2c 20 31 2c 20 70 50 61 72 73 65 2d 3e 72  te, 1, pParse->r
be70: 65 67 52 6f 6f 74 2c 20 69 44 62 29 3b 0a 20 20  egRoot, iDb);.  
be80: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
be90: 68 61 6e 67 65 50 35 28 76 2c 20 31 29 3b 0a 20  hangeP5(v, 1);. 
bea0: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 54 61       pParse->nTa
beb0: 62 20 3d 20 32 3b 0a 20 20 20 20 20 20 73 71 6c  b = 2;.      sql
bec0: 69 74 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e  ite3SelectDestIn
bed0: 69 74 28 26 64 65 73 74 2c 20 53 52 54 5f 54 61  it(&dest, SRT_Ta
bee0: 62 6c 65 2c 20 31 29 3b 0a 20 20 20 20 20 20 73  ble, 1);.      s
bef0: 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61  qlite3Select(pPa
bf00: 72 73 65 2c 20 70 53 65 6c 65 63 74 2c 20 26 64  rse, pSelect, &d
bf10: 65 73 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  est);.      sqli
bf20: 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
bf30: 20 4f 50 5f 43 6c 6f 73 65 2c 20 31 29 3b 0a 20   OP_Close, 1);. 
bf40: 20 20 20 20 20 69 66 28 20 70 50 61 72 73 65 2d       if( pParse-
bf50: 3e 6e 45 72 72 3d 3d 30 20 29 7b 0a 20 20 20 20  >nErr==0 ){.    
bf60: 20 20 20 20 70 53 65 6c 54 61 62 20 3d 20 73 71      pSelTab = sq
bf70: 6c 69 74 65 33 52 65 73 75 6c 74 53 65 74 4f 66  lite3ResultSetOf
bf80: 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  Select(pParse, p
bf90: 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 20  Select);.       
bfa0: 20 69 66 28 20 70 53 65 6c 54 61 62 3d 3d 30 20   if( pSelTab==0 
bfb0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20  ) return;.      
bfc0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 43 6f    assert( p->aCo
bfd0: 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  l==0 );.        
bfe0: 70 2d 3e 6e 43 6f 6c 20 3d 20 70 53 65 6c 54 61  p->nCol = pSelTa
bff0: 62 2d 3e 6e 43 6f 6c 3b 0a 20 20 20 20 20 20 20  b->nCol;.       
c000: 20 70 2d 3e 61 43 6f 6c 20 3d 20 70 53 65 6c 54   p->aCol = pSelT
c010: 61 62 2d 3e 61 43 6f 6c 3b 0a 20 20 20 20 20 20  ab->aCol;.      
c020: 20 20 70 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c 20    pSelTab->nCol 
c030: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70 53 65  = 0;.        pSe
c040: 6c 54 61 62 2d 3e 61 43 6f 6c 20 3d 20 30 3b 0a  lTab->aCol = 0;.
c050: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
c060: 65 6c 65 74 65 54 61 62 6c 65 28 70 53 65 6c 54  eleteTable(pSelT
c070: 61 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ab);.      }.   
c080: 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d 70 75   }..    /* Compu
c090: 74 65 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20  te the complete 
c0a0: 74 65 78 74 20 6f 66 20 74 68 65 20 43 52 45 41  text of the CREA
c0b0: 54 45 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a  TE statement */.
c0c0: 20 20 20 20 69 66 28 20 70 53 65 6c 65 63 74 20      if( pSelect 
c0d0: 29 7b 0a 20 20 20 20 20 20 7a 53 74 6d 74 20 3d  ){.      zStmt =
c0e0: 20 63 72 65 61 74 65 54 61 62 6c 65 53 74 6d 74   createTableStmt
c0f0: 28 64 62 2c 20 70 2c 20 70 2d 3e 70 53 63 68 65  (db, p, p->pSche
c100: 6d 61 3d 3d 64 62 2d 3e 61 44 62 5b 31 5d 2e 70  ma==db->aDb[1].p
c110: 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 7d 65 6c  Schema);.    }el
c120: 73 65 7b 0a 20 20 20 20 20 20 6e 20 3d 20 70 45  se{.      n = pE
c130: 6e 64 2d 3e 7a 20 2d 20 70 50 61 72 73 65 2d 3e  nd->z - pParse->
c140: 73 4e 61 6d 65 54 6f 6b 65 6e 2e 7a 20 2b 20 31  sNameToken.z + 1
c150: 3b 0a 20 20 20 20 20 20 7a 53 74 6d 74 20 3d 20  ;.      zStmt = 
c160: 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64  sqlite3MPrintf(d
c170: 62 2c 20 0a 20 20 20 20 20 20 20 20 20 20 22 43  b, .          "C
c180: 52 45 41 54 45 20 25 73 20 25 2e 2a 73 22 2c 20  REATE %s %.*s", 
c190: 7a 54 79 70 65 32 2c 20 6e 2c 20 70 50 61 72 73  zType2, n, pPars
c1a0: 65 2d 3e 73 4e 61 6d 65 54 6f 6b 65 6e 2e 7a 0a  e->sNameToken.z.
c1b0: 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 0a        );.    }..
c1c0: 20 20 20 20 2f 2a 20 41 20 73 6c 6f 74 20 66 6f      /* A slot fo
c1d0: 72 20 74 68 65 20 72 65 63 6f 72 64 20 68 61 73  r the record has
c1e0: 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 61 6c   already been al
c1f0: 6c 6f 63 61 74 65 64 20 69 6e 20 74 68 65 20 0a  located in the .
c200: 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 4d 41      ** SQLITE_MA
c210: 53 54 45 52 20 74 61 62 6c 65 2e 20 20 57 65 20  STER table.  We 
c220: 6a 75 73 74 20 6e 65 65 64 20 74 6f 20 75 70 64  just need to upd
c230: 61 74 65 20 74 68 61 74 20 73 6c 6f 74 20 77 69  ate that slot wi
c240: 74 68 20 61 6c 6c 0a 20 20 20 20 2a 2a 20 74 68  th all.    ** th
c250: 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 77 65  e information we
c260: 27 76 65 20 63 6f 6c 6c 65 63 74 65 64 2e 20 20  've collected.  
c270: 54 68 65 20 72 6f 77 69 64 20 66 6f 72 20 74 68  The rowid for th
c280: 65 20 70 72 65 61 6c 6c 6f 63 61 74 65 64 0a 20  e preallocated. 
c290: 20 20 20 2a 2a 20 73 6c 6f 74 20 69 73 20 74 68     ** slot is th
c2a0: 65 20 32 6e 64 20 69 74 65 6d 20 6f 6e 20 74 68  e 2nd item on th
c2b0: 65 20 73 74 61 63 6b 2e 20 20 54 68 65 20 74 6f  e stack.  The to
c2c0: 70 20 6f 66 20 74 68 65 20 73 74 61 63 6b 20 69  p of the stack i
c2d0: 73 20 74 68 65 0a 20 20 20 20 2a 2a 20 72 6f 6f  s the.    ** roo
c2e0: 74 20 70 61 67 65 20 66 6f 72 20 74 68 65 20 6e  t page for the n
c2f0: 65 77 20 74 61 62 6c 65 20 28 6f 72 20 61 20 30  ew table (or a 0
c300: 20 69 66 20 74 68 69 73 20 69 73 20 61 20 76 69   if this is a vi
c310: 65 77 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ew)..    */.    
c320: 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72  sqlite3NestedPar
c330: 73 65 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20  se(pParse,.     
c340: 20 22 55 50 44 41 54 45 20 25 51 2e 25 73 20 22   "UPDATE %Q.%s "
c350: 0a 20 20 20 20 20 20 20 20 20 22 53 45 54 20 74  .         "SET t
c360: 79 70 65 3d 27 25 73 27 2c 20 6e 61 6d 65 3d 25  ype='%s', name=%
c370: 51 2c 20 74 62 6c 5f 6e 61 6d 65 3d 25 51 2c 20  Q, tbl_name=%Q, 
c380: 72 6f 6f 74 70 61 67 65 3d 23 25 64 2c 20 73 71  rootpage=#%d, sq
c390: 6c 3d 25 51 20 22 0a 20 20 20 20 20 20 20 22 57  l=%Q ".       "W
c3a0: 48 45 52 45 20 72 6f 77 69 64 3d 23 25 64 22 2c  HERE rowid=#%d",
c3b0: 0a 20 20 20 20 20 20 64 62 2d 3e 61 44 62 5b 69  .      db->aDb[i
c3c0: 44 62 5d 2e 7a 4e 61 6d 65 2c 20 53 43 48 45 4d  Db].zName, SCHEM
c3d0: 41 5f 54 41 42 4c 45 28 69 44 62 29 2c 0a 20 20  A_TABLE(iDb),.  
c3e0: 20 20 20 20 7a 54 79 70 65 2c 0a 20 20 20 20 20      zType,.     
c3f0: 20 70 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20   p->zName,.     
c400: 20 70 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20   p->zName,.     
c410: 20 70 50 61 72 73 65 2d 3e 72 65 67 52 6f 6f 74   pParse->regRoot
c420: 2c 0a 20 20 20 20 20 20 7a 53 74 6d 74 2c 0a 20  ,.      zStmt,. 
c430: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 72 65 67       pParse->reg
c440: 52 6f 77 69 64 0a 20 20 20 20 29 3b 0a 20 20 20  Rowid.    );.   
c450: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
c460: 62 2c 20 7a 53 74 6d 74 29 3b 0a 20 20 20 20 73  b, zStmt);.    s
c470: 71 6c 69 74 65 33 43 68 61 6e 67 65 43 6f 6f 6b  qlite3ChangeCook
c480: 69 65 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b  ie(pParse, iDb);
c490: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
c4a0: 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 43 52 45 4d  _OMIT_AUTOINCREM
c4b0: 45 4e 54 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b  ENT.    /* Check
c4c0: 20 74 6f 20 73 65 65 20 69 66 20 77 65 20 6e 65   to see if we ne
c4d0: 65 64 20 74 6f 20 63 72 65 61 74 65 20 61 6e 20  ed to create an 
c4e0: 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 20  sqlite_sequence 
c4f0: 74 61 62 6c 65 20 66 6f 72 0a 20 20 20 20 2a 2a  table for.    **
c500: 20 6b 65 65 70 69 6e 67 20 74 72 61 63 6b 20 6f   keeping track o
c510: 66 20 61 75 74 6f 69 6e 63 72 65 6d 65 6e 74 20  f autoincrement 
c520: 6b 65 79 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  keys..    */.   
c530: 20 69 66 28 20 70 2d 3e 74 61 62 46 6c 61 67 73   if( p->tabFlags
c540: 20 26 20 54 46 5f 41 75 74 6f 69 6e 63 72 65 6d   & TF_Autoincrem
c550: 65 6e 74 20 29 7b 0a 20 20 20 20 20 20 44 62 20  ent ){.      Db 
c560: 2a 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b  *pDb = &db->aDb[
c570: 69 44 62 5d 3b 0a 20 20 20 20 20 20 69 66 28 20  iDb];.      if( 
c580: 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 70 53  pDb->pSchema->pS
c590: 65 71 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20  eqTab==0 ){.    
c5a0: 20 20 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65      sqlite3Neste
c5b0: 64 50 61 72 73 65 28 70 50 61 72 73 65 2c 0a 20  dParse(pParse,. 
c5c0: 20 20 20 20 20 20 20 20 20 22 43 52 45 41 54 45           "CREATE
c5d0: 20 54 41 42 4c 45 20 25 51 2e 73 71 6c 69 74 65   TABLE %Q.sqlite
c5e0: 5f 73 65 71 75 65 6e 63 65 28 6e 61 6d 65 2c 73  _sequence(name,s
c5f0: 65 71 29 22 2c 0a 20 20 20 20 20 20 20 20 20 20  eq)",.          
c600: 70 44 62 2d 3e 7a 4e 61 6d 65 0a 20 20 20 20 20  pDb->zName.     
c610: 20 20 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20     );.      }.  
c620: 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20    }.#endif..    
c630: 2f 2a 20 52 65 70 61 72 73 65 20 65 76 65 72 79  /* Reparse every
c640: 74 68 69 6e 67 20 74 6f 20 75 70 64 61 74 65 20  thing to update 
c650: 6f 75 72 20 69 6e 74 65 72 6e 61 6c 20 64 61 74  our internal dat
c660: 61 20 73 74 72 75 63 74 75 72 65 73 20 2a 2f 0a  a structures */.
c670: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
c680: 64 64 4f 70 34 28 76 2c 20 4f 50 5f 50 61 72 73  ddOp4(v, OP_Pars
c690: 65 53 63 68 65 6d 61 2c 20 69 44 62 2c 20 30 2c  eSchema, iDb, 0,
c6a0: 20 30 2c 0a 20 20 20 20 20 20 20 20 73 71 6c 69   0,.        sqli
c6b0: 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22  te3MPrintf(db, "
c6c0: 74 62 6c 5f 6e 61 6d 65 3d 27 25 71 27 22 2c 70  tbl_name='%q'",p
c6d0: 2d 3e 7a 4e 61 6d 65 29 2c 20 50 34 5f 44 59 4e  ->zName), P4_DYN
c6e0: 41 4d 49 43 29 3b 0a 20 20 7d 0a 0a 0a 20 20 2f  AMIC);.  }...  /
c6f0: 2a 20 41 64 64 20 74 68 65 20 74 61 62 6c 65 20  * Add the table 
c700: 74 6f 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79  to the in-memory
c710: 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20   representation 
c720: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  of the database.
c730: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e  .  */.  if( db->
c740: 69 6e 69 74 2e 62 75 73 79 20 26 26 20 70 50 61  init.busy && pPa
c750: 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 29 7b 0a  rse->nErr==0 ){.
c760: 20 20 20 20 54 61 62 6c 65 20 2a 70 4f 6c 64 3b      Table *pOld;
c770: 0a 20 20 20 20 46 4b 65 79 20 2a 70 46 4b 65 79  .    FKey *pFKey
c780: 3b 20 0a 20 20 20 20 53 63 68 65 6d 61 20 2a 70  ; .    Schema *p
c790: 53 63 68 65 6d 61 20 3d 20 70 2d 3e 70 53 63 68  Schema = p->pSch
c7a0: 65 6d 61 3b 0a 20 20 20 20 70 4f 6c 64 20 3d 20  ema;.    pOld = 
c7b0: 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72  sqlite3HashInser
c7c0: 74 28 26 70 53 63 68 65 6d 61 2d 3e 74 62 6c 48  t(&pSchema->tblH
c7d0: 61 73 68 2c 20 70 2d 3e 7a 4e 61 6d 65 2c 20 73  ash, p->zName, s
c7e0: 74 72 6c 65 6e 28 70 2d 3e 7a 4e 61 6d 65 29 2b  trlen(p->zName)+
c7f0: 31 2c 70 29 3b 0a 20 20 20 20 69 66 28 20 70 4f  1,p);.    if( pO
c800: 6c 64 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  ld ){.      asse
c810: 72 74 28 20 70 3d 3d 70 4f 6c 64 20 29 3b 20 20  rt( p==pOld );  
c820: 2f 2a 20 4d 61 6c 6c 6f 63 20 6d 75 73 74 20 68  /* Malloc must h
c830: 61 76 65 20 66 61 69 6c 65 64 20 69 6e 73 69 64  ave failed insid
c840: 65 20 48 61 73 68 49 6e 73 65 72 74 28 29 20 2a  e HashInsert() *
c850: 2f 0a 20 20 20 20 20 20 64 62 2d 3e 6d 61 6c 6c  /.      db->mall
c860: 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20  ocFailed = 1;.  
c870: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
c880: 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
c890: 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45  _OMIT_FOREIGN_KE
c8a0: 59 0a 20 20 20 20 66 6f 72 28 70 46 4b 65 79 3d  Y.    for(pFKey=
c8b0: 70 2d 3e 70 46 4b 65 79 3b 20 70 46 4b 65 79 3b  p->pFKey; pFKey;
c8c0: 20 70 46 4b 65 79 3d 70 46 4b 65 79 2d 3e 70 4e   pFKey=pFKey->pN
c8d0: 65 78 74 46 72 6f 6d 29 7b 0a 20 20 20 20 20 20  extFrom){.      
c8e0: 76 6f 69 64 20 2a 64 61 74 61 3b 0a 20 20 20 20  void *data;.    
c8f0: 20 20 69 6e 74 20 6e 54 6f 20 3d 20 73 74 72 6c    int nTo = strl
c900: 65 6e 28 70 46 4b 65 79 2d 3e 7a 54 6f 29 20 2b  en(pFKey->zTo) +
c910: 20 31 3b 0a 20 20 20 20 20 20 70 46 4b 65 79 2d   1;.      pFKey-
c920: 3e 70 4e 65 78 74 54 6f 20 3d 20 73 71 6c 69 74  >pNextTo = sqlit
c930: 65 33 48 61 73 68 46 69 6e 64 28 26 70 53 63 68  e3HashFind(&pSch
c940: 65 6d 61 2d 3e 61 46 4b 65 79 2c 20 70 46 4b 65  ema->aFKey, pFKe
c950: 79 2d 3e 7a 54 6f 2c 20 6e 54 6f 29 3b 0a 20 20  y->zTo, nTo);.  
c960: 20 20 20 20 64 61 74 61 20 3d 20 73 71 6c 69 74      data = sqlit
c970: 65 33 48 61 73 68 49 6e 73 65 72 74 28 26 70 53  e3HashInsert(&pS
c980: 63 68 65 6d 61 2d 3e 61 46 4b 65 79 2c 20 70 46  chema->aFKey, pF
c990: 4b 65 79 2d 3e 7a 54 6f 2c 20 6e 54 6f 2c 20 70  Key->zTo, nTo, p
c9a0: 46 4b 65 79 29 3b 0a 20 20 20 20 20 20 69 66 28  FKey);.      if(
c9b0: 20 64 61 74 61 3d 3d 28 76 6f 69 64 20 2a 29 70   data==(void *)p
c9c0: 46 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 20 20  FKey ){.        
c9d0: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
c9e0: 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 1;.      }.  
c9f0: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 70    }.#endif.    p
ca00: 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
ca10: 20 3d 20 30 3b 0a 20 20 20 20 64 62 2d 3e 6e 54   = 0;.    db->nT
ca20: 61 62 6c 65 2b 2b 3b 0a 20 20 20 20 64 62 2d 3e  able++;.    db->
ca30: 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f  flags |= SQLITE_
ca40: 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a 0a  InternChanges;..
ca50: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
ca60: 4d 49 54 5f 41 4c 54 45 52 54 41 42 4c 45 0a 20  MIT_ALTERTABLE. 
ca70: 20 20 20 69 66 28 20 21 70 2d 3e 70 53 65 6c 65     if( !p->pSele
ca80: 63 74 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73  ct ){.      cons
ca90: 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20  t char *zName = 
caa0: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 70 50  (const char *)pP
cab0: 61 72 73 65 2d 3e 73 4e 61 6d 65 54 6f 6b 65 6e  arse->sNameToken
cac0: 2e 7a 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4e  .z;.      int nN
cad0: 61 6d 65 3b 0a 20 20 20 20 20 20 61 73 73 65 72  ame;.      asser
cae0: 74 28 20 21 70 53 65 6c 65 63 74 20 26 26 20 70  t( !pSelect && p
caf0: 43 6f 6e 73 20 26 26 20 70 45 6e 64 20 29 3b 0a  Cons && pEnd );.
cb00: 20 20 20 20 20 20 69 66 28 20 70 43 6f 6e 73 2d        if( pCons-
cb10: 3e 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  >z==0 ){.       
cb20: 20 70 43 6f 6e 73 20 3d 20 70 45 6e 64 3b 0a 20   pCons = pEnd;. 
cb30: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6e 4e 61       }.      nNa
cb40: 6d 65 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72  me = (const char
cb50: 20 2a 29 70 43 6f 6e 73 2d 3e 7a 20 2d 20 7a 4e   *)pCons->z - zN
cb60: 61 6d 65 3b 0a 20 20 20 20 20 20 70 2d 3e 61 64  ame;.      p->ad
cb70: 64 43 6f 6c 4f 66 66 73 65 74 20 3d 20 31 33 20  dColOffset = 13 
cb80: 2b 20 73 71 6c 69 74 65 33 55 74 66 38 43 68 61  + sqlite3Utf8Cha
cb90: 72 4c 65 6e 28 7a 4e 61 6d 65 2c 20 6e 4e 61 6d  rLen(zName, nNam
cba0: 65 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  e);.    }.#endif
cbb0: 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20  .  }.}..#ifndef 
cbc0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57  SQLITE_OMIT_VIEW
cbd0: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 61 72 73 65  ./*.** The parse
cbe0: 72 20 63 61 6c 6c 73 20 74 68 69 73 20 72 6f 75  r calls this rou
cbf0: 74 69 6e 65 20 69 6e 20 6f 72 64 65 72 20 74 6f  tine in order to
cc00: 20 63 72 65 61 74 65 20 61 20 6e 65 77 20 56 49   create a new VI
cc10: 45 57 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  EW.*/.void sqlit
cc20: 65 33 43 72 65 61 74 65 56 69 65 77 28 0a 20 20  e3CreateView(.  
cc30: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
cc40: 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e     /* The parsin
cc50: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54  g context */.  T
cc60: 6f 6b 65 6e 20 2a 70 42 65 67 69 6e 2c 20 20 20  oken *pBegin,   
cc70: 20 20 2f 2a 20 54 68 65 20 43 52 45 41 54 45 20    /* The CREATE 
cc80: 74 6f 6b 65 6e 20 74 68 61 74 20 62 65 67 69 6e  token that begin
cc90: 73 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  s the statement 
cca0: 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d  */.  Token *pNam
ccb0: 65 31 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 74  e1,     /* The t
ccc0: 6f 6b 65 6e 20 74 68 61 74 20 68 6f 6c 64 73 20  oken that holds 
ccd0: 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
cce0: 76 69 65 77 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  view */.  Token 
ccf0: 2a 70 4e 61 6d 65 32 2c 20 20 20 20 20 2f 2a 20  *pName2,     /* 
cd00: 54 68 65 20 74 6f 6b 65 6e 20 74 68 61 74 20 68  The token that h
cd10: 6f 6c 64 73 20 74 68 65 20 6e 61 6d 65 20 6f 66  olds the name of
cd20: 20 74 68 65 20 76 69 65 77 20 2a 2f 0a 20 20 53   the view */.  S
cd30: 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 2c 20  elect *pSelect, 
cd40: 20 20 2f 2a 20 41 20 53 45 4c 45 43 54 20 73 74    /* A SELECT st
cd50: 61 74 65 6d 65 6e 74 20 74 68 61 74 20 77 69 6c  atement that wil
cd60: 6c 20 62 65 63 6f 6d 65 20 74 68 65 20 6e 65 77  l become the new
cd70: 20 76 69 65 77 20 2a 2f 0a 20 20 69 6e 74 20 69   view */.  int i
cd80: 73 54 65 6d 70 2c 20 20 20 20 20 20 20 20 2f 2a  sTemp,        /*
cd90: 20 54 52 55 45 20 66 6f 72 20 61 20 54 45 4d 50   TRUE for a TEMP
cda0: 4f 52 41 52 59 20 76 69 65 77 20 2a 2f 0a 20 20  ORARY view */.  
cdb0: 69 6e 74 20 6e 6f 45 72 72 20 20 20 20 20 20 20  int noErr       
cdc0: 20 20 20 2f 2a 20 53 75 70 70 72 65 73 73 20 65     /* Suppress e
cdd0: 72 72 6f 72 20 6d 65 73 73 61 67 65 73 20 69 66  rror messages if
cde0: 20 56 49 45 57 20 61 6c 72 65 61 64 79 20 65 78   VIEW already ex
cdf0: 69 73 74 73 20 2a 2f 0a 29 7b 0a 20 20 54 61 62  ists */.){.  Tab
ce00: 6c 65 20 2a 70 3b 0a 20 20 69 6e 74 20 6e 3b 0a  le *p;.  int n;.
ce10: 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64    const unsigned
ce20: 20 63 68 61 72 20 2a 7a 3b 0a 20 20 54 6f 6b 65   char *z;.  Toke
ce30: 6e 20 73 45 6e 64 3b 0a 20 20 44 62 46 69 78 65  n sEnd;.  DbFixe
ce40: 72 20 73 46 69 78 3b 0a 20 20 54 6f 6b 65 6e 20  r sFix;.  Token 
ce50: 2a 70 4e 61 6d 65 3b 0a 20 20 69 6e 74 20 69 44  *pName;.  int iD
ce60: 62 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  b;.  sqlite3 *db
ce70: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a   = pParse->db;..
ce80: 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 56    if( pParse->nV
ce90: 61 72 3e 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  ar>0 ){.    sqli
cea0: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
ceb0: 73 65 2c 20 22 70 61 72 61 6d 65 74 65 72 73 20  se, "parameters 
cec0: 61 72 65 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 20  are not allowed 
ced0: 69 6e 20 76 69 65 77 73 22 29 3b 0a 20 20 20 20  in views");.    
cee0: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c  sqlite3SelectDel
cef0: 65 74 65 28 64 62 2c 20 70 53 65 6c 65 63 74 29  ete(db, pSelect)
cf00: 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
cf10: 7d 0a 20 20 73 71 6c 69 74 65 33 53 74 61 72 74  }.  sqlite3Start
cf20: 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70 4e  Table(pParse, pN
cf30: 61 6d 65 31 2c 20 70 4e 61 6d 65 32 2c 20 69 73  ame1, pName2, is
cf40: 54 65 6d 70 2c 20 31 2c 20 30 2c 20 6e 6f 45 72  Temp, 1, 0, noEr
cf50: 72 29 3b 0a 20 20 70 20 3d 20 70 50 61 72 73 65  r);.  p = pParse
cf60: 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 69  ->pNewTable;.  i
cf70: 66 28 20 70 3d 3d 30 20 7c 7c 20 70 50 61 72 73  f( p==0 || pPars
cf80: 65 2d 3e 6e 45 72 72 20 29 7b 0a 20 20 20 20 73  e->nErr ){.    s
cf90: 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65  qlite3SelectDele
cfa0: 74 65 28 64 62 2c 20 70 53 65 6c 65 63 74 29 3b  te(db, pSelect);
cfb0: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
cfc0: 0a 20 20 73 71 6c 69 74 65 33 54 77 6f 50 61 72  .  sqlite3TwoPar
cfd0: 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 70 4e  tName(pParse, pN
cfe0: 61 6d 65 31 2c 20 70 4e 61 6d 65 32 2c 20 26 70  ame1, pName2, &p
cff0: 4e 61 6d 65 29 3b 0a 20 20 69 44 62 20 3d 20 73  Name);.  iDb = s
d000: 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e  qlite3SchemaToIn
d010: 64 65 78 28 64 62 2c 20 70 2d 3e 70 53 63 68 65  dex(db, p->pSche
d020: 6d 61 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  ma);.  if( sqlit
d030: 65 33 46 69 78 49 6e 69 74 28 26 73 46 69 78 2c  e3FixInit(&sFix,
d040: 20 70 50 61 72 73 65 2c 20 69 44 62 2c 20 22 76   pParse, iDb, "v
d050: 69 65 77 22 2c 20 70 4e 61 6d 65 29 0a 20 20 20  iew", pName).   
d060: 20 26 26 20 73 71 6c 69 74 65 33 46 69 78 53 65   && sqlite3FixSe
d070: 6c 65 63 74 28 26 73 46 69 78 2c 20 70 53 65 6c  lect(&sFix, pSel
d080: 65 63 74 29 0a 20 20 29 7b 0a 20 20 20 20 73 71  ect).  ){.    sq
d090: 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74  lite3SelectDelet
d0a0: 65 28 64 62 2c 20 70 53 65 6c 65 63 74 29 3b 0a  e(db, pSelect);.
d0b0: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
d0c0: 0a 20 20 2f 2a 20 4d 61 6b 65 20 61 20 63 6f 70  .  /* Make a cop
d0d0: 79 20 6f 66 20 74 68 65 20 65 6e 74 69 72 65 20  y of the entire 
d0e0: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
d0f0: 20 74 68 61 74 20 64 65 66 69 6e 65 73 20 74 68   that defines th
d100: 65 20 76 69 65 77 2e 0a 20 20 2a 2a 20 54 68 69  e view..  ** Thi
d110: 73 20 77 69 6c 6c 20 66 6f 72 63 65 20 61 6c 6c  s will force all
d120: 20 74 68 65 20 45 78 70 72 2e 74 6f 6b 65 6e 2e   the Expr.token.
d130: 7a 20 76 61 6c 75 65 73 20 74 6f 20 62 65 20 64  z values to be d
d140: 79 6e 61 6d 69 63 61 6c 6c 79 0a 20 20 2a 2a 20  ynamically.  ** 
d150: 61 6c 6c 6f 63 61 74 65 64 20 72 61 74 68 65 72  allocated rather
d160: 20 74 68 61 6e 20 70 6f 69 6e 74 20 74 6f 20 74   than point to t
d170: 68 65 20 69 6e 70 75 74 20 73 74 72 69 6e 67 20  he input string 
d180: 2d 20 77 68 69 63 68 20 6d 65 61 6e 73 20 74 68  - which means th
d190: 61 74 0a 20 20 2a 2a 20 74 68 65 79 20 77 69 6c  at.  ** they wil
d1a0: 6c 20 70 65 72 73 69 73 74 20 61 66 74 65 72 20  l persist after 
d1b0: 74 68 65 20 63 75 72 72 65 6e 74 20 73 71 6c 69  the current sqli
d1c0: 74 65 33 5f 65 78 65 63 28 29 20 63 61 6c 6c 20  te3_exec() call 
d1d0: 72 65 74 75 72 6e 73 2e 0a 20 20 2a 2f 0a 20 20  returns..  */.  
d1e0: 70 2d 3e 70 53 65 6c 65 63 74 20 3d 20 73 71 6c  p->pSelect = sql
d1f0: 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 64 62  ite3SelectDup(db
d200: 2c 20 70 53 65 6c 65 63 74 29 3b 0a 20 20 73 71  , pSelect);.  sq
d210: 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74  lite3SelectDelet
d220: 65 28 64 62 2c 20 70 53 65 6c 65 63 74 29 3b 0a  e(db, pSelect);.
d230: 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
d240: 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 72 65  Failed ){.    re
d250: 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20  turn;.  }.  if( 
d260: 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29  !db->init.busy )
d270: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 69 65  {.    sqlite3Vie
d280: 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28  wGetColumnNames(
d290: 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 7d 0a  pParse, p);.  }.
d2a0: 0a 20 20 2f 2a 20 4c 6f 63 61 74 65 20 74 68 65  .  /* Locate the
d2b0: 20 65 6e 64 20 6f 66 20 74 68 65 20 43 52 45 41   end of the CREA
d2c0: 54 45 20 56 49 45 57 20 73 74 61 74 65 6d 65 6e  TE VIEW statemen
d2d0: 74 2e 20 20 4d 61 6b 65 20 73 45 6e 64 20 70 6f  t.  Make sEnd po
d2e0: 69 6e 74 20 74 6f 0a 20 20 2a 2a 20 74 68 65 20  int to.  ** the 
d2f0: 65 6e 64 2e 0a 20 20 2a 2f 0a 20 20 73 45 6e 64  end..  */.  sEnd
d300: 20 3d 20 70 50 61 72 73 65 2d 3e 73 4c 61 73 74   = pParse->sLast
d310: 54 6f 6b 65 6e 3b 0a 20 20 69 66 28 20 73 45 6e  Token;.  if( sEn
d320: 64 2e 7a 5b 30 5d 21 3d 30 20 26 26 20 73 45 6e  d.z[0]!=0 && sEn
d330: 64 2e 7a 5b 30 5d 21 3d 27 3b 27 20 29 7b 0a 20  d.z[0]!=';' ){. 
d340: 20 20 20 73 45 6e 64 2e 7a 20 2b 3d 20 73 45 6e     sEnd.z += sEn
d350: 64 2e 6e 3b 0a 20 20 7d 0a 20 20 73 45 6e 64 2e  d.n;.  }.  sEnd.
d360: 6e 20 3d 20 30 3b 0a 20 20 6e 20 3d 20 73 45 6e  n = 0;.  n = sEn
d370: 64 2e 7a 20 2d 20 70 42 65 67 69 6e 2d 3e 7a 3b  d.z - pBegin->z;
d380: 0a 20 20 7a 20 3d 20 28 63 6f 6e 73 74 20 75 6e  .  z = (const un
d390: 73 69 67 6e 65 64 20 63 68 61 72 2a 29 70 42 65  signed char*)pBe
d3a0: 67 69 6e 2d 3e 7a 3b 0a 20 20 77 68 69 6c 65 28  gin->z;.  while(
d3b0: 20 6e 3e 30 20 26 26 20 28 7a 5b 6e 2d 31 5d 3d   n>0 && (z[n-1]=
d3c0: 3d 27 3b 27 20 7c 7c 20 69 73 73 70 61 63 65 28  =';' || isspace(
d3d0: 7a 5b 6e 2d 31 5d 29 29 20 29 7b 20 6e 2d 2d 3b  z[n-1])) ){ n--;
d3e0: 20 7d 0a 20 20 73 45 6e 64 2e 7a 20 3d 20 26 7a   }.  sEnd.z = &z
d3f0: 5b 6e 2d 31 5d 3b 0a 20 20 73 45 6e 64 2e 6e 20  [n-1];.  sEnd.n 
d400: 3d 20 31 3b 0a 0a 20 20 2f 2a 20 55 73 65 20 73  = 1;..  /* Use s
d410: 71 6c 69 74 65 33 45 6e 64 54 61 62 6c 65 28 29  qlite3EndTable()
d420: 20 74 6f 20 61 64 64 20 74 68 65 20 76 69 65 77   to add the view
d430: 20 74 6f 20 74 68 65 20 53 51 4c 49 54 45 5f 4d   to the SQLITE_M
d440: 41 53 54 45 52 20 74 61 62 6c 65 20 2a 2f 0a 20  ASTER table */. 
d450: 20 73 71 6c 69 74 65 33 45 6e 64 54 61 62 6c 65   sqlite3EndTable
d460: 28 70 50 61 72 73 65 2c 20 30 2c 20 26 73 45 6e  (pParse, 0, &sEn
d470: 64 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 3b  d, 0);.  return;
d480: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
d490: 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 20 2a 2f  ITE_OMIT_VIEW */
d4a0: 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  ..#if !defined(S
d4b0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29  QLITE_OMIT_VIEW)
d4c0: 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c   || !defined(SQL
d4d0: 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
d4e0: 54 41 42 4c 45 29 0a 2f 2a 0a 2a 2a 20 54 68 65  TABLE)./*.** The
d4f0: 20 54 61 62 6c 65 20 73 74 72 75 63 74 75 72 65   Table structure
d500: 20 70 54 61 62 6c 65 20 69 73 20 72 65 61 6c 6c   pTable is reall
d510: 79 20 61 20 56 49 45 57 2e 20 20 46 69 6c 6c 20  y a VIEW.  Fill 
d520: 69 6e 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 0a  in the names of.
d530: 2a 2a 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 6f  ** the columns o
d540: 66 20 74 68 65 20 76 69 65 77 20 69 6e 20 74 68  f the view in th
d550: 65 20 70 54 61 62 6c 65 20 73 74 72 75 63 74 75  e pTable structu
d560: 72 65 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20  re.  Return the 
d570: 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66 20 65 72 72  number.** of err
d580: 6f 72 73 2e 20 20 49 66 20 61 6e 20 65 72 72 6f  ors.  If an erro
d590: 72 20 69 73 20 73 65 65 6e 20 6c 65 61 76 65 20  r is seen leave 
d5a0: 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  an error message
d5b0: 20 69 6e 20 70 50 61 72 73 65 2d 3e 7a 45 72 72   in pParse->zErr
d5c0: 4d 73 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  Msg..*/.int sqli
d5d0: 74 65 33 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e  te3ViewGetColumn
d5e0: 4e 61 6d 65 73 28 50 61 72 73 65 20 2a 70 50 61  Names(Parse *pPa
d5f0: 72 73 65 2c 20 54 61 62 6c 65 20 2a 70 54 61 62  rse, Table *pTab
d600: 6c 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 53  le){.  Table *pS
d610: 65 6c 54 61 62 3b 20 20 20 2f 2a 20 41 20 66 61  elTab;   /* A fa
d620: 6b 65 20 74 61 62 6c 65 20 66 72 6f 6d 20 77 68  ke table from wh
d630: 69 63 68 20 77 65 20 67 65 74 20 74 68 65 20 72  ich we get the r
d640: 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 20 20 53  esult set */.  S
d650: 65 6c 65 63 74 20 2a 70 53 65 6c 3b 20 20 20 20  elect *pSel;    
d660: 20 2f 2a 20 43 6f 70 79 20 6f 66 20 74 68 65 20   /* Copy of the 
d670: 53 45 4c 45 43 54 20 74 68 61 74 20 69 6d 70 6c  SELECT that impl
d680: 65 6d 65 6e 74 73 20 74 68 65 20 76 69 65 77 20  ements the view 
d690: 2a 2f 0a 20 20 69 6e 74 20 6e 45 72 72 20 3d 20  */.  int nErr = 
d6a0: 30 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72  0;     /* Number
d6b0: 20 6f 66 20 65 72 72 6f 72 73 20 65 6e 63 6f 75   of errors encou
d6c0: 6e 74 65 72 65 64 20 2a 2f 0a 20 20 69 6e 74 20  ntered */.  int 
d6d0: 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  n;            /*
d6e0: 20 54 65 6d 70 6f 72 61 72 69 6c 79 20 68 6f 6c   Temporarily hol
d6f0: 64 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ds the number of
d700: 20 63 75 72 73 6f 72 73 20 61 73 73 69 67 6e 65   cursors assigne
d710: 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a  d */.  sqlite3 *
d720: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
d730: 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f    /* Database co
d740: 6e 6e 65 63 74 69 6f 6e 20 66 6f 72 20 6d 61 6c  nnection for mal
d750: 6c 6f 63 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20  loc errors */.  
d760: 69 6e 74 20 28 2a 78 41 75 74 68 29 28 76 6f 69  int (*xAuth)(voi
d770: 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 63 68 61  d*,int,const cha
d780: 72 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a 2c 63  r*,const char*,c
d790: 6f 6e 73 74 20 63 68 61 72 2a 2c 63 6f 6e 73 74  onst char*,const
d7a0: 20 63 68 61 72 2a 29 3b 0a 0a 20 20 61 73 73 65   char*);..  asse
d7b0: 72 74 28 20 70 54 61 62 6c 65 20 29 3b 0a 0a 23  rt( pTable );..#
d7c0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
d7d0: 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
d7e0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 56 74 61    if( sqlite3Vta
d7f0: 62 43 61 6c 6c 43 6f 6e 6e 65 63 74 28 70 50 61  bCallConnect(pPa
d800: 72 73 65 2c 20 70 54 61 62 6c 65 29 20 29 7b 0a  rse, pTable) ){.
d810: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
d820: 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69  E_ERROR;.  }.  i
d830: 66 28 20 49 73 56 69 72 74 75 61 6c 28 70 54 61  f( IsVirtual(pTa
d840: 62 6c 65 29 20 29 20 72 65 74 75 72 6e 20 30 3b  ble) ) return 0;
d850: 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66  .#endif..#ifndef
d860: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45   SQLITE_OMIT_VIE
d870: 57 0a 20 20 2f 2a 20 41 20 70 6f 73 69 74 69 76  W.  /* A positiv
d880: 65 20 6e 43 6f 6c 20 6d 65 61 6e 73 20 74 68 65  e nCol means the
d890: 20 63 6f 6c 75 6d 6e 73 20 6e 61 6d 65 73 20 66   columns names f
d8a0: 6f 72 20 74 68 69 73 20 76 69 65 77 20 61 72 65  or this view are
d8b0: 0a 20 20 2a 2a 20 61 6c 72 65 61 64 79 20 6b 6e  .  ** already kn
d8c0: 6f 77 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  own..  */.  if( 
d8d0: 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3e 30 20 29  pTable->nCol>0 )
d8e0: 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20 2f 2a   return 0;..  /*
d8f0: 20 41 20 6e 65 67 61 74 69 76 65 20 6e 43 6f 6c   A negative nCol
d900: 20 69 73 20 61 20 73 70 65 63 69 61 6c 20 6d 61   is a special ma
d910: 72 6b 65 72 20 6d 65 61 6e 69 6e 67 20 74 68 61  rker meaning tha
d920: 74 20 77 65 20 61 72 65 20 63 75 72 72 65 6e 74  t we are current
d930: 6c 79 0a 20 20 2a 2a 20 74 72 79 69 6e 67 20 74  ly.  ** trying t
d940: 6f 20 63 6f 6d 70 75 74 65 20 74 68 65 20 63 6f  o compute the co
d950: 6c 75 6d 6e 20 6e 61 6d 65 73 2e 20 20 49 66 20  lumn names.  If 
d960: 77 65 20 65 6e 74 65 72 20 74 68 69 73 20 72 6f  we enter this ro
d970: 75 74 69 6e 65 20 77 69 74 68 0a 20 20 2a 2a 20  utine with.  ** 
d980: 61 20 6e 65 67 61 74 69 76 65 20 6e 43 6f 6c 2c  a negative nCol,
d990: 20 69 74 20 6d 65 61 6e 73 20 74 77 6f 20 6f 72   it means two or
d9a0: 20 6d 6f 72 65 20 76 69 65 77 73 20 66 6f 72 6d   more views form
d9b0: 20 61 20 6c 6f 6f 70 2c 20 6c 69 6b 65 20 74 68   a loop, like th
d9c0: 69 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  is:.  **.  **   
d9d0: 20 20 43 52 45 41 54 45 20 56 49 45 57 20 6f 6e    CREATE VIEW on
d9e0: 65 20 41 53 20 53 45 4c 45 43 54 20 2a 20 46 52  e AS SELECT * FR
d9f0: 4f 4d 20 74 77 6f 3b 0a 20 20 2a 2a 20 20 20 20  OM two;.  **    
da00: 20 43 52 45 41 54 45 20 56 49 45 57 20 74 77 6f   CREATE VIEW two
da10: 20 41 53 20 53 45 4c 45 43 54 20 2a 20 46 52 4f   AS SELECT * FRO
da20: 4d 20 6f 6e 65 3b 0a 20 20 2a 2a 0a 20 20 2a 2a  M one;.  **.  **
da30: 20 41 63 74 75 61 6c 6c 79 2c 20 74 68 69 73 20   Actually, this 
da40: 65 72 72 6f 72 20 69 73 20 63 61 75 67 68 74 20  error is caught 
da50: 70 72 65 76 69 6f 75 73 6c 79 20 61 6e 64 20 73  previously and s
da60: 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  o the following 
da70: 74 65 73 74 0a 20 20 2a 2a 20 73 68 6f 75 6c 64  test.  ** should
da80: 20 61 6c 77 61 79 73 20 66 61 69 6c 2e 20 20 42   always fail.  B
da90: 75 74 20 77 65 20 77 69 6c 6c 20 6c 65 61 76 65  ut we will leave
daa0: 20 69 74 20 69 6e 20 70 6c 61 63 65 20 6a 75 73   it in place jus
dab0: 74 20 74 6f 20 62 65 20 73 61 66 65 2e 0a 20 20  t to be safe..  
dac0: 2a 2f 0a 20 20 69 66 28 20 70 54 61 62 6c 65 2d  */.  if( pTable-
dad0: 3e 6e 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 73  >nCol<0 ){.    s
dae0: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
daf0: 50 61 72 73 65 2c 20 22 76 69 65 77 20 25 73 20  Parse, "view %s 
db00: 69 73 20 63 69 72 63 75 6c 61 72 6c 79 20 64 65  is circularly de
db10: 66 69 6e 65 64 22 2c 20 70 54 61 62 6c 65 2d 3e  fined", pTable->
db20: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72 65 74 75  zName);.    retu
db30: 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 61 73 73 65  rn 1;.  }.  asse
db40: 72 74 28 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c  rt( pTable->nCol
db50: 3e 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  >=0 );..  /* If 
db60: 77 65 20 67 65 74 20 74 68 69 73 20 66 61 72 2c  we get this far,
db70: 20 69 74 20 6d 65 61 6e 73 20 77 65 20 6e 65 65   it means we nee
db80: 64 20 74 6f 20 63 6f 6d 70 75 74 65 20 74 68 65  d to compute the
db90: 20 74 61 62 6c 65 20 6e 61 6d 65 73 2e 0a 20 20   table names..  
dba0: 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65  ** Note that the
dbb0: 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
dbc0: 52 65 73 75 6c 74 53 65 74 4f 66 53 65 6c 65 63  ResultSetOfSelec
dbd0: 74 28 29 20 77 69 6c 6c 20 65 78 70 61 6e 64 20  t() will expand 
dbe0: 61 6e 79 0a 20 20 2a 2a 20 22 2a 22 20 65 6c 65  any.  ** "*" ele
dbf0: 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 72 65 73  ments in the res
dc00: 75 6c 74 73 20 73 65 74 20 6f 66 20 74 68 65 20  ults set of the 
dc10: 76 69 65 77 20 61 6e 64 20 77 69 6c 6c 20 61 73  view and will as
dc20: 73 69 67 6e 20 63 75 72 73 6f 72 73 0a 20 20 2a  sign cursors.  *
dc30: 2a 20 74 6f 20 74 68 65 20 65 6c 65 6d 65 6e 74  * to the element
dc40: 73 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c  s of the FROM cl
dc50: 61 75 73 65 2e 20 20 42 75 74 20 77 65 20 64 6f  ause.  But we do
dc60: 20 6e 6f 74 20 77 61 6e 74 20 74 68 65 73 65 20   not want these 
dc70: 63 68 61 6e 67 65 73 0a 20 20 2a 2a 20 74 6f 20  changes.  ** to 
dc80: 62 65 20 70 65 72 6d 61 6e 65 6e 74 2e 20 20 53  be permanent.  S
dc90: 6f 20 74 68 65 20 63 6f 6d 70 75 74 61 74 69 6f  o the computatio
dca0: 6e 20 69 73 20 64 6f 6e 65 20 6f 6e 20 61 20 63  n is done on a c
dcb0: 6f 70 79 20 6f 66 20 74 68 65 20 53 45 4c 45 43  opy of the SELEC
dcc0: 54 0a 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74  T.  ** statement
dcd0: 20 74 68 61 74 20 64 65 66 69 6e 65 73 20 74 68   that defines th
dce0: 65 20 76 69 65 77 2e 0a 20 20 2a 2f 0a 20 20 61  e view..  */.  a
dcf0: 73 73 65 72 74 28 20 70 54 61 62 6c 65 2d 3e 70  ssert( pTable->p
dd00: 53 65 6c 65 63 74 20 29 3b 0a 20 20 70 53 65 6c  Select );.  pSel
dd10: 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74   = sqlite3Select
dd20: 44 75 70 28 64 62 2c 20 70 54 61 62 6c 65 2d 3e  Dup(db, pTable->
dd30: 70 53 65 6c 65 63 74 29 3b 0a 20 20 69 66 28 20  pSelect);.  if( 
dd40: 70 53 65 6c 20 29 7b 0a 20 20 20 20 6e 20 3d 20  pSel ){.    n = 
dd50: 70 50 61 72 73 65 2d 3e 6e 54 61 62 3b 0a 20 20  pParse->nTab;.  
dd60: 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74    sqlite3SrcList
dd70: 41 73 73 69 67 6e 43 75 72 73 6f 72 73 28 70 50  AssignCursors(pP
dd80: 61 72 73 65 2c 20 70 53 65 6c 2d 3e 70 53 72 63  arse, pSel->pSrc
dd90: 29 3b 0a 20 20 20 20 70 54 61 62 6c 65 2d 3e 6e  );.    pTable->n
dda0: 43 6f 6c 20 3d 20 2d 31 3b 0a 23 69 66 6e 64 65  Col = -1;.#ifnde
ddb0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
ddc0: 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 20 20  THORIZATION.    
ddd0: 78 41 75 74 68 20 3d 20 64 62 2d 3e 78 41 75 74  xAuth = db->xAut
dde0: 68 3b 0a 20 20 20 20 64 62 2d 3e 78 41 75 74 68  h;.    db->xAuth
ddf0: 20 3d 20 30 3b 0a 20 20 20 20 70 53 65 6c 54 61   = 0;.    pSelTa
de00: 62 20 3d 20 73 71 6c 69 74 65 33 52 65 73 75 6c  b = sqlite3Resul
de10: 74 53 65 74 4f 66 53 65 6c 65 63 74 28 70 50 61  tSetOfSelect(pPa
de20: 72 73 65 2c 20 70 53 65 6c 29 3b 0a 20 20 20 20  rse, pSel);.    
de30: 64 62 2d 3e 78 41 75 74 68 20 3d 20 78 41 75 74  db->xAuth = xAut
de40: 68 3b 0a 23 65 6c 73 65 0a 20 20 20 20 70 53 65  h;.#else.    pSe
de50: 6c 54 61 62 20 3d 20 73 71 6c 69 74 65 33 52 65  lTab = sqlite3Re
de60: 73 75 6c 74 53 65 74 4f 66 53 65 6c 65 63 74 28  sultSetOfSelect(
de70: 70 50 61 72 73 65 2c 20 70 53 65 6c 29 3b 0a 23  pParse, pSel);.#
de80: 65 6e 64 69 66 0a 20 20 20 20 70 50 61 72 73 65  endif.    pParse
de90: 2d 3e 6e 54 61 62 20 3d 20 6e 3b 0a 20 20 20 20  ->nTab = n;.    
dea0: 69 66 28 20 70 53 65 6c 54 61 62 20 29 7b 0a 20  if( pSelTab ){. 
deb0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54 61       assert( pTa
dec0: 62 6c 65 2d 3e 61 43 6f 6c 3d 3d 30 20 29 3b 0a  ble->aCol==0 );.
ded0: 20 20 20 20 20 20 70 54 61 62 6c 65 2d 3e 6e 43        pTable->nC
dee0: 6f 6c 20 3d 20 70 53 65 6c 54 61 62 2d 3e 6e 43  ol = pSelTab->nC
def0: 6f 6c 3b 0a 20 20 20 20 20 20 70 54 61 62 6c 65  ol;.      pTable
df00: 2d 3e 61 43 6f 6c 20 3d 20 70 53 65 6c 54 61 62  ->aCol = pSelTab
df10: 2d 3e 61 43 6f 6c 3b 0a 20 20 20 20 20 20 70 53  ->aCol;.      pS
df20: 65 6c 54 61 62 2d 3e 6e 43 6f 6c 20 3d 20 30 3b  elTab->nCol = 0;
df30: 0a 20 20 20 20 20 20 70 53 65 6c 54 61 62 2d 3e  .      pSelTab->
df40: 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20  aCol = 0;.      
df50: 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62  sqlite3DeleteTab
df60: 6c 65 28 70 53 65 6c 54 61 62 29 3b 0a 20 20 20  le(pSelTab);.   
df70: 20 20 20 70 54 61 62 6c 65 2d 3e 70 53 63 68 65     pTable->pSche
df80: 6d 61 2d 3e 66 6c 61 67 73 20 7c 3d 20 44 42 5f  ma->flags |= DB_
df90: 55 6e 72 65 73 65 74 56 69 65 77 73 3b 0a 20 20  UnresetViews;.  
dfa0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
dfb0: 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 30 3b  Table->nCol = 0;
dfc0: 0a 20 20 20 20 20 20 6e 45 72 72 2b 2b 3b 0a 20  .      nErr++;. 
dfd0: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
dfe0: 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c  SelectDelete(db,
dff0: 20 70 53 65 6c 29 3b 0a 20 20 7d 20 65 6c 73 65   pSel);.  } else
e000: 20 7b 0a 20 20 20 20 6e 45 72 72 2b 2b 3b 0a 20   {.    nErr++;. 
e010: 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c   }.#endif /* SQL
e020: 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 20 2a 2f  ITE_OMIT_VIEW */
e030: 0a 20 20 72 65 74 75 72 6e 20 6e 45 72 72 3b 20  .  return nErr; 
e040: 20 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64   .}.#endif /* !d
e050: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
e060: 49 54 5f 56 49 45 57 29 20 7c 7c 20 21 64 65 66  IT_VIEW) || !def
e070: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
e080: 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 20 2a  _VIRTUALTABLE) *
e090: 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  /..#ifndef SQLIT
e0a0: 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 2f 2a 0a 2a  E_OMIT_VIEW./*.*
e0b0: 2a 20 43 6c 65 61 72 20 74 68 65 20 63 6f 6c 75  * Clear the colu
e0c0: 6d 6e 20 6e 61 6d 65 73 20 66 72 6f 6d 20 65 76  mn names from ev
e0d0: 65 72 79 20 56 49 45 57 20 69 6e 20 64 61 74 61  ery VIEW in data
e0e0: 62 61 73 65 20 69 64 78 2e 0a 2a 2f 0a 73 74 61  base idx..*/.sta
e0f0: 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65 56  tic void sqliteV
e100: 69 65 77 52 65 73 65 74 41 6c 6c 28 73 71 6c 69  iewResetAll(sqli
e110: 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 69 64 78  te3 *db, int idx
e120: 29 7b 0a 20 20 48 61 73 68 45 6c 65 6d 20 2a 69  ){.  HashElem *i
e130: 3b 0a 20 20 69 66 28 20 21 44 62 48 61 73 50 72  ;.  if( !DbHasPr
e140: 6f 70 65 72 74 79 28 64 62 2c 20 69 64 78 2c 20  operty(db, idx, 
e150: 44 42 5f 55 6e 72 65 73 65 74 56 69 65 77 73 29  DB_UnresetViews)
e160: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72   ) return;.  for
e170: 28 69 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72  (i=sqliteHashFir
e180: 73 74 28 26 64 62 2d 3e 61 44 62 5b 69 64 78 5d  st(&db->aDb[idx]
e190: 2e 70 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73  .pSchema->tblHas
e1a0: 68 29 3b 20 69 3b 69 3d 73 71 6c 69 74 65 48 61  h); i;i=sqliteHa
e1b0: 73 68 4e 65 78 74 28 69 29 29 7b 0a 20 20 20 20  shNext(i)){.    
e1c0: 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 73 71  Table *pTab = sq
e1d0: 6c 69 74 65 48 61 73 68 44 61 74 61 28 69 29 3b  liteHashData(i);
e1e0: 0a 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e 70  .    if( pTab->p
e1f0: 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20  Select ){.      
e200: 73 71 6c 69 74 65 52 65 73 65 74 43 6f 6c 75 6d  sqliteResetColum
e210: 6e 4e 61 6d 65 73 28 70 54 61 62 29 3b 0a 20 20  nNames(pTab);.  
e220: 20 20 7d 0a 20 20 7d 0a 20 20 44 62 43 6c 65 61    }.  }.  DbClea
e230: 72 50 72 6f 70 65 72 74 79 28 64 62 2c 20 69 64  rProperty(db, id
e240: 78 2c 20 44 42 5f 55 6e 72 65 73 65 74 56 69 65  x, DB_UnresetVie
e250: 77 73 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64  ws);.}.#else.# d
e260: 65 66 69 6e 65 20 73 71 6c 69 74 65 56 69 65 77  efine sqliteView
e270: 52 65 73 65 74 41 6c 6c 28 41 2c 42 29 0a 23 65  ResetAll(A,B).#e
e280: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
e290: 4d 49 54 5f 56 49 45 57 20 2a 2f 0a 0a 2f 2a 0a  MIT_VIEW */../*.
e2a0: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
e2b0: 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68   is called by th
e2c0: 65 20 56 44 42 45 20 74 6f 20 61 64 6a 75 73 74  e VDBE to adjust
e2d0: 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 73 63   the internal sc
e2e0: 68 65 6d 61 0a 2a 2a 20 75 73 65 64 20 62 79 20  hema.** used by 
e2f0: 53 51 4c 69 74 65 20 77 68 65 6e 20 74 68 65 20  SQLite when the 
e300: 62 74 72 65 65 20 6c 61 79 65 72 20 6d 6f 76 65  btree layer move
e310: 73 20 61 20 74 61 62 6c 65 20 72 6f 6f 74 20 70  s a table root p
e320: 61 67 65 2e 20 54 68 65 0a 2a 2a 20 72 6f 6f 74  age. The.** root
e330: 2d 70 61 67 65 20 6f 66 20 61 20 74 61 62 6c 65  -page of a table
e340: 20 6f 72 20 69 6e 64 65 78 20 69 6e 20 64 61 74   or index in dat
e350: 61 62 61 73 65 20 69 44 62 20 68 61 73 20 63 68  abase iDb has ch
e360: 61 6e 67 65 64 20 66 72 6f 6d 20 69 46 72 6f 6d  anged from iFrom
e370: 0a 2a 2a 20 74 6f 20 69 54 6f 2e 0a 2a 2a 0a 2a  .** to iTo..**.*
e380: 2a 20 54 69 63 6b 65 74 20 23 31 37 32 38 3a 20  * Ticket #1728: 
e390: 20 54 68 65 20 73 79 6d 62 6f 6c 20 74 61 62 6c   The symbol tabl
e3a0: 65 20 6d 69 67 68 74 20 73 74 69 6c 6c 20 63 6f  e might still co
e3b0: 6e 74 61 69 6e 20 69 6e 66 6f 72 6d 61 74 69 6f  ntain informatio
e3c0: 6e 0a 2a 2a 20 6f 6e 20 74 61 62 6c 65 73 20 61  n.** on tables a
e3d0: 6e 64 2f 6f 72 20 69 6e 64 69 63 65 73 20 74 68  nd/or indices th
e3e0: 61 74 20 61 72 65 20 74 68 65 20 70 72 6f 63 65  at are the proce
e3f0: 73 73 20 6f 66 20 62 65 69 6e 67 20 64 65 6c 65  ss of being dele
e400: 74 65 64 2e 0a 2a 2a 20 49 66 20 79 6f 75 20 61  ted..** If you a
e410: 72 65 20 75 6e 6c 75 63 6b 79 2c 20 6f 6e 65 20  re unlucky, one 
e420: 6f 66 20 74 68 6f 73 65 20 64 65 6c 65 74 65 64  of those deleted
e430: 20 69 6e 64 69 63 65 73 20 6f 72 20 74 61 62 6c   indices or tabl
e440: 65 73 20 6d 69 67 68 74 0a 2a 2a 20 68 61 76 65  es might.** have
e450: 20 74 68 65 20 73 61 6d 65 20 72 6f 6f 74 70 61   the same rootpa
e460: 67 65 20 6e 75 6d 62 65 72 20 61 73 20 74 68 65  ge number as the
e470: 20 72 65 61 6c 20 74 61 62 6c 65 20 6f 72 20 69   real table or i
e480: 6e 64 65 78 20 74 68 61 74 20 69 73 0a 2a 2a 20  ndex that is.** 
e490: 62 65 69 6e 67 20 6d 6f 76 65 64 2e 20 20 53 6f  being moved.  So
e4a0: 20 77 65 20 63 61 6e 6e 6f 74 20 73 74 6f 70 20   we cannot stop 
e4b0: 73 65 61 72 63 68 69 6e 67 20 61 66 74 65 72 20  searching after 
e4c0: 74 68 65 20 66 69 72 73 74 20 6d 61 74 63 68 20  the first match 
e4d0: 0a 2a 2a 20 62 65 63 61 75 73 65 20 74 68 65 20  .** because the 
e4e0: 66 69 72 73 74 20 6d 61 74 63 68 20 6d 69 67 68  first match migh
e4f0: 74 20 62 65 20 66 6f 72 20 6f 6e 65 20 6f 66 20  t be for one of 
e500: 74 68 65 20 64 65 6c 65 74 65 64 20 69 6e 64 69  the deleted indi
e510: 63 65 73 0a 2a 2a 20 6f 72 20 74 61 62 6c 65 73  ces.** or tables
e520: 20 61 6e 64 20 6e 6f 74 20 74 68 65 20 74 61 62   and not the tab
e530: 6c 65 2f 69 6e 64 65 78 20 74 68 61 74 20 69 73  le/index that is
e540: 20 61 63 74 75 61 6c 6c 79 20 62 65 69 6e 67 20   actually being 
e550: 6d 6f 76 65 64 2e 0a 2a 2a 20 57 65 20 6d 75 73  moved..** We mus
e560: 74 20 63 6f 6e 74 69 6e 75 65 20 6c 6f 6f 70 69  t continue loopi
e570: 6e 67 20 75 6e 74 69 6c 20 61 6c 6c 20 74 61 62  ng until all tab
e580: 6c 65 73 20 61 6e 64 20 69 6e 64 69 63 65 73 20  les and indices 
e590: 77 69 74 68 0a 2a 2a 20 72 6f 6f 74 70 61 67 65  with.** rootpage
e5a0: 3d 3d 69 46 72 6f 6d 20 68 61 76 65 20 62 65 65  ==iFrom have bee
e5b0: 6e 20 63 6f 6e 76 65 72 74 65 64 20 74 6f 20 68  n converted to h
e5c0: 61 76 65 20 61 20 72 6f 6f 74 70 61 67 65 20 6f  ave a rootpage o
e5d0: 66 20 69 54 6f 0a 2a 2a 20 69 6e 20 6f 72 64 65  f iTo.** in orde
e5e0: 72 20 74 6f 20 62 65 20 63 65 72 74 61 69 6e 20  r to be certain 
e5f0: 74 68 61 74 20 77 65 20 67 6f 74 20 74 68 65 20  that we got the 
e600: 72 69 67 68 74 20 6f 6e 65 2e 0a 2a 2f 0a 23 69  right one..*/.#i
e610: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
e620: 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 76 6f 69  T_AUTOVACUUM.voi
e630: 64 20 73 71 6c 69 74 65 33 52 6f 6f 74 50 61 67  d sqlite3RootPag
e640: 65 4d 6f 76 65 64 28 44 62 20 2a 70 44 62 2c 20  eMoved(Db *pDb, 
e650: 69 6e 74 20 69 46 72 6f 6d 2c 20 69 6e 74 20 69  int iFrom, int i
e660: 54 6f 29 7b 0a 20 20 48 61 73 68 45 6c 65 6d 20  To){.  HashElem 
e670: 2a 70 45 6c 65 6d 3b 0a 20 20 48 61 73 68 20 2a  *pElem;.  Hash *
e680: 70 48 61 73 68 3b 0a 0a 20 20 70 48 61 73 68 20  pHash;..  pHash 
e690: 3d 20 26 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d  = &pDb->pSchema-
e6a0: 3e 74 62 6c 48 61 73 68 3b 0a 20 20 66 6f 72 28  >tblHash;.  for(
e6b0: 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73 68  pElem=sqliteHash
e6c0: 46 69 72 73 74 28 70 48 61 73 68 29 3b 20 70 45  First(pHash); pE
e6d0: 6c 65 6d 3b 20 70 45 6c 65 6d 3d 73 71 6c 69 74  lem; pElem=sqlit
e6e0: 65 48 61 73 68 4e 65 78 74 28 70 45 6c 65 6d 29  eHashNext(pElem)
e6f0: 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54  ){.    Table *pT
e700: 61 62 20 3d 20 73 71 6c 69 74 65 48 61 73 68 44  ab = sqliteHashD
e710: 61 74 61 28 70 45 6c 65 6d 29 3b 0a 20 20 20 20  ata(pElem);.    
e720: 69 66 28 20 70 54 61 62 2d 3e 74 6e 75 6d 3d 3d  if( pTab->tnum==
e730: 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20 70  iFrom ){.      p
e740: 54 61 62 2d 3e 74 6e 75 6d 20 3d 20 69 54 6f 3b  Tab->tnum = iTo;
e750: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 48 61  .    }.  }.  pHa
e760: 73 68 20 3d 20 26 70 44 62 2d 3e 70 53 63 68 65  sh = &pDb->pSche
e770: 6d 61 2d 3e 69 64 78 48 61 73 68 3b 0a 20 20 66  ma->idxHash;.  f
e780: 6f 72 28 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48  or(pElem=sqliteH
e790: 61 73 68 46 69 72 73 74 28 70 48 61 73 68 29 3b  ashFirst(pHash);
e7a0: 20 70 45 6c 65 6d 3b 20 70 45 6c 65 6d 3d 73 71   pElem; pElem=sq
e7b0: 6c 69 74 65 48 61 73 68 4e 65 78 74 28 70 45 6c  liteHashNext(pEl
e7c0: 65 6d 29 29 7b 0a 20 20 20 20 49 6e 64 65 78 20  em)){.    Index 
e7d0: 2a 70 49 64 78 20 3d 20 73 71 6c 69 74 65 48 61  *pIdx = sqliteHa
e7e0: 73 68 44 61 74 61 28 70 45 6c 65 6d 29 3b 0a 20  shData(pElem);. 
e7f0: 20 20 20 69 66 28 20 70 49 64 78 2d 3e 74 6e 75     if( pIdx->tnu
e800: 6d 3d 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20  m==iFrom ){.    
e810: 20 20 70 49 64 78 2d 3e 74 6e 75 6d 20 3d 20 69    pIdx->tnum = i
e820: 54 6f 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  To;.    }.  }.}.
e830: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 72  #endif../*.** Wr
e840: 69 74 65 20 63 6f 64 65 20 74 6f 20 65 72 61 73  ite code to eras
e850: 65 20 74 68 65 20 74 61 62 6c 65 20 77 69 74 68  e the table with
e860: 20 72 6f 6f 74 2d 70 61 67 65 20 69 54 61 62 6c   root-page iTabl
e870: 65 20 66 72 6f 6d 20 64 61 74 61 62 61 73 65 20  e from database 
e880: 69 44 62 2e 0a 2a 2a 20 41 6c 73 6f 20 77 72 69  iDb..** Also wri
e890: 74 65 20 63 6f 64 65 20 74 6f 20 6d 6f 64 69 66  te code to modif
e8a0: 79 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73  y the sqlite_mas
e8b0: 74 65 72 20 74 61 62 6c 65 20 61 6e 64 20 69 6e  ter table and in
e8c0: 74 65 72 6e 61 6c 20 73 63 68 65 6d 61 0a 2a 2a  ternal schema.**
e8d0: 20 69 66 20 61 20 72 6f 6f 74 2d 70 61 67 65 20   if a root-page 
e8e0: 6f 66 20 61 6e 6f 74 68 65 72 20 74 61 62 6c 65  of another table
e8f0: 20 69 73 20 6d 6f 76 65 64 20 62 79 20 74 68 65   is moved by the
e900: 20 62 74 72 65 65 2d 6c 61 79 65 72 20 77 68 69   btree-layer whi
e910: 6c 73 74 0a 2a 2a 20 65 72 61 73 69 6e 67 20 69  lst.** erasing i
e920: 54 61 62 6c 65 20 28 74 68 69 73 20 63 61 6e 20  Table (this can 
e930: 68 61 70 70 65 6e 20 77 69 74 68 20 61 6e 20 61  happen with an a
e940: 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62  uto-vacuum datab
e950: 61 73 65 29 2e 0a 2a 2f 20 0a 73 74 61 74 69 63  ase)..*/ .static
e960: 20 76 6f 69 64 20 64 65 73 74 72 6f 79 52 6f 6f   void destroyRoo
e970: 74 50 61 67 65 28 50 61 72 73 65 20 2a 70 50 61  tPage(Parse *pPa
e980: 72 73 65 2c 20 69 6e 74 20 69 54 61 62 6c 65 2c  rse, int iTable,
e990: 20 69 6e 74 20 69 44 62 29 7b 0a 20 20 56 64 62   int iDb){.  Vdb
e9a0: 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65  e *v = sqlite3Ge
e9b0: 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
e9c0: 20 69 6e 74 20 72 31 20 3d 20 73 71 6c 69 74 65   int r1 = sqlite
e9d0: 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
e9e0: 73 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  se);.  sqlite3Vd
e9f0: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 44  beAddOp3(v, OP_D
ea00: 65 73 74 72 6f 79 2c 20 69 54 61 62 6c 65 2c 20  estroy, iTable, 
ea10: 72 31 2c 20 69 44 62 29 3b 0a 23 69 66 6e 64 65  r1, iDb);.#ifnde
ea20: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
ea30: 54 4f 56 41 43 55 55 4d 0a 20 20 2f 2a 20 4f 50  TOVACUUM.  /* OP
ea40: 5f 44 65 73 74 72 6f 79 20 73 74 6f 72 65 73 20  _Destroy stores 
ea50: 61 6e 20 69 6e 20 69 6e 74 65 67 65 72 20 72 31  an in integer r1
ea60: 2e 20 49 66 20 74 68 69 73 20 69 6e 74 65 67 65  . If this intege
ea70: 72 0a 20 20 2a 2a 20 69 73 20 6e 6f 6e 2d 7a 65  r.  ** is non-ze
ea80: 72 6f 2c 20 74 68 65 6e 20 69 74 20 69 73 20 74  ro, then it is t
ea90: 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d  he root page num
eaa0: 62 65 72 20 6f 66 20 61 20 74 61 62 6c 65 20 6d  ber of a table m
eab0: 6f 76 65 64 20 74 6f 0a 20 20 2a 2a 20 6c 6f 63  oved to.  ** loc
eac0: 61 74 69 6f 6e 20 69 54 61 62 6c 65 2e 20 54 68  ation iTable. Th
ead0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 64 65  e following code
eae0: 20 6d 6f 64 69 66 69 65 73 20 74 68 65 20 73 71   modifies the sq
eaf0: 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c  lite_master tabl
eb00: 65 20 74 6f 0a 20 20 2a 2a 20 72 65 66 6c 65 63  e to.  ** reflec
eb10: 74 20 74 68 69 73 2e 0a 20 20 2a 2a 0a 20 20 2a  t this..  **.  *
eb20: 2a 20 54 68 65 20 22 23 25 64 22 20 69 6e 20 74  * The "#%d" in t
eb30: 68 65 20 53 51 4c 20 69 73 20 61 20 73 70 65 63  he SQL is a spec
eb40: 69 61 6c 20 63 6f 6e 73 74 61 6e 74 20 74 68 61  ial constant tha
eb50: 74 20 6d 65 61 6e 73 20 77 68 61 74 65 76 65 72  t means whatever
eb60: 20 76 61 6c 75 65 0a 20 20 2a 2a 20 69 73 20 6f   value.  ** is o
eb70: 6e 20 74 68 65 20 74 6f 70 20 6f 66 20 74 68 65  n the top of the
eb80: 20 73 74 61 63 6b 2e 20 20 53 65 65 20 73 71 6c   stack.  See sql
eb90: 69 74 65 33 52 65 67 69 73 74 65 72 45 78 70 72  ite3RegisterExpr
eba0: 28 29 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  ()..  */.  sqlit
ebb0: 65 33 4e 65 73 74 65 64 50 61 72 73 65 28 70 50  e3NestedParse(pP
ebc0: 61 72 73 65 2c 20 0a 20 20 20 20 20 22 55 50 44  arse, .     "UPD
ebd0: 41 54 45 20 25 51 2e 25 73 20 53 45 54 20 72 6f  ATE %Q.%s SET ro
ebe0: 6f 74 70 61 67 65 3d 25 64 20 57 48 45 52 45 20  otpage=%d WHERE 
ebf0: 23 25 64 20 41 4e 44 20 72 6f 6f 74 70 61 67 65  #%d AND rootpage
ec00: 3d 23 25 64 22 2c 0a 20 20 20 20 20 70 50 61 72  =#%d",.     pPar
ec10: 73 65 2d 3e 64 62 2d 3e 61 44 62 5b 69 44 62 5d  se->db->aDb[iDb]
ec20: 2e 7a 4e 61 6d 65 2c 20 53 43 48 45 4d 41 5f 54  .zName, SCHEMA_T
ec30: 41 42 4c 45 28 69 44 62 29 2c 20 69 54 61 62 6c  ABLE(iDb), iTabl
ec40: 65 2c 20 72 31 2c 20 72 31 29 3b 0a 23 65 6e 64  e, r1, r1);.#end
ec50: 69 66 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65  if.  sqlite3Rele
ec60: 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
ec70: 65 2c 20 72 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  e, r1);.}../*.**
ec80: 20 57 72 69 74 65 20 56 44 42 45 20 63 6f 64 65   Write VDBE code
ec90: 20 74 6f 20 65 72 61 73 65 20 74 61 62 6c 65 20   to erase table 
eca0: 70 54 61 62 20 61 6e 64 20 61 6c 6c 20 61 73 73  pTab and all ass
ecb0: 6f 63 69 61 74 65 64 20 69 6e 64 69 63 65 73 20  ociated indices 
ecc0: 6f 6e 20 64 69 73 6b 2e 0a 2a 2a 20 43 6f 64 65  on disk..** Code
ecd0: 20 74 6f 20 75 70 64 61 74 65 20 74 68 65 20 73   to update the s
ece0: 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62  qlite_master tab
ecf0: 6c 65 73 20 61 6e 64 20 69 6e 74 65 72 6e 61 6c  les and internal
ed00: 20 73 63 68 65 6d 61 20 64 65 66 69 6e 69 74 69   schema definiti
ed10: 6f 6e 73 0a 2a 2a 20 69 6e 20 63 61 73 65 20 61  ons.** in case a
ed20: 20 72 6f 6f 74 2d 70 61 67 65 20 62 65 6c 6f 6e   root-page belon
ed30: 67 69 6e 67 20 74 6f 20 61 6e 6f 74 68 65 72 20  ging to another 
ed40: 74 61 62 6c 65 20 69 73 20 6d 6f 76 65 64 20 62  table is moved b
ed50: 79 20 74 68 65 20 62 74 72 65 65 20 6c 61 79 65  y the btree laye
ed60: 72 0a 2a 2a 20 69 73 20 61 6c 73 6f 20 61 64 64  r.** is also add
ed70: 65 64 20 28 74 68 69 73 20 63 61 6e 20 68 61 70  ed (this can hap
ed80: 70 65 6e 20 77 69 74 68 20 61 6e 20 61 75 74 6f  pen with an auto
ed90: 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61 73 65  -vacuum database
eda0: 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  )..*/.static voi
edb0: 64 20 64 65 73 74 72 6f 79 54 61 62 6c 65 28 50  d destroyTable(P
edc0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 61  arse *pParse, Ta
edd0: 62 6c 65 20 2a 70 54 61 62 29 7b 0a 23 69 66 64  ble *pTab){.#ifd
ede0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
edf0: 55 54 4f 56 41 43 55 55 4d 0a 20 20 49 6e 64 65  UTOVACUUM.  Inde
ee00: 78 20 2a 70 49 64 78 3b 0a 20 20 69 6e 74 20 69  x *pIdx;.  int i
ee10: 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65  Db = sqlite3Sche
ee20: 6d 61 54 6f 49 6e 64 65 78 28 70 50 61 72 73 65  maToIndex(pParse
ee30: 2d 3e 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68  ->db, pTab->pSch
ee40: 65 6d 61 29 3b 0a 20 20 64 65 73 74 72 6f 79 52  ema);.  destroyR
ee50: 6f 6f 74 50 61 67 65 28 70 50 61 72 73 65 2c 20  ootPage(pParse, 
ee60: 70 54 61 62 2d 3e 74 6e 75 6d 2c 20 69 44 62 29  pTab->tnum, iDb)
ee70: 3b 0a 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61  ;.  for(pIdx=pTa
ee80: 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b  b->pIndex; pIdx;
ee90: 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78   pIdx=pIdx->pNex
eea0: 74 29 7b 0a 20 20 20 20 64 65 73 74 72 6f 79 52  t){.    destroyR
eeb0: 6f 6f 74 50 61 67 65 28 70 50 61 72 73 65 2c 20  ootPage(pParse, 
eec0: 70 49 64 78 2d 3e 74 6e 75 6d 2c 20 69 44 62 29  pIdx->tnum, iDb)
eed0: 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20 2f 2a  ;.  }.#else.  /*
eee0: 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65   If the database
eef0: 20 6d 61 79 20 62 65 20 61 75 74 6f 2d 76 61 63   may be auto-vac
ef00: 75 75 6d 20 63 61 70 61 62 6c 65 20 28 69 66 20  uum capable (if 
ef10: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
ef20: 56 41 43 55 55 4d 0a 20 20 2a 2a 20 69 73 20 6e  VACUUM.  ** is n
ef30: 6f 74 20 64 65 66 69 6e 65 64 29 2c 20 74 68 65  ot defined), the
ef40: 6e 20 69 74 20 69 73 20 69 6d 70 6f 72 74 61 6e  n it is importan
ef50: 74 20 74 6f 20 63 61 6c 6c 20 4f 50 5f 44 65 73  t to call OP_Des
ef60: 74 72 6f 79 20 6f 6e 20 74 68 65 0a 20 20 2a 2a  troy on the.  **
ef70: 20 74 61 62 6c 65 20 61 6e 64 20 69 6e 64 65 78   table and index
ef80: 20 72 6f 6f 74 2d 70 61 67 65 73 20 69 6e 20 6f   root-pages in o
ef90: 72 64 65 72 2c 20 73 74 61 72 74 69 6e 67 20 77  rder, starting w
efa0: 69 74 68 20 74 68 65 20 6e 75 6d 65 72 69 63 61  ith the numerica
efb0: 6c 6c 79 20 0a 20 20 2a 2a 20 6c 61 72 67 65 73  lly .  ** larges
efc0: 74 20 72 6f 6f 74 2d 70 61 67 65 20 6e 75 6d 62  t root-page numb
efd0: 65 72 2e 20 54 68 69 73 20 67 75 61 72 61 6e 74  er. This guarant
efe0: 65 65 73 20 74 68 61 74 20 6e 6f 6e 65 20 6f 66  ees that none of
eff0: 20 74 68 65 20 72 6f 6f 74 2d 70 61 67 65 73 0a   the root-pages.
f000: 20 20 2a 2a 20 74 6f 20 62 65 20 64 65 73 74 72    ** to be destr
f010: 6f 79 65 64 20 69 73 20 72 65 6c 6f 63 61 74 65  oyed is relocate
f020: 64 20 62 79 20 61 6e 20 65 61 72 6c 69 65 72 20  d by an earlier 
f030: 4f 50 5f 44 65 73 74 72 6f 79 2e 20 69 2e 65 2e  OP_Destroy. i.e.
f040: 20 69 66 20 74 68 65 0a 20 20 2a 2a 20 66 6f 6c   if the.  ** fol
f050: 6c 6f 77 69 6e 67 20 77 65 72 65 20 63 6f 64 65  lowing were code
f060: 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4f 50 5f  d:.  **.  ** OP_
f070: 44 65 73 74 72 6f 79 20 34 20 30 0a 20 20 2a 2a  Destroy 4 0.  **
f080: 20 2e 2e 2e 0a 20 20 2a 2a 20 4f 50 5f 44 65 73   ....  ** OP_Des
f090: 74 72 6f 79 20 35 20 30 0a 20 20 2a 2a 0a 20 20  troy 5 0.  **.  
f0a0: 2a 2a 20 61 6e 64 20 72 6f 6f 74 20 70 61 67 65  ** and root page
f0b0: 20 35 20 68 61 70 70 65 6e 65 64 20 74 6f 20 62   5 happened to b
f0c0: 65 20 74 68 65 20 6c 61 72 67 65 73 74 20 72 6f  e the largest ro
f0d0: 6f 74 2d 70 61 67 65 20 6e 75 6d 62 65 72 20 69  ot-page number i
f0e0: 6e 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62  n the.  ** datab
f0f0: 61 73 65 2c 20 74 68 65 6e 20 72 6f 6f 74 20 70  ase, then root p
f100: 61 67 65 20 35 20 77 6f 75 6c 64 20 62 65 20 6d  age 5 would be m
f110: 6f 76 65 64 20 74 6f 20 70 61 67 65 20 34 20 62  oved to page 4 b
f120: 79 20 74 68 65 20 0a 20 20 2a 2a 20 22 4f 50 5f  y the .  ** "OP_
f130: 44 65 73 74 72 6f 79 20 34 20 30 22 20 6f 70 63  Destroy 4 0" opc
f140: 6f 64 65 2e 20 54 68 65 20 73 75 62 73 65 71 75  ode. The subsequ
f150: 65 6e 74 20 22 4f 50 5f 44 65 73 74 72 6f 79 20  ent "OP_Destroy 
f160: 35 20 30 22 20 77 6f 75 6c 64 20 68 69 74 0a 20  5 0" would hit. 
f170: 20 2a 2a 20 61 20 66 72 65 65 2d 6c 69 73 74 20   ** a free-list 
f180: 70 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 6e 74  page..  */.  int
f190: 20 69 54 61 62 20 3d 20 70 54 61 62 2d 3e 74 6e   iTab = pTab->tn
f1a0: 75 6d 3b 0a 20 20 69 6e 74 20 69 44 65 73 74 72  um;.  int iDestr
f1b0: 6f 79 65 64 20 3d 20 30 3b 0a 0a 20 20 77 68 69  oyed = 0;..  whi
f1c0: 6c 65 28 20 31 20 29 7b 0a 20 20 20 20 49 6e 64  le( 1 ){.    Ind
f1d0: 65 78 20 2a 70 49 64 78 3b 0a 20 20 20 20 69 6e  ex *pIdx;.    in
f1e0: 74 20 69 4c 61 72 67 65 73 74 20 3d 20 30 3b 0a  t iLargest = 0;.
f1f0: 0a 20 20 20 20 69 66 28 20 69 44 65 73 74 72 6f  .    if( iDestro
f200: 79 65 64 3d 3d 30 20 7c 7c 20 69 54 61 62 3c 69  yed==0 || iTab<i
f210: 44 65 73 74 72 6f 79 65 64 20 29 7b 0a 20 20 20  Destroyed ){.   
f220: 20 20 20 69 4c 61 72 67 65 73 74 20 3d 20 69 54     iLargest = iT
f230: 61 62 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f  ab;.    }.    fo
f240: 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e  r(pIdx=pTab->pIn
f250: 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d  dex; pIdx; pIdx=
f260: 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  pIdx->pNext){.  
f270: 20 20 20 20 69 6e 74 20 69 49 64 78 20 3d 20 70      int iIdx = p
f280: 49 64 78 2d 3e 74 6e 75 6d 3b 0a 20 20 20 20 20  Idx->tnum;.     
f290: 20 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e 70   assert( pIdx->p
f2a0: 53 63 68 65 6d 61 3d 3d 70 54 61 62 2d 3e 70 53  Schema==pTab->pS
f2b0: 63 68 65 6d 61 20 29 3b 0a 20 20 20 20 20 20 69  chema );.      i
f2c0: 66 28 20 28 69 44 65 73 74 72 6f 79 65 64 3d 3d  f( (iDestroyed==
f2d0: 30 20 7c 7c 20 28 69 49 64 78 3c 69 44 65 73 74  0 || (iIdx<iDest
f2e0: 72 6f 79 65 64 29 29 20 26 26 20 69 49 64 78 3e  royed)) && iIdx>
f2f0: 69 4c 61 72 67 65 73 74 20 29 7b 0a 20 20 20 20  iLargest ){.    
f300: 20 20 20 20 69 4c 61 72 67 65 73 74 20 3d 20 69      iLargest = i
f310: 49 64 78 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  Idx;.      }.   
f320: 20 7d 0a 20 20 20 20 69 66 28 20 69 4c 61 72 67   }.    if( iLarg
f330: 65 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  est==0 ){.      
f340: 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 65 6c 73  return;.    }els
f350: 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 44 62  e{.      int iDb
f360: 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61   = sqlite3Schema
f370: 54 6f 49 6e 64 65 78 28 70 50 61 72 73 65 2d 3e  ToIndex(pParse->
f380: 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d  db, pTab->pSchem
f390: 61 29 3b 0a 20 20 20 20 20 20 64 65 73 74 72 6f  a);.      destro
f3a0: 79 52 6f 6f 74 50 61 67 65 28 70 50 61 72 73 65  yRootPage(pParse
f3b0: 2c 20 69 4c 61 72 67 65 73 74 2c 20 69 44 62 29  , iLargest, iDb)
f3c0: 3b 0a 20 20 20 20 20 20 69 44 65 73 74 72 6f 79  ;.      iDestroy
f3d0: 65 64 20 3d 20 69 4c 61 72 67 65 73 74 3b 0a 20  ed = iLargest;. 
f3e0: 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
f3f0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
f400: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
f410: 74 6f 20 64 6f 20 74 68 65 20 77 6f 72 6b 20 6f  to do the work o
f420: 66 20 61 20 44 52 4f 50 20 54 41 42 4c 45 20 73  f a DROP TABLE s
f430: 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 70 4e 61  tatement..** pNa
f440: 6d 65 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f  me is the name o
f450: 66 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20 62  f the table to b
f460: 65 20 64 72 6f 70 70 65 64 2e 0a 2a 2f 0a 76 6f  e dropped..*/.vo
f470: 69 64 20 73 71 6c 69 74 65 33 44 72 6f 70 54 61  id sqlite3DropTa
f480: 62 6c 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  ble(Parse *pPars
f490: 65 2c 20 53 72 63 4c 69 73 74 20 2a 70 4e 61 6d  e, SrcList *pNam
f4a0: 65 2c 20 69 6e 74 20 69 73 56 69 65 77 2c 20 69  e, int isView, i
f4b0: 6e 74 20 6e 6f 45 72 72 29 7b 0a 20 20 54 61 62  nt noErr){.  Tab
f4c0: 6c 65 20 2a 70 54 61 62 3b 0a 20 20 56 64 62 65  le *pTab;.  Vdbe
f4d0: 20 2a 76 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a   *v;.  sqlite3 *
f4e0: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
f4f0: 0a 20 20 69 6e 74 20 69 44 62 3b 0a 0a 20 20 69  .  int iDb;..  i
f500: 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20  f( pParse->nErr 
f510: 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  || db->mallocFai
f520: 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  led ){.    goto 
f530: 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b  exit_drop_table;
f540: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
f550: 4e 61 6d 65 2d 3e 6e 53 72 63 3d 3d 31 20 29 3b  Name->nSrc==1 );
f560: 0a 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65  .  pTab = sqlite
f570: 33 4c 6f 63 61 74 65 54 61 62 6c 65 28 70 50 61  3LocateTable(pPa
f580: 72 73 65 2c 20 69 73 56 69 65 77 2c 20 0a 20 20  rse, isView, .  
f590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f5a0: 20 20 20 20 20 20 20 20 20 20 70 4e 61 6d 65 2d            pName-
f5b0: 3e 61 5b 30 5d 2e 7a 4e 61 6d 65 2c 20 70 4e 61  >a[0].zName, pNa
f5c0: 6d 65 2d 3e 61 5b 30 5d 2e 7a 44 61 74 61 62 61  me->a[0].zDataba
f5d0: 73 65 29 3b 0a 0a 20 20 69 66 28 20 70 54 61 62  se);..  if( pTab
f5e0: 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 6e  ==0 ){.    if( n
f5f0: 6f 45 72 72 20 29 7b 0a 20 20 20 20 20 20 73 71  oErr ){.      sq
f600: 6c 69 74 65 33 45 72 72 6f 72 43 6c 65 61 72 28  lite3ErrorClear(
f610: 70 50 61 72 73 65 29 3b 0a 20 20 20 20 7d 0a 20  pParse);.    }. 
f620: 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f     goto exit_dro
f630: 70 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 20 20 69  p_table;.  }.  i
f640: 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65  Db = sqlite3Sche
f650: 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 54  maToIndex(db, pT
f660: 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20  ab->pSchema);.  
f670: 61 73 73 65 72 74 28 20 69 44 62 3e 3d 30 20 26  assert( iDb>=0 &
f680: 26 20 69 44 62 3c 64 62 2d 3e 6e 44 62 20 29 3b  & iDb<db->nDb );
f690: 0a 0a 20 20 2f 2a 20 49 66 20 70 54 61 62 20 69  ..  /* If pTab i
f6a0: 73 20 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c  s a virtual tabl
f6b0: 65 2c 20 63 61 6c 6c 20 56 69 65 77 47 65 74 43  e, call ViewGetC
f6c0: 6f 6c 75 6d 6e 4e 61 6d 65 73 28 29 20 74 6f 20  olumnNames() to 
f6d0: 65 6e 73 75 72 65 0a 20 20 2a 2a 20 69 74 20 69  ensure.  ** it i
f6e0: 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 0a 20  s initialized.. 
f6f0: 20 2a 2f 0a 20 20 69 66 28 20 49 73 56 69 72 74   */.  if( IsVirt
f700: 75 61 6c 28 70 54 61 62 29 20 26 26 20 73 71 6c  ual(pTab) && sql
f710: 69 74 65 33 56 69 65 77 47 65 74 43 6f 6c 75 6d  ite3ViewGetColum
f720: 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20 70  nNames(pParse, p
f730: 54 61 62 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f  Tab) ){.    goto
f740: 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65   exit_drop_table
f750: 3b 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51  ;.  }.#ifndef SQ
f760: 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52  LITE_OMIT_AUTHOR
f770: 49 5a 41 54 49 4f 4e 0a 20 20 7b 0a 20 20 20 20  IZATION.  {.    
f780: 69 6e 74 20 63 6f 64 65 3b 0a 20 20 20 20 63 6f  int code;.    co
f790: 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62 20 3d  nst char *zTab =
f7a0: 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 44   SCHEMA_TABLE(iD
f7b0: 62 29 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  b);.    const ch
f7c0: 61 72 20 2a 7a 44 62 20 3d 20 64 62 2d 3e 61 44  ar *zDb = db->aD
f7d0: 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20  b[iDb].zName;.  
f7e0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41    const char *zA
f7f0: 72 67 32 20 3d 20 30 3b 0a 20 20 20 20 69 66 28  rg2 = 0;.    if(
f800: 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63   sqlite3AuthChec
f810: 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45  k(pParse, SQLITE
f820: 5f 44 45 4c 45 54 45 2c 20 7a 54 61 62 2c 20 30  _DELETE, zTab, 0
f830: 2c 20 7a 44 62 29 29 7b 0a 20 20 20 20 20 20 67  , zDb)){.      g
f840: 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61  oto exit_drop_ta
f850: 62 6c 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ble;.    }.    i
f860: 66 28 20 69 73 56 69 65 77 20 29 7b 0a 20 20 20  f( isView ){.   
f870: 20 20 20 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d     if( !OMIT_TEM
f880: 50 44 42 20 26 26 20 69 44 62 3d 3d 31 20 29 7b  PDB && iDb==1 ){
f890: 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20 3d 20  .        code = 
f8a0: 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50  SQLITE_DROP_TEMP
f8b0: 5f 56 49 45 57 3b 0a 20 20 20 20 20 20 7d 65 6c  _VIEW;.      }el
f8c0: 73 65 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65  se{.        code
f8d0: 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 56   = SQLITE_DROP_V
f8e0: 49 45 57 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66  IEW;.      }.#if
f8f0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
f900: 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20  _VIRTUALTABLE.  
f910: 20 20 7d 65 6c 73 65 20 69 66 28 20 49 73 56 69    }else if( IsVi
f920: 72 74 75 61 6c 28 70 54 61 62 29 20 29 7b 0a 20  rtual(pTab) ){. 
f930: 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49       code = SQLI
f940: 54 45 5f 44 52 4f 50 5f 56 54 41 42 4c 45 3b 0a  TE_DROP_VTABLE;.
f950: 20 20 20 20 20 20 7a 41 72 67 32 20 3d 20 70 54        zArg2 = pT
f960: 61 62 2d 3e 70 4d 6f 64 2d 3e 7a 4e 61 6d 65 3b  ab->pMod->zName;
f970: 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c 73  .#endif.    }els
f980: 65 7b 0a 20 20 20 20 20 20 69 66 28 20 21 4f 4d  e{.      if( !OM
f990: 49 54 5f 54 45 4d 50 44 42 20 26 26 20 69 44 62  IT_TEMPDB && iDb
f9a0: 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 63  ==1 ){.        c
f9b0: 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f  ode = SQLITE_DRO
f9c0: 50 5f 54 45 4d 50 5f 54 41 42 4c 45 3b 0a 20 20  P_TEMP_TABLE;.  
f9d0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
f9e0: 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45     code = SQLITE
f9f0: 5f 44 52 4f 50 5f 54 41 42 4c 45 3b 0a 20 20 20  _DROP_TABLE;.   
fa00: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
fa10: 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68  f( sqlite3AuthCh
fa20: 65 63 6b 28 70 50 61 72 73 65 2c 20 63 6f 64 65  eck(pParse, code
fa30: 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a  , pTab->zName, z
fa40: 41 72 67 32 2c 20 7a 44 62 29 20 29 7b 0a 20 20  Arg2, zDb) ){.  
fa50: 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72      goto exit_dr
fa60: 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 20 20 7d 0a  op_table;.    }.
fa70: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 41      if( sqlite3A
fa80: 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c  uthCheck(pParse,
fa90: 20 53 51 4c 49 54 45 5f 44 45 4c 45 54 45 2c 20   SQLITE_DELETE, 
faa0: 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 30 2c 20  pTab->zName, 0, 
fab0: 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f  zDb) ){.      go
fac0: 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62  to exit_drop_tab
fad0: 6c 65 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65  le;.    }.  }.#e
fae0: 6e 64 69 66 0a 20 20 69 66 28 20 73 71 6c 69 74  ndif.  if( sqlit
faf0: 65 33 53 74 72 4e 49 43 6d 70 28 70 54 61 62 2d  e3StrNICmp(pTab-
fb00: 3e 7a 4e 61 6d 65 2c 20 22 73 71 6c 69 74 65 5f  >zName, "sqlite_
fb10: 22 2c 20 37 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ", 7)==0 ){.    
fb20: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
fb30: 70 50 61 72 73 65 2c 20 22 74 61 62 6c 65 20 25  pParse, "table %
fb40: 73 20 6d 61 79 20 6e 6f 74 20 62 65 20 64 72 6f  s may not be dro
fb50: 70 70 65 64 22 2c 20 70 54 61 62 2d 3e 7a 4e 61  pped", pTab->zNa
fb60: 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78  me);.    goto ex
fb70: 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20  it_drop_table;. 
fb80: 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   }..#ifndef SQLI
fb90: 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 20 20 2f  TE_OMIT_VIEW.  /
fba0: 2a 20 45 6e 73 75 72 65 20 44 52 4f 50 20 54 41  * Ensure DROP TA
fbb0: 42 4c 45 20 69 73 20 6e 6f 74 20 75 73 65 64 20  BLE is not used 
fbc0: 6f 6e 20 61 20 76 69 65 77 2c 20 61 6e 64 20 44  on a view, and D
fbd0: 52 4f 50 20 56 49 45 57 20 69 73 20 6e 6f 74 20  ROP VIEW is not 
fbe0: 75 73 65 64 0a 20 20 2a 2a 20 6f 6e 20 61 20 74  used.  ** on a t
fbf0: 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  able..  */.  if(
fc00: 20 69 73 56 69 65 77 20 26 26 20 70 54 61 62 2d   isView && pTab-
fc10: 3e 70 53 65 6c 65 63 74 3d 3d 30 20 29 7b 0a 20  >pSelect==0 ){. 
fc20: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
fc30: 73 67 28 70 50 61 72 73 65 2c 20 22 75 73 65 20  sg(pParse, "use 
fc40: 44 52 4f 50 20 54 41 42 4c 45 20 74 6f 20 64 65  DROP TABLE to de
fc50: 6c 65 74 65 20 74 61 62 6c 65 20 25 73 22 2c 20  lete table %s", 
fc60: 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pTab->zName);.  
fc70: 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70    goto exit_drop
fc80: 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 20 20 69 66  _table;.  }.  if
fc90: 28 20 21 69 73 56 69 65 77 20 26 26 20 70 54 61  ( !isView && pTa
fca0: 62 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20  b->pSelect ){.  
fcb0: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
fcc0: 67 28 70 50 61 72 73 65 2c 20 22 75 73 65 20 44  g(pParse, "use D
fcd0: 52 4f 50 20 56 49 45 57 20 74 6f 20 64 65 6c 65  ROP VIEW to dele
fce0: 74 65 20 76 69 65 77 20 25 73 22 2c 20 70 54 61  te view %s", pTa
fcf0: 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 67  b->zName);.    g
fd00: 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61  oto exit_drop_ta
fd10: 62 6c 65 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  ble;.  }.#endif.
fd20: 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63  .  /* Generate c
fd30: 6f 64 65 20 74 6f 20 72 65 6d 6f 76 65 20 74 68  ode to remove th
fd40: 65 20 74 61 62 6c 65 20 66 72 6f 6d 20 74 68 65  e table from the
fd50: 20 6d 61 73 74 65 72 20 74 61 62 6c 65 0a 20 20   master table.  
fd60: 2a 2a 20 6f 6e 20 64 69 73 6b 2e 0a 20 20 2a 2f  ** on disk..  */
fd70: 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65  .  v = sqlite3Ge
fd80: 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
fd90: 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20 54 72   if( v ){.    Tr
fda0: 69 67 67 65 72 20 2a 70 54 72 69 67 67 65 72 3b  igger *pTrigger;
fdb0: 0a 20 20 20 20 44 62 20 2a 70 44 62 20 3d 20 26  .    Db *pDb = &
fdc0: 64 62 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a 20 20  db->aDb[iDb];.  
fdd0: 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72    sqlite3BeginWr
fde0: 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61  iteOperation(pPa
fdf0: 72 73 65 2c 20 31 2c 20 69 44 62 29 3b 0a 0a 23  rse, 1, iDb);..#
fe00: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
fe10: 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
fe20: 20 20 20 20 69 66 28 20 49 73 56 69 72 74 75 61      if( IsVirtua
fe30: 6c 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20  l(pTab) ){.     
fe40: 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74   Vdbe *v = sqlit
fe50: 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
fe60: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 76 20 29  );.      if( v )
fe70: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
fe80: 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f  3VdbeAddOp0(v, O
fe90: 50 5f 56 42 65 67 69 6e 29 3b 0a 20 20 20 20 20  P_VBegin);.     
fea0: 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a   }.    }.#endif.
feb0: 0a 20 20 20 20 2f 2a 20 44 72 6f 70 20 61 6c 6c  .    /* Drop all
fec0: 20 74 72 69 67 67 65 72 73 20 61 73 73 6f 63 69   triggers associ
fed0: 61 74 65 64 20 77 69 74 68 20 74 68 65 20 74 61  ated with the ta
fee0: 62 6c 65 20 62 65 69 6e 67 20 64 72 6f 70 70 65  ble being droppe
fef0: 64 2e 20 43 6f 64 65 0a 20 20 20 20 2a 2a 20 69  d. Code.    ** i
ff00: 73 20 67 65 6e 65 72 61 74 65 64 20 74 6f 20 72  s generated to r
ff10: 65 6d 6f 76 65 20 65 6e 74 72 69 65 73 20 66 72  emove entries fr
ff20: 6f 6d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  om sqlite_master
ff30: 20 61 6e 64 2f 6f 72 0a 20 20 20 20 2a 2a 20 73   and/or.    ** s
ff40: 71 6c 69 74 65 5f 74 65 6d 70 5f 6d 61 73 74 65  qlite_temp_maste
ff50: 72 20 69 66 20 72 65 71 75 69 72 65 64 2e 0a 20  r if required.. 
ff60: 20 20 20 2a 2f 0a 20 20 20 20 70 54 72 69 67 67     */.    pTrigg
ff70: 65 72 20 3d 20 70 54 61 62 2d 3e 70 54 72 69 67  er = pTab->pTrig
ff80: 67 65 72 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  ger;.    while( 
ff90: 70 54 72 69 67 67 65 72 20 29 7b 0a 20 20 20 20  pTrigger ){.    
ffa0: 20 20 61 73 73 65 72 74 28 20 70 54 72 69 67 67    assert( pTrigg
ffb0: 65 72 2d 3e 70 53 63 68 65 6d 61 3d 3d 70 54 61  er->pSchema==pTa
ffc0: 62 2d 3e 70 53 63 68 65 6d 61 20 7c 7c 20 0a 20  b->pSchema || . 
ffd0: 20 20 20 20 20 20 20 20 20 70 54 72 69 67 67 65           pTrigge
ffe0: 72 2d 3e 70 53 63 68 65 6d 61 3d 3d 64 62 2d 3e  r->pSchema==db->
fff0: 61 44 62 5b 31 5d 2e 70 53 63 68 65 6d 61 20 29  aDb[1].pSchema )
10000 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  ;.      sqlite3D
10010 72 6f 70 54 72 69 67 67 65 72 50 74 72 28 70 50  ropTriggerPtr(pP
10020 61 72 73 65 2c 20 70 54 72 69 67 67 65 72 29 3b  arse, pTrigger);
10030 0a 20 20 20 20 20 20 70 54 72 69 67 67 65 72 20  .      pTrigger 
10040 3d 20 70 54 72 69 67 67 65 72 2d 3e 70 4e 65 78  = pTrigger->pNex
10050 74 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 6e 64 65  t;.    }..#ifnde
10060 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
10070 54 4f 49 4e 43 52 45 4d 45 4e 54 0a 20 20 20 20  TOINCREMENT.    
10080 2f 2a 20 52 65 6d 6f 76 65 20 61 6e 79 20 65 6e  /* Remove any en
10090 74 72 69 65 73 20 6f 66 20 74 68 65 20 73 71 6c  tries of the sql
100a0 69 74 65 5f 73 65 71 75 65 6e 63 65 20 74 61 62  ite_sequence tab
100b0 6c 65 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  le associated wi
100c0 74 68 0a 20 20 20 20 2a 2a 20 74 68 65 20 74 61  th.    ** the ta
100d0 62 6c 65 20 62 65 69 6e 67 20 64 72 6f 70 70 65  ble being droppe
100e0 64 2e 20 54 68 69 73 20 69 73 20 64 6f 6e 65 20  d. This is done 
100f0 62 65 66 6f 72 65 20 74 68 65 20 74 61 62 6c 65  before the table
10100 20 69 73 20 64 72 6f 70 70 65 64 0a 20 20 20 20   is dropped.    
10110 2a 2a 20 61 74 20 74 68 65 20 62 74 72 65 65 20  ** at the btree 
10120 6c 65 76 65 6c 2c 20 69 6e 20 63 61 73 65 20 74  level, in case t
10130 68 65 20 73 71 6c 69 74 65 5f 73 65 71 75 65 6e  he sqlite_sequen
10140 63 65 20 74 61 62 6c 65 20 6e 65 65 64 73 20 74  ce table needs t
10150 6f 0a 20 20 20 20 2a 2a 20 6d 6f 76 65 20 61 73  o.    ** move as
10160 20 61 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65   a result of the
10170 20 64 72 6f 70 20 28 63 61 6e 20 68 61 70 70 65   drop (can happe
10180 6e 20 69 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d  n in auto-vacuum
10190 20 6d 6f 64 65 29 2e 0a 20 20 20 20 2a 2f 0a 20   mode)..    */. 
101a0 20 20 20 69 66 28 20 70 54 61 62 2d 3e 74 61 62     if( pTab->tab
101b0 46 6c 61 67 73 20 26 20 54 46 5f 41 75 74 6f 69  Flags & TF_Autoi
101c0 6e 63 72 65 6d 65 6e 74 20 29 7b 0a 20 20 20 20  ncrement ){.    
101d0 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50    sqlite3NestedP
101e0 61 72 73 65 28 70 50 61 72 73 65 2c 0a 20 20 20  arse(pParse,.   
101f0 20 20 20 20 20 22 44 45 4c 45 54 45 20 46 52 4f       "DELETE FRO
10200 4d 20 25 73 2e 73 71 6c 69 74 65 5f 73 65 71 75  M %s.sqlite_sequ
10210 65 6e 63 65 20 57 48 45 52 45 20 6e 61 6d 65 3d  ence WHERE name=
10220 25 51 22 2c 0a 20 20 20 20 20 20 20 20 70 44 62  %Q",.        pDb
10230 2d 3e 7a 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 7a  ->zName, pTab->z
10240 4e 61 6d 65 0a 20 20 20 20 20 20 29 3b 0a 20 20  Name.      );.  
10250 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20    }.#endif..    
10260 2f 2a 20 44 72 6f 70 20 61 6c 6c 20 53 51 4c 49  /* Drop all SQLI
10270 54 45 5f 4d 41 53 54 45 52 20 74 61 62 6c 65 20  TE_MASTER table 
10280 61 6e 64 20 69 6e 64 65 78 20 65 6e 74 72 69 65  and index entrie
10290 73 20 74 68 61 74 20 72 65 66 65 72 20 74 6f 20  s that refer to 
102a0 74 68 65 0a 20 20 20 20 2a 2a 20 74 61 62 6c 65  the.    ** table
102b0 2e 20 54 68 65 20 70 72 6f 67 72 61 6d 20 6e 61  . The program na
102c0 6d 65 20 6c 6f 6f 70 73 20 74 68 72 6f 75 67 68  me loops through
102d0 20 74 68 65 20 6d 61 73 74 65 72 20 74 61 62 6c   the master tabl
102e0 65 20 61 6e 64 20 64 65 6c 65 74 65 73 0a 20 20  e and deletes.  
102f0 20 20 2a 2a 20 65 76 65 72 79 20 72 6f 77 20 74    ** every row t
10300 68 61 74 20 72 65 66 65 72 73 20 74 6f 20 61 20  hat refers to a 
10310 74 61 62 6c 65 20 6f 66 20 74 68 65 20 73 61 6d  table of the sam
10320 65 20 6e 61 6d 65 20 61 73 20 74 68 65 20 6f 6e  e name as the on
10330 65 20 62 65 69 6e 67 0a 20 20 20 20 2a 2a 20 64  e being.    ** d
10340 72 6f 70 70 65 64 2e 20 54 72 69 67 67 65 72 73  ropped. Triggers
10350 20 61 72 65 20 68 61 6e 64 6c 65 64 20 73 65 70   are handled sep
10360 65 72 61 74 65 6c 79 20 62 65 63 61 75 73 65 20  erately because 
10370 61 20 74 72 69 67 67 65 72 20 63 61 6e 20 62 65  a trigger can be
10380 0a 20 20 20 20 2a 2a 20 63 72 65 61 74 65 64 20  .    ** created 
10390 69 6e 20 74 68 65 20 74 65 6d 70 20 64 61 74 61  in the temp data
103a0 62 61 73 65 20 74 68 61 74 20 72 65 66 65 72 73  base that refers
103b0 20 74 6f 20 61 20 74 61 62 6c 65 20 69 6e 20 61   to a table in a
103c0 6e 6f 74 68 65 72 0a 20 20 20 20 2a 2a 20 64 61  nother.    ** da
103d0 74 61 62 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20  tabase..    */. 
103e0 20 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64     sqlite3Nested
103f0 50 61 72 73 65 28 70 50 61 72 73 65 2c 20 0a 20  Parse(pParse, . 
10400 20 20 20 20 20 20 20 22 44 45 4c 45 54 45 20 46         "DELETE F
10410 52 4f 4d 20 25 51 2e 25 73 20 57 48 45 52 45 20  ROM %Q.%s WHERE 
10420 74 62 6c 5f 6e 61 6d 65 3d 25 51 20 61 6e 64 20  tbl_name=%Q and 
10430 74 79 70 65 21 3d 27 74 72 69 67 67 65 72 27 22  type!='trigger'"
10440 2c 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a  ,.        pDb->z
10450 4e 61 6d 65 2c 20 53 43 48 45 4d 41 5f 54 41 42  Name, SCHEMA_TAB
10460 4c 45 28 69 44 62 29 2c 20 70 54 61 62 2d 3e 7a  LE(iDb), pTab->z
10470 4e 61 6d 65 29 3b 0a 0a 20 20 20 20 2f 2a 20 44  Name);..    /* D
10480 72 6f 70 20 61 6e 79 20 73 74 61 74 69 73 74 69  rop any statisti
10490 63 73 20 66 72 6f 6d 20 74 68 65 20 73 71 6c 69  cs from the sqli
104a0 74 65 5f 73 74 61 74 31 20 74 61 62 6c 65 2c 20  te_stat1 table, 
104b0 69 66 20 69 74 20 65 78 69 73 74 73 20 2a 2f 0a  if it exists */.
104c0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 46      if( sqlite3F
104d0 69 6e 64 54 61 62 6c 65 28 64 62 2c 20 22 73 71  indTable(db, "sq
104e0 6c 69 74 65 5f 73 74 61 74 31 22 2c 20 64 62 2d  lite_stat1", db-
104f0 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 29  >aDb[iDb].zName)
10500 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
10510 33 4e 65 73 74 65 64 50 61 72 73 65 28 70 50 61  3NestedParse(pPa
10520 72 73 65 2c 0a 20 20 20 20 20 20 20 20 22 44 45  rse,.        "DE
10530 4c 45 54 45 20 46 52 4f 4d 20 25 51 2e 73 71 6c  LETE FROM %Q.sql
10540 69 74 65 5f 73 74 61 74 31 20 57 48 45 52 45 20  ite_stat1 WHERE 
10550 74 62 6c 3d 25 51 22 2c 20 70 44 62 2d 3e 7a 4e  tbl=%Q", pDb->zN
10560 61 6d 65 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  ame, pTab->zName
10570 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a  .      );.    }.
10580 0a 20 20 20 20 69 66 28 20 21 69 73 56 69 65 77  .    if( !isView
10590 20 26 26 20 21 49 73 56 69 72 74 75 61 6c 28 70   && !IsVirtual(p
105a0 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20 64 65  Tab) ){.      de
105b0 73 74 72 6f 79 54 61 62 6c 65 28 70 50 61 72 73  stroyTable(pPars
105c0 65 2c 20 70 54 61 62 29 3b 0a 20 20 20 20 7d 0a  e, pTab);.    }.
105d0 0a 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74  .    /* Remove t
105e0 68 65 20 74 61 62 6c 65 20 65 6e 74 72 79 20 66  he table entry f
105f0 72 6f 6d 20 53 51 4c 69 74 65 27 73 20 69 6e 74  rom SQLite's int
10600 65 72 6e 61 6c 20 73 63 68 65 6d 61 20 61 6e 64  ernal schema and
10610 20 6d 6f 64 69 66 79 0a 20 20 20 20 2a 2a 20 74   modify.    ** t
10620 68 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65  he schema cookie
10630 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
10640 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29   IsVirtual(pTab)
10650 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
10660 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
10670 50 5f 56 44 65 73 74 72 6f 79 2c 20 69 44 62 2c  P_VDestroy, iDb,
10680 20 30 2c 20 30 2c 20 70 54 61 62 2d 3e 7a 4e 61   0, 0, pTab->zNa
10690 6d 65 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20  me, 0);.    }.  
106a0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
106b0 4f 70 34 28 76 2c 20 4f 50 5f 44 72 6f 70 54 61  Op4(v, OP_DropTa
106c0 62 6c 65 2c 20 69 44 62 2c 20 30 2c 20 30 2c 20  ble, iDb, 0, 0, 
106d0 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b  pTab->zName, 0);
106e0 0a 20 20 20 20 73 71 6c 69 74 65 33 43 68 61 6e  .    sqlite3Chan
106f0 67 65 43 6f 6f 6b 69 65 28 70 50 61 72 73 65 2c  geCookie(pParse,
10700 20 69 44 62 29 3b 0a 20 20 7d 0a 20 20 73 71 6c   iDb);.  }.  sql
10710 69 74 65 56 69 65 77 52 65 73 65 74 41 6c 6c 28  iteViewResetAll(
10720 64 62 2c 20 69 44 62 29 3b 0a 0a 65 78 69 74 5f  db, iDb);..exit_
10730 64 72 6f 70 5f 74 61 62 6c 65 3a 0a 20 20 73 71  drop_table:.  sq
10740 6c 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65  lite3SrcListDele
10750 74 65 28 64 62 2c 20 70 4e 61 6d 65 29 3b 0a 7d  te(db, pName);.}
10760 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
10770 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74  tine is called t
10780 6f 20 63 72 65 61 74 65 20 61 20 6e 65 77 20 66  o create a new f
10790 6f 72 65 69 67 6e 20 6b 65 79 20 6f 6e 20 74 68  oreign key on th
107a0 65 20 74 61 62 6c 65 0a 2a 2a 20 63 75 72 72 65  e table.** curre
107b0 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74  ntly under const
107c0 72 75 63 74 69 6f 6e 2e 20 20 70 46 72 6f 6d 43  ruction.  pFromC
107d0 6f 6c 20 64 65 74 65 72 6d 69 6e 65 73 20 77 68  ol determines wh
107e0 69 63 68 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 69  ich columns.** i
107f0 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 61  n the current ta
10800 62 6c 65 20 70 6f 69 6e 74 20 74 6f 20 74 68 65  ble point to the
10810 20 66 6f 72 65 69 67 6e 20 6b 65 79 2e 20 20 49   foreign key.  I
10820 66 20 70 46 72 6f 6d 43 6f 6c 3d 3d 30 20 74 68  f pFromCol==0 th
10830 65 6e 0a 2a 2a 20 63 6f 6e 6e 65 63 74 20 74 68  en.** connect th
10840 65 20 6b 65 79 20 74 6f 20 74 68 65 20 6c 61 73  e key to the las
10850 74 20 63 6f 6c 75 6d 6e 20 69 6e 73 65 72 74 65  t column inserte
10860 64 2e 20 20 70 54 6f 20 69 73 20 74 68 65 20 6e  d.  pTo is the n
10870 61 6d 65 20 6f 66 0a 2a 2a 20 74 68 65 20 74 61  ame of.** the ta
10880 62 6c 65 20 72 65 66 65 72 72 65 64 20 74 6f 2e  ble referred to.
10890 20 20 70 54 6f 43 6f 6c 20 69 73 20 61 20 6c 69    pToCol is a li
108a0 73 74 20 6f 66 20 74 61 62 6c 65 73 20 69 6e 20  st of tables in 
108b0 74 68 65 20 6f 74 68 65 72 0a 2a 2a 20 70 54 6f  the other.** pTo
108c0 20 74 61 62 6c 65 20 74 68 61 74 20 74 68 65 20   table that the 
108d0 66 6f 72 65 69 67 6e 20 6b 65 79 20 70 6f 69 6e  foreign key poin
108e0 74 73 20 74 6f 2e 20 20 66 6c 61 67 73 20 63 6f  ts to.  flags co
108f0 6e 74 61 69 6e 73 20 61 6c 6c 0a 2a 2a 20 69 6e  ntains all.** in
10900 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20  formation about 
10910 74 68 65 20 63 6f 6e 66 6c 69 63 74 20 72 65 73  the conflict res
10920 6f 6c 75 74 69 6f 6e 20 61 6c 67 6f 72 69 74 68  olution algorith
10930 6d 73 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20  ms specified.** 
10940 69 6e 20 74 68 65 20 4f 4e 20 44 45 4c 45 54 45  in the ON DELETE
10950 2c 20 4f 4e 20 55 50 44 41 54 45 20 61 6e 64 20  , ON UPDATE and 
10960 4f 4e 20 49 4e 53 45 52 54 20 63 6c 61 75 73 65  ON INSERT clause
10970 73 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 46 4b 65 79  s..**.** An FKey
10980 20 73 74 72 75 63 74 75 72 65 20 69 73 20 63 72   structure is cr
10990 65 61 74 65 64 20 61 6e 64 20 61 64 64 65 64 20  eated and added 
109a0 74 6f 20 74 68 65 20 74 61 62 6c 65 20 63 75 72  to the table cur
109b0 72 65 6e 74 6c 79 0a 2a 2a 20 75 6e 64 65 72 20  rently.** under 
109c0 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 69 6e 20  construction in 
109d0 74 68 65 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  the pParse->pNew
109e0 54 61 62 6c 65 20 66 69 65 6c 64 2e 20 20 54 68  Table field.  Th
109f0 65 20 6e 65 77 20 46 4b 65 79 0a 2a 2a 20 69 73  e new FKey.** is
10a00 20 6e 6f 74 20 6c 69 6e 6b 65 64 20 69 6e 74 6f   not linked into
10a10 20 64 62 2d 3e 61 46 4b 65 79 20 61 74 20 74 68   db->aFKey at th
10a20 69 73 20 70 6f 69 6e 74 20 2d 20 74 68 61 74 20  is point - that 
10a30 64 6f 65 73 20 6e 6f 74 20 68 61 70 70 65 6e 0a  does not happen.
10a40 2a 2a 20 75 6e 74 69 6c 20 73 71 6c 69 74 65 33  ** until sqlite3
10a50 45 6e 64 54 61 62 6c 65 28 29 2e 0a 2a 2a 0a 2a  EndTable()..**.*
10a60 2a 20 54 68 65 20 66 6f 72 65 69 67 6e 20 6b 65  * The foreign ke
10a70 79 20 69 73 20 73 65 74 20 66 6f 72 20 49 4d 4d  y is set for IMM
10a80 45 44 49 41 54 45 20 70 72 6f 63 65 73 73 69 6e  EDIATE processin
10a90 67 2e 20 20 41 20 73 75 62 73 65 71 75 65 6e 74  g.  A subsequent
10aa0 20 63 61 6c 6c 0a 2a 2a 20 74 6f 20 73 71 6c 69   call.** to sqli
10ab0 74 65 33 44 65 66 65 72 46 6f 72 65 69 67 6e 4b  te3DeferForeignK
10ac0 65 79 28 29 20 6d 69 67 68 74 20 63 68 61 6e 67  ey() might chang
10ad0 65 20 74 68 69 73 20 74 6f 20 44 45 46 45 52 52  e this to DEFERR
10ae0 45 44 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ED..*/.void sqli
10af0 74 65 33 43 72 65 61 74 65 46 6f 72 65 69 67 6e  te3CreateForeign
10b00 4b 65 79 28 0a 20 20 50 61 72 73 65 20 2a 70 50  Key(.  Parse *pP
10b10 61 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 50  arse,       /* P
10b20 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
10b30 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 46  /.  ExprList *pF
10b40 72 6f 6d 43 6f 6c 2c 20 20 2f 2a 20 43 6f 6c 75  romCol,  /* Colu
10b50 6d 6e 73 20 69 6e 20 74 68 69 73 20 74 61 62 6c  mns in this tabl
10b60 65 20 74 68 61 74 20 70 6f 69 6e 74 20 74 6f 20  e that point to 
10b70 6f 74 68 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20  other table */. 
10b80 20 54 6f 6b 65 6e 20 2a 70 54 6f 2c 20 20 20 20   Token *pTo,    
10b90 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
10ba0 20 74 68 65 20 6f 74 68 65 72 20 74 61 62 6c 65   the other table
10bb0 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
10bc0 70 54 6f 43 6f 6c 2c 20 20 20 20 2f 2a 20 43 6f  pToCol,    /* Co
10bd0 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 6f 74 68  lumns in the oth
10be0 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e  er table */.  in
10bf0 74 20 66 6c 61 67 73 20 20 20 20 20 20 20 20 20  t flags         
10c00 20 20 20 2f 2a 20 43 6f 6e 66 6c 69 63 74 20 72     /* Conflict r
10c10 65 73 6f 6c 75 74 69 6f 6e 20 61 6c 67 6f 72 69  esolution algori
10c20 74 68 6d 73 2e 20 2a 2f 0a 29 7b 0a 20 20 73 71  thms. */.){.  sq
10c30 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
10c40 73 65 2d 3e 64 62 3b 0a 23 69 66 6e 64 65 66 20  se->db;.#ifndef 
10c50 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45  SQLITE_OMIT_FORE
10c60 49 47 4e 5f 4b 45 59 0a 20 20 46 4b 65 79 20 2a  IGN_KEY.  FKey *
10c70 70 46 4b 65 79 20 3d 20 30 3b 0a 20 20 54 61 62  pFKey = 0;.  Tab
10c80 6c 65 20 2a 70 20 3d 20 70 50 61 72 73 65 2d 3e  le *p = pParse->
10c90 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 69 6e 74  pNewTable;.  int
10ca0 20 6e 42 79 74 65 3b 0a 20 20 69 6e 74 20 69 3b   nByte;.  int i;
10cb0 0a 20 20 69 6e 74 20 6e 43 6f 6c 3b 0a 20 20 63  .  int nCol;.  c
10cc0 68 61 72 20 2a 7a 3b 0a 0a 20 20 61 73 73 65 72  har *z;..  asser
10cd0 74 28 20 70 54 6f 21 3d 30 20 29 3b 0a 20 20 69  t( pTo!=0 );.  i
10ce0 66 28 20 70 3d 3d 30 20 7c 7c 20 70 50 61 72 73  f( p==0 || pPars
10cf0 65 2d 3e 6e 45 72 72 20 7c 7c 20 49 4e 5f 44 45  e->nErr || IN_DE
10d00 43 4c 41 52 45 5f 56 54 41 42 20 29 20 67 6f 74  CLARE_VTAB ) got
10d10 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 69 66 28 20  o fk_end;.  if( 
10d20 70 46 72 6f 6d 43 6f 6c 3d 3d 30 20 29 7b 0a 20  pFromCol==0 ){. 
10d30 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 2d     int iCol = p-
10d40 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 20 20 69 66 28  >nCol-1;.    if(
10d50 20 69 43 6f 6c 3c 30 20 29 20 67 6f 74 6f 20 66   iCol<0 ) goto f
10d60 6b 5f 65 6e 64 3b 0a 20 20 20 20 69 66 28 20 70  k_end;.    if( p
10d70 54 6f 43 6f 6c 20 26 26 20 70 54 6f 43 6f 6c 2d  ToCol && pToCol-
10d80 3e 6e 45 78 70 72 21 3d 31 20 29 7b 0a 20 20 20  >nExpr!=1 ){.   
10d90 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
10da0 73 67 28 70 50 61 72 73 65 2c 20 22 66 6f 72 65  sg(pParse, "fore
10db0 69 67 6e 20 6b 65 79 20 6f 6e 20 25 73 22 0a 20  ign key on %s". 
10dc0 20 20 20 20 20 20 20 20 22 20 73 68 6f 75 6c 64          " should
10dd0 20 72 65 66 65 72 65 6e 63 65 20 6f 6e 6c 79 20   reference only 
10de0 6f 6e 65 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 61  one column of ta
10df0 62 6c 65 20 25 54 22 2c 0a 20 20 20 20 20 20 20  ble %T",.       
10e00 20 20 70 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e    p->aCol[iCol].
10e10 7a 4e 61 6d 65 2c 20 70 54 6f 29 3b 0a 20 20 20  zName, pTo);.   
10e20 20 20 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a     goto fk_end;.
10e30 20 20 20 20 7d 0a 20 20 20 20 6e 43 6f 6c 20 3d      }.    nCol =
10e40 20 31 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20   1;.  }else if( 
10e50 70 54 6f 43 6f 6c 20 26 26 20 70 54 6f 43 6f 6c  pToCol && pToCol
10e60 2d 3e 6e 45 78 70 72 21 3d 70 46 72 6f 6d 43 6f  ->nExpr!=pFromCo
10e70 6c 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20  l->nExpr ){.    
10e80 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
10e90 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20  pParse,.        
10ea0 22 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d  "number of colum
10eb0 6e 73 20 69 6e 20 66 6f 72 65 69 67 6e 20 6b 65  ns in foreign ke
10ec0 79 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68  y does not match
10ed0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 22   the number of "
10ee0 0a 20 20 20 20 20 20 20 20 22 63 6f 6c 75 6d 6e  .        "column
10ef0 73 20 69 6e 20 74 68 65 20 72 65 66 65 72 65 6e  s in the referen
10f00 63 65 64 20 74 61 62 6c 65 22 29 3b 0a 20 20 20  ced table");.   
10f10 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20   goto fk_end;.  
10f20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 43 6f 6c 20  }else{.    nCol 
10f30 3d 20 70 46 72 6f 6d 43 6f 6c 2d 3e 6e 45 78 70  = pFromCol->nExp
10f40 72 3b 0a 20 20 7d 0a 20 20 6e 42 79 74 65 20 3d  r;.  }.  nByte =
10f50 20 73 69 7a 65 6f 66 28 2a 70 46 4b 65 79 29 20   sizeof(*pFKey) 
10f60 2b 20 6e 43 6f 6c 2a 73 69 7a 65 6f 66 28 70 46  + nCol*sizeof(pF
10f70 4b 65 79 2d 3e 61 43 6f 6c 5b 30 5d 29 20 2b 20  Key->aCol[0]) + 
10f80 70 54 6f 2d 3e 6e 20 2b 20 31 3b 0a 20 20 69 66  pTo->n + 1;.  if
10f90 28 20 70 54 6f 43 6f 6c 20 29 7b 0a 20 20 20 20  ( pToCol ){.    
10fa0 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 6f 43 6f  for(i=0; i<pToCo
10fb0 6c 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  l->nExpr; i++){.
10fc0 20 20 20 20 20 20 6e 42 79 74 65 20 2b 3d 20 73        nByte += s
10fd0 74 72 6c 65 6e 28 70 54 6f 43 6f 6c 2d 3e 61 5b  trlen(pToCol->a[
10fe0 69 5d 2e 7a 4e 61 6d 65 29 20 2b 20 31 3b 0a 20  i].zName) + 1;. 
10ff0 20 20 20 7d 0a 20 20 7d 0a 20 20 70 46 4b 65 79     }.  }.  pFKey
11000 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
11010 6f 63 5a 65 72 6f 28 64 62 2c 20 6e 42 79 74 65  ocZero(db, nByte
11020 20 29 3b 0a 20 20 69 66 28 20 70 46 4b 65 79 3d   );.  if( pFKey=
11030 3d 30 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 66  =0 ){.    goto f
11040 6b 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 70 46 4b  k_end;.  }.  pFK
11050 65 79 2d 3e 70 46 72 6f 6d 20 3d 20 70 3b 0a 20  ey->pFrom = p;. 
11060 20 70 46 4b 65 79 2d 3e 70 4e 65 78 74 46 72 6f   pFKey->pNextFro
11070 6d 20 3d 20 70 2d 3e 70 46 4b 65 79 3b 0a 20 20  m = p->pFKey;.  
11080 7a 20 3d 20 28 63 68 61 72 2a 29 26 70 46 4b 65  z = (char*)&pFKe
11090 79 5b 31 5d 3b 0a 20 20 70 46 4b 65 79 2d 3e 61  y[1];.  pFKey->a
110a0 43 6f 6c 20 3d 20 28 73 74 72 75 63 74 20 73 43  Col = (struct sC
110b0 6f 6c 4d 61 70 2a 29 7a 3b 0a 20 20 7a 20 2b 3d  olMap*)z;.  z +=
110c0 20 73 69 7a 65 6f 66 28 73 74 72 75 63 74 20 73   sizeof(struct s
110d0 43 6f 6c 4d 61 70 29 2a 6e 43 6f 6c 3b 0a 20 20  ColMap)*nCol;.  
110e0 70 46 4b 65 79 2d 3e 7a 54 6f 20 3d 20 7a 3b 0a  pFKey->zTo = z;.
110f0 20 20 6d 65 6d 63 70 79 28 7a 2c 20 70 54 6f 2d    memcpy(z, pTo-
11100 3e 7a 2c 20 70 54 6f 2d 3e 6e 29 3b 0a 20 20 7a  >z, pTo->n);.  z
11110 5b 70 54 6f 2d 3e 6e 5d 20 3d 20 30 3b 0a 20 20  [pTo->n] = 0;.  
11120 7a 20 2b 3d 20 70 54 6f 2d 3e 6e 2b 31 3b 0a 20  z += pTo->n+1;. 
11130 20 70 46 4b 65 79 2d 3e 70 4e 65 78 74 54 6f 20   pFKey->pNextTo 
11140 3d 20 30 3b 0a 20 20 70 46 4b 65 79 2d 3e 6e 43  = 0;.  pFKey->nC
11150 6f 6c 20 3d 20 6e 43 6f 6c 3b 0a 20 20 69 66 28  ol = nCol;.  if(
11160 20 70 46 72 6f 6d 43 6f 6c 3d 3d 30 20 29 7b 0a   pFromCol==0 ){.
11170 20 20 20 20 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b      pFKey->aCol[
11180 30 5d 2e 69 46 72 6f 6d 20 3d 20 70 2d 3e 6e 43  0].iFrom = p->nC
11190 6f 6c 2d 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ol-1;.  }else{. 
111a0 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43     for(i=0; i<nC
111b0 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ol; i++){.      
111c0 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 66 6f 72  int j;.      for
111d0 28 6a 3d 30 3b 20 6a 3c 70 2d 3e 6e 43 6f 6c 3b  (j=0; j<p->nCol;
111e0 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69   j++){.        i
111f0 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  f( sqlite3StrICm
11200 70 28 70 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61  p(p->aCol[j].zNa
11210 6d 65 2c 20 70 46 72 6f 6d 43 6f 6c 2d 3e 61 5b  me, pFromCol->a[
11220 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a  i].zName)==0 ){.
11230 20 20 20 20 20 20 20 20 20 20 70 46 4b 65 79 2d            pFKey-
11240 3e 61 43 6f 6c 5b 69 5d 2e 69 46 72 6f 6d 20 3d  >aCol[i].iFrom =
11250 20 6a 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72   j;.          br
11260 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
11270 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
11280 20 6a 3e 3d 70 2d 3e 6e 43 6f 6c 20 29 7b 0a 20   j>=p->nCol ){. 
11290 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
112a0 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 0a  rorMsg(pParse, .
112b0 20 20 20 20 20 20 20 20 20 20 22 75 6e 6b 6e 6f            "unkno
112c0 77 6e 20 63 6f 6c 75 6d 6e 20 5c 22 25 73 5c 22  wn column \"%s\"
112d0 20 69 6e 20 66 6f 72 65 69 67 6e 20 6b 65 79 20   in foreign key 
112e0 64 65 66 69 6e 69 74 69 6f 6e 22 2c 20 0a 20 20  definition", .  
112f0 20 20 20 20 20 20 20 20 70 46 72 6f 6d 43 6f 6c          pFromCol
11300 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20  ->a[i].zName);. 
11310 20 20 20 20 20 20 20 67 6f 74 6f 20 66 6b 5f 65         goto fk_e
11320 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  nd;.      }.    
11330 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 54 6f 43  }.  }.  if( pToC
11340 6f 6c 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d  ol ){.    for(i=
11350 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b  0; i<nCol; i++){
11360 0a 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 73  .      int n = s
11370 74 72 6c 65 6e 28 70 54 6f 43 6f 6c 2d 3e 61 5b  trlen(pToCol->a[
11380 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  i].zName);.     
11390 20 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b 69 5d 2e   pFKey->aCol[i].
113a0 7a 43 6f 6c 20 3d 20 7a 3b 0a 20 20 20 20 20 20  zCol = z;.      
113b0 6d 65 6d 63 70 79 28 7a 2c 20 70 54 6f 43 6f 6c  memcpy(z, pToCol
113c0 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 6e 29  ->a[i].zName, n)
113d0 3b 0a 20 20 20 20 20 20 7a 5b 6e 5d 20 3d 20 30  ;.      z[n] = 0
113e0 3b 0a 20 20 20 20 20 20 7a 20 2b 3d 20 6e 2b 31  ;.      z += n+1
113f0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 46  ;.    }.  }.  pF
11400 4b 65 79 2d 3e 69 73 44 65 66 65 72 72 65 64 20  Key->isDeferred 
11410 3d 20 30 3b 0a 20 20 70 46 4b 65 79 2d 3e 64 65  = 0;.  pFKey->de
11420 6c 65 74 65 43 6f 6e 66 20 3d 20 66 6c 61 67 73  leteConf = flags
11430 20 26 20 30 78 66 66 3b 0a 20 20 70 46 4b 65 79   & 0xff;.  pFKey
11440 2d 3e 75 70 64 61 74 65 43 6f 6e 66 20 3d 20 28  ->updateConf = (
11450 66 6c 61 67 73 20 3e 3e 20 38 20 29 20 26 20 30  flags >> 8 ) & 0
11460 78 66 66 3b 0a 20 20 70 46 4b 65 79 2d 3e 69 6e  xff;.  pFKey->in
11470 73 65 72 74 43 6f 6e 66 20 3d 20 28 66 6c 61 67  sertConf = (flag
11480 73 20 3e 3e 20 31 36 20 29 20 26 20 30 78 66 66  s >> 16 ) & 0xff
11490 3b 0a 0a 20 20 2f 2a 20 4c 69 6e 6b 20 74 68 65  ;..  /* Link the
114a0 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 74 6f 20   foreign key to 
114b0 74 68 65 20 74 61 62 6c 65 20 61 73 20 74 68 65  the table as the
114c0 20 6c 61 73 74 20 73 74 65 70 2e 0a 20 20 2a 2f   last step..  */
114d0 0a 20 20 70 2d 3e 70 46 4b 65 79 20 3d 20 70 46  .  p->pFKey = pF
114e0 4b 65 79 3b 0a 20 20 70 46 4b 65 79 20 3d 20 30  Key;.  pFKey = 0
114f0 3b 0a 0a 66 6b 5f 65 6e 64 3a 0a 20 20 73 71 6c  ;..fk_end:.  sql
11500 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
11510 46 4b 65 79 29 3b 0a 23 65 6e 64 69 66 20 2f 2a  FKey);.#endif /*
11520 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
11530 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45  _OMIT_FOREIGN_KE
11540 59 29 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 45  Y) */.  sqlite3E
11550 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62  xprListDelete(db
11560 2c 20 70 46 72 6f 6d 43 6f 6c 29 3b 0a 20 20 73  , pFromCol);.  s
11570 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65  qlite3ExprListDe
11580 6c 65 74 65 28 64 62 2c 20 70 54 6f 43 6f 6c 29  lete(db, pToCol)
11590 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
115a0 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
115b0 64 20 77 68 65 6e 20 61 6e 20 49 4e 49 54 49 41  d when an INITIA
115c0 4c 4c 59 20 49 4d 4d 45 44 49 41 54 45 20 6f 72  LLY IMMEDIATE or
115d0 20 49 4e 49 54 49 41 4c 4c 59 20 44 45 46 45 52   INITIALLY DEFER
115e0 52 45 44 0a 2a 2a 20 63 6c 61 75 73 65 20 69 73  RED.** clause is
115f0 20 73 65 65 6e 20 61 73 20 70 61 72 74 20 6f 66   seen as part of
11600 20 61 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 64   a foreign key d
11610 65 66 69 6e 69 74 69 6f 6e 2e 20 20 54 68 65 20  efinition.  The 
11620 69 73 44 65 66 65 72 72 65 64 0a 2a 2a 20 70 61  isDeferred.** pa
11630 72 61 6d 65 74 65 72 20 69 73 20 31 20 66 6f 72  rameter is 1 for
11640 20 49 4e 49 54 49 41 4c 4c 59 20 44 45 46 45 52   INITIALLY DEFER
11650 52 45 44 20 61 6e 64 20 30 20 66 6f 72 20 49 4e  RED and 0 for IN
11660 49 54 49 41 4c 4c 59 20 49 4d 4d 45 44 49 41 54  ITIALLY IMMEDIAT
11670 45 2e 0a 2a 2a 20 54 68 65 20 62 65 68 61 76 69  E..** The behavi
11680 6f 72 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72  or of the most r
11690 65 63 65 6e 74 6c 79 20 63 72 65 61 74 65 64 20  ecently created 
116a0 66 6f 72 65 69 67 6e 20 6b 65 79 20 69 73 20 61  foreign key is a
116b0 64 6a 75 73 74 65 64 0a 2a 2a 20 61 63 63 6f 72  djusted.** accor
116c0 64 69 6e 67 6c 79 2e 0a 2a 2f 0a 76 6f 69 64 20  dingly..*/.void 
116d0 73 71 6c 69 74 65 33 44 65 66 65 72 46 6f 72 65  sqlite3DeferFore
116e0 69 67 6e 4b 65 79 28 50 61 72 73 65 20 2a 70 50  ignKey(Parse *pP
116f0 61 72 73 65 2c 20 69 6e 74 20 69 73 44 65 66 65  arse, int isDefe
11700 72 72 65 64 29 7b 0a 23 69 66 6e 64 65 66 20 53  rred){.#ifndef S
11710 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49  QLITE_OMIT_FOREI
11720 47 4e 5f 4b 45 59 0a 20 20 54 61 62 6c 65 20 2a  GN_KEY.  Table *
11730 70 54 61 62 3b 0a 20 20 46 4b 65 79 20 2a 70 46  pTab;.  FKey *pF
11740 4b 65 79 3b 0a 20 20 69 66 28 20 28 70 54 61 62  Key;.  if( (pTab
11750 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54   = pParse->pNewT
11760 61 62 6c 65 29 3d 3d 30 20 7c 7c 20 28 70 46 4b  able)==0 || (pFK
11770 65 79 20 3d 20 70 54 61 62 2d 3e 70 46 4b 65 79  ey = pTab->pFKey
11780 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  )==0 ) return;. 
11790 20 70 46 4b 65 79 2d 3e 69 73 44 65 66 65 72 72   pFKey->isDeferr
117a0 65 64 20 3d 20 69 73 44 65 66 65 72 72 65 64 3b  ed = isDeferred;
117b0 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a  .#endif.}../*.**
117c0 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
117d0 68 61 74 20 77 69 6c 6c 20 65 72 61 73 65 20 61  hat will erase a
117e0 6e 64 20 72 65 66 69 6c 6c 20 69 6e 64 65 78 20  nd refill index 
117f0 2a 70 49 64 78 2e 20 20 54 68 69 73 20 69 73 0a  *pIdx.  This is.
11800 2a 2a 20 75 73 65 64 20 74 6f 20 69 6e 69 74 69  ** used to initi
11810 61 6c 69 7a 65 20 61 20 6e 65 77 6c 79 20 63 72  alize a newly cr
11820 65 61 74 65 64 20 69 6e 64 65 78 20 6f 72 20 74  eated index or t
11830 6f 20 72 65 63 6f 6d 70 75 74 65 20 74 68 65 0a  o recompute the.
11840 2a 2a 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 6e  ** content of an
11850 20 69 6e 64 65 78 20 69 6e 20 72 65 73 70 6f 6e   index in respon
11860 73 65 20 74 6f 20 61 20 52 45 49 4e 44 45 58 20  se to a REINDEX 
11870 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 69  command..**.** i
11880 66 20 6d 65 6d 52 6f 6f 74 50 61 67 65 20 69 73  f memRootPage is
11890 20 6e 6f 74 20 6e 65 67 61 74 69 76 65 2c 20 69   not negative, i
118a0 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65  t means that the
118b0 20 69 6e 64 65 78 20 69 73 20 6e 65 77 6c 79 0a   index is newly.
118c0 2a 2a 20 63 72 65 61 74 65 64 2e 20 20 54 68 65  ** created.  The
118d0 20 72 65 67 69 73 74 65 72 20 73 70 65 63 69 66   register specif
118e0 69 65 64 20 62 79 20 6d 65 6d 52 6f 6f 74 50 61  ied by memRootPa
118f0 67 65 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 0a  ge contains the.
11900 2a 2a 20 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d  ** root page num
11910 62 65 72 20 6f 66 20 74 68 65 20 69 6e 64 65 78  ber of the index
11920 2e 20 20 49 66 20 6d 65 6d 52 6f 6f 74 50 61 67  .  If memRootPag
11930 65 20 69 73 20 6e 65 67 61 74 69 76 65 2c 20 74  e is negative, t
11940 68 65 6e 0a 2a 2a 20 74 68 65 20 69 6e 64 65 78  hen.** the index
11950 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 20   already exists 
11960 61 6e 64 20 6d 75 73 74 20 62 65 20 63 6c 65 61  and must be clea
11970 72 65 64 20 62 65 66 6f 72 65 20 62 65 69 6e 67  red before being
11980 20 72 65 66 69 6c 6c 65 64 20 61 6e 64 0a 2a 2a   refilled and.**
11990 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6e   the root page n
119a0 75 6d 62 65 72 20 6f 66 20 74 68 65 20 69 6e 64  umber of the ind
119b0 65 78 20 69 73 20 74 61 6b 65 6e 20 66 72 6f 6d  ex is taken from
119c0 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 2e 0a 2a   pIndex->tnum..*
119d0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 71  /.static void sq
119e0 6c 69 74 65 33 52 65 66 69 6c 6c 49 6e 64 65 78  lite3RefillIndex
119f0 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
11a00 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 2c 20 69  Index *pIndex, i
11a10 6e 74 20 6d 65 6d 52 6f 6f 74 50 61 67 65 29 7b  nt memRootPage){
11a20 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d  .  Table *pTab =
11a30 20 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 3b   pIndex->pTable;
11a40 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 74    /* The table t
11a50 68 61 74 20 69 73 20 69 6e 64 65 78 65 64 20 2a  hat is indexed *
11a60 2f 0a 20 20 69 6e 74 20 69 54 61 62 20 3d 20 70  /.  int iTab = p
11a70 50 61 72 73 65 2d 3e 6e 54 61 62 3b 20 20 20 20  Parse->nTab;    
11a80 20 20 20 2f 2a 20 42 74 72 65 65 20 63 75 72 73     /* Btree curs
11a90 6f 72 20 75 73 65 64 20 66 6f 72 20 70 54 61 62  or used for pTab
11aa0 20 2a 2f 0a 20 20 69 6e 74 20 69 49 64 78 20 3d   */.  int iIdx =
11ab0 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 31 3b   pParse->nTab+1;
11ac0 20 20 20 20 20 2f 2a 20 42 74 72 65 65 20 63 75       /* Btree cu
11ad0 72 73 6f 72 20 75 73 65 64 20 66 6f 72 20 70 49  rsor used for pI
11ae0 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 61 64  ndex */.  int ad
11af0 64 72 31 3b 20 20 20 20 20 20 20 20 20 20 20 20  dr1;            
11b00 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72           /* Addr
11b10 65 73 73 20 6f 66 20 74 6f 70 20 6f 66 20 6c 6f  ess of top of lo
11b20 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 74 6e 75 6d  op */.  int tnum
11b30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
11b40 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70         /* Root p
11b50 61 67 65 20 6f 66 20 69 6e 64 65 78 20 2a 2f 0a  age of index */.
11b60 20 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20 20    Vdbe *v;      
11b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11b80 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
11b90 65 20 69 6e 74 6f 20 74 68 69 73 20 76 69 72 74  e into this virt
11ba0 75 61 6c 20 6d 61 63 68 69 6e 65 20 2a 2f 0a 20  ual machine */. 
11bb0 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 3b 20   KeyInfo *pKey; 
11bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11bd0 2f 2a 20 4b 65 79 49 6e 66 6f 20 66 6f 72 20 69  /* KeyInfo for i
11be0 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 72 65  ndex */.  int re
11bf0 67 49 64 78 4b 65 79 3b 20 20 20 20 20 20 20 20  gIdxKey;        
11c00 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69           /* Regi
11c10 73 74 65 72 73 20 63 6f 6e 74 61 69 6e 69 6e 67  sters containing
11c20 20 74 68 65 20 69 6e 64 65 78 20 6b 65 79 20 2a   the index key *
11c30 2f 0a 20 20 69 6e 74 20 72 65 67 52 65 63 6f 72  /.  int regRecor
11c40 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
11c50 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 68     /* Register h
11c60 6f 6c 64 69 6e 67 20 61 73 73 65 6d 62 6c 69 65  olding assemblie
11c70 64 20 69 6e 64 65 78 20 72 65 63 6f 72 64 20 2a  d index record *
11c80 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  /.  sqlite3 *db 
11c90 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 20  = pParse->db;   
11ca0 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61     /* The databa
11cb0 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f  se connection */
11cc0 0a 20 20 69 6e 74 20 69 44 62 20 3d 20 73 71 6c  .  int iDb = sql
11cd0 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65  ite3SchemaToInde
11ce0 78 28 64 62 2c 20 70 49 6e 64 65 78 2d 3e 70 53  x(db, pIndex->pS
11cf0 63 68 65 6d 61 29 3b 0a 0a 23 69 66 6e 64 65 66  chema);..#ifndef
11d00 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
11d10 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 69 66 28  HORIZATION.  if(
11d20 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63   sqlite3AuthChec
11d30 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45  k(pParse, SQLITE
11d40 5f 52 45 49 4e 44 45 58 2c 20 70 49 6e 64 65 78  _REINDEX, pIndex
11d50 2d 3e 7a 4e 61 6d 65 2c 20 30 2c 0a 20 20 20 20  ->zName, 0,.    
11d60 20 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a    db->aDb[iDb].z
11d70 4e 61 6d 65 20 29 20 29 7b 0a 20 20 20 20 72 65  Name ) ){.    re
11d80 74 75 72 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  turn;.  }.#endif
11d90 0a 0a 20 20 2f 2a 20 52 65 71 75 69 72 65 20 61  ..  /* Require a
11da0 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74   write-lock on t
11db0 68 65 20 74 61 62 6c 65 20 74 6f 20 70 65 72 66  he table to perf
11dc0 6f 72 6d 20 74 68 69 73 20 6f 70 65 72 61 74 69  orm this operati
11dd0 6f 6e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 54  on */.  sqlite3T
11de0 61 62 6c 65 4c 6f 63 6b 28 70 50 61 72 73 65 2c  ableLock(pParse,
11df0 20 69 44 62 2c 20 70 54 61 62 2d 3e 74 6e 75 6d   iDb, pTab->tnum
11e00 2c 20 31 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  , 1, pTab->zName
11e10 29 3b 0a 0a 20 20 76 20 3d 20 73 71 6c 69 74 65  );..  v = sqlite
11e20 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
11e30 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72  ;.  if( v==0 ) r
11e40 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 6d 65 6d  eturn;.  if( mem
11e50 52 6f 6f 74 50 61 67 65 3e 3d 30 20 29 7b 0a 20  RootPage>=0 ){. 
11e60 20 20 20 74 6e 75 6d 20 3d 20 6d 65 6d 52 6f 6f     tnum = memRoo
11e70 74 50 61 67 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a  tPage;.  }else{.
11e80 20 20 20 20 74 6e 75 6d 20 3d 20 70 49 6e 64 65      tnum = pInde
11e90 78 2d 3e 74 6e 75 6d 3b 0a 20 20 20 20 73 71 6c  x->tnum;.    sql
11ea0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
11eb0 2c 20 4f 50 5f 43 6c 65 61 72 2c 20 74 6e 75 6d  , OP_Clear, tnum
11ec0 2c 20 69 44 62 29 3b 0a 20 20 7d 0a 20 20 70 4b  , iDb);.  }.  pK
11ed0 65 79 20 3d 20 73 71 6c 69 74 65 33 49 6e 64 65  ey = sqlite3Inde
11ee0 78 4b 65 79 69 6e 66 6f 28 70 50 61 72 73 65 2c  xKeyinfo(pParse,
11ef0 20 70 49 6e 64 65 78 29 3b 0a 20 20 73 71 6c 69   pIndex);.  sqli
11f00 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
11f10 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65 2c 20 69   OP_OpenWrite, i
11f20 49 64 78 2c 20 74 6e 75 6d 2c 20 69 44 62 2c 20  Idx, tnum, iDb, 
11f30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
11f40 20 20 20 20 20 28 63 68 61 72 20 2a 29 70 4b 65       (char *)pKe
11f50 79 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 5f 48 41  y, P4_KEYINFO_HA
11f60 4e 44 4f 46 46 29 3b 0a 20 20 69 66 28 20 6d 65  NDOFF);.  if( me
11f70 6d 52 6f 6f 74 50 61 67 65 3e 3d 30 20 29 7b 0a  mRootPage>=0 ){.
11f80 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
11f90 68 61 6e 67 65 50 35 28 76 2c 20 31 29 3b 0a 20  hangeP5(v, 1);. 
11fa0 20 7d 0a 20 20 73 71 6c 69 74 65 33 4f 70 65 6e   }.  sqlite3Open
11fb0 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 69 54  Table(pParse, iT
11fc0 61 62 2c 20 69 44 62 2c 20 70 54 61 62 2c 20 4f  ab, iDb, pTab, O
11fd0 50 5f 4f 70 65 6e 52 65 61 64 29 3b 0a 20 20 61  P_OpenRead);.  a
11fe0 64 64 72 31 20 3d 20 73 71 6c 69 74 65 33 56 64  ddr1 = sqlite3Vd
11ff0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52  beAddOp2(v, OP_R
12000 65 77 69 6e 64 2c 20 69 54 61 62 2c 20 30 29 3b  ewind, iTab, 0);
12010 0a 20 20 72 65 67 52 65 63 6f 72 64 20 3d 20 73  .  regRecord = s
12020 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
12030 28 70 50 61 72 73 65 29 3b 0a 20 20 72 65 67 49  (pParse);.  regI
12040 64 78 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 47  dxKey = sqlite3G
12050 65 6e 65 72 61 74 65 49 6e 64 65 78 4b 65 79 28  enerateIndexKey(
12060 70 50 61 72 73 65 2c 20 70 49 6e 64 65 78 2c 20  pParse, pIndex, 
12070 69 54 61 62 2c 20 72 65 67 52 65 63 6f 72 64 2c  iTab, regRecord,
12080 20 31 29 3b 0a 20 20 69 66 28 20 70 49 6e 64 65   1);.  if( pInde
12090 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e  x->onError!=OE_N
120a0 6f 6e 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 6a  one ){.    int j
120b0 31 2c 20 6a 32 3b 0a 20 20 20 20 69 6e 74 20 72  1, j2;.    int r
120c0 65 67 52 6f 77 69 64 3b 0a 0a 20 20 20 20 72 65  egRowid;..    re
120d0 67 52 6f 77 69 64 20 3d 20 72 65 67 49 64 78 4b  gRowid = regIdxK
120e0 65 79 20 2b 20 70 49 6e 64 65 78 2d 3e 6e 43 6f  ey + pIndex->nCo
120f0 6c 75 6d 6e 3b 0a 20 20 20 20 6a 31 20 3d 20 73  lumn;.    j1 = s
12100 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
12110 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20 72  (v, OP_IsNull, r
12120 65 67 49 64 78 4b 65 79 2c 20 30 2c 20 70 49 6e  egIdxKey, 0, pIn
12130 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 29 3b 0a 20  dex->nColumn);. 
12140 20 20 20 6a 32 20 3d 20 73 71 6c 69 74 65 33 56     j2 = sqlite3V
12150 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
12160 49 73 55 6e 69 71 75 65 2c 20 69 49 64 78 2c 0a  IsUnique, iIdx,.
12170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12180 20 20 20 20 20 20 20 20 20 20 20 30 2c 20 72 65             0, re
12190 67 52 6f 77 69 64 2c 20 53 51 4c 49 54 45 5f 49  gRowid, SQLITE_I
121a0 4e 54 5f 54 4f 5f 50 54 52 28 72 65 67 52 65 63  NT_TO_PTR(regRec
121b0 6f 72 64 29 2c 20 50 34 5f 49 4e 54 33 32 29 3b  ord), P4_INT32);
121c0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
121d0 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 48 61 6c  AddOp4(v, OP_Hal
121e0 74 2c 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52  t, SQLITE_CONSTR
121f0 41 49 4e 54 2c 20 4f 45 5f 41 62 6f 72 74 2c 20  AINT, OE_Abort, 
12200 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0,.             
12210 20 20 20 20 20 20 20 22 69 6e 64 65 78 65 64 20         "indexed 
12220 63 6f 6c 75 6d 6e 73 20 61 72 65 20 6e 6f 74 20  columns are not 
12230 75 6e 69 71 75 65 22 2c 20 50 34 5f 53 54 41 54  unique", P4_STAT
12240 49 43 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  IC);.    sqlite3
12250 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
12260 6a 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  j1);.    sqlite3
12270 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
12280 6a 32 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  j2);.  }.  sqlit
12290 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
122a0 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 69 49  OP_IdxInsert, iI
122b0 64 78 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a  dx, regRecord);.
122c0 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
122d0 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
122e0 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 73 71  regRecord);.  sq
122f0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
12300 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 69 54 61 62  v, OP_Next, iTab
12310 2c 20 61 64 64 72 31 2b 31 29 3b 0a 20 20 73 71  , addr1+1);.  sq
12320 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
12330 65 28 76 2c 20 61 64 64 72 31 29 3b 0a 20 20 73  e(v, addr1);.  s
12340 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
12350 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 69 54  (v, OP_Close, iT
12360 61 62 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  ab);.  sqlite3Vd
12370 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 43  beAddOp1(v, OP_C
12380 6c 6f 73 65 2c 20 69 49 64 78 29 3b 0a 7d 0a 0a  lose, iIdx);.}..
12390 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e  /*.** Create a n
123a0 65 77 20 69 6e 64 65 78 20 66 6f 72 20 61 6e 20  ew index for an 
123b0 53 51 4c 20 74 61 62 6c 65 2e 20 20 70 4e 61 6d  SQL table.  pNam
123c0 65 31 2e 70 4e 61 6d 65 32 20 69 73 20 74 68 65  e1.pName2 is the
123d0 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 69 6e 64   name of the ind
123e0 65 78 20 0a 2a 2a 20 61 6e 64 20 70 54 62 6c 4c  ex .** and pTblL
123f0 69 73 74 20 69 73 20 74 68 65 20 6e 61 6d 65 20  ist is the name 
12400 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74 68 61  of the table tha
12410 74 20 69 73 20 74 6f 20 62 65 20 69 6e 64 65 78  t is to be index
12420 65 64 2e 20 20 42 6f 74 68 20 77 69 6c 6c 20 0a  ed.  Both will .
12430 2a 2a 20 62 65 20 4e 55 4c 4c 20 66 6f 72 20 61  ** be NULL for a
12440 20 70 72 69 6d 61 72 79 20 6b 65 79 20 6f 72 20   primary key or 
12450 61 6e 20 69 6e 64 65 78 20 74 68 61 74 20 69 73  an index that is
12460 20 63 72 65 61 74 65 64 20 74 6f 20 73 61 74 69   created to sati
12470 73 66 79 20 61 0a 2a 2a 20 55 4e 49 51 55 45 20  sfy a.** UNIQUE 
12480 63 6f 6e 73 74 72 61 69 6e 74 2e 20 20 49 66 20  constraint.  If 
12490 70 54 61 62 6c 65 20 61 6e 64 20 70 49 6e 64 65  pTable and pInde
124a0 78 20 61 72 65 20 4e 55 4c 4c 2c 20 75 73 65 20  x are NULL, use 
124b0 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
124c0 65 0a 2a 2a 20 61 73 20 74 68 65 20 74 61 62 6c  e.** as the tabl
124d0 65 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64 2e  e to be indexed.
124e0 20 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61    pParse->pNewTa
124f0 62 6c 65 20 69 73 20 61 20 74 61 62 6c 65 20 74  ble is a table t
12500 68 61 74 20 69 73 0a 2a 2a 20 63 75 72 72 65 6e  hat is.** curren
12510 74 6c 79 20 62 65 69 6e 67 20 63 6f 6e 73 74 72  tly being constr
12520 75 63 74 65 64 20 62 79 20 61 20 43 52 45 41 54  ucted by a CREAT
12530 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e  E TABLE statemen
12540 74 2e 0a 2a 2a 0a 2a 2a 20 70 4c 69 73 74 20 69  t..**.** pList i
12550 73 20 61 20 6c 69 73 74 20 6f 66 20 63 6f 6c 75  s a list of colu
12560 6d 6e 73 20 74 6f 20 62 65 20 69 6e 64 65 78 65  mns to be indexe
12570 64 2e 20 20 70 4c 69 73 74 20 77 69 6c 6c 20 62  d.  pList will b
12580 65 20 4e 55 4c 4c 20 69 66 20 74 68 69 73 0a 2a  e NULL if this.*
12590 2a 20 69 73 20 61 20 70 72 69 6d 61 72 79 20 6b  * is a primary k
125a0 65 79 20 6f 72 20 75 6e 69 71 75 65 2d 63 6f 6e  ey or unique-con
125b0 73 74 72 61 69 6e 74 20 6f 6e 20 74 68 65 20 6d  straint on the m
125c0 6f 73 74 20 72 65 63 65 6e 74 20 63 6f 6c 75 6d  ost recent colum
125d0 6e 20 61 64 64 65 64 0a 2a 2a 20 74 6f 20 74 68  n added.** to th
125e0 65 20 74 61 62 6c 65 20 63 75 72 72 65 6e 74 6c  e table currentl
125f0 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63  y under construc
12600 74 69 6f 6e 2e 20 20 0a 2a 2f 0a 76 6f 69 64 20  tion.  .*/.void 
12610 73 71 6c 69 74 65 33 43 72 65 61 74 65 49 6e 64  sqlite3CreateInd
12620 65 78 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ex(.  Parse *pPa
12630 72 73 65 2c 20 20 20 20 20 2f 2a 20 41 6c 6c 20  rse,     /* All 
12640 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75  information abou
12650 74 20 74 68 69 73 20 70 61 72 73 65 20 2a 2f 0a  t this parse */.
12660 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c    Token *pName1,
12670 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 70 61       /* First pa
12680 72 74 20 6f 66 20 69 6e 64 65 78 20 6e 61 6d 65  rt of index name
12690 2e 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f  . May be NULL */
126a0 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32  .  Token *pName2
126b0 2c 20 20 20 20 20 2f 2a 20 53 65 63 6f 6e 64 20  ,     /* Second 
126c0 70 61 72 74 20 6f 66 20 69 6e 64 65 78 20 6e 61  part of index na
126d0 6d 65 2e 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20  me. May be NULL 
126e0 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54  */.  SrcList *pT
126f0 62 6c 4e 61 6d 65 2c 20 2f 2a 20 54 61 62 6c 65  blName, /* Table
12700 20 74 6f 20 69 6e 64 65 78 2e 20 55 73 65 20 70   to index. Use p
12710 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
12720 20 69 66 20 30 20 2a 2f 0a 20 20 45 78 70 72 4c   if 0 */.  ExprL
12730 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 2f 2a  ist *pList,   /*
12740 20 41 20 6c 69 73 74 20 6f 66 20 63 6f 6c 75 6d   A list of colum
12750 6e 73 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64  ns to be indexed
12760 20 2a 2f 0a 20 20 69 6e 74 20 6f 6e 45 72 72 6f   */.  int onErro
12770 72 2c 20 20 20 20 20 20 20 2f 2a 20 4f 45 5f 41  r,       /* OE_A
12780 62 6f 72 74 2c 20 4f 45 5f 49 67 6e 6f 72 65 2c  bort, OE_Ignore,
12790 20 4f 45 5f 52 65 70 6c 61 63 65 2c 20 6f 72 20   OE_Replace, or 
127a0 4f 45 5f 4e 6f 6e 65 20 2a 2f 0a 20 20 54 6f 6b  OE_None */.  Tok
127b0 65 6e 20 2a 70 53 74 61 72 74 2c 20 20 20 20 20  en *pStart,     
127c0 2f 2a 20 54 68 65 20 43 52 45 41 54 45 20 74 6f  /* The CREATE to
127d0 6b 65 6e 20 74 68 61 74 20 62 65 67 69 6e 73 20  ken that begins 
127e0 74 68 69 73 20 73 74 61 74 65 6d 65 6e 74 20 2a  this statement *
127f0 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 45 6e 64 2c  /.  Token *pEnd,
12800 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 22 29         /* The ")
12810 22 20 74 68 61 74 20 63 6c 6f 73 65 73 20 74 68  " that closes th
12820 65 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 73  e CREATE INDEX s
12830 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e  tatement */.  in
12840 74 20 73 6f 72 74 4f 72 64 65 72 2c 20 20 20 20  t sortOrder,    
12850 20 2f 2a 20 53 6f 72 74 20 6f 72 64 65 72 20 6f   /* Sort order o
12860 66 20 70 72 69 6d 61 72 79 20 6b 65 79 20 77 68  f primary key wh
12870 65 6e 20 70 4c 69 73 74 3d 3d 4e 55 4c 4c 20 2a  en pList==NULL *
12880 2f 0a 20 20 69 6e 74 20 69 66 4e 6f 74 45 78 69  /.  int ifNotExi
12890 73 74 20 20 20 20 20 2f 2a 20 4f 6d 69 74 20 65  st     /* Omit e
128a0 72 72 6f 72 20 69 66 20 69 6e 64 65 78 20 61 6c  rror if index al
128b0 72 65 61 64 79 20 65 78 69 73 74 73 20 2a 2f 0a  ready exists */.
128c0 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  ){.  Table *pTab
128d0 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 54 61 62   = 0;     /* Tab
128e0 6c 65 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64  le to be indexed
128f0 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e   */.  Index *pIn
12900 64 65 78 20 3d 20 30 3b 20 20 20 2f 2a 20 54 68  dex = 0;   /* Th
12910 65 20 69 6e 64 65 78 20 74 6f 20 62 65 20 63 72  e index to be cr
12920 65 61 74 65 64 20 2a 2f 0a 20 20 63 68 61 72 20  eated */.  char 
12930 2a 7a 4e 61 6d 65 20 3d 20 30 3b 20 20 20 20 20  *zName = 0;     
12940 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 69  /* Name of the i
12950 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e  ndex */.  int nN
12960 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f  ame;           /
12970 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 68 61 72  * Number of char
12980 61 63 74 65 72 73 20 69 6e 20 7a 4e 61 6d 65 20  acters in zName 
12990 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20  */.  int i, j;. 
129a0 20 54 6f 6b 65 6e 20 6e 75 6c 6c 49 64 3b 20 20   Token nullId;  
129b0 20 20 20 20 20 20 2f 2a 20 46 61 6b 65 20 74 6f        /* Fake to
129c0 6b 65 6e 20 66 6f 72 20 61 6e 20 65 6d 70 74 79  ken for an empty
129d0 20 49 44 20 6c 69 73 74 20 2a 2f 0a 20 20 44 62   ID list */.  Db
129e0 46 69 78 65 72 20 73 46 69 78 3b 20 20 20 20 20  Fixer sFix;     
129f0 20 20 20 2f 2a 20 46 6f 72 20 61 73 73 69 67 6e     /* For assign
12a00 69 6e 67 20 64 61 74 61 62 61 73 65 20 6e 61 6d  ing database nam
12a10 65 73 20 74 6f 20 70 54 61 62 6c 65 20 2a 2f 0a  es to pTable */.
12a20 20 20 69 6e 74 20 73 6f 72 74 4f 72 64 65 72 4d    int sortOrderM
12a30 61 73 6b 3b 20 20 20 2f 2a 20 31 20 74 6f 20 68  ask;   /* 1 to h
12a40 6f 6e 6f 72 20 44 45 53 43 20 69 6e 20 69 6e 64  onor DESC in ind
12a50 65 78 2e 20 20 30 20 74 6f 20 69 67 6e 6f 72 65  ex.  0 to ignore
12a60 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a  . */.  sqlite3 *
12a70 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
12a80 0a 20 20 44 62 20 2a 70 44 62 3b 20 20 20 20 20  .  Db *pDb;     
12a90 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73          /* The s
12aa0 70 65 63 69 66 69 63 20 74 61 62 6c 65 20 63 6f  pecific table co
12ab0 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 69 6e 64  ntaining the ind
12ac0 65 78 65 64 20 64 61 74 61 62 61 73 65 20 2a 2f  exed database */
12ad0 0a 20 20 69 6e 74 20 69 44 62 3b 20 20 20 20 20  .  int iDb;     
12ae0 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
12af0 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
12b00 20 74 68 61 74 20 69 73 20 62 65 69 6e 67 20 77   that is being w
12b10 72 69 74 74 65 6e 20 2a 2f 0a 20 20 54 6f 6b 65  ritten */.  Toke
12b20 6e 20 2a 70 4e 61 6d 65 20 3d 20 30 3b 20 20 20  n *pName = 0;   
12b30 20 2f 2a 20 55 6e 71 75 61 6c 69 66 69 65 64 20   /* Unqualified 
12b40 6e 61 6d 65 20 6f 66 20 74 68 65 20 69 6e 64 65  name of the inde
12b50 78 20 74 6f 20 63 72 65 61 74 65 20 2a 2f 0a 20  x to create */. 
12b60 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
12b70 5f 69 74 65 6d 20 2a 70 4c 69 73 74 49 74 65 6d  _item *pListItem
12b80 3b 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67  ; /* For looping
12b90 20 6f 76 65 72 20 70 4c 69 73 74 20 2a 2f 0a 20   over pList */. 
12ba0 20 69 6e 74 20 6e 43 6f 6c 3b 0a 20 20 69 6e 74   int nCol;.  int
12bb0 20 6e 45 78 74 72 61 20 3d 20 30 3b 0a 20 20 63   nExtra = 0;.  c
12bc0 68 61 72 20 2a 7a 45 78 74 72 61 3b 0a 0a 20 20  har *zExtra;..  
12bd0 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  if( pParse->nErr
12be0 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   || db->mallocFa
12bf0 69 6c 65 64 20 7c 7c 20 49 4e 5f 44 45 43 4c 41  iled || IN_DECLA
12c00 52 45 5f 56 54 41 42 20 29 7b 0a 20 20 20 20 67  RE_VTAB ){.    g
12c10 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
12c20 69 6e 64 65 78 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  index;.  }..  /*
12c30 0a 20 20 2a 2a 20 46 69 6e 64 20 74 68 65 20 74  .  ** Find the t
12c40 61 62 6c 65 20 74 68 61 74 20 69 73 20 74 6f 20  able that is to 
12c50 62 65 20 69 6e 64 65 78 65 64 2e 20 20 52 65 74  be indexed.  Ret
12c60 75 72 6e 20 65 61 72 6c 79 20 69 66 20 6e 6f 74  urn early if not
12c70 20 66 6f 75 6e 64 2e 0a 20 20 2a 2f 0a 20 20 69   found..  */.  i
12c80 66 28 20 70 54 62 6c 4e 61 6d 65 21 3d 30 20 29  f( pTblName!=0 )
12c90 7b 0a 0a 20 20 20 20 2f 2a 20 55 73 65 20 74 68  {..    /* Use th
12ca0 65 20 74 77 6f 2d 70 61 72 74 20 69 6e 64 65 78  e two-part index
12cb0 20 6e 61 6d 65 20 74 6f 20 64 65 74 65 72 6d 69   name to determi
12cc0 6e 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ne the database 
12cd0 0a 20 20 20 20 2a 2a 20 74 6f 20 73 65 61 72 63  .    ** to searc
12ce0 68 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 2e  h for the table.
12cf0 20 27 46 69 78 27 20 74 68 65 20 74 61 62 6c 65   'Fix' the table
12d00 20 6e 61 6d 65 20 74 6f 20 74 68 69 73 20 64 62   name to this db
12d10 0a 20 20 20 20 2a 2a 20 62 65 66 6f 72 65 20 6c  .    ** before l
12d20 6f 6f 6b 69 6e 67 20 75 70 20 74 68 65 20 74 61  ooking up the ta
12d30 62 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ble..    */.    
12d40 61 73 73 65 72 74 28 20 70 4e 61 6d 65 31 20 26  assert( pName1 &
12d50 26 20 70 4e 61 6d 65 32 20 29 3b 0a 20 20 20 20  & pName2 );.    
12d60 69 44 62 20 3d 20 73 71 6c 69 74 65 33 54 77 6f  iDb = sqlite3Two
12d70 50 61 72 74 4e 61 6d 65 28 70 50 61 72 73 65 2c  PartName(pParse,
12d80 20 70 4e 61 6d 65 31 2c 20 70 4e 61 6d 65 32 2c   pName1, pName2,
12d90 20 26 70 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66   &pName);.    if
12da0 28 20 69 44 62 3c 30 20 29 20 67 6f 74 6f 20 65  ( iDb<0 ) goto e
12db0 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
12dc0 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ;..#ifndef SQLIT
12dd0 45 5f 4f 4d 49 54 5f 54 45 4d 50 44 42 0a 20 20  E_OMIT_TEMPDB.  
12de0 20 20 2f 2a 20 49 66 20 74 68 65 20 69 6e 64 65    /* If the inde
12df0 78 20 6e 61 6d 65 20 77 61 73 20 75 6e 71 75 61  x name was unqua
12e00 6c 69 66 69 65 64 2c 20 63 68 65 63 6b 20 69 66  lified, check if
12e10 20 74 68 65 20 74 68 65 20 74 61 62 6c 65 0a 20   the the table. 
12e20 20 20 20 2a 2a 20 69 73 20 61 20 74 65 6d 70 20     ** is a temp 
12e30 74 61 62 6c 65 2e 20 49 66 20 73 6f 2c 20 73 65  table. If so, se
12e40 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74  t the database t
12e50 6f 20 31 2e 20 44 6f 20 6e 6f 74 20 64 6f 20 74  o 1. Do not do t
12e60 68 69 73 0a 20 20 20 20 2a 2a 20 69 66 20 69 6e  his.    ** if in
12e70 69 74 69 61 6c 69 73 69 6e 67 20 61 20 64 61 74  itialising a dat
12e80 61 62 61 73 65 20 73 63 68 65 6d 61 2e 0a 20 20  abase schema..  
12e90 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 64 62    */.    if( !db
12ea0 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20  ->init.busy ){. 
12eb0 20 20 20 20 20 70 54 61 62 20 3d 20 73 71 6c 69       pTab = sqli
12ec0 74 65 33 53 72 63 4c 69 73 74 4c 6f 6f 6b 75 70  te3SrcListLookup
12ed0 28 70 50 61 72 73 65 2c 20 70 54 62 6c 4e 61 6d  (pParse, pTblNam
12ee0 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4e  e);.      if( pN
12ef0 61 6d 65 32 20 26 26 20 70 4e 61 6d 65 32 2d 3e  ame2 && pName2->
12f00 6e 3d 3d 30 20 26 26 20 70 54 61 62 20 26 26 20  n==0 && pTab && 
12f10 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 3d 3d 64  pTab->pSchema==d
12f20 62 2d 3e 61 44 62 5b 31 5d 2e 70 53 63 68 65 6d  b->aDb[1].pSchem
12f30 61 20 29 7b 0a 20 20 20 20 20 20 20 20 69 44 62  a ){.        iDb
12f40 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 1;.      }.  
12f50 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20    }.#endif..    
12f60 69 66 28 20 73 71 6c 69 74 65 33 46 69 78 49 6e  if( sqlite3FixIn
12f70 69 74 28 26 73 46 69 78 2c 20 70 50 61 72 73 65  it(&sFix, pParse
12f80 2c 20 69 44 62 2c 20 22 69 6e 64 65 78 22 2c 20  , iDb, "index", 
12f90 70 4e 61 6d 65 29 20 26 26 0a 20 20 20 20 20 20  pName) &&.      
12fa0 20 20 73 71 6c 69 74 65 33 46 69 78 53 72 63 4c    sqlite3FixSrcL
12fb0 69 73 74 28 26 73 46 69 78 2c 20 70 54 62 6c 4e  ist(&sFix, pTblN
12fc0 61 6d 65 29 0a 20 20 20 20 29 7b 0a 20 20 20 20  ame).    ){.    
12fd0 20 20 2f 2a 20 42 65 63 61 75 73 65 20 74 68 65    /* Because the
12fe0 20 70 61 72 73 65 72 20 63 6f 6e 73 74 72 75 63   parser construc
12ff0 74 73 20 70 54 62 6c 4e 61 6d 65 20 66 72 6f 6d  ts pTblName from
13000 20 61 20 73 69 6e 67 6c 65 20 69 64 65 6e 74 69   a single identi
13010 66 69 65 72 2c 0a 20 20 20 20 20 20 2a 2a 20 73  fier,.      ** s
13020 71 6c 69 74 65 33 46 69 78 53 72 63 4c 69 73 74  qlite3FixSrcList
13030 20 63 61 6e 20 6e 65 76 65 72 20 66 61 69 6c 2e   can never fail.
13040 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74   */.      assert
13050 28 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  (0);.    }.    p
13060 54 61 62 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63  Tab = sqlite3Loc
13070 61 74 65 54 61 62 6c 65 28 70 50 61 72 73 65 2c  ateTable(pParse,
13080 20 30 2c 20 70 54 62 6c 4e 61 6d 65 2d 3e 61 5b   0, pTblName->a[
13090 30 5d 2e 7a 4e 61 6d 65 2c 20 0a 20 20 20 20 20  0].zName, .     
130a0 20 20 20 70 54 62 6c 4e 61 6d 65 2d 3e 61 5b 30     pTblName->a[0
130b0 5d 2e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20  ].zDatabase);.  
130c0 20 20 69 66 28 20 21 70 54 61 62 20 29 20 67 6f    if( !pTab ) go
130d0 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
130e0 6e 64 65 78 3b 0a 20 20 20 20 61 73 73 65 72 74  ndex;.    assert
130f0 28 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70  ( db->aDb[iDb].p
13100 53 63 68 65 6d 61 3d 3d 70 54 61 62 2d 3e 70 53  Schema==pTab->pS
13110 63 68 65 6d 61 20 29 3b 0a 20 20 7d 65 6c 73 65  chema );.  }else
13120 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4e  {.    assert( pN
13130 61 6d 65 3d 3d 30 20 29 3b 0a 20 20 20 20 70 54  ame==0 );.    pT
13140 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65  ab = pParse->pNe
13150 77 54 61 62 6c 65 3b 0a 20 20 20 20 69 66 28 20  wTable;.    if( 
13160 21 70 54 61 62 20 29 20 67 6f 74 6f 20 65 78 69  !pTab ) goto exi
13170 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
13180 20 20 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65      iDb = sqlite
13190 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64  3SchemaToIndex(d
131a0 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61  b, pTab->pSchema
131b0 29 3b 0a 20 20 7d 0a 20 20 70 44 62 20 3d 20 26  );.  }.  pDb = &
131c0 64 62 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a 0a 20  db->aDb[iDb];.. 
131d0 20 69 66 28 20 70 54 61 62 3d 3d 30 20 7c 7c 20   if( pTab==0 || 
131e0 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 20 67  pParse->nErr ) g
131f0 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
13200 69 6e 64 65 78 3b 0a 20 20 69 66 28 20 73 71 6c  index;.  if( sql
13210 69 74 65 33 53 74 72 4e 49 43 6d 70 28 70 54 61  ite3StrNICmp(pTa
13220 62 2d 3e 7a 4e 61 6d 65 2c 20 22 73 71 6c 69 74  b->zName, "sqlit
13230 65 5f 22 2c 20 37 29 3d 3d 30 20 29 7b 0a 20 20  e_", 7)==0 ){.  
13240 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
13250 67 28 70 50 61 72 73 65 2c 20 22 74 61 62 6c 65  g(pParse, "table
13260 20 25 73 20 6d 61 79 20 6e 6f 74 20 62 65 20 69   %s may not be i
13270 6e 64 65 78 65 64 22 2c 20 70 54 61 62 2d 3e 7a  ndexed", pTab->z
13280 4e 61 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20  Name);.    goto 
13290 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
132a0 78 3b 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20 53  x;.  }.#ifndef S
132b0 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a  QLITE_OMIT_VIEW.
132c0 20 20 69 66 28 20 70 54 61 62 2d 3e 70 53 65 6c    if( pTab->pSel
132d0 65 63 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ect ){.    sqlit
132e0 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
132f0 65 2c 20 22 76 69 65 77 73 20 6d 61 79 20 6e 6f  e, "views may no
13300 74 20 62 65 20 69 6e 64 65 78 65 64 22 29 3b 0a  t be indexed");.
13310 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72      goto exit_cr
13320 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a  eate_index;.  }.
13330 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 66 20 53  #endif.#ifndef S
13340 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
13350 41 4c 54 41 42 4c 45 0a 20 20 69 66 28 20 49 73  ALTABLE.  if( Is
13360 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 29 7b  Virtual(pTab) ){
13370 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
13380 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 76 69  rMsg(pParse, "vi
13390 72 74 75 61 6c 20 74 61 62 6c 65 73 20 6d 61 79  rtual tables may
133a0 20 6e 6f 74 20 62 65 20 69 6e 64 65 78 65 64 22   not be indexed"
133b0 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74  );.    goto exit
133c0 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
133d0 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 0a   }.#endif..  /*.
133e0 20 20 2a 2a 20 46 69 6e 64 20 74 68 65 20 6e 61    ** Find the na
133f0 6d 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e  me of the index.
13400 20 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 72    Make sure ther
13410 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79  e is not already
13420 20 61 6e 6f 74 68 65 72 0a 20 20 2a 2a 20 69 6e   another.  ** in
13430 64 65 78 20 6f 72 20 74 61 62 6c 65 20 77 69 74  dex or table wit
13440 68 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 2e  h the same name.
13450 20 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 78 63    .  **.  ** Exc
13460 65 70 74 69 6f 6e 3a 20 20 49 66 20 77 65 20 61  eption:  If we a
13470 72 65 20 72 65 61 64 69 6e 67 20 74 68 65 20 6e  re reading the n
13480 61 6d 65 73 20 6f 66 20 70 65 72 6d 61 6e 65 6e  ames of permanen
13490 74 20 69 6e 64 69 63 65 73 20 66 72 6f 6d 20 74  t indices from t
134a0 68 65 0a 20 20 2a 2a 20 73 71 6c 69 74 65 5f 6d  he.  ** sqlite_m
134b0 61 73 74 65 72 20 74 61 62 6c 65 20 28 62 65 63  aster table (bec
134c0 61 75 73 65 20 73 6f 6d 65 20 6f 74 68 65 72 20  ause some other 
134d0 70 72 6f 63 65 73 73 20 63 68 61 6e 67 65 64 20  process changed 
134e0 74 68 65 20 73 63 68 65 6d 61 29 20 61 6e 64 0a  the schema) and.
134f0 20 20 2a 2a 20 6f 6e 65 20 6f 66 20 74 68 65 20    ** one of the 
13500 69 6e 64 65 78 20 6e 61 6d 65 73 20 63 6f 6c 6c  index names coll
13510 69 64 65 73 20 77 69 74 68 20 74 68 65 20 6e 61  ides with the na
13520 6d 65 20 6f 66 20 61 20 74 65 6d 70 6f 72 61 72  me of a temporar
13530 79 20 74 61 62 6c 65 20 6f 72 0a 20 20 2a 2a 20  y table or.  ** 
13540 69 6e 64 65 78 2c 20 74 68 65 6e 20 77 65 20 77  index, then we w
13550 69 6c 6c 20 63 6f 6e 74 69 6e 75 65 20 74 6f 20  ill continue to 
13560 70 72 6f 63 65 73 73 20 74 68 69 73 20 69 6e 64  process this ind
13570 65 78 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66  ex..  **.  ** If
13580 20 70 4e 61 6d 65 3d 3d 30 20 69 74 20 6d 65 61   pName==0 it mea
13590 6e 73 20 74 68 61 74 20 77 65 20 61 72 65 0a 20  ns that we are. 
135a0 20 2a 2a 20 64 65 61 6c 69 6e 67 20 77 69 74 68   ** dealing with
135b0 20 61 20 70 72 69 6d 61 72 79 20 6b 65 79 20 6f   a primary key o
135c0 72 20 55 4e 49 51 55 45 20 63 6f 6e 73 74 72 61  r UNIQUE constra
135d0 69 6e 74 2e 20 20 57 65 20 68 61 76 65 20 74 6f  int.  We have to
135e0 20 69 6e 76 65 6e 74 20 6f 75 72 0a 20 20 2a 2a   invent our.  **
135f0 20 6f 77 6e 20 6e 61 6d 65 2e 0a 20 20 2a 2f 0a   own name..  */.
13600 20 20 69 66 28 20 70 4e 61 6d 65 20 29 7b 0a 20    if( pName ){. 
13610 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74     zName = sqlit
13620 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28  e3NameFromToken(
13630 64 62 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 20 20  db, pName);.    
13640 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73  if( SQLITE_OK!=s
13650 71 6c 69 74 65 33 52 65 61 64 53 63 68 65 6d 61  qlite3ReadSchema
13660 28 70 50 61 72 73 65 29 20 29 20 67 6f 74 6f 20  (pParse) ) goto 
13670 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
13680 78 3b 0a 20 20 20 20 69 66 28 20 7a 4e 61 6d 65  x;.    if( zName
13690 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78 69 74 5f  ==0 ) goto exit_
136a0 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
136b0 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21    if( SQLITE_OK!
136c0 3d 73 71 6c 69 74 65 33 43 68 65 63 6b 4f 62 6a  =sqlite3CheckObj
136d0 65 63 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20  ectName(pParse, 
136e0 7a 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 20 20  zName) ){.      
136f0 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
13700 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20  _index;.    }.  
13710 20 20 69 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e    if( !db->init.
13720 62 75 73 79 20 29 7b 0a 20 20 20 20 20 20 69 66  busy ){.      if
13730 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c  ( SQLITE_OK!=sql
13740 69 74 65 33 52 65 61 64 53 63 68 65 6d 61 28 70  ite3ReadSchema(p
13750 50 61 72 73 65 29 20 29 20 67 6f 74 6f 20 65 78  Parse) ) goto ex
13760 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
13770 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
13780 65 33 46 69 6e 64 54 61 62 6c 65 28 64 62 2c 20  e3FindTable(db, 
13790 7a 4e 61 6d 65 2c 20 30 29 21 3d 30 20 29 7b 0a  zName, 0)!=0 ){.
137a0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
137b0 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
137c0 22 74 68 65 72 65 20 69 73 20 61 6c 72 65 61 64  "there is alread
137d0 79 20 61 20 74 61 62 6c 65 20 6e 61 6d 65 64 20  y a table named 
137e0 25 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20  %s", zName);.   
137f0 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63       goto exit_c
13800 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20  reate_index;.   
13810 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
13820 66 28 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e  f( sqlite3FindIn
13830 64 65 78 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 70  dex(db, zName, p
13840 44 62 2d 3e 7a 4e 61 6d 65 29 21 3d 30 20 29 7b  Db->zName)!=0 ){
13850 0a 20 20 20 20 20 20 69 66 28 20 21 69 66 4e 6f  .      if( !ifNo
13860 74 45 78 69 73 74 20 29 7b 0a 20 20 20 20 20 20  tExist ){.      
13870 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
13880 67 28 70 50 61 72 73 65 2c 20 22 69 6e 64 65 78  g(pParse, "index
13890 20 25 73 20 61 6c 72 65 61 64 79 20 65 78 69 73   %s already exis
138a0 74 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20  ts", zName);.   
138b0 20 20 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20     }.      goto 
138c0 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
138d0 78 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  x;.    }.  }else
138e0 7b 0a 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20  {.    int n;.   
138f0 20 49 6e 64 65 78 20 2a 70 4c 6f 6f 70 3b 0a 20   Index *pLoop;. 
13900 20 20 20 66 6f 72 28 70 4c 6f 6f 70 3d 70 54 61     for(pLoop=pTa
13910 62 2d 3e 70 49 6e 64 65 78 2c 20 6e 3d 31 3b 20  b->pIndex, n=1; 
13920 70 4c 6f 6f 70 3b 20 70 4c 6f 6f 70 3d 70 4c 6f  pLoop; pLoop=pLo
13930 6f 70 2d 3e 70 4e 65 78 74 2c 20 6e 2b 2b 29 7b  op->pNext, n++){
13940 7d 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71  }.    zName = sq
13950 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c  lite3MPrintf(db,
13960 20 22 73 71 6c 69 74 65 5f 61 75 74 6f 69 6e 64   "sqlite_autoind
13970 65 78 5f 25 73 5f 25 64 22 2c 20 70 54 61 62 2d  ex_%s_%d", pTab-
13980 3e 7a 4e 61 6d 65 2c 20 6e 29 3b 0a 20 20 20 20  >zName, n);.    
13990 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a  if( zName==0 ){.
139a0 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f        goto exit_
139b0 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
139c0 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68    }.  }..  /* Ch
139d0 65 63 6b 20 66 6f 72 20 61 75 74 68 6f 72 69 7a  eck for authoriz
139e0 61 74 69 6f 6e 20 74 6f 20 63 72 65 61 74 65 20  ation to create 
139f0 61 6e 20 69 6e 64 65 78 2e 0a 20 20 2a 2f 0a 23  an index..  */.#
13a00 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
13a10 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e  IT_AUTHORIZATION
13a20 0a 20 20 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63  .  {.    const c
13a30 68 61 72 20 2a 7a 44 62 20 3d 20 70 44 62 2d 3e  har *zDb = pDb->
13a40 7a 4e 61 6d 65 3b 0a 20 20 20 20 69 66 28 20 73  zName;.    if( s
13a50 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28  qlite3AuthCheck(
13a60 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 49  pParse, SQLITE_I
13a70 4e 53 45 52 54 2c 20 53 43 48 45 4d 41 5f 54 41  NSERT, SCHEMA_TA
13a80 42 4c 45 28 69 44 62 29 2c 20 30 2c 20 7a 44 62  BLE(iDb), 0, zDb
13a90 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  ) ){.      goto 
13aa0 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
13ab0 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 20 3d  x;.    }.    i =
13ac0 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 49   SQLITE_CREATE_I
13ad0 4e 44 45 58 3b 0a 20 20 20 20 69 66 28 20 21 4f  NDEX;.    if( !O
13ae0 4d 49 54 5f 54 45 4d 50 44 42 20 26 26 20 69 44  MIT_TEMPDB && iD
13af0 62 3d 3d 31 20 29 20 69 20 3d 20 53 51 4c 49 54  b==1 ) i = SQLIT
13b00 45 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f 49 4e  E_CREATE_TEMP_IN
13b10 44 45 58 3b 0a 20 20 20 20 69 66 28 20 73 71 6c  DEX;.    if( sql
13b20 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50  ite3AuthCheck(pP
13b30 61 72 73 65 2c 20 69 2c 20 7a 4e 61 6d 65 2c 20  arse, i, zName, 
13b40 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 44 62  pTab->zName, zDb
13b50 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  ) ){.      goto 
13b60 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
13b70 78 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  x;.    }.  }.#en
13b80 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20 70 4c 69  dif..  /* If pLi
13b90 73 74 3d 3d 30 2c 20 69 74 20 6d 65 61 6e 73 20  st==0, it means 
13ba0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 61 73  this routine was
13bb0 20 63 61 6c 6c 65 64 20 74 6f 20 6d 61 6b 65 20   called to make 
13bc0 61 20 70 72 69 6d 61 72 79 0a 20 20 2a 2a 20 6b  a primary.  ** k
13bd0 65 79 20 6f 75 74 20 6f 66 20 74 68 65 20 6c 61  ey out of the la
13be0 73 74 20 63 6f 6c 75 6d 6e 20 61 64 64 65 64 20  st column added 
13bf0 74 6f 20 74 68 65 20 74 61 62 6c 65 20 75 6e 64  to the table und
13c00 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e  er construction.
13c10 0a 20 20 2a 2a 20 53 6f 20 63 72 65 61 74 65 20  .  ** So create 
13c20 61 20 66 61 6b 65 20 6c 69 73 74 20 74 6f 20 73  a fake list to s
13c30 69 6d 75 6c 61 74 65 20 74 68 69 73 2e 0a 20 20  imulate this..  
13c40 2a 2f 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d  */.  if( pList==
13c50 30 20 29 7b 0a 20 20 20 20 6e 75 6c 6c 49 64 2e  0 ){.    nullId.
13c60 7a 20 3d 20 28 75 38 2a 29 70 54 61 62 2d 3e 61  z = (u8*)pTab->a
13c70 43 6f 6c 5b 70 54 61 62 2d 3e 6e 43 6f 6c 2d 31  Col[pTab->nCol-1
13c80 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 6e 75 6c  ].zName;.    nul
13c90 6c 49 64 2e 6e 20 3d 20 73 74 72 6c 65 6e 28 28  lId.n = strlen((
13ca0 63 68 61 72 2a 29 6e 75 6c 6c 49 64 2e 7a 29 3b  char*)nullId.z);
13cb0 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 73 71 6c  .    pList = sql
13cc0 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65  ite3ExprListAppe
13cd0 6e 64 28 70 50 61 72 73 65 2c 20 30 2c 20 30 2c  nd(pParse, 0, 0,
13ce0 20 26 6e 75 6c 6c 49 64 29 3b 0a 20 20 20 20 69   &nullId);.    i
13cf0 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 67 6f  f( pList==0 ) go
13d00 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
13d10 6e 64 65 78 3b 0a 20 20 20 20 70 4c 69 73 74 2d  ndex;.    pList-
13d20 3e 61 5b 30 5d 2e 73 6f 72 74 4f 72 64 65 72 20  >a[0].sortOrder 
13d30 3d 20 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20 7d  = sortOrder;.  }
13d40 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75  ..  /* Figure ou
13d50 74 20 68 6f 77 20 6d 61 6e 79 20 62 79 74 65 73  t how many bytes
13d60 20 6f 66 20 73 70 61 63 65 20 61 72 65 20 72 65   of space are re
13d70 71 75 69 72 65 64 20 74 6f 20 73 74 6f 72 65 20  quired to store 
13d80 65 78 70 6c 69 63 69 74 6c 79 0a 20 20 2a 2a 20  explicitly.  ** 
13d90 73 70 65 63 69 66 69 65 64 20 63 6f 6c 6c 61 74  specified collat
13da0 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 6e 61 6d  ion sequence nam
13db0 65 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69  es..  */.  for(i
13dc0 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78  =0; i<pList->nEx
13dd0 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78  pr; i++){.    Ex
13de0 70 72 20 2a 70 45 78 70 72 3b 0a 20 20 20 20 43  pr *pExpr;.    C
13df0 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20  ollSeq *pColl;. 
13e00 20 20 20 69 66 28 20 28 70 45 78 70 72 20 3d 20     if( (pExpr = 
13e10 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  pList->a[i].pExp
13e20 72 29 21 3d 30 20 26 26 20 28 70 43 6f 6c 6c 20  r)!=0 && (pColl 
13e30 3d 20 70 45 78 70 72 2d 3e 70 43 6f 6c 6c 29 21  = pExpr->pColl)!
13e40 3d 30 20 29 7b 0a 20 20 20 20 20 20 6e 45 78 74  =0 ){.      nExt
13e50 72 61 20 2b 3d 20 28 31 20 2b 20 73 74 72 6c 65  ra += (1 + strle
13e60 6e 28 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29 29  n(pColl->zName))
13e70 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
13e80 2a 20 0a 20 20 2a 2a 20 41 6c 6c 6f 63 61 74 65  * .  ** Allocate
13e90 20 74 68 65 20 69 6e 64 65 78 20 73 74 72 75 63   the index struc
13ea0 74 75 72 65 2e 20 0a 20 20 2a 2f 0a 20 20 6e 4e  ture. .  */.  nN
13eb0 61 6d 65 20 3d 20 73 74 72 6c 65 6e 28 7a 4e 61  ame = strlen(zNa
13ec0 6d 65 29 3b 0a 20 20 6e 43 6f 6c 20 3d 20 70 4c  me);.  nCol = pL
13ed0 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 70 49  ist->nExpr;.  pI
13ee0 6e 64 65 78 20 3d 20 73 71 6c 69 74 65 33 44 62  ndex = sqlite3Db
13ef0 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 0a  MallocZero(db, .
13f00 20 20 20 20 20 20 73 69 7a 65 6f 66 28 49 6e 64        sizeof(Ind
13f10 65 78 29 20 2b 20 20 20 20 20 20 20 20 20 20 20  ex) +           
13f20 20 20 20 2f 2a 20 49 6e 64 65 78 20 73 74 72 75     /* Index stru
13f30 63 74 75 72 65 20 20 2a 2f 0a 20 20 20 20 20 20  cture  */.      
13f40 73 69 7a 65 6f 66 28 69 6e 74 29 2a 6e 43 6f 6c  sizeof(int)*nCol
13f50 20 2b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20   +           /* 
13f60 49 6e 64 65 78 2e 61 69 43 6f 6c 75 6d 6e 20 20  Index.aiColumn  
13f70 20 2a 2f 0a 20 20 20 20 20 20 73 69 7a 65 6f 66   */.      sizeof
13f80 28 69 6e 74 29 2a 28 6e 43 6f 6c 2b 31 29 20 2b  (int)*(nCol+1) +
13f90 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 2e         /* Index.
13fa0 61 69 52 6f 77 45 73 74 20 20 20 2a 2f 0a 20 20  aiRowEst   */.  
13fb0 20 20 20 20 73 69 7a 65 6f 66 28 63 68 61 72 20      sizeof(char 
13fc0 2a 29 2a 6e 43 6f 6c 20 2b 20 20 20 20 20 20 20  *)*nCol +       
13fd0 20 2f 2a 20 49 6e 64 65 78 2e 61 7a 43 6f 6c 6c   /* Index.azColl
13fe0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 69       */.      si
13ff0 7a 65 6f 66 28 75 38 29 2a 6e 43 6f 6c 20 2b 20  zeof(u8)*nCol + 
14000 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
14010 64 65 78 2e 61 53 6f 72 74 4f 72 64 65 72 20 2a  dex.aSortOrder *
14020 2f 0a 20 20 20 20 20 20 6e 4e 61 6d 65 20 2b 20  /.      nName + 
14030 31 20 2b 20 20 20 20 20 20 20 20 20 20 20 20 20  1 +             
14040 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 2e 7a 4e       /* Index.zN
14050 61 6d 65 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  ame      */.    
14060 20 20 6e 45 78 74 72 61 20 20 20 20 20 20 20 20    nExtra        
14070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
14080 2a 20 43 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  * Collation sequ
14090 65 6e 63 65 20 6e 61 6d 65 73 20 2a 2f 0a 20 20  ence names */.  
140a0 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  );.  if( db->mal
140b0 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
140c0 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
140d0 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 70  e_index;.  }.  p
140e0 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c 20 3d 20  Index->azColl = 
140f0 28 63 68 61 72 2a 2a 29 28 26 70 49 6e 64 65 78  (char**)(&pIndex
14100 5b 31 5d 29 3b 0a 20 20 70 49 6e 64 65 78 2d 3e  [1]);.  pIndex->
14110 61 69 43 6f 6c 75 6d 6e 20 3d 20 28 69 6e 74 20  aiColumn = (int 
14120 2a 29 28 26 70 49 6e 64 65 78 2d 3e 61 7a 43 6f  *)(&pIndex->azCo
14130 6c 6c 5b 6e 43 6f 6c 5d 29 3b 0a 20 20 70 49 6e  ll[nCol]);.  pIn
14140 64 65 78 2d 3e 61 69 52 6f 77 45 73 74 20 3d 20  dex->aiRowEst = 
14150 28 75 6e 73 69 67 6e 65 64 20 2a 29 28 26 70 49  (unsigned *)(&pI
14160 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e  ndex->aiColumn[n
14170 43 6f 6c 5d 29 3b 0a 20 20 70 49 6e 64 65 78 2d  Col]);.  pIndex-
14180 3e 61 53 6f 72 74 4f 72 64 65 72 20 3d 20 28 75  >aSortOrder = (u
14190 38 20 2a 29 28 26 70 49 6e 64 65 78 2d 3e 61 69  8 *)(&pIndex->ai
141a0 52 6f 77 45 73 74 5b 6e 43 6f 6c 2b 31 5d 29 3b  RowEst[nCol+1]);
141b0 0a 20 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65  .  pIndex->zName
141c0 20 3d 20 28 63 68 61 72 20 2a 29 28 26 70 49 6e   = (char *)(&pIn
141d0 64 65 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b  dex->aSortOrder[
141e0 6e 43 6f 6c 5d 29 3b 0a 20 20 7a 45 78 74 72 61  nCol]);.  zExtra
141f0 20 3d 20 28 63 68 61 72 20 2a 29 28 26 70 49 6e   = (char *)(&pIn
14200 64 65 78 2d 3e 7a 4e 61 6d 65 5b 6e 4e 61 6d 65  dex->zName[nName
14210 2b 31 5d 29 3b 0a 20 20 6d 65 6d 63 70 79 28 70  +1]);.  memcpy(p
14220 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 7a 4e  Index->zName, zN
14230 61 6d 65 2c 20 6e 4e 61 6d 65 2b 31 29 3b 0a 20  ame, nName+1);. 
14240 20 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 20   pIndex->pTable 
14250 3d 20 70 54 61 62 3b 0a 20 20 70 49 6e 64 65 78  = pTab;.  pIndex
14260 2d 3e 6e 43 6f 6c 75 6d 6e 20 3d 20 70 4c 69 73  ->nColumn = pLis
14270 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 70 49 6e 64  t->nExpr;.  pInd
14280 65 78 2d 3e 6f 6e 45 72 72 6f 72 20 3d 20 6f 6e  ex->onError = on
14290 45 72 72 6f 72 3b 0a 20 20 70 49 6e 64 65 78 2d  Error;.  pIndex-
142a0 3e 61 75 74 6f 49 6e 64 65 78 20 3d 20 70 4e 61  >autoIndex = pNa
142b0 6d 65 3d 3d 30 3b 0a 20 20 70 49 6e 64 65 78 2d  me==0;.  pIndex-
142c0 3e 70 53 63 68 65 6d 61 20 3d 20 64 62 2d 3e 61  >pSchema = db->a
142d0 44 62 5b 69 44 62 5d 2e 70 53 63 68 65 6d 61 3b  Db[iDb].pSchema;
142e0 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20  ..  /* Check to 
142f0 73 65 65 20 69 66 20 77 65 20 73 68 6f 75 6c 64  see if we should
14300 20 68 6f 6e 6f 72 20 44 45 53 43 20 72 65 71 75   honor DESC requ
14310 65 73 74 73 20 6f 6e 20 69 6e 64 65 78 20 63 6f  ests on index co
14320 6c 75 6d 6e 73 0a 20 20 2a 2f 0a 20 20 69 66 28  lumns.  */.  if(
14330 20 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 66   pDb->pSchema->f
14340 69 6c 65 5f 66 6f 72 6d 61 74 3e 3d 34 20 29 7b  ile_format>=4 ){
14350 0a 20 20 20 20 73 6f 72 74 4f 72 64 65 72 4d 61  .    sortOrderMa
14360 73 6b 20 3d 20 2d 31 3b 20 20 20 2f 2a 20 48 6f  sk = -1;   /* Ho
14370 6e 6f 72 20 44 45 53 43 20 2a 2f 0a 20 20 7d 65  nor DESC */.  }e
14380 6c 73 65 7b 0a 20 20 20 20 73 6f 72 74 4f 72 64  lse{.    sortOrd
14390 65 72 4d 61 73 6b 20 3d 20 30 3b 20 20 20 20 2f  erMask = 0;    /
143a0 2a 20 49 67 6e 6f 72 65 20 44 45 53 43 20 2a 2f  * Ignore DESC */
143b0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 63 61 6e 20  .  }..  /* Scan 
143c0 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 74 68 65  the names of the
143d0 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20   columns of the 
143e0 74 61 62 6c 65 20 74 6f 20 62 65 20 69 6e 64 65  table to be inde
143f0 78 65 64 20 61 6e 64 0a 20 20 2a 2a 20 6c 6f 61  xed and.  ** loa
14400 64 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69 6e 64  d the column ind
14410 69 63 65 73 20 69 6e 74 6f 20 74 68 65 20 49 6e  ices into the In
14420 64 65 78 20 73 74 72 75 63 74 75 72 65 2e 20 20  dex structure.  
14430 52 65 70 6f 72 74 20 61 6e 20 65 72 72 6f 72 0a  Report an error.
14440 20 20 2a 2a 20 69 66 20 61 6e 79 20 63 6f 6c 75    ** if any colu
14450 6d 6e 20 69 73 20 6e 6f 74 20 66 6f 75 6e 64 2e  mn is not found.
14460 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 2c  .  */.  for(i=0,
14470 20 70 4c 69 73 74 49 74 65 6d 3d 70 4c 69 73 74   pListItem=pList
14480 2d 3e 61 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45  ->a; i<pList->nE
14490 78 70 72 3b 20 69 2b 2b 2c 20 70 4c 69 73 74 49  xpr; i++, pListI
144a0 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 63 6f 6e 73  tem++){.    cons
144b0 74 20 63 68 61 72 20 2a 7a 43 6f 6c 4e 61 6d 65  t char *zColName
144c0 20 3d 20 70 4c 69 73 74 49 74 65 6d 2d 3e 7a 4e   = pListItem->zN
144d0 61 6d 65 3b 0a 20 20 20 20 43 6f 6c 75 6d 6e 20  ame;.    Column 
144e0 2a 70 54 61 62 43 6f 6c 3b 0a 20 20 20 20 69 6e  *pTabCol;.    in
144f0 74 20 72 65 71 75 65 73 74 65 64 53 6f 72 74 4f  t requestedSortO
14500 72 64 65 72 3b 0a 20 20 20 20 63 68 61 72 20 2a  rder;.    char *
14510 7a 43 6f 6c 6c 3b 20 20 20 20 20 20 20 20 20 20  zColl;          
14520 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 6c           /* Coll
14530 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 6e  ation sequence n
14540 61 6d 65 20 2a 2f 0a 0a 20 20 20 20 66 6f 72 28  ame */..    for(
14550 6a 3d 30 2c 20 70 54 61 62 43 6f 6c 3d 70 54 61  j=0, pTabCol=pTa
14560 62 2d 3e 61 43 6f 6c 3b 20 6a 3c 70 54 61 62 2d  b->aCol; j<pTab-
14570 3e 6e 43 6f 6c 3b 20 6a 2b 2b 2c 20 70 54 61 62  >nCol; j++, pTab
14580 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  Col++){.      if
14590 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ( sqlite3StrICmp
145a0 28 7a 43 6f 6c 4e 61 6d 65 2c 20 70 54 61 62 43  (zColName, pTabC
145b0 6f 6c 2d 3e 7a 4e 61 6d 65 29 3d 3d 30 20 29 20  ol->zName)==0 ) 
145c0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
145d0 20 69 66 28 20 6a 3e 3d 70 54 61 62 2d 3e 6e 43   if( j>=pTab->nC
145e0 6f 6c 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ol ){.      sqli
145f0 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
14600 73 65 2c 20 22 74 61 62 6c 65 20 25 73 20 68 61  se, "table %s ha
14610 73 20 6e 6f 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  s no column name
14620 64 20 25 73 22 2c 0a 20 20 20 20 20 20 20 20 70  d %s",.        p
14630 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c  Tab->zName, zCol
14640 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 67 6f 74  Name);.      got
14650 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
14660 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f  dex;.    }.    /
14670 2a 20 54 4f 44 4f 3a 20 20 41 64 64 20 61 20 74  * TODO:  Add a t
14680 65 73 74 20 74 6f 20 6d 61 6b 65 20 73 75 72 65  est to make sure
14690 20 74 68 61 74 20 74 68 65 20 73 61 6d 65 20 63   that the same c
146a0 6f 6c 75 6d 6e 20 69 73 20 6e 6f 74 20 6e 61 6d  olumn is not nam
146b0 65 64 0a 20 20 20 20 2a 2a 20 6d 6f 72 65 20 74  ed.    ** more t
146c0 68 61 6e 20 6f 6e 63 65 20 77 69 74 68 69 6e 20  han once within 
146d0 74 68 65 20 73 61 6d 65 20 69 6e 64 65 78 2e 20  the same index. 
146e0 20 4f 6e 6c 79 20 74 68 65 20 66 69 72 73 74 20   Only the first 
146f0 69 6e 73 74 61 6e 63 65 20 6f 66 0a 20 20 20 20  instance of.    
14700 2a 2a 20 74 68 65 20 63 6f 6c 75 6d 6e 20 77 69  ** the column wi
14710 6c 6c 20 65 76 65 72 20 62 65 20 75 73 65 64 20  ll ever be used 
14720 62 79 20 74 68 65 20 6f 70 74 69 6d 69 7a 65 72  by the optimizer
14730 2e 20 20 4e 6f 74 65 20 74 68 61 74 20 75 73 69  .  Note that usi
14740 6e 67 20 74 68 65 0a 20 20 20 20 2a 2a 20 73 61  ng the.    ** sa
14750 6d 65 20 63 6f 6c 75 6d 6e 20 6d 6f 72 65 20 74  me column more t
14760 68 61 6e 20 6f 6e 63 65 20 63 61 6e 6e 6f 74 20  han once cannot 
14770 62 65 20 61 6e 20 65 72 72 6f 72 20 62 65 63 61  be an error beca
14780 75 73 65 20 74 68 61 74 20 77 6f 75 6c 64 20 0a  use that would .
14790 20 20 20 20 2a 2a 20 62 72 65 61 6b 20 62 61 63      ** break bac
147a0 6b 77 61 72 64 73 20 63 6f 6d 70 61 74 69 62 69  kwards compatibi
147b0 6c 69 74 79 20 2d 20 69 74 20 6e 65 65 64 73 20  lity - it needs 
147c0 74 6f 20 62 65 20 61 20 77 61 72 6e 69 6e 67 2e  to be a warning.
147d0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 49 6e 64  .    */.    pInd
147e0 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 20  ex->aiColumn[i] 
147f0 3d 20 6a 3b 0a 20 20 20 20 69 66 28 20 70 4c 69  = j;.    if( pLi
14800 73 74 49 74 65 6d 2d 3e 70 45 78 70 72 20 26 26  stItem->pExpr &&
14810 20 70 4c 69 73 74 49 74 65 6d 2d 3e 70 45 78 70   pListItem->pExp
14820 72 2d 3e 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20  r->pColl ){.    
14830 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 49    assert( pListI
14840 74 65 6d 2d 3e 70 45 78 70 72 2d 3e 70 43 6f 6c  tem->pExpr->pCol
14850 6c 20 29 3b 0a 20 20 20 20 20 20 7a 43 6f 6c 6c  l );.      zColl
14860 20 3d 20 7a 45 78 74 72 61 3b 0a 20 20 20 20 20   = zExtra;.     
14870 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
14880 66 28 6e 45 78 74 72 61 2c 20 7a 45 78 74 72 61  f(nExtra, zExtra
14890 2c 20 22 25 73 22 2c 20 70 4c 69 73 74 49 74 65  , "%s", pListIte
148a0 6d 2d 3e 70 45 78 70 72 2d 3e 70 43 6f 6c 6c 2d  m->pExpr->pColl-
148b0 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7a  >zName);.      z
148c0 45 78 74 72 61 20 2b 3d 20 28 73 74 72 6c 65 6e  Extra += (strlen
148d0 28 7a 43 6f 6c 6c 29 20 2b 20 31 29 3b 0a 20 20  (zColl) + 1);.  
148e0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a    }else{.      z
148f0 43 6f 6c 6c 20 3d 20 70 54 61 62 2d 3e 61 43 6f  Coll = pTab->aCo
14900 6c 5b 6a 5d 2e 7a 43 6f 6c 6c 3b 0a 20 20 20 20  l[j].zColl;.    
14910 20 20 69 66 28 20 21 7a 43 6f 6c 6c 20 29 7b 0a    if( !zColl ){.
14920 20 20 20 20 20 20 20 20 7a 43 6f 6c 6c 20 3d 20          zColl = 
14930 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 2d 3e 7a  db->pDfltColl->z
14940 4e 61 6d 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Name;.      }.  
14950 20 20 7d 0a 20 20 20 20 69 66 28 20 21 64 62 2d    }.    if( !db-
14960 3e 69 6e 69 74 2e 62 75 73 79 20 26 26 20 21 73  >init.busy && !s
14970 71 6c 69 74 65 33 4c 6f 63 61 74 65 43 6f 6c 6c  qlite3LocateColl
14980 53 65 71 28 70 50 61 72 73 65 2c 20 7a 43 6f 6c  Seq(pParse, zCol
14990 6c 2c 20 2d 31 29 20 29 7b 0a 20 20 20 20 20 20  l, -1) ){.      
149a0 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
149b0 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20  _index;.    }.  
149c0 20 20 70 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c    pIndex->azColl
149d0 5b 69 5d 20 3d 20 7a 43 6f 6c 6c 3b 0a 20 20 20  [i] = zColl;.   
149e0 20 72 65 71 75 65 73 74 65 64 53 6f 72 74 4f 72   requestedSortOr
149f0 64 65 72 20 3d 20 70 4c 69 73 74 49 74 65 6d 2d  der = pListItem-
14a00 3e 73 6f 72 74 4f 72 64 65 72 20 26 20 73 6f 72  >sortOrder & sor
14a10 74 4f 72 64 65 72 4d 61 73 6b 3b 0a 20 20 20 20  tOrderMask;.    
14a20 70 49 6e 64 65 78 2d 3e 61 53 6f 72 74 4f 72 64  pIndex->aSortOrd
14a30 65 72 5b 69 5d 20 3d 20 72 65 71 75 65 73 74 65  er[i] = requeste
14a40 64 53 6f 72 74 4f 72 64 65 72 3b 0a 20 20 7d 0a  dSortOrder;.  }.
14a50 20 20 73 71 6c 69 74 65 33 44 65 66 61 75 6c 74    sqlite3Default
14a60 52 6f 77 45 73 74 28 70 49 6e 64 65 78 29 3b 0a  RowEst(pIndex);.
14a70 0a 20 20 69 66 28 20 70 54 61 62 3d 3d 70 50 61  .  if( pTab==pPa
14a80 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 29  rse->pNewTable )
14a90 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 72 6f  {.    /* This ro
14aa0 75 74 69 6e 65 20 68 61 73 20 62 65 65 6e 20 63  utine has been c
14ab0 61 6c 6c 65 64 20 74 6f 20 63 72 65 61 74 65 20  alled to create 
14ac0 61 6e 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64  an automatic ind
14ad0 65 78 20 61 73 20 61 0a 20 20 20 20 2a 2a 20 72  ex as a.    ** r
14ae0 65 73 75 6c 74 20 6f 66 20 61 20 50 52 49 4d 41  esult of a PRIMA
14af0 52 59 20 4b 45 59 20 6f 72 20 55 4e 49 51 55 45  RY KEY or UNIQUE
14b00 20 63 6c 61 75 73 65 20 6f 6e 20 61 20 63 6f 6c   clause on a col
14b10 75 6d 6e 20 64 65 66 69 6e 69 74 69 6f 6e 2c 20  umn definition, 
14b20 6f 72 0a 20 20 20 20 2a 2a 20 61 20 50 52 49 4d  or.    ** a PRIM
14b30 41 52 59 20 4b 45 59 20 6f 72 20 55 4e 49 51 55  ARY KEY or UNIQU
14b40 45 20 63 6c 61 75 73 65 20 66 6f 6c 6c 6f 77 69  E clause followi
14b50 6e 67 20 74 68 65 20 63 6f 6c 75 6d 6e 20 64 65  ng the column de
14b60 66 69 6e 69 74 69 6f 6e 73 2e 0a 20 20 20 20 2a  finitions..    *
14b70 2a 20 69 2e 65 2e 20 6f 6e 65 20 6f 66 3a 0a 20  * i.e. one of:. 
14b80 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 43 52 45     **.    ** CRE
14b90 41 54 45 20 54 41 42 4c 45 20 74 28 78 20 50 52  ATE TABLE t(x PR
14ba0 49 4d 41 52 59 20 4b 45 59 2c 20 79 29 3b 0a 20  IMARY KEY, y);. 
14bb0 20 20 20 2a 2a 20 43 52 45 41 54 45 20 54 41 42     ** CREATE TAB
14bc0 4c 45 20 74 28 78 2c 20 79 2c 20 55 4e 49 51 55  LE t(x, y, UNIQU
14bd0 45 28 78 2c 20 79 29 29 3b 0a 20 20 20 20 2a 2a  E(x, y));.    **
14be0 0a 20 20 20 20 2a 2a 20 45 69 74 68 65 72 20 77  .    ** Either w
14bf0 61 79 2c 20 63 68 65 63 6b 20 74 6f 20 73 65 65  ay, check to see
14c00 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 61 6c   if the table al
14c10 72 65 61 64 79 20 68 61 73 20 73 75 63 68 20 61  ready has such a
14c20 6e 20 69 6e 64 65 78 2e 20 49 66 0a 20 20 20 20  n index. If.    
14c30 2a 2a 20 73 6f 2c 20 64 6f 6e 27 74 20 62 6f 74  ** so, don't bot
14c40 68 65 72 20 63 72 65 61 74 69 6e 67 20 74 68 69  her creating thi
14c50 73 20 6f 6e 65 2e 20 54 68 69 73 20 6f 6e 6c 79  s one. This only
14c60 20 61 70 70 6c 69 65 73 20 74 6f 0a 20 20 20 20   applies to.    
14c70 2a 2a 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  ** automatically
14c80 20 63 72 65 61 74 65 64 20 69 6e 64 69 63 65 73   created indices
14c90 2e 20 55 73 65 72 73 20 63 61 6e 20 64 6f 20 61  . Users can do a
14ca0 73 20 74 68 65 79 20 77 69 73 68 20 77 69 74 68  s they wish with
14cb0 0a 20 20 20 20 2a 2a 20 65 78 70 6c 69 63 69 74  .    ** explicit
14cc0 20 69 6e 64 69 63 65 73 2e 0a 20 20 20 20 2a 2f   indices..    */
14cd0 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78  .    Index *pIdx
14ce0 3b 0a 20 20 20 20 66 6f 72 28 70 49 64 78 3d 70  ;.    for(pIdx=p
14cf0 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64  Tab->pIndex; pId
14d00 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e  x; pIdx=pIdx->pN
14d10 65 78 74 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  ext){.      int 
14d20 6b 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  k;.      assert(
14d30 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d   pIdx->onError!=
14d40 4f 45 5f 4e 6f 6e 65 20 29 3b 0a 20 20 20 20 20  OE_None );.     
14d50 20 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e 61   assert( pIdx->a
14d60 75 74 6f 49 6e 64 65 78 20 29 3b 0a 20 20 20 20  utoIndex );.    
14d70 20 20 61 73 73 65 72 74 28 20 70 49 6e 64 65 78    assert( pIndex
14d80 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f  ->onError!=OE_No
14d90 6e 65 20 29 3b 0a 0a 20 20 20 20 20 20 69 66 28  ne );..      if(
14da0 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 21 3d   pIdx->nColumn!=
14db0 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 20  pIndex->nColumn 
14dc0 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
14dd0 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70 49 64    for(k=0; k<pId
14de0 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 6b 2b 2b 29  x->nColumn; k++)
14df0 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20  {.        const 
14e00 63 68 61 72 20 2a 7a 31 20 3d 20 70 49 64 78 2d  char *z1 = pIdx-
14e10 3e 61 7a 43 6f 6c 6c 5b 6b 5d 3b 0a 20 20 20 20  >azColl[k];.    
14e20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
14e30 7a 32 20 3d 20 70 49 6e 64 65 78 2d 3e 61 7a 43  z2 = pIndex->azC
14e40 6f 6c 6c 5b 6b 5d 3b 0a 20 20 20 20 20 20 20 20  oll[k];.        
14e50 69 66 28 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75  if( pIdx->aiColu
14e60 6d 6e 5b 6b 5d 21 3d 70 49 6e 64 65 78 2d 3e 61  mn[k]!=pIndex->a
14e70 69 43 6f 6c 75 6d 6e 5b 6b 5d 20 29 20 62 72 65  iColumn[k] ) bre
14e80 61 6b 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ak;.        if( 
14e90 70 49 64 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72  pIdx->aSortOrder
14ea0 5b 6b 5d 21 3d 70 49 6e 64 65 78 2d 3e 61 53 6f  [k]!=pIndex->aSo
14eb0 72 74 4f 72 64 65 72 5b 6b 5d 20 29 20 62 72 65  rtOrder[k] ) bre
14ec0 61 6b 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ak;.        if( 
14ed0 7a 31 21 3d 7a 32 20 26 26 20 73 71 6c 69 74 65  z1!=z2 && sqlite
14ee0 33 53 74 72 49 43 6d 70 28 7a 31 2c 20 7a 32 29  3StrICmp(z1, z2)
14ef0 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
14f00 7d 0a 20 20 20 20 20 20 69 66 28 20 6b 3d 3d 70  }.      if( k==p
14f10 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 7b 0a  Idx->nColumn ){.
14f20 20 20 20 20 20 20 20 20 69 66 28 20 70 49 64 78          if( pIdx
14f30 2d 3e 6f 6e 45 72 72 6f 72 21 3d 70 49 6e 64 65  ->onError!=pInde
14f40 78 2d 3e 6f 6e 45 72 72 6f 72 20 29 7b 0a 20 20  x->onError ){.  
14f50 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20          /* This 
14f60 63 6f 6e 73 74 72 61 69 6e 74 20 63 72 65 61 74  constraint creat
14f70 65 73 20 74 68 65 20 73 61 6d 65 20 69 6e 64 65  es the same inde
14f80 78 20 61 73 20 61 20 70 72 65 76 69 6f 75 73 0a  x as a previous.
14f90 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e            ** con
14fa0 73 74 72 61 69 6e 74 20 73 70 65 63 69 66 69 65  straint specifie
14fb0 64 20 73 6f 6d 65 77 68 65 72 65 20 69 6e 20 74  d somewhere in t
14fc0 68 65 20 43 52 45 41 54 45 20 54 41 42 4c 45 20  he CREATE TABLE 
14fd0 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20 20 20 20  statement..     
14fe0 20 20 20 20 20 2a 2a 20 48 6f 77 65 76 65 72 20       ** However 
14ff0 74 68 65 20 4f 4e 20 43 4f 4e 46 4c 49 43 54 20  the ON CONFLICT 
15000 63 6c 61 75 73 65 73 20 61 72 65 20 64 69 66 66  clauses are diff
15010 65 72 65 6e 74 2e 20 49 66 20 62 6f 74 68 20 74  erent. If both t
15020 68 69 73 20 0a 20 20 20 20 20 20 20 20 20 20 2a  his .          *
15030 2a 20 63 6f 6e 73 74 72 61 69 6e 74 20 61 6e 64  * constraint and
15040 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 65 71   the previous eq
15050 75 69 76 61 6c 65 6e 74 20 63 6f 6e 73 74 72 61  uivalent constra
15060 69 6e 74 20 68 61 76 65 20 65 78 70 6c 69 63 69  int have explici
15070 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 4f  t.          ** O
15080 4e 20 43 4f 4e 46 4c 49 43 54 20 63 6c 61 75 73  N CONFLICT claus
15090 65 73 20 74 68 69 73 20 69 73 20 61 6e 20 65 72  es this is an er
150a0 72 6f 72 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ror. Otherwise, 
150b0 75 73 65 20 74 68 65 0a 20 20 20 20 20 20 20 20  use the.        
150c0 20 20 2a 2a 20 65 78 70 6c 69 63 69 74 6c 79 20    ** explicitly 
150d0 73 70 65 63 69 66 69 65 64 20 62 65 68 61 76 69  specified behavi
150e0 6f 75 72 20 66 6f 72 20 74 68 65 20 69 6e 64 65  our for the inde
150f0 78 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a  x..          */.
15100 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21 28            if( !(
15110 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f  pIdx->onError==O
15120 45 5f 44 65 66 61 75 6c 74 20 7c 7c 20 70 49 6e  E_Default || pIn
15130 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45  dex->onError==OE
15140 5f 44 65 66 61 75 6c 74 29 20 29 7b 0a 20 20 20  _Default) ){.   
15150 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
15160 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
15170 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
15180 20 20 22 63 6f 6e 66 6c 69 63 74 69 6e 67 20 4f    "conflicting O
15190 4e 20 43 4f 4e 46 4c 49 43 54 20 63 6c 61 75 73  N CONFLICT claus
151a0 65 73 20 73 70 65 63 69 66 69 65 64 22 2c 20 30  es specified", 0
151b0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
151c0 20 20 20 20 20 20 20 20 20 69 66 28 20 70 49 64           if( pId
151d0 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 44  x->onError==OE_D
151e0 65 66 61 75 6c 74 20 29 7b 0a 20 20 20 20 20 20  efault ){.      
151f0 20 20 20 20 20 20 70 49 64 78 2d 3e 6f 6e 45 72        pIdx->onEr
15200 72 6f 72 20 3d 20 70 49 6e 64 65 78 2d 3e 6f 6e  ror = pIndex->on
15210 45 72 72 6f 72 3b 0a 20 20 20 20 20 20 20 20 20  Error;.         
15220 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
15230 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63       goto exit_c
15240 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20  reate_index;.   
15250 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
15260 20 20 2f 2a 20 4c 69 6e 6b 20 74 68 65 20 6e 65    /* Link the ne
15270 77 20 49 6e 64 65 78 20 73 74 72 75 63 74 75 72  w Index structur
15280 65 20 74 6f 20 69 74 73 20 74 61 62 6c 65 20 61  e to its table a
15290 6e 64 20 74 6f 20 74 68 65 20 6f 74 68 65 72 0a  nd to the other.
152a0 20 20 2a 2a 20 69 6e 2d 6d 65 6d 6f 72 79 20 64    ** in-memory d
152b0 61 74 61 62 61 73 65 20 73 74 72 75 63 74 75 72  atabase structur
152c0 65 73 2e 20 0a 20 20 2a 2f 0a 20 20 69 66 28 20  es. .  */.  if( 
152d0 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b  db->init.busy ){
152e0 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 3b 0a 20  .    Index *p;. 
152f0 20 20 20 70 20 3d 20 73 71 6c 69 74 65 33 48 61     p = sqlite3Ha
15300 73 68 49 6e 73 65 72 74 28 26 70 49 6e 64 65 78  shInsert(&pIndex
15310 2d 3e 70 53 63 68 65 6d 61 2d 3e 69 64 78 48 61  ->pSchema->idxHa
15320 73 68 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  sh, .           
15330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 49                pI
15340 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 73 74 72  ndex->zName, str
15350 6c 65 6e 28 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d  len(pIndex->zNam
15360 65 29 2b 31 2c 20 70 49 6e 64 65 78 29 3b 0a 20  e)+1, pIndex);. 
15370 20 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20     if( p ){.    
15380 20 20 61 73 73 65 72 74 28 20 70 3d 3d 70 49 6e    assert( p==pIn
15390 64 65 78 20 29 3b 20 20 2f 2a 20 4d 61 6c 6c 6f  dex );  /* Mallo
153a0 63 20 6d 75 73 74 20 68 61 76 65 20 66 61 69 6c  c must have fail
153b0 65 64 20 2a 2f 0a 20 20 20 20 20 20 64 62 2d 3e  ed */.      db->
153c0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31  mallocFailed = 1
153d0 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69  ;.      goto exi
153e0 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
153f0 20 20 20 20 7d 0a 20 20 20 20 64 62 2d 3e 66 6c      }.    db->fl
15400 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 49 6e  ags |= SQLITE_In
15410 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a 20 20 20  ternChanges;.   
15420 20 69 66 28 20 70 54 62 6c 4e 61 6d 65 21 3d 30   if( pTblName!=0
15430 20 29 7b 0a 20 20 20 20 20 20 70 49 6e 64 65 78   ){.      pIndex
15440 2d 3e 74 6e 75 6d 20 3d 20 64 62 2d 3e 69 6e 69  ->tnum = db->ini
15450 74 2e 6e 65 77 54 6e 75 6d 3b 0a 20 20 20 20 7d  t.newTnum;.    }
15460 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
15470 65 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20  e db->init.busy 
15480 69 73 20 30 20 74 68 65 6e 20 63 72 65 61 74 65  is 0 then create
15490 20 74 68 65 20 69 6e 64 65 78 20 6f 6e 20 64 69   the index on di
154a0 73 6b 2e 20 20 54 68 69 73 0a 20 20 2a 2a 20 69  sk.  This.  ** i
154b0 6e 76 6f 6c 76 65 73 20 77 72 69 74 69 6e 67 20  nvolves writing 
154c0 74 68 65 20 69 6e 64 65 78 20 69 6e 74 6f 20 74  the index into t
154d0 68 65 20 6d 61 73 74 65 72 20 74 61 62 6c 65 20  he master table 
154e0 61 6e 64 20 66 69 6c 6c 69 6e 67 20 69 6e 20 74  and filling in t
154f0 68 65 0a 20 20 2a 2a 20 69 6e 64 65 78 20 77 69  he.  ** index wi
15500 74 68 20 74 68 65 20 63 75 72 72 65 6e 74 20 74  th the current t
15510 61 62 6c 65 20 63 6f 6e 74 65 6e 74 73 2e 0a 20  able contents.. 
15520 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 64 62 2d   **.  ** The db-
15530 3e 69 6e 69 74 2e 62 75 73 79 20 69 73 20 30 20  >init.busy is 0 
15540 77 68 65 6e 20 74 68 65 20 75 73 65 72 20 66 69  when the user fi
15550 72 73 74 20 65 6e 74 65 72 73 20 61 20 43 52 45  rst enters a CRE
15560 41 54 45 20 49 4e 44 45 58 20 0a 20 20 2a 2a 20  ATE INDEX .  ** 
15570 63 6f 6d 6d 61 6e 64 2e 20 20 64 62 2d 3e 69 6e  command.  db->in
15580 69 74 2e 62 75 73 79 20 69 73 20 31 20 77 68 65  it.busy is 1 whe
15590 6e 20 61 20 64 61 74 61 62 61 73 65 20 69 73 20  n a database is 
155a0 6f 70 65 6e 65 64 20 61 6e 64 20 0a 20 20 2a 2a  opened and .  **
155b0 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 73 74   CREATE INDEX st
155c0 61 74 65 6d 65 6e 74 73 20 61 72 65 20 72 65 61  atements are rea
155d0 64 20 6f 75 74 20 6f 66 20 74 68 65 20 6d 61 73  d out of the mas
155e0 74 65 72 20 74 61 62 6c 65 2e 20 20 49 6e 0a 20  ter table.  In. 
155f0 20 2a 2a 20 74 68 65 20 6c 61 74 74 65 72 20 63   ** the latter c
15600 61 73 65 20 74 68 65 20 69 6e 64 65 78 20 61 6c  ase the index al
15610 72 65 61 64 79 20 65 78 69 73 74 73 20 6f 6e 20  ready exists on 
15620 64 69 73 6b 2c 20 77 68 69 63 68 20 69 73 20 77  disk, which is w
15630 68 79 0a 20 20 2a 2a 20 77 65 20 64 6f 6e 27 74  hy.  ** we don't
15640 20 77 61 6e 74 20 74 6f 20 72 65 63 72 65 61 74   want to recreat
15650 65 20 69 74 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  e it..  **.  ** 
15660 49 66 20 70 54 62 6c 4e 61 6d 65 3d 3d 30 20 69  If pTblName==0 i
15670 74 20 6d 65 61 6e 73 20 74 68 69 73 20 69 6e 64  t means this ind
15680 65 78 20 69 73 20 67 65 6e 65 72 61 74 65 64 20  ex is generated 
15690 61 73 20 61 20 70 72 69 6d 61 72 79 20 6b 65 79  as a primary key
156a0 0a 20 20 2a 2a 20 6f 72 20 55 4e 49 51 55 45 20  .  ** or UNIQUE 
156b0 63 6f 6e 73 74 72 61 69 6e 74 20 6f 66 20 61 20  constraint of a 
156c0 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61  CREATE TABLE sta
156d0 74 65 6d 65 6e 74 2e 20 20 53 69 6e 63 65 20 74  tement.  Since t
156e0 68 65 20 74 61 62 6c 65 0a 20 20 2a 2a 20 68 61  he table.  ** ha
156f0 73 20 6a 75 73 74 20 62 65 65 6e 20 63 72 65 61  s just been crea
15700 74 65 64 2c 20 69 74 20 63 6f 6e 74 61 69 6e 73  ted, it contains
15710 20 6e 6f 20 64 61 74 61 20 61 6e 64 20 74 68 65   no data and the
15720 20 69 6e 64 65 78 20 69 6e 69 74 69 61 6c 69 7a   index initializ
15730 61 74 69 6f 6e 0a 20 20 2a 2a 20 73 74 65 70 20  ation.  ** step 
15740 63 61 6e 20 62 65 20 73 6b 69 70 70 65 64 2e 0a  can be skipped..
15750 20 20 2a 2f 0a 20 20 65 6c 73 65 20 69 66 28 20    */.  else if( 
15760 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d 30  db->init.busy==0
15770 20 29 7b 0a 20 20 20 20 56 64 62 65 20 2a 76 3b   ){.    Vdbe *v;
15780 0a 20 20 20 20 63 68 61 72 20 2a 7a 53 74 6d 74  .    char *zStmt
15790 3b 0a 20 20 20 20 69 6e 74 20 69 4d 65 6d 20 3d  ;.    int iMem =
157a0 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
157b0 0a 0a 20 20 20 20 76 20 3d 20 73 71 6c 69 74 65  ..    v = sqlite
157c0 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
157d0 3b 0a 20 20 20 20 69 66 28 20 76 3d 3d 30 20 29  ;.    if( v==0 )
157e0 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
157f0 65 5f 69 6e 64 65 78 3b 0a 0a 0a 20 20 20 20 2f  e_index;...    /
15800 2a 20 43 72 65 61 74 65 20 74 68 65 20 72 6f 6f  * Create the roo
15810 74 70 61 67 65 20 66 6f 72 20 74 68 65 20 69 6e  tpage for the in
15820 64 65 78 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73  dex.    */.    s
15830 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74 65  qlite3BeginWrite
15840 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65  Operation(pParse
15850 2c 20 31 2c 20 69 44 62 29 3b 0a 20 20 20 20 73  , 1, iDb);.    s
15860 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
15870 28 76 2c 20 4f 50 5f 43 72 65 61 74 65 49 6e 64  (v, OP_CreateInd
15880 65 78 2c 20 69 44 62 2c 20 69 4d 65 6d 29 3b 0a  ex, iDb, iMem);.
15890 0a 20 20 20 20 2f 2a 20 47 61 74 68 65 72 20 74  .    /* Gather t
158a0 68 65 20 63 6f 6d 70 6c 65 74 65 20 74 65 78 74  he complete text
158b0 20 6f 66 20 74 68 65 20 43 52 45 41 54 45 20 49   of the CREATE I
158c0 4e 44 45 58 20 73 74 61 74 65 6d 65 6e 74 20 69  NDEX statement i
158d0 6e 74 6f 0a 20 20 20 20 2a 2a 20 74 68 65 20 7a  nto.    ** the z
158e0 53 74 6d 74 20 76 61 72 69 61 62 6c 65 0a 20 20  Stmt variable.  
158f0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 53 74    */.    if( pSt
15900 61 72 74 20 26 26 20 70 45 6e 64 20 29 7b 0a 20  art && pEnd ){. 
15910 20 20 20 20 20 2f 2a 20 41 20 6e 61 6d 65 64 20       /* A named 
15920 69 6e 64 65 78 20 77 69 74 68 20 61 6e 20 65 78  index with an ex
15930 70 6c 69 63 69 74 20 43 52 45 41 54 45 20 49 4e  plicit CREATE IN
15940 44 45 58 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  DEX statement */
15950 0a 20 20 20 20 20 20 7a 53 74 6d 74 20 3d 20 73  .      zStmt = s
15960 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62  qlite3MPrintf(db
15970 2c 20 22 43 52 45 41 54 45 25 73 20 49 4e 44 45  , "CREATE%s INDE
15980 58 20 25 2e 2a 73 22 2c 0a 20 20 20 20 20 20 20  X %.*s",.       
15990 20 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 4e 6f 6e   onError==OE_Non
159a0 65 20 3f 20 22 22 20 3a 20 22 20 55 4e 49 51 55  e ? "" : " UNIQU
159b0 45 22 2c 0a 20 20 20 20 20 20 20 20 70 45 6e 64  E",.        pEnd
159c0 2d 3e 7a 20 2d 20 70 4e 61 6d 65 2d 3e 7a 20 2b  ->z - pName->z +
159d0 20 31 2c 0a 20 20 20 20 20 20 20 20 70 4e 61 6d   1,.        pNam
159e0 65 2d 3e 7a 29 3b 0a 20 20 20 20 7d 65 6c 73 65  e->z);.    }else
159f0 7b 0a 20 20 20 20 20 20 2f 2a 20 41 6e 20 61 75  {.      /* An au
15a00 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 63 72  tomatic index cr
15a10 65 61 74 65 64 20 62 79 20 61 20 50 52 49 4d 41  eated by a PRIMA
15a20 52 59 20 4b 45 59 20 6f 72 20 55 4e 49 51 55 45  RY KEY or UNIQUE
15a30 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 20   constraint */. 
15a40 20 20 20 20 20 2f 2a 20 7a 53 74 6d 74 20 3d 20       /* zStmt = 
15a50 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 22  sqlite3MPrintf("
15a60 22 29 3b 20 2a 2f 0a 20 20 20 20 20 20 7a 53 74  "); */.      zSt
15a70 6d 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20  mt = 0;.    }.. 
15a80 20 20 20 2f 2a 20 41 64 64 20 61 6e 20 65 6e 74     /* Add an ent
15a90 72 79 20 69 6e 20 73 71 6c 69 74 65 5f 6d 61 73  ry in sqlite_mas
15aa0 74 65 72 20 66 6f 72 20 74 68 69 73 20 69 6e 64  ter for this ind
15ab0 65 78 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71  ex.    */.    sq
15ac0 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72 73 65  lite3NestedParse
15ad0 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20  (pParse, .      
15ae0 20 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 25    "INSERT INTO %
15af0 51 2e 25 73 20 56 41 4c 55 45 53 28 27 69 6e 64  Q.%s VALUES('ind
15b00 65 78 27 2c 25 51 2c 25 51 2c 23 25 64 2c 25 51  ex',%Q,%Q,#%d,%Q
15b10 29 3b 22 2c 0a 20 20 20 20 20 20 20 20 64 62 2d  );",.        db-
15b20 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 2c  >aDb[iDb].zName,
15b30 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 44   SCHEMA_TABLE(iD
15b40 62 29 2c 0a 20 20 20 20 20 20 20 20 70 49 6e 64  b),.        pInd
15b50 65 78 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20  ex->zName,.     
15b60 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 0a     pTab->zName,.
15b70 20 20 20 20 20 20 20 20 69 4d 65 6d 2c 0a 20 20          iMem,.  
15b80 20 20 20 20 20 20 7a 53 74 6d 74 0a 20 20 20 20        zStmt.    
15b90 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  );.    sqlite3Db
15ba0 46 72 65 65 28 64 62 2c 20 7a 53 74 6d 74 29 3b  Free(db, zStmt);
15bb0 0a 0a 20 20 20 20 2f 2a 20 46 69 6c 6c 20 74 68  ..    /* Fill th
15bc0 65 20 69 6e 64 65 78 20 77 69 74 68 20 64 61 74  e index with dat
15bd0 61 20 61 6e 64 20 72 65 70 61 72 73 65 20 74 68  a and reparse th
15be0 65 20 73 63 68 65 6d 61 2e 20 43 6f 64 65 20 61  e schema. Code a
15bf0 6e 20 4f 50 5f 45 78 70 69 72 65 0a 20 20 20 20  n OP_Expire.    
15c00 2a 2a 20 74 6f 20 69 6e 76 61 6c 69 64 61 74 65  ** to invalidate
15c10 20 61 6c 6c 20 70 72 65 2d 63 6f 6d 70 69 6c 65   all pre-compile
15c20 64 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 20 20  d statements..  
15c30 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 54 62    */.    if( pTb
15c40 6c 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 73  lName ){.      s
15c50 71 6c 69 74 65 33 52 65 66 69 6c 6c 49 6e 64 65  qlite3RefillInde
15c60 78 28 70 50 61 72 73 65 2c 20 70 49 6e 64 65 78  x(pParse, pIndex
15c70 2c 20 69 4d 65 6d 29 3b 0a 20 20 20 20 20 20 73  , iMem);.      s
15c80 71 6c 69 74 65 33 43 68 61 6e 67 65 43 6f 6f 6b  qlite3ChangeCook
15c90 69 65 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b  ie(pParse, iDb);
15ca0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
15cb0 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 50  beAddOp4(v, OP_P
15cc0 61 72 73 65 53 63 68 65 6d 61 2c 20 69 44 62 2c  arseSchema, iDb,
15cd0 20 30 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20   0, 0,.         
15ce0 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64  sqlite3MPrintf(d
15cf0 62 2c 20 22 6e 61 6d 65 3d 27 25 71 27 22 2c 20  b, "name='%q'", 
15d00 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 29 2c 20  pIndex->zName), 
15d10 50 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20  P4_DYNAMIC);.   
15d20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
15d30 64 4f 70 31 28 76 2c 20 4f 50 5f 45 78 70 69 72  dOp1(v, OP_Expir
15d40 65 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  e, 0);.    }.  }
15d50 0a 0a 20 20 2f 2a 20 57 68 65 6e 20 61 64 64 69  ..  /* When addi
15d60 6e 67 20 61 6e 20 69 6e 64 65 78 20 74 6f 20 74  ng an index to t
15d70 68 65 20 6c 69 73 74 20 6f 66 20 69 6e 64 69 63  he list of indic
15d80 65 73 20 66 6f 72 20 61 20 74 61 62 6c 65 2c 20  es for a table, 
15d90 6d 61 6b 65 0a 20 20 2a 2a 20 73 75 72 65 20 61  make.  ** sure a
15da0 6c 6c 20 69 6e 64 69 63 65 73 20 6c 61 62 65 6c  ll indices label
15db0 65 64 20 4f 45 5f 52 65 70 6c 61 63 65 20 63 6f  ed OE_Replace co
15dc0 6d 65 20 61 66 74 65 72 20 61 6c 6c 20 74 68 6f  me after all tho
15dd0 73 65 20 6c 61 62 65 6c 65 64 0a 20 20 2a 2a 20  se labeled.  ** 
15de0 4f 45 5f 49 67 6e 6f 72 65 2e 20 20 54 68 69 73  OE_Ignore.  This
15df0 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 66 6f   is necessary fo
15e00 72 20 74 68 65 20 63 6f 72 72 65 63 74 20 6f 70  r the correct op
15e10 65 72 61 74 69 6f 6e 20 6f 66 20 55 50 44 41 54  eration of UPDAT
15e20 45 0a 20 20 2a 2a 20 61 6e 64 20 49 4e 53 45 52  E.  ** and INSER
15e30 54 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62  T..  */.  if( db
15e40 2d 3e 69 6e 69 74 2e 62 75 73 79 20 7c 7c 20 70  ->init.busy || p
15e50 54 62 6c 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20  TblName==0 ){.  
15e60 20 20 69 66 28 20 6f 6e 45 72 72 6f 72 21 3d 4f    if( onError!=O
15e70 45 5f 52 65 70 6c 61 63 65 20 7c 7c 20 70 54 61  E_Replace || pTa
15e80 62 2d 3e 70 49 6e 64 65 78 3d 3d 30 0a 20 20 20  b->pIndex==0.   
15e90 20 20 20 20 20 20 7c 7c 20 70 54 61 62 2d 3e 70        || pTab->p
15ea0 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d  Index->onError==
15eb0 4f 45 5f 52 65 70 6c 61 63 65 29 7b 0a 20 20 20  OE_Replace){.   
15ec0 20 20 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74     pIndex->pNext
15ed0 20 3d 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b   = pTab->pIndex;
15ee0 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 70 49 6e  .      pTab->pIn
15ef0 64 65 78 20 3d 20 70 49 6e 64 65 78 3b 0a 20 20  dex = pIndex;.  
15f00 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 49    }else{.      I
15f10 6e 64 65 78 20 2a 70 4f 74 68 65 72 20 3d 20 70  ndex *pOther = p
15f20 54 61 62 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20  Tab->pIndex;.   
15f30 20 20 20 77 68 69 6c 65 28 20 70 4f 74 68 65 72     while( pOther
15f40 2d 3e 70 4e 65 78 74 20 26 26 20 70 4f 74 68 65  ->pNext && pOthe
15f50 72 2d 3e 70 4e 65 78 74 2d 3e 6f 6e 45 72 72 6f  r->pNext->onErro
15f60 72 21 3d 4f 45 5f 52 65 70 6c 61 63 65 20 29 7b  r!=OE_Replace ){
15f70 0a 20 20 20 20 20 20 20 20 70 4f 74 68 65 72 20  .        pOther 
15f80 3d 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74 3b  = pOther->pNext;
15f90 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
15fa0 49 6e 64 65 78 2d 3e 70 4e 65 78 74 20 3d 20 70  Index->pNext = p
15fb0 4f 74 68 65 72 2d 3e 70 4e 65 78 74 3b 0a 20 20  Other->pNext;.  
15fc0 20 20 20 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78      pOther->pNex
15fd0 74 20 3d 20 70 49 6e 64 65 78 3b 0a 20 20 20 20  t = pIndex;.    
15fe0 7d 0a 20 20 20 20 70 49 6e 64 65 78 20 3d 20 30  }.    pIndex = 0
15ff0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6c 65 61  ;.  }..  /* Clea
16000 6e 20 75 70 20 62 65 66 6f 72 65 20 65 78 69 74  n up before exit
16010 69 6e 67 20 2a 2f 0a 65 78 69 74 5f 63 72 65 61  ing */.exit_crea
16020 74 65 5f 69 6e 64 65 78 3a 0a 20 20 69 66 28 20  te_index:.  if( 
16030 70 49 6e 64 65 78 20 29 7b 0a 20 20 20 20 66 72  pIndex ){.    fr
16040 65 65 49 6e 64 65 78 28 70 49 6e 64 65 78 29 3b  eeIndex(pIndex);
16050 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 78  .  }.  sqlite3Ex
16060 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c  prListDelete(db,
16070 20 70 4c 69 73 74 29 3b 0a 20 20 73 71 6c 69 74   pList);.  sqlit
16080 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28  e3SrcListDelete(
16090 64 62 2c 20 70 54 62 6c 4e 61 6d 65 29 3b 0a 20  db, pTblName);. 
160a0 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
160b0 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 72 65 74  b, zName);.  ret
160c0 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  urn;.}../*.** Ge
160d0 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 6d  nerate code to m
160e0 61 6b 65 20 73 75 72 65 20 74 68 65 20 66 69 6c  ake sure the fil
160f0 65 20 66 6f 72 6d 61 74 20 6e 75 6d 62 65 72 20  e format number 
16100 69 73 20 61 74 20 6c 65 61 73 74 20 6d 69 6e 46  is at least minF
16110 6f 72 6d 61 74 2e 0a 2a 2a 20 54 68 65 20 67 65  ormat..** The ge
16120 6e 65 72 61 74 65 64 20 63 6f 64 65 20 77 69 6c  nerated code wil
16130 6c 20 69 6e 63 72 65 61 73 65 20 74 68 65 20 66  l increase the f
16140 69 6c 65 20 66 6f 72 6d 61 74 20 6e 75 6d 62 65  ile format numbe
16150 72 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e 0a  r if necessary..
16160 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 4d  */.void sqlite3M
16170 69 6e 69 6d 75 6d 46 69 6c 65 46 6f 72 6d 61 74  inimumFileFormat
16180 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
16190 69 6e 74 20 69 44 62 2c 20 69 6e 74 20 6d 69 6e  int iDb, int min
161a0 46 6f 72 6d 61 74 29 7b 0a 20 20 56 64 62 65 20  Format){.  Vdbe 
161b0 2a 76 3b 0a 20 20 76 20 3d 20 73 71 6c 69 74 65  *v;.  v = sqlite
161c0 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
161d0 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20  ;.  if( v ){.   
161e0 20 69 6e 74 20 72 31 20 3d 20 73 71 6c 69 74 65   int r1 = sqlite
161f0 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
16200 73 65 29 3b 0a 20 20 20 20 69 6e 74 20 72 32 20  se);.    int r2 
16210 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
16220 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20  Reg(pParse);.   
16230 20 69 6e 74 20 6a 31 3b 0a 20 20 20 20 73 71 6c   int j1;.    sql
16240 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
16250 2c 20 4f 50 5f 52 65 61 64 43 6f 6f 6b 69 65 2c  , OP_ReadCookie,
16260 20 69 44 62 2c 20 72 31 2c 20 31 29 3b 0a 20 20   iDb, r1, 1);.  
16270 20 20 73 71 6c 69 74 65 33 56 64 62 65 55 73 65    sqlite3VdbeUse
16280 73 42 74 72 65 65 28 76 2c 20 69 44 62 29 3b 0a  sBtree(v, iDb);.
16290 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
162a0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
162b0 67 65 72 2c 20 6d 69 6e 46 6f 72 6d 61 74 2c 20  ger, minFormat, 
162c0 72 32 29 3b 0a 20 20 20 20 6a 31 20 3d 20 73 71  r2);.    j1 = sq
162d0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
162e0 76 2c 20 4f 50 5f 47 65 2c 20 72 32 2c 20 30 2c  v, OP_Ge, r2, 0,
162f0 20 72 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65   r1);.    sqlite
16300 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
16310 50 5f 53 65 74 43 6f 6f 6b 69 65 2c 20 69 44 62  P_SetCookie, iDb
16320 2c 20 31 2c 20 72 32 29 3b 0a 20 20 20 20 73 71  , 1, r2);.    sq
16330 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
16340 65 28 76 2c 20 6a 31 29 3b 0a 20 20 20 20 73 71  e(v, j1);.    sq
16350 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
16360 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b  Reg(pParse, r1);
16370 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65  .    sqlite3Rele
16380 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
16390 65 2c 20 72 32 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  e, r2);.  }.}../
163a0 2a 0a 2a 2a 20 46 69 6c 6c 20 74 68 65 20 49 6e  *.** Fill the In
163b0 64 65 78 2e 61 69 52 6f 77 45 73 74 5b 5d 20 61  dex.aiRowEst[] a
163c0 72 72 61 79 20 77 69 74 68 20 64 65 66 61 75 6c  rray with defaul
163d0 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2d 20  t information - 
163e0 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20 74  information.** t
163f0 6f 20 62 65 20 75 73 65 64 20 77 68 65 6e 20 77  o be used when w
16400 65 20 68 61 76 65 20 6e 6f 74 20 72 75 6e 20 74  e have not run t
16410 68 65 20 41 4e 41 4c 59 5a 45 20 63 6f 6d 6d 61  he ANALYZE comma
16420 6e 64 2e 0a 2a 2a 0a 2a 2a 20 61 69 52 6f 77 45  nd..**.** aiRowE
16430 73 74 5b 30 5d 20 69 73 20 73 75 70 70 6f 73 65  st[0] is suppose
16440 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65 20   to contain the 
16450 6e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e  number of elemen
16460 74 73 20 69 6e 20 74 68 65 20 69 6e 64 65 78 2e  ts in the index.
16470 0a 2a 2a 20 53 69 6e 63 65 20 77 65 20 64 6f 20  .** Since we do 
16480 6e 6f 74 20 6b 6e 6f 77 2c 20 67 75 65 73 73 20  not know, guess 
16490 31 20 6d 69 6c 6c 69 6f 6e 2e 20 20 61 69 52 6f  1 million.  aiRo
164a0 77 45 73 74 5b 31 5d 20 69 73 20 61 6e 20 65 73  wEst[1] is an es
164b0 74 69 6d 61 74 65 20 6f 66 20 74 68 65 0a 2a 2a  timate of the.**
164c0 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   number of rows 
164d0 69 6e 20 74 68 65 20 74 61 62 6c 65 20 74 68 61  in the table tha
164e0 74 20 6d 61 74 63 68 20 61 6e 79 20 70 61 72 74  t match any part
164f0 69 63 75 6c 61 72 20 76 61 6c 75 65 20 6f 66 20  icular value of 
16500 74 68 65 0a 2a 2a 20 66 69 72 73 74 20 63 6f 6c  the.** first col
16510 75 6d 6e 20 6f 66 20 74 68 65 20 69 6e 64 65 78  umn of the index
16520 2e 20 20 61 69 52 6f 77 45 73 74 5b 32 5d 20 69  .  aiRowEst[2] i
16530 73 20 61 6e 20 65 73 74 69 6d 61 74 65 20 6f 66  s an estimate of
16540 20 74 68 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f   the number.** o
16550 66 20 72 6f 77 73 20 74 68 61 74 20 6d 61 74 63  f rows that matc
16560 68 20 61 6e 79 20 70 61 72 74 69 63 75 6c 61 72  h any particular
16570 20 63 6f 6d 62 69 6e 69 61 74 69 6f 6e 20 6f 66   combiniation of
16580 20 74 68 65 20 66 69 72 73 74 20 32 20 63 6f 6c   the first 2 col
16590 75 6d 6e 73 0a 2a 2a 20 6f 66 20 74 68 65 20 69  umns.** of the i
165a0 6e 64 65 78 2e 20 20 41 6e 64 20 73 6f 20 66 6f  ndex.  And so fo
165b0 72 74 68 2e 20 20 49 74 20 6d 75 73 74 20 61 6c  rth.  It must al
165c0 77 61 79 73 20 62 65 20 74 68 65 20 63 61 73 65  ways be the case
165d0 20 74 68 61 74 0a 2a 0a 2a 2a 20 20 20 20 20 20   that.*.**      
165e0 20 20 20 20 20 61 69 52 6f 77 45 73 74 5b 4e 5d       aiRowEst[N]
165f0 3c 3d 61 69 52 6f 77 45 73 74 5b 4e 2d 31 5d 0a  <=aiRowEst[N-1].
16600 2a 2a 20 20 20 20 20 20 20 20 20 20 20 61 69 52  **           aiR
16610 6f 77 45 73 74 5b 4e 5d 3e 3d 31 0a 2a 2a 0a 2a  owEst[N]>=1.**.*
16620 2a 20 41 70 61 72 74 20 66 72 6f 6d 20 74 68 61  * Apart from tha
16630 74 2c 20 77 65 20 68 61 76 65 20 6c 69 74 74 6c  t, we have littl
16640 65 20 74 6f 20 67 6f 20 6f 6e 20 62 65 73 69 64  e to go on besid
16650 65 73 20 69 6e 74 75 69 74 69 6f 6e 20 61 73 20  es intuition as 
16660 74 6f 0a 2a 2a 20 68 6f 77 20 61 69 52 6f 77 45  to.** how aiRowE
16670 73 74 5b 5d 20 73 68 6f 75 6c 64 20 62 65 20 69  st[] should be i
16680 6e 69 74 69 61 6c 69 7a 65 64 2e 20 20 54 68 65  nitialized.  The
16690 20 6e 75 6d 62 65 72 73 20 67 65 6e 65 72 61 74   numbers generat
166a0 65 64 20 68 65 72 65 0a 2a 2a 20 61 72 65 20 62  ed here.** are b
166b0 61 73 65 64 20 6f 6e 20 74 79 70 69 63 61 6c 20  ased on typical 
166c0 76 61 6c 75 65 73 20 66 6f 75 6e 64 20 69 6e 20  values found in 
166d0 61 63 74 75 61 6c 20 69 6e 64 69 63 65 73 2e 0a  actual indices..
166e0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 44  */.void sqlite3D
166f0 65 66 61 75 6c 74 52 6f 77 45 73 74 28 49 6e 64  efaultRowEst(Ind
16700 65 78 20 2a 70 49 64 78 29 7b 0a 20 20 75 6e 73  ex *pIdx){.  uns
16710 69 67 6e 65 64 20 2a 61 20 3d 20 70 49 64 78 2d  igned *a = pIdx-
16720 3e 61 69 52 6f 77 45 73 74 3b 0a 20 20 69 6e 74  >aiRowEst;.  int
16730 20 69 3b 0a 20 20 61 73 73 65 72 74 28 20 61 21   i;.  assert( a!
16740 3d 30 20 29 3b 0a 20 20 61 5b 30 5d 20 3d 20 31  =0 );.  a[0] = 1
16750 30 30 30 30 30 30 3b 0a 20 20 66 6f 72 28 69 3d  000000;.  for(i=
16760 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69  pIdx->nColumn; i
16770 3e 3d 35 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 61  >=5; i--){.    a
16780 5b 69 5d 20 3d 20 35 3b 0a 20 20 7d 0a 20 20 77  [i] = 5;.  }.  w
16790 68 69 6c 65 28 20 69 3e 3d 31 20 29 7b 0a 20 20  hile( i>=1 ){.  
167a0 20 20 61 5b 69 5d 20 3d 20 31 31 20 2d 20 69 3b    a[i] = 11 - i;
167b0 0a 20 20 20 20 69 2d 2d 3b 0a 20 20 7d 0a 20 20  .    i--;.  }.  
167c0 69 66 28 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f  if( pIdx->onErro
167d0 72 21 3d 4f 45 5f 4e 6f 6e 65 20 29 7b 0a 20 20  r!=OE_None ){.  
167e0 20 20 61 5b 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d    a[pIdx->nColum
167f0 6e 5d 20 3d 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f  n] = 1;.  }.}../
16800 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
16810 65 20 77 69 6c 6c 20 64 72 6f 70 20 61 6e 20 65  e will drop an e
16820 78 69 73 74 69 6e 67 20 6e 61 6d 65 64 20 69 6e  xisting named in
16830 64 65 78 2e 20 20 54 68 69 73 20 72 6f 75 74 69  dex.  This routi
16840 6e 65 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 73  ne.** implements
16850 20 74 68 65 20 44 52 4f 50 20 49 4e 44 45 58 20   the DROP INDEX 
16860 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f  statement..*/.vo
16870 69 64 20 73 71 6c 69 74 65 33 44 72 6f 70 49 6e  id sqlite3DropIn
16880 64 65 78 28 50 61 72 73 65 20 2a 70 50 61 72 73  dex(Parse *pPars
16890 65 2c 20 53 72 63 4c 69 73 74 20 2a 70 4e 61 6d  e, SrcList *pNam
168a0 65 2c 20 69 6e 74 20 69 66 45 78 69 73 74 73 29  e, int ifExists)
168b0 7b 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65  {.  Index *pInde
168c0 78 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20  x;.  Vdbe *v;.  
168d0 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
168e0 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20  arse->db;.  int 
168f0 69 44 62 3b 0a 0a 20 20 69 66 28 20 70 50 61 72  iDb;..  if( pPar
16900 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 64 62 2d 3e  se->nErr || db->
16910 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
16920 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72      goto exit_dr
16930 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20  op_index;.  }.  
16940 61 73 73 65 72 74 28 20 70 4e 61 6d 65 2d 3e 6e  assert( pName->n
16950 53 72 63 3d 3d 31 20 29 3b 0a 20 20 69 66 28 20  Src==1 );.  if( 
16960 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74  SQLITE_OK!=sqlit
16970 65 33 52 65 61 64 53 63 68 65 6d 61 28 70 50 61  e3ReadSchema(pPa
16980 72 73 65 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f  rse) ){.    goto
16990 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78   exit_drop_index
169a0 3b 0a 20 20 7d 0a 20 20 70 49 6e 64 65 78 20 3d  ;.  }.  pIndex =
169b0 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 64 65   sqlite3FindInde
169c0 78 28 64 62 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30  x(db, pName->a[0
169d0 5d 2e 7a 4e 61 6d 65 2c 20 70 4e 61 6d 65 2d 3e  ].zName, pName->
169e0 61 5b 30 5d 2e 7a 44 61 74 61 62 61 73 65 29 3b  a[0].zDatabase);
169f0 0a 20 20 69 66 28 20 70 49 6e 64 65 78 3d 3d 30  .  if( pIndex==0
16a00 20 29 7b 0a 20 20 20 20 69 66 28 20 21 69 66 45   ){.    if( !ifE
16a10 78 69 73 74 73 20 29 7b 0a 20 20 20 20 20 20 73  xists ){.      s
16a20 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
16a30 50 61 72 73 65 2c 20 22 6e 6f 20 73 75 63 68 20  Parse, "no such 
16a40 69 6e 64 65 78 3a 20 25 53 22 2c 20 70 4e 61 6d  index: %S", pNam
16a50 65 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20  e, 0);.    }.   
16a60 20 70 50 61 72 73 65 2d 3e 63 68 65 63 6b 53 63   pParse->checkSc
16a70 68 65 6d 61 20 3d 20 31 3b 0a 20 20 20 20 67 6f  hema = 1;.    go
16a80 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64  to exit_drop_ind
16a90 65 78 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 49  ex;.  }.  if( pI
16aa0 6e 64 65 78 2d 3e 61 75 74 6f 49 6e 64 65 78 20  ndex->autoIndex 
16ab0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
16ac0 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
16ad0 69 6e 64 65 78 20 61 73 73 6f 63 69 61 74 65 64  index associated
16ae0 20 77 69 74 68 20 55 4e 49 51 55 45 20 22 0a 20   with UNIQUE ". 
16af0 20 20 20 20 20 22 6f 72 20 50 52 49 4d 41 52 59       "or PRIMARY
16b00 20 4b 45 59 20 63 6f 6e 73 74 72 61 69 6e 74 20   KEY constraint 
16b10 63 61 6e 6e 6f 74 20 62 65 20 64 72 6f 70 70 65  cannot be droppe
16b20 64 22 2c 20 30 29 3b 0a 20 20 20 20 67 6f 74 6f  d", 0);.    goto
16b30 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78   exit_drop_index
16b40 3b 0a 20 20 7d 0a 20 20 69 44 62 20 3d 20 73 71  ;.  }.  iDb = sq
16b50 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64  lite3SchemaToInd
16b60 65 78 28 64 62 2c 20 70 49 6e 64 65 78 2d 3e 70  ex(db, pIndex->p
16b70 53 63 68 65 6d 61 29 3b 0a 23 69 66 6e 64 65 66  Schema);.#ifndef
16b80 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
16b90 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 7b 0a 20  HORIZATION.  {. 
16ba0 20 20 20 69 6e 74 20 63 6f 64 65 20 3d 20 53 51     int code = SQ
16bb0 4c 49 54 45 5f 44 52 4f 50 5f 49 4e 44 45 58 3b  LITE_DROP_INDEX;
16bc0 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62  .    Table *pTab
16bd0 20 3d 20 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c   = pIndex->pTabl
16be0 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  e;.    const cha
16bf0 72 20 2a 7a 44 62 20 3d 20 64 62 2d 3e 61 44 62  r *zDb = db->aDb
16c00 5b 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20  [iDb].zName;.   
16c10 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61   const char *zTa
16c20 62 20 3d 20 53 43 48 45 4d 41 5f 54 41 42 4c 45  b = SCHEMA_TABLE
16c30 28 69 44 62 29 3b 0a 20 20 20 20 69 66 28 20 73  (iDb);.    if( s
16c40 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28  qlite3AuthCheck(
16c50 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 44  pParse, SQLITE_D
16c60 45 4c 45 54 45 2c 20 7a 54 61 62 2c 20 30 2c 20  ELETE, zTab, 0, 
16c70 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f  zDb) ){.      go
16c80 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64  to exit_drop_ind
16c90 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ex;.    }.    if
16ca0 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26  ( !OMIT_TEMPDB &
16cb0 26 20 69 44 62 20 29 20 63 6f 64 65 20 3d 20 53  & iDb ) code = S
16cc0 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f  QLITE_DROP_TEMP_
16cd0 49 4e 44 45 58 3b 0a 20 20 20 20 69 66 28 20 73  INDEX;.    if( s
16ce0 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28  qlite3AuthCheck(
16cf0 70 50 61 72 73 65 2c 20 63 6f 64 65 2c 20 70 49  pParse, code, pI
16d00 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 70 54 61  ndex->zName, pTa
16d10 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 44 62 29 20 29  b->zName, zDb) )
16d20 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69  {.      goto exi
16d30 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20  t_drop_index;.  
16d40 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a    }.  }.#endif..
16d50 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f    /* Generate co
16d60 64 65 20 74 6f 20 72 65 6d 6f 76 65 20 74 68 65  de to remove the
16d70 20 69 6e 64 65 78 20 61 6e 64 20 66 72 6f 6d 20   index and from 
16d80 74 68 65 20 6d 61 73 74 65 72 20 74 61 62 6c 65  the master table
16d90 20 2a 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74 65   */.  v = sqlite
16da0 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
16db0 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20  ;.  if( v ){.   
16dc0 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69   sqlite3BeginWri
16dd0 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72  teOperation(pPar
16de0 73 65 2c 20 31 2c 20 69 44 62 29 3b 0a 20 20 20  se, 1, iDb);.   
16df0 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61   sqlite3NestedPa
16e00 72 73 65 28 70 50 61 72 73 65 2c 0a 20 20 20 20  rse(pParse,.    
16e10 20 20 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20     "DELETE FROM 
16e20 25 51 2e 25 73 20 57 48 45 52 45 20 6e 61 6d 65  %Q.%s WHERE name
16e30 3d 25 51 22 2c 0a 20 20 20 20 20 20 20 64 62 2d  =%Q",.       db-
16e40 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 2c  >aDb[iDb].zName,
16e50 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 44   SCHEMA_TABLE(iD
16e60 62 29 2c 0a 20 20 20 20 20 20 20 70 49 6e 64 65  b),.       pInde
16e70 78 2d 3e 7a 4e 61 6d 65 0a 20 20 20 20 29 3b 0a  x->zName.    );.
16e80 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 46      if( sqlite3F
16e90 69 6e 64 54 61 62 6c 65 28 64 62 2c 20 22 73 71  indTable(db, "sq
16ea0 6c 69 74 65 5f 73 74 61 74 31 22 2c 20 64 62 2d  lite_stat1", db-
16eb0 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 29  >aDb[iDb].zName)
16ec0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
16ed0 33 4e 65 73 74 65 64 50 61 72 73 65 28 70 50 61  3NestedParse(pPa
16ee0 72 73 65 2c 0a 20 20 20 20 20 20 20 20 22 44 45  rse,.        "DE
16ef0 4c 45 54 45 20 46 52 4f 4d 20 25 51 2e 73 71 6c  LETE FROM %Q.sql
16f00 69 74 65 5f 73 74 61 74 31 20 57 48 45 52 45 20  ite_stat1 WHERE 
16f10 69 64 78 3d 25 51 22 2c 0a 20 20 20 20 20 20 20  idx=%Q",.       
16f20 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e   db->aDb[iDb].zN
16f30 61 6d 65 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61  ame, pIndex->zNa
16f40 6d 65 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20  me.      );.    
16f50 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 43 68 61  }.    sqlite3Cha
16f60 6e 67 65 43 6f 6f 6b 69 65 28 70 50 61 72 73 65  ngeCookie(pParse
16f70 2c 20 69 44 62 29 3b 0a 20 20 20 20 64 65 73 74  , iDb);.    dest
16f80 72 6f 79 52 6f 6f 74 50 61 67 65 28 70 50 61 72  royRootPage(pPar
16f90 73 65 2c 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d  se, pIndex->tnum
16fa0 2c 20 69 44 62 29 3b 0a 20 20 20 20 73 71 6c 69  , iDb);.    sqli
16fb0 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
16fc0 20 4f 50 5f 44 72 6f 70 49 6e 64 65 78 2c 20 69   OP_DropIndex, i
16fd0 44 62 2c 20 30 2c 20 30 2c 20 70 49 6e 64 65 78  Db, 0, 0, pIndex
16fe0 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 7d  ->zName, 0);.  }
16ff0 0a 0a 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65  ..exit_drop_inde
17000 78 3a 0a 20 20 73 71 6c 69 74 65 33 53 72 63 4c  x:.  sqlite3SrcL
17010 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 4e  istDelete(db, pN
17020 61 6d 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70  ame);.}../*.** p
17030 41 72 72 61 79 20 69 73 20 61 20 70 6f 69 6e 74  Array is a point
17040 65 72 20 74 6f 20 61 6e 20 61 72 72 61 79 20 6f  er to an array o
17050 66 20 6f 62 6a 65 63 74 73 2e 20 20 45 61 63 68  f objects.  Each
17060 20 6f 62 6a 65 63 74 20 69 6e 20 74 68 65 0a 2a   object in the.*
17070 2a 20 61 72 72 61 79 20 69 73 20 73 7a 45 6e 74  * array is szEnt
17080 72 79 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65  ry bytes in size
17090 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
170a0 61 6c 6c 6f 63 61 74 65 73 20 61 20 6e 65 77 0a  allocates a new.
170b0 2a 2a 20 6f 62 6a 65 63 74 20 6f 6e 20 74 68 65  ** object on the
170c0 20 65 6e 64 20 6f 66 20 74 68 65 20 61 72 72 61   end of the arra
170d0 79 2e 0a 2a 2a 0a 2a 2a 20 2a 70 6e 45 6e 74 72  y..**.** *pnEntr
170e0 79 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  y is the number 
170f0 6f 66 20 65 6e 74 72 69 65 73 20 61 6c 72 65 61  of entries alrea
17100 64 79 20 69 6e 20 75 73 65 2e 20 20 2a 70 6e 41  dy in use.  *pnA
17110 6c 6c 6f 63 20 69 73 0a 2a 2a 20 74 68 65 20 70  lloc is.** the p
17120 72 65 76 69 6f 75 73 6c 79 20 61 6c 6c 6f 63 61  reviously alloca
17130 74 65 64 20 73 69 7a 65 20 6f 66 20 74 68 65 20  ted size of the 
17140 61 72 72 61 79 2e 20 20 69 6e 69 74 53 69 7a 65  array.  initSize
17150 20 69 73 20 74 68 65 0a 2a 2a 20 73 75 67 67 65   is the.** sugge
17160 73 74 65 64 20 69 6e 69 74 69 61 6c 20 61 72 72  sted initial arr
17170 61 79 20 73 69 7a 65 20 61 6c 6c 6f 63 61 74 69  ay size allocati
17180 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6e  on..**.** The in
17190 64 65 78 20 6f 66 20 74 68 65 20 6e 65 77 20 65  dex of the new e
171a0 6e 74 72 79 20 69 73 20 72 65 74 75 72 6e 65 64  ntry is returned
171b0 20 69 6e 20 2a 70 49 64 78 2e 0a 2a 2a 0a 2a 2a   in *pIdx..**.**
171c0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   This routine re
171d0 74 75 72 6e 73 20 61 20 70 6f 69 6e 74 65 72 20  turns a pointer 
171e0 74 6f 20 74 68 65 20 61 72 72 61 79 20 6f 66 20  to the array of 
171f0 6f 62 6a 65 63 74 73 2e 20 20 54 68 69 73 0a 2a  objects.  This.*
17200 2a 20 6d 69 67 68 74 20 62 65 20 74 68 65 20 73  * might be the s
17210 61 6d 65 20 61 73 20 74 68 65 20 70 41 72 72 61  ame as the pArra
17220 79 20 70 61 72 61 6d 65 74 65 72 20 6f 72 20 69  y parameter or i
17230 74 20 6d 69 67 68 74 20 62 65 20 61 20 64 69 66  t might be a dif
17240 66 65 72 65 6e 74 0a 2a 2a 20 70 6f 69 6e 74 65  ferent.** pointe
17250 72 20 69 66 20 74 68 65 20 61 72 72 61 79 20 77  r if the array w
17260 61 73 20 72 65 73 69 7a 65 64 2e 0a 2a 2f 0a 76  as resized..*/.v
17270 6f 69 64 20 2a 73 71 6c 69 74 65 33 41 72 72 61  oid *sqlite3Arra
17280 79 41 6c 6c 6f 63 61 74 65 28 0a 20 20 73 71 6c  yAllocate(.  sql
17290 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 2f  ite3 *db,      /
172a0 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20  * Connection to 
172b0 6e 6f 74 69 66 79 20 6f 66 20 6d 61 6c 6c 6f 63  notify of malloc
172c0 20 66 61 69 6c 75 72 65 73 20 2a 2f 0a 20 20 76   failures */.  v
172d0 6f 69 64 20 2a 70 41 72 72 61 79 2c 20 20 20 20  oid *pArray,    
172e0 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 6f 62 6a   /* Array of obj
172f0 65 63 74 73 2e 20 20 4d 69 67 68 74 20 62 65 20  ects.  Might be 
17300 72 65 61 6c 6c 6f 63 61 74 65 64 20 2a 2f 0a 20  reallocated */. 
17310 20 69 6e 74 20 73 7a 45 6e 74 72 79 2c 20 20 20   int szEntry,   
17320 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 65 61     /* Size of ea
17330 63 68 20 6f 62 6a 65 63 74 20 69 6e 20 74 68 65  ch object in the
17340 20 61 72 72 61 79 20 2a 2f 0a 20 20 69 6e 74 20   array */.  int 
17350 69 6e 69 74 53 69 7a 65 2c 20 20 20 20 20 2f 2a  initSize,     /*
17360 20 53 75 67 67 65 73 74 65 64 20 69 6e 69 74 69   Suggested initi
17370 61 6c 20 61 6c 6c 6f 63 61 74 69 6f 6e 2c 20 69  al allocation, i
17380 6e 20 65 6c 65 6d 65 6e 74 73 20 2a 2f 0a 20 20  n elements */.  
17390 69 6e 74 20 2a 70 6e 45 6e 74 72 79 2c 20 20 20  int *pnEntry,   
173a0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6f    /* Number of o
173b0 62 6a 65 63 74 73 20 63 75 72 72 65 6e 74 6c 79  bjects currently
173c0 20 69 6e 20 75 73 65 20 2a 2f 0a 20 20 69 6e 74   in use */.  int
173d0 20 2a 70 6e 41 6c 6c 6f 63 2c 20 20 20 20 20 2f   *pnAlloc,     /
173e0 2a 20 43 75 72 72 65 6e 74 20 73 69 7a 65 20 6f  * Current size o
173f0 66 20 74 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e  f the allocation
17400 2c 20 69 6e 20 65 6c 65 6d 65 6e 74 73 20 2a 2f  , in elements */
17410 0a 20 20 69 6e 74 20 2a 70 49 64 78 20 20 20 20  .  int *pIdx    
17420 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68       /* Write th
17430 65 20 69 6e 64 65 78 20 6f 66 20 61 20 6e 65 77  e index of a new
17440 20 73 6c 6f 74 20 68 65 72 65 20 2a 2f 0a 29 7b   slot here */.){
17450 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 69 66  .  char *z;.  if
17460 28 20 2a 70 6e 45 6e 74 72 79 20 3e 3d 20 2a 70  ( *pnEntry >= *p
17470 6e 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 76 6f  nAlloc ){.    vo
17480 69 64 20 2a 70 4e 65 77 3b 0a 20 20 20 20 69 6e  id *pNew;.    in
17490 74 20 6e 65 77 53 69 7a 65 3b 0a 20 20 20 20 6e  t newSize;.    n
174a0 65 77 53 69 7a 65 20 3d 20 28 2a 70 6e 41 6c 6c  ewSize = (*pnAll
174b0 6f 63 29 2a 32 20 2b 20 69 6e 69 74 53 69 7a 65  oc)*2 + initSize
174c0 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c  ;.    pNew = sql
174d0 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 28 64 62  ite3DbRealloc(db
174e0 2c 20 70 41 72 72 61 79 2c 20 6e 65 77 53 69 7a  , pArray, newSiz
174f0 65 2a 73 7a 45 6e 74 72 79 29 3b 0a 20 20 20 20  e*szEntry);.    
17500 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20  if( pNew==0 ){. 
17510 20 20 20 20 20 2a 70 49 64 78 20 3d 20 2d 31 3b       *pIdx = -1;
17520 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 41  .      return pA
17530 72 72 61 79 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rray;.    }.    
17540 2a 70 6e 41 6c 6c 6f 63 20 3d 20 6e 65 77 53 69  *pnAlloc = newSi
17550 7a 65 3b 0a 20 20 20 20 70 41 72 72 61 79 20 3d  ze;.    pArray =
17560 20 70 4e 65 77 3b 0a 20 20 7d 0a 20 20 7a 20 3d   pNew;.  }.  z =
17570 20 28 63 68 61 72 2a 29 70 41 72 72 61 79 3b 0a   (char*)pArray;.
17580 20 20 6d 65 6d 73 65 74 28 26 7a 5b 2a 70 6e 45    memset(&z[*pnE
17590 6e 74 72 79 20 2a 20 73 7a 45 6e 74 72 79 5d 2c  ntry * szEntry],
175a0 20 30 2c 20 73 7a 45 6e 74 72 79 29 3b 0a 20 20   0, szEntry);.  
175b0 2a 70 49 64 78 20 3d 20 2a 70 6e 45 6e 74 72 79  *pIdx = *pnEntry
175c0 3b 0a 20 20 2b 2b 2a 70 6e 45 6e 74 72 79 3b 0a  ;.  ++*pnEntry;.
175d0 20 20 72 65 74 75 72 6e 20 70 41 72 72 61 79 3b    return pArray;
175e0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64  .}../*.** Append
175f0 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20 74   a new element t
17600 6f 20 74 68 65 20 67 69 76 65 6e 20 49 64 4c 69  o the given IdLi
17610 73 74 2e 20 20 43 72 65 61 74 65 20 61 20 6e 65  st.  Create a ne
17620 77 20 49 64 4c 69 73 74 20 69 66 0a 2a 2a 20 6e  w IdList if.** n
17630 65 65 64 20 62 65 2e 0a 2a 2a 0a 2a 2a 20 41 20  eed be..**.** A 
17640 6e 65 77 20 49 64 4c 69 73 74 20 69 73 20 72 65  new IdList is re
17650 74 75 72 6e 65 64 2c 20 6f 72 20 4e 55 4c 4c 20  turned, or NULL 
17660 69 66 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c  if malloc() fail
17670 73 2e 0a 2a 2f 0a 49 64 4c 69 73 74 20 2a 73 71  s..*/.IdList *sq
17680 6c 69 74 65 33 49 64 4c 69 73 74 41 70 70 65 6e  lite3IdListAppen
17690 64 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 49  d(sqlite3 *db, I
176a0 64 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 54 6f  dList *pList, To
176b0 6b 65 6e 20 2a 70 54 6f 6b 65 6e 29 7b 0a 20 20  ken *pToken){.  
176c0 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 4c 69  int i;.  if( pLi
176d0 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4c 69  st==0 ){.    pLi
176e0 73 74 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  st = sqlite3DbMa
176f0 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a  llocZero(db, siz
17700 65 6f 66 28 49 64 4c 69 73 74 29 20 29 3b 0a 20  eof(IdList) );. 
17710 20 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20     if( pList==0 
17720 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20  ) return 0;.    
17730 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20 3d 20  pList->nAlloc = 
17740 30 3b 0a 20 20 7d 0a 20 20 70 4c 69 73 74 2d 3e  0;.  }.  pList->
17750 61 20 3d 20 73 71 6c 69 74 65 33 41 72 72 61 79  a = sqlite3Array
17760 41 6c 6c 6f 63 61 74 65 28 0a 20 20 20 20 20 20  Allocate(.      
17770 64 62 2c 0a 20 20 20 20 20 20 70 4c 69 73 74 2d  db,.      pList-
17780 3e 61 2c 0a 20 20 20 20 20 20 73 69 7a 65 6f 66  >a,.      sizeof
17790 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 29 2c 0a 20  (pList->a[0]),. 
177a0 20 20 20 20 20 35 2c 0a 20 20 20 20 20 20 26 70       5,.      &p
177b0 4c 69 73 74 2d 3e 6e 49 64 2c 0a 20 20 20 20 20  List->nId,.     
177c0 20 26 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 2c   &pList->nAlloc,
177d0 0a 20 20 20 20 20 20 26 69 0a 20 20 29 3b 0a 20  .      &i.  );. 
177e0 20 69 66 28 20 69 3c 30 20 29 7b 0a 20 20 20 20   if( i<0 ){.    
177f0 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44 65 6c  sqlite3IdListDel
17800 65 74 65 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a  ete(db, pList);.
17810 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
17820 7d 0a 20 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  }.  pList->a[i].
17830 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e  zName = sqlite3N
17840 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c  ameFromToken(db,
17850 20 70 54 6f 6b 65 6e 29 3b 0a 20 20 72 65 74 75   pToken);.  retu
17860 72 6e 20 70 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a  rn pList;.}../*.
17870 2a 2a 20 44 65 6c 65 74 65 20 61 6e 20 49 64 4c  ** Delete an IdL
17880 69 73 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ist..*/.void sql
17890 69 74 65 33 49 64 4c 69 73 74 44 65 6c 65 74 65  ite3IdListDelete
178a0 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 49 64  (sqlite3 *db, Id
178b0 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20  List *pList){.  
178c0 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 4c 69  int i;.  if( pLi
178d0 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  st==0 ) return;.
178e0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69    for(i=0; i<pLi
178f0 73 74 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20  st->nId; i++){. 
17900 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
17910 28 64 62 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d  (db, pList->a[i]
17920 2e 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 73  .zName);.  }.  s
17930 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
17940 20 70 4c 69 73 74 2d 3e 61 29 3b 0a 20 20 73 71   pList->a);.  sq
17950 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
17960 70 4c 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pList);.}../*.**
17970 20 52 65 74 75 72 6e 20 74 68 65 20 69 6e 64 65   Return the inde
17980 78 20 69 6e 20 70 4c 69 73 74 20 6f 66 20 74 68  x in pList of th
17990 65 20 69 64 65 6e 74 69 66 69 65 72 20 6e 61 6d  e identifier nam
179a0 65 64 20 7a 49 64 2e 20 20 52 65 74 75 72 6e 20  ed zId.  Return 
179b0 2d 31 0a 2a 2a 20 69 66 20 6e 6f 74 20 66 6f 75  -1.** if not fou
179c0 6e 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  nd..*/.int sqlit
179d0 65 33 49 64 4c 69 73 74 49 6e 64 65 78 28 49 64  e3IdListIndex(Id
179e0 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 63 6f 6e  List *pList, con
179f0 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b  st char *zName){
17a00 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20  .  int i;.  if( 
17a10 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72  pList==0 ) retur
17a20 6e 20 2d 31 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  n -1;.  for(i=0;
17a30 20 69 3c 70 4c 69 73 74 2d 3e 6e 49 64 3b 20 69   i<pList->nId; i
17a40 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c  ++){.    if( sql
17a50 69 74 65 33 53 74 72 49 43 6d 70 28 70 4c 69 73  ite3StrICmp(pLis
17a60 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 7a  t->a[i].zName, z
17a70 4e 61 6d 65 29 3d 3d 30 20 29 20 72 65 74 75 72  Name)==0 ) retur
17a80 6e 20 69 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  n i;.  }.  retur
17a90 6e 20 2d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  n -1;.}../*.** A
17aa0 70 70 65 6e 64 20 61 20 6e 65 77 20 74 61 62 6c  ppend a new tabl
17ab0 65 20 6e 61 6d 65 20 74 6f 20 74 68 65 20 67 69  e name to the gi
17ac0 76 65 6e 20 53 72 63 4c 69 73 74 2e 20 20 43 72  ven SrcList.  Cr
17ad0 65 61 74 65 20 61 20 6e 65 77 20 53 72 63 4c 69  eate a new SrcLi
17ae0 73 74 20 69 66 0a 2a 2a 20 6e 65 65 64 20 62 65  st if.** need be
17af0 2e 20 20 41 20 6e 65 77 20 65 6e 74 72 79 20 69  .  A new entry i
17b00 73 20 63 72 65 61 74 65 64 20 69 6e 20 74 68 65  s created in the
17b10 20 53 72 63 4c 69 73 74 20 65 76 65 6e 20 69 66   SrcList even if
17b20 20 70 54 6f 6b 65 6e 20 69 73 20 4e 55 4c 4c 2e   pToken is NULL.
17b30 0a 2a 2a 0a 2a 2a 20 41 20 6e 65 77 20 53 72 63  .**.** A new Src
17b40 4c 69 73 74 20 69 73 20 72 65 74 75 72 6e 65 64  List is returned
17b50 2c 20 6f 72 20 4e 55 4c 4c 20 69 66 20 6d 61 6c  , or NULL if mal
17b60 6c 6f 63 28 29 20 66 61 69 6c 73 2e 0a 2a 2a 0a  loc() fails..**.
17b70 2a 2a 20 49 66 20 70 44 61 74 61 62 61 73 65 20  ** If pDatabase 
17b80 69 73 20 6e 6f 74 20 6e 75 6c 6c 2c 20 69 74 20  is not null, it 
17b90 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 74  means that the t
17ba0 61 62 6c 65 20 68 61 73 20 61 6e 20 6f 70 74 69  able has an opti
17bb0 6f 6e 61 6c 0a 2a 2a 20 64 61 74 61 62 61 73 65  onal.** database
17bc0 20 6e 61 6d 65 20 70 72 65 66 69 78 2e 20 20 4c   name prefix.  L
17bd0 69 6b 65 20 74 68 69 73 3a 20 20 22 64 61 74 61  ike this:  "data
17be0 62 61 73 65 2e 74 61 62 6c 65 22 2e 20 20 54 68  base.table".  Th
17bf0 65 20 70 44 61 74 61 62 61 73 65 0a 2a 2a 20 70  e pDatabase.** p
17c00 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 74 61 62  oints to the tab
17c10 6c 65 20 6e 61 6d 65 20 61 6e 64 20 74 68 65 20  le name and the 
17c20 70 54 61 62 6c 65 20 70 6f 69 6e 74 73 20 74 6f  pTable points to
17c30 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6e 61   the database na
17c40 6d 65 2e 0a 2a 2a 20 54 68 65 20 53 72 63 4c 69  me..** The SrcLi
17c50 73 74 2e 61 5b 5d 2e 7a 4e 61 6d 65 20 66 69 65  st.a[].zName fie
17c60 6c 64 20 69 73 20 66 69 6c 6c 65 64 20 77 69 74  ld is filled wit
17c70 68 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65  h the table name
17c80 20 77 68 69 63 68 20 6d 69 67 68 74 0a 2a 2a 20   which might.** 
17c90 63 6f 6d 65 20 66 72 6f 6d 20 70 54 61 62 6c 65  come from pTable
17ca0 20 28 69 66 20 70 44 61 74 61 62 61 73 65 20 69   (if pDatabase i
17cb0 73 20 4e 55 4c 4c 29 20 6f 72 20 66 72 6f 6d 20  s NULL) or from 
17cc0 70 44 61 74 61 62 61 73 65 2e 20 20 0a 2a 2a 20  pDatabase.  .** 
17cd0 53 72 63 4c 69 73 74 2e 61 5b 5d 2e 7a 44 61 74  SrcList.a[].zDat
17ce0 61 62 61 73 65 20 69 73 20 66 69 6c 6c 65 64 20  abase is filled 
17cf0 77 69 74 68 20 74 68 65 20 64 61 74 61 62 61 73  with the databas
17d00 65 20 6e 61 6d 65 20 66 72 6f 6d 20 70 54 61 62  e name from pTab
17d10 6c 65 2c 0a 2a 2a 20 6f 72 20 77 69 74 68 20 4e  le,.** or with N
17d20 55 4c 4c 20 69 66 20 6e 6f 20 64 61 74 61 62 61  ULL if no databa
17d30 73 65 20 69 73 20 73 70 65 63 69 66 69 65 64 2e  se is specified.
17d40 0a 2a 2a 0a 2a 2a 20 49 6e 20 6f 74 68 65 72 20  .**.** In other 
17d50 77 6f 72 64 73 2c 20 69 66 20 63 61 6c 6c 20 6c  words, if call l
17d60 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20  ike this:.**.** 
17d70 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53          sqlite3S
17d80 72 63 4c 69 73 74 41 70 70 65 6e 64 28 44 2c 41  rcListAppend(D,A
17d90 2c 42 2c 30 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 65  ,B,0);.**.** The
17da0 6e 20 42 20 69 73 20 61 20 74 61 62 6c 65 20 6e  n B is a table n
17db0 61 6d 65 20 61 6e 64 20 74 68 65 20 64 61 74 61  ame and the data
17dc0 62 61 73 65 20 6e 61 6d 65 20 69 73 20 75 6e 73  base name is uns
17dd0 70 65 63 69 66 69 65 64 2e 20 20 49 66 20 63 61  pecified.  If ca
17de0 6c 6c 65 64 0a 2a 2a 20 6c 69 6b 65 20 74 68 69  lled.** like thi
17df0 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20  s:.**.**        
17e00 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41   sqlite3SrcListA
17e10 70 70 65 6e 64 28 44 2c 41 2c 42 2c 43 29 3b 0a  ppend(D,A,B,C);.
17e20 2a 2a 0a 2a 2a 20 54 68 65 6e 20 43 20 69 73 20  **.** Then C is 
17e30 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 61  the table name a
17e40 6e 64 20 42 20 69 73 20 74 68 65 20 64 61 74 61  nd B is the data
17e50 62 61 73 65 20 6e 61 6d 65 2e 0a 2a 2f 0a 53 72  base name..*/.Sr
17e60 63 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 53 72  cList *sqlite3Sr
17e70 63 4c 69 73 74 41 70 70 65 6e 64 28 0a 20 20 73  cListAppend(.  s
17e80 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20  qlite3 *db,     
17e90 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e     /* Connection
17ea0 20 74 6f 20 6e 6f 74 69 66 79 20 6f 66 20 6d 61   to notify of ma
17eb0 6c 6c 6f 63 20 66 61 69 6c 75 72 65 73 20 2a 2f  lloc failures */
17ec0 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 4c 69 73  .  SrcList *pLis
17ed0 74 2c 20 20 20 20 20 2f 2a 20 41 70 70 65 6e 64  t,     /* Append
17ee0 20 74 6f 20 74 68 69 73 20 53 72 63 4c 69 73 74   to this SrcList
17ef0 2e 20 4e 55 4c 4c 20 63 72 65 61 74 65 73 20 61  . NULL creates a
17f00 20 6e 65 77 20 53 72 63 4c 69 73 74 20 2a 2f 0a   new SrcList */.
17f10 20 20 54 6f 6b 65 6e 20 2a 70 54 61 62 6c 65 2c    Token *pTable,
17f20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 74        /* Table t
17f30 6f 20 61 70 70 65 6e 64 20 2a 2f 0a 20 20 54 6f  o append */.  To
17f40 6b 65 6e 20 2a 70 44 61 74 61 62 61 73 65 20 20  ken *pDatabase  
17f50 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 6f 66    /* Database of
17f60 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 29 7b   the table */.){
17f70 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73  .  struct SrcLis
17f80 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20  t_item *pItem;. 
17f90 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b   if( pList==0 ){
17fa0 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 73 71 6c  .    pList = sql
17fb0 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f  ite3DbMallocZero
17fc0 28 64 62 2c 20 73 69 7a 65 6f 66 28 53 72 63 4c  (db, sizeof(SrcL
17fd0 69 73 74 29 20 29 3b 0a 20 20 20 20 69 66 28 20  ist) );.    if( 
17fe0 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72  pList==0 ) retur
17ff0 6e 20 30 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e  n 0;.    pList->
18000 6e 41 6c 6c 6f 63 20 3d 20 31 3b 0a 20 20 7d 0a  nAlloc = 1;.  }.
18010 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 6e 53 72    if( pList->nSr
18020 63 3e 3d 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63  c>=pList->nAlloc
18030 20 29 7b 0a 20 20 20 20 53 72 63 4c 69 73 74 20   ){.    SrcList 
18040 2a 70 4e 65 77 3b 0a 20 20 20 20 70 4c 69 73 74  *pNew;.    pList
18050 2d 3e 6e 41 6c 6c 6f 63 20 2a 3d 20 32 3b 0a 20  ->nAlloc *= 2;. 
18060 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65     pNew = sqlite
18070 33 44 62 52 65 61 6c 6c 6f 63 28 64 62 2c 20 70  3DbRealloc(db, p
18080 4c 69 73 74 2c 0a 20 20 20 20 20 20 20 20 20 20  List,.          
18090 20 20 20 20 20 73 69 7a 65 6f 66 28 2a 70 4c 69       sizeof(*pLi
180a0 73 74 29 20 2b 20 28 70 4c 69 73 74 2d 3e 6e 41  st) + (pList->nA
180b0 6c 6c 6f 63 2d 31 29 2a 73 69 7a 65 6f 66 28 70  lloc-1)*sizeof(p
180c0 4c 69 73 74 2d 3e 61 5b 30 5d 29 20 29 3b 0a 20  List->a[0]) );. 
180d0 20 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29     if( pNew==0 )
180e0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53  {.      sqlite3S
180f0 72 63 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c  rcListDelete(db,
18100 20 70 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 72   pList);.      r
18110 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20  eturn 0;.    }. 
18120 20 20 20 70 4c 69 73 74 20 3d 20 70 4e 65 77 3b     pList = pNew;
18130 0a 20 20 7d 0a 20 20 70 49 74 65 6d 20 3d 20 26  .  }.  pItem = &
18140 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e  pList->a[pList->
18150 6e 53 72 63 5d 3b 0a 20 20 6d 65 6d 73 65 74 28  nSrc];.  memset(
18160 70 49 74 65 6d 2c 20 30 2c 20 73 69 7a 65 6f 66  pItem, 0, sizeof
18170 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 29 29 3b 0a  (pList->a[0]));.
18180 20 20 69 66 28 20 70 44 61 74 61 62 61 73 65 20    if( pDatabase 
18190 26 26 20 70 44 61 74 61 62 61 73 65 2d 3e 7a 3d  && pDatabase->z=
181a0 3d 30 20 29 7b 0a 20 20 20 20 70 44 61 74 61 62  =0 ){.    pDatab
181b0 61 73 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69  ase = 0;.  }.  i
181c0 66 28 20 70 44 61 74 61 62 61 73 65 20 26 26 20  f( pDatabase && 
181d0 70 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 54 6f  pTable ){.    To
181e0 6b 65 6e 20 2a 70 54 65 6d 70 20 3d 20 70 44 61  ken *pTemp = pDa
181f0 74 61 62 61 73 65 3b 0a 20 20 20 20 70 44 61 74  tabase;.    pDat
18200 61 62 61 73 65 20 3d 20 70 54 61 62 6c 65 3b 0a  abase = pTable;.
18210 20 20 20 20 70 54 61 62 6c 65 20 3d 20 70 54 65      pTable = pTe
18220 6d 70 3b 0a 20 20 7d 0a 20 20 70 49 74 65 6d 2d  mp;.  }.  pItem-
18230 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33  >zName = sqlite3
18240 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62  NameFromToken(db
18250 2c 20 70 54 61 62 6c 65 29 3b 0a 20 20 70 49 74  , pTable);.  pIt
18260 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 20 3d 20  em->zDatabase = 
18270 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54  sqlite3NameFromT
18280 6f 6b 65 6e 28 64 62 2c 20 70 44 61 74 61 62 61  oken(db, pDataba
18290 73 65 29 3b 0a 20 20 70 49 74 65 6d 2d 3e 69 43  se);.  pItem->iC
182a0 75 72 73 6f 72 20 3d 20 2d 31 3b 0a 20 20 70 49  ursor = -1;.  pI
182b0 74 65 6d 2d 3e 69 73 50 6f 70 75 6c 61 74 65 64  tem->isPopulated
182c0 20 3d 20 30 3b 0a 20 20 70 4c 69 73 74 2d 3e 6e   = 0;.  pList->n
182d0 53 72 63 2b 2b 3b 0a 20 20 72 65 74 75 72 6e 20  Src++;.  return 
182e0 70 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  pList;.}../*.** 
182f0 41 73 73 69 67 6e 20 63 75 72 73 6f 72 73 20 74  Assign cursors t
18300 6f 20 61 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20  o all tables in 
18310 61 20 53 72 63 4c 69 73 74 0a 2a 2f 0a 76 6f 69  a SrcList.*/.voi
18320 64 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74  d sqlite3SrcList
18330 41 73 73 69 67 6e 43 75 72 73 6f 72 73 28 50 61  AssignCursors(Pa
18340 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 72 63  rse *pParse, Src
18350 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20  List *pList){.  
18360 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20  int i;.  struct 
18370 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  SrcList_item *pI
18380 74 65 6d 3b 0a 20 20 61 73 73 65 72 74 28 70 4c  tem;.  assert(pL
18390 69 73 74 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64  ist || pParse->d
183a0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
183b0 29 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 20 29  );.  if( pList )
183c0 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 70  {.    for(i=0, p
183d0 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 3b 20 69  Item=pList->a; i
183e0 3c 70 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b  <pList->nSrc; i+
183f0 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20  +, pItem++){.   
18400 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 69 43     if( pItem->iC
18410 75 72 73 6f 72 3e 3d 30 20 29 20 62 72 65 61 6b  ursor>=0 ) break
18420 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 69  ;.      pItem->i
18430 43 75 72 73 6f 72 20 3d 20 70 50 61 72 73 65 2d  Cursor = pParse-
18440 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 69  >nTab++;.      i
18450 66 28 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63  f( pItem->pSelec
18460 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  t ){.        sql
18470 69 74 65 33 53 72 63 4c 69 73 74 41 73 73 69 67  ite3SrcListAssig
18480 6e 43 75 72 73 6f 72 73 28 70 50 61 72 73 65 2c  nCursors(pParse,
18490 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 2d   pItem->pSelect-
184a0 3e 70 53 72 63 29 3b 0a 20 20 20 20 20 20 7d 0a  >pSrc);.      }.
184b0 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
184c0 2a 2a 20 44 65 6c 65 74 65 20 61 6e 20 65 6e 74  ** Delete an ent
184d0 69 72 65 20 53 72 63 4c 69 73 74 20 69 6e 63 6c  ire SrcList incl
184e0 75 64 69 6e 67 20 61 6c 6c 20 69 74 73 20 73 75  uding all its su
184f0 62 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 76  bstructure..*/.v
18500 6f 69 64 20 73 71 6c 69 74 65 33 53 72 63 4c 69  oid sqlite3SrcLi
18510 73 74 44 65 6c 65 74 65 28 73 71 6c 69 74 65 33  stDelete(sqlite3
18520 20 2a 64 62 2c 20 53 72 63 4c 69 73 74 20 2a 70   *db, SrcList *p
18530 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  List){.  int i;.
18540 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
18550 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20  _item *pItem;.  
18560 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72  if( pList==0 ) r
18570 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 70 49 74  eturn;.  for(pIt
18580 65 6d 3d 70 4c 69 73 74 2d 3e 61 2c 20 69 3d 30  em=pList->a, i=0
18590 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 53 72 63 3b  ; i<pList->nSrc;
185a0 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a   i++, pItem++){.
185b0 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
185c0 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 7a 44 61  e(db, pItem->zDa
185d0 74 61 62 61 73 65 29 3b 0a 20 20 20 20 73 71 6c  tabase);.    sql
185e0 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
185f0 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  Item->zName);.  
18600 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
18610 64 62 2c 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61  db, pItem->zAlia
18620 73 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  s);.    sqlite3D
18630 65 6c 65 74 65 54 61 62 6c 65 28 70 49 74 65 6d  eleteTable(pItem
18640 2d 3e 70 54 61 62 29 3b 0a 20 20 20 20 73 71 6c  ->pTab);.    sql
18650 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65  ite3SelectDelete
18660 28 64 62 2c 20 70 49 74 65 6d 2d 3e 70 53 65 6c  (db, pItem->pSel
18670 65 63 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ect);.    sqlite
18680 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20  3ExprDelete(db, 
18690 70 49 74 65 6d 2d 3e 70 4f 6e 29 3b 0a 20 20 20  pItem->pOn);.   
186a0 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44 65   sqlite3IdListDe
186b0 6c 65 74 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e  lete(db, pItem->
186c0 70 55 73 69 6e 67 29 3b 0a 20 20 7d 0a 20 20 73  pUsing);.  }.  s
186d0 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
186e0 20 70 4c 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a   pList);.}../*.*
186f0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
18700 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20  s called by the 
18710 70 61 72 73 65 72 20 74 6f 20 61 64 64 20 61 20  parser to add a 
18720 6e 65 77 20 74 65 72 6d 20 74 6f 20 74 68 65 0a  new term to the.
18730 2a 2a 20 65 6e 64 20 6f 66 20 61 20 67 72 6f 77  ** end of a grow
18740 69 6e 67 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e  ing FROM clause.
18750 20 20 54 68 65 20 22 70 22 20 70 61 72 61 6d 65    The "p" parame
18760 74 65 72 20 69 73 20 74 68 65 20 70 61 72 74 20  ter is the part 
18770 6f 66 0a 2a 2a 20 74 68 65 20 46 52 4f 4d 20 63  of.** the FROM c
18780 6c 61 75 73 65 20 74 68 61 74 20 68 61 73 20 61  lause that has a
18790 6c 72 65 61 64 79 20 62 65 65 6e 20 63 6f 6e 73  lready been cons
187a0 74 72 75 63 74 65 64 2e 20 20 22 70 22 20 69 73  tructed.  "p" is
187b0 20 4e 55 4c 4c 0a 2a 2a 20 69 66 20 74 68 69 73   NULL.** if this
187c0 20 69 73 20 74 68 65 20 66 69 72 73 74 20 74 65   is the first te
187d0 72 6d 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63  rm of the FROM c
187e0 6c 61 75 73 65 2e 20 20 70 54 61 62 6c 65 20 61  lause.  pTable a
187f0 6e 64 20 70 44 61 74 61 62 61 73 65 0a 2a 2a 20  nd pDatabase.** 
18800 61 72 65 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  are the name of 
18810 74 68 65 20 74 61 62 6c 65 20 61 6e 64 20 64 61  the table and da
18820 74 61 62 61 73 65 20 6e 61 6d 65 64 20 69 6e 20  tabase named in 
18830 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
18840 74 65 72 6d 2e 0a 2a 2a 20 70 44 61 74 61 62 61  term..** pDataba
18850 73 65 20 69 73 20 4e 55 4c 4c 20 69 66 20 74 68  se is NULL if th
18860 65 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 20  e database name 
18870 71 75 61 6c 69 66 69 65 72 20 69 73 20 6d 69 73  qualifier is mis
18880 73 69 6e 67 20 2d 20 74 68 65 0a 2a 2a 20 75 73  sing - the.** us
18890 75 61 6c 20 63 61 73 65 2e 20 20 49 66 20 74 68  ual case.  If th
188a0 65 20 74 65 72 6d 20 68 61 73 20 61 20 61 6c 69  e term has a ali
188b0 61 73 2c 20 74 68 65 6e 20 70 41 6c 69 61 73 20  as, then pAlias 
188c0 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 0a 2a 2a  points to the.**
188d0 20 61 6c 69 61 73 20 74 6f 6b 65 6e 2e 20 20 49   alias token.  I
188e0 66 20 74 68 65 20 74 65 72 6d 20 69 73 20 61 20  f the term is a 
188f0 73 75 62 71 75 65 72 79 2c 20 74 68 65 6e 20 70  subquery, then p
18900 53 75 62 71 75 65 72 79 20 69 73 20 74 68 65 0a  Subquery is the.
18910 2a 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  ** SELECT statem
18920 65 6e 74 20 74 68 61 74 20 74 68 65 20 73 75 62  ent that the sub
18930 71 75 65 72 79 20 65 6e 63 6f 64 65 73 2e 20 20  query encodes.  
18940 54 68 65 20 70 54 61 62 6c 65 20 61 6e 64 0a 2a  The pTable and.*
18950 2a 20 70 44 61 74 61 62 61 73 65 20 70 61 72 61  * pDatabase para
18960 6d 65 74 65 72 73 20 61 72 65 20 4e 55 4c 4c 20  meters are NULL 
18970 66 6f 72 20 73 75 62 71 75 65 72 69 65 73 2e 20  for subqueries. 
18980 20 54 68 65 20 70 4f 6e 20 61 6e 64 20 70 55 73   The pOn and pUs
18990 69 6e 67 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72  ing.** parameter
189a0 73 20 61 72 65 20 74 68 65 20 63 6f 6e 74 65 6e  s are the conten
189b0 74 20 6f 66 20 74 68 65 20 4f 4e 20 61 6e 64 20  t of the ON and 
189c0 55 53 49 4e 47 20 63 6c 61 75 73 65 73 2e 0a 2a  USING clauses..*
189d0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 6e 65  *.** Return a ne
189e0 77 20 53 72 63 4c 69 73 74 20 77 68 69 63 68 20  w SrcList which 
189f0 65 6e 63 6f 64 65 73 20 69 73 20 74 68 65 20 46  encodes is the F
18a00 52 4f 4d 20 77 69 74 68 20 74 68 65 20 6e 65 77  ROM with the new
18a10 0a 2a 2a 20 74 65 72 6d 20 61 64 64 65 64 2e 0a  .** term added..
18a20 2a 2f 0a 53 72 63 4c 69 73 74 20 2a 73 71 6c 69  */.SrcList *sqli
18a30 74 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64  te3SrcListAppend
18a40 46 72 6f 6d 54 65 72 6d 28 0a 20 20 50 61 72 73  FromTerm(.  Pars
18a50 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
18a60 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
18a70 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72 63 4c  ontext */.  SrcL
18a80 69 73 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20  ist *p,         
18a90 20 20 20 20 2f 2a 20 54 68 65 20 6c 65 66 74 20      /* The left 
18aa0 70 61 72 74 20 6f 66 20 74 68 65 20 46 52 4f 4d  part of the FROM
18ab0 20 63 6c 61 75 73 65 20 61 6c 72 65 61 64 79 20   clause already 
18ac0 73 65 65 6e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  seen */.  Token 
18ad0 2a 70 54 61 62 6c 65 2c 20 20 20 20 20 20 20 20  *pTable,        
18ae0 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
18af0 20 74 61 62 6c 65 20 74 6f 20 61 64 64 20 74 6f   table to add to
18b00 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
18b10 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 44 61   */.  Token *pDa
18b20 74 61 62 61 73 65 2c 20 20 20 20 20 20 20 2f 2a  tabase,       /*
18b30 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74   Name of the dat
18b40 61 62 61 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67  abase containing
18b50 20 70 54 61 62 6c 65 20 2a 2f 0a 20 20 54 6f 6b   pTable */.  Tok
18b60 65 6e 20 2a 70 41 6c 69 61 73 2c 20 20 20 20 20  en *pAlias,     
18b70 20 20 20 20 20 2f 2a 20 54 68 65 20 72 69 67 68       /* The righ
18b80 74 2d 68 61 6e 64 20 73 69 64 65 20 6f 66 20 74  t-hand side of t
18b90 68 65 20 41 53 20 73 75 62 65 78 70 72 65 73 73  he AS subexpress
18ba0 69 6f 6e 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ion */.  Select 
18bb0 2a 70 53 75 62 71 75 65 72 79 2c 20 20 20 20 20  *pSubquery,     
18bc0 20 2f 2a 20 41 20 73 75 62 71 75 65 72 79 20 75   /* A subquery u
18bd0 73 65 64 20 69 6e 20 70 6c 61 63 65 20 6f 66 20  sed in place of 
18be0 61 20 74 61 62 6c 65 20 6e 61 6d 65 20 2a 2f 0a  a table name */.
18bf0 20 20 45 78 70 72 20 2a 70 4f 6e 2c 20 20 20 20    Expr *pOn,    
18c00 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
18c10 20 4f 4e 20 63 6c 61 75 73 65 20 6f 66 20 61 20   ON clause of a 
18c20 6a 6f 69 6e 20 2a 2f 0a 20 20 49 64 4c 69 73 74  join */.  IdList
18c30 20 2a 70 55 73 69 6e 67 20 20 20 20 20 20 20 20   *pUsing        
18c40 20 20 2f 2a 20 54 68 65 20 55 53 49 4e 47 20 63    /* The USING c
18c50 6c 61 75 73 65 20 6f 66 20 61 20 6a 6f 69 6e 20  lause of a join 
18c60 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 53  */.){.  struct S
18c70 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  rcList_item *pIt
18c80 65 6d 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  em;.  sqlite3 *d
18c90 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
18ca0 20 20 70 20 3d 20 73 71 6c 69 74 65 33 53 72 63    p = sqlite3Src
18cb0 4c 69 73 74 41 70 70 65 6e 64 28 64 62 2c 20 70  ListAppend(db, p
18cc0 2c 20 70 54 61 62 6c 65 2c 20 70 44 61 74 61 62  , pTable, pDatab
18cd0 61 73 65 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30  ase);.  if( p==0
18ce0 20 7c 7c 20 70 2d 3e 6e 53 72 63 3d 3d 30 20 29   || p->nSrc==0 )
18cf0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  {.    sqlite3Exp
18d00 72 44 65 6c 65 74 65 28 64 62 2c 20 70 4f 6e 29  rDelete(db, pOn)
18d10 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 49 64 4c  ;.    sqlite3IdL
18d20 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 55  istDelete(db, pU
18d30 73 69 6e 67 29 3b 0a 20 20 20 20 73 71 6c 69 74  sing);.    sqlit
18d40 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64  e3SelectDelete(d
18d50 62 2c 20 70 53 75 62 71 75 65 72 79 29 3b 0a 20  b, pSubquery);. 
18d60 20 20 20 72 65 74 75 72 6e 20 70 3b 0a 20 20 7d     return p;.  }
18d70 0a 20 20 70 49 74 65 6d 20 3d 20 26 70 2d 3e 61  .  pItem = &p->a
18d80 5b 70 2d 3e 6e 53 72 63 2d 31 5d 3b 0a 20 20 69  [p->nSrc-1];.  i
18d90 66 28 20 70 41 6c 69 61 73 20 26 26 20 70 41 6c  f( pAlias && pAl
18da0 69 61 73 2d 3e 6e 20 29 7b 0a 20 20 20 20 70 49  ias->n ){.    pI
18db0 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 3d 20 73 71  tem->zAlias = sq
18dc0 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b  lite3NameFromTok
18dd0 65 6e 28 64 62 2c 20 70 41 6c 69 61 73 29 3b 0a  en(db, pAlias);.
18de0 20 20 7d 0a 20 20 70 49 74 65 6d 2d 3e 70 53 65    }.  pItem->pSe
18df0 6c 65 63 74 20 3d 20 70 53 75 62 71 75 65 72 79  lect = pSubquery
18e00 3b 0a 20 20 70 49 74 65 6d 2d 3e 70 4f 6e 20 3d  ;.  pItem->pOn =
18e10 20 70 4f 6e 3b 0a 20 20 70 49 74 65 6d 2d 3e 70   pOn;.  pItem->p
18e20 55 73 69 6e 67 20 3d 20 70 55 73 69 6e 67 3b 0a  Using = pUsing;.
18e30 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f    return p;.}../
18e40 2a 0a 2a 2a 20 57 68 65 6e 20 62 75 69 6c 64 69  *.** When buildi
18e50 6e 67 20 75 70 20 61 20 46 52 4f 4d 20 63 6c 61  ng up a FROM cla
18e60 75 73 65 20 69 6e 20 74 68 65 20 70 61 72 73 65  use in the parse
18e70 72 2c 20 74 68 65 20 6a 6f 69 6e 20 6f 70 65 72  r, the join oper
18e80 61 74 6f 72 0a 2a 2a 20 69 73 20 69 6e 69 74 69  ator.** is initi
18e90 61 6c 6c 79 20 61 74 74 61 63 68 65 64 20 74 6f  ally attached to
18ea0 20 74 68 65 20 6c 65 66 74 20 6f 70 65 72 61 6e   the left operan
18eb0 64 2e 20 20 42 75 74 20 74 68 65 20 63 6f 64 65  d.  But the code
18ec0 20 67 65 6e 65 72 61 74 6f 72 0a 2a 2a 20 65 78   generator.** ex
18ed0 70 65 63 74 73 20 74 68 65 20 6a 6f 69 6e 20 6f  pects the join o
18ee0 70 65 72 61 74 6f 72 20 74 6f 20 62 65 20 6f 6e  perator to be on
18ef0 20 74 68 65 20 72 69 67 68 74 20 6f 70 65 72 61   the right opera
18f00 6e 64 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  nd.  This routin
18f10 65 0a 2a 2a 20 53 68 69 66 74 73 20 61 6c 6c 20  e.** Shifts all 
18f20 6a 6f 69 6e 20 6f 70 65 72 61 74 6f 72 73 20 66  join operators f
18f30 72 6f 6d 20 6c 65 66 74 20 74 6f 20 72 69 67 68  rom left to righ
18f40 74 20 66 6f 72 20 61 6e 20 65 6e 74 69 72 65 20  t for an entire 
18f50 46 52 4f 4d 0a 2a 2a 20 63 6c 61 75 73 65 2e 0a  FROM.** clause..
18f60 2a 2a 0a 2a 2a 20 45 78 61 6d 70 6c 65 3a 20 53  **.** Example: S
18f70 75 70 70 6f 73 65 20 74 68 65 20 6a 6f 69 6e 20  uppose the join 
18f80 69 73 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a  is like this:.**
18f90 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 41 20  .**           A 
18fa0 6e 61 74 75 72 61 6c 20 63 72 6f 73 73 20 6a 6f  natural cross jo
18fb0 69 6e 20 42 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f  in B.**.** The o
18fc0 70 65 72 61 74 6f 72 20 69 73 20 22 6e 61 74 75  perator is "natu
18fd0 72 61 6c 20 63 72 6f 73 73 20 6a 6f 69 6e 22 2e  ral cross join".
18fe0 20 20 54 68 65 20 41 20 61 6e 64 20 42 20 6f 70    The A and B op
18ff0 65 72 61 6e 64 73 20 61 72 65 20 73 74 6f 72 65  erands are store
19000 64 0a 2a 2a 20 69 6e 20 70 2d 3e 61 5b 30 5d 20  d.** in p->a[0] 
19010 61 6e 64 20 70 2d 3e 61 5b 31 5d 2c 20 72 65 73  and p->a[1], res
19020 70 65 63 74 69 76 65 6c 79 2e 20 20 54 68 65 20  pectively.  The 
19030 70 61 72 73 65 72 20 69 6e 69 74 69 61 6c 6c 79  parser initially
19040 20 73 74 6f 72 65 73 20 74 68 65 0a 2a 2a 20 6f   stores the.** o
19050 70 65 72 61 74 6f 72 20 77 69 74 68 20 41 2e 20  perator with A. 
19060 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 68   This routine sh
19070 69 66 74 73 20 74 68 61 74 20 6f 70 65 72 61 74  ifts that operat
19080 6f 72 20 6f 76 65 72 20 74 6f 20 42 2e 0a 2a 2f  or over to B..*/
19090 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53 72 63  .void sqlite3Src
190a0 4c 69 73 74 53 68 69 66 74 4a 6f 69 6e 54 79 70  ListShiftJoinTyp
190b0 65 28 53 72 63 4c 69 73 74 20 2a 70 29 7b 0a 20  e(SrcList *p){. 
190c0 20 69 66 28 20 70 20 26 26 20 70 2d 3e 61 20 29   if( p && p->a )
190d0 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  {.    int i;.   
190e0 20 66 6f 72 28 69 3d 70 2d 3e 6e 53 72 63 2d 31   for(i=p->nSrc-1
190f0 3b 20 69 3e 30 3b 20 69 2d 2d 29 7b 0a 20 20 20  ; i>0; i--){.   
19100 20 20 20 70 2d 3e 61 5b 69 5d 2e 6a 6f 69 6e 74     p->a[i].joint
19110 79 70 65 20 3d 20 70 2d 3e 61 5b 69 2d 31 5d 2e  ype = p->a[i-1].
19120 6a 6f 69 6e 74 79 70 65 3b 0a 20 20 20 20 7d 0a  jointype;.    }.
19130 20 20 20 20 70 2d 3e 61 5b 30 5d 2e 6a 6f 69 6e      p->a[0].join
19140 74 79 70 65 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a  type = 0;.  }.}.
19150 0a 2f 2a 0a 2a 2a 20 42 65 67 69 6e 20 61 20 74  ./*.** Begin a t
19160 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2f 0a 76 6f  ransaction.*/.vo
19170 69 64 20 73 71 6c 69 74 65 33 42 65 67 69 6e 54  id sqlite3BeginT
19180 72 61 6e 73 61 63 74 69 6f 6e 28 50 61 72 73 65  ransaction(Parse
19190 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 74 79   *pParse, int ty
191a0 70 65 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  pe){.  sqlite3 *
191b0 64 62 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20  db;.  Vdbe *v;. 
191c0 20 69 6e 74 20 69 3b 0a 0a 20 20 69 66 28 20 70   int i;..  if( p
191d0 50 61 72 73 65 3d 3d 30 20 7c 7c 20 28 64 62 3d  Parse==0 || (db=
191e0 70 50 61 72 73 65 2d 3e 64 62 29 3d 3d 30 20 7c  pParse->db)==0 |
191f0 7c 20 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74  | db->aDb[0].pBt
19200 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
19210 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  if( pParse->nErr
19220 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   || db->mallocFa
19230 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20  iled ) return;. 
19240 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68   if( sqlite3Auth
19250 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51  Check(pParse, SQ
19260 4c 49 54 45 5f 54 52 41 4e 53 41 43 54 49 4f 4e  LITE_TRANSACTION
19270 2c 20 22 42 45 47 49 4e 22 2c 20 30 2c 20 30 29  , "BEGIN", 0, 0)
19280 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 76 20   ) return;..  v 
19290 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
192a0 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20  (pParse);.  if( 
192b0 21 76 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69  !v ) return;.  i
192c0 66 28 20 74 79 70 65 21 3d 54 4b 5f 44 45 46 45  f( type!=TK_DEFE
192d0 52 52 45 44 20 29 7b 0a 20 20 20 20 66 6f 72 28  RRED ){.    for(
192e0 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20  i=0; i<db->nDb; 
192f0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  i++){.      sqli
19300 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
19310 20 4f 50 5f 54 72 61 6e 73 61 63 74 69 6f 6e 2c   OP_Transaction,
19320 20 69 2c 20 28 74 79 70 65 3d 3d 54 4b 5f 45 58   i, (type==TK_EX
19330 43 4c 55 53 49 56 45 29 2b 31 29 3b 0a 20 20 20  CLUSIVE)+1);.   
19340 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 55 73     sqlite3VdbeUs
19350 65 73 42 74 72 65 65 28 76 2c 20 69 29 3b 0a 20  esBtree(v, i);. 
19360 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74     }.  }.  sqlit
19370 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
19380 4f 50 5f 41 75 74 6f 43 6f 6d 6d 69 74 2c 20 30  OP_AutoCommit, 0
19390 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  , 0);.}../*.** C
193a0 6f 6d 6d 69 74 20 61 20 74 72 61 6e 73 61 63 74  ommit a transact
193b0 69 6f 6e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ion.*/.void sqli
193c0 74 65 33 43 6f 6d 6d 69 74 54 72 61 6e 73 61 63  te3CommitTransac
193d0 74 69 6f 6e 28 50 61 72 73 65 20 2a 70 50 61 72  tion(Parse *pPar
193e0 73 65 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  se){.  sqlite3 *
193f0 64 62 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 0a  db;.  Vdbe *v;..
19400 20 20 69 66 28 20 70 50 61 72 73 65 3d 3d 30 20    if( pParse==0 
19410 7c 7c 20 28 64 62 3d 70 50 61 72 73 65 2d 3e 64  || (db=pParse->d
19420 62 29 3d 3d 30 20 7c 7c 20 64 62 2d 3e 61 44 62  b)==0 || db->aDb
19430 5b 30 5d 2e 70 42 74 3d 3d 30 20 29 20 72 65 74  [0].pBt==0 ) ret
19440 75 72 6e 3b 0a 20 20 69 66 28 20 70 50 61 72 73  urn;.  if( pPars
19450 65 2d 3e 6e 45 72 72 20 7c 7c 20 64 62 2d 3e 6d  e->nErr || db->m
19460 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65  allocFailed ) re
19470 74 75 72 6e 3b 0a 20 20 69 66 28 20 73 71 6c 69  turn;.  if( sqli
19480 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61  te3AuthCheck(pPa
19490 72 73 65 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e  rse, SQLITE_TRAN
194a0 53 41 43 54 49 4f 4e 2c 20 22 43 4f 4d 4d 49 54  SACTION, "COMMIT
194b0 22 2c 20 30 2c 20 30 29 20 29 20 72 65 74 75 72  ", 0, 0) ) retur
194c0 6e 3b 0a 0a 20 20 76 20 3d 20 73 71 6c 69 74 65  n;..  v = sqlite
194d0 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
194e0 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20  ;.  if( v ){.   
194f0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
19500 70 32 28 76 2c 20 4f 50 5f 41 75 74 6f 43 6f 6d  p2(v, OP_AutoCom
19510 6d 69 74 2c 20 31 2c 20 30 29 3b 0a 20 20 7d 0a  mit, 1, 0);.  }.
19520 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63  }../*.** Rollbac
19530 6b 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a  k a transaction.
19540 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52  */.void sqlite3R
19550 6f 6c 6c 62 61 63 6b 54 72 61 6e 73 61 63 74 69  ollbackTransacti
19560 6f 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  on(Parse *pParse
19570 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
19580 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 0a 20 20  ;.  Vdbe *v;..  
19590 69 66 28 20 70 50 61 72 73 65 3d 3d 30 20 7c 7c  if( pParse==0 ||
195a0 20 28 64 62 3d 70 50 61 72 73 65 2d 3e 64 62 29   (db=pParse->db)
195b0 3d 3d 30 20 7c 7c 20 64 62 2d 3e 61 44 62 5b 30  ==0 || db->aDb[0
195c0 5d 2e 70 42 74 3d 3d 30 20 29 20 72 65 74 75 72  ].pBt==0 ) retur
195d0 6e 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  n;.  if( pParse-
195e0 3e 6e 45 72 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c  >nErr || db->mal
195f0 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74 75  locFailed ) retu
19600 72 6e 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65  rn;.  if( sqlite
19610 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73  3AuthCheck(pPars
19620 65 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 41  e, SQLITE_TRANSA
19630 43 54 49 4f 4e 2c 20 22 52 4f 4c 4c 42 41 43 4b  CTION, "ROLLBACK
19640 22 2c 20 30 2c 20 30 29 20 29 20 72 65 74 75 72  ", 0, 0) ) retur
19650 6e 3b 0a 0a 20 20 76 20 3d 20 73 71 6c 69 74 65  n;..  v = sqlite
19660 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
19670 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20  ;.  if( v ){.   
19680 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
19690 70 32 28 76 2c 20 4f 50 5f 41 75 74 6f 43 6f 6d  p2(v, OP_AutoCom
196a0 6d 69 74 2c 20 31 2c 20 31 29 3b 0a 20 20 7d 0a  mit, 1, 1);.  }.
196b0 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75  }../*.** Make su
196c0 72 65 20 74 68 65 20 54 45 4d 50 20 64 61 74 61  re the TEMP data
196d0 62 61 73 65 20 69 73 20 6f 70 65 6e 20 61 6e 64  base is open and
196e0 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 75   available for u
196f0 73 65 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20 74  se.  Return.** t
19700 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72  he number of err
19710 6f 72 73 2e 20 20 4c 65 61 76 65 20 61 6e 79 20  ors.  Leave any 
19720 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73 20 69  error messages i
19730 6e 20 74 68 65 20 70 50 61 72 73 65 20 73 74 72  n the pParse str
19740 75 63 74 75 72 65 2e 0a 2a 2f 0a 69 6e 74 20 73  ucture..*/.int s
19750 71 6c 69 74 65 33 4f 70 65 6e 54 65 6d 70 44 61  qlite3OpenTempDa
19760 74 61 62 61 73 65 28 50 61 72 73 65 20 2a 70 50  tabase(Parse *pP
19770 61 72 73 65 29 7b 0a 20 20 73 71 6c 69 74 65 33  arse){.  sqlite3
19780 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
19790 62 3b 0a 20 20 69 66 28 20 64 62 2d 3e 61 44 62  b;.  if( db->aDb
197a0 5b 31 5d 2e 70 42 74 3d 3d 30 20 26 26 20 21 70  [1].pBt==0 && !p
197b0 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 20 29  Parse->explain )
197c0 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20  {.    int rc;.  
197d0 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 69    static const i
197e0 6e 74 20 66 6c 61 67 73 20 3d 20 0a 20 20 20 20  nt flags = .    
197f0 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45        SQLITE_OPE
19800 4e 5f 52 45 41 44 57 52 49 54 45 20 7c 0a 20 20  N_READWRITE |.  
19810 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f          SQLITE_O
19820 50 45 4e 5f 43 52 45 41 54 45 20 7c 0a 20 20 20  PEN_CREATE |.   
19830 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50         SQLITE_OP
19840 45 4e 5f 45 58 43 4c 55 53 49 56 45 20 7c 0a 20  EN_EXCLUSIVE |. 
19850 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
19860 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f  OPEN_DELETEONCLO
19870 53 45 20 7c 0a 20 20 20 20 20 20 20 20 20 20 53  SE |.          S
19880 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f  QLITE_OPEN_TEMP_
19890 44 42 3b 0a 0a 20 20 20 20 72 63 20 3d 20 73 71  DB;..    rc = sq
198a0 6c 69 74 65 33 42 74 72 65 65 46 61 63 74 6f 72  lite3BtreeFactor
198b0 79 28 64 62 2c 20 30 2c 20 30 2c 20 53 51 4c 49  y(db, 0, 0, SQLI
198c0 54 45 5f 44 45 46 41 55 4c 54 5f 43 41 43 48 45  TE_DEFAULT_CACHE
198d0 5f 53 49 5a 45 2c 20 66 6c 61 67 73 2c 0a 20 20  _SIZE, flags,.  
198e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
198f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26                 &
19900 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 42 74 29 3b  db->aDb[1].pBt);
19910 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
19920 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
19930 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
19940 70 50 61 72 73 65 2c 20 22 75 6e 61 62 6c 65 20  pParse, "unable 
19950 74 6f 20 6f 70 65 6e 20 61 20 74 65 6d 70 6f 72  to open a tempor
19960 61 72 79 20 64 61 74 61 62 61 73 65 20 22 0a 20  ary database ". 
19970 20 20 20 20 20 20 20 22 66 69 6c 65 20 66 6f 72         "file for
19980 20 73 74 6f 72 69 6e 67 20 74 65 6d 70 6f 72 61   storing tempora
19990 72 79 20 74 61 62 6c 65 73 22 29 3b 0a 20 20 20  ry tables");.   
199a0 20 20 20 70 50 61 72 73 65 2d 3e 72 63 20 3d 20     pParse->rc = 
199b0 72 63 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  rc;.      return
199c0 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73   1;.    }.    as
199d0 73 65 72 74 28 20 28 64 62 2d 3e 66 6c 61 67 73  sert( (db->flags
199e0 20 26 20 53 51 4c 49 54 45 5f 49 6e 54 72 61 6e   & SQLITE_InTran
199f0 73 29 3d 3d 30 20 7c 7c 20 64 62 2d 3e 61 75 74  s)==0 || db->aut
19a00 6f 43 6f 6d 6d 69 74 20 29 3b 0a 20 20 20 20 61  oCommit );.    a
19a10 73 73 65 72 74 28 20 64 62 2d 3e 61 44 62 5b 31  ssert( db->aDb[1
19a20 5d 2e 70 53 63 68 65 6d 61 20 29 3b 0a 20 20 20  ].pSchema );.   
19a30 20 73 71 6c 69 74 65 33 50 61 67 65 72 4a 6f 75   sqlite3PagerJou
19a40 72 6e 61 6c 4d 6f 64 65 28 73 71 6c 69 74 65 33  rnalMode(sqlite3
19a50 42 74 72 65 65 50 61 67 65 72 28 64 62 2d 3e 61  BtreePager(db->a
19a60 44 62 5b 31 5d 2e 70 42 74 29 2c 0a 20 20 20 20  Db[1].pBt),.    
19a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19a80 20 20 20 20 20 20 20 20 64 62 2d 3e 64 66 6c 74          db->dflt
19a90 4a 6f 75 72 6e 61 6c 4d 6f 64 65 29 3b 0a 20 20  JournalMode);.  
19aa0 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
19ab0 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
19ac0 56 44 42 45 20 63 6f 64 65 20 74 68 61 74 20 77  VDBE code that w
19ad0 69 6c 6c 20 76 65 72 69 66 79 20 74 68 65 20 73  ill verify the s
19ae0 63 68 65 6d 61 20 63 6f 6f 6b 69 65 20 61 6e 64  chema cookie and
19af0 20 73 74 61 72 74 0a 2a 2a 20 61 20 72 65 61 64   start.** a read
19b00 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 66 6f 72  -transaction for
19b10 20 61 6c 6c 20 6e 61 6d 65 64 20 64 61 74 61 62   all named datab
19b20 61 73 65 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a  ase files..**.**
19b30 20 49 74 20 69 73 20 69 6d 70 6f 72 74 61 6e 74   It is important
19b40 20 74 68 61 74 20 61 6c 6c 20 73 63 68 65 6d 61   that all schema
19b50 20 63 6f 6f 6b 69 65 73 20 62 65 20 76 65 72 69   cookies be veri
19b60 66 69 65 64 20 61 6e 64 20 61 6c 6c 0a 2a 2a 20  fied and all.** 
19b70 72 65 61 64 20 74 72 61 6e 73 61 63 74 69 6f 6e  read transaction
19b80 73 20 62 65 20 73 74 61 72 74 65 64 20 62 65 66  s be started bef
19b90 6f 72 65 20 61 6e 79 74 68 69 6e 67 20 65 6c 73  ore anything els
19ba0 65 20 68 61 70 70 65 6e 73 20 69 6e 0a 2a 2a 20  e happens in.** 
19bb0 74 68 65 20 56 44 42 45 20 70 72 6f 67 72 61 6d  the VDBE program
19bc0 2e 20 20 42 75 74 20 74 68 69 73 20 72 6f 75 74  .  But this rout
19bd0 69 6e 65 20 63 61 6e 20 62 65 20 63 61 6c 6c 65  ine can be calle
19be0 64 20 61 66 74 65 72 20 6d 75 63 68 20 6f 74 68  d after much oth
19bf0 65 72 0a 2a 2a 20 63 6f 64 65 20 68 61 73 20 62  er.** code has b
19c00 65 65 6e 20 67 65 6e 65 72 61 74 65 64 2e 20 20  een generated.  
19c10 53 6f 20 68 65 72 65 20 69 73 20 77 68 61 74 20  So here is what 
19c20 77 65 20 64 6f 3a 0a 2a 2a 0a 2a 2a 20 54 68 65  we do:.**.** The
19c30 20 66 69 72 73 74 20 74 69 6d 65 20 74 68 69 73   first time this
19c40 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
19c50 65 64 2c 20 77 65 20 63 6f 64 65 20 61 6e 20 4f  ed, we code an O
19c60 50 5f 47 6f 74 6f 20 74 68 61 74 0a 2a 2a 20 77  P_Goto that.** w
19c70 69 6c 6c 20 6a 75 6d 70 20 74 6f 20 61 20 73 75  ill jump to a su
19c80 62 72 6f 75 74 69 6e 65 20 61 74 20 74 68 65 20  broutine at the 
19c90 65 6e 64 20 6f 66 20 74 68 65 20 70 72 6f 67 72  end of the progr
19ca0 61 6d 2e 20 20 54 68 65 6e 20 77 65 0a 2a 2a 20  am.  Then we.** 
19cb0 72 65 63 6f 72 64 20 65 76 65 72 79 20 64 61 74  record every dat
19cc0 61 62 61 73 65 20 74 68 61 74 20 6e 65 65 64 73  abase that needs
19cd0 20 69 74 73 20 73 63 68 65 6d 61 20 76 65 72 69   its schema veri
19ce0 66 69 65 64 20 69 6e 20 74 68 65 0a 2a 2a 20 70  fied in the.** p
19cf0 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 4d 61 73  Parse->cookieMas
19d00 6b 20 66 69 65 6c 64 2e 20 20 4c 61 74 65 72 2c  k field.  Later,
19d10 20 61 66 74 65 72 20 61 6c 6c 20 6f 74 68 65 72   after all other
19d20 20 63 6f 64 65 20 68 61 73 20 62 65 65 6e 0a 2a   code has been.*
19d30 2a 20 67 65 6e 65 72 61 74 65 64 2c 20 74 68 65  * generated, the
19d40 20 73 75 62 72 6f 75 74 69 6e 65 20 74 68 61 74   subroutine that
19d50 20 64 6f 65 73 20 74 68 65 20 63 6f 6f 6b 69 65   does the cookie
19d60 20 76 65 72 69 66 69 63 61 74 69 6f 6e 73 20 61   verifications a
19d70 6e 64 0a 2a 2a 20 73 74 61 72 74 73 20 74 68 65  nd.** starts the
19d80 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 77 69   transactions wi
19d90 6c 6c 20 62 65 20 63 6f 64 65 64 20 61 6e 64 20  ll be coded and 
19da0 74 68 65 20 4f 50 5f 47 6f 74 6f 20 50 32 20 76  the OP_Goto P2 v
19db0 61 6c 75 65 0a 2a 2a 20 77 69 6c 6c 20 62 65 20  alue.** will be 
19dc0 6d 61 64 65 20 74 6f 20 70 6f 69 6e 74 20 74 6f  made to point to
19dd0 20 74 68 61 74 20 73 75 62 72 6f 75 74 69 6e 65   that subroutine
19de0 2e 20 20 54 68 65 20 67 65 6e 65 72 61 74 69 6f  .  The generatio
19df0 6e 20 6f 66 20 74 68 65 0a 2a 2a 20 63 6f 6f 6b  n of the.** cook
19e00 69 65 20 76 65 72 69 66 69 63 61 74 69 6f 6e 20  ie verification 
19e10 73 75 62 72 6f 75 74 69 6e 65 20 63 6f 64 65 20  subroutine code 
19e20 68 61 70 70 65 6e 73 20 69 6e 20 73 71 6c 69 74  happens in sqlit
19e30 65 33 46 69 6e 69 73 68 43 6f 64 69 6e 67 28 29  e3FinishCoding()
19e40 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 69 44 62 3c 30  ..**.** If iDb<0
19e50 20 74 68 65 6e 20 63 6f 64 65 20 74 68 65 20 4f   then code the O
19e60 50 5f 47 6f 74 6f 20 6f 6e 6c 79 20 2d 20 64 6f  P_Goto only - do
19e70 6e 27 74 20 73 65 74 20 66 6c 61 67 20 74 6f 20  n't set flag to 
19e80 76 65 72 69 66 79 20 74 68 65 0a 2a 2a 20 73 63  verify the.** sc
19e90 68 65 6d 61 20 6f 6e 20 61 6e 79 20 64 61 74 61  hema on any data
19ea0 62 61 73 65 73 2e 20 20 54 68 69 73 20 63 61 6e  bases.  This can
19eb0 20 62 65 20 75 73 65 64 20 74 6f 20 70 6f 73 69   be used to posi
19ec0 74 69 6f 6e 20 74 68 65 20 4f 50 5f 47 6f 74 6f  tion the OP_Goto
19ed0 0a 2a 2a 20 65 61 72 6c 79 20 69 6e 20 74 68 65  .** early in the
19ee0 20 63 6f 64 65 2c 20 62 65 66 6f 72 65 20 77 65   code, before we
19ef0 20 6b 6e 6f 77 20 69 66 20 61 6e 79 20 64 61 74   know if any dat
19f00 61 62 61 73 65 20 74 61 62 6c 65 73 20 77 69 6c  abase tables wil
19f10 6c 20 62 65 20 75 73 65 64 2e 0a 2a 2f 0a 76 6f  l be used..*/.vo
19f20 69 64 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65  id sqlite3CodeVe
19f30 72 69 66 79 53 63 68 65 6d 61 28 50 61 72 73 65  rifySchema(Parse
19f40 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69 44   *pParse, int iD
19f50 62 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  b){.  sqlite3 *d
19f60 62 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20  b;.  Vdbe *v;.  
19f70 69 6e 74 20 6d 61 73 6b 3b 0a 0a 20 20 76 20 3d  int mask;..  v =
19f80 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
19f90 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76  pParse);.  if( v
19fa0 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 20 20 2f  ==0 ) return;  /
19fb0 2a 20 54 68 69 73 20 6f 6e 6c 79 20 68 61 70 70  * This only happ
19fc0 65 6e 73 20 69 66 20 74 68 65 72 65 20 77 61 73  ens if there was
19fd0 20 61 20 70 72 69 6f 72 20 65 72 72 6f 72 20 2a   a prior error *
19fe0 2f 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d  /.  db = pParse-
19ff0 3e 64 62 3b 0a 20 20 69 66 28 20 70 50 61 72 73  >db;.  if( pPars
1a000 65 2d 3e 63 6f 6f 6b 69 65 47 6f 74 6f 3d 3d 30  e->cookieGoto==0
1a010 20 29 7b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e   ){.    pParse->
1a020 63 6f 6f 6b 69 65 47 6f 74 6f 20 3d 20 73 71 6c  cookieGoto = sql
1a030 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
1a040 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 30 29  , OP_Goto, 0, 0)
1a050 2b 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 44  +1;.  }.  if( iD
1a060 62 3e 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65  b>=0 ){.    asse
1a070 72 74 28 20 69 44 62 3c 64 62 2d 3e 6e 44 62 20  rt( iDb<db->nDb 
1a080 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 64  );.    assert( d
1a090 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 42 74 21  b->aDb[iDb].pBt!
1a0a0 3d 30 20 7c 7c 20 69 44 62 3d 3d 31 20 29 3b 0a  =0 || iDb==1 );.
1a0b0 20 20 20 20 61 73 73 65 72 74 28 20 69 44 62 3c      assert( iDb<
1a0c0 53 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41 43  SQLITE_MAX_ATTAC
1a0d0 48 45 44 2b 32 20 29 3b 0a 20 20 20 20 6d 61 73  HED+2 );.    mas
1a0e0 6b 20 3d 20 31 3c 3c 69 44 62 3b 0a 20 20 20 20  k = 1<<iDb;.    
1a0f0 69 66 28 20 28 70 50 61 72 73 65 2d 3e 63 6f 6f  if( (pParse->coo
1a100 6b 69 65 4d 61 73 6b 20 26 20 6d 61 73 6b 29 3d  kieMask & mask)=
1a110 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 50 61 72  =0 ){.      pPar
1a120 73 65 2d 3e 63 6f 6f 6b 69 65 4d 61 73 6b 20 7c  se->cookieMask |
1a130 3d 20 6d 61 73 6b 3b 0a 20 20 20 20 20 20 70 50  = mask;.      pP
1a140 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 56 61 6c 75  arse->cookieValu
1a150 65 5b 69 44 62 5d 20 3d 20 64 62 2d 3e 61 44 62  e[iDb] = db->aDb
1a160 5b 69 44 62 5d 2e 70 53 63 68 65 6d 61 2d 3e 73  [iDb].pSchema->s
1a170 63 68 65 6d 61 5f 63 6f 6f 6b 69 65 3b 0a 20 20  chema_cookie;.  
1a180 20 20 20 20 69 66 28 20 21 4f 4d 49 54 5f 54 45      if( !OMIT_TE
1a190 4d 50 44 42 20 26 26 20 69 44 62 3d 3d 31 20 29  MPDB && iDb==1 )
1a1a0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
1a1b0 33 4f 70 65 6e 54 65 6d 70 44 61 74 61 62 61 73  3OpenTempDatabas
1a1c0 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  e(pParse);.     
1a1d0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a   }.    }.  }.}..
1a1e0 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 56  /*.** Generate V
1a1f0 44 42 45 20 63 6f 64 65 20 74 68 61 74 20 70 72  DBE code that pr
1a200 65 70 61 72 65 73 20 66 6f 72 20 64 6f 69 6e 67  epares for doing
1a210 20 61 6e 20 6f 70 65 72 61 74 69 6f 6e 20 74 68   an operation th
1a220 61 74 0a 2a 2a 20 6d 69 67 68 74 20 63 68 61 6e  at.** might chan
1a230 67 65 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  ge the database.
1a240 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
1a250 69 6e 65 20 73 74 61 72 74 73 20 61 20 6e 65 77  ine starts a new
1a260 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 66 20   transaction if 
1a270 77 65 20 61 72 65 20 6e 6f 74 20 61 6c 72 65 61  we are not alrea
1a280 64 79 20 77 69 74 68 69 6e 0a 2a 2a 20 61 20 74  dy within.** a t
1a290 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 49 66 20  ransaction.  If 
1a2a0 77 65 20 61 72 65 20 61 6c 72 65 61 64 79 20 77  we are already w
1a2b0 69 74 68 69 6e 20 61 20 74 72 61 6e 73 61 63 74  ithin a transact
1a2c0 69 6f 6e 2c 20 74 68 65 6e 20 61 20 63 68 65 63  ion, then a chec
1a2d0 6b 70 6f 69 6e 74 0a 2a 2a 20 69 73 20 73 65 74  kpoint.** is set
1a2e0 20 69 66 20 74 68 65 20 73 65 74 53 74 61 74 65   if the setState
1a2f0 6d 65 6e 74 20 70 61 72 61 6d 65 74 65 72 20 69  ment parameter i
1a300 73 20 74 72 75 65 2e 20 20 41 20 63 68 65 63 6b  s true.  A check
1a310 70 6f 69 6e 74 20 73 68 6f 75 6c 64 0a 2a 2a 20  point should.** 
1a320 62 65 20 73 65 74 20 66 6f 72 20 6f 70 65 72 61  be set for opera
1a330 74 69 6f 6e 73 20 74 68 61 74 20 6d 69 67 68 74  tions that might
1a340 20 66 61 69 6c 20 28 64 75 65 20 74 6f 20 61 20   fail (due to a 
1a350 63 6f 6e 73 74 72 61 69 6e 74 29 20 70 61 72 74  constraint) part
1a360 20 6f 66 0a 2a 2a 20 74 68 65 20 77 61 79 20 74   of.** the way t
1a370 68 72 6f 75 67 68 20 61 6e 64 20 77 68 69 63 68  hrough and which
1a380 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20 75 6e   will need to un
1a390 64 6f 20 73 6f 6d 65 20 77 72 69 74 65 73 20 77  do some writes w
1a3a0 69 74 68 6f 75 74 20 68 61 76 69 6e 67 20 74 6f  ithout having to
1a3b0 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65  .** rollback the
1a3c0 20 77 68 6f 6c 65 20 74 72 61 6e 73 61 63 74 69   whole transacti
1a3d0 6f 6e 2e 20 20 46 6f 72 20 6f 70 65 72 61 74 69  on.  For operati
1a3e0 6f 6e 73 20 77 68 65 72 65 20 61 6c 6c 20 63 6f  ons where all co
1a3f0 6e 73 74 72 61 69 6e 74 73 0a 2a 2a 20 63 61 6e  nstraints.** can
1a400 20 62 65 20 63 68 65 63 6b 65 64 20 62 65 66 6f   be checked befo
1a410 72 65 20 61 6e 79 20 63 68 61 6e 67 65 73 20 61  re any changes a
1a420 72 65 20 6d 61 64 65 20 74 6f 20 74 68 65 20 64  re made to the d
1a430 61 74 61 62 61 73 65 2c 20 69 74 20 69 73 20 6e  atabase, it is n
1a440 65 76 65 72 0a 2a 2a 20 6e 65 63 65 73 73 61 72  ever.** necessar
1a450 79 20 74 6f 20 75 6e 64 6f 20 61 20 77 72 69 74  y to undo a writ
1a460 65 20 61 6e 64 20 74 68 65 20 63 68 65 63 6b 70  e and the checkp
1a470 6f 69 6e 74 20 73 68 6f 75 6c 64 20 6e 6f 74 20  oint should not 
1a480 62 65 20 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 4f 6e  be set..**.** On
1a490 6c 79 20 64 61 74 61 62 61 73 65 20 69 44 62 20  ly database iDb 
1a4a0 61 6e 64 20 74 68 65 20 74 65 6d 70 20 64 61 74  and the temp dat
1a4b0 61 62 61 73 65 20 61 72 65 20 6d 61 64 65 20 77  abase are made w
1a4c0 72 69 74 61 62 6c 65 20 62 79 20 74 68 69 73 20  ritable by this 
1a4d0 63 61 6c 6c 2e 0a 2a 2a 20 49 66 20 69 44 62 3d  call..** If iDb=
1a4e0 3d 30 2c 20 74 68 65 6e 20 74 68 65 20 6d 61 69  =0, then the mai
1a4f0 6e 20 61 6e 64 20 74 65 6d 70 20 64 61 74 61 62  n and temp datab
1a500 61 73 65 73 20 61 72 65 20 6d 61 64 65 20 77 72  ases are made wr
1a510 69 74 61 62 6c 65 2e 20 20 20 49 66 0a 2a 2a 20  itable.   If.** 
1a520 69 44 62 3d 3d 31 20 74 68 65 6e 20 6f 6e 6c 79  iDb==1 then only
1a530 20 74 68 65 20 74 65 6d 70 20 64 61 74 61 62 61   the temp databa
1a540 73 65 20 69 73 20 6d 61 64 65 20 77 72 69 74 61  se is made writa
1a550 62 6c 65 2e 20 20 49 66 20 69 44 62 3e 31 20 74  ble.  If iDb>1 t
1a560 68 65 6e 20 74 68 65 0a 2a 2a 20 73 70 65 63 69  hen the.** speci
1a570 66 69 65 64 20 61 75 78 69 6c 69 61 72 79 20 64  fied auxiliary d
1a580 61 74 61 62 61 73 65 20 61 6e 64 20 74 68 65 20  atabase and the 
1a590 74 65 6d 70 20 64 61 74 61 62 61 73 65 20 61 72  temp database ar
1a5a0 65 20 6d 61 64 65 20 77 72 69 74 61 62 6c 65 2e  e made writable.
1a5b0 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
1a5c0 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74  BeginWriteOperat
1a5d0 69 6f 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73  ion(Parse *pPars
1a5e0 65 2c 20 69 6e 74 20 73 65 74 53 74 61 74 65 6d  e, int setStatem
1a5f0 65 6e 74 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20  ent, int iDb){. 
1a600 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74   Vdbe *v = sqlit
1a610 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
1a620 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20  );.  if( v==0 ) 
1a630 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65  return;.  sqlite
1a640 33 43 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d  3CodeVerifySchem
1a650 61 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a  a(pParse, iDb);.
1a660 20 20 70 50 61 72 73 65 2d 3e 77 72 69 74 65 4d    pParse->writeM
1a670 61 73 6b 20 7c 3d 20 31 3c 3c 69 44 62 3b 0a 20  ask |= 1<<iDb;. 
1a680 20 69 66 28 20 73 65 74 53 74 61 74 65 6d 65 6e   if( setStatemen
1a690 74 20 26 26 20 70 50 61 72 73 65 2d 3e 6e 65 73  t && pParse->nes
1a6a0 74 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  ted==0 ){.    sq
1a6b0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
1a6c0 76 2c 20 4f 50 5f 53 74 61 74 65 6d 65 6e 74 2c  v, OP_Statement,
1a6d0 20 69 44 62 29 3b 0a 20 20 7d 0a 20 20 69 66 28   iDb);.  }.  if(
1a6e0 20 28 4f 4d 49 54 5f 54 45 4d 50 44 42 20 7c 7c   (OMIT_TEMPDB ||
1a6f0 20 69 44 62 21 3d 31 29 20 26 26 20 70 50 61 72   iDb!=1) && pPar
1a700 73 65 2d 3e 64 62 2d 3e 61 44 62 5b 31 5d 2e 70  se->db->aDb[1].p
1a710 42 74 21 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  Bt!=0 ){.    sql
1a720 69 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70  ite3BeginWriteOp
1a730 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20  eration(pParse, 
1a740 73 65 74 53 74 61 74 65 6d 65 6e 74 2c 20 31 29  setStatement, 1)
1a750 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  ;.  }.}../*.** C
1a760 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 70  heck to see if p
1a770 49 6e 64 65 78 20 75 73 65 73 20 74 68 65 20 63  Index uses the c
1a780 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
1a790 65 20 70 43 6f 6c 6c 2e 20 20 52 65 74 75 72 6e  e pColl.  Return
1a7a0 0a 2a 2a 20 74 72 75 65 20 69 66 20 69 74 20 64  .** true if it d
1a7b0 6f 65 73 20 61 6e 64 20 66 61 6c 73 65 20 69 66  oes and false if
1a7c0 20 69 74 20 64 6f 65 73 20 6e 6f 74 2e 0a 2a 2f   it does not..*/
1a7d0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1a7e0 4f 4d 49 54 5f 52 45 49 4e 44 45 58 0a 73 74 61  OMIT_REINDEX.sta
1a7f0 74 69 63 20 69 6e 74 20 63 6f 6c 6c 61 74 69 6f  tic int collatio
1a800 6e 4d 61 74 63 68 28 63 6f 6e 73 74 20 63 68 61  nMatch(const cha
1a810 72 20 2a 7a 43 6f 6c 6c 2c 20 49 6e 64 65 78 20  r *zColl, Index 
1a820 2a 70 49 6e 64 65 78 29 7b 0a 20 20 69 6e 74 20  *pIndex){.  int 
1a830 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  i;.  for(i=0; i<
1a840 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b  pIndex->nColumn;
1a850 20 69 2b 2b 29 7b 0a 20 20 20 20 63 6f 6e 73 74   i++){.    const
1a860 20 63 68 61 72 20 2a 7a 20 3d 20 70 49 6e 64 65   char *z = pInde
1a870 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 3b 0a 20 20  x->azColl[i];.  
1a880 20 20 69 66 28 20 7a 3d 3d 7a 43 6f 6c 6c 20 7c    if( z==zColl |
1a890 7c 20 28 7a 20 26 26 20 7a 43 6f 6c 6c 20 26 26  | (z && zColl &&
1a8a0 20 30 3d 3d 73 71 6c 69 74 65 33 53 74 72 49 43   0==sqlite3StrIC
1a8b0 6d 70 28 7a 2c 20 7a 43 6f 6c 6c 29 29 20 29 7b  mp(z, zColl)) ){
1a8c0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b  .      return 1;
1a8d0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
1a8e0 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a  urn 0;.}.#endif.
1a8f0 0a 2f 2a 0a 2a 2a 20 52 65 63 6f 6d 70 75 74 65  ./*.** Recompute
1a900 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 6f 66 20   all indices of 
1a910 70 54 61 62 20 74 68 61 74 20 75 73 65 20 74 68  pTab that use th
1a920 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  e collating sequ
1a930 65 6e 63 65 20 70 43 6f 6c 6c 2e 0a 2a 2a 20 49  ence pColl..** I
1a940 66 20 70 43 6f 6c 6c 3d 3d 30 20 74 68 65 6e 20  f pColl==0 then 
1a950 72 65 63 6f 6d 70 75 74 65 20 61 6c 6c 20 69 6e  recompute all in
1a960 64 69 63 65 73 20 6f 66 20 70 54 61 62 2e 0a 2a  dices of pTab..*
1a970 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
1a980 5f 4f 4d 49 54 5f 52 45 49 4e 44 45 58 0a 73 74  _OMIT_REINDEX.st
1a990 61 74 69 63 20 76 6f 69 64 20 72 65 69 6e 64 65  atic void reinde
1a9a0 78 54 61 62 6c 65 28 50 61 72 73 65 20 2a 70 50  xTable(Parse *pP
1a9b0 61 72 73 65 2c 20 54 61 62 6c 65 20 2a 70 54 61  arse, Table *pTa
1a9c0 62 2c 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a  b, char const *z
1a9d0 43 6f 6c 6c 29 7b 0a 20 20 49 6e 64 65 78 20 2a  Coll){.  Index *
1a9e0 70 49 6e 64 65 78 3b 20 20 20 20 20 20 20 20 20  pIndex;         
1a9f0 20 20 20 20 20 2f 2a 20 41 6e 20 69 6e 64 65 78       /* An index
1aa00 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
1aa10 20 70 54 61 62 20 2a 2f 0a 0a 20 20 66 6f 72 28   pTab */..  for(
1aa20 70 49 6e 64 65 78 3d 70 54 61 62 2d 3e 70 49 6e  pIndex=pTab->pIn
1aa30 64 65 78 3b 20 70 49 6e 64 65 78 3b 20 70 49 6e  dex; pIndex; pIn
1aa40 64 65 78 3d 70 49 6e 64 65 78 2d 3e 70 4e 65 78  dex=pIndex->pNex
1aa50 74 29 7b 0a 20 20 20 20 69 66 28 20 7a 43 6f 6c  t){.    if( zCol
1aa60 6c 3d 3d 30 20 7c 7c 20 63 6f 6c 6c 61 74 69 6f  l==0 || collatio
1aa70 6e 4d 61 74 63 68 28 7a 43 6f 6c 6c 2c 20 70 49  nMatch(zColl, pI
1aa80 6e 64 65 78 29 20 29 7b 0a 20 20 20 20 20 20 69  ndex) ){.      i
1aa90 6e 74 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33  nt iDb = sqlite3
1aaa0 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 70 50  SchemaToIndex(pP
1aab0 61 72 73 65 2d 3e 64 62 2c 20 70 54 61 62 2d 3e  arse->db, pTab->
1aac0 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 20 20  pSchema);.      
1aad0 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74  sqlite3BeginWrit
1aae0 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73  eOperation(pPars
1aaf0 65 2c 20 30 2c 20 69 44 62 29 3b 0a 20 20 20 20  e, 0, iDb);.    
1ab00 20 20 73 71 6c 69 74 65 33 52 65 66 69 6c 6c 49    sqlite3RefillI
1ab10 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70 49 6e  ndex(pParse, pIn
1ab20 64 65 78 2c 20 2d 31 29 3b 0a 20 20 20 20 7d 0a  dex, -1);.    }.
1ab30 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a    }.}.#endif../*
1ab40 0a 2a 2a 20 52 65 63 6f 6d 70 75 74 65 20 61 6c  .** Recompute al
1ab50 6c 20 69 6e 64 69 63 65 73 20 6f 66 20 61 6c 6c  l indices of all
1ab60 20 74 61 62 6c 65 73 20 69 6e 20 61 6c 6c 20 64   tables in all d
1ab70 61 74 61 62 61 73 65 73 20 77 68 65 72 65 20 74  atabases where t
1ab80 68 65 0a 2a 2a 20 69 6e 64 69 63 65 73 20 75 73  he.** indices us
1ab90 65 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20  e the collating 
1aba0 73 65 71 75 65 6e 63 65 20 70 43 6f 6c 6c 2e 20  sequence pColl. 
1abb0 20 49 66 20 70 43 6f 6c 6c 3d 3d 30 20 74 68 65   If pColl==0 the
1abc0 6e 20 72 65 63 6f 6d 70 75 74 65 0a 2a 2a 20 61  n recompute.** a
1abd0 6c 6c 20 69 6e 64 69 63 65 73 20 65 76 65 72 79  ll indices every
1abe0 77 68 65 72 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65  where..*/.#ifnde
1abf0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 52 45  f SQLITE_OMIT_RE
1ac00 49 4e 44 45 58 0a 73 74 61 74 69 63 20 76 6f 69  INDEX.static voi
1ac10 64 20 72 65 69 6e 64 65 78 44 61 74 61 62 61 73  d reindexDatabas
1ac20 65 73 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  es(Parse *pParse
1ac30 2c 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 43  , char const *zC
1ac40 6f 6c 6c 29 7b 0a 20 20 44 62 20 2a 70 44 62 3b  oll){.  Db *pDb;
1ac50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ac60 20 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20      /* A single 
1ac70 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 69 6e  database */.  in
1ac80 74 20 69 44 62 3b 20 20 20 20 20 20 20 20 20 20  t iDb;          
1ac90 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1aca0 20 64 61 74 61 62 61 73 65 20 69 6e 64 65 78 20   database index 
1acb0 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 73 71 6c 69  number */.  sqli
1acc0 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
1acd0 2d 3e 64 62 3b 20 20 20 2f 2a 20 54 68 65 20 64  ->db;   /* The d
1ace0 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
1acf0 6f 6e 20 2a 2f 0a 20 20 48 61 73 68 45 6c 65 6d  on */.  HashElem
1ad00 20 2a 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20   *k;            
1ad10 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69      /* For loopi
1ad20 6e 67 20 6f 76 65 72 20 74 61 62 6c 65 73 20 69  ng over tables i
1ad30 6e 20 70 44 62 20 2a 2f 0a 20 20 54 61 62 6c 65  n pDb */.  Table
1ad40 20 2a 70 54 61 62 3b 20 20 20 20 20 20 20 20 20   *pTab;         
1ad50 20 20 20 20 20 20 20 2f 2a 20 41 20 74 61 62 6c         /* A tabl
1ad60 65 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  e in the databas
1ad70 65 20 2a 2f 0a 0a 20 20 66 6f 72 28 69 44 62 3d  e */..  for(iDb=
1ad80 30 2c 20 70 44 62 3d 64 62 2d 3e 61 44 62 3b 20  0, pDb=db->aDb; 
1ad90 69 44 62 3c 64 62 2d 3e 6e 44 62 3b 20 69 44 62  iDb<db->nDb; iDb
1ada0 2b 2b 2c 20 70 44 62 2b 2b 29 7b 0a 20 20 20 20  ++, pDb++){.    
1adb0 61 73 73 65 72 74 28 20 70 44 62 21 3d 30 20 29  assert( pDb!=0 )
1adc0 3b 0a 20 20 20 20 66 6f 72 28 6b 3d 73 71 6c 69  ;.    for(k=sqli
1add0 74 65 48 61 73 68 46 69 72 73 74 28 26 70 44 62  teHashFirst(&pDb
1ade0 2d 3e 70 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61  ->pSchema->tblHa
1adf0 73 68 29 3b 20 20 6b 3b 20 6b 3d 73 71 6c 69 74  sh);  k; k=sqlit
1ae00 65 48 61 73 68 4e 65 78 74 28 6b 29 29 7b 0a 20  eHashNext(k)){. 
1ae10 20 20 20 20 20 70 54 61 62 20 3d 20 28 54 61 62       pTab = (Tab
1ae20 6c 65 2a 29 73 71 6c 69 74 65 48 61 73 68 44 61  le*)sqliteHashDa
1ae30 74 61 28 6b 29 3b 0a 20 20 20 20 20 20 72 65 69  ta(k);.      rei
1ae40 6e 64 65 78 54 61 62 6c 65 28 70 50 61 72 73 65  ndexTable(pParse
1ae50 2c 20 70 54 61 62 2c 20 7a 43 6f 6c 6c 29 3b 0a  , pTab, zColl);.
1ae60 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64      }.  }.}.#end
1ae70 69 66 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  if../*.** Genera
1ae80 74 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20  te code for the 
1ae90 52 45 49 4e 44 45 58 20 63 6f 6d 6d 61 6e 64 2e  REINDEX command.
1aea0 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 52 45  .**.**        RE
1aeb0 49 4e 44 45 58 20 20 20 20 20 20 20 20 20 20 20  INDEX           
1aec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1aed0 20 2d 2d 20 31 0a 2a 2a 20 20 20 20 20 20 20 20   -- 1.**        
1aee0 52 45 49 4e 44 45 58 20 20 3c 63 6f 6c 6c 61 74  REINDEX  <collat
1aef0 69 6f 6e 3e 20 20 20 20 20 20 20 20 20 20 20 20  ion>            
1af00 20 20 20 2d 2d 20 32 0a 2a 2a 20 20 20 20 20 20     -- 2.**      
1af10 20 20 52 45 49 4e 44 45 58 20 20 3f 3c 64 61 74    REINDEX  ?<dat
1af20 61 62 61 73 65 3e 2e 3f 3c 74 61 62 6c 65 6e 61  abase>.?<tablena
1af30 6d 65 3e 20 20 2d 2d 20 33 0a 2a 2a 20 20 20 20  me>  -- 3.**    
1af40 20 20 20 20 52 45 49 4e 44 45 58 20 20 3f 3c 64      REINDEX  ?<d
1af50 61 74 61 62 61 73 65 3e 2e 3f 3c 69 6e 64 65 78  atabase>.?<index
1af60 6e 61 6d 65 3e 20 20 2d 2d 20 34 0a 2a 2a 0a 2a  name>  -- 4.**.*
1af70 2a 20 46 6f 72 6d 20 31 20 63 61 75 73 65 73 20  * Form 1 causes 
1af80 61 6c 6c 20 69 6e 64 69 63 65 73 20 69 6e 20 61  all indices in a
1af90 6c 6c 20 61 74 74 61 63 68 65 64 20 64 61 74 61  ll attached data
1afa0 62 61 73 65 73 20 74 6f 20 62 65 20 72 65 62 75  bases to be rebu
1afb0 69 6c 74 2e 0a 2a 2a 20 46 6f 72 6d 20 32 20 72  ilt..** Form 2 r
1afc0 65 62 75 69 6c 64 73 20 61 6c 6c 20 69 6e 64 69  ebuilds all indi
1afd0 63 65 73 20 69 6e 20 61 6c 6c 20 64 61 74 61 62  ces in all datab
1afe0 61 73 65 73 20 74 68 61 74 20 75 73 65 20 74 68  ases that use th
1aff0 65 20 6e 61 6d 65 64 0a 2a 2a 20 63 6f 6c 6c 61  e named.** colla
1b000 74 69 6e 67 20 66 75 6e 63 74 69 6f 6e 2e 20 20  ting function.  
1b010 46 6f 72 6d 73 20 33 20 61 6e 64 20 34 20 72 65  Forms 3 and 4 re
1b020 62 75 69 6c 64 20 74 68 65 20 6e 61 6d 65 64 20  build the named 
1b030 69 6e 64 65 78 20 6f 72 20 61 6c 6c 0a 2a 2a 20  index or all.** 
1b040 69 6e 64 69 63 65 73 20 61 73 73 6f 63 69 61 74  indices associat
1b050 65 64 20 77 69 74 68 20 74 68 65 20 6e 61 6d 65  ed with the name
1b060 64 20 74 61 62 6c 65 2e 0a 2a 2f 0a 23 69 66 6e  d table..*/.#ifn
1b070 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1b080 52 45 49 4e 44 45 58 0a 76 6f 69 64 20 73 71 6c  REINDEX.void sql
1b090 69 74 65 33 52 65 69 6e 64 65 78 28 50 61 72 73  ite3Reindex(Pars
1b0a0 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e  e *pParse, Token
1b0b0 20 2a 70 4e 61 6d 65 31 2c 20 54 6f 6b 65 6e 20   *pName1, Token 
1b0c0 2a 70 4e 61 6d 65 32 29 7b 0a 20 20 43 6f 6c 6c  *pName2){.  Coll
1b0d0 53 65 71 20 2a 70 43 6f 6c 6c 3b 20 20 20 20 20  Seq *pColl;     
1b0e0 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 6c 61          /* Colla
1b0f0 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 74 6f  ting sequence to
1b100 20 62 65 20 72 65 69 6e 64 65 78 65 64 2c 20 6f   be reindexed, o
1b110 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 63 68 61 72  r NULL */.  char
1b120 20 2a 7a 3b 20 20 20 20 20 20 20 20 20 20 20 20   *z;            
1b130 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
1b140 6f 66 20 61 20 74 61 62 6c 65 20 6f 72 20 69 6e  of a table or in
1b150 64 65 78 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  dex */.  const c
1b160 68 61 72 20 2a 7a 44 62 3b 20 20 20 20 20 20 20  har *zDb;       
1b170 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
1b180 74 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  the database */.
1b190 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 20 20    Table *pTab;  
1b1a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1b1b0 20 41 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20   A table in the 
1b1c0 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 49 6e  database */.  In
1b1d0 64 65 78 20 2a 70 49 6e 64 65 78 3b 20 20 20 20  dex *pIndex;    
1b1e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20            /* An 
1b1f0 69 6e 64 65 78 20 61 73 73 6f 63 69 61 74 65 64  index associated
1b200 20 77 69 74 68 20 70 54 61 62 20 2a 2f 0a 20 20   with pTab */.  
1b210 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20 20 20  int iDb;        
1b220 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1b230 68 65 20 64 61 74 61 62 61 73 65 20 69 6e 64 65  he database inde
1b240 78 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 73 71  x number */.  sq
1b250 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
1b260 73 65 2d 3e 64 62 3b 20 20 20 2f 2a 20 54 68 65  se->db;   /* The
1b270 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
1b280 74 69 6f 6e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  tion */.  Token 
1b290 2a 70 4f 62 6a 4e 61 6d 65 3b 20 20 20 20 20 20  *pObjName;      
1b2a0 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
1b2b0 20 74 68 65 20 74 61 62 6c 65 20 6f 72 20 69 6e   the table or in
1b2c0 64 65 78 20 74 6f 20 62 65 20 72 65 69 6e 64 65  dex to be reinde
1b2d0 78 65 64 20 2a 2f 0a 0a 20 20 2f 2a 20 52 65 61  xed */..  /* Rea
1b2e0 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  d the database s
1b2f0 63 68 65 6d 61 2e 20 49 66 20 61 6e 20 65 72 72  chema. If an err
1b300 6f 72 20 6f 63 63 75 72 73 2c 20 6c 65 61 76 65  or occurs, leave
1b310 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67   an error messag
1b320 65 0a 20 20 2a 2a 20 61 6e 64 20 63 6f 64 65 20  e.  ** and code 
1b330 69 6e 20 70 50 61 72 73 65 20 61 6e 64 20 72 65  in pParse and re
1b340 74 75 72 6e 20 4e 55 4c 4c 2e 20 2a 2f 0a 20 20  turn NULL. */.  
1b350 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73  if( SQLITE_OK!=s
1b360 71 6c 69 74 65 33 52 65 61 64 53 63 68 65 6d 61  qlite3ReadSchema
1b370 28 70 50 61 72 73 65 29 20 29 7b 0a 20 20 20 20  (pParse) ){.    
1b380 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 69  return;.  }..  i
1b390 66 28 20 70 4e 61 6d 65 31 3d 3d 30 20 7c 7c 20  f( pName1==0 || 
1b3a0 70 4e 61 6d 65 31 2d 3e 7a 3d 3d 30 20 29 7b 0a  pName1->z==0 ){.
1b3b0 20 20 20 20 72 65 69 6e 64 65 78 44 61 74 61 62      reindexDatab
1b3c0 61 73 65 73 28 70 50 61 72 73 65 2c 20 30 29 3b  ases(pParse, 0);
1b3d0 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
1b3e0 65 6c 73 65 20 69 66 28 20 70 4e 61 6d 65 32 3d  else if( pName2=
1b3f0 3d 30 20 7c 7c 20 70 4e 61 6d 65 32 2d 3e 7a 3d  =0 || pName2->z=
1b400 3d 30 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a  =0 ){.    char *
1b410 7a 43 6f 6c 6c 3b 0a 20 20 20 20 61 73 73 65 72  zColl;.    asser
1b420 74 28 20 70 4e 61 6d 65 31 2d 3e 7a 20 29 3b 0a  t( pName1->z );.
1b430 20 20 20 20 7a 43 6f 6c 6c 20 3d 20 73 71 6c 69      zColl = sqli
1b440 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e  te3NameFromToken
1b450 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 4e 61  (pParse->db, pNa
1b460 6d 65 31 29 3b 0a 20 20 20 20 69 66 28 20 21 7a  me1);.    if( !z
1b470 43 6f 6c 6c 20 29 20 72 65 74 75 72 6e 3b 0a 20  Coll ) return;. 
1b480 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74     pColl = sqlit
1b490 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28 64 62  e3FindCollSeq(db
1b4a0 2c 20 45 4e 43 28 64 62 29 2c 20 7a 43 6f 6c 6c  , ENC(db), zColl
1b4b0 2c 20 2d 31 2c 20 30 29 3b 0a 20 20 20 20 69 66  , -1, 0);.    if
1b4c0 28 20 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20  ( pColl ){.     
1b4d0 20 69 66 28 20 7a 43 6f 6c 6c 20 29 7b 0a 20 20   if( zColl ){.  
1b4e0 20 20 20 20 20 20 72 65 69 6e 64 65 78 44 61 74        reindexDat
1b4f0 61 62 61 73 65 73 28 70 50 61 72 73 65 2c 20 7a  abases(pParse, z
1b500 43 6f 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20 73  Coll);.        s
1b510 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
1b520 20 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20 20 20 7d   zColl);.      }
1b530 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  .      return;. 
1b540 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
1b550 44 62 46 72 65 65 28 64 62 2c 20 7a 43 6f 6c 6c  DbFree(db, zColl
1b560 29 3b 0a 20 20 7d 0a 20 20 69 44 62 20 3d 20 73  );.  }.  iDb = s
1b570 71 6c 69 74 65 33 54 77 6f 50 61 72 74 4e 61 6d  qlite3TwoPartNam
1b580 65 28 70 50 61 72 73 65 2c 20 70 4e 61 6d 65 31  e(pParse, pName1
1b590 2c 20 70 4e 61 6d 65 32 2c 20 26 70 4f 62 6a 4e  , pName2, &pObjN
1b5a0 61 6d 65 29 3b 0a 20 20 69 66 28 20 69 44 62 3c  ame);.  if( iDb<
1b5b0 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 7a 20  0 ) return;.  z 
1b5c0 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f  = sqlite3NameFro
1b5d0 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 4f 62 6a 4e  mToken(db, pObjN
1b5e0 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a 3d 3d 30  ame);.  if( z==0
1b5f0 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 7a 44 62   ) return;.  zDb
1b600 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e   = db->aDb[iDb].
1b610 7a 4e 61 6d 65 3b 0a 20 20 70 54 61 62 20 3d 20  zName;.  pTab = 
1b620 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65  sqlite3FindTable
1b630 28 64 62 2c 20 7a 2c 20 7a 44 62 29 3b 0a 20 20  (db, z, zDb);.  
1b640 69 66 28 20 70 54 61 62 20 29 7b 0a 20 20 20 20  if( pTab ){.    
1b650 72 65 69 6e 64 65 78 54 61 62 6c 65 28 70 50 61  reindexTable(pPa
1b660 72 73 65 2c 20 70 54 61 62 2c 20 30 29 3b 0a 20  rse, pTab, 0);. 
1b670 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
1b680 28 64 62 2c 20 7a 29 3b 0a 20 20 20 20 72 65 74  (db, z);.    ret
1b690 75 72 6e 3b 0a 20 20 7d 0a 20 20 70 49 6e 64 65  urn;.  }.  pInde
1b6a0 78 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 49  x = sqlite3FindI
1b6b0 6e 64 65 78 28 64 62 2c 20 7a 2c 20 7a 44 62 29  ndex(db, z, zDb)
1b6c0 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  ;.  sqlite3DbFre
1b6d0 65 28 64 62 2c 20 7a 29 3b 0a 20 20 69 66 28 20  e(db, z);.  if( 
1b6e0 70 49 6e 64 65 78 20 29 7b 0a 20 20 20 20 73 71  pIndex ){.    sq
1b6f0 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f  lite3BeginWriteO
1b700 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c  peration(pParse,
1b710 20 30 2c 20 69 44 62 29 3b 0a 20 20 20 20 73 71   0, iDb);.    sq
1b720 6c 69 74 65 33 52 65 66 69 6c 6c 49 6e 64 65 78  lite3RefillIndex
1b730 28 70 50 61 72 73 65 2c 20 70 49 6e 64 65 78 2c  (pParse, pIndex,
1b740 20 2d 31 29 3b 0a 20 20 20 20 72 65 74 75 72 6e   -1);.    return
1b750 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45  ;.  }.  sqlite3E
1b760 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
1b770 22 75 6e 61 62 6c 65 20 74 6f 20 69 64 65 6e 74  "unable to ident
1b780 69 66 79 20 74 68 65 20 6f 62 6a 65 63 74 20 74  ify the object t
1b790 6f 20 62 65 20 72 65 69 6e 64 65 78 65 64 22 29  o be reindexed")
1b7a0 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
1b7b0 2a 20 52 65 74 75 72 6e 20 61 20 64 79 6e 61 6d  * Return a dynam
1b7c0 69 63 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 4b  icly allocated K
1b7d0 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  eyInfo structure
1b7e0 20 74 68 61 74 20 63 61 6e 20 62 65 20 75 73 65   that can be use
1b7f0 64 0a 2a 2a 20 77 69 74 68 20 4f 50 5f 4f 70 65  d.** with OP_Ope
1b800 6e 52 65 61 64 20 6f 72 20 4f 50 5f 4f 70 65 6e  nRead or OP_Open
1b810 57 72 69 74 65 20 74 6f 20 61 63 63 65 73 73 20  Write to access 
1b820 64 61 74 61 62 61 73 65 20 69 6e 64 65 78 20 70  database index p
1b830 49 64 78 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75  Idx..**.** If su
1b840 63 63 65 73 73 66 75 6c 2c 20 61 20 70 6f 69 6e  ccessful, a poin
1b850 74 65 72 20 74 6f 20 74 68 65 20 6e 65 77 20 73  ter to the new s
1b860 74 72 75 63 74 75 72 65 20 69 73 20 72 65 74 75  tructure is retu
1b870 72 6e 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61  rned. In this ca
1b880 73 65 0a 2a 2a 20 74 68 65 20 63 61 6c 6c 65 72  se.** the caller
1b890 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20   is responsible 
1b8a0 66 6f 72 20 63 61 6c 6c 69 6e 67 20 73 71 6c 69  for calling sqli
1b8b0 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 29 20  te3DbFree(db, ) 
1b8c0 6f 6e 20 74 68 65 20 72 65 74 75 72 6e 65 64 20  on the returned 
1b8d0 0a 2a 2a 20 70 6f 69 6e 74 65 72 2e 20 49 66 20  .** pointer. If 
1b8e0 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  an error occurs 
1b8f0 28 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 20 6f  (out of memory o
1b900 72 20 6d 69 73 73 69 6e 67 20 63 6f 6c 6c 61 74  r missing collat
1b910 69 6f 6e 20 0a 2a 2a 20 73 65 71 75 65 6e 63 65  ion .** sequence
1b920 29 2c 20 4e 55 4c 4c 20 69 73 20 72 65 74 75 72  ), NULL is retur
1b930 6e 65 64 20 61 6e 64 20 74 68 65 20 73 74 61 74  ned and the stat
1b940 65 20 6f 66 20 70 50 61 72 73 65 20 75 70 64 61  e of pParse upda
1b950 74 65 64 20 74 6f 20 72 65 66 6c 65 63 74 0a 2a  ted to reflect.*
1b960 2a 20 74 68 65 20 65 72 72 6f 72 2e 0a 2a 2f 0a  * the error..*/.
1b970 4b 65 79 49 6e 66 6f 20 2a 73 71 6c 69 74 65 33  KeyInfo *sqlite3
1b980 49 6e 64 65 78 4b 65 79 69 6e 66 6f 28 50 61 72  IndexKeyinfo(Par
1b990 73 65 20 2a 70 50 61 72 73 65 2c 20 49 6e 64 65  se *pParse, Inde
1b9a0 78 20 2a 70 49 64 78 29 7b 0a 20 20 69 6e 74 20  x *pIdx){.  int 
1b9b0 69 3b 0a 20 20 69 6e 74 20 6e 43 6f 6c 20 3d 20  i;.  int nCol = 
1b9c0 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 0a 20  pIdx->nColumn;. 
1b9d0 20 69 6e 74 20 6e 42 79 74 65 73 20 3d 20 73 69   int nBytes = si
1b9e0 7a 65 6f 66 28 4b 65 79 49 6e 66 6f 29 20 2b 20  zeof(KeyInfo) + 
1b9f0 28 6e 43 6f 6c 2d 31 29 2a 73 69 7a 65 6f 66 28  (nCol-1)*sizeof(
1ba00 43 6f 6c 6c 53 65 71 2a 29 20 2b 20 6e 43 6f 6c  CollSeq*) + nCol
1ba10 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
1ba20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
1ba30 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 20 3d 20  KeyInfo *pKey = 
1ba40 28 4b 65 79 49 6e 66 6f 20 2a 29 73 71 6c 69 74  (KeyInfo *)sqlit
1ba50 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64  e3DbMallocZero(d
1ba60 62 2c 20 6e 42 79 74 65 73 29 3b 0a 0a 20 20 69  b, nBytes);..  i
1ba70 66 28 20 70 4b 65 79 20 29 7b 0a 20 20 20 20 70  f( pKey ){.    p
1ba80 4b 65 79 2d 3e 64 62 20 3d 20 70 50 61 72 73 65  Key->db = pParse
1ba90 2d 3e 64 62 3b 0a 20 20 20 20 70 4b 65 79 2d 3e  ->db;.    pKey->
1baa0 61 53 6f 72 74 4f 72 64 65 72 20 3d 20 28 75 38  aSortOrder = (u8
1bab0 20 2a 29 26 28 70 4b 65 79 2d 3e 61 43 6f 6c 6c   *)&(pKey->aColl
1bac0 5b 6e 43 6f 6c 5d 29 3b 0a 20 20 20 20 61 73 73  [nCol]);.    ass
1bad0 65 72 74 28 20 26 70 4b 65 79 2d 3e 61 53 6f 72  ert( &pKey->aSor
1bae0 74 4f 72 64 65 72 5b 6e 43 6f 6c 5d 3d 3d 26 28  tOrder[nCol]==&(
1baf0 28 28 75 38 20 2a 29 70 4b 65 79 29 5b 6e 42 79  ((u8 *)pKey)[nBy
1bb00 74 65 73 5d 29 20 29 3b 0a 20 20 20 20 66 6f 72  tes]) );.    for
1bb10 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b  (i=0; i<nCol; i+
1bb20 2b 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a  +){.      char *
1bb30 7a 43 6f 6c 6c 20 3d 20 70 49 64 78 2d 3e 61 7a  zColl = pIdx->az
1bb40 43 6f 6c 6c 5b 69 5d 3b 0a 20 20 20 20 20 20 61  Coll[i];.      a
1bb50 73 73 65 72 74 28 20 7a 43 6f 6c 6c 20 29 3b 0a  ssert( zColl );.
1bb60 20 20 20 20 20 20 70 4b 65 79 2d 3e 61 43 6f 6c        pKey->aCol
1bb70 6c 5b 69 5d 20 3d 20 73 71 6c 69 74 65 33 4c 6f  l[i] = sqlite3Lo
1bb80 63 61 74 65 43 6f 6c 6c 53 65 71 28 70 50 61 72  cateCollSeq(pPar
1bb90 73 65 2c 20 7a 43 6f 6c 6c 2c 20 2d 31 29 3b 0a  se, zColl, -1);.
1bba0 20 20 20 20 20 20 70 4b 65 79 2d 3e 61 53 6f 72        pKey->aSor
1bbb0 74 4f 72 64 65 72 5b 69 5d 20 3d 20 70 49 64 78  tOrder[i] = pIdx
1bbc0 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 3b  ->aSortOrder[i];
1bbd0 0a 20 20 20 20 7d 0a 20 20 20 20 70 4b 65 79 2d  .    }.    pKey-
1bbe0 3e 6e 46 69 65 6c 64 20 3d 20 6e 43 6f 6c 3b 0a  >nField = nCol;.
1bbf0 20 20 7d 0a 0a 20 20 69 66 28 20 70 50 61 72 73    }..  if( pPars
1bc00 65 2d 3e 6e 45 72 72 20 29 7b 0a 20 20 20 20 73  e->nErr ){.    s
1bc10 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
1bc20 20 70 4b 65 79 29 3b 0a 20 20 20 20 70 4b 65 79   pKey);.    pKey
1bc30 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75   = 0;.  }.  retu
1bc40 72 6e 20 70 4b 65 79 3b 0a 7d 0a                 rn pKey;.}.