/ Hex Artifact Content
Login

Artifact 205538f36cd5c9ec04f24beecdb69629758aaa50:


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 35 30 37 20 32 30 30 38 2f 31 32 2f 31 30  1.507 2008/12/10
02f0: 20 32 31 3a 31 39 3a 35 37 20 64 72 68 20 45 78   21:19:57 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 28 75 38 29 65 78 70 6c 61 69 6e 46 6c 61 67   (u8)explainFlag
0410: 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 56 61 72  ;.  pParse->nVar
0420: 20 3d 20 30 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66   = 0;.}..#ifndef
0430: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41   SQLITE_OMIT_SHA
0440: 52 45 44 5f 43 41 43 48 45 0a 2f 2a 0a 2a 2a 20  RED_CACHE./*.** 
0450: 54 68 65 20 54 61 62 6c 65 4c 6f 63 6b 20 73 74  The TableLock st
0460: 72 75 63 74 75 72 65 20 69 73 20 6f 6e 6c 79 20  ructure is only 
0470: 75 73 65 64 20 62 79 20 74 68 65 20 73 71 6c 69  used by the sqli
0480: 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28 29 20 61  te3TableLock() a
0490: 6e 64 0a 2a 2a 20 63 6f 64 65 54 61 62 6c 65 4c  nd.** codeTableL
04a0: 6f 63 6b 73 28 29 20 66 75 6e 63 74 69 6f 6e 73  ocks() functions
04b0: 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 54 61 62 6c  ..*/.struct Tabl
04c0: 65 4c 6f 63 6b 20 7b 0a 20 20 69 6e 74 20 69 44  eLock {.  int iD
04d0: 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  b;             /
04e0: 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 63  * The database c
04f0: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 74 61  ontaining the ta
0500: 62 6c 65 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64  ble to be locked
0510: 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 3b 20   */.  int iTab; 
0520: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
0530: 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 74  e root page of t
0540: 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20 6c  he table to be l
0550: 6f 63 6b 65 64 20 2a 2f 0a 20 20 75 38 20 69 73  ocked */.  u8 is
0560: 57 72 69 74 65 4c 6f 63 6b 3b 20 20 20 20 20 20  WriteLock;      
0570: 2f 2a 20 54 72 75 65 20 66 6f 72 20 77 72 69 74  /* True for writ
0580: 65 20 6c 6f 63 6b 2e 20 20 46 61 6c 73 65 20 66  e lock.  False f
0590: 6f 72 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 2a  or a read lock *
05a0: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
05b0: 7a 4e 61 6d 65 3b 20 20 20 2f 2a 20 4e 61 6d 65  zName;   /* Name
05c0: 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 2a 2f   of the table */
05d0: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6f 72  .};../*.** Recor
05e0: 64 20 74 68 65 20 66 61 63 74 20 74 68 61 74 20  d the fact that 
05f0: 77 65 20 77 61 6e 74 20 74 6f 20 6c 6f 63 6b 20  we want to lock 
0600: 61 20 74 61 62 6c 65 20 61 74 20 72 75 6e 2d 74  a table at run-t
0610: 69 6d 65 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 65  ime.  .**.** The
0620: 20 74 61 62 6c 65 20 74 6f 20 62 65 20 6c 6f 63   table to be loc
0630: 6b 65 64 20 68 61 73 20 72 6f 6f 74 20 70 61 67  ked has root pag
0640: 65 20 69 54 61 62 20 61 6e 64 20 69 73 20 66 6f  e iTab and is fo
0650: 75 6e 64 20 69 6e 20 64 61 74 61 62 61 73 65 20  und in database 
0660: 69 44 62 2e 0a 2a 2a 20 41 20 72 65 61 64 20 6f  iDb..** A read o
0670: 72 20 61 20 77 72 69 74 65 20 6c 6f 63 6b 20 63  r a write lock c
0680: 61 6e 20 62 65 20 74 61 6b 65 6e 20 64 65 70 65  an be taken depe
0690: 6e 64 69 6e 67 20 6f 6e 20 69 73 57 72 69 74 65  nding on isWrite
06a0: 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  lock..**.** This
06b0: 20 72 6f 75 74 69 6e 65 20 6a 75 73 74 20 72 65   routine just re
06c0: 63 6f 72 64 73 20 74 68 65 20 66 61 63 74 20 74  cords the fact t
06d0: 68 61 74 20 74 68 65 20 6c 6f 63 6b 20 69 73 20  hat the lock is 
06e0: 64 65 73 69 72 65 64 2e 20 20 54 68 65 0a 2a 2a  desired.  The.**
06f0: 20 63 6f 64 65 20 74 6f 20 6d 61 6b 65 20 74 68   code to make th
0700: 65 20 6c 6f 63 6b 20 6f 63 63 75 72 20 69 73 20  e lock occur is 
0710: 67 65 6e 65 72 61 74 65 64 20 62 79 20 61 20 6c  generated by a l
0720: 61 74 65 72 20 63 61 6c 6c 20 74 6f 0a 2a 2a 20  ater call to.** 
0730: 63 6f 64 65 54 61 62 6c 65 4c 6f 63 6b 73 28 29  codeTableLocks()
0740: 20 77 68 69 63 68 20 6f 63 63 75 72 73 20 64 75   which occurs du
0750: 72 69 6e 67 20 73 71 6c 69 74 65 33 46 69 6e 69  ring sqlite3Fini
0760: 73 68 43 6f 64 69 6e 67 28 29 2e 0a 2a 2f 0a 76  shCoding()..*/.v
0770: 6f 69 64 20 73 71 6c 69 74 65 33 54 61 62 6c 65  oid sqlite3Table
0780: 4c 6f 63 6b 28 0a 20 20 50 61 72 73 65 20 2a 70  Lock(.  Parse *p
0790: 50 61 72 73 65 2c 20 20 20 20 20 2f 2a 20 50 61  Parse,     /* Pa
07a0: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
07b0: 0a 20 20 69 6e 74 20 69 44 62 2c 20 20 20 20 20  .  int iDb,     
07c0: 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f        /* Index o
07d0: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63  f the database c
07e0: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 74 61  ontaining the ta
07f0: 62 6c 65 20 74 6f 20 6c 6f 63 6b 20 2a 2f 0a 20  ble to lock */. 
0800: 20 69 6e 74 20 69 54 61 62 2c 20 20 20 20 20 20   int iTab,      
0810: 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65      /* Root page
0820: 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 74   number of the t
0830: 61 62 6c 65 20 74 6f 20 62 65 20 6c 6f 63 6b 65  able to be locke
0840: 64 20 2a 2f 0a 20 20 75 38 20 69 73 57 72 69 74  d */.  u8 isWrit
0850: 65 4c 6f 63 6b 2c 20 20 20 20 2f 2a 20 54 72 75  eLock,    /* Tru
0860: 65 20 66 6f 72 20 61 20 77 72 69 74 65 20 6c 6f  e for a write lo
0870: 63 6b 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  ck */.  const ch
0880: 61 72 20 2a 7a 4e 61 6d 65 20 20 2f 2a 20 4e 61  ar *zName  /* Na
0890: 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  me of the table 
08a0: 74 6f 20 62 65 20 6c 6f 63 6b 65 64 20 2a 2f 0a  to be locked */.
08b0: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e  ){.  int i;.  in
08c0: 74 20 6e 42 79 74 65 73 3b 0a 20 20 54 61 62 6c  t nBytes;.  Tabl
08d0: 65 4c 6f 63 6b 20 2a 70 3b 0a 0a 20 20 69 66 28  eLock *p;..  if(
08e0: 20 69 44 62 3c 30 20 29 7b 0a 20 20 20 20 72 65   iDb<0 ){.    re
08f0: 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 66 6f 72  turn;.  }..  for
0900: 28 69 3d 30 3b 20 69 3c 70 50 61 72 73 65 2d 3e  (i=0; i<pParse->
0910: 6e 54 61 62 6c 65 4c 6f 63 6b 3b 20 69 2b 2b 29  nTableLock; i++)
0920: 7b 0a 20 20 20 20 70 20 3d 20 26 70 50 61 72 73  {.    p = &pPars
0930: 65 2d 3e 61 54 61 62 6c 65 4c 6f 63 6b 5b 69 5d  e->aTableLock[i]
0940: 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 44 62  ;.    if( p->iDb
0950: 3d 3d 69 44 62 20 26 26 20 70 2d 3e 69 54 61 62  ==iDb && p->iTab
0960: 3d 3d 69 54 61 62 20 29 7b 0a 20 20 20 20 20 20  ==iTab ){.      
0970: 70 2d 3e 69 73 57 72 69 74 65 4c 6f 63 6b 20 3d  p->isWriteLock =
0980: 20 28 70 2d 3e 69 73 57 72 69 74 65 4c 6f 63 6b   (p->isWriteLock
0990: 20 7c 7c 20 69 73 57 72 69 74 65 4c 6f 63 6b 29   || isWriteLock)
09a0: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a  ;.      return;.
09b0: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 6e 42 79      }.  }..  nBy
09c0: 74 65 73 20 3d 20 73 69 7a 65 6f 66 28 54 61 62  tes = sizeof(Tab
09d0: 6c 65 4c 6f 63 6b 29 20 2a 20 28 70 50 61 72 73  leLock) * (pPars
09e0: 65 2d 3e 6e 54 61 62 6c 65 4c 6f 63 6b 2b 31 29  e->nTableLock+1)
09f0: 3b 0a 20 20 70 50 61 72 73 65 2d 3e 61 54 61 62  ;.  pParse->aTab
0a00: 6c 65 4c 6f 63 6b 20 3d 20 0a 20 20 20 20 20 20  leLock = .      
0a10: 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63  sqlite3DbRealloc
0a20: 4f 72 46 72 65 65 28 70 50 61 72 73 65 2d 3e 64  OrFree(pParse->d
0a30: 62 2c 20 70 50 61 72 73 65 2d 3e 61 54 61 62 6c  b, pParse->aTabl
0a40: 65 4c 6f 63 6b 2c 20 6e 42 79 74 65 73 29 3b 0a  eLock, nBytes);.
0a50: 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 61 54    if( pParse->aT
0a60: 61 62 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20  ableLock ){.    
0a70: 70 20 3d 20 26 70 50 61 72 73 65 2d 3e 61 54 61  p = &pParse->aTa
0a80: 62 6c 65 4c 6f 63 6b 5b 70 50 61 72 73 65 2d 3e  bleLock[pParse->
0a90: 6e 54 61 62 6c 65 4c 6f 63 6b 2b 2b 5d 3b 0a 20  nTableLock++];. 
0aa0: 20 20 20 70 2d 3e 69 44 62 20 3d 20 69 44 62 3b     p->iDb = iDb;
0ab0: 0a 20 20 20 20 70 2d 3e 69 54 61 62 20 3d 20 69  .    p->iTab = i
0ac0: 54 61 62 3b 0a 20 20 20 20 70 2d 3e 69 73 57 72  Tab;.    p->isWr
0ad0: 69 74 65 4c 6f 63 6b 20 3d 20 69 73 57 72 69 74  iteLock = isWrit
0ae0: 65 4c 6f 63 6b 3b 0a 20 20 20 20 70 2d 3e 7a 4e  eLock;.    p->zN
0af0: 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20 7d  ame = zName;.  }
0b00: 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 72 73 65  else{.    pParse
0b10: 2d 3e 6e 54 61 62 6c 65 4c 6f 63 6b 20 3d 20 30  ->nTableLock = 0
0b20: 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 64 62  ;.    pParse->db
0b30: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d  ->mallocFailed =
0b40: 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a   1;.  }.}../*.**
0b50: 20 43 6f 64 65 20 61 6e 20 4f 50 5f 54 61 62 6c   Code an OP_Tabl
0b60: 65 4c 6f 63 6b 20 69 6e 73 74 72 75 63 74 69 6f  eLock instructio
0b70: 6e 20 66 6f 72 20 65 61 63 68 20 74 61 62 6c 65  n for each table
0b80: 20 6c 6f 63 6b 65 64 20 62 79 20 74 68 65 0a 2a   locked by the.*
0b90: 2a 20 73 74 61 74 65 6d 65 6e 74 20 28 63 6f 6e  * statement (con
0ba0: 66 69 67 75 72 65 64 20 62 79 20 63 61 6c 6c 73  figured by calls
0bb0: 20 74 6f 20 73 71 6c 69 74 65 33 54 61 62 6c 65   to sqlite3Table
0bc0: 4c 6f 63 6b 28 29 29 2e 0a 2a 2f 0a 73 74 61 74  Lock())..*/.stat
0bd0: 69 63 20 76 6f 69 64 20 63 6f 64 65 54 61 62 6c  ic void codeTabl
0be0: 65 4c 6f 63 6b 73 28 50 61 72 73 65 20 2a 70 50  eLocks(Parse *pP
0bf0: 61 72 73 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  arse){.  int i;.
0c00: 20 20 56 64 62 65 20 2a 70 56 64 62 65 3b 20 0a    Vdbe *pVdbe; .
0c10: 0a 20 20 69 66 28 20 30 3d 3d 28 70 56 64 62 65  .  if( 0==(pVdbe
0c20: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
0c30: 65 28 70 50 61 72 73 65 29 29 20 29 7b 0a 20 20  e(pParse)) ){.  
0c40: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20    return;.  }.. 
0c50: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 72   for(i=0; i<pPar
0c60: 73 65 2d 3e 6e 54 61 62 6c 65 4c 6f 63 6b 3b 20  se->nTableLock; 
0c70: 69 2b 2b 29 7b 0a 20 20 20 20 54 61 62 6c 65 4c  i++){.    TableL
0c80: 6f 63 6b 20 2a 70 20 3d 20 26 70 50 61 72 73 65  ock *p = &pParse
0c90: 2d 3e 61 54 61 62 6c 65 4c 6f 63 6b 5b 69 5d 3b  ->aTableLock[i];
0ca0: 0a 20 20 20 20 69 6e 74 20 70 31 20 3d 20 70 2d  .    int p1 = p-
0cb0: 3e 69 44 62 3b 0a 20 20 20 20 73 71 6c 69 74 65  >iDb;.    sqlite
0cc0: 33 56 64 62 65 41 64 64 4f 70 34 28 70 56 64 62  3VdbeAddOp4(pVdb
0cd0: 65 2c 20 4f 50 5f 54 61 62 6c 65 4c 6f 63 6b 2c  e, OP_TableLock,
0ce0: 20 70 31 2c 20 70 2d 3e 69 54 61 62 2c 20 70 2d   p1, p->iTab, p-
0cf0: 3e 69 73 57 72 69 74 65 4c 6f 63 6b 2c 0a 20 20  >isWriteLock,.  
0d00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0d10: 20 20 20 20 70 2d 3e 7a 4e 61 6d 65 2c 20 50 34      p->zName, P4
0d20: 5f 53 54 41 54 49 43 29 3b 0a 20 20 7d 0a 7d 0a  _STATIC);.  }.}.
0d30: 23 65 6c 73 65 0a 20 20 23 64 65 66 69 6e 65 20  #else.  #define 
0d40: 63 6f 64 65 54 61 62 6c 65 4c 6f 63 6b 73 28 78  codeTableLocks(x
0d50: 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ).#endif../*.** 
0d60: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
0d70: 63 61 6c 6c 65 64 20 61 66 74 65 72 20 61 20 73  called after a s
0d80: 69 6e 67 6c 65 20 53 51 4c 20 73 74 61 74 65 6d  ingle SQL statem
0d90: 65 6e 74 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20  ent has been.** 
0da0: 70 61 72 73 65 64 20 61 6e 64 20 61 20 56 44 42  parsed and a VDB
0db0: 45 20 70 72 6f 67 72 61 6d 20 74 6f 20 65 78 65  E program to exe
0dc0: 63 75 74 65 20 74 68 61 74 20 73 74 61 74 65 6d  cute that statem
0dd0: 65 6e 74 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20  ent has been.** 
0de0: 70 72 65 70 61 72 65 64 2e 20 20 54 68 69 73 20  prepared.  This 
0df0: 72 6f 75 74 69 6e 65 20 70 75 74 73 20 74 68 65  routine puts the
0e00: 20 66 69 6e 69 73 68 69 6e 67 20 74 6f 75 63 68   finishing touch
0e10: 65 73 20 6f 6e 20 74 68 65 0a 2a 2a 20 56 44 42  es on the.** VDB
0e20: 45 20 70 72 6f 67 72 61 6d 20 61 6e 64 20 72 65  E program and re
0e30: 73 65 74 73 20 74 68 65 20 70 50 61 72 73 65 20  sets the pParse 
0e40: 73 74 72 75 63 74 75 72 65 20 66 6f 72 20 74 68  structure for th
0e50: 65 20 6e 65 78 74 0a 2a 2a 20 70 61 72 73 65 2e  e next.** parse.
0e60: 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74  .**.** Note that
0e70: 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   if an error occ
0e80: 75 72 72 65 64 2c 20 69 74 20 6d 69 67 68 74 20  urred, it might 
0e90: 62 65 20 74 68 65 20 63 61 73 65 20 74 68 61 74  be the case that
0ea0: 0a 2a 2a 20 6e 6f 20 56 44 42 45 20 63 6f 64 65  .** no VDBE code
0eb0: 20 77 61 73 20 67 65 6e 65 72 61 74 65 64 2e 0a   was generated..
0ec0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 46  */.void sqlite3F
0ed0: 69 6e 69 73 68 43 6f 64 69 6e 67 28 50 61 72 73  inishCoding(Pars
0ee0: 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 73 71  e *pParse){.  sq
0ef0: 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 56 64 62  lite3 *db;.  Vdb
0f00: 65 20 2a 76 3b 0a 0a 20 20 64 62 20 3d 20 70 50  e *v;..  db = pP
0f10: 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20  arse->db;.  if( 
0f20: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
0f30: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
0f40: 20 70 50 61 72 73 65 2d 3e 6e 65 73 74 65 64 20   pParse->nested 
0f50: 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
0f60: 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 20 72  pParse->nErr ) r
0f70: 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 42 65 67  eturn;..  /* Beg
0f80: 69 6e 20 62 79 20 67 65 6e 65 72 61 74 69 6e 67  in by generating
0f90: 20 73 6f 6d 65 20 74 65 72 6d 69 6e 61 74 69 6f   some terminatio
0fa0: 6e 20 63 6f 64 65 20 61 74 20 74 68 65 20 65 6e  n code at the en
0fb0: 64 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 76 64  d of the.  ** vd
0fc0: 62 65 20 70 72 6f 67 72 61 6d 0a 20 20 2a 2f 0a  be program.  */.
0fd0: 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74    v = sqlite3Get
0fe0: 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
0ff0: 69 66 28 20 76 20 29 7b 0a 20 20 20 20 73 71 6c  if( v ){.    sql
1000: 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 28 76  ite3VdbeAddOp0(v
1010: 2c 20 4f 50 5f 48 61 6c 74 29 3b 0a 0a 20 20 20  , OP_Halt);..   
1020: 20 2f 2a 20 54 68 65 20 63 6f 6f 6b 69 65 20 6d   /* The cookie m
1030: 61 73 6b 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 65  ask contains one
1040: 20 62 69 74 20 66 6f 72 20 65 61 63 68 20 64 61   bit for each da
1050: 74 61 62 61 73 65 20 66 69 6c 65 20 6f 70 65 6e  tabase file open
1060: 2e 0a 20 20 20 20 2a 2a 20 28 42 69 74 20 30 20  ..    ** (Bit 0 
1070: 69 73 20 66 6f 72 20 6d 61 69 6e 2c 20 62 69 74  is for main, bit
1080: 20 31 20 69 73 20 66 6f 72 20 74 65 6d 70 2c 20   1 is for temp, 
1090: 61 6e 64 20 73 6f 20 66 6f 72 74 68 2e 29 20 20  and so forth.)  
10a0: 42 69 74 73 20 61 72 65 0a 20 20 20 20 2a 2a 20  Bits are.    ** 
10b0: 73 65 74 20 66 6f 72 20 65 61 63 68 20 64 61 74  set for each dat
10c0: 61 62 61 73 65 20 74 68 61 74 20 69 73 20 75 73  abase that is us
10d0: 65 64 2e 20 20 47 65 6e 65 72 61 74 65 20 63 6f  ed.  Generate co
10e0: 64 65 20 74 6f 20 73 74 61 72 74 20 61 0a 20 20  de to start a.  
10f0: 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e    ** transaction
1100: 20 6f 6e 20 65 61 63 68 20 75 73 65 64 20 64 61   on each used da
1110: 74 61 62 61 73 65 20 61 6e 64 20 74 6f 20 76 65  tabase and to ve
1120: 72 69 66 79 20 74 68 65 20 73 63 68 65 6d 61 20  rify the schema 
1130: 63 6f 6f 6b 69 65 0a 20 20 20 20 2a 2a 20 6f 6e  cookie.    ** on
1140: 20 65 61 63 68 20 75 73 65 64 20 64 61 74 61 62   each used datab
1150: 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ase..    */.    
1160: 69 66 28 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b  if( pParse->cook
1170: 69 65 47 6f 74 6f 3e 30 20 29 7b 0a 20 20 20 20  ieGoto>0 ){.    
1180: 20 20 75 33 32 20 6d 61 73 6b 3b 0a 20 20 20 20    u32 mask;.    
1190: 20 20 69 6e 74 20 69 44 62 3b 0a 20 20 20 20 20    int iDb;.     
11a0: 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
11b0: 48 65 72 65 28 76 2c 20 70 50 61 72 73 65 2d 3e  Here(v, pParse->
11c0: 63 6f 6f 6b 69 65 47 6f 74 6f 2d 31 29 3b 0a 20  cookieGoto-1);. 
11d0: 20 20 20 20 20 66 6f 72 28 69 44 62 3d 30 2c 20       for(iDb=0, 
11e0: 6d 61 73 6b 3d 31 3b 20 69 44 62 3c 64 62 2d 3e  mask=1; iDb<db->
11f0: 6e 44 62 3b 20 6d 61 73 6b 3c 3c 3d 31 2c 20 69  nDb; mask<<=1, i
1200: 44 62 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69  Db++){.        i
1210: 66 28 20 28 6d 61 73 6b 20 26 20 70 50 61 72 73  f( (mask & pPars
1220: 65 2d 3e 63 6f 6f 6b 69 65 4d 61 73 6b 29 3d 3d  e->cookieMask)==
1230: 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
1240: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1250: 65 55 73 65 73 42 74 72 65 65 28 76 2c 20 69 44  eUsesBtree(v, iD
1260: 62 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  b);.        sqli
1270: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1280: 4f 50 5f 54 72 61 6e 73 61 63 74 69 6f 6e 2c 20  OP_Transaction, 
1290: 69 44 62 2c 20 28 6d 61 73 6b 20 26 20 70 50 61  iDb, (mask & pPa
12a0: 72 73 65 2d 3e 77 72 69 74 65 4d 61 73 6b 29 21  rse->writeMask)!
12b0: 3d 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  =0);.        sql
12c0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
12d0: 2c 4f 50 5f 56 65 72 69 66 79 43 6f 6f 6b 69 65  ,OP_VerifyCookie
12e0: 2c 20 69 44 62 2c 20 70 50 61 72 73 65 2d 3e 63  , iDb, pParse->c
12f0: 6f 6f 6b 69 65 56 61 6c 75 65 5b 69 44 62 5d 29  ookieValue[iDb])
1300: 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66 6e 64 65  ;.      }.#ifnde
1310: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
1320: 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 20  RTUALTABLE.     
1330: 20 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69   {.        int i
1340: 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d  ;.        for(i=
1350: 30 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e 56 74  0; i<pParse->nVt
1360: 61 62 4c 6f 63 6b 3b 20 69 2b 2b 29 7b 0a 20 20  abLock; i++){.  
1370: 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 76 74          char *vt
1380: 61 62 20 3d 20 28 63 68 61 72 20 2a 29 70 50 61  ab = (char *)pPa
1390: 72 73 65 2d 3e 61 70 56 74 61 62 4c 6f 63 6b 5b  rse->apVtabLock[
13a0: 69 5d 2d 3e 70 56 74 61 62 3b 0a 20 20 20 20 20  i]->pVtab;.     
13b0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
13c0: 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 56 42 65  AddOp4(v, OP_VBe
13d0: 67 69 6e 2c 20 30 2c 20 30 2c 20 30 2c 20 76 74  gin, 0, 0, 0, vt
13e0: 61 62 2c 20 50 34 5f 56 54 41 42 29 3b 0a 20 20  ab, P4_VTAB);.  
13f0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1400: 70 50 61 72 73 65 2d 3e 6e 56 74 61 62 4c 6f 63  pParse->nVtabLoc
1410: 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 23  k = 0;.      }.#
1420: 65 6e 64 69 66 0a 0a 20 20 20 20 20 20 2f 2a 20  endif..      /* 
1430: 4f 6e 63 65 20 61 6c 6c 20 74 68 65 20 63 6f 6f  Once all the coo
1440: 6b 69 65 73 20 68 61 76 65 20 62 65 65 6e 20 76  kies have been v
1450: 65 72 69 66 69 65 64 20 61 6e 64 20 74 72 61 6e  erified and tran
1460: 73 61 63 74 69 6f 6e 73 20 6f 70 65 6e 65 64 2c  sactions opened,
1470: 20 0a 20 20 20 20 20 20 2a 2a 20 6f 62 74 61 69   .      ** obtai
1480: 6e 20 74 68 65 20 72 65 71 75 69 72 65 64 20 74  n the required t
1490: 61 62 6c 65 2d 6c 6f 63 6b 73 2e 20 54 68 69 73  able-locks. This
14a0: 20 69 73 20 61 20 6e 6f 2d 6f 70 20 75 6e 6c 65   is a no-op unle
14b0: 73 73 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a  ss the .      **
14c0: 20 73 68 61 72 65 64 2d 63 61 63 68 65 20 66 65   shared-cache fe
14d0: 61 74 75 72 65 20 69 73 20 65 6e 61 62 6c 65 64  ature is enabled
14e0: 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
14f0: 20 63 6f 64 65 54 61 62 6c 65 4c 6f 63 6b 73 28   codeTableLocks(
1500: 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 73  pParse);.      s
1510: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1520: 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20  (v, OP_Goto, 0, 
1530: 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 47 6f  pParse->cookieGo
1540: 74 6f 29 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 6e  to);.    }..#ifn
1550: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1560: 54 52 41 43 45 0a 20 20 20 20 69 66 28 20 21 64  TRACE.    if( !d
1570: 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a  b->init.busy ){.
1580: 20 20 20 20 20 20 2f 2a 20 43 68 61 6e 67 65 20        /* Change 
1590: 74 68 65 20 50 34 20 61 72 67 75 6d 65 6e 74 20  the P4 argument 
15a0: 6f 66 20 74 68 65 20 66 69 72 73 74 20 6f 70 63  of the first opc
15b0: 6f 64 65 20 28 77 68 69 63 68 20 77 69 6c 6c 20  ode (which will 
15c0: 61 6c 77 61 79 73 20 62 65 0a 20 20 20 20 20 20  always be.      
15d0: 2a 2a 20 61 6e 20 4f 50 5f 54 72 61 63 65 29 20  ** an OP_Trace) 
15e0: 74 6f 20 62 65 20 74 68 65 20 63 6f 6d 70 6c 65  to be the comple
15f0: 74 65 20 74 65 78 74 20 6f 66 20 74 68 65 20 63  te text of the c
1600: 75 72 72 65 6e 74 20 53 51 4c 20 73 74 61 74 65  urrent SQL state
1610: 6d 65 6e 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  ment..      */. 
1620: 20 20 20 20 20 56 64 62 65 4f 70 20 2a 70 4f 70       VdbeOp *pOp
1630: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 47 65   = sqlite3VdbeGe
1640: 74 4f 70 28 76 2c 20 30 29 3b 0a 20 20 20 20 20  tOp(v, 0);.     
1650: 20 69 66 28 20 70 4f 70 20 26 26 20 70 4f 70 2d   if( pOp && pOp-
1660: 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 54 72 61 63  >opcode==OP_Trac
1670: 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  e ){.        sql
1680: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 34  ite3VdbeChangeP4
1690: 28 76 2c 20 30 2c 20 70 50 61 72 73 65 2d 3e 7a  (v, 0, pParse->z
16a0: 53 71 6c 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Sql,.           
16b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16c0: 20 28 69 6e 74 29 28 70 50 61 72 73 65 2d 3e 7a   (int)(pParse->z
16d0: 54 61 69 6c 20 2d 20 70 50 61 72 73 65 2d 3e 7a  Tail - pParse->z
16e0: 53 71 6c 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Sql));.      }. 
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 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d   assert( pParse-
1810: 3e 64 69 73 61 62 6c 65 43 6f 6c 43 61 63 68 65  >disableColCache
1820: 3d 3d 30 20 29 3b 20 20 2f 2a 20 44 69 73 61 62  ==0 );  /* Disab
1830: 6c 65 73 20 61 6e 64 20 72 65 2d 65 6e 61 62 6c  les and re-enabl
1840: 65 73 20 6d 61 74 63 68 20 2a 2f 0a 20 20 20 20  es match */.    
1850: 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 52  sqlite3VdbeMakeR
1860: 65 61 64 79 28 76 2c 20 70 50 61 72 73 65 2d 3e  eady(v, pParse->
1870: 6e 56 61 72 2c 20 70 50 61 72 73 65 2d 3e 6e 4d  nVar, pParse->nM
1880: 65 6d 2b 33 2c 0a 20 20 20 20 20 20 20 20 20 20  em+3,.          
1890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
18a0: 50 61 72 73 65 2d 3e 6e 54 61 62 2b 33 2c 20 70  Parse->nTab+3, p
18b0: 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 29 3b  Parse->explain);
18c0: 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 72 63 20  .    pParse->rc 
18d0: 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20  = SQLITE_DONE;. 
18e0: 20 20 20 70 50 61 72 73 65 2d 3e 63 6f 6c 4e 61     pParse->colNa
18f0: 6d 65 73 53 65 74 20 3d 20 30 3b 0a 20 20 7d 65  mesSet = 0;.  }e
1900: 6c 73 65 20 69 66 28 20 70 50 61 72 73 65 2d 3e  lse if( pParse->
1910: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1920: 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 72 63 20  .    pParse->rc 
1930: 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  = SQLITE_ERROR;.
1940: 20 20 7d 0a 20 20 70 50 61 72 73 65 2d 3e 6e 54    }.  pParse->nT
1950: 61 62 20 3d 20 30 3b 0a 20 20 70 50 61 72 73 65  ab = 0;.  pParse
1960: 2d 3e 6e 4d 65 6d 20 3d 20 30 3b 0a 20 20 70 50  ->nMem = 0;.  pP
1970: 61 72 73 65 2d 3e 6e 53 65 74 20 3d 20 30 3b 0a  arse->nSet = 0;.
1980: 20 20 70 50 61 72 73 65 2d 3e 6e 56 61 72 20 3d    pParse->nVar =
1990: 20 30 3b 0a 20 20 70 50 61 72 73 65 2d 3e 63 6f   0;.  pParse->co
19a0: 6f 6b 69 65 4d 61 73 6b 20 3d 20 30 3b 0a 20 20  okieMask = 0;.  
19b0: 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 47 6f  pParse->cookieGo
19c0: 74 6f 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  to = 0;.}../*.**
19d0: 20 52 75 6e 20 74 68 65 20 70 61 72 73 65 72 20   Run the parser 
19e0: 61 6e 64 20 63 6f 64 65 20 67 65 6e 65 72 61 74  and code generat
19f0: 6f 72 20 72 65 63 75 72 73 69 76 65 6c 79 20 69  or recursively i
1a00: 6e 20 6f 72 64 65 72 20 74 6f 20 67 65 6e 65 72  n order to gener
1a10: 61 74 65 0a 2a 2a 20 63 6f 64 65 20 66 6f 72 20  ate.** code for 
1a20: 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e  the SQL statemen
1a30: 74 20 67 69 76 65 6e 20 6f 6e 74 6f 20 74 68 65  t given onto the
1a40: 20 65 6e 64 20 6f 66 20 74 68 65 20 70 50 61 72   end of the pPar
1a50: 73 65 20 63 6f 6e 74 65 78 74 0a 2a 2a 20 63 75  se context.** cu
1a60: 72 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f  rrently under co
1a70: 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 57 68 65  nstruction.  Whe
1a80: 6e 20 74 68 65 20 70 61 72 73 65 72 20 69 73 20  n the parser is 
1a90: 72 75 6e 20 72 65 63 75 72 73 69 76 65 6c 79 0a  run recursively.
1aa0: 2a 2a 20 74 68 69 73 20 77 61 79 2c 20 74 68 65  ** this way, the
1ab0: 20 66 69 6e 61 6c 20 4f 50 5f 48 61 6c 74 20 69   final OP_Halt i
1ac0: 73 20 6e 6f 74 20 61 70 70 65 6e 64 65 64 20 61  s not appended a
1ad0: 6e 64 20 6f 74 68 65 72 20 69 6e 69 74 69 61 6c  nd other initial
1ae0: 69 7a 61 74 69 6f 6e 0a 2a 2a 20 61 6e 64 20 66  ization.** and f
1af0: 69 6e 61 6c 69 7a 61 74 69 6f 6e 20 73 74 65 70  inalization step
1b00: 73 20 61 72 65 20 6f 6d 69 74 74 65 64 20 62 65  s are omitted be
1b10: 63 61 75 73 65 20 74 68 6f 73 65 20 61 72 65 20  cause those are 
1b20: 68 61 6e 64 6c 69 6e 67 20 62 79 20 74 68 65 0a  handling by the.
1b30: 2a 2a 20 6f 75 74 65 72 6d 6f 73 74 20 70 61 72  ** outermost par
1b40: 73 65 72 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 20 65  ser..**.** Not e
1b50: 76 65 72 79 74 68 69 6e 67 20 69 73 20 6e 65 73  verything is nes
1b60: 74 61 62 6c 65 2e 20 20 54 68 69 73 20 66 61 63  table.  This fac
1b70: 69 6c 69 74 79 20 69 73 20 64 65 73 69 67 6e 65  ility is designe
1b80: 64 20 74 6f 20 70 65 72 6d 69 74 0a 2a 2a 20 49  d to permit.** I
1b90: 4e 53 45 52 54 2c 20 55 50 44 41 54 45 2c 20 61  NSERT, UPDATE, a
1ba0: 6e 64 20 44 45 4c 45 54 45 20 6f 70 65 72 61 74  nd DELETE operat
1bb0: 69 6f 6e 73 20 61 67 61 69 6e 73 74 20 53 51 4c  ions against SQL
1bc0: 49 54 45 5f 4d 41 53 54 45 52 2e 20 20 55 73 65  ITE_MASTER.  Use
1bd0: 0a 2a 2a 20 63 61 72 65 20 69 66 20 79 6f 75 20  .** care if you 
1be0: 64 65 63 69 64 65 20 74 6f 20 74 72 79 20 74 6f  decide to try to
1bf0: 20 75 73 65 20 74 68 69 73 20 72 6f 75 74 69 6e   use this routin
1c00: 65 20 66 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72  e for some other
1c10: 20 70 75 72 70 6f 73 65 73 2e 0a 2a 2f 0a 76 6f   purposes..*/.vo
1c20: 69 64 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64  id sqlite3Nested
1c30: 50 61 72 73 65 28 50 61 72 73 65 20 2a 70 50 61  Parse(Parse *pPa
1c40: 72 73 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  rse, const char 
1c50: 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a  *zFormat, ...){.
1c60: 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20    va_list ap;.  
1c70: 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20 20 63 68  char *zSql;.  ch
1c80: 61 72 20 2a 7a 45 72 72 4d 73 67 20 3d 20 30 3b  ar *zErrMsg = 0;
1c90: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
1ca0: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 23 20 64   pParse->db;.# d
1cb0: 65 66 69 6e 65 20 53 41 56 45 5f 53 5a 20 20 28  efine SAVE_SZ  (
1cc0: 73 69 7a 65 6f 66 28 50 61 72 73 65 29 20 2d 20  sizeof(Parse) - 
1cd0: 6f 66 66 73 65 74 6f 66 28 50 61 72 73 65 2c 6e  offsetof(Parse,n
1ce0: 56 61 72 29 29 0a 20 20 63 68 61 72 20 73 61 76  Var)).  char sav
1cf0: 65 42 75 66 5b 53 41 56 45 5f 53 5a 5d 3b 0a 0a  eBuf[SAVE_SZ];..
1d00: 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45    if( pParse->nE
1d10: 72 72 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61  rr ) return;.  a
1d20: 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 6e  ssert( pParse->n
1d30: 65 73 74 65 64 3c 31 30 20 29 3b 20 20 2f 2a 20  ested<10 );  /* 
1d40: 4e 65 73 74 69 6e 67 20 73 68 6f 75 6c 64 20 6f  Nesting should o
1d50: 6e 6c 79 20 62 65 20 6f 66 20 6c 69 6d 69 74 65  nly be of limite
1d60: 64 20 64 65 70 74 68 20 2a 2f 0a 20 20 76 61 5f  d depth */.  va_
1d70: 73 74 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61  start(ap, zForma
1d80: 74 29 3b 0a 20 20 7a 53 71 6c 20 3d 20 73 71 6c  t);.  zSql = sql
1d90: 69 74 65 33 56 4d 50 72 69 6e 74 66 28 64 62 2c  ite3VMPrintf(db,
1da0: 20 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20   zFormat, ap);. 
1db0: 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 69   va_end(ap);.  i
1dc0: 66 28 20 7a 53 71 6c 3d 3d 30 20 29 7b 0a 20 20  f( zSql==0 ){.  
1dd0: 20 20 72 65 74 75 72 6e 3b 20 20 20 2f 2a 20 41    return;   /* A
1de0: 20 6d 61 6c 6c 6f 63 20 6d 75 73 74 20 68 61 76   malloc must hav
1df0: 65 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20 7d 0a  e failed */.  }.
1e00: 20 20 70 50 61 72 73 65 2d 3e 6e 65 73 74 65 64    pParse->nested
1e10: 2b 2b 3b 0a 20 20 6d 65 6d 63 70 79 28 73 61 76  ++;.  memcpy(sav
1e20: 65 42 75 66 2c 20 26 70 50 61 72 73 65 2d 3e 6e  eBuf, &pParse->n
1e30: 56 61 72 2c 20 53 41 56 45 5f 53 5a 29 3b 0a 20  Var, SAVE_SZ);. 
1e40: 20 6d 65 6d 73 65 74 28 26 70 50 61 72 73 65 2d   memset(&pParse-
1e50: 3e 6e 56 61 72 2c 20 30 2c 20 53 41 56 45 5f 53  >nVar, 0, SAVE_S
1e60: 5a 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 75 6e  Z);.  sqlite3Run
1e70: 50 61 72 73 65 72 28 70 50 61 72 73 65 2c 20 7a  Parser(pParse, z
1e80: 53 71 6c 2c 20 26 7a 45 72 72 4d 73 67 29 3b 0a  Sql, &zErrMsg);.
1e90: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
1ea0: 64 62 2c 20 7a 45 72 72 4d 73 67 29 3b 0a 20 20  db, zErrMsg);.  
1eb0: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
1ec0: 2c 20 7a 53 71 6c 29 3b 0a 20 20 6d 65 6d 63 70  , zSql);.  memcp
1ed0: 79 28 26 70 50 61 72 73 65 2d 3e 6e 56 61 72 2c  y(&pParse->nVar,
1ee0: 20 73 61 76 65 42 75 66 2c 20 53 41 56 45 5f 53   saveBuf, SAVE_S
1ef0: 5a 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 65  Z);.  pParse->ne
1f00: 73 74 65 64 2d 2d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  sted--;.}../*.**
1f10: 20 4c 6f 63 61 74 65 20 74 68 65 20 69 6e 2d 6d   Locate the in-m
1f20: 65 6d 6f 72 79 20 73 74 72 75 63 74 75 72 65 20  emory structure 
1f30: 74 68 61 74 20 64 65 73 63 72 69 62 65 73 20 61  that describes a
1f40: 20 70 61 72 74 69 63 75 6c 61 72 20 64 61 74 61   particular data
1f50: 62 61 73 65 0a 2a 2a 20 74 61 62 6c 65 20 67 69  base.** table gi
1f60: 76 65 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  ven the name of 
1f70: 74 68 61 74 20 74 61 62 6c 65 20 61 6e 64 20 28  that table and (
1f80: 6f 70 74 69 6f 6e 61 6c 6c 79 29 20 74 68 65 20  optionally) the 
1f90: 6e 61 6d 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64  name of the.** d
1fa0: 61 74 61 62 61 73 65 20 63 6f 6e 74 61 69 6e 69  atabase containi
1fb0: 6e 67 20 74 68 65 20 74 61 62 6c 65 2e 20 20 52  ng the table.  R
1fc0: 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 6e 6f  eturn NULL if no
1fd0: 74 20 66 6f 75 6e 64 2e 0a 2a 2a 0a 2a 2a 20 49  t found..**.** I
1fe0: 66 20 7a 44 61 74 61 62 61 73 65 20 69 73 20 30  f zDatabase is 0
1ff0: 2c 20 61 6c 6c 20 64 61 74 61 62 61 73 65 73 20  , all databases 
2000: 61 72 65 20 73 65 61 72 63 68 65 64 20 66 6f 72  are searched for
2010: 20 74 68 65 20 74 61 62 6c 65 20 61 6e 64 20 74   the table and t
2020: 68 65 0a 2a 2a 20 66 69 72 73 74 20 6d 61 74 63  he.** first matc
2030: 68 69 6e 67 20 74 61 62 6c 65 20 69 73 20 72 65  hing table is re
2040: 74 75 72 6e 65 64 2e 20 20 28 4e 6f 20 63 68 65  turned.  (No che
2050: 63 6b 69 6e 67 20 66 6f 72 20 64 75 70 6c 69 63  cking for duplic
2060: 61 74 65 20 74 61 62 6c 65 0a 2a 2a 20 6e 61 6d  ate table.** nam
2070: 65 73 20 69 73 20 64 6f 6e 65 2e 29 20 20 54 68  es is done.)  Th
2080: 65 20 73 65 61 72 63 68 20 6f 72 64 65 72 20 69  e search order i
2090: 73 20 54 45 4d 50 20 66 69 72 73 74 2c 20 74 68  s TEMP first, th
20a0: 65 6e 20 4d 41 49 4e 2c 20 74 68 65 6e 20 61 6e  en MAIN, then an
20b0: 79 0a 2a 2a 20 61 75 78 69 6c 69 61 72 79 20 64  y.** auxiliary d
20c0: 61 74 61 62 61 73 65 73 20 61 64 64 65 64 20 75  atabases added u
20d0: 73 69 6e 67 20 74 68 65 20 41 54 54 41 43 48 20  sing the ATTACH 
20e0: 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 53  command..**.** S
20f0: 65 65 20 61 6c 73 6f 20 73 71 6c 69 74 65 33 4c  ee also sqlite3L
2100: 6f 63 61 74 65 54 61 62 6c 65 28 29 2e 0a 2a 2f  ocateTable()..*/
2110: 0a 54 61 62 6c 65 20 2a 73 71 6c 69 74 65 33 46  .Table *sqlite3F
2120: 69 6e 64 54 61 62 6c 65 28 73 71 6c 69 74 65 33  indTable(sqlite3
2130: 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68 61 72   *db, const char
2140: 20 2a 7a 4e 61 6d 65 2c 20 63 6f 6e 73 74 20 63   *zName, const c
2150: 68 61 72 20 2a 7a 44 61 74 61 62 61 73 65 29 7b  har *zDatabase){
2160: 0a 20 20 54 61 62 6c 65 20 2a 70 20 3d 20 30 3b  .  Table *p = 0;
2170: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20  .  int i;.  int 
2180: 6e 4e 61 6d 65 3b 0a 20 20 61 73 73 65 72 74 28  nName;.  assert(
2190: 20 7a 4e 61 6d 65 21 3d 30 20 29 3b 0a 20 20 6e   zName!=0 );.  n
21a0: 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 53 74  Name = sqlite3St
21b0: 72 6c 65 6e 28 64 62 2c 20 7a 4e 61 6d 65 29 20  rlen(db, zName) 
21c0: 2b 20 31 3b 0a 20 20 66 6f 72 28 69 3d 4f 4d 49  + 1;.  for(i=OMI
21d0: 54 5f 54 45 4d 50 44 42 3b 20 69 3c 64 62 2d 3e  T_TEMPDB; i<db->
21e0: 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  nDb; i++){.    i
21f0: 6e 74 20 6a 20 3d 20 28 69 3c 32 29 20 3f 20 69  nt j = (i<2) ? i
2200: 5e 31 20 3a 20 69 3b 20 20 20 2f 2a 20 53 65 61  ^1 : i;   /* Sea
2210: 72 63 68 20 54 45 4d 50 20 62 65 66 6f 72 65 20  rch TEMP before 
2220: 4d 41 49 4e 20 2a 2f 0a 20 20 20 20 69 66 28 20  MAIN */.    if( 
2230: 7a 44 61 74 61 62 61 73 65 21 3d 30 20 26 26 20  zDatabase!=0 && 
2240: 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a  sqlite3StrICmp(z
2250: 44 61 74 61 62 61 73 65 2c 20 64 62 2d 3e 61 44  Database, db->aD
2260: 62 5b 6a 5d 2e 7a 4e 61 6d 65 29 20 29 20 63 6f  b[j].zName) ) co
2270: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 70 20 3d 20  ntinue;.    p = 
2280: 73 71 6c 69 74 65 33 48 61 73 68 46 69 6e 64 28  sqlite3HashFind(
2290: 26 64 62 2d 3e 61 44 62 5b 6a 5d 2e 70 53 63 68  &db->aDb[j].pSch
22a0: 65 6d 61 2d 3e 74 62 6c 48 61 73 68 2c 20 7a 4e  ema->tblHash, zN
22b0: 61 6d 65 2c 20 6e 4e 61 6d 65 29 3b 0a 20 20 20  ame, nName);.   
22c0: 20 69 66 28 20 70 20 29 20 62 72 65 61 6b 3b 0a   if( p ) break;.
22d0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a    }.  return p;.
22e0: 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61 74 65 20  }../*.** Locate 
22f0: 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 73 74  the in-memory st
2300: 72 75 63 74 75 72 65 20 74 68 61 74 20 64 65 73  ructure that des
2310: 63 72 69 62 65 73 20 61 20 70 61 72 74 69 63 75  cribes a particu
2320: 6c 61 72 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  lar database.** 
2330: 74 61 62 6c 65 20 67 69 76 65 6e 20 74 68 65 20  table given the 
2340: 6e 61 6d 65 20 6f 66 20 74 68 61 74 20 74 61 62  name of that tab
2350: 6c 65 20 61 6e 64 20 28 6f 70 74 69 6f 6e 61 6c  le and (optional
2360: 6c 79 29 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  ly) the name of 
2370: 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  the.** database 
2380: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 74  containing the t
2390: 61 62 6c 65 2e 20 20 52 65 74 75 72 6e 20 4e 55  able.  Return NU
23a0: 4c 4c 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e  LL if not found.
23b0: 20 20 41 6c 73 6f 20 6c 65 61 76 65 20 61 6e 0a    Also leave an.
23c0: 2a 2a 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  ** error message
23d0: 20 69 6e 20 70 50 61 72 73 65 2d 3e 7a 45 72 72   in pParse->zErr
23e0: 4d 73 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64  Msg..**.** The d
23f0: 69 66 66 65 72 65 6e 63 65 20 62 65 74 77 65 65  ifference betwee
2400: 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61  n this routine a
2410: 6e 64 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61  nd sqlite3FindTa
2420: 62 6c 65 28 29 20 69 73 20 74 68 61 74 20 74 68  ble() is that th
2430: 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 6c 65  is.** routine le
2440: 61 76 65 73 20 61 6e 20 65 72 72 6f 72 20 6d 65  aves an error me
2450: 73 73 61 67 65 20 69 6e 20 70 50 61 72 73 65 2d  ssage in pParse-
2460: 3e 7a 45 72 72 4d 73 67 20 77 68 65 72 65 0a 2a  >zErrMsg where.*
2470: 2a 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62  * sqlite3FindTab
2480: 6c 65 28 29 20 64 6f 65 73 20 6e 6f 74 2e 0a 2a  le() does not..*
2490: 2f 0a 54 61 62 6c 65 20 2a 73 71 6c 69 74 65 33  /.Table *sqlite3
24a0: 4c 6f 63 61 74 65 54 61 62 6c 65 28 0a 20 20 50  LocateTable(.  P
24b0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
24c0: 20 20 20 20 20 20 2f 2a 20 63 6f 6e 74 65 78 74        /* context
24d0: 20 69 6e 20 77 68 69 63 68 20 74 6f 20 72 65 70   in which to rep
24e0: 6f 72 74 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20  ort errors */.  
24f0: 69 6e 74 20 69 73 56 69 65 77 2c 20 20 20 20 20  int isView,     
2500: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
2510: 66 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 61 20  f looking for a 
2520: 56 49 45 57 20 72 61 74 68 65 72 20 74 68 61 6e  VIEW rather than
2530: 20 61 20 54 41 42 4c 45 20 2a 2f 0a 20 20 63 6f   a TABLE */.  co
2540: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c  nst char *zName,
2550: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
2560: 74 68 65 20 74 61 62 6c 65 20 77 65 20 61 72 65  the table we are
2570: 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 2a 2f 0a   looking for */.
2580: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44    const char *zD
2590: 62 61 73 65 20 20 20 20 20 2f 2a 20 4e 61 6d 65  base     /* Name
25a0: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
25b0: 2e 20 20 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c  .  Might be NULL
25c0: 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a   */.){.  Table *
25d0: 70 3b 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74 68  p;..  /* Read th
25e0: 65 20 64 61 74 61 62 61 73 65 20 73 63 68 65 6d  e database schem
25f0: 61 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  a. If an error o
2600: 63 63 75 72 73 2c 20 6c 65 61 76 65 20 61 6e 20  ccurs, leave an 
2610: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 0a 20 20  error message.  
2620: 2a 2a 20 61 6e 64 20 63 6f 64 65 20 69 6e 20 70  ** and code in p
2630: 50 61 72 73 65 20 61 6e 64 20 72 65 74 75 72 6e  Parse and return
2640: 20 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 69 66 28 20   NULL. */.  if( 
2650: 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74  SQLITE_OK!=sqlit
2660: 65 33 52 65 61 64 53 63 68 65 6d 61 28 70 50 61  e3ReadSchema(pPa
2670: 72 73 65 29 20 29 7b 0a 20 20 20 20 72 65 74 75  rse) ){.    retu
2680: 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 70 20 3d  rn 0;.  }..  p =
2690: 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c   sqlite3FindTabl
26a0: 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 7a 4e  e(pParse->db, zN
26b0: 61 6d 65 2c 20 7a 44 62 61 73 65 29 3b 0a 20 20  ame, zDbase);.  
26c0: 69 66 28 20 70 3d 3d 30 20 29 7b 0a 20 20 20 20  if( p==0 ){.    
26d0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 73 67  const char *zMsg
26e0: 20 3d 20 69 73 56 69 65 77 20 3f 20 22 6e 6f 20   = isView ? "no 
26f0: 73 75 63 68 20 76 69 65 77 22 20 3a 20 22 6e 6f  such view" : "no
2700: 20 73 75 63 68 20 74 61 62 6c 65 22 3b 0a 20 20   such table";.  
2710: 20 20 69 66 28 20 7a 44 62 61 73 65 20 29 7b 0a    if( zDbase ){.
2720: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
2730: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 25  orMsg(pParse, "%
2740: 73 3a 20 25 73 2e 25 73 22 2c 20 7a 4d 73 67 2c  s: %s.%s", zMsg,
2750: 20 7a 44 62 61 73 65 2c 20 7a 4e 61 6d 65 29 3b   zDbase, zName);
2760: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
2770: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
2780: 67 28 70 50 61 72 73 65 2c 20 22 25 73 3a 20 25  g(pParse, "%s: %
2790: 73 22 2c 20 7a 4d 73 67 2c 20 7a 4e 61 6d 65 29  s", zMsg, zName)
27a0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 72  ;.    }.    pPar
27b0: 73 65 2d 3e 63 68 65 63 6b 53 63 68 65 6d 61 20  se->checkSchema 
27c0: 3d 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 1;.  }.  retur
27d0: 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f  n p;.}../*.** Lo
27e0: 63 61 74 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f  cate the in-memo
27f0: 72 79 20 73 74 72 75 63 74 75 72 65 20 74 68 61  ry structure tha
2800: 74 20 64 65 73 63 72 69 62 65 73 20 0a 2a 2a 20  t describes .** 
2810: 61 20 70 61 72 74 69 63 75 6c 61 72 20 69 6e 64  a particular ind
2820: 65 78 20 67 69 76 65 6e 20 74 68 65 20 6e 61 6d  ex given the nam
2830: 65 20 6f 66 20 74 68 61 74 20 69 6e 64 65 78 0a  e of that index.
2840: 2a 2a 20 61 6e 64 20 74 68 65 20 6e 61 6d 65 20  ** and the name 
2850: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
2860: 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68  that contains th
2870: 65 20 69 6e 64 65 78 2e 0a 2a 2a 20 52 65 74 75  e index..** Retu
2880: 72 6e 20 4e 55 4c 4c 20 69 66 20 6e 6f 74 20 66  rn NULL if not f
2890: 6f 75 6e 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a  ound..**.** If z
28a0: 44 61 74 61 62 61 73 65 20 69 73 20 30 2c 20 61  Database is 0, a
28b0: 6c 6c 20 64 61 74 61 62 61 73 65 73 20 61 72 65  ll databases are
28c0: 20 73 65 61 72 63 68 65 64 20 66 6f 72 20 74 68   searched for th
28d0: 65 0a 2a 2a 20 74 61 62 6c 65 20 61 6e 64 20 74  e.** table and t
28e0: 68 65 20 66 69 72 73 74 20 6d 61 74 63 68 69 6e  he first matchin
28f0: 67 20 69 6e 64 65 78 20 69 73 20 72 65 74 75 72  g index is retur
2900: 6e 65 64 2e 20 20 28 4e 6f 20 63 68 65 63 6b 69  ned.  (No checki
2910: 6e 67 0a 2a 2a 20 66 6f 72 20 64 75 70 6c 69 63  ng.** for duplic
2920: 61 74 65 20 69 6e 64 65 78 20 6e 61 6d 65 73 20  ate index names 
2930: 69 73 20 64 6f 6e 65 2e 29 20 20 54 68 65 20 73  is done.)  The s
2940: 65 61 72 63 68 20 6f 72 64 65 72 20 69 73 0a 2a  earch order is.*
2950: 2a 20 54 45 4d 50 20 66 69 72 73 74 2c 20 74 68  * TEMP first, th
2960: 65 6e 20 4d 41 49 4e 2c 20 74 68 65 6e 20 61 6e  en MAIN, then an
2970: 79 20 61 75 78 69 6c 69 61 72 79 20 64 61 74 61  y auxiliary data
2980: 62 61 73 65 73 20 61 64 64 65 64 0a 2a 2a 20 75  bases added.** u
2990: 73 69 6e 67 20 74 68 65 20 41 54 54 41 43 48 20  sing the ATTACH 
29a0: 63 6f 6d 6d 61 6e 64 2e 0a 2a 2f 0a 49 6e 64 65  command..*/.Inde
29b0: 78 20 2a 73 71 6c 69 74 65 33 46 69 6e 64 49 6e  x *sqlite3FindIn
29c0: 64 65 78 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  dex(sqlite3 *db,
29d0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
29e0: 6d 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  me, const char *
29f0: 7a 44 62 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70  zDb){.  Index *p
2a00: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 20   = 0;.  int i;. 
2a10: 20 69 6e 74 20 6e 4e 61 6d 65 20 3d 20 73 71 6c   int nName = sql
2a20: 69 74 65 33 53 74 72 6c 65 6e 28 64 62 2c 20 7a  ite3Strlen(db, z
2a30: 4e 61 6d 65 29 2b 31 3b 0a 20 20 66 6f 72 28 69  Name)+1;.  for(i
2a40: 3d 4f 4d 49 54 5f 54 45 4d 50 44 42 3b 20 69 3c  =OMIT_TEMPDB; i<
2a50: 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20  db->nDb; i++){. 
2a60: 20 20 20 69 6e 74 20 6a 20 3d 20 28 69 3c 32 29     int j = (i<2)
2a70: 20 3f 20 69 5e 31 20 3a 20 69 3b 20 20 2f 2a 20   ? i^1 : i;  /* 
2a80: 53 65 61 72 63 68 20 54 45 4d 50 20 62 65 66 6f  Search TEMP befo
2a90: 72 65 20 4d 41 49 4e 20 2a 2f 0a 20 20 20 20 53  re MAIN */.    S
2aa0: 63 68 65 6d 61 20 2a 70 53 63 68 65 6d 61 20 3d  chema *pSchema =
2ab0: 20 64 62 2d 3e 61 44 62 5b 6a 5d 2e 70 53 63 68   db->aDb[j].pSch
2ac0: 65 6d 61 3b 0a 20 20 20 20 69 66 28 20 7a 44 62  ema;.    if( zDb
2ad0: 20 26 26 20 73 71 6c 69 74 65 33 53 74 72 49 43   && sqlite3StrIC
2ae0: 6d 70 28 7a 44 62 2c 20 64 62 2d 3e 61 44 62 5b  mp(zDb, db->aDb[
2af0: 6a 5d 2e 7a 4e 61 6d 65 29 20 29 20 63 6f 6e 74  j].zName) ) cont
2b00: 69 6e 75 65 3b 0a 20 20 20 20 61 73 73 65 72 74  inue;.    assert
2b10: 28 20 70 53 63 68 65 6d 61 20 7c 7c 20 28 6a 3d  ( pSchema || (j=
2b20: 3d 31 20 26 26 20 21 64 62 2d 3e 61 44 62 5b 31  =1 && !db->aDb[1
2b30: 5d 2e 70 42 74 29 20 29 3b 0a 20 20 20 20 69 66  ].pBt) );.    if
2b40: 28 20 70 53 63 68 65 6d 61 20 29 7b 0a 20 20 20  ( pSchema ){.   
2b50: 20 20 20 70 20 3d 20 73 71 6c 69 74 65 33 48 61     p = sqlite3Ha
2b60: 73 68 46 69 6e 64 28 26 70 53 63 68 65 6d 61 2d  shFind(&pSchema-
2b70: 3e 69 64 78 48 61 73 68 2c 20 7a 4e 61 6d 65 2c  >idxHash, zName,
2b80: 20 6e 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20   nName);.    }. 
2b90: 20 20 20 69 66 28 20 70 20 29 20 62 72 65 61 6b     if( p ) break
2ba0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
2bb0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6c 61  ;.}../*.** Recla
2bc0: 69 6d 20 74 68 65 20 6d 65 6d 6f 72 79 20 75 73  im the memory us
2bd0: 65 64 20 62 79 20 61 6e 20 69 6e 64 65 78 0a 2a  ed by an index.*
2be0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 72  /.static void fr
2bf0: 65 65 49 6e 64 65 78 28 49 6e 64 65 78 20 2a 70  eeIndex(Index *p
2c00: 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
2c10: 20 3d 20 70 2d 3e 70 54 61 62 6c 65 2d 3e 64 62   = p->pTable->db
2c20: 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  ;.  sqlite3DbFre
2c30: 65 28 64 62 2c 20 70 2d 3e 7a 43 6f 6c 41 66 66  e(db, p->zColAff
2c40: 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  );.  sqlite3DbFr
2c50: 65 65 28 64 62 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a  ee(db, p);.}../*
2c60: 0a 2a 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 67  .** Remove the g
2c70: 69 76 65 6e 20 69 6e 64 65 78 20 66 72 6f 6d 20  iven index from 
2c80: 74 68 65 20 69 6e 64 65 78 20 68 61 73 68 20 74  the index hash t
2c90: 61 62 6c 65 2c 20 61 6e 64 20 66 72 65 65 0a 2a  able, and free.*
2ca0: 2a 20 69 74 73 20 6d 65 6d 6f 72 79 20 73 74 72  * its memory str
2cb0: 75 63 74 75 72 65 73 2e 0a 2a 2a 0a 2a 2a 20 54  uctures..**.** T
2cc0: 68 65 20 69 6e 64 65 78 20 69 73 20 72 65 6d 6f  he index is remo
2cd0: 76 65 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74  ved from the dat
2ce0: 61 62 61 73 65 20 68 61 73 68 20 74 61 62 6c 65  abase hash table
2cf0: 73 20 62 75 74 0a 2a 2a 20 69 74 20 69 73 20 6e  s but.** it is n
2d00: 6f 74 20 75 6e 6c 69 6e 6b 65 64 20 66 72 6f 6d  ot unlinked from
2d10: 20 74 68 65 20 54 61 62 6c 65 20 74 68 61 74 20   the Table that 
2d20: 69 74 20 69 6e 64 65 78 65 73 2e 0a 2a 2a 20 55  it indexes..** U
2d30: 6e 6c 69 6e 6b 69 6e 67 20 66 72 6f 6d 20 74 68  nlinking from th
2d40: 65 20 54 61 62 6c 65 20 6d 75 73 74 20 62 65 20  e Table must be 
2d50: 64 6f 6e 65 20 62 79 20 74 68 65 20 63 61 6c 6c  done by the call
2d60: 69 6e 67 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f  ing function..*/
2d70: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c  .static void sql
2d80: 69 74 65 44 65 6c 65 74 65 49 6e 64 65 78 28 49  iteDeleteIndex(I
2d90: 6e 64 65 78 20 2a 70 29 7b 0a 20 20 49 6e 64 65  ndex *p){.  Inde
2da0: 78 20 2a 70 4f 6c 64 3b 0a 20 20 63 6f 6e 73 74  x *pOld;.  const
2db0: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 70   char *zName = p
2dc0: 2d 3e 7a 4e 61 6d 65 3b 0a 0a 20 20 70 4f 6c 64  ->zName;..  pOld
2dd0: 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e   = sqlite3HashIn
2de0: 73 65 72 74 28 26 70 2d 3e 70 53 63 68 65 6d 61  sert(&p->pSchema
2df0: 2d 3e 69 64 78 48 61 73 68 2c 20 7a 4e 61 6d 65  ->idxHash, zName
2e00: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
2e10: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
2e20: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4e 61  ite3Strlen30(zNa
2e30: 6d 65 29 2b 31 2c 20 30 29 3b 0a 20 20 61 73 73  me)+1, 0);.  ass
2e40: 65 72 74 28 20 70 4f 6c 64 3d 3d 30 20 7c 7c 20  ert( pOld==0 || 
2e50: 70 4f 6c 64 3d 3d 70 20 29 3b 0a 20 20 66 72 65  pOld==p );.  fre
2e60: 65 49 6e 64 65 78 28 70 29 3b 0a 7d 0a 0a 2f 2a  eIndex(p);.}../*
2e70: 0a 2a 2a 20 46 6f 72 20 74 68 65 20 69 6e 64 65  .** For the inde
2e80: 78 20 63 61 6c 6c 65 64 20 7a 49 64 78 4e 61 6d  x called zIdxNam
2e90: 65 20 77 68 69 63 68 20 69 73 20 66 6f 75 6e 64  e which is found
2ea0: 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
2eb0: 20 69 44 62 2c 0a 2a 2a 20 75 6e 6c 69 6b 65 20   iDb,.** unlike 
2ec0: 74 68 61 74 20 69 6e 64 65 78 20 66 72 6f 6d 20  that index from 
2ed0: 69 74 73 20 54 61 62 6c 65 20 74 68 65 6e 20 72  its Table then r
2ee0: 65 6d 6f 76 65 20 74 68 65 20 69 6e 64 65 78 20  emove the index 
2ef0: 66 72 6f 6d 0a 2a 2a 20 74 68 65 20 69 6e 64 65  from.** the inde
2f00: 78 20 68 61 73 68 20 74 61 62 6c 65 20 61 6e 64  x hash table and
2f10: 20 66 72 65 65 20 61 6c 6c 20 6d 65 6d 6f 72 79   free all memory
2f20: 20 73 74 72 75 63 74 75 72 65 73 20 61 73 73 6f   structures asso
2f30: 63 69 61 74 65 64 0a 2a 2a 20 77 69 74 68 20 74  ciated.** with t
2f40: 68 65 20 69 6e 64 65 78 2e 0a 2a 2f 0a 76 6f 69  he index..*/.voi
2f50: 64 20 73 71 6c 69 74 65 33 55 6e 6c 69 6e 6b 41  d sqlite3UnlinkA
2f60: 6e 64 44 65 6c 65 74 65 49 6e 64 65 78 28 73 71  ndDeleteIndex(sq
2f70: 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 69  lite3 *db, int i
2f80: 44 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  Db, const char *
2f90: 7a 49 64 78 4e 61 6d 65 29 7b 0a 20 20 49 6e 64  zIdxName){.  Ind
2fa0: 65 78 20 2a 70 49 6e 64 65 78 3b 0a 20 20 69 6e  ex *pIndex;.  in
2fb0: 74 20 6c 65 6e 3b 0a 20 20 48 61 73 68 20 2a 70  t len;.  Hash *p
2fc0: 48 61 73 68 20 3d 20 26 64 62 2d 3e 61 44 62 5b  Hash = &db->aDb[
2fd0: 69 44 62 5d 2e 70 53 63 68 65 6d 61 2d 3e 69 64  iDb].pSchema->id
2fe0: 78 48 61 73 68 3b 0a 0a 20 20 6c 65 6e 20 3d 20  xHash;..  len = 
2ff0: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 28 64 62  sqlite3Strlen(db
3000: 2c 20 7a 49 64 78 4e 61 6d 65 29 3b 0a 20 20 70  , zIdxName);.  p
3010: 49 6e 64 65 78 20 3d 20 73 71 6c 69 74 65 33 48  Index = sqlite3H
3020: 61 73 68 49 6e 73 65 72 74 28 70 48 61 73 68 2c  ashInsert(pHash,
3030: 20 7a 49 64 78 4e 61 6d 65 2c 20 6c 65 6e 2b 31   zIdxName, len+1
3040: 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 49 6e 64  , 0);.  if( pInd
3050: 65 78 20 29 7b 0a 20 20 20 20 69 66 28 20 70 49  ex ){.    if( pI
3060: 6e 64 65 78 2d 3e 70 54 61 62 6c 65 2d 3e 70 49  ndex->pTable->pI
3070: 6e 64 65 78 3d 3d 70 49 6e 64 65 78 20 29 7b 0a  ndex==pIndex ){.
3080: 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 70 54        pIndex->pT
3090: 61 62 6c 65 2d 3e 70 49 6e 64 65 78 20 3d 20 70  able->pIndex = p
30a0: 49 6e 64 65 78 2d 3e 70 4e 65 78 74 3b 0a 20 20  Index->pNext;.  
30b0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 49    }else{.      I
30c0: 6e 64 65 78 20 2a 70 3b 0a 20 20 20 20 20 20 66  ndex *p;.      f
30d0: 6f 72 28 70 3d 70 49 6e 64 65 78 2d 3e 70 54 61  or(p=pIndex->pTa
30e0: 62 6c 65 2d 3e 70 49 6e 64 65 78 3b 20 70 20 26  ble->pIndex; p &
30f0: 26 20 70 2d 3e 70 4e 65 78 74 21 3d 70 49 6e 64  & p->pNext!=pInd
3100: 65 78 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b  ex; p=p->pNext){
3110: 7d 0a 20 20 20 20 20 20 69 66 28 20 70 20 26 26  }.      if( p &&
3120: 20 70 2d 3e 70 4e 65 78 74 3d 3d 70 49 6e 64 65   p->pNext==pInde
3130: 78 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e  x ){.        p->
3140: 70 4e 65 78 74 20 3d 20 70 49 6e 64 65 78 2d 3e  pNext = pIndex->
3150: 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20  pNext;.      }. 
3160: 20 20 20 7d 0a 20 20 20 20 66 72 65 65 49 6e 64     }.    freeInd
3170: 65 78 28 70 49 6e 64 65 78 29 3b 0a 20 20 7d 0a  ex(pIndex);.  }.
3180: 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53    db->flags |= S
3190: 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e  QLITE_InternChan
31a0: 67 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 72  ges;.}../*.** Er
31b0: 61 73 65 20 61 6c 6c 20 73 63 68 65 6d 61 20 69  ase all schema i
31c0: 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20  nformation from 
31d0: 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 68 61  the in-memory ha
31e0: 73 68 20 74 61 62 6c 65 73 20 6f 66 0a 2a 2a 20  sh tables of.** 
31f0: 61 20 73 69 6e 67 6c 65 20 64 61 74 61 62 61 73  a single databas
3200: 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  e.  This routine
3210: 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 72 65   is called to re
3220: 63 6c 61 69 6d 20 6d 65 6d 6f 72 79 0a 2a 2a 20  claim memory.** 
3230: 62 65 66 6f 72 65 20 74 68 65 20 64 61 74 61 62  before the datab
3240: 61 73 65 20 63 6c 6f 73 65 73 2e 20 20 49 74 20  ase closes.  It 
3250: 69 73 20 61 6c 73 6f 20 63 61 6c 6c 65 64 20 64  is also called d
3260: 75 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b  uring a rollback
3270: 0a 2a 2a 20 69 66 20 74 68 65 72 65 20 77 65 72  .** if there wer
3280: 65 20 73 63 68 65 6d 61 20 63 68 61 6e 67 65 73  e schema changes
3290: 20 64 75 72 69 6e 67 20 74 68 65 20 74 72 61 6e   during the tran
32a0: 73 61 63 74 69 6f 6e 20 6f 72 20 69 66 20 61 0a  saction or if a.
32b0: 2a 2a 20 73 63 68 65 6d 61 2d 63 6f 6f 6b 69 65  ** schema-cookie
32c0: 20 6d 69 73 6d 61 74 63 68 20 6f 63 63 75 72 73   mismatch occurs
32d0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 69 44 62 3c 3d  ..**.** If iDb<=
32e0: 30 20 74 68 65 6e 20 72 65 73 65 74 20 74 68 65  0 then reset the
32f0: 20 69 6e 74 65 72 6e 61 6c 20 73 63 68 65 6d 61   internal schema
3300: 20 74 61 62 6c 65 73 20 66 6f 72 20 61 6c 6c 20   tables for all 
3310: 64 61 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65  database.** file
3320: 73 2e 20 20 49 66 20 69 44 62 3e 3d 32 20 74 68  s.  If iDb>=2 th
3330: 65 6e 20 72 65 73 65 74 20 74 68 65 20 69 6e 74  en reset the int
3340: 65 72 6e 61 6c 20 73 63 68 65 6d 61 20 66 6f 72  ernal schema for
3350: 20 6f 6e 6c 79 20 74 68 65 0a 2a 2a 20 73 69 6e   only the.** sin
3360: 67 6c 65 20 66 69 6c 65 20 69 6e 64 69 63 61 74  gle file indicat
3370: 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ed..*/.void sqli
3380: 74 65 33 52 65 73 65 74 49 6e 74 65 72 6e 61 6c  te3ResetInternal
3390: 53 63 68 65 6d 61 28 73 71 6c 69 74 65 33 20 2a  Schema(sqlite3 *
33a0: 64 62 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20 20  db, int iDb){.  
33b0: 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 61 73 73 65  int i, j;.  asse
33c0: 72 74 28 20 69 44 62 3e 3d 30 20 26 26 20 69 44  rt( iDb>=0 && iD
33d0: 62 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 0a 20 20  b<db->nDb );..  
33e0: 69 66 28 20 69 44 62 3d 3d 30 20 29 7b 0a 20 20  if( iDb==0 ){.  
33f0: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
3400: 74 65 72 41 6c 6c 28 64 62 29 3b 0a 20 20 7d 0a  terAll(db);.  }.
3410: 20 20 66 6f 72 28 69 3d 69 44 62 3b 20 69 3c 64    for(i=iDb; i<d
3420: 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20  b->nDb; i++){.  
3430: 20 20 44 62 20 2a 70 44 62 20 3d 20 26 64 62 2d    Db *pDb = &db-
3440: 3e 61 44 62 5b 69 5d 3b 0a 20 20 20 20 69 66 28  >aDb[i];.    if(
3450: 20 70 44 62 2d 3e 70 53 63 68 65 6d 61 20 29 7b   pDb->pSchema ){
3460: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 69 3d  .      assert(i=
3470: 3d 31 20 7c 7c 20 28 70 44 62 2d 3e 70 42 74 20  =1 || (pDb->pBt 
3480: 26 26 20 73 71 6c 69 74 65 33 42 74 72 65 65 48  && sqlite3BtreeH
3490: 6f 6c 64 73 4d 75 74 65 78 28 70 44 62 2d 3e 70  oldsMutex(pDb->p
34a0: 42 74 29 29 29 3b 0a 20 20 20 20 20 20 73 71 6c  Bt)));.      sql
34b0: 69 74 65 33 53 63 68 65 6d 61 46 72 65 65 28 70  ite3SchemaFree(p
34c0: 44 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20  Db->pSchema);.  
34d0: 20 20 7d 0a 20 20 20 20 69 66 28 20 69 44 62 3e    }.    if( iDb>
34e0: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a  0 ) return;.  }.
34f0: 20 20 61 73 73 65 72 74 28 20 69 44 62 3d 3d 30    assert( iDb==0
3500: 20 29 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20   );.  db->flags 
3510: 26 3d 20 7e 53 51 4c 49 54 45 5f 49 6e 74 65 72  &= ~SQLITE_Inter
3520: 6e 43 68 61 6e 67 65 73 3b 0a 20 20 73 71 6c 69  nChanges;.  sqli
3530: 74 65 33 42 74 72 65 65 4c 65 61 76 65 41 6c 6c  te3BtreeLeaveAll
3540: 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 6f  (db);..  /* If o
3550: 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 66 20 74 68  ne or more of th
3560: 65 20 61 75 78 69 6c 69 61 72 79 20 64 61 74 61  e auxiliary data
3570: 62 61 73 65 20 66 69 6c 65 73 20 68 61 73 20 62  base files has b
3580: 65 65 6e 20 63 6c 6f 73 65 64 2c 0a 20 20 2a 2a  een closed,.  **
3590: 20 74 68 65 6e 20 72 65 6d 6f 76 65 20 74 68 65   then remove the
35a0: 6d 20 66 72 6f 6d 20 74 68 65 20 61 75 78 69 6c  m from the auxil
35b0: 69 61 72 79 20 64 61 74 61 62 61 73 65 20 6c 69  iary database li
35c0: 73 74 2e 20 20 57 65 20 74 61 6b 65 20 74 68 65  st.  We take the
35d0: 0a 20 20 2a 2a 20 6f 70 70 6f 72 74 75 6e 69 74  .  ** opportunit
35e0: 79 20 74 6f 20 64 6f 20 74 68 69 73 20 68 65 72  y to do this her
35f0: 65 20 73 69 6e 63 65 20 77 65 20 68 61 76 65 20  e since we have 
3600: 6a 75 73 74 20 64 65 6c 65 74 65 64 20 61 6c 6c  just deleted all
3610: 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 73 63 68   of the.  ** sch
3620: 65 6d 61 20 68 61 73 68 20 74 61 62 6c 65 73 20  ema hash tables 
3630: 61 6e 64 20 74 68 65 72 65 66 6f 72 65 20 64 6f  and therefore do
3640: 20 6e 6f 74 20 68 61 76 65 20 74 6f 20 6d 61 6b   not have to mak
3650: 65 20 61 6e 79 20 63 68 61 6e 67 65 73 0a 20 20  e any changes.  
3660: 2a 2a 20 74 6f 20 61 6e 79 20 6f 66 20 74 68 6f  ** to any of tho
3670: 73 65 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2f 0a  se tables..  */.
3680: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d    for(i=0; i<db-
3690: 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nDb; i++){.    
36a0: 73 74 72 75 63 74 20 44 62 20 2a 70 44 62 20 3d  struct Db *pDb =
36b0: 20 26 64 62 2d 3e 61 44 62 5b 69 5d 3b 0a 20 20   &db->aDb[i];.  
36c0: 20 20 69 66 28 20 70 44 62 2d 3e 70 42 74 3d 3d    if( pDb->pBt==
36d0: 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  0 ){.      if( p
36e0: 44 62 2d 3e 70 41 75 78 20 26 26 20 70 44 62 2d  Db->pAux && pDb-
36f0: 3e 78 46 72 65 65 41 75 78 20 29 20 70 44 62 2d  >xFreeAux ) pDb-
3700: 3e 78 46 72 65 65 41 75 78 28 70 44 62 2d 3e 70  >xFreeAux(pDb->p
3710: 41 75 78 29 3b 0a 20 20 20 20 20 20 70 44 62 2d  Aux);.      pDb-
3720: 3e 70 41 75 78 20 3d 20 30 3b 0a 20 20 20 20 7d  >pAux = 0;.    }
3730: 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 6a 3d 32  .  }.  for(i=j=2
3740: 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b  ; i<db->nDb; i++
3750: 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 44 62  ){.    struct Db
3760: 20 2a 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62   *pDb = &db->aDb
3770: 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 70 44 62  [i];.    if( pDb
3780: 2d 3e 70 42 74 3d 3d 30 20 29 7b 0a 20 20 20 20  ->pBt==0 ){.    
3790: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
37a0: 64 62 2c 20 70 44 62 2d 3e 7a 4e 61 6d 65 29 3b  db, pDb->zName);
37b0: 0a 20 20 20 20 20 20 70 44 62 2d 3e 7a 4e 61 6d  .      pDb->zNam
37c0: 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 63 6f 6e  e = 0;.      con
37d0: 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20  tinue;.    }.   
37e0: 20 69 66 28 20 6a 3c 69 20 29 7b 0a 20 20 20 20   if( j<i ){.    
37f0: 20 20 64 62 2d 3e 61 44 62 5b 6a 5d 20 3d 20 64    db->aDb[j] = d
3800: 62 2d 3e 61 44 62 5b 69 5d 3b 0a 20 20 20 20 7d  b->aDb[i];.    }
3810: 0a 20 20 20 20 6a 2b 2b 3b 0a 20 20 7d 0a 20 20  .    j++;.  }.  
3820: 6d 65 6d 73 65 74 28 26 64 62 2d 3e 61 44 62 5b  memset(&db->aDb[
3830: 6a 5d 2c 20 30 2c 20 28 64 62 2d 3e 6e 44 62 2d  j], 0, (db->nDb-
3840: 6a 29 2a 73 69 7a 65 6f 66 28 64 62 2d 3e 61 44  j)*sizeof(db->aD
3850: 62 5b 6a 5d 29 29 3b 0a 20 20 64 62 2d 3e 6e 44  b[j]));.  db->nD
3860: 62 20 3d 20 6a 3b 0a 20 20 69 66 28 20 64 62 2d  b = j;.  if( db-
3870: 3e 6e 44 62 3c 3d 32 20 26 26 20 64 62 2d 3e 61  >nDb<=2 && db->a
3880: 44 62 21 3d 64 62 2d 3e 61 44 62 53 74 61 74 69  Db!=db->aDbStati
3890: 63 20 29 7b 0a 20 20 20 20 6d 65 6d 63 70 79 28  c ){.    memcpy(
38a0: 64 62 2d 3e 61 44 62 53 74 61 74 69 63 2c 20 64  db->aDbStatic, d
38b0: 62 2d 3e 61 44 62 2c 20 32 2a 73 69 7a 65 6f 66  b->aDb, 2*sizeof
38c0: 28 64 62 2d 3e 61 44 62 5b 30 5d 29 29 3b 0a 20  (db->aDb[0]));. 
38d0: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
38e0: 28 64 62 2c 20 64 62 2d 3e 61 44 62 29 3b 0a 20  (db, db->aDb);. 
38f0: 20 20 20 64 62 2d 3e 61 44 62 20 3d 20 64 62 2d     db->aDb = db-
3900: 3e 61 44 62 53 74 61 74 69 63 3b 0a 20 20 7d 0a  >aDbStatic;.  }.
3910: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
3920: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
3930: 77 68 65 6e 20 61 20 63 6f 6d 6d 69 74 20 6f 63  when a commit oc
3940: 63 75 72 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  curs..*/.void sq
3950: 6c 69 74 65 33 43 6f 6d 6d 69 74 49 6e 74 65 72  lite3CommitInter
3960: 6e 61 6c 43 68 61 6e 67 65 73 28 73 71 6c 69 74  nalChanges(sqlit
3970: 65 33 20 2a 64 62 29 7b 0a 20 20 64 62 2d 3e 66  e3 *db){.  db->f
3980: 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f  lags &= ~SQLITE_
3990: 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a 7d  InternChanges;.}
39a0: 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 74 68  ../*.** Clear th
39b0: 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 66  e column names f
39c0: 72 6f 6d 20 61 20 74 61 62 6c 65 20 6f 72 20 76  rom a table or v
39d0: 69 65 77 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  iew..*/.static v
39e0: 6f 69 64 20 73 71 6c 69 74 65 52 65 73 65 74 43  oid sqliteResetC
39f0: 6f 6c 75 6d 6e 4e 61 6d 65 73 28 54 61 62 6c 65  olumnNames(Table
3a00: 20 2a 70 54 61 62 6c 65 29 7b 0a 20 20 69 6e 74   *pTable){.  int
3a10: 20 69 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43   i;.  Column *pC
3a20: 6f 6c 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  ol;.  sqlite3 *d
3a30: 62 20 3d 20 70 54 61 62 6c 65 2d 3e 64 62 3b 0a  b = pTable->db;.
3a40: 20 20 61 73 73 65 72 74 28 20 70 54 61 62 6c 65    assert( pTable
3a50: 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 28 70 43  !=0 );.  if( (pC
3a60: 6f 6c 20 3d 20 70 54 61 62 6c 65 2d 3e 61 43 6f  ol = pTable->aCo
3a70: 6c 29 21 3d 30 20 29 7b 0a 20 20 20 20 66 6f 72  l)!=0 ){.    for
3a80: 28 69 3d 30 3b 20 69 3c 70 54 61 62 6c 65 2d 3e  (i=0; i<pTable->
3a90: 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b  nCol; i++, pCol+
3aa0: 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  +){.      sqlite
3ab0: 33 44 62 46 72 65 65 28 64 62 2c 20 70 43 6f 6c  3DbFree(db, pCol
3ac0: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ->zName);.      
3ad0: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
3ae0: 65 28 64 62 2c 20 70 43 6f 6c 2d 3e 70 44 66 6c  e(db, pCol->pDfl
3af0: 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
3b00: 33 44 62 46 72 65 65 28 64 62 2c 20 70 43 6f 6c  3DbFree(db, pCol
3b10: 2d 3e 7a 54 79 70 65 29 3b 0a 20 20 20 20 20 20  ->zType);.      
3b20: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
3b30: 2c 20 70 43 6f 6c 2d 3e 7a 43 6f 6c 6c 29 3b 0a  , pCol->zColl);.
3b40: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
3b50: 33 44 62 46 72 65 65 28 64 62 2c 20 70 54 61 62  3DbFree(db, pTab
3b60: 6c 65 2d 3e 61 43 6f 6c 29 3b 0a 20 20 7d 0a 20  le->aCol);.  }. 
3b70: 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 20 3d 20   pTable->aCol = 
3b80: 30 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 6e 43 6f  0;.  pTable->nCo
3b90: 6c 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  l = 0;.}../*.** 
3ba0: 52 65 6d 6f 76 65 20 74 68 65 20 6d 65 6d 6f 72  Remove the memor
3bb0: 79 20 64 61 74 61 20 73 74 72 75 63 74 75 72 65  y data structure
3bc0: 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
3bd0: 68 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20 54  h the given.** T
3be0: 61 62 6c 65 2e 20 20 4e 6f 20 63 68 61 6e 67 65  able.  No change
3bf0: 73 20 61 72 65 20 6d 61 64 65 20 74 6f 20 64 69  s are made to di
3c00: 73 6b 20 62 79 20 74 68 69 73 20 72 6f 75 74 69  sk by this routi
3c10: 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ne..**.** This r
3c20: 6f 75 74 69 6e 65 20 6a 75 73 74 20 64 65 6c 65  outine just dele
3c30: 74 65 73 20 74 68 65 20 64 61 74 61 20 73 74 72  tes the data str
3c40: 75 63 74 75 72 65 2e 20 20 49 74 20 64 6f 65 73  ucture.  It does
3c50: 20 6e 6f 74 20 75 6e 6c 69 6e 6b 0a 2a 2a 20 74   not unlink.** t
3c60: 68 65 20 74 61 62 6c 65 20 64 61 74 61 20 73 74  he table data st
3c70: 72 75 63 74 75 72 65 20 66 72 6f 6d 20 74 68 65  ructure from the
3c80: 20 68 61 73 68 20 74 61 62 6c 65 2e 20 20 4e 6f   hash table.  No
3c90: 72 20 64 6f 65 73 20 69 74 20 72 65 6d 6f 76 65  r does it remove
3ca0: 0a 2a 2a 20 66 6f 72 65 69 67 6e 20 6b 65 79 73  .** foreign keys
3cb0: 20 66 72 6f 6d 20 74 68 65 20 73 71 6c 69 74 65   from the sqlite
3cc0: 2e 61 46 4b 65 79 20 68 61 73 68 20 74 61 62 6c  .aFKey hash tabl
3cd0: 65 2e 20 20 42 75 74 20 69 74 20 64 6f 65 73 20  e.  But it does 
3ce0: 64 65 73 74 72 6f 79 0a 2a 2a 20 6d 65 6d 6f 72  destroy.** memor
3cf0: 79 20 73 74 72 75 63 74 75 72 65 73 20 6f 66 20  y structures of 
3d00: 74 68 65 20 69 6e 64 69 63 65 73 20 61 6e 64 20  the indices and 
3d10: 66 6f 72 65 69 67 6e 20 6b 65 79 73 20 61 73 73  foreign keys ass
3d20: 6f 63 69 61 74 65 64 20 77 69 74 68 20 0a 2a 2a  ociated with .**
3d30: 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2f 0a 76   the table..*/.v
3d40: 6f 69 64 20 73 71 6c 69 74 65 33 44 65 6c 65 74  oid sqlite3Delet
3d50: 65 54 61 62 6c 65 28 54 61 62 6c 65 20 2a 70 54  eTable(Table *pT
3d60: 61 62 6c 65 29 7b 0a 20 20 49 6e 64 65 78 20 2a  able){.  Index *
3d70: 70 49 6e 64 65 78 2c 20 2a 70 4e 65 78 74 3b 0a  pIndex, *pNext;.
3d80: 20 20 46 4b 65 79 20 2a 70 46 4b 65 79 2c 20 2a    FKey *pFKey, *
3d90: 70 4e 65 78 74 46 4b 65 79 3b 0a 20 20 73 71 6c  pNextFKey;.  sql
3da0: 69 74 65 33 20 2a 64 62 3b 0a 0a 20 20 69 66 28  ite3 *db;..  if(
3db0: 20 70 54 61 62 6c 65 3d 3d 30 20 29 20 72 65 74   pTable==0 ) ret
3dc0: 75 72 6e 3b 0a 20 20 64 62 20 3d 20 70 54 61 62  urn;.  db = pTab
3dd0: 6c 65 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20 44 6f  le->db;..  /* Do
3de0: 20 6e 6f 74 20 64 65 6c 65 74 65 20 74 68 65 20   not delete the 
3df0: 74 61 62 6c 65 20 75 6e 74 69 6c 20 74 68 65 20  table until the 
3e00: 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20  reference count 
3e10: 72 65 61 63 68 65 73 20 7a 65 72 6f 2e 20 2a 2f  reaches zero. */
3e20: 0a 20 20 70 54 61 62 6c 65 2d 3e 6e 52 65 66 2d  .  pTable->nRef-
3e30: 2d 3b 0a 20 20 69 66 28 20 70 54 61 62 6c 65 2d  -;.  if( pTable-
3e40: 3e 6e 52 65 66 3e 30 20 29 7b 0a 20 20 20 20 72  >nRef>0 ){.    r
3e50: 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 61 73 73  eturn;.  }.  ass
3e60: 65 72 74 28 20 70 54 61 62 6c 65 2d 3e 6e 52 65  ert( pTable->nRe
3e70: 66 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 44 65  f==0 );..  /* De
3e80: 6c 65 74 65 20 61 6c 6c 20 69 6e 64 69 63 65 73  lete all indices
3e90: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
3ea0: 20 74 68 69 73 20 74 61 62 6c 65 0a 20 20 2a 2f   this table.  */
3eb0: 0a 20 20 66 6f 72 28 70 49 6e 64 65 78 20 3d 20  .  for(pIndex = 
3ec0: 70 54 61 62 6c 65 2d 3e 70 49 6e 64 65 78 3b 20  pTable->pIndex; 
3ed0: 70 49 6e 64 65 78 3b 20 70 49 6e 64 65 78 3d 70  pIndex; pIndex=p
3ee0: 4e 65 78 74 29 7b 0a 20 20 20 20 70 4e 65 78 74  Next){.    pNext
3ef0: 20 3d 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74   = pIndex->pNext
3f00: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49  ;.    assert( pI
3f10: 6e 64 65 78 2d 3e 70 53 63 68 65 6d 61 3d 3d 70  ndex->pSchema==p
3f20: 54 61 62 6c 65 2d 3e 70 53 63 68 65 6d 61 20 29  Table->pSchema )
3f30: 3b 0a 20 20 20 20 73 71 6c 69 74 65 44 65 6c 65  ;.    sqliteDele
3f40: 74 65 49 6e 64 65 78 28 70 49 6e 64 65 78 29 3b  teIndex(pIndex);
3f50: 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  .  }..#ifndef SQ
3f60: 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47  LITE_OMIT_FOREIG
3f70: 4e 5f 4b 45 59 0a 20 20 2f 2a 20 44 65 6c 65 74  N_KEY.  /* Delet
3f80: 65 20 61 6c 6c 20 66 6f 72 65 69 67 6e 20 6b 65  e all foreign ke
3f90: 79 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ys associated wi
3fa0: 74 68 20 74 68 69 73 20 74 61 62 6c 65 2e 20 20  th this table.  
3fb0: 54 68 65 20 6b 65 79 73 0a 20 20 2a 2a 20 73 68  The keys.  ** sh
3fc0: 6f 75 6c 64 20 68 61 76 65 20 61 6c 72 65 61 64  ould have alread
3fd0: 79 20 62 65 65 6e 20 75 6e 6c 69 6e 6b 65 64 20  y been unlinked 
3fe0: 66 72 6f 6d 20 74 68 65 20 70 53 63 68 65 6d 61  from the pSchema
3ff0: 2d 3e 61 46 4b 65 79 20 68 61 73 68 20 74 61 62  ->aFKey hash tab
4000: 6c 65 20 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 70  le .  */.  for(p
4010: 46 4b 65 79 3d 70 54 61 62 6c 65 2d 3e 70 46 4b  FKey=pTable->pFK
4020: 65 79 3b 20 70 46 4b 65 79 3b 20 70 46 4b 65 79  ey; pFKey; pFKey
4030: 3d 70 4e 65 78 74 46 4b 65 79 29 7b 0a 20 20 20  =pNextFKey){.   
4040: 20 70 4e 65 78 74 46 4b 65 79 20 3d 20 70 46 4b   pNextFKey = pFK
4050: 65 79 2d 3e 70 4e 65 78 74 46 72 6f 6d 3b 0a 20  ey->pNextFrom;. 
4060: 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
4070: 65 33 48 61 73 68 46 69 6e 64 28 26 70 54 61 62  e3HashFind(&pTab
4080: 6c 65 2d 3e 70 53 63 68 65 6d 61 2d 3e 61 46 4b  le->pSchema->aFK
4090: 65 79 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ey,.            
40a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
40b0: 46 4b 65 79 2d 3e 7a 54 6f 2c 20 73 71 6c 69 74  FKey->zTo, sqlit
40c0: 65 33 53 74 72 6c 65 6e 33 30 28 70 46 4b 65 79  e3Strlen30(pFKey
40d0: 2d 3e 7a 54 6f 29 2b 31 29 21 3d 70 46 4b 65 79  ->zTo)+1)!=pFKey
40e0: 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44   );.    sqlite3D
40f0: 62 46 72 65 65 28 64 62 2c 20 70 46 4b 65 79 29  bFree(db, pFKey)
4100: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
4110: 2f 2a 20 44 65 6c 65 74 65 20 74 68 65 20 54 61  /* Delete the Ta
4120: 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 69 74  ble structure it
4130: 73 65 6c 66 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c  self..  */.  sql
4140: 69 74 65 52 65 73 65 74 43 6f 6c 75 6d 6e 4e 61  iteResetColumnNa
4150: 6d 65 73 28 70 54 61 62 6c 65 29 3b 0a 20 20 73  mes(pTable);.  s
4160: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
4170: 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 29 3b   pTable->zName);
4180: 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
4190: 28 64 62 2c 20 70 54 61 62 6c 65 2d 3e 7a 43 6f  (db, pTable->zCo
41a0: 6c 41 66 66 29 3b 0a 20 20 73 71 6c 69 74 65 33  lAff);.  sqlite3
41b0: 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c  SelectDelete(db,
41c0: 20 70 54 61 62 6c 65 2d 3e 70 53 65 6c 65 63 74   pTable->pSelect
41d0: 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  );.#ifndef SQLIT
41e0: 45 5f 4f 4d 49 54 5f 43 48 45 43 4b 0a 20 20 73  E_OMIT_CHECK.  s
41f0: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
4200: 28 64 62 2c 20 70 54 61 62 6c 65 2d 3e 70 43 68  (db, pTable->pCh
4210: 65 63 6b 29 3b 0a 23 65 6e 64 69 66 0a 20 20 73  eck);.#endif.  s
4220: 71 6c 69 74 65 33 56 74 61 62 43 6c 65 61 72 28  qlite3VtabClear(
4230: 70 54 61 62 6c 65 29 3b 0a 20 20 73 71 6c 69 74  pTable);.  sqlit
4240: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 54 61  e3DbFree(db, pTa
4250: 62 6c 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  ble);.}../*.** U
4260: 6e 6c 69 6e 6b 20 74 68 65 20 67 69 76 65 6e 20  nlink the given 
4270: 74 61 62 6c 65 20 66 72 6f 6d 20 74 68 65 20 68  table from the h
4280: 61 73 68 20 74 61 62 6c 65 73 20 61 6e 64 20 74  ash tables and t
4290: 68 65 20 64 65 6c 65 74 65 20 74 68 65 0a 2a 2a  he delete the.**
42a0: 20 74 61 62 6c 65 20 73 74 72 75 63 74 75 72 65   table structure
42b0: 20 77 69 74 68 20 61 6c 6c 20 69 74 73 20 69 6e   with all its in
42c0: 64 69 63 65 73 20 61 6e 64 20 66 6f 72 65 69 67  dices and foreig
42d0: 6e 20 6b 65 79 73 2e 0a 2a 2f 0a 76 6f 69 64 20  n keys..*/.void 
42e0: 73 71 6c 69 74 65 33 55 6e 6c 69 6e 6b 41 6e 64  sqlite3UnlinkAnd
42f0: 44 65 6c 65 74 65 54 61 62 6c 65 28 73 71 6c 69  DeleteTable(sqli
4300: 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 69 44 62  te3 *db, int iDb
4310: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54  , const char *zT
4320: 61 62 4e 61 6d 65 29 7b 0a 20 20 54 61 62 6c 65  abName){.  Table
4330: 20 2a 70 3b 0a 20 20 46 4b 65 79 20 2a 70 46 31   *p;.  FKey *pF1
4340: 2c 20 2a 70 46 32 3b 0a 20 20 44 62 20 2a 70 44  , *pF2;.  Db *pD
4350: 62 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 64 62  b;..  assert( db
4360: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
4370: 20 69 44 62 3e 3d 30 20 26 26 20 69 44 62 3c 64   iDb>=0 && iDb<d
4380: 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 61 73 73 65  b->nDb );.  asse
4390: 72 74 28 20 7a 54 61 62 4e 61 6d 65 20 26 26 20  rt( zTabName && 
43a0: 7a 54 61 62 4e 61 6d 65 5b 30 5d 20 29 3b 0a 20  zTabName[0] );. 
43b0: 20 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b   pDb = &db->aDb[
43c0: 69 44 62 5d 3b 0a 20 20 70 20 3d 20 73 71 6c 69  iDb];.  p = sqli
43d0: 74 65 33 48 61 73 68 49 6e 73 65 72 74 28 26 70  te3HashInsert(&p
43e0: 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 74 62 6c  Db->pSchema->tbl
43f0: 48 61 73 68 2c 20 7a 54 61 62 4e 61 6d 65 2c 0a  Hash, zTabName,.
4400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4410: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53          sqlite3S
4420: 74 72 6c 65 6e 33 30 28 7a 54 61 62 4e 61 6d 65  trlen30(zTabName
4430: 29 2b 31 2c 30 29 3b 0a 20 20 69 66 28 20 70 20  )+1,0);.  if( p 
4440: 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ){.#ifndef SQLIT
4450: 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b  E_OMIT_FOREIGN_K
4460: 45 59 0a 20 20 20 20 66 6f 72 28 70 46 31 3d 70  EY.    for(pF1=p
4470: 2d 3e 70 46 4b 65 79 3b 20 70 46 31 3b 20 70 46  ->pFKey; pF1; pF
4480: 31 3d 70 46 31 2d 3e 70 4e 65 78 74 46 72 6f 6d  1=pF1->pNextFrom
4490: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 54 6f  ){.      int nTo
44a0: 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
44b0: 33 30 28 70 46 31 2d 3e 7a 54 6f 29 20 2b 20 31  30(pF1->zTo) + 1
44c0: 3b 0a 20 20 20 20 20 20 70 46 32 20 3d 20 73 71  ;.      pF2 = sq
44d0: 6c 69 74 65 33 48 61 73 68 46 69 6e 64 28 26 70  lite3HashFind(&p
44e0: 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 61 46 4b  Db->pSchema->aFK
44f0: 65 79 2c 20 70 46 31 2d 3e 7a 54 6f 2c 20 6e 54  ey, pF1->zTo, nT
4500: 6f 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 46  o);.      if( pF
4510: 32 3d 3d 70 46 31 20 29 7b 0a 20 20 20 20 20 20  2==pF1 ){.      
4520: 20 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73    sqlite3HashIns
4530: 65 72 74 28 26 70 44 62 2d 3e 70 53 63 68 65 6d  ert(&pDb->pSchem
4540: 61 2d 3e 61 46 4b 65 79 2c 20 70 46 31 2d 3e 7a  a->aFKey, pF1->z
4550: 54 6f 2c 20 6e 54 6f 2c 20 70 46 31 2d 3e 70 4e  To, nTo, pF1->pN
4560: 65 78 74 54 6f 29 3b 0a 20 20 20 20 20 20 7d 65  extTo);.      }e
4570: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 77 68 69  lse{.        whi
4580: 6c 65 28 20 70 46 32 20 26 26 20 70 46 32 2d 3e  le( pF2 && pF2->
4590: 70 4e 65 78 74 54 6f 21 3d 70 46 31 20 29 7b 20  pNextTo!=pF1 ){ 
45a0: 70 46 32 3d 70 46 32 2d 3e 70 4e 65 78 74 54 6f  pF2=pF2->pNextTo
45b0: 3b 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20  ; }.        if( 
45c0: 70 46 32 20 29 7b 0a 20 20 20 20 20 20 20 20 20  pF2 ){.         
45d0: 20 70 46 32 2d 3e 70 4e 65 78 74 54 6f 20 3d 20   pF2->pNextTo = 
45e0: 70 46 31 2d 3e 70 4e 65 78 74 54 6f 3b 0a 20 20  pF1->pNextTo;.  
45f0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
4600: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
4610: 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61   sqlite3DeleteTa
4620: 62 6c 65 28 70 29 3b 0a 20 20 7d 0a 20 20 64 62  ble(p);.  }.  db
4630: 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54  ->flags |= SQLIT
4640: 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b  E_InternChanges;
4650: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20  .}../*.** Given 
4660: 61 20 74 6f 6b 65 6e 2c 20 72 65 74 75 72 6e 20  a token, return 
4670: 61 20 73 74 72 69 6e 67 20 74 68 61 74 20 63 6f  a string that co
4680: 6e 73 69 73 74 73 20 6f 66 20 74 68 65 20 74 65  nsists of the te
4690: 78 74 20 6f 66 20 74 68 61 74 0a 2a 2a 20 74 6f  xt of that.** to
46a0: 6b 65 6e 20 77 69 74 68 20 61 6e 79 20 71 75 6f  ken with any quo
46b0: 74 61 74 69 6f 6e 73 20 72 65 6d 6f 76 65 64 2e  tations removed.
46c0: 20 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20    Space to hold 
46d0: 74 68 65 20 72 65 74 75 72 6e 65 64 20 73 74 72  the returned str
46e0: 69 6e 67 0a 2a 2a 20 69 73 20 6f 62 74 61 69 6e  ing.** is obtain
46f0: 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 4d 61  ed from sqliteMa
4700: 6c 6c 6f 63 28 29 20 61 6e 64 20 6d 75 73 74 20  lloc() and must 
4710: 62 65 20 66 72 65 65 64 20 62 79 20 74 68 65 20  be freed by the 
4720: 63 61 6c 6c 69 6e 67 0a 2a 2a 20 66 75 6e 63 74  calling.** funct
4730: 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 6f 6b 65 6e  ion..**.** Token
4740: 73 20 61 72 65 20 6f 66 74 65 6e 20 6a 75 73 74  s are often just
4750: 20 70 6f 69 6e 74 65 72 73 20 69 6e 74 6f 20 74   pointers into t
4760: 68 65 20 6f 72 69 67 69 6e 61 6c 20 53 51 4c 20  he original SQL 
4770: 74 65 78 74 20 61 6e 64 20 73 6f 0a 2a 2a 20 61  text and so.** a
4780: 72 65 20 6e 6f 74 20 5c 30 30 30 20 74 65 72 6d  re not \000 term
4790: 69 6e 61 74 65 64 20 61 6e 64 20 61 72 65 20 6e  inated and are n
47a0: 6f 74 20 70 65 72 73 69 73 74 65 6e 74 2e 20 20  ot persistent.  
47b0: 54 68 65 20 72 65 74 75 72 6e 65 64 20 73 74 72  The returned str
47c0: 69 6e 67 0a 2a 2a 20 69 73 20 5c 30 30 30 20 74  ing.** is \000 t
47d0: 65 72 6d 69 6e 61 74 65 64 20 61 6e 64 20 69 73  erminated and is
47e0: 20 70 65 72 73 69 73 74 65 6e 74 2e 0a 2a 2f 0a   persistent..*/.
47f0: 63 68 61 72 20 2a 73 71 6c 69 74 65 33 4e 61 6d  char *sqlite3Nam
4800: 65 46 72 6f 6d 54 6f 6b 65 6e 28 73 71 6c 69 74  eFromToken(sqlit
4810: 65 33 20 2a 64 62 2c 20 54 6f 6b 65 6e 20 2a 70  e3 *db, Token *p
4820: 4e 61 6d 65 29 7b 0a 20 20 63 68 61 72 20 2a 7a  Name){.  char *z
4830: 4e 61 6d 65 3b 0a 20 20 69 66 28 20 70 4e 61 6d  Name;.  if( pNam
4840: 65 20 29 7b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d  e ){.    zName =
4850: 20 73 71 6c 69 74 65 33 44 62 53 74 72 4e 44 75   sqlite3DbStrNDu
4860: 70 28 64 62 2c 20 28 63 68 61 72 2a 29 70 4e 61  p(db, (char*)pNa
4870: 6d 65 2d 3e 7a 2c 20 70 4e 61 6d 65 2d 3e 6e 29  me->z, pName->n)
4880: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 71  ;.    sqlite3Deq
4890: 75 6f 74 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 7d  uote(zName);.  }
48a0: 65 6c 73 65 7b 0a 20 20 20 20 7a 4e 61 6d 65 20  else{.    zName 
48b0: 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 0;.  }.  retur
48c0: 6e 20 7a 4e 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  n zName;.}../*.*
48d0: 2a 20 4f 70 65 6e 20 74 68 65 20 73 71 6c 69 74  * Open the sqlit
48e0: 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20 73  e_master table s
48f0: 74 6f 72 65 64 20 69 6e 20 64 61 74 61 62 61 73  tored in databas
4900: 65 20 6e 75 6d 62 65 72 20 69 44 62 20 66 6f 72  e number iDb for
4910: 0a 2a 2a 20 77 72 69 74 69 6e 67 2e 20 54 68 65  .** writing. The
4920: 20 74 61 62 6c 65 20 69 73 20 6f 70 65 6e 65 64   table is opened
4930: 20 75 73 69 6e 67 20 63 75 72 73 6f 72 20 30 2e   using cursor 0.
4940: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
4950: 4f 70 65 6e 4d 61 73 74 65 72 54 61 62 6c 65 28  OpenMasterTable(
4960: 50 61 72 73 65 20 2a 70 2c 20 69 6e 74 20 69 44  Parse *p, int iD
4970: 62 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  b){.  Vdbe *v = 
4980: 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
4990: 29 3b 0a 20 20 73 71 6c 69 74 65 33 54 61 62 6c  );.  sqlite3Tabl
49a0: 65 4c 6f 63 6b 28 70 2c 20 69 44 62 2c 20 4d 41  eLock(p, iDb, MA
49b0: 53 54 45 52 5f 52 4f 4f 54 2c 20 31 2c 20 53 43  STER_ROOT, 1, SC
49c0: 48 45 4d 41 5f 54 41 42 4c 45 28 69 44 62 29 29  HEMA_TABLE(iDb))
49d0: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
49e0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 65 74 4e  ddOp2(v, OP_SetN
49f0: 75 6d 43 6f 6c 75 6d 6e 73 2c 20 30 2c 20 35 29  umColumns, 0, 5)
4a00: 3b 2f 2a 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  ;/* sqlite_maste
4a10: 72 20 68 61 73 20 35 20 63 6f 6c 75 6d 6e 73 20  r has 5 columns 
4a20: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  */.  sqlite3Vdbe
4a30: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65  AddOp3(v, OP_Ope
4a40: 6e 57 72 69 74 65 2c 20 30 2c 20 4d 41 53 54 45  nWrite, 0, MASTE
4a50: 52 5f 52 4f 4f 54 2c 20 69 44 62 29 3b 0a 7d 0a  R_ROOT, iDb);.}.
4a60: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 74 6f 6b 65 6e  ./*.** The token
4a70: 20 2a 70 4e 61 6d 65 20 63 6f 6e 74 61 69 6e 73   *pName contains
4a80: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 64   the name of a d
4a90: 61 74 61 62 61 73 65 20 28 65 69 74 68 65 72 20  atabase (either 
4aa0: 22 6d 61 69 6e 22 20 6f 72 0a 2a 2a 20 22 74 65  "main" or.** "te
4ab0: 6d 70 22 20 6f 72 20 74 68 65 20 6e 61 6d 65 20  mp" or the name 
4ac0: 6f 66 20 61 6e 20 61 74 74 61 63 68 65 64 20 64  of an attached d
4ad0: 62 29 2e 20 54 68 69 73 20 72 6f 75 74 69 6e 65  b). This routine
4ae0: 20 72 65 74 75 72 6e 73 20 74 68 65 0a 2a 2a 20   returns the.** 
4af0: 69 6e 64 65 78 20 6f 66 20 74 68 65 20 6e 61 6d  index of the nam
4b00: 65 64 20 64 61 74 61 62 61 73 65 20 69 6e 20 64  ed database in d
4b10: 62 2d 3e 61 44 62 5b 5d 2c 20 6f 72 20 2d 31 20  b->aDb[], or -1 
4b20: 69 66 20 74 68 65 20 6e 61 6d 65 64 20 64 62 20  if the named db 
4b30: 0a 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 65 78 69  .** does not exi
4b40: 73 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  st..*/.int sqlit
4b50: 65 33 46 69 6e 64 44 62 28 73 71 6c 69 74 65 33  e3FindDb(sqlite3
4b60: 20 2a 64 62 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61   *db, Token *pNa
4b70: 6d 65 29 7b 0a 20 20 69 6e 74 20 69 20 3d 20 2d  me){.  int i = -
4b80: 31 3b 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73  1;    /* Databas
4b90: 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 69 6e  e number */.  in
4ba0: 74 20 6e 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  t n;         /* 
4bb0: 4e 75 6d 62 65 72 20 6f 66 20 63 68 61 72 61 63  Number of charac
4bc0: 74 65 72 73 20 69 6e 20 74 68 65 20 6e 61 6d 65  ters in the name
4bd0: 20 2a 2f 0a 20 20 44 62 20 2a 70 44 62 3b 20 20   */.  Db *pDb;  
4be0: 20 20 20 20 20 2f 2a 20 41 20 64 61 74 61 62 61       /* A databa
4bf0: 73 65 20 77 68 6f 73 65 20 6e 61 6d 65 20 73 70  se whose name sp
4c00: 61 63 65 20 69 73 20 62 65 69 6e 67 20 73 65 61  ace is being sea
4c10: 72 63 68 65 64 20 2a 2f 0a 20 20 63 68 61 72 20  rched */.  char 
4c20: 2a 7a 4e 61 6d 65 3b 20 20 20 2f 2a 20 4e 61 6d  *zName;   /* Nam
4c30: 65 20 77 65 20 61 72 65 20 73 65 61 72 63 68 69  e we are searchi
4c40: 6e 67 20 66 6f 72 20 2a 2f 0a 0a 20 20 7a 4e 61  ng for */..  zNa
4c50: 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65  me = sqlite3Name
4c60: 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 4e  FromToken(db, pN
4c70: 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a 4e 61 6d  ame);.  if( zNam
4c80: 65 20 29 7b 0a 20 20 20 20 6e 20 3d 20 73 71 6c  e ){.    n = sql
4c90: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4e 61  ite3Strlen30(zNa
4ca0: 6d 65 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 28  me);.    for(i=(
4cb0: 64 62 2d 3e 6e 44 62 2d 31 29 2c 20 70 44 62 3d  db->nDb-1), pDb=
4cc0: 26 64 62 2d 3e 61 44 62 5b 69 5d 3b 20 69 3e 3d  &db->aDb[i]; i>=
4cd0: 30 3b 20 69 2d 2d 2c 20 70 44 62 2d 2d 29 7b 0a  0; i--, pDb--){.
4ce0: 20 20 20 20 20 20 69 66 28 20 28 21 4f 4d 49 54        if( (!OMIT
4cf0: 5f 54 45 4d 50 44 42 20 7c 7c 20 69 21 3d 31 20  _TEMPDB || i!=1 
4d00: 29 20 26 26 20 6e 3d 3d 73 71 6c 69 74 65 33 53  ) && n==sqlite3S
4d10: 74 72 6c 65 6e 33 30 28 70 44 62 2d 3e 7a 4e 61  trlen30(pDb->zNa
4d20: 6d 65 29 20 26 26 20 0a 20 20 20 20 20 20 20 20  me) && .        
4d30: 20 20 30 3d 3d 73 71 6c 69 74 65 33 53 74 72 49    0==sqlite3StrI
4d40: 43 6d 70 28 70 44 62 2d 3e 7a 4e 61 6d 65 2c 20  Cmp(pDb->zName, 
4d50: 7a 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 20 20  zName) ){.      
4d60: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
4d70: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
4d80: 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4e 61  e3DbFree(db, zNa
4d90: 6d 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  me);.  }.  retur
4da0: 6e 20 69 3b 0a 7d 0a 0a 2f 2a 20 54 68 65 20 74  n i;.}../* The t
4db0: 61 62 6c 65 20 6f 72 20 76 69 65 77 20 6f 72 20  able or view or 
4dc0: 74 72 69 67 67 65 72 20 6e 61 6d 65 20 69 73 20  trigger name is 
4dd0: 70 61 73 73 65 64 20 74 6f 20 74 68 69 73 20 72  passed to this r
4de0: 6f 75 74 69 6e 65 20 76 69 61 20 74 6f 6b 65 6e  outine via token
4df0: 73 0a 2a 2a 20 70 4e 61 6d 65 31 20 61 6e 64 20  s.** pName1 and 
4e00: 70 4e 61 6d 65 32 2e 20 49 66 20 74 68 65 20 74  pName2. If the t
4e10: 61 62 6c 65 20 6e 61 6d 65 20 77 61 73 20 66 75  able name was fu
4e20: 6c 6c 79 20 71 75 61 6c 69 66 69 65 64 2c 20 66  lly qualified, f
4e30: 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a  or example:.**.*
4e40: 2a 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 78  * CREATE TABLE x
4e50: 78 78 2e 79 79 79 20 28 2e 2e 2e 29 3b 0a 2a 2a  xx.yyy (...);.**
4e60: 20 0a 2a 2a 20 54 68 65 6e 20 70 4e 61 6d 65 31   .** Then pName1
4e70: 20 69 73 20 73 65 74 20 74 6f 20 22 78 78 78 22   is set to "xxx"
4e80: 20 61 6e 64 20 70 4e 61 6d 65 32 20 22 79 79 79   and pName2 "yyy
4e90: 22 2e 20 4f 6e 20 74 68 65 20 6f 74 68 65 72 20  ". On the other 
4ea0: 68 61 6e 64 20 69 66 0a 2a 2a 20 74 68 65 20 74  hand if.** the t
4eb0: 61 62 6c 65 20 6e 61 6d 65 20 69 73 20 6e 6f 74  able name is not
4ec0: 20 66 75 6c 6c 79 20 71 75 61 6c 69 66 69 65 64   fully qualified
4ed0: 2c 20 69 2e 65 2e 3a 0a 2a 2a 0a 2a 2a 20 43 52  , i.e.:.**.** CR
4ee0: 45 41 54 45 20 54 41 42 4c 45 20 79 79 79 28 2e  EATE TABLE yyy(.
4ef0: 2e 2e 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20  ..);.**.** Then 
4f00: 70 4e 61 6d 65 31 20 69 73 20 73 65 74 20 74 6f  pName1 is set to
4f10: 20 22 79 79 79 22 20 61 6e 64 20 70 4e 61 6d 65   "yyy" and pName
4f20: 32 20 69 73 20 22 22 2e 0a 2a 2a 0a 2a 2a 20 54  2 is ""..**.** T
4f30: 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73  his routine sets
4f40: 20 74 68 65 20 2a 70 70 55 6e 71 75 61 6c 20 70   the *ppUnqual p
4f50: 6f 69 6e 74 65 72 20 74 6f 20 70 6f 69 6e 74 20  ointer to point 
4f60: 61 74 20 74 68 65 20 74 6f 6b 65 6e 20 28 70 4e  at the token (pN
4f70: 61 6d 65 31 20 6f 72 0a 2a 2a 20 70 4e 61 6d 65  ame1 or.** pName
4f80: 32 29 20 74 68 61 74 20 73 74 6f 72 65 73 20 74  2) that stores t
4f90: 68 65 20 75 6e 71 75 61 6c 69 66 69 65 64 20 74  he unqualified t
4fa0: 61 62 6c 65 20 6e 61 6d 65 2e 20 20 54 68 65 20  able name.  The 
4fb0: 69 6e 64 65 78 20 6f 66 20 74 68 65 0a 2a 2a 20  index of the.** 
4fc0: 64 61 74 61 62 61 73 65 20 22 78 78 78 22 20 69  database "xxx" i
4fd0: 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69  s returned..*/.i
4fe0: 6e 74 20 73 71 6c 69 74 65 33 54 77 6f 50 61 72  nt sqlite3TwoPar
4ff0: 74 4e 61 6d 65 28 0a 20 20 50 61 72 73 65 20 2a  tName(.  Parse *
5000: 70 50 61 72 73 65 2c 20 20 20 20 20 20 2f 2a 20  pParse,      /* 
5010: 50 61 72 73 69 6e 67 20 61 6e 64 20 63 6f 64 65  Parsing and code
5020: 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74   generating cont
5030: 65 78 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  ext */.  Token *
5040: 70 4e 61 6d 65 31 2c 20 20 20 20 20 20 2f 2a 20  pName1,      /* 
5050: 54 68 65 20 22 78 78 78 22 20 69 6e 20 74 68 65  The "xxx" in the
5060: 20 6e 61 6d 65 20 22 78 78 78 2e 79 79 79 22 20   name "xxx.yyy" 
5070: 6f 72 20 22 78 78 78 22 20 2a 2f 0a 20 20 54 6f  or "xxx" */.  To
5080: 6b 65 6e 20 2a 70 4e 61 6d 65 32 2c 20 20 20 20  ken *pName2,    
5090: 20 20 2f 2a 20 54 68 65 20 22 79 79 79 22 20 69    /* The "yyy" i
50a0: 6e 20 74 68 65 20 6e 61 6d 65 20 22 78 78 78 2e  n the name "xxx.
50b0: 79 79 79 22 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  yyy" */.  Token 
50c0: 2a 2a 70 55 6e 71 75 61 6c 20 20 20 20 20 2f 2a  **pUnqual     /*
50d0: 20 57 72 69 74 65 20 74 68 65 20 75 6e 71 75 61   Write the unqua
50e0: 6c 69 66 69 65 64 20 6f 62 6a 65 63 74 20 6e 61  lified object na
50f0: 6d 65 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20  me here */.){.  
5100: 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20 20 20  int iDb;        
5110: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
5120: 61 74 61 62 61 73 65 20 68 6f 6c 64 69 6e 67 20  atabase holding 
5130: 74 68 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  the object */.  
5140: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
5150: 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 69 66 28  arse->db;..  if(
5160: 20 70 4e 61 6d 65 32 20 26 26 20 70 4e 61 6d 65   pName2 && pName
5170: 32 2d 3e 6e 3e 30 20 29 7b 0a 20 20 20 20 69 66  2->n>0 ){.    if
5180: 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20  ( db->init.busy 
5190: 29 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ) {.      sqlite
51a0: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
51b0: 2c 20 22 63 6f 72 72 75 70 74 20 64 61 74 61 62  , "corrupt datab
51c0: 61 73 65 22 29 3b 0a 20 20 20 20 20 20 70 50 61  ase");.      pPa
51d0: 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20  rse->nErr++;.   
51e0: 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20     return -1;.  
51f0: 20 20 7d 0a 20 20 20 20 2a 70 55 6e 71 75 61 6c    }.    *pUnqual
5200: 20 3d 20 70 4e 61 6d 65 32 3b 0a 20 20 20 20 69   = pName2;.    i
5210: 44 62 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64  Db = sqlite3Find
5220: 44 62 28 64 62 2c 20 70 4e 61 6d 65 31 29 3b 0a  Db(db, pName1);.
5230: 20 20 20 20 69 66 28 20 69 44 62 3c 30 20 29 7b      if( iDb<0 ){
5240: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
5250: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
5260: 75 6e 6b 6e 6f 77 6e 20 64 61 74 61 62 61 73 65  unknown database
5270: 20 25 54 22 2c 20 70 4e 61 6d 65 31 29 3b 0a 20   %T", pName1);. 
5280: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72       pParse->nEr
5290: 72 2b 2b 3b 0a 20 20 20 20 20 20 72 65 74 75 72  r++;.      retur
52a0: 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  n -1;.    }.  }e
52b0: 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28  lse{.    assert(
52c0: 20 64 62 2d 3e 69 6e 69 74 2e 69 44 62 3d 3d 30   db->init.iDb==0
52d0: 20 7c 7c 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73   || db->init.bus
52e0: 79 20 29 3b 0a 20 20 20 20 69 44 62 20 3d 20 64  y );.    iDb = d
52f0: 62 2d 3e 69 6e 69 74 2e 69 44 62 3b 0a 20 20 20  b->init.iDb;.   
5300: 20 2a 70 55 6e 71 75 61 6c 20 3d 20 70 4e 61 6d   *pUnqual = pNam
5310: 65 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  e1;.  }.  return
5320: 20 69 44 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54   iDb;.}../*.** T
5330: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75  his routine is u
5340: 73 65 64 20 74 6f 20 63 68 65 63 6b 20 69 66 20  sed to check if 
5350: 74 68 65 20 55 54 46 2d 38 20 73 74 72 69 6e 67  the UTF-8 string
5360: 20 7a 4e 61 6d 65 20 69 73 20 61 20 6c 65 67 61   zName is a lega
5370: 6c 0a 2a 2a 20 75 6e 71 75 61 6c 69 66 69 65 64  l.** unqualified
5380: 20 6e 61 6d 65 20 66 6f 72 20 61 20 6e 65 77 20   name for a new 
5390: 73 63 68 65 6d 61 20 6f 62 6a 65 63 74 20 28 74  schema object (t
53a0: 61 62 6c 65 2c 20 69 6e 64 65 78 2c 20 76 69 65  able, index, vie
53b0: 77 20 6f 72 0a 2a 2a 20 74 72 69 67 67 65 72 29  w or.** trigger)
53c0: 2e 20 41 6c 6c 20 6e 61 6d 65 73 20 61 72 65 20  . All names are 
53d0: 6c 65 67 61 6c 20 65 78 63 65 70 74 20 74 68 6f  legal except tho
53e0: 73 65 20 74 68 61 74 20 62 65 67 69 6e 20 77 69  se that begin wi
53f0: 74 68 20 74 68 65 20 73 74 72 69 6e 67 0a 2a 2a  th the string.**
5400: 20 22 73 71 6c 69 74 65 5f 22 20 28 69 6e 20 75   "sqlite_" (in u
5410: 70 70 65 72 2c 20 6c 6f 77 65 72 20 6f 72 20 6d  pper, lower or m
5420: 69 78 65 64 20 63 61 73 65 29 2e 20 54 68 69 73  ixed case). This
5430: 20 70 6f 72 74 69 6f 6e 20 6f 66 20 74 68 65 20   portion of the 
5440: 6e 61 6d 65 73 70 61 63 65 0a 2a 2a 20 69 73 20  namespace.** is 
5450: 72 65 73 65 72 76 65 64 20 66 6f 72 20 69 6e 74  reserved for int
5460: 65 72 6e 61 6c 20 75 73 65 2e 0a 2a 2f 0a 69 6e  ernal use..*/.in
5470: 74 20 73 71 6c 69 74 65 33 43 68 65 63 6b 4f 62  t sqlite3CheckOb
5480: 6a 65 63 74 4e 61 6d 65 28 50 61 72 73 65 20 2a  jectName(Parse *
5490: 70 50 61 72 73 65 2c 20 63 6f 6e 73 74 20 63 68  pParse, const ch
54a0: 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69 66  ar *zName){.  if
54b0: 28 20 21 70 50 61 72 73 65 2d 3e 64 62 2d 3e 69  ( !pParse->db->i
54c0: 6e 69 74 2e 62 75 73 79 20 26 26 20 70 50 61 72  nit.busy && pPar
54d0: 73 65 2d 3e 6e 65 73 74 65 64 3d 3d 30 20 0a 20  se->nested==0 . 
54e0: 20 20 20 20 20 20 20 20 20 26 26 20 28 70 50 61           && (pPa
54f0: 72 73 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26  rse->db->flags &
5500: 20 53 51 4c 49 54 45 5f 57 72 69 74 65 53 63 68   SQLITE_WriteSch
5510: 65 6d 61 29 3d 3d 30 0a 20 20 20 20 20 20 20 20  ema)==0.        
5520: 20 20 26 26 20 30 3d 3d 73 71 6c 69 74 65 33 53    && 0==sqlite3S
5530: 74 72 4e 49 43 6d 70 28 7a 4e 61 6d 65 2c 20 22  trNICmp(zName, "
5540: 73 71 6c 69 74 65 5f 22 2c 20 37 29 20 29 7b 0a  sqlite_", 7) ){.
5550: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
5560: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6f 62 6a  Msg(pParse, "obj
5570: 65 63 74 20 6e 61 6d 65 20 72 65 73 65 72 76 65  ect name reserve
5580: 64 20 66 6f 72 20 69 6e 74 65 72 6e 61 6c 20 75  d for internal u
5590: 73 65 3a 20 25 73 22 2c 20 7a 4e 61 6d 65 29 3b  se: %s", zName);
55a0: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
55b0: 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  TE_ERROR;.  }.  
55c0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
55d0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65 67 69 6e  ;.}../*.** Begin
55e0: 20 63 6f 6e 73 74 72 75 63 74 69 6e 67 20 61 20   constructing a 
55f0: 6e 65 77 20 74 61 62 6c 65 20 72 65 70 72 65 73  new table repres
5600: 65 6e 74 61 74 69 6f 6e 20 69 6e 20 6d 65 6d 6f  entation in memo
5610: 72 79 2e 20 20 54 68 69 73 20 69 73 0a 2a 2a 20  ry.  This is.** 
5620: 74 68 65 20 66 69 72 73 74 20 6f 66 20 73 65 76  the first of sev
5630: 65 72 61 6c 20 61 63 74 69 6f 6e 20 72 6f 75 74  eral action rout
5640: 69 6e 65 73 20 74 68 61 74 20 67 65 74 20 63 61  ines that get ca
5650: 6c 6c 65 64 20 69 6e 20 72 65 73 70 6f 6e 73 65  lled in response
5660: 0a 2a 2a 20 74 6f 20 61 20 43 52 45 41 54 45 20  .** to a CREATE 
5670: 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e  TABLE statement.
5680: 20 20 49 6e 20 70 61 72 74 69 63 75 6c 61 72 2c    In particular,
5690: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
56a0: 20 63 61 6c 6c 65 64 0a 2a 2a 20 61 66 74 65 72   called.** after
56b0: 20 73 65 65 69 6e 67 20 74 6f 6b 65 6e 73 20 22   seeing tokens "
56c0: 43 52 45 41 54 45 22 20 61 6e 64 20 22 54 41 42  CREATE" and "TAB
56d0: 4c 45 22 20 61 6e 64 20 74 68 65 20 74 61 62 6c  LE" and the tabl
56e0: 65 20 6e 61 6d 65 2e 20 54 68 65 20 69 73 54 65  e name. The isTe
56f0: 6d 70 0a 2a 2a 20 66 6c 61 67 20 69 73 20 74 72  mp.** flag is tr
5700: 75 65 20 69 66 20 74 68 65 20 74 61 62 6c 65 20  ue if the table 
5710: 73 68 6f 75 6c 64 20 62 65 20 73 74 6f 72 65 64  should be stored
5720: 20 69 6e 20 74 68 65 20 61 75 78 69 6c 69 61 72   in the auxiliar
5730: 79 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 66 69  y database.** fi
5740: 6c 65 20 69 6e 73 74 65 61 64 20 6f 66 20 69 6e  le instead of in
5750: 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61   the main databa
5760: 73 65 20 66 69 6c 65 2e 20 20 54 68 69 73 20 69  se file.  This i
5770: 73 20 6e 6f 72 6d 61 6c 6c 79 20 74 68 65 20 63  s normally the c
5780: 61 73 65 0a 2a 2a 20 77 68 65 6e 20 74 68 65 20  ase.** when the 
5790: 22 54 45 4d 50 22 20 6f 72 20 22 54 45 4d 50 4f  "TEMP" or "TEMPO
57a0: 52 41 52 59 22 20 6b 65 79 77 6f 72 64 20 6f 63  RARY" keyword oc
57b0: 63 75 72 73 20 69 6e 20 62 65 74 77 65 65 6e 0a  curs in between.
57c0: 2a 2a 20 43 52 45 41 54 45 20 61 6e 64 20 54 41  ** CREATE and TA
57d0: 42 4c 45 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e  BLE..**.** The n
57e0: 65 77 20 74 61 62 6c 65 20 72 65 63 6f 72 64 20  ew table record 
57f0: 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 61  is initialized a
5800: 6e 64 20 70 75 74 20 69 6e 20 70 50 61 72 73 65  nd put in pParse
5810: 2d 3e 70 4e 65 77 54 61 62 6c 65 2e 0a 2a 2a 20  ->pNewTable..** 
5820: 41 73 20 6d 6f 72 65 20 6f 66 20 74 68 65 20 43  As more of the C
5830: 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74  REATE TABLE stat
5840: 65 6d 65 6e 74 20 69 73 20 70 61 72 73 65 64 2c  ement is parsed,
5850: 20 61 64 64 69 74 69 6f 6e 61 6c 20 61 63 74 69   additional acti
5860: 6f 6e 0a 2a 2a 20 72 6f 75 74 69 6e 65 73 20 77  on.** routines w
5870: 69 6c 6c 20 62 65 20 63 61 6c 6c 65 64 20 74 6f  ill be called to
5880: 20 61 64 64 20 6d 6f 72 65 20 69 6e 66 6f 72 6d   add more inform
5890: 61 74 69 6f 6e 20 74 6f 20 74 68 69 73 20 72 65  ation to this re
58a0: 63 6f 72 64 2e 0a 2a 2a 20 41 74 20 74 68 65 20  cord..** At the 
58b0: 65 6e 64 20 6f 66 20 74 68 65 20 43 52 45 41 54  end of the CREAT
58c0: 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e  E TABLE statemen
58d0: 74 2c 20 74 68 65 20 73 71 6c 69 74 65 33 45 6e  t, the sqlite3En
58e0: 64 54 61 62 6c 65 28 29 20 72 6f 75 74 69 6e 65  dTable() routine
58f0: 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64 20 74 6f  .** is called to
5900: 20 63 6f 6d 70 6c 65 74 65 20 74 68 65 20 63 6f   complete the co
5910: 6e 73 74 72 75 63 74 69 6f 6e 20 6f 66 20 74 68  nstruction of th
5920: 65 20 6e 65 77 20 74 61 62 6c 65 20 72 65 63 6f  e new table reco
5930: 72 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  rd..*/.void sqli
5940: 74 65 33 53 74 61 72 74 54 61 62 6c 65 28 0a 20  te3StartTable(. 
5950: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
5960: 20 20 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e 74    /* Parser cont
5970: 65 78 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  ext */.  Token *
5980: 70 4e 61 6d 65 31 2c 20 20 20 2f 2a 20 46 69 72  pName1,   /* Fir
5990: 73 74 20 70 61 72 74 20 6f 66 20 74 68 65 20 6e  st part of the n
59a0: 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65  ame of the table
59b0: 20 6f 72 20 76 69 65 77 20 2a 2f 0a 20 20 54 6f   or view */.  To
59c0: 6b 65 6e 20 2a 70 4e 61 6d 65 32 2c 20 20 20 2f  ken *pName2,   /
59d0: 2a 20 53 65 63 6f 6e 64 20 70 61 72 74 20 6f 66  * Second part of
59e0: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
59f0: 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77 20 2a   table or view *
5a00: 2f 0a 20 20 69 6e 74 20 69 73 54 65 6d 70 2c 20  /.  int isTemp, 
5a10: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
5a20: 74 68 69 73 20 69 73 20 61 20 54 45 4d 50 20 74  this is a TEMP t
5a30: 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73  able */.  int is
5a40: 56 69 65 77 2c 20 20 20 20 20 20 2f 2a 20 54 72  View,      /* Tr
5a50: 75 65 20 69 66 20 74 68 69 73 20 69 73 20 61 20  ue if this is a 
5a60: 56 49 45 57 20 2a 2f 0a 20 20 69 6e 74 20 69 73  VIEW */.  int is
5a70: 56 69 72 74 75 61 6c 2c 20 20 20 2f 2a 20 54 72  Virtual,   /* Tr
5a80: 75 65 20 69 66 20 74 68 69 73 20 69 73 20 61 20  ue if this is a 
5a90: 56 49 52 54 55 41 4c 20 74 61 62 6c 65 20 2a 2f  VIRTUAL table */
5aa0: 0a 20 20 69 6e 74 20 6e 6f 45 72 72 20 20 20 20  .  int noErr    
5ab0: 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 68 69 6e      /* Do nothin
5ac0: 67 20 69 66 20 74 61 62 6c 65 20 61 6c 72 65 61  g if table alrea
5ad0: 64 79 20 65 78 69 73 74 73 20 2a 2f 0a 29 7b 0a  dy exists */.){.
5ae0: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 6c 65 3b    Table *pTable;
5af0: 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d  .  char *zName =
5b00: 20 30 3b 20 2f 2a 20 54 68 65 20 6e 61 6d 65 20   0; /* The name 
5b10: 6f 66 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65  of the new table
5b20: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
5b30: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
5b40: 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 69 6e 74    Vdbe *v;.  int
5b50: 20 69 44 62 3b 20 20 20 20 20 20 20 20 20 2f 2a   iDb;         /*
5b60: 20 44 61 74 61 62 61 73 65 20 6e 75 6d 62 65 72   Database number
5b70: 20 74 6f 20 63 72 65 61 74 65 20 74 68 65 20 74   to create the t
5b80: 61 62 6c 65 20 69 6e 20 2a 2f 0a 20 20 54 6f 6b  able in */.  Tok
5b90: 65 6e 20 2a 70 4e 61 6d 65 3b 20 20 20 20 2f 2a  en *pName;    /*
5ba0: 20 55 6e 71 75 61 6c 69 66 69 65 64 20 6e 61 6d   Unqualified nam
5bb0: 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74  e of the table t
5bc0: 6f 20 63 72 65 61 74 65 20 2a 2f 0a 0a 20 20 2f  o create */..  /
5bd0: 2a 20 54 68 65 20 74 61 62 6c 65 20 6f 72 20 76  * The table or v
5be0: 69 65 77 20 6e 61 6d 65 20 74 6f 20 63 72 65 61  iew name to crea
5bf0: 74 65 20 69 73 20 70 61 73 73 65 64 20 74 6f 20  te is passed to 
5c00: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 76 69 61  this routine via
5c10: 20 74 6f 6b 65 6e 73 0a 20 20 2a 2a 20 70 4e 61   tokens.  ** pNa
5c20: 6d 65 31 20 61 6e 64 20 70 4e 61 6d 65 32 2e 20  me1 and pName2. 
5c30: 49 66 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d  If the table nam
5c40: 65 20 77 61 73 20 66 75 6c 6c 79 20 71 75 61 6c  e was fully qual
5c50: 69 66 69 65 64 2c 20 66 6f 72 20 65 78 61 6d 70  ified, for examp
5c60: 6c 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43 52  le:.  **.  ** CR
5c70: 45 41 54 45 20 54 41 42 4c 45 20 78 78 78 2e 79  EATE TABLE xxx.y
5c80: 79 79 20 28 2e 2e 2e 29 3b 0a 20 20 2a 2a 20 0a  yy (...);.  ** .
5c90: 20 20 2a 2a 20 54 68 65 6e 20 70 4e 61 6d 65 31    ** Then pName1
5ca0: 20 69 73 20 73 65 74 20 74 6f 20 22 78 78 78 22   is set to "xxx"
5cb0: 20 61 6e 64 20 70 4e 61 6d 65 32 20 22 79 79 79   and pName2 "yyy
5cc0: 22 2e 20 4f 6e 20 74 68 65 20 6f 74 68 65 72 20  ". On the other 
5cd0: 68 61 6e 64 20 69 66 0a 20 20 2a 2a 20 74 68 65  hand if.  ** the
5ce0: 20 74 61 62 6c 65 20 6e 61 6d 65 20 69 73 20 6e   table name is n
5cf0: 6f 74 20 66 75 6c 6c 79 20 71 75 61 6c 69 66 69  ot fully qualifi
5d00: 65 64 2c 20 69 2e 65 2e 3a 0a 20 20 2a 2a 0a 20  ed, i.e.:.  **. 
5d10: 20 2a 2a 20 43 52 45 41 54 45 20 54 41 42 4c 45   ** CREATE TABLE
5d20: 20 79 79 79 28 2e 2e 2e 29 3b 0a 20 20 2a 2a 0a   yyy(...);.  **.
5d30: 20 20 2a 2a 20 54 68 65 6e 20 70 4e 61 6d 65 31    ** Then pName1
5d40: 20 69 73 20 73 65 74 20 74 6f 20 22 79 79 79 22   is set to "yyy"
5d50: 20 61 6e 64 20 70 4e 61 6d 65 32 20 69 73 20 22   and pName2 is "
5d60: 22 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65  "..  **.  ** The
5d70: 20 63 61 6c 6c 20 62 65 6c 6f 77 20 73 65 74 73   call below sets
5d80: 20 74 68 65 20 70 4e 61 6d 65 20 70 6f 69 6e 74   the pName point
5d90: 65 72 20 74 6f 20 70 6f 69 6e 74 20 61 74 20 74  er to point at t
5da0: 68 65 20 74 6f 6b 65 6e 20 28 70 4e 61 6d 65 31  he token (pName1
5db0: 20 6f 72 0a 20 20 2a 2a 20 70 4e 61 6d 65 32 29   or.  ** pName2)
5dc0: 20 74 68 61 74 20 73 74 6f 72 65 73 20 74 68 65   that stores the
5dd0: 20 75 6e 71 75 61 6c 69 66 69 65 64 20 74 61 62   unqualified tab
5de0: 6c 65 20 6e 61 6d 65 2e 20 54 68 65 20 76 61 72  le name. The var
5df0: 69 61 62 6c 65 20 69 44 62 20 69 73 0a 20 20 2a  iable iDb is.  *
5e00: 2a 20 73 65 74 20 74 6f 20 74 68 65 20 69 6e 64  * set to the ind
5e10: 65 78 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ex of the databa
5e20: 73 65 20 74 68 61 74 20 74 68 65 20 74 61 62 6c  se that the tabl
5e30: 65 20 6f 72 20 76 69 65 77 20 69 73 20 74 6f 20  e or view is to 
5e40: 62 65 0a 20 20 2a 2a 20 63 72 65 61 74 65 64 20  be.  ** created 
5e50: 69 6e 2e 0a 20 20 2a 2f 0a 20 20 69 44 62 20 3d  in..  */.  iDb =
5e60: 20 73 71 6c 69 74 65 33 54 77 6f 50 61 72 74 4e   sqlite3TwoPartN
5e70: 61 6d 65 28 70 50 61 72 73 65 2c 20 70 4e 61 6d  ame(pParse, pNam
5e80: 65 31 2c 20 70 4e 61 6d 65 32 2c 20 26 70 4e 61  e1, pName2, &pNa
5e90: 6d 65 29 3b 0a 20 20 69 66 28 20 69 44 62 3c 30  me);.  if( iDb<0
5ea0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
5eb0: 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26 26   !OMIT_TEMPDB &&
5ec0: 20 69 73 54 65 6d 70 20 26 26 20 69 44 62 3e 31   isTemp && iDb>1
5ed0: 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 63 72   ){.    /* If cr
5ee0: 65 61 74 69 6e 67 20 61 20 74 65 6d 70 20 74 61  eating a temp ta
5ef0: 62 6c 65 2c 20 74 68 65 20 6e 61 6d 65 20 6d 61  ble, the name ma
5f00: 79 20 6e 6f 74 20 62 65 20 71 75 61 6c 69 66 69  y not be qualifi
5f10: 65 64 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65  ed */.    sqlite
5f20: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
5f30: 2c 20 22 74 65 6d 70 6f 72 61 72 79 20 74 61 62  , "temporary tab
5f40: 6c 65 20 6e 61 6d 65 20 6d 75 73 74 20 62 65 20  le name must be 
5f50: 75 6e 71 75 61 6c 69 66 69 65 64 22 29 3b 0a 20  unqualified");. 
5f60: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
5f70: 20 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44   if( !OMIT_TEMPD
5f80: 42 20 26 26 20 69 73 54 65 6d 70 20 29 20 69 44  B && isTemp ) iD
5f90: 62 20 3d 20 31 3b 0a 0a 20 20 70 50 61 72 73 65  b = 1;..  pParse
5fa0: 2d 3e 73 4e 61 6d 65 54 6f 6b 65 6e 20 3d 20 2a  ->sNameToken = *
5fb0: 70 4e 61 6d 65 3b 0a 20 20 7a 4e 61 6d 65 20 3d  pName;.  zName =
5fc0: 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d   sqlite3NameFrom
5fd0: 54 6f 6b 65 6e 28 64 62 2c 20 70 4e 61 6d 65 29  Token(db, pName)
5fe0: 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30  ;.  if( zName==0
5ff0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
6000: 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69   SQLITE_OK!=sqli
6010: 74 65 33 43 68 65 63 6b 4f 62 6a 65 63 74 4e 61  te3CheckObjectNa
6020: 6d 65 28 70 50 61 72 73 65 2c 20 7a 4e 61 6d 65  me(pParse, zName
6030: 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 62 65  ) ){.    goto be
6040: 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b  gin_table_error;
6050: 0a 20 20 7d 0a 20 20 69 66 28 20 64 62 2d 3e 69  .  }.  if( db->i
6060: 6e 69 74 2e 69 44 62 3d 3d 31 20 29 20 69 73 54  nit.iDb==1 ) isT
6070: 65 6d 70 20 3d 20 31 3b 0a 23 69 66 6e 64 65 66  emp = 1;.#ifndef
6080: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
6090: 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 61 73 73  HORIZATION.  ass
60a0: 65 72 74 28 20 28 69 73 54 65 6d 70 20 26 20 31  ert( (isTemp & 1
60b0: 29 3d 3d 69 73 54 65 6d 70 20 29 3b 0a 20 20 7b  )==isTemp );.  {
60c0: 0a 20 20 20 20 69 6e 74 20 63 6f 64 65 3b 0a 20  .    int code;. 
60d0: 20 20 20 63 68 61 72 20 2a 7a 44 62 20 3d 20 64     char *zDb = d
60e0: 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d  b->aDb[iDb].zNam
60f0: 65 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  e;.    if( sqlit
6100: 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72  e3AuthCheck(pPar
6110: 73 65 2c 20 53 51 4c 49 54 45 5f 49 4e 53 45 52  se, SQLITE_INSER
6120: 54 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28  T, SCHEMA_TABLE(
6130: 69 73 54 65 6d 70 29 2c 20 30 2c 20 7a 44 62 29  isTemp), 0, zDb)
6140: 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 62   ){.      goto b
6150: 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72  egin_table_error
6160: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
6170: 69 73 56 69 65 77 20 29 7b 0a 20 20 20 20 20 20  isView ){.      
6180: 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42  if( !OMIT_TEMPDB
6190: 20 26 26 20 69 73 54 65 6d 70 20 29 7b 0a 20 20   && isTemp ){.  
61a0: 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c        code = SQL
61b0: 49 54 45 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f  ITE_CREATE_TEMP_
61c0: 56 49 45 57 3b 0a 20 20 20 20 20 20 7d 65 6c 73  VIEW;.      }els
61d0: 65 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20  e{.        code 
61e0: 3d 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f  = SQLITE_CREATE_
61f0: 56 49 45 57 3b 0a 20 20 20 20 20 20 7d 0a 20 20  VIEW;.      }.  
6200: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
6210: 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20  f( !OMIT_TEMPDB 
6220: 26 26 20 69 73 54 65 6d 70 20 29 7b 0a 20 20 20  && isTemp ){.   
6230: 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49       code = SQLI
6240: 54 45 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f 54  TE_CREATE_TEMP_T
6250: 41 42 4c 45 3b 0a 20 20 20 20 20 20 7d 65 6c 73  ABLE;.      }els
6260: 65 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20  e{.        code 
6270: 3d 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f  = SQLITE_CREATE_
6280: 54 41 42 4c 45 3b 0a 20 20 20 20 20 20 7d 0a 20  TABLE;.      }. 
6290: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21 69 73     }.    if( !is
62a0: 56 69 72 74 75 61 6c 20 26 26 20 73 71 6c 69 74  Virtual && sqlit
62b0: 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72  e3AuthCheck(pPar
62c0: 73 65 2c 20 63 6f 64 65 2c 20 7a 4e 61 6d 65 2c  se, code, zName,
62d0: 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20   0, zDb) ){.    
62e0: 20 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62    goto begin_tab
62f0: 6c 65 5f 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a  le_error;.    }.
6300: 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a    }.#endif..  /*
6310: 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 6e   Make sure the n
6320: 65 77 20 74 61 62 6c 65 20 6e 61 6d 65 20 64 6f  ew table name do
6330: 65 73 20 6e 6f 74 20 63 6f 6c 6c 69 64 65 20 77  es not collide w
6340: 69 74 68 20 61 6e 20 65 78 69 73 74 69 6e 67 0a  ith an existing.
6350: 20 20 2a 2a 20 69 6e 64 65 78 20 6f 72 20 74 61    ** index or ta
6360: 62 6c 65 20 6e 61 6d 65 20 69 6e 20 74 68 65 20  ble name in the 
6370: 73 61 6d 65 20 64 61 74 61 62 61 73 65 2e 20 20  same database.  
6380: 49 73 73 75 65 20 61 6e 20 65 72 72 6f 72 20 6d  Issue an error m
6390: 65 73 73 61 67 65 20 69 66 0a 20 20 2a 2a 20 69  essage if.  ** i
63a0: 74 20 64 6f 65 73 2e 20 54 68 65 20 65 78 63 65  t does. The exce
63b0: 70 74 69 6f 6e 20 69 73 20 69 66 20 74 68 65 20  ption is if the 
63c0: 73 74 61 74 65 6d 65 6e 74 20 62 65 69 6e 67 20  statement being 
63d0: 70 61 72 73 65 64 20 77 61 73 20 70 61 73 73 65  parsed was passe
63e0: 64 0a 20 20 2a 2a 20 74 6f 20 61 6e 20 73 71 6c  d.  ** to an sql
63f0: 69 74 65 33 5f 64 65 63 6c 61 72 65 5f 76 74 61  ite3_declare_vta
6400: 62 28 29 20 63 61 6c 6c 2e 20 49 6e 20 74 68 61  b() call. In tha
6410: 74 20 63 61 73 65 20 6f 6e 6c 79 20 74 68 65 20  t case only the 
6420: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 0a 20 20 2a  column names.  *
6430: 2a 20 61 6e 64 20 74 79 70 65 73 20 77 69 6c 6c  * and types will
6440: 20 62 65 20 75 73 65 64 2c 20 73 6f 20 74 68 65   be used, so the
6450: 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 20 74 6f  re is no need to
6460: 20 74 65 73 74 20 66 6f 72 20 6e 61 6d 65 73 70   test for namesp
6470: 61 63 65 0a 20 20 2a 2a 20 63 6f 6c 6c 69 73 69  ace.  ** collisi
6480: 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ons..  */.  if( 
6490: 21 49 4e 5f 44 45 43 4c 41 52 45 5f 56 54 41 42  !IN_DECLARE_VTAB
64a0: 20 29 7b 0a 20 20 20 20 69 66 28 20 53 51 4c 49   ){.    if( SQLI
64b0: 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65  TE_OK!=sqlite3Re
64c0: 61 64 53 63 68 65 6d 61 28 70 50 61 72 73 65 29  adSchema(pParse)
64d0: 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 62   ){.      goto b
64e0: 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72  egin_table_error
64f0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 54 61 62  ;.    }.    pTab
6500: 6c 65 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64  le = sqlite3Find
6510: 54 61 62 6c 65 28 64 62 2c 20 7a 4e 61 6d 65 2c  Table(db, zName,
6520: 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e   db->aDb[iDb].zN
6530: 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 70 54  ame);.    if( pT
6540: 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 69 66  able ){.      if
6550: 28 20 21 6e 6f 45 72 72 20 29 7b 0a 20 20 20 20  ( !noErr ){.    
6560: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
6570: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 61 62  Msg(pParse, "tab
6580: 6c 65 20 25 54 20 61 6c 72 65 61 64 79 20 65 78  le %T already ex
6590: 69 73 74 73 22 2c 20 70 4e 61 6d 65 29 3b 0a 20  ists", pName);. 
65a0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 67 6f 74       }.      got
65b0: 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72  o begin_table_er
65c0: 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ror;.    }.    i
65d0: 66 28 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e  f( sqlite3FindIn
65e0: 64 65 78 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 30  dex(db, zName, 0
65f0: 29 21 3d 30 20 26 26 20 28 69 44 62 3d 3d 30 20  )!=0 && (iDb==0 
6600: 7c 7c 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73  || !db->init.bus
6610: 79 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  y) ){.      sqli
6620: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
6630: 73 65 2c 20 22 74 68 65 72 65 20 69 73 20 61 6c  se, "there is al
6640: 72 65 61 64 79 20 61 6e 20 69 6e 64 65 78 20 6e  ready an index n
6650: 61 6d 65 64 20 25 73 22 2c 20 7a 4e 61 6d 65 29  amed %s", zName)
6660: 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 62 65 67  ;.      goto beg
6670: 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b 0a  in_table_error;.
6680: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 54 61      }.  }..  pTa
6690: 62 6c 65 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  ble = sqlite3DbM
66a0: 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69  allocZero(db, si
66b0: 7a 65 6f 66 28 54 61 62 6c 65 29 29 3b 0a 20 20  zeof(Table));.  
66c0: 69 66 28 20 70 54 61 62 6c 65 3d 3d 30 20 29 7b  if( pTable==0 ){
66d0: 0a 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  .    db->mallocF
66e0: 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20 70  ailed = 1;.    p
66f0: 50 61 72 73 65 2d 3e 72 63 20 3d 20 53 51 4c 49  Parse->rc = SQLI
6700: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 70 50  TE_NOMEM;.    pP
6710: 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20  arse->nErr++;.  
6720: 20 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62    goto begin_tab
6730: 6c 65 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 20 20  le_error;.  }.  
6740: 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 20 3d 20  pTable->zName = 
6750: 7a 4e 61 6d 65 3b 0a 20 20 70 54 61 62 6c 65 2d  zName;.  pTable-
6760: 3e 69 50 4b 65 79 20 3d 20 2d 31 3b 0a 20 20 70  >iPKey = -1;.  p
6770: 54 61 62 6c 65 2d 3e 70 53 63 68 65 6d 61 20 3d  Table->pSchema =
6780: 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53   db->aDb[iDb].pS
6790: 63 68 65 6d 61 3b 0a 20 20 70 54 61 62 6c 65 2d  chema;.  pTable-
67a0: 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20 70 54 61  >nRef = 1;.  pTa
67b0: 62 6c 65 2d 3e 64 62 20 3d 20 64 62 3b 0a 20 20  ble->db = db;.  
67c0: 69 66 28 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  if( pParse->pNew
67d0: 54 61 62 6c 65 20 29 20 73 71 6c 69 74 65 33 44  Table ) sqlite3D
67e0: 65 6c 65 74 65 54 61 62 6c 65 28 70 50 61 72 73  eleteTable(pPars
67f0: 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3b 0a 20  e->pNewTable);. 
6800: 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
6810: 6c 65 20 3d 20 70 54 61 62 6c 65 3b 0a 0a 20 20  le = pTable;..  
6820: 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 74 68  /* If this is th
6830: 65 20 6d 61 67 69 63 20 73 71 6c 69 74 65 5f 73  e magic sqlite_s
6840: 65 71 75 65 6e 63 65 20 74 61 62 6c 65 20 75 73  equence table us
6850: 65 64 20 62 79 20 61 75 74 6f 69 6e 63 72 65 6d  ed by autoincrem
6860: 65 6e 74 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 72  ent,.  ** then r
6870: 65 63 6f 72 64 20 61 20 70 6f 69 6e 74 65 72 20  ecord a pointer 
6880: 74 6f 20 74 68 69 73 20 74 61 62 6c 65 20 69 6e  to this table in
6890: 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61   the main databa
68a0: 73 65 20 73 74 72 75 63 74 75 72 65 0a 20 20 2a  se structure.  *
68b0: 2a 20 73 6f 20 74 68 61 74 20 49 4e 53 45 52 54  * so that INSERT
68c0: 20 63 61 6e 20 66 69 6e 64 20 74 68 65 20 74 61   can find the ta
68d0: 62 6c 65 20 65 61 73 69 6c 79 2e 0a 20 20 2a 2f  ble easily..  */
68e0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
68f0: 4f 4d 49 54 5f 41 55 54 4f 49 4e 43 52 45 4d 45  OMIT_AUTOINCREME
6900: 4e 54 0a 20 20 69 66 28 20 21 70 50 61 72 73 65  NT.  if( !pParse
6910: 2d 3e 6e 65 73 74 65 64 20 26 26 20 73 74 72 63  ->nested && strc
6920: 6d 70 28 7a 4e 61 6d 65 2c 20 22 73 71 6c 69 74  mp(zName, "sqlit
6930: 65 5f 73 65 71 75 65 6e 63 65 22 29 3d 3d 30 20  e_sequence")==0 
6940: 29 7b 0a 20 20 20 20 70 54 61 62 6c 65 2d 3e 70  ){.    pTable->p
6950: 53 63 68 65 6d 61 2d 3e 70 53 65 71 54 61 62 20  Schema->pSeqTab 
6960: 3d 20 70 54 61 62 6c 65 3b 0a 20 20 7d 0a 23 65  = pTable;.  }.#e
6970: 6e 64 69 66 0a 0a 20 20 2f 2a 20 42 65 67 69 6e  ndif..  /* Begin
6980: 20 67 65 6e 65 72 61 74 69 6e 67 20 74 68 65 20   generating the 
6990: 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 69  code that will i
69a0: 6e 73 65 72 74 20 74 68 65 20 74 61 62 6c 65 20  nsert the table 
69b0: 72 65 63 6f 72 64 20 69 6e 74 6f 0a 20 20 2a 2a  record into.  **
69c0: 20 74 68 65 20 53 51 4c 49 54 45 5f 4d 41 53 54   the SQLITE_MAST
69d0: 45 52 20 74 61 62 6c 65 2e 20 20 4e 6f 74 65 20  ER table.  Note 
69e0: 69 6e 20 70 61 72 74 69 63 75 6c 61 72 20 74 68  in particular th
69f0: 61 74 20 77 65 20 6d 75 73 74 20 67 6f 20 61 68  at we must go ah
6a00: 65 61 64 0a 20 20 2a 2a 20 61 6e 64 20 61 6c 6c  ead.  ** and all
6a10: 6f 63 61 74 65 20 74 68 65 20 72 65 63 6f 72 64  ocate the record
6a20: 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20   number for the 
6a30: 74 61 62 6c 65 20 65 6e 74 72 79 20 6e 6f 77 2e  table entry now.
6a40: 20 20 42 65 66 6f 72 65 20 61 6e 79 0a 20 20 2a    Before any.  *
6a50: 2a 20 50 52 49 4d 41 52 59 20 4b 45 59 20 6f 72  * PRIMARY KEY or
6a60: 20 55 4e 49 51 55 45 20 6b 65 79 77 6f 72 64 73   UNIQUE keywords
6a70: 20 61 72 65 20 70 61 72 73 65 64 2e 20 20 54 68   are parsed.  Th
6a80: 6f 73 65 20 6b 65 79 77 6f 72 64 73 20 77 69 6c  ose keywords wil
6a90: 6c 20 63 61 75 73 65 0a 20 20 2a 2a 20 69 6e 64  l cause.  ** ind
6aa0: 69 63 65 73 20 74 6f 20 62 65 20 63 72 65 61 74  ices to be creat
6ab0: 65 64 20 61 6e 64 20 74 68 65 20 74 61 62 6c 65  ed and the table
6ac0: 20 72 65 63 6f 72 64 20 6d 75 73 74 20 63 6f 6d   record must com
6ad0: 65 20 62 65 66 6f 72 65 20 74 68 65 20 0a 20 20  e before the .  
6ae0: 2a 2a 20 69 6e 64 69 63 65 73 2e 20 20 48 65 6e  ** indices.  Hen
6af0: 63 65 2c 20 74 68 65 20 72 65 63 6f 72 64 20 6e  ce, the record n
6b00: 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20 74 61  umber for the ta
6b10: 62 6c 65 20 6d 75 73 74 20 62 65 20 61 6c 6c 6f  ble must be allo
6b20: 63 61 74 65 64 0a 20 20 2a 2a 20 6e 6f 77 2e 0a  cated.  ** now..
6b30: 20 20 2a 2f 0a 20 20 69 66 28 20 21 64 62 2d 3e    */.  if( !db->
6b40: 69 6e 69 74 2e 62 75 73 79 20 26 26 20 28 76 20  init.busy && (v 
6b50: 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
6b60: 28 70 50 61 72 73 65 29 29 21 3d 30 20 29 7b 0a  (pParse))!=0 ){.
6b70: 20 20 20 20 69 6e 74 20 6a 31 3b 0a 20 20 20 20      int j1;.    
6b80: 69 6e 74 20 66 69 6c 65 46 6f 72 6d 61 74 3b 0a  int fileFormat;.
6b90: 20 20 20 20 69 6e 74 20 72 65 67 31 2c 20 72 65      int reg1, re
6ba0: 67 32 2c 20 72 65 67 33 3b 0a 20 20 20 20 73 71  g2, reg3;.    sq
6bb0: 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f  lite3BeginWriteO
6bc0: 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c  peration(pParse,
6bd0: 20 30 2c 20 69 44 62 29 3b 0a 0a 23 69 66 6e 64   0, iDb);..#ifnd
6be0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
6bf0: 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20  IRTUALTABLE.    
6c00: 69 66 28 20 69 73 56 69 72 74 75 61 6c 20 29 7b  if( isVirtual ){
6c10: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
6c20: 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 56  beAddOp0(v, OP_V
6c30: 42 65 67 69 6e 29 3b 0a 20 20 20 20 7d 0a 23 65  Begin);.    }.#e
6c40: 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 49 66 20  ndif..    /* If 
6c50: 74 68 65 20 66 69 6c 65 20 66 6f 72 6d 61 74 20  the file format 
6c60: 61 6e 64 20 65 6e 63 6f 64 69 6e 67 20 69 6e 20  and encoding in 
6c70: 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61 76  the database hav
6c80: 65 20 6e 6f 74 20 62 65 65 6e 20 73 65 74 2c 20  e not been set, 
6c90: 0a 20 20 20 20 2a 2a 20 73 65 74 20 74 68 65 6d  .    ** set them
6ca0: 20 6e 6f 77 2e 0a 20 20 20 20 2a 2f 0a 20 20 20   now..    */.   
6cb0: 20 72 65 67 31 20 3d 20 70 50 61 72 73 65 2d 3e   reg1 = pParse->
6cc0: 72 65 67 52 6f 77 69 64 20 3d 20 2b 2b 70 50 61  regRowid = ++pPa
6cd0: 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 72  rse->nMem;.    r
6ce0: 65 67 32 20 3d 20 70 50 61 72 73 65 2d 3e 72 65  eg2 = pParse->re
6cf0: 67 52 6f 6f 74 20 3d 20 2b 2b 70 50 61 72 73 65  gRoot = ++pParse
6d00: 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 72 65 67 33  ->nMem;.    reg3
6d10: 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
6d20: 6d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  m;.    sqlite3Vd
6d30: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 52  beAddOp3(v, OP_R
6d40: 65 61 64 43 6f 6f 6b 69 65 2c 20 69 44 62 2c 20  eadCookie, iDb, 
6d50: 72 65 67 33 2c 20 31 29 3b 20 20 20 2f 2a 20 66  reg3, 1);   /* f
6d60: 69 6c 65 5f 66 6f 72 6d 61 74 20 2a 2f 0a 20 20  ile_format */.  
6d70: 20 20 73 71 6c 69 74 65 33 56 64 62 65 55 73 65    sqlite3VdbeUse
6d80: 73 42 74 72 65 65 28 76 2c 20 69 44 62 29 3b 0a  sBtree(v, iDb);.
6d90: 20 20 20 20 6a 31 20 3d 20 73 71 6c 69 74 65 33      j1 = sqlite3
6da0: 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
6db0: 5f 49 66 2c 20 72 65 67 33 29 3b 0a 20 20 20 20  _If, reg3);.    
6dc0: 66 69 6c 65 46 6f 72 6d 61 74 20 3d 20 28 64 62  fileFormat = (db
6dd0: 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ->flags & SQLITE
6de0: 5f 4c 65 67 61 63 79 46 69 6c 65 46 6d 74 29 21  _LegacyFileFmt)!
6df0: 3d 30 20 3f 0a 20 20 20 20 20 20 20 20 20 20 20  =0 ?.           
6e00: 20 20 20 20 20 20 20 31 20 3a 20 53 51 4c 49 54         1 : SQLIT
6e10: 45 5f 4d 41 58 5f 46 49 4c 45 5f 46 4f 52 4d 41  E_MAX_FILE_FORMA
6e20: 54 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  T;.    sqlite3Vd
6e30: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
6e40: 6e 74 65 67 65 72 2c 20 66 69 6c 65 46 6f 72 6d  nteger, fileForm
6e50: 61 74 2c 20 72 65 67 33 29 3b 0a 20 20 20 20 73  at, reg3);.    s
6e60: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
6e70: 28 76 2c 20 4f 50 5f 53 65 74 43 6f 6f 6b 69 65  (v, OP_SetCookie
6e80: 2c 20 69 44 62 2c 20 31 2c 20 72 65 67 33 29 3b  , iDb, 1, reg3);
6e90: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
6ea0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
6eb0: 65 67 65 72 2c 20 45 4e 43 28 64 62 29 2c 20 72  eger, ENC(db), r
6ec0: 65 67 33 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  eg3);.    sqlite
6ed0: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
6ee0: 50 5f 53 65 74 43 6f 6f 6b 69 65 2c 20 69 44 62  P_SetCookie, iDb
6ef0: 2c 20 34 2c 20 72 65 67 33 29 3b 0a 20 20 20 20  , 4, reg3);.    
6f00: 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
6f10: 65 72 65 28 76 2c 20 6a 31 29 3b 0a 0a 20 20 20  ere(v, j1);..   
6f20: 20 2f 2a 20 54 68 69 73 20 6a 75 73 74 20 63 72   /* This just cr
6f30: 65 61 74 65 73 20 61 20 70 6c 61 63 65 2d 68 6f  eates a place-ho
6f40: 6c 64 65 72 20 72 65 63 6f 72 64 20 69 6e 20 74  lder record in t
6f50: 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  he sqlite_master
6f60: 20 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2a 20 54   table..    ** T
6f70: 68 65 20 72 65 63 6f 72 64 20 63 72 65 61 74 65  he record create
6f80: 64 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 61  d does not conta
6f90: 69 6e 20 61 6e 79 74 68 69 6e 67 20 79 65 74 2e  in anything yet.
6fa0: 20 20 49 74 20 77 69 6c 6c 20 62 65 20 72 65 70    It will be rep
6fb0: 6c 61 63 65 64 0a 20 20 20 20 2a 2a 20 62 79 20  laced.    ** by 
6fc0: 74 68 65 20 72 65 61 6c 20 65 6e 74 72 79 20 69  the real entry i
6fd0: 6e 20 63 6f 64 65 20 67 65 6e 65 72 61 74 65 64  n code generated
6fe0: 20 61 74 20 73 71 6c 69 74 65 33 45 6e 64 54 61   at sqlite3EndTa
6ff0: 62 6c 65 28 29 2e 0a 20 20 20 20 2a 2a 0a 20 20  ble()..    **.  
7000: 20 20 2a 2a 20 54 68 65 20 72 6f 77 69 64 20 66    ** The rowid f
7010: 6f 72 20 74 68 65 20 6e 65 77 20 65 6e 74 72 79  or the new entry
7020: 20 69 73 20 6c 65 66 74 20 6f 6e 20 74 68 65 20   is left on the 
7030: 74 6f 70 20 6f 66 20 74 68 65 20 73 74 61 63 6b  top of the stack
7040: 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 72 6f 77  ..    ** The row
7050: 69 64 20 76 61 6c 75 65 20 69 73 20 6e 65 65 64  id value is need
7060: 65 64 20 62 79 20 74 68 65 20 63 6f 64 65 20 74  ed by the code t
7070: 68 61 74 20 73 71 6c 69 74 65 33 45 6e 64 54 61  hat sqlite3EndTa
7080: 62 6c 65 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20  ble will.    ** 
7090: 67 65 6e 65 72 61 74 65 2e 0a 20 20 20 20 2a 2f  generate..    */
70a0: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
70b0: 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20  LITE_OMIT_VIEW) 
70c0: 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  || !defined(SQLI
70d0: 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
70e0: 41 42 4c 45 29 0a 20 20 20 20 69 66 28 20 69 73  ABLE).    if( is
70f0: 56 69 65 77 20 7c 7c 20 69 73 56 69 72 74 75 61  View || isVirtua
7100: 6c 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  l ){.      sqlit
7110: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
7120: 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 72  OP_Integer, 0, r
7130: 65 67 32 29 3b 0a 20 20 20 20 7d 65 6c 73 65 0a  eg2);.    }else.
7140: 23 65 6e 64 69 66 0a 20 20 20 20 7b 0a 20 20 20  #endif.    {.   
7150: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
7160: 64 4f 70 32 28 76 2c 20 4f 50 5f 43 72 65 61 74  dOp2(v, OP_Creat
7170: 65 54 61 62 6c 65 2c 20 69 44 62 2c 20 72 65 67  eTable, iDb, reg
7180: 32 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  2);.    }.    sq
7190: 6c 69 74 65 33 4f 70 65 6e 4d 61 73 74 65 72 54  lite3OpenMasterT
71a0: 61 62 6c 65 28 70 50 61 72 73 65 2c 20 69 44 62  able(pParse, iDb
71b0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
71c0: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
71d0: 65 77 52 6f 77 69 64 2c 20 30 2c 20 72 65 67 31  ewRowid, 0, reg1
71e0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
71f0: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
7200: 75 6c 6c 2c 20 30 2c 20 72 65 67 33 29 3b 0a 20  ull, 0, reg3);. 
7210: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
7220: 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72  dOp3(v, OP_Inser
7230: 74 2c 20 30 2c 20 72 65 67 33 2c 20 72 65 67 31  t, 0, reg3, reg1
7240: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
7250: 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50  beChangeP5(v, OP
7260: 46 4c 41 47 5f 41 50 50 45 4e 44 29 3b 0a 20 20  FLAG_APPEND);.  
7270: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
7280: 4f 70 30 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 29  Op0(v, OP_Close)
7290: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 72 6d  ;.  }..  /* Norm
72a0: 61 6c 20 28 6e 6f 6e 2d 65 72 72 6f 72 29 20 72  al (non-error) r
72b0: 65 74 75 72 6e 2e 20 2a 2f 0a 20 20 72 65 74 75  eturn. */.  retu
72c0: 72 6e 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 20  rn;..  /* If an 
72d0: 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 77 65  error occurs, we
72e0: 20 6a 75 6d 70 20 68 65 72 65 20 2a 2f 0a 62 65   jump here */.be
72f0: 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3a  gin_table_error:
7300: 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
7310: 28 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 72  (db, zName);.  r
7320: 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  eturn;.}../*.** 
7330: 54 68 69 73 20 6d 61 63 72 6f 20 69 73 20 75 73  This macro is us
7340: 65 64 20 74 6f 20 63 6f 6d 70 61 72 65 20 74 77  ed to compare tw
7350: 6f 20 73 74 72 69 6e 67 73 20 69 6e 20 61 20 63  o strings in a c
7360: 61 73 65 2d 69 6e 73 65 6e 73 69 74 69 76 65 20  ase-insensitive 
7370: 6d 61 6e 6e 65 72 2e 0a 2a 2a 20 49 74 20 69 73  manner..** It is
7380: 20 73 6c 69 67 68 74 6c 79 20 66 61 73 74 65 72   slightly faster
7390: 20 74 68 61 6e 20 63 61 6c 6c 69 6e 67 20 73 71   than calling sq
73a0: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 29 20 64  lite3StrICmp() d
73b0: 69 72 65 63 74 6c 79 2c 20 62 75 74 0a 2a 2a 20  irectly, but.** 
73c0: 70 72 6f 64 75 63 65 73 20 6c 61 72 67 65 72 20  produces larger 
73d0: 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 57 41 52 4e  code..**.** WARN
73e0: 49 4e 47 3a 20 54 68 69 73 20 6d 61 63 72 6f 20  ING: This macro 
73f0: 69 73 20 6e 6f 74 20 63 6f 6d 70 61 74 69 62 6c  is not compatibl
7400: 65 20 77 69 74 68 20 74 68 65 20 73 74 72 63 6d  e with the strcm
7410: 70 28 29 20 66 61 6d 69 6c 79 2e 20 49 74 0a 2a  p() family. It.*
7420: 2a 20 72 65 74 75 72 6e 73 20 74 72 75 65 20 69  * returns true i
7430: 66 20 74 68 65 20 74 77 6f 20 73 74 72 69 6e 67  f the two string
7440: 73 20 61 72 65 20 65 71 75 61 6c 2c 20 6f 74 68  s are equal, oth
7450: 65 72 77 69 73 65 20 66 61 6c 73 65 2e 0a 2a 2f  erwise false..*/
7460: 0a 23 64 65 66 69 6e 65 20 53 54 52 49 43 4d 50  .#define STRICMP
7470: 28 78 2c 20 79 29 20 28 5c 0a 73 71 6c 69 74 65  (x, y) (\.sqlite
7480: 33 55 70 70 65 72 54 6f 4c 6f 77 65 72 5b 2a 28  3UpperToLower[*(
7490: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29  unsigned char *)
74a0: 28 78 29 5d 3d 3d 20 20 20 5c 0a 73 71 6c 69 74  (x)]==   \.sqlit
74b0: 65 33 55 70 70 65 72 54 6f 4c 6f 77 65 72 5b 2a  e3UpperToLower[*
74c0: 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a  (unsigned char *
74d0: 29 28 79 29 5d 20 20 20 20 20 5c 0a 26 26 20 73  )(y)]     \.&& s
74e0: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 28 78  qlite3StrICmp((x
74f0: 29 2b 31 2c 28 79 29 2b 31 29 3d 3d 30 20 29 0a  )+1,(y)+1)==0 ).
7500: 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77  ./*.** Add a new
7510: 20 63 6f 6c 75 6d 6e 20 74 6f 20 74 68 65 20 74   column to the t
7520: 61 62 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 62  able currently b
7530: 65 69 6e 67 20 63 6f 6e 73 74 72 75 63 74 65 64  eing constructed
7540: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 72 73  ..**.** The pars
7550: 65 72 20 63 61 6c 6c 73 20 74 68 69 73 20 72 6f  er calls this ro
7560: 75 74 69 6e 65 20 6f 6e 63 65 20 66 6f 72 20 65  utine once for e
7570: 61 63 68 20 63 6f 6c 75 6d 6e 20 64 65 63 6c 61  ach column decla
7580: 72 61 74 69 6f 6e 0a 2a 2a 20 69 6e 20 61 20 43  ration.** in a C
7590: 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74  REATE TABLE stat
75a0: 65 6d 65 6e 74 2e 20 20 73 71 6c 69 74 65 33 53  ement.  sqlite3S
75b0: 74 61 72 74 54 61 62 6c 65 28 29 20 67 65 74 73  tartTable() gets
75c0: 20 63 61 6c 6c 65 64 0a 2a 2a 20 66 69 72 73 74   called.** first
75d0: 20 74 6f 20 67 65 74 20 74 68 69 6e 67 73 20 67   to get things g
75e0: 6f 69 6e 67 2e 20 20 54 68 65 6e 20 74 68 69 73  oing.  Then this
75f0: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
7600: 65 64 20 66 6f 72 20 65 61 63 68 0a 2a 2a 20 63  ed for each.** c
7610: 6f 6c 75 6d 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73  olumn..*/.void s
7620: 71 6c 69 74 65 33 41 64 64 43 6f 6c 75 6d 6e 28  qlite3AddColumn(
7630: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54  Parse *pParse, T
7640: 6f 6b 65 6e 20 2a 70 4e 61 6d 65 29 7b 0a 20 20  oken *pName){.  
7650: 54 61 62 6c 65 20 2a 70 3b 0a 20 20 69 6e 74 20  Table *p;.  int 
7660: 69 3b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20  i;.  char *z;.  
7670: 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20  Column *pCol;.  
7680: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
7690: 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20  arse->db;.  if( 
76a0: 28 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65  (p = pParse->pNe
76b0: 77 54 61 62 6c 65 29 3d 3d 30 20 29 20 72 65 74  wTable)==0 ) ret
76c0: 75 72 6e 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f  urn;.#if SQLITE_
76d0: 4d 41 58 5f 43 4f 4c 55 4d 4e 0a 20 20 69 66 28  MAX_COLUMN.  if(
76e0: 20 70 2d 3e 6e 43 6f 6c 2b 31 3e 64 62 2d 3e 61   p->nCol+1>db->a
76f0: 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d  Limit[SQLITE_LIM
7700: 49 54 5f 43 4f 4c 55 4d 4e 5d 20 29 7b 0a 20 20  IT_COLUMN] ){.  
7710: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
7720: 67 28 70 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d  g(pParse, "too m
7730: 61 6e 79 20 63 6f 6c 75 6d 6e 73 20 6f 6e 20 25  any columns on %
7740: 73 22 2c 20 70 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  s", p->zName);. 
7750: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 23     return;.  }.#
7760: 65 6e 64 69 66 0a 20 20 7a 20 3d 20 73 71 6c 69  endif.  z = sqli
7770: 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e  te3NameFromToken
7780: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 4e 61  (pParse->db, pNa
7790: 6d 65 29 3b 0a 20 20 69 66 28 20 7a 3d 3d 30 20  me);.  if( z==0 
77a0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28  ) return;.  for(
77b0: 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 3b 20  i=0; i<p->nCol; 
77c0: 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 53 54  i++){.    if( ST
77d0: 52 49 43 4d 50 28 7a 2c 20 70 2d 3e 61 43 6f 6c  RICMP(z, p->aCol
77e0: 5b 69 5d 2e 7a 4e 61 6d 65 29 20 29 7b 0a 20 20  [i].zName) ){.  
77f0: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
7800: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 64 75 70  Msg(pParse, "dup
7810: 6c 69 63 61 74 65 20 63 6f 6c 75 6d 6e 20 6e 61  licate column na
7820: 6d 65 3a 20 25 73 22 2c 20 7a 29 3b 0a 20 20 20  me: %s", z);.   
7830: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
7840: 28 64 62 2c 20 7a 29 3b 0a 20 20 20 20 20 20 72  (db, z);.      r
7850: 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d  eturn;.    }.  }
7860: 0a 20 20 69 66 28 20 28 70 2d 3e 6e 43 6f 6c 20  .  if( (p->nCol 
7870: 26 20 30 78 37 29 3d 3d 30 20 29 7b 0a 20 20 20  & 0x7)==0 ){.   
7880: 20 43 6f 6c 75 6d 6e 20 2a 61 4e 65 77 3b 0a 20   Column *aNew;. 
7890: 20 20 20 61 4e 65 77 20 3d 20 73 71 6c 69 74 65     aNew = sqlite
78a0: 33 44 62 52 65 61 6c 6c 6f 63 28 70 50 61 72 73  3DbRealloc(pPars
78b0: 65 2d 3e 64 62 2c 70 2d 3e 61 43 6f 6c 2c 28 70  e->db,p->aCol,(p
78c0: 2d 3e 6e 43 6f 6c 2b 38 29 2a 73 69 7a 65 6f 66  ->nCol+8)*sizeof
78d0: 28 70 2d 3e 61 43 6f 6c 5b 30 5d 29 29 3b 0a 20  (p->aCol[0]));. 
78e0: 20 20 20 69 66 28 20 61 4e 65 77 3d 3d 30 20 29     if( aNew==0 )
78f0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  {.      sqlite3D
7900: 62 46 72 65 65 28 64 62 2c 20 7a 29 3b 0a 20 20  bFree(db, z);.  
7910: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
7920: 7d 0a 20 20 20 20 70 2d 3e 61 43 6f 6c 20 3d 20  }.    p->aCol = 
7930: 61 4e 65 77 3b 0a 20 20 7d 0a 20 20 70 43 6f 6c  aNew;.  }.  pCol
7940: 20 3d 20 26 70 2d 3e 61 43 6f 6c 5b 70 2d 3e 6e   = &p->aCol[p->n
7950: 43 6f 6c 5d 3b 0a 20 20 6d 65 6d 73 65 74 28 70  Col];.  memset(p
7960: 43 6f 6c 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70  Col, 0, sizeof(p
7970: 2d 3e 61 43 6f 6c 5b 30 5d 29 29 3b 0a 20 20 70  ->aCol[0]));.  p
7980: 43 6f 6c 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 3b 0a  Col->zName = z;.
7990: 20 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20   .  /* If there 
79a0: 69 73 20 6e 6f 20 74 79 70 65 20 73 70 65 63 69  is no type speci
79b0: 66 69 65 64 2c 20 63 6f 6c 75 6d 6e 73 20 68 61  fied, columns ha
79c0: 76 65 20 74 68 65 20 64 65 66 61 75 6c 74 20 61  ve the default a
79d0: 66 66 69 6e 69 74 79 0a 20 20 2a 2a 20 27 4e 4f  ffinity.  ** 'NO
79e0: 4e 45 27 2e 20 49 66 20 74 68 65 72 65 20 69 73  NE'. If there is
79f0: 20 61 20 74 79 70 65 20 73 70 65 63 69 66 69 65   a type specifie
7a00: 64 2c 20 74 68 65 6e 20 73 71 6c 69 74 65 33 41  d, then sqlite3A
7a10: 64 64 43 6f 6c 75 6d 6e 54 79 70 65 28 29 20 77  ddColumnType() w
7a20: 69 6c 6c 0a 20 20 2a 2a 20 62 65 20 63 61 6c 6c  ill.  ** be call
7a30: 65 64 20 6e 65 78 74 20 74 6f 20 73 65 74 20 70  ed next to set p
7a40: 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 20 63 6f  Col->affinity co
7a50: 72 72 65 63 74 6c 79 2e 0a 20 20 2a 2f 0a 20 20  rrectly..  */.  
7a60: 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 20 3d  pCol->affinity =
7a70: 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45   SQLITE_AFF_NONE
7a80: 3b 0a 20 20 70 2d 3e 6e 43 6f 6c 2b 2b 3b 0a 7d  ;.  p->nCol++;.}
7a90: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
7aa0: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 62  tine is called b
7ab0: 79 20 74 68 65 20 70 61 72 73 65 72 20 77 68 69  y the parser whi
7ac0: 6c 65 20 69 6e 20 74 68 65 20 6d 69 64 64 6c 65  le in the middle
7ad0: 20 6f 66 0a 2a 2a 20 70 61 72 73 69 6e 67 20 61   of.** parsing a
7ae0: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74   CREATE TABLE st
7af0: 61 74 65 6d 65 6e 74 2e 20 20 41 20 22 4e 4f 54  atement.  A "NOT
7b00: 20 4e 55 4c 4c 22 20 63 6f 6e 73 74 72 61 69 6e   NULL" constrain
7b10: 74 20 68 61 73 0a 2a 2a 20 62 65 65 6e 20 73 65  t has.** been se
7b20: 65 6e 20 6f 6e 20 61 20 63 6f 6c 75 6d 6e 2e 20  en on a column. 
7b30: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65   This routine se
7b40: 74 73 20 74 68 65 20 6e 6f 74 4e 75 6c 6c 20 66  ts the notNull f
7b50: 6c 61 67 20 6f 6e 0a 2a 2a 20 74 68 65 20 63 6f  lag on.** the co
7b60: 6c 75 6d 6e 20 63 75 72 72 65 6e 74 6c 79 20 75  lumn currently u
7b70: 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f  nder constructio
7b80: 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  n..*/.void sqlit
7b90: 65 33 41 64 64 4e 6f 74 4e 75 6c 6c 28 50 61 72  e3AddNotNull(Par
7ba0: 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20  se *pParse, int 
7bb0: 6f 6e 45 72 72 6f 72 29 7b 0a 20 20 54 61 62 6c  onError){.  Tabl
7bc0: 65 20 2a 70 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  e *p;.  int i;. 
7bd0: 20 69 66 28 20 28 70 20 3d 20 70 50 61 72 73 65   if( (p = pParse
7be0: 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3d 3d 30 20  ->pNewTable)==0 
7bf0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 20 3d 20  ) return;.  i = 
7c00: 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 69 66 28  p->nCol-1;.  if(
7c10: 20 69 3e 3d 30 20 29 20 70 2d 3e 61 43 6f 6c 5b   i>=0 ) p->aCol[
7c20: 69 5d 2e 6e 6f 74 4e 75 6c 6c 20 3d 20 28 75 38  i].notNull = (u8
7c30: 29 6f 6e 45 72 72 6f 72 3b 0a 7d 0a 0a 2f 2a 0a  )onError;.}../*.
7c40: 2a 2a 20 53 63 61 6e 20 74 68 65 20 63 6f 6c 75  ** Scan the colu
7c50: 6d 6e 20 74 79 70 65 20 6e 61 6d 65 20 7a 54 79  mn type name zTy
7c60: 70 65 20 28 6c 65 6e 67 74 68 20 6e 54 79 70 65  pe (length nType
7c70: 29 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65  ) and return the
7c80: 0a 2a 2a 20 61 73 73 6f 63 69 61 74 65 64 20 61  .** associated a
7c90: 66 66 69 6e 69 74 79 20 74 79 70 65 2e 0a 2a 2a  ffinity type..**
7ca0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
7cb0: 20 64 6f 65 73 20 61 20 63 61 73 65 2d 69 6e 64   does a case-ind
7cc0: 65 70 65 6e 64 65 6e 74 20 73 65 61 72 63 68 20  ependent search 
7cd0: 6f 66 20 7a 54 79 70 65 20 66 6f 72 20 74 68 65  of zType for the
7ce0: 20 0a 2a 2a 20 73 75 62 73 74 72 69 6e 67 73 20   .** substrings 
7cf0: 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  in the following
7d00: 20 74 61 62 6c 65 2e 20 49 66 20 6f 6e 65 20 6f   table. If one o
7d10: 66 20 74 68 65 20 73 75 62 73 74 72 69 6e 67 73  f the substrings
7d20: 20 69 73 0a 2a 2a 20 66 6f 75 6e 64 2c 20 74 68   is.** found, th
7d30: 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  e corresponding 
7d40: 61 66 66 69 6e 69 74 79 20 69 73 20 72 65 74 75  affinity is retu
7d50: 72 6e 65 64 2e 20 49 66 20 7a 54 79 70 65 20 63  rned. If zType c
7d60: 6f 6e 74 61 69 6e 73 0a 2a 2a 20 6d 6f 72 65 20  ontains.** more 
7d70: 74 68 61 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20  than one of the 
7d80: 73 75 62 73 74 72 69 6e 67 73 2c 20 65 6e 74 72  substrings, entr
7d90: 69 65 73 20 74 6f 77 61 72 64 20 74 68 65 20 74  ies toward the t
7da0: 6f 70 20 6f 66 20 0a 2a 2a 20 74 68 65 20 74 61  op of .** the ta
7db0: 62 6c 65 20 74 61 6b 65 20 70 72 69 6f 72 69 74  ble take priorit
7dc0: 79 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20  y. For example, 
7dd0: 69 66 20 7a 54 79 70 65 20 69 73 20 27 42 4c 4f  if zType is 'BLO
7de0: 42 49 4e 54 27 2c 20 0a 2a 2a 20 53 51 4c 49 54  BINT', .** SQLIT
7df0: 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 20 69 73  E_AFF_INTEGER is
7e00: 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a   returned..**.**
7e10: 20 53 75 62 73 74 72 69 6e 67 20 20 20 20 20 7c   Substring     |
7e20: 20 41 66 66 69 6e 69 74 79 0a 2a 2a 20 2d 2d 2d   Affinity.** ---
7e30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7e40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a  -------------.**
7e50: 20 27 49 4e 54 27 20 20 20 20 20 20 20 20 20 7c   'INT'         |
7e60: 20 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45   SQLITE_AFF_INTE
7e70: 47 45 52 0a 2a 2a 20 27 43 48 41 52 27 20 20 20  GER.** 'CHAR'   
7e80: 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 41 46       | SQLITE_AF
7e90: 46 5f 54 45 58 54 0a 2a 2a 20 27 43 4c 4f 42 27  F_TEXT.** 'CLOB'
7ea0: 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45          | SQLITE
7eb0: 5f 41 46 46 5f 54 45 58 54 0a 2a 2a 20 27 54 45  _AFF_TEXT.** 'TE
7ec0: 58 54 27 20 20 20 20 20 20 20 20 7c 20 53 51 4c  XT'        | SQL
7ed0: 49 54 45 5f 41 46 46 5f 54 45 58 54 0a 2a 2a 20  ITE_AFF_TEXT.** 
7ee0: 27 42 4c 4f 42 27 20 20 20 20 20 20 20 20 7c 20  'BLOB'        | 
7ef0: 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 0a  SQLITE_AFF_NONE.
7f00: 2a 2a 20 27 52 45 41 4c 27 20 20 20 20 20 20 20  ** 'REAL'       
7f10: 20 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f 52 45   | SQLITE_AFF_RE
7f20: 41 4c 0a 2a 2a 20 27 46 4c 4f 41 27 20 20 20 20  AL.** 'FLOA'    
7f30: 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 41 46 46      | SQLITE_AFF
7f40: 5f 52 45 41 4c 0a 2a 2a 20 27 44 4f 55 42 27 20  _REAL.** 'DOUB' 
7f50: 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f         | SQLITE_
7f60: 41 46 46 5f 52 45 41 4c 0a 2a 2a 0a 2a 2a 20 49  AFF_REAL.**.** I
7f70: 66 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20 73 75  f none of the su
7f80: 62 73 74 72 69 6e 67 73 20 69 6e 20 74 68 65 20  bstrings in the 
7f90: 61 62 6f 76 65 20 74 61 62 6c 65 20 61 72 65 20  above table are 
7fa0: 66 6f 75 6e 64 2c 0a 2a 2a 20 53 51 4c 49 54 45  found,.** SQLITE
7fb0: 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20 69 73 20  _AFF_NUMERIC is 
7fc0: 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 63 68 61  returned..*/.cha
7fd0: 72 20 73 71 6c 69 74 65 33 41 66 66 69 6e 69 74  r sqlite3Affinit
7fe0: 79 54 79 70 65 28 63 6f 6e 73 74 20 54 6f 6b 65  yType(const Toke
7ff0: 6e 20 2a 70 54 79 70 65 29 7b 0a 20 20 75 33 32  n *pType){.  u32
8000: 20 68 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 61   h = 0;.  char a
8010: 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f  ff = SQLITE_AFF_
8020: 4e 55 4d 45 52 49 43 3b 0a 20 20 63 6f 6e 73 74  NUMERIC;.  const
8030: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
8040: 7a 49 6e 20 3d 20 70 54 79 70 65 2d 3e 7a 3b 0a  zIn = pType->z;.
8050: 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64    const unsigned
8060: 20 63 68 61 72 20 2a 7a 45 6e 64 20 3d 20 26 70   char *zEnd = &p
8070: 54 79 70 65 2d 3e 7a 5b 70 54 79 70 65 2d 3e 6e  Type->z[pType->n
8080: 5d 3b 0a 0a 20 20 77 68 69 6c 65 28 20 7a 49 6e  ];..  while( zIn
8090: 21 3d 7a 45 6e 64 20 29 7b 0a 20 20 20 20 68 20  !=zEnd ){.    h 
80a0: 3d 20 28 68 3c 3c 38 29 20 2b 20 73 71 6c 69 74  = (h<<8) + sqlit
80b0: 65 33 55 70 70 65 72 54 6f 4c 6f 77 65 72 5b 2a  e3UpperToLower[*
80c0: 7a 49 6e 5d 3b 0a 20 20 20 20 7a 49 6e 2b 2b 3b  zIn];.    zIn++;
80d0: 0a 20 20 20 20 69 66 28 20 68 3d 3d 28 28 27 63  .    if( h==(('c
80e0: 27 3c 3c 32 34 29 2b 28 27 68 27 3c 3c 31 36 29  '<<24)+('h'<<16)
80f0: 2b 28 27 61 27 3c 3c 38 29 2b 27 72 27 29 20 29  +('a'<<8)+'r') )
8100: 7b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  {             /*
8110: 20 43 48 41 52 20 2a 2f 0a 20 20 20 20 20 20 61   CHAR */.      a
8120: 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f  ff = SQLITE_AFF_
8130: 54 45 58 54 3b 20 0a 20 20 20 20 7d 65 6c 73 65  TEXT; .    }else
8140: 20 69 66 28 20 68 3d 3d 28 28 27 63 27 3c 3c 32   if( h==(('c'<<2
8150: 34 29 2b 28 27 6c 27 3c 3c 31 36 29 2b 28 27 6f  4)+('l'<<16)+('o
8160: 27 3c 3c 38 29 2b 27 62 27 29 20 29 7b 20 20 20  '<<8)+'b') ){   
8170: 20 20 20 20 2f 2a 20 43 4c 4f 42 20 2a 2f 0a 20      /* CLOB */. 
8180: 20 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49 54       aff = SQLIT
8190: 45 5f 41 46 46 5f 54 45 58 54 3b 0a 20 20 20 20  E_AFF_TEXT;.    
81a0: 7d 65 6c 73 65 20 69 66 28 20 68 3d 3d 28 28 27  }else if( h==(('
81b0: 74 27 3c 3c 32 34 29 2b 28 27 65 27 3c 3c 31 36  t'<<24)+('e'<<16
81c0: 29 2b 28 27 78 27 3c 3c 38 29 2b 27 74 27 29 20  )+('x'<<8)+'t') 
81d0: 29 7b 20 20 20 20 20 20 20 2f 2a 20 54 45 58 54  ){       /* TEXT
81e0: 20 2a 2f 0a 20 20 20 20 20 20 61 66 66 20 3d 20   */.      aff = 
81f0: 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 3b  SQLITE_AFF_TEXT;
8200: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 68  .    }else if( h
8210: 3d 3d 28 28 27 62 27 3c 3c 32 34 29 2b 28 27 6c  ==(('b'<<24)+('l
8220: 27 3c 3c 31 36 29 2b 28 27 6f 27 3c 3c 38 29 2b  '<<16)+('o'<<8)+
8230: 27 62 27 29 20 20 20 20 20 20 20 20 20 20 2f 2a  'b')          /*
8240: 20 42 4c 4f 42 20 2a 2f 0a 20 20 20 20 20 20 20   BLOB */.       
8250: 20 26 26 20 28 61 66 66 3d 3d 53 51 4c 49 54 45   && (aff==SQLITE
8260: 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20 7c 7c 20  _AFF_NUMERIC || 
8270: 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f  aff==SQLITE_AFF_
8280: 52 45 41 4c 29 20 29 7b 0a 20 20 20 20 20 20 61  REAL) ){.      a
8290: 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f  ff = SQLITE_AFF_
82a0: 4e 4f 4e 45 3b 0a 23 69 66 6e 64 65 66 20 53 51  NONE;.#ifndef SQ
82b0: 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49  LITE_OMIT_FLOATI
82c0: 4e 47 5f 50 4f 49 4e 54 0a 20 20 20 20 7d 65 6c  NG_POINT.    }el
82d0: 73 65 20 69 66 28 20 68 3d 3d 28 28 27 72 27 3c  se if( h==(('r'<
82e0: 3c 32 34 29 2b 28 27 65 27 3c 3c 31 36 29 2b 28  <24)+('e'<<16)+(
82f0: 27 61 27 3c 3c 38 29 2b 27 6c 27 29 20 20 20 20  'a'<<8)+'l')    
8300: 20 20 20 20 20 20 2f 2a 20 52 45 41 4c 20 2a 2f        /* REAL */
8310: 0a 20 20 20 20 20 20 20 20 26 26 20 61 66 66 3d  .        && aff=
8320: 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45  =SQLITE_AFF_NUME
8330: 52 49 43 20 29 7b 0a 20 20 20 20 20 20 61 66 66  RIC ){.      aff
8340: 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 52 45   = SQLITE_AFF_RE
8350: 41 4c 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  AL;.    }else if
8360: 28 20 68 3d 3d 28 28 27 66 27 3c 3c 32 34 29 2b  ( h==(('f'<<24)+
8370: 28 27 6c 27 3c 3c 31 36 29 2b 28 27 6f 27 3c 3c  ('l'<<16)+('o'<<
8380: 38 29 2b 27 61 27 29 20 20 20 20 20 20 20 20 20  8)+'a')         
8390: 20 2f 2a 20 46 4c 4f 41 20 2a 2f 0a 20 20 20 20   /* FLOA */.    
83a0: 20 20 20 20 26 26 20 61 66 66 3d 3d 53 51 4c 49      && aff==SQLI
83b0: 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20 29  TE_AFF_NUMERIC )
83c0: 7b 0a 20 20 20 20 20 20 61 66 66 20 3d 20 53 51  {.      aff = SQ
83d0: 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 3b 0a 20  LITE_AFF_REAL;. 
83e0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 68 3d 3d     }else if( h==
83f0: 28 28 27 64 27 3c 3c 32 34 29 2b 28 27 6f 27 3c  (('d'<<24)+('o'<
8400: 3c 31 36 29 2b 28 27 75 27 3c 3c 38 29 2b 27 62  <16)+('u'<<8)+'b
8410: 27 29 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44  ')          /* D
8420: 4f 55 42 20 2a 2f 0a 20 20 20 20 20 20 20 20 26  OUB */.        &
8430: 26 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46  & aff==SQLITE_AF
8440: 46 5f 4e 55 4d 45 52 49 43 20 29 7b 0a 20 20 20  F_NUMERIC ){.   
8450: 20 20 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f     aff = SQLITE_
8460: 41 46 46 5f 52 45 41 4c 3b 0a 23 65 6e 64 69 66  AFF_REAL;.#endif
8470: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28  .    }else if( (
8480: 68 26 30 78 30 30 46 46 46 46 46 46 29 3d 3d 28  h&0x00FFFFFF)==(
8490: 28 27 69 27 3c 3c 31 36 29 2b 28 27 6e 27 3c 3c  ('i'<<16)+('n'<<
84a0: 38 29 2b 27 74 27 29 20 29 7b 20 20 20 20 2f 2a  8)+'t') ){    /*
84b0: 20 49 4e 54 20 2a 2f 0a 20 20 20 20 20 20 61 66   INT */.      af
84c0: 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 49  f = SQLITE_AFF_I
84d0: 4e 54 45 47 45 52 3b 0a 20 20 20 20 20 20 62 72  NTEGER;.      br
84e0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  eak;.    }.  }..
84f0: 20 20 72 65 74 75 72 6e 20 61 66 66 3b 0a 7d 0a    return aff;.}.
8500: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
8510: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 62 79  ine is called by
8520: 20 74 68 65 20 70 61 72 73 65 72 20 77 68 69 6c   the parser whil
8530: 65 20 69 6e 20 74 68 65 20 6d 69 64 64 6c 65 20  e in the middle 
8540: 6f 66 0a 2a 2a 20 70 61 72 73 69 6e 67 20 61 20  of.** parsing a 
8550: 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61  CREATE TABLE sta
8560: 74 65 6d 65 6e 74 2e 20 20 54 68 65 20 70 46 69  tement.  The pFi
8570: 72 73 74 20 74 6f 6b 65 6e 20 69 73 20 74 68 65  rst token is the
8580: 20 66 69 72 73 74 0a 2a 2a 20 74 6f 6b 65 6e 20   first.** token 
8590: 69 6e 20 74 68 65 20 73 65 71 75 65 6e 63 65 20  in the sequence 
85a0: 6f 66 20 74 6f 6b 65 6e 73 20 74 68 61 74 20 64  of tokens that d
85b0: 65 73 63 72 69 62 65 20 74 68 65 20 74 79 70 65  escribe the type
85c0: 20 6f 66 20 74 68 65 0a 2a 2a 20 63 6f 6c 75 6d   of the.** colum
85d0: 6e 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65  n currently unde
85e0: 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 20  r construction. 
85f0: 20 20 70 4c 61 73 74 20 69 73 20 74 68 65 20 6c    pLast is the l
8600: 61 73 74 20 74 6f 6b 65 6e 0a 2a 2a 20 69 6e 20  ast token.** in 
8610: 74 68 65 20 73 65 71 75 65 6e 63 65 2e 20 20 55  the sequence.  U
8620: 73 65 20 74 68 69 73 20 69 6e 66 6f 72 6d 61 74  se this informat
8630: 69 6f 6e 20 74 6f 20 63 6f 6e 73 74 72 75 63 74  ion to construct
8640: 20 61 20 73 74 72 69 6e 67 0a 2a 2a 20 74 68 61   a string.** tha
8650: 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 74  t contains the t
8660: 79 70 65 6e 61 6d 65 20 6f 66 20 74 68 65 20 63  ypename of the c
8670: 6f 6c 75 6d 6e 20 61 6e 64 20 73 74 6f 72 65 20  olumn and store 
8680: 74 68 61 74 20 73 74 72 69 6e 67 0a 2a 2a 20 69  that string.** i
8690: 6e 20 7a 54 79 70 65 2e 0a 2a 2f 20 0a 76 6f 69  n zType..*/ .voi
86a0: 64 20 73 71 6c 69 74 65 33 41 64 64 43 6f 6c 75  d sqlite3AddColu
86b0: 6d 6e 54 79 70 65 28 50 61 72 73 65 20 2a 70 50  mnType(Parse *pP
86c0: 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 54 79  arse, Token *pTy
86d0: 70 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b  pe){.  Table *p;
86e0: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 43 6f 6c 75  .  int i;.  Colu
86f0: 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 73 71 6c 69  mn *pCol;.  sqli
8700: 74 65 33 20 2a 64 62 3b 0a 0a 20 20 69 66 28 20  te3 *db;..  if( 
8710: 28 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65  (p = pParse->pNe
8720: 77 54 61 62 6c 65 29 3d 3d 30 20 29 20 72 65 74  wTable)==0 ) ret
8730: 75 72 6e 3b 0a 20 20 69 20 3d 20 70 2d 3e 6e 43  urn;.  i = p->nC
8740: 6f 6c 2d 31 3b 0a 20 20 69 66 28 20 69 3c 30 20  ol-1;.  if( i<0 
8750: 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 43 6f 6c  ) return;.  pCol
8760: 20 3d 20 26 70 2d 3e 61 43 6f 6c 5b 69 5d 3b 0a   = &p->aCol[i];.
8770: 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64    db = pParse->d
8780: 62 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  b;.  sqlite3DbFr
8790: 65 65 28 64 62 2c 20 70 43 6f 6c 2d 3e 7a 54 79  ee(db, pCol->zTy
87a0: 70 65 29 3b 0a 20 20 70 43 6f 6c 2d 3e 7a 54 79  pe);.  pCol->zTy
87b0: 70 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65  pe = sqlite3Name
87c0: 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 54  FromToken(db, pT
87d0: 79 70 65 29 3b 0a 20 20 70 43 6f 6c 2d 3e 61 66  ype);.  pCol->af
87e0: 66 69 6e 69 74 79 20 3d 20 73 71 6c 69 74 65 33  finity = sqlite3
87f0: 41 66 66 69 6e 69 74 79 54 79 70 65 28 70 54 79  AffinityType(pTy
8800: 70 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  pe);.}../*.** Th
8810: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
8820: 74 68 65 20 64 65 66 61 75 6c 74 20 76 61 6c 75  the default valu
8830: 65 20 66 6f 72 20 74 68 65 20 6d 6f 73 74 20 72  e for the most r
8840: 65 63 65 6e 74 6c 79 20 61 64 64 65 64 20 63 6f  ecently added co
8850: 6c 75 6d 6e 0a 2a 2a 20 6f 66 20 74 68 65 20 74  lumn.** of the t
8860: 61 62 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 75  able currently u
8870: 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f  nder constructio
8880: 6e 2e 0a 2a 2a 0a 2a 2a 20 44 65 66 61 75 6c 74  n..**.** Default
8890: 20 76 61 6c 75 65 20 65 78 70 72 65 73 73 69 6f   value expressio
88a0: 6e 73 20 6d 75 73 74 20 62 65 20 63 6f 6e 73 74  ns must be const
88b0: 61 6e 74 2e 20 20 52 61 69 73 65 20 61 6e 20 65  ant.  Raise an e
88c0: 78 63 65 70 74 69 6f 6e 20 69 66 20 74 68 69 73  xception if this
88d0: 0a 2a 2a 20 69 73 20 6e 6f 74 20 74 68 65 20 63  .** is not the c
88e0: 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ase..**.** This 
88f0: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
8900: 64 20 62 79 20 74 68 65 20 70 61 72 73 65 72 20  d by the parser 
8910: 77 68 69 6c 65 20 69 6e 20 74 68 65 20 6d 69 64  while in the mid
8920: 64 6c 65 20 6f 66 0a 2a 2a 20 70 61 72 73 69 6e  dle of.** parsin
8930: 67 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45  g a CREATE TABLE
8940: 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 76   statement..*/.v
8950: 6f 69 64 20 73 71 6c 69 74 65 33 41 64 64 44 65  oid sqlite3AddDe
8960: 66 61 75 6c 74 56 61 6c 75 65 28 50 61 72 73 65  faultValue(Parse
8970: 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a   *pParse, Expr *
8980: 70 45 78 70 72 29 7b 0a 20 20 54 61 62 6c 65 20  pExpr){.  Table 
8990: 2a 70 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43  *p;.  Column *pC
89a0: 6f 6c 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  ol;.  sqlite3 *d
89b0: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
89c0: 20 20 69 66 28 20 28 70 20 3d 20 70 50 61 72 73    if( (p = pPars
89d0: 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29 21 3d 30  e->pNewTable)!=0
89e0: 20 29 7b 0a 20 20 20 20 70 43 6f 6c 20 3d 20 26   ){.    pCol = &
89f0: 28 70 2d 3e 61 43 6f 6c 5b 70 2d 3e 6e 43 6f 6c  (p->aCol[p->nCol
8a00: 2d 31 5d 29 3b 0a 20 20 20 20 69 66 28 20 21 73  -1]);.    if( !s
8a10: 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73  qlite3ExprIsCons
8a20: 74 61 6e 74 4f 72 46 75 6e 63 74 69 6f 6e 28 70  tantOrFunction(p
8a30: 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20 73  Expr) ){.      s
8a40: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
8a50: 50 61 72 73 65 2c 20 22 64 65 66 61 75 6c 74 20  Parse, "default 
8a60: 76 61 6c 75 65 20 6f 66 20 63 6f 6c 75 6d 6e 20  value of column 
8a70: 5b 25 73 5d 20 69 73 20 6e 6f 74 20 63 6f 6e 73  [%s] is not cons
8a80: 74 61 6e 74 22 2c 0a 20 20 20 20 20 20 20 20 20  tant",.         
8a90: 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20   pCol->zName);. 
8aa0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
8ab0: 45 78 70 72 20 2a 70 43 6f 70 79 3b 0a 20 20 20  Expr *pCopy;.   
8ac0: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65     sqlite3ExprDe
8ad0: 6c 65 74 65 28 64 62 2c 20 70 43 6f 6c 2d 3e 70  lete(db, pCol->p
8ae0: 44 66 6c 74 29 3b 0a 20 20 20 20 20 20 70 43 6f  Dflt);.      pCo
8af0: 6c 2d 3e 70 44 66 6c 74 20 3d 20 70 43 6f 70 79  l->pDflt = pCopy
8b00: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
8b10: 70 28 64 62 2c 20 70 45 78 70 72 29 3b 0a 20 20  p(db, pExpr);.  
8b20: 20 20 20 20 69 66 28 20 70 43 6f 70 79 20 29 7b      if( pCopy ){
8b30: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
8b40: 54 6f 6b 65 6e 43 6f 70 79 28 64 62 2c 20 26 70  TokenCopy(db, &p
8b50: 43 6f 70 79 2d 3e 73 70 61 6e 2c 20 26 70 45 78  Copy->span, &pEx
8b60: 70 72 2d 3e 73 70 61 6e 29 3b 0a 20 20 20 20 20  pr->span);.     
8b70: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73   }.    }.  }.  s
8b80: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
8b90: 28 64 62 2c 20 70 45 78 70 72 29 3b 0a 7d 0a 0a  (db, pExpr);.}..
8ba0: 2f 2a 0a 2a 2a 20 44 65 73 69 67 6e 61 74 65 20  /*.** Designate 
8bb0: 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20  the PRIMARY KEY 
8bc0: 66 6f 72 20 74 68 65 20 74 61 62 6c 65 2e 20 20  for the table.  
8bd0: 70 4c 69 73 74 20 69 73 20 61 20 6c 69 73 74 20  pList is a list 
8be0: 6f 66 20 6e 61 6d 65 73 20 0a 2a 2a 20 6f 66 20  of names .** of 
8bf0: 63 6f 6c 75 6d 6e 73 20 74 68 61 74 20 66 6f 72  columns that for
8c00: 6d 20 74 68 65 20 70 72 69 6d 61 72 79 20 6b 65  m the primary ke
8c10: 79 2e 20 20 49 66 20 70 4c 69 73 74 20 69 73 20  y.  If pList is 
8c20: 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68 65 0a 2a  NULL, then the.*
8c30: 2a 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20  * most recently 
8c40: 61 64 64 65 64 20 63 6f 6c 75 6d 6e 20 6f 66 20  added column of 
8c50: 74 68 65 20 74 61 62 6c 65 20 69 73 20 74 68 65  the table is the
8c60: 20 70 72 69 6d 61 72 79 20 6b 65 79 2e 0a 2a 2a   primary key..**
8c70: 0a 2a 2a 20 41 20 74 61 62 6c 65 20 63 61 6e 20  .** A table can 
8c80: 68 61 76 65 20 61 74 20 6d 6f 73 74 20 6f 6e 65  have at most one
8c90: 20 70 72 69 6d 61 72 79 20 6b 65 79 2e 20 20 49   primary key.  I
8ca0: 66 20 74 68 65 20 74 61 62 6c 65 20 61 6c 72 65  f the table alre
8cb0: 61 64 79 20 68 61 73 0a 2a 2a 20 61 20 70 72 69  ady has.** a pri
8cc0: 6d 61 72 79 20 6b 65 79 20 28 61 6e 64 20 74 68  mary key (and th
8cd0: 69 73 20 69 73 20 74 68 65 20 73 65 63 6f 6e 64  is is the second
8ce0: 20 70 72 69 6d 61 72 79 20 6b 65 79 29 20 74 68   primary key) th
8cf0: 65 6e 20 63 72 65 61 74 65 20 61 6e 0a 2a 2a 20  en create an.** 
8d00: 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  error..**.** If 
8d10: 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20  the PRIMARY KEY 
8d20: 69 73 20 6f 6e 20 61 20 73 69 6e 67 6c 65 20 63  is on a single c
8d30: 6f 6c 75 6d 6e 20 77 68 6f 73 65 20 64 61 74 61  olumn whose data
8d40: 74 79 70 65 20 69 73 20 49 4e 54 45 47 45 52 2c  type is INTEGER,
8d50: 0a 2a 2a 20 74 68 65 6e 20 77 65 20 77 69 6c 6c  .** then we will
8d60: 20 74 72 79 20 74 6f 20 75 73 65 20 74 68 61 74   try to use that
8d70: 20 63 6f 6c 75 6d 6e 20 61 73 20 74 68 65 20 72   column as the r
8d80: 6f 77 69 64 2e 20 20 53 65 74 20 74 68 65 20 54  owid.  Set the T
8d90: 61 62 6c 65 2e 69 50 4b 65 79 0a 2a 2a 20 66 69  able.iPKey.** fi
8da0: 65 6c 64 20 6f 66 20 74 68 65 20 74 61 62 6c 65  eld of the table
8db0: 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74   under construct
8dc0: 69 6f 6e 20 74 6f 20 62 65 20 74 68 65 20 69 6e  ion to be the in
8dd0: 64 65 78 20 6f 66 20 74 68 65 0a 2a 2a 20 49 4e  dex of the.** IN
8de0: 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45  TEGER PRIMARY KE
8df0: 59 20 63 6f 6c 75 6d 6e 2e 20 20 54 61 62 6c 65  Y column.  Table
8e00: 2e 69 50 4b 65 79 20 69 73 20 73 65 74 20 74 6f  .iPKey is set to
8e10: 20 2d 31 20 69 66 20 74 68 65 72 65 20 69 73 0a   -1 if there is.
8e20: 2a 2a 20 6e 6f 20 49 4e 54 45 47 45 52 20 50 52  ** no INTEGER PR
8e30: 49 4d 41 52 59 20 4b 45 59 2e 0a 2a 2a 0a 2a 2a  IMARY KEY..**.**
8e40: 20 49 66 20 74 68 65 20 6b 65 79 20 69 73 20 6e   If the key is n
8e50: 6f 74 20 61 6e 20 49 4e 54 45 47 45 52 20 50 52  ot an INTEGER PR
8e60: 49 4d 41 52 59 20 4b 45 59 2c 20 74 68 65 6e 20  IMARY KEY, then 
8e70: 63 72 65 61 74 65 20 61 20 75 6e 69 71 75 65 0a  create a unique.
8e80: 2a 2a 20 69 6e 64 65 78 20 66 6f 72 20 74 68 65  ** index for the
8e90: 20 6b 65 79 2e 20 20 4e 6f 20 69 6e 64 65 78 20   key.  No index 
8ea0: 69 73 20 63 72 65 61 74 65 64 20 66 6f 72 20 49  is created for I
8eb0: 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b  NTEGER PRIMARY K
8ec0: 45 59 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  EYs..*/.void sql
8ed0: 69 74 65 33 41 64 64 50 72 69 6d 61 72 79 4b 65  ite3AddPrimaryKe
8ee0: 79 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  y(.  Parse *pPar
8ef0: 73 65 2c 20 20 20 20 2f 2a 20 50 61 72 73 69 6e  se,    /* Parsin
8f00: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45  g context */.  E
8f10: 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20  xprList *pList, 
8f20: 20 2f 2a 20 4c 69 73 74 20 6f 66 20 66 69 65 6c   /* List of fiel
8f30: 64 20 6e 61 6d 65 73 20 74 6f 20 62 65 20 69 6e  d names to be in
8f40: 64 65 78 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6f  dexed */.  int o
8f50: 6e 45 72 72 6f 72 2c 20 20 20 20 20 20 2f 2a 20  nError,      /* 
8f60: 57 68 61 74 20 74 6f 20 64 6f 20 77 69 74 68 20  What to do with 
8f70: 61 20 75 6e 69 71 75 65 6e 65 73 73 20 63 6f 6e  a uniqueness con
8f80: 66 6c 69 63 74 20 2a 2f 0a 20 20 69 6e 74 20 61  flict */.  int a
8f90: 75 74 6f 49 6e 63 2c 20 20 20 20 20 20 2f 2a 20  utoInc,      /* 
8fa0: 54 72 75 65 20 69 66 20 74 68 65 20 41 55 54 4f  True if the AUTO
8fb0: 49 4e 43 52 45 4d 45 4e 54 20 6b 65 79 77 6f 72  INCREMENT keywor
8fc0: 64 20 69 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a  d is present */.
8fd0: 20 20 69 6e 74 20 73 6f 72 74 4f 72 64 65 72 20    int sortOrder 
8fe0: 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 53 4f      /* SQLITE_SO
8ff0: 5f 41 53 43 20 6f 72 20 53 51 4c 49 54 45 5f 53  _ASC or SQLITE_S
9000: 4f 5f 44 45 53 43 20 2a 2f 0a 29 7b 0a 20 20 54  O_DESC */.){.  T
9010: 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 50 61  able *pTab = pPa
9020: 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a  rse->pNewTable;.
9030: 20 20 63 68 61 72 20 2a 7a 54 79 70 65 20 3d 20    char *zType = 
9040: 30 3b 0a 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20  0;.  int iCol = 
9050: 2d 31 2c 20 69 3b 0a 20 20 69 66 28 20 70 54 61  -1, i;.  if( pTa
9060: 62 3d 3d 30 20 7c 7c 20 49 4e 5f 44 45 43 4c 41  b==0 || IN_DECLA
9070: 52 45 5f 56 54 41 42 20 29 20 67 6f 74 6f 20 70  RE_VTAB ) goto p
9080: 72 69 6d 61 72 79 5f 6b 65 79 5f 65 78 69 74 3b  rimary_key_exit;
9090: 0a 20 20 69 66 28 20 70 54 61 62 2d 3e 74 61 62  .  if( pTab->tab
90a0: 46 6c 61 67 73 20 26 20 54 46 5f 48 61 73 50 72  Flags & TF_HasPr
90b0: 69 6d 61 72 79 4b 65 79 20 29 7b 0a 20 20 20 20  imaryKey ){.    
90c0: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
90d0: 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20 22  pParse, .      "
90e0: 74 61 62 6c 65 20 5c 22 25 73 5c 22 20 68 61 73  table \"%s\" has
90f0: 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 70   more than one p
9100: 72 69 6d 61 72 79 20 6b 65 79 22 2c 20 70 54 61  rimary key", pTa
9110: 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 67  b->zName);.    g
9120: 6f 74 6f 20 70 72 69 6d 61 72 79 5f 6b 65 79 5f  oto primary_key_
9130: 65 78 69 74 3b 0a 20 20 7d 0a 20 20 70 54 61 62  exit;.  }.  pTab
9140: 2d 3e 74 61 62 46 6c 61 67 73 20 7c 3d 20 54 46  ->tabFlags |= TF
9150: 5f 48 61 73 50 72 69 6d 61 72 79 4b 65 79 3b 0a  _HasPrimaryKey;.
9160: 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29    if( pList==0 )
9170: 7b 0a 20 20 20 20 69 43 6f 6c 20 3d 20 70 54 61  {.    iCol = pTa
9180: 62 2d 3e 6e 43 6f 6c 20 2d 20 31 3b 0a 20 20 20  b->nCol - 1;.   
9190: 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c   pTab->aCol[iCol
91a0: 5d 2e 69 73 50 72 69 6d 4b 65 79 20 3d 20 31 3b  ].isPrimKey = 1;
91b0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 6f  .  }else{.    fo
91c0: 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e  r(i=0; i<pList->
91d0: 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
91e0: 20 20 20 66 6f 72 28 69 43 6f 6c 3d 30 3b 20 69     for(iCol=0; i
91f0: 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20  Col<pTab->nCol; 
9200: 69 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 20  iCol++){.       
9210: 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49   if( sqlite3StrI
9220: 43 6d 70 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  Cmp(pList->a[i].
9230: 7a 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 61 43 6f  zName, pTab->aCo
9240: 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 29 3d 3d  l[iCol].zName)==
9250: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 62  0 ){.          b
9260: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  reak;.        }.
9270: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
9280: 28 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f  ( iCol<pTab->nCo
9290: 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 70 54 61  l ){.        pTa
92a0: 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 69 73  b->aCol[iCol].is
92b0: 50 72 69 6d 4b 65 79 20 3d 20 31 3b 0a 20 20 20  PrimKey = 1;.   
92c0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
92d0: 66 28 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3e  f( pList->nExpr>
92e0: 31 20 29 20 69 43 6f 6c 20 3d 20 2d 31 3b 0a 20  1 ) iCol = -1;. 
92f0: 20 7d 0a 20 20 69 66 28 20 69 43 6f 6c 3e 3d 30   }.  if( iCol>=0
9300: 20 26 26 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e   && iCol<pTab->n
9310: 43 6f 6c 20 29 7b 0a 20 20 20 20 7a 54 79 70 65  Col ){.    zType
9320: 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43   = pTab->aCol[iC
9330: 6f 6c 5d 2e 7a 54 79 70 65 3b 0a 20 20 7d 0a 20  ol].zType;.  }. 
9340: 20 69 66 28 20 7a 54 79 70 65 20 26 26 20 73 71   if( zType && sq
9350: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 54 79  lite3StrICmp(zTy
9360: 70 65 2c 20 22 49 4e 54 45 47 45 52 22 29 3d 3d  pe, "INTEGER")==
9370: 30 0a 20 20 20 20 20 20 20 20 26 26 20 73 6f 72  0.        && sor
9380: 74 4f 72 64 65 72 3d 3d 53 51 4c 49 54 45 5f 53  tOrder==SQLITE_S
9390: 4f 5f 41 53 43 20 29 7b 0a 20 20 20 20 70 54 61  O_ASC ){.    pTa
93a0: 62 2d 3e 69 50 4b 65 79 20 3d 20 69 43 6f 6c 3b  b->iPKey = iCol;
93b0: 0a 20 20 20 20 70 54 61 62 2d 3e 6b 65 79 43 6f  .    pTab->keyCo
93c0: 6e 66 20 3d 20 28 75 38 29 6f 6e 45 72 72 6f 72  nf = (u8)onError
93d0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 61 75  ;.    assert( au
93e0: 74 6f 49 6e 63 3d 3d 30 20 7c 7c 20 61 75 74 6f  toInc==0 || auto
93f0: 49 6e 63 3d 3d 31 20 29 3b 0a 20 20 20 20 70 54  Inc==1 );.    pT
9400: 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 7c 3d 20  ab->tabFlags |= 
9410: 61 75 74 6f 49 6e 63 2a 54 46 5f 41 75 74 6f 69  autoInc*TF_Autoi
9420: 6e 63 72 65 6d 65 6e 74 3b 0a 20 20 7d 65 6c 73  ncrement;.  }els
9430: 65 20 69 66 28 20 61 75 74 6f 49 6e 63 20 29 7b  e if( autoInc ){
9440: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
9450: 4f 4d 49 54 5f 41 55 54 4f 49 4e 43 52 45 4d 45  OMIT_AUTOINCREME
9460: 4e 54 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  NT.    sqlite3Er
9470: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
9480: 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 20 69 73  AUTOINCREMENT is
9490: 20 6f 6e 6c 79 20 61 6c 6c 6f 77 65 64 20 6f 6e   only allowed on
94a0: 20 61 6e 20 22 0a 20 20 20 20 20 20 20 22 49 4e   an ".       "IN
94b0: 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45  TEGER PRIMARY KE
94c0: 59 22 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 65  Y");.#endif.  }e
94d0: 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  lse{.    sqlite3
94e0: 43 72 65 61 74 65 49 6e 64 65 78 28 70 50 61 72  CreateIndex(pPar
94f0: 73 65 2c 20 30 2c 20 30 2c 20 30 2c 20 70 4c 69  se, 0, 0, 0, pLi
9500: 73 74 2c 20 6f 6e 45 72 72 6f 72 2c 20 30 2c 20  st, onError, 0, 
9510: 30 2c 20 73 6f 72 74 4f 72 64 65 72 2c 20 30 29  0, sortOrder, 0)
9520: 3b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 30 3b  ;.    pList = 0;
9530: 0a 20 20 7d 0a 0a 70 72 69 6d 61 72 79 5f 6b 65  .  }..primary_ke
9540: 79 5f 65 78 69 74 3a 0a 20 20 73 71 6c 69 74 65  y_exit:.  sqlite
9550: 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
9560: 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 4c 69 73  pParse->db, pLis
9570: 74 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a  t);.  return;.}.
9580: 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77  ./*.** Add a new
9590: 20 43 48 45 43 4b 20 63 6f 6e 73 74 72 61 69 6e   CHECK constrain
95a0: 74 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 63  t to the table c
95b0: 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63  urrently under c
95c0: 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a  onstruction..*/.
95d0: 76 6f 69 64 20 73 71 6c 69 74 65 33 41 64 64 43  void sqlite3AddC
95e0: 68 65 63 6b 43 6f 6e 73 74 72 61 69 6e 74 28 0a  heckConstraint(.
95f0: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
9600: 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
9610: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72  ontext */.  Expr
9620: 20 2a 70 43 68 65 63 6b 45 78 70 72 20 20 2f 2a   *pCheckExpr  /*
9630: 20 54 68 65 20 63 68 65 63 6b 20 65 78 70 72 65   The check expre
9640: 73 73 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 73 71  ssion */.){.  sq
9650: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
9660: 73 65 2d 3e 64 62 3b 0a 23 69 66 6e 64 65 66 20  se->db;.#ifndef 
9670: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 48 45 43  SQLITE_OMIT_CHEC
9680: 4b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20  K.  Table *pTab 
9690: 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  = pParse->pNewTa
96a0: 62 6c 65 3b 0a 20 20 69 66 28 20 70 54 61 62 20  ble;.  if( pTab 
96b0: 26 26 20 21 49 4e 5f 44 45 43 4c 41 52 45 5f 56  && !IN_DECLARE_V
96c0: 54 41 42 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  TAB ){.    /* Th
96d0: 65 20 43 48 45 43 4b 20 65 78 70 72 65 73 73 69  e CHECK expressi
96e0: 6f 6e 20 6d 75 73 74 20 62 65 20 64 75 70 6c 69  on must be dupli
96f0: 63 61 74 65 64 20 73 6f 20 74 68 61 74 20 74 6f  cated so that to
9700: 6b 65 6e 73 20 72 65 66 65 72 0a 20 20 20 20 2a  kens refer.    *
9710: 2a 20 74 6f 20 6d 61 6c 6c 6f 63 65 64 20 73 70  * to malloced sp
9720: 61 63 65 20 61 6e 64 20 6e 6f 74 20 74 68 65 20  ace and not the 
9730: 28 65 70 68 65 6d 65 72 61 6c 29 20 74 65 78 74  (ephemeral) text
9740: 20 6f 66 20 74 68 65 20 43 52 45 41 54 45 20 54   of the CREATE T
9750: 41 42 4c 45 0a 20 20 20 20 2a 2a 20 73 74 61 74  ABLE.    ** stat
9760: 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 70 54 61  ement */.    pTa
9770: 62 2d 3e 70 43 68 65 63 6b 20 3d 20 73 71 6c 69  b->pCheck = sqli
9780: 74 65 33 45 78 70 72 41 6e 64 28 64 62 2c 20 70  te3ExprAnd(db, p
9790: 54 61 62 2d 3e 70 43 68 65 63 6b 2c 20 0a 20 20  Tab->pCheck, .  
97a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
97b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
97c0: 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64  sqlite3ExprDup(d
97d0: 62 2c 20 70 43 68 65 63 6b 45 78 70 72 29 29 3b  b, pCheckExpr));
97e0: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73 71  .  }.#endif.  sq
97f0: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
9800: 64 62 2c 20 70 43 68 65 63 6b 45 78 70 72 29 3b  db, pCheckExpr);
9810: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  .}../*.** Set th
9820: 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 75 6e 63  e collation func
9830: 74 69 6f 6e 20 6f 66 20 74 68 65 20 6d 6f 73 74  tion of the most
9840: 20 72 65 63 65 6e 74 6c 79 20 70 61 72 73 65 64   recently parsed
9850: 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 0a 2a 2a   table column.**
9860: 20 74 6f 20 74 68 65 20 43 6f 6c 6c 53 65 71 20   to the CollSeq 
9870: 67 69 76 65 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73  given..*/.void s
9880: 71 6c 69 74 65 33 41 64 64 43 6f 6c 6c 61 74 65  qlite3AddCollate
9890: 54 79 70 65 28 50 61 72 73 65 20 2a 70 50 61 72  Type(Parse *pPar
98a0: 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65  se, Token *pToke
98b0: 6e 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a  n){.  Table *p;.
98c0: 20 20 69 6e 74 20 69 3b 0a 20 20 63 68 61 72 20    int i;.  char 
98d0: 2a 7a 43 6f 6c 6c 3b 20 20 20 20 20 20 20 20 20  *zColl;         
98e0: 20 20 20 20 20 2f 2a 20 44 65 71 75 6f 74 65 64       /* Dequoted
98f0: 20 6e 61 6d 65 20 6f 66 20 63 6f 6c 6c 61 74 69   name of collati
9900: 6f 6e 20 73 65 71 75 65 6e 63 65 20 2a 2f 0a 20  on sequence */. 
9910: 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 0a 20   sqlite3 *db;.. 
9920: 20 69 66 28 20 28 70 20 3d 20 70 50 61 72 73 65   if( (p = pParse
9930: 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3d 3d 30 20  ->pNewTable)==0 
9940: 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 20 3d 20  ) return;.  i = 
9950: 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 64 62 20  p->nCol-1;.  db 
9960: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
9970: 7a 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 4e  zColl = sqlite3N
9980: 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c  ameFromToken(db,
9990: 20 70 54 6f 6b 65 6e 29 3b 0a 20 20 69 66 28 20   pToken);.  if( 
99a0: 21 7a 43 6f 6c 6c 20 29 20 72 65 74 75 72 6e 3b  !zColl ) return;
99b0: 0a 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 4c  ..  if( sqlite3L
99c0: 6f 63 61 74 65 43 6f 6c 6c 53 65 71 28 70 50 61  ocateCollSeq(pPa
99d0: 72 73 65 2c 20 7a 43 6f 6c 6c 2c 20 2d 31 29 20  rse, zColl, -1) 
99e0: 29 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49  ){.    Index *pI
99f0: 64 78 3b 0a 20 20 20 20 70 2d 3e 61 43 6f 6c 5b  dx;.    p->aCol[
9a00: 69 5d 2e 7a 43 6f 6c 6c 20 3d 20 7a 43 6f 6c 6c  i].zColl = zColl
9a10: 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74  ;.  .    /* If t
9a20: 68 65 20 63 6f 6c 75 6d 6e 20 69 73 20 64 65 63  he column is dec
9a30: 6c 61 72 65 64 20 61 73 20 22 3c 6e 61 6d 65 3e  lared as "<name>
9a40: 20 50 52 49 4d 41 52 59 20 4b 45 59 20 43 4f 4c   PRIMARY KEY COL
9a50: 4c 41 54 45 20 3c 74 79 70 65 3e 22 2c 0a 20 20  LATE <type>",.  
9a60: 20 20 2a 2a 20 74 68 65 6e 20 61 6e 20 69 6e 64    ** then an ind
9a70: 65 78 20 6d 61 79 20 68 61 76 65 20 62 65 65 6e  ex may have been
9a80: 20 63 72 65 61 74 65 64 20 6f 6e 20 74 68 69 73   created on this
9a90: 20 63 6f 6c 75 6d 6e 20 62 65 66 6f 72 65 20 74   column before t
9aa0: 68 65 0a 20 20 20 20 2a 2a 20 63 6f 6c 6c 61 74  he.    ** collat
9ab0: 69 6f 6e 20 74 79 70 65 20 77 61 73 20 61 64 64  ion type was add
9ac0: 65 64 2e 20 43 6f 72 72 65 63 74 20 74 68 69 73  ed. Correct this
9ad0: 20 69 66 20 69 74 20 69 73 20 74 68 65 20 63 61   if it is the ca
9ae0: 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66  se..    */.    f
9af0: 6f 72 28 70 49 64 78 3d 70 2d 3e 70 49 6e 64 65  or(pIdx=p->pInde
9b00: 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49  x; pIdx; pIdx=pI
9b10: 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  dx->pNext){.    
9b20: 20 20 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e    assert( pIdx->
9b30: 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 29 3b 0a 20 20  nColumn==1 );.  
9b40: 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 61 69      if( pIdx->ai
9b50: 43 6f 6c 75 6d 6e 5b 30 5d 3d 3d 69 20 29 7b 0a  Column[0]==i ){.
9b60: 20 20 20 20 20 20 20 20 70 49 64 78 2d 3e 61 7a          pIdx->az
9b70: 43 6f 6c 6c 5b 30 5d 20 3d 20 70 2d 3e 61 43 6f  Coll[0] = p->aCo
9b80: 6c 5b 69 5d 2e 7a 43 6f 6c 6c 3b 0a 20 20 20 20  l[i].zColl;.    
9b90: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73    }.    }.  }els
9ba0: 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  e{.    sqlite3Db
9bb0: 46 72 65 65 28 64 62 2c 20 7a 43 6f 6c 6c 29 3b  Free(db, zColl);
9bc0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  .  }.}../*.** Th
9bd0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  is function retu
9be0: 72 6e 73 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f  rns the collatio
9bf0: 6e 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20 64  n sequence for d
9c00: 61 74 61 62 61 73 65 20 6e 61 74 69 76 65 20 74  atabase native t
9c10: 65 78 74 0a 2a 2a 20 65 6e 63 6f 64 69 6e 67 20  ext.** encoding 
9c20: 69 64 65 6e 74 69 66 69 65 64 20 62 79 20 74 68  identified by th
9c30: 65 20 73 74 72 69 6e 67 20 7a 4e 61 6d 65 2c 20  e string zName, 
9c40: 6c 65 6e 67 74 68 20 6e 4e 61 6d 65 2e 0a 2a 2a  length nName..**
9c50: 0a 2a 2a 20 49 66 20 74 68 65 20 72 65 71 75 65  .** If the reque
9c60: 73 74 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 73  sted collation s
9c70: 65 71 75 65 6e 63 65 20 69 73 20 6e 6f 74 20 61  equence is not a
9c80: 76 61 69 6c 61 62 6c 65 2c 20 6f 72 20 6e 6f 74  vailable, or not
9c90: 20 61 76 61 69 6c 61 62 6c 65 0a 2a 2a 20 69 6e   available.** in
9ca0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6e 61   the database na
9cb0: 74 69 76 65 20 65 6e 63 6f 64 69 6e 67 2c 20 74  tive encoding, t
9cc0: 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 61 63  he collation fac
9cd0: 74 6f 72 79 20 69 73 20 69 6e 76 6f 6b 65 64 20  tory is invoked 
9ce0: 74 6f 0a 2a 2a 20 72 65 71 75 65 73 74 20 69 74  to.** request it
9cf0: 2e 20 49 66 20 74 68 65 20 63 6f 6c 6c 61 74 69  . If the collati
9d00: 6f 6e 20 66 61 63 74 6f 72 79 20 64 6f 65 73 20  on factory does 
9d10: 6e 6f 74 20 73 75 70 70 6c 79 20 73 75 63 68 20  not supply such 
9d20: 61 20 73 65 71 75 65 6e 63 65 2c 0a 2a 2a 20 61  a sequence,.** a
9d30: 6e 64 20 74 68 65 20 73 65 71 75 65 6e 63 65 20  nd the sequence 
9d40: 69 73 20 61 76 61 69 6c 61 62 6c 65 20 69 6e 20  is available in 
9d50: 61 6e 6f 74 68 65 72 20 74 65 78 74 20 65 6e 63  another text enc
9d60: 6f 64 69 6e 67 2c 20 74 68 65 6e 20 74 68 61 74  oding, then that
9d70: 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20   is.** returned 
9d80: 69 6e 73 74 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 49  instead..**.** I
9d90: 66 20 6e 6f 20 76 65 72 73 69 6f 6e 73 20 6f 66  f no versions of
9da0: 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 63   the requested c
9db0: 6f 6c 6c 61 74 69 6f 6e 73 20 73 65 71 75 65 6e  ollations sequen
9dc0: 63 65 20 61 72 65 20 61 76 61 69 6c 61 62 6c 65  ce are available
9dd0: 2c 20 6f 72 0a 2a 2a 20 61 6e 6f 74 68 65 72 20  , or.** another 
9de0: 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 4e 55  error occurs, NU
9df0: 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64 20 61  LL is returned a
9e00: 6e 64 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73  nd an error mess
9e10: 61 67 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f  age written into
9e20: 0a 2a 2a 20 70 50 61 72 73 65 2e 0a 2a 2a 0a 2a  .** pParse..**.*
9e30: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
9e40: 73 20 61 20 77 72 61 70 70 65 72 20 61 72 6f 75  s a wrapper arou
9e50: 6e 64 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f  nd sqlite3FindCo
9e60: 6c 6c 53 65 71 28 29 2e 20 20 54 68 69 73 20 72  llSeq().  This r
9e70: 6f 75 74 69 6e 65 0a 2a 2a 20 69 6e 76 6f 6b 65  outine.** invoke
9e80: 73 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20  s the collation 
9e90: 66 61 63 74 6f 72 79 20 69 66 20 74 68 65 20 6e  factory if the n
9ea0: 61 6d 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 63  amed collation c
9eb0: 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64 0a 2a  annot be found.*
9ec0: 2a 20 61 6e 64 20 67 65 6e 65 72 61 74 65 73 20  * and generates 
9ed0: 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  an error message
9ee0: 2e 0a 2a 2f 0a 43 6f 6c 6c 53 65 71 20 2a 73 71  ..*/.CollSeq *sq
9ef0: 6c 69 74 65 33 4c 6f 63 61 74 65 43 6f 6c 6c 53  lite3LocateCollS
9f00: 65 71 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  eq(Parse *pParse
9f10: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e  , const char *zN
9f20: 61 6d 65 2c 20 69 6e 74 20 6e 4e 61 6d 65 29 7b  ame, int nName){
9f30: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
9f40: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 75   pParse->db;.  u
9f50: 38 20 65 6e 63 20 3d 20 45 4e 43 28 64 62 29 3b  8 enc = ENC(db);
9f60: 0a 20 20 75 38 20 69 6e 69 74 62 75 73 79 20 3d  .  u8 initbusy =
9f70: 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3b 0a   db->init.busy;.
9f80: 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c    CollSeq *pColl
9f90: 3b 0a 0a 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c  ;..  pColl = sql
9fa0: 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28  ite3FindCollSeq(
9fb0: 64 62 2c 20 65 6e 63 2c 20 7a 4e 61 6d 65 2c 20  db, enc, zName, 
9fc0: 6e 4e 61 6d 65 2c 20 69 6e 69 74 62 75 73 79 29  nName, initbusy)
9fd0: 3b 0a 20 20 69 66 28 20 21 69 6e 69 74 62 75 73  ;.  if( !initbus
9fe0: 79 20 26 26 20 28 21 70 43 6f 6c 6c 20 7c 7c 20  y && (!pColl || 
9ff0: 21 70 43 6f 6c 6c 2d 3e 78 43 6d 70 29 20 29 7b  !pColl->xCmp) ){
a000: 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c  .    pColl = sql
a010: 69 74 65 33 47 65 74 43 6f 6c 6c 53 65 71 28 64  ite3GetCollSeq(d
a020: 62 2c 20 70 43 6f 6c 6c 2c 20 7a 4e 61 6d 65 2c  b, pColl, zName,
a030: 20 6e 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28   nName);.    if(
a040: 20 21 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20   !pColl ){.     
a050: 20 69 66 28 20 6e 4e 61 6d 65 3c 30 20 29 7b 0a   if( nName<0 ){.
a060: 20 20 20 20 20 20 20 20 6e 4e 61 6d 65 20 3d 20          nName = 
a070: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 28 64 62  sqlite3Strlen(db
a080: 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  , zName);.      
a090: 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  }.      sqlite3E
a0a0: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
a0b0: 22 6e 6f 20 73 75 63 68 20 63 6f 6c 6c 61 74 69  "no such collati
a0c0: 6f 6e 20 73 65 71 75 65 6e 63 65 3a 20 25 2e 2a  on sequence: %.*
a0d0: 73 22 2c 20 6e 4e 61 6d 65 2c 20 7a 4e 61 6d 65  s", nName, zName
a0e0: 29 3b 0a 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d  );.      pColl =
a0f0: 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20   0;.    }.  }.. 
a100: 20 72 65 74 75 72 6e 20 70 43 6f 6c 6c 3b 0a 7d   return pColl;.}
a110: 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  .../*.** Generat
a120: 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c  e code that will
a130: 20 69 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 73   increment the s
a140: 63 68 65 6d 61 20 63 6f 6f 6b 69 65 2e 0a 2a 2a  chema cookie..**
a150: 0a 2a 2a 20 54 68 65 20 73 63 68 65 6d 61 20 63  .** The schema c
a160: 6f 6f 6b 69 65 20 69 73 20 75 73 65 64 20 74 6f  ookie is used to
a170: 20 64 65 74 65 72 6d 69 6e 65 20 77 68 65 6e 20   determine when 
a180: 74 68 65 20 73 63 68 65 6d 61 20 66 6f 72 20 74  the schema for t
a190: 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 63  he.** database c
a1a0: 68 61 6e 67 65 73 2e 20 20 41 66 74 65 72 20 65  hanges.  After e
a1b0: 61 63 68 20 73 63 68 65 6d 61 20 63 68 61 6e 67  ach schema chang
a1c0: 65 2c 20 74 68 65 20 63 6f 6f 6b 69 65 20 76 61  e, the cookie va
a1d0: 6c 75 65 0a 2a 2a 20 63 68 61 6e 67 65 73 2e 20  lue.** changes. 
a1e0: 20 57 68 65 6e 20 61 20 70 72 6f 63 65 73 73 20   When a process 
a1f0: 66 69 72 73 74 20 72 65 61 64 73 20 74 68 65 20  first reads the 
a200: 73 63 68 65 6d 61 20 69 74 20 72 65 63 6f 72 64  schema it record
a210: 73 20 74 68 65 0a 2a 2a 20 63 6f 6f 6b 69 65 2e  s the.** cookie.
a220: 20 20 54 68 65 72 65 61 66 74 65 72 2c 20 77 68    Thereafter, wh
a230: 65 6e 65 76 65 72 20 69 74 20 67 6f 65 73 20 74  enever it goes t
a240: 6f 20 61 63 63 65 73 73 20 74 68 65 20 64 61 74  o access the dat
a250: 61 62 61 73 65 2c 0a 2a 2a 20 69 74 20 63 68 65  abase,.** it che
a260: 63 6b 73 20 74 68 65 20 63 6f 6f 6b 69 65 20 74  cks the cookie t
a270: 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20  o make sure the 
a280: 73 63 68 65 6d 61 20 68 61 73 20 6e 6f 74 20 63  schema has not c
a290: 68 61 6e 67 65 64 0a 2a 2a 20 73 69 6e 63 65 20  hanged.** since 
a2a0: 69 74 20 77 61 73 20 6c 61 73 74 20 72 65 61 64  it was last read
a2b0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 70 6c 61  ..**.** This pla
a2c0: 6e 20 69 73 20 6e 6f 74 20 63 6f 6d 70 6c 65 74  n is not complet
a2d0: 65 6c 79 20 62 75 6c 6c 65 74 2d 70 72 6f 6f 66  ely bullet-proof
a2e0: 2e 20 20 49 74 20 69 73 20 70 6f 73 73 69 62 6c  .  It is possibl
a2f0: 65 20 66 6f 72 0a 2a 2a 20 74 68 65 20 73 63 68  e for.** the sch
a300: 65 6d 61 20 74 6f 20 63 68 61 6e 67 65 20 6d 75  ema to change mu
a310: 6c 74 69 70 6c 65 20 74 69 6d 65 73 20 61 6e 64  ltiple times and
a320: 20 66 6f 72 20 74 68 65 20 63 6f 6f 6b 69 65 20   for the cookie 
a330: 74 6f 20 62 65 0a 2a 2a 20 73 65 74 20 62 61 63  to be.** set bac
a340: 6b 20 74 6f 20 70 72 69 6f 72 20 76 61 6c 75 65  k to prior value
a350: 2e 20 20 42 75 74 20 73 63 68 65 6d 61 20 63 68  .  But schema ch
a360: 61 6e 67 65 73 20 61 72 65 20 69 6e 66 72 65 71  anges are infreq
a370: 75 65 6e 74 0a 2a 2a 20 61 6e 64 20 74 68 65 20  uent.** and the 
a380: 70 72 6f 62 61 62 69 6c 69 74 79 20 6f 66 20 68  probability of h
a390: 69 74 74 69 6e 67 20 74 68 65 20 73 61 6d 65 20  itting the same 
a3a0: 63 6f 6f 6b 69 65 20 76 61 6c 75 65 20 69 73 20  cookie value is 
a3b0: 6f 6e 6c 79 0a 2a 2a 20 31 20 63 68 61 6e 63 65  only.** 1 chance
a3c0: 20 69 6e 20 32 5e 33 32 2e 20 20 53 6f 20 77 65   in 2^32.  So we
a3d0: 27 72 65 20 73 61 66 65 20 65 6e 6f 75 67 68 2e  're safe enough.
a3e0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
a3f0: 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28 50 61 72  ChangeCookie(Par
a400: 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20  se *pParse, int 
a410: 69 44 62 29 7b 0a 20 20 69 6e 74 20 72 31 20 3d  iDb){.  int r1 =
a420: 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
a430: 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 73 71  eg(pParse);.  sq
a440: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
a450: 73 65 2d 3e 64 62 3b 0a 20 20 56 64 62 65 20 2a  se->db;.  Vdbe *
a460: 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
a470: 65 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  e;.  sqlite3Vdbe
a480: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
a490: 65 67 65 72 2c 20 64 62 2d 3e 61 44 62 5b 69 44  eger, db->aDb[iD
a4a0: 62 5d 2e 70 53 63 68 65 6d 61 2d 3e 73 63 68 65  b].pSchema->sche
a4b0: 6d 61 5f 63 6f 6f 6b 69 65 2b 31 2c 20 72 31 29  ma_cookie+1, r1)
a4c0: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
a4d0: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53 65 74 43  ddOp3(v, OP_SetC
a4e0: 6f 6f 6b 69 65 2c 20 69 44 62 2c 20 30 2c 20 72  ookie, iDb, 0, r
a4f0: 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 6c  1);.  sqlite3Rel
a500: 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
a510: 73 65 2c 20 72 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  se, r1);.}../*.*
a520: 2a 20 4d 65 61 73 75 72 65 20 74 68 65 20 6e 75  * Measure the nu
a530: 6d 62 65 72 20 6f 66 20 63 68 61 72 61 63 74 65  mber of characte
a540: 72 73 20 6e 65 65 64 65 64 20 74 6f 20 6f 75 74  rs needed to out
a550: 70 75 74 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a  put the given.**
a560: 20 69 64 65 6e 74 69 66 69 65 72 2e 20 20 54 68   identifier.  Th
a570: 65 20 6e 75 6d 62 65 72 20 72 65 74 75 72 6e 65  e number returne
a580: 64 20 69 6e 63 6c 75 64 65 73 20 61 6e 79 20 71  d includes any q
a590: 75 6f 74 65 73 20 75 73 65 64 0a 2a 2a 20 62 75  uotes used.** bu
a5a0: 74 20 64 6f 65 73 20 6e 6f 74 20 69 6e 63 6c 75  t does not inclu
a5b0: 64 65 20 74 68 65 20 6e 75 6c 6c 20 74 65 72 6d  de the null term
a5c0: 69 6e 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68  inator..**.** Th
a5d0: 65 20 65 73 74 69 6d 61 74 65 20 69 73 20 63 6f  e estimate is co
a5e0: 6e 73 65 72 76 61 74 69 76 65 2e 20 20 49 74 20  nservative.  It 
a5f0: 6d 69 67 68 74 20 62 65 20 6c 61 72 67 65 72 20  might be larger 
a600: 74 68 61 74 20 77 68 61 74 20 69 73 0a 2a 2a 20  that what is.** 
a610: 72 65 61 6c 6c 79 20 6e 65 65 64 65 64 2e 0a 2a  really needed..*
a620: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 64 65  /.static int ide
a630: 6e 74 4c 65 6e 67 74 68 28 63 6f 6e 73 74 20 63  ntLength(const c
a640: 68 61 72 20 2a 7a 29 7b 0a 20 20 69 6e 74 20 6e  har *z){.  int n
a650: 3b 0a 20 20 66 6f 72 28 6e 3d 30 3b 20 2a 7a 3b  ;.  for(n=0; *z;
a660: 20 6e 2b 2b 2c 20 7a 2b 2b 29 7b 0a 20 20 20 20   n++, z++){.    
a670: 69 66 28 20 2a 7a 3d 3d 27 22 27 20 29 7b 20 6e  if( *z=='"' ){ n
a680: 2b 2b 3b 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75  ++; }.  }.  retu
a690: 72 6e 20 6e 20 2b 20 32 3b 0a 7d 0a 0a 2f 2a 0a  rn n + 2;.}../*.
a6a0: 2a 2a 20 57 72 69 74 65 20 61 6e 20 69 64 65 6e  ** Write an iden
a6b0: 74 69 66 69 65 72 20 6f 6e 74 6f 20 74 68 65 20  tifier onto the 
a6c0: 65 6e 64 20 6f 66 20 74 68 65 20 67 69 76 65 6e  end of the given
a6d0: 20 73 74 72 69 6e 67 2e 20 20 41 64 64 0a 2a 2a   string.  Add.**
a6e0: 20 71 75 6f 74 65 20 63 68 61 72 61 63 74 65 72   quote character
a6f0: 73 20 61 73 20 6e 65 65 64 65 64 2e 0a 2a 2f 0a  s as needed..*/.
a700: 73 74 61 74 69 63 20 76 6f 69 64 20 69 64 65 6e  static void iden
a710: 74 50 75 74 28 63 68 61 72 20 2a 7a 2c 20 69 6e  tPut(char *z, in
a720: 74 20 2a 70 49 64 78 2c 20 63 68 61 72 20 2a 7a  t *pIdx, char *z
a730: 53 69 67 6e 65 64 49 64 65 6e 74 29 7b 0a 20 20  SignedIdent){.  
a740: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a  unsigned char *z
a750: 49 64 65 6e 74 20 3d 20 28 75 6e 73 69 67 6e 65  Ident = (unsigne
a760: 64 20 63 68 61 72 2a 29 7a 53 69 67 6e 65 64 49  d char*)zSignedI
a770: 64 65 6e 74 3b 0a 20 20 69 6e 74 20 69 2c 20 6a  dent;.  int i, j
a780: 2c 20 6e 65 65 64 51 75 6f 74 65 3b 0a 20 20 69  , needQuote;.  i
a790: 20 3d 20 2a 70 49 64 78 3b 0a 20 20 66 6f 72 28   = *pIdx;.  for(
a7a0: 6a 3d 30 3b 20 7a 49 64 65 6e 74 5b 6a 5d 3b 20  j=0; zIdent[j]; 
a7b0: 6a 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 21 69  j++){.    if( !i
a7c0: 73 61 6c 6e 75 6d 28 7a 49 64 65 6e 74 5b 6a 5d  salnum(zIdent[j]
a7d0: 29 20 26 26 20 7a 49 64 65 6e 74 5b 6a 5d 21 3d  ) && zIdent[j]!=
a7e0: 27 5f 27 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d  '_' ) break;.  }
a7f0: 0a 20 20 6e 65 65 64 51 75 6f 74 65 20 3d 20 20  .  needQuote =  
a800: 7a 49 64 65 6e 74 5b 6a 5d 21 3d 30 20 7c 7c 20  zIdent[j]!=0 || 
a810: 69 73 64 69 67 69 74 28 7a 49 64 65 6e 74 5b 30  isdigit(zIdent[0
a820: 5d 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ]).             
a830: 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 4b       || sqlite3K
a840: 65 79 77 6f 72 64 43 6f 64 65 28 7a 49 64 65 6e  eywordCode(zIden
a850: 74 2c 20 6a 29 21 3d 54 4b 5f 49 44 3b 0a 20 20  t, j)!=TK_ID;.  
a860: 69 66 28 20 6e 65 65 64 51 75 6f 74 65 20 29 20  if( needQuote ) 
a870: 7a 5b 69 2b 2b 5d 20 3d 20 27 22 27 3b 0a 20 20  z[i++] = '"';.  
a880: 66 6f 72 28 6a 3d 30 3b 20 7a 49 64 65 6e 74 5b  for(j=0; zIdent[
a890: 6a 5d 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 7a 5b  j]; j++){.    z[
a8a0: 69 2b 2b 5d 20 3d 20 7a 49 64 65 6e 74 5b 6a 5d  i++] = zIdent[j]
a8b0: 3b 0a 20 20 20 20 69 66 28 20 7a 49 64 65 6e 74  ;.    if( zIdent
a8c0: 5b 6a 5d 3d 3d 27 22 27 20 29 20 7a 5b 69 2b 2b  [j]=='"' ) z[i++
a8d0: 5d 20 3d 20 27 22 27 3b 0a 20 20 7d 0a 20 20 69  ] = '"';.  }.  i
a8e0: 66 28 20 6e 65 65 64 51 75 6f 74 65 20 29 20 7a  f( needQuote ) z
a8f0: 5b 69 2b 2b 5d 20 3d 20 27 22 27 3b 0a 20 20 7a  [i++] = '"';.  z
a900: 5b 69 5d 20 3d 20 30 3b 0a 20 20 2a 70 49 64 78  [i] = 0;.  *pIdx
a910: 20 3d 20 69 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47   = i;.}../*.** G
a920: 65 6e 65 72 61 74 65 20 61 20 43 52 45 41 54 45  enerate a CREATE
a930: 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74   TABLE statement
a940: 20 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72   appropriate for
a950: 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20 74 61   the given.** ta
a960: 62 6c 65 2e 20 20 4d 65 6d 6f 72 79 20 74 6f 20  ble.  Memory to 
a970: 68 6f 6c 64 20 74 68 65 20 74 65 78 74 20 6f 66  hold the text of
a980: 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 69   the statement i
a990: 73 20 6f 62 74 61 69 6e 65 64 0a 2a 2a 20 66 72  s obtained.** fr
a9a0: 6f 6d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28  om sqliteMalloc(
a9b0: 29 20 61 6e 64 20 6d 75 73 74 20 62 65 20 66 72  ) and must be fr
a9c0: 65 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 69  eed by the calli
a9d0: 6e 67 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a  ng function..*/.
a9e0: 73 74 61 74 69 63 20 63 68 61 72 20 2a 63 72 65  static char *cre
a9f0: 61 74 65 54 61 62 6c 65 53 74 6d 74 28 73 71 6c  ateTableStmt(sql
aa00: 69 74 65 33 20 2a 64 62 2c 20 54 61 62 6c 65 20  ite3 *db, Table 
aa10: 2a 70 2c 20 69 6e 74 20 69 73 54 65 6d 70 29 7b  *p, int isTemp){
aa20: 0a 20 20 69 6e 74 20 69 2c 20 6b 2c 20 6e 3b 0a  .  int i, k, n;.
aa30: 20 20 63 68 61 72 20 2a 7a 53 74 6d 74 3b 0a 20    char *zStmt;. 
aa40: 20 63 68 61 72 20 2a 7a 53 65 70 2c 20 2a 7a 53   char *zSep, *zS
aa50: 65 70 32 2c 20 2a 7a 45 6e 64 2c 20 2a 7a 3b 0a  ep2, *zEnd, *z;.
aa60: 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a    Column *pCol;.
aa70: 20 20 6e 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70    n = 0;.  for(p
aa80: 43 6f 6c 20 3d 20 70 2d 3e 61 43 6f 6c 2c 20 69  Col = p->aCol, i
aa90: 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 3b 20 69  =0; i<p->nCol; i
aaa0: 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20  ++, pCol++){.   
aab0: 20 6e 20 2b 3d 20 69 64 65 6e 74 4c 65 6e 67 74   n += identLengt
aac0: 68 28 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a  h(pCol->zName);.
aad0: 20 20 20 20 7a 20 3d 20 70 43 6f 6c 2d 3e 7a 54      z = pCol->zT
aae0: 79 70 65 3b 0a 20 20 20 20 69 66 28 20 7a 20 29  ype;.    if( z )
aaf0: 7b 0a 20 20 20 20 20 20 6e 20 2b 3d 20 28 73 71  {.      n += (sq
ab00: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 29  lite3Strlen30(z)
ab10: 20 2b 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d   + 1);.    }.  }
ab20: 0a 20 20 6e 20 2b 3d 20 69 64 65 6e 74 4c 65 6e  .  n += identLen
ab30: 67 74 68 28 70 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  gth(p->zName);. 
ab40: 20 69 66 28 20 6e 3c 35 30 20 29 7b 0a 20 20 20   if( n<50 ){.   
ab50: 20 7a 53 65 70 20 3d 20 22 22 3b 0a 20 20 20 20   zSep = "";.    
ab60: 7a 53 65 70 32 20 3d 20 22 2c 22 3b 0a 20 20 20  zSep2 = ",";.   
ab70: 20 7a 45 6e 64 20 3d 20 22 29 22 3b 0a 20 20 7d   zEnd = ")";.  }
ab80: 65 6c 73 65 7b 0a 20 20 20 20 7a 53 65 70 20 3d  else{.    zSep =
ab90: 20 22 5c 6e 20 20 22 3b 0a 20 20 20 20 7a 53 65   "\n  ";.    zSe
aba0: 70 32 20 3d 20 22 2c 5c 6e 20 20 22 3b 0a 20 20  p2 = ",\n  ";.  
abb0: 20 20 7a 45 6e 64 20 3d 20 22 5c 6e 29 22 3b 0a    zEnd = "\n)";.
abc0: 20 20 7d 0a 20 20 6e 20 2b 3d 20 33 35 20 2b 20    }.  n += 35 + 
abd0: 36 2a 70 2d 3e 6e 43 6f 6c 3b 0a 20 20 7a 53 74  6*p->nCol;.  zSt
abe0: 6d 74 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c  mt = sqlite3Mall
abf0: 6f 63 28 20 6e 20 29 3b 0a 20 20 69 66 28 20 7a  oc( n );.  if( z
ac00: 53 74 6d 74 3d 3d 30 20 29 7b 0a 20 20 20 20 64  Stmt==0 ){.    d
ac10: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
ac20: 3d 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  = 1;.    return 
ac30: 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  0;.  }.  sqlite3
ac40: 5f 73 6e 70 72 69 6e 74 66 28 6e 2c 20 7a 53 74  _snprintf(n, zSt
ac50: 6d 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  mt,.            
ac60: 20 20 20 20 20 20 21 4f 4d 49 54 5f 54 45 4d 50        !OMIT_TEMP
ac70: 44 42 26 26 69 73 54 65 6d 70 20 3f 20 22 43 52  DB&&isTemp ? "CR
ac80: 45 41 54 45 20 54 45 4d 50 20 54 41 42 4c 45 20  EATE TEMP TABLE 
ac90: 22 3a 22 43 52 45 41 54 45 20 54 41 42 4c 45 20  ":"CREATE TABLE 
aca0: 22 29 3b 0a 20 20 6b 20 3d 20 73 71 6c 69 74 65  ");.  k = sqlite
acb0: 33 53 74 72 6c 65 6e 33 30 28 7a 53 74 6d 74 29  3Strlen30(zStmt)
acc0: 3b 0a 20 20 69 64 65 6e 74 50 75 74 28 7a 53 74  ;.  identPut(zSt
acd0: 6d 74 2c 20 26 6b 2c 20 70 2d 3e 7a 4e 61 6d 65  mt, &k, p->zName
ace0: 29 3b 0a 20 20 7a 53 74 6d 74 5b 6b 2b 2b 5d 20  );.  zStmt[k++] 
acf0: 3d 20 27 28 27 3b 0a 20 20 66 6f 72 28 70 43 6f  = '(';.  for(pCo
ad00: 6c 3d 70 2d 3e 61 43 6f 6c 2c 20 69 3d 30 3b 20  l=p->aCol, i=0; 
ad10: 69 3c 70 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c 20  i<p->nCol; i++, 
ad20: 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 73 71 6c  pCol++){.    sql
ad30: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 2d  ite3_snprintf(n-
ad40: 6b 2c 20 26 7a 53 74 6d 74 5b 6b 5d 2c 20 7a 53  k, &zStmt[k], zS
ad50: 65 70 29 3b 0a 20 20 20 20 6b 20 2b 3d 20 73 71  ep);.    k += sq
ad60: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 26 7a  lite3Strlen30(&z
ad70: 53 74 6d 74 5b 6b 5d 29 3b 0a 20 20 20 20 7a 53  Stmt[k]);.    zS
ad80: 65 70 20 3d 20 7a 53 65 70 32 3b 0a 20 20 20 20  ep = zSep2;.    
ad90: 69 64 65 6e 74 50 75 74 28 7a 53 74 6d 74 2c 20  identPut(zStmt, 
ada0: 26 6b 2c 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 29  &k, pCol->zName)
adb0: 3b 0a 20 20 20 20 69 66 28 20 28 7a 20 3d 20 70  ;.    if( (z = p
adc0: 43 6f 6c 2d 3e 7a 54 79 70 65 29 21 3d 30 20 29  Col->zType)!=0 )
add0: 7b 0a 20 20 20 20 20 20 7a 53 74 6d 74 5b 6b 2b  {.      zStmt[k+
ade0: 2b 5d 20 3d 20 27 20 27 3b 0a 20 20 20 20 20 20  +] = ' ';.      
adf0: 61 73 73 65 72 74 28 20 28 69 6e 74 29 28 73 71  assert( (int)(sq
ae00: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 29  lite3Strlen30(z)
ae10: 2b 6b 2b 31 29 3c 3d 6e 20 29 3b 0a 20 20 20 20  +k+1)<=n );.    
ae20: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
ae30: 74 66 28 6e 2d 6b 2c 20 26 7a 53 74 6d 74 5b 6b  tf(n-k, &zStmt[k
ae40: 5d 2c 20 22 25 73 22 2c 20 7a 29 3b 0a 20 20 20  ], "%s", z);.   
ae50: 20 20 20 6b 20 2b 3d 20 73 71 6c 69 74 65 33 53     k += sqlite3S
ae60: 74 72 6c 65 6e 33 30 28 7a 29 3b 0a 20 20 20 20  trlen30(z);.    
ae70: 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  }.  }.  sqlite3_
ae80: 73 6e 70 72 69 6e 74 66 28 6e 2d 6b 2c 20 26 7a  snprintf(n-k, &z
ae90: 53 74 6d 74 5b 6b 5d 2c 20 22 25 73 22 2c 20 7a  Stmt[k], "%s", z
aea0: 45 6e 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a  End);.  return z
aeb0: 53 74 6d 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  Stmt;.}../*.** T
aec0: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
aed0: 61 6c 6c 65 64 20 74 6f 20 72 65 70 6f 72 74 20  alled to report 
aee0: 74 68 65 20 66 69 6e 61 6c 20 22 29 22 20 74 68  the final ")" th
aef0: 61 74 20 74 65 72 6d 69 6e 61 74 65 73 0a 2a 2a  at terminates.**
af00: 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20   a CREATE TABLE 
af10: 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a  statement..**.**
af20: 20 54 68 65 20 74 61 62 6c 65 20 73 74 72 75 63   The table struc
af30: 74 75 72 65 20 74 68 61 74 20 6f 74 68 65 72 20  ture that other 
af40: 61 63 74 69 6f 6e 20 72 6f 75 74 69 6e 65 73 20  action routines 
af50: 68 61 76 65 20 62 65 65 6e 20 62 75 69 6c 64 69  have been buildi
af60: 6e 67 0a 2a 2a 20 69 73 20 61 64 64 65 64 20 74  ng.** is added t
af70: 6f 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 68  o the internal h
af80: 61 73 68 20 74 61 62 6c 65 73 2c 20 61 73 73 75  ash tables, assu
af90: 6d 69 6e 67 20 6e 6f 20 65 72 72 6f 72 73 20 68  ming no errors h
afa0: 61 76 65 0a 2a 2a 20 6f 63 63 75 72 72 65 64 2e  ave.** occurred.
afb0: 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 6e 74 72 79 20  .**.** An entry 
afc0: 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20 69 73  for the table is
afd0: 20 6d 61 64 65 20 69 6e 20 74 68 65 20 6d 61 73   made in the mas
afe0: 74 65 72 20 74 61 62 6c 65 20 6f 6e 20 64 69 73  ter table on dis
aff0: 6b 2c 20 75 6e 6c 65 73 73 0a 2a 2a 20 74 68 69  k, unless.** thi
b000: 73 20 69 73 20 61 20 74 65 6d 70 6f 72 61 72 79  s is a temporary
b010: 20 74 61 62 6c 65 20 6f 72 20 64 62 2d 3e 69 6e   table or db->in
b020: 69 74 2e 62 75 73 79 3d 3d 31 2e 20 20 57 68 65  it.busy==1.  Whe
b030: 6e 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d  n db->init.busy=
b040: 3d 31 0a 2a 2a 20 69 74 20 6d 65 61 6e 73 20 77  =1.** it means w
b050: 65 20 61 72 65 20 72 65 61 64 69 6e 67 20 74 68  e are reading th
b060: 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  e sqlite_master 
b070: 74 61 62 6c 65 20 62 65 63 61 75 73 65 20 77 65  table because we
b080: 20 6a 75 73 74 0a 2a 2a 20 63 6f 6e 6e 65 63 74   just.** connect
b090: 65 64 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ed to the databa
b0a0: 73 65 20 6f 72 20 62 65 63 61 75 73 65 20 74 68  se or because th
b0b0: 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  e sqlite_master 
b0c0: 74 61 62 6c 65 20 68 61 73 0a 2a 2a 20 72 65 63  table has.** rec
b0d0: 65 6e 74 6c 79 20 63 68 61 6e 67 65 64 2c 20 73  ently changed, s
b0e0: 6f 20 74 68 65 20 65 6e 74 72 79 20 66 6f 72 20  o the entry for 
b0f0: 74 68 69 73 20 74 61 62 6c 65 20 61 6c 72 65 61  this table alrea
b100: 64 79 20 65 78 69 73 74 73 20 69 6e 0a 2a 2a 20  dy exists in.** 
b110: 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  the sqlite_maste
b120: 72 20 74 61 62 6c 65 2e 20 20 57 65 20 64 6f 20  r table.  We do 
b130: 6e 6f 74 20 77 61 6e 74 20 74 6f 20 63 72 65 61  not want to crea
b140: 74 65 20 69 74 20 61 67 61 69 6e 2e 0a 2a 2a 0a  te it again..**.
b150: 2a 2a 20 49 66 20 74 68 65 20 70 53 65 6c 65 63  ** If the pSelec
b160: 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f  t argument is no
b170: 74 20 4e 55 4c 4c 2c 20 69 74 20 6d 65 61 6e 73  t NULL, it means
b180: 20 74 68 61 74 20 74 68 69 73 20 72 6f 75 74 69   that this routi
b190: 6e 65 0a 2a 2a 20 77 61 73 20 63 61 6c 6c 65 64  ne.** was called
b1a0: 20 74 6f 20 63 72 65 61 74 65 20 61 20 74 61 62   to create a tab
b1b0: 6c 65 20 67 65 6e 65 72 61 74 65 64 20 66 72 6f  le generated fro
b1c0: 6d 20 61 20 0a 2a 2a 20 22 43 52 45 41 54 45 20  m a .** "CREATE 
b1d0: 54 41 42 4c 45 20 2e 2e 2e 20 41 53 20 53 45 4c  TABLE ... AS SEL
b1e0: 45 43 54 20 2e 2e 2e 22 20 73 74 61 74 65 6d 65  ECT ..." stateme
b1f0: 6e 74 2e 20 20 54 68 65 20 63 6f 6c 75 6d 6e 20  nt.  The column 
b200: 6e 61 6d 65 73 20 6f 66 0a 2a 2a 20 74 68 65 20  names of.** the 
b210: 6e 65 77 20 74 61 62 6c 65 20 77 69 6c 6c 20 6d  new table will m
b220: 61 74 63 68 20 74 68 65 20 72 65 73 75 6c 74 20  atch the result 
b230: 73 65 74 20 6f 66 20 74 68 65 20 53 45 4c 45 43  set of the SELEC
b240: 54 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  T..*/.void sqlit
b250: 65 33 45 6e 64 54 61 62 6c 65 28 0a 20 20 50 61  e3EndTable(.  Pa
b260: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
b270: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65 20 63        /* Parse c
b280: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 6f 6b 65  ontext */.  Toke
b290: 6e 20 2a 70 43 6f 6e 73 2c 20 20 20 20 20 20 20  n *pCons,       
b2a0: 20 20 20 20 2f 2a 20 54 68 65 20 27 2c 27 20 74      /* The ',' t
b2b0: 6f 6b 65 6e 20 61 66 74 65 72 20 74 68 65 20 6c  oken after the l
b2c0: 61 73 74 20 63 6f 6c 75 6d 6e 20 64 65 66 6e 2e  ast column defn.
b2d0: 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 45 6e   */.  Token *pEn
b2e0: 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  d,            /*
b2f0: 20 54 68 65 20 66 69 6e 61 6c 20 27 29 27 20 74   The final ')' t
b300: 6f 6b 65 6e 20 69 6e 20 74 68 65 20 43 52 45 41  oken in the CREA
b310: 54 45 20 54 41 42 4c 45 20 2a 2f 0a 20 20 53 65  TE TABLE */.  Se
b320: 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 20 20 20  lect *pSelect   
b330: 20 20 20 20 20 20 2f 2a 20 53 65 6c 65 63 74 20        /* Select 
b340: 66 72 6f 6d 20 61 20 22 43 52 45 41 54 45 20 2e  from a "CREATE .
b350: 2e 2e 20 41 53 20 53 45 4c 45 43 54 22 20 2a 2f  .. AS SELECT" */
b360: 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a  .){.  Table *p;.
b370: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
b380: 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e  pParse->db;.  in
b390: 74 20 69 44 62 3b 0a 0a 20 20 69 66 28 20 28 70  t iDb;..  if( (p
b3a0: 45 6e 64 3d 3d 30 20 26 26 20 70 53 65 6c 65 63  End==0 && pSelec
b3b0: 74 3d 3d 30 29 20 7c 7c 20 70 50 61 72 73 65 2d  t==0) || pParse-
b3c0: 3e 6e 45 72 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c  >nErr || db->mal
b3d0: 6c 6f 63 46 61 69 6c 65 64 20 29 20 7b 0a 20 20  locFailed ) {.  
b3e0: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
b3f0: 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  p = pParse->pNew
b400: 54 61 62 6c 65 3b 0a 20 20 69 66 28 20 70 3d 3d  Table;.  if( p==
b410: 30 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 61  0 ) return;..  a
b420: 73 73 65 72 74 28 20 21 64 62 2d 3e 69 6e 69 74  ssert( !db->init
b430: 2e 62 75 73 79 20 7c 7c 20 21 70 53 65 6c 65 63  .busy || !pSelec
b440: 74 20 29 3b 0a 0a 20 20 69 44 62 20 3d 20 73 71  t );..  iDb = sq
b450: 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64  lite3SchemaToInd
b460: 65 78 28 64 62 2c 20 70 2d 3e 70 53 63 68 65 6d  ex(db, p->pSchem
b470: 61 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  a);..#ifndef SQL
b480: 49 54 45 5f 4f 4d 49 54 5f 43 48 45 43 4b 0a 20  ITE_OMIT_CHECK. 
b490: 20 2f 2a 20 52 65 73 6f 6c 76 65 20 6e 61 6d 65   /* Resolve name
b4a0: 73 20 69 6e 20 61 6c 6c 20 43 48 45 43 4b 20 63  s in all CHECK c
b4b0: 6f 6e 73 74 72 61 69 6e 74 20 65 78 70 72 65 73  onstraint expres
b4c0: 73 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66  sions..  */.  if
b4d0: 28 20 70 2d 3e 70 43 68 65 63 6b 20 29 7b 0a 20  ( p->pCheck ){. 
b4e0: 20 20 20 53 72 63 4c 69 73 74 20 73 53 72 63 3b     SrcList sSrc;
b4f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b500: 20 20 20 2f 2a 20 46 61 6b 65 20 53 72 63 4c 69     /* Fake SrcLi
b510: 73 74 20 66 6f 72 20 70 50 61 72 73 65 2d 3e 70  st for pParse->p
b520: 4e 65 77 54 61 62 6c 65 20 2a 2f 0a 20 20 20 20  NewTable */.    
b530: 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b  NameContext sNC;
b540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b550: 2f 2a 20 4e 61 6d 65 20 63 6f 6e 74 65 78 74 20  /* Name context 
b560: 66 6f 72 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  for pParse->pNew
b570: 54 61 62 6c 65 20 2a 2f 0a 0a 20 20 20 20 6d 65  Table */..    me
b580: 6d 73 65 74 28 26 73 4e 43 2c 20 30 2c 20 73 69  mset(&sNC, 0, si
b590: 7a 65 6f 66 28 73 4e 43 29 29 3b 0a 20 20 20 20  zeof(sNC));.    
b5a0: 6d 65 6d 73 65 74 28 26 73 53 72 63 2c 20 30 2c  memset(&sSrc, 0,
b5b0: 20 73 69 7a 65 6f 66 28 73 53 72 63 29 29 3b 0a   sizeof(sSrc));.
b5c0: 20 20 20 20 73 53 72 63 2e 6e 53 72 63 20 3d 20      sSrc.nSrc = 
b5d0: 31 3b 0a 20 20 20 20 73 53 72 63 2e 61 5b 30 5d  1;.    sSrc.a[0]
b5e0: 2e 7a 4e 61 6d 65 20 3d 20 70 2d 3e 7a 4e 61 6d  .zName = p->zNam
b5f0: 65 3b 0a 20 20 20 20 73 53 72 63 2e 61 5b 30 5d  e;.    sSrc.a[0]
b600: 2e 70 54 61 62 20 3d 20 70 3b 0a 20 20 20 20 73  .pTab = p;.    s
b610: 53 72 63 2e 61 5b 30 5d 2e 69 43 75 72 73 6f 72  Src.a[0].iCursor
b620: 20 3d 20 2d 31 3b 0a 20 20 20 20 73 4e 43 2e 70   = -1;.    sNC.p
b630: 50 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a  Parse = pParse;.
b640: 20 20 20 20 73 4e 43 2e 70 53 72 63 4c 69 73 74      sNC.pSrcList
b650: 20 3d 20 26 73 53 72 63 3b 0a 20 20 20 20 73 4e   = &sSrc;.    sN
b660: 43 2e 69 73 43 68 65 63 6b 20 3d 20 31 3b 0a 20  C.isCheck = 1;. 
b670: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 52 65     if( sqlite3Re
b680: 73 6f 6c 76 65 45 78 70 72 4e 61 6d 65 73 28 26  solveExprNames(&
b690: 73 4e 43 2c 20 70 2d 3e 70 43 68 65 63 6b 29 20  sNC, p->pCheck) 
b6a0: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b  ){.      return;
b6b0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
b6c0: 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51  f /* !defined(SQ
b6d0: 4c 49 54 45 5f 4f 4d 49 54 5f 43 48 45 43 4b 29  LITE_OMIT_CHECK)
b6e0: 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65   */..  /* If the
b6f0: 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 69   db->init.busy i
b700: 73 20 31 20 69 74 20 6d 65 61 6e 73 20 77 65 20  s 1 it means we 
b710: 61 72 65 20 72 65 61 64 69 6e 67 20 74 68 65 20  are reading the 
b720: 53 51 4c 20 6f 66 66 20 74 68 65 0a 20 20 2a 2a  SQL off the.  **
b730: 20 22 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 22   "sqlite_master"
b740: 20 6f 72 20 22 73 71 6c 69 74 65 5f 74 65 6d 70   or "sqlite_temp
b750: 5f 6d 61 73 74 65 72 22 20 74 61 62 6c 65 20 6f  _master" table o
b760: 6e 20 74 68 65 20 64 69 73 6b 2e 0a 20 20 2a 2a  n the disk..  **
b770: 20 53 6f 20 64 6f 20 6e 6f 74 20 77 72 69 74 65   So do not write
b780: 20 74 6f 20 74 68 65 20 64 69 73 6b 20 61 67 61   to the disk aga
b790: 69 6e 2e 20 20 45 78 74 72 61 63 74 20 74 68 65  in.  Extract the
b7a0: 20 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62 65   root page numbe
b7b0: 72 0a 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 74  r.  ** for the t
b7c0: 61 62 6c 65 20 66 72 6f 6d 20 74 68 65 20 64 62  able from the db
b7d0: 2d 3e 69 6e 69 74 2e 6e 65 77 54 6e 75 6d 20 66  ->init.newTnum f
b7e0: 69 65 6c 64 2e 20 20 28 54 68 65 20 70 61 67 65  ield.  (The page
b7f0: 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 73 68 6f   number.  ** sho
b800: 75 6c 64 20 68 61 76 65 20 62 65 65 6e 20 70 75  uld have been pu
b810: 74 20 74 68 65 72 65 20 62 79 20 74 68 65 20 73  t there by the s
b820: 71 6c 69 74 65 4f 70 65 6e 43 62 20 72 6f 75 74  qliteOpenCb rout
b830: 69 6e 65 2e 29 0a 20 20 2a 2f 0a 20 20 69 66 28  ine.).  */.  if(
b840: 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29   db->init.busy )
b850: 7b 0a 20 20 20 20 70 2d 3e 74 6e 75 6d 20 3d 20  {.    p->tnum = 
b860: 64 62 2d 3e 69 6e 69 74 2e 6e 65 77 54 6e 75 6d  db->init.newTnum
b870: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 6e  ;.  }..  /* If n
b880: 6f 74 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 2c  ot initializing,
b890: 20 74 68 65 6e 20 63 72 65 61 74 65 20 61 20 72   then create a r
b8a0: 65 63 6f 72 64 20 66 6f 72 20 74 68 65 20 6e 65  ecord for the ne
b8b0: 77 20 74 61 62 6c 65 0a 20 20 2a 2a 20 69 6e 20  w table.  ** in 
b8c0: 74 68 65 20 53 51 4c 49 54 45 5f 4d 41 53 54 45  the SQLITE_MASTE
b8d0: 52 20 74 61 62 6c 65 20 6f 66 20 74 68 65 20 64  R table of the d
b8e0: 61 74 61 62 61 73 65 2e 20 20 54 68 65 20 72 65  atabase.  The re
b8f0: 63 6f 72 64 20 6e 75 6d 62 65 72 0a 20 20 2a 2a  cord number.  **
b900: 20 66 6f 72 20 74 68 65 20 6e 65 77 20 74 61 62   for the new tab
b910: 6c 65 20 65 6e 74 72 79 20 73 68 6f 75 6c 64 20  le entry should 
b920: 61 6c 72 65 61 64 79 20 62 65 20 6f 6e 20 74 68  already be on th
b930: 65 20 73 74 61 63 6b 2e 0a 20 20 2a 2a 0a 20 20  e stack..  **.  
b940: 2a 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 20  ** If this is a 
b950: 54 45 4d 50 4f 52 41 52 59 20 74 61 62 6c 65 2c  TEMPORARY table,
b960: 20 77 72 69 74 65 20 74 68 65 20 65 6e 74 72 79   write the entry
b970: 20 69 6e 74 6f 20 74 68 65 20 61 75 78 69 6c 69   into the auxili
b980: 61 72 79 0a 20 20 2a 2a 20 66 69 6c 65 20 69 6e  ary.  ** file in
b990: 73 74 65 61 64 20 6f 66 20 69 6e 74 6f 20 74 68  stead of into th
b9a0: 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20  e main database 
b9b0: 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  file..  */.  if(
b9c0: 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20   !db->init.busy 
b9d0: 29 7b 0a 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20  ){.    int n;.  
b9e0: 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 20 20 63    Vdbe *v;.    c
b9f0: 68 61 72 20 2a 7a 54 79 70 65 3b 20 20 20 20 2f  har *zType;    /
ba00: 2a 20 22 76 69 65 77 22 20 6f 72 20 22 74 61 62  * "view" or "tab
ba10: 6c 65 22 20 2a 2f 0a 20 20 20 20 63 68 61 72 20  le" */.    char 
ba20: 2a 7a 54 79 70 65 32 3b 20 20 20 2f 2a 20 22 56  *zType2;   /* "V
ba30: 49 45 57 22 20 6f 72 20 22 54 41 42 4c 45 22 20  IEW" or "TABLE" 
ba40: 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 53 74  */.    char *zSt
ba50: 6d 74 3b 20 20 20 20 2f 2a 20 54 65 78 74 20 6f  mt;    /* Text o
ba60: 66 20 74 68 65 20 43 52 45 41 54 45 20 54 41 42  f the CREATE TAB
ba70: 4c 45 20 6f 72 20 43 52 45 41 54 45 20 56 49 45  LE or CREATE VIE
ba80: 57 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 0a  W statement */..
ba90: 20 20 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47      v = sqlite3G
baa0: 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
bab0: 20 20 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72      if( v==0 ) r
bac0: 65 74 75 72 6e 3b 0a 0a 20 20 20 20 73 71 6c 69  eturn;..    sqli
bad0: 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
bae0: 20 4f 50 5f 43 6c 6f 73 65 2c 20 30 29 3b 0a 0a   OP_Close, 0);..
baf0: 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 74 68      /* Create th
bb00: 65 20 72 6f 6f 74 70 61 67 65 20 66 6f 72 20 74  e rootpage for t
bb10: 68 65 20 6e 65 77 20 74 61 62 6c 65 20 61 6e 64  he new table and
bb20: 20 70 75 73 68 20 69 74 20 6f 6e 74 6f 20 74 68   push it onto th
bb30: 65 20 73 74 61 63 6b 2e 0a 20 20 20 20 2a 2a 20  e stack..    ** 
bb40: 41 20 76 69 65 77 20 68 61 73 20 6e 6f 20 72 6f  A view has no ro
bb50: 6f 74 70 61 67 65 2c 20 73 6f 20 6a 75 73 74 20  otpage, so just 
bb60: 70 75 73 68 20 61 20 7a 65 72 6f 20 6f 6e 74 6f  push a zero onto
bb70: 20 74 68 65 20 73 74 61 63 6b 20 66 6f 72 0a 20   the stack for. 
bb80: 20 20 20 2a 2a 20 76 69 65 77 73 2e 20 20 49 6e     ** views.  In
bb90: 69 74 69 61 6c 69 7a 65 20 7a 54 79 70 65 20 61  itialize zType a
bba0: 74 20 74 68 65 20 73 61 6d 65 20 74 69 6d 65 2e  t the same time.
bbb0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
bbc0: 70 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20 29 7b  p->pSelect==0 ){
bbd0: 0a 20 20 20 20 20 20 2f 2a 20 41 20 72 65 67 75  .      /* A regu
bbe0: 6c 61 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20  lar table */.   
bbf0: 20 20 20 7a 54 79 70 65 20 3d 20 22 74 61 62 6c     zType = "tabl
bc00: 65 22 3b 0a 20 20 20 20 20 20 7a 54 79 70 65 32  e";.      zType2
bc10: 20 3d 20 22 54 41 42 4c 45 22 3b 0a 23 69 66 6e   = "TABLE";.#ifn
bc20: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
bc30: 56 49 45 57 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  VIEW.    }else{.
bc40: 20 20 20 20 20 20 2f 2a 20 41 20 76 69 65 77 20        /* A view 
bc50: 2a 2f 0a 20 20 20 20 20 20 7a 54 79 70 65 20 3d  */.      zType =
bc60: 20 22 76 69 65 77 22 3b 0a 20 20 20 20 20 20 7a   "view";.      z
bc70: 54 79 70 65 32 20 3d 20 22 56 49 45 57 22 3b 0a  Type2 = "VIEW";.
bc80: 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 0a 20 20  #endif.    }..  
bc90: 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20    /* If this is 
bca0: 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 78  a CREATE TABLE x
bcb0: 78 20 41 53 20 53 45 4c 45 43 54 20 2e 2e 2e 2c  x AS SELECT ...,
bcc0: 20 65 78 65 63 75 74 65 20 74 68 65 20 53 45 4c   execute the SEL
bcd0: 45 43 54 0a 20 20 20 20 2a 2a 20 73 74 61 74 65  ECT.    ** state
bce0: 6d 65 6e 74 20 74 6f 20 70 6f 70 75 6c 61 74 65  ment to populate
bcf0: 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 2e 20   the new table. 
bd00: 54 68 65 20 72 6f 6f 74 2d 70 61 67 65 20 6e 75  The root-page nu
bd10: 6d 62 65 72 20 66 6f 72 20 74 68 65 0a 20 20 20  mber for the.   
bd20: 20 2a 2a 20 6e 65 77 20 74 61 62 6c 65 20 69 73   ** new table is
bd30: 20 6f 6e 20 74 68 65 20 74 6f 70 20 6f 66 20 74   on the top of t
bd40: 68 65 20 76 64 62 65 20 73 74 61 63 6b 2e 0a 20  he vdbe stack.. 
bd50: 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 4f 6e 63     **.    ** Onc
bd60: 65 20 74 68 65 20 53 45 4c 45 43 54 20 68 61 73  e the SELECT has
bd70: 20 62 65 65 6e 20 63 6f 64 65 64 20 62 79 20 73   been coded by s
bd80: 71 6c 69 74 65 33 53 65 6c 65 63 74 28 29 2c 20  qlite3Select(), 
bd90: 69 74 20 69 73 20 69 6e 20 61 0a 20 20 20 20 2a  it is in a.    *
bda0: 2a 20 73 75 69 74 61 62 6c 65 20 73 74 61 74 65  * suitable state
bdb0: 20 74 6f 20 71 75 65 72 79 20 66 6f 72 20 74 68   to query for th
bdc0: 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 61  e column names a
bdd0: 6e 64 20 74 79 70 65 73 20 74 6f 20 62 65 20 75  nd types to be u
bde0: 73 65 64 0a 20 20 20 20 2a 2a 20 62 79 20 74 68  sed.    ** by th
bdf0: 65 20 6e 65 77 20 74 61 62 6c 65 2e 0a 20 20 20  e new table..   
be00: 20 2a 2a 0a 20 20 20 20 2a 2a 20 41 20 73 68 61   **.    ** A sha
be10: 72 65 64 2d 63 61 63 68 65 20 77 72 69 74 65 2d  red-cache write-
be20: 6c 6f 63 6b 20 69 73 20 6e 6f 74 20 72 65 71 75  lock is not requ
be30: 69 72 65 64 20 74 6f 20 77 72 69 74 65 20 74 6f  ired to write to
be40: 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 2c 0a   the new table,.
be50: 20 20 20 20 2a 2a 20 61 73 20 61 20 73 63 68 65      ** as a sche
be60: 6d 61 2d 6c 6f 63 6b 20 6d 75 73 74 20 68 61 76  ma-lock must hav
be70: 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 6f  e already been o
be80: 62 74 61 69 6e 65 64 20 74 6f 20 63 72 65 61 74  btained to creat
be90: 65 20 69 74 2e 20 53 69 6e 63 65 0a 20 20 20 20  e it. Since.    
bea0: 2a 2a 20 61 20 73 63 68 65 6d 61 2d 6c 6f 63 6b  ** a schema-lock
beb0: 20 65 78 63 6c 75 64 65 73 20 61 6c 6c 20 6f 74   excludes all ot
bec0: 68 65 72 20 64 61 74 61 62 61 73 65 20 75 73 65  her database use
bed0: 72 73 2c 20 74 68 65 20 77 72 69 74 65 2d 6c 6f  rs, the write-lo
bee0: 63 6b 20 77 6f 75 6c 64 0a 20 20 20 20 2a 2a 20  ck would.    ** 
bef0: 62 65 20 72 65 64 75 6e 64 61 6e 74 2e 0a 20 20  be redundant..  
bf00: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 53 65    */.    if( pSe
bf10: 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 53 65  lect ){.      Se
bf20: 6c 65 63 74 44 65 73 74 20 64 65 73 74 3b 0a 20  lectDest dest;. 
bf30: 20 20 20 20 20 54 61 62 6c 65 20 2a 70 53 65 6c       Table *pSel
bf40: 54 61 62 3b 0a 0a 20 20 20 20 20 20 61 73 73 65  Tab;..      asse
bf50: 72 74 28 70 50 61 72 73 65 2d 3e 6e 54 61 62 3d  rt(pParse->nTab=
bf60: 3d 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  =0);.      sqlit
bf70: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
bf80: 4f 50 5f 4f 70 65 6e 57 72 69 74 65 2c 20 31 2c  OP_OpenWrite, 1,
bf90: 20 70 50 61 72 73 65 2d 3e 72 65 67 52 6f 6f 74   pParse->regRoot
bfa0: 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20 73 71  , iDb);.      sq
bfb0: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
bfc0: 35 28 76 2c 20 31 29 3b 0a 20 20 20 20 20 20 70  5(v, 1);.      p
bfd0: 50 61 72 73 65 2d 3e 6e 54 61 62 20 3d 20 32 3b  Parse->nTab = 2;
bfe0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65  .      sqlite3Se
bff0: 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26 64 65  lectDestInit(&de
c000: 73 74 2c 20 53 52 54 5f 54 61 62 6c 65 2c 20 31  st, SRT_Table, 1
c010: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
c020: 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  Select(pParse, p
c030: 53 65 6c 65 63 74 2c 20 26 64 65 73 74 29 3b 0a  Select, &dest);.
c040: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
c050: 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 43 6c  eAddOp1(v, OP_Cl
c060: 6f 73 65 2c 20 31 29 3b 0a 20 20 20 20 20 20 69  ose, 1);.      i
c070: 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d  f( pParse->nErr=
c080: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 53  =0 ){.        pS
c090: 65 6c 54 61 62 20 3d 20 73 71 6c 69 74 65 33 52  elTab = sqlite3R
c0a0: 65 73 75 6c 74 53 65 74 4f 66 53 65 6c 65 63 74  esultSetOfSelect
c0b0: 28 70 50 61 72 73 65 2c 20 70 53 65 6c 65 63 74  (pParse, pSelect
c0c0: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
c0d0: 53 65 6c 54 61 62 3d 3d 30 20 29 20 72 65 74 75  SelTab==0 ) retu
c0e0: 72 6e 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  rn;.        asse
c0f0: 72 74 28 20 70 2d 3e 61 43 6f 6c 3d 3d 30 20 29  rt( p->aCol==0 )
c100: 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6e 43 6f  ;.        p->nCo
c110: 6c 20 3d 20 70 53 65 6c 54 61 62 2d 3e 6e 43 6f  l = pSelTab->nCo
c120: 6c 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 61 43  l;.        p->aC
c130: 6f 6c 20 3d 20 70 53 65 6c 54 61 62 2d 3e 61 43  ol = pSelTab->aC
c140: 6f 6c 3b 0a 20 20 20 20 20 20 20 20 70 53 65 6c  ol;.        pSel
c150: 54 61 62 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20  Tab->nCol = 0;. 
c160: 20 20 20 20 20 20 20 70 53 65 6c 54 61 62 2d 3e         pSelTab->
c170: 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20  aCol = 0;.      
c180: 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54    sqlite3DeleteT
c190: 61 62 6c 65 28 70 53 65 6c 54 61 62 29 3b 0a 20  able(pSelTab);. 
c1a0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
c1b0: 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68 65    /* Compute the
c1c0: 20 63 6f 6d 70 6c 65 74 65 20 74 65 78 74 20 6f   complete text o
c1d0: 66 20 74 68 65 20 43 52 45 41 54 45 20 73 74 61  f the CREATE sta
c1e0: 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 69 66  tement */.    if
c1f0: 28 20 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20  ( pSelect ){.   
c200: 20 20 20 7a 53 74 6d 74 20 3d 20 63 72 65 61 74     zStmt = creat
c210: 65 54 61 62 6c 65 53 74 6d 74 28 64 62 2c 20 70  eTableStmt(db, p
c220: 2c 20 70 2d 3e 70 53 63 68 65 6d 61 3d 3d 64 62  , p->pSchema==db
c230: 2d 3e 61 44 62 5b 31 5d 2e 70 53 63 68 65 6d 61  ->aDb[1].pSchema
c240: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
c250: 20 20 20 20 6e 20 3d 20 28 69 6e 74 29 28 70 45      n = (int)(pE
c260: 6e 64 2d 3e 7a 20 2d 20 70 50 61 72 73 65 2d 3e  nd->z - pParse->
c270: 73 4e 61 6d 65 54 6f 6b 65 6e 2e 7a 29 20 2b 20  sNameToken.z) + 
c280: 31 3b 0a 20 20 20 20 20 20 7a 53 74 6d 74 20 3d  1;.      zStmt =
c290: 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
c2a0: 64 62 2c 20 0a 20 20 20 20 20 20 20 20 20 20 22  db, .          "
c2b0: 43 52 45 41 54 45 20 25 73 20 25 2e 2a 73 22 2c  CREATE %s %.*s",
c2c0: 20 7a 54 79 70 65 32 2c 20 6e 2c 20 70 50 61 72   zType2, n, pPar
c2d0: 73 65 2d 3e 73 4e 61 6d 65 54 6f 6b 65 6e 2e 7a  se->sNameToken.z
c2e0: 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a  .      );.    }.
c2f0: 0a 20 20 20 20 2f 2a 20 41 20 73 6c 6f 74 20 66  .    /* A slot f
c300: 6f 72 20 74 68 65 20 72 65 63 6f 72 64 20 68 61  or the record ha
c310: 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 61  s already been a
c320: 6c 6c 6f 63 61 74 65 64 20 69 6e 20 74 68 65 20  llocated in the 
c330: 0a 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 4d  .    ** SQLITE_M
c340: 41 53 54 45 52 20 74 61 62 6c 65 2e 20 20 57 65  ASTER table.  We
c350: 20 6a 75 73 74 20 6e 65 65 64 20 74 6f 20 75 70   just need to up
c360: 64 61 74 65 20 74 68 61 74 20 73 6c 6f 74 20 77  date that slot w
c370: 69 74 68 20 61 6c 6c 0a 20 20 20 20 2a 2a 20 74  ith all.    ** t
c380: 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 77  he information w
c390: 65 27 76 65 20 63 6f 6c 6c 65 63 74 65 64 2e 20  e've collected. 
c3a0: 20 54 68 65 20 72 6f 77 69 64 20 66 6f 72 20 74   The rowid for t
c3b0: 68 65 20 70 72 65 61 6c 6c 6f 63 61 74 65 64 0a  he preallocated.
c3c0: 20 20 20 20 2a 2a 20 73 6c 6f 74 20 69 73 20 74      ** slot is t
c3d0: 68 65 20 32 6e 64 20 69 74 65 6d 20 6f 6e 20 74  he 2nd item on t
c3e0: 68 65 20 73 74 61 63 6b 2e 20 20 54 68 65 20 74  he stack.  The t
c3f0: 6f 70 20 6f 66 20 74 68 65 20 73 74 61 63 6b 20  op of the stack 
c400: 69 73 20 74 68 65 0a 20 20 20 20 2a 2a 20 72 6f  is the.    ** ro
c410: 6f 74 20 70 61 67 65 20 66 6f 72 20 74 68 65 20  ot page for the 
c420: 6e 65 77 20 74 61 62 6c 65 20 28 6f 72 20 61 20  new table (or a 
c430: 30 20 69 66 20 74 68 69 73 20 69 73 20 61 20 76  0 if this is a v
c440: 69 65 77 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  iew)..    */.   
c450: 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61   sqlite3NestedPa
c460: 72 73 65 28 70 50 61 72 73 65 2c 0a 20 20 20 20  rse(pParse,.    
c470: 20 20 22 55 50 44 41 54 45 20 25 51 2e 25 73 20    "UPDATE %Q.%s 
c480: 22 0a 20 20 20 20 20 20 20 20 20 22 53 45 54 20  ".         "SET 
c490: 74 79 70 65 3d 27 25 73 27 2c 20 6e 61 6d 65 3d  type='%s', name=
c4a0: 25 51 2c 20 74 62 6c 5f 6e 61 6d 65 3d 25 51 2c  %Q, tbl_name=%Q,
c4b0: 20 72 6f 6f 74 70 61 67 65 3d 23 25 64 2c 20 73   rootpage=#%d, s
c4c0: 71 6c 3d 25 51 20 22 0a 20 20 20 20 20 20 20 22  ql=%Q ".       "
c4d0: 57 48 45 52 45 20 72 6f 77 69 64 3d 23 25 64 22  WHERE rowid=#%d"
c4e0: 2c 0a 20 20 20 20 20 20 64 62 2d 3e 61 44 62 5b  ,.      db->aDb[
c4f0: 69 44 62 5d 2e 7a 4e 61 6d 65 2c 20 53 43 48 45  iDb].zName, SCHE
c500: 4d 41 5f 54 41 42 4c 45 28 69 44 62 29 2c 0a 20  MA_TABLE(iDb),. 
c510: 20 20 20 20 20 7a 54 79 70 65 2c 0a 20 20 20 20       zType,.    
c520: 20 20 70 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20    p->zName,.    
c530: 20 20 70 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20    p->zName,.    
c540: 20 20 70 50 61 72 73 65 2d 3e 72 65 67 52 6f 6f    pParse->regRoo
c550: 74 2c 0a 20 20 20 20 20 20 7a 53 74 6d 74 2c 0a  t,.      zStmt,.
c560: 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 72 65        pParse->re
c570: 67 52 6f 77 69 64 0a 20 20 20 20 29 3b 0a 20 20  gRowid.    );.  
c580: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
c590: 64 62 2c 20 7a 53 74 6d 74 29 3b 0a 20 20 20 20  db, zStmt);.    
c5a0: 73 71 6c 69 74 65 33 43 68 61 6e 67 65 43 6f 6f  sqlite3ChangeCoo
c5b0: 6b 69 65 28 70 50 61 72 73 65 2c 20 69 44 62 29  kie(pParse, iDb)
c5c0: 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ;..#ifndef SQLIT
c5d0: 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 43 52 45  E_OMIT_AUTOINCRE
c5e0: 4d 45 4e 54 0a 20 20 20 20 2f 2a 20 43 68 65 63  MENT.    /* Chec
c5f0: 6b 20 74 6f 20 73 65 65 20 69 66 20 77 65 20 6e  k to see if we n
c600: 65 65 64 20 74 6f 20 63 72 65 61 74 65 20 61 6e  eed to create an
c610: 20 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65   sqlite_sequence
c620: 20 74 61 62 6c 65 20 66 6f 72 0a 20 20 20 20 2a   table for.    *
c630: 2a 20 6b 65 65 70 69 6e 67 20 74 72 61 63 6b 20  * keeping track 
c640: 6f 66 20 61 75 74 6f 69 6e 63 72 65 6d 65 6e 74  of autoincrement
c650: 20 6b 65 79 73 2e 0a 20 20 20 20 2a 2f 0a 20 20   keys..    */.  
c660: 20 20 69 66 28 20 70 2d 3e 74 61 62 46 6c 61 67    if( p->tabFlag
c670: 73 20 26 20 54 46 5f 41 75 74 6f 69 6e 63 72 65  s & TF_Autoincre
c680: 6d 65 6e 74 20 29 7b 0a 20 20 20 20 20 20 44 62  ment ){.      Db
c690: 20 2a 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62   *pDb = &db->aDb
c6a0: 5b 69 44 62 5d 3b 0a 20 20 20 20 20 20 69 66 28  [iDb];.      if(
c6b0: 20 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 70   pDb->pSchema->p
c6c0: 53 65 71 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20  SeqTab==0 ){.   
c6d0: 20 20 20 20 20 73 71 6c 69 74 65 33 4e 65 73 74       sqlite3Nest
c6e0: 65 64 50 61 72 73 65 28 70 50 61 72 73 65 2c 0a  edParse(pParse,.
c6f0: 20 20 20 20 20 20 20 20 20 20 22 43 52 45 41 54            "CREAT
c700: 45 20 54 41 42 4c 45 20 25 51 2e 73 71 6c 69 74  E TABLE %Q.sqlit
c710: 65 5f 73 65 71 75 65 6e 63 65 28 6e 61 6d 65 2c  e_sequence(name,
c720: 73 65 71 29 22 2c 0a 20 20 20 20 20 20 20 20 20  seq)",.         
c730: 20 70 44 62 2d 3e 7a 4e 61 6d 65 0a 20 20 20 20   pDb->zName.    
c740: 20 20 20 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20      );.      }. 
c750: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20     }.#endif..   
c760: 20 2f 2a 20 52 65 70 61 72 73 65 20 65 76 65 72   /* Reparse ever
c770: 79 74 68 69 6e 67 20 74 6f 20 75 70 64 61 74 65  ything to update
c780: 20 6f 75 72 20 69 6e 74 65 72 6e 61 6c 20 64 61   our internal da
c790: 74 61 20 73 74 72 75 63 74 75 72 65 73 20 2a 2f  ta structures */
c7a0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
c7b0: 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 50 61 72  AddOp4(v, OP_Par
c7c0: 73 65 53 63 68 65 6d 61 2c 20 69 44 62 2c 20 30  seSchema, iDb, 0
c7d0: 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 73 71 6c  , 0,.        sql
c7e0: 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20  ite3MPrintf(db, 
c7f0: 22 74 62 6c 5f 6e 61 6d 65 3d 27 25 71 27 22 2c  "tbl_name='%q'",
c800: 70 2d 3e 7a 4e 61 6d 65 29 2c 20 50 34 5f 44 59  p->zName), P4_DY
c810: 4e 41 4d 49 43 29 3b 0a 20 20 7d 0a 0a 0a 20 20  NAMIC);.  }...  
c820: 2f 2a 20 41 64 64 20 74 68 65 20 74 61 62 6c 65  /* Add the table
c830: 20 74 6f 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72   to the in-memor
c840: 79 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e  y representation
c850: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
c860: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d  ..  */.  if( db-
c870: 3e 69 6e 69 74 2e 62 75 73 79 20 26 26 20 70 50  >init.busy && pP
c880: 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 29 7b  arse->nErr==0 ){
c890: 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 4f 6c 64  .    Table *pOld
c8a0: 3b 0a 20 20 20 20 46 4b 65 79 20 2a 70 46 4b 65  ;.    FKey *pFKe
c8b0: 79 3b 20 0a 20 20 20 20 53 63 68 65 6d 61 20 2a  y; .    Schema *
c8c0: 70 53 63 68 65 6d 61 20 3d 20 70 2d 3e 70 53 63  pSchema = p->pSc
c8d0: 68 65 6d 61 3b 0a 20 20 20 20 70 4f 6c 64 20 3d  hema;.    pOld =
c8e0: 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65   sqlite3HashInse
c8f0: 72 74 28 26 70 53 63 68 65 6d 61 2d 3e 74 62 6c  rt(&pSchema->tbl
c900: 48 61 73 68 2c 20 70 2d 3e 7a 4e 61 6d 65 2c 0a  Hash, p->zName,.
c910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c920: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
c930: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70 2d 3e  ite3Strlen30(p->
c940: 7a 4e 61 6d 65 29 2b 31 2c 70 29 3b 0a 20 20 20  zName)+1,p);.   
c950: 20 69 66 28 20 70 4f 6c 64 20 29 7b 0a 20 20 20   if( pOld ){.   
c960: 20 20 20 61 73 73 65 72 74 28 20 70 3d 3d 70 4f     assert( p==pO
c970: 6c 64 20 29 3b 20 20 2f 2a 20 4d 61 6c 6c 6f 63  ld );  /* Malloc
c980: 20 6d 75 73 74 20 68 61 76 65 20 66 61 69 6c 65   must have faile
c990: 64 20 69 6e 73 69 64 65 20 48 61 73 68 49 6e 73  d inside HashIns
c9a0: 65 72 74 28 29 20 2a 2f 0a 20 20 20 20 20 20 64  ert() */.      d
c9b0: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
c9c0: 3d 20 31 3b 0a 20 20 20 20 20 20 72 65 74 75 72  = 1;.      retur
c9d0: 6e 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66  n;.    }.#ifndef
c9e0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52   SQLITE_OMIT_FOR
c9f0: 45 49 47 4e 5f 4b 45 59 0a 20 20 20 20 66 6f 72  EIGN_KEY.    for
ca00: 28 70 46 4b 65 79 3d 70 2d 3e 70 46 4b 65 79 3b  (pFKey=p->pFKey;
ca10: 20 70 46 4b 65 79 3b 20 70 46 4b 65 79 3d 70 46   pFKey; pFKey=pF
ca20: 4b 65 79 2d 3e 70 4e 65 78 74 46 72 6f 6d 29 7b  Key->pNextFrom){
ca30: 0a 20 20 20 20 20 20 76 6f 69 64 20 2a 64 61 74  .      void *dat
ca40: 61 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 54 6f  a;.      int nTo
ca50: 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
ca60: 33 30 28 70 46 4b 65 79 2d 3e 7a 54 6f 29 20 2b  30(pFKey->zTo) +
ca70: 20 31 3b 0a 20 20 20 20 20 20 70 46 4b 65 79 2d   1;.      pFKey-
ca80: 3e 70 4e 65 78 74 54 6f 20 3d 20 73 71 6c 69 74  >pNextTo = sqlit
ca90: 65 33 48 61 73 68 46 69 6e 64 28 26 70 53 63 68  e3HashFind(&pSch
caa0: 65 6d 61 2d 3e 61 46 4b 65 79 2c 20 70 46 4b 65  ema->aFKey, pFKe
cab0: 79 2d 3e 7a 54 6f 2c 20 6e 54 6f 29 3b 0a 20 20  y->zTo, nTo);.  
cac0: 20 20 20 20 64 61 74 61 20 3d 20 73 71 6c 69 74      data = sqlit
cad0: 65 33 48 61 73 68 49 6e 73 65 72 74 28 26 70 53  e3HashInsert(&pS
cae0: 63 68 65 6d 61 2d 3e 61 46 4b 65 79 2c 20 70 46  chema->aFKey, pF
caf0: 4b 65 79 2d 3e 7a 54 6f 2c 20 6e 54 6f 2c 20 70  Key->zTo, nTo, p
cb00: 46 4b 65 79 29 3b 0a 20 20 20 20 20 20 69 66 28  FKey);.      if(
cb10: 20 64 61 74 61 3d 3d 28 76 6f 69 64 20 2a 29 70   data==(void *)p
cb20: 46 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 20 20  FKey ){.        
cb30: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
cb40: 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 1;.      }.  
cb50: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 70    }.#endif.    p
cb60: 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
cb70: 20 3d 20 30 3b 0a 20 20 20 20 64 62 2d 3e 6e 54   = 0;.    db->nT
cb80: 61 62 6c 65 2b 2b 3b 0a 20 20 20 20 64 62 2d 3e  able++;.    db->
cb90: 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f  flags |= SQLITE_
cba0: 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a 0a  InternChanges;..
cbb0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
cbc0: 4d 49 54 5f 41 4c 54 45 52 54 41 42 4c 45 0a 20  MIT_ALTERTABLE. 
cbd0: 20 20 20 69 66 28 20 21 70 2d 3e 70 53 65 6c 65     if( !p->pSele
cbe0: 63 74 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73  ct ){.      cons
cbf0: 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20  t char *zName = 
cc00: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 70 50  (const char *)pP
cc10: 61 72 73 65 2d 3e 73 4e 61 6d 65 54 6f 6b 65 6e  arse->sNameToken
cc20: 2e 7a 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4e  .z;.      int nN
cc30: 61 6d 65 3b 0a 20 20 20 20 20 20 61 73 73 65 72  ame;.      asser
cc40: 74 28 20 21 70 53 65 6c 65 63 74 20 26 26 20 70  t( !pSelect && p
cc50: 43 6f 6e 73 20 26 26 20 70 45 6e 64 20 29 3b 0a  Cons && pEnd );.
cc60: 20 20 20 20 20 20 69 66 28 20 70 43 6f 6e 73 2d        if( pCons-
cc70: 3e 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  >z==0 ){.       
cc80: 20 70 43 6f 6e 73 20 3d 20 70 45 6e 64 3b 0a 20   pCons = pEnd;. 
cc90: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6e 4e 61       }.      nNa
cca0: 6d 65 20 3d 20 28 69 6e 74 29 28 28 63 6f 6e 73  me = (int)((cons
ccb0: 74 20 63 68 61 72 20 2a 29 70 43 6f 6e 73 2d 3e  t char *)pCons->
ccc0: 7a 20 2d 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  z - zName);.    
ccd0: 20 20 70 2d 3e 61 64 64 43 6f 6c 4f 66 66 73 65    p->addColOffse
cce0: 74 20 3d 20 31 33 20 2b 20 73 71 6c 69 74 65 33  t = 13 + sqlite3
ccf0: 55 74 66 38 43 68 61 72 4c 65 6e 28 7a 4e 61 6d  Utf8CharLen(zNam
cd00: 65 2c 20 6e 4e 61 6d 65 29 3b 0a 20 20 20 20 7d  e, nName);.    }
cd10: 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 7d 0a 0a 23  .#endif.  }.}..#
cd20: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
cd30: 49 54 5f 56 49 45 57 0a 2f 2a 0a 2a 2a 20 54 68  IT_VIEW./*.** Th
cd40: 65 20 70 61 72 73 65 72 20 63 61 6c 6c 73 20 74  e parser calls t
cd50: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 6e 20 6f  his routine in o
cd60: 72 64 65 72 20 74 6f 20 63 72 65 61 74 65 20 61  rder to create a
cd70: 20 6e 65 77 20 56 49 45 57 0a 2a 2f 0a 76 6f 69   new VIEW.*/.voi
cd80: 64 20 73 71 6c 69 74 65 33 43 72 65 61 74 65 56  d sqlite3CreateV
cd90: 69 65 77 28 0a 20 20 50 61 72 73 65 20 2a 70 50  iew(.  Parse *pP
cda0: 61 72 73 65 2c 20 20 20 20 20 2f 2a 20 54 68 65  arse,     /* The
cdb0: 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   parsing context
cdc0: 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 42 65   */.  Token *pBe
cdd0: 67 69 6e 2c 20 20 20 20 20 2f 2a 20 54 68 65 20  gin,     /* The 
cde0: 43 52 45 41 54 45 20 74 6f 6b 65 6e 20 74 68 61  CREATE token tha
cdf0: 74 20 62 65 67 69 6e 73 20 74 68 65 20 73 74 61  t begins the sta
ce00: 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 54 6f 6b 65  tement */.  Toke
ce10: 6e 20 2a 70 4e 61 6d 65 31 2c 20 20 20 20 20 2f  n *pName1,     /
ce20: 2a 20 54 68 65 20 74 6f 6b 65 6e 20 74 68 61 74  * The token that
ce30: 20 68 6f 6c 64 73 20 74 68 65 20 6e 61 6d 65 20   holds the name 
ce40: 6f 66 20 74 68 65 20 76 69 65 77 20 2a 2f 0a 20  of the view */. 
ce50: 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32 2c 20   Token *pName2, 
ce60: 20 20 20 20 2f 2a 20 54 68 65 20 74 6f 6b 65 6e      /* The token
ce70: 20 74 68 61 74 20 68 6f 6c 64 73 20 74 68 65 20   that holds the 
ce80: 6e 61 6d 65 20 6f 66 20 74 68 65 20 76 69 65 77  name of the view
ce90: 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53   */.  Select *pS
cea0: 65 6c 65 63 74 2c 20 20 20 2f 2a 20 41 20 53 45  elect,   /* A SE
ceb0: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 74  LECT statement t
cec0: 68 61 74 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20  hat will become 
ced0: 74 68 65 20 6e 65 77 20 76 69 65 77 20 2a 2f 0a  the new view */.
cee0: 20 20 69 6e 74 20 69 73 54 65 6d 70 2c 20 20 20    int isTemp,   
cef0: 20 20 20 20 20 2f 2a 20 54 52 55 45 20 66 6f 72       /* TRUE for
cf00: 20 61 20 54 45 4d 50 4f 52 41 52 59 20 76 69 65   a TEMPORARY vie
cf10: 77 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 45 72 72  w */.  int noErr
cf20: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 75 70            /* Sup
cf30: 70 72 65 73 73 20 65 72 72 6f 72 20 6d 65 73 73  press error mess
cf40: 61 67 65 73 20 69 66 20 56 49 45 57 20 61 6c 72  ages if VIEW alr
cf50: 65 61 64 79 20 65 78 69 73 74 73 20 2a 2f 0a 29  eady exists */.)
cf60: 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20  {.  Table *p;.  
cf70: 69 6e 74 20 6e 3b 0a 20 20 63 6f 6e 73 74 20 75  int n;.  const u
cf80: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a 3b  nsigned char *z;
cf90: 0a 20 20 54 6f 6b 65 6e 20 73 45 6e 64 3b 0a 20  .  Token sEnd;. 
cfa0: 20 44 62 46 69 78 65 72 20 73 46 69 78 3b 0a 20   DbFixer sFix;. 
cfb0: 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 3b 0a 20   Token *pName;. 
cfc0: 20 69 6e 74 20 69 44 62 3b 0a 20 20 73 71 6c 69   int iDb;.  sqli
cfd0: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
cfe0: 2d 3e 64 62 3b 0a 0a 20 20 69 66 28 20 70 50 61  ->db;..  if( pPa
cff0: 72 73 65 2d 3e 6e 56 61 72 3e 30 20 29 7b 0a 20  rse->nVar>0 ){. 
d000: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
d010: 73 67 28 70 50 61 72 73 65 2c 20 22 70 61 72 61  sg(pParse, "para
d020: 6d 65 74 65 72 73 20 61 72 65 20 6e 6f 74 20 61  meters are not a
d030: 6c 6c 6f 77 65 64 20 69 6e 20 76 69 65 77 73 22  llowed in views"
d040: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65  );.    sqlite3Se
d050: 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70  lectDelete(db, p
d060: 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 72 65 74  Select);.    ret
d070: 75 72 6e 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  urn;.  }.  sqlit
d080: 65 33 53 74 61 72 74 54 61 62 6c 65 28 70 50 61  e3StartTable(pPa
d090: 72 73 65 2c 20 70 4e 61 6d 65 31 2c 20 70 4e 61  rse, pName1, pNa
d0a0: 6d 65 32 2c 20 69 73 54 65 6d 70 2c 20 31 2c 20  me2, isTemp, 1, 
d0b0: 30 2c 20 6e 6f 45 72 72 29 3b 0a 20 20 70 20 3d  0, noErr);.  p =
d0c0: 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
d0d0: 6c 65 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c  le;.  if( p==0 |
d0e0: 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29  | pParse->nErr )
d0f0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c  {.    sqlite3Sel
d100: 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70 53  ectDelete(db, pS
d110: 65 6c 65 63 74 29 3b 0a 20 20 20 20 72 65 74 75  elect);.    retu
d120: 72 6e 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  rn;.  }.  sqlite
d130: 33 54 77 6f 50 61 72 74 4e 61 6d 65 28 70 50 61  3TwoPartName(pPa
d140: 72 73 65 2c 20 70 4e 61 6d 65 31 2c 20 70 4e 61  rse, pName1, pNa
d150: 6d 65 32 2c 20 26 70 4e 61 6d 65 29 3b 0a 20 20  me2, &pName);.  
d160: 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68  iDb = sqlite3Sch
d170: 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70  emaToIndex(db, p
d180: 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 69 66  ->pSchema);.  if
d190: 28 20 73 71 6c 69 74 65 33 46 69 78 49 6e 69 74  ( sqlite3FixInit
d1a0: 28 26 73 46 69 78 2c 20 70 50 61 72 73 65 2c 20  (&sFix, pParse, 
d1b0: 69 44 62 2c 20 22 76 69 65 77 22 2c 20 70 4e 61  iDb, "view", pNa
d1c0: 6d 65 29 0a 20 20 20 20 26 26 20 73 71 6c 69 74  me).    && sqlit
d1d0: 65 33 46 69 78 53 65 6c 65 63 74 28 26 73 46 69  e3FixSelect(&sFi
d1e0: 78 2c 20 70 53 65 6c 65 63 74 29 0a 20 20 29 7b  x, pSelect).  ){
d1f0: 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65  .    sqlite3Sele
d200: 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70 53 65  ctDelete(db, pSe
d210: 6c 65 63 74 29 3b 0a 20 20 20 20 72 65 74 75 72  lect);.    retur
d220: 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b  n;.  }..  /* Mak
d230: 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20  e a copy of the 
d240: 65 6e 74 69 72 65 20 53 45 4c 45 43 54 20 73 74  entire SELECT st
d250: 61 74 65 6d 65 6e 74 20 74 68 61 74 20 64 65 66  atement that def
d260: 69 6e 65 73 20 74 68 65 20 76 69 65 77 2e 0a 20  ines the view.. 
d270: 20 2a 2a 20 54 68 69 73 20 77 69 6c 6c 20 66 6f   ** This will fo
d280: 72 63 65 20 61 6c 6c 20 74 68 65 20 45 78 70 72  rce all the Expr
d290: 2e 74 6f 6b 65 6e 2e 7a 20 76 61 6c 75 65 73 20  .token.z values 
d2a0: 74 6f 20 62 65 20 64 79 6e 61 6d 69 63 61 6c 6c  to be dynamicall
d2b0: 79 0a 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 64  y.  ** allocated
d2c0: 20 72 61 74 68 65 72 20 74 68 61 6e 20 70 6f 69   rather than poi
d2d0: 6e 74 20 74 6f 20 74 68 65 20 69 6e 70 75 74 20  nt to the input 
d2e0: 73 74 72 69 6e 67 20 2d 20 77 68 69 63 68 20 6d  string - which m
d2f0: 65 61 6e 73 20 74 68 61 74 0a 20 20 2a 2a 20 74  eans that.  ** t
d300: 68 65 79 20 77 69 6c 6c 20 70 65 72 73 69 73 74  hey will persist
d310: 20 61 66 74 65 72 20 74 68 65 20 63 75 72 72 65   after the curre
d320: 6e 74 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28  nt sqlite3_exec(
d330: 29 20 63 61 6c 6c 20 72 65 74 75 72 6e 73 2e 0a  ) call returns..
d340: 20 20 2a 2f 0a 20 20 70 2d 3e 70 53 65 6c 65 63    */.  p->pSelec
d350: 74 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63  t = sqlite3Selec
d360: 74 44 75 70 28 64 62 2c 20 70 53 65 6c 65 63 74  tDup(db, pSelect
d370: 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65  );.  sqlite3Sele
d380: 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70 53 65  ctDelete(db, pSe
d390: 6c 65 63 74 29 3b 0a 20 20 69 66 28 20 64 62 2d  lect);.  if( db-
d3a0: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
d3b0: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
d3c0: 0a 20 20 69 66 28 20 21 64 62 2d 3e 69 6e 69 74  .  if( !db->init
d3d0: 2e 62 75 73 79 20 29 7b 0a 20 20 20 20 73 71 6c  .busy ){.    sql
d3e0: 69 74 65 33 56 69 65 77 47 65 74 43 6f 6c 75 6d  ite3ViewGetColum
d3f0: 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20 70  nNames(pParse, p
d400: 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 63  );.  }..  /* Loc
d410: 61 74 65 20 74 68 65 20 65 6e 64 20 6f 66 20 74  ate the end of t
d420: 68 65 20 43 52 45 41 54 45 20 56 49 45 57 20 73  he CREATE VIEW s
d430: 74 61 74 65 6d 65 6e 74 2e 20 20 4d 61 6b 65 20  tatement.  Make 
d440: 73 45 6e 64 20 70 6f 69 6e 74 20 74 6f 0a 20 20  sEnd point to.  
d450: 2a 2a 20 74 68 65 20 65 6e 64 2e 0a 20 20 2a 2f  ** the end..  */
d460: 0a 20 20 73 45 6e 64 20 3d 20 70 50 61 72 73 65  .  sEnd = pParse
d470: 2d 3e 73 4c 61 73 74 54 6f 6b 65 6e 3b 0a 20 20  ->sLastToken;.  
d480: 69 66 28 20 73 45 6e 64 2e 7a 5b 30 5d 21 3d 30  if( sEnd.z[0]!=0
d490: 20 26 26 20 73 45 6e 64 2e 7a 5b 30 5d 21 3d 27   && sEnd.z[0]!='
d4a0: 3b 27 20 29 7b 0a 20 20 20 20 73 45 6e 64 2e 7a  ;' ){.    sEnd.z
d4b0: 20 2b 3d 20 73 45 6e 64 2e 6e 3b 0a 20 20 7d 0a   += sEnd.n;.  }.
d4c0: 20 20 73 45 6e 64 2e 6e 20 3d 20 30 3b 0a 20 20    sEnd.n = 0;.  
d4d0: 6e 20 3d 20 28 69 6e 74 29 28 73 45 6e 64 2e 7a  n = (int)(sEnd.z
d4e0: 20 2d 20 70 42 65 67 69 6e 2d 3e 7a 29 3b 0a 20   - pBegin->z);. 
d4f0: 20 7a 20 3d 20 28 63 6f 6e 73 74 20 75 6e 73 69   z = (const unsi
d500: 67 6e 65 64 20 63 68 61 72 2a 29 70 42 65 67 69  gned char*)pBegi
d510: 6e 2d 3e 7a 3b 0a 20 20 77 68 69 6c 65 28 20 6e  n->z;.  while( n
d520: 3e 30 20 26 26 20 28 7a 5b 6e 2d 31 5d 3d 3d 27  >0 && (z[n-1]=='
d530: 3b 27 20 7c 7c 20 69 73 73 70 61 63 65 28 7a 5b  ;' || isspace(z[
d540: 6e 2d 31 5d 29 29 20 29 7b 20 6e 2d 2d 3b 20 7d  n-1])) ){ n--; }
d550: 0a 20 20 73 45 6e 64 2e 7a 20 3d 20 26 7a 5b 6e  .  sEnd.z = &z[n
d560: 2d 31 5d 3b 0a 20 20 73 45 6e 64 2e 6e 20 3d 20  -1];.  sEnd.n = 
d570: 31 3b 0a 0a 20 20 2f 2a 20 55 73 65 20 73 71 6c  1;..  /* Use sql
d580: 69 74 65 33 45 6e 64 54 61 62 6c 65 28 29 20 74  ite3EndTable() t
d590: 6f 20 61 64 64 20 74 68 65 20 76 69 65 77 20 74  o add the view t
d5a0: 6f 20 74 68 65 20 53 51 4c 49 54 45 5f 4d 41 53  o the SQLITE_MAS
d5b0: 54 45 52 20 74 61 62 6c 65 20 2a 2f 0a 20 20 73  TER table */.  s
d5c0: 71 6c 69 74 65 33 45 6e 64 54 61 62 6c 65 28 70  qlite3EndTable(p
d5d0: 50 61 72 73 65 2c 20 30 2c 20 26 73 45 6e 64 2c  Parse, 0, &sEnd,
d5e0: 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d   0);.  return;.}
d5f0: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
d600: 45 5f 4f 4d 49 54 5f 56 49 45 57 20 2a 2f 0a 0a  E_OMIT_VIEW */..
d610: 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
d620: 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 7c  ITE_OMIT_VIEW) |
d630: 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  | !defined(SQLIT
d640: 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
d650: 42 4c 45 29 0a 2f 2a 0a 2a 2a 20 54 68 65 20 54  BLE)./*.** The T
d660: 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 70  able structure p
d670: 54 61 62 6c 65 20 69 73 20 72 65 61 6c 6c 79 20  Table is really 
d680: 61 20 56 49 45 57 2e 20 20 46 69 6c 6c 20 69 6e  a VIEW.  Fill in
d690: 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 0a 2a 2a   the names of.**
d6a0: 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 6f 66 20   the columns of 
d6b0: 74 68 65 20 76 69 65 77 20 69 6e 20 74 68 65 20  the view in the 
d6c0: 70 54 61 62 6c 65 20 73 74 72 75 63 74 75 72 65  pTable structure
d6d0: 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75  .  Return the nu
d6e0: 6d 62 65 72 0a 2a 2a 20 6f 66 20 65 72 72 6f 72  mber.** of error
d6f0: 73 2e 20 20 49 66 20 61 6e 20 65 72 72 6f 72 20  s.  If an error 
d700: 69 73 20 73 65 65 6e 20 6c 65 61 76 65 20 61 6e  is seen leave an
d710: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69   error message i
d720: 6e 20 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73  n pParse->zErrMs
d730: 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  g..*/.int sqlite
d740: 33 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61  3ViewGetColumnNa
d750: 6d 65 73 28 50 61 72 73 65 20 2a 70 50 61 72 73  mes(Parse *pPars
d760: 65 2c 20 54 61 62 6c 65 20 2a 70 54 61 62 6c 65  e, Table *pTable
d770: 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 53 65 6c  ){.  Table *pSel
d780: 54 61 62 3b 20 20 20 2f 2a 20 41 20 66 61 6b 65  Tab;   /* A fake
d790: 20 74 61 62 6c 65 20 66 72 6f 6d 20 77 68 69 63   table from whic
d7a0: 68 20 77 65 20 67 65 74 20 74 68 65 20 72 65 73  h we get the res
d7b0: 75 6c 74 20 73 65 74 20 2a 2f 0a 20 20 53 65 6c  ult set */.  Sel
d7c0: 65 63 74 20 2a 70 53 65 6c 3b 20 20 20 20 20 2f  ect *pSel;     /
d7d0: 2a 20 43 6f 70 79 20 6f 66 20 74 68 65 20 53 45  * Copy of the SE
d7e0: 4c 45 43 54 20 74 68 61 74 20 69 6d 70 6c 65 6d  LECT that implem
d7f0: 65 6e 74 73 20 74 68 65 20 76 69 65 77 20 2a 2f  ents the view */
d800: 0a 20 20 69 6e 74 20 6e 45 72 72 20 3d 20 30 3b  .  int nErr = 0;
d810: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
d820: 66 20 65 72 72 6f 72 73 20 65 6e 63 6f 75 6e 74  f errors encount
d830: 65 72 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 3b  ered */.  int n;
d840: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
d850: 65 6d 70 6f 72 61 72 69 6c 79 20 68 6f 6c 64 73  emporarily holds
d860: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63   the number of c
d870: 75 72 73 6f 72 73 20 61 73 73 69 67 6e 65 64 20  ursors assigned 
d880: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
d890: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20   = pParse->db;  
d8a0: 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e  /* Database conn
d8b0: 65 63 74 69 6f 6e 20 66 6f 72 20 6d 61 6c 6c 6f  ection for mallo
d8c0: 63 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20 69 6e  c errors */.  in
d8d0: 74 20 28 2a 78 41 75 74 68 29 28 76 6f 69 64 2a  t (*xAuth)(void*
d8e0: 2c 69 6e 74 2c 63 6f 6e 73 74 20 63 68 61 72 2a  ,int,const char*
d8f0: 2c 63 6f 6e 73 74 20 63 68 61 72 2a 2c 63 6f 6e  ,const char*,con
d900: 73 74 20 63 68 61 72 2a 2c 63 6f 6e 73 74 20 63  st char*,const c
d910: 68 61 72 2a 29 3b 0a 0a 20 20 61 73 73 65 72 74  har*);..  assert
d920: 28 20 70 54 61 62 6c 65 20 29 3b 0a 0a 23 69 66  ( pTable );..#if
d930: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
d940: 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20  _VIRTUALTABLE.  
d950: 69 66 28 20 73 71 6c 69 74 65 33 56 74 61 62 43  if( sqlite3VtabC
d960: 61 6c 6c 43 6f 6e 6e 65 63 74 28 70 50 61 72 73  allConnect(pPars
d970: 65 2c 20 70 54 61 62 6c 65 29 20 29 7b 0a 20 20  e, pTable) ){.  
d980: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
d990: 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28  ERROR;.  }.  if(
d9a0: 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 6c   IsVirtual(pTabl
d9b0: 65 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 23  e) ) return 0;.#
d9c0: 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53  endif..#ifndef S
d9d0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a  QLITE_OMIT_VIEW.
d9e0: 20 20 2f 2a 20 41 20 70 6f 73 69 74 69 76 65 20    /* A positive 
d9f0: 6e 43 6f 6c 20 6d 65 61 6e 73 20 74 68 65 20 63  nCol means the c
da00: 6f 6c 75 6d 6e 73 20 6e 61 6d 65 73 20 66 6f 72  olumns names for
da10: 20 74 68 69 73 20 76 69 65 77 20 61 72 65 0a 20   this view are. 
da20: 20 2a 2a 20 61 6c 72 65 61 64 79 20 6b 6e 6f 77   ** already know
da30: 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 54  n..  */.  if( pT
da40: 61 62 6c 65 2d 3e 6e 43 6f 6c 3e 30 20 29 20 72  able->nCol>0 ) r
da50: 65 74 75 72 6e 20 30 3b 0a 0a 20 20 2f 2a 20 41  eturn 0;..  /* A
da60: 20 6e 65 67 61 74 69 76 65 20 6e 43 6f 6c 20 69   negative nCol i
da70: 73 20 61 20 73 70 65 63 69 61 6c 20 6d 61 72 6b  s a special mark
da80: 65 72 20 6d 65 61 6e 69 6e 67 20 74 68 61 74 20  er meaning that 
da90: 77 65 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79  we are currently
daa0: 0a 20 20 2a 2a 20 74 72 79 69 6e 67 20 74 6f 20  .  ** trying to 
dab0: 63 6f 6d 70 75 74 65 20 74 68 65 20 63 6f 6c 75  compute the colu
dac0: 6d 6e 20 6e 61 6d 65 73 2e 20 20 49 66 20 77 65  mn names.  If we
dad0: 20 65 6e 74 65 72 20 74 68 69 73 20 72 6f 75 74   enter this rout
dae0: 69 6e 65 20 77 69 74 68 0a 20 20 2a 2a 20 61 20  ine with.  ** a 
daf0: 6e 65 67 61 74 69 76 65 20 6e 43 6f 6c 2c 20 69  negative nCol, i
db00: 74 20 6d 65 61 6e 73 20 74 77 6f 20 6f 72 20 6d  t means two or m
db10: 6f 72 65 20 76 69 65 77 73 20 66 6f 72 6d 20 61  ore views form a
db20: 20 6c 6f 6f 70 2c 20 6c 69 6b 65 20 74 68 69 73   loop, like this
db30: 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20  :.  **.  **     
db40: 43 52 45 41 54 45 20 56 49 45 57 20 6f 6e 65 20  CREATE VIEW one 
db50: 41 53 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  AS SELECT * FROM
db60: 20 74 77 6f 3b 0a 20 20 2a 2a 20 20 20 20 20 43   two;.  **     C
db70: 52 45 41 54 45 20 56 49 45 57 20 74 77 6f 20 41  REATE VIEW two A
db80: 53 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20  S SELECT * FROM 
db90: 6f 6e 65 3b 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41  one;.  **.  ** A
dba0: 63 74 75 61 6c 6c 79 2c 20 74 68 69 73 20 65 72  ctually, this er
dbb0: 72 6f 72 20 69 73 20 63 61 75 67 68 74 20 70 72  ror is caught pr
dbc0: 65 76 69 6f 75 73 6c 79 20 61 6e 64 20 73 6f 20  eviously and so 
dbd0: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 65  the following te
dbe0: 73 74 0a 20 20 2a 2a 20 73 68 6f 75 6c 64 20 61  st.  ** should a
dbf0: 6c 77 61 79 73 20 66 61 69 6c 2e 20 20 42 75 74  lways fail.  But
dc00: 20 77 65 20 77 69 6c 6c 20 6c 65 61 76 65 20 69   we will leave i
dc10: 74 20 69 6e 20 70 6c 61 63 65 20 6a 75 73 74 20  t in place just 
dc20: 74 6f 20 62 65 20 73 61 66 65 2e 0a 20 20 2a 2f  to be safe..  */
dc30: 0a 20 20 69 66 28 20 70 54 61 62 6c 65 2d 3e 6e  .  if( pTable->n
dc40: 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 73 71 6c  Col<0 ){.    sql
dc50: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
dc60: 72 73 65 2c 20 22 76 69 65 77 20 25 73 20 69 73  rse, "view %s is
dc70: 20 63 69 72 63 75 6c 61 72 6c 79 20 64 65 66 69   circularly defi
dc80: 6e 65 64 22 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e  ned", pTable->zN
dc90: 61 6d 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ame);.    return
dca0: 20 31 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74   1;.  }.  assert
dcb0: 28 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3e 3d  ( pTable->nCol>=
dcc0: 30 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 77 65  0 );..  /* If we
dcd0: 20 67 65 74 20 74 68 69 73 20 66 61 72 2c 20 69   get this far, i
dce0: 74 20 6d 65 61 6e 73 20 77 65 20 6e 65 65 64 20  t means we need 
dcf0: 74 6f 20 63 6f 6d 70 75 74 65 20 74 68 65 20 74  to compute the t
dd00: 61 62 6c 65 20 6e 61 6d 65 73 2e 0a 20 20 2a 2a  able names..  **
dd10: 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 63   Note that the c
dd20: 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 52 65  all to sqlite3Re
dd30: 73 75 6c 74 53 65 74 4f 66 53 65 6c 65 63 74 28  sultSetOfSelect(
dd40: 29 20 77 69 6c 6c 20 65 78 70 61 6e 64 20 61 6e  ) will expand an
dd50: 79 0a 20 20 2a 2a 20 22 2a 22 20 65 6c 65 6d 65  y.  ** "*" eleme
dd60: 6e 74 73 20 69 6e 20 74 68 65 20 72 65 73 75 6c  nts in the resul
dd70: 74 73 20 73 65 74 20 6f 66 20 74 68 65 20 76 69  ts set of the vi
dd80: 65 77 20 61 6e 64 20 77 69 6c 6c 20 61 73 73 69  ew and will assi
dd90: 67 6e 20 63 75 72 73 6f 72 73 0a 20 20 2a 2a 20  gn cursors.  ** 
dda0: 74 6f 20 74 68 65 20 65 6c 65 6d 65 6e 74 73 20  to the elements 
ddb0: 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  of the FROM clau
ddc0: 73 65 2e 20 20 42 75 74 20 77 65 20 64 6f 20 6e  se.  But we do n
ddd0: 6f 74 20 77 61 6e 74 20 74 68 65 73 65 20 63 68  ot want these ch
dde0: 61 6e 67 65 73 0a 20 20 2a 2a 20 74 6f 20 62 65  anges.  ** to be
ddf0: 20 70 65 72 6d 61 6e 65 6e 74 2e 20 20 53 6f 20   permanent.  So 
de00: 74 68 65 20 63 6f 6d 70 75 74 61 74 69 6f 6e 20  the computation 
de10: 69 73 20 64 6f 6e 65 20 6f 6e 20 61 20 63 6f 70  is done on a cop
de20: 79 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 0a  y of the SELECT.
de30: 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 74    ** statement t
de40: 68 61 74 20 64 65 66 69 6e 65 73 20 74 68 65 20  hat defines the 
de50: 76 69 65 77 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  view..  */.  ass
de60: 65 72 74 28 20 70 54 61 62 6c 65 2d 3e 70 53 65  ert( pTable->pSe
de70: 6c 65 63 74 20 29 3b 0a 20 20 70 53 65 6c 20 3d  lect );.  pSel =
de80: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75   sqlite3SelectDu
de90: 70 28 64 62 2c 20 70 54 61 62 6c 65 2d 3e 70 53  p(db, pTable->pS
dea0: 65 6c 65 63 74 29 3b 0a 20 20 69 66 28 20 70 53  elect);.  if( pS
deb0: 65 6c 20 29 7b 0a 20 20 20 20 6e 20 3d 20 70 50  el ){.    n = pP
dec0: 61 72 73 65 2d 3e 6e 54 61 62 3b 0a 20 20 20 20  arse->nTab;.    
ded0: 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 73  sqlite3SrcListAs
dee0: 73 69 67 6e 43 75 72 73 6f 72 73 28 70 50 61 72  signCursors(pPar
def0: 73 65 2c 20 70 53 65 6c 2d 3e 70 53 72 63 29 3b  se, pSel->pSrc);
df00: 0a 20 20 20 20 70 54 61 62 6c 65 2d 3e 6e 43 6f  .    pTable->nCo
df10: 6c 20 3d 20 2d 31 3b 0a 23 69 66 6e 64 65 66 20  l = -1;.#ifndef 
df20: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48  SQLITE_OMIT_AUTH
df30: 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 20 20 78 41  ORIZATION.    xA
df40: 75 74 68 20 3d 20 64 62 2d 3e 78 41 75 74 68 3b  uth = db->xAuth;
df50: 0a 20 20 20 20 64 62 2d 3e 78 41 75 74 68 20 3d  .    db->xAuth =
df60: 20 30 3b 0a 20 20 20 20 70 53 65 6c 54 61 62 20   0;.    pSelTab 
df70: 3d 20 73 71 6c 69 74 65 33 52 65 73 75 6c 74 53  = sqlite3ResultS
df80: 65 74 4f 66 53 65 6c 65 63 74 28 70 50 61 72 73  etOfSelect(pPars
df90: 65 2c 20 70 53 65 6c 29 3b 0a 20 20 20 20 64 62  e, pSel);.    db
dfa0: 2d 3e 78 41 75 74 68 20 3d 20 78 41 75 74 68 3b  ->xAuth = xAuth;
dfb0: 0a 23 65 6c 73 65 0a 20 20 20 20 70 53 65 6c 54  .#else.    pSelT
dfc0: 61 62 20 3d 20 73 71 6c 69 74 65 33 52 65 73 75  ab = sqlite3Resu
dfd0: 6c 74 53 65 74 4f 66 53 65 6c 65 63 74 28 70 50  ltSetOfSelect(pP
dfe0: 61 72 73 65 2c 20 70 53 65 6c 29 3b 0a 23 65 6e  arse, pSel);.#en
dff0: 64 69 66 0a 20 20 20 20 70 50 61 72 73 65 2d 3e  dif.    pParse->
e000: 6e 54 61 62 20 3d 20 6e 3b 0a 20 20 20 20 69 66  nTab = n;.    if
e010: 28 20 70 53 65 6c 54 61 62 20 29 7b 0a 20 20 20  ( pSelTab ){.   
e020: 20 20 20 61 73 73 65 72 74 28 20 70 54 61 62 6c     assert( pTabl
e030: 65 2d 3e 61 43 6f 6c 3d 3d 30 20 29 3b 0a 20 20  e->aCol==0 );.  
e040: 20 20 20 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c      pTable->nCol
e050: 20 3d 20 70 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c   = pSelTab->nCol
e060: 3b 0a 20 20 20 20 20 20 70 54 61 62 6c 65 2d 3e  ;.      pTable->
e070: 61 43 6f 6c 20 3d 20 70 53 65 6c 54 61 62 2d 3e  aCol = pSelTab->
e080: 61 43 6f 6c 3b 0a 20 20 20 20 20 20 70 53 65 6c  aCol;.      pSel
e090: 54 61 62 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20  Tab->nCol = 0;. 
e0a0: 20 20 20 20 20 70 53 65 6c 54 61 62 2d 3e 61 43       pSelTab->aC
e0b0: 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 71  ol = 0;.      sq
e0c0: 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62 6c 65  lite3DeleteTable
e0d0: 28 70 53 65 6c 54 61 62 29 3b 0a 20 20 20 20 20  (pSelTab);.     
e0e0: 20 70 54 61 62 6c 65 2d 3e 70 53 63 68 65 6d 61   pTable->pSchema
e0f0: 2d 3e 66 6c 61 67 73 20 7c 3d 20 44 42 5f 55 6e  ->flags |= DB_Un
e100: 72 65 73 65 74 56 69 65 77 73 3b 0a 20 20 20 20  resetViews;.    
e110: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 54 61  }else{.      pTa
e120: 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20  ble->nCol = 0;. 
e130: 20 20 20 20 20 6e 45 72 72 2b 2b 3b 0a 20 20 20       nErr++;.   
e140: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65   }.    sqlite3Se
e150: 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70  lectDelete(db, p
e160: 53 65 6c 29 3b 0a 20 20 7d 20 65 6c 73 65 20 7b  Sel);.  } else {
e170: 0a 20 20 20 20 6e 45 72 72 2b 2b 3b 0a 20 20 7d  .    nErr++;.  }
e180: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
e190: 45 5f 4f 4d 49 54 5f 56 49 45 57 20 2a 2f 0a 20  E_OMIT_VIEW */. 
e1a0: 20 72 65 74 75 72 6e 20 6e 45 72 72 3b 20 20 0a   return nErr;  .
e1b0: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66  }.#endif /* !def
e1c0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
e1d0: 5f 56 49 45 57 29 20 7c 7c 20 21 64 65 66 69 6e  _VIEW) || !defin
e1e0: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ed(SQLITE_OMIT_V
e1f0: 49 52 54 55 41 4c 54 41 42 4c 45 29 20 2a 2f 0a  IRTUALTABLE) */.
e200: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
e210: 4f 4d 49 54 5f 56 49 45 57 0a 2f 2a 0a 2a 2a 20  OMIT_VIEW./*.** 
e220: 43 6c 65 61 72 20 74 68 65 20 63 6f 6c 75 6d 6e  Clear the column
e230: 20 6e 61 6d 65 73 20 66 72 6f 6d 20 65 76 65 72   names from ever
e240: 79 20 56 49 45 57 20 69 6e 20 64 61 74 61 62 61  y VIEW in databa
e250: 73 65 20 69 64 78 2e 0a 2a 2f 0a 73 74 61 74 69  se idx..*/.stati
e260: 63 20 76 6f 69 64 20 73 71 6c 69 74 65 56 69 65  c void sqliteVie
e270: 77 52 65 73 65 74 41 6c 6c 28 73 71 6c 69 74 65  wResetAll(sqlite
e280: 33 20 2a 64 62 2c 20 69 6e 74 20 69 64 78 29 7b  3 *db, int idx){
e290: 0a 20 20 48 61 73 68 45 6c 65 6d 20 2a 69 3b 0a  .  HashElem *i;.
e2a0: 20 20 69 66 28 20 21 44 62 48 61 73 50 72 6f 70    if( !DbHasProp
e2b0: 65 72 74 79 28 64 62 2c 20 69 64 78 2c 20 44 42  erty(db, idx, DB
e2c0: 5f 55 6e 72 65 73 65 74 56 69 65 77 73 29 20 29  _UnresetViews) )
e2d0: 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69   return;.  for(i
e2e0: 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72 73 74  =sqliteHashFirst
e2f0: 28 26 64 62 2d 3e 61 44 62 5b 69 64 78 5d 2e 70  (&db->aDb[idx].p
e300: 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68 29  Schema->tblHash)
e310: 3b 20 69 3b 69 3d 73 71 6c 69 74 65 48 61 73 68  ; i;i=sqliteHash
e320: 4e 65 78 74 28 69 29 29 7b 0a 20 20 20 20 54 61  Next(i)){.    Ta
e330: 62 6c 65 20 2a 70 54 61 62 20 3d 20 73 71 6c 69  ble *pTab = sqli
e340: 74 65 48 61 73 68 44 61 74 61 28 69 29 3b 0a 20  teHashData(i);. 
e350: 20 20 20 69 66 28 20 70 54 61 62 2d 3e 70 53 65     if( pTab->pSe
e360: 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 73 71  lect ){.      sq
e370: 6c 69 74 65 52 65 73 65 74 43 6f 6c 75 6d 6e 4e  liteResetColumnN
e380: 61 6d 65 73 28 70 54 61 62 29 3b 0a 20 20 20 20  ames(pTab);.    
e390: 7d 0a 20 20 7d 0a 20 20 44 62 43 6c 65 61 72 50  }.  }.  DbClearP
e3a0: 72 6f 70 65 72 74 79 28 64 62 2c 20 69 64 78 2c  roperty(db, idx,
e3b0: 20 44 42 5f 55 6e 72 65 73 65 74 56 69 65 77 73   DB_UnresetViews
e3c0: 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66  );.}.#else.# def
e3d0: 69 6e 65 20 73 71 6c 69 74 65 56 69 65 77 52 65  ine sqliteViewRe
e3e0: 73 65 74 41 6c 6c 28 41 2c 42 29 0a 23 65 6e 64  setAll(A,B).#end
e3f0: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
e400: 54 5f 56 49 45 57 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  T_VIEW */../*.**
e410: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
e420: 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20  s called by the 
e430: 56 44 42 45 20 74 6f 20 61 64 6a 75 73 74 20 74  VDBE to adjust t
e440: 68 65 20 69 6e 74 65 72 6e 61 6c 20 73 63 68 65  he internal sche
e450: 6d 61 0a 2a 2a 20 75 73 65 64 20 62 79 20 53 51  ma.** used by SQ
e460: 4c 69 74 65 20 77 68 65 6e 20 74 68 65 20 62 74  Lite when the bt
e470: 72 65 65 20 6c 61 79 65 72 20 6d 6f 76 65 73 20  ree layer moves 
e480: 61 20 74 61 62 6c 65 20 72 6f 6f 74 20 70 61 67  a table root pag
e490: 65 2e 20 54 68 65 0a 2a 2a 20 72 6f 6f 74 2d 70  e. The.** root-p
e4a0: 61 67 65 20 6f 66 20 61 20 74 61 62 6c 65 20 6f  age of a table o
e4b0: 72 20 69 6e 64 65 78 20 69 6e 20 64 61 74 61 62  r index in datab
e4c0: 61 73 65 20 69 44 62 20 68 61 73 20 63 68 61 6e  ase iDb has chan
e4d0: 67 65 64 20 66 72 6f 6d 20 69 46 72 6f 6d 0a 2a  ged from iFrom.*
e4e0: 2a 20 74 6f 20 69 54 6f 2e 0a 2a 2a 0a 2a 2a 20  * to iTo..**.** 
e4f0: 54 69 63 6b 65 74 20 23 31 37 32 38 3a 20 20 54  Ticket #1728:  T
e500: 68 65 20 73 79 6d 62 6f 6c 20 74 61 62 6c 65 20  he symbol table 
e510: 6d 69 67 68 74 20 73 74 69 6c 6c 20 63 6f 6e 74  might still cont
e520: 61 69 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a  ain information.
e530: 2a 2a 20 6f 6e 20 74 61 62 6c 65 73 20 61 6e 64  ** on tables and
e540: 2f 6f 72 20 69 6e 64 69 63 65 73 20 74 68 61 74  /or indices that
e550: 20 61 72 65 20 74 68 65 20 70 72 6f 63 65 73 73   are the process
e560: 20 6f 66 20 62 65 69 6e 67 20 64 65 6c 65 74 65   of being delete
e570: 64 2e 0a 2a 2a 20 49 66 20 79 6f 75 20 61 72 65  d..** If you are
e580: 20 75 6e 6c 75 63 6b 79 2c 20 6f 6e 65 20 6f 66   unlucky, one of
e590: 20 74 68 6f 73 65 20 64 65 6c 65 74 65 64 20 69   those deleted i
e5a0: 6e 64 69 63 65 73 20 6f 72 20 74 61 62 6c 65 73  ndices or tables
e5b0: 20 6d 69 67 68 74 0a 2a 2a 20 68 61 76 65 20 74   might.** have t
e5c0: 68 65 20 73 61 6d 65 20 72 6f 6f 74 70 61 67 65  he same rootpage
e5d0: 20 6e 75 6d 62 65 72 20 61 73 20 74 68 65 20 72   number as the r
e5e0: 65 61 6c 20 74 61 62 6c 65 20 6f 72 20 69 6e 64  eal table or ind
e5f0: 65 78 20 74 68 61 74 20 69 73 0a 2a 2a 20 62 65  ex that is.** be
e600: 69 6e 67 20 6d 6f 76 65 64 2e 20 20 53 6f 20 77  ing moved.  So w
e610: 65 20 63 61 6e 6e 6f 74 20 73 74 6f 70 20 73 65  e cannot stop se
e620: 61 72 63 68 69 6e 67 20 61 66 74 65 72 20 74 68  arching after th
e630: 65 20 66 69 72 73 74 20 6d 61 74 63 68 20 0a 2a  e first match .*
e640: 2a 20 62 65 63 61 75 73 65 20 74 68 65 20 66 69  * because the fi
e650: 72 73 74 20 6d 61 74 63 68 20 6d 69 67 68 74 20  rst match might 
e660: 62 65 20 66 6f 72 20 6f 6e 65 20 6f 66 20 74 68  be for one of th
e670: 65 20 64 65 6c 65 74 65 64 20 69 6e 64 69 63 65  e deleted indice
e680: 73 0a 2a 2a 20 6f 72 20 74 61 62 6c 65 73 20 61  s.** or tables a
e690: 6e 64 20 6e 6f 74 20 74 68 65 20 74 61 62 6c 65  nd not the table
e6a0: 2f 69 6e 64 65 78 20 74 68 61 74 20 69 73 20 61  /index that is a
e6b0: 63 74 75 61 6c 6c 79 20 62 65 69 6e 67 20 6d 6f  ctually being mo
e6c0: 76 65 64 2e 0a 2a 2a 20 57 65 20 6d 75 73 74 20  ved..** We must 
e6d0: 63 6f 6e 74 69 6e 75 65 20 6c 6f 6f 70 69 6e 67  continue looping
e6e0: 20 75 6e 74 69 6c 20 61 6c 6c 20 74 61 62 6c 65   until all table
e6f0: 73 20 61 6e 64 20 69 6e 64 69 63 65 73 20 77 69  s and indices wi
e700: 74 68 0a 2a 2a 20 72 6f 6f 74 70 61 67 65 3d 3d  th.** rootpage==
e710: 69 46 72 6f 6d 20 68 61 76 65 20 62 65 65 6e 20  iFrom have been 
e720: 63 6f 6e 76 65 72 74 65 64 20 74 6f 20 68 61 76  converted to hav
e730: 65 20 61 20 72 6f 6f 74 70 61 67 65 20 6f 66 20  e a rootpage of 
e740: 69 54 6f 0a 2a 2a 20 69 6e 20 6f 72 64 65 72 20  iTo.** in order 
e750: 74 6f 20 62 65 20 63 65 72 74 61 69 6e 20 74 68  to be certain th
e760: 61 74 20 77 65 20 67 6f 74 20 74 68 65 20 72 69  at we got the ri
e770: 67 68 74 20 6f 6e 65 2e 0a 2a 2f 0a 23 69 66 6e  ght one..*/.#ifn
e780: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
e790: 41 55 54 4f 56 41 43 55 55 4d 0a 76 6f 69 64 20  AUTOVACUUM.void 
e7a0: 73 71 6c 69 74 65 33 52 6f 6f 74 50 61 67 65 4d  sqlite3RootPageM
e7b0: 6f 76 65 64 28 44 62 20 2a 70 44 62 2c 20 69 6e  oved(Db *pDb, in
e7c0: 74 20 69 46 72 6f 6d 2c 20 69 6e 74 20 69 54 6f  t iFrom, int iTo
e7d0: 29 7b 0a 20 20 48 61 73 68 45 6c 65 6d 20 2a 70  ){.  HashElem *p
e7e0: 45 6c 65 6d 3b 0a 20 20 48 61 73 68 20 2a 70 48  Elem;.  Hash *pH
e7f0: 61 73 68 3b 0a 0a 20 20 70 48 61 73 68 20 3d 20  ash;..  pHash = 
e800: 26 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 74  &pDb->pSchema->t
e810: 62 6c 48 61 73 68 3b 0a 20 20 66 6f 72 28 70 45  blHash;.  for(pE
e820: 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73 68 46 69  lem=sqliteHashFi
e830: 72 73 74 28 70 48 61 73 68 29 3b 20 70 45 6c 65  rst(pHash); pEle
e840: 6d 3b 20 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48  m; pElem=sqliteH
e850: 61 73 68 4e 65 78 74 28 70 45 6c 65 6d 29 29 7b  ashNext(pElem)){
e860: 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62  .    Table *pTab
e870: 20 3d 20 73 71 6c 69 74 65 48 61 73 68 44 61 74   = sqliteHashDat
e880: 61 28 70 45 6c 65 6d 29 3b 0a 20 20 20 20 69 66  a(pElem);.    if
e890: 28 20 70 54 61 62 2d 3e 74 6e 75 6d 3d 3d 69 46  ( pTab->tnum==iF
e8a0: 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20 70 54 61  rom ){.      pTa
e8b0: 62 2d 3e 74 6e 75 6d 20 3d 20 69 54 6f 3b 0a 20  b->tnum = iTo;. 
e8c0: 20 20 20 7d 0a 20 20 7d 0a 20 20 70 48 61 73 68     }.  }.  pHash
e8d0: 20 3d 20 26 70 44 62 2d 3e 70 53 63 68 65 6d 61   = &pDb->pSchema
e8e0: 2d 3e 69 64 78 48 61 73 68 3b 0a 20 20 66 6f 72  ->idxHash;.  for
e8f0: 28 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73  (pElem=sqliteHas
e900: 68 46 69 72 73 74 28 70 48 61 73 68 29 3b 20 70  hFirst(pHash); p
e910: 45 6c 65 6d 3b 20 70 45 6c 65 6d 3d 73 71 6c 69  Elem; pElem=sqli
e920: 74 65 48 61 73 68 4e 65 78 74 28 70 45 6c 65 6d  teHashNext(pElem
e930: 29 29 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70  )){.    Index *p
e940: 49 64 78 20 3d 20 73 71 6c 69 74 65 48 61 73 68  Idx = sqliteHash
e950: 44 61 74 61 28 70 45 6c 65 6d 29 3b 0a 20 20 20  Data(pElem);.   
e960: 20 69 66 28 20 70 49 64 78 2d 3e 74 6e 75 6d 3d   if( pIdx->tnum=
e970: 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20  =iFrom ){.      
e980: 70 49 64 78 2d 3e 74 6e 75 6d 20 3d 20 69 54 6f  pIdx->tnum = iTo
e990: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65  ;.    }.  }.}.#e
e9a0: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74  ndif../*.** Writ
e9b0: 65 20 63 6f 64 65 20 74 6f 20 65 72 61 73 65 20  e code to erase 
e9c0: 74 68 65 20 74 61 62 6c 65 20 77 69 74 68 20 72  the table with r
e9d0: 6f 6f 74 2d 70 61 67 65 20 69 54 61 62 6c 65 20  oot-page iTable 
e9e0: 66 72 6f 6d 20 64 61 74 61 62 61 73 65 20 69 44  from database iD
e9f0: 62 2e 0a 2a 2a 20 41 6c 73 6f 20 77 72 69 74 65  b..** Also write
ea00: 20 63 6f 64 65 20 74 6f 20 6d 6f 64 69 66 79 20   code to modify 
ea10: 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  the sqlite_maste
ea20: 72 20 74 61 62 6c 65 20 61 6e 64 20 69 6e 74 65  r table and inte
ea30: 72 6e 61 6c 20 73 63 68 65 6d 61 0a 2a 2a 20 69  rnal schema.** i
ea40: 66 20 61 20 72 6f 6f 74 2d 70 61 67 65 20 6f 66  f a root-page of
ea50: 20 61 6e 6f 74 68 65 72 20 74 61 62 6c 65 20 69   another table i
ea60: 73 20 6d 6f 76 65 64 20 62 79 20 74 68 65 20 62  s moved by the b
ea70: 74 72 65 65 2d 6c 61 79 65 72 20 77 68 69 6c 73  tree-layer whils
ea80: 74 0a 2a 2a 20 65 72 61 73 69 6e 67 20 69 54 61  t.** erasing iTa
ea90: 62 6c 65 20 28 74 68 69 73 20 63 61 6e 20 68 61  ble (this can ha
eaa0: 70 70 65 6e 20 77 69 74 68 20 61 6e 20 61 75 74  ppen with an aut
eab0: 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61 73  o-vacuum databas
eac0: 65 29 2e 0a 2a 2f 20 0a 73 74 61 74 69 63 20 76  e)..*/ .static v
ead0: 6f 69 64 20 64 65 73 74 72 6f 79 52 6f 6f 74 50  oid destroyRootP
eae0: 61 67 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  age(Parse *pPars
eaf0: 65 2c 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 69  e, int iTable, i
eb00: 6e 74 20 69 44 62 29 7b 0a 20 20 56 64 62 65 20  nt iDb){.  Vdbe 
eb10: 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56  *v = sqlite3GetV
eb20: 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69  dbe(pParse);.  i
eb30: 6e 74 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47  nt r1 = sqlite3G
eb40: 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
eb50: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
eb60: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 44 65 73  AddOp3(v, OP_Des
eb70: 74 72 6f 79 2c 20 69 54 61 62 6c 65 2c 20 72 31  troy, iTable, r1
eb80: 2c 20 69 44 62 29 3b 0a 23 69 66 6e 64 65 66 20  , iDb);.#ifndef 
eb90: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
eba0: 56 41 43 55 55 4d 0a 20 20 2f 2a 20 4f 50 5f 44  VACUUM.  /* OP_D
ebb0: 65 73 74 72 6f 79 20 73 74 6f 72 65 73 20 61 6e  estroy stores an
ebc0: 20 69 6e 20 69 6e 74 65 67 65 72 20 72 31 2e 20   in integer r1. 
ebd0: 49 66 20 74 68 69 73 20 69 6e 74 65 67 65 72 0a  If this integer.
ebe0: 20 20 2a 2a 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f    ** is non-zero
ebf0: 2c 20 74 68 65 6e 20 69 74 20 69 73 20 74 68 65  , then it is the
ec00: 20 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62 65   root page numbe
ec10: 72 20 6f 66 20 61 20 74 61 62 6c 65 20 6d 6f 76  r of a table mov
ec20: 65 64 20 74 6f 0a 20 20 2a 2a 20 6c 6f 63 61 74  ed to.  ** locat
ec30: 69 6f 6e 20 69 54 61 62 6c 65 2e 20 54 68 65 20  ion iTable. The 
ec40: 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 64 65 20 6d  following code m
ec50: 6f 64 69 66 69 65 73 20 74 68 65 20 73 71 6c 69  odifies the sqli
ec60: 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20  te_master table 
ec70: 74 6f 0a 20 20 2a 2a 20 72 65 66 6c 65 63 74 20  to.  ** reflect 
ec80: 74 68 69 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  this..  **.  ** 
ec90: 54 68 65 20 22 23 25 64 22 20 69 6e 20 74 68 65  The "#%d" in the
eca0: 20 53 51 4c 20 69 73 20 61 20 73 70 65 63 69 61   SQL is a specia
ecb0: 6c 20 63 6f 6e 73 74 61 6e 74 20 74 68 61 74 20  l constant that 
ecc0: 6d 65 61 6e 73 20 77 68 61 74 65 76 65 72 20 76  means whatever v
ecd0: 61 6c 75 65 0a 20 20 2a 2a 20 69 73 20 6f 6e 20  alue.  ** is on 
ece0: 74 68 65 20 74 6f 70 20 6f 66 20 74 68 65 20 73  the top of the s
ecf0: 74 61 63 6b 2e 20 20 53 65 65 20 73 71 6c 69 74  tack.  See sqlit
ed00: 65 33 52 65 67 69 73 74 65 72 45 78 70 72 28 29  e3RegisterExpr()
ed10: 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ..  */.  sqlite3
ed20: 4e 65 73 74 65 64 50 61 72 73 65 28 70 50 61 72  NestedParse(pPar
ed30: 73 65 2c 20 0a 20 20 20 20 20 22 55 50 44 41 54  se, .     "UPDAT
ed40: 45 20 25 51 2e 25 73 20 53 45 54 20 72 6f 6f 74  E %Q.%s SET root
ed50: 70 61 67 65 3d 25 64 20 57 48 45 52 45 20 23 25  page=%d WHERE #%
ed60: 64 20 41 4e 44 20 72 6f 6f 74 70 61 67 65 3d 23  d AND rootpage=#
ed70: 25 64 22 2c 0a 20 20 20 20 20 70 50 61 72 73 65  %d",.     pParse
ed80: 2d 3e 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a  ->db->aDb[iDb].z
ed90: 4e 61 6d 65 2c 20 53 43 48 45 4d 41 5f 54 41 42  Name, SCHEMA_TAB
eda0: 4c 45 28 69 44 62 29 2c 20 69 54 61 62 6c 65 2c  LE(iDb), iTable,
edb0: 20 72 31 2c 20 72 31 29 3b 0a 23 65 6e 64 69 66   r1, r1);.#endif
edc0: 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73  .  sqlite3Releas
edd0: 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
ede0: 20 72 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57   r1);.}../*.** W
edf0: 72 69 74 65 20 56 44 42 45 20 63 6f 64 65 20 74  rite VDBE code t
ee00: 6f 20 65 72 61 73 65 20 74 61 62 6c 65 20 70 54  o erase table pT
ee10: 61 62 20 61 6e 64 20 61 6c 6c 20 61 73 73 6f 63  ab and all assoc
ee20: 69 61 74 65 64 20 69 6e 64 69 63 65 73 20 6f 6e  iated indices on
ee30: 20 64 69 73 6b 2e 0a 2a 2a 20 43 6f 64 65 20 74   disk..** Code t
ee40: 6f 20 75 70 64 61 74 65 20 74 68 65 20 73 71 6c  o update the sql
ee50: 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65  ite_master table
ee60: 73 20 61 6e 64 20 69 6e 74 65 72 6e 61 6c 20 73  s and internal s
ee70: 63 68 65 6d 61 20 64 65 66 69 6e 69 74 69 6f 6e  chema definition
ee80: 73 0a 2a 2a 20 69 6e 20 63 61 73 65 20 61 20 72  s.** in case a r
ee90: 6f 6f 74 2d 70 61 67 65 20 62 65 6c 6f 6e 67 69  oot-page belongi
eea0: 6e 67 20 74 6f 20 61 6e 6f 74 68 65 72 20 74 61  ng to another ta
eeb0: 62 6c 65 20 69 73 20 6d 6f 76 65 64 20 62 79 20  ble is moved by 
eec0: 74 68 65 20 62 74 72 65 65 20 6c 61 79 65 72 0a  the btree layer.
eed0: 2a 2a 20 69 73 20 61 6c 73 6f 20 61 64 64 65 64  ** is also added
eee0: 20 28 74 68 69 73 20 63 61 6e 20 68 61 70 70 65   (this can happe
eef0: 6e 20 77 69 74 68 20 61 6e 20 61 75 74 6f 2d 76  n with an auto-v
ef00: 61 63 75 75 6d 20 64 61 74 61 62 61 73 65 29 2e  acuum database).
ef10: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
ef20: 64 65 73 74 72 6f 79 54 61 62 6c 65 28 50 61 72  destroyTable(Par
ef30: 73 65 20 2a 70 50 61 72 73 65 2c 20 54 61 62 6c  se *pParse, Tabl
ef40: 65 20 2a 70 54 61 62 29 7b 0a 23 69 66 64 65 66  e *pTab){.#ifdef
ef50: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
ef60: 4f 56 41 43 55 55 4d 0a 20 20 49 6e 64 65 78 20  OVACUUM.  Index 
ef70: 2a 70 49 64 78 3b 0a 20 20 69 6e 74 20 69 44 62  *pIdx;.  int iDb
ef80: 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61   = sqlite3Schema
ef90: 54 6f 49 6e 64 65 78 28 70 50 61 72 73 65 2d 3e  ToIndex(pParse->
efa0: 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d  db, pTab->pSchem
efb0: 61 29 3b 0a 20 20 64 65 73 74 72 6f 79 52 6f 6f  a);.  destroyRoo
efc0: 74 50 61 67 65 28 70 50 61 72 73 65 2c 20 70 54  tPage(pParse, pT
efd0: 61 62 2d 3e 74 6e 75 6d 2c 20 69 44 62 29 3b 0a  ab->tnum, iDb);.
efe0: 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d    for(pIdx=pTab-
eff0: 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70  >pIndex; pIdx; p
f000: 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29  Idx=pIdx->pNext)
f010: 7b 0a 20 20 20 20 64 65 73 74 72 6f 79 52 6f 6f  {.    destroyRoo
f020: 74 50 61 67 65 28 70 50 61 72 73 65 2c 20 70 49  tPage(pParse, pI
f030: 64 78 2d 3e 74 6e 75 6d 2c 20 69 44 62 29 3b 0a  dx->tnum, iDb);.
f040: 20 20 7d 0a 23 65 6c 73 65 0a 20 20 2f 2a 20 49    }.#else.  /* I
f050: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6d  f the database m
f060: 61 79 20 62 65 20 61 75 74 6f 2d 76 61 63 75 75  ay be auto-vacuu
f070: 6d 20 63 61 70 61 62 6c 65 20 28 69 66 20 53 51  m capable (if SQ
f080: 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
f090: 43 55 55 4d 0a 20 20 2a 2a 20 69 73 20 6e 6f 74  CUUM.  ** is not
f0a0: 20 64 65 66 69 6e 65 64 29 2c 20 74 68 65 6e 20   defined), then 
f0b0: 69 74 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20  it is important 
f0c0: 74 6f 20 63 61 6c 6c 20 4f 50 5f 44 65 73 74 72  to call OP_Destr
f0d0: 6f 79 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 74  oy on the.  ** t
f0e0: 61 62 6c 65 20 61 6e 64 20 69 6e 64 65 78 20 72  able and index r
f0f0: 6f 6f 74 2d 70 61 67 65 73 20 69 6e 20 6f 72 64  oot-pages in ord
f100: 65 72 2c 20 73 74 61 72 74 69 6e 67 20 77 69 74  er, starting wit
f110: 68 20 74 68 65 20 6e 75 6d 65 72 69 63 61 6c 6c  h the numericall
f120: 79 20 0a 20 20 2a 2a 20 6c 61 72 67 65 73 74 20  y .  ** largest 
f130: 72 6f 6f 74 2d 70 61 67 65 20 6e 75 6d 62 65 72  root-page number
f140: 2e 20 54 68 69 73 20 67 75 61 72 61 6e 74 65 65  . This guarantee
f150: 73 20 74 68 61 74 20 6e 6f 6e 65 20 6f 66 20 74  s that none of t
f160: 68 65 20 72 6f 6f 74 2d 70 61 67 65 73 0a 20 20  he root-pages.  
f170: 2a 2a 20 74 6f 20 62 65 20 64 65 73 74 72 6f 79  ** to be destroy
f180: 65 64 20 69 73 20 72 65 6c 6f 63 61 74 65 64 20  ed is relocated 
f190: 62 79 20 61 6e 20 65 61 72 6c 69 65 72 20 4f 50  by an earlier OP
f1a0: 5f 44 65 73 74 72 6f 79 2e 20 69 2e 65 2e 20 69  _Destroy. i.e. i
f1b0: 66 20 74 68 65 0a 20 20 2a 2a 20 66 6f 6c 6c 6f  f the.  ** follo
f1c0: 77 69 6e 67 20 77 65 72 65 20 63 6f 64 65 64 3a  wing were coded:
f1d0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4f 50 5f 44 65  .  **.  ** OP_De
f1e0: 73 74 72 6f 79 20 34 20 30 0a 20 20 2a 2a 20 2e  stroy 4 0.  ** .
f1f0: 2e 2e 0a 20 20 2a 2a 20 4f 50 5f 44 65 73 74 72  ...  ** OP_Destr
f200: 6f 79 20 35 20 30 0a 20 20 2a 2a 0a 20 20 2a 2a  oy 5 0.  **.  **
f210: 20 61 6e 64 20 72 6f 6f 74 20 70 61 67 65 20 35   and root page 5
f220: 20 68 61 70 70 65 6e 65 64 20 74 6f 20 62 65 20   happened to be 
f230: 74 68 65 20 6c 61 72 67 65 73 74 20 72 6f 6f 74  the largest root
f240: 2d 70 61 67 65 20 6e 75 6d 62 65 72 20 69 6e 20  -page number in 
f250: 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73  the.  ** databas
f260: 65 2c 20 74 68 65 6e 20 72 6f 6f 74 20 70 61 67  e, then root pag
f270: 65 20 35 20 77 6f 75 6c 64 20 62 65 20 6d 6f 76  e 5 would be mov
f280: 65 64 20 74 6f 20 70 61 67 65 20 34 20 62 79 20  ed to page 4 by 
f290: 74 68 65 20 0a 20 20 2a 2a 20 22 4f 50 5f 44 65  the .  ** "OP_De
f2a0: 73 74 72 6f 79 20 34 20 30 22 20 6f 70 63 6f 64  stroy 4 0" opcod
f2b0: 65 2e 20 54 68 65 20 73 75 62 73 65 71 75 65 6e  e. The subsequen
f2c0: 74 20 22 4f 50 5f 44 65 73 74 72 6f 79 20 35 20  t "OP_Destroy 5 
f2d0: 30 22 20 77 6f 75 6c 64 20 68 69 74 0a 20 20 2a  0" would hit.  *
f2e0: 2a 20 61 20 66 72 65 65 2d 6c 69 73 74 20 70 61  * a free-list pa
f2f0: 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 6e 74 20 69  ge..  */.  int i
f300: 54 61 62 20 3d 20 70 54 61 62 2d 3e 74 6e 75 6d  Tab = pTab->tnum
f310: 3b 0a 20 20 69 6e 74 20 69 44 65 73 74 72 6f 79  ;.  int iDestroy
f320: 65 64 20 3d 20 30 3b 0a 0a 20 20 77 68 69 6c 65  ed = 0;..  while
f330: 28 20 31 20 29 7b 0a 20 20 20 20 49 6e 64 65 78  ( 1 ){.    Index
f340: 20 2a 70 49 64 78 3b 0a 20 20 20 20 69 6e 74 20   *pIdx;.    int 
f350: 69 4c 61 72 67 65 73 74 20 3d 20 30 3b 0a 0a 20  iLargest = 0;.. 
f360: 20 20 20 69 66 28 20 69 44 65 73 74 72 6f 79 65     if( iDestroye
f370: 64 3d 3d 30 20 7c 7c 20 69 54 61 62 3c 69 44 65  d==0 || iTab<iDe
f380: 73 74 72 6f 79 65 64 20 29 7b 0a 20 20 20 20 20  stroyed ){.     
f390: 20 69 4c 61 72 67 65 73 74 20 3d 20 69 54 61 62   iLargest = iTab
f3a0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28  ;.    }.    for(
f3b0: 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65  pIdx=pTab->pInde
f3c0: 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49  x; pIdx; pIdx=pI
f3d0: 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  dx->pNext){.    
f3e0: 20 20 69 6e 74 20 69 49 64 78 20 3d 20 70 49 64    int iIdx = pId
f3f0: 78 2d 3e 74 6e 75 6d 3b 0a 20 20 20 20 20 20 61  x->tnum;.      a
f400: 73 73 65 72 74 28 20 70 49 64 78 2d 3e 70 53 63  ssert( pIdx->pSc
f410: 68 65 6d 61 3d 3d 70 54 61 62 2d 3e 70 53 63 68  hema==pTab->pSch
f420: 65 6d 61 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ema );.      if(
f430: 20 28 69 44 65 73 74 72 6f 79 65 64 3d 3d 30 20   (iDestroyed==0 
f440: 7c 7c 20 28 69 49 64 78 3c 69 44 65 73 74 72 6f  || (iIdx<iDestro
f450: 79 65 64 29 29 20 26 26 20 69 49 64 78 3e 69 4c  yed)) && iIdx>iL
f460: 61 72 67 65 73 74 20 29 7b 0a 20 20 20 20 20 20  argest ){.      
f470: 20 20 69 4c 61 72 67 65 73 74 20 3d 20 69 49 64    iLargest = iId
f480: 78 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  x;.      }.    }
f490: 0a 20 20 20 20 69 66 28 20 69 4c 61 72 67 65 73  .    if( iLarges
f4a0: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65  t==0 ){.      re
f4b0: 74 75 72 6e 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  turn;.    }else{
f4c0: 0a 20 20 20 20 20 20 69 6e 74 20 69 44 62 20 3d  .      int iDb =
f4d0: 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f   sqlite3SchemaTo
f4e0: 49 6e 64 65 78 28 70 50 61 72 73 65 2d 3e 64 62  Index(pParse->db
f4f0: 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29  , pTab->pSchema)
f500: 3b 0a 20 20 20 20 20 20 64 65 73 74 72 6f 79 52  ;.      destroyR
f510: 6f 6f 74 50 61 67 65 28 70 50 61 72 73 65 2c 20  ootPage(pParse, 
f520: 69 4c 61 72 67 65 73 74 2c 20 69 44 62 29 3b 0a  iLargest, iDb);.
f530: 20 20 20 20 20 20 69 44 65 73 74 72 6f 79 65 64        iDestroyed
f540: 20 3d 20 69 4c 61 72 67 65 73 74 3b 0a 20 20 20   = iLargest;.   
f550: 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a   }.  }.#endif.}.
f560: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
f570: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f  ine is called to
f580: 20 64 6f 20 74 68 65 20 77 6f 72 6b 20 6f 66 20   do the work of 
f590: 61 20 44 52 4f 50 20 54 41 42 4c 45 20 73 74 61  a DROP TABLE sta
f5a0: 74 65 6d 65 6e 74 2e 0a 2a 2a 20 70 4e 61 6d 65  tement..** pName
f5b0: 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20   is the name of 
f5c0: 74 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20  the table to be 
f5d0: 64 72 6f 70 70 65 64 2e 0a 2a 2f 0a 76 6f 69 64  dropped..*/.void
f5e0: 20 73 71 6c 69 74 65 33 44 72 6f 70 54 61 62 6c   sqlite3DropTabl
f5f0: 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
f600: 20 53 72 63 4c 69 73 74 20 2a 70 4e 61 6d 65 2c   SrcList *pName,
f610: 20 69 6e 74 20 69 73 56 69 65 77 2c 20 69 6e 74   int isView, int
f620: 20 6e 6f 45 72 72 29 7b 0a 20 20 54 61 62 6c 65   noErr){.  Table
f630: 20 2a 70 54 61 62 3b 0a 20 20 56 64 62 65 20 2a   *pTab;.  Vdbe *
f640: 76 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  v;.  sqlite3 *db
f650: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
f660: 20 69 6e 74 20 69 44 62 3b 0a 0a 20 20 69 66 28   int iDb;..  if(
f670: 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c   pParse->nErr ||
f680: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
f690: 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78  d ){.    goto ex
f6a0: 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20  it_drop_table;. 
f6b0: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 4e 61   }.  assert( pNa
f6c0: 6d 65 2d 3e 6e 53 72 63 3d 3d 31 20 29 3b 0a 20  me->nSrc==1 );. 
f6d0: 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33 4c   pTab = sqlite3L
f6e0: 6f 63 61 74 65 54 61 62 6c 65 28 70 50 61 72 73  ocateTable(pPars
f6f0: 65 2c 20 69 73 56 69 65 77 2c 20 0a 20 20 20 20  e, isView, .    
f700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f710: 20 20 20 20 20 20 20 20 70 4e 61 6d 65 2d 3e 61          pName->a
f720: 5b 30 5d 2e 7a 4e 61 6d 65 2c 20 70 4e 61 6d 65  [0].zName, pName
f730: 2d 3e 61 5b 30 5d 2e 7a 44 61 74 61 62 61 73 65  ->a[0].zDatabase
f740: 29 3b 0a 0a 20 20 69 66 28 20 70 54 61 62 3d 3d  );..  if( pTab==
f750: 30 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 6f 45  0 ){.    if( noE
f760: 72 72 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  rr ){.      sqli
f770: 74 65 33 45 72 72 6f 72 43 6c 65 61 72 28 70 50  te3ErrorClear(pP
f780: 61 72 73 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  arse);.    }.   
f790: 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f   goto exit_drop_
f7a0: 74 61 62 6c 65 3b 0a 20 20 7d 0a 20 20 69 44 62  table;.  }.  iDb
f7b0: 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61   = sqlite3Schema
f7c0: 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 54 61 62  ToIndex(db, pTab
f7d0: 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 61 73  ->pSchema);.  as
f7e0: 73 65 72 74 28 20 69 44 62 3e 3d 30 20 26 26 20  sert( iDb>=0 && 
f7f0: 69 44 62 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 0a  iDb<db->nDb );..
f800: 20 20 2f 2a 20 49 66 20 70 54 61 62 20 69 73 20    /* If pTab is 
f810: 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2c  a virtual table,
f820: 20 63 61 6c 6c 20 56 69 65 77 47 65 74 43 6f 6c   call ViewGetCol
f830: 75 6d 6e 4e 61 6d 65 73 28 29 20 74 6f 20 65 6e  umnNames() to en
f840: 73 75 72 65 0a 20 20 2a 2a 20 69 74 20 69 73 20  sure.  ** it is 
f850: 69 6e 69 74 69 61 6c 69 7a 65 64 2e 0a 20 20 2a  initialized..  *
f860: 2f 0a 20 20 69 66 28 20 49 73 56 69 72 74 75 61  /.  if( IsVirtua
f870: 6c 28 70 54 61 62 29 20 26 26 20 73 71 6c 69 74  l(pTab) && sqlit
f880: 65 33 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e  e3ViewGetColumnN
f890: 61 6d 65 73 28 70 50 61 72 73 65 2c 20 70 54 61  ames(pParse, pTa
f8a0: 62 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65  b) ){.    goto e
f8b0: 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a  xit_drop_table;.
f8c0: 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
f8d0: 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a  TE_OMIT_AUTHORIZ
f8e0: 41 54 49 4f 4e 0a 20 20 7b 0a 20 20 20 20 69 6e  ATION.  {.    in
f8f0: 74 20 63 6f 64 65 3b 0a 20 20 20 20 63 6f 6e 73  t code;.    cons
f900: 74 20 63 68 61 72 20 2a 7a 54 61 62 20 3d 20 53  t char *zTab = S
f910: 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 44 62 29  CHEMA_TABLE(iDb)
f920: 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  ;.    const char
f930: 20 2a 7a 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b   *zDb = db->aDb[
f940: 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20  iDb].zName;.    
f950: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 72 67  const char *zArg
f960: 32 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 73  2 = 0;.    if( s
f970: 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28  qlite3AuthCheck(
f980: 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 44  pParse, SQLITE_D
f990: 45 4c 45 54 45 2c 20 7a 54 61 62 2c 20 30 2c 20  ELETE, zTab, 0, 
f9a0: 7a 44 62 29 29 7b 0a 20 20 20 20 20 20 67 6f 74  zDb)){.      got
f9b0: 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c  o exit_drop_tabl
f9c0: 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  e;.    }.    if(
f9d0: 20 69 73 56 69 65 77 20 29 7b 0a 20 20 20 20 20   isView ){.     
f9e0: 20 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44   if( !OMIT_TEMPD
f9f0: 42 20 26 26 20 69 44 62 3d 3d 31 20 29 7b 0a 20  B && iDb==1 ){. 
fa00: 20 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51         code = SQ
fa10: 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 56  LITE_DROP_TEMP_V
fa20: 49 45 57 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  IEW;.      }else
fa30: 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20 3d  {.        code =
fa40: 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 56 49 45   SQLITE_DROP_VIE
fa50: 57 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66 6e 64  W;.      }.#ifnd
fa60: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
fa70: 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20  IRTUALTABLE.    
fa80: 7d 65 6c 73 65 20 69 66 28 20 49 73 56 69 72 74  }else if( IsVirt
fa90: 75 61 6c 28 70 54 61 62 29 20 29 7b 0a 20 20 20  ual(pTab) ){.   
faa0: 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45     code = SQLITE
fab0: 5f 44 52 4f 50 5f 56 54 41 42 4c 45 3b 0a 20 20  _DROP_VTABLE;.  
fac0: 20 20 20 20 7a 41 72 67 32 20 3d 20 70 54 61 62      zArg2 = pTab
fad0: 2d 3e 70 4d 6f 64 2d 3e 7a 4e 61 6d 65 3b 0a 23  ->pMod->zName;.#
fae0: 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c 73 65 7b  endif.    }else{
faf0: 0a 20 20 20 20 20 20 69 66 28 20 21 4f 4d 49 54  .      if( !OMIT
fb00: 5f 54 45 4d 50 44 42 20 26 26 20 69 44 62 3d 3d  _TEMPDB && iDb==
fb10: 31 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 64  1 ){.        cod
fb20: 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f  e = SQLITE_DROP_
fb30: 54 45 4d 50 5f 54 41 42 4c 45 3b 0a 20 20 20 20  TEMP_TABLE;.    
fb40: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
fb50: 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44   code = SQLITE_D
fb60: 52 4f 50 5f 54 41 42 4c 45 3b 0a 20 20 20 20 20  ROP_TABLE;.     
fb70: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
fb80: 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63   sqlite3AuthChec
fb90: 6b 28 70 50 61 72 73 65 2c 20 63 6f 64 65 2c 20  k(pParse, code, 
fba0: 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 41 72  pTab->zName, zAr
fbb0: 67 32 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20  g2, zDb) ){.    
fbc0: 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70    goto exit_drop
fbd0: 5f 74 61 62 6c 65 3b 0a 20 20 20 20 7d 0a 20 20  _table;.    }.  
fbe0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74    if( sqlite3Aut
fbf0: 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53  hCheck(pParse, S
fc00: 51 4c 49 54 45 5f 44 45 4c 45 54 45 2c 20 70 54  QLITE_DELETE, pT
fc10: 61 62 2d 3e 7a 4e 61 6d 65 2c 20 30 2c 20 7a 44  ab->zName, 0, zD
fc20: 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  b) ){.      goto
fc30: 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65   exit_drop_table
fc40: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  ;.    }.  }.#end
fc50: 69 66 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  if.  if( sqlite3
fc60: 53 74 72 4e 49 43 6d 70 28 70 54 61 62 2d 3e 7a  StrNICmp(pTab->z
fc70: 4e 61 6d 65 2c 20 22 73 71 6c 69 74 65 5f 22 2c  Name, "sqlite_",
fc80: 20 37 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71   7)==0 ){.    sq
fc90: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
fca0: 61 72 73 65 2c 20 22 74 61 62 6c 65 20 25 73 20  arse, "table %s 
fcb0: 6d 61 79 20 6e 6f 74 20 62 65 20 64 72 6f 70 70  may not be dropp
fcc0: 65 64 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  ed", pTab->zName
fcd0: 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74  );.    goto exit
fce0: 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 7d  _drop_table;.  }
fcf0: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
fd00: 5f 4f 4d 49 54 5f 56 49 45 57 0a 20 20 2f 2a 20  _OMIT_VIEW.  /* 
fd10: 45 6e 73 75 72 65 20 44 52 4f 50 20 54 41 42 4c  Ensure DROP TABL
fd20: 45 20 69 73 20 6e 6f 74 20 75 73 65 64 20 6f 6e  E is not used on
fd30: 20 61 20 76 69 65 77 2c 20 61 6e 64 20 44 52 4f   a view, and DRO
fd40: 50 20 56 49 45 57 20 69 73 20 6e 6f 74 20 75 73  P VIEW is not us
fd50: 65 64 0a 20 20 2a 2a 20 6f 6e 20 61 20 74 61 62  ed.  ** on a tab
fd60: 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69  le..  */.  if( i
fd70: 73 56 69 65 77 20 26 26 20 70 54 61 62 2d 3e 70  sView && pTab->p
fd80: 53 65 6c 65 63 74 3d 3d 30 20 29 7b 0a 20 20 20  Select==0 ){.   
fd90: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
fda0: 28 70 50 61 72 73 65 2c 20 22 75 73 65 20 44 52  (pParse, "use DR
fdb0: 4f 50 20 54 41 42 4c 45 20 74 6f 20 64 65 6c 65  OP TABLE to dele
fdc0: 74 65 20 74 61 62 6c 65 20 25 73 22 2c 20 70 54  te table %s", pT
fdd0: 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ab->zName);.    
fde0: 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74  goto exit_drop_t
fdf0: 61 62 6c 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20  able;.  }.  if( 
fe00: 21 69 73 56 69 65 77 20 26 26 20 70 54 61 62 2d  !isView && pTab-
fe10: 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20  >pSelect ){.    
fe20: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
fe30: 70 50 61 72 73 65 2c 20 22 75 73 65 20 44 52 4f  pParse, "use DRO
fe40: 50 20 56 49 45 57 20 74 6f 20 64 65 6c 65 74 65  P VIEW to delete
fe50: 20 76 69 65 77 20 25 73 22 2c 20 70 54 61 62 2d   view %s", pTab-
fe60: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 67 6f 74  >zName);.    got
fe70: 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c  o exit_drop_tabl
fe80: 65 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  e;.  }.#endif.. 
fe90: 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
fea0: 65 20 74 6f 20 72 65 6d 6f 76 65 20 74 68 65 20  e to remove the 
feb0: 74 61 62 6c 65 20 66 72 6f 6d 20 74 68 65 20 6d  table from the m
fec0: 61 73 74 65 72 20 74 61 62 6c 65 0a 20 20 2a 2a  aster table.  **
fed0: 20 6f 6e 20 64 69 73 6b 2e 0a 20 20 2a 2f 0a 20   on disk..  */. 
fee0: 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56   v = sqlite3GetV
fef0: 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69  dbe(pParse);.  i
ff00: 66 28 20 76 20 29 7b 0a 20 20 20 20 54 72 69 67  f( v ){.    Trig
ff10: 67 65 72 20 2a 70 54 72 69 67 67 65 72 3b 0a 20  ger *pTrigger;. 
ff20: 20 20 20 44 62 20 2a 70 44 62 20 3d 20 26 64 62     Db *pDb = &db
ff30: 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a 20 20 20 20  ->aDb[iDb];.    
ff40: 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74  sqlite3BeginWrit
ff50: 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73  eOperation(pPars
ff60: 65 2c 20 31 2c 20 69 44 62 29 3b 0a 0a 23 69 66  e, 1, iDb);..#if
ff70: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
ff80: 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20  _VIRTUALTABLE.  
ff90: 20 20 69 66 28 20 49 73 56 69 72 74 75 61 6c 28    if( IsVirtual(
ffa0: 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20 69  pTab) ){.      i
ffb0: 66 28 20 76 20 29 7b 0a 20 20 20 20 20 20 20 20  f( v ){.        
ffc0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
ffd0: 30 28 76 2c 20 4f 50 5f 56 42 65 67 69 6e 29 3b  0(v, OP_VBegin);
ffe0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23  .      }.    }.#
fff0: 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 44 72  endif..    /* Dr
10000 6f 70 20 61 6c 6c 20 74 72 69 67 67 65 72 73 20  op all triggers 
10010 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
10020 74 68 65 20 74 61 62 6c 65 20 62 65 69 6e 67 20  the table being 
10030 64 72 6f 70 70 65 64 2e 20 43 6f 64 65 0a 20 20  dropped. Code.  
10040 20 20 2a 2a 20 69 73 20 67 65 6e 65 72 61 74 65    ** is generate
10050 64 20 74 6f 20 72 65 6d 6f 76 65 20 65 6e 74 72  d to remove entr
10060 69 65 73 20 66 72 6f 6d 20 73 71 6c 69 74 65 5f  ies from sqlite_
10070 6d 61 73 74 65 72 20 61 6e 64 2f 6f 72 0a 20 20  master and/or.  
10080 20 20 2a 2a 20 73 71 6c 69 74 65 5f 74 65 6d 70    ** sqlite_temp
10090 5f 6d 61 73 74 65 72 20 69 66 20 72 65 71 75 69  _master if requi
100a0 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  red..    */.    
100b0 70 54 72 69 67 67 65 72 20 3d 20 70 54 61 62 2d  pTrigger = pTab-
100c0 3e 70 54 72 69 67 67 65 72 3b 0a 20 20 20 20 77  >pTrigger;.    w
100d0 68 69 6c 65 28 20 70 54 72 69 67 67 65 72 20 29  hile( pTrigger )
100e0 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
100f0 70 54 72 69 67 67 65 72 2d 3e 70 53 63 68 65 6d  pTrigger->pSchem
10100 61 3d 3d 70 54 61 62 2d 3e 70 53 63 68 65 6d 61  a==pTab->pSchema
10110 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 20 20 70   || .          p
10120 54 72 69 67 67 65 72 2d 3e 70 53 63 68 65 6d 61  Trigger->pSchema
10130 3d 3d 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 53 63  ==db->aDb[1].pSc
10140 68 65 6d 61 20 29 3b 0a 20 20 20 20 20 20 73 71  hema );.      sq
10150 6c 69 74 65 33 44 72 6f 70 54 72 69 67 67 65 72  lite3DropTrigger
10160 50 74 72 28 70 50 61 72 73 65 2c 20 70 54 72 69  Ptr(pParse, pTri
10170 67 67 65 72 29 3b 0a 20 20 20 20 20 20 70 54 72  gger);.      pTr
10180 69 67 67 65 72 20 3d 20 70 54 72 69 67 67 65 72  igger = pTrigger
10190 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 0a  ->pNext;.    }..
101a0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
101b0 4d 49 54 5f 41 55 54 4f 49 4e 43 52 45 4d 45 4e  MIT_AUTOINCREMEN
101c0 54 0a 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20  T.    /* Remove 
101d0 61 6e 79 20 65 6e 74 72 69 65 73 20 6f 66 20 74  any entries of t
101e0 68 65 20 73 71 6c 69 74 65 5f 73 65 71 75 65 6e  he sqlite_sequen
101f0 63 65 20 74 61 62 6c 65 20 61 73 73 6f 63 69 61  ce table associa
10200 74 65 64 20 77 69 74 68 0a 20 20 20 20 2a 2a 20  ted with.    ** 
10210 74 68 65 20 74 61 62 6c 65 20 62 65 69 6e 67 20  the table being 
10220 64 72 6f 70 70 65 64 2e 20 54 68 69 73 20 69 73  dropped. This is
10230 20 64 6f 6e 65 20 62 65 66 6f 72 65 20 74 68 65   done before the
10240 20 74 61 62 6c 65 20 69 73 20 64 72 6f 70 70 65   table is droppe
10250 64 0a 20 20 20 20 2a 2a 20 61 74 20 74 68 65 20  d.    ** at the 
10260 62 74 72 65 65 20 6c 65 76 65 6c 2c 20 69 6e 20  btree level, in 
10270 63 61 73 65 20 74 68 65 20 73 71 6c 69 74 65 5f  case the sqlite_
10280 73 65 71 75 65 6e 63 65 20 74 61 62 6c 65 20 6e  sequence table n
10290 65 65 64 73 20 74 6f 0a 20 20 20 20 2a 2a 20 6d  eeds to.    ** m
102a0 6f 76 65 20 61 73 20 61 20 72 65 73 75 6c 74 20  ove as a result 
102b0 6f 66 20 74 68 65 20 64 72 6f 70 20 28 63 61 6e  of the drop (can
102c0 20 68 61 70 70 65 6e 20 69 6e 20 61 75 74 6f 2d   happen in auto-
102d0 76 61 63 75 75 6d 20 6d 6f 64 65 29 2e 0a 20 20  vacuum mode)..  
102e0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 54 61    */.    if( pTa
102f0 62 2d 3e 74 61 62 46 6c 61 67 73 20 26 20 54 46  b->tabFlags & TF
10300 5f 41 75 74 6f 69 6e 63 72 65 6d 65 6e 74 20 29  _Autoincrement )
10310 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4e  {.      sqlite3N
10320 65 73 74 65 64 50 61 72 73 65 28 70 50 61 72 73  estedParse(pPars
10330 65 2c 0a 20 20 20 20 20 20 20 20 22 44 45 4c 45  e,.        "DELE
10340 54 45 20 46 52 4f 4d 20 25 73 2e 73 71 6c 69 74  TE FROM %s.sqlit
10350 65 5f 73 65 71 75 65 6e 63 65 20 57 48 45 52 45  e_sequence WHERE
10360 20 6e 61 6d 65 3d 25 51 22 2c 0a 20 20 20 20 20   name=%Q",.     
10370 20 20 20 70 44 62 2d 3e 7a 4e 61 6d 65 2c 20 70     pDb->zName, p
10380 54 61 62 2d 3e 7a 4e 61 6d 65 0a 20 20 20 20 20  Tab->zName.     
10390 20 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66   );.    }.#endif
103a0 0a 0a 20 20 20 20 2f 2a 20 44 72 6f 70 20 61 6c  ..    /* Drop al
103b0 6c 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52 20  l SQLITE_MASTER 
103c0 74 61 62 6c 65 20 61 6e 64 20 69 6e 64 65 78 20  table and index 
103d0 65 6e 74 72 69 65 73 20 74 68 61 74 20 72 65 66  entries that ref
103e0 65 72 20 74 6f 20 74 68 65 0a 20 20 20 20 2a 2a  er to the.    **
103f0 20 74 61 62 6c 65 2e 20 54 68 65 20 70 72 6f 67   table. The prog
10400 72 61 6d 20 6e 61 6d 65 20 6c 6f 6f 70 73 20 74  ram name loops t
10410 68 72 6f 75 67 68 20 74 68 65 20 6d 61 73 74 65  hrough the maste
10420 72 20 74 61 62 6c 65 20 61 6e 64 20 64 65 6c 65  r table and dele
10430 74 65 73 0a 20 20 20 20 2a 2a 20 65 76 65 72 79  tes.    ** every
10440 20 72 6f 77 20 74 68 61 74 20 72 65 66 65 72 73   row that refers
10450 20 74 6f 20 61 20 74 61 62 6c 65 20 6f 66 20 74   to a table of t
10460 68 65 20 73 61 6d 65 20 6e 61 6d 65 20 61 73 20  he same name as 
10470 74 68 65 20 6f 6e 65 20 62 65 69 6e 67 0a 20 20  the one being.  
10480 20 20 2a 2a 20 64 72 6f 70 70 65 64 2e 20 54 72    ** dropped. Tr
10490 69 67 67 65 72 73 20 61 72 65 20 68 61 6e 64 6c  iggers are handl
104a0 65 64 20 73 65 70 65 72 61 74 65 6c 79 20 62 65  ed seperately be
104b0 63 61 75 73 65 20 61 20 74 72 69 67 67 65 72 20  cause a trigger 
104c0 63 61 6e 20 62 65 0a 20 20 20 20 2a 2a 20 63 72  can be.    ** cr
104d0 65 61 74 65 64 20 69 6e 20 74 68 65 20 74 65 6d  eated in the tem
104e0 70 20 64 61 74 61 62 61 73 65 20 74 68 61 74 20  p database that 
104f0 72 65 66 65 72 73 20 74 6f 20 61 20 74 61 62 6c  refers to a tabl
10500 65 20 69 6e 20 61 6e 6f 74 68 65 72 0a 20 20 20  e in another.   
10510 20 2a 2a 20 64 61 74 61 62 61 73 65 2e 0a 20 20   ** database..  
10520 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33    */.    sqlite3
10530 4e 65 73 74 65 64 50 61 72 73 65 28 70 50 61 72  NestedParse(pPar
10540 73 65 2c 20 0a 20 20 20 20 20 20 20 20 22 44 45  se, .        "DE
10550 4c 45 54 45 20 46 52 4f 4d 20 25 51 2e 25 73 20  LETE FROM %Q.%s 
10560 57 48 45 52 45 20 74 62 6c 5f 6e 61 6d 65 3d 25  WHERE tbl_name=%
10570 51 20 61 6e 64 20 74 79 70 65 21 3d 27 74 72 69  Q and type!='tri
10580 67 67 65 72 27 22 2c 0a 20 20 20 20 20 20 20 20  gger'",.        
10590 70 44 62 2d 3e 7a 4e 61 6d 65 2c 20 53 43 48 45  pDb->zName, SCHE
105a0 4d 41 5f 54 41 42 4c 45 28 69 44 62 29 2c 20 70  MA_TABLE(iDb), p
105b0 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 0a 20 20  Tab->zName);..  
105c0 20 20 2f 2a 20 44 72 6f 70 20 61 6e 79 20 73 74    /* Drop any st
105d0 61 74 69 73 74 69 63 73 20 66 72 6f 6d 20 74 68  atistics from th
105e0 65 20 73 71 6c 69 74 65 5f 73 74 61 74 31 20 74  e sqlite_stat1 t
105f0 61 62 6c 65 2c 20 69 66 20 69 74 20 65 78 69 73  able, if it exis
10600 74 73 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 71  ts */.    if( sq
10610 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28 64  lite3FindTable(d
10620 62 2c 20 22 73 71 6c 69 74 65 5f 73 74 61 74 31  b, "sqlite_stat1
10630 22 2c 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e  ", db->aDb[iDb].
10640 7a 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 20 20  zName) ){.      
10650 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72  sqlite3NestedPar
10660 73 65 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20  se(pParse,.     
10670 20 20 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20     "DELETE FROM 
10680 25 51 2e 73 71 6c 69 74 65 5f 73 74 61 74 31 20  %Q.sqlite_stat1 
10690 57 48 45 52 45 20 74 62 6c 3d 25 51 22 2c 20 70  WHERE tbl=%Q", p
106a0 44 62 2d 3e 7a 4e 61 6d 65 2c 20 70 54 61 62 2d  Db->zName, pTab-
106b0 3e 7a 4e 61 6d 65 0a 20 20 20 20 20 20 29 3b 0a  >zName.      );.
106c0 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 21      }..    if( !
106d0 69 73 56 69 65 77 20 26 26 20 21 49 73 56 69 72  isView && !IsVir
106e0 74 75 61 6c 28 70 54 61 62 29 20 29 7b 0a 20 20  tual(pTab) ){.  
106f0 20 20 20 20 64 65 73 74 72 6f 79 54 61 62 6c 65      destroyTable
10700 28 70 50 61 72 73 65 2c 20 70 54 61 62 29 3b 0a  (pParse, pTab);.
10710 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65      }..    /* Re
10720 6d 6f 76 65 20 74 68 65 20 74 61 62 6c 65 20 65  move the table e
10730 6e 74 72 79 20 66 72 6f 6d 20 53 51 4c 69 74 65  ntry from SQLite
10740 27 73 20 69 6e 74 65 72 6e 61 6c 20 73 63 68 65  's internal sche
10750 6d 61 20 61 6e 64 20 6d 6f 64 69 66 79 0a 20 20  ma and modify.  
10760 20 20 2a 2a 20 74 68 65 20 73 63 68 65 6d 61 20    ** the schema 
10770 63 6f 6f 6b 69 65 2e 0a 20 20 20 20 2a 2f 0a 20  cookie..    */. 
10780 20 20 20 69 66 28 20 49 73 56 69 72 74 75 61 6c     if( IsVirtual
10790 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20  (pTab) ){.      
107a0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
107b0 34 28 76 2c 20 4f 50 5f 56 44 65 73 74 72 6f 79  4(v, OP_VDestroy
107c0 2c 20 69 44 62 2c 20 30 2c 20 30 2c 20 70 54 61  , iDb, 0, 0, pTa
107d0 62 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20  b->zName, 0);.  
107e0 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56    }.    sqlite3V
107f0 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
10800 44 72 6f 70 54 61 62 6c 65 2c 20 69 44 62 2c 20  DropTable, iDb, 
10810 30 2c 20 30 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  0, 0, pTab->zNam
10820 65 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  e, 0);.    sqlit
10830 65 33 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28 70  e3ChangeCookie(p
10840 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 7d  Parse, iDb);.  }
10850 0a 20 20 73 71 6c 69 74 65 56 69 65 77 52 65 73  .  sqliteViewRes
10860 65 74 41 6c 6c 28 64 62 2c 20 69 44 62 29 3b 0a  etAll(db, iDb);.
10870 0a 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65  .exit_drop_table
10880 3a 0a 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69  :.  sqlite3SrcLi
10890 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 4e 61  stDelete(db, pNa
108a0 6d 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  me);.}../*.** Th
108b0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
108c0 6c 6c 65 64 20 74 6f 20 63 72 65 61 74 65 20 61  lled to create a
108d0 20 6e 65 77 20 66 6f 72 65 69 67 6e 20 6b 65 79   new foreign key
108e0 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 0a 2a 2a   on the table.**
108f0 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72   currently under
10900 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20   construction.  
10910 70 46 72 6f 6d 43 6f 6c 20 64 65 74 65 72 6d 69  pFromCol determi
10920 6e 65 73 20 77 68 69 63 68 20 63 6f 6c 75 6d 6e  nes which column
10930 73 0a 2a 2a 20 69 6e 20 74 68 65 20 63 75 72 72  s.** in the curr
10940 65 6e 74 20 74 61 62 6c 65 20 70 6f 69 6e 74 20  ent table point 
10950 74 6f 20 74 68 65 20 66 6f 72 65 69 67 6e 20 6b  to the foreign k
10960 65 79 2e 20 20 49 66 20 70 46 72 6f 6d 43 6f 6c  ey.  If pFromCol
10970 3d 3d 30 20 74 68 65 6e 0a 2a 2a 20 63 6f 6e 6e  ==0 then.** conn
10980 65 63 74 20 74 68 65 20 6b 65 79 20 74 6f 20 74  ect the key to t
10990 68 65 20 6c 61 73 74 20 63 6f 6c 75 6d 6e 20 69  he last column i
109a0 6e 73 65 72 74 65 64 2e 20 20 70 54 6f 20 69 73  nserted.  pTo is
109b0 20 74 68 65 20 6e 61 6d 65 20 6f 66 0a 2a 2a 20   the name of.** 
109c0 74 68 65 20 74 61 62 6c 65 20 72 65 66 65 72 72  the table referr
109d0 65 64 20 74 6f 2e 20 20 70 54 6f 43 6f 6c 20 69  ed to.  pToCol i
109e0 73 20 61 20 6c 69 73 74 20 6f 66 20 74 61 62 6c  s a list of tabl
109f0 65 73 20 69 6e 20 74 68 65 20 6f 74 68 65 72 0a  es in the other.
10a00 2a 2a 20 70 54 6f 20 74 61 62 6c 65 20 74 68 61  ** pTo table tha
10a10 74 20 74 68 65 20 66 6f 72 65 69 67 6e 20 6b 65  t the foreign ke
10a20 79 20 70 6f 69 6e 74 73 20 74 6f 2e 20 20 66 6c  y points to.  fl
10a30 61 67 73 20 63 6f 6e 74 61 69 6e 73 20 61 6c 6c  ags contains all
10a40 0a 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  .** information 
10a50 61 62 6f 75 74 20 74 68 65 20 63 6f 6e 66 6c 69  about the confli
10a60 63 74 20 72 65 73 6f 6c 75 74 69 6f 6e 20 61 6c  ct resolution al
10a70 67 6f 72 69 74 68 6d 73 20 73 70 65 63 69 66 69  gorithms specifi
10a80 65 64 0a 2a 2a 20 69 6e 20 74 68 65 20 4f 4e 20  ed.** in the ON 
10a90 44 45 4c 45 54 45 2c 20 4f 4e 20 55 50 44 41 54  DELETE, ON UPDAT
10aa0 45 20 61 6e 64 20 4f 4e 20 49 4e 53 45 52 54 20  E and ON INSERT 
10ab0 63 6c 61 75 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 41  clauses..**.** A
10ac0 6e 20 46 4b 65 79 20 73 74 72 75 63 74 75 72 65  n FKey structure
10ad0 20 69 73 20 63 72 65 61 74 65 64 20 61 6e 64 20   is created and 
10ae0 61 64 64 65 64 20 74 6f 20 74 68 65 20 74 61 62  added to the tab
10af0 6c 65 20 63 75 72 72 65 6e 74 6c 79 0a 2a 2a 20  le currently.** 
10b00 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69  under constructi
10b10 6f 6e 20 69 6e 20 74 68 65 20 70 50 61 72 73 65  on in the pParse
10b20 2d 3e 70 4e 65 77 54 61 62 6c 65 20 66 69 65 6c  ->pNewTable fiel
10b30 64 2e 20 20 54 68 65 20 6e 65 77 20 46 4b 65 79  d.  The new FKey
10b40 0a 2a 2a 20 69 73 20 6e 6f 74 20 6c 69 6e 6b 65  .** is not linke
10b50 64 20 69 6e 74 6f 20 64 62 2d 3e 61 46 4b 65 79  d into db->aFKey
10b60 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74 20 2d   at this point -
10b70 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 68   that does not h
10b80 61 70 70 65 6e 0a 2a 2a 20 75 6e 74 69 6c 20 73  appen.** until s
10b90 71 6c 69 74 65 33 45 6e 64 54 61 62 6c 65 28 29  qlite3EndTable()
10ba0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 72 65  ..**.** The fore
10bb0 69 67 6e 20 6b 65 79 20 69 73 20 73 65 74 20 66  ign key is set f
10bc0 6f 72 20 49 4d 4d 45 44 49 41 54 45 20 70 72 6f  or IMMEDIATE pro
10bd0 63 65 73 73 69 6e 67 2e 20 20 41 20 73 75 62 73  cessing.  A subs
10be0 65 71 75 65 6e 74 20 63 61 6c 6c 0a 2a 2a 20 74  equent call.** t
10bf0 6f 20 73 71 6c 69 74 65 33 44 65 66 65 72 46 6f  o sqlite3DeferFo
10c00 72 65 69 67 6e 4b 65 79 28 29 20 6d 69 67 68 74  reignKey() might
10c10 20 63 68 61 6e 67 65 20 74 68 69 73 20 74 6f 20   change this to 
10c20 44 45 46 45 52 52 45 44 2e 0a 2a 2f 0a 76 6f 69  DEFERRED..*/.voi
10c30 64 20 73 71 6c 69 74 65 33 43 72 65 61 74 65 46  d sqlite3CreateF
10c40 6f 72 65 69 67 6e 4b 65 79 28 0a 20 20 50 61 72  oreignKey(.  Par
10c50 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
10c60 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
10c70 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69  text */.  ExprLi
10c80 73 74 20 2a 70 46 72 6f 6d 43 6f 6c 2c 20 20 2f  st *pFromCol,  /
10c90 2a 20 43 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 69  * Columns in thi
10ca0 73 20 74 61 62 6c 65 20 74 68 61 74 20 70 6f 69  s table that poi
10cb0 6e 74 20 74 6f 20 6f 74 68 65 72 20 74 61 62 6c  nt to other tabl
10cc0 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 54  e */.  Token *pT
10cd0 6f 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  o,          /* N
10ce0 61 6d 65 20 6f 66 20 74 68 65 20 6f 74 68 65 72  ame of the other
10cf0 20 74 61 62 6c 65 20 2a 2f 0a 20 20 45 78 70 72   table */.  Expr
10d00 4c 69 73 74 20 2a 70 54 6f 43 6f 6c 2c 20 20 20  List *pToCol,   
10d10 20 2f 2a 20 43 6f 6c 75 6d 6e 73 20 69 6e 20 74   /* Columns in t
10d20 68 65 20 6f 74 68 65 72 20 74 61 62 6c 65 20 2a  he other table *
10d30 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 20 20  /.  int flags   
10d40 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 66           /* Conf
10d50 6c 69 63 74 20 72 65 73 6f 6c 75 74 69 6f 6e 20  lict resolution 
10d60 61 6c 67 6f 72 69 74 68 6d 73 2e 20 2a 2f 0a 29  algorithms. */.)
10d70 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  {.  sqlite3 *db 
10d80 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 23 69  = pParse->db;.#i
10d90 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
10da0 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 0a 20 20  T_FOREIGN_KEY.  
10db0 46 4b 65 79 20 2a 70 46 4b 65 79 20 3d 20 30 3b  FKey *pFKey = 0;
10dc0 0a 20 20 54 61 62 6c 65 20 2a 70 20 3d 20 70 50  .  Table *p = pP
10dd0 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b  arse->pNewTable;
10de0 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20  .  int nByte;.  
10df0 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e 43 6f  int i;.  int nCo
10e00 6c 3b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 0a 20  l;.  char *z;.. 
10e10 20 61 73 73 65 72 74 28 20 70 54 6f 21 3d 30 20   assert( pTo!=0 
10e20 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c  );.  if( p==0 ||
10e30 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c   pParse->nErr ||
10e40 20 49 4e 5f 44 45 43 4c 41 52 45 5f 56 54 41 42   IN_DECLARE_VTAB
10e50 20 29 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a   ) goto fk_end;.
10e60 20 20 69 66 28 20 70 46 72 6f 6d 43 6f 6c 3d 3d    if( pFromCol==
10e70 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 43 6f  0 ){.    int iCo
10e80 6c 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20  l = p->nCol-1;. 
10e90 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 20     if( iCol<0 ) 
10ea0 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 20  goto fk_end;.   
10eb0 20 69 66 28 20 70 54 6f 43 6f 6c 20 26 26 20 70   if( pToCol && p
10ec0 54 6f 43 6f 6c 2d 3e 6e 45 78 70 72 21 3d 31 20  ToCol->nExpr!=1 
10ed0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
10ee0 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
10ef0 20 22 66 6f 72 65 69 67 6e 20 6b 65 79 20 6f 6e   "foreign key on
10f00 20 25 73 22 0a 20 20 20 20 20 20 20 20 20 22 20   %s".         " 
10f10 73 68 6f 75 6c 64 20 72 65 66 65 72 65 6e 63 65  should reference
10f20 20 6f 6e 6c 79 20 6f 6e 65 20 63 6f 6c 75 6d 6e   only one column
10f30 20 6f 66 20 74 61 62 6c 65 20 25 54 22 2c 0a 20   of table %T",. 
10f40 20 20 20 20 20 20 20 20 70 2d 3e 61 43 6f 6c 5b          p->aCol[
10f50 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 2c 20 70 54 6f  iCol].zName, pTo
10f60 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 6b  );.      goto fk
10f70 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20  _end;.    }.    
10f80 6e 43 6f 6c 20 3d 20 31 3b 0a 20 20 7d 65 6c 73  nCol = 1;.  }els
10f90 65 20 69 66 28 20 70 54 6f 43 6f 6c 20 26 26 20  e if( pToCol && 
10fa0 70 54 6f 43 6f 6c 2d 3e 6e 45 78 70 72 21 3d 70  pToCol->nExpr!=p
10fb0 46 72 6f 6d 43 6f 6c 2d 3e 6e 45 78 70 72 20 29  FromCol->nExpr )
10fc0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
10fd0 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 0a 20 20  orMsg(pParse,.  
10fe0 20 20 20 20 20 20 22 6e 75 6d 62 65 72 20 6f 66        "number of
10ff0 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 66 6f 72 65   columns in fore
11000 69 67 6e 20 6b 65 79 20 64 6f 65 73 20 6e 6f 74  ign key does not
11010 20 6d 61 74 63 68 20 74 68 65 20 6e 75 6d 62 65   match the numbe
11020 72 20 6f 66 20 22 0a 20 20 20 20 20 20 20 20 22  r of ".        "
11030 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 72  columns in the r
11040 65 66 65 72 65 6e 63 65 64 20 74 61 62 6c 65 22  eferenced table"
11050 29 3b 0a 20 20 20 20 67 6f 74 6f 20 66 6b 5f 65  );.    goto fk_e
11060 6e 64 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  nd;.  }else{.   
11070 20 6e 43 6f 6c 20 3d 20 70 46 72 6f 6d 43 6f 6c   nCol = pFromCol
11080 2d 3e 6e 45 78 70 72 3b 0a 20 20 7d 0a 20 20 6e  ->nExpr;.  }.  n
11090 42 79 74 65 20 3d 20 73 69 7a 65 6f 66 28 2a 70  Byte = sizeof(*p
110a0 46 4b 65 79 29 20 2b 20 6e 43 6f 6c 2a 73 69 7a  FKey) + nCol*siz
110b0 65 6f 66 28 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b  eof(pFKey->aCol[
110c0 30 5d 29 20 2b 20 70 54 6f 2d 3e 6e 20 2b 20 31  0]) + pTo->n + 1
110d0 3b 0a 20 20 69 66 28 20 70 54 6f 43 6f 6c 20 29  ;.  if( pToCol )
110e0 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  {.    for(i=0; i
110f0 3c 70 54 6f 43 6f 6c 2d 3e 6e 45 78 70 72 3b 20  <pToCol->nExpr; 
11100 69 2b 2b 29 7b 0a 20 20 20 20 20 20 6e 42 79 74  i++){.      nByt
11110 65 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  e += sqlite3Strl
11120 65 6e 33 30 28 70 54 6f 43 6f 6c 2d 3e 61 5b 69  en30(pToCol->a[i
11130 5d 2e 7a 4e 61 6d 65 29 20 2b 20 31 3b 0a 20 20  ].zName) + 1;.  
11140 20 20 7d 0a 20 20 7d 0a 20 20 70 46 4b 65 79 20    }.  }.  pFKey 
11150 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
11160 63 5a 65 72 6f 28 64 62 2c 20 6e 42 79 74 65 20  cZero(db, nByte 
11170 29 3b 0a 20 20 69 66 28 20 70 46 4b 65 79 3d 3d  );.  if( pFKey==
11180 30 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 66 6b  0 ){.    goto fk
11190 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 70 46 4b 65  _end;.  }.  pFKe
111a0 79 2d 3e 70 46 72 6f 6d 20 3d 20 70 3b 0a 20 20  y->pFrom = p;.  
111b0 70 46 4b 65 79 2d 3e 70 4e 65 78 74 46 72 6f 6d  pFKey->pNextFrom
111c0 20 3d 20 70 2d 3e 70 46 4b 65 79 3b 0a 20 20 7a   = p->pFKey;.  z
111d0 20 3d 20 28 63 68 61 72 2a 29 26 70 46 4b 65 79   = (char*)&pFKey
111e0 5b 31 5d 3b 0a 20 20 70 46 4b 65 79 2d 3e 61 43  [1];.  pFKey->aC
111f0 6f 6c 20 3d 20 28 73 74 72 75 63 74 20 73 43 6f  ol = (struct sCo
11200 6c 4d 61 70 2a 29 7a 3b 0a 20 20 7a 20 2b 3d 20  lMap*)z;.  z += 
11210 73 69 7a 65 6f 66 28 73 74 72 75 63 74 20 73 43  sizeof(struct sC
11220 6f 6c 4d 61 70 29 2a 6e 43 6f 6c 3b 0a 20 20 70  olMap)*nCol;.  p
11230 46 4b 65 79 2d 3e 7a 54 6f 20 3d 20 7a 3b 0a 20  FKey->zTo = z;. 
11240 20 6d 65 6d 63 70 79 28 7a 2c 20 70 54 6f 2d 3e   memcpy(z, pTo->
11250 7a 2c 20 70 54 6f 2d 3e 6e 29 3b 0a 20 20 7a 5b  z, pTo->n);.  z[
11260 70 54 6f 2d 3e 6e 5d 20 3d 20 30 3b 0a 20 20 7a  pTo->n] = 0;.  z
11270 20 2b 3d 20 70 54 6f 2d 3e 6e 2b 31 3b 0a 20 20   += pTo->n+1;.  
11280 70 46 4b 65 79 2d 3e 70 4e 65 78 74 54 6f 20 3d  pFKey->pNextTo =
11290 20 30 3b 0a 20 20 70 46 4b 65 79 2d 3e 6e 43 6f   0;.  pFKey->nCo
112a0 6c 20 3d 20 6e 43 6f 6c 3b 0a 20 20 69 66 28 20  l = nCol;.  if( 
112b0 70 46 72 6f 6d 43 6f 6c 3d 3d 30 20 29 7b 0a 20  pFromCol==0 ){. 
112c0 20 20 20 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b 30     pFKey->aCol[0
112d0 5d 2e 69 46 72 6f 6d 20 3d 20 70 2d 3e 6e 43 6f  ].iFrom = p->nCo
112e0 6c 2d 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  l-1;.  }else{.  
112f0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f    for(i=0; i<nCo
11300 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  l; i++){.      i
11310 6e 74 20 6a 3b 0a 20 20 20 20 20 20 66 6f 72 28  nt j;.      for(
11320 6a 3d 30 3b 20 6a 3c 70 2d 3e 6e 43 6f 6c 3b 20  j=0; j<p->nCol; 
11330 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66  j++){.        if
11340 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ( sqlite3StrICmp
11350 28 70 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d  (p->aCol[j].zNam
11360 65 2c 20 70 46 72 6f 6d 43 6f 6c 2d 3e 61 5b 69  e, pFromCol->a[i
11370 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20  ].zName)==0 ){. 
11380 20 20 20 20 20 20 20 20 20 70 46 4b 65 79 2d 3e           pFKey->
11390 61 43 6f 6c 5b 69 5d 2e 69 46 72 6f 6d 20 3d 20  aCol[i].iFrom = 
113a0 6a 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  j;.          bre
113b0 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
113c0 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
113d0 6a 3e 3d 70 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20  j>=p->nCol ){.  
113e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
113f0 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 0a 20  orMsg(pParse, . 
11400 20 20 20 20 20 20 20 20 20 22 75 6e 6b 6e 6f 77           "unknow
11410 6e 20 63 6f 6c 75 6d 6e 20 5c 22 25 73 5c 22 20  n column \"%s\" 
11420 69 6e 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 64  in foreign key d
11430 65 66 69 6e 69 74 69 6f 6e 22 2c 20 0a 20 20 20  efinition", .   
11440 20 20 20 20 20 20 20 70 46 72 6f 6d 43 6f 6c 2d         pFromCol-
11450 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20  >a[i].zName);.  
11460 20 20 20 20 20 20 67 6f 74 6f 20 66 6b 5f 65 6e        goto fk_en
11470 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  d;.      }.    }
11480 0a 20 20 7d 0a 20 20 69 66 28 20 70 54 6f 43 6f  .  }.  if( pToCo
11490 6c 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30  l ){.    for(i=0
114a0 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a  ; i<nCol; i++){.
114b0 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 73 71        int n = sq
114c0 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70 54  lite3Strlen30(pT
114d0 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  oCol->a[i].zName
114e0 29 3b 0a 20 20 20 20 20 20 70 46 4b 65 79 2d 3e  );.      pFKey->
114f0 61 43 6f 6c 5b 69 5d 2e 7a 43 6f 6c 20 3d 20 7a  aCol[i].zCol = z
11500 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a  ;.      memcpy(z
11510 2c 20 70 54 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a  , pToCol->a[i].z
11520 4e 61 6d 65 2c 20 6e 29 3b 0a 20 20 20 20 20 20  Name, n);.      
11530 7a 5b 6e 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20  z[n] = 0;.      
11540 7a 20 2b 3d 20 6e 2b 31 3b 0a 20 20 20 20 7d 0a  z += n+1;.    }.
11550 20 20 7d 0a 20 20 70 46 4b 65 79 2d 3e 69 73 44    }.  pFKey->isD
11560 65 66 65 72 72 65 64 20 3d 20 30 3b 0a 20 20 70  eferred = 0;.  p
11570 46 4b 65 79 2d 3e 64 65 6c 65 74 65 43 6f 6e 66  FKey->deleteConf
11580 20 3d 20 28 75 38 29 28 66 6c 61 67 73 20 26 20   = (u8)(flags & 
11590 30 78 66 66 29 3b 0a 20 20 70 46 4b 65 79 2d 3e  0xff);.  pFKey->
115a0 75 70 64 61 74 65 43 6f 6e 66 20 3d 20 28 75 38  updateConf = (u8
115b0 29 28 28 66 6c 61 67 73 20 3e 3e 20 38 20 29 20  )((flags >> 8 ) 
115c0 26 20 30 78 66 66 29 3b 0a 20 20 70 46 4b 65 79  & 0xff);.  pFKey
115d0 2d 3e 69 6e 73 65 72 74 43 6f 6e 66 20 3d 20 28  ->insertConf = (
115e0 75 38 29 28 28 66 6c 61 67 73 20 3e 3e 20 31 36  u8)((flags >> 16
115f0 20 29 20 26 20 30 78 66 66 29 3b 0a 0a 20 20 2f   ) & 0xff);..  /
11600 2a 20 4c 69 6e 6b 20 74 68 65 20 66 6f 72 65 69  * Link the forei
11610 67 6e 20 6b 65 79 20 74 6f 20 74 68 65 20 74 61  gn key to the ta
11620 62 6c 65 20 61 73 20 74 68 65 20 6c 61 73 74 20  ble as the last 
11630 73 74 65 70 2e 0a 20 20 2a 2f 0a 20 20 70 2d 3e  step..  */.  p->
11640 70 46 4b 65 79 20 3d 20 70 46 4b 65 79 3b 0a 20  pFKey = pFKey;. 
11650 20 70 46 4b 65 79 20 3d 20 30 3b 0a 0a 66 6b 5f   pFKey = 0;..fk_
11660 65 6e 64 3a 0a 20 20 73 71 6c 69 74 65 33 44 62  end:.  sqlite3Db
11670 46 72 65 65 28 64 62 2c 20 70 46 4b 65 79 29 3b  Free(db, pFKey);
11680 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69  .#endif /* !defi
11690 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
116a0 46 4f 52 45 49 47 4e 5f 4b 45 59 29 20 2a 2f 0a  FOREIGN_KEY) */.
116b0 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
116c0 74 44 65 6c 65 74 65 28 64 62 2c 20 70 46 72 6f  tDelete(db, pFro
116d0 6d 43 6f 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33  mCol);.  sqlite3
116e0 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64  ExprListDelete(d
116f0 62 2c 20 70 54 6f 43 6f 6c 29 3b 0a 7d 0a 0a 2f  b, pToCol);.}../
11700 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
11710 65 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e  e is called when
11720 20 61 6e 20 49 4e 49 54 49 41 4c 4c 59 20 49 4d   an INITIALLY IM
11730 4d 45 44 49 41 54 45 20 6f 72 20 49 4e 49 54 49  MEDIATE or INITI
11740 41 4c 4c 59 20 44 45 46 45 52 52 45 44 0a 2a 2a  ALLY DEFERRED.**
11750 20 63 6c 61 75 73 65 20 69 73 20 73 65 65 6e 20   clause is seen 
11760 61 73 20 70 61 72 74 20 6f 66 20 61 20 66 6f 72  as part of a for
11770 65 69 67 6e 20 6b 65 79 20 64 65 66 69 6e 69 74  eign key definit
11780 69 6f 6e 2e 20 20 54 68 65 20 69 73 44 65 66 65  ion.  The isDefe
11790 72 72 65 64 0a 2a 2a 20 70 61 72 61 6d 65 74 65  rred.** paramete
117a0 72 20 69 73 20 31 20 66 6f 72 20 49 4e 49 54 49  r is 1 for INITI
117b0 41 4c 4c 59 20 44 45 46 45 52 52 45 44 20 61 6e  ALLY DEFERRED an
117c0 64 20 30 20 66 6f 72 20 49 4e 49 54 49 41 4c 4c  d 0 for INITIALL
117d0 59 20 49 4d 4d 45 44 49 41 54 45 2e 0a 2a 2a 20  Y IMMEDIATE..** 
117e0 54 68 65 20 62 65 68 61 76 69 6f 72 20 6f 66 20  The behavior of 
117f0 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c  the most recentl
11800 79 20 63 72 65 61 74 65 64 20 66 6f 72 65 69 67  y created foreig
11810 6e 20 6b 65 79 20 69 73 20 61 64 6a 75 73 74 65  n key is adjuste
11820 64 0a 2a 2a 20 61 63 63 6f 72 64 69 6e 67 6c 79  d.** accordingly
11830 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
11840 33 44 65 66 65 72 46 6f 72 65 69 67 6e 4b 65 79  3DeferForeignKey
11850 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
11860 69 6e 74 20 69 73 44 65 66 65 72 72 65 64 29 7b  int isDeferred){
11870 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
11880 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59  OMIT_FOREIGN_KEY
11890 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a  .  Table *pTab;.
118a0 20 20 46 4b 65 79 20 2a 70 46 4b 65 79 3b 0a 20    FKey *pFKey;. 
118b0 20 69 66 28 20 28 70 54 61 62 20 3d 20 70 50 61   if( (pTab = pPa
118c0 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3d  rse->pNewTable)=
118d0 3d 30 20 7c 7c 20 28 70 46 4b 65 79 20 3d 20 70  =0 || (pFKey = p
118e0 54 61 62 2d 3e 70 46 4b 65 79 29 3d 3d 30 20 29  Tab->pFKey)==0 )
118f0 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72   return;.  asser
11900 74 28 20 69 73 44 65 66 65 72 72 65 64 3d 3d 30  t( isDeferred==0
11910 20 7c 7c 20 69 73 44 65 66 65 72 72 65 64 3d 3d   || isDeferred==
11920 31 20 29 3b 0a 20 20 70 46 4b 65 79 2d 3e 69 73  1 );.  pFKey->is
11930 44 65 66 65 72 72 65 64 20 3d 20 28 75 38 29 69  Deferred = (u8)i
11940 73 44 65 66 65 72 72 65 64 3b 0a 23 65 6e 64 69  sDeferred;.#endi
11950 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  f.}../*.** Gener
11960 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 77 69  ate code that wi
11970 6c 6c 20 65 72 61 73 65 20 61 6e 64 20 72 65 66  ll erase and ref
11980 69 6c 6c 20 69 6e 64 65 78 20 2a 70 49 64 78 2e  ill index *pIdx.
11990 20 20 54 68 69 73 20 69 73 0a 2a 2a 20 75 73 65    This is.** use
119a0 64 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20  d to initialize 
119b0 61 20 6e 65 77 6c 79 20 63 72 65 61 74 65 64 20  a newly created 
119c0 69 6e 64 65 78 20 6f 72 20 74 6f 20 72 65 63 6f  index or to reco
119d0 6d 70 75 74 65 20 74 68 65 0a 2a 2a 20 63 6f 6e  mpute the.** con
119e0 74 65 6e 74 20 6f 66 20 61 6e 20 69 6e 64 65 78  tent of an index
119f0 20 69 6e 20 72 65 73 70 6f 6e 73 65 20 74 6f 20   in response to 
11a00 61 20 52 45 49 4e 44 45 58 20 63 6f 6d 6d 61 6e  a REINDEX comman
11a10 64 2e 0a 2a 2a 0a 2a 2a 20 69 66 20 6d 65 6d 52  d..**.** if memR
11a20 6f 6f 74 50 61 67 65 20 69 73 20 6e 6f 74 20 6e  ootPage is not n
11a30 65 67 61 74 69 76 65 2c 20 69 74 20 6d 65 61 6e  egative, it mean
11a40 73 20 74 68 61 74 20 74 68 65 20 69 6e 64 65 78  s that the index
11a50 20 69 73 20 6e 65 77 6c 79 0a 2a 2a 20 63 72 65   is newly.** cre
11a60 61 74 65 64 2e 20 20 54 68 65 20 72 65 67 69 73  ated.  The regis
11a70 74 65 72 20 73 70 65 63 69 66 69 65 64 20 62 79  ter specified by
11a80 20 6d 65 6d 52 6f 6f 74 50 61 67 65 20 63 6f 6e   memRootPage con
11a90 74 61 69 6e 73 20 74 68 65 0a 2a 2a 20 72 6f 6f  tains the.** roo
11aa0 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  t page number of
11ab0 20 74 68 65 20 69 6e 64 65 78 2e 20 20 49 66 20   the index.  If 
11ac0 6d 65 6d 52 6f 6f 74 50 61 67 65 20 69 73 20 6e  memRootPage is n
11ad0 65 67 61 74 69 76 65 2c 20 74 68 65 6e 0a 2a 2a  egative, then.**
11ae0 20 74 68 65 20 69 6e 64 65 78 20 61 6c 72 65 61   the index alrea
11af0 64 79 20 65 78 69 73 74 73 20 61 6e 64 20 6d 75  dy exists and mu
11b00 73 74 20 62 65 20 63 6c 65 61 72 65 64 20 62 65  st be cleared be
11b10 66 6f 72 65 20 62 65 69 6e 67 20 72 65 66 69 6c  fore being refil
11b20 6c 65 64 20 61 6e 64 0a 2a 2a 20 74 68 65 20 72  led and.** the r
11b30 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20  oot page number 
11b40 6f 66 20 74 68 65 20 69 6e 64 65 78 20 69 73 20  of the index is 
11b50 74 61 6b 65 6e 20 66 72 6f 6d 20 70 49 6e 64 65  taken from pInde
11b60 78 2d 3e 74 6e 75 6d 2e 0a 2a 2f 0a 73 74 61 74  x->tnum..*/.stat
11b70 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65 33 52  ic void sqlite3R
11b80 65 66 69 6c 6c 49 6e 64 65 78 28 50 61 72 73 65  efillIndex(Parse
11b90 20 2a 70 50 61 72 73 65 2c 20 49 6e 64 65 78 20   *pParse, Index 
11ba0 2a 70 49 6e 64 65 78 2c 20 69 6e 74 20 6d 65 6d  *pIndex, int mem
11bb0 52 6f 6f 74 50 61 67 65 29 7b 0a 20 20 54 61 62  RootPage){.  Tab
11bc0 6c 65 20 2a 70 54 61 62 20 3d 20 70 49 6e 64 65  le *pTab = pInde
11bd0 78 2d 3e 70 54 61 62 6c 65 3b 20 20 2f 2a 20 54  x->pTable;  /* T
11be0 68 65 20 74 61 62 6c 65 20 74 68 61 74 20 69 73  he table that is
11bf0 20 69 6e 64 65 78 65 64 20 2a 2f 0a 20 20 69 6e   indexed */.  in
11c00 74 20 69 54 61 62 20 3d 20 70 50 61 72 73 65 2d  t iTab = pParse-
11c10 3e 6e 54 61 62 3b 20 20 20 20 20 20 20 2f 2a 20  >nTab;       /* 
11c20 42 74 72 65 65 20 63 75 72 73 6f 72 20 75 73 65  Btree cursor use
11c30 64 20 66 6f 72 20 70 54 61 62 20 2a 2f 0a 20 20  d for pTab */.  
11c40 69 6e 74 20 69 49 64 78 20 3d 20 70 50 61 72 73  int iIdx = pPars
11c50 65 2d 3e 6e 54 61 62 2b 31 3b 20 20 20 20 20 2f  e->nTab+1;     /
11c60 2a 20 42 74 72 65 65 20 63 75 72 73 6f 72 20 75  * Btree cursor u
11c70 73 65 64 20 66 6f 72 20 70 49 6e 64 65 78 20 2a  sed for pIndex *
11c80 2f 0a 20 20 69 6e 74 20 61 64 64 72 31 3b 20 20  /.  int addr1;  
11c90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11ca0 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
11cb0 20 74 6f 70 20 6f 66 20 6c 6f 6f 70 20 2a 2f 0a   top of loop */.
11cc0 20 20 69 6e 74 20 74 6e 75 6d 3b 20 20 20 20 20    int tnum;     
11cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11ce0 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20 6f 66   /* Root page of
11cf0 20 69 6e 64 65 78 20 2a 2f 0a 20 20 56 64 62 65   index */.  Vdbe
11d00 20 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20 20   *v;            
11d10 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47 65             /* Ge
11d20 6e 65 72 61 74 65 20 63 6f 64 65 20 69 6e 74 6f  nerate code into
11d30 20 74 68 69 73 20 76 69 72 74 75 61 6c 20 6d 61   this virtual ma
11d40 63 68 69 6e 65 20 2a 2f 0a 20 20 4b 65 79 49 6e  chine */.  KeyIn
11d50 66 6f 20 2a 70 4b 65 79 3b 20 20 20 20 20 20 20  fo *pKey;       
11d60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4b 65 79            /* Key
11d70 49 6e 66 6f 20 66 6f 72 20 69 6e 64 65 78 20 2a  Info for index *
11d80 2f 0a 20 20 69 6e 74 20 72 65 67 49 64 78 4b 65  /.  int regIdxKe
11d90 79 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  y;              
11da0 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 73 20     /* Registers 
11db0 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 69  containing the i
11dc0 6e 64 65 78 20 6b 65 79 20 2a 2f 0a 20 20 69 6e  ndex key */.  in
11dd0 74 20 72 65 67 52 65 63 6f 72 64 3b 20 20 20 20  t regRecord;    
11de0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
11df0 52 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67  Register holding
11e00 20 61 73 73 65 6d 62 6c 69 65 64 20 69 6e 64 65   assemblied inde
11e10 78 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 73 71  x record */.  sq
11e20 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
11e30 73 65 2d 3e 64 62 3b 20 20 20 20 20 20 2f 2a 20  se->db;      /* 
11e40 54 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e  The database con
11e50 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74  nection */.  int
11e60 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63   iDb = sqlite3Sc
11e70 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20  hemaToIndex(db, 
11e80 70 49 6e 64 65 78 2d 3e 70 53 63 68 65 6d 61 29  pIndex->pSchema)
11e90 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ;..#ifndef SQLIT
11ea0 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41  E_OMIT_AUTHORIZA
11eb0 54 49 4f 4e 0a 20 20 69 66 28 20 73 71 6c 69 74  TION.  if( sqlit
11ec0 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72  e3AuthCheck(pPar
11ed0 73 65 2c 20 53 51 4c 49 54 45 5f 52 45 49 4e 44  se, SQLITE_REIND
11ee0 45 58 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d  EX, pIndex->zNam
11ef0 65 2c 20 30 2c 0a 20 20 20 20 20 20 64 62 2d 3e  e, 0,.      db->
11f00 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 20 29  aDb[iDb].zName )
11f10 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a   ){.    return;.
11f20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a    }.#endif..  /*
11f30 20 52 65 71 75 69 72 65 20 61 20 77 72 69 74 65   Require a write
11f40 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 74 61 62  -lock on the tab
11f50 6c 65 20 74 6f 20 70 65 72 66 6f 72 6d 20 74 68  le to perform th
11f60 69 73 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a  is operation */.
11f70 20 20 73 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f    sqlite3TableLo
11f80 63 6b 28 70 50 61 72 73 65 2c 20 69 44 62 2c 20  ck(pParse, iDb, 
11f90 70 54 61 62 2d 3e 74 6e 75 6d 2c 20 31 2c 20 70  pTab->tnum, 1, p
11fa0 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 0a 20 20  Tab->zName);..  
11fb0 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
11fc0 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66  be(pParse);.  if
11fd0 28 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ( v==0 ) return;
11fe0 0a 20 20 69 66 28 20 6d 65 6d 52 6f 6f 74 50 61  .  if( memRootPa
11ff0 67 65 3e 3d 30 20 29 7b 0a 20 20 20 20 74 6e 75  ge>=0 ){.    tnu
12000 6d 20 3d 20 6d 65 6d 52 6f 6f 74 50 61 67 65 3b  m = memRootPage;
12010 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 74 6e  .  }else{.    tn
12020 75 6d 20 3d 20 70 49 6e 64 65 78 2d 3e 74 6e 75  um = pIndex->tnu
12030 6d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  m;.    sqlite3Vd
12040 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43  beAddOp2(v, OP_C
12050 6c 65 61 72 2c 20 74 6e 75 6d 2c 20 69 44 62 29  lear, tnum, iDb)
12060 3b 0a 20 20 7d 0a 20 20 70 4b 65 79 20 3d 20 73  ;.  }.  pKey = s
12070 71 6c 69 74 65 33 49 6e 64 65 78 4b 65 79 69 6e  qlite3IndexKeyin
12080 66 6f 28 70 50 61 72 73 65 2c 20 70 49 6e 64 65  fo(pParse, pInde
12090 78 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  x);.  sqlite3Vdb
120a0 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70  eAddOp4(v, OP_Op
120b0 65 6e 57 72 69 74 65 2c 20 69 49 64 78 2c 20 74  enWrite, iIdx, t
120c0 6e 75 6d 2c 20 69 44 62 2c 20 0a 20 20 20 20 20  num, iDb, .     
120d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
120e0 63 68 61 72 20 2a 29 70 4b 65 79 2c 20 50 34 5f  char *)pKey, P4_
120f0 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 29  KEYINFO_HANDOFF)
12100 3b 0a 20 20 69 66 28 20 6d 65 6d 52 6f 6f 74 50  ;.  if( memRootP
12110 61 67 65 3e 3d 30 20 29 7b 0a 20 20 20 20 73 71  age>=0 ){.    sq
12120 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
12130 35 28 76 2c 20 31 29 3b 0a 20 20 7d 0a 20 20 73  5(v, 1);.  }.  s
12140 71 6c 69 74 65 33 4f 70 65 6e 54 61 62 6c 65 28  qlite3OpenTable(
12150 70 50 61 72 73 65 2c 20 69 54 61 62 2c 20 69 44  pParse, iTab, iD
12160 62 2c 20 70 54 61 62 2c 20 4f 50 5f 4f 70 65 6e  b, pTab, OP_Open
12170 52 65 61 64 29 3b 0a 20 20 61 64 64 72 31 20 3d  Read);.  addr1 =
12180 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
12190 70 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c  p2(v, OP_Rewind,
121a0 20 69 54 61 62 2c 20 30 29 3b 0a 20 20 72 65 67   iTab, 0);.  reg
121b0 52 65 63 6f 72 64 20 3d 20 73 71 6c 69 74 65 33  Record = sqlite3
121c0 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
121d0 65 29 3b 0a 20 20 72 65 67 49 64 78 4b 65 79 20  e);.  regIdxKey 
121e0 3d 20 73 71 6c 69 74 65 33 47 65 6e 65 72 61 74  = sqlite3Generat
121f0 65 49 6e 64 65 78 4b 65 79 28 70 50 61 72 73 65  eIndexKey(pParse
12200 2c 20 70 49 6e 64 65 78 2c 20 69 54 61 62 2c 20  , pIndex, iTab, 
12210 72 65 67 52 65 63 6f 72 64 2c 20 31 29 3b 0a 20  regRecord, 1);. 
12220 20 69 66 28 20 70 49 6e 64 65 78 2d 3e 6f 6e 45   if( pIndex->onE
12230 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 20 29 7b  rror!=OE_None ){
12240 0a 20 20 20 20 69 6e 74 20 6a 31 2c 20 6a 32 3b  .    int j1, j2;
12250 0a 20 20 20 20 69 6e 74 20 72 65 67 52 6f 77 69  .    int regRowi
12260 64 3b 0a 0a 20 20 20 20 72 65 67 52 6f 77 69 64  d;..    regRowid
12270 20 3d 20 72 65 67 49 64 78 4b 65 79 20 2b 20 70   = regIdxKey + p
12280 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 0a  Index->nColumn;.
12290 20 20 20 20 6a 31 20 3d 20 73 71 6c 69 74 65 33      j1 = sqlite3
122a0 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
122b0 5f 49 73 4e 75 6c 6c 2c 20 72 65 67 49 64 78 4b  _IsNull, regIdxK
122c0 65 79 2c 20 30 2c 20 70 49 6e 64 65 78 2d 3e 6e  ey, 0, pIndex->n
122d0 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 6a 32 20  Column);.    j2 
122e0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
122f0 4f 70 34 28 76 2c 20 4f 50 5f 49 73 55 6e 69 71  Op4(v, OP_IsUniq
12300 75 65 2c 20 69 49 64 78 2c 0a 20 20 20 20 20 20  ue, iIdx,.      
12310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12320 20 20 20 20 20 30 2c 20 72 65 67 52 6f 77 69 64       0, regRowid
12330 2c 20 53 51 4c 49 54 45 5f 49 4e 54 5f 54 4f 5f  , SQLITE_INT_TO_
12340 50 54 52 28 72 65 67 52 65 63 6f 72 64 29 2c 20  PTR(regRecord), 
12350 50 34 5f 49 4e 54 33 32 29 3b 0a 20 20 20 20 73  P4_INT32);.    s
12360 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
12370 28 76 2c 20 4f 50 5f 48 61 6c 74 2c 20 53 51 4c  (v, OP_Halt, SQL
12380 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 2c 20  ITE_CONSTRAINT, 
12390 4f 45 5f 41 62 6f 72 74 2c 20 30 2c 0a 20 20 20  OE_Abort, 0,.   
123a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
123b0 20 22 69 6e 64 65 78 65 64 20 63 6f 6c 75 6d 6e   "indexed column
123c0 73 20 61 72 65 20 6e 6f 74 20 75 6e 69 71 75 65  s are not unique
123d0 22 2c 20 50 34 5f 53 54 41 54 49 43 29 3b 0a 20  ", P4_STATIC);. 
123e0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
123f0 6d 70 48 65 72 65 28 76 2c 20 6a 31 29 3b 0a 20  mpHere(v, j1);. 
12400 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
12410 6d 70 48 65 72 65 28 76 2c 20 6a 32 29 3b 0a 20  mpHere(v, j2);. 
12420 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65   }.  sqlite3Vdbe
12430 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78  AddOp2(v, OP_Idx
12440 49 6e 73 65 72 74 2c 20 69 49 64 78 2c 20 72 65  Insert, iIdx, re
12450 67 52 65 63 6f 72 64 29 3b 0a 20 20 73 71 6c 69  gRecord);.  sqli
12460 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
12470 67 28 70 50 61 72 73 65 2c 20 72 65 67 52 65 63  g(pParse, regRec
12480 6f 72 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  ord);.  sqlite3V
12490 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
124a0 4e 65 78 74 2c 20 69 54 61 62 2c 20 61 64 64 72  Next, iTab, addr
124b0 31 2b 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  1+1);.  sqlite3V
124c0 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61  dbeJumpHere(v, a
124d0 64 64 72 31 29 3b 0a 20 20 73 71 6c 69 74 65 33  ddr1);.  sqlite3
124e0 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
124f0 5f 43 6c 6f 73 65 2c 20 69 54 61 62 29 3b 0a 20  _Close, iTab);. 
12500 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
12510 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20  p1(v, OP_Close, 
12520 69 49 64 78 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  iIdx);.}../*.** 
12530 43 72 65 61 74 65 20 61 20 6e 65 77 20 69 6e 64  Create a new ind
12540 65 78 20 66 6f 72 20 61 6e 20 53 51 4c 20 74 61  ex for an SQL ta
12550 62 6c 65 2e 20 20 70 4e 61 6d 65 31 2e 70 4e 61  ble.  pName1.pNa
12560 6d 65 32 20 69 73 20 74 68 65 20 6e 61 6d 65 20  me2 is the name 
12570 6f 66 20 74 68 65 20 69 6e 64 65 78 20 0a 2a 2a  of the index .**
12580 20 61 6e 64 20 70 54 62 6c 4c 69 73 74 20 69 73   and pTblList is
12590 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
125a0 20 74 61 62 6c 65 20 74 68 61 74 20 69 73 20 74   table that is t
125b0 6f 20 62 65 20 69 6e 64 65 78 65 64 2e 20 20 42  o be indexed.  B
125c0 6f 74 68 20 77 69 6c 6c 20 0a 2a 2a 20 62 65 20  oth will .** be 
125d0 4e 55 4c 4c 20 66 6f 72 20 61 20 70 72 69 6d 61  NULL for a prima
125e0 72 79 20 6b 65 79 20 6f 72 20 61 6e 20 69 6e 64  ry key or an ind
125f0 65 78 20 74 68 61 74 20 69 73 20 63 72 65 61 74  ex that is creat
12600 65 64 20 74 6f 20 73 61 74 69 73 66 79 20 61 0a  ed to satisfy a.
12610 2a 2a 20 55 4e 49 51 55 45 20 63 6f 6e 73 74 72  ** UNIQUE constr
12620 61 69 6e 74 2e 20 20 49 66 20 70 54 61 62 6c 65  aint.  If pTable
12630 20 61 6e 64 20 70 49 6e 64 65 78 20 61 72 65 20   and pIndex are 
12640 4e 55 4c 4c 2c 20 75 73 65 20 70 50 61 72 73 65  NULL, use pParse
12650 2d 3e 70 4e 65 77 54 61 62 6c 65 0a 2a 2a 20 61  ->pNewTable.** a
12660 73 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20 62  s the table to b
12670 65 20 69 6e 64 65 78 65 64 2e 20 20 70 50 61 72  e indexed.  pPar
12680 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 69 73  se->pNewTable is
12690 20 61 20 74 61 62 6c 65 20 74 68 61 74 20 69 73   a table that is
126a0 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 62 65  .** currently be
126b0 69 6e 67 20 63 6f 6e 73 74 72 75 63 74 65 64 20  ing constructed 
126c0 62 79 20 61 20 43 52 45 41 54 45 20 54 41 42 4c  by a CREATE TABL
126d0 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a  E statement..**.
126e0 2a 2a 20 70 4c 69 73 74 20 69 73 20 61 20 6c 69  ** pList is a li
126f0 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 6f  st of columns to
12700 20 62 65 20 69 6e 64 65 78 65 64 2e 20 20 70 4c   be indexed.  pL
12710 69 73 74 20 77 69 6c 6c 20 62 65 20 4e 55 4c 4c  ist will be NULL
12720 20 69 66 20 74 68 69 73 0a 2a 2a 20 69 73 20 61   if this.** is a
12730 20 70 72 69 6d 61 72 79 20 6b 65 79 20 6f 72 20   primary key or 
12740 75 6e 69 71 75 65 2d 63 6f 6e 73 74 72 61 69 6e  unique-constrain
12750 74 20 6f 6e 20 74 68 65 20 6d 6f 73 74 20 72 65  t on the most re
12760 63 65 6e 74 20 63 6f 6c 75 6d 6e 20 61 64 64 65  cent column adde
12770 64 0a 2a 2a 20 74 6f 20 74 68 65 20 74 61 62 6c  d.** to the tabl
12780 65 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65  e currently unde
12790 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 20  r construction. 
127a0 20 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65   .*/.void sqlite
127b0 33 43 72 65 61 74 65 49 6e 64 65 78 28 0a 20 20  3CreateIndex(.  
127c0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
127d0 20 20 20 2f 2a 20 41 6c 6c 20 69 6e 66 6f 72 6d     /* All inform
127e0 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 69 73  ation about this
127f0 20 70 61 72 73 65 20 2a 2f 0a 20 20 54 6f 6b 65   parse */.  Toke
12800 6e 20 2a 70 4e 61 6d 65 31 2c 20 20 20 20 20 2f  n *pName1,     /
12810 2a 20 46 69 72 73 74 20 70 61 72 74 20 6f 66 20  * First part of 
12820 69 6e 64 65 78 20 6e 61 6d 65 2e 20 4d 61 79 20  index name. May 
12830 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 54 6f 6b  be NULL */.  Tok
12840 65 6e 20 2a 70 4e 61 6d 65 32 2c 20 20 20 20 20  en *pName2,     
12850 2f 2a 20 53 65 63 6f 6e 64 20 70 61 72 74 20 6f  /* Second part o
12860 66 20 69 6e 64 65 78 20 6e 61 6d 65 2e 20 4d 61  f index name. Ma
12870 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 53  y be NULL */.  S
12880 72 63 4c 69 73 74 20 2a 70 54 62 6c 4e 61 6d 65  rcList *pTblName
12890 2c 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20 69 6e  , /* Table to in
128a0 64 65 78 2e 20 55 73 65 20 70 50 61 72 73 65 2d  dex. Use pParse-
128b0 3e 70 4e 65 77 54 61 62 6c 65 20 69 66 20 30 20  >pNewTable if 0 
128c0 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
128d0 4c 69 73 74 2c 20 20 20 2f 2a 20 41 20 6c 69 73  List,   /* A lis
128e0 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 6f 20  t of columns to 
128f0 62 65 20 69 6e 64 65 78 65 64 20 2a 2f 0a 20 20  be indexed */.  
12900 69 6e 74 20 6f 6e 45 72 72 6f 72 2c 20 20 20 20  int onError,    
12910 20 20 20 2f 2a 20 4f 45 5f 41 62 6f 72 74 2c 20     /* OE_Abort, 
12920 4f 45 5f 49 67 6e 6f 72 65 2c 20 4f 45 5f 52 65  OE_Ignore, OE_Re
12930 70 6c 61 63 65 2c 20 6f 72 20 4f 45 5f 4e 6f 6e  place, or OE_Non
12940 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 53  e */.  Token *pS
12950 74 61 72 74 2c 20 20 20 20 20 2f 2a 20 54 68 65  tart,     /* The
12960 20 43 52 45 41 54 45 20 74 6f 6b 65 6e 20 74 68   CREATE token th
12970 61 74 20 62 65 67 69 6e 73 20 74 68 69 73 20 73  at begins this s
12980 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 54 6f  tatement */.  To
12990 6b 65 6e 20 2a 70 45 6e 64 2c 20 20 20 20 20 20  ken *pEnd,      
129a0 20 2f 2a 20 54 68 65 20 22 29 22 20 74 68 61 74   /* The ")" that
129b0 20 63 6c 6f 73 65 73 20 74 68 65 20 43 52 45 41   closes the CREA
129c0 54 45 20 49 4e 44 45 58 20 73 74 61 74 65 6d 65  TE INDEX stateme
129d0 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 73 6f 72 74  nt */.  int sort
129e0 4f 72 64 65 72 2c 20 20 20 20 20 2f 2a 20 53 6f  Order,     /* So
129f0 72 74 20 6f 72 64 65 72 20 6f 66 20 70 72 69 6d  rt order of prim
12a00 61 72 79 20 6b 65 79 20 77 68 65 6e 20 70 4c 69  ary key when pLi
12a10 73 74 3d 3d 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e  st==NULL */.  in
12a20 74 20 69 66 4e 6f 74 45 78 69 73 74 20 20 20 20  t ifNotExist    
12a30 20 2f 2a 20 4f 6d 69 74 20 65 72 72 6f 72 20 69   /* Omit error i
12a40 66 20 69 6e 64 65 78 20 61 6c 72 65 61 64 79 20  f index already 
12a50 65 78 69 73 74 73 20 2a 2f 0a 29 7b 0a 20 20 54  exists */.){.  T
12a60 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 30 3b 20  able *pTab = 0; 
12a70 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20      /* Table to 
12a80 62 65 20 69 6e 64 65 78 65 64 20 2a 2f 0a 20 20  be indexed */.  
12a90 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 20 3d 20  Index *pIndex = 
12aa0 30 3b 20 20 20 2f 2a 20 54 68 65 20 69 6e 64 65  0;   /* The inde
12ab0 78 20 74 6f 20 62 65 20 63 72 65 61 74 65 64 20  x to be created 
12ac0 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65  */.  char *zName
12ad0 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 4e 61 6d   = 0;     /* Nam
12ae0 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 2a  e of the index *
12af0 2f 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 3b 20 20  /.  int nName;  
12b00 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
12b10 65 72 20 6f 66 20 63 68 61 72 61 63 74 65 72 73  er of characters
12b20 20 69 6e 20 7a 4e 61 6d 65 20 2a 2f 0a 20 20 69   in zName */.  i
12b30 6e 74 20 69 2c 20 6a 3b 0a 20 20 54 6f 6b 65 6e  nt i, j;.  Token
12b40 20 6e 75 6c 6c 49 64 3b 20 20 20 20 20 20 20 20   nullId;        
12b50 2f 2a 20 46 61 6b 65 20 74 6f 6b 65 6e 20 66 6f  /* Fake token fo
12b60 72 20 61 6e 20 65 6d 70 74 79 20 49 44 20 6c 69  r an empty ID li
12b70 73 74 20 2a 2f 0a 20 20 44 62 46 69 78 65 72 20  st */.  DbFixer 
12b80 73 46 69 78 3b 20 20 20 20 20 20 20 20 2f 2a 20  sFix;        /* 
12b90 46 6f 72 20 61 73 73 69 67 6e 69 6e 67 20 64 61  For assigning da
12ba0 74 61 62 61 73 65 20 6e 61 6d 65 73 20 74 6f 20  tabase names to 
12bb0 70 54 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  pTable */.  int 
12bc0 73 6f 72 74 4f 72 64 65 72 4d 61 73 6b 3b 20 20  sortOrderMask;  
12bd0 20 2f 2a 20 31 20 74 6f 20 68 6f 6e 6f 72 20 44   /* 1 to honor D
12be0 45 53 43 20 69 6e 20 69 6e 64 65 78 2e 20 20 30  ESC in index.  0
12bf0 20 74 6f 20 69 67 6e 6f 72 65 2e 20 2a 2f 0a 20   to ignore. */. 
12c00 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
12c10 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 44 62 20  Parse->db;.  Db 
12c20 2a 70 44 62 3b 20 20 20 20 20 20 20 20 20 20 20  *pDb;           
12c30 20 20 2f 2a 20 54 68 65 20 73 70 65 63 69 66 69    /* The specifi
12c40 63 20 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e 69  c table containi
12c50 6e 67 20 74 68 65 20 69 6e 64 65 78 65 64 20 64  ng the indexed d
12c60 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 69 6e 74  atabase */.  int
12c70 20 69 44 62 3b 20 20 20 20 20 20 20 20 20 20 20   iDb;           
12c80 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74 68    /* Index of th
12c90 65 20 64 61 74 61 62 61 73 65 20 74 68 61 74 20  e database that 
12ca0 69 73 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e  is being written
12cb0 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61   */.  Token *pNa
12cc0 6d 65 20 3d 20 30 3b 20 20 20 20 2f 2a 20 55 6e  me = 0;    /* Un
12cd0 71 75 61 6c 69 66 69 65 64 20 6e 61 6d 65 20 6f  qualified name o
12ce0 66 20 74 68 65 20 69 6e 64 65 78 20 74 6f 20 63  f the index to c
12cf0 72 65 61 74 65 20 2a 2f 0a 20 20 73 74 72 75 63  reate */.  struc
12d00 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
12d10 2a 70 4c 69 73 74 49 74 65 6d 3b 20 2f 2a 20 46  *pListItem; /* F
12d20 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20  or looping over 
12d30 70 4c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20 6e  pList */.  int n
12d40 43 6f 6c 3b 0a 20 20 69 6e 74 20 6e 45 78 74 72  Col;.  int nExtr
12d50 61 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a 7a  a = 0;.  char *z
12d60 45 78 74 72 61 3b 0a 0a 20 20 69 66 28 20 70 50  Extra;..  if( pP
12d70 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 64 62  arse->nErr || db
12d80 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c  ->mallocFailed |
12d90 7c 20 49 4e 5f 44 45 43 4c 41 52 45 5f 56 54 41  | IN_DECLARE_VTA
12da0 42 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78  B ){.    goto ex
12db0 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
12dc0 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  .  }..  /*.  ** 
12dd0 46 69 6e 64 20 74 68 65 20 74 61 62 6c 65 20 74  Find the table t
12de0 68 61 74 20 69 73 20 74 6f 20 62 65 20 69 6e 64  hat is to be ind
12df0 65 78 65 64 2e 20 20 52 65 74 75 72 6e 20 65 61  exed.  Return ea
12e00 72 6c 79 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64  rly if not found
12e10 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 54 62  ..  */.  if( pTb
12e20 6c 4e 61 6d 65 21 3d 30 20 29 7b 0a 0a 20 20 20  lName!=0 ){..   
12e30 20 2f 2a 20 55 73 65 20 74 68 65 20 74 77 6f 2d   /* Use the two-
12e40 70 61 72 74 20 69 6e 64 65 78 20 6e 61 6d 65 20  part index name 
12e50 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65  to determine the
12e60 20 64 61 74 61 62 61 73 65 20 0a 20 20 20 20 2a   database .    *
12e70 2a 20 74 6f 20 73 65 61 72 63 68 20 66 6f 72 20  * to search for 
12e80 74 68 65 20 74 61 62 6c 65 2e 20 27 46 69 78 27  the table. 'Fix'
12e90 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20   the table name 
12ea0 74 6f 20 74 68 69 73 20 64 62 0a 20 20 20 20 2a  to this db.    *
12eb0 2a 20 62 65 66 6f 72 65 20 6c 6f 6f 6b 69 6e 67  * before looking
12ec0 20 75 70 20 74 68 65 20 74 61 62 6c 65 2e 0a 20   up the table.. 
12ed0 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74     */.    assert
12ee0 28 20 70 4e 61 6d 65 31 20 26 26 20 70 4e 61 6d  ( pName1 && pNam
12ef0 65 32 20 29 3b 0a 20 20 20 20 69 44 62 20 3d 20  e2 );.    iDb = 
12f00 73 71 6c 69 74 65 33 54 77 6f 50 61 72 74 4e 61  sqlite3TwoPartNa
12f10 6d 65 28 70 50 61 72 73 65 2c 20 70 4e 61 6d 65  me(pParse, pName
12f20 31 2c 20 70 4e 61 6d 65 32 2c 20 26 70 4e 61 6d  1, pName2, &pNam
12f30 65 29 3b 0a 20 20 20 20 69 66 28 20 69 44 62 3c  e);.    if( iDb<
12f40 30 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72  0 ) goto exit_cr
12f50 65 61 74 65 5f 69 6e 64 65 78 3b 0a 0a 23 69 66  eate_index;..#if
12f60 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
12f70 5f 54 45 4d 50 44 42 0a 20 20 20 20 2f 2a 20 49  _TEMPDB.    /* I
12f80 66 20 74 68 65 20 69 6e 64 65 78 20 6e 61 6d 65  f the index name
12f90 20 77 61 73 20 75 6e 71 75 61 6c 69 66 69 65 64   was unqualified
12fa0 2c 20 63 68 65 63 6b 20 69 66 20 74 68 65 20 74  , check if the t
12fb0 68 65 20 74 61 62 6c 65 0a 20 20 20 20 2a 2a 20  he table.    ** 
12fc0 69 73 20 61 20 74 65 6d 70 20 74 61 62 6c 65 2e  is a temp table.
12fd0 20 49 66 20 73 6f 2c 20 73 65 74 20 74 68 65 20   If so, set the 
12fe0 64 61 74 61 62 61 73 65 20 74 6f 20 31 2e 20 44  database to 1. D
12ff0 6f 20 6e 6f 74 20 64 6f 20 74 68 69 73 0a 20 20  o not do this.  
13000 20 20 2a 2a 20 69 66 20 69 6e 69 74 69 61 6c 69    ** if initiali
13010 73 69 6e 67 20 61 20 64 61 74 61 62 61 73 65 20  sing a database 
13020 73 63 68 65 6d 61 2e 0a 20 20 20 20 2a 2f 0a 20  schema..    */. 
13030 20 20 20 69 66 28 20 21 64 62 2d 3e 69 6e 69 74     if( !db->init
13040 2e 62 75 73 79 20 29 7b 0a 20 20 20 20 20 20 70  .busy ){.      p
13050 54 61 62 20 3d 20 73 71 6c 69 74 65 33 53 72 63  Tab = sqlite3Src
13060 4c 69 73 74 4c 6f 6f 6b 75 70 28 70 50 61 72 73  ListLookup(pPars
13070 65 2c 20 70 54 62 6c 4e 61 6d 65 29 3b 0a 20 20  e, pTblName);.  
13080 20 20 20 20 69 66 28 20 70 4e 61 6d 65 32 20 26      if( pName2 &
13090 26 20 70 4e 61 6d 65 32 2d 3e 6e 3d 3d 30 20 26  & pName2->n==0 &
130a0 26 20 70 54 61 62 20 26 26 20 70 54 61 62 2d 3e  & pTab && pTab->
130b0 70 53 63 68 65 6d 61 3d 3d 64 62 2d 3e 61 44 62  pSchema==db->aDb
130c0 5b 31 5d 2e 70 53 63 68 65 6d 61 20 29 7b 0a 20  [1].pSchema ){. 
130d0 20 20 20 20 20 20 20 69 44 62 20 3d 20 31 3b 0a         iDb = 1;.
130e0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65        }.    }.#e
130f0 6e 64 69 66 0a 0a 20 20 20 20 69 66 28 20 73 71  ndif..    if( sq
13100 6c 69 74 65 33 46 69 78 49 6e 69 74 28 26 73 46  lite3FixInit(&sF
13110 69 78 2c 20 70 50 61 72 73 65 2c 20 69 44 62 2c  ix, pParse, iDb,
13120 20 22 69 6e 64 65 78 22 2c 20 70 4e 61 6d 65 29   "index", pName)
13130 20 26 26 0a 20 20 20 20 20 20 20 20 73 71 6c 69   &&.        sqli
13140 74 65 33 46 69 78 53 72 63 4c 69 73 74 28 26 73  te3FixSrcList(&s
13150 46 69 78 2c 20 70 54 62 6c 4e 61 6d 65 29 0a 20  Fix, pTblName). 
13160 20 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 42     ){.      /* B
13170 65 63 61 75 73 65 20 74 68 65 20 70 61 72 73 65  ecause the parse
13180 72 20 63 6f 6e 73 74 72 75 63 74 73 20 70 54 62  r constructs pTb
13190 6c 4e 61 6d 65 20 66 72 6f 6d 20 61 20 73 69 6e  lName from a sin
131a0 67 6c 65 20 69 64 65 6e 74 69 66 69 65 72 2c 0a  gle identifier,.
131b0 20 20 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33        ** sqlite3
131c0 46 69 78 53 72 63 4c 69 73 74 20 63 61 6e 20 6e  FixSrcList can n
131d0 65 76 65 72 20 66 61 69 6c 2e 20 2a 2f 0a 20 20  ever fail. */.  
131e0 20 20 20 20 61 73 73 65 72 74 28 30 29 3b 0a 20      assert(0);. 
131f0 20 20 20 7d 0a 20 20 20 20 70 54 61 62 20 3d 20     }.    pTab = 
13200 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62  sqlite3LocateTab
13210 6c 65 28 70 50 61 72 73 65 2c 20 30 2c 20 70 54  le(pParse, 0, pT
13220 62 6c 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 4e 61  blName->a[0].zNa
13230 6d 65 2c 20 0a 20 20 20 20 20 20 20 20 70 54 62  me, .        pTb
13240 6c 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 44 61 74  lName->a[0].zDat
13250 61 62 61 73 65 29 3b 0a 20 20 20 20 69 66 28 20  abase);.    if( 
13260 21 70 54 61 62 20 7c 7c 20 64 62 2d 3e 6d 61 6c  !pTab || db->mal
13270 6c 6f 63 46 61 69 6c 65 64 20 29 20 67 6f 74 6f  locFailed ) goto
13280 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
13290 65 78 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ex;.    assert( 
132a0 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53 63  db->aDb[iDb].pSc
132b0 68 65 6d 61 3d 3d 70 54 61 62 2d 3e 70 53 63 68  hema==pTab->pSch
132c0 65 6d 61 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ema );.  }else{.
132d0 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 61 6d      assert( pNam
132e0 65 3d 3d 30 20 29 3b 0a 20 20 20 20 70 54 61 62  e==0 );.    pTab
132f0 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54   = pParse->pNewT
13300 61 62 6c 65 3b 0a 20 20 20 20 69 66 28 20 21 70  able;.    if( !p
13310 54 61 62 20 29 20 67 6f 74 6f 20 65 78 69 74 5f  Tab ) goto exit_
13320 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
13330 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53    iDb = sqlite3S
13340 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c  chemaToIndex(db,
13350 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b   pTab->pSchema);
13360 0a 20 20 7d 0a 20 20 70 44 62 20 3d 20 26 64 62  .  }.  pDb = &db
13370 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a 0a 20 20 69  ->aDb[iDb];..  i
13380 66 28 20 70 54 61 62 3d 3d 30 20 7c 7c 20 70 50  f( pTab==0 || pP
13390 61 72 73 65 2d 3e 6e 45 72 72 20 29 20 67 6f 74  arse->nErr ) got
133a0 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
133b0 64 65 78 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  dex;.  if( sqlit
133c0 65 33 53 74 72 4e 49 43 6d 70 28 70 54 61 62 2d  e3StrNICmp(pTab-
133d0 3e 7a 4e 61 6d 65 2c 20 22 73 71 6c 69 74 65 5f  >zName, "sqlite_
133e0 22 2c 20 37 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ", 7)==0 ){.    
133f0 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
13400 70 50 61 72 73 65 2c 20 22 74 61 62 6c 65 20 25  pParse, "table %
13410 73 20 6d 61 79 20 6e 6f 74 20 62 65 20 69 6e 64  s may not be ind
13420 65 78 65 64 22 2c 20 70 54 61 62 2d 3e 7a 4e 61  exed", pTab->zNa
13430 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78  me);.    goto ex
13440 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
13450 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c  .  }.#ifndef SQL
13460 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 20 20  ITE_OMIT_VIEW.  
13470 69 66 28 20 70 54 61 62 2d 3e 70 53 65 6c 65 63  if( pTab->pSelec
13480 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  t ){.    sqlite3
13490 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
134a0 20 22 76 69 65 77 73 20 6d 61 79 20 6e 6f 74 20   "views may not 
134b0 62 65 20 69 6e 64 65 78 65 64 22 29 3b 0a 20 20  be indexed");.  
134c0 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61    goto exit_crea
134d0 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 23 65  te_index;.  }.#e
134e0 6e 64 69 66 0a 23 69 66 6e 64 65 66 20 53 51 4c  ndif.#ifndef SQL
134f0 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
13500 54 41 42 4c 45 0a 20 20 69 66 28 20 49 73 56 69  TABLE.  if( IsVi
13510 72 74 75 61 6c 28 70 54 61 62 29 20 29 7b 0a 20  rtual(pTab) ){. 
13520 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
13530 73 67 28 70 50 61 72 73 65 2c 20 22 76 69 72 74  sg(pParse, "virt
13540 75 61 6c 20 74 61 62 6c 65 73 20 6d 61 79 20 6e  ual tables may n
13550 6f 74 20 62 65 20 69 6e 64 65 78 65 64 22 29 3b  ot be indexed");
13560 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63  .    goto exit_c
13570 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d  reate_index;.  }
13580 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 0a 20 20  .#endif..  /*.  
13590 2a 2a 20 46 69 6e 64 20 74 68 65 20 6e 61 6d 65  ** Find the name
135a0 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e 20 20   of the index.  
135b0 4d 61 6b 65 20 73 75 72 65 20 74 68 65 72 65 20  Make sure there 
135c0 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 61  is not already a
135d0 6e 6f 74 68 65 72 0a 20 20 2a 2a 20 69 6e 64 65  nother.  ** inde
135e0 78 20 6f 72 20 74 61 62 6c 65 20 77 69 74 68 20  x or table with 
135f0 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 2e 20 20  the same name.  
13600 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 78 63 65 70  .  **.  ** Excep
13610 74 69 6f 6e 3a 20 20 49 66 20 77 65 20 61 72 65  tion:  If we are
13620 20 72 65 61 64 69 6e 67 20 74 68 65 20 6e 61 6d   reading the nam
13630 65 73 20 6f 66 20 70 65 72 6d 61 6e 65 6e 74 20  es of permanent 
13640 69 6e 64 69 63 65 73 20 66 72 6f 6d 20 74 68 65  indices from the
13650 0a 20 20 2a 2a 20 73 71 6c 69 74 65 5f 6d 61 73  .  ** sqlite_mas
13660 74 65 72 20 74 61 62 6c 65 20 28 62 65 63 61 75  ter table (becau
13670 73 65 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 72  se some other pr
13680 6f 63 65 73 73 20 63 68 61 6e 67 65 64 20 74 68  ocess changed th
13690 65 20 73 63 68 65 6d 61 29 20 61 6e 64 0a 20 20  e schema) and.  
136a0 2a 2a 20 6f 6e 65 20 6f 66 20 74 68 65 20 69 6e  ** one of the in
136b0 64 65 78 20 6e 61 6d 65 73 20 63 6f 6c 6c 69 64  dex names collid
136c0 65 73 20 77 69 74 68 20 74 68 65 20 6e 61 6d 65  es with the name
136d0 20 6f 66 20 61 20 74 65 6d 70 6f 72 61 72 79 20   of a temporary 
136e0 74 61 62 6c 65 20 6f 72 0a 20 20 2a 2a 20 69 6e  table or.  ** in
136f0 64 65 78 2c 20 74 68 65 6e 20 77 65 20 77 69 6c  dex, then we wil
13700 6c 20 63 6f 6e 74 69 6e 75 65 20 74 6f 20 70 72  l continue to pr
13710 6f 63 65 73 73 20 74 68 69 73 20 69 6e 64 65 78  ocess this index
13720 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 70  ..  **.  ** If p
13730 4e 61 6d 65 3d 3d 30 20 69 74 20 6d 65 61 6e 73  Name==0 it means
13740 20 74 68 61 74 20 77 65 20 61 72 65 0a 20 20 2a   that we are.  *
13750 2a 20 64 65 61 6c 69 6e 67 20 77 69 74 68 20 61  * dealing with a
13760 20 70 72 69 6d 61 72 79 20 6b 65 79 20 6f 72 20   primary key or 
13770 55 4e 49 51 55 45 20 63 6f 6e 73 74 72 61 69 6e  UNIQUE constrain
13780 74 2e 20 20 57 65 20 68 61 76 65 20 74 6f 20 69  t.  We have to i
13790 6e 76 65 6e 74 20 6f 75 72 0a 20 20 2a 2a 20 6f  nvent our.  ** o
137a0 77 6e 20 6e 61 6d 65 2e 0a 20 20 2a 2f 0a 20 20  wn name..  */.  
137b0 69 66 28 20 70 4e 61 6d 65 20 29 7b 0a 20 20 20  if( pName ){.   
137c0 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33   zName = sqlite3
137d0 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62  NameFromToken(db
137e0 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66  , pName);.    if
137f0 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c  ( SQLITE_OK!=sql
13800 69 74 65 33 52 65 61 64 53 63 68 65 6d 61 28 70  ite3ReadSchema(p
13810 50 61 72 73 65 29 20 29 20 67 6f 74 6f 20 65 78  Parse) ) goto ex
13820 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
13830 0a 20 20 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d  .    if( zName==
13840 30 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72  0 ) goto exit_cr
13850 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20  eate_index;.    
13860 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73  if( SQLITE_OK!=s
13870 71 6c 69 74 65 33 43 68 65 63 6b 4f 62 6a 65 63  qlite3CheckObjec
13880 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 7a 4e  tName(pParse, zN
13890 61 6d 65 29 20 29 7b 0a 20 20 20 20 20 20 67 6f  ame) ){.      go
138a0 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
138b0 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ndex;.    }.    
138c0 69 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75  if( !db->init.bu
138d0 73 79 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  sy ){.      if( 
138e0 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74  SQLITE_OK!=sqlit
138f0 65 33 52 65 61 64 53 63 68 65 6d 61 28 70 50 61  e3ReadSchema(pPa
13900 72 73 65 29 20 29 20 67 6f 74 6f 20 65 78 69 74  rse) ) goto exit
13910 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
13920 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
13930 46 69 6e 64 54 61 62 6c 65 28 64 62 2c 20 7a 4e  FindTable(db, zN
13940 61 6d 65 2c 20 30 29 21 3d 30 20 29 7b 0a 20 20  ame, 0)!=0 ){.  
13950 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
13960 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74  orMsg(pParse, "t
13970 68 65 72 65 20 69 73 20 61 6c 72 65 61 64 79 20  here is already 
13980 61 20 74 61 62 6c 65 20 6e 61 6d 65 64 20 25 73  a table named %s
13990 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  ", zName);.     
139a0 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65     goto exit_cre
139b0 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 20  ate_index;.     
139c0 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
139d0 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 64 65   sqlite3FindInde
139e0 78 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 70 44 62  x(db, zName, pDb
139f0 2d 3e 7a 4e 61 6d 65 29 21 3d 30 20 29 7b 0a 20  ->zName)!=0 ){. 
13a00 20 20 20 20 20 69 66 28 20 21 69 66 4e 6f 74 45       if( !ifNotE
13a10 78 69 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20  xist ){.        
13a20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
13a30 70 50 61 72 73 65 2c 20 22 69 6e 64 65 78 20 25  pParse, "index %
13a40 73 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73  s already exists
13a50 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  ", zName);.     
13a60 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78   }.      goto ex
13a70 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
13a80 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
13a90 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 49      int n;.    I
13aa0 6e 64 65 78 20 2a 70 4c 6f 6f 70 3b 0a 20 20 20  ndex *pLoop;.   
13ab0 20 66 6f 72 28 70 4c 6f 6f 70 3d 70 54 61 62 2d   for(pLoop=pTab-
13ac0 3e 70 49 6e 64 65 78 2c 20 6e 3d 31 3b 20 70 4c  >pIndex, n=1; pL
13ad0 6f 6f 70 3b 20 70 4c 6f 6f 70 3d 70 4c 6f 6f 70  oop; pLoop=pLoop
13ae0 2d 3e 70 4e 65 78 74 2c 20 6e 2b 2b 29 7b 7d 0a  ->pNext, n++){}.
13af0 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69      zName = sqli
13b00 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22  te3MPrintf(db, "
13b10 73 71 6c 69 74 65 5f 61 75 74 6f 69 6e 64 65 78  sqlite_autoindex
13b20 5f 25 73 5f 25 64 22 2c 20 70 54 61 62 2d 3e 7a  _%s_%d", pTab->z
13b30 4e 61 6d 65 2c 20 6e 29 3b 0a 20 20 20 20 69 66  Name, n);.    if
13b40 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20  ( zName==0 ){.  
13b50 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72      goto exit_cr
13b60 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20  eate_index;.    
13b70 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63  }.  }..  /* Chec
13b80 6b 20 66 6f 72 20 61 75 74 68 6f 72 69 7a 61 74  k for authorizat
13b90 69 6f 6e 20 74 6f 20 63 72 65 61 74 65 20 61 6e  ion to create an
13ba0 20 69 6e 64 65 78 2e 0a 20 20 2a 2f 0a 23 69 66   index..  */.#if
13bb0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
13bc0 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20  _AUTHORIZATION. 
13bd0 20 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61   {.    const cha
13be0 72 20 2a 7a 44 62 20 3d 20 70 44 62 2d 3e 7a 4e  r *zDb = pDb->zN
13bf0 61 6d 65 3b 0a 20 20 20 20 69 66 28 20 73 71 6c  ame;.    if( sql
13c00 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50  ite3AuthCheck(pP
13c10 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 49 4e 53  arse, SQLITE_INS
13c20 45 52 54 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c  ERT, SCHEMA_TABL
13c30 45 28 69 44 62 29 2c 20 30 2c 20 7a 44 62 29 20  E(iDb), 0, zDb) 
13c40 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78  ){.      goto ex
13c50 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
13c60 0a 20 20 20 20 7d 0a 20 20 20 20 69 20 3d 20 53  .    }.    i = S
13c70 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 49 4e 44  QLITE_CREATE_IND
13c80 45 58 3b 0a 20 20 20 20 69 66 28 20 21 4f 4d 49  EX;.    if( !OMI
13c90 54 5f 54 45 4d 50 44 42 20 26 26 20 69 44 62 3d  T_TEMPDB && iDb=
13ca0 3d 31 20 29 20 69 20 3d 20 53 51 4c 49 54 45 5f  =1 ) i = SQLITE_
13cb0 43 52 45 41 54 45 5f 54 45 4d 50 5f 49 4e 44 45  CREATE_TEMP_INDE
13cc0 58 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  X;.    if( sqlit
13cd0 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72  e3AuthCheck(pPar
13ce0 73 65 2c 20 69 2c 20 7a 4e 61 6d 65 2c 20 70 54  se, i, zName, pT
13cf0 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 44 62 29 20  ab->zName, zDb) 
13d00 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78  ){.      goto ex
13d10 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
13d20 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
13d30 66 0a 0a 20 20 2f 2a 20 49 66 20 70 4c 69 73 74  f..  /* If pList
13d40 3d 3d 30 2c 20 69 74 20 6d 65 61 6e 73 20 74 68  ==0, it means th
13d50 69 73 20 72 6f 75 74 69 6e 65 20 77 61 73 20 63  is routine was c
13d60 61 6c 6c 65 64 20 74 6f 20 6d 61 6b 65 20 61 20  alled to make a 
13d70 70 72 69 6d 61 72 79 0a 20 20 2a 2a 20 6b 65 79  primary.  ** key
13d80 20 6f 75 74 20 6f 66 20 74 68 65 20 6c 61 73 74   out of the last
13d90 20 63 6f 6c 75 6d 6e 20 61 64 64 65 64 20 74 6f   column added to
13da0 20 74 68 65 20 74 61 62 6c 65 20 75 6e 64 65 72   the table under
13db0 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 20   construction.. 
13dc0 20 2a 2a 20 53 6f 20 63 72 65 61 74 65 20 61 20   ** So create a 
13dd0 66 61 6b 65 20 6c 69 73 74 20 74 6f 20 73 69 6d  fake list to sim
13de0 75 6c 61 74 65 20 74 68 69 73 2e 0a 20 20 2a 2f  ulate this..  */
13df0 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20  .  if( pList==0 
13e00 29 7b 0a 20 20 20 20 6e 75 6c 6c 49 64 2e 7a 20  ){.    nullId.z 
13e10 3d 20 28 75 38 2a 29 70 54 61 62 2d 3e 61 43 6f  = (u8*)pTab->aCo
13e20 6c 5b 70 54 61 62 2d 3e 6e 43 6f 6c 2d 31 5d 2e  l[pTab->nCol-1].
13e30 7a 4e 61 6d 65 3b 0a 20 20 20 20 6e 75 6c 6c 49  zName;.    nullI
13e40 64 2e 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72  d.n = sqlite3Str
13e50 6c 65 6e 33 30 28 28 63 68 61 72 2a 29 6e 75 6c  len30((char*)nul
13e60 6c 49 64 2e 7a 29 3b 0a 20 20 20 20 70 4c 69 73  lId.z);.    pLis
13e70 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  t = sqlite3ExprL
13e80 69 73 74 41 70 70 65 6e 64 28 70 50 61 72 73 65  istAppend(pParse
13e90 2c 20 30 2c 20 30 2c 20 26 6e 75 6c 6c 49 64 29  , 0, 0, &nullId)
13ea0 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 3d  ;.    if( pList=
13eb0 3d 30 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63  =0 ) goto exit_c
13ec0 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20  reate_index;.   
13ed0 20 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 73 6f 72   pList->a[0].sor
13ee0 74 4f 72 64 65 72 20 3d 20 28 75 38 29 73 6f 72  tOrder = (u8)sor
13ef0 74 4f 72 64 65 72 3b 0a 20 20 7d 0a 0a 20 20 2f  tOrder;.  }..  /
13f00 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68 6f 77  * Figure out how
13f10 20 6d 61 6e 79 20 62 79 74 65 73 20 6f 66 20 73   many bytes of s
13f20 70 61 63 65 20 61 72 65 20 72 65 71 75 69 72 65  pace are require
13f30 64 20 74 6f 20 73 74 6f 72 65 20 65 78 70 6c 69  d to store expli
13f40 63 69 74 6c 79 0a 20 20 2a 2a 20 73 70 65 63 69  citly.  ** speci
13f50 66 69 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 73  fied collation s
13f60 65 71 75 65 6e 63 65 20 6e 61 6d 65 73 2e 0a 20  equence names.. 
13f70 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   */.  for(i=0; i
13f80 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69  <pList->nExpr; i
13f90 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70  ++){.    Expr *p
13fa0 45 78 70 72 3b 0a 20 20 20 20 43 6f 6c 6c 53 65  Expr;.    CollSe
13fb0 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 20 20 69 66  q *pColl;.    if
13fc0 28 20 28 70 45 78 70 72 20 3d 20 70 4c 69 73 74  ( (pExpr = pList
13fd0 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 21 3d 30  ->a[i].pExpr)!=0
13fe0 20 26 26 20 28 70 43 6f 6c 6c 20 3d 20 70 45 78   && (pColl = pEx
13ff0 70 72 2d 3e 70 43 6f 6c 6c 29 21 3d 30 20 29 7b  pr->pColl)!=0 ){
14000 0a 20 20 20 20 20 20 6e 45 78 74 72 61 20 2b 3d  .      nExtra +=
14010 20 28 31 20 2b 20 73 71 6c 69 74 65 33 53 74 72   (1 + sqlite3Str
14020 6c 65 6e 33 30 28 70 43 6f 6c 6c 2d 3e 7a 4e 61  len30(pColl->zNa
14030 6d 65 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  me));.    }.  }.
14040 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 41 6c 6c 6f  .  /* .  ** Allo
14050 63 61 74 65 20 74 68 65 20 69 6e 64 65 78 20 73  cate the index s
14060 74 72 75 63 74 75 72 65 2e 20 0a 20 20 2a 2f 0a  tructure. .  */.
14070 20 20 6e 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65    nName = sqlite
14080 33 53 74 72 6c 65 6e 33 30 28 7a 4e 61 6d 65 29  3Strlen30(zName)
14090 3b 0a 20 20 6e 43 6f 6c 20 3d 20 70 4c 69 73 74  ;.  nCol = pList
140a0 2d 3e 6e 45 78 70 72 3b 0a 20 20 70 49 6e 64 65  ->nExpr;.  pInde
140b0 78 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  x = sqlite3DbMal
140c0 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 0a 20 20 20  locZero(db, .   
140d0 20 20 20 73 69 7a 65 6f 66 28 49 6e 64 65 78 29     sizeof(Index)
140e0 20 2b 20 20 20 20 20 20 20 20 20 20 20 20 20 20   +              
140f0 2f 2a 20 49 6e 64 65 78 20 73 74 72 75 63 74 75  /* Index structu
14100 72 65 20 20 2a 2f 0a 20 20 20 20 20 20 73 69 7a  re  */.      siz
14110 65 6f 66 28 69 6e 74 29 2a 6e 43 6f 6c 20 2b 20  eof(int)*nCol + 
14120 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
14130 65 78 2e 61 69 43 6f 6c 75 6d 6e 20 20 20 2a 2f  ex.aiColumn   */
14140 0a 20 20 20 20 20 20 73 69 7a 65 6f 66 28 69 6e  .      sizeof(in
14150 74 29 2a 28 6e 43 6f 6c 2b 31 29 20 2b 20 20 20  t)*(nCol+1) +   
14160 20 20 20 20 2f 2a 20 49 6e 64 65 78 2e 61 69 52      /* Index.aiR
14170 6f 77 45 73 74 20 20 20 2a 2f 0a 20 20 20 20 20  owEst   */.     
14180 20 73 69 7a 65 6f 66 28 63 68 61 72 20 2a 29 2a   sizeof(char *)*
14190 6e 43 6f 6c 20 2b 20 20 20 20 20 20 20 20 2f 2a  nCol +        /*
141a0 20 49 6e 64 65 78 2e 61 7a 43 6f 6c 6c 20 20 20   Index.azColl   
141b0 20 20 2a 2f 0a 20 20 20 20 20 20 73 69 7a 65 6f    */.      sizeo
141c0 66 28 75 38 29 2a 6e 43 6f 6c 20 2b 20 20 20 20  f(u8)*nCol +    
141d0 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
141e0 2e 61 53 6f 72 74 4f 72 64 65 72 20 2a 2f 0a 20  .aSortOrder */. 
141f0 20 20 20 20 20 6e 4e 61 6d 65 20 2b 20 31 20 2b       nName + 1 +
14200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14210 20 20 2f 2a 20 49 6e 64 65 78 2e 7a 4e 61 6d 65    /* Index.zName
14220 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 6e        */.      n
14230 45 78 74 72 61 20 20 20 20 20 20 20 20 20 20 20  Extra           
14240 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
14250 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
14260 65 20 6e 61 6d 65 73 20 2a 2f 0a 20 20 29 3b 0a  e names */.  );.
14270 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
14280 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f  Failed ){.    go
14290 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
142a0 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 70 49 6e 64  ndex;.  }.  pInd
142b0 65 78 2d 3e 61 7a 43 6f 6c 6c 20 3d 20 28 63 68  ex->azColl = (ch
142c0 61 72 2a 2a 29 28 26 70 49 6e 64 65 78 5b 31 5d  ar**)(&pIndex[1]
142d0 29 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 61 69 43  );.  pIndex->aiC
142e0 6f 6c 75 6d 6e 20 3d 20 28 69 6e 74 20 2a 29 28  olumn = (int *)(
142f0 26 70 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c 5b  &pIndex->azColl[
14300 6e 43 6f 6c 5d 29 3b 0a 20 20 70 49 6e 64 65 78  nCol]);.  pIndex
14310 2d 3e 61 69 52 6f 77 45 73 74 20 3d 20 28 75 6e  ->aiRowEst = (un
14320 73 69 67 6e 65 64 20 2a 29 28 26 70 49 6e 64 65  signed *)(&pInde
14330 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 43 6f 6c  x->aiColumn[nCol
14340 5d 29 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 61 53  ]);.  pIndex->aS
14350 6f 72 74 4f 72 64 65 72 20 3d 20 28 75 38 20 2a  ortOrder = (u8 *
14360 29 28 26 70 49 6e 64 65 78 2d 3e 61 69 52 6f 77  )(&pIndex->aiRow
14370 45 73 74 5b 6e 43 6f 6c 2b 31 5d 29 3b 0a 20 20  Est[nCol+1]);.  
14380 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 20 3d 20  pIndex->zName = 
14390 28 63 68 61 72 20 2a 29 28 26 70 49 6e 64 65 78  (char *)(&pIndex
143a0 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 6e 43 6f  ->aSortOrder[nCo
143b0 6c 5d 29 3b 0a 20 20 7a 45 78 74 72 61 20 3d 20  l]);.  zExtra = 
143c0 28 63 68 61 72 20 2a 29 28 26 70 49 6e 64 65 78  (char *)(&pIndex
143d0 2d 3e 7a 4e 61 6d 65 5b 6e 4e 61 6d 65 2b 31 5d  ->zName[nName+1]
143e0 29 3b 0a 20 20 6d 65 6d 63 70 79 28 70 49 6e 64  );.  memcpy(pInd
143f0 65 78 2d 3e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65  ex->zName, zName
14400 2c 20 6e 4e 61 6d 65 2b 31 29 3b 0a 20 20 70 49  , nName+1);.  pI
14410 6e 64 65 78 2d 3e 70 54 61 62 6c 65 20 3d 20 70  ndex->pTable = p
14420 54 61 62 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 6e  Tab;.  pIndex->n
14430 43 6f 6c 75 6d 6e 20 3d 20 70 4c 69 73 74 2d 3e  Column = pList->
14440 6e 45 78 70 72 3b 0a 20 20 70 49 6e 64 65 78 2d  nExpr;.  pIndex-
14450 3e 6f 6e 45 72 72 6f 72 20 3d 20 28 75 38 29 6f  >onError = (u8)o
14460 6e 45 72 72 6f 72 3b 0a 20 20 70 49 6e 64 65 78  nError;.  pIndex
14470 2d 3e 61 75 74 6f 49 6e 64 65 78 20 3d 20 28 75  ->autoIndex = (u
14480 38 29 28 70 4e 61 6d 65 3d 3d 30 29 3b 0a 20 20  8)(pName==0);.  
14490 70 49 6e 64 65 78 2d 3e 70 53 63 68 65 6d 61 20  pIndex->pSchema 
144a0 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70  = db->aDb[iDb].p
144b0 53 63 68 65 6d 61 3b 0a 0a 20 20 2f 2a 20 43 68  Schema;..  /* Ch
144c0 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 77 65  eck to see if we
144d0 20 73 68 6f 75 6c 64 20 68 6f 6e 6f 72 20 44 45   should honor DE
144e0 53 43 20 72 65 71 75 65 73 74 73 20 6f 6e 20 69  SC requests on i
144f0 6e 64 65 78 20 63 6f 6c 75 6d 6e 73 0a 20 20 2a  ndex columns.  *
14500 2f 0a 20 20 69 66 28 20 70 44 62 2d 3e 70 53 63  /.  if( pDb->pSc
14510 68 65 6d 61 2d 3e 66 69 6c 65 5f 66 6f 72 6d 61  hema->file_forma
14520 74 3e 3d 34 20 29 7b 0a 20 20 20 20 73 6f 72 74  t>=4 ){.    sort
14530 4f 72 64 65 72 4d 61 73 6b 20 3d 20 2d 31 3b 20  OrderMask = -1; 
14540 20 20 2f 2a 20 48 6f 6e 6f 72 20 44 45 53 43 20    /* Honor DESC 
14550 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  */.  }else{.    
14560 73 6f 72 74 4f 72 64 65 72 4d 61 73 6b 20 3d 20  sortOrderMask = 
14570 30 3b 20 20 20 20 2f 2a 20 49 67 6e 6f 72 65 20  0;    /* Ignore 
14580 44 45 53 43 20 2a 2f 0a 20 20 7d 0a 0a 20 20 2f  DESC */.  }..  /
14590 2a 20 53 63 61 6e 20 74 68 65 20 6e 61 6d 65 73  * Scan the names
145a0 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20   of the columns 
145b0 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20  of the table to 
145c0 62 65 20 69 6e 64 65 78 65 64 20 61 6e 64 0a 20  be indexed and. 
145d0 20 2a 2a 20 6c 6f 61 64 20 74 68 65 20 63 6f 6c   ** load the col
145e0 75 6d 6e 20 69 6e 64 69 63 65 73 20 69 6e 74 6f  umn indices into
145f0 20 74 68 65 20 49 6e 64 65 78 20 73 74 72 75 63   the Index struc
14600 74 75 72 65 2e 20 20 52 65 70 6f 72 74 20 61 6e  ture.  Report an
14610 20 65 72 72 6f 72 0a 20 20 2a 2a 20 69 66 20 61   error.  ** if a
14620 6e 79 20 63 6f 6c 75 6d 6e 20 69 73 20 6e 6f 74  ny column is not
14630 20 66 6f 75 6e 64 2e 0a 20 20 2a 2f 0a 20 20 66   found..  */.  f
14640 6f 72 28 69 3d 30 2c 20 70 4c 69 73 74 49 74 65  or(i=0, pListIte
14650 6d 3d 70 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 4c  m=pList->a; i<pL
14660 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 2c  ist->nExpr; i++,
14670 20 70 4c 69 73 74 49 74 65 6d 2b 2b 29 7b 0a 20   pListItem++){. 
14680 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
14690 43 6f 6c 4e 61 6d 65 20 3d 20 70 4c 69 73 74 49  ColName = pListI
146a0 74 65 6d 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20  tem->zName;.    
146b0 43 6f 6c 75 6d 6e 20 2a 70 54 61 62 43 6f 6c 3b  Column *pTabCol;
146c0 0a 20 20 20 20 69 6e 74 20 72 65 71 75 65 73 74  .    int request
146d0 65 64 53 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20  edSortOrder;.   
146e0 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 3b 20 20 20   char *zColl;   
146f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14700 2f 2a 20 43 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  /* Collation seq
14710 75 65 6e 63 65 20 6e 61 6d 65 20 2a 2f 0a 0a 20  uence name */.. 
14720 20 20 20 66 6f 72 28 6a 3d 30 2c 20 70 54 61 62     for(j=0, pTab
14730 43 6f 6c 3d 70 54 61 62 2d 3e 61 43 6f 6c 3b 20  Col=pTab->aCol; 
14740 6a 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b  j<pTab->nCol; j+
14750 2b 2c 20 70 54 61 62 43 6f 6c 2b 2b 29 7b 0a 20  +, pTabCol++){. 
14760 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
14770 53 74 72 49 43 6d 70 28 7a 43 6f 6c 4e 61 6d 65  StrICmp(zColName
14780 2c 20 70 54 61 62 43 6f 6c 2d 3e 7a 4e 61 6d 65  , pTabCol->zName
14790 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  )==0 ) break;.  
147a0 20 20 7d 0a 20 20 20 20 69 66 28 20 6a 3e 3d 70    }.    if( j>=p
147b0 54 61 62 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20  Tab->nCol ){.   
147c0 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
147d0 73 67 28 70 50 61 72 73 65 2c 20 22 74 61 62 6c  sg(pParse, "tabl
147e0 65 20 25 73 20 68 61 73 20 6e 6f 20 63 6f 6c 75  e %s has no colu
147f0 6d 6e 20 6e 61 6d 65 64 20 25 73 22 2c 0a 20 20  mn named %s",.  
14800 20 20 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d        pTab->zNam
14810 65 2c 20 7a 43 6f 6c 4e 61 6d 65 29 3b 0a 20 20  e, zColName);.  
14820 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72      goto exit_cr
14830 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20  eate_index;.    
14840 7d 0a 20 20 20 20 2f 2a 20 54 4f 44 4f 3a 20 20  }.    /* TODO:  
14850 41 64 64 20 61 20 74 65 73 74 20 74 6f 20 6d 61  Add a test to ma
14860 6b 65 20 73 75 72 65 20 74 68 61 74 20 74 68 65  ke sure that the
14870 20 73 61 6d 65 20 63 6f 6c 75 6d 6e 20 69 73 20   same column is 
14880 6e 6f 74 20 6e 61 6d 65 64 0a 20 20 20 20 2a 2a  not named.    **
14890 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 63 65 20   more than once 
148a0 77 69 74 68 69 6e 20 74 68 65 20 73 61 6d 65 20  within the same 
148b0 69 6e 64 65 78 2e 20 20 4f 6e 6c 79 20 74 68 65  index.  Only the
148c0 20 66 69 72 73 74 20 69 6e 73 74 61 6e 63 65 20   first instance 
148d0 6f 66 0a 20 20 20 20 2a 2a 20 74 68 65 20 63 6f  of.    ** the co
148e0 6c 75 6d 6e 20 77 69 6c 6c 20 65 76 65 72 20 62  lumn will ever b
148f0 65 20 75 73 65 64 20 62 79 20 74 68 65 20 6f 70  e used by the op
14900 74 69 6d 69 7a 65 72 2e 20 20 4e 6f 74 65 20 74  timizer.  Note t
14910 68 61 74 20 75 73 69 6e 67 20 74 68 65 0a 20 20  hat using the.  
14920 20 20 2a 2a 20 73 61 6d 65 20 63 6f 6c 75 6d 6e    ** same column
14930 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 63 65 20   more than once 
14940 63 61 6e 6e 6f 74 20 62 65 20 61 6e 20 65 72 72  cannot be an err
14950 6f 72 20 62 65 63 61 75 73 65 20 74 68 61 74 20  or because that 
14960 77 6f 75 6c 64 20 0a 20 20 20 20 2a 2a 20 62 72  would .    ** br
14970 65 61 6b 20 62 61 63 6b 77 61 72 64 73 20 63 6f  eak backwards co
14980 6d 70 61 74 69 62 69 6c 69 74 79 20 2d 20 69 74  mpatibility - it
14990 20 6e 65 65 64 73 20 74 6f 20 62 65 20 61 20 77   needs to be a w
149a0 61 72 6e 69 6e 67 2e 0a 20 20 20 20 2a 2f 0a 20  arning..    */. 
149b0 20 20 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c     pIndex->aiCol
149c0 75 6d 6e 5b 69 5d 20 3d 20 6a 3b 0a 20 20 20 20  umn[i] = j;.    
149d0 69 66 28 20 70 4c 69 73 74 49 74 65 6d 2d 3e 70  if( pListItem->p
149e0 45 78 70 72 20 26 26 20 70 4c 69 73 74 49 74 65  Expr && pListIte
149f0 6d 2d 3e 70 45 78 70 72 2d 3e 70 43 6f 6c 6c 20  m->pExpr->pColl 
14a00 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
14a10 20 70 4c 69 73 74 49 74 65 6d 2d 3e 70 45 78 70   pListItem->pExp
14a20 72 2d 3e 70 43 6f 6c 6c 20 29 3b 0a 20 20 20 20  r->pColl );.    
14a30 20 20 7a 43 6f 6c 6c 20 3d 20 7a 45 78 74 72 61    zColl = zExtra
14a40 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
14a50 73 6e 70 72 69 6e 74 66 28 6e 45 78 74 72 61 2c  snprintf(nExtra,
14a60 20 7a 45 78 74 72 61 2c 20 22 25 73 22 2c 20 70   zExtra, "%s", p
14a70 4c 69 73 74 49 74 65 6d 2d 3e 70 45 78 70 72 2d  ListItem->pExpr-
14a80 3e 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a  >pColl->zName);.
14a90 20 20 20 20 20 20 7a 45 78 74 72 61 20 2b 3d 20        zExtra += 
14aa0 28 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30  (sqlite3Strlen30
14ab0 28 7a 43 6f 6c 6c 29 20 2b 20 31 29 3b 0a 20 20  (zColl) + 1);.  
14ac0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a    }else{.      z
14ad0 43 6f 6c 6c 20 3d 20 70 54 61 62 2d 3e 61 43 6f  Coll = pTab->aCo
14ae0 6c 5b 6a 5d 2e 7a 43 6f 6c 6c 3b 0a 20 20 20 20  l[j].zColl;.    
14af0 20 20 69 66 28 20 21 7a 43 6f 6c 6c 20 29 7b 0a    if( !zColl ){.
14b00 20 20 20 20 20 20 20 20 7a 43 6f 6c 6c 20 3d 20          zColl = 
14b10 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 2d 3e 7a  db->pDfltColl->z
14b20 4e 61 6d 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Name;.      }.  
14b30 20 20 7d 0a 20 20 20 20 69 66 28 20 21 64 62 2d    }.    if( !db-
14b40 3e 69 6e 69 74 2e 62 75 73 79 20 26 26 20 21 73  >init.busy && !s
14b50 71 6c 69 74 65 33 4c 6f 63 61 74 65 43 6f 6c 6c  qlite3LocateColl
14b60 53 65 71 28 70 50 61 72 73 65 2c 20 7a 43 6f 6c  Seq(pParse, zCol
14b70 6c 2c 20 2d 31 29 20 29 7b 0a 20 20 20 20 20 20  l, -1) ){.      
14b80 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
14b90 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20  _index;.    }.  
14ba0 20 20 70 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c    pIndex->azColl
14bb0 5b 69 5d 20 3d 20 7a 43 6f 6c 6c 3b 0a 20 20 20  [i] = zColl;.   
14bc0 20 72 65 71 75 65 73 74 65 64 53 6f 72 74 4f 72   requestedSortOr
14bd0 64 65 72 20 3d 20 70 4c 69 73 74 49 74 65 6d 2d  der = pListItem-
14be0 3e 73 6f 72 74 4f 72 64 65 72 20 26 20 73 6f 72  >sortOrder & sor
14bf0 74 4f 72 64 65 72 4d 61 73 6b 3b 0a 20 20 20 20  tOrderMask;.    
14c00 70 49 6e 64 65 78 2d 3e 61 53 6f 72 74 4f 72 64  pIndex->aSortOrd
14c10 65 72 5b 69 5d 20 3d 20 28 75 38 29 72 65 71 75  er[i] = (u8)requ
14c20 65 73 74 65 64 53 6f 72 74 4f 72 64 65 72 3b 0a  estedSortOrder;.
14c30 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44 65 66    }.  sqlite3Def
14c40 61 75 6c 74 52 6f 77 45 73 74 28 70 49 6e 64 65  aultRowEst(pInde
14c50 78 29 3b 0a 0a 20 20 69 66 28 20 70 54 61 62 3d  x);..  if( pTab=
14c60 3d 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62  =pParse->pNewTab
14c70 6c 65 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69  le ){.    /* Thi
14c80 73 20 72 6f 75 74 69 6e 65 20 68 61 73 20 62 65  s routine has be
14c90 65 6e 20 63 61 6c 6c 65 64 20 74 6f 20 63 72 65  en called to cre
14ca0 61 74 65 20 61 6e 20 61 75 74 6f 6d 61 74 69 63  ate an automatic
14cb0 20 69 6e 64 65 78 20 61 73 20 61 0a 20 20 20 20   index as a.    
14cc0 2a 2a 20 72 65 73 75 6c 74 20 6f 66 20 61 20 50  ** result of a P
14cd0 52 49 4d 41 52 59 20 4b 45 59 20 6f 72 20 55 4e  RIMARY KEY or UN
14ce0 49 51 55 45 20 63 6c 61 75 73 65 20 6f 6e 20 61  IQUE clause on a
14cf0 20 63 6f 6c 75 6d 6e 20 64 65 66 69 6e 69 74 69   column definiti
14d00 6f 6e 2c 20 6f 72 0a 20 20 20 20 2a 2a 20 61 20  on, or.    ** a 
14d10 50 52 49 4d 41 52 59 20 4b 45 59 20 6f 72 20 55  PRIMARY KEY or U
14d20 4e 49 51 55 45 20 63 6c 61 75 73 65 20 66 6f 6c  NIQUE clause fol
14d30 6c 6f 77 69 6e 67 20 74 68 65 20 63 6f 6c 75 6d  lowing the colum
14d40 6e 20 64 65 66 69 6e 69 74 69 6f 6e 73 2e 0a 20  n definitions.. 
14d50 20 20 20 2a 2a 20 69 2e 65 2e 20 6f 6e 65 20 6f     ** i.e. one o
14d60 66 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  f:.    **.    **
14d70 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 28   CREATE TABLE t(
14d80 78 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 79  x PRIMARY KEY, y
14d90 29 3b 0a 20 20 20 20 2a 2a 20 43 52 45 41 54 45  );.    ** CREATE
14da0 20 54 41 42 4c 45 20 74 28 78 2c 20 79 2c 20 55   TABLE t(x, y, U
14db0 4e 49 51 55 45 28 78 2c 20 79 29 29 3b 0a 20 20  NIQUE(x, y));.  
14dc0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 45 69 74 68    **.    ** Eith
14dd0 65 72 20 77 61 79 2c 20 63 68 65 63 6b 20 74 6f  er way, check to
14de0 20 73 65 65 20 69 66 20 74 68 65 20 74 61 62 6c   see if the tabl
14df0 65 20 61 6c 72 65 61 64 79 20 68 61 73 20 73 75  e already has su
14e00 63 68 20 61 6e 20 69 6e 64 65 78 2e 20 49 66 0a  ch an index. If.
14e10 20 20 20 20 2a 2a 20 73 6f 2c 20 64 6f 6e 27 74      ** so, don't
14e20 20 62 6f 74 68 65 72 20 63 72 65 61 74 69 6e 67   bother creating
14e30 20 74 68 69 73 20 6f 6e 65 2e 20 54 68 69 73 20   this one. This 
14e40 6f 6e 6c 79 20 61 70 70 6c 69 65 73 20 74 6f 0a  only applies to.
14e50 20 20 20 20 2a 2a 20 61 75 74 6f 6d 61 74 69 63      ** automatic
14e60 61 6c 6c 79 20 63 72 65 61 74 65 64 20 69 6e 64  ally created ind
14e70 69 63 65 73 2e 20 55 73 65 72 73 20 63 61 6e 20  ices. Users can 
14e80 64 6f 20 61 73 20 74 68 65 79 20 77 69 73 68 20  do as they wish 
14e90 77 69 74 68 0a 20 20 20 20 2a 2a 20 65 78 70 6c  with.    ** expl
14ea0 69 63 69 74 20 69 6e 64 69 63 65 73 2e 0a 20 20  icit indices..  
14eb0 20 20 2a 2f 0a 20 20 20 20 49 6e 64 65 78 20 2a    */.    Index *
14ec0 70 49 64 78 3b 0a 20 20 20 20 66 6f 72 28 70 49  pIdx;.    for(pI
14ed0 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b  dx=pTab->pIndex;
14ee0 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78   pIdx; pIdx=pIdx
14ef0 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20  ->pNext){.      
14f00 69 6e 74 20 6b 3b 0a 20 20 20 20 20 20 61 73 73  int k;.      ass
14f10 65 72 74 28 20 70 49 64 78 2d 3e 6f 6e 45 72 72  ert( pIdx->onErr
14f20 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 20 29 3b 0a 20  or!=OE_None );. 
14f30 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49 64       assert( pId
14f40 78 2d 3e 61 75 74 6f 49 6e 64 65 78 20 29 3b 0a  x->autoIndex );.
14f50 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49        assert( pI
14f60 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f  ndex->onError!=O
14f70 45 5f 4e 6f 6e 65 20 29 3b 0a 0a 20 20 20 20 20  E_None );..     
14f80 20 69 66 28 20 70 49 64 78 2d 3e 6e 43 6f 6c 75   if( pIdx->nColu
14f90 6d 6e 21 3d 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c  mn!=pIndex->nCol
14fa0 75 6d 6e 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  umn ) continue;.
14fb0 20 20 20 20 20 20 66 6f 72 28 6b 3d 30 3b 20 6b        for(k=0; k
14fc0 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20  <pIdx->nColumn; 
14fd0 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 63 6f  k++){.        co
14fe0 6e 73 74 20 63 68 61 72 20 2a 7a 31 20 3d 20 70  nst char *z1 = p
14ff0 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6b 5d 3b 0a  Idx->azColl[k];.
15000 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68          const ch
15010 61 72 20 2a 7a 32 20 3d 20 70 49 6e 64 65 78 2d  ar *z2 = pIndex-
15020 3e 61 7a 43 6f 6c 6c 5b 6b 5d 3b 0a 20 20 20 20  >azColl[k];.    
15030 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 61 69      if( pIdx->ai
15040 43 6f 6c 75 6d 6e 5b 6b 5d 21 3d 70 49 6e 64 65  Column[k]!=pInde
15050 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6b 5d 20 29  x->aiColumn[k] )
15060 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
15070 69 66 28 20 70 49 64 78 2d 3e 61 53 6f 72 74 4f  if( pIdx->aSortO
15080 72 64 65 72 5b 6b 5d 21 3d 70 49 6e 64 65 78 2d  rder[k]!=pIndex-
15090 3e 61 53 6f 72 74 4f 72 64 65 72 5b 6b 5d 20 29  >aSortOrder[k] )
150a0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
150b0 69 66 28 20 7a 31 21 3d 7a 32 20 26 26 20 73 71  if( z1!=z2 && sq
150c0 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 31 2c  lite3StrICmp(z1,
150d0 20 7a 32 29 20 29 20 62 72 65 61 6b 3b 0a 20 20   z2) ) break;.  
150e0 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
150f0 6b 3d 3d 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e  k==pIdx->nColumn
15100 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
15110 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d 70  pIdx->onError!=p
15120 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 20 29  Index->onError )
15130 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  {.          /* T
15140 68 69 73 20 63 6f 6e 73 74 72 61 69 6e 74 20 63  his constraint c
15150 72 65 61 74 65 73 20 74 68 65 20 73 61 6d 65 20  reates the same 
15160 69 6e 64 65 78 20 61 73 20 61 20 70 72 65 76 69  index as a previ
15170 6f 75 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ous.          **
15180 20 63 6f 6e 73 74 72 61 69 6e 74 20 73 70 65 63   constraint spec
15190 69 66 69 65 64 20 73 6f 6d 65 77 68 65 72 65 20  ified somewhere 
151a0 69 6e 20 74 68 65 20 43 52 45 41 54 45 20 54 41  in the CREATE TA
151b0 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20  BLE statement.. 
151c0 20 20 20 20 20 20 20 20 20 2a 2a 20 48 6f 77 65           ** Howe
151d0 76 65 72 20 74 68 65 20 4f 4e 20 43 4f 4e 46 4c  ver the ON CONFL
151e0 49 43 54 20 63 6c 61 75 73 65 73 20 61 72 65 20  ICT clauses are 
151f0 64 69 66 66 65 72 65 6e 74 2e 20 49 66 20 62 6f  different. If bo
15200 74 68 20 74 68 69 73 20 0a 20 20 20 20 20 20 20  th this .       
15210 20 20 20 2a 2a 20 63 6f 6e 73 74 72 61 69 6e 74     ** constraint
15220 20 61 6e 64 20 74 68 65 20 70 72 65 76 69 6f 75   and the previou
15230 73 20 65 71 75 69 76 61 6c 65 6e 74 20 63 6f 6e  s equivalent con
15240 73 74 72 61 69 6e 74 20 68 61 76 65 20 65 78 70  straint have exp
15250 6c 69 63 69 74 0a 20 20 20 20 20 20 20 20 20 20  licit.          
15260 2a 2a 20 4f 4e 20 43 4f 4e 46 4c 49 43 54 20 63  ** ON CONFLICT c
15270 6c 61 75 73 65 73 20 74 68 69 73 20 69 73 20 61  lauses this is a
15280 6e 20 65 72 72 6f 72 2e 20 4f 74 68 65 72 77 69  n error. Otherwi
15290 73 65 2c 20 75 73 65 20 74 68 65 0a 20 20 20 20  se, use the.    
152a0 20 20 20 20 20 20 2a 2a 20 65 78 70 6c 69 63 69        ** explici
152b0 74 6c 79 20 73 70 65 63 69 66 69 65 64 20 62 65  tly specified be
152c0 68 61 76 69 6f 75 72 20 66 6f 72 20 74 68 65 20  haviour for the 
152d0 69 6e 64 65 78 2e 0a 20 20 20 20 20 20 20 20 20  index..         
152e0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66   */.          if
152f0 28 20 21 28 70 49 64 78 2d 3e 6f 6e 45 72 72 6f  ( !(pIdx->onErro
15300 72 3d 3d 4f 45 5f 44 65 66 61 75 6c 74 20 7c 7c  r==OE_Default ||
15310 20 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72   pIndex->onError
15320 3d 3d 4f 45 5f 44 65 66 61 75 6c 74 29 20 29 7b  ==OE_Default) ){
15330 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
15340 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
15350 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20  rse, .          
15360 20 20 20 20 20 20 22 63 6f 6e 66 6c 69 63 74 69        "conflicti
15370 6e 67 20 4f 4e 20 43 4f 4e 46 4c 49 43 54 20 63  ng ON CONFLICT c
15380 6c 61 75 73 65 73 20 73 70 65 63 69 66 69 65 64  lauses specified
15390 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20  ", 0);.         
153a0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28   }.          if(
153b0 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d   pIdx->onError==
153c0 4f 45 5f 44 65 66 61 75 6c 74 20 29 7b 0a 20 20  OE_Default ){.  
153d0 20 20 20 20 20 20 20 20 20 20 70 49 64 78 2d 3e            pIdx->
153e0 6f 6e 45 72 72 6f 72 20 3d 20 70 49 6e 64 65 78  onError = pIndex
153f0 2d 3e 6f 6e 45 72 72 6f 72 3b 0a 20 20 20 20 20  ->onError;.     
15400 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
15410 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 78  .        goto ex
15420 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
15430 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
15440 20 7d 0a 0a 20 20 2f 2a 20 4c 69 6e 6b 20 74 68   }..  /* Link th
15450 65 20 6e 65 77 20 49 6e 64 65 78 20 73 74 72 75  e new Index stru
15460 63 74 75 72 65 20 74 6f 20 69 74 73 20 74 61 62  cture to its tab
15470 6c 65 20 61 6e 64 20 74 6f 20 74 68 65 20 6f 74  le and to the ot
15480 68 65 72 0a 20 20 2a 2a 20 69 6e 2d 6d 65 6d 6f  her.  ** in-memo
15490 72 79 20 64 61 74 61 62 61 73 65 20 73 74 72 75  ry database stru
154a0 63 74 75 72 65 73 2e 20 0a 20 20 2a 2f 0a 20 20  ctures. .  */.  
154b0 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73  if( db->init.bus
154c0 79 20 29 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a  y ){.    Index *
154d0 70 3b 0a 20 20 20 20 70 20 3d 20 73 71 6c 69 74  p;.    p = sqlit
154e0 65 33 48 61 73 68 49 6e 73 65 72 74 28 26 70 49  e3HashInsert(&pI
154f0 6e 64 65 78 2d 3e 70 53 63 68 65 6d 61 2d 3e 69  ndex->pSchema->i
15500 64 78 48 61 73 68 2c 20 0a 20 20 20 20 20 20 20  dxHash, .       
15510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15520 20 20 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65     pIndex->zName
15530 2c 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  , sqlite3Strlen3
15540 30 28 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 29  0(pIndex->zName)
15550 2b 31 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  +1,.            
15560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 49                pI
15570 6e 64 65 78 29 3b 0a 20 20 20 20 69 66 28 20 70  ndex);.    if( p
15580 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
15590 28 20 70 3d 3d 70 49 6e 64 65 78 20 29 3b 20 20  ( p==pIndex );  
155a0 2f 2a 20 4d 61 6c 6c 6f 63 20 6d 75 73 74 20 68  /* Malloc must h
155b0 61 76 65 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20  ave failed */.  
155c0 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61      db->mallocFa
155d0 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20 20 20  iled = 1;.      
155e0 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
155f0 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20  _index;.    }.  
15600 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53    db->flags |= S
15610 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e  QLITE_InternChan
15620 67 65 73 3b 0a 20 20 20 20 69 66 28 20 70 54 62  ges;.    if( pTb
15630 6c 4e 61 6d 65 21 3d 30 20 29 7b 0a 20 20 20 20  lName!=0 ){.    
15640 20 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 20 3d    pIndex->tnum =
15650 20 64 62 2d 3e 69 6e 69 74 2e 6e 65 77 54 6e 75   db->init.newTnu
15660 6d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  m;.    }.  }..  
15670 2f 2a 20 49 66 20 74 68 65 20 64 62 2d 3e 69 6e  /* If the db->in
15680 69 74 2e 62 75 73 79 20 69 73 20 30 20 74 68 65  it.busy is 0 the
15690 6e 20 63 72 65 61 74 65 20 74 68 65 20 69 6e 64  n create the ind
156a0 65 78 20 6f 6e 20 64 69 73 6b 2e 20 20 54 68 69  ex on disk.  Thi
156b0 73 0a 20 20 2a 2a 20 69 6e 76 6f 6c 76 65 73 20  s.  ** involves 
156c0 77 72 69 74 69 6e 67 20 74 68 65 20 69 6e 64 65  writing the inde
156d0 78 20 69 6e 74 6f 20 74 68 65 20 6d 61 73 74 65  x into the maste
156e0 72 20 74 61 62 6c 65 20 61 6e 64 20 66 69 6c 6c  r table and fill
156f0 69 6e 67 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20  ing in the.  ** 
15700 69 6e 64 65 78 20 77 69 74 68 20 74 68 65 20 63  index with the c
15710 75 72 72 65 6e 74 20 74 61 62 6c 65 20 63 6f 6e  urrent table con
15720 74 65 6e 74 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  tents..  **.  **
15730 20 54 68 65 20 64 62 2d 3e 69 6e 69 74 2e 62 75   The db->init.bu
15740 73 79 20 69 73 20 30 20 77 68 65 6e 20 74 68 65  sy is 0 when the
15750 20 75 73 65 72 20 66 69 72 73 74 20 65 6e 74 65   user first ente
15760 72 73 20 61 20 43 52 45 41 54 45 20 49 4e 44 45  rs a CREATE INDE
15770 58 20 0a 20 20 2a 2a 20 63 6f 6d 6d 61 6e 64 2e  X .  ** command.
15780 20 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20    db->init.busy 
15790 69 73 20 31 20 77 68 65 6e 20 61 20 64 61 74 61  is 1 when a data
157a0 62 61 73 65 20 69 73 20 6f 70 65 6e 65 64 20 61  base is opened a
157b0 6e 64 20 0a 20 20 2a 2a 20 43 52 45 41 54 45 20  nd .  ** CREATE 
157c0 49 4e 44 45 58 20 73 74 61 74 65 6d 65 6e 74 73  INDEX statements
157d0 20 61 72 65 20 72 65 61 64 20 6f 75 74 20 6f 66   are read out of
157e0 20 74 68 65 20 6d 61 73 74 65 72 20 74 61 62 6c   the master tabl
157f0 65 2e 20 20 49 6e 0a 20 20 2a 2a 20 74 68 65 20  e.  In.  ** the 
15800 6c 61 74 74 65 72 20 63 61 73 65 20 74 68 65 20  latter case the 
15810 69 6e 64 65 78 20 61 6c 72 65 61 64 79 20 65 78  index already ex
15820 69 73 74 73 20 6f 6e 20 64 69 73 6b 2c 20 77 68  ists on disk, wh
15830 69 63 68 20 69 73 20 77 68 79 0a 20 20 2a 2a 20  ich is why.  ** 
15840 77 65 20 64 6f 6e 27 74 20 77 61 6e 74 20 74 6f  we don't want to
15850 20 72 65 63 72 65 61 74 65 20 69 74 2e 0a 20 20   recreate it..  
15860 2a 2a 0a 20 20 2a 2a 20 49 66 20 70 54 62 6c 4e  **.  ** If pTblN
15870 61 6d 65 3d 3d 30 20 69 74 20 6d 65 61 6e 73 20  ame==0 it means 
15880 74 68 69 73 20 69 6e 64 65 78 20 69 73 20 67 65  this index is ge
15890 6e 65 72 61 74 65 64 20 61 73 20 61 20 70 72 69  nerated as a pri
158a0 6d 61 72 79 20 6b 65 79 0a 20 20 2a 2a 20 6f 72  mary key.  ** or
158b0 20 55 4e 49 51 55 45 20 63 6f 6e 73 74 72 61 69   UNIQUE constrai
158c0 6e 74 20 6f 66 20 61 20 43 52 45 41 54 45 20 54  nt of a CREATE T
158d0 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 20  ABLE statement. 
158e0 20 53 69 6e 63 65 20 74 68 65 20 74 61 62 6c 65   Since the table
158f0 0a 20 20 2a 2a 20 68 61 73 20 6a 75 73 74 20 62  .  ** has just b
15900 65 65 6e 20 63 72 65 61 74 65 64 2c 20 69 74 20  een created, it 
15910 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 64 61 74 61  contains no data
15920 20 61 6e 64 20 74 68 65 20 69 6e 64 65 78 20 69   and the index i
15930 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 0a 20 20  nitialization.  
15940 2a 2a 20 73 74 65 70 20 63 61 6e 20 62 65 20 73  ** step can be s
15950 6b 69 70 70 65 64 2e 0a 20 20 2a 2f 0a 20 20 65  kipped..  */.  e
15960 6c 73 65 20 69 66 28 20 64 62 2d 3e 69 6e 69 74  lse if( db->init
15970 2e 62 75 73 79 3d 3d 30 20 29 7b 0a 20 20 20 20  .busy==0 ){.    
15980 56 64 62 65 20 2a 76 3b 0a 20 20 20 20 63 68 61  Vdbe *v;.    cha
15990 72 20 2a 7a 53 74 6d 74 3b 0a 20 20 20 20 69 6e  r *zStmt;.    in
159a0 74 20 69 4d 65 6d 20 3d 20 2b 2b 70 50 61 72 73  t iMem = ++pPars
159b0 65 2d 3e 6e 4d 65 6d 3b 0a 0a 20 20 20 20 76 20  e->nMem;..    v 
159c0 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
159d0 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 69 66  (pParse);.    if
159e0 28 20 76 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78  ( v==0 ) goto ex
159f0 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
15a00 0a 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65  ...    /* Create
15a10 20 74 68 65 20 72 6f 6f 74 70 61 67 65 20 66 6f   the rootpage fo
15a20 72 20 74 68 65 20 69 6e 64 65 78 0a 20 20 20 20  r the index.    
15a30 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65  */.    sqlite3Be
15a40 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f  ginWriteOperatio
15a50 6e 28 70 50 61 72 73 65 2c 20 31 2c 20 69 44 62  n(pParse, 1, iDb
15a60 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
15a70 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43  beAddOp2(v, OP_C
15a80 72 65 61 74 65 49 6e 64 65 78 2c 20 69 44 62 2c  reateIndex, iDb,
15a90 20 69 4d 65 6d 29 3b 0a 0a 20 20 20 20 2f 2a 20   iMem);..    /* 
15aa0 47 61 74 68 65 72 20 74 68 65 20 63 6f 6d 70 6c  Gather the compl
15ab0 65 74 65 20 74 65 78 74 20 6f 66 20 74 68 65 20  ete text of the 
15ac0 43 52 45 41 54 45 20 49 4e 44 45 58 20 73 74 61  CREATE INDEX sta
15ad0 74 65 6d 65 6e 74 20 69 6e 74 6f 0a 20 20 20 20  tement into.    
15ae0 2a 2a 20 74 68 65 20 7a 53 74 6d 74 20 76 61 72  ** the zStmt var
15af0 69 61 62 6c 65 0a 20 20 20 20 2a 2f 0a 20 20 20  iable.    */.   
15b00 20 69 66 28 20 70 53 74 61 72 74 20 26 26 20 70   if( pStart && p
15b10 45 6e 64 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  End ){.      /* 
15b20 41 20 6e 61 6d 65 64 20 69 6e 64 65 78 20 77 69  A named index wi
15b30 74 68 20 61 6e 20 65 78 70 6c 69 63 69 74 20 43  th an explicit C
15b40 52 45 41 54 45 20 49 4e 44 45 58 20 73 74 61 74  REATE INDEX stat
15b50 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 20 20 7a  ement */.      z
15b60 53 74 6d 74 20 3d 20 73 71 6c 69 74 65 33 4d 50  Stmt = sqlite3MP
15b70 72 69 6e 74 66 28 64 62 2c 20 22 43 52 45 41 54  rintf(db, "CREAT
15b80 45 25 73 20 49 4e 44 45 58 20 25 2e 2a 73 22 2c  E%s INDEX %.*s",
15b90 0a 20 20 20 20 20 20 20 20 6f 6e 45 72 72 6f 72  .        onError
15ba0 3d 3d 4f 45 5f 4e 6f 6e 65 20 3f 20 22 22 20 3a  ==OE_None ? "" :
15bb0 20 22 20 55 4e 49 51 55 45 22 2c 0a 20 20 20 20   " UNIQUE",.    
15bc0 20 20 20 20 70 45 6e 64 2d 3e 7a 20 2d 20 70 4e      pEnd->z - pN
15bd0 61 6d 65 2d 3e 7a 20 2b 20 31 2c 0a 20 20 20 20  ame->z + 1,.    
15be0 20 20 20 20 70 4e 61 6d 65 2d 3e 7a 29 3b 0a 20      pName->z);. 
15bf0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
15c00 2f 2a 20 41 6e 20 61 75 74 6f 6d 61 74 69 63 20  /* An automatic 
15c10 69 6e 64 65 78 20 63 72 65 61 74 65 64 20 62 79  index created by
15c20 20 61 20 50 52 49 4d 41 52 59 20 4b 45 59 20 6f   a PRIMARY KEY o
15c30 72 20 55 4e 49 51 55 45 20 63 6f 6e 73 74 72 61  r UNIQUE constra
15c40 69 6e 74 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20  int */.      /* 
15c50 7a 53 74 6d 74 20 3d 20 73 71 6c 69 74 65 33 4d  zStmt = sqlite3M
15c60 50 72 69 6e 74 66 28 22 22 29 3b 20 2a 2f 0a 20  Printf(""); */. 
15c70 20 20 20 20 20 7a 53 74 6d 74 20 3d 20 30 3b 0a       zStmt = 0;.
15c80 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 64      }..    /* Ad
15c90 64 20 61 6e 20 65 6e 74 72 79 20 69 6e 20 73 71  d an entry in sq
15ca0 6c 69 74 65 5f 6d 61 73 74 65 72 20 66 6f 72 20  lite_master for 
15cb0 74 68 69 73 20 69 6e 64 65 78 0a 20 20 20 20 2a  this index.    *
15cc0 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 4e 65 73  /.    sqlite3Nes
15cd0 74 65 64 50 61 72 73 65 28 70 50 61 72 73 65 2c  tedParse(pParse,
15ce0 20 0a 20 20 20 20 20 20 20 20 22 49 4e 53 45 52   .        "INSER
15cf0 54 20 49 4e 54 4f 20 25 51 2e 25 73 20 56 41 4c  T INTO %Q.%s VAL
15d00 55 45 53 28 27 69 6e 64 65 78 27 2c 25 51 2c 25  UES('index',%Q,%
15d10 51 2c 23 25 64 2c 25 51 29 3b 22 2c 0a 20 20 20  Q,#%d,%Q);",.   
15d20 20 20 20 20 20 64 62 2d 3e 61 44 62 5b 69 44 62       db->aDb[iDb
15d30 5d 2e 7a 4e 61 6d 65 2c 20 53 43 48 45 4d 41 5f  ].zName, SCHEMA_
15d40 54 41 42 4c 45 28 69 44 62 29 2c 0a 20 20 20 20  TABLE(iDb),.    
15d50 20 20 20 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d      pIndex->zNam
15d60 65 2c 0a 20 20 20 20 20 20 20 20 70 54 61 62 2d  e,.        pTab-
15d70 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20  >zName,.        
15d80 69 4d 65 6d 2c 0a 20 20 20 20 20 20 20 20 7a 53  iMem,.        zS
15d90 74 6d 74 0a 20 20 20 20 29 3b 0a 20 20 20 20 73  tmt.    );.    s
15da0 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
15db0 20 7a 53 74 6d 74 29 3b 0a 0a 20 20 20 20 2f 2a   zStmt);..    /*
15dc0 20 46 69 6c 6c 20 74 68 65 20 69 6e 64 65 78 20   Fill the index 
15dd0 77 69 74 68 20 64 61 74 61 20 61 6e 64 20 72 65  with data and re
15de0 70 61 72 73 65 20 74 68 65 20 73 63 68 65 6d 61  parse the schema
15df0 2e 20 43 6f 64 65 20 61 6e 20 4f 50 5f 45 78 70  . Code an OP_Exp
15e00 69 72 65 0a 20 20 20 20 2a 2a 20 74 6f 20 69 6e  ire.    ** to in
15e10 76 61 6c 69 64 61 74 65 20 61 6c 6c 20 70 72 65  validate all pre
15e20 2d 63 6f 6d 70 69 6c 65 64 20 73 74 61 74 65 6d  -compiled statem
15e30 65 6e 74 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ents..    */.   
15e40 20 69 66 28 20 70 54 62 6c 4e 61 6d 65 20 29 7b   if( pTblName ){
15e50 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65  .      sqlite3Re
15e60 66 69 6c 6c 49 6e 64 65 78 28 70 50 61 72 73 65  fillIndex(pParse
15e70 2c 20 70 49 6e 64 65 78 2c 20 69 4d 65 6d 29 3b  , pIndex, iMem);
15e80 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 68  .      sqlite3Ch
15e90 61 6e 67 65 43 6f 6f 6b 69 65 28 70 50 61 72 73  angeCookie(pPars
15ea0 65 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20 73  e, iDb);.      s
15eb0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
15ec0 28 76 2c 20 4f 50 5f 50 61 72 73 65 53 63 68 65  (v, OP_ParseSche
15ed0 6d 61 2c 20 69 44 62 2c 20 30 2c 20 30 2c 0a 20  ma, iDb, 0, 0,. 
15ee0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4d          sqlite3M
15ef0 50 72 69 6e 74 66 28 64 62 2c 20 22 6e 61 6d 65  Printf(db, "name
15f00 3d 27 25 71 27 22 2c 20 70 49 6e 64 65 78 2d 3e  ='%q'", pIndex->
15f10 7a 4e 61 6d 65 29 2c 20 50 34 5f 44 59 4e 41 4d  zName), P4_DYNAM
15f20 49 43 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  IC);.      sqlit
15f30 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
15f40 4f 50 5f 45 78 70 69 72 65 2c 20 30 29 3b 0a 20  OP_Expire, 0);. 
15f50 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57     }.  }..  /* W
15f60 68 65 6e 20 61 64 64 69 6e 67 20 61 6e 20 69 6e  hen adding an in
15f70 64 65 78 20 74 6f 20 74 68 65 20 6c 69 73 74 20  dex to the list 
15f80 6f 66 20 69 6e 64 69 63 65 73 20 66 6f 72 20 61  of indices for a
15f90 20 74 61 62 6c 65 2c 20 6d 61 6b 65 0a 20 20 2a   table, make.  *
15fa0 2a 20 73 75 72 65 20 61 6c 6c 20 69 6e 64 69 63  * sure all indic
15fb0 65 73 20 6c 61 62 65 6c 65 64 20 4f 45 5f 52 65  es labeled OE_Re
15fc0 70 6c 61 63 65 20 63 6f 6d 65 20 61 66 74 65 72  place come after
15fd0 20 61 6c 6c 20 74 68 6f 73 65 20 6c 61 62 65 6c   all those label
15fe0 65 64 0a 20 20 2a 2a 20 4f 45 5f 49 67 6e 6f 72  ed.  ** OE_Ignor
15ff0 65 2e 20 20 54 68 69 73 20 69 73 20 6e 65 63 65  e.  This is nece
16000 73 73 61 72 79 20 66 6f 72 20 74 68 65 20 63 6f  ssary for the co
16010 72 72 65 63 74 20 6f 70 65 72 61 74 69 6f 6e 20  rrect operation 
16020 6f 66 20 55 50 44 41 54 45 0a 20 20 2a 2a 20 61  of UPDATE.  ** a
16030 6e 64 20 49 4e 53 45 52 54 2e 0a 20 20 2a 2f 0a  nd INSERT..  */.
16040 20 20 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62    if( db->init.b
16050 75 73 79 20 7c 7c 20 70 54 62 6c 4e 61 6d 65 3d  usy || pTblName=
16060 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 6f 6e  =0 ){.    if( on
16070 45 72 72 6f 72 21 3d 4f 45 5f 52 65 70 6c 61 63  Error!=OE_Replac
16080 65 20 7c 7c 20 70 54 61 62 2d 3e 70 49 6e 64 65  e || pTab->pInde
16090 78 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 7c 7c  x==0.         ||
160a0 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 2d 3e 6f   pTab->pIndex->o
160b0 6e 45 72 72 6f 72 3d 3d 4f 45 5f 52 65 70 6c 61  nError==OE_Repla
160c0 63 65 29 7b 0a 20 20 20 20 20 20 70 49 6e 64 65  ce){.      pInde
160d0 78 2d 3e 70 4e 65 78 74 20 3d 20 70 54 61 62 2d  x->pNext = pTab-
160e0 3e 70 49 6e 64 65 78 3b 0a 20 20 20 20 20 20 70  >pIndex;.      p
160f0 54 61 62 2d 3e 70 49 6e 64 65 78 20 3d 20 70 49  Tab->pIndex = pI
16100 6e 64 65 78 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ndex;.    }else{
16110 0a 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70 4f  .      Index *pO
16120 74 68 65 72 20 3d 20 70 54 61 62 2d 3e 70 49 6e  ther = pTab->pIn
16130 64 65 78 3b 0a 20 20 20 20 20 20 77 68 69 6c 65  dex;.      while
16140 28 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74 20  ( pOther->pNext 
16150 26 26 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74  && pOther->pNext
16160 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 52 65  ->onError!=OE_Re
16170 70 6c 61 63 65 20 29 7b 0a 20 20 20 20 20 20 20  place ){.       
16180 20 70 4f 74 68 65 72 20 3d 20 70 4f 74 68 65 72   pOther = pOther
16190 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d  ->pNext;.      }
161a0 0a 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 70  .      pIndex->p
161b0 4e 65 78 74 20 3d 20 70 4f 74 68 65 72 2d 3e 70  Next = pOther->p
161c0 4e 65 78 74 3b 0a 20 20 20 20 20 20 70 4f 74 68  Next;.      pOth
161d0 65 72 2d 3e 70 4e 65 78 74 20 3d 20 70 49 6e 64  er->pNext = pInd
161e0 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 49  ex;.    }.    pI
161f0 6e 64 65 78 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20  ndex = 0;.  }.. 
16200 20 2f 2a 20 43 6c 65 61 6e 20 75 70 20 62 65 66   /* Clean up bef
16210 6f 72 65 20 65 78 69 74 69 6e 67 20 2a 2f 0a 65  ore exiting */.e
16220 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
16230 3a 0a 20 20 69 66 28 20 70 49 6e 64 65 78 20 29  :.  if( pIndex )
16240 7b 0a 20 20 20 20 66 72 65 65 49 6e 64 65 78 28  {.    freeIndex(
16250 70 49 6e 64 65 78 29 3b 0a 20 20 7d 0a 20 20 73  pIndex);.  }.  s
16260 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65  qlite3ExprListDe
16270 6c 65 74 65 28 64 62 2c 20 70 4c 69 73 74 29 3b  lete(db, pList);
16280 0a 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73  .  sqlite3SrcLis
16290 74 44 65 6c 65 74 65 28 64 62 2c 20 70 54 62 6c  tDelete(db, pTbl
162a0 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65 33  Name);.  sqlite3
162b0 44 62 46 72 65 65 28 64 62 2c 20 7a 4e 61 6d 65  DbFree(db, zName
162c0 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a  );.  return;.}..
162d0 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
162e0 6f 64 65 20 74 6f 20 6d 61 6b 65 20 73 75 72 65  ode to make sure
162f0 20 74 68 65 20 66 69 6c 65 20 66 6f 72 6d 61 74   the file format
16300 20 6e 75 6d 62 65 72 20 69 73 20 61 74 20 6c 65   number is at le
16310 61 73 74 20 6d 69 6e 46 6f 72 6d 61 74 2e 0a 2a  ast minFormat..*
16320 2a 20 54 68 65 20 67 65 6e 65 72 61 74 65 64 20  * The generated 
16330 63 6f 64 65 20 77 69 6c 6c 20 69 6e 63 72 65 61  code will increa
16340 73 65 20 74 68 65 20 66 69 6c 65 20 66 6f 72 6d  se the file form
16350 61 74 20 6e 75 6d 62 65 72 20 69 66 20 6e 65 63  at number if nec
16360 65 73 73 61 72 79 2e 0a 2a 2f 0a 76 6f 69 64 20  essary..*/.void 
16370 73 71 6c 69 74 65 33 4d 69 6e 69 6d 75 6d 46 69  sqlite3MinimumFi
16380 6c 65 46 6f 72 6d 61 74 28 50 61 72 73 65 20 2a  leFormat(Parse *
16390 70 50 61 72 73 65 2c 20 69 6e 74 20 69 44 62 2c  pParse, int iDb,
163a0 20 69 6e 74 20 6d 69 6e 46 6f 72 6d 61 74 29 7b   int minFormat){
163b0 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 76 20  .  Vdbe *v;.  v 
163c0 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
163d0 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20  (pParse);.  if( 
163e0 76 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 31 20  v ){.    int r1 
163f0 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
16400 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20  Reg(pParse);.   
16410 20 69 6e 74 20 72 32 20 3d 20 73 71 6c 69 74 65   int r2 = sqlite
16420 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
16430 73 65 29 3b 0a 20 20 20 20 69 6e 74 20 6a 31 3b  se);.    int j1;
16440 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
16450 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 52 65 61  AddOp3(v, OP_Rea
16460 64 43 6f 6f 6b 69 65 2c 20 69 44 62 2c 20 72 31  dCookie, iDb, r1
16470 2c 20 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 1);.    sqlite
16480 33 56 64 62 65 55 73 65 73 42 74 72 65 65 28 76  3VdbeUsesBtree(v
16490 2c 20 69 44 62 29 3b 0a 20 20 20 20 73 71 6c 69  , iDb);.    sqli
164a0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
164b0 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 6d 69 6e   OP_Integer, min
164c0 46 6f 72 6d 61 74 2c 20 72 32 29 3b 0a 20 20 20  Format, r2);.   
164d0 20 6a 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62   j1 = sqlite3Vdb
164e0 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 47 65  eAddOp3(v, OP_Ge
164f0 2c 20 72 32 2c 20 30 2c 20 72 31 29 3b 0a 20 20  , r2, 0, r1);.  
16500 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
16510 4f 70 33 28 76 2c 20 4f 50 5f 53 65 74 43 6f 6f  Op3(v, OP_SetCoo
16520 6b 69 65 2c 20 69 44 62 2c 20 31 2c 20 72 32 29  kie, iDb, 1, r2)
16530 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
16540 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a 31 29  eJumpHere(v, j1)
16550 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c  ;.    sqlite3Rel
16560 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
16570 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 73 71 6c  se, r1);.    sql
16580 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
16590 65 67 28 70 50 61 72 73 65 2c 20 72 32 29 3b 0a  eg(pParse, r2);.
165a0 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6c    }.}../*.** Fil
165b0 6c 20 74 68 65 20 49 6e 64 65 78 2e 61 69 52 6f  l the Index.aiRo
165c0 77 45 73 74 5b 5d 20 61 72 72 61 79 20 77 69 74  wEst[] array wit
165d0 68 20 64 65 66 61 75 6c 74 20 69 6e 66 6f 72 6d  h default inform
165e0 61 74 69 6f 6e 20 2d 20 69 6e 66 6f 72 6d 61 74  ation - informat
165f0 69 6f 6e 0a 2a 2a 20 74 6f 20 62 65 20 75 73 65  ion.** to be use
16600 64 20 77 68 65 6e 20 77 65 20 68 61 76 65 20 6e  d when we have n
16610 6f 74 20 72 75 6e 20 74 68 65 20 41 4e 41 4c 59  ot run the ANALY
16620 5a 45 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a  ZE command..**.*
16630 2a 20 61 69 52 6f 77 45 73 74 5b 30 5d 20 69 73  * aiRowEst[0] is
16640 20 73 75 70 70 6f 73 65 20 74 6f 20 63 6f 6e 74   suppose to cont
16650 61 69 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ain the number o
16660 66 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 74 68  f elements in th
16670 65 20 69 6e 64 65 78 2e 0a 2a 2a 20 53 69 6e 63  e index..** Sinc
16680 65 20 77 65 20 64 6f 20 6e 6f 74 20 6b 6e 6f 77  e we do not know
16690 2c 20 67 75 65 73 73 20 31 20 6d 69 6c 6c 69 6f  , guess 1 millio
166a0 6e 2e 20 20 61 69 52 6f 77 45 73 74 5b 31 5d 20  n.  aiRowEst[1] 
166b0 69 73 20 61 6e 20 65 73 74 69 6d 61 74 65 20 6f  is an estimate o
166c0 66 20 74 68 65 0a 2a 2a 20 6e 75 6d 62 65 72 20  f the.** number 
166d0 6f 66 20 72 6f 77 73 20 69 6e 20 74 68 65 20 74  of rows in the t
166e0 61 62 6c 65 20 74 68 61 74 20 6d 61 74 63 68 20  able that match 
166f0 61 6e 79 20 70 61 72 74 69 63 75 6c 61 72 20 76  any particular v
16700 61 6c 75 65 20 6f 66 20 74 68 65 0a 2a 2a 20 66  alue of the.** f
16710 69 72 73 74 20 63 6f 6c 75 6d 6e 20 6f 66 20 74  irst column of t
16720 68 65 20 69 6e 64 65 78 2e 20 20 61 69 52 6f 77  he index.  aiRow
16730 45 73 74 5b 32 5d 20 69 73 20 61 6e 20 65 73 74  Est[2] is an est
16740 69 6d 61 74 65 20 6f 66 20 74 68 65 20 6e 75 6d  imate of the num
16750 62 65 72 0a 2a 2a 20 6f 66 20 72 6f 77 73 20 74  ber.** of rows t
16760 68 61 74 20 6d 61 74 63 68 20 61 6e 79 20 70 61  hat match any pa
16770 72 74 69 63 75 6c 61 72 20 63 6f 6d 62 69 6e 69  rticular combini
16780 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 66 69 72  ation of the fir
16790 73 74 20 32 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20  st 2 columns.** 
167a0 6f 66 20 74 68 65 20 69 6e 64 65 78 2e 20 20 41  of the index.  A
167b0 6e 64 20 73 6f 20 66 6f 72 74 68 2e 20 20 49 74  nd so forth.  It
167c0 20 6d 75 73 74 20 61 6c 77 61 79 73 20 62 65 20   must always be 
167d0 74 68 65 20 63 61 73 65 20 74 68 61 74 0a 2a 0a  the case that.*.
167e0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 61 69 52  **           aiR
167f0 6f 77 45 73 74 5b 4e 5d 3c 3d 61 69 52 6f 77 45  owEst[N]<=aiRowE
16800 73 74 5b 4e 2d 31 5d 0a 2a 2a 20 20 20 20 20 20  st[N-1].**      
16810 20 20 20 20 20 61 69 52 6f 77 45 73 74 5b 4e 5d       aiRowEst[N]
16820 3e 3d 31 0a 2a 2a 0a 2a 2a 20 41 70 61 72 74 20  >=1.**.** Apart 
16830 66 72 6f 6d 20 74 68 61 74 2c 20 77 65 20 68 61  from that, we ha
16840 76 65 20 6c 69 74 74 6c 65 20 74 6f 20 67 6f 20  ve little to go 
16850 6f 6e 20 62 65 73 69 64 65 73 20 69 6e 74 75 69  on besides intui
16860 74 69 6f 6e 20 61 73 20 74 6f 0a 2a 2a 20 68 6f  tion as to.** ho
16870 77 20 61 69 52 6f 77 45 73 74 5b 5d 20 73 68 6f  w aiRowEst[] sho
16880 75 6c 64 20 62 65 20 69 6e 69 74 69 61 6c 69 7a  uld be initializ
16890 65 64 2e 20 20 54 68 65 20 6e 75 6d 62 65 72 73  ed.  The numbers
168a0 20 67 65 6e 65 72 61 74 65 64 20 68 65 72 65 0a   generated here.
168b0 2a 2a 20 61 72 65 20 62 61 73 65 64 20 6f 6e 20  ** are based on 
168c0 74 79 70 69 63 61 6c 20 76 61 6c 75 65 73 20 66  typical values f
168d0 6f 75 6e 64 20 69 6e 20 61 63 74 75 61 6c 20 69  ound in actual i
168e0 6e 64 69 63 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20  ndices..*/.void 
168f0 73 71 6c 69 74 65 33 44 65 66 61 75 6c 74 52 6f  sqlite3DefaultRo
16900 77 45 73 74 28 49 6e 64 65 78 20 2a 70 49 64 78  wEst(Index *pIdx
16910 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 2a 61  ){.  unsigned *a
16920 20 3d 20 70 49 64 78 2d 3e 61 69 52 6f 77 45 73   = pIdx->aiRowEs
16930 74 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 61 73  t;.  int i;.  as
16940 73 65 72 74 28 20 61 21 3d 30 20 29 3b 0a 20 20  sert( a!=0 );.  
16950 61 5b 30 5d 20 3d 20 31 30 30 30 30 30 30 3b 0a  a[0] = 1000000;.
16960 20 20 66 6f 72 28 69 3d 70 49 64 78 2d 3e 6e 43    for(i=pIdx->nC
16970 6f 6c 75 6d 6e 3b 20 69 3e 3d 35 3b 20 69 2d 2d  olumn; i>=5; i--
16980 29 7b 0a 20 20 20 20 61 5b 69 5d 20 3d 20 35 3b  ){.    a[i] = 5;
16990 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28 20 69 3e  .  }.  while( i>
169a0 3d 31 20 29 7b 0a 20 20 20 20 61 5b 69 5d 20 3d  =1 ){.    a[i] =
169b0 20 31 31 20 2d 20 69 3b 0a 20 20 20 20 69 2d 2d   11 - i;.    i--
169c0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 49 64 78  ;.  }.  if( pIdx
169d0 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f  ->onError!=OE_No
169e0 6e 65 20 29 7b 0a 20 20 20 20 61 5b 70 49 64 78  ne ){.    a[pIdx
169f0 2d 3e 6e 43 6f 6c 75 6d 6e 5d 20 3d 20 31 3b 0a  ->nColumn] = 1;.
16a00 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69    }.}../*.** Thi
16a10 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 64  s routine will d
16a20 72 6f 70 20 61 6e 20 65 78 69 73 74 69 6e 67 20  rop an existing 
16a30 6e 61 6d 65 64 20 69 6e 64 65 78 2e 20 20 54 68  named index.  Th
16a40 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 6d  is routine.** im
16a50 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 44 52 4f  plements the DRO
16a60 50 20 49 4e 44 45 58 20 73 74 61 74 65 6d 65 6e  P INDEX statemen
16a70 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  t..*/.void sqlit
16a80 65 33 44 72 6f 70 49 6e 64 65 78 28 50 61 72 73  e3DropIndex(Pars
16a90 65 20 2a 70 50 61 72 73 65 2c 20 53 72 63 4c 69  e *pParse, SrcLi
16aa0 73 74 20 2a 70 4e 61 6d 65 2c 20 69 6e 74 20 69  st *pName, int i
16ab0 66 45 78 69 73 74 73 29 7b 0a 20 20 49 6e 64 65  fExists){.  Inde
16ac0 78 20 2a 70 49 6e 64 65 78 3b 0a 20 20 56 64 62  x *pIndex;.  Vdb
16ad0 65 20 2a 76 3b 0a 20 20 73 71 6c 69 74 65 33 20  e *v;.  sqlite3 
16ae0 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
16af0 3b 0a 20 20 69 6e 74 20 69 44 62 3b 0a 0a 20 20  ;.  int iDb;..  
16b00 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  if( pParse->nErr
16b10 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   || db->mallocFa
16b20 69 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f  iled ){.    goto
16b30 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78   exit_drop_index
16b40 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
16b50 70 4e 61 6d 65 2d 3e 6e 53 72 63 3d 3d 31 20 29  pName->nSrc==1 )
16b60 3b 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f  ;.  if( SQLITE_O
16b70 4b 21 3d 73 71 6c 69 74 65 33 52 65 61 64 53 63  K!=sqlite3ReadSc
16b80 68 65 6d 61 28 70 50 61 72 73 65 29 20 29 7b 0a  hema(pParse) ){.
16b90 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72      goto exit_dr
16ba0 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20  op_index;.  }.  
16bb0 70 49 6e 64 65 78 20 3d 20 73 71 6c 69 74 65 33  pIndex = sqlite3
16bc0 46 69 6e 64 49 6e 64 65 78 28 64 62 2c 20 70 4e  FindIndex(db, pN
16bd0 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 4e 61 6d 65 2c  ame->a[0].zName,
16be0 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 44 61   pName->a[0].zDa
16bf0 74 61 62 61 73 65 29 3b 0a 20 20 69 66 28 20 70  tabase);.  if( p
16c00 49 6e 64 65 78 3d 3d 30 20 29 7b 0a 20 20 20 20  Index==0 ){.    
16c10 69 66 28 20 21 69 66 45 78 69 73 74 73 20 29 7b  if( !ifExists ){
16c20 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
16c30 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
16c40 6e 6f 20 73 75 63 68 20 69 6e 64 65 78 3a 20 25  no such index: %
16c50 53 22 2c 20 70 4e 61 6d 65 2c 20 30 29 3b 0a 20  S", pName, 0);. 
16c60 20 20 20 7d 0a 20 20 20 20 70 50 61 72 73 65 2d     }.    pParse-
16c70 3e 63 68 65 63 6b 53 63 68 65 6d 61 20 3d 20 31  >checkSchema = 1
16c80 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f  ;.    goto exit_
16c90 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a  drop_index;.  }.
16ca0 20 20 69 66 28 20 70 49 6e 64 65 78 2d 3e 61 75    if( pIndex->au
16cb0 74 6f 49 6e 64 65 78 20 29 7b 0a 20 20 20 20 73  toIndex ){.    s
16cc0 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
16cd0 50 61 72 73 65 2c 20 22 69 6e 64 65 78 20 61 73  Parse, "index as
16ce0 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 55 4e  sociated with UN
16cf0 49 51 55 45 20 22 0a 20 20 20 20 20 20 22 6f 72  IQUE ".      "or
16d00 20 50 52 49 4d 41 52 59 20 4b 45 59 20 63 6f 6e   PRIMARY KEY con
16d10 73 74 72 61 69 6e 74 20 63 61 6e 6e 6f 74 20 62  straint cannot b
16d20 65 20 64 72 6f 70 70 65 64 22 2c 20 30 29 3b 0a  e dropped", 0);.
16d30 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72      goto exit_dr
16d40 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20  op_index;.  }.  
16d50 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68  iDb = sqlite3Sch
16d60 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70  emaToIndex(db, p
16d70 49 6e 64 65 78 2d 3e 70 53 63 68 65 6d 61 29 3b  Index->pSchema);
16d80 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
16d90 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49  OMIT_AUTHORIZATI
16da0 4f 4e 0a 20 20 7b 0a 20 20 20 20 69 6e 74 20 63  ON.  {.    int c
16db0 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f  ode = SQLITE_DRO
16dc0 50 5f 49 4e 44 45 58 3b 0a 20 20 20 20 54 61 62  P_INDEX;.    Tab
16dd0 6c 65 20 2a 70 54 61 62 20 3d 20 70 49 6e 64 65  le *pTab = pInde
16de0 78 2d 3e 70 54 61 62 6c 65 3b 0a 20 20 20 20 63  x->pTable;.    c
16df0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 20 3d  onst char *zDb =
16e00 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e   db->aDb[iDb].zN
16e10 61 6d 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63  ame;.    const c
16e20 68 61 72 20 2a 7a 54 61 62 20 3d 20 53 43 48 45  har *zTab = SCHE
16e30 4d 41 5f 54 41 42 4c 45 28 69 44 62 29 3b 0a 20  MA_TABLE(iDb);. 
16e40 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75     if( sqlite3Au
16e50 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  thCheck(pParse, 
16e60 53 51 4c 49 54 45 5f 44 45 4c 45 54 45 2c 20 7a  SQLITE_DELETE, z
16e70 54 61 62 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a  Tab, 0, zDb) ){.
16e80 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f        goto exit_
16e90 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 20 20  drop_index;.    
16ea0 7d 0a 20 20 20 20 69 66 28 20 21 4f 4d 49 54 5f  }.    if( !OMIT_
16eb0 54 45 4d 50 44 42 20 26 26 20 69 44 62 20 29 20  TEMPDB && iDb ) 
16ec0 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52  code = SQLITE_DR
16ed0 4f 50 5f 54 45 4d 50 5f 49 4e 44 45 58 3b 0a 20  OP_TEMP_INDEX;. 
16ee0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75     if( sqlite3Au
16ef0 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  thCheck(pParse, 
16f00 63 6f 64 65 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e  code, pIndex->zN
16f10 61 6d 65 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  ame, pTab->zName
16f20 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20  , zDb) ){.      
16f30 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69  goto exit_drop_i
16f40 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ndex;.    }.  }.
16f50 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 47 65 6e  #endif..  /* Gen
16f60 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 72 65  erate code to re
16f70 6d 6f 76 65 20 74 68 65 20 69 6e 64 65 78 20 61  move the index a
16f80 6e 64 20 66 72 6f 6d 20 74 68 65 20 6d 61 73 74  nd from the mast
16f90 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20 76 20  er table */.  v 
16fa0 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
16fb0 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20  (pParse);.  if( 
16fc0 76 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  v ){.    sqlite3
16fd0 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74  BeginWriteOperat
16fe0 69 6f 6e 28 70 50 61 72 73 65 2c 20 31 2c 20 69  ion(pParse, 1, i
16ff0 44 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Db);.    sqlite3
17000 4e 65 73 74 65 64 50 61 72 73 65 28 70 50 61 72  NestedParse(pPar
17010 73 65 2c 0a 20 20 20 20 20 20 20 22 44 45 4c 45  se,.       "DELE
17020 54 45 20 46 52 4f 4d 20 25 51 2e 25 73 20 57 48  TE FROM %Q.%s WH
17030 45 52 45 20 6e 61 6d 65 3d 25 51 22 2c 0a 20 20  ERE name=%Q",.  
17040 20 20 20 20 20 64 62 2d 3e 61 44 62 5b 69 44 62       db->aDb[iDb
17050 5d 2e 7a 4e 61 6d 65 2c 20 53 43 48 45 4d 41 5f  ].zName, SCHEMA_
17060 54 41 42 4c 45 28 69 44 62 29 2c 0a 20 20 20 20  TABLE(iDb),.    
17070 20 20 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65     pIndex->zName
17080 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20  .    );.    if( 
17090 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65  sqlite3FindTable
170a0 28 64 62 2c 20 22 73 71 6c 69 74 65 5f 73 74 61  (db, "sqlite_sta
170b0 74 31 22 2c 20 64 62 2d 3e 61 44 62 5b 69 44 62  t1", db->aDb[iDb
170c0 5d 2e 7a 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20  ].zName) ){.    
170d0 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50    sqlite3NestedP
170e0 61 72 73 65 28 70 50 61 72 73 65 2c 0a 20 20 20  arse(pParse,.   
170f0 20 20 20 20 20 22 44 45 4c 45 54 45 20 46 52 4f       "DELETE FRO
17100 4d 20 25 51 2e 73 71 6c 69 74 65 5f 73 74 61 74  M %Q.sqlite_stat
17110 31 20 57 48 45 52 45 20 69 64 78 3d 25 51 22 2c  1 WHERE idx=%Q",
17120 0a 20 20 20 20 20 20 20 20 64 62 2d 3e 61 44 62  .        db->aDb
17130 5b 69 44 62 5d 2e 7a 4e 61 6d 65 2c 20 70 49 6e  [iDb].zName, pIn
17140 64 65 78 2d 3e 7a 4e 61 6d 65 0a 20 20 20 20 20  dex->zName.     
17150 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71   );.    }.    sq
17160 6c 69 74 65 33 43 68 61 6e 67 65 43 6f 6f 6b 69  lite3ChangeCooki
17170 65 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a  e(pParse, iDb);.
17180 20 20 20 20 64 65 73 74 72 6f 79 52 6f 6f 74 50      destroyRootP
17190 61 67 65 28 70 50 61 72 73 65 2c 20 70 49 6e 64  age(pParse, pInd
171a0 65 78 2d 3e 74 6e 75 6d 2c 20 69 44 62 29 3b 0a  ex->tnum, iDb);.
171b0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
171c0 64 64 4f 70 34 28 76 2c 20 4f 50 5f 44 72 6f 70  ddOp4(v, OP_Drop
171d0 49 6e 64 65 78 2c 20 69 44 62 2c 20 30 2c 20 30  Index, iDb, 0, 0
171e0 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c  , pIndex->zName,
171f0 20 30 29 3b 0a 20 20 7d 0a 0a 65 78 69 74 5f 64   0);.  }..exit_d
17200 72 6f 70 5f 69 6e 64 65 78 3a 0a 20 20 73 71 6c  rop_index:.  sql
17210 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74  ite3SrcListDelet
17220 65 28 64 62 2c 20 70 4e 61 6d 65 29 3b 0a 7d 0a  e(db, pName);.}.
17230 0a 2f 2a 0a 2a 2a 20 70 41 72 72 61 79 20 69 73  ./*.** pArray is
17240 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e   a pointer to an
17250 20 61 72 72 61 79 20 6f 66 20 6f 62 6a 65 63 74   array of object
17260 73 2e 20 20 45 61 63 68 20 6f 62 6a 65 63 74 20  s.  Each object 
17270 69 6e 20 74 68 65 0a 2a 2a 20 61 72 72 61 79 20  in the.** array 
17280 69 73 20 73 7a 45 6e 74 72 79 20 62 79 74 65 73  is szEntry bytes
17290 20 69 6e 20 73 69 7a 65 2e 20 20 54 68 69 73 20   in size.  This 
172a0 72 6f 75 74 69 6e 65 20 61 6c 6c 6f 63 61 74 65  routine allocate
172b0 73 20 61 20 6e 65 77 0a 2a 2a 20 6f 62 6a 65 63  s a new.** objec
172c0 74 20 6f 6e 20 74 68 65 20 65 6e 64 20 6f 66 20  t on the end of 
172d0 74 68 65 20 61 72 72 61 79 2e 0a 2a 2a 0a 2a 2a  the array..**.**
172e0 20 2a 70 6e 45 6e 74 72 79 20 69 73 20 74 68 65   *pnEntry is the
172f0 20 6e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69   number of entri
17300 65 73 20 61 6c 72 65 61 64 79 20 69 6e 20 75 73  es already in us
17310 65 2e 20 20 2a 70 6e 41 6c 6c 6f 63 20 69 73 0a  e.  *pnAlloc is.
17320 2a 2a 20 74 68 65 20 70 72 65 76 69 6f 75 73 6c  ** the previousl
17330 79 20 61 6c 6c 6f 63 61 74 65 64 20 73 69 7a 65  y allocated size
17340 20 6f 66 20 74 68 65 20 61 72 72 61 79 2e 20 20   of the array.  
17350 69 6e 69 74 53 69 7a 65 20 69 73 20 74 68 65 0a  initSize is the.
17360 2a 2a 20 73 75 67 67 65 73 74 65 64 20 69 6e 69  ** suggested ini
17370 74 69 61 6c 20 61 72 72 61 79 20 73 69 7a 65 20  tial array size 
17380 61 6c 6c 6f 63 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a  allocation..**.*
17390 2a 20 54 68 65 20 69 6e 64 65 78 20 6f 66 20 74  * The index of t
173a0 68 65 20 6e 65 77 20 65 6e 74 72 79 20 69 73 20  he new entry is 
173b0 72 65 74 75 72 6e 65 64 20 69 6e 20 2a 70 49 64  returned in *pId
173c0 78 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  x..**.** This ro
173d0 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 61 20  utine returns a 
173e0 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 61  pointer to the a
173f0 72 72 61 79 20 6f 66 20 6f 62 6a 65 63 74 73 2e  rray of objects.
17400 20 20 54 68 69 73 0a 2a 2a 20 6d 69 67 68 74 20    This.** might 
17410 62 65 20 74 68 65 20 73 61 6d 65 20 61 73 20 74  be the same as t
17420 68 65 20 70 41 72 72 61 79 20 70 61 72 61 6d 65  he pArray parame
17430 74 65 72 20 6f 72 20 69 74 20 6d 69 67 68 74 20  ter or it might 
17440 62 65 20 61 20 64 69 66 66 65 72 65 6e 74 0a 2a  be a different.*
17450 2a 20 70 6f 69 6e 74 65 72 20 69 66 20 74 68 65  * pointer if the
17460 20 61 72 72 61 79 20 77 61 73 20 72 65 73 69 7a   array was resiz
17470 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c  ed..*/.void *sql
17480 69 74 65 33 41 72 72 61 79 41 6c 6c 6f 63 61 74  ite3ArrayAllocat
17490 65 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  e(.  sqlite3 *db
174a0 2c 20 20 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63  ,      /* Connec
174b0 74 69 6f 6e 20 74 6f 20 6e 6f 74 69 66 79 20 6f  tion to notify o
174c0 66 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65  f malloc failure
174d0 73 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 41 72  s */.  void *pAr
174e0 72 61 79 2c 20 20 20 20 20 2f 2a 20 41 72 72 61  ray,     /* Arra
174f0 79 20 6f 66 20 6f 62 6a 65 63 74 73 2e 20 20 4d  y of objects.  M
17500 69 67 68 74 20 62 65 20 72 65 61 6c 6c 6f 63 61  ight be realloca
17510 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 45  ted */.  int szE
17520 6e 74 72 79 2c 20 20 20 20 20 20 2f 2a 20 53 69  ntry,      /* Si
17530 7a 65 20 6f 66 20 65 61 63 68 20 6f 62 6a 65 63  ze of each objec
17540 74 20 69 6e 20 74 68 65 20 61 72 72 61 79 20 2a  t in the array *
17550 2f 0a 20 20 69 6e 74 20 69 6e 69 74 53 69 7a 65  /.  int initSize
17560 2c 20 20 20 20 20 2f 2a 20 53 75 67 67 65 73 74  ,     /* Suggest
17570 65 64 20 69 6e 69 74 69 61 6c 20 61 6c 6c 6f 63  ed initial alloc
17580 61 74 69 6f 6e 2c 20 69 6e 20 65 6c 65 6d 65 6e  ation, in elemen
17590 74 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 45  ts */.  int *pnE
175a0 6e 74 72 79 2c 20 20 20 20 20 2f 2a 20 4e 75 6d  ntry,     /* Num
175b0 62 65 72 20 6f 66 20 6f 62 6a 65 63 74 73 20 63  ber of objects c
175c0 75 72 72 65 6e 74 6c 79 20 69 6e 20 75 73 65 20  urrently in use 
175d0 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 41 6c 6c 6f  */.  int *pnAllo
175e0 63 2c 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e  c,     /* Curren
175f0 74 20 73 69 7a 65 20 6f 66 20 74 68 65 20 61 6c  t size of the al
17600 6c 6f 63 61 74 69 6f 6e 2c 20 69 6e 20 65 6c 65  location, in ele
17610 6d 65 6e 74 73 20 2a 2f 0a 20 20 69 6e 74 20 2a  ments */.  int *
17620 70 49 64 78 20 20 20 20 20 20 20 20 20 2f 2a 20  pIdx         /* 
17630 57 72 69 74 65 20 74 68 65 20 69 6e 64 65 78 20  Write the index 
17640 6f 66 20 61 20 6e 65 77 20 73 6c 6f 74 20 68 65  of a new slot he
17650 72 65 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20  re */.){.  char 
17660 2a 7a 3b 0a 20 20 69 66 28 20 2a 70 6e 45 6e 74  *z;.  if( *pnEnt
17670 72 79 20 3e 3d 20 2a 70 6e 41 6c 6c 6f 63 20 29  ry >= *pnAlloc )
17680 7b 0a 20 20 20 20 76 6f 69 64 20 2a 70 4e 65 77  {.    void *pNew
17690 3b 0a 20 20 20 20 69 6e 74 20 6e 65 77 53 69 7a  ;.    int newSiz
176a0 65 3b 0a 20 20 20 20 6e 65 77 53 69 7a 65 20 3d  e;.    newSize =
176b0 20 28 2a 70 6e 41 6c 6c 6f 63 29 2a 32 20 2b 20   (*pnAlloc)*2 + 
176c0 69 6e 69 74 53 69 7a 65 3b 0a 20 20 20 20 70 4e  initSize;.    pN
176d0 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62 52 65  ew = sqlite3DbRe
176e0 61 6c 6c 6f 63 28 64 62 2c 20 70 41 72 72 61 79  alloc(db, pArray
176f0 2c 20 6e 65 77 53 69 7a 65 2a 73 7a 45 6e 74 72  , newSize*szEntr
17700 79 29 3b 0a 20 20 20 20 69 66 28 20 70 4e 65 77  y);.    if( pNew
17710 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2a 70 49  ==0 ){.      *pI
17720 64 78 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 72  dx = -1;.      r
17730 65 74 75 72 6e 20 70 41 72 72 61 79 3b 0a 20 20  eturn pArray;.  
17740 20 20 7d 0a 20 20 20 20 2a 70 6e 41 6c 6c 6f 63    }.    *pnAlloc
17750 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
17760 6f 63 53 69 7a 65 28 64 62 2c 20 70 4e 65 77 29  ocSize(db, pNew)
17770 2f 73 7a 45 6e 74 72 79 3b 0a 20 20 20 20 70 41  /szEntry;.    pA
17780 72 72 61 79 20 3d 20 70 4e 65 77 3b 0a 20 20 7d  rray = pNew;.  }
17790 0a 20 20 7a 20 3d 20 28 63 68 61 72 2a 29 70 41  .  z = (char*)pA
177a0 72 72 61 79 3b 0a 20 20 6d 65 6d 73 65 74 28 26  rray;.  memset(&
177b0 7a 5b 2a 70 6e 45 6e 74 72 79 20 2a 20 73 7a 45  z[*pnEntry * szE
177c0 6e 74 72 79 5d 2c 20 30 2c 20 73 7a 45 6e 74 72  ntry], 0, szEntr
177d0 79 29 3b 0a 20 20 2a 70 49 64 78 20 3d 20 2a 70  y);.  *pIdx = *p
177e0 6e 45 6e 74 72 79 3b 0a 20 20 2b 2b 2a 70 6e 45  nEntry;.  ++*pnE
177f0 6e 74 72 79 3b 0a 20 20 72 65 74 75 72 6e 20 70  ntry;.  return p
17800 41 72 72 61 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Array;.}../*.** 
17810 41 70 70 65 6e 64 20 61 20 6e 65 77 20 65 6c 65  Append a new ele
17820 6d 65 6e 74 20 74 6f 20 74 68 65 20 67 69 76 65  ment to the give
17830 6e 20 49 64 4c 69 73 74 2e 20 20 43 72 65 61 74  n IdList.  Creat
17840 65 20 61 20 6e 65 77 20 49 64 4c 69 73 74 20 69  e a new IdList i
17850 66 0a 2a 2a 20 6e 65 65 64 20 62 65 2e 0a 2a 2a  f.** need be..**
17860 0a 2a 2a 20 41 20 6e 65 77 20 49 64 4c 69 73 74  .** A new IdList
17870 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20 6f 72   is returned, or
17880 20 4e 55 4c 4c 20 69 66 20 6d 61 6c 6c 6f 63 28   NULL if malloc(
17890 29 20 66 61 69 6c 73 2e 0a 2a 2f 0a 49 64 4c 69  ) fails..*/.IdLi
178a0 73 74 20 2a 73 71 6c 69 74 65 33 49 64 4c 69 73  st *sqlite3IdLis
178b0 74 41 70 70 65 6e 64 28 73 71 6c 69 74 65 33 20  tAppend(sqlite3 
178c0 2a 64 62 2c 20 49 64 4c 69 73 74 20 2a 70 4c 69  *db, IdList *pLi
178d0 73 74 2c 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65  st, Token *pToke
178e0 6e 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  n){.  int i;.  i
178f0 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20  f( pList==0 ){. 
17900 20 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74     pList = sqlit
17910 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64  e3DbMallocZero(d
17920 62 2c 20 73 69 7a 65 6f 66 28 49 64 4c 69 73 74  b, sizeof(IdList
17930 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69  ) );.    if( pLi
17940 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  st==0 ) return 0
17950 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 6e 41 6c  ;.    pList->nAl
17960 6c 6f 63 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70  loc = 0;.  }.  p
17970 4c 69 73 74 2d 3e 61 20 3d 20 73 71 6c 69 74 65  List->a = sqlite
17980 33 41 72 72 61 79 41 6c 6c 6f 63 61 74 65 28 0a  3ArrayAllocate(.
17990 20 20 20 20 20 20 64 62 2c 0a 20 20 20 20 20 20        db,.      
179a0 70 4c 69 73 74 2d 3e 61 2c 0a 20 20 20 20 20 20  pList->a,.      
179b0 73 69 7a 65 6f 66 28 70 4c 69 73 74 2d 3e 61 5b  sizeof(pList->a[
179c0 30 5d 29 2c 0a 20 20 20 20 20 20 35 2c 0a 20 20  0]),.      5,.  
179d0 20 20 20 20 26 70 4c 69 73 74 2d 3e 6e 49 64 2c      &pList->nId,
179e0 0a 20 20 20 20 20 20 26 70 4c 69 73 74 2d 3e 6e  .      &pList->n
179f0 41 6c 6c 6f 63 2c 0a 20 20 20 20 20 20 26 69 0a  Alloc,.      &i.
17a00 20 20 29 3b 0a 20 20 69 66 28 20 69 3c 30 20 29    );.  if( i<0 )
17a10 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 49 64 4c  {.    sqlite3IdL
17a20 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 4c  istDelete(db, pL
17a30 69 73 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ist);.    return
17a40 20 30 3b 0a 20 20 7d 0a 20 20 70 4c 69 73 74 2d   0;.  }.  pList-
17a50 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20 3d 20 73 71  >a[i].zName = sq
17a60 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b  lite3NameFromTok
17a70 65 6e 28 64 62 2c 20 70 54 6f 6b 65 6e 29 3b 0a  en(db, pToken);.
17a80 20 20 72 65 74 75 72 6e 20 70 4c 69 73 74 3b 0a    return pList;.
17a90 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20  }../*.** Delete 
17aa0 61 6e 20 49 64 4c 69 73 74 2e 0a 2a 2f 0a 76 6f  an IdList..*/.vo
17ab0 69 64 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74  id sqlite3IdList
17ac0 44 65 6c 65 74 65 28 73 71 6c 69 74 65 33 20 2a  Delete(sqlite3 *
17ad0 64 62 2c 20 49 64 4c 69 73 74 20 2a 70 4c 69 73  db, IdList *pLis
17ae0 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  t){.  int i;.  i
17af0 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65  f( pList==0 ) re
17b00 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  turn;.  for(i=0;
17b10 20 69 3c 70 4c 69 73 74 2d 3e 6e 49 64 3b 20 69   i<pList->nId; i
17b20 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ++){.    sqlite3
17b30 44 62 46 72 65 65 28 64 62 2c 20 70 4c 69 73 74  DbFree(db, pList
17b40 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20  ->a[i].zName);. 
17b50 20 7d 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72   }.  sqlite3DbFr
17b60 65 65 28 64 62 2c 20 70 4c 69 73 74 2d 3e 61 29  ee(db, pList->a)
17b70 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  ;.  sqlite3DbFre
17b80 65 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a 7d 0a  e(db, pList);.}.
17b90 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
17ba0 65 20 69 6e 64 65 78 20 69 6e 20 70 4c 69 73 74  e index in pList
17bb0 20 6f 66 20 74 68 65 20 69 64 65 6e 74 69 66 69   of the identifi
17bc0 65 72 20 6e 61 6d 65 64 20 7a 49 64 2e 20 20 52  er named zId.  R
17bd0 65 74 75 72 6e 20 2d 31 0a 2a 2a 20 69 66 20 6e  eturn -1.** if n
17be0 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 69 6e 74  ot found..*/.int
17bf0 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 49 6e   sqlite3IdListIn
17c00 64 65 78 28 49 64 4c 69 73 74 20 2a 70 4c 69 73  dex(IdList *pLis
17c10 74 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  t, const char *z
17c20 4e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  Name){.  int i;.
17c30 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29    if( pList==0 )
17c40 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 66 6f   return -1;.  fo
17c50 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e  r(i=0; i<pList->
17c60 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  nId; i++){.    i
17c70 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  f( sqlite3StrICm
17c80 70 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e  p(pList->a[i].zN
17c90 61 6d 65 2c 20 7a 4e 61 6d 65 29 3d 3d 30 20 29  ame, zName)==0 )
17ca0 20 72 65 74 75 72 6e 20 69 3b 0a 20 20 7d 0a 20   return i;.  }. 
17cb0 20 72 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 2f   return -1;.}../
17cc0 2a 0a 2a 2a 20 45 78 70 61 6e 64 20 74 68 65 20  *.** Expand the 
17cd0 73 70 61 63 65 20 61 6c 6c 6f 63 61 74 65 64 20  space allocated 
17ce0 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20 53 72  for the given Sr
17cf0 63 4c 69 73 74 20 6f 62 6a 65 63 74 20 62 79 0a  cList object by.
17d00 2a 2a 20 63 72 65 61 74 69 6e 67 20 6e 45 78 74  ** creating nExt
17d10 72 61 20 6e 65 77 20 73 6c 6f 74 73 20 62 65 67  ra new slots beg
17d20 69 6e 6e 69 6e 67 20 61 74 20 69 53 74 61 72 74  inning at iStart
17d30 2e 20 20 69 53 74 61 72 74 20 69 73 20 7a 65 72  .  iStart is zer
17d40 6f 20 62 61 73 65 64 2e 0a 2a 2a 20 4e 65 77 20  o based..** New 
17d50 73 6c 6f 74 73 20 61 72 65 20 7a 65 72 6f 65 64  slots are zeroed
17d60 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78 61 6d  ..**.** For exam
17d70 70 6c 65 2c 20 73 75 70 70 6f 73 65 20 61 20 53  ple, suppose a S
17d80 72 63 4c 69 73 74 20 69 6e 69 74 69 61 6c 6c 79  rcList initially
17d90 20 63 6f 6e 74 61 69 6e 73 20 74 77 6f 20 65 6e   contains two en
17da0 74 72 69 65 73 3a 20 41 2c 42 2e 0a 2a 2a 20 54  tries: A,B..** T
17db0 6f 20 61 70 70 65 6e 64 20 33 20 6e 65 77 20 65  o append 3 new e
17dc0 6e 74 72 69 65 73 20 6f 6e 74 6f 20 74 68 65 20  ntries onto the 
17dd0 65 6e 64 2c 20 64 6f 20 74 68 69 73 3a 0a 2a 2a  end, do this:.**
17de0 0a 2a 2a 20 20 20 20 73 71 6c 69 74 65 33 53 72  .**    sqlite3Sr
17df0 63 4c 69 73 74 45 6e 6c 61 72 67 65 28 64 62 2c  cListEnlarge(db,
17e00 20 70 53 72 63 6c 69 73 74 2c 20 33 2c 20 32 29   pSrclist, 3, 2)
17e10 3b 0a 2a 2a 0a 2a 2a 20 41 66 74 65 72 20 74 68  ;.**.** After th
17e20 65 20 63 61 6c 6c 20 61 62 6f 76 65 20 69 74 20  e call above it 
17e30 77 6f 75 6c 64 20 63 6f 6e 74 61 69 6e 3a 20 20  would contain:  
17e40 41 2c 20 42 2c 20 6e 69 6c 2c 20 6e 69 6c 2c 20  A, B, nil, nil, 
17e50 6e 69 6c 2e 0a 2a 2a 20 49 66 20 74 68 65 20 69  nil..** If the i
17e60 53 74 61 72 74 20 61 72 67 75 6d 65 6e 74 20 68  Start argument h
17e70 61 64 20 62 65 65 6e 20 31 20 69 6e 73 74 65 61  ad been 1 instea
17e80 64 20 6f 66 20 32 2c 20 74 68 65 6e 20 74 68 65  d of 2, then the
17e90 20 72 65 73 75 6c 74 0a 2a 2a 20 77 6f 75 6c 64   result.** would
17ea0 20 68 61 76 65 20 62 65 65 6e 3a 20 20 41 2c 20   have been:  A, 
17eb0 6e 69 6c 2c 20 6e 69 6c 2c 20 6e 69 6c 2c 20 42  nil, nil, nil, B
17ec0 2e 20 20 54 6f 20 70 72 65 70 65 6e 64 20 74 68  .  To prepend th
17ed0 65 20 6e 65 77 20 73 6c 6f 74 73 2c 0a 2a 2a 20  e new slots,.** 
17ee0 74 68 65 20 69 53 74 61 72 74 20 76 61 6c 75 65  the iStart value
17ef0 20 77 6f 75 6c 64 20 62 65 20 30 2e 20 20 54 68   would be 0.  Th
17f00 65 20 72 65 73 75 6c 74 20 74 68 65 6e 20 77 6f  e result then wo
17f10 75 6c 64 0a 2a 2a 20 62 65 3a 20 6e 69 6c 2c 20  uld.** be: nil, 
17f20 6e 69 6c 2c 20 6e 69 6c 2c 20 41 2c 20 42 2e 0a  nil, nil, A, B..
17f30 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d 65 6d 6f 72  **.** If a memor
17f40 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69  y allocation fai
17f50 6c 73 20 74 68 65 20 53 72 63 4c 69 73 74 20 69  ls the SrcList i
17f60 73 20 75 6e 63 68 61 6e 67 65 64 2e 20 20 54 68  s unchanged.  Th
17f70 65 0a 2a 2a 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  e.** db->mallocF
17f80 61 69 6c 65 64 20 66 6c 61 67 20 77 69 6c 6c 20  ailed flag will 
17f90 62 65 20 73 65 74 20 74 6f 20 74 72 75 65 2e 0a  be set to true..
17fa0 2a 2f 0a 53 72 63 4c 69 73 74 20 2a 73 71 6c 69  */.SrcList *sqli
17fb0 74 65 33 53 72 63 4c 69 73 74 45 6e 6c 61 72 67  te3SrcListEnlarg
17fc0 65 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  e(.  sqlite3 *db
17fd0 2c 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62  ,       /* Datab
17fe0 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74  ase connection t
17ff0 6f 20 6e 6f 74 69 66 79 20 6f 66 20 4f 4f 4d 20  o notify of OOM 
18000 65 72 72 6f 72 73 20 2a 2f 0a 20 20 53 72 63 4c  errors */.  SrcL
18010 69 73 74 20 2a 70 53 72 63 2c 20 20 20 20 20 2f  ist *pSrc,     /
18020 2a 20 54 68 65 20 53 72 63 4c 69 73 74 20 74 6f  * The SrcList to
18030 20 62 65 20 65 6e 6c 61 72 67 65 64 20 2a 2f 0a   be enlarged */.
18040 20 20 69 6e 74 20 6e 45 78 74 72 61 2c 20 20 20    int nExtra,   
18050 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
18060 66 20 6e 65 77 20 73 6c 6f 74 73 20 74 6f 20 61  f new slots to a
18070 64 64 20 74 6f 20 70 53 72 63 2d 3e 61 5b 5d 20  dd to pSrc->a[] 
18080 2a 2f 0a 20 20 69 6e 74 20 69 53 74 61 72 74 20  */.  int iStart 
18090 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
180a0 20 69 6e 20 70 53 72 63 2d 3e 61 5b 5d 20 6f 66   in pSrc->a[] of
180b0 20 66 69 72 73 74 20 6e 65 77 20 73 6c 6f 74 20   first new slot 
180c0 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 0a  */.){.  int i;..
180d0 20 20 2f 2a 20 53 61 6e 69 74 79 20 63 68 65 63    /* Sanity chec
180e0 6b 69 6e 67 20 6f 6e 20 63 61 6c 6c 69 6e 67 20  king on calling 
180f0 70 61 72 61 6d 65 74 65 72 73 20 2a 2f 0a 20 20  parameters */.  
18100 61 73 73 65 72 74 28 20 69 53 74 61 72 74 3e 3d  assert( iStart>=
18110 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  0 );.  assert( n
18120 45 78 74 72 61 3e 3d 31 20 29 3b 0a 20 20 69 66  Extra>=1 );.  if
18130 28 20 70 53 72 63 3d 3d 30 20 7c 7c 20 69 53 74  ( pSrc==0 || iSt
18140 61 72 74 3e 70 53 72 63 2d 3e 6e 53 72 63 20 29  art>pSrc->nSrc )
18150 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 64 62  {.    assert( db
18160 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
18170 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 53 72  ;.    return pSr
18180 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c 6c  c;.  }..  /* All
18190 6f 63 61 74 65 20 61 64 64 69 74 69 6f 6e 61 6c  ocate additional
181a0 20 73 70 61 63 65 20 69 66 20 6e 65 65 64 65 64   space if needed
181b0 20 2a 2f 0a 20 20 69 66 28 20 70 53 72 63 2d 3e   */.  if( pSrc->
181c0 6e 53 72 63 2b 6e 45 78 74 72 61 3e 70 53 72 63  nSrc+nExtra>pSrc
181d0 2d 3e 6e 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20  ->nAlloc ){.    
181e0 53 72 63 4c 69 73 74 20 2a 70 4e 65 77 3b 0a 20  SrcList *pNew;. 
181f0 20 20 20 69 6e 74 20 6e 41 6c 6c 6f 63 20 3d 20     int nAlloc = 
18200 70 53 72 63 2d 3e 6e 53 72 63 2b 6e 45 78 74 72  pSrc->nSrc+nExtr
18210 61 3b 0a 20 20 20 20 69 6e 74 20 6e 47 6f 74 3b  a;.    int nGot;
18220 0a 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69  .    pNew = sqli
18230 74 65 33 44 62 52 65 61 6c 6c 6f 63 28 64 62 2c  te3DbRealloc(db,
18240 20 70 53 72 63 2c 0a 20 20 20 20 20 20 20 20 20   pSrc,.         
18250 20 20 20 20 20 20 73 69 7a 65 6f 66 28 2a 70 53        sizeof(*pS
18260 72 63 29 20 2b 20 28 6e 41 6c 6c 6f 63 2d 31 29  rc) + (nAlloc-1)
18270 2a 73 69 7a 65 6f 66 28 70 53 72 63 2d 3e 61 5b  *sizeof(pSrc->a[
18280 30 5d 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70  0]) );.    if( p
18290 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  New==0 ){.      
182a0 61 73 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c  assert( db->mall
182b0 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20  ocFailed );.    
182c0 20 20 72 65 74 75 72 6e 20 70 53 72 63 3b 0a 20    return pSrc;. 
182d0 20 20 20 7d 0a 20 20 20 20 70 53 72 63 20 3d 20     }.    pSrc = 
182e0 70 4e 65 77 3b 0a 20 20 20 20 6e 47 6f 74 20 3d  pNew;.    nGot =
182f0 20 28 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f   (sqlite3DbMallo
18300 63 53 69 7a 65 28 64 62 2c 20 70 4e 65 77 29 20  cSize(db, pNew) 
18310 2d 20 73 69 7a 65 6f 66 28 2a 70 53 72 63 29 29  - sizeof(*pSrc))
18320 2f 73 69 7a 65 6f 66 28 70 53 72 63 2d 3e 61 5b  /sizeof(pSrc->a[
18330 30 5d 29 2b 31 3b 0a 20 20 20 20 70 53 72 63 2d  0])+1;.    pSrc-
18340 3e 6e 41 6c 6c 6f 63 20 3d 20 28 75 31 36 29 6e  >nAlloc = (u16)n
18350 47 6f 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d  Got;.  }..  /* M
18360 6f 76 65 20 65 78 69 73 74 69 6e 67 20 73 6c 6f  ove existing slo
18370 74 73 20 74 68 61 74 20 63 6f 6d 65 20 61 66 74  ts that come aft
18380 65 72 20 74 68 65 20 6e 65 77 6c 79 20 69 6e 73  er the newly ins
18390 65 72 74 65 64 20 73 6c 6f 74 73 0a 20 20 2a 2a  erted slots.  **
183a0 20 6f 75 74 20 6f 66 20 74 68 65 20 77 61 79 20   out of the way 
183b0 2a 2f 0a 20 20 66 6f 72 28 69 3d 70 53 72 63 2d  */.  for(i=pSrc-
183c0 3e 6e 53 72 63 2d 31 3b 20 69 3e 3d 69 53 74 61  >nSrc-1; i>=iSta
183d0 72 74 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 70 53  rt; i--){.    pS
183e0 72 63 2d 3e 61 5b 69 2b 6e 45 78 74 72 61 5d 20  rc->a[i+nExtra] 
183f0 3d 20 70 53 72 63 2d 3e 61 5b 69 5d 3b 0a 20 20  = pSrc->a[i];.  
18400 7d 0a 20 20 70 53 72 63 2d 3e 6e 53 72 63 20 2b  }.  pSrc->nSrc +
18410 3d 20 28 75 31 36 29 6e 45 78 74 72 61 3b 0a 0a  = (u16)nExtra;..
18420 20 20 2f 2a 20 5a 65 72 6f 20 74 68 65 20 6e 65    /* Zero the ne
18430 77 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 73 6c  wly allocated sl
18440 6f 74 73 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28  ots */.  memset(
18450 26 70 53 72 63 2d 3e 61 5b 69 53 74 61 72 74 5d  &pSrc->a[iStart]
18460 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 53 72 63  , 0, sizeof(pSrc
18470 2d 3e 61 5b 30 5d 29 2a 6e 45 78 74 72 61 29 3b  ->a[0])*nExtra);
18480 0a 20 20 66 6f 72 28 69 3d 69 53 74 61 72 74 3b  .  for(i=iStart;
18490 20 69 3c 69 53 74 61 72 74 2b 6e 45 78 74 72 61   i<iStart+nExtra
184a0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70 53 72 63  ; i++){.    pSrc
184b0 2d 3e 61 5b 69 5d 2e 69 43 75 72 73 6f 72 20 3d  ->a[i].iCursor =
184c0 20 2d 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52   -1;.  }..  /* R
184d0 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
184e0 74 6f 20 74 68 65 20 65 6e 6c 61 72 67 65 64 20  to the enlarged 
184f0 53 72 63 4c 69 73 74 20 2a 2f 0a 20 20 72 65 74  SrcList */.  ret
18500 75 72 6e 20 70 53 72 63 3b 0a 7d 0a 0a 0a 2f 2a  urn pSrc;.}.../*
18510 0a 2a 2a 20 41 70 70 65 6e 64 20 61 20 6e 65 77  .** Append a new
18520 20 74 61 62 6c 65 20 6e 61 6d 65 20 74 6f 20 74   table name to t
18530 68 65 20 67 69 76 65 6e 20 53 72 63 4c 69 73 74  he given SrcList
18540 2e 20 20 43 72 65 61 74 65 20 61 20 6e 65 77 20  .  Create a new 
18550 53 72 63 4c 69 73 74 20 69 66 0a 2a 2a 20 6e 65  SrcList if.** ne
18560 65 64 20 62 65 2e 20 20 41 20 6e 65 77 20 65 6e  ed be.  A new en
18570 74 72 79 20 69 73 20 63 72 65 61 74 65 64 20 69  try is created i
18580 6e 20 74 68 65 20 53 72 63 4c 69 73 74 20 65 76  n the SrcList ev
18590 65 6e 20 69 66 20 70 54 6f 6b 65 6e 20 69 73 20  en if pToken is 
185a0 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 41 20 53 72  NULL..**.** A Sr
185b0 63 4c 69 73 74 20 69 73 20 72 65 74 75 72 6e 65  cList is returne
185c0 64 2c 20 6f 72 20 4e 55 4c 4c 20 69 66 20 74 68  d, or NULL if th
185d0 65 72 65 20 69 73 20 61 6e 20 4f 4f 4d 20 65 72  ere is an OOM er
185e0 72 6f 72 2e 20 20 54 68 65 20 72 65 74 75 72 6e  ror.  The return
185f0 65 64 0a 2a 2a 20 53 72 63 4c 69 73 74 20 6d 69  ed.** SrcList mi
18600 67 68 74 20 62 65 20 74 68 65 20 73 61 6d 65 20  ght be the same 
18610 61 73 20 74 68 65 20 53 72 63 4c 69 73 74 20 74  as the SrcList t
18620 68 61 74 20 77 61 73 20 69 6e 70 75 74 20 6f 72  hat was input or
18630 20 69 74 20 6d 69 67 68 74 20 62 65 0a 2a 2a 20   it might be.** 
18640 61 20 6e 65 77 20 6f 6e 65 2e 20 20 49 66 20 61  a new one.  If a
18650 6e 20 4f 4f 4d 20 65 72 72 6f 72 20 64 6f 65 73  n OOM error does
18660 20 6f 63 63 75 72 73 2c 20 74 68 65 6e 20 74 68   occurs, then th
18670 65 20 70 72 69 6f 72 20 76 61 6c 75 65 20 6f 66  e prior value of
18680 20 70 4c 69 73 74 0a 2a 2a 20 74 68 61 74 20 69   pList.** that i
18690 73 20 69 6e 70 75 74 20 74 6f 20 74 68 69 73 20  s input to this 
186a0 72 6f 75 74 69 6e 65 20 69 73 20 61 75 74 6f 6d  routine is autom
186b0 61 74 69 63 61 6c 6c 79 20 66 72 65 65 64 2e 0a  atically freed..
186c0 2a 2a 0a 2a 2a 20 49 66 20 70 44 61 74 61 62 61  **.** If pDataba
186d0 73 65 20 69 73 20 6e 6f 74 20 6e 75 6c 6c 2c 20  se is not null, 
186e0 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68  it means that th
186f0 65 20 74 61 62 6c 65 20 68 61 73 20 61 6e 20 6f  e table has an o
18700 70 74 69 6f 6e 61 6c 0a 2a 2a 20 64 61 74 61 62  ptional.** datab
18710 61 73 65 20 6e 61 6d 65 20 70 72 65 66 69 78 2e  ase name prefix.
18720 20 20 4c 69 6b 65 20 74 68 69 73 3a 20 20 22 64    Like this:  "d
18730 61 74 61 62 61 73 65 2e 74 61 62 6c 65 22 2e 20  atabase.table". 
18740 20 54 68 65 20 70 44 61 74 61 62 61 73 65 0a 2a   The pDatabase.*
18750 2a 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20  * points to the 
18760 74 61 62 6c 65 20 6e 61 6d 65 20 61 6e 64 20 74  table name and t
18770 68 65 20 70 54 61 62 6c 65 20 70 6f 69 6e 74 73  he pTable points
18780 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
18790 20 6e 61 6d 65 2e 0a 2a 2a 20 54 68 65 20 53 72   name..** The Sr
187a0 63 4c 69 73 74 2e 61 5b 5d 2e 7a 4e 61 6d 65 20  cList.a[].zName 
187b0 66 69 65 6c 64 20 69 73 20 66 69 6c 6c 65 64 20  field is filled 
187c0 77 69 74 68 20 74 68 65 20 74 61 62 6c 65 20 6e  with the table n
187d0 61 6d 65 20 77 68 69 63 68 20 6d 69 67 68 74 0a  ame which might.
187e0 2a 2a 20 63 6f 6d 65 20 66 72 6f 6d 20 70 54 61  ** come from pTa
187f0 62 6c 65 20 28 69 66 20 70 44 61 74 61 62 61 73  ble (if pDatabas
18800 65 20 69 73 20 4e 55 4c 4c 29 20 6f 72 20 66 72  e is NULL) or fr
18810 6f 6d 20 70 44 61 74 61 62 61 73 65 2e 20 20 0a  om pDatabase.  .
18820 2a 2a 20 53 72 63 4c 69 73 74 2e 61 5b 5d 2e 7a  ** SrcList.a[].z
18830 44 61 74 61 62 61 73 65 20 69 73 20 66 69 6c 6c  Database is fill
18840 65 64 20 77 69 74 68 20 74 68 65 20 64 61 74 61  ed with the data
18850 62 61 73 65 20 6e 61 6d 65 20 66 72 6f 6d 20 70  base name from p
18860 54 61 62 6c 65 2c 0a 2a 2a 20 6f 72 20 77 69 74  Table,.** or wit
18870 68 20 4e 55 4c 4c 20 69 66 20 6e 6f 20 64 61 74  h NULL if no dat
18880 61 62 61 73 65 20 69 73 20 73 70 65 63 69 66 69  abase is specifi
18890 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 6f 74 68  ed..**.** In oth
188a0 65 72 20 77 6f 72 64 73 2c 20 69 66 20 63 61 6c  er words, if cal
188b0 6c 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a  l like this:.**.
188c0 2a 2a 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  **         sqlit
188d0 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64 28  e3SrcListAppend(
188e0 44 2c 41 2c 42 2c 30 29 3b 0a 2a 2a 0a 2a 2a 20  D,A,B,0);.**.** 
188f0 54 68 65 6e 20 42 20 69 73 20 61 20 74 61 62 6c  Then B is a tabl
18900 65 20 6e 61 6d 65 20 61 6e 64 20 74 68 65 20 64  e name and the d
18910 61 74 61 62 61 73 65 20 6e 61 6d 65 20 69 73 20  atabase name is 
18920 75 6e 73 70 65 63 69 66 69 65 64 2e 20 20 49 66  unspecified.  If
18930 20 63 61 6c 6c 65 64 0a 2a 2a 20 6c 69 6b 65 20   called.** like 
18940 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  this:.**.**     
18950 20 20 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69      sqlite3SrcLi
18960 73 74 41 70 70 65 6e 64 28 44 2c 41 2c 42 2c 43  stAppend(D,A,B,C
18970 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 43 20  );.**.** Then C 
18980 69 73 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d  is the table nam
18990 65 20 61 6e 64 20 42 20 69 73 20 74 68 65 20 64  e and B is the d
189a0 61 74 61 62 61 73 65 20 6e 61 6d 65 2e 0a 2a 2f  atabase name..*/
189b0 0a 53 72 63 4c 69 73 74 20 2a 73 71 6c 69 74 65  .SrcList *sqlite
189c0 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64 28 0a  3SrcListAppend(.
189d0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20    sqlite3 *db,  
189e0 20 20 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74        /* Connect
189f0 69 6f 6e 20 74 6f 20 6e 6f 74 69 66 79 20 6f 66  ion to notify of
18a00 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65 73   malloc failures
18a10 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70   */.  SrcList *p
18a20 4c 69 73 74 2c 20 20 20 20 20 2f 2a 20 41 70 70  List,     /* App
18a30 65 6e 64 20 74 6f 20 74 68 69 73 20 53 72 63 4c  end to this SrcL
18a40 69 73 74 2e 20 4e 55 4c 4c 20 63 72 65 61 74 65  ist. NULL create
18a50 73 20 61 20 6e 65 77 20 53 72 63 4c 69 73 74 20  s a new SrcList 
18a60 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 54 61 62  */.  Token *pTab
18a70 6c 65 2c 20 20 20 20 20 20 2f 2a 20 54 61 62 6c  le,      /* Tabl
18a80 65 20 74 6f 20 61 70 70 65 6e 64 20 2a 2f 0a 20  e to append */. 
18a90 20 54 6f 6b 65 6e 20 2a 70 44 61 74 61 62 61 73   Token *pDatabas
18aa0 65 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65  e    /* Database
18ab0 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 2a 2f   of the table */
18ac0 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 53 72 63  .){.  struct Src
18ad0 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
18ae0 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30  ;.  if( pList==0
18af0 20 29 7b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20   ){.    pList = 
18b00 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a  sqlite3DbMallocZ
18b10 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 53  ero(db, sizeof(S
18b20 72 63 4c 69 73 74 29 20 29 3b 0a 20 20 20 20 69  rcList) );.    i
18b30 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65  f( pList==0 ) re
18b40 74 75 72 6e 20 30 3b 0a 20 20 20 20 70 4c 69 73  turn 0;.    pLis
18b50 74 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 31 3b 0a 20  t->nAlloc = 1;. 
18b60 20 7d 0a 20 20 70 4c 69 73 74 20 3d 20 73 71 6c   }.  pList = sql
18b70 69 74 65 33 53 72 63 4c 69 73 74 45 6e 6c 61 72  ite3SrcListEnlar
18b80 67 65 28 64 62 2c 20 70 4c 69 73 74 2c 20 31 2c  ge(db, pList, 1,
18b90 20 70 4c 69 73 74 2d 3e 6e 53 72 63 29 3b 0a 20   pList->nSrc);. 
18ba0 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
18bb0 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 73 71 6c  ailed ){.    sql
18bc0 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74  ite3SrcListDelet
18bd0 65 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a 20 20  e(db, pList);.  
18be0 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
18bf0 20 20 70 49 74 65 6d 20 3d 20 26 70 4c 69 73 74    pItem = &pList
18c00 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 53 72 63 2d  ->a[pList->nSrc-
18c10 31 5d 3b 0a 20 20 69 66 28 20 70 44 61 74 61 62  1];.  if( pDatab
18c20 61 73 65 20 26 26 20 70 44 61 74 61 62 61 73 65  ase && pDatabase
18c30 2d 3e 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 70 44  ->z==0 ){.    pD
18c40 61 74 61 62 61 73 65 20 3d 20 30 3b 0a 20 20 7d  atabase = 0;.  }
18c50 0a 20 20 69 66 28 20 70 44 61 74 61 62 61 73 65  .  if( pDatabase
18c60 20 26 26 20 70 54 61 62 6c 65 20 29 7b 0a 20 20   && pTable ){.  
18c70 20 20 54 6f 6b 65 6e 20 2a 70 54 65 6d 70 20 3d    Token *pTemp =
18c80 20 70 44 61 74 61 62 61 73 65 3b 0a 20 20 20 20   pDatabase;.    
18c90 70 44 61 74 61 62 61 73 65 20 3d 20 70 54 61 62  pDatabase = pTab
18ca0 6c 65 3b 0a 20 20 20 20 70 54 61 62 6c 65 20 3d  le;.    pTable =
18cb0 20 70 54 65 6d 70 3b 0a 20 20 7d 0a 20 20 70 49   pTemp;.  }.  pI
18cc0 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c  tem->zName = sql
18cd0 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65  ite3NameFromToke
18ce0 6e 28 64 62 2c 20 70 54 61 62 6c 65 29 3b 0a 20  n(db, pTable);. 
18cf0 20 70 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73   pItem->zDatabas
18d00 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46  e = sqlite3NameF
18d10 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 44 61  romToken(db, pDa
18d20 74 61 62 61 73 65 29 3b 0a 20 20 72 65 74 75 72  tabase);.  retur
18d30 6e 20 70 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  n pList;.}../*.*
18d40 2a 20 41 73 73 69 67 6e 20 56 64 62 65 43 75 72  * Assign VdbeCur
18d50 73 6f 72 20 69 6e 64 65 78 20 6e 75 6d 62 65 72  sor index number
18d60 73 20 74 6f 20 61 6c 6c 20 74 61 62 6c 65 73 20  s to all tables 
18d70 69 6e 20 61 20 53 72 63 4c 69 73 74 0a 2a 2f 0a  in a SrcList.*/.
18d80 76 6f 69 64 20 73 71 6c 69 74 65 33 53 72 63 4c  void sqlite3SrcL
18d90 69 73 74 41 73 73 69 67 6e 43 75 72 73 6f 72 73  istAssignCursors
18da0 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
18db0 53 72 63 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b  SrcList *pList){
18dc0 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75  .  int i;.  stru
18dd0 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
18de0 2a 70 49 74 65 6d 3b 0a 20 20 61 73 73 65 72 74  *pItem;.  assert
18df0 28 70 4c 69 73 74 20 7c 7c 20 70 50 61 72 73 65  (pList || pParse
18e00 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
18e10 65 64 20 29 3b 0a 20 20 69 66 28 20 70 4c 69 73  ed );.  if( pLis
18e20 74 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30  t ){.    for(i=0
18e30 2c 20 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61  , pItem=pList->a
18e40 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 53 72 63 3b  ; i<pList->nSrc;
18e50 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a   i++, pItem++){.
18e60 20 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d        if( pItem-
18e70 3e 69 43 75 72 73 6f 72 3e 3d 30 20 29 20 62 72  >iCursor>=0 ) br
18e80 65 61 6b 3b 0a 20 20 20 20 20 20 70 49 74 65 6d  eak;.      pItem
18e90 2d 3e 69 43 75 72 73 6f 72 20 3d 20 70 50 61 72  ->iCursor = pPar
18ea0 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20  se->nTab++;.    
18eb0 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 70 53 65    if( pItem->pSe
18ec0 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 20 20  lect ){.        
18ed0 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 73  sqlite3SrcListAs
18ee0 73 69 67 6e 43 75 72 73 6f 72 73 28 70 50 61 72  signCursors(pPar
18ef0 73 65 2c 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65  se, pItem->pSele
18f00 63 74 2d 3e 70 53 72 63 29 3b 0a 20 20 20 20 20  ct->pSrc);.     
18f10 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a   }.    }.  }.}..
18f20 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6e 20  /*.** Delete an 
18f30 65 6e 74 69 72 65 20 53 72 63 4c 69 73 74 20 69  entire SrcList i
18f40 6e 63 6c 75 64 69 6e 67 20 61 6c 6c 20 69 74 73  ncluding all its
18f50 20 73 75 62 73 74 72 75 63 74 75 72 65 2e 0a 2a   substructure..*
18f60 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53 72  /.void sqlite3Sr
18f70 63 4c 69 73 74 44 65 6c 65 74 65 28 73 71 6c 69  cListDelete(sqli
18f80 74 65 33 20 2a 64 62 2c 20 53 72 63 4c 69 73 74  te3 *db, SrcList
18f90 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20   *pList){.  int 
18fa0 69 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  i;.  struct SrcL
18fb0 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b  ist_item *pItem;
18fc0 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20  .  if( pList==0 
18fd0 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28  ) return;.  for(
18fe0 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 2c 20  pItem=pList->a, 
18ff0 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 53  i=0; i<pList->nS
19000 72 63 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b  rc; i++, pItem++
19010 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  ){.    sqlite3Db
19020 46 72 65 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e  Free(db, pItem->
19030 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20 20 20  zDatabase);.    
19040 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
19050 2c 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b  , pItem->zName);
19060 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
19070 65 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 7a 41  ee(db, pItem->zA
19080 6c 69 61 73 29 3b 0a 20 20 20 20 73 71 6c 69 74  lias);.    sqlit
19090 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 49 74  e3DbFree(db, pIt
190a0 65 6d 2d 3e 7a 49 6e 64 65 78 29 3b 0a 20 20 20  em->zIndex);.   
190b0 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61   sqlite3DeleteTa
190c0 62 6c 65 28 70 49 74 65 6d 2d 3e 70 54 61 62 29  ble(pItem->pTab)
190d0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c  ;.    sqlite3Sel
190e0 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70 49  ectDelete(db, pI
190f0 74 65 6d 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20  tem->pSelect);. 
19100 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65     sqlite3ExprDe
19110 6c 65 74 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e  lete(db, pItem->
19120 70 4f 6e 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  pOn);.    sqlite
19130 33 49 64 4c 69 73 74 44 65 6c 65 74 65 28 64 62  3IdListDelete(db
19140 2c 20 70 49 74 65 6d 2d 3e 70 55 73 69 6e 67 29  , pItem->pUsing)
19150 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44  ;.  }.  sqlite3D
19160 62 46 72 65 65 28 64 62 2c 20 70 4c 69 73 74 29  bFree(db, pList)
19170 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
19180 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
19190 64 20 62 79 20 74 68 65 20 70 61 72 73 65 72 20  d by the parser 
191a0 74 6f 20 61 64 64 20 61 20 6e 65 77 20 74 65 72  to add a new ter
191b0 6d 20 74 6f 20 74 68 65 0a 2a 2a 20 65 6e 64 20  m to the.** end 
191c0 6f 66 20 61 20 67 72 6f 77 69 6e 67 20 46 52 4f  of a growing FRO
191d0 4d 20 63 6c 61 75 73 65 2e 20 20 54 68 65 20 22  M clause.  The "
191e0 70 22 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  p" parameter is 
191f0 74 68 65 20 70 61 72 74 20 6f 66 0a 2a 2a 20 74  the part of.** t
19200 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74  he FROM clause t
19210 68 61 74 20 68 61 73 20 61 6c 72 65 61 64 79 20  hat has already 
19220 62 65 65 6e 20 63 6f 6e 73 74 72 75 63 74 65 64  been constructed
19230 2e 20 20 22 70 22 20 69 73 20 4e 55 4c 4c 0a 2a  .  "p" is NULL.*
19240 2a 20 69 66 20 74 68 69 73 20 69 73 20 74 68 65  * if this is the
19250 20 66 69 72 73 74 20 74 65 72 6d 20 6f 66 20 74   first term of t
19260 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20  he FROM clause. 
19270 20 70 54 61 62 6c 65 20 61 6e 64 20 70 44 61 74   pTable and pDat
19280 61 62 61 73 65 0a 2a 2a 20 61 72 65 20 74 68 65  abase.** are the
19290 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62   name of the tab
192a0 6c 65 20 61 6e 64 20 64 61 74 61 62 61 73 65 20  le and database 
192b0 6e 61 6d 65 64 20 69 6e 20 74 68 65 20 46 52 4f  named in the FRO
192c0 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 2e 0a 2a  M clause term..*
192d0 2a 20 70 44 61 74 61 62 61 73 65 20 69 73 20 4e  * pDatabase is N
192e0 55 4c 4c 20 69 66 20 74 68 65 20 64 61 74 61 62  ULL if the datab
192f0 61 73 65 20 6e 61 6d 65 20 71 75 61 6c 69 66 69  ase name qualifi
19300 65 72 20 69 73 20 6d 69 73 73 69 6e 67 20 2d 20  er is missing - 
19310 74 68 65 0a 2a 2a 20 75 73 75 61 6c 20 63 61 73  the.** usual cas
19320 65 2e 20 20 49 66 20 74 68 65 20 74 65 72 6d 20  e.  If the term 
19330 68 61 73 20 61 20 61 6c 69 61 73 2c 20 74 68 65  has a alias, the
19340 6e 20 70 41 6c 69 61 73 20 70 6f 69 6e 74 73 20  n pAlias points 
19350 74 6f 20 74 68 65 0a 2a 2a 20 61 6c 69 61 73 20  to the.** alias 
19360 74 6f 6b 65 6e 2e 20 20 49 66 20 74 68 65 20 74  token.  If the t
19370 65 72 6d 20 69 73 20 61 20 73 75 62 71 75 65 72  erm is a subquer
19380 79 2c 20 74 68 65 6e 20 70 53 75 62 71 75 65 72  y, then pSubquer
19390 79 20 69 73 20 74 68 65 0a 2a 2a 20 53 45 4c 45  y is the.** SELE
193a0 43 54 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61  CT statement tha
193b0 74 20 74 68 65 20 73 75 62 71 75 65 72 79 20 65  t the subquery e
193c0 6e 63 6f 64 65 73 2e 20 20 54 68 65 20 70 54 61  ncodes.  The pTa
193d0 62 6c 65 20 61 6e 64 0a 2a 2a 20 70 44 61 74 61  ble and.** pData
193e0 62 61 73 65 20 70 61 72 61 6d 65 74 65 72 73 20  base parameters 
193f0 61 72 65 20 4e 55 4c 4c 20 66 6f 72 20 73 75 62  are NULL for sub
19400 71 75 65 72 69 65 73 2e 20 20 54 68 65 20 70 4f  queries.  The pO
19410 6e 20 61 6e 64 20 70 55 73 69 6e 67 0a 2a 2a 20  n and pUsing.** 
19420 70 61 72 61 6d 65 74 65 72 73 20 61 72 65 20 74  parameters are t
19430 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68  he content of th
19440 65 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 63  e ON and USING c
19450 6c 61 75 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 52 65  lauses..**.** Re
19460 74 75 72 6e 20 61 20 6e 65 77 20 53 72 63 4c 69  turn a new SrcLi
19470 73 74 20 77 68 69 63 68 20 65 6e 63 6f 64 65 73  st which encodes
19480 20 69 73 20 74 68 65 20 46 52 4f 4d 20 77 69 74   is the FROM wit
19490 68 20 74 68 65 20 6e 65 77 0a 2a 2a 20 74 65 72  h the new.** ter
194a0 6d 20 61 64 64 65 64 2e 0a 2a 2f 0a 53 72 63 4c  m added..*/.SrcL
194b0 69 73 74 20 2a 73 71 6c 69 74 65 33 53 72 63 4c  ist *sqlite3SrcL
194c0 69 73 74 41 70 70 65 6e 64 46 72 6f 6d 54 65 72  istAppendFromTer
194d0 6d 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  m(.  Parse *pPar
194e0 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  se,          /* 
194f0 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
19500 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 2c  */.  SrcList *p,
19510 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
19520 54 68 65 20 6c 65 66 74 20 70 61 72 74 20 6f 66  The left part of
19530 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
19540 20 61 6c 72 65 61 64 79 20 73 65 65 6e 20 2a 2f   already seen */
19550 0a 20 20 54 6f 6b 65 6e 20 2a 70 54 61 62 6c 65  .  Token *pTable
19560 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61  ,          /* Na
19570 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  me of the table 
19580 74 6f 20 61 64 64 20 74 6f 20 74 68 65 20 46 52  to add to the FR
19590 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 54  OM clause */.  T
195a0 6f 6b 65 6e 20 2a 70 44 61 74 61 62 61 73 65 2c  oken *pDatabase,
195b0 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
195c0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63  f the database c
195d0 6f 6e 74 61 69 6e 69 6e 67 20 70 54 61 62 6c 65  ontaining pTable
195e0 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 41 6c   */.  Token *pAl
195f0 69 61 73 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  ias,          /*
19600 20 54 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20   The right-hand 
19610 73 69 64 65 20 6f 66 20 74 68 65 20 41 53 20 73  side of the AS s
19620 75 62 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a  ubexpression */.
19630 20 20 53 65 6c 65 63 74 20 2a 70 53 75 62 71 75    Select *pSubqu
19640 65 72 79 2c 20 20 20 20 20 20 2f 2a 20 41 20 73  ery,      /* A s
19650 75 62 71 75 65 72 79 20 75 73 65 64 20 69 6e 20  ubquery used in 
19660 70 6c 61 63 65 20 6f 66 20 61 20 74 61 62 6c 65  place of a table
19670 20 6e 61 6d 65 20 2a 2f 0a 20 20 45 78 70 72 20   name */.  Expr 
19680 2a 70 4f 6e 2c 20 20 20 20 20 20 20 20 20 20 20  *pOn,           
19690 20 20 20 2f 2a 20 54 68 65 20 4f 4e 20 63 6c 61     /* The ON cla
196a0 75 73 65 20 6f 66 20 61 20 6a 6f 69 6e 20 2a 2f  use of a join */
196b0 0a 20 20 49 64 4c 69 73 74 20 2a 70 55 73 69 6e  .  IdList *pUsin
196c0 67 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  g          /* Th
196d0 65 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20 6f  e USING clause o
196e0 66 20 61 20 6a 6f 69 6e 20 2a 2f 0a 29 7b 0a 20  f a join */.){. 
196f0 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
19700 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 73  item *pItem;.  s
19710 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
19720 72 73 65 2d 3e 64 62 3b 0a 20 20 70 20 3d 20 73  rse->db;.  p = s
19730 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70 70  qlite3SrcListApp
19740 65 6e 64 28 64 62 2c 20 70 2c 20 70 54 61 62 6c  end(db, p, pTabl
19750 65 2c 20 70 44 61 74 61 62 61 73 65 29 3b 0a 20  e, pDatabase);. 
19760 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20 70 2d 3e   if( p==0 || p->
19770 6e 53 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20 73  nSrc==0 ){.    s
19780 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
19790 28 64 62 2c 20 70 4f 6e 29 3b 0a 20 20 20 20 73  (db, pOn);.    s
197a0 71 6c 69 74 65 33 49 64 4c 69 73 74 44 65 6c 65  qlite3IdListDele
197b0 74 65 28 64 62 2c 20 70 55 73 69 6e 67 29 3b 0a  te(db, pUsing);.
197c0 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63      sqlite3Selec
197d0 74 44 65 6c 65 74 65 28 64 62 2c 20 70 53 75 62  tDelete(db, pSub
197e0 71 75 65 72 79 29 3b 0a 20 20 20 20 72 65 74 75  query);.    retu
197f0 72 6e 20 70 3b 0a 20 20 7d 0a 20 20 70 49 74 65  rn p;.  }.  pIte
19800 6d 20 3d 20 26 70 2d 3e 61 5b 70 2d 3e 6e 53 72  m = &p->a[p->nSr
19810 63 2d 31 5d 3b 0a 20 20 69 66 28 20 70 41 6c 69  c-1];.  if( pAli
19820 61 73 20 26 26 20 70 41 6c 69 61 73 2d 3e 6e 20  as && pAlias->n 
19830 29 7b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 7a 41  ){.    pItem->zA
19840 6c 69 61 73 20 3d 20 73 71 6c 69 74 65 33 4e 61  lias = sqlite3Na
19850 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20  meFromToken(db, 
19860 70 41 6c 69 61 73 29 3b 0a 20 20 7d 0a 20 20 70  pAlias);.  }.  p
19870 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 20 3d 20  Item->pSelect = 
19880 70 53 75 62 71 75 65 72 79 3b 0a 20 20 70 49 74  pSubquery;.  pIt
19890 65 6d 2d 3e 70 4f 6e 20 3d 20 70 4f 6e 3b 0a 20  em->pOn = pOn;. 
198a0 20 70 49 74 65 6d 2d 3e 70 55 73 69 6e 67 20 3d   pItem->pUsing =
198b0 20 70 55 73 69 6e 67 3b 0a 20 20 72 65 74 75 72   pUsing;.  retur
198c0 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64  n p;.}../*.** Ad
198d0 64 20 61 6e 20 49 4e 44 45 58 45 44 20 42 59 20  d an INDEXED BY 
198e0 6f 72 20 4e 4f 54 20 49 4e 44 45 58 45 44 20 63  or NOT INDEXED c
198f0 6c 61 75 73 65 20 74 6f 20 74 68 65 20 6d 6f 73  lause to the mos
19900 74 20 72 65 63 65 6e 74 6c 79 20 61 64 64 65 64  t recently added
19910 20 0a 2a 2a 20 65 6c 65 6d 65 6e 74 20 6f 66 20   .** element of 
19920 74 68 65 20 73 6f 75 72 63 65 2d 6c 69 73 74 20  the source-list 
19930 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65  passed as the se
19940 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e 0a 2a  cond argument..*
19950 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53 72  /.void sqlite3Sr
19960 63 4c 69 73 74 49 6e 64 65 78 65 64 42 79 28 50  cListIndexedBy(P
19970 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 72  arse *pParse, Sr
19980 63 4c 69 73 74 20 2a 70 2c 20 54 6f 6b 65 6e 20  cList *p, Token 
19990 2a 70 49 6e 64 65 78 65 64 42 79 29 7b 0a 20 20  *pIndexedBy){.  
199a0 69 66 28 20 70 49 6e 64 65 78 65 64 42 79 20 26  if( pIndexedBy &
199b0 26 20 70 20 26 26 20 70 2d 3e 6e 53 72 63 3e 30  & p && p->nSrc>0
199c0 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 53   ){.    struct S
199d0 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  rcList_item *pIt
199e0 65 6d 20 3d 20 26 70 2d 3e 61 5b 70 2d 3e 6e 53  em = &p->a[p->nS
199f0 72 63 2d 31 5d 3b 0a 20 20 20 20 61 73 73 65 72  rc-1];.    asser
19a00 74 28 20 70 49 74 65 6d 2d 3e 6e 6f 74 49 6e 64  t( pItem->notInd
19a10 65 78 65 64 3d 3d 30 20 26 26 20 70 49 74 65 6d  exed==0 && pItem
19a20 2d 3e 7a 49 6e 64 65 78 3d 3d 30 20 29 3b 0a 20  ->zIndex==0 );. 
19a30 20 20 20 69 66 28 20 70 49 6e 64 65 78 65 64 42     if( pIndexedB
19a40 79 2d 3e 6e 3d 3d 31 20 26 26 20 21 70 49 6e 64  y->n==1 && !pInd
19a50 65 78 65 64 42 79 2d 3e 7a 20 29 7b 0a 20 20 20  exedBy->z ){.   
19a60 20 20 20 2f 2a 20 41 20 22 4e 4f 54 20 49 4e 44     /* A "NOT IND
19a70 45 58 45 44 22 20 63 6c 61 75 73 65 20 77 61 73  EXED" clause was
19a80 20 73 75 70 70 6c 69 65 64 2e 20 53 65 65 20 70   supplied. See p
19a90 61 72 73 65 2e 79 20 0a 20 20 20 20 20 20 2a 2a  arse.y .      **
19aa0 20 63 6f 6e 73 74 72 75 63 74 20 22 69 6e 64 65   construct "inde
19ab0 78 65 64 5f 6f 70 74 22 20 66 6f 72 20 64 65 74  xed_opt" for det
19ac0 61 69 6c 73 2e 20 2a 2f 0a 20 20 20 20 20 20 70  ails. */.      p
19ad0 49 74 65 6d 2d 3e 6e 6f 74 49 6e 64 65 78 65 64  Item->notIndexed
19ae0 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   = 1;.    }else{
19af0 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 7a 49  .      pItem->zI
19b00 6e 64 65 78 20 3d 20 73 71 6c 69 74 65 33 4e 61  ndex = sqlite3Na
19b10 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 50 61 72  meFromToken(pPar
19b20 73 65 2d 3e 64 62 2c 20 70 49 6e 64 65 78 65 64  se->db, pIndexed
19b30 42 79 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  By);.    }.  }.}
19b40 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 62 75 69  ../*.** When bui
19b50 6c 64 69 6e 67 20 75 70 20 61 20 46 52 4f 4d 20  lding up a FROM 
19b60 63 6c 61 75 73 65 20 69 6e 20 74 68 65 20 70 61  clause in the pa
19b70 72 73 65 72 2c 20 74 68 65 20 6a 6f 69 6e 20 6f  rser, the join o
19b80 70 65 72 61 74 6f 72 0a 2a 2a 20 69 73 20 69 6e  perator.** is in
19b90 69 74 69 61 6c 6c 79 20 61 74 74 61 63 68 65 64  itially attached
19ba0 20 74 6f 20 74 68 65 20 6c 65 66 74 20 6f 70 65   to the left ope
19bb0 72 61 6e 64 2e 20 20 42 75 74 20 74 68 65 20 63  rand.  But the c
19bc0 6f 64 65 20 67 65 6e 65 72 61 74 6f 72 0a 2a 2a  ode generator.**
19bd0 20 65 78 70 65 63 74 73 20 74 68 65 20 6a 6f 69   expects the joi
19be0 6e 20 6f 70 65 72 61 74 6f 72 20 74 6f 20 62 65  n operator to be
19bf0 20 6f 6e 20 74 68 65 20 72 69 67 68 74 20 6f 70   on the right op
19c00 65 72 61 6e 64 2e 20 20 54 68 69 73 20 72 6f 75  erand.  This rou
19c10 74 69 6e 65 0a 2a 2a 20 53 68 69 66 74 73 20 61  tine.** Shifts a
19c20 6c 6c 20 6a 6f 69 6e 20 6f 70 65 72 61 74 6f 72  ll join operator
19c30 73 20 66 72 6f 6d 20 6c 65 66 74 20 74 6f 20 72  s from left to r
19c40 69 67 68 74 20 66 6f 72 20 61 6e 20 65 6e 74 69  ight for an enti
19c50 72 65 20 46 52 4f 4d 0a 2a 2a 20 63 6c 61 75 73  re FROM.** claus
19c60 65 2e 0a 2a 2a 0a 2a 2a 20 45 78 61 6d 70 6c 65  e..**.** Example
19c70 3a 20 53 75 70 70 6f 73 65 20 74 68 65 20 6a 6f  : Suppose the jo
19c80 69 6e 20 69 73 20 6c 69 6b 65 20 74 68 69 73 3a  in is like this:
19c90 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  .**.**          
19ca0 20 41 20 6e 61 74 75 72 61 6c 20 63 72 6f 73 73   A natural cross
19cb0 20 6a 6f 69 6e 20 42 0a 2a 2a 0a 2a 2a 20 54 68   join B.**.** Th
19cc0 65 20 6f 70 65 72 61 74 6f 72 20 69 73 20 22 6e  e operator is "n
19cd0 61 74 75 72 61 6c 20 63 72 6f 73 73 20 6a 6f 69  atural cross joi
19ce0 6e 22 2e 20 20 54 68 65 20 41 20 61 6e 64 20 42  n".  The A and B
19cf0 20 6f 70 65 72 61 6e 64 73 20 61 72 65 20 73 74   operands are st
19d00 6f 72 65 64 0a 2a 2a 20 69 6e 20 70 2d 3e 61 5b  ored.** in p->a[
19d10 30 5d 20 61 6e 64 20 70 2d 3e 61 5b 31 5d 2c 20  0] and p->a[1], 
19d20 72 65 73 70 65 63 74 69 76 65 6c 79 2e 20 20 54  respectively.  T
19d30 68 65 20 70 61 72 73 65 72 20 69 6e 69 74 69 61  he parser initia
19d40 6c 6c 79 20 73 74 6f 72 65 73 20 74 68 65 0a 2a  lly stores the.*
19d50 2a 20 6f 70 65 72 61 74 6f 72 20 77 69 74 68 20  * operator with 
19d60 41 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  A.  This routine
19d70 20 73 68 69 66 74 73 20 74 68 61 74 20 6f 70 65   shifts that ope
19d80 72 61 74 6f 72 20 6f 76 65 72 20 74 6f 20 42 2e  rator over to B.
19d90 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
19da0 53 72 63 4c 69 73 74 53 68 69 66 74 4a 6f 69 6e  SrcListShiftJoin
19db0 54 79 70 65 28 53 72 63 4c 69 73 74 20 2a 70 29  Type(SrcList *p)
19dc0 7b 0a 20 20 69 66 28 20 70 20 26 26 20 70 2d 3e  {.  if( p && p->
19dd0 61 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  a ){.    int i;.
19de0 20 20 20 20 66 6f 72 28 69 3d 70 2d 3e 6e 53 72      for(i=p->nSr
19df0 63 2d 31 3b 20 69 3e 30 3b 20 69 2d 2d 29 7b 0a  c-1; i>0; i--){.
19e00 20 20 20 20 20 20 70 2d 3e 61 5b 69 5d 2e 6a 6f        p->a[i].jo
19e10 69 6e 74 79 70 65 20 3d 20 70 2d 3e 61 5b 69 2d  intype = p->a[i-
19e20 31 5d 2e 6a 6f 69 6e 74 79 70 65 3b 0a 20 20 20  1].jointype;.   
19e30 20 7d 0a 20 20 20 20 70 2d 3e 61 5b 30 5d 2e 6a   }.    p->a[0].j
19e40 6f 69 6e 74 79 70 65 20 3d 20 30 3b 0a 20 20 7d  ointype = 0;.  }
19e50 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65 67 69 6e 20  .}../*.** Begin 
19e60 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2f  a transaction.*/
19e70 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42 65 67  .void sqlite3Beg
19e80 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 28 50 61  inTransaction(Pa
19e90 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74  rse *pParse, int
19ea0 20 74 79 70 65 29 7b 0a 20 20 73 71 6c 69 74 65   type){.  sqlite
19eb0 33 20 2a 64 62 3b 0a 20 20 56 64 62 65 20 2a 76  3 *db;.  Vdbe *v
19ec0 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 69 66  ;.  int i;..  if
19ed0 28 20 70 50 61 72 73 65 3d 3d 30 20 7c 7c 20 28  ( pParse==0 || (
19ee0 64 62 3d 70 50 61 72 73 65 2d 3e 64 62 29 3d 3d  db=pParse->db)==
19ef0 30 20 7c 7c 20 64 62 2d 3e 61 44 62 5b 30 5d 2e  0 || db->aDb[0].
19f00 70 42 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  pBt==0 ) return;
19f10 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e  .  if( pParse->n
19f20 45 72 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f  Err || db->mallo
19f30 63 46 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e  cFailed ) return
19f40 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 41  ;.  if( sqlite3A
19f50 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c  uthCheck(pParse,
19f60 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 41 43 54   SQLITE_TRANSACT
19f70 49 4f 4e 2c 20 22 42 45 47 49 4e 22 2c 20 30 2c  ION, "BEGIN", 0,
19f80 20 30 29 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20   0) ) return;.. 
19f90 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56   v = sqlite3GetV
19fa0 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69  dbe(pParse);.  i
19fb0 66 28 20 21 76 20 29 20 72 65 74 75 72 6e 3b 0a  f( !v ) return;.
19fc0 20 20 69 66 28 20 74 79 70 65 21 3d 54 4b 5f 44    if( type!=TK_D
19fd0 45 46 45 52 52 45 44 20 29 7b 0a 20 20 20 20 66  EFERRED ){.    f
19fe0 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44  or(i=0; i<db->nD
19ff0 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73  b; i++){.      s
1a000 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1a010 28 76 2c 20 4f 50 5f 54 72 61 6e 73 61 63 74 69  (v, OP_Transacti
1a020 6f 6e 2c 20 69 2c 20 28 74 79 70 65 3d 3d 54 4b  on, i, (type==TK
1a030 5f 45 58 43 4c 55 53 49 56 45 29 2b 31 29 3b 0a  _EXCLUSIVE)+1);.
1a040 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1a050 65 55 73 65 73 42 74 72 65 65 28 76 2c 20 69 29  eUsesBtree(v, i)
1a060 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71  ;.    }.  }.  sq
1a070 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1a080 76 2c 20 4f 50 5f 41 75 74 6f 43 6f 6d 6d 69 74  v, OP_AutoCommit
1a090 2c 20 30 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  , 0, 0);.}../*.*
1a0a0 2a 20 43 6f 6d 6d 69 74 20 61 20 74 72 61 6e 73  * Commit a trans
1a0b0 61 63 74 69 6f 6e 0a 2a 2f 0a 76 6f 69 64 20 73  action.*/.void s
1a0c0 71 6c 69 74 65 33 43 6f 6d 6d 69 74 54 72 61 6e  qlite3CommitTran
1a0d0 73 61 63 74 69 6f 6e 28 50 61 72 73 65 20 2a 70  saction(Parse *p
1a0e0 50 61 72 73 65 29 7b 0a 20 20 73 71 6c 69 74 65  Parse){.  sqlite
1a0f0 33 20 2a 64 62 3b 0a 20 20 56 64 62 65 20 2a 76  3 *db;.  Vdbe *v
1a100 3b 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65 3d  ;..  if( pParse=
1a110 3d 30 20 7c 7c 20 28 64 62 3d 70 50 61 72 73 65  =0 || (db=pParse
1a120 2d 3e 64 62 29 3d 3d 30 20 7c 7c 20 64 62 2d 3e  ->db)==0 || db->
1a130 61 44 62 5b 30 5d 2e 70 42 74 3d 3d 30 20 29 20  aDb[0].pBt==0 ) 
1a140 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 50  return;.  if( pP
1a150 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 64 62  arse->nErr || db
1a160 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
1a170 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 73   return;.  if( s
1a180 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28  qlite3AuthCheck(
1a190 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 54  pParse, SQLITE_T
1a1a0 52 41 4e 53 41 43 54 49 4f 4e 2c 20 22 43 4f 4d  RANSACTION, "COM
1a1b0 4d 49 54 22 2c 20 30 2c 20 30 29 20 29 20 72 65  MIT", 0, 0) ) re
1a1c0 74 75 72 6e 3b 0a 0a 20 20 76 20 3d 20 73 71 6c  turn;..  v = sql
1a1d0 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
1a1e0 73 65 29 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a  se);.  if( v ){.
1a1f0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1a200 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41 75 74 6f  ddOp2(v, OP_Auto
1a210 43 6f 6d 6d 69 74 2c 20 31 2c 20 30 29 3b 0a 20  Commit, 1, 0);. 
1a220 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c   }.}../*.** Roll
1a230 62 61 63 6b 20 61 20 74 72 61 6e 73 61 63 74 69  back a transacti
1a240 6f 6e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  on.*/.void sqlit
1a250 65 33 52 6f 6c 6c 62 61 63 6b 54 72 61 6e 73 61  e3RollbackTransa
1a260 63 74 69 6f 6e 28 50 61 72 73 65 20 2a 70 50 61  ction(Parse *pPa
1a270 72 73 65 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  rse){.  sqlite3 
1a280 2a 64 62 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a  *db;.  Vdbe *v;.
1a290 0a 20 20 69 66 28 20 70 50 61 72 73 65 3d 3d 30  .  if( pParse==0
1a2a0 20 7c 7c 20 28 64 62 3d 70 50 61 72 73 65 2d 3e   || (db=pParse->
1a2b0 64 62 29 3d 3d 30 20 7c 7c 20 64 62 2d 3e 61 44  db)==0 || db->aD
1a2c0 62 5b 30 5d 2e 70 42 74 3d 3d 30 20 29 20 72 65  b[0].pBt==0 ) re
1a2d0 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 50 61 72  turn;.  if( pPar
1a2e0 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 64 62 2d 3e  se->nErr || db->
1a2f0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72  mallocFailed ) r
1a300 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 73 71 6c  eturn;.  if( sql
1a310 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50  ite3AuthCheck(pP
1a320 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 54 52 41  arse, SQLITE_TRA
1a330 4e 53 41 43 54 49 4f 4e 2c 20 22 52 4f 4c 4c 42  NSACTION, "ROLLB
1a340 41 43 4b 22 2c 20 30 2c 20 30 29 20 29 20 72 65  ACK", 0, 0) ) re
1a350 74 75 72 6e 3b 0a 0a 20 20 76 20 3d 20 73 71 6c  turn;..  v = sql
1a360 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
1a370 73 65 29 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a  se);.  if( v ){.
1a380 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1a390 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41 75 74 6f  ddOp2(v, OP_Auto
1a3a0 43 6f 6d 6d 69 74 2c 20 31 2c 20 31 29 3b 0a 20  Commit, 1, 1);. 
1a3b0 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65   }.}../*.** Make
1a3c0 20 73 75 72 65 20 74 68 65 20 54 45 4d 50 20 64   sure the TEMP d
1a3d0 61 74 61 62 61 73 65 20 69 73 20 6f 70 65 6e 20  atabase is open 
1a3e0 61 6e 64 20 61 76 61 69 6c 61 62 6c 65 20 66 6f  and available fo
1a3f0 72 20 75 73 65 2e 20 20 52 65 74 75 72 6e 0a 2a  r use.  Return.*
1a400 2a 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  * the number of 
1a410 65 72 72 6f 72 73 2e 20 20 4c 65 61 76 65 20 61  errors.  Leave a
1a420 6e 79 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  ny error message
1a430 73 20 69 6e 20 74 68 65 20 70 50 61 72 73 65 20  s in the pParse 
1a440 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 69 6e  structure..*/.in
1a450 74 20 73 71 6c 69 74 65 33 4f 70 65 6e 54 65 6d  t sqlite3OpenTem
1a460 70 44 61 74 61 62 61 73 65 28 50 61 72 73 65 20  pDatabase(Parse 
1a470 2a 70 50 61 72 73 65 29 7b 0a 20 20 73 71 6c 69  *pParse){.  sqli
1a480 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
1a490 2d 3e 64 62 3b 0a 20 20 69 66 28 20 64 62 2d 3e  ->db;.  if( db->
1a4a0 61 44 62 5b 31 5d 2e 70 42 74 3d 3d 30 20 26 26  aDb[1].pBt==0 &&
1a4b0 20 21 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69   !pParse->explai
1a4c0 6e 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b  n ){.    int rc;
1a4d0 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73  .    static cons
1a4e0 74 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 0a 20  t int flags = . 
1a4f0 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
1a500 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 20 7c  OPEN_READWRITE |
1a510 0a 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54  .          SQLIT
1a520 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 20 7c 0a  E_OPEN_CREATE |.
1a530 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
1a540 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 20  _OPEN_EXCLUSIVE 
1a550 7c 0a 20 20 20 20 20 20 20 20 20 20 53 51 4c 49  |.          SQLI
1a560 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e  TE_OPEN_DELETEON
1a570 43 4c 4f 53 45 20 7c 0a 20 20 20 20 20 20 20 20  CLOSE |.        
1a580 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45    SQLITE_OPEN_TE
1a590 4d 50 5f 44 42 3b 0a 0a 20 20 20 20 72 63 20 3d  MP_DB;..    rc =
1a5a0 20 73 71 6c 69 74 65 33 42 74 72 65 65 46 61 63   sqlite3BtreeFac
1a5b0 74 6f 72 79 28 64 62 2c 20 30 2c 20 30 2c 20 53  tory(db, 0, 0, S
1a5c0 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 43 41  QLITE_DEFAULT_CA
1a5d0 43 48 45 5f 53 49 5a 45 2c 20 66 6c 61 67 73 2c  CHE_SIZE, flags,
1a5e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1a5f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a600 20 20 26 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 42    &db->aDb[1].pB
1a610 74 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  t);.    if( rc!=
1a620 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1a630 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
1a640 73 67 28 70 50 61 72 73 65 2c 20 22 75 6e 61 62  sg(pParse, "unab
1a650 6c 65 20 74 6f 20 6f 70 65 6e 20 61 20 74 65 6d  le to open a tem
1a660 70 6f 72 61 72 79 20 64 61 74 61 62 61 73 65 20  porary database 
1a670 22 0a 20 20 20 20 20 20 20 20 22 66 69 6c 65 20  ".        "file 
1a680 66 6f 72 20 73 74 6f 72 69 6e 67 20 74 65 6d 70  for storing temp
1a690 6f 72 61 72 79 20 74 61 62 6c 65 73 22 29 3b 0a  orary tables");.
1a6a0 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 72 63        pParse->rc
1a6b0 20 3d 20 72 63 3b 0a 20 20 20 20 20 20 72 65 74   = rc;.      ret
1a6c0 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 1;.    }.   
1a6d0 20 61 73 73 65 72 74 28 20 28 64 62 2d 3e 66 6c   assert( (db->fl
1a6e0 61 67 73 20 26 20 53 51 4c 49 54 45 5f 49 6e 54  ags & SQLITE_InT
1a6f0 72 61 6e 73 29 3d 3d 30 20 7c 7c 20 64 62 2d 3e  rans)==0 || db->
1a700 61 75 74 6f 43 6f 6d 6d 69 74 20 29 3b 0a 20 20  autoCommit );.  
1a710 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 61 44    assert( db->aD
1a720 62 5b 31 5d 2e 70 53 63 68 65 6d 61 20 29 3b 0a  b[1].pSchema );.
1a730 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
1a740 4a 6f 75 72 6e 61 6c 4d 6f 64 65 28 73 71 6c 69  JournalMode(sqli
1a750 74 65 33 42 74 72 65 65 50 61 67 65 72 28 64 62  te3BtreePager(db
1a760 2d 3e 61 44 62 5b 31 5d 2e 70 42 74 29 2c 0a 20  ->aDb[1].pBt),. 
1a770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a780 20 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e 64             db->d
1a790 66 6c 74 4a 6f 75 72 6e 61 6c 4d 6f 64 65 29 3b  fltJournalMode);
1a7a0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
1a7b0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
1a7c0 74 65 20 56 44 42 45 20 63 6f 64 65 20 74 68 61  te VDBE code tha
1a7d0 74 20 77 69 6c 6c 20 76 65 72 69 66 79 20 74 68  t will verify th
1a7e0 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 20  e schema cookie 
1a7f0 61 6e 64 20 73 74 61 72 74 0a 2a 2a 20 61 20 72  and start.** a r
1a800 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  ead-transaction 
1a810 66 6f 72 20 61 6c 6c 20 6e 61 6d 65 64 20 64 61  for all named da
1a820 74 61 62 61 73 65 20 66 69 6c 65 73 2e 0a 2a 2a  tabase files..**
1a830 0a 2a 2a 20 49 74 20 69 73 20 69 6d 70 6f 72 74  .** It is import
1a840 61 6e 74 20 74 68 61 74 20 61 6c 6c 20 73 63 68  ant that all sch
1a850 65 6d 61 20 63 6f 6f 6b 69 65 73 20 62 65 20 76  ema cookies be v
1a860 65 72 69 66 69 65 64 20 61 6e 64 20 61 6c 6c 0a  erified and all.
1a870 2a 2a 20 72 65 61 64 20 74 72 61 6e 73 61 63 74  ** read transact
1a880 69 6f 6e 73 20 62 65 20 73 74 61 72 74 65 64 20  ions be started 
1a890 62 65 66 6f 72 65 20 61 6e 79 74 68 69 6e 67 20  before anything 
1a8a0 65 6c 73 65 20 68 61 70 70 65 6e 73 20 69 6e 0a  else happens in.
1a8b0 2a 2a 20 74 68 65 20 56 44 42 45 20 70 72 6f 67  ** the VDBE prog
1a8c0 72 61 6d 2e 20 20 42 75 74 20 74 68 69 73 20 72  ram.  But this r
1a8d0 6f 75 74 69 6e 65 20 63 61 6e 20 62 65 20 63 61  outine can be ca
1a8e0 6c 6c 65 64 20 61 66 74 65 72 20 6d 75 63 68 20  lled after much 
1a8f0 6f 74 68 65 72 0a 2a 2a 20 63 6f 64 65 20 68 61  other.** code ha
1a900 73 20 62 65 65 6e 20 67 65 6e 65 72 61 74 65 64  s been generated
1a910 2e 20 20 53 6f 20 68 65 72 65 20 69 73 20 77 68  .  So here is wh
1a920 61 74 20 77 65 20 64 6f 3a 0a 2a 2a 0a 2a 2a 20  at we do:.**.** 
1a930 54 68 65 20 66 69 72 73 74 20 74 69 6d 65 20 74  The first time t
1a940 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
1a950 61 6c 6c 65 64 2c 20 77 65 20 63 6f 64 65 20 61  alled, we code a
1a960 6e 20 4f 50 5f 47 6f 74 6f 20 74 68 61 74 0a 2a  n OP_Goto that.*
1a970 2a 20 77 69 6c 6c 20 6a 75 6d 70 20 74 6f 20 61  * will jump to a
1a980 20 73 75 62 72 6f 75 74 69 6e 65 20 61 74 20 74   subroutine at t
1a990 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 70 72  he end of the pr
1a9a0 6f 67 72 61 6d 2e 20 20 54 68 65 6e 20 77 65 0a  ogram.  Then we.
1a9b0 2a 2a 20 72 65 63 6f 72 64 20 65 76 65 72 79 20  ** record every 
1a9c0 64 61 74 61 62 61 73 65 20 74 68 61 74 20 6e 65  database that ne
1a9d0 65 64 73 20 69 74 73 20 73 63 68 65 6d 61 20 76  eds its schema v
1a9e0 65 72 69 66 69 65 64 20 69 6e 20 74 68 65 0a 2a  erified in the.*
1a9f0 2a 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65  * pParse->cookie
1aa00 4d 61 73 6b 20 66 69 65 6c 64 2e 20 20 4c 61 74  Mask field.  Lat
1aa10 65 72 2c 20 61 66 74 65 72 20 61 6c 6c 20 6f 74  er, after all ot
1aa20 68 65 72 20 63 6f 64 65 20 68 61 73 20 62 65 65  her code has bee
1aa30 6e 0a 2a 2a 20 67 65 6e 65 72 61 74 65 64 2c 20  n.** generated, 
1aa40 74 68 65 20 73 75 62 72 6f 75 74 69 6e 65 20 74  the subroutine t
1aa50 68 61 74 20 64 6f 65 73 20 74 68 65 20 63 6f 6f  hat does the coo
1aa60 6b 69 65 20 76 65 72 69 66 69 63 61 74 69 6f 6e  kie verification
1aa70 73 20 61 6e 64 0a 2a 2a 20 73 74 61 72 74 73 20  s and.** starts 
1aa80 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 73  the transactions
1aa90 20 77 69 6c 6c 20 62 65 20 63 6f 64 65 64 20 61   will be coded a
1aaa0 6e 64 20 74 68 65 20 4f 50 5f 47 6f 74 6f 20 50  nd the OP_Goto P
1aab0 32 20 76 61 6c 75 65 0a 2a 2a 20 77 69 6c 6c 20  2 value.** will 
1aac0 62 65 20 6d 61 64 65 20 74 6f 20 70 6f 69 6e 74  be made to point
1aad0 20 74 6f 20 74 68 61 74 20 73 75 62 72 6f 75 74   to that subrout
1aae0 69 6e 65 2e 20 20 54 68 65 20 67 65 6e 65 72 61  ine.  The genera
1aaf0 74 69 6f 6e 20 6f 66 20 74 68 65 0a 2a 2a 20 63  tion of the.** c
1ab00 6f 6f 6b 69 65 20 76 65 72 69 66 69 63 61 74 69  ookie verificati
1ab10 6f 6e 20 73 75 62 72 6f 75 74 69 6e 65 20 63 6f  on subroutine co
1ab20 64 65 20 68 61 70 70 65 6e 73 20 69 6e 20 73 71  de happens in sq
1ab30 6c 69 74 65 33 46 69 6e 69 73 68 43 6f 64 69 6e  lite3FinishCodin
1ab40 67 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 69 44  g()..**.** If iD
1ab50 62 3c 30 20 74 68 65 6e 20 63 6f 64 65 20 74 68  b<0 then code th
1ab60 65 20 4f 50 5f 47 6f 74 6f 20 6f 6e 6c 79 20 2d  e OP_Goto only -
1ab70 20 64 6f 6e 27 74 20 73 65 74 20 66 6c 61 67 20   don't set flag 
1ab80 74 6f 20 76 65 72 69 66 79 20 74 68 65 0a 2a 2a  to verify the.**
1ab90 20 73 63 68 65 6d 61 20 6f 6e 20 61 6e 79 20 64   schema on any d
1aba0 61 74 61 62 61 73 65 73 2e 20 20 54 68 69 73 20  atabases.  This 
1abb0 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20 70  can be used to p
1abc0 6f 73 69 74 69 6f 6e 20 74 68 65 20 4f 50 5f 47  osition the OP_G
1abd0 6f 74 6f 0a 2a 2a 20 65 61 72 6c 79 20 69 6e 20  oto.** early in 
1abe0 74 68 65 20 63 6f 64 65 2c 20 62 65 66 6f 72 65  the code, before
1abf0 20 77 65 20 6b 6e 6f 77 20 69 66 20 61 6e 79 20   we know if any 
1ac00 64 61 74 61 62 61 73 65 20 74 61 62 6c 65 73 20  database tables 
1ac10 77 69 6c 6c 20 62 65 20 75 73 65 64 2e 0a 2a 2f  will be used..*/
1ac20 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 6f 64  .void sqlite3Cod
1ac30 65 56 65 72 69 66 79 53 63 68 65 6d 61 28 50 61  eVerifySchema(Pa
1ac40 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74  rse *pParse, int
1ac50 20 69 44 62 29 7b 0a 20 20 73 71 6c 69 74 65 33   iDb){.  sqlite3
1ac60 20 2a 64 62 3b 0a 20 20 56 64 62 65 20 2a 76 3b   *db;.  Vdbe *v;
1ac70 0a 20 20 69 6e 74 20 6d 61 73 6b 3b 0a 0a 20 20  .  int mask;..  
1ac80 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
1ac90 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66  be(pParse);.  if
1aca0 28 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ( v==0 ) return;
1acb0 20 20 2f 2a 20 54 68 69 73 20 6f 6e 6c 79 20 68    /* This only h
1acc0 61 70 70 65 6e 73 20 69 66 20 74 68 65 72 65 20  appens if there 
1acd0 77 61 73 20 61 20 70 72 69 6f 72 20 65 72 72 6f  was a prior erro
1ace0 72 20 2a 2f 0a 20 20 64 62 20 3d 20 70 50 61 72  r */.  db = pPar
1acf0 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20 70 50  se->db;.  if( pP
1ad00 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 47 6f 74 6f  arse->cookieGoto
1ad10 3d 3d 30 20 29 7b 0a 20 20 20 20 70 50 61 72 73  ==0 ){.    pPars
1ad20 65 2d 3e 63 6f 6f 6b 69 65 47 6f 74 6f 20 3d 20  e->cookieGoto = 
1ad30 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1ad40 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c  2(v, OP_Goto, 0,
1ad50 20 30 29 2b 31 3b 0a 20 20 7d 0a 20 20 69 66 28   0)+1;.  }.  if(
1ad60 20 69 44 62 3e 3d 30 20 29 7b 0a 20 20 20 20 61   iDb>=0 ){.    a
1ad70 73 73 65 72 74 28 20 69 44 62 3c 64 62 2d 3e 6e  ssert( iDb<db->n
1ad80 44 62 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  Db );.    assert
1ad90 28 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70  ( db->aDb[iDb].p
1ada0 42 74 21 3d 30 20 7c 7c 20 69 44 62 3d 3d 31 20  Bt!=0 || iDb==1 
1adb0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69  );.    assert( i
1adc0 44 62 3c 53 51 4c 49 54 45 5f 4d 41 58 5f 41 54  Db<SQLITE_MAX_AT
1add0 54 41 43 48 45 44 2b 32 20 29 3b 0a 20 20 20 20  TACHED+2 );.    
1ade0 6d 61 73 6b 20 3d 20 31 3c 3c 69 44 62 3b 0a 20  mask = 1<<iDb;. 
1adf0 20 20 20 69 66 28 20 28 70 50 61 72 73 65 2d 3e     if( (pParse->
1ae00 63 6f 6f 6b 69 65 4d 61 73 6b 20 26 20 6d 61 73  cookieMask & mas
1ae10 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  k)==0 ){.      p
1ae20 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 4d 61 73  Parse->cookieMas
1ae30 6b 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20 20 20 20  k |= mask;.     
1ae40 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 56   pParse->cookieV
1ae50 61 6c 75 65 5b 69 44 62 5d 20 3d 20 64 62 2d 3e  alue[iDb] = db->
1ae60 61 44 62 5b 69 44 62 5d 2e 70 53 63 68 65 6d 61  aDb[iDb].pSchema
1ae70 2d 3e 73 63 68 65 6d 61 5f 63 6f 6f 6b 69 65 3b  ->schema_cookie;
1ae80 0a 20 20 20 20 20 20 69 66 28 20 21 4f 4d 49 54  .      if( !OMIT
1ae90 5f 54 45 4d 50 44 42 20 26 26 20 69 44 62 3d 3d  _TEMPDB && iDb==
1aea0 31 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  1 ){.        sql
1aeb0 69 74 65 33 4f 70 65 6e 54 65 6d 70 44 61 74 61  ite3OpenTempData
1aec0 62 61 73 65 28 70 50 61 72 73 65 29 3b 0a 20 20  base(pParse);.  
1aed0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
1aee0 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
1aef0 65 20 56 44 42 45 20 63 6f 64 65 20 74 68 61 74  e VDBE code that
1af00 20 70 72 65 70 61 72 65 73 20 66 6f 72 20 64 6f   prepares for do
1af10 69 6e 67 20 61 6e 20 6f 70 65 72 61 74 69 6f 6e  ing an operation
1af20 20 74 68 61 74 0a 2a 2a 20 6d 69 67 68 74 20 63   that.** might c
1af30 68 61 6e 67 65 20 74 68 65 20 64 61 74 61 62 61  hange the databa
1af40 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  se..**.** This r
1af50 6f 75 74 69 6e 65 20 73 74 61 72 74 73 20 61 20  outine starts a 
1af60 6e 65 77 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  new transaction 
1af70 69 66 20 77 65 20 61 72 65 20 6e 6f 74 20 61 6c  if we are not al
1af80 72 65 61 64 79 20 77 69 74 68 69 6e 0a 2a 2a 20  ready within.** 
1af90 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20  a transaction.  
1afa0 49 66 20 77 65 20 61 72 65 20 61 6c 72 65 61 64  If we are alread
1afb0 79 20 77 69 74 68 69 6e 20 61 20 74 72 61 6e 73  y within a trans
1afc0 61 63 74 69 6f 6e 2c 20 74 68 65 6e 20 61 20 63  action, then a c
1afd0 68 65 63 6b 70 6f 69 6e 74 0a 2a 2a 20 69 73 20  heckpoint.** is 
1afe0 73 65 74 20 69 66 20 74 68 65 20 73 65 74 53 74  set if the setSt
1aff0 61 74 65 6d 65 6e 74 20 70 61 72 61 6d 65 74 65  atement paramete
1b000 72 20 69 73 20 74 72 75 65 2e 20 20 41 20 63 68  r is true.  A ch
1b010 65 63 6b 70 6f 69 6e 74 20 73 68 6f 75 6c 64 0a  eckpoint should.
1b020 2a 2a 20 62 65 20 73 65 74 20 66 6f 72 20 6f 70  ** be set for op
1b030 65 72 61 74 69 6f 6e 73 20 74 68 61 74 20 6d 69  erations that mi
1b040 67 68 74 20 66 61 69 6c 20 28 64 75 65 20 74 6f  ght fail (due to
1b050 20 61 20 63 6f 6e 73 74 72 61 69 6e 74 29 20 70   a constraint) p
1b060 61 72 74 20 6f 66 0a 2a 2a 20 74 68 65 20 77 61  art of.** the wa
1b070 79 20 74 68 72 6f 75 67 68 20 61 6e 64 20 77 68  y through and wh
1b080 69 63 68 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f  ich will need to
1b090 20 75 6e 64 6f 20 73 6f 6d 65 20 77 72 69 74 65   undo some write
1b0a0 73 20 77 69 74 68 6f 75 74 20 68 61 76 69 6e 67  s without having
1b0b0 20 74 6f 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20   to.** rollback 
1b0c0 74 68 65 20 77 68 6f 6c 65 20 74 72 61 6e 73 61  the whole transa
1b0d0 63 74 69 6f 6e 2e 20 20 46 6f 72 20 6f 70 65 72  ction.  For oper
1b0e0 61 74 69 6f 6e 73 20 77 68 65 72 65 20 61 6c 6c  ations where all
1b0f0 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a 2a 2a 20   constraints.** 
1b100 63 61 6e 20 62 65 20 63 68 65 63 6b 65 64 20 62  can be checked b
1b110 65 66 6f 72 65 20 61 6e 79 20 63 68 61 6e 67 65  efore any change
1b120 73 20 61 72 65 20 6d 61 64 65 20 74 6f 20 74 68  s are made to th
1b130 65 20 64 61 74 61 62 61 73 65 2c 20 69 74 20 69  e database, it i
1b140 73 20 6e 65 76 65 72 0a 2a 2a 20 6e 65 63 65 73  s never.** neces
1b150 73 61 72 79 20 74 6f 20 75 6e 64 6f 20 61 20 77  sary to undo a w
1b160 72 69 74 65 20 61 6e 64 20 74 68 65 20 63 68 65  rite and the che
1b170 63 6b 70 6f 69 6e 74 20 73 68 6f 75 6c 64 20 6e  ckpoint should n
1b180 6f 74 20 62 65 20 73 65 74 2e 0a 2a 2a 0a 2a 2a  ot be set..**.**
1b190 20 4f 6e 6c 79 20 64 61 74 61 62 61 73 65 20 69   Only database i
1b1a0 44 62 20 61 6e 64 20 74 68 65 20 74 65 6d 70 20  Db and the temp 
1b1b0 64 61 74 61 62 61 73 65 20 61 72 65 20 6d 61 64  database are mad
1b1c0 65 20 77 72 69 74 61 62 6c 65 20 62 79 20 74 68  e writable by th
1b1d0 69 73 20 63 61 6c 6c 2e 0a 2a 2a 20 49 66 20 69  is call..** If i
1b1e0 44 62 3d 3d 30 2c 20 74 68 65 6e 20 74 68 65 20  Db==0, then the 
1b1f0 6d 61 69 6e 20 61 6e 64 20 74 65 6d 70 20 64 61  main and temp da
1b200 74 61 62 61 73 65 73 20 61 72 65 20 6d 61 64 65  tabases are made
1b210 20 77 72 69 74 61 62 6c 65 2e 20 20 20 49 66 0a   writable.   If.
1b220 2a 2a 20 69 44 62 3d 3d 31 20 74 68 65 6e 20 6f  ** iDb==1 then o
1b230 6e 6c 79 20 74 68 65 20 74 65 6d 70 20 64 61 74  nly the temp dat
1b240 61 62 61 73 65 20 69 73 20 6d 61 64 65 20 77 72  abase is made wr
1b250 69 74 61 62 6c 65 2e 20 20 49 66 20 69 44 62 3e  itable.  If iDb>
1b260 31 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20 73 70  1 then the.** sp
1b270 65 63 69 66 69 65 64 20 61 75 78 69 6c 69 61 72  ecified auxiliar
1b280 79 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 74  y database and t
1b290 68 65 20 74 65 6d 70 20 64 61 74 61 62 61 73 65  he temp database
1b2a0 20 61 72 65 20 6d 61 64 65 20 77 72 69 74 61 62   are made writab
1b2b0 6c 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  le..*/.void sqli
1b2c0 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65  te3BeginWriteOpe
1b2d0 72 61 74 69 6f 6e 28 50 61 72 73 65 20 2a 70 50  ration(Parse *pP
1b2e0 61 72 73 65 2c 20 69 6e 74 20 73 65 74 53 74 61  arse, int setSta
1b2f0 74 65 6d 65 6e 74 2c 20 69 6e 74 20 69 44 62 29  tement, int iDb)
1b300 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71  {.  Vdbe *v = sq
1b310 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
1b320 72 73 65 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30  rse);.  if( v==0
1b330 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c   ) return;.  sql
1b340 69 74 65 33 43 6f 64 65 56 65 72 69 66 79 53 63  ite3CodeVerifySc
1b350 68 65 6d 61 28 70 50 61 72 73 65 2c 20 69 44 62  hema(pParse, iDb
1b360 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e 77 72 69  );.  pParse->wri
1b370 74 65 4d 61 73 6b 20 7c 3d 20 31 3c 3c 69 44 62  teMask |= 1<<iDb
1b380 3b 0a 20 20 69 66 28 20 73 65 74 53 74 61 74 65  ;.  if( setState
1b390 6d 65 6e 74 20 26 26 20 70 50 61 72 73 65 2d 3e  ment && pParse->
1b3a0 6e 65 73 74 65 64 3d 3d 30 20 29 7b 0a 20 20 20  nested==0 ){.   
1b3b0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1b3c0 70 31 28 76 2c 20 4f 50 5f 53 74 61 74 65 6d 65  p1(v, OP_Stateme
1b3d0 6e 74 2c 20 69 44 62 29 3b 0a 20 20 7d 0a 20 20  nt, iDb);.  }.  
1b3e0 69 66 28 20 28 4f 4d 49 54 5f 54 45 4d 50 44 42  if( (OMIT_TEMPDB
1b3f0 20 7c 7c 20 69 44 62 21 3d 31 29 20 26 26 20 70   || iDb!=1) && p
1b400 50 61 72 73 65 2d 3e 64 62 2d 3e 61 44 62 5b 31  Parse->db->aDb[1
1b410 5d 2e 70 42 74 21 3d 30 20 29 7b 0a 20 20 20 20  ].pBt!=0 ){.    
1b420 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74  sqlite3BeginWrit
1b430 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73  eOperation(pPars
1b440 65 2c 20 73 65 74 53 74 61 74 65 6d 65 6e 74 2c  e, setStatement,
1b450 20 31 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a   1);.  }.}../*.*
1b460 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69  * Check to see i
1b470 66 20 70 49 6e 64 65 78 20 75 73 65 73 20 74 68  f pIndex uses th
1b480 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  e collating sequ
1b490 65 6e 63 65 20 70 43 6f 6c 6c 2e 20 20 52 65 74  ence pColl.  Ret
1b4a0 75 72 6e 0a 2a 2a 20 74 72 75 65 20 69 66 20 69  urn.** true if i
1b4b0 74 20 64 6f 65 73 20 61 6e 64 20 66 61 6c 73 65  t does and false
1b4c0 20 69 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 2e   if it does not.
1b4d0 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .*/.#ifndef SQLI
1b4e0 54 45 5f 4f 4d 49 54 5f 52 45 49 4e 44 45 58 0a  TE_OMIT_REINDEX.
1b4f0 73 74 61 74 69 63 20 69 6e 74 20 63 6f 6c 6c 61  static int colla
1b500 74 69 6f 6e 4d 61 74 63 68 28 63 6f 6e 73 74 20  tionMatch(const 
1b510 63 68 61 72 20 2a 7a 43 6f 6c 6c 2c 20 49 6e 64  char *zColl, Ind
1b520 65 78 20 2a 70 49 6e 64 65 78 29 7b 0a 20 20 69  ex *pIndex){.  i
1b530 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  nt i;.  for(i=0;
1b540 20 69 3c 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75   i<pIndex->nColu
1b550 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 6f  mn; i++){.    co
1b560 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 70 49  nst char *z = pI
1b570 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 3b  ndex->azColl[i];
1b580 0a 20 20 20 20 69 66 28 20 7a 3d 3d 7a 43 6f 6c  .    if( z==zCol
1b590 6c 20 7c 7c 20 28 7a 20 26 26 20 7a 43 6f 6c 6c  l || (z && zColl
1b5a0 20 26 26 20 30 3d 3d 73 71 6c 69 74 65 33 53 74   && 0==sqlite3St
1b5b0 72 49 43 6d 70 28 7a 2c 20 7a 43 6f 6c 6c 29 29  rICmp(z, zColl))
1b5c0 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
1b5d0 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   1;.    }.  }.  
1b5e0 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64  return 0;.}.#end
1b5f0 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6f 6d 70  if../*.** Recomp
1b600 75 74 65 20 61 6c 6c 20 69 6e 64 69 63 65 73 20  ute all indices 
1b610 6f 66 20 70 54 61 62 20 74 68 61 74 20 75 73 65  of pTab that use
1b620 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73   the collating s
1b630 65 71 75 65 6e 63 65 20 70 43 6f 6c 6c 2e 0a 2a  equence pColl..*
1b640 2a 20 49 66 20 70 43 6f 6c 6c 3d 3d 30 20 74 68  * If pColl==0 th
1b650 65 6e 20 72 65 63 6f 6d 70 75 74 65 20 61 6c 6c  en recompute all
1b660 20 69 6e 64 69 63 65 73 20 6f 66 20 70 54 61 62   indices of pTab
1b670 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
1b680 49 54 45 5f 4f 4d 49 54 5f 52 45 49 4e 44 45 58  ITE_OMIT_REINDEX
1b690 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 69  .static void rei
1b6a0 6e 64 65 78 54 61 62 6c 65 28 50 61 72 73 65 20  ndexTable(Parse 
1b6b0 2a 70 50 61 72 73 65 2c 20 54 61 62 6c 65 20 2a  *pParse, Table *
1b6c0 70 54 61 62 2c 20 63 68 61 72 20 63 6f 6e 73 74  pTab, char const
1b6d0 20 2a 7a 43 6f 6c 6c 29 7b 0a 20 20 49 6e 64 65   *zColl){.  Inde
1b6e0 78 20 2a 70 49 6e 64 65 78 3b 20 20 20 20 20 20  x *pIndex;      
1b6f0 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 69 6e          /* An in
1b700 64 65 78 20 61 73 73 6f 63 69 61 74 65 64 20 77  dex associated w
1b710 69 74 68 20 70 54 61 62 20 2a 2f 0a 0a 20 20 66  ith pTab */..  f
1b720 6f 72 28 70 49 6e 64 65 78 3d 70 54 61 62 2d 3e  or(pIndex=pTab->
1b730 70 49 6e 64 65 78 3b 20 70 49 6e 64 65 78 3b 20  pIndex; pIndex; 
1b740 70 49 6e 64 65 78 3d 70 49 6e 64 65 78 2d 3e 70  pIndex=pIndex->p
1b750 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 7a  Next){.    if( z
1b760 43 6f 6c 6c 3d 3d 30 20 7c 7c 20 63 6f 6c 6c 61  Coll==0 || colla
1b770 74 69 6f 6e 4d 61 74 63 68 28 7a 43 6f 6c 6c 2c  tionMatch(zColl,
1b780 20 70 49 6e 64 65 78 29 20 29 7b 0a 20 20 20 20   pIndex) ){.    
1b790 20 20 69 6e 74 20 69 44 62 20 3d 20 73 71 6c 69    int iDb = sqli
1b7a0 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78  te3SchemaToIndex
1b7b0 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 54 61  (pParse->db, pTa
1b7c0 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20  b->pSchema);.   
1b7d0 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57     sqlite3BeginW
1b7e0 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50  riteOperation(pP
1b7f0 61 72 73 65 2c 20 30 2c 20 69 44 62 29 3b 0a 20  arse, 0, iDb);. 
1b800 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 66 69       sqlite3Refi
1b810 6c 6c 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20  llIndex(pParse, 
1b820 70 49 6e 64 65 78 2c 20 2d 31 29 3b 0a 20 20 20  pIndex, -1);.   
1b830 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a   }.  }.}.#endif.
1b840 0a 2f 2a 0a 2a 2a 20 52 65 63 6f 6d 70 75 74 65  ./*.** Recompute
1b850 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 6f 66 20   all indices of 
1b860 61 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20 61 6c  all tables in al
1b870 6c 20 64 61 74 61 62 61 73 65 73 20 77 68 65 72  l databases wher
1b880 65 20 74 68 65 0a 2a 2a 20 69 6e 64 69 63 65 73  e the.** indices
1b890 20 75 73 65 20 74 68 65 20 63 6f 6c 6c 61 74 69   use the collati
1b8a0 6e 67 20 73 65 71 75 65 6e 63 65 20 70 43 6f 6c  ng sequence pCol
1b8b0 6c 2e 20 20 49 66 20 70 43 6f 6c 6c 3d 3d 30 20  l.  If pColl==0 
1b8c0 74 68 65 6e 20 72 65 63 6f 6d 70 75 74 65 0a 2a  then recompute.*
1b8d0 2a 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 65 76  * all indices ev
1b8e0 65 72 79 77 68 65 72 65 2e 0a 2a 2f 0a 23 69 66  erywhere..*/.#if
1b8f0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1b900 5f 52 45 49 4e 44 45 58 0a 73 74 61 74 69 63 20  _REINDEX.static 
1b910 76 6f 69 64 20 72 65 69 6e 64 65 78 44 61 74 61  void reindexData
1b920 62 61 73 65 73 28 50 61 72 73 65 20 2a 70 50 61  bases(Parse *pPa
1b930 72 73 65 2c 20 63 68 61 72 20 63 6f 6e 73 74 20  rse, char const 
1b940 2a 7a 43 6f 6c 6c 29 7b 0a 20 20 44 62 20 2a 70  *zColl){.  Db *p
1b950 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Db;             
1b960 20 20 20 20 20 20 20 2f 2a 20 41 20 73 69 6e 67         /* A sing
1b970 6c 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  le database */. 
1b980 20 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20 20   int iDb;       
1b990 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1b9a0 54 68 65 20 64 61 74 61 62 61 73 65 20 69 6e 64  The database ind
1b9b0 65 78 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 73  ex number */.  s
1b9c0 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
1b9d0 72 73 65 2d 3e 64 62 3b 20 20 20 2f 2a 20 54 68  rse->db;   /* Th
1b9e0 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  e database conne
1b9f0 63 74 69 6f 6e 20 2a 2f 0a 20 20 48 61 73 68 45  ction */.  HashE
1ba00 6c 65 6d 20 2a 6b 3b 20 20 20 20 20 20 20 20 20  lem *k;         
1ba10 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f         /* For lo
1ba20 6f 70 69 6e 67 20 6f 76 65 72 20 74 61 62 6c 65  oping over table
1ba30 73 20 69 6e 20 70 44 62 20 2a 2f 0a 20 20 54 61  s in pDb */.  Ta
1ba40 62 6c 65 20 2a 70 54 61 62 3b 20 20 20 20 20 20  ble *pTab;      
1ba50 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 74            /* A t
1ba60 61 62 6c 65 20 69 6e 20 74 68 65 20 64 61 74 61  able in the data
1ba70 62 61 73 65 20 2a 2f 0a 0a 20 20 66 6f 72 28 69  base */..  for(i
1ba80 44 62 3d 30 2c 20 70 44 62 3d 64 62 2d 3e 61 44  Db=0, pDb=db->aD
1ba90 62 3b 20 69 44 62 3c 64 62 2d 3e 6e 44 62 3b 20  b; iDb<db->nDb; 
1baa0 69 44 62 2b 2b 2c 20 70 44 62 2b 2b 29 7b 0a 20  iDb++, pDb++){. 
1bab0 20 20 20 61 73 73 65 72 74 28 20 70 44 62 21 3d     assert( pDb!=
1bac0 30 20 29 3b 0a 20 20 20 20 66 6f 72 28 6b 3d 73  0 );.    for(k=s
1bad0 71 6c 69 74 65 48 61 73 68 46 69 72 73 74 28 26  qliteHashFirst(&
1bae0 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 74 62  pDb->pSchema->tb
1baf0 6c 48 61 73 68 29 3b 20 20 6b 3b 20 6b 3d 73 71  lHash);  k; k=sq
1bb00 6c 69 74 65 48 61 73 68 4e 65 78 74 28 6b 29 29  liteHashNext(k))
1bb10 7b 0a 20 20 20 20 20 20 70 54 61 62 20 3d 20 28  {.      pTab = (
1bb20 54 61 62 6c 65 2a 29 73 71 6c 69 74 65 48 61 73  Table*)sqliteHas
1bb30 68 44 61 74 61 28 6b 29 3b 0a 20 20 20 20 20 20  hData(k);.      
1bb40 72 65 69 6e 64 65 78 54 61 62 6c 65 28 70 50 61  reindexTable(pPa
1bb50 72 73 65 2c 20 70 54 61 62 2c 20 7a 43 6f 6c 6c  rse, pTab, zColl
1bb60 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23  );.    }.  }.}.#
1bb70 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e  endif../*.** Gen
1bb80 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 74  erate code for t
1bb90 68 65 20 52 45 49 4e 44 45 58 20 63 6f 6d 6d 61  he REINDEX comma
1bba0 6e 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  nd..**.**       
1bbb0 20 52 45 49 4e 44 45 58 20 20 20 20 20 20 20 20   REINDEX        
1bbc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bbd0 20 20 20 20 2d 2d 20 31 0a 2a 2a 20 20 20 20 20      -- 1.**     
1bbe0 20 20 20 52 45 49 4e 44 45 58 20 20 3c 63 6f 6c     REINDEX  <col
1bbf0 6c 61 74 69 6f 6e 3e 20 20 20 20 20 20 20 20 20  lation>         
1bc00 20 20 20 20 20 20 2d 2d 20 32 0a 2a 2a 20 20 20        -- 2.**   
1bc10 20 20 20 20 20 52 45 49 4e 44 45 58 20 20 3f 3c       REINDEX  ?<
1bc20 64 61 74 61 62 61 73 65 3e 2e 3f 3c 74 61 62 6c  database>.?<tabl
1bc30 65 6e 61 6d 65 3e 20 20 2d 2d 20 33 0a 2a 2a 20  ename>  -- 3.** 
1bc40 20 20 20 20 20 20 20 52 45 49 4e 44 45 58 20 20         REINDEX  
1bc50 3f 3c 64 61 74 61 62 61 73 65 3e 2e 3f 3c 69 6e  ?<database>.?<in
1bc60 64 65 78 6e 61 6d 65 3e 20 20 2d 2d 20 34 0a 2a  dexname>  -- 4.*
1bc70 2a 0a 2a 2a 20 46 6f 72 6d 20 31 20 63 61 75 73  *.** Form 1 caus
1bc80 65 73 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 69  es all indices i
1bc90 6e 20 61 6c 6c 20 61 74 74 61 63 68 65 64 20 64  n all attached d
1bca0 61 74 61 62 61 73 65 73 20 74 6f 20 62 65 20 72  atabases to be r
1bcb0 65 62 75 69 6c 74 2e 0a 2a 2a 20 46 6f 72 6d 20  ebuilt..** Form 
1bcc0 32 20 72 65 62 75 69 6c 64 73 20 61 6c 6c 20 69  2 rebuilds all i
1bcd0 6e 64 69 63 65 73 20 69 6e 20 61 6c 6c 20 64 61  ndices in all da
1bce0 74 61 62 61 73 65 73 20 74 68 61 74 20 75 73 65  tabases that use
1bcf0 20 74 68 65 20 6e 61 6d 65 64 0a 2a 2a 20 63 6f   the named.** co
1bd00 6c 6c 61 74 69 6e 67 20 66 75 6e 63 74 69 6f 6e  llating function
1bd10 2e 20 20 46 6f 72 6d 73 20 33 20 61 6e 64 20 34  .  Forms 3 and 4
1bd20 20 72 65 62 75 69 6c 64 20 74 68 65 20 6e 61 6d   rebuild the nam
1bd30 65 64 20 69 6e 64 65 78 20 6f 72 20 61 6c 6c 0a  ed index or all.
1bd40 2a 2a 20 69 6e 64 69 63 65 73 20 61 73 73 6f 63  ** indices assoc
1bd50 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20 6e  iated with the n
1bd60 61 6d 65 64 20 74 61 62 6c 65 2e 0a 2a 2f 0a 23  amed table..*/.#
1bd70 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1bd80 49 54 5f 52 45 49 4e 44 45 58 0a 76 6f 69 64 20  IT_REINDEX.void 
1bd90 73 71 6c 69 74 65 33 52 65 69 6e 64 65 78 28 50  sqlite3Reindex(P
1bda0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 6f  arse *pParse, To
1bdb0 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c 20 54 6f 6b  ken *pName1, Tok
1bdc0 65 6e 20 2a 70 4e 61 6d 65 32 29 7b 0a 20 20 43  en *pName2){.  C
1bdd0 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 20 20  ollSeq *pColl;  
1bde0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
1bdf0 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
1be00 20 74 6f 20 62 65 20 72 65 69 6e 64 65 78 65 64   to be reindexed
1be10 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 63  , or NULL */.  c
1be20 68 61 72 20 2a 7a 3b 20 20 20 20 20 20 20 20 20  har *z;         
1be30 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61             /* Na
1be40 6d 65 20 6f 66 20 61 20 74 61 62 6c 65 20 6f 72  me of a table or
1be50 20 69 6e 64 65 78 20 2a 2f 0a 20 20 63 6f 6e 73   index */.  cons
1be60 74 20 63 68 61 72 20 2a 7a 44 62 3b 20 20 20 20  t char *zDb;    
1be70 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
1be80 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
1be90 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  */.  Table *pTab
1bea0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1beb0 20 2f 2a 20 41 20 74 61 62 6c 65 20 69 6e 20 74   /* A table in t
1bec0 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  he database */. 
1bed0 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b 20   Index *pIndex; 
1bee0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1bef0 41 6e 20 69 6e 64 65 78 20 61 73 73 6f 63 69 61  An index associa
1bf00 74 65 64 20 77 69 74 68 20 70 54 61 62 20 2a 2f  ted with pTab */
1bf10 0a 20 20 69 6e 74 20 69 44 62 3b 20 20 20 20 20  .  int iDb;     
1bf20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1bf30 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 69  * The database i
1bf40 6e 64 65 78 20 6e 75 6d 62 65 72 20 2a 2f 0a 20  ndex number */. 
1bf50 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
1bf60 50 61 72 73 65 2d 3e 64 62 3b 20 20 20 2f 2a 20  Parse->db;   /* 
1bf70 54 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e  The database con
1bf80 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 6f 6b  nection */.  Tok
1bf90 65 6e 20 2a 70 4f 62 6a 4e 61 6d 65 3b 20 20 20  en *pObjName;   
1bfa0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
1bfb0 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 6f 72   of the table or
1bfc0 20 69 6e 64 65 78 20 74 6f 20 62 65 20 72 65 69   index to be rei
1bfd0 6e 64 65 78 65 64 20 2a 2f 0a 0a 20 20 2f 2a 20  ndexed */..  /* 
1bfe0 52 65 61 64 20 74 68 65 20 64 61 74 61 62 61 73  Read the databas
1bff0 65 20 73 63 68 65 6d 61 2e 20 49 66 20 61 6e 20  e schema. If an 
1c000 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 6c 65  error occurs, le
1c010 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73  ave an error mes
1c020 73 61 67 65 0a 20 20 2a 2a 20 61 6e 64 20 63 6f  sage.  ** and co
1c030 64 65 20 69 6e 20 70 50 61 72 73 65 20 61 6e 64  de in pParse and
1c040 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 20 2a 2f   return NULL. */
1c050 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b  .  if( SQLITE_OK
1c060 21 3d 73 71 6c 69 74 65 33 52 65 61 64 53 63 68  !=sqlite3ReadSch
1c070 65 6d 61 28 70 50 61 72 73 65 29 20 29 7b 0a 20  ema(pParse) ){. 
1c080 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a     return;.  }..
1c090 20 20 69 66 28 20 70 4e 61 6d 65 31 3d 3d 30 20    if( pName1==0 
1c0a0 7c 7c 20 70 4e 61 6d 65 31 2d 3e 7a 3d 3d 30 20  || pName1->z==0 
1c0b0 29 7b 0a 20 20 20 20 72 65 69 6e 64 65 78 44 61  ){.    reindexDa
1c0c0 74 61 62 61 73 65 73 28 70 50 61 72 73 65 2c 20  tabases(pParse, 
1c0d0 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  0);.    return;.
1c0e0 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4e 61 6d    }else if( pNam
1c0f0 65 32 3d 3d 30 20 7c 7c 20 70 4e 61 6d 65 32 2d  e2==0 || pName2-
1c100 3e 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 63 68 61  >z==0 ){.    cha
1c110 72 20 2a 7a 43 6f 6c 6c 3b 0a 20 20 20 20 61 73  r *zColl;.    as
1c120 73 65 72 74 28 20 70 4e 61 6d 65 31 2d 3e 7a 20  sert( pName1->z 
1c130 29 3b 0a 20 20 20 20 7a 43 6f 6c 6c 20 3d 20 73  );.    zColl = s
1c140 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f  qlite3NameFromTo
1c150 6b 65 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ken(pParse->db, 
1c160 70 4e 61 6d 65 31 29 3b 0a 20 20 20 20 69 66 28  pName1);.    if(
1c170 20 21 7a 43 6f 6c 6c 20 29 20 72 65 74 75 72 6e   !zColl ) return
1c180 3b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71  ;.    pColl = sq
1c190 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71  lite3FindCollSeq
1c1a0 28 64 62 2c 20 45 4e 43 28 64 62 29 2c 20 7a 43  (db, ENC(db), zC
1c1b0 6f 6c 6c 2c 20 2d 31 2c 20 30 29 3b 0a 20 20 20  oll, -1, 0);.   
1c1c0 20 69 66 28 20 70 43 6f 6c 6c 20 29 7b 0a 20 20   if( pColl ){.  
1c1d0 20 20 20 20 69 66 28 20 7a 43 6f 6c 6c 20 29 7b      if( zColl ){
1c1e0 0a 20 20 20 20 20 20 20 20 72 65 69 6e 64 65 78  .        reindex
1c1f0 44 61 74 61 62 61 73 65 73 28 70 50 61 72 73 65  Databases(pParse
1c200 2c 20 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20 20 20  , zColl);.      
1c210 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
1c220 64 62 2c 20 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20  db, zColl);.    
1c230 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e    }.      return
1c240 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
1c250 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 43  te3DbFree(db, zC
1c260 6f 6c 6c 29 3b 0a 20 20 7d 0a 20 20 69 44 62 20  oll);.  }.  iDb 
1c270 3d 20 73 71 6c 69 74 65 33 54 77 6f 50 61 72 74  = sqlite3TwoPart
1c280 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 70 4e 61  Name(pParse, pNa
1c290 6d 65 31 2c 20 70 4e 61 6d 65 32 2c 20 26 70 4f  me1, pName2, &pO
1c2a0 62 6a 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 69  bjName);.  if( i
1c2b0 44 62 3c 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  Db<0 ) return;. 
1c2c0 20 7a 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65   z = sqlite3Name
1c2d0 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 4f  FromToken(db, pO
1c2e0 62 6a 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a  bjName);.  if( z
1c2f0 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
1c300 7a 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44  zDb = db->aDb[iD
1c310 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 70 54 61 62  b].zName;.  pTab
1c320 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61   = sqlite3FindTa
1c330 62 6c 65 28 64 62 2c 20 7a 2c 20 7a 44 62 29 3b  ble(db, z, zDb);
1c340 0a 20 20 69 66 28 20 70 54 61 62 20 29 7b 0a 20  .  if( pTab ){. 
1c350 20 20 20 72 65 69 6e 64 65 78 54 61 62 6c 65 28     reindexTable(
1c360 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20 30 29  pParse, pTab, 0)
1c370 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  ;.    sqlite3DbF
1c380 72 65 65 28 64 62 2c 20 7a 29 3b 0a 20 20 20 20  ree(db, z);.    
1c390 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 70 49  return;.  }.  pI
1c3a0 6e 64 65 78 20 3d 20 73 71 6c 69 74 65 33 46 69  ndex = sqlite3Fi
1c3b0 6e 64 49 6e 64 65 78 28 64 62 2c 20 7a 2c 20 7a  ndIndex(db, z, z
1c3c0 44 62 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62  Db);.  sqlite3Db
1c3d0 46 72 65 65 28 64 62 2c 20 7a 29 3b 0a 20 20 69  Free(db, z);.  i
1c3e0 66 28 20 70 49 6e 64 65 78 20 29 7b 0a 20 20 20  f( pIndex ){.   
1c3f0 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69   sqlite3BeginWri
1c400 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72  teOperation(pPar
1c410 73 65 2c 20 30 2c 20 69 44 62 29 3b 0a 20 20 20  se, 0, iDb);.   
1c420 20 73 71 6c 69 74 65 33 52 65 66 69 6c 6c 49 6e   sqlite3RefillIn
1c430 64 65 78 28 70 50 61 72 73 65 2c 20 70 49 6e 64  dex(pParse, pInd
1c440 65 78 2c 20 2d 31 29 3b 0a 20 20 20 20 72 65 74  ex, -1);.    ret
1c450 75 72 6e 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  urn;.  }.  sqlit
1c460 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
1c470 65 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20 69 64  e, "unable to id
1c480 65 6e 74 69 66 79 20 74 68 65 20 6f 62 6a 65 63  entify the objec
1c490 74 20 74 6f 20 62 65 20 72 65 69 6e 64 65 78 65  t to be reindexe
1c4a0 64 22 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  d");.}.#endif../
1c4b0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 64 79  *.** Return a dy
1c4c0 6e 61 6d 69 63 6c 79 20 61 6c 6c 6f 63 61 74 65  namicly allocate
1c4d0 64 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74  d KeyInfo struct
1c4e0 75 72 65 20 74 68 61 74 20 63 61 6e 20 62 65 20  ure that can be 
1c4f0 75 73 65 64 0a 2a 2a 20 77 69 74 68 20 4f 50 5f  used.** with OP_
1c500 4f 70 65 6e 52 65 61 64 20 6f 72 20 4f 50 5f 4f  OpenRead or OP_O
1c510 70 65 6e 57 72 69 74 65 20 74 6f 20 61 63 63 65  penWrite to acce
1c520 73 73 20 64 61 74 61 62 61 73 65 20 69 6e 64 65  ss database inde
1c530 78 20 70 49 64 78 2e 0a 2a 2a 0a 2a 2a 20 49 66  x pIdx..**.** If
1c540 20 73 75 63 63 65 73 73 66 75 6c 2c 20 61 20 70   successful, a p
1c550 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 6e 65  ointer to the ne
1c560 77 20 73 74 72 75 63 74 75 72 65 20 69 73 20 72  w structure is r
1c570 65 74 75 72 6e 65 64 2e 20 49 6e 20 74 68 69 73  eturned. In this
1c580 20 63 61 73 65 0a 2a 2a 20 74 68 65 20 63 61 6c   case.** the cal
1c590 6c 65 72 20 69 73 20 72 65 73 70 6f 6e 73 69 62  ler is responsib
1c5a0 6c 65 20 66 6f 72 20 63 61 6c 6c 69 6e 67 20 73  le for calling s
1c5b0 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
1c5c0 20 29 20 6f 6e 20 74 68 65 20 72 65 74 75 72 6e   ) on the return
1c5d0 65 64 20 0a 2a 2a 20 70 6f 69 6e 74 65 72 2e 20  ed .** pointer. 
1c5e0 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
1c5f0 72 73 20 28 6f 75 74 20 6f 66 20 6d 65 6d 6f 72  rs (out of memor
1c600 79 20 6f 72 20 6d 69 73 73 69 6e 67 20 63 6f 6c  y or missing col
1c610 6c 61 74 69 6f 6e 20 0a 2a 2a 20 73 65 71 75 65  lation .** seque
1c620 6e 63 65 29 2c 20 4e 55 4c 4c 20 69 73 20 72 65  nce), NULL is re
1c630 74 75 72 6e 65 64 20 61 6e 64 20 74 68 65 20 73  turned and the s
1c640 74 61 74 65 20 6f 66 20 70 50 61 72 73 65 20 75  tate of pParse u
1c650 70 64 61 74 65 64 20 74 6f 20 72 65 66 6c 65 63  pdated to reflec
1c660 74 0a 2a 2a 20 74 68 65 20 65 72 72 6f 72 2e 0a  t.** the error..
1c670 2a 2f 0a 4b 65 79 49 6e 66 6f 20 2a 73 71 6c 69  */.KeyInfo *sqli
1c680 74 65 33 49 6e 64 65 78 4b 65 79 69 6e 66 6f 28  te3IndexKeyinfo(
1c690 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 49  Parse *pParse, I
1c6a0 6e 64 65 78 20 2a 70 49 64 78 29 7b 0a 20 20 69  ndex *pIdx){.  i
1c6b0 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e 43 6f 6c  nt i;.  int nCol
1c6c0 20 3d 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e   = pIdx->nColumn
1c6d0 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65 73 20 3d  ;.  int nBytes =
1c6e0 20 73 69 7a 65 6f 66 28 4b 65 79 49 6e 66 6f 29   sizeof(KeyInfo)
1c6f0 20 2b 20 28 6e 43 6f 6c 2d 31 29 2a 73 69 7a 65   + (nCol-1)*size
1c700 6f 66 28 43 6f 6c 6c 53 65 71 2a 29 20 2b 20 6e  of(CollSeq*) + n
1c710 43 6f 6c 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  Col;.  sqlite3 *
1c720 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
1c730 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79  .  KeyInfo *pKey
1c740 20 3d 20 28 4b 65 79 49 6e 66 6f 20 2a 29 73 71   = (KeyInfo *)sq
1c750 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72  lite3DbMallocZer
1c760 6f 28 64 62 2c 20 6e 42 79 74 65 73 29 3b 0a 0a  o(db, nBytes);..
1c770 20 20 69 66 28 20 70 4b 65 79 20 29 7b 0a 20 20    if( pKey ){.  
1c780 20 20 70 4b 65 79 2d 3e 64 62 20 3d 20 70 50 61    pKey->db = pPa
1c790 72 73 65 2d 3e 64 62 3b 0a 20 20 20 20 70 4b 65  rse->db;.    pKe
1c7a0 79 2d 3e 61 53 6f 72 74 4f 72 64 65 72 20 3d 20  y->aSortOrder = 
1c7b0 28 75 38 20 2a 29 26 28 70 4b 65 79 2d 3e 61 43  (u8 *)&(pKey->aC
1c7c0 6f 6c 6c 5b 6e 43 6f 6c 5d 29 3b 0a 20 20 20 20  oll[nCol]);.    
1c7d0 61 73 73 65 72 74 28 20 26 70 4b 65 79 2d 3e 61  assert( &pKey->a
1c7e0 53 6f 72 74 4f 72 64 65 72 5b 6e 43 6f 6c 5d 3d  SortOrder[nCol]=
1c7f0 3d 26 28 28 28 75 38 20 2a 29 70 4b 65 79 29 5b  =&(((u8 *)pKey)[
1c800 6e 42 79 74 65 73 5d 29 20 29 3b 0a 20 20 20 20  nBytes]) );.    
1c810 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b  for(i=0; i<nCol;
1c820 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 63 68 61   i++){.      cha
1c830 72 20 2a 7a 43 6f 6c 6c 20 3d 20 70 49 64 78 2d  r *zColl = pIdx-
1c840 3e 61 7a 43 6f 6c 6c 5b 69 5d 3b 0a 20 20 20 20  >azColl[i];.    
1c850 20 20 61 73 73 65 72 74 28 20 7a 43 6f 6c 6c 20    assert( zColl 
1c860 29 3b 0a 20 20 20 20 20 20 70 4b 65 79 2d 3e 61  );.      pKey->a
1c870 43 6f 6c 6c 5b 69 5d 20 3d 20 73 71 6c 69 74 65  Coll[i] = sqlite
1c880 33 4c 6f 63 61 74 65 43 6f 6c 6c 53 65 71 28 70  3LocateCollSeq(p
1c890 50 61 72 73 65 2c 20 7a 43 6f 6c 6c 2c 20 2d 31  Parse, zColl, -1
1c8a0 29 3b 0a 20 20 20 20 20 20 70 4b 65 79 2d 3e 61  );.      pKey->a
1c8b0 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20 3d 20 70  SortOrder[i] = p
1c8c0 49 64 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b  Idx->aSortOrder[
1c8d0 69 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4b  i];.    }.    pK
1c8e0 65 79 2d 3e 6e 46 69 65 6c 64 20 3d 20 28 75 31  ey->nField = (u1
1c8f0 36 29 6e 43 6f 6c 3b 0a 20 20 7d 0a 0a 20 20 69  6)nCol;.  }..  i
1c900 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20  f( pParse->nErr 
1c910 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  ){.    sqlite3Db
1c920 46 72 65 65 28 64 62 2c 20 70 4b 65 79 29 3b 0a  Free(db, pKey);.
1c930 20 20 20 20 70 4b 65 79 20 3d 20 30 3b 0a 20 20      pKey = 0;.  
1c940 7d 0a 20 20 72 65 74 75 72 6e 20 70 4b 65 79 3b  }.  return pKey;
1c950 0a 7d 0a                                         .}.