/ Hex Artifact Content
Login

Artifact deb031f71a1797de99db01ec2ffbd060722ce0c6:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43 20 63  ile contains C c
0190: 6f 64 65 20 72 6f 75 74 69 6e 65 73 20 74 68 61  ode routines tha
01a0: 74 20 61 72 65 20 63 61 6c 6c 65 64 20 62 79 20  t are called by 
01b0: 74 68 65 20 53 51 4c 69 74 65 20 70 61 72 73 65  the SQLite parse
01c0: 72 0a 2a 2a 20 77 68 65 6e 20 73 79 6e 74 61 78  r.** when syntax
01d0: 20 72 75 6c 65 73 20 61 72 65 20 72 65 64 75 63   rules are reduc
01e0: 65 64 2e 20 20 54 68 65 20 72 6f 75 74 69 6e 65  ed.  The routine
01f0: 73 20 69 6e 20 74 68 69 73 20 66 69 6c 65 20 68  s in this file h
0200: 61 6e 64 6c 65 20 74 68 65 0a 2a 2a 20 66 6f 6c  andle the.** fol
0210: 6c 6f 77 69 6e 67 20 6b 69 6e 64 73 20 6f 66 20  lowing kinds of 
0220: 53 51 4c 20 73 79 6e 74 61 78 3a 0a 2a 2a 0a 2a  SQL syntax:.**.*
0230: 2a 20 20 20 20 20 43 52 45 41 54 45 20 54 41 42  *     CREATE TAB
0240: 4c 45 0a 2a 2a 20 20 20 20 20 44 52 4f 50 20 54  LE.**     DROP T
0250: 41 42 4c 45 0a 2a 2a 20 20 20 20 20 43 52 45 41  ABLE.**     CREA
0260: 54 45 20 49 4e 44 45 58 0a 2a 2a 20 20 20 20 20  TE INDEX.**     
0270: 44 52 4f 50 20 49 4e 44 45 58 0a 2a 2a 20 20 20  DROP INDEX.**   
0280: 20 20 63 72 65 61 74 69 6e 67 20 49 44 20 6c 69    creating ID li
0290: 73 74 73 0a 2a 2a 20 20 20 20 20 42 45 47 49 4e  sts.**     BEGIN
02a0: 20 54 52 41 4e 53 41 43 54 49 4f 4e 0a 2a 2a 20   TRANSACTION.** 
02b0: 20 20 20 20 43 4f 4d 4d 49 54 0a 2a 2a 20 20 20      COMMIT.**   
02c0: 20 20 52 4f 4c 4c 42 41 43 4b 0a 2a 2a 0a 2a 2a    ROLLBACK.**.**
02d0: 20 24 49 64 3a 20 62 75 69 6c 64 2e 63 2c 76 20   $Id: build.c,v 
02e0: 31 2e 34 36 38 20 32 30 30 38 2f 30 31 2f 32 31  1.468 2008/01/21
02f0: 20 31 36 3a 32 32 3a 34 36 20 64 72 68 20 45 78   16:22:46 drh Ex
0300: 70 20 24 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20  p $.*/.#include 
0310: 22 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a 23 69  "sqliteInt.h".#i
0320: 6e 63 6c 75 64 65 20 3c 63 74 79 70 65 2e 68 3e  nclude <ctype.h>
0330: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
0340: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77  tine is called w
0350: 68 65 6e 20 61 20 6e 65 77 20 53 51 4c 20 73 74  hen a new SQL st
0360: 61 74 65 6d 65 6e 74 20 69 73 20 62 65 67 69 6e  atement is begin
0370: 6e 69 6e 67 20 74 6f 0a 2a 2a 20 62 65 20 70 61  ning to.** be pa
0380: 72 73 65 64 2e 20 20 49 6e 69 74 69 61 6c 69 7a  rsed.  Initializ
0390: 65 20 74 68 65 20 70 50 61 72 73 65 20 73 74 72  e the pParse str
03a0: 75 63 74 75 72 65 20 61 73 20 6e 65 65 64 65 64  ucture as needed
03b0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
03c0: 33 42 65 67 69 6e 50 61 72 73 65 28 50 61 72 73  3BeginParse(Pars
03d0: 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 65  e *pParse, int e
03e0: 78 70 6c 61 69 6e 46 6c 61 67 29 7b 0a 20 20 70  xplainFlag){.  p
03f0: 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 20 3d  Parse->explain =
0400: 20 65 78 70 6c 61 69 6e 46 6c 61 67 3b 0a 20 20   explainFlag;.  
0410: 70 50 61 72 73 65 2d 3e 6e 56 61 72 20 3d 20 30  pParse->nVar = 0
0420: 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ;.}..#ifndef SQL
0430: 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f  ITE_OMIT_SHARED_
0440: 43 41 43 48 45 0a 2f 2a 0a 2a 2a 20 54 68 65 20  CACHE./*.** The 
0450: 54 61 62 6c 65 4c 6f 63 6b 20 73 74 72 75 63 74  TableLock struct
0460: 75 72 65 20 69 73 20 6f 6e 6c 79 20 75 73 65 64  ure is only used
0470: 20 62 79 20 74 68 65 20 73 71 6c 69 74 65 33 54   by the sqlite3T
0480: 61 62 6c 65 4c 6f 63 6b 28 29 20 61 6e 64 0a 2a  ableLock() and.*
0490: 2a 20 63 6f 64 65 54 61 62 6c 65 4c 6f 63 6b 73  * codeTableLocks
04a0: 28 29 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 2a 2f  () functions..*/
04b0: 0a 73 74 72 75 63 74 20 54 61 62 6c 65 4c 6f 63  .struct TableLoc
04c0: 6b 20 7b 0a 20 20 69 6e 74 20 69 44 62 3b 20 20  k {.  int iDb;  
04d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
04e0: 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74 61  e database conta
04f0: 69 6e 69 6e 67 20 74 68 65 20 74 61 62 6c 65 20  ining the table 
0500: 74 6f 20 62 65 20 6c 6f 63 6b 65 64 20 2a 2f 0a  to be locked */.
0510: 20 20 69 6e 74 20 69 54 61 62 3b 20 20 20 20 20    int iTab;     
0520: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 6f         /* The ro
0530: 6f 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 74  ot page of the t
0540: 61 62 6c 65 20 74 6f 20 62 65 20 6c 6f 63 6b 65  able to be locke
0550: 64 20 2a 2f 0a 20 20 75 38 20 69 73 57 72 69 74  d */.  u8 isWrit
0560: 65 4c 6f 63 6b 3b 20 20 20 20 20 20 2f 2a 20 54  eLock;      /* T
0570: 72 75 65 20 66 6f 72 20 77 72 69 74 65 20 6c 6f  rue for write lo
0580: 63 6b 2e 20 20 46 61 6c 73 65 20 66 6f 72 20 61  ck.  False for a
0590: 20 72 65 61 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20   read lock */.  
05a0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
05b0: 65 3b 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20  e;   /* Name of 
05c0: 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 7d 3b 0a  the table */.};.
05d0: 0a 2f 2a 0a 2a 2a 20 52 65 63 6f 72 64 20 74 68  ./*.** Record th
05e0: 65 20 66 61 63 74 20 74 68 61 74 20 77 65 20 77  e fact that we w
05f0: 61 6e 74 20 74 6f 20 6c 6f 63 6b 20 61 20 74 61  ant to lock a ta
0600: 62 6c 65 20 61 74 20 72 75 6e 2d 74 69 6d 65 2e  ble at run-time.
0610: 20 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 61 62    .**.** The tab
0620: 6c 65 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64 20  le to be locked 
0630: 68 61 73 20 72 6f 6f 74 20 70 61 67 65 20 69 54  has root page iT
0640: 61 62 20 61 6e 64 20 69 73 20 66 6f 75 6e 64 20  ab and is found 
0650: 69 6e 20 64 61 74 61 62 61 73 65 20 69 44 62 2e  in database iDb.
0660: 0a 2a 2a 20 41 20 72 65 61 64 20 6f 72 20 61 20  .** A read or a 
0670: 77 72 69 74 65 20 6c 6f 63 6b 20 63 61 6e 20 62  write lock can b
0680: 65 20 74 61 6b 65 6e 20 64 65 70 65 6e 64 69 6e  e taken dependin
0690: 67 20 6f 6e 20 69 73 57 72 69 74 65 6c 6f 63 6b  g on isWritelock
06a0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
06b0: 74 69 6e 65 20 6a 75 73 74 20 72 65 63 6f 72 64  tine just record
06c0: 73 20 74 68 65 20 66 61 63 74 20 74 68 61 74 20  s the fact that 
06d0: 74 68 65 20 6c 6f 63 6b 20 69 73 20 64 65 73 69  the lock is desi
06e0: 72 65 64 2e 20 20 54 68 65 0a 2a 2a 20 63 6f 64  red.  The.** cod
06f0: 65 20 74 6f 20 6d 61 6b 65 20 74 68 65 20 6c 6f  e to make the lo
0700: 63 6b 20 6f 63 63 75 72 20 69 73 20 67 65 6e 65  ck occur is gene
0710: 72 61 74 65 64 20 62 79 20 61 20 6c 61 74 65 72  rated by a later
0720: 20 63 61 6c 6c 20 74 6f 0a 2a 2a 20 63 6f 64 65   call to.** code
0730: 54 61 62 6c 65 4c 6f 63 6b 73 28 29 20 77 68 69  TableLocks() whi
0740: 63 68 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67  ch occurs during
0750: 20 73 71 6c 69 74 65 33 46 69 6e 69 73 68 43 6f   sqlite3FinishCo
0760: 64 69 6e 67 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20  ding()..*/.void 
0770: 73 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b  sqlite3TableLock
0780: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
0790: 65 2c 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e  e,     /* Parsin
07a0: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69  g context */.  i
07b0: 6e 74 20 69 44 62 2c 20 20 20 20 20 20 20 20 20  nt iDb,         
07c0: 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74 68    /* Index of th
07d0: 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74 61  e database conta
07e0: 69 6e 69 6e 67 20 74 68 65 20 74 61 62 6c 65 20  ining the table 
07f0: 74 6f 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 6e 74  to lock */.  int
0800: 20 69 54 61 62 2c 20 20 20 20 20 20 20 20 20 20   iTab,          
0810: 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20 6e 75 6d  /* Root page num
0820: 62 65 72 20 6f 66 20 74 68 65 20 74 61 62 6c 65  ber of the table
0830: 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64 20 2a 2f   to be locked */
0840: 0a 20 20 75 38 20 69 73 57 72 69 74 65 4c 6f 63  .  u8 isWriteLoc
0850: 6b 2c 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f  k,    /* True fo
0860: 72 20 61 20 77 72 69 74 65 20 6c 6f 63 6b 20 2a  r a write lock *
0870: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
0880: 7a 4e 61 6d 65 20 20 2f 2a 20 4e 61 6d 65 20 6f  zName  /* Name o
0890: 66 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20 62  f the table to b
08a0: 65 20 6c 6f 63 6b 65 64 20 2a 2f 0a 29 7b 0a 20  e locked */.){. 
08b0: 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e 42   int i;.  int nB
08c0: 79 74 65 73 3b 0a 20 20 54 61 62 6c 65 4c 6f 63  ytes;.  TableLoc
08d0: 6b 20 2a 70 3b 0a 0a 20 20 69 66 28 20 69 44 62  k *p;..  if( iDb
08e0: 3c 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  <0 ){.    return
08f0: 3b 0a 20 20 7d 0a 0a 20 20 66 6f 72 28 69 3d 30  ;.  }..  for(i=0
0900: 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e 54 61 62  ; i<pParse->nTab
0910: 6c 65 4c 6f 63 6b 3b 20 69 2b 2b 29 7b 0a 20 20  leLock; i++){.  
0920: 20 20 70 20 3d 20 26 70 50 61 72 73 65 2d 3e 61    p = &pParse->a
0930: 54 61 62 6c 65 4c 6f 63 6b 5b 69 5d 3b 0a 20 20  TableLock[i];.  
0940: 20 20 69 66 28 20 70 2d 3e 69 44 62 3d 3d 69 44    if( p->iDb==iD
0950: 62 20 26 26 20 70 2d 3e 69 54 61 62 3d 3d 69 54  b && p->iTab==iT
0960: 61 62 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 69  ab ){.      p->i
0970: 73 57 72 69 74 65 4c 6f 63 6b 20 3d 20 28 70 2d  sWriteLock = (p-
0980: 3e 69 73 57 72 69 74 65 4c 6f 63 6b 20 7c 7c 20  >isWriteLock || 
0990: 69 73 57 72 69 74 65 4c 6f 63 6b 29 3b 0a 20 20  isWriteLock);.  
09a0: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
09b0: 7d 0a 20 20 7d 0a 0a 20 20 6e 42 79 74 65 73 20  }.  }..  nBytes 
09c0: 3d 20 73 69 7a 65 6f 66 28 54 61 62 6c 65 4c 6f  = sizeof(TableLo
09d0: 63 6b 29 20 2a 20 28 70 50 61 72 73 65 2d 3e 6e  ck) * (pParse->n
09e0: 54 61 62 6c 65 4c 6f 63 6b 2b 31 29 3b 0a 20 20  TableLock+1);.  
09f0: 70 50 61 72 73 65 2d 3e 61 54 61 62 6c 65 4c 6f  pParse->aTableLo
0a00: 63 6b 20 3d 20 0a 20 20 20 20 20 20 73 71 6c 69  ck = .      sqli
0a10: 74 65 33 44 62 52 65 61 6c 6c 6f 63 4f 72 46 72  te3DbReallocOrFr
0a20: 65 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  ee(pParse->db, p
0a30: 50 61 72 73 65 2d 3e 61 54 61 62 6c 65 4c 6f 63  Parse->aTableLoc
0a40: 6b 2c 20 6e 42 79 74 65 73 29 3b 0a 20 20 69 66  k, nBytes);.  if
0a50: 28 20 70 50 61 72 73 65 2d 3e 61 54 61 62 6c 65  ( pParse->aTable
0a60: 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 70 20 3d 20  Lock ){.    p = 
0a70: 26 70 50 61 72 73 65 2d 3e 61 54 61 62 6c 65 4c  &pParse->aTableL
0a80: 6f 63 6b 5b 70 50 61 72 73 65 2d 3e 6e 54 61 62  ock[pParse->nTab
0a90: 6c 65 4c 6f 63 6b 2b 2b 5d 3b 0a 20 20 20 20 70  leLock++];.    p
0aa0: 2d 3e 69 44 62 20 3d 20 69 44 62 3b 0a 20 20 20  ->iDb = iDb;.   
0ab0: 20 70 2d 3e 69 54 61 62 20 3d 20 69 54 61 62 3b   p->iTab = iTab;
0ac0: 0a 20 20 20 20 70 2d 3e 69 73 57 72 69 74 65 4c  .    p->isWriteL
0ad0: 6f 63 6b 20 3d 20 69 73 57 72 69 74 65 4c 6f 63  ock = isWriteLoc
0ae0: 6b 3b 0a 20 20 20 20 70 2d 3e 7a 4e 61 6d 65 20  k;.    p->zName 
0af0: 3d 20 7a 4e 61 6d 65 3b 0a 20 20 7d 65 6c 73 65  = zName;.  }else
0b00: 7b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 54  {.    pParse->nT
0b10: 61 62 6c 65 4c 6f 63 6b 20 3d 20 30 3b 0a 20 20  ableLock = 0;.  
0b20: 20 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61    pParse->db->ma
0b30: 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a  llocFailed = 1;.
0b40: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64    }.}../*.** Cod
0b50: 65 20 61 6e 20 4f 50 5f 54 61 62 6c 65 4c 6f 63  e an OP_TableLoc
0b60: 6b 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 66 6f  k instruction fo
0b70: 72 20 65 61 63 68 20 74 61 62 6c 65 20 6c 6f 63  r each table loc
0b80: 6b 65 64 20 62 79 20 74 68 65 0a 2a 2a 20 73 74  ked by the.** st
0b90: 61 74 65 6d 65 6e 74 20 28 63 6f 6e 66 69 67 75  atement (configu
0ba0: 72 65 64 20 62 79 20 63 61 6c 6c 73 20 74 6f 20  red by calls to 
0bb0: 73 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b  sqlite3TableLock
0bc0: 28 29 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ())..*/.static v
0bd0: 6f 69 64 20 63 6f 64 65 54 61 62 6c 65 4c 6f 63  oid codeTableLoc
0be0: 6b 73 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ks(Parse *pParse
0bf0: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 56 64  ){.  int i;.  Vd
0c00: 62 65 20 2a 70 56 64 62 65 3b 20 0a 0a 20 20 69  be *pVdbe; ..  i
0c10: 66 28 20 30 3d 3d 28 70 56 64 62 65 20 3d 20 73  f( 0==(pVdbe = s
0c20: 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
0c30: 61 72 73 65 29 29 20 29 7b 0a 20 20 20 20 72 65  arse)) ){.    re
0c40: 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 66 6f 72  turn;.  }..  for
0c50: 28 69 3d 30 3b 20 69 3c 70 50 61 72 73 65 2d 3e  (i=0; i<pParse->
0c60: 6e 54 61 62 6c 65 4c 6f 63 6b 3b 20 69 2b 2b 29  nTableLock; i++)
0c70: 7b 0a 20 20 20 20 54 61 62 6c 65 4c 6f 63 6b 20  {.    TableLock 
0c80: 2a 70 20 3d 20 26 70 50 61 72 73 65 2d 3e 61 54  *p = &pParse->aT
0c90: 61 62 6c 65 4c 6f 63 6b 5b 69 5d 3b 0a 20 20 20  ableLock[i];.   
0ca0: 20 69 6e 74 20 70 31 20 3d 20 70 2d 3e 69 44 62   int p1 = p->iDb
0cb0: 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 73 57  ;.    if( p->isW
0cc0: 72 69 74 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20  riteLock ){.    
0cd0: 20 20 70 31 20 3d 20 2d 31 2a 28 70 31 2b 31 29    p1 = -1*(p1+1)
0ce0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
0cf0: 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 70 56  te3VdbeAddOp4(pV
0d00: 64 62 65 2c 20 4f 50 5f 54 61 62 6c 65 4c 6f 63  dbe, OP_TableLoc
0d10: 6b 2c 20 70 31 2c 20 70 2d 3e 69 54 61 62 2c 20  k, p1, p->iTab, 
0d20: 30 2c 20 70 2d 3e 7a 4e 61 6d 65 2c 20 50 34 5f  0, p->zName, P4_
0d30: 53 54 41 54 49 43 29 3b 0a 20 20 7d 0a 7d 0a 23  STATIC);.  }.}.#
0d40: 65 6c 73 65 0a 20 20 23 64 65 66 69 6e 65 20 63  else.  #define c
0d50: 6f 64 65 54 61 62 6c 65 4c 6f 63 6b 73 28 78 29  odeTableLocks(x)
0d60: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54  .#endif../*.** T
0d70: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
0d80: 61 6c 6c 65 64 20 61 66 74 65 72 20 61 20 73 69  alled after a si
0d90: 6e 67 6c 65 20 53 51 4c 20 73 74 61 74 65 6d 65  ngle SQL stateme
0da0: 6e 74 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20 70  nt has been.** p
0db0: 61 72 73 65 64 20 61 6e 64 20 61 20 56 44 42 45  arsed and a VDBE
0dc0: 20 70 72 6f 67 72 61 6d 20 74 6f 20 65 78 65 63   program to exec
0dd0: 75 74 65 20 74 68 61 74 20 73 74 61 74 65 6d 65  ute that stateme
0de0: 6e 74 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20 70  nt has been.** p
0df0: 72 65 70 61 72 65 64 2e 20 20 54 68 69 73 20 72  repared.  This r
0e00: 6f 75 74 69 6e 65 20 70 75 74 73 20 74 68 65 20  outine puts the 
0e10: 66 69 6e 69 73 68 69 6e 67 20 74 6f 75 63 68 65  finishing touche
0e20: 73 20 6f 6e 20 74 68 65 0a 2a 2a 20 56 44 42 45  s on the.** VDBE
0e30: 20 70 72 6f 67 72 61 6d 20 61 6e 64 20 72 65 73   program and res
0e40: 65 74 73 20 74 68 65 20 70 50 61 72 73 65 20 73  ets the pParse s
0e50: 74 72 75 63 74 75 72 65 20 66 6f 72 20 74 68 65  tructure for the
0e60: 20 6e 65 78 74 0a 2a 2a 20 70 61 72 73 65 2e 0a   next.** parse..
0e70: 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20  **.** Note that 
0e80: 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  if an error occu
0e90: 72 72 65 64 2c 20 69 74 20 6d 69 67 68 74 20 62  rred, it might b
0ea0: 65 20 74 68 65 20 63 61 73 65 20 74 68 61 74 0a  e the case that.
0eb0: 2a 2a 20 6e 6f 20 56 44 42 45 20 63 6f 64 65 20  ** no VDBE code 
0ec0: 77 61 73 20 67 65 6e 65 72 61 74 65 64 2e 0a 2a  was generated..*
0ed0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 46 69  /.void sqlite3Fi
0ee0: 6e 69 73 68 43 6f 64 69 6e 67 28 50 61 72 73 65  nishCoding(Parse
0ef0: 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 73 71 6c   *pParse){.  sql
0f00: 69 74 65 33 20 2a 64 62 3b 0a 20 20 56 64 62 65  ite3 *db;.  Vdbe
0f10: 20 2a 76 3b 0a 0a 20 20 64 62 20 3d 20 70 50 61   *v;..  db = pPa
0f20: 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20 64  rse->db;.  if( d
0f30: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
0f40: 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
0f50: 70 50 61 72 73 65 2d 3e 6e 65 73 74 65 64 20 29  pParse->nested )
0f60: 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 21   return;.  if( !
0f70: 70 50 61 72 73 65 2d 3e 70 56 64 62 65 20 29 7b  pParse->pVdbe ){
0f80: 0a 20 20 20 20 69 66 28 20 70 50 61 72 73 65 2d  .    if( pParse-
0f90: 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26  >rc==SQLITE_OK &
0fa0: 26 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29  & pParse->nErr )
0fb0: 7b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  {.      pParse->
0fc0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f  rc = SQLITE_ERRO
0fd0: 52 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b  R;.      return;
0fe0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
0ff0: 20 42 65 67 69 6e 20 62 79 20 67 65 6e 65 72 61   Begin by genera
1000: 74 69 6e 67 20 73 6f 6d 65 20 74 65 72 6d 69 6e  ting some termin
1010: 61 74 69 6f 6e 20 63 6f 64 65 20 61 74 20 74 68  ation code at th
1020: 65 20 65 6e 64 20 6f 66 20 74 68 65 0a 20 20 2a  e end of the.  *
1030: 2a 20 76 64 62 65 20 70 72 6f 67 72 61 6d 0a 20  * vdbe program. 
1040: 20 2a 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74 65   */.  v = sqlite
1050: 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
1060: 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20  ;.  if( v ){.   
1070: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1080: 70 30 28 76 2c 20 4f 50 5f 48 61 6c 74 29 3b 0a  p0(v, OP_Halt);.
1090: 0a 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6f 6b  .    /* The cook
10a0: 69 65 20 6d 61 73 6b 20 63 6f 6e 74 61 69 6e 73  ie mask contains
10b0: 20 6f 6e 65 20 62 69 74 20 66 6f 72 20 65 61 63   one bit for eac
10c0: 68 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  h database file 
10d0: 6f 70 65 6e 2e 0a 20 20 20 20 2a 2a 20 28 42 69  open..    ** (Bi
10e0: 74 20 30 20 69 73 20 66 6f 72 20 6d 61 69 6e 2c  t 0 is for main,
10f0: 20 62 69 74 20 31 20 69 73 20 66 6f 72 20 74 65   bit 1 is for te
1100: 6d 70 2c 20 61 6e 64 20 73 6f 20 66 6f 72 74 68  mp, and so forth
1110: 2e 29 20 20 42 69 74 73 20 61 72 65 0a 20 20 20  .)  Bits are.   
1120: 20 2a 2a 20 73 65 74 20 66 6f 72 20 65 61 63 68   ** set for each
1130: 20 64 61 74 61 62 61 73 65 20 74 68 61 74 20 69   database that i
1140: 73 20 75 73 65 64 2e 20 20 47 65 6e 65 72 61 74  s used.  Generat
1150: 65 20 63 6f 64 65 20 74 6f 20 73 74 61 72 74 20  e code to start 
1160: 61 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63  a.    ** transac
1170: 74 69 6f 6e 20 6f 6e 20 65 61 63 68 20 75 73 65  tion on each use
1180: 64 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 74  d database and t
1190: 6f 20 76 65 72 69 66 79 20 74 68 65 20 73 63 68  o verify the sch
11a0: 65 6d 61 20 63 6f 6f 6b 69 65 0a 20 20 20 20 2a  ema cookie.    *
11b0: 2a 20 6f 6e 20 65 61 63 68 20 75 73 65 64 20 64  * on each used d
11c0: 61 74 61 62 61 73 65 2e 0a 20 20 20 20 2a 2f 0a  atabase..    */.
11d0: 20 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e      if( pParse->
11e0: 63 6f 6f 6b 69 65 47 6f 74 6f 3e 30 20 29 7b 0a  cookieGoto>0 ){.
11f0: 20 20 20 20 20 20 75 33 32 20 6d 61 73 6b 3b 0a        u32 mask;.
1200: 20 20 20 20 20 20 69 6e 74 20 69 44 62 3b 0a 20        int iDb;. 
1210: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1220: 4a 75 6d 70 48 65 72 65 28 76 2c 20 70 50 61 72  JumpHere(v, pPar
1230: 73 65 2d 3e 63 6f 6f 6b 69 65 47 6f 74 6f 2d 31  se->cookieGoto-1
1240: 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 44 62  );.      for(iDb
1250: 3d 30 2c 20 6d 61 73 6b 3d 31 3b 20 69 44 62 3c  =0, mask=1; iDb<
1260: 64 62 2d 3e 6e 44 62 3b 20 6d 61 73 6b 3c 3c 3d  db->nDb; mask<<=
1270: 31 2c 20 69 44 62 2b 2b 29 7b 0a 20 20 20 20 20  1, iDb++){.     
1280: 20 20 20 69 66 28 20 28 6d 61 73 6b 20 26 20 70     if( (mask & p
1290: 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 4d 61 73  Parse->cookieMas
12a0: 6b 29 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  k)==0 ) continue
12b0: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
12c0: 33 56 64 62 65 55 73 65 73 42 74 72 65 65 28 76  3VdbeUsesBtree(v
12d0: 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20 20 20  , iDb);.        
12e0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
12f0: 32 28 76 2c 4f 50 5f 54 72 61 6e 73 61 63 74 69  2(v,OP_Transacti
1300: 6f 6e 2c 20 69 44 62 2c 20 28 6d 61 73 6b 20 26  on, iDb, (mask &
1310: 20 70 50 61 72 73 65 2d 3e 77 72 69 74 65 4d 61   pParse->writeMa
1320: 73 6b 29 21 3d 30 29 3b 0a 20 20 20 20 20 20 20  sk)!=0);.       
1330: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1340: 70 32 28 76 2c 4f 50 5f 56 65 72 69 66 79 43 6f  p2(v,OP_VerifyCo
1350: 6f 6b 69 65 2c 20 69 44 62 2c 20 70 50 61 72 73  okie, iDb, pPars
1360: 65 2d 3e 63 6f 6f 6b 69 65 56 61 6c 75 65 5b 69  e->cookieValue[i
1370: 44 62 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 23 69  Db]);.      }.#i
1380: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1390: 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20  T_VIRTUALTABLE. 
13a0: 20 20 20 20 20 69 66 28 20 70 50 61 72 73 65 2d       if( pParse-
13b0: 3e 70 56 69 72 74 75 61 6c 4c 6f 63 6b 20 29 7b  >pVirtualLock ){
13c0: 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 76  .        char *v
13d0: 74 61 62 20 3d 20 28 63 68 61 72 20 2a 29 70 50  tab = (char *)pP
13e0: 61 72 73 65 2d 3e 70 56 69 72 74 75 61 6c 4c 6f  arse->pVirtualLo
13f0: 63 6b 2d 3e 70 56 74 61 62 3b 0a 20 20 20 20 20  ck->pVtab;.     
1400: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1410: 64 4f 70 34 28 76 2c 20 4f 50 5f 56 42 65 67 69  dOp4(v, OP_VBegi
1420: 6e 2c 20 30 2c 20 30 2c 20 30 2c 20 76 74 61 62  n, 0, 0, 0, vtab
1430: 2c 20 50 34 5f 56 54 41 42 29 3b 0a 20 20 20 20  , P4_VTAB);.    
1440: 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20    }.#endif..    
1450: 20 20 2f 2a 20 4f 6e 63 65 20 61 6c 6c 20 74 68    /* Once all th
1460: 65 20 63 6f 6f 6b 69 65 73 20 68 61 76 65 20 62  e cookies have b
1470: 65 65 6e 20 76 65 72 69 66 69 65 64 20 61 6e 64  een verified and
1480: 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 6f 70   transactions op
1490: 65 6e 65 64 2c 20 0a 20 20 20 20 20 20 2a 2a 20  ened, .      ** 
14a0: 6f 62 74 61 69 6e 20 74 68 65 20 72 65 71 75 69  obtain the requi
14b0: 72 65 64 20 74 61 62 6c 65 2d 6c 6f 63 6b 73 2e  red table-locks.
14c0: 20 54 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70   This is a no-op
14d0: 20 75 6e 6c 65 73 73 20 74 68 65 20 0a 20 20 20   unless the .   
14e0: 20 20 20 2a 2a 20 73 68 61 72 65 64 2d 63 61 63     ** shared-cac
14f0: 68 65 20 66 65 61 74 75 72 65 20 69 73 20 65 6e  he feature is en
1500: 61 62 6c 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a  abled..      */.
1510: 20 20 20 20 20 20 63 6f 64 65 54 61 62 6c 65 4c        codeTableL
1520: 6f 63 6b 73 28 70 50 61 72 73 65 29 3b 0a 20 20  ocks(pParse);.  
1530: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1540: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f  ddOp2(v, OP_Goto
1550: 2c 20 30 2c 20 70 50 61 72 73 65 2d 3e 63 6f 6f  , 0, pParse->coo
1560: 6b 69 65 47 6f 74 6f 29 3b 0a 20 20 20 20 7d 0a  kieGoto);.    }.
1570: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1580: 4f 4d 49 54 5f 54 52 41 43 45 0a 20 20 20 20 69  OMIT_TRACE.    i
1590: 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73  f( !db->init.bus
15a0: 79 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 43 68  y ){.      /* Ch
15b0: 61 6e 67 65 20 74 68 65 20 50 34 20 61 72 67 75  ange the P4 argu
15c0: 6d 65 6e 74 20 6f 66 20 74 68 65 20 66 69 72 73  ment of the firs
15d0: 74 20 6f 70 63 6f 64 65 20 28 77 68 69 63 68 20  t opcode (which 
15e0: 77 69 6c 6c 20 61 6c 77 61 79 73 20 62 65 0a 20  will always be. 
15f0: 20 20 20 20 20 2a 2a 20 61 6e 20 4f 50 5f 54 72       ** an OP_Tr
1600: 61 63 65 29 20 74 6f 20 62 65 20 74 68 65 20 63  ace) to be the c
1610: 6f 6d 70 6c 65 74 65 20 74 65 78 74 20 6f 66 20  omplete text of 
1620: 74 68 65 20 63 75 72 72 65 6e 74 20 53 51 4c 20  the current SQL 
1630: 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20 20 20 20  statement..     
1640: 20 2a 2f 0a 20 20 20 20 20 20 56 64 62 65 4f 70   */.      VdbeOp
1650: 20 2a 70 4f 70 20 3d 20 73 71 6c 69 74 65 33 56   *pOp = sqlite3V
1660: 64 62 65 47 65 74 4f 70 28 76 2c 20 30 29 3b 0a  dbeGetOp(v, 0);.
1670: 20 20 20 20 20 20 69 66 28 20 70 4f 70 20 26 26        if( pOp &&
1680: 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50   pOp->opcode==OP
1690: 5f 54 72 61 63 65 20 29 7b 0a 20 20 20 20 20 20  _Trace ){.      
16a0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
16b0: 6e 67 65 50 34 28 76 2c 20 30 2c 20 70 50 61 72  ngeP4(v, 0, pPar
16c0: 73 65 2d 3e 7a 53 71 6c 2c 20 70 50 61 72 73 65  se->zSql, pParse
16d0: 2d 3e 7a 54 61 69 6c 2d 70 50 61 72 73 65 2d 3e  ->zTail-pParse->
16e0: 7a 53 71 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 20  zSql);.      }. 
16f0: 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53     }.#endif /* S
1700: 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45  QLITE_OMIT_TRACE
1710: 20 2a 2f 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20 47   */.  }...  /* G
1720: 65 74 20 74 68 65 20 56 44 42 45 20 70 72 6f 67  et the VDBE prog
1730: 72 61 6d 20 72 65 61 64 79 20 66 6f 72 20 65 78  ram ready for ex
1740: 65 63 75 74 69 6f 6e 0a 20 20 2a 2f 0a 20 20 69  ecution.  */.  i
1750: 66 28 20 76 20 26 26 20 70 50 61 72 73 65 2d 3e  f( v && pParse->
1760: 6e 45 72 72 3d 3d 30 20 26 26 20 21 64 62 2d 3e  nErr==0 && !db->
1770: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
1780: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
1790: 42 55 47 0a 20 20 20 20 46 49 4c 45 20 2a 74 72  BUG.    FILE *tr
17a0: 61 63 65 20 3d 20 28 64 62 2d 3e 66 6c 61 67 73  ace = (db->flags
17b0: 20 26 20 53 51 4c 49 54 45 5f 56 64 62 65 54 72   & SQLITE_VdbeTr
17c0: 61 63 65 29 21 3d 30 20 3f 20 73 74 64 6f 75 74  ace)!=0 ? stdout
17d0: 20 3a 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65   : 0;.    sqlite
17e0: 33 56 64 62 65 54 72 61 63 65 28 76 2c 20 74 72  3VdbeTrace(v, tr
17f0: 61 63 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  ace);.#endif.   
1800: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
1810: 52 65 61 64 79 28 76 2c 20 70 50 61 72 73 65 2d  Ready(v, pParse-
1820: 3e 6e 56 61 72 2c 20 70 50 61 72 73 65 2d 3e 6e  >nVar, pParse->n
1830: 4d 65 6d 2b 33 2c 0a 20 20 20 20 20 20 20 20 20  Mem+3,.         
1840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1850: 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 33 2c 20  pParse->nTab+3, 
1860: 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 29  pParse->explain)
1870: 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 72 63  ;.    pParse->rc
1880: 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a   = SQLITE_DONE;.
1890: 20 20 20 20 70 50 61 72 73 65 2d 3e 63 6f 6c 4e      pParse->colN
18a0: 61 6d 65 73 53 65 74 20 3d 20 30 3b 0a 20 20 7d  amesSet = 0;.  }
18b0: 65 6c 73 65 20 69 66 28 20 70 50 61 72 73 65 2d  else if( pParse-
18c0: 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
18d0: 7b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 72 63  {.    pParse->rc
18e0: 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   = SQLITE_ERROR;
18f0: 0a 20 20 7d 0a 20 20 70 50 61 72 73 65 2d 3e 6e  .  }.  pParse->n
1900: 54 61 62 20 3d 20 30 3b 0a 20 20 70 50 61 72 73  Tab = 0;.  pPars
1910: 65 2d 3e 6e 4d 65 6d 20 3d 20 30 3b 0a 20 20 70  e->nMem = 0;.  p
1920: 50 61 72 73 65 2d 3e 6e 53 65 74 20 3d 20 30 3b  Parse->nSet = 0;
1930: 0a 20 20 70 50 61 72 73 65 2d 3e 6e 56 61 72 20  .  pParse->nVar 
1940: 3d 20 30 3b 0a 20 20 70 50 61 72 73 65 2d 3e 63  = 0;.  pParse->c
1950: 6f 6f 6b 69 65 4d 61 73 6b 20 3d 20 30 3b 0a 20  ookieMask = 0;. 
1960: 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 47   pParse->cookieG
1970: 6f 74 6f 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  oto = 0;.}../*.*
1980: 2a 20 52 75 6e 20 74 68 65 20 70 61 72 73 65 72  * Run the parser
1990: 20 61 6e 64 20 63 6f 64 65 20 67 65 6e 65 72 61   and code genera
19a0: 74 6f 72 20 72 65 63 75 72 73 69 76 65 6c 79 20  tor recursively 
19b0: 69 6e 20 6f 72 64 65 72 20 74 6f 20 67 65 6e 65  in order to gene
19c0: 72 61 74 65 0a 2a 2a 20 63 6f 64 65 20 66 6f 72  rate.** code for
19d0: 20 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65   the SQL stateme
19e0: 6e 74 20 67 69 76 65 6e 20 6f 6e 74 6f 20 74 68  nt given onto th
19f0: 65 20 65 6e 64 20 6f 66 20 74 68 65 20 70 50 61  e end of the pPa
1a00: 72 73 65 20 63 6f 6e 74 65 78 74 0a 2a 2a 20 63  rse context.** c
1a10: 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63  urrently under c
1a20: 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 57 68  onstruction.  Wh
1a30: 65 6e 20 74 68 65 20 70 61 72 73 65 72 20 69 73  en the parser is
1a40: 20 72 75 6e 20 72 65 63 75 72 73 69 76 65 6c 79   run recursively
1a50: 0a 2a 2a 20 74 68 69 73 20 77 61 79 2c 20 74 68  .** this way, th
1a60: 65 20 66 69 6e 61 6c 20 4f 50 5f 48 61 6c 74 20  e final OP_Halt 
1a70: 69 73 20 6e 6f 74 20 61 70 70 65 6e 64 65 64 20  is not appended 
1a80: 61 6e 64 20 6f 74 68 65 72 20 69 6e 69 74 69 61  and other initia
1a90: 6c 69 7a 61 74 69 6f 6e 0a 2a 2a 20 61 6e 64 20  lization.** and 
1aa0: 66 69 6e 61 6c 69 7a 61 74 69 6f 6e 20 73 74 65  finalization ste
1ab0: 70 73 20 61 72 65 20 6f 6d 69 74 74 65 64 20 62  ps are omitted b
1ac0: 65 63 61 75 73 65 20 74 68 6f 73 65 20 61 72 65  ecause those are
1ad0: 20 68 61 6e 64 6c 69 6e 67 20 62 79 20 74 68 65   handling by the
1ae0: 0a 2a 2a 20 6f 75 74 65 72 6d 6f 73 74 20 70 61  .** outermost pa
1af0: 72 73 65 72 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 20  rser..**.** Not 
1b00: 65 76 65 72 79 74 68 69 6e 67 20 69 73 20 6e 65  everything is ne
1b10: 73 74 61 62 6c 65 2e 20 20 54 68 69 73 20 66 61  stable.  This fa
1b20: 63 69 6c 69 74 79 20 69 73 20 64 65 73 69 67 6e  cility is design
1b30: 65 64 20 74 6f 20 70 65 72 6d 69 74 0a 2a 2a 20  ed to permit.** 
1b40: 49 4e 53 45 52 54 2c 20 55 50 44 41 54 45 2c 20  INSERT, UPDATE, 
1b50: 61 6e 64 20 44 45 4c 45 54 45 20 6f 70 65 72 61  and DELETE opera
1b60: 74 69 6f 6e 73 20 61 67 61 69 6e 73 74 20 53 51  tions against SQ
1b70: 4c 49 54 45 5f 4d 41 53 54 45 52 2e 20 20 55 73  LITE_MASTER.  Us
1b80: 65 0a 2a 2a 20 63 61 72 65 20 69 66 20 79 6f 75  e.** care if you
1b90: 20 64 65 63 69 64 65 20 74 6f 20 74 72 79 20 74   decide to try t
1ba0: 6f 20 75 73 65 20 74 68 69 73 20 72 6f 75 74 69  o use this routi
1bb0: 6e 65 20 66 6f 72 20 73 6f 6d 65 20 6f 74 68 65  ne for some othe
1bc0: 72 20 70 75 72 70 6f 73 65 73 2e 0a 2a 2f 0a 76  r purposes..*/.v
1bd0: 6f 69 64 20 73 71 6c 69 74 65 33 4e 65 73 74 65  oid sqlite3Neste
1be0: 64 50 61 72 73 65 28 50 61 72 73 65 20 2a 70 50  dParse(Parse *pP
1bf0: 61 72 73 65 2c 20 63 6f 6e 73 74 20 63 68 61 72  arse, const char
1c00: 20 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b   *zFormat, ...){
1c10: 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20  .  va_list ap;. 
1c20: 20 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 23 20 64   char *zSql;.# d
1c30: 65 66 69 6e 65 20 53 41 56 45 5f 53 5a 20 20 28  efine SAVE_SZ  (
1c40: 73 69 7a 65 6f 66 28 50 61 72 73 65 29 20 2d 20  sizeof(Parse) - 
1c50: 6f 66 66 73 65 74 6f 66 28 50 61 72 73 65 2c 6e  offsetof(Parse,n
1c60: 56 61 72 29 29 0a 20 20 63 68 61 72 20 73 61 76  Var)).  char sav
1c70: 65 42 75 66 5b 53 41 56 45 5f 53 5a 5d 3b 0a 0a  eBuf[SAVE_SZ];..
1c80: 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45    if( pParse->nE
1c90: 72 72 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61  rr ) return;.  a
1ca0: 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 6e  ssert( pParse->n
1cb0: 65 73 74 65 64 3c 31 30 20 29 3b 20 20 2f 2a 20  ested<10 );  /* 
1cc0: 4e 65 73 74 69 6e 67 20 73 68 6f 75 6c 64 20 6f  Nesting should o
1cd0: 6e 6c 79 20 62 65 20 6f 66 20 6c 69 6d 69 74 65  nly be of limite
1ce0: 64 20 64 65 70 74 68 20 2a 2f 0a 20 20 76 61 5f  d depth */.  va_
1cf0: 73 74 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61  start(ap, zForma
1d00: 74 29 3b 0a 20 20 7a 53 71 6c 20 3d 20 73 71 6c  t);.  zSql = sql
1d10: 69 74 65 33 56 4d 50 72 69 6e 74 66 28 70 50 61  ite3VMPrintf(pPa
1d20: 72 73 65 2d 3e 64 62 2c 20 7a 46 6f 72 6d 61 74  rse->db, zFormat
1d30: 2c 20 61 70 29 3b 0a 20 20 76 61 5f 65 6e 64 28  , ap);.  va_end(
1d40: 61 70 29 3b 0a 20 20 69 66 28 20 7a 53 71 6c 3d  ap);.  if( zSql=
1d50: 3d 30 20 29 7b 0a 20 20 20 20 70 50 61 72 73 65  =0 ){.    pParse
1d60: 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
1d70: 65 64 20 3d 20 31 3b 0a 20 20 20 20 72 65 74 75  ed = 1;.    retu
1d80: 72 6e 3b 20 20 20 2f 2a 20 41 20 6d 61 6c 6c 6f  rn;   /* A mallo
1d90: 63 20 6d 75 73 74 20 68 61 76 65 20 66 61 69 6c  c must have fail
1da0: 65 64 20 2a 2f 0a 20 20 7d 0a 20 20 70 50 61 72  ed */.  }.  pPar
1db0: 73 65 2d 3e 6e 65 73 74 65 64 2b 2b 3b 0a 20 20  se->nested++;.  
1dc0: 6d 65 6d 63 70 79 28 73 61 76 65 42 75 66 2c 20  memcpy(saveBuf, 
1dd0: 26 70 50 61 72 73 65 2d 3e 6e 56 61 72 2c 20 53  &pParse->nVar, S
1de0: 41 56 45 5f 53 5a 29 3b 0a 20 20 6d 65 6d 73 65  AVE_SZ);.  memse
1df0: 74 28 26 70 50 61 72 73 65 2d 3e 6e 56 61 72 2c  t(&pParse->nVar,
1e00: 20 30 2c 20 53 41 56 45 5f 53 5a 29 3b 0a 20 20   0, SAVE_SZ);.  
1e10: 73 71 6c 69 74 65 33 52 75 6e 50 61 72 73 65 72  sqlite3RunParser
1e20: 28 70 50 61 72 73 65 2c 20 7a 53 71 6c 2c 20 30  (pParse, zSql, 0
1e30: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
1e40: 65 28 7a 53 71 6c 29 3b 0a 20 20 6d 65 6d 63 70  e(zSql);.  memcp
1e50: 79 28 26 70 50 61 72 73 65 2d 3e 6e 56 61 72 2c  y(&pParse->nVar,
1e60: 20 73 61 76 65 42 75 66 2c 20 53 41 56 45 5f 53   saveBuf, SAVE_S
1e70: 5a 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 65  Z);.  pParse->ne
1e80: 73 74 65 64 2d 2d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  sted--;.}../*.**
1e90: 20 4c 6f 63 61 74 65 20 74 68 65 20 69 6e 2d 6d   Locate the in-m
1ea0: 65 6d 6f 72 79 20 73 74 72 75 63 74 75 72 65 20  emory structure 
1eb0: 74 68 61 74 20 64 65 73 63 72 69 62 65 73 20 61  that describes a
1ec0: 20 70 61 72 74 69 63 75 6c 61 72 20 64 61 74 61   particular data
1ed0: 62 61 73 65 0a 2a 2a 20 74 61 62 6c 65 20 67 69  base.** table gi
1ee0: 76 65 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  ven the name of 
1ef0: 74 68 61 74 20 74 61 62 6c 65 20 61 6e 64 20 28  that table and (
1f00: 6f 70 74 69 6f 6e 61 6c 6c 79 29 20 74 68 65 20  optionally) the 
1f10: 6e 61 6d 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64  name of the.** d
1f20: 61 74 61 62 61 73 65 20 63 6f 6e 74 61 69 6e 69  atabase containi
1f30: 6e 67 20 74 68 65 20 74 61 62 6c 65 2e 20 20 52  ng the table.  R
1f40: 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 6e 6f  eturn NULL if no
1f50: 74 20 66 6f 75 6e 64 2e 0a 2a 2a 0a 2a 2a 20 49  t found..**.** I
1f60: 66 20 7a 44 61 74 61 62 61 73 65 20 69 73 20 30  f zDatabase is 0
1f70: 2c 20 61 6c 6c 20 64 61 74 61 62 61 73 65 73 20  , all databases 
1f80: 61 72 65 20 73 65 61 72 63 68 65 64 20 66 6f 72  are searched for
1f90: 20 74 68 65 20 74 61 62 6c 65 20 61 6e 64 20 74   the table and t
1fa0: 68 65 0a 2a 2a 20 66 69 72 73 74 20 6d 61 74 63  he.** first matc
1fb0: 68 69 6e 67 20 74 61 62 6c 65 20 69 73 20 72 65  hing table is re
1fc0: 74 75 72 6e 65 64 2e 20 20 28 4e 6f 20 63 68 65  turned.  (No che
1fd0: 63 6b 69 6e 67 20 66 6f 72 20 64 75 70 6c 69 63  cking for duplic
1fe0: 61 74 65 20 74 61 62 6c 65 0a 2a 2a 20 6e 61 6d  ate table.** nam
1ff0: 65 73 20 69 73 20 64 6f 6e 65 2e 29 20 20 54 68  es is done.)  Th
2000: 65 20 73 65 61 72 63 68 20 6f 72 64 65 72 20 69  e search order i
2010: 73 20 54 45 4d 50 20 66 69 72 73 74 2c 20 74 68  s TEMP first, th
2020: 65 6e 20 4d 41 49 4e 2c 20 74 68 65 6e 20 61 6e  en MAIN, then an
2030: 79 0a 2a 2a 20 61 75 78 69 6c 69 61 72 79 20 64  y.** auxiliary d
2040: 61 74 61 62 61 73 65 73 20 61 64 64 65 64 20 75  atabases added u
2050: 73 69 6e 67 20 74 68 65 20 41 54 54 41 43 48 20  sing the ATTACH 
2060: 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 53  command..**.** S
2070: 65 65 20 61 6c 73 6f 20 73 71 6c 69 74 65 33 4c  ee also sqlite3L
2080: 6f 63 61 74 65 54 61 62 6c 65 28 29 2e 0a 2a 2f  ocateTable()..*/
2090: 0a 54 61 62 6c 65 20 2a 73 71 6c 69 74 65 33 46  .Table *sqlite3F
20a0: 69 6e 64 54 61 62 6c 65 28 73 71 6c 69 74 65 33  indTable(sqlite3
20b0: 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68 61 72   *db, const char
20c0: 20 2a 7a 4e 61 6d 65 2c 20 63 6f 6e 73 74 20 63   *zName, const c
20d0: 68 61 72 20 2a 7a 44 61 74 61 62 61 73 65 29 7b  har *zDatabase){
20e0: 0a 20 20 54 61 62 6c 65 20 2a 70 20 3d 20 30 3b  .  Table *p = 0;
20f0: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 61 73 73 65  .  int i;.  asse
2100: 72 74 28 20 7a 4e 61 6d 65 21 3d 30 20 29 3b 0a  rt( zName!=0 );.
2110: 20 20 66 6f 72 28 69 3d 4f 4d 49 54 5f 54 45 4d    for(i=OMIT_TEM
2120: 50 44 42 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20  PDB; i<db->nDb; 
2130: 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6a 20  i++){.    int j 
2140: 3d 20 28 69 3c 32 29 20 3f 20 69 5e 31 20 3a 20  = (i<2) ? i^1 : 
2150: 69 3b 20 20 20 2f 2a 20 53 65 61 72 63 68 20 54  i;   /* Search T
2160: 45 4d 50 20 62 65 66 6f 72 65 20 4d 41 49 4e 20  EMP before MAIN 
2170: 2a 2f 0a 20 20 20 20 69 66 28 20 7a 44 61 74 61  */.    if( zData
2180: 62 61 73 65 21 3d 30 20 26 26 20 73 71 6c 69 74  base!=0 && sqlit
2190: 65 33 53 74 72 49 43 6d 70 28 7a 44 61 74 61 62  e3StrICmp(zDatab
21a0: 61 73 65 2c 20 64 62 2d 3e 61 44 62 5b 6a 5d 2e  ase, db->aDb[j].
21b0: 7a 4e 61 6d 65 29 20 29 20 63 6f 6e 74 69 6e 75  zName) ) continu
21c0: 65 3b 0a 20 20 20 20 70 20 3d 20 73 71 6c 69 74  e;.    p = sqlit
21d0: 65 33 48 61 73 68 46 69 6e 64 28 26 64 62 2d 3e  e3HashFind(&db->
21e0: 61 44 62 5b 6a 5d 2e 70 53 63 68 65 6d 61 2d 3e  aDb[j].pSchema->
21f0: 74 62 6c 48 61 73 68 2c 20 7a 4e 61 6d 65 2c 20  tblHash, zName, 
2200: 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 2b 31 29  strlen(zName)+1)
2210: 3b 0a 20 20 20 20 69 66 28 20 70 20 29 20 62 72  ;.    if( p ) br
2220: 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  eak;.  }.  retur
2230: 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f  n p;.}../*.** Lo
2240: 63 61 74 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f  cate the in-memo
2250: 72 79 20 73 74 72 75 63 74 75 72 65 20 74 68 61  ry structure tha
2260: 74 20 64 65 73 63 72 69 62 65 73 20 61 20 70 61  t describes a pa
2270: 72 74 69 63 75 6c 61 72 20 64 61 74 61 62 61 73  rticular databas
2280: 65 0a 2a 2a 20 74 61 62 6c 65 20 67 69 76 65 6e  e.** table given
2290: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 61   the name of tha
22a0: 74 20 74 61 62 6c 65 20 61 6e 64 20 28 6f 70 74  t table and (opt
22b0: 69 6f 6e 61 6c 6c 79 29 20 74 68 65 20 6e 61 6d  ionally) the nam
22c0: 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74 61  e of the.** data
22d0: 62 61 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20  base containing 
22e0: 74 68 65 20 74 61 62 6c 65 2e 20 20 52 65 74 75  the table.  Retu
22f0: 72 6e 20 4e 55 4c 4c 20 69 66 20 6e 6f 74 20 66  rn NULL if not f
2300: 6f 75 6e 64 2e 20 20 41 6c 73 6f 20 6c 65 61 76  ound.  Also leav
2310: 65 20 61 6e 0a 2a 2a 20 65 72 72 6f 72 20 6d 65  e an.** error me
2320: 73 73 61 67 65 20 69 6e 20 70 50 61 72 73 65 2d  ssage in pParse-
2330: 3e 7a 45 72 72 4d 73 67 2e 0a 2a 2a 0a 2a 2a 20  >zErrMsg..**.** 
2340: 54 68 65 20 64 69 66 66 65 72 65 6e 63 65 20 62  The difference b
2350: 65 74 77 65 65 6e 20 74 68 69 73 20 72 6f 75 74  etween this rout
2360: 69 6e 65 20 61 6e 64 20 73 71 6c 69 74 65 33 46  ine and sqlite3F
2370: 69 6e 64 54 61 62 6c 65 28 29 20 69 73 20 74 68  indTable() is th
2380: 61 74 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69  at this.** routi
2390: 6e 65 20 6c 65 61 76 65 73 20 61 6e 20 65 72 72  ne leaves an err
23a0: 6f 72 20 6d 65 73 73 61 67 65 20 69 6e 20 70 50  or message in pP
23b0: 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 20 77 68  arse->zErrMsg wh
23c0: 65 72 65 0a 2a 2a 20 73 71 6c 69 74 65 33 46 69  ere.** sqlite3Fi
23d0: 6e 64 54 61 62 6c 65 28 29 20 64 6f 65 73 20 6e  ndTable() does n
23e0: 6f 74 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a 73 71  ot..*/.Table *sq
23f0: 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62 6c 65  lite3LocateTable
2400: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
2410: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
2420: 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  e, const char *z
2430: 44 62 61 73 65 29 7b 0a 20 20 54 61 62 6c 65 20  Dbase){.  Table 
2440: 2a 70 3b 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74  *p;..  /* Read t
2450: 68 65 20 64 61 74 61 62 61 73 65 20 73 63 68 65  he database sche
2460: 6d 61 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20  ma. If an error 
2470: 6f 63 63 75 72 73 2c 20 6c 65 61 76 65 20 61 6e  occurs, leave an
2480: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 0a 20   error message. 
2490: 20 2a 2a 20 61 6e 64 20 63 6f 64 65 20 69 6e 20   ** and code in 
24a0: 70 50 61 72 73 65 20 61 6e 64 20 72 65 74 75 72  pParse and retur
24b0: 6e 20 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 69 66 28  n NULL. */.  if(
24c0: 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69   SQLITE_OK!=sqli
24d0: 74 65 33 52 65 61 64 53 63 68 65 6d 61 28 70 50  te3ReadSchema(pP
24e0: 61 72 73 65 29 20 29 7b 0a 20 20 20 20 72 65 74  arse) ){.    ret
24f0: 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 70 20  urn 0;.  }..  p 
2500: 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62  = sqlite3FindTab
2510: 6c 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 7a  le(pParse->db, z
2520: 4e 61 6d 65 2c 20 7a 44 62 61 73 65 29 3b 0a 20  Name, zDbase);. 
2530: 20 69 66 28 20 70 3d 3d 30 20 29 7b 0a 20 20 20   if( p==0 ){.   
2540: 20 69 66 28 20 7a 44 62 61 73 65 20 29 7b 0a 20   if( zDbase ){. 
2550: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
2560: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f  rMsg(pParse, "no
2570: 20 73 75 63 68 20 74 61 62 6c 65 3a 20 25 73 2e   such table: %s.
2580: 25 73 22 2c 20 7a 44 62 61 73 65 2c 20 7a 4e 61  %s", zDbase, zNa
2590: 6d 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  me);.    }else{.
25a0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
25b0: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e  orMsg(pParse, "n
25c0: 6f 20 73 75 63 68 20 74 61 62 6c 65 3a 20 25 73  o such table: %s
25d0: 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d  ", zName);.    }
25e0: 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 63 68 65  .    pParse->che
25f0: 63 6b 53 63 68 65 6d 61 20 3d 20 31 3b 0a 20 20  ckSchema = 1;.  
2600: 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a  }.  return p;.}.
2610: 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61 74 65 20 74 68  ./*.** Locate th
2620: 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 73 74 72 75  e in-memory stru
2630: 63 74 75 72 65 20 74 68 61 74 20 64 65 73 63 72  cture that descr
2640: 69 62 65 73 20 0a 2a 2a 20 61 20 70 61 72 74 69  ibes .** a parti
2650: 63 75 6c 61 72 20 69 6e 64 65 78 20 67 69 76 65  cular index give
2660: 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  n the name of th
2670: 61 74 20 69 6e 64 65 78 0a 2a 2a 20 61 6e 64 20  at index.** and 
2680: 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
2690: 64 61 74 61 62 61 73 65 20 74 68 61 74 20 63 6f  database that co
26a0: 6e 74 61 69 6e 73 20 74 68 65 20 69 6e 64 65 78  ntains the index
26b0: 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 4e 55 4c 4c  ..** Return NULL
26c0: 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a   if not found..*
26d0: 2a 0a 2a 2a 20 49 66 20 7a 44 61 74 61 62 61 73  *.** If zDatabas
26e0: 65 20 69 73 20 30 2c 20 61 6c 6c 20 64 61 74 61  e is 0, all data
26f0: 62 61 73 65 73 20 61 72 65 20 73 65 61 72 63 68  bases are search
2700: 65 64 20 66 6f 72 20 74 68 65 0a 2a 2a 20 74 61  ed for the.** ta
2710: 62 6c 65 20 61 6e 64 20 74 68 65 20 66 69 72 73  ble and the firs
2720: 74 20 6d 61 74 63 68 69 6e 67 20 69 6e 64 65 78  t matching index
2730: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 20 28   is returned.  (
2740: 4e 6f 20 63 68 65 63 6b 69 6e 67 0a 2a 2a 20 66  No checking.** f
2750: 6f 72 20 64 75 70 6c 69 63 61 74 65 20 69 6e 64  or duplicate ind
2760: 65 78 20 6e 61 6d 65 73 20 69 73 20 64 6f 6e 65  ex names is done
2770: 2e 29 20 20 54 68 65 20 73 65 61 72 63 68 20 6f  .)  The search o
2780: 72 64 65 72 20 69 73 0a 2a 2a 20 54 45 4d 50 20  rder is.** TEMP 
2790: 66 69 72 73 74 2c 20 74 68 65 6e 20 4d 41 49 4e  first, then MAIN
27a0: 2c 20 74 68 65 6e 20 61 6e 79 20 61 75 78 69 6c  , then any auxil
27b0: 69 61 72 79 20 64 61 74 61 62 61 73 65 73 20 61  iary databases a
27c0: 64 64 65 64 0a 2a 2a 20 75 73 69 6e 67 20 74 68  dded.** using th
27d0: 65 20 41 54 54 41 43 48 20 63 6f 6d 6d 61 6e 64  e ATTACH command
27e0: 2e 0a 2a 2f 0a 49 6e 64 65 78 20 2a 73 71 6c 69  ..*/.Index *sqli
27f0: 74 65 33 46 69 6e 64 49 6e 64 65 78 28 73 71 6c  te3FindIndex(sql
2800: 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20  ite3 *db, const 
2810: 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 63 6f 6e  char *zName, con
2820: 73 74 20 63 68 61 72 20 2a 7a 44 62 29 7b 0a 20  st char *zDb){. 
2830: 20 49 6e 64 65 78 20 2a 70 20 3d 20 30 3b 0a 20   Index *p = 0;. 
2840: 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d   int i;.  for(i=
2850: 4f 4d 49 54 5f 54 45 4d 50 44 42 3b 20 69 3c 64  OMIT_TEMPDB; i<d
2860: 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20  b->nDb; i++){.  
2870: 20 20 69 6e 74 20 6a 20 3d 20 28 69 3c 32 29 20    int j = (i<2) 
2880: 3f 20 69 5e 31 20 3a 20 69 3b 20 20 2f 2a 20 53  ? i^1 : i;  /* S
2890: 65 61 72 63 68 20 54 45 4d 50 20 62 65 66 6f 72  earch TEMP befor
28a0: 65 20 4d 41 49 4e 20 2a 2f 0a 20 20 20 20 53 63  e MAIN */.    Sc
28b0: 68 65 6d 61 20 2a 70 53 63 68 65 6d 61 20 3d 20  hema *pSchema = 
28c0: 64 62 2d 3e 61 44 62 5b 6a 5d 2e 70 53 63 68 65  db->aDb[j].pSche
28d0: 6d 61 3b 0a 20 20 20 20 69 66 28 20 7a 44 62 20  ma;.    if( zDb 
28e0: 26 26 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  && sqlite3StrICm
28f0: 70 28 7a 44 62 2c 20 64 62 2d 3e 61 44 62 5b 6a  p(zDb, db->aDb[j
2900: 5d 2e 7a 4e 61 6d 65 29 20 29 20 63 6f 6e 74 69  ].zName) ) conti
2910: 6e 75 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28  nue;.    assert(
2920: 20 70 53 63 68 65 6d 61 20 7c 7c 20 28 6a 3d 3d   pSchema || (j==
2930: 31 20 26 26 20 21 64 62 2d 3e 61 44 62 5b 31 5d  1 && !db->aDb[1]
2940: 2e 70 42 74 29 20 29 3b 0a 20 20 20 20 69 66 28  .pBt) );.    if(
2950: 20 70 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20   pSchema ){.    
2960: 20 20 70 20 3d 20 73 71 6c 69 74 65 33 48 61 73    p = sqlite3Has
2970: 68 46 69 6e 64 28 26 70 53 63 68 65 6d 61 2d 3e  hFind(&pSchema->
2980: 69 64 78 48 61 73 68 2c 20 7a 4e 61 6d 65 2c 20  idxHash, zName, 
2990: 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 2b 31 29  strlen(zName)+1)
29a0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
29b0: 70 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20  p ) break;.  }. 
29c0: 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a   return p;.}../*
29d0: 0a 2a 2a 20 52 65 63 6c 61 69 6d 20 74 68 65 20  .** Reclaim the 
29e0: 6d 65 6d 6f 72 79 20 75 73 65 64 20 62 79 20 61  memory used by a
29f0: 6e 20 69 6e 64 65 78 0a 2a 2f 0a 73 74 61 74 69  n index.*/.stati
2a00: 63 20 76 6f 69 64 20 66 72 65 65 49 6e 64 65 78  c void freeIndex
2a10: 28 49 6e 64 65 78 20 2a 70 29 7b 0a 20 20 73 71  (Index *p){.  sq
2a20: 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 7a 43  lite3_free(p->zC
2a30: 6f 6c 41 66 66 29 3b 0a 20 20 73 71 6c 69 74 65  olAff);.  sqlite
2a40: 33 5f 66 72 65 65 28 70 29 3b 0a 7d 0a 0a 2f 2a  3_free(p);.}../*
2a50: 0a 2a 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 67  .** Remove the g
2a60: 69 76 65 6e 20 69 6e 64 65 78 20 66 72 6f 6d 20  iven index from 
2a70: 74 68 65 20 69 6e 64 65 78 20 68 61 73 68 20 74  the index hash t
2a80: 61 62 6c 65 2c 20 61 6e 64 20 66 72 65 65 0a 2a  able, and free.*
2a90: 2a 20 69 74 73 20 6d 65 6d 6f 72 79 20 73 74 72  * its memory str
2aa0: 75 63 74 75 72 65 73 2e 0a 2a 2a 0a 2a 2a 20 54  uctures..**.** T
2ab0: 68 65 20 69 6e 64 65 78 20 69 73 20 72 65 6d 6f  he index is remo
2ac0: 76 65 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74  ved from the dat
2ad0: 61 62 61 73 65 20 68 61 73 68 20 74 61 62 6c 65  abase hash table
2ae0: 73 20 62 75 74 0a 2a 2a 20 69 74 20 69 73 20 6e  s but.** it is n
2af0: 6f 74 20 75 6e 6c 69 6e 6b 65 64 20 66 72 6f 6d  ot unlinked from
2b00: 20 74 68 65 20 54 61 62 6c 65 20 74 68 61 74 20   the Table that 
2b10: 69 74 20 69 6e 64 65 78 65 73 2e 0a 2a 2a 20 55  it indexes..** U
2b20: 6e 6c 69 6e 6b 69 6e 67 20 66 72 6f 6d 20 74 68  nlinking from th
2b30: 65 20 54 61 62 6c 65 20 6d 75 73 74 20 62 65 20  e Table must be 
2b40: 64 6f 6e 65 20 62 79 20 74 68 65 20 63 61 6c 6c  done by the call
2b50: 69 6e 67 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f  ing function..*/
2b60: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c  .static void sql
2b70: 69 74 65 44 65 6c 65 74 65 49 6e 64 65 78 28 49  iteDeleteIndex(I
2b80: 6e 64 65 78 20 2a 70 29 7b 0a 20 20 49 6e 64 65  ndex *p){.  Inde
2b90: 78 20 2a 70 4f 6c 64 3b 0a 20 20 63 6f 6e 73 74  x *pOld;.  const
2ba0: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 70   char *zName = p
2bb0: 2d 3e 7a 4e 61 6d 65 3b 0a 0a 20 20 70 4f 6c 64  ->zName;..  pOld
2bc0: 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e   = sqlite3HashIn
2bd0: 73 65 72 74 28 26 70 2d 3e 70 53 63 68 65 6d 61  sert(&p->pSchema
2be0: 2d 3e 69 64 78 48 61 73 68 2c 20 7a 4e 61 6d 65  ->idxHash, zName
2bf0: 2c 20 73 74 72 6c 65 6e 28 20 7a 4e 61 6d 65 29  , strlen( zName)
2c00: 2b 31 2c 20 30 29 3b 0a 20 20 61 73 73 65 72 74  +1, 0);.  assert
2c10: 28 20 70 4f 6c 64 3d 3d 30 20 7c 7c 20 70 4f 6c  ( pOld==0 || pOl
2c20: 64 3d 3d 70 20 29 3b 0a 20 20 66 72 65 65 49 6e  d==p );.  freeIn
2c30: 64 65 78 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  dex(p);.}../*.**
2c40: 20 46 6f 72 20 74 68 65 20 69 6e 64 65 78 20 63   For the index c
2c50: 61 6c 6c 65 64 20 7a 49 64 78 4e 61 6d 65 20 77  alled zIdxName w
2c60: 68 69 63 68 20 69 73 20 66 6f 75 6e 64 20 69 6e  hich is found in
2c70: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 44   the database iD
2c80: 62 2c 0a 2a 2a 20 75 6e 6c 69 6b 65 20 74 68 61  b,.** unlike tha
2c90: 74 20 69 6e 64 65 78 20 66 72 6f 6d 20 69 74 73  t index from its
2ca0: 20 54 61 62 6c 65 20 74 68 65 6e 20 72 65 6d 6f   Table then remo
2cb0: 76 65 20 74 68 65 20 69 6e 64 65 78 20 66 72 6f  ve the index fro
2cc0: 6d 0a 2a 2a 20 74 68 65 20 69 6e 64 65 78 20 68  m.** the index h
2cd0: 61 73 68 20 74 61 62 6c 65 20 61 6e 64 20 66 72  ash table and fr
2ce0: 65 65 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 73 74  ee all memory st
2cf0: 72 75 63 74 75 72 65 73 20 61 73 73 6f 63 69 61  ructures associa
2d00: 74 65 64 0a 2a 2a 20 77 69 74 68 20 74 68 65 20  ted.** with the 
2d10: 69 6e 64 65 78 2e 0a 2a 2f 0a 76 6f 69 64 20 73  index..*/.void s
2d20: 71 6c 69 74 65 33 55 6e 6c 69 6e 6b 41 6e 64 44  qlite3UnlinkAndD
2d30: 65 6c 65 74 65 49 6e 64 65 78 28 73 71 6c 69 74  eleteIndex(sqlit
2d40: 65 33 20 2a 64 62 2c 20 69 6e 74 20 69 44 62 2c  e3 *db, int iDb,
2d50: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 64   const char *zId
2d60: 78 4e 61 6d 65 29 7b 0a 20 20 49 6e 64 65 78 20  xName){.  Index 
2d70: 2a 70 49 6e 64 65 78 3b 0a 20 20 69 6e 74 20 6c  *pIndex;.  int l
2d80: 65 6e 3b 0a 20 20 48 61 73 68 20 2a 70 48 61 73  en;.  Hash *pHas
2d90: 68 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 44 62  h = &db->aDb[iDb
2da0: 5d 2e 70 53 63 68 65 6d 61 2d 3e 69 64 78 48 61  ].pSchema->idxHa
2db0: 73 68 3b 0a 0a 20 20 6c 65 6e 20 3d 20 73 74 72  sh;..  len = str
2dc0: 6c 65 6e 28 7a 49 64 78 4e 61 6d 65 29 3b 0a 20  len(zIdxName);. 
2dd0: 20 70 49 6e 64 65 78 20 3d 20 73 71 6c 69 74 65   pIndex = sqlite
2de0: 33 48 61 73 68 49 6e 73 65 72 74 28 70 48 61 73  3HashInsert(pHas
2df0: 68 2c 20 7a 49 64 78 4e 61 6d 65 2c 20 6c 65 6e  h, zIdxName, len
2e00: 2b 31 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 49  +1, 0);.  if( pI
2e10: 6e 64 65 78 20 29 7b 0a 20 20 20 20 69 66 28 20  ndex ){.    if( 
2e20: 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 2d 3e  pIndex->pTable->
2e30: 70 49 6e 64 65 78 3d 3d 70 49 6e 64 65 78 20 29  pIndex==pIndex )
2e40: 7b 0a 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e  {.      pIndex->
2e50: 70 54 61 62 6c 65 2d 3e 70 49 6e 64 65 78 20 3d  pTable->pIndex =
2e60: 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74 3b 0a   pIndex->pNext;.
2e70: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2e80: 20 49 6e 64 65 78 20 2a 70 3b 0a 20 20 20 20 20   Index *p;.     
2e90: 20 66 6f 72 28 70 3d 70 49 6e 64 65 78 2d 3e 70   for(p=pIndex->p
2ea0: 54 61 62 6c 65 2d 3e 70 49 6e 64 65 78 3b 20 70  Table->pIndex; p
2eb0: 20 26 26 20 70 2d 3e 70 4e 65 78 74 21 3d 70 49   && p->pNext!=pI
2ec0: 6e 64 65 78 3b 20 70 3d 70 2d 3e 70 4e 65 78 74  ndex; p=p->pNext
2ed0: 29 7b 7d 0a 20 20 20 20 20 20 69 66 28 20 70 20  ){}.      if( p 
2ee0: 26 26 20 70 2d 3e 70 4e 65 78 74 3d 3d 70 49 6e  && p->pNext==pIn
2ef0: 64 65 78 20 29 7b 0a 20 20 20 20 20 20 20 20 70  dex ){.        p
2f00: 2d 3e 70 4e 65 78 74 20 3d 20 70 49 6e 64 65 78  ->pNext = pIndex
2f10: 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d  ->pNext;.      }
2f20: 0a 20 20 20 20 7d 0a 20 20 20 20 66 72 65 65 49  .    }.    freeI
2f30: 6e 64 65 78 28 70 49 6e 64 65 78 29 3b 0a 20 20  ndex(pIndex);.  
2f40: 7d 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d  }.  db->flags |=
2f50: 20 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68   SQLITE_InternCh
2f60: 61 6e 67 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  anges;.}../*.** 
2f70: 45 72 61 73 65 20 61 6c 6c 20 73 63 68 65 6d 61  Erase all schema
2f80: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f   information fro
2f90: 6d 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20  m the in-memory 
2fa0: 68 61 73 68 20 74 61 62 6c 65 73 20 6f 66 0a 2a  hash tables of.*
2fb0: 2a 20 61 20 73 69 6e 67 6c 65 20 64 61 74 61 62  * a single datab
2fc0: 61 73 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69  ase.  This routi
2fd0: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20  ne is called to 
2fe0: 72 65 63 6c 61 69 6d 20 6d 65 6d 6f 72 79 0a 2a  reclaim memory.*
2ff0: 2a 20 62 65 66 6f 72 65 20 74 68 65 20 64 61 74  * before the dat
3000: 61 62 61 73 65 20 63 6c 6f 73 65 73 2e 20 20 49  abase closes.  I
3010: 74 20 69 73 20 61 6c 73 6f 20 63 61 6c 6c 65 64  t is also called
3020: 20 64 75 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61   during a rollba
3030: 63 6b 0a 2a 2a 20 69 66 20 74 68 65 72 65 20 77  ck.** if there w
3040: 65 72 65 20 73 63 68 65 6d 61 20 63 68 61 6e 67  ere schema chang
3050: 65 73 20 64 75 72 69 6e 67 20 74 68 65 20 74 72  es during the tr
3060: 61 6e 73 61 63 74 69 6f 6e 20 6f 72 20 69 66 20  ansaction or if 
3070: 61 0a 2a 2a 20 73 63 68 65 6d 61 2d 63 6f 6f 6b  a.** schema-cook
3080: 69 65 20 6d 69 73 6d 61 74 63 68 20 6f 63 63 75  ie mismatch occu
3090: 72 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 69 44 62  rs..**.** If iDb
30a0: 3c 3d 30 20 74 68 65 6e 20 72 65 73 65 74 20 74  <=0 then reset t
30b0: 68 65 20 69 6e 74 65 72 6e 61 6c 20 73 63 68 65  he internal sche
30c0: 6d 61 20 74 61 62 6c 65 73 20 66 6f 72 20 61 6c  ma tables for al
30d0: 6c 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 66 69  l database.** fi
30e0: 6c 65 73 2e 20 20 49 66 20 69 44 62 3e 3d 32 20  les.  If iDb>=2 
30f0: 74 68 65 6e 20 72 65 73 65 74 20 74 68 65 20 69  then reset the i
3100: 6e 74 65 72 6e 61 6c 20 73 63 68 65 6d 61 20 66  nternal schema f
3110: 6f 72 20 6f 6e 6c 79 20 74 68 65 0a 2a 2a 20 73  or only the.** s
3120: 69 6e 67 6c 65 20 66 69 6c 65 20 69 6e 64 69 63  ingle file indic
3130: 61 74 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ated..*/.void sq
3140: 6c 69 74 65 33 52 65 73 65 74 49 6e 74 65 72 6e  lite3ResetIntern
3150: 61 6c 53 63 68 65 6d 61 28 73 71 6c 69 74 65 33  alSchema(sqlite3
3160: 20 2a 64 62 2c 20 69 6e 74 20 69 44 62 29 7b 0a   *db, int iDb){.
3170: 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 61 73    int i, j;.  as
3180: 73 65 72 74 28 20 69 44 62 3e 3d 30 20 26 26 20  sert( iDb>=0 && 
3190: 69 44 62 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 0a  iDb<db->nDb );..
31a0: 20 20 69 66 28 20 69 44 62 3d 3d 30 20 29 7b 0a    if( iDb==0 ){.
31b0: 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
31c0: 45 6e 74 65 72 41 6c 6c 28 64 62 29 3b 0a 20 20  EnterAll(db);.  
31d0: 7d 0a 20 20 66 6f 72 28 69 3d 69 44 62 3b 20 69  }.  for(i=iDb; i
31e0: 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a  <db->nDb; i++){.
31f0: 20 20 20 20 44 62 20 2a 70 44 62 20 3d 20 26 64      Db *pDb = &d
3200: 62 2d 3e 61 44 62 5b 69 5d 3b 0a 20 20 20 20 69  b->aDb[i];.    i
3210: 66 28 20 70 44 62 2d 3e 70 53 63 68 65 6d 61 20  f( pDb->pSchema 
3220: 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
3230: 69 3d 3d 31 20 7c 7c 20 28 70 44 62 2d 3e 70 42  i==1 || (pDb->pB
3240: 74 20 26 26 20 73 71 6c 69 74 65 33 42 74 72 65  t && sqlite3Btre
3250: 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 44 62 2d  eHoldsMutex(pDb-
3260: 3e 70 42 74 29 29 29 3b 0a 20 20 20 20 20 20 73  >pBt)));.      s
3270: 71 6c 69 74 65 33 53 63 68 65 6d 61 46 72 65 65  qlite3SchemaFree
3280: 28 70 44 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a  (pDb->pSchema);.
3290: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 44      }.    if( iD
32a0: 62 3e 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  b>0 ) return;.  
32b0: 7d 0a 20 20 61 73 73 65 72 74 28 20 69 44 62 3d  }.  assert( iDb=
32c0: 3d 30 20 29 3b 0a 20 20 64 62 2d 3e 66 6c 61 67  =0 );.  db->flag
32d0: 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 49 6e 74  s &= ~SQLITE_Int
32e0: 65 72 6e 43 68 61 6e 67 65 73 3b 0a 20 20 73 71  ernChanges;.  sq
32f0: 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 41  lite3BtreeLeaveA
3300: 6c 6c 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 49 66  ll(db);..  /* If
3310: 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 66 20   one or more of 
3320: 74 68 65 20 61 75 78 69 6c 69 61 72 79 20 64 61  the auxiliary da
3330: 74 61 62 61 73 65 20 66 69 6c 65 73 20 68 61 73  tabase files has
3340: 20 62 65 65 6e 20 63 6c 6f 73 65 64 2c 0a 20 20   been closed,.  
3350: 2a 2a 20 74 68 65 6e 20 72 65 6d 6f 76 65 20 74  ** then remove t
3360: 68 65 6d 20 66 72 6f 6d 20 74 68 65 20 61 75 78  hem from the aux
3370: 69 6c 69 61 72 79 20 64 61 74 61 62 61 73 65 20  iliary database 
3380: 6c 69 73 74 2e 20 20 57 65 20 74 61 6b 65 20 74  list.  We take t
3390: 68 65 0a 20 20 2a 2a 20 6f 70 70 6f 72 74 75 6e  he.  ** opportun
33a0: 69 74 79 20 74 6f 20 64 6f 20 74 68 69 73 20 68  ity to do this h
33b0: 65 72 65 20 73 69 6e 63 65 20 77 65 20 68 61 76  ere since we hav
33c0: 65 20 6a 75 73 74 20 64 65 6c 65 74 65 64 20 61  e just deleted a
33d0: 6c 6c 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 73  ll of the.  ** s
33e0: 63 68 65 6d 61 20 68 61 73 68 20 74 61 62 6c 65  chema hash table
33f0: 73 20 61 6e 64 20 74 68 65 72 65 66 6f 72 65 20  s and therefore 
3400: 64 6f 20 6e 6f 74 20 68 61 76 65 20 74 6f 20 6d  do not have to m
3410: 61 6b 65 20 61 6e 79 20 63 68 61 6e 67 65 73 0a  ake any changes.
3420: 20 20 2a 2a 20 74 6f 20 61 6e 79 20 6f 66 20 74    ** to any of t
3430: 68 6f 73 65 20 74 61 62 6c 65 73 2e 0a 20 20 2a  hose tables..  *
3440: 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64  /.  for(i=0; i<d
3450: 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20  b->nDb; i++){.  
3460: 20 20 73 74 72 75 63 74 20 44 62 20 2a 70 44 62    struct Db *pDb
3470: 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 5d 3b 0a   = &db->aDb[i];.
3480: 20 20 20 20 69 66 28 20 70 44 62 2d 3e 70 42 74      if( pDb->pBt
3490: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ==0 ){.      if(
34a0: 20 70 44 62 2d 3e 70 41 75 78 20 26 26 20 70 44   pDb->pAux && pD
34b0: 62 2d 3e 78 46 72 65 65 41 75 78 20 29 20 70 44  b->xFreeAux ) pD
34c0: 62 2d 3e 78 46 72 65 65 41 75 78 28 70 44 62 2d  b->xFreeAux(pDb-
34d0: 3e 70 41 75 78 29 3b 0a 20 20 20 20 20 20 70 44  >pAux);.      pD
34e0: 62 2d 3e 70 41 75 78 20 3d 20 30 3b 0a 20 20 20  b->pAux = 0;.   
34f0: 20 7d 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 6a   }.  }.  for(i=j
3500: 3d 32 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69  =2; i<db->nDb; i
3510: 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  ++){.    struct 
3520: 44 62 20 2a 70 44 62 20 3d 20 26 64 62 2d 3e 61  Db *pDb = &db->a
3530: 44 62 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 70  Db[i];.    if( p
3540: 44 62 2d 3e 70 42 74 3d 3d 30 20 29 7b 0a 20 20  Db->pBt==0 ){.  
3550: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
3560: 28 70 44 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  (pDb->zName);.  
3570: 20 20 20 20 70 44 62 2d 3e 7a 4e 61 6d 65 20 3d      pDb->zName =
3580: 20 30 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e   0;.      contin
3590: 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ue;.    }.    if
35a0: 28 20 6a 3c 69 20 29 7b 0a 20 20 20 20 20 20 64  ( j<i ){.      d
35b0: 62 2d 3e 61 44 62 5b 6a 5d 20 3d 20 64 62 2d 3e  b->aDb[j] = db->
35c0: 61 44 62 5b 69 5d 3b 0a 20 20 20 20 7d 0a 20 20  aDb[i];.    }.  
35d0: 20 20 6a 2b 2b 3b 0a 20 20 7d 0a 20 20 6d 65 6d    j++;.  }.  mem
35e0: 73 65 74 28 26 64 62 2d 3e 61 44 62 5b 6a 5d 2c  set(&db->aDb[j],
35f0: 20 30 2c 20 28 64 62 2d 3e 6e 44 62 2d 6a 29 2a   0, (db->nDb-j)*
3600: 73 69 7a 65 6f 66 28 64 62 2d 3e 61 44 62 5b 6a  sizeof(db->aDb[j
3610: 5d 29 29 3b 0a 20 20 64 62 2d 3e 6e 44 62 20 3d  ]));.  db->nDb =
3620: 20 6a 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6e 44   j;.  if( db->nD
3630: 62 3c 3d 32 20 26 26 20 64 62 2d 3e 61 44 62 21  b<=2 && db->aDb!
3640: 3d 64 62 2d 3e 61 44 62 53 74 61 74 69 63 20 29  =db->aDbStatic )
3650: 7b 0a 20 20 20 20 6d 65 6d 63 70 79 28 64 62 2d  {.    memcpy(db-
3660: 3e 61 44 62 53 74 61 74 69 63 2c 20 64 62 2d 3e  >aDbStatic, db->
3670: 61 44 62 2c 20 32 2a 73 69 7a 65 6f 66 28 64 62  aDb, 2*sizeof(db
3680: 2d 3e 61 44 62 5b 30 5d 29 29 3b 0a 20 20 20 20  ->aDb[0]));.    
3690: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 64 62 2d  sqlite3_free(db-
36a0: 3e 61 44 62 29 3b 0a 20 20 20 20 64 62 2d 3e 61  >aDb);.    db->a
36b0: 44 62 20 3d 20 64 62 2d 3e 61 44 62 53 74 61 74  Db = db->aDbStat
36c0: 69 63 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  ic;.  }.}../*.**
36d0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
36e0: 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 63   called when a c
36f0: 6f 6d 6d 69 74 20 6f 63 63 75 72 73 2e 0a 2a 2f  ommit occurs..*/
3700: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 6f 6d  .void sqlite3Com
3710: 6d 69 74 49 6e 74 65 72 6e 61 6c 43 68 61 6e 67  mitInternalChang
3720: 65 73 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b  es(sqlite3 *db){
3730: 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20  .  db->flags &= 
3740: 7e 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68  ~SQLITE_InternCh
3750: 61 6e 67 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  anges;.}../*.** 
3760: 43 6c 65 61 72 20 74 68 65 20 63 6f 6c 75 6d 6e  Clear the column
3770: 20 6e 61 6d 65 73 20 66 72 6f 6d 20 61 20 74 61   names from a ta
3780: 62 6c 65 20 6f 72 20 76 69 65 77 2e 0a 2a 2f 0a  ble or view..*/.
3790: 73 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69  static void sqli
37a0: 74 65 52 65 73 65 74 43 6f 6c 75 6d 6e 4e 61 6d  teResetColumnNam
37b0: 65 73 28 54 61 62 6c 65 20 2a 70 54 61 62 6c 65  es(Table *pTable
37c0: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 43 6f  ){.  int i;.  Co
37d0: 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 61 73  lumn *pCol;.  as
37e0: 73 65 72 74 28 20 70 54 61 62 6c 65 21 3d 30 20  sert( pTable!=0 
37f0: 29 3b 0a 20 20 69 66 28 20 28 70 43 6f 6c 20 3d  );.  if( (pCol =
3800: 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 29 21 3d   pTable->aCol)!=
3810: 30 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30  0 ){.    for(i=0
3820: 3b 20 69 3c 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c  ; i<pTable->nCol
3830: 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a  ; i++, pCol++){.
3840: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
3850: 65 65 28 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 3b  ee(pCol->zName);
3860: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
3870: 70 72 44 65 6c 65 74 65 28 70 43 6f 6c 2d 3e 70  prDelete(pCol->p
3880: 44 66 6c 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  Dflt);.      sql
3890: 69 74 65 33 5f 66 72 65 65 28 70 43 6f 6c 2d 3e  ite3_free(pCol->
38a0: 7a 54 79 70 65 29 3b 0a 20 20 20 20 20 20 73 71  zType);.      sq
38b0: 6c 69 74 65 33 5f 66 72 65 65 28 70 43 6f 6c 2d  lite3_free(pCol-
38c0: 3e 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20 7d 0a 20  >zColl);.    }. 
38d0: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
38e0: 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 29 3b 0a 20  pTable->aCol);. 
38f0: 20 7d 0a 20 20 70 54 61 62 6c 65 2d 3e 61 43 6f   }.  pTable->aCo
3900: 6c 20 3d 20 30 3b 0a 20 20 70 54 61 62 6c 65 2d  l = 0;.  pTable-
3910: 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a  >nCol = 0;.}../*
3920: 0a 2a 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 6d  .** Remove the m
3930: 65 6d 6f 72 79 20 64 61 74 61 20 73 74 72 75 63  emory data struc
3940: 74 75 72 65 73 20 61 73 73 6f 63 69 61 74 65 64  tures associated
3950: 20 77 69 74 68 20 74 68 65 20 67 69 76 65 6e 0a   with the given.
3960: 2a 2a 20 54 61 62 6c 65 2e 20 20 4e 6f 20 63 68  ** Table.  No ch
3970: 61 6e 67 65 73 20 61 72 65 20 6d 61 64 65 20 74  anges are made t
3980: 6f 20 64 69 73 6b 20 62 79 20 74 68 69 73 20 72  o disk by this r
3990: 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  outine..**.** Th
39a0: 69 73 20 72 6f 75 74 69 6e 65 20 6a 75 73 74 20  is routine just 
39b0: 64 65 6c 65 74 65 73 20 74 68 65 20 64 61 74 61  deletes the data
39c0: 20 73 74 72 75 63 74 75 72 65 2e 20 20 49 74 20   structure.  It 
39d0: 64 6f 65 73 20 6e 6f 74 20 75 6e 6c 69 6e 6b 0a  does not unlink.
39e0: 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 64 61 74  ** the table dat
39f0: 61 20 73 74 72 75 63 74 75 72 65 20 66 72 6f 6d  a structure from
3a00: 20 74 68 65 20 68 61 73 68 20 74 61 62 6c 65 2e   the hash table.
3a10: 20 20 4e 6f 72 20 64 6f 65 73 20 69 74 20 72 65    Nor does it re
3a20: 6d 6f 76 65 0a 2a 2a 20 66 6f 72 65 69 67 6e 20  move.** foreign 
3a30: 6b 65 79 73 20 66 72 6f 6d 20 74 68 65 20 73 71  keys from the sq
3a40: 6c 69 74 65 2e 61 46 4b 65 79 20 68 61 73 68 20  lite.aFKey hash 
3a50: 74 61 62 6c 65 2e 20 20 42 75 74 20 69 74 20 64  table.  But it d
3a60: 6f 65 73 20 64 65 73 74 72 6f 79 0a 2a 2a 20 6d  oes destroy.** m
3a70: 65 6d 6f 72 79 20 73 74 72 75 63 74 75 72 65 73  emory structures
3a80: 20 6f 66 20 74 68 65 20 69 6e 64 69 63 65 73 20   of the indices 
3a90: 61 6e 64 20 66 6f 72 65 69 67 6e 20 6b 65 79 73  and foreign keys
3aa0: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
3ab0: 20 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 2e 0a   .** the table..
3ac0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 44  */.void sqlite3D
3ad0: 65 6c 65 74 65 54 61 62 6c 65 28 54 61 62 6c 65  eleteTable(Table
3ae0: 20 2a 70 54 61 62 6c 65 29 7b 0a 20 20 49 6e 64   *pTable){.  Ind
3af0: 65 78 20 2a 70 49 6e 64 65 78 2c 20 2a 70 4e 65  ex *pIndex, *pNe
3b00: 78 74 3b 0a 20 20 46 4b 65 79 20 2a 70 46 4b 65  xt;.  FKey *pFKe
3b10: 79 2c 20 2a 70 4e 65 78 74 46 4b 65 79 3b 0a 0a  y, *pNextFKey;..
3b20: 20 20 69 66 28 20 70 54 61 62 6c 65 3d 3d 30 20    if( pTable==0 
3b30: 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20  ) return;..  /* 
3b40: 44 6f 20 6e 6f 74 20 64 65 6c 65 74 65 20 74 68  Do not delete th
3b50: 65 20 74 61 62 6c 65 20 75 6e 74 69 6c 20 74 68  e table until th
3b60: 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e  e reference coun
3b70: 74 20 72 65 61 63 68 65 73 20 7a 65 72 6f 2e 20  t reaches zero. 
3b80: 2a 2f 0a 20 20 70 54 61 62 6c 65 2d 3e 6e 52 65  */.  pTable->nRe
3b90: 66 2d 2d 3b 0a 20 20 69 66 28 20 70 54 61 62 6c  f--;.  if( pTabl
3ba0: 65 2d 3e 6e 52 65 66 3e 30 20 29 7b 0a 20 20 20  e->nRef>0 ){.   
3bb0: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 61   return;.  }.  a
3bc0: 73 73 65 72 74 28 20 70 54 61 62 6c 65 2d 3e 6e  ssert( pTable->n
3bd0: 52 65 66 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20  Ref==0 );..  /* 
3be0: 44 65 6c 65 74 65 20 61 6c 6c 20 69 6e 64 69 63  Delete all indic
3bf0: 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  es associated wi
3c00: 74 68 20 74 68 69 73 20 74 61 62 6c 65 0a 20 20  th this table.  
3c10: 2a 2f 0a 20 20 66 6f 72 28 70 49 6e 64 65 78 20  */.  for(pIndex 
3c20: 3d 20 70 54 61 62 6c 65 2d 3e 70 49 6e 64 65 78  = pTable->pIndex
3c30: 3b 20 70 49 6e 64 65 78 3b 20 70 49 6e 64 65 78  ; pIndex; pIndex
3c40: 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20 70 4e 65  =pNext){.    pNe
3c50: 78 74 20 3d 20 70 49 6e 64 65 78 2d 3e 70 4e 65  xt = pIndex->pNe
3c60: 78 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  xt;.    assert( 
3c70: 70 49 6e 64 65 78 2d 3e 70 53 63 68 65 6d 61 3d  pIndex->pSchema=
3c80: 3d 70 54 61 62 6c 65 2d 3e 70 53 63 68 65 6d 61  =pTable->pSchema
3c90: 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 44 65   );.    sqliteDe
3ca0: 6c 65 74 65 49 6e 64 65 78 28 70 49 6e 64 65 78  leteIndex(pIndex
3cb0: 29 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20  );.  }..#ifndef 
3cc0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45  SQLITE_OMIT_FORE
3cd0: 49 47 4e 5f 4b 45 59 0a 20 20 2f 2a 20 44 65 6c  IGN_KEY.  /* Del
3ce0: 65 74 65 20 61 6c 6c 20 66 6f 72 65 69 67 6e 20  ete all foreign 
3cf0: 6b 65 79 73 20 61 73 73 6f 63 69 61 74 65 64 20  keys associated 
3d00: 77 69 74 68 20 74 68 69 73 20 74 61 62 6c 65 2e  with this table.
3d10: 20 20 54 68 65 20 6b 65 79 73 0a 20 20 2a 2a 20    The keys.  ** 
3d20: 73 68 6f 75 6c 64 20 68 61 76 65 20 61 6c 72 65  should have alre
3d30: 61 64 79 20 62 65 65 6e 20 75 6e 6c 69 6e 6b 65  ady been unlinke
3d40: 64 20 66 72 6f 6d 20 74 68 65 20 70 53 63 68 65  d from the pSche
3d50: 6d 61 2d 3e 61 46 4b 65 79 20 68 61 73 68 20 74  ma->aFKey hash t
3d60: 61 62 6c 65 20 0a 20 20 2a 2f 0a 20 20 66 6f 72  able .  */.  for
3d70: 28 70 46 4b 65 79 3d 70 54 61 62 6c 65 2d 3e 70  (pFKey=pTable->p
3d80: 46 4b 65 79 3b 20 70 46 4b 65 79 3b 20 70 46 4b  FKey; pFKey; pFK
3d90: 65 79 3d 70 4e 65 78 74 46 4b 65 79 29 7b 0a 20  ey=pNextFKey){. 
3da0: 20 20 20 70 4e 65 78 74 46 4b 65 79 20 3d 20 70     pNextFKey = p
3db0: 46 4b 65 79 2d 3e 70 4e 65 78 74 46 72 6f 6d 3b  FKey->pNextFrom;
3dc0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c  .    assert( sql
3dd0: 69 74 65 33 48 61 73 68 46 69 6e 64 28 26 70 54  ite3HashFind(&pT
3de0: 61 62 6c 65 2d 3e 70 53 63 68 65 6d 61 2d 3e 61  able->pSchema->a
3df0: 46 4b 65 79 2c 0a 20 20 20 20 20 20 20 20 20 20  FKey,.          
3e00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3e10: 20 70 46 4b 65 79 2d 3e 7a 54 6f 2c 20 73 74 72   pFKey->zTo, str
3e20: 6c 65 6e 28 70 46 4b 65 79 2d 3e 7a 54 6f 29 2b  len(pFKey->zTo)+
3e30: 31 29 21 3d 70 46 4b 65 79 20 29 3b 0a 20 20 20  1)!=pFKey );.   
3e40: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 46   sqlite3_free(pF
3e50: 4b 65 79 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  Key);.  }.#endif
3e60: 0a 0a 20 20 2f 2a 20 44 65 6c 65 74 65 20 74 68  ..  /* Delete th
3e70: 65 20 54 61 62 6c 65 20 73 74 72 75 63 74 75 72  e Table structur
3e80: 65 20 69 74 73 65 6c 66 2e 0a 20 20 2a 2f 0a 20  e itself..  */. 
3e90: 20 73 71 6c 69 74 65 52 65 73 65 74 43 6f 6c 75   sqliteResetColu
3ea0: 6d 6e 4e 61 6d 65 73 28 70 54 61 62 6c 65 29 3b  mnNames(pTable);
3eb0: 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
3ec0: 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 29 3b 0a  pTable->zName);.
3ed0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
3ee0: 54 61 62 6c 65 2d 3e 7a 43 6f 6c 41 66 66 29 3b  Table->zColAff);
3ef0: 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  .  sqlite3Select
3f00: 44 65 6c 65 74 65 28 70 54 61 62 6c 65 2d 3e 70  Delete(pTable->p
3f10: 53 65 6c 65 63 74 29 3b 0a 23 69 66 6e 64 65 66  Select);.#ifndef
3f20: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 48 45   SQLITE_OMIT_CHE
3f30: 43 4b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  CK.  sqlite3Expr
3f40: 44 65 6c 65 74 65 28 70 54 61 62 6c 65 2d 3e 70  Delete(pTable->p
3f50: 43 68 65 63 6b 29 3b 0a 23 65 6e 64 69 66 0a 20  Check);.#endif. 
3f60: 20 73 71 6c 69 74 65 33 56 74 61 62 43 6c 65 61   sqlite3VtabClea
3f70: 72 28 70 54 61 62 6c 65 29 3b 0a 20 20 73 71 6c  r(pTable);.  sql
3f80: 69 74 65 33 5f 66 72 65 65 28 70 54 61 62 6c 65  ite3_free(pTable
3f90: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 69  );.}../*.** Unli
3fa0: 6e 6b 20 74 68 65 20 67 69 76 65 6e 20 74 61 62  nk the given tab
3fb0: 6c 65 20 66 72 6f 6d 20 74 68 65 20 68 61 73 68  le from the hash
3fc0: 20 74 61 62 6c 65 73 20 61 6e 64 20 74 68 65 20   tables and the 
3fd0: 64 65 6c 65 74 65 20 74 68 65 0a 2a 2a 20 74 61  delete the.** ta
3fe0: 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 77 69  ble structure wi
3ff0: 74 68 20 61 6c 6c 20 69 74 73 20 69 6e 64 69 63  th all its indic
4000: 65 73 20 61 6e 64 20 66 6f 72 65 69 67 6e 20 6b  es and foreign k
4010: 65 79 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  eys..*/.void sql
4020: 69 74 65 33 55 6e 6c 69 6e 6b 41 6e 64 44 65 6c  ite3UnlinkAndDel
4030: 65 74 65 54 61 62 6c 65 28 73 71 6c 69 74 65 33  eteTable(sqlite3
4040: 20 2a 64 62 2c 20 69 6e 74 20 69 44 62 2c 20 63   *db, int iDb, c
4050: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62 4e  onst char *zTabN
4060: 61 6d 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70  ame){.  Table *p
4070: 3b 0a 20 20 46 4b 65 79 20 2a 70 46 31 2c 20 2a  ;.  FKey *pF1, *
4080: 70 46 32 3b 0a 20 20 44 62 20 2a 70 44 62 3b 0a  pF2;.  Db *pDb;.
4090: 0a 20 20 61 73 73 65 72 74 28 20 64 62 21 3d 30  .  assert( db!=0
40a0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 44   );.  assert( iD
40b0: 62 3e 3d 30 20 26 26 20 69 44 62 3c 64 62 2d 3e  b>=0 && iDb<db->
40c0: 6e 44 62 20 29 3b 0a 20 20 61 73 73 65 72 74 28  nDb );.  assert(
40d0: 20 7a 54 61 62 4e 61 6d 65 20 26 26 20 7a 54 61   zTabName && zTa
40e0: 62 4e 61 6d 65 5b 30 5d 20 29 3b 0a 20 20 70 44  bName[0] );.  pD
40f0: 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 44 62  b = &db->aDb[iDb
4100: 5d 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33  ];.  p = sqlite3
4110: 48 61 73 68 49 6e 73 65 72 74 28 26 70 44 62 2d  HashInsert(&pDb-
4120: 3e 70 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73  >pSchema->tblHas
4130: 68 2c 20 7a 54 61 62 4e 61 6d 65 2c 20 73 74 72  h, zTabName, str
4140: 6c 65 6e 28 7a 54 61 62 4e 61 6d 65 29 2b 31 2c  len(zTabName)+1,
4150: 30 29 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 23  0);.  if( p ){.#
4160: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
4170: 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 0a 20  IT_FOREIGN_KEY. 
4180: 20 20 20 66 6f 72 28 70 46 31 3d 70 2d 3e 70 46     for(pF1=p->pF
4190: 4b 65 79 3b 20 70 46 31 3b 20 70 46 31 3d 70 46  Key; pF1; pF1=pF
41a0: 31 2d 3e 70 4e 65 78 74 46 72 6f 6d 29 7b 0a 20  1->pNextFrom){. 
41b0: 20 20 20 20 20 69 6e 74 20 6e 54 6f 20 3d 20 73       int nTo = s
41c0: 74 72 6c 65 6e 28 70 46 31 2d 3e 7a 54 6f 29 20  trlen(pF1->zTo) 
41d0: 2b 20 31 3b 0a 20 20 20 20 20 20 70 46 32 20 3d  + 1;.      pF2 =
41e0: 20 73 71 6c 69 74 65 33 48 61 73 68 46 69 6e 64   sqlite3HashFind
41f0: 28 26 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e  (&pDb->pSchema->
4200: 61 46 4b 65 79 2c 20 70 46 31 2d 3e 7a 54 6f 2c  aFKey, pF1->zTo,
4210: 20 6e 54 6f 29 3b 0a 20 20 20 20 20 20 69 66 28   nTo);.      if(
4220: 20 70 46 32 3d 3d 70 46 31 20 29 7b 0a 20 20 20   pF2==pF1 ){.   
4230: 20 20 20 20 20 73 71 6c 69 74 65 33 48 61 73 68       sqlite3Hash
4240: 49 6e 73 65 72 74 28 26 70 44 62 2d 3e 70 53 63  Insert(&pDb->pSc
4250: 68 65 6d 61 2d 3e 61 46 4b 65 79 2c 20 70 46 31  hema->aFKey, pF1
4260: 2d 3e 7a 54 6f 2c 20 6e 54 6f 2c 20 70 46 31 2d  ->zTo, nTo, pF1-
4270: 3e 70 4e 65 78 74 54 6f 29 3b 0a 20 20 20 20 20  >pNextTo);.     
4280: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
4290: 77 68 69 6c 65 28 20 70 46 32 20 26 26 20 70 46  while( pF2 && pF
42a0: 32 2d 3e 70 4e 65 78 74 54 6f 21 3d 70 46 31 20  2->pNextTo!=pF1 
42b0: 29 7b 20 70 46 32 3d 70 46 32 2d 3e 70 4e 65 78  ){ pF2=pF2->pNex
42c0: 74 54 6f 3b 20 7d 0a 20 20 20 20 20 20 20 20 69  tTo; }.        i
42d0: 66 28 20 70 46 32 20 29 7b 0a 20 20 20 20 20 20  f( pF2 ){.      
42e0: 20 20 20 20 70 46 32 2d 3e 70 4e 65 78 74 54 6f      pF2->pNextTo
42f0: 20 3d 20 70 46 31 2d 3e 70 4e 65 78 74 54 6f 3b   = pF1->pNextTo;
4300: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
4310: 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a   }.    }.#endif.
4320: 20 20 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74      sqlite3Delet
4330: 65 54 61 62 6c 65 28 70 29 3b 0a 20 20 7d 0a 20  eTable(p);.  }. 
4340: 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51   db->flags |= SQ
4350: 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67  LITE_InternChang
4360: 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76  es;.}../*.** Giv
4370: 65 6e 20 61 20 74 6f 6b 65 6e 2c 20 72 65 74 75  en a token, retu
4380: 72 6e 20 61 20 73 74 72 69 6e 67 20 74 68 61 74  rn a string that
4390: 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 74 68 65   consists of the
43a0: 20 74 65 78 74 20 6f 66 20 74 68 61 74 0a 2a 2a   text of that.**
43b0: 20 74 6f 6b 65 6e 20 77 69 74 68 20 61 6e 79 20   token with any 
43c0: 71 75 6f 74 61 74 69 6f 6e 73 20 72 65 6d 6f 76  quotations remov
43d0: 65 64 2e 20 20 53 70 61 63 65 20 74 6f 20 68 6f  ed.  Space to ho
43e0: 6c 64 20 74 68 65 20 72 65 74 75 72 6e 65 64 20  ld the returned 
43f0: 73 74 72 69 6e 67 0a 2a 2a 20 69 73 20 6f 62 74  string.** is obt
4400: 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74  ained from sqlit
4410: 65 4d 61 6c 6c 6f 63 28 29 20 61 6e 64 20 6d 75  eMalloc() and mu
4420: 73 74 20 62 65 20 66 72 65 65 64 20 62 79 20 74  st be freed by t
4430: 68 65 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 66 75  he calling.** fu
4440: 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 6f  nction..**.** To
4450: 6b 65 6e 73 20 61 72 65 20 6f 66 74 65 6e 20 6a  kens are often j
4460: 75 73 74 20 70 6f 69 6e 74 65 72 73 20 69 6e 74  ust pointers int
4470: 6f 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 53  o the original S
4480: 51 4c 20 74 65 78 74 20 61 6e 64 20 73 6f 0a 2a  QL text and so.*
4490: 2a 20 61 72 65 20 6e 6f 74 20 5c 30 30 30 20 74  * are not \000 t
44a0: 65 72 6d 69 6e 61 74 65 64 20 61 6e 64 20 61 72  erminated and ar
44b0: 65 20 6e 6f 74 20 70 65 72 73 69 73 74 65 6e 74  e not persistent
44c0: 2e 20 20 54 68 65 20 72 65 74 75 72 6e 65 64 20  .  The returned 
44d0: 73 74 72 69 6e 67 0a 2a 2a 20 69 73 20 5c 30 30  string.** is \00
44e0: 30 20 74 65 72 6d 69 6e 61 74 65 64 20 61 6e 64  0 terminated and
44f0: 20 69 73 20 70 65 72 73 69 73 74 65 6e 74 2e 0a   is persistent..
4500: 2a 2f 0a 63 68 61 72 20 2a 73 71 6c 69 74 65 33  */.char *sqlite3
4510: 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 73 71  NameFromToken(sq
4520: 6c 69 74 65 33 20 2a 64 62 2c 20 54 6f 6b 65 6e  lite3 *db, Token
4530: 20 2a 70 4e 61 6d 65 29 7b 0a 20 20 63 68 61 72   *pName){.  char
4540: 20 2a 7a 4e 61 6d 65 3b 0a 20 20 69 66 28 20 70   *zName;.  if( p
4550: 4e 61 6d 65 20 29 7b 0a 20 20 20 20 7a 4e 61 6d  Name ){.    zNam
4560: 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72  e = sqlite3DbStr
4570: 4e 44 75 70 28 64 62 2c 20 28 63 68 61 72 2a 29  NDup(db, (char*)
4580: 70 4e 61 6d 65 2d 3e 7a 2c 20 70 4e 61 6d 65 2d  pName->z, pName-
4590: 3e 6e 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  >n);.    sqlite3
45a0: 44 65 71 75 6f 74 65 28 7a 4e 61 6d 65 29 3b 0a  Dequote(zName);.
45b0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 4e 61    }else{.    zNa
45c0: 6d 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65  me = 0;.  }.  re
45d0: 74 75 72 6e 20 7a 4e 61 6d 65 3b 0a 7d 0a 0a 2f  turn zName;.}../
45e0: 2a 0a 2a 2a 20 4f 70 65 6e 20 74 68 65 20 73 71  *.** Open the sq
45f0: 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c  lite_master tabl
4600: 65 20 73 74 6f 72 65 64 20 69 6e 20 64 61 74 61  e stored in data
4610: 62 61 73 65 20 6e 75 6d 62 65 72 20 69 44 62 20  base number iDb 
4620: 66 6f 72 0a 2a 2a 20 77 72 69 74 69 6e 67 2e 20  for.** writing. 
4630: 54 68 65 20 74 61 62 6c 65 20 69 73 20 6f 70 65  The table is ope
4640: 6e 65 64 20 75 73 69 6e 67 20 63 75 72 73 6f 72  ned using cursor
4650: 20 30 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69   0..*/.void sqli
4660: 74 65 33 4f 70 65 6e 4d 61 73 74 65 72 54 61 62  te3OpenMasterTab
4670: 6c 65 28 50 61 72 73 65 20 2a 70 2c 20 69 6e 74  le(Parse *p, int
4680: 20 69 44 62 29 7b 0a 20 20 56 64 62 65 20 2a 76   iDb){.  Vdbe *v
4690: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
46a0: 65 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 54  e(p);.  sqlite3T
46b0: 61 62 6c 65 4c 6f 63 6b 28 70 2c 20 69 44 62 2c  ableLock(p, iDb,
46c0: 20 4d 41 53 54 45 52 5f 52 4f 4f 54 2c 20 31 2c   MASTER_ROOT, 1,
46d0: 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 44   SCHEMA_TABLE(iD
46e0: 62 29 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  b));.  sqlite3Vd
46f0: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4f  beAddOp3(v, OP_O
4700: 70 65 6e 57 72 69 74 65 2c 20 30 2c 20 4d 41 53  penWrite, 0, MAS
4710: 54 45 52 5f 52 4f 4f 54 2c 20 69 44 62 29 3b 0a  TER_ROOT, iDb);.
4720: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
4730: 4f 70 32 28 76 2c 20 4f 50 5f 53 65 74 4e 75 6d  Op2(v, OP_SetNum
4740: 43 6f 6c 75 6d 6e 73 2c 20 30 2c 20 35 29 3b 20  Columns, 0, 5); 
4750: 2f 2a 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  /* sqlite_master
4760: 20 68 61 73 20 35 20 63 6f 6c 75 6d 6e 73 20 2a   has 5 columns *
4770: 2f 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 74  /.}../*.** The t
4780: 6f 6b 65 6e 20 2a 70 4e 61 6d 65 20 63 6f 6e 74  oken *pName cont
4790: 61 69 6e 73 20 74 68 65 20 6e 61 6d 65 20 6f 66  ains the name of
47a0: 20 61 20 64 61 74 61 62 61 73 65 20 28 65 69 74   a database (eit
47b0: 68 65 72 20 22 6d 61 69 6e 22 20 6f 72 0a 2a 2a  her "main" or.**
47c0: 20 22 74 65 6d 70 22 20 6f 72 20 74 68 65 20 6e   "temp" or the n
47d0: 61 6d 65 20 6f 66 20 61 6e 20 61 74 74 61 63 68  ame of an attach
47e0: 65 64 20 64 62 29 2e 20 54 68 69 73 20 72 6f 75  ed db). This rou
47f0: 74 69 6e 65 20 72 65 74 75 72 6e 73 20 74 68 65  tine returns the
4800: 0a 2a 2a 20 69 6e 64 65 78 20 6f 66 20 74 68 65  .** index of the
4810: 20 6e 61 6d 65 64 20 64 61 74 61 62 61 73 65 20   named database 
4820: 69 6e 20 64 62 2d 3e 61 44 62 5b 5d 2c 20 6f 72  in db->aDb[], or
4830: 20 2d 31 20 69 66 20 74 68 65 20 6e 61 6d 65 64   -1 if the named
4840: 20 64 62 20 0a 2a 2a 20 64 6f 65 73 20 6e 6f 74   db .** does not
4850: 20 65 78 69 73 74 2e 0a 2a 2f 0a 69 6e 74 20 73   exist..*/.int s
4860: 71 6c 69 74 65 33 46 69 6e 64 44 62 28 73 71 6c  qlite3FindDb(sql
4870: 69 74 65 33 20 2a 64 62 2c 20 54 6f 6b 65 6e 20  ite3 *db, Token 
4880: 2a 70 4e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 69  *pName){.  int i
4890: 20 3d 20 2d 31 3b 20 20 20 20 2f 2a 20 44 61 74   = -1;    /* Dat
48a0: 61 62 61 73 65 20 6e 75 6d 62 65 72 20 2a 2f 0a  abase number */.
48b0: 20 20 69 6e 74 20 6e 3b 20 20 20 20 20 20 20 20    int n;        
48c0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 68   /* Number of ch
48d0: 61 72 61 63 74 65 72 73 20 69 6e 20 74 68 65 20  aracters in the 
48e0: 6e 61 6d 65 20 2a 2f 0a 20 20 44 62 20 2a 70 44  name */.  Db *pD
48f0: 62 3b 20 20 20 20 20 20 20 2f 2a 20 41 20 64 61  b;       /* A da
4900: 74 61 62 61 73 65 20 77 68 6f 73 65 20 6e 61 6d  tabase whose nam
4910: 65 20 73 70 61 63 65 20 69 73 20 62 65 69 6e 67  e space is being
4920: 20 73 65 61 72 63 68 65 64 20 2a 2f 0a 20 20 63   searched */.  c
4930: 68 61 72 20 2a 7a 4e 61 6d 65 3b 20 20 20 2f 2a  har *zName;   /*
4940: 20 4e 61 6d 65 20 77 65 20 61 72 65 20 73 65 61   Name we are sea
4950: 72 63 68 69 6e 67 20 66 6f 72 20 2a 2f 0a 0a 20  rching for */.. 
4960: 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33   zName = sqlite3
4970: 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62  NameFromToken(db
4980: 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20  , pName);.  if( 
4990: 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 6e 20 3d  zName ){.    n =
49a0: 20 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 3b 0a   strlen(zName);.
49b0: 20 20 20 20 66 6f 72 28 69 3d 28 64 62 2d 3e 6e      for(i=(db->n
49c0: 44 62 2d 31 29 2c 20 70 44 62 3d 26 64 62 2d 3e  Db-1), pDb=&db->
49d0: 61 44 62 5b 69 5d 3b 20 69 3e 3d 30 3b 20 69 2d  aDb[i]; i>=0; i-
49e0: 2d 2c 20 70 44 62 2d 2d 29 7b 0a 20 20 20 20 20  -, pDb--){.     
49f0: 20 69 66 28 20 28 21 4f 4d 49 54 5f 54 45 4d 50   if( (!OMIT_TEMP
4a00: 44 42 20 7c 7c 20 69 21 3d 31 20 29 20 26 26 20  DB || i!=1 ) && 
4a10: 6e 3d 3d 73 74 72 6c 65 6e 28 70 44 62 2d 3e 7a  n==strlen(pDb->z
4a20: 4e 61 6d 65 29 20 26 26 20 0a 20 20 20 20 20 20  Name) && .      
4a30: 20 20 20 20 30 3d 3d 73 71 6c 69 74 65 33 53 74      0==sqlite3St
4a40: 72 49 43 6d 70 28 70 44 62 2d 3e 7a 4e 61 6d 65  rICmp(pDb->zName
4a50: 2c 20 7a 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20  , zName) ){.    
4a60: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
4a70: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c   }.    }.    sql
4a80: 69 74 65 33 5f 66 72 65 65 28 7a 4e 61 6d 65 29  ite3_free(zName)
4a90: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 69  ;.  }.  return i
4aa0: 3b 0a 7d 0a 0a 2f 2a 20 54 68 65 20 74 61 62 6c  ;.}../* The tabl
4ab0: 65 20 6f 72 20 76 69 65 77 20 6f 72 20 74 72 69  e or view or tri
4ac0: 67 67 65 72 20 6e 61 6d 65 20 69 73 20 70 61 73  gger name is pas
4ad0: 73 65 64 20 74 6f 20 74 68 69 73 20 72 6f 75 74  sed to this rout
4ae0: 69 6e 65 20 76 69 61 20 74 6f 6b 65 6e 73 0a 2a  ine via tokens.*
4af0: 2a 20 70 4e 61 6d 65 31 20 61 6e 64 20 70 4e 61  * pName1 and pNa
4b00: 6d 65 32 2e 20 49 66 20 74 68 65 20 74 61 62 6c  me2. If the tabl
4b10: 65 20 6e 61 6d 65 20 77 61 73 20 66 75 6c 6c 79  e name was fully
4b20: 20 71 75 61 6c 69 66 69 65 64 2c 20 66 6f 72 20   qualified, for 
4b30: 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 43  example:.**.** C
4b40: 52 45 41 54 45 20 54 41 42 4c 45 20 78 78 78 2e  REATE TABLE xxx.
4b50: 79 79 79 20 28 2e 2e 2e 29 3b 0a 2a 2a 20 0a 2a  yyy (...);.** .*
4b60: 2a 20 54 68 65 6e 20 70 4e 61 6d 65 31 20 69 73  * Then pName1 is
4b70: 20 73 65 74 20 74 6f 20 22 78 78 78 22 20 61 6e   set to "xxx" an
4b80: 64 20 70 4e 61 6d 65 32 20 22 79 79 79 22 2e 20  d pName2 "yyy". 
4b90: 4f 6e 20 74 68 65 20 6f 74 68 65 72 20 68 61 6e  On the other han
4ba0: 64 20 69 66 0a 2a 2a 20 74 68 65 20 74 61 62 6c  d if.** the tabl
4bb0: 65 20 6e 61 6d 65 20 69 73 20 6e 6f 74 20 66 75  e name is not fu
4bc0: 6c 6c 79 20 71 75 61 6c 69 66 69 65 64 2c 20 69  lly qualified, i
4bd0: 2e 65 2e 3a 0a 2a 2a 0a 2a 2a 20 43 52 45 41 54  .e.:.**.** CREAT
4be0: 45 20 54 41 42 4c 45 20 79 79 79 28 2e 2e 2e 29  E TABLE yyy(...)
4bf0: 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 70 4e 61  ;.**.** Then pNa
4c00: 6d 65 31 20 69 73 20 73 65 74 20 74 6f 20 22 79  me1 is set to "y
4c10: 79 79 22 20 61 6e 64 20 70 4e 61 6d 65 32 20 69  yy" and pName2 i
4c20: 73 20 22 22 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  s ""..**.** This
4c30: 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20 74 68   routine sets th
4c40: 65 20 2a 70 70 55 6e 71 75 61 6c 20 70 6f 69 6e  e *ppUnqual poin
4c50: 74 65 72 20 74 6f 20 70 6f 69 6e 74 20 61 74 20  ter to point at 
4c60: 74 68 65 20 74 6f 6b 65 6e 20 28 70 4e 61 6d 65  the token (pName
4c70: 31 20 6f 72 0a 2a 2a 20 70 4e 61 6d 65 32 29 20  1 or.** pName2) 
4c80: 74 68 61 74 20 73 74 6f 72 65 73 20 74 68 65 20  that stores the 
4c90: 75 6e 71 75 61 6c 69 66 69 65 64 20 74 61 62 6c  unqualified tabl
4ca0: 65 20 6e 61 6d 65 2e 20 20 54 68 65 20 69 6e 64  e name.  The ind
4cb0: 65 78 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74  ex of the.** dat
4cc0: 61 62 61 73 65 20 22 78 78 78 22 20 69 73 20 72  abase "xxx" is r
4cd0: 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20  eturned..*/.int 
4ce0: 73 71 6c 69 74 65 33 54 77 6f 50 61 72 74 4e 61  sqlite3TwoPartNa
4cf0: 6d 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  me(.  Parse *pPa
4d00: 72 73 65 2c 20 20 20 20 20 20 2f 2a 20 50 61 72  rse,      /* Par
4d10: 73 69 6e 67 20 61 6e 64 20 63 6f 64 65 20 67 65  sing and code ge
4d20: 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74  nerating context
4d30: 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61   */.  Token *pNa
4d40: 6d 65 31 2c 20 20 20 20 20 20 2f 2a 20 54 68 65  me1,      /* The
4d50: 20 22 78 78 78 22 20 69 6e 20 74 68 65 20 6e 61   "xxx" in the na
4d60: 6d 65 20 22 78 78 78 2e 79 79 79 22 20 6f 72 20  me "xxx.yyy" or 
4d70: 22 78 78 78 22 20 2a 2f 0a 20 20 54 6f 6b 65 6e  "xxx" */.  Token
4d80: 20 2a 70 4e 61 6d 65 32 2c 20 20 20 20 20 20 2f   *pName2,      /
4d90: 2a 20 54 68 65 20 22 79 79 79 22 20 69 6e 20 74  * The "yyy" in t
4da0: 68 65 20 6e 61 6d 65 20 22 78 78 78 2e 79 79 79  he name "xxx.yyy
4db0: 22 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 2a 70  " */.  Token **p
4dc0: 55 6e 71 75 61 6c 20 20 20 20 20 2f 2a 20 57 72  Unqual     /* Wr
4dd0: 69 74 65 20 74 68 65 20 75 6e 71 75 61 6c 69 66  ite the unqualif
4de0: 69 65 64 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20  ied object name 
4df0: 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  here */.){.  int
4e00: 20 69 44 62 3b 20 20 20 20 20 20 20 20 20 20 20   iDb;           
4e10: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
4e20: 62 61 73 65 20 68 6f 6c 64 69 6e 67 20 74 68 65  base holding the
4e30: 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 73 71 6c   object */.  sql
4e40: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
4e50: 65 2d 3e 64 62 3b 0a 0a 20 20 69 66 28 20 70 4e  e->db;..  if( pN
4e60: 61 6d 65 32 20 26 26 20 70 4e 61 6d 65 32 2d 3e  ame2 && pName2->
4e70: 6e 3e 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72  n>0 ){.    asser
4e80: 74 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73  t( !db->init.bus
4e90: 79 20 29 3b 0a 20 20 20 20 2a 70 55 6e 71 75 61  y );.    *pUnqua
4ea0: 6c 20 3d 20 70 4e 61 6d 65 32 3b 0a 20 20 20 20  l = pName2;.    
4eb0: 69 44 62 20 3d 20 73 71 6c 69 74 65 33 46 69 6e  iDb = sqlite3Fin
4ec0: 64 44 62 28 64 62 2c 20 70 4e 61 6d 65 31 29 3b  dDb(db, pName1);
4ed0: 0a 20 20 20 20 69 66 28 20 69 44 62 3c 30 20 29  .    if( iDb<0 )
4ee0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
4ef0: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
4f00: 22 75 6e 6b 6e 6f 77 6e 20 64 61 74 61 62 61 73  "unknown databas
4f10: 65 20 25 54 22 2c 20 70 4e 61 6d 65 31 29 3b 0a  e %T", pName1);.
4f20: 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45        pParse->nE
4f30: 72 72 2b 2b 3b 0a 20 20 20 20 20 20 72 65 74 75  rr++;.      retu
4f40: 72 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  rn -1;.    }.  }
4f50: 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74  else{.    assert
4f60: 28 20 64 62 2d 3e 69 6e 69 74 2e 69 44 62 3d 3d  ( db->init.iDb==
4f70: 30 20 7c 7c 20 64 62 2d 3e 69 6e 69 74 2e 62 75  0 || db->init.bu
4f80: 73 79 20 29 3b 0a 20 20 20 20 69 44 62 20 3d 20  sy );.    iDb = 
4f90: 64 62 2d 3e 69 6e 69 74 2e 69 44 62 3b 0a 20 20  db->init.iDb;.  
4fa0: 20 20 2a 70 55 6e 71 75 61 6c 20 3d 20 70 4e 61    *pUnqual = pNa
4fb0: 6d 65 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  me1;.  }.  retur
4fc0: 6e 20 69 44 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  n iDb;.}../*.** 
4fd0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
4fe0: 75 73 65 64 20 74 6f 20 63 68 65 63 6b 20 69 66  used to check if
4ff0: 20 74 68 65 20 55 54 46 2d 38 20 73 74 72 69 6e   the UTF-8 strin
5000: 67 20 7a 4e 61 6d 65 20 69 73 20 61 20 6c 65 67  g zName is a leg
5010: 61 6c 0a 2a 2a 20 75 6e 71 75 61 6c 69 66 69 65  al.** unqualifie
5020: 64 20 6e 61 6d 65 20 66 6f 72 20 61 20 6e 65 77  d name for a new
5030: 20 73 63 68 65 6d 61 20 6f 62 6a 65 63 74 20 28   schema object (
5040: 74 61 62 6c 65 2c 20 69 6e 64 65 78 2c 20 76 69  table, index, vi
5050: 65 77 20 6f 72 0a 2a 2a 20 74 72 69 67 67 65 72  ew or.** trigger
5060: 29 2e 20 41 6c 6c 20 6e 61 6d 65 73 20 61 72 65  ). All names are
5070: 20 6c 65 67 61 6c 20 65 78 63 65 70 74 20 74 68   legal except th
5080: 6f 73 65 20 74 68 61 74 20 62 65 67 69 6e 20 77  ose that begin w
5090: 69 74 68 20 74 68 65 20 73 74 72 69 6e 67 0a 2a  ith the string.*
50a0: 2a 20 22 73 71 6c 69 74 65 5f 22 20 28 69 6e 20  * "sqlite_" (in 
50b0: 75 70 70 65 72 2c 20 6c 6f 77 65 72 20 6f 72 20  upper, lower or 
50c0: 6d 69 78 65 64 20 63 61 73 65 29 2e 20 54 68 69  mixed case). Thi
50d0: 73 20 70 6f 72 74 69 6f 6e 20 6f 66 20 74 68 65  s portion of the
50e0: 20 6e 61 6d 65 73 70 61 63 65 0a 2a 2a 20 69 73   namespace.** is
50f0: 20 72 65 73 65 72 76 65 64 20 66 6f 72 20 69 6e   reserved for in
5100: 74 65 72 6e 61 6c 20 75 73 65 2e 0a 2a 2f 0a 69  ternal use..*/.i
5110: 6e 74 20 73 71 6c 69 74 65 33 43 68 65 63 6b 4f  nt sqlite3CheckO
5120: 62 6a 65 63 74 4e 61 6d 65 28 50 61 72 73 65 20  bjectName(Parse 
5130: 2a 70 50 61 72 73 65 2c 20 63 6f 6e 73 74 20 63  *pParse, const c
5140: 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69  har *zName){.  i
5150: 66 28 20 21 70 50 61 72 73 65 2d 3e 64 62 2d 3e  f( !pParse->db->
5160: 69 6e 69 74 2e 62 75 73 79 20 26 26 20 70 50 61  init.busy && pPa
5170: 72 73 65 2d 3e 6e 65 73 74 65 64 3d 3d 30 20 0a  rse->nested==0 .
5180: 20 20 20 20 20 20 20 20 20 20 26 26 20 28 70 50            && (pP
5190: 61 72 73 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20  arse->db->flags 
51a0: 26 20 53 51 4c 49 54 45 5f 57 72 69 74 65 53 63  & SQLITE_WriteSc
51b0: 68 65 6d 61 29 3d 3d 30 0a 20 20 20 20 20 20 20  hema)==0.       
51c0: 20 20 20 26 26 20 30 3d 3d 73 71 6c 69 74 65 33     && 0==sqlite3
51d0: 53 74 72 4e 49 43 6d 70 28 7a 4e 61 6d 65 2c 20  StrNICmp(zName, 
51e0: 22 73 71 6c 69 74 65 5f 22 2c 20 37 29 20 29 7b  "sqlite_", 7) ){
51f0: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
5200: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6f 62  rMsg(pParse, "ob
5210: 6a 65 63 74 20 6e 61 6d 65 20 72 65 73 65 72 76  ject name reserv
5220: 65 64 20 66 6f 72 20 69 6e 74 65 72 6e 61 6c 20  ed for internal 
5230: 75 73 65 3a 20 25 73 22 2c 20 7a 4e 61 6d 65 29  use: %s", zName)
5240: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
5250: 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  ITE_ERROR;.  }. 
5260: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
5270: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65 67 69  K;.}../*.** Begi
5280: 6e 20 63 6f 6e 73 74 72 75 63 74 69 6e 67 20 61  n constructing a
5290: 20 6e 65 77 20 74 61 62 6c 65 20 72 65 70 72 65   new table repre
52a0: 73 65 6e 74 61 74 69 6f 6e 20 69 6e 20 6d 65 6d  sentation in mem
52b0: 6f 72 79 2e 20 20 54 68 69 73 20 69 73 0a 2a 2a  ory.  This is.**
52c0: 20 74 68 65 20 66 69 72 73 74 20 6f 66 20 73 65   the first of se
52d0: 76 65 72 61 6c 20 61 63 74 69 6f 6e 20 72 6f 75  veral action rou
52e0: 74 69 6e 65 73 20 74 68 61 74 20 67 65 74 20 63  tines that get c
52f0: 61 6c 6c 65 64 20 69 6e 20 72 65 73 70 6f 6e 73  alled in respons
5300: 65 0a 2a 2a 20 74 6f 20 61 20 43 52 45 41 54 45  e.** to a CREATE
5310: 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74   TABLE statement
5320: 2e 20 20 49 6e 20 70 61 72 74 69 63 75 6c 61 72  .  In particular
5330: 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  , this routine i
5340: 73 20 63 61 6c 6c 65 64 0a 2a 2a 20 61 66 74 65  s called.** afte
5350: 72 20 73 65 65 69 6e 67 20 74 6f 6b 65 6e 73 20  r seeing tokens 
5360: 22 43 52 45 41 54 45 22 20 61 6e 64 20 22 54 41  "CREATE" and "TA
5370: 42 4c 45 22 20 61 6e 64 20 74 68 65 20 74 61 62  BLE" and the tab
5380: 6c 65 20 6e 61 6d 65 2e 20 54 68 65 20 69 73 54  le name. The isT
5390: 65 6d 70 0a 2a 2a 20 66 6c 61 67 20 69 73 20 74  emp.** flag is t
53a0: 72 75 65 20 69 66 20 74 68 65 20 74 61 62 6c 65  rue if the table
53b0: 20 73 68 6f 75 6c 64 20 62 65 20 73 74 6f 72 65   should be store
53c0: 64 20 69 6e 20 74 68 65 20 61 75 78 69 6c 69 61  d in the auxilia
53d0: 72 79 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 66  ry database.** f
53e0: 69 6c 65 20 69 6e 73 74 65 61 64 20 6f 66 20 69  ile instead of i
53f0: 6e 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62  n the main datab
5400: 61 73 65 20 66 69 6c 65 2e 20 20 54 68 69 73 20  ase file.  This 
5410: 69 73 20 6e 6f 72 6d 61 6c 6c 79 20 74 68 65 20  is normally the 
5420: 63 61 73 65 0a 2a 2a 20 77 68 65 6e 20 74 68 65  case.** when the
5430: 20 22 54 45 4d 50 22 20 6f 72 20 22 54 45 4d 50   "TEMP" or "TEMP
5440: 4f 52 41 52 59 22 20 6b 65 79 77 6f 72 64 20 6f  ORARY" keyword o
5450: 63 63 75 72 73 20 69 6e 20 62 65 74 77 65 65 6e  ccurs in between
5460: 0a 2a 2a 20 43 52 45 41 54 45 20 61 6e 64 20 54  .** CREATE and T
5470: 41 42 4c 45 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ABLE..**.** The 
5480: 6e 65 77 20 74 61 62 6c 65 20 72 65 63 6f 72 64  new table record
5490: 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20   is initialized 
54a0: 61 6e 64 20 70 75 74 20 69 6e 20 70 50 61 72 73  and put in pPars
54b0: 65 2d 3e 70 4e 65 77 54 61 62 6c 65 2e 0a 2a 2a  e->pNewTable..**
54c0: 20 41 73 20 6d 6f 72 65 20 6f 66 20 74 68 65 20   As more of the 
54d0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61  CREATE TABLE sta
54e0: 74 65 6d 65 6e 74 20 69 73 20 70 61 72 73 65 64  tement is parsed
54f0: 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20 61 63 74  , additional act
5500: 69 6f 6e 0a 2a 2a 20 72 6f 75 74 69 6e 65 73 20  ion.** routines 
5510: 77 69 6c 6c 20 62 65 20 63 61 6c 6c 65 64 20 74  will be called t
5520: 6f 20 61 64 64 20 6d 6f 72 65 20 69 6e 66 6f 72  o add more infor
5530: 6d 61 74 69 6f 6e 20 74 6f 20 74 68 69 73 20 72  mation to this r
5540: 65 63 6f 72 64 2e 0a 2a 2a 20 41 74 20 74 68 65  ecord..** At the
5550: 20 65 6e 64 20 6f 66 20 74 68 65 20 43 52 45 41   end of the CREA
5560: 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65  TE TABLE stateme
5570: 6e 74 2c 20 74 68 65 20 73 71 6c 69 74 65 33 45  nt, the sqlite3E
5580: 6e 64 54 61 62 6c 65 28 29 20 72 6f 75 74 69 6e  ndTable() routin
5590: 65 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64 20 74  e.** is called t
55a0: 6f 20 63 6f 6d 70 6c 65 74 65 20 74 68 65 20 63  o complete the c
55b0: 6f 6e 73 74 72 75 63 74 69 6f 6e 20 6f 66 20 74  onstruction of t
55c0: 68 65 20 6e 65 77 20 74 61 62 6c 65 20 72 65 63  he new table rec
55d0: 6f 72 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ord..*/.void sql
55e0: 69 74 65 33 53 74 61 72 74 54 61 62 6c 65 28 0a  ite3StartTable(.
55f0: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
5600: 20 20 20 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e     /* Parser con
5610: 74 65 78 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  text */.  Token 
5620: 2a 70 4e 61 6d 65 31 2c 20 20 20 2f 2a 20 46 69  *pName1,   /* Fi
5630: 72 73 74 20 70 61 72 74 20 6f 66 20 74 68 65 20  rst part of the 
5640: 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c  name of the tabl
5650: 65 20 6f 72 20 76 69 65 77 20 2a 2f 0a 20 20 54  e or view */.  T
5660: 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32 2c 20 20 20  oken *pName2,   
5670: 2f 2a 20 53 65 63 6f 6e 64 20 70 61 72 74 20 6f  /* Second part o
5680: 66 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  f the name of th
5690: 65 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77 20  e table or view 
56a0: 2a 2f 0a 20 20 69 6e 74 20 69 73 54 65 6d 70 2c  */.  int isTemp,
56b0: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
56c0: 20 74 68 69 73 20 69 73 20 61 20 54 45 4d 50 20   this is a TEMP 
56d0: 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69  table */.  int i
56e0: 73 56 69 65 77 2c 20 20 20 20 20 20 2f 2a 20 54  sView,      /* T
56f0: 72 75 65 20 69 66 20 74 68 69 73 20 69 73 20 61  rue if this is a
5700: 20 56 49 45 57 20 2a 2f 0a 20 20 69 6e 74 20 69   VIEW */.  int i
5710: 73 56 69 72 74 75 61 6c 2c 20 20 20 2f 2a 20 54  sVirtual,   /* T
5720: 72 75 65 20 69 66 20 74 68 69 73 20 69 73 20 61  rue if this is a
5730: 20 56 49 52 54 55 41 4c 20 74 61 62 6c 65 20 2a   VIRTUAL table *
5740: 2f 0a 20 20 69 6e 74 20 6e 6f 45 72 72 20 20 20  /.  int noErr   
5750: 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 68 69       /* Do nothi
5760: 6e 67 20 69 66 20 74 61 62 6c 65 20 61 6c 72 65  ng if table alre
5770: 61 64 79 20 65 78 69 73 74 73 20 2a 2f 0a 29 7b  ady exists */.){
5780: 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 6c 65  .  Table *pTable
5790: 3b 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20  ;.  char *zName 
57a0: 3d 20 30 3b 20 2f 2a 20 54 68 65 20 6e 61 6d 65  = 0; /* The name
57b0: 20 6f 66 20 74 68 65 20 6e 65 77 20 74 61 62 6c   of the new tabl
57c0: 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a  e */.  sqlite3 *
57d0: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
57e0: 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 69 6e  .  Vdbe *v;.  in
57f0: 74 20 69 44 62 3b 20 20 20 20 20 20 20 20 20 2f  t iDb;         /
5800: 2a 20 44 61 74 61 62 61 73 65 20 6e 75 6d 62 65  * Database numbe
5810: 72 20 74 6f 20 63 72 65 61 74 65 20 74 68 65 20  r to create the 
5820: 74 61 62 6c 65 20 69 6e 20 2a 2f 0a 20 20 54 6f  table in */.  To
5830: 6b 65 6e 20 2a 70 4e 61 6d 65 3b 20 20 20 20 2f  ken *pName;    /
5840: 2a 20 55 6e 71 75 61 6c 69 66 69 65 64 20 6e 61  * Unqualified na
5850: 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  me of the table 
5860: 74 6f 20 63 72 65 61 74 65 20 2a 2f 0a 0a 20 20  to create */..  
5870: 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 6f 72 20  /* The table or 
5880: 76 69 65 77 20 6e 61 6d 65 20 74 6f 20 63 72 65  view name to cre
5890: 61 74 65 20 69 73 20 70 61 73 73 65 64 20 74 6f  ate is passed to
58a0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 76 69   this routine vi
58b0: 61 20 74 6f 6b 65 6e 73 0a 20 20 2a 2a 20 70 4e  a tokens.  ** pN
58c0: 61 6d 65 31 20 61 6e 64 20 70 4e 61 6d 65 32 2e  ame1 and pName2.
58d0: 20 49 66 20 74 68 65 20 74 61 62 6c 65 20 6e 61   If the table na
58e0: 6d 65 20 77 61 73 20 66 75 6c 6c 79 20 71 75 61  me was fully qua
58f0: 6c 69 66 69 65 64 2c 20 66 6f 72 20 65 78 61 6d  lified, for exam
5900: 70 6c 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43  ple:.  **.  ** C
5910: 52 45 41 54 45 20 54 41 42 4c 45 20 78 78 78 2e  REATE TABLE xxx.
5920: 79 79 79 20 28 2e 2e 2e 29 3b 0a 20 20 2a 2a 20  yyy (...);.  ** 
5930: 0a 20 20 2a 2a 20 54 68 65 6e 20 70 4e 61 6d 65  .  ** Then pName
5940: 31 20 69 73 20 73 65 74 20 74 6f 20 22 78 78 78  1 is set to "xxx
5950: 22 20 61 6e 64 20 70 4e 61 6d 65 32 20 22 79 79  " and pName2 "yy
5960: 79 22 2e 20 4f 6e 20 74 68 65 20 6f 74 68 65 72  y". On the other
5970: 20 68 61 6e 64 20 69 66 0a 20 20 2a 2a 20 74 68   hand if.  ** th
5980: 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 69 73 20  e table name is 
5990: 6e 6f 74 20 66 75 6c 6c 79 20 71 75 61 6c 69 66  not fully qualif
59a0: 69 65 64 2c 20 69 2e 65 2e 3a 0a 20 20 2a 2a 0a  ied, i.e.:.  **.
59b0: 20 20 2a 2a 20 43 52 45 41 54 45 20 54 41 42 4c    ** CREATE TABL
59c0: 45 20 79 79 79 28 2e 2e 2e 29 3b 0a 20 20 2a 2a  E yyy(...);.  **
59d0: 0a 20 20 2a 2a 20 54 68 65 6e 20 70 4e 61 6d 65  .  ** Then pName
59e0: 31 20 69 73 20 73 65 74 20 74 6f 20 22 79 79 79  1 is set to "yyy
59f0: 22 20 61 6e 64 20 70 4e 61 6d 65 32 20 69 73 20  " and pName2 is 
5a00: 22 22 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  ""..  **.  ** Th
5a10: 65 20 63 61 6c 6c 20 62 65 6c 6f 77 20 73 65 74  e call below set
5a20: 73 20 74 68 65 20 70 4e 61 6d 65 20 70 6f 69 6e  s the pName poin
5a30: 74 65 72 20 74 6f 20 70 6f 69 6e 74 20 61 74 20  ter to point at 
5a40: 74 68 65 20 74 6f 6b 65 6e 20 28 70 4e 61 6d 65  the token (pName
5a50: 31 20 6f 72 0a 20 20 2a 2a 20 70 4e 61 6d 65 32  1 or.  ** pName2
5a60: 29 20 74 68 61 74 20 73 74 6f 72 65 73 20 74 68  ) that stores th
5a70: 65 20 75 6e 71 75 61 6c 69 66 69 65 64 20 74 61  e unqualified ta
5a80: 62 6c 65 20 6e 61 6d 65 2e 20 54 68 65 20 76 61  ble name. The va
5a90: 72 69 61 62 6c 65 20 69 44 62 20 69 73 0a 20 20  riable iDb is.  
5aa0: 2a 2a 20 73 65 74 20 74 6f 20 74 68 65 20 69 6e  ** set to the in
5ab0: 64 65 78 20 6f 66 20 74 68 65 20 64 61 74 61 62  dex of the datab
5ac0: 61 73 65 20 74 68 61 74 20 74 68 65 20 74 61 62  ase that the tab
5ad0: 6c 65 20 6f 72 20 76 69 65 77 20 69 73 20 74 6f  le or view is to
5ae0: 20 62 65 0a 20 20 2a 2a 20 63 72 65 61 74 65 64   be.  ** created
5af0: 20 69 6e 2e 0a 20 20 2a 2f 0a 20 20 69 44 62 20   in..  */.  iDb 
5b00: 3d 20 73 71 6c 69 74 65 33 54 77 6f 50 61 72 74  = sqlite3TwoPart
5b10: 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 70 4e 61  Name(pParse, pNa
5b20: 6d 65 31 2c 20 70 4e 61 6d 65 32 2c 20 26 70 4e  me1, pName2, &pN
5b30: 61 6d 65 29 3b 0a 20 20 69 66 28 20 69 44 62 3c  ame);.  if( iDb<
5b40: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66  0 ) return;.  if
5b50: 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26  ( !OMIT_TEMPDB &
5b60: 26 20 69 73 54 65 6d 70 20 26 26 20 69 44 62 3e  & isTemp && iDb>
5b70: 31 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 63  1 ){.    /* If c
5b80: 72 65 61 74 69 6e 67 20 61 20 74 65 6d 70 20 74  reating a temp t
5b90: 61 62 6c 65 2c 20 74 68 65 20 6e 61 6d 65 20 6d  able, the name m
5ba0: 61 79 20 6e 6f 74 20 62 65 20 71 75 61 6c 69 66  ay not be qualif
5bb0: 69 65 64 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74  ied */.    sqlit
5bc0: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
5bd0: 65 2c 20 22 74 65 6d 70 6f 72 61 72 79 20 74 61  e, "temporary ta
5be0: 62 6c 65 20 6e 61 6d 65 20 6d 75 73 74 20 62 65  ble name must be
5bf0: 20 75 6e 71 75 61 6c 69 66 69 65 64 22 29 3b 0a   unqualified");.
5c00: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
5c10: 20 20 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50    if( !OMIT_TEMP
5c20: 44 42 20 26 26 20 69 73 54 65 6d 70 20 29 20 69  DB && isTemp ) i
5c30: 44 62 20 3d 20 31 3b 0a 0a 20 20 70 50 61 72 73  Db = 1;..  pPars
5c40: 65 2d 3e 73 4e 61 6d 65 54 6f 6b 65 6e 20 3d 20  e->sNameToken = 
5c50: 2a 70 4e 61 6d 65 3b 0a 20 20 7a 4e 61 6d 65 20  *pName;.  zName 
5c60: 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f  = sqlite3NameFro
5c70: 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 4e 61 6d 65  mToken(db, pName
5c80: 29 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d  );.  if( zName==
5c90: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66  0 ) return;.  if
5ca0: 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c  ( SQLITE_OK!=sql
5cb0: 69 74 65 33 43 68 65 63 6b 4f 62 6a 65 63 74 4e  ite3CheckObjectN
5cc0: 61 6d 65 28 70 50 61 72 73 65 2c 20 7a 4e 61 6d  ame(pParse, zNam
5cd0: 65 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 62  e) ){.    goto b
5ce0: 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72  egin_table_error
5cf0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 64 62 2d 3e  ;.  }.  if( db->
5d00: 69 6e 69 74 2e 69 44 62 3d 3d 31 20 29 20 69 73  init.iDb==1 ) is
5d10: 54 65 6d 70 20 3d 20 31 3b 0a 23 69 66 6e 64 65  Temp = 1;.#ifnde
5d20: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
5d30: 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 61 73  THORIZATION.  as
5d40: 73 65 72 74 28 20 28 69 73 54 65 6d 70 20 26 20  sert( (isTemp & 
5d50: 31 29 3d 3d 69 73 54 65 6d 70 20 29 3b 0a 20 20  1)==isTemp );.  
5d60: 7b 0a 20 20 20 20 69 6e 74 20 63 6f 64 65 3b 0a  {.    int code;.
5d70: 20 20 20 20 63 68 61 72 20 2a 7a 44 62 20 3d 20      char *zDb = 
5d80: 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61  db->aDb[iDb].zNa
5d90: 6d 65 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69  me;.    if( sqli
5da0: 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61  te3AuthCheck(pPa
5db0: 72 73 65 2c 20 53 51 4c 49 54 45 5f 49 4e 53 45  rse, SQLITE_INSE
5dc0: 52 54 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c 45  RT, SCHEMA_TABLE
5dd0: 28 69 73 54 65 6d 70 29 2c 20 30 2c 20 7a 44 62  (isTemp), 0, zDb
5de0: 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  ) ){.      goto 
5df0: 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f  begin_table_erro
5e00: 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  r;.    }.    if(
5e10: 20 69 73 56 69 65 77 20 29 7b 0a 20 20 20 20 20   isView ){.     
5e20: 20 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44   if( !OMIT_TEMPD
5e30: 42 20 26 26 20 69 73 54 65 6d 70 20 29 7b 0a 20  B && isTemp ){. 
5e40: 20 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51         code = SQ
5e50: 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 45 4d 50  LITE_CREATE_TEMP
5e60: 5f 56 49 45 57 3b 0a 20 20 20 20 20 20 7d 65 6c  _VIEW;.      }el
5e70: 73 65 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65  se{.        code
5e80: 20 3d 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45   = SQLITE_CREATE
5e90: 5f 56 49 45 57 3b 0a 20 20 20 20 20 20 7d 0a 20  _VIEW;.      }. 
5ea0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
5eb0: 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42  if( !OMIT_TEMPDB
5ec0: 20 26 26 20 69 73 54 65 6d 70 20 29 7b 0a 20 20   && isTemp ){.  
5ed0: 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c        code = SQL
5ee0: 49 54 45 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f  ITE_CREATE_TEMP_
5ef0: 54 41 42 4c 45 3b 0a 20 20 20 20 20 20 7d 65 6c  TABLE;.      }el
5f00: 73 65 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65  se{.        code
5f10: 20 3d 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45   = SQLITE_CREATE
5f20: 5f 54 41 42 4c 45 3b 0a 20 20 20 20 20 20 7d 0a  _TABLE;.      }.
5f30: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21 69      }.    if( !i
5f40: 73 56 69 72 74 75 61 6c 20 26 26 20 73 71 6c 69  sVirtual && sqli
5f50: 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61  te3AuthCheck(pPa
5f60: 72 73 65 2c 20 63 6f 64 65 2c 20 7a 4e 61 6d 65  rse, code, zName
5f70: 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20  , 0, zDb) ){.   
5f80: 20 20 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61     goto begin_ta
5f90: 62 6c 65 5f 65 72 72 6f 72 3b 0a 20 20 20 20 7d  ble_error;.    }
5fa0: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  .  }.#endif..  /
5fb0: 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20  * Make sure the 
5fc0: 6e 65 77 20 74 61 62 6c 65 20 6e 61 6d 65 20 64  new table name d
5fd0: 6f 65 73 20 6e 6f 74 20 63 6f 6c 6c 69 64 65 20  oes not collide 
5fe0: 77 69 74 68 20 61 6e 20 65 78 69 73 74 69 6e 67  with an existing
5ff0: 0a 20 20 2a 2a 20 69 6e 64 65 78 20 6f 72 20 74  .  ** index or t
6000: 61 62 6c 65 20 6e 61 6d 65 20 69 6e 20 74 68 65  able name in the
6010: 20 73 61 6d 65 20 64 61 74 61 62 61 73 65 2e 20   same database. 
6020: 20 49 73 73 75 65 20 61 6e 20 65 72 72 6f 72 20   Issue an error 
6030: 6d 65 73 73 61 67 65 20 69 66 0a 20 20 2a 2a 20  message if.  ** 
6040: 69 74 20 64 6f 65 73 2e 20 54 68 65 20 65 78 63  it does. The exc
6050: 65 70 74 69 6f 6e 20 69 73 20 69 66 20 74 68 65  eption is if the
6060: 20 73 74 61 74 65 6d 65 6e 74 20 62 65 69 6e 67   statement being
6070: 20 70 61 72 73 65 64 20 77 61 73 20 70 61 73 73   parsed was pass
6080: 65 64 0a 20 20 2a 2a 20 74 6f 20 61 6e 20 73 71  ed.  ** to an sq
6090: 6c 69 74 65 33 5f 64 65 63 6c 61 72 65 5f 76 74  lite3_declare_vt
60a0: 61 62 28 29 20 63 61 6c 6c 2e 20 49 6e 20 74 68  ab() call. In th
60b0: 61 74 20 63 61 73 65 20 6f 6e 6c 79 20 74 68 65  at case only the
60c0: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 0a 20 20   column names.  
60d0: 2a 2a 20 61 6e 64 20 74 79 70 65 73 20 77 69 6c  ** and types wil
60e0: 6c 20 62 65 20 75 73 65 64 2c 20 73 6f 20 74 68  l be used, so th
60f0: 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 20 74  ere is no need t
6100: 6f 20 74 65 73 74 20 66 6f 72 20 6e 61 6d 65 73  o test for names
6110: 70 61 63 65 0a 20 20 2a 2a 20 63 6f 6c 6c 69 73  pace.  ** collis
6120: 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ions..  */.  if(
6130: 20 21 49 4e 5f 44 45 43 4c 41 52 45 5f 56 54 41   !IN_DECLARE_VTA
6140: 42 20 29 7b 0a 20 20 20 20 69 66 28 20 53 51 4c  B ){.    if( SQL
6150: 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52  ITE_OK!=sqlite3R
6160: 65 61 64 53 63 68 65 6d 61 28 70 50 61 72 73 65  eadSchema(pParse
6170: 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  ) ){.      goto 
6180: 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f  begin_table_erro
6190: 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 54 61  r;.    }.    pTa
61a0: 62 6c 65 20 3d 20 73 71 6c 69 74 65 33 46 69 6e  ble = sqlite3Fin
61b0: 64 54 61 62 6c 65 28 64 62 2c 20 7a 4e 61 6d 65  dTable(db, zName
61c0: 2c 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a  , db->aDb[iDb].z
61d0: 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 70  Name);.    if( p
61e0: 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 69  Table ){.      i
61f0: 66 28 20 21 6e 6f 45 72 72 20 29 7b 0a 20 20 20  f( !noErr ){.   
6200: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
6210: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 61  rMsg(pParse, "ta
6220: 62 6c 65 20 25 54 20 61 6c 72 65 61 64 79 20 65  ble %T already e
6230: 78 69 73 74 73 22 2c 20 70 4e 61 6d 65 29 3b 0a  xists", pName);.
6240: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 67 6f        }.      go
6250: 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65  to begin_table_e
6260: 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rror;.    }.    
6270: 69 66 28 20 73 71 6c 69 74 65 33 46 69 6e 64 49  if( sqlite3FindI
6280: 6e 64 65 78 28 64 62 2c 20 7a 4e 61 6d 65 2c 20  ndex(db, zName, 
6290: 30 29 21 3d 30 20 26 26 20 28 69 44 62 3d 3d 30  0)!=0 && (iDb==0
62a0: 20 7c 7c 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75   || !db->init.bu
62b0: 73 79 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  sy) ){.      sql
62c0: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
62d0: 72 73 65 2c 20 22 74 68 65 72 65 20 69 73 20 61  rse, "there is a
62e0: 6c 72 65 61 64 79 20 61 6e 20 69 6e 64 65 78 20  lready an index 
62f0: 6e 61 6d 65 64 20 25 73 22 2c 20 7a 4e 61 6d 65  named %s", zName
6300: 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 62 65  );.      goto be
6310: 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b  gin_table_error;
6320: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 54  .    }.  }..  pT
6330: 61 62 6c 65 20 3d 20 73 71 6c 69 74 65 33 44 62  able = sqlite3Db
6340: 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73  MallocZero(db, s
6350: 69 7a 65 6f 66 28 54 61 62 6c 65 29 29 3b 0a 20  izeof(Table));. 
6360: 20 69 66 28 20 70 54 61 62 6c 65 3d 3d 30 20 29   if( pTable==0 )
6370: 7b 0a 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63  {.    db->malloc
6380: 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20  Failed = 1;.    
6390: 70 50 61 72 73 65 2d 3e 72 63 20 3d 20 53 51 4c  pParse->rc = SQL
63a0: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 70  ITE_NOMEM;.    p
63b0: 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20  Parse->nErr++;. 
63c0: 20 20 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61     goto begin_ta
63d0: 62 6c 65 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 20  ble_error;.  }. 
63e0: 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 20 3d   pTable->zName =
63f0: 20 7a 4e 61 6d 65 3b 0a 20 20 70 54 61 62 6c 65   zName;.  pTable
6400: 2d 3e 69 50 4b 65 79 20 3d 20 2d 31 3b 0a 20 20  ->iPKey = -1;.  
6410: 70 54 61 62 6c 65 2d 3e 70 53 63 68 65 6d 61 20  pTable->pSchema 
6420: 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70  = db->aDb[iDb].p
6430: 53 63 68 65 6d 61 3b 0a 20 20 70 54 61 62 6c 65  Schema;.  pTable
6440: 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20 69 66  ->nRef = 1;.  if
6450: 28 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  ( pParse->pNewTa
6460: 62 6c 65 20 29 20 73 71 6c 69 74 65 33 44 65 6c  ble ) sqlite3Del
6470: 65 74 65 54 61 62 6c 65 28 70 50 61 72 73 65 2d  eteTable(pParse-
6480: 3e 70 4e 65 77 54 61 62 6c 65 29 3b 0a 20 20 70  >pNewTable);.  p
6490: 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
64a0: 20 3d 20 70 54 61 62 6c 65 3b 0a 0a 20 20 2f 2a   = pTable;..  /*
64b0: 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20   If this is the 
64c0: 6d 61 67 69 63 20 73 71 6c 69 74 65 5f 73 65 71  magic sqlite_seq
64d0: 75 65 6e 63 65 20 74 61 62 6c 65 20 75 73 65 64  uence table used
64e0: 20 62 79 20 61 75 74 6f 69 6e 63 72 65 6d 65 6e   by autoincremen
64f0: 74 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 72 65 63  t,.  ** then rec
6500: 6f 72 64 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  ord a pointer to
6510: 20 74 68 69 73 20 74 61 62 6c 65 20 69 6e 20 74   this table in t
6520: 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65  he main database
6530: 20 73 74 72 75 63 74 75 72 65 0a 20 20 2a 2a 20   structure.  ** 
6540: 73 6f 20 74 68 61 74 20 49 4e 53 45 52 54 20 63  so that INSERT c
6550: 61 6e 20 66 69 6e 64 20 74 68 65 20 74 61 62 6c  an find the tabl
6560: 65 20 65 61 73 69 6c 79 2e 0a 20 20 2a 2f 0a 23  e easily..  */.#
6570: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
6580: 49 54 5f 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54  IT_AUTOINCREMENT
6590: 0a 20 20 69 66 28 20 21 70 50 61 72 73 65 2d 3e  .  if( !pParse->
65a0: 6e 65 73 74 65 64 20 26 26 20 73 74 72 63 6d 70  nested && strcmp
65b0: 28 7a 4e 61 6d 65 2c 20 22 73 71 6c 69 74 65 5f  (zName, "sqlite_
65c0: 73 65 71 75 65 6e 63 65 22 29 3d 3d 30 20 29 7b  sequence")==0 ){
65d0: 0a 20 20 20 20 70 54 61 62 6c 65 2d 3e 70 53 63  .    pTable->pSc
65e0: 68 65 6d 61 2d 3e 70 53 65 71 54 61 62 20 3d 20  hema->pSeqTab = 
65f0: 70 54 61 62 6c 65 3b 0a 20 20 7d 0a 23 65 6e 64  pTable;.  }.#end
6600: 69 66 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20 67  if..  /* Begin g
6610: 65 6e 65 72 61 74 69 6e 67 20 74 68 65 20 63 6f  enerating the co
6620: 64 65 20 74 68 61 74 20 77 69 6c 6c 20 69 6e 73  de that will ins
6630: 65 72 74 20 74 68 65 20 74 61 62 6c 65 20 72 65  ert the table re
6640: 63 6f 72 64 20 69 6e 74 6f 0a 20 20 2a 2a 20 74  cord into.  ** t
6650: 68 65 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52  he SQLITE_MASTER
6660: 20 74 61 62 6c 65 2e 20 20 4e 6f 74 65 20 69 6e   table.  Note in
6670: 20 70 61 72 74 69 63 75 6c 61 72 20 74 68 61 74   particular that
6680: 20 77 65 20 6d 75 73 74 20 67 6f 20 61 68 65 61   we must go ahea
6690: 64 0a 20 20 2a 2a 20 61 6e 64 20 61 6c 6c 6f 63  d.  ** and alloc
66a0: 61 74 65 20 74 68 65 20 72 65 63 6f 72 64 20 6e  ate the record n
66b0: 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20 74 61  umber for the ta
66c0: 62 6c 65 20 65 6e 74 72 79 20 6e 6f 77 2e 20 20  ble entry now.  
66d0: 42 65 66 6f 72 65 20 61 6e 79 0a 20 20 2a 2a 20  Before any.  ** 
66e0: 50 52 49 4d 41 52 59 20 4b 45 59 20 6f 72 20 55  PRIMARY KEY or U
66f0: 4e 49 51 55 45 20 6b 65 79 77 6f 72 64 73 20 61  NIQUE keywords a
6700: 72 65 20 70 61 72 73 65 64 2e 20 20 54 68 6f 73  re parsed.  Thos
6710: 65 20 6b 65 79 77 6f 72 64 73 20 77 69 6c 6c 20  e keywords will 
6720: 63 61 75 73 65 0a 20 20 2a 2a 20 69 6e 64 69 63  cause.  ** indic
6730: 65 73 20 74 6f 20 62 65 20 63 72 65 61 74 65 64  es to be created
6740: 20 61 6e 64 20 74 68 65 20 74 61 62 6c 65 20 72   and the table r
6750: 65 63 6f 72 64 20 6d 75 73 74 20 63 6f 6d 65 20  ecord must come 
6760: 62 65 66 6f 72 65 20 74 68 65 20 0a 20 20 2a 2a  before the .  **
6770: 20 69 6e 64 69 63 65 73 2e 20 20 48 65 6e 63 65   indices.  Hence
6780: 2c 20 74 68 65 20 72 65 63 6f 72 64 20 6e 75 6d  , the record num
6790: 62 65 72 20 66 6f 72 20 74 68 65 20 74 61 62 6c  ber for the tabl
67a0: 65 20 6d 75 73 74 20 62 65 20 61 6c 6c 6f 63 61  e must be alloca
67b0: 74 65 64 0a 20 20 2a 2a 20 6e 6f 77 2e 0a 20 20  ted.  ** now..  
67c0: 2a 2f 0a 20 20 69 66 28 20 21 64 62 2d 3e 69 6e  */.  if( !db->in
67d0: 69 74 2e 62 75 73 79 20 26 26 20 28 76 20 3d 20  it.busy && (v = 
67e0: 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
67f0: 50 61 72 73 65 29 29 21 3d 30 20 29 7b 0a 20 20  Parse))!=0 ){.  
6800: 20 20 69 6e 74 20 6a 31 3b 0a 20 20 20 20 69 6e    int j1;.    in
6810: 74 20 66 69 6c 65 46 6f 72 6d 61 74 3b 0a 20 20  t fileFormat;.  
6820: 20 20 69 6e 74 20 72 65 67 31 2c 20 72 65 67 32    int reg1, reg2
6830: 2c 20 72 65 67 33 3b 0a 20 20 20 20 73 71 6c 69  , reg3;.    sqli
6840: 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65  te3BeginWriteOpe
6850: 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 30  ration(pParse, 0
6860: 2c 20 69 44 62 29 3b 0a 0a 23 69 66 6e 64 65 66  , iDb);..#ifndef
6870: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
6880: 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 69 66  TUALTABLE.    if
6890: 28 20 69 73 56 69 72 74 75 61 6c 20 29 7b 0a 20  ( isVirtual ){. 
68a0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
68b0: 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 56 42 65  AddOp0(v, OP_VBe
68c0: 67 69 6e 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  gin);.    }.#end
68d0: 69 66 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  if..    /* If th
68e0: 65 20 66 69 6c 65 20 66 6f 72 6d 61 74 20 61 6e  e file format an
68f0: 64 20 65 6e 63 6f 64 69 6e 67 20 69 6e 20 74 68  d encoding in th
6900: 65 20 64 61 74 61 62 61 73 65 20 68 61 76 65 20  e database have 
6910: 6e 6f 74 20 62 65 65 6e 20 73 65 74 2c 20 0a 20  not been set, . 
6920: 20 20 20 2a 2a 20 73 65 74 20 74 68 65 6d 20 6e     ** set them n
6930: 6f 77 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72  ow..    */.    r
6940: 65 67 31 20 3d 20 70 50 61 72 73 65 2d 3e 72 65  eg1 = pParse->re
6950: 67 52 6f 77 69 64 20 3d 20 2b 2b 70 50 61 72 73  gRowid = ++pPars
6960: 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 72 65 67  e->nMem;.    reg
6970: 32 20 3d 20 70 50 61 72 73 65 2d 3e 72 65 67 52  2 = pParse->regR
6980: 6f 6f 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  oot = ++pParse->
6990: 6e 4d 65 6d 3b 0a 20 20 20 20 72 65 67 33 20 3d  nMem;.    reg3 =
69a0: 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
69b0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
69c0: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 52 65 61  AddOp3(v, OP_Rea
69d0: 64 43 6f 6f 6b 69 65 2c 20 69 44 62 2c 20 72 65  dCookie, iDb, re
69e0: 67 33 2c 20 31 29 3b 20 20 20 2f 2a 20 66 69 6c  g3, 1);   /* fil
69f0: 65 5f 66 6f 72 6d 61 74 20 2a 2f 0a 20 20 20 20  e_format */.    
6a00: 73 71 6c 69 74 65 33 56 64 62 65 55 73 65 73 42  sqlite3VdbeUsesB
6a10: 74 72 65 65 28 76 2c 20 69 44 62 29 3b 0a 20 20  tree(v, iDb);.  
6a20: 20 20 6a 31 20 3d 20 73 71 6c 69 74 65 33 56 64    j1 = sqlite3Vd
6a30: 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49  beAddOp1(v, OP_I
6a40: 66 2c 20 72 65 67 33 29 3b 0a 20 20 20 20 66 69  f, reg3);.    fi
6a50: 6c 65 46 6f 72 6d 61 74 20 3d 20 28 64 62 2d 3e  leFormat = (db->
6a60: 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4c  flags & SQLITE_L
6a70: 65 67 61 63 79 46 69 6c 65 46 6d 74 29 21 3d 30  egacyFileFmt)!=0
6a80: 20 3f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   ?.             
6a90: 20 20 20 20 20 31 20 3a 20 53 51 4c 49 54 45 5f       1 : SQLITE_
6aa0: 4d 41 58 5f 46 49 4c 45 5f 46 4f 52 4d 41 54 3b  MAX_FILE_FORMAT;
6ab0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
6ac0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
6ad0: 65 67 65 72 2c 20 66 69 6c 65 46 6f 72 6d 61 74  eger, fileFormat
6ae0: 2c 20 72 65 67 33 29 3b 0a 20 20 20 20 73 71 6c  , reg3);.    sql
6af0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
6b00: 2c 20 4f 50 5f 53 65 74 43 6f 6f 6b 69 65 2c 20  , OP_SetCookie, 
6b10: 69 44 62 2c 20 31 2c 20 72 65 67 33 29 3b 0a 20  iDb, 1, reg3);. 
6b20: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
6b30: 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
6b40: 65 72 2c 20 45 4e 43 28 64 62 29 2c 20 72 65 67  er, ENC(db), reg
6b50: 33 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  3);.    sqlite3V
6b60: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
6b70: 53 65 74 43 6f 6f 6b 69 65 2c 20 69 44 62 2c 20  SetCookie, iDb, 
6b80: 34 2c 20 72 65 67 33 29 3b 0a 20 20 20 20 73 71  4, reg3);.    sq
6b90: 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
6ba0: 65 28 76 2c 20 6a 31 29 3b 0a 0a 20 20 20 20 2f  e(v, j1);..    /
6bb0: 2a 20 54 68 69 73 20 6a 75 73 74 20 63 72 65 61  * This just crea
6bc0: 74 65 73 20 61 20 70 6c 61 63 65 2d 68 6f 6c 64  tes a place-hold
6bd0: 65 72 20 72 65 63 6f 72 64 20 69 6e 20 74 68 65  er record in the
6be0: 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74   sqlite_master t
6bf0: 61 62 6c 65 2e 0a 20 20 20 20 2a 2a 20 54 68 65  able..    ** The
6c00: 20 72 65 63 6f 72 64 20 63 72 65 61 74 65 64 20   record created 
6c10: 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e  does not contain
6c20: 20 61 6e 79 74 68 69 6e 67 20 79 65 74 2e 20 20   anything yet.  
6c30: 49 74 20 77 69 6c 6c 20 62 65 20 72 65 70 6c 61  It will be repla
6c40: 63 65 64 0a 20 20 20 20 2a 2a 20 62 79 20 74 68  ced.    ** by th
6c50: 65 20 72 65 61 6c 20 65 6e 74 72 79 20 69 6e 20  e real entry in 
6c60: 63 6f 64 65 20 67 65 6e 65 72 61 74 65 64 20 61  code generated a
6c70: 74 20 73 71 6c 69 74 65 33 45 6e 64 54 61 62 6c  t sqlite3EndTabl
6c80: 65 28 29 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  e()..    **.    
6c90: 2a 2a 20 54 68 65 20 72 6f 77 69 64 20 66 6f 72  ** The rowid for
6ca0: 20 74 68 65 20 6e 65 77 20 65 6e 74 72 79 20 69   the new entry i
6cb0: 73 20 6c 65 66 74 20 6f 6e 20 74 68 65 20 74 6f  s left on the to
6cc0: 70 20 6f 66 20 74 68 65 20 73 74 61 63 6b 2e 0a  p of the stack..
6cd0: 20 20 20 20 2a 2a 20 54 68 65 20 72 6f 77 69 64      ** The rowid
6ce0: 20 76 61 6c 75 65 20 69 73 20 6e 65 65 64 65 64   value is needed
6cf0: 20 62 79 20 74 68 65 20 63 6f 64 65 20 74 68 61   by the code tha
6d00: 74 20 73 71 6c 69 74 65 33 45 6e 64 54 61 62 6c  t sqlite3EndTabl
6d10: 65 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 67 65  e will.    ** ge
6d20: 6e 65 72 61 74 65 2e 0a 20 20 20 20 2a 2f 0a 23  nerate..    */.#
6d30: 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
6d40: 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 7c 7c  TE_OMIT_VIEW) ||
6d50: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
6d60: 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
6d70: 4c 45 29 0a 20 20 20 20 69 66 28 20 69 73 56 69  LE).    if( isVi
6d80: 65 77 20 7c 7c 20 69 73 56 69 72 74 75 61 6c 20  ew || isVirtual 
6d90: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
6da0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
6db0: 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 72 65 67  _Integer, 0, reg
6dc0: 32 29 3b 0a 20 20 20 20 7d 65 6c 73 65 0a 23 65  2);.    }else.#e
6dd0: 6e 64 69 66 0a 20 20 20 20 7b 0a 20 20 20 20 20  ndif.    {.     
6de0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
6df0: 70 32 28 76 2c 20 4f 50 5f 43 72 65 61 74 65 54  p2(v, OP_CreateT
6e00: 61 62 6c 65 2c 20 69 44 62 2c 20 72 65 67 32 29  able, iDb, reg2)
6e10: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
6e20: 74 65 33 4f 70 65 6e 4d 61 73 74 65 72 54 61 62  te3OpenMasterTab
6e30: 6c 65 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b  le(pParse, iDb);
6e40: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
6e50: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 77  AddOp2(v, OP_New
6e60: 52 6f 77 69 64 2c 20 30 2c 20 72 65 67 31 29 3b  Rowid, 0, reg1);
6e70: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
6e80: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c  AddOp2(v, OP_Nul
6e90: 6c 2c 20 30 2c 20 72 65 67 33 29 3b 0a 20 20 20  l, 0, reg3);.   
6ea0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
6eb0: 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c  p3(v, OP_Insert,
6ec0: 20 30 2c 20 72 65 67 33 2c 20 72 65 67 31 29 3b   0, reg3, reg1);
6ed0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
6ee0: 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c  ChangeP5(v, OPFL
6ef0: 41 47 5f 41 50 50 45 4e 44 29 3b 0a 20 20 20 20  AG_APPEND);.    
6f00: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
6f10: 30 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 29 3b 0a  0(v, OP_Close);.
6f20: 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 72 6d 61 6c    }..  /* Normal
6f30: 20 28 6e 6f 6e 2d 65 72 72 6f 72 29 20 72 65 74   (non-error) ret
6f40: 75 72 6e 2e 20 2a 2f 0a 20 20 72 65 74 75 72 6e  urn. */.  return
6f50: 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 20 65 72  ;..  /* If an er
6f60: 72 6f 72 20 6f 63 63 75 72 73 2c 20 77 65 20 6a  ror occurs, we j
6f70: 75 6d 70 20 68 65 72 65 20 2a 2f 0a 62 65 67 69  ump here */.begi
6f80: 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3a 0a 20  n_table_error:. 
6f90: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4e   sqlite3_free(zN
6fa0: 61 6d 65 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a  ame);.  return;.
6fb0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 6d 61  }../*.** This ma
6fc0: 63 72 6f 20 69 73 20 75 73 65 64 20 74 6f 20 63  cro is used to c
6fd0: 6f 6d 70 61 72 65 20 74 77 6f 20 73 74 72 69 6e  ompare two strin
6fe0: 67 73 20 69 6e 20 61 20 63 61 73 65 2d 69 6e 73  gs in a case-ins
6ff0: 65 6e 73 69 74 69 76 65 20 6d 61 6e 6e 65 72 2e  ensitive manner.
7000: 0a 2a 2a 20 49 74 20 69 73 20 73 6c 69 67 68 74  .** It is slight
7010: 6c 79 20 66 61 73 74 65 72 20 74 68 61 6e 20 63  ly faster than c
7020: 61 6c 6c 69 6e 67 20 73 71 6c 69 74 65 33 53 74  alling sqlite3St
7030: 72 49 43 6d 70 28 29 20 64 69 72 65 63 74 6c 79  rICmp() directly
7040: 2c 20 62 75 74 0a 2a 2a 20 70 72 6f 64 75 63 65  , but.** produce
7050: 73 20 6c 61 72 67 65 72 20 63 6f 64 65 2e 0a 2a  s larger code..*
7060: 2a 0a 2a 2a 20 57 41 52 4e 49 4e 47 3a 20 54 68  *.** WARNING: Th
7070: 69 73 20 6d 61 63 72 6f 20 69 73 20 6e 6f 74 20  is macro is not 
7080: 63 6f 6d 70 61 74 69 62 6c 65 20 77 69 74 68 20  compatible with 
7090: 74 68 65 20 73 74 72 63 6d 70 28 29 20 66 61 6d  the strcmp() fam
70a0: 69 6c 79 2e 20 49 74 0a 2a 2a 20 72 65 74 75 72  ily. It.** retur
70b0: 6e 73 20 74 72 75 65 20 69 66 20 74 68 65 20 74  ns true if the t
70c0: 77 6f 20 73 74 72 69 6e 67 73 20 61 72 65 20 65  wo strings are e
70d0: 71 75 61 6c 2c 20 6f 74 68 65 72 77 69 73 65 20  qual, otherwise 
70e0: 66 61 6c 73 65 2e 0a 2a 2f 0a 23 64 65 66 69 6e  false..*/.#defin
70f0: 65 20 53 54 52 49 43 4d 50 28 78 2c 20 79 29 20  e STRICMP(x, y) 
7100: 28 5c 0a 73 71 6c 69 74 65 33 55 70 70 65 72 54  (\.sqlite3UpperT
7110: 6f 4c 6f 77 65 72 5b 2a 28 75 6e 73 69 67 6e 65  oLower[*(unsigne
7120: 64 20 63 68 61 72 20 2a 29 28 78 29 5d 3d 3d 20  d char *)(x)]== 
7130: 20 20 5c 0a 73 71 6c 69 74 65 33 55 70 70 65 72    \.sqlite3Upper
7140: 54 6f 4c 6f 77 65 72 5b 2a 28 75 6e 73 69 67 6e  ToLower[*(unsign
7150: 65 64 20 63 68 61 72 20 2a 29 28 79 29 5d 20 20  ed char *)(y)]  
7160: 20 20 20 5c 0a 26 26 20 73 71 6c 69 74 65 33 53     \.&& sqlite3S
7170: 74 72 49 43 6d 70 28 28 78 29 2b 31 2c 28 79 29  trICmp((x)+1,(y)
7180: 2b 31 29 3d 3d 30 20 29 0a 0a 2f 2a 0a 2a 2a 20  +1)==0 )../*.** 
7190: 41 64 64 20 61 20 6e 65 77 20 63 6f 6c 75 6d 6e  Add a new column
71a0: 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 63 75   to the table cu
71b0: 72 72 65 6e 74 6c 79 20 62 65 69 6e 67 20 63 6f  rrently being co
71c0: 6e 73 74 72 75 63 74 65 64 2e 0a 2a 2a 0a 2a 2a  nstructed..**.**
71d0: 20 54 68 65 20 70 61 72 73 65 72 20 63 61 6c 6c   The parser call
71e0: 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6f  s this routine o
71f0: 6e 63 65 20 66 6f 72 20 65 61 63 68 20 63 6f 6c  nce for each col
7200: 75 6d 6e 20 64 65 63 6c 61 72 61 74 69 6f 6e 0a  umn declaration.
7210: 2a 2a 20 69 6e 20 61 20 43 52 45 41 54 45 20 54  ** in a CREATE T
7220: 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 20  ABLE statement. 
7230: 20 73 71 6c 69 74 65 33 53 74 61 72 74 54 61 62   sqlite3StartTab
7240: 6c 65 28 29 20 67 65 74 73 20 63 61 6c 6c 65 64  le() gets called
7250: 0a 2a 2a 20 66 69 72 73 74 20 74 6f 20 67 65 74  .** first to get
7260: 20 74 68 69 6e 67 73 20 67 6f 69 6e 67 2e 20 20   things going.  
7270: 54 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  Then this routin
7280: 65 20 69 73 20 63 61 6c 6c 65 64 20 66 6f 72 20  e is called for 
7290: 65 61 63 68 0a 2a 2a 20 63 6f 6c 75 6d 6e 2e 0a  each.** column..
72a0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 41  */.void sqlite3A
72b0: 64 64 43 6f 6c 75 6d 6e 28 50 61 72 73 65 20 2a  ddColumn(Parse *
72c0: 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70  pParse, Token *p
72d0: 4e 61 6d 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a  Name){.  Table *
72e0: 70 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 68  p;.  int i;.  ch
72f0: 61 72 20 2a 7a 3b 0a 20 20 43 6f 6c 75 6d 6e 20  ar *z;.  Column 
7300: 2a 70 43 6f 6c 3b 0a 20 20 69 66 28 20 28 70 20  *pCol;.  if( (p 
7310: 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  = pParse->pNewTa
7320: 62 6c 65 29 3d 3d 30 20 29 20 72 65 74 75 72 6e  ble)==0 ) return
7330: 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 43 6f 6c 2b  ;.  if( p->nCol+
7340: 31 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4c  1>SQLITE_MAX_COL
7350: 55 4d 4e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  UMN ){.    sqlit
7360: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
7370: 65 2c 20 22 74 6f 6f 20 6d 61 6e 79 20 63 6f 6c  e, "too many col
7380: 75 6d 6e 73 20 6f 6e 20 25 73 22 2c 20 70 2d 3e  umns on %s", p->
7390: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72 65 74 75  zName);.    retu
73a0: 72 6e 3b 0a 20 20 7d 0a 20 20 7a 20 3d 20 73 71  rn;.  }.  z = sq
73b0: 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b  lite3NameFromTok
73c0: 65 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  en(pParse->db, p
73d0: 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a 3d 3d  Name);.  if( z==
73e0: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f  0 ) return;.  fo
73f0: 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6c  r(i=0; i<p->nCol
7400: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
7410: 53 54 52 49 43 4d 50 28 7a 2c 20 70 2d 3e 61 43  STRICMP(z, p->aC
7420: 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 20 29 7b 0a  ol[i].zName) ){.
7430: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
7440: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 64  orMsg(pParse, "d
7450: 75 70 6c 69 63 61 74 65 20 63 6f 6c 75 6d 6e 20  uplicate column 
7460: 6e 61 6d 65 3a 20 25 73 22 2c 20 7a 29 3b 0a 20  name: %s", z);. 
7470: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
7480: 65 28 7a 29 3b 0a 20 20 20 20 20 20 72 65 74 75  e(z);.      retu
7490: 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  rn;.    }.  }.  
74a0: 69 66 28 20 28 70 2d 3e 6e 43 6f 6c 20 26 20 30  if( (p->nCol & 0
74b0: 78 37 29 3d 3d 30 20 29 7b 0a 20 20 20 20 43 6f  x7)==0 ){.    Co
74c0: 6c 75 6d 6e 20 2a 61 4e 65 77 3b 0a 20 20 20 20  lumn *aNew;.    
74d0: 61 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62  aNew = sqlite3Db
74e0: 52 65 61 6c 6c 6f 63 28 70 50 61 72 73 65 2d 3e  Realloc(pParse->
74f0: 64 62 2c 70 2d 3e 61 43 6f 6c 2c 28 70 2d 3e 6e  db,p->aCol,(p->n
7500: 43 6f 6c 2b 38 29 2a 73 69 7a 65 6f 66 28 70 2d  Col+8)*sizeof(p-
7510: 3e 61 43 6f 6c 5b 30 5d 29 29 3b 0a 20 20 20 20  >aCol[0]));.    
7520: 69 66 28 20 61 4e 65 77 3d 3d 30 20 29 7b 0a 20  if( aNew==0 ){. 
7530: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
7540: 65 28 7a 29 3b 0a 20 20 20 20 20 20 72 65 74 75  e(z);.      retu
7550: 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d  rn;.    }.    p-
7560: 3e 61 43 6f 6c 20 3d 20 61 4e 65 77 3b 0a 20 20  >aCol = aNew;.  
7570: 7d 0a 20 20 70 43 6f 6c 20 3d 20 26 70 2d 3e 61  }.  pCol = &p->a
7580: 43 6f 6c 5b 70 2d 3e 6e 43 6f 6c 5d 3b 0a 20 20  Col[p->nCol];.  
7590: 6d 65 6d 73 65 74 28 70 43 6f 6c 2c 20 30 2c 20  memset(pCol, 0, 
75a0: 73 69 7a 65 6f 66 28 70 2d 3e 61 43 6f 6c 5b 30  sizeof(p->aCol[0
75b0: 5d 29 29 3b 0a 20 20 70 43 6f 6c 2d 3e 7a 4e 61  ]));.  pCol->zNa
75c0: 6d 65 20 3d 20 7a 3b 0a 20 0a 20 20 2f 2a 20 49  me = z;. .  /* I
75d0: 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 74 79  f there is no ty
75e0: 70 65 20 73 70 65 63 69 66 69 65 64 2c 20 63 6f  pe specified, co
75f0: 6c 75 6d 6e 73 20 68 61 76 65 20 74 68 65 20 64  lumns have the d
7600: 65 66 61 75 6c 74 20 61 66 66 69 6e 69 74 79 0a  efault affinity.
7610: 20 20 2a 2a 20 27 4e 4f 4e 45 27 2e 20 49 66 20    ** 'NONE'. If 
7620: 74 68 65 72 65 20 69 73 20 61 20 74 79 70 65 20  there is a type 
7630: 73 70 65 63 69 66 69 65 64 2c 20 74 68 65 6e 20  specified, then 
7640: 73 71 6c 69 74 65 33 41 64 64 43 6f 6c 75 6d 6e  sqlite3AddColumn
7650: 54 79 70 65 28 29 20 77 69 6c 6c 0a 20 20 2a 2a  Type() will.  **
7660: 20 62 65 20 63 61 6c 6c 65 64 20 6e 65 78 74 20   be called next 
7670: 74 6f 20 73 65 74 20 70 43 6f 6c 2d 3e 61 66 66  to set pCol->aff
7680: 69 6e 69 74 79 20 63 6f 72 72 65 63 74 6c 79 2e  inity correctly.
7690: 0a 20 20 2a 2f 0a 20 20 70 43 6f 6c 2d 3e 61 66  .  */.  pCol->af
76a0: 66 69 6e 69 74 79 20 3d 20 53 51 4c 49 54 45 5f  finity = SQLITE_
76b0: 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 70 2d 3e 6e  AFF_NONE;.  p->n
76c0: 43 6f 6c 2b 2b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Col++;.}../*.** 
76d0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
76e0: 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20 70 61  called by the pa
76f0: 72 73 65 72 20 77 68 69 6c 65 20 69 6e 20 74 68  rser while in th
7700: 65 20 6d 69 64 64 6c 65 20 6f 66 0a 2a 2a 20 70  e middle of.** p
7710: 61 72 73 69 6e 67 20 61 20 43 52 45 41 54 45 20  arsing a CREATE 
7720: 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e  TABLE statement.
7730: 20 20 41 20 22 4e 4f 54 20 4e 55 4c 4c 22 20 63    A "NOT NULL" c
7740: 6f 6e 73 74 72 61 69 6e 74 20 68 61 73 0a 2a 2a  onstraint has.**
7750: 20 62 65 65 6e 20 73 65 65 6e 20 6f 6e 20 61 20   been seen on a 
7760: 63 6f 6c 75 6d 6e 2e 20 20 54 68 69 73 20 72 6f  column.  This ro
7770: 75 74 69 6e 65 20 73 65 74 73 20 74 68 65 20 6e  utine sets the n
7780: 6f 74 4e 75 6c 6c 20 66 6c 61 67 20 6f 6e 0a 2a  otNull flag on.*
7790: 2a 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 75 72  * the column cur
77a0: 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e  rently under con
77b0: 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f  struction..*/.vo
77c0: 69 64 20 73 71 6c 69 74 65 33 41 64 64 4e 6f 74  id sqlite3AddNot
77d0: 4e 75 6c 6c 28 50 61 72 73 65 20 2a 70 50 61 72  Null(Parse *pPar
77e0: 73 65 2c 20 69 6e 74 20 6f 6e 45 72 72 6f 72 29  se, int onError)
77f0: 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20  {.  Table *p;.  
7800: 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 28 70 20  int i;.  if( (p 
7810: 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  = pParse->pNewTa
7820: 62 6c 65 29 3d 3d 30 20 29 20 72 65 74 75 72 6e  ble)==0 ) return
7830: 3b 0a 20 20 69 20 3d 20 70 2d 3e 6e 43 6f 6c 2d  ;.  i = p->nCol-
7840: 31 3b 0a 20 20 69 66 28 20 69 3e 3d 30 20 29 20  1;.  if( i>=0 ) 
7850: 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 6e 6f 74 4e 75  p->aCol[i].notNu
7860: 6c 6c 20 3d 20 6f 6e 45 72 72 6f 72 3b 0a 7d 0a  ll = onError;.}.
7870: 0a 2f 2a 0a 2a 2a 20 53 63 61 6e 20 74 68 65 20  ./*.** Scan the 
7880: 63 6f 6c 75 6d 6e 20 74 79 70 65 20 6e 61 6d 65  column type name
7890: 20 7a 54 79 70 65 20 28 6c 65 6e 67 74 68 20 6e   zType (length n
78a0: 54 79 70 65 29 20 61 6e 64 20 72 65 74 75 72 6e  Type) and return
78b0: 20 74 68 65 0a 2a 2a 20 61 73 73 6f 63 69 61 74   the.** associat
78c0: 65 64 20 61 66 66 69 6e 69 74 79 20 74 79 70 65  ed affinity type
78d0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
78e0: 74 69 6e 65 20 64 6f 65 73 20 61 20 63 61 73 65  tine does a case
78f0: 2d 69 6e 64 65 70 65 6e 64 65 6e 74 20 73 65 61  -independent sea
7900: 72 63 68 20 6f 66 20 7a 54 79 70 65 20 66 6f 72  rch of zType for
7910: 20 74 68 65 20 0a 2a 2a 20 73 75 62 73 74 72 69   the .** substri
7920: 6e 67 73 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f  ngs in the follo
7930: 77 69 6e 67 20 74 61 62 6c 65 2e 20 49 66 20 6f  wing table. If o
7940: 6e 65 20 6f 66 20 74 68 65 20 73 75 62 73 74 72  ne of the substr
7950: 69 6e 67 73 20 69 73 0a 2a 2a 20 66 6f 75 6e 64  ings is.** found
7960: 2c 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64  , the correspond
7970: 69 6e 67 20 61 66 66 69 6e 69 74 79 20 69 73 20  ing affinity is 
7980: 72 65 74 75 72 6e 65 64 2e 20 49 66 20 7a 54 79  returned. If zTy
7990: 70 65 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 6d  pe contains.** m
79a0: 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 6f 66 20  ore than one of 
79b0: 74 68 65 20 73 75 62 73 74 72 69 6e 67 73 2c 20  the substrings, 
79c0: 65 6e 74 72 69 65 73 20 74 6f 77 61 72 64 20 74  entries toward t
79d0: 68 65 20 74 6f 70 20 6f 66 20 0a 2a 2a 20 74 68  he top of .** th
79e0: 65 20 74 61 62 6c 65 20 74 61 6b 65 20 70 72 69  e table take pri
79f0: 6f 72 69 74 79 2e 20 46 6f 72 20 65 78 61 6d 70  ority. For examp
7a00: 6c 65 2c 20 69 66 20 7a 54 79 70 65 20 69 73 20  le, if zType is 
7a10: 27 42 4c 4f 42 49 4e 54 27 2c 20 0a 2a 2a 20 53  'BLOBINT', .** S
7a20: 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45  QLITE_AFF_INTEGE
7a30: 52 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  R is returned..*
7a40: 2a 0a 2a 2a 20 53 75 62 73 74 72 69 6e 67 20 20  *.** Substring  
7a50: 20 20 20 7c 20 41 66 66 69 6e 69 74 79 0a 2a 2a     | Affinity.**
7a60: 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   ---------------
7a70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7a80: 2d 0a 2a 2a 20 27 49 4e 54 27 20 20 20 20 20 20  -.** 'INT'      
7a90: 20 20 20 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f     | SQLITE_AFF_
7aa0: 49 4e 54 45 47 45 52 0a 2a 2a 20 27 43 48 41 52  INTEGER.** 'CHAR
7ab0: 27 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54  '        | SQLIT
7ac0: 45 5f 41 46 46 5f 54 45 58 54 0a 2a 2a 20 27 43  E_AFF_TEXT.** 'C
7ad0: 4c 4f 42 27 20 20 20 20 20 20 20 20 7c 20 53 51  LOB'        | SQ
7ae0: 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 0a 2a 2a  LITE_AFF_TEXT.**
7af0: 20 27 54 45 58 54 27 20 20 20 20 20 20 20 20 7c   'TEXT'        |
7b00: 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54   SQLITE_AFF_TEXT
7b10: 0a 2a 2a 20 27 42 4c 4f 42 27 20 20 20 20 20 20  .** 'BLOB'      
7b20: 20 20 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e    | SQLITE_AFF_N
7b30: 4f 4e 45 0a 2a 2a 20 27 52 45 41 4c 27 20 20 20  ONE.** 'REAL'   
7b40: 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 41 46       | SQLITE_AF
7b50: 46 5f 52 45 41 4c 0a 2a 2a 20 27 46 4c 4f 41 27  F_REAL.** 'FLOA'
7b60: 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45          | SQLITE
7b70: 5f 41 46 46 5f 52 45 41 4c 0a 2a 2a 20 27 44 4f  _AFF_REAL.** 'DO
7b80: 55 42 27 20 20 20 20 20 20 20 20 7c 20 53 51 4c  UB'        | SQL
7b90: 49 54 45 5f 41 46 46 5f 52 45 41 4c 0a 2a 2a 0a  ITE_AFF_REAL.**.
7ba0: 2a 2a 20 49 66 20 6e 6f 6e 65 20 6f 66 20 74 68  ** If none of th
7bb0: 65 20 73 75 62 73 74 72 69 6e 67 73 20 69 6e 20  e substrings in 
7bc0: 74 68 65 20 61 62 6f 76 65 20 74 61 62 6c 65 20  the above table 
7bd0: 61 72 65 20 66 6f 75 6e 64 2c 0a 2a 2a 20 53 51  are found,.** SQ
7be0: 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43  LITE_AFF_NUMERIC
7bf0: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f   is returned..*/
7c00: 0a 63 68 61 72 20 73 71 6c 69 74 65 33 41 66 66  .char sqlite3Aff
7c10: 69 6e 69 74 79 54 79 70 65 28 63 6f 6e 73 74 20  inityType(const 
7c20: 54 6f 6b 65 6e 20 2a 70 54 79 70 65 29 7b 0a 20  Token *pType){. 
7c30: 20 75 33 32 20 68 20 3d 20 30 3b 0a 20 20 63 68   u32 h = 0;.  ch
7c40: 61 72 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f  ar aff = SQLITE_
7c50: 41 46 46 5f 4e 55 4d 45 52 49 43 3b 0a 20 20 63  AFF_NUMERIC;.  c
7c60: 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
7c70: 61 72 20 2a 7a 49 6e 20 3d 20 70 54 79 70 65 2d  ar *zIn = pType-
7c80: 3e 7a 3b 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69  >z;.  const unsi
7c90: 67 6e 65 64 20 63 68 61 72 20 2a 7a 45 6e 64 20  gned char *zEnd 
7ca0: 3d 20 26 70 54 79 70 65 2d 3e 7a 5b 70 54 79 70  = &pType->z[pTyp
7cb0: 65 2d 3e 6e 5d 3b 0a 0a 20 20 77 68 69 6c 65 28  e->n];..  while(
7cc0: 20 7a 49 6e 21 3d 7a 45 6e 64 20 29 7b 0a 20 20   zIn!=zEnd ){.  
7cd0: 20 20 68 20 3d 20 28 68 3c 3c 38 29 20 2b 20 73    h = (h<<8) + s
7ce0: 71 6c 69 74 65 33 55 70 70 65 72 54 6f 4c 6f 77  qlite3UpperToLow
7cf0: 65 72 5b 2a 7a 49 6e 5d 3b 0a 20 20 20 20 7a 49  er[*zIn];.    zI
7d00: 6e 2b 2b 3b 0a 20 20 20 20 69 66 28 20 68 3d 3d  n++;.    if( h==
7d10: 28 28 27 63 27 3c 3c 32 34 29 2b 28 27 68 27 3c  (('c'<<24)+('h'<
7d20: 3c 31 36 29 2b 28 27 61 27 3c 3c 38 29 2b 27 72  <16)+('a'<<8)+'r
7d30: 27 29 20 29 7b 20 20 20 20 20 20 20 20 20 20 20  ') ){           
7d40: 20 20 2f 2a 20 43 48 41 52 20 2a 2f 0a 20 20 20    /* CHAR */.   
7d50: 20 20 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f     aff = SQLITE_
7d60: 41 46 46 5f 54 45 58 54 3b 20 0a 20 20 20 20 7d  AFF_TEXT; .    }
7d70: 65 6c 73 65 20 69 66 28 20 68 3d 3d 28 28 27 63  else if( h==(('c
7d80: 27 3c 3c 32 34 29 2b 28 27 6c 27 3c 3c 31 36 29  '<<24)+('l'<<16)
7d90: 2b 28 27 6f 27 3c 3c 38 29 2b 27 62 27 29 20 29  +('o'<<8)+'b') )
7da0: 7b 20 20 20 20 20 20 20 2f 2a 20 43 4c 4f 42 20  {       /* CLOB 
7db0: 2a 2f 0a 20 20 20 20 20 20 61 66 66 20 3d 20 53  */.      aff = S
7dc0: 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 3b 0a  QLITE_AFF_TEXT;.
7dd0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 68 3d      }else if( h=
7de0: 3d 28 28 27 74 27 3c 3c 32 34 29 2b 28 27 65 27  =(('t'<<24)+('e'
7df0: 3c 3c 31 36 29 2b 28 27 78 27 3c 3c 38 29 2b 27  <<16)+('x'<<8)+'
7e00: 74 27 29 20 29 7b 20 20 20 20 20 20 20 2f 2a 20  t') ){       /* 
7e10: 54 45 58 54 20 2a 2f 0a 20 20 20 20 20 20 61 66  TEXT */.      af
7e20: 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 54  f = SQLITE_AFF_T
7e30: 45 58 54 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  EXT;.    }else i
7e40: 66 28 20 68 3d 3d 28 28 27 62 27 3c 3c 32 34 29  f( h==(('b'<<24)
7e50: 2b 28 27 6c 27 3c 3c 31 36 29 2b 28 27 6f 27 3c  +('l'<<16)+('o'<
7e60: 3c 38 29 2b 27 62 27 29 20 20 20 20 20 20 20 20  <8)+'b')        
7e70: 20 20 2f 2a 20 42 4c 4f 42 20 2a 2f 0a 20 20 20    /* BLOB */.   
7e80: 20 20 20 20 20 26 26 20 28 61 66 66 3d 3d 53 51       && (aff==SQ
7e90: 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43  LITE_AFF_NUMERIC
7ea0: 20 7c 7c 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f   || aff==SQLITE_
7eb0: 41 46 46 5f 52 45 41 4c 29 20 29 7b 0a 20 20 20  AFF_REAL) ){.   
7ec0: 20 20 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f     aff = SQLITE_
7ed0: 41 46 46 5f 4e 4f 4e 45 3b 0a 23 69 66 6e 64 65  AFF_NONE;.#ifnde
7ee0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c  f SQLITE_OMIT_FL
7ef0: 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 20 20 20  OATING_POINT.   
7f00: 20 7d 65 6c 73 65 20 69 66 28 20 68 3d 3d 28 28   }else if( h==((
7f10: 27 72 27 3c 3c 32 34 29 2b 28 27 65 27 3c 3c 31  'r'<<24)+('e'<<1
7f20: 36 29 2b 28 27 61 27 3c 3c 38 29 2b 27 6c 27 29  6)+('a'<<8)+'l')
7f30: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 45 41            /* REA
7f40: 4c 20 2a 2f 0a 20 20 20 20 20 20 20 20 26 26 20  L */.        && 
7f50: 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f  aff==SQLITE_AFF_
7f60: 4e 55 4d 45 52 49 43 20 29 7b 0a 20 20 20 20 20  NUMERIC ){.     
7f70: 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46   aff = SQLITE_AF
7f80: 46 5f 52 45 41 4c 3b 0a 20 20 20 20 7d 65 6c 73  F_REAL;.    }els
7f90: 65 20 69 66 28 20 68 3d 3d 28 28 27 66 27 3c 3c  e if( h==(('f'<<
7fa0: 32 34 29 2b 28 27 6c 27 3c 3c 31 36 29 2b 28 27  24)+('l'<<16)+('
7fb0: 6f 27 3c 3c 38 29 2b 27 61 27 29 20 20 20 20 20  o'<<8)+'a')     
7fc0: 20 20 20 20 20 2f 2a 20 46 4c 4f 41 20 2a 2f 0a       /* FLOA */.
7fd0: 20 20 20 20 20 20 20 20 26 26 20 61 66 66 3d 3d          && aff==
7fe0: 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52  SQLITE_AFF_NUMER
7ff0: 49 43 20 29 7b 0a 20 20 20 20 20 20 61 66 66 20  IC ){.      aff 
8000: 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41  = SQLITE_AFF_REA
8010: 4c 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  L;.    }else if(
8020: 20 68 3d 3d 28 28 27 64 27 3c 3c 32 34 29 2b 28   h==(('d'<<24)+(
8030: 27 6f 27 3c 3c 31 36 29 2b 28 27 75 27 3c 3c 38  'o'<<16)+('u'<<8
8040: 29 2b 27 62 27 29 20 20 20 20 20 20 20 20 20 20  )+'b')          
8050: 2f 2a 20 44 4f 55 42 20 2a 2f 0a 20 20 20 20 20  /* DOUB */.     
8060: 20 20 20 26 26 20 61 66 66 3d 3d 53 51 4c 49 54     && aff==SQLIT
8070: 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20 29 7b  E_AFF_NUMERIC ){
8080: 0a 20 20 20 20 20 20 61 66 66 20 3d 20 53 51 4c  .      aff = SQL
8090: 49 54 45 5f 41 46 46 5f 52 45 41 4c 3b 0a 23 65  ITE_AFF_REAL;.#e
80a0: 6e 64 69 66 0a 20 20 20 20 7d 65 6c 73 65 20 69  ndif.    }else i
80b0: 66 28 20 28 68 26 30 78 30 30 46 46 46 46 46 46  f( (h&0x00FFFFFF
80c0: 29 3d 3d 28 28 27 69 27 3c 3c 31 36 29 2b 28 27  )==(('i'<<16)+('
80d0: 6e 27 3c 3c 38 29 2b 27 74 27 29 20 29 7b 20 20  n'<<8)+'t') ){  
80e0: 20 20 2f 2a 20 49 4e 54 20 2a 2f 0a 20 20 20 20    /* INT */.    
80f0: 20 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41    aff = SQLITE_A
8100: 46 46 5f 49 4e 54 45 47 45 52 3b 0a 20 20 20 20  FF_INTEGER;.    
8110: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
8120: 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 61 66 66   }..  return aff
8130: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
8140: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
8150: 64 20 62 79 20 74 68 65 20 70 61 72 73 65 72 20  d by the parser 
8160: 77 68 69 6c 65 20 69 6e 20 74 68 65 20 6d 69 64  while in the mid
8170: 64 6c 65 20 6f 66 0a 2a 2a 20 70 61 72 73 69 6e  dle of.** parsin
8180: 67 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45  g a CREATE TABLE
8190: 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 54 68 65   statement.  The
81a0: 20 70 46 69 72 73 74 20 74 6f 6b 65 6e 20 69 73   pFirst token is
81b0: 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 74 6f   the first.** to
81c0: 6b 65 6e 20 69 6e 20 74 68 65 20 73 65 71 75 65  ken in the seque
81d0: 6e 63 65 20 6f 66 20 74 6f 6b 65 6e 73 20 74 68  nce of tokens th
81e0: 61 74 20 64 65 73 63 72 69 62 65 20 74 68 65 20  at describe the 
81f0: 74 79 70 65 20 6f 66 20 74 68 65 0a 2a 2a 20 63  type of the.** c
8200: 6f 6c 75 6d 6e 20 63 75 72 72 65 6e 74 6c 79 20  olumn currently 
8210: 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69  under constructi
8220: 6f 6e 2e 20 20 20 70 4c 61 73 74 20 69 73 20 74  on.   pLast is t
8230: 68 65 20 6c 61 73 74 20 74 6f 6b 65 6e 0a 2a 2a  he last token.**
8240: 20 69 6e 20 74 68 65 20 73 65 71 75 65 6e 63 65   in the sequence
8250: 2e 20 20 55 73 65 20 74 68 69 73 20 69 6e 66 6f  .  Use this info
8260: 72 6d 61 74 69 6f 6e 20 74 6f 20 63 6f 6e 73 74  rmation to const
8270: 72 75 63 74 20 61 20 73 74 72 69 6e 67 0a 2a 2a  ruct a string.**
8280: 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74   that contains t
8290: 68 65 20 74 79 70 65 6e 61 6d 65 20 6f 66 20 74  he typename of t
82a0: 68 65 20 63 6f 6c 75 6d 6e 20 61 6e 64 20 73 74  he column and st
82b0: 6f 72 65 20 74 68 61 74 20 73 74 72 69 6e 67 0a  ore that string.
82c0: 2a 2a 20 69 6e 20 7a 54 79 70 65 2e 0a 2a 2f 20  ** in zType..*/ 
82d0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 41 64 64  .void sqlite3Add
82e0: 43 6f 6c 75 6d 6e 54 79 70 65 28 50 61 72 73 65  ColumnType(Parse
82f0: 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20   *pParse, Token 
8300: 2a 70 54 79 70 65 29 7b 0a 20 20 54 61 62 6c 65  *pType){.  Table
8310: 20 2a 70 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20   *p;.  int i;.  
8320: 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 0a 20  Column *pCol;.. 
8330: 20 69 66 28 20 28 70 20 3d 20 70 50 61 72 73 65   if( (p = pParse
8340: 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3d 3d 30 20  ->pNewTable)==0 
8350: 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 20 3d 20  ) return;.  i = 
8360: 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 69 66 28  p->nCol-1;.  if(
8370: 20 69 3c 30 20 29 20 72 65 74 75 72 6e 3b 0a 20   i<0 ) return;. 
8380: 20 70 43 6f 6c 20 3d 20 26 70 2d 3e 61 43 6f 6c   pCol = &p->aCol
8390: 5b 69 5d 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66  [i];.  sqlite3_f
83a0: 72 65 65 28 70 43 6f 6c 2d 3e 7a 54 79 70 65 29  ree(pCol->zType)
83b0: 3b 0a 20 20 70 43 6f 6c 2d 3e 7a 54 79 70 65 20  ;.  pCol->zType 
83c0: 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f  = sqlite3NameFro
83d0: 6d 54 6f 6b 65 6e 28 70 50 61 72 73 65 2d 3e 64  mToken(pParse->d
83e0: 62 2c 20 70 54 79 70 65 29 3b 0a 20 20 70 43 6f  b, pType);.  pCo
83f0: 6c 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20 73 71  l->affinity = sq
8400: 6c 69 74 65 33 41 66 66 69 6e 69 74 79 54 79 70  lite3AffinityTyp
8410: 65 28 70 54 79 70 65 29 3b 0a 7d 0a 0a 2f 2a 0a  e(pType);.}../*.
8420: 2a 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f  ** The expressio
8430: 6e 20 69 73 20 74 68 65 20 64 65 66 61 75 6c 74  n is the default
8440: 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20 6d   value for the m
8450: 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 61 64 64  ost recently add
8460: 65 64 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 6f 66 20  ed column.** of 
8470: 74 68 65 20 74 61 62 6c 65 20 63 75 72 72 65 6e  the table curren
8480: 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72  tly under constr
8490: 75 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 44 65  uction..**.** De
84a0: 66 61 75 6c 74 20 76 61 6c 75 65 20 65 78 70 72  fault value expr
84b0: 65 73 73 69 6f 6e 73 20 6d 75 73 74 20 62 65 20  essions must be 
84c0: 63 6f 6e 73 74 61 6e 74 2e 20 20 52 61 69 73 65  constant.  Raise
84d0: 20 61 6e 20 65 78 63 65 70 74 69 6f 6e 20 69 66   an exception if
84e0: 20 74 68 69 73 0a 2a 2a 20 69 73 20 6e 6f 74 20   this.** is not 
84f0: 74 68 65 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20  the case..**.** 
8500: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
8510: 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20 70 61  called by the pa
8520: 72 73 65 72 20 77 68 69 6c 65 20 69 6e 20 74 68  rser while in th
8530: 65 20 6d 69 64 64 6c 65 20 6f 66 0a 2a 2a 20 70  e middle of.** p
8540: 61 72 73 69 6e 67 20 61 20 43 52 45 41 54 45 20  arsing a CREATE 
8550: 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e  TABLE statement.
8560: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
8570: 41 64 64 44 65 66 61 75 6c 74 56 61 6c 75 65 28  AddDefaultValue(
8580: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45  Parse *pParse, E
8590: 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 54  xpr *pExpr){.  T
85a0: 61 62 6c 65 20 2a 70 3b 0a 20 20 43 6f 6c 75 6d  able *p;.  Colum
85b0: 6e 20 2a 70 43 6f 6c 3b 0a 20 20 69 66 28 20 28  n *pCol;.  if( (
85c0: 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  p = pParse->pNew
85d0: 54 61 62 6c 65 29 21 3d 30 20 29 7b 0a 20 20 20  Table)!=0 ){.   
85e0: 20 70 43 6f 6c 20 3d 20 26 28 70 2d 3e 61 43 6f   pCol = &(p->aCo
85f0: 6c 5b 70 2d 3e 6e 43 6f 6c 2d 31 5d 29 3b 0a 20  l[p->nCol-1]);. 
8600: 20 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 45     if( !sqlite3E
8610: 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4f 72 46  xprIsConstantOrF
8620: 75 6e 63 74 69 6f 6e 28 70 45 78 70 72 29 20 29  unction(pExpr) )
8630: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
8640: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
8650: 22 64 65 66 61 75 6c 74 20 76 61 6c 75 65 20 6f  "default value o
8660: 66 20 63 6f 6c 75 6d 6e 20 5b 25 73 5d 20 69 73  f column [%s] is
8670: 20 6e 6f 74 20 63 6f 6e 73 74 61 6e 74 22 2c 0a   not constant",.
8680: 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e            pCol->
8690: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 65 6c 73  zName);.    }els
86a0: 65 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  e{.      Expr *p
86b0: 43 6f 70 79 3b 0a 20 20 20 20 20 20 73 71 6c 69  Copy;.      sqli
86c0: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
86d0: 2d 3e 64 62 3b 0a 20 20 20 20 20 20 73 71 6c 69  ->db;.      sqli
86e0: 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 70 43  te3ExprDelete(pC
86f0: 6f 6c 2d 3e 70 44 66 6c 74 29 3b 0a 20 20 20 20  ol->pDflt);.    
8700: 20 20 70 43 6f 6c 2d 3e 70 44 66 6c 74 20 3d 20    pCol->pDflt = 
8710: 70 43 6f 70 79 20 3d 20 73 71 6c 69 74 65 33 45  pCopy = sqlite3E
8720: 78 70 72 44 75 70 28 64 62 2c 20 70 45 78 70 72  xprDup(db, pExpr
8730: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 43 6f  );.      if( pCo
8740: 70 79 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  py ){.        sq
8750: 6c 69 74 65 33 54 6f 6b 65 6e 43 6f 70 79 28 64  lite3TokenCopy(d
8760: 62 2c 20 26 70 43 6f 70 79 2d 3e 73 70 61 6e 2c  b, &pCopy->span,
8770: 20 26 70 45 78 70 72 2d 3e 73 70 61 6e 29 3b 0a   &pExpr->span);.
8780: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
8790: 7d 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44  }.  sqlite3ExprD
87a0: 65 6c 65 74 65 28 70 45 78 70 72 29 3b 0a 7d 0a  elete(pExpr);.}.
87b0: 0a 2f 2a 0a 2a 2a 20 44 65 73 69 67 6e 61 74 65  ./*.** Designate
87c0: 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59   the PRIMARY KEY
87d0: 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 2e 20   for the table. 
87e0: 20 70 4c 69 73 74 20 69 73 20 61 20 6c 69 73 74   pList is a list
87f0: 20 6f 66 20 6e 61 6d 65 73 20 0a 2a 2a 20 6f 66   of names .** of
8800: 20 63 6f 6c 75 6d 6e 73 20 74 68 61 74 20 66 6f   columns that fo
8810: 72 6d 20 74 68 65 20 70 72 69 6d 61 72 79 20 6b  rm the primary k
8820: 65 79 2e 20 20 49 66 20 70 4c 69 73 74 20 69 73  ey.  If pList is
8830: 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68 65 0a   NULL, then the.
8840: 2a 2a 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79  ** most recently
8850: 20 61 64 64 65 64 20 63 6f 6c 75 6d 6e 20 6f 66   added column of
8860: 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 74 68   the table is th
8870: 65 20 70 72 69 6d 61 72 79 20 6b 65 79 2e 0a 2a  e primary key..*
8880: 2a 0a 2a 2a 20 41 20 74 61 62 6c 65 20 63 61 6e  *.** A table can
8890: 20 68 61 76 65 20 61 74 20 6d 6f 73 74 20 6f 6e   have at most on
88a0: 65 20 70 72 69 6d 61 72 79 20 6b 65 79 2e 20 20  e primary key.  
88b0: 49 66 20 74 68 65 20 74 61 62 6c 65 20 61 6c 72  If the table alr
88c0: 65 61 64 79 20 68 61 73 0a 2a 2a 20 61 20 70 72  eady has.** a pr
88d0: 69 6d 61 72 79 20 6b 65 79 20 28 61 6e 64 20 74  imary key (and t
88e0: 68 69 73 20 69 73 20 74 68 65 20 73 65 63 6f 6e  his is the secon
88f0: 64 20 70 72 69 6d 61 72 79 20 6b 65 79 29 20 74  d primary key) t
8900: 68 65 6e 20 63 72 65 61 74 65 20 61 6e 0a 2a 2a  hen create an.**
8910: 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49 66   error..**.** If
8920: 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59   the PRIMARY KEY
8930: 20 69 73 20 6f 6e 20 61 20 73 69 6e 67 6c 65 20   is on a single 
8940: 63 6f 6c 75 6d 6e 20 77 68 6f 73 65 20 64 61 74  column whose dat
8950: 61 74 79 70 65 20 69 73 20 49 4e 54 45 47 45 52  atype is INTEGER
8960: 2c 0a 2a 2a 20 74 68 65 6e 20 77 65 20 77 69 6c  ,.** then we wil
8970: 6c 20 74 72 79 20 74 6f 20 75 73 65 20 74 68 61  l try to use tha
8980: 74 20 63 6f 6c 75 6d 6e 20 61 73 20 74 68 65 20  t column as the 
8990: 72 6f 77 69 64 2e 20 20 53 65 74 20 74 68 65 20  rowid.  Set the 
89a0: 54 61 62 6c 65 2e 69 50 4b 65 79 0a 2a 2a 20 66  Table.iPKey.** f
89b0: 69 65 6c 64 20 6f 66 20 74 68 65 20 74 61 62 6c  ield of the tabl
89c0: 65 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63  e under construc
89d0: 74 69 6f 6e 20 74 6f 20 62 65 20 74 68 65 20 69  tion to be the i
89e0: 6e 64 65 78 20 6f 66 20 74 68 65 0a 2a 2a 20 49  ndex of the.** I
89f0: 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b  NTEGER PRIMARY K
8a00: 45 59 20 63 6f 6c 75 6d 6e 2e 20 20 54 61 62 6c  EY column.  Tabl
8a10: 65 2e 69 50 4b 65 79 20 69 73 20 73 65 74 20 74  e.iPKey is set t
8a20: 6f 20 2d 31 20 69 66 20 74 68 65 72 65 20 69 73  o -1 if there is
8a30: 0a 2a 2a 20 6e 6f 20 49 4e 54 45 47 45 52 20 50  .** no INTEGER P
8a40: 52 49 4d 41 52 59 20 4b 45 59 2e 0a 2a 2a 0a 2a  RIMARY KEY..**.*
8a50: 2a 20 49 66 20 74 68 65 20 6b 65 79 20 69 73 20  * If the key is 
8a60: 6e 6f 74 20 61 6e 20 49 4e 54 45 47 45 52 20 50  not an INTEGER P
8a70: 52 49 4d 41 52 59 20 4b 45 59 2c 20 74 68 65 6e  RIMARY KEY, then
8a80: 20 63 72 65 61 74 65 20 61 20 75 6e 69 71 75 65   create a unique
8a90: 0a 2a 2a 20 69 6e 64 65 78 20 66 6f 72 20 74 68  .** index for th
8aa0: 65 20 6b 65 79 2e 20 20 4e 6f 20 69 6e 64 65 78  e key.  No index
8ab0: 20 69 73 20 63 72 65 61 74 65 64 20 66 6f 72 20   is created for 
8ac0: 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20  INTEGER PRIMARY 
8ad0: 4b 45 59 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  KEYs..*/.void sq
8ae0: 6c 69 74 65 33 41 64 64 50 72 69 6d 61 72 79 4b  lite3AddPrimaryK
8af0: 65 79 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ey(.  Parse *pPa
8b00: 72 73 65 2c 20 20 20 20 2f 2a 20 50 61 72 73 69  rse,    /* Parsi
8b10: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
8b20: 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c  ExprList *pList,
8b30: 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 66 69 65    /* List of fie
8b40: 6c 64 20 6e 61 6d 65 73 20 74 6f 20 62 65 20 69  ld names to be i
8b50: 6e 64 65 78 65 64 20 2a 2f 0a 20 20 69 6e 74 20  ndexed */.  int 
8b60: 6f 6e 45 72 72 6f 72 2c 20 20 20 20 20 20 2f 2a  onError,      /*
8b70: 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69 74 68   What to do with
8b80: 20 61 20 75 6e 69 71 75 65 6e 65 73 73 20 63 6f   a uniqueness co
8b90: 6e 66 6c 69 63 74 20 2a 2f 0a 20 20 69 6e 74 20  nflict */.  int 
8ba0: 61 75 74 6f 49 6e 63 2c 20 20 20 20 20 20 2f 2a  autoInc,      /*
8bb0: 20 54 72 75 65 20 69 66 20 74 68 65 20 41 55 54   True if the AUT
8bc0: 4f 49 4e 43 52 45 4d 45 4e 54 20 6b 65 79 77 6f  OINCREMENT keywo
8bd0: 72 64 20 69 73 20 70 72 65 73 65 6e 74 20 2a 2f  rd is present */
8be0: 0a 20 20 69 6e 74 20 73 6f 72 74 4f 72 64 65 72  .  int sortOrder
8bf0: 20 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 53       /* SQLITE_S
8c00: 4f 5f 41 53 43 20 6f 72 20 53 51 4c 49 54 45 5f  O_ASC or SQLITE_
8c10: 53 4f 5f 44 45 53 43 20 2a 2f 0a 29 7b 0a 20 20  SO_DESC */.){.  
8c20: 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 50  Table *pTab = pP
8c30: 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b  arse->pNewTable;
8c40: 0a 20 20 63 68 61 72 20 2a 7a 54 79 70 65 20 3d  .  char *zType =
8c50: 20 30 3b 0a 20 20 69 6e 74 20 69 43 6f 6c 20 3d   0;.  int iCol =
8c60: 20 2d 31 2c 20 69 3b 0a 20 20 69 66 28 20 70 54   -1, i;.  if( pT
8c70: 61 62 3d 3d 30 20 7c 7c 20 49 4e 5f 44 45 43 4c  ab==0 || IN_DECL
8c80: 41 52 45 5f 56 54 41 42 20 29 20 67 6f 74 6f 20  ARE_VTAB ) goto 
8c90: 70 72 69 6d 61 72 79 5f 6b 65 79 5f 65 78 69 74  primary_key_exit
8ca0: 3b 0a 20 20 69 66 28 20 70 54 61 62 2d 3e 68 61  ;.  if( pTab->ha
8cb0: 73 50 72 69 6d 4b 65 79 20 29 7b 0a 20 20 20 20  sPrimKey ){.    
8cc0: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
8cd0: 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20 22  pParse, .      "
8ce0: 74 61 62 6c 65 20 5c 22 25 73 5c 22 20 68 61 73  table \"%s\" has
8cf0: 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 70   more than one p
8d00: 72 69 6d 61 72 79 20 6b 65 79 22 2c 20 70 54 61  rimary key", pTa
8d10: 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 67  b->zName);.    g
8d20: 6f 74 6f 20 70 72 69 6d 61 72 79 5f 6b 65 79 5f  oto primary_key_
8d30: 65 78 69 74 3b 0a 20 20 7d 0a 20 20 70 54 61 62  exit;.  }.  pTab
8d40: 2d 3e 68 61 73 50 72 69 6d 4b 65 79 20 3d 20 31  ->hasPrimKey = 1
8d50: 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30  ;.  if( pList==0
8d60: 20 29 7b 0a 20 20 20 20 69 43 6f 6c 20 3d 20 70   ){.    iCol = p
8d70: 54 61 62 2d 3e 6e 43 6f 6c 20 2d 20 31 3b 0a 20  Tab->nCol - 1;. 
8d80: 20 20 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43     pTab->aCol[iC
8d90: 6f 6c 5d 2e 69 73 50 72 69 6d 4b 65 79 20 3d 20  ol].isPrimKey = 
8da0: 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  1;.  }else{.    
8db0: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74  for(i=0; i<pList
8dc0: 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
8dd0: 20 20 20 20 20 66 6f 72 28 69 43 6f 6c 3d 30 3b       for(iCol=0;
8de0: 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c   iCol<pTab->nCol
8df0: 3b 20 69 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20  ; iCol++){.     
8e00: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74     if( sqlite3St
8e10: 72 49 43 6d 70 28 70 4c 69 73 74 2d 3e 61 5b 69  rICmp(pList->a[i
8e20: 5d 2e 7a 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 61  ].zName, pTab->a
8e30: 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 29  Col[iCol].zName)
8e40: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
8e50: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
8e60: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
8e70: 69 66 28 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e  if( iCol<pTab->n
8e80: 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 70  Col ){.        p
8e90: 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e  Tab->aCol[iCol].
8ea0: 69 73 50 72 69 6d 4b 65 79 20 3d 20 31 3b 0a 20  isPrimKey = 1;. 
8eb0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
8ec0: 20 69 66 28 20 70 4c 69 73 74 2d 3e 6e 45 78 70   if( pList->nExp
8ed0: 72 3e 31 20 29 20 69 43 6f 6c 20 3d 20 2d 31 3b  r>1 ) iCol = -1;
8ee0: 0a 20 20 7d 0a 20 20 69 66 28 20 69 43 6f 6c 3e  .  }.  if( iCol>
8ef0: 3d 30 20 26 26 20 69 43 6f 6c 3c 70 54 61 62 2d  =0 && iCol<pTab-
8f00: 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 7a 54 79  >nCol ){.    zTy
8f10: 70 65 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b  pe = pTab->aCol[
8f20: 69 43 6f 6c 5d 2e 7a 54 79 70 65 3b 0a 20 20 7d  iCol].zType;.  }
8f30: 0a 20 20 69 66 28 20 7a 54 79 70 65 20 26 26 20  .  if( zType && 
8f40: 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a  sqlite3StrICmp(z
8f50: 54 79 70 65 2c 20 22 49 4e 54 45 47 45 52 22 29  Type, "INTEGER")
8f60: 3d 3d 30 0a 20 20 20 20 20 20 20 20 26 26 20 73  ==0.        && s
8f70: 6f 72 74 4f 72 64 65 72 3d 3d 53 51 4c 49 54 45  ortOrder==SQLITE
8f80: 5f 53 4f 5f 41 53 43 20 29 7b 0a 20 20 20 20 70  _SO_ASC ){.    p
8f90: 54 61 62 2d 3e 69 50 4b 65 79 20 3d 20 69 43 6f  Tab->iPKey = iCo
8fa0: 6c 3b 0a 20 20 20 20 70 54 61 62 2d 3e 6b 65 79  l;.    pTab->key
8fb0: 43 6f 6e 66 20 3d 20 6f 6e 45 72 72 6f 72 3b 0a  Conf = onError;.
8fc0: 20 20 20 20 70 54 61 62 2d 3e 61 75 74 6f 49 6e      pTab->autoIn
8fd0: 63 20 3d 20 61 75 74 6f 49 6e 63 3b 0a 20 20 7d  c = autoInc;.  }
8fe0: 65 6c 73 65 20 69 66 28 20 61 75 74 6f 49 6e 63  else if( autoInc
8ff0: 20 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   ){.#ifndef SQLI
9000: 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 43 52  TE_OMIT_AUTOINCR
9010: 45 4d 45 4e 54 0a 20 20 20 20 73 71 6c 69 74 65  EMENT.    sqlite
9020: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
9030: 2c 20 22 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54  , "AUTOINCREMENT
9040: 20 69 73 20 6f 6e 6c 79 20 61 6c 6c 6f 77 65 64   is only allowed
9050: 20 6f 6e 20 61 6e 20 22 0a 20 20 20 20 20 20 20   on an ".       
9060: 22 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59  "INTEGER PRIMARY
9070: 20 4b 45 59 22 29 3b 0a 23 65 6e 64 69 66 0a 20   KEY");.#endif. 
9080: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69   }else{.    sqli
9090: 74 65 33 43 72 65 61 74 65 49 6e 64 65 78 28 70  te3CreateIndex(p
90a0: 50 61 72 73 65 2c 20 30 2c 20 30 2c 20 30 2c 20  Parse, 0, 0, 0, 
90b0: 70 4c 69 73 74 2c 20 6f 6e 45 72 72 6f 72 2c 20  pList, onError, 
90c0: 30 2c 20 30 2c 20 73 6f 72 74 4f 72 64 65 72 2c  0, 0, sortOrder,
90d0: 20 30 29 3b 0a 20 20 20 20 70 4c 69 73 74 20 3d   0);.    pList =
90e0: 20 30 3b 0a 20 20 7d 0a 0a 70 72 69 6d 61 72 79   0;.  }..primary
90f0: 5f 6b 65 79 5f 65 78 69 74 3a 0a 20 20 73 71 6c  _key_exit:.  sql
9100: 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65  ite3ExprListDele
9110: 74 65 28 70 4c 69 73 74 29 3b 0a 20 20 72 65 74  te(pList);.  ret
9120: 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64  urn;.}../*.** Ad
9130: 64 20 61 20 6e 65 77 20 43 48 45 43 4b 20 63 6f  d a new CHECK co
9140: 6e 73 74 72 61 69 6e 74 20 74 6f 20 74 68 65 20  nstraint to the 
9150: 74 61 62 6c 65 20 63 75 72 72 65 6e 74 6c 79 20  table currently 
9160: 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69  under constructi
9170: 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  on..*/.void sqli
9180: 74 65 33 41 64 64 43 68 65 63 6b 43 6f 6e 73 74  te3AddCheckConst
9190: 72 61 69 6e 74 28 0a 20 20 50 61 72 73 65 20 2a  raint(.  Parse *
91a0: 70 50 61 72 73 65 2c 20 20 20 20 2f 2a 20 50 61  pParse,    /* Pa
91b0: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
91c0: 0a 20 20 45 78 70 72 20 2a 70 43 68 65 63 6b 45  .  Expr *pCheckE
91d0: 78 70 72 20 20 2f 2a 20 54 68 65 20 63 68 65 63  xpr  /* The chec
91e0: 6b 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a  k expression */.
91f0: 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ){.#ifndef SQLIT
9200: 45 5f 4f 4d 49 54 5f 43 48 45 43 4b 0a 20 20 54  E_OMIT_CHECK.  T
9210: 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 50 61  able *pTab = pPa
9220: 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a  rse->pNewTable;.
9230: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
9240: 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66  pParse->db;.  if
9250: 28 20 70 54 61 62 20 26 26 20 21 49 4e 5f 44 45  ( pTab && !IN_DE
9260: 43 4c 41 52 45 5f 56 54 41 42 20 29 7b 0a 20 20  CLARE_VTAB ){.  
9270: 20 20 2f 2a 20 54 68 65 20 43 48 45 43 4b 20 65    /* The CHECK e
9280: 78 70 72 65 73 73 69 6f 6e 20 6d 75 73 74 20 62  xpression must b
9290: 65 20 64 75 70 6c 69 63 61 74 65 64 20 73 6f 20  e duplicated so 
92a0: 74 68 61 74 20 74 6f 6b 65 6e 73 20 72 65 66 65  that tokens refe
92b0: 72 0a 20 20 20 20 2a 2a 20 74 6f 20 6d 61 6c 6c  r.    ** to mall
92c0: 6f 63 65 64 20 73 70 61 63 65 20 61 6e 64 20 6e  oced space and n
92d0: 6f 74 20 74 68 65 20 28 65 70 68 65 6d 65 72 61  ot the (ephemera
92e0: 6c 29 20 74 65 78 74 20 6f 66 20 74 68 65 20 43  l) text of the C
92f0: 52 45 41 54 45 20 54 41 42 4c 45 0a 20 20 20 20  REATE TABLE.    
9300: 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a  ** statement */.
9310: 20 20 20 20 70 54 61 62 2d 3e 70 43 68 65 63 6b      pTab->pCheck
9320: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e   = sqlite3ExprAn
9330: 64 28 64 62 2c 20 70 54 61 62 2d 3e 70 43 68 65  d(db, pTab->pChe
9340: 63 6b 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  ck, .           
9350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9360: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
9370: 70 72 44 75 70 28 64 62 2c 20 70 43 68 65 63 6b  prDup(db, pCheck
9380: 45 78 70 72 29 29 3b 0a 20 20 7d 0a 23 65 6e 64  Expr));.  }.#end
9390: 69 66 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  if.  sqlite3Expr
93a0: 44 65 6c 65 74 65 28 70 43 68 65 63 6b 45 78 70  Delete(pCheckExp
93b0: 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74  r);.}../*.** Set
93c0: 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 66   the collation f
93d0: 75 6e 63 74 69 6f 6e 20 6f 66 20 74 68 65 20 6d  unction of the m
93e0: 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 70 61 72  ost recently par
93f0: 73 65 64 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e  sed table column
9400: 0a 2a 2a 20 74 6f 20 74 68 65 20 43 6f 6c 6c 53  .** to the CollS
9410: 65 71 20 67 69 76 65 6e 2e 0a 2a 2f 0a 76 6f 69  eq given..*/.voi
9420: 64 20 73 71 6c 69 74 65 33 41 64 64 43 6f 6c 6c  d sqlite3AddColl
9430: 61 74 65 54 79 70 65 28 50 61 72 73 65 20 2a 70  ateType(Parse *p
9440: 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 54  Parse, Token *pT
9450: 6f 6b 65 6e 29 7b 0a 20 20 54 61 62 6c 65 20 2a  oken){.  Table *
9460: 70 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 68  p;.  int i;.  ch
9470: 61 72 20 2a 7a 43 6f 6c 6c 3b 20 20 20 20 20 20  ar *zColl;      
9480: 20 20 20 20 20 20 20 20 2f 2a 20 44 65 71 75 6f          /* Dequo
9490: 74 65 64 20 6e 61 6d 65 20 6f 66 20 63 6f 6c 6c  ted name of coll
94a0: 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 2a  ation sequence *
94b0: 2f 0a 0a 20 20 69 66 28 20 28 70 20 3d 20 70 50  /..  if( (p = pP
94c0: 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29  arse->pNewTable)
94d0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
94e0: 69 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 0a  i = p->nCol-1;..
94f0: 20 20 7a 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65    zColl = sqlite
9500: 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70  3NameFromToken(p
9510: 50 61 72 73 65 2d 3e 64 62 2c 20 70 54 6f 6b 65  Parse->db, pToke
9520: 6e 29 3b 0a 20 20 69 66 28 20 21 7a 43 6f 6c 6c  n);.  if( !zColl
9530: 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 69 66   ) return;..  if
9540: 28 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 43  ( sqlite3LocateC
9550: 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 7a  ollSeq(pParse, z
9560: 43 6f 6c 6c 2c 20 2d 31 29 20 29 7b 0a 20 20 20  Coll, -1) ){.   
9570: 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20   Index *pIdx;.  
9580: 20 20 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 43 6f    p->aCol[i].zCo
9590: 6c 6c 20 3d 20 7a 43 6f 6c 6c 3b 0a 20 20 0a 20  ll = zColl;.  . 
95a0: 20 20 20 2f 2a 20 49 66 20 74 68 65 20 63 6f 6c     /* If the col
95b0: 75 6d 6e 20 69 73 20 64 65 63 6c 61 72 65 64 20  umn is declared 
95c0: 61 73 20 22 3c 6e 61 6d 65 3e 20 50 52 49 4d 41  as "<name> PRIMA
95d0: 52 59 20 4b 45 59 20 43 4f 4c 4c 41 54 45 20 3c  RY KEY COLLATE <
95e0: 74 79 70 65 3e 22 2c 0a 20 20 20 20 2a 2a 20 74  type>",.    ** t
95f0: 68 65 6e 20 61 6e 20 69 6e 64 65 78 20 6d 61 79  hen an index may
9600: 20 68 61 76 65 20 62 65 65 6e 20 63 72 65 61 74   have been creat
9610: 65 64 20 6f 6e 20 74 68 69 73 20 63 6f 6c 75 6d  ed on this colum
9620: 6e 20 62 65 66 6f 72 65 20 74 68 65 0a 20 20 20  n before the.   
9630: 20 2a 2a 20 63 6f 6c 6c 61 74 69 6f 6e 20 74 79   ** collation ty
9640: 70 65 20 77 61 73 20 61 64 64 65 64 2e 20 43 6f  pe was added. Co
9650: 72 72 65 63 74 20 74 68 69 73 20 69 66 20 69 74  rrect this if it
9660: 20 69 73 20 74 68 65 20 63 61 73 65 2e 0a 20 20   is the case..  
9670: 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70 49 64    */.    for(pId
9680: 78 3d 70 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64  x=p->pIndex; pId
9690: 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e  x; pIdx=pIdx->pN
96a0: 65 78 74 29 7b 0a 20 20 20 20 20 20 61 73 73 65  ext){.      asse
96b0: 72 74 28 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d  rt( pIdx->nColum
96c0: 6e 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 69 66  n==1 );.      if
96d0: 28 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e  ( pIdx->aiColumn
96e0: 5b 30 5d 3d 3d 69 20 29 7b 0a 20 20 20 20 20 20  [0]==i ){.      
96f0: 20 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 30    pIdx->azColl[0
9700: 5d 20 3d 20 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a  ] = p->aCol[i].z
9710: 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Coll;.      }.  
9720: 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
9730: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43   sqlite3_free(zC
9740: 6f 6c 6c 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  oll);.  }.}../*.
9750: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
9760: 20 72 65 74 75 72 6e 73 20 74 68 65 20 63 6f 6c   returns the col
9770: 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20  lation sequence 
9780: 66 6f 72 20 64 61 74 61 62 61 73 65 20 6e 61 74  for database nat
9790: 69 76 65 20 74 65 78 74 0a 2a 2a 20 65 6e 63 6f  ive text.** enco
97a0: 64 69 6e 67 20 69 64 65 6e 74 69 66 69 65 64 20  ding identified 
97b0: 62 79 20 74 68 65 20 73 74 72 69 6e 67 20 7a 4e  by the string zN
97c0: 61 6d 65 2c 20 6c 65 6e 67 74 68 20 6e 4e 61 6d  ame, length nNam
97d0: 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  e..**.** If the 
97e0: 72 65 71 75 65 73 74 65 64 20 63 6f 6c 6c 61 74  requested collat
97f0: 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 69 73 20  ion sequence is 
9800: 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 2c 20 6f  not available, o
9810: 72 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 0a  r not available.
9820: 2a 2a 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  ** in the databa
9830: 73 65 20 6e 61 74 69 76 65 20 65 6e 63 6f 64 69  se native encodi
9840: 6e 67 2c 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f  ng, the collatio
9850: 6e 20 66 61 63 74 6f 72 79 20 69 73 20 69 6e 76  n factory is inv
9860: 6f 6b 65 64 20 74 6f 0a 2a 2a 20 72 65 71 75 65  oked to.** reque
9870: 73 74 20 69 74 2e 20 49 66 20 74 68 65 20 63 6f  st it. If the co
9880: 6c 6c 61 74 69 6f 6e 20 66 61 63 74 6f 72 79 20  llation factory 
9890: 64 6f 65 73 20 6e 6f 74 20 73 75 70 70 6c 79 20  does not supply 
98a0: 73 75 63 68 20 61 20 73 65 71 75 65 6e 63 65 2c  such a sequence,
98b0: 0a 2a 2a 20 61 6e 64 20 74 68 65 20 73 65 71 75  .** and the sequ
98c0: 65 6e 63 65 20 69 73 20 61 76 61 69 6c 61 62 6c  ence is availabl
98d0: 65 20 69 6e 20 61 6e 6f 74 68 65 72 20 74 65 78  e in another tex
98e0: 74 20 65 6e 63 6f 64 69 6e 67 2c 20 74 68 65 6e  t encoding, then
98f0: 20 74 68 61 74 20 69 73 0a 2a 2a 20 72 65 74 75   that is.** retu
9900: 72 6e 65 64 20 69 6e 73 74 65 61 64 2e 0a 2a 2a  rned instead..**
9910: 0a 2a 2a 20 49 66 20 6e 6f 20 76 65 72 73 69 6f  .** If no versio
9920: 6e 73 20 6f 66 20 74 68 65 20 72 65 71 75 65 73  ns of the reques
9930: 74 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 73 20 73  ted collations s
9940: 65 71 75 65 6e 63 65 20 61 72 65 20 61 76 61 69  equence are avai
9950: 6c 61 62 6c 65 2c 20 6f 72 0a 2a 2a 20 61 6e 6f  lable, or.** ano
9960: 74 68 65 72 20 65 72 72 6f 72 20 6f 63 63 75 72  ther error occur
9970: 73 2c 20 4e 55 4c 4c 20 69 73 20 72 65 74 75 72  s, NULL is retur
9980: 6e 65 64 20 61 6e 64 20 61 6e 20 65 72 72 6f 72  ned and an error
9990: 20 6d 65 73 73 61 67 65 20 77 72 69 74 74 65 6e   message written
99a0: 20 69 6e 74 6f 0a 2a 2a 20 70 50 61 72 73 65 2e   into.** pParse.
99b0: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
99c0: 69 6e 65 20 69 73 20 61 20 77 72 61 70 70 65 72  ine is a wrapper
99d0: 20 61 72 6f 75 6e 64 20 73 71 6c 69 74 65 33 46   around sqlite3F
99e0: 69 6e 64 43 6f 6c 6c 53 65 71 28 29 2e 20 20 54  indCollSeq().  T
99f0: 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69  his routine.** i
9a00: 6e 76 6f 6b 65 73 20 74 68 65 20 63 6f 6c 6c 61  nvokes the colla
9a10: 74 69 6f 6e 20 66 61 63 74 6f 72 79 20 69 66 20  tion factory if 
9a20: 74 68 65 20 6e 61 6d 65 64 20 63 6f 6c 6c 61 74  the named collat
9a30: 69 6f 6e 20 63 61 6e 6e 6f 74 20 62 65 20 66 6f  ion cannot be fo
9a40: 75 6e 64 0a 2a 2a 20 61 6e 64 20 67 65 6e 65 72  und.** and gener
9a50: 61 74 65 73 20 61 6e 20 65 72 72 6f 72 20 6d 65  ates an error me
9a60: 73 73 61 67 65 2e 0a 2a 2f 0a 43 6f 6c 6c 53 65  ssage..*/.CollSe
9a70: 71 20 2a 73 71 6c 69 74 65 33 4c 6f 63 61 74 65  q *sqlite3Locate
9a80: 43 6f 6c 6c 53 65 71 28 50 61 72 73 65 20 2a 70  CollSeq(Parse *p
9a90: 50 61 72 73 65 2c 20 63 6f 6e 73 74 20 63 68 61  Parse, const cha
9aa0: 72 20 2a 7a 4e 61 6d 65 2c 20 69 6e 74 20 6e 4e  r *zName, int nN
9ab0: 61 6d 65 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  ame){.  sqlite3 
9ac0: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
9ad0: 3b 0a 20 20 75 38 20 65 6e 63 20 3d 20 45 4e 43  ;.  u8 enc = ENC
9ae0: 28 64 62 29 3b 0a 20 20 75 38 20 69 6e 69 74 62  (db);.  u8 initb
9af0: 75 73 79 20 3d 20 64 62 2d 3e 69 6e 69 74 2e 62  usy = db->init.b
9b00: 75 73 79 3b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a  usy;.  CollSeq *
9b10: 70 43 6f 6c 6c 3b 0a 0a 20 20 70 43 6f 6c 6c 20  pColl;..  pColl 
9b20: 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c  = sqlite3FindCol
9b30: 6c 53 65 71 28 64 62 2c 20 65 6e 63 2c 20 7a 4e  lSeq(db, enc, zN
9b40: 61 6d 65 2c 20 6e 4e 61 6d 65 2c 20 69 6e 69 74  ame, nName, init
9b50: 62 75 73 79 29 3b 0a 20 20 69 66 28 20 21 69 6e  busy);.  if( !in
9b60: 69 74 62 75 73 79 20 26 26 20 28 21 70 43 6f 6c  itbusy && (!pCol
9b70: 6c 20 7c 7c 20 21 70 43 6f 6c 6c 2d 3e 78 43 6d  l || !pColl->xCm
9b80: 70 29 20 29 7b 0a 20 20 20 20 70 43 6f 6c 6c 20  p) ){.    pColl 
9b90: 3d 20 73 71 6c 69 74 65 33 47 65 74 43 6f 6c 6c  = sqlite3GetColl
9ba0: 53 65 71 28 64 62 2c 20 70 43 6f 6c 6c 2c 20 7a  Seq(db, pColl, z
9bb0: 4e 61 6d 65 2c 20 6e 4e 61 6d 65 29 3b 0a 20 20  Name, nName);.  
9bc0: 20 20 69 66 28 20 21 70 43 6f 6c 6c 20 29 7b 0a    if( !pColl ){.
9bd0: 20 20 20 20 20 20 69 66 28 20 6e 4e 61 6d 65 3c        if( nName<
9be0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 4e 61  0 ){.        nNa
9bf0: 6d 65 20 3d 20 73 74 72 6c 65 6e 28 7a 4e 61 6d  me = strlen(zNam
9c00: 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e);.      }.    
9c10: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
9c20: 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 73 75  g(pParse, "no su
9c30: 63 68 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  ch collation seq
9c40: 75 65 6e 63 65 3a 20 25 2e 2a 73 22 2c 20 6e 4e  uence: %.*s", nN
9c50: 61 6d 65 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20  ame, zName);.   
9c60: 20 20 20 70 43 6f 6c 6c 20 3d 20 30 3b 0a 20 20     pColl = 0;.  
9c70: 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72    }.  }..  retur
9c80: 6e 20 70 43 6f 6c 6c 3b 0a 7d 0a 0a 0a 2f 2a 0a  n pColl;.}.../*.
9c90: 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
9ca0: 20 74 68 61 74 20 77 69 6c 6c 20 69 6e 63 72 65   that will incre
9cb0: 6d 65 6e 74 20 74 68 65 20 73 63 68 65 6d 61 20  ment the schema 
9cc0: 63 6f 6f 6b 69 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  cookie..**.** Th
9cd0: 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 20  e schema cookie 
9ce0: 69 73 20 75 73 65 64 20 74 6f 20 64 65 74 65 72  is used to deter
9cf0: 6d 69 6e 65 20 77 68 65 6e 20 74 68 65 20 73 63  mine when the sc
9d00: 68 65 6d 61 20 66 6f 72 20 74 68 65 0a 2a 2a 20  hema for the.** 
9d10: 64 61 74 61 62 61 73 65 20 63 68 61 6e 67 65 73  database changes
9d20: 2e 20 20 41 66 74 65 72 20 65 61 63 68 20 73 63  .  After each sc
9d30: 68 65 6d 61 20 63 68 61 6e 67 65 2c 20 74 68 65  hema change, the
9d40: 20 63 6f 6f 6b 69 65 20 76 61 6c 75 65 0a 2a 2a   cookie value.**
9d50: 20 63 68 61 6e 67 65 73 2e 20 20 57 68 65 6e 20   changes.  When 
9d60: 61 20 70 72 6f 63 65 73 73 20 66 69 72 73 74 20  a process first 
9d70: 72 65 61 64 73 20 74 68 65 20 73 63 68 65 6d 61  reads the schema
9d80: 20 69 74 20 72 65 63 6f 72 64 73 20 74 68 65 0a   it records the.
9d90: 2a 2a 20 63 6f 6f 6b 69 65 2e 20 20 54 68 65 72  ** cookie.  Ther
9da0: 65 61 66 74 65 72 2c 20 77 68 65 6e 65 76 65 72  eafter, whenever
9db0: 20 69 74 20 67 6f 65 73 20 74 6f 20 61 63 63 65   it goes to acce
9dc0: 73 73 20 74 68 65 20 64 61 74 61 62 61 73 65 2c  ss the database,
9dd0: 0a 2a 2a 20 69 74 20 63 68 65 63 6b 73 20 74 68  .** it checks th
9de0: 65 20 63 6f 6f 6b 69 65 20 74 6f 20 6d 61 6b 65  e cookie to make
9df0: 20 73 75 72 65 20 74 68 65 20 73 63 68 65 6d 61   sure the schema
9e00: 20 68 61 73 20 6e 6f 74 20 63 68 61 6e 67 65 64   has not changed
9e10: 0a 2a 2a 20 73 69 6e 63 65 20 69 74 20 77 61 73  .** since it was
9e20: 20 6c 61 73 74 20 72 65 61 64 2e 0a 2a 2a 0a 2a   last read..**.*
9e30: 2a 20 54 68 69 73 20 70 6c 61 6e 20 69 73 20 6e  * This plan is n
9e40: 6f 74 20 63 6f 6d 70 6c 65 74 65 6c 79 20 62 75  ot completely bu
9e50: 6c 6c 65 74 2d 70 72 6f 6f 66 2e 20 20 49 74 20  llet-proof.  It 
9e60: 69 73 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 0a  is possible for.
9e70: 2a 2a 20 74 68 65 20 73 63 68 65 6d 61 20 74 6f  ** the schema to
9e80: 20 63 68 61 6e 67 65 20 6d 75 6c 74 69 70 6c 65   change multiple
9e90: 20 74 69 6d 65 73 20 61 6e 64 20 66 6f 72 20 74   times and for t
9ea0: 68 65 20 63 6f 6f 6b 69 65 20 74 6f 20 62 65 0a  he cookie to be.
9eb0: 2a 2a 20 73 65 74 20 62 61 63 6b 20 74 6f 20 70  ** set back to p
9ec0: 72 69 6f 72 20 76 61 6c 75 65 2e 20 20 42 75 74  rior value.  But
9ed0: 20 73 63 68 65 6d 61 20 63 68 61 6e 67 65 73 20   schema changes 
9ee0: 61 72 65 20 69 6e 66 72 65 71 75 65 6e 74 0a 2a  are infrequent.*
9ef0: 2a 20 61 6e 64 20 74 68 65 20 70 72 6f 62 61 62  * and the probab
9f00: 69 6c 69 74 79 20 6f 66 20 68 69 74 74 69 6e 67  ility of hitting
9f10: 20 74 68 65 20 73 61 6d 65 20 63 6f 6f 6b 69 65   the same cookie
9f20: 20 76 61 6c 75 65 20 69 73 20 6f 6e 6c 79 0a 2a   value is only.*
9f30: 2a 20 31 20 63 68 61 6e 63 65 20 69 6e 20 32 5e  * 1 chance in 2^
9f40: 33 32 2e 20 20 53 6f 20 77 65 27 72 65 20 73 61  32.  So we're sa
9f50: 66 65 20 65 6e 6f 75 67 68 2e 0a 2a 2f 0a 76 6f  fe enough..*/.vo
9f60: 69 64 20 73 71 6c 69 74 65 33 43 68 61 6e 67 65  id sqlite3Change
9f70: 43 6f 6f 6b 69 65 28 50 61 72 73 65 20 2a 70 50  Cookie(Parse *pP
9f80: 61 72 73 65 2c 20 69 6e 74 20 69 44 62 29 7b 0a  arse, int iDb){.
9f90: 20 20 69 6e 74 20 72 31 20 3d 20 73 71 6c 69 74    int r1 = sqlit
9fa0: 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
9fb0: 72 73 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 20  rse);.  sqlite3 
9fc0: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
9fd0: 3b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  ;.  Vdbe *v = pP
9fe0: 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 73  arse->pVdbe;.  s
9ff0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
a000: 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
a010: 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53 63  db->aDb[iDb].pSc
a020: 68 65 6d 61 2d 3e 73 63 68 65 6d 61 5f 63 6f 6f  hema->schema_coo
a030: 6b 69 65 2b 31 2c 20 72 31 29 3b 0a 20 20 73 71  kie+1, r1);.  sq
a040: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
a050: 76 2c 20 4f 50 5f 53 65 74 43 6f 6f 6b 69 65 2c  v, OP_SetCookie,
a060: 20 69 44 62 2c 20 30 2c 20 72 31 29 3b 0a 20 20   iDb, 0, r1);.  
a070: 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
a080: 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 31  mpReg(pParse, r1
a090: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 65 61 73  );.}../*.** Meas
a0a0: 75 72 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ure the number o
a0b0: 66 20 63 68 61 72 61 63 74 65 72 73 20 6e 65 65  f characters nee
a0c0: 64 65 64 20 74 6f 20 6f 75 74 70 75 74 20 74 68  ded to output th
a0d0: 65 20 67 69 76 65 6e 0a 2a 2a 20 69 64 65 6e 74  e given.** ident
a0e0: 69 66 69 65 72 2e 20 20 54 68 65 20 6e 75 6d 62  ifier.  The numb
a0f0: 65 72 20 72 65 74 75 72 6e 65 64 20 69 6e 63 6c  er returned incl
a100: 75 64 65 73 20 61 6e 79 20 71 75 6f 74 65 73 20  udes any quotes 
a110: 75 73 65 64 0a 2a 2a 20 62 75 74 20 64 6f 65 73  used.** but does
a120: 20 6e 6f 74 20 69 6e 63 6c 75 64 65 20 74 68 65   not include the
a130: 20 6e 75 6c 6c 20 74 65 72 6d 69 6e 61 74 6f 72   null terminator
a140: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 65 73 74 69  ..**.** The esti
a150: 6d 61 74 65 20 69 73 20 63 6f 6e 73 65 72 76 61  mate is conserva
a160: 74 69 76 65 2e 20 20 49 74 20 6d 69 67 68 74 20  tive.  It might 
a170: 62 65 20 6c 61 72 67 65 72 20 74 68 61 74 20 77  be larger that w
a180: 68 61 74 20 69 73 0a 2a 2a 20 72 65 61 6c 6c 79  hat is.** really
a190: 20 6e 65 65 64 65 64 2e 0a 2a 2f 0a 73 74 61 74   needed..*/.stat
a1a0: 69 63 20 69 6e 74 20 69 64 65 6e 74 4c 65 6e 67  ic int identLeng
a1b0: 74 68 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  th(const char *z
a1c0: 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 66 6f  ){.  int n;.  fo
a1d0: 72 28 6e 3d 30 3b 20 2a 7a 3b 20 6e 2b 2b 2c 20  r(n=0; *z; n++, 
a1e0: 7a 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 2a 7a  z++){.    if( *z
a1f0: 3d 3d 27 22 27 20 29 7b 20 6e 2b 2b 3b 20 7d 0a  =='"' ){ n++; }.
a200: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 20 2b    }.  return n +
a210: 20 32 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69   2;.}../*.** Wri
a220: 74 65 20 61 6e 20 69 64 65 6e 74 69 66 69 65 72  te an identifier
a230: 20 6f 6e 74 6f 20 74 68 65 20 65 6e 64 20 6f 66   onto the end of
a240: 20 74 68 65 20 67 69 76 65 6e 20 73 74 72 69 6e   the given strin
a250: 67 2e 20 20 41 64 64 0a 2a 2a 20 71 75 6f 74 65  g.  Add.** quote
a260: 20 63 68 61 72 61 63 74 65 72 73 20 61 73 20 6e   characters as n
a270: 65 65 64 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  eeded..*/.static
a280: 20 76 6f 69 64 20 69 64 65 6e 74 50 75 74 28 63   void identPut(c
a290: 68 61 72 20 2a 7a 2c 20 69 6e 74 20 2a 70 49 64  har *z, int *pId
a2a0: 78 2c 20 63 68 61 72 20 2a 7a 53 69 67 6e 65 64  x, char *zSigned
a2b0: 49 64 65 6e 74 29 7b 0a 20 20 75 6e 73 69 67 6e  Ident){.  unsign
a2c0: 65 64 20 63 68 61 72 20 2a 7a 49 64 65 6e 74 20  ed char *zIdent 
a2d0: 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72  = (unsigned char
a2e0: 2a 29 7a 53 69 67 6e 65 64 49 64 65 6e 74 3b 0a  *)zSignedIdent;.
a2f0: 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6e 65 65 64    int i, j, need
a300: 51 75 6f 74 65 3b 0a 20 20 69 20 3d 20 2a 70 49  Quote;.  i = *pI
a310: 64 78 3b 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 7a  dx;.  for(j=0; z
a320: 49 64 65 6e 74 5b 6a 5d 3b 20 6a 2b 2b 29 7b 0a  Ident[j]; j++){.
a330: 20 20 20 20 69 66 28 20 21 69 73 61 6c 6e 75 6d      if( !isalnum
a340: 28 7a 49 64 65 6e 74 5b 6a 5d 29 20 26 26 20 7a  (zIdent[j]) && z
a350: 49 64 65 6e 74 5b 6a 5d 21 3d 27 5f 27 20 29 20  Ident[j]!='_' ) 
a360: 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 6e 65 65  break;.  }.  nee
a370: 64 51 75 6f 74 65 20 3d 20 20 7a 49 64 65 6e 74  dQuote =  zIdent
a380: 5b 6a 5d 21 3d 30 20 7c 7c 20 69 73 64 69 67 69  [j]!=0 || isdigi
a390: 74 28 7a 49 64 65 6e 74 5b 30 5d 29 0a 20 20 20  t(zIdent[0]).   
a3a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
a3b0: 7c 20 73 71 6c 69 74 65 33 4b 65 79 77 6f 72 64  | sqlite3Keyword
a3c0: 43 6f 64 65 28 7a 49 64 65 6e 74 2c 20 6a 29 21  Code(zIdent, j)!
a3d0: 3d 54 4b 5f 49 44 3b 0a 20 20 69 66 28 20 6e 65  =TK_ID;.  if( ne
a3e0: 65 64 51 75 6f 74 65 20 29 20 7a 5b 69 2b 2b 5d  edQuote ) z[i++]
a3f0: 20 3d 20 27 22 27 3b 0a 20 20 66 6f 72 28 6a 3d   = '"';.  for(j=
a400: 30 3b 20 7a 49 64 65 6e 74 5b 6a 5d 3b 20 6a 2b  0; zIdent[j]; j+
a410: 2b 29 7b 0a 20 20 20 20 7a 5b 69 2b 2b 5d 20 3d  +){.    z[i++] =
a420: 20 7a 49 64 65 6e 74 5b 6a 5d 3b 0a 20 20 20 20   zIdent[j];.    
a430: 69 66 28 20 7a 49 64 65 6e 74 5b 6a 5d 3d 3d 27  if( zIdent[j]=='
a440: 22 27 20 29 20 7a 5b 69 2b 2b 5d 20 3d 20 27 22  "' ) z[i++] = '"
a450: 27 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 65 65  ';.  }.  if( nee
a460: 64 51 75 6f 74 65 20 29 20 7a 5b 69 2b 2b 5d 20  dQuote ) z[i++] 
a470: 3d 20 27 22 27 3b 0a 20 20 7a 5b 69 5d 20 3d 20  = '"';.  z[i] = 
a480: 30 3b 0a 20 20 2a 70 49 64 78 20 3d 20 69 3b 0a  0;.  *pIdx = i;.
a490: 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
a4a0: 65 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45  e a CREATE TABLE
a4b0: 20 73 74 61 74 65 6d 65 6e 74 20 61 70 70 72 6f   statement appro
a4c0: 70 72 69 61 74 65 20 66 6f 72 20 74 68 65 20 67  priate for the g
a4d0: 69 76 65 6e 0a 2a 2a 20 74 61 62 6c 65 2e 20 20  iven.** table.  
a4e0: 4d 65 6d 6f 72 79 20 74 6f 20 68 6f 6c 64 20 74  Memory to hold t
a4f0: 68 65 20 74 65 78 74 20 6f 66 20 74 68 65 20 73  he text of the s
a500: 74 61 74 65 6d 65 6e 74 20 69 73 20 6f 62 74 61  tatement is obta
a510: 69 6e 65 64 0a 2a 2a 20 66 72 6f 6d 20 73 71 6c  ined.** from sql
a520: 69 74 65 4d 61 6c 6c 6f 63 28 29 20 61 6e 64 20  iteMalloc() and 
a530: 6d 75 73 74 20 62 65 20 66 72 65 65 64 20 62 79  must be freed by
a540: 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e   the calling fun
a550: 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ction..*/.static
a560: 20 63 68 61 72 20 2a 63 72 65 61 74 65 54 61 62   char *createTab
a570: 6c 65 53 74 6d 74 28 54 61 62 6c 65 20 2a 70 2c  leStmt(Table *p,
a580: 20 69 6e 74 20 69 73 54 65 6d 70 29 7b 0a 20 20   int isTemp){.  
a590: 69 6e 74 20 69 2c 20 6b 2c 20 6e 3b 0a 20 20 63  int i, k, n;.  c
a5a0: 68 61 72 20 2a 7a 53 74 6d 74 3b 0a 20 20 63 68  har *zStmt;.  ch
a5b0: 61 72 20 2a 7a 53 65 70 2c 20 2a 7a 53 65 70 32  ar *zSep, *zSep2
a5c0: 2c 20 2a 7a 45 6e 64 2c 20 2a 7a 3b 0a 20 20 43  , *zEnd, *z;.  C
a5d0: 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 6e  olumn *pCol;.  n
a5e0: 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70 43 6f 6c   = 0;.  for(pCol
a5f0: 20 3d 20 70 2d 3e 61 43 6f 6c 2c 20 69 3d 30 3b   = p->aCol, i=0;
a600: 20 69 3c 70 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c   i<p->nCol; i++,
a610: 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 6e 20   pCol++){.    n 
a620: 2b 3d 20 69 64 65 6e 74 4c 65 6e 67 74 68 28 70  += identLength(p
a630: 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  Col->zName);.   
a640: 20 7a 20 3d 20 70 43 6f 6c 2d 3e 7a 54 79 70 65   z = pCol->zType
a650: 3b 0a 20 20 20 20 69 66 28 20 7a 20 29 7b 0a 20  ;.    if( z ){. 
a660: 20 20 20 20 20 6e 20 2b 3d 20 28 73 74 72 6c 65       n += (strle
a670: 6e 28 7a 29 20 2b 20 31 29 3b 0a 20 20 20 20 7d  n(z) + 1);.    }
a680: 0a 20 20 7d 0a 20 20 6e 20 2b 3d 20 69 64 65 6e  .  }.  n += iden
a690: 74 4c 65 6e 67 74 68 28 70 2d 3e 7a 4e 61 6d 65  tLength(p->zName
a6a0: 29 3b 0a 20 20 69 66 28 20 6e 3c 35 30 20 29 7b  );.  if( n<50 ){
a6b0: 0a 20 20 20 20 7a 53 65 70 20 3d 20 22 22 3b 0a  .    zSep = "";.
a6c0: 20 20 20 20 7a 53 65 70 32 20 3d 20 22 2c 22 3b      zSep2 = ",";
a6d0: 0a 20 20 20 20 7a 45 6e 64 20 3d 20 22 29 22 3b  .    zEnd = ")";
a6e0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 53  .  }else{.    zS
a6f0: 65 70 20 3d 20 22 5c 6e 20 20 22 3b 0a 20 20 20  ep = "\n  ";.   
a700: 20 7a 53 65 70 32 20 3d 20 22 2c 5c 6e 20 20 22   zSep2 = ",\n  "
a710: 3b 0a 20 20 20 20 7a 45 6e 64 20 3d 20 22 5c 6e  ;.    zEnd = "\n
a720: 29 22 3b 0a 20 20 7d 0a 20 20 6e 20 2b 3d 20 33  )";.  }.  n += 3
a730: 35 20 2b 20 36 2a 70 2d 3e 6e 43 6f 6c 3b 0a 20  5 + 6*p->nCol;. 
a740: 20 7a 53 74 6d 74 20 3d 20 73 71 6c 69 74 65 33   zStmt = sqlite3
a750: 5f 6d 61 6c 6c 6f 63 28 20 6e 20 29 3b 0a 20 20  _malloc( n );.  
a760: 69 66 28 20 7a 53 74 6d 74 3d 3d 30 20 29 20 72  if( zStmt==0 ) r
a770: 65 74 75 72 6e 20 30 3b 0a 20 20 73 71 6c 69 74  eturn 0;.  sqlit
a780: 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 2c 20 7a  e3_snprintf(n, z
a790: 53 74 6d 74 2c 0a 20 20 20 20 20 20 20 20 20 20  Stmt,.          
a7a0: 20 20 20 20 20 20 20 20 21 4f 4d 49 54 5f 54 45          !OMIT_TE
a7b0: 4d 50 44 42 26 26 69 73 54 65 6d 70 20 3f 20 22  MPDB&&isTemp ? "
a7c0: 43 52 45 41 54 45 20 54 45 4d 50 20 54 41 42 4c  CREATE TEMP TABL
a7d0: 45 20 22 3a 22 43 52 45 41 54 45 20 54 41 42 4c  E ":"CREATE TABL
a7e0: 45 20 22 29 3b 0a 20 20 6b 20 3d 20 73 74 72 6c  E ");.  k = strl
a7f0: 65 6e 28 7a 53 74 6d 74 29 3b 0a 20 20 69 64 65  en(zStmt);.  ide
a800: 6e 74 50 75 74 28 7a 53 74 6d 74 2c 20 26 6b 2c  ntPut(zStmt, &k,
a810: 20 70 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 7a 53   p->zName);.  zS
a820: 74 6d 74 5b 6b 2b 2b 5d 20 3d 20 27 28 27 3b 0a  tmt[k++] = '(';.
a830: 20 20 66 6f 72 28 70 43 6f 6c 3d 70 2d 3e 61 43    for(pCol=p->aC
a840: 6f 6c 2c 20 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43  ol, i=0; i<p->nC
a850: 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29  ol; i++, pCol++)
a860: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e  {.    sqlite3_sn
a870: 70 72 69 6e 74 66 28 6e 2d 6b 2c 20 26 7a 53 74  printf(n-k, &zSt
a880: 6d 74 5b 6b 5d 2c 20 7a 53 65 70 29 3b 0a 20 20  mt[k], zSep);.  
a890: 20 20 6b 20 2b 3d 20 73 74 72 6c 65 6e 28 26 7a    k += strlen(&z
a8a0: 53 74 6d 74 5b 6b 5d 29 3b 0a 20 20 20 20 7a 53  Stmt[k]);.    zS
a8b0: 65 70 20 3d 20 7a 53 65 70 32 3b 0a 20 20 20 20  ep = zSep2;.    
a8c0: 69 64 65 6e 74 50 75 74 28 7a 53 74 6d 74 2c 20  identPut(zStmt, 
a8d0: 26 6b 2c 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 29  &k, pCol->zName)
a8e0: 3b 0a 20 20 20 20 69 66 28 20 28 7a 20 3d 20 70  ;.    if( (z = p
a8f0: 43 6f 6c 2d 3e 7a 54 79 70 65 29 21 3d 30 20 29  Col->zType)!=0 )
a900: 7b 0a 20 20 20 20 20 20 7a 53 74 6d 74 5b 6b 2b  {.      zStmt[k+
a910: 2b 5d 20 3d 20 27 20 27 3b 0a 20 20 20 20 20 20  +] = ' ';.      
a920: 61 73 73 65 72 74 28 20 73 74 72 6c 65 6e 28 7a  assert( strlen(z
a930: 29 2b 6b 2b 31 3c 3d 6e 20 29 3b 0a 20 20 20 20  )+k+1<=n );.    
a940: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
a950: 74 66 28 6e 2d 6b 2c 20 26 7a 53 74 6d 74 5b 6b  tf(n-k, &zStmt[k
a960: 5d 2c 20 22 25 73 22 2c 20 7a 29 3b 0a 20 20 20  ], "%s", z);.   
a970: 20 20 20 6b 20 2b 3d 20 73 74 72 6c 65 6e 28 7a     k += strlen(z
a980: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73  );.    }.  }.  s
a990: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
a9a0: 6e 2d 6b 2c 20 26 7a 53 74 6d 74 5b 6b 5d 2c 20  n-k, &zStmt[k], 
a9b0: 22 25 73 22 2c 20 7a 45 6e 64 29 3b 0a 20 20 72  "%s", zEnd);.  r
a9c0: 65 74 75 72 6e 20 7a 53 74 6d 74 3b 0a 7d 0a 0a  eturn zStmt;.}..
a9d0: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
a9e0: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20  ne is called to 
a9f0: 72 65 70 6f 72 74 20 74 68 65 20 66 69 6e 61 6c  report the final
aa00: 20 22 29 22 20 74 68 61 74 20 74 65 72 6d 69 6e   ")" that termin
aa10: 61 74 65 73 0a 2a 2a 20 61 20 43 52 45 41 54 45  ates.** a CREATE
aa20: 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74   TABLE statement
aa30: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 61 62 6c  ..**.** The tabl
aa40: 65 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74  e structure that
aa50: 20 6f 74 68 65 72 20 61 63 74 69 6f 6e 20 72 6f   other action ro
aa60: 75 74 69 6e 65 73 20 68 61 76 65 20 62 65 65 6e  utines have been
aa70: 20 62 75 69 6c 64 69 6e 67 0a 2a 2a 20 69 73 20   building.** is 
aa80: 61 64 64 65 64 20 74 6f 20 74 68 65 20 69 6e 74  added to the int
aa90: 65 72 6e 61 6c 20 68 61 73 68 20 74 61 62 6c 65  ernal hash table
aaa0: 73 2c 20 61 73 73 75 6d 69 6e 67 20 6e 6f 20 65  s, assuming no e
aab0: 72 72 6f 72 73 20 68 61 76 65 0a 2a 2a 20 6f 63  rrors have.** oc
aac0: 63 75 72 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 6e  curred..**.** An
aad0: 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20 74   entry for the t
aae0: 61 62 6c 65 20 69 73 20 6d 61 64 65 20 69 6e 20  able is made in 
aaf0: 74 68 65 20 6d 61 73 74 65 72 20 74 61 62 6c 65  the master table
ab00: 20 6f 6e 20 64 69 73 6b 2c 20 75 6e 6c 65 73 73   on disk, unless
ab10: 0a 2a 2a 20 74 68 69 73 20 69 73 20 61 20 74 65  .** this is a te
ab20: 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 6f 72  mporary table or
ab30: 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d   db->init.busy==
ab40: 31 2e 20 20 57 68 65 6e 20 64 62 2d 3e 69 6e 69  1.  When db->ini
ab50: 74 2e 62 75 73 79 3d 3d 31 0a 2a 2a 20 69 74 20  t.busy==1.** it 
ab60: 6d 65 61 6e 73 20 77 65 20 61 72 65 20 72 65 61  means we are rea
ab70: 64 69 6e 67 20 74 68 65 20 73 71 6c 69 74 65 5f  ding the sqlite_
ab80: 6d 61 73 74 65 72 20 74 61 62 6c 65 20 62 65 63  master table bec
ab90: 61 75 73 65 20 77 65 20 6a 75 73 74 0a 2a 2a 20  ause we just.** 
aba0: 63 6f 6e 6e 65 63 74 65 64 20 74 6f 20 74 68 65  connected to the
abb0: 20 64 61 74 61 62 61 73 65 20 6f 72 20 62 65 63   database or bec
abc0: 61 75 73 65 20 74 68 65 20 73 71 6c 69 74 65 5f  ause the sqlite_
abd0: 6d 61 73 74 65 72 20 74 61 62 6c 65 20 68 61 73  master table has
abe0: 0a 2a 2a 20 72 65 63 65 6e 74 6c 79 20 63 68 61  .** recently cha
abf0: 6e 67 65 64 2c 20 73 6f 20 74 68 65 20 65 6e 74  nged, so the ent
ac00: 72 79 20 66 6f 72 20 74 68 69 73 20 74 61 62 6c  ry for this tabl
ac10: 65 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73  e already exists
ac20: 20 69 6e 0a 2a 2a 20 74 68 65 20 73 71 6c 69 74   in.** the sqlit
ac30: 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 2e 20  e_master table. 
ac40: 20 57 65 20 64 6f 20 6e 6f 74 20 77 61 6e 74 20   We do not want 
ac50: 74 6f 20 63 72 65 61 74 65 20 69 74 20 61 67 61  to create it aga
ac60: 69 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  in..**.** If the
ac70: 20 70 53 65 6c 65 63 74 20 61 72 67 75 6d 65 6e   pSelect argumen
ac80: 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 69  t is not NULL, i
ac90: 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 69  t means that thi
aca0: 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 77 61 73  s routine.** was
acb0: 20 63 61 6c 6c 65 64 20 74 6f 20 63 72 65 61 74   called to creat
acc0: 65 20 61 20 74 61 62 6c 65 20 67 65 6e 65 72 61  e a table genera
acd0: 74 65 64 20 66 72 6f 6d 20 61 20 0a 2a 2a 20 22  ted from a .** "
ace0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 2e 2e 2e  CREATE TABLE ...
acf0: 20 41 53 20 53 45 4c 45 43 54 20 2e 2e 2e 22 20   AS SELECT ..." 
ad00: 73 74 61 74 65 6d 65 6e 74 2e 20 20 54 68 65 20  statement.  The 
ad10: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 6f 66 0a  column names of.
ad20: 2a 2a 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65  ** the new table
ad30: 20 77 69 6c 6c 20 6d 61 74 63 68 20 74 68 65 20   will match the 
ad40: 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68  result set of th
ad50: 65 20 53 45 4c 45 43 54 2e 0a 2a 2f 0a 76 6f 69  e SELECT..*/.voi
ad60: 64 20 73 71 6c 69 74 65 33 45 6e 64 54 61 62 6c  d sqlite3EndTabl
ad70: 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  e(.  Parse *pPar
ad80: 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  se,          /* 
ad90: 50 61 72 73 65 20 63 6f 6e 74 65 78 74 20 2a 2f  Parse context */
ada0: 0a 20 20 54 6f 6b 65 6e 20 2a 70 43 6f 6e 73 2c  .  Token *pCons,
adb0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
adc0: 65 20 27 2c 27 20 74 6f 6b 65 6e 20 61 66 74 65  e ',' token afte
add0: 72 20 74 68 65 20 6c 61 73 74 20 63 6f 6c 75 6d  r the last colum
ade0: 6e 20 64 65 66 6e 2e 20 2a 2f 0a 20 20 54 6f 6b  n defn. */.  Tok
adf0: 65 6e 20 2a 70 45 6e 64 2c 20 20 20 20 20 20 20  en *pEnd,       
ae00: 20 20 20 20 20 2f 2a 20 54 68 65 20 66 69 6e 61       /* The fina
ae10: 6c 20 27 29 27 20 74 6f 6b 65 6e 20 69 6e 20 74  l ')' token in t
ae20: 68 65 20 43 52 45 41 54 45 20 54 41 42 4c 45 20  he CREATE TABLE 
ae30: 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65  */.  Select *pSe
ae40: 6c 65 63 74 20 20 20 20 20 20 20 20 20 2f 2a 20  lect         /* 
ae50: 53 65 6c 65 63 74 20 66 72 6f 6d 20 61 20 22 43  Select from a "C
ae60: 52 45 41 54 45 20 2e 2e 2e 20 41 53 20 53 45 4c  REATE ... AS SEL
ae70: 45 43 54 22 20 2a 2f 0a 29 7b 0a 20 20 54 61 62  ECT" */.){.  Tab
ae80: 6c 65 20 2a 70 3b 0a 20 20 73 71 6c 69 74 65 33  le *p;.  sqlite3
ae90: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
aea0: 62 3b 0a 20 20 69 6e 74 20 69 44 62 3b 0a 0a 20  b;.  int iDb;.. 
aeb0: 20 69 66 28 20 28 70 45 6e 64 3d 3d 30 20 26 26   if( (pEnd==0 &&
aec0: 20 70 53 65 6c 65 63 74 3d 3d 30 29 20 7c 7c 20   pSelect==0) || 
aed0: 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20  pParse->nErr || 
aee0: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
aef0: 20 29 20 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b   ) {.    return;
af00: 0a 20 20 7d 0a 20 20 70 20 3d 20 70 50 61 72 73  .  }.  p = pPars
af10: 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20  e->pNewTable;.  
af20: 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72  if( p==0 ) retur
af30: 6e 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 21 64  n;..  assert( !d
af40: 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 7c 7c 20  b->init.busy || 
af50: 21 70 53 65 6c 65 63 74 20 29 3b 0a 0a 20 20 69  !pSelect );..  i
af60: 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65  Db = sqlite3Sche
af70: 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 2d  maToIndex(db, p-
af80: 3e 70 53 63 68 65 6d 61 29 3b 0a 0a 23 69 66 6e  >pSchema);..#ifn
af90: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
afa0: 43 48 45 43 4b 0a 20 20 2f 2a 20 52 65 73 6f 6c  CHECK.  /* Resol
afb0: 76 65 20 6e 61 6d 65 73 20 69 6e 20 61 6c 6c 20  ve names in all 
afc0: 43 48 45 43 4b 20 63 6f 6e 73 74 72 61 69 6e 74  CHECK constraint
afd0: 20 65 78 70 72 65 73 73 69 6f 6e 73 2e 0a 20 20   expressions..  
afe0: 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 43 68 65  */.  if( p->pChe
aff0: 63 6b 20 29 7b 0a 20 20 20 20 53 72 63 4c 69 73  ck ){.    SrcLis
b000: 74 20 73 53 72 63 3b 20 20 20 20 20 20 20 20 20  t sSrc;         
b010: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 61 6b            /* Fak
b020: 65 20 53 72 63 4c 69 73 74 20 66 6f 72 20 70 50  e SrcList for pP
b030: 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20  arse->pNewTable 
b040: 2a 2f 0a 20 20 20 20 4e 61 6d 65 43 6f 6e 74 65  */.    NameConte
b050: 78 74 20 73 4e 43 3b 20 20 20 20 20 20 20 20 20  xt sNC;         
b060: 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 63         /* Name c
b070: 6f 6e 74 65 78 74 20 66 6f 72 20 70 50 61 72 73  ontext for pPars
b080: 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 2a 2f 0a  e->pNewTable */.
b090: 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 73 4e 43  .    memset(&sNC
b0a0: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 4e 43 29  , 0, sizeof(sNC)
b0b0: 29 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 73  );.    memset(&s
b0c0: 53 72 63 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73  Src, 0, sizeof(s
b0d0: 53 72 63 29 29 3b 0a 20 20 20 20 73 53 72 63 2e  Src));.    sSrc.
b0e0: 6e 53 72 63 20 3d 20 31 3b 0a 20 20 20 20 73 53  nSrc = 1;.    sS
b0f0: 72 63 2e 61 5b 30 5d 2e 7a 4e 61 6d 65 20 3d 20  rc.a[0].zName = 
b100: 70 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 73 53  p->zName;.    sS
b110: 72 63 2e 61 5b 30 5d 2e 70 54 61 62 20 3d 20 70  rc.a[0].pTab = p
b120: 3b 0a 20 20 20 20 73 53 72 63 2e 61 5b 30 5d 2e  ;.    sSrc.a[0].
b130: 69 43 75 72 73 6f 72 20 3d 20 2d 31 3b 0a 20 20  iCursor = -1;.  
b140: 20 20 73 4e 43 2e 70 50 61 72 73 65 20 3d 20 70    sNC.pParse = p
b150: 50 61 72 73 65 3b 0a 20 20 20 20 73 4e 43 2e 70  Parse;.    sNC.p
b160: 53 72 63 4c 69 73 74 20 3d 20 26 73 53 72 63 3b  SrcList = &sSrc;
b170: 0a 20 20 20 20 73 4e 43 2e 69 73 43 68 65 63 6b  .    sNC.isCheck
b180: 20 3d 20 31 3b 0a 20 20 20 20 69 66 28 20 73 71   = 1;.    if( sq
b190: 6c 69 74 65 33 45 78 70 72 52 65 73 6f 6c 76 65  lite3ExprResolve
b1a0: 4e 61 6d 65 73 28 26 73 4e 43 2c 20 70 2d 3e 70  Names(&sNC, p->p
b1b0: 43 68 65 63 6b 29 20 29 7b 0a 20 20 20 20 20 20  Check) ){.      
b1c0: 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20  return;.    }.  
b1d0: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66  }.#endif /* !def
b1e0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
b1f0: 5f 43 48 45 43 4b 29 20 2a 2f 0a 0a 20 20 2f 2a  _CHECK) */..  /*
b200: 20 49 66 20 74 68 65 20 64 62 2d 3e 69 6e 69 74   If the db->init
b210: 2e 62 75 73 79 20 69 73 20 31 20 69 74 20 6d 65  .busy is 1 it me
b220: 61 6e 73 20 77 65 20 61 72 65 20 72 65 61 64 69  ans we are readi
b230: 6e 67 20 74 68 65 20 53 51 4c 20 6f 66 66 20 74  ng the SQL off t
b240: 68 65 0a 20 20 2a 2a 20 22 73 71 6c 69 74 65 5f  he.  ** "sqlite_
b250: 6d 61 73 74 65 72 22 20 6f 72 20 22 73 71 6c 69  master" or "sqli
b260: 74 65 5f 74 65 6d 70 5f 6d 61 73 74 65 72 22 20  te_temp_master" 
b270: 74 61 62 6c 65 20 6f 6e 20 74 68 65 20 64 69 73  table on the dis
b280: 6b 2e 0a 20 20 2a 2a 20 53 6f 20 64 6f 20 6e 6f  k..  ** So do no
b290: 74 20 77 72 69 74 65 20 74 6f 20 74 68 65 20 64  t write to the d
b2a0: 69 73 6b 20 61 67 61 69 6e 2e 20 20 45 78 74 72  isk again.  Extr
b2b0: 61 63 74 20 74 68 65 20 72 6f 6f 74 20 70 61 67  act the root pag
b2c0: 65 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 66 6f  e number.  ** fo
b2d0: 72 20 74 68 65 20 74 61 62 6c 65 20 66 72 6f 6d  r the table from
b2e0: 20 74 68 65 20 64 62 2d 3e 69 6e 69 74 2e 6e 65   the db->init.ne
b2f0: 77 54 6e 75 6d 20 66 69 65 6c 64 2e 20 20 28 54  wTnum field.  (T
b300: 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 0a 20  he page number. 
b310: 20 2a 2a 20 73 68 6f 75 6c 64 20 68 61 76 65 20   ** should have 
b320: 62 65 65 6e 20 70 75 74 20 74 68 65 72 65 20 62  been put there b
b330: 79 20 74 68 65 20 73 71 6c 69 74 65 4f 70 65 6e  y the sqliteOpen
b340: 43 62 20 72 6f 75 74 69 6e 65 2e 29 0a 20 20 2a  Cb routine.).  *
b350: 2f 0a 20 20 69 66 28 20 64 62 2d 3e 69 6e 69 74  /.  if( db->init
b360: 2e 62 75 73 79 20 29 7b 0a 20 20 20 20 70 2d 3e  .busy ){.    p->
b370: 74 6e 75 6d 20 3d 20 64 62 2d 3e 69 6e 69 74 2e  tnum = db->init.
b380: 6e 65 77 54 6e 75 6d 3b 0a 20 20 7d 0a 0a 20 20  newTnum;.  }..  
b390: 2f 2a 20 49 66 20 6e 6f 74 20 69 6e 69 74 69 61  /* If not initia
b3a0: 6c 69 7a 69 6e 67 2c 20 74 68 65 6e 20 63 72 65  lizing, then cre
b3b0: 61 74 65 20 61 20 72 65 63 6f 72 64 20 66 6f 72  ate a record for
b3c0: 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 0a 20   the new table. 
b3d0: 20 2a 2a 20 69 6e 20 74 68 65 20 53 51 4c 49 54   ** in the SQLIT
b3e0: 45 5f 4d 41 53 54 45 52 20 74 61 62 6c 65 20 6f  E_MASTER table o
b3f0: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  f the database. 
b400: 20 54 68 65 20 72 65 63 6f 72 64 20 6e 75 6d 62   The record numb
b410: 65 72 0a 20 20 2a 2a 20 66 6f 72 20 74 68 65 20  er.  ** for the 
b420: 6e 65 77 20 74 61 62 6c 65 20 65 6e 74 72 79 20  new table entry 
b430: 73 68 6f 75 6c 64 20 61 6c 72 65 61 64 79 20 62  should already b
b440: 65 20 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e 0a  e on the stack..
b450: 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68 69    **.  ** If thi
b460: 73 20 69 73 20 61 20 54 45 4d 50 4f 52 41 52 59  s is a TEMPORARY
b470: 20 74 61 62 6c 65 2c 20 77 72 69 74 65 20 74 68   table, write th
b480: 65 20 65 6e 74 72 79 20 69 6e 74 6f 20 74 68 65  e entry into the
b490: 20 61 75 78 69 6c 69 61 72 79 0a 20 20 2a 2a 20   auxiliary.  ** 
b4a0: 66 69 6c 65 20 69 6e 73 74 65 61 64 20 6f 66 20  file instead of 
b4b0: 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20 64 61  into the main da
b4c0: 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 2a  tabase file..  *
b4d0: 2f 0a 20 20 69 66 28 20 21 64 62 2d 3e 69 6e 69  /.  if( !db->ini
b4e0: 74 2e 62 75 73 79 20 29 7b 0a 20 20 20 20 69 6e  t.busy ){.    in
b4f0: 74 20 6e 3b 0a 20 20 20 20 56 64 62 65 20 2a 76  t n;.    Vdbe *v
b500: 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 54 79 70  ;.    char *zTyp
b510: 65 3b 20 20 20 20 2f 2a 20 22 76 69 65 77 22 20  e;    /* "view" 
b520: 6f 72 20 22 74 61 62 6c 65 22 20 2a 2f 0a 20 20  or "table" */.  
b530: 20 20 63 68 61 72 20 2a 7a 54 79 70 65 32 3b 20    char *zType2; 
b540: 20 20 2f 2a 20 22 56 49 45 57 22 20 6f 72 20 22    /* "VIEW" or "
b550: 54 41 42 4c 45 22 20 2a 2f 0a 20 20 20 20 63 68  TABLE" */.    ch
b560: 61 72 20 2a 7a 53 74 6d 74 3b 20 20 20 20 2f 2a  ar *zStmt;    /*
b570: 20 54 65 78 74 20 6f 66 20 74 68 65 20 43 52 45   Text of the CRE
b580: 41 54 45 20 54 41 42 4c 45 20 6f 72 20 43 52 45  ATE TABLE or CRE
b590: 41 54 45 20 56 49 45 57 20 73 74 61 74 65 6d 65  ATE VIEW stateme
b5a0: 6e 74 20 2a 2f 0a 0a 20 20 20 20 76 20 3d 20 73  nt */..    v = s
b5b0: 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
b5c0: 61 72 73 65 29 3b 0a 20 20 20 20 69 66 28 20 76  arse);.    if( v
b5d0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20  ==0 ) return;.. 
b5e0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
b5f0: 64 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65  dOp1(v, OP_Close
b600: 2c 20 30 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 72  , 0);..    /* Cr
b610: 65 61 74 65 20 74 68 65 20 72 6f 6f 74 70 61 67  eate the rootpag
b620: 65 20 66 6f 72 20 74 68 65 20 6e 65 77 20 74 61  e for the new ta
b630: 62 6c 65 20 61 6e 64 20 70 75 73 68 20 69 74 20  ble and push it 
b640: 6f 6e 74 6f 20 74 68 65 20 73 74 61 63 6b 2e 0a  onto the stack..
b650: 20 20 20 20 2a 2a 20 41 20 76 69 65 77 20 68 61      ** A view ha
b660: 73 20 6e 6f 20 72 6f 6f 74 70 61 67 65 2c 20 73  s no rootpage, s
b670: 6f 20 6a 75 73 74 20 70 75 73 68 20 61 20 7a 65  o just push a ze
b680: 72 6f 20 6f 6e 74 6f 20 74 68 65 20 73 74 61 63  ro onto the stac
b690: 6b 20 66 6f 72 0a 20 20 20 20 2a 2a 20 76 69 65  k for.    ** vie
b6a0: 77 73 2e 20 20 49 6e 69 74 69 61 6c 69 7a 65 20  ws.  Initialize 
b6b0: 7a 54 79 70 65 20 61 74 20 74 68 65 20 73 61 6d  zType at the sam
b6c0: 65 20 74 69 6d 65 2e 0a 20 20 20 20 2a 2f 0a 20  e time..    */. 
b6d0: 20 20 20 69 66 28 20 70 2d 3e 70 53 65 6c 65 63     if( p->pSelec
b6e0: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a  t==0 ){.      /*
b6f0: 20 41 20 72 65 67 75 6c 61 72 20 74 61 62 6c 65   A regular table
b700: 20 2a 2f 0a 20 20 20 20 20 20 7a 54 79 70 65 20   */.      zType 
b710: 3d 20 22 74 61 62 6c 65 22 3b 0a 20 20 20 20 20  = "table";.     
b720: 20 7a 54 79 70 65 32 20 3d 20 22 54 41 42 4c 45   zType2 = "TABLE
b730: 22 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ";.#ifndef SQLIT
b740: 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 20 20 20 20  E_OMIT_VIEW.    
b750: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20  }else{.      /* 
b760: 41 20 76 69 65 77 20 2a 2f 0a 20 20 20 20 20 20  A view */.      
b770: 7a 54 79 70 65 20 3d 20 22 76 69 65 77 22 3b 0a  zType = "view";.
b780: 20 20 20 20 20 20 7a 54 79 70 65 32 20 3d 20 22        zType2 = "
b790: 56 49 45 57 22 3b 0a 23 65 6e 64 69 66 0a 20 20  VIEW";.#endif.  
b7a0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74    }..    /* If t
b7b0: 68 69 73 20 69 73 20 61 20 43 52 45 41 54 45 20  his is a CREATE 
b7c0: 54 41 42 4c 45 20 78 78 20 41 53 20 53 45 4c 45  TABLE xx AS SELE
b7d0: 43 54 20 2e 2e 2e 2c 20 65 78 65 63 75 74 65 20  CT ..., execute 
b7e0: 74 68 65 20 53 45 4c 45 43 54 0a 20 20 20 20 2a  the SELECT.    *
b7f0: 2a 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 70  * statement to p
b800: 6f 70 75 6c 61 74 65 20 74 68 65 20 6e 65 77 20  opulate the new 
b810: 74 61 62 6c 65 2e 20 54 68 65 20 72 6f 6f 74 2d  table. The root-
b820: 70 61 67 65 20 6e 75 6d 62 65 72 20 66 6f 72 20  page number for 
b830: 74 68 65 0a 20 20 20 20 2a 2a 20 6e 65 77 20 74  the.    ** new t
b840: 61 62 6c 65 20 69 73 20 6f 6e 20 74 68 65 20 74  able is on the t
b850: 6f 70 20 6f 66 20 74 68 65 20 76 64 62 65 20 73  op of the vdbe s
b860: 74 61 63 6b 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  tack..    **.   
b870: 20 2a 2a 20 4f 6e 63 65 20 74 68 65 20 53 45 4c   ** Once the SEL
b880: 45 43 54 20 68 61 73 20 62 65 65 6e 20 63 6f 64  ECT has been cod
b890: 65 64 20 62 79 20 73 71 6c 69 74 65 33 53 65 6c  ed by sqlite3Sel
b8a0: 65 63 74 28 29 2c 20 69 74 20 69 73 20 69 6e 20  ect(), it is in 
b8b0: 61 0a 20 20 20 20 2a 2a 20 73 75 69 74 61 62 6c  a.    ** suitabl
b8c0: 65 20 73 74 61 74 65 20 74 6f 20 71 75 65 72 79  e state to query
b8d0: 20 66 6f 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20   for the column 
b8e0: 6e 61 6d 65 73 20 61 6e 64 20 74 79 70 65 73 20  names and types 
b8f0: 74 6f 20 62 65 20 75 73 65 64 0a 20 20 20 20 2a  to be used.    *
b900: 2a 20 62 79 20 74 68 65 20 6e 65 77 20 74 61 62  * by the new tab
b910: 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  le..    **.    *
b920: 2a 20 41 20 73 68 61 72 65 64 2d 63 61 63 68 65  * A shared-cache
b930: 20 77 72 69 74 65 2d 6c 6f 63 6b 20 69 73 20 6e   write-lock is n
b940: 6f 74 20 72 65 71 75 69 72 65 64 20 74 6f 20 77  ot required to w
b950: 72 69 74 65 20 74 6f 20 74 68 65 20 6e 65 77 20  rite to the new 
b960: 74 61 62 6c 65 2c 0a 20 20 20 20 2a 2a 20 61 73  table,.    ** as
b970: 20 61 20 73 63 68 65 6d 61 2d 6c 6f 63 6b 20 6d   a schema-lock m
b980: 75 73 74 20 68 61 76 65 20 61 6c 72 65 61 64 79  ust have already
b990: 20 62 65 65 6e 20 6f 62 74 61 69 6e 65 64 20 74   been obtained t
b9a0: 6f 20 63 72 65 61 74 65 20 69 74 2e 20 53 69 6e  o create it. Sin
b9b0: 63 65 0a 20 20 20 20 2a 2a 20 61 20 73 63 68 65  ce.    ** a sche
b9c0: 6d 61 2d 6c 6f 63 6b 20 65 78 63 6c 75 64 65 73  ma-lock excludes
b9d0: 20 61 6c 6c 20 6f 74 68 65 72 20 64 61 74 61 62   all other datab
b9e0: 61 73 65 20 75 73 65 72 73 2c 20 74 68 65 20 77  ase users, the w
b9f0: 72 69 74 65 2d 6c 6f 63 6b 20 77 6f 75 6c 64 0a  rite-lock would.
ba00: 20 20 20 20 2a 2a 20 62 65 20 72 65 64 75 6e 64      ** be redund
ba10: 61 6e 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ant..    */.    
ba20: 69 66 28 20 70 53 65 6c 65 63 74 20 29 7b 0a 20  if( pSelect ){. 
ba30: 20 20 20 20 20 53 65 6c 65 63 74 44 65 73 74 20       SelectDest 
ba40: 64 65 73 74 3b 0a 20 20 20 20 20 20 54 61 62 6c  dest;.      Tabl
ba50: 65 20 2a 70 53 65 6c 54 61 62 3b 0a 0a 20 20 20  e *pSelTab;..   
ba60: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
ba70: 64 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 57  dOp3(v, OP_OpenW
ba80: 72 69 74 65 2c 20 31 2c 20 70 50 61 72 73 65 2d  rite, 1, pParse-
ba90: 3e 72 65 67 52 6f 6f 74 2c 20 69 44 62 29 3b 0a  >regRoot, iDb);.
baa0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
bab0: 65 43 68 61 6e 67 65 50 35 28 76 2c 20 31 29 3b  eChangeP5(v, 1);
bac0: 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  .      pParse->n
bad0: 54 61 62 20 3d 20 32 3b 0a 20 20 20 20 20 20 73  Tab = 2;.      s
bae0: 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73 74  qlite3SelectDest
baf0: 49 6e 69 74 28 26 64 65 73 74 2c 20 53 52 54 5f  Init(&dest, SRT_
bb00: 54 61 62 6c 65 2c 20 31 29 3b 0a 20 20 20 20 20  Table, 1);.     
bb10: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70   sqlite3Select(p
bb20: 50 61 72 73 65 2c 20 70 53 65 6c 65 63 74 2c 20  Parse, pSelect, 
bb30: 26 64 65 73 74 2c 20 30 2c 20 30 2c 20 30 2c 20  &dest, 0, 0, 0, 
bb40: 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
bb50: 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
bb60: 50 5f 43 6c 6f 73 65 2c 20 31 29 3b 0a 20 20 20  P_Close, 1);.   
bb70: 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e     if( pParse->n
bb80: 45 72 72 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Err==0 ){.      
bb90: 20 20 70 53 65 6c 54 61 62 20 3d 20 73 71 6c 69    pSelTab = sqli
bba0: 74 65 33 52 65 73 75 6c 74 53 65 74 4f 66 53 65  te3ResultSetOfSe
bbb0: 6c 65 63 74 28 70 50 61 72 73 65 2c 20 30 2c 20  lect(pParse, 0, 
bbc0: 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20  pSelect);.      
bbd0: 20 20 69 66 28 20 70 53 65 6c 54 61 62 3d 3d 30    if( pSelTab==0
bbe0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20   ) return;.     
bbf0: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 43     assert( p->aC
bc00: 6f 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  ol==0 );.       
bc10: 20 70 2d 3e 6e 43 6f 6c 20 3d 20 70 53 65 6c 54   p->nCol = pSelT
bc20: 61 62 2d 3e 6e 43 6f 6c 3b 0a 20 20 20 20 20 20  ab->nCol;.      
bc30: 20 20 70 2d 3e 61 43 6f 6c 20 3d 20 70 53 65 6c    p->aCol = pSel
bc40: 54 61 62 2d 3e 61 43 6f 6c 3b 0a 20 20 20 20 20  Tab->aCol;.     
bc50: 20 20 20 70 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c     pSelTab->nCol
bc60: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70 53   = 0;.        pS
bc70: 65 6c 54 61 62 2d 3e 61 43 6f 6c 20 3d 20 30 3b  elTab->aCol = 0;
bc80: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
bc90: 44 65 6c 65 74 65 54 61 62 6c 65 28 70 53 65 6c  DeleteTable(pSel
bca0: 54 61 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Tab);.      }.  
bcb0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d 70    }..    /* Comp
bcc0: 75 74 65 20 74 68 65 20 63 6f 6d 70 6c 65 74 65  ute the complete
bcd0: 20 74 65 78 74 20 6f 66 20 74 68 65 20 43 52 45   text of the CRE
bce0: 41 54 45 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  ATE statement */
bcf0: 0a 20 20 20 20 69 66 28 20 70 53 65 6c 65 63 74  .    if( pSelect
bd00: 20 29 7b 0a 20 20 20 20 20 20 7a 53 74 6d 74 20   ){.      zStmt 
bd10: 3d 20 63 72 65 61 74 65 54 61 62 6c 65 53 74 6d  = createTableStm
bd20: 74 28 70 2c 20 70 2d 3e 70 53 63 68 65 6d 61 3d  t(p, p->pSchema=
bd30: 3d 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 53 63 68  =db->aDb[1].pSch
bd40: 65 6d 61 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ema);.    }else{
bd50: 0a 20 20 20 20 20 20 6e 20 3d 20 70 45 6e 64 2d  .      n = pEnd-
bd60: 3e 7a 20 2d 20 70 50 61 72 73 65 2d 3e 73 4e 61  >z - pParse->sNa
bd70: 6d 65 54 6f 6b 65 6e 2e 7a 20 2b 20 31 3b 0a 20  meToken.z + 1;. 
bd80: 20 20 20 20 20 7a 53 74 6d 74 20 3d 20 73 71 6c       zStmt = sql
bd90: 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20  ite3MPrintf(db, 
bda0: 0a 20 20 20 20 20 20 20 20 20 20 22 43 52 45 41  .          "CREA
bdb0: 54 45 20 25 73 20 25 2e 2a 73 22 2c 20 7a 54 79  TE %s %.*s", zTy
bdc0: 70 65 32 2c 20 6e 2c 20 70 50 61 72 73 65 2d 3e  pe2, n, pParse->
bdd0: 73 4e 61 6d 65 54 6f 6b 65 6e 2e 7a 0a 20 20 20  sNameToken.z.   
bde0: 20 20 20 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20     );.    }..   
bdf0: 20 2f 2a 20 41 20 73 6c 6f 74 20 66 6f 72 20 74   /* A slot for t
be00: 68 65 20 72 65 63 6f 72 64 20 68 61 73 20 61 6c  he record has al
be10: 72 65 61 64 79 20 62 65 65 6e 20 61 6c 6c 6f 63  ready been alloc
be20: 61 74 65 64 20 69 6e 20 74 68 65 20 0a 20 20 20  ated in the .   
be30: 20 2a 2a 20 53 51 4c 49 54 45 5f 4d 41 53 54 45   ** SQLITE_MASTE
be40: 52 20 74 61 62 6c 65 2e 20 20 57 65 20 6a 75 73  R table.  We jus
be50: 74 20 6e 65 65 64 20 74 6f 20 75 70 64 61 74 65  t need to update
be60: 20 74 68 61 74 20 73 6c 6f 74 20 77 69 74 68 20   that slot with 
be70: 61 6c 6c 0a 20 20 20 20 2a 2a 20 74 68 65 20 69  all.    ** the i
be80: 6e 66 6f 72 6d 61 74 69 6f 6e 20 77 65 27 76 65  nformation we've
be90: 20 63 6f 6c 6c 65 63 74 65 64 2e 20 20 54 68 65   collected.  The
bea0: 20 72 6f 77 69 64 20 66 6f 72 20 74 68 65 20 70   rowid for the p
beb0: 72 65 61 6c 6c 6f 63 61 74 65 64 0a 20 20 20 20  reallocated.    
bec0: 2a 2a 20 73 6c 6f 74 20 69 73 20 74 68 65 20 32  ** slot is the 2
bed0: 6e 64 20 69 74 65 6d 20 6f 6e 20 74 68 65 20 73  nd item on the s
bee0: 74 61 63 6b 2e 20 20 54 68 65 20 74 6f 70 20 6f  tack.  The top o
bef0: 66 20 74 68 65 20 73 74 61 63 6b 20 69 73 20 74  f the stack is t
bf00: 68 65 0a 20 20 20 20 2a 2a 20 72 6f 6f 74 20 70  he.    ** root p
bf10: 61 67 65 20 66 6f 72 20 74 68 65 20 6e 65 77 20  age for the new 
bf20: 74 61 62 6c 65 20 28 6f 72 20 61 20 30 20 69 66  table (or a 0 if
bf30: 20 74 68 69 73 20 69 73 20 61 20 76 69 65 77 29   this is a view)
bf40: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c  ..    */.    sql
bf50: 69 74 65 33 4e 65 73 74 65 64 50 61 72 73 65 28  ite3NestedParse(
bf60: 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 22 55  pParse,.      "U
bf70: 50 44 41 54 45 20 25 51 2e 25 73 20 22 0a 20 20  PDATE %Q.%s ".  
bf80: 20 20 20 20 20 20 20 22 53 45 54 20 74 79 70 65         "SET type
bf90: 3d 27 25 73 27 2c 20 6e 61 6d 65 3d 25 51 2c 20  ='%s', name=%Q, 
bfa0: 74 62 6c 5f 6e 61 6d 65 3d 25 51 2c 20 72 6f 6f  tbl_name=%Q, roo
bfb0: 74 70 61 67 65 3d 23 25 64 2c 20 73 71 6c 3d 25  tpage=#%d, sql=%
bfc0: 51 20 22 0a 20 20 20 20 20 20 20 22 57 48 45 52  Q ".       "WHER
bfd0: 45 20 72 6f 77 69 64 3d 23 25 64 22 2c 0a 20 20  E rowid=#%d",.  
bfe0: 20 20 20 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d      db->aDb[iDb]
bff0: 2e 7a 4e 61 6d 65 2c 20 53 43 48 45 4d 41 5f 54  .zName, SCHEMA_T
c000: 41 42 4c 45 28 69 44 62 29 2c 0a 20 20 20 20 20  ABLE(iDb),.     
c010: 20 7a 54 79 70 65 2c 0a 20 20 20 20 20 20 70 2d   zType,.      p-
c020: 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 70 2d  >zName,.      p-
c030: 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 70 50  >zName,.      pP
c040: 61 72 73 65 2d 3e 72 65 67 52 6f 6f 74 2c 0a 20  arse->regRoot,. 
c050: 20 20 20 20 20 7a 53 74 6d 74 2c 0a 20 20 20 20       zStmt,.    
c060: 20 20 70 50 61 72 73 65 2d 3e 72 65 67 52 6f 77    pParse->regRow
c070: 69 64 0a 20 20 20 20 29 3b 0a 20 20 20 20 73 71  id.    );.    sq
c080: 6c 69 74 65 33 5f 66 72 65 65 28 7a 53 74 6d 74  lite3_free(zStmt
c090: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 43 68  );.    sqlite3Ch
c0a0: 61 6e 67 65 43 6f 6f 6b 69 65 28 70 50 61 72 73  angeCookie(pPars
c0b0: 65 2c 20 69 44 62 29 3b 0a 0a 23 69 66 6e 64 65  e, iDb);..#ifnde
c0c0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
c0d0: 54 4f 49 4e 43 52 45 4d 45 4e 54 0a 20 20 20 20  TOINCREMENT.    
c0e0: 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20  /* Check to see 
c0f0: 69 66 20 77 65 20 6e 65 65 64 20 74 6f 20 63 72  if we need to cr
c100: 65 61 74 65 20 61 6e 20 73 71 6c 69 74 65 5f 73  eate an sqlite_s
c110: 65 71 75 65 6e 63 65 20 74 61 62 6c 65 20 66 6f  equence table fo
c120: 72 0a 20 20 20 20 2a 2a 20 6b 65 65 70 69 6e 67  r.    ** keeping
c130: 20 74 72 61 63 6b 20 6f 66 20 61 75 74 6f 69 6e   track of autoin
c140: 63 72 65 6d 65 6e 74 20 6b 65 79 73 2e 0a 20 20  crement keys..  
c150: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e    */.    if( p->
c160: 61 75 74 6f 49 6e 63 20 29 7b 0a 20 20 20 20 20  autoInc ){.     
c170: 20 44 62 20 2a 70 44 62 20 3d 20 26 64 62 2d 3e   Db *pDb = &db->
c180: 61 44 62 5b 69 44 62 5d 3b 0a 20 20 20 20 20 20  aDb[iDb];.      
c190: 69 66 28 20 70 44 62 2d 3e 70 53 63 68 65 6d 61  if( pDb->pSchema
c1a0: 2d 3e 70 53 65 71 54 61 62 3d 3d 30 20 29 7b 0a  ->pSeqTab==0 ){.
c1b0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4e          sqlite3N
c1c0: 65 73 74 65 64 50 61 72 73 65 28 70 50 61 72 73  estedParse(pPars
c1d0: 65 2c 0a 20 20 20 20 20 20 20 20 20 20 22 43 52  e,.          "CR
c1e0: 45 41 54 45 20 54 41 42 4c 45 20 25 51 2e 73 71  EATE TABLE %Q.sq
c1f0: 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 28 6e 61  lite_sequence(na
c200: 6d 65 2c 73 65 71 29 22 2c 0a 20 20 20 20 20 20  me,seq)",.      
c210: 20 20 20 20 70 44 62 2d 3e 7a 4e 61 6d 65 0a 20      pDb->zName. 
c220: 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20         );.      
c230: 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  }.    }.#endif..
c240: 20 20 20 20 2f 2a 20 52 65 70 61 72 73 65 20 65      /* Reparse e
c250: 76 65 72 79 74 68 69 6e 67 20 74 6f 20 75 70 64  verything to upd
c260: 61 74 65 20 6f 75 72 20 69 6e 74 65 72 6e 61 6c  ate our internal
c270: 20 64 61 74 61 20 73 74 72 75 63 74 75 72 65 73   data structures
c280: 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56   */.    sqlite3V
c290: 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
c2a0: 50 61 72 73 65 53 63 68 65 6d 61 2c 20 69 44 62  ParseSchema, iDb
c2b0: 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20 20 20 20  , 0, 0,.        
c2c0: 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64  sqlite3MPrintf(d
c2d0: 62 2c 20 22 74 62 6c 5f 6e 61 6d 65 3d 27 25 71  b, "tbl_name='%q
c2e0: 27 22 2c 70 2d 3e 7a 4e 61 6d 65 29 2c 20 50 34  '",p->zName), P4
c2f0: 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 7d 0a 0a  _DYNAMIC);.  }..
c300: 0a 20 20 2f 2a 20 41 64 64 20 74 68 65 20 74 61  .  /* Add the ta
c310: 62 6c 65 20 74 6f 20 74 68 65 20 69 6e 2d 6d 65  ble to the in-me
c320: 6d 6f 72 79 20 72 65 70 72 65 73 65 6e 74 61 74  mory representat
c330: 69 6f 6e 20 6f 66 20 74 68 65 20 64 61 74 61 62  ion of the datab
c340: 61 73 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ase..  */.  if( 
c350: 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 26 26  db->init.busy &&
c360: 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30   pParse->nErr==0
c370: 20 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70   ){.    Table *p
c380: 4f 6c 64 3b 0a 20 20 20 20 46 4b 65 79 20 2a 70  Old;.    FKey *p
c390: 46 4b 65 79 3b 20 0a 20 20 20 20 53 63 68 65 6d  FKey; .    Schem
c3a0: 61 20 2a 70 53 63 68 65 6d 61 20 3d 20 70 2d 3e  a *pSchema = p->
c3b0: 70 53 63 68 65 6d 61 3b 0a 20 20 20 20 70 4f 6c  pSchema;.    pOl
c3c0: 64 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68 49  d = sqlite3HashI
c3d0: 6e 73 65 72 74 28 26 70 53 63 68 65 6d 61 2d 3e  nsert(&pSchema->
c3e0: 74 62 6c 48 61 73 68 2c 20 70 2d 3e 7a 4e 61 6d  tblHash, p->zNam
c3f0: 65 2c 20 73 74 72 6c 65 6e 28 70 2d 3e 7a 4e 61  e, strlen(p->zNa
c400: 6d 65 29 2b 31 2c 70 29 3b 0a 20 20 20 20 69 66  me)+1,p);.    if
c410: 28 20 70 4f 6c 64 20 29 7b 0a 20 20 20 20 20 20  ( pOld ){.      
c420: 61 73 73 65 72 74 28 20 70 3d 3d 70 4f 6c 64 20  assert( p==pOld 
c430: 29 3b 20 20 2f 2a 20 4d 61 6c 6c 6f 63 20 6d 75  );  /* Malloc mu
c440: 73 74 20 68 61 76 65 20 66 61 69 6c 65 64 20 69  st have failed i
c450: 6e 73 69 64 65 20 48 61 73 68 49 6e 73 65 72 74  nside HashInsert
c460: 28 29 20 2a 2f 0a 20 20 20 20 20 20 64 62 2d 3e  () */.      db->
c470: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31  mallocFailed = 1
c480: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a  ;.      return;.
c490: 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51      }.#ifndef SQ
c4a0: 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47  LITE_OMIT_FOREIG
c4b0: 4e 5f 4b 45 59 0a 20 20 20 20 66 6f 72 28 70 46  N_KEY.    for(pF
c4c0: 4b 65 79 3d 70 2d 3e 70 46 4b 65 79 3b 20 70 46  Key=p->pFKey; pF
c4d0: 4b 65 79 3b 20 70 46 4b 65 79 3d 70 46 4b 65 79  Key; pFKey=pFKey
c4e0: 2d 3e 70 4e 65 78 74 46 72 6f 6d 29 7b 0a 20 20  ->pNextFrom){.  
c4f0: 20 20 20 20 76 6f 69 64 20 2a 64 61 74 61 3b 0a      void *data;.
c500: 20 20 20 20 20 20 69 6e 74 20 6e 54 6f 20 3d 20        int nTo = 
c510: 73 74 72 6c 65 6e 28 70 46 4b 65 79 2d 3e 7a 54  strlen(pFKey->zT
c520: 6f 29 20 2b 20 31 3b 0a 20 20 20 20 20 20 70 46  o) + 1;.      pF
c530: 4b 65 79 2d 3e 70 4e 65 78 74 54 6f 20 3d 20 73  Key->pNextTo = s
c540: 71 6c 69 74 65 33 48 61 73 68 46 69 6e 64 28 26  qlite3HashFind(&
c550: 70 53 63 68 65 6d 61 2d 3e 61 46 4b 65 79 2c 20  pSchema->aFKey, 
c560: 70 46 4b 65 79 2d 3e 7a 54 6f 2c 20 6e 54 6f 29  pFKey->zTo, nTo)
c570: 3b 0a 20 20 20 20 20 20 64 61 74 61 20 3d 20 73  ;.      data = s
c580: 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72 74  qlite3HashInsert
c590: 28 26 70 53 63 68 65 6d 61 2d 3e 61 46 4b 65 79  (&pSchema->aFKey
c5a0: 2c 20 70 46 4b 65 79 2d 3e 7a 54 6f 2c 20 6e 54  , pFKey->zTo, nT
c5b0: 6f 2c 20 70 46 4b 65 79 29 3b 0a 20 20 20 20 20  o, pFKey);.     
c5c0: 20 69 66 28 20 64 61 74 61 3d 3d 28 76 6f 69 64   if( data==(void
c5d0: 20 2a 29 70 46 4b 65 79 20 29 7b 0a 20 20 20 20   *)pFKey ){.    
c5e0: 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61      db->mallocFa
c5f0: 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20 20 20  iled = 1;.      
c600: 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  }.    }.#endif. 
c610: 20 20 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54     pParse->pNewT
c620: 61 62 6c 65 20 3d 20 30 3b 0a 20 20 20 20 64 62  able = 0;.    db
c630: 2d 3e 6e 54 61 62 6c 65 2b 2b 3b 0a 20 20 20 20  ->nTable++;.    
c640: 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c  db->flags |= SQL
c650: 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65  ITE_InternChange
c660: 73 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  s;..#ifndef SQLI
c670: 54 45 5f 4f 4d 49 54 5f 41 4c 54 45 52 54 41 42  TE_OMIT_ALTERTAB
c680: 4c 45 0a 20 20 20 20 69 66 28 20 21 70 2d 3e 70  LE.    if( !p->p
c690: 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20  Select ){.      
c6a0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
c6b0: 65 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 20  e = (const char 
c6c0: 2a 29 70 50 61 72 73 65 2d 3e 73 4e 61 6d 65 54  *)pParse->sNameT
c6d0: 6f 6b 65 6e 2e 7a 3b 0a 20 20 20 20 20 20 69 6e  oken.z;.      in
c6e0: 74 20 6e 4e 61 6d 65 3b 0a 20 20 20 20 20 20 61  t nName;.      a
c6f0: 73 73 65 72 74 28 20 21 70 53 65 6c 65 63 74 20  ssert( !pSelect 
c700: 26 26 20 70 43 6f 6e 73 20 26 26 20 70 45 6e 64  && pCons && pEnd
c710: 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 43   );.      if( pC
c720: 6f 6e 73 2d 3e 7a 3d 3d 30 20 29 7b 0a 20 20 20  ons->z==0 ){.   
c730: 20 20 20 20 20 70 43 6f 6e 73 20 3d 20 70 45 6e       pCons = pEn
c740: 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  d;.      }.     
c750: 20 6e 4e 61 6d 65 20 3d 20 28 63 6f 6e 73 74 20   nName = (const 
c760: 63 68 61 72 20 2a 29 70 43 6f 6e 73 2d 3e 7a 20  char *)pCons->z 
c770: 2d 20 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 70  - zName;.      p
c780: 2d 3e 61 64 64 43 6f 6c 4f 66 66 73 65 74 20 3d  ->addColOffset =
c790: 20 31 33 20 2b 20 73 71 6c 69 74 65 33 55 74 66   13 + sqlite3Utf
c7a0: 38 43 68 61 72 4c 65 6e 28 7a 4e 61 6d 65 2c 20  8CharLen(zName, 
c7b0: 6e 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 23 65  nName);.    }.#e
c7c0: 6e 64 69 66 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e  ndif.  }.}..#ifn
c7d0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
c7e0: 56 49 45 57 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70  VIEW./*.** The p
c7f0: 61 72 73 65 72 20 63 61 6c 6c 73 20 74 68 69 73  arser calls this
c800: 20 72 6f 75 74 69 6e 65 20 69 6e 20 6f 72 64 65   routine in orde
c810: 72 20 74 6f 20 63 72 65 61 74 65 20 61 20 6e 65  r to create a ne
c820: 77 20 56 49 45 57 0a 2a 2f 0a 76 6f 69 64 20 73  w VIEW.*/.void s
c830: 71 6c 69 74 65 33 43 72 65 61 74 65 56 69 65 77  qlite3CreateView
c840: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
c850: 65 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61  e,     /* The pa
c860: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
c870: 0a 20 20 54 6f 6b 65 6e 20 2a 70 42 65 67 69 6e  .  Token *pBegin
c880: 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 43 52 45  ,     /* The CRE
c890: 41 54 45 20 74 6f 6b 65 6e 20 74 68 61 74 20 62  ATE token that b
c8a0: 65 67 69 6e 73 20 74 68 65 20 73 74 61 74 65 6d  egins the statem
c8b0: 65 6e 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  ent */.  Token *
c8c0: 70 4e 61 6d 65 31 2c 20 20 20 20 20 2f 2a 20 54  pName1,     /* T
c8d0: 68 65 20 74 6f 6b 65 6e 20 74 68 61 74 20 68 6f  he token that ho
c8e0: 6c 64 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  lds the name of 
c8f0: 74 68 65 20 76 69 65 77 20 2a 2f 0a 20 20 54 6f  the view */.  To
c900: 6b 65 6e 20 2a 70 4e 61 6d 65 32 2c 20 20 20 20  ken *pName2,    
c910: 20 2f 2a 20 54 68 65 20 74 6f 6b 65 6e 20 74 68   /* The token th
c920: 61 74 20 68 6f 6c 64 73 20 74 68 65 20 6e 61 6d  at holds the nam
c930: 65 20 6f 66 20 74 68 65 20 76 69 65 77 20 2a 2f  e of the view */
c940: 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65  .  Select *pSele
c950: 63 74 2c 20 20 20 2f 2a 20 41 20 53 45 4c 45 43  ct,   /* A SELEC
c960: 54 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74  T statement that
c970: 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65   will become the
c980: 20 6e 65 77 20 76 69 65 77 20 2a 2f 0a 20 20 69   new view */.  i
c990: 6e 74 20 69 73 54 65 6d 70 2c 20 20 20 20 20 20  nt isTemp,      
c9a0: 20 20 2f 2a 20 54 52 55 45 20 66 6f 72 20 61 20    /* TRUE for a 
c9b0: 54 45 4d 50 4f 52 41 52 59 20 76 69 65 77 20 2a  TEMPORARY view *
c9c0: 2f 0a 20 20 69 6e 74 20 6e 6f 45 72 72 20 20 20  /.  int noErr   
c9d0: 20 20 20 20 20 20 20 2f 2a 20 53 75 70 70 72 65         /* Suppre
c9e0: 73 73 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  ss error message
c9f0: 73 20 69 66 20 56 49 45 57 20 61 6c 72 65 61 64  s if VIEW alread
ca00: 79 20 65 78 69 73 74 73 20 2a 2f 0a 29 7b 0a 20  y exists */.){. 
ca10: 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 69 6e 74   Table *p;.  int
ca20: 20 6e 3b 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69   n;.  const unsi
ca30: 67 6e 65 64 20 63 68 61 72 20 2a 7a 3b 0a 20 20  gned char *z;.  
ca40: 54 6f 6b 65 6e 20 73 45 6e 64 3b 0a 20 20 44 62  Token sEnd;.  Db
ca50: 46 69 78 65 72 20 73 46 69 78 3b 0a 20 20 54 6f  Fixer sFix;.  To
ca60: 6b 65 6e 20 2a 70 4e 61 6d 65 3b 0a 20 20 69 6e  ken *pName;.  in
ca70: 74 20 69 44 62 3b 0a 20 20 73 71 6c 69 74 65 33  t iDb;.  sqlite3
ca80: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
ca90: 62 3b 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65  b;..  if( pParse
caa0: 2d 3e 6e 56 61 72 3e 30 20 29 7b 0a 20 20 20 20  ->nVar>0 ){.    
cab0: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
cac0: 70 50 61 72 73 65 2c 20 22 70 61 72 61 6d 65 74  pParse, "paramet
cad0: 65 72 73 20 61 72 65 20 6e 6f 74 20 61 6c 6c 6f  ers are not allo
cae0: 77 65 64 20 69 6e 20 76 69 65 77 73 22 29 3b 0a  wed in views");.
caf0: 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63      sqlite3Selec
cb00: 74 44 65 6c 65 74 65 28 70 53 65 6c 65 63 74 29  tDelete(pSelect)
cb10: 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
cb20: 7d 0a 20 20 73 71 6c 69 74 65 33 53 74 61 72 74  }.  sqlite3Start
cb30: 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70 4e  Table(pParse, pN
cb40: 61 6d 65 31 2c 20 70 4e 61 6d 65 32 2c 20 69 73  ame1, pName2, is
cb50: 54 65 6d 70 2c 20 31 2c 20 30 2c 20 6e 6f 45 72  Temp, 1, 0, noEr
cb60: 72 29 3b 0a 20 20 70 20 3d 20 70 50 61 72 73 65  r);.  p = pParse
cb70: 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 69  ->pNewTable;.  i
cb80: 66 28 20 70 3d 3d 30 20 7c 7c 20 70 50 61 72 73  f( p==0 || pPars
cb90: 65 2d 3e 6e 45 72 72 20 29 7b 0a 20 20 20 20 73  e->nErr ){.    s
cba0: 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65  qlite3SelectDele
cbb0: 74 65 28 70 53 65 6c 65 63 74 29 3b 0a 20 20 20  te(pSelect);.   
cbc0: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 73   return;.  }.  s
cbd0: 71 6c 69 74 65 33 54 77 6f 50 61 72 74 4e 61 6d  qlite3TwoPartNam
cbe0: 65 28 70 50 61 72 73 65 2c 20 70 4e 61 6d 65 31  e(pParse, pName1
cbf0: 2c 20 70 4e 61 6d 65 32 2c 20 26 70 4e 61 6d 65  , pName2, &pName
cc00: 29 3b 0a 20 20 69 44 62 20 3d 20 73 71 6c 69 74  );.  iDb = sqlit
cc10: 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28  e3SchemaToIndex(
cc20: 64 62 2c 20 70 2d 3e 70 53 63 68 65 6d 61 29 3b  db, p->pSchema);
cc30: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 46 69  .  if( sqlite3Fi
cc40: 78 49 6e 69 74 28 26 73 46 69 78 2c 20 70 50 61  xInit(&sFix, pPa
cc50: 72 73 65 2c 20 69 44 62 2c 20 22 76 69 65 77 22  rse, iDb, "view"
cc60: 2c 20 70 4e 61 6d 65 29 0a 20 20 20 20 26 26 20  , pName).    && 
cc70: 73 71 6c 69 74 65 33 46 69 78 53 65 6c 65 63 74  sqlite3FixSelect
cc80: 28 26 73 46 69 78 2c 20 70 53 65 6c 65 63 74 29  (&sFix, pSelect)
cc90: 0a 20 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  .  ){.    sqlite
cca0: 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 70 53  3SelectDelete(pS
ccb0: 65 6c 65 63 74 29 3b 0a 20 20 20 20 72 65 74 75  elect);.    retu
ccc0: 72 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61  rn;.  }..  /* Ma
ccd0: 6b 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65  ke a copy of the
cce0: 20 65 6e 74 69 72 65 20 53 45 4c 45 43 54 20 73   entire SELECT s
ccf0: 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20 64 65  tatement that de
cd00: 66 69 6e 65 73 20 74 68 65 20 76 69 65 77 2e 0a  fines the view..
cd10: 20 20 2a 2a 20 54 68 69 73 20 77 69 6c 6c 20 66    ** This will f
cd20: 6f 72 63 65 20 61 6c 6c 20 74 68 65 20 45 78 70  orce all the Exp
cd30: 72 2e 74 6f 6b 65 6e 2e 7a 20 76 61 6c 75 65 73  r.token.z values
cd40: 20 74 6f 20 62 65 20 64 79 6e 61 6d 69 63 61 6c   to be dynamical
cd50: 6c 79 0a 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65  ly.  ** allocate
cd60: 64 20 72 61 74 68 65 72 20 74 68 61 6e 20 70 6f  d rather than po
cd70: 69 6e 74 20 74 6f 20 74 68 65 20 69 6e 70 75 74  int to the input
cd80: 20 73 74 72 69 6e 67 20 2d 20 77 68 69 63 68 20   string - which 
cd90: 6d 65 61 6e 73 20 74 68 61 74 0a 20 20 2a 2a 20  means that.  ** 
cda0: 74 68 65 79 20 77 69 6c 6c 20 70 65 72 73 69 73  they will persis
cdb0: 74 20 61 66 74 65 72 20 74 68 65 20 63 75 72 72  t after the curr
cdc0: 65 6e 74 20 73 71 6c 69 74 65 33 5f 65 78 65 63  ent sqlite3_exec
cdd0: 28 29 20 63 61 6c 6c 20 72 65 74 75 72 6e 73 2e  () call returns.
cde0: 0a 20 20 2a 2f 0a 20 20 70 2d 3e 70 53 65 6c 65  .  */.  p->pSele
cdf0: 63 74 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65  ct = sqlite3Sele
ce00: 63 74 44 75 70 28 64 62 2c 20 70 53 65 6c 65 63  ctDup(db, pSelec
ce10: 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c  t);.  sqlite3Sel
ce20: 65 63 74 44 65 6c 65 74 65 28 70 53 65 6c 65 63  ectDelete(pSelec
ce30: 74 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61  t);.  if( db->ma
ce40: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
ce50: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
ce60: 69 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75  if( !db->init.bu
ce70: 73 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  sy ){.    sqlite
ce80: 33 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61  3ViewGetColumnNa
ce90: 6d 65 73 28 70 50 61 72 73 65 2c 20 70 29 3b 0a  mes(pParse, p);.
cea0: 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 63 61 74 65    }..  /* Locate
ceb0: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
cec0: 43 52 45 41 54 45 20 56 49 45 57 20 73 74 61 74  CREATE VIEW stat
ced0: 65 6d 65 6e 74 2e 20 20 4d 61 6b 65 20 73 45 6e  ement.  Make sEn
cee0: 64 20 70 6f 69 6e 74 20 74 6f 0a 20 20 2a 2a 20  d point to.  ** 
cef0: 74 68 65 20 65 6e 64 2e 0a 20 20 2a 2f 0a 20 20  the end..  */.  
cf00: 73 45 6e 64 20 3d 20 70 50 61 72 73 65 2d 3e 73  sEnd = pParse->s
cf10: 4c 61 73 74 54 6f 6b 65 6e 3b 0a 20 20 69 66 28  LastToken;.  if(
cf20: 20 73 45 6e 64 2e 7a 5b 30 5d 21 3d 30 20 26 26   sEnd.z[0]!=0 &&
cf30: 20 73 45 6e 64 2e 7a 5b 30 5d 21 3d 27 3b 27 20   sEnd.z[0]!=';' 
cf40: 29 7b 0a 20 20 20 20 73 45 6e 64 2e 7a 20 2b 3d  ){.    sEnd.z +=
cf50: 20 73 45 6e 64 2e 6e 3b 0a 20 20 7d 0a 20 20 73   sEnd.n;.  }.  s
cf60: 45 6e 64 2e 6e 20 3d 20 30 3b 0a 20 20 6e 20 3d  End.n = 0;.  n =
cf70: 20 73 45 6e 64 2e 7a 20 2d 20 70 42 65 67 69 6e   sEnd.z - pBegin
cf80: 2d 3e 7a 3b 0a 20 20 7a 20 3d 20 28 63 6f 6e 73  ->z;.  z = (cons
cf90: 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a  t unsigned char*
cfa0: 29 70 42 65 67 69 6e 2d 3e 7a 3b 0a 20 20 77 68  )pBegin->z;.  wh
cfb0: 69 6c 65 28 20 6e 3e 30 20 26 26 20 28 7a 5b 6e  ile( n>0 && (z[n
cfc0: 2d 31 5d 3d 3d 27 3b 27 20 7c 7c 20 69 73 73 70  -1]==';' || issp
cfd0: 61 63 65 28 7a 5b 6e 2d 31 5d 29 29 20 29 7b 20  ace(z[n-1])) ){ 
cfe0: 6e 2d 2d 3b 20 7d 0a 20 20 73 45 6e 64 2e 7a 20  n--; }.  sEnd.z 
cff0: 3d 20 26 7a 5b 6e 2d 31 5d 3b 0a 20 20 73 45 6e  = &z[n-1];.  sEn
d000: 64 2e 6e 20 3d 20 31 3b 0a 0a 20 20 2f 2a 20 55  d.n = 1;..  /* U
d010: 73 65 20 73 71 6c 69 74 65 33 45 6e 64 54 61 62  se sqlite3EndTab
d020: 6c 65 28 29 20 74 6f 20 61 64 64 20 74 68 65 20  le() to add the 
d030: 76 69 65 77 20 74 6f 20 74 68 65 20 53 51 4c 49  view to the SQLI
d040: 54 45 5f 4d 41 53 54 45 52 20 74 61 62 6c 65 20  TE_MASTER table 
d050: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 45 6e 64 54  */.  sqlite3EndT
d060: 61 62 6c 65 28 70 50 61 72 73 65 2c 20 30 2c 20  able(pParse, 0, 
d070: 26 73 45 6e 64 2c 20 30 29 3b 0a 20 20 72 65 74  &sEnd, 0);.  ret
d080: 75 72 6e 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  urn;.}.#endif /*
d090: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45   SQLITE_OMIT_VIE
d0a0: 57 20 2a 2f 0a 0a 23 69 66 20 21 64 65 66 69 6e  W */..#if !defin
d0b0: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ed(SQLITE_OMIT_V
d0c0: 49 45 57 29 20 7c 7c 20 21 64 65 66 69 6e 65 64  IEW) || !defined
d0d0: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52  (SQLITE_OMIT_VIR
d0e0: 54 55 41 4c 54 41 42 4c 45 29 0a 2f 2a 0a 2a 2a  TUALTABLE)./*.**
d0f0: 20 54 68 65 20 54 61 62 6c 65 20 73 74 72 75 63   The Table struc
d100: 74 75 72 65 20 70 54 61 62 6c 65 20 69 73 20 72  ture pTable is r
d110: 65 61 6c 6c 79 20 61 20 56 49 45 57 2e 20 20 46  eally a VIEW.  F
d120: 69 6c 6c 20 69 6e 20 74 68 65 20 6e 61 6d 65 73  ill in the names
d130: 20 6f 66 0a 2a 2a 20 74 68 65 20 63 6f 6c 75 6d   of.** the colum
d140: 6e 73 20 6f 66 20 74 68 65 20 76 69 65 77 20 69  ns of the view i
d150: 6e 20 74 68 65 20 70 54 61 62 6c 65 20 73 74 72  n the pTable str
d160: 75 63 74 75 72 65 2e 20 20 52 65 74 75 72 6e 20  ucture.  Return 
d170: 74 68 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66  the number.** of
d180: 20 65 72 72 6f 72 73 2e 20 20 49 66 20 61 6e 20   errors.  If an 
d190: 65 72 72 6f 72 20 69 73 20 73 65 65 6e 20 6c 65  error is seen le
d1a0: 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73  ave an error mes
d1b0: 73 61 67 65 20 69 6e 20 70 50 61 72 73 65 2d 3e  sage in pParse->
d1c0: 7a 45 72 72 4d 73 67 2e 0a 2a 2f 0a 69 6e 74 20  zErrMsg..*/.int 
d1d0: 73 71 6c 69 74 65 33 56 69 65 77 47 65 74 43 6f  sqlite3ViewGetCo
d1e0: 6c 75 6d 6e 4e 61 6d 65 73 28 50 61 72 73 65 20  lumnNames(Parse 
d1f0: 2a 70 50 61 72 73 65 2c 20 54 61 62 6c 65 20 2a  *pParse, Table *
d200: 70 54 61 62 6c 65 29 7b 0a 20 20 54 61 62 6c 65  pTable){.  Table
d210: 20 2a 70 53 65 6c 54 61 62 3b 20 20 20 2f 2a 20   *pSelTab;   /* 
d220: 41 20 66 61 6b 65 20 74 61 62 6c 65 20 66 72 6f  A fake table fro
d230: 6d 20 77 68 69 63 68 20 77 65 20 67 65 74 20 74  m which we get t
d240: 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f  he result set */
d250: 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 3b  .  Select *pSel;
d260: 20 20 20 20 20 2f 2a 20 43 6f 70 79 20 6f 66 20       /* Copy of 
d270: 74 68 65 20 53 45 4c 45 43 54 20 74 68 61 74 20  the SELECT that 
d280: 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 76  implements the v
d290: 69 65 77 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 72  iew */.  int nEr
d2a0: 72 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 4e 75  r = 0;     /* Nu
d2b0: 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73 20 65  mber of errors e
d2c0: 6e 63 6f 75 6e 74 65 72 65 64 20 2a 2f 0a 20 20  ncountered */.  
d2d0: 69 6e 74 20 6e 3b 20 20 20 20 20 20 20 20 20 20  int n;          
d2e0: 20 20 2f 2a 20 54 65 6d 70 6f 72 61 72 69 6c 79    /* Temporarily
d2f0: 20 68 6f 6c 64 73 20 74 68 65 20 6e 75 6d 62 65   holds the numbe
d300: 72 20 6f 66 20 63 75 72 73 6f 72 73 20 61 73 73  r of cursors ass
d310: 69 67 6e 65 64 20 2a 2f 0a 20 20 73 71 6c 69 74  igned */.  sqlit
d320: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
d330: 3e 64 62 3b 20 20 2f 2a 20 44 61 74 61 62 61 73  >db;  /* Databas
d340: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 66 6f 72  e connection for
d350: 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 73 20 2a   malloc errors *
d360: 2f 0a 20 20 69 6e 74 20 28 2a 78 41 75 74 68 29  /.  int (*xAuth)
d370: 28 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74  (void*,int,const
d380: 20 63 68 61 72 2a 2c 63 6f 6e 73 74 20 63 68 61   char*,const cha
d390: 72 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a 2c 63  r*,const char*,c
d3a0: 6f 6e 73 74 20 63 68 61 72 2a 29 3b 0a 0a 20 20  onst char*);..  
d3b0: 61 73 73 65 72 74 28 20 70 54 61 62 6c 65 20 29  assert( pTable )
d3c0: 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ;..#ifndef SQLIT
d3d0: 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
d3e0: 42 4c 45 0a 20 20 69 66 28 20 73 71 6c 69 74 65  BLE.  if( sqlite
d3f0: 33 56 74 61 62 43 61 6c 6c 43 6f 6e 6e 65 63 74  3VtabCallConnect
d400: 28 70 50 61 72 73 65 2c 20 70 54 61 62 6c 65 29  (pParse, pTable)
d410: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
d420: 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d  QLITE_ERROR;.  }
d430: 0a 20 20 69 66 28 20 49 73 56 69 72 74 75 61 6c  .  if( IsVirtual
d440: 28 70 54 61 62 6c 65 29 20 29 20 72 65 74 75 72  (pTable) ) retur
d450: 6e 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66  n 0;.#endif..#if
d460: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
d470: 5f 56 49 45 57 0a 20 20 2f 2a 20 41 20 70 6f 73  _VIEW.  /* A pos
d480: 69 74 69 76 65 20 6e 43 6f 6c 20 6d 65 61 6e 73  itive nCol means
d490: 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 6e 61 6d   the columns nam
d4a0: 65 73 20 66 6f 72 20 74 68 69 73 20 76 69 65 77  es for this view
d4b0: 20 61 72 65 0a 20 20 2a 2a 20 61 6c 72 65 61 64   are.  ** alread
d4c0: 79 20 6b 6e 6f 77 6e 2e 0a 20 20 2a 2f 0a 20 20  y known..  */.  
d4d0: 69 66 28 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c  if( pTable->nCol
d4e0: 3e 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a  >0 ) return 0;..
d4f0: 20 20 2f 2a 20 41 20 6e 65 67 61 74 69 76 65 20    /* A negative 
d500: 6e 43 6f 6c 20 69 73 20 61 20 73 70 65 63 69 61  nCol is a specia
d510: 6c 20 6d 61 72 6b 65 72 20 6d 65 61 6e 69 6e 67  l marker meaning
d520: 20 74 68 61 74 20 77 65 20 61 72 65 20 63 75 72   that we are cur
d530: 72 65 6e 74 6c 79 0a 20 20 2a 2a 20 74 72 79 69  rently.  ** tryi
d540: 6e 67 20 74 6f 20 63 6f 6d 70 75 74 65 20 74 68  ng to compute th
d550: 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 2e 20  e column names. 
d560: 20 49 66 20 77 65 20 65 6e 74 65 72 20 74 68 69   If we enter thi
d570: 73 20 72 6f 75 74 69 6e 65 20 77 69 74 68 0a 20  s routine with. 
d580: 20 2a 2a 20 61 20 6e 65 67 61 74 69 76 65 20 6e   ** a negative n
d590: 43 6f 6c 2c 20 69 74 20 6d 65 61 6e 73 20 74 77  Col, it means tw
d5a0: 6f 20 6f 72 20 6d 6f 72 65 20 76 69 65 77 73 20  o or more views 
d5b0: 66 6f 72 6d 20 61 20 6c 6f 6f 70 2c 20 6c 69 6b  form a loop, lik
d5c0: 65 20 74 68 69 73 3a 0a 20 20 2a 2a 0a 20 20 2a  e this:.  **.  *
d5d0: 2a 20 20 20 20 20 43 52 45 41 54 45 20 56 49 45  *     CREATE VIE
d5e0: 57 20 6f 6e 65 20 41 53 20 53 45 4c 45 43 54 20  W one AS SELECT 
d5f0: 2a 20 46 52 4f 4d 20 74 77 6f 3b 0a 20 20 2a 2a  * FROM two;.  **
d600: 20 20 20 20 20 43 52 45 41 54 45 20 56 49 45 57       CREATE VIEW
d610: 20 74 77 6f 20 41 53 20 53 45 4c 45 43 54 20 2a   two AS SELECT *
d620: 20 46 52 4f 4d 20 6f 6e 65 3b 0a 20 20 2a 2a 0a   FROM one;.  **.
d630: 20 20 2a 2a 20 41 63 74 75 61 6c 6c 79 2c 20 74    ** Actually, t
d640: 68 69 73 20 65 72 72 6f 72 20 69 73 20 63 61 75  his error is cau
d650: 67 68 74 20 70 72 65 76 69 6f 75 73 6c 79 20 61  ght previously a
d660: 6e 64 20 73 6f 20 74 68 65 20 66 6f 6c 6c 6f 77  nd so the follow
d670: 69 6e 67 20 74 65 73 74 0a 20 20 2a 2a 20 73 68  ing test.  ** sh
d680: 6f 75 6c 64 20 61 6c 77 61 79 73 20 66 61 69 6c  ould always fail
d690: 2e 20 20 42 75 74 20 77 65 20 77 69 6c 6c 20 6c  .  But we will l
d6a0: 65 61 76 65 20 69 74 20 69 6e 20 70 6c 61 63 65  eave it in place
d6b0: 20 6a 75 73 74 20 74 6f 20 62 65 20 73 61 66 65   just to be safe
d6c0: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 54 61  ..  */.  if( pTa
d6d0: 62 6c 65 2d 3e 6e 43 6f 6c 3c 30 20 29 7b 0a 20  ble->nCol<0 ){. 
d6e0: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
d6f0: 73 67 28 70 50 61 72 73 65 2c 20 22 76 69 65 77  sg(pParse, "view
d700: 20 25 73 20 69 73 20 63 69 72 63 75 6c 61 72 6c   %s is circularl
d710: 79 20 64 65 66 69 6e 65 64 22 2c 20 70 54 61 62  y defined", pTab
d720: 6c 65 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  le->zName);.    
d730: 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20  return 1;.  }.  
d740: 61 73 73 65 72 74 28 20 70 54 61 62 6c 65 2d 3e  assert( pTable->
d750: 6e 43 6f 6c 3e 3d 30 20 29 3b 0a 0a 20 20 2f 2a  nCol>=0 );..  /*
d760: 20 49 66 20 77 65 20 67 65 74 20 74 68 69 73 20   If we get this 
d770: 66 61 72 2c 20 69 74 20 6d 65 61 6e 73 20 77 65  far, it means we
d780: 20 6e 65 65 64 20 74 6f 20 63 6f 6d 70 75 74 65   need to compute
d790: 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 73   the table names
d7a0: 2e 0a 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74  ..  ** Note that
d7b0: 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c   the call to sql
d7c0: 69 74 65 33 52 65 73 75 6c 74 53 65 74 4f 66 53  ite3ResultSetOfS
d7d0: 65 6c 65 63 74 28 29 20 77 69 6c 6c 20 65 78 70  elect() will exp
d7e0: 61 6e 64 20 61 6e 79 0a 20 20 2a 2a 20 22 2a 22  and any.  ** "*"
d7f0: 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 74 68 65   elements in the
d800: 20 72 65 73 75 6c 74 73 20 73 65 74 20 6f 66 20   results set of 
d810: 74 68 65 20 76 69 65 77 20 61 6e 64 20 77 69 6c  the view and wil
d820: 6c 20 61 73 73 69 67 6e 20 63 75 72 73 6f 72 73  l assign cursors
d830: 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 65 6c 65  .  ** to the ele
d840: 6d 65 6e 74 73 20 6f 66 20 74 68 65 20 46 52 4f  ments of the FRO
d850: 4d 20 63 6c 61 75 73 65 2e 20 20 42 75 74 20 77  M clause.  But w
d860: 65 20 64 6f 20 6e 6f 74 20 77 61 6e 74 20 74 68  e do not want th
d870: 65 73 65 20 63 68 61 6e 67 65 73 0a 20 20 2a 2a  ese changes.  **
d880: 20 74 6f 20 62 65 20 70 65 72 6d 61 6e 65 6e 74   to be permanent
d890: 2e 20 20 53 6f 20 74 68 65 20 63 6f 6d 70 75 74  .  So the comput
d8a0: 61 74 69 6f 6e 20 69 73 20 64 6f 6e 65 20 6f 6e  ation is done on
d8b0: 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 53   a copy of the S
d8c0: 45 4c 45 43 54 0a 20 20 2a 2a 20 73 74 61 74 65  ELECT.  ** state
d8d0: 6d 65 6e 74 20 74 68 61 74 20 64 65 66 69 6e 65  ment that define
d8e0: 73 20 74 68 65 20 76 69 65 77 2e 0a 20 20 2a 2f  s the view..  */
d8f0: 0a 20 20 61 73 73 65 72 74 28 20 70 54 61 62 6c  .  assert( pTabl
d900: 65 2d 3e 70 53 65 6c 65 63 74 20 29 3b 0a 20 20  e->pSelect );.  
d910: 70 53 65 6c 20 3d 20 73 71 6c 69 74 65 33 53 65  pSel = sqlite3Se
d920: 6c 65 63 74 44 75 70 28 64 62 2c 20 70 54 61 62  lectDup(db, pTab
d930: 6c 65 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20  le->pSelect);.  
d940: 69 66 28 20 70 53 65 6c 20 29 7b 0a 20 20 20 20  if( pSel ){.    
d950: 6e 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  n = pParse->nTab
d960: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 72 63  ;.    sqlite3Src
d970: 4c 69 73 74 41 73 73 69 67 6e 43 75 72 73 6f 72  ListAssignCursor
d980: 73 28 70 50 61 72 73 65 2c 20 70 53 65 6c 2d 3e  s(pParse, pSel->
d990: 70 53 72 63 29 3b 0a 20 20 20 20 70 54 61 62 6c  pSrc);.    pTabl
d9a0: 65 2d 3e 6e 43 6f 6c 20 3d 20 2d 31 3b 0a 23 69  e->nCol = -1;.#i
d9b0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
d9c0: 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a  T_AUTHORIZATION.
d9d0: 20 20 20 20 78 41 75 74 68 20 3d 20 64 62 2d 3e      xAuth = db->
d9e0: 78 41 75 74 68 3b 0a 20 20 20 20 64 62 2d 3e 78  xAuth;.    db->x
d9f0: 41 75 74 68 20 3d 20 30 3b 0a 20 20 20 20 70 53  Auth = 0;.    pS
da00: 65 6c 54 61 62 20 3d 20 73 71 6c 69 74 65 33 52  elTab = sqlite3R
da10: 65 73 75 6c 74 53 65 74 4f 66 53 65 6c 65 63 74  esultSetOfSelect
da20: 28 70 50 61 72 73 65 2c 20 30 2c 20 70 53 65 6c  (pParse, 0, pSel
da30: 29 3b 0a 20 20 20 20 64 62 2d 3e 78 41 75 74 68  );.    db->xAuth
da40: 20 3d 20 78 41 75 74 68 3b 0a 23 65 6c 73 65 0a   = xAuth;.#else.
da50: 20 20 20 20 70 53 65 6c 54 61 62 20 3d 20 73 71      pSelTab = sq
da60: 6c 69 74 65 33 52 65 73 75 6c 74 53 65 74 4f 66  lite3ResultSetOf
da70: 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 30  Select(pParse, 0
da80: 2c 20 70 53 65 6c 29 3b 0a 23 65 6e 64 69 66 0a  , pSel);.#endif.
da90: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 54 61 62      pParse->nTab
daa0: 20 3d 20 6e 3b 0a 20 20 20 20 69 66 28 20 70 53   = n;.    if( pS
dab0: 65 6c 54 61 62 20 29 7b 0a 20 20 20 20 20 20 61  elTab ){.      a
dac0: 73 73 65 72 74 28 20 70 54 61 62 6c 65 2d 3e 61  ssert( pTable->a
dad0: 43 6f 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  Col==0 );.      
dae0: 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 70  pTable->nCol = p
daf0: 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c 3b 0a 20 20  SelTab->nCol;.  
db00: 20 20 20 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c      pTable->aCol
db10: 20 3d 20 70 53 65 6c 54 61 62 2d 3e 61 43 6f 6c   = pSelTab->aCol
db20: 3b 0a 20 20 20 20 20 20 70 53 65 6c 54 61 62 2d  ;.      pSelTab-
db30: 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20  >nCol = 0;.     
db40: 20 70 53 65 6c 54 61 62 2d 3e 61 43 6f 6c 20 3d   pSelTab->aCol =
db50: 20 30 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   0;.      sqlite
db60: 33 44 65 6c 65 74 65 54 61 62 6c 65 28 70 53 65  3DeleteTable(pSe
db70: 6c 54 61 62 29 3b 0a 20 20 20 20 20 20 70 54 61  lTab);.      pTa
db80: 62 6c 65 2d 3e 70 53 63 68 65 6d 61 2d 3e 66 6c  ble->pSchema->fl
db90: 61 67 73 20 7c 3d 20 44 42 5f 55 6e 72 65 73 65  ags |= DB_Unrese
dba0: 74 56 69 65 77 73 3b 0a 20 20 20 20 7d 65 6c 73  tViews;.    }els
dbb0: 65 7b 0a 20 20 20 20 20 20 70 54 61 62 6c 65 2d  e{.      pTable-
dbc0: 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20  >nCol = 0;.     
dbd0: 20 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 7d 0a 20   nErr++;.    }. 
dbe0: 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74     sqlite3Select
dbf0: 44 65 6c 65 74 65 28 70 53 65 6c 29 3b 0a 20 20  Delete(pSel);.  
dc00: 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 6e 45 72  } else {.    nEr
dc10: 72 2b 2b 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20  r++;.  }.#endif 
dc20: 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  /* SQLITE_OMIT_V
dc30: 49 45 57 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20  IEW */.  return 
dc40: 6e 45 72 72 3b 20 20 0a 7d 0a 23 65 6e 64 69 66  nErr;  .}.#endif
dc50: 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c   /* !defined(SQL
dc60: 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 7c  ITE_OMIT_VIEW) |
dc70: 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  | !defined(SQLIT
dc80: 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
dc90: 42 4c 45 29 20 2a 2f 0a 0a 23 69 66 6e 64 65 66  BLE) */..#ifndef
dca0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45   SQLITE_OMIT_VIE
dcb0: 57 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 74 68  W./*.** Clear th
dcc0: 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 66  e column names f
dcd0: 72 6f 6d 20 65 76 65 72 79 20 56 49 45 57 20 69  rom every VIEW i
dce0: 6e 20 64 61 74 61 62 61 73 65 20 69 64 78 2e 0a  n database idx..
dcf0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
dd00: 71 6c 69 74 65 56 69 65 77 52 65 73 65 74 41 6c  qliteViewResetAl
dd10: 6c 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69  l(sqlite3 *db, i
dd20: 6e 74 20 69 64 78 29 7b 0a 20 20 48 61 73 68 45  nt idx){.  HashE
dd30: 6c 65 6d 20 2a 69 3b 0a 20 20 69 66 28 20 21 44  lem *i;.  if( !D
dd40: 62 48 61 73 50 72 6f 70 65 72 74 79 28 64 62 2c  bHasProperty(db,
dd50: 20 69 64 78 2c 20 44 42 5f 55 6e 72 65 73 65 74   idx, DB_Unreset
dd60: 56 69 65 77 73 29 20 29 20 72 65 74 75 72 6e 3b  Views) ) return;
dd70: 0a 20 20 66 6f 72 28 69 3d 73 71 6c 69 74 65 48  .  for(i=sqliteH
dd80: 61 73 68 46 69 72 73 74 28 26 64 62 2d 3e 61 44  ashFirst(&db->aD
dd90: 62 5b 69 64 78 5d 2e 70 53 63 68 65 6d 61 2d 3e  b[idx].pSchema->
dda0: 74 62 6c 48 61 73 68 29 3b 20 69 3b 69 3d 73 71  tblHash); i;i=sq
ddb0: 6c 69 74 65 48 61 73 68 4e 65 78 74 28 69 29 29  liteHashNext(i))
ddc0: 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61  {.    Table *pTa
ddd0: 62 20 3d 20 73 71 6c 69 74 65 48 61 73 68 44 61  b = sqliteHashDa
dde0: 74 61 28 69 29 3b 0a 20 20 20 20 69 66 28 20 70  ta(i);.    if( p
ddf0: 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a  Tab->pSelect ){.
de00: 20 20 20 20 20 20 73 71 6c 69 74 65 52 65 73 65        sqliteRese
de10: 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 54 61  tColumnNames(pTa
de20: 62 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  b);.    }.  }.  
de30: 44 62 43 6c 65 61 72 50 72 6f 70 65 72 74 79 28  DbClearProperty(
de40: 64 62 2c 20 69 64 78 2c 20 44 42 5f 55 6e 72 65  db, idx, DB_Unre
de50: 73 65 74 56 69 65 77 73 29 3b 0a 7d 0a 23 65 6c  setViews);.}.#el
de60: 73 65 0a 23 20 64 65 66 69 6e 65 20 73 71 6c 69  se.# define sqli
de70: 74 65 56 69 65 77 52 65 73 65 74 41 6c 6c 28 41  teViewResetAll(A
de80: 2c 42 29 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ,B).#endif /* SQ
de90: 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 20 2a  LITE_OMIT_VIEW *
dea0: 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  /../*.** This fu
deb0: 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
dec0: 20 62 79 20 74 68 65 20 56 44 42 45 20 74 6f 20   by the VDBE to 
ded0: 61 64 6a 75 73 74 20 74 68 65 20 69 6e 74 65 72  adjust the inter
dee0: 6e 61 6c 20 73 63 68 65 6d 61 0a 2a 2a 20 75 73  nal schema.** us
def0: 65 64 20 62 79 20 53 51 4c 69 74 65 20 77 68 65  ed by SQLite whe
df00: 6e 20 74 68 65 20 62 74 72 65 65 20 6c 61 79 65  n the btree laye
df10: 72 20 6d 6f 76 65 73 20 61 20 74 61 62 6c 65 20  r moves a table 
df20: 72 6f 6f 74 20 70 61 67 65 2e 20 54 68 65 0a 2a  root page. The.*
df30: 2a 20 72 6f 6f 74 2d 70 61 67 65 20 6f 66 20 61  * root-page of a
df40: 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20   table or index 
df50: 69 6e 20 64 61 74 61 62 61 73 65 20 69 44 62 20  in database iDb 
df60: 68 61 73 20 63 68 61 6e 67 65 64 20 66 72 6f 6d  has changed from
df70: 20 69 46 72 6f 6d 0a 2a 2a 20 74 6f 20 69 54 6f   iFrom.** to iTo
df80: 2e 0a 2a 2a 0a 2a 2a 20 54 69 63 6b 65 74 20 23  ..**.** Ticket #
df90: 31 37 32 38 3a 20 20 54 68 65 20 73 79 6d 62 6f  1728:  The symbo
dfa0: 6c 20 74 61 62 6c 65 20 6d 69 67 68 74 20 73 74  l table might st
dfb0: 69 6c 6c 20 63 6f 6e 74 61 69 6e 20 69 6e 66 6f  ill contain info
dfc0: 72 6d 61 74 69 6f 6e 0a 2a 2a 20 6f 6e 20 74 61  rmation.** on ta
dfd0: 62 6c 65 73 20 61 6e 64 2f 6f 72 20 69 6e 64 69  bles and/or indi
dfe0: 63 65 73 20 74 68 61 74 20 61 72 65 20 74 68 65  ces that are the
dff0: 20 70 72 6f 63 65 73 73 20 6f 66 20 62 65 69 6e   process of bein
e000: 67 20 64 65 6c 65 74 65 64 2e 0a 2a 2a 20 49 66  g deleted..** If
e010: 20 79 6f 75 20 61 72 65 20 75 6e 6c 75 63 6b 79   you are unlucky
e020: 2c 20 6f 6e 65 20 6f 66 20 74 68 6f 73 65 20 64  , one of those d
e030: 65 6c 65 74 65 64 20 69 6e 64 69 63 65 73 20 6f  eleted indices o
e040: 72 20 74 61 62 6c 65 73 20 6d 69 67 68 74 0a 2a  r tables might.*
e050: 2a 20 68 61 76 65 20 74 68 65 20 73 61 6d 65 20  * have the same 
e060: 72 6f 6f 74 70 61 67 65 20 6e 75 6d 62 65 72 20  rootpage number 
e070: 61 73 20 74 68 65 20 72 65 61 6c 20 74 61 62 6c  as the real tabl
e080: 65 20 6f 72 20 69 6e 64 65 78 20 74 68 61 74 20  e or index that 
e090: 69 73 0a 2a 2a 20 62 65 69 6e 67 20 6d 6f 76 65  is.** being move
e0a0: 64 2e 20 20 53 6f 20 77 65 20 63 61 6e 6e 6f 74  d.  So we cannot
e0b0: 20 73 74 6f 70 20 73 65 61 72 63 68 69 6e 67 20   stop searching 
e0c0: 61 66 74 65 72 20 74 68 65 20 66 69 72 73 74 20  after the first 
e0d0: 6d 61 74 63 68 20 0a 2a 2a 20 62 65 63 61 75 73  match .** becaus
e0e0: 65 20 74 68 65 20 66 69 72 73 74 20 6d 61 74 63  e the first matc
e0f0: 68 20 6d 69 67 68 74 20 62 65 20 66 6f 72 20 6f  h might be for o
e100: 6e 65 20 6f 66 20 74 68 65 20 64 65 6c 65 74 65  ne of the delete
e110: 64 20 69 6e 64 69 63 65 73 0a 2a 2a 20 6f 72 20  d indices.** or 
e120: 74 61 62 6c 65 73 20 61 6e 64 20 6e 6f 74 20 74  tables and not t
e130: 68 65 20 74 61 62 6c 65 2f 69 6e 64 65 78 20 74  he table/index t
e140: 68 61 74 20 69 73 20 61 63 74 75 61 6c 6c 79 20  hat is actually 
e150: 62 65 69 6e 67 20 6d 6f 76 65 64 2e 0a 2a 2a 20  being moved..** 
e160: 57 65 20 6d 75 73 74 20 63 6f 6e 74 69 6e 75 65  We must continue
e170: 20 6c 6f 6f 70 69 6e 67 20 75 6e 74 69 6c 20 61   looping until a
e180: 6c 6c 20 74 61 62 6c 65 73 20 61 6e 64 20 69 6e  ll tables and in
e190: 64 69 63 65 73 20 77 69 74 68 0a 2a 2a 20 72 6f  dices with.** ro
e1a0: 6f 74 70 61 67 65 3d 3d 69 46 72 6f 6d 20 68 61  otpage==iFrom ha
e1b0: 76 65 20 62 65 65 6e 20 63 6f 6e 76 65 72 74 65  ve been converte
e1c0: 64 20 74 6f 20 68 61 76 65 20 61 20 72 6f 6f 74  d to have a root
e1d0: 70 61 67 65 20 6f 66 20 69 54 6f 0a 2a 2a 20 69  page of iTo.** i
e1e0: 6e 20 6f 72 64 65 72 20 74 6f 20 62 65 20 63 65  n order to be ce
e1f0: 72 74 61 69 6e 20 74 68 61 74 20 77 65 20 67 6f  rtain that we go
e200: 74 20 74 68 65 20 72 69 67 68 74 20 6f 6e 65 2e  t the right one.
e210: 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .*/.#ifndef SQLI
e220: 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
e230: 55 4d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52  UM.void sqlite3R
e240: 6f 6f 74 50 61 67 65 4d 6f 76 65 64 28 44 62 20  ootPageMoved(Db 
e250: 2a 70 44 62 2c 20 69 6e 74 20 69 46 72 6f 6d 2c  *pDb, int iFrom,
e260: 20 69 6e 74 20 69 54 6f 29 7b 0a 20 20 48 61 73   int iTo){.  Has
e270: 68 45 6c 65 6d 20 2a 70 45 6c 65 6d 3b 0a 20 20  hElem *pElem;.  
e280: 48 61 73 68 20 2a 70 48 61 73 68 3b 0a 0a 20 20  Hash *pHash;..  
e290: 70 48 61 73 68 20 3d 20 26 70 44 62 2d 3e 70 53  pHash = &pDb->pS
e2a0: 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68 3b 0a  chema->tblHash;.
e2b0: 20 20 66 6f 72 28 70 45 6c 65 6d 3d 73 71 6c 69    for(pElem=sqli
e2c0: 74 65 48 61 73 68 46 69 72 73 74 28 70 48 61 73  teHashFirst(pHas
e2d0: 68 29 3b 20 70 45 6c 65 6d 3b 20 70 45 6c 65 6d  h); pElem; pElem
e2e0: 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28  =sqliteHashNext(
e2f0: 70 45 6c 65 6d 29 29 7b 0a 20 20 20 20 54 61 62  pElem)){.    Tab
e300: 6c 65 20 2a 70 54 61 62 20 3d 20 73 71 6c 69 74  le *pTab = sqlit
e310: 65 48 61 73 68 44 61 74 61 28 70 45 6c 65 6d 29  eHashData(pElem)
e320: 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e  ;.    if( pTab->
e330: 74 6e 75 6d 3d 3d 69 46 72 6f 6d 20 29 7b 0a 20  tnum==iFrom ){. 
e340: 20 20 20 20 20 70 54 61 62 2d 3e 74 6e 75 6d 20       pTab->tnum 
e350: 3d 20 69 54 6f 3b 0a 20 20 20 20 7d 0a 20 20 7d  = iTo;.    }.  }
e360: 0a 20 20 70 48 61 73 68 20 3d 20 26 70 44 62 2d  .  pHash = &pDb-
e370: 3e 70 53 63 68 65 6d 61 2d 3e 69 64 78 48 61 73  >pSchema->idxHas
e380: 68 3b 0a 20 20 66 6f 72 28 70 45 6c 65 6d 3d 73  h;.  for(pElem=s
e390: 71 6c 69 74 65 48 61 73 68 46 69 72 73 74 28 70  qliteHashFirst(p
e3a0: 48 61 73 68 29 3b 20 70 45 6c 65 6d 3b 20 70 45  Hash); pElem; pE
e3b0: 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73 68 4e 65  lem=sqliteHashNe
e3c0: 78 74 28 70 45 6c 65 6d 29 29 7b 0a 20 20 20 20  xt(pElem)){.    
e3d0: 49 6e 64 65 78 20 2a 70 49 64 78 20 3d 20 73 71  Index *pIdx = sq
e3e0: 6c 69 74 65 48 61 73 68 44 61 74 61 28 70 45 6c  liteHashData(pEl
e3f0: 65 6d 29 3b 0a 20 20 20 20 69 66 28 20 70 49 64  em);.    if( pId
e400: 78 2d 3e 74 6e 75 6d 3d 3d 69 46 72 6f 6d 20 29  x->tnum==iFrom )
e410: 7b 0a 20 20 20 20 20 20 70 49 64 78 2d 3e 74 6e  {.      pIdx->tn
e420: 75 6d 20 3d 20 69 54 6f 3b 0a 20 20 20 20 7d 0a  um = iTo;.    }.
e430: 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a    }.}.#endif../*
e440: 0a 2a 2a 20 57 72 69 74 65 20 63 6f 64 65 20 74  .** Write code t
e450: 6f 20 65 72 61 73 65 20 74 68 65 20 74 61 62 6c  o erase the tabl
e460: 65 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67 65  e with root-page
e470: 20 69 54 61 62 6c 65 20 66 72 6f 6d 20 64 61 74   iTable from dat
e480: 61 62 61 73 65 20 69 44 62 2e 0a 2a 2a 20 41 6c  abase iDb..** Al
e490: 73 6f 20 77 72 69 74 65 20 63 6f 64 65 20 74 6f  so write code to
e4a0: 20 6d 6f 64 69 66 79 20 74 68 65 20 73 71 6c 69   modify the sqli
e4b0: 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20  te_master table 
e4c0: 61 6e 64 20 69 6e 74 65 72 6e 61 6c 20 73 63 68  and internal sch
e4d0: 65 6d 61 0a 2a 2a 20 69 66 20 61 20 72 6f 6f 74  ema.** if a root
e4e0: 2d 70 61 67 65 20 6f 66 20 61 6e 6f 74 68 65 72  -page of another
e4f0: 20 74 61 62 6c 65 20 69 73 20 6d 6f 76 65 64 20   table is moved 
e500: 62 79 20 74 68 65 20 62 74 72 65 65 2d 6c 61 79  by the btree-lay
e510: 65 72 20 77 68 69 6c 73 74 0a 2a 2a 20 65 72 61  er whilst.** era
e520: 73 69 6e 67 20 69 54 61 62 6c 65 20 28 74 68 69  sing iTable (thi
e530: 73 20 63 61 6e 20 68 61 70 70 65 6e 20 77 69 74  s can happen wit
e540: 68 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d  h an auto-vacuum
e550: 20 64 61 74 61 62 61 73 65 29 2e 0a 2a 2f 20 0a   database)..*/ .
e560: 73 74 61 74 69 63 20 76 6f 69 64 20 64 65 73 74  static void dest
e570: 72 6f 79 52 6f 6f 74 50 61 67 65 28 50 61 72 73  royRootPage(Pars
e580: 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69  e *pParse, int i
e590: 54 61 62 6c 65 2c 20 69 6e 74 20 69 44 62 29 7b  Table, int iDb){
e5a0: 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c  .  Vdbe *v = sql
e5b0: 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
e5c0: 73 65 29 3b 0a 20 20 69 6e 74 20 72 31 20 3d 20  se);.  int r1 = 
e5d0: 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
e5e0: 67 28 70 50 61 72 73 65 29 3b 0a 20 20 73 71 6c  g(pParse);.  sql
e5f0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
e600: 2c 20 4f 50 5f 44 65 73 74 72 6f 79 2c 20 69 54  , OP_Destroy, iT
e610: 61 62 6c 65 2c 20 72 31 2c 20 69 44 62 29 3b 0a  able, r1, iDb);.
e620: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
e630: 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
e640: 20 2f 2a 20 4f 50 5f 44 65 73 74 72 6f 79 20 73   /* OP_Destroy s
e650: 74 6f 72 65 73 20 61 6e 20 69 6e 20 69 6e 74 65  tores an in inte
e660: 67 65 72 20 72 31 2e 20 49 66 20 74 68 69 73 20  ger r1. If this 
e670: 69 6e 74 65 67 65 72 0a 20 20 2a 2a 20 69 73 20  integer.  ** is 
e680: 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 69  non-zero, then i
e690: 74 20 69 73 20 74 68 65 20 72 6f 6f 74 20 70 61  t is the root pa
e6a0: 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 20 74  ge number of a t
e6b0: 61 62 6c 65 20 6d 6f 76 65 64 20 74 6f 0a 20 20  able moved to.  
e6c0: 2a 2a 20 6c 6f 63 61 74 69 6f 6e 20 69 54 61 62  ** location iTab
e6d0: 6c 65 2e 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  le. The followin
e6e0: 67 20 63 6f 64 65 20 6d 6f 64 69 66 69 65 73 20  g code modifies 
e6f0: 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  the sqlite_maste
e700: 72 20 74 61 62 6c 65 20 74 6f 0a 20 20 2a 2a 20  r table to.  ** 
e710: 72 65 66 6c 65 63 74 20 74 68 69 73 2e 0a 20 20  reflect this..  
e720: 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 22 23 25 64  **.  ** The "#%d
e730: 22 20 69 6e 20 74 68 65 20 53 51 4c 20 69 73 20  " in the SQL is 
e740: 61 20 73 70 65 63 69 61 6c 20 63 6f 6e 73 74 61  a special consta
e750: 6e 74 20 74 68 61 74 20 6d 65 61 6e 73 20 77 68  nt that means wh
e760: 61 74 65 76 65 72 20 76 61 6c 75 65 0a 20 20 2a  atever value.  *
e770: 2a 20 69 73 20 6f 6e 20 74 68 65 20 74 6f 70 20  * is on the top 
e780: 6f 66 20 74 68 65 20 73 74 61 63 6b 2e 20 20 53  of the stack.  S
e790: 65 65 20 73 71 6c 69 74 65 33 52 65 67 69 73 74  ee sqlite3Regist
e7a0: 65 72 45 78 70 72 28 29 2e 0a 20 20 2a 2f 0a 20  erExpr()..  */. 
e7b0: 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61   sqlite3NestedPa
e7c0: 72 73 65 28 70 50 61 72 73 65 2c 20 0a 20 20 20  rse(pParse, .   
e7d0: 20 20 22 55 50 44 41 54 45 20 25 51 2e 25 73 20    "UPDATE %Q.%s 
e7e0: 53 45 54 20 72 6f 6f 74 70 61 67 65 3d 25 64 20  SET rootpage=%d 
e7f0: 57 48 45 52 45 20 23 25 64 20 41 4e 44 20 72 6f  WHERE #%d AND ro
e800: 6f 74 70 61 67 65 3d 23 25 64 22 2c 0a 20 20 20  otpage=#%d",.   
e810: 20 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61 44    pParse->db->aD
e820: 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 2c 20 53 43  b[iDb].zName, SC
e830: 48 45 4d 41 5f 54 41 42 4c 45 28 69 44 62 29 2c  HEMA_TABLE(iDb),
e840: 20 69 54 61 62 6c 65 2c 20 72 31 2c 20 72 31 29   iTable, r1, r1)
e850: 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74  ;.#endif.  sqlit
e860: 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
e870: 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 7d 0a  (pParse, r1);.}.
e880: 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 56 44 42  ./*.** Write VDB
e890: 45 20 63 6f 64 65 20 74 6f 20 65 72 61 73 65 20  E code to erase 
e8a0: 74 61 62 6c 65 20 70 54 61 62 20 61 6e 64 20 61  table pTab and a
e8b0: 6c 6c 20 61 73 73 6f 63 69 61 74 65 64 20 69 6e  ll associated in
e8c0: 64 69 63 65 73 20 6f 6e 20 64 69 73 6b 2e 0a 2a  dices on disk..*
e8d0: 2a 20 43 6f 64 65 20 74 6f 20 75 70 64 61 74 65  * Code to update
e8e0: 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74   the sqlite_mast
e8f0: 65 72 20 74 61 62 6c 65 73 20 61 6e 64 20 69 6e  er tables and in
e900: 74 65 72 6e 61 6c 20 73 63 68 65 6d 61 20 64 65  ternal schema de
e910: 66 69 6e 69 74 69 6f 6e 73 0a 2a 2a 20 69 6e 20  finitions.** in 
e920: 63 61 73 65 20 61 20 72 6f 6f 74 2d 70 61 67 65  case a root-page
e930: 20 62 65 6c 6f 6e 67 69 6e 67 20 74 6f 20 61 6e   belonging to an
e940: 6f 74 68 65 72 20 74 61 62 6c 65 20 69 73 20 6d  other table is m
e950: 6f 76 65 64 20 62 79 20 74 68 65 20 62 74 72 65  oved by the btre
e960: 65 20 6c 61 79 65 72 0a 2a 2a 20 69 73 20 61 6c  e layer.** is al
e970: 73 6f 20 61 64 64 65 64 20 28 74 68 69 73 20 63  so added (this c
e980: 61 6e 20 68 61 70 70 65 6e 20 77 69 74 68 20 61  an happen with a
e990: 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61  n auto-vacuum da
e9a0: 74 61 62 61 73 65 29 2e 0a 2a 2f 0a 73 74 61 74  tabase)..*/.stat
e9b0: 69 63 20 76 6f 69 64 20 64 65 73 74 72 6f 79 54  ic void destroyT
e9c0: 61 62 6c 65 28 50 61 72 73 65 20 2a 70 50 61 72  able(Parse *pPar
e9d0: 73 65 2c 20 54 61 62 6c 65 20 2a 70 54 61 62 29  se, Table *pTab)
e9e0: 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  {.#ifdef SQLITE_
e9f0: 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
ea00: 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20    Index *pIdx;. 
ea10: 20 69 6e 74 20 69 44 62 20 3d 20 73 71 6c 69 74   int iDb = sqlit
ea20: 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28  e3SchemaToIndex(
ea30: 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 54 61 62  pParse->db, pTab
ea40: 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 64 65  ->pSchema);.  de
ea50: 73 74 72 6f 79 52 6f 6f 74 50 61 67 65 28 70 50  stroyRootPage(pP
ea60: 61 72 73 65 2c 20 70 54 61 62 2d 3e 74 6e 75 6d  arse, pTab->tnum
ea70: 2c 20 69 44 62 29 3b 0a 20 20 66 6f 72 28 70 49  , iDb);.  for(pI
ea80: 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b  dx=pTab->pIndex;
ea90: 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78   pIdx; pIdx=pIdx
eaa0: 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 64 65  ->pNext){.    de
eab0: 73 74 72 6f 79 52 6f 6f 74 50 61 67 65 28 70 50  stroyRootPage(pP
eac0: 61 72 73 65 2c 20 70 49 64 78 2d 3e 74 6e 75 6d  arse, pIdx->tnum
ead0: 2c 20 69 44 62 29 3b 0a 20 20 7d 0a 23 65 6c 73  , iDb);.  }.#els
eae0: 65 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 64 61  e.  /* If the da
eaf0: 74 61 62 61 73 65 20 6d 61 79 20 62 65 20 61 75  tabase may be au
eb00: 74 6f 2d 76 61 63 75 75 6d 20 63 61 70 61 62 6c  to-vacuum capabl
eb10: 65 20 28 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49  e (if SQLITE_OMI
eb20: 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 2a  T_AUTOVACUUM.  *
eb30: 2a 20 69 73 20 6e 6f 74 20 64 65 66 69 6e 65 64  * is not defined
eb40: 29 2c 20 74 68 65 6e 20 69 74 20 69 73 20 69 6d  ), then it is im
eb50: 70 6f 72 74 61 6e 74 20 74 6f 20 63 61 6c 6c 20  portant to call 
eb60: 4f 50 5f 44 65 73 74 72 6f 79 20 6f 6e 20 74 68  OP_Destroy on th
eb70: 65 0a 20 20 2a 2a 20 74 61 62 6c 65 20 61 6e 64  e.  ** table and
eb80: 20 69 6e 64 65 78 20 72 6f 6f 74 2d 70 61 67 65   index root-page
eb90: 73 20 69 6e 20 6f 72 64 65 72 2c 20 73 74 61 72  s in order, star
eba0: 74 69 6e 67 20 77 69 74 68 20 74 68 65 20 6e 75  ting with the nu
ebb0: 6d 65 72 69 63 61 6c 6c 79 20 0a 20 20 2a 2a 20  merically .  ** 
ebc0: 6c 61 72 67 65 73 74 20 72 6f 6f 74 2d 70 61 67  largest root-pag
ebd0: 65 20 6e 75 6d 62 65 72 2e 20 54 68 69 73 20 67  e number. This g
ebe0: 75 61 72 61 6e 74 65 65 73 20 74 68 61 74 20 6e  uarantees that n
ebf0: 6f 6e 65 20 6f 66 20 74 68 65 20 72 6f 6f 74 2d  one of the root-
ec00: 70 61 67 65 73 0a 20 20 2a 2a 20 74 6f 20 62 65  pages.  ** to be
ec10: 20 64 65 73 74 72 6f 79 65 64 20 69 73 20 72 65   destroyed is re
ec20: 6c 6f 63 61 74 65 64 20 62 79 20 61 6e 20 65 61  located by an ea
ec30: 72 6c 69 65 72 20 4f 50 5f 44 65 73 74 72 6f 79  rlier OP_Destroy
ec40: 2e 20 69 2e 65 2e 20 69 66 20 74 68 65 0a 20 20  . i.e. if the.  
ec50: 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 77 65 72  ** following wer
ec60: 65 20 63 6f 64 65 64 3a 0a 20 20 2a 2a 0a 20 20  e coded:.  **.  
ec70: 2a 2a 20 4f 50 5f 44 65 73 74 72 6f 79 20 34 20  ** OP_Destroy 4 
ec80: 30 0a 20 20 2a 2a 20 2e 2e 2e 0a 20 20 2a 2a 20  0.  ** ....  ** 
ec90: 4f 50 5f 44 65 73 74 72 6f 79 20 35 20 30 0a 20  OP_Destroy 5 0. 
eca0: 20 2a 2a 0a 20 20 2a 2a 20 61 6e 64 20 72 6f 6f   **.  ** and roo
ecb0: 74 20 70 61 67 65 20 35 20 68 61 70 70 65 6e 65  t page 5 happene
ecc0: 64 20 74 6f 20 62 65 20 74 68 65 20 6c 61 72 67  d to be the larg
ecd0: 65 73 74 20 72 6f 6f 74 2d 70 61 67 65 20 6e 75  est root-page nu
ece0: 6d 62 65 72 20 69 6e 20 74 68 65 0a 20 20 2a 2a  mber in the.  **
ecf0: 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 6e 20   database, then 
ed00: 72 6f 6f 74 20 70 61 67 65 20 35 20 77 6f 75 6c  root page 5 woul
ed10: 64 20 62 65 20 6d 6f 76 65 64 20 74 6f 20 70 61  d be moved to pa
ed20: 67 65 20 34 20 62 79 20 74 68 65 20 0a 20 20 2a  ge 4 by the .  *
ed30: 2a 20 22 4f 50 5f 44 65 73 74 72 6f 79 20 34 20  * "OP_Destroy 4 
ed40: 30 22 20 6f 70 63 6f 64 65 2e 20 54 68 65 20 73  0" opcode. The s
ed50: 75 62 73 65 71 75 65 6e 74 20 22 4f 50 5f 44 65  ubsequent "OP_De
ed60: 73 74 72 6f 79 20 35 20 30 22 20 77 6f 75 6c 64  stroy 5 0" would
ed70: 20 68 69 74 0a 20 20 2a 2a 20 61 20 66 72 65 65   hit.  ** a free
ed80: 2d 6c 69 73 74 20 70 61 67 65 2e 0a 20 20 2a 2f  -list page..  */
ed90: 0a 20 20 69 6e 74 20 69 54 61 62 20 3d 20 70 54  .  int iTab = pT
eda0: 61 62 2d 3e 74 6e 75 6d 3b 0a 20 20 69 6e 74 20  ab->tnum;.  int 
edb0: 69 44 65 73 74 72 6f 79 65 64 20 3d 20 30 3b 0a  iDestroyed = 0;.
edc0: 0a 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 20  .  while( 1 ){. 
edd0: 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a     Index *pIdx;.
ede0: 20 20 20 20 69 6e 74 20 69 4c 61 72 67 65 73 74      int iLargest
edf0: 20 3d 20 30 3b 0a 0a 20 20 20 20 69 66 28 20 69   = 0;..    if( i
ee00: 44 65 73 74 72 6f 79 65 64 3d 3d 30 20 7c 7c 20  Destroyed==0 || 
ee10: 69 54 61 62 3c 69 44 65 73 74 72 6f 79 65 64 20  iTab<iDestroyed 
ee20: 29 7b 0a 20 20 20 20 20 20 69 4c 61 72 67 65 73  ){.      iLarges
ee30: 74 20 3d 20 69 54 61 62 3b 0a 20 20 20 20 7d 0a  t = iTab;.    }.
ee40: 20 20 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61      for(pIdx=pTa
ee50: 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b  b->pIndex; pIdx;
ee60: 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78   pIdx=pIdx->pNex
ee70: 74 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 49  t){.      int iI
ee80: 64 78 20 3d 20 70 49 64 78 2d 3e 74 6e 75 6d 3b  dx = pIdx->tnum;
ee90: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
eea0: 49 64 78 2d 3e 70 53 63 68 65 6d 61 3d 3d 70 54  Idx->pSchema==pT
eeb0: 61 62 2d 3e 70 53 63 68 65 6d 61 20 29 3b 0a 20  ab->pSchema );. 
eec0: 20 20 20 20 20 69 66 28 20 28 69 44 65 73 74 72       if( (iDestr
eed0: 6f 79 65 64 3d 3d 30 20 7c 7c 20 28 69 49 64 78  oyed==0 || (iIdx
eee0: 3c 69 44 65 73 74 72 6f 79 65 64 29 29 20 26 26  <iDestroyed)) &&
eef0: 20 69 49 64 78 3e 69 4c 61 72 67 65 73 74 20 29   iIdx>iLargest )
ef00: 7b 0a 20 20 20 20 20 20 20 20 69 4c 61 72 67 65  {.        iLarge
ef10: 73 74 20 3d 20 69 49 64 78 3b 0a 20 20 20 20 20  st = iIdx;.     
ef20: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
ef30: 20 69 4c 61 72 67 65 73 74 3d 3d 30 20 29 7b 0a   iLargest==0 ){.
ef40: 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20        return;.  
ef50: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
ef60: 6e 74 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33  nt iDb = sqlite3
ef70: 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 70 50  SchemaToIndex(pP
ef80: 61 72 73 65 2d 3e 64 62 2c 20 70 54 61 62 2d 3e  arse->db, pTab->
ef90: 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 20 20  pSchema);.      
efa0: 64 65 73 74 72 6f 79 52 6f 6f 74 50 61 67 65 28  destroyRootPage(
efb0: 70 50 61 72 73 65 2c 20 69 4c 61 72 67 65 73 74  pParse, iLargest
efc0: 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20 69 44  , iDb);.      iD
efd0: 65 73 74 72 6f 79 65 64 20 3d 20 69 4c 61 72 67  estroyed = iLarg
efe0: 65 73 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  est;.    }.  }.#
eff0: 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  endif.}../*.** T
f000: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
f010: 61 6c 6c 65 64 20 74 6f 20 64 6f 20 74 68 65 20  alled to do the 
f020: 77 6f 72 6b 20 6f 66 20 61 20 44 52 4f 50 20 54  work of a DROP T
f030: 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a  ABLE statement..
f040: 2a 2a 20 70 4e 61 6d 65 20 69 73 20 74 68 65 20  ** pName is the 
f050: 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c  name of the tabl
f060: 65 20 74 6f 20 62 65 20 64 72 6f 70 70 65 64 2e  e to be dropped.
f070: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
f080: 44 72 6f 70 54 61 62 6c 65 28 50 61 72 73 65 20  DropTable(Parse 
f090: 2a 70 50 61 72 73 65 2c 20 53 72 63 4c 69 73 74  *pParse, SrcList
f0a0: 20 2a 70 4e 61 6d 65 2c 20 69 6e 74 20 69 73 56   *pName, int isV
f0b0: 69 65 77 2c 20 69 6e 74 20 6e 6f 45 72 72 29 7b  iew, int noErr){
f0c0: 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a  .  Table *pTab;.
f0d0: 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 73 71 6c    Vdbe *v;.  sql
f0e0: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
f0f0: 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 69 44 62  e->db;.  int iDb
f100: 3b 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  ;..  if( pParse-
f110: 3e 6e 45 72 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c  >nErr || db->mal
f120: 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
f130: 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f   goto exit_drop_
f140: 74 61 62 6c 65 3b 0a 20 20 7d 0a 20 20 61 73 73  table;.  }.  ass
f150: 65 72 74 28 20 70 4e 61 6d 65 2d 3e 6e 53 72 63  ert( pName->nSrc
f160: 3d 3d 31 20 29 3b 0a 20 20 70 54 61 62 20 3d 20  ==1 );.  pTab = 
f170: 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62  sqlite3LocateTab
f180: 6c 65 28 70 50 61 72 73 65 2c 20 70 4e 61 6d 65  le(pParse, pName
f190: 2d 3e 61 5b 30 5d 2e 7a 4e 61 6d 65 2c 20 70 4e  ->a[0].zName, pN
f1a0: 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 44 61 74 61 62  ame->a[0].zDatab
f1b0: 61 73 65 29 3b 0a 0a 20 20 69 66 28 20 70 54 61  ase);..  if( pTa
f1c0: 62 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  b==0 ){.    if( 
f1d0: 6e 6f 45 72 72 20 29 7b 0a 20 20 20 20 20 20 73  noErr ){.      s
f1e0: 71 6c 69 74 65 33 45 72 72 6f 72 43 6c 65 61 72  qlite3ErrorClear
f1f0: 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 7d 0a  (pParse);.    }.
f200: 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72      goto exit_dr
f210: 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 20 20  op_table;.  }.  
f220: 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68  iDb = sqlite3Sch
f230: 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70  emaToIndex(db, p
f240: 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20  Tab->pSchema);. 
f250: 20 61 73 73 65 72 74 28 20 69 44 62 3e 3d 30 20   assert( iDb>=0 
f260: 26 26 20 69 44 62 3c 64 62 2d 3e 6e 44 62 20 29  && iDb<db->nDb )
f270: 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 54 61 62 20  ;..  /* If pTab 
f280: 69 73 20 61 20 76 69 72 74 75 61 6c 20 74 61 62  is a virtual tab
f290: 6c 65 2c 20 63 61 6c 6c 20 56 69 65 77 47 65 74  le, call ViewGet
f2a0: 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 29 20 74 6f  ColumnNames() to
f2b0: 20 65 6e 73 75 72 65 0a 20 20 2a 2a 20 69 74 20   ensure.  ** it 
f2c0: 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 0a  is initialized..
f2d0: 20 20 2a 2f 0a 20 20 69 66 28 20 49 73 56 69 72    */.  if( IsVir
f2e0: 74 75 61 6c 28 70 54 61 62 29 20 26 26 20 73 71  tual(pTab) && sq
f2f0: 6c 69 74 65 33 56 69 65 77 47 65 74 43 6f 6c 75  lite3ViewGetColu
f300: 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20  mnNames(pParse, 
f310: 70 54 61 62 29 20 29 7b 0a 20 20 20 20 67 6f 74  pTab) ){.    got
f320: 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c  o exit_drop_tabl
f330: 65 3b 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20 53  e;.  }.#ifndef S
f340: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f  QLITE_OMIT_AUTHO
f350: 52 49 5a 41 54 49 4f 4e 0a 20 20 7b 0a 20 20 20  RIZATION.  {.   
f360: 20 69 6e 74 20 63 6f 64 65 3b 0a 20 20 20 20 63   int code;.    c
f370: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62 20  onst char *zTab 
f380: 3d 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69  = SCHEMA_TABLE(i
f390: 44 62 29 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63  Db);.    const c
f3a0: 68 61 72 20 2a 7a 44 62 20 3d 20 64 62 2d 3e 61  har *zDb = db->a
f3b0: 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20  Db[iDb].zName;. 
f3c0: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
f3d0: 41 72 67 32 20 3d 20 30 3b 0a 20 20 20 20 69 66  Arg2 = 0;.    if
f3e0: 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65  ( sqlite3AuthChe
f3f0: 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54  ck(pParse, SQLIT
f400: 45 5f 44 45 4c 45 54 45 2c 20 7a 54 61 62 2c 20  E_DELETE, zTab, 
f410: 30 2c 20 7a 44 62 29 29 7b 0a 20 20 20 20 20 20  0, zDb)){.      
f420: 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74  goto exit_drop_t
f430: 61 62 6c 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20  able;.    }.    
f440: 69 66 28 20 69 73 56 69 65 77 20 29 7b 0a 20 20  if( isView ){.  
f450: 20 20 20 20 69 66 28 20 21 4f 4d 49 54 5f 54 45      if( !OMIT_TE
f460: 4d 50 44 42 20 26 26 20 69 44 62 3d 3d 31 20 29  MPDB && iDb==1 )
f470: 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20 3d  {.        code =
f480: 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d   SQLITE_DROP_TEM
f490: 50 5f 56 49 45 57 3b 0a 20 20 20 20 20 20 7d 65  P_VIEW;.      }e
f4a0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 63 6f 64  lse{.        cod
f4b0: 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f  e = SQLITE_DROP_
f4c0: 56 49 45 57 3b 0a 20 20 20 20 20 20 7d 0a 23 69  VIEW;.      }.#i
f4d0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
f4e0: 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20  T_VIRTUALTABLE. 
f4f0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 49 73 56     }else if( IsV
f500: 69 72 74 75 61 6c 28 70 54 61 62 29 20 29 7b 0a  irtual(pTab) ){.
f510: 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c        code = SQL
f520: 49 54 45 5f 44 52 4f 50 5f 56 54 41 42 4c 45 3b  ITE_DROP_VTABLE;
f530: 0a 20 20 20 20 20 20 7a 41 72 67 32 20 3d 20 70  .      zArg2 = p
f540: 54 61 62 2d 3e 70 4d 6f 64 2d 3e 7a 4e 61 6d 65  Tab->pMod->zName
f550: 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c  ;.#endif.    }el
f560: 73 65 7b 0a 20 20 20 20 20 20 69 66 28 20 21 4f  se{.      if( !O
f570: 4d 49 54 5f 54 45 4d 50 44 42 20 26 26 20 69 44  MIT_TEMPDB && iD
f580: 62 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20  b==1 ){.        
f590: 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52  code = SQLITE_DR
f5a0: 4f 50 5f 54 45 4d 50 5f 54 41 42 4c 45 3b 0a 20  OP_TEMP_TABLE;. 
f5b0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
f5c0: 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54      code = SQLIT
f5d0: 45 5f 44 52 4f 50 5f 54 41 42 4c 45 3b 0a 20 20  E_DROP_TABLE;.  
f5e0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
f5f0: 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43  if( sqlite3AuthC
f600: 68 65 63 6b 28 70 50 61 72 73 65 2c 20 63 6f 64  heck(pParse, cod
f610: 65 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20  e, pTab->zName, 
f620: 7a 41 72 67 32 2c 20 7a 44 62 29 20 29 7b 0a 20  zArg2, zDb) ){. 
f630: 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64       goto exit_d
f640: 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 20 20 7d  rop_table;.    }
f650: 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
f660: 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65  AuthCheck(pParse
f670: 2c 20 53 51 4c 49 54 45 5f 44 45 4c 45 54 45 2c  , SQLITE_DELETE,
f680: 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 30 2c   pTab->zName, 0,
f690: 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20 67   zDb) ){.      g
f6a0: 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61  oto exit_drop_ta
f6b0: 62 6c 65 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  ble;.    }.  }.#
f6c0: 65 6e 64 69 66 0a 20 20 69 66 28 20 70 54 61 62  endif.  if( pTab
f6d0: 2d 3e 72 65 61 64 4f 6e 6c 79 20 7c 7c 20 70 54  ->readOnly || pT
f6e0: 61 62 3d 3d 64 62 2d 3e 61 44 62 5b 69 44 62 5d  ab==db->aDb[iDb]
f6f0: 2e 70 53 63 68 65 6d 61 2d 3e 70 53 65 71 54 61  .pSchema->pSeqTa
f700: 62 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  b ){.    sqlite3
f710: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
f720: 20 22 74 61 62 6c 65 20 25 73 20 6d 61 79 20 6e   "table %s may n
f730: 6f 74 20 62 65 20 64 72 6f 70 70 65 64 22 2c 20  ot be dropped", 
f740: 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pTab->zName);.  
f750: 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70    goto exit_drop
f760: 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 0a 23 69 66  _table;.  }..#if
f770: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
f780: 5f 56 49 45 57 0a 20 20 2f 2a 20 45 6e 73 75 72  _VIEW.  /* Ensur
f790: 65 20 44 52 4f 50 20 54 41 42 4c 45 20 69 73 20  e DROP TABLE is 
f7a0: 6e 6f 74 20 75 73 65 64 20 6f 6e 20 61 20 76 69  not used on a vi
f7b0: 65 77 2c 20 61 6e 64 20 44 52 4f 50 20 56 49 45  ew, and DROP VIE
f7c0: 57 20 69 73 20 6e 6f 74 20 75 73 65 64 0a 20 20  W is not used.  
f7d0: 2a 2a 20 6f 6e 20 61 20 74 61 62 6c 65 2e 0a 20  ** on a table.. 
f7e0: 20 2a 2f 0a 20 20 69 66 28 20 69 73 56 69 65 77   */.  if( isView
f7f0: 20 26 26 20 70 54 61 62 2d 3e 70 53 65 6c 65 63   && pTab->pSelec
f800: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  t==0 ){.    sqli
f810: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
f820: 73 65 2c 20 22 75 73 65 20 44 52 4f 50 20 54 41  se, "use DROP TA
f830: 42 4c 45 20 74 6f 20 64 65 6c 65 74 65 20 74 61  BLE to delete ta
f840: 62 6c 65 20 25 73 22 2c 20 70 54 61 62 2d 3e 7a  ble %s", pTab->z
f850: 4e 61 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20  Name);.    goto 
f860: 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b  exit_drop_table;
f870: 0a 20 20 7d 0a 20 20 69 66 28 20 21 69 73 56 69  .  }.  if( !isVi
f880: 65 77 20 26 26 20 70 54 61 62 2d 3e 70 53 65 6c  ew && pTab->pSel
f890: 65 63 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ect ){.    sqlit
f8a0: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
f8b0: 65 2c 20 22 75 73 65 20 44 52 4f 50 20 56 49 45  e, "use DROP VIE
f8c0: 57 20 74 6f 20 64 65 6c 65 74 65 20 76 69 65 77  W to delete view
f8d0: 20 25 73 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d   %s", pTab->zNam
f8e0: 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69  e);.    goto exi
f8f0: 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20  t_drop_table;.  
f900: 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 47  }.#endif..  /* G
f910: 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20  enerate code to 
f920: 72 65 6d 6f 76 65 20 74 68 65 20 74 61 62 6c 65  remove the table
f930: 20 66 72 6f 6d 20 74 68 65 20 6d 61 73 74 65 72   from the master
f940: 20 74 61 62 6c 65 0a 20 20 2a 2a 20 6f 6e 20 64   table.  ** on d
f950: 69 73 6b 2e 0a 20 20 2a 2f 0a 20 20 76 20 3d 20  isk..  */.  v = 
f960: 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
f970: 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76 20  Parse);.  if( v 
f980: 29 7b 0a 20 20 20 20 54 72 69 67 67 65 72 20 2a  ){.    Trigger *
f990: 70 54 72 69 67 67 65 72 3b 0a 20 20 20 20 44 62  pTrigger;.    Db
f9a0: 20 2a 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62   *pDb = &db->aDb
f9b0: 5b 69 44 62 5d 3b 0a 20 20 20 20 73 71 6c 69 74  [iDb];.    sqlit
f9c0: 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72  e3BeginWriteOper
f9d0: 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 31 2c  ation(pParse, 1,
f9e0: 20 69 44 62 29 3b 0a 0a 23 69 66 6e 64 65 66 20   iDb);..#ifndef 
f9f0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
fa00: 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 69 66 28  UALTABLE.    if(
fa10: 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29   IsVirtual(pTab)
fa20: 20 29 7b 0a 20 20 20 20 20 20 56 64 62 65 20 2a   ){.      Vdbe *
fa30: 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
fa40: 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  be(pParse);.    
fa50: 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20 20    if( v ){.     
fa60: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
fa70: 64 4f 70 30 28 76 2c 20 4f 50 5f 56 42 65 67 69  dOp0(v, OP_VBegi
fa80: 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  n);.      }.    
fa90: 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a  }.#endif..    /*
faa0: 20 44 72 6f 70 20 61 6c 6c 20 74 72 69 67 67 65   Drop all trigge
fab0: 72 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  rs associated wi
fac0: 74 68 20 74 68 65 20 74 61 62 6c 65 20 62 65 69  th the table bei
fad0: 6e 67 20 64 72 6f 70 70 65 64 2e 20 43 6f 64 65  ng dropped. Code
fae0: 0a 20 20 20 20 2a 2a 20 69 73 20 67 65 6e 65 72  .    ** is gener
faf0: 61 74 65 64 20 74 6f 20 72 65 6d 6f 76 65 20 65  ated to remove e
fb00: 6e 74 72 69 65 73 20 66 72 6f 6d 20 73 71 6c 69  ntries from sqli
fb10: 74 65 5f 6d 61 73 74 65 72 20 61 6e 64 2f 6f 72  te_master and/or
fb20: 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 5f 74  .    ** sqlite_t
fb30: 65 6d 70 5f 6d 61 73 74 65 72 20 69 66 20 72 65  emp_master if re
fb40: 71 75 69 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  quired..    */. 
fb50: 20 20 20 70 54 72 69 67 67 65 72 20 3d 20 70 54     pTrigger = pT
fb60: 61 62 2d 3e 70 54 72 69 67 67 65 72 3b 0a 20 20  ab->pTrigger;.  
fb70: 20 20 77 68 69 6c 65 28 20 70 54 72 69 67 67 65    while( pTrigge
fb80: 72 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  r ){.      asser
fb90: 74 28 20 70 54 72 69 67 67 65 72 2d 3e 70 53 63  t( pTrigger->pSc
fba0: 68 65 6d 61 3d 3d 70 54 61 62 2d 3e 70 53 63 68  hema==pTab->pSch
fbb0: 65 6d 61 20 7c 7c 20 0a 20 20 20 20 20 20 20 20  ema || .        
fbc0: 20 20 70 54 72 69 67 67 65 72 2d 3e 70 53 63 68    pTrigger->pSch
fbd0: 65 6d 61 3d 3d 64 62 2d 3e 61 44 62 5b 31 5d 2e  ema==db->aDb[1].
fbe0: 70 53 63 68 65 6d 61 20 29 3b 0a 20 20 20 20 20  pSchema );.     
fbf0: 20 73 71 6c 69 74 65 33 44 72 6f 70 54 72 69 67   sqlite3DropTrig
fc00: 67 65 72 50 74 72 28 70 50 61 72 73 65 2c 20 70  gerPtr(pParse, p
fc10: 54 72 69 67 67 65 72 29 3b 0a 20 20 20 20 20 20  Trigger);.      
fc20: 70 54 72 69 67 67 65 72 20 3d 20 70 54 72 69 67  pTrigger = pTrig
fc30: 67 65 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  ger->pNext;.    
fc40: 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
fc50: 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 43 52 45  E_OMIT_AUTOINCRE
fc60: 4d 45 4e 54 0a 20 20 20 20 2f 2a 20 52 65 6d 6f  MENT.    /* Remo
fc70: 76 65 20 61 6e 79 20 65 6e 74 72 69 65 73 20 6f  ve any entries o
fc80: 66 20 74 68 65 20 73 71 6c 69 74 65 5f 73 65 71  f the sqlite_seq
fc90: 75 65 6e 63 65 20 74 61 62 6c 65 20 61 73 73 6f  uence table asso
fca0: 63 69 61 74 65 64 20 77 69 74 68 0a 20 20 20 20  ciated with.    
fcb0: 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 62 65 69  ** the table bei
fcc0: 6e 67 20 64 72 6f 70 70 65 64 2e 20 54 68 69 73  ng dropped. This
fcd0: 20 69 73 20 64 6f 6e 65 20 62 65 66 6f 72 65 20   is done before 
fce0: 74 68 65 20 74 61 62 6c 65 20 69 73 20 64 72 6f  the table is dro
fcf0: 70 70 65 64 0a 20 20 20 20 2a 2a 20 61 74 20 74  pped.    ** at t
fd00: 68 65 20 62 74 72 65 65 20 6c 65 76 65 6c 2c 20  he btree level, 
fd10: 69 6e 20 63 61 73 65 20 74 68 65 20 73 71 6c 69  in case the sqli
fd20: 74 65 5f 73 65 71 75 65 6e 63 65 20 74 61 62 6c  te_sequence tabl
fd30: 65 20 6e 65 65 64 73 20 74 6f 0a 20 20 20 20 2a  e needs to.    *
fd40: 2a 20 6d 6f 76 65 20 61 73 20 61 20 72 65 73 75  * move as a resu
fd50: 6c 74 20 6f 66 20 74 68 65 20 64 72 6f 70 20 28  lt of the drop (
fd60: 63 61 6e 20 68 61 70 70 65 6e 20 69 6e 20 61 75  can happen in au
fd70: 74 6f 2d 76 61 63 75 75 6d 20 6d 6f 64 65 29 2e  to-vacuum mode).
fd80: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
fd90: 70 54 61 62 2d 3e 61 75 74 6f 49 6e 63 20 29 7b  pTab->autoInc ){
fda0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4e 65  .      sqlite3Ne
fdb0: 73 74 65 64 50 61 72 73 65 28 70 50 61 72 73 65  stedParse(pParse
fdc0: 2c 0a 20 20 20 20 20 20 20 20 22 44 45 4c 45 54  ,.        "DELET
fdd0: 45 20 46 52 4f 4d 20 25 73 2e 73 71 6c 69 74 65  E FROM %s.sqlite
fde0: 5f 73 65 71 75 65 6e 63 65 20 57 48 45 52 45 20  _sequence WHERE 
fdf0: 6e 61 6d 65 3d 25 51 22 2c 0a 20 20 20 20 20 20  name=%Q",.      
fe00: 20 20 70 44 62 2d 3e 7a 4e 61 6d 65 2c 20 70 54    pDb->zName, pT
fe10: 61 62 2d 3e 7a 4e 61 6d 65 0a 20 20 20 20 20 20  ab->zName.      
fe20: 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  );.    }.#endif.
fe30: 0a 20 20 20 20 2f 2a 20 44 72 6f 70 20 61 6c 6c  .    /* Drop all
fe40: 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52 20 74   SQLITE_MASTER t
fe50: 61 62 6c 65 20 61 6e 64 20 69 6e 64 65 78 20 65  able and index e
fe60: 6e 74 72 69 65 73 20 74 68 61 74 20 72 65 66 65  ntries that refe
fe70: 72 20 74 6f 20 74 68 65 0a 20 20 20 20 2a 2a 20  r to the.    ** 
fe80: 74 61 62 6c 65 2e 20 54 68 65 20 70 72 6f 67 72  table. The progr
fe90: 61 6d 20 6e 61 6d 65 20 6c 6f 6f 70 73 20 74 68  am name loops th
fea0: 72 6f 75 67 68 20 74 68 65 20 6d 61 73 74 65 72  rough the master
feb0: 20 74 61 62 6c 65 20 61 6e 64 20 64 65 6c 65 74   table and delet
fec0: 65 73 0a 20 20 20 20 2a 2a 20 65 76 65 72 79 20  es.    ** every 
fed0: 72 6f 77 20 74 68 61 74 20 72 65 66 65 72 73 20  row that refers 
fee0: 74 6f 20 61 20 74 61 62 6c 65 20 6f 66 20 74 68  to a table of th
fef0: 65 20 73 61 6d 65 20 6e 61 6d 65 20 61 73 20 74  e same name as t
ff00: 68 65 20 6f 6e 65 20 62 65 69 6e 67 0a 20 20 20  he one being.   
ff10: 20 2a 2a 20 64 72 6f 70 70 65 64 2e 20 54 72 69   ** dropped. Tri
ff20: 67 67 65 72 73 20 61 72 65 20 68 61 6e 64 6c 65  ggers are handle
ff30: 64 20 73 65 70 65 72 61 74 65 6c 79 20 62 65 63  d seperately bec
ff40: 61 75 73 65 20 61 20 74 72 69 67 67 65 72 20 63  ause a trigger c
ff50: 61 6e 20 62 65 0a 20 20 20 20 2a 2a 20 63 72 65  an be.    ** cre
ff60: 61 74 65 64 20 69 6e 20 74 68 65 20 74 65 6d 70  ated in the temp
ff70: 20 64 61 74 61 62 61 73 65 20 74 68 61 74 20 72   database that r
ff80: 65 66 65 72 73 20 74 6f 20 61 20 74 61 62 6c 65  efers to a table
ff90: 20 69 6e 20 61 6e 6f 74 68 65 72 0a 20 20 20 20   in another.    
ffa0: 2a 2a 20 64 61 74 61 62 61 73 65 2e 0a 20 20 20  ** database..   
ffb0: 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 4e   */.    sqlite3N
ffc0: 65 73 74 65 64 50 61 72 73 65 28 70 50 61 72 73  estedParse(pPars
ffd0: 65 2c 20 0a 20 20 20 20 20 20 20 20 22 44 45 4c  e, .        "DEL
ffe0: 45 54 45 20 46 52 4f 4d 20 25 51 2e 25 73 20 57  ETE FROM %Q.%s W
fff0: 48 45 52 45 20 74 62 6c 5f 6e 61 6d 65 3d 25 51  HERE tbl_name=%Q
10000 20 61 6e 64 20 74 79 70 65 21 3d 27 74 72 69 67   and type!='trig
10010 67 65 72 27 22 2c 0a 20 20 20 20 20 20 20 20 70  ger'",.        p
10020 44 62 2d 3e 7a 4e 61 6d 65 2c 20 53 43 48 45 4d  Db->zName, SCHEM
10030 41 5f 54 41 42 4c 45 28 69 44 62 29 2c 20 70 54  A_TABLE(iDb), pT
10040 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ab->zName);.    
10050 69 66 28 20 21 69 73 56 69 65 77 20 26 26 20 21  if( !isView && !
10060 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20  IsVirtual(pTab) 
10070 29 7b 0a 20 20 20 20 20 20 64 65 73 74 72 6f 79  ){.      destroy
10080 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70 54  Table(pParse, pT
10090 61 62 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ab);.    }..    
100a0 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 74 61  /* Remove the ta
100b0 62 6c 65 20 65 6e 74 72 79 20 66 72 6f 6d 20 53  ble entry from S
100c0 51 4c 69 74 65 27 73 20 69 6e 74 65 72 6e 61 6c  QLite's internal
100d0 20 73 63 68 65 6d 61 20 61 6e 64 20 6d 6f 64 69   schema and modi
100e0 66 79 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 63  fy.    ** the sc
100f0 68 65 6d 61 20 63 6f 6f 6b 69 65 2e 0a 20 20 20  hema cookie..   
10100 20 2a 2f 0a 20 20 20 20 69 66 28 20 49 73 56 69   */.    if( IsVi
10110 72 74 75 61 6c 28 70 54 61 62 29 20 29 7b 0a 20  rtual(pTab) ){. 
10120 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
10130 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 56 44 65  AddOp4(v, OP_VDe
10140 73 74 72 6f 79 2c 20 69 44 62 2c 20 30 2c 20 30  stroy, iDb, 0, 0
10150 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 30  , pTab->zName, 0
10160 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
10170 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
10180 2c 20 4f 50 5f 44 72 6f 70 54 61 62 6c 65 2c 20  , OP_DropTable, 
10190 69 44 62 2c 20 30 2c 20 30 2c 20 70 54 61 62 2d  iDb, 0, 0, pTab-
101a0 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20  >zName, 0);.    
101b0 73 71 6c 69 74 65 33 43 68 61 6e 67 65 43 6f 6f  sqlite3ChangeCoo
101c0 6b 69 65 28 70 50 61 72 73 65 2c 20 69 44 62 29  kie(pParse, iDb)
101d0 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 56 69  ;.  }.  sqliteVi
101e0 65 77 52 65 73 65 74 41 6c 6c 28 64 62 2c 20 69  ewResetAll(db, i
101f0 44 62 29 3b 0a 0a 65 78 69 74 5f 64 72 6f 70 5f  Db);..exit_drop_
10200 74 61 62 6c 65 3a 0a 20 20 73 71 6c 69 74 65 33  table:.  sqlite3
10210 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28 70 4e  SrcListDelete(pN
10220 61 6d 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ame);.}../*.** T
10230 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
10240 61 6c 6c 65 64 20 74 6f 20 63 72 65 61 74 65 20  alled to create 
10250 61 20 6e 65 77 20 66 6f 72 65 69 67 6e 20 6b 65  a new foreign ke
10260 79 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 0a 2a  y on the table.*
10270 2a 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65  * currently unde
10280 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 20  r construction. 
10290 20 70 46 72 6f 6d 43 6f 6c 20 64 65 74 65 72 6d   pFromCol determ
102a0 69 6e 65 73 20 77 68 69 63 68 20 63 6f 6c 75 6d  ines which colum
102b0 6e 73 0a 2a 2a 20 69 6e 20 74 68 65 20 63 75 72  ns.** in the cur
102c0 72 65 6e 74 20 74 61 62 6c 65 20 70 6f 69 6e 74  rent table point
102d0 20 74 6f 20 74 68 65 20 66 6f 72 65 69 67 6e 20   to the foreign 
102e0 6b 65 79 2e 20 20 49 66 20 70 46 72 6f 6d 43 6f  key.  If pFromCo
102f0 6c 3d 3d 30 20 74 68 65 6e 0a 2a 2a 20 63 6f 6e  l==0 then.** con
10300 6e 65 63 74 20 74 68 65 20 6b 65 79 20 74 6f 20  nect the key to 
10310 74 68 65 20 6c 61 73 74 20 63 6f 6c 75 6d 6e 20  the last column 
10320 69 6e 73 65 72 74 65 64 2e 20 20 70 54 6f 20 69  inserted.  pTo i
10330 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 0a 2a 2a  s the name of.**
10340 20 74 68 65 20 74 61 62 6c 65 20 72 65 66 65 72   the table refer
10350 72 65 64 20 74 6f 2e 20 20 70 54 6f 43 6f 6c 20  red to.  pToCol 
10360 69 73 20 61 20 6c 69 73 74 20 6f 66 20 74 61 62  is a list of tab
10370 6c 65 73 20 69 6e 20 74 68 65 20 6f 74 68 65 72  les in the other
10380 0a 2a 2a 20 70 54 6f 20 74 61 62 6c 65 20 74 68  .** pTo table th
10390 61 74 20 74 68 65 20 66 6f 72 65 69 67 6e 20 6b  at the foreign k
103a0 65 79 20 70 6f 69 6e 74 73 20 74 6f 2e 20 20 66  ey points to.  f
103b0 6c 61 67 73 20 63 6f 6e 74 61 69 6e 73 20 61 6c  lags contains al
103c0 6c 0a 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  l.** information
103d0 20 61 62 6f 75 74 20 74 68 65 20 63 6f 6e 66 6c   about the confl
103e0 69 63 74 20 72 65 73 6f 6c 75 74 69 6f 6e 20 61  ict resolution a
103f0 6c 67 6f 72 69 74 68 6d 73 20 73 70 65 63 69 66  lgorithms specif
10400 69 65 64 0a 2a 2a 20 69 6e 20 74 68 65 20 4f 4e  ied.** in the ON
10410 20 44 45 4c 45 54 45 2c 20 4f 4e 20 55 50 44 41   DELETE, ON UPDA
10420 54 45 20 61 6e 64 20 4f 4e 20 49 4e 53 45 52 54  TE and ON INSERT
10430 20 63 6c 61 75 73 65 73 2e 0a 2a 2a 0a 2a 2a 20   clauses..**.** 
10440 41 6e 20 46 4b 65 79 20 73 74 72 75 63 74 75 72  An FKey structur
10450 65 20 69 73 20 63 72 65 61 74 65 64 20 61 6e 64  e is created and
10460 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 74 61   added to the ta
10470 62 6c 65 20 63 75 72 72 65 6e 74 6c 79 0a 2a 2a  ble currently.**
10480 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74   under construct
10490 69 6f 6e 20 69 6e 20 74 68 65 20 70 50 61 72 73  ion in the pPars
104a0 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 66 69 65  e->pNewTable fie
104b0 6c 64 2e 20 20 54 68 65 20 6e 65 77 20 46 4b 65  ld.  The new FKe
104c0 79 0a 2a 2a 20 69 73 20 6e 6f 74 20 6c 69 6e 6b  y.** is not link
104d0 65 64 20 69 6e 74 6f 20 64 62 2d 3e 61 46 4b 65  ed into db->aFKe
104e0 79 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74 20  y at this point 
104f0 2d 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20  - that does not 
10500 68 61 70 70 65 6e 0a 2a 2a 20 75 6e 74 69 6c 20  happen.** until 
10510 73 71 6c 69 74 65 33 45 6e 64 54 61 62 6c 65 28  sqlite3EndTable(
10520 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 72  )..**.** The for
10530 65 69 67 6e 20 6b 65 79 20 69 73 20 73 65 74 20  eign key is set 
10540 66 6f 72 20 49 4d 4d 45 44 49 41 54 45 20 70 72  for IMMEDIATE pr
10550 6f 63 65 73 73 69 6e 67 2e 20 20 41 20 73 75 62  ocessing.  A sub
10560 73 65 71 75 65 6e 74 20 63 61 6c 6c 0a 2a 2a 20  sequent call.** 
10570 74 6f 20 73 71 6c 69 74 65 33 44 65 66 65 72 46  to sqlite3DeferF
10580 6f 72 65 69 67 6e 4b 65 79 28 29 20 6d 69 67 68  oreignKey() migh
10590 74 20 63 68 61 6e 67 65 20 74 68 69 73 20 74 6f  t change this to
105a0 20 44 45 46 45 52 52 45 44 2e 0a 2a 2f 0a 76 6f   DEFERRED..*/.vo
105b0 69 64 20 73 71 6c 69 74 65 33 43 72 65 61 74 65  id sqlite3Create
105c0 46 6f 72 65 69 67 6e 4b 65 79 28 0a 20 20 50 61  ForeignKey(.  Pa
105d0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
105e0 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
105f0 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c  ntext */.  ExprL
10600 69 73 74 20 2a 70 46 72 6f 6d 43 6f 6c 2c 20 20  ist *pFromCol,  
10610 2f 2a 20 43 6f 6c 75 6d 6e 73 20 69 6e 20 74 68  /* Columns in th
10620 69 73 20 74 61 62 6c 65 20 74 68 61 74 20 70 6f  is table that po
10630 69 6e 74 20 74 6f 20 6f 74 68 65 72 20 74 61 62  int to other tab
10640 6c 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  le */.  Token *p
10650 54 6f 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  To,          /* 
10660 4e 61 6d 65 20 6f 66 20 74 68 65 20 6f 74 68 65  Name of the othe
10670 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20 45 78 70  r table */.  Exp
10680 72 4c 69 73 74 20 2a 70 54 6f 43 6f 6c 2c 20 20  rList *pToCol,  
10690 20 20 2f 2a 20 43 6f 6c 75 6d 6e 73 20 69 6e 20    /* Columns in 
106a0 74 68 65 20 6f 74 68 65 72 20 74 61 62 6c 65 20  the other table 
106b0 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 20  */.  int flags  
106c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e            /* Con
106d0 66 6c 69 63 74 20 72 65 73 6f 6c 75 74 69 6f 6e  flict resolution
106e0 20 61 6c 67 6f 72 69 74 68 6d 73 2e 20 2a 2f 0a   algorithms. */.
106f0 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ){.#ifndef SQLIT
10700 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b  E_OMIT_FOREIGN_K
10710 45 59 0a 20 20 46 4b 65 79 20 2a 70 46 4b 65 79  EY.  FKey *pFKey
10720 20 3d 20 30 3b 0a 20 20 54 61 62 6c 65 20 2a 70   = 0;.  Table *p
10730 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54   = pParse->pNewT
10740 61 62 6c 65 3b 0a 20 20 69 6e 74 20 6e 42 79 74  able;.  int nByt
10750 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e  e;.  int i;.  in
10760 74 20 6e 43 6f 6c 3b 0a 20 20 63 68 61 72 20 2a  t nCol;.  char *
10770 7a 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 54  z;..  assert( pT
10780 6f 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 3d  o!=0 );.  if( p=
10790 3d 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45  =0 || pParse->nE
107a0 72 72 20 7c 7c 20 49 4e 5f 44 45 43 4c 41 52 45  rr || IN_DECLARE
107b0 5f 56 54 41 42 20 29 20 67 6f 74 6f 20 66 6b 5f  _VTAB ) goto fk_
107c0 65 6e 64 3b 0a 20 20 69 66 28 20 70 46 72 6f 6d  end;.  if( pFrom
107d0 43 6f 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e  Col==0 ){.    in
107e0 74 20 69 43 6f 6c 20 3d 20 70 2d 3e 6e 43 6f 6c  t iCol = p->nCol
107f0 2d 31 3b 0a 20 20 20 20 69 66 28 20 69 43 6f 6c  -1;.    if( iCol
10800 3c 30 20 29 20 67 6f 74 6f 20 66 6b 5f 65 6e 64  <0 ) goto fk_end
10810 3b 0a 20 20 20 20 69 66 28 20 70 54 6f 43 6f 6c  ;.    if( pToCol
10820 20 26 26 20 70 54 6f 43 6f 6c 2d 3e 6e 45 78 70   && pToCol->nExp
10830 72 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 73 71  r!=1 ){.      sq
10840 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
10850 61 72 73 65 2c 20 22 66 6f 72 65 69 67 6e 20 6b  arse, "foreign k
10860 65 79 20 6f 6e 20 25 73 22 0a 20 20 20 20 20 20  ey on %s".      
10870 20 20 20 22 20 73 68 6f 75 6c 64 20 72 65 66 65     " should refe
10880 72 65 6e 63 65 20 6f 6e 6c 79 20 6f 6e 65 20 63  rence only one c
10890 6f 6c 75 6d 6e 20 6f 66 20 74 61 62 6c 65 20 25  olumn of table %
108a0 54 22 2c 0a 20 20 20 20 20 20 20 20 20 70 2d 3e  T",.         p->
108b0 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65  aCol[iCol].zName
108c0 2c 20 70 54 6f 29 3b 0a 20 20 20 20 20 20 67 6f  , pTo);.      go
108d0 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 20 20 7d  to fk_end;.    }
108e0 0a 20 20 20 20 6e 43 6f 6c 20 3d 20 31 3b 0a 20  .    nCol = 1;. 
108f0 20 7d 65 6c 73 65 20 69 66 28 20 70 54 6f 43 6f   }else if( pToCo
10900 6c 20 26 26 20 70 54 6f 43 6f 6c 2d 3e 6e 45 78  l && pToCol->nEx
10910 70 72 21 3d 70 46 72 6f 6d 43 6f 6c 2d 3e 6e 45  pr!=pFromCol->nE
10920 78 70 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  xpr ){.    sqlit
10930 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
10940 65 2c 0a 20 20 20 20 20 20 20 20 22 6e 75 6d 62  e,.        "numb
10950 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e  er of columns in
10960 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 64 6f 65   foreign key doe
10970 73 20 6e 6f 74 20 6d 61 74 63 68 20 74 68 65 20  s not match the 
10980 6e 75 6d 62 65 72 20 6f 66 20 22 0a 20 20 20 20  number of ".    
10990 20 20 20 20 22 63 6f 6c 75 6d 6e 73 20 69 6e 20      "columns in 
109a0 74 68 65 20 72 65 66 65 72 65 6e 63 65 64 20 74  the referenced t
109b0 61 62 6c 65 22 29 3b 0a 20 20 20 20 67 6f 74 6f  able");.    goto
109c0 20 66 6b 5f 65 6e 64 3b 0a 20 20 7d 65 6c 73 65   fk_end;.  }else
109d0 7b 0a 20 20 20 20 6e 43 6f 6c 20 3d 20 70 46 72  {.    nCol = pFr
109e0 6f 6d 43 6f 6c 2d 3e 6e 45 78 70 72 3b 0a 20 20  omCol->nExpr;.  
109f0 7d 0a 20 20 6e 42 79 74 65 20 3d 20 73 69 7a 65  }.  nByte = size
10a00 6f 66 28 2a 70 46 4b 65 79 29 20 2b 20 6e 43 6f  of(*pFKey) + nCo
10a10 6c 2a 73 69 7a 65 6f 66 28 70 46 4b 65 79 2d 3e  l*sizeof(pFKey->
10a20 61 43 6f 6c 5b 30 5d 29 20 2b 20 70 54 6f 2d 3e  aCol[0]) + pTo->
10a30 6e 20 2b 20 31 3b 0a 20 20 69 66 28 20 70 54 6f  n + 1;.  if( pTo
10a40 43 6f 6c 20 29 7b 0a 20 20 20 20 66 6f 72 28 69  Col ){.    for(i
10a50 3d 30 3b 20 69 3c 70 54 6f 43 6f 6c 2d 3e 6e 45  =0; i<pToCol->nE
10a60 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  xpr; i++){.     
10a70 20 6e 42 79 74 65 20 2b 3d 20 73 74 72 6c 65 6e   nByte += strlen
10a80 28 70 54 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e  (pToCol->a[i].zN
10a90 61 6d 65 29 20 2b 20 31 3b 0a 20 20 20 20 7d 0a  ame) + 1;.    }.
10aa0 20 20 7d 0a 20 20 70 46 4b 65 79 20 3d 20 73 71    }.  pFKey = sq
10ab0 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72  lite3DbMallocZer
10ac0 6f 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 6e 42  o(pParse->db, nB
10ad0 79 74 65 20 29 3b 0a 20 20 69 66 28 20 70 46 4b  yte );.  if( pFK
10ae0 65 79 3d 3d 30 20 29 7b 0a 20 20 20 20 67 6f 74  ey==0 ){.    got
10af0 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20  o fk_end;.  }.  
10b00 70 46 4b 65 79 2d 3e 70 46 72 6f 6d 20 3d 20 70  pFKey->pFrom = p
10b10 3b 0a 20 20 70 46 4b 65 79 2d 3e 70 4e 65 78 74  ;.  pFKey->pNext
10b20 46 72 6f 6d 20 3d 20 70 2d 3e 70 46 4b 65 79 3b  From = p->pFKey;
10b30 0a 20 20 7a 20 3d 20 28 63 68 61 72 2a 29 26 70  .  z = (char*)&p
10b40 46 4b 65 79 5b 31 5d 3b 0a 20 20 70 46 4b 65 79  FKey[1];.  pFKey
10b50 2d 3e 61 43 6f 6c 20 3d 20 28 73 74 72 75 63 74  ->aCol = (struct
10b60 20 73 43 6f 6c 4d 61 70 2a 29 7a 3b 0a 20 20 7a   sColMap*)z;.  z
10b70 20 2b 3d 20 73 69 7a 65 6f 66 28 73 74 72 75 63   += sizeof(struc
10b80 74 20 73 43 6f 6c 4d 61 70 29 2a 6e 43 6f 6c 3b  t sColMap)*nCol;
10b90 0a 20 20 70 46 4b 65 79 2d 3e 7a 54 6f 20 3d 20  .  pFKey->zTo = 
10ba0 7a 3b 0a 20 20 6d 65 6d 63 70 79 28 7a 2c 20 70  z;.  memcpy(z, p
10bb0 54 6f 2d 3e 7a 2c 20 70 54 6f 2d 3e 6e 29 3b 0a  To->z, pTo->n);.
10bc0 20 20 7a 5b 70 54 6f 2d 3e 6e 5d 20 3d 20 30 3b    z[pTo->n] = 0;
10bd0 0a 20 20 7a 20 2b 3d 20 70 54 6f 2d 3e 6e 2b 31  .  z += pTo->n+1
10be0 3b 0a 20 20 70 46 4b 65 79 2d 3e 70 4e 65 78 74  ;.  pFKey->pNext
10bf0 54 6f 20 3d 20 30 3b 0a 20 20 70 46 4b 65 79 2d  To = 0;.  pFKey-
10c00 3e 6e 43 6f 6c 20 3d 20 6e 43 6f 6c 3b 0a 20 20  >nCol = nCol;.  
10c10 69 66 28 20 70 46 72 6f 6d 43 6f 6c 3d 3d 30 20  if( pFromCol==0 
10c20 29 7b 0a 20 20 20 20 70 46 4b 65 79 2d 3e 61 43  ){.    pFKey->aC
10c30 6f 6c 5b 30 5d 2e 69 46 72 6f 6d 20 3d 20 70 2d  ol[0].iFrom = p-
10c40 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 7d 65 6c 73 65  >nCol-1;.  }else
10c50 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  {.    for(i=0; i
10c60 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nCol; i++){.   
10c70 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20     int j;.      
10c80 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 2d 3e 6e 43  for(j=0; j<p->nC
10c90 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  ol; j++){.      
10ca0 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72    if( sqlite3Str
10cb0 49 43 6d 70 28 70 2d 3e 61 43 6f 6c 5b 6a 5d 2e  ICmp(p->aCol[j].
10cc0 7a 4e 61 6d 65 2c 20 70 46 72 6f 6d 43 6f 6c 2d  zName, pFromCol-
10cd0 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20  >a[i].zName)==0 
10ce0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 46 4b  ){.          pFK
10cf0 65 79 2d 3e 61 43 6f 6c 5b 69 5d 2e 69 46 72 6f  ey->aCol[i].iFro
10d00 6d 20 3d 20 6a 3b 0a 20 20 20 20 20 20 20 20 20  m = j;.         
10d10 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
10d20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
10d30 69 66 28 20 6a 3e 3d 70 2d 3e 6e 43 6f 6c 20 29  if( j>=p->nCol )
10d40 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
10d50 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
10d60 2c 20 0a 20 20 20 20 20 20 20 20 20 20 22 75 6e  , .          "un
10d70 6b 6e 6f 77 6e 20 63 6f 6c 75 6d 6e 20 5c 22 25  known column \"%
10d80 73 5c 22 20 69 6e 20 66 6f 72 65 69 67 6e 20 6b  s\" in foreign k
10d90 65 79 20 64 65 66 69 6e 69 74 69 6f 6e 22 2c 20  ey definition", 
10da0 0a 20 20 20 20 20 20 20 20 20 20 70 46 72 6f 6d  .          pFrom
10db0 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29  Col->a[i].zName)
10dc0 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 66  ;.        goto f
10dd0 6b 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20  k_end;.      }. 
10de0 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70     }.  }.  if( p
10df0 54 6f 43 6f 6c 20 29 7b 0a 20 20 20 20 66 6f 72  ToCol ){.    for
10e00 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b  (i=0; i<nCol; i+
10e10 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 20  +){.      int n 
10e20 3d 20 73 74 72 6c 65 6e 28 70 54 6f 43 6f 6c 2d  = strlen(pToCol-
10e30 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20  >a[i].zName);.  
10e40 20 20 20 20 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b      pFKey->aCol[
10e50 69 5d 2e 7a 43 6f 6c 20 3d 20 7a 3b 0a 20 20 20  i].zCol = z;.   
10e60 20 20 20 6d 65 6d 63 70 79 28 7a 2c 20 70 54 6f     memcpy(z, pTo
10e70 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c  Col->a[i].zName,
10e80 20 6e 29 3b 0a 20 20 20 20 20 20 7a 5b 6e 5d 20   n);.      z[n] 
10e90 3d 20 30 3b 0a 20 20 20 20 20 20 7a 20 2b 3d 20  = 0;.      z += 
10ea0 6e 2b 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  n+1;.    }.  }. 
10eb0 20 70 46 4b 65 79 2d 3e 69 73 44 65 66 65 72 72   pFKey->isDeferr
10ec0 65 64 20 3d 20 30 3b 0a 20 20 70 46 4b 65 79 2d  ed = 0;.  pFKey-
10ed0 3e 64 65 6c 65 74 65 43 6f 6e 66 20 3d 20 66 6c  >deleteConf = fl
10ee0 61 67 73 20 26 20 30 78 66 66 3b 0a 20 20 70 46  ags & 0xff;.  pF
10ef0 4b 65 79 2d 3e 75 70 64 61 74 65 43 6f 6e 66 20  Key->updateConf 
10f00 3d 20 28 66 6c 61 67 73 20 3e 3e 20 38 20 29 20  = (flags >> 8 ) 
10f10 26 20 30 78 66 66 3b 0a 20 20 70 46 4b 65 79 2d  & 0xff;.  pFKey-
10f20 3e 69 6e 73 65 72 74 43 6f 6e 66 20 3d 20 28 66  >insertConf = (f
10f30 6c 61 67 73 20 3e 3e 20 31 36 20 29 20 26 20 30  lags >> 16 ) & 0
10f40 78 66 66 3b 0a 0a 20 20 2f 2a 20 4c 69 6e 6b 20  xff;..  /* Link 
10f50 74 68 65 20 66 6f 72 65 69 67 6e 20 6b 65 79 20  the foreign key 
10f60 74 6f 20 74 68 65 20 74 61 62 6c 65 20 61 73 20  to the table as 
10f70 74 68 65 20 6c 61 73 74 20 73 74 65 70 2e 0a 20  the last step.. 
10f80 20 2a 2f 0a 20 20 70 2d 3e 70 46 4b 65 79 20 3d   */.  p->pFKey =
10f90 20 70 46 4b 65 79 3b 0a 20 20 70 46 4b 65 79 20   pFKey;.  pFKey 
10fa0 3d 20 30 3b 0a 0a 66 6b 5f 65 6e 64 3a 0a 20 20  = 0;..fk_end:.  
10fb0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 46 4b  sqlite3_free(pFK
10fc0 65 79 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 21  ey);.#endif /* !
10fd0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
10fe0 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 29  MIT_FOREIGN_KEY)
10ff0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 45 78 70   */.  sqlite3Exp
11000 72 4c 69 73 74 44 65 6c 65 74 65 28 70 46 72 6f  rListDelete(pFro
11010 6d 43 6f 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33  mCol);.  sqlite3
11020 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70  ExprListDelete(p
11030 54 6f 43 6f 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ToCol);.}../*.**
11040 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
11050 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 6e 20   called when an 
11060 49 4e 49 54 49 41 4c 4c 59 20 49 4d 4d 45 44 49  INITIALLY IMMEDI
11070 41 54 45 20 6f 72 20 49 4e 49 54 49 41 4c 4c 59  ATE or INITIALLY
11080 20 44 45 46 45 52 52 45 44 0a 2a 2a 20 63 6c 61   DEFERRED.** cla
11090 75 73 65 20 69 73 20 73 65 65 6e 20 61 73 20 70  use is seen as p
110a0 61 72 74 20 6f 66 20 61 20 66 6f 72 65 69 67 6e  art of a foreign
110b0 20 6b 65 79 20 64 65 66 69 6e 69 74 69 6f 6e 2e   key definition.
110c0 20 20 54 68 65 20 69 73 44 65 66 65 72 72 65 64    The isDeferred
110d0 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 69 73  .** parameter is
110e0 20 31 20 66 6f 72 20 49 4e 49 54 49 41 4c 4c 59   1 for INITIALLY
110f0 20 44 45 46 45 52 52 45 44 20 61 6e 64 20 30 20   DEFERRED and 0 
11100 66 6f 72 20 49 4e 49 54 49 41 4c 4c 59 20 49 4d  for INITIALLY IM
11110 4d 45 44 49 41 54 45 2e 0a 2a 2a 20 54 68 65 20  MEDIATE..** The 
11120 62 65 68 61 76 69 6f 72 20 6f 66 20 74 68 65 20  behavior of the 
11130 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 63 72  most recently cr
11140 65 61 74 65 64 20 66 6f 72 65 69 67 6e 20 6b 65  eated foreign ke
11150 79 20 69 73 20 61 64 6a 75 73 74 65 64 0a 2a 2a  y is adjusted.**
11160 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e 0a 2a 2f   accordingly..*/
11170 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 44 65 66  .void sqlite3Def
11180 65 72 46 6f 72 65 69 67 6e 4b 65 79 28 50 61 72  erForeignKey(Par
11190 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20  se *pParse, int 
111a0 69 73 44 65 66 65 72 72 65 64 29 7b 0a 23 69 66  isDeferred){.#if
111b0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
111c0 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 0a 20 20 54  _FOREIGN_KEY.  T
111d0 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 46 4b  able *pTab;.  FK
111e0 65 79 20 2a 70 46 4b 65 79 3b 0a 20 20 69 66 28  ey *pFKey;.  if(
111f0 20 28 70 54 61 62 20 3d 20 70 50 61 72 73 65 2d   (pTab = pParse-
11200 3e 70 4e 65 77 54 61 62 6c 65 29 3d 3d 30 20 7c  >pNewTable)==0 |
11210 7c 20 28 70 46 4b 65 79 20 3d 20 70 54 61 62 2d  | (pFKey = pTab-
11220 3e 70 46 4b 65 79 29 3d 3d 30 20 29 20 72 65 74  >pFKey)==0 ) ret
11230 75 72 6e 3b 0a 20 20 70 46 4b 65 79 2d 3e 69 73  urn;.  pFKey->is
11240 44 65 66 65 72 72 65 64 20 3d 20 69 73 44 65 66  Deferred = isDef
11250 65 72 72 65 64 3b 0a 23 65 6e 64 69 66 0a 7d 0a  erred;.#endif.}.
11260 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
11270 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 65  code that will e
11280 72 61 73 65 20 61 6e 64 20 72 65 66 69 6c 6c 20  rase and refill 
11290 69 6e 64 65 78 20 2a 70 49 64 78 2e 20 20 54 68  index *pIdx.  Th
112a0 69 73 20 69 73 0a 2a 2a 20 75 73 65 64 20 74 6f  is is.** used to
112b0 20 69 6e 69 74 69 61 6c 69 7a 65 20 61 20 6e 65   initialize a ne
112c0 77 6c 79 20 63 72 65 61 74 65 64 20 69 6e 64 65  wly created inde
112d0 78 20 6f 72 20 74 6f 20 72 65 63 6f 6d 70 75 74  x or to recomput
112e0 65 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74  e the.** content
112f0 20 6f 66 20 61 6e 20 69 6e 64 65 78 20 69 6e 20   of an index in 
11300 72 65 73 70 6f 6e 73 65 20 74 6f 20 61 20 52 45  response to a RE
11310 49 4e 44 45 58 20 63 6f 6d 6d 61 6e 64 2e 0a 2a  INDEX command..*
11320 2a 0a 2a 2a 20 69 66 20 6d 65 6d 52 6f 6f 74 50  *.** if memRootP
11330 61 67 65 20 69 73 20 6e 6f 74 20 6e 65 67 61 74  age is not negat
11340 69 76 65 2c 20 69 74 20 6d 65 61 6e 73 20 74 68  ive, it means th
11350 61 74 20 74 68 65 20 69 6e 64 65 78 20 69 73 20  at the index is 
11360 6e 65 77 6c 79 0a 2a 2a 20 63 72 65 61 74 65 64  newly.** created
11370 2e 20 20 54 68 65 20 72 65 67 69 73 74 65 72 20  .  The register 
11380 73 70 65 63 69 66 69 65 64 20 62 79 20 6d 65 6d  specified by mem
11390 52 6f 6f 74 50 61 67 65 20 63 6f 6e 74 61 69 6e  RootPage contain
113a0 73 20 74 68 65 0a 2a 2a 20 72 6f 6f 74 20 70 61  s the.** root pa
113b0 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65  ge number of the
113c0 20 69 6e 64 65 78 2e 20 20 49 66 20 6d 65 6d 52   index.  If memR
113d0 6f 6f 74 50 61 67 65 20 69 73 20 6e 65 67 61 74  ootPage is negat
113e0 69 76 65 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65  ive, then.** the
113f0 20 69 6e 64 65 78 20 61 6c 72 65 61 64 79 20 65   index already e
11400 78 69 73 74 73 20 61 6e 64 20 6d 75 73 74 20 62  xists and must b
11410 65 20 63 6c 65 61 72 65 64 20 62 65 66 6f 72 65  e cleared before
11420 20 62 65 69 6e 67 20 72 65 66 69 6c 6c 65 64 20   being refilled 
11430 61 6e 64 0a 2a 2a 20 74 68 65 20 72 6f 6f 74 20  and.** the root 
11440 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74  page number of t
11450 68 65 20 69 6e 64 65 78 20 69 73 20 74 61 6b 65  he index is take
11460 6e 20 66 72 6f 6d 20 70 49 6e 64 65 78 2d 3e 74  n from pIndex->t
11470 6e 75 6d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  num..*/.static v
11480 6f 69 64 20 73 71 6c 69 74 65 33 52 65 66 69 6c  oid sqlite3Refil
11490 6c 49 6e 64 65 78 28 50 61 72 73 65 20 2a 70 50  lIndex(Parse *pP
114a0 61 72 73 65 2c 20 49 6e 64 65 78 20 2a 70 49 6e  arse, Index *pIn
114b0 64 65 78 2c 20 69 6e 74 20 6d 65 6d 52 6f 6f 74  dex, int memRoot
114c0 50 61 67 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a  Page){.  Table *
114d0 70 54 61 62 20 3d 20 70 49 6e 64 65 78 2d 3e 70  pTab = pIndex->p
114e0 54 61 62 6c 65 3b 20 20 2f 2a 20 54 68 65 20 74  Table;  /* The t
114f0 61 62 6c 65 20 74 68 61 74 20 69 73 20 69 6e 64  able that is ind
11500 65 78 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 54  exed */.  int iT
11510 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  ab = pParse->nTa
11520 62 3b 20 20 20 20 20 20 20 2f 2a 20 42 74 72 65  b;       /* Btre
11530 65 20 63 75 72 73 6f 72 20 75 73 65 64 20 66 6f  e cursor used fo
11540 72 20 70 54 61 62 20 2a 2f 0a 20 20 69 6e 74 20  r pTab */.  int 
11550 69 49 64 78 20 3d 20 70 50 61 72 73 65 2d 3e 6e  iIdx = pParse->n
11560 54 61 62 2b 31 3b 20 20 20 20 20 2f 2a 20 42 74  Tab+1;     /* Bt
11570 72 65 65 20 63 75 72 73 6f 72 20 75 73 65 64 20  ree cursor used 
11580 66 6f 72 20 70 49 6e 64 65 78 20 2a 2f 0a 20 20  for pIndex */.  
11590 69 6e 74 20 61 64 64 72 31 3b 20 20 20 20 20 20  int addr1;      
115a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
115b0 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 6f 70  * Address of top
115c0 20 6f 66 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e   of loop */.  in
115d0 74 20 74 6e 75 6d 3b 20 20 20 20 20 20 20 20 20  t tnum;         
115e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
115f0 52 6f 6f 74 20 70 61 67 65 20 6f 66 20 69 6e 64  Root page of ind
11600 65 78 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b  ex */.  Vdbe *v;
11610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11620 20 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61         /* Genera
11630 74 65 20 63 6f 64 65 20 69 6e 74 6f 20 74 68 69  te code into thi
11640 73 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e  s virtual machin
11650 65 20 2a 2f 0a 20 20 4b 65 79 49 6e 66 6f 20 2a  e */.  KeyInfo *
11660 70 4b 65 79 3b 20 20 20 20 20 20 20 20 20 20 20  pKey;           
11670 20 20 20 20 20 20 2f 2a 20 4b 65 79 49 6e 66 6f        /* KeyInfo
11680 20 66 6f 72 20 69 6e 64 65 78 20 2a 2f 0a 20 20   for index */.  
11690 69 6e 74 20 72 65 67 49 64 78 4b 65 79 3b 20 20  int regIdxKey;  
116a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
116b0 2a 20 52 65 67 69 73 74 65 72 73 20 63 6f 6e 74  * Registers cont
116c0 61 69 6e 69 6e 67 20 74 68 65 20 69 6e 64 65 78  aining the index
116d0 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20 72 65   key */.  int re
116e0 67 52 65 63 6f 72 64 3b 20 20 20 20 20 20 20 20  gRecord;        
116f0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69           /* Regi
11700 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 61 73 73  ster holding ass
11710 65 6d 62 6c 69 65 64 20 69 6e 64 65 78 20 72 65  emblied index re
11720 63 6f 72 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65  cord */.  sqlite
11730 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
11740 64 62 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20  db;      /* The 
11750 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
11760 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62  ion */.  int iDb
11770 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61   = sqlite3Schema
11780 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 49 6e 64  ToIndex(db, pInd
11790 65 78 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 0a 23  ex->pSchema);..#
117a0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
117b0 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e  IT_AUTHORIZATION
117c0 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75  .  if( sqlite3Au
117d0 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  thCheck(pParse, 
117e0 53 51 4c 49 54 45 5f 52 45 49 4e 44 45 58 2c 20  SQLITE_REINDEX, 
117f0 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 30  pIndex->zName, 0
11800 2c 0a 20 20 20 20 20 20 64 62 2d 3e 61 44 62 5b  ,.      db->aDb[
11810 69 44 62 5d 2e 7a 4e 61 6d 65 20 29 20 29 7b 0a  iDb].zName ) ){.
11820 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
11830 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 52 65 71  #endif..  /* Req
11840 75 69 72 65 20 61 20 77 72 69 74 65 2d 6c 6f 63  uire a write-loc
11850 6b 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 20 74  k on the table t
11860 6f 20 70 65 72 66 6f 72 6d 20 74 68 69 73 20 6f  o perform this o
11870 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 73 71  peration */.  sq
11880 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28 70  lite3TableLock(p
11890 50 61 72 73 65 2c 20 69 44 62 2c 20 70 54 61 62  Parse, iDb, pTab
118a0 2d 3e 74 6e 75 6d 2c 20 31 2c 20 70 54 61 62 2d  ->tnum, 1, pTab-
118b0 3e 7a 4e 61 6d 65 29 3b 0a 0a 20 20 76 20 3d 20  >zName);..  v = 
118c0 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
118d0 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76 3d  Parse);.  if( v=
118e0 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69  =0 ) return;.  i
118f0 66 28 20 6d 65 6d 52 6f 6f 74 50 61 67 65 3e 3d  f( memRootPage>=
11900 30 20 29 7b 0a 20 20 20 20 74 6e 75 6d 20 3d 20  0 ){.    tnum = 
11910 6d 65 6d 52 6f 6f 74 50 61 67 65 3b 0a 20 20 7d  memRootPage;.  }
11920 65 6c 73 65 7b 0a 20 20 20 20 74 6e 75 6d 20 3d  else{.    tnum =
11930 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 3b 0a 20   pIndex->tnum;. 
11940 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
11950 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6c 65 61 72  dOp2(v, OP_Clear
11960 2c 20 74 6e 75 6d 2c 20 69 44 62 29 3b 0a 20 20  , tnum, iDb);.  
11970 7d 0a 20 20 70 4b 65 79 20 3d 20 73 71 6c 69 74  }.  pKey = sqlit
11980 65 33 49 6e 64 65 78 4b 65 79 69 6e 66 6f 28 70  e3IndexKeyinfo(p
11990 50 61 72 73 65 2c 20 70 49 6e 64 65 78 29 3b 0a  Parse, pIndex);.
119a0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
119b0 4f 70 34 28 76 2c 20 4f 50 5f 4f 70 65 6e 57 72  Op4(v, OP_OpenWr
119c0 69 74 65 2c 20 69 49 64 78 2c 20 74 6e 75 6d 2c  ite, iIdx, tnum,
119d0 20 69 44 62 2c 20 0a 20 20 20 20 20 20 20 20 20   iDb, .         
119e0 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72             (char
119f0 20 2a 29 70 4b 65 79 2c 20 50 34 5f 4b 45 59 49   *)pKey, P4_KEYI
11a00 4e 46 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a 20 20  NFO_HANDOFF);.  
11a10 69 66 28 20 6d 65 6d 52 6f 6f 74 50 61 67 65 3e  if( memRootPage>
11a20 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
11a30 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c  3VdbeChangeP5(v,
11a40 20 31 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74   1);.  }.  sqlit
11a50 65 33 4f 70 65 6e 54 61 62 6c 65 28 70 50 61 72  e3OpenTable(pPar
11a60 73 65 2c 20 69 54 61 62 2c 20 69 44 62 2c 20 70  se, iTab, iDb, p
11a70 54 61 62 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64  Tab, OP_OpenRead
11a80 29 3b 0a 20 20 61 64 64 72 31 20 3d 20 73 71 6c  );.  addr1 = sql
11a90 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
11aa0 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 69 54 61  , OP_Rewind, iTa
11ab0 62 2c 20 30 29 3b 0a 20 20 72 65 67 52 65 63 6f  b, 0);.  regReco
11ac0 72 64 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  rd = sqlite3GetT
11ad0 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a  empReg(pParse);.
11ae0 20 20 72 65 67 49 64 78 4b 65 79 20 3d 20 73 71    regIdxKey = sq
11af0 6c 69 74 65 33 47 65 6e 65 72 61 74 65 49 6e 64  lite3GenerateInd
11b00 65 78 4b 65 79 28 70 50 61 72 73 65 2c 20 70 49  exKey(pParse, pI
11b10 6e 64 65 78 2c 20 69 54 61 62 2c 20 72 65 67 52  ndex, iTab, regR
11b20 65 63 6f 72 64 29 3b 0a 20 20 69 66 28 20 70 49  ecord);.  if( pI
11b30 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f  ndex->onError!=O
11b40 45 5f 4e 6f 6e 65 20 29 7b 0a 20 20 20 20 69 6e  E_None ){.    in
11b50 74 20 6a 31 2c 20 6a 32 3b 0a 20 20 20 20 69 6e  t j1, j2;.    in
11b60 74 20 72 65 67 52 6f 77 69 64 3b 0a 0a 20 20 20  t regRowid;..   
11b70 20 72 65 67 52 6f 77 69 64 20 3d 20 72 65 67 49   regRowid = regI
11b80 64 78 4b 65 79 20 2b 20 70 49 6e 64 65 78 2d 3e  dxKey + pIndex->
11b90 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 6a 31 20  nColumn;.    j1 
11ba0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
11bb0 4f 70 33 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c  Op3(v, OP_IsNull
11bc0 2c 20 72 65 67 49 64 78 4b 65 79 2c 20 30 2c 20  , regIdxKey, 0, 
11bd0 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 29  pIndex->nColumn)
11be0 3b 0a 20 20 20 20 6a 32 20 3d 20 73 71 6c 69 74  ;.    j2 = sqlit
11bf0 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
11c00 4f 50 5f 49 73 55 6e 69 71 75 65 2c 20 69 49 64  OP_IsUnique, iId
11c10 78 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  x,.             
11c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 2c                0,
11c30 20 72 65 67 52 6f 77 69 64 2c 20 28 63 68 61 72   regRowid, (char
11c40 2a 29 72 65 67 52 65 63 6f 72 64 2c 20 50 34 5f  *)regRecord, P4_
11c50 49 4e 54 33 32 29 3b 0a 20 20 20 20 73 71 6c 69  INT32);.    sqli
11c60 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
11c70 20 4f 50 5f 48 61 6c 74 2c 20 53 51 4c 49 54 45   OP_Halt, SQLITE
11c80 5f 43 4f 4e 53 54 52 41 49 4e 54 2c 20 4f 45 5f  _CONSTRAINT, OE_
11c90 41 62 6f 72 74 2c 20 30 2c 0a 20 20 20 20 20 20  Abort, 0,.      
11ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 69                "i
11cb0 6e 64 65 78 65 64 20 63 6f 6c 75 6d 6e 73 20 61  ndexed columns a
11cc0 72 65 20 6e 6f 74 20 75 6e 69 71 75 65 22 2c 20  re not unique", 
11cd0 50 34 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20  P4_STATIC);.    
11ce0 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
11cf0 65 72 65 28 76 2c 20 6a 31 29 3b 0a 20 20 20 20  ere(v, j1);.    
11d00 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
11d10 65 72 65 28 76 2c 20 6a 32 29 3b 0a 20 20 7d 0a  ere(v, j2);.  }.
11d20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
11d30 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73  Op2(v, OP_IdxIns
11d40 65 72 74 2c 20 69 49 64 78 2c 20 72 65 67 52 65  ert, iIdx, regRe
11d50 63 6f 72 64 29 3b 0a 20 20 73 71 6c 69 74 65 33  cord);.  sqlite3
11d60 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
11d70 50 61 72 73 65 2c 20 72 65 67 52 65 63 6f 72 64  Parse, regRecord
11d80 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
11d90 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78  AddOp2(v, OP_Nex
11da0 74 2c 20 69 54 61 62 2c 20 61 64 64 72 31 2b 31  t, iTab, addr1+1
11db0 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
11dc0 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
11dd0 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  1);.  sqlite3Vdb
11de0 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 43 6c  eAddOp1(v, OP_Cl
11df0 6f 73 65 2c 20 69 54 61 62 29 3b 0a 20 20 73 71  ose, iTab);.  sq
11e00 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
11e10 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 69 49 64  v, OP_Close, iId
11e20 78 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65  x);.}../*.** Cre
11e30 61 74 65 20 61 20 6e 65 77 20 69 6e 64 65 78 20  ate a new index 
11e40 66 6f 72 20 61 6e 20 53 51 4c 20 74 61 62 6c 65  for an SQL table
11e50 2e 20 20 70 4e 61 6d 65 31 2e 70 4e 61 6d 65 32  .  pName1.pName2
11e60 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20   is the name of 
11e70 74 68 65 20 69 6e 64 65 78 20 0a 2a 2a 20 61 6e  the index .** an
11e80 64 20 70 54 62 6c 4c 69 73 74 20 69 73 20 74 68  d pTblList is th
11e90 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61  e name of the ta
11ea0 62 6c 65 20 74 68 61 74 20 69 73 20 74 6f 20 62  ble that is to b
11eb0 65 20 69 6e 64 65 78 65 64 2e 20 20 42 6f 74 68  e indexed.  Both
11ec0 20 77 69 6c 6c 20 0a 2a 2a 20 62 65 20 4e 55 4c   will .** be NUL
11ed0 4c 20 66 6f 72 20 61 20 70 72 69 6d 61 72 79 20  L for a primary 
11ee0 6b 65 79 20 6f 72 20 61 6e 20 69 6e 64 65 78 20  key or an index 
11ef0 74 68 61 74 20 69 73 20 63 72 65 61 74 65 64 20  that is created 
11f00 74 6f 20 73 61 74 69 73 66 79 20 61 0a 2a 2a 20  to satisfy a.** 
11f10 55 4e 49 51 55 45 20 63 6f 6e 73 74 72 61 69 6e  UNIQUE constrain
11f20 74 2e 20 20 49 66 20 70 54 61 62 6c 65 20 61 6e  t.  If pTable an
11f30 64 20 70 49 6e 64 65 78 20 61 72 65 20 4e 55 4c  d pIndex are NUL
11f40 4c 2c 20 75 73 65 20 70 50 61 72 73 65 2d 3e 70  L, use pParse->p
11f50 4e 65 77 54 61 62 6c 65 0a 2a 2a 20 61 73 20 74  NewTable.** as t
11f60 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20 69  he table to be i
11f70 6e 64 65 78 65 64 2e 20 20 70 50 61 72 73 65 2d  ndexed.  pParse-
11f80 3e 70 4e 65 77 54 61 62 6c 65 20 69 73 20 61 20  >pNewTable is a 
11f90 74 61 62 6c 65 20 74 68 61 74 20 69 73 0a 2a 2a  table that is.**
11fa0 20 63 75 72 72 65 6e 74 6c 79 20 62 65 69 6e 67   currently being
11fb0 20 63 6f 6e 73 74 72 75 63 74 65 64 20 62 79 20   constructed by 
11fc0 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73  a CREATE TABLE s
11fd0 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20  tatement..**.** 
11fe0 70 4c 69 73 74 20 69 73 20 61 20 6c 69 73 74 20  pList is a list 
11ff0 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 62 65  of columns to be
12000 20 69 6e 64 65 78 65 64 2e 20 20 70 4c 69 73 74   indexed.  pList
12010 20 77 69 6c 6c 20 62 65 20 4e 55 4c 4c 20 69 66   will be NULL if
12020 20 74 68 69 73 0a 2a 2a 20 69 73 20 61 20 70 72   this.** is a pr
12030 69 6d 61 72 79 20 6b 65 79 20 6f 72 20 75 6e 69  imary key or uni
12040 71 75 65 2d 63 6f 6e 73 74 72 61 69 6e 74 20 6f  que-constraint o
12050 6e 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e  n the most recen
12060 74 20 63 6f 6c 75 6d 6e 20 61 64 64 65 64 0a 2a  t column added.*
12070 2a 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 63  * to the table c
12080 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63  urrently under c
12090 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 0a 2a  onstruction.  .*
120a0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 72  /.void sqlite3Cr
120b0 65 61 74 65 49 6e 64 65 78 28 0a 20 20 50 61 72  eateIndex(.  Par
120c0 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
120d0 2f 2a 20 41 6c 6c 20 69 6e 66 6f 72 6d 61 74 69  /* All informati
120e0 6f 6e 20 61 62 6f 75 74 20 74 68 69 73 20 70 61  on about this pa
120f0 72 73 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  rse */.  Token *
12100 70 4e 61 6d 65 31 2c 20 20 20 20 20 2f 2a 20 46  pName1,     /* F
12110 69 72 73 74 20 70 61 72 74 20 6f 66 20 69 6e 64  irst part of ind
12120 65 78 20 6e 61 6d 65 2e 20 4d 61 79 20 62 65 20  ex name. May be 
12130 4e 55 4c 4c 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  NULL */.  Token 
12140 2a 70 4e 61 6d 65 32 2c 20 20 20 20 20 2f 2a 20  *pName2,     /* 
12150 53 65 63 6f 6e 64 20 70 61 72 74 20 6f 66 20 69  Second part of i
12160 6e 64 65 78 20 6e 61 6d 65 2e 20 4d 61 79 20 62  ndex name. May b
12170 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 53 72 63 4c  e NULL */.  SrcL
12180 69 73 74 20 2a 70 54 62 6c 4e 61 6d 65 2c 20 2f  ist *pTblName, /
12190 2a 20 54 61 62 6c 65 20 74 6f 20 69 6e 64 65 78  * Table to index
121a0 2e 20 55 73 65 20 70 50 61 72 73 65 2d 3e 70 4e  . Use pParse->pN
121b0 65 77 54 61 62 6c 65 20 69 66 20 30 20 2a 2f 0a  ewTable if 0 */.
121c0 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73    ExprList *pLis
121d0 74 2c 20 20 20 2f 2a 20 41 20 6c 69 73 74 20 6f  t,   /* A list o
121e0 66 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 62 65 20  f columns to be 
121f0 69 6e 64 65 78 65 64 20 2a 2f 0a 20 20 69 6e 74  indexed */.  int
12200 20 6f 6e 45 72 72 6f 72 2c 20 20 20 20 20 20 20   onError,       
12210 2f 2a 20 4f 45 5f 41 62 6f 72 74 2c 20 4f 45 5f  /* OE_Abort, OE_
12220 49 67 6e 6f 72 65 2c 20 4f 45 5f 52 65 70 6c 61  Ignore, OE_Repla
12230 63 65 2c 20 6f 72 20 4f 45 5f 4e 6f 6e 65 20 2a  ce, or OE_None *
12240 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 53 74 61 72  /.  Token *pStar
12250 74 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 43 52  t,     /* The CR
12260 45 41 54 45 20 74 6f 6b 65 6e 20 74 68 61 74 20  EATE token that 
12270 62 65 67 69 6e 73 20 74 68 69 73 20 73 74 61 74  begins this stat
12280 65 6d 65 6e 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e  ement */.  Token
12290 20 2a 70 45 6e 64 2c 20 20 20 20 20 20 20 2f 2a   *pEnd,       /*
122a0 20 54 68 65 20 22 29 22 20 74 68 61 74 20 63 6c   The ")" that cl
122b0 6f 73 65 73 20 74 68 65 20 43 52 45 41 54 45 20  oses the CREATE 
122c0 49 4e 44 45 58 20 73 74 61 74 65 6d 65 6e 74 20  INDEX statement 
122d0 2a 2f 0a 20 20 69 6e 74 20 73 6f 72 74 4f 72 64  */.  int sortOrd
122e0 65 72 2c 20 20 20 20 20 2f 2a 20 53 6f 72 74 20  er,     /* Sort 
122f0 6f 72 64 65 72 20 6f 66 20 70 72 69 6d 61 72 79  order of primary
12300 20 6b 65 79 20 77 68 65 6e 20 70 4c 69 73 74 3d   key when pList=
12310 3d 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20 69  =NULL */.  int i
12320 66 4e 6f 74 45 78 69 73 74 20 20 20 20 20 2f 2a  fNotExist     /*
12330 20 4f 6d 69 74 20 65 72 72 6f 72 20 69 66 20 69   Omit error if i
12340 6e 64 65 78 20 61 6c 72 65 61 64 79 20 65 78 69  ndex already exi
12350 73 74 73 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c  sts */.){.  Tabl
12360 65 20 2a 70 54 61 62 20 3d 20 30 3b 20 20 20 20  e *pTab = 0;    
12370 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20 62 65 20   /* Table to be 
12380 69 6e 64 65 78 65 64 20 2a 2f 0a 20 20 49 6e 64  indexed */.  Ind
12390 65 78 20 2a 70 49 6e 64 65 78 20 3d 20 30 3b 20  ex *pIndex = 0; 
123a0 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 74    /* The index t
123b0 6f 20 62 65 20 63 72 65 61 74 65 64 20 2a 2f 0a  o be created */.
123c0 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20    char *zName = 
123d0 30 3b 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f  0;     /* Name o
123e0 66 20 74 68 65 20 69 6e 64 65 78 20 2a 2f 0a 20  f the index */. 
123f0 20 69 6e 74 20 6e 4e 61 6d 65 3b 20 20 20 20 20   int nName;     
12400 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
12410 6f 66 20 63 68 61 72 61 63 74 65 72 73 20 69 6e  of characters in
12420 20 7a 4e 61 6d 65 20 2a 2f 0a 20 20 69 6e 74 20   zName */.  int 
12430 69 2c 20 6a 3b 0a 20 20 54 6f 6b 65 6e 20 6e 75  i, j;.  Token nu
12440 6c 6c 49 64 3b 20 20 20 20 20 20 20 20 2f 2a 20  llId;        /* 
12450 46 61 6b 65 20 74 6f 6b 65 6e 20 66 6f 72 20 61  Fake token for a
12460 6e 20 65 6d 70 74 79 20 49 44 20 6c 69 73 74 20  n empty ID list 
12470 2a 2f 0a 20 20 44 62 46 69 78 65 72 20 73 46 69  */.  DbFixer sFi
12480 78 3b 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72  x;        /* For
12490 20 61 73 73 69 67 6e 69 6e 67 20 64 61 74 61 62   assigning datab
124a0 61 73 65 20 6e 61 6d 65 73 20 74 6f 20 70 54 61  ase names to pTa
124b0 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 73 6f 72  ble */.  int sor
124c0 74 4f 72 64 65 72 4d 61 73 6b 3b 20 20 20 2f 2a  tOrderMask;   /*
124d0 20 31 20 74 6f 20 68 6f 6e 6f 72 20 44 45 53 43   1 to honor DESC
124e0 20 69 6e 20 69 6e 64 65 78 2e 20 20 30 20 74 6f   in index.  0 to
124f0 20 69 67 6e 6f 72 65 2e 20 2a 2f 0a 20 20 73 71   ignore. */.  sq
12500 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
12510 73 65 2d 3e 64 62 3b 0a 20 20 44 62 20 2a 70 44  se->db;.  Db *pD
12520 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  b;             /
12530 2a 20 54 68 65 20 73 70 65 63 69 66 69 63 20 74  * The specific t
12540 61 62 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20  able containing 
12550 74 68 65 20 69 6e 64 65 78 65 64 20 64 61 74 61  the indexed data
12560 62 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69 44  base */.  int iD
12570 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  b;             /
12580 2a 20 49 6e 64 65 78 20 6f 66 20 74 68 65 20 64  * Index of the d
12590 61 74 61 62 61 73 65 20 74 68 61 74 20 69 73 20  atabase that is 
125a0 62 65 69 6e 67 20 77 72 69 74 74 65 6e 20 2a 2f  being written */
125b0 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 20  .  Token *pName 
125c0 3d 20 30 3b 20 20 20 20 2f 2a 20 55 6e 71 75 61  = 0;    /* Unqua
125d0 6c 69 66 69 65 64 20 6e 61 6d 65 20 6f 66 20 74  lified name of t
125e0 68 65 20 69 6e 64 65 78 20 74 6f 20 63 72 65 61  he index to crea
125f0 74 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 45  te */.  struct E
12600 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4c  xprList_item *pL
12610 69 73 74 49 74 65 6d 3b 20 2f 2a 20 46 6f 72 20  istItem; /* For 
12620 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 70 4c 69  looping over pLi
12630 73 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c  st */.  int nCol
12640 3b 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 20 3d  ;.  int nExtra =
12650 20 30 3b 0a 20 20 63 68 61 72 20 2a 7a 45 78 74   0;.  char *zExt
12660 72 61 3b 0a 0a 20 20 69 66 28 20 70 50 61 72 73  ra;..  if( pPars
12670 65 2d 3e 6e 45 72 72 20 7c 7c 20 64 62 2d 3e 6d  e->nErr || db->m
12680 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20 49  allocFailed || I
12690 4e 5f 44 45 43 4c 41 52 45 5f 56 54 41 42 20 29  N_DECLARE_VTAB )
126a0 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f  {.    goto exit_
126b0 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
126c0 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46 69 6e  }..  /*.  ** Fin
126d0 64 20 74 68 65 20 74 61 62 6c 65 20 74 68 61 74  d the table that
126e0 20 69 73 20 74 6f 20 62 65 20 69 6e 64 65 78 65   is to be indexe
126f0 64 2e 20 20 52 65 74 75 72 6e 20 65 61 72 6c 79  d.  Return early
12700 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 20   if not found.. 
12710 20 2a 2f 0a 20 20 69 66 28 20 70 54 62 6c 4e 61   */.  if( pTblNa
12720 6d 65 21 3d 30 20 29 7b 0a 0a 20 20 20 20 2f 2a  me!=0 ){..    /*
12730 20 55 73 65 20 74 68 65 20 74 77 6f 2d 70 61 72   Use the two-par
12740 74 20 69 6e 64 65 78 20 6e 61 6d 65 20 74 6f 20  t index name to 
12750 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20 64 61  determine the da
12760 74 61 62 61 73 65 20 0a 20 20 20 20 2a 2a 20 74  tabase .    ** t
12770 6f 20 73 65 61 72 63 68 20 66 6f 72 20 74 68 65  o search for the
12780 20 74 61 62 6c 65 2e 20 27 46 69 78 27 20 74 68   table. 'Fix' th
12790 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 74 6f 20  e table name to 
127a0 74 68 69 73 20 64 62 0a 20 20 20 20 2a 2a 20 62  this db.    ** b
127b0 65 66 6f 72 65 20 6c 6f 6f 6b 69 6e 67 20 75 70  efore looking up
127c0 20 74 68 65 20 74 61 62 6c 65 2e 0a 20 20 20 20   the table..    
127d0 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  */.    assert( p
127e0 4e 61 6d 65 31 20 26 26 20 70 4e 61 6d 65 32 20  Name1 && pName2 
127f0 29 3b 0a 20 20 20 20 69 44 62 20 3d 20 73 71 6c  );.    iDb = sql
12800 69 74 65 33 54 77 6f 50 61 72 74 4e 61 6d 65 28  ite3TwoPartName(
12810 70 50 61 72 73 65 2c 20 70 4e 61 6d 65 31 2c 20  pParse, pName1, 
12820 70 4e 61 6d 65 32 2c 20 26 70 4e 61 6d 65 29 3b  pName2, &pName);
12830 0a 20 20 20 20 69 66 28 20 69 44 62 3c 30 20 29  .    if( iDb<0 )
12840 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
12850 65 5f 69 6e 64 65 78 3b 0a 0a 23 69 66 6e 64 65  e_index;..#ifnde
12860 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 45  f SQLITE_OMIT_TE
12870 4d 50 44 42 0a 20 20 20 20 2f 2a 20 49 66 20 74  MPDB.    /* If t
12880 68 65 20 69 6e 64 65 78 20 6e 61 6d 65 20 77 61  he index name wa
12890 73 20 75 6e 71 75 61 6c 69 66 69 65 64 2c 20 63  s unqualified, c
128a0 68 65 63 6b 20 69 66 20 74 68 65 20 74 68 65 20  heck if the the 
128b0 74 61 62 6c 65 0a 20 20 20 20 2a 2a 20 69 73 20  table.    ** is 
128c0 61 20 74 65 6d 70 20 74 61 62 6c 65 2e 20 49 66  a temp table. If
128d0 20 73 6f 2c 20 73 65 74 20 74 68 65 20 64 61 74   so, set the dat
128e0 61 62 61 73 65 20 74 6f 20 31 2e 20 44 6f 20 6e  abase to 1. Do n
128f0 6f 74 20 64 6f 20 74 68 69 73 0a 20 20 20 20 2a  ot do this.    *
12900 2a 20 69 66 20 69 6e 69 74 69 61 6c 69 73 69 6e  * if initialisin
12910 67 20 61 20 64 61 74 61 62 61 73 65 20 73 63 68  g a database sch
12920 65 6d 61 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ema..    */.    
12930 69 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75  if( !db->init.bu
12940 73 79 20 29 7b 0a 20 20 20 20 20 20 70 54 61 62  sy ){.      pTab
12950 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73   = sqlite3SrcLis
12960 74 4c 6f 6f 6b 75 70 28 70 50 61 72 73 65 2c 20  tLookup(pParse, 
12970 70 54 62 6c 4e 61 6d 65 29 3b 0a 20 20 20 20 20  pTblName);.     
12980 20 69 66 28 20 70 4e 61 6d 65 32 20 26 26 20 70   if( pName2 && p
12990 4e 61 6d 65 32 2d 3e 6e 3d 3d 30 20 26 26 20 70  Name2->n==0 && p
129a0 54 61 62 20 26 26 20 70 54 61 62 2d 3e 70 53 63  Tab && pTab->pSc
129b0 68 65 6d 61 3d 3d 64 62 2d 3e 61 44 62 5b 31 5d  hema==db->aDb[1]
129c0 2e 70 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20  .pSchema ){.    
129d0 20 20 20 20 69 44 62 20 3d 20 31 3b 0a 20 20 20      iDb = 1;.   
129e0 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69     }.    }.#endi
129f0 66 0a 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  f..    if( sqlit
12a00 65 33 46 69 78 49 6e 69 74 28 26 73 46 69 78 2c  e3FixInit(&sFix,
12a10 20 70 50 61 72 73 65 2c 20 69 44 62 2c 20 22 69   pParse, iDb, "i
12a20 6e 64 65 78 22 2c 20 70 4e 61 6d 65 29 20 26 26  ndex", pName) &&
12a30 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
12a40 46 69 78 53 72 63 4c 69 73 74 28 26 73 46 69 78  FixSrcList(&sFix
12a50 2c 20 70 54 62 6c 4e 61 6d 65 29 0a 20 20 20 20  , pTblName).    
12a60 29 7b 0a 20 20 20 20 20 20 2f 2a 20 42 65 63 61  ){.      /* Beca
12a70 75 73 65 20 74 68 65 20 70 61 72 73 65 72 20 63  use the parser c
12a80 6f 6e 73 74 72 75 63 74 73 20 70 54 62 6c 4e 61  onstructs pTblNa
12a90 6d 65 20 66 72 6f 6d 20 61 20 73 69 6e 67 6c 65  me from a single
12aa0 20 69 64 65 6e 74 69 66 69 65 72 2c 0a 20 20 20   identifier,.   
12ab0 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 46 69 78     ** sqlite3Fix
12ac0 53 72 63 4c 69 73 74 20 63 61 6e 20 6e 65 76 65  SrcList can neve
12ad0 72 20 66 61 69 6c 2e 20 2a 2f 0a 20 20 20 20 20  r fail. */.     
12ae0 20 61 73 73 65 72 74 28 30 29 3b 0a 20 20 20 20   assert(0);.    
12af0 7d 0a 20 20 20 20 70 54 61 62 20 3d 20 73 71 6c  }.    pTab = sql
12b00 69 74 65 33 4c 6f 63 61 74 65 54 61 62 6c 65 28  ite3LocateTable(
12b10 70 50 61 72 73 65 2c 20 70 54 62 6c 4e 61 6d 65  pParse, pTblName
12b20 2d 3e 61 5b 30 5d 2e 7a 4e 61 6d 65 2c 20 0a 20  ->a[0].zName, . 
12b30 20 20 20 20 20 20 20 70 54 62 6c 4e 61 6d 65 2d         pTblName-
12b40 3e 61 5b 30 5d 2e 7a 44 61 74 61 62 61 73 65 29  >a[0].zDatabase)
12b50 3b 0a 20 20 20 20 69 66 28 20 21 70 54 61 62 20  ;.    if( !pTab 
12b60 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61  ) goto exit_crea
12b70 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 61 73  te_index;.    as
12b80 73 65 72 74 28 20 64 62 2d 3e 61 44 62 5b 69 44  sert( db->aDb[iD
12b90 62 5d 2e 70 53 63 68 65 6d 61 3d 3d 70 54 61 62  b].pSchema==pTab
12ba0 2d 3e 70 53 63 68 65 6d 61 20 29 3b 0a 20 20 7d  ->pSchema );.  }
12bb0 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74  else{.    assert
12bc0 28 20 70 4e 61 6d 65 3d 3d 30 20 29 3b 0a 20 20  ( pName==0 );.  
12bd0 20 20 70 54 61 62 20 3d 20 70 50 61 72 73 65 2d    pTab = pParse-
12be0 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 20 20  >pNewTable;.    
12bf0 69 66 28 20 21 70 54 61 62 20 29 20 67 6f 74 6f  if( !pTab ) goto
12c00 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
12c10 65 78 3b 0a 20 20 20 20 69 44 62 20 3d 20 73 71  ex;.    iDb = sq
12c20 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64  lite3SchemaToInd
12c30 65 78 28 64 62 2c 20 70 54 61 62 2d 3e 70 53 63  ex(db, pTab->pSc
12c40 68 65 6d 61 29 3b 0a 20 20 7d 0a 20 20 70 44 62  hema);.  }.  pDb
12c50 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d   = &db->aDb[iDb]
12c60 3b 0a 0a 20 20 69 66 28 20 70 54 61 62 3d 3d 30  ;..  if( pTab==0
12c70 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72   || pParse->nErr
12c80 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65   ) goto exit_cre
12c90 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 69 66 28  ate_index;.  if(
12ca0 20 70 54 61 62 2d 3e 72 65 61 64 4f 6e 6c 79 20   pTab->readOnly 
12cb0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
12cc0 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
12cd0 74 61 62 6c 65 20 25 73 20 6d 61 79 20 6e 6f 74  table %s may not
12ce0 20 62 65 20 69 6e 64 65 78 65 64 22 2c 20 70 54   be indexed", pT
12cf0 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ab->zName);.    
12d00 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
12d10 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 23 69 66 6e  _index;.  }.#ifn
12d20 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
12d30 56 49 45 57 0a 20 20 69 66 28 20 70 54 61 62 2d  VIEW.  if( pTab-
12d40 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20  >pSelect ){.    
12d50 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
12d60 70 50 61 72 73 65 2c 20 22 76 69 65 77 73 20 6d  pParse, "views m
12d70 61 79 20 6e 6f 74 20 62 65 20 69 6e 64 65 78 65  ay not be indexe
12d80 64 22 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78  d");.    goto ex
12d90 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
12da0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 6e  .  }.#endif.#ifn
12db0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
12dc0 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 69  VIRTUALTABLE.  i
12dd0 66 28 20 49 73 56 69 72 74 75 61 6c 28 70 54 61  f( IsVirtual(pTa
12de0 62 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  b) ){.    sqlite
12df0 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
12e00 2c 20 22 76 69 72 74 75 61 6c 20 74 61 62 6c 65  , "virtual table
12e10 73 20 6d 61 79 20 6e 6f 74 20 62 65 20 69 6e 64  s may not be ind
12e20 65 78 65 64 22 29 3b 0a 20 20 20 20 67 6f 74 6f  exed");.    goto
12e30 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
12e40 65 78 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  ex;.  }.#endif..
12e50 20 20 2f 2a 0a 20 20 2a 2a 20 46 69 6e 64 20 74    /*.  ** Find t
12e60 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 69  he name of the i
12e70 6e 64 65 78 2e 20 20 4d 61 6b 65 20 73 75 72 65  ndex.  Make sure
12e80 20 74 68 65 72 65 20 69 73 20 6e 6f 74 20 61 6c   there is not al
12e90 72 65 61 64 79 20 61 6e 6f 74 68 65 72 0a 20 20  ready another.  
12ea0 2a 2a 20 69 6e 64 65 78 20 6f 72 20 74 61 62 6c  ** index or tabl
12eb0 65 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20  e with the same 
12ec0 6e 61 6d 65 2e 20 20 0a 20 20 2a 2a 0a 20 20 2a  name.  .  **.  *
12ed0 2a 20 45 78 63 65 70 74 69 6f 6e 3a 20 20 49 66  * Exception:  If
12ee0 20 77 65 20 61 72 65 20 72 65 61 64 69 6e 67 20   we are reading 
12ef0 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 70 65 72  the names of per
12f00 6d 61 6e 65 6e 74 20 69 6e 64 69 63 65 73 20 66  manent indices f
12f10 72 6f 6d 20 74 68 65 0a 20 20 2a 2a 20 73 71 6c  rom the.  ** sql
12f20 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65  ite_master table
12f30 20 28 62 65 63 61 75 73 65 20 73 6f 6d 65 20 6f   (because some o
12f40 74 68 65 72 20 70 72 6f 63 65 73 73 20 63 68 61  ther process cha
12f50 6e 67 65 64 20 74 68 65 20 73 63 68 65 6d 61 29  nged the schema)
12f60 20 61 6e 64 0a 20 20 2a 2a 20 6f 6e 65 20 6f 66   and.  ** one of
12f70 20 74 68 65 20 69 6e 64 65 78 20 6e 61 6d 65 73   the index names
12f80 20 63 6f 6c 6c 69 64 65 73 20 77 69 74 68 20 74   collides with t
12f90 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 74 65 6d  he name of a tem
12fa0 70 6f 72 61 72 79 20 74 61 62 6c 65 20 6f 72 0a  porary table or.
12fb0 20 20 2a 2a 20 69 6e 64 65 78 2c 20 74 68 65 6e    ** index, then
12fc0 20 77 65 20 77 69 6c 6c 20 63 6f 6e 74 69 6e 75   we will continu
12fd0 65 20 74 6f 20 70 72 6f 63 65 73 73 20 74 68 69  e to process thi
12fe0 73 20 69 6e 64 65 78 2e 0a 20 20 2a 2a 0a 20 20  s index..  **.  
12ff0 2a 2a 20 49 66 20 70 4e 61 6d 65 3d 3d 30 20 69  ** If pName==0 i
13000 74 20 6d 65 61 6e 73 20 74 68 61 74 20 77 65 20  t means that we 
13010 61 72 65 0a 20 20 2a 2a 20 64 65 61 6c 69 6e 67  are.  ** dealing
13020 20 77 69 74 68 20 61 20 70 72 69 6d 61 72 79 20   with a primary 
13030 6b 65 79 20 6f 72 20 55 4e 49 51 55 45 20 63 6f  key or UNIQUE co
13040 6e 73 74 72 61 69 6e 74 2e 20 20 57 65 20 68 61  nstraint.  We ha
13050 76 65 20 74 6f 20 69 6e 76 65 6e 74 20 6f 75 72  ve to invent our
13060 0a 20 20 2a 2a 20 6f 77 6e 20 6e 61 6d 65 2e 0a  .  ** own name..
13070 20 20 2a 2f 0a 20 20 69 66 28 20 70 4e 61 6d 65    */.  if( pName
13080 20 29 7b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20   ){.    zName = 
13090 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54  sqlite3NameFromT
130a0 6f 6b 65 6e 28 64 62 2c 20 70 4e 61 6d 65 29 3b  oken(db, pName);
130b0 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f  .    if( SQLITE_
130c0 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65 61 64 53  OK!=sqlite3ReadS
130d0 63 68 65 6d 61 28 70 50 61 72 73 65 29 20 29 20  chema(pParse) ) 
130e0 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
130f0 5f 69 6e 64 65 78 3b 0a 20 20 20 20 69 66 28 20  _index;.    if( 
13100 7a 4e 61 6d 65 3d 3d 30 20 29 20 67 6f 74 6f 20  zName==0 ) goto 
13110 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
13120 78 3b 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54  x;.    if( SQLIT
13130 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 43 68 65  E_OK!=sqlite3Che
13140 63 6b 4f 62 6a 65 63 74 4e 61 6d 65 28 70 50 61  ckObjectName(pPa
13150 72 73 65 2c 20 7a 4e 61 6d 65 29 20 29 7b 0a 20  rse, zName) ){. 
13160 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63       goto exit_c
13170 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20  reate_index;.   
13180 20 7d 0a 20 20 20 20 69 66 28 20 21 64 62 2d 3e   }.    if( !db->
13190 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20 20 20  init.busy ){.   
131a0 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b     if( SQLITE_OK
131b0 21 3d 73 71 6c 69 74 65 33 52 65 61 64 53 63 68  !=sqlite3ReadSch
131c0 65 6d 61 28 70 50 61 72 73 65 29 20 29 20 67 6f  ema(pParse) ) go
131d0 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
131e0 6e 64 65 78 3b 0a 20 20 20 20 20 20 69 66 28 20  ndex;.      if( 
131f0 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65  sqlite3FindTable
13200 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 30 29 21 3d  (db, zName, 0)!=
13210 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  0 ){.        sql
13220 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
13230 72 73 65 2c 20 22 74 68 65 72 65 20 69 73 20 61  rse, "there is a
13240 6c 72 65 61 64 79 20 61 20 74 61 62 6c 65 20 6e  lready a table n
13250 61 6d 65 64 20 25 73 22 2c 20 7a 4e 61 6d 65 29  amed %s", zName)
13260 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65  ;.        goto e
13270 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
13280 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
13290 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 46      if( sqlite3F
132a0 69 6e 64 49 6e 64 65 78 28 64 62 2c 20 7a 4e 61  indIndex(db, zNa
132b0 6d 65 2c 20 70 44 62 2d 3e 7a 4e 61 6d 65 29 21  me, pDb->zName)!
132c0 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  =0 ){.      if( 
132d0 21 69 66 4e 6f 74 45 78 69 73 74 20 29 7b 0a 20  !ifNotExist ){. 
132e0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
132f0 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
13300 69 6e 64 65 78 20 25 73 20 61 6c 72 65 61 64 79  index %s already
13310 20 65 78 69 73 74 73 22 2c 20 7a 4e 61 6d 65 29   exists", zName)
13320 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
13330 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
13340 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20  _index;.    }.  
13350 7d 65 6c 73 65 7b 0a 20 20 20 20 63 68 61 72 20  }else{.    char 
13360 7a 42 75 66 5b 33 30 5d 3b 0a 20 20 20 20 69 6e  zBuf[30];.    in
13370 74 20 6e 3b 0a 20 20 20 20 49 6e 64 65 78 20 2a  t n;.    Index *
13380 70 4c 6f 6f 70 3b 0a 20 20 20 20 66 6f 72 28 70  pLoop;.    for(p
13390 4c 6f 6f 70 3d 70 54 61 62 2d 3e 70 49 6e 64 65  Loop=pTab->pInde
133a0 78 2c 20 6e 3d 31 3b 20 70 4c 6f 6f 70 3b 20 70  x, n=1; pLoop; p
133b0 4c 6f 6f 70 3d 70 4c 6f 6f 70 2d 3e 70 4e 65 78  Loop=pLoop->pNex
133c0 74 2c 20 6e 2b 2b 29 7b 7d 0a 20 20 20 20 73 71  t, n++){}.    sq
133d0 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73  lite3_snprintf(s
133e0 69 7a 65 6f 66 28 7a 42 75 66 29 2c 7a 42 75 66  izeof(zBuf),zBuf
133f0 2c 22 5f 25 64 22 2c 6e 29 3b 0a 20 20 20 20 7a  ,"_%d",n);.    z
13400 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 73 71  Name = 0;.    sq
13410 6c 69 74 65 33 53 65 74 53 74 72 69 6e 67 28 26  lite3SetString(&
13420 7a 4e 61 6d 65 2c 20 22 73 71 6c 69 74 65 5f 61  zName, "sqlite_a
13430 75 74 6f 69 6e 64 65 78 5f 22 2c 20 70 54 61 62  utoindex_", pTab
13440 2d 3e 7a 4e 61 6d 65 2c 20 7a 42 75 66 2c 20 28  ->zName, zBuf, (
13450 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 69 66  char*)0);.    if
13460 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20  ( zName==0 ){.  
13470 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61      db->mallocFa
13480 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20 20 20  iled = 1;.      
13490 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
134a0 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20  _index;.    }.  
134b0 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f  }..  /* Check fo
134c0 72 20 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20  r authorization 
134d0 74 6f 20 63 72 65 61 74 65 20 61 6e 20 69 6e 64  to create an ind
134e0 65 78 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66  ex..  */.#ifndef
134f0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
13500 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 7b 0a 20  HORIZATION.  {. 
13510 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
13520 44 62 20 3d 20 70 44 62 2d 3e 7a 4e 61 6d 65 3b  Db = pDb->zName;
13530 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
13540 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65  AuthCheck(pParse
13550 2c 20 53 51 4c 49 54 45 5f 49 4e 53 45 52 54 2c  , SQLITE_INSERT,
13560 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 44   SCHEMA_TABLE(iD
13570 62 29 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20  b), 0, zDb) ){. 
13580 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63       goto exit_c
13590 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20  reate_index;.   
135a0 20 7d 0a 20 20 20 20 69 20 3d 20 53 51 4c 49 54   }.    i = SQLIT
135b0 45 5f 43 52 45 41 54 45 5f 49 4e 44 45 58 3b 0a  E_CREATE_INDEX;.
135c0 20 20 20 20 69 66 28 20 21 4f 4d 49 54 5f 54 45      if( !OMIT_TE
135d0 4d 50 44 42 20 26 26 20 69 44 62 3d 3d 31 20 29  MPDB && iDb==1 )
135e0 20 69 20 3d 20 53 51 4c 49 54 45 5f 43 52 45 41   i = SQLITE_CREA
135f0 54 45 5f 54 45 4d 50 5f 49 4e 44 45 58 3b 0a 20  TE_TEMP_INDEX;. 
13600 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75     if( sqlite3Au
13610 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  thCheck(pParse, 
13620 69 2c 20 7a 4e 61 6d 65 2c 20 70 54 61 62 2d 3e  i, zName, pTab->
13630 7a 4e 61 6d 65 2c 20 7a 44 62 29 20 29 7b 0a 20  zName, zDb) ){. 
13640 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63       goto exit_c
13650 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20  reate_index;.   
13660 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20   }.  }.#endif.. 
13670 20 2f 2a 20 49 66 20 70 4c 69 73 74 3d 3d 30 2c   /* If pList==0,
13680 20 69 74 20 6d 65 61 6e 73 20 74 68 69 73 20 72   it means this r
13690 6f 75 74 69 6e 65 20 77 61 73 20 63 61 6c 6c 65  outine was calle
136a0 64 20 74 6f 20 6d 61 6b 65 20 61 20 70 72 69 6d  d to make a prim
136b0 61 72 79 0a 20 20 2a 2a 20 6b 65 79 20 6f 75 74  ary.  ** key out
136c0 20 6f 66 20 74 68 65 20 6c 61 73 74 20 63 6f 6c   of the last col
136d0 75 6d 6e 20 61 64 64 65 64 20 74 6f 20 74 68 65  umn added to the
136e0 20 74 61 62 6c 65 20 75 6e 64 65 72 20 63 6f 6e   table under con
136f0 73 74 72 75 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20  struction..  ** 
13700 53 6f 20 63 72 65 61 74 65 20 61 20 66 61 6b 65  So create a fake
13710 20 6c 69 73 74 20 74 6f 20 73 69 6d 75 6c 61 74   list to simulat
13720 65 20 74 68 69 73 2e 0a 20 20 2a 2f 0a 20 20 69  e this..  */.  i
13730 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20  f( pList==0 ){. 
13740 20 20 20 6e 75 6c 6c 49 64 2e 7a 20 3d 20 28 75     nullId.z = (u
13750 38 2a 29 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 54  8*)pTab->aCol[pT
13760 61 62 2d 3e 6e 43 6f 6c 2d 31 5d 2e 7a 4e 61 6d  ab->nCol-1].zNam
13770 65 3b 0a 20 20 20 20 6e 75 6c 6c 49 64 2e 6e 20  e;.    nullId.n 
13780 3d 20 73 74 72 6c 65 6e 28 28 63 68 61 72 2a 29  = strlen((char*)
13790 6e 75 6c 6c 49 64 2e 7a 29 3b 0a 20 20 20 20 70  nullId.z);.    p
137a0 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78  List = sqlite3Ex
137b0 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61  prListAppend(pPa
137c0 72 73 65 2c 20 30 2c 20 30 2c 20 26 6e 75 6c 6c  rse, 0, 0, &null
137d0 49 64 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69  Id);.    if( pLi
137e0 73 74 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78 69  st==0 ) goto exi
137f0 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
13800 20 20 20 20 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e      pList->a[0].
13810 73 6f 72 74 4f 72 64 65 72 20 3d 20 73 6f 72 74  sortOrder = sort
13820 4f 72 64 65 72 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  Order;.  }..  /*
13830 20 46 69 67 75 72 65 20 6f 75 74 20 68 6f 77 20   Figure out how 
13840 6d 61 6e 79 20 62 79 74 65 73 20 6f 66 20 73 70  many bytes of sp
13850 61 63 65 20 61 72 65 20 72 65 71 75 69 72 65 64  ace are required
13860 20 74 6f 20 73 74 6f 72 65 20 65 78 70 6c 69 63   to store explic
13870 69 74 6c 79 0a 20 20 2a 2a 20 73 70 65 63 69 66  itly.  ** specif
13880 69 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  ied collation se
13890 71 75 65 6e 63 65 20 6e 61 6d 65 73 2e 0a 20 20  quence names..  
138a0 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  */.  for(i=0; i<
138b0 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b  pList->nExpr; i+
138c0 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45  +){.    Expr *pE
138d0 78 70 72 20 3d 20 70 4c 69 73 74 2d 3e 61 5b 69  xpr = pList->a[i
138e0 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 69 66 28  ].pExpr;.    if(
138f0 20 70 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20   pExpr ){.      
13900 6e 45 78 74 72 61 20 2b 3d 20 28 31 20 2b 20 73  nExtra += (1 + s
13910 74 72 6c 65 6e 28 70 45 78 70 72 2d 3e 70 43 6f  trlen(pExpr->pCo
13920 6c 6c 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20  ll->zName));.   
13930 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 0a 20 20   }.  }..  /* .  
13940 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 74 68 65 20  ** Allocate the 
13950 69 6e 64 65 78 20 73 74 72 75 63 74 75 72 65 2e  index structure.
13960 20 0a 20 20 2a 2f 0a 20 20 6e 4e 61 6d 65 20 3d   .  */.  nName =
13970 20 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 3b 0a   strlen(zName);.
13980 20 20 6e 43 6f 6c 20 3d 20 70 4c 69 73 74 2d 3e    nCol = pList->
13990 6e 45 78 70 72 3b 0a 20 20 70 49 6e 64 65 78 20  nExpr;.  pIndex 
139a0 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
139b0 63 5a 65 72 6f 28 64 62 2c 20 0a 20 20 20 20 20  cZero(db, .     
139c0 20 73 69 7a 65 6f 66 28 49 6e 64 65 78 29 20 2b   sizeof(Index) +
139d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
139e0 20 49 6e 64 65 78 20 73 74 72 75 63 74 75 72 65   Index structure
139f0 20 20 2a 2f 0a 20 20 20 20 20 20 73 69 7a 65 6f    */.      sizeo
13a00 66 28 69 6e 74 29 2a 6e 43 6f 6c 20 2b 20 20 20  f(int)*nCol +   
13a10 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
13a20 2e 61 69 43 6f 6c 75 6d 6e 20 20 20 2a 2f 0a 20  .aiColumn   */. 
13a30 20 20 20 20 20 73 69 7a 65 6f 66 28 69 6e 74 29       sizeof(int)
13a40 2a 28 6e 43 6f 6c 2b 31 29 20 2b 20 20 20 20 20  *(nCol+1) +     
13a50 20 20 2f 2a 20 49 6e 64 65 78 2e 61 69 52 6f 77    /* Index.aiRow
13a60 45 73 74 20 20 20 2a 2f 0a 20 20 20 20 20 20 73  Est   */.      s
13a70 69 7a 65 6f 66 28 63 68 61 72 20 2a 29 2a 6e 43  izeof(char *)*nC
13a80 6f 6c 20 2b 20 20 20 20 20 20 20 20 2f 2a 20 49  ol +        /* I
13a90 6e 64 65 78 2e 61 7a 43 6f 6c 6c 20 20 20 20 20  ndex.azColl     
13aa0 2a 2f 0a 20 20 20 20 20 20 73 69 7a 65 6f 66 28  */.      sizeof(
13ab0 75 38 29 2a 6e 43 6f 6c 20 2b 20 20 20 20 20 20  u8)*nCol +      
13ac0 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 2e 61        /* Index.a
13ad0 53 6f 72 74 4f 72 64 65 72 20 2a 2f 0a 20 20 20  SortOrder */.   
13ae0 20 20 20 6e 4e 61 6d 65 20 2b 20 31 20 2b 20 20     nName + 1 +  
13af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13b00 2f 2a 20 49 6e 64 65 78 2e 7a 4e 61 6d 65 20 20  /* Index.zName  
13b10 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 6e 45 78      */.      nEx
13b20 74 72 61 20 20 20 20 20 20 20 20 20 20 20 20 20  tra             
13b30 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c            /* Col
13b40 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20  lation sequence 
13b50 6e 61 6d 65 73 20 2a 2f 0a 20 20 29 3b 0a 20 20  names */.  );.  
13b60 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
13b70 69 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f  iled ){.    goto
13b80 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
13b90 65 78 3b 0a 20 20 7d 0a 20 20 70 49 6e 64 65 78  ex;.  }.  pIndex
13ba0 2d 3e 61 7a 43 6f 6c 6c 20 3d 20 28 63 68 61 72  ->azColl = (char
13bb0 2a 2a 29 28 26 70 49 6e 64 65 78 5b 31 5d 29 3b  **)(&pIndex[1]);
13bc0 0a 20 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c  .  pIndex->aiCol
13bd0 75 6d 6e 20 3d 20 28 69 6e 74 20 2a 29 28 26 70  umn = (int *)(&p
13be0 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c 5b 6e 43  Index->azColl[nC
13bf0 6f 6c 5d 29 3b 0a 20 20 70 49 6e 64 65 78 2d 3e  ol]);.  pIndex->
13c00 61 69 52 6f 77 45 73 74 20 3d 20 28 75 6e 73 69  aiRowEst = (unsi
13c10 67 6e 65 64 20 2a 29 28 26 70 49 6e 64 65 78 2d  gned *)(&pIndex-
13c20 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 43 6f 6c 5d 29  >aiColumn[nCol])
13c30 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 61 53 6f 72  ;.  pIndex->aSor
13c40 74 4f 72 64 65 72 20 3d 20 28 75 38 20 2a 29 28  tOrder = (u8 *)(
13c50 26 70 49 6e 64 65 78 2d 3e 61 69 52 6f 77 45 73  &pIndex->aiRowEs
13c60 74 5b 6e 43 6f 6c 2b 31 5d 29 3b 0a 20 20 70 49  t[nCol+1]);.  pI
13c70 6e 64 65 78 2d 3e 7a 4e 61 6d 65 20 3d 20 28 63  ndex->zName = (c
13c80 68 61 72 20 2a 29 28 26 70 49 6e 64 65 78 2d 3e  har *)(&pIndex->
13c90 61 53 6f 72 74 4f 72 64 65 72 5b 6e 43 6f 6c 5d  aSortOrder[nCol]
13ca0 29 3b 0a 20 20 7a 45 78 74 72 61 20 3d 20 28 63  );.  zExtra = (c
13cb0 68 61 72 20 2a 29 28 26 70 49 6e 64 65 78 2d 3e  har *)(&pIndex->
13cc0 7a 4e 61 6d 65 5b 6e 4e 61 6d 65 2b 31 5d 29 3b  zName[nName+1]);
13cd0 0a 20 20 6d 65 6d 63 70 79 28 70 49 6e 64 65 78  .  memcpy(pIndex
13ce0 2d 3e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65 2c 20  ->zName, zName, 
13cf0 6e 4e 61 6d 65 2b 31 29 3b 0a 20 20 70 49 6e 64  nName+1);.  pInd
13d00 65 78 2d 3e 70 54 61 62 6c 65 20 3d 20 70 54 61  ex->pTable = pTa
13d10 62 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 6e 43 6f  b;.  pIndex->nCo
13d20 6c 75 6d 6e 20 3d 20 70 4c 69 73 74 2d 3e 6e 45  lumn = pList->nE
13d30 78 70 72 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 6f  xpr;.  pIndex->o
13d40 6e 45 72 72 6f 72 20 3d 20 6f 6e 45 72 72 6f 72  nError = onError
13d50 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 61 75 74 6f  ;.  pIndex->auto
13d60 49 6e 64 65 78 20 3d 20 70 4e 61 6d 65 3d 3d 30  Index = pName==0
13d70 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 70 53 63 68  ;.  pIndex->pSch
13d80 65 6d 61 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44  ema = db->aDb[iD
13d90 62 5d 2e 70 53 63 68 65 6d 61 3b 0a 0a 20 20 2f  b].pSchema;..  /
13da0 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69  * Check to see i
13db0 66 20 77 65 20 73 68 6f 75 6c 64 20 68 6f 6e 6f  f we should hono
13dc0 72 20 44 45 53 43 20 72 65 71 75 65 73 74 73 20  r DESC requests 
13dd0 6f 6e 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 73  on index columns
13de0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 44 62 2d  .  */.  if( pDb-
13df0 3e 70 53 63 68 65 6d 61 2d 3e 66 69 6c 65 5f 66  >pSchema->file_f
13e00 6f 72 6d 61 74 3e 3d 34 20 29 7b 0a 20 20 20 20  ormat>=4 ){.    
13e10 73 6f 72 74 4f 72 64 65 72 4d 61 73 6b 20 3d 20  sortOrderMask = 
13e20 2d 31 3b 20 20 20 2f 2a 20 48 6f 6e 6f 72 20 44  -1;   /* Honor D
13e30 45 53 43 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a  ESC */.  }else{.
13e40 20 20 20 20 73 6f 72 74 4f 72 64 65 72 4d 61 73      sortOrderMas
13e50 6b 20 3d 20 30 3b 20 20 20 20 2f 2a 20 49 67 6e  k = 0;    /* Ign
13e60 6f 72 65 20 44 45 53 43 20 2a 2f 0a 20 20 7d 0a  ore DESC */.  }.
13e70 0a 20 20 2f 2a 20 53 63 61 6e 20 74 68 65 20 6e  .  /* Scan the n
13e80 61 6d 65 73 20 6f 66 20 74 68 65 20 63 6f 6c 75  ames of the colu
13e90 6d 6e 73 20 6f 66 20 74 68 65 20 74 61 62 6c 65  mns of the table
13ea0 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64 20 61   to be indexed a
13eb0 6e 64 0a 20 20 2a 2a 20 6c 6f 61 64 20 74 68 65  nd.  ** load the
13ec0 20 63 6f 6c 75 6d 6e 20 69 6e 64 69 63 65 73 20   column indices 
13ed0 69 6e 74 6f 20 74 68 65 20 49 6e 64 65 78 20 73  into the Index s
13ee0 74 72 75 63 74 75 72 65 2e 20 20 52 65 70 6f 72  tructure.  Repor
13ef0 74 20 61 6e 20 65 72 72 6f 72 0a 20 20 2a 2a 20  t an error.  ** 
13f00 69 66 20 61 6e 79 20 63 6f 6c 75 6d 6e 20 69 73  if any column is
13f10 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 20 20 2a 2f   not found..  */
13f20 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 4c 69 73  .  for(i=0, pLis
13f30 74 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 3b 20  tItem=pList->a; 
13f40 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20  i<pList->nExpr; 
13f50 69 2b 2b 2c 20 70 4c 69 73 74 49 74 65 6d 2b 2b  i++, pListItem++
13f60 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  ){.    const cha
13f70 72 20 2a 7a 43 6f 6c 4e 61 6d 65 20 3d 20 70 4c  r *zColName = pL
13f80 69 73 74 49 74 65 6d 2d 3e 7a 4e 61 6d 65 3b 0a  istItem->zName;.
13f90 20 20 20 20 43 6f 6c 75 6d 6e 20 2a 70 54 61 62      Column *pTab
13fa0 43 6f 6c 3b 0a 20 20 20 20 69 6e 74 20 72 65 71  Col;.    int req
13fb0 75 65 73 74 65 64 53 6f 72 74 4f 72 64 65 72 3b  uestedSortOrder;
13fc0 0a 20 20 20 20 63 68 61 72 20 2a 7a 43 6f 6c 6c  .    char *zColl
13fd0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
13fe0 20 20 20 20 2f 2a 20 43 6f 6c 6c 61 74 69 6f 6e      /* Collation
13ff0 20 73 65 71 75 65 6e 63 65 20 6e 61 6d 65 20 2a   sequence name *
14000 2f 0a 0a 20 20 20 20 66 6f 72 28 6a 3d 30 2c 20  /..    for(j=0, 
14010 70 54 61 62 43 6f 6c 3d 70 54 61 62 2d 3e 61 43  pTabCol=pTab->aC
14020 6f 6c 3b 20 6a 3c 70 54 61 62 2d 3e 6e 43 6f 6c  ol; j<pTab->nCol
14030 3b 20 6a 2b 2b 2c 20 70 54 61 62 43 6f 6c 2b 2b  ; j++, pTabCol++
14040 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  ){.      if( sql
14050 69 74 65 33 53 74 72 49 43 6d 70 28 7a 43 6f 6c  ite3StrICmp(zCol
14060 4e 61 6d 65 2c 20 70 54 61 62 43 6f 6c 2d 3e 7a  Name, pTabCol->z
14070 4e 61 6d 65 29 3d 3d 30 20 29 20 62 72 65 61 6b  Name)==0 ) break
14080 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
14090 6a 3e 3d 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 7b  j>=pTab->nCol ){
140a0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
140b0 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
140c0 74 61 62 6c 65 20 25 73 20 68 61 73 20 6e 6f 20  table %s has no 
140d0 63 6f 6c 75 6d 6e 20 6e 61 6d 65 64 20 25 73 22  column named %s"
140e0 2c 0a 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e  ,.        pTab->
140f0 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 4e 61 6d 65 29  zName, zColName)
14100 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69  ;.      goto exi
14110 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
14120 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 54 4f 44      }.    /* TOD
14130 4f 3a 20 20 41 64 64 20 61 20 74 65 73 74 20 74  O:  Add a test t
14140 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74  o make sure that
14150 20 74 68 65 20 73 61 6d 65 20 63 6f 6c 75 6d 6e   the same column
14160 20 69 73 20 6e 6f 74 20 6e 61 6d 65 64 0a 20 20   is not named.  
14170 20 20 2a 2a 20 6d 6f 72 65 20 74 68 61 6e 20 6f    ** more than o
14180 6e 63 65 20 77 69 74 68 69 6e 20 74 68 65 20 73  nce within the s
14190 61 6d 65 20 69 6e 64 65 78 2e 20 20 4f 6e 6c 79  ame index.  Only
141a0 20 74 68 65 20 66 69 72 73 74 20 69 6e 73 74 61   the first insta
141b0 6e 63 65 20 6f 66 0a 20 20 20 20 2a 2a 20 74 68  nce of.    ** th
141c0 65 20 63 6f 6c 75 6d 6e 20 77 69 6c 6c 20 65 76  e column will ev
141d0 65 72 20 62 65 20 75 73 65 64 20 62 79 20 74 68  er be used by th
141e0 65 20 6f 70 74 69 6d 69 7a 65 72 2e 20 20 4e 6f  e optimizer.  No
141f0 74 65 20 74 68 61 74 20 75 73 69 6e 67 20 74 68  te that using th
14200 65 0a 20 20 20 20 2a 2a 20 73 61 6d 65 20 63 6f  e.    ** same co
14210 6c 75 6d 6e 20 6d 6f 72 65 20 74 68 61 6e 20 6f  lumn more than o
14220 6e 63 65 20 63 61 6e 6e 6f 74 20 62 65 20 61 6e  nce cannot be an
14230 20 65 72 72 6f 72 20 62 65 63 61 75 73 65 20 74   error because t
14240 68 61 74 20 77 6f 75 6c 64 20 0a 20 20 20 20 2a  hat would .    *
14250 2a 20 62 72 65 61 6b 20 62 61 63 6b 77 61 72 64  * break backward
14260 73 20 63 6f 6d 70 61 74 69 62 69 6c 69 74 79 20  s compatibility 
14270 2d 20 69 74 20 6e 65 65 64 73 20 74 6f 20 62 65  - it needs to be
14280 20 61 20 77 61 72 6e 69 6e 67 2e 0a 20 20 20 20   a warning..    
14290 2a 2f 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e 61  */.    pIndex->a
142a0 69 43 6f 6c 75 6d 6e 5b 69 5d 20 3d 20 6a 3b 0a  iColumn[i] = j;.
142b0 20 20 20 20 69 66 28 20 70 4c 69 73 74 49 74 65      if( pListIte
142c0 6d 2d 3e 70 45 78 70 72 20 29 7b 0a 20 20 20 20  m->pExpr ){.    
142d0 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 49    assert( pListI
142e0 74 65 6d 2d 3e 70 45 78 70 72 2d 3e 70 43 6f 6c  tem->pExpr->pCol
142f0 6c 20 29 3b 0a 20 20 20 20 20 20 7a 43 6f 6c 6c  l );.      zColl
14300 20 3d 20 7a 45 78 74 72 61 3b 0a 20 20 20 20 20   = zExtra;.     
14310 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
14320 66 28 6e 45 78 74 72 61 2c 20 7a 45 78 74 72 61  f(nExtra, zExtra
14330 2c 20 22 25 73 22 2c 20 70 4c 69 73 74 49 74 65  , "%s", pListIte
14340 6d 2d 3e 70 45 78 70 72 2d 3e 70 43 6f 6c 6c 2d  m->pExpr->pColl-
14350 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7a  >zName);.      z
14360 45 78 74 72 61 20 2b 3d 20 28 73 74 72 6c 65 6e  Extra += (strlen
14370 28 7a 43 6f 6c 6c 29 20 2b 20 31 29 3b 0a 20 20  (zColl) + 1);.  
14380 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a    }else{.      z
14390 43 6f 6c 6c 20 3d 20 70 54 61 62 2d 3e 61 43 6f  Coll = pTab->aCo
143a0 6c 5b 6a 5d 2e 7a 43 6f 6c 6c 3b 0a 20 20 20 20  l[j].zColl;.    
143b0 20 20 69 66 28 20 21 7a 43 6f 6c 6c 20 29 7b 0a    if( !zColl ){.
143c0 20 20 20 20 20 20 20 20 7a 43 6f 6c 6c 20 3d 20          zColl = 
143d0 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 2d 3e 7a  db->pDfltColl->z
143e0 4e 61 6d 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Name;.      }.  
143f0 20 20 7d 0a 20 20 20 20 69 66 28 20 21 64 62 2d    }.    if( !db-
14400 3e 69 6e 69 74 2e 62 75 73 79 20 26 26 20 21 73  >init.busy && !s
14410 71 6c 69 74 65 33 4c 6f 63 61 74 65 43 6f 6c 6c  qlite3LocateColl
14420 53 65 71 28 70 50 61 72 73 65 2c 20 7a 43 6f 6c  Seq(pParse, zCol
14430 6c 2c 20 2d 31 29 20 29 7b 0a 20 20 20 20 20 20  l, -1) ){.      
14440 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
14450 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20  _index;.    }.  
14460 20 20 70 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c    pIndex->azColl
14470 5b 69 5d 20 3d 20 7a 43 6f 6c 6c 3b 0a 20 20 20  [i] = zColl;.   
14480 20 72 65 71 75 65 73 74 65 64 53 6f 72 74 4f 72   requestedSortOr
14490 64 65 72 20 3d 20 70 4c 69 73 74 49 74 65 6d 2d  der = pListItem-
144a0 3e 73 6f 72 74 4f 72 64 65 72 20 26 20 73 6f 72  >sortOrder & sor
144b0 74 4f 72 64 65 72 4d 61 73 6b 3b 0a 20 20 20 20  tOrderMask;.    
144c0 70 49 6e 64 65 78 2d 3e 61 53 6f 72 74 4f 72 64  pIndex->aSortOrd
144d0 65 72 5b 69 5d 20 3d 20 72 65 71 75 65 73 74 65  er[i] = requeste
144e0 64 53 6f 72 74 4f 72 64 65 72 3b 0a 20 20 7d 0a  dSortOrder;.  }.
144f0 20 20 73 71 6c 69 74 65 33 44 65 66 61 75 6c 74    sqlite3Default
14500 52 6f 77 45 73 74 28 70 49 6e 64 65 78 29 3b 0a  RowEst(pIndex);.
14510 0a 20 20 69 66 28 20 70 54 61 62 3d 3d 70 50 61  .  if( pTab==pPa
14520 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 29  rse->pNewTable )
14530 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 72 6f  {.    /* This ro
14540 75 74 69 6e 65 20 68 61 73 20 62 65 65 6e 20 63  utine has been c
14550 61 6c 6c 65 64 20 74 6f 20 63 72 65 61 74 65 20  alled to create 
14560 61 6e 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64  an automatic ind
14570 65 78 20 61 73 20 61 0a 20 20 20 20 2a 2a 20 72  ex as a.    ** r
14580 65 73 75 6c 74 20 6f 66 20 61 20 50 52 49 4d 41  esult of a PRIMA
14590 52 59 20 4b 45 59 20 6f 72 20 55 4e 49 51 55 45  RY KEY or UNIQUE
145a0 20 63 6c 61 75 73 65 20 6f 6e 20 61 20 63 6f 6c   clause on a col
145b0 75 6d 6e 20 64 65 66 69 6e 69 74 69 6f 6e 2c 20  umn definition, 
145c0 6f 72 0a 20 20 20 20 2a 2a 20 61 20 50 52 49 4d  or.    ** a PRIM
145d0 41 52 59 20 4b 45 59 20 6f 72 20 55 4e 49 51 55  ARY KEY or UNIQU
145e0 45 20 63 6c 61 75 73 65 20 66 6f 6c 6c 6f 77 69  E clause followi
145f0 6e 67 20 74 68 65 20 63 6f 6c 75 6d 6e 20 64 65  ng the column de
14600 66 69 6e 69 74 69 6f 6e 73 2e 0a 20 20 20 20 2a  finitions..    *
14610 2a 20 69 2e 65 2e 20 6f 6e 65 20 6f 66 3a 0a 20  * i.e. one of:. 
14620 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 43 52 45     **.    ** CRE
14630 41 54 45 20 54 41 42 4c 45 20 74 28 78 20 50 52  ATE TABLE t(x PR
14640 49 4d 41 52 59 20 4b 45 59 2c 20 79 29 3b 0a 20  IMARY KEY, y);. 
14650 20 20 20 2a 2a 20 43 52 45 41 54 45 20 54 41 42     ** CREATE TAB
14660 4c 45 20 74 28 78 2c 20 79 2c 20 55 4e 49 51 55  LE t(x, y, UNIQU
14670 45 28 78 2c 20 79 29 29 3b 0a 20 20 20 20 2a 2a  E(x, y));.    **
14680 0a 20 20 20 20 2a 2a 20 45 69 74 68 65 72 20 77  .    ** Either w
14690 61 79 2c 20 63 68 65 63 6b 20 74 6f 20 73 65 65  ay, check to see
146a0 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 61 6c   if the table al
146b0 72 65 61 64 79 20 68 61 73 20 73 75 63 68 20 61  ready has such a
146c0 6e 20 69 6e 64 65 78 2e 20 49 66 0a 20 20 20 20  n index. If.    
146d0 2a 2a 20 73 6f 2c 20 64 6f 6e 27 74 20 62 6f 74  ** so, don't bot
146e0 68 65 72 20 63 72 65 61 74 69 6e 67 20 74 68 69  her creating thi
146f0 73 20 6f 6e 65 2e 20 54 68 69 73 20 6f 6e 6c 79  s one. This only
14700 20 61 70 70 6c 69 65 73 20 74 6f 0a 20 20 20 20   applies to.    
14710 2a 2a 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  ** automatically
14720 20 63 72 65 61 74 65 64 20 69 6e 64 69 63 65 73   created indices
14730 2e 20 55 73 65 72 73 20 63 61 6e 20 64 6f 20 61  . Users can do a
14740 73 20 74 68 65 79 20 77 69 73 68 20 77 69 74 68  s they wish with
14750 0a 20 20 20 20 2a 2a 20 65 78 70 6c 69 63 69 74  .    ** explicit
14760 20 69 6e 64 69 63 65 73 2e 0a 20 20 20 20 2a 2f   indices..    */
14770 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78  .    Index *pIdx
14780 3b 0a 20 20 20 20 66 6f 72 28 70 49 64 78 3d 70  ;.    for(pIdx=p
14790 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64  Tab->pIndex; pId
147a0 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e  x; pIdx=pIdx->pN
147b0 65 78 74 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  ext){.      int 
147c0 6b 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  k;.      assert(
147d0 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d   pIdx->onError!=
147e0 4f 45 5f 4e 6f 6e 65 20 29 3b 0a 20 20 20 20 20  OE_None );.     
147f0 20 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e 61   assert( pIdx->a
14800 75 74 6f 49 6e 64 65 78 20 29 3b 0a 20 20 20 20  utoIndex );.    
14810 20 20 61 73 73 65 72 74 28 20 70 49 6e 64 65 78    assert( pIndex
14820 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f  ->onError!=OE_No
14830 6e 65 20 29 3b 0a 0a 20 20 20 20 20 20 69 66 28  ne );..      if(
14840 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 21 3d   pIdx->nColumn!=
14850 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 20  pIndex->nColumn 
14860 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
14870 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70 49 64    for(k=0; k<pId
14880 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 6b 2b 2b 29  x->nColumn; k++)
14890 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20  {.        const 
148a0 63 68 61 72 20 2a 7a 31 20 3d 20 70 49 64 78 2d  char *z1 = pIdx-
148b0 3e 61 7a 43 6f 6c 6c 5b 6b 5d 3b 0a 20 20 20 20  >azColl[k];.    
148c0 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
148d0 7a 32 20 3d 20 70 49 6e 64 65 78 2d 3e 61 7a 43  z2 = pIndex->azC
148e0 6f 6c 6c 5b 6b 5d 3b 0a 20 20 20 20 20 20 20 20  oll[k];.        
148f0 69 66 28 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75  if( pIdx->aiColu
14900 6d 6e 5b 6b 5d 21 3d 70 49 6e 64 65 78 2d 3e 61  mn[k]!=pIndex->a
14910 69 43 6f 6c 75 6d 6e 5b 6b 5d 20 29 20 62 72 65  iColumn[k] ) bre
14920 61 6b 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ak;.        if( 
14930 70 49 64 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72  pIdx->aSortOrder
14940 5b 6b 5d 21 3d 70 49 6e 64 65 78 2d 3e 61 53 6f  [k]!=pIndex->aSo
14950 72 74 4f 72 64 65 72 5b 6b 5d 20 29 20 62 72 65  rtOrder[k] ) bre
14960 61 6b 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ak;.        if( 
14970 7a 31 21 3d 7a 32 20 26 26 20 73 71 6c 69 74 65  z1!=z2 && sqlite
14980 33 53 74 72 49 43 6d 70 28 7a 31 2c 20 7a 32 29  3StrICmp(z1, z2)
14990 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
149a0 7d 0a 20 20 20 20 20 20 69 66 28 20 6b 3d 3d 70  }.      if( k==p
149b0 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 7b 0a  Idx->nColumn ){.
149c0 20 20 20 20 20 20 20 20 69 66 28 20 70 49 64 78          if( pIdx
149d0 2d 3e 6f 6e 45 72 72 6f 72 21 3d 70 49 6e 64 65  ->onError!=pInde
149e0 78 2d 3e 6f 6e 45 72 72 6f 72 20 29 7b 0a 20 20  x->onError ){.  
149f0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20          /* This 
14a00 63 6f 6e 73 74 72 61 69 6e 74 20 63 72 65 61 74  constraint creat
14a10 65 73 20 74 68 65 20 73 61 6d 65 20 69 6e 64 65  es the same inde
14a20 78 20 61 73 20 61 20 70 72 65 76 69 6f 75 73 0a  x as a previous.
14a30 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e            ** con
14a40 73 74 72 61 69 6e 74 20 73 70 65 63 69 66 69 65  straint specifie
14a50 64 20 73 6f 6d 65 77 68 65 72 65 20 69 6e 20 74  d somewhere in t
14a60 68 65 20 43 52 45 41 54 45 20 54 41 42 4c 45 20  he CREATE TABLE 
14a70 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20 20 20 20  statement..     
14a80 20 20 20 20 20 2a 2a 20 48 6f 77 65 76 65 72 20       ** However 
14a90 74 68 65 20 4f 4e 20 43 4f 4e 46 4c 49 43 54 20  the ON CONFLICT 
14aa0 63 6c 61 75 73 65 73 20 61 72 65 20 64 69 66 66  clauses are diff
14ab0 65 72 65 6e 74 2e 20 49 66 20 62 6f 74 68 20 74  erent. If both t
14ac0 68 69 73 20 0a 20 20 20 20 20 20 20 20 20 20 2a  his .          *
14ad0 2a 20 63 6f 6e 73 74 72 61 69 6e 74 20 61 6e 64  * constraint and
14ae0 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 65 71   the previous eq
14af0 75 69 76 61 6c 65 6e 74 20 63 6f 6e 73 74 72 61  uivalent constra
14b00 69 6e 74 20 68 61 76 65 20 65 78 70 6c 69 63 69  int have explici
14b10 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 4f  t.          ** O
14b20 4e 20 43 4f 4e 46 4c 49 43 54 20 63 6c 61 75 73  N CONFLICT claus
14b30 65 73 20 74 68 69 73 20 69 73 20 61 6e 20 65 72  es this is an er
14b40 72 6f 72 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ror. Otherwise, 
14b50 75 73 65 20 74 68 65 0a 20 20 20 20 20 20 20 20  use the.        
14b60 20 20 2a 2a 20 65 78 70 6c 69 63 69 74 6c 79 20    ** explicitly 
14b70 73 70 65 63 69 66 69 65 64 20 62 65 68 61 76 69  specified behavi
14b80 6f 75 72 20 66 6f 72 20 74 68 65 20 69 6e 64 65  our for the inde
14b90 78 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a  x..          */.
14ba0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21 28            if( !(
14bb0 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f  pIdx->onError==O
14bc0 45 5f 44 65 66 61 75 6c 74 20 7c 7c 20 70 49 6e  E_Default || pIn
14bd0 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45  dex->onError==OE
14be0 5f 44 65 66 61 75 6c 74 29 20 29 7b 0a 20 20 20  _Default) ){.   
14bf0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
14c00 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
14c10 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
14c20 20 20 22 63 6f 6e 66 6c 69 63 74 69 6e 67 20 4f    "conflicting O
14c30 4e 20 43 4f 4e 46 4c 49 43 54 20 63 6c 61 75 73  N CONFLICT claus
14c40 65 73 20 73 70 65 63 69 66 69 65 64 22 2c 20 30  es specified", 0
14c50 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
14c60 20 20 20 20 20 20 20 20 20 69 66 28 20 70 49 64           if( pId
14c70 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 44  x->onError==OE_D
14c80 65 66 61 75 6c 74 20 29 7b 0a 20 20 20 20 20 20  efault ){.      
14c90 20 20 20 20 20 20 70 49 64 78 2d 3e 6f 6e 45 72        pIdx->onEr
14ca0 72 6f 72 20 3d 20 70 49 6e 64 65 78 2d 3e 6f 6e  ror = pIndex->on
14cb0 45 72 72 6f 72 3b 0a 20 20 20 20 20 20 20 20 20  Error;.         
14cc0 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
14cd0 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63       goto exit_c
14ce0 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20  reate_index;.   
14cf0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
14d00 20 20 2f 2a 20 4c 69 6e 6b 20 74 68 65 20 6e 65    /* Link the ne
14d10 77 20 49 6e 64 65 78 20 73 74 72 75 63 74 75 72  w Index structur
14d20 65 20 74 6f 20 69 74 73 20 74 61 62 6c 65 20 61  e to its table a
14d30 6e 64 20 74 6f 20 74 68 65 20 6f 74 68 65 72 0a  nd to the other.
14d40 20 20 2a 2a 20 69 6e 2d 6d 65 6d 6f 72 79 20 64    ** in-memory d
14d50 61 74 61 62 61 73 65 20 73 74 72 75 63 74 75 72  atabase structur
14d60 65 73 2e 20 0a 20 20 2a 2f 0a 20 20 69 66 28 20  es. .  */.  if( 
14d70 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b  db->init.busy ){
14d80 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 3b 0a 20  .    Index *p;. 
14d90 20 20 20 70 20 3d 20 73 71 6c 69 74 65 33 48 61     p = sqlite3Ha
14da0 73 68 49 6e 73 65 72 74 28 26 70 49 6e 64 65 78  shInsert(&pIndex
14db0 2d 3e 70 53 63 68 65 6d 61 2d 3e 69 64 78 48 61  ->pSchema->idxHa
14dc0 73 68 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  sh, .           
14dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 49                pI
14de0 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 73 74 72  ndex->zName, str
14df0 6c 65 6e 28 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d  len(pIndex->zNam
14e00 65 29 2b 31 2c 20 70 49 6e 64 65 78 29 3b 0a 20  e)+1, pIndex);. 
14e10 20 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20     if( p ){.    
14e20 20 20 61 73 73 65 72 74 28 20 70 3d 3d 70 49 6e    assert( p==pIn
14e30 64 65 78 20 29 3b 20 20 2f 2a 20 4d 61 6c 6c 6f  dex );  /* Mallo
14e40 63 20 6d 75 73 74 20 68 61 76 65 20 66 61 69 6c  c must have fail
14e50 65 64 20 2a 2f 0a 20 20 20 20 20 20 64 62 2d 3e  ed */.      db->
14e60 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31  mallocFailed = 1
14e70 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69  ;.      goto exi
14e80 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
14e90 20 20 20 20 7d 0a 20 20 20 20 64 62 2d 3e 66 6c      }.    db->fl
14ea0 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 49 6e  ags |= SQLITE_In
14eb0 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a 20 20 20  ternChanges;.   
14ec0 20 69 66 28 20 70 54 62 6c 4e 61 6d 65 21 3d 30   if( pTblName!=0
14ed0 20 29 7b 0a 20 20 20 20 20 20 70 49 6e 64 65 78   ){.      pIndex
14ee0 2d 3e 74 6e 75 6d 20 3d 20 64 62 2d 3e 69 6e 69  ->tnum = db->ini
14ef0 74 2e 6e 65 77 54 6e 75 6d 3b 0a 20 20 20 20 7d  t.newTnum;.    }
14f00 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
14f10 65 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20  e db->init.busy 
14f20 69 73 20 30 20 74 68 65 6e 20 63 72 65 61 74 65  is 0 then create
14f30 20 74 68 65 20 69 6e 64 65 78 20 6f 6e 20 64 69   the index on di
14f40 73 6b 2e 20 20 54 68 69 73 0a 20 20 2a 2a 20 69  sk.  This.  ** i
14f50 6e 76 6f 6c 76 65 73 20 77 72 69 74 69 6e 67 20  nvolves writing 
14f60 74 68 65 20 69 6e 64 65 78 20 69 6e 74 6f 20 74  the index into t
14f70 68 65 20 6d 61 73 74 65 72 20 74 61 62 6c 65 20  he master table 
14f80 61 6e 64 20 66 69 6c 6c 69 6e 67 20 69 6e 20 74  and filling in t
14f90 68 65 0a 20 20 2a 2a 20 69 6e 64 65 78 20 77 69  he.  ** index wi
14fa0 74 68 20 74 68 65 20 63 75 72 72 65 6e 74 20 74  th the current t
14fb0 61 62 6c 65 20 63 6f 6e 74 65 6e 74 73 2e 0a 20  able contents.. 
14fc0 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 64 62 2d   **.  ** The db-
14fd0 3e 69 6e 69 74 2e 62 75 73 79 20 69 73 20 30 20  >init.busy is 0 
14fe0 77 68 65 6e 20 74 68 65 20 75 73 65 72 20 66 69  when the user fi
14ff0 72 73 74 20 65 6e 74 65 72 73 20 61 20 43 52 45  rst enters a CRE
15000 41 54 45 20 49 4e 44 45 58 20 0a 20 20 2a 2a 20  ATE INDEX .  ** 
15010 63 6f 6d 6d 61 6e 64 2e 20 20 64 62 2d 3e 69 6e  command.  db->in
15020 69 74 2e 62 75 73 79 20 69 73 20 31 20 77 68 65  it.busy is 1 whe
15030 6e 20 61 20 64 61 74 61 62 61 73 65 20 69 73 20  n a database is 
15040 6f 70 65 6e 65 64 20 61 6e 64 20 0a 20 20 2a 2a  opened and .  **
15050 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 73 74   CREATE INDEX st
15060 61 74 65 6d 65 6e 74 73 20 61 72 65 20 72 65 61  atements are rea
15070 64 20 6f 75 74 20 6f 66 20 74 68 65 20 6d 61 73  d out of the mas
15080 74 65 72 20 74 61 62 6c 65 2e 20 20 49 6e 0a 20  ter table.  In. 
15090 20 2a 2a 20 74 68 65 20 6c 61 74 74 65 72 20 63   ** the latter c
150a0 61 73 65 20 74 68 65 20 69 6e 64 65 78 20 61 6c  ase the index al
150b0 72 65 61 64 79 20 65 78 69 73 74 73 20 6f 6e 20  ready exists on 
150c0 64 69 73 6b 2c 20 77 68 69 63 68 20 69 73 20 77  disk, which is w
150d0 68 79 0a 20 20 2a 2a 20 77 65 20 64 6f 6e 27 74  hy.  ** we don't
150e0 20 77 61 6e 74 20 74 6f 20 72 65 63 72 65 61 74   want to recreat
150f0 65 20 69 74 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  e it..  **.  ** 
15100 49 66 20 70 54 62 6c 4e 61 6d 65 3d 3d 30 20 69  If pTblName==0 i
15110 74 20 6d 65 61 6e 73 20 74 68 69 73 20 69 6e 64  t means this ind
15120 65 78 20 69 73 20 67 65 6e 65 72 61 74 65 64 20  ex is generated 
15130 61 73 20 61 20 70 72 69 6d 61 72 79 20 6b 65 79  as a primary key
15140 0a 20 20 2a 2a 20 6f 72 20 55 4e 49 51 55 45 20  .  ** or UNIQUE 
15150 63 6f 6e 73 74 72 61 69 6e 74 20 6f 66 20 61 20  constraint of a 
15160 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61  CREATE TABLE sta
15170 74 65 6d 65 6e 74 2e 20 20 53 69 6e 63 65 20 74  tement.  Since t
15180 68 65 20 74 61 62 6c 65 0a 20 20 2a 2a 20 68 61  he table.  ** ha
15190 73 20 6a 75 73 74 20 62 65 65 6e 20 63 72 65 61  s just been crea
151a0 74 65 64 2c 20 69 74 20 63 6f 6e 74 61 69 6e 73  ted, it contains
151b0 20 6e 6f 20 64 61 74 61 20 61 6e 64 20 74 68 65   no data and the
151c0 20 69 6e 64 65 78 20 69 6e 69 74 69 61 6c 69 7a   index initializ
151d0 61 74 69 6f 6e 0a 20 20 2a 2a 20 73 74 65 70 20  ation.  ** step 
151e0 63 61 6e 20 62 65 20 73 6b 69 70 70 65 64 2e 0a  can be skipped..
151f0 20 20 2a 2f 0a 20 20 65 6c 73 65 20 69 66 28 20    */.  else if( 
15200 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d 30  db->init.busy==0
15210 20 29 7b 0a 20 20 20 20 56 64 62 65 20 2a 76 3b   ){.    Vdbe *v;
15220 0a 20 20 20 20 63 68 61 72 20 2a 7a 53 74 6d 74  .    char *zStmt
15230 3b 0a 20 20 20 20 69 6e 74 20 69 4d 65 6d 20 3d  ;.    int iMem =
15240 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
15250 0a 0a 20 20 20 20 76 20 3d 20 73 71 6c 69 74 65  ..    v = sqlite
15260 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
15270 3b 0a 20 20 20 20 69 66 28 20 76 3d 3d 30 20 29  ;.    if( v==0 )
15280 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
15290 65 5f 69 6e 64 65 78 3b 0a 0a 0a 20 20 20 20 2f  e_index;...    /
152a0 2a 20 43 72 65 61 74 65 20 74 68 65 20 72 6f 6f  * Create the roo
152b0 74 70 61 67 65 20 66 6f 72 20 74 68 65 20 69 6e  tpage for the in
152c0 64 65 78 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73  dex.    */.    s
152d0 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74 65  qlite3BeginWrite
152e0 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65  Operation(pParse
152f0 2c 20 31 2c 20 69 44 62 29 3b 0a 20 20 20 20 73  , 1, iDb);.    s
15300 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
15310 28 76 2c 20 4f 50 5f 43 72 65 61 74 65 49 6e 64  (v, OP_CreateInd
15320 65 78 2c 20 69 44 62 2c 20 69 4d 65 6d 29 3b 0a  ex, iDb, iMem);.
15330 0a 20 20 20 20 2f 2a 20 47 61 74 68 65 72 20 74  .    /* Gather t
15340 68 65 20 63 6f 6d 70 6c 65 74 65 20 74 65 78 74  he complete text
15350 20 6f 66 20 74 68 65 20 43 52 45 41 54 45 20 49   of the CREATE I
15360 4e 44 45 58 20 73 74 61 74 65 6d 65 6e 74 20 69  NDEX statement i
15370 6e 74 6f 0a 20 20 20 20 2a 2a 20 74 68 65 20 7a  nto.    ** the z
15380 53 74 6d 74 20 76 61 72 69 61 62 6c 65 0a 20 20  Stmt variable.  
15390 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 53 74    */.    if( pSt
153a0 61 72 74 20 26 26 20 70 45 6e 64 20 29 7b 0a 20  art && pEnd ){. 
153b0 20 20 20 20 20 2f 2a 20 41 20 6e 61 6d 65 64 20       /* A named 
153c0 69 6e 64 65 78 20 77 69 74 68 20 61 6e 20 65 78  index with an ex
153d0 70 6c 69 63 69 74 20 43 52 45 41 54 45 20 49 4e  plicit CREATE IN
153e0 44 45 58 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  DEX statement */
153f0 0a 20 20 20 20 20 20 7a 53 74 6d 74 20 3d 20 73  .      zStmt = s
15400 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62  qlite3MPrintf(db
15410 2c 20 22 43 52 45 41 54 45 25 73 20 49 4e 44 45  , "CREATE%s INDE
15420 58 20 25 2e 2a 73 22 2c 0a 20 20 20 20 20 20 20  X %.*s",.       
15430 20 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 4e 6f 6e   onError==OE_Non
15440 65 20 3f 20 22 22 20 3a 20 22 20 55 4e 49 51 55  e ? "" : " UNIQU
15450 45 22 2c 0a 20 20 20 20 20 20 20 20 70 45 6e 64  E",.        pEnd
15460 2d 3e 7a 20 2d 20 70 4e 61 6d 65 2d 3e 7a 20 2b  ->z - pName->z +
15470 20 31 2c 0a 20 20 20 20 20 20 20 20 70 4e 61 6d   1,.        pNam
15480 65 2d 3e 7a 29 3b 0a 20 20 20 20 7d 65 6c 73 65  e->z);.    }else
15490 7b 0a 20 20 20 20 20 20 2f 2a 20 41 6e 20 61 75  {.      /* An au
154a0 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 63 72  tomatic index cr
154b0 65 61 74 65 64 20 62 79 20 61 20 50 52 49 4d 41  eated by a PRIMA
154c0 52 59 20 4b 45 59 20 6f 72 20 55 4e 49 51 55 45  RY KEY or UNIQUE
154d0 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 20   constraint */. 
154e0 20 20 20 20 20 2f 2a 20 7a 53 74 6d 74 20 3d 20       /* zStmt = 
154f0 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 22  sqlite3MPrintf("
15500 22 29 3b 20 2a 2f 0a 20 20 20 20 20 20 7a 53 74  "); */.      zSt
15510 6d 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20  mt = 0;.    }.. 
15520 20 20 20 2f 2a 20 41 64 64 20 61 6e 20 65 6e 74     /* Add an ent
15530 72 79 20 69 6e 20 73 71 6c 69 74 65 5f 6d 61 73  ry in sqlite_mas
15540 74 65 72 20 66 6f 72 20 74 68 69 73 20 69 6e 64  ter for this ind
15550 65 78 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71  ex.    */.    sq
15560 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72 73 65  lite3NestedParse
15570 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20  (pParse, .      
15580 20 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 25    "INSERT INTO %
15590 51 2e 25 73 20 56 41 4c 55 45 53 28 27 69 6e 64  Q.%s VALUES('ind
155a0 65 78 27 2c 25 51 2c 25 51 2c 23 25 64 2c 25 51  ex',%Q,%Q,#%d,%Q
155b0 29 3b 22 2c 0a 20 20 20 20 20 20 20 20 64 62 2d  );",.        db-
155c0 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 2c  >aDb[iDb].zName,
155d0 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 44   SCHEMA_TABLE(iD
155e0 62 29 2c 0a 20 20 20 20 20 20 20 20 70 49 6e 64  b),.        pInd
155f0 65 78 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20  ex->zName,.     
15600 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 0a     pTab->zName,.
15610 20 20 20 20 20 20 20 20 69 4d 65 6d 2c 0a 20 20          iMem,.  
15620 20 20 20 20 20 20 7a 53 74 6d 74 0a 20 20 20 20        zStmt.    
15630 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
15640 72 65 65 28 7a 53 74 6d 74 29 3b 0a 0a 20 20 20  ree(zStmt);..   
15650 20 2f 2a 20 46 69 6c 6c 20 74 68 65 20 69 6e 64   /* Fill the ind
15660 65 78 20 77 69 74 68 20 64 61 74 61 20 61 6e 64  ex with data and
15670 20 72 65 70 61 72 73 65 20 74 68 65 20 73 63 68   reparse the sch
15680 65 6d 61 2e 20 43 6f 64 65 20 61 6e 20 4f 50 5f  ema. Code an OP_
15690 45 78 70 69 72 65 0a 20 20 20 20 2a 2a 20 74 6f  Expire.    ** to
156a0 20 69 6e 76 61 6c 69 64 61 74 65 20 61 6c 6c 20   invalidate all 
156b0 70 72 65 2d 63 6f 6d 70 69 6c 65 64 20 73 74 61  pre-compiled sta
156c0 74 65 6d 65 6e 74 73 2e 0a 20 20 20 20 2a 2f 0a  tements..    */.
156d0 20 20 20 20 69 66 28 20 70 54 62 6c 4e 61 6d 65      if( pTblName
156e0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
156f0 33 52 65 66 69 6c 6c 49 6e 64 65 78 28 70 50 61  3RefillIndex(pPa
15700 72 73 65 2c 20 70 49 6e 64 65 78 2c 20 69 4d 65  rse, pIndex, iMe
15710 6d 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  m);.      sqlite
15720 33 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28 70 50  3ChangeCookie(pP
15730 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 20 20  arse, iDb);.    
15740 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
15750 4f 70 34 28 76 2c 20 4f 50 5f 50 61 72 73 65 53  Op4(v, OP_ParseS
15760 63 68 65 6d 61 2c 20 69 44 62 2c 20 30 2c 20 30  chema, iDb, 0, 0
15770 2c 0a 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  ,.         sqlit
15780 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 6e  e3MPrintf(db, "n
15790 61 6d 65 3d 27 25 71 27 22 2c 20 70 49 6e 64 65  ame='%q'", pInde
157a0 78 2d 3e 7a 4e 61 6d 65 29 2c 20 50 34 5f 44 59  x->zName), P4_DY
157b0 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20 20 73 71  NAMIC);.      sq
157c0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
157d0 76 2c 20 4f 50 5f 45 78 70 69 72 65 2c 20 30 29  v, OP_Expire, 0)
157e0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
157f0 2a 20 57 68 65 6e 20 61 64 64 69 6e 67 20 61 6e  * When adding an
15800 20 69 6e 64 65 78 20 74 6f 20 74 68 65 20 6c 69   index to the li
15810 73 74 20 6f 66 20 69 6e 64 69 63 65 73 20 66 6f  st of indices fo
15820 72 20 61 20 74 61 62 6c 65 2c 20 6d 61 6b 65 0a  r a table, make.
15830 20 20 2a 2a 20 73 75 72 65 20 61 6c 6c 20 69 6e    ** sure all in
15840 64 69 63 65 73 20 6c 61 62 65 6c 65 64 20 4f 45  dices labeled OE
15850 5f 52 65 70 6c 61 63 65 20 63 6f 6d 65 20 61 66  _Replace come af
15860 74 65 72 20 61 6c 6c 20 74 68 6f 73 65 20 6c 61  ter all those la
15870 62 65 6c 65 64 0a 20 20 2a 2a 20 4f 45 5f 49 67  beled.  ** OE_Ig
15880 6e 6f 72 65 2e 20 20 54 68 69 73 20 69 73 20 6e  nore.  This is n
15890 65 63 65 73 73 61 72 79 20 66 6f 72 20 74 68 65  ecessary for the
158a0 20 63 6f 72 72 65 63 74 20 6f 70 65 72 61 74 69   correct operati
158b0 6f 6e 20 6f 66 20 55 50 44 41 54 45 0a 20 20 2a  on of UPDATE.  *
158c0 2a 20 61 6e 64 20 49 4e 53 45 52 54 2e 0a 20 20  * and INSERT..  
158d0 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 69 6e 69  */.  if( db->ini
158e0 74 2e 62 75 73 79 20 7c 7c 20 70 54 62 6c 4e 61  t.busy || pTblNa
158f0 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28  me==0 ){.    if(
15900 20 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 52 65 70   onError!=OE_Rep
15910 6c 61 63 65 20 7c 7c 20 70 54 61 62 2d 3e 70 49  lace || pTab->pI
15920 6e 64 65 78 3d 3d 30 0a 20 20 20 20 20 20 20 20  ndex==0.        
15930 20 7c 7c 20 70 54 61 62 2d 3e 70 49 6e 64 65 78   || pTab->pIndex
15940 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 52 65  ->onError==OE_Re
15950 70 6c 61 63 65 29 7b 0a 20 20 20 20 20 20 70 49  place){.      pI
15960 6e 64 65 78 2d 3e 70 4e 65 78 74 20 3d 20 70 54  ndex->pNext = pT
15970 61 62 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20 20  ab->pIndex;.    
15980 20 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 20 3d    pTab->pIndex =
15990 20 70 49 6e 64 65 78 3b 0a 20 20 20 20 7d 65 6c   pIndex;.    }el
159a0 73 65 7b 0a 20 20 20 20 20 20 49 6e 64 65 78 20  se{.      Index 
159b0 2a 70 4f 74 68 65 72 20 3d 20 70 54 61 62 2d 3e  *pOther = pTab->
159c0 70 49 6e 64 65 78 3b 0a 20 20 20 20 20 20 77 68  pIndex;.      wh
159d0 69 6c 65 28 20 70 4f 74 68 65 72 2d 3e 70 4e 65  ile( pOther->pNe
159e0 78 74 20 26 26 20 70 4f 74 68 65 72 2d 3e 70 4e  xt && pOther->pN
159f0 65 78 74 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45  ext->onError!=OE
15a00 5f 52 65 70 6c 61 63 65 20 29 7b 0a 20 20 20 20  _Replace ){.    
15a10 20 20 20 20 70 4f 74 68 65 72 20 3d 20 70 4f 74      pOther = pOt
15a20 68 65 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  her->pNext;.    
15a30 20 20 7d 0a 20 20 20 20 20 20 70 49 6e 64 65 78    }.      pIndex
15a40 2d 3e 70 4e 65 78 74 20 3d 20 70 4f 74 68 65 72  ->pNext = pOther
15a50 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 70  ->pNext;.      p
15a60 4f 74 68 65 72 2d 3e 70 4e 65 78 74 20 3d 20 70  Other->pNext = p
15a70 49 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20  Index;.    }.   
15a80 20 70 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20 7d   pIndex = 0;.  }
15a90 0a 0a 20 20 2f 2a 20 43 6c 65 61 6e 20 75 70 20  ..  /* Clean up 
15aa0 62 65 66 6f 72 65 20 65 78 69 74 69 6e 67 20 2a  before exiting *
15ab0 2f 0a 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  /.exit_create_in
15ac0 64 65 78 3a 0a 20 20 69 66 28 20 70 49 6e 64 65  dex:.  if( pInde
15ad0 78 20 29 7b 0a 20 20 20 20 66 72 65 65 49 6e 64  x ){.    freeInd
15ae0 65 78 28 70 49 6e 64 65 78 29 3b 0a 20 20 7d 0a  ex(pIndex);.  }.
15af0 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
15b00 74 44 65 6c 65 74 65 28 70 4c 69 73 74 29 3b 0a  tDelete(pList);.
15b10 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74    sqlite3SrcList
15b20 44 65 6c 65 74 65 28 70 54 62 6c 4e 61 6d 65 29  Delete(pTblName)
15b30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ;.  sqlite3_free
15b40 28 7a 4e 61 6d 65 29 3b 0a 20 20 72 65 74 75 72  (zName);.  retur
15b50 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  n;.}../*.** Gene
15b60 72 61 74 65 20 63 6f 64 65 20 74 6f 20 6d 61 6b  rate code to mak
15b70 65 20 73 75 72 65 20 74 68 65 20 66 69 6c 65 20  e sure the file 
15b80 66 6f 72 6d 61 74 20 6e 75 6d 62 65 72 20 69 73  format number is
15b90 20 61 74 20 6c 65 61 73 74 20 6d 69 6e 46 6f 72   at least minFor
15ba0 6d 61 74 2e 0a 2a 2a 20 54 68 65 20 67 65 6e 65  mat..** The gene
15bb0 72 61 74 65 64 20 63 6f 64 65 20 77 69 6c 6c 20  rated code will 
15bc0 69 6e 63 72 65 61 73 65 20 74 68 65 20 66 69 6c  increase the fil
15bd0 65 20 66 6f 72 6d 61 74 20 6e 75 6d 62 65 72 20  e format number 
15be0 69 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2f  if necessary..*/
15bf0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 4d 69 6e  .void sqlite3Min
15c00 69 6d 75 6d 46 69 6c 65 46 6f 72 6d 61 74 28 50  imumFileFormat(P
15c10 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e  arse *pParse, in
15c20 74 20 69 44 62 2c 20 69 6e 74 20 6d 69 6e 46 6f  t iDb, int minFo
15c30 72 6d 61 74 29 7b 0a 20 20 56 64 62 65 20 2a 76  rmat){.  Vdbe *v
15c40 3b 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47  ;.  v = sqlite3G
15c50 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
15c60 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20 69    if( v ){.    i
15c70 6e 74 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47  nt r1 = sqlite3G
15c80 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
15c90 29 3b 0a 20 20 20 20 69 6e 74 20 72 32 20 3d 20  );.    int r2 = 
15ca0 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
15cb0 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 69  g(pParse);.    i
15cc0 6e 74 20 6a 31 3b 0a 20 20 20 20 73 71 6c 69 74  nt j1;.    sqlit
15cd0 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
15ce0 4f 50 5f 52 65 61 64 43 6f 6f 6b 69 65 2c 20 69  OP_ReadCookie, i
15cf0 44 62 2c 20 72 31 2c 20 31 29 3b 0a 20 20 20 20  Db, r1, 1);.    
15d00 73 71 6c 69 74 65 33 56 64 62 65 55 73 65 73 42  sqlite3VdbeUsesB
15d10 74 72 65 65 28 76 2c 20 69 44 62 29 3b 0a 20 20  tree(v, iDb);.  
15d20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
15d30 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
15d40 72 2c 20 6d 69 6e 46 6f 72 6d 61 74 2c 20 72 32  r, minFormat, r2
15d50 29 3b 0a 20 20 20 20 6a 31 20 3d 20 73 71 6c 69  );.    j1 = sqli
15d60 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
15d70 20 4f 50 5f 47 65 2c 20 72 32 2c 20 30 2c 20 72   OP_Ge, r2, 0, r
15d80 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  1);.    sqlite3V
15d90 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
15da0 53 65 74 43 6f 6f 6b 69 65 2c 20 69 44 62 2c 20  SetCookie, iDb, 
15db0 31 2c 20 72 32 29 3b 0a 20 20 20 20 73 71 6c 69  1, r2);.    sqli
15dc0 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
15dd0 76 2c 20 6a 31 29 3b 0a 20 20 20 20 73 71 6c 69  v, j1);.    sqli
15de0 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
15df0 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20  g(pParse, r1);. 
15e00 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
15e10 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
15e20 20 72 32 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a   r2);.  }.}../*.
15e30 2a 2a 20 46 69 6c 6c 20 74 68 65 20 49 6e 64 65  ** Fill the Inde
15e40 78 2e 61 69 52 6f 77 45 73 74 5b 5d 20 61 72 72  x.aiRowEst[] arr
15e50 61 79 20 77 69 74 68 20 64 65 66 61 75 6c 74 20  ay with default 
15e60 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2d 20 69 6e  information - in
15e70 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20 74 6f 20  formation.** to 
15e80 62 65 20 75 73 65 64 20 77 68 65 6e 20 77 65 20  be used when we 
15e90 68 61 76 65 20 6e 6f 74 20 72 75 6e 20 74 68 65  have not run the
15ea0 20 41 4e 41 4c 59 5a 45 20 63 6f 6d 6d 61 6e 64   ANALYZE command
15eb0 2e 0a 2a 2a 0a 2a 2a 20 61 69 52 6f 77 45 73 74  ..**.** aiRowEst
15ec0 5b 30 5d 20 69 73 20 73 75 70 70 6f 73 65 20 74  [0] is suppose t
15ed0 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 6e 75  o contain the nu
15ee0 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73  mber of elements
15ef0 20 69 6e 20 74 68 65 20 69 6e 64 65 78 2e 0a 2a   in the index..*
15f00 2a 20 53 69 6e 63 65 20 77 65 20 64 6f 20 6e 6f  * Since we do no
15f10 74 20 6b 6e 6f 77 2c 20 67 75 65 73 73 20 31 20  t know, guess 1 
15f20 6d 69 6c 6c 69 6f 6e 2e 20 20 61 69 52 6f 77 45  million.  aiRowE
15f30 73 74 5b 31 5d 20 69 73 20 61 6e 20 65 73 74 69  st[1] is an esti
15f40 6d 61 74 65 20 6f 66 20 74 68 65 0a 2a 2a 20 6e  mate of the.** n
15f50 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e  umber of rows in
15f60 20 74 68 65 20 74 61 62 6c 65 20 74 68 61 74 20   the table that 
15f70 6d 61 74 63 68 20 61 6e 79 20 70 61 72 74 69 63  match any partic
15f80 75 6c 61 72 20 76 61 6c 75 65 20 6f 66 20 74 68  ular value of th
15f90 65 0a 2a 2a 20 66 69 72 73 74 20 63 6f 6c 75 6d  e.** first colum
15fa0 6e 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e 20  n of the index. 
15fb0 20 61 69 52 6f 77 45 73 74 5b 32 5d 20 69 73 20   aiRowEst[2] is 
15fc0 61 6e 20 65 73 74 69 6d 61 74 65 20 6f 66 20 74  an estimate of t
15fd0 68 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66 20  he number.** of 
15fe0 72 6f 77 73 20 74 68 61 74 20 6d 61 74 63 68 20  rows that match 
15ff0 61 6e 79 20 70 61 72 74 69 63 75 6c 61 72 20 63  any particular c
16000 6f 6d 62 69 6e 69 61 74 69 6f 6e 20 6f 66 20 74  ombiniation of t
16010 68 65 20 66 69 72 73 74 20 32 20 63 6f 6c 75 6d  he first 2 colum
16020 6e 73 0a 2a 2a 20 6f 66 20 74 68 65 20 69 6e 64  ns.** of the ind
16030 65 78 2e 20 20 41 6e 64 20 73 6f 20 66 6f 72 74  ex.  And so fort
16040 68 2e 20 20 49 74 20 6d 75 73 74 20 61 6c 77 61  h.  It must alwa
16050 79 73 20 62 65 20 74 68 65 20 63 61 73 65 20 74  ys be the case t
16060 68 61 74 0a 2a 0a 2a 2a 20 20 20 20 20 20 20 20  hat.*.**        
16070 20 20 20 61 69 52 6f 77 45 73 74 5b 4e 5d 3c 3d     aiRowEst[N]<=
16080 61 69 52 6f 77 45 73 74 5b 4e 2d 31 5d 0a 2a 2a  aiRowEst[N-1].**
16090 20 20 20 20 20 20 20 20 20 20 20 61 69 52 6f 77             aiRow
160a0 45 73 74 5b 4e 5d 3e 3d 31 0a 2a 2a 0a 2a 2a 20  Est[N]>=1.**.** 
160b0 41 70 61 72 74 20 66 72 6f 6d 20 74 68 61 74 2c  Apart from that,
160c0 20 77 65 20 68 61 76 65 20 6c 69 74 74 6c 65 20   we have little 
160d0 74 6f 20 67 6f 20 6f 6e 20 62 65 73 69 64 65 73  to go on besides
160e0 20 69 6e 74 75 69 74 69 6f 6e 20 61 73 20 74 6f   intuition as to
160f0 0a 2a 2a 20 68 6f 77 20 61 69 52 6f 77 45 73 74  .** how aiRowEst
16100 5b 5d 20 73 68 6f 75 6c 64 20 62 65 20 69 6e 69  [] should be ini
16110 74 69 61 6c 69 7a 65 64 2e 20 20 54 68 65 20 6e  tialized.  The n
16120 75 6d 62 65 72 73 20 67 65 6e 65 72 61 74 65 64  umbers generated
16130 20 68 65 72 65 0a 2a 2a 20 61 72 65 20 62 61 73   here.** are bas
16140 65 64 20 6f 6e 20 74 79 70 69 63 61 6c 20 76 61  ed on typical va
16150 6c 75 65 73 20 66 6f 75 6e 64 20 69 6e 20 61 63  lues found in ac
16160 74 75 61 6c 20 69 6e 64 69 63 65 73 2e 0a 2a 2f  tual indices..*/
16170 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 44 65 66  .void sqlite3Def
16180 61 75 6c 74 52 6f 77 45 73 74 28 49 6e 64 65 78  aultRowEst(Index
16190 20 2a 70 49 64 78 29 7b 0a 20 20 75 6e 73 69 67   *pIdx){.  unsig
161a0 6e 65 64 20 2a 61 20 3d 20 70 49 64 78 2d 3e 61  ned *a = pIdx->a
161b0 69 52 6f 77 45 73 74 3b 0a 20 20 69 6e 74 20 69  iRowEst;.  int i
161c0 3b 0a 20 20 61 73 73 65 72 74 28 20 61 21 3d 30  ;.  assert( a!=0
161d0 20 29 3b 0a 20 20 61 5b 30 5d 20 3d 20 31 30 30   );.  a[0] = 100
161e0 30 30 30 30 3b 0a 20 20 66 6f 72 28 69 3d 70 49  0000;.  for(i=pI
161f0 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 3e 3d  dx->nColumn; i>=
16200 35 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 61 5b 69  5; i--){.    a[i
16210 5d 20 3d 20 35 3b 0a 20 20 7d 0a 20 20 77 68 69  ] = 5;.  }.  whi
16220 6c 65 28 20 69 3e 3d 31 20 29 7b 0a 20 20 20 20  le( i>=1 ){.    
16230 61 5b 69 5d 20 3d 20 31 31 20 2d 20 69 3b 0a 20  a[i] = 11 - i;. 
16240 20 20 20 69 2d 2d 3b 0a 20 20 7d 0a 20 20 69 66     i--;.  }.  if
16250 28 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 21  ( pIdx->onError!
16260 3d 4f 45 5f 4e 6f 6e 65 20 29 7b 0a 20 20 20 20  =OE_None ){.    
16270 61 5b 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 5d  a[pIdx->nColumn]
16280 20 3d 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a   = 1;.  }.}../*.
16290 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
162a0 77 69 6c 6c 20 64 72 6f 70 20 61 6e 20 65 78 69  will drop an exi
162b0 73 74 69 6e 67 20 6e 61 6d 65 64 20 69 6e 64 65  sting named inde
162c0 78 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  x.  This routine
162d0 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74  .** implements t
162e0 68 65 20 44 52 4f 50 20 49 4e 44 45 58 20 73 74  he DROP INDEX st
162f0 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64  atement..*/.void
16300 20 73 71 6c 69 74 65 33 44 72 6f 70 49 6e 64 65   sqlite3DropInde
16310 78 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  x(Parse *pParse,
16320 20 53 72 63 4c 69 73 74 20 2a 70 4e 61 6d 65 2c   SrcList *pName,
16330 20 69 6e 74 20 69 66 45 78 69 73 74 73 29 7b 0a   int ifExists){.
16340 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b    Index *pIndex;
16350 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 73 71  .  Vdbe *v;.  sq
16360 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
16370 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 69 44  se->db;.  int iD
16380 62 3b 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65  b;..  if( pParse
16390 2d 3e 6e 45 72 72 20 7c 7c 20 64 62 2d 3e 6d 61  ->nErr || db->ma
163a0 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
163b0 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70    goto exit_drop
163c0 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 61 73  _index;.  }.  as
163d0 73 65 72 74 28 20 70 4e 61 6d 65 2d 3e 6e 53 72  sert( pName->nSr
163e0 63 3d 3d 31 20 29 3b 0a 20 20 69 66 28 20 53 51  c==1 );.  if( SQ
163f0 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33  LITE_OK!=sqlite3
16400 52 65 61 64 53 63 68 65 6d 61 28 70 50 61 72 73  ReadSchema(pPars
16410 65 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65  e) ){.    goto e
16420 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a  xit_drop_index;.
16430 20 20 7d 0a 20 20 70 49 6e 64 65 78 20 3d 20 73    }.  pIndex = s
16440 71 6c 69 74 65 33 46 69 6e 64 49 6e 64 65 78 28  qlite3FindIndex(
16450 64 62 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e  db, pName->a[0].
16460 7a 4e 61 6d 65 2c 20 70 4e 61 6d 65 2d 3e 61 5b  zName, pName->a[
16470 30 5d 2e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20  0].zDatabase);. 
16480 20 69 66 28 20 70 49 6e 64 65 78 3d 3d 30 20 29   if( pIndex==0 )
16490 7b 0a 20 20 20 20 69 66 28 20 21 69 66 45 78 69  {.    if( !ifExi
164a0 73 74 73 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  sts ){.      sql
164b0 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
164c0 72 73 65 2c 20 22 6e 6f 20 73 75 63 68 20 69 6e  rse, "no such in
164d0 64 65 78 3a 20 25 53 22 2c 20 70 4e 61 6d 65 2c  dex: %S", pName,
164e0 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70   0);.    }.    p
164f0 50 61 72 73 65 2d 3e 63 68 65 63 6b 53 63 68 65  Parse->checkSche
16500 6d 61 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f  ma = 1;.    goto
16510 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78   exit_drop_index
16520 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 49 6e 64  ;.  }.  if( pInd
16530 65 78 2d 3e 61 75 74 6f 49 6e 64 65 78 20 29 7b  ex->autoIndex ){
16540 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
16550 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 69 6e  rMsg(pParse, "in
16560 64 65 78 20 61 73 73 6f 63 69 61 74 65 64 20 77  dex associated w
16570 69 74 68 20 55 4e 49 51 55 45 20 22 0a 20 20 20  ith UNIQUE ".   
16580 20 20 20 22 6f 72 20 50 52 49 4d 41 52 59 20 4b     "or PRIMARY K
16590 45 59 20 63 6f 6e 73 74 72 61 69 6e 74 20 63 61  EY constraint ca
165a0 6e 6e 6f 74 20 62 65 20 64 72 6f 70 70 65 64 22  nnot be dropped"
165b0 2c 20 30 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65  , 0);.    goto e
165c0 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a  xit_drop_index;.
165d0 20 20 7d 0a 20 20 69 44 62 20 3d 20 73 71 6c 69    }.  iDb = sqli
165e0 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78  te3SchemaToIndex
165f0 28 64 62 2c 20 70 49 6e 64 65 78 2d 3e 70 53 63  (db, pIndex->pSc
16600 68 65 6d 61 29 3b 0a 23 69 66 6e 64 65 66 20 53  hema);.#ifndef S
16610 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f  QLITE_OMIT_AUTHO
16620 52 49 5a 41 54 49 4f 4e 0a 20 20 7b 0a 20 20 20  RIZATION.  {.   
16630 20 69 6e 74 20 63 6f 64 65 20 3d 20 53 51 4c 49   int code = SQLI
16640 54 45 5f 44 52 4f 50 5f 49 4e 44 45 58 3b 0a 20  TE_DROP_INDEX;. 
16650 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d     Table *pTab =
16660 20 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 3b   pIndex->pTable;
16670 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
16680 2a 7a 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69  *zDb = db->aDb[i
16690 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 63  Db].zName;.    c
166a0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62 20  onst char *zTab 
166b0 3d 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69  = SCHEMA_TABLE(i
166c0 44 62 29 3b 0a 20 20 20 20 69 66 28 20 73 71 6c  Db);.    if( sql
166d0 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50  ite3AuthCheck(pP
166e0 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 44 45 4c  arse, SQLITE_DEL
166f0 45 54 45 2c 20 7a 54 61 62 2c 20 30 2c 20 7a 44  ETE, zTab, 0, zD
16700 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  b) ){.      goto
16710 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78   exit_drop_index
16720 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
16730 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26 26 20  !OMIT_TEMPDB && 
16740 69 44 62 20 29 20 63 6f 64 65 20 3d 20 53 51 4c  iDb ) code = SQL
16750 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 49 4e  ITE_DROP_TEMP_IN
16760 44 45 58 3b 0a 20 20 20 20 69 66 28 20 73 71 6c  DEX;.    if( sql
16770 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50  ite3AuthCheck(pP
16780 61 72 73 65 2c 20 63 6f 64 65 2c 20 70 49 6e 64  arse, code, pInd
16790 65 78 2d 3e 7a 4e 61 6d 65 2c 20 70 54 61 62 2d  ex->zName, pTab-
167a0 3e 7a 4e 61 6d 65 2c 20 7a 44 62 29 20 29 7b 0a  >zName, zDb) ){.
167b0 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f        goto exit_
167c0 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 20 20  drop_index;.    
167d0 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  }.  }.#endif..  
167e0 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
167f0 20 74 6f 20 72 65 6d 6f 76 65 20 74 68 65 20 69   to remove the i
16800 6e 64 65 78 20 61 6e 64 20 66 72 6f 6d 20 74 68  ndex and from th
16810 65 20 6d 61 73 74 65 72 20 74 61 62 6c 65 20 2a  e master table *
16820 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47  /.  v = sqlite3G
16830 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
16840 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20 73    if( v ){.    s
16850 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74 65  qlite3BeginWrite
16860 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65  Operation(pParse
16870 2c 20 31 2c 20 69 44 62 29 3b 0a 20 20 20 20 73  , 1, iDb);.    s
16880 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72 73  qlite3NestedPars
16890 65 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20  e(pParse,.      
168a0 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 25 51   "DELETE FROM %Q
168b0 2e 25 73 20 57 48 45 52 45 20 6e 61 6d 65 3d 25  .%s WHERE name=%
168c0 51 22 2c 0a 20 20 20 20 20 20 20 64 62 2d 3e 61  Q",.       db->a
168d0 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 2c 20 53  Db[iDb].zName, S
168e0 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 44 62 29  CHEMA_TABLE(iDb)
168f0 2c 0a 20 20 20 20 20 20 20 70 49 6e 64 65 78 2d  ,.       pIndex-
16900 3e 7a 4e 61 6d 65 0a 20 20 20 20 29 3b 0a 20 20  >zName.    );.  
16910 20 20 73 71 6c 69 74 65 33 43 68 61 6e 67 65 43    sqlite3ChangeC
16920 6f 6f 6b 69 65 28 70 50 61 72 73 65 2c 20 69 44  ookie(pParse, iD
16930 62 29 3b 0a 20 20 20 20 64 65 73 74 72 6f 79 52  b);.    destroyR
16940 6f 6f 74 50 61 67 65 28 70 50 61 72 73 65 2c 20  ootPage(pParse, 
16950 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 2c 20 69 44  pIndex->tnum, iD
16960 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  b);.    sqlite3V
16970 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
16980 44 72 6f 70 49 6e 64 65 78 2c 20 69 44 62 2c 20  DropIndex, iDb, 
16990 30 2c 20 30 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e  0, 0, pIndex->zN
169a0 61 6d 65 2c 20 30 29 3b 0a 20 20 7d 0a 0a 65 78  ame, 0);.  }..ex
169b0 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3a 0a 20  it_drop_index:. 
169c0 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44   sqlite3SrcListD
169d0 65 6c 65 74 65 28 70 4e 61 6d 65 29 3b 0a 7d 0a  elete(pName);.}.
169e0 0a 2f 2a 0a 2a 2a 20 70 41 72 72 61 79 20 69 73  ./*.** pArray is
169f0 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e   a pointer to an
16a00 20 61 72 72 61 79 20 6f 66 20 6f 62 6a 65 63 74   array of object
16a10 73 2e 20 20 45 61 63 68 20 6f 62 6a 65 63 74 20  s.  Each object 
16a20 69 6e 20 74 68 65 0a 2a 2a 20 61 72 72 61 79 20  in the.** array 
16a30 69 73 20 73 7a 45 6e 74 72 79 20 62 79 74 65 73  is szEntry bytes
16a40 20 69 6e 20 73 69 7a 65 2e 20 20 54 68 69 73 20   in size.  This 
16a50 72 6f 75 74 69 6e 65 20 61 6c 6c 6f 63 61 74 65  routine allocate
16a60 73 20 61 20 6e 65 77 0a 2a 2a 20 6f 62 6a 65 63  s a new.** objec
16a70 74 20 6f 6e 20 74 68 65 20 65 6e 64 20 6f 66 20  t on the end of 
16a80 74 68 65 20 61 72 72 61 79 2e 0a 2a 2a 0a 2a 2a  the array..**.**
16a90 20 2a 70 6e 45 6e 74 72 79 20 69 73 20 74 68 65   *pnEntry is the
16aa0 20 6e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69   number of entri
16ab0 65 73 20 61 6c 72 65 61 64 79 20 69 6e 20 75 73  es already in us
16ac0 65 2e 20 20 2a 70 6e 41 6c 6c 6f 63 20 69 73 0a  e.  *pnAlloc is.
16ad0 2a 2a 20 74 68 65 20 70 72 65 76 69 6f 75 73 6c  ** the previousl
16ae0 79 20 61 6c 6c 6f 63 61 74 65 64 20 73 69 7a 65  y allocated size
16af0 20 6f 66 20 74 68 65 20 61 72 72 61 79 2e 20 20   of the array.  
16b00 69 6e 69 74 53 69 7a 65 20 69 73 20 74 68 65 0a  initSize is the.
16b10 2a 2a 20 73 75 67 67 65 73 74 65 64 20 69 6e 69  ** suggested ini
16b20 74 69 61 6c 20 61 72 72 61 79 20 73 69 7a 65 20  tial array size 
16b30 61 6c 6c 6f 63 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a  allocation..**.*
16b40 2a 20 54 68 65 20 69 6e 64 65 78 20 6f 66 20 74  * The index of t
16b50 68 65 20 6e 65 77 20 65 6e 74 72 79 20 69 73 20  he new entry is 
16b60 72 65 74 75 72 6e 65 64 20 69 6e 20 2a 70 49 64  returned in *pId
16b70 78 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  x..**.** This ro
16b80 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 61 20  utine returns a 
16b90 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 61  pointer to the a
16ba0 72 72 61 79 20 6f 66 20 6f 62 6a 65 63 74 73 2e  rray of objects.
16bb0 20 20 54 68 69 73 0a 2a 2a 20 6d 69 67 68 74 20    This.** might 
16bc0 62 65 20 74 68 65 20 73 61 6d 65 20 61 73 20 74  be the same as t
16bd0 68 65 20 70 41 72 72 61 79 20 70 61 72 61 6d 65  he pArray parame
16be0 74 65 72 20 6f 72 20 69 74 20 6d 69 67 68 74 20  ter or it might 
16bf0 62 65 20 61 20 64 69 66 66 65 72 65 6e 74 0a 2a  be a different.*
16c00 2a 20 70 6f 69 6e 74 65 72 20 69 66 20 74 68 65  * pointer if the
16c10 20 61 72 72 61 79 20 77 61 73 20 72 65 73 69 7a   array was resiz
16c20 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c  ed..*/.void *sql
16c30 69 74 65 33 41 72 72 61 79 41 6c 6c 6f 63 61 74  ite3ArrayAllocat
16c40 65 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  e(.  sqlite3 *db
16c50 2c 20 20 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63  ,      /* Connec
16c60 74 69 6f 6e 20 74 6f 20 6e 6f 74 69 66 79 20 6f  tion to notify o
16c70 66 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65  f malloc failure
16c80 73 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 41 72  s */.  void *pAr
16c90 72 61 79 2c 20 20 20 20 20 2f 2a 20 41 72 72 61  ray,     /* Arra
16ca0 79 20 6f 66 20 6f 62 6a 65 63 74 73 2e 20 20 4d  y of objects.  M
16cb0 69 67 68 74 20 62 65 20 72 65 61 6c 6c 6f 63 61  ight be realloca
16cc0 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 45  ted */.  int szE
16cd0 6e 74 72 79 2c 20 20 20 20 20 20 2f 2a 20 53 69  ntry,      /* Si
16ce0 7a 65 20 6f 66 20 65 61 63 68 20 6f 62 6a 65 63  ze of each objec
16cf0 74 20 69 6e 20 74 68 65 20 61 72 72 61 79 20 2a  t in the array *
16d00 2f 0a 20 20 69 6e 74 20 69 6e 69 74 53 69 7a 65  /.  int initSize
16d10 2c 20 20 20 20 20 2f 2a 20 53 75 67 67 65 73 74  ,     /* Suggest
16d20 65 64 20 69 6e 69 74 69 61 6c 20 61 6c 6c 6f 63  ed initial alloc
16d30 61 74 69 6f 6e 2c 20 69 6e 20 65 6c 65 6d 65 6e  ation, in elemen
16d40 74 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 45  ts */.  int *pnE
16d50 6e 74 72 79 2c 20 20 20 20 20 2f 2a 20 4e 75 6d  ntry,     /* Num
16d60 62 65 72 20 6f 66 20 6f 62 6a 65 63 74 73 20 63  ber of objects c
16d70 75 72 72 65 6e 74 6c 79 20 69 6e 20 75 73 65 20  urrently in use 
16d80 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 41 6c 6c 6f  */.  int *pnAllo
16d90 63 2c 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e  c,     /* Curren
16da0 74 20 73 69 7a 65 20 6f 66 20 74 68 65 20 61 6c  t size of the al
16db0 6c 6f 63 61 74 69 6f 6e 2c 20 69 6e 20 65 6c 65  location, in ele
16dc0 6d 65 6e 74 73 20 2a 2f 0a 20 20 69 6e 74 20 2a  ments */.  int *
16dd0 70 49 64 78 20 20 20 20 20 20 20 20 20 2f 2a 20  pIdx         /* 
16de0 57 72 69 74 65 20 74 68 65 20 69 6e 64 65 78 20  Write the index 
16df0 6f 66 20 61 20 6e 65 77 20 73 6c 6f 74 20 68 65  of a new slot he
16e00 72 65 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20  re */.){.  char 
16e10 2a 7a 3b 0a 20 20 69 66 28 20 2a 70 6e 45 6e 74  *z;.  if( *pnEnt
16e20 72 79 20 3e 3d 20 2a 70 6e 41 6c 6c 6f 63 20 29  ry >= *pnAlloc )
16e30 7b 0a 20 20 20 20 76 6f 69 64 20 2a 70 4e 65 77  {.    void *pNew
16e40 3b 0a 20 20 20 20 69 6e 74 20 6e 65 77 53 69 7a  ;.    int newSiz
16e50 65 3b 0a 20 20 20 20 6e 65 77 53 69 7a 65 20 3d  e;.    newSize =
16e60 20 28 2a 70 6e 41 6c 6c 6f 63 29 2a 32 20 2b 20   (*pnAlloc)*2 + 
16e70 69 6e 69 74 53 69 7a 65 3b 0a 20 20 20 20 70 4e  initSize;.    pN
16e80 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62 52 65  ew = sqlite3DbRe
16e90 61 6c 6c 6f 63 28 64 62 2c 20 70 41 72 72 61 79  alloc(db, pArray
16ea0 2c 20 6e 65 77 53 69 7a 65 2a 73 7a 45 6e 74 72  , newSize*szEntr
16eb0 79 29 3b 0a 20 20 20 20 69 66 28 20 70 4e 65 77  y);.    if( pNew
16ec0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2a 70 49  ==0 ){.      *pI
16ed0 64 78 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 72  dx = -1;.      r
16ee0 65 74 75 72 6e 20 70 41 72 72 61 79 3b 0a 20 20  eturn pArray;.  
16ef0 20 20 7d 0a 20 20 20 20 2a 70 6e 41 6c 6c 6f 63    }.    *pnAlloc
16f00 20 3d 20 6e 65 77 53 69 7a 65 3b 0a 20 20 20 20   = newSize;.    
16f10 70 41 72 72 61 79 20 3d 20 70 4e 65 77 3b 0a 20  pArray = pNew;. 
16f20 20 7d 0a 20 20 7a 20 3d 20 28 63 68 61 72 2a 29   }.  z = (char*)
16f30 70 41 72 72 61 79 3b 0a 20 20 6d 65 6d 73 65 74  pArray;.  memset
16f40 28 26 7a 5b 2a 70 6e 45 6e 74 72 79 20 2a 20 73  (&z[*pnEntry * s
16f50 7a 45 6e 74 72 79 5d 2c 20 30 2c 20 73 7a 45 6e  zEntry], 0, szEn
16f60 74 72 79 29 3b 0a 20 20 2a 70 49 64 78 20 3d 20  try);.  *pIdx = 
16f70 2a 70 6e 45 6e 74 72 79 3b 0a 20 20 2b 2b 2a 70  *pnEntry;.  ++*p
16f80 6e 45 6e 74 72 79 3b 0a 20 20 72 65 74 75 72 6e  nEntry;.  return
16f90 20 70 41 72 72 61 79 3b 0a 7d 0a 0a 2f 2a 0a 2a   pArray;.}../*.*
16fa0 2a 20 41 70 70 65 6e 64 20 61 20 6e 65 77 20 65  * Append a new e
16fb0 6c 65 6d 65 6e 74 20 74 6f 20 74 68 65 20 67 69  lement to the gi
16fc0 76 65 6e 20 49 64 4c 69 73 74 2e 20 20 43 72 65  ven IdList.  Cre
16fd0 61 74 65 20 61 20 6e 65 77 20 49 64 4c 69 73 74  ate a new IdList
16fe0 20 69 66 0a 2a 2a 20 6e 65 65 64 20 62 65 2e 0a   if.** need be..
16ff0 2a 2a 0a 2a 2a 20 41 20 6e 65 77 20 49 64 4c 69  **.** A new IdLi
17000 73 74 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20  st is returned, 
17010 6f 72 20 4e 55 4c 4c 20 69 66 20 6d 61 6c 6c 6f  or NULL if mallo
17020 63 28 29 20 66 61 69 6c 73 2e 0a 2a 2f 0a 49 64  c() fails..*/.Id
17030 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 49 64 4c  List *sqlite3IdL
17040 69 73 74 41 70 70 65 6e 64 28 73 71 6c 69 74 65  istAppend(sqlite
17050 33 20 2a 64 62 2c 20 49 64 4c 69 73 74 20 2a 70  3 *db, IdList *p
17060 4c 69 73 74 2c 20 54 6f 6b 65 6e 20 2a 70 54 6f  List, Token *pTo
17070 6b 65 6e 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  ken){.  int i;. 
17080 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b   if( pList==0 ){
17090 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 73 71 6c  .    pList = sql
170a0 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f  ite3DbMallocZero
170b0 28 64 62 2c 20 73 69 7a 65 6f 66 28 49 64 4c 69  (db, sizeof(IdLi
170c0 73 74 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70  st) );.    if( p
170d0 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e  List==0 ) return
170e0 20 30 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 6e   0;.    pList->n
170f0 41 6c 6c 6f 63 20 3d 20 30 3b 0a 20 20 7d 0a 20  Alloc = 0;.  }. 
17100 20 70 4c 69 73 74 2d 3e 61 20 3d 20 73 71 6c 69   pList->a = sqli
17110 74 65 33 41 72 72 61 79 41 6c 6c 6f 63 61 74 65  te3ArrayAllocate
17120 28 0a 20 20 20 20 20 20 64 62 2c 0a 20 20 20 20  (.      db,.    
17130 20 20 70 4c 69 73 74 2d 3e 61 2c 0a 20 20 20 20    pList->a,.    
17140 20 20 73 69 7a 65 6f 66 28 70 4c 69 73 74 2d 3e    sizeof(pList->
17150 61 5b 30 5d 29 2c 0a 20 20 20 20 20 20 35 2c 0a  a[0]),.      5,.
17160 20 20 20 20 20 20 26 70 4c 69 73 74 2d 3e 6e 49        &pList->nI
17170 64 2c 0a 20 20 20 20 20 20 26 70 4c 69 73 74 2d  d,.      &pList-
17180 3e 6e 41 6c 6c 6f 63 2c 0a 20 20 20 20 20 20 26  >nAlloc,.      &
17190 69 0a 20 20 29 3b 0a 20 20 69 66 28 20 69 3c 30  i.  );.  if( i<0
171a0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 49   ){.    sqlite3I
171b0 64 4c 69 73 74 44 65 6c 65 74 65 28 70 4c 69 73  dListDelete(pLis
171c0 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30  t);.    return 0
171d0 3b 0a 20 20 7d 0a 20 20 70 4c 69 73 74 2d 3e 61  ;.  }.  pList->a
171e0 5b 69 5d 2e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69  [i].zName = sqli
171f0 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e  te3NameFromToken
17200 28 64 62 2c 20 70 54 6f 6b 65 6e 29 3b 0a 20 20  (db, pToken);.  
17210 72 65 74 75 72 6e 20 70 4c 69 73 74 3b 0a 7d 0a  return pList;.}.
17220 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6e  ./*.** Delete an
17230 20 49 64 4c 69 73 74 2e 0a 2a 2f 0a 76 6f 69 64   IdList..*/.void
17240 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44 65   sqlite3IdListDe
17250 6c 65 74 65 28 49 64 4c 69 73 74 20 2a 70 4c 69  lete(IdList *pLi
17260 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  st){.  int i;.  
17270 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72  if( pList==0 ) r
17280 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30  eturn;.  for(i=0
17290 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 49 64 3b 20  ; i<pList->nId; 
172a0 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  i++){.    sqlite
172b0 33 5f 66 72 65 65 28 70 4c 69 73 74 2d 3e 61 5b  3_free(pList->a[
172c0 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a 20  i].zName);.  }. 
172d0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4c   sqlite3_free(pL
172e0 69 73 74 2d 3e 61 29 3b 0a 20 20 73 71 6c 69 74  ist->a);.  sqlit
172f0 65 33 5f 66 72 65 65 28 70 4c 69 73 74 29 3b 0a  e3_free(pList);.
17300 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
17310 74 68 65 20 69 6e 64 65 78 20 69 6e 20 70 4c 69  the index in pLi
17320 73 74 20 6f 66 20 74 68 65 20 69 64 65 6e 74 69  st of the identi
17330 66 69 65 72 20 6e 61 6d 65 64 20 7a 49 64 2e 20  fier named zId. 
17340 20 52 65 74 75 72 6e 20 2d 31 0a 2a 2a 20 69 66   Return -1.** if
17350 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 69   not found..*/.i
17360 6e 74 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74  nt sqlite3IdList
17370 49 6e 64 65 78 28 49 64 4c 69 73 74 20 2a 70 4c  Index(IdList *pL
17380 69 73 74 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  ist, const char 
17390 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 69  *zName){.  int i
173a0 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30  ;.  if( pList==0
173b0 20 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20   ) return -1;.  
173c0 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74  for(i=0; i<pList
173d0 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nId; i++){.   
173e0 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49   if( sqlite3StrI
173f0 43 6d 70 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  Cmp(pList->a[i].
17400 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29 3d 3d 30  zName, zName)==0
17410 20 29 20 72 65 74 75 72 6e 20 69 3b 0a 20 20 7d   ) return i;.  }
17420 0a 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a  .  return -1;.}.
17430 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 61 20  ./*.** Append a 
17440 6e 65 77 20 74 61 62 6c 65 20 6e 61 6d 65 20 74  new table name t
17450 6f 20 74 68 65 20 67 69 76 65 6e 20 53 72 63 4c  o the given SrcL
17460 69 73 74 2e 20 20 43 72 65 61 74 65 20 61 20 6e  ist.  Create a n
17470 65 77 20 53 72 63 4c 69 73 74 20 69 66 0a 2a 2a  ew SrcList if.**
17480 20 6e 65 65 64 20 62 65 2e 20 20 41 20 6e 65 77   need be.  A new
17490 20 65 6e 74 72 79 20 69 73 20 63 72 65 61 74 65   entry is create
174a0 64 20 69 6e 20 74 68 65 20 53 72 63 4c 69 73 74  d in the SrcList
174b0 20 65 76 65 6e 20 69 66 20 70 54 6f 6b 65 6e 20   even if pToken 
174c0 69 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 41  is NULL..**.** A
174d0 20 6e 65 77 20 53 72 63 4c 69 73 74 20 69 73 20   new SrcList is 
174e0 72 65 74 75 72 6e 65 64 2c 20 6f 72 20 4e 55 4c  returned, or NUL
174f0 4c 20 69 66 20 6d 61 6c 6c 6f 63 28 29 20 66 61  L if malloc() fa
17500 69 6c 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 44  ils..**.** If pD
17510 61 74 61 62 61 73 65 20 69 73 20 6e 6f 74 20 6e  atabase is not n
17520 75 6c 6c 2c 20 69 74 20 6d 65 61 6e 73 20 74 68  ull, it means th
17530 61 74 20 74 68 65 20 74 61 62 6c 65 20 68 61 73  at the table has
17540 20 61 6e 20 6f 70 74 69 6f 6e 61 6c 0a 2a 2a 20   an optional.** 
17550 64 61 74 61 62 61 73 65 20 6e 61 6d 65 20 70 72  database name pr
17560 65 66 69 78 2e 20 20 4c 69 6b 65 20 74 68 69 73  efix.  Like this
17570 3a 20 20 22 64 61 74 61 62 61 73 65 2e 74 61 62  :  "database.tab
17580 6c 65 22 2e 20 20 54 68 65 20 70 44 61 74 61 62  le".  The pDatab
17590 61 73 65 0a 2a 2a 20 70 6f 69 6e 74 73 20 74 6f  ase.** points to
175a0 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20   the table name 
175b0 61 6e 64 20 74 68 65 20 70 54 61 62 6c 65 20 70  and the pTable p
175c0 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 64 61 74  oints to the dat
175d0 61 62 61 73 65 20 6e 61 6d 65 2e 0a 2a 2a 20 54  abase name..** T
175e0 68 65 20 53 72 63 4c 69 73 74 2e 61 5b 5d 2e 7a  he SrcList.a[].z
175f0 4e 61 6d 65 20 66 69 65 6c 64 20 69 73 20 66 69  Name field is fi
17600 6c 6c 65 64 20 77 69 74 68 20 74 68 65 20 74 61  lled with the ta
17610 62 6c 65 20 6e 61 6d 65 20 77 68 69 63 68 20 6d  ble name which m
17620 69 67 68 74 0a 2a 2a 20 63 6f 6d 65 20 66 72 6f  ight.** come fro
17630 6d 20 70 54 61 62 6c 65 20 28 69 66 20 70 44 61  m pTable (if pDa
17640 74 61 62 61 73 65 20 69 73 20 4e 55 4c 4c 29 20  tabase is NULL) 
17650 6f 72 20 66 72 6f 6d 20 70 44 61 74 61 62 61 73  or from pDatabas
17660 65 2e 20 20 0a 2a 2a 20 53 72 63 4c 69 73 74 2e  e.  .** SrcList.
17670 61 5b 5d 2e 7a 44 61 74 61 62 61 73 65 20 69 73  a[].zDatabase is
17680 20 66 69 6c 6c 65 64 20 77 69 74 68 20 74 68 65   filled with the
17690 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 20 66   database name f
176a0 72 6f 6d 20 70 54 61 62 6c 65 2c 0a 2a 2a 20 6f  rom pTable,.** o
176b0 72 20 77 69 74 68 20 4e 55 4c 4c 20 69 66 20 6e  r with NULL if n
176c0 6f 20 64 61 74 61 62 61 73 65 20 69 73 20 73 70  o database is sp
176d0 65 63 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 49  ecified..**.** I
176e0 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 69  n other words, i
176f0 66 20 63 61 6c 6c 20 6c 69 6b 65 20 74 68 69 73  f call like this
17700 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20  :.**.**         
17710 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70  sqlite3SrcListAp
17720 70 65 6e 64 28 44 2c 41 2c 42 2c 30 29 3b 0a 2a  pend(D,A,B,0);.*
17730 2a 0a 2a 2a 20 54 68 65 6e 20 42 20 69 73 20 61  *.** Then B is a
17740 20 74 61 62 6c 65 20 6e 61 6d 65 20 61 6e 64 20   table name and 
17750 74 68 65 20 64 61 74 61 62 61 73 65 20 6e 61 6d  the database nam
17760 65 20 69 73 20 75 6e 73 70 65 63 69 66 69 65 64  e is unspecified
17770 2e 20 20 49 66 20 63 61 6c 6c 65 64 0a 2a 2a 20  .  If called.** 
17780 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a  like this:.**.**
17790 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
177a0 53 72 63 4c 69 73 74 41 70 70 65 6e 64 28 44 2c  SrcListAppend(D,
177b0 41 2c 42 2c 43 29 3b 0a 2a 2a 0a 2a 2a 20 54 68  A,B,C);.**.** Th
177c0 65 6e 20 43 20 69 73 20 74 68 65 20 74 61 62 6c  en C is the tabl
177d0 65 20 6e 61 6d 65 20 61 6e 64 20 42 20 69 73 20  e name and B is 
177e0 74 68 65 20 64 61 74 61 62 61 73 65 20 6e 61 6d  the database nam
177f0 65 2e 0a 2a 2f 0a 53 72 63 4c 69 73 74 20 2a 73  e..*/.SrcList *s
17800 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70 70  qlite3SrcListApp
17810 65 6e 64 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  end(.  sqlite3 *
17820 64 62 2c 20 20 20 20 20 20 20 20 2f 2a 20 43 6f  db,        /* Co
17830 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 6e 6f 74 69  nnection to noti
17840 66 79 20 6f 66 20 6d 61 6c 6c 6f 63 20 66 61 69  fy of malloc fai
17850 6c 75 72 65 73 20 2a 2f 0a 20 20 53 72 63 4c 69  lures */.  SrcLi
17860 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 20 20 2f  st *pList,     /
17870 2a 20 41 70 70 65 6e 64 20 74 6f 20 74 68 69 73  * Append to this
17880 20 53 72 63 4c 69 73 74 2e 20 4e 55 4c 4c 20 63   SrcList. NULL c
17890 72 65 61 74 65 73 20 61 20 6e 65 77 20 53 72 63  reates a new Src
178a0 4c 69 73 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  List */.  Token 
178b0 2a 70 54 61 62 6c 65 2c 20 20 20 20 20 20 2f 2a  *pTable,      /*
178c0 20 54 61 62 6c 65 20 74 6f 20 61 70 70 65 6e 64   Table to append
178d0 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 44 61   */.  Token *pDa
178e0 74 61 62 61 73 65 20 20 20 20 2f 2a 20 44 61 74  tabase    /* Dat
178f0 61 62 61 73 65 20 6f 66 20 74 68 65 20 74 61 62  abase of the tab
17900 6c 65 20 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63  le */.){.  struc
17910 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
17920 70 49 74 65 6d 3b 0a 20 20 69 66 28 20 70 4c 69  pItem;.  if( pLi
17930 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4c 69  st==0 ){.    pLi
17940 73 74 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  st = sqlite3DbMa
17950 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a  llocZero(db, siz
17960 65 6f 66 28 53 72 63 4c 69 73 74 29 20 29 3b 0a  eof(SrcList) );.
17970 20 20 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30      if( pList==0
17980 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20   ) return 0;.   
17990 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20 3d   pList->nAlloc =
179a0 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 4c   1;.  }.  if( pL
179b0 69 73 74 2d 3e 6e 53 72 63 3e 3d 70 4c 69 73 74  ist->nSrc>=pList
179c0 2d 3e 6e 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20  ->nAlloc ){.    
179d0 53 72 63 4c 69 73 74 20 2a 70 4e 65 77 3b 0a 20  SrcList *pNew;. 
179e0 20 20 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63     pList->nAlloc
179f0 20 2a 3d 20 32 3b 0a 20 20 20 20 70 4e 65 77 20   *= 2;.    pNew 
17a00 3d 20 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c  = sqlite3DbReall
17a10 6f 63 28 64 62 2c 20 70 4c 69 73 74 2c 0a 20 20  oc(db, pList,.  
17a20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 69 7a               siz
17a30 65 6f 66 28 2a 70 4c 69 73 74 29 20 2b 20 28 70  eof(*pList) + (p
17a40 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 2d 31 29 2a  List->nAlloc-1)*
17a50 73 69 7a 65 6f 66 28 70 4c 69 73 74 2d 3e 61 5b  sizeof(pList->a[
17a60 30 5d 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70  0]) );.    if( p
17a70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  New==0 ){.      
17a80 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44 65  sqlite3SrcListDe
17a90 6c 65 74 65 28 70 4c 69 73 74 29 3b 0a 20 20 20  lete(pList);.   
17aa0 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20     return 0;.   
17ab0 20 7d 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 70   }.    pList = p
17ac0 4e 65 77 3b 0a 20 20 7d 0a 20 20 70 49 74 65 6d  New;.  }.  pItem
17ad0 20 3d 20 26 70 4c 69 73 74 2d 3e 61 5b 70 4c 69   = &pList->a[pLi
17ae0 73 74 2d 3e 6e 53 72 63 5d 3b 0a 20 20 6d 65 6d  st->nSrc];.  mem
17af0 73 65 74 28 70 49 74 65 6d 2c 20 30 2c 20 73 69  set(pItem, 0, si
17b00 7a 65 6f 66 28 70 4c 69 73 74 2d 3e 61 5b 30 5d  zeof(pList->a[0]
17b10 29 29 3b 0a 20 20 69 66 28 20 70 44 61 74 61 62  ));.  if( pDatab
17b20 61 73 65 20 26 26 20 70 44 61 74 61 62 61 73 65  ase && pDatabase
17b30 2d 3e 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 70 44  ->z==0 ){.    pD
17b40 61 74 61 62 61 73 65 20 3d 20 30 3b 0a 20 20 7d  atabase = 0;.  }
17b50 0a 20 20 69 66 28 20 70 44 61 74 61 62 61 73 65  .  if( pDatabase
17b60 20 26 26 20 70 54 61 62 6c 65 20 29 7b 0a 20 20   && pTable ){.  
17b70 20 20 54 6f 6b 65 6e 20 2a 70 54 65 6d 70 20 3d    Token *pTemp =
17b80 20 70 44 61 74 61 62 61 73 65 3b 0a 20 20 20 20   pDatabase;.    
17b90 70 44 61 74 61 62 61 73 65 20 3d 20 70 54 61 62  pDatabase = pTab
17ba0 6c 65 3b 0a 20 20 20 20 70 54 61 62 6c 65 20 3d  le;.    pTable =
17bb0 20 70 54 65 6d 70 3b 0a 20 20 7d 0a 20 20 70 49   pTemp;.  }.  pI
17bc0 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c  tem->zName = sql
17bd0 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65  ite3NameFromToke
17be0 6e 28 64 62 2c 20 70 54 61 62 6c 65 29 3b 0a 20  n(db, pTable);. 
17bf0 20 70 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73   pItem->zDatabas
17c00 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46  e = sqlite3NameF
17c10 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 44 61  romToken(db, pDa
17c20 74 61 62 61 73 65 29 3b 0a 20 20 70 49 74 65 6d  tabase);.  pItem
17c30 2d 3e 69 43 75 72 73 6f 72 20 3d 20 2d 31 3b 0a  ->iCursor = -1;.
17c40 20 20 70 49 74 65 6d 2d 3e 69 73 50 6f 70 75 6c    pItem->isPopul
17c50 61 74 65 64 20 3d 20 30 3b 0a 20 20 70 4c 69 73  ated = 0;.  pLis
17c60 74 2d 3e 6e 53 72 63 2b 2b 3b 0a 20 20 72 65 74  t->nSrc++;.  ret
17c70 75 72 6e 20 70 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a  urn pList;.}../*
17c80 0a 2a 2a 20 41 73 73 69 67 6e 20 63 75 72 73 6f  .** Assign curso
17c90 72 73 20 74 6f 20 61 6c 6c 20 74 61 62 6c 65 73  rs to all tables
17ca0 20 69 6e 20 61 20 53 72 63 4c 69 73 74 0a 2a 2f   in a SrcList.*/
17cb0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53 72 63  .void sqlite3Src
17cc0 4c 69 73 74 41 73 73 69 67 6e 43 75 72 73 6f 72  ListAssignCursor
17cd0 73 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  s(Parse *pParse,
17ce0 20 53 72 63 4c 69 73 74 20 2a 70 4c 69 73 74 29   SrcList *pList)
17cf0 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72  {.  int i;.  str
17d00 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
17d10 20 2a 70 49 74 65 6d 3b 0a 20 20 61 73 73 65 72   *pItem;.  asser
17d20 74 28 70 4c 69 73 74 20 7c 7c 20 70 50 61 72 73  t(pList || pPars
17d30 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  e->db->mallocFai
17d40 6c 65 64 20 29 3b 0a 20 20 69 66 28 20 70 4c 69  led );.  if( pLi
17d50 73 74 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d  st ){.    for(i=
17d60 30 2c 20 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e  0, pItem=pList->
17d70 61 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 53 72 63  a; i<pList->nSrc
17d80 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b  ; i++, pItem++){
17d90 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65 6d  .      if( pItem
17da0 2d 3e 69 43 75 72 73 6f 72 3e 3d 30 20 29 20 62  ->iCursor>=0 ) b
17db0 72 65 61 6b 3b 0a 20 20 20 20 20 20 70 49 74 65  reak;.      pIte
17dc0 6d 2d 3e 69 43 75 72 73 6f 72 20 3d 20 70 50 61  m->iCursor = pPa
17dd0 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20  rse->nTab++;.   
17de0 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 70 53     if( pItem->pS
17df0 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 20  elect ){.       
17e00 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41   sqlite3SrcListA
17e10 73 73 69 67 6e 43 75 72 73 6f 72 73 28 70 50 61  ssignCursors(pPa
17e20 72 73 65 2c 20 70 49 74 65 6d 2d 3e 70 53 65 6c  rse, pItem->pSel
17e30 65 63 74 2d 3e 70 53 72 63 29 3b 0a 20 20 20 20  ect->pSrc);.    
17e40 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a    }.    }.  }.}.
17e50 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6e  ./*.** Delete an
17e60 20 65 6e 74 69 72 65 20 53 72 63 4c 69 73 74 20   entire SrcList 
17e70 69 6e 63 6c 75 64 69 6e 67 20 61 6c 6c 20 69 74  including all it
17e80 73 20 73 75 62 73 74 72 75 63 74 75 72 65 2e 0a  s substructure..
17e90 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53  */.void sqlite3S
17ea0 72 63 4c 69 73 74 44 65 6c 65 74 65 28 53 72 63  rcListDelete(Src
17eb0 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20  List *pList){.  
17ec0 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20  int i;.  struct 
17ed0 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  SrcList_item *pI
17ee0 74 65 6d 3b 0a 20 20 69 66 28 20 70 4c 69 73 74  tem;.  if( pList
17ef0 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
17f00 66 6f 72 28 70 49 74 65 6d 3d 70 4c 69 73 74 2d  for(pItem=pList-
17f10 3e 61 2c 20 69 3d 30 3b 20 69 3c 70 4c 69 73 74  >a, i=0; i<pList
17f20 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 49 74  ->nSrc; i++, pIt
17f30 65 6d 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74  em++){.    sqlit
17f40 65 33 5f 66 72 65 65 28 70 49 74 65 6d 2d 3e 7a  e3_free(pItem->z
17f50 44 61 74 61 62 61 73 65 29 3b 0a 20 20 20 20 73  Database);.    s
17f60 71 6c 69 74 65 33 5f 66 72 65 65 28 70 49 74 65  qlite3_free(pIte
17f70 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 73  m->zName);.    s
17f80 71 6c 69 74 65 33 5f 66 72 65 65 28 70 49 74 65  qlite3_free(pIte
17f90 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20 20 20 20  m->zAlias);.    
17fa0 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62  sqlite3DeleteTab
17fb0 6c 65 28 70 49 74 65 6d 2d 3e 70 54 61 62 29 3b  le(pItem->pTab);
17fc0 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65  .    sqlite3Sele
17fd0 63 74 44 65 6c 65 74 65 28 70 49 74 65 6d 2d 3e  ctDelete(pItem->
17fe0 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 73 71  pSelect);.    sq
17ff0 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
18000 70 49 74 65 6d 2d 3e 70 4f 6e 29 3b 0a 20 20 20  pItem->pOn);.   
18010 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44 65   sqlite3IdListDe
18020 6c 65 74 65 28 70 49 74 65 6d 2d 3e 70 55 73 69  lete(pItem->pUsi
18030 6e 67 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  ng);.  }.  sqlit
18040 65 33 5f 66 72 65 65 28 70 4c 69 73 74 29 3b 0a  e3_free(pList);.
18050 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
18060 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
18070 62 79 20 74 68 65 20 70 61 72 73 65 72 20 74 6f  by the parser to
18080 20 61 64 64 20 61 20 6e 65 77 20 74 65 72 6d 20   add a new term 
18090 74 6f 20 74 68 65 0a 2a 2a 20 65 6e 64 20 6f 66  to the.** end of
180a0 20 61 20 67 72 6f 77 69 6e 67 20 46 52 4f 4d 20   a growing FROM 
180b0 63 6c 61 75 73 65 2e 20 20 54 68 65 20 22 70 22  clause.  The "p"
180c0 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 74 68   parameter is th
180d0 65 20 70 61 72 74 20 6f 66 0a 2a 2a 20 74 68 65  e part of.** the
180e0 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 68 61   FROM clause tha
180f0 74 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  t has already be
18100 65 6e 20 63 6f 6e 73 74 72 75 63 74 65 64 2e 20  en constructed. 
18110 20 22 70 22 20 69 73 20 4e 55 4c 4c 0a 2a 2a 20   "p" is NULL.** 
18120 69 66 20 74 68 69 73 20 69 73 20 74 68 65 20 66  if this is the f
18130 69 72 73 74 20 74 65 72 6d 20 6f 66 20 74 68 65  irst term of the
18140 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20 70   FROM clause.  p
18150 54 61 62 6c 65 20 61 6e 64 20 70 44 61 74 61 62  Table and pDatab
18160 61 73 65 0a 2a 2a 20 61 72 65 20 74 68 65 20 6e  ase.** are the n
18170 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65  ame of the table
18180 20 61 6e 64 20 64 61 74 61 62 61 73 65 20 6e 61   and database na
18190 6d 65 64 20 69 6e 20 74 68 65 20 46 52 4f 4d 20  med in the FROM 
181a0 63 6c 61 75 73 65 20 74 65 72 6d 2e 0a 2a 2a 20  clause term..** 
181b0 70 44 61 74 61 62 61 73 65 20 69 73 20 4e 55 4c  pDatabase is NUL
181c0 4c 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73  L if the databas
181d0 65 20 6e 61 6d 65 20 71 75 61 6c 69 66 69 65 72  e name qualifier
181e0 20 69 73 20 6d 69 73 73 69 6e 67 20 2d 20 74 68   is missing - th
181f0 65 0a 2a 2a 20 75 73 75 61 6c 20 63 61 73 65 2e  e.** usual case.
18200 20 20 49 66 20 74 68 65 20 74 65 72 6d 20 68 61    If the term ha
18210 73 20 61 20 61 6c 69 61 73 2c 20 74 68 65 6e 20  s a alias, then 
18220 70 41 6c 69 61 73 20 70 6f 69 6e 74 73 20 74 6f  pAlias points to
18230 20 74 68 65 0a 2a 2a 20 61 6c 69 61 73 20 74 6f   the.** alias to
18240 6b 65 6e 2e 20 20 49 66 20 74 68 65 20 74 65 72  ken.  If the ter
18250 6d 20 69 73 20 61 20 73 75 62 71 75 65 72 79 2c  m is a subquery,
18260 20 74 68 65 6e 20 70 53 75 62 71 75 65 72 79 20   then pSubquery 
18270 69 73 20 74 68 65 0a 2a 2a 20 53 45 4c 45 43 54  is the.** SELECT
18280 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20   statement that 
18290 74 68 65 20 73 75 62 71 75 65 72 79 20 65 6e 63  the subquery enc
182a0 6f 64 65 73 2e 20 20 54 68 65 20 70 54 61 62 6c  odes.  The pTabl
182b0 65 20 61 6e 64 0a 2a 2a 20 70 44 61 74 61 62 61  e and.** pDataba
182c0 73 65 20 70 61 72 61 6d 65 74 65 72 73 20 61 72  se parameters ar
182d0 65 20 4e 55 4c 4c 20 66 6f 72 20 73 75 62 71 75  e NULL for subqu
182e0 65 72 69 65 73 2e 20 20 54 68 65 20 70 4f 6e 20  eries.  The pOn 
182f0 61 6e 64 20 70 55 73 69 6e 67 0a 2a 2a 20 70 61  and pUsing.** pa
18300 72 61 6d 65 74 65 72 73 20 61 72 65 20 74 68 65  rameters are the
18310 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20   content of the 
18320 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 63 6c 61  ON and USING cla
18330 75 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  uses..**.** Retu
18340 72 6e 20 61 20 6e 65 77 20 53 72 63 4c 69 73 74  rn a new SrcList
18350 20 77 68 69 63 68 20 65 6e 63 6f 64 65 73 20 69   which encodes i
18360 73 20 74 68 65 20 46 52 4f 4d 20 77 69 74 68 20  s the FROM with 
18370 74 68 65 20 6e 65 77 0a 2a 2a 20 74 65 72 6d 20  the new.** term 
18380 61 64 64 65 64 2e 0a 2a 2f 0a 53 72 63 4c 69 73  added..*/.SrcLis
18390 74 20 2a 73 71 6c 69 74 65 33 53 72 63 4c 69 73  t *sqlite3SrcLis
183a0 74 41 70 70 65 6e 64 46 72 6f 6d 54 65 72 6d 28  tAppendFromTerm(
183b0 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
183c0 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61  ,          /* Pa
183d0 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
183e0 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 2c 20 20  .  SrcList *p,  
183f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
18400 65 20 6c 65 66 74 20 70 61 72 74 20 6f 66 20 74  e left part of t
18410 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 61  he FROM clause a
18420 6c 72 65 61 64 79 20 73 65 65 6e 20 2a 2f 0a 20  lready seen */. 
18430 20 54 6f 6b 65 6e 20 2a 70 54 61 62 6c 65 2c 20   Token *pTable, 
18440 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
18450 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74 6f   of the table to
18460 20 61 64 64 20 74 6f 20 74 68 65 20 46 52 4f 4d   add to the FROM
18470 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 54 6f 6b   clause */.  Tok
18480 65 6e 20 2a 70 44 61 74 61 62 61 73 65 2c 20 20  en *pDatabase,  
18490 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
184a0 74 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e  the database con
184b0 74 61 69 6e 69 6e 67 20 70 54 61 62 6c 65 20 2a  taining pTable *
184c0 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 41 6c 69 61  /.  Token *pAlia
184d0 73 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  s,          /* T
184e0 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69  he right-hand si
184f0 64 65 20 6f 66 20 74 68 65 20 41 53 20 73 75 62  de of the AS sub
18500 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20  expression */.  
18510 53 65 6c 65 63 74 20 2a 70 53 75 62 71 75 65 72  Select *pSubquer
18520 79 2c 20 20 20 20 20 20 2f 2a 20 41 20 73 75 62  y,      /* A sub
18530 71 75 65 72 79 20 75 73 65 64 20 69 6e 20 70 6c  query used in pl
18540 61 63 65 20 6f 66 20 61 20 74 61 62 6c 65 20 6e  ace of a table n
18550 61 6d 65 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  ame */.  Expr *p
18560 4f 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  On,             
18570 20 2f 2a 20 54 68 65 20 4f 4e 20 63 6c 61 75 73   /* The ON claus
18580 65 20 6f 66 20 61 20 6a 6f 69 6e 20 2a 2f 0a 20  e of a join */. 
18590 20 49 64 4c 69 73 74 20 2a 70 55 73 69 6e 67 20   IdList *pUsing 
185a0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
185b0 55 53 49 4e 47 20 63 6c 61 75 73 65 20 6f 66 20  USING clause of 
185c0 61 20 6a 6f 69 6e 20 2a 2f 0a 29 7b 0a 20 20 73  a join */.){.  s
185d0 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
185e0 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 73 71 6c  em *pItem;.  sql
185f0 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
18600 65 2d 3e 64 62 3b 0a 20 20 70 20 3d 20 73 71 6c  e->db;.  p = sql
18610 69 74 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e  ite3SrcListAppen
18620 64 28 64 62 2c 20 70 2c 20 70 54 61 62 6c 65 2c  d(db, p, pTable,
18630 20 70 44 61 74 61 62 61 73 65 29 3b 0a 20 20 69   pDatabase);.  i
18640 66 28 20 70 3d 3d 30 20 7c 7c 20 70 2d 3e 6e 53  f( p==0 || p->nS
18650 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  rc==0 ){.    sql
18660 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 70  ite3ExprDelete(p
18670 4f 6e 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  On);.    sqlite3
18680 49 64 4c 69 73 74 44 65 6c 65 74 65 28 70 55 73  IdListDelete(pUs
18690 69 6e 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ing);.    sqlite
186a0 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 70 53  3SelectDelete(pS
186b0 75 62 71 75 65 72 79 29 3b 0a 20 20 20 20 72 65  ubquery);.    re
186c0 74 75 72 6e 20 70 3b 0a 20 20 7d 0a 20 20 70 49  turn p;.  }.  pI
186d0 74 65 6d 20 3d 20 26 70 2d 3e 61 5b 70 2d 3e 6e  tem = &p->a[p->n
186e0 53 72 63 2d 31 5d 3b 0a 20 20 69 66 28 20 70 41  Src-1];.  if( pA
186f0 6c 69 61 73 20 26 26 20 70 41 6c 69 61 73 2d 3e  lias && pAlias->
18700 6e 20 29 7b 0a 20 20 20 20 70 49 74 65 6d 2d 3e  n ){.    pItem->
18710 7a 41 6c 69 61 73 20 3d 20 73 71 6c 69 74 65 33  zAlias = sqlite3
18720 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62  NameFromToken(db
18730 2c 20 70 41 6c 69 61 73 29 3b 0a 20 20 7d 0a 20  , pAlias);.  }. 
18740 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 20   pItem->pSelect 
18750 3d 20 70 53 75 62 71 75 65 72 79 3b 0a 20 20 70  = pSubquery;.  p
18760 49 74 65 6d 2d 3e 70 4f 6e 20 3d 20 70 4f 6e 3b  Item->pOn = pOn;
18770 0a 20 20 70 49 74 65 6d 2d 3e 70 55 73 69 6e 67  .  pItem->pUsing
18780 20 3d 20 70 55 73 69 6e 67 3b 0a 20 20 72 65 74   = pUsing;.  ret
18790 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn p;.}../*.** 
187a0 57 68 65 6e 20 62 75 69 6c 64 69 6e 67 20 75 70  When building up
187b0 20 61 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69   a FROM clause i
187c0 6e 20 74 68 65 20 70 61 72 73 65 72 2c 20 74 68  n the parser, th
187d0 65 20 6a 6f 69 6e 20 6f 70 65 72 61 74 6f 72 0a  e join operator.
187e0 2a 2a 20 69 73 20 69 6e 69 74 69 61 6c 6c 79 20  ** is initially 
187f0 61 74 74 61 63 68 65 64 20 74 6f 20 74 68 65 20  attached to the 
18800 6c 65 66 74 20 6f 70 65 72 61 6e 64 2e 20 20 42  left operand.  B
18810 75 74 20 74 68 65 20 63 6f 64 65 20 67 65 6e 65  ut the code gene
18820 72 61 74 6f 72 0a 2a 2a 20 65 78 70 65 63 74 73  rator.** expects
18830 20 74 68 65 20 6a 6f 69 6e 20 6f 70 65 72 61 74   the join operat
18840 6f 72 20 74 6f 20 62 65 20 6f 6e 20 74 68 65 20  or to be on the 
18850 72 69 67 68 74 20 6f 70 65 72 61 6e 64 2e 20 20  right operand.  
18860 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  This routine.** 
18870 53 68 69 66 74 73 20 61 6c 6c 20 6a 6f 69 6e 20  Shifts all join 
18880 6f 70 65 72 61 74 6f 72 73 20 66 72 6f 6d 20 6c  operators from l
18890 65 66 74 20 74 6f 20 72 69 67 68 74 20 66 6f 72  eft to right for
188a0 20 61 6e 20 65 6e 74 69 72 65 20 46 52 4f 4d 0a   an entire FROM.
188b0 2a 2a 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a  ** clause..**.**
188c0 20 45 78 61 6d 70 6c 65 3a 20 53 75 70 70 6f 73   Example: Suppos
188d0 65 20 74 68 65 20 6a 6f 69 6e 20 69 73 20 6c 69  e the join is li
188e0 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20  ke this:.**.**  
188f0 20 20 20 20 20 20 20 20 20 41 20 6e 61 74 75 72           A natur
18900 61 6c 20 63 72 6f 73 73 20 6a 6f 69 6e 20 42 0a  al cross join B.
18910 2a 2a 0a 2a 2a 20 54 68 65 20 6f 70 65 72 61 74  **.** The operat
18920 6f 72 20 69 73 20 22 6e 61 74 75 72 61 6c 20 63  or is "natural c
18930 72 6f 73 73 20 6a 6f 69 6e 22 2e 20 20 54 68 65  ross join".  The
18940 20 41 20 61 6e 64 20 42 20 6f 70 65 72 61 6e 64   A and B operand
18950 73 20 61 72 65 20 73 74 6f 72 65 64 0a 2a 2a 20  s are stored.** 
18960 69 6e 20 70 2d 3e 61 5b 30 5d 20 61 6e 64 20 70  in p->a[0] and p
18970 2d 3e 61 5b 31 5d 2c 20 72 65 73 70 65 63 74 69  ->a[1], respecti
18980 76 65 6c 79 2e 20 20 54 68 65 20 70 61 72 73 65  vely.  The parse
18990 72 20 69 6e 69 74 69 61 6c 6c 79 20 73 74 6f 72  r initially stor
189a0 65 73 20 74 68 65 0a 2a 2a 20 6f 70 65 72 61 74  es the.** operat
189b0 6f 72 20 77 69 74 68 20 41 2e 20 20 54 68 69 73  or with A.  This
189c0 20 72 6f 75 74 69 6e 65 20 73 68 69 66 74 73 20   routine shifts 
189d0 74 68 61 74 20 6f 70 65 72 61 74 6f 72 20 6f 76  that operator ov
189e0 65 72 20 74 6f 20 42 2e 0a 2a 2f 0a 76 6f 69 64  er to B..*/.void
189f0 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 53   sqlite3SrcListS
18a00 68 69 66 74 4a 6f 69 6e 54 79 70 65 28 53 72 63  hiftJoinType(Src
18a10 4c 69 73 74 20 2a 70 29 7b 0a 20 20 69 66 28 20  List *p){.  if( 
18a20 70 20 26 26 20 70 2d 3e 61 20 29 7b 0a 20 20 20  p && p->a ){.   
18a30 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28   int i;.    for(
18a40 69 3d 70 2d 3e 6e 53 72 63 2d 31 3b 20 69 3e 30  i=p->nSrc-1; i>0
18a50 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 20 20 70 2d  ; i--){.      p-
18a60 3e 61 5b 69 5d 2e 6a 6f 69 6e 74 79 70 65 20 3d  >a[i].jointype =
18a70 20 70 2d 3e 61 5b 69 2d 31 5d 2e 6a 6f 69 6e 74   p->a[i-1].joint
18a80 79 70 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  ype;.    }.    p
18a90 2d 3e 61 5b 30 5d 2e 6a 6f 69 6e 74 79 70 65 20  ->a[0].jointype 
18aa0 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  = 0;.  }.}../*.*
18ab0 2a 20 42 65 67 69 6e 20 61 20 74 72 61 6e 73 61  * Begin a transa
18ac0 63 74 69 6f 6e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ction.*/.void sq
18ad0 6c 69 74 65 33 42 65 67 69 6e 54 72 61 6e 73 61  lite3BeginTransa
18ae0 63 74 69 6f 6e 28 50 61 72 73 65 20 2a 70 50 61  ction(Parse *pPa
18af0 72 73 65 2c 20 69 6e 74 20 74 79 70 65 29 7b 0a  rse, int type){.
18b00 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
18b10 20 56 64 62 65 20 2a 76 3b 0a 20 20 69 6e 74 20   Vdbe *v;.  int 
18b20 69 3b 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65  i;..  if( pParse
18b30 3d 3d 30 20 7c 7c 20 28 64 62 3d 70 50 61 72 73  ==0 || (db=pPars
18b40 65 2d 3e 64 62 29 3d 3d 30 20 7c 7c 20 64 62 2d  e->db)==0 || db-
18b50 3e 61 44 62 5b 30 5d 2e 70 42 74 3d 3d 30 20 29  >aDb[0].pBt==0 )
18b60 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70   return;.  if( p
18b70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 64  Parse->nErr || d
18b80 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
18b90 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
18ba0 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b  sqlite3AuthCheck
18bb0 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f  (pParse, SQLITE_
18bc0 54 52 41 4e 53 41 43 54 49 4f 4e 2c 20 22 42 45  TRANSACTION, "BE
18bd0 47 49 4e 22 2c 20 30 2c 20 30 29 20 29 20 72 65  GIN", 0, 0) ) re
18be0 74 75 72 6e 3b 0a 0a 20 20 76 20 3d 20 73 71 6c  turn;..  v = sql
18bf0 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
18c00 73 65 29 3b 0a 20 20 69 66 28 20 21 76 20 29 20  se);.  if( !v ) 
18c10 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 74 79  return;.  if( ty
18c20 70 65 21 3d 54 4b 5f 44 45 46 45 52 52 45 44 20  pe!=TK_DEFERRED 
18c30 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  ){.    for(i=0; 
18c40 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b  i<db->nDb; i++){
18c50 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
18c60 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 54  beAddOp2(v, OP_T
18c70 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69 2c 20 28  ransaction, i, (
18c80 74 79 70 65 3d 3d 54 4b 5f 45 58 43 4c 55 53 49  type==TK_EXCLUSI
18c90 56 45 29 2b 31 29 3b 0a 20 20 20 20 20 20 73 71  VE)+1);.      sq
18ca0 6c 69 74 65 33 56 64 62 65 55 73 65 73 42 74 72  lite3VdbeUsesBtr
18cb0 65 65 28 76 2c 20 69 29 3b 0a 20 20 20 20 7d 0a  ee(v, i);.    }.
18cc0 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62    }.  sqlite3Vdb
18cd0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41 75  eAddOp2(v, OP_Au
18ce0 74 6f 43 6f 6d 6d 69 74 2c 20 30 2c 20 30 29 3b  toCommit, 0, 0);
18cf0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74  .}../*.** Commit
18d00 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a   a transaction.*
18d10 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 6f  /.void sqlite3Co
18d20 6d 6d 69 74 54 72 61 6e 73 61 63 74 69 6f 6e 28  mmitTransaction(
18d30 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a  Parse *pParse){.
18d40 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
18d50 20 56 64 62 65 20 2a 76 3b 0a 0a 20 20 69 66 28   Vdbe *v;..  if(
18d60 20 70 50 61 72 73 65 3d 3d 30 20 7c 7c 20 28 64   pParse==0 || (d
18d70 62 3d 70 50 61 72 73 65 2d 3e 64 62 29 3d 3d 30  b=pParse->db)==0
18d80 20 7c 7c 20 64 62 2d 3e 61 44 62 5b 30 5d 2e 70   || db->aDb[0].p
18d90 42 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  Bt==0 ) return;.
18da0 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45    if( pParse->nE
18db0 72 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63  rr || db->malloc
18dc0 46 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b  Failed ) return;
18dd0 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75  .  if( sqlite3Au
18de0 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  thCheck(pParse, 
18df0 53 51 4c 49 54 45 5f 54 52 41 4e 53 41 43 54 49  SQLITE_TRANSACTI
18e00 4f 4e 2c 20 22 43 4f 4d 4d 49 54 22 2c 20 30 2c  ON, "COMMIT", 0,
18e10 20 30 29 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20   0) ) return;.. 
18e20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56   v = sqlite3GetV
18e30 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69  dbe(pParse);.  i
18e40 66 28 20 76 20 29 7b 0a 20 20 20 20 73 71 6c 69  f( v ){.    sqli
18e50 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
18e60 20 4f 50 5f 41 75 74 6f 43 6f 6d 6d 69 74 2c 20   OP_AutoCommit, 
18e70 31 2c 20 30 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  1, 0);.  }.}../*
18e80 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 61 20 74  .** Rollback a t
18e90 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2f 0a 76 6f  ransaction.*/.vo
18ea0 69 64 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61  id sqlite3Rollba
18eb0 63 6b 54 72 61 6e 73 61 63 74 69 6f 6e 28 50 61  ckTransaction(Pa
18ec0 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20  rse *pParse){.  
18ed0 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 56  sqlite3 *db;.  V
18ee0 64 62 65 20 2a 76 3b 0a 0a 20 20 69 66 28 20 70  dbe *v;..  if( p
18ef0 50 61 72 73 65 3d 3d 30 20 7c 7c 20 28 64 62 3d  Parse==0 || (db=
18f00 70 50 61 72 73 65 2d 3e 64 62 29 3d 3d 30 20 7c  pParse->db)==0 |
18f10 7c 20 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74  | db->aDb[0].pBt
18f20 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
18f30 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  if( pParse->nErr
18f40 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   || db->mallocFa
18f50 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20  iled ) return;. 
18f60 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68   if( sqlite3Auth
18f70 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51  Check(pParse, SQ
18f80 4c 49 54 45 5f 54 52 41 4e 53 41 43 54 49 4f 4e  LITE_TRANSACTION
18f90 2c 20 22 52 4f 4c 4c 42 41 43 4b 22 2c 20 30 2c  , "ROLLBACK", 0,
18fa0 20 30 29 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20   0) ) return;.. 
18fb0 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56   v = sqlite3GetV
18fc0 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69  dbe(pParse);.  i
18fd0 66 28 20 76 20 29 7b 0a 20 20 20 20 73 71 6c 69  f( v ){.    sqli
18fe0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
18ff0 20 4f 50 5f 41 75 74 6f 43 6f 6d 6d 69 74 2c 20   OP_AutoCommit, 
19000 31 2c 20 31 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  1, 1);.  }.}../*
19010 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68  .** Make sure th
19020 65 20 54 45 4d 50 20 64 61 74 61 62 61 73 65 20  e TEMP database 
19030 69 73 20 6f 70 65 6e 20 61 6e 64 20 61 76 61 69  is open and avai
19040 6c 61 62 6c 65 20 66 6f 72 20 75 73 65 2e 20 20  lable for use.  
19050 52 65 74 75 72 6e 0a 2a 2a 20 74 68 65 20 6e 75  Return.** the nu
19060 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73 2e 20  mber of errors. 
19070 20 4c 65 61 76 65 20 61 6e 79 20 65 72 72 6f 72   Leave any error
19080 20 6d 65 73 73 61 67 65 73 20 69 6e 20 74 68 65   messages in the
19090 20 70 50 61 72 73 65 20 73 74 72 75 63 74 75 72   pParse structur
190a0 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
190b0 33 4f 70 65 6e 54 65 6d 70 44 61 74 61 62 61 73  3OpenTempDatabas
190c0 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29  e(Parse *pParse)
190d0 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  {.  sqlite3 *db 
190e0 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
190f0 69 66 28 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 70  if( db->aDb[1].p
19100 42 74 3d 3d 30 20 26 26 20 21 70 50 61 72 73 65  Bt==0 && !pParse
19110 2d 3e 65 78 70 6c 61 69 6e 20 29 7b 0a 20 20 20  ->explain ){.   
19120 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 73 74 61   int rc;.    sta
19130 74 69 63 20 63 6f 6e 73 74 20 69 6e 74 20 66 6c  tic const int fl
19140 61 67 73 20 3d 20 0a 20 20 20 20 20 20 20 20 20  ags = .         
19150 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
19160 44 57 52 49 54 45 20 7c 0a 20 20 20 20 20 20 20  DWRITE |.       
19170 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43     SQLITE_OPEN_C
19180 52 45 41 54 45 20 7c 0a 20 20 20 20 20 20 20 20  REATE |.        
19190 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58    SQLITE_OPEN_EX
191a0 43 4c 55 53 49 56 45 20 7c 0a 20 20 20 20 20 20  CLUSIVE |.      
191b0 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f      SQLITE_OPEN_
191c0 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 20 7c 0a  DELETEONCLOSE |.
191d0 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
191e0 5f 4f 50 45 4e 5f 54 45 4d 50 5f 44 42 3b 0a 0a  _OPEN_TEMP_DB;..
191f0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
19200 42 74 72 65 65 46 61 63 74 6f 72 79 28 64 62 2c  BtreeFactory(db,
19210 20 30 2c 20 30 2c 20 53 51 4c 49 54 45 5f 44 45   0, 0, SQLITE_DE
19220 46 41 55 4c 54 5f 43 41 43 48 45 5f 53 49 5a 45  FAULT_CACHE_SIZE
19230 2c 20 66 6c 61 67 73 2c 0a 20 20 20 20 20 20 20  , flags,.       
19240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19250 20 20 20 20 20 20 20 20 20 20 26 64 62 2d 3e 61            &db->a
19260 44 62 5b 31 5d 2e 70 42 74 29 3b 0a 20 20 20 20  Db[1].pBt);.    
19270 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
19280 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  K ){.      sqlit
19290 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
192a0 65 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20 6f 70  e, "unable to op
192b0 65 6e 20 61 20 74 65 6d 70 6f 72 61 72 79 20 64  en a temporary d
192c0 61 74 61 62 61 73 65 20 22 0a 20 20 20 20 20 20  atabase ".      
192d0 20 20 22 66 69 6c 65 20 66 6f 72 20 73 74 6f 72    "file for stor
192e0 69 6e 67 20 74 65 6d 70 6f 72 61 72 79 20 74 61  ing temporary ta
192f0 62 6c 65 73 22 29 3b 0a 20 20 20 20 20 20 70 50  bles");.      pP
19300 61 72 73 65 2d 3e 72 63 20 3d 20 72 63 3b 0a 20  arse->rc = rc;. 
19310 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
19320 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
19330 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51   (db->flags & SQ
19340 4c 49 54 45 5f 49 6e 54 72 61 6e 73 29 3d 3d 30  LITE_InTrans)==0
19350 20 7c 7c 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d   || db->autoComm
19360 69 74 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  it );.    assert
19370 28 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 53 63  ( db->aDb[1].pSc
19380 68 65 6d 61 20 29 3b 0a 20 20 7d 0a 20 20 72 65  hema );.  }.  re
19390 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
193a0 20 47 65 6e 65 72 61 74 65 20 56 44 42 45 20 63   Generate VDBE c
193b0 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 76 65  ode that will ve
193c0 72 69 66 79 20 74 68 65 20 73 63 68 65 6d 61 20  rify the schema 
193d0 63 6f 6f 6b 69 65 20 61 6e 64 20 73 74 61 72 74  cookie and start
193e0 0a 2a 2a 20 61 20 72 65 61 64 2d 74 72 61 6e 73  .** a read-trans
193f0 61 63 74 69 6f 6e 20 66 6f 72 20 61 6c 6c 20 6e  action for all n
19400 61 6d 65 64 20 64 61 74 61 62 61 73 65 20 66 69  amed database fi
19410 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73  les..**.** It is
19420 20 69 6d 70 6f 72 74 61 6e 74 20 74 68 61 74 20   important that 
19430 61 6c 6c 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69  all schema cooki
19440 65 73 20 62 65 20 76 65 72 69 66 69 65 64 20 61  es be verified a
19450 6e 64 20 61 6c 6c 0a 2a 2a 20 72 65 61 64 20 74  nd all.** read t
19460 72 61 6e 73 61 63 74 69 6f 6e 73 20 62 65 20 73  ransactions be s
19470 74 61 72 74 65 64 20 62 65 66 6f 72 65 20 61 6e  tarted before an
19480 79 74 68 69 6e 67 20 65 6c 73 65 20 68 61 70 70  ything else happ
19490 65 6e 73 20 69 6e 0a 2a 2a 20 74 68 65 20 56 44  ens in.** the VD
194a0 42 45 20 70 72 6f 67 72 61 6d 2e 20 20 42 75 74  BE program.  But
194b0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 63 61   this routine ca
194c0 6e 20 62 65 20 63 61 6c 6c 65 64 20 61 66 74 65  n be called afte
194d0 72 20 6d 75 63 68 20 6f 74 68 65 72 0a 2a 2a 20  r much other.** 
194e0 63 6f 64 65 20 68 61 73 20 62 65 65 6e 20 67 65  code has been ge
194f0 6e 65 72 61 74 65 64 2e 20 20 53 6f 20 68 65 72  nerated.  So her
19500 65 20 69 73 20 77 68 61 74 20 77 65 20 64 6f 3a  e is what we do:
19510 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74  .**.** The first
19520 20 74 69 6d 65 20 74 68 69 73 20 72 6f 75 74 69   time this routi
19530 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 77 65  ne is called, we
19540 20 63 6f 64 65 20 61 6e 20 4f 50 5f 47 6f 74 6f   code an OP_Goto
19550 20 74 68 61 74 0a 2a 2a 20 77 69 6c 6c 20 6a 75   that.** will ju
19560 6d 70 20 74 6f 20 61 20 73 75 62 72 6f 75 74 69  mp to a subrouti
19570 6e 65 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66  ne at the end of
19580 20 74 68 65 20 70 72 6f 67 72 61 6d 2e 20 20 54   the program.  T
19590 68 65 6e 20 77 65 0a 2a 2a 20 72 65 63 6f 72 64  hen we.** record
195a0 20 65 76 65 72 79 20 64 61 74 61 62 61 73 65 20   every database 
195b0 74 68 61 74 20 6e 65 65 64 73 20 69 74 73 20 73  that needs its s
195c0 63 68 65 6d 61 20 76 65 72 69 66 69 65 64 20 69  chema verified i
195d0 6e 20 74 68 65 0a 2a 2a 20 70 50 61 72 73 65 2d  n the.** pParse-
195e0 3e 63 6f 6f 6b 69 65 4d 61 73 6b 20 66 69 65 6c  >cookieMask fiel
195f0 64 2e 20 20 4c 61 74 65 72 2c 20 61 66 74 65 72  d.  Later, after
19600 20 61 6c 6c 20 6f 74 68 65 72 20 63 6f 64 65 20   all other code 
19610 68 61 73 20 62 65 65 6e 0a 2a 2a 20 67 65 6e 65  has been.** gene
19620 72 61 74 65 64 2c 20 74 68 65 20 73 75 62 72 6f  rated, the subro
19630 75 74 69 6e 65 20 74 68 61 74 20 64 6f 65 73 20  utine that does 
19640 74 68 65 20 63 6f 6f 6b 69 65 20 76 65 72 69 66  the cookie verif
19650 69 63 61 74 69 6f 6e 73 20 61 6e 64 0a 2a 2a 20  ications and.** 
19660 73 74 61 72 74 73 20 74 68 65 20 74 72 61 6e 73  starts the trans
19670 61 63 74 69 6f 6e 73 20 77 69 6c 6c 20 62 65 20  actions will be 
19680 63 6f 64 65 64 20 61 6e 64 20 74 68 65 20 4f 50  coded and the OP
19690 5f 47 6f 74 6f 20 50 32 20 76 61 6c 75 65 0a 2a  _Goto P2 value.*
196a0 2a 20 77 69 6c 6c 20 62 65 20 6d 61 64 65 20 74  * will be made t
196b0 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 61 74 20  o point to that 
196c0 73 75 62 72 6f 75 74 69 6e 65 2e 20 20 54 68 65  subroutine.  The
196d0 20 67 65 6e 65 72 61 74 69 6f 6e 20 6f 66 20 74   generation of t
196e0 68 65 0a 2a 2a 20 63 6f 6f 6b 69 65 20 76 65 72  he.** cookie ver
196f0 69 66 69 63 61 74 69 6f 6e 20 73 75 62 72 6f 75  ification subrou
19700 74 69 6e 65 20 63 6f 64 65 20 68 61 70 70 65 6e  tine code happen
19710 73 20 69 6e 20 73 71 6c 69 74 65 33 46 69 6e 69  s in sqlite3Fini
19720 73 68 43 6f 64 69 6e 67 28 29 2e 0a 2a 2a 0a 2a  shCoding()..**.*
19730 2a 20 49 66 20 69 44 62 3c 30 20 74 68 65 6e 20  * If iDb<0 then 
19740 63 6f 64 65 20 74 68 65 20 4f 50 5f 47 6f 74 6f  code the OP_Goto
19750 20 6f 6e 6c 79 20 2d 20 64 6f 6e 27 74 20 73 65   only - don't se
19760 74 20 66 6c 61 67 20 74 6f 20 76 65 72 69 66 79  t flag to verify
19770 20 74 68 65 0a 2a 2a 20 73 63 68 65 6d 61 20 6f   the.** schema o
19780 6e 20 61 6e 79 20 64 61 74 61 62 61 73 65 73 2e  n any databases.
19790 20 20 54 68 69 73 20 63 61 6e 20 62 65 20 75 73    This can be us
197a0 65 64 20 74 6f 20 70 6f 73 69 74 69 6f 6e 20 74  ed to position t
197b0 68 65 20 4f 50 5f 47 6f 74 6f 0a 2a 2a 20 65 61  he OP_Goto.** ea
197c0 72 6c 79 20 69 6e 20 74 68 65 20 63 6f 64 65 2c  rly in the code,
197d0 20 62 65 66 6f 72 65 20 77 65 20 6b 6e 6f 77 20   before we know 
197e0 69 66 20 61 6e 79 20 64 61 74 61 62 61 73 65 20  if any database 
197f0 74 61 62 6c 65 73 20 77 69 6c 6c 20 62 65 20 75  tables will be u
19800 73 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  sed..*/.void sql
19810 69 74 65 33 43 6f 64 65 56 65 72 69 66 79 53 63  ite3CodeVerifySc
19820 68 65 6d 61 28 50 61 72 73 65 20 2a 70 50 61 72  hema(Parse *pPar
19830 73 65 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20 20  se, int iDb){.  
19840 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 56  sqlite3 *db;.  V
19850 64 62 65 20 2a 76 3b 0a 20 20 69 6e 74 20 6d 61  dbe *v;.  int ma
19860 73 6b 3b 0a 0a 20 20 76 20 3d 20 73 71 6c 69 74  sk;..  v = sqlit
19870 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
19880 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20  );.  if( v==0 ) 
19890 72 65 74 75 72 6e 3b 20 20 2f 2a 20 54 68 69 73  return;  /* This
198a0 20 6f 6e 6c 79 20 68 61 70 70 65 6e 73 20 69 66   only happens if
198b0 20 74 68 65 72 65 20 77 61 73 20 61 20 70 72 69   there was a pri
198c0 6f 72 20 65 72 72 6f 72 20 2a 2f 0a 20 20 64 62  or error */.  db
198d0 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
198e0 20 69 66 28 20 70 50 61 72 73 65 2d 3e 63 6f 6f   if( pParse->coo
198f0 6b 69 65 47 6f 74 6f 3d 3d 30 20 29 7b 0a 20 20  kieGoto==0 ){.  
19900 20 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65    pParse->cookie
19910 47 6f 74 6f 20 3d 20 73 71 6c 69 74 65 33 56 64  Goto = sqlite3Vd
19920 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47  beAddOp2(v, OP_G
19930 6f 74 6f 2c 20 30 2c 20 30 29 2b 31 3b 0a 20 20  oto, 0, 0)+1;.  
19940 7d 0a 20 20 69 66 28 20 69 44 62 3e 3d 30 20 29  }.  if( iDb>=0 )
19950 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 44  {.    assert( iD
19960 62 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 20  b<db->nDb );.   
19970 20 61 73 73 65 72 74 28 20 64 62 2d 3e 61 44 62   assert( db->aDb
19980 5b 69 44 62 5d 2e 70 42 74 21 3d 30 20 7c 7c 20  [iDb].pBt!=0 || 
19990 69 44 62 3d 3d 31 20 29 3b 0a 20 20 20 20 61 73  iDb==1 );.    as
199a0 73 65 72 74 28 20 69 44 62 3c 53 51 4c 49 54 45  sert( iDb<SQLITE
199b0 5f 4d 41 58 5f 41 54 54 41 43 48 45 44 2b 32 20  _MAX_ATTACHED+2 
199c0 29 3b 0a 20 20 20 20 6d 61 73 6b 20 3d 20 31 3c  );.    mask = 1<
199d0 3c 69 44 62 3b 0a 20 20 20 20 69 66 28 20 28 70  <iDb;.    if( (p
199e0 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 4d 61 73  Parse->cookieMas
199f0 6b 20 26 20 6d 61 73 6b 29 3d 3d 30 20 29 7b 0a  k & mask)==0 ){.
19a00 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 63 6f        pParse->co
19a10 6f 6b 69 65 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b  okieMask |= mask
19a20 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  ;.      pParse->
19a30 63 6f 6f 6b 69 65 56 61 6c 75 65 5b 69 44 62 5d  cookieValue[iDb]
19a40 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e   = db->aDb[iDb].
19a50 70 53 63 68 65 6d 61 2d 3e 73 63 68 65 6d 61 5f  pSchema->schema_
19a60 63 6f 6f 6b 69 65 3b 0a 20 20 20 20 20 20 69 66  cookie;.      if
19a70 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26  ( !OMIT_TEMPDB &
19a80 26 20 69 44 62 3d 3d 31 20 29 7b 0a 20 20 20 20  & iDb==1 ){.    
19a90 20 20 20 20 73 71 6c 69 74 65 33 4f 70 65 6e 54      sqlite3OpenT
19aa0 65 6d 70 44 61 74 61 62 61 73 65 28 70 50 61 72  empDatabase(pPar
19ab0 73 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  se);.      }.   
19ac0 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
19ad0 47 65 6e 65 72 61 74 65 20 56 44 42 45 20 63 6f  Generate VDBE co
19ae0 64 65 20 74 68 61 74 20 70 72 65 70 61 72 65 73  de that prepares
19af0 20 66 6f 72 20 64 6f 69 6e 67 20 61 6e 20 6f 70   for doing an op
19b00 65 72 61 74 69 6f 6e 20 74 68 61 74 0a 2a 2a 20  eration that.** 
19b10 6d 69 67 68 74 20 63 68 61 6e 67 65 20 74 68 65  might change the
19b20 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a   database..**.**
19b30 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 74   This routine st
19b40 61 72 74 73 20 61 20 6e 65 77 20 74 72 61 6e 73  arts a new trans
19b50 61 63 74 69 6f 6e 20 69 66 20 77 65 20 61 72 65  action if we are
19b60 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 77 69 74   not already wit
19b70 68 69 6e 0a 2a 2a 20 61 20 74 72 61 6e 73 61 63  hin.** a transac
19b80 74 69 6f 6e 2e 20 20 49 66 20 77 65 20 61 72 65  tion.  If we are
19b90 20 61 6c 72 65 61 64 79 20 77 69 74 68 69 6e 20   already within 
19ba0 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74  a transaction, t
19bb0 68 65 6e 20 61 20 63 68 65 63 6b 70 6f 69 6e 74  hen a checkpoint
19bc0 0a 2a 2a 20 69 73 20 73 65 74 20 69 66 20 74 68  .** is set if th
19bd0 65 20 73 65 74 53 74 61 74 65 6d 65 6e 74 20 70  e setStatement p
19be0 61 72 61 6d 65 74 65 72 20 69 73 20 74 72 75 65  arameter is true
19bf0 2e 20 20 41 20 63 68 65 63 6b 70 6f 69 6e 74 20  .  A checkpoint 
19c00 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 73 65 74  should.** be set
19c10 20 66 6f 72 20 6f 70 65 72 61 74 69 6f 6e 73 20   for operations 
19c20 74 68 61 74 20 6d 69 67 68 74 20 66 61 69 6c 20  that might fail 
19c30 28 64 75 65 20 74 6f 20 61 20 63 6f 6e 73 74 72  (due to a constr
19c40 61 69 6e 74 29 20 70 61 72 74 20 6f 66 0a 2a 2a  aint) part of.**
19c50 20 74 68 65 20 77 61 79 20 74 68 72 6f 75 67 68   the way through
19c60 20 61 6e 64 20 77 68 69 63 68 20 77 69 6c 6c 20   and which will 
19c70 6e 65 65 64 20 74 6f 20 75 6e 64 6f 20 73 6f 6d  need to undo som
19c80 65 20 77 72 69 74 65 73 20 77 69 74 68 6f 75 74  e writes without
19c90 20 68 61 76 69 6e 67 20 74 6f 0a 2a 2a 20 72 6f   having to.** ro
19ca0 6c 6c 62 61 63 6b 20 74 68 65 20 77 68 6f 6c 65  llback the whole
19cb0 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 46   transaction.  F
19cc0 6f 72 20 6f 70 65 72 61 74 69 6f 6e 73 20 77 68  or operations wh
19cd0 65 72 65 20 61 6c 6c 20 63 6f 6e 73 74 72 61 69  ere all constrai
19ce0 6e 74 73 0a 2a 2a 20 63 61 6e 20 62 65 20 63 68  nts.** can be ch
19cf0 65 63 6b 65 64 20 62 65 66 6f 72 65 20 61 6e 79  ecked before any
19d00 20 63 68 61 6e 67 65 73 20 61 72 65 20 6d 61 64   changes are mad
19d10 65 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  e to the databas
19d20 65 2c 20 69 74 20 69 73 20 6e 65 76 65 72 0a 2a  e, it is never.*
19d30 2a 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 75  * necessary to u
19d40 6e 64 6f 20 61 20 77 72 69 74 65 20 61 6e 64 20  ndo a write and 
19d50 74 68 65 20 63 68 65 63 6b 70 6f 69 6e 74 20 73  the checkpoint s
19d60 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20 73 65 74  hould not be set
19d70 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 64 61 74  ..**.** Only dat
19d80 61 62 61 73 65 20 69 44 62 20 61 6e 64 20 74 68  abase iDb and th
19d90 65 20 74 65 6d 70 20 64 61 74 61 62 61 73 65 20  e temp database 
19da0 61 72 65 20 6d 61 64 65 20 77 72 69 74 61 62 6c  are made writabl
19db0 65 20 62 79 20 74 68 69 73 20 63 61 6c 6c 2e 0a  e by this call..
19dc0 2a 2a 20 49 66 20 69 44 62 3d 3d 30 2c 20 74 68  ** If iDb==0, th
19dd0 65 6e 20 74 68 65 20 6d 61 69 6e 20 61 6e 64 20  en the main and 
19de0 74 65 6d 70 20 64 61 74 61 62 61 73 65 73 20 61  temp databases a
19df0 72 65 20 6d 61 64 65 20 77 72 69 74 61 62 6c 65  re made writable
19e00 2e 20 20 20 49 66 0a 2a 2a 20 69 44 62 3d 3d 31  .   If.** iDb==1
19e10 20 74 68 65 6e 20 6f 6e 6c 79 20 74 68 65 20 74   then only the t
19e20 65 6d 70 20 64 61 74 61 62 61 73 65 20 69 73 20  emp database is 
19e30 6d 61 64 65 20 77 72 69 74 61 62 6c 65 2e 20 20  made writable.  
19e40 49 66 20 69 44 62 3e 31 20 74 68 65 6e 20 74 68  If iDb>1 then th
19e50 65 0a 2a 2a 20 73 70 65 63 69 66 69 65 64 20 61  e.** specified a
19e60 75 78 69 6c 69 61 72 79 20 64 61 74 61 62 61 73  uxiliary databas
19e70 65 20 61 6e 64 20 74 68 65 20 74 65 6d 70 20 64  e and the temp d
19e80 61 74 61 62 61 73 65 20 61 72 65 20 6d 61 64 65  atabase are made
19e90 20 77 72 69 74 61 62 6c 65 2e 0a 2a 2f 0a 76 6f   writable..*/.vo
19ea0 69 64 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57  id sqlite3BeginW
19eb0 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 50 61  riteOperation(Pa
19ec0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74  rse *pParse, int
19ed0 20 73 65 74 53 74 61 74 65 6d 65 6e 74 2c 20 69   setStatement, i
19ee0 6e 74 20 69 44 62 29 7b 0a 20 20 56 64 62 65 20  nt iDb){.  Vdbe 
19ef0 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56  *v = sqlite3GetV
19f00 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69  dbe(pParse);.  i
19f10 66 28 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( v==0 ) return
19f20 3b 0a 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56  ;.  sqlite3CodeV
19f30 65 72 69 66 79 53 63 68 65 6d 61 28 70 50 61 72  erifySchema(pPar
19f40 73 65 2c 20 69 44 62 29 3b 0a 20 20 70 50 61 72  se, iDb);.  pPar
19f50 73 65 2d 3e 77 72 69 74 65 4d 61 73 6b 20 7c 3d  se->writeMask |=
19f60 20 31 3c 3c 69 44 62 3b 0a 20 20 69 66 28 20 73   1<<iDb;.  if( s
19f70 65 74 53 74 61 74 65 6d 65 6e 74 20 26 26 20 70  etStatement && p
19f80 50 61 72 73 65 2d 3e 6e 65 73 74 65 64 3d 3d 30  Parse->nested==0
19f90 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
19fa0 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
19fb0 53 74 61 74 65 6d 65 6e 74 2c 20 69 44 62 29 3b  Statement, iDb);
19fc0 0a 20 20 7d 0a 20 20 69 66 28 20 28 4f 4d 49 54  .  }.  if( (OMIT
19fd0 5f 54 45 4d 50 44 42 20 7c 7c 20 69 44 62 21 3d  _TEMPDB || iDb!=
19fe0 31 29 20 26 26 20 70 50 61 72 73 65 2d 3e 64 62  1) && pParse->db
19ff0 2d 3e 61 44 62 5b 31 5d 2e 70 42 74 21 3d 30 20  ->aDb[1].pBt!=0 
1a000 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65  ){.    sqlite3Be
1a010 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f  ginWriteOperatio
1a020 6e 28 70 50 61 72 73 65 2c 20 73 65 74 53 74 61  n(pParse, setSta
1a030 74 65 6d 65 6e 74 2c 20 31 29 3b 0a 20 20 7d 0a  tement, 1);.  }.
1a040 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74  }../*.** Check t
1a050 6f 20 73 65 65 20 69 66 20 70 49 6e 64 65 78 20  o see if pIndex 
1a060 75 73 65 73 20 74 68 65 20 63 6f 6c 6c 61 74 69  uses the collati
1a070 6e 67 20 73 65 71 75 65 6e 63 65 20 70 43 6f 6c  ng sequence pCol
1a080 6c 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20 74 72  l.  Return.** tr
1a090 75 65 20 69 66 20 69 74 20 64 6f 65 73 20 61 6e  ue if it does an
1a0a0 64 20 66 61 6c 73 65 20 69 66 20 69 74 20 64 6f  d false if it do
1a0b0 65 73 20 6e 6f 74 2e 0a 2a 2f 0a 23 69 66 6e 64  es not..*/.#ifnd
1a0c0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 52  ef SQLITE_OMIT_R
1a0d0 45 49 4e 44 45 58 0a 73 74 61 74 69 63 20 69 6e  EINDEX.static in
1a0e0 74 20 63 6f 6c 6c 61 74 69 6f 6e 4d 61 74 63 68  t collationMatch
1a0f0 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f  (const char *zCo
1a100 6c 6c 2c 20 49 6e 64 65 78 20 2a 70 49 6e 64 65  ll, Index *pInde
1a110 78 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66  x){.  int i;.  f
1a120 6f 72 28 69 3d 30 3b 20 69 3c 70 49 6e 64 65 78  or(i=0; i<pIndex
1a130 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b  ->nColumn; i++){
1a140 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
1a150 2a 7a 20 3d 20 70 49 6e 64 65 78 2d 3e 61 7a 43  *z = pIndex->azC
1a160 6f 6c 6c 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20  oll[i];.    if( 
1a170 7a 3d 3d 7a 43 6f 6c 6c 20 7c 7c 20 28 7a 20 26  z==zColl || (z &
1a180 26 20 7a 43 6f 6c 6c 20 26 26 20 30 3d 3d 73 71  & zColl && 0==sq
1a190 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 2c 20  lite3StrICmp(z, 
1a1a0 7a 43 6f 6c 6c 29 29 20 29 7b 0a 20 20 20 20 20  zColl)) ){.     
1a1b0 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d   return 1;.    }
1a1c0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
1a1d0 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
1a1e0 20 52 65 63 6f 6d 70 75 74 65 20 61 6c 6c 20 69   Recompute all i
1a1f0 6e 64 69 63 65 73 20 6f 66 20 70 54 61 62 20 74  ndices of pTab t
1a200 68 61 74 20 75 73 65 20 74 68 65 20 63 6f 6c 6c  hat use the coll
1a210 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 70  ating sequence p
1a220 43 6f 6c 6c 2e 0a 2a 2a 20 49 66 20 70 43 6f 6c  Coll..** If pCol
1a230 6c 3d 3d 30 20 74 68 65 6e 20 72 65 63 6f 6d 70  l==0 then recomp
1a240 75 74 65 20 61 6c 6c 20 69 6e 64 69 63 65 73 20  ute all indices 
1a250 6f 66 20 70 54 61 62 2e 0a 2a 2f 0a 23 69 66 6e  of pTab..*/.#ifn
1a260 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1a270 52 45 49 4e 44 45 58 0a 73 74 61 74 69 63 20 76  REINDEX.static v
1a280 6f 69 64 20 72 65 69 6e 64 65 78 54 61 62 6c 65  oid reindexTable
1a290 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
1a2a0 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 63 68 61  Table *pTab, cha
1a2b0 72 20 63 6f 6e 73 74 20 2a 7a 43 6f 6c 6c 29 7b  r const *zColl){
1a2c0 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78  .  Index *pIndex
1a2d0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
1a2e0 2a 20 41 6e 20 69 6e 64 65 78 20 61 73 73 6f 63  * An index assoc
1a2f0 69 61 74 65 64 20 77 69 74 68 20 70 54 61 62 20  iated with pTab 
1a300 2a 2f 0a 0a 20 20 66 6f 72 28 70 49 6e 64 65 78  */..  for(pIndex
1a310 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70  =pTab->pIndex; p
1a320 49 6e 64 65 78 3b 20 70 49 6e 64 65 78 3d 70 49  Index; pIndex=pI
1a330 6e 64 65 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  ndex->pNext){.  
1a340 20 20 69 66 28 20 7a 43 6f 6c 6c 3d 3d 30 20 7c    if( zColl==0 |
1a350 7c 20 63 6f 6c 6c 61 74 69 6f 6e 4d 61 74 63 68  | collationMatch
1a360 28 7a 43 6f 6c 6c 2c 20 70 49 6e 64 65 78 29 20  (zColl, pIndex) 
1a370 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 44 62  ){.      int iDb
1a380 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61   = sqlite3Schema
1a390 54 6f 49 6e 64 65 78 28 70 50 61 72 73 65 2d 3e  ToIndex(pParse->
1a3a0 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d  db, pTab->pSchem
1a3b0 61 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  a);.      sqlite
1a3c0 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61  3BeginWriteOpera
1a3d0 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 30 2c 20  tion(pParse, 0, 
1a3e0 69 44 62 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  iDb);.      sqli
1a3f0 74 65 33 52 65 66 69 6c 6c 49 6e 64 65 78 28 70  te3RefillIndex(p
1a400 50 61 72 73 65 2c 20 70 49 6e 64 65 78 2c 20 2d  Parse, pIndex, -
1a410 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  1);.    }.  }.}.
1a420 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65  #endif../*.** Re
1a430 63 6f 6d 70 75 74 65 20 61 6c 6c 20 69 6e 64 69  compute all indi
1a440 63 65 73 20 6f 66 20 61 6c 6c 20 74 61 62 6c 65  ces of all table
1a450 73 20 69 6e 20 61 6c 6c 20 64 61 74 61 62 61 73  s in all databas
1a460 65 73 20 77 68 65 72 65 20 74 68 65 0a 2a 2a 20  es where the.** 
1a470 69 6e 64 69 63 65 73 20 75 73 65 20 74 68 65 20  indices use the 
1a480 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
1a490 63 65 20 70 43 6f 6c 6c 2e 20 20 49 66 20 70 43  ce pColl.  If pC
1a4a0 6f 6c 6c 3d 3d 30 20 74 68 65 6e 20 72 65 63 6f  oll==0 then reco
1a4b0 6d 70 75 74 65 0a 2a 2a 20 61 6c 6c 20 69 6e 64  mpute.** all ind
1a4c0 69 63 65 73 20 65 76 65 72 79 77 68 65 72 65 2e  ices everywhere.
1a4d0 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .*/.#ifndef SQLI
1a4e0 54 45 5f 4f 4d 49 54 5f 52 45 49 4e 44 45 58 0a  TE_OMIT_REINDEX.
1a4f0 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 69 6e  static void rein
1a500 64 65 78 44 61 74 61 62 61 73 65 73 28 50 61 72  dexDatabases(Par
1a510 73 65 20 2a 70 50 61 72 73 65 2c 20 63 68 61 72  se *pParse, char
1a520 20 63 6f 6e 73 74 20 2a 7a 43 6f 6c 6c 29 7b 0a   const *zColl){.
1a530 20 20 44 62 20 2a 70 44 62 3b 20 20 20 20 20 20    Db *pDb;      
1a540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1a550 20 41 20 73 69 6e 67 6c 65 20 64 61 74 61 62 61   A single databa
1a560 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62 3b  se */.  int iDb;
1a570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a580 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62      /* The datab
1a590 61 73 65 20 69 6e 64 65 78 20 6e 75 6d 62 65 72  ase index number
1a5a0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
1a5b0 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20  b = pParse->db; 
1a5c0 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73    /* The databas
1a5d0 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a  e connection */.
1a5e0 20 20 48 61 73 68 45 6c 65 6d 20 2a 6b 3b 20 20    HashElem *k;  
1a5f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1a600 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65   For looping ove
1a610 72 20 74 61 62 6c 65 73 20 69 6e 20 70 44 62 20  r tables in pDb 
1a620 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  */.  Table *pTab
1a630 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1a640 20 2f 2a 20 41 20 74 61 62 6c 65 20 69 6e 20 74   /* A table in t
1a650 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 0a  he database */..
1a660 20 20 66 6f 72 28 69 44 62 3d 30 2c 20 70 44 62    for(iDb=0, pDb
1a670 3d 64 62 2d 3e 61 44 62 3b 20 69 44 62 3c 64 62  =db->aDb; iDb<db
1a680 2d 3e 6e 44 62 3b 20 69 44 62 2b 2b 2c 20 70 44  ->nDb; iDb++, pD
1a690 62 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65 72 74  b++){.    assert
1a6a0 28 20 70 44 62 21 3d 30 20 29 3b 0a 20 20 20 20  ( pDb!=0 );.    
1a6b0 66 6f 72 28 6b 3d 73 71 6c 69 74 65 48 61 73 68  for(k=sqliteHash
1a6c0 46 69 72 73 74 28 26 70 44 62 2d 3e 70 53 63 68  First(&pDb->pSch
1a6d0 65 6d 61 2d 3e 74 62 6c 48 61 73 68 29 3b 20 20  ema->tblHash);  
1a6e0 6b 3b 20 6b 3d 73 71 6c 69 74 65 48 61 73 68 4e  k; k=sqliteHashN
1a6f0 65 78 74 28 6b 29 29 7b 0a 20 20 20 20 20 20 70  ext(k)){.      p
1a700 54 61 62 20 3d 20 28 54 61 62 6c 65 2a 29 73 71  Tab = (Table*)sq
1a710 6c 69 74 65 48 61 73 68 44 61 74 61 28 6b 29 3b  liteHashData(k);
1a720 0a 20 20 20 20 20 20 72 65 69 6e 64 65 78 54 61  .      reindexTa
1a730 62 6c 65 28 70 50 61 72 73 65 2c 20 70 54 61 62  ble(pParse, pTab
1a740 2c 20 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20 7d 0a  , zColl);.    }.
1a750 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a    }.}.#endif../*
1a760 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
1a770 65 20 66 6f 72 20 74 68 65 20 52 45 49 4e 44 45  e for the REINDE
1a780 58 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a  X command..**.**
1a790 20 20 20 20 20 20 20 20 52 45 49 4e 44 45 58 20          REINDEX 
1a7a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a7b0 20 20 20 20 20 20 20 20 20 20 20 2d 2d 20 31 0a             -- 1.
1a7c0 2a 2a 20 20 20 20 20 20 20 20 52 45 49 4e 44 45  **        REINDE
1a7d0 58 20 20 3c 63 6f 6c 6c 61 74 69 6f 6e 3e 20 20  X  <collation>  
1a7e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2d 2d 20               -- 
1a7f0 32 0a 2a 2a 20 20 20 20 20 20 20 20 52 45 49 4e  2.**        REIN
1a800 44 45 58 20 20 3f 3c 64 61 74 61 62 61 73 65 3e  DEX  ?<database>
1a810 2e 3f 3c 74 61 62 6c 65 6e 61 6d 65 3e 20 20 2d  .?<tablename>  -
1a820 2d 20 33 0a 2a 2a 20 20 20 20 20 20 20 20 52 45  - 3.**        RE
1a830 49 4e 44 45 58 20 20 3f 3c 64 61 74 61 62 61 73  INDEX  ?<databas
1a840 65 3e 2e 3f 3c 69 6e 64 65 78 6e 61 6d 65 3e 20  e>.?<indexname> 
1a850 20 2d 2d 20 34 0a 2a 2a 0a 2a 2a 20 46 6f 72 6d   -- 4.**.** Form
1a860 20 31 20 63 61 75 73 65 73 20 61 6c 6c 20 69 6e   1 causes all in
1a870 64 69 63 65 73 20 69 6e 20 61 6c 6c 20 61 74 74  dices in all att
1a880 61 63 68 65 64 20 64 61 74 61 62 61 73 65 73 20  ached databases 
1a890 74 6f 20 62 65 20 72 65 62 75 69 6c 74 2e 0a 2a  to be rebuilt..*
1a8a0 2a 20 46 6f 72 6d 20 32 20 72 65 62 75 69 6c 64  * Form 2 rebuild
1a8b0 73 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 69 6e  s all indices in
1a8c0 20 61 6c 6c 20 64 61 74 61 62 61 73 65 73 20 74   all databases t
1a8d0 68 61 74 20 75 73 65 20 74 68 65 20 6e 61 6d 65  hat use the name
1a8e0 64 0a 2a 2a 20 63 6f 6c 6c 61 74 69 6e 67 20 66  d.** collating f
1a8f0 75 6e 63 74 69 6f 6e 2e 20 20 46 6f 72 6d 73 20  unction.  Forms 
1a900 33 20 61 6e 64 20 34 20 72 65 62 75 69 6c 64 20  3 and 4 rebuild 
1a910 74 68 65 20 6e 61 6d 65 64 20 69 6e 64 65 78 20  the named index 
1a920 6f 72 20 61 6c 6c 0a 2a 2a 20 69 6e 64 69 63 65  or all.** indice
1a930 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
1a940 68 20 74 68 65 20 6e 61 6d 65 64 20 74 61 62 6c  h the named tabl
1a950 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  e..*/.#ifndef SQ
1a960 4c 49 54 45 5f 4f 4d 49 54 5f 52 45 49 4e 44 45  LITE_OMIT_REINDE
1a970 58 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52 65  X.void sqlite3Re
1a980 69 6e 64 65 78 28 50 61 72 73 65 20 2a 70 50 61  index(Parse *pPa
1a990 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d  rse, Token *pNam
1a9a0 65 31 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65  e1, Token *pName
1a9b0 32 29 7b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70  2){.  CollSeq *p
1a9c0 43 6f 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20  Coll;           
1a9d0 20 20 2f 2a 20 43 6f 6c 6c 61 74 69 6e 67 20 73    /* Collating s
1a9e0 65 71 75 65 6e 63 65 20 74 6f 20 62 65 20 72 65  equence to be re
1a9f0 69 6e 64 65 78 65 64 2c 20 6f 72 20 4e 55 4c 4c  indexed, or NULL
1aa00 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 3b 20 20   */.  char *z;  
1aa10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1aa20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 61 20 74    /* Name of a t
1aa30 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 2a 2f  able or index */
1aa40 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
1aa50 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  Db;            /
1aa60 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64 61  * Name of the da
1aa70 74 61 62 61 73 65 20 2a 2f 0a 20 20 54 61 62 6c  tabase */.  Tabl
1aa80 65 20 2a 70 54 61 62 3b 20 20 20 20 20 20 20 20  e *pTab;        
1aa90 20 20 20 20 20 20 20 20 2f 2a 20 41 20 74 61 62          /* A tab
1aaa0 6c 65 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  le in the databa
1aab0 73 65 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70  se */.  Index *p
1aac0 49 6e 64 65 78 3b 20 20 20 20 20 20 20 20 20 20  Index;          
1aad0 20 20 20 20 2f 2a 20 41 6e 20 69 6e 64 65 78 20      /* An index 
1aae0 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
1aaf0 70 54 61 62 20 2a 2f 0a 20 20 69 6e 74 20 69 44  pTab */.  int iD
1ab00 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
1ab10 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74        /* The dat
1ab20 61 62 61 73 65 20 69 6e 64 65 78 20 6e 75 6d 62  abase index numb
1ab30 65 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  er */.  sqlite3 
1ab40 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
1ab50 3b 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62  ;   /* The datab
1ab60 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a  ase connection *
1ab70 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4f 62 6a 4e  /.  Token *pObjN
1ab80 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ame;            
1ab90 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 74  /* Name of the t
1aba0 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 74 6f  able or index to
1abb0 20 62 65 20 72 65 69 6e 64 65 78 65 64 20 2a 2f   be reindexed */
1abc0 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20  ..  /* Read the 
1abd0 64 61 74 61 62 61 73 65 20 73 63 68 65 6d 61 2e  database schema.
1abe0 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
1abf0 75 72 73 2c 20 6c 65 61 76 65 20 61 6e 20 65 72  urs, leave an er
1ac00 72 6f 72 20 6d 65 73 73 61 67 65 0a 20 20 2a 2a  ror message.  **
1ac10 20 61 6e 64 20 63 6f 64 65 20 69 6e 20 70 50 61   and code in pPa
1ac20 72 73 65 20 61 6e 64 20 72 65 74 75 72 6e 20 4e  rse and return N
1ac30 55 4c 4c 2e 20 2a 2f 0a 20 20 69 66 28 20 53 51  ULL. */.  if( SQ
1ac40 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33  LITE_OK!=sqlite3
1ac50 52 65 61 64 53 63 68 65 6d 61 28 70 50 61 72 73  ReadSchema(pPars
1ac60 65 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  e) ){.    return
1ac70 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 4e 61  ;.  }..  if( pNa
1ac80 6d 65 31 3d 3d 30 20 7c 7c 20 70 4e 61 6d 65 31  me1==0 || pName1
1ac90 2d 3e 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  ->z==0 ){.    re
1aca0 69 6e 64 65 78 44 61 74 61 62 61 73 65 73 28 70  indexDatabases(p
1acb0 50 61 72 73 65 2c 20 30 29 3b 0a 20 20 20 20 72  Parse, 0);.    r
1acc0 65 74 75 72 6e 3b 0a 20 20 7d 65 6c 73 65 20 69  eturn;.  }else i
1acd0 66 28 20 70 4e 61 6d 65 32 3d 3d 30 20 7c 7c 20  f( pName2==0 || 
1ace0 70 4e 61 6d 65 32 2d 3e 7a 3d 3d 30 20 29 7b 0a  pName2->z==0 ){.
1acf0 20 20 20 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 3b      char *zColl;
1ad00 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 61  .    assert( pNa
1ad10 6d 65 31 2d 3e 7a 20 29 3b 0a 20 20 20 20 7a 43  me1->z );.    zC
1ad20 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d  oll = sqlite3Nam
1ad30 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 50 61 72 73  eFromToken(pPars
1ad40 65 2d 3e 64 62 2c 20 70 4e 61 6d 65 31 29 3b 0a  e->db, pName1);.
1ad50 20 20 20 20 69 66 28 20 21 7a 43 6f 6c 6c 20 29      if( !zColl )
1ad60 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 70 43 6f   return;.    pCo
1ad70 6c 6c 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64  ll = sqlite3Find
1ad80 43 6f 6c 6c 53 65 71 28 64 62 2c 20 45 4e 43 28  CollSeq(db, ENC(
1ad90 64 62 29 2c 20 7a 43 6f 6c 6c 2c 20 2d 31 2c 20  db), zColl, -1, 
1ada0 30 29 3b 0a 20 20 20 20 69 66 28 20 70 43 6f 6c  0);.    if( pCol
1adb0 6c 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 7a  l ){.      if( z
1adc0 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  Coll ){.        
1add0 72 65 69 6e 64 65 78 44 61 74 61 62 61 73 65 73  reindexDatabases
1ade0 28 70 50 61 72 73 65 2c 20 7a 43 6f 6c 6c 29 3b  (pParse, zColl);
1adf0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1ae00 5f 66 72 65 65 28 7a 43 6f 6c 6c 29 3b 0a 20 20  _free(zColl);.  
1ae10 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75      }.      retu
1ae20 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  rn;.    }.    sq
1ae30 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6c 6c  lite3_free(zColl
1ae40 29 3b 0a 20 20 7d 0a 20 20 69 44 62 20 3d 20 73  );.  }.  iDb = s
1ae50 71 6c 69 74 65 33 54 77 6f 50 61 72 74 4e 61 6d  qlite3TwoPartNam
1ae60 65 28 70 50 61 72 73 65 2c 20 70 4e 61 6d 65 31  e(pParse, pName1
1ae70 2c 20 70 4e 61 6d 65 32 2c 20 26 70 4f 62 6a 4e  , pName2, &pObjN
1ae80 61 6d 65 29 3b 0a 20 20 69 66 28 20 69 44 62 3c  ame);.  if( iDb<
1ae90 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 7a 20  0 ) return;.  z 
1aea0 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f  = sqlite3NameFro
1aeb0 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 4f 62 6a 4e  mToken(db, pObjN
1aec0 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a 3d 3d 30  ame);.  if( z==0
1aed0 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 7a 44 62   ) return;.  zDb
1aee0 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e   = db->aDb[iDb].
1aef0 7a 4e 61 6d 65 3b 0a 20 20 70 54 61 62 20 3d 20  zName;.  pTab = 
1af00 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65  sqlite3FindTable
1af10 28 64 62 2c 20 7a 2c 20 7a 44 62 29 3b 0a 20 20  (db, z, zDb);.  
1af20 69 66 28 20 70 54 61 62 20 29 7b 0a 20 20 20 20  if( pTab ){.    
1af30 72 65 69 6e 64 65 78 54 61 62 6c 65 28 70 50 61  reindexTable(pPa
1af40 72 73 65 2c 20 70 54 61 62 2c 20 30 29 3b 0a 20  rse, pTab, 0);. 
1af50 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
1af60 7a 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  z);.    return;.
1af70 20 20 7d 0a 20 20 70 49 6e 64 65 78 20 3d 20 73    }.  pIndex = s
1af80 71 6c 69 74 65 33 46 69 6e 64 49 6e 64 65 78 28  qlite3FindIndex(
1af90 64 62 2c 20 7a 2c 20 7a 44 62 29 3b 0a 20 20 73  db, z, zDb);.  s
1afa0 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 29 3b 0a  qlite3_free(z);.
1afb0 20 20 69 66 28 20 70 49 6e 64 65 78 20 29 7b 0a    if( pIndex ){.
1afc0 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e      sqlite3Begin
1afd0 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70  WriteOperation(p
1afe0 50 61 72 73 65 2c 20 30 2c 20 69 44 62 29 3b 0a  Parse, 0, iDb);.
1aff0 20 20 20 20 73 71 6c 69 74 65 33 52 65 66 69 6c      sqlite3Refil
1b000 6c 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70  lIndex(pParse, p
1b010 49 6e 64 65 78 2c 20 2d 31 29 3b 0a 20 20 20 20  Index, -1);.    
1b020 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 73 71  return;.  }.  sq
1b030 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
1b040 61 72 73 65 2c 20 22 75 6e 61 62 6c 65 20 74 6f  arse, "unable to
1b050 20 69 64 65 6e 74 69 66 79 20 74 68 65 20 6f 62   identify the ob
1b060 6a 65 63 74 20 74 6f 20 62 65 20 72 65 69 6e 64  ject to be reind
1b070 65 78 65 64 22 29 3b 0a 7d 0a 23 65 6e 64 69 66  exed");.}.#endif
1b080 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ../*.** Return a
1b090 20 64 79 6e 61 6d 69 63 6c 79 20 61 6c 6c 6f 63   dynamicly alloc
1b0a0 61 74 65 64 20 4b 65 79 49 6e 66 6f 20 73 74 72  ated KeyInfo str
1b0b0 75 63 74 75 72 65 20 74 68 61 74 20 63 61 6e 20  ucture that can 
1b0c0 62 65 20 75 73 65 64 0a 2a 2a 20 77 69 74 68 20  be used.** with 
1b0d0 4f 50 5f 4f 70 65 6e 52 65 61 64 20 6f 72 20 4f  OP_OpenRead or O
1b0e0 50 5f 4f 70 65 6e 57 72 69 74 65 20 74 6f 20 61  P_OpenWrite to a
1b0f0 63 63 65 73 73 20 64 61 74 61 62 61 73 65 20 69  ccess database i
1b100 6e 64 65 78 20 70 49 64 78 2e 0a 2a 2a 0a 2a 2a  ndex pIdx..**.**
1b110 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20   If successful, 
1b120 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
1b130 20 6e 65 77 20 73 74 72 75 63 74 75 72 65 20 69   new structure i
1b140 73 20 72 65 74 75 72 6e 65 64 2e 20 49 6e 20 74  s returned. In t
1b150 68 69 73 20 63 61 73 65 0a 2a 2a 20 74 68 65 20  his case.** the 
1b160 63 61 6c 6c 65 72 20 69 73 20 72 65 73 70 6f 6e  caller is respon
1b170 73 69 62 6c 65 20 66 6f 72 20 63 61 6c 6c 69 6e  sible for callin
1b180 67 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 29  g sqlite3_free()
1b190 20 6f 6e 20 74 68 65 20 72 65 74 75 72 6e 65 64   on the returned
1b1a0 20 0a 2a 2a 20 70 6f 69 6e 74 65 72 2e 20 49 66   .** pointer. If
1b1b0 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
1b1c0 20 28 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 20   (out of memory 
1b1d0 6f 72 20 6d 69 73 73 69 6e 67 20 63 6f 6c 6c 61  or missing colla
1b1e0 74 69 6f 6e 20 0a 2a 2a 20 73 65 71 75 65 6e 63  tion .** sequenc
1b1f0 65 29 2c 20 4e 55 4c 4c 20 69 73 20 72 65 74 75  e), NULL is retu
1b200 72 6e 65 64 20 61 6e 64 20 74 68 65 20 73 74 61  rned and the sta
1b210 74 65 20 6f 66 20 70 50 61 72 73 65 20 75 70 64  te of pParse upd
1b220 61 74 65 64 20 74 6f 20 72 65 66 6c 65 63 74 0a  ated to reflect.
1b230 2a 2a 20 74 68 65 20 65 72 72 6f 72 2e 0a 2a 2f  ** the error..*/
1b240 0a 4b 65 79 49 6e 66 6f 20 2a 73 71 6c 69 74 65  .KeyInfo *sqlite
1b250 33 49 6e 64 65 78 4b 65 79 69 6e 66 6f 28 50 61  3IndexKeyinfo(Pa
1b260 72 73 65 20 2a 70 50 61 72 73 65 2c 20 49 6e 64  rse *pParse, Ind
1b270 65 78 20 2a 70 49 64 78 29 7b 0a 20 20 69 6e 74  ex *pIdx){.  int
1b280 20 69 3b 0a 20 20 69 6e 74 20 6e 43 6f 6c 20 3d   i;.  int nCol =
1b290 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 0a   pIdx->nColumn;.
1b2a0 20 20 69 6e 74 20 6e 42 79 74 65 73 20 3d 20 73    int nBytes = s
1b2b0 69 7a 65 6f 66 28 4b 65 79 49 6e 66 6f 29 20 2b  izeof(KeyInfo) +
1b2c0 20 28 6e 43 6f 6c 2d 31 29 2a 73 69 7a 65 6f 66   (nCol-1)*sizeof
1b2d0 28 43 6f 6c 6c 53 65 71 2a 29 20 2b 20 6e 43 6f  (CollSeq*) + nCo
1b2e0 6c 3b 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b  l;.  KeyInfo *pK
1b2f0 65 79 20 3d 20 28 4b 65 79 49 6e 66 6f 20 2a 29  ey = (KeyInfo *)
1b300 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a  sqlite3DbMallocZ
1b310 65 72 6f 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ero(pParse->db, 
1b320 6e 42 79 74 65 73 29 3b 0a 0a 20 20 69 66 28 20  nBytes);..  if( 
1b330 70 4b 65 79 20 29 7b 0a 20 20 20 20 70 4b 65 79  pKey ){.    pKey
1b340 2d 3e 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64  ->db = pParse->d
1b350 62 3b 0a 20 20 20 20 70 4b 65 79 2d 3e 61 53 6f  b;.    pKey->aSo
1b360 72 74 4f 72 64 65 72 20 3d 20 28 75 38 20 2a 29  rtOrder = (u8 *)
1b370 26 28 70 4b 65 79 2d 3e 61 43 6f 6c 6c 5b 6e 43  &(pKey->aColl[nC
1b380 6f 6c 5d 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ol]);.    assert
1b390 28 20 26 70 4b 65 79 2d 3e 61 53 6f 72 74 4f 72  ( &pKey->aSortOr
1b3a0 64 65 72 5b 6e 43 6f 6c 5d 3d 3d 26 28 28 28 75  der[nCol]==&(((u
1b3b0 38 20 2a 29 70 4b 65 79 29 5b 6e 42 79 74 65 73  8 *)pKey)[nBytes
1b3c0 5d 29 20 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d  ]) );.    for(i=
1b3d0 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b  0; i<nCol; i++){
1b3e0 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 43 6f  .      char *zCo
1b3f0 6c 6c 20 3d 20 70 49 64 78 2d 3e 61 7a 43 6f 6c  ll = pIdx->azCol
1b400 6c 5b 69 5d 3b 0a 20 20 20 20 20 20 61 73 73 65  l[i];.      asse
1b410 72 74 28 20 7a 43 6f 6c 6c 20 29 3b 0a 20 20 20  rt( zColl );.   
1b420 20 20 20 70 4b 65 79 2d 3e 61 43 6f 6c 6c 5b 69     pKey->aColl[i
1b430 5d 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63 61 74  ] = sqlite3Locat
1b440 65 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  eCollSeq(pParse,
1b450 20 7a 43 6f 6c 6c 2c 20 2d 31 29 3b 0a 20 20 20   zColl, -1);.   
1b460 20 20 20 70 4b 65 79 2d 3e 61 53 6f 72 74 4f 72     pKey->aSortOr
1b470 64 65 72 5b 69 5d 20 3d 20 70 49 64 78 2d 3e 61  der[i] = pIdx->a
1b480 53 6f 72 74 4f 72 64 65 72 5b 69 5d 3b 0a 20 20  SortOrder[i];.  
1b490 20 20 7d 0a 20 20 20 20 70 4b 65 79 2d 3e 6e 46    }.    pKey->nF
1b4a0 69 65 6c 64 20 3d 20 6e 43 6f 6c 3b 0a 20 20 7d  ield = nCol;.  }
1b4b0 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  ..  if( pParse->
1b4c0 6e 45 72 72 20 29 7b 0a 20 20 20 20 73 71 6c 69  nErr ){.    sqli
1b4d0 74 65 33 5f 66 72 65 65 28 70 4b 65 79 29 3b 0a  te3_free(pKey);.
1b4e0 20 20 20 20 70 4b 65 79 20 3d 20 30 3b 0a 20 20      pKey = 0;.  
1b4f0 7d 0a 20 20 72 65 74 75 72 6e 20 70 4b 65 79 3b  }.  return pKey;
1b500 0a 7d 0a                                         .}.